FormUtil.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. Ext.define('school.util.FormUtil', {
  2. statics: {
  3. setItems: function(form) {
  4. let me = this,
  5. defaultItems = form.defaultItems;
  6. return new Ext.Promise(function (resolve, reject) {
  7. let items = [];
  8. items = me.applyItemsGroup(defaultItems || []);
  9. items = me.initItems(items);
  10. form.configItems = items;
  11. items = me.applyDefaultItems(form, items);
  12. return resolve(items);
  13. }).then(function(items) {
  14. form.removeAll();
  15. form.addItems(items);
  16. return items;
  17. }).then(function(items) {
  18. form.fireEvent('afterSetItems', form, items);
  19. }).then(function() {
  20. me.loadData(form);
  21. }).catch(function(e) {
  22. school.util.BaseUtil.showErrorToast(e.message);
  23. });
  24. },
  25. applyItemsGroup: function(items) {
  26. let groups = [],
  27. groupCount = 0,
  28. newItems = [];
  29. Ext.Array.each(items, function(it, index) {
  30. let item = Object.assign({}, it),
  31. groupName = item.group;
  32. if(!!groupName) {
  33. let idx = groups.findIndex(function(g) {
  34. return g.title == groupName;
  35. }),group;
  36. if(idx == -1) {
  37. group = {
  38. title: groupName,
  39. count: 1
  40. };
  41. groups.push(group);
  42. }else {
  43. group = groups[idx];
  44. group.count++;
  45. }
  46. }
  47. newItems.push(item);
  48. });
  49. Ext.Array.sort(newItems, function(a, b) {
  50. let gs = groups.concat([{
  51. title: '_nogroup'
  52. }]);
  53. a.group = a.group || '_nogroup';
  54. let v1 = gs.findIndex(function(g) {
  55. return g.title == a.group;
  56. })
  57. let v2 = gs.findIndex(function(g) {
  58. return g.title == b.group;
  59. })
  60. return v1 - v2;
  61. });
  62. Ext.Array.each(groups, function(g) {
  63. let idx = newItems.findIndex(function(i) {
  64. return i.group == g.title;
  65. });
  66. g.index = idx;
  67. });
  68. Ext.Array.each(groups, function(group, index) {
  69. let formIndex = group.index;
  70. delete group.index;
  71. Ext.Array.insert(newItems, formIndex + index, [{
  72. xtype: 'separatefield',
  73. name: 'group' + (++groupCount),
  74. html: group.title,
  75. fieldLabel: group.title || '分组' + groupCount
  76. }]);
  77. });
  78. return newItems;
  79. },
  80. initItems: function(items) {
  81. let itemCount = detailCount = 1, newItems = [];
  82. Ext.Array.each(items, function(it, i) {
  83. let item = Object.assign({}, it);
  84. if(item.xtype == 'detailGridField') {
  85. let columns = item.columns,
  86. colCount = 1;
  87. Ext.Array.each(columns, function(col, j) {
  88. if((col.hidden || col.width == 0 || !col.dataIndex) && (!col.hasOwnProperty('initHidden') || col.initHidden)) {
  89. Ext.applyIf(col, {
  90. index: -1,
  91. initHidden: true
  92. });
  93. }else {
  94. Ext.applyIf(col, {
  95. text: '',
  96. hidden: false,
  97. index: colCount++,
  98. allowBlank: true,
  99. width: 100,
  100. initHidden: false
  101. });
  102. }
  103. });
  104. if(!columns[columns.length - 1].flex) {
  105. columns.push({
  106. dataIndex: '',
  107. initHidden: true,
  108. flex: 1,
  109. allowBlank: true
  110. });
  111. }
  112. Ext.applyIf(item, {
  113. allowBlank: false,
  114. columnWidth: 1,
  115. gname: 'detail' + detailCount,
  116. fieldLabel: '从表' + (detailCount++),
  117. });
  118. }else if(item.xtype == 'hidden') {
  119. Ext.applyIf(item, {
  120. fieldLabel: '',
  121. hidden: true,
  122. initHidden: true,
  123. });
  124. }else if(item.xtype == 'separatefield') {
  125. Ext.applyIf(item, {
  126. fieldLabel: item.html,
  127. columnWidth: 1,
  128. });
  129. }else {
  130. Ext.applyIf(item, {
  131. fieldLabel: '',
  132. columnWidth: 0.25,
  133. });
  134. }
  135. if(item.hidden) {
  136. if(item.initHidden || !item.hasOwnProperty('initHidden')) {
  137. Ext.applyIf(item, {
  138. index: -1,
  139. initHidden: true
  140. });
  141. }else {
  142. Ext.applyIf(item, {
  143. index: itemCount++,
  144. initHidden: false
  145. });
  146. }
  147. }else {
  148. Ext.applyIf(item, {
  149. index: itemCount++,
  150. initHidden: false
  151. });
  152. }
  153. Ext.applyIf(item, {
  154. name: 'item' + i,
  155. hidden: false,
  156. allowBlank: true,
  157. group: undefined,
  158. });
  159. newItems.push(item);
  160. });
  161. Ext.Array.sort(newItems, function(a, b) {
  162. return a.index - b.index;
  163. });
  164. return newItems;
  165. },
  166. /**
  167. * 处理formitems的一些默认配置
  168. */
  169. applyDefaultItems: function(form, items) {
  170. let me = this,
  171. formModel = form.getViewModel();
  172. Ext.Array.each(items, function(item) {
  173. // 设置必填
  174. if(item.allowBlank==false){
  175. // TODO 需要判断类型
  176. item.beforeLabelTextTpl = "<font color=\"red\" style=\"position:relative; top:2px;right:2px; font-weight: bolder;\">*</font>";
  177. }
  178. if(item.xtype == 'textfield') {
  179. Ext.applyIf(item, {
  180. maxLength: 50
  181. });
  182. }else if(item.xtype == 'datefield') {
  183. Ext.applyIf(item, {
  184. editable: false,
  185. format: 'Y-m-d'
  186. });
  187. }else if(item.xtype == 'numberfield') {
  188. Ext.applyIf(item, {
  189. hideTrigger: true, // 隐藏trigger
  190. mouseWheelEnabled: false // 取消滚轮事件
  191. });
  192. // 设置默认值为0
  193. formModel.set(item.name, 0);
  194. }else if(item.xtype == 'condbfindtrigger') {
  195. item.isConField = true;
  196. }else if(item.xtype == 'detailGridField') {
  197. let index = form.detailCount;
  198. let columns = item.columns,
  199. cnames = columns.filter(function(c) {
  200. return (c.dataIndex && !c.ignore) || (c.getBindField && typeof c.getBindField == 'function' && !c.ignore);
  201. }).map(function(c) {
  202. return c.getBindField ? c.getBindField(c) : c.dataIndex;
  203. }),
  204. defaultValueColumns = {};
  205. Ext.Array.each(columns, function(c) {
  206. if(c.dataIndex && c.defaultValue) {
  207. defaultValueColumns[c.dataIndex] = c.defaultValue;
  208. }
  209. // 不可锁定
  210. Ext.applyIf(c, {
  211. lockable: false,
  212. width: 120
  213. });
  214. //必填
  215. Ext.applyIf(c, {
  216. allowBlank: true
  217. });
  218. if(!c.allowBlank){
  219. c.cls = 'x-grid-necessary';
  220. }
  221. if(c.xtype == 'textfield') {
  222. Ext.applyIf(c, {
  223. maxLength: 50
  224. });
  225. }else if(c.xtype == 'datecolumn') {
  226. Ext.applyIf(c, {
  227. format: 'Y-m-d'
  228. });
  229. }else if(c.xtype == 'numbercolumn') {
  230. Ext.applyIf(c, {
  231. align: 'end'
  232. });
  233. }
  234. let editor = c.editor;
  235. if(editor) {
  236. Ext.applyIf(editor, {
  237. selectOnFocus: true
  238. });
  239. if(editor.xtype == 'numberfield') {
  240. Ext.applyIf(editor, {
  241. hideTrigger: true, // 隐藏trigger
  242. mouseWheelEnabled: false // 取消滚轮事件
  243. });
  244. }else if(editor.xtype == 'datefield') {
  245. Ext.apply(editor, {
  246. format: 'Y-m-d'
  247. });
  248. Ext.applyIf(editor, {
  249. editable: false
  250. });
  251. }
  252. }
  253. });
  254. let tempCnames = [];
  255. for(let i = cnames.length-1; i >=0 ; i--) {
  256. if(Ext.isArray(cnames[i])) {
  257. cnames[i].map(function(c) {
  258. tempCnames.push(c);
  259. });
  260. cnames.splice(i, 1);
  261. }
  262. }
  263. tempCnames.map(function(t) {
  264. cnames.push(t);
  265. });
  266. cnames.push(item.detnoColumn);
  267. formModel.set('detail' + index + '.detailBindFields', cnames);
  268. item.bind = {
  269. store: '{detail' + index + '.detailStore}'
  270. };
  271. formModel.set('detail' + index + '.detailStore', Ext.create('Ext.data.Store', {
  272. model:item.storeModel,
  273. data: [],
  274. listeners: {
  275. datachanged: function(s, eOpts) {
  276. let g = form.query('detailGridField')[index];
  277. g.fireEvent('datachanged', g, s, eOpts);
  278. },
  279. // 为新增行设置默认值
  280. add: function(store, records, index, eOpts) {
  281. Ext.Array.each(records, function(r) {
  282. for(k in defaultValueColumns) {
  283. r.set(k, defaultValueColumns[k]);
  284. }
  285. r.commit();
  286. });
  287. }
  288. }
  289. }));
  290. form.detailCount++;
  291. }
  292. });
  293. return items;
  294. },
  295. loadData: function(form) {
  296. let me = this;
  297. form.setLoading(true);
  298. if(form.initId && form.initId!=0) {
  299. let url = form._readUrl + '/' + form.initId;
  300. return school.util.BaseUtil.request({url })
  301. .then(function(res) {
  302. form.setLoading(false);
  303. if(res.success) {
  304. let d = res.data;
  305. let o = {
  306. main: d.main || d // 返回数据可能没有主从表格式
  307. };
  308. if(d.hasOwnProperty('items')) {
  309. o.detail0 = d.items;
  310. }else {
  311. let idx = 1;
  312. while(d.hasOwnProperty('items' + idx)) {
  313. o['detail' + (idx - 1)] = d['items' + idx];
  314. idx++;
  315. }
  316. }
  317. form.initFormData(o);
  318. form.fireEvent('load', form, o);
  319. return o;
  320. }
  321. })
  322. .catch(function(e) {
  323. form.setLoading(false);
  324. school.util.BaseUtil.showErrorToast('读取单据数据错误: ' + e.message);
  325. });
  326. }else {
  327. return new Ext.Promise(function (resolve, reject) {
  328. form.setLoading(false);
  329. let viewModel = form.getViewModel();
  330. let detailGrids = form.query('detailGridField');
  331. let o = {};
  332. let formData = {main: {}};
  333. Ext.apply(formData.main, o);
  334. Ext.Array.each(detailGrids, function(grid, index) {
  335. let detno = 0;
  336. let detnoColumn = grid.detnoColumn;
  337. let datas = [];
  338. let emptyRows = grid.emptyRows;
  339. Ext.Array.each(new Array(emptyRows), function() {
  340. detno += 1;
  341. let data = {};
  342. data[detnoColumn] = detno;
  343. datas.push(data);
  344. })
  345. formData['detail' + index] = datas;
  346. });
  347. return resolve(formData);
  348. })
  349. .then(function(formData) {
  350. let initData = form.initData;
  351. if(initData) {
  352. Ext.apply(initData.main, formData.main);
  353. form.setFormData(initData);
  354. form.fireEvent('load', form, initData);
  355. }else {
  356. form.initFormData(formData);
  357. form.fireEvent('load', form, formData);
  358. }
  359. })
  360. .catch(function(e) {
  361. school.util.BaseUtil.showErrorToast(e.message);
  362. });
  363. }
  364. }
  365. }
  366. });