X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=server%2Forg.argeo.slc.ria%2Fsrc%2Fargeo-ria-lib%2Fslc%2Fclass%2Forg%2Fargeo%2Fslc%2Fria%2FFlowsSelectorView.js;h=a6d7c78d66e2d59ada345a581cd2088d5fbdb9dd;hb=425c2ead18e43492446a8e8ecb05b975fdbc0bf0;hp=f30018443f297f0f0e44e6ba038c7bab7f4ba2f1;hpb=1156e29154fe7ba7e545f73b6884dd437f829ad5;p=gpl%2Fargeo-slc.git diff --git a/server/org.argeo.slc.ria/src/argeo-ria-lib/slc/class/org/argeo/slc/ria/FlowsSelectorView.js b/server/org.argeo.slc.ria/src/argeo-ria-lib/slc/class/org/argeo/slc/ria/FlowsSelectorView.js index f30018443..a6d7c78d6 100644 --- a/server/org.argeo.slc.ria/src/argeo-ria-lib/slc/class/org/argeo/slc/ria/FlowsSelectorView.js +++ b/server/org.argeo.slc.ria/src/argeo-ria-lib/slc/class/org/argeo/slc/ria/FlowsSelectorView.js @@ -5,6 +5,7 @@ qx.Class.define("org.argeo.slc.ria.FlowsSelectorView", { extend : qx.ui.container.Composite, implement : [org.argeo.ria.components.IView], + include : [org.argeo.ria.session.MPrefHolder], construct : function() { this.base(arguments); @@ -28,6 +29,10 @@ qx.Class.define("org.argeo.slc.ria.FlowsSelectorView", { instanceLabel : { init : "" }, + executeAfterAdd : { + init : false, + check : "Boolean" + }, /** * Commands definition, see * {@link org.argeo.ria.event.CommandsManager#definitions} @@ -36,7 +41,7 @@ qx.Class.define("org.argeo.slc.ria.FlowsSelectorView", { init : { "addtobatch" : { label : "Add to batch", - icon : "resource/slc/list-add.png", + icon : "org.argeo.slc.ria/list-add.png", shortcut : null, enabled : true, menu : null, @@ -64,6 +69,11 @@ qx.Class.define("org.argeo.slc.ria.FlowsSelectorView", { return; } } + if(this.getExecuteAfterAdd() && batchView.getCommands()){ + batchView.setForceClearPreference(true); + batchView.getCommands()["submitform"].command.execute(); + } + this.setExecuteAfterAdd(false); }, selectionChange : function(viewId, selection) { if (viewId != "form:tree") @@ -76,13 +86,13 @@ qx.Class.define("org.argeo.slc.ria.FlowsSelectorView", { case "qx.ui.tree.TreeFile" : this.setEnabled(true); break; - case "qx.ui.tree.TreeFolder" : - if (item.getTree().getRoot() == item) + case "org.argeo.ria.components.PersistentTreeFolder" : + if (item.getTree() && item.getTree().getRoot() == item) break; this.setEnabled(true); break; case "org.argeo.ria.components.DynamicTreeFolder" : - if (item.getTree().getRoot() == item) + if (item.getTree() && item.getTree().getRoot() == item) break; if (item.getState() == "loaded") this.setEnabled(true); @@ -91,13 +101,55 @@ qx.Class.define("org.argeo.slc.ria.FlowsSelectorView", { }, command : null }, + "preferredHost" : { + label : "Toggle 'Preferred Host'", + icon : "ria/bookmark.png", + shortcut : null, + enabled : true, + menu : null, + toolbar : null, + callback : function(e) { + if (this.tree.isSelectionEmpty()) { + return; + } + var selection = this.tree.getSelection(); + if(selection.length != 1) return; + var agentNode = selection[0]; + if(!agentNode.getUserData("agentHost")) return; + this.togglePreferredHost(agentNode); + }, + selectionChange : function(viewId, selection) { + if (viewId != "form:tree") + return; + if (!selection || selection.length != 1) + return; + var item = selection[0]; + this.setEnabled(false); + if(item.getUserData("agentHost")){ + this.setEnabled(true); + } + }, + command : null + }, + "reloadfull" : { + label : "Reload Agents", + icon : "org.argeo.slc.ria/view-refresh.png", + shortcut : "control+h", + enabled : true, + menu : "Launcher", + toolbar : "list", + callback : function(e) { + this.rootNode.reload(); + }, + command : null + }, "reloadtree" : { - label : "Reload", - icon : "resource/slc/view-refresh.png", - shortcut : "Control+m", + label : "Reload Node", + icon : "org.argeo.slc.ria/view-refresh.png", + shortcut : null, enabled : false, - menu : "Launcher", - toolbar : "launcher", + menu : null, + toolbar : null, callback : function(e) { if (this.tree.isSelectionEmpty()) { return; } var selected = this.tree.getSelection()[0]; @@ -160,15 +212,27 @@ qx.Class.define("org.argeo.slc.ria.FlowsSelectorView", { } }, - statics : { + statics : { + + riaPreferences : { + "flowSelector.preferred.hosts" : { + label : "Preferred Hosts (Execution View)", + type : "string" + } + }, + /** * Static loader for the "agent" level (first level) * * @param folder - * {qx.ui.tree.TreeFolder} The root Tree Folder. + * {org.argeo.ria.components.PersistentTreeFolder} The root Tree Folder. */ agentLoader : function(folder) { + var preferredHosts = org.argeo.ria.session.MPrefHolder.loadRiaPreferenceValue("flowSelector.preferred.hosts"); + if(preferredHosts && preferredHosts!=""){ + preferredHosts = preferredHosts.split(","); + } var req = org.argeo.slc.ria.SlcApi.getListAgentsService("agents"); var agents = {}; if(folder.getState() == "loaded" && folder.getUserData("agentsMap")){ @@ -179,25 +243,31 @@ qx.Class.define("org.argeo.slc.ria.FlowsSelectorView", { req.addListener("completed", function(response) { var xmlDoc = response.getContent(); var nodes = org.argeo.ria.util.Element.selectNodes(xmlDoc, - "//slc:slc-agent-descriptor"); + "/slc:object-list/slc:slc-agent-descriptor"); var modulesLoader = org.argeo.slc.ria.FlowsSelectorView.modulesLoader; for (var i = 0; i < nodes.length; i++) { - var uuid = org.argeo.ria.util.Element.getSingleNodeText( - nodes[i], "@uuid"); + var uuid = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "@uuid"); + var host = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "slc:host"); if(agents[uuid]){ newAgents[uuid] = host; continue; } - var host = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "slc:host"); agents[uuid] = host; if(newAgents) newAgents[uuid] = host; var agentFolder = new org.argeo.ria.components.DynamicTreeFolder( - host + ' (' + uuid + ')', modulesLoader, - "Loading Modules...", folder.getDragData()); + host, modulesLoader, "Loading Modules...", folder.getDragData()); + org.argeo.slc.ria.FlowsSelectorView.attachToolTip(agentFolder, uuid); + agentFolder.setPersistentTreeID(folder.getPersistentTreeID()+"_"+uuid); + agentFolder.setUserData("agentHost", host); // Used by bookmark system agentFolder.setUserData("agentUuid", uuid); - agentFolder.setIcon("resource/slc/mime-xsl-22.png"); - folder.add(agentFolder); + if(preferredHosts && preferredHosts instanceof Array && qx.lang.Array.contains(preferredHosts, host)){ + folder.addAtBegin(agentFolder); + agentFolder.setIcon("org.argeo.slc.ria/computer_bookmarked.png"); + }else{ + folder.add(agentFolder); + agentFolder.setIcon("org.argeo.slc.ria/computer.png"); + } } if(newAgents){ // Make sure some agents should not be removed @@ -227,7 +297,7 @@ qx.Class.define("org.argeo.slc.ria.FlowsSelectorView", { * root folder. * * @param folder - * {qx.ui.tree.TreeFolder} The root folder + * {org.argeo.ria.components.PersistentTreeFolder} The root folder */ modulesLoader : function(folder) { var agentId = folder.getUserData("agentUuid"); @@ -235,29 +305,39 @@ qx.Class.define("org.argeo.slc.ria.FlowsSelectorView", { req.addListener("completed", function(response) { var descriptors = org.argeo.ria.util.Element.selectNodes( response.getContent(), - "slc:object-list/slc:execution-module-descriptor"); + "slc:object-list/" + org.argeo.slc.ria.execution.Module.XPATH_ROOT); var mods = {}; 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"); + var tmpModule = new org.argeo.slc.ria.execution.Module(); + try{ + tmpModule.setXmlNode(descriptors[i]); + }catch(e){ + qx.log.Logger.error(e); + } + var name = tmpModule.getName(); + var version = tmpModule.getVersion(); if (!mods[name]) mods[name] = []; - mods[name].push(version); + mods[name].push(tmpModule); } var flowLoader = org.argeo.slc.ria.FlowsSelectorView.flowLoader; for (var key in mods) { for (var i = 0; i < mods[key].length; i++) { + var module = mods[key][i]; var versionFolder = new org.argeo.ria.components.DynamicTreeFolder( - key + ' (' + mods[key][i] + ')', flowLoader, + module.getLabel(), flowLoader, "Loading Flows", folder.getDragData()); - folder.add(versionFolder); versionFolder.setUserData("moduleData", { name : key, - version : mods[key][i] + version : module.getVersion() }); + versionFolder.setIcon("org.argeo.slc.ria/archive.png"); versionFolder.setUserData("agentUuid", agentId); + var sep = (module.getDescription()!=""?" - ":""); + org.argeo.slc.ria.FlowsSelectorView.attachToolTip(versionFolder, key + ' (' + module.getVersion() + ')'+sep+module.getDescription()); + // Warning, we must add it AFTER setting the user data, + // because of the persistent loading mechanism. + folder.add(versionFolder); } } folder.setLoaded(true); @@ -274,7 +354,7 @@ qx.Class.define("org.argeo.slc.ria.FlowsSelectorView", { * and create its children. * * @param folder - * {qx.ui.tree.TreeFolder} A Tree folder containing in the + * {org.argeo.ria.components.PersistentTreeFolder} A Tree folder containing in the * key "moduleData" of its user data a map containing the * keys {name,version} */ @@ -295,6 +375,10 @@ qx.Class.define("org.argeo.slc.ria.FlowsSelectorView", { var execFlows = executionModule.getExecutionFlows(); for (var key in execFlows) { var file = new qx.ui.tree.TreeFile(key); + if(execFlows[key].getDescription() != ""){ + org.argeo.slc.ria.FlowsSelectorView.attachToolTip(file, execFlows[key].getDescription()); + } + file.setIcon("org.argeo.slc.ria/system.png"); var path = execFlows[key].getPath(); file.setUserData("executionModule", executionModule); file.setUserData("executionFlow", execFlows[key]); @@ -313,6 +397,12 @@ qx.Class.define("org.argeo.slc.ria.FlowsSelectorView", { req.send(); }, + attachToolTip : function(nodeItem, description){ + var tt = new qx.ui.tooltip.ToolTip(description); + tt.setShowTimeout(0); + nodeItem.setToolTip(tt); + }, + /** * Parse a string path and search if there is a root node. * @@ -345,7 +435,7 @@ qx.Class.define("org.argeo.slc.ria.FlowsSelectorView", { continue; crtPath += "/" + parts[i]; if (!model[crtPath]) { - var virtualFolder = new qx.ui.tree.TreeFolder(parts[i]); + var virtualFolder = new org.argeo.ria.components.PersistentTreeFolder(parts[i]); if (userData && qx.lang.Object.getLength(userData)) { for (var key in userData) { virtualFolder.setUserData(key, userData[key]); @@ -436,6 +526,30 @@ qx.Class.define("org.argeo.slc.ria.FlowsSelectorView", { this.remoteNotifier.stopPolling(); }, + /** + * + * @param agentNode {qx.ui.tree.AbstractTreeItem} + */ + togglePreferredHost : function(agentNode){ + var hostName = agentNode.getUserData("agentHost"); + var pref = this.getRiaPreferenceValue("flowSelector.preferred.hosts"); + var prefArray = []; + if(pref){ + prefArray = pref.split(","); + } + if(qx.lang.Array.contains(prefArray, hostName)){ + qx.lang.Array.remove(prefArray, hostName); + agentNode.setIcon("org.argeo.slc.ria/computer.png"); + }else{ + prefArray.push(hostName); + agentNode.setIcon("org.argeo.slc.ria/computer_bookmarked.png"); + var parent = agentNode.getParent(); + parent.remove(agentNode); + parent.addAtBegin(agentNode); + } + this.setRiaPreferenceValue("flowSelector.preferred.hosts", prefArray.join(",")); + }, + /** * Creates the main applet layout. */ @@ -459,10 +573,12 @@ qx.Class.define("org.argeo.slc.ria.FlowsSelectorView", { "Tests", this.self(arguments).agentLoader, "Loading Agents", dragData); this.tree.setRoot(this.rootNode); + this.tree.setHideRoot(true); + this.rootNode.setPersistentTreeID("org.argeo.slc.ria.FlowsSelector") this.rootNode.setOpen(true); this.tree.setContextMenu(org.argeo.ria.event.CommandsManager .getInstance().createMenuFromIds(["addtobatch", - "reloadtree"])); + "reloadtree", "preferredHost"])); this.tree.addListener("changeSelection", function(e) { var viewSelection = this.getViewSelection(); @@ -474,6 +590,15 @@ qx.Class.define("org.argeo.slc.ria.FlowsSelectorView", { } }, this); + this.tree.addListener("dblclick", function(e){ + var sel = this.tree.getSortedSelection(); + if(sel && sel.length!=1) return; + var origin = sel[0]; + if(origin.classname == "qx.ui.tree.TreeFile"){ + this.setExecuteAfterAdd(true); + this.getCommands()["addtobatch"].command.execute(); + } + }, this); this.add(this.tree); },