source: trunk/prototype/modules/mail/js/label.js @ 5909

Revision 5909, 18.2 KB checked in by marcieli, 12 years ago (diff)

Ticket #2593 - Concluída melhoria: não permitir marcadores com mesmo nome.

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