cnhis-design-vue 3.1.38-beta.7 → 3.1.38-beta.8

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.
Files changed (27) hide show
  1. package/es/components/form-config/index.d.ts +216 -12
  2. package/es/components/form-config/src/FormConfig.vue.d.ts +216 -12
  3. package/es/components/form-config/src/components/FormConfigCreator.vue.d.ts +108 -6
  4. package/es/components/form-config/src/components/FormConfigEdit.vue.d.ts +108 -6
  5. package/es/components/form-render/index.d.ts +108 -6
  6. package/es/components/form-render/src/FormRender.vue.d.ts +108 -6
  7. package/es/components/form-render/src/FormRender.vue.js +32 -107
  8. package/es/components/form-render/src/FormRenderWrapper.vue.d.ts +108 -6
  9. package/es/components/form-render/src/components/renderer/formItem.js +3 -3
  10. package/es/components/form-render/src/components/renderer/index.js +2 -4
  11. package/es/components/form-render/src/components/renderer/radio&checkbox.d.ts +186 -0
  12. package/es/components/form-render/src/components/renderer/radio_checkbox.js +111 -0
  13. package/es/components/form-render/src/hooks/useComplexOptions.d.ts +28 -5
  14. package/es/components/form-render/src/hooks/useComplexOptions.js +133 -45
  15. package/es/components/form-render/src/hooks/useFieldListAdaptor.js +8 -11
  16. package/es/components/form-render/src/hooks/useFormEvent.d.ts +29 -0
  17. package/es/components/form-render/src/hooks/useFormEvent.js +140 -0
  18. package/es/components/form-render/src/types/index.d.ts +3 -1
  19. package/es/components/form-render/style/index.css +1 -1
  20. package/es/components/index.css +1 -1
  21. package/es/components/shortcut-setter/index.d.ts +108 -6
  22. package/es/components/shortcut-setter/src/ShortcutSetter.vue.d.ts +108 -6
  23. package/package.json +2 -2
  24. package/es/components/form-render/src/components/renderer/checkbox.d.ts +0 -90
  25. package/es/components/form-render/src/components/renderer/checkbox.js +0 -138
  26. package/es/components/form-render/src/components/renderer/radio.d.ts +0 -94
  27. package/es/components/form-render/src/components/renderer/radio.js +0 -101
