board.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  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. ],
  10. stores:['component'],
  11. init:function(){
  12. var me = this;
  13. me.formIndex = 1;
  14. var formIndex = 1;
  15. var gridIndex = 1;
  16. this.control({
  17. 'modelbuilderpanel':{
  18. afterrender: function(view) {
  19. var grid = Ext.getCmp('modeltree');
  20. grid.loadGridData();
  21. },
  22. afterlayout: function(view) {
  23. // 如果不是第一次进入界面则直接退出
  24. if(window.f == 1) {
  25. return;
  26. }
  27. window.f = 1;
  28. view.getEl().mask('loading...');
  29. Ext.Ajax.request({
  30. url:'kanban/get/' + modelCode,
  31. method:'POST',
  32. callback:function(options,success,response){
  33. view.getEl().unmask();
  34. var record = JSON.parse(response.responseText);
  35. try {
  36. view.modelRecord = record;
  37. record.get = function(key) {
  38. return this[key];
  39. };
  40. record.set = function(key, value) {
  41. this[key] = value;
  42. };
  43. view.fireEvent('repaintcomponent', view, record);
  44. }catch(e) {
  45. Ext.Msg.alert(e.name, e.message)
  46. }
  47. }
  48. });
  49. },
  50. repaintcomponent:function(view, record){
  51. var builderPanel = Ext.getCmp('modelbuilderpanel');
  52. var editPanel = Ext.getCmp('modeleditpanel');
  53. if(builderPanel.items.items.length > 0) {
  54. builderPanel.removeAll();
  55. Ext.getCmp('elementdetailgrid').getStore().removeAll();
  56. Ext.getCmp('detailpropertiesgrid').getStore().removeAll();
  57. Ext.getCmp('baseConfigForm').removeAll(true);
  58. builderPanel.currenSelectPanel = null;
  59. me.repaint(record);
  60. }else {
  61. me.repaint(record);
  62. }
  63. view.setButtonDisabled(false);
  64. },
  65. beforeaddpanel:function(panel, config){
  66. },
  67. afteraddpanel: function(panel, component) {
  68. me.setCmpPosition(panel,component);
  69. },
  70. add:function(self,component){
  71. self.fireEvent('changepanel',self,component);
  72. },
  73. changepanel:function(self,newPanel){
  74. var currentPanel = self.currenSelectPanel;
  75. if(currentPanel!=null&&currentPanel.id!=newPanel.id){
  76. currentPanel.removeCls('select-panel');
  77. newPanel.addCls('select-panel');
  78. currentPanel.fireEvent('unselectpanel',currentPanel,self);
  79. newPanel.fireEvent('selectpanel',newPanel,self);
  80. }else if(currentPanel==null){
  81. newPanel.addCls('select-panel');
  82. newPanel.fireEvent('selectpanel',newPanel,self);
  83. }
  84. self.currenSelectPanel = newPanel;
  85. self.change = true;
  86. }
  87. },
  88. 'elementconfigpanel button[id=detailDelete]':{
  89. click:function(btn){
  90. var builderPanel = Ext.getCmp('modelbuilderpanel');
  91. var currenSelectPanel = builderPanel.currenSelectPanel;
  92. var detailGrid = Ext.getCmp('elementdetailgrid');
  93. if(currenSelectPanel==null){
  94. Ext.Msg.alert('提示','请先添加Panel!');
  95. }else{
  96. var detailGrid = Ext.getCmp('elementdetailgrid');
  97. var detailSelect = detailGrid.getSelectionModel().getSelection()[0];
  98. if(!detailSelect){
  99. Ext.Msg.alert('提示','请先选择字段!');
  100. }else{
  101. currenSelectPanel.fireEvent('fielddelete',currenSelectPanel,detailSelect);
  102. detailGrid.getStore().remove(detailSelect);
  103. Ext.getCmp('detailpropertiesgrid').getStore().removeAll();
  104. }
  105. }
  106. }
  107. },
  108. 'elementconfigpanel button[id=detailAdd]':{
  109. click:function(btn){
  110. var builderPanel = Ext.getCmp('modelbuilderpanel');
  111. var currenSelectPanel = builderPanel.currenSelectPanel;
  112. var detailGrid = Ext.getCmp('elementdetailgrid');
  113. if(currenSelectPanel==null){
  114. Ext.Msg.alert('提示','请先添加Panel!');
  115. }else{
  116. currenSelectPanel.fireEvent('addItem',currenSelectPanel,detailGrid);
  117. }
  118. }
  119. },
  120. 'elementdetailgrid':{
  121. edit:function(editor, e, eOpts){
  122. var rowIdx = e.rowIdx;
  123. var builderPanel = Ext.getCmp('modelbuilderpanel');
  124. var currenSelectPanel = builderPanel.currenSelectPanel;
  125. currenSelectPanel.fireEvent('fieldnamechange',currenSelectPanel,e.record,rowIdx);
  126. },
  127. select:function(grid,record,index,eOpts){
  128. var propertiesGrid = Ext.getCmp('detailpropertiesgrid');
  129. propertiesGrid.getStore().loadData(record.get('propconfig'));
  130. // 加载数据之后立即保存数据
  131. var detailSelect = grid.getSelection()[0];
  132. detailSelect.set('propconfig',me.getPropConfigByRecord(propertiesGrid.store.data.items));
  133. }
  134. },
  135. 'detailpropertiesgrid combo[id=propCombo]':{
  136. select:function(combo,records){
  137. var detailGrid = Ext.getCmp('elementdetailgrid');
  138. var detailSelect = detailGrid.getSelectionModel().getSelection()[0];
  139. if(detailSelect==null){
  140. Ext.Msg.alert('提示','请先选择字段!')
  141. }
  142. if(detailSelect!=null){
  143. var propGrid = Ext.getCmp('detailpropertiesgrid');
  144. propGrid.getStore().loadData([{
  145. property:records[0].get('name'),
  146. //propvalue:records[0].get('value')
  147. }],true);
  148. }
  149. }
  150. },
  151. 'detailpropertiesgrid':{
  152. edit:function(editor, e, eOpts){
  153. var rowIdx = e.rowIdx;
  154. var detailGrid = Ext.getCmp('elementdetailgrid');
  155. var detailSelect = detailGrid.getSelectionModel().getSelection()[0];
  156. detailSelect.set('propconfig',me.getPropConfigByRecord(e.store.data.items));
  157. var builderPanel = Ext.getCmp('modelbuilderpanel');
  158. var currenSelectPanel = builderPanel.currenSelectPanel;
  159. currenSelectPanel.fireEvent('fieldpropchange',currenSelectPanel,detailSelect,rowIdx);
  160. },
  161. celldblclick: function (gridview, colEl, colIndex, record, rowEl, rowIndex, e, eOpts) {
  162. var grid = gridview.up('grid');
  163. var column = grid.columnManager.columns[1];
  164. var builderPanel = Ext.getCmp('modelbuilderpanel');
  165. var currenSelectPanel = builderPanel.currenSelectPanel;
  166. var propconfig = currenSelectPanel.config.propGridDefault.propconfig;
  167. for(var i = 0; i < propconfig.length; i++) {
  168. if(propconfig[i].property == record.get('property')) {
  169. record.set('editor', propconfig[i].editor)
  170. }
  171. }
  172. var startTime ={
  173. xtype: record.get('editor') || 'textfield'
  174. };
  175. column.setEditor(startTime);
  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: "width", propvalue: v.getAttribute('width')},
  305. {display: "变量名", property: "value", propvalue: v.getAttribute('value')},
  306. {display: "field-style", property: "fieldstyle", propvalue: v.getAttribute('fieldstyle')},
  307. {display: "value-style", property: "valuestyle", propvalue: v.getAttribute('valuestyle')},
  308. {display: "显示", property: "rendername", propvalue: v.getAttribute('rendername')});
  309. }else if(nodeName == 'grid') {
  310. propfields.push({display: "宽度", property: "width", propvalue: v.getAttribute('width')},
  311. {display: "排序", property: "sort", propvalue: v.getAttribute('sort')},
  312. {display: "列头样式", property: "headerrowstyle", propvalue: v.getAttribute('headerrowstyle')},
  313. {display: "列样式", property: "rowstyle", propvalue: v.getAttribute('rowstyle')},
  314. {display: "显示", property: "rendername", propvalue: v.getAttribute('rendername')},
  315. {display: "数据绑定", property: "dataindex", propvalue: v.getAttribute('dataindex')},
  316. {display: "值(仅作展示)", property: "data", propvalue: v.getAttribute('data')}/*,
  317. {display: "变量名", property: "value", propvalue: v.getAttribute('value')}*/);
  318. }else {
  319. }
  320. var propconfig = propfields;
  321. detailData.push({
  322. fieldid: "",
  323. fieldname: v.getAttribute('name'),
  324. fieldvalue: "",
  325. propconfig: propconfig
  326. })
  327. }
  328. var baseConfigFormValue = {
  329. titletext: ch.getAttribute('titletext'),
  330. titlestyle: ch.getAttribute('titlestyle'),
  331. /*allcls: ch.getAttribute('allcls'),*/
  332. headerrowsstyle: ch.getAttribute('headerrowsstyle'),
  333. rowsstyle: ch.getAttribute('rowsstyle'),
  334. allrender: ch.getAttribute('allrender'),
  335. interval: ch.getAttribute('interval'),
  336. pagesize: ch.getAttribute('pagesize'),
  337. sql: ch.getAttribute('sql'),
  338. fieldstyle: ch.getAttribute('fieldstyle'),
  339. valuestyle: ch.getAttribute('valuestyle'),
  340. fields: ch.getAttribute('fields'),
  341. maintitle: ch.getAttribute('maintitle'),
  342. subtitle: ch.getAttribute('subtitle'),
  343. xfields: ch.getAttribute('xfields'),
  344. xtitle: ch.getAttribute('xtitle'),
  345. xtype: ch.getAttribute('xtype'),
  346. xvalue: ch.getAttribute('xvalue'),
  347. ytitle: ch.getAttribute('ytitle'),
  348. ytype: ch.getAttribute('ytype'),
  349. field: ch.getAttribute('field'),
  350. value: ch.getAttribute('value'),
  351. x:x,
  352. y:y,
  353. width:width,
  354. height:height
  355. };
  356. for(var key in baseConfigFormValue) {
  357. if(baseConfigFormValue[key] == null) {
  358. delete baseConfigFormValue[key]
  359. }
  360. }
  361. jsonObj.push({
  362. type: nodeName,
  363. x: x,
  364. y: y,
  365. width: width,
  366. height: height,
  367. detailData: detailData,
  368. baseConfigFormValue: baseConfigFormValue
  369. });
  370. }
  371. return jsonObj;
  372. }
  373. });