Main.js 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035
  1. MWF.xApplication.process = MWF.xApplication.process || {};
  2. MWF.xApplication.process.ApplicationExplorer = MWF.xApplication.process.ApplicationExplorer || {};
  3. MWF.xDesktop.requireApp("process.ApplicationExplorer", "lp."+MWF.language, null, false);
  4. MWF.xApplication.process.ApplicationExplorer.Main = new Class({
  5. Extends: MWF.xApplication.Common.Main,
  6. Implements: [Options, Events],
  7. options: {
  8. "style": "default",
  9. "name": "process.ApplicationExplorer",
  10. "icon": "icon.png",
  11. "width": "1000",
  12. "height": "600",
  13. "title": MWF.xApplication.process.ApplicationExplorer.LP.title,
  14. "tooltip": {
  15. "cancel": MWF.xApplication.process.ApplicationExplorer.LP.application.action_cancel,
  16. "ok": MWF.xApplication.process.ApplicationExplorer.LP.application.action_ok,
  17. "create": MWF.xApplication.process.ApplicationExplorer.LP.application.create,
  18. "search": MWF.xApplication.process.ApplicationExplorer.LP.application.search,
  19. "searchText": MWF.xApplication.process.ApplicationExplorer.LP.application.searchText,
  20. "allCategory": MWF.xApplication.process.ApplicationExplorer.LP.application.allCategory,
  21. "unCategory": MWF.xApplication.process.ApplicationExplorer.LP.application.unCategory,
  22. "selectCategory": MWF.xApplication.process.ApplicationExplorer.LP.application.selectCategory,
  23. "nameLabel": MWF.xApplication.process.ApplicationExplorer.LP.application.name,
  24. "aliasLabel": MWF.xApplication.process.ApplicationExplorer.LP.application.alias,
  25. "descriptionLabel": MWF.xApplication.process.ApplicationExplorer.LP.application.description,
  26. "typeLabel": MWF.xApplication.process.ApplicationExplorer.LP.application.type,
  27. "iconLabel": MWF.xApplication.process.ApplicationExplorer.LP.application.icon,
  28. "createApplication_cancel_title": MWF.xApplication.process.ApplicationExplorer.LP.application.createApplication_cancel_title,
  29. "createApplication_cancel": MWF.xApplication.process.ApplicationExplorer.LP.application.createApplication_cancel,
  30. "inputApplicationName": MWF.xApplication.process.ApplicationExplorer.LP.application.inputApplicationName,
  31. "createApplicationSuccess": MWF.xApplication.process.ApplicationExplorer.LP.application.createApplicationSuccess,
  32. //"unCategory": MWF.xApplication.process.ApplicationExplorer.LP.application.unCategory,
  33. "unDescription": MWF.xApplication.process.ApplicationExplorer.LP.application.unDescription,
  34. "noProcess": MWF.xApplication.process.ApplicationExplorer.LP.application.noProcess,
  35. "noForm": MWF.xApplication.process.ApplicationExplorer.LP.application.noForm,
  36. "noApplication": MWF.xApplication.process.ApplicationExplorer.LP.application.noApplication,
  37. "noApplicationCreate": MWF.xApplication.process.ApplicationExplorer.LP.application.noApplicationCreate,
  38. "loadding": MWF.xApplication.process.ApplicationExplorer.LP.application.loadding
  39. }
  40. },
  41. onQueryLoad: function(){
  42. this.lp = MWF.xApplication.process.ApplicationExplorer.LP;
  43. this.currentContentNode = null;
  44. },
  45. loadApplication: function(callback){
  46. if (!this.restActions) this.restActions = MWF.Actions.get("x_processplatform_assemble_designer");
  47. //if (!this.restActions) this.restActions = new MWF.xApplication.process.ApplicationExplorer.Actions.RestActions();
  48. this.category = null;
  49. this.applications = [];
  50. this.deleteElements = [];
  51. this.createNode();
  52. this.loadApplicationContent();
  53. if (callback) callback();
  54. },
  55. hasCreatorRole: function(){
  56. return MWF.AC.isProcessPlatformCreator();
  57. },
  58. hasManagerRole: function(){
  59. if (MWF.AC.isAdministrator()) return true;
  60. if (MWF.AC.isProcessManager()) return true;
  61. return false;
  62. },
  63. loadApplicationContent: function(){
  64. // this.loadStartMenu();
  65. this.loadToolbar();
  66. this.loadCategoryArea();
  67. this.loadApplicationArea();
  68. },
  69. createNode: function(){
  70. this.content.setStyle("overflow", "hidden");
  71. this.node = new Element("div", {
  72. "styles": {"width": "100%", "height": "100%", "overflow": "hidden"}
  73. }).inject(this.content);
  74. },
  75. loadToolbar: function(){
  76. this.toolbarAreaNode = new Element("div", {
  77. "styles": this.css.toolbarAreaNode
  78. }).inject(this.node);
  79. this.createCreateAction();
  80. this.createSearchAction();
  81. },
  82. createCreateAction: function(){
  83. if (this.hasCreatorRole()){
  84. this.createApplicationNode = new Element("div", {
  85. "styles": this.css.createApplicationNode,
  86. "title": this.options.tooltip.create
  87. }).inject(this.toolbarAreaNode);
  88. this.createApplicationNode.addEvent("click", function(){
  89. this.createApplication();
  90. }.bind(this));
  91. }
  92. },
  93. createSearchAction: function(){
  94. this.searchApplicationNode = new Element("div", {
  95. "styles": this.css.searchApplicationNode,
  96. "text": this.options.title
  97. }).inject(this.toolbarAreaNode);
  98. //@todo
  99. this.searchApplicationNode.setStyles({
  100. "color": "#FFF",
  101. "font-size": "18px",
  102. "font-weight": "bold",
  103. "line-height": "50px",
  104. "text-align": "right",
  105. "margin-right": "20px"
  106. });
  107. return true;
  108. //this.searchApplicationButtonNode = new Element("div", {
  109. // "styles": this.css.searchApplicationButtonNode,
  110. // "title": this.options.tooltip.search
  111. //}).inject(this.searchApplicationNode);
  112. //
  113. //this.searchApplicationInputAreaNode = new Element("div", {
  114. // "styles": this.css.searchApplicationInputAreaNode
  115. //}).inject(this.searchApplicationNode);
  116. //
  117. //this.searchApplicationInputBoxNode = new Element("div", {
  118. // "styles": this.css.searchApplicationInputBoxNode
  119. //}).inject(this.searchApplicationInputAreaNode);
  120. //
  121. //this.searchApplicationInputNode = new Element("input", {
  122. // "type": "text",
  123. // "value": this.options.tooltip.searchText,
  124. // "styles": this.css.searchApplicationInputNode,
  125. // "x-webkit-speech": "1"
  126. //}).inject(this.searchApplicationInputBoxNode);
  127. //var _self = this;
  128. //this.searchApplicationInputNode.addEvents({
  129. // "focus": function(){
  130. // if (this.value==_self.options.tooltip.searchText) this.set("value", "");
  131. // },
  132. // "blur": function(){if (!this.value) this.set("value", _self.options.tooltip.searchText);},
  133. // "keydown": function(e){
  134. // if (e.code==13){
  135. // this.searchApplication();
  136. // e.preventDefault();
  137. // }
  138. // }.bind(this),
  139. // "selectstart": function(e){
  140. // e.preventDefault();
  141. // }
  142. //});
  143. //this.searchApplicationButtonNode.addEvent("click", function(){this.searchApplication();}.bind(this));
  144. },
  145. importApplication: function(e){
  146. MWF.xDesktop.requireApp("process.ApplicationExplorer", "Importer", function(){
  147. (new MWF.xApplication.process.ApplicationExplorer.Importer(this, e)).load();
  148. }.bind(this));
  149. },
  150. loadCategoryArea: function(){
  151. this.categoryAreaNode = new Element("div", {
  152. "styles": this.css.categoryAreaNode
  153. }).inject(this.node);
  154. //this.categoryActionNode = new Element("div", {
  155. // "styles": this.css.categoryActionNode,
  156. // "text": this.options.tooltip.selectCategory
  157. //}).inject(this.categoryAreaNode);
  158. if (this.hasCreatorRole()){
  159. this.importActionNode = new Element("div", {
  160. "styles": this.css.importActionNode,
  161. "text": this.lp.application.import
  162. }).inject(this.categoryAreaNode);
  163. this.importActionNode.addEvent("click", function(e){
  164. this.importApplication(e);
  165. }.bind(this));
  166. }
  167. this.categoryListAreaNode = new Element("div", {
  168. "styles": this.css.categoryListAreaNode
  169. }).inject(this.categoryAreaNode);
  170. this.createAllCategoryItemNode();
  171. this.createCategoryNodes();
  172. //this.createCategoryItemNode("公文类");
  173. //this.createCategoryItemNode("工单类");
  174. //this.createCategoryItemNode("财务类");
  175. //this.createCategoryItemNode("合同类");
  176. //this.createCategoryItemNode("人力资源类");
  177. //this.createCategoryItemNode("固定资产类");
  178. //this.createCategoryItemNode("业务类");
  179. },
  180. createCategoryNodes: function(){
  181. this.restActions.listApplicationCategory(function(json){
  182. var emptyCategory = null;
  183. json.data.each(function(category){
  184. if (category.applicationCategory || category.portalCategory){
  185. this.createCategoryItemNode(category.applicationCategory || category.portalCategory, category.count);
  186. }else{
  187. emptyCategory = category;
  188. }
  189. }.bind(this));
  190. // if (emptyCategory) this.createCategoryItemNode()
  191. }.bind(this));
  192. },
  193. createAllCategoryItemNode: function(){
  194. var itemNode = new Element("div", {
  195. "styles": this.css.allCategoryItemNode,
  196. "text": this.options.tooltip.allCategory
  197. }).inject(this.categoryListAreaNode);
  198. itemNode.setStyles(this.css.allCategoryItemNode_current);
  199. this.category = itemNode;
  200. var _self = this;
  201. itemNode.addEvents({
  202. "click": function(){_self.clickAllCategoryNode(this)}
  203. });
  204. },
  205. createCategoryItemNode: function(text, count){
  206. var categoryName = text || this.options.tooltip.allCategory;
  207. var itemNode = new Element("div.categoryItem", {
  208. "styles": this.css.categoryItemNode,
  209. "text": (count) ? categoryName+" ("+count+") " : categoryName
  210. }).inject(this.categoryListAreaNode);
  211. itemNode.store("categoryName", categoryName);
  212. var _self = this;
  213. itemNode.addEvents({
  214. "mouseover": function(){if (_self.category != this) this.setStyles(_self.css.categoryItemNode_over);},
  215. "mouseout": function(){if (_self.category != this) this.setStyles(_self.css.categoryItemNode);},
  216. "click": function(){_self.clickCategoryNode(this)}
  217. });
  218. },
  219. createLoadding: function(){
  220. this.loaddingNode = new Element("div", {
  221. "styles": this.css.noApplicationNode,
  222. "text": this.options.tooltip.loadding
  223. }).inject(this.applicationContentNode);
  224. },
  225. removeLoadding: function(){
  226. if (this.loaddingNode) this.loaddingNode.destroy();
  227. },
  228. loadApplicationArea: function(){
  229. this.applicationAreaNode = new Element("div", {
  230. "styles": this.css.applicationAreaNode
  231. }).inject(this.node);
  232. this.setApplicationAreaSize();
  233. this.addEvent("resize", this.setApplicationAreaSize);
  234. this.applicationContentNode = new Element("div", {
  235. "styles": this.css.applicationContentNode
  236. }).inject(this.applicationAreaNode);
  237. this.createLoadding();
  238. //MWF.require("MWF.widget.DragScroll", function(){
  239. // new MWF.widget.DragScroll(this.applicationAreaNode);
  240. //}.bind(this));
  241. //MWF.require("MWF.widget.ScrollBar", function(){
  242. // new MWF.widget.ScrollBar(this.applicationAreaNode);
  243. //}.bind(this));
  244. this.loadApplicationByCategory();
  245. this.setApplicationContentSize();
  246. },
  247. setApplicationAreaSize: function(){
  248. var nodeSize = this.node.getSize();
  249. var toolbarSize = this.toolbarAreaNode.getSize();
  250. var categorySize = this.categoryAreaNode.getSize();
  251. var y = nodeSize.y - toolbarSize.y - categorySize.y;
  252. this.applicationAreaNode.setStyle("height", ""+y+"px");
  253. if (this.applicationContentNode){
  254. var count = (nodeSize.x/282).toInt();
  255. var x = 282 * count;
  256. var m = (nodeSize.x-x)/2-10;
  257. this.applicationContentNode.setStyles({
  258. "width": ""+x+"px",
  259. "margin-left": ""+m+"px"
  260. });
  261. }
  262. },
  263. setApplicationContentSize: function(){
  264. var nodeSize = this.node.getSize();
  265. if (this.applicationContentNode){
  266. var count = (nodeSize.x/282).toInt();
  267. var x = 282 * count;
  268. var m = (nodeSize.x-x)/2-10;
  269. this.applicationContentNode.setStyles({
  270. "width": ""+x+"px",
  271. "margin-left": ""+m+"px"
  272. });
  273. }
  274. },
  275. clearDeleteReady: function(){
  276. this.deleteElements.each(function(app){
  277. app.delAdctionNode.setStyles(this.css.applicationItemDelActionNode);
  278. app.node.setStyles(this.css.applicationItemNode);
  279. var bgcolor = app.topNode.retrieve("bgcolor");
  280. app.topNode.setStyle("background-color", bgcolor);
  281. app.readyDelete = false;
  282. }.bind(this));
  283. this.deleteElements = [];
  284. this.checkDeleteApplication();
  285. },
  286. clickAllCategoryNode: function(){
  287. var node = this.categoryListAreaNode.getFirst("div");
  288. var items = this.categoryListAreaNode.getElements(".categoryItem");
  289. node.setStyles(this.css.allCategoryItemNode_current);
  290. this.category = node;
  291. items.setStyles(this.css.categoryItemNode);
  292. this.loadApplicationByCategory(node);
  293. this.clearDeleteReady();
  294. },
  295. clickCategoryNode: function(item){
  296. var node = this.categoryListAreaNode.getFirst("div");
  297. node.setStyles(this.css.allCategoryItemNode);
  298. var items = this.categoryListAreaNode.getElements(".categoryItem");
  299. items.setStyles(this.css.categoryItemNode);
  300. item.setStyles(this.css.categoryItemNode_current);
  301. this.category = item;
  302. this.loadApplicationByCategory(item);
  303. },
  304. loadApplicationByCategory: function(item){
  305. var name = "";
  306. if (item){name = item.retrieve("categoryName", "")};
  307. this.restActions.listApplicationSummary(name, function(json){
  308. //this.restActions.listApplication(name, function(json){
  309. this.applicationContentNode.empty();
  310. if (json.data.length){
  311. //for (var i=0; i<15; i++){
  312. json.data.each(function(appData){
  313. var application = new MWF.xApplication.process.ApplicationExplorer.Application(this, appData);
  314. application.load();
  315. this.applications.push(application);
  316. }.bind(this));
  317. //}
  318. }else {
  319. if (this.hasCreatorRole()){
  320. var noApplicationNode = new Element("div", {
  321. "styles": this.css.noApplicationNode,
  322. "text": this.options.tooltip.noApplicationCreate
  323. }).inject(this.applicationContentNode);
  324. noApplicationNode.addEvent("click", function(){
  325. this.createApplication();
  326. }.bind(this));
  327. }else{
  328. var noApplicationNode = new Element("div", {
  329. "styles": this.css.noApplicationNode,
  330. "text": this.options.tooltip.noApplication
  331. }).inject(this.applicationContentNode);
  332. }
  333. }
  334. }.bind(this));
  335. },
  336. createApplication: function(){
  337. this.createApplicationCreateMarkNode();
  338. this.createApplicationCreateAreaNode();
  339. this.createApplicationCreateNode();
  340. this.applicationCreateAreaNode.inject(this.applicationCreateMarkNode, "after");
  341. this.applicationCreateAreaNode.fade("in");
  342. $("createApplicationName").focus();
  343. this.setApplicationCreateNodeSize();
  344. this.setApplicationCreateNodeSizeFun = this.setApplicationCreateNodeSize.bind(this);
  345. this.addEvent("resize", this.setApplicationCreateNodeSizeFun);
  346. },
  347. createApplicationCreateMarkNode: function(){
  348. this.applicationCreateMarkNode = new Element("div", {
  349. "styles": this.css.applicationCreateMarkNode,
  350. "events": {
  351. "mouseover": function(e){e.stopPropagation();},
  352. "mouseout": function(e){e.stopPropagation();}
  353. }
  354. }).inject(this.node, "after");
  355. },
  356. createApplicationCreateAreaNode: function(){
  357. this.applicationCreateAreaNode = new Element("div", {
  358. "styles": this.css.applicationCreateAreaNode
  359. });
  360. },
  361. createApplicationCreateNode: function(){
  362. this.applicationCreateNode = new Element("div", {
  363. "styles": this.css.applicationCreateNode
  364. }).inject(this.applicationCreateAreaNode);
  365. this.applicationCreateNewNode = new Element("div", {
  366. "styles": this.css.applicationCreateNewNode
  367. }).inject(this.applicationCreateNode);
  368. this.applicationCreateFormNode = new Element("div", {
  369. "styles": this.css.applicationCreateFormNode
  370. }).inject(this.applicationCreateNode);
  371. var html = "<table width=\"100%\" height=\"80%\" border=\"0\" cellPadding=\"0\" cellSpacing=\"0\">" +
  372. "<tr><td style=\"height: 30px; line-height: 30px; text-align: left; min-width: 80px; width:25%\">" +
  373. this.options.tooltip.nameLabel+":</td>" +
  374. "<td style=\"; text-align: right;\"><input type=\"text\" id=\"createApplicationName\" " +
  375. "style=\"width: 99%; border:1px solid #999; background-color:#FFF; border-radius: 3px; box-shadow: 0px 0px 6px #CCC; " +
  376. "height: 26px;\"/></td></tr>" +
  377. "<tr><td style=\"height: 30px; line-height: 30px; text-align: left\">"+this.options.tooltip.aliasLabel+":</td>" +
  378. "<td style=\"; text-align: right;\"><input type=\"text\" id=\"createApplicationAlias\" " +
  379. "style=\"width: 99%; border:1px solid #999; background-color:#FFF; border-radius: 3px; box-shadow: 0px 0px 6px #CCC; " +
  380. "height: 26px;\"/></td></tr>" +
  381. "<tr><td style=\"height: 30px; line-height: 30px; text-align: left\">"+this.options.tooltip.descriptionLabel+":</td>" +
  382. "<td style=\"; text-align: right;\"><input type=\"text\" id=\"createApplicationDescription\" " +
  383. "style=\"width: 99%; border:1px solid #999; background-color:#FFF; border-radius: 3px; box-shadow: 0px 0px 6px #CCC; " +
  384. "height: 26px;\"/></td></tr>" +
  385. "<tr><td style=\"height: 30px; line-height: 30px; text-align: left\">"+this.options.tooltip.typeLabel+":</td>" +
  386. "<td style=\"; text-align: right;\"><input type=\"text\" id=\"createApplicationType\" " +
  387. "style=\"width: 99%; border:1px solid #999; background-color:#FFF; border-radius: 3px; box-shadow: 0px 0px 6px #CCC; " +
  388. "height: 26px;\"/></td></tr>" +
  389. //"<tr><td style=\"height: 30px; line-height: 30px; text-align: left\">"+this.options.tooltip.iconLabel+":</td>" +
  390. //"<td style=\"; text-align: right;\"><input type=\"text\" id=\"createApplicationType\" " +
  391. //"style=\"width: 99%; border:1px solid #999; background-color:#FFF; border-radius: 3px; box-shadow: 0px 0px 6px #CCC; " +
  392. //"height: 26px;\"/></td></tr>" +
  393. "</table>";
  394. this.applicationCreateFormNode.set("html", html);
  395. this.applicationCancelActionNode = new Element("div", {
  396. "styles": this.css.applicationCreateCancelActionNode,
  397. "text": this.options.tooltip.cancel
  398. }).inject(this.applicationCreateFormNode);
  399. this.applicationCreateOkActionNode = new Element("div", {
  400. "styles": this.css.applicationCreateOkActionNode,
  401. "text": this.options.tooltip.ok
  402. }).inject(this.applicationCreateFormNode);
  403. this.applicationCancelActionNode.addEvent("click", function(e){
  404. this.cancelCreateApplication(e);
  405. }.bind(this));
  406. this.applicationCreateOkActionNode.addEvent("click", function(e){
  407. this.okCreateApplication(e);
  408. }.bind(this));
  409. },
  410. setApplicationCreateNodeSize: function(){
  411. var size = this.node.getSize();
  412. var allSize = this.content.getSize();
  413. this.applicationCreateMarkNode.setStyles({
  414. "width": ""+allSize.x+"px",
  415. "height": ""+allSize.y+"px"
  416. });
  417. this.applicationCreateAreaNode.setStyles({
  418. "width": ""+size.x+"px",
  419. "height": ""+size.y+"px"
  420. });
  421. var hY = size.y*0.8;
  422. var mY = size.y*0.2/2;
  423. this.applicationCreateNode.setStyles({
  424. "height": ""+hY+"px",
  425. "margin-top": ""+mY+"px"
  426. });
  427. var iconSize = this.applicationCreateNewNode.getSize();
  428. var formHeight = hY*0.7;
  429. if (formHeight>250) formHeight = 250;
  430. var formMargin = hY*0.3/2-iconSize.y;
  431. this.applicationCreateFormNode.setStyles({
  432. "height": ""+formHeight+"px",
  433. "margin-top": ""+formMargin+"px"
  434. });
  435. },
  436. cancelCreateApplication: function(e){
  437. var _self = this;
  438. if ($("createApplicationName").get("value") || $("createApplicationAlias").get("value") || $("createApplicationDescription").get("value")){
  439. this.confirm("warn", e, this.options.tooltip.createApplication_cancel_title, this.options.tooltip.createApplication_cancel, 320, 100, function(){
  440. _self.applicationCreateMarkNode.destroy();
  441. _self.applicationCreateAreaNode.destroy();
  442. this.close();
  443. },function(){
  444. this.close();
  445. });
  446. }else{
  447. this.applicationCreateMarkNode.destroy();
  448. this.applicationCreateAreaNode.destroy();
  449. }
  450. },
  451. okCreateApplication: function(e){
  452. var data = {
  453. "name": $("createApplicationName").get("value"),
  454. "alias": $("createApplicationAlias").get("value"),
  455. "description": $("createApplicationDescription").get("value"),
  456. "applicationCategory": $("createApplicationType").get("value")
  457. };
  458. if (data.name){
  459. this.restActions.saveApplication(data, function(json){
  460. this.applicationCreateMarkNode.destroy();
  461. this.applicationCreateAreaNode.destroy();
  462. this.restActions.getApplication(json.data.id, function(json){
  463. json.data.processList = [];
  464. json.data.formList = [];
  465. var application = new MWF.xApplication.process.ApplicationExplorer.Application(this, json.data, {"where": "top"});
  466. application.load();
  467. this.applications.push(application);
  468. }.bind(this));
  469. this.notice(this.options.tooltip.createApplicationSuccess, "success");
  470. // this.app.processConfig();
  471. }.bind(this));
  472. }else{
  473. $("createApplicationName").setStyle("border-color", "red");
  474. $("createApplicationName").focus();
  475. this.notice(this.options.tooltip.inputApplicationName, "error");
  476. }
  477. },
  478. checkDeleteApplication: function(){
  479. if (this.deleteElements.length){
  480. if (!this.deleteElementsNode){
  481. this.deleteElementsNode = new Element("div", {
  482. "styles": this.css.deleteElementsNode,
  483. "text": this.lp.application.deleteElements
  484. }).inject(this.node);
  485. this.deleteElementsNode.position({
  486. relativeTo: this.applicationContentNode,
  487. position: "centerTop",
  488. edge: "centerbottom",
  489. "offset": {"y": this.applicationAreaNode.getScroll().y}
  490. });
  491. this.deleteElementsNode.addEvent("click", function(e){
  492. this.deleteSelectedElements(e);
  493. }.bind(this));
  494. }
  495. }else{
  496. if (this.deleteElementsNode){
  497. this.deleteElementsNode.destroy();
  498. this.deleteElementsNode = null;
  499. delete this.deleteElementsNode;
  500. }
  501. }
  502. },
  503. deleteSelectedElements: function(e){
  504. var _self = this;
  505. var applicationList = [];
  506. this.deleteElements.each(function(app){
  507. applicationList.push(app.data.name);
  508. });
  509. var confirmStr = this.lp.application.deleteElementsConfirm+" ("+applicationList.join("、")+") ";
  510. var check = "<br/><br/><input type=\"checkbox\" id=\"deleteApplicationAllCheckbox\" value=\"yes\">"+this.lp.application.deleteApplicationAllConfirm;
  511. confirmStr += check;
  512. this.confirm("infor", e, this.lp.application.deleteElementsTitle, {"html":confirmStr}, 530, 250, function(){
  513. confirmStr = _self.lp.application.deleteElementsConfirmAgain+"<br/><br/><font style='color:red; font-size:14px; font-weight: bold'>"+applicationList.join("、")+"</font>";
  514. var checkbox = this.content.getElement("#deleteApplicationAllCheckbox");
  515. var onlyRemoveNotCompleted = true;
  516. if (checkbox.checked){
  517. onlyRemoveNotCompleted = false;
  518. confirmStr = _self.lp.application.deleteElementsAllConfirmAgain+"<br/><br/><font style='color:red; font-size:14px; font-weight: bold'>"+applicationList.join("、")+"</font>";
  519. }
  520. this.close();
  521. _self.confirm("infor", e, _self.lp.application.deleteElementsTitle, {"html":confirmStr}, 500, 200, function(){
  522. var deleted = [];
  523. var doCount = 0;
  524. var readyCount = _self.deleteElements.length;
  525. var errorText = "";
  526. var complete = function(){
  527. if (doCount == readyCount){
  528. if (errorText){
  529. _self.app.notice(errorText, "error");
  530. }
  531. }
  532. };
  533. _self.deleteElements.each(function(application){
  534. application["delete"](onlyRemoveNotCompleted, function(){
  535. deleted.push(application);
  536. doCount++;
  537. if (_self.deleteElements.length==doCount){
  538. _self.deleteElements = _self.deleteElements.filter(function(item, index){
  539. return !deleted.contains(item);
  540. });
  541. _self.checkDeleteApplication();
  542. }
  543. complete();
  544. }, function(error){
  545. errorText = (errorText) ? errorText+"<br/><br/>"+error : error;
  546. doCount++;
  547. if (_self.deleteElements.length==doCount){
  548. _self.deleteElements = _self.deleteElements.filter(function(item, index){
  549. return !deleted.contains(item);
  550. });
  551. _self.checkDeleteApplication();
  552. }
  553. complete();
  554. });
  555. });
  556. this.close();
  557. }, function(){
  558. this.close();
  559. });
  560. this.close();
  561. }, function(){
  562. this.close();
  563. });
  564. }
  565. });
  566. MWF.xApplication.process.ApplicationExplorer.Application = new Class({
  567. Implements: [Options, Events],
  568. options: {
  569. "where": "bottom",
  570. "bgColor": ["#30afdc", "#e9573e", "#8dc153", "#9d4a9c", "#ab8465", "#959801", "#434343", "#ffb400", "#9e7698", "#00a489"]
  571. },
  572. initialize: function(app, data, options){
  573. this.setOptions(options);
  574. this.app = app;
  575. this.container = this.app.applicationContentNode;
  576. this.css = this.app.css;
  577. this.data = data;
  578. },
  579. load: function(){
  580. this.node = new Element("div", {
  581. "styles": this.css.applicationItemNode
  582. });
  583. this.loadTopNode();
  584. this.loadIconNode();
  585. this.loadDeleteAction();
  586. this.loadExportAction();
  587. this.loadTitleNode();
  588. this.loadNewNode();
  589. this.loadInforNode();
  590. this.loadProcessNode();
  591. this.loadFormNode();
  592. // this.loadDateNode();
  593. this.node.inject(this.container, this.options.where);
  594. },
  595. canManage: function(){
  596. if (this.app.hasCreatorRole()){
  597. if ((this.data.creatorPerson==layout.desktop.session.user.name) || MWF.AC.isAdministrator() || this.app.hasManagerRole()){
  598. return true;
  599. }
  600. }else{
  601. if (this.data.controllerList.indexOf(layout.desktop.session.user.distinguishedName)!==-1) return true;
  602. }
  603. return false;
  604. },
  605. loadTopNode: function(){
  606. this.topNode = new Element("div", {
  607. "styles": this.css.applicationItemTopNode
  608. }).inject(this.node);
  609. this.topNode.setStyle("background-color", this.options.bgColor[(Math.random()*10).toInt()]);
  610. this.topNode.addEvent("click", function(e){
  611. this.openApplication(e);
  612. }.bind(this));
  613. },
  614. loadDeleteAction: function(){
  615. if (this.canManage()){
  616. //if ((this.data.creatorPerson==layout.desktop.session.user.name) || (this.data.controllerList.indexOf(layout.desktop.session.user.distinguishedName)!==-1) || MWF.AC.isAdministrator()){
  617. this.delAdctionNode = new Element("div", {
  618. "styles": this.css.applicationItemDelActionNode
  619. }).inject(this.topNode);
  620. this.topNode.addEvents({
  621. "mouseover": function(){if (!this.readyDelete) this.delAdctionNode.fade("in"); }.bind(this),
  622. "mouseout": function(){if (!this.readyDelete) this.delAdctionNode.fade("out"); }.bind(this)
  623. });
  624. this.delAdctionNode.addEvent("click", function(e){
  625. this.checkDeleteApplication(e);
  626. e.stopPropagation();
  627. }.bind(this));
  628. //}
  629. }
  630. },
  631. loadExportAction: function(){
  632. if (this.canManage()) {
  633. //if ((this.data.creatorPerson == layout.desktop.session.user.name) || MWF.AC.isAdministrator() || MWF.AC.isProcessManager()) {
  634. this.exportAdctionNode = new Element("div", {
  635. "styles": this.css.applicationItemExportActionNode,
  636. "title": this.app.lp.application.export
  637. }).inject(this.topNode);
  638. this.topNode.addEvents({
  639. "mouseover": function () {
  640. if (!this.readyDelete) this.exportAdctionNode.fade("in");
  641. }.bind(this),
  642. "mouseout": function () {
  643. if (!this.readyDelete) this.exportAdctionNode.fade("out");
  644. }.bind(this)
  645. });
  646. this.exportAdctionNode.addEvent("click", function (e) {
  647. this.exportApplication(e);
  648. e.stopPropagation();
  649. }.bind(this));
  650. //}
  651. }
  652. },
  653. exportApplication: function(){
  654. //var applicationjson = {
  655. // "application": {},
  656. // "processList": [],
  657. // "formList": [],
  658. // "dictionaryList": [],
  659. // "scriptList": []
  660. //};
  661. //this.app.restActions.getApplication(this.data.name, function(json){
  662. //
  663. //}
  664. MWF.xDesktop.requireApp("process.ApplicationExplorer", "Exporter", function(){
  665. (new MWF.xApplication.process.ApplicationExplorer.Exporter(this.app, this.data)).load();
  666. }.bind(this));
  667. },
  668. checkDeleteApplication: function(e){
  669. if (!this.readyDelete){
  670. this.delAdctionNode.setStyles(this.css.applicationItemDelActionNode_select);
  671. this.node.setStyles(this.css.applicationItemNode_select);
  672. var bgcolor = this.topNode.getStyle("background-color");
  673. this.topNode.store("bgcolor", bgcolor);
  674. this.topNode.setStyles(this.css.applicationItemTopNode_select);
  675. this.readyDelete = true;
  676. this.app.deleteElements.push(this);
  677. }else{
  678. this.delAdctionNode.setStyles(this.css.applicationItemDelActionNode);
  679. this.node.setStyles(this.css.applicationItemNode);
  680. var bgcolor = this.topNode.retrieve("bgcolor");
  681. this.topNode.setStyle("background-color", bgcolor);
  682. this.readyDelete = false;
  683. this.app.deleteElements.erase(this);
  684. }
  685. this.app.checkDeleteApplication();
  686. },
  687. "delete": function(onlyRemoveNotCompleted, success, failure){
  688. this._deleteElement(this.data.id, onlyRemoveNotCompleted, function(){
  689. this.destroy();
  690. if (success) success();
  691. }.bind(this), function(xhr, text, error){
  692. var errorText = error;
  693. if (xhr) errorText = xhr.responseText;
  694. // this.explorer.app.notice(errorText, "error", this.explorer.propertyContentNode, {x: "left", y:"top"});
  695. if (failure) failure(errorText);
  696. }.bind(this));
  697. },
  698. _deleteElement: function(id, onlyRemoveNotCompleted, success, failure){
  699. this.app.restActions.deleteApplication(id, onlyRemoveNotCompleted, success, failure);
  700. },
  701. destroy: function(){
  702. this.node.destroy();
  703. MWF.release(this);
  704. delete this;
  705. },
  706. loadNewNode: function(){
  707. if (this.data.updateTime){
  708. var createDate = Date.parse(this.data.createTime);
  709. var currentDate = new Date();
  710. if (createDate.diff(currentDate, "hour")<12) {
  711. this.newNode = new Element("div", {
  712. "styles": this.css.applicationItemNewNode
  713. }).inject(this.topNode);
  714. }
  715. }
  716. },
  717. loadIconNode: function(){
  718. this.iconNode = new Element("div", {
  719. "styles": this.css.applicationItemIconNode
  720. }).inject(this.topNode);
  721. if (this.data.icon){
  722. this.iconNode.setStyle("background-image", "url(data:image/png;base64,"+this.data.icon+")");
  723. }else{
  724. this.iconNode.setStyle("background-image", "url("+"/x_component_process_ApplicationExplorer/$Main/default/icon/application.png)")
  725. }
  726. this.iconNode.makeLnk({
  727. "par": this._getLnkPar()
  728. });
  729. },
  730. _getLnkPar: function(){
  731. var lnkIcon = "/x_component_process_ApplicationExplorer/$Main/default/lnk.png";
  732. if (this.data.icon) lnkIcon = "data:image/png;base64,"+this.data.icon;
  733. var appId = "process.ProcessManager"+this.data.id;
  734. return {
  735. "icon": lnkIcon,
  736. "title": this.data.name,
  737. "par": "process.ProcessManager#{\"application\": \""+this.data.id+"\", \"appId\": \""+appId+"\"}"
  738. };
  739. },
  740. loadTitleNode: function(){
  741. this.titleNode = new Element("div", {
  742. "styles": this.css.applicationItemTitileNode
  743. }).inject(this.topNode);
  744. this.nameNode = new Element("div", {
  745. "styles": this.css.applicationItemNameNode,
  746. "text": this.data.name,
  747. "title": this.data.name+"--"+((this.data.applicationCategory || this.data.portalCategory) || this.app.options.tooltip.unCategory)
  748. }).inject(this.titleNode);
  749. this.typeNode = new Element("div", {
  750. "styles": this.css.applicationItemTypeNode,
  751. "text": "--"+((this.data.applicationCategory || this.data.portalCategory) || this.app.options.tooltip.unCategory)
  752. }).inject(this.titleNode);
  753. },
  754. loadInforNode: function(){
  755. this.inforNode = new Element("div", {
  756. "styles": this.css.applicationItemInforNode
  757. }).inject(this.node);
  758. this.descriptionNode = new Element("div", {
  759. "styles": this.css.applicationItemDescriptionNode,
  760. "text": this.data.description || this.app.options.tooltip.unDescription
  761. }).inject(this.inforNode);
  762. },
  763. loadProcessNode: function(){
  764. this.processNode = new Element("div", {
  765. "styles": this.css.applicationItemElNode
  766. }).inject(this.inforNode);
  767. this.processTitleNode = new Element("div", {
  768. "styles": this.css.applicationItemElTitleNode,
  769. "text": "流程"
  770. }).inject(this.inforNode);
  771. this.processListNode = new Element("div", {
  772. "styles": this.css.applicationItemElListNode
  773. }).inject(this.inforNode);
  774. this.loadProcessList();
  775. },
  776. // loadProcessList: function(){
  777. // var _self = this;
  778. // this.app.restActions.listProcess(this.data.id, function(json){
  779. // var processList = json.data;
  780. //
  781. // if (processList.length) {
  782. // for (var i=0; i<(4).min(processList.length); i++){
  783. // var process = processList[i];
  784. // var processNode = new Element("div", {
  785. // "styles": this.css.listItemNode,
  786. // "text": process.name
  787. // }).inject(this.processListNode);
  788. // processNode.store("processId", process.id);
  789. // var _self = this;
  790. // processNode.addEvents({
  791. // "click": function(e){debugger;_self.openProcess(this, e)},
  792. // "mouseover": function(){this.setStyle("color", "#3c5eed");},
  793. // "mouseout": function(){this.setStyle("color", "#666");}
  794. // });
  795. // }
  796. // }else{
  797. // var node = new Element("div", {
  798. // "text": this.app.options.tooltip.noProcess,
  799. // "styles": {"cursor": "pointer", "line-height": "30px"}
  800. // }).inject(this.processListNode);
  801. // node.addEvent("click", function(e){
  802. // this.createNewProcess(e);
  803. // }.bind(this));
  804. // }
  805. // }.bind(this));
  806. // // }.bind(this));
  807. // },
  808. loadProcessList: function(){
  809. // this.app.restActions.listProcess(this.data.id, function(json){
  810. if (this.data.processList.length) {
  811. // json.data.each(function(process){
  812. for (var i=0; i<(4).min(this.data.processList.length); i++){
  813. var process = this.data.processList[i];
  814. var processNode = new Element("div", {
  815. "styles": this.css.listItemNode,
  816. "text": process.name
  817. }).inject(this.processListNode);
  818. processNode.store("processId", process.id);
  819. var _self = this;
  820. processNode.addEvents({
  821. "click": function(e){_self.openProcess(this, e)},
  822. "mouseover": function(){this.setStyle("color", "#3c5eed");},
  823. "mouseout": function(){this.setStyle("color", "#666");}
  824. });
  825. }
  826. //}.bind(this));
  827. }else{
  828. var node = new Element("div", {
  829. "text": this.app.options.tooltip.noProcess,
  830. "styles": {"cursor": "pointer", "line-height": "30px"}
  831. }).inject(this.processListNode);
  832. node.addEvent("click", function(e){
  833. this.createNewProcess(e);
  834. }.bind(this));
  835. }
  836. // }.bind(this));
  837. },
  838. createNewProcess: function(e){
  839. this.openApplication(e, 1);
  840. },
  841. openProcess: function(node, e){
  842. var id = node.retrieve("processId");
  843. if (id){
  844. var _self = this;
  845. var options = {
  846. "appId": "process.ProcessDesigner"+id,
  847. "onQueryLoad": function(){
  848. this.actions = _self.app.actions;
  849. //this.category = _self;
  850. this.options.id = id;
  851. this.application = _self.data;
  852. }
  853. };
  854. this.app.desktop.openApplication(e, "process.ProcessDesigner", options);
  855. }
  856. },
  857. loadFormNode: function(){
  858. this.formNode = new Element("div", {
  859. "styles": this.css.applicationItemElNode
  860. }).inject(this.inforNode);
  861. this.formTitleNode = new Element("div", {
  862. "styles": this.css.applicationItemElTitleNode,
  863. "text": "表单"
  864. }).inject(this.inforNode);
  865. this.formListNode = new Element("div", {
  866. "styles": this.css.applicationItemElListNode
  867. }).inject(this.inforNode);
  868. this.loadFormList();
  869. },
  870. // loadFormList: function(){
  871. // var _self = this;
  872. // this.app.restActions.listForm(this.data.id, function(json){
  873. // var formList = json.data;
  874. // if (formList.length){
  875. // for (var i=0; i<(4).min(formList.length); i++){
  876. // var form = formList[i];
  877. // var formNode = new Element("div", {
  878. // "styles": this.css.listItemNode,
  879. // "text": form.name
  880. // }).inject(this.formListNode);
  881. // formNode.store("formId", form.id);
  882. // var _self = this;
  883. // formNode.addEvents({
  884. // "click": function(e){_self.openForm(this, e)},
  885. // "mouseover": function(){this.setStyle("color", "#3c5eed");},
  886. // "mouseout": function(){this.setStyle("color", "#666");}
  887. // });
  888. // }
  889. // }else{
  890. // var node = new Element("div", {
  891. // "text": this.app.options.tooltip.noForm,
  892. // "styles": {"cursor": "pointer"}
  893. // }).inject(this.formListNode);
  894. // node.addEvent("click", function(e){
  895. // this.createNewForm(e);
  896. // }.bind(this));
  897. // }
  898. //
  899. // }.bind(this));
  900. // },
  901. loadFormList: function(){
  902. if (this.data.formList.length){
  903. for (var i=0; i<(4).min(this.data.formList.length); i++){
  904. var form = this.data.formList[i];
  905. var formNode = new Element("div", {
  906. "styles": this.css.listItemNode,
  907. "text": form.name
  908. }).inject(this.formListNode);
  909. formNode.store("formId", form.id);
  910. var _self = this;
  911. formNode.addEvents({
  912. "click": function(e){_self.openForm(this, e)},
  913. "mouseover": function(){this.setStyle("color", "#3c5eed");},
  914. "mouseout": function(){this.setStyle("color", "#666");}
  915. });
  916. }
  917. }else{
  918. var node = new Element("div", {
  919. "text": this.app.options.tooltip.noForm,
  920. "styles": {"cursor": "pointer"}
  921. }).inject(this.formListNode);
  922. node.addEvent("click", function(e){
  923. this.createNewForm(e);
  924. }.bind(this));
  925. }
  926. },
  927. createNewForm: function(e){
  928. this.openApplication(e, 0);
  929. },
  930. openForm: function(node, e){
  931. var id = node.retrieve("formId");
  932. if (id){
  933. layout.desktop.getFormDesignerStyle(function(){
  934. var _self = this;
  935. var options = {
  936. "style": layout.desktop.formDesignerStyle,
  937. "appId": "process.FormDesigner"+id,
  938. "onQueryLoad": function(){
  939. this.actions = _self.app.actions;
  940. //this.category = _self;
  941. this.options.id = id;
  942. this.application = _self.data;
  943. }
  944. };
  945. this.app.desktop.openApplication(e, "process.FormDesigner", options);
  946. }.bind(this));
  947. }
  948. },
  949. openApplication: function(e, navi){
  950. var appId = "process.ProcessManager"+this.data.id;
  951. if (this.app.desktop.apps[appId]){
  952. this.app.desktop.apps[appId].setCurrent();
  953. }else {
  954. this.app.desktop.openApplication(e, "process.ProcessManager", {
  955. "application": this.data,
  956. "appId": appId,
  957. "onQueryLoad": function(){
  958. this.status = {"navi": navi || null};
  959. }
  960. });
  961. }
  962. },
  963. loadDateNode: function(){
  964. this.dateNode = new Element("div", {
  965. "styles": this.css.applicationItemDateNode,
  966. "text": this.data.updateTime
  967. }).inject(this.inforNode);
  968. }
  969. });