source: trunk/prototype/modules/mail/js/followupflag.js @ 5711

Revision 5711, 18.5 KB checked in by marcieli, 12 years ago (diff)

Ticket #2486 - Correção na adequação dos ids dos followupflagged.

  • Property svn:executable set to *
Line 
1function updateCacheFollowupflag(msgNumber, msgFolder, op){
2        if(op){
3                if(typeof msgNumber == 'object'){
4                        var extend = DataLayer.get('followupflagged', {
5                                filter: ['AND', ['IN', 'messageNumber', msgNumber], ['IN', 'folderName', msgFolder]],
6                                criteria: {deepness: 1}
7                        }, true);
8                } else{
9                        var extend = DataLayer.get('followupflagged', {
10                                filter: ['AND', ['=', 'messageNumber', msgNumber], ['=', 'folderName', msgFolder]],
11                                criteria: {deepness: 1}
12                        }, true);
13                }
14
15               
16                if(extend != "" || extend != 'undefined' || extend != []){
17                        for(var i = 0; i < extend.length; i++){
18                                if(onceOpenedHeadersMessages[extend[i].folderName]){
19                                        if(onceOpenedHeadersMessages[extend[i].folderName][extend[i].messageNumber]){
20                                                onceOpenedHeadersMessages[extend[i].folderName][extend[i].messageNumber]['followupflagged'] = {};
21                                                DataLayer.merge(onceOpenedHeadersMessages[extend[i].folderName][extend[i].messageNumber]['followupflagged'], extend[i]);
22                                        }
23                                }
24
25                        }
26                }
27        }else{
28                onceOpenedHeadersMessages[msgFolder][msgNumber]['followupflagged'] = undefined;
29        }
30}
31
32function init_followup(data){
33
34        winElement = data.window;
35        selectedMessageIds = data.selectedMessages;
36        folder = current_folder;
37
38        /**
39         * Implementação do widget de input-combobox
40         */
41 
42        (function( $ ) {
43                $.widget( "ui.combobox", {
44                        _create: function() {
45                                var self = this,
46                                        select = this.element.hide(),
47                                        selected = select.children( ":selected" ),
48                                        value = selected.val() ? selected.text() : "";
49                                var input = this.input = $( "<input>" )
50                                        .insertAfter( select )
51                                        .val( value )
52                                        .autocomplete({
53                                                delay: 0,
54                                                minLength: 0,
55                                                source: function( request, response ) {
56                                                        var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term), "i" );
57                                                        response( select.children( "option" ).map(function() {
58                                                                var text = $( this ).text();
59                                                                if ( this.value && ( !request.term || matcher.test(text) ) )
60                                                                        return {
61                                                                                label: text.replace(
62                                                                                        new RegExp(
63                                                                                                "(?![^&;]+;)(?!<[^<>]*)(" +
64                                                                                                $.ui.autocomplete.escapeRegex(request.term) +
65                                                                                                ")(?![^<>]*>)(?![^&;]+;)", "gi"
66                                                                                        ), "<strong>$1</strong>" ),
67                                                                                value: text,
68                                                                                option: this
69                                                                        };
70                                                        }) );
71                                                },
72                                                select: function( event, ui ) {
73                                                        winElement.find('.menu-configure-followupflag .save').button("enable");
74                                                        ui.item.option.selected = true;
75                                                        self._trigger( "selected", event, {
76                                                                item: ui.item.option
77                                                        });
78                                                },
79                                                change: function( event, ui ) {
80                                                        if ( !ui.item ) {
81                                                                var matcher = new RegExp( "^" + $.ui.autocomplete.escapeRegex( $(this).val() ) + "$", "i" ),
82                                                                        valid = false;
83                                                                select.children( "option" ).each(function() {
84                                                                        if ( $( this ).text().match( matcher ) ) {
85                                                                                this.selected = valid = true;
86                                                                                return false;
87                                                                        }
88                                                                });
89                                                                /*
90                                                                if ( !valid ) {
91                                                                        // remove invalid value, as it didn't match anything
92                                                                        $( this ).val( "" );
93                                                                        select.val( "" );
94                                                                        input.data( "autocomplete" ).term = "";
95                                                                        return false;
96                                                                }
97                                                                */
98                                                                if ( !valid ) {
99                                                                        if(select.has('option[value="custom"]').length > 0) {
100                                                                                select.find('option:last').val('custom').html($(this).val()).attr('selected', 'selected');
101                                                                        } else {
102                                                                                select.append(select.find('option:last').clone().val('custom').html($(this).val()));
103                                                                                select.find('option[value="custom"]').attr('selected', 'selected');
104                                                                        }
105                                                                }
106                                                        }
107                                                }
108                                        })
109                                        .addClass( "ui-widget ui-widget-content ui-corner-left" );
110
111                                input.data( "autocomplete" )._renderItem = function( ul, item ) {
112                                        return $( "<li></li>" )
113                                                .data( "item.autocomplete", item )
114                                                .append( "<a>" + item.label + "</a>" )
115                                                .appendTo( ul );
116                                };
117
118                                this.button = $( "<button type='button'>&nbsp;</button>" )
119                                        .attr( "tabIndex", -1 )
120                                        .attr( "title", "Show All Items" )
121                                        .insertAfter( input )
122                                        .button({
123                                                icons: {
124                                                        primary: "ui-icon-triangle-1-s"
125                                                },
126                                                text: false
127                                        })
128                                        .removeClass( "ui-corner-all" )
129                                        .addClass( "ui-corner-right ui-button-icon" )
130                                        .click(function() {
131                                                // close if already visible
132                                                if ( input.autocomplete( "widget" ).is( ":visible" ) ) {
133                                                        input.autocomplete( "close" );
134                                                        return;
135                                                }
136
137                                                // work around a bug (likely same cause as #5265)
138                                                $( this ).blur();
139
140                                                // pass empty string as value to search for, displaying all results
141                                                input.autocomplete( "search", "" );
142                                                input.focus();
143                                        });
144                        },
145
146                        destroy: function() {
147                                this.input.remove();
148                                this.button.remove();
149                                this.element.show();
150                                $.Widget.prototype.destroy.call( this );
151                        }
152                });
153        })( jQuery );
154        /**
155         * #END: Implementação do widget de input-combobox
156         */
157
158        winElement.find('.button').button()
159        .filter('.menu-configure-followupflag .cancel').click(function(){
160                winElement.dialog("close");
161        }).end()
162       
163        .filter('.menu-configure-followupflag .save').click(function(){
164        var saveFollowupflagged = function(){
165                var idFollowupflagged = winElement.find('[name="followupflagId"]').val();
166                        idFollowupflagged = idFollowupflagged.split(',');
167                        for(x=0; x<idFollowupflagged.length; x++){
168                                (idFollowupflagged[x] == "false") ? idFollowupflagged[x] = false : idFollowupflagged;
169                        }
170                for(i=0; i<selectedMessageIds.length; i++){
171                                var isDone = winElement.find('[name="done"]').is(':checked') ? 1 : 0;
172                                var alarmDate = false;
173                                var doneDate  = false;
174                                var folder_name;
175                                var folders = [];
176                                var messages = [];
177                                var roles = get_selected_messages_search_role().split(',');
178                                for (var i=0; i < selectedMessageIds.length; i++ ){
179                                        if (currentTab == 0) {
180                                                folder_name = current_folder;
181                                                var messageNumber = selectedMessageIds[i];
182                                        }else{
183                                                var tr = $('[role="'+roles[i]+'"]');
184                                                folder_name = $(tr).attr('name');
185                                                var id = $(tr).attr('id');
186                                                var messageNumber = id.replace(/_[a-zA-Z0-9]+/,"");
187                                        }
188                                        folders.push(folder_name);
189                                       
190                                                var followupflagged = DataLayer.merge({
191                                                        uid : User.me.id,
192                                                        followupflagId : followupflagId,
193                                                        folderName : folder_name,
194                                                        messageNumber : messageNumber,
195                                                        isDone: isDone,
196                                                        backgroundColor : backgroundColor
197                                                }, !!idFollowupflagged[i] ? {id: idFollowupflagged[i]} : {});
198                                       
199                                        if (alarmDate = winElement.find('[name="alarmDate"]').datepicker("getDate")) {
200                                                if (alarmTime = winElement.find('[name="alarmTime"]').datepicker("getDate")) {
201                                                        alarmDate.set({hour:alarmTime.getHours(), minute:alarmTime.getMinutes()});
202                                                }
203                                                followupflagged.alarmDeadline = alarmDate.toString('yyyy-MM-dd hh:mm:ss');
204                                        }
205
206                                        if (doneDate = winElement.find('[name="doneDate"]').datepicker("getDate")) {
207                                                if (doneTime = winElement.find('[name="doneTime"]').datepicker("getDate")) {
208                                                        doneDate.set({hour:doneTime.getHours(), minute:doneTime.getMinutes()});
209                                                }
210                                                followupflagged.doneDeadline = doneDate.toString('yyyy-MM-dd hh:mm:ss');
211                                        }
212                                       
213                                        /**
214                                         * Aplica o ícone correspondente na lista de mensagens do expressoMail
215                                         */
216                                        if(current_folder == folder_name){
217                                                var flagged = $('#td_message_followup_' + messageNumber + ', tr[role="'+messageNumber+'_'+folder_name+'"] #td_message_followup_search_' + messageNumber).find(".flag-edited");
218                                        } else{
219                                                var flagged = $('tr[role="'+messageNumber+'_'+folder_name+'"] #td_message_followup_search_' + messageNumber).find(".flag-edited");
220                                        }
221                                        if(isDone){
222                                                flagged.find("img").attr("src", "../prototype/modules/mail/img/flagChecked.png").css("margin-left","-3px");
223                                        }else{
224                                                flagged.find("img").attr("src", "../prototype/modules/mail/img/flagEditor.png").css("margin-left","0");                 
225                                        }
226                                       
227                                        var followupflagName = winElement.find('[name="name"] option:selected').text();
228                                        if(current_folder == folder_name){
229                                                $('#td_message_followup_' + messageNumber + ', ' +
230                                                'tr[role="'+messageNumber+'_'+folder_name+'"] #td_message_followup_search_' + messageNumber).find(".flag-edited").css("background", backgroundColor).attr('title', followupflagName);
231                                        }else{
232                                                $('tr[role="'+messageNumber+'_'+folder_name+'"] #td_message_followup_search_' + messageNumber).find(".flag-edited").css("background", backgroundColor).attr('title', followupflagName);
233                                        } 
234                                        /**
235                                         * Salva ou, caso já exista, atualiza
236                                         */
237                                        DataLayer.put('followupflagged', followupflagged);
238                                }
239                               
240                                DataLayer.commit(false, false, function(data){
241                                        followupflags = DataLayer.get('followupflagged',{criteria:{order: 'id'}}, true);               
242                                        var id = followupflags[followupflags.length - 1].id;
243                                        winElement.find('[name="followupflagId"]').val(idFollowupflagged[i]);
244                                        winElement.find('.menu-configure-followupflag .delete').button("option", "disabled", false);
245                                        updateCacheFollowupflag(selectedMessageIds, folders, true);
246                                });
247                                winElement.find('.menu-configure-followupflag .save').button("option", "disabled", true);
248               
249                }
250    }
251                var backgroundColor = winElement.find('[name="backgroundColor"]').val();
252                var followupflagId  = winElement.find('[name="name"] option:selected').val();
253                if (followupflagId == 'custom') {
254                        DataLayer.put('followupflag', {name:winElement.find('[name="name"] option:selected').text(), uid:User.me.id});
255                        DataLayer.commit(false, false, function(data){
256                                DataLayer.remove('followupflag', false);
257                                DataLayer.get('followupflag');         
258                                followupflags = DataLayer.get('followupflag',{criteria:{order: 'id'}}, true);           
259                                followupflagId = followupflags[followupflags.length - 1].id;
260                                winElement.find('[name="name"] option[value="custom"]').val(followupflagId);
261                                saveFollowupflagged();
262                        });
263                }else{
264                        saveFollowupflagged();
265                }       
266
267        }).end()
268       
269        .filter('.menu-configure-followupflag .delete').click(function(){
270                if (selectedMessageIds.length == 0) $(this).button("option", "disabled", true);
271                /** TODO Mudar quando melhorias forem implementadas na API de atualização do cache */
272                DataLayer.remove('followupflagged', false);
273                DataLayer.get('followupflagged');
274                var roles = get_selected_messages_search_role().split(',');
275                for (var i=0; i < selectedMessageIds.length; i++ ){
276                                if (currentTab == 0) {
277                                        folder_name = current_folder;
278                                        var messageNumber = selectedMessageIds[i];
279                                }else{
280                                        var tr = $('[role="'+roles[i]+'"]');
281                                        folder_name = $(tr).attr('name');
282                                        var id = $(tr).attr('id');
283                                        var messageNumber = id.replace(/_[a-zA-Z0-9]+/,"");
284                                }
285                        if(onceOpenedHeadersMessages[folder_name][messageNumber]['followupflagged']){
286                                if(onceOpenedHeadersMessages[folder_name][messageNumber]['followupflagged'].id){
287                                        var flag_id = onceOpenedHeadersMessages[folder_name][messageNumber]['followupflagged'].id;
288                                        DataLayer.remove('followupflagged', flag_id );
289                                        /**
290                                         * TODO - corrigir o formato do ID no DataLayer, para que seja utilizado o ID composto
291                                         * ao invés do ID do PostgreSQL atualmente em uso.
292                                         */
293                                         
294                                        /**
295                                         * # hack necessário enquanto o DataLayer não reconhece o ID composto. Trocar o
296                                         * código abaixo pela chamada trivial de DataLayer.remove('followupflagged', idCompost)
297                                         */
298                                        // var data = {};
299                                        // data[ 'followupflagged://' + folder_name + '/' + messageNumber + '#' + flag_id ] = false;
300                                        // DataLayer.dispatch('Sync', data, false, true);
301                                       
302                                        if(current_folder == folder_name){
303                                                $('#td_message_followup_' + messageNumber + ', ' +
304                                                  'tr[role="'+messageNumber+'_'+folder_name+'"] #td_message_followup_search_' + messageNumber).find(".flag-edited").css("background", '#CCC').attr('title', '');;
305                                                $('#td_message_followup_' + messageNumber + ', ' +
306                                                        'tr[role="'+messageNumber+'_'+folder_name+'"] #td_message_followup_search_' + messageNumber).find(".flag-edited")
307                                                        .find("img").attr("src", "../prototype/modules/mail/img/flagEditor.png").css("margin-left","0");
308                                        }else{
309                                                $('tr[role="'+messageNumber+'_'+folder_name+'"] #td_message_followup_search_' + messageNumber).find(".flag-edited").css("background", '#CCC').attr('title', '');;
310                                                $('tr[role="'+messageNumber+'_'+folder_name+'"] #td_message_followup_search_' + messageNumber).find(".flag-edited")
311                                                        .find("img").attr("src", "../prototype/modules/mail/img/flagEditor.png").css("margin-left","0");
312                                        }
313                                        updateCacheFollowupflag(messageNumber, folder_name, false);
314                                }
315                        }
316                }
317                DataLayer.commit();
318                winElement.dialog("close");
319        });
320       
321        /**
322         * Se houver mudança, habilita o botão "Save"
323         */
324        winElement.find(':input').change(function(event){
325                if (event.keyCode != '27' && event.keyCode != '13')
326                        winElement.find('.menu-configure-followupflag .save').button("option", "disabled", false);
327        }).keydown(function(event){
328                if (event.keyCode != '27' && event.keyCode != '13')
329                        winElement.find('.menu-configure-followupflag .save').button("option", "disabled", false);
330        });
331       
332        winElement.find('.date').datepicker();
333        winElement.find('.time').timepicker({});
334        winElement.find('[name="name"]').combobox();
335
336        winElement.find('[name="alarmDate"],[name="alarmTime"]').attr("disabled","disabled");
337       
338        winElement.find('[name="alarm"]').click(function(){
339                if($(this).is(":checked")){
340                        winElement.find('[name="alarmDate"],[name="alarmTime"]').removeAttr("disabled");                       
341                }else{
342                        winElement.find('[name="alarmDate"],[name="alarmTime"]').attr("disabled","disabled");
343                }
344        });
345        if(winElement.find('[name="alarm"]').is(":checked")){
346                winElement.find('[name="alarmDate"],[name="alarmTime"]').removeAttr("disabled");
347        }
348        winElement.find('[name="done"]').click(function(){
349                if($(this).is(":checked")){
350                        winElement.find(".input-done input").attr("disabled","disabled");
351                }else{
352                        winElement.find(".input-done input").removeAttr("disabled");
353                }
354        });
355
356
357        winElement.find(".followupflag-color-fields").hide();
358        winElement.find(".followupflag-color.sample-list .sample-item").click(function(){
359                winElement.find('.menu-configure-followupflag .save').button("enable");
360                winElement.find(".followupflag-color.sample-list .sample-item").removeClass("selected");
361                $(this).addClass("selected");
362                var color = $(this).attr('alt');
363                winElement.find('[name="backgroundColor"]').css('background-color', color).val(color)
364        });
365       
366        winElement.find(".followupflag-color.sample-list .sample-item.selected").trigger('click');
367                               
368        winElement.find('[name="setColor"]').change(function(){
369                if(winElement.find('[name="setColor"]').val() == "default"){
370                        winElement.find(".followupflag-color.sample-list").show("fast");
371                        winElement.find(".followupflag-color-fields").hide();
372                        winElement.find(".followupflag-color.sample-list .sample-item.selected").trigger('click');
373                } else if(winElement.find('[name="setColor"]').val() == "custom"){     
374                        winElement.find(".followupflag-color-fields").show("fast");
375                        winElement.find(".followupflag-color.sample-list").hide();
376                        winElement.find(".colorwell").focus();
377                }               
378        });
379       
380        if(winElement.find('[name="setColor"] option:selected').val() == "custom"){
381                winElement.find('[name="setColor"]').trigger("change");
382        }
383
384        var colorpickerPreviewChange = function(color) {
385                winElement.find('.menu-configure-followupflag .save').button("enable");
386                winElement.find('.colorwell-selected').val(color).css('background-color', color);
387                winElement.find('.flag-color-preview').css('background',color);
388        }
389
390        var f = $.farbtastic(winElement.find('.colorpicker'), colorpickerPreviewChange);
391        var selected;                                   
392        winElement.find('.colorwell').each(function () {
393                f.linkTo(this);
394        }).focus(function() {
395                if (selected) {
396                        $(selected).removeClass('colorwell-selected');
397                }
398                $(selected = this).addClass('colorwell-selected');
399                f.linkTo(this, colorpickerPreviewChange);
400                f.linkTo(colorpickerPreviewChange);
401               
402        });
403        if(winElement.find('[name="setColor"] option:selected').val() == "custom"){
404                winElement.find(".colorwell").focus();
405        }
406
407}
408
409
410/**
411 * constrói as duas possíveis janela de alerta, utilizando o mesmo template
412 */
413
414$('#main_table').ready(function(){
415        var toIterate = [
416                {
417                        attrDeadline: 'doneDeadline',
418                        caption: {singular:'Você tem uma mensagem concluindo hoje:', plural:"Você tem %1 mensagens concluindo hoje:"},
419                        onOk: function(event){
420                                if($(event.target).parents('.doneDeadline').find('[name="stopAlert"]').is(':checked')){
421                                        $.cookie("fadeCompleted", (new Date).toString("dd/MM/yyyy"), { expires: 1 });
422                                }
423                        },
424                        enable: ($.cookie("fadeCompleted") != (new Date).toString("dd/MM/yyyy"))
425                },
426                {
427                        attrDeadline: 'alarmDeadline',
428                        caption: {singular:'Você tem uma mensagem sinalizada para hoje:', plural:'Você tem %1 mensagens sinalizadas para hoje:'},
429                        onOk: function(event){
430                                if($(event.target).parents('.alarmDeadline').find('[name="stopAlert"]').is(':checked')){
431                                        $.cookie("fadeAlarm", (new Date).toString("dd/MM/yyyy"), { expires: 1 });
432                                }
433                        },
434                        enable: ($.cookie("fadeAlarm") != (new Date).toString("dd/MM/yyyy"))
435                }
436        ];
437var i = 0;
438        while (it = toIterate.pop()){
439                if (!it.enable) continue;
440
441                var alarmInRange = DataLayer.get('followupflagged', {filter: ['AND', ['>', it.attrDeadline, (new Date()).set({hour:0, minute:0, second:0}).toString('yyyy-MM-dd 00:00:00')], ['<', it.attrDeadline, (new Date()).set({hour:0, minute:0, second:0}).addHours(24).toString('yyyy-MM-dd 00:00:00')]], criteria: {deepness: 1}});
442                if(alarmInRange.length > 0){
443                        for(var i=0; i<alarmInRange.length; i++){
444                                var date = Date.parseExact(alarmInRange[i][it.attrDeadline], 'yyyy-MM-dd hh:mm:ss');
445                                alarmInRange[i][it.attrDeadline] = date.toString('hh:mm');
446                        }
447                        var caption = (alarmInRange.length == 1) ?
448                                get_lang(it.caption.singular):
449                                get_lang(it.caption.plural, alarmInRange.length);
450                               
451                        var data = {alarmInRange : alarmInRange, caption: caption, it : it};
452                        var dialogText = DataLayer.render("../prototype/modules/mail/templates/followupflag_alarm_list.ejs", data);
453                       
454                        /**
455                         * A última dialog criada é a dialog mais ao alto
456                         */
457                        var offsetHeight = $('.ZebraDialog.right-bottom:last').length ?
458                                $(window).height() - $('.ZebraDialog.right-bottom:last').position().top : 0;
459
460                        /**
461                         * Se for a primeira, desloca para cima do rodapé do grid
462                         * caso contrário desloca para um pouco acima da última dialog criada
463                         */
464                        offsetHeight = !offsetHeight ? 35 : offsetHeight + 20 ;
465                       
466                        var dialog = new $.Zebra_Dialog(dialogText, {
467                                'buttons':  ['Ok'],
468                                'modal': false,
469                                'vcenter_short_message': false,
470                                'position': ['right - 20', 'bottom - ' + offsetHeight.toString() ],
471                                'custom_class': 'right-bottom followupflag-alarm '+it.attrDeadline,
472                        }).dialog;
473                       
474                        $(".ZebraDialog.followupflag-alarm .ZebraDialog_Button0").click(it.onOk);
475                       
476                        $(".ZebraDialog.followupflag-alarm .display-options .more").click(function(event) {
477                                $(event.target).parents('.followupflag-alarm').find('.message-list').css('height', 'auto');
478                        });
479                       
480                }               
481        }
482});
Note: See TracBrowser for help on using the repository browser.