@v-c/table 1.2.0 → 1.2.1

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.
package/dist/Table.js CHANGED
@@ -86,7 +86,7 @@ var ImmutableTable = /* @__PURE__ */ defineComponent((props, { attrs, slots, exp
86
86
  });
87
87
  const customizeScrollBody = computed(() => getComponent(["body"]));
88
88
  const [startRow, endRow, onHover] = useHover();
89
- const [expandableConfig, expandableType, mergedExpandedKeys, mergedExpandIcon, mergedChildrenColumnName, onTriggerExpand] = useExpand(props, mergedData, getRowKey);
89
+ const [expandableConfig, expandableType, mergedExpandedKeys, mergedExpandIcon, mergedChildrenColumnName, onTriggerExpand, expandAllInfo] = useExpand(props, mergedData, getRowKey);
90
90
  const componentWidth = ref(0);
91
91
  const slotChildren = shallowRef(null);
92
92
  const [columns, flattenColumns, flattenScrollX] = useColumns({
@@ -99,6 +99,8 @@ var ImmutableTable = /* @__PURE__ */ defineComponent((props, { attrs, slots, exp
99
99
  getRowKey,
100
100
  onTriggerExpand,
101
101
  expandIcon: mergedExpandIcon,
102
+ ExpandIcon: computed(() => props.components?.ExpandIcon),
103
+ expandAllInfo,
102
104
  rowExpandable: computed(() => expandableConfig.value.rowExpandable),
103
105
  expandIconColumnIndex: computed(() => expandableConfig.value.expandIconColumnIndex),
104
106
  expandedRowOffset: expandableConfig.value.expandedRowOffset,
@@ -1,5 +1,5 @@
1
1
  import { Ref } from 'vue';
2
- import { ColumnsType, ColumnType, Direction, FixedType, GetRowKey, Key, RenderExpandIcon, TriggerEventHandler } from '../../interface';
2
+ import { ColumnsType, ColumnType, Direction, ExpandColumnTitle, ExpandIconComponent, ExpandIconProps, FixedType, GetRowKey, Key, RenderExpandIcon, TriggerEventHandler } from '../../interface';
3
3
  export declare function convertChildrenToColumns<RecordType>(children: any): ColumnsType<RecordType>;
4
4
  export default function useColumns<RecordType>(options: {
5
5
  prefixCls?: Ref<string> | string;
@@ -7,10 +7,12 @@ export default function useColumns<RecordType>(options: {
7
7
  children?: any;
8
8
  expandable: Ref<boolean> | boolean;
9
9
  expandedKeys: Ref<Set<Key>> | Set<Key>;
10
- columnTitle?: Ref<any> | any;
10
+ columnTitle?: Ref<ExpandColumnTitle | undefined> | ExpandColumnTitle;
11
11
  getRowKey: Ref<GetRowKey<RecordType>> | GetRowKey<RecordType>;
12
12
  onTriggerExpand: TriggerEventHandler<RecordType>;
13
13
  expandIcon?: Ref<RenderExpandIcon<RecordType> | undefined> | RenderExpandIcon<RecordType>;
14
+ ExpandIcon?: Ref<ExpandIconComponent<RecordType> | undefined> | ExpandIconComponent<RecordType>;
15
+ expandAllInfo?: Ref<Pick<ExpandIconProps<RecordType>, 'expanded' | 'expandable' | 'onClick'> | undefined>;
14
16
  rowExpandable?: Ref<((record: RecordType) => boolean) | undefined> | ((record: RecordType) => boolean) | undefined;
15
17
  expandIconColumnIndex?: Ref<number | undefined> | number;
16
18
  expandedRowOffset?: number;
@@ -1,7 +1,8 @@
1
1
  import { INTERNAL_COL_DEFINE } from "../../utils/legacyUtil.js";
2
+ import { DefaultExpandIcon } from "../../utils/expandUtil.js";
2
3
  import { EXPAND_COLUMN } from "../../constant.js";
3
4
  import useWidthColumns from "./useWidthColumns.js";
4
- import { computed, createVNode, isVNode, toRaw, unref } from "vue";
5
+ import { computed, createVNode, h, isVNode, toRaw, unref } from "vue";
5
6
  import { warning } from "@v-c/util";
6
7
  import { flattenChildren } from "@v-c/util/dist/props-util";
7
8
  //#region src/hooks/useColumns/index.tsx
@@ -75,12 +76,21 @@ function useColumns(options, transformColumns) {
75
76
  if (fixed) fixedColumn = fixed;
76
77
  else fixedColumn = prevColumn?.fixed;
77
78
  const prefixCls = unref(options.prefixCls) || "";
79
+ const MergedExpandIcon = unref(options.ExpandIcon) || DefaultExpandIcon;
80
+ const expandAllInfo = unref(options.expandAllInfo);
81
+ const expandAllNode = expandAllInfo ? h(MergedExpandIcon, {
82
+ type: "all",
83
+ prefixCls,
84
+ ...expandAllInfo
85
+ }) : void 0;
86
+ const columnTitle = unref(options.columnTitle);
87
+ const mergedColumnTitle = typeof columnTitle === "function" ? columnTitle({ expandIcon: expandAllNode }) : columnTitle ?? expandAllNode;
78
88
  const expandColumn = {
79
89
  [INTERNAL_COL_DEFINE]: {
80
90
  className: `${prefixCls}-expand-icon-col`,
81
91
  columnType: "EXPAND_COLUMN"
82
92
  },
83
- title: unref(options.columnTitle),
93
+ title: mergedColumnTitle,
84
94
  fixed: fixedColumn,
85
95
  className: `${prefixCls}-row-expand-icon-cell`,
86
96
  width: unref(options.columnWidth),
@@ -1,11 +1,14 @@
1
1
  import { Ref } from 'vue';
2
- import { ExpandableConfig, ExpandableType, GetRowKey, Key, RenderExpandIcon, TriggerEventHandler } from '../interface';
2
+ import { ExpandableConfig, ExpandableType, ExpandIconProps, GetRowKey, Key, RenderExpandIcon, TriggerEventHandler } from '../interface';
3
3
  import { TableProps } from '../Table';
4
+ type ExpandAllInfo<RecordType> = Pick<ExpandIconProps<RecordType>, 'expanded' | 'expandable' | 'onClick'>;
4
5
  export default function useExpand<RecordType>(props: TableProps<RecordType>, mergedData: Ref<readonly RecordType[]> | readonly RecordType[], getRowKey: Ref<GetRowKey<RecordType>> | GetRowKey<RecordType>): [
5
6
  expandableConfig: Ref<ExpandableConfig<RecordType>>,
6
7
  expandableType: Ref<ExpandableType>,
7
8
  expandedKeys: Ref<Set<Key>>,
8
9
  expandIcon: Ref<RenderExpandIcon<RecordType>>,
9
10
  childrenColumnName: Ref<string>,
10
- onTriggerExpand: TriggerEventHandler<RecordType>
11
+ onTriggerExpand: TriggerEventHandler<RecordType>,
12
+ expandAllInfo: Ref<ExpandAllInfo<RecordType> | undefined>
11
13
  ];
14
+ export {};
@@ -1,12 +1,16 @@
1
1
  import { getExpandableProps } from "../utils/legacyUtil.js";
2
- import { findAllChildrenKeys, renderExpandIcon } from "../utils/expandUtil.js";
2
+ import { findAllChildrenKeys, renderExpandIcon, renderRowExpandIcon } from "../utils/expandUtil.js";
3
3
  import "../constant.js";
4
4
  import { computed, ref, unref } from "vue";
5
5
  import { warning } from "@v-c/util";
6
6
  //#region src/hooks/useExpand.ts
7
7
  function useExpand(props, mergedData, getRowKey) {
8
8
  const expandableConfig = computed(() => getExpandableProps(props));
9
- const mergedExpandIcon = computed(() => expandableConfig.value.expandIcon || renderExpandIcon);
9
+ const mergedExpandIcon = computed(() => {
10
+ const customizeExpandIcon = props.components?.ExpandIcon;
11
+ if (customizeExpandIcon) return (iconProps) => renderRowExpandIcon(customizeExpandIcon, iconProps);
12
+ return expandableConfig.value.expandIcon || renderExpandIcon;
13
+ });
10
14
  const mergedChildrenColumnName = computed(() => expandableConfig.value.childrenColumnName || "children");
11
15
  const expandableType = computed(() => {
12
16
  if (expandableConfig.value.expandedRowRender) return "row";
@@ -37,6 +41,38 @@ function useExpand(props, mergedData, getRowKey) {
37
41
  props["onUpdate:expandedRowKeys"]?.(Array.from(newExpandedKeys));
38
42
  event?.stopPropagation?.();
39
43
  };
44
+ const expandableRows = computed(() => {
45
+ if (!expandableConfig.value.showExpandAll || expandableType.value !== "row") return [];
46
+ const rowExpandable = expandableConfig.value.rowExpandable;
47
+ return (unref(mergedData) || []).reduce((rows, record, index) => {
48
+ if (!rowExpandable || rowExpandable(record)) rows.push({
49
+ key: unref(getRowKey)(record, index),
50
+ record
51
+ });
52
+ return rows;
53
+ }, []);
54
+ });
55
+ const allExpanded = computed(() => expandableRows.value.length > 0 && expandableRows.value.every(({ key }) => mergedExpandedKeys.value.has(key)));
56
+ const onTriggerExpandAll = (event) => {
57
+ event.stopPropagation();
58
+ if (!expandableRows.value.length) return;
59
+ const nextExpanded = !allExpanded.value;
60
+ const nextExpandedKeys = new Set(mergedExpandedKeys.value);
61
+ expandableRows.value.forEach(({ key }) => {
62
+ if (nextExpanded) nextExpandedKeys.add(key);
63
+ else nextExpandedKeys.delete(key);
64
+ });
65
+ const keys = [...nextExpandedKeys];
66
+ innerExpandedKeys.value = keys;
67
+ expandableConfig.value.onExpandAll?.(nextExpanded);
68
+ expandableConfig.value.onExpandedRowsChange?.(keys);
69
+ props["onUpdate:expandedRowKeys"]?.(keys);
70
+ };
71
+ const expandAllInfo = computed(() => expandableConfig.value.showExpandAll && expandableType.value === "row" ? {
72
+ expanded: allExpanded.value,
73
+ expandable: expandableRows.value.length > 0,
74
+ onClick: onTriggerExpandAll
75
+ } : void 0);
40
76
  if (process.env.NODE_ENV !== "production" && expandableConfig.value.expandedRowRender && (unref(mergedData) || []).some((record) => {
41
77
  return Array.isArray(record?.[mergedChildrenColumnName.value]);
42
78
  })) warning(false, "`expandedRowRender` should not use with nested Table");
@@ -46,7 +82,8 @@ function useExpand(props, mergedData, getRowKey) {
46
82
  mergedExpandedKeys,
47
83
  mergedExpandIcon,
48
84
  mergedChildrenColumnName,
49
- onTriggerExpand
85
+ onTriggerExpand,
86
+ expandAllInfo
50
87
  ];
51
88
  }
52
89
  //#endregion
@@ -1,3 +1,3 @@
1
1
  import { Ref } from 'vue';
2
2
  import { ColumnType, StickyOffsets } from '../interface';
3
- export default function useFixedInfo<RecordType>(flattenColumns: Ref<readonly ColumnType<RecordType>[]> | readonly ColumnType<RecordType>[], stickyOffsets: Ref<StickyOffsets> | StickyOffsets): any;
3
+ export default function useFixedInfo<RecordType>(flattenColumns: Ref<readonly ColumnType<RecordType>[]> | readonly ColumnType<RecordType>[], stickyOffsets: Ref<StickyOffsets> | StickyOffsets): Ref<import('../utils/fixUtil').FixedInfo[], import('../utils/fixUtil').FixedInfo[]>;
@@ -8,7 +8,7 @@ export default function useRowInfo<RecordType>(record: Ref<RecordType> | RecordT
8
8
  rowSupportExpand: import('vue').ComputedRef<boolean>;
9
9
  expandable: import('vue').ComputedRef<boolean>;
10
10
  rowProps: import('vue').ComputedRef<{
11
- className: any;
11
+ className: string;
12
12
  onClick: (event: MouseEvent) => void;
13
13
  innerHTML?: string | undefined | undefined;
14
14
  class?: import('vue').ClassValue;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ColumnsType, ColumnType, DataIndex, ExpandableConfig, FixedType, GetComponentProps, GetRowKey, Reference, RenderedCell } from './interface';
1
+ import { ColumnsType, ColumnType, DataIndex, ExpandableConfig, ExpandIconComponent, ExpandIconProps, FixedType, GetComponentProps, GetRowKey, Reference, RenderedCell } from './interface';
2
2
  import { TableProps, default as Table } from './Table';
3
3
  import { VirtualTableProps, default as VirtualTable } from './VirtualTable';
4
4
  import { EXPAND_COLUMN, INTERNAL_HOOKS } from './constant';
@@ -6,6 +6,6 @@ import { FooterComponents as Summary, SummaryCell, SummaryRow } from './Footer';
6
6
  import { default as Column } from './sugar/Column';
7
7
  import { default as ColumnGroup } from './sugar/ColumnGroup';
8
8
  import { INTERNAL_COL_DEFINE } from './utils/legacyUtil';
9
- export type { DataIndex, ExpandableConfig, FixedType, GetComponentProps, GetRowKey, RenderedCell, };
9
+ export type { DataIndex, ExpandableConfig, ExpandIconComponent, ExpandIconProps, FixedType, GetComponentProps, GetRowKey, RenderedCell, };
10
10
  export { Column, ColumnGroup, type ColumnsType, type ColumnType, EXPAND_COLUMN, INTERNAL_COL_DEFINE, INTERNAL_HOOKS, type Reference, Summary, SummaryCell, SummaryRow, type TableProps, VirtualTable, type VirtualTableProps, };
11
11
  export default Table;
@@ -1,5 +1,5 @@
1
1
  import { VueNode } from '@v-c/util';
2
- import { CSSProperties, HTMLAttributes, Ref, TdHTMLAttributes } from 'vue';
2
+ import { CSSProperties, HTMLAttributes, Ref, TdHTMLAttributes, Component as VueComponent } from 'vue';
3
3
  import { DeepNamePath } from './namePathType';
4
4
  export type Key = string | number;
5
5
  /**
@@ -118,6 +118,7 @@ export type CustomizeScrollBody<RecordType = Record<string, any>> = (data: reado
118
118
  onScroll: OnCustomizeScroll;
119
119
  }) => any;
120
120
  export interface TableComponents<RecordType> {
121
+ ExpandIcon?: ExpandIconComponent<RecordType>;
121
122
  table?: CustomizeComponent;
122
123
  header?: {
123
124
  table?: CustomizeComponent;
@@ -169,21 +170,41 @@ export interface RenderExpandIconProps<RecordType> {
169
170
  onExpand: TriggerEventHandler<RecordType>;
170
171
  }
171
172
  export type RenderExpandIcon<RecordType> = (props: RenderExpandIconProps<RecordType>) => any;
173
+ export type ExpandIconProps<RecordType> = {
174
+ prefixCls: string;
175
+ expanded: boolean;
176
+ expandable: boolean;
177
+ onClick: (event: MouseEvent) => void;
178
+ } & ({
179
+ type: 'row';
180
+ record: RecordType;
181
+ } | {
182
+ type: 'all';
183
+ record?: never;
184
+ });
185
+ export type ExpandIconComponent<RecordType> = VueComponent<ExpandIconProps<RecordType>>;
186
+ export interface ExpandColumnTitleProps {
187
+ expandIcon: VueNode;
188
+ }
189
+ export type ExpandColumnTitle = VueNode | ((props: ExpandColumnTitleProps) => VueNode);
172
190
  export interface ExpandableConfig<RecordType> {
173
191
  expandedRowKeys?: readonly Key[];
174
192
  defaultExpandedRowKeys?: readonly Key[];
175
193
  expandedRowRender?: ExpandedRowRender<RecordType>;
176
194
  forceRender?: boolean;
177
- columnTitle?: VueNode;
195
+ columnTitle?: ExpandColumnTitle;
178
196
  expandRowByClick?: boolean;
197
+ /** @deprecated Please use `components.ExpandIcon` instead. This only customizes row icons. */
179
198
  expandIcon?: RenderExpandIcon<RecordType>;
180
199
  onExpand?: (expanded: boolean, record: RecordType) => void;
200
+ onExpandAll?: (expanded: boolean) => void;
181
201
  onExpandedRowsChange?: (expandedKeys: readonly Key[]) => void;
182
202
  defaultExpandAllRows?: boolean;
183
203
  indentSize?: number;
184
204
  /** @deprecated Please use `EXPAND_COLUMN` in `columns` directly */
185
205
  expandIconColumnIndex?: number;
186
206
  showExpandColumn?: boolean;
207
+ showExpandAll?: boolean;
187
208
  expandedRowClassName?: string | RowClassName<RecordType>;
188
209
  childrenColumnName?: string;
189
210
  rowExpandable?: (record: RecordType) => boolean;
@@ -52,6 +52,15 @@ var Column = /* @__PURE__ */ defineComponent(() => {
52
52
  default: void 0
53
53
  },
54
54
  title: {
55
+ type: [
56
+ Object,
57
+ Function,
58
+ String,
59
+ Number,
60
+ null,
61
+ Boolean,
62
+ Array
63
+ ],
55
64
  required: false,
56
65
  default: void 0
57
66
  },
@@ -52,6 +52,15 @@ var ColumnGroup = /* @__PURE__ */ defineComponent(() => {
52
52
  default: void 0
53
53
  },
54
54
  title: {
55
+ type: [
56
+ Object,
57
+ Function,
58
+ String,
59
+ Number,
60
+ null,
61
+ Boolean,
62
+ Array
63
+ ],
55
64
  required: false,
56
65
  default: void 0
57
66
  },
@@ -1,4 +1,8 @@
1
- import { ExpandableConfig, GetRowKey, Key, RenderExpandIconProps } from '../interface';
1
+ import { ExpandableConfig, ExpandIconComponent, ExpandIconProps, GetRowKey, Key, RenderExpandIconProps } from '../interface';
2
+ export declare function DefaultExpandIcon<RecordType>({ prefixCls, type, onClick, expanded, expandable, }: ExpandIconProps<RecordType>): import("vue/jsx-runtime").JSX.Element;
2
3
  export declare function renderExpandIcon<RecordType>({ prefixCls, record, onExpand, expanded, expandable, }: RenderExpandIconProps<RecordType>): import("vue/jsx-runtime").JSX.Element;
4
+ export declare function renderRowExpandIcon<RecordType>(ExpandIcon: ExpandIconComponent<RecordType>, props: RenderExpandIconProps<RecordType>): import('vue').VNode<import('vue').RendererNode, import('vue').RendererElement, {
5
+ [key: string]: any;
6
+ }>;
3
7
  export declare function findAllChildrenKeys<RecordType>(data: readonly RecordType[], getRowKey: GetRowKey<RecordType>, childrenColumnName: string): Key[];
4
8
  export declare function computedExpandedClassName<RecordType>(cls: ExpandableConfig<RecordType>['expandedRowClassName'], record: RecordType, index: number, indent: number): string;
@@ -1,21 +1,54 @@
1
- import { createVNode } from "vue";
1
+ import { createVNode, h } from "vue";
2
2
  import { clsx } from "@v-c/util";
3
3
  //#region src/utils/expandUtil.tsx
4
- function renderExpandIcon({ prefixCls, record, onExpand, expanded, expandable }) {
4
+ function DefaultExpandIcon({ prefixCls, type, onClick, expanded, expandable }) {
5
5
  const expandClassName = `${prefixCls}-row-expand-icon`;
6
6
  if (!expandable) return createVNode("span", { "class": clsx(expandClassName, `${prefixCls}-row-spaced`) }, null);
7
+ const className = clsx(expandClassName, {
8
+ [`${prefixCls}-row-expanded`]: expanded,
9
+ [`${prefixCls}-row-collapsed`]: !expanded
10
+ });
11
+ if (type === "all") return createVNode("button", {
12
+ "type": "button",
13
+ "aria-expanded": expanded,
14
+ "aria-label": expanded ? "Collapse all rows" : "Expand all rows",
15
+ "class": className,
16
+ "onClick": onClick
17
+ }, null);
18
+ return createVNode("span", {
19
+ "class": className,
20
+ "onClick": onClick
21
+ }, null);
22
+ }
23
+ function renderExpandIcon({ prefixCls, record, onExpand, expanded, expandable }) {
7
24
  const onClick = (event) => {
8
25
  onExpand(record, event);
9
26
  event.stopPropagation();
10
27
  };
11
- return createVNode("span", {
12
- "class": clsx(expandClassName, {
13
- [`${prefixCls}-row-expanded`]: expanded,
14
- [`${prefixCls}-row-collapsed`]: !expanded
15
- }),
28
+ return createVNode(DefaultExpandIcon, {
29
+ "type": "row",
30
+ "prefixCls": prefixCls,
31
+ "record": record,
32
+ "expanded": expanded,
33
+ "expandable": !!expandable,
16
34
  "onClick": onClick
17
35
  }, null);
18
36
  }
37
+ function renderRowExpandIcon(ExpandIcon, props) {
38
+ const { prefixCls, record, onExpand, expanded, expandable } = props;
39
+ const onClick = (event) => {
40
+ onExpand(record, event);
41
+ event.stopPropagation();
42
+ };
43
+ return h(ExpandIcon, {
44
+ type: "row",
45
+ prefixCls,
46
+ record,
47
+ expanded,
48
+ expandable: !!expandable,
49
+ onClick
50
+ });
51
+ }
19
52
  function findAllChildrenKeys(data, getRowKey, childrenColumnName) {
20
53
  const keys = [];
21
54
  function dig(list) {
@@ -33,4 +66,4 @@ function computedExpandedClassName(cls, record, index, indent) {
33
66
  return "";
34
67
  }
35
68
  //#endregion
36
- export { computedExpandedClassName, findAllChildrenKeys, renderExpandIcon };
69
+ export { DefaultExpandIcon, computedExpandedClassName, findAllChildrenKeys, renderExpandIcon, renderRowExpandIcon };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@v-c/table",
3
3
  "type": "module",
4
- "version": "1.2.0",
4
+ "version": "1.2.1",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/antdv-next/vue-components/tree/next/packages/table",
7
7
  "repository": {
@@ -27,8 +27,8 @@
27
27
  },
28
28
  "dependencies": {
29
29
  "@v-c/resize-observer": "^1.1.3",
30
- "@v-c/virtual-list": "^1.1.1",
31
- "@v-c/util": "^1.1.0"
30
+ "@v-c/util": "^1.1.0",
31
+ "@v-c/virtual-list": "^1.1.1"
32
32
  },
33
33
  "publishConfig": {
34
34
  "access": "public"