sohelp-eleplus 1.1.13

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 (191) hide show
  1. package/README.md +7 -0
  2. package/cache/DictCache.js +58 -0
  3. package/cache/ModuleCache.js +352 -0
  4. package/components.js +45 -0
  5. package/core-export.js +4 -0
  6. package/http/CrudHttp.js +115 -0
  7. package/http/DictHttp.js +12 -0
  8. package/http/ModuleHttp.js +68 -0
  9. package/http/SohelpHttp.js +125 -0
  10. package/index.js +6 -0
  11. package/installer.js +8 -0
  12. package/lang/en_US.js +4 -0
  13. package/lang/zh_CN.js +4 -0
  14. package/lang/zh_TW.js +4 -0
  15. package/package.json +9 -0
  16. package/sohelp-ace-editor/index.vue +198 -0
  17. package/sohelp-application-select/index.vue +15 -0
  18. package/sohelp-autocode/index.vue +53 -0
  19. package/sohelp-calendar-view/index.vue +11 -0
  20. package/sohelp-card-view/index.vue +11 -0
  21. package/sohelp-condition/index.vue +210 -0
  22. package/sohelp-cry-input/index.vue +64 -0
  23. package/sohelp-date/index.vue +27 -0
  24. package/sohelp-datetime/index.vue +44 -0
  25. package/sohelp-datetime-picker/index.vue +86 -0
  26. package/sohelp-datetime-range/index.vue +59 -0
  27. package/sohelp-dict/index.vue +207 -0
  28. package/sohelp-dict/props.js +68 -0
  29. package/sohelp-drawer/index.vue +31 -0
  30. package/sohelp-drop-card/index.vue +94 -0
  31. package/sohelp-drop-card/props.js +68 -0
  32. package/sohelp-dyn-select/index.vue +99 -0
  33. package/sohelp-dyn-select/props.js +67 -0
  34. package/sohelp-dyn-tree/index.vue +82 -0
  35. package/sohelp-dyn-tree-select/index.vue +114 -0
  36. package/sohelp-entity-form/index.vue +524 -0
  37. package/sohelp-entity-grid/index.vue +30 -0
  38. package/sohelp-file-upload/index.vue +218 -0
  39. package/sohelp-filter-scheme/components/condition.vue +102 -0
  40. package/sohelp-filter-scheme/components/filter.vue +45 -0
  41. package/sohelp-filter-scheme/components/keywords.vue +15 -0
  42. package/sohelp-filter-scheme/components/scheme.vue +49 -0
  43. package/sohelp-filter-scheme/index.vue +113 -0
  44. package/sohelp-grid/SohelpGridConfig.js~ +408 -0
  45. package/sohelp-grid/components/filter-condition-item.vue +298 -0
  46. package/sohelp-grid/index.vue +1886 -0
  47. package/sohelp-grid/js/ConditionType.js +101 -0
  48. package/sohelp-grid/js/DefaultGridOptions.js +141 -0
  49. package/sohelp-grid/js/DefaultProps.js +27 -0
  50. package/sohelp-grid/js/SohelpConfigFunction.js +0 -0
  51. package/sohelp-grid/js/SohelpGridConfig.js +101 -0
  52. package/sohelp-grid/js/useSohelpGridConfig.js +519 -0
  53. package/sohelp-grid-select/index.vue +245 -0
  54. package/sohelp-grid-view/filter/config/grid-filter-condition.vue +221 -0
  55. package/sohelp-grid-view/filter/config/grid-filter-config.vue +27 -0
  56. package/sohelp-grid-view/filter/config/grid-filter-field.vue +378 -0
  57. package/sohelp-grid-view/filter/config/grid-filter-keywords.vue +310 -0
  58. package/sohelp-grid-view/filter/config/grid-filter-list.vue +313 -0
  59. package/sohelp-grid-view/filter/config/grid-filter-scheme.vue +264 -0
  60. package/sohelp-grid-view/filter/config/grid-filter-sort.vue +310 -0
  61. package/sohelp-grid-view/filter/config/index.vue +206 -0
  62. package/sohelp-grid-view/filter/filter-form.vue +427 -0
  63. package/sohelp-grid-view/filter/filter-toolbar.vue +110 -0
  64. package/sohelp-grid-view/filter/index.vue +160 -0
  65. package/sohelp-grid-view/index.vue +379 -0
  66. package/sohelp-grid-view-select/index.vue +141 -0
  67. package/sohelp-group-view/index.vue +11 -0
  68. package/sohelp-icon-select/index.vue +96 -0
  69. package/sohelp-icon-select/vxeui-icon.js +90 -0
  70. package/sohelp-image-upload/index.vue +286 -0
  71. package/sohelp-input/index.vue +39 -0
  72. package/sohelp-modal/index.vue +49 -0
  73. package/sohelp-module/index.vue +54 -0
  74. package/sohelp-module/useModalManager.js +89 -0
  75. package/sohelp-module/useSohelpModule.js +66 -0
  76. package/sohelp-number-input/index.vue +32 -0
  77. package/sohelp-number-range/index.vue +135 -0
  78. package/sohelp-org-select/index.vue +30 -0
  79. package/sohelp-org-tree/index.vue +18 -0
  80. package/sohelp-org-tree-select/index.vue +93 -0
  81. package/sohelp-org-user-tree/index.vue +26 -0
  82. package/sohelp-org-user-tree-select/index.vue +11 -0
  83. package/sohelp-pagination/index.vue +11 -0
  84. package/sohelp-power/index.vue +105 -0
  85. package/sohelp-pro-form/components/pro-form-footer.vue +44 -0
  86. package/sohelp-pro-form/components/pro-form-item.vue +1133 -0
  87. package/sohelp-pro-form/index.vue +257 -0
  88. package/sohelp-pro-form/util.js +140 -0
  89. package/sohelp-pro-layout/index.vue +11 -0
  90. package/sohelp-pro-table/index.vue +14 -0
  91. package/sohelp-process/index.vue +216 -0
  92. package/sohelp-rate/index.vue +56 -0
  93. package/sohelp-rate/props.js +71 -0
  94. package/sohelp-relation/index.vue +11 -0
  95. package/sohelp-rich-text/index.vue +242 -0
  96. package/sohelp-rich-text/util.js +231 -0
  97. package/sohelp-richtext/index.vue +10 -0
  98. package/sohelp-role-select/index.vue +33 -0
  99. package/sohelp-search/components/search-config.vue +0 -0
  100. package/sohelp-search/index.vue +49 -0
  101. package/sohelp-search-pro-form/index.vue +11 -0
  102. package/sohelp-select/index.vue +120 -0
  103. package/sohelp-split-panel/index.vue +15 -0
  104. package/sohelp-switch/index.vue +56 -0
  105. package/sohelp-table/index.vue +151 -0
  106. package/sohelp-tenant-select/index.vue +128 -0
  107. package/sohelp-text/index.vue +14 -0
  108. package/sohelp-textarea-input/index.vue +36 -0
  109. package/sohelp-time/index.vue +10 -0
  110. package/sohelp-tree/index.vue +37 -0
  111. package/sohelp-tree-select/index.vue +18 -0
  112. package/sohelp-user-select/index.vue +44 -0
  113. package/sohelp-user-select/index.vue~ +53 -0
  114. package/sohelp-user-select/props.js +71 -0
  115. package/sohelp-user-tag/index.vue +12 -0
  116. package/sohelp-user-tree/index.vue +11 -0
  117. package/sohelp-vform-drawer/index.vue +40 -0
  118. package/sohelp-vform-eleplus/favicon.ico +0 -0
  119. package/sohelp-vform-eleplus/index.vue +297 -0
  120. package/sohelp-vform-eleplus/preview.html +91 -0
  121. package/sohelp-vform-eleplus/render.es.js +72433 -0
  122. package/sohelp-vform-eleplus/render.style.css +16 -0
  123. package/sohelp-vform-eleplus/render.umd.js +57 -0
  124. package/sohelp-vform-eleplus/tinymce/langs/zh_CN.js +462 -0
  125. package/sohelp-vform-eleplus/tinymce/langs/zh_TW.js +419 -0
  126. package/sohelp-vform-eleplus/tinymce/skins/content/dark/content.css +72 -0
  127. package/sohelp-vform-eleplus/tinymce/skins/content/dark/content.min.css +7 -0
  128. package/sohelp-vform-eleplus/tinymce/skins/content/default/content.css +67 -0
  129. package/sohelp-vform-eleplus/tinymce/skins/content/default/content.min.css +7 -0
  130. package/sohelp-vform-eleplus/tinymce/skins/content/document/content.css +72 -0
  131. package/sohelp-vform-eleplus/tinymce/skins/content/document/content.min.css +7 -0
  132. package/sohelp-vform-eleplus/tinymce/skins/content/writer/content.css +68 -0
  133. package/sohelp-vform-eleplus/tinymce/skins/content/writer/content.min.css +7 -0
  134. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/content.css +732 -0
  135. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/content.inline.css +726 -0
  136. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/content.inline.min.css +7 -0
  137. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/content.min.css +7 -0
  138. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/content.mobile.css +29 -0
  139. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/content.mobile.min.css +7 -0
  140. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff +0 -0
  141. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/skin.css +3047 -0
  142. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/skin.min.css +7 -0
  143. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/skin.mobile.css +673 -0
  144. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/skin.mobile.min.css +7 -0
  145. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/skin.shadowdom.css +37 -0
  146. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide/skin.shadowdom.min.css +7 -0
  147. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/content.css +714 -0
  148. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/content.inline.css +726 -0
  149. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/content.inline.min.css +7 -0
  150. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/content.min.css +7 -0
  151. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/content.mobile.css +29 -0
  152. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/content.mobile.min.css +7 -0
  153. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff +0 -0
  154. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/skin.css +3047 -0
  155. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/skin.min.css +7 -0
  156. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/skin.mobile.css +673 -0
  157. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/skin.mobile.min.css +7 -0
  158. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/skin.shadowdom.css +37 -0
  159. package/sohelp-vform-eleplus/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css +7 -0
  160. package/sohelp-vform-modal/index.vue +41 -0
  161. package/sohelp-vform-select/index.vue +11 -0
  162. package/sohelp-vform-vant/favicon.ico +0 -0
  163. package/sohelp-vform-vant/render.es.js +14608 -0
  164. package/sohelp-vform-vant/render.style.css +1 -0
  165. package/sohelp-vform-vant/render.umd.js +22 -0
  166. package/sohelp-vxe-grid/DefaultGridOptions.js +102 -0
  167. package/sohelp-vxe-grid/DefaultProps.js +37 -0
  168. package/sohelp-vxe-grid/SohelpGridConfig.js +142 -0
  169. package/sohelp-vxe-grid/index.vue +518 -0
  170. package/sohelp-vxe-grid-select/index.vue +148 -0
  171. package/sohelp-vxe-table/index.vue +184 -0
  172. package/sohelp-workflow/index.vue +495 -0
  173. package/sohelp-workflow/nodeWrap.vue +53 -0
  174. package/sohelp-workflow/nodes/addNode.vue +27 -0
  175. package/sohelp-workflow/nodes/approver.vue +125 -0
  176. package/sohelp-workflow/nodes/branch.vue +434 -0
  177. package/sohelp-workflow/nodes/promoter.vue +80 -0
  178. package/sohelp-workflow/nodes/send.vue +95 -0
  179. package/sohelp-workflow-drawer/components/approval-modal.vue +182 -0
  180. package/sohelp-workflow-drawer/components/draw-box.vue +141 -0
  181. package/sohelp-workflow-drawer/components/form.vue +79 -0
  182. package/sohelp-workflow-drawer/components/table.vue +153 -0
  183. package/sohelp-workflow-drawer/components/timeline.vue +189 -0
  184. package/sohelp-workflow-drawer/components/workflow.vue +68 -0
  185. package/sohelp-workflow-drawer/index.vue +311 -0
  186. package/sohelp-workflow-drawer/js/index.js +119 -0
  187. package/style/index.scss +0 -0
  188. package/utils/ProFormConvertUtil.js +76 -0
  189. package/utils/core.js +310 -0
  190. package/utils/use-form-data.js +48 -0
  191. package/utils/use-mobile.js +43 -0
