@vue-ui-kit/ant 1.7.0 → 1.7.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.
@@ -11,6 +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
15
  }>): void;
15
16
  attrs: any;
16
17
  slots: ReturnType<() => {
@@ -49,7 +49,7 @@ declare const _default: <D = Recordable<any>, F = Recordable<any>>(__VLS_props:
49
49
  setBtnLoading: (code: string, value: boolean) => void;
50
50
  selectedRecords: import('vue').ComputedRef<D[]>;
51
51
  $form: import('vue').ComputedRef<any>;
52
- setLoadings: (value: boolean) => void;
52
+ setLoadings: (value: boolean | Record<string, boolean>) => void;
53
53
  resizeTable: () => void;
54
54
  }>): void;
55
55
  attrs: any;
@@ -1,5 +1,5 @@
1
1
  import { PropType } from 'vue';
2
- import { PGridProps } from '../../declarations/antProxy';
2
+ import { PGridInstance, PGridProps } from '../../declarations/antProxy';
3
3
  declare const _default: <D = Recordable<any>, F = Recordable<any>>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_Prettify<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_expose?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
4
4
  props: __VLS_Prettify<Pick<Partial<{
5
5
  title: string;
@@ -43,6 +43,7 @@ declare const _default: <D = Recordable<any>, F = Recordable<any>>(__VLS_props:
43
43
  row: D;
44
44
  field?: string;
45
45
  }>;
46
+ grid: import('vue').Ref<PGridInstance<D, Recordable<any>> | undefined, PGridInstance<D, Recordable<any>> | undefined>;
46
47
  }>): void;
47
48
  attrs: any;
48
49
  slots: ReturnType<() => {}>;
