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

Revision 7217, 18.4 KB checked in by acoutinho, 12 years ago (diff)

Ticket #3070 - Incluir o uid do dono de uma agenda ao pesquisa-la

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