source: trunk/prototype/modules/calendar/js/init.js @ 8139

Revision 8139, 21.5 KB checked in by angelo, 11 years ago (diff)

Ticket #3442 - Icone de warning aparecendo indevidamente em tarefas do full calendar

  • Property svn:executable set to *
Line 
1$(document).ready(function() {
2        $("#wrap").css("visibility","visible");
3        //Remove o icone de configuraçõe padrão antigo do expresso
4        $('#sideboxdragarea').addClass('hidden');
5
6        refresh_calendars();
7        $tabs = $('#tabs').tabs({
8            add: function( event, ui ) {
9                        Calendar.lastView = $tabs.tabs('option' ,'selected');
10                        $('#tabs .events-list-win.active').removeClass('active');
11                        $tabs.tabs('select', '#' + ui.panel.id);
12                },
13                remove: function( event, ui ) {
14                        $tabs.tabs('select', Calendar.lastView);
15                },
16                show: function( event, ui ){
17
18            if( $('#tabs').tabs('option' ,'selected') == 0){
19                delete Calendar.currentViewKey;
20                $('#calendar').fullCalendar('refetchEvents');
21            }
22                }
23        })
24        .tabs('option', 'tabTemplate', "<li><a href='#{href}'>#{label}</a><span class='ui-icon ui-icon-close'>Remove Tab</span></li>" );
25
26        /**
27          * Make a button to close the tab
28          */
29        $tabs.find( "span.ui-icon-close" ).live( "click", function() {
30                var index = $( "li", $tabs ).index( $( this ).parent() );
31                if($tabs.tabs('option' ,'selected') == index){
32                        if($tabs.tabs("length") == 2 && Calendar.lastView != 1)
33                                $tabs.tabs( "select", 0);
34                        $tabs.tabs( "select", Calendar.lastView);
35                }
36                if($tabs.tabs('option' ,'selected') == 0 || $tabs.tabs('option' ,'selected') == 1)
37                        Calendar.lastView = $tabs.tabs('option' ,'selected');
38                if(index != -1)
39                  $tabs.tabs( "remove", index );       
40                       
41               
42                });     
43        $('.button.config-menu').button({
44            icons: {
45                primary: "ui-icon-gear",
46                secondary: "ui-icon-triangle-1-s"
47            },
48            text: false
49        });
50      $('.button.add').button({
51              icons: {
52                      secondary: "ui-icon-plus"
53              }
54      })
55
56                var miniCalendar = $('.block-vertical-toolbox .mini-calendar').datepicker({
57                        dateFormat: 'yy-m-d',
58                        //dateFormat: 'DD, d MM, yy',
59                        //inline: true,
60                        firstDay: dateCalendar.dayOfWeek[User.preferences.weekStart],
61                        onSelect: function(dateText, inst)
62                        {       
63                                $tabs.tabs("select", "#calendar");
64                                var toDate = $('.block-vertical-toolbox .mini-calendar').datepicker("getDate").toString('yyyy-MM-dd').split('-');
65                                $('#calendar').fullCalendar('gotoDate', toDate[0], parseInt(toDate[1]-1), toDate[2] );
66                                $('#calendar').fullCalendar( 'changeView', 'agendaDay' );
67                        }                       
68                })
69                .find('.ui-icon-circle-triangle-e').removeClass('ui-icon-circle-triangle-e').addClass('ui-icon-triangle-1-e').end()
70                .find('.ui-icon-circle-triangle-w').removeClass('ui-icon-circle-triangle-w').addClass('ui-icon-triangle-1-w');
71               
72                //Onclick do mês
73                $('.ui-datepicker-title .ui-datepicker-month').live('click',function(){
74                        $tabs.tabs("select", "#calendar");
75                        $('#calendar').fullCalendar('gotoDate',$(this).siblings('span').html(), Date.getMonthNumberFromName($(this).html() == 'Março' ? 'Mar' : $(this).html()),'01');
76                        $('#calendar').fullCalendar( 'changeView', 'month');
77                });
78                //Onclick do ano
79                $('.ui-datepicker-title .ui-datepicker-year').live('click',function(){
80                        $tabs.tabs("select", "#calendar");
81                        $('#calendar').fullCalendar('gotoDate',$(this).html(), '0', '01');
82                        $('.fc-button-year').click();
83                });
84               
85        //Onclick em um dia do calendário anual
86        $( ".fc-day-number" ).live( "click", function() {
87                       
88                var date = $(this).parents('[class*="fc-day-"]').attr('class').match(/fc-day-(\d{4})-(\d{2})-(\d{2})/);
89
90                if (date) date.shift();
91                else return false;
92
93                $('#calendar').fullCalendar('gotoDate',date[0],date[1]-1,date[2]);
94                $('#calendar').fullCalendar( 'changeView', 'agendaDay' );
95        });     
96
97        $('.main-search input.search').keydown(function(event){
98                if(event.keyCode == 13) {
99                        Encoder.EncodeType = "entity";
100                        //$(this).val($(this).val());
101                                       
102                        add_events_list($(this).val());
103                        $(this).val('');
104                }
105        });
106       
107        //efetua pesquisas pelo click na lupa de pesquisa
108        $('.main-search span.ui-icon-search').click(function(event){
109                        add_events_list($(this).parent().find('input.search').val());
110                        $(this).parent().find('input.search').val();
111        });
112       
113        $('.block-horizontal-toolbox .main-config-menu').menu({
114                content: $('.main-config-menu-content').html(),
115                positionOpts: {
116                        posX: 'left',
117                        posY: 'bottom',
118                        offsetX: -140,
119                        offsetY: 0,
120                        directionH: 'right',
121                        directionV: 'down',
122                        detectH: true, // do horizontal collision detection 
123                        detectV: true, // do vertical collision detection
124                        linkToFront: false
125                },
126                flyOut: true,
127                showSpeed: 100,
128                crumbDefaultText: '>'
129        });
130             
131                $('#trash').droppable({
132                        drop: function(event, ui){
133                                //              calendar.fullCalendar( 'removeEvents', ui.draggable.attr('event-id') );
134                                DataLayer.remove( "event", ui.draggable.attr('event-id') );
135                                $(this).switchClass('empty','full');
136                        },
137                        tolerance: "touch"
138                });
139
140      /* initialize the calendar
141      -----------------------------------------------------------------*/
142                $(".button.add.add-event").click(function(event){
143                        var startEvent = new Date();
144                        var configData = (startEvent.toString('mm') < 30)  ? {minutes: (30 - parseInt(startEvent.toString('mm')))} : {hours: 1, minutes: '-'+startEvent.toString('mm')};
145                        startEvent.add(configData);
146
147                        eventDetails({
148                                startTime: startEvent.getTime(),
149                                endTime: dateCalendar.decodeRange(startEvent, (!!User.preferences.defaultCalendar ? (   !!Calendar.signatureOf[User.preferences.defaultCalendar].calendar.defaultDuration ? 
150                                                (Calendar.signatureOf[User.preferences.defaultCalendar].calendar.defaultDuration) : (User.preferences.defaultDuration)) : (User.preferences.defaultDuration)))
151                        }, true, undefined, undefined, undefined, true );
152                });
153               
154                var currentToolTip = null;
155                $('#divAppbox').on('scroll',function(){
156                        if ($(".new-task").length)                     
157                                currentToolTip.qtip('destroy');
158                });
159               
160                /* Quick add task
161        -----------------------------------------------------------------*/
162                $(".button.add.add-task").click(function(event){
163                        currentToolTip = $(this);
164                        var componente = $(this);
165                       
166            if(!$('div.qtip.qtip-blue.new-task').length){
167
168                $('div.qtip.qtip-blue').remove();
169
170                        $(componente).qtip({
171                            show: {
172                                ready: true,
173                                solo: true,
174                                when: {
175                                        event: 'click'
176                                }
177                                },
178                                hide: false,
179                                content: {
180                                        text: $('<div></div>').html( DataLayer.render( 'templates/task_quick_add.ejs', {"componente" : componente} ) ),
181                                        title: {
182                                                text:'Nova Tarefa',
183                                                button: '<a class="button close" href="#">close</a>'
184                                        }
185                                },
186                                style: {
187                                        name: 'blue',
188                                tip: {
189                                                corner: 'leftMiddle'
190                                        },
191                                border: {
192                                            width: 4,
193                                            radius: 8
194                                        },
195                                width: {
196                                                min: 225,
197                                            max:225
198                                        }
199                                },
200                        position: {
201                                corner: {
202                                            target: 'rightMiddle',
203                                            tooltip: 'leftMiddle'
204                                },
205                                adjust: {
206                                            x:0,
207                                            y:0
208                                }
209                        }
210                    })
211                .qtip("api").onShow = function(arg0) {
212
213                        /*------------------------------------------------------------------------*/
214                        /*               Seta os valores padrões nos inputs do qtip               */
215                         $('div.qtip div.add-simple-task input.task').Watermark("Tarefa sem título");
216                             $('div.qtip div.add-simple-task textarea').Watermark("Descrição");
217                        /*------------------------------------------------------------------------*/
218
219                            $('.qtip-active .button.close').button({
220                                icons: {
221                                    primary: "ui-icon-close"
222                                },
223                                text: false
224                            })
225                            .click(function(){
226                                        $(componente).qtip('destroy');
227                            });
228                                                       
229                            $('.qtip-active .button.save').button().click(function(){
230                               
231                                var title = $('div.qtip div.add-simple-task input.task').val();
232                                        var description = $('div.qtip div.add-simple-task textarea').val();
233
234                                        var calendar, timezone = '';
235
236                                        for (var i = 0; i < Calendar.signatures.length; i++){
237                                                if(Calendar.signatures[i].type == 1 && Calendar.signatures[i].calendar.type == 1){
238                                                        calendar = Calendar.signatures[i].calendar.id;
239                                                        timezone = Calendar.signatures[i].calendar.timezone;
240                                                        break;
241                                                }
242                                        }
243
244                                DataLayer.put('schedulable',
245                                {
246                                        summary: title,
247                                        description: description,
248                                        type: '2',
249                                        calendar: calendar,
250                                        timezone: timezone,
251                                        'class':'1',
252                                                        status: '1',
253                                        startTime: new Date().toString('yyyy-MM-dd 00:00:00'),
254                                        endTime: new Date().toString('yyyy-MM-dd 00:00:00'),
255                                        allDay: '1',
256                            priority: '1',
257                                        participants:
258                                        [{ 
259                                            user: User.me.id,
260                                            isOrganizer: 1,
261                                            acl: 'row'
262                                        }]
263                                });
264                               
265                        $(componente).qtip('destroy');
266
267                    });
268
269                            $('.qtip-active .button.advanced').button().click(function(){
270
271                                var startEvent = new Date();
272                                        var configData = (startEvent.toString('mm') < 30)  ? {minutes: (30 - parseInt(startEvent.toString('mm')))} : {hours: 1, minutes: '-'+startEvent.toString('mm')};
273                                        startEvent.add(configData);
274                       
275                                                var componente = $(this);
276                        var description = $('div.qtip div.add-simple-task textarea[name="description"]').val();
277
278                                        taskDetails({
279                            summary: $('div.qtip div.add-simple-task input[name="summary"]').val(),
280                            description: description == 'Descrição' ? '' : description,
281                                                startTime: startEvent.getTime(),
282                                                endTime: dateCalendar.decodeRange(startEvent, (!!User.preferences.defaultCalendar ? (   !!Calendar.signatureOf[User.preferences.defaultCalendar].calendar.defaultDuration ? 
283                                                        (Calendar.signatureOf[User.preferences.defaultCalendar].calendar.defaultDuration) : (User.preferences.defaultDuration)) : (User.preferences.defaultDuration)))
284                                        }, true );
285
286                        $(componente).qtip('destroy');
287                            });
288                                                               
289                                $('.qtip-active .button.cancel').button().click(function(){
290                                        $(componente).qtip('destroy');
291                            });
292                                                       
293                            $('.qtip-active .button').button();
294                       
295                        $('div.qtip.qtip-blue.qtip-active').addClass('new-task');
296            }
297        }
298                });
299
300        $(".button.add.add-activity").click(function(event){
301                        var startEvent = new Date();
302                        var configData = (startEvent.toString('mm') < 30)  ? {minutes: (30 - parseInt(startEvent.toString('mm')))} : {hours: 1, minutes: '-'+startEvent.toString('mm')};
303                        startEvent.add(configData);
304                       
305                        activityDetails({
306                                startTime: startEvent.getTime(),
307                                endTime: dateCalendar.decodeRange(startEvent, (!!User.preferences.defaultCalendar ? (   !!Calendar.signatureOf[User.preferences.defaultCalendar].calendar.defaultDuration ? 
308                                                (Calendar.signatureOf[User.preferences.defaultCalendar].calendar.defaultDuration) : (User.preferences.defaultDuration)) : (User.preferences.defaultDuration)))
309                        }, true );
310
311        });
312
313        var calendar = $('#calendar').fullCalendar(DataLayer.merge({
314
315                defaultView: User.preferences.defaultCalView,
316                timeFormat: User.preferences.hourFormat,
317                axisFormat: User.preferences.hourFormat,
318                eventSources: Calendar.sources,
319               
320                header: {
321                        left: 'prev,next today,agendaWeek,' + ((User.preferences.defaultCalView == "basicDay") ? "basicDay" : "agendaDay"),
322                        center: 'title',
323                        right:  ((User.preferences.defaultCalView == "basicDay") ? "basicDay" : "agendaDay") +',agendaWeek,month,year'
324                },
325                firstHour: dateCalendar.getShortestTime(User.preferences.defaultStartHour ? User.preferences.defaultStartHour : '6'),
326                firstDay: dateCalendar.dayOfWeek[User.preferences.weekStart],
327                editable: true,
328                selectable: true,
329                selectHelper: true,
330                droppable: true, // this allows things to be dropped onto the calendar !!!
331                timeFormat: {
332                        agenda: 'HH:mm{ - HH:mm}',
333                        '': 'HH:mm{ - HH:mm} }'
334                },
335                titleFormat: {
336                        month: 'MMMM yyyy',                             
337                        week: "dd[ yyyy] { 'a'[ MMM] dd 'de' MMMM '-' yyyy}",
338                        day: 'dddd,  dd MMM , yyyy'
339                },
340                columnFormat:{
341                        month: 'ddd',   
342                        week: 'ddd dd/MM',
343                        day: 'dddd dd/MM' 
344                },
345               
346                allDayText: 'Dia todo',
347                buttonText: {
348                        today: 'hoje',
349                        month: 'mês',
350                        week: 'semana',
351                        day: 'dia',
352                        year: 'ano'
353                },
354
355        eventRender: function( event, element, view ){
356                    $('#calendar td.fc-year-have-event').removeClass('fc-year-have-event');
357
358                        var img_icon = "";
359                        var status_ball = ""; //nome da imagem a ser inserida
360                        var status_img = "";
361
362            if( !!parseInt(event.unanswered) && event.type == 1 ){
363
364                img_icon = "mini-attention.png";
365
366            }else{
367
368                if(event.type == 1)
369                    img_icon = "mini-event.png";
370                if(event.type == 2)
371                    img_icon = "mini-task.png";
372                if(event.type == 3)
373                    img_icon = "mini-activity.png";
374
375                //se for diferente de evento(type 1).
376                if(event.type != 1){
377                    if(event.status == "1"){
378                        status_ball = "gray.png";
379                    }else if(event.status == "2"){
380                        status_ball = "yellow.png";
381                    }else if(event.status == "3"){
382                        status_ball = "green.png";
383                    }else if(event.status == "4"){
384                        status_ball = "red.png";
385                    }
386
387                    status_img = '<img style="width: 8px; height: 8px; margin-bottom: 2px;" src="../prototype/modules/calendar/img/' + status_ball + '"></img>';
388                }
389
390            }
391
392
393                        //html que exibe a imagem do type e do status
394            element.find(".fc-event-inner.fc-event-skin").prepend($('<img style="width: 11px; height: 13px;" class="" src="../prototype/modules/calendar/img/' + img_icon + '"></img>' + status_img));
395                },
396
397                select: function( start, end, allDay, event, view ){
398                        if (view.name == "month") {
399                                if (User.preferences.defaultStartHour) {
400                                  _start = User.preferences.defaultStartHour;
401                                 
402                                  if (_start.length > 4)
403                                _start = _start.trim().substring(0,5); // remove o am/pm
404                             
405                              _start = _start.split(":");
406                              start.setHours(_start[0]);
407                              start.setMinutes(_start[1]);
408                            }
409                                 
410                                if (User.preferences.defaultEndHour) {
411                                  _end = User.preferences.defaultEndHour;
412                                  if (_end.length > 4)
413                                _end = _end.trim().substring(0,5); // remove o am/pm
414                                                     
415                              _end = _end.split(":");                     
416                              end.setHours(_end[0]);                       
417                              end.setMinutes(_end[1]);
418                                }                   
419                        } // END if (view.name == "month")
420                       
421                        eventDetails( { 'start': start,
422                                        'end': end,
423                                        'allDay': allDay } );
424                },
425
426                eventDrop: function( evt, event, view  ){
427                        evt.id = evt.id.split('-')[0];
428            if(!evt.disableDragging){
429                           
430                if(evt.isRepeat){
431                    var schedulable = copyAndMoveTo(evt.calendar , evt.id , false, "3", evt);
432                                 
433                    var repeat = mount_exception(evt.id, evt.occurrence);
434                    DataLayer.remove('repeat', false);
435                    DataLayer.put('repeat', repeat);
436                    DataLayer.commit('repeat', false, function(data){
437                                   
438                        DataLayer.remove('schedulable', repeat.schedulable, false);
439                        DataLayer.put('schedulable', schedulable);
440                                     
441                     });
442
443                }else{
444                    DataLayer.put( "schedulable:calendar", evt );
445
446                                    event.editable = false;
447                                    event.className = "blocked-event";
448                                    calendar.fullCalendar( 'updateEvent', evt );
449                }
450                             
451                        }else
452                Calendar.rerenderView(true);
453                },
454
455                eventResize: function( evt, event, view ){
456            evt.id = evt.id.split('-')[0];
457                        if(!evt.disableDragging){
458                if(evt.isRepeat){
459                    var schedulable = copyAndMoveTo(evt.calendar , evt.id , false, "3", evt);
460
461                    //Normaliza a data para o backend
462                    schedulable.startTime = new Date(parseInt(schedulable.startTime)).toString('yyyy-MM-dd hh:mm:00');
463                    schedulable.endTime = new Date(parseInt(schedulable.endTime)).toString('yyyy-MM-dd hh:mm:00');
464
465                    var repeat = mount_exception(evt.id, evt.occurrence);
466
467                    DataLayer.remove('repeat', false);
468                    DataLayer.put('repeat', repeat);
469                    DataLayer.commit('repeat', false, function(data){
470
471                        DataLayer.remove('schedulable', repeat.schedulable, false);
472                        DataLayer.put('schedulable', schedulable);
473
474                    });
475                }else{
476
477                    DataLayer.put( "schedulable:calendar", evt );
478                    evt.editable = false;
479                    evt.className = "blocked-event";
480                    calendar.fullCalendar( 'updateEvent', evt );
481                }
482                       
483                        }else
484                                Calendar.rerenderView(true);
485                },
486
487                eventClick: function( evt, event, view ){
488                        evt.id = evt.id.split('-')[0];
489           
490            switch (parseInt(evt.type)){
491                case 1:
492                    if(evt.selectable){
493                        if(evt.isRepeat && evt.editable ){
494                            $.Zebra_Dialog(evt.title + ' é um evento com repetição.', {
495                                'type':     'question',
496                                'overlay_opacity': '0.5',
497                                'custom_class':  'occurrence-zebra',
498                                'width': 427,
499                                'buttons':  ['Editar todas ocorrências', 'Editar essa ocorrência', 'Cancelar'],
500                                'onClose':  function(clicked) {
501                                    if(clicked == 'Editar todas ocorrências') {
502                                        var schedule = getSchedulable(evt.id, '');
503                                        schedule.calendar = evt.calendar;
504                                        eventDetails( schedule , true);
505
506                                    }else if (clicked == 'Editar essa ocorrência'){
507                                        /*
508                                        * TODO - repeat foi adicionado pois melhorias devem ser feitas no rollback do
509                                        *DataLayer, repeat somente é usado quando se trata da criação de um evento
510                                        *pela edição de uma ocorrência.
511                                        */     
512                                        var repeat = mount_exception(evt.id, evt.occurrence);
513
514                                        $('.calendar-copy-move input[name="typeEvent"]').val("3");
515                                       
516                                        eventDetails(copyAndMoveTo(evt.calendar , evt.id , false, "3", evt), true, '', false, repeat);
517                                    }       
518                                }
519                            });
520                        }else{
521                            var schedulable = getSchedulable(evt.id, '');
522                            schedulable.calendar = evt.calendar;
523                            eventDetails( schedulable, true);
524                            }
525                    }
526                    break;
527                case 2:
528                    var task = getSchedulable(evt.id, '');
529                    task.group = evt.calendar;
530                    taskDetails( task, true);
531                    break;
532                case 3:
533                                        DataLayer.remove('taskToActivity', false);//Limpa o cache
534                    var activity = getSchedulable(evt.id, '');
535                    activity.group = evt.calendar;
536                    activityDetails( activity, true);
537                    break;
538            }
539                },
540               
541                eventAfterRender: function(event, element, view){
542
543                        contentMenu();
544
545                }
546        }, dateCalendar));     
547
548        $('#calendar .fc-header-left .fc-button-agendaWeek, #calendar .fc-header-left .fc-button-agendaDay').click(function(){
549                $(this).parent().find(".fc-button-today").click();
550        });
551               
552        contentMenu();
553         
554         $('body').click(function(){
555                $('#context-menu-event').html('');
556         });
557
558
559    if( $.browser.msie ){
560
561        $('body').css('overflow-y','hidden');
562
563
564    }else{
565
566        if($(window).height() < $('body').height()){
567            var hei = $('body').height() - $(window).height();
568            hei = $('#divAppbox').height() - hei;
569            $('#divAppbox').css('max-height', hei);
570            $('#divAppbox').css('min-height', hei);
571            $('body').css('overflow-y','hidden');
572            delete hei;
573        }
574
575        $(window).resize(function(){
576            $('#divAppbox').css('max-height', $(window).height() - 104);
577            $('#divAppbox').css('min-height', $(window).height() - 104);
578            $('#divAppbox').css('overflow-x', 'auto');
579            $('#divAppbox').css('overflow-y', 'scroll');
580        });
581    }
582         
583
584
585    if( $.browser.msie ){
586        //$('#divAppbox').css('width', $(window).width());
587        $('#divAppbox').css({'height':'600px','max-width':'100%'});
588    }
589
590
591        //Todo chamada do metodo que adiciona ao full calendar o botao de listagem de eventos 
592        printEvents();
593});
594
595function getSchedulable(id, codec){
596
597    var schedule = DataLayer.get(('schedulable' + (codec != '' ? ':'+codec : '')), id, false );
598
599    if(schedule == false)
600        DataLayer.get(('schedulable' + (codec != '' ? ':'+codec : '')), {filter: ['id', '=', id], criteria: {deepness: 2, findOne: 1, schedulable: id}} );
601
602    return DataLayer.get(('schedulable' + (codec != '' ? ':'+codec : '')), id.toString());
603}
604
605function useDesktopNotification(){
606
607        return !!parseInt(User.preferences.useDesktopNotification);
608
609}
Note: See TracBrowser for help on using the repository browser.