source: trunk/prototype/modules/filters/filters.js @ 5399

Revision 5399, 14.0 KB checked in by cristiano, 12 years ago (diff)

Ticket #2434 - Alteração da estrutura de diretórios da nova API

Line 
1 
2bytes2Size = function(bytes) {
3        var sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
4        if (bytes === 0) return 'n/a';
5        var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
6        var size = (i<2) ? Math.round((bytes / Math.pow(1024, i))) : Math.round((bytes / Math.pow(1024, i)) * 100)/100;
7        return  size + ' ' + sizes[i];
8};
9
10flags2Class = function(cellvalue) {
11        var flags_enum = cellvalue.split(',');
12        var classes = '';
13        for (var i=0; i<flags_enum.length; i++){
14                classes += '<span class="icon-'+flags_enum[i].toLowerCase()+'"> </span>';
15        }
16        return classes;
17};
18
19date2Time = function (timestamp) {
20        var date = new Date();
21        if ((date.getTime() - timestamp) < (24*60*60*1000)) {
22                return '<span class="timable" title="'+timestamp+'"> </span>';
23        } else {
24                date = new Date(timestamp);
25                var b = date.toISOString().split("T")[0].split("-");
26                var c = b[2] + "/" + b[1] + "/" + b[0];
27                return '<span class="datable">' + c + '</span>';
28        }
29};
30
31unorphanize = function(root, element) {
32        var ok = false;
33        for (var i=0; i<root.length; i++) {
34                if (root[i].id == element.parentFolder) {
35                        element.children = [];
36                        root[i].children.push(element);
37                        return true;
38                } else if (ok = unorphanize(root[i].children, element)) {
39                        break;
40                }
41        }
42
43        return ok;
44};
45
46keys = function( object ){
47 
48  var array = [];
49 
50  for( var key in object )
51       array[ array.length ] = key;
52 
53  return( array );
54
55}
56
57showDetails = function( filter ){
58 
59    form.get(0).reset();
60
61    nameObj.val( filter.name );
62
63    for( var i = 0; i < filter.criteria.length; i++ ){
64
65        criterias.filter( '[value="' + filter.criteria[i].field + '"]' )
66        .siblings( '[name="criteriaOperator[]"]' ).val( filter.criteria[i].operator ).end()
67        .siblings( '[name="criteriaValue[]"]' ).val( filter.criteria[i].value );
68
69    }
70
71    for( var i = 0; i < filter.actions.length; i++ ){
72
73        actions.filter( '[value="' + filter.actions[i].type + '"]' ).val( filter.actions[i].type )
74        .siblings( '[name="actionParameter[]"]' ).val( filter.actions[i].parameter );
75
76    }
77 
78    isExact.val( filter.isExact ? "and" : "or" );
79}
80
81/* --- ------ --- */
82
83DataLayer.codec( "filter", "detail", {
84 
85  decoder: function( form ){
86   
87      if( form.vacation )
88          return {
89
90                criteria: [{ value: "", operator: "*", field: "from" }],
91                actions: [{ parameter: form.vacation, type: "replyto" }],
92                id: "vacation",
93                name: "vacation",
94                isExact: false
95
96      }
97
98      return  {
99                id: form.name,
100                name: form.name,
101                isExact: ( form.isExact === "and" ),
102                criteria: $.map( form.criteriaOperator || [], function( criteriaOperator, i ){
103
104                        return (!form.criteriaValue[i]) ? null:
105
106                                {value:  form.criteriaValue[i],
107                                  operator: criteriaOperator,
108                                  field:  form.criteriaType[i]};
109
110                }),
111                actions: $.map( form.actionType || [], function( type, i ){
112
113                        return (!type) ? null:
114                              {parameter: form.actionParameter[i], type: type };
115
116                }),
117                applyMessages: allMessages? !$.isEmptyObject( selectedMessages ) ?
118
119                               keys( selectedMessages ) : allMessages : ""
120      };
121
122      //        'vacation' => ""
123  },
124 
125  encoder: function( filters ){
126   
127        var rules = [];
128
129        for( var id in filters )
130              rules[ rules.length ] = filters[id];
131
132        return { rules: rules };
133
134  }
135});
136
137DataLayer.codec( "folder", "select", {
138 
139  decoder:function(){
140
141     
142   
143  },
144  encoder:function( data ){
145 
146      var tree1 = [], tree2 = [], tree3 = [];
147
148      for (var i=0; i<data.length; i++) {
149
150              if (/^INBOX/.test(data[i].id)) {
151                      if (!unorphanize(tree1, data[i])) {
152                              data[i].children = [];
153                              tree1.push(data[i]);
154                      }
155              }
156              else if (/^user/.test(data[i].id)) {
157                      if (!unorphanize(tree2, data[i])) {
158                              data[i].children = [];
159                              tree2.push(data[i]);
160                      }
161              }
162              else if (/^local_messages/.test(data[i].id)) {
163                      if (!unorphanize(tree3, data[i])) {
164                              data[i].children = [];
165                              tree3.push(data[i]);
166                      }
167              }
168
169      }
170     
171      return {folders: [ tree1, tree2, tree3 ]};
172
173  }
174
175});
176
177DataLayer.listen( "filter", function( status ){
178 
179    DataLayer.render( BASE_PATH + 'modules/filters/filter-list.ejs', 'filter:detail', reraster );
180
181});
182
183
184
185var BASE_PATH = '../prototype/';
186
187DataLayer.basePath = BASE_PATH + "REST.php?q=";
188DataLayer.dispatchPath = BASE_PATH;
189
190var selectedMessages = {};
191var allMessages = false;
192
193var raster = function( html ){
194 
195    container = $('body.expressomail-module-container').append( html ).find(".expresso-window-container");
196    list_container = container.find(".rule-list-container");
197    details_container = container.find(".rule-details-container");
198    vacation_container = container.find(".vacation-details-container");
199    form = container.find("form");
200   
201    criterias = details_container.find( 'fieldset input[name="criteriaType[]"]' );
202    actions = details_container.find( 'fieldset input[name="actionType[]"]' );
203    nameObj = details_container.find( 'input[name="name"]' );
204    isExact = details_container.find( 'input[name="isExact"]' );
205 
206    formatter();
207   
208    container = container.dialog({
209            width:700,
210            modal: true,
211            closeOnEscape:true,
212            close:function(event, ui) {
213                    event.stopPropagation();
214                    list_container.removeClass('hidden');
215                    details_container.addClass('hidden');
216                    vacation_container.addClass('hidden');
217            },
218                open: function () {
219                        $(".ui-dialog .ui-dialog-titlebar")
220                        .append('<a href="#" class="ui-dialog-titlebar-minimize ui-corner-all" role="button"><span class="ui-icon ui-icon-minusthick">minimize</span></a>')
221                        .find('.ui-dialog-titlebar-minimize').click(function() {
222                                $(".ui-dialog-buttonpane, .ui-dialog-content").toggle();
223                                $(".ui-icon-minusthick, .ui-icon-newwin").toggleClass('ui-icon-minusthick').toggleClass('ui-icon-newwin');
224                        });
225                },
226            autoOpen: false
227    });
228   
229    details_container.accordion({autoHeight: false});
230   
231    DataLayer.render( BASE_PATH + 'api/templates/folderselect.ejs', 'folder:select', function( html ){
232          details_container.find(".select-folderlist").append( html );
233    });
234
235    container.find(".button").button()
236   
237    .filter(".menu-filters > .button")
238
239    .click(function(){
240
241        container.dialog( 'close' );
242
243    })
244   
245    .filter(".cancel")
246   
247    .click(function(){
248
249        DataLayer.rollback( 'filter' );
250        return( false );
251
252    })
253   
254    .end().filter(".submit")
255   
256    .click(function(){
257
258        DataLayer.commit( 'filter' );
259        return( false );
260
261    });
262   
263    details_container.find( ".menu-container" )
264
265        .find(".button.cancel").click(function(event){
266
267                details_container.accordion('activate',0);
268
269                showGridButton.removeClass('hidden');
270                grid.addClass('hidden').jqGrid('GridDestroy');
271         
272                list_container.removeClass('hidden');
273                details_container.addClass('hidden');
274
275                return( false );
276
277        }).end()
278        .find(".button.submit").click(function(event){
279
280                $(this).submit();
281
282                details_container.accordion('activate',0);
283
284                showGridButton.removeClass('hidden');
285                grid.addClass('hidden').jqGrid('GridDestroy');
286
287                list_container.removeClass('hidden');
288                details_container.addClass('hidden');
289
290                return( false );
291
292        }).end()
293        .find(".button.back").click(function(event){
294
295                details_container.accordion('activate',0);
296
297                return( false );
298
299        }).end()
300        .find(".button.forth").click(function(event){
301
302                details_container.accordion('activate',1);
303
304                return( false );
305
306        }).end()
307
308    //$( ".expresso-window-container .rule-details-container" ).accordion();
309    // var removeURL = new RegExp("^*.#");
310
311    // ------------------------------------------------------------
312    // ------------------------------------------------------------
313
314    //jqgrid
315    .end().find(".fields-search-messages .button.search")
316
317    .click(function(){
318
319                  var rule = DataLayer.form( form );
320                 
321                  showGridButton = $(this).parent();
322
323                  var connect = rule.isExact ? "AND" : "OR";
324
325                  var filter = $.map( rule.criteria, function( criteria, i ){
326
327                          if( i === 0 )
328                              return {"0": criteria.field, "1": criteria.operator, "2": criteria.value};
329                          else
330                              return {"0": connect,  "1": criteria.field, "2": criteria.operator, "3": criteria.value};
331                  });
332
333                  $.ajax( { 
334                            url: DataLayer.basePath + 'folder/INBOX/message&' +  $.param( {"filter": filter} ),
335
336                            dataType: 'json',
337
338                            success: function(data){
339                             
340                                  allMessages = data;
341
342                                  grid = showGridButton.addClass('hidden')
343                                  .siblings(".fields-search-messages-grid, .fields-search-messages-grid-pager")
344                                  .removeClass('hidden').filter(".fields-search-messages-grid").jqGrid({
345
346                                          url: DataLayer.basePath + 'folder/INBOX/message&' +  $.param( {"filter": [ "msgNumber", "IN", data ]} ),
347                                          datatype: "json",
348                                          mtype: 'GET',
349                                          colNames:['#', ' ', 'De', 'Assunto', 'Data', 'Tamanho'],
350                                          colModel:[
351                                                  {name:'msg_number',index:'msg_number', width:45, hidden:true, sortable:false},
352                                                  {name:'flags',index:'msg_number', width:40, sortable:false, formatter:flags2Class},
353                                                  {name:'from.name',index:'msg_number', width:130, sortable:false},
354                                                  {name:'subject',index:'subject', width:250, sortable:false},
355                                                  {name:'timestamp',index:'timestamp', width:65, align:"center", sortable:false, formatter:date2Time},
356                                                  {name:'size',index:'size', width:50, align:"right", sortable:false, formatter:bytes2Size}
357                                          ],
358                                          jsonReader : {
359                                                    root:"rows",
360                                                    page: "page",
361                                                    total: "total",
362                                                    records: "records",
363                                                    repeatitems: false,
364                                                    id: "0"
365                                          },
366                                          rowNum:10,
367                                          rowList:[10,25,50],
368                                          pager: '#fields-search-messages-grid-pager',
369                                          sortname: 'id',
370                                          viewrecords: true,
371                                          sortorder: "desc",
372                                          multiselect: true,
373                                          autowidth: true,
374                                          height:40,
375                                          loadComplete: function(data) {
376                      //                                // aplica o contador
377                      //                                jQuery('.timable').each(function (i) {
378                      //                                        jQuery(this).countdown({
379                      //                                                since: new Date(parseInt(this.title)),
380                      //                                                significant: 1,
381                      //                                                layout: 'h&aacute; {d<}{dn} {dl} {d>}{h<}{hn} {hl} {h>}{m<}{mn} {ml} {m>}{s<}{sn} {sl}{s>}',
382                      //                                                description: ' atr&aacute;s'
383                      //                                        });
384                      //                                });
385                                          },
386                                          onSelectRow: function (id, selected) {
387
388                                              if( selected )
389                                                  selectedMessages[ id ] = true;
390                                              else
391                                                  delete selectedMessages[ id ];
392
393                                          },
394                                          caption: 'Mensagens que atendem aos crit&eacute;rios'
395                                  });
396                            }
397                  } );
398
399                 
400    });
401   
402    vacation_container.find( ".menu-container" )
403        .find(".button.back").click(function(event){
404
405                list_container.removeClass('hidden');
406                vacation_container.addClass('hidden');
407
408                return( false );
409
410        }).end()
411        .find(".button.submit").click(function(event){
412
413                $(this).submit();
414         
415                list_container.removeClass('hidden');
416                vacation_container.addClass('hidden');
417                return( false );
418        });   
419}
420
421var reraster = function( html ){
422
423  list_container.find( '.ui-widget' ).remove();
424
425  list_container.html( html ).find(".button").button();
426 
427  formatter();
428}
429
430var formatter = function(){
431
432    checkBoxes = container.find(".rule-list").selectable({
433
434        selecting: function(event, ui) {
435            $(ui.selecting).find(':checkbox').attr('checked', true);
436        },
437        unselecting: function(event, ui) {
438            $(ui.unselecting).find(':checkbox').attr('checked', false);
439        }
440    })
441    .find(':checkbox').change(function () {
442
443//      if ($(this).attr("checked"))
444//          $(this).parents('.rule').addClass('ui-selected');
445//      else
446            $(this).parents('.rule').toggleClass('ui-selected');
447
448    });
449
450    list_container.children()
451
452    .filter( ".fields-add" )
453
454        .find(".button.add").click(function(){
455
456                list_container.addClass('hidden');
457                details_container.removeClass('hidden');
458                form.get(0).reset();
459
460                return( false );
461        })
462        .filter(".vacation").click(function(){
463
464                details_container.addClass('hidden');
465                vacation_container.removeClass('hidden');
466                form.get(0).reset();
467
468                return( false );
469
470        }).end().end()
471
472    .end().filter( ".fields-selected-itens" )
473
474    .find(".button.enable").click(function(){
475
476            var values = [];
477     
478            checkBoxes.filter(':checked').parents(".rule-list").find('.title').each(function(){
479
480                values[ values.length ] = { id: this.innerHTML, enabled: true };
481
482            });
483
484            DataLayer.put( 'filter', values );
485
486    }).end()
487
488    .find(".button.disable").click(function(){
489     
490            var values = [];
491     
492            checkBoxes.filter(':checked').parents(".rule-list").find('.title').each(function(){
493
494                values[ values.length ] = { id: this.innerHTML, enabled: false };
495
496            });
497
498            DataLayer.put( 'filter', values );
499
500    }).end()
501
502    .find(".button.delete").click(function(){
503     
504            checkBoxes.filter(':checked').parents(".rule-list").find('.title').each(function(i, o){
505
506                 DataLayer.remove( 'filter', o.html() );
507
508            });
509
510    }).end()
511   
512
513    .end().find( ".menu-control .button" )
514
515        .filter(".enable, .disable").click( function(event) {
516
517                var id = $(this).parents("li.rule").find('.title').html();
518
519                DataLayer.put( 'filter', id, { enabled: !$(this).is('.enable') } );
520        })
521
522        .filter(".enable").button({
523                icons: {
524                        primary: "ui-icon-circle-check"
525                },
526                text: false
527        }).end()
528
529        .filter(".disable").button({
530                icons: {
531                        primary: "ui-icon-circle-close"
532                },
533                text: false
534        }).end().end()
535       
536        .filter(".close").button({
537                icons: {
538                        primary: "ui-icon-close"
539                },
540                text: false
541        }).click( function(event) {
542                $(event.target)
543                .parents("li.rule").find('.title')
544                .each( function(){
545
546                    DataLayer.remove( 'filter', $(this).html() );
547
548                }).end().remove();
549        }).end()
550       
551        .filter(".update").click(function(event){
552
553                var id = ( event.target.href || event.target.parentNode.href ).replace( new RegExp("^.*#"), "" );
554
555                var data = DataLayer.get( 'filter', id );
556
557                if( id === "vacation" )
558                {
559                    $('[name="vacation"]').val( data.actions[0].parameter );
560
561                    list_container.addClass('hidden');
562                    vacation_container.removeClass('hidden');
563                    return;
564                }
565
566                showDetails( data );
567
568                list_container.addClass('hidden');
569                details_container.removeClass('hidden');
570        }).end()
571       
572        .removeClass('ui-button-icon-only');
573};
574
575DataLayer.render( BASE_PATH + 'modules/filters/filters.ejs', 'filter:detail', raster, true );
576// ------------------------------------------------------------
577// ------------------------------------------------------------     
Note: See TracBrowser for help on using the repository browser.