X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=plugins%2Fqueryupdater%2Fstatic%2Fjs%2Fqueryupdater.js;h=f1d6b322416d22dabb1a6a41bb886a8ae2d1803b;hb=7464fb5c0d4d4857963b52b944b27df41e4ec1f6;hp=8c68037fc895db05207af98fd3422bc41712235b;hpb=10f5e0a7e25604e93f85727ce35acea95e162679;p=unfold.git diff --git a/plugins/queryupdater/static/js/queryupdater.js b/plugins/queryupdater/static/js/queryupdater.js index 8c68037f..f1d6b322 100644 --- a/plugins/queryupdater/static/js/queryupdater.js +++ b/plugins/queryupdater/static/js/queryupdater.js @@ -26,7 +26,11 @@ // Record state through the query cycle - var QueryUpdater = Plugin.extend({ + var QueryUpdaterPlugin = Plugin.extend({ + + /************************************************************************** + * CONSTRUCTOR + **************************************************************************/ init: function(options, element) { this.classname="queryupdater"; @@ -38,32 +42,12 @@ this.selected_resources = Array(); this.table = this.elmt('table').dataTable({ -// the original querytable layout was -// sDom: "<'row'<'col-xs-5'l><'col-xs-1'r><'col-xs-6'f>>t<'row'<'col-xs-5'i><'col-xs-7'p>>", -// however the bottom line with 'showing blabla...' and the navigation widget are not really helpful sDom: "<'row'<'col-xs-5'l><'col-xs-1'r><'col-xs-6'f>>t>", -// so this does not matter anymore now that the pagination area is turned off -// sPaginationType: 'bootstrap', - bAutoWidth: true, -// bJQueryUI : true, -// bRetrieve : true, -// sScrollX : '100%', // Horizontal scrolling -// bSortClasses : false, // Disable style for the sorted column -// aaSorting : [[ 0, 'asc' ]], // Default sorting on URN -// fnDrawCallback: function() { // Reassociate close click every time the table is redrawn -// /* Prevent to loop on click while redrawing table */ -// $('.ResourceSelectedClose').unbind('click'); -// /* Handle clicks on close span */ -// /* Reassociate close click every time the table is redrawn */ -// $('.ResourceSelectedClose').bind('click', self, self._close_click); -// } - }); + bAutoWidth: true, + }); - // XXX This should not be done at init... - this.elmt('update').click(this, this.do_checksla); - this.elmt('refresh').click(this, this.do_refresh); - this.elmt('reset').click(this, this.do_reset); - this.elmt('clear_annotations').click(this, this.do_clear_annotations); + this.elmt('update').click(this, this.do_ok); + this.elmt('refresh').click(this, this.do_cancel); this.listen_query(options.query_uuid); }, @@ -75,244 +59,118 @@ do_checksla: function(e) { var username = e.data.options.username; var urn = data.value; - var arrayselectedresources = data.selected_resources; + var arraySelectedResources = data.selected_resources; - var accepted_sla = Array(); + var accepted_sla = []; var count = 0; - // XXX check that the query is not disabled - - console.log("DATA VALUE: " + data.value); - - //

SLA description

- //

Testbed guarantees 0.99 Uptime rate for 0.99 rate of the VirtualWall resources during the sliver lifetime

- //

SLA description

- //

Testbed guarantees 0.99 Uptime rate for 0.99 rate of the WiLab2 resources during the sliver lifetime

- var promt = $('#modal-body'); + var self = e.data; + // var testbedsWithSLA = ["iminds", "fuseco", "netmode"]; + var testbedsWithSLA; - // id="myModalLabel" - var flagVW = false; - var flagWi = false; + var sliverPattern = /IDN\+(.+)\+(node|channel)\+/; + var list = []; - promt.append('

SLA description

'); + var promt = $('#sla-table-body'); - var wilabForm = ""; - wilabForm += ""; - - //var wallmessage = '

SLA description

Testbed guarantees 0.99 Uptime rate for 0.99 rate of the VirtualWall resources during the sliver lifetime

'; - - var wallForm = ""; - wallForm += ""; - - var flagDouble = false; - if(flagWi) - { - flagDouble = true; - promt.append('

Testbed guarantees 0.99 Uptime rate for 0.99 rate of the WiLab2 resources during the sliver lifetime

