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

Revision 5610, 16.4 KB checked in by thiago, 12 years ago (diff)

Ticket #2486 - problema de seleção enable e disable na janela do alarme.

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