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

Revision 5588, 16.2 KB checked in by marcieli, 12 years ago (diff)

Ticket #2486 - Corrigidos mais alguns bugs ao marcar/sinalizar e selecionar msgs da busca.

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