X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.slc.webapp%2Fsrc%2Fmain%2Fwebapp%2Fargeo-ria-lib%2Fslc%2Fclass%2Forg%2Fargeo%2Fslc%2Fria%2FNewLauncherApplet.js;h=00af7cdf0641abc82fdf0d5c48399efbb0422378;hb=43a20cbd46654d84ab1610ddb1ac6bbb058fe0c3;hp=929c2664debce396084191371fd38daac01cec4b;hpb=aee7ea3ae6f38c9b03564230c71f6c265b9b5f26;p=gpl%2Fargeo-slc.git diff --git a/org.argeo.slc.webapp/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/NewLauncherApplet.js b/org.argeo.slc.webapp/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/NewLauncherApplet.js index 929c2664d..00af7cdf0 100644 --- a/org.argeo.slc.webapp/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/NewLauncherApplet.js +++ b/org.argeo.slc.webapp/src/main/webapp/argeo-ria-lib/slc/class/org/argeo/slc/ria/NewLauncherApplet.js @@ -9,11 +9,7 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet", construct : function(){ this.base(arguments); - this.setLayout(new qx.ui.layout.Dock()); - - this.COMMON_FORM_HEADER_LABEL = "Choose Agent"; - this.CHOOSE_AGENT_LABEL = "Agent Uuid"; - this.CHOOSE_FORM_PART_LABEL = "Test Type"; + this.setLayout(new qx.ui.layout.Dock()); }, properties : @@ -29,7 +25,14 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet", check:"org.argeo.ria.components.ViewSelection" }, instanceId : {init:""}, - instanceLabel : {init:""}, + instanceLabel : {init:""}, + /** + * A boolean registering whether the SpecEditor must autoOpen or not when a spec is added to the Batch. + */ + autoOpen : { + init : true, + check : "Boolean" + }, /** * Commands definition, see {@link org.argeo.ria.event.CommandsManager#definitions} */ @@ -45,7 +48,45 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet", callback : function(e){}, submenu : [], submenuCallback : function(commandId){ - alert("Execute Batch on Agent "+commandId); + //alert("Execute Batch on Agent "+commandId); + this.executeBatchOnAgent(commandId); + }, + command : null + }, + "addtobatch" : { + label : "Add to batch", + icon : "resource/slc/list-add.png", + shortcut : null, + enabled : true, + menu : null, + toolbar : null, + callback : function(e){ + this._addFlowToBatch(); + }, + selectionChange : function(viewId, selection){ + if(viewId != "form:tree") return; + if(!selection || selection.length != 1) return; + var item = selection[0]; + this.setEnabled(false); + if(qx.Class.isSubClassOf(qx.Class.getByName(item.classname), qx.ui.tree.TreeFile)){ + this.setEnabled(true); + } + + }, + command : null + }, + "toggleopenonadd" : { + label : "Auto Open", + icon : "resource/slc/document-open.png", + shortcut : null, + enabled : true, + toggle : true, + toggleInitialState : true, + menu : "Launcher", + toolbar : "launcher", + callback : function(event){ + var state = event.getTarget().getUserData("slc.command.toggleState"); + this.setAutoOpen(state); }, command : null }, @@ -59,10 +100,11 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet", callback : function(e){ var sel = this.list.getSortedSelection(); var item = sel[0]; - alert('Edit Specs for : ' + item.getLabel()); + var specEditor = new org.argeo.slc.ria.execution.SpecEditor(item.getUserData("batchEntrySpec")); + specEditor.attachAndShow(); }, selectionChange : function(viewId, selection){ - if(viewId != "form") return; + if(viewId != "form:list") return; this.setEnabled(false); if((selection && selection.length == 1)) this.setEnabled(true); }, @@ -77,10 +119,17 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet", toolbar : null, callback : function(e){ var sel = this.list.getSortedSelection(); - alert('Remove '+ sel.length+ ' elements from batch'); + var modal = new org.argeo.ria.components.Modal("Confirm", null); + modal.addConfirm("Are you sure you want to remove
the selected test" + (sel.length>1?"s":"") + " from the Batch?"); + modal.addListener("ok", function(){ + for(var i=0;i 0)) this.setEnabled(true); }, @@ -100,10 +149,10 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet", command : null }, "reloadtree" : { - label : "Reload Node", + label : "Reload", icon : "resource/slc/view-refresh.png", shortcut : "Control+m", - enabled : true, + enabled : false, menu : "Launcher", toolbar : "launcher", callback : function(e){ @@ -111,7 +160,17 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet", if(selected.classname == "org.argeo.ria.components.DynamicTreeFolder"){ selected.reload(); } - }, + }, + selectionChange : function(viewId, selection){ + if(viewId != "form:tree") return; + if(!selection || selection.length != 1) return; + var item = selection[0]; + if(!qx.Class.isSubClassOf(qx.Class.getByName(item.classname), qx.ui.tree.AbstractTreeItem)) return; + this.setEnabled(false); + if(qx.Class.isSubClassOf(qx.Class.getByName(item.classname), org.argeo.ria.components.DynamicTreeFolder)){ + this.setEnabled(true); + } + }, command : null } } @@ -127,16 +186,22 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet", }, statics : { + /** + * Loader for the "flow" level : takes a folder containing "moduleData" and create its children. + * @param folder {qx.ui.tree.TreeFolder} A Tree folder containing in the key "moduleData" of its user data a map containing the keys {name,version} + */ flowLoader : function(folder){ - var moduleData = folder.getUserData("executionModule"); - var req = org.argeo.ria.remote.RequestManager.getInstance().getRequest("stub.xml", "GET", "application/xml"); + var moduleData = folder.getUserData("moduleData"); + //var req = org.argeo.ria.remote.RequestManager.getInstance().getRequest("../argeo-ria-src/stub.xml", "GET", "application/xml"); + var req = org.argeo.slc.ria.SlcApi.getLoadExecutionDescriptorService(moduleData.name, moduleData.version); req.addListener("completed", function(response){ var executionModule = new org.argeo.slc.ria.execution.Module(); executionModule.setXmlNode(response.getContent()); var execFlows = executionModule.getExecutionFlows(); for(var key in execFlows){ var file = new qx.ui.tree.TreeFile(key); - file.setUserData("executionFlow", execFlows); + file.setUserData("executionModule", executionModule); + file.setUserData("executionFlow", execFlows[key]); folder.add(file); } folder.setLoaded(true); @@ -144,29 +209,47 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet", req.send(); }, + /** + * Loader for the "modules" level : takes any tree folder, currently the root folder. + * @param folder {qx.ui.tree.TreeFolder} The root folder + */ modulesLoader : function(folder){ - // Call service, and parse - var mods = { - "Module 1":["ver1.1", "ver1.2", "ver1.3"], - "Module 2":["ver2.1", "ver2.2", "ver2.3", "ver2.4"], - "Module 3":["ver3.1", "ver3.2"] - }; - var flowLoader = org.argeo.slc.ria.NewLauncherApplet.flowLoader; - for(var key in mods){ - var moduleFolder = new qx.ui.tree.TreeFolder(key); - folder.add(moduleFolder); - for(var i=0;i 1){ - // Add chooser - this.partChooser = new qx.ui.form.SelectBox(); - for(var key in this.parts){ - this.partChooser.add(new qx.ui.form.ListItem(this.parts[key].label, null, key)); - } - this._addFormEntry(commonForm, new qx.ui.basic.Label(this.CHOOSE_FORM_PART_LABEL), this.partChooser); - this.partChooser.addListener("changeValue", function(ev){ - this._showSelectedPart(ev.getData()); - }, this); - } - this._showSelectedPart(qx.lang.Object.getKeys(this.parts)[0]); - }, - - /** - * Show a form part given its id. - * @param partId {String} The part id - */ - _showSelectedPart : function(partId){ - if(!this.parts) return; - if(!this.partsContainer){ - this.partsContainer = new qx.ui.container.Composite(new qx.ui.layout.Canvas()); - this.formPane.add(this.partsContainer); - } - for(var i in this.parts){ - var formObject = this.parts[i]; - if(!formObject.added){ - this.partsContainer.add(formObject.pane, {top:0, left:0}); - formObject.added = true; - } - formObject.pane.hide(); - } - if(this.parts[partId]){ - this.parts[partId].pane.show(); - } - }, - - /** - * Init a form part : creates a pane, a set of fields, etc. - * @param formId {String} A unique ID - * @param label {String} A label - * @return {Map} The form part. - */ - _initFormPart : function(formId, label){ - if(!this.parts) this.parts = {}; - var formObject = {}; - formObject.hiddenFields = {}; - formObject.freeFields = []; - formObject.fields = {}; - formObject.id = formId; - formObject.label = label; - this.parts[formId] = formObject; - formObject.pane = new qx.ui.container.Composite(new qx.ui.layout.VBox(5)); - return formObject; - }, - - /** - * To be overriden by this class children. - */ - _createFormVariableParts : function(){ - var standard = this._initFormPart("standard", "Canonical"); - this._createStandardForm(standard); - var simple = this._initFormPart("simple", "SLC Sample"); - this._createSimpleForm(simple); - }, - - /** - * Creates a form for SLC demo - * @param formObject {Map} The form part - */ - _createSimpleForm : function(formObject){ - - this._addFormInputText(formObject, "ant.file", "File", "Category1/SubCategory2/build.xml"); - var moreButton = new qx.ui.basic.Image("resource/slc/list-add.png"); - moreButton.setToolTip(new qx.ui.tooltip.ToolTip("Add a parameter")); - moreButton.setCursor("pointer"); - moreButton.addListener("click", function(){ - this._addFormInputText(formObject); - }, this); - this._addFormHeader(formObject, "Add optionnal parameters", moreButton); - this._addFormInputText(formObject); - this._addFormInputText(formObject); - - }, - - /** - * Create a canonical form. - * @param formObject {Map} The form part - */ - _createStandardForm : function(formObject){ - - this._addFormHeader(formObject, "Set Execution Parameters"); - this._addFormInputText(formObject, "status", "Status", "STARTED"); - this._addFormInputText(formObject, "host", "Host", "localhost"); - this._addFormInputText(formObject, "user", "User", "user"); - - var moreButton = new qx.ui.basic.Image("resource/slc/list-add.png"); - moreButton.setToolTip(new qx.ui.tooltip.ToolTip("Add a parameter")); - moreButton.setCursor("pointer"); - moreButton.addListener("click", function(){ - this._addFormInputText(formObject); - }, this); - this._addFormHeader(formObject, "Add optionnal parameters", moreButton); - this._addFormInputText(formObject); - this._addFormInputText(formObject); - }, - - /** - * Add an hidden field to the form - * @param formObject {Map} The form part - * @param fieldName {String} Name - * @param fieldValue {String} Value - */ - _addFormHiddenField : function(formObject, fieldName, fieldValue){ - formObject.hiddenFields[fieldName] = fieldValue; + splitPane.add(this.listPane, 1); }, /** - * Creates a simple label/input form entry. - * @param formObject {Map} The form part - * @param fieldName {String} Name - * @param fieldLabel {String} Label of the field - * @param defaultValue {String} The default value - * @param choiceValues {Map} An map of values + * Adds a given ExecutionFlow to the batch + * @param target {mixed} The dropped target, can be a TreeFile (add) or a ListItem (reorder). + * @param after {qx.ui.form.ListItem} Optional list item : if set, the flow will be added as a new list item positionned after this one. */ - _addFormInputText : function(formObject, fieldName, fieldLabel, defaultValue, choiceValues){ - var labelElement; - if(choiceValues){ - var fieldElement = new qx.ui.form.SelectBox(); - for(var key in choiceValues){ - fieldElement.add(new qx.ui.form.ListItem(choiceValues[key], null, key)); - } - }else{ - var fieldElement = new qx.ui.form.TextField(); + _addFlowToBatch : function(target, after){ + //this.debug(target); + if(!target){ + target = this.tree.getSelectedItem(); + if(!target) return; + }else if(target.classname == "qx.ui.form.ListItem"){ + if(!after) return; + if(after == "first") this.list.addAt(target, 0); + else this.list.addAfter(target, after); + return; } - if(defaultValue){ - fieldElement.setValue(defaultValue); - } - if(fieldName && fieldLabel){ - labelElement = new qx.ui.basic.Label(fieldLabel); - formObject.fields[fieldName] = fieldElement; + var executionModule = target.getUserData("executionModule"); + var executionFlow = target.getUserData("executionFlow"); + var batchEntry = new org.argeo.slc.ria.execution.BatchEntrySpec(executionModule, executionFlow); + var label = batchEntry.getLabel(); + var icon = target.getIcon(); + var item = new qx.ui.form.ListItem(label, icon); + item.setUserData("batchEntrySpec", batchEntry); + item.setPaddingTop(1); + item.setPaddingBottom(2); + if(after){ + if(after == "first") this.list.addAt(item, 0); + else this.list.addAfter(item, after); }else{ - labelElement = new qx.ui.form.TextField(); - formObject.freeFields.push({ - labelEl:labelElement, - valueEl:fieldElement - }); + this.list.add(item); } - this._addFormEntry(formObject, labelElement, fieldElement); - }, - - /** - * Add an header - * @param formObject {Map} The form part - * @param content {Mixed} Content to add. - * @param additionnalButton {Mixed} Any widget to add on the east. - */ - _addFormHeader : function(formObject, content, additionnalButton){ - var header = new qx.ui.basic.Label(''+content+''); - header.setRich(true); - if(!additionnalButton){ - header.setPaddingTop(10); - formObject.pane.add(header); - }else{ - var pane = new qx.ui.container.Composite(new qx.ui.layout.Dock()); - pane.setPaddingTop(10); - pane.setPaddingRight(10); - pane.add(header, {edge:'center'}); - pane.add(additionnalButton, {edge:'east'}); - formObject.pane.add(pane); - } - }, - - /** - * Adds a label/input like entry in the form. - * @param formObject {Map} The form part - * @param labelElement {Object} Either a label or an input - * @param fieldElement {Object} Any form input. - */ - _addFormEntry : function(formObject, labelElement, fieldElement){ - var entryPane = new qx.ui.container.Composite(new qx.ui.layout.HBox(5)); - labelElement.setWidth(100); - labelElement.setTextAlign("right"); - entryPane.add(labelElement); - entryPane.add(new qx.ui.basic.Label(':')); - fieldElement.setWidth(150); - entryPane.add(fieldElement); - formObject.pane.add(entryPane); - }, - - /* - _refreshTopicsSubscriptions : function(changeTopicsEvent){ - var oldTopics = changeTopicsEvent.getOldData() || {}; - var newTopics = changeTopicsEvent.getData(); - var removed = []; - var added = []; - for(var key in oldTopics){ - if(!newTopics[key]) { - //this._removeAmqListener(key); - } - } - for(var key in newTopics){ - if(!oldTopics[key]) { - //this._addAmqListener(key); - } + this.list.select(item); + if(this.getAutoOpen()){ + this.getCommands()["editexecutionspecs"].command.execute(); } }, - */ - + /** * Refresh the selector when the topics are updated. * @param changeTopicsEvent {qx.event.type.DataEvent} The reload event. @@ -577,82 +490,32 @@ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet", var submenu = {"label":topics[key],"icon":"resource/slc/mime-xsl.png", "commandId":key}; menu.push(submenu); } + // FAKE!! + if(!menu.length){ + menu.push({"label":"Fake Agent", "icon":"resource/slc/mime-xsl.png", "commandId":"fake_agent_uuid"}); + } command.clearMenus(); command.setMenu(menu); if(menu.length) command.setEnabled(true); }, - - /* - _addAmqListener: function(uuid){ - this._amqClient.addListener("slcExec", "topic://agent."+uuid+".newExecution", function(response){ - var message = org.argeo.ria.util.Element.selectSingleNode(response, "slc:slc-execution"); - var slcExec = new org.argeo.slc.ria.SlcExecutionMessage(message.getAttribute("uuid")); - slcExec.fromXml(message); - this.logModel.addRows([ - [new Date().toString(), slcExec.getHost()+' ('+slcExec.getUuid()+')', slcExec.getStatus()] - ]); - }, this); - }, - - _removeAmqListener : function(uuid){ - this._amqClient.removeListener("slcExec", "topic://agent."+uuid+".newExecution"); - }, - */ + /** - * Make an SlcExecutionMessage from the currently displayed form. - * @param crtPartId {String} The form part currently displayed - * @param slcExec {org.argeo.slc.ria.SlcExecutionMessage} The message to fill. - * @param fields {Map} The fields of the form - * @param hiddenFields {Map} The hidden ones - * @param freeFields {Array} The free fields. + * Called at execution + * @param agentUuid {String} The id of the target agent */ - _prepareSlcExecutionMessage : function(crtPartId, slcExec, fields, hiddenFields, freeFields){ - if(crtPartId == "standard"){ - slcExec.setStatus(fields.status.getValue()); - slcExec.setHost(fields.host.getValue()); - slcExec.setUser(fields.user.getValue()); - }else{ - slcExec.addAttribute("ant.file", fields["ant.file"].getValue()); - } - for(var i=0;i