Script.js 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974
  1. MWF.xApplication = MWF.xApplication || {};
  2. MWF.xApplication.portal = MWF.xApplication.portal || {};
  3. MWF.xApplication.portal.PageDesigner = MWF.xApplication.portal.PageDesigner || {};
  4. MWF.xDesktop.requireApp("portal.PageDesigner", "lp."+MWF.language, null, false);
  5. MWF.require("MWF.widget.JavascriptEditor", null, false);
  6. MWF.xApplication.portal.PageDesigner.Script = new Class({
  7. Implements: [Options, Events],
  8. options: {
  9. "style": "default"
  10. },
  11. initialize: function(designer, content, data, options){
  12. this.setOptions(options);
  13. this.path = "../x_component_portal_PageDesigner/$Script/";
  14. this.stylePath = "../x_component_portal_PageDesigner/$Script/"+this.options.style+"/style.css";
  15. this.viewPath = "../x_component_portal_PageDesigner/$Script/"+this.options.style+"/view.html";
  16. this.designer = designer;
  17. this.content = content;
  18. this.data = data;
  19. this.items = [];
  20. //this.categorys = {};
  21. this.moduleCategorys = {};
  22. this.pathCategorys = {};
  23. this.loadView();
  24. },
  25. loadView: function(){
  26. this.content.show();
  27. this.content.set("load", {"onSuccess": function(){
  28. this.node = this.content.getElement(".node");
  29. this.listNode = this.content.getElement(".listNode");
  30. this.listActionNode = this.content.getElement(".listActionNode");
  31. this.actionButtons = this.content.getElements(".listActionButton");
  32. this.listContentNode = this.content.getElement(".listContentNode");
  33. this.separatorNode = this.content.getElement(".separatorNode");
  34. this.scriptNode = this.content.getElement(".scriptNode");
  35. this.scriptAreaNode = this.content.getElement(".scriptAreaNode");
  36. this.listAreaNode = this.content.getElement(".listAreaNode");
  37. this.scriptTabNode = this.content.getElement(".scriptTabNode");
  38. o2.loadCss(this.stylePath, this.content, function(){
  39. this.load();
  40. }.bind(this));
  41. }.bind(this)}).load(this.viewPath);
  42. },
  43. load: function(){
  44. this.actionButtons[0].set("text", this.designer.lp.byModule);
  45. this.actionButtons[1].set("text", this.designer.lp.byPath);
  46. this.categoryType = "module";
  47. MWF.require("MWF.widget.Tab", null, false);
  48. this.scriptTab = new MWF.widget.Tab(this.scriptTabNode, {"style": "script"});
  49. this.scriptTab.load();
  50. this.setEvent();
  51. //form, page
  52. if (!this.data.jsheader) this.data.jsheader = {"code": "", "html": ""};
  53. this.addScriptItem(this.data.jsheader, "code", this.data, "jsheader");
  54. this.addScriptItem(this.data.validationOpinion, "code", this.data, "validationOpinion");
  55. this.addScriptItem(this.data.validationRoute, "code", this.data, "validationRoute");
  56. this.addScriptItem(this.data.validationFormCustom, "code", this.data, "validationFormCustom");
  57. Object.each(this.data.events, function(event, key){
  58. this.addScriptItem(event, "code", this.data, this.designer.lp.events+"."+key);
  59. }.bind(this));
  60. Object.each(this.data.moduleList, function(v){
  61. this.createModuleScript(v);
  62. }.bind(this));
  63. },
  64. createModuleScript: function(v){
  65. switch (v.type){
  66. case "Button":
  67. this.loadButtonScript(v); break;
  68. case "Calendar":
  69. this.loadCalendarScript(v); break;
  70. case "Checkbox":
  71. this.loadCheckboxScript(v); break;
  72. case "Div":
  73. this.loadDivScript(v); break;
  74. // case "Html":
  75. // this.loadHtmlScript(v); break;
  76. case "Iframe":
  77. this.loadIframeScript(v); break;
  78. case "Image":
  79. this.loadImageScript(v); break;
  80. case "Label":
  81. this.loadLabelScript(v); break;
  82. case "Personfield":
  83. this.loadPersonfieldScript(v); break;
  84. case "Org":
  85. this.loadOrgScript(v); break;
  86. case "Radio":
  87. this.loadRadioScript(v); break;
  88. case "Select":
  89. this.loadSelectScript(v); break;
  90. case "Source":
  91. this.loadSourceScript(v); break;
  92. case "SourceText":
  93. this.loadSourceTextScript(v); break;
  94. case "Stat":
  95. this.loadStatScript(v); break;
  96. case "SubSource":
  97. this.loadSubSourceScript(v); break;
  98. case "Tab$Content":
  99. this.loadTab$ContentScript(v); break;
  100. case "Tab$Page":
  101. this.loadTab$PageScript(v); break;
  102. case "Tab":
  103. this.loadTabScript(v); break;
  104. case "Table$Td":
  105. this.loadTable$TdScript(v); break;
  106. case "Table":
  107. this.loadTableScript(v); break;
  108. case "Textarea":
  109. this.loadTextareaScript(v); break;
  110. case "Textfield":
  111. this.loadTextfieldScript(v); break;
  112. case "Tree":
  113. this.loadTreeScript(v); break;
  114. case "View":
  115. this.loadViewScript(v); break;
  116. case "Actionbar":
  117. this.loadActionbarScript(v); break;
  118. case "Address":
  119. this.loadAddressScript(v); break;
  120. case "Attachment":
  121. this.loadAttachmentScript(v); break;
  122. case "Combox":
  123. this.loadComboxScript(v); break;
  124. case "Datagrid":
  125. this.loadDatagridScript(v); break;
  126. case "Datagrid$Data":
  127. this.loadDatagrid$DataScript(v); break;
  128. case "Datagrid$Title":
  129. this.loadDatagrid$TitleScript(v); break;
  130. case "Htmleditor":
  131. this.loadHtmleditorScript(v); break;
  132. case "ImageClipper":
  133. this.loadImageClipperScript(v); break;
  134. case "Log":
  135. this.loadLogScript(v); break;
  136. case "Monitor":
  137. this.loadMonitorScript(v); break;
  138. case "Number":
  139. this.loadNumberScript(v); break;
  140. case "Office":
  141. this.loadOfficeScript(v); break;
  142. case "Opinion":
  143. this.loadOpinionScript(v); break;
  144. case "Orgfield":
  145. this.loadOrgfieldScript(v); break;
  146. case "Sidebar":
  147. this.loadSidebarScript(v); break;
  148. case "Subform":
  149. this.loadSubformScript(v); break;
  150. case "ViewSelector":
  151. this.loadViewSelectorScript(v); break;
  152. case "Statement":
  153. this.loadStatementScript(v); break;
  154. case "StatementSelector":
  155. this.loadStatementSelectorScript(v); break;
  156. }
  157. this.bindDataId(v);
  158. },
  159. createCategory: function(data, path, type){
  160. var category;
  161. var cType = type || this.categoryType;
  162. if (cType==="module"){
  163. if (data.type==="Form" || data.type==="Page"){
  164. category = new MWF.xApplication.portal.PageDesigner.Script.Category(this, data.type, 0, data, "module");
  165. this.moduleCategorys[data.type] = category;
  166. }else{
  167. category = new MWF.xApplication.portal.PageDesigner.Script.Category(this, "("+data.type+")-"+data.id, 0, data, "module");
  168. this.moduleCategorys[data.id] = category;
  169. }
  170. }else{
  171. category = new MWF.xApplication.portal.PageDesigner.Script.Category(this, path, 0, data, "path");
  172. this.pathCategorys[path] = category;
  173. }
  174. return category;
  175. },
  176. bindDataId: function(data){
  177. var id = data.id;
  178. Object.defineProperty(data, "id", {
  179. configurable : true,
  180. enumerable : true,
  181. "get": function(){return id;},
  182. "set": function(v){
  183. // this.items.each(function(item){
  184. // if (item.module.id===data.id) item.resetText(v);
  185. // });
  186. Object.each(this.moduleCategorys, function(category){
  187. if (category.module.id === data.id){
  188. category.resetName("("+data.type+")-"+v, v);
  189. }
  190. });
  191. id = v;
  192. //category.resetName(category.name.replace(/\-.*/, "-"+v));
  193. }.bind(this)
  194. });
  195. },
  196. loadButtonScript: function(data){
  197. this.loadEventsScript(data);
  198. },
  199. loadCalendarScript: function(data){
  200. this.addScriptItem(data.defaultValue, "code", data, "defaultValue");
  201. this.addScriptItem(data.validation, "code", data, "validation");
  202. this.addScriptItem(data.sectionByScript, "code", data, "sectionByScript");
  203. this.loadEventsScript(data);
  204. },
  205. loadCheckboxScript: function(data){
  206. this.addScriptItem(data.defaultValue, "code", data, "defaultValue");
  207. this.addScriptItem(data.itemScript, "code", data, "itemScript");
  208. this.addScriptItem(data.validation, "code", data, "validation");
  209. this.addScriptItem(data.sectionByScript, "code", data, "sectionByScript");
  210. this.loadEventsScript(data);
  211. },
  212. loadDivScript: function(data){
  213. this.loadEventsScript(data);
  214. },
  215. loadIframeScript: function(data){
  216. this.addScriptItem(data.script, "code", data, "iframeScript");
  217. this.loadEventsScript(data);
  218. },
  219. loadImageScript: function(data){
  220. this.loadEventsScript(data);
  221. },
  222. loadLabelScript: function(data){
  223. this.addScriptItem(data.script, "code", data, "labelScript");
  224. this.loadEventsScript(data);
  225. },
  226. loadPersonfieldScript: function(data){
  227. this.addScriptItem(data.defaultValue, "code", data, "defaultValue");
  228. this.addScriptItem(data.validation, "code", data, "validation");
  229. this.addScriptItem(data.rangeKey, "code", data, "rangeKey");
  230. this.addScriptItem(data.rangeDutyKey, "code", data, "rangeDutyKey");
  231. this.addScriptItem(data.exclude, "code", data, "exclude");
  232. this.addScriptItem(data.rangeKey, "code", data, "sectionByScript");
  233. this.loadEventsScript(data);
  234. },
  235. loadOrgScript: function(data){
  236. this.addScriptItem(data.defaultValue, "code", data, "defaultValue");
  237. this.addScriptItem(data.validation, "code", data, "validation");
  238. this.addScriptItem(data.identityRangeKey, "code", data, "identityRangeKey");
  239. this.addScriptItem(data.unitRangeKey, "code", data, "unitRangeKey");
  240. this.addScriptItem(data.rangeDutyKey, "code", data, "rangeDutyKey");
  241. this.addScriptItem(data.exclude, "code", data, "exclude");
  242. this.addScriptItem(data.rangeKey, "code", data, "sectionByScript");
  243. this.loadEventsScript(data);
  244. },
  245. loadRadioScript: function(data){
  246. this.addScriptItem(data.defaultValue, "code", data, "defaultValue");
  247. this.addScriptItem(data.itemScript, "code", data, "itemScript");
  248. this.addScriptItem(data.validation, "code", data, "validation");
  249. this.addScriptItem(data.sectionByScript, "code", data, "sectionByScript");
  250. this.loadEventsScript(data);
  251. },
  252. loadSelectScript: function(data){
  253. this.addScriptItem(data.defaultValue, "code", data, "defaultValue");
  254. this.addScriptItem(data.itemScript, "code", data, "itemScript");
  255. this.addScriptItem(data.validation, "code", data, "validation");
  256. this.addScriptItem(data.sectionByScript, "code", data, "sectionByScript");
  257. this.loadEventsScript(data);
  258. },
  259. loadSourceScript: function(data){
  260. this.addScriptItem(data.cookies, "code", data, "cookies");
  261. this.addScriptItem(data.requestBody, "code", data, "requestBody");
  262. this.loadEventsScript(data);
  263. },
  264. loadSourceTextScript: function(data){
  265. this.addScriptItem(data.jsonText, "code", data, "jsonText");
  266. this.loadEventsScript(data);
  267. },
  268. loadStatScript: function(data){
  269. this.loadEventsScript(data);
  270. },
  271. loadSubSourceScript: function(data){
  272. this.loadEventsScript(data);
  273. },
  274. loadTabScript: function(data){
  275. this.loadEventsScript(data);
  276. },
  277. loadTab$PageScript: function(data){
  278. this.loadEventsScript(data);
  279. },
  280. loadTab$ContentScript: function(data){
  281. this.loadEventsScript(data);
  282. },
  283. loadTableScript: function(data){
  284. this.loadEventsScript(data);
  285. },
  286. loadTable$TdScript: function(data){
  287. this.loadEventsScript(data);
  288. },
  289. loadTextareaScript: function(data){
  290. this.addScriptItem(data.defaultValue, "code", data, "defaultValue");
  291. this.addScriptItem(data.validation, "code", data, "validation");
  292. this.addScriptItem(data.sectionByScript, "code", data, "sectionByScript");
  293. this.loadEventsScript(data);
  294. },
  295. loadTextfieldScript: function(data){
  296. this.addScriptItem(data.defaultValue, "code", data, "defaultValue");
  297. this.addScriptItem(data.validation, "code", data, "validation");
  298. this.addScriptItem(data.sectionByScript, "code", data, "sectionByScript");
  299. this.loadEventsScript(data);
  300. },
  301. loadTreeScript: function(data){
  302. this.addScriptItem(data.dataScript, "code", data, "dataScript");
  303. this.loadEventsScript(data);
  304. },
  305. loadViewScript: function(data){
  306. this.loadEventsScript(data);
  307. },
  308. loadActionbarScript: function(data){
  309. if (data.tools){
  310. data.tools.each(function(tool){
  311. var item = this.addScriptItem(tool, "actionScript", data, "action.tools", tool.text);
  312. this.bindActionbarToolText(tool, item);
  313. }.bind(this));
  314. }
  315. },
  316. bindActionbarToolText: function(tool, item){
  317. var toolItem = item;
  318. var text = tool.text;
  319. Object.defineProperty(tool, "text", {
  320. configurable : true,
  321. enumerable : true,
  322. "get": function(){return text;},
  323. "set": function(v){
  324. if (toolItem){
  325. toolItem.par = v;
  326. toolItem.resetText();
  327. }
  328. text = v;
  329. }.bind(this)
  330. });
  331. },
  332. loadAddressScript: function(data){
  333. this.addScriptItem(data.defaultValue, "code", data, "defaultValue");
  334. this.addScriptItem(data.validation, "code", data, "validation");
  335. this.addScriptItem(data.sectionByScript, "code", data, "sectionByScript");
  336. this.loadEventsScript(data);
  337. },
  338. loadAttachmentScript: function(data){
  339. this.addScriptItem(data.validation, "code", data, "validation");
  340. this.loadEventsScript(data);
  341. },
  342. loadComboxScript: function(data){
  343. this.addScriptItem(data.itemScript, "code", data, "itemScript");
  344. this.addScriptItem(data.itemDynamic, "code", data, "itemDynamic");
  345. this.addScriptItem(data.defaultValue, "code", data, "defaultValue");
  346. this.addScriptItem(data.validation, "code", data, "validation");
  347. this.addScriptItem(data.sectionByScript, "code", data, "sectionByScript");
  348. this.loadEventsScript(data);
  349. },
  350. loadDatagridScript: function(data){
  351. this.addScriptItem(data.defaultData, "code", data, "defaultData");
  352. this.addScriptItem(data.editableScript, "code", data, "editableScript");
  353. this.addScriptItem(data.validation, "code", data, "validation");
  354. this.addScriptItem(data.sectionByScript, "code", data, "sectionByScript");
  355. this.loadEventsScript(data);
  356. },
  357. loadDatagrid$DataScript: function(data){ this.loadEventsScript(data); },
  358. loadDatagrid$TitleScript: function(data){ this.loadEventsScript(data); },
  359. loadHtmleditorScript: function(data){
  360. this.addScriptItem(data.config, "code", data, "config");
  361. this.loadEventsScript(data);
  362. },
  363. loadImageClipperScript: function(data){ this.loadEventsScript(data); },
  364. loadLogScript: function(data){
  365. this.addScriptItem(data.filterScript, "code", data, "filterScript");
  366. this.loadEventsScript(data);
  367. },
  368. loadMonitorScript: function(data){ this.loadEventsScript(data); },
  369. loadNumberScript: function(data){
  370. this.addScriptItem(data.defaultValue, "code", data, "defaultValue");
  371. this.addScriptItem(data.validation, "code", data, "validation");
  372. this.addScriptItem(data.sectionByScript, "code", data, "sectionByScript");
  373. this.loadEventsScript(data);
  374. },
  375. loadOfficeScript: function(data){
  376. this.addScriptItem(data.readScript, "code", data, "readScript");
  377. this.addScriptItem(data.fileSite, "code", data, "fileSite");
  378. this.loadEventsScript(data);
  379. },
  380. loadOpinionScript: function(data){
  381. this.addScriptItem(data.validation, "code", data, "validation");
  382. this.loadEventsScript(data);
  383. },
  384. loadOrgfieldScript: function(data){
  385. this.addScriptItem(data.defaultValue, "code", data, "defaultValue");
  386. this.addScriptItem(data.validation, "code", data, "validation");
  387. this.addScriptItem(data.rangeKey, "code", data, "rangeKey");
  388. this.addScriptItem(data.exclude, "code", data, "exclude");
  389. this.addScriptItem(data.rangeKey, "code", data, "sectionByScript");
  390. this.loadEventsScript(data);
  391. },
  392. loadSidebarScript: function(data){
  393. if (data.tools){
  394. data.tools.each(function(tool){
  395. var item = this.addScriptItem(tool, "actionScript", data, "action.tools", tool.text);
  396. this.bindActionbarToolText(tool, item);
  397. }.bind(this));
  398. }
  399. },
  400. loadSubformScript: function(data){
  401. this.addScriptItem(data.subformScript, "code", data, "subformScript");
  402. this.loadEventsScript(data);
  403. },
  404. loadViewSelectorScript: function(data){
  405. this.addScriptItem(data.selectedScript, "code", data, "selectedScript");
  406. this.loadEventsScript(data);
  407. },
  408. loadStatementScript: function(data){
  409. this.loadEventsScript(data);
  410. },
  411. loadStatementSelectorScript: function(data){
  412. this.addScriptItem(data.selectedScript, "code", data, "selectedScript");
  413. this.loadEventsScript(data);
  414. },
  415. loadEventsScript: function(data){
  416. Object.each(data.events, function(event, key){
  417. this.addModuleEventScriptItem(event, "code", key, data);
  418. }.bind(this));
  419. },
  420. addScriptItem: function(data, key, module, path, par){
  421. if (!data) return null;
  422. var item = new MWF.xApplication.portal.PageDesigner.Script.Item(this, data, key, module, path, par);
  423. this.items.push(item);
  424. return item;
  425. },
  426. addModuleEventScriptItem: function(event, key, eventName, data, par){
  427. var item = new MWF.xApplication.portal.PageDesigner.Script.Item(this, event, key, data, this.designer.lp.events+"."+eventName, par);
  428. this.items.push(item);
  429. return item;
  430. },
  431. deleteScriptItem: function(module, path, par){
  432. var category = this.moduleCategorys[module.id];
  433. if (category){
  434. var count = category.items.length;
  435. for (var i=0; i<count; i++){
  436. var item = category.items[i];
  437. if (item.module.id===module.id && item.path===path && ((par) ? item.par===par : true) ){
  438. item.destroy();
  439. i--; count--;
  440. }
  441. }
  442. }
  443. },
  444. setSize: function(){
  445. var size = this.content.getSize();
  446. var paddings = this.listAreaNode.getStyles("padding-top", "padding-bottom");
  447. var margins = this.listNode.getStyles("margin-top", "margin-bottom");
  448. var actionSize = this.listActionNode.getSize();
  449. var actionMargins = this.listActionNode.getStyles("margin-top", "margin-bottom");
  450. var h = size.y-paddings["padding-top"].toFloat()-paddings["padding-bottom"].toFloat()-margins["margin-top"].toFloat()-margins["margin-bottom"].toFloat()-5;
  451. this.separatorNode.setStyle("height", ""+h+"px");
  452. h = h-actionSize.y-actionMargins["margin-top"].toFloat()-actionMargins["margin-bottom"].toFloat();
  453. this.listNode.setStyle("height", ""+h+"px");
  454. //var scriptSize = this.scriptAreaNode.getSize();
  455. paddings = this.scriptAreaNode.getStyles("padding-top", "padding-bottom");
  456. margins = this.scriptNode.getStyles("margin-top", "margin-bottom");
  457. h = size.y-paddings["padding-top"].toFloat()-paddings["padding-bottom"].toFloat()-margins["margin-top"].toFloat()-margins["margin-bottom"].toFloat();
  458. this.scriptNode.setStyle("height", ""+h+"px");
  459. if (this.scriptTab) this.scriptTab.resize();
  460. // var tabSize = this.scriptTab.tabNodeContainer.getComputedSize();
  461. // var tabMarginTop = this.scriptTab.tabNodeContainer.getStyle("margin-top").toFloat();
  462. // var tabMarginBottom = this.scriptTab.tabNodeContainer.getStyle("margin-bottom").toFloat();
  463. // h = h-tabSize.totalHeight-tabMarginTop-tabMarginBottom;
  464. // this.scriptTab.contentNodeContainer.setStyle("height", ""+h+"px");
  465. },
  466. changeCategoryType: function(e){
  467. if (!e.target.hasClass("listActionButton_select")){
  468. this.actionButtons.removeClass("listActionButton_select");
  469. e.target.addClass("listActionButton_select");
  470. if (this.categoryType === "module"){
  471. this.changeCategoryTypeToPath();
  472. }else{
  473. this.changeCategoryTypeToModule();
  474. }
  475. }
  476. },
  477. changeCategoryTypeToPath: function(){
  478. this.categoryType = "path";
  479. this.items.each(function(item){ item.relocation(); }.bind(this));
  480. },
  481. changeCategoryTypeToModule: function(){
  482. this.categoryType = "module";
  483. this.items.each(function(item){ item.relocation(); }.bind(this));
  484. },
  485. setEvent: function(){
  486. this.setSize();
  487. this.setSizeFun = this.setSize.bind(this);
  488. this.designer.addEvent("resize", this.setSizeFun);
  489. this.actionButtons.addEvents({
  490. "click": function(e){
  491. this.changeCategoryType(e);
  492. }.bind(this)
  493. });
  494. new Drag(this.separatorNode, {
  495. "snap": 1,
  496. "onStart": function(el, e){
  497. var x = (Browser.name==="firefox") ? e.event.clientX : e.event.x;
  498. var y = (Browser.name==="firefox") ? e.event.clientY : e.event.y;
  499. el.store("position", {"x": x, "y": y});
  500. var size = this.listNode.getSize();
  501. el.store("initialWidth", size.x);
  502. }.bind(this),
  503. "onDrag": function(el, e){
  504. var x = (Browser.name==="firefox") ? e.event.clientX : e.event.x;
  505. // var y = e.event.y;
  506. var bodySize = this.content.getSize();
  507. var position = el.retrieve("position");
  508. var initialWidth = el.retrieve("initialWidth").toFloat();
  509. var dx =x.toFloat()- position.x.toFloat();
  510. var width = initialWidth+dx;
  511. if (width> bodySize.x/2) width = bodySize.x/2;
  512. if (width<40) width = 40;
  513. this.scriptAreaNode.setStyle("margin-left", width+3);
  514. this.listAreaNode.setStyle("width", width);
  515. if (this.jsEditor) this.jsEditor.resize();
  516. }.bind(this)
  517. });
  518. },
  519. createScriptEditor: function(callback){
  520. this.jsEditor = new MWF.widget.JavascriptEditor(this.scriptNode,{
  521. "option": {
  522. "value": "",
  523. "lineNumbers": true
  524. },
  525. "onPostLoad": function(){
  526. this.editor = this.jsEditor.editor;
  527. this.jsEditor.addEditorEvent("change", function() {
  528. this.fireEvent("change");
  529. }.bind(this));
  530. this.jsEditor.addEditorEvent("blur", function() {
  531. this.fireEvent("blur");
  532. }.bind(this));
  533. // this.editor.on("change", function() {
  534. // this.fireEvent("change");
  535. // }.bind(this));
  536. this.jsEditor.resize();
  537. if (callback) callback();
  538. this.fireEvent("postLoad");
  539. }.bind(this),
  540. "onSave": function(){
  541. this.fireEvent("change");
  542. this.fireEvent("save");
  543. }.bind(this)
  544. });
  545. this.jsEditor.load();
  546. },
  547. removeModule: function(data){
  548. var count = this.items.length;
  549. for (var i=0; i<count; i++){
  550. var item = this.items[i];
  551. if (item.module.id===data.id){
  552. item.destroy();
  553. i--; count--;
  554. }
  555. }
  556. var keys = Object.keys(this.moduleCategorys);
  557. keys.each(function(k){
  558. var category = this.moduleCategorys[k];
  559. if (category) if (category.module.id===data.id) category.destroy();
  560. }.bind(this));
  561. keys = Object.keys(this.pathCategorys);
  562. keys.each(function(k){
  563. var category = this.pathCategorys[k];
  564. if (category) if (!category.childrenNode.getFirst()) category.destroy();
  565. }.bind(this));
  566. // Object.each(this.pathCategorys, function(category){
  567. // if (!category.childrenNode.getFirst()) category.destroy();
  568. // }.bind(this));
  569. },
  570. checkCategorys: function(){
  571. var keys = Object.keys(this.moduleCategorys);
  572. keys.each(function(k){
  573. var category = this.moduleCategorys[k];
  574. if (category) if (!category.items.length) category.destroy();
  575. }.bind(this));
  576. keys = Object.keys(this.pathCategorys);
  577. keys.each(function(k){
  578. var category = this.pathCategorys[k];
  579. if (category) if (!category.childrenNode.getFirst()) category.destroy();
  580. }.bind(this));
  581. }
  582. });
  583. MWF.xApplication.portal.PageDesigner.Script.Category = new Class({
  584. initialize: function(script, name, level, module, type){
  585. this.script = script;
  586. this.name = name;
  587. this.module = module;
  588. this.level = level;
  589. this.type = type;
  590. this.items = [];
  591. this.load();
  592. },
  593. load: function(){
  594. var name = "";
  595. if (this.type==="path"){
  596. name = this.script.designer.lp.scriptTitle[this.name] || this.name;
  597. }else{
  598. var t;
  599. if (this.module.type==="Form" || this.module.type==="Page"){
  600. t = this.script.designer.lp.pageform;
  601. }else{
  602. t = this.module.type.toLowerCase();
  603. var tool = this.script.designer.toolsData[t];
  604. t = (tool) ? tool.text : t;
  605. }
  606. name = this.name.replace(/\(.*\)/, "("+t+")");
  607. }
  608. this.script.listContentNode.appendHTML("<div class='itemCategory'><div class='itemCategoryTitle'>" +
  609. "<div class='itemCategoryTitleIcon'></div><div class='itemCategoryTitleName' title='"+this.name+"'>"+name+"</div>" +
  610. "</div><div class='itemCategoryChildren'></div></div>");
  611. this.node = this.script.listContentNode.getLast();
  612. //this.blankNode = this.node.getElement(".itemCategoryTitleBlank");
  613. this.titleNode = this.node.getElement(".itemCategoryTitle");
  614. this.iconNode = this.node.getElement(".itemCategoryTitleIcon");
  615. this.nameNode = this.node.getElement(".itemCategoryTitleName");
  616. this.childrenNode = this.node.getElement(".itemCategoryChildren");
  617. var marginLeft = this.level.toInt()*10;
  618. this.node.setStyle("margin-left", ""+marginLeft+"px");
  619. this.titleNode.addEvents({
  620. "mouseover": function(){this.addClass("itemCategoryTitle_over");},
  621. "mouseout": function(){this.removeClass("itemCategoryTitle_over");},
  622. "click": function(){ this.toggle(); }.bind(this)
  623. });
  624. },
  625. hide: function(){
  626. this.node.hide();
  627. },
  628. show: function(){
  629. this.node.show();
  630. },
  631. toggle: function(){
  632. ((this.isExpand) ? this.collapse : this.expand).apply(this);
  633. },
  634. expand: function(){
  635. this.childrenNode.show();
  636. this.iconNode.addClass("itemCategoryTitleIcon_expand");
  637. this.isExpand = true;
  638. },
  639. collapse: function(){
  640. this.childrenNode.hide();
  641. this.iconNode.removeClass("itemCategoryTitleIcon_expand");
  642. this.isExpand = false;
  643. },
  644. resetName: function(name, id){
  645. delete this.script.moduleCategorys[this.module.id];
  646. this.script.moduleCategorys[id] = this;
  647. this.name = name;
  648. this.nameNode.set({"text": this.name, "title": this.name});
  649. this.items.each(function(item){
  650. item.resetText(id);
  651. }.bind(this));
  652. },
  653. destroy: function(){
  654. delete this.script.moduleCategorys[this.module.id];
  655. delete this.script.pathCategorys[this.name];
  656. this.node.destroy();
  657. this.script.checkCategorys();
  658. MWF.release(this);
  659. }
  660. });
  661. MWF.xApplication.portal.PageDesigner.Script.Item = new Class({
  662. initialize: function(script, data, key, module, path, par){
  663. this.script = script;
  664. this.data = data;
  665. this.key = key;
  666. this.module = module;
  667. this.path = path;
  668. this.text = path;
  669. this.par = par;
  670. this.bind();
  671. if (this.data[this.key]) this.createNode();
  672. },
  673. reload: function(){
  674. // if (this.value){
  675. if (!this.node) this.createNode();
  676. //if (this.isShow)
  677. if (this.jsEditor){
  678. this.jsEditor.setValue(this.value);
  679. //this.editor.session.setValue(this.value);
  680. //this.jsEditor.node.show();
  681. }
  682. // }else{
  683. // if (this.node) this.node.destroy();
  684. // if (this.isShow){
  685. // if (this.script.editor){
  686. // this.script.editor.setValue("");
  687. // this.script.jsEditor.node.hide();
  688. // }
  689. // this.isShow = false;
  690. // }
  691. // }
  692. },
  693. unShow: function(){
  694. if (this.script.editor){
  695. this.value.code = this.script.editor.getValue()
  696. }
  697. this.isShow = false;
  698. this.script.currentItem = null;
  699. },
  700. getCategory: function(){
  701. var category = null;
  702. if (this.script.categoryType==="module"){
  703. category = this.script.moduleCategorys[(this.module.type==="Form" || this.module.type==="Page") ? this.module.type : this.module.id];
  704. }else{
  705. category = this.script.pathCategorys[this.path];
  706. }
  707. return category || this.script.createCategory(this.module, this.path);
  708. },
  709. getText: function(id){
  710. var moduleId = id || this.module.id;
  711. var text = this.script.designer.lp.scriptTitle[this.path] || this.path;
  712. text = ((this.module.type==="Form" || this.module.type==="Page") ? this.module.type : moduleId) + ":" + text;
  713. if (this.par) text = text+"."+this.par;
  714. return text;
  715. },
  716. relocation: function(){
  717. if (this.node){
  718. if (this.category) this.category.hide();
  719. this.category = this.getCategory();
  720. this.category.show();
  721. this.text = this.getText();
  722. this.node.inject(this.category.childrenNode);
  723. }
  724. },
  725. createNode: function(){
  726. this.category = this.getCategory();
  727. this.category.show();
  728. this.text = this.getText();
  729. this.category.childrenNode.appendHTML("<div class='item'><div class='itemIcon'></div><div class='itemText' title='"+this.text+"'>"+this.text +"</div></div>");
  730. this.node = this.category.childrenNode.getLast();
  731. this.node.addEvents({
  732. "mouseover": function(){this.addClass("item_over");},
  733. "mouseout": function(){this.removeClass("item_over");},
  734. "click": function(){ this.selected(); }.bind(this)
  735. });
  736. if (this.script.categoryType==="module"){
  737. this.category.items.push(this);
  738. }else{
  739. var category = this.script.moduleCategorys[(this.module.type==="Form" || this.module.type==="Page") ? this.module.type : this.module.id];
  740. if (!category) category = this.script.createCategory(this.module, this.path, "module");
  741. category.items.push(this);
  742. }
  743. },
  744. resetText: function(id){
  745. this.text = this.getText(id);
  746. if (this.node) this.node.getLast().set({"text": this.text, "title": this.text});
  747. if (this.scriptPage){
  748. this.scriptPage.options.title = this.text;
  749. var title = this.scriptPage.textNode.get("text");
  750. var text = this.text;
  751. if (title.substr(0,1)==="*") text = "*"+text;
  752. this.scriptPage.textNode.set("text", text);
  753. }
  754. },
  755. unselected: function(){
  756. this.node.removeClass("item_select");
  757. this.node.getLast().removeClass("itemText_select");
  758. this.isShow = false;
  759. this.script.currentItem = null;
  760. },
  761. selected: function(){
  762. if (this.script.currentItem) this.script.currentItem.unselected();
  763. this.node.addClass("item_select");
  764. this.node.getLast().addClass("itemText_select");
  765. this.isShow = true;
  766. this.script.currentItem = this;
  767. this.showScript();
  768. if (this.module.type==="Form" || this.module.type==="Page"){
  769. (this.script.designer.form || this.script.designer.page).selected();
  770. }else{
  771. var list = (this.script.designer.form || this.script.designer.page).moduleList;
  772. var module = null;
  773. for (var i=0; i<list.length; i++){
  774. if (list[i].json.id===this.module.id){
  775. module = list[i];
  776. break;
  777. }
  778. }
  779. if (module) module.selected();
  780. }
  781. },
  782. save: function(){
  783. this.script.designer.saveForm();
  784. },
  785. change: function(){
  786. this.data[this.key] = this.jsEditor.getValue();
  787. },
  788. setSize: function(){
  789. var size = this.script.scriptTabNode.getComputedSize();
  790. var tabSize = this.script.scriptTab.tabNodeContainer.getComputedSize();
  791. var tabMarginTop = this.script.scriptTab.tabNodeContainer.getStyle("margin-top").toFloat();
  792. var tabMarginBottom = this.script.scriptTab.tabNodeContainer.getStyle("margin-bottom").toFloat();
  793. var h = size.height-tabSize.totalHeight-tabMarginTop-tabMarginBottom;
  794. this.scriptPageNode.setStyle("height", ""+h+"px");
  795. if (this.jsEditor) this.jsEditor.resize();
  796. },
  797. createScriptEditor: function(){
  798. this.scriptPageNode = new Element("div");
  799. this.setSizeFun = this.setSize.bind(this);
  800. this.setSizeFun();
  801. this.script.designer.addEvent("resize", this.setSizeFun);
  802. var text = this.getText();
  803. this.scriptPage = this.script.scriptTab.addTab(this.scriptPageNode, text, true);
  804. this.scriptPage.scriptItem = this;
  805. this.scriptContentNode = new Element("div.scriptContentNode").inject(this.scriptPageNode);
  806. this.jsEditor = new MWF.widget.JavascriptEditor(this.scriptContentNode,{
  807. "option": {
  808. "value": this.data[this.key],
  809. "lineNumbers": true
  810. },
  811. "onPostLoad": function(){
  812. this.editor = this.jsEditor.editor;
  813. this.editor.id = "1";
  814. this.jsEditor.addEditorEvent("change", function() {
  815. var text = this.scriptPage.textNode.get("text");
  816. if (text.substr(0,1)!=="*") this.scriptPage.textNode.set("text","*"+ text);
  817. this.change();
  818. }.bind(this));
  819. this.jsEditor.addEditorEvent("blur", function() {
  820. this.change();
  821. }.bind(this));
  822. // this.editor.on("change", function() {
  823. // var text = this.scriptPage.textNode.get("text");
  824. // if (text.substr(0,1)!=="*") this.scriptPage.textNode.set("text","*"+ text);
  825. // this.change();
  826. // }.bind(this));
  827. this.jsEditor.resize();
  828. }.bind(this),
  829. "onSave": function(){
  830. this.save();
  831. var text = this.scriptPage.textNode.get("text");
  832. if (text.substr(0,1)==="*"){
  833. this.scriptPage.textNode.set("text", text.substr(1, text.length));
  834. }
  835. }.bind(this)
  836. });
  837. this.jsEditor.load();
  838. this.scriptPage.addEvent("show", function(){
  839. this.scriptPage.scriptItem.selected();
  840. if (this.jsEditor) this.jsEditor.focus();
  841. }.bind(this));
  842. this.scriptPage.addEvent("queryClose", function(){
  843. var idx = this.tab.pages.indexOf(this);
  844. if (idx!==-1){
  845. if (idx===0){ idx = 1; }else{ idx--; }
  846. if (this.tab.pages[idx]){ this.tab.pages[idx].scriptItem.selected();} else {this.scriptItem.unselected();}
  847. }else{
  848. this.scriptItem.unselected();
  849. }
  850. this.scriptItem.scriptPage = null;
  851. this.scriptItem.jsEditor = null;
  852. });
  853. //this.scriptPage.tabNode.addEvent("dblclick")
  854. },
  855. showScript: function(){
  856. if (!this.scriptPage) this.createScriptEditor();
  857. this.scriptPage.showTabIm();
  858. // if (!this.script.jsEditor){
  859. // this.script.createScriptEditor(function(){
  860. // this.script.editor.setValue(this.value);
  861. // this.script.jsEditor.node.show();
  862. // }.bind(this));
  863. // }else{
  864. // if (this.script.currentItem) this.script.currentItem.unShow();
  865. // this.script.editor.setValue(this.value);
  866. // this.script.jsEditor.node.show();
  867. // }
  868. },
  869. destroy: function(){
  870. this.script.items.erase(this);
  871. var category = this.script.moduleCategorys[(this.module.type==="Form" || this.module.type==="Page") ? this.module.type : this.module.id];
  872. if (category) category.items.erase(this);
  873. if (this.scriptPage) this.scriptPage.closeTab();
  874. if (this.node) this.node.destroy();
  875. this.script.checkCategorys();
  876. MWF.release(this);
  877. },
  878. //绑定aec需要修改ace源码。
  879. bind: function(){
  880. this.value = this.data[this.key];
  881. if (this.data.editors){
  882. this.data.editors.push(this);
  883. }else{
  884. Object.defineProperty(this.data, "editors", {
  885. configurable : false,
  886. enumerable : false,
  887. writable: true,
  888. "value": []
  889. });
  890. this.data.editors.push(this);
  891. Object.defineProperty(this.data, this.key, {
  892. configurable : true,
  893. enumerable : true,
  894. "get": function(){return this.value;}.bind(this),
  895. "set": function(v){
  896. this.data.editors.each(function(editor){
  897. if (editor.editor){
  898. if (v!==editor.editor.getValue()) editor.editor.setValue(v,1);
  899. }else{
  900. editor.reload();
  901. }
  902. });
  903. this.value = v;
  904. }.bind(this)
  905. });
  906. }
  907. // Object.defineProperty(this.data, this.key, {
  908. // configurable : true,
  909. // enumerable : true,
  910. // "get": function(){return this.value;}.bind(this),
  911. // "set": function(v){
  912. // this.value = v;
  913. // this.reload();
  914. // }.bind(this)
  915. // });
  916. }
  917. });