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 :
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}
*/
commands : {
init : {
"submitform" : {
- label : "Execute",
+ label : "Execute Batch On...",
icon : "resource/slc/media-playback-start.png",
- shortcut : "Control+e",
+ shortcut : null,
enabled : true,
menu : "Launcher",
- toolbar : "launcher",
+ toolbar : null,
+ callback : function(e){},
+ submenu : [],
+ submenuCallback : function(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.submitForm();
+ 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
},
+ "editexecutionspecs" : {
+ label : "Edit Execution Specs",
+ icon : "resource/slc/document-open.png",
+ shortcut : null,
+ enabled : false,
+ menu : "Launcher",
+ toolbar : null,
+ callback : function(e){
+ var sel = this.list.getSortedSelection();
+ var item = sel[0];
+ var specEditor = new org.argeo.slc.ria.execution.SpecEditor(item.getUserData("batchEntrySpec"));
+ specEditor.attachAndShow();
+ },
+ selectionChange : function(viewId, selection){
+ if(viewId != "form:list") return;
+ this.setEnabled(false);
+ if((selection && selection.length == 1)) this.setEnabled(true);
+ },
+ command : null
+ },
+ "removefrombatch" : {
+ label : "Remove from batch",
+ icon : "resource/slc/edit-delete.png",
+ shortcut : null,
+ enabled : false,
+ menu : "Launcher",
+ toolbar : null,
+ callback : function(e){
+ var sel = this.list.getSortedSelection();
+ var modal = new org.argeo.ria.components.Modal("Confirm", null);
+ modal.addConfirm("Are you sure you want to remove<br> the selected test" + (sel.length>1?"s":"") + " from the Batch?");
+ modal.addListener("ok", function(){
+ for(var i=0;i<sel.length;i++){
+ this.list.remove(sel[i]);
+ }
+ }, this);
+ modal.attachAndShow();
+ },
+ selectionChange : function(viewId, selection){
+ if(viewId != "form:list") return;
+ this.setEnabled(false);
+ if((selection && selection.length > 0)) this.setEnabled(true);
+ },
+ command : null
+ },
"reloadagents" : {
label : "Reload Agents",
icon : "resource/slc/view-refresh.png",
},
command : null
},
- "testloadmodules" : {
- label : "Load Modules",
+ "reloadtree" : {
+ label : "Reload",
icon : "resource/slc/view-refresh.png",
shortcut : "Control+m",
- enabled : true,
+ enabled : false,
menu : "Launcher",
toolbar : "launcher",
callback : function(e){
- var req = org.argeo.ria.remote.RequestManager.getInstance().getRequest("stub.xml", "GET", "application/xml");
- req.addListener("completed", function(response){
- var executionModule = new org.argeo.slc.ria.module.ExecutionModule();
- executionModule.setXmlNode(response.getContent());
- this.debug(executionModule.getName());
- this.debug(qx.lang.Object.getLength(executionModule.getExecutionFlows()));
- this.debug(qx.lang.Object.getLength(executionModule.getExecutionSpecs()));
- }, this);
- req.send();
- /*
- this._amqClient.sendMessage("modulesManager.request", "", {
- "action":"getExecutionModuleDescriptor",
- "name" : "org.argeo.slc.demo.basic",
- "version" : "WHATEVER"
- });
- */
+ var selected = this.tree.getSelectedItem();
+ 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
}
}
},
+ 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("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("executionModule", executionModule);
+ file.setUserData("executionFlow", execFlows[key]);
+ folder.add(file);
+ }
+ folder.setLoaded(true);
+ });
+ 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){
+ var req = org.argeo.slc.ria.SlcApi.getListModulesService();
+ req.addListener("completed", function(response){
+ var descriptors = org.argeo.ria.util.Element.selectNodes(response.getContent(), "slc:object-list/slc:execution-module-descriptor");
+ var mods = {};
+ // STUB
+ /*
+ 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"]
+ };
+ */
+ for(var i=0;i<descriptors.length; i++){
+ var name = org.argeo.ria.util.Element.getSingleNodeText(descriptors[i], "slc:name");
+ var version = org.argeo.ria.util.Element.getSingleNodeText(descriptors[i], "slc:version");
+ if(!mods[name]) mods[name] = [];
+ mods[name].push(version);
+ }
+ 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<mods[key].length;i++){
+ var versionFolder = new org.argeo.ria.components.DynamicTreeFolder(
+ mods[key][i],
+ flowLoader,
+ "Loading Flows",
+ folder.getDragData()
+ );
+ moduleFolder.add(versionFolder);
+ versionFolder.setUserData("moduleData", {name:key, version:mods[key][i]});
+ }
+ folder.setLoaded(true);
+ }
+ });
+ req.send();
+ }
+ },
+
members :
{
/**
init : function(viewPane){
this.setView(viewPane);
this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId()));
- this._createLayout();
- //this._createForm();
this._amqClient = org.argeo.ria.remote.JmsClient.getInstance();
+ this._amqClient.uri = "/org.argeo.slc.webapp/amq";
this._amqClient.startPolling();
},
*
*/
load : function(){
+ this._createLayout();
this.getView().setViewTitle("Execution Launcher");
+ org.argeo.ria.remote.RequestManager.getInstance().addListener("reload", function(reloadEvent){
+ if(reloadEvent.getDataType()!= "agents") return ;
+ var xmlDoc = reloadEvent.getContent();
+ var nodes = org.argeo.ria.util.Element.selectNodes(xmlDoc, "//slc:slc-agent-descriptor");
+ var newTopics = {};
+ for(var i=0;i<nodes.length;i++){
+ var uuid = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "@uuid");
+ var host = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "slc:host");
+ newTopics[uuid] = host+" ("+uuid+")";
+ }
+ this.setRegisteredTopics(newTopics);
+ }, this);
this.addListener("changeRegisteredTopics", function(event){
//this._refreshTopicsSubscriptions(event);
this._feedSelector(event);
}
this._amqClient.addListener("agentregister", "topic://agent.register", reloadHandler, this);
this._amqClient.addListener("agentunregister", "topic://agent.unregister", reloadHandler, this);
- reloadHandler();
-
- this._amqClient.addListener("modulesResponse", "modulesManager.response", function(message){
- this.info(message);
- }, this);
+ reloadHandler();
},
addScroll : function(){
this.formPane.setPadding(10);
this.tree = new qx.ui.tree.Tree();
- var root = new qx.ui.tree.TreeFolder("All Tests");
+ this.tree.setDecorator(null);
+ var dragData = {
+ "file" : {
+ "type" : ["items"],
+ "action":["move"]
+ }
+ };
+
+ var root = new org.argeo.ria.components.DynamicTreeFolder(
+ "All Tests",
+ this.self(arguments).modulesLoader,
+ "Loading Modules",
+ dragData
+ );
this.tree.setRoot(root);
- var module1 = new qx.ui.tree.TreeFolder("Module 1");
- var module2 = new qx.ui.tree.TreeFolder("Module 2");
- var module3 = new qx.ui.tree.TreeFolder("Module 3");
- root.add(module1, module2, module3);
root.setOpen(true);
- for(var i=0;i<100;i++){
- var file1 = new qx.ui.tree.TreeFile("1-"+i);
- file1.setHeight(15);
- file1.setDraggable(true);
- file1.addListener("dragstart", function(e){
- e.addType("items");
- e.addAction("move");
- });
- module1.add(file1);
- var file2 = new qx.ui.tree.TreeFile("2-"+i)
- module2.add(file2);
- var file3 = new qx.ui.tree.TreeFile("3-"+i);
- module3.add(file3);
- }
- //tree.add()
+ this.tree.setContextMenu(org.argeo.ria.event.CommandsManager.getInstance().createMenuFromIds(["addtobatch", "reloadtree"]));
+
+ this.tree.addListener("changeSelection", function(e){
+ var viewSelection = this.getViewSelection();
+ viewSelection.setViewId("form:tree");
+ viewSelection.clear();
+ var sel = this.tree.getSortedSelection();
+ for(var i=0;i<sel.length;i++){
+ viewSelection.addNode(sel[i]);
+ }
+ }, this);
+
this.listPane = new qx.ui.container.Composite(new qx.ui.layout.Dock());
var listToolBar = new qx.ui.toolbar.ToolBar();
- var toolGroup = new qx.ui.toolbar.Part();
+ var toolGroup = new qx.ui.toolbar.Part();
listToolBar.add(toolGroup);
- var execButton = new qx.ui.toolbar.Button("Execute","resource/slc/media-playback-start.png");
+
+ var execButton = this.getCommands()["submitform"].command.getToolbarButton();
toolGroup.add(execButton);
- execButton.addListener("execute", function(e){
- this.getCommands()["submitform"].command.execute();
- }, this);
+
+ listToolBar.addSpacer();
+ listToolBar.setPaddingRight(4);
+ var delButton = this.getCommands()["removefrombatch"].command.getToolbarButton();
+ var formButton = this.getCommands()["editexecutionspecs"].command.getToolbarButton();
+ delButton.setShow("icon");
+ formButton.setShow("icon");
+ listToolBar.add(formButton);
+ listToolBar.add(delButton);
+
+ this.listPane.add(listToolBar, {edge:"north"});
+
+ var indicator = new qx.ui.core.Widget();
+ indicator.setDecorator(new qx.ui.decoration.Single().set({top:[1,"solid","#33508D"]}));
+ indicator.setHeight(0);
+ indicator.setOpacity(0.5);
+ indicator.setZIndex(100);
+ indicator.setLayoutProperties({left:-1000,top:-1000});
+ org.argeo.ria.Application.INSTANCE.getRoot().add(indicator);
- this.listPane.add(toolGroup, {edge:"north"});
this.list = new qx.ui.form.List();
+ this.list.setDecorator(null);
+ this.list.setSelectionMode("multi");
this.list.setDroppable(true);
- this.list.addListener("drop", function(e){
- var label = e.getRelatedTarget().getLabel();
- var li = new qx.ui.container.Composite(new qx.ui.layout.HBox(5));
- li.add(new qx.ui.basic.Label(label));
- var item = new qx.ui.form.ListItem(label);
- item.setIcon(e.getRelatedTarget().getIcon());
- item.setPaddingTop(1);
- item.setPaddingBottom(2);
- this.list.add(item);
- this.list.select(item);
- }, this);
- this.listPane.add(this.list, {edge:"center"});
+ this.list.setDraggable(true);
+ this.list.setContextMenu(org.argeo.ria.event.CommandsManager.getInstance().createMenuFromIds(["editexecutionspecs", "removefrombatch"]));
- splitPane.add(this.tree, 0);
- splitPane.add(this.listPane, 1);
- //this.add(this.scroll, {edge:'center'});
- },
+ this.list.addListener("dragstart", function(e){
+ e.addType(["items"]);
+ e.addAction(["move"]);
+ },this);
+ this.list.addListener("dragend", function(e){
+ indicator.setDomPosition(-1000,-1000);
+ });
+ this.list.addListener("dragover", function(e){
+ var orig = e.getOriginalTarget();
+ var origCoords = orig.getContainerLocation();
+ indicator.setWidth(orig.getBounds().width);
+ indicator.setDomPosition(origCoords.left, origCoords.bottom);
+ });
+ this.list.addListener("drag", function(e){
+ var orig = e.getOriginalTarget();
+ var origCoords = orig.getContainerLocation();
+ indicator.setWidth(orig.getBounds().width);
+ indicator.setDomPosition(origCoords.left, origCoords.bottom);
+ });
- /**
- * Creates the form.
- */
- _createForm : function(){
- this.fields = {};
- this.hiddenFields = {};
- this.freeFields = [];
-
- var execButtonPane = new qx.ui.container.Composite(new qx.ui.layout.Dock());
- var execButton = new qx.ui.form.Button(
- "Execute",
- "resource/slc/media-playback-start-32.png"
- )
- execButton.addListener("click", function(){
- this.submitForm();
- }, this);
- execButtonPane.setPadding(10, 80);
- execButtonPane.add(execButton, {edge:"center"});
- this.formPane.add(execButtonPane);
-
- this.agentSelector = new qx.ui.form.SelectBox();
- var serviceManager = org.argeo.ria.remote.RequestManager.getInstance();
- serviceManager.addListener("reload", function(reloadEvent){
- if(reloadEvent.getDataType()!= "agents") return ;
- var xmlDoc = reloadEvent.getContent();
- var nodes = org.argeo.ria.util.Element.selectNodes(xmlDoc, "//slc:slc-agent-descriptor");
- var newTopics = {};
- for(var i=0;i<nodes.length;i++){
- var uuid = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "@uuid");
- var host = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "slc:host");
- newTopics[uuid] = host+" ("+uuid+")";
+ this.list.addListener("drop", function(e){
+ var target = e.getRelatedTarget();
+ var afterItem = e.getOriginalTarget();
+ indicator.setDomPosition(-1000,-1000);
+ if(afterItem.classname != "qx.ui.form.ListItem") afterItem = null;
+ if(!target){
+ target = this.list.getSortedSelection()[0];
}
- this.setRegisteredTopics(newTopics);
- }, this);
+ this._addFlowToBatch(target, afterItem);
+ }, this);
+ this.listPane.add(this.list, {edge:"center"});
- var commonForm = {pane:this.formPane};
- this._addFormHeader(commonForm, this.COMMON_FORM_HEADER_LABEL);
- this._addFormEntry(commonForm, new qx.ui.basic.Label(this.CHOOSE_AGENT_LABEL), this.agentSelector);
- this._createFormVariableParts();
- if(!this.parts) return;
- if(qx.lang.Object.getLength(this.parts) > 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;
+ this.list.addListener("changeSelection", function(e){
+ var viewSelection = this.getViewSelection();
+ viewSelection.setViewId("form:list");
+ viewSelection.clear();
+ var listSel = this.list.getSortedSelection();
+ for(var i=0;i<listSel.length;i++){
+ viewSelection.addNode(listSel[i]);
}
- 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.tree, 0);
+ 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();
- }
- if(defaultValue){
- fieldElement.setValue(defaultValue);
- }
- if(fieldName && fieldLabel){
- labelElement = new qx.ui.basic.Label(fieldLabel);
- formObject.fields[fieldName] = fieldElement;
- }else{
- labelElement = new qx.ui.form.TextField();
- formObject.freeFields.push({
- labelEl:labelElement,
- valueEl:fieldElement
- });
+ _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;
}
- 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('<b>'+content+'</b>');
- header.setRich(true);
- if(!additionnalButton){
- header.setPaddingTop(10);
- formObject.pane.add(header);
+ 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{
- 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);
- }
+ this.list.add(item);
}
- 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.
*/
_feedSelector : function(changeTopicsEvent){
var topics = changeTopicsEvent.getData();
- this.agentSelector.removeAll();
- var emptyItem = new qx.ui.form.ListItem("", null, "");
- this.agentSelector.add(emptyItem);
- this.agentSelector.setSelected(emptyItem);
+ var command = this.getCommands()["submitform"].command;
+ command.setEnabled(false);
+ var menu = [];
for(var key in topics){
- var listItem = new qx.ui.form.ListItem(topics[key], null, key);
- this.agentSelector.add(listItem);
+ var submenu = {"label":topics[key],"icon":"resource/slc/mime-xsl.png", "commandId":key};
+ menu.push(submenu);
}
- },
-
- /*
- _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.
- */
- _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());
+ // FAKE!!
+ if(!menu.length){
+ menu.push({"label":"Fake Agent", "icon":"resource/slc/mime-xsl.png", "commandId":"fake_agent_uuid"});
}
- for(var i=0;i<freeFields.length;i++){
- var fF = freeFields[i];
- if(fF.labelEl.getValue() != "" && fF.valueEl.getValue() != ""){
- slcExec.addAttribute(fF.labelEl.getValue(), fF.valueEl.getValue());
- }
- }
+ command.clearMenus();
+ command.setMenu(menu);
+ if(menu.length) command.setEnabled(true);
},
+
/**
- * Called when the user clicks the "Execute" button.
+ * Called at execution
+ * @param agentUuid {String} The id of the target agent
*/
- submitForm : function(){
- var currentUuid = this.agentSelector.getValue();
- if(!currentUuid) return;
- var slcExec = new org.argeo.slc.ria.SlcExecutionMessage();
-
- var fields = {};
- var hiddenFields = {};
- var freeFields = {};
- var crtPartId = "";
- if(this.parts){
- if(this.partChooser){
- crtPartId = this.partChooser.getValue();
- }else{
- crtPartId = qx.lang.Object.getKeys(this.parts)[0];
- }
- var crtPart = this.parts[crtPartId];
- fields = crtPart.fields;
- hiddenFields = crtPart.hiddenFields;
- freeFields = crtPart.freeFields;
- }
-
- this._prepareSlcExecutionMessage(crtPartId, slcExec, fields, hiddenFields, freeFields);
-
+ executeBatchOnAgent : function(agentUuid){
+ var selection = this.list.getChildren();
+ if(!selection.length) return;
+ var slcExecMessage = new org.argeo.slc.ria.execution.Message();
+ for(var i=0;i<selection.length;i++){
+ var batchEntrySpec = selection[i].getUserData("batchEntrySpec");
+ slcExecMessage.addBatchEntrySpec(batchEntrySpec);
+ }
this._amqClient.sendMessage(
"topic://agent.newExecution",
- slcExec.toXml(),
- {"slc-agentId":currentUuid}
+ slcExecMessage.toXml(),
+ {"slc-agentId":agentUuid}
);
// Force logs refresh right now!
qx.event.Timer.once(function(){
if(command){
command.execute();
}
- }, this, 2000);
- }
+ }, this, 2000);
+ }
}
});
\ No newline at end of file