Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. /*
  2.  * voir http://chromero.blogspot.fr/search/label/jQueryTable
  3. */
  4. (function($) {
  5.  
  6.     $.widget("ui.table", {
  7.         options : {
  8.             name : "table",
  9.             default_controls : [ {
  10.                 id : 'first',
  11.                 icon : 'ui-icon-arrowthickstop-1-w'
  12.             },{
  13.                 id : 'previous',
  14.                 icon : 'ui-icon-arrowthick-1-w'
  15.             },{
  16.                 id : 'next',
  17.                 icon : 'ui-icon-arrowthick-1-e'
  18.             }, {
  19.                 id : 'last',
  20.                 icon : 'ui-icon-arrowthickstop-1-e'
  21.             } ],
  22.             controls : [],
  23.             page_size : 30,
  24.             page : 1,
  25.             page_count: 1,
  26.             oddclass: 'table_odd',
  27.             evenclass: 'table_even',
  28.             sort: null,
  29.             columns: null
  30.         },
  31.  
  32.         _init : function() {
  33.         },
  34.  
  35.         _create : function() {
  36.             $(this).data('old_content', this.element.html());
  37.             this.options.oddcolor = $('.ui-state-default').css('background-color');
  38.             this.options.controls = this.options.default_controls.concat(this.options.controls);
  39.             // creation de la barre de navigation
  40.             var chaine = "<table id='" + this._getId("table") + "'>";
  41.             chaine += "<tr id='"+this._getId('controlBar')+"'><td><ul id='" + this._getId("navBar") + "' style='list-style:none;margin: 0;'>";
  42.             for ( var i = 0; i < this.options.controls.length; i++) {
  43.                 chaine += this._getControl(this.options.controls[i]['id'], this.options.controls[i]['icon']);
  44.             }
  45.             chaine += "<li id='"+this._getId('info')+"'></li>";
  46.             chaine += "</ul></td></tr>";
  47.             chaine += "<tr id='"+this._getId('header')+"'></tr>";
  48.             chaine += "</table>";
  49.             this.element.html(chaine);
  50.             this.options.provider.getCount(this);
  51.             this.options.provider.getColumns(this);
  52.             this.getValues();
  53.             var self = this;
  54.             var classe = this._getId('controls');
  55.             $('.' + classe).click(
  56.  
  57.             function() {
  58.                 var methode = $(this).attr('id').replace(new RegExp('^' + self.options.name + '_'), '');
  59.                 self[methode]();
  60.             });
  61.         },
  62.         destroy: function(){
  63.             this.element.html($(this).data('old_content'));
  64.             // call the original destroy method since we overwrote it
  65.             $.Widget.prototype.destroy.call( this );
  66.         },
  67.  
  68.         first : function() {
  69.             this._setOption('page', 1);
  70.         },
  71.         next : function() {
  72.             this._setOption('page', Math.min( this.options.page + 1, this.options.page_count));
  73.         },
  74.         previous : function() {
  75.             this._setOption('page', Math.max( this.options.page - 1,1));
  76.         },
  77.         last : function() {
  78.             this._setOption('page', this.options.page_count);
  79.         },
  80.         _setOption : function(key, value) {
  81.             this.options[key] = value;
  82.             switch (key) {
  83.             case 'page':
  84.                 this.getValues();
  85.                 this._updateInfo();
  86.                 break;
  87.             case 'columns':
  88.                 this._createHeader();
  89.                 break;
  90.             case 'count':
  91.                 this.options.page_count = Math.ceil( value / this.options.page_size);
  92.                 this._updateInfo();
  93.                 break;
  94.             case 'values':
  95.                 this._setValues(value);
  96.                 break;
  97.             case 'sort':
  98.                 this._setSort(value);
  99.                 break;
  100.             }
  101.         },
  102.  
  103.         _getControl : function(id, icon) {
  104.             var classe = this._getId('controls');
  105.             var chaine = "<li class='" + classe + " ui-state-default ui-corner-all' id='" + this._getId(id)
  106.                     + "' style='float:left;margin-right:2px;text-decoration: none;'>"
  107.                     + "<span class='ui-widget ui-corner-all ui-icon ui-button " + icon + "' title='" + id
  108.                     + "'></span></li>";
  109.  
  110.             return chaine;
  111.         },
  112.  
  113.         _createHeader : function() {
  114.             // on supprime l'ancien si besoin
  115.             $('#'+this._getId('header')).empty();
  116.             var chaine = ""; //"<tr id='"+this._getId('header')+"'>";
  117.             var cols = this.options.columns;
  118.             var self = this;
  119.             var sort;
  120.             $('#'+this._getId('controlBar')+' td').attr('colspan',cols.length);
  121.             for ( var i = 0; i < cols.length; i++) {
  122.                 sort = "<div class='ui-icon ui-icon-triangle-2-n-s' style='float:right; vertical-align:middle;'></div>";
  123.                 chaine += "<th name='"+cols[i]+"'><div style='float:left;'>" + cols[i] +"</div>"+ sort+'</th>';
  124.             }
  125.             //chaine += '</tr>';
  126.             //$('#' + this._getId("table")).append(chaine);
  127.             var ctrl_id = '#'+this._getId('header')
  128.  
  129.             $(ctrl_id).append(chaine);
  130.             $(ctrl_id+' th').click(function() {
  131.                 var sens = 'asc';
  132.                 var classe='ui-icon-triangle-1-n';
  133.                 if ($(this).children('.ui-icon').hasClass('ui-icon-triangle-1-n')) {
  134.  
  135.                     sens='desc';
  136.                     classe='ui-icon-triangle-1-s';
  137.                     }
  138.                 $(ctrl_id+' th').children('.ui-icon').removeClass('ui-icon-triangle-1-s ui-icon-triangle-1-n').addClass('ui-icon-triangle-2-n-s');
  139.                 $(this).children('.ui-icon').removeClass('ui-icon-triangle-2-n-s').addClass(classe);
  140.                 self._setOption('sort',($(this).attr('name')+' '+sens));
  141.             });
  142.         },
  143.  
  144.         getValues : function() {
  145.             var min = (this.options.page - 1) * this.options.page_size;
  146.             this.options.provider.getData(this, min, this.options.page_size, this.options.sort);
  147.         },
  148.         _setValues: function(values) {
  149.             var chaine = '';
  150.             $('.' + this._getId("values")).remove();
  151.             for ( var i = 0; i < values.length; i++) {
  152.                 chaine += "<tr class='" + this._getId("values")+"'>";
  153.                 for ( var j = 0; j < values[i].length; j++) {
  154.                     chaine += '<td>' + values[i][j] + '</td>';
  155.                 }
  156.                 chaine += '</tr>';
  157.             }
  158.             $('#' + this._getId("table")).append(chaine);
  159.             $('.'+this._getId("values")+':odd').addClass(this.options.oddclass);
  160.             $('.'+this._getId("values")+':even').addClass(this.options.evenclass);
  161.         },
  162.         _setSort: function(value) {
  163.             this.getValues();
  164.             $('#'+this._getId('header')+' th div:ui-icon').removeClass('ui-icon-triangle-2-n-s ui-icon-triangle-1-s ui-icon-triangle-1-n')
  165.  
  166.         },
  167.         _updateInfo: function() {
  168.             var texte = 'page '+this.options.page+' / '+this.options.page_count + ' - '+
  169.             this.options.count+ ' enregistrements';
  170.             $('#'+this._getId('info')).html(texte);
  171.  
  172.         },
  173.         _getId : function(id) {
  174.             return this.options.name + '_' + id;
  175.         }
  176.  
  177.     });
  178.  
  179.     $.extend($.ui.table, {});
  180.  
  181. })(jQuery);
  182.  
  183. function DataProvider(baseurl) {
  184.     this.baseurl = baseurl;
  185. }
  186.  
  187. DataProvider.prototype.getColumns = function(table) {
  188.     $.getJSON(this.baseurl+'?action=columns&token='+token, function(res) {
  189.        table._setOption('columns',res);
  190.         });
  191. }
  192.  
  193. DataProvider.prototype.getData = function(table, start, size, sort) {
  194.     var sortString=(sort==null)?'':'&sort='+sort;
  195.     $.ajax({
  196.     url: this.baseurl+'?action=list&limit='+start+','+size+sortString+'&token='+token,
  197.     success: function(texte){
  198.             var regexp = /(\[\[.*\]\]).*/;
  199.             var match = regexp.exec(texte);
  200.             var json = $.parseJSON(match[1]);
  201.             table._setOption('values',json);
  202.         }
  203.     });
  204.  
  205. }
  206. DataProvider.prototype.getCount = function(table) {
  207.     $.getJSON(this.baseurl+'?action=count&token='+token, function(res) {
  208.         table._setOption('count',res);
  209.         });
  210. }