From: Charles du Jeu Date: Wed, 1 Jul 2009 20:47:34 +0000 (+0000) Subject: git-svn-id: https://svn.argeo.org/slc/trunk@2661 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc X-Git-Tag: argeo-slc-2.1.7~1711 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=7cf6c4c6219fb29f64cbe1eedc96c39928819771;p=gpl%2Fargeo-slc.git git-svn-id: https://svn.argeo.org/slc/trunk@2661 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/server/org.argeo.slc.ria/src/argeo-ria-lib/slc-web/class/org/argeo/slc/web/LauncherPerspective.js b/server/org.argeo.slc.ria/src/argeo-ria-lib/slc-web/class/org/argeo/slc/web/LauncherPerspective.js index 1b9b178bd..d46f96844 100644 --- a/server/org.argeo.slc.ria/src/argeo-ria-lib/slc-web/class/org/argeo/slc/web/LauncherPerspective.js +++ b/server/org.argeo.slc.ria/src/argeo-ria-lib/slc-web/class/org/argeo/slc/web/LauncherPerspective.js @@ -31,7 +31,8 @@ qx.Class.define("org.argeo.slc.web.LauncherPerspective", viewsManager.registerViewPane(selectorPane); var batchPane = new org.argeo.ria.components.ViewPane("batch", "Batch"); - batchPane.set({width: 500, height:500}); + + batchPane.set({width: 500, height:parseInt(qx.bom.Viewport.getHeight()*60/100)}); viewsManager.registerViewPane(batchPane); var logPane = new org.argeo.ria.components.ViewPane("main", "Executions Log"); diff --git a/server/org.argeo.slc.ria/src/argeo-ria-lib/slc-web/class/org/argeo/slc/web/MonitorPerspective.js b/server/org.argeo.slc.ria/src/argeo-ria-lib/slc-web/class/org/argeo/slc/web/MonitorPerspective.js new file mode 100644 index 000000000..dde8d2747 --- /dev/null +++ b/server/org.argeo.slc.ria/src/argeo-ria-lib/slc-web/class/org/argeo/slc/web/MonitorPerspective.js @@ -0,0 +1,70 @@ +/** + * IPerspective Implementation : Horizontal split pane defining two panes, "list" and "applet". + */ + +/* ************************************************************************ + +#asset(argeo-ria-lib/slc/resource/org.argeo.slc.ria/*) + +************************************************************************ */ +qx.Class.define("org.argeo.slc.web.MonitorPerspective", +{ + extend : qx.core.Object, + implement : [org.argeo.ria.components.IPerspective], + + construct : function(){ + this.base(arguments); + org.argeo.ria.util.Element.DEFAULT_NAMESPACE_MAP = {slc:"http://argeo.org/projects/slc/schemas"}; + }, + + statics : { + LABEL : "SLC Monitoring", + ICON : "ria/system-run.png" + }, + + members : { + _splitPane : null, + + initViewPanes : function(viewsManager){ + + this._splitPane = new qx.ui.splitpane.Pane("horizontal"); + + this._secondSplitPane = new qx.ui.splitpane.Pane("vertical"); + this._splitPane.add(this._secondSplitPane, 0); + + var topLeft = new org.argeo.ria.components.ViewPane("selector", "Fows and Modules"); + topLeft.set({width:300, height:400}); + viewsManager.registerViewPane(topLeft); + this._secondSplitPane.add(topLeft, 0); + this._secondSplitPane.setDecorator(null); + + var bottomLeft = new org.argeo.ria.components.ViewPane("properties", "Properties"); + viewsManager.registerViewPane(bottomLeft); + this._secondSplitPane.add(bottomLeft, 1); + + var rightPane = new org.argeo.ria.components.TabbedViewPane("applet", "Detail"); + viewsManager.registerViewPane(rightPane); + + + + + this._splitPane.add(rightPane, 1); + + viewsManager.getViewPanesContainer().add(this._splitPane, {flex:1}); + + }, + + initViews : function(viewsManager){ + var view = viewsManager.initIViewClass(org.argeo.slc.ria.monitor.FlowsSelectorView, "selector"); + view.load(); + var pView = viewsManager.initIViewClass(org.argeo.slc.ria.monitor.PropertiesView, "properties"); + pView.load(); + }, + + remove : function(viewsManager){ + viewsManager.getViewPanesContainer().remove(this._splitPane); + } + + } + +}); \ No newline at end of file diff --git a/server/org.argeo.slc.ria/src/argeo-ria-lib/slc-web/class/org/argeo/slc/web/TestList.js b/server/org.argeo.slc.ria/src/argeo-ria-lib/slc-web/class/org/argeo/slc/web/TestList.js index 0b0ac233c..31f97165d 100644 --- a/server/org.argeo.slc.ria/src/argeo-ria-lib/slc-web/class/org/argeo/slc/web/TestList.js +++ b/server/org.argeo.slc.ria/src/argeo-ria-lib/slc-web/class/org/argeo/slc/web/TestList.js @@ -9,7 +9,19 @@ qx.Class.define("org.argeo.slc.web.TestList", { extend : qx.ui.container.Composite, implement : [org.argeo.ria.components.IView], + include : [org.argeo.ria.session.MPrefHolder], + statics : { + riaPreferences : { + "slc.web.TestList.DefaultAction" : { + label : "Test List : Double Click default action", + type : "list", + list : ["Open","Download Xls"], + defaultValue : "Open" + } + } + }, + construct : function(){ this.base(arguments, new qx.ui.layout.VBox()); var model = new qx.ui.table.model.Simple(); @@ -287,7 +299,14 @@ qx.Class.define("org.argeo.slc.web.TestList", }); var viewPane = this.getView(); this.table.addListener("dblclick", function(e){ - org.argeo.ria.event.CommandsManager.getInstance().executeCommand("opentest"); + var pref = this.getRiaPreferenceValue("slc.web.TestList.DefaultAction"); + if(pref == "Open"){ + org.argeo.ria.event.CommandsManager.getInstance().executeCommand("opentest"); + }else{ + var uuid = this.extractTestUuid(); + var url = "../resultView.xslt?uuid="+uuid; + alert('Should download : '+url); + } }, this); var columnModel = this.table.getTableColumnModel(); columnModel.getBehavior().setWidth(0, "60%"); 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 e7d78f589..21c187ec2 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 @@ -460,6 +460,7 @@ qx.Class.define("org.argeo.slc.ria.FlowsSelectorView", { "Tests", this.self(arguments).agentLoader, "Loading Agents", dragData); this.tree.setRoot(this.rootNode); + this.rootNode.setPersistentTreeID("org.argeo.slc.ria.FlowsSelector") this.rootNode.setOpen(true); this.tree.setContextMenu(org.argeo.ria.event.CommandsManager .getInstance().createMenuFromIds(["addtobatch", diff --git a/server/org.argeo.slc.ria/src/argeo-ria-lib/slc/class/org/argeo/slc/ria/monitor/FlowsSelectorView.js b/server/org.argeo.slc.ria/src/argeo-ria-lib/slc/class/org/argeo/slc/ria/monitor/FlowsSelectorView.js new file mode 100644 index 000000000..46cf61e15 --- /dev/null +++ b/server/org.argeo.slc.ria/src/argeo-ria-lib/slc/class/org/argeo/slc/ria/monitor/FlowsSelectorView.js @@ -0,0 +1,292 @@ +/** + * The selector view + * + */ +qx.Class.define("org.argeo.slc.ria.monitor.FlowsSelectorView", { + extend : org.argeo.slc.ria.FlowsSelectorView, + implement : [org.argeo.ria.components.IView], + + construct : function() { + this.base(arguments); + }, + + properties : { + /** + * Commands definition, see + * {@link org.argeo.ria.event.CommandsManager#definitions} + */ + commands : { + refine : true, + init : { + "reloadtree" : { + label : "Reload", + icon : "org.argeo.slc.ria/view-refresh.png", + shortcut : "Control+m", + enabled : false, + menu : "Launcher", + toolbar : "launcher", + callback : function(e) { + if (this.tree.isSelectionEmpty()) { return; } + var selected = this.tree.getSelection()[0]; + if (selected.classname == "org.argeo.ria.components.DynamicTreeFolder") { + if (selected.getUserData("moduleData")) { + // It's a "module" node, first trigger the + // reloadBundle.service + selected.setUserData("dataModel", {}); + selected.setEnabled(false); + selected.setOpen(false); + var moduleData = selected + .getUserData("moduleData"); + var bundleService = org.argeo.slc.ria.SlcApi + .getReloadBundleService( + moduleData.name, + moduleData.version); + bundleService.addListener("completed", + function(response) { + selected.setEnabled(true); + selected.setOpen(true); + selected.reload(); + }, this); + // bundleService.send(); + // Do not send, not implemented yet, false timer + // instead. + qx.event.Timer.once(function(response) { + selected.setEnabled(true); + selected.setOpen(true); + selected.reload(); + }, this, 2000); + } else { + selected.reload(); + } + } + }, + selectionChange : function(viewId, selection) { + if (viewId != "form:tree") + return; + if (!selection) + return; + if (selection.length > 1) { + this.setEnabled(false); + 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 : { + /** + * Static loader for the "agent" level (first level) + * + * @param folder + * {org.argeo.ria.components.PersistentTreeFolder} The root Tree Folder. + */ + agentLoader : function(folder) { + + var req = org.argeo.slc.ria.SlcApi.getListAgentsService("agents"); + var agents = {}; + if(folder.getState() == "loaded" && folder.getUserData("agentsMap")){ + // Diff loading, just add new nodes. + agents = folder.getUserData("agentsMap"); + var newAgents = {}; + } + req.addListener("completed", function(response) { + var xmlDoc = response.getContent(); + var nodes = org.argeo.ria.util.Element.selectNodes(xmlDoc, + "//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 host = org.argeo.ria.util.Element.getSingleNodeText(nodes[i], "slc:host"); + if(agents[uuid]){ + newAgents[uuid] = host; + continue; + } + agents[uuid] = host; + if(newAgents) newAgents[uuid] = host; + var agentFolder = new org.argeo.ria.components.DynamicTreeFolder( + host + ' (' + uuid + ')', modulesLoader, + "Loading Modules...", folder.getDragData()); + agentFolder.setUserData("agentUuid", uuid); + agentFolder.setIcon("org.argeo.slc.ria/mime-xsl-22.png"); + folder.add(agentFolder); + } + if(newAgents){ + // Make sure some agents should not be removed + for(var agentKey in agents){ + if(!newAgents[agentKey]){ + var node = org.argeo.slc.ria.FlowsSelectorView.findAgentNodeById(folder, agentKey); + if(node) folder.remove(node); + delete agents[agentKey]; + var batchView = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("batch").getContent(); + if(batchView) batchView.clearBatchForAgentId(agentKey); + } + } + } + folder.setUserData("agentsMap", agents); + folder.setLoaded(true); + folder.getTree().fireEvent("changeSelection"); + }); + req.addListener("failed", function(response) { + folder.setLoaded(true); + }); + req.send(); + + }, + + /** + * Loader for the "modules" level : takes any tree folder, currently the + * root folder. + * + * @param folder + * {org.argeo.ria.components.PersistentTreeFolder} The root folder + */ + modulesLoader : function(folder) { + var agentId = folder.getUserData("agentUuid"); + var req = org.argeo.slc.ria.SlcApi.getListModulesService(agentId); + req.addListener("completed", function(response) { + var descriptors = org.argeo.ria.util.Element.selectNodes( + response.getContent(), + "slc:object-list/slc:execution-module-descriptor"); + 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"); + if (!mods[name]) + mods[name] = []; + mods[name].push(version); + } + var flowLoader = org.argeo.slc.ria.FlowsSelectorView.flowLoader; + for (var key in mods) { + for (var i = 0; i < mods[key].length; i++) { + var versionFolder = new org.argeo.ria.components.DynamicTreeFolder( + key + ' (' + mods[key][i] + ')', flowLoader, + "Loading Flows", folder.getDragData()); + versionFolder.setUserData("moduleData", { + name : key, + version : mods[key][i] + }); + versionFolder.setUserData("agentUuid", agentId); + // Warning, we must add it AFTER setting the user data, + // because of the persistent loading mechanism. + folder.add(versionFolder); + } + } + folder.setLoaded(true); + folder.getTree().fireEvent("changeSelection"); + }); + req.addListener("failed", function(response) { + folder.setLoaded(true); + }); + req.send(); + }, + + /** + * Loader for the "flow" level : takes a folder containing "moduleData" + * and create its children. + * + * @param folder + * {org.argeo.ria.components.PersistentTreeFolder} 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 agentUuid = folder.getUserData("agentUuid"); + + var req = org.argeo.slc.ria.SlcApi + .getLoadExecutionDescriptorService(agentUuid, + moduleData.name, moduleData.version); + req.addListener("completed", function(response) { + var executionModule = new org.argeo.slc.ria.execution.Module(); + try { + executionModule.setXmlNode(response.getContent()); + } catch (e) { + this.error(e); + } + var execFlows = executionModule.getExecutionFlows(); + for (var key in execFlows) { + var file = new qx.ui.tree.TreeFile(key); + var path = execFlows[key].getPath(); + file.setUserData("executionModule", executionModule); + file.setUserData("executionFlow", execFlows[key]); + file.setUserData("agentUuid", agentUuid); + org.argeo.slc.ria.FlowsSelectorView.attachNodeByPath(folder, path, file, { + agentUuid : folder.getUserData("agentUuid") + }); + folder.appendDragData(file); + } + folder.setLoaded(true); + folder.getTree().fireEvent("changeSelection"); + }); + req.addListener("failed", function(response) { + folder.setLoaded(true); + }); + req.send(); + } + }, + + members : { + + /** + * + */ + load : function() { + this._createLayout(); + this.UIBus.addListener("agentRegistered", this._addAgentHandler, this); + this.UIBus.addListener("agentUnregistered", this._removeAgentHandler, this); + }, + + /** + * Creates the main applet layout. + */ + _createLayout : function() { + + this.tree = new qx.ui.tree.Tree(); + this.tree.setDecorator(null); + this.tree.setSelectionMode("multi"); + + this.rootNode = new org.argeo.ria.components.DynamicTreeFolder( + "Tests", this.self(arguments).agentLoader, + "Loading Agents"); + this.tree.setRoot(this.rootNode); + this.rootNode.setPersistentTreeID("org.argeo.slc.ria.monitor.FlowsSelector") + this.rootNode.setOpen(true); + this.tree.setContextMenu(org.argeo.ria.event.CommandsManager + .getInstance().createMenuFromIds(["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]); + } + if(sel && sel[0]){ + var propViewPane = org.argeo.ria.components.ViewsManager.getInstance().getViewPaneById("properties"); + propViewPane.getContent().updateData(sel[0]); + } + }, this); + + + this.add(this.tree); + } + } +}); \ No newline at end of file diff --git a/server/org.argeo.slc.ria/src/argeo-ria-lib/slc/class/org/argeo/slc/ria/monitor/PropertiesView.js b/server/org.argeo.slc.ria/src/argeo-ria-lib/slc/class/org/argeo/slc/ria/monitor/PropertiesView.js new file mode 100644 index 000000000..02871ffdc --- /dev/null +++ b/server/org.argeo.slc.ria/src/argeo-ria-lib/slc/class/org/argeo/slc/ria/monitor/PropertiesView.js @@ -0,0 +1,66 @@ +qx.Class.define("org.argeo.slc.ria.monitor.PropertiesView", { + extend : qx.ui.container.Composite, + implement : [org.argeo.ria.components.IView], + + properties : { + /** + * The commands definition Map that will be automatically added and wired to the menubar and toolbar. + * See {@link org.argeo.ria.event.CommandsManager#definitions} for the keys to use for defining commands. + */ + commands : { + init : {} + }, + viewSelection : { + nullable:false, + check:"org.argeo.ria.components.ViewSelection" + }, + view : { + init : null + }, + instanceId : {init:""}, + instanceLabel : {init:""} + }, + + construct : function(){ + this.base(arguments); + this.setLayout(new qx.ui.layout.Dock()); + }, + + members : { + /** + * The implementation should contain the GUI initialisation. + * This is the role of the manager to actually add the graphical component to the pane, + * so it's not necessary to do it here. + * @param viewPane {org.argeo.ria.components.ViewPane} The pane manager + * @param data {Mixed} Any object or data passed by the initiator of the view + * @return {Boolean} + */ + init : function(viewPane, data){ + this.setView(viewPane); + this.setViewSelection(new org.argeo.ria.components.ViewSelection(viewPane.getViewId())); + this.label = new qx.ui.basic.Label("Properties"); + this.add(this.label, {edge : "center"}); + }, + /** + * The implementation should contain the real data loading (i.o. query...) + * @return {Boolean} + */ + load : function(){ + + }, + + updateData : function(node){ + this.label.setContent("Properties for : " + node.getLabel()); + }, + /** + * Whether this component is already contained in a scroller (return false) or not (return true). + * @return {Boolean} + */ + addScroll : function(){return true;}, + /** + * Called at destruction time + * Perform all the clean operations (stopping polling queries, etc.) + */ + close : function(){return true;} + } +}); \ No newline at end of file