@vue-ui-kit/ant 1.0.0

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 (50) hide show
  1. package/dist/cjs/index.js +1 -0
  2. package/dist/declarations/antProxy.d.ts +239 -0
  3. package/dist/declarations/type.d.ts +1 -0
  4. package/dist/es/index.js +2471 -0
  5. package/dist/index.d.ts +12 -0
  6. package/dist/packages/components/PForm.vue.d.ts +28 -0
  7. package/dist/packages/components/PFormGroup.vue.d.ts +29 -0
  8. package/dist/packages/components/PGrid.vue.d.ts +40 -0
  9. package/dist/packages/components/PGroupBlock.vue.d.ts +16 -0
  10. package/dist/packages/components/PromisePicker.vue.d.ts +48 -0
  11. package/dist/packages/components/RenderAntCell.d.ts +10 -0
  12. package/dist/packages/components/RenderAntItem.d.ts +17 -0
  13. package/dist/packages/components/RenderDefaultSlots.d.ts +14 -0
  14. package/dist/packages/components/RenderItemSlots.d.ts +10 -0
  15. package/dist/packages/components/RenderTitleSlots.d.ts +6 -0
  16. package/dist/packages/hooks/useMessage.d.ts +8 -0
  17. package/dist/packages/renders/Icon.d.ts +4 -0
  18. package/dist/packages/renders/TableInput.vue.d.ts +44 -0
  19. package/dist/packages/store/renderStore.d.ts +59 -0
  20. package/dist/packages/utils/AFormatters.d.ts +19 -0
  21. package/dist/packages/utils/core.d.ts +8 -0
  22. package/dist/packages/utils/is.d.ts +2 -0
  23. package/dist/packages/utils/treeHelper.d.ts +19 -0
  24. package/dist/style.css +1 -0
  25. package/package.json +72 -0
  26. package/src/declarations/README.md +9 -0
  27. package/src/declarations/antProxy.ts +255 -0
  28. package/src/declarations/global.d.ts +133 -0
  29. package/src/declarations/type.ts +1 -0
  30. package/src/index.ts +25 -0
  31. package/src/packages/components/PForm.vue +108 -0
  32. package/src/packages/components/PFormGroup.vue +90 -0
  33. package/src/packages/components/PGrid.vue +472 -0
  34. package/src/packages/components/PGroupBlock.vue +12 -0
  35. package/src/packages/components/PromisePicker.vue +64 -0
  36. package/src/packages/components/RenderAntCell.tsx +29 -0
  37. package/src/packages/components/RenderAntItem.tsx +54 -0
  38. package/src/packages/components/RenderDefaultSlots.tsx +44 -0
  39. package/src/packages/components/RenderItemSlots.tsx +24 -0
  40. package/src/packages/components/RenderTitleSlots.tsx +15 -0
  41. package/src/packages/hooks/useMessage.ts +19 -0
  42. package/src/packages/renders/Icon.ts +8 -0
  43. package/src/packages/renders/TableInput.vue +107 -0
  44. package/src/packages/store/renderStore.tsx +515 -0
  45. package/src/packages/styles/index.scss +184 -0
  46. package/src/packages/styles/variables.scss +3 -0
  47. package/src/packages/utils/AFormatters.ts +64 -0
  48. package/src/packages/utils/core.ts +52 -0
  49. package/src/packages/utils/is.ts +2 -0
  50. package/src/packages/utils/treeHelper.ts +72 -0
