@lobehub/ui 5.59.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.
- package/es/ActionIcon/style.mjs +8 -2
- package/es/ActionIcon/style.mjs.map +1 -1
- package/es/EmojiPicker/AvatarUploader.mjs +1 -1
- package/es/Form/components/FormSubmitFooter.mjs +1 -1
- package/es/awesome/Grainient/Grainient.d.mts +11 -0
- package/es/awesome/Grainient/Grainient.mjs +311 -0
- package/es/awesome/Grainient/Grainient.mjs.map +1 -0
- package/es/awesome/Grainient/index.d.mts +3 -0
- package/es/awesome/Grainient/style.mjs +25 -0
- package/es/awesome/Grainient/style.mjs.map +1 -0
- package/es/awesome/Grainient/type.d.mts +122 -0
- package/es/awesome/index.d.mts +4 -1
- package/es/awesome/index.mjs +2 -1
- package/es/base-ui/ActionIcon/style.mjs +8 -2
- package/es/base-ui/ActionIcon/style.mjs.map +1 -1
- package/es/base-ui/Input/style.d.mts +1 -1
- package/es/base-ui/Pagination/Pagination.mjs +158 -41
- package/es/base-ui/Pagination/Pagination.mjs.map +1 -1
- package/es/base-ui/Pagination/helpers.mjs +3 -3
- package/es/base-ui/Pagination/helpers.mjs.map +1 -1
- package/es/base-ui/Pagination/index.d.mts +2 -2
- package/es/base-ui/Pagination/style.mjs +39 -0
- package/es/base-ui/Pagination/style.mjs.map +1 -1
- package/es/base-ui/Pagination/type.d.mts +42 -4
- package/es/base-ui/QRCode/QRCode.mjs +1 -1
- package/es/base-ui/Table/Column.d.mts +9 -0
- package/es/base-ui/Table/Column.mjs +7 -0
- package/es/base-ui/Table/Column.mjs.map +1 -0
- package/es/base-ui/Table/ColumnGroup.d.mts +12 -0
- package/es/base-ui/Table/ColumnGroup.mjs +7 -0
- package/es/base-ui/Table/ColumnGroup.mjs.map +1 -0
- package/es/base-ui/Table/ExpandIcon.mjs +33 -0
- package/es/base-ui/Table/ExpandIcon.mjs.map +1 -0
- package/es/base-ui/Table/FilterDropdown.mjs +284 -0
- package/es/base-ui/Table/FilterDropdown.mjs.map +1 -0
- package/es/base-ui/Table/LoadingSkeleton.mjs +83 -0
- package/es/base-ui/Table/LoadingSkeleton.mjs.map +1 -0
- package/es/base-ui/Table/Table.d.mts +21 -3
- package/es/base-ui/Table/Table.mjs +444 -97
- package/es/base-ui/Table/Table.mjs.map +1 -1
- package/es/base-ui/Table/columnUtils.mjs +56 -0
- package/es/base-ui/Table/columnUtils.mjs.map +1 -0
- package/es/base-ui/Table/index.d.mts +4 -2
- package/es/base-ui/Table/selectionUtils.d.mts +9 -0
- package/es/base-ui/Table/selectionUtils.mjs +128 -0
- package/es/base-ui/Table/selectionUtils.mjs.map +1 -0
- package/es/base-ui/Table/semantic.mjs +55 -0
- package/es/base-ui/Table/semantic.mjs.map +1 -0
- package/es/base-ui/Table/style.mjs +801 -161
- package/es/base-ui/Table/style.mjs.map +1 -1
- package/es/base-ui/Table/type.d.mts +471 -37
- package/es/base-ui/Table/useBreakpoint.mjs +41 -0
- package/es/base-ui/Table/useBreakpoint.mjs.map +1 -0
- package/es/base-ui/Table/useFilter.mjs +64 -0
- package/es/base-ui/Table/useFilter.mjs.map +1 -0
- package/es/base-ui/Table/useSelection.mjs +421 -0
- package/es/base-ui/Table/useSelection.mjs.map +1 -0
- package/es/base-ui/Table/useSorter.mjs +152 -0
- package/es/base-ui/Table/useSorter.mjs.map +1 -0
- package/es/base-ui/Table/useTableState.mjs +82 -55
- package/es/base-ui/Table/useTableState.mjs.map +1 -1
- package/es/base-ui/index.d.mts +6 -4
- package/es/base-ui/index.mjs +9 -9
- package/es/chat/EditableMessageList/EditableMessageList.mjs +1 -1
- package/es/chat/MessageInput/MessageInput.mjs +1 -1
- package/es/chat/MessageModal/MessageModal.mjs +1 -1
- package/es/chat/TokenTag/TokenTag.mjs +1 -1
- package/es/dashboard/AuthLayout/Aside.d.mts +10 -0
- package/es/dashboard/AuthLayout/Aside.mjs +30 -0
- package/es/dashboard/AuthLayout/Aside.mjs.map +1 -0
- package/es/dashboard/AuthLayout/AuthLayout.d.mts +3 -1
- package/es/dashboard/AuthLayout/AuthLayout.mjs +93 -37
- package/es/dashboard/AuthLayout/AuthLayout.mjs.map +1 -1
- package/es/dashboard/AuthLayout/index.d.mts +3 -2
- package/es/dashboard/AuthLayout/style.mjs +120 -1
- package/es/dashboard/AuthLayout/style.mjs.map +1 -1
- package/es/dashboard/AuthLayout/type.d.mts +39 -3
- package/es/dashboard/AuthTools/AuthLocaleSwitch.d.mts +10 -0
- package/es/dashboard/AuthTools/AuthLocaleSwitch.mjs +32 -0
- package/es/dashboard/AuthTools/AuthLocaleSwitch.mjs.map +1 -0
- package/es/dashboard/AuthTools/AuthThemeSwitch.d.mts +10 -0
- package/es/dashboard/AuthTools/AuthThemeSwitch.mjs +59 -0
- package/es/dashboard/AuthTools/AuthThemeSwitch.mjs.map +1 -0
- package/es/dashboard/AuthTools/index.d.mts +4 -0
- package/es/dashboard/AuthTools/style.mjs +63 -0
- package/es/dashboard/AuthTools/style.mjs.map +1 -0
- package/es/dashboard/AuthTools/type.d.mts +30 -0
- package/es/dashboard/ConsoleNav/Skeleton.d.mts +15 -0
- package/es/dashboard/ConsoleNav/Skeleton.mjs +81 -0
- package/es/dashboard/ConsoleNav/Skeleton.mjs.map +1 -0
- package/es/dashboard/ConsoleNav/index.d.mts +3 -2
- package/es/dashboard/ConsoleNav/style.mjs +15 -0
- package/es/dashboard/ConsoleNav/style.mjs.map +1 -1
- package/es/dashboard/ConsoleNav/type.d.mts +14 -1
- package/es/dashboard/ConsoleShell/ConsoleShell.d.mts +1 -1
- package/es/dashboard/ConsoleShell/ConsoleShell.mjs +11 -3
- package/es/dashboard/ConsoleShell/ConsoleShell.mjs.map +1 -1
- package/es/dashboard/ConsoleShell/style.mjs +6 -0
- package/es/dashboard/ConsoleShell/style.mjs.map +1 -1
- package/es/dashboard/ConsoleShell/type.d.mts +9 -0
- package/es/dashboard/FilterSidebar/FilterSidebar.mjs +18 -17
- package/es/dashboard/FilterSidebar/FilterSidebar.mjs.map +1 -1
- package/es/dashboard/FilterStrip/FilterStrip.mjs +36 -32
- package/es/dashboard/FilterStrip/FilterStrip.mjs.map +1 -1
- package/es/dashboard/FilterStrip/style.mjs +2 -1
- package/es/dashboard/FilterStrip/style.mjs.map +1 -1
- package/es/dashboard/MetricStrip/MetricCell.mjs +81 -0
- package/es/dashboard/MetricStrip/MetricCell.mjs.map +1 -0
- package/es/dashboard/MetricStrip/MetricStrip.d.mts +5 -2
- package/es/dashboard/MetricStrip/MetricStrip.mjs +33 -62
- package/es/dashboard/MetricStrip/MetricStrip.mjs.map +1 -1
- package/es/dashboard/MetricStrip/style.mjs +49 -4
- package/es/dashboard/MetricStrip/style.mjs.map +1 -1
- package/es/dashboard/MetricStrip/type.d.mts +12 -0
- package/es/dashboard/PageSkeleton/PageSkeleton.mjs +20 -18
- package/es/dashboard/PageSkeleton/PageSkeleton.mjs.map +1 -1
- package/es/dashboard/PageSkeleton/style.mjs +1 -1
- package/es/dashboard/PageSkeleton/style.mjs.map +1 -1
- package/es/dashboard/PanelSurface/PanelSurface.mjs +4 -1
- package/es/dashboard/PanelSurface/PanelSurface.mjs.map +1 -1
- package/es/dashboard/StatCard/StatCard.d.mts +2 -1
- package/es/dashboard/StatCard/StatCard.mjs +24 -72
- package/es/dashboard/StatCard/StatCard.mjs.map +1 -1
- package/es/dashboard/StatCard/type.d.mts +16 -5
- package/es/dashboard/Surface/Surface.mjs +26 -10
- package/es/dashboard/Surface/Surface.mjs.map +1 -1
- package/es/dashboard/Surface/index.d.mts +2 -2
- package/es/dashboard/Surface/link.d.mts +6 -1
- package/es/dashboard/Surface/link.mjs +12 -1
- package/es/dashboard/Surface/link.mjs.map +1 -1
- package/es/dashboard/Surface/style.d.mts +22 -3
- package/es/dashboard/Surface/style.mjs +95 -26
- package/es/dashboard/Surface/style.mjs.map +1 -1
- package/es/dashboard/index.d.mts +10 -4
- package/es/dashboard/index.mjs +7 -3
- package/es/i18n/resources/en/index.d.mts +3 -2
- package/es/i18n/resources/en/index.mjs +4 -2
- package/es/i18n/resources/en/index.mjs.map +1 -1
- package/es/i18n/resources/en/table.d.mts +23 -0
- package/es/i18n/resources/en/table.mjs +24 -0
- package/es/i18n/resources/en/table.mjs.map +1 -0
- package/es/i18n/resources/zhCn/index.d.mts +3 -2
- package/es/i18n/resources/zhCn/index.mjs +4 -2
- package/es/i18n/resources/zhCn/index.mjs.map +1 -1
- package/es/i18n/resources/zhCn/table.d.mts +23 -0
- package/es/i18n/resources/zhCn/table.mjs +24 -0
- package/es/i18n/resources/zhCn/table.mjs.map +1 -0
- package/es/i18n/types.d.mts +2 -1
- package/es/index.mjs +2 -2
- package/package.json +2 -2
- package/es/base-ui/Table/FilterMenu.mjs +0 -45
- package/es/base-ui/Table/FilterMenu.mjs.map +0 -1
- package/es/base-ui/Table/TableBody.mjs +0 -59
- package/es/base-ui/Table/TableBody.mjs.map +0 -1
- package/es/base-ui/Table/TableHead.mjs +0 -50
- package/es/base-ui/Table/TableHead.mjs.map +0 -1
- package/es/base-ui/Table/features.mjs +0 -12
- package/es/base-ui/Table/features.mjs.map +0 -1
- package/es/base-ui/Table/fixedOffsets.mjs +0 -29
- package/es/base-ui/Table/fixedOffsets.mjs.map +0 -1
- package/es/base-ui/Table/toColumnDefs.mjs +0 -26
- package/es/base-ui/Table/toColumnDefs.mjs.map +0 -1
- package/es/dashboard/StatCard/style.mjs +0 -135
- package/es/dashboard/StatCard/style.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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"}
|