@vue-ui-kit/ant 1.7.2 → 1.7.4

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.
@@ -11,7 +11,7 @@ declare const _default: <F = Recordable<any>>(__VLS_props: NonNullable<Awaited<t
11
11
  activeKey: import('vue').ComputedRef<number>;
12
12
  setActiveKey: (key: number) => void;
13
13
  validateAll: () => Promise<any[]>;
14
- validate: (index: any) => any;
14
+ validate: (__index: number) => any;
15
15
  }>): void;
16
16
  attrs: any;
17
17
  slots: ReturnType<() => {
@@ -44,6 +44,7 @@ declare const _default: <D = Recordable<any>, F = Recordable<any>>(__VLS_props:
44
44
  field?: string;
45
45
  }>;
46
46
  grid: import('vue').Ref<PGridInstance<D, Recordable<any>> | undefined, PGridInstance<D, Recordable<any>> | undefined>;
47
+ hide: () => void;
47
48
  }>): void;
48
49
  attrs: any;
49
50
  slots: ReturnType<() => {}>;
@@ -5,7 +5,7 @@ declare const _default: import('vue').DefineSetupFnComponent<{
5
5
  defaultHandler: {
6
6
  [key: string]: (...args: any[]) => any;
7
7
  };
8
- }, "trigger"[], {}, {
8
+ }, ("trigger" | "delayTrigger")[], {}, {
9
9
  itemRender: ItemRender;
10
10
  renderFormParams: RenderFormParams<Recordable<any>>;
11
11
  defaultHandler: {
@@ -13,5 +13,6 @@ declare const _default: import('vue').DefineSetupFnComponent<{
13
13
  };
14
14
  } & {
15
15
  onTrigger?: ((...args: any[]) => any) | undefined;
16
+ onDelayTrigger?: ((...args: any[]) => any) | undefined;
16
17
  }, import('vue').PublicProps>;
17
18
  export default _default;
@@ -2,9 +2,11 @@ declare const _default: import('vue').DefineSetupFnComponent<{
2
2
  formData: any;
3
3
  item: any;
4
4
  passTrigger: any;
5
+ passDelayTrigger: any;
5
6
  }, {}, {}, {
6
7
  formData: any;
7
8
  item: any;
8
9
  passTrigger: any;
10
+ passDelayTrigger: any;
9
11
  } & {}, import('vue').PublicProps>;
10
12
  export default _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vue-ui-kit/ant",
3
- "version": "1.7.2",
3
+ "version": "1.7.4",
4
4
  "description": "Vue3 UI Kit based on Ant Design",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -65,6 +65,7 @@ export interface PFormItemProps<F = Recordable> {
65
65
  default?: (
66
66
  { data, field }: ItemFuncArg<F>,
67
67
  passTrigger?: (cusFields?: string | string[]) => void,
68
+ passDelayTrigger?: (cusFields?: string | string[], time?: number) => void
68
69
  ) => any;
69
70
  };
70
71
  }
