Changeset 7702


Ignore:
Timestamp:
01/03/13 08:46:17 (11 years ago)
Author:
acoutinho
Message:

Ticket #3259 - Otimizar carregamento de eventos no modulo ExpressoCalendar?

Location:
trunk/prototype
Files:
2 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/prototype/config/schedulable.ini

    r7590 r7702  
    1717 
    1818[before.find] 
     19findDeepnessOne = modules/calendar/interceptors/DBMapping.php 
    1920findSchedulable = modules/calendar/interceptors/DBMapping.php 
    2021findTask = modules/calendar/interceptors/DBMapping.php 
  • trunk/prototype/modules/calendar/constants.php

    r7077 r7702  
    9797define('STATUS_TODO_COMPLETED', 3); 
    9898define('STATUS_TODO_CANCELLED', 4); 
     99 
     100define('EVENT_NOT_EDITABLE', 0); 
     101define('EVENT_EDITABLE', 1); 
     102define('EVENT_EDITABLE_FROM_PERMISSION', 2) 
    99103?> 
  • trunk/prototype/modules/calendar/interceptors/DBMapping.php

    r7696 r7702  
    194194 
    195195    public function findSchedulable(&$uri, &$params, &$criteria, $original) { 
    196         if (isset($criteria['filter'][2][1]) && $criteria['filter'][2][1] == 'calendar') { 
    197  
    198             $sql = ' SELECT calendar_object.id as id ,calendar_object.cal_uid as "uid", calendar_object.type_id as "type", ' 
    199                 .'calendar_object.dtstart as "startTime", calendar_object.summary as "summary", ' 
    200                 .'calendar_object.description as "description", calendar_object.dtend as "endTime" , ' 
    201         .'calendar_object.priority as "priority", calendar_object.due as "due", ' 
    202         .'calendar_object.percentage as "percentage", calendar_object.status as "status", ' 
    203                 .'calendar_object.location as "location", calendar_object.allday as "allDay", ' 
    204                 .'calendar_object.transp as "transparent", calendar_object.class_id as "class", ' 
    205                 .'calendar_object.repeat as "repeat", calendar_object.range_start as "rangeStart", ' 
    206                 .'calendar_object.range_end as "rangeEnd", calendar_object.last_update as "lastUpdate", ' 
    207                 .'calendar_object.dtstamp as "dtstamp", calendar_object.sequence as "sequence", ' 
    208                 .'calendar_object.tzid as "timezone" ,calendar_to_calendar_object.calendar_id as ' 
    209                 .'calendar FROM calendar_to_calendar_object , calendar_object ' 
    210                 .'WHERE ( calendar_to_calendar_object.calendar_id IN (\'' . implode('\',\'', $criteria['filter'][2][2]) . '\')) ' 
    211                 .'AND calendar_to_calendar_object.calendar_object_id = calendar_object.id ' 
    212         .'AND calendar_object.id NOT IN(select calendar_object_task_id from calendar_task_to_activity_object where owner = \'' . Config::me('uidNumber') . '\') ';       
    213              
    214             if(isset($criteria['searchEvent']) && $criteria['searchEvent']){ 
    215                 $where = 'AND (((upper("summary") like upper(\'%'.$criteria['filter'][1][1][2].'%\') OR upper("description") like upper(\'%'.$criteria['filter'][1][2][2].'%\')))) ORDER BY dtstart LIMIT '.$criteria['limit'].'  OFFSET '.$criteria['offset'].' '; 
    216                 $params = Controller::service('PostgreSQL')->execResultSql($sql.$where); 
    217  
    218             }else{ 
    219                 $start = array( $criteria['filter'][1][1][1][2] , $criteria['filter'][1][2][1][2], $criteria['filter'][1][3][1][2] ); 
    220                 $end = array( $criteria['filter'][1][1][2][2] , $criteria['filter'][1][2][2][2], $criteria['filter'][1][3][2][2] ); 
    221  
    222                 $ids = array(); 
    223                 $occ = array(); 
    224  
    225                 if ($occurrences = self::checkOccurrences($start[0], $end[0], $criteria['filter'][2][2])) 
    226                     foreach ($occurrences as $id => $occurrence) { 
    227                         $ids[] = $id; 
    228                         $occ[] = $occurrence; 
    229                     }    
    230  
    231                 $where = 'AND ((range_end >= \'' . $start[0] . '\' AND range_end <= \'' . $end[0] . '\') OR ' 
    232                         .'(range_start >= \'' . $start[1] . '\' AND range_start <= \'' . $end[1] . '\') OR ' 
    233                         .'(range_start <= \'' . $start[2] . '\' AND range_end >= \'' . $end[2] . '\')) ' 
    234                 .(!empty($ids) ? ' ' .'AND calendar_object.id NOT IN (\'' . implode('\',\'', $ids) . '\') ' : ' ') 
    235                 .'AND calendar_object.dtstart NOT IN (SELECT calendar_repeat_occurrence.occurrence from calendar_repeat_occurrence, ' 
    236                 .'calendar_repeat where (calendar_repeat_occurrence.repeat_id = calendar_repeat.id) ' 
    237                 .'AND (calendar_repeat.object_id = calendar_object.id))'; 
    238  
    239                 $params = Controller::service('PostgreSQL')->execResultSql($sql.$where); 
    240                 $params = array_merge($params, $occ);            
    241             } 
    242             $params = self::deepnessFindEvent($uri, $params, $criteria, $original); 
    243             return false; 
    244         } 
     196        if (isset($criteria['customQuery']) && $criteria['customQuery'] == '1') { 
     197 
     198            $sql = ' SELECT calendar_object.id as id ,calendar_object.cal_uid as "uid", calendar_object.type_id as "type", ' 
     199            .'calendar_object.dtstart as "startTime", calendar_object.summary as "summary", ' 
     200            .'calendar_object.description as "description", calendar_object.dtend as "endTime" , ' 
     201            .'calendar_object.priority as "priority", calendar_object.due as "due", ' 
     202            .'calendar_object.percentage as "percentage", calendar_object.status as "status", ' 
     203            .'calendar_object.location as "location", calendar_object.allday as "allDay", ' 
     204            .'calendar_object.transp as "transparent", calendar_object.class_id as "class", ' 
     205            .'calendar_object.repeat as "repeat", calendar_object.range_start as "rangeStart", ' 
     206            .'calendar_object.range_end as "rangeEnd", calendar_object.last_update as "lastUpdate", ' 
     207            .'calendar_object.dtstamp as "dtstamp", calendar_object.sequence as "sequence", ' 
     208            .'calendar_object.tzid as "timezone" ,calendar_to_calendar_object.calendar_id as ' 
     209            .'calendar FROM calendar_to_calendar_object , calendar_object ' 
     210            .'WHERE ( calendar_to_calendar_object.calendar_id IN (\'' . implode('\',\'', $criteria['calendar']) . '\')) ' 
     211            .'AND calendar_to_calendar_object.calendar_object_id = calendar_object.id ' 
     212            .'AND calendar_object.id NOT IN(select calendar_object_task_id from calendar_task_to_activity_object where owner = \'' . Config::me('uidNumber') . '\') '; 
     213 
     214            if(isset($criteria['searchEvent']) && $criteria['searchEvent']){ 
     215                $where = 'AND (((upper("summary") like upper(\'%'.$criteria['filter'][1][1][2].'%\') OR upper("description") like upper(\'%'.$criteria['filter'][1][2][2].'%\')))) ORDER BY dtstart LIMIT '.$criteria['limit'].'  OFFSET '.$criteria['offset'].' '; 
     216                $params = Controller::service('PostgreSQL')->execResultSql($sql.$where); 
     217 
     218            }else{ 
     219                $start = $criteria['rangeStart']; 
     220                $end = $criteria['rangeEnd']; 
     221 
     222                $ids = array(); 
     223                $occ = array(); 
     224 
     225                if ($occurrences = self::checkOccurrences($start, $end, $criteria['calendar'])) 
     226                    foreach ($occurrences as $id => $occurrence) { 
     227                        $ids[] = $id; 
     228                        $occ[] = $occurrence; 
     229                    } 
     230 
     231                $where = 'AND ((range_end >= \'' . $start . '\' AND range_end <= \'' . $end . '\') OR ' 
     232                    .'(range_start >= \'' . $start . '\' AND range_start <= \'' . $end . '\') OR ' 
     233                    .'(range_start <= \'' . $start . '\' AND range_end >= \'' . $end . '\')) ' 
     234                .(!empty($ids) ? ' ' .'AND calendar_object.id NOT IN (\'' . implode('\',\'', $ids) . '\') ' : ' ') 
     235                .'AND calendar_object.dtstart NOT IN (SELECT calendar_repeat_occurrence.occurrence from calendar_repeat_occurrence, ' 
     236                .'calendar_repeat where (calendar_repeat_occurrence.repeat_id = calendar_repeat.id) ' 
     237                .'AND (calendar_repeat.object_id = calendar_object.id))'; 
     238 
     239                $params = Controller::service('PostgreSQL')->execResultSql($sql.$where); 
     240                $params = array_merge($params, $occ); 
     241            } 
     242 
     243 
     244            $params = self::deepnessFindEvent($uri, $params, $criteria, $original); 
     245            return false; 
     246        } 
    245247    } 
    246248 
     
    841843    } 
    842844 
     845    //TODO: Remover apos suporte a deepness na api 
     846    public function findDeepnessOne(&$uri, &$params, &$criteria, $original){ 
     847 
     848        if (isset($criteria['findOne']) && $criteria['findOne'] == '1') { 
     849 
     850            $sql = ' SELECT DISTINCT calendar_object.id as id ,calendar_object.cal_uid as "uid", calendar_object.type_id as "type", ' 
     851                .'calendar_object.dtstart as "startTime", calendar_object.summary as "summary", ' 
     852                .'calendar_object.description as "description", calendar_object.dtend as "endTime" , ' 
     853                .'calendar_object.priority as "priority", calendar_object.due as "due", ' 
     854                .'calendar_object.percentage as "percentage", calendar_object.status as "status", ' 
     855                .'calendar_object.location as "location", calendar_object.allday as "allDay", ' 
     856                .'calendar_object.transp as "transparent", calendar_object.class_id as "class", ' 
     857                .'calendar_object.repeat as "repeat", calendar_object.range_start as "rangeStart", ' 
     858                .'calendar_object.range_end as "rangeEnd", calendar_object.last_update as "lastUpdate", ' 
     859                .'calendar_object.dtstamp as "dtstamp", calendar_object.sequence as "sequence", ' 
     860                .'calendar_object.tzid as "timezone" ' 
     861                .'FROM calendar_object ' 
     862                .'WHERE ( calendar_object.id = '. $criteria['schedulable'] .')'; 
     863 
     864            $params = Controller::service('PostgreSQL')->execResultSql($sql); 
     865 
     866            $params = self::deepnessFindEvent($uri, $params, $criteria, $original); 
     867            return false; 
     868        } 
     869 
     870 
     871 
     872    } 
     873 
    843874    //TODO: Remover apos suporte a deepness na api  
    844875    public function deepnessFindEvent(&$uri, &$result, &$criteria, $original) { 
    845         if (isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != 0) { 
     876        if ((isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != 0) ) { 
    846877 
    847878            $date = new DateTime('now', new DateTimeZone('UTC')); 
  • trunk/prototype/modules/calendar/js/calendar.codecs.js

    r7680 r7702  
    7373                    if( Calendar.currentViewKey !== viewKey ){ 
    7474                        Calendar.currentViewKey = viewKey; 
    75                         Calendar.currentView = DataLayer.get( 'schedulable:calendar', { 
    76                             start: start,  
    77                             end: end 
    78                         } ); 
     75                        Calendar.currentView =  DataLayer.encode('schedulable:calendar', DataLayer.dispatch('modules/calendar/schedules', DataLayer.criteria('schedulable:calendar', {start: start,end: end}))  );   //DataLayer.get( 'schedulable:calendar', {start: start,end: end} ); 
    7976                    } 
    8077                    var view = Calendar.currentView[ signature.calendar.id ]; 
     
    199196   
    200197    if( status === 'serverclient' ){ 
    201         DataLayer.commit( false, false, function(){      
     198        DataLayer.commit( false, false, function(){ 
     199            //Clean cache client after commit 
     200            DataLayer.remove('schedulable', false); 
     201 
    202202            Calendar.rerenderView(true); 
    203             if(updateActivity) 
    204                 refreshTaskActivity(); 
    205         }); 
     203            if(updateActivity) 
     204                refreshTaskActivity(); 
     205        }); 
    206206    } 
    207207}); 
     
    13371337function encodeRepeat( repeat ){ 
    13381338   
    1339     if( !repeat ) 
    1340         return( false ); 
     1339    if( !repeat || repeat == '0' ) 
     1340            return( false ); 
    13411341    if(typeof(repeat) == "object") 
    1342         return repeat; 
     1342            return repeat; 
    13431343 
    13441344    return DataLayer.get( 'repeat', repeat ); 
     
    14361436 
    14371437    encoder: function( evtObj ){ 
    1438         if(!(!!evtObj)) 
    1439             return undefined; 
    1440  
    1441         var notArray = false; 
    1442                    
    1443         if( notArray = $.type(evtObj) !== "array" ) 
    1444             evtObj = [ evtObj ]; 
    1445  
    1446         var pref = User.preferences; 
    1447     var res = []; 
    1448  
    1449     for(var i = 0; i < evtObj.length; i++){ 
    1450            res.push(DataLayer.encode('schedulable:' + (evtObj[i].type == '1' ?  'preview' : ( !!evtObj[i].taskToActivity ? 'activity': 'task')) , evtObj[i])); 
    1451     } 
    1452  
    1453         if( !notArray ){ 
    1454             var dates = {}; 
    1455             var typeRepeat = { 
    1456                 'none': false,  
    1457                 'daily': 'Repetição diária', 
    1458                 'weekly': 'Repetição semanal', 
    1459                 'monthly': 'Repetição mensal', 
    1460                 'yearly': 'repetição anual' 
     1438        if(!(!!evtObj)) 
     1439            return undefined; 
     1440 
     1441        var notArray = false; 
     1442 
     1443        if( notArray = $.type(evtObj) !== "array" ) 
     1444            evtObj = [ evtObj ]; 
     1445 
     1446        var pref = User.preferences; 
     1447        var res = []; 
     1448 
     1449        for(var i = 0; i < evtObj.length; i++){ 
     1450           res.push(DataLayer.encode('schedulable:' + (evtObj[i].type == '1' ?  'preview' : ( !!evtObj[i].taskToActivity ? 'activity': 'task')) , evtObj[i])); 
     1451        } 
     1452 
     1453        if( !notArray ){ 
     1454            var dates = {}; 
     1455            var typeRepeat = { 
     1456                'none': false, 
     1457                'daily': 'Repetição diária', 
     1458                'weekly': 'Repetição semanal', 
     1459                'monthly': 'Repetição mensal', 
     1460                'yearly': 'repetição anual' 
     1461            } 
     1462 
     1463            for (var i=0; i < res.length; i++) { 
     1464 
     1465                res[i].type = (res[i].type == '2' && !!res[i].tasks) ? '3' : res[i].type; 
     1466 
     1467                var startDate = Date.parseExact( res[i]['startDate'], User.preferences.dateFormat ); 
     1468                var endDate   = Date.parseExact( res[i]['endDate'], User.preferences.dateFormat ); 
     1469 
     1470                var duration = parseInt( endDate.getTime() ) - parseInt( startDate.getTime() ); 
     1471 
     1472                var occurrences = [ startDate.getTime() ]; 
     1473 
     1474                if( res[i].occurrences ) 
     1475                { 
     1476                    occurrences = res[i].occurrences; 
     1477                } 
     1478 
     1479                for( var ii = 0; ii < occurrences.length; ii++ ) 
     1480                { 
     1481                    var currentDate = new Date( occurrences[ii] ); 
     1482                    var counter = currentDate.clone(); 
     1483 
     1484                    res[i].startDate = currentDate.toString( User.preferences.dateFormat ); 
     1485                    res[i].endDate = new Date( occurrences[ii] + duration ).toString( User.preferences.dateFormat ); 
     1486 
     1487                    if(res[i].repeat) 
     1488                        res[i].repeat = typeRepeat[res[i].repeat.frequency]; 
     1489                } 
     1490            } 
    14611491            } 
    14621492 
    1463             for (var i=0; i < res.length; i++) { 
    1464  
    1465         res[i].type = (res[i].type == '2' && !!res[i].tasks) ? '3' : res[i].type; 
    1466                            
    1467                 var startDate = Date.parseExact( res[i]['startDate'], User.preferences.dateFormat ); 
    1468                 var endDate   = Date.parseExact( res[i]['endDate'], User.preferences.dateFormat ); 
    1469                            
    1470                 var duration = parseInt( endDate.getTime() ) - parseInt( startDate.getTime() ); 
    1471                  
    1472                 var occurrences = [ startDate.getTime() ]; 
    1473                                  
    1474                 if( res[i].occurrences ) 
    1475                 { 
    1476                     occurrences = res[i].occurrences; 
    1477                 } 
    1478  
    1479                 for( var ii = 0; ii < occurrences.length; ii++ ) 
    1480                 { 
    1481                     var currentDate = new Date( occurrences[ii] ); 
    1482                     var counter = currentDate.clone(); 
    1483                                      
    1484                     var res2 = $.extend( {}, res[i], { 
    1485                         'startDate': currentDate.toString( User.preferences.dateFormat ),  
    1486                         'endDate': new Date( occurrences[ii] + duration ).toString( User.preferences.dateFormat ) 
    1487                         } ); 
    1488  
    1489                     if(res[i].repeat) 
    1490                 res2.repeat = typeRepeat[res[i].repeat.frequency]; 
    1491                                    
    1492                     while (counter.compareTo( currentDate ) == 0) { 
    1493  
    1494                         if (!dates[counter.toString(User.preferences.dateFormat)])  
    1495                             dates[counter.toString(User.preferences.dateFormat)] = { 
    1496                                 startDate:false,  
    1497                                 events:[] 
    1498                             }; 
    1499                         if (!dates[counter.toString(User.preferences.dateFormat)].startDate)  
    1500                             dates[counter.toString(User.preferences.dateFormat)].startDate = counter.toString(User.preferences.dateFormat); 
    1501  
    1502                         dates[counter.toString(User.preferences.dateFormat)].events.push(res2); 
    1503                         counter.addDays(-1); 
    1504                     }       
    1505                 } 
    1506             } 
    1507             res = { 
    1508                 events_list: dates, 
    1509                 count : res.length 
    1510             }; 
    1511         } 
    1512  
    1513         return notArray ? res[0] : res; 
     1493            return notArray ? res[0] : res; 
     1494    } 
     1495 
     1496}); 
     1497 
     1498DataLayer.codec( "schedulable", "list", { 
     1499 
     1500    decoder: function( evtObj ){}, 
     1501 
     1502 
     1503    encoder: function( evtObj ){ 
     1504        if(!(!!evtObj)) 
     1505            return undefined; 
     1506 
     1507        var notArray = false; 
     1508 
     1509        if( notArray = $.type(evtObj) !== "array" ) 
     1510            evtObj = [ evtObj ]; 
     1511 
     1512        var pref = User.preferences; 
     1513        var res = []; 
     1514 
     1515        for(var i = 0; i < evtObj.length; i++){ 
     1516            res.push(DataLayer.encode('schedulable:' + (evtObj[i].type == '1' ?  'preview' : ( !!evtObj[i].taskToActivity ? 'activity': 'task')) , evtObj[i])); 
     1517        } 
     1518 
     1519        if( !notArray ){ 
     1520            var dates = {}; 
     1521            var typeRepeat = { 
     1522                'none': false, 
     1523                'daily': 'Repetição diária', 
     1524                'weekly': 'Repetição semanal', 
     1525                'monthly': 'Repetição mensal', 
     1526                'yearly': 'repetição anual' 
     1527            } 
     1528 
     1529            for (var i=0; i < res.length; i++) { 
     1530 
     1531                res[i].type = (res[i].type == '2' && !!res[i].tasks) ? '3' : res[i].type; 
     1532 
     1533                var startDate = Date.parseExact( res[i]['startDate'], User.preferences.dateFormat ); 
     1534                var endDate   = Date.parseExact( res[i]['endDate'], User.preferences.dateFormat ); 
     1535 
     1536                var duration = parseInt( endDate.getTime() ) - parseInt( startDate.getTime() ); 
     1537 
     1538                var occurrences = [ startDate.getTime() ]; 
     1539 
     1540                if( res[i].occurrences ) 
     1541                { 
     1542                    occurrences = res[i].occurrences; 
     1543                } 
     1544 
     1545                for( var ii = 0; ii < occurrences.length; ii++ ) 
     1546                { 
     1547                    var currentDate = new Date( occurrences[ii] ); 
     1548                    var counter = currentDate.clone(); 
     1549 
     1550                    var res2 = $.extend( {}, res[i], { 
     1551                        'startDate': currentDate.toString( User.preferences.dateFormat ), 
     1552                        'endDate': new Date( occurrences[ii] + duration ).toString( User.preferences.dateFormat ) 
     1553                    } ); 
     1554 
     1555                    if(res[i].repeat) 
     1556                        res2.repeat = typeRepeat[res[i].repeat.frequency]; 
     1557 
     1558                    while (counter.compareTo( currentDate ) == 0) { 
     1559 
     1560                        if (!dates[counter.toString(User.preferences.dateFormat)]) 
     1561                            dates[counter.toString(User.preferences.dateFormat)] = { 
     1562                                startDate:false, 
     1563                                events:[] 
     1564                            }; 
     1565                        if (!dates[counter.toString(User.preferences.dateFormat)].startDate) 
     1566                            dates[counter.toString(User.preferences.dateFormat)].startDate = counter.toString(User.preferences.dateFormat); 
     1567 
     1568                        dates[counter.toString(User.preferences.dateFormat)].events.push(res2); 
     1569                        counter.addDays(-1); 
     1570                    } 
     1571                } 
     1572            } 
     1573            res = { 
     1574                events_list: dates, 
     1575                count : res.length 
     1576            }; 
     1577        } 
     1578 
     1579        return notArray ? res[0] : res; 
    15141580    } 
    15151581 
     
    16931759                 
    16941760                var taskEditable = function(idTask){ 
    1695                         for(var i = 0; i < evt.participants.length; i++){ 
    1696                                 attendee = DataLayer.get('participant', evt.participants[i]); 
    1697                                 if(attendee.user == User.me.id) 
    1698                                         return attendee.isOrganizer == '1' ?  
    1699                                         { 
    1700                                                 editable: true,  
    1701                                                 disableResizing: false,  
    1702                                                 disableDragging: false, 
    1703                                                 className: 'fullcalendar-context-menu  event-type-2 event-id-'+idTask+' calendar-id-'+calendar.id 
    1704                                         }  
    1705                                         :  
    1706                                         { 
    1707                                                 editable: false,  
    1708                                                 disableResizing: true,  
    1709                                                 disableDragging: true, 
    1710                                                 className: 'blocked-event-permision  fullcalendar-not-context-menu event-id-'+idTask 
    1711                                         }; 
    1712                         } 
     1761 
     1762            return evt.editable == '1' ? 
     1763                { 
     1764                    editable: true, 
     1765                    disableResizing: false, 
     1766                    disableDragging: false, 
     1767                    className: 'fullcalendar-context-menu  event-type-2 event-id-'+idTask+' calendar-id-'+calendar.id 
     1768                } 
     1769                : 
     1770                { 
     1771                    editable: false, 
     1772                    disableResizing: true, 
     1773                    disableDragging: true, 
     1774                    className: 'blocked-event-permision  fullcalendar-not-context-menu event-id-'+idTask 
     1775                }; 
    17131776                } 
    17141777                 
    17151778            var eventEditable = function(idEvent, isRecurrence, Recurrence){ 
    17161779                        if(Calendar.signatureOf[calendar.id].isOwner == "1"){ 
    1717                                 var attendee = {}; 
    1718                                 for(var i = 0; i < evt.participants.length; i++){ 
    1719                                         attendee = DataLayer.get('participant', evt.participants[i]); 
    1720                                         if(attendee.user == User.me.id) 
    1721                                                 return (attendee.acl.indexOf('w') >= 0 || attendee.acl.indexOf('o') >= 0 ) ?  
    1722                                                 { 
    1723                                                         selectable: true,  
    1724                                                         className: 'fullcalendar-context-menu  event-type-1 event-id-'+idEvent+' calendar-id-'+calendar.id+ (isRecurrence ? ' isRecurrence Recurrence-id-'+Recurrence : '') 
    1725                                                 } : { 
    1726                                                         editable: false,  
    1727                                                         selectable: true , 
    1728                                                         className: 'blocked-event-permision  fullcalendar-not-context-menu event-id-'+idEvent 
    1729                                                 }; 
    1730                                 } 
    1731                                 return { 
    1732                                         editable: false,  
    1733                                         className: 'blocked-event-permision  fullcalendar-not-context-menu event-id-'+idEvent+' calendar-id-'+calendar.id,   
    1734                                         selectable: true,  
    1735                                         disableDragging: isRecurrence 
    1736                                 }; 
    1737                         } 
    1738                         else{ 
     1780 
     1781                return (evt.editable == '1' ) ? 
     1782                { 
     1783                    selectable: true, 
     1784                    className: 'fullcalendar-context-menu  event-type-1 event-id-'+idEvent+' calendar-id-'+calendar.id+ (isRecurrence ? ' isRecurrence Recurrence-id-'+Recurrence : '') 
     1785                } : { 
     1786                    editable: false, 
     1787                    selectable: true , 
     1788                    className: 'blocked-event-permision  fullcalendar-not-context-menu event-id-'+idEvent 
     1789                }; 
     1790 
     1791                        }else{ 
    17391792                                var aclSignature = Calendar.signatureOf[calendar.id].permission; 
    17401793                                         
     
    17991852    criteria: function( filter ){ 
    18001853       
    1801         if( $.type(filter.start) !== 'date' ) 
    1802             filter.start = new Date( filter.start * 1000 ); 
    1803         if( $.type(filter.end) !== 'date' ) 
    1804             filter.end = new Date( filter.end * 1000 ); 
    1805  
    1806         var timezone = {}; 
    1807         for(var i in Calendar.signatureOf) 
    1808             timezone[i] = Calendar.signatureOf[i].calendar.timezone; 
    1809          
    1810         return { 
    1811             filter: ['AND',  
    1812                         ['OR', 
    1813                             ['AND',  
    1814                                 ['>=', 'rangeEnd', filter.start.getTime()],  
    1815                                 ['<=', 'rangeEnd', filter.end.getTime()] 
    1816                             ], 
    1817                             ['AND',  
    1818                                 ['>=', 'rangeStart', filter.start.getTime()],  
    1819                                 ['<=', 'rangeStart', filter.end.getTime()] 
    1820                             ], 
    1821                             ['AND',  
    1822                                 ['<=', 'rangeStart', filter.start.getTime()],  
    1823                                 ['>=', 'rangeEnd', filter.end.getTime()] 
    1824                             ] 
    1825                         ], 
    1826                         ['IN', 'calendar',  $.merge( Calendar.calendarIds, Calendar.groupIds )] 
    1827                 ],  
    1828             criteria: { 
    1829                 deepness: 2,  
    1830                 timezones: timezone 
    1831             } 
    1832         } 
    1833 } 
     1854        if( $.type(filter.start) !== 'date' ) 
     1855            filter.start = new Date( filter.start * 1000 ); 
     1856        if( $.type(filter.end) !== 'date' ) 
     1857            filter.end = new Date( filter.end * 1000 ); 
     1858 
     1859        var timezone = {}; 
     1860        for(var i in Calendar.signatureOf) 
     1861            timezone[i] = Calendar.signatureOf[i].calendar.timezone; 
     1862 
     1863        return { 
     1864            timezones: timezone, 
     1865            rangeStart: filter.start.getTime(), 
     1866            rangeEnd: filter.end.getTime(), 
     1867            calendar: $.merge( [], Calendar.calendarIds, Calendar.groupIds ) 
     1868        } 
     1869    } 
    18341870}); 
    18351871 
  • trunk/prototype/modules/calendar/js/helpers.js

    r7661 r7702  
    19641964            if(clicked == 'Sim'){ 
    19651965 
    1966                 var schedulable = DataLayer.get('schedulable', ''+eventId); 
     1966                var schedulable = getSchedulable( eventId, ''); 
    19671967                schedulable.calendar = ''+idCalendar; 
    19681968                var schudableDecode = DataLayer.encode( "schedulable:preview", schedulable); 
     
    19821982 
    19831983function mount_exception(eventID, idException){ 
    1984      
    1985     var schedulable = DataLayer.get('schedulable', ''+eventID); 
    1986     var edit = { 
    1987         repeat: (DataLayer.get('repeat', schedulable.repeat)) 
    1988         };                                    
     1984 
     1985    getSchedulable( eventID.toString() , ''); 
     1986    var schedulable = DataLayer.get('schedulable', eventID.toString() ) 
     1987    var edit = { repeat: (DataLayer.get('repeat', schedulable.repeat)) }; 
    19891988 
    19901989    edit.repeat.startTime = new Date(parseInt(edit.repeat.startTime)).toString('yyyy-MM-dd HH:mm:00'); 
     
    25022501        case 'basicDay': 
    25032502        case 'agendaDay': 
    2504             rangeStart = new Date.today().add({ 
    2505                 days: page_index 
    2506             }).getTime(); 
     2503            rangeStart = new Date.today().add({ days: page_index }).getTime(); 
    25072504            rangeEnd = rangeStart + 86400000; 
    25082505            break; 
     
    25102507            var dateStart = new Date().moveToDayOfWeek(dateCalendar.dayOfWeek[User.preferences.weekStart]);  
    25112508            var dateEnd = new Date().moveToDayOfWeek(dateCalendar.dayOfWeek[User.preferences.weekStart]);  
    2512             rangeStart = dateStart.add({ 
    2513                 days: (7 * page_index) 
    2514                 }).getTime(); 
    2515             rangeEnd = dateEnd.add({ 
    2516                 days: (7 * page_index)+7 
    2517                 }).getTime(); 
     2509            rangeStart = dateStart.add({ days: (7 * page_index) }).getTime(); 
     2510            rangeEnd = dateEnd.add({ days: (7 * page_index)+7 }).getTime(); 
    25182511            break; 
    25192512        case 'month': 
    2520             var date = Date.today().add({ 
    2521                 months: page_index 
    2522             })  
     2513            var date = Date.today().add({ months: page_index }) 
    25232514            rangeStart = date.moveToFirstDayOfMonth().getTime(); 
    25242515            rangeEnd = date.moveToLastDayOfMonth().getTime(); 
    25252516            break; 
    25262517        case 'year': 
    2527             var dateStart = new Date().add({ 
    2528                 years: page_index 
    2529             });  
    2530             var dateEnd = new Date().add({ 
    2531                 years: page_index 
    2532             }); 
     2518            var dateStart = new Date().add({ years: page_index }); 
     2519            var dateEnd = new Date().add({ years: page_index }); 
    25332520            if(dateStart.getMonth() != 0) 
    2534                 dateStart.moveToMonth(0, -1) 
     2521                    dateStart.moveToMonth(0, -1) 
    25352522            if(dateEnd.getMonth() != 11) 
    2536                 dateEnd.moveToMonth(11)  
    2537             rangeStart =    dateStart.moveToFirstDayOfMonth().getTime(); 
    2538             rangeEnd = dateEnd.moveToLastDayOfMonth().getTime(); 
     2523            dateEnd.moveToMonth(11) 
     2524 
     2525        rangeStart = dateStart.moveToFirstDayOfMonth().getTime(); 
     2526        rangeEnd = dateEnd.moveToLastDayOfMonth().getTime(); 
    25392527            break;   
    25402528    } 
     
    25422530    var timezone = {}; 
    25432531    for(var i in Calendar.signatureOf) 
    2544         timezone[i] = Calendar.signatureOf[i].calendar.timezone;                 
    2545          
    2546     return { 
    2547          filter: ['AND',  
    2548                     ['OR',  
    2549                         ['AND',  
    2550                             ['>=', 'rangeEnd', rangeStart],  
    2551                             ['<=', 'rangeEnd', rangeEnd] 
    2552                         ], 
    2553                         ['AND',  
    2554                             ['>=', 'rangeStart', rangeStart],  
    2555                             ['<=', 'rangeStart', rangeEnd] 
    2556                         ], 
    2557                         ['AND',  
    2558                             ['<=', 'rangeStart', rangeStart],  
    2559                             ['>=', 'rangeEnd', rangeEnd] 
    2560                         ] 
    2561                     ], 
    2562                     ['IN', 'calendar',  calerdars_selecteds] 
    2563                 ],  
    2564         criteria: { 
    2565             deepness: 2,  
     2532            timezone[i] = Calendar.signatureOf[i].calendar.timezone; 
     2533         
     2534    return  { 
     2535        rangeStart: rangeStart, 
     2536        rangeEnd: rangeEnd, 
    25662537            order: 'startTime',  
    2567             timezones: timezone 
    2568         } 
    2569     };  
    2570  
     2538            timezones: timezone, 
     2539        calendar: calerdars_selecteds 
     2540        }; 
    25712541} 
    25722542 
     
    25812551     
    25822552        if(!selecteds && (keyword != '' && keyword != null)){    
    2583         jQuery('#'+tab_selector[type] + ((Base64.encode(keyword)).replace(/[^\w\s]/gi, "")|| '')).html( 
    2584             '<div title="'+tab_title[type]+'" class="events-list events-list-win active empty">' + 
    2585             '<label>'+label_noselect_calendar[type]+'</label>' + 
    2586             '</div>' 
    2587             ); 
     2553        jQuery('#'+tab_selector[type] + ((Base64.encode(keyword)).replace(/[^\w\s]/gi, "")|| '')).html( 
     2554            '<div title="'+tab_title[type]+'" class="events-list events-list-win active empty">' + 
     2555            '<label>'+label_noselect_calendar[type]+'</label>' + 
     2556            '</div>' 
     2557        ); 
    25882558    }else{ 
    2589         var criteria = null; 
    2590         if(keyword == '' || keyword == null) 
    2591             criteria = mountCriteriaList(!!view ? view : User.preferences.defaultCalView, page_index, selecteds) 
    2592         else 
    2593             criteria =  { 
    2594                 filter: ['AND', ['OR', ["i*", "summary", keyword], ["i*", "description", keyword]], ['IN', 'calendar',  selecteds]],  
    2595                 criteria: { 
    2596                     searchEvent: true, 
    2597                     order: 'startTime',  
    2598                     offset: (25 * page_index),  
    2599                     limit: (((25 * page_index) + 25) + 1),  
    2600                     deepness: 2 
    2601                 } 
    2602             }; 
    2603     var results = DataLayer.get('schedulable:detail', criteria); 
    2604     keyword = ( keyword || '' ).replace( /\s+/g, "_" );  
     2559        var criteria = null; 
     2560        if(keyword == '' || keyword == null){ 
     2561 
     2562            criteria = mountCriteriaList(!!view ? view : User.preferences.defaultCalView, page_index, selecteds); 
     2563 
     2564        }else{ 
     2565 
     2566            var timezone = {}; 
     2567            for(var i in Calendar.signatureOf) 
     2568                timezone[i] = Calendar.signatureOf[i].calendar.timezone; 
     2569 
     2570            criteria =  { 
     2571 
     2572                searchEvent: true, 
     2573                order: 'startTime', 
     2574                offset: (25 * page_index), 
     2575                limit: (((25 * page_index) + 25) + 1), 
     2576                summary: keyword, 
     2577                description: keyword, 
     2578                calendar: selecteds, 
     2579                timezones: timezone 
     2580 
     2581            }; 
     2582        } 
     2583 
     2584        var results = DataLayer.encode('schedulable:list', DataLayer.dispatch('modules/calendar/schedules', criteria)); 
     2585        //var results = DataLayer.get('schedulable:detail', criteria); 
     2586        keyword = ( keyword || '' ).replace( /\s+/g, "_" ); 
    26052587        } 
    26062588// não há resultados     
     
    26272609                        $(".event-details-item").parent().click(function(event){ 
    26282610                        event.stopImmediatePropagation(); 
    2629                         $(this).siblings("div.details-event-list").toggleClass("hidden") 
     2611            var container = $(this).siblings("div.details-event-list"); 
     2612 
     2613 
     2614            //lazy data 
     2615            if( container.hasClass('hidden') ){ 
     2616 
     2617                //only first click 
     2618                if(!container.find('fieldset').length){ 
     2619 
     2620                   $(this).append( '<span style="width: 20px;" class="load-event-detail"><img style="width: 20px;" src="'+DataLayer.dispatchPath+'/modules/calendar/img/loading.gif"></img></span>'); 
     2621 
     2622                    var schedulable = container.find('input[name="eventid"]').val(); 
     2623                    schedulable = DataLayer.encode('schedulable:detail', [getSchedulable( schedulable, '' )]); 
     2624 
     2625                    schedulable = $.isArray( schedulable ) ? schedulable[0] : schedulable; 
     2626 
     2627                    container.prepend( DataLayer.render( 'templates/event_detail_list.ejs', {'_event': schedulable})); 
     2628 
     2629                    $(this).find('span.load-event-detail').remove(); 
     2630                } 
     2631            } 
     2632 
     2633            container.toggleClass("hidden") 
    26302634                        .find('.button.delete').click(function(event){ 
    26312635                                var eventId = $(this).siblings('[name="eventid"]').val(); 
     
    26352639                        }) 
    26362640                        .end().find('.button.edit').click(function(event){ 
     2641 
     2642                var schedulable = $(this).siblings('[name="eventid"]').val(); 
    26372643                switch($(this).siblings('[name="eventtype"]').val()){ 
     2644 
    26382645                    case '1': 
    2639                         eventDetails( DataLayer.get( "schedulable", $(this).siblings('[name="eventid"]').val() ), true ); 
     2646                        eventDetails( getSchedulable( schedulable, '' ), true ); 
    26402647                    break; 
    26412648                    case '2': 
    2642                         taskDetails( DataLayer.get( "schedulable", $(this).siblings('[name="eventid"]').val() ), true ); 
     2649                        taskDetails( getSchedulable( schedulable, '' ), true ); 
    26432650                    break; 
    26442651                    case '3': 
    2645                         activityDetails( DataLayer.get( "schedulable", $(this).siblings('[name="eventid"]').val() ), true ); 
     2652                        activityDetails( getSchedulable( schedulable, '' ), true ); 
    26462653                    break;  
    26472654                } 
     
    28292836        type = $('.calendar-copy-move input[name="typeEvent"]').val(); 
    28302837 
    2831     var schedulable = DataLayer.get('schedulable', event+''); 
     2838    getSchedulable(event,''); 
     2839    var schedulable = DataLayer.get('schedulable', event.toString()); 
    28322840    schedulable['class'] = '1'; 
    28332841         
     
    28432851                 
    28442852        schedulable.lastCalendar = schedulable.calendar; 
    2845         schedulable.calendar = calendar;         
     2853    schedulable.calendar = calendar; 
    28462854        DataLayer.put('schedulable', schedulable); 
    28472855         
     
    28682876            delete repeat.schedulable; 
    28692877            delete repeat.id; 
    2870             repeat.startTime = new Date(parseInt(repeat.startTime)).toString('yyyy-MM-dd HH:mm:00'); 
    2871             repeat.endTime = new Date(parseInt(repeat.endTime)).toString('yyyy-MM-dd HH:mm:00'); 
     2878            repeat.startTime = repeat.startTime == '' ? '' : new Date(parseInt(repeat.startTime)).toString('yyyy-MM-dd HH:mm:00'); 
     2879            repeat.endTime = repeat.endTime == '' ? '' : new Date(parseInt(repeat.endTime)).toString('yyyy-MM-dd HH:mm:00'); 
    28722880                     
    28732881            var exceptions = DataLayer.get('repeatOccurrence', { 
     
    28922900        delete schedulable.occurrences; 
    28932901                 
    2894         schedulable.calendar = DataLayer.copy(calendar);         
     2902        schedulable.calendar = DataLayer.copy(calendar); 
    28952903                 
    28962904        var participants = DataLayer.copy(schedulable.participants); 
     
    29252933            return newSchedulable; 
    29262934        } 
    2927         newSchedulable.endTime = new Date(parseInt(newSchedulable.endTime) - (newSchedulable.allDay ? 86400000 : 0)).toString('yyyy-MM-dd hh:mm:00'); 
    2928         newSchedulable.startTime = new Date(parseInt(newSchedulable.startTime)).toString('yyyy-MM-dd hh:mm:00');  
     2935        newSchedulable.endTime = new Date(parseInt(newSchedulable.endTime) - (parseInt(newSchedulable.allDay) ? 86400000 : 0)).toString('yyyy-MM-dd HH:mm:00'); 
     2936        newSchedulable.startTime = new Date(parseInt(newSchedulable.startTime)).toString('yyyy-MM-dd HH:mm:00'); 
    29292937         
    29302938        DataLayer.put('schedulable', newSchedulable); 
  • trunk/prototype/modules/calendar/js/init.js

    r7653 r7702  
    1515                }, 
    1616                show: function( event, ui ){ 
    17                         delete Calendar.currentViewKey; 
    18                         $('#calendar').fullCalendar('refetchEvents'); 
     17 
     18            if( $('#tabs').tabs('option' ,'selected') == 0){ 
     19                delete Calendar.currentViewKey; 
     20                $('#calendar').fullCalendar('refetchEvents'); 
     21            } 
    1922                } 
    2023        }) 
     
    397400                eventDrop: function( evt, event, view  ){ 
    398401                        evt.id = evt.id.split('-')[0]; 
    399                         if(!evt.disableDragging){ 
     402            if(!evt.disableDragging){ 
    400403                             
    401                              if(evt.isRepeat){ 
    402                                  var schedulable = copyAndMoveTo(false , evt.id , false, "3", evt); 
     404                if(evt.isRepeat){ 
     405                    var schedulable = copyAndMoveTo(false , evt.id , false, "3", evt); 
    403406                                  
    404                                  var repeat = mount_exception(evt.id, evt.occurrence); 
    405                                  DataLayer.remove('repeat', false); 
    406                                  DataLayer.put('repeat', repeat); 
    407                                  DataLayer.commit('repeat', false, function(data){ 
     407                    var repeat = mount_exception(evt.id, evt.occurrence); 
     408                    DataLayer.remove('repeat', false); 
     409                    DataLayer.put('repeat', repeat); 
     410                    DataLayer.commit('repeat', false, function(data){ 
    408411                                     
    409                                     DataLayer.remove('schedulable', repeat.schedulable, false);  
    410                                     DataLayer.put('schedulable', schedulable); 
     412                        DataLayer.remove('schedulable', repeat.schedulable, false); 
     413                        DataLayer.put('schedulable', schedulable); 
    411414                                      
    412                                  }); 
    413  
    414                              }else{                                  
    415                                 DataLayer.put( "schedulable:calendar", evt ); 
    416  
    417                                 event.editable = false; 
    418                                 event.className = "blocked-event"; 
    419                                 calendar.fullCalendar( 'updateEvent', evt ); 
    420                              } 
     415                     }); 
     416 
     417                }else{ 
     418                    DataLayer.put( "schedulable:calendar", evt ); 
     419 
     420                                    event.editable = false; 
     421                                    event.className = "blocked-event"; 
     422                                    calendar.fullCalendar( 'updateEvent', evt ); 
     423                } 
    421424                              
    422425                        }else 
    423                             Calendar.rerenderView(true); 
     426                Calendar.rerenderView(true); 
    424427                }, 
    425428 
    426429                eventResize: function( evt, event, view ){ 
    427                         evt.id = evt.id.split('-')[0]; 
     430            evt.id = evt.id.split('-')[0]; 
    428431                        if(!evt.disableDragging){ 
    429                              if(evt.isRepeat){ 
    430                                  var schedulable = copyAndMoveTo(false , evt.id , false, "3", evt); 
    431                                   
    432                                  //Normaliza a data para o backend 
    433                                  schedulable.startTime = new Date(parseInt(schedulable.startTime)).toString('yyyy-MM-dd hh:mm:00'); 
    434                                  schedulable.endTime = new Date(parseInt(schedulable.endTime)).toString('yyyy-MM-dd hh:mm:00'); 
    435                                   
    436                                  var repeat = mount_exception(evt.id, evt.occurrence); 
    437                                   
    438                                  DataLayer.remove('repeat', false); 
    439                                  DataLayer.put('repeat', repeat); 
    440                                  DataLayer.commit('repeat', false, function(data){ 
    441                                       
    442                                     DataLayer.remove('schedulable', repeat.schedulable, false);  
    443                                     DataLayer.put('schedulable', schedulable); 
    444                                       
    445                                  }); 
    446                              }else{                                  
    447                                 DataLayer.put( "schedulable:calendar", evt );    
    448                                 evt.editable = false; 
    449                                 evt.className = "blocked-event"; 
    450                                 calendar.fullCalendar( 'updateEvent', evt ); 
    451                              } 
     432                if(evt.isRepeat){ 
     433                    var schedulable = copyAndMoveTo(false , evt.id , false, "3", evt); 
     434 
     435                    //Normaliza a data para o backend 
     436                    schedulable.startTime = new Date(parseInt(schedulable.startTime)).toString('yyyy-MM-dd hh:mm:00'); 
     437                    schedulable.endTime = new Date(parseInt(schedulable.endTime)).toString('yyyy-MM-dd hh:mm:00'); 
     438 
     439                    var repeat = mount_exception(evt.id, evt.occurrence); 
     440 
     441                    DataLayer.remove('repeat', false); 
     442                    DataLayer.put('repeat', repeat); 
     443                    DataLayer.commit('repeat', false, function(data){ 
     444 
     445                        DataLayer.remove('schedulable', repeat.schedulable, false); 
     446                        DataLayer.put('schedulable', schedulable); 
     447 
     448                    }); 
     449                }else{ 
     450 
     451                    DataLayer.put( "schedulable:calendar", evt ); 
     452                    evt.editable = false; 
     453                    evt.className = "blocked-event"; 
     454                    calendar.fullCalendar( 'updateEvent', evt ); 
     455                } 
    452456                         
    453457                        }else 
     
    469473                                'onClose':  function(clicked) { 
    470474                                    if(clicked == 'Editar todas ocorrências') { 
    471                                         eventDetails( DataLayer.get( "schedulable", evt.id), true); 
     475 
     476                                        eventDetails(  getSchedulable(evt.id, ''), true); 
     477 
    472478                                    }else if (clicked == 'Editar essa ocorrência'){ 
    473479                                        /* 
     
    485491                            }); 
    486492                        }else{ 
    487                             var schedulable = DataLayer.get( "schedulable", evt.id); 
     493                            var schedulable = getSchedulable(evt.id, ''); 
    488494                            schedulable.calendar = evt.calendar; 
    489495                            eventDetails( schedulable, true); 
    490496                            } 
    491                         } 
    492                         break; 
    493                     case 2: 
    494                         var task = DataLayer.get( "schedulable", evt.id); 
    495                         task.group = evt.calendar; 
    496                         taskDetails( task, true); 
    497                         break; 
    498                     case 3: 
    499                         var activity = DataLayer.get( "schedulable", evt.id); 
    500                         activity.group = evt.calendar; 
    501                         activityDetails( activity, true); 
    502                         break; 
     497                    } 
     498                    break; 
     499                case 2: 
     500                    var task = getSchedulable(evt.id, ''); 
     501                    task.group = evt.calendar; 
     502                    taskDetails( task, true); 
     503                    break; 
     504                case 3: 
     505                    var activity = getSchedulable(evt.id, ''); 
     506                    activity.group = evt.calendar; 
     507                    activityDetails( activity, true); 
     508                    break; 
    503509            } 
    504510                }, 
     
    558564}); 
    559565 
     566function getSchedulable(id, codec){ 
     567 
     568    var schedule = DataLayer.get(('schedulable' + (codec != '' ? ':'+codec : '')), id, false ); 
     569 
     570    if(schedule == false) 
     571        DataLayer.get(('schedulable' + (codec != '' ? ':'+codec : '')), {filter: ['id', '=', id], criteria: {deepness: 2, findOne: 1, schedulable: id}} ); 
     572 
     573    return DataLayer.get(('schedulable' + (codec != '' ? ':'+codec : '')), id.toString()); 
     574} 
    560575 
    561576function useDesktopNotification(){ 
  • trunk/prototype/modules/calendar/js/load.js

    r7599 r7702  
    1313 
    1414            DataLayer.task( this.clookRefresh , function(){ 
    15                 Calendar.rerenderView(true); 
     15 
     16            DataLayer.remove('schedulable', false); 
     17            Calendar.rerenderView(true); 
    1618            }); 
    1719        } 
  • trunk/prototype/modules/calendar/templates/event_list.ejs

    r7022 r7702  
    66 
    77<div title="<%=data.tab_title%>" class="events-list events-list-win active"> 
    8          
    9          
    10                 <div class="events-list pagination">                     
     8 
     9 
     10                <div class="events-list pagination"> 
    1111                        <input name="results" type="hidden" value="<%=data.count%>"></input> 
    1212                        <input name="page_index" type="hidden" value="<%=data.page_index%>"></input> 
     
    3737                                                        <% } %> 
    3838                                                <% } else {  %> 
    39                                                                 <tr>  
     39                                                                <tr> 
    4040                                                                <% if (j>0) %> 
    4141                                                                        <!-- coluna 1 - evento unico na mesma data --> 
    4242                                                                        <th width='100' class="start-date"> 
    43                                                                                 <span><%= data.events_list[i].startDate %></span> <%  
     43                                                                                <span><%= data.events_list[i].startDate %></span> <% 
    4444                                                                } %> 
    4545                                                                        </th> 
     
    108108                                                </span>  
    109109                                                <div class="details-event-list hidden <%= (title_type == "Evento" ? "details-event" : "details-task")  %>"> 
    110                                                         <fieldset class="fields-details-event-list">                                                     
    111                                                                 <%if(_event.allDay){%> 
    112                                                                         <p class="input-group date-info"> 
    113                                                                                 <label>Duração:</label> 
    114                                                                                 <span class="">Dia inteiro</span> 
    115                                                                         </p> 
    116                                                                 <%}else{%> 
    117                                                                  
    118                                                                         <p class="input-group date-info"> 
    119                                                                                 <label>Início:</label> 
    120                                                                                 <span class=""><%= _event.startDate %> às </span> 
    121                                                                                 <span class=""><%= _event.startHour %></span>  
    122                                                                                  
    123                                                                         </p> 
    124                                                                         <p class="input-group"> 
    125                                                                                 <label>Término:</label> 
    126                                                                                 <span class=""><%= _event.endDate %> às </span> 
    127                                                                                 <span class=""><%= _event.endHour %></span> 
    128                                                                                 <span><%= _event.timeZone %></span> 
    129                                                                         </p> 
    130                                                                 <%}%> 
    131                                                                 <%if(_event.type == '1'){ 
    132                                                                         if(_event.repeat ){%> 
    133                                                                     <p class="input-group"> 
    134                                                                         <label>Repetição</label> 
    135                                                                         <span><%= _event.repeat %></span> 
    136                                                                     </p> 
    137                                                                 <%}}%> 
    138                                                                 <p class="input-group"> 
    139                                                                         <label>Lembretes:</label> 
    140                                                                         <% if(_event.alarms) {  
    141                                                                                         var string_alarm = ""; 
    142                                                                                         if(_event.type == '1') 
    143                                                                                                 string_alarm = 'do evento';  
    144                                                                                         if(_event.type == '2') 
    145                                                                                                 string_alarm = 'da tarefa'; 
    146                                                                                         if(_event.type == '3') 
    147                                                                                                 string_alarm = 'da atividade'; 
    148                                                                                         %> 
    149                                                                                 <span class="large" > 
    150                                                                                         <% for (var l=0; l < _event.alarms.length; l++) { %> 
    151                                                                                                 <span class="large" >Você será notificado por um <%=dateCalendar.alarmtype[_event.alarms[l].type]%> <%= _event.alarms[l].time %> <%= dateCalendar.timeunit[_event.alarms[l].unit]%><%=_event.alarms[l].time > 1 ? 's' : '' %> antes <%=string_alarm%></span> 
    152                                                                                         <% } %> 
    153                                                                                 </span> 
    154                                                                         <% } %> 
    155                                                                 </p> 
    156                                                                 <%if(_event.type == '1'){%> 
    157                                                                 <p class="input-group"> 
    158                                                                         <label>Local:</label> 
    159                                                                         <span><%= _event.location %></span> 
    160                                                                 </p> 
    161                                                                 <%}%> 
    162                                                                 <p class="input-group"> 
    163                                                                         <label>Descrição:</label> 
    164                                                                         <span class="large" ><%= _event.description %></span> 
    165                                                                 </p> 
    166                                                                 <%if(_event.type != '1'){%> 
    167                                                                 <p class="input-group"> 
    168                                                                         <label>Prioridade:</label> 
    169                                                                         <span><%= decoder['priority'][_event.priority] %></span> 
    170                                                                 </p> 
    171                                                                 <p class="input-group"> 
    172                                                                         <label>% Conlusão:</label> 
    173                                                                         <span><%= _event.percentage %>%</span> 
    174                                                                 </p> 
    175                                                                 <p class="input-group"> 
    176                                                                         <label>Status:</label> 
    177                                                                         <span><%= decoder['status'][_event.status] %></span> 
    178                                                                 </p> 
    179                                                                 <% } %> 
    180                                                                 <!-- <p class="input-group"> 
    181                                                                         <label>Privacidade</label> 
    182                                                                         <span><%= _event.privacy %></span> 
    183                                                                 </p> --> 
    184                                                                 <%if(_event.organizer && _event.organizer.user){%> 
    185                                                                 <p class="input-group"> 
    186                                                                         <label>Organizador:</label> 
    187                                                                         <span class="large"><%= _event.organizer.user ? _event.organizer.user.name : _event.organizer.name %>  (<%= _event.organizer.user ? _event.organizer.user.mail : _event.organizer.mail %>)</span> 
    188                                                                 </p> 
    189                                 <%}%> 
    190                                                                 <%if(_event.type != '3'){%> 
    191                                                                 <p class="input-group"> 
    192                                                                         <label>Participantes:</label> 
    193                                                                         <% if(_event.attendee) { %> 
    194                                                                                 <span class="large" > 
    195                                                                                         <% for (var m=0; m < _event.attendee.length; m++) { %> 
    196                                                                                                 <span class="large"><%=_event.attendee[m].name%>  (<%= _event.attendee[m].mail %>)</span> 
    197                                                                                         <%}%> 
    198                                                                                 </span> 
    199                                                                         <% } %> 
    200                                                                 </p> 
    201                                                                 <%} 
    202                                                                 if(_event.type == '3'){%> 
    203                                                                 <p class="input-group"> 
    204                                                                         <label>Tarefas</label> 
    205                                                                         <% if(_event.tasks) { %> 
    206                                                                                 <span class="large" > 
    207                                                                                         <% for (var m in _event.tasks) { %> 
    208                                                                                                 <span class="large"><%=_event.tasks[m].description%></span> 
    209                                                                                         <%}%> 
    210                                                                                 </span> 
    211                                                                         <% } %> 
    212                                                                 </p> 
    213                                                                 <%}%> 
    214                                                                  
    215                                                                 <p class="input-group"> 
    216                                                                         <label>Presença:</label> 
    217                                                                         <span> 
    218                                         <% var status_name; 
    219                                             if (_event.status == 1) 
    220                                                 status_name = "Eu vou"; 
    221                                             else if (_event.status == 2) 
    222                                                 status_name = "Talvez"; 
    223                                             else if (_event.status == 3) 
    224                                                 status_name = "Eu não vou"; 
    225                                         %> 
    226                                         <%= status_name %> 
    227                                     </span> <!-- Ta hardcodificado isso aqui? --> 
    228                                                                 </p> 
    229  
    230                                                         </fieldset> 
    231                                                         <div class="menu-container footer-container"> 
    232                                                                 <input name="eventid" type="hidden" value="<%=_event.id%>"></input> 
    233                                                                 <input name="eventtype" type="hidden" value="<%=_event.type%>"></input> 
    234                                 <input name="calendarid" type="hidden" value="<%=_event.calendar ? _event.calendar : _event.group%>"></input> 
    235                                                                 <a title="Imprimir" class="button print" href="#">Imprimir</a> 
    236                                                                 <a title="Excluir" class="button delete" href="#">Excluir</a> 
    237                                                                 <a title="Editar" class="button edit" href="#">Editar</a> 
    238                                                         </div> 
     110                            <div class="menu-container footer-container"> 
     111                                <input name="eventid" type="hidden" value="<%=_event.id%>"/> 
     112                                <input name="eventtype" type="hidden" value="<%=_event.type%>"/> 
     113                                <input name="calendarid" type="hidden" value="<%=_event.calendar ? _event.calendar : _event.group%>"/> 
     114                                <a title="Imprimir" class="button print" href="#">Imprimir</a> 
     115                                <a title="Excluir" class="button delete" href="#">Excluir</a> 
     116                                <a title="Editar" class="button edit" href="#">Editar</a> 
     117                            </div> 
    239118                                                </div> 
    240119         
  • trunk/prototype/services/iCal.php

    r7695 r7702  
    6464                            if (( isset($v['repeat']) ) && ( isset($v['repeat']['frequency']) && $v['repeat']['frequency'] && $v['repeat']['frequency'] != 'none' ))  
    6565                                    $vevent->setProperty('rrule', $this->formatIcalRepeat($v['repeat'])); 
    66                              
     66 
     67                $vevent->setProperty('dtstamp', array('timestamp' => ($v['dtstamp'] / 1000) )); 
    6768 
    6869                            if (isset($v['allDay']) && $v['allDay'] == 1) 
     
    200201                $eTime->setTimezone($apTimezoneOBJ); 
    201202 
     203                $vevent->setProperty('dtstamp', array('timestamp' => ($v['dtstamp'] / 1000) )); 
     204 
    202205                if (isset($v['allDay']) && $v['allDay'] == 1) { 
    203206                    $todo->setProperty('dtstart', $sTime->format(DATE_RFC822), array("VALUE" => "DATE")); 
     
    281284                            $vevent->setProperty('location', $v['location']); 
    282285                            $vevent->setProperty('tranp', (isset($v['tranparent']) && $v['tranparent'] == TRANSP_TRANSPARENT ) ? 'TRANSPARENT' : 'OPAQUE' ); 
     286 
     287                $vevent->setProperty('dtstamp', array('timestamp' => ($v['dtstamp'] / 1000) )); 
    283288 
    284289                            $timezone = new DateTimeZone('UTC'); 
     
    348353            $todo->setProperty('status', $this->_getStatusTodo($v['status'])); 
    349354 
     355            $vevent->setProperty('dtstamp', array('timestamp' => ($v['dtstamp'] / 1000) )); 
     356 
    350357            $timezone = new DateTimeZone('UTC'); 
    351358            $apTimezone = self::nomalizeTZID(( isset($v['timezone']) && $v['timezone'] != 'null' ) ? $v['timezone'] : $params['defaultTZI']); 
     
    543550                case 'VEVENT': 
    544551 
     552 
    545553                    switch ($method) { 
    546554                        case 'PUBLISH': 
     
    610618                            //Verifica a importação de eventos em que não participo 
    611619                            if ($pID) { 
     620 
    612621                                $interation['participant://' . $pID]['status'] = $params['status']; 
     622 
    613623                            } 
    614624                        } 
     
    848858                            break; 
    849859                    } 
    850          
    851                      
     860 
    852861                    $return[] = $interation; 
    853862                    break; 
     
    15621571        $objTimezone = new DateTimeZone($schedulable['timezone']); 
    15631572 
    1564         if (isset($startTime['params']['VALUE']) && $startTime['params']['VALUE'] === 'DATE' && isset($params['calendar_timezone'])) { 
     1573        if (isset($startTime['params']['VALUE']) && $startTime['params']['VALUE'] === 'DATE' ) { 
    15651574            $schedulable['allDay'] = 1; 
    15661575            $schedulable['startTime'] = self::date2timestamp($startTime['value']) - self::_getTzOffset('UTC', $schedulable['timezone'], '@' . self::date2timestamp($startTime['value'])) . '000'; 
     
    16671676            $intUser = Controller::find(array('concept' => 'user'), array('id', 'isExternal'), array('filter' => array('OR', array('=', 'mail', $mailUser), array('=', 'mailAlternateAddress', $mailUser)))); 
    16681677 
    1669             $user = null; 
     1678            $user = null; 
    16701679            if ($intUser && count($intUser) > 0) { 
    16711680                $participant['isExternal'] = isset($intUser[0]['isExternal']) ? $intUser[0]['isExternal'] : 0; 
     
    16891698 
    16901699        if ($property = $component->getProperty('organizer', FALSE, TRUE)) { 
    1691             $participant = array(); 
     1700 
    16921701            $mailUser = trim(str_replace('MAILTO:', '', $property['value'])); 
    16931702 
    1694             $participantID = mt_rand() . '2(Formatter)'; 
    1695  
    1696             $participant['schedulable'] = $eventID; 
    1697             $participant['status'] = (isset($property['params']['PARTSTAT']) && constant('STATUS_' . $property['params']['PARTSTAT']) !== null ) ? constant('STATUS_' . $property['params']['PARTSTAT']) : STATUS_UNANSWERED; 
    1698             $participant['isOrganizer'] = '1'; 
    1699             $participant['acl'] = 'rowi'; 
     1703 
     1704            if($participant = self::_getParticipantByMail($mailUser, $schedulable['participants'], true)){ 
     1705 
     1706                $participantID = $participant['id']; 
     1707 
     1708            }else{ 
     1709 
     1710                $participant = array(); 
     1711 
     1712                $participantID = mt_rand() . '2(Formatter)'; 
     1713                $participant['schedulable'] = $eventID; 
     1714                $participant['status'] = (isset($property['params']['PARTSTAT']) && constant('STATUS_' . $property['params']['PARTSTAT']) !== null ) ? constant('STATUS_' . $property['params']['PARTSTAT']) : STATUS_UNANSWERED; 
     1715                $participant['isOrganizer'] = '1'; 
     1716                $participant['acl'] = 'rowi'; 
     1717            } 
    17001718 
    17011719            /* Verifica se este usuario é um usuario interno do ldap */ 
    17021720            $intUser = Controller::find(array('concept' => 'user'), array('id', 'isExternal'), array('filter' => array('OR', array('=', 'mail', $mailUser), array('=', 'mailAlternateAddress', $mailUser)))); 
    1703  
    17041721            $user = null; 
    17051722            if ($intUser && count($intUser) > 0) { 
    1706                 $participant['isExternal'] = isset($intUser[0]['isExternal']) ? $intUser[0]['isExternal'] : 0; 
    1707                 $participant['user'] = $intUser[0]['id']; 
     1723                $participant['isExternal'] = isset($intUser[0]['isExternal']) ? $intUser[0]['isExternal'] : 0; 
     1724                $participant['user'] = $intUser[0]['id']; 
    17081725            } else { 
    1709                 $participant['isExternal'] = 1; 
    1710                 /* Gera um randon id para o contexto formater */ 
    1711                 $userID = mt_rand() . '4(Formatter)'; 
    1712  
    1713                 $user['mail'] = $mailUser; 
    1714                 $user['name'] = ( isset($property['params']['CN']) ) ? $property['params']['CN'] : ''; 
    1715                 $user['participants'] = array($participantID); 
    1716                 $user['isExternal'] = '1'; 
    1717                 $participant['user'] = $userID; 
    1718                 $interation['user://' . $userID] = $user; 
     1726                $participant['isExternal'] = 1; 
     1727                /* Gera um randon id para o contexto formater */ 
     1728                $userID = mt_rand() . '4(Formatter)'; 
     1729 
     1730                $user['mail'] = $mailUser; 
     1731                $user['name'] = ( isset($property['params']['CN']) ) ? $property['params']['CN'] : ''; 
     1732                $user['participants'] = array($participantID); 
     1733                $user['isExternal'] = '1'; 
     1734                $participant['user'] = $userID; 
     1735                $interation['user://' . $userID] = $user; 
    17191736            } 
    17201737 
     
    18281845        $interation['schedulable://' . $eventID] = $schedulable; 
    18291846 
    1830         return $interation; 
     1847        return $interation; 
    18311848    } 
    18321849     
     
    19561973            $mailUser = trim(str_replace('MAILTO:', '', $property['value'])); 
    19571974 
    1958             $participantID = mt_rand() . '2(Formatter)'; 
    1959  
    1960             $participant['schedulable'] = $todoID; 
    1961             $participant['status'] = (isset($property['params']['PARTSTAT']) && constant('STATUS_' . $property['params']['PARTSTAT']) !== null ) ? constant('STATUS_' . $property['params']['PARTSTAT']) : STATUS_UNANSWERED; 
    1962             $participant['isOrganizer'] = '1'; 
    1963             $participant['acl'] = 'rowi'; 
     1975        if($participant = self::_getParticipantByMail($mailUser, $schedulable['participants'], true)){ 
     1976 
     1977            $participantID = $participant['id']; 
     1978 
     1979        }else{ 
     1980 
     1981            $participant = array(); 
     1982 
     1983            $participantID = mt_rand() . '2(Formatter)'; 
     1984            $participant['schedulable'] = $todoID; 
     1985            $participant['status'] = (isset($property['params']['PARTSTAT']) && constant('STATUS_' . $property['params']['PARTSTAT']) !== null ) ? constant('STATUS_' . $property['params']['PARTSTAT']) : STATUS_UNANSWERED; 
     1986            $participant['isOrganizer'] = '1'; 
     1987            $participant['acl'] = 'rowi'; 
     1988        } 
    19641989 
    19651990            /* Verifica se este usuario é um usuario interno do ldap */ 
Note: See TracChangeset for help on using the changeset viewer.