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

Revision 6992, 18.1 KB checked in by thiago, 12 years ago (diff)

Ticket #3008 - Problema de permissão corrigida.

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