'); - promt.append(wilabForm); - promt.append('
'); - } - if(flagVW) - { - //promt.append(wallmessage); - flagDouble = true; - promt.append('

Testbed guarantees 0.99 Uptime rate for 0.99 rate of the VirtualWall resources during the sliver lifetime

'); - promt.append(wallForm); - promt.append('
'); - } - - - // var wimessage = '

SLA description

Testbed guarantees 0.99 Uptime rate for 0.99 rate of the VirtualWall resources during the sliver lifetime

' - - $('#sla_dialog').show(); - $('#slamodal-wilab2').modal('show'); - - - $("#accept_sla_wilab2").click(function(){ - console.log("SLA ACCEPTED"); - console.log("With username: " + username); - - // var promt = $('#modal-body'); - // var notchecked = true; - // for (var i=0;i<50;i++) - // { - // var wielement = $('#wi'+i); - // var wallElement = $('#wall'+i); - // if(wielement != null && !wielement.checked) - // { - // notchecked = false; - // } - // if(wallElement!= null && !wallElement.checked) - // { - // notchecked = false; - // } - // } - - if(flagDouble) - { - $.post("/sla/agreements/simplecreate", - { "template_id": "iMindsServiceWiLab2", - "user": username, - "expiration_time": new Date().toISOString() - }); - $.post("/sla/agreements/simplecreate", - { "template_id": "iMindsServiceVirtualwall", - "user": username, - "expiration_time": new Date().toISOString() - }); - - $('#slamodal-wilab2').modal('hide'); - accepted_sla["wilab2"] = true; - - this.do_update(e); - } - }); + }); - $("#dismiss_sla_wilab2").click(function(){ - console.log("SLA NOT ACCEPTED"); - $('#slamodal-wilab2').modal('hide'); - }); - - // for(var iter = 0; iter < arrayselectedresources.length; iter++){ - // var list = ''+arrayselectedresources[iter].toLowerCase()+'
'; - // promt.append(list); - // if (arrayselectedresources[iter].toLowerCase().indexOf("wall2") >= 0){ + $("#submit_sla").unbind().click(function(){ + console.log("With username: " + username); + var notChecked = $("input[name='slaaccept']:not(:checked)"); + + if (notChecked.length > 0) { + for (var i = 0; i < notChecked.length; i++) { + console.log("SLA not accepted: " + notChecked[i].value); + } - - // accepted_sla.push({"wall2":false}); - - // $('#sla_dialog').show(); - // $('#slamodal-virtualwall').modal('show'); - - - // $("#accept_sla_vwall").click(function(){ - // console.log("SLA ACCEPTED"); - // console.log("With username: " + username); - - // $.post("/sla/agreements/simplecreate", - // { "template_id": "iMindsServiceVirtualwall", - // "user": username, - // "expiration_time": new Date() - // }); - - // $('#slamodal-virtualwall').modal('hide'); - // accepted_sla["wall2"] = true; - // }); - - // $("#dismiss_sla_vwall").click(function(){ - // console.log("SLA NOT ACCEPTED"); - // $('#slamodal-vir').modal('hide'); - // }); - - // } + alert("All SLAs have to be accepted to continue with the reservation"); - // if (arrayselectedresources[iter].toLowerCase().indexOf("wilab2") >= 0){ + } else { + // $(list).each(function () { + // var date = new Date(); + // date.setYear(date.getFullYear() + 1); - // accepted_sla.push({"wilab2":false}); + // $.post("/sla/agreements/simplecreate", + // { "template_id": this.toString(), + // "user": username, + // "expiration_time": date.toISOString() + // }); - // $('#sla_dialog').show(); - // $('#slamodal-wilab2').modal('show'); - - - // $("#accept_sla_wilab2").click(function(){ - // console.log("SLA ACCEPTED"); - // console.log("With username: " + username); - // $.post("/sla/agreements/simplecreate", - // { "template_id": "iMindsServiceWiLab2", - // "user": username, - // "expiration_time": new Date() - // }); - - // $('#slamodal-wilab2').modal('hide'); - // accepted_sla["wilab2"] = true; - // }); - - // $("#dismiss_sla_wilab2").click(function(){ - // console.log("SLA NOT ACCEPTED"); - // $('#slamodal-wilab2').modal('hide'); - // }); - - - // } - - // } - - // for(var sla in accepted_sla){ - // if(accepted_sla[sla] == true){ - // count += 1; - // } - // } - - // if(count == accepted_sla.length){ - // this.do_update(e); - // } - }, - - - do_update: function(e) { - var self = e.data; - - var username = e.data.options.username; - var urn = data.value; - // XXX check that the query is not disabled - - self.spin(); - console.log("do_update"); - // XXX check that the query is not disabled - //manifold.raise_event(self.options.query_uuid, RUN_UPDATE); - - // how to stop the spinning after the event? - // this should be triggered by some on_updatequery_done ? - - }, + // }); + + $.ajax({ + url: "/sla/agreements/simplecreate", + data: { testbeds: list, + user: username, + resources: arraySelectedResources, + slice: main_query.filters.slice()[0][2] + }, + type: "post", + traditional: true + }); + + console.log(main_query.filters.slice()[0][2]); + + $('#slamodal').modal('hide'); + $('#sla-table-body').empty(); + //manifold.raise_event(self.options.query_uuid, RUN_UPDATE); + } + }); - // related buttons are also disabled in the html template - do_refresh: function(e) - { - throw 'resource_selected.do_refresh Not implemented'; + $("#cancel_sla").unbind().click(function(){ + $('#slamodal').modal('hide'); + $('#sla-table-body').empty(); + }); }, + /************************** GUI MANIPULATION **************************/ - do_reset: function(e) + populate_table: function() { - throw 'queryupdater.do_reset Not implemented'; - }, + var state; - do_clear_annotations: function(e) - { - throw 'queryupdater.do_clear_annotations Not implemented'; + // Loop over records and display pending ones + manifold.query_store.iter_records(this.options.query_uuid, function (record_key, record) { + state = manifold.query_store.get_record_state(this.options.query_uuid, null, STATE_SET); + + }); }, - /************************** GUI MANIPULATION **************************/ - - set_button_state: function(name, state) { this.elmt(name).attr('disabled', state ? false : 'disabled'); @@ -340,104 +198,39 @@ return cols[0]; }, - set_state: function(data) - { - console.log("function set_state"); - var action; - var msg; - var button = ''; - - var row; - - // make sure the change is visible : toggle on the whole plugin - // this might have to be made an 'auto-toggle' option of this plugin.. - // also it might be needed to be a little finer-grained here - - // XXX we don't want to show automaticaly the pending when a checkbox is checked - //this.toggle_on(); - - switch(data.request) { - case FIELD_REQUEST_ADD_RESET: - case FIELD_REQUEST_REMOVE_RESET: - // find line and delete it - row = this.find_row(data.value); - if (row) - this.table.fnDeleteRow(row.nTr); - $("#badge-pending").data('number', $("#badge-pending").data('number') - 1 ); - $("#badge-pending").text($("#badge-pending").data('number')); - return; - case FIELD_REQUEST_CHANGE: - action = 'UPDATE'; - break; - case FIELD_REQUEST_ADD: - action = 'ADD'; - break; - case FIELD_REQUEST_REMOVE: - action = 'REMOVE'; - break; - } - - switch(data.status) { - case FIELD_REQUEST_PENDING: - msg = 'PENDING'; - button = ""; - break; - case FIELD_REQUEST_SUCCESS: - msg = 'SUCCESS'; - break; - case FIELD_REQUEST_FAILURE: - msg = 'FAILURE'; - break; - } + do_update: function(e) { + var self = e.data; - var status = msg + status; + var username = e.data.options.username; + var urn = data.value; + // XXX check that the query is not disabled - + self.spin(); + console.log("do_update"); + // XXX check that the query is not disabled + //manifold.raise_event(self.options.query_uuid, RUN_UPDATE); - // find line - // if no, create it, else replace it - // XXX it's not just about adding lines, but sometimes removing some - // XXX how do we handle status reset ? - data.value = JSON.stringify(data.value); - data.selected_resources = this.selected_resources; - row = this.find_row(data.value); - newline = [ - action, - data.key, - data.value, - msg, - button - ]; - if (!row) { - // XXX second parameter refresh = false can improve performance. todo in querytable also - this.table.fnAddData(newline); - row = this.find_row(data.value); - $("#badge-pending").data('number', $("#badge-pending").data('number') + 1 ); - $("#badge-pending").text($("#badge-pending").data('number')); - } else { - // Update row text... - this.table.fnUpdate(newline, row.nTr); - } + // how to stop the spinning after the event? + // this should be triggered by some on_updatequery_done ? - // Change cell color according to status - if (row) { - $(row.nTr).removeClass('add remove') - var cls = action.toLowerCase(); - if (cls) - $(row.nTr).addClass(cls); - } }, - /*************************** QUERY HANDLER ****************************/ - - // NONE + do_ok: function(e) + { + throw 'queryupdater.do_reset Not implemented'; + }, - /*************************** RECORD HANDLER ***************************/ + do_cancel: function(e) + { + throw 'queryupdater.do_clear_annotations Not implemented'; + }, + + /************************************************************************** + * QUERY HANDLERS + **************************************************************************/ on_new_record: function(record) { - console.log("query_updater on_new_record"); - console.log(record); // if (not and update) { @@ -505,10 +298,15 @@ on_query_in_progress: function() { - messages.debug("queryupdater.on_query_in_progress"); this.spin(); }, + on_query_done: function() + { + this.populate_table(); + this.unspin(); + }, + // D : Data present // - on_clear_records (Get) // - on_new_record (shared with AD) XXX @@ -523,7 +321,6 @@ on_query_done: function() { - console.log("on_query_done"); this.unspin(); }, @@ -531,14 +328,12 @@ // NOTE: record_key could be sufficient on_added_record: function(record) { - console.log("on_added_record = ",record); this.set_record_state(record, RECORD_STATE_ADDED); // update pending number }, on_removed_record: function(record_key) { - console.log("on_removed_record = ",record_key); this.set_record_state(RECORD_STATE_REMOVED); }, @@ -552,10 +347,9 @@ // - Key and confirmation could be sufficient, or key and record state // XXX move record state to the manifold plugin API - on_field_state_changed: function(result) + on_field_state_changed: function(data) { - console.log("on_field_state_changed"); - console.log(result); + /* if(result.request == FIELD_REQUEST_ADD){ this.selected_resources.push(result.value); } else if(result.request == FIELD_REQUEST_REMOVE_RESET){ @@ -564,10 +358,89 @@ this.selected_resources.splice(i,1); } } - console.log("Resources: " + self.selected_resources); - messages.debug(result) - /* this.set_state(result.request, result.key, result.value, result.status); */ this.set_state(result); + */ + + var action, msg, row, status, button = ''; + + switch(data.state) { + case STATE_VALUE: + switch(data.op) { + // XXX other events missing !! + case STATE_VALUE_CHANGE_PENDING: + action = 'UPDATE'; + break; + } + break; + + case STATE_SET: + switch(data.op) { + case STATE_SET_IN_PENDING: + action = 'ADD'; + msg = 'PENDING'; + button = ""; + break; + + case STATE_SET_OUT_PENDING: + action = 'REMOVE'; + msg = 'PENDING'; + button = ""; + break; + + case STATE_SET_IN: + case STATE_SET_OUT: + // find line and delete it + row = this.find_row(data.value); + if (row) + this.table.fnDeleteRow(row.nTr); + return; + + case STATE_SET_IN_SUCCESS: + case STATE_SET_OUT_SUCCESS: + msg = 'SUCCESS'; + break; + + case STATE_SET_IN_FAILURE: + case STATE_SET_OUT_FAILURE: + msg = 'FAILURE'; + break; + + } + break; + + default: + return; + } + + status = msg + status; + + // find line + // if no, create it, else replace it + // XXX it's not just about adding lines, but sometimes removing some + // XXX how do we handle status reset ? + + // Jordan : I don't understand this. I added this test otherwise we have string = ""..."" double quoted twice. + if (typeof(data.value) !== "string") + data.value = JSON.stringify(data.value); + data.selected_resources = this.selected_resources; + row = this.find_row(data.value); + newline = [action, data.key, data.value, msg, button]; + if (!row) { + // XXX second parameter refresh = false can improve performance. todo in querytable also + this.table.fnAddData(newline); + row = this.find_row(data.value); + } else { + // Update row text... + this.table.fnUpdate(newline, row.nTr); + } + + // Change cell color according to status + if (row) { + $(row.nTr).removeClass('add remove') + var cls = action.toLowerCase(); + if (cls) + $(row.nTr).addClass(cls); + } }, // XXX we will have the requests for change @@ -696,6 +569,6 @@ }); - $.plugin('QueryUpdater', QueryUpdater); + $.plugin('QueryUpdaterPlugin', QueryUpdaterPlugin); })(jQuery);