source: sandbox/2.4.2-expresso1/prototype/modules/calendar/js/task.helpers.js @ 6974

Revision 6974, 34.3 KB checked in by acoutinho, 12 years ago (diff)

Ticket #2966 - Correcoes de bugs e melhorias / suporte a historico em atividades

  • Property svn:executable set to *
Line 
1function validDateTask(){
2       
3        var errors = {
4                'emptyInitData': 'Por favor, informe uma data inicial',
5                'emptyEndData': 'Por favor, informe uma data final',
6                'emptyInitHour': 'Por favor, informe uma hora inicial',
7                'emptyEndHour': 'Por favor, informe uma hora final',
8               
9                'invalidInitData' : 'Data inicial inválida',
10                'invalidEndData' : 'Data final inválida',
11               
12                'equalData' : 'Hora inicial igual a final',
13                'theirData' : 'Data final menor que a inicial',         
14                'theirHour' : 'Hora final menor que a inicial',
15               
16                'dueInitDate' : 'Previsão de término menor que a data inicial',
17                'dueEndDate'  : 'Previsão de término menor que a data final',
18                'dueTime'         : 'Deve ser definido a hora da Previsão de Término',
19                'dueDate'         : 'Deve ser definido a Previsão de Término',
20                'invalidDueData' : 'Data de Previsão de Término inválida'
21        };
22
23    var start_date = $(".new-task-win.active .start-date").val();
24    var end_date   = $(".new-task-win.active .end-date").val();
25    var start_time = $(".new-task-win.active .start-time").val();
26    var end_time   = $(".new-task-win.active .end-time").val();
27        var due_date   = $(".new-task-win.active .date-previsao").val();
28        var due_time   =  $.trim($(".new-task-win.active .time-previsao").val());
29    var isAllDay   = $('.new-task-win.active input[name="allDay"]').is(':checked');
30    var customDate = $(".endRepeat").val() == "customDate";
31    var occurrences = $(".endRepeat").val() == "occurrences";
32    var taskInterval = $('.taskInterval').val();
33   
34    if(start_date == "")
35                return errors['emptyInitData'];
36    else if(end_date == "")
37                return errors['emptyEndData'];
38    else if(!isAllDay && start_time == "")
39                return errors['emptyInitHour'];
40    else if(!isAllDay && end_time == "")
41                return errors['emptyEndHour'];
42        else if(due_date != "" && due_time == "")
43                return errors['dueTime'];
44        else if(due_date == "" && due_time != "")
45                return errors['dueDate'];
46       
47    var formatString = User.preferences.dateFormat + " " + User.preferences.hourFormat;
48               
49    var startDate = Date.parseExact( start_date + " " + $.trim(start_time) , formatString );
50    var endDate = Date.parseExact( end_date + " " + $.trim(end_time) , formatString );
51        var dueDate = Date.parseExact( due_date + " " + $.trim(due_time) , formatString );
52
53    if(startDate == null || startDate.getTime() < 0 )
54                return errors['invalidInitData'];
55    if(endDate == null || endDate.getTime() < 0)
56                return errors['invalidEndData'];
57        if(dueDate == null &&  due_time != "")
58                return errors['invalidDueData'];
59               
60        if(isAllDay){
61                startDate.clearTime();
62                endDate.clearTime();
63                if(endDate.compareTo(startDate) == -1)
64                        return errors['theirData'];
65        }else{
66                var condition = endDate.compareTo(startDate);
67                if(condition != 1){
68                        if(condition < 0){
69                                startDate.clearTime();
70                                endDate.clearTime();
71                                condition = endDate.compareTo(startDate);                               
72                                return (errors[ condition == 0 ? 'theirHour' : 'theirData'] );
73                        }
74                        else
75                                return errors['equalData'];
76                }
77               
78                if (dueDate != null && dueDate.compareTo(startDate) == -1)
79                        return errors['dueInitDate'];           
80        }
81   
82    if (customDate)   
83                if ( !($('.new-task-win.active .customDateEnd').val().length) )
84                   return errors['emptyEndData'];
85
86    return false;
87}
88
89function todoStatus(view, status){
90        if (status == "1"){
91                UI.dialogs[view].find('.subitem .span_done').removeClass('finished noAction inProcess canceled').addClass('noAction');
92        }else if (status == "2"){
93                UI.dialogs[view].find('.subitem .span_done').removeClass('finished noAction inProcess canceled').addClass('inProcess');
94        }else if (status == "3"){
95                UI.dialogs[view].find('.subitem .span_done').removeClass('finished noAction inProcess canceled').addClass('finished');
96        }else if (status == "4"){
97                UI.dialogs[view].find('.subitem .span_done').removeClass('finished noAction inProcess canceled').addClass('canceled');
98        }
99}
100
101function taskDetails(objTask, decoded, path, isMail, repeat) {
102
103    $('.qtip.qtip-blue').remove();
104
105    attendees = {};
106
107    if (path == undefined) path = "";
108
109    if (!decoded) objTask = DataLayer.decode("task:calendar", objTask);
110
111    if (!isMail) objTask = DataLayer.encode("schedulable:task", objTask);
112
113    if (typeof (objTask.id) == 'undefined') {
114        objTask.alarms = Calendar.signatureOf[User.preferences.defaultCalendar || Calendar.calendarIds[0]].defaultAlarms || false;
115        objTask.useAlarmDefault = 1;
116    }
117
118
119    if(objTask.me.id == User.me.id){
120        objTask.me.id = DataLayer.put('participant', {
121            user: objTask.me.id,
122            mail: objTask.me.mail
123        });
124        objTask.organizer.id = objTask.me.id;
125    }
126
127    var dependsDelegate = function(reference, inverse){
128        if(inverse){
129            if(reference.find('input[name="attendee[]"]').val() == blkAddAtendee.find('li.organizer input[name="attendee_organizer"]').val())
130                blkAddAtendee.find('li.organizer input[name="attendee_organizer"]').val(blkAddAtendee.find('.me input[name="attendee[]"]').val());
131        }else{
132            if(blkAddAtendee.find('.me input[name="attendee[]"]').val() == blkAddAtendee.find('li.organizer input[name="attendee_organizer"]').val())
133                blkAddAtendee.find('li.organizer input[name="attendee_organizer"]').val(reference.find('input[name="attendee[]"]').val());
134        }
135    };
136
137    var removeOthers = function(){
138        var other = blkAddAtendee.find('.delegate.attendee-permissions-change-button');
139        if(other.lenght)
140            dependsDelegate(other.parents('li'), true);
141
142        blkAddAtendee.find('.delegate').removeClass('attendee-permissions-change-button');
143        blkAddAtendee.find('.ui-icon-transferthick-e-w').removeClass('attendee-permissions-change');
144   
145    };
146
147    var callbackAttendee = function(){
148        var checked = false;
149        blkAddAtendee.find("li.not-attendee").addClass('hidden');
150       
151        blkAddAtendee.find("li .button").filter(".close.new").button({
152            icons: {
153            primary: "ui-icon-close"
154            },
155            text: false
156        }).click(function () {
157            DataLayer.remove('participant', $(this).parents('li').find('[type=checkbox]').val());
158            if($(this).parent().find('.button.delegate').hasClass('attendee-permissions-change-button')){
159                removeOthers();
160                blkAddAtendee.find('.request-update').addClass('hidden');
161                blkAddAtendee.find('.status option').toggleClass('hidden');
162                       
163                blkAddAtendee.find('option[value=1]').attr('selected','selected').trigger('change');
164            }
165               
166            $(this).parents('li').remove();
167               
168            if(blkAddAtendee.find(".attendee-list li").length == 1)
169                blkAddAtendee.find("li.not-attendee").removeClass('hidden');
170        })
171        .addClass('tiny disable ui-button-disabled ui-state-disabled')
172        .removeClass('new').end()
173       
174        .filter(".delegate.new").button({
175            icons: {
176                primary: "ui-icon-transferthick-e-w"
177            },
178            text: false
179        }).click(function () {
180            var me = $(this).parents('li');
181            if($(this).hasClass('attendee-permissions-change-button')){
182                $(this).removeClass('attendee-permissions-change-button')   
183                .find('.ui-icon-transferthick-e-w').removeClass('attendee-permissions-change').end();               
184           
185                me.find('input[name="delegatedFrom[]"]').val('');
186                dependsDelegate(me, true);
187                       
188                blkAddAtendee.find('.request-update').addClass('hidden');
189                blkAddAtendee.find('.status option').toggleClass('hidden');
190
191                blkAddAtendee.find('option[value=1]').attr('selected','selected').trigger('change');
192                   
193            }else{
194                removeOthers();
195               
196                $(this).addClass('attendee-permissions-change-button')   
197                .find('.ui-icon-transferthick-e-w').addClass('attendee-permissions-change').end();               
198               
199                me.find('input[name="delegatedFrom[]"]').val(blkAddAtendee.find('.me input[name="attendee[]"]').val());
200               
201                dependsDelegate(me, false);
202                   
203                blkAddAtendee.find('.request-update').removeClass('hidden');
204                if(blkAddAtendee.find('.status option.hidden').length == 1)
205                    blkAddAtendee.find('.status option').toggleClass('hidden');
206                   
207                blkAddAtendee.find('option[value=5]').attr('selected','selected').trigger('change');
208            }
209        })
210        .addClass('tiny disable ui-button-disabled ui-state-disabled')
211        .removeClass('new').end()           
212           
213        .filter(".open-delegate.new").click(function(){
214            if($(this).hasClass('ui-icon-triangle-1-e')){
215                $(this).removeClass('ui-icon-triangle-1-e').addClass('ui-icon-triangle-1-s');
216                $(this).parents('li').find('.list-delegates').removeClass('hidden');
217            }else{
218                $(this).removeClass('ui-icon-triangle-1-s').addClass('ui-icon-triangle-1-e');
219                $(this).parents('li').find('.list-delegates').addClass('hidden');
220            }
221           
222        }).removeClass('new');
223
224        UI.dialogs.addTask.find('.attendees-list li').hover(
225            function () {
226                $(this).addClass("hover-attendee");
227                $(this).find('.button').removeClass('disable ui-button-disabled ui-state-disabled').end()
228                .find('.attendee-options').addClass('hover-attendee');
229            },
230            function () {
231                $(this).removeClass("hover-attendee");
232                $(this).find('.button').addClass('disable ui-button-disabled ui-state-disabled').end()
233                .find('.attendee-options').removeClass('hover-attendee');
234            }
235        );       
236    }
237
238    /**
239     * canDiscardTaskDialog deve ser true se não houver alterações no task
240     */
241    canDiscardTaskDialog = true;
242    /**
243     * zebraDiscardTaskDialog é uma flag indicando que uma janela de confirmação (Zebra_Dialog)
244     * já estão aberta na tela, uma vez que não é possivel acessar o task ESC utilizado para fechá-la
245     */
246    zebraDiscardTaskDialog = false;
247
248    var html = DataLayer.render(path + 'templates/task_add.ejs', {
249        task: objTask
250    });
251
252    if (!UI.dialogs.addTask) {
253
254        UI.dialogs.addTask = jQuery('#sandbox').append('<div title="Criar tarefa" class="new-task-win active"> <div>').find('.new-task-win.active').html(html).dialog({
255            resizable: false,
256            modal: true,
257            autoOpen: false,
258            width: 775,
259            position: 'center',
260            close: function (event, ui) {
261                /**
262                 * Remove tooltip possivelmente existente
263                 */
264                if ($('.qtip.qtip-blue.qtip-active').length) $('.qtip.qtip-blue.qtip-active').qtip('destroy');
265                attendees = {};
266            },
267            beforeClose: function (event, ui) {
268
269                if (!canDiscardTaskDialog && !zebraDiscardTaskDialog) {
270                    zebraDiscardTaskDialog = true;
271                    window.setTimeout(function () {
272                        $.Zebra_Dialog('Suas alterações na tarefa não foram salvas. Deseja descartar as alterações?', {
273                            'type': 'question',
274                            'overlay_opacity': '0.5',
275                            'buttons': ['Descartar alterações', 'Continuar editando'],
276                            'onClose': function (clicked) {
277                                if (clicked == 'Descartar alterações') {
278                                    canDiscardTaskDialog = true;
279                                    /**
280                                     *Remoção dos anexos da task caso seja cancelado a ediçãoo
281                                     */
282                                    DataLayer.rollback();
283
284                                    var ids = false;
285                                    $.each($('.attachment-list input'), function (i, input) {
286                                        DataLayer.put('attachment', {
287                                            id: '' + input.value
288                                        });
289                                        DataLayer.remove('attachment', '' + input.value);
290                                        ids = true;
291                                    });
292                                    if (ids) DataLayer.commit();
293
294                                    UI.dialogs.addTask.dialog('close');
295                                } else {
296                                    zebraDiscardTaskDialog = false;
297                                }
298
299                                /**
300                                 * Uma vez aberta uma janela de confirmação (Zebra_Dialog), ao fechá-la
301                                 * com ESC, para que o task ESC nÃo seja propagado para fechamento da
302                                 * janela de edição de tasks, deve ser setada uma flag indicando que
303                                 * já existe uma janela de confirmação aberta.
304                                 */
305                                if (!clicked) {
306                                    window.setTimeout(function () {
307                                        zebraDiscardTaskDialog = false;
308                                    }, 200);
309                                }
310                            }
311                        });
312
313                    }, 300);
314
315                }
316                //DataLayer.rollback();
317                return canDiscardTaskDialog;
318            },
319            dragStart: function (task, ui) {
320                if ($('.qtip.qtip-blue.qtip-active').length) $('.qtip.qtip-blue.qtip-active').qtip('destroy');
321            }
322        });
323
324    } else {
325        UI.dialogs.addTask.html(html);
326    }
327
328    var tabs = UI.dialogs.addTask.children('.content').tabs({
329        select: function (task, ui) {
330            if ($('.qtip.qtip-blue.qtip-active').length) $('.qtip.qtip-blue.qtip-active').qtip('destroy');
331        }
332    });
333    var group = DataLayer.get('calendar', objTask.group);
334
335    if (group.timezone != objTask.timezone) {
336        UI.dialogs.addTask.find('.calendar-addtask-details-txt-timezone').find('option[value="' + objTask.timezone + '"]').attr('selected', 'selected').trigger('change');
337        UI.dialogs.addTask.find('.calendar_addtask_details_lnk_timezone').addClass('hidden');
338        $('.calendar-addtask-details-txt-timezone').removeClass('hidden');
339
340    }
341
342    UI.dialogs.addTask.find('.calendar_addtask_details_lnk_timezone').click(function (e) {
343        $(this).addClass('hidden');
344        $('.calendar-addtask-details-txt-timezone').removeClass('hidden');
345        e.prtaskDefault();
346    });
347
348    UI.dialogs.addTask.find('.button.remove').button({
349    text:false,
350    icons:{
351        primary:'ui-icon-close'
352    }
353    }).click(function(el){
354        var id;
355        if( id = $(this).parent().find('input[name="alarmId[]"]').val())
356        DataLayer.remove('alarm', id);
357        $(this).parent().remove().find('li').is(':empty');
358    });
359
360    /*Seleciona a agenda padrão para visualização edição de um task*/
361    if (objTask.id) UI.dialogs.addTask.find('select[name="group"] option[value="' + objTask.group + '"]').attr('selected', 'selected').trigger('change');
362       
363        UI.dialogs.addTask.find(':input').change(function(event){
364    if (event.keyCode != '27' && event.keyCode != '13')
365        canDiscardTaskDialog = false;
366        }).keydown(function(event){
367                if (event.keyCode != '27' && event.keyCode != '13')
368                canDiscardTaskDialog = false;
369        });
370
371    /* Checkbox allday */
372    UI.dialogs.addTask.find('input[name="allDay"]').click(function () {
373        $(this).attr("checked") ? UI.dialogs.addTask.find('.start-time, .end-time').addClass('hidden') : UI.dialogs.addTask.find('.start-time, .end-time').removeClass('hidden');
374        updateMap(true);
375    });
376       
377        todoStatus('addTask', (objTask.taskStatus  != undefined) ? objTask.taskStatus  : 1);
378       
379        //Conclusão das Tarefas
380        var conclusionTask = function(e){
381                var percentageTask = UI.dialogs.addTask.find('input[name="percentage"]');
382                if( percentageTask.val() == "")
383                        percentageTask.val(0);
384                percentageTask.blur().focus();
385               
386                var percentageValue = parseInt(percentageTask.val());
387                var statusTask = UI.dialogs.addTask.find('select[name=taskStatus]');
388               
389                if(percentageValue <= 0){
390                        statusTask.find('option.taskStatus-noAction').attr('selected', 'selected');
391                        todoStatus('addTask', 1);               
392                }else if(percentageValue == 100){
393                        statusTask.find('option.taskStatus-finished').attr('selected', 'selected');
394                        todoStatus('addTask', 3);
395                }else{
396                        statusTask.find('option.taskStatus-inProcess').attr('selected', 'selected');
397                        todoStatus('addTask', 2);
398                }               
399                setTimeout(function(){
400                        percentageTask[0].selectionStart = percentageTask.val().length;
401                        percentageTask[0].selectionEnd = percentageTask.val().length;
402                }, 10)
403        }
404        UI.dialogs.addTask.find('input[name="percentage"]').spinner({ min: 0, max: 100 }).keyup(conclusionTask).next().find(".ui-spinner-button").click(conclusionTask);       
405
406        //Status das Tarefas
407        UI.dialogs.addTask.find('select[name=taskStatus]').change(function(){
408                var statusSelected = $('select[name=taskStatus] option:selected').val();
409                var percentageTask = UI.dialogs.addTask.find('input[name="percentage"]');
410               
411                if (statusSelected == "1"){
412                        percentageTask.val(0);
413                }else if(statusSelected == "2"){
414                        percentageTask.val(percentageTask.val() != 0 ? (percentageTask.val() == 100 ? 99: percentageTask.val()) : 1);
415                }else if(statusSelected == "3"){
416                        percentageTask.val(100);
417                }else if(statusSelected == "4"){
418                        percentageTask.val(percentageTask.val() != 100 ? percentageTask.val() : 99);
419                }
420                todoStatus('addTask', statusSelected);
421        });
422       
423    UI.dialogs.addTask.find('.button').button();
424    UI.dialogs.addTask.find('.button.add').button({
425        icons: {
426            secondary: "ui-icon-plus"
427        }
428    });
429
430    // ==== validation tasks ====
431    UI.dialogs.addTask.find(".input-group .h1").Watermark("Tarefa sem título");
432    if (User.preferences.hourFormat.length == 5) {
433        UI.dialogs.addTask.find(".end-time, .start-time, .time-previsao").mask("99:99", {
434            completed: function () {
435                updateMap();
436            }
437        });
438    } else {
439        $.mask.definitions['{'] = '[ap]';
440        $.mask.definitions['}'] = '[m]';
441        UI.dialogs.addTask.find(".end-time, .start-time").mask("99:99 {}", {
442            completed: function () {
443                $(this).val(date.Calendar.defaultToAmPm($(this).val()));
444                $(this).timepicker("refresh");
445                $(this).val($(this).val().replace(/[\.]/gi, ""));
446                updateMap();
447            }
448        });
449    }
450    UI.dialogs.addTask.find(".number").numeric();
451    User.preferences.dateFormat.indexOf('-') > 0 ? UI.dialogs.addTask.find(".date").mask("99-99-9999", {
452        completed: function () {
453            updateMap();
454        }
455    }) : UI.dialogs.addTask.find(".date").mask("99/99/9999", {
456        completed: function () {
457            updateMap();
458        }
459    });
460
461    UI.dialogs.addTask.find(".menu-addtask").children(".delete").click(function () {
462        $.Zebra_Dialog('Tem certeza que deseja excluir esta tarefa?', {
463            'type': 'question',
464            'overlay_opacity': '0.5',
465            'buttons': ['Sim', 'Não'],
466            'onClose': function (clicked) {
467                if (clicked == 'Sim') {
468                    canDiscardTaskDialog = true; /* Remove por filtro */
469                    DataLayer.removeFilter('schedulable', {
470                        filter: ['AND', ['=', 'id', objTask.id],
471                            ['=', 'calendar', objTask.group],
472                            ['=', 'user', (objTask.me.user ? objTask.me.user.id : objTask.me.id)]
473                        ]
474                    });
475                    Calendar.rerenderView(true); /********************/
476                    UI.dialogs.addTask.dialog("close");
477                }
478            }
479        });
480    }).end()
481
482    .children(".cancel").click(function () {
483        UI.dialogs.addTask.dialog("close");
484    }).end()
485
486    .children(".save").click(function () { /* Validação */
487        UI.dialogs.addTask.find('input[name="summary"]').focus();
488               
489                if (msg = validDateTask()) {
490            $(".new-task-win.active").find('.messages-validation').removeClass('hidden').find('.message label').html(msg);
491            return false;
492        }
493                canDiscardTaskDialog = true;
494
495        UI.dialogs.addTask.children().find('form.form-addtask').submit();
496        UI.dialogs.addTask.dialog("close");
497
498    }).end()
499
500    .children(".export").click(function () {
501        UI.dialogs.addTask.children().find(".form-export").submit();
502    });
503
504    var attendeeHtml = DataLayer.render(path + 'templates/attendees_task.ejs', {
505        task: objTask
506    });
507
508    // load template of attendees
509    var blkAddAtendee = UI.dialogs.addTask.find('#calendar_addtask_details6').append(attendeeHtml);
510
511    if(objTask.attendee.length)
512        callbackAttendee();
513
514    /*
515     *   Opções de delegação do participante/organizer
516     */     
517    blkAddAtendee.find(".button.participant-delegate").button({
518        icons: {
519        primary: "ui-icon-transferthick-e-w"
520        },
521        text: false
522    }).click(function () {
523        if($(this).hasClass('attendee-permissions-change-button')){
524        if(!$(this).hasClass('disable')){
525            $(this).removeClass('attendee-permissions-change-button')   
526            .find('.ui-icon-transferthick-e-w').removeClass('attendee-permissions-change').end();               
527            blkAddAtendee.find('.block-add-attendee.search').addClass('hidden');
528            blkAddAtendee.find('.block-add-attendee.search dt').html('Adicionar outros contatos');
529        }
530        }else{                                 
531        $(this).addClass('attendee-permissions-change-button')   
532        .find('.ui-icon-transferthick-e-w').addClass('attendee-permissions-change').end();               
533        blkAddAtendee.find('.block-add-attendee.search dt').html('Delegar participação para');
534        blkAddAtendee.find('.block-add-attendee.search').removeClass('hidden');
535        blkAddAtendee.find('.block-add-attendee.search input.search').focus();
536        }
537    })
538    .addClass('tiny');
539
540    var dates = UI.dialogs.addTask.find('input.date').datepicker({
541        dateFormat: User.preferences.dateFormat.replace(/M/g, 'm').replace(/yyyy/g, 'yy'),
542        onSelect: function (selectedDate) {
543            updateMap();
544        }
545    });
546
547    UI.dialogs.addTask.find('input.time').timepicker({
548        closeText: 'Ok',
549        hourGrid: 4,
550        minuteGrid: 10,
551        ampm: ((User.preferences.hourFormat.length > 5) ? true : false),
552        timeFormat: "hh:mm tt",
553        onSelect: function (selectedDateTime) {
554            if (!(User.preferences.hourFormat.length == 5)) $(this).val(selectedDateTime.replace(/[\.]/gi, ""));
555            updateMap();
556        },
557        onClose: function (selectedDateTime) {
558            if (!(User.preferences.hourFormat.length == 5)) $(this).val(selectedDateTime.replace(/[\.]/gi, ""));
559        }
560    });
561
562    blkAddAtendee.find('.add-attendee-search .ui-icon-search').click(function (task) {
563        blkAddAtendee.find('.add-attendee-search input').keydown();
564    });
565
566    blkAddAtendee.find('.add-attendee-search input').keydown(function (task) {
567
568        if (task.keyCode == '13' || typeof (task.keyCode) == 'undefined') {
569            var result = DataLayer.get('user', ["*", "name", $(this).val()], true);
570
571            /**
572             * TODO: trocar por template
573             */
574            blkAddAtendee.find('ul.search-result-list').empty().css('overflow', 'hidden');
575            if (!result) {
576                blkAddAtendee.find('ul.search-result-list').append('<li><label class="empty">Nenhum resultado encontrado.</label></li>');
577            }
578
579            for (i = 0; i < result.length; i++)
580            result[i].enabled = (blkAddAtendee.find('dd.attendee-list ul.attendee-list label.mail[title="' + result[i].mail + '"]').length) ? false : true;
581
582            blkAddAtendee.find('ul.search-result-list').append(DataLayer.render(path + 'templates/participants_search_itemlist.ejs', result));
583
584            blkAddAtendee.find('ul.search-result-list li').click(function (task, ui) {
585                if ($(task.target).is('input')) {
586                    old_item = $(task.target).parents('li');
587                    newAttendeeId = DataLayer.put('participant', {
588                        user: old_item.find('.id').html(),
589                        isExternal: old_item.find('.isExternal').html()
590                    });
591
592                    attendees[old_item.find('.id').html()] = old_item.find('.name').html();
593
594                    blkAddAtendee.find('dd.attendee-list ul.attendee-list').append(DataLayer.render(path + 'templates/participants_add_itemlist.ejs', [{
595                        id: newAttendeeId,
596                        name: old_item.find('.name').html(),
597                        mail: old_item.find('.mail').html(),
598                        isExternal: old_item.find('.isExternal').html(),
599                        notEvent: true,
600                        isDirty: !! !objTask.id,
601                                                isDelegate: !!(objTask.me.id != objTask.organizer.id)
602                    }])).scrollTo('max');
603                    /**
604                     * Delegação de participação de um participante com permissão apenas de leitura
605                     *
606                     */
607                    if (objTask.me.id != objTask.organizer.id) {
608
609                        blkAddAtendee.find('.block-add-attendee.search').addClass('hidden');
610                        blkAddAtendee.find('.block-add-attendee.search dt').html('Adicionar outros contatos');
611
612                        blkAddAtendee.find('.status option').toggleClass('hidden');
613                        blkAddAtendee.find('option[value=5]').attr('selected', 'selected').trigger('change');
614                        blkAddAtendee.find('.request-update').removeClass('hidden');
615
616                        blkAddAtendee.find('dd.attendee-list ul.attendee-list li .button.close').parents('li').find('input[name="delegatedFrom[]"]').val(blkAddAtendee.find('.me input[name="attendee[]"]').val());
617
618                        blkAddAtendee.find('.me .participant-delegate').addClass('disable ui-button-disabled ui-state-disabled');
619                        blkAddAtendee.find(".button.close").button({
620                            icons: {
621                                primary: "ui-icon-close"
622                            },
623                            text: false
624                        }).click(function () {
625
626                            $(this).parents('li').find('input[name="delegatedFrom[]"]').val('');
627                            blkAddAtendee.find('.request-update').addClass('hidden');
628                            blkAddAtendee.find('.status option').toggleClass('hidden');
629                            blkAddAtendee.find('option[value=1]').attr('selected', 'selected').trigger('change');
630                            blkAddAtendee.find('.me .participant-delegate').removeClass('disable ui-button-disabled ui-state-disabled attendee-permissions-change-button').find('.ui-icon-person').removeClass('attendee-permissions-change').end();
631
632                            DataLayer.remove('participant', $(this).parents('li').find('[type=checkbox]').val());
633                            $(this).parents('li').remove();
634                        }).addClass('tiny');
635                    } else {
636                        callbackAttendee();
637                        old_item.remove();
638                    }
639                }
640            });
641
642            event.preventDefault();
643        }
644    });
645
646    UI.dialogs.addTask.find('.row.fileupload-buttonbar-task .button').filter('.delete').button({
647        icons: {
648            primary: "ui-icon-close"
649        },
650        text: 'Excluir'
651    }).click(function () {
652        $.Zebra_Dialog('Tem certeza que deseja excluir todos anexos?', {
653            'type': 'question',
654            'overlay_opacity': '0.5',
655            'buttons': ['Sim', 'Não'],
656            'onClose': function (clicked) {
657                if (clicked == 'Sim') {
658
659                    var ids = [];
660                    $.each($('.attachment-list input'), function (i, input) {
661                        DataLayer.remove('schedulableToAttachment', {
662                            filter: ['=', 'id', '' + input.value]
663                        });
664                    });
665                    $('.attachment-list input').remove();
666                    $('.row.fileupload-buttonbar .attachments-list p').remove();
667                }
668            }
669        });
670    }).end().filter('.close').button({
671        icons: {
672            primary: "ui-icon-close"
673        },
674        text: false
675    }).click(function () {
676        DataLayer.remove('schedulableToAttachment', $(this).parents('p').find('input[name="fileId[]"]').val());
677        $(this).parents('p').remove();
678    }).end().filter('.downlaod-archive').button({
679        icons: {
680            primary: "ui-icon-arrowthickstop-1-s"
681        },
682        text: false
683    });
684    var maxSizeFile = 2000000;
685    $('#fileuploadtask').fileupload({
686        sequentialUploads: true,
687        add: function (e, data) {
688            if (data.files[0].size < maxSizeFile) data.submit();
689        },
690        change: function (e, data) {
691            $.each(data.files, function (index, file) {
692                var attach = {};
693                attach.fileName = file.name;
694                var ext = file.name.split('.');
695                if (file.name.length > 10) attach.fileName = ext.length == 1 ? file.name.substr(0, 10) : file.name.substr(0, 6) + '.' + ext[ext.length - 1];
696                attach.fileSize = formatBytes(file.size);
697                if (file.size > maxSizeFile) attach.error = 'Tamanho de arquivo nao permitido!!'
698
699                $('div.new-task-win .attachments-list').append(DataLayer.render(path + 'templates/attachment_add_itemlist.ejs', {
700                    file: attach
701                }));
702
703                if (file.size < maxSizeFile) {
704                    $('div.new-task-win .fileinput-button.new').append(data.fileInput[0]).removeClass('new');
705                    $('div.new-task-win .attachments-list').find('[type=file]').addClass('hidden');
706
707                } else $('div.new-task-win .fileinput-button.new').removeClass('new');
708
709
710                $('div.new-task-win .attachments-list').find('.button.close').button({
711                    icons: {
712                        primary: "ui-icon-close"
713                    },
714                    text: false
715                }).click(function () {
716                    var idAttach = $(this).parent().find('input[name="fileId[]"]').val();
717                    $('div.new-task-win .attachment-list').find('input[value="' + idAttach + '"]')
718                    $(this).parent().remove();
719                });
720
721            })
722        },
723        done: function (e, data) {
724            var currentUpload = $('div.new-task-win .progress.after-upload:first').removeClass('after-upload').addClass('on-complete').hide();
725
726            if ( !! data.result && data.result != "[]") {
727                var newAttach = (attch = jQuery.parseJSON(data.result)) ? attch : jQuery.parseJSON(data.result[0].activeElement.childNodes[0].data);
728                $('div.new-task-win .attachment-list').append('<input tyepe="hidden" name="attachment[]" value="' + newAttach['attachment'][0][0].id + '"/>');
729                currentUpload.removeClass('on-complete').parents('p').append('<input type="hidden" name="fileId[]" value="' + newAttach['attachment'][0][0].id + '"/>').find('.status-upload').addClass('ui-icon ui-icon-check');
730            } else currentUpload.removeClass('on-complete').parents('p').find('.status-upload').addClass('ui-icon ui-icon-cancel');
731        }
732    });
733    $('div.new-task-win .attachments-list .button').button();
734
735    if ( !! window.FormData) $('#fileuploadtask').bind('fileuploadstart', function () {
736        var widget = $(this),
737            progressElement = $('#fileupload-progress-task').fadeIn(),
738            interval = 500,
739            total = 0,
740            loaded = 0,
741            loadedBefore = 0,
742            progressTimer, progressHandler = function (e, data) {
743                loaded = data.loaded;
744                total = data.total;
745            },
746            stopHandler = function () {
747                widget.unbind('fileuploadprogressall', progressHandler).unbind('fileuploadstop', stopHandler);
748                window.clearInterval(progressTimer);
749                progressElement.fadeOut(function () {
750                    progressElement.html('');
751                });
752            },
753            formatTime = function (seconds) {
754                var date = new Date(seconds * 1000);
755                return ('0' + date.getUTCHours()).slice(-2) + ':' + ('0' + date.getUTCMinutes()).slice(-2) + ':' + ('0' + date.getUTCSeconds()).slice(-2);
756            },
757
758            formatPercentage = function (floatValue) {
759                return (floatValue * 100).toFixed(2) + ' %';
760            },
761            updateProgressElement = function (loaded, total, bps) {
762                progressElement.html(
763                formatBytes(bps) + 'ps | ' + formatTime((total - loaded) / bps) + ' | ' + formatPercentage(loaded / total) + ' | ' + formatBytes(loaded) + ' / ' + formatBytes(total));
764            },
765            intervalHandler = function () {
766                var diff = loaded - loadedBefore;
767                if (!diff) {
768                    return;
769                }
770                loadedBefore = loaded;
771                updateProgressElement(
772                loaded, total, diff * (1000 / interval));
773            };
774        widget.bind('fileuploadprogressall', progressHandler).bind('fileuploadstop', stopHandler);
775        progressTimer = window.setInterval(intervalHandler, interval);
776    });
777
778    disponibily(objTask, path, attendees, 'task');
779
780    UI.dialogs.addTask.find('.button-add-alarms').click(function () {
781        var li_attach = DataLayer.render(path + 'templates/alarms_add_itemlist.ejs', {
782            type: 1
783        });
784
785        jQuery('.task-alarms-list').append(li_attach).find('.button.remove').button({
786            text: false,
787            icons: {
788                primary: 'ui-icon-close'
789            }
790        }).click(function (el) {
791            $(this).parent().remove().find('li').is(':empty')
792        });
793        // valicacao de campos numericos
794        $('.number').numeric();
795    });
796
797    UI.dialogs.addTask.find(':input').change(function(event){
798        if (event.keyCode != '27' && event.keyCode != '13')
799            canDiscardTaskDialog = false;
800    }).keydown(function(event){
801        if (event.keyCode != '27' && event.keyCode != '13')
802            canDiscardTaskDialog = false;
803    });
804
805    UI.dialogs.addTask.dialog('open');
806}
Note: See TracBrowser for help on using the repository browser.