Table.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. MWF.xApplication.cms.FormDesigner.Module = MWF.xApplication.cms.FormDesigner.Module || {};
  2. MWF.xDesktop.requireApp("cms.FormDesigner", "Module.$Component", null, false);
  3. MWF.xDesktop.requireApp("cms.FormDesigner", "Module.Table$Td", null, false);
  4. MWF.xApplication.cms.FormDesigner.Module.Table = MWF.CMSFCTable = new Class({
  5. Extends: MWF.CMSFC$Component,
  6. Implements: [Options, Events],
  7. options: {
  8. "style": "default",
  9. "propertyPath": "/x_component_cms_FormDesigner/Module/Table/table.html",
  10. "propertyMultiPath": "/x_component_cms_FormDesigner/Module/Table$Td/table$tdMulti.html",
  11. "multiActions": [
  12. {
  13. "name": "mergerCell",
  14. "icon": "mergerCell.png",
  15. "event": "click",
  16. "action": "mergerCell",
  17. "title": MWF.CMSFD.LP.formAction.mergerCell
  18. }
  19. ]
  20. },
  21. initialize: function(form, options){
  22. this.setOptions(options);
  23. this.path = "/x_component_cms_FormDesigner/Module/Table/";
  24. this.cssPath = "/x_component_cms_FormDesigner/Module/Table/"+this.options.style+"/css.wcss";
  25. this._loadCss();
  26. this.moduleType = "component";
  27. this.moduleName = "table";
  28. this.form = form;
  29. this.container = null;
  30. this.containerNode = null;
  31. this.containers = [];
  32. this.elements = [];
  33. this.selectedMultiTds = [];
  34. },
  35. _createMoveNode: function(){
  36. var tableHTML = "<table border=\"0\" cellpadding=\"0\" cellspacing=\"2\" width=\"100%\" align=\"center\">";
  37. tableHTML += "<tr><td></td><td></td><td></td></tr>";
  38. tableHTML += "<tr><td></td><td></td><td></td></tr>";
  39. tableHTML += "<tr><td></td><td></td><td></td></tr>";
  40. tableHTML += "</table>";
  41. this.moveNode = new Element("div", {
  42. "html": tableHTML
  43. }).inject(this.form.container);
  44. // this.moveNode = divNode.getFirst();
  45. // this.moveNode.inject(divNode, "after");
  46. // divNode.destroy();
  47. this.moveNode.setStyles(this.css.moduleNodeMove);
  48. this._setTableStyle();
  49. },
  50. _setTableStyle: function(){
  51. var tds = this.moveNode.getElements("td");
  52. tds.setStyles({
  53. "border": "1px dashed #999",
  54. "height": "20px"
  55. });
  56. },
  57. _checkSelectedTds: function(sp, ep){
  58. this.selectedMultiTds = [];
  59. var tds = this.node.getElements("td");
  60. // var tmpSelectedTds = [];
  61. // var startXList = [];
  62. // var startYList = [];
  63. // var endXList = [];
  64. // var endYList = [];
  65. var sx = sp.x, sy = sp.y, ex = ep.x, ey = ep.y;
  66. while (true){
  67. var tmpsx = sp.x, tmpsy = sp.y, tmpex = ep.x, tmpey = ep.y;
  68. tds.each(function(td){
  69. if (td.isInPointInRect(sx, sy, ex, ey)){
  70. var position = td.getPosition();
  71. var size = td.getSize();
  72. if (!tmpsx || position.x<tmpsx) tmpsx = position.x;
  73. if (!tmpsy || position.y<tmpsy) tmpsy = position.y;
  74. if (!tmpex || position.x+size.x>tmpex) tmpex = position.x+size.x;
  75. if (!tmpey || position.y+size.y>tmpey) tmpey = position.y+size.y;
  76. }
  77. }.bind(this));
  78. if (sx==tmpsx && sy==tmpsy && ex==tmpex && ey==tmpey) break;
  79. sx = tmpsx, sy = tmpsy, ex = tmpex, ey = tmpey;
  80. }
  81. tds.each(function(td){
  82. var module = td.retrieve("module");
  83. if (td.isInPointInRect(sx, sy, ex, ey)){
  84. module.selectedMulti();
  85. }else{
  86. module.unSelectedMulti();
  87. }
  88. }.bind(this));
  89. },
  90. _setOtherNodeEvent: function(){
  91. this.dragInfor = {};
  92. this.tdDragSelect = new Drag(this.node, {
  93. "onStart": function(el, e){
  94. this.form._beginSelectMulti();
  95. var position = e.event.target.getPosition();
  96. this.dragInfor.start = {"x": e.event.offsetX+position.x, "y": e.event.offsetY+position.y};
  97. }.bind(this),
  98. "onDrag": function(el, e){
  99. var position = e.event.target.getPosition();
  100. var p = {"x": e.event.offsetX+position.x, "y": e.event.offsetY+position.y};
  101. this._checkSelectedTds(this.dragInfor.start, p);
  102. e.stop();
  103. }.bind(this),
  104. "onComplete": function(el, e){
  105. var position = e.event.target.getPosition();
  106. var p = {"x": e.event.offsetX+position.x, "y": e.event.offsetY+position.y};
  107. this._checkSelectedTds(this.dragInfor.start, p);
  108. this.form._completeSelectMulti();
  109. this._createMultiSelectedActions();
  110. this.showMultiProperty();
  111. e.stop();
  112. e.preventDefault();
  113. }.bind(this)
  114. });
  115. },
  116. showMultiProperty: function(){
  117. this.form.propertyMultiTd = new MWF.xApplication.cms.FormDesigner.PropertyMulti(this.form, this.form.selectedModules, this.form.designer.propertyContentArea, this.form.designer, {
  118. "path": this.options.propertyMultiPath,
  119. "onPostLoad": function(){
  120. this.show();
  121. }
  122. });
  123. this.form.propertyMultiTd.load();
  124. },
  125. _createMultiSelectedActions: function(){
  126. if (this.form.selectedModules.length>1){
  127. if (this.form.multimoduleActionsArea){
  128. this.form.multimoduleActionsArea.empty();
  129. this.options.multiActions.each(function(action){
  130. var actionNode = new Element("div", {
  131. "styles": this.options.actionNodeStyles,
  132. "title": action.title
  133. }).inject(this.form.multimoduleActionsArea);
  134. actionNode.setStyle("background", "url("+this.path+this.options.style+"/icon/"+action.icon+") no-repeat left center");
  135. actionNode.addEvent(action.event, function(e){
  136. this[action.action](e);
  137. }.bind(this));
  138. }.bind(this));
  139. this.form.multimoduleActionsArea.setStyle("width", 18*this.options.multiActions.length);
  140. }
  141. }else{
  142. this.form.multimoduleActionsArea.setStyle("display", "none");
  143. }
  144. },
  145. mergerCell: function(){
  146. if (this.form.selectedModules.length>1){
  147. var firstModuleObj = this.form._getFirstMultiSelectedModule();
  148. var firstModule = firstModuleObj.module;
  149. // var n=0;
  150. var td = firstModule.node;
  151. var colspan = 0;
  152. while (td && this.form.selectedModules.indexOf(td.retrieve("module"))!=-1 ){
  153. var tmpColspan = td.get("colspan").toInt() || 1;
  154. colspan = colspan+tmpColspan;
  155. td = td.getNext("td");
  156. }
  157. var maxRowIndex = Number.NEGATIVE_INFINITY;
  158. var minRowIndex = Number.POSITIVE_INFINITY;
  159. this.form.selectedModules.each(function(module, idx){
  160. var rIdx = module.node.getParent("tr").rowIndex;
  161. var tmpRowspan = module.node.get("rowspan").toInt() || 1;
  162. var rows = rIdx+tmpRowspan-1;
  163. maxRowIndex = Math.max(maxRowIndex, rows);
  164. minRowIndex = Math.min(minRowIndex, rows);
  165. }.bind(this));
  166. var rowspan = maxRowIndex-minRowIndex+1;
  167. if (colspan>1){
  168. firstModule.node.set("colspan", colspan);
  169. firstModule.json.properties.colspan = colspan;
  170. }else{
  171. firstModule.node.set("colspan", 1);
  172. delete firstModule.node.colspan;
  173. delete firstModule.json.properties.colspan;
  174. }
  175. if (rowspan>1){
  176. firstModule.node.set("rowspan", rowspan);
  177. firstModule.json.properties.rowspan = rowspan;
  178. }else{
  179. firstModule.node.set("rowspan", 1);
  180. delete firstModule.node.rowspan;
  181. delete firstModule.json.properties.rowspan;
  182. }
  183. while (this.form.selectedModules.length){
  184. var module = this.form.selectedModules[0];
  185. this.form.selectedModules.erase(module);
  186. if (module!==firstModule){
  187. var modules = module._getSubModule();
  188. modules.each(function(module){
  189. module._moveTo(firstModule);
  190. });
  191. this.containers.erase(module);
  192. module.destroy();
  193. }
  194. }
  195. firstModule.selected();
  196. }
  197. },
  198. _getContainers: function(){
  199. var tds = this.node.getElements("td");
  200. this.form.getTemplateData("Table$Td", function(data){
  201. tds.each(function(td){
  202. var json = this.form.getDomjson(td);
  203. var tdContainer = null;
  204. if (!json){
  205. var moduleData = Object.clone(data);
  206. tdContainer = new MWF.CMSFCTable$Td(this.form);
  207. tdContainer.table = this;
  208. tdContainer.load(moduleData, td, this);
  209. }else{
  210. tdContainer = new MWF.CMSFCTable$Td(this.form);
  211. tdContainer.table = this;
  212. tdContainer.load(json, td, this);
  213. }
  214. this.containers.push(tdContainer);
  215. }.bind(this));
  216. }.bind(this));
  217. },
  218. _getElements: function(){
  219. // this.elements.push(this);
  220. },
  221. _createNode: function(callback){
  222. var module = this;
  223. var url = this.path+"tableCreate.html";
  224. MWF.require("MWF.widget.Dialog", function(){
  225. var size = $(document.body).getSize();
  226. var x = size.x/2-180;
  227. var y = size.y/2-130;
  228. var dlg = new MWF.DL({
  229. "title": "Create Table",
  230. "style": "property",
  231. "top": y,
  232. "left": x-40,
  233. "fromTop":size.y/2-65,
  234. "fromLeft": size.x/2,
  235. "width": 360,
  236. "height": 260,
  237. "url": url,
  238. "buttonList": [
  239. {
  240. "text": MWF.CMSFD.LP.button.ok,
  241. "action": function(){
  242. module._createTableNode();
  243. callback();
  244. this.close();
  245. }
  246. }
  247. ]
  248. });
  249. dlg.show();
  250. }.bind(this));
  251. },
  252. _createTableNode: function(){
  253. var rows = $("MWFNewTableLine").get("value");
  254. var cols = $("MWFNewTableColumn").get("value");
  255. var width = $("MWFNewTableWidth").get("value");
  256. var widthUnitNode = $("MWFNewTableWidthUnit");
  257. var widthUnit = widthUnitNode.options[widthUnitNode.selectedIndex].value;
  258. var border = $("MWFNewTableBorder").get("value");
  259. var cellpadding = $("MWFNewTableCellpadding").get("value");
  260. var cellspacing = $("MWFNewTableCellspacing").get("value");
  261. var w = "";
  262. if (widthUnit=="percent"){
  263. w = width+"%";
  264. }else{
  265. w = width+"px";
  266. }
  267. this.json.properties.width = w;
  268. this.json.properties.border = border;
  269. this.json.properties.cellpadding = cellpadding;
  270. this.json.properties.cellspacing = cellspacing;
  271. var tableHTML = "<table border=\""+border+"\" cellpadding=\""+cellpadding+"\" cellspacing=\""+cellspacing+"\" width=\""+w+"\" align=\"center\">";
  272. for (var i=0; i<rows.toInt(); i++){
  273. tableHTML += "<tr>";
  274. for (var j=0; j<cols.toInt(); j++){
  275. tableHTML += "<td></td>";
  276. }
  277. tableHTML += "</tr>";
  278. }
  279. tableHTML += "</table>";
  280. this.node = this.node = new Element("div", {
  281. "id": this.json.id,
  282. "MWFType": "table",
  283. "html": tableHTML,
  284. "styles": this.css.moduleNode,
  285. "events": {
  286. "selectstart": function(e){
  287. e.preventDefault();
  288. }
  289. }
  290. }).inject(this.form.node);
  291. //if (w!="100%"){
  292. // this.node.setStyle("width", w);
  293. //}
  294. },
  295. _dragComplete: function(){
  296. if (!this.node){
  297. this._createNode(function(){
  298. this._dragMoveComplete();
  299. }.bind(this));
  300. }else{
  301. this._dragMoveComplete();
  302. }
  303. },
  304. _dragMoveComplete: function(){
  305. this._resetTreeNode();
  306. this.node.inject(this.copyNode, "before");
  307. this._initModule();
  308. var thisDisplay = this.node.retrieve("thisDisplay");
  309. if (thisDisplay){
  310. this.node.setStyle("display", thisDisplay);
  311. }
  312. if (this.copyNode) this.copyNode.destroy();
  313. if (this.moveNode) this.moveNode.destroy();
  314. this.moveNode = null;
  315. this.copyNode = null;
  316. this.nextModule = null;
  317. this.form.moveModule = null;
  318. this.form.json.moduleList[this.json.id] = this.json;
  319. this.selected();
  320. },
  321. setPropertiesOrStyles: function(name){
  322. if (name=="styles"){
  323. var border = this.node.getStyle("border");
  324. this.node.clearStyles();
  325. this.node.setStyles(this.css.moduleNode);
  326. this.node.setStyle("border", border);
  327. Object.each(this.json.styles, function(value, key){
  328. var reg = /^border\w*/ig;
  329. if (!key.test(reg)){
  330. this.node.setStyle(key, value);
  331. }
  332. }.bind(this));
  333. }
  334. if (name=="properties"){
  335. this.node.getFirst().setProperties(this.json.properties);
  336. //if (this.json.properties.width){
  337. // if (this.json.properties.width!="100%"){
  338. // this.node.setStyle("width", this.json.properties.width);
  339. // }
  340. //}
  341. }
  342. },
  343. _setEditStyle_custom: function(name, obj, oldValue){
  344. if (name=="id"){
  345. if (name!=oldValue){
  346. var reg = new RegExp("^"+oldValue, "i");
  347. this.containers.each(function(container){
  348. var id = container.json.id;
  349. var newId = id.replace(reg, this.json.id);
  350. container.json.id = newId;
  351. delete this.form.json.moduleList[id];
  352. this.form.json.moduleList[newId] = container.json;
  353. container._setEditStyle("id");
  354. }.bind(this));
  355. }
  356. }
  357. },
  358. copyComponentJsonData: function(newNode, pid){
  359. var tds = newNode.getElements("td");
  360. // this.form.getTemplateData("Table$Td", function(data){
  361. tds.each(function(td, idx){
  362. var newContainerJson = Object.clone(this.containers[idx].json);
  363. newContainerJson.id = this.containers[idx]._getNewId(pid);
  364. this.form.json.moduleList[newContainerJson.id] = newContainerJson;
  365. td.set("id", newContainerJson.id);
  366. }.bind(this));
  367. // }.bind(this));
  368. },
  369. // setOtherNodeEvent: function(){
  370. //// var tds = this.node.getElements("td");
  371. //// tds.addEvent("click", function(e){
  372. //// this.selectedTd(e.target);
  373. //// }.bind(this));
  374. // },
  375. //
  376. // selectedTd: function(td){
  377. // if (this.currentSelectedTd){
  378. // if (this.currentSelectedTd==td){
  379. // return true;
  380. // }else{
  381. // this.unSelectedTd(this.currentSelectedTd);
  382. // }
  383. // }
  384. //
  385. // var top = td.getStyle("border-top");
  386. // var left = td.getStyle("border-left");
  387. // var bottom = td.getStyle("border-bottom");
  388. // var right = td.getStyle("border-right");
  389. // td.store("thisborder", {"top": top, "left": left, "bottom": bottom, "right": right});
  390. //
  391. // td.setStyles({
  392. // "border": "1px dashed #ff6b49"
  393. // });
  394. // this.currentSelectedTd = td;
  395. // },
  396. // unSelectedTd: function(td){
  397. // var border = td.retrieve("thisborder");
  398. // if (border) {
  399. // td.setStyles({
  400. // "border-top": border.top,
  401. // "border-left": border.left,
  402. // "border-bottom": border.bottom,
  403. // "border-right": border.right
  404. // });
  405. // }
  406. // this.currentSelectedTd = null;
  407. // },
  408. getContainerNodes: function(){
  409. return this.node.getElements("td");
  410. }
  411. });