source: trunk/prototype/modules/calendar/js/calendar.shared.js @ 8076

Revision 8076, 19.1 KB checked in by douglasz, 11 years ago (diff)

Ticket #3416 - Problema ao compartilhar agenda e deixa-la publica ao mesmo tempo.

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 dataCurrent = DataLayer.get('calendarToPermission:detail', {
306        filter: ['=','calendar', calendarId]  ,
307        criteria: {
308            deepness: 2
309        }
310    });
311    if(dataCurrent){
312        for(var i = 0; i < dataCurrent.length; i++){
313            if(dataCurrent[i].user == "0"){
314                UI.dialogs.sharedCalendar.find('input[name="isPublic"]').attr('checked', 'checked')
315                .parent().find('.free-busy').toggleClass('hidden');
316                if(dataCurrent[i].acl['busy'])
317                    UI.dialogs.sharedCalendar.find('input[name="busy"]').attr('checked', 'checked');
318            }else{
319                currentUsers[dataCurrent[i].user.id] = true;
320
321                UI.dialogs.sharedCalendar.find('dd.user-list ul.user-list')
322                .append(DataLayer.render('templates/user_shared_add_itemlist.ejs', [{
323                    id: dataCurrent[i].user.id,
324                    name: dataCurrent[i].user.name,
325                    mail: dataCurrent[i].user.mail,
326                    acl:dataCurrent[i].acl,
327                    aclValue: dataCurrent[i].aclValues,
328                    current: true,
329                    idPermission: dataCurrent[i].id
330                }]))
331                .scrollTo('max');
332                $('li.not-user').remove();
333                callbackSharedCotactsAdd();
334
335                for (var f in dataCurrent[i].acl){
336                    if(dataCurrent[i].acl[f]){
337                        UI.dialogs.sharedCalendar.find('.'+f+':last').toggleClass('attendee-permissions-change-button')
338                        .find('span:first').toggleClass('attendee-permissions-change').end(); 
339                    }
340                }
341            }
342        }
343    }
344    UI.dialogs.sharedCalendar.dialog('open');
345}
346
347function show_modal_search_shared(){
348    $('.qtip.qtip-blue').remove();
349
350    var html = DataLayer.render('templates/shared_calendar.ejs', {});   
351       
352    //Variaval global para manipulação dos usuários
353    //melhor perforface
354    currentCalendars = {};
355       
356    if (!UI.dialogs.sharedCalendar) {
357        UI.dialogs.sharedCalendar = jQuery('#calendarShared').append('<div title="Pesquisar Agendas" class="shared-calendar active"> <div>').find('.shared-calendar.active').html(html).dialog({
358            resizable: false,
359            modal:true,
360            autoOpen: false,
361            width:620,
362            position: 'center',
363            close: function(event, ui) {
364                //Implementações de cancelar :D
365                currentCalendars = {};
366                $('.signed-calendars').find('.calendar-shared-search input').val('').Watermark('Pesquisar agendas...');
367            }
368        });
369    } else {
370        UI.dialogs.sharedCalendar.html(html);
371    }
372       
373    UI.dialogs.sharedCalendar.find('.button').button()
374    .filter('.cancel').click(function(evt){
375        DataLayer.rollback('calendarSignature');
376        UI.dialogs.sharedCalendar.dialog("close");
377    }).end()
378    .filter('.save').click(function(evt){
379        $.each(UI.dialogs.sharedCalendar.find('.user-list li.new'), function( i , element ){
380            var idPermission = $(element).find('input[name="idpermission[]"]').val();
381            var calendarId = $(element).find('input[name="calendar[]"]').val();
382            var type = parseInt($(element).find('input[name="type[]"]').val());
383            DataLayer.put('calendarSignature', DataLayer.merge({
384                calendar: calendarId,
385                isOwner: 0,
386                user: User.me.id,
387                fontColor: '120d0d',
388                backgroundColor: (!!type ? 'fbec88' : '8c8c8c'),
389                borderColor: (!!type ? 'fad24e' : '120d0d')
390            }, !!idPermission ? {
391                id: idPermission
392            } : {} ));
393        });
394
395        DataLayer.commit( false, false, function( received ){
396            delete Calendar.currentViewKey;
397            Calendar.load();
398            refresh_calendars();
399        });
400       
401        UI.dialogs.sharedCalendar.dialog("close");
402               
403    });
404               
405    UI.dialogs.sharedCalendar.find('.add-user-search .ui-icon-search').click(function(event) {
406        UI.dialogs.sharedCalendar.find('.add-user-search input').keydown();
407    });
408       
409    UI.dialogs.sharedCalendar.find('.add-user-search input').keydown(function(event) {
410        if(event.keyCode == '13' || typeof(event.keyCode) == 'undefined') {                                             
411            var result = DataLayer.get('calendarToPermission', {
412                filter: ['AND', ['=','user',User.me.id],   ['OR', ['i*','name',$(this).val()], ["i*", "description", $(this).val()]]]  ,
413                criteria: {
414                    deepness: 2
415                }
416            }, true);
417            var resultPublic = DataLayer.get('calendarToPermission', {
418                filter: ['AND', ['=','type',1], ['OR', ['i*','name',$(this).val()], ["i*", "description", $(this).val()]], ['!IN','calendar', Calendar.calendarIds]]  ,
419                criteria: {
420                    deepness: 2
421                }
422            }, true);
423
424            /**
425    * TODO: trocar por template
426    */
427            UI.dialogs.sharedCalendar.find('ul.search-result-list').empty().css('overflow', 'hidden');
428            if (!result && !resultPublic) {
429                UI.dialogs.sharedCalendar.find('ul.search-result-list').append('<li><label class="empty">Nenhum resultado encontrado.</label></li>');
430            }
431                               
432            if(resultPublic){
433                var notConflict = [];
434                var conflit = false;
435                for(var i = 0; i < resultPublic.length; i++){
436                    for(var j = 0; j < result.length; j++){
437                        if(resultPublic[i].id == result[j].calendar.id)
438                            conflit = true;
439                    }
440                    if(!conflit){
441                        notConflict.push(resultPublic[i]);
442                        conflit = false;
443                    }
444                }
445            }
446            resultPublic = notConflict;
447                               
448            var resultNormalize = [];
449            for(i=0; i<result.length; i++){
450                resultNormalize.push({
451                    id: result[i].calendar.id,
452                    name:result[i].calendar.name,
453                    mail: result[i].calendar.description,
454            owner: result[i].owner,
455                    type: 0
456                })
457                resultNormalize[(resultNormalize.length - 1)].enabled = currentCalendars[result[i].id] ? false : true;
458            }
459            if(resultPublic)
460                for(i=0; i<resultPublic.length; i++){
461                    resultNormalize.push({
462                        id: resultPublic[i].calendar.id,
463                        name:resultPublic[i].calendar.name,
464                        mail: resultPublic[i].calendar.description,
465                        owner: resultPublic[i].owner,
466                        type: 1
467                    })
468                    resultNormalize[(resultNormalize.length - 1)].enabled = currentCalendars[resultPublic[i].id] ? false : true;
469                }
470                               
471            UI.dialogs.sharedCalendar.find('ul.search-result-list').append(DataLayer.render( 'templates/calendar_search_itemlist.ejs', resultNormalize));
472
473            UI.dialogs.sharedCalendar.find('ul.search-result-list li').click(function(event, ui){
474                if ($(event.target).is('input')) {
475                    old_item = $(event.target).parents('li');
476                    var id = old_item.find('.id').html();
477                                               
478                    for(var i = 0; i<resultNormalize.length; i++){
479                        if(resultNormalize[i].id == id)
480                            currentCalendars[id] = {
481                                id: id,
482                                name: resultNormalize[i].name + ' ( '+resultNormalize[i].owner.uid +' )',
483                                description: resultNormalize[i].description,
484                                type: resultNormalize[i].type,
485                                isCalendar: true
486                            };
487                    }
488
489                    UI.dialogs.sharedCalendar.find('dd.calendar-list ul.user-list')
490                    .append(DataLayer.render('templates/user_shared_add_itemlist.ejs', [currentCalendars[id]]))
491                    .scrollTo('max');
492                                               
493                    $('li.not-user').remove();
494                    callbackSharedCalendarAdd();
495                    old_item.remove();
496                }
497            });
498            event.preventDefault();
499        }
500    });
501               
502    var callbackSharedCalendarAdd = function(event){
503               
504        UI.dialogs.sharedCalendar.find('.button').filter(".close.new").button({
505            icons: {
506                primary: "ui-icon-close"
507            },
508            text: false
509        }).click(function () {
510            var id = $(this).parents('li').find('input[name="idPermission"]').val();
511            currentCalendars[$(this).parents().find('input[name="calendar[]"]').val()] = false;
512            $(this).parents('li').remove();
513            if(!!id)
514                DataLayer.remove('calendarSignature', id);
515        })
516        .addClass('tiny disable ui-button-disabled ui-state-disabled')
517        .removeClass('new').end();
518
519        UI.dialogs.sharedCalendar.find('.user-list li').hover(
520            function () {
521                $(this).addClass("hover-user");
522                $(this).find('.button').removeClass('disable ui-button-disabled ui-state-disabled').end()
523                .find('.user-acls-shared-calendar').addClass('hover-user');
524            },
525            function () {
526                $(this).removeClass("hover-user");
527                $(this).find('.button').addClass('disable ui-button-disabled ui-state-disabled').end()
528                .find('.user-acls-shared-calendar').removeClass('hover-user');;
529            }
530            );         
531    }
532
533    //Carrega os dados já cadastrados
534    for (var i = 0; i < Calendar.signatures.length; i++)
535        if(Calendar.signatures[i].isOwner == "0"){
536
537        /*
538        * Verificar se o Owner é um objeto caso ao contrário é realizado a busca e adicionado ao mesmo o uid
539        * */
540        if (Calendar.signatures[i].permission.owner != "object"){
541
542            var result = DataLayer.get('calendarToPermission', {
543                filter: ['AND', ['=','id', Calendar.signatures[i].permission.id]]  ,
544                criteria: {
545                    deepness: 2
546                }
547            }, true);
548
549            Calendar.signatures[i].permission.owner = {};
550            Calendar.signatures[i].permission.owner['uid'] = result[0].owner.uid;
551
552        }
553
554            var dataCurrent = Calendar.signatures[i].calendar;
555            currentCalendars[Calendar.signatures[i].permission.id] = {
556                id: dataCurrent.id,
557                idPermission:Calendar.signatures[i].id ,
558                name: dataCurrent.name + ' ( ' + Calendar.signatures[i].permission.owner.uid + ' )',
559                description: dataCurrent.description,
560                type: Calendar.signatures[i].permission.type,
561                isCalendar: true,
562                current: true
563            };
564                       
565            UI.dialogs.sharedCalendar.find('dd.calendar-list ul.user-list')
566            .append(DataLayer.render('templates/user_shared_add_itemlist.ejs', [currentCalendars[Calendar.signatures[i].permission.id]]))
567            .scrollTo('max');
568                               
569            $('li.not-user').remove();
570            callbackSharedCalendarAdd();
571        }
572               
573    UI.dialogs.sharedCalendar.dialog('open');
574}
575
576function cancel_signature(signatureId){
577    $.Zebra_Dialog('Confirma a remoção desta assinatura ?', {
578        'type':     'question',
579        'overlay_opacity': '0.5',
580        'buttons':  ['Sim', 'Não'],
581        'onClose':  function(clicked) {
582                if(clicked == 'Sim'){
583                        DataLayer.remove('calendarSignature', ''+signatureId);
584                        DataLayer.commit( false, false, function( received ){
585                                delete Calendar.currentViewKey;
586                                Calendar.load();
587                                refresh_calendars();
588                        });
589            }
590        }
591    });
592}
Note: See TracBrowser for help on using the repository browser.