X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=plugins%2Fquerytable%2Fstatic%2Fjs%2Fquerytable.js;h=c54114115f6b4bf01cd2d2ff1945ef8e8464c984;hb=6e24f5c8289f13a60d28a86543e8a84db63f4426;hp=410a0825bcc668e870bd93ac36d182247ebf2822;hpb=75ae4655dd890a559798442147044db4d6fcc311;p=unfold.git diff --git a/plugins/querytable/static/js/querytable.js b/plugins/querytable/static/js/querytable.js index 410a0825..c5411411 100644 --- a/plugins/querytable/static/js/querytable.js +++ b/plugins/querytable/static/js/querytable.js @@ -7,12 +7,12 @@ (function($){ var debug=false; - debug=true +// debug=true var QueryTable = Plugin.extend({ - init: function(options, element) - { + init: function(options, element) { + this.classname="querytable"; this._super(options, element); /* Member variables */ @@ -31,12 +31,11 @@ // an internal buffer for keeping lines and display them in one call to fnAddData this.buffered_lines = []; - /* XXX Events XXX */ - // this.$element.on('show.Datatables', this.on_show); + /* Events */ + // xx somehow non of these triggers at all for now this.elmt().on('show', this, this.on_show); - // Unbind all events using namespacing - // TODO in destructor - // $(window).unbind('QueryTable'); + this.elmt().on('shown.bs.tab', this, this.on_show); + this.elmt().on('resize', this, this.on_resize); var query = manifold.query_store.find_analyzed_query(this.options.query_uuid); this.object = query.object; @@ -69,25 +68,17 @@ /* PLUGIN EVENTS */ - on_show: function(e) - { + on_show: function(e) { + if (debug) messages.debug("querytable.on_show"); var self = e.data; + self.table.fnAdjustColumnSizing(); + }, - self.table.fnAdjustColumnSizing() - - /* Refresh dataTabeles if click on the menu to display it : fix dataTables 1.9.x Bug */ - /* temp disabled... useful ? -- jordan - $(this).each(function(i,elt) { - if (jQuery(elt).hasClass('dataTables')) { - var myDiv=jQuery('#querytable-' + this.id).parent(); - if(myDiv.height()==0) { - var oTable=$('#querytable-' + this.id).dataTable(); - oTable.fnDraw(); - } - } - }); - */ - }, // on_show + on_resize: function(e) { + if (debug) messages.debug("querytable.on_resize"); + var self = e.data; + self.table.fnAdjustColumnSizing(); + }, /* GUI EVENTS */ @@ -100,7 +91,8 @@ var actual_options = { // Customize the position of Datatables elements (length,filter,button,...) // we use a fluid row on top and another on the bottom, making sure we take 12 grid elt's each time - sDom: "<'row'<'col-xs-5'l><'col-xs-1'r><'col-xs-6'f>>t<'row'<'col-xs-5'i><'col-xs-7'p>>", + //sDom: "<'row'<'col-xs-5'l><'col-xs-1'r><'col-xs-6'f>>t<'row'<'col-xs-5'i><'col-xs-7'p>>", + sDom: "<'row'<'col-xs-5'f><'col-xs-1'r><'col-xs-6 columns_selector'>>t<'row'<'col-xs-5'l><'col-xs-7'p>>", // XXX as of sept. 2013, I cannot locate a bootstrap3-friendly mode for now // hopefully this would come with dataTables v1.10 ? // in any case, search for 'sPaginationType' all over the code for more comments @@ -111,7 +103,24 @@ // WARNING: this one causes tables in a 'tabs' that are not exposed at the time this is run to show up empty // sScrollX: '100%', /* Horizontal scrolling */ bProcessing: true, /* Loading */ - fnDrawCallback: function() { self._querytable_draw_callback.call(self); } + fnDrawCallback: function() { self._querytable_draw_callback.call(self); }, + fnRowCallback: function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) { + // This function is called on fnAddData to set the TR id. What about fnUpdate ? + + // Get the key from the raw data array aData + var key = self.canonical_key; + + // Get the index of the key in the columns + var cols = self.table.fnSettings().aoColumns; + var index = self.getColIndex(key, cols); + if (index != -1) { + // The key is found in the table, set the TR id after the data + $(nRow).attr('id', self.id_from_key(key, aData[index])); + } + + // That's the usual return value + return nRow; + } // XXX use $.proxy here ! }; // the intention here is that options.datatables_options as coming from the python object take precedence @@ -154,6 +163,8 @@ //manifold.raise_event(self.options.query_all_uuid, FIELD_REMOVED, field); self.hide_column(field); }); + $(".dataTables_filter").append("
"); + $(".dataTables_filter input").css("width","100%"); }, // initialize_table /** @@ -167,8 +178,10 @@ }, // getColIndex // create a checkbox tag - // computes 'id' attribute from canonical_key (using flat_id) + // computes 'id' attribute from canonical_key // computes 'init_id' from init_key for initialization phase + // no need to used convoluted ids with plugin-uuid or others, since + // we search using table.$ which looks only in this table checkbox_html : function (record) { var result=""; // Prefix id with plugin_uuid @@ -176,17 +189,13 @@ result += " class='querytable-checkbox'"; // compute id from canonical_key var id = record[this.canonical_key] - // normalize using flat_id - see plugin.js - id = this.flat_id(id) -// if (debug) messages.debug("checkbox_html, id="+id); - result += " id='" + id + "'"; - // compute init_id too + // compute init_id form init_key var init_id=record[this.init_key]; - init_id=this.flat_id(init_id); - // wrap up + // set id - for retrieving from an id, or for posting events upon user's clicks + result += " id='"+record[this.canonical_key]+"'"; + // set init_id result += "init_id='" + init_id + "'"; - // set value for posting events upon user's clicks - result += " value='"+record[this.canonical_key]+"'"; + // wrap up result += " type='checkbox'"; result += " autocomplete='off'"; result += ">"; @@ -205,10 +214,15 @@ var colnames = cols.map(function(x) {return x.sTitle}) var nb_col = cols.length; /* if we've requested checkboxes, then forget about the checkbox column for now */ - if (this.options.checkboxes) nb_col -= 1; - + //if (this.options.checkboxes) nb_col -= 1; + // catch up with the last column if checkboxes were requested + if (this.options.checkboxes) { + // Use a key instead of hostname (hard coded...) + line.push(this.checkbox_html(record)); + } + /* fill in stuff depending on the column name */ - for (var j = 0; j < nb_col; j++) { + for (var j = 1; j < nb_col; j++) { if (typeof colnames[j] == 'undefined') { line.push('...'); } else if (colnames[j] == 'hostname') { @@ -218,8 +232,21 @@ else line.push(record['hostname']); - } else if (colnames[j] == 'hrn' && typeof(record) != 'undefined') { - line.push(' '+record['hrn']); + } else if (colnames[j] == this.init_key && typeof(record) != 'undefined') { + obj = this.object + o = obj.split(':'); + if(o.length>1){ + obj = o[1]; + }else{ + obj = o[0]; + } + /* XXX TODO: Remove this and have something consistant */ + if(obj=='resource'){ + //line.push(' '+record[this.init_key]); + }else{ + //line.push(' '+record[this.init_key]); + } + line.push(record[this.init_key]); } else { if (record[colnames[j]]) line.push(record[colnames[j]]); @@ -228,11 +255,7 @@ } } - // catch up with the last column if checkboxes were requested - if (this.options.checkboxes) { - // Use a key instead of hostname (hard coded...) - line.push(this.checkbox_html(record)); - } + // adding an array in one call is *much* more efficient // this.table.fnAddData(line); @@ -271,8 +294,9 @@ // (because the argument record, if it comes from query, might not have canonical_key set set_checkbox_from_record: function (record, checked) { if (checked === undefined) checked = true; - var init_id = this.flat_id(record[this.init_key]); - if (debug) messages.debug("set_checkbox_from_record, init_id="+init_id); + var init_id = record[this.init_key]; + if (debug) messages.debug("querytable.set_checkbox_from_record, init_id="+init_id); + // using table.$ to search inside elements that are not visible var element = this.table.$('[init_id="'+init_id+'"]'); element.attr('checked',checked); }, @@ -280,9 +304,9 @@ // id relates to canonical_key set_checkbox_from_data: function (id, checked) { if (checked === undefined) checked = true; - var id=this.flat_id(id); - if (debug) messages.debug("set_checkbox_from_data, id="+id); - var element = this.table.$('#'+id); + if (debug) messages.debug("querytable.set_checkbox_from_data, id="+id); + // using table.$ to search inside elements that are not visible + var element = this.table.$("[id='"+id+"']"); element.attr('checked',checked); }, @@ -298,7 +322,7 @@ { // Remove corresponding filters this.filters = $.grep(this.filters, function(x) { - return x != filter; + return x == filter; }); this.redraw_table(); }, @@ -369,8 +393,6 @@ // if the 'all' query has been dealt with already we may turn on the checkbox this.set_checkbox_from_record(record, true); } else { - // otherwise we need to remember that and do it later on - if (debug) messages.debug("Remembering record to check " + record[this.init_key]); this.buffered_records_to_check.push(record); } }, @@ -415,7 +437,7 @@ switch(data.request) { case FIELD_REQUEST_ADD: case FIELD_REQUEST_ADD_RESET: - this.set_checkboxfrom_data(data.value, true); + this.set_checkbox_from_data(data.value, true); break; case FIELD_REQUEST_REMOVE: case FIELD_REQUEST_REMOVE_RESET: @@ -445,18 +467,18 @@ on_all_query_done: function() { - if (debug) messages.debug("1-shot initializing dataTables content with " + this.buffered_lines.length + " lines"); - this.table.fnAddData (this.buffered_lines); - this.buffered_lines=[]; - + if (debug) messages.debug("1-shot initializing dataTables content with " + this.buffered_lines.length + " lines"); + this.table.fnAddData (this.buffered_lines); + this.buffered_lines=[]; + var self = this; // if we've already received the slice query, we have not been able to set // checkboxes on the fly at that time (dom not yet created) $.each(this.buffered_records_to_check, function(i, record) { - if (debug) messages.debug ("delayed turning on checkbox " + i + " record= " + record); + if (debug) messages.debug ("querytable delayed turning on checkbox " + i + " record= " + record); self.set_checkbox_from_record(record, true); }); - this.buffered_records_to_check = []; + this.buffered_records_to_check = []; this.received_all_query = true; // unspin once we have received both @@ -490,6 +512,15 @@ if (op == '=' || op == '==') { if ( col_value != value || col_value==null || col_value=="" || col_value=="n/a") ret = false; + }else if (op == 'included') { + $.each(value, function(i,x) { + if(x == col_value){ + ret = true; + return false; + }else{ + ret = false; + } + }); }else if (op == '!=') { if ( col_value == value || col_value==null || col_value=="" || col_value=="n/a") ret = false; @@ -550,10 +581,11 @@ e.stopPropagation(); var self = e.data; + var id=this.id; - // XXX this.value = key of object to be added... what about multiple keys ? - if (debug) messages.debug("querytable click handler checked=" + this.checked + " "+this.canonical_key+"=" + this.value); - manifold.raise_event(self.options.query_uuid, this.checked?SET_ADD:SET_REMOVED, this.value); + // this.id = key of object to be added... what about multiple keys ? + if (debug) messages.debug("querytable._check_click key="+this.canonical_key+"->"+id+" checked="+this.checked); + manifold.raise_event(self.options.query_uuid, this.checked?SET_ADD:SET_REMOVED, id); //return false; // prevent checkbox to be checked, waiting response from manifold plugin api }, @@ -588,10 +620,10 @@ was in fact given as a third argument, and not second as the various online resources had it - go figure */ $.fn.dataTableExt.afnSortData['dom-checkbox'] = function ( oSettings, _, iColumn ) { - return $.map( oSettings.oApi._fnGetTrNodes(oSettings), function (tr, i) { - return result=$('td:eq('+iColumn+') input', tr).prop('checked') ? '1' : '0'; - } ); - } + return $.map( oSettings.oApi._fnGetTrNodes(oSettings), function (tr, i) { + return result=$('td:eq('+iColumn+') input', tr).prop('checked') ? '1' : '0'; + }); + }; })(jQuery);