board.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. Ext.QuickTips.init();
  2. Ext.define('erp.controller.board', {
  3. extend: 'Ext.app.Controller',
  4. views:['boardmodel.viewport','boardmodel.modeltree','boardmodel.modeleditpanel',
  5. 'boardmodel.editcomponent','boardmodel.modelbuilderpanel','boardmodel.elementconfigpanel',
  6. 'boardmodel.elementdetailgrid','boardmodel.detailpropertiesgrid','component.commonpanel','component.formcomponent',
  7. 'component.gridcomponent','component.barcomponent','component.linecomponent','component.piecomponent',
  8. 'core.trigger.TextTrigger', 'core.trigger.StyleTrigger', 'core.trigger.GridRenderTrigger', 'core.trigger.FormRenderTrigger',
  9. 'boardmodel.modelbackupgrid'
  10. ],
  11. stores:['component'],
  12. init:function(){
  13. var me = this;
  14. me.formIndex = 1;
  15. var formIndex = 1;
  16. var gridIndex = 1;
  17. this.control({
  18. 'modelbuilderpanel':{
  19. afterrender: function(view) {
  20. var grid = Ext.getCmp('modeltree');
  21. grid.loadGridData();
  22. },
  23. afterlayout: function(view) {
  24. // 如果不是第一次进入界面则直接退出
  25. if(window.f == 1) {
  26. return;
  27. }
  28. window.f = 1;
  29. view.getEl().mask('loading...');
  30. Ext.Ajax.request({
  31. url:'kanban/get/' + modelCode,
  32. method:'POST',
  33. callback:function(options,success,response){
  34. view.getEl().unmask();
  35. var record = JSON.parse(response.responseText);
  36. try {
  37. view.modelRecord = record;
  38. record.get = function(key) {
  39. return this[key];
  40. };
  41. record.set = function(key, value) {
  42. this[key] = value;
  43. };
  44. view.fireEvent('repaintcomponent', view, record);
  45. }catch(e) {
  46. Ext.Msg.alert(e.name, e.message)
  47. }
  48. }
  49. });
  50. },
  51. repaintcomponent:function(view, record){
  52. var builderPanel = Ext.getCmp('modelbuilderpanel');
  53. var editPanel = Ext.getCmp('modeleditpanel');
  54. if(builderPanel.items.items.length > 0) {
  55. builderPanel.removeAll();
  56. Ext.getCmp('elementdetailgrid').getStore().removeAll();
  57. Ext.getCmp('detailpropertiesgrid').getStore().removeAll();
  58. Ext.getCmp('baseConfigForm').removeAll(true);
  59. builderPanel.currenSelectPanel = null;
  60. me.repaint(record);
  61. }else {
  62. me.repaint(record);
  63. }
  64. view.setButtonDisabled(false);
  65. },
  66. beforeaddpanel:function(panel, config){
  67. },
  68. afteraddpanel: function(panel, component) {
  69. me.setCmpPosition(panel,component);
  70. },
  71. add:function(self,component){
  72. self.fireEvent('changepanel',self,component);
  73. },
  74. changepanel:function(self,newPanel){
  75. var currentPanel = self.currenSelectPanel;
  76. if(currentPanel!=null&&currentPanel.id!=newPanel.id){
  77. currentPanel.removeCls('select-panel');
  78. newPanel.addCls('select-panel');
  79. currentPanel.fireEvent('unselectpanel',currentPanel,self);
  80. newPanel.fireEvent('selectpanel',newPanel,self);
  81. }else if(currentPanel==null){
  82. newPanel.addCls('select-panel');
  83. newPanel.fireEvent('selectpanel',newPanel,self);
  84. }
  85. self.currenSelectPanel = newPanel;
  86. self.change = true;
  87. }
  88. },
  89. 'elementconfigpanel button[id=detailDelete]':{
  90. click:function(btn){
  91. var builderPanel = Ext.getCmp('modelbuilderpanel');
  92. var currenSelectPanel = builderPanel.currenSelectPanel;
  93. var detailGrid = Ext.getCmp('elementdetailgrid');
  94. if(currenSelectPanel==null){
  95. Ext.Msg.alert('提示','请先添加Panel!');
  96. }else{
  97. var detailGrid = Ext.getCmp('elementdetailgrid');
  98. var detailSelect = detailGrid.getSelectionModel().getSelection()[0];
  99. if(!detailSelect){
  100. Ext.Msg.alert('提示','请先选择字段!');
  101. }else{
  102. currenSelectPanel.fireEvent('fielddelete',currenSelectPanel,detailSelect);
  103. detailGrid.getStore().remove(detailSelect);
  104. Ext.getCmp('detailpropertiesgrid').getStore().removeAll();
  105. }
  106. }
  107. }
  108. },
  109. 'elementconfigpanel button[id=detailAdd]':{
  110. click:function(btn){
  111. var builderPanel = Ext.getCmp('modelbuilderpanel');
  112. var currenSelectPanel = builderPanel.currenSelectPanel;
  113. var detailGrid = Ext.getCmp('elementdetailgrid');
  114. if(currenSelectPanel==null){
  115. Ext.Msg.alert('提示','请先添加Panel!');
  116. }else{
  117. currenSelectPanel.fireEvent('addItem',currenSelectPanel,detailGrid);
  118. }
  119. }
  120. },
  121. 'elementdetailgrid':{
  122. edit:function(editor, e, eOpts){
  123. var rowIdx = e.rowIdx;
  124. var builderPanel = Ext.getCmp('modelbuilderpanel');
  125. var currenSelectPanel = builderPanel.currenSelectPanel;
  126. currenSelectPanel.fireEvent('fieldnamechange',currenSelectPanel,e.record,rowIdx);
  127. },
  128. select:function(grid,record,index,eOpts){
  129. var propertiesGrid = Ext.getCmp('detailpropertiesgrid');
  130. propertiesGrid.getStore().loadData(record.get('propconfig'));
  131. // 加载数据之后立即保存数据
  132. var detailSelect = grid.getSelection()[0];
  133. detailSelect.set('propconfig',me.getPropConfigByRecord(propertiesGrid.store.data.items));
  134. }
  135. },
  136. 'detailpropertiesgrid combo[id=propCombo]':{
  137. select:function(combo,records){
  138. var detailGrid = Ext.getCmp('elementdetailgrid');
  139. var detailSelect = detailGrid.getSelectionModel().getSelection()[0];
  140. if(detailSelect==null){
  141. Ext.Msg.alert('提示','请先选择字段!')
  142. }
  143. if(detailSelect!=null){
  144. var propGrid = Ext.getCmp('detailpropertiesgrid');
  145. propGrid.getStore().loadData([{
  146. property:records[0].get('name'),
  147. //propvalue:records[0].get('value')
  148. }],true);
  149. }
  150. }
  151. },
  152. 'detailpropertiesgrid':{
  153. edit:function(editor, e, eOpts){
  154. var rowIdx = e.rowIdx;
  155. var detailGrid = Ext.getCmp('elementdetailgrid');
  156. var detailSelect = detailGrid.getSelectionModel().getSelection()[0];
  157. detailSelect.set('propconfig',me.getPropConfigByRecord(e.store.data.items));
  158. var builderPanel = Ext.getCmp('modelbuilderpanel');
  159. var currenSelectPanel = builderPanel.currenSelectPanel;
  160. currenSelectPanel.fireEvent('fieldpropchange',currenSelectPanel,detailSelect,rowIdx);
  161. },
  162. celldblclick: function (gridview, colEl, colIndex, record, rowEl, rowIndex, e, eOpts) {
  163. var grid = gridview.up('grid');
  164. var column = grid.columnManager.columns[1];
  165. var builderPanel = Ext.getCmp('modelbuilderpanel');
  166. var currenSelectPanel = builderPanel.currenSelectPanel;
  167. var propconfig = currenSelectPanel.config.propGridDefault.propconfig;
  168. var editor;
  169. for(var i = 0; i < propconfig.length; i++) {
  170. if(propconfig[i].property == record.get('property')) {
  171. console.log(propconfig[i].editor);
  172. editor = propconfig[i].editor || {xtype: 'textfield'};
  173. }
  174. }
  175. column.setEditor(editor);
  176. gridview.up('grid').getPlugin().startEditByPosition({row: rowIndex, column: 1});
  177. }
  178. }
  179. });
  180. },
  181. setCmpPosition:function(panel,component){
  182. Ext.defer(function(){
  183. var xy = component.getXY();
  184. var builderPanelXY = panel.body.getXY();
  185. var builderPanelWidth = panel.body.getWidth();
  186. var builderPanelHeight = panel.body.getHeight();
  187. var xRatio = Math.round((xy[0]-builderPanelXY[0])/builderPanelWidth*100);
  188. var yRatio = Math.round((xy[1]-(builderPanelXY[1]+1))/builderPanelHeight*100);
  189. var widthRatio = Math.round(component.getWidth()/builderPanelWidth*100);
  190. var heightRatio = Math.round(component.getHeight()/builderPanelHeight*100);
  191. var form = Ext.getCmp('baseConfigForm');
  192. var values = form.getForm().getValues();
  193. Ext.apply(values,{
  194. x:xRatio,
  195. y:yRatio,
  196. width:widthRatio,
  197. height:heightRatio
  198. });
  199. form.getForm().setValues(values);
  200. component.baseConfigFormValue = values;
  201. },300);
  202. },
  203. repaint: function(record) {
  204. var me = this;
  205. var builderPanel = Ext.getCmp('modelbuilderpanel');
  206. var builderPanelXY = builderPanel.getXY();
  207. var builderPanelBodyWidth = builderPanel.body.getWidth();
  208. var builderPanelBodyHeight = builderPanel.body.getHeight();
  209. // 请求xml数据
  210. //var xmlstr = me.getXmlString(record.get('code'));
  211. var xmlstr = record.get('content');
  212. if(!xmlstr){
  213. return;
  214. }
  215. // 根据xml字符串创建XML DOM
  216. var xmlDom = me.loadXML(xmlstr);
  217. // 根据xml数据生成jsonObject
  218. var modelObj = me.XML2JSON(xmlDom);
  219. // 添加组件
  220. var sl = st = 0;
  221. for(var i = 0; i < modelObj.length; i++) {
  222. var x = builderPanelBodyWidth*modelObj[i].x/100+builderPanelXY[0];
  223. var y = builderPanelBodyHeight*modelObj[i].y/100+builderPanelXY[1];
  224. var width = builderPanelBodyWidth*(modelObj[i].width/100);
  225. var height = builderPanelBodyHeight*(modelObj[i].height/100);
  226. var companel = builderPanel.add({
  227. xtype: modelObj[i].type + 'component',
  228. width: width,
  229. height: height,
  230. detailData: modelObj[i].detailData,
  231. baseConfigFormValue: modelObj[i].baseConfigFormValue
  232. });
  233. companel.repaint();
  234. companel.setXY([x,y]);
  235. //companel.setLayoutPosition({x: modelObj[i].x, y: modelObj[i].y, width: modelObj[i].width, height: modelObj[i].height})
  236. }
  237. },
  238. getPropConfigByRecord:function(records){
  239. var propConfig = new Array();
  240. var obj;
  241. Ext.Array.each(records,function(record){
  242. obj = new Object();
  243. obj.display = record.get('display');
  244. obj.property = record.get('property');
  245. obj.propvalue = record.get('propvalue');
  246. propConfig.push(obj);
  247. });
  248. return propConfig;
  249. },
  250. loadXML: function(xmlString){
  251. var xmlDoc=null;
  252. //判断浏览器的类型
  253. //支持IE浏览器
  254. if(!window.DOMParser && window.ActiveXObject){ //window.DOMParser 判断是否是非ie浏览器
  255. var xmlDomVersions = ['MSXML.2.DOMDocument.6.0','MSXML.2.DOMDocument.3.0','Microsoft.XMLDOM'];
  256. for(var i=0;i<xmlDomVersions.length;i++){
  257. try{
  258. xmlDoc = new ActiveXObject(xmlDomVersions[i]);
  259. xmlDoc.async = false;
  260. xmlDoc.loadXML(xmlString); //loadXML方法载入xml字符串
  261. break;
  262. }catch(e){
  263. }
  264. }
  265. }
  266. //支持Mozilla浏览器
  267. else if(window.DOMParser && document.implementation && document.implementation.createDocument){
  268. try{
  269. /* DOMParser 对象解析 XML 文本并返回一个 XML Document 对象。
  270. * 要使用 DOMParser,使用不带参数的构造函数来实例化它,然后调用其 parseFromString() 方法
  271. * parseFromString(text, contentType) 参数text:要解析的 XML 标记 参数contentType文本的内容类型
  272. * 可能是 "text/xml" 、"application/xml" 或 "application/xhtml+xml" 中的一个。注意,不支持 "text/html"。
  273. */
  274. domParser = new DOMParser();
  275. xmlDoc = domParser.parseFromString(xmlString, 'text/xml');
  276. }catch(e){
  277. }
  278. }
  279. else{
  280. return null;
  281. }
  282. return xmlDoc;
  283. },
  284. XML2JSON: function(xmlDom) {
  285. var jsonObj = [];
  286. var doc = xmlDom;
  287. //var doc = xmlDom.getRootNode();
  288. var root = doc.children[0]
  289. var children = root.children;
  290. for(var i = 0; i < children.length; i++) {
  291. var ch = children[i];
  292. var nodeName = ch.nodeName;
  293. var x = ch.getAttribute('x');
  294. var y = ch.getAttribute('y');
  295. var width = ch.getAttribute('width');
  296. var height = ch.getAttribute('height');
  297. var fields = ch.getElementsByTagName('field');
  298. var detailData = [];
  299. for(var j = 0; j < fields.length; j++) {
  300. var v = fields[j];
  301. var propfields = [];
  302. if(nodeName == 'form') {
  303. propfields.push(
  304. {display: "变量名", property: "value", propvalue: v.getAttribute('value')},
  305. {display: "宽度(%)", property: "width", propvalue: v.getAttribute('width')},
  306. {display: "field宽度(%)", property: "fieldwidth", propvalue: v.getAttribute('fieldwidth')},
  307. {display: "value宽度(%)", property: "valuewidth", propvalue: v.getAttribute('valuewidth')},
  308. {display: "换行", property: "fill", propvalue: v.getAttribute('fill')},
  309. {display: "field-style", property: "fieldstyle", propvalue: v.getAttribute('fieldstyle')},
  310. {display: "value-style", property: "valuestyle", propvalue: v.getAttribute('valuestyle')},
  311. {display: "显示", property: "rendername", propvalue: v.getAttribute('rendername')});
  312. }else if(nodeName == 'grid') {
  313. propfields.push({display: "宽度", property: "width", propvalue: v.getAttribute('width')},
  314. {display: "排序", property: "sort", propvalue: v.getAttribute('sort')},
  315. {display: "列头样式", property: "headerrowstyle", propvalue: v.getAttribute('headerrowstyle')},
  316. {display: "列样式", property: "rowstyle", propvalue: v.getAttribute('rowstyle')},
  317. {display: "显示", property: "rendername", propvalue: v.getAttribute('rendername')},
  318. {display: "数据绑定", property: "dataindex", propvalue: v.getAttribute('dataindex')},
  319. {display: "值(仅作展示)", property: "data", propvalue: v.getAttribute('data')}/*,
  320. {display: "变量名", property: "value", propvalue: v.getAttribute('value')}*/);
  321. }else {
  322. }
  323. var propconfig = propfields;
  324. detailData.push({
  325. fieldid: "",
  326. fieldname: v.getAttribute('name'),
  327. fieldvalue: "",
  328. propconfig: propconfig
  329. })
  330. }
  331. var baseConfigFormValue = {
  332. titletext: ch.getAttribute('titletext'),
  333. titlestyle: ch.getAttribute('titlestyle'),
  334. /*allcls: ch.getAttribute('allcls'),*/
  335. headerrowsstyle: ch.getAttribute('headerrowsstyle'),
  336. rowsstyle: ch.getAttribute('rowsstyle'),
  337. allrender: ch.getAttribute('allrender'),
  338. interval: ch.getAttribute('interval'),
  339. pagesize: ch.getAttribute('pagesize'),
  340. sql: ch.getAttribute('sql'),
  341. fieldstyle: ch.getAttribute('fieldstyle'),
  342. valuestyle: ch.getAttribute('valuestyle'),
  343. fields: ch.getAttribute('fields'),
  344. maintitle: ch.getAttribute('maintitle'),
  345. subtitle: ch.getAttribute('subtitle'),
  346. xfields: ch.getAttribute('xfields'),
  347. xtitle: ch.getAttribute('xtitle'),
  348. xtype: ch.getAttribute('xtype'),
  349. xvalue: ch.getAttribute('xvalue'),
  350. ytitle: ch.getAttribute('ytitle'),
  351. ytype: ch.getAttribute('ytype'),
  352. field: ch.getAttribute('field'),
  353. value: ch.getAttribute('value'),
  354. x:x,
  355. y:y,
  356. width:width,
  357. height:height
  358. };
  359. for(var key in baseConfigFormValue) {
  360. if(baseConfigFormValue[key] == null) {
  361. delete baseConfigFormValue[key]
  362. }
  363. }
  364. jsonObj.push({
  365. type: nodeName,
  366. x: x,
  367. y: y,
  368. width: width,
  369. height: height,
  370. detailData: detailData,
  371. baseConfigFormValue: baseConfigFormValue
  372. });
  373. }
  374. return jsonObj;
  375. }
  376. });