Main.js 20 KB

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