From: Thierry Parmentelat Date: Thu, 14 Nov 2013 20:51:29 +0000 (+0100) Subject: simplelist.js new-style implementation using Plugin.extend X-Git-Tag: myslice-0.3-0~113^2~7^2~7^2~7^2~2 X-Git-Url: http://git.onelab.eu/?p=myslice.git;a=commitdiff_plain;h=c473b4a23737909c11cd05ad2b549db84c7d89d9 simplelist.js new-style implementation using Plugin.extend --- diff --git a/plugins/lists/static/js/simplelist.js b/plugins/lists/static/js/simplelist.js index ad6985c2..a8f90b94 100644 --- a/plugins/lists/static/js/simplelist.js +++ b/plugins/lists/static/js/simplelist.js @@ -9,146 +9,130 @@ var debug=false; debug=true - $.fn.SimpleList = function( method ) { - /* Method calling logic */ - if ( methods[method] ) { - return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 )); - } else if ( typeof method === 'object' || ! method ) { - return methods.init.apply( this, arguments ); - } else { - $.error( 'Method ' + method + ' does not exist on jQuery.SimpleList' ); - } - }; + var SimpleList = Plugin.extend ({ - var methods = { - init : function( options ) { - return this.each(function(){ - var $this = $(this), data = $this.data('SimpleList'); - /* Subscribe to query updates */ - var channel='/results/' + options.query_uuid + '/changed'; - /* passing $this as 2nd arg: callbacks will retrieve $this as e.data */ - $.subscribe(channel, $this, update_plugin); - if (debug) window.messages.debug('subscribing to ' + channel); - $this.data('SimpleList', options); - }); - }, - destroy : function( ) { - if (debug) messages.debug("SimpleList.destroy..."); - return this.each(function(){ - var $this = $(this), data = $this.data('SimpleList'); - // xxx not too sure what this is about - $(window).unbind('SimpleList'); - $this.removeData('SimpleList'); - }); - }, - update : function( content ) { - if (debug) messages.debug("SimpleList.update..."); - }, - }; // methods + init: function (options, element) { + this._super (options, element); + this.buffered_records=[]; + this.listen_query(options.query_uuid); + }, - /* Private methods */ - // complexity here is mostly because a datatables-enabled table cannot - // be updated in a "normal" way using .html() - function update_plugin(e, rows) { - // e.data is what we passed in second argument to subscribe - // so here it is the jquery object attached to the plugin
- var $plugindiv = e.data; - var options = $plugindiv.data().SimpleList; - var classname=options.classname; - // locate the element; with datatables in the way, - // this might not be a direct son of the div-plugin - var $table = $plugindiv.find("table."+classname).first(); - // also we may or may not have a header - var $tbody = $table.find("tbody."+classname).first(); - var use_datatables = $table.hasClass("with-datatables"); - if (debug) - messages.debug($plugindiv.attr('id') + " udt= " + use_datatables + " rows="+rows.length); - - // clear the spinning wheel: look up an ancestor that has the need-spin class - // do this before we might return - $plugindiv.closest('.need-spin').spin(false); + on_query_in_progress: function() { + messages.debug("on_query_in_progress"); + this.spin(); + }, - if (rows.length == 0) { - if (use_datatables) - datatables_set_message ($table, $tbody, unfold.warning("No result")); - else - regular_set_message ($table, $tbody, unfold.warning("No result")); - return; - } + on_query_done: function() { + this._display_table(); + this.unspin(); + }, + + on_new_record: function(record) { + this.buffered_records.push(record); + }, - if (typeof rows[0].error != 'undefined') { - var error="ERROR: " + rows[0].error; - if (use_datatables) - datatables_set_message ($table, $tbody, unfold.error(error)); - else - regular_set_message ($table, $tbody, unfold.error(error)); - return; - } + /* Private methods */ - if (use_datatables) - datatables_update_table($table, $tbody, rows, options.key); - else - regular_update_table($table, $tbody, rows, options.key, classname); + _display_table: function() { + var self=this; + var $plugindiv = this.elmt(); + var options = this.options; + var classname=options.classname; + // locate the
element; with datatables in the way, + // this might not be a direct son of the div-plugin + var $table = $plugindiv.find("table."+classname).first(); + // also we may or may not have a header + var $tbody = $table.find("tbody."+classname).first(); + var use_datatables = $table.hasClass("with-datatables"); + var rows=self.buffered_records; + self.buffered_records=[]; + if (debug) + messages.debug($plugindiv.attr('id') + " udt= " + use_datatables + " rows="+rows.length); + + if (rows.length == 0) { + if (use_datatables) + this._datatables_set_message ($table, $tbody, unfold.warning("No result")); + else + this._regular_set_message ($table, $tbody, unfold.warning("No result")); + return; + } - } + if (typeof rows[0].error != 'undefined') { + var error="ERROR: " + rows[0].error; + if (use_datatables) + this._datatables_set_message ($table, $tbody, unfold.error(error)); + else + this._regular_set_message ($table, $tbody, unfold.error(error)); + return; + } - // hard-wire a separate presentation depending on the key being used.... - function cell(key, value) { - if (key == 'slice.slice_hrn') { - return "" + value + ""; - } else if (key == 'platform') { - return "" + value + ""; - } else { - return value; - } - } + if (use_datatables) + this._datatables_update_table($table, $tbody, rows, options.key); + else + this._regular_update_table($table, $tbody, rows, options.key, classname); + }, - function regular_set_message ($table, $tbody, message) { - $tbody.html(""); - } + _regular_set_message: function ($table, $tbody, message) { + $tbody.html(""); + }, - function regular_update_table ($table, $tbody, rows, key, classname) { - if (debug) - messages.debug('regular_update_table ' + rows.length + " rows" + " key=" + key + " classname=" + classname); - var html=$.map(rows, function (row) { - value = row; - $.each(key.split('.'), function(i, k) { - if ($.isArray(value)) { - value = $.map(value, function(val, i) { return val[k]}); - } else { - value = value[k]; - } - }); + _regular_update_table: function ($table, $tbody, rows, key, classname) { + if (debug) + messages.debug('regular_update_table ' + rows.length + " rows" + " key=" + key + " classname=" + classname); + var self=this; + var html=$.map(rows, function (row) { + var value = row; + $.each(key.split('.'), function(i, k) { + if ($.isArray(value)) { + value = $.map(value, function(val, i) { return val[k]}); + } else { + value = value[k]; + } + }); if ($.isArray(value)) { - x = $.map(value, function(val, i) { - messages.debug("loop.loop val="+val+" i="+i); - return html_row ( cell (key, val), classname); }); - return x; - } else { - return html_row ( cell (key, value), classname); - } - }).join(); - $tbody.html(html); - } + return $.map(value, function(val, i) { + return self._html_row ( self._cell (key, val), classname); + }); + } else { + return self._html_row ( self._cell (key, value), classname); + } + }).join(); + $tbody.html(html); + }, - function datatables_set_message ($table, $tbody, message) { - $table.dataTable().fnClearTable(); - $table.dataTable().fnAddData( [ message ] ); - $table.dataTable().fnDraw(); - } + _datatables_set_message: function ($table, $tbody, message) { + $table.dataTable().fnClearTable(); + $table.dataTable().fnAddData( [ message ] ); + $table.dataTable().fnDraw(); + }, - function datatables_update_table ($table, $tbody, rows, key) { - if (debug) messages.debug('datatables_update_table ' + rows.length + " rows"); - $table.dataTable().fnClearTable(); - // the lambda here returns a [[]] because $.map is kind of broken; as per the doc: - // The function can return any value to add to the array. A returned array will be flattened into the resulting array. - // this is wrong indeed so let's work around that - $table.dataTable().fnAddData( $.map(rows, function (row) { return [[ cell (key,row[key]) ]] }) ); - $table.dataTable().fnDraw(); - } + _datatables_update_table: function ($table, $tbody, rows, key) { + if (debug) messages.debug('datatables_update_table ' + rows.length + " rows"); + $table.dataTable().fnClearTable(); + // the lambda here returns a [[]] because $.map is kind of broken; as per the doc: + // The function can return any value to add to the array. A returned array will be flattened into the resulting array. + // this is wrong indeed so let's work around that + var self=this; + $table.dataTable().fnAddData( $.map(rows, function (row) { return [[ self._cell (key,row[key]) ]] }) ); + $table.dataTable().fnDraw(); + }, - function html_row (cell, classname) { - return ""; - } + _html_row: function (cell, classname) { + return ""; + }, + // hard-wire a separate presentation depending on the key being used.... + _cell: function (key, value) { + if (key == 'slice.slice_hrn') { + return "" + value + ""; + } else if (key == 'platform') { + return "" + value + ""; + } else { + return value; + } + }, + }); + + $.plugin('SimpleList', SimpleList); + })( jQuery );
"+message+"
"+message+"
"+cell+"
"+cell+"