Ignore:
Timestamp:
03/13/12 18:23:02 (12 years ago)
Author:
natan
Message:

Ticket #2434 - Implementacao da repeticao de eventos na agenda e adicao de suporte a relacionamentos 1x1 na API

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

Legend:

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

    • Property svn:ignore
      •  

        old new  
        22._init.js 
        33._calendar.date.js 
         4.calendar.codecs.js.kate-swp 
  • trunk/prototype/modules/calendar/js/calendar.codecs.js

    r5652 r5715  
    22   
    33    init: function(){ 
    4                 this.moduleName = 'expressoCalendar'; 
     4                this.moduleName = 'expressoCalendar';  
    55                this.me = DataLayer.dispatch( "me" ); 
    66                 
     
    99                this.isDaylightSaving = Timezone.daylightSaving; 
    1010                this.load();       
    11     }, 
     11    },              
    1212   
    1313    load: function(){ 
     
    564564                                return returns; 
    565565                        }; 
    566                                                  
     566                                                                 
    567567                    return { 
    568568                            "class": objEvent["class"], 
    569569                            id: objEvent.id, 
     570                            repeat: encodeRepeat( objEvent.repeat ), 
    570571                            location: objEvent.location, 
    571572                            category: objEvent.category, 
     
    605606                                                        receiveNotification : attend.receiveNotification, 
    606607                                                        alarms : $.map(attend.alarms || [], function( alarm ){ 
    607                                                                 //TODO - Atualizar cach cliente em conceito aninhados de camada 2 
    608                                                                 var alarmEvent = DataLayer.get('alarm', alarm) 
    609                                                                 return !!alarmEvent ? alarmEvent: (null); 
     608                                                                return DataLayer.get('alarm', alarm); 
    610609                                                        }) 
    611610                                                }; 
     
    643642                            me: !!participantInfo.user ? DataLayer.merge(participantInfo.user, me) : DataLayer.merge(this.isShared ? this.organizer :  me, {acl:  !this.isShared ? 'rowi' : Calendar.signatureOf[objEvent.calendar].permission.aclValues, delegatedFrom: 0, receiveNotification: 1}), 
    644643                                delegatedFrom: delegatedFrom, 
     644                                 
    645645                                statusParticipants: statusParticipants 
    646646                        }; 
     
    650650}); 
    651651 
    652  
     652function decodeRepeat ( form ) { 
     653 
     654        var patati = {}; 
     655         
     656        if( form.repeatId ) 
     657            patati['id'] = form.repeatId; 
     658 
     659        patati['frequency'] = form.frequency; 
     660 
     661        patati['bymonthday'] = patati['byyearday'] = patati['byday'] = ''; 
     662         
     663        patati['interval'] = patati['endTime'] = patati['count'] = patati['startTime'] = 0; 
     664         
     665        if( form.frequency === 'none' ) 
     666            return( patati ); 
     667         
     668        var day = []; 
     669 
     670        $("input[type=checkbox][name='repeatweekly[]']:checked").each(function() {  
     671                day[ day.length ] = $(this).val(); 
     672        }); 
     673 
     674        patati['byday'] = day.join(','); 
     675 
     676        var formatString = ( typeof form.allDay !== "undefined" && !!form.allDay )? User.preferences.dateFormat+" HH:mm" : User.preferences.dateFormat + " " + User.preferences.hourFormat; 
     677 
     678        var date = Date.parseExact( form.startDate + (!!form.allDay ? " 00:00": " "+$.trim(form.startHour)) , formatString ).add( { days: 1 } ).toString('yyyy-MM-dd HH:mm:00'); 
     679         
     680        patati['startTime'] = date.toString('yyyy-MM-dd HH:mm:00'); 
     681         
     682        if( !patati['byday'] ) 
     683              switch(form.frequency) { 
     684              case 'weekly':       
     685                      break; 
     686              case 'daily': 
     687                      break; 
     688              case 'monthly': 
     689                      patati['bymonthday'] = date.getDate(); 
     690                      break; 
     691              case 'yearly': 
     692                      patati['byyearday'] = date.getDayOfYear(); 
     693                      break; 
     694              default : 
     695                      return patati; 
     696              } 
     697 
     698        if (($(".endRepeat").val() == 'occurrences'))  
     699                patati['count'] = $(".occurrencesEnd").val();  
     700         
     701        if (($(".endRepeat").val() == 'customDate')) 
     702                patati['endTime'] = Date.parseExact( $(".customDateEnd").val() + (!!form.allDay ? " 00:00": " "+$.trim(form.endHour)) , formatString ).toString('yyyy-MM-dd HH:mm:00'); 
     703         
     704        patati['interval']  = $(".eventInterval").val(); 
     705 
     706        /** 
     707        wkst = [ 'MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU' ] 
     708        weekno = number 
     709        minute = number 
     710        second = number 
     711        yearday = number 
     712        monthday = number 
     713        setpos = number 
     714        day = number 
     715        hour = number 
     716        interval = number 
     717        frequency = [ 'monthly', 'daily', 'weekly', 'yearly', 'hourly', 'minutely', 'secondly' ] 
     718        endTime = milliseconds 
     719    */     
     720    return( patati ); 
     721       
     722} 
     723 
     724 
     725 
     726function encodeRepeat( repeat ){ 
     727   
     728        if( !repeat ) 
     729            return( false ); 
     730 
     731        return DataLayer.get( 'repeat', repeat ); 
     732} 
    653733 
    654734DataLayer.codec( "schedulable", "detail", { 
     
    674754                                  startTime: Date.parseExact(form.startDate + (!!form.allDay ? " 00:00": " "+$.trim(form.startHour)) , formatString ).toString('yyyy-MM-dd HH:mm:00'), 
    675755                                  endTime:  Date.parseExact(form.endDate + ( !!form.allDay ? " 00:00": " "+$.trim(form.endHour)), formatString ).toString('yyyy-MM-dd HH:mm:00'),  //+ (!!form.allDay ? 86400000 : 0) , 
    676                                   allDay: ( !!form.allDay ? 1 : 0 ), 
     756                                  allDay: ( !!form.allDay ? 1 : 0 ),        
    677757                              id: form.idEvent, 
    678758                              location: form.location, 
     
    685765                                                return {attachment: attachment} 
    686766                                  }), 
     767                              repeat: this.decodeRepeat( form ), 
    687768                              participants: $.map( form.attendee || [], function( attendee, i ){ 
    688769 
     
    722803    }, 
    723804 
     805 
    724806    encoder: function( evtObj ){ 
    725807         
    726         if(!(!!evtObj)) 
    727                 return undefined; 
    728  
    729         var notArray = false; 
    730        
    731         if( notArray = $.type(evtObj) !== "array" ) 
    732             evtObj = [ evtObj ]; 
    733  
    734         var pref = User.preferences; 
    735  
    736         var res =  DataLayer.encode('schedulable:preview', evtObj); 
    737  
    738         if( !notArray ){ 
    739             var dates = {}; 
    740  
    741             for (var i=0; i < res.length; i++) { 
    742  
    743                     var startDate = Date.parseExact( res[i]['startDate'], User.preferences.dateFormat ); 
    744                     var endDate   = Date.parseExact( res[i]['endDate'], User.preferences.dateFormat ); 
    745  
    746                     var counter   = startDate.clone(); 
    747  
    748                     while (counter.compareTo(startDate) == 0) { 
    749  
    750                             if (!dates[counter.toString(User.preferences.dateFormat)])  
    751                                         dates[counter.toString(User.preferences.dateFormat)] = { startDate:false, events:[] }; 
    752                             if (!dates[counter.toString(User.preferences.dateFormat)].startDate)  
    753                                         dates[counter.toString(User.preferences.dateFormat)].startDate = counter.toString(User.preferences.dateFormat); 
    754  
    755                             dates[counter.toString(User.preferences.dateFormat)].events.push(res[i]); 
    756                             counter.addDays(-1); 
    757                     }  
    758             } 
    759             res = { events_list: dates, 
    760                                 count : res.length 
    761                         }; 
    762         } 
    763  
    764         return notArray ? res[0] : res; 
     808                if(!(!!evtObj)) 
     809                        return undefined; 
     810 
     811                var notArray = false; 
     812                   
     813                if( notArray = $.type(evtObj) !== "array" ) 
     814                        evtObj = [ evtObj ]; 
     815 
     816                var pref = User.preferences; 
     817 
     818                var res =  DataLayer.encode('schedulable:preview', evtObj); 
     819 
     820                if( !notArray ){ 
     821                        var dates = {}; 
     822 
     823                        for (var i=0; i < res.length; i++) { 
     824                           
     825                                var startDate = Date.parseExact( res[i]['startDate'], User.preferences.dateFormat ); 
     826                                var endDate   = Date.parseExact( res[i]['endDate'], User.preferences.dateFormat ); 
     827                           
     828                                var duration = parseInt( endDate.getTime() ) - parseInt( startDate.getTime() ); 
     829                 
     830                                var occurrences = [ startDate.getTime() ]; 
     831                                 
     832                                if( res[i].occurrences ) 
     833                                { 
     834                                    occurrences = res[i].occurrences; 
     835                                } 
     836 
     837                                for( var ii = 0; ii < occurrences.length; ii++ ) 
     838                                { 
     839                                    var currentDate = new Date( occurrences[ii] ); 
     840                                    var counter = currentDate.clone(); 
     841                                     
     842                                    var res2 = $.extend( {}, res[i], {'startDate': currentDate.toString( User.preferences.dateFormat ), 'endDate': new Date( occurrences[ii] + duration ).toString( User.preferences.dateFormat ) } ); 
     843                                   
     844                                    while (counter.compareTo( currentDate ) == 0) { 
     845 
     846                                            if (!dates[counter.toString(User.preferences.dateFormat)])  
     847                                                    dates[counter.toString(User.preferences.dateFormat)] = { startDate:false, events:[] }; 
     848                                            if (!dates[counter.toString(User.preferences.dateFormat)].startDate)  
     849                                                    dates[counter.toString(User.preferences.dateFormat)].startDate = counter.toString(User.preferences.dateFormat); 
     850 
     851                                            dates[counter.toString(User.preferences.dateFormat)].events.push(res2); 
     852                                            counter.addDays(-1); 
     853                                    }       
     854                                } 
     855                        } 
     856                        res = { events_list: dates, 
     857                                        count : res.length 
     858                                }; 
     859                } 
     860 
     861                return notArray ? res[0] : res; 
    765862    } 
    766863 
     
    823920            return( false ); 
    824921 
    825 //       if( notArray = $.type(evtObj) !== "array" ) 
    826 //        evtObj = [ evtObj ]; 
    827 //      alert( evtObj ); 
    828922        var filtered = evtObj; 
    829          
    830         // repeat:{ 
    831 //        frequency: "weekly", 
    832 //        endTime: Date.parse("+10 days").getTime(), 
    833 //        interval: 3, 
    834 //        byday: 3, 
    835 //        bysecond: 3, 
    836 //        byminute: 3, 
    837 //        bymonthday: 3, 
    838 //        byyearday: 3, 
    839 //        byweekno: 3, 
    840 //        bysetpos: 3, 
    841 //        wkst: "monday"/*, 
    842 //        duration: true*/ 
    843 //       } 
    844  
    845 //      $.each(evtObj, function( index, evt ){ 
    846  
    847 //              alert( dump(!!evt.repeat) ); 
    848  
    849 //              if( evt && !!evt.repeat && (evt.startTime < filter.end || (evt.repeat.endTime || 0) > filter.start ) ) 
    850 //              { 
    851 // //               var interval = evt.repeat.interval; 
    852923//  
    853 //                  var current = new Date( evt.startTime ); 
    854 //                  var begin = new Date( filter.start ); 
    855 //                  var end = new Date( filter.end ); 
    856 //                  var offset = evt.endTime - evt.startTime; 
    857 //  
    858 //                  var ocurrence = []; 
    859 //  
    860 //                  while( Date.compare( current, begin ) !== 1 ) 
    861 //                      current = current.parse( "+" + evt.repeat.interval + " " + frequency + "s" ); 
    862 //  
    863 //                  while( current.before( end ) && (ocurrence[ ocurrence.length ] = current) ) 
    864 //                      current = current.parse( "+" + evt.repeat.interval + " " + frequency + "s" ); 
    865 //  
    866 //                  for( var i = 0; i < ocurrences.length; i++ ) 
    867 //                      filtered[ filtered.length ] = { URI: evt.URI, 
    868 //                                                      summary: evt.summary, 
    869 //                                                      start: new Date( ocurrences[i] ), 
    870 //                                                      end: new Date( ocurrences[i] + offset ), 
    871 //                                                      allDay: evt.allDay }; 
    872 //  
    873 // //               switch( evt.repeat.frequency ) 
    874 // //               { 
    875 // //                 case "yearly":   interval *= 12; 
    876 // //                 case "monthly":  interval *= 30; //TODO: get the month variant 
    877 // //                 case "weekly":   interval *= 7; 
    878 // //                 case "daily":    interval *= 24; 
    879 // //                 case "hourly":   interval *= 60; 
    880 // //                 case "minutely": interval *= 60;  
    881 // //                 case "secondly": interval *= 1000; 
    882 // //               } 
    883 // //              
    884 // //               var rest = ( filter.start - evt.startTime ) % interval; 
    885 // //  
    886 // //               var offset = evt.endTime - evt.startTime; 
    887 // //  
    888 // //               if( rest < offset ) 
    889 // //               { 
    890 // //                   var freq = Math.floor( offset - rest / interval ); 
    891 // //  
    892 // //                    
    893 // //  
    894 // //                   for( var i = 0; i < freq; i++ ) 
    895 // //                   { 
    896 // //                        var ocurrence = filter.start + rest + ( interval * i ); 
    897 // //  
    898 // //                         
    899 // //                   } 
    900 // //  
    901 // //                    
    902 // //               } 
    903 //              } 
    904  
    905 //              if( parseInt( evt.endTime ) > filter[1][0][2] || parseInt( evt.startTime ) < filter[1][1][2] ) 
    906 //                  filtered[ filtered.length ] = evt; 
    907 //  
    908 //      }); 
    909  
    910924        var grouped = {}; 
    911925 
     
    922936                var calendar = DataLayer.get('calendar', evt.calendar); 
    923937                 
    924                 var eventEditable = function(idEvent){ 
     938                var eventEditable = function(idEvent, isRecurrence){ 
    925939                        if(Calendar.signatureOf[calendar.id].isOwner == "1"){ 
    926940                                var attendee = {}; 
     
    928942                                        attendee = DataLayer.get('participant', evt.participants[i]); 
    929943                                                if(attendee.user == User.me.id) 
    930                                                         return (attendee.acl.indexOf('w') >= 0 || attendee.acl.indexOf('o') >= 0 ) ? {selectable: true, className: 'fullcalendar-context-menu  event-id-'+idEvent} : {editable: false, selectable: true ,className: 'blocked-event-permision  fullcalendar-not-context-menu event-id-'+idEvent}; 
     944                                                        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}; 
    931945                                } 
    932                                 return {editable: false, className: 'blocked-event-permision  fullcalendar-not-context-menu event-id-'+idEvent,  selectable: true}; 
     946                                return {editable: false, className: 'blocked-event-permision  fullcalendar-not-context-menu event-id-'+idEvent,  selectable: true, disableDragging: isRecurrence }; 
    933947                        } 
    934948                        else{ 
     
    943957                                }                                
    944958                                return DataLayer.merge({ 
    945                                         editable: aclSignature.acl['write'], 
     959                                        editable: aclSignature.acl['write'] && !isRecurrence, 
    946960                                        disableResizing : (((aclSignature.acl['busy'] && !aclSignature.acl['write']) || (!aclSignature.acl['write'] && aclSignature.acl['read'])) ? true : false), 
    947961                                        disableDragging  : (((aclSignature.acl['busy'] && !aclSignature.acl['write']) || (!aclSignature.acl['write'] && aclSignature.acl['read'])) ? true: false), 
     
    951965                         
    952966                } 
     967                 
     968                var duration = parseInt( evt.endTime ) - parseInt( evt.startTime ), isRepeat = false; 
     969                 
     970                var occurrences = [ evt.startTime ]; 
     971                 
     972                if( evt.occurrences ) 
     973                { 
     974                    isRepeat = true; 
     975                    occurrences = evt.occurrences; 
     976                } 
    953977                   
    954                 grouped[ evt.calendar ].push( DataLayer.merge({ id: evt.URI || evt.id, 
    955                                                 title: Encoder.htmlDecode(evt.summary), 
    956                                                 start: Timezone.getDateCalendar(new Date(parseInt( evt.startTime )), calendar.timezone,  !!evt.DayLigth ? evt.DayLigth.calendar.startTime : Timezone.daylightSaving), 
    957                                                 end:   Timezone.getDateCalendar(new Date(parseInt( evt.endTime ) - (!!parseInt(evt.allDay) ? 86400000 : 0)), calendar.timezone, !!evt.DayLigth ? evt.DayLigth.calendar.startTime : Timezone.daylightSaving), 
    958                                                 allDay: parseInt( evt.allDay ) }, eventEditable(evt.id) ) ); 
     978                for( var i = 0; i < occurrences.length; i++ ) 
     979                    grouped[ evt.calendar ].push( DataLayer.merge({ id: evt.URI || evt.id, 
     980                                                    title: Encoder.htmlDecode(evt.summary), 
     981                                                    start: Timezone.getDateCalendar(new Date( parseInt( occurrences[i] ) ), calendar.timezone,  !!evt.DayLigth ? evt.DayLigth.calendar.startTime : Timezone.daylightSaving), 
     982                                                    end:   Timezone.getDateCalendar(new Date( parseInt( occurrences[i] ) + duration - (!!parseInt(evt.allDay) ? 86400000 : 0)), calendar.timezone, !!evt.DayLigth ? evt.DayLigth.calendar.startTime : Timezone.daylightSaving), 
     983                                                    allDay: parseInt( evt.allDay ) }, eventEditable(evt.id, isRepeat ) ) ); 
    959984        }); 
    960985 
Note: See TracChangeset for help on using the changeset viewer.