@@ -0,0 +1,472 @@
1
+ <script generic="D = Recordable, F = Recordable" lang="ts" name="PGrid" setup>
2
+ import { ColumnProps, PFormItemProps, PGridProps, ResponsePathConfig } from '#/antProxy'
3
+ import { computed, useAttrs, ref, Ref, reactive, onMounted, watch, toRefs } from 'vue'
4
+ import { debounce, get, isArray, isFunction, isString, merge, omit, toNumber } from 'lodash-es'
5
+ import { eachTree } from '@/utils/treeHelper'
6
+ import { message as $message } from 'ant-design-vue'
7
+ import RenderAntItem from '@/components/RenderAntItem'
8
+ import RenderTitleSlots from '@/components/RenderTitleSlots'
9
+ import RenderDefaultSlots from '@/components/RenderDefaultSlots'
10
+ import { v4 as uuid_v4 } from 'uuid'
11
+ import { valued } from '@/utils/is'
12
+ import RenderItemSlots from '@/components/RenderItemSlots'
13
+ import { cleanCol, defaultItemResponsive, defaultLabelCol } from '@/utils/core'
14
+ import Icon from '@/renders/Icon'
15
+ import { $confirm } from '@/hooks/useMessage'
16
+ import {
17
+ Table as ATable,
18
+ Button as AButton,
19
+ Form as AForm,
20
+ FormItem as AFormItem,
21
+ Row as ARow,
22
+ Col as ACol,
23
+ Spin as ASpin,
24
+ } from 'ant-design-vue'
25
+ import { TablePaginationConfig } from 'ant-design-vue/es/table/interface'
26
+
27
+ const props = defineProps<PGridProps<D, F>>()
28
+ const {
29
+ formConfig,
30
+ pageConfig,
31
+ columns,
32
+ toolbarConfig,
33
+ proxyConfig,
34
+ tableConfig,
35
+ selectConfig,
36
+ scrollMode,
37
+ } = toRefs(props)
38
+ const loading = reactive({
39
+ table: false,
40
+ form: false,
41
+ })
42
+ const submitOnReset = false
43
+ const boxEl = ref<HTMLDivElement>()
44
+ const renderHeight = ref(500)
45
+ const selectedRowKeys = ref<string[] | number[]>([])
46
+ const innerToolbarHandler = (code: string) => {
47
+ const { ajax } = proxyConfig.value!
48
+ switch (code) {
49
+ case 'multiDelete':
50
+ if (ajax.multiDelete) {
51
+ if (selectedRowKeys.value.length > 0) {
52
+ $confirm({
53
+ title: '警告',
54
+ content: '确认删除选中的数据吗?',
55
+ }).then(() => {
56
+ loading.table = true
57
+ ajax.multiDelete!(selectedRowKeys.value)
58
+ .then(() => {
59
+ $message.success('删除成功')
60
+ resetPage()
61
+ })
62
+ .catch(() => {
63
+ $message.error('删除失败')
64
+ })
65
+ .finally(() => {
66
+ loading.table = false
67
+ })
68
+ })
69
+ } else {
70
+ $message.warn('请选择要删除的数据')
71
+ }
72
+ }
73
+ break
74
+ }
75
+ }
76
+ const slotTitleColumns = computed(() => {
77
+ const cols: ColumnProps<D>[] = []
78
+ eachTree(columns.value, (col) => {
79
+ if (col.slots && col.slots.title) {
80
+ if (!col.field) {
81
+ col.field = '__holder__' + cols.length
82
+ }
83
+ cols.push(col)
84
+ }
85
+ })
86
+ return cols
87
+ })
88
+ const formEl = ref()
89
+ const tableEl = ref()
90
+ const renderFormKey = ref(uuid_v4())
91
+ const renderTableKey = ref(uuid_v4())
92
+ const refreshForm = () => {
93
+ renderFormKey.value = uuid_v4()
94
+ }
95
+ const refreshTable = () => {
96
+ renderTableKey.value = uuid_v4()
97
+ }
98
+ const debounceRefreshForm = debounce(refreshForm, 100)
99
+ const debounceRefreshTable = debounce(refreshTable, 100)
100
+ const slotDefaultColumns = computed(() => {
101
+ const cols: ColumnProps<D>[] = []
102
+ eachTree(columns.value, (col) => {
103
+ if ((col.slots && col.slots.default) || col.formatter || col.cellRender) {
104
+ if (!col.field) {
105
+ col.field = '__holder__' + cols.length
106
+ }
107
+ cols.push(col)
108
+ }
109
+ })
110
+ return cols
111
+ })
112
+ const pagination = reactive<IPage>({
113
+ page: 1,
114
+ size: pageConfig.value?.pageSize ?? 10,
115
+ })
116
+ const dataSeed = ref(0)
117
+ const totalCount = ref(0)
118
+ const tableData = ref<D[]>([]) as Ref<D[]>
119
+ const mode = computed<'list' | 'pagination' | 'bad'>(() =>
120
+ proxyConfig.value && proxyConfig.value.ajax
121
+ ? pageConfig.value
122
+ ? 'pagination'
123
+ : 'list'
124
+ : 'bad',
125
+ )
126
+ const attrs = useAttrs()
127
+ const emit = defineEmits([
128
+ 'query',
129
+ 'reset',
130
+ 'update:tableData',
131
+ 'toolbarButtonClick',
132
+ 'toolbarToolClick',
133
+ 'pick',
134
+ ])
135
+ const toolBtnClick = (code: string) => {
136
+ emit('toolbarButtonClick', {
137
+ data: tableData.value,
138
+ code,
139
+ selectedKeys: selectedRowKeys.value,
140
+ })
141
+ innerToolbarHandler(code)
142
+ }
143
+ const toolToolClick = (code: string) => {
144
+ emit('toolbarToolClick', { data: tableData.value, code, selectedKeys: selectedRowKeys.value })
145
+ innerToolbarHandler(code)
146
+ }
147
+ const queryFormData = ref<Partial<F>>({}) as Ref<Partial<F>>
148
+ const pickRow = ({ row, field }: { row: D; field: string }) => {
149
+ emit('pick', { row, field })
150
+ }
151
+ const resetQueryFormData = (lazy?: boolean) => {
152
+ if (formConfig.value && formConfig.value.items.length > 0) {
153
+ if (formConfig.value.customReset) {
154
+ formConfig.value.customReset()
155
+ } else {
156
+ const obj: Partial<F> = {}
157
+ eachTree(formConfig.value.items, (item) => {
158
+ if (item.field && item.itemRender) {
159
+ if (valued(item.itemRender.defaultValue)) {
160
+ obj[item.field] = item.itemRender.defaultValue
161
+ } else {
162
+ obj[item.field] = undefined
163
+ }
164
+ }
165
+ })
166
+ queryFormData.value = obj
167
+ }
168
+ refreshForm()
169
+ }
170
+
171
+ pagination.page = 1
172
+ if (!lazy) {
173
+ debounceFetchData()
174
+ }
175
+ }
176
+ const handleResponse = (response: Recordable, pathConfig?: ResponsePathConfig<D>) =>
177
+ pathConfig
178
+ ? {
179
+ list: isString(pathConfig.list)
180
+ ? get(response, pathConfig.list)
181
+ : isFunction(pathConfig.list)
182
+ ? pathConfig.list(response)
183
+ : undefined,
184
+ total: isString(pathConfig.total)
185
+ ? get(response, pathConfig.total)
186
+ : isFunction(pathConfig.total)
187
+ ? pathConfig.total(response)
188
+ : undefined,
189
+ result: isString(pathConfig.result)
190
+ ? get(response, pathConfig.result)
191
+ : isFunction(pathConfig.result)
192
+ ? pathConfig.result(response)
193
+ : undefined,
194
+ message: isString(pathConfig.message)
195
+ ? get(response, pathConfig.message)
196
+ : isFunction(pathConfig.message)
197
+ ? pathConfig.message(response)
198
+ : undefined,
199
+ }
200
+ : {
201
+ list: response,
202
+ }
203
+ const enoughSpacing = ref(true)
204
+ const reload = () => {
205
+ return resetQueryFormData()
206
+ }
207
+ const resetPage = () => {
208
+ pagination.page = 1
209
+ selectedRowKeys.value = []
210
+ return fetchData()
211
+ }
212
+ /**
213
+ * @description
214
+ * @param p
215
+ * @param _filters todo filters
216
+ * @param _sorter todo sorter
217
+ */
218
+ const handleTableChange = (p: TablePaginationConfig, _filters, _sorter) => {
219
+ pagination.page = p.current!
220
+ pagination.size = p.pageSize!
221
+ return fetchData()
222
+ }
223
+
224
+ const fetchData = () =>
225
+ new Promise<D[]>((resolve) => {
226
+ if (mode.value !== 'bad') {
227
+ loading.form = true
228
+ loading.table = true
229
+ const { ajax } = proxyConfig.value!
230
+ ajax
231
+ .query({
232
+ form: queryFormData.value,
233
+ page: pagination,
234
+ })
235
+ .then((response) => {
236
+ const { list, total, result, message } = handleResponse(
237
+ response,
238
+ proxyConfig.value!.response,
239
+ )
240
+ if (list) {
241
+ tableData.value = list as D[]
242
+ dataSeed.value++
243
+ } else if (result) {
244
+ tableData.value = result as D[]
245
+ totalCount.value = total ?? result.length
246
+ dataSeed.value++
247
+ } else {
248
+ tableData.value = []
249
+ dataSeed.value++
250
+ if (message) {
251
+ $message.warn(message)
252
+ }
253
+ }
254
+ resolve(tableData.value as D[])
255
+ })
256
+ .catch((e) => {
257
+ console.error('fetchData error', e)
258
+ resolve([] as D[])
259
+ })
260
+ .finally(() => {
261
+ loading.form = false
262
+ loading.table = false
263
+ })
264
+ }
265
+ })
266
+ const debounceFetchData = debounce(fetchData, 160)
267
+ const passQuery = (params: Partial<F>) => {
268
+ Object.assign(queryFormData.value, params)
269
+ pagination.page = 1
270
+ return debounceFetchData()
271
+ }
272
+ const pg = computed(() =>
273
+ mode.value === 'pagination'
274
+ ? {
275
+ current: pagination.page,
276
+ total: totalCount.value,
277
+ pageSize: pagination.size,
278
+ responsive: false,
279
+ showSizeChanger: true,
280
+ showTotal: (total: number) => `共${total}条数据`,
281
+ }
282
+ : false,
283
+ )
284
+ const defaultTableConfig = {
285
+ size: 'small',
286
+ sticky: true,
287
+ transformCellText: ({ text }) => {
288
+ return isArray(text) && text.length === 0 ? '-' : text
289
+ },
290
+ }
291
+ const tc = computed(() =>
292
+ merge(
293
+ {},
294
+ defaultTableConfig,
295
+ tableConfig?.value ?? {},
296
+ selectConfig.value
297
+ ? {
298
+ rowSelection: {
299
+ type: selectConfig.value.multiple ? 'checkbox' : 'radio',
300
+ preserveSelectedRowKeys: true,
301
+ selectedRowKeys: selectedRowKeys.value,
302
+ onChange: (selectedKeys: string[] | number[]) => {
303
+ selectedRowKeys.value = selectedKeys
304
+ },
305
+ },
306
+ }
307
+ : {},
308
+ ),
309
+ )
310
+ /*omit({labelCol:defaultLabelCol,...formConfig},['items'])*/
311
+ const fc = computed(() => omit({ labelCol: defaultLabelCol, ...formConfig.value }, ['items']))
312
+ const handleFormSubmit = () => {
313
+ resetPage()
314
+ }
315
+
316
+ watch(
317
+ () => formConfig.value,
318
+ () => {
319
+ debounceRefreshForm()
320
+ },
321
+ { deep: true },
322
+ )
323
+ watch(
324
+ () => [columns.value, proxyConfig.value, toolbarConfig.value],
325
+ () => {
326
+ debounceRefreshTable()
327
+ },
328
+ { deep: true },
329
+ )
330
+ defineExpose({
331
+ commitProxy: {
332
+ query: debounceFetchData,
333
+ reload,
334
+ reloadPage: resetPage,
335
+ passQuery,
336
+ },
337
+ $table: computed(() => tableEl.value),
338
+ selectedRowKeys: computed(() => selectedRowKeys.value),
339
+ $form: computed(() => formEl.value),
340
+ })
341
+ onMounted(() => {
342
+ /*判断本组件所在容器DOM*/
343
+ const pNode = boxEl.value?.parentElement
344
+ const ph = pNode ? window.getComputedStyle(pNode).height : '0px'
345
+ renderHeight.value = toNumber(ph.replace('px', '')) - 200
346
+ enoughSpacing.value = toNumber(ph.replace('px', '')) > 600
347
+ resetQueryFormData(props.manualFetch)
348
+ })
349
+ </script>
350
+ <template>
351
+ <div ref="boxEl" class="h-full p-wrapper flex flex-col gap-8px overflow-y-auto" v-bind="attrs">
352
+ <div v-if="mode === 'bad'">请检查配置</div>
353
+ <template v-else>
354
+ <div
355
+ v-if="formConfig?.items?.some((s: PFormItemProps<F>) => s.field && s.itemRender)"
356
+ class="p-pane p-form-wrapper"
357
+ >
358
+ <a-spin :spinning="loading.form">
359
+ <a-form
360
+ :key="renderFormKey"
361
+ ref="formEl"
362
+ :model="queryFormData"
363
+ v-bind="fc"
364
+ @submit="handleFormSubmit"
365
+ >
366
+ <a-row :gutter="[6, 12]">
367
+ <a-col
368
+ v-for="(item, idx) in formConfig!.items"
369
+ :key="'_col_' + idx"
370
+ v-bind="item.col ?? (item.span ? { span: item.span } : defaultItemResponsive)"
371
+ >
372
+ <a-form-item
373
+ :key="'_item_' + idx"
374
+ :class="`p-content-align-${item.align ?? 'left'}`"
375
+ :label="item.title"
376
+ :name="item.field"
377
+ v-bind="omit(item, ['field', 'title', 'span', 'col', 'itemRender'])"
378
+ >
379
+ <render-item-slots
380
+ v-if="item.slots?.default"
381
+ :form-data="queryFormData"
382
+ :item="item"
383
+ />
384
+ <render-ant-item
385
+ v-else-if="item.itemRender?.name"
386
+ :key="'_re_' + idx"
387
+ :default-handler="{
388
+ reset: () => {
389
+ resetQueryFormData(!submitOnReset);
390
+ },
391
+ }"
392
+ :item-render="item.itemRender"
393
+ :render-form-params="{ data: queryFormData, field: item.field }"
394
+ />
395
+ <span v-else></span>
396
+ </a-form-item>
397
+ </a-col>
398
+ </a-row>
399
+ </a-form>
400
+ </a-spin>
401
+ </div>
402
+ <div
403
+ v-if="toolbarConfig"
404
+ class="p-toolbar-wrapper flex items-center w-full justify-between p-theme-bg pt-8px px-16px"
405
+ >
406
+ <div class="flex items-center flex-1 gap-4px">
407
+ <template v-if="toolbarConfig.buttons && toolbarConfig.buttons.length > 0">
408
+ <a-button
409
+ v-for="(btn, idx) in toolbarConfig.buttons"
410
+ :key="idx"
411
+ :type="btn.type"
412
+ size="small"
413
+ @click="toolBtnClick(btn.code)"
414
+ >
415
+ <Icon v-if="btn.icon" :icon="btn.icon"/>
416
+ {{ btn.content }}
417
+ </a-button>
418
+ </template>
419
+ </div>
420
+ <span class="flex items-center gap-4px">
421
+ <template v-if="toolbarConfig.tools && toolbarConfig.tools.length > 0">
422
+ <a-button
423
+ v-for="(tool, idx) in toolbarConfig.tools"
424
+ :key="idx"
425
+ :type="tool.type"
426
+ size="small"
427
+ @click="toolToolClick(tool.code)"
428
+ >
429
+ <Icon :icon="tool.icon"/>
430
+ </a-button>
431
+ </template>
432
+ </span>
433
+ </div>
434
+ <div :class="`p-pane flex-1 ${enoughSpacing ? 'h-0' : ''} p-${scrollMode ?? 'inner'}-scroll`">
435
+ <a-table
436
+ :key="renderTableKey + '_table'"
437
+ :row-key="rowKey ?? 'id'"
438
+ ref="tableEl"
439
+ :columns="columns.map((c) => cleanCol(c as Recordable))"
440
+ :data-source="tableData"
441
+ :loading="loading.table"
442
+ :pagination="pg"
443
+ v-bind="tc"
444
+ :scroll="{
445
+ x: 'max-content',
446
+ y: renderHeight,
447
+ }"
448
+ @change="handleTableChange"
449
+ >
450
+ <template v-if="slotTitleColumns.length > 0" #headerCell="{ column }">
451
+ <render-title-slots
452
+ v-if="slotTitleColumns.some((s) => column.key && s.field === column.key)"
453
+ :key="renderTableKey + '_title_' + dataSeed + '_slot_' + column.key"
454
+ :column="slotTitleColumns.find((f) => column.key && f.field === column.key)!"
455
+ />
456
+ </template>
457
+ <template v-if="slotDefaultColumns.length > 0" #bodyCell="{ column, record, index }">
458
+ <render-default-slots
459
+ v-if="slotDefaultColumns.some((s) => column.key && s.field === column.key)"
460
+ :key="renderTableKey + '_cell_' + dataSeed + '_slot_' + column.key"
461
+ :column="slotDefaultColumns.find((f) => column.key && f.field === column.key)!"
462
+ :default-handler="{ pick: pickRow }"
463
+ :row="record"
464
+ :row-index="index"
465
+ :table-data="tableData as Recordable[]"
466
+ />
467
+ </template>
468
+ </a-table>
469
+ </div>
470
+ </template>
471
+ </div>
472
+ </template>
@@ -0,0 +1,12 @@
1
+ <script lang="ts" setup name="PGroupBlock" generic="F = Recordable">
2
+ import { PBlockProps, PFormProps } from '#/antProxy';
3
+ import { computed, toRefs } from 'vue';
4
+ import PForm from '@/components/PForm.vue';
5
+
6
+ const props = defineProps<PBlockProps<F>>();
7
+ const { source } = toRefs(props);
8
+ const formSetting = computed<PFormProps<Partial<F>>>(() => props.getFormSetting(source.value));
9
+ </script>
10
+ <template>
11
+ <p-form v-bind="formSetting" :data="source!" />
12
+ </template>
@@ -0,0 +1,64 @@
1
+ <script lang="ts" setup name="PromisePicker" generic="D = Recordable, F = Recordable">
2
+ import { PropType, reactive, ref } from 'vue';
3
+ import { PGridInstance, PGridProps } from '#/antProxy';
4
+ import PGrid from '@/components/PGrid.vue';
5
+
6
+ const gridEl = ref<PGridInstance<D>>();
7
+ defineProps({
8
+ gridSetting: {
9
+ type: Object as PropType<PGridProps<D, F>>,
10
+ required: true,
11
+ },
12
+ title: {
13
+ type: String as PropType<string>,
14
+ default: '数据选择',
15
+ },
16
+ width: {
17
+ type: [String, Number] as PropType<string | number>,
18
+ default: '70%',
19
+ },
20
+ bodyStyle: {
21
+ type: Object,
22
+ default: () => ({}),
23
+ },
24
+ });
25
+ let resolvePromise: (
26
+ value: { row: D; field?: string } | PromiseLike<{ row: D; field?: string }>,
27
+ ) => void;
28
+ let rejectPromise: (reason?: any) => void;
29
+ const visible = reactive({
30
+ modal: false,
31
+ });
32
+ const handleCancel = () => {
33
+ if (rejectPromise) {
34
+ rejectPromise();
35
+ }
36
+ };
37
+ const selectRow = ({ row, field }: { row: D; field?: string }) => {
38
+ if (resolvePromise) {
39
+ visible.modal = false;
40
+ resolvePromise({ row, field });
41
+ }
42
+ };
43
+ defineExpose({
44
+ pick: () =>
45
+ new Promise<{ row: D; field?: string }>((resolve, reject) => {
46
+ resolvePromise = resolve;
47
+ rejectPromise = reject;
48
+ visible.modal = true;
49
+ }),
50
+ });
51
+ </script>
52
+ <template>
53
+ <a-modal
54
+ v-model:open="visible.modal"
55
+ destroy-on-close
56
+ :title="title"
57
+ :width="width"
58
+ :footer="null"
59
+ @cancel="handleCancel"
60
+ :body-style="bodyStyle"
61
+ >
62
+ <p-grid v-bind="gridSetting" ref="gridEl" @pick="selectRow" />
63
+ </a-modal>
64
+ </template>
@@ -0,0 +1,29 @@
1
+ import { defineComponent } from 'vue';
2
+ import { ItemRender, RenderTableParams } from '#/antProxy';
3
+ import renderStore from '@/store/renderStore';
4
+
5
+ export default defineComponent(
6
+ <D = Recordable,>(props: {
7
+ cellRender: ItemRender;
8
+ renderTableParams: RenderTableParams<D>;
9
+ defaultHandler?: {
10
+ [key: string]: (...args: any[]) => any;
11
+ };
12
+ }) => {
13
+ const { cellRender, renderTableParams } = props;
14
+ const { data, row, field, rowIndex } = renderTableParams!;
15
+ return () => {
16
+ return (
17
+ renderStore.renders[cellRender!.name]?.renderDefault?.(
18
+ cellRender!,
19
+ { data, row, field, rowIndex },
20
+ props.defaultHandler,
21
+ ) ?? null
22
+ );
23
+ };
24
+ },
25
+ {
26
+ name: 'RenderAntCell',
27
+ props: ['cellRender', 'renderTableParams', 'defaultHandler'],
28
+ },
29
+ );
@@ -0,0 +1,54 @@
1
+ import { defineComponent, PropType, toRefs } from 'vue';
2
+ import { ItemRender, RenderFormParams } from '#/antProxy';
3
+ import renderStore from '@/store/renderStore';
4
+
5
+ export default defineComponent(
6
+ <F = Recordable,>(
7
+ props: {
8
+ itemRender: ItemRender;
9
+ renderFormParams: RenderFormParams<F>;
10
+ defaultHandler?: {
11
+ [key: string]: (...args: any[]) => any;
12
+ };
13
+ },
14
+ { emit },
15
+ ) => {
16
+ const { itemRender, defaultHandler } = props;
17
+ const { renderFormParams } = toRefs(props);
18
+ const passTrigger = (cusFields?: string | string[]) => {
19
+ emit('trigger', cusFields);
20
+ };
21
+ return () => {
22
+ return (
23
+ renderStore.renders[itemRender!.name]?.renderItemContent?.(
24
+ {
25
+ ...itemRender!,
26
+ handleTrigger: passTrigger,
27
+ },
28
+ renderFormParams.value,
29
+ defaultHandler,
30
+ ) ?? null
31
+ );
32
+ };
33
+ },
34
+ {
35
+ name: 'RenderAntItem',
36
+ props: {
37
+ itemRender: {
38
+ type: Object as PropType<ItemRender>,
39
+ required: true,
40
+ },
41
+ renderFormParams: {
42
+ type: Object as PropType<RenderFormParams>,
43
+ required: true,
44
+ },
45
+ defaultHandler: {
46
+ type: Object as PropType<{
47
+ [key: string]: (...args: any[]) => any;
48
+ }>,
49
+ required: false,
50
+ },
51
+ },
52
+ emits: ['trigger'],
53
+ },
54
+ );
@@ -0,0 +1,44 @@
1
+ import { defineComponent } from 'vue';
2
+ import { ColumnProps } from '#/antProxy';
3
+ import { renderAntFormat } from '@/utils/AFormatters';
4
+ import RenderAntCell from '@/components/RenderAntCell';
5
+
6
+ export default defineComponent(
7
+ <D = Recordable,>(props: {
8
+ tableData: D[];
9
+ row: D;
10
+ column: ColumnProps<D>;
11
+ rowIndex: number;
12
+ defaultHandler?: {
13
+ [key: string]: (...args: any[]) => any;
14
+ };
15
+ }) => {
16
+ const { tableData, row, column, rowIndex } = props;
17
+ const cellValue = column.field ? row[column.field] : null;
18
+ return () => {
19
+ return (
20
+ column.slots?.default?.({ row, column, rowIndex, cellValue }) ??
21
+ (column.cellRender ? (
22
+ <RenderAntCell
23
+ cellRender={column.cellRender}
24
+ defaultHandler={props.defaultHandler}
25
+ renderTableParams={{ data: tableData, row, field: column.field, rowIndex }}
26
+ />
27
+ ) : column.formatter ? (
28
+ renderAntFormat(column.formatter, {
29
+ record: row,
30
+ index: rowIndex,
31
+ field: column.field,
32
+ column,
33
+ })
34
+ ) : (
35
+ cellValue
36
+ ))
37
+ );
38
+ };
39
+ },
40
+ {
41
+ name: 'RenderAntDefaultCell',
42
+ props: ['tableData', 'row', 'column', 'rowIndex', 'defaultHandler'],
43
+ },
44
+ );
@@ -0,0 +1,24 @@
1
+ import { defineComponent, toRefs } from 'vue';
2
+ import { PFormItemProps } from '#/antProxy';
3
+
4
+ export default defineComponent(
5
+ <F = Recordable,>(props: {
6
+ formData: F;
7
+ item: PFormItemProps<F>;
8
+ passTrigger: (cusFields?: string | string[]) => void;
9
+ }) => {
10
+ const { formData } = toRefs(props);
11
+ return () => {
12
+ return (
13
+ props.item.slots?.default?.(
14
+ { data: formData.value, field: props.item.field },
15
+ props.passTrigger,
16
+ ) ?? null
17
+ );
18
+ };
19
+ },
20
+ {
21
+ name: 'RenderItemSlots',
22
+ props: ['formData', 'item', 'passTrigger'],
23
+ },
24
+ );