@vue-ui-kit/ant 1.7.1 → 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.1",
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>();
@@ -397,15 +408,12 @@
397
408
  ? window.getComputedStyle(pFormWrapper.value).height
398
409
  : '0px';
399
410
  const formHeight = formOriginHeight.includes('px')
400
- ? toNumber(window.getComputedStyle(pFormWrapper.value).height.replace('px', ''))
411
+ ? toNumber(formOriginHeight.replace('px', ''))
401
412
  : 0;
402
-
413
+ const showCountHeight = selectConfig.value?.showCount ? 22 : 0
403
414
  renderHeight.value =
404
415
  props.renderY ??
405
- toNumber(ph.replace('px', '')) -
406
- (props.fitHeight ?? 170) -
407
- (!!props.toolbarConfig ? 30 : 0) -
408
- formHeight;
416
+ toNumber(ph.replace('px', '')) -(props.fitHeight ?? 170) -(!!props.toolbarConfig ? 30 : 0) -formHeight- showCountHeight;
409
417
  enoughSpacing.value = toNumber(ph.replace('px', '')) > 600;
410
418
  };
411
419
  defineExpose({
@@ -420,11 +428,7 @@
420
428
  setBtnLoading,
421
429
  selectedRecords,
422
430
  $form: computed(() => formEl.value),
423
- setLoadings: (value: boolean) => {
424
- loading.form = value;
425
- loading.table = value;
426
- loading.toolbar = value;
427
- },
431
+ setLoadings,
428
432
  resizeTable,
429
433
  });
430
434
 
@@ -439,7 +443,7 @@
439
443
  const el = mutation.target as HTMLElement;
440
444
  const style = window.getComputedStyle(el);
441
445
  if (style.display !== 'none') {
442
- handlePageResize();
446
+ resizeTable();
443
447
  }
444
448
  }
445
449
  });
@@ -450,6 +454,13 @@
450
454
  }
451
455
  resetQueryFormData(props.manualFetch);
452
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
+ }))
453
464
  onBeforeUnmount(() => {
454
465
  window.removeEventListener('resize', resizeTable);
455
466
  observer.disconnect();
@@ -592,11 +603,14 @@
592
603
  </span>
593
604
  </div>
594
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>
595
609
  <a-table
596
610
  :key="renderTableKey + '_table'"
597
611
  :row-key="rowKey ?? 'id'"
598
612
  ref="tableEl"
599
- :columns="(columns ?? []).map((c) => cleanCol(c as Recordable))"
613
+ :columns="passDefaultColumnProps(columns ?? []).map((c) => cleanCol(c as ColumnProps))"
600
614
  :data-source="tableData"
601
615
  :loading="loading.table"
602
616
  :pagination="pg"
@@ -619,7 +633,7 @@
619
633
  v-if="slotDefaultColumns.some((s) => column.key && s.field === column.key)"
620
634
  :key="renderTableKey + '_cell_' + dataSeed + '_slot_' + column.key"
621
635
  :column="slotDefaultColumns.find((f) => column.key && f.field === column.key)!"
622
- :default-handler="{ pick: pickRow }"
636
+ :default-handler="{ pick: pickRow, setLoadings }"
623
637
  :row="record"
624
638
  :row-index="index"
625
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;