X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=plugins%2Flists%2Fstatic%2Fjs%2Fsimplelist.js;h=f3476c07ac81c995b80af29233fdd46ebc01ab82;hb=31cc945eda5880557485ca4c78f2c23ad991faf4;hp=6a61ca53316e7850c87d7ea902527098e5c3e17d;hpb=63aab6eb9732e6a296d2ed84c3e9b5ab8b4885bb;p=unfold.git
diff --git a/plugins/lists/static/js/simplelist.js b/plugins/lists/static/js/simplelist.js
index 6a61ca53..f3476c07 100644
--- a/plugins/lists/static/js/simplelist.js
+++ b/plugins/lists/static/js/simplelist.js
@@ -7,145 +7,142 @@
(function($){
var debug=false;
- // debug=true
+ 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.classname=options.classname;
+ this._super (options, element);
+ this.buffered_records=[];
+ this.listen_query(options.query_uuid);
+ },
+
+ on_query_in_progress: function() {
+ messages.debug("on_query_in_progress");
+ this.spin(true);
+ },
+
+ on_query_done: function() {
+ this._display_table();
+ this.unspin();
+ console.log("query simple list done");
+ console.log(this);
+ console.log(this.buffered_records);
+ },
+
+ on_new_record: function(record) {
+ this.buffered_records.push(record);
+ },
/* 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;
+
+ _display_table: function() {
+ var self=this;
+ var $plugindiv = this.elmt();
+ var options = this.options;
// locate the
element; with datatables in the way,
// this might not be a direct son of the div-plugin
- var $table = $plugindiv.find("table.simplelist").first();
+ var $table = $plugindiv.find("table."+this.classname).first();
// also we may or may not have a header
- var $tbody = $table.find("tbody.simplelist").first();
+ var $tbody = $table.find("tbody."+this.classname).first();
var use_datatables = $table.hasClass("with-datatables");
- if (debug)
- messages.debug($plugindiv.attr('id') + " udt= " + use_datatables);
-
- // 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);
-
- 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;
+ var rows=self.buffered_records;
+ self.buffered_records=[];
+ if (debug){
+ messages.debug($plugindiv.attr('id') + " udt= " + use_datatables + " rows="+rows.length);
+ }
+ // check if rows contains results related to the object key
+ object_key = this.options.key.split('.');
+ if (rows.length == 0 || rows[0][object_key[0]].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)
- datatables_set_message ($table, $tbody, unfold.error(error));
- else
- regular_set_message ($table, $tbody, unfold.error(error));
- return;
- }
-
- var options = $plugindiv.data().SimpleList;
- if (use_datatables)
- datatables_update_table($table, $tbody, rows, options.key);
- else
- regular_update_table($table, $tbody, rows, options.key);
-
+ 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, this.classname);
}
- }
+ },
- function regular_set_message ($table, $tbody, message) {
- $tbody.html(""+message+" |
");
- }
+ _regular_set_message: function ($table, $tbody, message) {
+ $tbody.html(""+message+" |
");
+ },
- function regular_update_table ($table, $tbody, rows, key) {
- if (debug)
- messages.debug('regular_update_table ' + rows.length + " rows");
+ _regular_update_table: function ($table, $tbody, rows, key, classname) {
+ if (debug)
+ messages.debug('regular_update_table ' + rows.length + " rows" +
+ " key=" + key + " classname=" + this.classname);
+ var self=this;
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];
- }
- });
- if ($.isArray(value)) {
- x = $.map(value, function(val, i) { return html_row ( cell (key, val)); });
- return x;
- } else {
- return html_row ( cell (key, value));
- }
- }).join();
- $tbody.html(html);
- }
+ 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)) {
+ return $.map(value, function(val, i) {
+ return self._html_row ( self._cell (key, val), this.classname);
+ });
+ } else {
+ return self._html_row ( self._cell (key, value), this.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) {
- return ""+cell+" |
";
- }
+ _html_row: function (cell, classname) {
+ return ""+cell+" |
";
+ },
+ // 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 );