@vue-ui-kit/ant 1.9.3 → 2.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 (38) hide show
  1. package/dist/cjs/index.js +4 -1
  2. package/dist/declarations/antProxy.d.ts +58 -20
  3. package/dist/es/index.js +8857 -2969
  4. package/dist/index.d.ts +5 -6
  5. package/dist/packages/components/PCanvasGrid.vue.d.ts +2 -0
  6. package/dist/packages/components/PCanvasTable.vue.d.ts +134 -0
  7. package/dist/packages/components/PForm.vue.d.ts +8 -14
  8. package/dist/packages/components/PFormCol.vue.d.ts +8 -13
  9. package/dist/packages/components/PFormGroup.vue.d.ts +16 -16
  10. package/dist/packages/components/PGrid.vue.d.ts +7 -27
  11. package/dist/packages/components/PGroupBlock.vue.d.ts +5 -7
  12. package/dist/packages/components/PromisePicker.vue.d.ts +8 -43
  13. package/dist/packages/components/RenderEditCell.d.ts +10 -0
  14. package/dist/packages/renders/TableInput.vue.d.ts +7 -26
  15. package/dist/packages/store/renderStore.d.ts +10 -58
  16. package/dist/packages/utils/AFormatters.d.ts +3 -13
  17. package/dist/packages/utils/treeHelper.d.ts +7 -7
  18. package/dist/style.scss +59 -35
  19. package/package.json +2 -1
  20. package/src/declarations/antProxy.ts +78 -22
  21. package/src/index.ts +15 -2
  22. package/src/packages/components/PCanvasGrid.vue +6 -0
  23. package/src/packages/components/PCanvasTable.vue +286 -0
  24. package/src/packages/components/PForm.vue +5 -5
  25. package/src/packages/components/PFormGroup.vue +1 -1
  26. package/src/packages/components/PGrid.vue +10 -5
  27. package/src/packages/components/PGroupBlock.vue +1 -1
  28. package/src/packages/components/PromisePicker.vue +19 -29
  29. package/src/packages/components/RenderAntCell.tsx +2 -2
  30. package/src/packages/components/RenderAntItem.tsx +2 -2
  31. package/src/packages/components/RenderDefaultSlots.tsx +1 -1
  32. package/src/packages/components/RenderEditCell.tsx +36 -0
  33. package/src/packages/components/RenderItemSlots.tsx +1 -1
  34. package/src/packages/components/RenderTitleSlots.tsx +1 -1
  35. package/src/packages/renders/TableInput.vue +1 -1
  36. package/src/packages/store/renderStore.tsx +44 -18
  37. package/src/packages/styles/index.scss +59 -31
  38. package/src/packages/utils/AFormatters.ts +3 -3
@@ -1,4 +1,4 @@
1
- <script generic="F = Recordable" lang="ts" name="PForm" setup>
1
+ <script generic="F extends Recordable = Recordable" lang="ts" name="PForm" setup>
2
2
  import { PFormItemProps, PFormProps } from '#/antProxy';
3
3
  import { computed, ref, toRefs } from 'vue';
4
4
  import { omit } from 'xe-utils';
@@ -39,15 +39,15 @@
39
39
  eachTree(items.value, (item) => {
40
40
  if (item.field && item.itemRender) {
41
41
  if (isGoodValue(item.itemRender.defaultValue)) {
42
- obj[item.field] = item.itemRender.defaultValue;
42
+ obj[item.field as keyof F] = item.itemRender.defaultValue;
43
43
  } else {
44
- obj[item.field] = undefined;
44
+ obj[item.field as keyof F] = undefined;
45
45
  }
46
46
  } else if (item.field && item.slots) {
47
47
  if (isGoodValue(item.slots.defaultValue)) {
48
- obj[item.field] = item.slots.defaultValue;
48
+ obj[item.field as keyof F] = item.slots.defaultValue;
49
49
  } else {
50
- obj[item.field] = undefined;
50
+ obj[item.field as keyof F] = undefined;
51
51
  }
52
52
  }
53
53
  });
