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(...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 | if (!h.fieldCtx[field])
|
51 | return;
|
52 | const sub = h.subForm[field];
|
53 | let len = 0;
|
54 | let flag;
|
55 | const validate = () => {
|
56 | h.$manager.validateField(field, (...args) => {
|
57 | if (args[0]) {
|
58 | flag = args;
|
59 | } else if (flag) {
|
60 | return callback('子表单验证未通过', flag[1]);
|
61 | }
|
62 | 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 | const ctx = h.fieldCtx[field];
|
90 | if (!ctx) return;
|
91 | h.$manager.clearValidateState(ctx);
|
92 | });
|
93 | },
|
94 | clearSubValidateState(fields) {
|
95 | api.helper.tidyFields(fields).forEach(field => {
|
96 | const subForm = h.subForm[field];
|
97 | if (!subForm) return;
|
98 | if (Array.isArray(subForm)) {
|
99 | subForm.forEach(form => {
|
100 | form.clearValidateState();
|
101 | })
|
102 | } else if (subForm) {
|
103 | subForm.clearValidateState();
|
104 | }
|
105 | })
|
106 | },
|
107 | btn: {
|
108 | loading: (loading = true) => {
|
109 | api.submitBtnProps({loading: !!loading});
|
110 | },
|
111 | disabled: (disabled = true) => {
|
112 | api.submitBtnProps({disabled: !!disabled});
|
113 | },
|
114 | show: (isShow = true) => {
|
115 | api.submitBtnProps({show: !!isShow});
|
116 | }
|
117 | },
|
118 | resetBtn: {
|
119 | loading: (loading = true) => {
|
120 | api.resetBtnProps({loading: !!loading});
|
121 | },
|
122 | disabled: (disabled = true) => {
|
123 | api.resetBtnProps({disabled: !!disabled});
|
124 | },
|
125 | show: (isShow = true) => {
|
126 | api.resetBtnProps({show: !!isShow});
|
127 | }
|
128 | },
|
129 | submitBtnProps: (props = {}) => {
|
130 | let btn = tidyBtnProp(h.options.submitBtn, true);
|
131 | extend(btn, props);
|
132 | h.options.submitBtn = btn;
|
133 | api.refreshOptions();
|
134 | },
|
135 | resetBtnProps: (props = {}) => {
|
136 | let btn = tidyBtnProp(h.options.resetBtn, false);
|
137 | extend(btn, props);
|
138 | h.options.resetBtn = btn;
|
139 | api.refreshOptions();
|
140 | },
|
141 | submit(successFn, failFn) {
|
142 | api.validate((valid) => {
|
143 | if (valid) {
|
144 | let formData = api.formData();
|
145 | if (is.Function(successFn))
|
146 | invoke(() => successFn(formData, this));
|
147 | else {
|
148 | is.Function(h.options.onSubmit) && invoke(() => h.options.onSubmit(formData, this));
|
149 | h.vm.$emit('submit', formData, this);
|
150 | }
|
151 | } else {
|
152 | is.Function(failFn) && invoke(() => failFn(this, ...arguments));
|
153 | }
|
154 | });
|
155 | },
|
156 | });
|
157 |
|
158 | return api;
|
159 | } |
\ | No newline at end of file |