source: branches/2.5/prototype/modules/calendar/js/calendar.shared.js @ 8232

Revision 8232, 20.0 KB checked in by douglas, 11 years ago (diff)

Ticket #0000 - Copiadas as alterações do Trunk. Versão final 2.5.1.

Line 
1function show_modal_shared(calendarId){
2    $('.qtip.qtip-blue').remove();
3
4    var html = DataLayer.render('templates/shared_calendar.ejs', {
5        calendar: Calendar.calendars,
6        signature : Calendar.signatures
7    });
8       
9    //Variaval global para manipulação dos usuários
10    //melhor perforface
11    currentUsers = {};
12    currentUsers[User.me.id] = true;
13    changePublic = false;
14       
15    if (!UI.dialogs.sharedCalendar) {
16        UI.dialogs.sharedCalendar = jQuery('#calendarShared').append('<div title="Compatilhamento de Agenda" class="shared-calendar active"> <div>').find('.shared-calendar.active').html(html).dialog({
17            resizable: false,
18            modal:true,
19            autoOpen: false,
20            width:620,
21            position: 'center',
22            close: function(event, ui) {
23                //Implementações de cancelar
24                DataLayer.rollback('calendarToPermission');
25                currentUsers = {};
26            }
27        });
28    } else {
29        UI.dialogs.sharedCalendar.html(html);
30    }
31               
32    /*Seleciona a agenda selecionada para compartilhamento*/
33    UI.dialogs.sharedCalendar.find('option[value="'+calendarId+'"]').attr('selected','selected').trigger('change');
34               
35    UI.dialogs.sharedCalendar.find('input[name="isPublic"]').change(function(event){
36        $(this).parent().find('.free-busy').toggleClass('hidden');
37        changePublic = changePublic ? false: true;
38    });
39               
40    UI.dialogs.sharedCalendar.find('.button').button()
41    .filter('.cancel').click(function(evt){
42        UI.dialogs.sharedCalendar.dialog("close");
43    }).end()
44    .filter('.save').click(function(evt){
45        //TODO - API ainda não suporta
46        //UI.dialogs.sharedCalendar.find('form').submit();
47        var calendarSelected = UI.dialogs.sharedCalendar.find('option:selected').val();
48        var save = function(){
49            if($('li.not-user').length == 0)
50                $.each(UI.dialogs.sharedCalendar.find('.user-list li.new'), function( i , element ){
51                    var user = $(element).find('input[name="user[]"]').val();
52                    var acl = $(element).find('input[name="attendeeAcl[]"]').val();
53                    if(acl == "")
54                        return true;
55                    DataLayer.put('calendarToPermission', {
56                        calendar: calendarSelected,
57                        type: 0,
58                        user: user,
59                        acl: acl
60                    });
61                });
62                               
63            $.each(UI.dialogs.sharedCalendar.find('.user-list li.current'), function( i , element ){
64                var id = $(element).find('input[type="checkbox"]').val();
65                var acl = $(element).find('input[name="attendeeAcl[]"]').val();
66                if(acl == "")
67                    DataLayer.remove('calendarToPermission', id);
68                else
69                    DataLayer.put('calendarToPermission', {
70                        calendar: calendarSelected,
71                        type: 0,
72                        id: id,
73                        acl: acl
74                    });
75            });
76
77            DataLayer.commit(false, false, function(result){
78
79            /*
80             * Force clean cache
81             * */
82            DataLayer.storage.cache = {};
83            UI.dialogs.sharedCalendar.dialog("close");
84
85        });
86
87        };
88
89        //Trata a criação de um acesso público a agenda
90        if(changePublic){
91            if(UI.dialogs.sharedCalendar.find('input[name="isPublic"]').is(':checked')){
92                var acl = UI.dialogs.sharedCalendar.find('input[name="busy"]').is(':checked') ? 'b' : 'w';
93                DataLayer.put('calendarToPermission', {
94                    calendar: calendarSelected,
95                    type: '1',
96                    user: '0',
97                    acl: acl
98                });
99            }else{
100                //TODO - remover quando for implementado remove com criteria
101                var permission = DataLayer.get('calendarToPermission', {
102                    filter: ['AND', ['=', 'calendar', calendarId], ['=', 'user', '0']]
103                }, true);
104                if($.isArray(permission))
105                    permission = permission[0];
106
107                DataLayer.remove('calendarToPermission', permission.id);
108            }
109        }
110        if(!!UI.dialogs.sharedCalendar.find('.user-list li input[name="attendeeAcl[]"][value=""]').length){
111            $.Zebra_Dialog('Alguns usuários estão sem permissões e serão automáticamente removidos, deseja continuar ?', {
112                'type':     'question',
113                'overlay_opacity': '0.5',
114                'buttons':  ['Continuar', 'Cancelar'],
115                'onClose':  function(clicked) {
116                    if(clicked == 'Continuar') {
117                        save();
118                    }
119                }
120            });
121        }else
122            save();             
123    });
124               
125    UI.dialogs.sharedCalendar.find('.add-user-search .ui-icon-search').click(function(event) {
126        UI.dialogs.sharedCalendar.find('.add-user-search input').keydown();
127    });
128               
129    var incompatibleAcl = function (obj, acls, buttons){
130        for (var i = 0; i < acls.length; i++){
131            var objremove = obj.parent().find('.'+buttons[i]+'');
132            if(objremove.hasClass('attendee-permissions-change-button'))
133                changeAcl(objremove, acls[i]);
134        }
135    }
136
137    var removeAcl = function(current, acl){
138        var acls = '';
139        for(var i = 0; i < current.length; i++)
140            if(current.charAt(i) != acl)
141                acls += current.charAt(i) ;
142        return acls;
143    }
144
145    var dependsAcl = function(obj, acls, buttons){
146        for (var i = 0; i < acls.length; i++){
147            var objremove = obj.parent().find('.'+buttons[i]+'');
148            if(!objremove.hasClass('attendee-permissions-change-button'))
149                changeAcl(objremove, acls[i]);
150        }
151    }
152               
153    var changeAcl = function(obj, acl){
154        if(obj.hasClass('attendee-permissions-change-button')){
155            obj.parent().siblings('input[name="attendeeAcl[]"]').val(removeAcl( obj.parent().siblings('input[name="attendeeAcl[]"]').val(), acl)) ;
156        }else{
157            var acls = obj.parent().siblings('input[name="attendeeAcl[]"]').val();
158            obj.parent().siblings('input[name="attendeeAcl[]"]').val(acls + acl);
159        }
160        obj.toggleClass('attendee-permissions-change-button')
161        .find('span:first').toggleClass('attendee-permissions-change').end(); 
162    }
163               
164               
165    UI.dialogs.sharedCalendar.find('.add-user-search input').keydown(function(event) {
166        if(event.keyCode == '13' || typeof(event.keyCode) == 'undefined') {                                             
167            var result = DataLayer.get('user', ["*", "name", $(this).val()], true);
168            /**
169                                * TODO: trocar por template
170                                */
171            UI.dialogs.sharedCalendar.find('ul.search-result-list').empty().css('overflow', 'hidden');
172            if (!result) {
173                UI.dialogs.sharedCalendar.find('ul.search-result-list').append('<li><label class="empty">Nenhum resultado encontrado.</label></li>');
174            }
175
176            for(i=0; i<result.length; i++)
177                result[i].enabled = currentUsers[result[i].id] ? false : true;
178
179            UI.dialogs.sharedCalendar.find('ul.search-result-list').append(DataLayer.render( 'templates/participants_search_itemlist.ejs', result));
180
181            UI.dialogs.sharedCalendar.find('ul.search-result-list li').click(function(event, ui){
182                if ($(event.target).is('input')) {
183                    old_item = $(event.target).parents('li');
184                    var id = old_item.find('.id').html();
185                                               
186                    currentUsers [id] = {
187                        id: id,
188                        name: old_item.find('.name').html(),
189                        mail: old_item.find('.mail').html()
190                    };
191                                                                                       
192                    UI.dialogs.sharedCalendar.find('dd.user-list ul.user-list')
193                    .append(DataLayer.render('templates/user_shared_add_itemlist.ejs', [{
194                        id: id,
195                        name: currentUsers [id] .name,
196                        mail: currentUsers [id] .mail
197                    }]))
198                    .scrollTo('max');
199                                               
200                    $('li.not-user').remove();
201                    callbackSharedCotactsAdd();
202                    old_item.remove();
203                }
204            });
205            event.preventDefault();
206        }
207    });
208
209    var callbackSharedCotactsAdd = function(event){
210        UI.dialogs.sharedCalendar.find('.button').filter(".read.new").button({
211            icons: {
212                primary: "ui-icon-circle-zoomin"
213            },
214            text: false
215        }).click(function () {
216            incompatibleAcl($(this), ['b'], ['busy']);
217            changeAcl($(this), 'r');
218        })
219        .addClass('tiny disable ui-button-disabled ui-state-disabled')
220        .removeClass('new').end()
221                       
222        .filter(".write.new").button({
223            icons: {
224                primary: "ui-icon-key"
225            },
226            text: false
227        }).click(function () {
228            incompatibleAcl($(this), ['b'], ['busy']);
229            dependsAcl($(this), ['r'], ['read']);
230            changeAcl($(this), 'w');
231        })
232        .addClass('tiny disable ui-button-disabled ui-state-disabled')
233        .removeClass('new').end()
234                       
235        .filter(".remove.new").button({
236            icons: {
237                primary: "ui-icon-trash"
238            },
239            text: false
240        }).click(function () {
241            incompatibleAcl($(this), ['b'], ['busy']);
242            dependsAcl($(this), ['r'], ['read']);
243            changeAcl($(this), 'd');
244        })
245        .addClass('tiny disable ui-button-disabled ui-state-disabled')
246        .removeClass('new').end()
247                       
248        .filter(".busy.new").button({
249            icons: {
250                primary: "ui-icon-clock"
251            },
252            text: false
253        }).click(function () {
254            //Remove incompativbilidade de acls
255            incompatibleAcl($(this), ['r', 'w', 'd', 's' ], ['read', 'write', 'remove', 'shared']);
256            changeAcl($(this), 'b');
257        })
258        .addClass('tiny disable ui-button-disabled ui-state-disabled')
259        .removeClass('new').end()
260                       
261        .filter(".shared.new").button({
262            icons: {
263                primary: "ui-icon-transferthick-e-w"
264            },
265            text: false
266        }).click(function () {
267            incompatibleAcl($(this), ['b'], ['busy']);
268            dependsAcl($(this), ['r'], ['read']);
269            changeAcl($(this), 's');
270        })
271        .addClass('tiny disable ui-button-disabled ui-state-disabled')
272        .removeClass('new').end()
273
274        .filter(".close.new").button({
275            icons: {
276                primary: "ui-icon-close"
277            },
278            text: false
279        }).click(function () {
280            currentUsers[$(this).parents().find('input[name="user[]"]').val()] = false;
281            //remove permissão
282            if($(this).parents('li.current').length)
283                DataLayer.remove('calendarToPermission', $(this).parents('li.current').find('input[type="checkbox"]').val());
284                               
285            $(this).parents('li').remove();
286        })
287        .addClass('tiny disable ui-button-disabled ui-state-disabled')
288        .removeClass('new').end();
289
290        UI.dialogs.sharedCalendar.find('.user-list li').hover(
291            function () {
292                $(this).addClass("hover-user");
293                $(this).find('.button').removeClass('disable ui-button-disabled ui-state-disabled').end()
294                .find('.user-acls-shared-calendar').addClass('hover-user');
295            },
296            function () {
297                $(this).removeClass("hover-user");
298                $(this).find('.button').addClass('disable ui-button-disabled ui-state-disabled').end()
299                .find('.user-acls-shared-calendar').removeClass('hover-user');;
300            }
301            );         
302    }
303
304    //Carrega os dados já cadastrados
305    var loadOldData = function (calendar)
306    {
307        UI.dialogs.sharedCalendar.find('dd.user-list ul.user-list').empty();
308
309        var dataCurrent = DataLayer.get('calendarToPermission:detail', {
310            filter: ['=','calendar', calendar]  ,
311            criteria: {
312                deepness: 2
313            }
314        });
315
316        if(dataCurrent){
317            for(var i = 0; i < dataCurrent.length; i++){
318                if(dataCurrent[i].user == "0"){
319                    UI.dialogs.sharedCalendar.find('input[name="isPublic"]').attr('checked', 'checked')
320                        .parent().find('.free-busy').toggleClass('hidden');
321                    if(dataCurrent[i].acl['busy'])
322                        UI.dialogs.sharedCalendar.find('input[name="busy"]').attr('checked', 'checked');
323                }else{
324                    currentUsers[dataCurrent[i].user.id] = true;
325
326                    UI.dialogs.sharedCalendar.find('dd.user-list ul.user-list')
327                        .append(DataLayer.render('templates/user_shared_add_itemlist.ejs', [{
328                            id: dataCurrent[i].user.id,
329                            name: dataCurrent[i].user.name,
330                            mail: dataCurrent[i].user.mail,
331                            acl:dataCurrent[i].acl,
332                            aclValue: dataCurrent[i].aclValues,
333                            current: true,
334                            idPermission: dataCurrent[i].id
335                        }]))
336                        .scrollTo('max');
337                    $('li.not-user').remove();
338                    callbackSharedCotactsAdd();
339
340                    for (var f in dataCurrent[i].acl){
341                        if(dataCurrent[i].acl[f]){
342                            UI.dialogs.sharedCalendar.find('.'+f+':last').toggleClass('attendee-permissions-change-button')
343                                .find('span:first').toggleClass('attendee-permissions-change').end();
344                        }
345                    }
346                }
347            }
348        }
349    }
350
351    loadOldData(calendarId);
352
353    //Bind calendar select change
354    var select = UI.dialogs.sharedCalendar.find('select[name="calendar"]');
355    select.change(function() {
356        loadOldData(select.val());
357    });
358
359    UI.dialogs.sharedCalendar.dialog('open');
360}
361
362function show_modal_search_shared(){
363    $('.qtip.qtip-blue').remove();
364
365    var html = DataLayer.render('templates/shared_calendar.ejs', {});   
366       
367    //Variaval global para manipulação dos usuários
368    //melhor perforface
369    currentCalendars = {};
370       
371    if (!UI.dialogs.sharedCalendar) {
372        UI.dialogs.sharedCalendar = jQuery('#calendarShared').append('<div title="Pesquisar Agendas" class="shared-calendar active"> <div>').find('.shared-calendar.active').html(html).dialog({
373            resizable: false,
374            modal:true,
375            autoOpen: false,
376            width:620,
377            position: 'center',
378            close: function(event, ui) {
379                //Implementações de cancelar :D
380                currentCalendars = {};
381                $('.signed-calendars').find('.calendar-shared-search input').val('').Watermark('Pesquisar agendas...');
382            }
383        });
384    } else {
385        UI.dialogs.sharedCalendar.html(html);
386    }
387       
388    UI.dialogs.sharedCalendar.find('.button').button()
389    .filter('.cancel').click(function(evt){
390        DataLayer.rollback('calendarSignature');
391        UI.dialogs.sharedCalendar.dialog("close");
392    }).end()
393    .filter('.save').click(function(evt){
394        $.each(UI.dialogs.sharedCalendar.find('.user-list li.new'), function( i , element ){
395            var idPermission = $(element).find('input[name="idpermission[]"]').val();
396            var calendarId = $(element).find('input[name="calendar[]"]').val();
397            var type = parseInt($(element).find('input[name="type[]"]').val());
398            DataLayer.put('calendarSignature', DataLayer.merge({
399                calendar: calendarId,
400                isOwner: 0,
401                user: User.me.id,
402                fontColor: '120d0d',
403                backgroundColor: (!!type ? 'fbec88' : '8c8c8c'),
404                borderColor: (!!type ? 'fad24e' : '120d0d')
405            }, !!idPermission ? {
406                id: idPermission
407            } : {} ));
408        });
409
410        DataLayer.commit( false, false, function( received ){
411            delete Calendar.currentViewKey;
412            Calendar.load();
413            refresh_calendars();
414        });
415       
416        UI.dialogs.sharedCalendar.dialog("close");
417               
418    });
419               
420    UI.dialogs.sharedCalendar.find('.add-user-search .ui-icon-search').click(function(event) {
421        UI.dialogs.sharedCalendar.find('.add-user-search input').keydown();
422    });
423       
424    UI.dialogs.sharedCalendar.find('.add-user-search input').keydown(function(event) {
425        if(event.keyCode == '13' || typeof(event.keyCode) == 'undefined') {                                             
426            var result = DataLayer.get('calendarToPermission', {
427                filter: ['AND', ['=','user',User.me.id],   ['OR', ['i*','name',$(this).val()], ["i*", "description", $(this).val()]]]  ,
428                criteria: {
429                    deepness: 2
430                }
431            }, true);
432            var resultPublic = DataLayer.get('calendarToPermission', {
433                filter: ['AND', ['=','type',1], ['OR', ['i*','name',$(this).val()], ["i*", "description", $(this).val()]], ['!IN','calendar', Calendar.calendarIds]]  ,
434                criteria: {
435                    deepness: 2
436                }
437            }, true);
438
439            /**
440    * TODO: trocar por template
441    */
442            UI.dialogs.sharedCalendar.find('ul.search-result-list').empty().css('overflow', 'hidden');
443            if (!result && !resultPublic) {
444                UI.dialogs.sharedCalendar.find('ul.search-result-list').append('<li><label class="empty">Nenhum resultado encontrado.</label></li>');
445            }
446                               
447            if(resultPublic){
448                var notConflict = [];
449                var conflit = false;
450                for(var i = 0; i < resultPublic.length; i++){
451                    for(var j = 0; j < result.length; j++){
452                        if(resultPublic[i].id == result[j].calendar.id)
453                            conflit = true;
454                    }
455                    if(!conflit){
456                        notConflict.push(resultPublic[i]);
457                        conflit = false;
458                    }
459                }
460            }
461            resultPublic = notConflict;
462                               
463            var resultNormalize = [];
464            for(i=0; i<result.length; i++){
465                resultNormalize.push({
466                    id: result[i].calendar.id,
467                    name:result[i].calendar.name,
468                    mail: result[i].calendar.description,
469            owner: result[i].owner,
470                    type: 0
471                })
472                resultNormalize[(resultNormalize.length - 1)].enabled = currentCalendars[result[i].id] ? false : true;
473            }
474            if(resultPublic)
475                for(i=0; i<resultPublic.length; i++){
476                    resultNormalize.push({
477                        id: resultPublic[i].calendar.id,
478                        name:resultPublic[i].calendar.name,
479                        mail: resultPublic[i].calendar.description,
480                        owner: resultPublic[i].owner,
481                        type: 1
482                    })
483                    resultNormalize[(resultNormalize.length - 1)].enabled = currentCalendars[resultPublic[i].id] ? false : true;
484                }
485                               
486            UI.dialogs.sharedCalendar.find('ul.search-result-list').append(DataLayer.render( 'templates/calendar_search_itemlist.ejs', resultNormalize));
487
488            UI.dialogs.sharedCalendar.find('ul.search-result-list li').click(function(event, ui){
489                if ($(event.target).is('input')) {
490                    old_item = $(event.target).parents('li');
491                    var id = old_item.find('.id').html();
492                                               
493                    for(var i = 0; i<resultNormalize.length; i++){
494                        if(resultNormalize[i].id == id)
495                            currentCalendars[id] = {
496                                id: id,
497                                name: resultNormalize[i].name + ' ( '+resultNormalize[i].owner.uid +' )',
498                                description: resultNormalize[i].description,
499                                type: resultNormalize[i].type,
500                                isCalendar: true
501                            };
502                    }
503
504                    UI.dialogs.sharedCalendar.find('dd.calendar-list ul.user-list')
505                    .append(DataLayer.render('templates/user_shared_add_itemlist.ejs', [currentCalendars[id]]))
506                    .scrollTo('max');
507                                               
508                    $('li.not-user').remove();
509                    callbackSharedCalendarAdd();
510                    old_item.remove();
511                }
512            });
513            event.preventDefault();
514        }
515    });
516               
517    var callbackSharedCalendarAdd = function(event){
518               
519        UI.dialogs.sharedCalendar.find('.button').filter(".close.new").button({
520            icons: {
521                primary: "ui-icon-close"
522            },
523            text: false
524        }).click(function () {
525            var id = $(this).parents('li').find('input[name="idPermission"]').val();
526            currentCalendars[$(this).parents().find('input[name="calendar[]"]').val()] = false;
527            $(this).parents('li').remove();
528            if(!!id)
529                DataLayer.remove('calendarSignature', id);
530        })
531        .addClass('tiny disable ui-button-disabled ui-state-disabled')
532        .removeClass('new').end();
533
534        UI.dialogs.sharedCalendar.find('.user-list li').hover(
535            function () {
536                $(this).addClass("hover-user");
537                $(this).find('.button').removeClass('disable ui-button-disabled ui-state-disabled').end()
538                .find('.user-acls-shared-calendar').addClass('hover-user');
539            },
540            function () {
541                $(this).removeClass("hover-user");
542                $(this).find('.button').addClass('disable ui-button-disabled ui-state-disabled').end()
543                .find('.user-acls-shared-calendar').removeClass('hover-user');;
544            }
545            );         
546    }
547
548    //Carrega os dados já cadastrados
549    for (var i = 0; i < Calendar.signatures.length; i++)
550        if(Calendar.signatures[i].isOwner == "0"){
551
552        /*
553        * Verificar se o Owner é um objeto caso ao contrário é realizado a busca e adicionado ao mesmo o uid
554        * */
555        if (Calendar.signatures[i].permission.owner != "object"){
556
557            var result = DataLayer.get('calendarToPermission', {
558                filter: ['AND', ['=','id', Calendar.signatures[i].permission.id]]  ,
559                criteria: {
560                    deepness: 2
561                }
562            }, true);
563
564            Calendar.signatures[i].permission.owner = {};
565            Calendar.signatures[i].permission.owner['uid'] = result[0].owner.uid;
566
567        }
568
569            var dataCurrent = Calendar.signatures[i].calendar;
570            currentCalendars[Calendar.signatures[i].permission.id] = {
571                id: dataCurrent.id,
572                idPermission:Calendar.signatures[i].id ,
573                name: dataCurrent.name + ' ( ' + Calendar.signatures[i].permission.owner.uid + ' )',
574                description: dataCurrent.description,
575                type: Calendar.signatures[i].permission.type,
576                isCalendar: true,
577                current: true
578            };
579                       
580            UI.dialogs.sharedCalendar.find('dd.calendar-list ul.user-list')
581            .append(DataLayer.render('templates/user_shared_add_itemlist.ejs', [currentCalendars[Calendar.signatures[i].permission.id]]))
582            .scrollTo('max');
583                               
584            $('li.not-user').remove();
585            callbackSharedCalendarAdd();
586        }
587               
588    UI.dialogs.sharedCalendar.dialog('open');
589}
590
591function cancel_signature(signatureId){
592    $.Zebra_Dialog('Confirma a remoção desta assinatura ?', {
593        'type':     'question',
594        'overlay_opacity': '0.5',
595        'buttons':  ['Sim', 'Não'],
596        'onClose':  function(clicked) {
597                if(clicked == 'Sim'){
598                        DataLayer.remove('calendarSignature', ''+signatureId);
599                        DataLayer.commit( false, false, function( received ){
600                                delete Calendar.currentViewKey;
601                                Calendar.load();
602                                refresh_calendars();
603                        });
604            }
605        }
606    });
607}
Note: See TracBrowser for help on using the repository browser.