form.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _xeUtils = _interopRequireDefault(require("xe-utils"));
  7. var _conf = _interopRequireDefault(require("../../v-x-e-table/src/conf"));
  8. var _size = _interopRequireDefault(require("../../mixins/size"));
  9. var _vXETable = _interopRequireDefault(require("../../v-x-e-table"));
  10. var _tools = require("../../tools");
  11. var _util = require("./util");
  12. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  13. function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
  14. function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
  15. function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
  16. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  17. function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
  18. function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
  19. var Rule = /*#__PURE__*/function () {
  20. function Rule(rule) {
  21. _classCallCheck(this, Rule);
  22. Object.assign(this, {
  23. $options: rule,
  24. required: rule.required,
  25. min: rule.min,
  26. max: rule.min,
  27. type: rule.type,
  28. pattern: rule.pattern,
  29. validator: rule.validator,
  30. trigger: rule.trigger,
  31. maxWidth: rule.maxWidth
  32. });
  33. }
  34. _createClass(Rule, [{
  35. key: "message",
  36. get: function get() {
  37. return _tools.UtilTools.getFuncText(this.$options.message);
  38. }
  39. }]);
  40. return Rule;
  41. }();
  42. function getResetValue(value, resetValue) {
  43. if (_xeUtils.default.isArray(value)) {
  44. resetValue = [];
  45. }
  46. return resetValue;
  47. }
  48. function callSlot(_vm, slotFunc, params, h) {
  49. if (slotFunc) {
  50. var $scopedSlots = _vm.$scopedSlots;
  51. if (_xeUtils.default.isString(slotFunc)) {
  52. slotFunc = $scopedSlots[slotFunc] || null;
  53. }
  54. if (_xeUtils.default.isFunction(slotFunc)) {
  55. return slotFunc.call(_vm, params, h);
  56. }
  57. }
  58. return [];
  59. }
  60. function renderPrefixIcon(h, titlePrefix) {
  61. return h('span', {
  62. class: 'vxe-form--item-title-prefix'
  63. }, [h('i', {
  64. class: titlePrefix.icon || _conf.default.icon.FORM_PREFIX
  65. })]);
  66. }
  67. function renderSuffixIcon(h, titleSuffix) {
  68. return h('span', {
  69. class: 'vxe-form--item-title-suffix'
  70. }, [h('i', {
  71. class: titleSuffix.icon || _conf.default.icon.FORM_SUFFIX
  72. })]);
  73. }
  74. function renderTitle(h, _vm, item) {
  75. var data = _vm.data;
  76. var slots = item.slots,
  77. field = item.field,
  78. itemRender = item.itemRender,
  79. titlePrefix = item.titlePrefix,
  80. titleSuffix = item.titleSuffix;
  81. var compConf = (0, _tools.isEnableConf)(itemRender) ? _vXETable.default.renderer.get(itemRender.name) : null;
  82. var params = {
  83. data: data,
  84. property: field,
  85. item: item,
  86. $form: _vm
  87. };
  88. var tss = [];
  89. if (titlePrefix) {
  90. tss.push(titlePrefix.message ? h('vxe-tooltip', {
  91. props: {
  92. content: _tools.UtilTools.getFuncText(titlePrefix.message),
  93. enterable: titlePrefix.enterable,
  94. theme: titlePrefix.theme
  95. }
  96. }, [renderPrefixIcon(h, titlePrefix)]) : renderPrefixIcon(h, titlePrefix));
  97. }
  98. tss.push(h('span', {
  99. class: 'vxe-form--item-title-label'
  100. }, compConf && compConf.renderItemTitle ? compConf.renderItemTitle(itemRender, params) : slots && slots.title ? callSlot(_vm, slots.title, params, h) : _tools.UtilTools.getFuncText(item.title)));
  101. if (titleSuffix) {
  102. tss.push(titleSuffix.message ? h('vxe-tooltip', {
  103. props: {
  104. content: _tools.UtilTools.getFuncText(titleSuffix.message),
  105. enterable: titleSuffix.enterable,
  106. theme: titleSuffix.theme
  107. }
  108. }, [renderSuffixIcon(h, titleSuffix)]) : renderSuffixIcon(h, titleSuffix));
  109. }
  110. return tss;
  111. }
  112. function renderItems(h, _vm, itemList) {
  113. var _e = _vm._e,
  114. rules = _vm.rules,
  115. data = _vm.data,
  116. collapseAll = _vm.collapseAll,
  117. validOpts = _vm.validOpts,
  118. allTitleOverflow = _vm.titleOverflow;
  119. return itemList.map(function (item, index) {
  120. var slots = item.slots,
  121. title = item.title,
  122. folding = item.folding,
  123. visible = item.visible,
  124. visibleMethod = item.visibleMethod,
  125. field = item.field,
  126. collapseNode = item.collapseNode,
  127. itemRender = item.itemRender,
  128. showError = item.showError,
  129. errRule = item.errRule,
  130. className = item.className,
  131. titleOverflow = item.titleOverflow,
  132. children = item.children;
  133. var compConf = (0, _tools.isEnableConf)(itemRender) ? _vXETable.default.renderer.get(itemRender.name) : null;
  134. var span = item.span || _vm.span;
  135. var align = item.align || _vm.align;
  136. var titleAlign = item.titleAlign || _vm.titleAlign;
  137. var titleWidth = item.titleWidth || _vm.titleWidth;
  138. var itemVisibleMethod = visibleMethod;
  139. var itemOverflow = _xeUtils.default.isUndefined(titleOverflow) || _xeUtils.default.isNull(titleOverflow) ? allTitleOverflow : titleOverflow;
  140. var showEllipsis = itemOverflow === 'ellipsis';
  141. var showTitle = itemOverflow === 'title';
  142. var showTooltip = itemOverflow === true || itemOverflow === 'tooltip';
  143. var hasEllipsis = showTitle || showTooltip || showEllipsis;
  144. var params = {
  145. data: data,
  146. property: field,
  147. item: item,
  148. $form: _vm
  149. };
  150. var isRequired;
  151. if (visible === false) {
  152. return _e();
  153. } // 如果为项集合
  154. var isGather = children && children.length > 0;
  155. if (isGather) {
  156. var childVNs = renderItems(h, _vm, item.children);
  157. return childVNs.length ? h('div', {
  158. class: ['vxe-form--gather vxe-row', item.id, span ? "vxe-col--".concat(span, " is--span") : '', className ? _xeUtils.default.isFunction(className) ? className(params) : className : '']
  159. }, childVNs) : _e();
  160. }
  161. if (!itemVisibleMethod && compConf && compConf.itemVisibleMethod) {
  162. itemVisibleMethod = compConf.itemVisibleMethod;
  163. }
  164. if (rules) {
  165. var itemRules = rules[field];
  166. if (itemRules) {
  167. isRequired = itemRules.some(function (rule) {
  168. return rule.required;
  169. });
  170. }
  171. }
  172. var contentVNs = [];
  173. if (slots && slots.default) {
  174. contentVNs = callSlot(_vm, slots.default, params, h);
  175. } else if (compConf && compConf.renderItemContent) {
  176. contentVNs = compConf.renderItemContent.call(_vm, h, itemRender, params);
  177. } else if (compConf && compConf.renderItem) {
  178. contentVNs = compConf.renderItem.call(_vm, h, itemRender, params);
  179. } else if (field) {
  180. contentVNs = ["".concat(_xeUtils.default.get(data, field))];
  181. }
  182. var ons = showTooltip ? {
  183. mouseenter: function mouseenter(evnt) {
  184. _vm.triggerHeaderHelpEvent(evnt, params);
  185. },
  186. mouseleave: _vm.handleTargetLeaveEvent
  187. } : {};
  188. return h('div', {
  189. class: ['vxe-form--item', item.id, span ? "vxe-col--".concat(span, " is--span") : null, className ? _xeUtils.default.isFunction(className) ? className(params) : className : '', {
  190. 'is--title': title,
  191. 'is--required': isRequired,
  192. 'is--hidden': folding && collapseAll,
  193. 'is--active': !itemVisibleMethod || itemVisibleMethod(params),
  194. 'is--error': showError
  195. }],
  196. key: index
  197. }, [h('div', {
  198. class: 'vxe-form--item-inner'
  199. }, [title || slots && slots.title ? h('div', {
  200. class: ['vxe-form--item-title', titleAlign ? "align--".concat(titleAlign) : null, {
  201. 'is--ellipsis': hasEllipsis
  202. }],
  203. style: titleWidth ? {
  204. width: isNaN(titleWidth) ? titleWidth : "".concat(titleWidth, "px")
  205. } : null,
  206. attrs: {
  207. title: showTitle ? _tools.UtilTools.getFuncText(title) : null
  208. },
  209. on: ons
  210. }, renderTitle(h, _vm, item)) : null, h('div', {
  211. class: ['vxe-form--item-content', align ? "align--".concat(align) : null]
  212. }, contentVNs.concat([collapseNode ? h('div', {
  213. class: 'vxe-form--item-trigger-node',
  214. on: {
  215. click: _vm.toggleCollapseEvent
  216. }
  217. }, [h('span', {
  218. class: 'vxe-form--item-trigger-text'
  219. }, collapseAll ? _conf.default.i18n('vxe.form.unfolding') : _conf.default.i18n('vxe.form.folding')), h('i', {
  220. class: ['vxe-form--item-trigger-icon', collapseAll ? _conf.default.icon.FORM_FOLDING : _conf.default.icon.FORM_UNFOLDING]
  221. })]) : null, errRule && validOpts.showMessage ? h('div', {
  222. class: 'vxe-form--item-valid',
  223. style: errRule.maxWidth ? {
  224. width: "".concat(errRule.maxWidth, "px")
  225. } : null
  226. }, errRule.message) : null]))])]);
  227. });
  228. }
  229. var _default2 = {
  230. name: 'VxeForm',
  231. mixins: [_size.default],
  232. props: {
  233. loading: Boolean,
  234. data: Object,
  235. size: {
  236. type: String,
  237. default: function _default() {
  238. return _conf.default.form.size || _conf.default.size;
  239. }
  240. },
  241. span: [String, Number],
  242. align: {
  243. type: String,
  244. default: function _default() {
  245. return _conf.default.form.align;
  246. }
  247. },
  248. titleAlign: {
  249. type: String,
  250. default: function _default() {
  251. return _conf.default.form.titleAlign;
  252. }
  253. },
  254. titleWidth: [String, Number],
  255. titleColon: {
  256. type: Boolean,
  257. default: function _default() {
  258. return _conf.default.form.titleColon;
  259. }
  260. },
  261. titleAsterisk: {
  262. type: Boolean,
  263. default: function _default() {
  264. return _conf.default.form.titleAsterisk;
  265. }
  266. },
  267. titleOverflow: {
  268. type: [Boolean, String],
  269. default: null
  270. },
  271. items: Array,
  272. rules: Object,
  273. preventSubmit: {
  274. type: Boolean,
  275. default: function _default() {
  276. return _conf.default.form.preventSubmit;
  277. }
  278. },
  279. validConfig: Object
  280. },
  281. data: function data() {
  282. return {
  283. collapseAll: true,
  284. staticItems: [],
  285. formItems: [],
  286. tooltipTimeout: null,
  287. tooltipActive: false,
  288. tooltipStore: {
  289. item: null,
  290. visible: false
  291. }
  292. };
  293. },
  294. provide: function provide() {
  295. return {
  296. $xeform: this
  297. };
  298. },
  299. computed: {
  300. validOpts: function validOpts() {
  301. return Object.assign({}, _conf.default.form.validConfig, this.validConfig);
  302. },
  303. tooltipOpts: function tooltipOpts() {
  304. var opts = Object.assign({
  305. leaveDelay: 300
  306. }, _conf.default.form.tooltipConfig, this.tooltipConfig);
  307. if (opts.enterable) {
  308. opts.leaveMethod = this.handleTooltipLeaveMethod;
  309. }
  310. return opts;
  311. }
  312. },
  313. created: function created() {
  314. var _this = this;
  315. this.$nextTick(function () {
  316. var items = _this.items;
  317. if (items) {
  318. _this.loadItem(items);
  319. }
  320. });
  321. },
  322. watch: {
  323. staticItems: function staticItems(value) {
  324. this.formItems = value;
  325. },
  326. items: function items(value) {
  327. this.loadItem(value);
  328. }
  329. },
  330. render: function render(h) {
  331. var _ref;
  332. var _e = this._e,
  333. loading = this.loading,
  334. vSize = this.vSize,
  335. tooltipOpts = this.tooltipOpts,
  336. formItems = this.formItems;
  337. var hasUseTooltip = _vXETable.default._tooltip;
  338. return h('form', {
  339. class: ['vxe-form', (_ref = {}, _defineProperty(_ref, "size--".concat(vSize), vSize), _defineProperty(_ref, 'is--colon', this.titleColon), _defineProperty(_ref, 'is--asterisk', this.titleAsterisk), _defineProperty(_ref, 'is--loading', loading), _ref)],
  340. on: {
  341. submit: this.submitEvent,
  342. reset: this.resetEvent
  343. }
  344. }, [h('div', {
  345. class: 'vxe-form--wrapper vxe-row'
  346. }, renderItems(h, this, formItems)), h('div', {
  347. class: 'vxe-form-slots',
  348. ref: 'hideItem'
  349. }, this.$slots.default), h('div', {
  350. class: ['vxe-loading', {
  351. 'is--visible': loading
  352. }]
  353. }, [h('div', {
  354. class: 'vxe-loading--spinner'
  355. })]),
  356. /**
  357. * 工具提示
  358. */
  359. hasUseTooltip ? h('vxe-tooltip', _objectSpread({
  360. ref: 'tooltip'
  361. }, tooltipOpts)) : _e()]);
  362. },
  363. methods: {
  364. loadItem: function loadItem(list) {
  365. var _this2 = this;
  366. if (process.env.NODE_ENV === 'development') {
  367. var $scopedSlots = this.$scopedSlots;
  368. list.forEach(function (item) {
  369. if (item.slots) {
  370. _xeUtils.default.each(item.slots, function (func) {
  371. if (!_xeUtils.default.isFunction(func)) {
  372. if (!$scopedSlots[func]) {
  373. _tools.UtilTools.error('vxe.error.notSlot', [func]);
  374. }
  375. }
  376. });
  377. }
  378. });
  379. }
  380. this.staticItems = list.map(function (item) {
  381. return (0, _util.createItem)(_this2, item);
  382. });
  383. return this.$nextTick();
  384. },
  385. getItems: function getItems() {
  386. var itemList = [];
  387. _xeUtils.default.eachTree(this.formItems, function (item) {
  388. itemList.push(item);
  389. }, {
  390. children: 'children'
  391. });
  392. return itemList;
  393. },
  394. toggleCollapse: function toggleCollapse() {
  395. this.collapseAll = !this.collapseAll;
  396. return this.$nextTick();
  397. },
  398. toggleCollapseEvent: function toggleCollapseEvent(evnt) {
  399. this.toggleCollapse();
  400. this.$emit('toggle-collapse', {
  401. collapse: !this.collapseAll,
  402. data: this.data,
  403. $form: this,
  404. $event: evnt
  405. }, evnt);
  406. },
  407. submitEvent: function submitEvent(evnt) {
  408. var _this3 = this;
  409. evnt.preventDefault();
  410. if (!this.preventSubmit) {
  411. this.beginValidate().then(function () {
  412. _this3.$emit('submit', {
  413. data: _this3.data,
  414. $form: _this3,
  415. $event: evnt
  416. });
  417. }).catch(function (errMap) {
  418. _this3.$emit('submit-invalid', {
  419. data: _this3.data,
  420. errMap: errMap,
  421. $form: _this3,
  422. $event: evnt
  423. });
  424. });
  425. }
  426. },
  427. reset: function reset() {
  428. var _this4 = this;
  429. var data = this.data;
  430. if (data) {
  431. var itemList = this.getItems();
  432. itemList.forEach(function (item) {
  433. var field = item.field,
  434. resetValue = item.resetValue,
  435. itemRender = item.itemRender;
  436. if ((0, _tools.isEnableConf)(itemRender)) {
  437. var compConf = _vXETable.default.renderer.get(itemRender.name);
  438. if (compConf && compConf.itemResetMethod) {
  439. compConf.itemResetMethod({
  440. data: data,
  441. property: field,
  442. item: item,
  443. $form: _this4
  444. });
  445. } else if (field) {
  446. _xeUtils.default.set(data, field, resetValue === null ? getResetValue(_xeUtils.default.get(data, field), undefined) : resetValue);
  447. }
  448. }
  449. });
  450. }
  451. return this.clearValidate();
  452. },
  453. resetEvent: function resetEvent(evnt) {
  454. evnt.preventDefault();
  455. this.reset();
  456. this.$emit('reset', {
  457. data: this.data,
  458. $form: this,
  459. $event: evnt
  460. });
  461. },
  462. handleTooltipLeaveMethod: function handleTooltipLeaveMethod() {
  463. var _this5 = this;
  464. var tooltipOpts = this.tooltipOpts;
  465. setTimeout(function () {
  466. if (!_this5.tooltipActive) {
  467. _this5.closeTooltip();
  468. }
  469. }, tooltipOpts.leaveDelay);
  470. return false;
  471. },
  472. closeTooltip: function closeTooltip() {
  473. var tooltipStore = this.tooltipStore;
  474. var $tooltip = this.$refs.tooltip;
  475. if (tooltipStore.visible) {
  476. Object.assign(tooltipStore, {
  477. item: null,
  478. visible: false
  479. });
  480. if ($tooltip) {
  481. $tooltip.close();
  482. }
  483. }
  484. return this.$nextTick();
  485. },
  486. triggerHeaderHelpEvent: function triggerHeaderHelpEvent(evnt, params) {
  487. var item = params.item;
  488. var tooltipStore = this.tooltipStore;
  489. var $tooltip = this.$refs.tooltip;
  490. var overflowElem = evnt.currentTarget;
  491. var content = (overflowElem.textContent || '').trim();
  492. var isCellOverflow = overflowElem.scrollWidth > overflowElem.clientWidth;
  493. clearTimeout(this.tooltipTimeout);
  494. this.tooltipActive = true;
  495. this.closeTooltip();
  496. if (content && isCellOverflow) {
  497. Object.assign(tooltipStore, {
  498. item: item,
  499. visible: true
  500. });
  501. if ($tooltip) {
  502. $tooltip.open(overflowElem, content);
  503. }
  504. }
  505. },
  506. handleTargetLeaveEvent: function handleTargetLeaveEvent() {
  507. var _this6 = this;
  508. var tooltipOpts = this.tooltipOpts;
  509. this.tooltipActive = false;
  510. if (tooltipOpts.enterable) {
  511. this.tooltipTimeout = setTimeout(function () {
  512. var $tooltip = _this6.$refs.tooltip;
  513. if ($tooltip && !$tooltip.isHover) {
  514. _this6.closeTooltip();
  515. }
  516. }, tooltipOpts.leaveDelay);
  517. } else {
  518. this.closeTooltip();
  519. }
  520. },
  521. clearValidate: function clearValidate(field) {
  522. var itemList = this.getItems();
  523. if (field) {
  524. var item = itemList.find(function (item) {
  525. return item.field === field;
  526. });
  527. if (item) {
  528. item.showError = false;
  529. }
  530. } else {
  531. itemList.forEach(function (item) {
  532. item.showError = false;
  533. });
  534. }
  535. return this.$nextTick();
  536. },
  537. validate: function validate(callback) {
  538. return this.beginValidate('', callback);
  539. },
  540. beginValidate: function beginValidate(type, callback) {
  541. var _this7 = this;
  542. var data = this.data,
  543. formRules = this.rules,
  544. validOpts = this.validOpts;
  545. var validRest = {};
  546. var validFields = [];
  547. var itemValids = [];
  548. var itemList = this.getItems();
  549. this.clearValidate();
  550. clearTimeout(this.showErrTime);
  551. if (data && formRules) {
  552. itemList.forEach(function (item) {
  553. var field = item.field;
  554. if (field) {
  555. itemValids.push(_this7.validItemRules(type || 'all', field).then(function () {
  556. item.errRule = null;
  557. }).catch(function (_ref2) {
  558. var rule = _ref2.rule,
  559. rules = _ref2.rules;
  560. var rest = {
  561. rule: rule,
  562. rules: rules,
  563. data: data,
  564. property: field,
  565. $form: _this7
  566. };
  567. if (!validRest[field]) {
  568. validRest[field] = [];
  569. }
  570. validRest[field].push(rest);
  571. validFields.push(field);
  572. item.errRule = rule;
  573. return Promise.reject(rest);
  574. }));
  575. }
  576. });
  577. return Promise.all(itemValids).then(function () {
  578. if (callback) {
  579. callback();
  580. }
  581. }).catch(function () {
  582. _this7.showErrTime = setTimeout(function () {
  583. itemList.forEach(function (item) {
  584. if (item.errRule) {
  585. item.showError = true;
  586. }
  587. });
  588. }, 20);
  589. if (callback) {
  590. callback(validRest);
  591. }
  592. if (validOpts.autoPos) {
  593. _this7.$nextTick(function () {
  594. _this7.handleFocus(validFields);
  595. });
  596. }
  597. return Promise.reject(validRest);
  598. });
  599. }
  600. if (callback) {
  601. callback();
  602. }
  603. return Promise.resolve();
  604. },
  605. /**
  606. * 校验数据
  607. * 按表格行、列顺序依次校验(同步或异步)
  608. * 校验规则根据索引顺序依次校验,如果是异步则会等待校验完成才会继续校验下一列
  609. * 如果校验失败则,触发回调或者 Promise<(ErrMap 校验不通过列的信息)>
  610. * 如果是传回调方式这返回一个 (ErrMap 校验不通过列的信息)
  611. *
  612. * rule 配置:
  613. * required=Boolean 是否必填
  614. * min=Number 最小长度
  615. * max=Number 最大长度
  616. * validator=Function({ itemValue, rule, rules, data, property }) 自定义校验,接收一个 Promise
  617. * trigger=change 触发方式
  618. */
  619. validItemRules: function validItemRules(type, property, val) {
  620. var _this8 = this;
  621. var data = this.data,
  622. formRules = this.rules;
  623. var errorRules = [];
  624. var syncVailds = [];
  625. if (property && formRules) {
  626. var rules = _xeUtils.default.get(formRules, property);
  627. if (rules) {
  628. var itemValue = _xeUtils.default.isUndefined(val) ? _xeUtils.default.get(data, property) : val;
  629. rules.forEach(function (rule) {
  630. if (type === 'all' || !rule.trigger || type === rule.trigger) {
  631. if (_xeUtils.default.isFunction(rule.validator)) {
  632. var customValid = rule.validator({
  633. itemValue: itemValue,
  634. rule: rule,
  635. rules: rules,
  636. data: data,
  637. property: property,
  638. $form: _this8
  639. });
  640. if (customValid) {
  641. if (_xeUtils.default.isError(customValid)) {
  642. errorRules.push(new Rule({
  643. type: 'custom',
  644. trigger: rule.trigger,
  645. message: customValid.message,
  646. rule: new Rule(rule)
  647. }));
  648. } else if (customValid.catch) {
  649. // 如果为异步校验(注:异步校验是并发无序的)
  650. syncVailds.push(customValid.catch(function (e) {
  651. errorRules.push(new Rule({
  652. type: 'custom',
  653. trigger: rule.trigger,
  654. message: e ? e.message : rule.message,
  655. rule: new Rule(rule)
  656. }));
  657. }));
  658. }
  659. }
  660. } else {
  661. var isNumber = rule.type === 'number';
  662. var numVal = isNumber ? _xeUtils.default.toNumber(itemValue) : _xeUtils.default.getSize(itemValue);
  663. if (itemValue === null || itemValue === undefined || itemValue === '') {
  664. if (rule.required) {
  665. errorRules.push(new Rule(rule));
  666. }
  667. } else if (isNumber && isNaN(itemValue) || !isNaN(rule.min) && numVal < parseFloat(rule.min) || !isNaN(rule.max) && numVal > parseFloat(rule.max) || rule.pattern && !(rule.pattern.test ? rule.pattern : new RegExp(rule.pattern)).test(itemValue)) {
  668. errorRules.push(new Rule(rule));
  669. }
  670. }
  671. }
  672. });
  673. }
  674. }
  675. return Promise.all(syncVailds).then(function () {
  676. if (errorRules.length) {
  677. var rest = {
  678. rules: errorRules,
  679. rule: errorRules[0]
  680. };
  681. return Promise.reject(rest);
  682. }
  683. });
  684. },
  685. handleFocus: function handleFocus(fields) {
  686. var $el = this.$el;
  687. var itemList = this.getItems();
  688. fields.some(function (property) {
  689. var item = itemList.find(function (item) {
  690. return item.field === property;
  691. });
  692. if (item && (0, _tools.isEnableConf)(item.itemRender)) {
  693. var itemRender = item.itemRender;
  694. var compConf = _vXETable.default.renderer.get(itemRender.name);
  695. var inputElem; // 如果指定了聚焦 class
  696. if (itemRender.autofocus) {
  697. inputElem = $el.querySelector(".".concat(item.id, " ").concat(itemRender.autofocus));
  698. } // 渲染器的聚焦处理
  699. if (!inputElem && compConf && compConf.autofocus) {
  700. inputElem = $el.querySelector(".".concat(item.id, " ").concat(compConf.autofocus));
  701. }
  702. if (inputElem) {
  703. inputElem.focus(); // 保持一致行为,光标移到末端
  704. if (_tools.DomTools.browse.msie) {
  705. var textRange = inputElem.createTextRange();
  706. textRange.collapse(false);
  707. textRange.select();
  708. }
  709. return true;
  710. }
  711. }
  712. });
  713. },
  714. /**
  715. * 更新项状态
  716. * 如果组件值 v-model 发生 change 时,调用改函数用于更新某一项编辑状态
  717. * 如果单元格配置了校验规则,则会进行校验
  718. */
  719. updateStatus: function updateStatus(scope, itemValue) {
  720. var _this9 = this;
  721. var property = scope.property;
  722. if (property) {
  723. this.validItemRules('change', property, itemValue).then(function () {
  724. _this9.clearValidate(property);
  725. }).catch(function (_ref3) {
  726. var rule = _ref3.rule;
  727. var itemList = _this9.getItems();
  728. var item = itemList.find(function (item) {
  729. return item.field === property;
  730. });
  731. if (item) {
  732. item.showError = true;
  733. item.errRule = rule;
  734. }
  735. });
  736. }
  737. }
  738. }
  739. };
  740. exports.default = _default2;