/**
* 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