@tmagic/form 1.7.14-beta.2 → 1.7.14-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/Form.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/es/FormBox.vue_vue_type_script_setup_true_lang.js +5 -2
- package/dist/es/FormDialog.vue_vue_type_script_setup_true_lang.js +5 -2
- package/dist/es/FormDrawer.vue_vue_type_script_setup_true_lang.js +5 -2
- package/dist/es/containers/Container.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/es/containers/table-group-list/useAdd.js +1 -1
- package/dist/es/fields/Cascader.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/CheckboxGroup.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/Date.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/DateTime.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/Daterange.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/Display.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/Select.vue_vue_type_script_setup_true_lang.js +26 -9
- package/dist/es/fields/Text.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/Timerange.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/es/index.js +3 -2
- package/dist/es/submitForm.js +87 -0
- package/dist/es/utils/form.js +2 -2
- package/dist/tmagic-form.umd.cjs +177 -66
- package/package.json +4 -4
- package/src/FormBox.vue +3 -1
- package/src/FormDialog.vue +4 -1
- package/src/FormDrawer.vue +4 -1
- package/src/containers/table-group-list/useAdd.ts +1 -1
- package/src/fields/Select.vue +35 -8
- package/src/index.ts +1 -0
- package/src/submitForm.ts +161 -0
- package/types/index.d.ts +91 -29
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { initValue } from "./utils/form.js";
|
|
2
1
|
import { getConfig } from "./utils/config.js";
|
|
2
|
+
import { initValue } from "./utils/form.js";
|
|
3
3
|
import Container_default from "./containers/Container.js";
|
|
4
4
|
import { Fragment, createBlock, createCommentVNode, createElementBlock, defineComponent, normalizeStyle, openBlock, provide, reactive, ref, renderList, shallowRef, toRaw, unref, useTemplateRef, watch, watchEffect, withCtx } from "vue";
|
|
5
5
|
import { cloneDeep, isEqual } from "lodash-es";
|
|
6
|
-
import { setValueByKeyPath } from "@tmagic/utils";
|
|
7
6
|
import { TMagicForm, tMagicMessage, tMagicMessageBox } from "@tmagic/design";
|
|
7
|
+
import { setValueByKeyPath } from "@tmagic/utils";
|
|
8
8
|
//#region packages/form/src/Form.vue?vue&type=script&setup=true&lang.ts
|
|
9
9
|
var Form_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
|
|
10
10
|
name: "MForm",
|
|
@@ -18,7 +18,8 @@ var FormBox_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ define
|
|
|
18
18
|
confirmText: { default: "确定" },
|
|
19
19
|
inline: { type: Boolean },
|
|
20
20
|
labelPosition: {},
|
|
21
|
-
preventSubmitDefault: { type: Boolean }
|
|
21
|
+
preventSubmitDefault: { type: Boolean },
|
|
22
|
+
extendState: {}
|
|
22
23
|
},
|
|
23
24
|
emits: [
|
|
24
25
|
"change",
|
|
@@ -80,6 +81,7 @@ var FormBox_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ define
|
|
|
80
81
|
"label-position": __props.labelPosition,
|
|
81
82
|
inline: __props.inline,
|
|
82
83
|
"prevent-submit-default": __props.preventSubmitDefault,
|
|
84
|
+
"extend-state": __props.extendState,
|
|
83
85
|
onChange: changeHandler
|
|
84
86
|
}, null, 8, [
|
|
85
87
|
"size",
|
|
@@ -90,7 +92,8 @@ var FormBox_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ define
|
|
|
90
92
|
"label-width",
|
|
91
93
|
"label-position",
|
|
92
94
|
"inline",
|
|
93
|
-
"prevent-submit-default"
|
|
95
|
+
"prevent-submit-default",
|
|
96
|
+
"extend-state"
|
|
94
97
|
]), renderSlot(_ctx.$slots, "default")]),
|
|
95
98
|
_: 3
|
|
96
99
|
})], 4), createElementVNode("div", {
|
|
@@ -40,7 +40,8 @@ var FormDialog_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
|
|
|
40
40
|
showCancel: {
|
|
41
41
|
type: Boolean,
|
|
42
42
|
default: true
|
|
43
|
-
}
|
|
43
|
+
},
|
|
44
|
+
extendState: {}
|
|
44
45
|
},
|
|
45
46
|
emits: [
|
|
46
47
|
"close",
|
|
@@ -190,6 +191,7 @@ var FormDialog_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
|
|
|
190
191
|
"label-position": __props.labelPosition,
|
|
191
192
|
inline: __props.inline,
|
|
192
193
|
"prevent-submit-default": __props.preventSubmitDefault,
|
|
194
|
+
"extend-state": __props.extendState,
|
|
193
195
|
onChange: changeHandler
|
|
194
196
|
}, null, 8, [
|
|
195
197
|
"modelValue",
|
|
@@ -201,7 +203,8 @@ var FormDialog_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
|
|
|
201
203
|
"label-width",
|
|
202
204
|
"label-position",
|
|
203
205
|
"inline",
|
|
204
|
-
"prevent-submit-default"
|
|
206
|
+
"prevent-submit-default",
|
|
207
|
+
"extend-state"
|
|
205
208
|
]), renderSlot(_ctx.$slots, "default")], 4)) : createCommentVNode("v-if", true)]),
|
|
206
209
|
_: 3
|
|
207
210
|
}, 8, [
|
|
@@ -24,7 +24,8 @@ var FormDrawer_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
|
|
|
24
24
|
inline: { type: Boolean },
|
|
25
25
|
labelPosition: {},
|
|
26
26
|
preventSubmitDefault: { type: Boolean },
|
|
27
|
-
beforeClose: {}
|
|
27
|
+
beforeClose: {},
|
|
28
|
+
extendState: {}
|
|
28
29
|
},
|
|
29
30
|
emits: [
|
|
30
31
|
"close",
|
|
@@ -148,6 +149,7 @@ var FormDrawer_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
|
|
|
148
149
|
"label-position": __props.labelPosition,
|
|
149
150
|
inline: __props.inline,
|
|
150
151
|
"prevent-submit-default": __props.preventSubmitDefault,
|
|
152
|
+
"extend-state": __props.extendState,
|
|
151
153
|
onChange: changeHandler
|
|
152
154
|
}, null, 8, [
|
|
153
155
|
"size",
|
|
@@ -158,7 +160,8 @@ var FormDrawer_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
|
|
|
158
160
|
"label-width",
|
|
159
161
|
"label-position",
|
|
160
162
|
"inline",
|
|
161
|
-
"prevent-submit-default"
|
|
163
|
+
"prevent-submit-default",
|
|
164
|
+
"extend-state"
|
|
162
165
|
]), renderSlot(_ctx.$slots, "default")], 512)) : createCommentVNode("v-if", true)]),
|
|
163
166
|
_: 3
|
|
164
167
|
}, 8, [
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { createObjectProp, display, filterFunction, getRules } from "../utils/form.js";
|
|
2
1
|
import Hidden_default from "../fields/Hidden.js";
|
|
3
2
|
import { getField } from "../utils/config.js";
|
|
3
|
+
import { createObjectProp, display, filterFunction, getRules } from "../utils/form.js";
|
|
4
4
|
import FormLabel_default from "./FormLabel.js";
|
|
5
5
|
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, inject, mergeProps, normalizeClass, normalizeStyle, openBlock, readonly, ref, renderList, resolveComponent, resolveDynamicComponent, toDisplayString, toRaw, unref, watch, watchEffect, withCtx } from "vue";
|
|
6
6
|
import { isEqual } from "lodash-es";
|
|
7
|
-
import { getValueByKeyPath } from "@tmagic/utils";
|
|
8
7
|
import { TMagicButton, TMagicFormItem, TMagicIcon, TMagicTooltip } from "@tmagic/design";
|
|
8
|
+
import { getValueByKeyPath } from "@tmagic/utils";
|
|
9
9
|
import { WarningFilled } from "@element-plus/icons-vue";
|
|
10
10
|
//#region packages/form/src/containers/Container.vue?vue&type=script&setup=true&lang.ts
|
|
11
11
|
var _hoisted_1 = ["data-tmagic-id", "data-tmagic-form-item-prop"];
|
|
@@ -7,7 +7,7 @@ var useAdd = (props, emit) => {
|
|
|
7
7
|
const addable = computed(() => {
|
|
8
8
|
const modelName = props.name || props.config.name || "";
|
|
9
9
|
if (!modelName) return false;
|
|
10
|
-
if (!props.model[modelName]
|
|
10
|
+
if (!props.model[modelName]?.length) return true;
|
|
11
11
|
if (typeof props.config.addable === "function") return props.config.addable(mForm, {
|
|
12
12
|
model: props.model[modelName],
|
|
13
13
|
formValue: mForm?.values,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { filterFunction } from "../utils/form.js";
|
|
2
1
|
import { useAddField } from "../utils/useAddField.js";
|
|
3
2
|
import { getConfig } from "../utils/config.js";
|
|
3
|
+
import { filterFunction } from "../utils/form.js";
|
|
4
4
|
import { computed, createBlock, defineComponent, inject, openBlock, ref, unref, watchEffect } from "vue";
|
|
5
5
|
import { TMagicCascader } from "@tmagic/design";
|
|
6
6
|
//#region packages/form/src/fields/Cascader.vue?vue&type=script&setup=true&lang.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { filterFunction } from "../utils/form.js";
|
|
2
1
|
import { useAddField } from "../utils/useAddField.js";
|
|
2
|
+
import { filterFunction } from "../utils/form.js";
|
|
3
3
|
import { Fragment, computed, createBlock, createElementBlock, createTextVNode, defineComponent, inject, openBlock, renderList, toDisplayString, unref, withCtx } from "vue";
|
|
4
4
|
import { TMagicCheckbox, TMagicCheckboxGroup } from "@tmagic/design";
|
|
5
5
|
//#region packages/form/src/fields/CheckboxGroup.vue?vue&type=script&setup=true&lang.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { datetimeFormatter } from "../utils/form.js";
|
|
2
1
|
import { useAddField } from "../utils/useAddField.js";
|
|
2
|
+
import { datetimeFormatter } from "../utils/form.js";
|
|
3
3
|
import { createBlock, defineComponent, openBlock, unref } from "vue";
|
|
4
4
|
import { TMagicDatePicker } from "@tmagic/design";
|
|
5
5
|
//#region packages/form/src/fields/Date.vue?vue&type=script&setup=true&lang.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { datetimeFormatter } from "../utils/form.js";
|
|
2
1
|
import { useAddField } from "../utils/useAddField.js";
|
|
2
|
+
import { datetimeFormatter } from "../utils/form.js";
|
|
3
3
|
import { createBlock, defineComponent, openBlock, unref } from "vue";
|
|
4
4
|
import { TMagicDatePicker } from "@tmagic/design";
|
|
5
5
|
//#region packages/form/src/fields/DateTime.vue?vue&type=script&setup=true&lang.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { datetimeFormatter } from "../utils/form.js";
|
|
2
1
|
import { useAddField } from "../utils/useAddField.js";
|
|
2
|
+
import { datetimeFormatter } from "../utils/form.js";
|
|
3
3
|
import { createBlock, defineComponent, onUnmounted, openBlock, ref, unref, watch } from "vue";
|
|
4
4
|
import { TMagicDatePicker } from "@tmagic/design";
|
|
5
5
|
//#region packages/form/src/fields/Daterange.vue?vue&type=script&setup=true&lang.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { filterFunction } from "../utils/form.js";
|
|
2
1
|
import { useAddField } from "../utils/useAddField.js";
|
|
2
|
+
import { filterFunction } from "../utils/form.js";
|
|
3
3
|
import { computed, createCommentVNode, createElementBlock, defineComponent, inject, openBlock, toDisplayString } from "vue";
|
|
4
4
|
//#region packages/form/src/fields/Display.vue?vue&type=script&setup=true&lang.ts
|
|
5
5
|
var _hoisted_1 = { key: 0 };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { useAddField } from "../utils/useAddField.js";
|
|
2
2
|
import { getConfig } from "../utils/config.js";
|
|
3
|
-
import { Fragment, createBlock, createCommentVNode, createElementBlock, defineComponent, inject, mergeProps, nextTick,
|
|
4
|
-
import { getValueByKeyPath } from "@tmagic/utils";
|
|
3
|
+
import { Fragment, createBlock, createCommentVNode, createElementBlock, defineComponent, inject, mergeProps, nextTick, openBlock, ref, renderList, resolveDirective, resolveDynamicComponent, unref, watch, watchEffect, withCtx, withDirectives } from "vue";
|
|
5
4
|
import { TMagicSelect, getDesignConfig } from "@tmagic/design";
|
|
5
|
+
import { getValueByKeyPath } from "@tmagic/utils";
|
|
6
6
|
//#region packages/form/src/fields/Select.vue?vue&type=script&setup=true&lang.ts
|
|
7
7
|
var _hoisted_1 = { key: 2 };
|
|
8
8
|
var Select_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
|
|
@@ -47,6 +47,18 @@ var Select_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
|
|
|
47
47
|
}
|
|
48
48
|
return value === v;
|
|
49
49
|
};
|
|
50
|
+
const hasOption = (value) => {
|
|
51
|
+
const { config } = props;
|
|
52
|
+
if (Array.isArray(value) && !value.length) return true;
|
|
53
|
+
if (config.group) {
|
|
54
|
+
const groups = options.value;
|
|
55
|
+
if (config.multiple && Array.isArray(value)) return value.every((v) => groups.some((group) => group.options.some((item) => equalValue(item.value, v))));
|
|
56
|
+
return groups.some((group) => group.options.some((item) => equalValue(item.value, value)));
|
|
57
|
+
}
|
|
58
|
+
const opts = options.value;
|
|
59
|
+
if (config.multiple && Array.isArray(value)) return value.every((v) => opts.some((item) => equalValue(item.value, v)));
|
|
60
|
+
return opts.some((item) => equalValue(item.value, value));
|
|
61
|
+
};
|
|
50
62
|
const mapOptions = (data) => {
|
|
51
63
|
const { option = {
|
|
52
64
|
text: "text",
|
|
@@ -209,13 +221,18 @@ var Select_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
|
|
|
209
221
|
else if (Array.isArray(props.config.options)) watchEffect(() => {
|
|
210
222
|
setOptions(props.config.options);
|
|
211
223
|
});
|
|
212
|
-
else if (props.config.option)
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
224
|
+
else if (props.config.option) {
|
|
225
|
+
const initOption = async () => {
|
|
226
|
+
if (!props.model) return;
|
|
227
|
+
const v = props.model[props.name];
|
|
228
|
+
if (Array.isArray(v) ? !v.length : typeof v === "undefined") return;
|
|
229
|
+
if (typeof v === "undefined" || hasOption(v)) return;
|
|
230
|
+
setOptions(await getInitOption());
|
|
231
|
+
};
|
|
232
|
+
watch(() => props.model?.[props.name], () => {
|
|
233
|
+
initOption();
|
|
234
|
+
}, { immediate: true });
|
|
235
|
+
}
|
|
219
236
|
if (props.config.remote) {
|
|
220
237
|
const unWatch = watch(() => tMagicSelect.value?.scrollbarWrap, (scrollbarWrap) => {
|
|
221
238
|
if (!scrollbarWrap) return;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { useAddField } from "../utils/useAddField.js";
|
|
2
2
|
import { Teleport, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createTextVNode, createVNode, defineComponent, inject, openBlock, readonly, ref, shallowRef, toDisplayString, unref, watch, withCtx, withModifiers } from "vue";
|
|
3
3
|
import { debounce } from "lodash-es";
|
|
4
|
-
import { isNumber } from "@tmagic/utils";
|
|
5
4
|
import { TMagicButton, TMagicInput } from "@tmagic/design";
|
|
5
|
+
import { isNumber } from "@tmagic/utils";
|
|
6
6
|
import { createPopper } from "@popperjs/core";
|
|
7
7
|
//#region packages/form/src/fields/Text.vue?vue&type=script&setup=true&lang.ts
|
|
8
8
|
var _hoisted_1 = { class: "m-fields-text" };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { datetimeFormatter } from "../utils/form.js";
|
|
2
1
|
import { useAddField } from "../utils/useAddField.js";
|
|
2
|
+
import { datetimeFormatter } from "../utils/form.js";
|
|
3
3
|
import { createBlock, defineComponent, onUnmounted, openBlock, ref, unref, watch } from "vue";
|
|
4
|
-
import dayjs from "dayjs";
|
|
5
4
|
import { TMagicTimePicker } from "@tmagic/design";
|
|
5
|
+
import dayjs from "dayjs";
|
|
6
6
|
//#region packages/form/src/fields/Timerange.vue?vue&type=script&setup=true&lang.ts
|
|
7
7
|
var Timerange_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
|
|
8
8
|
name: "MFormTimeRange",
|
package/dist/es/index.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import "./_virtual/_rolldown/runtime.js";
|
|
2
|
-
import { createObjectProp, createValues, datetimeFormatter, display, filterFunction, getDataByPage, getRules, initValue, sortArray, sortChange } from "./utils/form.js";
|
|
3
2
|
import { useAddField } from "./utils/useAddField.js";
|
|
4
3
|
import Hidden_default from "./fields/Hidden.js";
|
|
5
4
|
import { deleteField, getField, registerField } from "./utils/config.js";
|
|
5
|
+
import { createObjectProp, createValues, datetimeFormatter, display, filterFunction, getDataByPage, getRules, initValue, sortArray, sortChange } from "./utils/form.js";
|
|
6
6
|
import Container_default from "./containers/Container.js";
|
|
7
7
|
import Form_default from "./Form.js";
|
|
8
|
+
import { submitForm } from "./submitForm.js";
|
|
8
9
|
import FormDialog_default from "./FormDialog.js";
|
|
9
10
|
import FormDrawer_default from "./FormDrawer.js";
|
|
10
11
|
import FormBox_default from "./FormBox.js";
|
|
@@ -37,4 +38,4 @@ import plugin_default from "./plugin.js";
|
|
|
37
38
|
export * from "@tmagic/form-schema";
|
|
38
39
|
var createForm = (config) => config;
|
|
39
40
|
//#endregion
|
|
40
|
-
export { Cascader_default as MCascader, Checkbox_default as MCheckbox, CheckboxGroup_default as MCheckboxGroup, ColorPicker_default as MColorPicker, Container_default as MContainer, Date_default as MDate, DateTime_default as MDateTime, Daterange_default as MDaterange, Display_default as MDisplay, DynamicField_default as MDynamicField, Fieldset_default as MFieldset, FlexLayout_default as MFlexLayout, Form_default as MForm, FormBox_default as MFormBox, FormDialog_default as MFormDialog, FormDrawer_default as MFormDrawer, TableGroupList_default as MGroupList, Hidden_default as MHidden, Link_default as MLink, Number_default as MNumber, NumberRange_default as MNumberRange, Panel_default as MPanel, RadioGroup_default as MRadioGroup, Row_default as MRow, Select_default as MSelect, Switch_default as MSwitch, TableGroupList_default as MTable, TableGroupList_default as MTableGroupList, Tabs_default as MTabs, Text_default as MText, Textarea_default as MTextarea, Time_default as MTime, Timerange_default as MTimerange, createForm, createObjectProp, createValues, datetimeFormatter, plugin_default as default, deleteField as deleteFormField, display, filterFunction, getDataByPage, getField as getFormField, getRules, initValue, registerField as registerFormField, sortArray, sortChange, useAddField };
|
|
41
|
+
export { Cascader_default as MCascader, Checkbox_default as MCheckbox, CheckboxGroup_default as MCheckboxGroup, ColorPicker_default as MColorPicker, Container_default as MContainer, Date_default as MDate, DateTime_default as MDateTime, Daterange_default as MDaterange, Display_default as MDisplay, DynamicField_default as MDynamicField, Fieldset_default as MFieldset, FlexLayout_default as MFlexLayout, Form_default as MForm, FormBox_default as MFormBox, FormDialog_default as MFormDialog, FormDrawer_default as MFormDrawer, TableGroupList_default as MGroupList, Hidden_default as MHidden, Link_default as MLink, Number_default as MNumber, NumberRange_default as MNumberRange, Panel_default as MPanel, RadioGroup_default as MRadioGroup, Row_default as MRow, Select_default as MSelect, Switch_default as MSwitch, TableGroupList_default as MTable, TableGroupList_default as MTableGroupList, Tabs_default as MTabs, Text_default as MText, Textarea_default as MTextarea, Time_default as MTime, Timerange_default as MTimerange, createForm, createObjectProp, createValues, datetimeFormatter, plugin_default as default, deleteField as deleteFormField, display, filterFunction, getDataByPage, getField as getFormField, getRules, initValue, registerField as registerFormField, sortArray, sortChange, submitForm, useAddField };
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import Form_default from "./Form.js";
|
|
2
|
+
import { createApp, defineComponent, h, nextTick, ref, watch } from "vue";
|
|
3
|
+
//#region packages/form/src/submitForm.ts
|
|
4
|
+
/**
|
|
5
|
+
* 以命令式方式调用 Form.vue 完成一次表单校验/提交。
|
|
6
|
+
*
|
|
7
|
+
* 类似 ElMessage 的用法:传入 props(包含 `config`/`initValues` 等),函数内部会临时挂载
|
|
8
|
+
* 一个不可见的 Form 组件实例,等待初始化完成后调用其 `submitForm` 方法,
|
|
9
|
+
* 校验通过则 resolve 表单值,校验失败则 reject 错误信息,最后自动卸载实例。
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { submitForm } from '@tmagic/form';
|
|
14
|
+
*
|
|
15
|
+
* try {
|
|
16
|
+
* const values = await submitForm({
|
|
17
|
+
* config: [...],
|
|
18
|
+
* initValues: { name: 'foo' },
|
|
19
|
+
* });
|
|
20
|
+
* console.log(values);
|
|
21
|
+
* } catch (e) {
|
|
22
|
+
* console.error(e);
|
|
23
|
+
* }
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
var submitForm = (options) => {
|
|
27
|
+
const { native, appContext, timeout = 1e4, ...formProps } = options;
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
const container = document.createElement("div");
|
|
30
|
+
container.style.display = "none";
|
|
31
|
+
document.body.appendChild(container);
|
|
32
|
+
let cleaned = false;
|
|
33
|
+
let timer = null;
|
|
34
|
+
const app = createApp(defineComponent({
|
|
35
|
+
name: "MFormSubmitWrapper",
|
|
36
|
+
setup() {
|
|
37
|
+
const formRef = ref(null);
|
|
38
|
+
const stop = watch(() => formRef.value?.initialized, async (initialized) => {
|
|
39
|
+
if (!initialized) return;
|
|
40
|
+
stop();
|
|
41
|
+
try {
|
|
42
|
+
await nextTick();
|
|
43
|
+
resolve(await formRef.value.submitForm(native));
|
|
44
|
+
} catch (err) {
|
|
45
|
+
reject(err);
|
|
46
|
+
} finally {
|
|
47
|
+
cleanup();
|
|
48
|
+
}
|
|
49
|
+
}, {
|
|
50
|
+
flush: "post",
|
|
51
|
+
immediate: true
|
|
52
|
+
});
|
|
53
|
+
return () => h(Form_default, {
|
|
54
|
+
...formProps,
|
|
55
|
+
ref: formRef
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}));
|
|
59
|
+
if (appContext) Object.assign(app._context, appContext);
|
|
60
|
+
const cleanup = () => {
|
|
61
|
+
if (cleaned) return;
|
|
62
|
+
cleaned = true;
|
|
63
|
+
if (timer) {
|
|
64
|
+
clearTimeout(timer);
|
|
65
|
+
timer = null;
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
app.unmount();
|
|
69
|
+
} catch {}
|
|
70
|
+
container.parentNode?.removeChild(container);
|
|
71
|
+
};
|
|
72
|
+
if (timeout > 0) timer = setTimeout(() => {
|
|
73
|
+
if (!cleaned) {
|
|
74
|
+
reject(/* @__PURE__ */ new Error(`submitForm timeout after ${timeout}ms: form is not initialized.`));
|
|
75
|
+
cleanup();
|
|
76
|
+
}
|
|
77
|
+
}, timeout);
|
|
78
|
+
try {
|
|
79
|
+
app.mount(container);
|
|
80
|
+
} catch (err) {
|
|
81
|
+
reject(err);
|
|
82
|
+
cleanup();
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
};
|
|
86
|
+
//#endregion
|
|
87
|
+
export { submitForm };
|
package/dist/es/utils/form.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { readonly } from "vue";
|
|
2
|
-
import dayjs from "dayjs";
|
|
3
|
-
import utc from "dayjs/plugin/utc";
|
|
4
2
|
import { cloneDeep } from "lodash-es";
|
|
5
3
|
import { getValueByKeyPath } from "@tmagic/utils";
|
|
4
|
+
import dayjs from "dayjs";
|
|
5
|
+
import utc from "dayjs/plugin/utc";
|
|
6
6
|
//#region packages/form/src/utils/form.ts
|
|
7
7
|
var TABLE_SELECT_TYPES = new Set(["table-select", "tableSelect"]);
|
|
8
8
|
var isTableSelect = (type) => typeof type === "string" && TABLE_SELECT_TYPES.has(type);
|