- Timestamp:
- 03/18/12 15:07:09 (12 years ago)
- Location:
- trunk
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/expressoCalendar/setup/tables_update.inc.php
r5741 r5746 79 79 function expressoCalendar_upgrade1_002() { 80 80 81 81 $oProc = $GLOBALS['phpgw_setup']->oProc; 82 82 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"); 84 84 85 86 return $GLOBALS['setup_info']['expressoCalendar']['currentver'];85 $GLOBALS['setup_info']['expressoCalendar']['currentver'] = '1.003'; 86 return $GLOBALS['setup_info']['expressoCalendar']['currentver']; 87 87 } 88 88 ?> -
trunk/prototype/modules/calendar/css/layout.css
r5641 r5746 424 424 .evt-list-options.my-evt-list-options{ 425 425 position: absolute; 426 width: 1 10px;426 width: 130px; 427 427 display: block; 428 428 -
trunk/prototype/modules/calendar/interceptors/DBMapping.php
r5741 r5746 150 150 151 151 public 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") ) ) ); 154 153 155 154 if( !is_array( $ranges ) || !isset( $ranges[0]['rangeStart'] ) || !isset( $ranges[0]['rangeEnd'] ) ) … … 168 167 $exceptions = array(); 169 168 170 if( isset( $ repeat['exceptions'] ) )169 if( isset( $original['properties']['exceptions'] ) ) 171 170 { 172 $exceptions = explode( ',', $ repeat['exceptions'] );171 $exceptions = explode( ',', $original['properties']['exceptions'] ); 173 172 unset( $repeat['exceptions'] ); 174 173 } 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 176 182 $params = array_diff( self::decodeRepeat( $repeat, $ranges[0]['rangeStart'], $ranges[0]['rangeEnd'] ), $exceptions ); 177 183 178 184 Controller::delete( array( 'concept' => 'repeatOccurrence' ), false, array( 'filter' => array( '=', 'repeat', $id ) ) ); 179 185 180 186 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 )."')" ) ); 183 188 } 184 189 … … 467 472 468 473 //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 ){ 471 475 if(isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != 0) 472 476 { 473 477 474 475 478 $Time = new DateTime( 'now', new DateTimeZone('UTC') ); 479 $DayLigth = array(); 476 480 foreach ($result as $i => $v) 477 481 { … … 888 892 } 889 893 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 participants899 {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 else908 $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 ical925 $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-mail946 $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' => $attList960 ),ROOTPATH.'/api/templates/notify_create_body.tpl');961 962 //TODO: Internacionalização do Subject963 $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 973 894 public function davcalCreateCollection( &$uri , &$params , &$criteria , $original ){ 974 895 if( Config::module('useCaldav') ) -
trunk/prototype/modules/calendar/js/calendar.codecs.js
r5737 r5746 75 75 borderColor: '#' + signature.borderColor || User.preferences.borderColor, 76 76 textColor: '#' + signature.fontColor || User.preferences.fontColor, 77 className: 'calendar-' + signature.calendar.id,78 77 editable: signature.isOwner } 79 78 }); … … 179 178 180 179 if(force){ 181 delete Calendar.currentViewKey; 180 delete Calendar.currentViewKey; 181 182 182 $('#calendar').fullCalendar( 'refetchEvents' ); 183 183 } … … 189 189 190 190 $('#calendar').fullCalendar( 'refetchEvents' ); 191 192 contentMenu(); 191 193 } 192 194 } … … 271 273 DataLayer.commit( false, false, function(){ 272 274 if((typeof($tabs) != "undefined") && $tabs.tabs('option' ,'selected') == 0){ 273 Calendar.rerenderView(true); 274 contentMenu(); 275 Calendar.rerenderView(true); 275 276 }else if((typeof($tabs) != "undefined") && $tabs.tabs('option' ,'selected') != 0) 276 277 pageselectCallback($('.events-list-win.active [name=keyword]').val(), 0); … … 603 604 return(null); 604 605 605 var attend = DataLayer.get('participant', participant);606 var attend = DataLayer.get('participant', (participant.id || participant)); 606 607 attend.user = DataLayer.get('user', attend.user); 607 608 … … 612 613 id: attend.id, 613 614 status : attend.status, 614 delegatedFrom: attend.delegatedFrom ,615 delegatedFrom: attend.delegatedFrom || '0', 615 616 acl: attend.acl, 616 617 receiveNotification : attend.receiveNotification, … … 947 948 var calendar = DataLayer.get('calendar', evt.calendar); 948 949 949 var eventEditable = function(idEvent, isRecurrence ){950 var eventEditable = function(idEvent, isRecurrence, Recurrence){ 950 951 if(Calendar.signatureOf[calendar.id].isOwner == "1"){ 951 952 var attendee = {}; … … 953 954 attendee = DataLayer.get('participant', evt.participants[i]); 954 955 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}; 956 957 } 957 958 return {editable: false, className: 'blocked-event-permision fullcalendar-not-context-menu event-id-'+idEvent, selectable: true, disableDragging: isRecurrence }; … … 963 964 var returns = "" 964 965 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 : '') : ''); 966 967 returns += 'event-id-'+idEvent; 967 968 return returns; … … 992 993 993 994 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 ) ) ); 999 1002 }); 1000 1003 -
trunk/prototype/modules/calendar/js/calendar.contentMenu.js
r5592 r5746 6 6 $('.fullcalendar-context-menu').bind('contextmenu', function(event){ 7 7 event.preventDefault(); 8 8 9 var classes = $(this).attr('class').split(" "); 9 var idCalendar = false;10 10 var idEvent = false; 11 11 var idRecurrence = false; 12 12 13 //recupera o id do calendar eo id do evento para tratamento 13 14 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 }); 24 32 25 33 $('#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 } 26 45 27 46 $('#context-menu-event').find('li.menu-item').hover( … … 30 49 if($(this).hasClass('copy') || $(this).hasClass('move')) { 31 50 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])); 33 52 $(this).parents().find('.calendar-copy-move').show(); 34 53 -
trunk/prototype/modules/calendar/js/helpers.js
r5720 r5746 59 59 */ 60 60 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 67 function eventDetails( objEvent, decoded, path, isMail, repeat) 62 68 { 63 69 attendees = {}; … … 318 324 */ 319 325 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);}); 321 327 if(ids.length > 0) 322 328 DataLayer.remove('attachment', {filter: ['IN', 'id', ids]}); 323 329 330 DataLayer.rollback(); 331 324 332 UI.dialogs.addEvent.dialog('close'); 325 333 }else{ … … 649 657 canDiscardEventDialog = true; 650 658 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(); 653 670 }).end() 654 671 … … 703 720 }); 704 721 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 } 709 728 710 729 var attendeeHtml = DataLayer.render( path+'templates/attendee_add.ejs', {event:objEvent}); … … 783 802 var user = DataLayer.get('user', ["=", "mail", $(this).val()]); 784 803 if(!!user && user[0].id) 785 attendees[user[0].id] = { name: user[0].name};804 attendees[user[0].id] = {name: user[0].name}; 786 805 787 806 /** … … 1069 1088 1070 1089 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);}); 1072 1091 if(ids.length > 0){ 1073 1092 DataLayer.remove('attachment', {filter: ['IN', 'id', ids]}); … … 1597 1616 if(clicked == 'Sim'){ 1598 1617 DataLayer.remove('schedulable', ''+eventId); 1599 window.setTimeout(function() {DataLayer.commit();}, 500); 1618 DataLayer.commit(); 1619 } 1620 } 1621 }); 1622 } 1623 1624 function 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 1638 function 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 }); 1600 1651 } 1601 1652 } … … 2139 2190 } 2140 2191 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 2192 function 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 2147 2208 if(typeof(schedulable) == "array") 2148 2209 schedulable = schedulable[0]; 2149 2210 2150 2211 //Move eventos entre agendas 2151 if( !!parseInt(type)){2212 if(parseInt(type) == 0){ 2152 2213 2153 2214 schedulable.calendar = calendar; … … 2164 2225 delete newSchedulable.sequence; 2165 2226 delete newSchedulable.dtstamp; 2166 delete schedulable.calendar;2227 2167 2228 delete schedulable.DayLigth; 2168 2229 delete schedulable.rangeStart 2169 2230 delete schedulable.rangeEnd; 2170 2231 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 2174 2261 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');2178 2262 2179 2263 var participants = DataLayer.copy(schedulable.participants); … … 2182 2266 schedulable.participants = $.map( participants, function( attendee, i ){ 2183 2267 2184 var participant = DataLayer.get('participant', attendee );2268 var participant = DataLayer.get('participant', attendee, false); 2185 2269 2186 2270 if(typeof(participant) == 'array') 2187 participant = participant[0]; 2188 2271 participant = participant[0]; 2272 2273 delete participant.delegatedFrom; 2189 2274 delete participant.id; 2275 delete participant.schedulable; 2276 2277 participant.id = DataLayer.put('participant', participant); 2190 2278 2191 2279 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'); 2195 2290 2196 2291 DataLayer.put('schedulable', newSchedulable); -
trunk/prototype/modules/calendar/js/init.js
r5592 r5746 231 231 }, 232 232 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 ); 236 251 237 252 event.editable = false; 238 253 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 240 287 }else 241 288 Calendar.rerenderView(true); 242 289 }, 243 290 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 }else252 Calendar.rerenderView(true);253 },254 255 291 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 } 258 321 } 259 322 }, dateCalendar)); -
trunk/prototype/modules/calendar/templates/menu_context_event.ejs
r5592 r5746 3 3 <ul class="fg-menu ui-corner-all evt-option"> 4 4 <%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 <%}%> 6 11 <li role="menuitem" class="move menu-item"><a href="#" class="ui-corner-all">Mover para</a></li> 7 12 <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 <%}%> 9 19 <%}else{%> 10 20 <li role="menuitem" class="copy menu-item"><a href="#" class="ui-corner-all copy">Copiar para</a></li> … … 14 24 <li role="menuitem" class="menu-item"><a href="../prototype/modules/calendar/export.php?event=<%=data.event%>" class="ui-corner-all">Exportar</a></li> 15 25 <%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 <%}%> 17 32 <%}%> 18 33 <%}%> … … 25 40 <ul class="fg-menu ui-corner-all evt-option"> 26 41 <% 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> 28 43 <% } %> 29 44 </ul>
Note: See TracChangeset
for help on using the changeset viewer.