@@ -108,8 +109,10 @@ export interface PFormGroupProps<F = Recordable> {
108
109
  tabLabel?: string;
109
110
  editAble?: boolean;
110
111
  showAdd?: boolean;
112
+ forceRender?: boolean;
111
113
  /* 是否保持连续编号 */
112
114
  keepSerial?: boolean;
115
+ loading?: boolean;
113
116
  itemMenus?: Array<GroupMenuItem<F>>;
114
117
  creatItem?: ({ list }: { list?: Partial<F>[] }) => Promise<Partial<F>>;
115
118
  max?: number;
@@ -144,7 +147,7 @@ export interface ToolbarButtonProps extends PButtonProps {
144
147
 
145
148
  export interface ToolbarConfig {
146
149
  buttons?: Array<ToolbarButtonProps>;
147
- tools?: Array<{ code: string; icon: string; type?: ButtonType; disabled?: boolean }>;
150
+ tools?: Array<{ code: string; icon: string; type?: ButtonType; disabled?: boolean; size?: 'small' | 'large' | 'middle' }>;
148
151
  disabled?: boolean;
149
152
  }
150
153
 
@@ -240,6 +243,12 @@ export interface RenderOptions {
240
243
  * @param cusFields field或者field数组
241
244
  */
242
245
  handleTrigger?: (cusFields?: string | string[]) => void;
246
+ /**
247
+ * 延迟校验触发器
248
+ * @param cusFields field或者field数组
249
+ * @param time 延迟时间
250
+ */
251
+ handleDelayTrigger?: (cusFields?: string | string[], time?: number) => void;
243
252
  }
244
253
 
245
254
  export interface RenderFormParams<F = Recordable> {
@@ -279,7 +288,8 @@ export interface PFormInstance {
279
288
  export interface PromisePickerInstance<D = Recordable> {
280
289
  pick: () => Promise<{ row: D; field?: string }>;
281
290
  pickMultiple: () => Promise<D[]>;
282
- grid: PGridInstance<D>
291
+ grid: PGridInstance<D>;
292
+ hide: () => void;
283
293
  }
284
294
 
285
295
  export interface PFormBlockInstance {
@@ -63,6 +63,12 @@
63
63
  const handleTrigger = (cusFields?: string | string[]) => {
64
64
  validateField(cusFields);
65
65
  };
66
+ const handleDelayTrigger = (cusFields?: string | string[], time?: number) => {
67
+ const delayTime = time ?? 222;
68
+ setTimeout(() => {
69
+ validateField(cusFields);
70
+ }, delayTime);
71
+ };
66
72
  defineExpose({
67
73
  reset: resetForm,
68
74
  $form: computed(() => formEl.value),
@@ -112,6 +118,7 @@
112
118
  :item="item"
113
119
  :key="'_sl_' + (item.field ?? '_') + '_' + idx"
114
120
  :pass-trigger="handleTrigger"
121
+ :pass-delay-trigger="handleDelayTrigger"
115
122
  />
116
123
  <render-ant-item
117
124
  v-else-if="item.itemRender?.name"
@@ -119,6 +126,7 @@
119
126
  :default-handler="{ reset: resetFormData }"
120
127
  :item-render="item.itemRender"
121
128
  @trigger="handleTrigger"
129
+ @delay-trigger="handleDelayTrigger"
122
130
  :render-form-params="{ data: formData, field: item.field }"
123
131
  />
124
132
  <span v-else></span>
@@ -2,6 +2,7 @@
2
2
  import { computed, nextTick, PropType, ref, watchEffect } from 'vue';
3
3
  import { PFormGroupProps, PFormBlockInstance } from '#/antProxy';
4
4
  import { MoreOutlined } from '@ant-design/icons-vue';
5
+ import { Form } from 'ant-design-vue'
5
6
  import { cloneDeep, toString, isFunction, omit, maxBy, debounce } from 'lodash-es';
6
7
  import PGroupBlock from '@/components/PGroupBlock.vue';
7
8
  import {
@@ -15,7 +16,9 @@
15
16
  } from 'ant-design-vue';
16
17
  import { valued } from '@/utils/is';
17
18
  import { MenuInfo } from 'ant-design-vue/es/menu/src/interface';
18
-
19
+ import { $warning } from '@/hooks/useMessage';
20
+
21
+ const useForm = Form.useForm
19
22
  const props = defineProps<PFormGroupProps<F>>();
20
23
  const model = defineModel({
21
24
  type: Array as PropType<Partial<F & { __index: number }>[]>,
@@ -44,6 +47,15 @@
44
47
  { content: '复制', code: 'copy' },
45
48
  { content: '删除', code: 'delete' },
46
49
  ];
50
+ // 实际是否强制渲染
51
+ const fr = computed(() => {
52
+ return props.forceRender || model.value.length <= 5
53
+ })
54
+ const handleTabChange = () => {
55
+ nextTick().then(() => {
56
+ blockInstance.value[activeKey.value]?.$form?.validate()
57
+ })
58
+ }
47
59
  watchEffect(() => {
48
60
  if (!props.keepSerial) {
49
61
  const unSortItems = model.value.filter((f) => !valued(f.__index));
@@ -70,6 +82,10 @@
70
82
  });
71
83
  break;
72
84
  case 'copy':
85
+ if (model.value.length >= maxLen.value) {
86
+ $warning('已达到最大数量')
87
+ return
88
+ }
73
89
  model.value = [
74
90
  ...model.value,
75
91
  cloneDeep({
@@ -93,18 +109,22 @@
93
109
  activeKey: computed(() => activeKey.value),
94
110
  setActiveKey,
95
111
  validateAll: () => {
96
- return Promise.all(
97
- blockInstance.value.map((block) => block.$form?.validate() ?? Promise.resolve()),
98
- );
112
+ return Promise.all(blockInstance.value.map((block, idx) =>
113
+ fr.value ? (block.$form?.validate() ?? Promise.resolve()) : (useForm(model.value[idx], props.getFormSetting(model.value[idx]).rules)?.validate() ?? Promise.resolve()),
114
+ ))
99
115
  },
100
- validate: (index) => {
101
- return blockInstance.value[index]?.$form?.validate()
116
+ validate: (__index: number) => {
117
+ const index = model.value.findIndex(f => f.__index === __index)
118
+ return fr.value
119
+ ? (blockInstance.value[index]?.$form?.validate() ?? Promise.resolve())
120
+ : (useForm(model.value[index], props.getFormSetting(model.value[index]).rules)?.validate() ?? Promise.resolve())
102
121
  },
103
122
  });
104
123
  </script>
105
124
  <template>
106
125
  <a-card :title="title" size="small">
107
- <a-tabs type="editable-card" v-model:activeKey="activeKey" hide-add>
126
+ <a-spin v-if="loading" class="w-full" />
127
+ <a-tabs v-else type="editable-card" v-model:activeKey="activeKey" hide-add @change="handleTabChange">
108
128
  <template #rightExtra>
109
129
  <slot name="rightExtra">
110
130
  <a-button
@@ -120,7 +140,7 @@
120
140
  v-for="(item, idx) in model"
121
141
  :key="idx"
122
142
  :tab="`${tabLabel} ${keepSerial ? idx + 1 : (item.__index ?? 0) + 1}`"
123
- force-render
143
+ :force-render="fr"
124
144
  >
125
145
  <template #closeIcon>
126
146
  <a-dropdown v-if="editAble && itemMenus?.length">
@@ -512,6 +512,7 @@
512
512
  :form-data="queryFormData"
513
513
  :item="item"
514
514
  :pass-trigger="() => {}"
515
+ :pass-delay-trigger="() => {}"
515
516
  />
516
517
  <render-ant-item
517
518
  v-else-if="item.itemRender?.name"
@@ -592,7 +593,7 @@
592
593
  v-for="(tool, idx) in toolbarConfig.tools"
593
594
  :key="idx"
594
595
  :type="tool.type"
595
- :size="btn.size ?? 'middle'"
596
+ :size="tool.size ?? 'middle'"
596
597
  :disabled="toolbarConfig.disabled || tool.disabled"
597
598
  @click="debounceToolToolClick(tool.code)"
598
599
  :loading="loading.toolbar || (!!tool.code && codeLoadings[tool.code])"
@@ -603,7 +604,7 @@
603
604
  </span>
604
605
  </div>
605
606
  <div :class="`p-pane flex-1 ${enoughSpacing ? 'h-0' : ''} p-${scrollMode ?? 'inner'}-scroll`">
606
- <div v-if="selectConfig?.multiple && selectConfig.showCount" class="w-100p text-slate-5 pl-4">
607
+ <div v-if="selectConfig?.multiple && selectConfig.showCount" class="w-full text-slate-5 pl-4">
607
608
  已选:{{ selectedRowKeys.length }}
608
609
  </div>
609
610
  <a-table
@@ -78,7 +78,10 @@
78
78
  rejectPromise = reject;
79
79
  visible.modal = true;
80
80
  }),
81
- grid: gridEl,
81
+ grid: gridEl,
82
+ hide: () => {
83
+ visible.modal = false;
84
+ }
82
85
  });
83
86
  </script>
84
87
  <template>
@@ -18,12 +18,16 @@ export default defineComponent(
18
18
  const passTrigger = (cusFields?: string | string[]) => {
19
19
  emit('trigger', cusFields);
20
20
  };
21
+ const passDelayTrigger = (cusFields?: string | string[], time?: number) => {
22
+ emit('delayTrigger', cusFields, time);
23
+ };
21
24
  return () => {
22
25
  return (
23
26
  renderStore.renders[itemRender!.name]?.renderItemContent?.(
24
27
  {
25
28
  ...itemRender!,
26
29
  handleTrigger: passTrigger,
30
+ handleDelayTrigger: passDelayTrigger,
27
31
  },
28
32
  renderFormParams.value,
29
33
  defaultHandler,
@@ -49,6 +53,6 @@ export default defineComponent(
49
53
  required: false,
50
54
  },
51
55
  },
52
- emits: ['trigger'],
56
+ emits: ['trigger', 'delayTrigger'],
53
57
  },
54
58
  );
@@ -6,6 +6,7 @@ export default defineComponent(
6
6
  formData: F;
7
7
  item: PFormItemProps<F>;
8
8
  passTrigger: (cusFields?: string | string[]) => void;
9
+ passDelayTrigger: (cusFields?: string | string[], time?: number) => void;
9
10
  }) => {
10
11
  const { formData } = toRefs(props);
11
12
  return () => {
@@ -13,12 +14,13 @@ export default defineComponent(
13
14
  props.item.slots?.default?.(
14
15
  { data: formData.value, field: props.item.field },
15
16
  props.passTrigger,
17
+ props.passDelayTrigger,
16
18
  ) ?? null
17
19
  );
18
20
  };
19
21
  },
20
22
  {
21
23
  name: 'RenderItemSlots',
22
- props: ['formData', 'item', 'passTrigger'],
24
+ props: ['formData', 'item', 'passTrigger', 'passDelayTrigger'],
23
25
  },
24
26
  );
@@ -34,6 +34,7 @@ interface BtnOptions extends ButtonProps {
34
34
  dynamicClassName?: (p: RenderTableParams) => string;
35
35
  dropdowns?: BtnOptions[];
36
36
  clickEvt?: (p: RenderTableParams) => any;
37
+ hiddenIf?: (p: RenderTableParams) => boolean;
37
38
  }
38
39
 
39
40
  const antDefaultProps = {
@@ -236,8 +237,8 @@ const renders = {
236
237
  events.click?.({ data, field })
237
238
  if (props.htmlType === 'reset' && defaultHandler?.reset) {
238
239
  if (props.beforeClick && isFunction(props.beforeClick)) {
239
- props.beforeClick({ data, field }).then(() => {
240
- defaultHandler.reset({ data, field })
240
+ props.beforeClick({ data, field }).then((res: void | Recordable) => {
241
+ defaultHandler.reset(res ? { data: res, field } : { data, field })
241
242
  })
242
243
  }
243
244
  else {
@@ -268,8 +269,8 @@ const renders = {
268
269
  if (props.htmlType === 'reset' && defaultHandler?.reset) {
269
270
  if (props.beforeClick && isFunction(props.beforeClick)) {
270
271
  defaultHandler?.setLoadings?.(true)
271
- props.beforeClick({ row, field }).then(() => {
272
- defaultHandler.reset({ row, field })
272
+ props.beforeClick({ row, field }).then((res: void | Recordable) => {
273
+ defaultHandler.reset(res ? { row: res, field } : { row, field })
273
274
  }).finally(() => {
274
275
  defaultHandler?.setLoadings?.(false)
275
276
  })
@@ -281,8 +282,8 @@ const renders = {
281
282
  if (props.htmlType === 'pick' && defaultHandler?.pick) {
282
283
  if (props.beforeClick && isFunction(props.beforeClick)) {
283
284
  defaultHandler?.setLoadings?.(true)
284
- props.beforeClick({ row, field }).then(() => {
285
- defaultHandler.pick({ row, field })
285
+ props.beforeClick({ row, field }).then((res: void | Recordable) => {
286
+ defaultHandler.pick(res ? { row: res, field } : { row, field })
286
287
  }).finally(() => {
287
288
  defaultHandler?.setLoadings?.(false)
288
289
  })
@@ -318,8 +319,8 @@ const renders = {
318
319
  m.events?.click?.({ data, field })
319
320
  if (m.props.htmlType === 'reset' && defaultHandler?.reset) {
320
321
  if (props.beforeClick && isFunction(props.beforeClick)) {
321
- props.beforeClick({ data, field }).then(() => {
322
- defaultHandler.reset({ data, field })
322
+ props.beforeClick({ data, field }).then((res: void | Recordable) => {
323
+ defaultHandler.reset(res ? { data: res, field } : { data, field })
323
324
  })
324
325
  }
325
326
  else {
@@ -328,8 +329,8 @@ const renders = {
328
329
  }
329
330
  if (m.props.htmlType === 'pick' && defaultHandler?.pick) {
330
331
  if (props.beforeClick && isFunction(props.beforeClick)) {
331
- props.beforeClick({ data, field }).then(() => {
332
- defaultHandler.pick({ data, field })
332
+ props.beforeClick({ data, field }).then((res: void | Recordable) => {
333
+ defaultHandler.pick(res ? { data: res, field } : { data, field })
333
334
  })
334
335
  }
335
336
  else {
@@ -369,8 +370,8 @@ const renders = {
369
370
  if (m.props.htmlType === 'reset' && defaultHandler?.reset) {
370
371
  if (props.beforeClick && isFunction(props.beforeClick)) {
371
372
  defaultHandler?.setLoadings?.(true)
372
- props.beforeClick({ row, field }).then(() => {
373
- defaultHandler.reset({ row, field })
373
+ props.beforeClick({ row, field }).then((res: void | Recordable) => {
374
+ defaultHandler.reset(res ? { row: res, field } : { row, field })
374
375
  }).finally(() => {
375
376
  defaultHandler?.setLoadings?.(false)
376
377
  })
@@ -382,8 +383,8 @@ const renders = {
382
383
  if (m.props.htmlType === 'pick' && defaultHandler?.pick) {
383
384
  if (props.beforeClick && isFunction(props.beforeClick)) {
384
385
  defaultHandler?.setLoadings?.(true)
385
- props.beforeClick({ row, field }).then(() => {
386
- defaultHandler.pick({ row, field })
386
+ props.beforeClick({ row, field }).then((res: void | Recordable) => {
387
+ defaultHandler.pick(res ? { row: res, field } : { row, field })
387
388
  }).finally(() => {
388
389
  defaultHandler?.setLoadings?.(false)
389
390
  })