source: branches/2.4/prototype/modules/calendar/js/calendar.shared.js @ 6613

Revision 6613, 18.1 KB checked in by eduardow, 12 years ago (diff)

Ticket #2879 - Janela de Compartilhamento de agenda sem ação.

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