templateeditpanel.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. Ext.define('erp.view.template.templateeditpanel',{
  2. extend:'Ext.panel.Panel',
  3. //title:'编辑区',
  4. id:'templateeditpanel',
  5. layout:'border',
  6. alias:'widget.templateeditpanel',
  7. style:'overflow:visible;',
  8. initComponent : function(){
  9. var me = this;
  10. Ext.apply(me, {
  11. items : [{
  12. xtype:'editcomponent',
  13. cls: 'components',
  14. region:'south'
  15. },{
  16. xtype:'templatebuilderpanel',
  17. region:'center'
  18. },{
  19. xtype:'elementconfigpanel',
  20. region:'east'
  21. }],
  22. tbar:[{
  23. xtype:'button',
  24. text:'保存',
  25. id:'saveBtn',
  26. scope:this,
  27. disabled:true,
  28. handler:function(){
  29. me.saveAsXml();
  30. }
  31. },{
  32. xtype:'button',
  33. text:'清空',
  34. id:'clearAllBtn',
  35. handler:me.clearAll,
  36. disabled:true
  37. },{
  38. xtype:'button',
  39. text:'模板设置',
  40. id:'tplSetBtn',
  41. handler:me.setTemplateConfig,
  42. disabled:true
  43. },{
  44. xtype:'button',
  45. text:'导出',
  46. //disabled:true,
  47. handler:function(){
  48. me.exportXml();
  49. }
  50. },{
  51. xtype:'button',
  52. text:'导入',
  53. disabled:true,
  54. handler:function(){
  55. me.importXml();
  56. }
  57. }]
  58. });
  59. me.callParent(arguments);
  60. },
  61. importXml:function(){
  62. var me = this;
  63. Ext.create('Ext.window.Window',{
  64. title:'导入',
  65. width:500,
  66. height:500,
  67. layout:'fit',
  68. modal:true,
  69. id:'importWin',
  70. items:[{
  71. xtype:'textarea',
  72. id:'xmlContent',
  73. grow:true,
  74. listeners:{
  75. afterrender:function(cmp){
  76. cmp.getEl().set({
  77. 'spellcheck': 'false'
  78. });
  79. }
  80. }
  81. }],
  82. buttons:[{
  83. text:'确定',
  84. handler:function(){
  85. me.editPanelRepaint();
  86. }
  87. }]
  88. }).show();
  89. },
  90. editPanelRepaint:function(){
  91. var me = this;
  92. var templateList = Ext.getCmp('templatetree');
  93. var record = templateList.getSelectionModel().getSelection()[0];
  94. if(!record){
  95. Ext.Msg.alert('提示','请先选择模板!')
  96. }else{
  97. var xml = Ext.getCmp('xmlContent').value;
  98. if(!xml){
  99. Ext.Msg.alert('提示','请先输入内容');
  100. }else{
  101. var bol = me.validateXmlFormat(xml);
  102. if(!bol){
  103. return;
  104. }
  105. record.set('content',xml);
  106. templateList.fireEvent('repaintcomponent',templateList,record);
  107. Ext.getCmp('importWin').close();
  108. }
  109. }
  110. },
  111. validateXmlFormat:function(xml){
  112. if(DOMParser){
  113. var parser = new DOMParser(),
  114. xmldom,
  115. errors;
  116. try {
  117. xmldom = parser.parseFromString(xml, "text/xml");
  118. errors = xmldom.getElementsByTagName("parsererror");
  119. if (errors.length > 0){
  120. throw new Error("XML Parsing Error:" + (new XMLSerializer()).serializeToString(xmldom, "text/xml"));
  121. }
  122. return true;
  123. } catch (ex) {
  124. Ext.Msg.alert('提示','XML格式有误:'+ex.message);
  125. return false;
  126. }
  127. }else{
  128. return true;
  129. }
  130. },
  131. exportXml:function(){
  132. var me = this;
  133. var builderPanel = Ext.getCmp('templatebuilderpanel');
  134. var items = builderPanel.items.items;
  135. var content = me.getComponentXml(items,builderPanel);
  136. var xml = me.formatXml(content);
  137. Ext.create('Ext.window.Window',{
  138. title:'导出',
  139. width:500,
  140. height:500,
  141. layout:'fit',
  142. modal:true,
  143. items:[{
  144. xtype:'textarea',
  145. grow:true,
  146. value:xml,
  147. listeners:{
  148. afterrender:function(cmp){
  149. cmp.getEl().set({
  150. 'spellcheck': 'false'
  151. });
  152. }
  153. }
  154. }]
  155. }).show();
  156. },
  157. setTemplateConfig:function(){
  158. var record = Ext.getCmp('templatetree').getSelectionModel().getSelection()[0];
  159. var me = Ext.getCmp('templateeditpanel');
  160. var globalParams = me.getGlobalParams();
  161. var radios = me.parseGlobalParamToRadio(globalParams,record.get('globalParameterCodes'));
  162. var win = record.win;
  163. if(!win){
  164. win = Ext.create('Ext.window.Window',{
  165. title:'模板设置',
  166. width:580,
  167. height:500,
  168. modal:true,
  169. layout:'fit',
  170. id:'tplSet',
  171. items:[{
  172. xtype:'form',
  173. layout:'column',
  174. id:'tplSetForm',
  175. defaults:{
  176. margin:'5 5 5 5'
  177. },
  178. items:[{
  179. xtype:'textarea',
  180. fieldLabel:'标题',
  181. columnWidth:1,
  182. height:80,
  183. name:'title',
  184. value:record.get('title'),
  185. listeners:{
  186. afterrender:function(cmp){
  187. cmp.getEl().set({
  188. 'spellcheck': 'false'
  189. });
  190. }
  191. }
  192. },{
  193. xtype:'combo',
  194. columnWidth:0.75,
  195. fieldLabel:'数据源',
  196. name:'dataSourceCode',
  197. id:'dataSourceCode',
  198. //value:'UAS',
  199. editable:false,
  200. store:Ext.create('Ext.data.Store',{
  201. fields:['username','code','name'],
  202. proxy:{
  203. type:'ajax',
  204. url:'datasource/get',
  205. reader: {
  206. type: 'json',
  207. root: 'content'
  208. }
  209. },
  210. autoLoad: true,
  211. listeners:{
  212. load:function(){
  213. var combo = Ext.getCmp('dataSourceCode');
  214. combo.reset();
  215. combo.setValue(record.get('dataSourceCode'));
  216. }
  217. }
  218. }),
  219. queryMode: 'local',
  220. displayField: 'name',
  221. valueField: 'code'
  222. },{
  223. xtype:'fieldset',
  224. title:'公共参数',
  225. columnWidth:1,
  226. collapsible: true,
  227. layout:'column',
  228. defaults:{
  229. margin:'5 5 5 5',
  230. columnWidth:0.5,
  231. labelWidth:130
  232. },
  233. items:[{
  234. xtype:'checkboxgroup',
  235. columnWidth:1,
  236. layout:'column',
  237. defaults:{
  238. columnWidth:0.33
  239. },
  240. name:'globalParameterCodes',
  241. items:radios,
  242. vertical: false
  243. }]
  244. }],
  245. buttons:[{
  246. text:'确定',
  247. handler:function(btn){
  248. var form = Ext.getCmp('tplSetForm');
  249. var values = form.getForm().getValues();
  250. var me = Ext.getCmp('templateeditpanel');
  251. me.saveAsXml(values);
  252. }
  253. },{
  254. text:'取消',
  255. handler:function(btn){
  256. var win = Ext.getCmp('tplSet');
  257. win.close();
  258. }
  259. }]
  260. }]
  261. }).show();
  262. }
  263. },
  264. getGlobalParams:function(){
  265. var items = new Array();
  266. Ext.Ajax.request({
  267. url:'globalParameters/get',
  268. method:'get',
  269. async:false,
  270. callback:function(options,success,response){
  271. var res = Ext.decode(response.responseText);
  272. Ext.Array.each(res.content,function(param){
  273. var item = new Object();
  274. item.code = param.code;
  275. item.name = param.name;
  276. items.push(item);
  277. });
  278. }
  279. });
  280. return items;
  281. },
  282. parseGlobalParamToRadio:function(globalParameters,globalParameterCodes){
  283. var me = this;
  284. var items = new Array();
  285. var item;
  286. Ext.Array.each(globalParameters,function(param){
  287. item = new Object();
  288. item.boxLabel = param.name;
  289. item.name = 'globalParameterCodes';
  290. item.inputValue = param.code;
  291. items.push(item);
  292. if(globalParameterCodes&&globalParameterCodes.length>0){
  293. Ext.Array.each(globalParameterCodes,function(code){
  294. if(param.code==code){
  295. item.checked = true;
  296. }
  297. });
  298. }
  299. });
  300. return items;
  301. },
  302. saveAsXml:function(extraParams){
  303. var me = this;
  304. var builderPanel = Ext.getCmp('templatebuilderpanel');
  305. var items = builderPanel.items.items;
  306. if(items.length>0){
  307. var content = me.getComponentXml(items,builderPanel);
  308. me.save(content,extraParams);
  309. }else{
  310. Ext.Msg.alert('提示','未添加组件!');
  311. }
  312. },
  313. getComponentXml:function(items,builderPanel){
  314. var content = '<content>';
  315. Ext.Array.each(items,function(panel,index){
  316. if(builderPanel.currenSelectPanel&&builderPanel.currenSelectPanel.id==panel.id){
  317. panel.saveData(panel,builderPanel);
  318. }
  319. var xml = panel.getXmlString(panel);
  320. content += xml;
  321. });
  322. content += '</content>';
  323. return content;
  324. },
  325. save:function(content,extraParams){
  326. var templateTree = Ext.getCmp('templatetree');
  327. var record = templateTree.getSelectionModel().getSelection()[0];
  328. var templateCode = record.get('code');
  329. var json = {
  330. content:content
  331. };
  332. if(templateCode){
  333. type = 'updatePart';
  334. json.code = templateCode;
  335. }else{
  336. type = 'savePart';
  337. }
  338. if(extraParams){
  339. Ext.apply(json,extraParams);
  340. if(!extraParams.globalParameterCodes){
  341. json.globalParameterCodes = [];
  342. }
  343. }
  344. Ext.Ajax.request({
  345. url:'template/'+type,
  346. method:'POST',
  347. params:{
  348. json:Ext.encode(json)
  349. },
  350. callback:function(options,success,response){
  351. var res = response.responseText;
  352. Ext.Msg.alert('提示','保存成功!');
  353. var win = Ext.getCmp('tplSet');
  354. if(win){
  355. win.close();
  356. }
  357. }
  358. });
  359. },
  360. clearAll:function(){
  361. Ext.Msg.confirm('提示','是否确定清空所有组件?',function(btn){
  362. if(btn=='yes'){
  363. var me = Ext.getCmp('templateeditpanel');
  364. me.clear();
  365. }
  366. });
  367. },
  368. myFn:function(data){
  369. console.log(data);
  370. },
  371. clear:function(){
  372. var builderPanel = Ext.getCmp('templatebuilderpanel');
  373. builderPanel.removeAll();
  374. Ext.getCmp('elementdetailgrid').getStore().removeAll();
  375. Ext.getCmp('detailpropertiesgrid').getStore().removeAll();
  376. Ext.getCmp('baseConfigForm').removeAll(true);
  377. builderPanel.currenSelectPanel = null;
  378. },
  379. formatXml:function(xml) {
  380. var formatted = '';
  381. var reg = /(>)(<)(\/*)/g;
  382. xml = xml.replace(reg, '$1\r\n$2$3');
  383. var pad = 0;
  384. Ext.Array.each(xml.split('\r\n'), function(node, index) {
  385. var indent = 0;
  386. if (node.match( /.+<\/\w[^>]*>$/ )) {
  387. indent = 0;
  388. } else if (node.match( /^<\/\w/ )) {
  389. if (pad != 0) {
  390. pad -= 1;
  391. }
  392. } else if (node.match( /^<\w[^>]*[^\/]>.*$/ )) {
  393. indent = 1;
  394. } else {
  395. indent = 0;
  396. }
  397. var padding = '';
  398. for (var i = 0; i < pad; i++) {
  399. padding += ' ';
  400. }
  401. formatted += padding + node + '\r\n';
  402. pad += indent;
  403. });
  404. return formatted;
  405. }
  406. });