FormUtil.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. Ext.define('saas.util.FormUtil', {
  2. statics: {
  3. // 请求页面组件接口模板
  4. baseUrl: '/api/ui/co_view/config?name={viewName}',
  5. // 模板替换正则
  6. urlRe: /(.*){viewName}(.*)/g,
  7. setItems: function(form) {
  8. var me = this,
  9. defaultItems = form.defaultItems;
  10. me.applyCusItemConfig(form)
  11. .then(function(res) {
  12. if(res.success) {
  13. var config = res.data || true, items = defaultItems || [];
  14. if(config) {
  15. var cusItems = config.items || [];
  16. Ext.Array.each(cusItems, function(cusItem) {
  17. var item = items.find(function(item) {
  18. return item.name == cusItem.name;
  19. });
  20. Ext.apply(item, cusItem);
  21. });
  22. items = me.applyDefaultItems(form, items);
  23. }
  24. form.removeAll();
  25. return form.addItems(items);
  26. }else {
  27. return []
  28. }
  29. })
  30. .then(function(items) {
  31. form.fireEvent('afterSetItems', form, items);
  32. })
  33. .then(function() {
  34. me.loadData(form);
  35. })
  36. .catch(function(response) {
  37. saas.util.BaseUtil.showErrorToast('加载数据错误:' + response.message);
  38. console.error(response);
  39. });
  40. },
  41. /**
  42. * 获得form的客户自定义字段配置
  43. * @param form: form组件
  44. * @param url: url
  45. */
  46. applyCusItemConfig: function(form) {
  47. var me = this,
  48. viewName = form.viewName,
  49. defaultItems = form.defaultItems,
  50. url = me.baseUrl.replace(me.urlRe, '$1' + viewName);
  51. return saas.util.BaseUtil.request({url, async: false});
  52. },
  53. /**
  54. * 处理formitems的一些默认配置
  55. */
  56. applyDefaultItems: function(form, items) {
  57. var me = this,
  58. formModel = form.getViewModel();
  59. Ext.Array.each(items, function(item) {
  60. // 设置必填
  61. if(item.allowBlank==false){
  62. // TODO 需要判断类型
  63. item.beforeLabelTextTpl = "<font color=\"red\" style=\"position:relative; top:2px;right:2px; font-weight: bolder;\">*</font>";
  64. }
  65. if(item.xtype == 'textfield') {
  66. Ext.applyIf(item, {
  67. maxLength: 50
  68. });
  69. }
  70. if(item.xtype == 'datefield') {
  71. Ext.applyIf(item, {
  72. editable: false,
  73. format: 'Y-m-d'
  74. });
  75. }
  76. if(item.xtype == 'numberfield') {
  77. Ext.applyIf(item, {
  78. hideTrigger: true, // 隐藏trigger
  79. mouseWheelEnabled: false // 取消滚轮事件
  80. });
  81. // 设置默认值为0
  82. formModel.set(item.name, 0);
  83. }
  84. // 如果是从表为其绑定store
  85. if(item.xtype == 'detailGridField') {
  86. var index = form.detailCount;
  87. var columns = item.columns,
  88. cnames = columns.filter(function(c) {
  89. return c.dataIndex && !c.ignore;
  90. }).map(function(c) {
  91. return c.dataIndex
  92. }),
  93. defaultValueColumns = {};
  94. Ext.Array.each(columns, function(c) {
  95. if(c.dataIndex && c.defaultValue) {
  96. defaultValueColumns[c.dataIndex] = c.defaultValue;
  97. }
  98. // 不可锁定
  99. Ext.applyIf(c, {
  100. lockable: false,
  101. width: 120
  102. });
  103. //必填
  104. Ext.applyIf(c, {
  105. allowBlank: true
  106. });
  107. if(!c.allowBlank){
  108. c.cls = 'x-grid-necessary';
  109. }
  110. if(c.xtype == 'textfield') {
  111. Ext.applyIf(c, {
  112. maxLength: 50
  113. });
  114. }else if(c.xtype == 'datecolumn') {
  115. Ext.applyIf(c, {
  116. format: 'Y-m-d'
  117. });
  118. }else if(c.xtype == 'numbercolumn') {
  119. Ext.applyIf(c, {
  120. align: 'end'
  121. });
  122. }
  123. var editor = c.editor;
  124. if(editor) {
  125. Ext.applyIf(editor, {
  126. selectOnFocus: true
  127. });
  128. if(editor.xtype == 'numberfield') {
  129. Ext.applyIf(editor, {
  130. hideTrigger: true, // 隐藏trigger
  131. mouseWheelEnabled: false // 取消滚轮事件
  132. });
  133. }else if(editor.xtype == 'datefield') {
  134. Ext.apply(editor, {
  135. format: 'Y-m-d'
  136. });
  137. Ext.applyIf(editor, {
  138. editable: false
  139. });
  140. }
  141. }
  142. });
  143. if(columns[columns.length - 1].flex != 1) {
  144. columns.push({
  145. flex: 1,
  146. allowBlank: true
  147. });
  148. }
  149. cnames.push(item.detnoColumn);
  150. formModel.set('detail' + index + '.detailBindFields', cnames);
  151. item.bind = {
  152. store: '{detail' + index + '.detailStore}'
  153. };
  154. formModel.set('detail' + index + '.detailStore', Ext.create('Ext.data.Store', {
  155. model:item.storeModel,
  156. data: [],
  157. listeners: {
  158. add: function(store, records, index, eOpts) {
  159. Ext.Array.each(records, function(r) {
  160. for(k in defaultValueColumns) {
  161. r.set(k, defaultValueColumns[k]);
  162. }
  163. r.commit();
  164. });
  165. }
  166. }
  167. }));
  168. form.detailCount++;
  169. }
  170. });
  171. return items;
  172. },
  173. loadData: function(form) {
  174. var me = this;
  175. form.setLoading(true);
  176. if(form.initId && form.initId!=0) {
  177. var url = form._readUrl + '/' + form.initId;
  178. saas.util.BaseUtil.request({url })
  179. .then(function(res) {
  180. form.setLoading(false);
  181. if(res.success) {
  182. var d = res.data;
  183. var o = {
  184. main: d.main
  185. };
  186. if(d.hasOwnProperty('items')) {
  187. o.detail0 = d.items;
  188. }else {
  189. var idx = 1;
  190. while(d.hasOwnProperty('items' + idx)) {
  191. o['detail' + (idx - 1)] = d['items' + idx];
  192. idx++;
  193. }
  194. }
  195. form.initFormData(o);
  196. form.fireEvent('load', form, o);
  197. }
  198. })
  199. .catch(function(response) {
  200. form.setLoading(false);
  201. console.error(response);
  202. });
  203. }else{
  204. //取后台编号
  205. saas.util.BaseUtil.request({
  206. url: '/api/commons/number/getMaxnumber',
  207. headers: {
  208. "Content-Type": 'application/x-www-form-urlencoded;charset=UTF-8'
  209. },
  210. params: {
  211. caller:form.caller
  212. },
  213. method: 'POST',
  214. }).then(function(res) {
  215. form.setLoading(false);
  216. if(res.success){
  217. var code = res.data;
  218. var viewModel = form.getViewModel();
  219. var detailGrids = form.query('detailGridField');
  220. if(code){
  221. var o = {};
  222. o[form._codeField] = code;
  223. var formData = {main: {}};
  224. Ext.apply(formData.main, o);
  225. Ext.Array.each(detailGrids, function(grid, index) {
  226. var detno = 0;
  227. var detnoColumn = grid.detnoColumn;
  228. var datas = [];
  229. var emptyRows = grid.emptyRows;
  230. Ext.Array.each(new Array(emptyRows), function() {
  231. detno += 1;
  232. var data = {};
  233. data[detnoColumn] = detno;
  234. datas.push(data);
  235. })
  236. formData['detail' + index] = datas;
  237. });
  238. return formData;
  239. }else {
  240. throw new Error('请求单据编号错误');
  241. }
  242. }else {
  243. return {
  244. main: {},
  245. }
  246. }
  247. }).then(function(formData) {
  248. var initData = form.initData;
  249. if(initData) {
  250. Ext.apply(initData.main, formData.main);
  251. form.setFormData(initData);
  252. }else {
  253. form.initFormData(formData);
  254. }
  255. }).catch(function(res) {
  256. saas.util.BaseUtil.showErrorToast(res.message);
  257. form.setLoading(false);
  258. })
  259. }
  260. }
  261. }
  262. });