PackageMapQueryWidget.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. /*##############################################################################
  2. # HPCC SYSTEMS software Copyright (C) 2013 HPCC Systems.
  3. #
  4. # Licensed under the Apache License, Version 2.0 (the "License");
  5. # you may not use this file except in compliance with the License.
  6. # You may obtain a copy of the License at
  7. #
  8. # http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. ############################################################################## */
  16. define([
  17. "dojo/_base/declare",
  18. "dojo/_base/lang",
  19. "dojo/_base/array",
  20. "dojo/dom",
  21. "dojo/dom-construct",
  22. "dojo/dom-form",
  23. "dojo/data/ObjectStore",
  24. "dojo/on",
  25. "dojo/topic",
  26. "dijit/layout/_LayoutWidget",
  27. "dijit/_TemplatedMixin",
  28. "dijit/_WidgetsInTemplateMixin",
  29. "dijit/registry",
  30. "dojox/form/Uploader",
  31. "dojox/form/uploader/FileList",
  32. "dojox/form/uploader/plugins/Flash",
  33. "dojox/grid/EnhancedGrid",
  34. "dojox/grid/enhanced/plugins/Pagination",
  35. "dojox/grid/enhanced/plugins/IndirectSelection",
  36. "dojo/data/ItemFileWriteStore",
  37. "hpcc/PackageMapDetailsWidget",
  38. "hpcc/PackageMapValidateWidget",
  39. "hpcc/WsPackageMaps",
  40. "hpcc/ESPPackageProcess",
  41. "hpcc/SFDetailsWidget",
  42. "dojo/text!../templates/PackageMapQueryWidget.html",
  43. "dojox/layout/TableContainer",
  44. "dijit/layout/BorderContainer",
  45. "dijit/layout/TabContainer",
  46. "dijit/layout/ContentPane",
  47. "dijit/form/Button",
  48. "dijit/form/DropDownButton",
  49. "dijit/form/Select",
  50. "dijit/Toolbar",
  51. "dijit/TooltipDialog"
  52. ], function (declare, lang, arrayUtil, dom, domConstruct, domForm, ObjectStore, on, topic,
  53. _LayoutWidget, _TemplatedMixin, _WidgetsInTemplateMixin, registry,
  54. Uploader, FileUploader, Flash, EnhancedGrid, Pagination, IndirectSelection, ItemFileWriteStore,
  55. PackageMapDetailsWidget, PackageMapValidateWidget,
  56. WsPackageMaps, ESPPackageProcess, SFDetailsWidget,
  57. template) {
  58. return declare("PackageMapQueryWidget", [_LayoutWidget, _TemplatedMixin, _WidgetsInTemplateMixin], {
  59. templateString: template,
  60. baseClass: "PackageMapQueryWidget",
  61. packagesTab: null,
  62. packagesGrid: null,
  63. tabMap: [],
  64. targets: null,
  65. processesToList: new Array(),
  66. processesToAdd: new Array(),
  67. targetSelected: '',
  68. processSelected: '',
  69. processFilters: null,
  70. addPackageMapDialog: null,
  71. validateTab: null,
  72. buildRendering: function (args) {
  73. this.inherited(arguments);
  74. },
  75. postCreate: function (args) {
  76. this.inherited(arguments);
  77. this.borderContainer = registry.byId(this.id + "BorderContainer");
  78. this.tabContainer = registry.byId(this.id + "TabContainer");
  79. this.packagesTab = registry.byId(this.id + "Packages");
  80. this.packagesGrid = registry.byId(this.id + "PackagesGrid");
  81. //this.packagesGrid.canSort = function(col){return false;};
  82. this.targetSelect = registry.byId(this.id + "TargetSelect");
  83. this.processSelect = registry.byId(this.id + "ProcessSelect");
  84. //this.processFilterSelect = registry.byId(this.id + "ProcessFilterSelect");
  85. this.addPackageMapDialog = registry.byId(this.id+"AddProcessMapDialog");
  86. this.addPackageMapTargetSelect = registry.byId(this.id + "AddProcessMapTargetSelect");
  87. this.addPackageMapProcessSelect = registry.byId(this.id + "AddProcessMapProcessSelect");
  88. var context = this;
  89. this.tabContainer.watch("selectedChildWidget", function (name, oval, nval) {
  90. if ((nval.id != context.id + "Packages") && (!nval.initalized)) {
  91. nval.init(nval.params);
  92. }
  93. context.selectedTab = nval;
  94. });
  95. },
  96. startup: function (args) {
  97. this.inherited(arguments);
  98. this.refreshActionState();
  99. this.getSelections();
  100. },
  101. resize: function (args) {
  102. this.inherited(arguments);
  103. this.borderContainer.resize();
  104. },
  105. layout: function (args) {
  106. this.inherited(arguments);
  107. },
  108. destroy: function (args) {
  109. this.inherited(arguments);
  110. },
  111. onRowDblClick: function (item) {
  112. var tab = this.showPackageMapDetails(this.id + "_" + item.Id, {
  113. target: item.Target,
  114. process: item.Process,
  115. active: item.Active,
  116. packageMap: item.Id
  117. });
  118. this.tabContainer.selectChild(tab);
  119. },
  120. _onChangeTarget: function (event) {
  121. this.updateProcessSelections(this.processSelect, this.processesToList, this.targetSelect.getValue());
  122. },
  123. _onChangeAddProcessMapTarget: function (event) {
  124. this.updateProcessSelections(this.addPackageMapProcessSelect, this.processesToAdd, this.addPackageMapTargetSelect.getValue());
  125. },
  126. _onRefresh: function (event) {
  127. this.packagesGrid.rowSelectCell.toggleAllSelection(false);
  128. this.refreshGrid();
  129. },
  130. _onOpen: function (event) {
  131. var selections = this.packagesGrid.selection.getSelected();
  132. var firstTab = null;
  133. for (var i = selections.length - 1; i >= 0; --i) {
  134. var tab = this.showPackageMapDetails(this.id + "_" + selections[i].Id, {
  135. target: selections[i].Target,
  136. process: selections[i].Process,
  137. active: selections[i].Active,
  138. packageMap: selections[i].Id
  139. });
  140. if (i == 0) {
  141. firstTab = tab;
  142. }
  143. }
  144. if (firstTab) {
  145. this.tabContainer.selectChild(firstTab, true);
  146. }
  147. },
  148. _onAdd: function (event) {
  149. this.initAddProcessMapInput();
  150. this.addPackageMapDialog.show();
  151. var context = this;
  152. var addPackageMapUploader = registry.byId(this.id+"AddProcessMapFileUploader");
  153. dojo.connect(addPackageMapUploader, "onComplete", this, function(e) {
  154. registry.byId(this.id+"AddProcessMapDialogSubmit").set('disabled', false);
  155. return context.addPackageMapCallback();
  156. });
  157. dojo.connect(addPackageMapUploader, "onBegin", this, function(e) {
  158. registry.byId(this.id+"AddProcessMapDialogSubmit").set('disabled', true);
  159. return;
  160. });
  161. var addPackageMapSubmitButton = registry.byId(this.id+"AddProcessMapDialogSubmit");
  162. dojo.connect(addPackageMapSubmitButton, "onClick", this, function(e) {
  163. return context._onAddPackageMapSubmit();
  164. });
  165. var addPackageMapCloseButton = registry.byId(this.id+"AddProcessMapDialogClose");
  166. dojo.connect(addPackageMapCloseButton, "onClick", this, function(e) {
  167. this.addPackageMapDialog.onCancel();
  168. });
  169. },
  170. initAddProcessMapInput: function () {
  171. var defaultTarget = null;
  172. for (var i = 0; i < this.targets.length; ++i) {
  173. var target = this.targets[i];
  174. if (target.Type == 'roxie') {//only roxie has package map for now.
  175. this.addPackageMapTargetSelect.options.push({label: target.Name, value: target.Name});
  176. if (defaultTarget == null)
  177. defaultTarget = target;
  178. }
  179. }
  180. if (defaultTarget != null) {
  181. this.addPackageMapTargetSelect.set("value", defaultTarget.Name);
  182. if (defaultTarget.Processes != undefined)
  183. this.addProcessSelections(this.addPackageMapProcessSelect, this.processesToAdd, defaultTarget.Processes.Item);
  184. }
  185. registry.byId(this.id+"AddProcessMapId").set('value', '');
  186. registry.byId(this.id+"AddProcessMapDaliIP").set('value', '');
  187. registry.byId(this.id+"AddProcessMapActivate").set('checked', 'checked');
  188. registry.byId(this.id+"AddProcessMapOverWrite").set('checked', '');
  189. registry.byId(this.id+"AddProcessMapFileUploader").reset();
  190. registry.byId(this.id+"AddProcessMapFileUploader").set('url', '');
  191. registry.byId(this.id+"AddProcessMapForm").set('action', '');
  192. registry.byId(this.id+"AddProcessMapDialogSubmit").set('disabled', true);
  193. },
  194. _onAddProcessMapIdKeyUp: function () {
  195. this._onCheckAddProcessMapInput();
  196. },
  197. _onCheckAddProcessMapInput: function () {
  198. var id = registry.byId(this.id+"AddProcessMapId").get('value');
  199. var files = registry.byId(this.id+"AddProcessMapFileUploader").getFileList();
  200. if (files.length > 1) {
  201. alert('Only one package file allowed');
  202. return;
  203. }
  204. var fileName = '';
  205. if (files.length > 0)
  206. fileName = files[0].name;
  207. if ((fileName != '') && (id == '')) {
  208. registry.byId(this.id+"AddProcessMapId").set('value', fileName);
  209. registry.byId(this.id+"AddProcessMapDialogSubmit").set('disabled', false);
  210. } else if ((id == '') || (files.length < 1))
  211. registry.byId(this.id+"AddProcessMapDialogSubmit").set('disabled', true);
  212. else
  213. registry.byId(this.id+"AddProcessMapDialogSubmit").set('disabled', false);
  214. },
  215. _onAddPackageMapSubmit: function () {
  216. var target = this.addPackageMapTargetSelect.getValue();
  217. var id = registry.byId(this.id+"AddProcessMapId").get('value');
  218. //var process = registry.byId(this.id+"AddProcessMapProcess").get('value');
  219. var process = this.addPackageMapProcessSelect.getValue();
  220. var daliIp = registry.byId(this.id+"AddProcessMapDaliIP").get('value');
  221. var activate = registry.byId(this.id+"AddProcessMapActivate").get('checked');
  222. var overwrite = registry.byId(this.id+"AddProcessMapOverWrite").get('checked');
  223. if ((id == '') || (target == ''))
  224. return false;
  225. if ((process == '') || (process == 'ANY'))
  226. process = '*';
  227. var action = "/WsPackageProcess/AddPackage?upload_&PackageMap="+id+"&Target="+target;
  228. if (process != '')
  229. action += "&Process="+process;
  230. if (daliIp != '')
  231. action += "&DaliIp="+daliIp;
  232. if (activate)
  233. action += "&Activate=1";
  234. else
  235. action += "&Activate=0";
  236. if (overwrite)
  237. action += "&OverWrite=1";
  238. else
  239. action += "&OverWrite=0";
  240. var theForm = registry.byId(this.id+"AddProcessMapForm");
  241. if (theForm == undefined)
  242. return false;
  243. theForm.set('action', action);
  244. return true;
  245. },
  246. _onDelete: function (event) {
  247. if (confirm('Delete selected packages?')) {
  248. var context = this;
  249. WsPackageMaps.deletePackageMap(this.packagesGrid.selection.getSelected(), {
  250. load: function (response) {
  251. context.packagesGrid.rowSelectCell.toggleAllSelection(false);
  252. context.refreshGrid(response);
  253. },
  254. error: function (errMsg, errStack) {
  255. context.showErrors(errMsg, errStack);
  256. }
  257. });
  258. }
  259. },
  260. _onActivate: function (event) {
  261. var context = this;
  262. WsPackageMaps.activatePackageMap(this.packagesGrid.selection.getSelected(), {
  263. load: function (response) {
  264. context.packagesGrid.rowSelectCell.toggleAllSelection(false);
  265. context.refreshGrid();
  266. },
  267. error: function (errMsg, errStack) {
  268. context.showErrors(errMsg, errStack);
  269. }
  270. });
  271. },
  272. _onDeactivate: function (event) {
  273. var context = this;
  274. WsPackageMaps.deactivatePackageMap(this.packagesGrid.selection.getSelected(), {
  275. load: function (response) {
  276. context.packagesGrid.rowSelectCell.toggleAllSelection(false);
  277. context.refreshGrid();
  278. },
  279. error: function (errMsg, errStack) {
  280. context.showErrors(errMsg, errStack);
  281. }
  282. });
  283. },
  284. showErrors: function (errMsg, errStack) {
  285. dojo.publish("hpcc/brToaster", {
  286. Severity: "Error",
  287. Source: errMsg,
  288. Exceptions: [{ Message: errStack }]
  289. });
  290. },
  291. getSelections: function () {
  292. this.targets = new Array();
  293. ///this.processes = new Array();
  294. this.processFilters = new Array();
  295. var context = this;
  296. WsPackageMaps.GetPackageMapSelectOptions({
  297. includeTargets: true,
  298. IncludeProcesses: true,
  299. IncludeProcessFilters: true
  300. }, {
  301. load: function (response) {
  302. context.targetSelect.options.push({label: 'ANY', value: '' });
  303. context.processSelect.options.push({label: 'ANY', value: '' });
  304. if (lang.exists("Targets.TargetData", response)) {
  305. context.targets = response.Targets.TargetData;
  306. context.initSelections();
  307. }
  308. context.targetSelect.set("value", '');
  309. context.processSelect.set("value", '');
  310. if (lang.exists("ProcessFilters.Item", response)) {
  311. context.processFilters = response.ProcessFilters.Item;
  312. // context.setSelections(context.processFilterSelect, context.processFilters, '*');
  313. }
  314. context.initPackagesGrid();
  315. },
  316. error: function (errMsg, errStack) {
  317. context.showErrors(errMsg, errStack);
  318. }
  319. });
  320. },
  321. addProcessSelections: function (processSelect, processes, processData) {
  322. for (var i = 0; i < processData.length; ++i) {
  323. var process = processData[i];
  324. if ((processes != null) && (processes.indexOf(process) != -1))
  325. continue;
  326. processes.push(process);
  327. processSelect.options.push({label: process, value: process});
  328. }
  329. },
  330. updateProcessSelections: function (processSelect, processes, targetName) {
  331. var options = processSelect.getOptions();
  332. for (var ii = 0; ii < options.length; ++ii) {
  333. var value = options[ii].value;
  334. processSelect.removeOption(value);
  335. }
  336. ///processSelect.removeOption(processSelect.getOptions());
  337. processSelect.options.push({label: 'ANY', value: '' });
  338. processes.length = 0;
  339. for (var i = 0; i < this.targets.length; ++i) {
  340. var target = this.targets[i];
  341. if ((target.Processes != undefined) && ((targetName == '') || (targetName == target.Name)))
  342. this.addProcessSelections(processSelect, processes, target.Processes.Item);
  343. }
  344. processSelect.set("value", '');
  345. },
  346. initSelections: function () {
  347. if (this.targets.length < 1)
  348. return;
  349. for (var i = 0; i < this.targets.length; ++i) {
  350. var target = this.targets[i];
  351. this.targetSelect.options.push({label: target.Name, value: target.Name});
  352. if (target.Processes != undefined)
  353. this.addProcessSelections(this.processSelect, this.processesToList, target.Processes.Item);
  354. }
  355. if (this.validateTab != null)
  356. this.validateTab.initSelections(this.targets);
  357. },
  358. init: function (params) {
  359. if (this.initalized)
  360. return;
  361. this.initalized = true;
  362. this.validateTab = new PackageMapValidateWidget({
  363. id: this.id + "_ValidatePackageMap",
  364. title: 'Validate PackageMap',
  365. params: params
  366. });
  367. //this.tabMap[this.id + "_ValidatePackageMap"] = this.validateTab;
  368. this.tabContainer.addChild(this.validateTab, 1);
  369. this.tabContainer.selectChild(this.packagesTab);
  370. },
  371. initPackagesGrid: function() {
  372. this.packagesGrid.setStructure([
  373. { name: "Package Map", field: "Id", width: "40%" },
  374. { name: "Target", field: "Target", width: "15%" },
  375. { name: "Process Filter", field: "Process", width: "15%" },
  376. {
  377. name: "Active",
  378. field: "Active",
  379. width: "10%",
  380. formatter: function (active) {
  381. if (active == true) {
  382. return "A";
  383. }
  384. return "";
  385. }
  386. },
  387. { name: "Description", field: "Description", width: "20%" }
  388. ]);
  389. var objStore = ESPPackageProcess.CreatePackageMapQueryObjectStore();
  390. this.packagesGrid.setStore(objStore);
  391. this.packagesGrid.setQuery(this.getFilter());
  392. var context = this;
  393. this.packagesGrid.on("RowDblClick", function (evt) {
  394. if (context.onRowDblClick) {
  395. var idx = evt.rowIndex;
  396. var item = this.getItem(idx);
  397. context.onRowDblClick(item);
  398. }
  399. }, true);
  400. dojo.connect(this.packagesGrid.selection, 'onSelected', function (idx) {
  401. context.refreshActionState();
  402. });
  403. dojo.connect(this.packagesGrid.selection, 'onDeselected', function (idx) {
  404. context.refreshActionState();
  405. });
  406. this.packagesGrid.startup();
  407. },
  408. getFilter: function () {
  409. this.targetSelected = this.targetSelect.getValue();
  410. this.processSelected = this.processSelect.getValue();
  411. //var processFilterSelected = this.processFilterSelect.getValue();
  412. var processFilterSelected = "*";
  413. if (this.targetSelected == " ")
  414. this.targetSelected = "";
  415. if (this.processSelected == " ")
  416. this.processSelected = "";
  417. if (processFilterSelected == "")
  418. processFilterSelected = "*";
  419. return {Target: this.targetSelected, Process: this.processSelected, ProcessFilter: processFilterSelected};
  420. },
  421. refreshGrid: function (args) {
  422. this.packagesGrid.setQuery(this.getFilter());
  423. var context = this;
  424. setTimeout(function () {
  425. context.refreshActionState()
  426. }, 200);
  427. },
  428. refreshActionState: function () {
  429. var selection = this.packagesGrid.selection.getSelected();
  430. var hasSelection = (selection.length > 0);
  431. registry.byId(this.id + "Open").set("disabled", !hasSelection);
  432. registry.byId(this.id + "Delete").set("disabled", !hasSelection);
  433. registry.byId(this.id + "Activate").set("disabled", selection.length != 1);
  434. registry.byId(this.id + "Deactivate").set("disabled", selection.length != 1);
  435. },
  436. showPackageMapDetails: function (id, params) {
  437. var obj = id.split(".");
  438. id = obj.join("");
  439. params.tabId = id;
  440. var retVal = this.tabMap[id];
  441. if (retVal)
  442. return retVal;
  443. var context = this;
  444. retVal = new PackageMapDetailsWidget({
  445. id: id,
  446. title: params.packageMap,
  447. closable: true,
  448. onClose: function () {
  449. delete context.tabMap[id];
  450. return true;
  451. },
  452. params: params
  453. });
  454. this.tabMap[id] = retVal;
  455. this.tabContainer.addChild(retVal, 2);
  456. var handle = topic.subscribe("packageMapDeleted", function(tabId){
  457. context.packageMapDeleted(tabId);
  458. handle.remove();
  459. });
  460. return retVal;
  461. },
  462. packageMapDeleted: function (tabId) {
  463. if (this.tabMap[tabId] == null)
  464. return;
  465. this.tabContainer.removeChild(this.tabMap[tabId]);
  466. this.tabMap[tabId].destroyRecursive();
  467. delete this.tabMap[tabId];
  468. this.tabContainer.selectChild(this.packagesTab);
  469. this.packagesGrid.rowSelectCell.toggleAllSelection(false);
  470. this.refreshGrid();
  471. },
  472. addPackageMapCallback: function (event) {
  473. //var processFilter = this.addPackageMapProcessSelect.getValue();
  474. this.addPackageMapDialog.onCancel();
  475. this.packagesGrid.rowSelectCell.toggleAllSelection(false);
  476. this.refreshGrid();
  477. }
  478. });
  479. });