@@ -0,0 +1,524 @@
1
+ <template>
2
+ <div class="sohelp-entity-form" v-loading="loading">
3
+ <sohelp-pro-form
4
+ ref="proFormRef"
5
+ :model="formValue"
6
+ :data="formData"
7
+ :items="items"
8
+ :footer="false"
9
+ :readonly="readonly"
10
+ :label-width="labelWidth"
11
+ :labelPosition="grid === 1 ? 'top' : 'left'"
12
+ v-bind="$attrs"
13
+ :size="globalConfig.size"
14
+ :grid="grid === 1 ? false : { span: 24 / grid }"
15
+ :rowProps="{
16
+ gutter: 20
17
+ }"
18
+ @updateValue="setFieldValue"
19
+ >
20
+ <!-- 自定义插槽 -->
21
+ <template v-for="name in Object.keys($slots)" #[name]="slotProps">
22
+ <slot :name="name" v-bind="slotProps || {}"></slot>
23
+ </template>
24
+ </sohelp-pro-form>
25
+ </div>
26
+ </template>
27
+ <script setup>
28
+ import { inject, nextTick, reactive, ref, watch } from 'vue';
29
+ import SohelpProForm from '../sohelp-pro-form/index.vue';
30
+ import { arrayTypes, stringTypes } from '../sohelp-pro-form/util';
31
+ import { useRoute } from 'vue-router';
32
+ import CrudHttp from '../http/CrudHttp.js';
33
+
34
+ import { filterFields, matchingType } from '../utils/ProFormConvertUtil.js';
35
+ import { moduleCache } from '../cache/ModuleCache';
36
+ import { useMobile } from '@/utils/use-mobile';
37
+ import { useI18n } from 'vue-i18n';
38
+ import { EleMessage } from '@/components/ele-admin-plus/components';
39
+
40
+ const { query } = useRoute();
41
+ const formValue = ref({});
42
+ const formData = ref({});
43
+ const defaultFormValue = ref({});
44
+ const form = ref({});
45
+ const loading = ref(false);
46
+ const { mobile } = useMobile();
47
+ const emit = defineEmits(['update:modelValue', 'update:data']);
48
+ const props = defineProps({
49
+ modelValue: Object,
50
+ data: Object,
51
+ /** 实体配置 */
52
+ refid: {
53
+ type: String,
54
+ required: true
55
+ },
56
+ readonly: {
57
+ type: Boolean,
58
+ default: false
59
+ },
60
+ /**是否自动加载数据*/
61
+ autoLoad: {
62
+ type: Boolean,
63
+ default: true
64
+ },
65
+ /** 表单配置 */
66
+ formConfig: {
67
+ type: Object,
68
+ required: true
69
+ },
70
+ /**标签宽度 */
71
+ labelWidth: String,
72
+ /** 列数 */
73
+ gridNum: {
74
+ type: Number,
75
+ default: 1
76
+ }
77
+ });
78
+
79
+ /**
80
+ * 存储表单初始值用于对比变更
81
+ *
82
+ * @type {Ref<Object>}
83
+ */
84
+ const originModelValue = ref({});
85
+ const proFormRef = ref(null);
86
+ /**
87
+ * 表单项
88
+ * @type {Ref<UnwrapRef<*[]>>}
89
+ */
90
+ const items = ref([]);
91
+ /**
92
+ * 默认显示1列
93
+ * @type {Ref<UnwrapRef<number>>}
94
+ */
95
+ const grid = ref(1);
96
+ /**
97
+ * 标签宽度
98
+ * @type {Ref<UnwrapRef<string>>}
99
+ */
100
+ const labelWidth = ref('auto');
101
+ /**
102
+ * 临时存储公式
103
+ * @type {UnwrapNestedRefs<{}>}
104
+ */
105
+ const formulaMap = reactive({});
106
+ const watchFields = reactive({});
107
+
108
+ const { t } = useI18n();
109
+
110
+ const globalConfig = inject('globalConfig');
111
+
112
+ // 初始化表单配置
113
+ const isConfigInitialized = ref(false);
114
+
115
+ /**
116
+ * 计算表单列属性
117
+ * @param grid
118
+ * @param colSpan
119
+ */
120
+ const getColProps = (grid, colSpan) => {
121
+ if (grid === 1 || colSpan === 1) {
122
+ return;
123
+ }
124
+ const span = 24 / grid;
125
+ return { span: span * colSpan };
126
+ };
127
+ /**根据ProForm参数要求进行初始化类型*/
128
+ const getDefaultType = (item) => {
129
+ if ('sliderRange' === item.type) {
130
+ return [30, 60];
131
+ }
132
+ if (arrayTypes.includes(item.type)) {
133
+ return [];
134
+ }
135
+ if (stringTypes.includes(item.type)) {
136
+ return '';
137
+ }
138
+ return '';
139
+ };
140
+
141
+ /**提取计算公式中涉及的字段 */
142
+ const extractFields = (list) => {
143
+ const fieldMap = {};
144
+ const regex = /{\s*(\w+)\s*}/g;
145
+ list.forEach((item) => {
146
+ let match;
147
+ while ((match = regex.exec(item.formulaValue)) !== null) {
148
+ const field = match[1];
149
+ if (!fieldMap[field]) {
150
+ fieldMap[field] = [];
151
+ }
152
+ fieldMap[field].push({
153
+ field: item.formulaField,
154
+ formulaValue: item.formulaValue
155
+ });
156
+ }
157
+ });
158
+
159
+ return fieldMap;
160
+ };
161
+
162
+ /**
163
+ * 根据名称获取组件实例
164
+ * @param refName
165
+ * @returns {*}
166
+ */
167
+ const getRef = (refName) => {
168
+ return proFormRef.value.getRef(refName);
169
+ };
170
+ /**根据实体表单配置初始化表单数据 */
171
+ const loadConfig = async (refid = props?.refid) => {
172
+ if (!refid) {
173
+ return false;
174
+ }
175
+ isConfigInitialized.value = false;
176
+ const init = {};
177
+
178
+ const entityFormConfig = await moduleCache.getEntityForm(refid);
179
+ if (entityFormConfig?.properties) {
180
+ entityFormConfig.properties.forEach((item) => {
181
+ init[item.name] = getDefaultType(item);
182
+ });
183
+
184
+ items.value = entityFormConfig.properties
185
+ .filter((item) => item.insert)
186
+ .filter((item) => !filterFields.includes(item.name))
187
+ .map((item, index) => {
188
+ if (item.i18n) {
189
+ const i18n = t(item.i18n);
190
+ item.label = i18n && i18n.indexOf('.') == -1 ? i18n : item.label;
191
+ }
192
+ let editParams = item?.editorParam ? JSON.parse(item.editorParam) : {};
193
+ if (item.editor === 'SohelpDict') {
194
+ editParams['code'] = item.dict || editParams?.code;
195
+ }
196
+ if (item['length'] > 0) {
197
+ editParams['maxlength'] = item['length'];
198
+ }
199
+ editParams.readonly = item?.readonly || false;
200
+
201
+ return {
202
+ key: item?.name || 'tempKey' + index,
203
+ type: item?.editor ? item.editor : matchingType(item?.type || ''),
204
+ i18n: item.i18n,
205
+ label: item.label,
206
+ length: item.length,
207
+ fieldType: item.type,
208
+ isEntity: item?.isEntity ?? true,
209
+ required: item.notNull,
210
+ itemProps: item?.formItemOption ? JSON.parse(item.formItemOption) : '',
211
+ props: editParams,
212
+ options: item?.editorData ? JSON.parse(item.editorData) : '',
213
+ prop: item?.name,
214
+ hidden: item.hidden || filterFields.includes(item.name),
215
+ colProps: getColProps(entityFormConfig.gridNum, item.gridNum)
216
+ };
217
+ })
218
+ .filter((p) => p.hidden !== true);
219
+ labelWidth.value = props.labelWidth || entityFormConfig.labelWidth || 'auto';
220
+ grid.value = mobile.value ? 1 : entityFormConfig.gridNum || props.gridNum;
221
+
222
+ // 计算公式
223
+ if (entityFormConfig.formula && entityFormConfig.formula.length > 0) {
224
+ Object.assign(
225
+ formulaMap,
226
+ entityFormConfig.formula.reduce((a, c) => (a[c.formulaField] || (a[c.formulaField] = c), a), {})
227
+ );
228
+ Object.assign(watchFields, extractFields(entityFormConfig.formula));
229
+ }
230
+ }
231
+ isConfigInitialized.value = true;
232
+ defaultFormValue.value = init;
233
+ return Promise.resolve(init);
234
+ };
235
+ /**
236
+ * 获取表单数据
237
+ */
238
+ const getFormData = () => {
239
+ return { ...formData.value };
240
+ };
241
+
242
+ /**
243
+ * 获取表单值
244
+ */
245
+ const getFormValue = () => {
246
+ return { ...formValue.value };
247
+ };
248
+ /**
249
+ * 设置表数据
250
+ * @param value
251
+ */
252
+ const setFormValue = (newModelValue) => {
253
+ resetFormValue();
254
+ formValue.value = newModelValue;
255
+ originModelValue.value = { ...newModelValue };
256
+ loading.value = false;
257
+ };
258
+
259
+ /**
260
+ * 设置表单字段值
261
+ * @param fieldName 字段名称
262
+ * @param fieldValue
263
+ */
264
+ const setFieldValue = (fieldName, fieldValue) => {
265
+ formValue.value[fieldName] = fieldValue;
266
+ };
267
+ /**
268
+ * 获取表单字段值
269
+ * @param fieldName 字段名称
270
+ * @returns {*}
271
+ */
272
+ const getFieldValue = (fieldName) => {
273
+ return formValue.value[fieldName];
274
+ };
275
+
276
+ /**
277
+ * 设置表单数据
278
+ * @param _data 数据对象
279
+ */
280
+
281
+ const setFormData = async (_formData = {}) => {
282
+ loading.value = true;
283
+
284
+ await isConfigDone();
285
+ Object.assign(formData.value, _formData);
286
+ setFormValue(switchFormValue(_formData));
287
+ setTimeout(() => {
288
+ clearValidate();
289
+ }, 0);
290
+ };
291
+
292
+ /**
293
+ * 清理表单验证信息
294
+ */
295
+ const clearValidate = () => {
296
+ nextTick(() => {
297
+ proFormRef.value?.clearValidate();
298
+ });
299
+ };
300
+
301
+ const validate = () => {
302
+ return proFormRef.value?.validate();
303
+ };
304
+
305
+ /**
306
+ * 对比两个对象,找出修改过的属性和值
307
+ * @param oldObj
308
+ * @param newObj
309
+ */
310
+ function shallowCompare(oldObj, newObj) {
311
+ oldObj = oldObj || {};
312
+ newObj = newObj || {};
313
+
314
+ const changedProps = {};
315
+ const allKeys = new Set([...Object.keys(oldObj), ...Object.keys(newObj)]);
316
+
317
+ for (const key of allKeys) {
318
+ if (oldObj[key] !== newObj[key]) {
319
+ changedProps[key] = newObj[key];
320
+ }
321
+ }
322
+ return { id: oldObj?.id || newObj?.id || '', ...changedProps };
323
+ }
324
+
325
+ /**
326
+ * 仅仅获取已更新的数据对象
327
+ */
328
+ const getCrudUpdater = async () => {
329
+ await isConfigDone();
330
+ return shallowCompare(originModelValue.value, formValue.value);
331
+ };
332
+
333
+ loadConfig(props.refid).then(async (init = {}) => {
334
+ setFormData(init);
335
+ });
336
+ /**
337
+ * 从formData对象转化ModelValue
338
+ * @param formData
339
+ * @returns {{}}
340
+ */
341
+ const switchFormValue = (formData) => {
342
+ const result = {};
343
+ Object.keys(formData).forEach((key) => {
344
+ const obj = formData[key];
345
+ if (typeof obj === 'object') {
346
+ result[key] = obj?.id || '';
347
+ } else {
348
+ result[key] = obj;
349
+ }
350
+ });
351
+ return result;
352
+ };
353
+
354
+ /**
355
+ * 配置是否加载完成
356
+ */
357
+ const isConfigDone = async () => {
358
+ return new Promise((resolve) => {
359
+ if (isConfigInitialized.value) {
360
+ resolve();
361
+ } else {
362
+ let timer = setInterval(() => {
363
+ if (isConfigInitialized.value) {
364
+ clearInterval(timer);
365
+ resolve();
366
+ }
367
+ }, 10);
368
+ }
369
+ });
370
+ };
371
+
372
+ /**
373
+ * 通过引擎加载数据
374
+ * @param params
375
+ * @param callback
376
+ */
377
+ const load = async (params = {}, callback) => {
378
+ loading.value = true;
379
+ await isConfigDone();
380
+ CrudHttp.getById(props.refid, params, async (res) => {
381
+ if (res.meta.success) {
382
+ await setFormData(res.data);
383
+ }
384
+ callback && callback(res);
385
+ });
386
+ };
387
+ /**
388
+ * 加载表单初始化数据
389
+ * @param params
390
+ * @returns {Promise<void>}
391
+ */
392
+ const loadByInitial = async (params = {}, callback) => {
393
+ await isConfigDone();
394
+ return CrudHttp.initial(props.refid, params, async (res) => {
395
+ if (res.meta.success) {
396
+ await setFormData(res.data);
397
+ callback && callback(res);
398
+ return Promise.resolve(res);
399
+ } else {
400
+ callback && callback(res);
401
+ EleMessage.error(res.meta.message);
402
+ return Promise.reject(res);
403
+ }
404
+ });
405
+ };
406
+
407
+ /**
408
+ * 通过引擎保存数据
409
+ * @param params
410
+ * @param callback
411
+ */
412
+ const save = async (params = {}, callback) => {
413
+ await isConfigDone();
414
+ loading.value = true;
415
+ const refid = props.refid;
416
+ const key = refid && refid.indexOf('!') !== -1 ? refid.split('!')[1] : 'default';
417
+ let data = {};
418
+ data[key] = {
419
+ ...(await getCrudUpdater()),
420
+ ...params
421
+ };
422
+ return CrudHttp.save(refid, data, (res) => {
423
+ callback?.(res);
424
+ loading.value = false;
425
+ });
426
+ };
427
+
428
+ /**
429
+ * 监听表单值变化以处理计算公式
430
+ */
431
+ watch(
432
+ formValue,
433
+ (val) => {
434
+ emit('update:modelValue', val);
435
+ emit('update:data', formData);
436
+ if (val) {
437
+ if (Object.keys(watchFields).length > 0) {
438
+ Object.keys(val).forEach((changedField) => {
439
+ if (watchFields.hasOwnProperty(changedField)) {
440
+ const formulas = watchFields[changedField];
441
+ formulas.forEach((formula) => {
442
+ if (formula && formula.formulaValue) {
443
+ try {
444
+ // 公式表达式处理
445
+ const expr = formula.formulaValue.replace(/\s+/g, '').replace(/\${/g, 'row.').replace(/}/g, '');
446
+ val[formula.field] = new Function('row', `return ${expr}`)(val);
447
+ } catch (e) {
448
+ console.error('计算公式错误', e);
449
+ EleMessage.error('计算公式错误' + e.message);
450
+ }
451
+ }
452
+ });
453
+ }
454
+ });
455
+ }
456
+ }
457
+ },
458
+ {
459
+ immediate: true,
460
+ deep: true
461
+ }
462
+ );
463
+ /**
464
+ * 获取配置项
465
+ * @param fieldName
466
+ * @returns {*}
467
+ */
468
+ const getItemValue = (fieldName) => {
469
+ return items.value[fieldName];
470
+ };
471
+ /**
472
+ * 重新定义事件和属性
473
+ * @param fieldName
474
+ * @param objectValue
475
+ */
476
+ const setItemValue = (fieldName, objectValue) => {
477
+ items.value.map((item) => {
478
+ if (item.key === fieldName) {
479
+ Object.assign(item, objectValue);
480
+ return item;
481
+ }
482
+ });
483
+ };
484
+
485
+ const resetFormValue = () => {
486
+ formValue.value = { ...defaultFormValue.value };
487
+ };
488
+
489
+ defineExpose({
490
+ loadConfig,
491
+ getItemValue,
492
+ setItemValue,
493
+ loadByInitial,
494
+ load,
495
+ save,
496
+ getRef,
497
+ proFormRef,
498
+ clearValidate,
499
+ setFieldValue,
500
+ getFieldValue,
501
+ labelWidth,
502
+ grid,
503
+ getFormData,
504
+ setFormData,
505
+ setFormValue,
506
+ getFormValue,
507
+ getCrudUpdater,
508
+ globalConfig,
509
+ resetFormValue,
510
+ validate
511
+ });
512
+ </script>
513
+ <script>
514
+ export default {
515
+ name: 'SohelpEntityForm'
516
+ };
517
+ </script>
518
+
519
+ <style lang="scss" scoped>
520
+ .sohelp-entity-form {
521
+ height: auto;
522
+ }
523
+ </style>
524
+ ;
@@ -0,0 +1,30 @@
1
+ <template>
2
+ <sohelp-vxe-grid v-bind="$attrs" ref="sohelpEntityGridRef" :refid="refid" :isEntityGrid="true"></sohelp-vxe-grid>
3
+ </template>
4
+ <script>
5
+ import SohelpVxeGrid from '../sohelp-vxe-grid/index.vue'
6
+ import {ref} from "vue";
7
+ export default {
8
+ name: "SohelpEntityGrid",
9
+ components: {SohelpVxeGrid},
10
+ props:{
11
+ modelValue: Object,
12
+ /** 实体配置 */
13
+ refid: {
14
+ type: String,
15
+ required: true
16
+ }
17
+ },
18
+ setup(props, {emits}) {
19
+ const sohelpEntityGridRef = ref();
20
+
21
+ return {
22
+ sohelpEntityGridRef
23
+ }
24
+ }
25
+ }
26
+ </script>
27
+
28
+ <style scoped>
29
+
30
+ </style>