]>
git.argeo.org Git - gpl/argeo-slc.git/blob - server/org.argeo.slc.ria/src/argeo-ria-lib/slc/class/org/argeo/slc/ria/FlowsSelectorView.js
5 qx
.Class
.define("org.argeo.slc.ria.FlowsSelectorView", {
6 extend
: qx
.ui
.container
.Composite
,
7 implement
: [org
.argeo
.ria
.components
.IView
],
9 construct : function() {
11 this.setLayout(new qx
.ui
.layout
.Dock());
16 * The viewPane inside which this applet is added.
23 check
: "org.argeo.ria.components.ViewSelection"
32 * Commands definition, see
33 * {@link org.argeo.ria.event.CommandsManager#definitions}
38 label
: "Add to batch",
39 icon
: "org.argeo.slc.ria/list-add.png",
44 callback : function(e
) {
45 if (this.tree
.isSelectionEmpty()) {
48 var batchView
= org
.argeo
.ria
.components
.ViewsManager
.getInstance().getViewPaneById("batch").getContent();
49 if(!batchView
) return;
50 selection
= this.tree
.getSelection();
51 if (selection
.length
> 1) {
52 for (var i
= 0; i
< selection
.length
; i
++) {
54 batchView
.addFlowToBatch(selection
[i
], null, true);
62 batchView
.addFlowToBatch(selection
[0], null);
68 selectionChange : function(viewId
, selection
) {
69 if (viewId
!= "form:tree")
71 if (!selection
|| selection
.length
!= 1)
73 var item
= selection
[0];
74 this.setEnabled(false);
75 switch (item
.classname
) {
76 case "qx.ui.tree.TreeFile" :
77 this.setEnabled(true);
79 case "org.argeo.ria.components.PersistentTreeFolder" :
80 if (item
.getTree().getRoot() == item
)
82 this.setEnabled(true);
84 case "org.argeo.ria.components.DynamicTreeFolder" :
85 if (item
.getTree().getRoot() == item
)
87 if (item
.getState() == "loaded")
88 this.setEnabled(true);
96 icon
: "org.argeo.slc.ria/view-refresh.png",
97 shortcut
: "Control+m",
100 toolbar
: "launcher",
101 callback : function(e
) {
102 if (this.tree
.isSelectionEmpty()) { return; }
103 var selected
= this.tree
.getSelection()[0];
104 if (selected
.classname
== "org.argeo.ria.components.DynamicTreeFolder") {
105 if (selected
.getUserData("moduleData")) {
106 // It's a "module" node, first trigger the
107 // reloadBundle.service
108 selected
.setUserData("dataModel", {});
109 selected
.setEnabled(false);
110 selected
.setOpen(false);
111 var moduleData
= selected
112 .getUserData("moduleData");
113 var bundleService
= org
.argeo
.slc
.ria
.SlcApi
114 .getReloadBundleService(
117 bundleService
.addListener("completed",
119 selected
.setEnabled(true);
120 selected
.setOpen(true);
123 // bundleService.send();
124 // Do not send, not implemented yet, false timer
126 qx
.event
.Timer
.once(function(response
) {
127 selected
.setEnabled(true);
128 selected
.setOpen(true);
136 selectionChange : function(viewId
, selection
) {
137 if (viewId
!= "form:tree")
141 if (selection
.length
> 1) {
142 this.setEnabled(false);
145 var item
= selection
[0];
146 if (!qx
.Class
.isSubClassOf(qx
.Class
147 .getByName(item
.classname
),
148 qx
.ui
.tree
.AbstractTreeItem
))
150 this.setEnabled(false);
151 if (qx
.Class
.isSubClassOf(qx
.Class
152 .getByName(item
.classname
),
153 org
.argeo
.ria
.components
.DynamicTreeFolder
)) {
154 this.setEnabled(true);
165 * Static loader for the "agent" level (first level)
168 * {org.argeo.ria.components.PersistentTreeFolder} The root Tree Folder.
170 agentLoader : function(folder
) {
172 var req
= org
.argeo
.slc
.ria
.SlcApi
.getListAgentsService("agents");
174 if(folder
.getState() == "loaded" && folder
.getUserData("agentsMap")){
175 // Diff loading, just add new nodes.
176 agents
= folder
.getUserData("agentsMap");
179 req
.addListener("completed", function(response
) {
180 var xmlDoc
= response
.getContent();
181 var nodes
= org
.argeo
.ria
.util
.Element
.selectNodes(xmlDoc
,
182 "//slc:slc-agent-descriptor");
183 var modulesLoader
= org
.argeo
.slc
.ria
.FlowsSelectorView
.modulesLoader
;
185 for (var i
= 0; i
< nodes
.length
; i
++) {
186 var uuid
= org
.argeo
.ria
.util
.Element
.getSingleNodeText(nodes
[i
], "@uuid");
187 var host
= org
.argeo
.ria
.util
.Element
.getSingleNodeText(nodes
[i
], "slc:host");
189 newAgents
[uuid
] = host
;
193 if(newAgents
) newAgents
[uuid
] = host
;
194 var agentFolder
= new org
.argeo
.ria
.components
.DynamicTreeFolder(
195 host
+ ' (' + uuid
+ ')', modulesLoader
,
196 "Loading Modules...", folder
.getDragData());
197 agentFolder
.setUserData("agentUuid", uuid
);
198 agentFolder
.setIcon("org.argeo.slc.ria/mime-xsl-22.png");
199 folder
.add(agentFolder
);
202 // Make sure some agents should not be removed
203 for(var agentKey
in agents
){
204 if(!newAgents
[agentKey
]){
205 var node
= org
.argeo
.slc
.ria
.FlowsSelectorView
.findAgentNodeById(folder
, agentKey
);
206 if(node
) folder
.remove(node
);
207 delete agents
[agentKey
];
208 var batchView
= org
.argeo
.ria
.components
.ViewsManager
.getInstance().getViewPaneById("batch").getContent();
209 if(batchView
) batchView
.clearBatchForAgentId(agentKey
);
213 folder
.setUserData("agentsMap", agents
);
214 folder
.setLoaded(true);
215 folder
.getTree().fireEvent("changeSelection");
217 req
.addListener("failed", function(response
) {
218 folder
.setLoaded(true);
225 * Loader for the "modules" level : takes any tree folder, currently the
229 * {org.argeo.ria.components.PersistentTreeFolder} The root folder
231 modulesLoader : function(folder
) {
232 var agentId
= folder
.getUserData("agentUuid");
233 var req
= org
.argeo
.slc
.ria
.SlcApi
.getListModulesService(agentId
);
234 req
.addListener("completed", function(response
) {
235 var descriptors
= org
.argeo
.ria
.util
.Element
.selectNodes(
236 response
.getContent(),
237 "slc:object-list/slc:execution-module-descriptor");
239 for (var i
= 0; i
< descriptors
.length
; i
++) {
240 var name
= org
.argeo
.ria
.util
.Element
.getSingleNodeText(
241 descriptors
[i
], "slc:name");
242 var version
= org
.argeo
.ria
.util
.Element
.getSingleNodeText(
243 descriptors
[i
], "slc:version");
246 mods
[name
].push(version
);
248 var flowLoader
= org
.argeo
.slc
.ria
.FlowsSelectorView
.flowLoader
;
249 for (var key
in mods
) {
250 for (var i
= 0; i
< mods
[key
].length
; i
++) {
251 var versionFolder
= new org
.argeo
.ria
.components
.DynamicTreeFolder(
252 key
+ ' (' + mods
[key
][i
] + ')', flowLoader
,
253 "Loading Flows", folder
.getDragData());
254 versionFolder
.setUserData("moduleData", {
256 version
: mods
[key
][i
]
258 versionFolder
.setUserData("agentUuid", agentId
);
259 // Warning, we must add it AFTER setting the user data,
260 // because of the persistent loading mechanism.
261 folder
.add(versionFolder
);
264 folder
.setLoaded(true);
265 folder
.getTree().fireEvent("changeSelection");
267 req
.addListener("failed", function(response
) {
268 folder
.setLoaded(true);
274 * Loader for the "flow" level : takes a folder containing "moduleData"
275 * and create its children.
278 * {org.argeo.ria.components.PersistentTreeFolder} A Tree folder containing in the
279 * key "moduleData" of its user data a map containing the
280 * keys {name,version}
282 flowLoader : function(folder
) {
283 var moduleData
= folder
.getUserData("moduleData");
284 var agentUuid
= folder
.getUserData("agentUuid");
286 var req
= org
.argeo
.slc
.ria
.SlcApi
287 .getLoadExecutionDescriptorService(agentUuid
,
288 moduleData
.name
, moduleData
.version
);
289 req
.addListener("completed", function(response
) {
290 var executionModule
= new org
.argeo
.slc
.ria
.execution
.Module();
292 executionModule
.setXmlNode(response
.getContent());
296 var execFlows
= executionModule
.getExecutionFlows();
297 for (var key
in execFlows
) {
298 var file
= new qx
.ui
.tree
.TreeFile(key
);
299 var path
= execFlows
[key
].getPath();
300 file
.setUserData("executionModule", executionModule
);
301 file
.setUserData("executionFlow", execFlows
[key
]);
302 file
.setUserData("agentUuid", agentUuid
);
303 org
.argeo
.slc
.ria
.FlowsSelectorView
.attachNodeByPath(folder
, path
, file
, {
304 agentUuid
: folder
.getUserData("agentUuid")
306 folder
.appendDragData(file
);
308 folder
.setLoaded(true);
309 folder
.getTree().fireEvent("changeSelection");
311 req
.addListener("failed", function(response
) {
312 folder
.setLoaded(true);
318 * Parse a string path and search if there is a root node.
321 * {org.argeo.ria.components.DynamicTreeFolder} The parent
322 * node (containing data model)
324 * {String} The path of the node to attach.
326 * {qx.ui.tree.TreeFile} The leaf node
328 * {Map} User data to attach at all levels.
330 attachNodeByPath : function(rootNode
, path
, childNode
, userData
) {
331 if (!path
|| path
== "" || path
== "/") {
332 rootNode
.add(childNode
);
335 var model
= rootNode
.getUserData("dataModel");
338 rootNode
.setUserData("dataModel", model
);
340 var parts
= path
.split("/");
341 var keys
= qx
.lang
.Object
.getKeys(model
);
343 var crtFolder
= rootNode
;
344 for (var i
= 0; i
< parts
.length
; i
++) {
347 crtPath
+= "/" + parts
[i
];
348 if (!model
[crtPath
]) {
349 var virtualFolder
= new org
.argeo
.ria
.components
.PersistentTreeFolder(parts
[i
]);
350 if (userData
&& qx
.lang
.Object
.getLength(userData
)) {
351 for (var key
in userData
) {
352 virtualFolder
.setUserData(key
, userData
[key
]);
355 rootNode
.appendDragData(virtualFolder
);
356 model
[crtPath
] = virtualFolder
;
357 crtFolder
.add(virtualFolder
);
358 crtFolder
= virtualFolder
;
360 crtFolder
= model
[crtPath
];
363 crtFolder
.add(childNode
);
366 findAgentNodeById : function(node
, agentId
){
367 var nodeAgents
= node
.getItems();
368 for(var i
=0;i
<nodeAgents
.length
;i
++){
369 if(nodeAgents
[i
].getUserData("agentUuid") == agentId
){
370 return nodeAgents
[i
];
378 * Called at applet creation. Just registers viewPane.
381 * {org.argeo.ria.components.ViewPane} The viewPane.
383 init : function(viewPane
) {
384 this.setView(viewPane
);
385 this.setViewSelection(new org
.argeo
.ria
.components
.ViewSelection(viewPane
.getViewId()));
386 this.remoteNotifier
= new org
.argeo
.ria
.remote
.RemoteNotifier(
387 "/org.argeo.slc.webapp/", "pollEvent.service",
388 "addEventListener.service", "removeEventListener.service");
389 this.remoteNotifier
.setEventParamName("slc_eventType");
390 this.remoteNotifier
.setEventXPath("/slc:slc-event");
392 .setEventTypeXPath('slc:headers/slc:header[@name="slc_eventType"]');
394 .setEventDataXPath('slc:headers/slc:header[@name="slc_agentId"]');
395 this.remoteNotifier
.setAnswerStatusXPath("slc:execution-answer/slc:status");
396 this.remoteNotifier
.startPolling();
397 this.UIBus
= org
.argeo
.ria
.event
.UIBus
.getInstance();
398 this.UIBus
.registerNotifier(this.remoteNotifier
);
405 this._createLayout();
406 this.getView().setViewTitle("Available Scripts");
407 this.UIBus
.addListener("agentRegistered", this._addAgentHandler
, this);
408 this.UIBus
.addListener("agentUnregistered", this._removeAgentHandler
, this);
411 _addAgentHandler : function(agentId
){
412 this.rootNode
.load();
415 _removeAgentHandler : function(agentId
){
416 var treeNode
= this.self(arguments
).findAgentNodeById(this.rootNode
, agentId
);
418 this.rootNode
.remove(treeNode
);
420 var agentsMap
= this.getAgentsMap();
421 if(agentsMap
[agentId
]){
422 delete agentsMap
[agentId
];
424 var batchView
= org
.argeo
.ria
.components
.ViewsManager
.getInstance().getViewPaneById("batch").getContent();
426 batchView
.clearBatchForAgentId(agentId
);
430 addScroll : function() {
435 this.UIBus
.removeListener("agentRegistered", this._addAgentHandler
, this);
436 this.UIBus
.removeListener("agentUnregistered", this._removeAgentHandler
, this);
437 this.remoteNotifier
.stopPolling();
441 * Creates the main applet layout.
443 _createLayout : function() {
445 this.tree
= new qx
.ui
.tree
.Tree();
446 this.tree
.setDecorator(null);
447 this.tree
.setSelectionMode("multi");
459 this.rootNode
= new org
.argeo
.ria
.components
.DynamicTreeFolder(
460 "Tests", this.self(arguments
).agentLoader
,
461 "Loading Agents", dragData
);
462 this.tree
.setRoot(this.rootNode
);
463 this.rootNode
.setOpen(true);
464 this.tree
.setContextMenu(org
.argeo
.ria
.event
.CommandsManager
465 .getInstance().createMenuFromIds(["addtobatch",
468 this.tree
.addListener("changeSelection", function(e
) {
469 var viewSelection
= this.getViewSelection();
470 viewSelection
.setViewId("form:tree");
471 viewSelection
.clear();
472 var sel
= this.tree
.getSortedSelection();
473 for (var i
= 0; i
< sel
.length
; i
++) {
474 viewSelection
.addNode(sel
[i
]);
482 getAgentsMap : function(){
483 return this.rootNode
.getUserData("agentsMap");