X-Git-Url: http://git.onelab.eu/?p=myslice.git;a=blobdiff_plain;f=plugins%2Fquerytable%2Fstatic%2Fjs%2Fquerytable.js;h=15ee6f1c2fba59ee5fe9a91236b791a9c7f077af;hp=e0ac3fd0d6f7be1fdf6cff73035f3c7c50559013;hb=a52c3773de8611def256d97dd699ba09d390b8fd;hpb=6e53114f25d1511e1c72a243da5bc5077ebc5aa0 diff --git a/plugins/querytable/static/js/querytable.js b/plugins/querytable/static/js/querytable.js index e0ac3fd0..15ee6f1c 100644 --- a/plugins/querytable/static/js/querytable.js +++ b/plugins/querytable/static/js/querytable.js @@ -11,8 +11,8 @@ var QueryTable = Plugin.extend({ - init: function(options, element) - { + init: function(options, element) { + this.classname="querytable"; this._super(options, element); /* Member variables */ @@ -31,18 +31,32 @@ // 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.method = query.object; - - var keys = manifold.metadata.get_key(this.method); - this.key = (keys && keys.length == 1) ? keys[0] : null; + this.object = query.object; + + //// we need 2 different keys + // * canonical_key is the primary key as derived from metadata (typically: urn) + // and is used to communicate about a given record with the other plugins + // * init_key is a key that both kinds of records + // (i.e. records returned by both queries) must have (typically: hrn or hostname) + // in general query_all will return well populated records, but query + // returns records with only the fields displayed on startup + var keys = manifold.metadata.get_key(this.object); + this.canonical_key = (keys && keys.length == 1) ? keys[0] : undefined; + // + this.init_key = this.options.init_key; + // have init_key default to canonical_key + this.init_key = this.init_key || this.canonical_key; + // sanity check + if ( ! this.init_key ) messages.warning ("QueryTable : cannot find init_key"); + if ( ! this.canonical_key ) messages.warning ("QueryTable : cannot find canonical_key"); + if (debug) messages.debug("querytable: canonical_key="+this.canonical_key+" init_key="+this.init_key); /* Setup query and record handlers */ this.listen_query(options.query_uuid); @@ -54,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 */ @@ -151,22 +157,27 @@ return (tabIndex.length > 0) ? tabIndex[0] : -1; }, // getColIndex - checkbox_html : function (key, value) - { -// if (debug) messages.debug("checkbox_html, value="+value); + // create a checkbox tag + // 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 result += " '+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]); + } } else { if (record[colnames[j]]) line.push(record[colnames[j]]); @@ -209,7 +232,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(this.key, record[this.key])); + line.push(this.checkbox_html(record)); } // adding an array in one call is *much* more efficient @@ -245,41 +268,25 @@ this.table.fnSetColumnVis(index, false); }, - set_checkbox: function(record, checked) - { - /* Default: checked = true */ + // this is used at init-time, at which point only init_key can make sense + // (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 key_value; - /* The function accepts both records and their key */ - switch (manifold.get_type(record)) { - case TYPE_VALUE: - key_value = record; - break; - case TYPE_RECORD: - /* XXX Test the key before ? */ - key_value = record[this.key]; - break; - default: - throw "Not implemented"; - break; - } - - - if (key_value === undefined) { - messages.warning("querytable.set_checkbox has no value to figure which line to tick"); - return; - } - var checkbox_id = this.flat_id(this.id('checkbox', key_value)); - // function escape_id(myid) is defined in portal/static/js/common.functions.js - checkbox_id = escape_id(checkbox_id); - // using dataTables's $ to search also in nodes that are not currently displayed - var element = this.table.$(checkbox_id); - if (debug) - messages.debug("set_checkbox checked=" + checked - + " id=" + checkbox_id + " matches=" + element.length); - element.attr('checked', checked); - }, + 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); + }, + + // id relates to canonical_key + set_checkbox_from_data: function (id, checked) { + if (checked === undefined) checked = true; + 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); + }, /*************************** QUERY HANDLER ****************************/ @@ -362,10 +369,8 @@ { if (this.received_all_query) { // if the 'all' query has been dealt with already we may turn on the checkbox - this.set_checkbox(record, true); + 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.key]); this.buffered_records_to_check.push(record); } }, @@ -392,11 +397,11 @@ switch(data.request) { case FIELD_REQUEST_ADD: case FIELD_REQUEST_ADD_RESET: - this.set_checkbox(data.value, true); + this.set_checkbox_from_data(data.value, true); break; case FIELD_REQUEST_REMOVE: case FIELD_REQUEST_REMOVE_RESET: - this.set_checkbox(data.value, false); + this.set_checkbox_from_data(data.value, false); break; default: break; @@ -410,11 +415,11 @@ switch(data.request) { case FIELD_REQUEST_ADD: case FIELD_REQUEST_ADD_RESET: - this.set_checkbox(data.value, true); + this.set_checkboxfrom_data(data.value, true); break; case FIELD_REQUEST_REMOVE: case FIELD_REQUEST_REMOVE_RESET: - this.set_checkbox(data.value, false); + this.set_checkbox_from_data(data.value, false); break; default: break; @@ -448,8 +453,8 @@ // 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); - self.set_checkbox(record, true); + if (debug) messages.debug ("querytable delayed turning on checkbox " + i + " record= " + record); + self.set_checkbox_from_record(record, true); }); this.buffered_records_to_check = []; @@ -545,10 +550,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 + " hrn=" + 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 },