Changeset 5746 for trunk


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
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/expressoCalendar/setup/tables_update.inc.php

    r5741 r5746  
    7979        function expressoCalendar_upgrade1_002() { 
    8080 
    81                 $oProc = $GLOBALS['phpgw_setup']->oProc; 
     81            $oProc = $GLOBALS['phpgw_setup']->oProc; 
    8282 
    83                 $oProc->query("ALTER TABLE calendar_repeat_occurrence ADD COLUMN exception smallint DEFAULT 0;"); 
     83            $oProc->query("ALTER TABLE calendar_repeat_occurrence ADD COLUMN exception smallint DEFAULT 0"); 
    8484 
    85                 $GLOBALS['setup_info']['expressoCalendar']['currentver'] = '1.003'; 
    86         return $GLOBALS['setup_info']['expressoCalendar']['currentver']; 
     85            $GLOBALS['setup_info']['expressoCalendar']['currentver'] = '1.003'; 
     86            return $GLOBALS['setup_info']['expressoCalendar']['currentver']; 
    8787        } 
    8888?> 
  • trunk/prototype/modules/calendar/css/layout.css

    r5641 r5746  
    424424.evt-list-options.my-evt-list-options{ 
    425425        position: absolute; 
    426         width: 110px; 
     426        width: 130px; 
    427427        display: block; 
    428428         
  • trunk/prototype/modules/calendar/interceptors/DBMapping.php

    r5741 r5746  
    150150 
    151151public function saveOccurrences( &$uri , &$result , &$criteria , $original ){ 
    152  
    153         $ranges = Controller::find( array( 'concept' => 'repeatRange' ), array( 'rangeStart', 'rangeEnd' ),  array( 'filter' => array( '=', 'user', Config::me("uidNumber") ) ) ); 
     152        $ranges = Controller::find( array( 'concept' => 'repeatRange' ), array( 'rangeStart', 'rangeEnd' ),  array( 'filter' => array( '=', 'user', Config::me("uidNumber") ) ) ); 
    154153 
    155154        if( !is_array( $ranges ) || !isset( $ranges[0]['rangeStart'] ) || !isset( $ranges[0]['rangeEnd'] ) ) 
     
    168167        $exceptions = array(); 
    169168 
    170         if( isset( $repeat['exceptions'] ) ) 
     169        if( isset( $original['properties']['exceptions'] ) ) 
    171170        { 
    172             $exceptions = explode( ',', $repeat['exceptions'] ); 
     171            $exceptions = explode( ',', $original['properties']['exceptions'] ); 
    173172            unset( $repeat['exceptions'] ); 
    174173        } 
    175  
     174         
     175        $lastExceptions = Controller::find( array( 'concept' => 'repeatOccurrence' ), array("occurrence") , array( 'filter' => array('AND', array( '=', 'repeat', $id ) , array( '=', 'exception', 1 ) ) )); 
     176 
     177        //Recurepa as execeções anteriores caso exista 
     178        if(isset($lastExceptions) && count($lastExceptions)) 
     179            foreach($lastExceptions as $key => $value) 
     180                array_push($exceptions, $lastExceptions[$key]['occurrence']); 
     181         
    176182        $params = array_diff( self::decodeRepeat( $repeat, $ranges[0]['rangeStart'], $ranges[0]['rangeEnd'] ), $exceptions ); 
    177  
     183         
    178184        Controller::delete( array( 'concept' => 'repeatOccurrence' ), false, array( 'filter' => array( '=', 'repeat', $id ) ) ); 
    179185 
    180186        if( !empty($params) ) 
    181             Controller::service('PostgreSQL')->execResultSql( "INSERT INTO calendar_repeat_occurrence(repeat_id,exception,occurrence)VALUES('".$id."','0','".implode( "'),('".$id."','0','", $params )."')".( empty($exceptions) ? "" : ",('".$id."','1','".implode( "'),('".$id."','0','", $exceptions )."')" ) ); 
    182  
     187            Controller::service('PostgreSQL')->execResultSql( "INSERT INTO calendar_repeat_occurrence(repeat_id,exception,occurrence)VALUES('".$id."','0','".implode( "'),('".$id."','0','", $params )."')".( empty($exceptions) ? "" : ",('".$id."','1','".implode( "'),('".$id."','1','", $exceptions )."')" ) ); 
    183188    } 
    184189 
     
    467472  
    468473    //TODO: Remover apos suporte a deepness na api  
    469     public function deepnessFindEvent( &$uri , &$result , &$criteria , $original ){              
    470  
     474    public function deepnessFindEvent( &$uri , &$result , &$criteria , $original ){ 
    471475       if(isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != 0) 
    472476       { 
    473477                         
    474                         $Time = new DateTime( 'now', new DateTimeZone('UTC') ); 
    475                         $DayLigth = array(); 
     478            $Time = new DateTime( 'now', new DateTimeZone('UTC') ); 
     479            $DayLigth = array(); 
    476480           foreach ($result as $i => $v) 
    477481           { 
     
    888892    } 
    889893 
    890     public function createSchedulableMails( &$uri , &$result , &$criteria , $original ){ 
    891          
    892         require_once (ROOTPATH.'/plugins/icalcreator/iCalcreator.class.php' ); 
    893         require_once (ROOTPATH.'/api/parseTPL.php' ); 
    894         $schedulable = Controller::read( array( 'concept' => 'schedulable' , 'id' => $result['id'] ));  
    895         $participants = Controller::find( array( 'concept' => 'participant' ) , false ,array( 'filter' => array('=', 'schedulable' ,  $result['id']) )) ;  
    896          
    897          
    898         if(is_array($participants) && count($participants) > 0) //Caso exista participants 
    899         { 
    900             $att = array(); 
    901             $attList = '<UL> '; 
    902             $organizer = array(); 
    903             foreach ($participants as $i => $v) 
    904                         { 
    905                 if($part['isExternal'] == 1) 
    906                     $att[$i] =  Controller::read( array( 'concept' => 'user' , 'id' => $v['user'] , 'service' => 'PostgreSQL' ) ); 
    907                 else 
    908                     $att[$i] = Controller::read( array( 'concept' => 'user' , 'id' => $v['user'] )); 
    909              
    910                $attList .= '<LI> '.$att[$i]['name'] .'</LI> '; 
    911                 
    912                if( isset($v['isOrganizer']) && $v['isOrganizer'] == 1) 
    913                    $organizer = $att[$i]; 
    914                 
    915             } 
    916             $attList .= '</UL>'; 
    917              
    918             foreach ($participants as $i => $v) 
    919                         {                                
    920                  
    921                 if($v === $organizer) //Organizador ?  
    922                     continue; 
    923                  
    924                 //Criação do ical 
    925                 $ical = null; 
    926                 $ical = new vcalendar(); 
    927                                 $ical->setProperty( 'method' , 'REQUEST' );                      
    928                                 $vschedulable = &$ical->newComponent( 'vschedulable' ); 
    929                                 $vschedulable->setProperty( 'uid' , $schedulable['uid'] ); 
    930                                 $vschedulable->setProperty( 'dtstart', gmdate( DATE_RFC822 , (int)($schedulable['startTime'] / 1000))); 
    931                                 $vschedulable->setProperty( 'dtend', gmdate( DATE_RFC822 , (int)($schedulable['endTime'] / 1000))); 
    932                                 $vschedulable->setProperty( 'summary',( $schedulable['summary'] )); 
    933                                 $vschedulable->setProperty( 'description', $schedulable['description']); 
    934                 $vschedulable->setProperty( 'location', $schedulable['location']); 
    935                 $params = array(); 
    936                 $params['CN'] = $att[$i]['name']; 
    937                 $params['RSVP'] = 'TRUE'; 
    938                 $params['ROLE'] = 'REQ-PARTICIPANT'; 
    939                 if(isset($att[$i]['mail'])) 
    940                     $vschedulable->setProperty( 'attendee', $att[$i]['mail'] , $params); 
    941                  
    942                 $vschedulable->setProperty( 'organizer', $organizer['mail'] , array('CN' => $organizer['name']) ); 
    943                                 /////////////////////////////////////////////////////////////////////////// 
    944                  
    945                 //Criação do E-mail 
    946                 $mail = array(); 
    947                 $mail['isHtml'] = true;   
    948                  
    949                 $timzone = new DateTimeZone('UTC'); 
    950                 $sTime = new DateTime( '@'.(int)($schedulable['startTime'] / 1000) , $timzone ); 
    951                 $eTime =  new DateTime( '@'.(int)($schedulable['endTime'] / 1000) , $timzone ); 
    952                  
    953                 $mail['body'] = parseTPL::load_tpl(array( 'startDate' =>  date_format( $sTime , 'd/m/Y') , 
    954                                                           'startTime' =>  date_format( $sTime , 'H:i') , 
    955                                                           'endDate' =>  date_format( $eTime , 'd/m/Y') , 
    956                                                           'endTime' =>  date_format( $eTime , 'H:i') , 
    957                                                           'schedulableTitle' =>  $schedulable['summary'], 
    958                                                           'schedulableLocation' =>  $schedulable['location'], 
    959                                                           'participants' =>  $attList 
    960                                                         ),ROOTPATH.'/api/templates/notify_create_body.tpl'); 
    961                  
    962                 //TODO: Internacionalização do Subject 
    963                 $mail['subject'] = 'Schedulable do Calendário : '.$schedulable['summary'] .' @ '.date_format( $sTime , 'd/m/Y H:i') . ' - ' .  date_format( $eTime , 'd/m/Y H:i'); 
    964                 $mail['from'] =  $organizer['mail']; 
    965                 $mail['to'] = $att[$i]['mail']; 
    966                 $mail['attachments'][] = array('source' => $ical->createCalendar(), 'type' => 'text/calendar' ,'disposition' => 'inline' ,'name' => 'external.ics'); 
    967                 $result['participants'][$i]['sendInvite'] = Controller::create( array( 'service' => 'SMTP' ), $mail );    
    968          
    969                         }          
    970         } 
    971         } 
    972  
    973894    public function davcalCreateCollection( &$uri , &$params , &$criteria , $original ){         
    974895        if( Config::module('useCaldav') ) 
  • 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)); 
  • trunk/prototype/modules/calendar/templates/menu_context_event.ejs

    r5592 r5746  
    33        <ul class="fg-menu ui-corner-all evt-option"> 
    44                <%if(signature.isOwner == "1"){%> 
    5                         <li role="menuitem" class="copy menu-item"><a href="#" class="ui-corner-all">Copiar para</a></li> 
     5                    <%if(data.isRecurrence){%> 
     6                        <li role="menuitem" class="copy menu-item"><a href="#" class="ui-corner-all">Copiar repetição</a></li> 
     7                        <li role="menuitem" class="ocurrency copy menu-item"><a href="#" class="ui-corner-all">Copiar ocorrência</a></li> 
     8                    <%}else{%> 
     9                        <li role="menuitem" class="copy menu-item"><a href="#" class="ui-corner-all">Copiar para</a></li> 
     10                    <%}%> 
    611                        <li role="menuitem" class="move menu-item"><a href="#" class="ui-corner-all">Mover para</a></li> 
    712                        <li role="menuitem" class="menu-item"><a href="../prototype/modules/calendar/export.php?event=<%=data.event%>" class="ui-corner-all">Exportar</a></li> 
    8                         <li role="menuitem" class="menu-item"><a href="#" onclick="remove_event(<%= data.event%>);" class="ui-corner-all">Remover</a></li> 
     13                         <%if(data.isRecurrence){%> 
     14                                <li role="menuitem" class="menu-item"><a href="#" onclick="remove_event(<%= data.event%>);" class="ui-corner-all">Remover repetição</a></li> 
     15                                <li role="menuitem" class="menu-item"><a href="#" onclick="remove_ocurrence(<%= data.event%>, <%= data.idRecurrence%>);" class="ui-corner-all">Remover ocorrência</a></li> 
     16                            <%}else{%> 
     17                                <li role="menuitem" class="menu-item"><a href="#" onclick="remove_event(<%= data.event%>);" class="ui-corner-all">Remover</a></li> 
     18                            <%}%> 
    919                <%}else{%> 
    1020                        <li role="menuitem" class="copy menu-item"><a href="#" class="ui-corner-all copy">Copiar para</a></li> 
     
    1424                        <li role="menuitem" class="menu-item"><a href="../prototype/modules/calendar/export.php?event=<%=data.event%>" class="ui-corner-all">Exportar</a></li> 
    1525                        <%if(signature.permission.acl['write'] || signature.permission.acl['remove']){%> 
    16                                 <li role="menuitem" class="menu-item"><a href="#" onclick="remove_event(<%= data.event%>);" class="ui-corner-all">Remover</a></li> 
     26                            <%if(data.isRecurrence){%> 
     27                                <li role="menuitem" class="menu-item"><a href="#" onclick="remove_event(<%= data.event%>);" class="ui-corner-all">Remover repetição</a></li> 
     28                                <li role="menuitem" class="menu-item"><a href="#" onclick="remove_ocurrence(<%= data.event%>, <%= data.idRecurrence%>);" class="ui-corner-all">Remover ocorrência</a></li> 
     29                            <%}else{%> 
     30                                <li role="menuitem" class="menu-item"><a href="#" onclick="remove_event(<%= data.event%>);" class="ui-corner-all">Remover</a></li> 
     31                            <%}%> 
    1732                        <%}%> 
    1833                <%}%> 
     
    2540        <ul class="fg-menu ui-corner-all evt-option"> 
    2641                <% for( var i = 0; i < data.calendars.length; i++ ){ %> 
    27                         <li role="menuitem" class="calendar-list"><a href="#"  onclick="copyAndMoveTo(<%=data.calendars[i].id %> ,<%= data.event%>);" class="ui-corner-all"><%=data.calendars[i].name %></a></li> 
     42                        <li role="menuitem" class="calendar-list"><a href="#"  onclick="copyAndMoveTo(<%=data.calendars[i].id %> ,<%= data.event%>, <%= data.idRecurrence%>);" class="ui-corner-all"><%=data.calendars[i].name %></a></li> 
    2843                <% } %> 
    2944        </ul> 
Note: See TracChangeset for help on using the changeset viewer.