/** * A simple Hello World applet for documentation purpose. * The only associated command is the "Close" command. */ qx.Class.define("org.argeo.slc.ria.NewLauncherApplet", { extend : qx.ui.container.Composite, implement : [org.argeo.ria.components.IView], 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"; }, properties : { /** * The viewPane inside which this applet is added. */ view : { init : null }, viewSelection : { nullable:false, check:"org.argeo.ria.components.ViewSelection" }, instanceId : {init:""}, instanceLabel : {init:""}, /** * Commands definition, see {@link org.argeo.ria.event.CommandsManager#definitions} */ commands : { init : { "submitform" : { label : "Execute Batch On...", icon : "resource/slc/media-playback-start.png", shortcut : null, enabled : true, menu : "Launcher", toolbar : null, callback : function(e){}, submenu : [], submenuCallback : function(commandId){ alert("Execute Batch on Agent "+commandId); }, 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 execFlow = item.getUserData("batchEntrySpec").getFlow(); var specEditor = new org.argeo.slc.ria.execution.SpecEditor(execFlow); 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
the selected test" + (sel.length>1?"s":"") + " from the Batch?"); modal.addListener("ok", function(){ for(var i=0;i 0)) this.setEnabled(true); }, command : null }, "reloadagents" : { label : "Reload Agents", icon : "resource/slc/view-refresh.png", shortcut : "Control+r", enabled : true, menu : "Launcher", toolbar : "launcher", callback : function(e){ var req = org.argeo.slc.ria.SlcApi.getListAgentsService("agents"); req.send(); }, command : null }, "reloadtree" : { label : "Reload", icon : "resource/slc/view-refresh.png", shortcut : "Control+m", enabled : false, menu : "Launcher", toolbar : "launcher", callback : function(e){ 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 } } }, /** * A map containing all currently registered agents. */ registeredTopics : { init : {}, check : "Map", event : "changeRegisteredTopics" } }, statics : { 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"); req.addListener("completed", function(response){ var executionModule = new org.argeo.slc.ria.execution.Module(); executionModule.setXmlNode(response.getContent()); // // ARTIFIALLY REPLACE MODULE NAME / VERSION, FOR TESTS PURPOSES // executionModule.setName(moduleData.name); executionModule.setVersion(moduleData.version); // END 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(); }, 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; }, /** * 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 */ _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 }); } 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); } } }, */ /** * Refresh the selector when the topics are updated. * @param changeTopicsEvent {qx.event.type.DataEvent} The reload event. */ _feedSelector : function(changeTopicsEvent){ var topics = changeTopicsEvent.getData(); var command = this.getCommands()["submitform"].command; command.setEnabled(false); var menu = []; for(var key in topics){ var submenu = {"label":topics[key],"icon":"resource/slc/mime-xsl.png", "commandId":key}; menu.push(submenu); } 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. */ _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