      1 (function ($, rf) {
      2
      3     rf.ui = rf.ui || {};
      4
      5     rf.ui.DataTable = function(id, options) {
      6         $super.constructor.call(this, id);
      7         this.options = $.extend(this.options, options || {});
      8         this.element = this.attachToDom();
      9         var self = this;
     10         var header = $(this.element).find('.rf-dt-thd');
     11         header.find(".rf-dt-c-srt").each(function() {
     12             $(this).bind("click", {sortHandle: this}, $.proxy(self.sortHandler, self));
     13         });
     14         header.find(".rf-dt-flt-i").each(function() {
     15             $(this).bind("blur", {filterHandle: this}, $.proxy(self.filterHandler, self));
     16         });
     17     };
     18
     19     rf.BaseComponent.extend(rf.ui.DataTable);
     20     var $super = rf.ui.DataTable.$super;
     21
     22     $.extend(rf.ui.DataTable, {
     23             SORTING: "rich:sorting",
     24             FILTERING: "rich:filtering",
     25             SUBTABLE_SELECTOR:".rf-cst"
     26         });
     27
     28     $.extend(rf.ui.DataTable.prototype, ( function () {
     29
     30         var invoke = function(event, attributes) {
     31             rf.ajax(this.id, event, {"parameters" : attributes});
     32         };
     33
     34         var createParameters = function(type, id, arg1, arg2) {
     35             var parameters = {};
     36             var key = this.id + type;
     37             parameters[key] = (id + ":" + (arg1 || "") + ":" + arg2);
     38
     39             var eventOptions = this.options.ajaxEventOption;
     40             for (key in eventOptions) {
     41                 if (!parameters[key]) {
     42                     parameters[key] = eventOptions[key];
     43                 }
     44             }
     45             return parameters;
     46         };
     47
     48
     49         return {
     50
     51             name : "RichFaces.ui.DataTable",
     52
     53             sort: function(columnId, direction, isClear) {
     54                 invoke.call(this, null, createParameters.call(this, rf.ui.DataTable.SORTING, columnId, direction, isClear));
     55             },
     56
     57             clearSorting: function() {
     58                 this.sort("", "", true);
     59             },
     60
     61             sortHandler: function(event) {
     62                 var sortHandle = $(event.data.sortHandle);
     63                 var button = sortHandle.find('.rf-dt-srt-btn');
     64                 var columnId = button.data('columnid');
     65                 var sortOrder = button.hasClass('rf-dt-srt-asc') ? 'descending' : 'ascending';
     66                 this.sort(columnId, sortOrder, false);
     67             },
     68
     69             filter: function(columnId, filterValue, isClear) {
     70                 invoke.call(this, null, createParameters.call(this, rf.ui.DataTable.FILTERING, columnId, filterValue, isClear));
     71             },
     72
     73             clearFiltering: function() {
     74                 this.filter("", "", true);
     75             },
     76
     77             filterHandler: function(event) {
     78                 var filterHandle = $(event.data.filterHandle);
     79                 var columnId = filterHandle.data('columnid');
     80                 var filterValue = filterHandle.val();
     81                 this.filter(columnId, filterValue, false);
     82             },
     83
     84             expandAllSubTables: function() {
     85                 this.invokeOnSubTables('expand');
     86             },
     87
     88             collapseAllSubTables: function() {
     89                 this.invokeOnSubTables('collapse');
     90             },
     91
     92             switchSubTable: function(id) {
     93                 this.getSubTable(id).switchState();
     94             },
     95
     96             getSubTable: function(id) {
     97                 return rf.component(id);
     98             },
     99
    100             invokeOnSubTables: function(funcName) {
    101                 var elements = $(document.getElementById(this.id)).children(rf.ui.DataTable.SUBTABLE_SELECTOR);
    102                 var invokeOnComponent = this.invokeOnComponent;
    103                 elements.each(
    104                     function() {
    105                         if (this.firstChild && this.firstChild[rf.RICH_CONTAINER] && this.firstChild[rf.RICH_CONTAINER].component) {
    106                             var component = this.firstChild[rf.RICH_CONTAINER].component;
    107                             if (component instanceof RichFaces.ui.CollapsibleSubTable) {
    108                                 invokeOnComponent(component, funcName);
    109                             }
    110                         }
    111                     }
    112                 );
    113             },
    114
    115             invokeOnSubTable: function(id, funcName) {
    116                 var subtable = this.getSubTable(id);
    117                 this.invokeOnComponent(subtable, funcName);
    118             },
    119
    120             invokeOnComponent: function(component, funcName) {
    121                 if (component) {
    122                     var func = component[funcName];
    123                     if (typeof func == 'function') {
    124                         func.call(component);
    125                     }
    126                 }
    127             },
    128             destroy: function() {
    129                 $super.destroy.call(this);
    130             }
    131         }
    132
    133     })());
    134
    135 })(RichFaces.jQuery, window.RichFaces);
    136
    137