source: trunk/prototype/modules/calendar/js/task.helpers.js @ 7068

Revision 7068, 36.9 KB checked in by acoutinho, 12 years ago (diff)

Ticket #3054 - Inconsistencia ao importar alguma tarefa individual

  • Property svn:executable set to *
Line 
1function validDateTask(){
2       
3        var errors = {
4                'emptyInitData': 'Por favor, informe uma data inicial',
5                'emptyInitHour': 'Por favor, informe uma hora inicial',
6               
7                'invalidInitData' : 'Data inicial inválida',
8
9                'equalData' : 'Hora inicial igual a final',
10                'theirData' : 'Data final menor que a inicial',         
11                'theirHour' : 'Hora final menor que a inicial',
12               
13                'dueInitDate' : 'Previsão de término menor que a data inicial',
14                'dueEndDate'  : 'Previsão de término menor que a data final',
15                'dueTime'         : 'Deve ser definido a hora da Previsão de Término',
16                'dueDate'         : 'Deve ser definido a Previsão de Término',
17                'invalidDueData' : 'Data de Previsão de Término inválida'
18        };
19
20    var start_date = $(".new-task-win.active .start-date").val();
21    var start_time = $(".new-task-win.active .start-time").val();
22        var due_date   = $(".new-task-win.active .date-prevision").val();
23        var due_time   =  $.trim($(".new-task-win.active .time-prevision").val());
24
25    if(start_date == "")
26                return errors['emptyInitData'];
27        else if(due_date != "" && due_time == "")
28                return errors['dueTime'];
29        else if(due_date == "" && due_time != "")
30                return errors['dueDate'];
31
32    var formatString = User.preferences.dateFormat + " " + User.preferences.hourFormat;
33    var startDate = Date.parseExact( start_date + " " + $.trim(start_time) , formatString );
34
35    if(startDate == null || startDate.getTime() < 0 )
36                return errors['invalidInitData'];
37
38    if(due_date != '' && due_time != '')
39    {
40        var dueDate = Date.parseExact( due_date + " " + $.trim(due_time) , formatString );
41
42        if(dueDate.compareTo(startDate) == -1)
43            return errors['dueInitDate'];
44    }
45
46    return false;
47}
48
49function todoStatus(view, status){
50        if (status == "1"){
51                UI.dialogs[view].find('.subitem .span_done').removeClass('finished noAction inProcess canceled').addClass('noAction');
52        }else if (status == "2"){
53                UI.dialogs[view].find('.subitem .span_done').removeClass('finished noAction inProcess canceled').addClass('inProcess');
54        }else if (status == "3"){
55                UI.dialogs[view].find('.subitem .span_done').removeClass('finished noAction inProcess canceled').addClass('finished');
56        }else if (status == "4"){
57                UI.dialogs[view].find('.subitem .span_done').removeClass('finished noAction inProcess canceled').addClass('canceled');
58        }
59}
60
61function taskDetails(objTask, decoded, path, isMail, repeat, isActivityView) {
62
63    $('.qtip.qtip-blue').remove();
64
65    attendees = {};
66
67    if (path == undefined) path = "";
68
69    if (!decoded) objTask = DataLayer.decode("task:calendar", objTask);
70
71    if (!isMail) objTask = DataLayer.encode("schedulable:task", objTask);
72
73    if (typeof (objTask.id) == 'undefined') {
74        objTask.alarms = Calendar.signatureOf[User.preferences.defaultCalendar || Calendar.groupIds[0]].defaultAlarms || false;
75        objTask.useAlarmDefault = 1;
76    }
77
78
79    if(objTask.me.id == User.me.id){
80        objTask.me.id = DataLayer.put('participant', {
81            user: objTask.me.id,
82            mail: objTask.me.mail
83        });
84        objTask.organizer.id = objTask.me.id;
85    }
86
87    var dependsDelegate = function(reference, inverse){
88        if(inverse){
89            if(reference.find('input[name="attendee[]"]').val() == blkAddAtendee.find('li.organizer input[name="attendee_organizer"]').val())
90                blkAddAtendee.find('li.organizer input[name="attendee_organizer"]').val(blkAddAtendee.find('.me input[name="attendee[]"]').val());
91        }else{
92            if(blkAddAtendee.find('.me input[name="attendee[]"]').val() == blkAddAtendee.find('li.organizer input[name="attendee_organizer"]').val())
93                blkAddAtendee.find('li.organizer input[name="attendee_organizer"]').val(reference.find('input[name="attendee[]"]').val());
94        }
95    };
96
97    var removeOthers = function(){
98        var other = blkAddAtendee.find('.delegate.attendee-permissions-change-button');
99        if(other.lenght)
100            dependsDelegate(other.parents('li'), true);
101
102        blkAddAtendee.find('.delegate').removeClass('attendee-permissions-change-button');
103        blkAddAtendee.find('.ui-icon-transferthick-e-w').removeClass('attendee-permissions-change');
104   
105    };
106
107    var callbackAttendee = function(){
108        var checked = false;
109        blkAddAtendee.find("li.not-attendee").addClass('hidden');
110       
111        blkAddAtendee.find("li .button").filter(".close.new").button({
112            icons: {
113            primary: "ui-icon-close"
114            },
115            text: false
116        }).click(function () {
117            DataLayer.remove('participant', $(this).parents('li').find('[type=checkbox]').val());
118            if($(this).parent().find('.button.delegate').hasClass('attendee-permissions-change-button')){
119                removeOthers();
120                blkAddAtendee.find('.request-update').addClass('hidden');
121                blkAddAtendee.find('.status option').toggleClass('hidden');
122                       
123                blkAddAtendee.find('option[value=1]').attr('selected','selected').trigger('change');
124            }
125               
126            $(this).parents('li').remove();
127               
128            if(blkAddAtendee.find(".attendee-list li").length == 1)
129                blkAddAtendee.find("li.not-attendee").removeClass('hidden');
130        })
131        .addClass('tiny disable ui-button-disabled ui-state-disabled')
132        .removeClass('new').end()
133       
134        .filter(".delegate.new").button({
135            icons: {
136                primary: "ui-icon-transferthick-e-w"
137            },
138            text: false
139        }).click(function () {
140            var me = $(this).parents('li');
141            if($(this).hasClass('attendee-permissions-change-button')){
142                $(this).removeClass('attendee-permissions-change-button')   
143                .find('.ui-icon-transferthick-e-w').removeClass('attendee-permissions-change').end();               
144           
145                me.find('input[name="delegatedFrom[]"]').val('');
146                dependsDelegate(me, true);
147                       
148                blkAddAtendee.find('.request-update').addClass('hidden');
149                blkAddAtendee.find('.status option').toggleClass('hidden');
150
151                blkAddAtendee.find('option[value=1]').attr('selected','selected').trigger('change');
152                   
153            }else{
154                removeOthers();
155               
156                $(this).addClass('attendee-permissions-change-button')   
157                .find('.ui-icon-transferthick-e-w').addClass('attendee-permissions-change').end();               
158               
159                me.find('input[name="delegatedFrom[]"]').val(blkAddAtendee.find('.me input[name="attendee[]"]').val());
160               
161                dependsDelegate(me, false);
162                   
163                blkAddAtendee.find('.request-update').removeClass('hidden');
164                if(blkAddAtendee.find('.status option.hidden').length == 1)
165                    blkAddAtendee.find('.status option').toggleClass('hidden');
166                   
167                blkAddAtendee.find('option[value=5]').attr('selected','selected').trigger('change');
168            }
169        })
170        .addClass('tiny disable ui-button-disabled ui-state-disabled')
171        .removeClass('new').end()           
172           
173        .filter(".open-delegate.new").click(function(){
174            if($(this).hasClass('ui-icon-triangle-1-e')){
175                $(this).removeClass('ui-icon-triangle-1-e').addClass('ui-icon-triangle-1-s');
176                $(this).parents('li').find('.list-delegates').removeClass('hidden');
177            }else{
178                $(this).removeClass('ui-icon-triangle-1-s').addClass('ui-icon-triangle-1-e');
179                $(this).parents('li').find('.list-delegates').addClass('hidden');
180            }
181           
182        }).removeClass('new');
183
184        UI.dialogs.addTask.find('.attendees-list li').hover(
185            function () {
186                $(this).addClass("hover-attendee");
187                $(this).find('.button').removeClass('disable ui-button-disabled ui-state-disabled').end()
188                .find('.attendee-options').addClass('hover-attendee');
189            },
190            function () {
191                $(this).removeClass("hover-attendee");
192                $(this).find('.button').addClass('disable ui-button-disabled ui-state-disabled').end()
193                .find('.attendee-options').removeClass('hover-attendee');
194            }
195        );       
196    }
197
198    /**
199     * canDiscardTaskDialog deve ser true se não houver alterações no task
200     */
201    canDiscardTaskDialog = true;
202    /**
203     * zebraDiscardTaskDialog é uma flag indicando que uma janela de confirmação (Zebra_Dialog)
204     * já estão aberta na tela, uma vez que não é possivel acessar o task ESC utilizado para fechá-la
205     */
206    zebraDiscardTaskDialog = false;
207
208    var html = DataLayer.render(path + 'templates/task_add.ejs', {
209        task: objTask
210    });
211
212    if (!UI.dialogs.addTask) {
213
214        UI.dialogs.addTask = jQuery('#sandbox').append('<div title="Criar Tarefa" class="new-task-win active"> <div>').find('.new-task-win.active').html(html).dialog({
215            resizable: false,
216            modal: true,
217            autoOpen: false,
218            width: 775,
219            position: 'center',
220            close: function (event, ui) {
221                /**
222                 * Remove tooltip possivelmente existente
223                 */
224                if ($('.qtip.qtip-blue.qtip-active').length) $('.qtip.qtip-blue.qtip-active').qtip('destroy');
225                attendees = {};
226            },
227            beforeClose: function (event, ui) {
228
229                if (!canDiscardTaskDialog && !zebraDiscardTaskDialog) {
230                    zebraDiscardTaskDialog = true;
231                    window.setTimeout(function () {
232                        $.Zebra_Dialog('Suas alterações na tarefa não foram salvas. Deseja descartar as alterações?', {
233                            'type': 'question',
234                            'overlay_opacity': '0.5',
235                            'buttons': ['Descartar alterações', 'Continuar editando'],
236                            'onClose': function (clicked) {
237                                if (clicked == 'Descartar alterações') {
238                                    canDiscardTaskDialog = true;
239                                    /**
240                                     *Remoção dos anexos da task caso seja cancelado a edição
241                                     */
242                                    DataLayer.rollback();
243
244                                    var ids = false;
245                                    $.each($('.attachment-list input'), function (i, input) {
246                                        DataLayer.put('attachment', {
247                                            id: '' + input.value
248                                        });
249                                        DataLayer.remove('attachment', '' + input.value);
250                                        ids = true;
251                                    });
252                                    if (ids) DataLayer.commit();
253
254                                    UI.dialogs.addTask.dialog('close');
255                                } else {
256                                    zebraDiscardTaskDialog = false;
257                                }
258
259                                /**
260                                 * Uma vez aberta uma janela de confirmação (Zebra_Dialog), ao fechá-la
261                                 * com ESC, para que o task ESC nÃo seja propagado para fechamento da
262                                 * janela de edição de tasks, deve ser setada uma flag indicando que
263                                 * já existe uma janela de confirmação aberta.
264                                 */
265                                if (!clicked) {
266                                    window.setTimeout(function () {
267                                        zebraDiscardTaskDialog = false;
268                                    }, 200);
269                                }
270                            }
271                        });
272
273                    }, 300);
274
275                }
276                //DataLayer.rollback();
277                return canDiscardTaskDialog;
278            },
279            dragStart: function (task, ui) {
280                if ($('.qtip.qtip-blue.qtip-active').length) $('.qtip.qtip-blue.qtip-active').qtip('destroy');
281            }
282        });
283
284    } else {
285        UI.dialogs.addTask.html(html);
286    }
287
288    var tabs = UI.dialogs.addTask.children('.content').tabs({
289        select: function (task, ui) {
290            if ($('.qtip.qtip-blue.qtip-active').length) $('.qtip.qtip-blue.qtip-active').qtip('destroy');
291        }
292    });
293    var group = DataLayer.get('calendar', objTask.group);
294
295    if (group.timezone != objTask.timezone) {
296        UI.dialogs.addTask.find('.calendar-addtask-details-txt-timezone').find('option[value="' + objTask.timezone + '"]').attr('selected', 'selected').trigger('change');
297        UI.dialogs.addTask.find('.calendar_addtask_details_lnk_timezone').addClass('hidden');
298        $('.calendar-addtask-details-txt-timezone').removeClass('hidden');
299
300    }
301
302    UI.dialogs.addTask.find('.calendar_addtask_details_lnk_timezone').click(function (e) {
303        $(this).addClass('hidden');
304        $('.calendar-addtask-details-txt-timezone').removeClass('hidden');
305        e.prtaskDefault();
306    });
307
308    UI.dialogs.addTask.find('.button.remove').button({
309    text:false,
310    icons:{
311        primary:'ui-icon-close'
312    }
313    }).click(function(el){
314        var id;
315        if( id = $(this).parent().find('input[name="alarmId[]"]').val())
316        DataLayer.remove('alarm', id);
317        $(this).parent().remove().find('li').is(':empty');
318    });
319
320    /*Seleciona a agenda padrão para visualização edição de um task*/
321    if (objTask.id) UI.dialogs.addTask.find('select[name="group"] option[value="' + objTask.group + '"]').attr('selected', 'selected').trigger('change');
322       
323        UI.dialogs.addTask.find(':input').change(function(event){
324    if (event.keyCode != '27' && event.keyCode != '13')
325        canDiscardTaskDialog = false;
326        }).keydown(function(event){
327                if (event.keyCode != '27' && event.keyCode != '13')
328                canDiscardTaskDialog = false;
329        });
330
331    /* Checkbox allday */
332    UI.dialogs.addTask.find('input[name="allDay"]').click(function () {
333        $(this).attr("checked") ? UI.dialogs.addTask.find('.start-time, .end-time').addClass('hidden') : UI.dialogs.addTask.find('.start-time, .end-time').removeClass('hidden');
334        updateMap(true);
335    });
336       
337        todoStatus('addTask', (objTask.taskStatus  != undefined) ? objTask.taskStatus  : 1);
338       
339        //Conclusão das Tarefas
340        var conclusionTask = function(e){
341                var percentageTask = UI.dialogs.addTask.find('input[name="percentage"]');
342                if( percentageTask.val() == "")
343                        percentageTask.val(0);
344                percentageTask.blur().focus();
345               
346                var percentageValue = parseInt(percentageTask.val());
347                var statusTask = UI.dialogs.addTask.find('select[name=taskStatus]');
348               
349                if(percentageValue <= 0){
350                        statusTask.find('option.taskStatus-noAction').attr('selected', 'selected');
351                        todoStatus('addTask', 1);               
352                }else if(percentageValue == 100){
353                        statusTask.find('option.taskStatus-finished').attr('selected', 'selected');
354                        todoStatus('addTask', 3);
355                }else{
356                        statusTask.find('option.taskStatus-inProcess').attr('selected', 'selected');
357                        todoStatus('addTask', 2);
358                }               
359                setTimeout(function(){
360                        percentageTask[0].selectionStart = percentageTask.val().length;
361                        percentageTask[0].selectionEnd = percentageTask.val().length;
362                }, 10)
363        }
364        UI.dialogs.addTask.find('input[name="percentage"]').spinner({ min: 0, max: 100 }).keyup(conclusionTask).next().find(".ui-spinner-button").click(conclusionTask);       
365
366        //Status das Tarefas
367        UI.dialogs.addTask.find('select[name=taskStatus]').change(function(){
368                var statusSelected = $('select[name=taskStatus] option:selected').val();
369                var percentageTask = UI.dialogs.addTask.find('input[name="percentage"]');
370               
371                if (statusSelected == "1"){
372                        percentageTask.val(0);
373                }else if(statusSelected == "2"){
374                        percentageTask.val(percentageTask.val() != 0 ? (percentageTask.val() == 100 ? 99: percentageTask.val()) : 1);
375                }else if(statusSelected == "3"){
376                        percentageTask.val(100);
377                }else if(statusSelected == "4"){
378                        percentageTask.val(percentageTask.val() != 100 ? percentageTask.val() : 99);
379                }
380                todoStatus('addTask', statusSelected);
381        });
382       
383    UI.dialogs.addTask.find('.button').button();
384    UI.dialogs.addTask.find('.button.add').button({
385        icons: {
386            secondary: "ui-icon-plus"
387        }
388    });
389
390    // ==== validation tasks ====
391    UI.dialogs.addTask.find(".input-group .h1").Watermark("Tarefa sem título");
392    if (User.preferences.hourFormat.length == 5) {
393        UI.dialogs.addTask.find(".end-time, .start-time, .time-prevision").mask("99:99", {
394            completed: function () {
395                updateMap();
396            }
397        });
398    } else {
399        $.mask.definitions['{'] = '[ap]';
400        $.mask.definitions['}'] = '[m]';
401        UI.dialogs.addTask.find(".end-time, .start-time, .time-prevision").mask("99:99 {}", {
402            completed: function () {
403                $(this).val(date.Calendar.defaultToAmPm($(this).val()));
404                $(this).timepicker("refresh");
405                $(this).val($(this).val().replace(/[\.]/gi, ""));
406                updateMap();
407            }
408        });
409    }
410    UI.dialogs.addTask.find(".number").numeric();
411    User.preferences.dateFormat.indexOf('-') > 0 ? UI.dialogs.addTask.find(".date").mask("99-99-9999", {
412        completed: function () {
413            updateMap();
414        }
415    }) : UI.dialogs.addTask.find(".date").mask("99/99/9999", {
416        completed: function () {
417            updateMap();
418        }
419    });
420
421    UI.dialogs.addTask.find(".menu-addtask").children(".delete").click(function () {
422        $.Zebra_Dialog('Tem certeza que deseja excluir esta tarefa?', {
423            'type': 'question',
424            'overlay_opacity': '0.5',
425            'buttons': ['Sim', 'Não'],
426            'onClose': function (clicked) {
427                if (clicked == 'Sim') {
428                    canDiscardTaskDialog = true; /* Remove por filtro */
429                    DataLayer.removeFilter('schedulable', {
430                        filter: ['AND', ['=', 'id', objTask.id],
431                            ['=', 'calendar', objTask.group],
432                            ['=', 'user', (objTask.me.user ? objTask.me.user.id : objTask.me.id)]
433                        ]
434                    });
435                    Calendar.rerenderView(true); /********************/
436                    UI.dialogs.addTask.dialog("close");
437                }
438            }
439        });
440    }).end()
441
442    .children(".cancel").click(function () {
443        UI.dialogs.addTask.dialog("close");
444    }).end()
445
446    .children(".save").click(function () { /* Validação */
447        UI.dialogs.addTask.find('input[name="summary"]').focus();
448               
449        if (msg = validDateTask()) {
450            $(".new-task-win.active").find('.messages-validation').removeClass('hidden').find('.message label').html(msg);
451            return false;
452        }
453        canDiscardTaskDialog = true;
454       
455        if(isActivityView)
456            updateActivity = true;
457
458        UI.dialogs.addTask.children().find('form.form-addtask').submit();
459        UI.dialogs.addTask.dialog("close");
460
461    }).end()
462
463    .children(".export").click(function () {
464        UI.dialogs.addTask.children().find(".form-export").submit();
465    });
466
467    var attendeeHtml = DataLayer.render(path + 'templates/attendees_task.ejs', {
468        task: objTask
469    });
470
471    // load template of attendees
472    var blkAddAtendee = UI.dialogs.addTask.find('#calendar_addtask_details6').append(attendeeHtml);
473
474    if(objTask.attendee.length)
475        callbackAttendee();
476
477    /*
478     *   Opções de delegação do participante/organizer
479     */     
480    blkAddAtendee.find(".button.participant-delegate").button({
481        icons: {
482        primary: "ui-icon-transferthick-e-w"
483        },
484        text: false
485    }).click(function () {
486        if($(this).hasClass('attendee-permissions-change-button')){
487        if(!$(this).hasClass('disable')){
488            $(this).removeClass('attendee-permissions-change-button')   
489            .find('.ui-icon-transferthick-e-w').removeClass('attendee-permissions-change').end();               
490            blkAddAtendee.find('.block-add-attendee.search').addClass('hidden');
491            blkAddAtendee.find('.block-add-attendee.search dt').html('Adicionar outros contatos');
492        }
493        }else{                                 
494        $(this).addClass('attendee-permissions-change-button')   
495        .find('.ui-icon-transferthick-e-w').addClass('attendee-permissions-change').end();               
496        blkAddAtendee.find('.block-add-attendee.search dt').html('Delegar participação para');
497        blkAddAtendee.find('.block-add-attendee.search').removeClass('hidden');
498        blkAddAtendee.find('.block-add-attendee.search input.search').focus();
499        }
500    })
501    .addClass('tiny');
502
503    var dates = UI.dialogs.addTask.find('input.date').datepicker({
504        dateFormat: User.preferences.dateFormat.replace(/M/g, 'm').replace(/yyyy/g, 'yy'),
505        onSelect: function (selectedDate) {
506            updateMap();
507        }
508    });
509
510    UI.dialogs.addTask.find('input.time').timepicker({
511        closeText: 'Ok',
512        hourGrid: 4,
513        minuteGrid: 10,
514        ampm: ((User.preferences.hourFormat.length > 5) ? true : false),
515        timeFormat: "hh:mm tt",
516        onSelect: function (selectedDateTime) {
517            if (!(User.preferences.hourFormat.length == 5)) $(this).val(selectedDateTime.replace(/[\.]/gi, ""));
518            updateMap();
519        },
520        onClose: function (selectedDateTime) {
521            if (!(User.preferences.hourFormat.length == 5)) $(this).val(selectedDateTime.replace(/[\.]/gi, ""));
522        }
523    });
524   
525    UI.dialogs.addTask.find(".attendee-list-add .add-attendee-input input").Watermark("digite um email para convidar");
526    /*
527    * Trata a edição de um novo participante adicionado
528    */
529    var hasNewAttendee = false;
530
531    blkAddAtendee.find('.attendee-list-add .add-attendee-input span').click(function(data){
532        blkAddAtendee.find('.attendee-list-add .add-attendee-input input').keydown();
533    });
534
535    blkAddAtendee.find('.attendee-list-add .add-attendee-input input').keydown(function(event) {
536        if (event.keyCode == '13' && $(this).val() != '' || (event.keyCode == undefined && $(this).val() != '')) {
537            Encoder.EncodeType = "entity";
538            $(this).val(Encoder.htmlEncode($(this).val()));
539
540            newAttendeeEmail = false;
541            newAttendeeName  = false;
542            skipAddNewLine   = false;
543
544            var info = $(this).val();
545
546            /**
547            * email válido?
548            */
549            info.match(/^[\w!#$%&'*+\/=?^`{|}~-]+(\.[\w!#$%&'*+\/=?^`{|}~-]+)*@(([\w-]+\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])$/) ?
550            newAttendeeEmail = info : newAttendeeName = info;
551
552            /**
553            * 1) busca no banco para saber se o usuário já existe
554            *           1.1) se existe, atualiza as info na lista de participantes e nao abre o tooltip
555            *           1.2) se não existe
556            *                   a) salva como novo usuario externo no banco (apenas com email)
557            *                   b) exibe tooltip pedindo o nome
558            *                   c) se o usuário preenche tooltip e salva, atualiza com o nome o usuário recém criado
559            *                   d) se o usuário cancela o tooltip, fica o usuário salvo apenas com email e sem nome
560            */
561
562            var user = DataLayer.get('user', ["=", "mail", $(this).val()]);
563            if(!!user && user[0].id)
564                attendees[user[0].id] = {
565                    name: user[0].name
566                    };
567
568            /**
569            * guarda o último tooltip aberto referente à lista de participantes
570            */
571            lastEditAttendeeToolTip = [];
572
573            /**
574            * Valida email e salva um participante externo
575            */
576            var saveContact = function() {
577                Encoder.EncodeType = "entity";
578
579                var currentTip = $('.qtip-active');
580                newAttendeeName  = currentTip.find('input[name="name"]').val();
581                newAttendeeEmail = currentTip.find('input[name="mail"]').val();
582
583                if (!(!!newAttendeeEmail.match(/^[\w!#$%&'*+\/=?^`{|}~-]+(\.[\w!#$%&'*+\/=?^`{|}~-]+)*@(([\w-]+\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])$/))) {
584                    currentTip.find('.messages').removeClass('hidden').find('.message label').html('Email inválido.');
585                    return false;
586                }
587
588                DataLayer.put('user', {
589                    id:userId,
590                    name:newAttendeeName,
591                    mail:newAttendeeEmail,
592                    isExternal:isExternal
593                });
594
595                lastEditAttendeeToolTip.find('label')
596                .filter('.name').html(Encoder.htmlEncode(newAttendeeName)).attr('title', Encoder.htmlEncode(newAttendeeName)).end()
597                .filter('.mail').html(Encoder.htmlEncode(newAttendeeEmail)).attr('title', Encoder.htmlEncode(newAttendeeEmail));
598
599                blkAddAtendee.find('.attendee-list-add .add-attendee-input input').val('');
600                return true;
601            }
602
603            /**
604            * Formata e adequa um tootip abert para edição de um participante na lista
605            */
606            var onShowToolTip = function(arg0) {
607                $('.qtip-active .button.close').button({
608                    icons: {
609                        primary: "ui-icon-close"
610                    },
611                    text: false
612                });
613                $('.qtip-active .button').button()
614                .filter('.save').click(function(event, ui) {
615                    if(saveContact())
616                        lastEditAttendeeToolTip.qtip("destroy");
617                    else
618                        return false;
619                }).end()
620                .filter('.cancel').click(function(event, ui) {
621                    lastEditAttendeeToolTip.qtip("destroy");
622                })
623
624                /**
625                * Trata o ENTER no campo da tooltip, equivalente a salvar
626                * o novo convidado.
627                */
628                $('.qtip-active input').keydown(function(event) {
629                    if (event.keyCode == '13') {                                               
630                        if (saveContact())                                             
631                            lastEditAttendeeToolTip.qtip("destroy");
632
633                        lastEditAttendeeToolTip.qtip("destroy");
634                        event.preventDefault();
635                    }
636                })
637                .filter('[name="name"]').Watermark("informe o nome do contato").end()
638                .filter('[name="mail"]').Watermark("informe o email do contato");
639            }
640
641            /**
642            * Se o email digitado já foi adicionado na lista,
643            * o usuário deve ser avisado e um botão de edição deve ser exibido
644            */
645            if(blkAddAtendee.find('label.mail[title="' + newAttendeeEmail + '"]').length) {
646                hasNewAttendee  = false;
647                newAttendeeName = blkAddAtendee.find('label.mail[title="' + newAttendeeEmail + '"]').parents('li').find('label.name').attr('title');
648
649                blkAddAtendee.find('.email-validation').removeClass('hidden')
650                .find('.message label').html("O usuário acima já foi adicionado! <a class=\"small button\">Editar</a>")
651                .find(".button").button().click(function () {
652                    /**
653                    * Se o usuário optar por editar o participante anteriormente adicionado,
654                    * uma tooltip deve ser aberta para este participante, viabilizando a edição
655                    */
656                    blkAddAtendee.find("ul.attendee-list").scrollTo('label.mail[title="' + newAttendeeEmail + '"]');
657                    /**
658                    * Remove tooltip possivelmente existente
659                    */
660                    if (lastEditAttendeeToolTip.length && lastEditAttendeeToolTip.data('qtip'))
661                        lastEditAttendeeToolTip.qtip('destroy');
662
663                    lastEditAttendeeToolTip = blkAddAtendee.find('label.mail[title="' + newAttendeeEmail + '"]').parents('li');
664                    lastEditAttendeeToolTip.qtip({
665                        show: {
666                            ready: true,
667                            solo: true,
668                            when: {
669                                event: 'click'
670                            }
671                        },
672                    hide: false,
673                    content: {
674                        text: $('<div></div>').html( DataLayer.render( path+'templates/attendee_quick_edit.ejs', {
675                            attendee:{
676                                name:newAttendeeName,
677                                mail:newAttendeeEmail
678                            }
679                        } ) ),
680                    title: {
681                        text:'Detalhes do participante',
682                        button: '<a class="button close" href="#">close</a>'
683                    }
684                    },
685                    style: {
686                        name: 'blue',
687                        tip: {
688                            corner: 'leftMiddle'
689                        },
690                        border: {
691                            width: 4,
692                            radius: 8
693                        },
694                        width: {
695                            min: 230,
696                            max:230
697                        }
698                    },
699                position: {
700                    corner: {
701                        target: 'rightMiddle',
702                        tooltip: 'leftMiddle'
703                    },
704                    adjust: {
705                        x:0,
706                        y:0
707                    }
708                }
709                });
710            lastEditAttendeeToolTip.qtip("api").onShow = onShowToolTip;
711        });
712    skipAddNewLine = true;
713    } else {
714        hasNewAttendee  = true;
715        blkAddAtendee.find('.email-validation').addClass('hidden');
716    }
717
718
719    var isExternal = (!!user && !(!!user.isExternal)) ? 0 : 1;
720
721    /**
722    * Remove tooltip possivelmente existente
723    */
724    if (lastEditAttendeeToolTip.length && lastEditAttendeeToolTip.data('qtip'))
725        lastEditAttendeeToolTip.qtip('destroy');
726
727    userId = '';
728    var newAttendeeId = '';
729
730    if (user){
731        if (!skipAddNewLine) {
732            user[0].id =  DataLayer.put('participant', {
733                user: user[0].id,
734                isExternal: isExternal,
735                acl: 'r'
736            });
737            user[0].acl = 'r';
738            user[0].isDirty = !!!objTask.id;
739
740            blkAddAtendee.find('dd.attendee-list ul.attendee-list').append(
741                DataLayer.render(path+'templates/participants_add_itemlist.ejs', user)
742                )
743            .scrollTo('max');
744            callbackAttendee();
745        }
746
747        $(this).val('');
748
749    } else if (!skipAddNewLine) {
750        /**
751        * a) salva como novo usuario externo no banco (apenas com email) e...
752        * adiciona novo contato externo à lista de convidados
753        */
754
755        userId = DataLayer.put('user', {
756            name: newAttendeeName,
757            mail: newAttendeeEmail,
758            isExternal: isExternal
759        });
760        newAttendeeId = DataLayer.put('participant', {
761            user: userId,
762            isExternal: isExternal
763        });
764
765
766        blkAddAtendee.find('dd.attendee-list ul.attendee-list').append(
767            DataLayer.render(path+'templates/participants_add_itemlist.ejs', [{
768                id:newAttendeeId,
769                name: newAttendeeName,
770                mail: newAttendeeEmail,
771                isExternal: 1,
772                isDirty: !!!objTask.id
773                }])
774            ).scrollTo('max');
775        callbackAttendee();
776
777        /**
778        * Adiciona tootip para atualização dos dados do contato externo
779        * recém adicionado.
780        */
781        lastEditAttendeeToolTip = blkAddAtendee.find('dd.attendee-list li:last');
782        lastEditAttendeeToolTip.qtip({
783            show: {
784                ready: true,
785                solo: true,
786                when: {
787                    event: 'click'
788                }
789            },
790        hide: false,
791        content: {
792            text: $('<div></div>').html( DataLayer.render( path+'templates/attendee_quick_edit.ejs', {
793                attendee:{
794                    name:newAttendeeName,
795                    mail:newAttendeeEmail
796                }
797            } ) ),
798        title: {
799            text:'Detalhes do participante',
800            button: '<a class="button close" href="#">close</a>'
801        }
802        },
803        style: {
804            name: 'blue',
805            tip: {
806                corner: 'leftMiddle'
807            },
808            border: {
809                width: 4,
810                radius: 8
811            },
812            width: {
813                min: 230,
814                max:230
815            }
816        },
817    position: {
818        corner: {
819            target: 'rightMiddle',
820            tooltip: 'leftMiddle'
821        },
822        adjust: {
823            x:0,
824            y:0
825        }
826    }
827    });
828
829    lastEditAttendeeToolTip.qtip("api").onShow = onShowToolTip;
830
831    $(this).val('');
832
833
834    }
835    event.preventDefault();
836    }
837
838    });
839
840    blkAddAtendee.find('.add-attendee-search .ui-icon-search').click(function (task) {
841        blkAddAtendee.find('.add-attendee-search input').keydown();
842    });
843
844    blkAddAtendee.find('.add-attendee-search input').keydown(function (task) {
845
846        if (task.keyCode == '13' || typeof (task.keyCode) == 'undefined') {
847            var result = DataLayer.get('user', ["*", "name", $(this).val()], true);
848
849            /**
850             * TODO: trocar por template
851             */
852            blkAddAtendee.find('ul.search-result-list').empty().css('overflow', 'hidden');
853            if (!result) {
854                blkAddAtendee.find('ul.search-result-list').append('<li><label class="empty">Nenhum resultado encontrado.</label></li>');
855            }
856
857            for (i = 0; i < result.length; i++)
858            result[i].enabled = (blkAddAtendee.find('dd.attendee-list ul.attendee-list label.mail[title="' + result[i].mail + '"]').length) ? false : true;
859
860            blkAddAtendee.find('ul.search-result-list').append(DataLayer.render(path + 'templates/participants_search_itemlist.ejs', result));
861
862            blkAddAtendee.find('ul.search-result-list li').click(function (task, ui) {
863                if ($(task.target).is('input')) {
864                    old_item = $(task.target).parents('li');
865                    newAttendeeId = DataLayer.put('participant', {
866                        user: old_item.find('.id').html(),
867                        isExternal: old_item.find('.isExternal').html()
868                    });
869
870                    attendees[old_item.find('.id').html()] = old_item.find('.name').html();
871
872                    blkAddAtendee.find('dd.attendee-list ul.attendee-list').append(DataLayer.render(path + 'templates/participants_add_itemlist.ejs', [{
873                        id: newAttendeeId,
874                        name: old_item.find('.name').html(),
875                        mail: old_item.find('.mail').html(),
876                        isExternal: old_item.find('.isExternal').html(),
877                        notEvent: true,
878                        isDirty: !! !objTask.id,
879                                                isDelegate: !!(objTask.me.id != objTask.organizer.id)
880                    }])).scrollTo('max');
881                    /**
882                     * Delegação de participação de um participante com permissão apenas de leitura
883                     *
884                     */
885                    if (objTask.me.id != objTask.organizer.id) {
886
887                        blkAddAtendee.find('.block-add-attendee.search').addClass('hidden');
888                        blkAddAtendee.find('.block-add-attendee.search dt').html('Adicionar outros contatos');
889
890                        blkAddAtendee.find('.status option').toggleClass('hidden');
891                        blkAddAtendee.find('option[value=5]').attr('selected', 'selected').trigger('change');
892                        blkAddAtendee.find('.request-update').removeClass('hidden');
893
894                        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());
895
896                        blkAddAtendee.find('.me .participant-delegate').addClass('disable ui-button-disabled ui-state-disabled');
897                        blkAddAtendee.find(".button.close").button({
898                            icons: {
899                                primary: "ui-icon-close"
900                            },
901                            text: false
902                        }).click(function () {
903
904                            $(this).parents('li').find('input[name="delegatedFrom[]"]').val('');
905                            blkAddAtendee.find('.request-update').addClass('hidden');
906                            blkAddAtendee.find('.status option').toggleClass('hidden');
907                            blkAddAtendee.find('option[value=1]').attr('selected', 'selected').trigger('change');
908                            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();
909
910                            DataLayer.remove('participant', $(this).parents('li').find('[type=checkbox]').val());
911                            $(this).parents('li').remove();
912                        }).addClass('tiny');
913                    } else {
914                        callbackAttendee();
915                        old_item.remove();
916                    }
917                }
918            });
919
920            event.preventDefault();
921        }
922    });
923
924    UI.dialogs.addTask.find('.row.fileupload-buttonbar-task .button').filter('.delete').button({
925        icons: {
926            primary: "ui-icon-close"
927        },
928        text: 'Excluir'
929    }).click(function () {
930        $.Zebra_Dialog('Tem certeza que deseja excluir todos anexos?', {
931            'type': 'question',
932            'overlay_opacity': '0.5',
933            'buttons': ['Sim', 'Não'],
934            'onClose': function (clicked) {
935                if (clicked == 'Sim') {
936
937                    var ids = [];
938                    $.each($('.attachment-list input'), function (i, input) {
939                        DataLayer.remove('schedulableToAttachment', {
940                            filter: ['=', 'id', '' + input.value]
941                        });
942                    });
943                    $('div.new-task-win .attachment-list input').remove();
944                    $('div.new-task-win .row.fileupload-buttonbar .attachments-list p').remove();
945                    $('div.new-task-win .btn-danger.delete').addClass('hidden');
946                }
947            }
948        });
949    }).end().filter('.close').button({
950        icons: {
951            primary: "ui-icon-close"
952        },
953        text: false
954    }).click(function () {
955        DataLayer.remove('schedulableToAttachment', $(this).parents('p').find('input[name="fileId[]"]').val());
956        $(this).parents('p').remove();
957    }).end().filter('.downlaod-archive').button({
958        icons: {
959            primary: "ui-icon-arrowthickstop-1-s"
960        },
961        text: false
962    });
963
964    extendsFileupload('task', path);
965
966    disponibily(objTask, path, attendees, 'task');
967
968    UI.dialogs.addTask.find('.button-add-alarms').click(function () {
969        var li_attach = DataLayer.render(path + 'templates/alarms_add_itemlist.ejs', {
970            type: 1
971        });
972
973        jQuery('.task-alarms-list').append(li_attach).find('.button.remove').button({
974            text: false,
975            icons: {
976                primary: 'ui-icon-close'
977            }
978        }).click(function (el) {
979            $(this).parent().remove().find('li').is(':empty')
980        });
981        // valicacao de campos numericos
982        $('.number').numeric();
983    });
984
985    UI.dialogs.addTask.find(':input').change(function(event){
986        if (event.keyCode != '27' && event.keyCode != '13')
987            canDiscardTaskDialog = false;
988    }).keydown(function(event){
989        if (event.keyCode != '27' && event.keyCode != '13')
990            canDiscardTaskDialog = false;
991    });
992
993    UI.dialogs.addTask.dialog('open');
994}
Note: See TracBrowser for help on using the repository browser.