@kp-ui/lowcode-pc-v2 0.0.1 → 0.0.2

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 (96) hide show
  1. package/core/src/components/common/render/LowcodeRenderProvider.vue_vue_type_script_setup_true_lang.js +3 -5
  2. package/core/src/components/common/render/RenderWidgetList.vue_vue_type_script_setup_true_lang.js +3 -5
  3. package/core/src/components/common/render/usePageContext.js +25 -30
  4. package/core/src/hooks/useAppRef.js +5 -4
  5. package/core/src/hooks/useFactoryRender.js +4 -2
  6. package/core/src/hooks/useField.js +497 -424
  7. package/core/src/hooks/useLowcode.js +64 -89
  8. package/core/src/hooks/useRemoteData.js +35 -41
  9. package/core/src/hooks/useSelect.js +4 -2
  10. package/core/src/utils/i18n.js +1 -15
  11. package/core/src/utils/smart-vue-i18n/index.js +38 -39
  12. package/package.json +36 -36
  13. package/src/components/public/ActionButtonListRender.vue_vue_type_script_lang.js +26 -32
  14. package/src/components/public/ConfigView/CustomPageRender.vue_vue_type_script_setup_true_lang.js +7 -7
  15. package/src/components/public/CustomerModal/CustomerModal.vue_vue_type_script_setup_true_lang.js +13 -24
  16. package/src/components/public/CustomerModal/useCustomerModal.js +6 -7
  17. package/src/components/public/DataTableColumnDialog.vue_vue_type_script_setup_true_name_DataTableColumnDialog_lang.js +36 -38
  18. package/src/hooks/useTableWidget.js +39 -44
  19. package/src/render/index.vue_vue_type_script_setup_true_lang.js +9 -6
  20. package/src/widgets/advanced/code-editor/index.vue_vue_type_script_setup_true_lang.js +4 -6
  21. package/src/widgets/advanced/code-editor/schema.js +8 -8
  22. package/src/widgets/advanced/custom-render/index.vue_vue_type_script_setup_true_lang.js +4 -6
  23. package/src/widgets/advanced/custom-render/schema.js +7 -5
  24. package/src/widgets/advanced/data-table/index.vue_vue_type_script_setup_true_lang.js +7 -7
  25. package/src/widgets/advanced/data-table/schema.js +3 -3
  26. package/src/widgets/advanced/file-upload/index.vue_vue_type_script_setup_true_lang.js +35 -37
  27. package/src/widgets/advanced/file-upload/schema.js +11 -8
  28. package/src/widgets/advanced/rich-editor/index.vue_vue_type_script_setup_true_lang.js +4 -6
  29. package/src/widgets/advanced/rich-editor/schema.js +10 -9
  30. package/src/widgets/advanced/tree/index.vue_vue_type_script_setup_true_lang.js +4 -6
  31. package/src/widgets/advanced/tree/schema.js +11 -8
  32. package/src/widgets/advanced/tree-select/index.vue_vue_type_script_setup_true_lang.js +6 -7
  33. package/src/widgets/advanced/tree-select/schema.js +11 -10
  34. package/src/widgets/base/button/index.vue_vue_type_script_setup_true_lang.js +7 -6
  35. package/src/widgets/base/button/schema.js +0 -1
  36. package/src/widgets/base/button-list/index.vue_vue_type_script_setup_true_lang.js +3 -5
  37. package/src/widgets/base/button-list/schema.js +0 -1
  38. package/src/widgets/base/cascader/index.vue_vue_type_script_setup_true_lang.js +8 -8
  39. package/src/widgets/base/cascader/schema.js +9 -9
  40. package/src/widgets/base/checkbox/index.vue_vue_type_script_setup_true_lang.js +4 -6
  41. package/src/widgets/base/checkbox/schema.js +9 -9
  42. package/src/widgets/base/color/index.vue_vue_type_script_setup_true_lang.js +4 -6
  43. package/src/widgets/base/color/schema.js +7 -7
  44. package/src/widgets/base/date/index.vue_vue_type_script_setup_true_lang.js +5 -7
  45. package/src/widgets/base/date/schema.js +8 -8
  46. package/src/widgets/base/date-range/index.vue_vue_type_script_setup_true_lang.js +5 -7
  47. package/src/widgets/base/date-range/schema.js +8 -8
  48. package/src/widgets/base/divider/index.vue_vue_type_script_setup_true_lang.js +3 -5
  49. package/src/widgets/base/divider/schema.js +0 -1
  50. package/src/widgets/base/html/index.vue_vue_type_script_setup_true_lang.js +3 -5
  51. package/src/widgets/base/html/schema.js +6 -6
  52. package/src/widgets/base/input/index.vue_vue_type_script_setup_true_lang.js +12 -18
  53. package/src/widgets/base/input/schema.js +11 -8
  54. package/src/widgets/base/number/index.vue_vue_type_script_setup_true_lang.js +8 -7
  55. package/src/widgets/base/number/schema.js +8 -8
  56. package/src/widgets/base/radio/index.vue_vue_type_script_setup_true_lang.js +4 -6
  57. package/src/widgets/base/radio/schema.js +9 -9
  58. package/src/widgets/base/rate/index.vue_vue_type_script_setup_true_lang.js +4 -6
  59. package/src/widgets/base/rate/schema.js +8 -8
  60. package/src/widgets/base/select/index.vue_vue_type_script_setup_true_lang.js +17 -20
  61. package/src/widgets/base/select/schema.js +12 -9
  62. package/src/widgets/base/slider/index.vue_vue_type_script_setup_true_lang.js +5 -7
  63. package/src/widgets/base/slider/schema.js +7 -7
  64. package/src/widgets/base/static-text/index.vue_vue_type_script_setup_true_lang.js +3 -5
  65. package/src/widgets/base/static-text/schema.js +0 -1
  66. package/src/widgets/base/switch/index.vue_vue_type_script_setup_true_lang.js +5 -7
  67. package/src/widgets/base/switch/schema.js +7 -7
  68. package/src/widgets/base/textarea/index.vue_vue_type_script_setup_true_lang.js +8 -7
  69. package/src/widgets/base/textarea/schema.js +8 -8
  70. package/src/widgets/base/time/index.vue_vue_type_script_setup_true_lang.js +7 -8
  71. package/src/widgets/base/time/schema.js +8 -8
  72. package/src/widgets/base/time-range/index.vue_vue_type_script_setup_true_lang.js +8 -7
  73. package/src/widgets/base/time-range/schema.js +8 -8
  74. package/src/widgets/containers/box/index-render.vue_vue_type_script_setup_true_lang.js +4 -6
  75. package/src/widgets/containers/box/schema.js +0 -1
  76. package/src/widgets/containers/collapse/index-render.vue_vue_type_script_setup_true_lang.js +4 -6
  77. package/src/widgets/containers/collapse/schema.js +0 -1
  78. package/src/widgets/containers/dialog/index-render.vue_vue_type_script_setup_true_lang.js +19 -35
  79. package/src/widgets/containers/dialog/schema.js +0 -1
  80. package/src/widgets/containers/form/index-render.vue_vue_type_script_setup_true_lang.js +4 -6
  81. package/src/widgets/containers/form/schema.js +6 -6
  82. package/src/widgets/containers/grid/index-render.vue_vue_type_script_setup_true_lang.js +3 -5
  83. package/src/widgets/containers/grid/schema.js +0 -1
  84. package/src/widgets/containers/grid-col/index-render.vue_vue_type_script_setup_true_lang.js +3 -5
  85. package/src/widgets/containers/grid-col/schema.js +0 -1
  86. package/src/widgets/containers/list/index-render.vue_vue_type_script_setup_true_lang.js +36 -53
  87. package/src/widgets/containers/list/schema.js +3 -3
  88. package/src/widgets/containers/space/index-render.vue_vue_type_script_setup_true_lang.js +4 -6
  89. package/src/widgets/containers/tab/index-render.vue_vue_type_script_setup_true_lang.js +11 -19
  90. package/src/widgets/containers/tab/schema.js +0 -1
  91. package/src/widgets/containers/tab-pane/index-render.vue_vue_type_script_setup_true_lang.js +3 -5
  92. package/src/widgets/containers/tab-pane/schema.js +0 -1
  93. package/src/widgets/template/SecondaryPage/index-render.vue_vue_type_script_setup_true_lang.js +4 -6
  94. package/src/widgets/template/SecondaryPage/schema.js +0 -1
  95. package/src/widgets/wrapper/form-item-wrapper.vue_vue_type_script_setup_true_lang.js +3 -3
  96. package/stats.html +1 -1
