source: branches/2.4/prototype/modules/mail/js/label.js @ 6630

Revision 6630, 18.6 KB checked in by eduardow, 12 years ago (diff)

Ticket #2884 - Inconsistência ao remover marcadores.

  • Property svn:executable set to *
Line 
1function msgCallback(msg){
2        switch(msg){
3                case '#LabelNameError':
4                        alert('Já existe um marcador com esse nome.');
5                        break;
6                case '#LabelSlotError':
7                        alert('Atingido limite de marcadores criados.');
8                        break; 
9                default:
10                        alert('Ocorreu um erro ao salvar o Marcador');
11        }
12}
13function configureLabel(event, ui){
14        var idmarkernow = $(this).find('[name="labelItemId"]').val();
15        winElement.find('.edit-label').val(idmarkernow);
16        winElement.find('.input-nome').val($(this).find("span").text());
17       
18        var colorpicker = winElement.find('.lebals-colorpicker');
19        colorpicker.find('input[name="backgroundColor"]').val(rgb2hex($(this).css("backgroundColor")))
20        .css("background-color", $(this).css("backgroundColor")).focus().end()
21        .find('input[name="fontColor"]').val(rgb2hex($(this).css("color"))).css("background-color", $(this).css("color")).focus().end()
22        .find('input[name="borderColor"]').val(rgb2hex($(this).css("border-left-color"))).css("background-color", $(this).css("border-left-color")).focus().end()
23        .find('.preview-label-outer').css({
24                'background-color':$(this).css("backgroundColor"),
25                'color':$(this).css("color"),
26                'border-color':$(this).css("border-left-color")
27        })             
28        winElement.find(".preview-label-inner").text($(this).text());
29}
30
31function editLabel(data){       
32        var conteudoSpan = $(this).parent().find(".text-list").text();
33        var span = $(this).parent().find(".text-list");
34        $(this).parent().trigger('click').unbind('click', configureLabel).find("span.text-list")
35        .html('<input name="edit-value-list" class="edit-value-list" type="text" maxlength="18" value="'+conteudoSpan+'">').find("input[name='edit-value-list']").keydown(function(event){
36                event.stopPropagation();
37                $("input.edit-value-list").keyup(function () {
38                        var value = $(this).val();
39                        winElement.find('.input-nome').val(value);
40                }).keyup();
41                if(event.keyCode == 13){
42                        event.preventDefault();
43                        var nameLabel = $(".label-list").find(".edit-value-list").val();
44                        $(span).html(conteudoSpan)
45                        .parent().find('.edit').css("display","").parents("li").click(configureLabel);
46                        save_editLabel(nameLabel, data.applyToSelectedMessages);
47                }else if( event.keyCode == 27){
48                        $(this).trigger("focusout");
49                }
50        }).focusout(function(){
51                $(span).html(conteudoSpan)
52                .parent().find('.edit').css("display","").parents("li").click(configureLabel);
53        }).focus();
54        $(this).hide();
55}
56
57function deleteLabel(event){
58        var id = $(this).parents(".label-item").attr("class").match(/label-item-([\d]+[()a-zA-Z]*)/)[1];
59        var nameLabel = winElement.find(".input-nome").val();
60        confirmDelete(id, nameLabel);
61        event.stopImmediatePropagation();
62}
63
64function colors_suggestions(){
65        return [
66                                {name:'Padrão', border:'#3366cc', font:'#ffffff', background:'#3366cc'},
67                                {name:'Coala', border:'#123456', font:'#ffffff', background:'#385c80'},
68                                {name:'Tomate', border:'#d5130b', font:'#111111', background:'#e36d76'},
69                                {name:'Limão', border:'#32ed21', font:'#1f3f1c', background:'#b2f1ac'},
70                                {name:'Alto contraste', border:'#000000', font:'#ffffff', background:'#222222'}
71                        ]               
72}
73
74function rgb2hex(rgb){ 
75        if(!!(rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/))){
76                return "#" +
77                ("0" + parseInt(rgb[1],10).toString(16)).slice(-2) +
78                ("0" + parseInt(rgb[2],10).toString(16)).slice(-2) +
79                ("0" + parseInt(rgb[3],10).toString(16)).slice(-2);
80        }else{
81                return rgb;
82        }
83}
84
85function updateMessageLabels(msgsReference){
86        for(var i = 0; i < msgsReference.length; i++){
87                updateLabelsColumn({msg_number: msgsReference[i].messageNumber, boxname: msgsReference[i].folderName});
88        }       
89}
90
91function confirmDelete(id,nameLabel){
92        $.Zebra_Dialog('Deseja excluir esse marcador <strong>'+nameLabel+'</strong> das conversas que está relacionado e excluí-lo sem remover as conversas?', {
93                'type':     'question',
94                'custom_class': (is_ie ? 'configure-zebra-dialog' : ''),
95                'title':    'Atenção',
96                'buttons': ['Sim','Não'],               
97                'overlay_opacity': '0.5',
98                'onClose':  function(caption) {
99                        if(caption == 'Sim'){
100                                delete_label(id);
101                        }
102                }
103        });     
104        if(is_ie)
105                $(".ZebraDialogOverlay").css("z-index","1006");
106}               
107       
108function save_editLabel(nameLabel, apply){     
109
110        var lengthSpace = $.trim(nameLabel);
111       
112        if( lengthSpace.length >= 2){   
113                var qtdLi = $(".label-list-container ul").find("li").not(".empty-item").length;
114                // salvar marcador
115                if(qtdLi > 0 ){
116                        $(".save-label").button("disable");
117                        var labelEdited = {
118                                id : winElement.find(".edit-label").val(),
119                                uid: User.me.id,
120                                name : winElement.find('.input-nome').val().trim(),
121                                backgroundColor : winElement.find("input[name='backgroundColor']").val(),
122                                fontColor : winElement.find("input[name='fontColor']").val(),
123                                borderColor : winElement.find("input[name='borderColor']").val()
124                        }
125                        DataLayer.put('label', labelEdited.id, labelEdited);
126                        DataLayer.commit(false, false, function(data){
127                                var hasLabel = true;
128                                $.each(data, function(index, value) {
129                                        if(typeof value == 'object'){
130                                                hasLabel = false;
131                                        }
132                                        else {
133                                                hasLabel = value;
134                                        }
135                                });
136                                       
137                                        if(!hasLabel){
138                                                $(".label-list-container .label-list li").each(function(){
139                                                        var regex_match_2 = $(this).attr("class").match(/label-item-([\d]+[()a-zA-Z]*)/);
140                                                       
141                                                         if(regex_match_2 && regex_match_2[1] && regex_match_2[1] == labelEdited.id){
142                                                           $(this).html("<input type='hidden' name='labelItemId' class='id-item-list' value='"+labelEdited.id+"'>"+"<span class='text-list'>"+labelEdited.name+"</span><div class='button close tiny' style='float: right'></div><div class='button edit tiny' style='float: right'></div>").css({
143                                                                "background" : labelEdited.backgroundColor,
144                                                                "color" : labelEdited.fontColor,
145                                                                "border-color" : labelEdited.borderColor       
146                                                           });
147                                                           $(this).trigger('click');
148                                                         }     
149                                                });
150                                               
151                                                $("#MyMarckersList .label-list li").each(function(){
152                                                        var regex_match_2 = $(this).attr("class").match(/label-item-([\d]+[()a-zA-Z]*)/);
153                                                       
154                                                        if(regex_match_2 && regex_match_2[1] && regex_match_2[1] == labelEdited.id){
155                                                                $(this).html("<input type='hidden' name='labelItemId' class='id-item-list' value='"+labelEdited.id+"'>"+"<span>"+labelEdited.name+"</span>");
156                                                                $(this).find(".square-color").css('background', labelEdited.backgroundColor);
157                                                        }       
158                                                });
159                                       
160                                                winElement.find(".insert-label").val("");
161                                                $.Watermark.ShowAll();
162                                               
163                                                $(".label-list-container .label-list li").find('.button').button()
164                                                        .filter('.edit').button({icons:{primary:'ui-icon-pencil'}, text:false}).end()
165                                                        .filter('.close').button({icons:{primary:'ui-icon-close'}, text:false});
166                                                       
167                                                winElement.find('.edit').unbind("click").click(editLabel);                             
168                                                winElement.find('.close').click(deleteLabel);
169                                               
170                                                draw_tree_labels();
171                                                var msgsReference = DataLayer.get('labeled', {filter: ['=', 'labelId', ''+labelEdited.id]}, true);
172                                                updateMessageLabels(msgsReference);
173                               
174                                                /**
175                                                * Atualiza menu remove o menu presente em cada mensagem listada em uma pasta
176                                                * e carrega novamente para que os dados sejam atualizados
177                                                */
178                                                $.contextMenu( 'destroy', ".table_box tbody tr");
179                                                loadMenu();
180                                        }else{
181                                                msgCallback(hasLabel);
182                                        }
183                                       
184                                        $(".add-label-button").empty()
185                                        .addClass("ui-icon ui-icon-plus");
186                                        //winElement.find('.input-nome').val("").focus;
187                        });
188                // criar marcador
189                } else {
190                        var nameLabel = winElement.find(".input-nome").val();
191                        new_label(nameLabel, false, apply);                             
192                        $.Watermark.ShowAll();         
193                        $(".save-label").button("disable");     
194                }
195                //$(".label-list-container .label-list").find(".label-item-"+labelEdited.id).trigger("click");
196        } else {
197                alert("Mínimo 2 caracteres");
198        }       
199}
200
201function delete_label(id){
202        $(".label-list li").each(function () {
203                var regex_match = $(this).attr("class").match(/label-item-([\d]+[()a-zA-Z]*)/);
204                if (regex_match && regex_match[1] && regex_match[1] == id) {   
205                        $(this).remove();
206                }
207        });
208       
209        var msgsReference = DataLayer.get('labeled', {filter: ['=', 'labelId', ''+id]}, true);
210               
211        DataLayer.remove('label', id);
212       
213        DataLayer.commit(false, false, function(data){
214                $.contextMenu( 'destroy', ".table_box tbody tr");
215                loadMenu();
216                updateMessageLabels(msgsReference);             
217        });
218        winElement.find(".label-list li:first").trigger("click");
219       
220        if($(".label-list li").length == 0){
221                winElement.find(".label-list-container").html('<ul class="label-list"><li class="empty-item">'+get_lang("No labels found.")+'.</li></ul>');
222                $(".save-label").button("disable");     
223        }
224        var qtdLi = $(".label-list-container ul").find("li").not(".empty-item").length;
225        if (qtdLi == 0){
226                $(".my-labels").hide();
227                $(".label-list-container ul").find(".empty-item").css("display","");
228                winElement.find(".buttons .save-label .ui-button-text").text('Criar');
229                $(".delete-label").button("disable");   
230                $(".save-label").button("disable");     
231                               
232                winElement.find('.input-nome').val("");
233                winElement.find(".preview-label-inner").text("");
234       
235                var colorpicker = winElement.find('.lebals-colorpicker');
236                colorpicker.find('input[name="backgroundColor"]').val("#ebebeb")
237                .css("background-color", "#ebebeb").focus().end()
238                .find('input[name="fontColor"]').val("#000000").css("background-color", "#000000").focus().end()
239                .find('input[name="borderColor"]').val("#000000").css("background-color", "#000000").focus().end()
240                .find('.preview-label-outer').css({
241                        'background-color':"#ebebeb",
242                        'color':"#000000",
243                        'border-color':"#000000"
244                });
245                $(".input-nome").keyup(function () {
246                        var value = $(this).val();
247                        winElement.find('.preview-label-inner').text(value);
248                }).keyup();                             
249        }       
250}
251
252function new_label(nameLabel, isNew, apply){
253        var labelCreated = {
254                uid: User.me.id,
255                name : nameLabel.trim(),
256                backgroundColor : !!isNew ? '#ebebeb' : winElement.find("input[name='backgroundColor']").val(),
257                fontColor : !!isNew ? '#000000' : winElement.find("input[name='fontColor']").val(),
258                borderColor :!!isNew ? '#000000' : winElement.find("input[name='borderColor']").val()
259        }
260        DataLayer.put('label', labelCreated);
261       
262        $(".add-label-button").removeClass("ui-icon ui-icon-plus")
263        .html('<img alt="Carregando" title="Carregando" style="margin-left:10px;" src="../prototype/modules/mail/img/loader.gif" />');
264        var hasLabel = true;
265        var labelId;
266        DataLayer.commit(false, false, function(data){
267                $.each(data, function(index, value) {
268                        if(typeof value == 'object'){
269                                hasLabel = false;
270                                labelId = value.id;
271                        }else{
272                                hasLabel = value;
273                        }
274                });
275       
276                if(!hasLabel){
277                        newLabel = {
278                                id: labelId,
279                                name : nameLabel.trim(),
280                                uid: User.me.id,
281                                bgColor : !!isNew ? '#ebebeb' : winElement.find("input[name='backgroundColor']").val(),
282                                fontColor : !!isNew ? '#000000' : winElement.find("input[name='fontColor']").val(),
283                                borderColor : !!isNew ? '#000000' : winElement.find("input[name='borderColor']").val()
284                        };
285               
286                        /** Marca as mensagens selecionadas com o marcador criado*/
287                        if(apply){
288                                labeledMessages(newLabel.id)
289                        }
290                       
291                        $(".label-list-container ul").find(".empty-item").css("display","none");
292                        $(".label-list-container ul")
293                        .prepend(DataLayer.render("../prototype/modules/mail/templates/label_listitem.ejs", newLabel))
294                        .find("li:first")
295                        .fadeIn("slow").click(configureLabel);
296                       
297                        draw_tree_labels();
298
299                        $(".label-list-container .label-list li").not(".empty-item").click(function(){
300                                $(".label-list-container .label-list li").find("img").remove();
301                                $(".label-list-container .label-list li.label-item").removeClass("selected");
302                                $(this).prepend("<img src='../prototype/modules/mail/img/triangle.png' style='margin: 0 5px 0 -5px;'>");
303                                $(this).addClass("selected");
304                        });
305                       
306                        $(".label-list-container .label-list li").find('.button').button()
307                        .filter('.edit').button({icons:{primary:'ui-icon-pencil'}, text:false}).end()
308                        .filter('.close').button({icons:{primary:'ui-icon-close'}, text:false});
309                       
310                        //posiciona para edição o label inserido                       
311                        winElement.find("ul.label-list li:first").trigger("click");                     
312                        winElement.find(".buttons .save-label .ui-button-text").text('Salvar');
313                        $(".delete-label").button("enable");
314                       
315                        winElement.find('.edit').unbind("click").click(editLabel);                             
316                        winElement.find('.close').click(deleteLabel);
317                       
318                        $(".my-labels").show();
319                       
320                        $.contextMenu( 'destroy', ".table_box tbody tr");
321                        loadMenu();
322                       
323                        $(".add-label-button").empty()
324                        .addClass("ui-icon ui-icon-plus");
325                }else{
326                        $(".add-label-button").empty()
327                        .addClass("ui-icon ui-icon-plus");
328                        msgCallback(hasLabel);
329                }
330        });
331}
332
333function init_label(data){
334
335        winElement = data.window;
336       
337        //TODO Mudar quando API abstrair atualizações no cache
338        DataLayer.remove('label',false);
339        labels = DataLayer.get('label',{criteria:{order: 'name'}});
340       
341        if(labels){
342                Label_List = winElement
343                .find(".label-list-container").html(DataLayer.render("../prototype/modules/mail/templates/label_list.ejs", {labels: labels}));
344               
345        }else{
346                //Exibe a mensagem informando o usuário de que não há nenhum marcador cadastrado.
347                Label_List = winElement
348                .find(".label-list-container").html('<ul class="label-list"><li class="empty-item">'+get_lang("No labels found.")+'.</li></ul>');
349               
350        }
351        Label_List.end()
352        .find('.button').button()
353        .filter('.edit').button({icons:{primary:'ui-icon-pencil'}, text:false}).end()
354        .filter('.close').button({icons:{primary:'ui-icon-close'}, text:false});       
355       
356        winElement.find('.edit').click(editLabel);
357        winElement.find('.close').click(deleteLabel);
358       
359        //marca 'd agua
360        winElement.find(".insert-label").Watermark(winElement.find(".insert-label").val());
361       
362        /*
363        $("input.insert-label").keyup(function () {
364                $.Watermark.HideAll();
365                var value = $(this).val();
366                winElement.find('.input-nome').val(value);
367        }).keyup();
368        */
369        if (!(labels)){
370                winElement.find(".buttons .save-label .ui-button-text").text('Criar');
371                $(".delete-label").button("disable");
372        }else{
373                winElement.find(".label-list li:first").addClass("selected").prepend("<img src='../prototype/modules/mail/img/triangle.png' style='margin: 0 5px 0 -5px;'>");
374        }
375        $(".save-label").button("disable");
376        /**
377        * seta a ação de click para os marcadores listados na tela
378        */
379        winElement.find(".label-list li").not(".empty-item").click(configureLabel);
380       
381        if (data.selectedItem)
382                winElement.find(".label-list li.label-item-"+data.selectedItem).trigger("click");
383        else
384                winElement.find(".label-list li:first").trigger("click");
385               
386        var dataColorPicker = {
387                colorsSuggestions: colors_suggestions()
388        };
389       
390        winElement.find('select.color-suggestions').change(function() {
391                $(".save-label").button("enable");
392                var colorpicker = winElement.find('.lebals-colorpicker');
393                var colors;
394                if(colors = dataColorPicker.colorsSuggestions[$(this).val()]) {
395                        colorpicker
396                        .find('input[name="fontColor"]').val(colors.font).focus().end()
397                        .find('input[name="backgroundColor"]').val(colors.background).focus().end()
398                        .find('input[name="borderColor"]').val(colors.border).focus().end()
399
400                        .find('.preview-label-outer').css({
401                                'background-color':dataColorPicker.colorsSuggestions[$(this).val()].background,
402                                'border-color':dataColorPicker.colorsSuggestions[$(this).val()].border,
403                                'color':dataColorPicker.colorsSuggestions[$(this).val()].font
404                        });
405                }                                       
406        });
407        var colorpickerPreviewChange = function(color) {
408                       
409                var pickedup = winElement.find('.colorwell-selected').val(color).css('background-color', color);
410
411                $(".save-label").button("enable");
412               
413                var colorpicker = winElement.find('.lebals-colorpicker');                       
414
415                if (pickedup.is('input[name="backgroundColor"]')) {
416                        colorpicker.find('.preview-label-outer').css('background-color',color);
417                } else if (pickedup.is('input[name="fontColor"]')) {
418                        colorpicker.find('.preview-label-outer').css('color',color);
419                } else if (pickedup.is('input[name="borderColor"]')) {
420                        colorpicker.find('.preview-label-outer').css('border-color',color);
421                }               
422        }
423               
424        var f = $.farbtastic(winElement.find('.colorpicker'), colorpickerPreviewChange);
425        var selected;
426                               
427        winElement.find('.colorwell').each(function () {
428                f.linkTo(this);
429        })
430        .focus(function() {
431                if (selected) {
432                        $(selected).removeClass('colorwell-selected');
433                }
434                $(selected = this).addClass('colorwell-selected');
435                f.linkTo(this, colorpickerPreviewChange);
436                f.linkTo(colorpickerPreviewChange);
437        });
438       
439        winElement.find(".add-label-button").click(function (event) {
440                $.Watermark.HideAll();
441                var nameLabel = winElement.find(".insert-label").val();
442               
443                var lengthSpace = $.trim(nameLabel);
444               
445                if(lengthSpace.length >= 2){
446                        new_label(nameLabel, true, data.applyToSelectedMessages);
447                        $.Watermark.ShowAll();
448                        winElement.find(".insert-label").val("");
449                        } else {
450                                alert("Mínimo 2 caracteres");
451                        }
452                event.stopImmediatePropagation();
453        });
454       
455        winElement.find('.insert-label').keydown(function(event, ui) {
456                if (event.keyCode == 13)
457                        winElement.find(".add-label-button").trigger('click');
458        });
459       
460        //excluir marcador {deve ser para o botão grande na janela de edição e nao o pequeno da lista}
461        winElement.find(".buttons .delete-label").click(function(event){
462                var id = winElement.find(".edit-label").val();         
463                var nameLabel = winElement.find(".input-nome").val();   
464                confirmDelete(id, nameLabel);
465                event.stopImmediatePropagation();
466        });
467       
468        $(".label-list-container .label-list li").not(".empty-item").click(function(){
469                $(".label-list-container .label-list li").find("img").remove();
470                $(".label-list-container .label-list li.label-item").removeClass("selected");
471                $(this).prepend("<img src='../prototype/modules/mail/img/triangle.png' style='margin: 0 5px 0 -5px;'>");
472                $(this).addClass("selected");
473        });
474               
475        //salvar/criar marcador
476        winElement.find(".buttons .save-label").click(function(){
477                var nameLabel = winElement.find(".input-nome").val();
478                save_editLabel(nameLabel, data.applyToSelectedMessages);
479        });     
480        //desfazer marcador
481        winElement.find(".buttons .undo-label").click(function(event){
482                var edit = winElement.find(".edit-label").val();               
483                $(".label-list-container .label-list li").each(function(){
484                        var regex_match_3 = $(this).attr("class").match(/label-item-([\d]+[()a-zA-Z]*)/);
485                        if(regex_match_3 && regex_match_3[1] && regex_match_3[1] == edit){
486                                $(this).trigger("click");
487                        }
488                });
489        });
490       
491        //fechar
492        $(".button-close-window .close-window").click(function(){
493                $(".label-configure-win").dialog("close");
494        });
495       
496        winElement.find(':input').change(function(event){
497                if (event.keyCode != '27' && event.keyCode != '13' && !$(event.target).is(".edit-value-list") && !$(event.target).is(".insert-label") )
498                winElement.find(".save-label").button("enable");
499        }).keydown(function(event){
500                if (event.keyCode != '27' && event.keyCode != '13' && !$(event.target).is(".edit-value-list") && !$(event.target).is(".insert-label"))
501                winElement.find(".save-label").button("enable");
502        });     
503
504        $(".input-nome").keyup(function () {
505                                var value = $(this).val();
506                                winElement.find('.preview-label-inner').text(value);
507        }).keyup();     
508}
Note: See TracBrowser for help on using the repository browser.