Main.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
  1. MWF.require("MWF.widget.MaskNode", null, false);
  2. MWF.xApplication.AppMarket.Main = new Class({
  3. Extends: MWF.xApplication.Common.Main,
  4. Implements: [Options, Events],
  5. options: {
  6. "style": "default",
  7. "name": "AppMarket",
  8. "icon": "icon.png",
  9. "width": "1000",
  10. "height": "700",
  11. "title": MWF.xApplication.AppMarket.LP.title
  12. },
  13. onQueryLoad: function(){
  14. this.lp = MWF.xApplication.AppMarket.LP;
  15. this.actions = MWF.Actions.get("x_program_center");
  16. },
  17. mask: function(){
  18. if (!this.maskNode){
  19. this.maskNode = new MWF.widget.MaskNode(this.contentNode, {"style": "bam"});
  20. this.maskNode.load();
  21. }
  22. },
  23. unmask: function(){
  24. if (this.maskNode) this.maskNode.hide(function(){
  25. MWF.release(this.maskNode);
  26. this.maskNode = null;
  27. }.bind(this));
  28. },
  29. loadApplication: function(callback){
  30. this.components = [];
  31. this.loadTitle();
  32. this.contentNode = new Element("div", {"styles": this.css.contentNode}).inject(this.content);
  33. this.contentModuleArea = new Element("div", {"styles": this.css.contentModuleArea}).inject(this.contentNode);
  34. this.setContentSize();
  35. this.addEvent("resize", this.setContentSize);
  36. this.mask();
  37. this.loadCloudAppsContent();
  38. },
  39. loadTitle: function(){
  40. this.titleBar = new Element("div", {"styles": this.css.titleBar}).inject(this.content);
  41. this.titleActionNode = new Element("div", {"styles": this.css.titleActionNode,"text": this.lp.implodeLocal}).inject(this.titleBar);
  42. this.taskTitleTextNode = new Element("div", {"styles": this.css.titleTextNode,"text": this.lp.title}).inject(this.titleBar);
  43. this.titleActionNode.addEvent("click", function(){
  44. this.implodeLocal();
  45. }.bind(this));
  46. },
  47. implodeLocal: function(){
  48. if (!this.uploadFileAreaNode){
  49. this.uploadFileAreaNode = new Element("div");
  50. var html = "<input name=\"file\" type=\"file\" accept=\".xapp\"/>";
  51. this.uploadFileAreaNode.set("html", html);
  52. this.fileUploadNode = this.uploadFileAreaNode.getFirst();
  53. this.fileUploadNode.addEvent("change", this.implodeLocalFile.bind(this));
  54. }else{
  55. if (this.fileUploadNode) this.fileUploadNode.destroy();
  56. this.uploadFileAreaNode.empty();
  57. var html = "<input name=\"file\" type=\"file\" accept=\".xapp\"/>";
  58. this.uploadFileAreaNode.set("html", html);
  59. this.fileUploadNode = this.uploadFileAreaNode.getFirst();
  60. this.fileUploadNode.addEvent("change", this.implodeLocalFile.bind(this));
  61. }
  62. this.fileUploadNode.click();
  63. },
  64. implodeLocalFile: function(){
  65. var files = this.fileUploadNode.files;
  66. if (files.length){
  67. var file = files[0];
  68. var position = this.titleActionNode.getPosition(this.content);
  69. var size = this.contentNode.getSize();
  70. var width = size.x*0.9;
  71. if (width>600) width = 600;
  72. var height = size.y*0.9;
  73. var x = (size.x-width)/2;
  74. var y = (size.y-height)/2;
  75. var setupModule = null;
  76. MWF.require("MWF.xDesktop.Dialog", function(){
  77. var dlg = new MWF.xDesktop.Dialog({
  78. "title": this.lp.setupTitle,
  79. "style": "appMarket",
  80. "top": y+20,
  81. "left": x,
  82. "fromTop":position.y,
  83. "fromLeft": position.x,
  84. "width": width,
  85. "height": height,
  86. "html": "",
  87. "maskNode": this.content,
  88. "container": this.content,
  89. "buttonList": [
  90. {
  91. "text": this.lp.ok,
  92. "action": function(){
  93. if (setupModule) setupModule.setup();
  94. this.close();
  95. }
  96. },
  97. {
  98. "text": this.lp.cancel,
  99. "action": function(){this.close();}
  100. }
  101. ]
  102. });
  103. dlg.show();
  104. setupModule = new MWF.xApplication.AppMarket.Module.SetupLocal(file, dlg, this);
  105. }.bind(this));
  106. }
  107. },
  108. setContentSize: function(){
  109. var size = this.content.getSize();
  110. var titleSize = this.titleBar.getSize();
  111. var height = size.y-titleSize.y;
  112. this.contentNode.setStyles({"height": ""+height+"px", "overflow": "auto"});
  113. var max = size.x*0.98;
  114. var n = (size.x/170).toInt();
  115. var x = n*170;
  116. while (x>max){
  117. n--;
  118. x = n*170;
  119. }
  120. this.contentModuleArea.setStyle("width", ""+x+"px");
  121. },
  122. loadCloudAppsContent: function(){
  123. this.loadCloudApps(function(){
  124. if (MWF.AC.isAdministrator()) this.loadNewApp();
  125. }.bind(this));
  126. },
  127. loadCloudApps: function(callback){
  128. this.categoryList = [];
  129. this.itemList = [];
  130. this.actions.listModule({"categoryList":[]}, function(json){
  131. json.data.each(function(category){
  132. this.categoryList.push(category.category);
  133. category.moduleList.each(function(module){
  134. //for (var i=0; i<20; i++)
  135. this.itemList.push(new MWF.xApplication.AppMarket.Module(this, module));
  136. }.bind(this));
  137. }.bind(this));
  138. this.unmask();
  139. }.bind(this));
  140. }
  141. });
  142. MWF.xApplication.AppMarket.Module = new Class({
  143. initialize: function(app, data){
  144. this.app = app;
  145. this.data = data;
  146. this.lp = this.app.lp;
  147. this.css = this.app.css;
  148. this.content = this.app.contentModuleArea;
  149. this.load();
  150. },
  151. load: function(){
  152. this.node = new Element("div", {"styles": this.css.moduleNode}).inject(this.content);
  153. this.iconAreaNode = new Element("div", {"styles": this.css.moduleIconAreaNode}).inject(this.node);
  154. this.iconNode = new Element("div", {"styles": this.css.moduleIconNode}).inject(this.iconAreaNode);
  155. if (this.data.icon){
  156. this.iconNode.setStyle("background-image", "url(data:image/png;base64,"+this.data.icon+")");
  157. this.iconNode.setStyle("background-size", "cover");
  158. }
  159. this.contentNode = new Element("div", {"styles": this.css.moduleContentNode}).inject(this.node);
  160. this.nameNode = new Element("div", {"styles": this.css.moduleNameNode}).inject(this.contentNode);
  161. this.categoryNode = new Element("div", {"styles": this.css.moduleCategoryNode}).inject(this.contentNode);
  162. this.descriptionNode = new Element("div", {"styles": this.css.moduleDescriptionNode}).inject(this.contentNode);
  163. this.actionNode = new Element("div", {"styles": this.css.moduleActionNode}).inject(this.contentNode);
  164. this.nameNode.set("text", this.data.name);
  165. this.categoryNode.set("text", this.data.category);
  166. this.descriptionNode.set("text", this.data.description);
  167. this.actionNode.set("text", this.lp.download);
  168. this.loadEvent();
  169. },
  170. loadEvent: function(){
  171. this.node.addEvents({
  172. "mouseover": function(){this.setStyle("background-color", "#ffffff")},
  173. "mouseout": function(){this.setStyle("background-color", "#f5f5f5")}
  174. });
  175. this.actionNode.addEvent("click", function(e){
  176. this.downloadApp();
  177. e.stopPropagation();
  178. }.bind(this));
  179. this.node.addEvent("click", function(){
  180. this.openApp();
  181. }.bind(this));
  182. },
  183. downloadApp: function(){
  184. var position = this.actionNode.getPosition(this.app.content);
  185. var size = this.app.contentNode.getSize();
  186. var width = size.x*0.9;
  187. if (width>600) width = 600;
  188. var height = size.y*0.9;
  189. var x = (size.x-width)/2;
  190. var y = (size.y-height)/2;
  191. var setupModule = null;
  192. MWF.require("MWF.xDesktop.Dialog", function(){
  193. var dlg = new MWF.xDesktop.Dialog({
  194. "title": this.lp.setupTitle+" "+this.data.name,
  195. "style": "appMarket",
  196. "top": y+20,
  197. "left": x,
  198. "fromTop":position.y,
  199. "fromLeft": position.x,
  200. "width": width,
  201. "height": height,
  202. "html": "",
  203. "maskNode": this.app.content,
  204. "container": this.app.content,
  205. "buttonList": [
  206. {
  207. "text": this.lp.ok,
  208. "action": function(){
  209. if (setupModule) setupModule.setup();
  210. this.close();
  211. }
  212. },
  213. {
  214. "text": this.lp.cancel,
  215. "action": function(){this.close();}
  216. }
  217. ]
  218. });
  219. dlg.show();
  220. setupModule = new MWF.xApplication.AppMarket.Module.Setup(this, dlg);
  221. }.bind(this));
  222. },
  223. openApp: function(){
  224. }
  225. });
  226. MWF.xApplication.AppMarket.Module.Setup = new Class({
  227. initialize: function(module, dlg){
  228. this.module = module;
  229. this.app = this.module.app;
  230. this.data = this.module.data;
  231. this.lp = this.module.lp;
  232. this.css = this.app.css;
  233. this.dlg = dlg;
  234. this.content = this.dlg.content;
  235. this.setupData = {};
  236. this.compareData = null;
  237. this.load();
  238. },
  239. load: function(){
  240. this.node = new Element("div", {"styles": this.css.moduleSetupContentNode}).inject(this.content);
  241. this.loadTitle();
  242. this.loadContent();
  243. },
  244. loadTitle: function(){
  245. this.titleNode = new Element("div", {"styles": this.css.moduleSetupTitleNode}).inject(this.node);
  246. this.iconAreaNode = new Element("div", {"styles": this.css.moduleSetupIconAreaNode}).inject(this.titleNode);
  247. var iconNode = new Element("div", {"styles": this.css.moduleSetupIconNode}).inject(this.iconAreaNode);
  248. if (this.data.icon){
  249. iconNode.setStyle("background-image", "url(data:image/png;base64,"+this.data.icon+")");
  250. iconNode.setStyle("background-size", "cover");
  251. }
  252. var contentNode = new Element("div", {"styles": this.css.moduleSetupTitleContentNode}).inject(this.titleNode);
  253. var nameNode = new Element("div", {"styles": this.css.moduleSetupNameNode}).inject(contentNode);
  254. var categoryNode = new Element("div", {"styles": this.css.moduleSetupCategoryNode}).inject(contentNode);
  255. var descriptionNode = new Element("div", {"styles": this.css.moduleSetupDescriptionNode}).inject(contentNode);
  256. nameNode.set("text", this.data.name);
  257. categoryNode.set("text", this.data.category);
  258. descriptionNode.set("text", this.data.description);
  259. },
  260. loadContent: function(){
  261. this.contentNode = new Element("div", {"styles": this.css.moduleSetupCompareContentNode}).inject(this.node);
  262. this.createLoading(this.contentNode);
  263. this.loadCompare();
  264. },
  265. createLoading: function(node){
  266. this.dlg.button.setStyle("display", "none");
  267. this.loadingAreaNode = new Element("div", {"styles": this.css.moduleLoadingAreaNode}).inject(node);
  268. var img = new Element("img", {
  269. "styles": this.css.moduleLoadingImgNode,
  270. "src": this.app.path+this.app.options.style+"/icon/loading.gif"
  271. }).inject(this.loadingAreaNode);
  272. },
  273. clearLoading: function(){
  274. if (this.loadingAreaNode){
  275. this.loadingAreaNode.destroy();
  276. this.loadingAreaNode = null;
  277. }
  278. this.dlg.button.setStyle("display", "block");
  279. },
  280. loadCompare: function(){
  281. this.app.actions.compareModule(this.data.id, function(json){
  282. this.clearLoading();
  283. this.setupData.flag = json.data.flag;
  284. this.createListArea();
  285. this.compareData = json.data;
  286. this.loadProcessList();
  287. this.loadPortalList();
  288. this.loadCMSList();
  289. this.loadQueryList();
  290. //json.data.processPlatformList
  291. }.bind(this));
  292. },
  293. createListArea: function(){
  294. this.contentAreaNode = new Element("div").inject(this.contentNode);
  295. this.contentInforNode = new Element("div", {"styles": this.css.moduleSetupContentInforNode, "text": this.lp.downloadInfor}).inject(this.contentAreaNode);
  296. //this.processArea = new Element("div", {"styles": this.css.moduleSetupListAreaNode}).inject(this.contentNode);
  297. this.processAreaTitle = new Element("div", {"styles": this.css.moduleSetupListAreaTitleNode, "text": this.lp.process}).inject(this.contentAreaNode);
  298. this.processAreaContent = new Element("div", {"styles": this.css.moduleSetupListAreaContentNode}).inject(this.contentAreaNode);
  299. this.portalAreaTitle = new Element("div", {"styles": this.css.moduleSetupListAreaTitleNode, "text": this.lp.portal}).inject(this.contentAreaNode);
  300. this.portalAreaContent = new Element("div", {"styles": this.css.moduleSetupListAreaContentNode}).inject(this.contentAreaNode);
  301. this.cmsAreaTitle = new Element("div", {"styles": this.css.moduleSetupListAreaTitleNode, "text": this.lp.cms}).inject(this.contentAreaNode);
  302. this.cmsAreaContent = new Element("div", {"styles": this.css.moduleSetupListAreaContentNode}).inject(this.contentAreaNode);
  303. this.queryAreaTitle = new Element("div", {"styles": this.css.moduleSetupListAreaTitleNode, "text": this.lp.query}).inject(this.contentAreaNode);
  304. this.queryAreaContent = new Element("div", {"styles": this.css.moduleSetupListAreaContentNode}).inject(this.contentAreaNode);
  305. },
  306. loadProcessList: function(){
  307. this.processListNodes = [];
  308. this.compareData.processPlatformList.each(function(item){
  309. this.processListNodes.push(new MWF.xApplication.AppMarket.Module.Setup.ProcessElement(this, this.processAreaContent, item));
  310. }.bind(this));
  311. },
  312. loadPortalList: function(){
  313. this.portalListNodes = [];
  314. this.compareData.portalList.each(function(item){
  315. this.portalListNodes.push(new MWF.xApplication.AppMarket.Module.Setup.PortalElement(this, this.portalAreaContent, item));
  316. }.bind(this));
  317. },
  318. loadCMSList: function(){
  319. this.cmsListNodes = [];
  320. this.compareData.cmsList.each(function(item){
  321. this.cmsListNodes.push(new MWF.xApplication.AppMarket.Module.Setup.CmsElement(this, this.cmsAreaContent, item));
  322. }.bind(this));
  323. },
  324. loadQueryList: function(){
  325. this.queryListNodes = [];
  326. this.compareData.queryList.each(function(item){
  327. this.queryListNodes.push(new MWF.xApplication.AppMarket.Module.Setup.QueryElement(this, this.queryAreaContent, item));
  328. }.bind(this));
  329. },
  330. setup: function(){
  331. this.setupData.flag = this.compareData.flag;
  332. this.setupData.processPlatformList = [];
  333. this.setupData.portalList = [];
  334. this.setupData.queryList = [];
  335. this.setupData.cmsList = [];
  336. this.getWriteData(this.processListNodes, this.setupData.processPlatformList);
  337. this.getWriteData(this.portalListNodes, this.setupData.portalList);
  338. this.getWriteData(this.cmsListNodes, this.setupData.cmsList);
  339. this.getWriteData(this.queryListNodes, this.setupData.queryList);
  340. this.contentAreaNode.setStyle("display", "none");
  341. this.createLoading(this.contentNode);
  342. this.app.actions.importModule(this.compareData.flag, this.setupData, function(){
  343. this.app.notice(this.module.data.name+" "+this.lp.setupSuccess, "success");
  344. this.clearLoading();
  345. }.bind(this));
  346. },
  347. getWriteData: function(nodes, json){
  348. nodes.each(function(item){
  349. if (item.action){
  350. var v = item.action.options[item.action.selectedIndex].get("value");
  351. if (v!="ignore"){
  352. json.push({"id": item.data.id, "method":v});
  353. }
  354. }else{
  355. json.push({"id": item.data.id});
  356. }
  357. }.bind(this));
  358. }
  359. });
  360. MWF.xApplication.AppMarket.Module.SetupLocal = new Class({
  361. Extends: MWF.xApplication.AppMarket.Module.Setup,
  362. initialize: function(file, dlg, app){
  363. this.app = app;
  364. this.file = file;
  365. this.lp = this.app.lp;
  366. this.module = {
  367. "data": {
  368. "name": this.lp.localApp,
  369. "category": "",
  370. "description": ""
  371. }
  372. };
  373. this.data = this.module.data;
  374. this.css = this.app.css;
  375. this.dlg = dlg;
  376. this.content = this.dlg.content;
  377. this.setupData = {};
  378. this.compareData = null;
  379. this.load();
  380. },
  381. loadCompare: function(){
  382. var formData = new FormData();
  383. formData.append('file', this.file);
  384. this.app.actions.compareUpload(formData, this.file, function(json){
  385. this.clearLoading();
  386. this.setupData.flag = json.data.flag;
  387. this.createListArea();
  388. this.compareData = json.data;
  389. this.loadProcessList();
  390. this.loadPortalList();
  391. this.loadCMSList();
  392. this.loadQueryList();
  393. //json.data.processPlatformList
  394. }.bind(this));
  395. }
  396. });
  397. MWF.xApplication.AppMarket.Module.Setup.Element = new Class({
  398. initialize: function(setup, content, data){
  399. this.setup = setup;
  400. this.app = this.setup.app;
  401. this.data = data;
  402. this.lp = this.app.lp;
  403. this.css = this.app.css;
  404. this.content = content;
  405. this.load();
  406. },
  407. load: function(){
  408. this.contentNode = new Element("div", {"styles": this.css.moduleSetupListContentNode}).inject(this.content);
  409. this.iconNode = new Element("div", {"styles": this.css.moduleSetupListIconNode}).inject(this.contentNode);
  410. this.actionNode = new Element("div", {"styles": this.css.moduleSetupListActionNode}).inject(this.contentNode);
  411. this.inforNode = new Element("div", {"styles": this.css.moduleSetupListInforNode}).inject(this.contentNode);
  412. this.nameNode = new Element("div", {"styles": this.css.moduleSetupListNameNode}).inject(this.contentNode);
  413. this.nameNode.set(this.getNameContent());
  414. if (this.data.exist){
  415. this.iconNode.setStyle("background", "url("+this.app.path+this.app.options.style+"/icon/conflict.png) center center no-repeat");
  416. this.contentNode.setStyle("color", "#e86a58");
  417. this.inforNode.set("text", this.lp.conflict);
  418. this.action = new Element("select", {"styles": this.css.moduleSetupListActionSelectNode}).inject(this.actionNode);
  419. var options = "<option value='ignore' selected>"+this.lp.ignore+"</option>";
  420. options += "<option value='create'>"+this.lp.create+"</option>";
  421. options += "<option value='cover'>"+this.lp.cover+"</option>";
  422. this.action.set("html", options);
  423. // this.action.addEvent("change", function(e){
  424. //
  425. // }.bind(this));
  426. }else{
  427. this.action = new Element("select", {"styles": this.css.moduleSetupListActionSelectNode}).inject(this.actionNode);
  428. var options = "<option value='ignore'>"+this.lp.ignore+"</option>";
  429. options += "<option value='create' selected>"+this.lp.create+"</option>";
  430. this.action.set("html", options);
  431. //this.inforNode.set("text", this.lp.setup);
  432. }
  433. },
  434. getNameContent: function(){
  435. return {
  436. "title": this.lp.name+": "+this.data.name+" "+this.lp.id+": "+this.data.id,
  437. "text": this.data.name
  438. }
  439. }
  440. });
  441. MWF.xApplication.AppMarket.Module.Setup.ProcessElement = new Class({
  442. Extends: MWF.xApplication.AppMarket.Module.Setup.Element
  443. });
  444. MWF.xApplication.AppMarket.Module.Setup.PortalElement = new Class({
  445. Extends: MWF.xApplication.AppMarket.Module.Setup.Element
  446. });
  447. MWF.xApplication.AppMarket.Module.Setup.CmsElement = new Class({
  448. Extends: MWF.xApplication.AppMarket.Module.Setup.Element
  449. });
  450. MWF.xApplication.AppMarket.Module.Setup.QueryElement = new Class({
  451. Extends: MWF.xApplication.AppMarket.Module.Setup.Element
  452. });