1 | import extend from '@form-create/utils/lib/extend';
|
2 | import is from '@form-create/utils/lib/type';
|
3 | import {invoke} from '@form-create/core/src/frame/util';
|
4 | import toArray from '@form-create/utils/lib/toarray';
|
5 |
|
6 | function tidyBtnProp(btn, def) {
|
7 | if (is.Boolean(btn))
|
8 | btn = {show: btn};
|
9 | else if (!is.Undef(btn) && !is.Object(btn)) btn = {show: def};
|
10 | return btn;
|
11 | }
|
12 |
|
13 | export default function extendApi(api, h) {
|
14 | extend(api, {
|
15 | validate(callback) {
|
16 | let flag;
|
17 | const forms = api.children;
|
18 | let len = forms.length;
|
19 | const validate = () => {
|
20 | h.$manager.validate((...args) => {
|
21 | if (!args[0] || !flag) {
|
22 | flag = args;
|
23 | }
|
24 | callback && callback(...flag);
|
25 | });
|
26 | };
|
27 |
|
28 | const validFn = (args) => {
|
29 | setTimeout(() => {
|
30 | if (!args[0]) {
|
31 | if (!flag) {
|
32 | flag = args;
|
33 | }
|
34 | }
|
35 | if (!--len) {
|
36 | validate();
|
37 | }
|
38 | });
|
39 | };
|
40 |
|
41 | forms.forEach(form => {
|
42 | form.validate((...args) => validFn(args))
|
43 | })
|
44 |
|
45 | if (!len) {
|
46 | validate();
|
47 | }
|
48 | },
|
49 | validateField: (field, callback) => {
|
50 | const ctx = h.getFieldCtx(field);
|
51 | if (!ctx) return;
|
52 | const sub = h.subForm[ctx.id];
|
53 | let len = 0;
|
54 | let flag;
|
55 | const validate = () => {
|
56 | h.$manager.validateField(ctx.id, (...args) => {
|
57 | if (args[0]) {
|
58 | flag = args;
|
59 | } else if (flag) {
|
60 | return callback && callback('子表单验证未通过');
|
61 | }
|
62 | callback && callback(...flag || args);
|
63 | });
|
64 | };
|
65 | const validFn = (args) => {
|
66 | setTimeout(() => {
|
67 | if (!args[0]) {
|
68 | if (!flag) {
|
69 | flag = args;
|
70 | }
|
71 | }
|
72 | if (!--len) {
|
73 | validate();
|
74 | }
|
75 | });
|
76 | };
|
77 | sub && toArray(sub).forEach(form => {
|
78 | len++;
|
79 | form.validate((...args) => validFn(args))
|
80 | });
|
81 |
|
82 | if (!len) {
|
83 | validate();
|
84 | }
|
85 | },
|
86 | clearValidateState(fields, clearSub = true) {
|
87 | api.helper.tidyFields(fields).forEach(field => {
|
88 | if (clearSub) this.clearSubValidateState(field);
|
89 | h.getCtxs(field).forEach(ctx => {
|
90 | h.$manager.clearValidateState(ctx);
|
91 | });
|
92 | });
|
93 | },
|
94 | clearSubValidateState(fields) {
|
95 | api.helper.tidyFields(fields).forEach(field => {
|
96 | h.getCtxs(field).forEach(ctx => {
|
97 | const subForm = h.subForm[ctx.id];
|
98 | if (!subForm) return;
|
99 | if (Array.isArray(subForm)) {
|
100 | subForm.forEach(form => {
|
101 | form.clearValidateState();
|
102 | })
|
103 | } else if (subForm) {
|
104 | subForm.clearValidateState();
|
105 | }
|
106 | });
|
107 | })
|
108 | },
|
109 | btn: {
|
110 | loading: (loading = true) => {
|
111 | api.submitBtnProps({loading: !!loading});
|
112 | },
|
113 | disabled: (disabled = true) => {
|
114 | api.submitBtnProps({disabled: !!disabled});
|
115 | },
|
116 | show: (isShow = true) => {
|
117 | api.submitBtnProps({show: !!isShow});
|
118 | }
|
119 | },
|
120 | resetBtn: {
|
121 | loading: (loading = true) => {
|
122 | api.resetBtnProps({loading: !!loading});
|
123 | },
|
124 | disabled: (disabled = true) => {
|
125 | api.resetBtnProps({disabled: !!disabled});
|
126 | },
|
127 | show: (isShow = true) => {
|
128 | api.resetBtnProps({show: !!isShow});
|
129 | }
|
130 | },
|
131 | submitBtnProps: (props = {}) => {
|
132 | let btn = tidyBtnProp(h.options.submitBtn, true);
|
133 | extend(btn, props);
|
134 | h.options.submitBtn = btn;
|
135 | api.refreshOptions();
|
136 | },
|
137 | resetBtnProps: (props = {}) => {
|
138 | let btn = tidyBtnProp(h.options.resetBtn, false);
|
139 | extend(btn, props);
|
140 | h.options.resetBtn = btn;
|
141 | api.refreshOptions();
|
142 | },
|
143 | submit(successFn, failFn) {
|
144 | api.validate((valid) => {
|
145 | if (valid) {
|
146 | let formData = api.formData();
|
147 | if (is.Function(successFn))
|
148 | invoke(() => successFn(formData, this));
|
149 | else {
|
150 | is.Function(h.options.onSubmit) && invoke(() => h.options.onSubmit(formData, this));
|
151 | h.vm.$emit('submit', formData, this);
|
152 | }
|
153 | } else {
|
154 | is.Function(failFn) && invoke(() => failFn(this, ...arguments));
|
155 | }
|
156 | });
|
157 | },
|
158 | });
|
159 |
|
160 | return api;
|
161 | }
|