@@ -0,0 +1,111 @@
1
+ import { defineComponent, createVNode, isVNode } from 'vue';
2
+ import { connect, mapProps } from '@formily/vue';
3
+ import { NSpace, NRadio, NRadioGroup, NCheckbox, NCheckboxGroup } from 'naive-ui';
4
+ import '../../../index.js';
5
+ import { useComplexOptions } from '../../hooks/useComplexOptions.js';
6
+ import '../../utils/index.js';
7
+ import { useAutographOptions } from '../../hooks/useFormRenderOptions.js';
8
+ import { useCommonInjection } from '../../hooks/useCommonInjection.js';
9
+ import { assignUpdateValue, createVisitedSetter } from '../../utils/schema.js';
10
+ import { useFormField } from '../../hooks/useFormField.js';
11
+
12
+ function _isSlot(s) {
13
+ return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s);
14
+ }
15
+ function createComponent(name, Wrapper, Item) {
16
+ return defineComponent({
17
+ name,
18
+ props: {
19
+ value: {
20
+ type: [String, Number, Object]
21
+ },
22
+ options: {
23
+ type: Array,
24
+ default: () => []
25
+ },
26
+ autograph: {
27
+ type: String
28
+ },
29
+ lazyRequest: {
30
+ type: Boolean,
31
+ default: false
32
+ },
33
+ requestCache: {
34
+ type: Boolean,
35
+ default: true
36
+ },
37
+ wordbook: {
38
+ type: Object
39
+ },
40
+ vertical: {
41
+ type: Boolean,
42
+ default: false
43
+ },
44
+ onChange: {}
45
+ },
46
+ emits: ["update:value"],
47
+ setup(props, {
48
+ emit
49
+ }) {
50
+ const {
51
+ field
52
+ } = useFormField();
53
+ const {
54
+ renderComplexOption,
55
+ checkValueRef,
56
+ valueRef
57
+ } = useComplexOptions(props, emit);
58
+ const {
59
+ labelKey,
60
+ valueKey,
61
+ options
62
+ } = useAutographOptions(props, valueRef);
63
+ const {
64
+ injectValueBindKey,
65
+ injectValueValidate
66
+ } = useCommonInjection();
67
+ injectValueValidate(valueRef);
68
+ const key = injectValueBindKey(valueRef);
69
+ return () => {
70
+ return createVNode(Wrapper, {
71
+ "key": key.value,
72
+ "value": valueRef.value,
73
+ "onUpdate:value": ($event) => valueRef.value = $event,
74
+ "onClick": createVisitedSetter(field)
75
+ }, {
76
+ default: () => [createVNode(NSpace, {
77
+ "vertical": props.vertical,
78
+ "vertical-space": props.vertical
79
+ }, {
80
+ default: () => {
81
+ var _a;
82
+ return [(_a = options.value) == null ? void 0 : _a.map((option) => {
83
+ let _slot;
84
+ return createVNode(Item, {
85
+ "key": option[valueKey.value],
86
+ "value": option[valueKey.value],
87
+ "disabled": option.disabled
88
+ }, _isSlot(_slot = renderComplexOption({
89
+ value: checkValueRef.value,
90
+ option,
91
+ valueKey: valueKey.value,
92
+ labelKey: labelKey.value
93
+ })) ? _slot : {
94
+ default: () => [_slot]
95
+ });
96
+ })];
97
+ }
98
+ })]
99
+ });
100
+ };
101
+ }
102
+ });
103
+ }
104
+ const RADIO = connect(createComponent("FormRadio", NRadioGroup, NRadio), mapProps({
105
+ dataSource: "options"
106
+ }, assignUpdateValue));
107
+ const CHECKBOX = connect(createComponent("FormCheckbox", NCheckboxGroup, NCheckbox), mapProps({
108
+ dataSource: "options"
109
+ }, assignUpdateValue));
110
+
111
+ export { CHECKBOX, RADIO };
@@ -1,8 +1,31 @@
1
- import { MaybeRef } from '@vueuse/core';
2
- import { FormOptionItem } from '../../../../../es/components/form-render';
3
- export declare function useComplexOptions(valueKey: MaybeRef<string>): {
4
- render: (value: unknown, option: FormOptionItem) => JSX.Element | null;
1
+ import { AnyObject, Func } from '../../../../../es/shared/types';
2
+ import { Path } from '@formily/path';
3
+ import { FieldItem, FormOptionItem } from '../../../../../es/components/form-render';
4
+ declare function setSpan(uuid: string, address: Path | string, span?: number): void;
5
+ declare function getSpan(uuid: string, address: Path | string): number;
6
+ declare function deleteSpan(uuid: string, address: Path | string): void;
7
+ declare function clearSpan(uuid: string): void;
8
+ export declare function useComplexOptions(props: {
9
+ options: AnyObject[];
10
+ value: unknown;
11
+ }, emit: Func): {
12
+ renderComplexOption: ({ value, option, valueKey, labelKey }: {
13
+ value: unknown;
14
+ option: FormOptionItem;
15
+ valueKey: string;
16
+ labelKey: string;
17
+ }) => any[];
18
+ valueRef: import("vue").WritableComputedRef<unknown>;
19
+ hasComplexOption: import("vue").ComputedRef<boolean>;
20
+ checkValueRef: import("vue").Ref<any>;
5
21
  };
6
22
  export declare function useComplexOptionsSpan(): {
7
- calcFieldItemSpan: (span: number) => number;
23
+ getSpan: typeof getSpan;
24
+ setSpan: typeof setSpan;
25
+ deleteSpan: typeof deleteSpan;
26
+ clearSpan: typeof clearSpan;
8
27
  };
28
+ export declare function useComplexOptionsKey(): {
29
+ combineComplexOptionKey: (fieldList: FieldItem[], values: AnyObject) => AnyObject;
30
+ };
31
+ export {};
@@ -1,8 +1,7 @@
1
- import { reactive, defineComponent, inject, computed, watch, onUnmounted, onMounted, createVNode, withModifiers, unref } from 'vue';
2
- import { checkInSetupEnv } from '../../../../shared/utils/index.js';
3
- import { isField } from '@formily/core';
1
+ import { reactive, defineComponent, inject, computed, watch, onUnmounted, onMounted, createVNode, withModifiers, ref } from 'vue';
2
+ import { checkInSetupEnv, jsonParse } from '../../../../shared/utils/index.js';
4
3
  import { RecursionField } from '@formily/vue';
5
- import { sumBy, property, noop, isArray } from 'lodash-es';
4
+ import { sumBy, property, noop, isObject, isArray, isString, cloneDeep, isNumber } from 'lodash-es';
6
5
  import '../../index.js';
7
6
  import { InjectionFormUUID, InjectionBusinessCollector } from '../constants/index.js';
8
7
  import { useFormField } from './useFormField.js';
@@ -10,25 +9,27 @@ import { useFieldListAdaptor } from './useFieldListAdaptor.js';
10
9
  import { createObjSchema } from '../utils/schema.js';
11
10
 
12
11
  const spanMap = reactive(/* @__PURE__ */ new Map());
13
- function setSpan(uuid, field, span = 0) {
12
+ function setSpan(uuid, address, span = 0) {
14
13
  spanMap.set(uuid, spanMap.get(uuid) || {});
15
14
  const spanObj = spanMap.get(uuid);
16
- Reflect.set(spanObj, field.address.toString(), span);
15
+ spanObj[address + ""] = span;
17
16
  }
18
- function getSpan(uuid, field) {
17
+ function getSpan(uuid, address) {
19
18
  const spanObj = spanMap.get(uuid);
20
19
  if (!spanObj)
21
20
  return 0;
22
- const fieldKey = field.address.toString();
23
21
  return Object.entries(spanObj).reduce((res, [k, v]) => {
24
- if (k === fieldKey || k.startsWith(`${fieldKey}.`))
22
+ if (k === address + "" || k.startsWith(`${address}.`))
25
23
  return res + v;
26
24
  return res;
27
25
  }, 0);
28
26
  }
29
- function deleteSpan(uuid, field) {
27
+ function deleteSpan(uuid, address) {
30
28
  const spanObj = spanMap.get(uuid);
31
- spanObj && Reflect.deleteProperty(spanObj, field.address.toString());
29
+ spanObj && Reflect.deleteProperty(spanObj, address + "");
30
+ }
31
+ function clearSpan(uuid) {
32
+ spanMap.delete(uuid);
32
33
  }
33
34
  const ChildSchemaField = defineComponent({
34
35
  props: {
@@ -50,39 +51,42 @@ const ChildSchemaField = defineComponent({
50
51
  const {
51
52
  schemaAdaptor
52
53
  } = useFieldListAdaptor(collector);
53
- function assignConfig(field2) {
54
- return Object.assign({}, field2, {
55
- decoratorProps: {
56
- ...field2.decoratorProps,
54
+ function assignConfig(schema2) {
55
+ return Object.assign(schema2, {
56
+ ["x-decorator-props"]: {
57
+ ...schema2["x-decorator-props"],
57
58
  labelPlacement: "left",
58
- showFeedback: false
59
+ showFeedback: false,
60
+ showLabel: !!schema2.title
59
61
  },
60
- componentProps: {
61
- ...field2.componentProps,
62
+ ["x-component-props"]: {
63
+ ...schema2["x-component-props"],
62
64
  size: "small"
63
65
  }
64
66
  });
65
67
  }
66
68
  const schema = computed(() => {
67
- return createObjSchema(schemaAdaptor(props.fields.map(assignConfig)));
69
+ const schemaProperty = schemaAdaptor(props.fields);
70
+ Object.values(schemaProperty).forEach(assignConfig);
71
+ return createObjSchema(schemaProperty);
68
72
  });
69
73
  const column = computed(() => {
70
74
  return sumBy(Object.values(schema.value.properties || []), property("x-decorator-props.span"));
71
75
  });
76
+ const fieldKey = computed(() => `${field.value.address.toString()}.${props.name}`);
72
77
  watch(column, (_column) => {
73
- setSpan(uuid, field.value, _column);
78
+ setSpan(uuid, fieldKey.value, _column);
74
79
  }, {
75
80
  immediate: true
76
81
  });
77
82
  function getRecursionField() {
78
83
  const formModel = field.value.form;
79
- const address = `${field.value.address.toString()}.${props.name}`;
80
- return formModel.query(address).take();
84
+ return formModel.query(fieldKey.value).take();
81
85
  }
82
86
  onUnmounted(() => {
83
87
  const recursionField = getRecursionField();
84
88
  recursionField && (recursionField.display = "none");
85
- deleteSpan(uuid, field.value);
89
+ deleteSpan(uuid, fieldKey.value);
86
90
  });
87
91
  onMounted(() => {
88
92
  const recursionField = getRecursionField();
@@ -94,7 +98,7 @@ const ChildSchemaField = defineComponent({
94
98
  "onClick": withModifiers(noop, ["stop"]),
95
99
  "class": "form-render__labelField",
96
100
  "style": {
97
- "--column": getSpan(uuid, field.value)
101
+ "--column": getSpan(uuid, fieldKey.value)
98
102
  }
99
103
  }, [createVNode(RecursionField, {
100
104
  "name": props.name,
@@ -102,36 +106,120 @@ const ChildSchemaField = defineComponent({
102
106
  }, null)]);
103
107
  }
104
108
  });
105
- function useComplexOptions(valueKey) {
106
- function valueMatcher(value, option) {
107
- if (isArray(value))
108
- return value.includes(option[unref(valueKey)]);
109
- return value === option[unref(valueKey)] && isArray(option.childrenFields) && option.childrenFields.length;
109
+ function isComplexOption(options) {
110
+ return options.some((option) => {
111
+ return isArray(option.childrenFields) && option.childrenFields.length;
112
+ });
113
+ }
114
+ function useComplexOptions(props, emit) {
115
+ checkInSetupEnv();
116
+ const {
117
+ fieldKey
118
+ } = useFormField();
119
+ const hasComplexOption = computed(() => isComplexOption(props.options));
120
+ function dangerousTypeTransform(value) {
121
+ if (isNumber(value))
122
+ return value + "";
123
+ return value;
124
+ }
125
+ const checkValueRef = ref();
126
+ const valueRef = computed({
127
+ get() {
128
+ return dangerousTypeTransform(hasComplexOption.value ? checkValueRef.value : props.value);
129
+ },
130
+ set(value) {
131
+ if (!hasComplexOption.value)
132
+ return emit("update:value", value);
133
+ if (!isObject(props.value))
134
+ return;
135
+ props.value[fieldKey.value] = value;
136
+ checkValueRef.value = value;
137
+ }
138
+ });
139
+ watch(checkValueRef, () => {
140
+ if (!hasComplexOption.value || !isObject(props.value))
141
+ return;
142
+ props.value[fieldKey.value] = checkValueRef.value;
143
+ });
144
+ watch([() => props.value, hasComplexOption], ([v, _has]) => {
145
+ if (!_has)
146
+ return;
147
+ if (isArray(v)) {
148
+ checkValueRef.value = v;
149
+ return emit("update:value", {
150
+ [fieldKey.value]: v
151
+ });
152
+ }
153
+ if (isString(v)) {
154
+ if (v.startsWith("{")) {
155
+ const result = cloneDeep(jsonParse(v));
156
+ checkValueRef.value = result[fieldKey.value];
157
+ return emit("update:value", result);
158
+ }
159
+ checkValueRef.value = v;
160
+ return emit("update:value", {
161
+ [fieldKey.value]: v
162
+ });
163
+ }
164
+ if (!isObject(v)) {
165
+ checkValueRef.value = void 0;
166
+ emit("update:value", {});
167
+ } else {
168
+ checkValueRef.value = v[fieldKey.value];
169
+ }
170
+ }, {
171
+ immediate: true
172
+ });
173
+ function valueMatcher(value, option, valueKey = "value") {
174
+ if (isArray(value) ? !value.includes(option[valueKey]) : value !== option[valueKey])
175
+ return;
176
+ return isArray(option.childrenFields) && option.childrenFields.length;
110
177
  }
111
- function render(value, option) {
112
- return valueMatcher(value, option) ? createVNode(ChildSchemaField, {
178
+ function renderComplexOption({
179
+ value,
180
+ option,
181
+ valueKey = "value",
182
+ labelKey = "label"
183
+ }) {
184
+ return [option[labelKey], hasComplexOption.value && valueMatcher(value, option, valueKey) ? createVNode(ChildSchemaField, {
113
185
  "fields": option.childrenFields,
114
- "name": option[unref(valueKey)]
115
- }, null) : null;
186
+ "name": option[valueKey]
187
+ }, null) : null];
116
188
  }
117
189
  return {
118
- render
190
+ renderComplexOption,
191
+ valueRef,
192
+ hasComplexOption,
193
+ checkValueRef
119
194
  };
120
195
  }
121
196
  function useComplexOptionsSpan() {
122
- checkInSetupEnv();
123
- const uuid = inject(InjectionFormUUID);
124
- const {
125
- field
126
- } = useFormField();
127
- function calcFieldItemSpan(span) {
128
- if (!isField(field.value))
129
- return span;
130
- return getSpan(uuid, field.value) + span;
197
+ return {
198
+ getSpan,
199
+ setSpan,
200
+ deleteSpan,
201
+ clearSpan
202
+ };
203
+ }
204
+ function useComplexOptionsKey() {
205
+ function combineComplexOptionKey(fieldList, values) {
206
+ const fieldMap = fieldList.reduce((res, field) => {
207
+ res[field.val_key] = field;
208
+ return res;
209
+ }, {});
210
+ return Object.entries(values).reduce((res, [k, v]) => {
211
+ const field = fieldMap[k];
212
+ if (isArray(field.option) && isComplexOption(field.option)) {
213
+ res[k] = JSON.stringify(v);
214
+ } else {
215
+ res[k] = v;
216
+ }
217
+ return res;
218
+ }, {});
131
219
  }
132
220
  return {
133
- calcFieldItemSpan
221
+ combineComplexOptionKey
134
222
  };
135
223
  }
136
224
 
137
- export { useComplexOptions, useComplexOptionsSpan };
225
+ export { useComplexOptions, useComplexOptionsKey, useComplexOptionsSpan };
@@ -77,18 +77,15 @@ function useFieldListAdaptor(collector) {
77
77
  } else if (item.autograph) {
78
78
  bindAutoGraphProps(schema, item);
79
79
  }
80
- bindCommonProps(schema, item);
80
+ const multiple = item.multi_select === "0";
81
+ Object.assign(schema["x-component-props"], {
82
+ multiple,
83
+ options: item.option,
84
+ maxTagCount: parseNumberFromMaybeString(item.multi_select_value),
85
+ ...pick(item, ["lazyRequest", "requestCache"])
86
+ });
87
+ multiple && (schema.type = "array");
81
88
  return schema;
82
- function bindCommonProps(schema2, item2) {
83
- const multiple = item2.multi_select === "0";
84
- Object.assign(schema2["x-component-props"], {
85
- multiple,
86
- options: item2.option,
87
- maxTagCount: parseNumberFromMaybeString(item2.multi_select_value),
88
- ...pick(item2, ["lazyRequest", "requestCache"])
89
- });
90
- multiple && (schema2.type = "array");
91
- }
92
89
  };
93
90
  const createRadioSchema = (item) => {
94
91
  const schema = createStandardSchema(item);
@@ -0,0 +1,29 @@
1
+ import { AnyObject } from '../../../../../es/shared/types';
2
+ import { Form, IFieldState } from '@formily/core';
3
+ import { Ref } from 'vue';
4
+ import { FieldItem, FormItemDepsCollector, FormRenderProps } from '../../../../../es/components/form-render';
5
+ export declare function useFormExposeEvent({ formModel, formRenderRef, formUUID, getFieldList, formItemDepsCollector }: {
6
+ formModel: Form;
7
+ formRenderRef: Ref<HTMLElement | undefined>;
8
+ formUUID: string;
9
+ getFieldList: () => FieldItem[];
10
+ formItemDepsCollector: FormItemDepsCollector;
11
+ }): {
12
+ validate(path?: string): Promise<void>;
13
+ getFormValues(needCombineExtendKey?: boolean, needCombineOptionKey?: boolean): any;
14
+ setFormValues(values: AnyObject, needSplitExtendKey?: boolean): void;
15
+ setFieldState(path: string, handler: (field: IFieldState) => void): void;
16
+ resetFields(path?: string): Promise<void>;
17
+ queryWidget(key: string): Promise<{
18
+ widgetElement: HTMLInputElement | null | undefined;
19
+ widgetElementList: HTMLInputElement[];
20
+ decoratorElement: HTMLElement | null | undefined;
21
+ } | null>;
22
+ };
23
+ export declare function useFormDomEvent({ props, formRenderRef, formModel }: {
24
+ props: FormRenderProps;
25
+ formRenderRef: Ref<HTMLElement | undefined>;
26
+ formModel: Form;
27
+ }): {
28
+ onKeydown: (event: KeyboardEvent) => void;
29
+ };
@@ -0,0 +1,140 @@
1
+ import { arrayed, findAncestor } from '../../../../shared/utils/index.js';
2
+ import { isField } from '@formily/core';
3
+ import { Path } from '@formily/path';
4
+ import { isObject } from '@vue/shared';
5
+ import { isArray, isFunction } from 'lodash-es';
6
+ import { nextTick } from 'vue';
7
+ import '../../index.js';
8
+ import { FormItemLineBarDepKeyPrepend, NESTED_FORM_ITEM_TYPE } from '../constants/index.js';
9
+ import { useComplexOptionsKey } from './useComplexOptions.js';
10
+ import { queryDecorator, queryInput, findNextWidget } from '../utils/dom.js';
11
+ import { validateMessageParser, combineExtendKey, splitExtendKey } from '../utils/index.js';
12
+ import { getParentLinebar } from '../utils/schema.js';
13
+
14
+ function useFormExposeEvent({
15
+ formModel,
16
+ formRenderRef,
17
+ formUUID,
18
+ getFieldList,
19
+ formItemDepsCollector
20
+ }) {
21
+ async function queryWidget(key, wrapperElement, fieldList) {
22
+ if (!formRenderRef.value)
23
+ return createResult();
24
+ const decoratorElement = queryDecorator(key, wrapperElement, formUUID);
25
+ if (decoratorElement)
26
+ return createResult(decoratorElement);
27
+ const parentLinebarKey = getParentLinebar(key, fieldList);
28
+ if (!parentLinebarKey)
29
+ return createResult();
30
+ formItemDepsCollector.trigger(FormItemLineBarDepKeyPrepend + parentLinebarKey, true);
31
+ await nextTick();
32
+ return createResult(queryDecorator(key, wrapperElement, formUUID));
33
+ function createResult(decoratorElement2) {
34
+ return { decoratorElement: decoratorElement2, ...queryInput(decoratorElement2) };
35
+ }
36
+ }
37
+ const { combineComplexOptionKey } = useComplexOptionsKey();
38
+ return {
39
+ validate(path = "*") {
40
+ return formModel.validate(path).catch((err) => {
41
+ return Promise.reject(Array.isArray(err) ? err.reduce(errInfoNormalize, []) : err);
42
+ });
43
+ function errInfoNormalize(result, error) {
44
+ if (!isObject(error))
45
+ return result;
46
+ let hasChildMessage = false;
47
+ if (isArray(error.messages)) {
48
+ error.messages.forEach((message) => {
49
+ if (!isObject(message))
50
+ return;
51
+ result.push(...arrayed(message).map(bindEleInfo));
52
+ hasChildMessage = true;
53
+ });
54
+ }
55
+ !hasChildMessage && result.push(bindEleInfo(error));
56
+ return result;
57
+ }
58
+ function bindEleInfo(info) {
59
+ if (info.decoratorElement)
60
+ return info;
61
+ const pattern = formModel.query(info.path);
62
+ const title = pattern.get("title");
63
+ const messages = info.messages.map(
64
+ (message) => errMessageNormalize(message, pattern.get("decoratorProps"))
65
+ );
66
+ const decoratorElement = queryDecorator(info.path, formRenderRef.value, formUUID);
67
+ return { ...info, messages, title, decoratorElement, ...queryInput(info.decoratorElement) };
68
+ }
69
+ function errMessageNormalize(message, decoratorProps) {
70
+ if (!decoratorProps || !decoratorProps.fieldItem)
71
+ return message;
72
+ return validateMessageParser(message, decoratorProps.fieldItem);
73
+ }
74
+ },
75
+ getFormValues(needCombineExtendKey = true, needCombineOptionKey = true) {
76
+ let result = formModel.getFormState().values;
77
+ if (needCombineExtendKey)
78
+ result = combineExtendKey(getFieldList(), result);
79
+ if (needCombineOptionKey)
80
+ result = combineComplexOptionKey(getFieldList(), result);
81
+ return result;
82
+ },
83
+ setFormValues(values, needSplitExtendKey = true) {
84
+ if (needSplitExtendKey) {
85
+ values = splitExtendKey(getFieldList(), values);
86
+ }
87
+ formModel.setFieldState("*", (state) => {
88
+ if (!isField(state))
89
+ return;
90
+ state.value = Path.getIn(values, state.path);
91
+ });
92
+ },
93
+ setFieldState(path, handler) {
94
+ formModel.setFieldState(path, handler);
95
+ },
96
+ resetFields(path = "*") {
97
+ return formModel.reset(path);
98
+ },
99
+ async queryWidget(key) {
100
+ return formRenderRef.value ? await queryWidget(key, formRenderRef.value, getFieldList()) : null;
101
+ }
102
+ };
103
+ }
104
+ function useFormDomEvent({
105
+ props,
106
+ formRenderRef,
107
+ formModel
108
+ }) {
109
+ function onKeydown(event) {
110
+ var _a;
111
+ if (!props.enterToNextWidget || !formRenderRef.value)
112
+ return;
113
+ const ancestorFormItem = findAncestor(
114
+ event.target,
115
+ (ele) => ele.classList.contains("form-render__formItem")
116
+ );
117
+ if (!ancestorFormItem)
118
+ return;
119
+ const selector = `.form-render__formItem${NESTED_FORM_ITEM_TYPE.map((type) => `:not([widget-type=${type}])`).join(
120
+ ""
121
+ )}`;
122
+ const formItemElements = Array.from(formRenderRef.value.querySelectorAll(selector));
123
+ const formItemIndex = formItemElements.findIndex((ele) => ele.id === ancestorFormItem.id);
124
+ if (!~formItemIndex)
125
+ return;
126
+ const { widget, field } = findNextWidget(formItemElements, formItemIndex, event.target);
127
+ if (!widget)
128
+ return;
129
+ const formItemInstance = field && formModel.query(field).take();
130
+ if (formItemInstance && isFunction(props.enterToNextWidget)) {
131
+ props.enterToNextWidget((_a = formItemInstance.decoratorProps) == null ? void 0 : _a.fieldItem) ? focus() : onKeydown({ target: widget });
132
+ }
133
+ function focus() {
134
+ widget == null ? void 0 : widget.focus();
135
+ }
136
+ }
137
+ return { onKeydown };
138
+ }
139
+
140
+ export { useFormDomEvent, useFormExposeEvent };
@@ -28,7 +28,7 @@ export declare type IdCardParseInfo = Record<'sex' | 'birthday', string> & AgeCo
28
28
  export declare type FormRenderExpose = {
29
29
  formModel: Form;
30
30
  validate(path?: string): Promise<unknown>;
31
- getFormValues(needCombineExtendKey?: boolean): AnyObject;
31
+ getFormValues(needCombineExtendKey?: boolean, needCombineOptionKey?: boolean): AnyObject;
32
32
  setFormValues(values: AnyObject, needSplitExtendKey?: boolean): AnyObject;
33
33
  setFieldState(path: string, setter: (field: Field) => void): void;
34
34
  resetFields(path?: string): void;
@@ -76,6 +76,8 @@ export declare type FormRenderProps = Partial<{
76
76
  lifeCycle: FormRenderLifeCycle;
77
77
  businessFormatter: FormBusinessFormatter;
78
78
  requestInstance: RequestInstance;
79
+ enterToNextWidget: boolean | ((fieldItem: FieldItem) => boolean | void);
80
+ lowCodeReactions: FormLowCodeReactions.Config[];
79
81
  }>;
80
82
  export declare type FormBusinessFormatter = (payload: {
81
83
  fieldKey: string;
@@ -1 +1 @@
1
- .annotation-edit{align-items:center;color:#0067ee;cursor:pointer;display:inline-flex;font-size:16px;user-select:none}.annotation-edit.is-active{color:#ff9828}.annotation-edit__icon{align-items:center;display:inline-flex}.annotation-edit__textarea{min-width:200px}.annotation-edit__footer{align-items:center;display:flex;flex-wrap:nowrap;gap:8px;justify-content:space-between;opacity:.5}.annotation-edit__footer>div{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.annotation-edit__footer>div:first-of-type{min-width:30%}.recommend-search__menu{min-height:100px}.recommend-search__menuRecommendList{display:flex;flex-wrap:wrap;gap:8px;margin-top:4px}.recommend-search__menuRecommendList .n-tag{cursor:pointer}.recommend-search__recentRecommend{margin-bottom:8px}.recommend-search__recentRecommend>header{align-items:center;color:rgba(0,0,0,.4);display:flex;justify-content:space-between}.recommend-search__recentRecommend>header .n-icon:hover{color:rgba(0,0,0,.6);cursor:pointer}.recommend-search__commonRecommend{margin-bottom:8px}.recommend-search__commonRecommend>header{align-items:center;color:rgba(0,0,0,.4);display:flex;justify-content:space-between}.recommend-search__commonRecommend>header .n-icon:hover{color:rgba(0,0,0,.6);cursor:pointer}.recommend-search__option{align-items:center;border-radius:4px;cursor:pointer;display:flex;height:32px;justify-content:space-between;padding:0 8px}.recommend-search__optionText{max-width:calc(100% - 24px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.recommend-search__option.is-active{color:var(--n-color)!important}.recommend-search__option.is-active .n-icon{font-size:20px}.recommend-search__option:hover{background:rgba(0,0,0,.03)}.recommend-search__optionContainer{margin:-8px -10px}.recommend-search__empty{align-items:center;color:rgba(0,0,0,.3);display:flex;height:100px;justify-content:center}.search-cascader__menuWrapper{display:flex;flex-wrap:nowrap;margin:-8px -14px}.search-cascader__input input{cursor:pointer!important}.search-cascader__option{align-items:center;border-radius:4px;box-sizing:border-box;display:flex;height:32px;justify-content:space-between;padding:0 8px 0 16px;width:100%}.search-cascader__option--active{background:#f8f8f8}.search-cascader__option:hover{background:#f5f5f5;cursor:pointer}.search-cascader__optionWrapper{background:#fff;height:256px;overflow-x:auto;width:calc(var(--menu-width)*1px)}.search-cascader__optionWrapper:not(:last-of-type){border:solid #e5e5e5;border-width:0 1px 0 0}.search-cascader__optionText{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:calc(100% - 20px)}.search-cascader__option svg{color:#bfbfbf;flex-shrink:0;font-size:12px;width:20px}.search-cascader__option svg.rotate{animation:rotate 1s linear infinite}.search-cascader__emptyWrapper{align-items:center;background:#fff;box-sizing:border-box;display:flex;height:300px;justify-content:center;padding:16px;width:100%}@keyframes rotate{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.form-render__wrapper{align-items:start;display:grid!important;gap:0 16px;grid-template-columns:repeat(var(--column),minmax(0,1fr));max-height:var(--form-height);overflow-y:auto;position:relative}.form-render__formItem{grid-column:span min(var(--column),var(--form-item-column)) /span min(var(--column),var(--form-item-column))}.form-render__formItem .n-date-picker,.form-render__formItem .n-input-number{width:100%}.form-render__formItemLabel{align-items:center;display:inline-flex;justify-content:space-between;position:relative}.form-render__formItemLabel--operation{align-items:center;display:flex;gap:2px;position:absolute;right:0;top:50%;transform:translateY(-50%)}.form-render__formItemLabel--tooltip{font-size:0;line-height:1;width:16px}.form-render__formItemLabel--text{white-space:nowrap}.form-render__formItem .n-form-item-label{display:inline-flex}.form-render__formItem .n-form-item-label [annotation-hover-show=true]{visibility:hidden}.form-render__formItem .n-form-item-label:hover [annotation-hover-show=true]{visibility:visible}.form-render__linebar{grid-column:span min(var(--column),var(--column)) /span min(var(--column),var(--column))}.form-render__linebarHeader{align-items:center;background:#f2f2f2;border-radius:4px;cursor:pointer;display:flex;font-size:14px;font-weight:500;height:32px;justify-content:space-between;margin-bottom:8px;padding:0 16px}.form-render__linebarHeader>svg{color:rgba(33,33,33,.4);width:14px}.form-render__linebarHeaderTitle{align-items:center;display:flex;gap:4px;vertical-align:middle}.form-render__linebarHeaderTitle svg{height:16px;transform:translateY(-1px)}.form-render__linebarItem{align-items:start;display:grid!important;gap:0 16px;grid-template-columns:repeat(var(--column),minmax(0,1fr))}.form-render__linebreaks{grid-column:span min(var(--column),var(--form-item-column)) /span min(var(--column),var(--form-item-column))}.form-render__inputGroup{align-items:flex-start;display:flex;grid-column:span min(var(--column),var(--column)) /span min(var(--column),var(--column))}.form-render__inputGroup>div{flex:1}.form-render__inputGroup>div:not(:last-of-type) .n-base-selection__border,.form-render__inputGroup>div:not(:last-of-type) .n-input__border{border-bottom-right-radius:0;border-right:0;border-top-right-radius:0}.form-render__inputGroup>div:last-of-type .n-base-selection__border,.form-render__inputGroup>div:last-of-type .n-input__border{border-bottom-left-radius:0;border-top-left-radius:0}.form-render__inputGroup .n-form-item--left-labelled:not(:first-of-type)>label{display:none}.form-render__combination{width:100%}.form-render__combinationHeader{display:flex;gap:12px}.form-render__combinationHeader>h3{font-size:16px;font-weight:700;margin:0;padding:0}.form-render__combinationHeader .n-button__icon{font-size:14px;margin:0 2px 0 0}.form-render__combinationHeaderText{font-size:16px;font-weight:500}.form-render__combinationClose{font-size:16px;height:14px;position:absolute;right:5px;top:5px;width:14px}.form-render__combinationContentJson{position:relative}.form-render__combinationContent{align-items:start;display:grid!important;gap:0 16px;grid-template-columns:repeat(var(--column),minmax(0,1fr));position:relative}.form-render__complex{width:100%}.form-render__complexContent--grid{align-items:start;display:grid!important;gap:0 16px;grid-template-columns:repeat(var(--column),minmax(0,1fr))}.form-render__complexContent--flex{display:flex!important;gap:0 8px}.form-render__selectMenu .n-scrollbar-rail__scrollbar{display:none!important}.form-render__selectMenu .n-virtual-list::-webkit-scrollbar,.form-render__selectMenu .n-virtual-list::-webkit-scrollbar-thumb{display:unset!important;height:6px;width:6px}.form-render__selectMenu .n-virtual-list::-webkit-scrollbar-thumb{background:#bfbfbf;border-radius:4px}.form-render__selectMenu .v-vl-items{min-width:100%;width:max-content}.form-render__selectOption .n-base-select-option__content{overflow:visible!important;text-overflow:unset!important;word-break:keep-all!important}.form-render__labelField{align-items:start;display:grid!important;display:inline-grid!important;gap:0 16px;grid-template-columns:repeat(var(--column),minmax(0,1fr));margin-left:16px}.form-render__labelField label.n-form-item-label.n-form-item-label--left-mark{align-items:center}.form-render__labelField .n-checkbox[aria-checked=false] .n-checkbox-box{background-color:transparent}.form-render__labelField .n-checkbox[aria-checked=false] .n-checkbox-icon .check-icon{opacity:0}.form-render__labelField .n-checkbox[aria-checked=false] .n-checkbox-box__border{border:var(--n-border)}.form-render .n-form-item--left-labelled.form-render__formItem .n-checkbox{align-items:center}.form-render .n-form-item--left-labelled.form-render__formItem .n-checkbox-group>.n-space{align-items:center!important;flex-wrap:nowrap!important}.form-render .n-form-item--left-labelled.form-render__formItem .n-checkbox__label{align-items:center;display:inline-flex}
1
+ .annotation-edit{align-items:center;color:#0067ee;cursor:pointer;display:inline-flex;font-size:16px;user-select:none}.annotation-edit.is-active{color:#ff9828}.annotation-edit__icon{align-items:center;display:inline-flex}.annotation-edit__textarea{min-width:200px}.annotation-edit__footer{align-items:center;display:flex;flex-wrap:nowrap;gap:8px;justify-content:space-between;opacity:.5}.annotation-edit__footer>div{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.annotation-edit__footer>div:first-of-type{min-width:30%}.recommend-search__menu{min-height:100px}.recommend-search__menuRecommendList{display:flex;flex-wrap:wrap;gap:8px;margin-top:4px}.recommend-search__menuRecommendList .n-tag{cursor:pointer}.recommend-search__recentRecommend{margin-bottom:8px}.recommend-search__recentRecommend>header{align-items:center;color:rgba(0,0,0,.4);display:flex;justify-content:space-between}.recommend-search__recentRecommend>header .n-icon:hover{color:rgba(0,0,0,.6);cursor:pointer}.recommend-search__commonRecommend{margin-bottom:8px}.recommend-search__commonRecommend>header{align-items:center;color:rgba(0,0,0,.4);display:flex;justify-content:space-between}.recommend-search__commonRecommend>header .n-icon:hover{color:rgba(0,0,0,.6);cursor:pointer}.recommend-search__option{align-items:center;border-radius:4px;cursor:pointer;display:flex;height:32px;justify-content:space-between;padding:0 8px}.recommend-search__optionText{max-width:calc(100% - 24px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.recommend-search__option.is-active{color:var(--n-color)!important}.recommend-search__option.is-active .n-icon{font-size:20px}.recommend-search__option:hover{background:rgba(0,0,0,.03)}.recommend-search__optionContainer{margin:-8px -10px}.recommend-search__empty{align-items:center;color:rgba(0,0,0,.3);display:flex;height:100px;justify-content:center}.search-cascader__menuWrapper{display:flex;flex-wrap:nowrap;margin:-8px -14px}.search-cascader__input input{cursor:pointer!important}.search-cascader__option{align-items:center;border-radius:4px;box-sizing:border-box;display:flex;height:32px;justify-content:space-between;padding:0 8px 0 16px;width:100%}.search-cascader__option--active{background:#f8f8f8}.search-cascader__option:hover{background:#f5f5f5;cursor:pointer}.search-cascader__optionWrapper{background:#fff;height:256px;overflow-x:auto;width:calc(var(--menu-width)*1px)}.search-cascader__optionWrapper:not(:last-of-type){border:solid #e5e5e5;border-width:0 1px 0 0}.search-cascader__optionText{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:calc(100% - 20px)}.search-cascader__option svg{color:#bfbfbf;flex-shrink:0;font-size:12px;width:20px}.search-cascader__option svg.rotate{animation:rotate 1s linear infinite}.search-cascader__emptyWrapper{align-items:center;background:#fff;box-sizing:border-box;display:flex;height:300px;justify-content:center;padding:16px;width:100%}@keyframes rotate{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.form-render__wrapper{align-items:start;display:grid!important;gap:0 16px;grid-template-columns:repeat(var(--column),minmax(0,1fr));max-height:var(--form-height);overflow-y:auto;position:relative}.form-render__formItem{grid-column:span min(var(--column),var(--form-item-column)) /span min(var(--column),var(--form-item-column))}.form-render__formItem .n-date-picker,.form-render__formItem .n-input-number{width:100%}.form-render__formItemLabel{align-items:center;display:inline-flex;justify-content:space-between;position:relative}.form-render__formItemLabel--operation{align-items:center;display:flex;gap:2px;position:absolute;right:0;top:50%;transform:translateY(-50%)}.form-render__formItemLabel--tooltip{font-size:0;line-height:1;width:16px}.form-render__formItemLabel--text{white-space:nowrap}.form-render__formItem .n-form-item-label{display:inline-flex}.form-render__formItem .n-form-item-label [annotation-hover-show=true]{visibility:hidden}.form-render__formItem .n-form-item-label:hover [annotation-hover-show=true]{visibility:visible}.form-render__linebar{grid-column:span min(var(--column),var(--column)) /span min(var(--column),var(--column))}.form-render__linebarHeader{align-items:center;background:#f2f2f2;border-radius:4px;cursor:pointer;display:flex;font-size:14px;font-weight:500;height:32px;justify-content:space-between;margin-bottom:8px;padding:0 16px}.form-render__linebarHeader>svg{color:rgba(33,33,33,.4);width:14px}.form-render__linebarHeaderTitle{align-items:center;display:flex;gap:4px;vertical-align:middle}.form-render__linebarHeaderTitle svg{height:16px;transform:translateY(-1px)}.form-render__linebarItem{align-items:start;display:grid!important;gap:0 16px;grid-template-columns:repeat(var(--column),minmax(0,1fr))}.form-render__linebreaks{grid-column:span min(var(--column),var(--form-item-column)) /span min(var(--column),var(--form-item-column))}.form-render__inputGroup{align-items:flex-start;display:flex;grid-column:span min(var(--column),var(--column)) /span min(var(--column),var(--column))}.form-render__inputGroup>div{flex:1}.form-render__inputGroup>div:not(:last-of-type) .n-base-selection__border,.form-render__inputGroup>div:not(:last-of-type) .n-input__border{border-bottom-right-radius:0;border-right:0;border-top-right-radius:0}.form-render__inputGroup>div:last-of-type .n-base-selection__border,.form-render__inputGroup>div:last-of-type .n-input__border{border-bottom-left-radius:0;border-top-left-radius:0}.form-render__inputGroup .n-form-item--left-labelled:not(:first-of-type)>label{display:none}.form-render__combination{width:100%}.form-render__combinationHeader{display:flex;gap:12px}.form-render__combinationHeader>h3{font-size:16px;font-weight:700;margin:0;padding:0}.form-render__combinationHeader .n-button__icon{font-size:14px;margin:0 2px 0 0}.form-render__combinationHeaderText{font-size:16px;font-weight:500}.form-render__combinationClose{font-size:16px;height:14px;position:absolute;right:5px;top:5px;width:14px}.form-render__combinationContentJson{position:relative}.form-render__combinationContent{align-items:start;display:grid!important;gap:0 16px;grid-template-columns:repeat(var(--column),minmax(0,1fr));position:relative}.form-render__complex{width:100%}.form-render__complexContent--grid{align-items:start;display:grid!important;gap:0 16px;grid-template-columns:repeat(var(--column),minmax(0,1fr))}.form-render__complexContent--flex{display:flex!important;gap:0 8px}.form-render__selectMenu .n-scrollbar-rail__scrollbar{display:none!important}.form-render__selectMenu .n-virtual-list::-webkit-scrollbar,.form-render__selectMenu .n-virtual-list::-webkit-scrollbar-thumb{display:unset!important;height:6px;width:6px}.form-render__selectMenu .n-virtual-list::-webkit-scrollbar-thumb{background:#bfbfbf;border-radius:4px}.form-render__selectMenu .v-vl-items{min-width:100%;width:max-content}.form-render__selectOption .n-base-select-option__content{overflow:visible!important;text-overflow:unset!important;word-break:keep-all!important}.form-render__labelField{align-items:start;display:grid!important;display:inline-grid!important;gap:0 16px;grid-template-columns:repeat(var(--column),minmax(0,1fr));grid-template-columns:repeat(var(--column),auto)!important;margin-left:16px}.form-render__labelField .n-form-item{display:inline-grid}.form-render__labelField label.n-form-item-label.n-form-item-label--left-mark{align-items:center}.form-render__labelField .n-checkbox[aria-checked=false] .n-checkbox-box{background-color:transparent}.form-render__labelField .n-checkbox[aria-checked=false] .n-checkbox-icon .check-icon{opacity:0}.form-render__labelField .n-checkbox[aria-checked=false] .n-checkbox-box__border{border:var(--n-border)}.form-render .form-render__formItem .n-checkbox,.form-render .form-render__formItem .n-radio{align-items:center}.form-render .form-render__formItem .n-radio-input{left:auto;right:auto}.form-render .form-render__formItem .n-checkbox-group>.n-space:not([vertical-space=true]),.form-render .form-render__formItem .n-radio-group>.n-space:not([vertical-space=true]){align-items:center!important}.form-render .form-render__formItem .n-checkbox__label{align-items:center;display:inline-flex}