]> git.sur5r.net Git - bacula/bacula/blobdiff - gui/baculum/protected/JavaScript/slide-window.js
baculum: Search field works with all table cells
[bacula/bacula] / gui / baculum / protected / JavaScript / slide-window.js
index 03ac2f7d0b31b5641384b811f4673a197ff51d57..d423f874b9a49df3b0f5ae893c99936a6ad932f9 100644 (file)
@@ -244,7 +244,7 @@ var SlideWindowClass = Class.create({
        },
 
        setWindowElementsEvent: function(opts) {
-               this.repeaterEl = opts.repeater_id;
+               this.repeaterEl = opts.repeater_id + '_Container';
                this.gridEl = opts.grid_id;
                this.loadRequest = opts.request_obj;
                if (opts.hasOwnProperty('actions_obj')) {
@@ -258,11 +258,13 @@ var SlideWindowClass = Class.create({
 
        setLoadRequest: function() {
                var dataList = [];
-               if($(this.gridEl)) {
-                       dataList = $(this.gridEl).select('tr');
+               var repeater = $(this.repeaterEl);
+               var grid = $(this.gridEl);
+               if(grid) {
+                       dataList = grid.select('tr');
                        this.makeSortable();
-               } else if ($(this.repeaterEl + '_Container')) {
-                       dataList = $(this.repeaterEl + '_Container').select('div.slide-window-element');
+               } else if (repeater) {
+                       dataList = repeater.select('div.slide-window-element');
                }
 
                var set_callback_parameter = function(element) {
@@ -274,6 +276,7 @@ var SlideWindowClass = Class.create({
                                this.configurationObj.openConfigurationWindow(this);
                        }
                }.bind(this);
+               this.setSearch();
                dataList.each(function(tr) {
                        $(tr).observe('click', function(index, clickedEl) {
                                var target = clickedEl.target || clickedEl.srcElement;
@@ -286,6 +289,7 @@ var SlideWindowClass = Class.create({
                        }.bind(this, tr));
                }.bind(this));
                Formatters.set_formatters();
+               this.revertSortingFromCookie();
        },
 
        isConfigurationOpen: function() {
@@ -299,14 +303,21 @@ var SlideWindowClass = Class.create({
                return is_open;
        },
 
-       sortTable: function (col, reverse) {
+       sortTable: function (col, reverse, set_cookie) {
                var table = document.getElementById(this.gridEl);
                var tb = table.tBodies[0], tr = Array.prototype.slice.call(tb.rows, 0), i;
                reverse = -((+reverse) || -1);
                tr = tr.sort(function (a, b) {
-                       var val;
-                       var val_a = a.cells[col].textContent.trim();
-                       var val_b = b.cells[col].textContent.trim();
+                       var val, val_a, val_b, el_a, el_b;
+                       el_a = a.cells[col].childNodes[1];
+                       el_b = b.cells[col].childNodes[1];
+                       if (el_a && el_b && el_a.nodeType === 1 && el_b.nodeType === 1 && el_a.hasAttribute('rel') && el_b.hasAttribute('rel')) {
+                               val_a = el_a.getAttribute('rel');
+                               val_b = el_b.getAttribute('rel');
+                       } else {
+                               val_a = a.cells[col].textContent.trim();
+                               val_b = b.cells[col].textContent.trim();
+                       }
                        if (!isNaN(parseFloat(val_a)) && isFinite(val_a) && !isNaN(parseFloat(val_b)) && isFinite(val_b)) {
                                val = val_a - val_b
                        } else {
@@ -314,8 +325,9 @@ var SlideWindowClass = Class.create({
                        }
                        return reverse * (val);
                });
-               for(i = 0; i < tr.length; i++) {
-                       var even = ((i % 2) == 0);
+               var even;
+               for (i = 0; i < tr.length; i++) {
+                       even = ((i % 2) == 0);
                        if (even) {
                                tr[i].className = this.elements.contentItems;
                        } else {
@@ -323,6 +335,9 @@ var SlideWindowClass = Class.create({
                        }
                        tb.appendChild(tr[i]);
                }
+               if (set_cookie === true) {
+                       Cookies.set_cookie(this.gridEl, col + ':' + reverse);
+               }
        },
 
        makeSortable: function () {
@@ -344,29 +359,55 @@ var SlideWindowClass = Class.create({
                while (--i >= downCounter) (function (i) {
                        var dir = 1;
                        th[i].addEventListener('click', function () {
-                               self.sortTable(i, (dir = 1 - dir));
+                               self.sortTable(i, (dir = 1 - dir), true);
                        });
                }(i));
        },
 
+       revertSortingFromCookie: function() {
+               var sorting = Cookies.get_cookie(this.gridEl);
+               if (sorting != null) {
+                       var sort_param = sorting.split(':');
+                       var col = parseInt(sort_param[0], 10);
+                       var order = -(parseInt(sort_param[1], 10));
+                       this.sortTable(col, order);
+               }
+       },
+
        setSearch: function() {
-               var search_pattern = new RegExp(this.search.value)
-               $$('div[id="' + this.windowId + this.elements.containerSuffix + '"] div.' + this.elements.contentItems).each(function(value){
-                               
-                               if(search_pattern.match(value.childNodes[2].textContent) == false) {
+               var search_pattern = new RegExp(this.search.value, 'i');
+               var repeater = $(this.repeaterEl);
+               var grid = $(this.gridEl);
+               if (repeater) {
+                       repeater.select('div.' + this.elements.contentItems).each(function(value){
+                               if(search_pattern.test(value.childNodes[2].textContent) == false) {
                                        value.setStyle({'display' : 'none'});
                                } else {
                                        value.setStyle({'display' : ''});
                                }
                        }.bind(search_pattern));
-                       
-                       $$('div[id="' + this.windowId + this.elements.containerSuffix + '"] tr.' + this.elements.contentItems + ', div[id="' + this.windowId + this.elements.containerSuffix + '"] tr.' + this.elements.contentAlternatingItems).each(function(value){
-                               if(search_pattern.match(value.down('div').innerHTML) == false) {
-                                       value.setStyle({'display' : 'none'});
+               }
+
+               if (grid) {
+                       grid.select('tr').each(function(value){
+                               var tds = value.select('td');
+                               var td;
+                               var found = false;
+                               for (var i = 0; i < tds.length; i++) {
+                                       td = tds[i].textContent.trim();
+                                       if(search_pattern.test(td) == true) {
+                                               found = true;
+                                               break;
+                                       }
+                               }
+
+                               if(found === true) {
+                                       value.show();
                                } else {
-                                       value.setStyle({'display' : ''});
+                                       value.hide();
                                }
                        }.bind(search_pattern));
+               }
        },
        setElementsCount : function() {
                var elements_count = $$('div[id="' + this.windowId + this.elements.containerSuffix + '"] div.' + this.elements.contentItems).length || $$('div[id="' + this.windowId + this.elements.containerSuffix + '"] tr.' + this.elements.contentItems + ', div[id="' + this.windowId + this.elements.containerSuffix + '"] tr.' + this.elements.contentAlternatingItems).length;
@@ -383,11 +424,10 @@ var SlideWindowClass = Class.create({
                return $(this.windowId + this.elements.toolbarSuffix).visible();
        },
        setActions: function() {
-               var table = $(this.window).down('table');
-               var checkboxes = table.select('input[name="actions_checkbox"]');
+               var checkboxes = this.getCheckboxes();
                checkboxes.each(function(el) {
                        el.observe('change', function() {
-                               var is_checked = this.is_any_checked(checkboxes);
+                               var is_checked = this.isAnyChecked(checkboxes);
                                if(is_checked === true && !this.areActionsOpen()) {
                                        this.showActions();
                                } else if (is_checked === false && this.areActionsOpen()) {
@@ -396,7 +436,7 @@ var SlideWindowClass = Class.create({
                        }.bind(this));
                 }.bind(this));
        },
-       is_any_checked: function(checkboxes) {
+       isAnyChecked: function(checkboxes) {
                var is_checked = false;
                checkboxes.each(function(ch) {
                        if(ch.checked == true) {
@@ -407,10 +447,23 @@ var SlideWindowClass = Class.create({
                return is_checked;
        },
 
+       getCheckboxes: function() {
+               var grid = $(this.gridEl);
+               var checkboxes = [];
+               if (grid) {
+                       checkboxes = grid.select('input[name="actions_checkbox"]');
+               }
+               return checkboxes;
+       },
+
+       areCheckboxesChecked: function() {
+               var checkboxes = this.getCheckboxes();
+               return this.isAnyChecked(checkboxes);
+       },
+
        markAllChecked: function(check) {
                this.checked = [];
-               var table = $(this.window).down('table');
-               var checkboxes = table.select('input[name="actions_checkbox"]');
+               var checkboxes = this.getCheckboxes();
                var containerId;
                if(checkboxes.length > 0) {
                        checkboxes.each(function(ch, index) {