Main.js 21 KB

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