@lobehub/ui 5.60.0 → 5.61.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 (81) hide show
  1. package/es/EmojiPicker/AvatarUploader.mjs +1 -1
  2. package/es/Form/components/FormSubmitFooter.mjs +1 -1
  3. package/es/base-ui/Input/style.d.mts +1 -1
  4. package/es/base-ui/Pagination/Pagination.mjs +158 -41
  5. package/es/base-ui/Pagination/Pagination.mjs.map +1 -1
  6. package/es/base-ui/Pagination/helpers.mjs +3 -3
  7. package/es/base-ui/Pagination/helpers.mjs.map +1 -1
  8. package/es/base-ui/Pagination/index.d.mts +2 -2
  9. package/es/base-ui/Pagination/style.mjs +39 -0
  10. package/es/base-ui/Pagination/style.mjs.map +1 -1
  11. package/es/base-ui/Pagination/type.d.mts +42 -4
  12. package/es/base-ui/QRCode/QRCode.mjs +1 -1
  13. package/es/base-ui/Table/Column.d.mts +9 -0
  14. package/es/base-ui/Table/Column.mjs +7 -0
  15. package/es/base-ui/Table/Column.mjs.map +1 -0
  16. package/es/base-ui/Table/ColumnGroup.d.mts +12 -0
  17. package/es/base-ui/Table/ColumnGroup.mjs +7 -0
  18. package/es/base-ui/Table/ColumnGroup.mjs.map +1 -0
  19. package/es/base-ui/Table/ExpandIcon.mjs +33 -0
  20. package/es/base-ui/Table/ExpandIcon.mjs.map +1 -0
  21. package/es/base-ui/Table/FilterDropdown.mjs +284 -0
  22. package/es/base-ui/Table/FilterDropdown.mjs.map +1 -0
  23. package/es/base-ui/Table/LoadingSkeleton.mjs +83 -0
  24. package/es/base-ui/Table/LoadingSkeleton.mjs.map +1 -0
  25. package/es/base-ui/Table/Table.d.mts +21 -3
  26. package/es/base-ui/Table/Table.mjs +444 -97
  27. package/es/base-ui/Table/Table.mjs.map +1 -1
  28. package/es/base-ui/Table/columnUtils.mjs +56 -0
  29. package/es/base-ui/Table/columnUtils.mjs.map +1 -0
  30. package/es/base-ui/Table/index.d.mts +4 -2
  31. package/es/base-ui/Table/selectionUtils.d.mts +9 -0
  32. package/es/base-ui/Table/selectionUtils.mjs +128 -0
  33. package/es/base-ui/Table/selectionUtils.mjs.map +1 -0
  34. package/es/base-ui/Table/semantic.mjs +55 -0
  35. package/es/base-ui/Table/semantic.mjs.map +1 -0
  36. package/es/base-ui/Table/style.mjs +801 -161
  37. package/es/base-ui/Table/style.mjs.map +1 -1
  38. package/es/base-ui/Table/type.d.mts +471 -37
  39. package/es/base-ui/Table/useBreakpoint.mjs +41 -0
  40. package/es/base-ui/Table/useBreakpoint.mjs.map +1 -0
  41. package/es/base-ui/Table/useFilter.mjs +64 -0
  42. package/es/base-ui/Table/useFilter.mjs.map +1 -0
  43. package/es/base-ui/Table/useSelection.mjs +421 -0
  44. package/es/base-ui/Table/useSelection.mjs.map +1 -0
  45. package/es/base-ui/Table/useSorter.mjs +152 -0
  46. package/es/base-ui/Table/useSorter.mjs.map +1 -0
  47. package/es/base-ui/Table/useTableState.mjs +82 -55
  48. package/es/base-ui/Table/useTableState.mjs.map +1 -1
  49. package/es/base-ui/index.d.mts +6 -4
  50. package/es/base-ui/index.mjs +9 -9
  51. package/es/chat/EditableMessageList/EditableMessageList.mjs +1 -1
  52. package/es/chat/MessageInput/MessageInput.mjs +1 -1
  53. package/es/chat/MessageModal/MessageModal.mjs +1 -1
  54. package/es/chat/TokenTag/TokenTag.mjs +1 -1
  55. package/es/i18n/resources/en/index.d.mts +3 -2
  56. package/es/i18n/resources/en/index.mjs +4 -2
  57. package/es/i18n/resources/en/index.mjs.map +1 -1
  58. package/es/i18n/resources/en/table.d.mts +23 -0
  59. package/es/i18n/resources/en/table.mjs +24 -0
  60. package/es/i18n/resources/en/table.mjs.map +1 -0
  61. package/es/i18n/resources/zhCn/index.d.mts +3 -2
  62. package/es/i18n/resources/zhCn/index.mjs +4 -2
  63. package/es/i18n/resources/zhCn/index.mjs.map +1 -1
  64. package/es/i18n/resources/zhCn/table.d.mts +23 -0
  65. package/es/i18n/resources/zhCn/table.mjs +24 -0
  66. package/es/i18n/resources/zhCn/table.mjs.map +1 -0
  67. package/es/i18n/types.d.mts +2 -1
  68. package/es/index.mjs +2 -2
  69. package/package.json +2 -2
  70. package/es/base-ui/Table/FilterMenu.mjs +0 -45
  71. package/es/base-ui/Table/FilterMenu.mjs.map +0 -1
  72. package/es/base-ui/Table/TableBody.mjs +0 -59
  73. package/es/base-ui/Table/TableBody.mjs.map +0 -1
  74. package/es/base-ui/Table/TableHead.mjs +0 -50
  75. package/es/base-ui/Table/TableHead.mjs.map +0 -1
  76. package/es/base-ui/Table/features.mjs +0 -12
  77. package/es/base-ui/Table/features.mjs.map +0 -1
  78. package/es/base-ui/Table/fixedOffsets.mjs +0 -29
  79. package/es/base-ui/Table/fixedOffsets.mjs.map +0 -1
  80. package/es/base-ui/Table/toColumnDefs.mjs +0 -26
  81. package/es/base-ui/Table/toColumnDefs.mjs.map +0 -1
