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

Revision 5812, 17.6 KB checked in by acoutinho, 12 years ago (diff)

Ticket #2434 - Correcao e melhoria na edicao e remocao no compartilhamentos de agendas

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