@@ -1,430 +1,503 @@
1
- import { EVENT_TYPE, useEmitter } from "../utils/useEmitter.js";
2
- import { useI18n } from "../utils/i18n.js";
3
- import { deepClone } from "../utils/util.js";
4
- import { getEventParams } from "../components/property-editor/propertyRegister.js";
5
- import { useAppRef } from "./useAppRef.js";
6
- import { useFieldRules } from "./useFieldRules.js";
7
- import { computed, inject, onBeforeUnmount, onMounted, ref, toRaw, watch } from "vue";
8
- import _objectSpread from "@oxc-project/runtime/helpers/objectSpread2";
9
- import { useExecFunction } from "tmgc2-share";
10
- import { eq, get, isArray } from "lodash-es";
11
- import _asyncToGenerator from "@oxc-project/runtime/helpers/asyncToGenerator";
1
+ import { EVENT_TYPE, useEmitter } from '../utils/useEmitter.js';
2
+ import { useI18n } from '../utils/i18n.js';
3
+ import { deepClone } from '../utils/util.js';
4
+ import { getEventParams } from '../components/property-editor/propertyRegister.js';
5
+ import { useAppRef } from './useAppRef.js';
6
+ import { useFieldRules } from './useFieldRules.js';
7
+ import { computed, inject, onBeforeUnmount, onMounted, ref, toRaw, watch } from 'vue';
8
+ import { useExecFunction } from 'tmgc2-share';
9
+ import { eq, get, isArray } from 'lodash-es';
12
10
  //#region ../core/src/hooks/useField.ts