@@ -0,0 +1,41 @@
1
+ import { useEffect, useState } from "react";
2
+ //#region src/base-ui/Table/useBreakpoint.ts
3
+ /** antd's default Grid breakpoints (`screenSM` … `screenXXXL`). */
4
+ const BREAKPOINT_QUERIES = {
5
+ lg: "(min-width: 992px)",
6
+ md: "(min-width: 768px)",
7
+ sm: "(min-width: 576px)",
8
+ xl: "(min-width: 1200px)",
9
+ xs: "(max-width: 575px)",
10
+ xxl: "(min-width: 1600px)",
11
+ xxxl: "(min-width: 1920px)"
12
+ };
13
+ const POINTS = Object.keys(BREAKPOINT_QUERIES);
14
+ const canMatchMedia = () => typeof window !== "undefined" && typeof window.matchMedia === "function";
15
+ const readScreens = () => canMatchMedia() ? new Set(POINTS.filter((point) => window.matchMedia(BREAKPOINT_QUERIES[point]).matches)) : null;
16
+ /**
17
+ * Active breakpoints, kept in sync with `matchMedia`. Returns `null` when disabled or when media
18
+ * queries are unavailable (SSR), which callers treat as "show everything".
19
+ */
20
+ const useBreakpoint = (enabled) => {
21
+ const [screens, setScreens] = useState(() => enabled ? readScreens() : null);
22
+ useEffect(() => {
23
+ if (!enabled || !canMatchMedia()) {
24
+ setScreens(null);
25
+ return;
26
+ }
27
+ const update = () => {
28
+ const next = readScreens();
29
+ setScreens((previous) => previous?.size === next.size && [...next].every((point) => previous.has(point)) ? previous : next);
30
+ };
31
+ const queries = POINTS.map((point) => window.matchMedia(BREAKPOINT_QUERIES[point]));
32
+ queries.forEach((query) => query.addEventListener("change", update));
33
+ update();
34
+ return () => queries.forEach((query) => query.removeEventListener("change", update));
35
+ }, [enabled]);
36
+ return enabled ? screens : null;
37
+ };
38
+ //#endregion
39
+ export { BREAKPOINT_QUERIES, useBreakpoint };
40
+
41
+ //# sourceMappingURL=useBreakpoint.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBreakpoint.mjs","names":[],"sources":["../../../src/base-ui/Table/useBreakpoint.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { TableBreakpoint } from './type';\n\n/** antd's default Grid breakpoints (`screenSM` … `screenXXXL`). */\nexport const BREAKPOINT_QUERIES: Record<TableBreakpoint, string> = {\n lg: '(min-width: 992px)',\n md: '(min-width: 768px)',\n sm: '(min-width: 576px)',\n xl: '(min-width: 1200px)',\n xs: '(max-width: 575px)',\n xxl: '(min-width: 1600px)',\n xxxl: '(min-width: 1920px)',\n};\n\nconst POINTS = Object.keys(BREAKPOINT_QUERIES) as TableBreakpoint[];\n\nconst canMatchMedia = () =>\n typeof window !== 'undefined' && typeof window.matchMedia === 'function';\n\nconst readScreens = (): ReadonlySet<TableBreakpoint> | null =>\n canMatchMedia()\n ? new Set(POINTS.filter((point) => window.matchMedia(BREAKPOINT_QUERIES[point]).matches))\n : null;\n\n/**\n * Active breakpoints, kept in sync with `matchMedia`. Returns `null` when disabled or when media\n * queries are unavailable (SSR), which callers treat as \"show everything\".\n */\nexport const useBreakpoint = (enabled: boolean): ReadonlySet<TableBreakpoint> | null => {\n const [screens, setScreens] = useState(() => (enabled ? readScreens() : null));\n\n useEffect(() => {\n if (!enabled || !canMatchMedia()) {\n setScreens(null);\n return;\n }\n const update = () => {\n const next = readScreens()!;\n setScreens((previous) =>\n previous?.size === next.size && [...next].every((point) => previous.has(point))\n ? previous\n : next,\n );\n };\n const queries = POINTS.map((point) => window.matchMedia(BREAKPOINT_QUERIES[point]));\n queries.forEach((query) => query.addEventListener('change', update));\n update();\n return () => queries.forEach((query) => query.removeEventListener('change', update));\n }, [enabled]);\n\n return enabled ? screens : null;\n};\n"],"mappings":";;;AAKA,MAAa,qBAAsD;CACjE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,MAAM;AACR;AAEA,MAAM,SAAS,OAAO,KAAK,kBAAkB;AAE7C,MAAM,sBACJ,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe;AAEhE,MAAM,oBACJ,cAAc,IACV,IAAI,IAAI,OAAO,QAAQ,UAAU,OAAO,WAAW,mBAAmB,MAAM,CAAC,CAAC,OAAO,CAAC,IACtF;;;;;AAMN,MAAa,iBAAiB,YAA0D;CACtF,MAAM,CAAC,SAAS,cAAc,eAAgB,UAAU,YAAY,IAAI,IAAK;CAE7E,gBAAgB;EACd,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG;GAChC,WAAW,IAAI;GACf;EACF;EACA,MAAM,eAAe;GACnB,MAAM,OAAO,YAAY;GACzB,YAAY,aACV,UAAU,SAAS,KAAK,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,UAAU,SAAS,IAAI,KAAK,CAAC,IAC1E,WACA,IACN;EACF;EACA,MAAM,UAAU,OAAO,KAAK,UAAU,OAAO,WAAW,mBAAmB,MAAM,CAAC;EAClF,QAAQ,SAAS,UAAU,MAAM,iBAAiB,UAAU,MAAM,CAAC;EACnE,OAAO;EACP,aAAa,QAAQ,SAAS,UAAU,MAAM,oBAAoB,UAAU,MAAM,CAAC;CACrF,GAAG,CAAC,OAAO,CAAC;CAEZ,OAAO,UAAU,UAAU;AAC7B"}
@@ -0,0 +1,64 @@
1
+ import { flattenColumns } from "./columnUtils.mjs";
2
+ import { useMemo } from "react";
3
+ //#region src/base-ui/Table/useFilter.ts
4
+ const flattenFilterKeys = (filters) => (filters ?? []).flatMap(({ children, value }) => [value, ...flattenFilterKeys(children)]);
5
+ const isFilterable = (column) => Boolean(column.filters) || column.filterDropdown !== void 0 || "onFilter" in column;
6
+ const toKeys = (column, keys) => column.filterDropdown === void 0 && keys ? keys.map(String) : keys;
7
+ /**
8
+ * Filter states of every filterable column (antd `collectFilterStates`). A column with
9
+ * `filteredValue` reports it; others start from `defaultFilteredValue` when `init`.
10
+ */
11
+ const collectFilterStates = (columns, init) => flattenColumns(columns).flatMap(({ column, id }) => {
12
+ const col = column;
13
+ if (!isFilterable(col)) return [];
14
+ return [{
15
+ column: col,
16
+ filteredKeys: "filteredValue" in col ? toKeys(col, col.filteredValue) : init && col.defaultFilteredValue ? toKeys(col, col.defaultFilteredValue) : void 0,
17
+ forceFiltered: col.filtered,
18
+ key: id
19
+ }];
20
+ });
21
+ /**
22
+ * Controlled when any column passes a defined `filteredValue`; otherwise the inner keys apply.
23
+ */
24
+ const mergeFilterStates = (columns, inner) => {
25
+ const collected = collectFilterStates(columns, false);
26
+ return collected.some(({ filteredKeys }) => filteredKeys !== void 0) ? collected : collected.map((state) => ({
27
+ ...state,
28
+ filteredKeys: inner[state.key]
29
+ }));
30
+ };
31
+ /** The `filters` argument of `onChange`, with option values restored to their original type. */
32
+ const getFilterInfo = (states) => Object.fromEntries(states.map(({ column, filteredKeys, key }) => {
33
+ if (column.filterDropdown) return [key, filteredKeys || null];
34
+ if (!Array.isArray(filteredKeys)) return [key, null];
35
+ const selected = new Set(filteredKeys.map(String));
36
+ return [key, flattenFilterKeys(column.filters).filter((value) => selected.has(String(value)))];
37
+ }));
38
+ /**
39
+ * Keeps records that match any applied key of every active column filter (antd `getFilterData`).
40
+ * Tree children (`childrenColumnName`) are filtered recursively before their parent is tested.
41
+ */
42
+ const filterData = (data, states, childrenColumnName = "children") => states.reduce((current, { column: { filters, onFilter }, filteredKeys }) => {
43
+ if (!onFilter || !filteredKeys?.length) return current;
44
+ const valueOf = /* @__PURE__ */ new Map();
45
+ for (const value of flattenFilterKeys(filters)) if (!valueOf.has(String(value))) valueOf.set(String(value), value);
46
+ const values = filteredKeys.map((key) => valueOf.get(String(key)) ?? key);
47
+ return current.flatMap((record) => {
48
+ const children = record[childrenColumnName];
49
+ const next = Array.isArray(children) ? {
50
+ ...record,
51
+ [childrenColumnName]: filterData(children, states, childrenColumnName)
52
+ } : record;
53
+ return values.some((value) => onFilter(value, next)) ? [next] : [];
54
+ });
55
+ }, [...data]);
56
+ const useFilter = ({ childrenColumnName, data, states }) => useMemo(() => filterData(data, states, childrenColumnName), [
57
+ data,
58
+ states,
59
+ childrenColumnName
60
+ ]);
61
+ //#endregion
62
+ export { collectFilterStates, filterData, flattenFilterKeys, getFilterInfo, mergeFilterStates, useFilter };
63
+
64
+ //# sourceMappingURL=useFilter.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFilter.mjs","names":[],"sources":["../../../src/base-ui/Table/useFilter.ts"],"sourcesContent":["import { type Key, useMemo } from 'react';\n\nimport { flattenColumns } from './columnUtils';\nimport type {\n FilterValue,\n TableColumn,\n TableColumnFilterItem,\n TableColumnType,\n TableFilters,\n} from './type';\n\n/** Applied keys of one column; `null` / `undefined` mean unfiltered. */\nexport type FilterKeys = (Key | boolean)[] | null;\n\n/** Filter state of one filterable column (antd `FilterState`). */\nexport interface FilterState<T> {\n column: TableColumnType<T>;\n /**\n * Option values as strings for `filters` columns, raw keys for `filterDropdown` columns.\n * `undefined` means the column is uncontrolled and untouched.\n */\n filteredKeys?: FilterKeys;\n forceFiltered?: boolean;\n key: string;\n}\n\n/** Inner (uncontrolled) applied keys by column id. */\nexport type FiltersState = Record<string, FilterKeys | undefined>;\n\nexport const flattenFilterKeys = (filters?: readonly TableColumnFilterItem[]): FilterValue[] =>\n (filters ?? []).flatMap(({ children, value }) => [value, ...flattenFilterKeys(children)]);\n\nconst isFilterable = (column: TableColumnType<any>) =>\n Boolean(column.filters) || column.filterDropdown !== undefined || 'onFilter' in column;\n\nconst toKeys = (column: TableColumnType<any>, keys: FilterKeys | undefined) =>\n // Menu / tree options are matched by their string value; custom dropdowns keep raw keys.\n column.filterDropdown === undefined && keys ? keys.map(String) : keys;\n\n/**\n * Filter states of every filterable column (antd `collectFilterStates`). A column with\n * `filteredValue` reports it; others start from `defaultFilteredValue` when `init`.\n */\nexport const collectFilterStates = <T>(\n columns: readonly TableColumn<T>[],\n init: boolean,\n): FilterState<T>[] =>\n flattenColumns(columns).flatMap(({ column, id }) => {\n const col = column as TableColumnType<T>;\n if (!isFilterable(col)) return [];\n const filteredKeys =\n 'filteredValue' in col\n ? toKeys(col, col.filteredValue)\n : init && col.defaultFilteredValue\n ? toKeys(col, col.defaultFilteredValue)\n : undefined;\n return [{ column: col, filteredKeys, forceFiltered: col.filtered, key: id }];\n });\n\n/**\n * Controlled when any column passes a defined `filteredValue`; otherwise the inner keys apply.\n */\nexport const mergeFilterStates = <T>(\n columns: readonly TableColumn<T>[],\n inner: FiltersState,\n): FilterState<T>[] => {\n const collected = collectFilterStates(columns, false);\n const controlled = collected.some(({ filteredKeys }) => filteredKeys !== undefined);\n return controlled\n ? collected\n : collected.map((state) => ({ ...state, filteredKeys: inner[state.key] }));\n};\n\n/** The `filters` argument of `onChange`, with option values restored to their original type. */\nexport const getFilterInfo = (states: readonly FilterState<any>[]): TableFilters =>\n Object.fromEntries(\n states.map(({ column, filteredKeys, key }) => {\n if (column.filterDropdown) return [key, (filteredKeys as FilterValue[]) || null];\n if (!Array.isArray(filteredKeys)) return [key, null];\n const selected = new Set(filteredKeys.map(String));\n return [\n key,\n flattenFilterKeys(column.filters).filter((value) => selected.has(String(value))),\n ];\n }),\n );\n\n/**\n * Keeps records that match any applied key of every active column filter (antd `getFilterData`).\n * Tree children (`childrenColumnName`) are filtered recursively before their parent is tested.\n */\nexport const filterData = <T>(\n data: readonly T[],\n states: readonly FilterState<T>[],\n childrenColumnName = 'children',\n): T[] =>\n states.reduce<T[]>(\n (current, { column: { filters, onFilter }, filteredKeys }) => {\n if (!onFilter || !filteredKeys?.length) return current;\n\n const valueOf = new Map<string, FilterValue>();\n for (const value of flattenFilterKeys(filters)) {\n if (!valueOf.has(String(value))) valueOf.set(String(value), value);\n }\n const values = filteredKeys.map((key) => valueOf.get(String(key)) ?? (key as FilterValue));\n\n return current.flatMap((record) => {\n const children = (record as Record<string, unknown>)[childrenColumnName];\n const next = Array.isArray(children)\n ? {\n ...record,\n [childrenColumnName]: filterData(children as T[], states, childrenColumnName),\n }\n : record;\n return values.some((value) => onFilter(value, next)) ? [next] : [];\n });\n },\n [...data],\n );\n\nexport const useFilter = <T>({\n childrenColumnName,\n data,\n states,\n}: {\n childrenColumnName?: string;\n data: readonly T[];\n states: readonly FilterState<T>[];\n}) =>\n useMemo(() => filterData(data, states, childrenColumnName), [data, states, childrenColumnName]);\n"],"mappings":";;;AA6BA,MAAa,qBAAqB,aAC/B,WAAW,CAAC,EAAA,CAAG,SAAS,EAAE,UAAU,YAAY,CAAC,OAAO,GAAG,kBAAkB,QAAQ,CAAC,CAAC;AAE1F,MAAM,gBAAgB,WACpB,QAAQ,OAAO,OAAO,KAAK,OAAO,mBAAmB,KAAA,KAAa,cAAc;AAElF,MAAM,UAAU,QAA8B,SAE5C,OAAO,mBAAmB,KAAA,KAAa,OAAO,KAAK,IAAI,MAAM,IAAI;;;;;AAMnE,MAAa,uBACX,SACA,SAEA,eAAe,OAAO,CAAC,CAAC,SAAS,EAAE,QAAQ,SAAS;CAClD,MAAM,MAAM;CACZ,IAAI,CAAC,aAAa,GAAG,GAAG,OAAO,CAAC;CAOhC,OAAO,CAAC;EAAE,QAAQ;EAAK,cALrB,mBAAmB,MACf,OAAO,KAAK,IAAI,aAAa,IAC7B,QAAQ,IAAI,uBACV,OAAO,KAAK,IAAI,oBAAoB,IACpC,KAAA;EAC6B,eAAe,IAAI;EAAU,KAAK;CAAG,CAAC;AAC7E,CAAC;;;;AAKH,MAAa,qBACX,SACA,UACqB;CACrB,MAAM,YAAY,oBAAoB,SAAS,KAAK;CAEpD,OADmB,UAAU,MAAM,EAAE,mBAAmB,iBAAiB,KAAA,CACzD,IACZ,YACA,UAAU,KAAK,WAAW;EAAE,GAAG;EAAO,cAAc,MAAM,MAAM;CAAK,EAAE;AAC7E;;AAGA,MAAa,iBAAiB,WAC5B,OAAO,YACL,OAAO,KAAK,EAAE,QAAQ,cAAc,UAAU;CAC5C,IAAI,OAAO,gBAAgB,OAAO,CAAC,KAAM,gBAAkC,IAAI;CAC/E,IAAI,CAAC,MAAM,QAAQ,YAAY,GAAG,OAAO,CAAC,KAAK,IAAI;CACnD,MAAM,WAAW,IAAI,IAAI,aAAa,IAAI,MAAM,CAAC;CACjD,OAAO,CACL,KACA,kBAAkB,OAAO,OAAO,CAAC,CAAC,QAAQ,UAAU,SAAS,IAAI,OAAO,KAAK,CAAC,CAAC,CACjF;AACF,CAAC,CACH;;;;;AAMF,MAAa,cACX,MACA,QACA,qBAAqB,eAErB,OAAO,QACJ,SAAS,EAAE,QAAQ,EAAE,SAAS,YAAY,mBAAmB;CAC5D,IAAI,CAAC,YAAY,CAAC,cAAc,QAAQ,OAAO;CAE/C,MAAM,0BAAU,IAAI,IAAyB;CAC7C,KAAK,MAAM,SAAS,kBAAkB,OAAO,GAC3C,IAAI,CAAC,QAAQ,IAAI,OAAO,KAAK,CAAC,GAAG,QAAQ,IAAI,OAAO,KAAK,GAAG,KAAK;CAEnE,MAAM,SAAS,aAAa,KAAK,QAAQ,QAAQ,IAAI,OAAO,GAAG,CAAC,KAAM,GAAmB;CAEzF,OAAO,QAAQ,SAAS,WAAW;EACjC,MAAM,WAAY,OAAmC;EACrD,MAAM,OAAO,MAAM,QAAQ,QAAQ,IAC/B;GACE,GAAG;IACF,qBAAqB,WAAW,UAAiB,QAAQ,kBAAkB;EAC9E,IACA;EACJ,OAAO,OAAO,MAAM,UAAU,SAAS,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;CACnE,CAAC;AACH,GACA,CAAC,GAAG,IAAI,CACV;AAEF,MAAa,aAAgB,EAC3B,oBACA,MACA,aAMA,cAAc,WAAW,MAAM,QAAQ,kBAAkB,GAAG;CAAC;CAAM;CAAQ;AAAkB,CAAC"}
@@ -0,0 +1,421 @@
1
+ "use client";
2
+ import DropdownMenu from "../DropdownMenu/DropdownMenu.mjs";
3
+ import ActionIcon from "../ActionIcon/ActionIcon.mjs";
4
+ import Checkbox_default from "../Checkbox/Checkbox.mjs";
5
+ import Radio from "../Radio/Radio.mjs";
6
+ import { SELECTION_ALL, SELECTION_COLUMN, SELECTION_INVERT, SELECTION_NONE, conductCheck, convertDataToEntities, flattenData, selectRange } from "./selectionUtils.mjs";
7
+ import { PREFIX_CLS, styles } from "./style.mjs";
8
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
+ import { cx } from "antd-style";
11
+ import { ChevronDown } from "lucide-react";
12
+ import { RadioGroup } from "@base-ui/react/radio-group";
13
+ import { INTERNAL_COL_DEFINE } from "@rc-component/table";
14
+ //#region src/base-ui/Table/useSelection.tsx
15
+ const EMPTY_KEYS = [];
16
+ const isExpandColumn = (column) => column?.[INTERNAL_COL_DEFINE]?.columnType === "EXPAND_COLUMN";
17
+ /**
18
+ * Row selection, after antd `useSelection`. Returns a `transformColumns` that inserts the
19
+ * selection column (after rc-table placed the expand column) and the selected key set.
20
+ */
21
+ const useSelection = (config, rowSelection) => {
22
+ const { checkStrictly = true, columnWidth, defaultSelectedRowKeys, fixed, getCheckboxProps, getTitleCheckboxProps, hideSelectAll, onChange: onSelectionChange, onSelect, onSelectAll, onSelectInvert, onSelectMultiple, onSelectNone, preserveSelectedRowKeys, renderCell: customizeRenderCell, selectedRowKeys, selections, type: selectionType = "checkbox" } = rowSelection || {};
23
+ const { childrenColumnName, data, expandType, getRecordByKey, getRowKey, locale, pageData } = config;
24
+ const [innerKeys, setInnerKeys] = useState(defaultSelectedRowKeys || EMPTY_KEYS);
25
+ const mergedKeys = selectedRowKeys ?? innerKeys;
26
+ const prevIndexRef = useRef(null);
27
+ const preserveRecordsRef = useRef(/* @__PURE__ */ new Map());
28
+ const updatePreserveRecordsCache = useCallback((keys) => {
29
+ if (!preserveSelectedRowKeys) return;
30
+ const next = /* @__PURE__ */ new Map();
31
+ keys.forEach((key) => {
32
+ let record = getRecordByKey(key);
33
+ if (record === void 0 && preserveRecordsRef.current.has(key)) record = preserveRecordsRef.current.get(key);
34
+ next.set(key, record);
35
+ });
36
+ preserveRecordsRef.current = next;
37
+ }, [getRecordByKey, preserveSelectedRowKeys]);
38
+ useEffect(() => {
39
+ updatePreserveRecordsCache(mergedKeys);
40
+ }, [mergedKeys, updatePreserveRecordsCache]);
41
+ const flattedData = useMemo(() => flattenData(childrenColumnName, pageData), [childrenColumnName, pageData]);
42
+ const keyEntities = useMemo(() => {
43
+ if (checkStrictly) return null;
44
+ let convertData = data;
45
+ if (preserveSelectedRowKeys) {
46
+ const keySet = new Set(flattedData.map((record) => getRowKey(record)));
47
+ const preserved = [...preserveRecordsRef.current].filter(([key, record]) => !keySet.has(key) && record !== void 0).map(([, record]) => record);
48
+ convertData = [...convertData, ...preserved];
49
+ }
50
+ return convertDataToEntities(convertData, getRowKey, childrenColumnName);
51
+ }, [
52
+ data,
53
+ getRowKey,
54
+ checkStrictly,
55
+ childrenColumnName,
56
+ preserveSelectedRowKeys,
57
+ flattedData
58
+ ]);
59
+ const checkboxPropsMap = useMemo(() => {
60
+ const map = /* @__PURE__ */ new Map();
61
+ flattedData.forEach((record, index) => {
62
+ map.set(getRowKey(record, index), getCheckboxProps?.(record) || {});
63
+ });
64
+ return map;
65
+ }, [
66
+ flattedData,
67
+ getRowKey,
68
+ getCheckboxProps
69
+ ]);
70
+ const isCheckboxDisabled = useCallback((record) => {
71
+ const key = getRowKey(record);
72
+ const props = checkboxPropsMap.has(key) ? checkboxPropsMap.get(key) : getCheckboxProps?.(record);
73
+ return Boolean(props?.disabled);
74
+ }, [
75
+ checkboxPropsMap,
76
+ getRowKey,
77
+ getCheckboxProps
78
+ ]);
79
+ const [derivedSelectedKeys, derivedHalfSelectedKeys] = useMemo(() => {
80
+ if (checkStrictly || !keyEntities) return [mergedKeys, []];
81
+ const { checkedKeys, halfCheckedKeys } = conductCheck(mergedKeys, true, keyEntities, isCheckboxDisabled);
82
+ return [checkedKeys, halfCheckedKeys];
83
+ }, [
84
+ mergedKeys,
85
+ checkStrictly,
86
+ keyEntities,
87
+ isCheckboxDisabled
88
+ ]);
89
+ const derivedSelectedKeySet = useMemo(() => new Set(selectionType === "radio" ? derivedSelectedKeys.slice(0, 1) : derivedSelectedKeys), [derivedSelectedKeys, selectionType]);
90
+ const derivedHalfSelectedKeySet = useMemo(() => new Set(selectionType === "radio" ? [] : derivedHalfSelectedKeys), [derivedHalfSelectedKeys, selectionType]);
91
+ const enabled = Boolean(rowSelection);
92
+ const [prevEnabled, setPrevEnabled] = useState(enabled);
93
+ if (prevEnabled !== enabled) {
94
+ setPrevEnabled(enabled);
95
+ if (!enabled) setInnerKeys(EMPTY_KEYS);
96
+ }
97
+ const setSelectedKeys = useCallback((keys, method) => {
98
+ let availableKeys;
99
+ let records;
100
+ updatePreserveRecordsCache(keys);
101
+ if (preserveSelectedRowKeys) {
102
+ availableKeys = keys;
103
+ records = keys.map((key) => preserveRecordsRef.current.get(key));
104
+ } else {
105
+ availableKeys = [];
106
+ records = [];
107
+ keys.forEach((key) => {
108
+ const record = getRecordByKey(key);
109
+ if (record !== void 0) {
110
+ availableKeys.push(key);
111
+ records.push(record);
112
+ }
113
+ });
114
+ }
115
+ setInnerKeys(availableKeys);
116
+ onSelectionChange?.(availableKeys, records, { type: method });
117
+ }, [
118
+ getRecordByKey,
119
+ onSelectionChange,
120
+ preserveSelectedRowKeys,
121
+ updatePreserveRecordsCache
122
+ ]);
123
+ const triggerSingleSelection = useCallback((key, selected, keys, event) => {
124
+ if (onSelect) {
125
+ const rows = keys.map((item) => getRecordByKey(item));
126
+ onSelect(getRecordByKey(key), selected, rows, event);
127
+ }
128
+ setSelectedKeys(keys, "single");
129
+ }, [
130
+ onSelect,
131
+ getRecordByKey,
132
+ setSelectedKeys
133
+ ]);
134
+ const mergedSelections = useMemo(() => {
135
+ if (!selections || hideSelectAll) return null;
136
+ return (selections === true ? [
137
+ SELECTION_ALL,
138
+ SELECTION_INVERT,
139
+ SELECTION_NONE
140
+ ] : selections).map((selection) => {
141
+ let merged;
142
+ if (selection === "SELECT_ALL") merged = {
143
+ key: "all",
144
+ onSelect: () => {
145
+ const keys = [];
146
+ data.forEach((record, index) => {
147
+ const key = getRowKey(record, index);
148
+ if (!isCheckboxDisabled(record) || derivedSelectedKeySet.has(key)) keys.push(key);
149
+ });
150
+ setSelectedKeys(keys, "all");
151
+ },
152
+ text: locale.selectionAll
153
+ };
154
+ else if (selection === "SELECT_INVERT") merged = {
155
+ key: "invert",
156
+ onSelect: () => {
157
+ const keySet = new Set(derivedSelectedKeySet);
158
+ pageData.forEach((record, index) => {
159
+ const key = getRowKey(record, index);
160
+ if (checkboxPropsMap.get(key)?.disabled) return;
161
+ if (keySet.has(key)) keySet.delete(key);
162
+ else keySet.add(key);
163
+ });
164
+ const keys = [...keySet];
165
+ onSelectInvert?.(keys);
166
+ setSelectedKeys(keys, "invert");
167
+ },
168
+ text: locale.selectInvert
169
+ };
170
+ else if (selection === "SELECT_NONE") merged = {
171
+ key: "none",
172
+ onSelect: () => {
173
+ onSelectNone?.();
174
+ setSelectedKeys([...derivedSelectedKeySet].filter((key) => checkboxPropsMap.get(key)?.disabled), "none");
175
+ },
176
+ text: locale.selectNone
177
+ };
178
+ else merged = selection;
179
+ return {
180
+ ...merged,
181
+ onSelect: (changeableRowKeys) => {
182
+ merged.onSelect?.(changeableRowKeys);
183
+ prevIndexRef.current = null;
184
+ }
185
+ };
186
+ });
187
+ }, [
188
+ selections,
189
+ hideSelectAll,
190
+ checkboxPropsMap,
191
+ isCheckboxDisabled,
192
+ derivedSelectedKeySet,
193
+ data,
194
+ pageData,
195
+ getRowKey,
196
+ onSelectInvert,
197
+ onSelectNone,
198
+ setSelectedKeys,
199
+ locale
200
+ ]);
201
+ return [useCallback((columns) => {
202
+ if (!rowSelection) return columns.filter((column) => column !== SELECTION_COLUMN);
203
+ let cloneColumns = [...columns];
204
+ const keySet = new Set(derivedSelectedKeySet);
205
+ const recordKeys = [];
206
+ flattedData.forEach((record, index) => {
207
+ const key = getRowKey(record, index);
208
+ if (!checkboxPropsMap.get(key)?.disabled) recordKeys.push(key);
209
+ });
210
+ const checkedCurrentAll = recordKeys.every((key) => keySet.has(key));
211
+ const checkedCurrentSome = recordKeys.some((key) => keySet.has(key));
212
+ const onSelectAllChange = () => {
213
+ const changeKeys = [];
214
+ if (checkedCurrentAll) recordKeys.forEach((key) => {
215
+ keySet.delete(key);
216
+ changeKeys.push(key);
217
+ });
218
+ else recordKeys.forEach((key) => {
219
+ if (!keySet.has(key)) {
220
+ keySet.add(key);
221
+ changeKeys.push(key);
222
+ }
223
+ });
224
+ const keys = [...keySet];
225
+ onSelectAll?.(!checkedCurrentAll, keys.map((key) => getRecordByKey(key)), changeKeys.map((key) => getRecordByKey(key)));
226
+ setSelectedKeys(keys, "all");
227
+ prevIndexRef.current = null;
228
+ };
229
+ let title = null;
230
+ let columnTitleCheckbox = null;
231
+ if (selectionType !== "radio") {
232
+ let customizeSelections = null;
233
+ if (mergedSelections) customizeSelections = /* @__PURE__ */ jsx("div", {
234
+ className: cx(styles.selectionExtra, `${PREFIX_CLS}-selection-extra`),
235
+ children: /* @__PURE__ */ jsx(DropdownMenu, {
236
+ items: mergedSelections.map(({ key, onSelect: onSelectionClick, text }, index) => ({
237
+ key: key ?? index,
238
+ label: text,
239
+ onClick: () => onSelectionClick?.(recordKeys)
240
+ })),
241
+ children: /* @__PURE__ */ jsx(ActionIcon, {
242
+ "aria-label": "Selection options",
243
+ className: styles.selectionTrigger,
244
+ icon: ChevronDown,
245
+ size: "small"
246
+ })
247
+ })
248
+ });
249
+ const disabledItems = [];
250
+ flattedData.forEach((record, index) => {
251
+ const key = getRowKey(record, index);
252
+ const props = checkboxPropsMap.get(key) || {};
253
+ if (props.disabled) disabledItems.push({
254
+ checked: keySet.has(key),
255
+ ...props
256
+ });
257
+ });
258
+ const allDisabled = disabledItems.length > 0 && disabledItems.length === flattedData.length;
259
+ const allDisabledAndChecked = allDisabled && disabledItems.every(({ checked }) => checked);
260
+ const allDisabledSomeChecked = allDisabled && disabledItems.some(({ checked }) => checked);
261
+ const { disabled: titleDisabled, onChange: onTitleChange, ...titleCheckboxProps } = getTitleCheckboxProps?.() || {};
262
+ columnTitleCheckbox = /* @__PURE__ */ jsx(Checkbox_default, {
263
+ "aria-label": customizeSelections ? "Custom selection" : typeof locale.selectAll === "string" ? locale.selectAll : void 0,
264
+ ...titleCheckboxProps,
265
+ disabled: titleDisabled ?? (flattedData.length === 0 || allDisabled),
266
+ checked: allDisabled ? allDisabledAndChecked : flattedData.length > 0 && checkedCurrentAll,
267
+ indeterminate: allDisabled ? !allDisabledAndChecked && allDisabledSomeChecked : !checkedCurrentAll && checkedCurrentSome,
268
+ onChange: (checked) => {
269
+ onSelectAllChange();
270
+ onTitleChange?.(checked);
271
+ }
272
+ });
273
+ title = !hideSelectAll && /* @__PURE__ */ jsxs("div", {
274
+ className: cx(styles.selection, `lobe-table-selection`),
275
+ children: [columnTitleCheckbox, customizeSelections]
276
+ });
277
+ }
278
+ const renderBox = (record, index) => {
279
+ const key = getRowKey(record, index);
280
+ const checked = keySet.has(key);
281
+ const checkboxProps = checkboxPropsMap.get(key) || {};
282
+ const { onChange: onBoxChange, onClick: onBoxClick, ...boxProps } = checkboxProps;
283
+ const handleClick = (event) => {
284
+ event.stopPropagation();
285
+ onBoxClick?.(event);
286
+ };
287
+ if (selectionType === "radio") {
288
+ const { indeterminate: _indeterminate, shape: _shape, classNames: _classNames, styles: _styles, ...radioProps } = boxProps;
289
+ return {
290
+ checked,
291
+ node: /* @__PURE__ */ jsx(RadioGroup, {
292
+ className: styles.selectionRadioGroup,
293
+ value: checked ? "selected" : null,
294
+ onValueChange: (_value, details) => {
295
+ if (!keySet.has(key)) triggerSingleSelection(key, true, [key], details.event);
296
+ onBoxChange?.(true);
297
+ },
298
+ children: /* @__PURE__ */ jsx(Radio, {
299
+ "aria-label": `Select row ${index + 1}`,
300
+ ...radioProps,
301
+ value: "selected",
302
+ onClick: handleClick
303
+ })
304
+ })
305
+ };
306
+ }
307
+ const mergedIndeterminate = expandType === "nest" ? derivedHalfSelectedKeySet.has(key) : checkboxProps.indeterminate ?? derivedHalfSelectedKeySet.has(key);
308
+ return {
309
+ checked,
310
+ node: /* @__PURE__ */ jsx(Checkbox_default, {
311
+ "aria-label": checked ? `Row ${index + 1} selected` : `Select row ${index + 1}`,
312
+ ...boxProps,
313
+ checked,
314
+ indeterminate: mergedIndeterminate,
315
+ onClick: handleClick,
316
+ onChange: (_next, details) => {
317
+ const nativeEvent = details?.event;
318
+ const shiftKey = Boolean(nativeEvent?.shiftKey);
319
+ const currentIndex = recordKeys.indexOf(key);
320
+ const isMultiple = derivedSelectedKeySet.size > 0 && recordKeys.some((item) => derivedSelectedKeySet.has(item));
321
+ if (shiftKey && checkStrictly && isMultiple) {
322
+ const { changedKeys, nextAnchor } = selectRange(prevIndexRef.current, currentIndex, recordKeys, keySet);
323
+ const keys = [...keySet];
324
+ onSelectMultiple?.(!checked, keys.map((item) => getRecordByKey(item)), changedKeys.map((item) => getRecordByKey(item)));
325
+ setSelectedKeys(keys, "multiple");
326
+ prevIndexRef.current = nextAnchor;
327
+ } else {
328
+ if (checkStrictly || !keyEntities) {
329
+ const keys = checked ? derivedSelectedKeys.filter((item) => item !== key) : [...derivedSelectedKeys.filter((item) => item !== key), key];
330
+ triggerSingleSelection(key, !checked, keys, nativeEvent);
331
+ } else {
332
+ const { checkedKeys, halfCheckedKeys } = conductCheck([...derivedSelectedKeys, key], true, keyEntities, isCheckboxDisabled);
333
+ let nextKeys = checkedKeys;
334
+ if (checked) {
335
+ const tempKeySet = new Set(checkedKeys);
336
+ tempKeySet.delete(key);
337
+ nextKeys = conductCheck([...tempKeySet], {
338
+ checked: false,
339
+ halfCheckedKeys
340
+ }, keyEntities, isCheckboxDisabled).checkedKeys;
341
+ }
342
+ triggerSingleSelection(key, !checked, nextKeys, nativeEvent);
343
+ }
344
+ prevIndexRef.current = checked ? null : currentIndex;
345
+ }
346
+ onBoxChange?.(!checked);
347
+ }
348
+ })
349
+ };
350
+ };
351
+ const renderSelectionCell = (_value, record, index) => {
352
+ const { checked, node } = renderBox(record, index);
353
+ return customizeRenderCell ? customizeRenderCell(checked, record, index, node) : node;
354
+ };
355
+ if (!cloneColumns.includes(SELECTION_COLUMN)) {
356
+ if (cloneColumns.findIndex(isExpandColumn) === 0) {
357
+ const [expandColumn, ...rest] = cloneColumns;
358
+ cloneColumns = [
359
+ expandColumn,
360
+ SELECTION_COLUMN,
361
+ ...rest
362
+ ];
363
+ } else cloneColumns = [SELECTION_COLUMN, ...cloneColumns];
364
+ }
365
+ const selectionColumnIndex = cloneColumns.indexOf(SELECTION_COLUMN);
366
+ cloneColumns = cloneColumns.filter((column, index) => column !== SELECTION_COLUMN || index === selectionColumnIndex);
367
+ const prevColumn = cloneColumns[selectionColumnIndex - 1];
368
+ const nextColumn = cloneColumns[selectionColumnIndex + 1];
369
+ let mergedFixed = fixed;
370
+ if (mergedFixed === void 0) {
371
+ if (nextColumn?.fixed !== void 0) mergedFixed = nextColumn.fixed;
372
+ else if (prevColumn?.fixed !== void 0) mergedFixed = prevColumn.fixed;
373
+ }
374
+ if (mergedFixed && prevColumn && isExpandColumn(prevColumn) && prevColumn.fixed == null) cloneColumns[selectionColumnIndex - 1] = {
375
+ ...prevColumn,
376
+ fixed: mergedFixed
377
+ };
378
+ const selectionColumn = {
379
+ [INTERNAL_COL_DEFINE]: { className: cx(`${PREFIX_CLS}-selection-col`, selections && selectionType === "checkbox" && `lobe-table-selection-col-with-dropdown`) },
380
+ align: rowSelection.align,
381
+ className: cx(`${PREFIX_CLS}-selection-column`, styles.selectionColumn),
382
+ fixed: mergedFixed,
383
+ key: "__selection_column",
384
+ onCell: rowSelection.onCell,
385
+ render: renderSelectionCell,
386
+ title: !rowSelection.columnTitle ? title : typeof rowSelection.columnTitle === "function" ? rowSelection.columnTitle(columnTitleCheckbox) : rowSelection.columnTitle,
387
+ width: columnWidth
388
+ };
389
+ return cloneColumns.map((column) => column === SELECTION_COLUMN ? selectionColumn : column);
390
+ }, [
391
+ getRowKey,
392
+ getRecordByKey,
393
+ flattedData,
394
+ rowSelection,
395
+ derivedSelectedKeys,
396
+ derivedSelectedKeySet,
397
+ derivedHalfSelectedKeySet,
398
+ columnWidth,
399
+ fixed,
400
+ mergedSelections,
401
+ expandType,
402
+ checkboxPropsMap,
403
+ checkStrictly,
404
+ keyEntities,
405
+ onSelectAll,
406
+ onSelectMultiple,
407
+ triggerSingleSelection,
408
+ isCheckboxDisabled,
409
+ setSelectedKeys,
410
+ getTitleCheckboxProps,
411
+ hideSelectAll,
412
+ selectionType,
413
+ selections,
414
+ customizeRenderCell,
415
+ locale.selectAll
416
+ ]), derivedSelectedKeySet];
417
+ };
418
+ //#endregion
419
+ export { useSelection };
420
+
421
+ //# sourceMappingURL=useSelection.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSelection.mjs","names":["Checkbox","BaseRadioGroup"],"sources":["../../../src/base-ui/Table/useSelection.tsx"],"sourcesContent":["'use client';\n\nimport { RadioGroup as BaseRadioGroup } from '@base-ui/react/radio-group';\nimport { type ColumnsType as RcColumnsType, INTERNAL_COL_DEFINE } from '@rc-component/table';\nimport { cx } from 'antd-style';\nimport { ChevronDown } from 'lucide-react';\nimport {\n type Key,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport ActionIcon from '@/base-ui/ActionIcon';\nimport { Checkbox } from '@/base-ui/Checkbox';\nimport DropdownMenu from '@/base-ui/DropdownMenu';\nimport { Radio } from '@/base-ui/Radio';\n\nimport {\n conductCheck,\n convertDataToEntities,\n flattenData,\n SELECTION_ALL,\n SELECTION_COLUMN,\n SELECTION_INVERT,\n SELECTION_NONE,\n type SelectionEntities,\n selectRange,\n} from './selectionUtils';\nimport { PREFIX_CLS, styles } from './style';\nimport type {\n TableLocale,\n TableRowSelection,\n TableRowSelectionCheckboxProps,\n TableRowSelectMethod,\n TableSelectionItem,\n} from './type';\n\nconst EMPTY_KEYS: Key[] = [];\n\ntype RcColumns = RcColumnsType<any>;\n\ninterface SelectionConfig<T> {\n childrenColumnName: string;\n /** Filtered and sorted records of every page. */\n data: readonly T[];\n /** `nest` for tree data: `getCheckboxProps().indeterminate` is then ignored. */\n expandType: 'nest' | 'row' | null;\n getRecordByKey: (key: Key) => T | undefined;\n getRowKey: (record: T, index?: number) => Key;\n /** Texts of the selection presets and the select-all checkbox. */\n locale: Pick<TableLocale, 'selectAll' | 'selectInvert' | 'selectNone' | 'selectionAll'>;\n /** Records of the current page. */\n pageData: readonly T[];\n}\n\nconst isExpandColumn = (column: any) =>\n column?.[INTERNAL_COL_DEFINE]?.columnType === 'EXPAND_COLUMN';\n\n/**\n * Row selection, after antd `useSelection`. Returns a `transformColumns` that inserts the\n * selection column (after rc-table placed the expand column) and the selected key set.\n */\nexport const useSelection = <T,>(\n config: SelectionConfig<T>,\n rowSelection: TableRowSelection<T> | undefined,\n) => {\n const {\n checkStrictly = true,\n columnWidth,\n defaultSelectedRowKeys,\n fixed,\n getCheckboxProps,\n getTitleCheckboxProps,\n hideSelectAll,\n onChange: onSelectionChange,\n onSelect,\n onSelectAll,\n onSelectInvert,\n onSelectMultiple,\n onSelectNone,\n preserveSelectedRowKeys,\n renderCell: customizeRenderCell,\n selectedRowKeys,\n selections,\n type: selectionType = 'checkbox',\n } = rowSelection || {};\n const { childrenColumnName, data, expandType, getRecordByKey, getRowKey, locale, pageData } =\n config;\n\n // ========================= Keys =========================\n const [innerKeys, setInnerKeys] = useState<Key[]>(defaultSelectedRowKeys || EMPTY_KEYS);\n const mergedKeys = selectedRowKeys ?? innerKeys;\n\n // Shift-click anchor (antd `useMultipleSelect`).\n const prevIndexRef = useRef<number | null>(null);\n\n // ======================== Caches ========================\n const preserveRecordsRef = useRef(new Map<Key, T | undefined>());\n const updatePreserveRecordsCache = useCallback(\n (keys: readonly Key[]) => {\n if (!preserveSelectedRowKeys) return;\n const next = new Map<Key, T | undefined>();\n keys.forEach((key) => {\n let record = getRecordByKey(key);\n if (record === undefined && preserveRecordsRef.current.has(key)) {\n record = preserveRecordsRef.current.get(key);\n }\n next.set(key, record);\n });\n preserveRecordsRef.current = next;\n },\n [getRecordByKey, preserveSelectedRowKeys],\n );\n\n useEffect(() => {\n updatePreserveRecordsCache(mergedKeys);\n }, [mergedKeys, updatePreserveRecordsCache]);\n\n const flattedData = useMemo(\n () => flattenData(childrenColumnName, pageData),\n [childrenColumnName, pageData],\n );\n\n const keyEntities = useMemo((): SelectionEntities<T> | null => {\n if (checkStrictly) return null;\n let convertData = data;\n if (preserveSelectedRowKeys) {\n // Records kept from other pages join the tree, unless they are on this page already.\n const keySet = new Set(flattedData.map((record) => getRowKey(record)));\n const preserved = [...preserveRecordsRef.current]\n .filter(([key, record]) => !keySet.has(key) && record !== undefined)\n .map(([, record]) => record as T);\n convertData = [...convertData, ...preserved];\n }\n return convertDataToEntities(convertData, getRowKey, childrenColumnName);\n }, [data, getRowKey, checkStrictly, childrenColumnName, preserveSelectedRowKeys, flattedData]);\n\n // Per-row checkbox props of the current page.\n const checkboxPropsMap = useMemo(() => {\n const map = new Map<Key, TableRowSelectionCheckboxProps>();\n flattedData.forEach((record, index) => {\n map.set(getRowKey(record, index), getCheckboxProps?.(record) || {});\n });\n return map;\n }, [flattedData, getRowKey, getCheckboxProps]);\n\n const isCheckboxDisabled = useCallback(\n (record: T) => {\n const key = getRowKey(record);\n const props = checkboxPropsMap.has(key)\n ? checkboxPropsMap.get(key)\n : getCheckboxProps?.(record);\n return Boolean(props?.disabled);\n },\n [checkboxPropsMap, getRowKey, getCheckboxProps],\n );\n\n const [derivedSelectedKeys, derivedHalfSelectedKeys] = useMemo((): [Key[], Key[]] => {\n if (checkStrictly || !keyEntities) return [mergedKeys, []];\n const { checkedKeys, halfCheckedKeys } = conductCheck(\n mergedKeys,\n true,\n keyEntities,\n isCheckboxDisabled,\n );\n return [checkedKeys, halfCheckedKeys];\n }, [mergedKeys, checkStrictly, keyEntities, isCheckboxDisabled]);\n\n const derivedSelectedKeySet = useMemo(\n () =>\n new Set(selectionType === 'radio' ? derivedSelectedKeys.slice(0, 1) : derivedSelectedKeys),\n [derivedSelectedKeys, selectionType],\n );\n const derivedHalfSelectedKeySet = useMemo(\n () => new Set(selectionType === 'radio' ? [] : derivedHalfSelectedKeys),\n [derivedHalfSelectedKeys, selectionType],\n );\n\n // Removing `rowSelection` clears the uncontrolled selection.\n const enabled = Boolean(rowSelection);\n const [prevEnabled, setPrevEnabled] = useState(enabled);\n if (prevEnabled !== enabled) {\n setPrevEnabled(enabled);\n if (!enabled) setInnerKeys(EMPTY_KEYS);\n }\n\n const setSelectedKeys = useCallback(\n (keys: Key[], method: TableRowSelectMethod) => {\n let availableKeys: Key[];\n let records: T[];\n updatePreserveRecordsCache(keys);\n if (preserveSelectedRowKeys) {\n availableKeys = keys;\n records = keys.map((key) => preserveRecordsRef.current.get(key) as T);\n } else {\n // Drop keys whose records left `dataSource`.\n availableKeys = [];\n records = [];\n keys.forEach((key) => {\n const record = getRecordByKey(key);\n if (record !== undefined) {\n availableKeys.push(key);\n records.push(record);\n }\n });\n }\n setInnerKeys(availableKeys);\n onSelectionChange?.(availableKeys, records, { type: method });\n },\n [getRecordByKey, onSelectionChange, preserveSelectedRowKeys, updatePreserveRecordsCache],\n );\n\n const triggerSingleSelection = useCallback(\n (key: Key, selected: boolean, keys: Key[], event: Event) => {\n if (onSelect) {\n const rows = keys.map((item) => getRecordByKey(item) as T);\n onSelect(getRecordByKey(key) as T, selected, rows, event);\n }\n setSelectedKeys(keys, 'single');\n },\n [onSelect, getRecordByKey, setSelectedKeys],\n );\n\n // ====================== Selections ======================\n const mergedSelections = useMemo((): TableSelectionItem[] | null => {\n if (!selections || hideSelectAll) return null;\n const list =\n selections === true ? [SELECTION_ALL, SELECTION_INVERT, SELECTION_NONE] : selections;\n return list.map((selection) => {\n let merged: TableSelectionItem;\n if (selection === SELECTION_ALL) {\n merged = {\n key: 'all',\n onSelect: () => {\n const keys: Key[] = [];\n data.forEach((record, index) => {\n const key = getRowKey(record, index);\n if (!isCheckboxDisabled(record) || derivedSelectedKeySet.has(key)) keys.push(key);\n });\n setSelectedKeys(keys, 'all');\n },\n text: locale.selectionAll,\n };\n } else if (selection === SELECTION_INVERT) {\n merged = {\n key: 'invert',\n onSelect: () => {\n const keySet = new Set(derivedSelectedKeySet);\n pageData.forEach((record, index) => {\n const key = getRowKey(record, index);\n if (checkboxPropsMap.get(key)?.disabled) return;\n if (keySet.has(key)) keySet.delete(key);\n else keySet.add(key);\n });\n const keys = [...keySet];\n onSelectInvert?.(keys);\n setSelectedKeys(keys, 'invert');\n },\n text: locale.selectInvert,\n };\n } else if (selection === SELECTION_NONE) {\n merged = {\n key: 'none',\n onSelect: () => {\n onSelectNone?.();\n setSelectedKeys(\n [...derivedSelectedKeySet].filter((key) => checkboxPropsMap.get(key)?.disabled),\n 'none',\n );\n },\n text: locale.selectNone,\n };\n } else {\n merged = selection;\n }\n return {\n ...merged,\n onSelect: (changeableRowKeys: Key[]) => {\n merged.onSelect?.(changeableRowKeys);\n prevIndexRef.current = null;\n },\n };\n });\n }, [\n selections,\n hideSelectAll,\n checkboxPropsMap,\n isCheckboxDisabled,\n derivedSelectedKeySet,\n data,\n pageData,\n getRowKey,\n onSelectInvert,\n onSelectNone,\n setSelectedKeys,\n locale,\n ]);\n\n // ======================= Columns ========================\n const transformColumns = useCallback(\n (columns: RcColumns): RcColumns => {\n if (!rowSelection) return columns.filter((column) => column !== SELECTION_COLUMN);\n\n let cloneColumns = [...columns];\n const keySet = new Set(derivedSelectedKeySet);\n\n // Only enabled rows of the current page take part in select-all and Shift ranges.\n const recordKeys: Key[] = [];\n flattedData.forEach((record, index) => {\n const key = getRowKey(record, index);\n if (!checkboxPropsMap.get(key)?.disabled) recordKeys.push(key);\n });\n const checkedCurrentAll = recordKeys.every((key) => keySet.has(key));\n const checkedCurrentSome = recordKeys.some((key) => keySet.has(key));\n\n const onSelectAllChange = () => {\n const changeKeys: Key[] = [];\n if (checkedCurrentAll) {\n recordKeys.forEach((key) => {\n keySet.delete(key);\n changeKeys.push(key);\n });\n } else {\n recordKeys.forEach((key) => {\n if (!keySet.has(key)) {\n keySet.add(key);\n changeKeys.push(key);\n }\n });\n }\n const keys = [...keySet];\n onSelectAll?.(\n !checkedCurrentAll,\n keys.map((key) => getRecordByKey(key) as T),\n changeKeys.map((key) => getRecordByKey(key) as T),\n );\n setSelectedKeys(keys, 'all');\n prevIndexRef.current = null;\n };\n\n // ===================== Title =====================\n let title: ReactNode = null;\n let columnTitleCheckbox: ReactNode = null;\n if (selectionType !== 'radio') {\n let customizeSelections: ReactNode = null;\n if (mergedSelections) {\n customizeSelections = (\n <div className={cx(styles.selectionExtra, `${PREFIX_CLS}-selection-extra`)}>\n <DropdownMenu\n items={mergedSelections.map(({ key, onSelect: onSelectionClick, text }, index) => ({\n key: key ?? index,\n label: text,\n onClick: () => onSelectionClick?.(recordKeys),\n }))}\n >\n <ActionIcon\n aria-label=\"Selection options\"\n className={styles.selectionTrigger}\n icon={ChevronDown}\n size=\"small\"\n />\n </DropdownMenu>\n </div>\n );\n }\n\n const disabledItems: { checked: boolean; disabled?: boolean }[] = [];\n flattedData.forEach((record, index) => {\n const key = getRowKey(record, index);\n const props = checkboxPropsMap.get(key) || {};\n if (props.disabled) disabledItems.push({ checked: keySet.has(key), ...props });\n });\n const allDisabled = disabledItems.length > 0 && disabledItems.length === flattedData.length;\n const allDisabledAndChecked = allDisabled && disabledItems.every(({ checked }) => checked);\n const allDisabledSomeChecked = allDisabled && disabledItems.some(({ checked }) => checked);\n\n const {\n disabled: titleDisabled,\n onChange: onTitleChange,\n ...titleCheckboxProps\n } = getTitleCheckboxProps?.() || {};\n columnTitleCheckbox = (\n <Checkbox\n aria-label={\n customizeSelections\n ? 'Custom selection'\n : typeof locale.selectAll === 'string'\n ? locale.selectAll\n : undefined\n }\n {...titleCheckboxProps}\n disabled={titleDisabled ?? (flattedData.length === 0 || allDisabled)}\n checked={\n allDisabled ? allDisabledAndChecked : flattedData.length > 0 && checkedCurrentAll\n }\n indeterminate={\n allDisabled\n ? !allDisabledAndChecked && allDisabledSomeChecked\n : !checkedCurrentAll && checkedCurrentSome\n }\n onChange={(checked) => {\n onSelectAllChange();\n onTitleChange?.(checked);\n }}\n />\n );\n title = !hideSelectAll && (\n <div className={cx(styles.selection, `${PREFIX_CLS}-selection`)}>\n {columnTitleCheckbox}\n {customizeSelections}\n </div>\n );\n }\n\n // ===================== Cells =====================\n const renderBox = (record: T, index: number): { checked: boolean; node: ReactNode } => {\n const key = getRowKey(record, index);\n const checked = keySet.has(key);\n const checkboxProps = checkboxPropsMap.get(key) || {};\n const { onChange: onBoxChange, onClick: onBoxClick, ...boxProps } = checkboxProps;\n const handleClick = (event: MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n (onBoxClick as ((e: MouseEvent<HTMLElement>) => void) | undefined)?.(event);\n };\n\n if (selectionType === 'radio') {\n const {\n indeterminate: _indeterminate,\n shape: _shape,\n classNames: _classNames,\n styles: _styles,\n ...radioProps\n } = boxProps;\n return {\n checked,\n node: (\n <BaseRadioGroup\n className={styles.selectionRadioGroup}\n value={checked ? 'selected' : null}\n onValueChange={(_value, details) => {\n if (!keySet.has(key)) {\n triggerSingleSelection(key, true, [key], details.event as Event);\n }\n onBoxChange?.(true);\n }}\n >\n <Radio\n aria-label={`Select row ${index + 1}`}\n {...(radioProps as object)}\n value=\"selected\"\n onClick={handleClick}\n />\n </BaseRadioGroup>\n ),\n };\n }\n\n const mergedIndeterminate =\n expandType === 'nest'\n ? derivedHalfSelectedKeySet.has(key)\n : (checkboxProps.indeterminate ?? derivedHalfSelectedKeySet.has(key));\n\n return {\n checked,\n node: (\n <Checkbox\n aria-label={checked ? `Row ${index + 1} selected` : `Select row ${index + 1}`}\n {...boxProps}\n checked={checked}\n indeterminate={mergedIndeterminate}\n onClick={handleClick}\n // base-ui passes the change details (with the click event) as a second argument.\n onChange={(_next: boolean, details?: { event?: Event }) => {\n const nativeEvent = details?.event as Event;\n const shiftKey = Boolean((nativeEvent as globalThis.MouseEvent)?.shiftKey);\n const currentIndex = recordKeys.indexOf(key);\n const isMultiple =\n derivedSelectedKeySet.size > 0 &&\n recordKeys.some((item) => derivedSelectedKeySet.has(item));\n\n if (shiftKey && checkStrictly && isMultiple) {\n const { changedKeys, nextAnchor } = selectRange(\n prevIndexRef.current,\n currentIndex,\n recordKeys,\n keySet,\n );\n const keys = [...keySet];\n onSelectMultiple?.(\n !checked,\n keys.map((item) => getRecordByKey(item) as T),\n changedKeys.map((item) => getRecordByKey(item) as T),\n );\n setSelectedKeys(keys, 'multiple');\n prevIndexRef.current = nextAnchor;\n } else {\n if (checkStrictly || !keyEntities) {\n const keys = checked\n ? derivedSelectedKeys.filter((item) => item !== key)\n : [...derivedSelectedKeys.filter((item) => item !== key), key];\n triggerSingleSelection(key, !checked, keys, nativeEvent);\n } else {\n // Always fill first, then clean up when unchecking.\n const { checkedKeys, halfCheckedKeys } = conductCheck(\n [...derivedSelectedKeys, key],\n true,\n keyEntities,\n isCheckboxDisabled,\n );\n let nextKeys = checkedKeys;\n if (checked) {\n const tempKeySet = new Set(checkedKeys);\n tempKeySet.delete(key);\n nextKeys = conductCheck(\n [...tempKeySet],\n { checked: false, halfCheckedKeys },\n keyEntities,\n isCheckboxDisabled,\n ).checkedKeys;\n }\n triggerSingleSelection(key, !checked, nextKeys, nativeEvent);\n }\n prevIndexRef.current = checked ? null : currentIndex;\n }\n onBoxChange?.(!checked);\n }}\n />\n ),\n };\n };\n\n const renderSelectionCell = (_value: unknown, record: T, index: number) => {\n const { checked, node } = renderBox(record, index);\n return customizeRenderCell ? customizeRenderCell(checked, record, index, node) : node;\n };\n\n // ===================== Placement =====================\n if (!cloneColumns.includes(SELECTION_COLUMN as any)) {\n // Right after the expand column when that one leads, else first.\n if (cloneColumns.findIndex(isExpandColumn) === 0) {\n const [expandColumn, ...rest] = cloneColumns;\n cloneColumns = [expandColumn, SELECTION_COLUMN as any, ...rest];\n } else {\n cloneColumns = [SELECTION_COLUMN as any, ...cloneColumns];\n }\n }\n const selectionColumnIndex = cloneColumns.indexOf(SELECTION_COLUMN as any);\n cloneColumns = cloneColumns.filter(\n (column, index) => column !== SELECTION_COLUMN || index === selectionColumnIndex,\n );\n\n // Without its own `fixed`, the column follows a pinned neighbour.\n const prevColumn = cloneColumns[selectionColumnIndex - 1] as any;\n const nextColumn = cloneColumns[selectionColumnIndex + 1] as any;\n let mergedFixed = fixed;\n if (mergedFixed === undefined) {\n if (nextColumn?.fixed !== undefined) mergedFixed = nextColumn.fixed;\n else if (prevColumn?.fixed !== undefined) mergedFixed = prevColumn.fixed;\n }\n if (mergedFixed && prevColumn && isExpandColumn(prevColumn) && prevColumn.fixed == null) {\n cloneColumns[selectionColumnIndex - 1] = { ...prevColumn, fixed: mergedFixed };\n }\n\n const selectionColumn = {\n [INTERNAL_COL_DEFINE]: {\n className: cx(\n `${PREFIX_CLS}-selection-col`,\n selections &&\n selectionType === 'checkbox' &&\n `${PREFIX_CLS}-selection-col-with-dropdown`,\n ),\n },\n align: rowSelection.align,\n className: cx(`${PREFIX_CLS}-selection-column`, styles.selectionColumn),\n fixed: mergedFixed,\n key: '__selection_column',\n onCell: rowSelection.onCell,\n render: renderSelectionCell,\n title: !rowSelection.columnTitle\n ? title\n : typeof rowSelection.columnTitle === 'function'\n ? rowSelection.columnTitle(columnTitleCheckbox)\n : rowSelection.columnTitle,\n width: columnWidth,\n };\n\n return cloneColumns.map((column) =>\n column === SELECTION_COLUMN ? selectionColumn : column,\n ) as RcColumns;\n },\n [\n getRowKey,\n getRecordByKey,\n flattedData,\n rowSelection,\n derivedSelectedKeys,\n derivedSelectedKeySet,\n derivedHalfSelectedKeySet,\n columnWidth,\n fixed,\n mergedSelections,\n expandType,\n checkboxPropsMap,\n checkStrictly,\n keyEntities,\n onSelectAll,\n onSelectMultiple,\n triggerSingleSelection,\n isCheckboxDisabled,\n setSelectedKeys,\n getTitleCheckboxProps,\n hideSelectAll,\n selectionType,\n selections,\n customizeRenderCell,\n locale.selectAll,\n ],\n );\n\n return [transformColumns, derivedSelectedKeySet] as const;\n};\n"],"mappings":"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"}