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

Revision 5576, 15.2 KB checked in by adriano, 12 years ago (diff)

Ticket #2486 - parte do codigo para implementacao do salvamento de novos tipos de sinalizadores

  • 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(false, false, function(data){
137                                followupflags = DataLayer.get('followupflag',{criteria:{order: 'id'}}, true);           
138                                followupflagId = followupflags[followupflags.length - 1].id;
139                                winElement.find('[name="name"] option[value="custom"]').val(followupflagId);
140                        });
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                for (var i=0; i < selectedMessageIds.length; i++ ){
151                        if (currentTab == 0) {
152                                folder_name = current_folder;
153                        }else{
154                                var id_border = currentTab.replace(/[a-zA-Z_]+/, "");
155                                var tr = Element(selectedMessageIds[i]+'_s'+id_border);
156                                folder_name = tr.getAttribute('name');
157                        }
158                        var messageNumber   = selectedMessageIds[i];
159                        folders.push(folder_name);
160                       
161                        var idFollowupflagged = winElement.find('[name="followupflagId"]').val();
162                        var followupflagged = DataLayer.merge({
163                                uid : User.me.id,
164                                followupflagId : followupflagId,
165                                folderName : folder_name,
166                                messageNumber : messageNumber,
167                                isDone: isDone,
168                                backgroundColor : backgroundColor
169                        }, !!idFollowupflagged ? {id: idFollowupflagged} : {});
170                       
171                        if (alarmDate = winElement.find('[name="alarmDate"]').datepicker("getDate")) {
172                                if (alarmTime = winElement.find('[name="alarmTime"]').datepicker("getDate")) {
173                                        alarmDate.set({hour:alarmTime.getHours(), minute:alarmTime.getMinutes()});
174                                }
175                                followupflagged.alarmDeadline = alarmDate.toString('yyyy-MM-dd hh:mm:ss');
176                        }
177
178                        if (doneDate = winElement.find('[name="doneDate"]').datepicker("getDate")) {
179                                if (doneTime = winElement.find('[name="doneTime"]').datepicker("getDate")) {
180                                        doneDate.set({hour:doneTime.getHours(), minute:doneTime.getMinutes()});
181                                }
182                                followupflagged.doneDeadline = doneDate.toString('yyyy-MM-dd hh:mm:ss');
183                        }
184                       
185                        /**
186                         * Aplica o ícone correspondente na lista de mensagens do expressoMail
187                         */
188                        var flagged = $('#td_message_followup_' + messageNumber + ', ' + '#td_message_followup_search_' + messageNumber+':first').find(".flag-edited");
189                        if(isDone){
190                                flagged.find("img").attr("src", "../prototype/modules/mail/img/flagChecked.png").css("margin-left","-3px");
191                        }else{
192                                flagged.find("img").attr("src", "../prototype/modules/mail/img/flagEditor.png").css("margin-left","0");                 
193                        }
194                       
195                        $('#td_message_followup_' + messageNumber + ', ' +
196                          '#td_message_followup_search_' + messageNumber+':first').find(".flag-edited").css("background", backgroundColor);
197                         
198                        /**
199                         * Salva ou, caso já exista, atualiza
200                         */
201                        DataLayer.put('followupflagged', followupflagged);
202                }
203               
204                DataLayer.commit(false, false, function(data){
205                        followupflags = DataLayer.get('followupflagged',{criteria:{order: 'id'}}, true);               
206                        var id = followupflags[followupflags.length - 1].id;
207                        winElement.find('[name="followupflagId"]').val(id);
208                        winElement.find('.menu-configure-followupflag .save').button("option", "disabled", true);
209                });
210               
211                var extend = DataLayer.get('followupflagged', {
212                        filter: ['AND', ['IN', 'messageNumber', selectedMessageIds], ['IN', 'folderName', folders]],
213                        criteria: {deepness: 1}
214                });
215               
216                if(extend != "" || extend != 'undefined' || extend != []){
217                        for(var i = 0; i < extend.length; i++){
218                                if(onceOpenedHeadersMessages[extend[i].folderName]){
219                                        if(onceOpenedHeadersMessages[extend[i].folderName][extend[i].messageNumber]){
220                                                onceOpenedHeadersMessages[extend[i].folderName][extend[i].messageNumber]['followupflagged'] = {};
221                                                DataLayer.merge(onceOpenedHeadersMessages[extend[i].folderName][extend[i].messageNumber]['followupflagged'], extend[i]);
222                                        }
223                                }
224
225                        }
226                } else {
227                        alert('erro ao salvar');
228                }
229        }).end()
230       
231        .filter('.menu-configure-followupflag .delete').click(function(){
232                if (selectedMessageIds.length == 0) $(this).button("option", "disabled", true);
233               
234                for(i = 0; i < selectedMessageIds.length; i++){
235                        var folder_name;
236                        if (currentTab == 0) {
237                                folder_name = current_folder;
238                        }else{
239                                var id_border = currentTab.replace(/[a-zA-Z_]+/, "");
240                                var tr = Element(selectedMessageIds[i]+'_s'+id_border);
241                                folder_name = tr.getAttribute('name');
242                        }
243                        var messageNumber = selectedMessageIds[i];
244                        if(onceOpenedHeadersMessages[folder_name][messageNumber]['followupflagged']){
245                                if(onceOpenedHeadersMessages[folder_name][messageNumber]['followupflagged'].id){
246                                        var flag_id = onceOpenedHeadersMessages[folder_name][messageNumber]['followupflagged'].id;
247                                        DataLayer.remove('followupflagged', flag_id);
248                                        $('#td_message_followup_' + messageNumber + ', ' +
249                                          '#td_message_followup_search_' + messageNumber+':first').find(".flag-edited").css("background", '#CCC');
250                                        $('#td_message_followup_' + messageNumber + ', ' +
251                                                '#td_message_followup_search_' + messageNumber + 'first').find(".flag-edited")
252                                                .find("img").attr("src", "../prototype/modules/mail/img/flagEditor.png").css("margin-left","0");
253
254                                        onceOpenedHeadersMessages[folder_name][messageNumber]['followupflagged'] = undefined;
255                                }
256                        }
257                }
258                DataLayer.commit();
259                winElement.dialog("close");
260        });
261
262                               
263        if(!winElement.find('[name="followupflagId"]').val())
264                winElement.find('.menu-configure-followupflag .delete').button("option", "disabled", true);
265                               
266        /**
267         * Se houver mudança, habilita o botão "Save"
268         */
269        winElement.find(':input').change(function(event){
270                if (event.keyCode != '27' && event.keyCode != '13')
271                        $(this).button("option", "disabled", true);
272        }).keydown(function(event){
273                if (event.keyCode != '27' && event.keyCode != '13')
274                        $(this).button("option", "disabled", true);
275        });     
276       
277        winElement.find('.date').datepicker();
278        winElement.find('.time').timepicker({});
279        winElement.find('[name="name"]').combobox();
280
281       
282        winElement.find('[name="alarmDate"],[name="alarmTime"]').attr("disabled","disabled");
283        winElement.find('[name="alarm"]').click(function(){
284                if($(this).is(":checked")){
285                        winElement.find('[name="alarmDate"],[name="alarmTime"]').removeAttr("disabled");                       
286                }else{
287                        winElement.find('[name="alarmDate"],[name="alarmTime"]').attr("disabled","disabled");
288                }
289        });     
290        winElement.find('[name="done"]').click(function(){
291                if($(this).is(":checked")){
292                        winElement.find(".input-done input").attr("disabled","disabled");
293                }else{
294                        winElement.find(".input-done input").removeAttr("disabled");
295                }
296        });
297
298
299        winElement.find(".followupflag-color-fields").hide();
300        winElement.find(".followupflag-color.sample-list .sample-item").click(function(){
301                winElement.find(".followupflag-color.sample-list .sample-item").removeClass("selected");
302                $(this).addClass("selected");
303                var color = $(this).attr('alt');
304                winElement.find('[name="backgroundColor"]').css('background-color', color).val(color)
305        });
306       
307        winElement.find(".followupflag-color.sample-list .sample-item.selected").trigger('click');
308                               
309        winElement.find('[name="setColor"]').change(function(){         
310                if(winElement.find('[name="setColor"]').val() == "default"){
311                        winElement.find(".followupflag-color.sample-list").show("fast");
312                        winElement.find(".followupflag-color-fields").hide();
313                        winElement.find(".followupflag-color.sample-list .sample-item.selected").trigger('click');
314                } else if(winElement.find('[name="setColor"]').val() == "custom"){
315                        winElement.find(".followupflag-color-fields").show("fast");
316                        winElement.find(".followupflag-color.sample-list").hide();
317                        winElement.find(".colorwell").focus();
318                }               
319        });
320       
321        if(winElement.find('[name="setColor"] option:selected').val() == "custom"){
322                winElement.find('[name="setColor"]').trigger("change");
323        }
324
325        var colorpickerPreviewChange = function(color) {
326                winElement.find('.colorwell-selected').val(color).css('background-color', color);
327                winElement.find('.flag-color-preview').css('background',color);
328        }
329
330        var f = $.farbtastic(winElement.find('.colorpicker'), colorpickerPreviewChange);
331        var selected;                                   
332        winElement.find('.colorwell').each(function () {
333                f.linkTo(this);
334        }).focus(function() {
335                if (selected) {
336                        $(selected).removeClass('colorwell-selected');
337                }
338                $(selected = this).addClass('colorwell-selected');
339                f.linkTo(this, colorpickerPreviewChange);
340                f.linkTo(colorpickerPreviewChange);
341               
342        });
343        if(winElement.find('[name="setColor"] option:selected').val() == "custom"){
344                winElement.find(".colorwell").focus();
345        }
346
347}
348
349
350
351
352/**
353 * constrói as duas possíveis janela de alerta, utilizando o mesmo template
354 */
355
356$('#main_table').ready(function(){
357        var toIterate = [
358                {
359                        attrDeadline: 'doneDeadline',
360                        caption: {singular:'Você tem uma mensagem concluindo hoje:', plural:"Você tem %1 mensagens concluindo hoje:"},
361                        onOk: function(event){
362                                if($(event.target).parents('.followupflag-alarm').find('[name="stopAlert"]').is(':checked')){
363                                        $.cookie("fadeCompleted", (new Date).toString("dd/MM/yyyy"), { expires: 1 });
364                                }
365                        },
366                        enable: ($.cookie("fadeCompleted") != (new Date).toString("dd/MM/yyyy"))
367                },
368                {
369                        attrDeadline: 'alarmDeadline',
370                        caption: {singular:'Você tem uma mensagem sinalizada para hoje:', plural:'Você tem %1 mensagens sinalizadas para hoje:'},
371                        onOk: function(event){
372                                if($(event.target).parents('.followupflag-alarm').find('[name="stopAlert"]').is(':checked')){
373                                        $.cookie("fadeAlarm", (new Date).toString("dd/MM/yyyy"), { expires: 1 });
374                                }
375                        },
376                        enable: ($.cookie("fadeAlarm") != (new Date).toString("dd/MM/yyyy"))
377                }
378        ];
379
380        while (it = toIterate.pop()){
381                if (!it.enable) continue;
382               
383                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}});
384                if(alarmInRange.length > 0){
385                        for(var i=0; i<alarmInRange.length; i++){
386                                var date = Date.parseExact(alarmInRange[i].alarmDeadline, 'yyyy-MM-dd hh:mm:ss');
387                                alarmInRange[i].alarmDeadline = date.toString('hh:mm');
388                        }
389                        var caption = (alarmInRange.length == 1) ?
390                                get_lang(it.caption.singular):
391                                get_lang(it.caption.plural, alarmInRange.length);
392                               
393                        var data = {alarmInRange : alarmInRange, caption: caption};
394                        var dialogText = DataLayer.render("../prototype/modules/mail/templates/followupflag_alarm_list.ejs", data);
395                       
396                        /**
397                         * A última dialog criada é a dialog mais ao alto
398                         */
399                        var offsetHeight = $('.ZebraDialog.right-bottom:last').length ?
400                                $(window).height() - $('.ZebraDialog.right-bottom:last').position().top : 0;
401
402                        /**
403                         * Se for a primeira, desloca para cima do rodapé do grid
404                         * caso contrário desloca para um pouco acima da última dialog criada
405                         */
406                        offsetHeight = !offsetHeight ? 35 : offsetHeight + 20 ;
407                        var dialog = new $.Zebra_Dialog(dialogText, {
408                                'buttons':  ['Ok'],
409                                'modal': false,
410                                'vcenter_short_message': false,
411                                'position': ['right - 20', 'bottom - ' + offsetHeight.toString() ],
412                                'custom_class': 'right-bottom followupflag-alarm',
413                        }).dialog;
414
415                        $(".ZebraDialog.followupflag-alarm .ZebraDialog_Button0").click(it.onOk);
416                       
417                        $(".ZebraDialog.followupflag-alarm .display-options .more").click(function(event) {
418                                $(event.target).parents('.followupflag-alarm').find('.message-list').css('height', 'auto');
419                        });
420                       
421                }               
422        }
423});
Note: See TracBrowser for help on using the repository browser.