@@ -6,18 +6,20 @@ export declare const addRender: (name: string, { renderItemContent, renderDefaul
6
6
  declare const _default: {
7
7
  renders: {
8
8
  $button: {
9
- renderItemContent({ props, events }: RenderOptions, { data, field }: RenderFormParams, defaultHandler: {
9
+ renderItemContent({ props, events }: RenderOptions, { data, field, }: RenderFormParams, defaultHandler: {
10
10
  [key: string]: (...args: any[]) => any;
11
11
  }): import("vue/jsx-runtime").JSX.Element;
12
- renderDefault({ props, events }: RenderOptions, { row, field }: RenderTableParams, defaultHandler: {
12
+ renderDefault({ props, events }: RenderOptions, { row, field, }: RenderTableParams, defaultHandler: {
13
13
  [key: string]: (...args: any[]) => any;
14
14
  }): import("vue/jsx-runtime").JSX.Element;
15
15
  };
16
16
  $buttons: {
17
- renderItemContent({ props, children }: RenderOptions, { data, field }: RenderFormParams, defaultHandler: {
17
+ renderItemContent({ props, children }: RenderOptions, { data, field, }: RenderFormParams, defaultHandler: {
18
+ [key: string]: (...args: any[]) => any;
19
+ }): import("vue/jsx-runtime").JSX.Element;
20
+ renderDefault({ props, children }: RenderOptions, { data, row, field, }: RenderTableParams, defaultHandler: {
18
21
  [key: string]: (...args: any[]) => any;
19
22
  }): import("vue/jsx-runtime").JSX.Element;
20
- renderDefault({ props, children }: RenderOptions, { data, row, field }: RenderTableParams): import("vue/jsx-runtime").JSX.Element;
21
23
  };
22
24
  ButtonTree: {
23
25
  renderDefault({ children, props }: {
@@ -26,7 +28,7 @@ declare const _default: {
26
28
  }, params: RenderTableParams): import("vue/jsx-runtime").JSX.Element;
27
29
  };
28
30
  $radio: {
29
- renderItemContent({ props, options }: RenderOptions, { data, field }: RenderFormParams): import("vue/jsx-runtime").JSX.Element | null;
31
+ renderItemContent({ props, events, options }: RenderOptions, { data, field }: RenderFormParams): import("vue/jsx-runtime").JSX.Element | null;
30
32
  renderDefault({ props, options }: RenderOptions, { row, field }: RenderTableParams): import("vue/jsx-runtime").JSX.Element | null;
31
33
  };
32
34
  $autoComplete: {
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- @charset "UTF-8";:root{--p-theme-bg: #fff}.p-pane{background-color:var(--p-theme-bg);padding:16px;border-radius:4px}.w-full{width:100%}.cursor-pointer{cursor:pointer}.py-4x{padding-top:4px;padding-bottom:4px}.px-2x{padding-left:2px;padding-right:2px}.h-0{height:0}.h-full{height:100%}.flex{display:flex}.flex-col{flex-direction:column}.flex-1{flex:1}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-4px{gap:4px}.gap-8px{gap:8px}.pt-8px{padding-top:8px}.px-16px{padding-left:16px;padding-right:16px}.mt-4px{margin-top:4px}.text-right{text-align:right}.overflow-y-auto{overflow-y:auto}.p-theme-bg{background-color:var(--p-theme-bg)}.p-wrapper .p-form-wrapper{z-index:4}.p-wrapper .p-toolbar-wrapper{box-shadow:0 8px #fff;border-radius:.5em .5em 0 0;margin-bottom:-.5em}.p-wrapper .ant-form .ant-form-item{margin-bottom:0}.p-wrapper .ant-form .ant-form-item.p-required .ant-form-item-label>label:before{display:inline-block;margin-inline-end:4px;color:#ff4d4f;font-size:14px;font-family:SimSun,sans-serif;line-height:1;content:"*"}.p-wrapper .ant-form .ant-form-item .ant-form-item-label{display:flex;align-items:start;justify-content:flex-end}.p-wrapper .ant-form .ant-form-item .ant-form-item-label>label{white-space:break-spaces;align-items:flex-start;height:fit-content;padding-top:.36em}.p-wrapper .ant-form .ant-form-item .ant-form-item-label>label:after{padding-left:4px;margin-inline-start:unset}.p-wrapper .ant-form.ant-form-vertical .ant-form-item .ant-form-item-label{justify-content:flex-start;font-weight:600}.p-wrapper .ant-table-sticky-scroll{visibility:hidden}.p-wrapper .ant-table-header.ant-table-sticky-holder:before{content:"";width:100%;position:absolute;height:22px;display:block;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);top:-16px}.p-wrapper .ant-table-wrapper .ant-table-pagination.ant-pagination{margin:unset;padding:16px 0}.p-wrapper .p-inner-scroll>.ant-table-wrapper{height:100%}.p-wrapper .p-inner-scroll>.ant-table-wrapper>.ant-spin-nested-loading{height:100%}.p-wrapper .p-inner-scroll>.ant-table-wrapper>.ant-spin-nested-loading>.ant-spin-container{height:100%;display:flex;flex-direction:column}.p-wrapper .p-inner-scroll>.ant-table-wrapper>.ant-spin-nested-loading>.ant-spin-container>.ant-table{border-radius:unset}.p-wrapper .ant-pagination-options .ant-select{width:100px}.p-content-align-right.ant-form-item .ant-form-item-control-input-content{display:flex;justify-content:flex-end;align-items:center;text-align:right}.p-content-align-center.ant-form-item .ant-form-item-control-input-content{display:flex;justify-content:center;align-items:center;text-align:center}
1
+ @charset "UTF-8";:root{--p-theme-bg: #fff}.p-pane{background-color:var(--p-theme-bg);padding:16px;border-radius:4px}.w-full{width:100%}.cursor-pointer{cursor:pointer}.py-4x{padding-top:4px;padding-bottom:4px}.px-2x{padding-left:2px;padding-right:2px}.pl-4x{padding-left:1em}.pl-8{padding-left:2em}.h-0{height:0}.h-full{height:100%}.flex{display:flex}.flex-col{flex-direction:column}.flex-1{flex:1}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-4px{gap:4px}.gap-8px{gap:8px}.pt-8px{padding-top:8px}.px-16px{padding-left:16px;padding-right:16px}.mt-4px{margin-top:4px}.text-right{text-align:right}.overflow-y-auto{overflow-y:auto}.p-theme-bg{background-color:var(--p-theme-bg)}.p-wrapper .p-form-wrapper{z-index:4}.p-wrapper .p-toolbar-wrapper{box-shadow:0 8px #fff;border-radius:.5em .5em 0 0;margin-bottom:-.5em}.p-wrapper .ant-form .ant-form-item{margin-bottom:0}.p-wrapper .ant-form .ant-form-item.p-required .ant-form-item-label>label:before{display:inline-block;margin-inline-end:4px;color:#ff4d4f;font-size:14px;font-family:SimSun,sans-serif;line-height:1;content:"*"}.p-wrapper .ant-form .ant-form-item .ant-form-item-label{display:flex;align-items:start;justify-content:flex-end}.p-wrapper .ant-form .ant-form-item .ant-form-item-label>label{white-space:break-spaces;align-items:flex-start;height:fit-content;padding-top:.36em}.p-wrapper .ant-form .ant-form-item .ant-form-item-label>label:after{padding-left:4px;margin-inline-start:unset}.p-wrapper .ant-form.ant-form-vertical .ant-form-item .ant-form-item-label{justify-content:flex-start;font-weight:600}.p-wrapper .ant-table-sticky-scroll{visibility:hidden}.p-wrapper .ant-table-header.ant-table-sticky-holder:before{content:"";width:100%;position:absolute;height:22px;display:block;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);top:-16px}.p-wrapper .ant-table-wrapper .ant-table-pagination.ant-pagination{margin:unset;padding:16px 0}.p-wrapper .p-inner-scroll>.ant-table-wrapper{height:100%}.p-wrapper .p-inner-scroll>.ant-table-wrapper>.ant-spin-nested-loading{height:100%}.p-wrapper .p-inner-scroll>.ant-table-wrapper>.ant-spin-nested-loading>.ant-spin-container{height:100%;display:flex;flex-direction:column}.p-wrapper .p-inner-scroll>.ant-table-wrapper>.ant-spin-nested-loading>.ant-spin-container>.ant-table{border-radius:unset}.p-wrapper .ant-pagination-options .ant-select{width:100px}.p-content-align-right.ant-form-item .ant-form-item-control-input-content{display:flex;justify-content:flex-end;align-items:center;text-align:right}.p-content-align-center.ant-form-item .ant-form-item-control-input-content{display:flex;justify-content:center;align-items:center;text-align:center}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vue-ui-kit/ant",
3
- "version": "1.7.0",
3
+ "version": "1.7.2",
4
4
  "description": "Vue3 UI Kit based on Ant Design",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -22,6 +22,7 @@ export interface ItemRender {
22
22
  name: string;
23
23
  defaultValue?: any;
24
24
  props?: Recordable;
25
+ attrs?: Recordable;
25
26
  options?: IOption[];
26
27
  children?: Recordable[];
27
28
  events?: { [key: string]: (...args: any[]) => any };
@@ -30,6 +31,7 @@ export interface ItemRender {
30
31
  export interface CellRender {
31
32
  name: string;
32
33
  props?: Recordable;
34
+ attrs?: Recordable;
33
35
  children?: Recordable[];
34
36
  }
35
37
 
@@ -178,6 +180,7 @@ export interface PageConfig {
178
180
 
179
181
  export interface SelectConfig<D = Recordable> {
180
182
  multiple?: boolean;
183
+ showCount?: boolean;
181
184
  getCheckboxProps?: (record: D) => { disabled?: boolean };
182
185
  }
183
186
 
@@ -185,6 +188,7 @@ export type PGridProps<D = Recordable, F = Recordable> = {
185
188
  selectConfig?: SelectConfig<D>;
186
189
  rowKey?: string;
187
190
  manualFetch?: boolean;
191
+ align?: 'left' | 'right' | 'center'
188
192
  formConfig?: PFormProps<F>;
189
193
  columns?: ColumnProps<D>[];
190
194
  toolbarConfig?: ToolbarConfig;
@@ -275,6 +279,7 @@ export interface PFormInstance {
275
279
  export interface PromisePickerInstance<D = Recordable> {
276
280
  pick: () => Promise<{ row: D; field?: string }>;
277
281
  pickMultiple: () => Promise<D[]>;
282
+ grid: PGridInstance<D>
278
283
  }
279
284
 
280
285
  export interface PFormBlockInstance {
@@ -285,4 +290,5 @@ export interface PFormGroupInstance<F = Recordable> {
285
290
  activeKey: number;
286
291
  setActiveKey: (activeKey: number) => void;
287
292
  validateAll: () => Promise<void>;
293
+ validate: (index: number) => Promise<void>;
288
294
  }
@@ -73,7 +73,7 @@
73
73
  </script>
74
74
  <template>
75
75
  <div
76
- v-if="items.some((s: PFormItemProps<F>) => s.field && s.itemRender)"
76
+ v-if="items.some((s: PFormItemProps<F>) => (s.field && s.itemRender) || s.slots?.default)"
77
77
  class="p-pane p-wrapper"
78
78
  >
79
79
  <a-form :key="renderFormKey" ref="formEl" :model="formData" v-bind="fc" @submit="handleSubmit">
@@ -97,6 +97,9 @@
97
97
  blockInstance.value.map((block) => block.$form?.validate() ?? Promise.resolve()),
98
98
  );
99
99
  },
100
+ validate: (index) => {
101
+ return blockInstance.value[index]?.$form?.validate()
102
+ },
100
103
  });
101
104
  </script>
102
105
  <template>
@@ -11,7 +11,7 @@
11
11
  toRefs,
12
12
  onBeforeUnmount,
13
13
  } from 'vue';
14
- import { debounce, get, isArray, isFunction, isString, merge, omit, toNumber } from 'lodash-es';
14
+ import { debounce, get, isArray, isBoolean, isFunction, isObject, isString, merge, omit, toNumber } from 'lodash-es';
15
15
  import { eachTree } from '@/utils/treeHelper';
16
16
  import { message as $message } from 'ant-design-vue';
17
17
  import RenderAntItem from '@/components/RenderAntItem';
@@ -52,6 +52,17 @@
52
52
  toolbar: false,
53
53
  form: false,
54
54
  });
55
+ const setLoadings = (value: boolean|Record<string, boolean>) => {
56
+ if(isObject(value)) {
57
+ Object.keys(value).forEach(key => {
58
+ loading[key] = value[key];
59
+ });
60
+ } else if(isBoolean(value)) {
61
+ loading.form = value;
62
+ loading.table = value;
63
+ loading.toolbar = value;
64
+ }
65
+ };
55
66
  const submitOnReset = true;
56
67
  const boxEl = ref<HTMLDivElement>();
57
68
  const pFormWrapper = ref<HTMLDivElement>();
@@ -393,16 +404,16 @@
393
404
  const resizeTable = () => {
394
405
  const pNode = boxEl.value?.parentElement;
395
406
  const ph = pNode ? window.getComputedStyle(pNode).height : '0px';
396
- const formHeight = pFormWrapper.value
397
- ? toNumber(window.getComputedStyle(pFormWrapper.value).height.replace('px', ''))
407
+ const formOriginHeight = pFormWrapper.value
408
+ ? window.getComputedStyle(pFormWrapper.value).height
409
+ : '0px';
410
+ const formHeight = formOriginHeight.includes('px')
411
+ ? toNumber(formOriginHeight.replace('px', ''))
398
412
  : 0;
399
-
413
+ const showCountHeight = selectConfig.value?.showCount ? 22 : 0
400
414
  renderHeight.value =
401
415
  props.renderY ??
402
- toNumber(ph.replace('px', '')) -
403
- (props.fitHeight ?? 170) -
404
- (!!props.toolbarConfig ? 30 : 0) -
405
- formHeight;
416
+ toNumber(ph.replace('px', '')) -(props.fitHeight ?? 170) -(!!props.toolbarConfig ? 30 : 0) -formHeight- showCountHeight;
406
417
  enoughSpacing.value = toNumber(ph.replace('px', '')) > 600;
407
418
  };
408
419
  defineExpose({
@@ -417,20 +428,42 @@
417
428
  setBtnLoading,
418
429
  selectedRecords,
419
430
  $form: computed(() => formEl.value),
420
- setLoadings: (value: boolean) => {
421
- loading.form = value;
422
- loading.table = value;
423
- loading.toolbar = value;
424
- },
431
+ setLoadings,
425
432
  resizeTable,
426
433
  });
434
+
435
+ let observer: MutationObserver;
427
436
  onMounted(() => {
428
437
  resizeTable();
429
438
  window.addEventListener('resize', resizeTable);
439
+ // 还需要在组件根节点由不可见转为可见时重新计算高度(display:none等样式控制时)
440
+ observer = new MutationObserver((mutations) => {
441
+ mutations.forEach((mutation) => {
442
+ if (mutation.type === 'attributes' && mutation.attributeName === 'style') {
443
+ const el = mutation.target as HTMLElement;
444
+ const style = window.getComputedStyle(el);
445
+ if (style.display !== 'none') {
446
+ resizeTable();
447
+ }
448
+ }
449
+ });
450
+ });
451
+
452
+ if (boxEl.value) {
453
+ observer.observe(boxEl.value, { attributes: true, attributeFilter: ['style'] });
454
+ }
430
455
  resetQueryFormData(props.manualFetch);
431
456
  });
457
+ const passFields = ['align']
458
+ const passDefaultColumnProps = (columns: ColumnProps<D>[]) => columns.map(c => ({
459
+ ...passFields.reduce((prev, cur) => ({
460
+ [cur]: props[cur],
461
+ }), {} as ColumnProps<D>),
462
+ ...c,
463
+ }))
432
464
  onBeforeUnmount(() => {
433
465
  window.removeEventListener('resize', resizeTable);
466
+ observer.disconnect();
434
467
  });
435
468
  </script>
436
469
  <template>
@@ -570,11 +603,14 @@
570
603
  </span>
571
604
  </div>
572
605
  <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
+ 已选:{{ selectedRowKeys.length }}
608
+ </div>
573
609
  <a-table
574
610
  :key="renderTableKey + '_table'"
575
611
  :row-key="rowKey ?? 'id'"
576
612
  ref="tableEl"
577
- :columns="(columns ?? []).map((c) => cleanCol(c as Recordable))"
613
+ :columns="passDefaultColumnProps(columns ?? []).map((c) => cleanCol(c as ColumnProps))"
578
614
  :data-source="tableData"
579
615
  :loading="loading.table"
580
616
  :pagination="pg"
@@ -597,7 +633,7 @@
597
633
  v-if="slotDefaultColumns.some((s) => column.key && s.field === column.key)"
598
634
  :key="renderTableKey + '_cell_' + dataSeed + '_slot_' + column.key"
599
635
  :column="slotDefaultColumns.find((f) => column.key && f.field === column.key)!"
600
- :default-handler="{ pick: pickRow }"
636
+ :default-handler="{ pick: pickRow, setLoadings }"
601
637
  :row="record"
602
638
  :row-index="index"
603
639
  :table-data="tableData as Recordable[]"
@@ -78,6 +78,7 @@
78
78
  rejectPromise = reject;
79
79
  visible.modal = true;
80
80
  }),
81
+ grid: gridEl,
81
82
  });
82
83
  </script>
83
84
  <template>
@@ -220,121 +220,213 @@ const renderBtn = (btnOpt: BtnOptions, params: RenderTableParams) =>
220
220
  );
221
221
  const renders = {
222
222
  ...Object.fromEntries(Object.keys(componentsMap).map((name) => [name, renderBasic(name)])),
223
- //简单按钮
223
+ // 简单按钮
224
224
  $button: {
225
- renderItemContent(
226
- { props = {}, events = {} }: RenderOptions,
227
- { data, field }: RenderFormParams,
228
- defaultHandler: {
229
- [key: string]: (...args: any[]) => any;
230
- },
231
- ) {
225
+ renderItemContent({ props = {}, events = {} }: RenderOptions, {
226
+ data,
227
+ field,
228
+ }: RenderFormParams, defaultHandler: {
229
+ [key: string]: (...args: any[]) => any
230
+ }) {
232
231
  return (
233
232
  <Button
234
233
  {...omit(props, ['content'])}
235
234
  icon={props.icon ? <Icon icon={props.icon} /> : null}
236
235
  onClick={() => {
237
- events.click?.({ data, field });
236
+ events.click?.({ data, field })
238
237
  if (props.htmlType === 'reset' && defaultHandler?.reset) {
239
- defaultHandler.reset({ data, field });
238
+ if (props.beforeClick && isFunction(props.beforeClick)) {
239
+ props.beforeClick({ data, field }).then(() => {
240
+ defaultHandler.reset({ data, field })
241
+ })
242
+ }
243
+ else {
244
+ defaultHandler.reset({ data, field })
245
+ }
240
246
  }
241
247
  }}
242
248
  >
243
249
  {props.content}
250
+ {
251
+ props.suffix?.({ data, field }) ?? null
252
+ }
244
253
  </Button>
245
- );
254
+ )
246
255
  },
247
- renderDefault(
248
- { props = {}, events = {} }: RenderOptions,
249
- { row, field }: RenderTableParams,
250
- defaultHandler: {
251
- [key: string]: (...args: any[]) => any;
252
- },
253
- ) {
256
+ renderDefault({ props = {}, events = {} }: RenderOptions, {
257
+ row,
258
+ field,
259
+ }: RenderTableParams, defaultHandler: {
260
+ [key: string]: (...args: any[]) => any
261
+ }) {
254
262
  return (
255
263
  <Button
256
264
  {...omit(props, ['content'])}
257
265
  icon={props.icon ? <Icon icon={props.icon} /> : null}
258
266
  onClick={() => {
259
- events.click?.({ row, field });
267
+ events.click?.({ row, field })
260
268
  if (props.htmlType === 'reset' && defaultHandler?.reset) {
261
- defaultHandler.reset({ row, field });
269
+ if (props.beforeClick && isFunction(props.beforeClick)) {
270
+ defaultHandler?.setLoadings?.(true)
271
+ props.beforeClick({ row, field }).then(() => {
272
+ defaultHandler.reset({ row, field })
273
+ }).finally(() => {
274
+ defaultHandler?.setLoadings?.(false)
275
+ })
276
+ }
277
+ else {
278
+ defaultHandler.reset({ row, field })
279
+ }
262
280
  }
263
281
  if (props.htmlType === 'pick' && defaultHandler?.pick) {
264
- defaultHandler.pick({ row, field });
282
+ if (props.beforeClick && isFunction(props.beforeClick)) {
283
+ defaultHandler?.setLoadings?.(true)
284
+ props.beforeClick({ row, field }).then(() => {
285
+ defaultHandler.pick({ row, field })
286
+ }).finally(() => {
287
+ defaultHandler?.setLoadings?.(false)
288
+ })
289
+ }
290
+ else {
291
+ defaultHandler.pick({ row, field })
292
+ }
265
293
  }
266
294
  }}
267
295
  >
268
296
  {props.content}
269
297
  </Button>
270
- );
298
+ )
271
299
  },
272
300
  },
273
301
  // 简单按钮组
274
302
  $buttons: {
275
- renderItemContent(
276
- { props = {}, children = [] }: RenderOptions,
277
- { data, field }: RenderFormParams,
278
- defaultHandler: {
279
- [key: string]: (...args: any[]) => any;
280
- },
281
- ) {
303
+ renderItemContent({ props = {}, children = [] }: RenderOptions, {
304
+ data,
305
+ field,
306
+ }: RenderFormParams, defaultHandler: {
307
+ [key: string]: (...args: any[]) => any
308
+ }) {
282
309
  return (
283
310
  <span class="align-gap-box w-fit">
284
- {children.map((m) => (
285
- <Button
286
- {...omit(Object.assign(props, m.props), ['content'])}
287
- icon={m.props.icon ? <Icon icon={m.props.icon} /> : null}
288
- onClick={() => {
289
- m.events?.click?.({ data, field });
290
- if (m.props.htmlType === 'reset' && defaultHandler?.reset) {
291
- defaultHandler.reset({ data, field });
292
- }
293
- }}
294
- >
295
- {m.props.content}
296
- </Button>
297
- ))}
311
+ {
312
+ children.map((m) => {
313
+ return (
314
+ <Button
315
+ {...omit(Object.assign({}, props, m.props), ['content'])}
316
+ icon={m.props.icon ? <Icon icon={m.props.icon} /> : null}
317
+ onClick={() => {
318
+ m.events?.click?.({ data, field })
319
+ if (m.props.htmlType === 'reset' && defaultHandler?.reset) {
320
+ if (props.beforeClick && isFunction(props.beforeClick)) {
321
+ props.beforeClick({ data, field }).then(() => {
322
+ defaultHandler.reset({ data, field })
323
+ })
324
+ }
325
+ else {
326
+ defaultHandler.reset({ data, field })
327
+ }
328
+ }
329
+ if (m.props.htmlType === 'pick' && defaultHandler?.pick) {
330
+ if (props.beforeClick && isFunction(props.beforeClick)) {
331
+ props.beforeClick({ data, field }).then(() => {
332
+ defaultHandler.pick({ data, field })
333
+ })
334
+ }
335
+ else {
336
+ defaultHandler.pick({ data, field })
337
+ }
338
+ }
339
+ }}
340
+ >
341
+ {m.props.content}
342
+ </Button>
343
+ )
344
+ })
345
+ }
298
346
  </span>
299
- );
347
+ )
300
348
  },
301
- renderDefault(
302
- { props = {}, children = [] }: RenderOptions,
303
- { data, row, field }: RenderTableParams,
304
- ) {
349
+ renderDefault({ props = {}, children = [] }: RenderOptions, {
350
+ data,
351
+ row,
352
+ field,
353
+ }: RenderTableParams, defaultHandler: {
354
+ [key: string]: (...args: any[]) => any
355
+ }) {
305
356
  return (
306
357
  <span class="align-gap-box w-fit">
307
- {children.map((m) => (
308
- <Button
309
- {...omit(Object.assign(props, m.props), ['content'])}
310
- icon={m.props.icon ? <Icon icon={m.props.icon} /> : null}
311
- onClick={() => {
312
- m.events?.click?.({ data, row, field });
313
- }}
314
- >
315
- {m.props.content}
316
- </Button>
317
- ))}
358
+ {
359
+ children.filter(f => !f?.props?.hiddenIf?.({
360
+ data,
361
+ row,
362
+ field,
363
+ })).map(m => (
364
+ <Button
365
+ {...omit(Object.assign({}, props, m.props), ['content', 'hiddenIf'])}
366
+ icon={m.props.icon ? <Icon icon={m.props.icon} /> : null}
367
+ onClick={() => {
368
+ m.events?.click?.({ data, row, field })
369
+ if (m.props.htmlType === 'reset' && defaultHandler?.reset) {
370
+ if (props.beforeClick && isFunction(props.beforeClick)) {
371
+ defaultHandler?.setLoadings?.(true)
372
+ props.beforeClick({ row, field }).then(() => {
373
+ defaultHandler.reset({ row, field })
374
+ }).finally(() => {
375
+ defaultHandler?.setLoadings?.(false)
376
+ })
377
+ }
378
+ else {
379
+ defaultHandler.reset({ row, field })
380
+ }
381
+ }
382
+ if (m.props.htmlType === 'pick' && defaultHandler?.pick) {
383
+ if (props.beforeClick && isFunction(props.beforeClick)) {
384
+ defaultHandler?.setLoadings?.(true)
385
+ props.beforeClick({ row, field }).then(() => {
386
+ defaultHandler.pick({ row, field })
387
+ }).finally(() => {
388
+ defaultHandler?.setLoadings?.(false)
389
+ })
390
+ }
391
+ else {
392
+ defaultHandler.pick({ row, field })
393
+ }
394
+ }
395
+ }}
396
+ >
397
+ {m.props.content}
398
+ </Button>
399
+ ))
400
+ }
318
401
  </span>
319
- );
402
+ )
320
403
  },
321
404
  },
322
405
  ButtonTree: {
323
406
  renderDefault({ children = [], props = {} as Recordable }, params: RenderTableParams) {
324
407
  return (
325
408
  <span class={props.noGap ? 'align-no-gap-box' : 'align-gap-box'}>
326
- {(children as BtnOptions[]).map((item) => renderBtn(item, params)) ?? []}
409
+ {(children as BtnOptions[])
410
+ .filter((f) => !f.hiddenIf?.(params))
411
+ .map((item) => renderBtn(item, params)) ?? []}
327
412
  </span>
328
413
  );
329
414
  },
330
415
  },
331
416
  $radio: {
332
- renderItemContent({ props = {}, options }: RenderOptions, { data, field }: RenderFormParams) {
417
+ renderItemContent(
418
+ { props = {}, events = {}, options }: RenderOptions,
419
+ { data, field }: RenderFormParams,
420
+ ) {
333
421
  return valued(field) ? (
334
422
  <RadioGroup
335
423
  v-model:value={data[field!]}
336
424
  {...props}
337
425
  options={props.options ?? options ?? []}
426
+ disabled={!!props.disabled}
427
+ onChange={(...arg) => {
428
+ events.change?.({ data, field }, ...arg);
429
+ }}
338
430
  />
339
431
  ) : null;
340
432
  },
@@ -356,7 +448,7 @@ const renders = {
356
448
  return valued(field) ? (
357
449
  <AutoComplete
358
450
  v-model:value={data[field!]}
359
- {...props}
451
+ {...Object.assign({}, { filterOption: defaultProps.autoComplete.filterOption }, props)}
360
452
  onChange={(...arg) => {
361
453
  events.change?.({ data, field }, ...arg);
362
454
  }}
@@ -24,6 +24,12 @@
24
24
  padding-left: 2px;
25
25
  padding-right: 2px;
26
26
  }
27
+ .pl-4x {
28
+ padding-left: 1em;
29
+ }
30
+ .pl-8 {
31
+ padding-left: 2em;
32
+ }
27
33
 
28
34
  .h-0 {
29
35
  height: 0;