X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=plugins%2Fquerytable%2Fstatic%2Fjs%2Fquerytable.js;h=375aa8f3ff160b934eda0881a09fb6564e9d40db;hb=97bbf7ec1d09ef9837b9b2471fdfa8bf8bd4d959;hp=6a553bc9ad25d98b5238e764576d2f49e060560d;hpb=efc6ef6e1df9bb9543a0d15d6a36898da1481312;p=myslice.git diff --git a/plugins/querytable/static/js/querytable.js b/plugins/querytable/static/js/querytable.js index 6a553bc9..375aa8f3 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 */ @@ -85,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 @@ -139,6 +146,11 @@ //manifold.raise_event(self.options.query_all_uuid, FIELD_REMOVED, field); self.hide_column(field); }); + $(".dataTables_filter").append("
"); + $(".dataTables_filter input").css("width","100%"); + $(".columns_selector").append("columns"); + $(".columns_selector").css("float","right"); + $(".columns_selector").css("width","inherit"); }, // initialize_table /** @@ -151,20 +163,30 @@ return (tabIndex.length > 0) ? tabIndex[0] : -1; }, // getColIndex - checkbox_html : function (key, 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]]); @@ -204,7 +238,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 @@ -240,35 +274,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; - } - - - 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 ****************************/ @@ -282,7 +306,7 @@ { // Remove corresponding filters this.filters = $.grep(this.filters, function(x) { - return x != filter; + return x == filter; }); this.redraw_table(); }, @@ -351,11 +375,8 @@ { if (this.received_all_query) { // if the 'all' query has been dealt with already we may turn on the checkbox - if (debug) messages.debug("turning on checkbox for record "+record[this.key]); - 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); } }, @@ -382,11 +403,16 @@ switch(data.request) { case FIELD_REQUEST_ADD: case FIELD_REQUEST_ADD_RESET: - this.set_checkbox(data.value, true); + // update pending number + $("#badge-pending").data('number', $("#badge-pending").data('number') + 1 ); + $("#badge-pending").text($("#badge-pending").data('number')); + this.set_checkbox_from_data(data.value, true); break; case FIELD_REQUEST_REMOVE: case FIELD_REQUEST_REMOVE_RESET: - this.set_checkbox(data.value, false); + $("#badge-pending").data('number', $("#badge-pending").data('number') - 1 ); + $("#badge-pending").text($("#badge-pending").data('number')); + this.set_checkbox_from_data(data.value, false); break; default: break; @@ -400,11 +426,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; @@ -430,18 +456,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); - 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 = []; + this.buffered_records_to_check = []; this.received_all_query = true; // unspin once we have received both @@ -475,6 +501,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; @@ -535,10 +570,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 },