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

Revision 5640, 17.3 KB checked in by marcieli, 12 years ago (diff)

Ticket #2486 - Estilo de botões e menu no ExpressoMail?. Criar sinalizador customizado.

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