X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=plugins%2Fquerytable%2Fstatic%2Fjs%2Fquerytable.js;h=76934e79b49ab90b7c5881e9b843d9f852071f0c;hb=d035a1f93e4acbeee79b7c8200264687d940ccc2;hp=47e0a97a527545725b63538a803e1fd09f71f4ca;hpb=1d7b0fb8b69c6eca9880a3966acf0352341882bb;p=myslice.git diff --git a/plugins/querytable/static/js/querytable.js b/plugins/querytable/static/js/querytable.js index 47e0a97a..76934e79 100644 --- a/plugins/querytable/static/js/querytable.js +++ b/plugins/querytable/static/js/querytable.js @@ -4,68 +4,54 @@ * License: GPLv3 */ -BGCOLOR_RESET = 0; -BGCOLOR_ADDED = 1; -BGCOLOR_REMOVED = 2; +QUERYTABLE_BGCOLOR_RESET = 0; +QUERYTABLE_BGCOLOR_ADDED = 1; +QUERYTABLE_BGCOLOR_REMOVED = 2; (function($){ - - var QUERYTABLE_MAP = { - 'Testbed': 'network_hrn', - 'Resource name': 'hostname', - 'Type': 'type', - }; - var debug=false; // debug=true var QueryTable = Plugin.extend({ init: function(options, element) { - this.classname="querytable"; + this.classname="querytable"; this._super(options, element); /* Member variables */ - // in general we expect 2 queries here - // query_uuid refers to a single object (typically a slice) - // query_all_uuid refers to a list (typically resources or users) - // these can return in any order so we keep track of which has been received yet - this.received_query = false; - - // We need to remember the active filter for datatables filtering - this.filters = Array(); + var query = manifold.query_store.find_analyzed_query(this.options.query_uuid); + this.object = query.object; // XXX /* Events */ - // xx somehow non of these triggers at all for now this.elmt().on('show', this, this.on_show); 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; - - //// 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); + //// 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); - //this.listen_query(options.query_all_uuid, 'all'); /* GUI setup and event binding */ this.initialize_table(); @@ -74,16 +60,16 @@ BGCOLOR_REMOVED = 2; /* PLUGIN EVENTS */ on_show: function(e) { - if (debug) messages.debug("querytable.on_show"); + if (debug) messages.debug("querytable.on_show"); var self = e.data; self.table.fnAdjustColumnSizing(); - }, + }, on_resize: function(e) { - if (debug) messages.debug("querytable.on_resize"); + if (debug) messages.debug("querytable.on_resize"); var self = e.data; self.table.fnAdjustColumnSizing(); - }, + }, /* GUI EVENTS */ @@ -98,13 +84,13 @@ BGCOLOR_REMOVED = 2; // 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'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 + // 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 sPaginationType: 'bootstrap', // Handle the null values & the error : Datatables warning Requested unknown parameter // http://datatables.net/forums/discussion/5331/datatables-warning-...-requested-unknown-parameter/p2 - aoColumnDefs: [{sDefaultContent: '',aTargets: [ '_all' ]}], + aoColumnDefs: [{sDefaultContent: '', aTargets: [ '_all' ]}], // 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 */ @@ -129,16 +115,16 @@ BGCOLOR_REMOVED = 2; // XXX use $.proxy here ! }; // the intention here is that options.datatables_options as coming from the python object take precedence - // xxx DISABLED by jordan: was causing errors in datatables.js - // xxx turned back on by Thierry - this is the code that takes python-provided options into account - // check your datatables_options tag instead - // however, we have to accumulate in aoColumnDefs from here (above) - // and from the python wrapper (checkboxes management, plus any user-provided aoColumnDefs) - if ( 'aoColumnDefs' in this.options.datatables_options) { - actual_options['aoColumnDefs']=this.options.datatables_options['aoColumnDefs'].concat(actual_options['aoColumnDefs']); - delete this.options.datatables_options['aoColumnDefs']; - } - $.extend(actual_options, this.options.datatables_options ); + // xxx DISABLED by jordan: was causing errors in datatables.js + // xxx turned back on by Thierry - this is the code that takes python-provided options into account + // check your datatables_options tag instead + // however, we have to accumulate in aoColumnDefs from here (above) + // and from the python wrapper (checkboxes management, plus any user-provided aoColumnDefs) + if ( 'aoColumnDefs' in this.options.datatables_options) { + actual_options['aoColumnDefs']=this.options.datatables_options['aoColumnDefs'].concat(actual_options['aoColumnDefs']); + delete this.options.datatables_options['aoColumnDefs']; + } + $.extend(actual_options, this.options.datatables_options ); this.table = this.elmt('table').dataTable(actual_options); /* Setup the SelectAll button in the dataTable header */ @@ -165,11 +151,83 @@ BGCOLOR_REMOVED = 2; /* Processing hidden_columns */ $.each(this.options.hidden_columns, function(i, field) { - //manifold.raise_event(self.options.query_all_uuid, FIELD_REMOVED, field); self.hide_column(field); }); $(".dataTables_filter").append("
"); $(".dataTables_filter input").css("width","100%"); + + // resource info + var sTable = this.table; + var oSettings = this.table.fnSettings(); + var cols = oSettings.aoColumns; + var self = this; + $('table.dataTable').delegate('a.resource-info','click',function() { + var aPos = sTable.fnGetPosition( this.parentNode ); + var aData = sTable.fnGetData( aPos[0] ); + console.log(aData); + + var index = {} + // XXX Loic @ Hardcoded !!! Maybe a loop over all fields would be better + index['network_hrn'] = self.getColIndex('network_hrn',cols); + var network_hrn = aData[index['network_hrn']]; + + index['hostname'] = self.getColIndex('hostname',cols); + index['urn'] = self.getColIndex('urn',cols); + index['type'] = self.getColIndex('type',cols); + //index['status'] = self.getColIndex('boot_state',cols); + index['available'] = self.getColIndex('available',cols); + index['testbed'] = self.getColIndex('testbed_name',cols); + index['facility'] = self.getColIndex('facility_name',cols); + var resourceData = { + 'hostname' : strip(aData[index['hostname']]), + 'urn' : aData[index['urn']], + 'type' : aData[index['type']], + //'status' : aData[index['status']], + 'available' : aData[index['available']], + 'testbed' : aData[index['testbed']], + 'facility' : aData[index['facility']], + }; + + /* + //Greece: 37.6687092,22.2282404 + if (network_hrn == 'omf.nitos') { + var logo = 'nitos'; + var resourceLocation = { + 'longitude' : '22.2282404', + 'latitude' : '37.6687092', + }; + var coordinates = resourceLocation['latitude']+','+resourceLocation['longitude']; + } else if (network_hrn == 'iotlab') { + */ + if (network_hrn == 'iotlab') { + var logo = network_hrn; + var s = resourceData['hostname'].split("."); + var n = s[0].split("-"); + resourceData['type'] = 'node ( Hardware: '+n[0]+' )'; + var coordinates = resourceData['testbed']; + } else { + var logo = resourceData['testbed']; + var resourceLocation = { + 'longitude' : aData[20], + 'latitude' : aData[17], + }; + var coordinates = resourceLocation['latitude']+','+resourceLocation['longitude']; + console.log(coordinates); + } + + var modal = $('#resource-info-modal'); + modal.find('.modal-title').text(resourceData['testbed'] + ': ' +resourceData['hostname']); + table = modal.find('.modal-resource-info'); + table.html('
'+resourceData['facility']+' - '+resourceData['testbed']+'
'); + for (var j in resourceData) { + table.append('' + j + '' + resourceData[j] + ''); + } + if (coordinates != '') { + table.append(''); + } + modal.modal(); + }); + }, // initialize_table /** @@ -183,25 +241,25 @@ BGCOLOR_REMOVED = 2; return (tabIndex.length > 0) ? tabIndex[0] : -1; }, // getColIndex - // 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 + // 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 += "'); // STATUS - + /* fill in stuff depending on the column name */ for (var j = 2; j < nb_col - 1; j++) { // nb_col includes status if (typeof colnames[j] == 'undefined') { @@ -239,7 +297,8 @@ BGCOLOR_REMOVED = 2; //TODO: we need to add source/destination for links line.push(''); else - line.push(record['hostname']); + //line.push(record['hostname']); + line.push('' + record['hostname'] + ''); } else if (colnames[j] == this.init_key && typeof(record) != 'undefined') { obj = this.object @@ -264,9 +323,9 @@ BGCOLOR_REMOVED = 2; } } - // adding an array in one call is *much* more efficient - // this.table.fnAddData(line); - return line; + // adding an array in one call is *much* more efficient + // this.table.fnAddData(line); + return line; }, clear_table: function() @@ -297,30 +356,24 @@ BGCOLOR_REMOVED = 2; this.table.fnSetColumnVis(index, false); }, - // 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 init_id = record[this.init_key]; - this.set_checkbox_from_record_key(init_id, checked); - }, - - set_checkbox_from_record_key: function (record_key, checked) { - if (checked === undefined) checked = true; - if (debug) messages.debug("querytable.set_checkbox_from_record, record_key="+record_key); - // using table.$ to search inside elements that are not visible - var element = this.table.$('[init_id="'+record_key+'"]'); - element.attr('checked',checked); - }, - - // id relates to canonical_key - set_checkbox_from_data: function (id, checked) { + set_checkbox_from_record_key: function (record_key, 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); - }, + + // using table.$ to search inside elements that are not visible + var element = this.table.$('[init_id="'+record_key+'"]'); + element.attr('checked',checked); + }, + + // id relates to canonical_key + set_checkbox_from_data: function (id, checked) + { + if (checked === undefined) checked = true; + + // using table.$ to search inside elements that are not visible + var element = this.table.$("[id='"+id+"']"); + element.attr('checked',checked); + }, /** * Arguments @@ -350,7 +403,7 @@ BGCOLOR_REMOVED = 2; } } else { msg = '