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

Revision 5571, 13.6 KB checked in by adriano, 12 years ago (diff)

Ticket #2486 - correcoes de diversos bugs e refactory de parte do codigo dos alarms

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