@@ -1,4 +1,4 @@
1
- <script lang="ts" generic="F = Recordable" setup name="PFormGroup">
1
+ <script lang="ts" generic="F extends Recordable = Recordable" setup name="PFormGroup">
2
2
  import { computed, nextTick, PropType, ref, watch, watchEffect } from 'vue';
3
3
  import { PFormGroupProps, PFormBlockInstance } from '#/antProxy';
4
4
  import { MoreOutlined } from '@ant-design/icons-vue';
@@ -1,4 +1,9 @@
1
- <script generic="D = Recordable, F = Recordable" lang="ts" name="PGrid" setup>
1
+ <script
2
+ generic="D extends Recordable = Recordable, F extends Recordable = Recordable"
3
+ lang="ts"
4
+ name="PGrid"
5
+ setup
6
+ >
2
7
  import { ColumnProps, PFormItemProps, PGridProps, ResponsePathConfig } from '#/antProxy';
3
8
  import {
4
9
  computed,
@@ -236,15 +241,15 @@
236
241
  eachTree(formConfig.value.items, (item) => {
237
242
  if (item.field && item.itemRender) {
238
243
  if (isGoodValue(item.itemRender.defaultValue)) {
239
- obj[item.field] = item.itemRender.defaultValue;
244
+ obj[item.field as keyof F] = item.itemRender.defaultValue;
240
245
  } else {
241
- obj[item.field] = undefined;
246
+ obj[item.field as keyof F] = undefined;
242
247
  }
243
248
  } else if (item.field && item.slots) {
244
249
  if (isGoodValue(item.slots.defaultValue)) {
245
- obj[item.field] = item.slots.defaultValue;
250
+ obj[item.field as keyof F] = item.slots.defaultValue;
246
251
  } else {
247
- obj[item.field] = undefined;
252
+ obj[item.field as keyof F] = undefined;
248
253
  }
249
254
  }
250
255
  });
@@ -1,4 +1,4 @@
1
- <script lang="ts" setup name="PGroupBlock" generic="F = Recordable">
1
+ <script lang="ts" setup name="PGroupBlock" generic="F extends Recordable = Recordable">
2
2
  import { PBlockProps, PFormInstance, PFormProps } from '#/antProxy';
3
3
  import { computed, ref, toRefs } from 'vue';
4
4
  import PForm from '@/components/PForm.vue';
@@ -1,32 +1,18 @@
1
- <script lang="ts" setup name="PromisePicker" generic="D = Recordable, F = Recordable">
2
- import { PropType, reactive, ref, computed } from 'vue';
3
- import { PGridInstance, PGridProps } from '#/antProxy';
1
+ <script lang="ts" setup name="PromisePicker" generic="D extends Recordable = Recordable, F extends Recordable = Recordable">
2
+ import { reactive, ref, computed } from 'vue';
3
+ import { PGridInstance, PromisePickerProps } from '#/antProxy';
4
4
  import PGrid from '@/components/PGrid.vue';
5
5
  import { $warning } from '@/hooks/useMessage';
6
6
  import { Button as AButton, Modal as AModal } from 'ant-design-vue';
7
7
 
8
8
  const gridEl = ref<PGridInstance<D>>();
9
- const props = defineProps({
10
- gridSetting: {
11
- type: Object as PropType<PGridProps<D, F>>,
12
- required: true,
13
- },
14
- title: {
15
- type: String as PropType<string>,
16
- default: '数据选择',
17
- },
18
- width: {
19
- type: [String, Number] as PropType<string | number>,
20
- default: '70%',
21
- },
22
- multipleAllowEmpty: {
23
- type: Boolean,
24
- default: false,
25
- },
26
- bodyStyle: {
27
- type: Object,
28
- default: () => ({}),
29
- },
9
+
10
+ const props = withDefaults(defineProps<PromisePickerProps<D, F>>(), {
11
+ title: '数据选择',
12
+ width: '70%',
13
+ multipleAllowEmpty: false,
14
+ bodyStyle: () => ({}),
15
+ beforePick: () => Promise.resolve(),
30
16
  });
31
17
  const isMultiple = computed(() => props.gridSetting.selectConfig?.multiple);
32
18
  let resolvePromise: (
@@ -52,8 +38,10 @@
52
38
  const selectRow = ({ row, field }: { row: D; field?: string }) => {
53
39
  // 单选才关闭结束选择
54
40
  if (resolvePromise && !isMultiple.value) {
55
- visible.modal = false;
56
- resolvePromise({ row, field });
41
+ props.beforePick(row).then(() => {
42
+ visible.modal = false;
43
+ resolvePromise({ row, field });
44
+ });
57
45
  }
58
46
  };
59
47
  const endMultiplePicker = () => {
@@ -61,8 +49,10 @@
61
49
  if (records.length === 0 && !props.multipleAllowEmpty) {
62
50
  $warning('请选择数据');
63
51
  } else {
64
- visible.modal = false;
65
- multipleResolver(records);
52
+ props.beforePick(records).then(() => {
53
+ visible.modal = false;
54
+ multipleResolver(records);
55
+ });
66
56
  }
67
57
  };
68
58
  defineExpose({
@@ -81,7 +71,7 @@
81
71
  grid: gridEl,
82
72
  hide: () => {
83
73
  visible.modal = false;
84
- }
74
+ },
85
75
  });
86
76
  </script>
87
77
  <template>
@@ -3,10 +3,10 @@ import { CellRender, RenderTableParams } from '#/antProxy';
3
3
  import renderStore from '@/store/renderStore';
4
4
 
5
5
  export default defineComponent(
6
- <D = Recordable,>(props: {
6
+ <D extends Recordable = Recordable>(props: {
7
7
  cellRender: CellRender;
8
8
  renderTableParams: RenderTableParams<D>;
9
- defaultHandler?: {
9
+ defaultHandler: {
10
10
  [key: string]: (...args: any[]) => any;
11
11
  };
12
12
  }) => {
@@ -3,11 +3,11 @@ import { ItemRender, RenderFormParams } from '#/antProxy';
3
3
  import renderStore from '@/store/renderStore';
4
4
 
5
5
  export default defineComponent(
6
- <F = Recordable,>(
6
+ <F extends Recordable = Recordable>(
7
7
  props: {
8
8
  itemRender: ItemRender;
9
9
  renderFormParams: RenderFormParams<F>;
10
- defaultHandler?: {
10
+ defaultHandler: {
11
11
  [key: string]: (...args: any[]) => any;
12
12
  };
13
13
  },
@@ -4,7 +4,7 @@ import { renderAntFormat } from '@/utils/AFormatters';
4
4
  import RenderAntCell from '@/components/RenderAntCell';
5
5
 
6
6
  export default defineComponent(
7
- <D = Recordable,>(props: {
7
+ <D extends Recordable = Recordable>(props: {
8
8
  tableData: D[];
9
9
  row: D;
10
10
  column: ColumnProps<D>;
@@ -0,0 +1,36 @@
1
+ import { defineComponent, ref } from 'vue';
2
+ import { CellRender, RenderTableParams } from '#/antProxy';
3
+ import renderStore from '@/store/renderStore';
4
+
5
+ export default defineComponent(
6
+ <D extends Recordable = Recordable>(
7
+ props: {
8
+ cellRender: CellRender;
9
+ renderTableParams: RenderTableParams<D>;
10
+ },
11
+ { emit },
12
+ ) => {
13
+ const { cellRender, renderTableParams } = props;
14
+ const { row, field } = renderTableParams!;
15
+ if (field) {
16
+ const innerValue = ref(row[field]);
17
+ return () => {
18
+ return (
19
+ renderStore.renders[cellRender!.name]?.renderEdit?.(
20
+ innerValue,
21
+ cellRender!,
22
+ renderTableParams,
23
+ emit,
24
+ ) ?? null
25
+ );
26
+ };
27
+ } else {
28
+ return () => null;
29
+ }
30
+ },
31
+ {
32
+ name: 'RenderEditCell',
33
+ props: ['cellRender', 'renderTableParams'],
34
+ emits: ['blur'],
35
+ },
36
+ );
@@ -2,7 +2,7 @@ import { defineComponent, toRefs } from 'vue';
2
2
  import { PFormItemProps } from '#/antProxy';
3
3
 
4
4
  export default defineComponent(
5
- <F = Recordable,>(props: {
5
+ <F extends Recordable = Recordable>(props: {
6
6
  formData: F;
7
7
  item: PFormItemProps<F>;
8
8
  passTrigger: (cusFields?: string | string[]) => void;
@@ -2,7 +2,7 @@ import { defineComponent } from 'vue';
2
2
  import { ColumnProps } from '#/antProxy';
3
3
 
4
4
  export default defineComponent(
5
- <D = Recordable,>(props: { column: ColumnProps<D> }) => {
5
+ <D extends Recordable = Recordable>(props: { column: ColumnProps<D> }) => {
6
6
  const { column } = props;
7
7
  return () => {
8
8
  return column.slots?.title?.({ column }) ?? column.title;
@@ -1,4 +1,4 @@
1
- <script lang="ts" setup name="TableInput" generic="D = Recordable">
1
+ <script lang="ts" setup name="TableInput" generic="D extends Recordable = Recordable">
2
2
  import { computed, PropType, watch } from 'vue';
3
3
  import { TableProps } from 'ant-design-vue';
4
4
  import { ColumnProps } from '#/antProxy';
@@ -26,7 +26,7 @@ import { ButtonProps } from 'ant-design-vue/lib/button';
26
26
  import { isBadValue, isGoodValue, valued } from '@/utils/is';
27
27
  import TableInput from '@/renders/TableInput.vue';
28
28
  import Icon from '@/renders/Icon';
29
- import { computed } from 'vue';
29
+ import { computed, Ref } from 'vue';
30
30
 
31
31
  interface BtnOptions extends ButtonProps {
32
32
  content?: string;
@@ -36,7 +36,27 @@ interface BtnOptions extends ButtonProps {
36
36
  clickEvt?: (p: RenderTableParams) => any;
37
37
  hiddenIf?: (p: RenderTableParams) => boolean;
38
38
  }
39
-
39
+ export interface RenderWorkshop {
40
+ renderItemContent?: (
41
+ options: RenderOptions,
42
+ params: RenderFormParams,
43
+ defaultHandler: Recordable,
44
+ ) => any;
45
+ renderDefault?: (
46
+ options: RenderOptions,
47
+ params: RenderTableParams,
48
+ defaultHandler: Recordable,
49
+ ) => any;
50
+ renderEdit?: (
51
+ model: Ref<any>,
52
+ options: RenderOptions,
53
+ params: RenderTableParams,
54
+ emit?: (e: 'blur', value: any) => void,
55
+ ) => any;
56
+ }
57
+ interface RenderFactory {
58
+ [key: string]: RenderWorkshop;
59
+ }
40
60
  const antDefaultProps = {
41
61
  AInput: {
42
62
  autocomplete: 'off',
@@ -169,6 +189,25 @@ const renderBasic = (name: string) => {
169
189
  <DynamicComponent is={name} {...props} />
170
190
  );
171
191
  },
192
+ renderEdit(
193
+ model: Ref<any>,
194
+ { props = antDefaultProps[name] ?? {}, attrs = {}, events = {} }: RenderOptions,
195
+ params: RenderTableParams,
196
+ emit?: (e: 'blur', value: any[]) => void,
197
+ ) {
198
+ return (
199
+ <DynamicComponent
200
+ is={name}
201
+ v-model:value={model.value}
202
+ {...attrs}
203
+ {...merge({}, antDefaultProps[name], props)}
204
+ onBlur={(...args) => {
205
+ emit?.('blur', model.value);
206
+ events.blur?.(params, ...args);
207
+ }}
208
+ />
209
+ );
210
+ },
172
211
  };
173
212
  };
174
213
 
@@ -224,7 +263,7 @@ const renderBtn = (btnOpt: BtnOptions, params: RenderTableParams) =>
224
263
  {btnOpt.content || (btnOpt?.getContent?.(params) ?? '')}
225
264
  </Button>
226
265
  );
227
- const renders = {
266
+ const renders: RenderFactory = {
228
267
  ...Object.fromEntries(Object.keys(componentsMap).map((name) => [name, renderBasic(name)])),
229
268
  // 简单按钮
230
269
  $button: {
@@ -617,21 +656,7 @@ const renders = {
617
656
  };
618
657
  export const addRender = (
619
658
  name: string,
620
- {
621
- renderItemContent,
622
- renderDefault,
623
- }: {
624
- renderItemContent?: (
625
- options: RenderOptions,
626
- params: RenderFormParams,
627
- defaultHandler: Recordable,
628
- ) => any;
629
- renderDefault?: (
630
- options: RenderOptions,
631
- params: RenderTableParams,
632
- defaultHandler: Recordable,
633
- ) => any;
634
- },
659
+ { renderItemContent, renderDefault, renderEdit }: RenderWorkshop,
635
660
  ) => {
636
661
  if (renders.hasOwnProperty(name)) {
637
662
  console.warn(`render ${name} already exists, you are trying to override it`);
@@ -639,6 +664,7 @@ export const addRender = (
639
664
  renders[name] = {
640
665
  renderItemContent,
641
666
  renderDefault,
667
+ renderEdit,
642
668
  };
643
669
  };
644
670
  export default {
@@ -1,4 +1,4 @@
1
- @import 'variables';
1
+ @use 'variables';
2
2
 
3
3
  .p-pane {
4
4
  background-color: var(--p-theme-bg);
@@ -100,9 +100,9 @@
100
100
  z-index: 4;
101
101
  }
102
102
  .p-error-hang-out {
103
- .ant-input-affix-wrapper-status-error:not(
104
- .ant-input-affix-wrapper-disabled
105
- ):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper {
103
+ .ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(
104
+ .ant-input-affix-wrapper-borderless
105
+ ).ant-input-affix-wrapper {
106
106
  border-color: #d9d9d9 !important;
107
107
 
108
108
  &:focus {
@@ -122,7 +122,9 @@
122
122
  transform: translateY(-10px);
123
123
  max-height: 0;
124
124
  overflow: hidden;
125
- transition: opacity 0.3s ease-out 0.3s, transform 0.3s ease-out 0.3s,
125
+ transition:
126
+ opacity 0.3s ease-out 0.3s,
127
+ transform 0.3s ease-out 0.3s,
126
128
  max-height 0.3s ease-out 0.3s;
127
129
  }
128
130
  .ant-form-item-has-error .ant-form-item-explain-error {
@@ -234,25 +236,25 @@
234
236
  }
235
237
  }
236
238
  }
237
- .p-error-group-tab{
238
- position:relative;
239
+ .p-error-group-tab {
240
+ position: relative;
239
241
  overflow: visible;
240
- color:#f5222d!important;
241
- &:after{
242
- content:'🏷️';
243
- position:absolute;
244
- top:-1em;
245
- right:0;
246
- width:1em;
247
- height:1em;
248
- font-size:0.8em;
242
+ color: #f5222d !important;
243
+ &:after {
244
+ content: '🏷️';
245
+ position: absolute;
246
+ top: -1em;
247
+ right: 0;
248
+ width: 1em;
249
+ height: 1em;
250
+ font-size: 0.8em;
249
251
  animation: heartbeat 2s infinite;
250
252
  }
251
253
  }
252
254
  .p-error-hang-out {
253
- .ant-input-affix-wrapper-status-error:not(
254
- .ant-input-affix-wrapper-disabled
255
- ):not(.ant-input-affix-wrapper-borderless).ant-input-affix-wrapper {
255
+ .ant-input-affix-wrapper-status-error:not(.ant-input-affix-wrapper-disabled):not(
256
+ .ant-input-affix-wrapper-borderless
257
+ ).ant-input-affix-wrapper {
256
258
  border-color: #d9d9d9 !important;
257
259
 
258
260
  &:focus {
@@ -272,6 +274,10 @@
272
274
  }
273
275
  //endregion
274
276
 
277
+ /* #region EVirtTable */
278
+
279
+ /* #endregion */
280
+
275
281
  @each $align in right center {
276
282
  /**/
277
283
  .p-content-align-#{$align}.ant-form-item .ant-form-item-control-input-content {
@@ -287,15 +293,37 @@
287
293
  }
288
294
 
289
295
  @keyframes heartbeat {
290
- 0% { transform: scale(1); }
291
- 6% { transform: scale(1.22); }
292
- 12% { transform: scale(1); }
293
- 18% { transform: scale(1.18); }
294
- 24% { transform: scale(1); }
295
- 48% { transform: scale(1); } // 长停顿
296
- 54% { transform: scale(1.22); }
297
- 60% { transform: scale(1); }
298
- 66% { transform: scale(1.18); }
299
- 72% { transform: scale(1); }
300
- 100% { transform: scale(1); } // 长停顿
301
- }
296
+ 0% {
297
+ transform: scale(1);
298
+ }
299
+ 6% {
300
+ transform: scale(1.22);
301
+ }
302
+ 12% {
303
+ transform: scale(1);
304
+ }
305
+ 18% {
306
+ transform: scale(1.18);
307
+ }
308
+ 24% {
309
+ transform: scale(1);
310
+ }
311
+ 48% {
312
+ transform: scale(1);
313
+ } // 长停顿
314
+ 54% {
315
+ transform: scale(1.22);
316
+ }
317
+ 60% {
318
+ transform: scale(1);
319
+ }
320
+ 66% {
321
+ transform: scale(1.18);
322
+ }
323
+ 72% {
324
+ transform: scale(1);
325
+ }
326
+ 100% {
327
+ transform: scale(1);
328
+ } // 长停顿
329
+ }
@@ -1,9 +1,9 @@
1
1
  import { isArray, isFunction, isString, toNumber } from 'xe-utils';
2
2
  import { valued } from '@/utils/is';
3
- import { CellFuncArg, ColumnProps } from '#/antProxy';
3
+ import { CellFuncArg, ColumnProps, PFormatter } from '#/antProxy';
4
4
 
5
5
  const emptyStr = `-`;
6
- export const antFormatters = {
6
+ export const antFormatters: PFormatter = {
7
7
  toString: ({ cellValue }) => (cellValue ? (cellValue.toString?.() ?? emptyStr) : emptyStr),
8
8
  // 格式化选项
9
9
  formatByOptions: ({ cellValue }, options: IOption[], separator = ',') => {
@@ -28,7 +28,7 @@ export const antFormatters = {
28
28
  return valued(cellValue) ? (toNumber(cellValue) === 1 ? '男' : '女') : emptyStr;
29
29
  },
30
30
  };
31
- export const renderAntFormat = <D = Recordable>(
31
+ export const renderAntFormat = <D extends Recordable = Recordable>(
32
32
  formatter: string | [string, ...Array<any>] | ((arg: CellFuncArg<D>) => any),
33
33
  {
34
34
  record,