13
11
  /**
14
- * 表单字段 Hook,提供表单字段的通用功能
15
- */
12
+ * 表单字段 Hook,提供表单字段的通用功能
13
+ */
16
14
  function useField(widget) {
17
- const formConfig = inject("formConfig", ref({}));
18
- const formModel = inject("formData", ref({}));
19
- const getReadMode = inject("getReadMode", () => false);
20
- const isSubFormField = inject("isSubFormField", false);
21
- const subFormRowIndex = inject("subFormRowIndex", ref(0));
22
- const getSubFormName = inject("getSubFormName", () => "");
23
- const designState = inject("designState", false);
24
- const { registerToRefList, getInstance, getPageInstance, unregisterFromRefList } = useAppRef();
25
- const { context, executeFunction, asyncExecuteFunction } = useExecFunction();
26
- const { i18nt, i18n2t } = useI18n();
27
- const { emitter } = useEmitter();
28
- const fieldEditor = ref(null);
29
- const oldFieldValue = ref(null);
30
- const fieldReadonlyFlag = ref(false);
31
- const loading = ref(false);
32
- /** 获取属性名称 */
33
- const getPropName = computed(() => {
34
- var _widget$props2;
35
- if (isSubFormField && !designState) {
36
- var _widget$props;
37
- return `${getSubFormName()}.${subFormRowIndex.value}.${((_widget$props = widget.props) === null || _widget$props === void 0 ? void 0 : _widget$props.name) || ""}`;
38
- }
39
- return ((_widget$props2 = widget.props) === null || _widget$props2 === void 0 ? void 0 : _widget$props2.name) || "";
40
- });
41
- /** 标签文本 */
42
- const label = computed(() => {
43
- var _widget$props$label, _widget$props3;
44
- return (_widget$props$label = (_widget$props3 = widget.props) === null || _widget$props3 === void 0 ? void 0 : _widget$props3.label) !== null && _widget$props$label !== void 0 ? _widget$props$label : "";
45
- });
46
- /** 字段值 */
47
- const fieldModel = computed({
48
- get() {
49
- return get((formModel === null || formModel === void 0 ? void 0 : formModel.value) || {}, getPropName.value);
50
- },
51
- set(value) {
52
- syncUpdateFormModel(value);
53
- }
54
- });
55
- const { rules, buildFieldRules, clearFieldRules, clearValidate } = useFieldRules({
56
- widget,
57
- getPropName,
58
- getPageInstance,
59
- designState
60
- });
61
- /** 子表单名称 */
62
- const subFormName = computed(() => getSubFormName ? getSubFormName() : "");
63
- /** 子表单数据 */
64
- const subFormData = computed(() => formModel.value[subFormName.value]);
65
- const isFieldWidget = computed(() => widget.category === "field");
66
- /** 组件尺寸 */
67
- const size = computed(() => {
68
- var _widget$props4;
69
- return ((_widget$props4 = widget.props) === null || _widget$props4 === void 0 ? void 0 : _widget$props4.size) || formConfig.value.size || "middle";
70
- });
71
- /** 是否只读模式 */
72
- const isReadMode = computed(() => {
73
- return getReadMode() || fieldReadonlyFlag.value;
74
- });
75
- /** 自定义类名 */
76
- const customClass = computed(() => {
77
- var _widget$props5;
78
- return ((_widget$props5 = widget.props) === null || _widget$props5 === void 0 ? void 0 : _widget$props5.customClass) || [];
79
- });
80
- const dataSource = computed(() => {
81
- return widget.dataSource;
82
- });
83
- /** 处理字段隐藏逻辑 */
84
- const handleHidden = computed(() => {
85
- var _widget$props$hidden, _widget$props6, _widget$events;
86
- if (designState) return false;
87
- const hidden = (_widget$props$hidden = (_widget$props6 = widget.props) === null || _widget$props6 === void 0 ? void 0 : _widget$props6.hidden) !== null && _widget$props$hidden !== void 0 ? _widget$props$hidden : false;
88
- const onHidden = (_widget$events = widget.events) === null || _widget$events === void 0 ? void 0 : _widget$events.onHidden;
89
- if (hidden) return true;
90
- if (onHidden) try {
91
- const result = executeFunction({ functionBody: onHidden });
92
- return typeof result === "boolean" ? result : false;
93
- } catch (_unused) {
94
- return false;
95
- }
96
- return false;
97
- });
98
- /** 处理字段禁用逻辑 */
99
- const handleDisabled = computed(() => {
100
- var _widget$events2;
101
- const { disabled } = widget.props || {};
102
- const onDisabled = (_widget$events2 = widget.events) === null || _widget$events2 === void 0 ? void 0 : _widget$events2.onDisabled;
103
- if (disabled) return true;
104
- if (designState) return;
105
- if (onDisabled) try {
106
- const result = executeFunction({ functionBody: onDisabled });
107
- return typeof result === "boolean" ? result : false;
108
- } catch (_unused2) {
109
- return false;
110
- }
111
- return false;
112
- });
113
- /** 执行组件事件函数 */
114
- const executeWidgetEvent = function() {
115
- var _ref = _asyncToGenerator(function* (eventName, params = {}) {
116
- var _widget$events3;
117
- if (designState) return;
118
- const eventParams = getEventParams(eventName, widget.type);
119
- const eventCode = (_widget$events3 = widget.events) === null || _widget$events3 === void 0 ? void 0 : _widget$events3[eventName];
120
- if (eventCode) yield asyncExecuteFunction({
121
- functionBody: eventCode,
122
- params,
123
- keys: eventParams
124
- });
125
- });
126
- return function executeWidgetEvent(_x) {
127
- return _ref.apply(this, arguments);
128
- };
129
- }();
130
- /** 处理挂载事件 */
131
- const handleOnMounted = function() {
132
- var _ref2 = _asyncToGenerator(function* () {
133
- if (designState) return;
134
- yield executeWidgetEvent("onMounted");
135
- });
136
- return function handleOnMounted() {
137
- return _ref2.apply(this, arguments);
138
- };
139
- }();
140
- /** 处理变更事件 */
141
- const handleOnChange = (val, oldVal, item = {}) => {
142
- var _widget$events4;
143
- if (designState) return;
144
- executeFunction({
145
- functionBody: ((_widget$events4 = widget.events) === null || _widget$events4 === void 0 ? void 0 : _widget$events4.onChange) || "",
146
- params: {
147
- value: val,
148
- oldValue: oldVal,
149
- subFormData: subFormData.value,
150
- rowId: subFormRowIndex.value,
151
- item
152
- },
153
- keys: [
154
- "value",
155
- "oldValue",
156
- "subFormData",
157
- "rowId",
158
- "item"
159
- ]
160
- });
161
- };
162
- /** 处理焦点事件 */
163
- const handleFocusCustomEvent = (event) => {
164
- var _widget$events5;
165
- if (designState) return;
166
- executeFunction({
167
- functionBody: ((_widget$events5 = widget.events) === null || _widget$events5 === void 0 ? void 0 : _widget$events5.onFocus) || "",
168
- params: { event },
169
- keys: ["event"]
170
- });
171
- };
172
- /** 处理失焦事件 */
173
- const handleBlurCustomEvent = (event) => {
174
- var _widget$events6;
175
- if (designState) return;
176
- executeFunction({
177
- functionBody: ((_widget$events6 = widget.events) === null || _widget$events6 === void 0 ? void 0 : _widget$events6.onBlur) || "",
178
- params: { event },
179
- keys: ["event"]
180
- });
181
- };
182
- /** 处理点击事件 */
183
- const onClick = function() {
184
- var _ref3 = _asyncToGenerator(function* () {
185
- if (designState || handleDisabled.value) return;
186
- yield executeWidgetEvent("onClick");
187
- });
188
- return function onClick() {
189
- return _ref3.apply(this, arguments);
190
- };
191
- }();
192
- /** 发送字段数据变更事件 */
193
- const emitFieldDataChange = (newValue, oldValue) => {
194
- if (newValue === null || newValue === void 0 ? void 0 : newValue.target) newValue = newValue.target.value;
195
- if (!context.value) return;
196
- emitter.emit(EVENT_TYPE.ON_FIELD_DATA_CHANGE, {
197
- fieldName: widget.props.name,
198
- value: newValue,
199
- oldValue,
200
- field: widget,
201
- subFormName: subFormName.value,
202
- subFormRowIndex: subFormRowIndex.value
203
- });
204
- };
205
- /** 同步更新表单模型 */
206
- const syncUpdateFormModel = (value) => {
207
- if (designState) {
208
- emitFieldDataChange(value, fieldModel.value);
209
- return;
210
- }
211
- emitter.emit(EVENT_TYPE.ON_FIELD_VALIDATION, [getPropName.value]);
212
- const oldValue = toRaw(fieldModel.value);
213
- emitFieldDataChange(value, oldValue);
214
- handleOnChange(value, oldValue);
215
- };
216
- /** 设置值 */
217
- const setValue = (newValue, disableChangeEvent = false) => {
218
- if (newValue === null || newValue === void 0 ? void 0 : newValue.target) newValue = newValue.target.value;
219
- if (eq(fieldModel.value, newValue)) return;
220
- const oldValue = deepClone(fieldModel.value);
221
- if (widget.type === "file-upload") newValue = showFileList(newValue || []);
222
- else if (widget.type === "code-editor") {
223
- var _getFieldEditor;
224
- (_getFieldEditor = getFieldEditor()) === null || _getFieldEditor === void 0 || _getFieldEditor.setValue(newValue);
225
- }
226
- fieldModel.value = newValue;
227
- if (!disableChangeEvent) emitFieldDataChange(newValue, oldValue);
228
- };
229
- /** 获取值 */
230
- const getValue = () => fieldModel.value;
231
- /** 重置字段 */
232
- const resetField = () => {
233
- var _widget$props7;
234
- setValue((_widget$props7 = widget.props) === null || _widget$props7 === void 0 ? void 0 : _widget$props7.defaultValue);
235
- };
236
- /** 刷新默认值 */
237
- const refreshDefaultValue = () => {
238
- var _widget$props8;
239
- fieldModel.value = (_widget$props8 = widget.props) === null || _widget$props8 === void 0 ? void 0 : _widget$props8.defaultValue;
240
- };
241
- const setReadonly = (flag) => {
242
- if (widget.props) widget.props.readonly = flag;
243
- };
244
- /** 设置禁用 */
245
- const setDisabled = (flag) => {
246
- if (widget.props) widget.props.disabled = flag;
247
- };
248
- /** 设置隐藏 */
249
- const setHidden = (flag) => {
250
- if (widget.props) widget.props.hidden = flag;
251
- flag ? clearFieldRules() : buildFieldRules();
252
- };
253
- /** 设置必填 */
254
- const setRequired = (flag) => {
255
- if ("validation" in widget && widget.validation) widget.validation.required = flag;
256
- buildFieldRules();
257
- if (!designState && !flag) clearValidate();
258
- };
259
- /** 设置标签 */
260
- const setLabel = (newLabel) => {
261
- if (widget.props) widget.props.label = newLabel;
262
- };
263
- /** 设置只读模式 */
264
- const setReadMode = (flag = true) => {
265
- fieldReadonlyFlag.value = flag;
266
- };
267
- /** 添加 CSS 类 */
268
- const addCssClass = (className) => {
269
- if (!widget.props) widget.props = {};
270
- if (!widget.props.customClass) widget.props.customClass = [className];
271
- else widget.props.customClass.push(className);
272
- };
273
- /** 移除 CSS 类 */
274
- const removeCssClass = (className) => {
275
- var _widget$props9;
276
- if (!((_widget$props9 = widget.props) === null || _widget$props9 === void 0 ? void 0 : _widget$props9.customClass)) return;
277
- const idx = widget.props.customClass.indexOf(className);
278
- if (idx > -1) widget.props.customClass.splice(idx, 1);
279
- };
280
- /** 获取字段编辑器 */
281
- const getFieldEditor = () => fieldEditor.value;
282
- /** 获取 DOM 元素 */
283
- const getEl = () => {
284
- var _fieldEditor$value;
285
- return (_fieldEditor$value = fieldEditor.value) === null || _fieldEditor$value === void 0 ? void 0 : _fieldEditor$value.$el;
286
- };
287
- /** 获取 VForm 上下文 */
288
- const getVfCtx = () => {
289
- var _getPageInstance;
290
- return ((_getPageInstance = getPageInstance()) === null || _getPageInstance === void 0 ? void 0 : _getPageInstance.vfCtx) || {};
291
- };
292
- /** 聚焦 */
293
- const focus = () => {
294
- var _fieldEditor$value2, _fieldEditor$value2$f;
295
- (_fieldEditor$value2 = fieldEditor.value) === null || _fieldEditor$value2 === void 0 || (_fieldEditor$value2$f = _fieldEditor$value2.focus) === null || _fieldEditor$value2$f === void 0 || _fieldEditor$value2$f.call(_fieldEditor$value2);
296
- };
297
- /** 显示文件列表 */
298
- const showFileList = (list) => {
299
- if (typeof list === "string") try {
300
- list = JSON.parse(list);
301
- } catch (_unused3) {
302
- return [];
303
- }
304
- if (!isArray(list)) return [];
305
- return list.map((item, uid) => _objectSpread(_objectSpread({}, item), {}, {
306
- name: item.fileName,
307
- uid
308
- }));
309
- };
310
- /** 初始化字段模型 */
311
- const initFieldModel = () => {
312
- let value;
313
- if (isSubFormField) value = fieldModel.value;
314
- else {
315
- var _widget$props$default, _widget$props10;
316
- value = (_widget$props$default = (_widget$props10 = widget.props) === null || _widget$props10 === void 0 ? void 0 : _widget$props10.defaultValue) !== null && _widget$props$default !== void 0 ? _widget$props$default : "";
317
- }
318
- emitFieldDataChange(toRaw(value), toRaw(fieldModel.value));
319
- };
320
- const getSubFormRowIndex = () => {
321
- return subFormRowIndex.value;
322
- };
323
- watch(() => widget.validation, () => {
324
- buildFieldRules();
325
- }, { deep: true });
326
- watch(() => {
327
- var _widget$props11;
328
- return (_widget$props11 = widget.props) === null || _widget$props11 === void 0 ? void 0 : _widget$props11.defaultValue;
329
- }, (val) => {
330
- syncUpdateFormModel(val);
331
- });
332
- onMounted(_asyncToGenerator(function* () {
333
- if (isFieldWidget.value) initFieldModel();
334
- yield registerToRefList();
335
- yield handleOnMounted();
336
- buildFieldRules();
337
- }));
338
- onBeforeUnmount(() => {
339
- unregisterFromRefList();
340
- });
341
- return {
342
- formModel,
343
- context,
344
- fieldEditor,
345
- fieldModel,
346
- oldFieldValue,
347
- fieldReadonlyFlag,
348
- loading,
349
- rules,
350
- customClass,
351
- label,
352
- size,
353
- isReadMode,
354
- handleHidden,
355
- handleDisabled,
356
- getPropName,
357
- formConfig,
358
- subFormName,
359
- subFormData,
360
- field: widget,
361
- widget,
362
- dataSource,
363
- handleOnMounted,
364
- handleOnChange,
365
- handleFocusCustomEvent,
366
- handleBlurCustomEvent,
367
- onClick,
368
- executeWidgetEvent,
369
- executeFunction,
370
- asyncExecuteFunction,
371
- setValue,
372
- getValue,
373
- resetField,
374
- refreshDefaultValue,
375
- emitFieldDataChange,
376
- syncUpdateFormModel,
377
- buildFieldRules,
378
- clearFieldRules,
379
- clearValidate,
380
- setReadonly,
381
- setDisabled,
382
- setHidden,
383
- setRequired,
384
- setLabel,
385
- setReadMode,
386
- addCssClass,
387
- removeCssClass,
388
- getPageInstance,
389
- getFieldEditor,
390
- getEl,
391
- getVfCtx,
392
- focus,
393
- showFileList,
394
- i18nt,
395
- i18n2t,
396
- designState,
397
- isSubFormField,
398
- subFormRowIndex,
399
- defineExposed: {
400
- widget,
401
- field: widget,
402
- fieldModel,
403
- fieldEditor,
404
- isReadMode,
405
- formModel,
406
- getSubFormRowIndex,
407
- setValue,
408
- getValue,
409
- resetField,
410
- setReadonly,
411
- setDisabled,
412
- setHidden,
413
- setRequired,
414
- setLabel,
415
- setReadMode,
416
- addCssClass,
417
- removeCssClass,
418
- clearValidate,
419
- focus,
420
- getEl,
421
- getFieldEditor,
422
- getPageInstance,
423
- getInstance,
424
- getVfCtx,
425
- i18nt
426
- }
427
- };
15
+ const formConfig = inject('formConfig', ref({}));
16
+ const formModel = inject('formData', ref({}));
17
+ const getReadMode = inject('getReadMode', () => false);
18
+ const isSubFormField = inject('isSubFormField', false);
19
+ const subFormRowIndex = inject('subFormRowIndex', ref(0));
20
+ const getSubFormName = inject('getSubFormName', () => '');
21
+ const designState = inject('designState', false);
22
+ const { registerToRefList, getInstance, getPageInstance, unregisterFromRefList } = useAppRef();
23
+ const { context, executeFunction, asyncExecuteFunction } = useExecFunction();
24
+ const { i18nt, i18n2t } = useI18n();
25
+ const { emitter } = useEmitter();
26
+ const fieldEditor = ref(null);
27
+ const oldFieldValue = ref(null);
28
+ const fieldReadonlyFlag = ref(false);
29
+ const loading = ref(false);
30
+ /** 获取属性名称 */
31
+ const getPropName = computed(() => {
32
+ var _widget$props2;
33
+ if (isSubFormField && !designState) {
34
+ var _widget$props;
35
+ return `${getSubFormName()}.${subFormRowIndex.value}.${
36
+ ((_widget$props = widget.props) === null || _widget$props === void 0
37
+ ? void 0
38
+ : _widget$props.name) || ''
39
+ }`;
40
+ }
41
+ return (
42
+ ((_widget$props2 = widget.props) === null || _widget$props2 === void 0
43
+ ? void 0
44
+ : _widget$props2.name) || ''
45
+ );
46
+ });
47
+ /** 标签文本 */
48
+ const label = computed(() => {
49
+ var _widget$props$label, _widget$props3;
50
+ return (_widget$props$label =
51
+ (_widget$props3 = widget.props) === null || _widget$props3 === void 0
52
+ ? void 0
53
+ : _widget$props3.label) !== null && _widget$props$label !== void 0
54
+ ? _widget$props$label
55
+ : '';
56
+ });
57
+ /** 字段值 */
58
+ const fieldModel = computed({
59
+ get() {
60
+ return get(
61
+ (formModel === null || formModel === void 0 ? void 0 : formModel.value) || {},
62
+ getPropName.value
63
+ );
64
+ },
65
+ set(value) {
66
+ syncUpdateFormModel(value);
67
+ }
68
+ });
69
+ const { rules, buildFieldRules, clearFieldRules, clearValidate } = useFieldRules({
70
+ widget,
71
+ getPropName,
72
+ getPageInstance,
73
+ designState
74
+ });
75
+ /** 子表单名称 */
76
+ const subFormName = computed(() => (getSubFormName ? getSubFormName() : ''));
77
+ /** 子表单数据 */
78
+ const subFormData = computed(() => formModel.value[subFormName.value]);
79
+ const isFieldWidget = computed(() => widget.category === 'field');
80
+ /** 组件尺寸 */
81
+ const size = computed(() => {
82
+ var _widget$props4;
83
+ return (
84
+ ((_widget$props4 = widget.props) === null || _widget$props4 === void 0
85
+ ? void 0
86
+ : _widget$props4.size) ||
87
+ formConfig.value.size ||
88
+ 'middle'
89
+ );
90
+ });
91
+ /** 是否只读模式 */
92
+ const isReadMode = computed(() => {
93
+ return getReadMode() || fieldReadonlyFlag.value;
94
+ });
95
+ /** 自定义类名 */
96
+ const customClass = computed(() => {
97
+ var _widget$props5;
98
+ return (
99
+ ((_widget$props5 = widget.props) === null || _widget$props5 === void 0
100
+ ? void 0
101
+ : _widget$props5.customClass) || []
102
+ );
103
+ });
104
+ const dataSource = computed(() => {
105
+ return widget.dataSource;
106
+ });
107
+ /** 处理字段隐藏逻辑 */
108
+ const handleHidden = computed(() => {
109
+ var _widget$props$hidden, _widget$props6, _widget$events;
110
+ if (designState) return false;
111
+ const hidden =
112
+ (_widget$props$hidden =
113
+ (_widget$props6 = widget.props) === null || _widget$props6 === void 0
114
+ ? void 0
115
+ : _widget$props6.hidden) !== null && _widget$props$hidden !== void 0
116
+ ? _widget$props$hidden
117
+ : false;
118
+ const onHidden =
119
+ (_widget$events = widget.events) === null || _widget$events === void 0
120
+ ? void 0
121
+ : _widget$events.onHidden;
122
+ if (hidden) return true;
123
+ if (onHidden)
124
+ try {
125
+ const result = executeFunction({ functionBody: onHidden });
126
+ return typeof result === 'boolean' ? result : false;
127
+ } catch (_unused) {
128
+ return false;
129
+ }
130
+ return false;
131
+ });
132
+ /** 处理字段禁用逻辑 */
133
+ const handleDisabled = computed(() => {
134
+ var _widget$events2;
135
+ const { disabled } = widget.props || {};
136
+ const onDisabled =
137
+ (_widget$events2 = widget.events) === null || _widget$events2 === void 0
138
+ ? void 0
139
+ : _widget$events2.onDisabled;
140
+ if (disabled) return true;
141
+ if (designState) return;
142
+ if (onDisabled)
143
+ try {
144
+ const result = executeFunction({ functionBody: onDisabled });
145
+ return typeof result === 'boolean' ? result : false;
146
+ } catch (_unused2) {
147
+ return false;
148
+ }
149
+ return false;
150
+ });
151
+ /** 执行组件事件函数 */
152
+ const executeWidgetEvent = async (eventName, params = {}) => {
153
+ var _widget$events3;
154
+ if (designState) return;
155
+ const eventParams = getEventParams(eventName, widget.type);
156
+ const eventCode =
157
+ (_widget$events3 = widget.events) === null || _widget$events3 === void 0
158
+ ? void 0
159
+ : _widget$events3[eventName];
160
+ if (eventCode)
161
+ await asyncExecuteFunction({
162
+ functionBody: eventCode,
163
+ params,
164
+ keys: eventParams
165
+ });
166
+ };
167
+ /** 处理挂载事件 */
168
+ const handleOnMounted = async () => {
169
+ if (designState) return;
170
+ await executeWidgetEvent('onMounted');
171
+ };
172
+ /** 处理变更事件 */
173
+ const handleOnChange = (val, oldVal, item = {}) => {
174
+ var _widget$events4;
175
+ if (designState) return;
176
+ executeFunction({
177
+ functionBody:
178
+ ((_widget$events4 = widget.events) === null || _widget$events4 === void 0
179
+ ? void 0
180
+ : _widget$events4.onChange) || '',
181
+ params: {
182
+ value: val,
183
+ oldValue: oldVal,
184
+ subFormData: subFormData.value,
185
+ rowId: subFormRowIndex.value,
186
+ item
187
+ },
188
+ keys: ['value', 'oldValue', 'subFormData', 'rowId', 'item']
189
+ });
190
+ };
191
+ /** 处理焦点事件 */
192
+ const handleFocusCustomEvent = event => {
193
+ var _widget$events5;
194
+ if (designState) return;
195
+ executeFunction({
196
+ functionBody:
197
+ ((_widget$events5 = widget.events) === null || _widget$events5 === void 0
198
+ ? void 0
199
+ : _widget$events5.onFocus) || '',
200
+ params: { event },
201
+ keys: ['event']
202
+ });
203
+ };
204
+ /** 处理失焦事件 */
205
+ const handleBlurCustomEvent = event => {
206
+ var _widget$events6;
207
+ if (designState) return;
208
+ executeFunction({
209
+ functionBody:
210
+ ((_widget$events6 = widget.events) === null || _widget$events6 === void 0
211
+ ? void 0
212
+ : _widget$events6.onBlur) || '',
213
+ params: { event },
214
+ keys: ['event']
215
+ });
216
+ };
217
+ /** 处理点击事件 */
218
+ const onClick = async () => {
219
+ if (designState || handleDisabled.value) return;
220
+ await executeWidgetEvent('onClick');
221
+ };
222
+ /** 发送字段数据变更事件 */
223
+ const emitFieldDataChange = (newValue, oldValue) => {
224
+ if (newValue === null || newValue === void 0 ? void 0 : newValue.target)
225
+ newValue = newValue.target.value;
226
+ if (!context.value) return;
227
+ emitter.emit(EVENT_TYPE.ON_FIELD_DATA_CHANGE, {
228
+ fieldName: widget.props.name,
229
+ value: newValue,
230
+ oldValue,
231
+ field: widget,
232
+ subFormName: subFormName.value,
233
+ subFormRowIndex: subFormRowIndex.value
234
+ });
235
+ };
236
+ /** 同步更新表单模型 */
237
+ const syncUpdateFormModel = value => {
238
+ if (designState) {
239
+ emitFieldDataChange(value, fieldModel.value);
240
+ return;
241
+ }
242
+ emitter.emit(EVENT_TYPE.ON_FIELD_VALIDATION, [getPropName.value]);
243
+ const oldValue = toRaw(fieldModel.value);
244
+ emitFieldDataChange(value, oldValue);
245
+ handleOnChange(value, oldValue);
246
+ };
247
+ /** 设置值 */
248
+ const setValue = (newValue, disableChangeEvent = false) => {
249
+ if (newValue === null || newValue === void 0 ? void 0 : newValue.target)
250
+ newValue = newValue.target.value;
251
+ if (eq(fieldModel.value, newValue)) return;
252
+ const oldValue = deepClone(fieldModel.value);
253
+ if (widget.type === 'file-upload') newValue = showFileList(newValue || []);
254
+ else if (widget.type === 'code-editor') {
255
+ var _getFieldEditor;
256
+ (_getFieldEditor = getFieldEditor()) === null ||
257
+ _getFieldEditor === void 0 ||
258
+ _getFieldEditor.setValue(newValue);
259
+ }
260
+ fieldModel.value = newValue;
261
+ if (!disableChangeEvent) emitFieldDataChange(newValue, oldValue);
262
+ };
263
+ /** 获取值 */
264
+ const getValue = () => fieldModel.value;
265
+ /** 重置字段 */
266
+ const resetField = () => {
267
+ var _widget$props7;
268
+ setValue(
269
+ (_widget$props7 = widget.props) === null || _widget$props7 === void 0
270
+ ? void 0
271
+ : _widget$props7.defaultValue
272
+ );
273
+ };
274
+ /** 刷新默认值 */
275
+ const refreshDefaultValue = () => {
276
+ var _widget$props8;
277
+ fieldModel.value =
278
+ (_widget$props8 = widget.props) === null || _widget$props8 === void 0
279
+ ? void 0
280
+ : _widget$props8.defaultValue;
281
+ };
282
+ const setReadonly = flag => {
283
+ if (widget.props) widget.props.readonly = flag;
284
+ };
285
+ /** 设置禁用 */
286
+ const setDisabled = flag => {
287
+ if (widget.props) widget.props.disabled = flag;
288
+ };
289
+ /** 设置隐藏 */
290
+ const setHidden = flag => {
291
+ if (widget.props) widget.props.hidden = flag;
292
+ flag ? clearFieldRules() : buildFieldRules();
293
+ };
294
+ /** 设置必填 */
295
+ const setRequired = flag => {
296
+ if ('validation' in widget && widget.validation) widget.validation.required = flag;
297
+ buildFieldRules();
298
+ if (!designState && !flag) clearValidate();
299
+ };
300
+ /** 设置标签 */
301
+ const setLabel = newLabel => {
302
+ if (widget.props) widget.props.label = newLabel;
303
+ };
304
+ /** 设置只读模式 */
305
+ const setReadMode = (flag = true) => {
306
+ fieldReadonlyFlag.value = flag;
307
+ };
308
+ /** 添加 CSS 类 */
309
+ const addCssClass = className => {
310
+ if (!widget.props) widget.props = {};
311
+ if (!widget.props.customClass) widget.props.customClass = [className];
312
+ else widget.props.customClass.push(className);
313
+ };
314
+ /** 移除 CSS */
315
+ const removeCssClass = className => {
316
+ var _widget$props9;
317
+ if (
318
+ !((_widget$props9 = widget.props) === null || _widget$props9 === void 0
319
+ ? void 0
320
+ : _widget$props9.customClass)
321
+ )
322
+ return;
323
+ const idx = widget.props.customClass.indexOf(className);
324
+ if (idx > -1) widget.props.customClass.splice(idx, 1);
325
+ };
326
+ /** 获取字段编辑器 */
327
+ const getFieldEditor = () => fieldEditor.value;
328
+ /** 获取 DOM 元素 */
329
+ const getEl = () => {
330
+ var _fieldEditor$value;
331
+ return (_fieldEditor$value = fieldEditor.value) === null || _fieldEditor$value === void 0
332
+ ? void 0
333
+ : _fieldEditor$value.$el;
334
+ };
335
+ /** 获取 VForm 上下文 */
336
+ const getVfCtx = () => {
337
+ var _getPageInstance;
338
+ return (
339
+ ((_getPageInstance = getPageInstance()) === null || _getPageInstance === void 0
340
+ ? void 0
341
+ : _getPageInstance.vfCtx) || {}
342
+ );
343
+ };
344
+ /** 聚焦 */
345
+ const focus = () => {
346
+ var _fieldEditor$value2, _fieldEditor$value2$f;
347
+ (_fieldEditor$value2 = fieldEditor.value) === null ||
348
+ _fieldEditor$value2 === void 0 ||
349
+ (_fieldEditor$value2$f = _fieldEditor$value2.focus) === null ||
350
+ _fieldEditor$value2$f === void 0 ||
351
+ _fieldEditor$value2$f.call(_fieldEditor$value2);
352
+ };
353
+ /** 显示文件列表 */
354
+ const showFileList = list => {
355
+ if (typeof list === 'string')
356
+ try {
357
+ list = JSON.parse(list);
358
+ } catch (_unused3) {
359
+ return [];
360
+ }
361
+ if (!isArray(list)) return [];
362
+ return list.map((item, uid) => ({
363
+ ...item,
364
+ name: item.fileName,
365
+ uid
366
+ }));
367
+ };
368
+ /** 初始化字段模型 */
369
+ const initFieldModel = () => {
370
+ let value;
371
+ if (isSubFormField) value = fieldModel.value;
372
+ else {
373
+ var _widget$props$default, _widget$props10;
374
+ value =
375
+ (_widget$props$default =
376
+ (_widget$props10 = widget.props) === null || _widget$props10 === void 0
377
+ ? void 0
378
+ : _widget$props10.defaultValue) !== null && _widget$props$default !== void 0
379
+ ? _widget$props$default
380
+ : '';
381
+ }
382
+ emitFieldDataChange(toRaw(value), toRaw(fieldModel.value));
383
+ };
384
+ const getSubFormRowIndex = () => {
385
+ return subFormRowIndex.value;
386
+ };
387
+ watch(
388
+ () => widget.validation,
389
+ () => {
390
+ buildFieldRules();
391
+ },
392
+ { deep: true }
393
+ );
394
+ watch(
395
+ () => {
396
+ var _widget$props11;
397
+ return (_widget$props11 = widget.props) === null || _widget$props11 === void 0
398
+ ? void 0
399
+ : _widget$props11.defaultValue;
400
+ },
401
+ val => {
402
+ syncUpdateFormModel(val);
403
+ }
404
+ );
405
+ onMounted(async () => {
406
+ if (isFieldWidget.value) initFieldModel();
407
+ await registerToRefList();
408
+ await handleOnMounted();
409
+ buildFieldRules();
410
+ });
411
+ onBeforeUnmount(() => {
412
+ unregisterFromRefList();
413
+ });
414
+ return {
415
+ formModel,
416
+ context,
417
+ fieldEditor,
418
+ fieldModel,
419
+ oldFieldValue,
420
+ fieldReadonlyFlag,
421
+ loading,
422
+ rules,
423
+ customClass,
424
+ label,
425
+ size,
426
+ isReadMode,
427
+ handleHidden,
428
+ handleDisabled,
429
+ getPropName,
430
+ formConfig,
431
+ subFormName,
432
+ subFormData,
433
+ field: widget,
434
+ widget,
435
+ dataSource,
436
+ handleOnMounted,
437
+ handleOnChange,
438
+ handleFocusCustomEvent,
439
+ handleBlurCustomEvent,
440
+ onClick,
441
+ executeWidgetEvent,
442
+ executeFunction,
443
+ asyncExecuteFunction,
444
+ setValue,
445
+ getValue,
446
+ resetField,
447
+ refreshDefaultValue,
448
+ emitFieldDataChange,
449
+ syncUpdateFormModel,
450
+ buildFieldRules,
451
+ clearFieldRules,
452
+ clearValidate,
453
+ setReadonly,
454
+ setDisabled,
455
+ setHidden,
456
+ setRequired,
457
+ setLabel,
458
+ setReadMode,
459
+ addCssClass,
460
+ removeCssClass,
461
+ getPageInstance,
462
+ getFieldEditor,
463
+ getEl,
464
+ getVfCtx,
465
+ focus,
466
+ showFileList,
467
+ i18nt,
468
+ i18n2t,
469
+ designState,
470
+ isSubFormField,
471
+ subFormRowIndex,
472
+ defineExposed: {
473
+ widget,
474
+ field: widget,
475
+ fieldModel,
476
+ fieldEditor,
477
+ isReadMode,
478
+ formModel,
479
+ getSubFormRowIndex,
480
+ setValue,
481
+ getValue,
482
+ resetField,
483
+ setReadonly,
484
+ setDisabled,
485
+ setHidden,
486
+ setRequired,
487
+ setLabel,
488
+ setReadMode,
489
+ addCssClass,
490
+ removeCssClass,
491
+ clearValidate,
492
+ focus,
493
+ getEl,
494
+ getFieldEditor,
495
+ getPageInstance,
496
+ getInstance,
497
+ getVfCtx,
498
+ i18nt
499
+ }
500
+ };
428
501
  }
429
502
  //#endregion
430
503
  export { useField };