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

Revision 6990, 38.4 KB checked in by acoutinho, 12 years ago (diff)

Ticket #2966 - Correcao de bugs e refactoring das novas funcionalidades

  • 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, isActivityView) {
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ção
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        if(isActivityView)
496            updateActivity = true;
497
498        UI.dialogs.addTask.children().find('form.form-addtask').submit();
499        UI.dialogs.addTask.dialog("close");
500
501    }).end()
502
503    .children(".export").click(function () {
504        UI.dialogs.addTask.children().find(".form-export").submit();
505    });
506
507    var attendeeHtml = DataLayer.render(path + 'templates/attendees_task.ejs', {
508        task: objTask
509    });
510
511    // load template of attendees
512    var blkAddAtendee = UI.dialogs.addTask.find('#calendar_addtask_details6').append(attendeeHtml);
513
514    if(objTask.attendee.length)
515        callbackAttendee();
516
517    /*
518     *   Opções de delegação do participante/organizer
519     */     
520    blkAddAtendee.find(".button.participant-delegate").button({
521        icons: {
522        primary: "ui-icon-transferthick-e-w"
523        },
524        text: false
525    }).click(function () {
526        if($(this).hasClass('attendee-permissions-change-button')){
527        if(!$(this).hasClass('disable')){
528            $(this).removeClass('attendee-permissions-change-button')   
529            .find('.ui-icon-transferthick-e-w').removeClass('attendee-permissions-change').end();               
530            blkAddAtendee.find('.block-add-attendee.search').addClass('hidden');
531            blkAddAtendee.find('.block-add-attendee.search dt').html('Adicionar outros contatos');
532        }
533        }else{                                 
534        $(this).addClass('attendee-permissions-change-button')   
535        .find('.ui-icon-transferthick-e-w').addClass('attendee-permissions-change').end();               
536        blkAddAtendee.find('.block-add-attendee.search dt').html('Delegar participação para');
537        blkAddAtendee.find('.block-add-attendee.search').removeClass('hidden');
538        blkAddAtendee.find('.block-add-attendee.search input.search').focus();
539        }
540    })
541    .addClass('tiny');
542
543    var dates = UI.dialogs.addTask.find('input.date').datepicker({
544        dateFormat: User.preferences.dateFormat.replace(/M/g, 'm').replace(/yyyy/g, 'yy'),
545        onSelect: function (selectedDate) {
546            updateMap();
547        }
548    });
549
550    UI.dialogs.addTask.find('input.time').timepicker({
551        closeText: 'Ok',
552        hourGrid: 4,
553        minuteGrid: 10,
554        ampm: ((User.preferences.hourFormat.length > 5) ? true : false),
555        timeFormat: "hh:mm tt",
556        onSelect: function (selectedDateTime) {
557            if (!(User.preferences.hourFormat.length == 5)) $(this).val(selectedDateTime.replace(/[\.]/gi, ""));
558            updateMap();
559        },
560        onClose: function (selectedDateTime) {
561            if (!(User.preferences.hourFormat.length == 5)) $(this).val(selectedDateTime.replace(/[\.]/gi, ""));
562        }
563    });
564   
565    UI.dialogs.addTask.find(".attendee-list-add .add-attendee-input input").Watermark("digite um email para convidar");
566    /*
567    * Trata a edição de um novo participante adicionado
568    */
569    var hasNewAttendee = false;
570
571    blkAddAtendee.find('.attendee-list-add .add-attendee-input span').click(function(data){
572        blkAddAtendee.find('.attendee-list-add .add-attendee-input input').keydown();
573    });
574
575    blkAddAtendee.find('.attendee-list-add .add-attendee-input input').keydown(function(event) {
576        if (event.keyCode == '13' && $(this).val() != '' || (event.keyCode == undefined && $(this).val() != '')) {
577            Encoder.EncodeType = "entity";
578            $(this).val(Encoder.htmlEncode($(this).val()));
579
580            newAttendeeEmail = false;
581            newAttendeeName  = false;
582            skipAddNewLine   = false;
583
584            var info = $(this).val();
585
586            /**
587            * email válido?
588            */
589            info.match(/^[\w!#$%&'*+\/=?^`{|}~-]+(\.[\w!#$%&'*+\/=?^`{|}~-]+)*@(([\w-]+\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])$/) ?
590            newAttendeeEmail = info : newAttendeeName = info;
591
592            /**
593            * 1) busca no banco para saber se o usuário já existe
594            *           1.1) se existe, atualiza as info na lista de participantes e nao abre o tooltip
595            *           1.2) se não existe
596            *                   a) salva como novo usuario externo no banco (apenas com email)
597            *                   b) exibe tooltip pedindo o nome
598            *                   c) se o usuário preenche tooltip e salva, atualiza com o nome o usuário recém criado
599            *                   d) se o usuário cancela o tooltip, fica o usuário salvo apenas com email e sem nome
600            */
601
602            var user = DataLayer.get('user', ["=", "mail", $(this).val()]);
603            if(!!user && user[0].id)
604                attendees[user[0].id] = {
605                    name: user[0].name
606                    };
607
608            /**
609            * guarda o último tooltip aberto referente à lista de participantes
610            */
611            lastEditAttendeeToolTip = [];
612
613            /**
614            * Valida email e salva um participante externo
615            */
616            var saveContact = function() {
617                Encoder.EncodeType = "entity";
618
619                var currentTip = $('.qtip-active');
620                newAttendeeName  = currentTip.find('input[name="name"]').val();
621                newAttendeeEmail = currentTip.find('input[name="mail"]').val();
622
623                if (!(!!newAttendeeEmail.match(/^[\w!#$%&'*+\/=?^`{|}~-]+(\.[\w!#$%&'*+\/=?^`{|}~-]+)*@(([\w-]+\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])$/))) {
624                    currentTip.find('.messages').removeClass('hidden').find('.message label').html('Email inválido.');
625                    return false;
626                }
627
628                DataLayer.put('user', {
629                    id:userId,
630                    name:newAttendeeName,
631                    mail:newAttendeeEmail,
632                    isExternal:isExternal
633                });
634
635                lastEditAttendeeToolTip.find('label')
636                .filter('.name').html(Encoder.htmlEncode(newAttendeeName)).attr('title', Encoder.htmlEncode(newAttendeeName)).end()
637                .filter('.mail').html(Encoder.htmlEncode(newAttendeeEmail)).attr('title', Encoder.htmlEncode(newAttendeeEmail));
638
639                blkAddAtendee.find('.attendee-list-add .add-attendee-input input').val('');
640                return true;
641            }
642
643            /**
644            * Formata e adequa um tootip abert para edição de um participante na lista
645            */
646            var onShowToolTip = function(arg0) {
647                $('.qtip-active .button.close').button({
648                    icons: {
649                        primary: "ui-icon-close"
650                    },
651                    text: false
652                });
653                $('.qtip-active .button').button()
654                .filter('.save').click(function(event, ui) {
655                    if(saveContact())
656                        lastEditAttendeeToolTip.qtip("destroy");
657                    else
658                        return false;
659                }).end()
660                .filter('.cancel').click(function(event, ui) {
661                    lastEditAttendeeToolTip.qtip("destroy");
662                })
663
664                /**
665                * Trata o ENTER no campo da tooltip, equivalente a salvar
666                * o novo convidado.
667                */
668                $('.qtip-active input').keydown(function(event) {
669                    if (event.keyCode == '13') {                                               
670                        if (saveContact())                                             
671                            lastEditAttendeeToolTip.qtip("destroy");
672
673                        lastEditAttendeeToolTip.qtip("destroy");
674                        event.preventDefault();
675                    }
676                })
677                .filter('[name="name"]').Watermark("informe o nome do contato").end()
678                .filter('[name="mail"]').Watermark("informe o email do contato");
679            }
680
681            /**
682            * Se o email digitado já foi adicionado na lista,
683            * o usuário deve ser avisado e um botão de edição deve ser exibido
684            */
685            if(blkAddAtendee.find('label.mail[title="' + newAttendeeEmail + '"]').length) {
686                hasNewAttendee  = false;
687                newAttendeeName = blkAddAtendee.find('label.mail[title="' + newAttendeeEmail + '"]').parents('li').find('label.name').attr('title');
688
689                blkAddAtendee.find('.email-validation').removeClass('hidden')
690                .find('.message label').html("O usuário acima já foi adicionado! <a class=\"small button\">Editar</a>")
691                .find(".button").button().click(function () {
692                    /**
693                    * Se o usuário optar por editar o participante anteriormente adicionado,
694                    * uma tooltip deve ser aberta para este participante, viabilizando a edição
695                    */
696                    blkAddAtendee.find("ul.attendee-list").scrollTo('label.mail[title="' + newAttendeeEmail + '"]');
697                    /**
698                    * Remove tooltip possivelmente existente
699                    */
700                    if (lastEditAttendeeToolTip.length && lastEditAttendeeToolTip.data('qtip'))
701                        lastEditAttendeeToolTip.qtip('destroy');
702
703                    lastEditAttendeeToolTip = blkAddAtendee.find('label.mail[title="' + newAttendeeEmail + '"]').parents('li');
704                    lastEditAttendeeToolTip.qtip({
705                        show: {
706                            ready: true,
707                            solo: true,
708                            when: {
709                                event: 'click'
710                            }
711                        },
712                    hide: false,
713                    content: {
714                        text: $('<div></div>').html( DataLayer.render( path+'templates/attendee_quick_edit.ejs', {
715                            attendee:{
716                                name:newAttendeeName,
717                                mail:newAttendeeEmail
718                            }
719                        } ) ),
720                    title: {
721                        text:'Detalhes do participante',
722                        button: '<a class="button close" href="#">close</a>'
723                    }
724                    },
725                    style: {
726                        name: 'blue',
727                        tip: {
728                            corner: 'leftMiddle'
729                        },
730                        border: {
731                            width: 4,
732                            radius: 8
733                        },
734                        width: {
735                            min: 230,
736                            max:230
737                        }
738                    },
739                position: {
740                    corner: {
741                        target: 'rightMiddle',
742                        tooltip: 'leftMiddle'
743                    },
744                    adjust: {
745                        x:0,
746                        y:0
747                    }
748                }
749                });
750            lastEditAttendeeToolTip.qtip("api").onShow = onShowToolTip;
751        });
752    skipAddNewLine = true;
753    } else {
754        hasNewAttendee  = true;
755        blkAddAtendee.find('.email-validation').addClass('hidden');
756    }
757
758
759    var isExternal = (!!user && !(!!user.isExternal)) ? 0 : 1;
760
761    /**
762    * Remove tooltip possivelmente existente
763    */
764    if (lastEditAttendeeToolTip.length && lastEditAttendeeToolTip.data('qtip'))
765        lastEditAttendeeToolTip.qtip('destroy');
766
767    userId = '';
768    var newAttendeeId = '';
769
770    if (user){
771        if (!skipAddNewLine) {
772            user[0].id =  DataLayer.put('participant', {
773                user: user[0].id,
774                isExternal: isExternal,
775                acl: 'r'
776            });
777            user[0].acl = 'r';
778            user[0].isDirty = !!!objTask.id;
779
780            blkAddAtendee.find('dd.attendee-list ul.attendee-list').append(
781                DataLayer.render(path+'templates/participants_add_itemlist.ejs', user)
782                )
783            .scrollTo('max');
784            callbackAttendee();
785        }
786
787        $(this).val('');
788
789    } else if (!skipAddNewLine) {
790        /**
791        * a) salva como novo usuario externo no banco (apenas com email) e...
792        * adiciona novo contato externo à lista de convidados
793        */
794
795        userId = DataLayer.put('user', {
796            name: newAttendeeName,
797            mail: newAttendeeEmail,
798            isExternal: isExternal
799        });
800        newAttendeeId = DataLayer.put('participant', {
801            user: userId,
802            isExternal: isExternal
803        });
804
805
806        blkAddAtendee.find('dd.attendee-list ul.attendee-list').append(
807            DataLayer.render(path+'templates/participants_add_itemlist.ejs', [{
808                id:newAttendeeId,
809                name: newAttendeeName,
810                mail: newAttendeeEmail,
811                isExternal: 1,
812                isDirty: !!!objTask.id
813                }])
814            ).scrollTo('max');
815        callbackAttendee();
816
817        /**
818        * Adiciona tootip para atualização dos dados do contato externo
819        * recém adicionado.
820        */
821        lastEditAttendeeToolTip = blkAddAtendee.find('dd.attendee-list li:last');
822        lastEditAttendeeToolTip.qtip({
823            show: {
824                ready: true,
825                solo: true,
826                when: {
827                    event: 'click'
828                }
829            },
830        hide: false,
831        content: {
832            text: $('<div></div>').html( DataLayer.render( path+'templates/attendee_quick_edit.ejs', {
833                attendee:{
834                    name:newAttendeeName,
835                    mail:newAttendeeEmail
836                }
837            } ) ),
838        title: {
839            text:'Detalhes do participante',
840            button: '<a class="button close" href="#">close</a>'
841        }
842        },
843        style: {
844            name: 'blue',
845            tip: {
846                corner: 'leftMiddle'
847            },
848            border: {
849                width: 4,
850                radius: 8
851            },
852            width: {
853                min: 230,
854                max:230
855            }
856        },
857    position: {
858        corner: {
859            target: 'rightMiddle',
860            tooltip: 'leftMiddle'
861        },
862        adjust: {
863            x:0,
864            y:0
865        }
866    }
867    });
868
869    lastEditAttendeeToolTip.qtip("api").onShow = onShowToolTip;
870
871    $(this).val('');
872
873
874    }
875    event.preventDefault();
876    }
877
878    });
879
880    blkAddAtendee.find('.add-attendee-search .ui-icon-search').click(function (task) {
881        blkAddAtendee.find('.add-attendee-search input').keydown();
882    });
883
884    blkAddAtendee.find('.add-attendee-search input').keydown(function (task) {
885
886        if (task.keyCode == '13' || typeof (task.keyCode) == 'undefined') {
887            var result = DataLayer.get('user', ["*", "name", $(this).val()], true);
888
889            /**
890             * TODO: trocar por template
891             */
892            blkAddAtendee.find('ul.search-result-list').empty().css('overflow', 'hidden');
893            if (!result) {
894                blkAddAtendee.find('ul.search-result-list').append('<li><label class="empty">Nenhum resultado encontrado.</label></li>');
895            }
896
897            for (i = 0; i < result.length; i++)
898            result[i].enabled = (blkAddAtendee.find('dd.attendee-list ul.attendee-list label.mail[title="' + result[i].mail + '"]').length) ? false : true;
899
900            blkAddAtendee.find('ul.search-result-list').append(DataLayer.render(path + 'templates/participants_search_itemlist.ejs', result));
901
902            blkAddAtendee.find('ul.search-result-list li').click(function (task, ui) {
903                if ($(task.target).is('input')) {
904                    old_item = $(task.target).parents('li');
905                    newAttendeeId = DataLayer.put('participant', {
906                        user: old_item.find('.id').html(),
907                        isExternal: old_item.find('.isExternal').html()
908                    });
909
910                    attendees[old_item.find('.id').html()] = old_item.find('.name').html();
911
912                    blkAddAtendee.find('dd.attendee-list ul.attendee-list').append(DataLayer.render(path + 'templates/participants_add_itemlist.ejs', [{
913                        id: newAttendeeId,
914                        name: old_item.find('.name').html(),
915                        mail: old_item.find('.mail').html(),
916                        isExternal: old_item.find('.isExternal').html(),
917                        notEvent: true,
918                        isDirty: !! !objTask.id,
919                                                isDelegate: !!(objTask.me.id != objTask.organizer.id)
920                    }])).scrollTo('max');
921                    /**
922                     * Delegação de participação de um participante com permissão apenas de leitura
923                     *
924                     */
925                    if (objTask.me.id != objTask.organizer.id) {
926
927                        blkAddAtendee.find('.block-add-attendee.search').addClass('hidden');
928                        blkAddAtendee.find('.block-add-attendee.search dt').html('Adicionar outros contatos');
929
930                        blkAddAtendee.find('.status option').toggleClass('hidden');
931                        blkAddAtendee.find('option[value=5]').attr('selected', 'selected').trigger('change');
932                        blkAddAtendee.find('.request-update').removeClass('hidden');
933
934                        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());
935
936                        blkAddAtendee.find('.me .participant-delegate').addClass('disable ui-button-disabled ui-state-disabled');
937                        blkAddAtendee.find(".button.close").button({
938                            icons: {
939                                primary: "ui-icon-close"
940                            },
941                            text: false
942                        }).click(function () {
943
944                            $(this).parents('li').find('input[name="delegatedFrom[]"]').val('');
945                            blkAddAtendee.find('.request-update').addClass('hidden');
946                            blkAddAtendee.find('.status option').toggleClass('hidden');
947                            blkAddAtendee.find('option[value=1]').attr('selected', 'selected').trigger('change');
948                            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();
949
950                            DataLayer.remove('participant', $(this).parents('li').find('[type=checkbox]').val());
951                            $(this).parents('li').remove();
952                        }).addClass('tiny');
953                    } else {
954                        callbackAttendee();
955                        old_item.remove();
956                    }
957                }
958            });
959
960            event.preventDefault();
961        }
962    });
963
964    UI.dialogs.addTask.find('.row.fileupload-buttonbar-task .button').filter('.delete').button({
965        icons: {
966            primary: "ui-icon-close"
967        },
968        text: 'Excluir'
969    }).click(function () {
970        $.Zebra_Dialog('Tem certeza que deseja excluir todos anexos?', {
971            'type': 'question',
972            'overlay_opacity': '0.5',
973            'buttons': ['Sim', 'Não'],
974            'onClose': function (clicked) {
975                if (clicked == 'Sim') {
976
977                    var ids = [];
978                    $.each($('.attachment-list input'), function (i, input) {
979                        DataLayer.remove('schedulableToAttachment', {
980                            filter: ['=', 'id', '' + input.value]
981                        });
982                    });
983                    $('div.new-task-win .attachment-list input').remove();
984                    $('div.new-task-win .row.fileupload-buttonbar .attachments-list p').remove();
985                    $('div.new-task-win .btn-danger.delete').addClass('hidden');
986                }
987            }
988        });
989    }).end().filter('.close').button({
990        icons: {
991            primary: "ui-icon-close"
992        },
993        text: false
994    }).click(function () {
995        DataLayer.remove('schedulableToAttachment', $(this).parents('p').find('input[name="fileId[]"]').val());
996        $(this).parents('p').remove();
997    }).end().filter('.downlaod-archive').button({
998        icons: {
999            primary: "ui-icon-arrowthickstop-1-s"
1000        },
1001        text: false
1002    });
1003
1004    extendsFileupload('task', path);
1005
1006    disponibily(objTask, path, attendees, 'task');
1007
1008    UI.dialogs.addTask.find('.button-add-alarms').click(function () {
1009        var li_attach = DataLayer.render(path + 'templates/alarms_add_itemlist.ejs', {
1010            type: 1
1011        });
1012
1013        jQuery('.task-alarms-list').append(li_attach).find('.button.remove').button({
1014            text: false,
1015            icons: {
1016                primary: 'ui-icon-close'
1017            }
1018        }).click(function (el) {
1019            $(this).parent().remove().find('li').is(':empty')
1020        });
1021        // valicacao de campos numericos
1022        $('.number').numeric();
1023    });
1024
1025    UI.dialogs.addTask.find(':input').change(function(event){
1026        if (event.keyCode != '27' && event.keyCode != '13')
1027            canDiscardTaskDialog = false;
1028    }).keydown(function(event){
1029        if (event.keyCode != '27' && event.keyCode != '13')
1030            canDiscardTaskDialog = false;
1031    });
1032
1033    UI.dialogs.addTask.dialog('open');
1034}
Note: See TracBrowser for help on using the repository browser.