Ignore:
Timestamp:
03/18/12 15:07:09 (12 years ago)
Author:
acoutinho
Message:

Ticket #2434 - Suporte copia/edicao/remocao de ocorrencias de repeticao

Location:
trunk/prototype/modules/calendar/js
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/prototype/modules/calendar/js/calendar.codecs.js

    r5737 r5746  
    7575                           borderColor: '#' + signature.borderColor || User.preferences.borderColor, 
    7676                           textColor: '#' + signature.fontColor || User.preferences.fontColor, 
    77                            className: 'calendar-' + signature.calendar.id, 
    7877                           editable:  signature.isOwner } 
    7978               }); 
     
    179178 
    180179                if(force){ 
    181                         delete Calendar.currentViewKey; 
     180                        delete Calendar.currentViewKey; 
     181                         
    182182                        $('#calendar').fullCalendar( 'refetchEvents' ); 
    183183                } 
     
    189189 
    190190                $('#calendar').fullCalendar( 'refetchEvents' );  
     191                 
     192                contentMenu(); 
    191193        } 
    192194} 
     
    271273                DataLayer.commit( false, false, function(){      
    272274                        if((typeof($tabs) != "undefined") && $tabs.tabs('option' ,'selected') == 0){ 
    273                                 Calendar.rerenderView(true); 
    274                                 contentMenu(); 
     275                                Calendar.rerenderView(true); 
    275276                        }else if((typeof($tabs) != "undefined") && $tabs.tabs('option' ,'selected') != 0) 
    276277                                pageselectCallback($('.events-list-win.active [name=keyword]').val(), 0); 
     
    603604                                                return(null); 
    604605                                         
    605                                         var attend = DataLayer.get('participant', participant); 
     606                                        var attend = DataLayer.get('participant', (participant.id || participant)); 
    606607                                        attend.user = DataLayer.get('user', attend.user); 
    607608                                         
     
    612613                                                        id: attend.id, 
    613614                                                        status : attend.status, 
    614                                                         delegatedFrom: attend.delegatedFrom, 
     615                                                        delegatedFrom: attend.delegatedFrom || '0', 
    615616                                                        acl: attend.acl, 
    616617                                                        receiveNotification : attend.receiveNotification, 
     
    947948                var calendar = DataLayer.get('calendar', evt.calendar); 
    948949                 
    949                 var eventEditable = function(idEvent, isRecurrence){ 
     950                var eventEditable = function(idEvent, isRecurrence, Recurrence){ 
    950951                        if(Calendar.signatureOf[calendar.id].isOwner == "1"){ 
    951952                                var attendee = {}; 
     
    953954                                        attendee = DataLayer.get('participant', evt.participants[i]); 
    954955                                                if(attendee.user == User.me.id) 
    955                                                         return (attendee.acl.indexOf('w') >= 0 || attendee.acl.indexOf('o') >= 0 ) ? {selectable: true, className: 'fullcalendar-context-menu  event-id-'+idEvent, editable: !isRecurrence} : { editable: false, selectable: true ,className: 'blocked-event-permision  fullcalendar-not-context-menu event-id-'+idEvent}; 
     956                                                        return (attendee.acl.indexOf('w') >= 0 || attendee.acl.indexOf('o') >= 0 ) ? {selectable: true, className: 'fullcalendar-context-menu  event-id-'+idEvent+ (isRecurrence ? ' isRecurrence Recurrence-id-'+Recurrence : '')} : { editable: false, selectable: true ,className: 'blocked-event-permision  fullcalendar-not-context-menu event-id-'+idEvent}; 
    956957                                } 
    957958                                return {editable: false, className: 'blocked-event-permision  fullcalendar-not-context-menu event-id-'+idEvent,  selectable: true, disableDragging: isRecurrence }; 
     
    963964                                        var returns = "" 
    964965                                        returns += acl['write'] ? "" :  'blocked-event-permision '; 
    965                                         returns += acl['busy'] ? 'fullcalendar-not-context-menu ' : (acl['read']  ?  'fullcalendar-context-menu ' : ''); 
     966                                        returns += acl['busy'] ? 'fullcalendar-not-context-menu ' : (acl['read']  ?  'fullcalendar-context-menu '+ idEvent + (isRecurrence ? ' isRecurrence Recurrence-id-'+Recurrence : '') : ''); 
    966967                                        returns += 'event-id-'+idEvent; 
    967968                                        return returns; 
     
    992993                   
    993994                for( var i = 0; i < occurrences.length; i++ ) 
    994                     grouped[ evt.calendar ].push( DataLayer.merge({ id: evt.URI || evt.id, 
    995                                                     title: Encoder.htmlDecode(evt.summary), 
    996                                                     start: Timezone.getDateCalendar(new Date( parseInt( occurrences[i] ) ), calendar.timezone,  !!evt.DayLigth ? evt.DayLigth.calendar.startTime : Timezone.daylightSaving), 
    997                                                     end:   Timezone.getDateCalendar(new Date( parseInt( occurrences[i] ) + duration - (!!parseInt(evt.allDay) ? 86400000 : 0)), calendar.timezone, !!evt.DayLigth ? evt.DayLigth.calendar.startTime : Timezone.daylightSaving), 
    998                                                     allDay: parseInt( evt.allDay ) }, eventEditable(evt.id, isRepeat ) ) ); 
     995                    grouped[ evt.calendar ].push( DataLayer.merge({ id: evt.URI || evt.id+ '-' + i, 
     996                    title: Encoder.htmlDecode(evt.summary), 
     997                    start: Timezone.getDateCalendar(new Date( parseInt( occurrences[i] ) ), calendar.timezone,  !!evt.DayLigth ? evt.DayLigth.calendar.startTime : Timezone.daylightSaving), 
     998                    end:   Timezone.getDateCalendar(new Date( parseInt( occurrences[i] ) + duration - (!!parseInt(evt.allDay) ? 86400000 : 0)), calendar.timezone, !!evt.DayLigth ? evt.DayLigth.calendar.startTime : Timezone.daylightSaving), 
     999                    allDay: parseInt( evt.allDay ), 
     1000                    isRepeat: isRepeat, 
     1001                    occurrence: i }, eventEditable(evt.id, isRepeat, i ) ) ); 
    9991002        }); 
    10001003 
  • trunk/prototype/modules/calendar/js/calendar.contentMenu.js

    r5592 r5746  
    66        $('.fullcalendar-context-menu').bind('contextmenu', function(event){ 
    77                event.preventDefault(); 
     8                 
    89                var classes = $(this).attr('class').split(" "); 
    9                 var idCalendar = false; 
    1010                var idEvent = false; 
    11                  
     11                var idRecurrence = false; 
     12                 
    1213                //recupera o id do calendar eo id do evento para tratamento 
    1314                for(var i = 0; i < classes.length; i++){ 
    14                         if(classes[i].indexOf("calendar-") >= 0 ){ 
    15                                 idCalendar = classes[i].replace(/[a-zA-Z-]+/g, ''); 
    16                         }else if (classes[i].indexOf("event-id-") >= 0 ){ 
    17                                 idEvent = classes[i].replace(/[a-zA-Z-]+/g, ''); 
    18                         } 
    19                         if(idCalendar && idEvent) 
    20                                 break; 
    21                 }; 
    22                  
    23                 var template = DataLayer.render( 'templates/menu_context_event.ejs', {event: idEvent,top: (event.clientY - 135), left: (event.clientX - 445), signature: Calendar.signatureOf[idCalendar], calendars: Calendar.calendars}); 
     15                    if (classes[i].indexOf("event-id-") >= 0 ){ 
     16                        idEvent = classes[i].replace(/[a-zA-Z-]+/g, ''); 
     17                        continue; 
     18                    }else if (classes[i].indexOf("Recurrence-id-") >= 0 ){ 
     19                        idRecurrence = classes[i].replace(/[a-zA-Z-]+/g, ''); 
     20                        continue; 
     21                    } 
     22                } 
     23 
     24                var schedulable = DataLayer.get('schedulable', idEvent); 
     25                 
     26                var template = DataLayer.render( 'templates/menu_context_event.ejs', {event: schedulable.id , 
     27                    top: (event.clientY - 135), left: (event.clientX - 445),  
     28                    signature: Calendar.signatureOf[schedulable.calendar], 
     29                    calendars: Calendar.calendars, isRecurrence: (!!parseInt(schedulable.repeat)), 
     30                    idRecurrence: idRecurrence 
     31                }); 
    2432                 
    2533                $('#context-menu-event').html(template); 
     34                 
     35                var method = function(value){ 
     36                    switch (value){ 
     37                        case "ocurrency": 
     38                            return '2' 
     39                        case "copy": 
     40                            return '1'; 
     41                        case "move":  
     42                            return '0'; 
     43                    } 
     44                } 
    2645                 
    2746                $('#context-menu-event').find('li.menu-item').hover( 
     
    3049                                if($(this).hasClass('copy') || $(this).hasClass('move')) { 
    3150                                         
    32                                         $(this).parents().find('.calendar-copy-move input[name="typeEvent"]').val( ($(this).hasClass('copy') ? '0' : '1' )); 
     51                                        $(this).parents().find('.calendar-copy-move input[name="typeEvent"]').val( method($(this).attr('class').split(" ")[0])); 
    3352                                        $(this).parents().find('.calendar-copy-move').show(); 
    3453                                 
  • trunk/prototype/modules/calendar/js/helpers.js

    r5720 r5746  
    5959*/ 
    6060 
    61 function eventDetails( objEvent, decoded, path, isMail) 
     61/* 
     62 * TODO - repeat foi adicionado pois melhorias devem ser feitas no rollback do 
     63 *DataLayer, repeat somente é usado quando se trata da criação de um evento 
     64 *pela edição de uma ocorrência. 
     65 */ 
     66 
     67function eventDetails( objEvent, decoded, path, isMail, repeat) 
    6268{ 
    6369        attendees = {}; 
     
    318324                                                                                */ 
    319325                                                                                var ids = []; 
    320                                                                                 $.each($('.attachment-list input'), function (i, input) { ids.push(input.value); }); 
     326                                                                                $.each($('.attachment-list input'), function (i, input) {ids.push(input.value);}); 
    321327                                                                                if(ids.length > 0) 
    322328                                                                                        DataLayer.remove('attachment', {filter: ['IN', 'id', ids]}); 
    323329                                                                                 
     330                                                                                DataLayer.rollback(); 
     331                                                                                 
    324332                                                                                UI.dialogs.addEvent.dialog('close'); 
    325333                                                                        }else{ 
     
    649657                        canDiscardEventDialog = true; 
    650658                         
    651                         UI.dialogs.addEvent.children().find('form.form-addevent').submit(); 
    652                         UI.dialogs.addEvent.dialog("close"); 
     659                        var exit = function(){ 
     660                            UI.dialogs.addEvent.children().find('form.form-addevent').submit(); 
     661                            UI.dialogs.addEvent.dialog("close"); 
     662                        } 
     663                         
     664                        if(repeat){ 
     665                               DataLayer.remove('repeat', false); 
     666                               DataLayer.put('repeat', repeat); 
     667                               DataLayer.commit('repeat', false, exit); 
     668                        }else 
     669                            exit(); 
    653670            }).end() 
    654671                 
     
    703720                }); 
    704721 
    705                 if(objEvent.me.id == User.me.id){ 
    706                         objEvent.me.id = DataLayer.put('participant', {user: objEvent.me.id, mail: objEvent.me.mail }); 
    707                         objEvent.organizer.id = objEvent.me.id; 
    708                 } 
     722 
     723                if(!repeat) 
     724                    if(objEvent.me.id == User.me.id){ 
     725                            objEvent.me.id = DataLayer.put('participant', {user: objEvent.me.id, mail: objEvent.me.mail}); 
     726                            objEvent.organizer.id = objEvent.me.id; 
     727                    } 
    709728 
    710729                var attendeeHtml = DataLayer.render( path+'templates/attendee_add.ejs', {event:objEvent});               
     
    783802                                        var user = DataLayer.get('user', ["=", "mail", $(this).val()]); 
    784803                                        if(!!user && user[0].id) 
    785                                                 attendees[user[0].id] = { name: user[0].name }; 
     804                                                attendees[user[0].id] = {name: user[0].name}; 
    786805                                         
    787806                                        /** 
     
    10691088                                 
    10701089                                var ids = []; 
    1071                                 $.each($('.attachment-list input'), function (i, input) { ids.push(input.value); }); 
     1090                                $.each($('.attachment-list input'), function (i, input) {ids.push(input.value);}); 
    10721091                                if(ids.length > 0){ 
    10731092                                        DataLayer.remove('attachment', {filter: ['IN', 'id', ids]}); 
     
    15971616                        if(clicked == 'Sim'){ 
    15981617                                DataLayer.remove('schedulable', ''+eventId); 
    1599                                 window.setTimeout(function() {DataLayer.commit();}, 500); 
     1618                                DataLayer.commit(); 
     1619                        } 
     1620                } 
     1621        });      
     1622} 
     1623 
     1624function mount_exception(eventID, idException){ 
     1625     
     1626    var schedulable = DataLayer.get('schedulable', ''+eventID); 
     1627    var edit = {repeat: (DataLayer.get('repeat', schedulable.repeat))};                                    
     1628 
     1629    edit.repeat.startTime = new Date(parseInt(edit.repeat.startTime)).toString('yyyy-MM-dd HH:mm:00'); 
     1630    edit.repeat.endTime = new Date(parseInt(edit.repeat.endTime)).toString('yyyy-MM-dd HH:mm:00'); 
     1631     
     1632    edit.repeat.exceptions = (schedulable.occurrences[idException]);          
     1633     
     1634    return edit.repeat; 
     1635 
     1636} 
     1637 
     1638function remove_ocurrence(eventId, idRecurrence){ 
     1639        $.Zebra_Dialog('Tem certeza que deseja excluir esta ocorrência?', { 
     1640                'type':     'question', 
     1641                'overlay_opacity': '0.5', 
     1642                'buttons':  ['Sim', 'Não'], 
     1643                'onClose':  function(clicked) { 
     1644                        if(clicked == 'Sim'){ 
     1645                            var repeat = mount_exception(eventId, idRecurrence); 
     1646                            DataLayer.remove('repeat', false); 
     1647                            DataLayer.put('repeat', repeat); 
     1648                            DataLayer.commit(false, false, function(data){ 
     1649                                Calendar.rerenderView(true); 
     1650                            }); 
    16001651                        } 
    16011652                } 
     
    21392190} 
    21402191 
    2141 function copyAndMoveTo(calendar, eventId){ 
    2142  
    2143     var type = $('.calendar-copy-move input[name="typeEvent"]').val(); 
    2144  
    2145         var schedulable = DataLayer.get('schedulable' , ''+eventId); 
    2146          
     2192function copyAndMoveTo(calendar, event, idRecurrence, type, evt){ 
     2193    /* 
     2194     * Types 
     2195     * 0 = Move 
     2196     * 1 = Copy Event end Repet 
     2197     * 2 = Copy Ocurrence 
     2198     * 3 = Copy to edit ocurrence 
     2199     *  
     2200     **/ 
     2201    if(!type) 
     2202        type = $('.calendar-copy-move input[name="typeEvent"]').val(); 
     2203 
     2204        var schedulable = DataLayer.get('schedulable', event+''); 
     2205         
     2206        calendar = !!calendar ? calendar : schedulable.calendar; 
     2207         
    21472208        if(typeof(schedulable) == "array") 
    21482209                schedulable = schedulable[0]; 
    21492210         
    21502211        //Move eventos entre agendas 
    2151         if(!!parseInt(type)){ 
     2212        if(parseInt(type) == 0){ 
    21522213                 
    21532214                schedulable.calendar = calendar;         
     
    21642225                delete newSchedulable.sequence; 
    21652226                delete newSchedulable.dtstamp; 
    2166                 delete schedulable.calendar; 
     2227                 
    21672228                delete schedulable.DayLigth; 
    21682229                delete schedulable.rangeStart 
    21692230                delete schedulable.rangeEnd; 
    21702231                delete schedulable.lastUpdate; 
    2171                 delete schedulable.repeat; 
    2172          
    2173  
     2232                 
     2233                delete schedulable.calendar; 
     2234                 
     2235                if(schedulable.repeat && type == "1" ){ 
     2236                    var repeat = DataLayer.get('repeat', schedulable.repeat); 
     2237                    delete repeat.schedulable; 
     2238                    delete repeat.id; 
     2239                    repeat.startTime = new Date(parseInt(repeat.startTime)).toString('yyyy-MM-dd HH:mm:00'); 
     2240                    repeat.endTime = new Date(parseInt(repeat.endTime)).toString('yyyy-MM-dd HH:mm:00'); 
     2241                     
     2242                    var exceptions = DataLayer.get('repeatOccurrence', {filter: ['AND', ['=','repeat', schedulable.repeat], ['=','exception','1']]}, true); 
     2243                    if(exceptions){ 
     2244                        repeat.exceptions = ''; 
     2245                        for(var i in exceptions ) 
     2246                            repeat.exceptions += exceptions[i].occurrence + ((exceptions.length -1) == parseInt(i) ? '' : ','); 
     2247                             
     2248                    } 
     2249                     
     2250                     
     2251                    schedulable.repeat = repeat; 
     2252                }else{ 
     2253                    if(!!idRecurrence){ 
     2254                        newSchedulable.endTime = parseInt(schedulable.occurrences[idRecurrence]) + (parseInt(newSchedulable.endTime) - parseInt(newSchedulable.startTime)); 
     2255                        newSchedulable.startTime = schedulable.occurrences[idRecurrence]; 
     2256                    } 
     2257                    delete schedulable.repeat; 
     2258                } 
     2259                delete schedulable.occurrences; 
     2260                 
    21742261                schedulable.calendar = DataLayer.copy(calendar);         
    2175          
    2176                 newSchedulable.endTime = new Date(parseInt(newSchedulable.endTime) - (newSchedulable.allDay ? 86400000 : 0)).toString('yyyy-MM-dd hh:mm:00'); 
    2177                 newSchedulable.startTime = new Date(parseInt(newSchedulable.startTime)).toString('yyyy-MM-dd hh:mm:00');  
    21782262                 
    21792263                var participants = DataLayer.copy(schedulable.participants); 
     
    21822266                schedulable.participants =  $.map( participants, function( attendee, i ){ 
    21832267                         
    2184                         var participant = DataLayer.get('participant', attendee); 
     2268                        var participant = DataLayer.get('participant', attendee, false); 
    21852269                         
    21862270                        if(typeof(participant) == 'array') 
    2187                                 participant = participant[0]; 
    2188          
     2271                            participant = participant[0]; 
     2272         
     2273                        delete participant.delegatedFrom; 
    21892274                        delete participant.id; 
     2275                        delete participant.schedulable; 
     2276                         
     2277                        participant.id = DataLayer.put('participant', participant); 
    21902278                         
    21912279                        return participant ; 
    2192         }); 
    2193          
    2194          
     2280                }); 
     2281                //Edit ocurrence 
     2282                if(parseInt(type) == 3){ 
     2283                    newSchedulable.endTime = !!evt.end  ? evt.end.getTime() :  ((evt.start).getTime() + 86400000); 
     2284                    newSchedulable.startTime = evt.start.getTime();  
     2285                     
     2286                    return newSchedulable; 
     2287                } 
     2288                newSchedulable.endTime = new Date(parseInt(newSchedulable.endTime) - (newSchedulable.allDay ? 86400000 : 0)).toString('yyyy-MM-dd hh:mm:00'); 
     2289                newSchedulable.startTime = new Date(parseInt(newSchedulable.startTime)).toString('yyyy-MM-dd hh:mm:00');  
    21952290         
    21962291                DataLayer.put('schedulable', newSchedulable); 
  • trunk/prototype/modules/calendar/js/init.js

    r5592 r5746  
    231231                }, 
    232232 
    233                 eventDrop: function( event ){ 
    234                         if(!event.disableDragging){ 
    235                                 DataLayer.put( "schedulable:calendar", event ); 
     233                eventDrop: function( evt, event, view  ){ 
     234                        evt.id = evt.id.split('-')[0]; 
     235                        if(!evt.disableDragging){ 
     236                             
     237                             if(evt.isRepeat){ 
     238                                 var schedulable = copyAndMoveTo(false , evt.id , false, "3", evt); 
     239                                  
     240                                 var repeat = mount_exception(evt.id, evt.occurrence); 
     241                                 DataLayer.remove('repeat', false); 
     242                                 DataLayer.put('repeat', repeat); 
     243                                 DataLayer.commit('repeat', false, function(data){ 
     244                                      
     245                                    DataLayer.put('schedulable', schedulable); 
     246                                      
     247                                 }); 
     248 
     249                             }else{                                  
     250                                DataLayer.put( "schedulable:calendar", evt ); 
    236251 
    237252                                event.editable = false; 
    238253                                event.className = "blocked-event"; 
    239                                 calendar.fullCalendar( 'updateEvent', event ); 
     254                                calendar.fullCalendar( 'updateEvent', evt ); 
     255                             } 
     256                              
     257                        }else 
     258                            Calendar.rerenderView(true); 
     259                }, 
     260 
     261                eventResize: function( evt, event, view ){ 
     262                        evt.id = evt.id.split('-')[0]; 
     263                        if(!evt.disableDragging){ 
     264                             if(evt.isRepeat){ 
     265                                 var schedulable = copyAndMoveTo(false , evt.id , false, "3", evt); 
     266                                  
     267                                 //Normaliza a data para o backend 
     268                                 schedulable.startTime = new Date(parseInt(schedulable.startTime)).toString('yyyy-MM-dd hh:mm:00'); 
     269                                 schedulable.endTime = new Date(parseInt(schedulable.endTime)).toString('yyyy-MM-dd hh:mm:00'); 
     270                                  
     271                                 var repeat = mount_exception(evt.id, evt.occurrence); 
     272                                  
     273                                 DataLayer.remove('repeat', false); 
     274                                 DataLayer.put('repeat', repeat); 
     275                                 DataLayer.commit('repeat', false, function(data){ 
     276                                      
     277                                    DataLayer.put('schedulable', schedulable); 
     278                                      
     279                                 }); 
     280                             }else{                                  
     281                                DataLayer.put( "schedulable:calendar", evt );    
     282                                evt.editable = false; 
     283                                evt.className = "blocked-event"; 
     284                                calendar.fullCalendar( 'updateEvent', evt ); 
     285                             } 
     286                         
    240287                        }else 
    241288                                Calendar.rerenderView(true); 
    242289                }, 
    243290 
    244                 eventResize: function( event ){ 
    245                         if(!event.disableDragging){ 
    246                         DataLayer.put( "schedulable:calendar", event ); 
    247  
    248                         event.editable = false; 
    249                         event.className = "blocked-event"; 
    250                         calendar.fullCalendar( 'updateEvent', event ); 
    251                         }else 
    252                                 Calendar.rerenderView(true); 
    253                 }, 
    254  
    255291                eventClick: function( evt, event, view ){ 
    256                         if(evt.selectable) 
    257                                 eventDetails( DataLayer.get( "schedulable", evt.id), true); 
     292                        evt.id = evt.id.split('-')[0]; 
     293                        if(evt.selectable){ 
     294                            if(evt.isRepeat){ 
     295                                $.Zebra_Dialog(evt.title + ' é um evento com repetição.', { 
     296                                        'type':     'question', 
     297                                        'overlay_opacity': '0.5', 
     298                                        'buttons':  ['Editar todas ocorrências', 'Editar essa ocorrência'], 
     299                                        'onClose':  function(clicked) { 
     300                                                if(clicked == 'Editar todas ocorrências') { 
     301                                                    eventDetails( DataLayer.get( "schedulable", evt.id), true); 
     302                                                }else{ 
     303                                                    /* 
     304                                                    * TODO - repeat foi adicionado pois melhorias devem ser feitas no rollback do 
     305                                                    *DataLayer, repeat somente é usado quando se trata da criação de um evento 
     306                                                    *pela edição de uma ocorrência. 
     307                                                    */       
     308                                                    var repeat = mount_exception(evt.id, evt.occurrence); 
     309                                                                                                   
     310                                                    $('.calendar-copy-move input[name="typeEvent"]').val("3"); 
     311                                                     
     312                                                    eventDetails(copyAndMoveTo(false , evt.id , false, "3", evt), true, '', false, repeat); 
     313                                                }        
     314                                        } 
     315                                }); 
     316                                 
     317                            }else 
     318                                eventDetails( DataLayer.get( "schedulable", evt.id), true); 
     319                                 
     320                        } 
    258321                } 
    259322        }, dateCalendar)); 
Note: See TracChangeset for help on using the changeset viewer.