@thewrong/ui 0.3.0 → 0.4.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/README.md +2 -2
- package/dist/components/button/Button.cjs +1 -1
- package/dist/components/button/Button.d.ts +3 -0
- package/dist/components/button/Button.esm.js +17 -5
- package/dist/components/button/types.d.ts +3 -1
- package/dist/components/button/utils.cjs +1 -1
- package/dist/components/button/utils.d.ts +2 -2
- package/dist/components/button/utils.esm.js +6 -2
- package/dist/components/progress/Progress.cjs +1 -1
- package/dist/components/progress/Progress.d.ts +3 -4
- package/dist/components/progress/Progress.esm.js +5 -5
- package/dist/components/progress/types.d.ts +2 -2
- package/dist/components/select/MultiSelect.cjs +1 -1
- package/dist/components/select/MultiSelect.esm.js +140 -138
- package/dist/components/select/Select.cjs +1 -1
- package/dist/components/select/Select.esm.js +190 -182
- package/dist/components/select/types.d.ts +7 -0
- package/dist/components/slider/Slider.cjs +1 -0
- package/dist/components/slider/Slider.d.ts +6 -0
- package/dist/components/slider/Slider.esm.js +36 -0
- package/dist/components/slider/index.d.ts +2 -0
- package/dist/components/slider/types.d.ts +15 -0
- package/dist/components/slider/utils.cjs +1 -0
- package/dist/components/slider/utils.d.ts +3 -0
- package/dist/components/slider/utils.esm.js +15 -0
- package/dist/components/table/accordion-table.cjs +1 -1
- package/dist/components/table/accordion-table.esm.js +194 -180
- package/dist/components/table/components/SortHeader.cjs +1 -0
- package/dist/components/table/components/SortHeader.d.ts +10 -0
- package/dist/components/table/components/SortHeader.esm.js +27 -0
- package/dist/components/table/components/SortableHeaderCell.cjs +1 -1
- package/dist/components/table/components/SortableHeaderCell.d.ts +10 -2
- package/dist/components/table/components/SortableHeaderCell.esm.js +54 -26
- package/dist/components/table/hooks/sort-state.cjs +1 -0
- package/dist/components/table/hooks/sort-state.d.ts +5 -0
- package/dist/components/table/hooks/sort-state.esm.js +21 -0
- package/dist/components/table/hooks/useTableSort.cjs +1 -1
- package/dist/components/table/hooks/useTableSort.d.ts +6 -3
- package/dist/components/table/hooks/useTableSort.esm.js +18 -19
- package/dist/components/table/paginated-table.d.ts +2 -0
- package/dist/components/table/table.cjs +1 -1
- package/dist/components/table/table.d.ts +2 -0
- package/dist/components/table/table.esm.js +119 -104
- package/dist/components/table/types.d.ts +11 -4
- package/dist/components/tabs/Tabs.cjs +1 -0
- package/dist/components/tabs/Tabs.d.ts +8 -0
- package/dist/components/tabs/Tabs.esm.js +53 -0
- package/dist/components/tabs/index.d.ts +2 -0
- package/dist/components/tabs/navigation.cjs +1 -0
- package/dist/components/tabs/navigation.d.ts +2 -0
- package/dist/components/tabs/navigation.esm.js +18 -0
- package/dist/components/tabs/types.d.ts +20 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.esm.js +3 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/arrow-down.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/arrow-down.esm.js +10 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/arrow-up-down.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/arrow-up-down.esm.js +21 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/arrow-up.cjs +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/arrow-up.esm.js +10 -0
- package/dist/tokens.css +78 -5
- package/dist/ui.css +1 -1
- package/llms.txt +9 -6
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
let e=require("react/jsx-runtime"),
|
|
1
|
+
let e=require("react"),t=require("react/jsx-runtime"),n=require("@dnd-kit/sortable"),r=require("@dnd-kit/utilities");var i=(0,e.createContext)(null),a=()=>(0,e.useContext)(i);function o({id:a,disabled:o=!1,as:s=`div`,colSpan:c,rowSpan:l,"aria-sort":u,hasSortButton:d=!1,className:f,style:p,children:m}){let{setNodeRef:h,setActivatorNodeRef:g,attributes:_,listeners:v,transform:y,transition:b,isDragging:x}=(0,n.useSortable)({id:a,disabled:o}),S=(0,e.useId)(),C=!o&&d?{setActivatorNodeRef:g,descriptionId:S,onKeyDown:e=>{x||!e.shiftKey&&(e.code===`Space`||e.code===`Enter`)&&e.stopPropagation()}}:null,w={...p,transform:r.CSS.Translate.toString(y),transition:b,opacity:x?.5:1,cursor:o?void 0:`grab`},T=s,E=s===`th`?{...c===void 0?{}:{colSpan:c},...l===void 0?{}:{rowSpan:l}}:{};return(0,t.jsx)(i.Provider,{value:C,children:(0,t.jsxs)(T,{ref:h,className:f,style:w,...E,...o?{}:d?{..._,tabIndex:void 0,"aria-roledescription":void 0,"aria-describedby":void 0,"aria-disabled":void 0,"aria-pressed":void 0}:_,...o?{}:v,onKeyDown:o?void 0:e=>{(!d||e.code===`Space`)&&v?.onKeyDown?.(e)},role:s===`th`?`columnheader`:o?void 0:_.role,"aria-sort":u,children:[m,C&&(0,t.jsx)(`span`,{id:S,"aria-hidden":`true`,className:`sr-only`,children:`Shift+Space로 컬럼 이동을 시작하고 화살표로 이동한 뒤 Space 또는 Enter로 놓습니다.`})]})})}exports.SortableHeaderCell=o,exports.useSortableHeaderKeyboardDrag=a;
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import { CSSProperties, ReactNode } from 'react';
|
|
1
|
+
import { CSSProperties, KeyboardEvent, ReactNode } from 'react';
|
|
2
|
+
interface SortableHeaderKeyboardDrag {
|
|
3
|
+
setActivatorNodeRef: (element: HTMLElement | null) => void;
|
|
4
|
+
descriptionId: string;
|
|
5
|
+
onKeyDown: (event: KeyboardEvent<HTMLButtonElement>) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare const useSortableHeaderKeyboardDrag: () => SortableHeaderKeyboardDrag | null;
|
|
2
8
|
interface SortableHeaderCellProps {
|
|
3
9
|
id: string;
|
|
4
10
|
/**
|
|
@@ -14,6 +20,8 @@ interface SortableHeaderCellProps {
|
|
|
14
20
|
colSpan?: number;
|
|
15
21
|
/** `as="th"`일 때만 의미. 그룹과 평면 컬럼이 섞일 때 평면 컬럼은 rowSpan=2. */
|
|
16
22
|
rowSpan?: number;
|
|
23
|
+
"aria-sort"?: "ascending" | "descending";
|
|
24
|
+
hasSortButton?: boolean;
|
|
17
25
|
className?: string;
|
|
18
26
|
style?: CSSProperties;
|
|
19
27
|
children: ReactNode;
|
|
@@ -23,5 +31,5 @@ interface SortableHeaderCellProps {
|
|
|
23
31
|
* 5px 임계는 부모 DndContext의 PointerSensor에서 처리해서, 헤더 클릭(정렬)이나
|
|
24
32
|
* 리사이즈 핸들 mousedown은 방해하지 않아요.
|
|
25
33
|
*/
|
|
26
|
-
export declare function SortableHeaderCell({ id, disabled, as, colSpan, rowSpan, className, style, children, }: SortableHeaderCellProps): import("react").JSX.Element;
|
|
34
|
+
export declare function SortableHeaderCell({ id, disabled, as, colSpan, rowSpan, "aria-sort": ariaSort, hasSortButton, className, style, children, }: SortableHeaderCellProps): import("react").JSX.Element;
|
|
27
35
|
export {};
|
|
@@ -1,30 +1,58 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { createContext as e, useContext as t, useId as n } from "react";
|
|
2
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
3
|
+
import { useSortable as a } from "@dnd-kit/sortable";
|
|
4
|
+
import { CSS as o } from "@dnd-kit/utilities";
|
|
4
5
|
//#region src/components/table/components/SortableHeaderCell.tsx
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
} : {},
|
|
24
|
-
...
|
|
25
|
-
|
|
26
|
-
|
|
6
|
+
var s = e(null), c = () => t(s);
|
|
7
|
+
function l({ id: e, disabled: t = !1, as: c = "div", colSpan: l, rowSpan: u, "aria-sort": d, hasSortButton: f = !1, className: p, style: m, children: h }) {
|
|
8
|
+
let { setNodeRef: g, setActivatorNodeRef: _, attributes: v, listeners: y, transform: b, transition: x, isDragging: S } = a({
|
|
9
|
+
id: e,
|
|
10
|
+
disabled: t
|
|
11
|
+
}), C = n(), w = !t && f ? {
|
|
12
|
+
setActivatorNodeRef: _,
|
|
13
|
+
descriptionId: C,
|
|
14
|
+
onKeyDown: (e) => {
|
|
15
|
+
S || !e.shiftKey && (e.code === "Space" || e.code === "Enter") && e.stopPropagation();
|
|
16
|
+
}
|
|
17
|
+
} : null, T = {
|
|
18
|
+
...m,
|
|
19
|
+
transform: o.Translate.toString(b),
|
|
20
|
+
transition: x,
|
|
21
|
+
opacity: S ? .5 : 1,
|
|
22
|
+
cursor: t ? void 0 : "grab"
|
|
23
|
+
}, E = c, D = c === "th" ? {
|
|
24
|
+
...l === void 0 ? {} : { colSpan: l },
|
|
25
|
+
...u === void 0 ? {} : { rowSpan: u }
|
|
26
|
+
} : {};
|
|
27
|
+
return /* @__PURE__ */ r(s.Provider, {
|
|
28
|
+
value: w,
|
|
29
|
+
children: /* @__PURE__ */ i(E, {
|
|
30
|
+
ref: g,
|
|
31
|
+
className: p,
|
|
32
|
+
style: T,
|
|
33
|
+
...D,
|
|
34
|
+
...t ? {} : f ? {
|
|
35
|
+
...v,
|
|
36
|
+
tabIndex: void 0,
|
|
37
|
+
"aria-roledescription": void 0,
|
|
38
|
+
"aria-describedby": void 0,
|
|
39
|
+
"aria-disabled": void 0,
|
|
40
|
+
"aria-pressed": void 0
|
|
41
|
+
} : v,
|
|
42
|
+
...t ? {} : y,
|
|
43
|
+
onKeyDown: t ? void 0 : (e) => {
|
|
44
|
+
(!f || e.code === "Space") && y?.onKeyDown?.(e);
|
|
45
|
+
},
|
|
46
|
+
role: c === "th" ? "columnheader" : t ? void 0 : v.role,
|
|
47
|
+
"aria-sort": d,
|
|
48
|
+
children: [h, w && /* @__PURE__ */ r("span", {
|
|
49
|
+
id: C,
|
|
50
|
+
"aria-hidden": "true",
|
|
51
|
+
className: "sr-only",
|
|
52
|
+
children: "Shift+Space로 컬럼 이동을 시작하고 화살표로 이동한 뒤 Space 또는 Enter로 놓습니다."
|
|
53
|
+
})]
|
|
54
|
+
})
|
|
27
55
|
});
|
|
28
56
|
}
|
|
29
57
|
//#endregion
|
|
30
|
-
export {
|
|
58
|
+
export { l as SortableHeaderCell, c as useSortableHeaderKeyboardDrag };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function e(e,t,n=`tri`){return e?.key!==t||e.direction===null?{key:t,direction:`asc`}:e.direction===`asc`?{key:t,direction:`desc`}:n===`toggle`?{key:t,direction:`asc`}:null}function t(e,t){return e?.key===t?e.direction:null}function n(e){return e===`asc`?`ascending`:e===`desc`?`descending`:void 0}exports.ariaSort=n,exports.nextSort=e,exports.sortDirectionFor=t;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ColumnSort, SortDirection } from '../types.js';
|
|
2
|
+
export type SortCycle = "tri" | "toggle";
|
|
3
|
+
export declare function nextSort(current: ColumnSort | null, key: string, cycle?: SortCycle): ColumnSort | null;
|
|
4
|
+
export declare function sortDirectionFor(sort: ColumnSort | null, key: string): SortDirection;
|
|
5
|
+
export declare function ariaSort(direction: SortDirection): "ascending" | "descending" | undefined;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//#region src/components/table/hooks/sort-state.ts
|
|
2
|
+
function e(e, t, n = "tri") {
|
|
3
|
+
return e?.key !== t || e.direction === null ? {
|
|
4
|
+
key: t,
|
|
5
|
+
direction: "asc"
|
|
6
|
+
} : e.direction === "asc" ? {
|
|
7
|
+
key: t,
|
|
8
|
+
direction: "desc"
|
|
9
|
+
} : n === "toggle" ? {
|
|
10
|
+
key: t,
|
|
11
|
+
direction: "asc"
|
|
12
|
+
} : null;
|
|
13
|
+
}
|
|
14
|
+
function t(e, t) {
|
|
15
|
+
return e?.key === t ? e.direction : null;
|
|
16
|
+
}
|
|
17
|
+
function n(e) {
|
|
18
|
+
return e === "asc" ? "ascending" : e === "desc" ? "descending" : void 0;
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
export { n as ariaSort, e as nextSort, t as sortDirectionFor };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
const e=require("./sort-state.cjs");let t=require("react");function n({initialSort:n,serverSide:r=!1,onSort:i,cycle:a=`tri`}={}){let[o,s]=(0,t.useState)(n||null);return{sort:o,handleSort:(0,t.useCallback)(t=>{let n=e.nextSort(o,t,a);s(n),r&&i&&i(n)},[o,r,i,a]),sortedData:(0,t.useCallback)((e,t)=>!o||!o.direction||r?e:[...e].sort((e,n)=>{let r=t(e,o.key),i=t(n,o.key);if(r==null&&i==null)return 0;if(r==null)return 1;if(i==null)return-1;if(typeof r==`number`&&typeof i==`number`)return o.direction===`asc`?r-i:i-r;let a=String(r),s=String(i),c=a.localeCompare(s,`ko`,{numeric:!0});return o.direction===`asc`?c:-c}),[o,r])}}exports.useTableSort=n;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ColumnSort } from '../types.js';
|
|
2
|
+
import { SortCycle } from './sort-state.js';
|
|
2
3
|
/**
|
|
3
4
|
* 테이블 정렬 훅 옵션
|
|
4
5
|
*/
|
|
@@ -15,7 +16,9 @@ export interface UseTableSortOptions {
|
|
|
15
16
|
/**
|
|
16
17
|
* 서버 사이드 정렬 콜백
|
|
17
18
|
*/
|
|
18
|
-
onSort?: (sort: ColumnSort) => void;
|
|
19
|
+
onSort?: (sort: ColumnSort | null) => void;
|
|
20
|
+
/** 정렬 순서. tri는 오름차순 → 내림차순 → 해제, toggle은 두 방향만 순환한다. */
|
|
21
|
+
cycle?: SortCycle;
|
|
19
22
|
}
|
|
20
23
|
/**
|
|
21
24
|
* 테이블 정렬 훅 반환값
|
|
@@ -32,7 +35,7 @@ export interface UseTableSortReturn {
|
|
|
32
35
|
/**
|
|
33
36
|
* 정렬된 데이터 (클라이언트 사이드 정렬 시)
|
|
34
37
|
*/
|
|
35
|
-
sortedData: <T>(data: T[], getValue: (row: T, key: string) =>
|
|
38
|
+
sortedData: <T>(data: T[], getValue: (row: T, key: string) => unknown) => T[];
|
|
36
39
|
}
|
|
37
40
|
/**
|
|
38
41
|
* 테이블 정렬 훅
|
|
@@ -44,4 +47,4 @@ export interface UseTableSortReturn {
|
|
|
44
47
|
* });
|
|
45
48
|
* ```
|
|
46
49
|
*/
|
|
47
|
-
export declare function useTableSort({ initialSort, serverSide, onSort, }?: UseTableSortOptions): UseTableSortReturn;
|
|
50
|
+
export declare function useTableSort({ initialSort, serverSide, onSort, cycle, }?: UseTableSortOptions): UseTableSortReturn;
|
|
@@ -1,30 +1,29 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { nextSort as e } from "./sort-state.esm.js";
|
|
2
|
+
import { useCallback as t, useState as n } from "react";
|
|
2
3
|
//#region src/components/table/hooks/useTableSort.ts
|
|
3
|
-
function
|
|
4
|
-
let [
|
|
4
|
+
function r({ initialSort: r, serverSide: i = !1, onSort: a, cycle: o = "tri" } = {}) {
|
|
5
|
+
let [s, c] = n(r || null);
|
|
5
6
|
return {
|
|
6
|
-
sort:
|
|
7
|
-
handleSort:
|
|
8
|
-
let
|
|
9
|
-
|
|
10
|
-
direction: a?.key === e ? a.direction === "asc" ? "desc" : a.direction === "desc" ? null : "asc" : "asc"
|
|
11
|
-
}, n = t.direction === null ? null : t;
|
|
12
|
-
o(n), r && i && n && i(n);
|
|
7
|
+
sort: s,
|
|
8
|
+
handleSort: t((t) => {
|
|
9
|
+
let n = e(s, t, o);
|
|
10
|
+
c(n), i && a && a(n);
|
|
13
11
|
}, [
|
|
12
|
+
s,
|
|
13
|
+
i,
|
|
14
14
|
a,
|
|
15
|
-
|
|
16
|
-
i
|
|
15
|
+
o
|
|
17
16
|
]),
|
|
18
|
-
sortedData:
|
|
19
|
-
let r = t(e,
|
|
17
|
+
sortedData: t((e, t) => !s || !s.direction || i ? e : [...e].sort((e, n) => {
|
|
18
|
+
let r = t(e, s.key), i = t(n, s.key);
|
|
20
19
|
if (r == null && i == null) return 0;
|
|
21
20
|
if (r == null) return 1;
|
|
22
21
|
if (i == null) return -1;
|
|
23
|
-
if (typeof r == "number" && typeof i == "number") return
|
|
24
|
-
let
|
|
25
|
-
return
|
|
26
|
-
}), [
|
|
22
|
+
if (typeof r == "number" && typeof i == "number") return s.direction === "asc" ? r - i : i - r;
|
|
23
|
+
let a = String(r), o = String(i), c = a.localeCompare(o, "ko", { numeric: !0 });
|
|
24
|
+
return s.direction === "asc" ? c : -c;
|
|
25
|
+
}), [s, i])
|
|
27
26
|
};
|
|
28
27
|
}
|
|
29
28
|
//#endregion
|
|
30
|
-
export {
|
|
29
|
+
export { r as useTableSort };
|
|
@@ -2,6 +2,8 @@ import { PaginatedTableProps } from './types.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* PaginatedTable — Table 코어를 래핑해 페이지네이션 footer를 추가한 변형.
|
|
4
4
|
* Table 본체 로직(헤더 정렬·리사이즈·grip, 본문 스트라이프·선택·sticky, 컬럼 프리셋)은 Table에 그대로 위임한다.
|
|
5
|
+
* 클라이언트 정렬은 전달된 현재 페이지 데이터만 정렬한다. 서버 페이지네이션이면 serverSideSorting을 사용하고,
|
|
6
|
+
* 정렬 변경 시 페이지 초기화는 호출부에서 처리한다.
|
|
5
7
|
*/
|
|
6
8
|
export declare const PaginatedTable: <T>(props: PaginatedTableProps<T> & {
|
|
7
9
|
ref?: React.ForwardedRef<HTMLDivElement>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=require("../../lib/utils.cjs"),t=require("../../node_modules/lucide-react/dist/esm/icons/grip-vertical.cjs"),n=require("../loading-spinner/LoadingSpinner.cjs"),r=require("../table-checkbox/TableCheckbox.cjs"),i=require("./column-group-utils.cjs"),a=require("./components/SortableHeaderCell.cjs"),o=require("./hooks/useColumnResize.cjs"),ee=require("../../hooks/useFillEmptyRows.cjs"),te=require("../../hooks/useTableDragSelection.cjs"),ne=require("./hooks/useTableSort.cjs"),s=require("./utils.cjs");let c=require("react"),l=require("react/jsx-runtime"),u=require("@dnd-kit/core"),d=require("@dnd-kit/sortable");var re=({transform:e,draggingNodeRect:t,containerNodeRect:n})=>{let r={...e,y:0};if(!t||!n)return r;let i=n.left-t.left,a=n.right-t.right;return r.x=Math.min(Math.max(r.x,i),a),r},f=(0,c.forwardRef)((f,p)=>{let{data:m,columns:h,columnGroups:g,rowHeight:_,loading:ie=!1,isFetching:v=!1,emptyMessage:ae=`데이터가 없어요`,onRowClick:y,selectedRows:b=[],onRowSelect:x,enableRowSelection:S=!1,enableSelectAll:C=!1,rowCompare:w,getRowId:T,enableSorting:E=!1,serverSideSorting:D=!1,onSortChange:oe,initialSort:se,variant:ce=`default`,size:le=`medium`,stickyHeader:O=!0,height:k,maxHeight:A,storageKey:ue,columnState:j,fillEmptyRows:M=!0,totalElements:N,footerSlot:de,className:P=``,"data-testid":F,...I}=f,{sort:fe,sortedData:L}=ne.useTableSort({initialSort:se,serverSide:D,onSort:oe||void 0}),R=(0,c.useMemo)(()=>!E||D?m:L(m,(e,t)=>{let n=h.find(e=>e.key===t);if(n?.accessor){let r=n.accessor(e);return typeof r==`string`||typeof r==`number`?r:e[t]}return e[t]}),[m,E,D,fe,L,h]),z=(0,c.useRef)(null),B=(0,c.useRef)(null),V=(0,c.useRef)(null),H=(0,c.useRef)(null),U=!!j,pe=(0,u.useSensors)((0,u.useSensor)(u.PointerSensor,{activationConstraint:{distance:5}}),(0,u.useSensor)(u.KeyboardSensor,{coordinateGetter:d.sortableKeyboardCoordinates})),W=(0,c.useMemo)(()=>i.buildColumnSlots(h,g),[h,g]),G=(0,c.useMemo)(()=>{if(!j)return W.filter(e=>!(e.kind===`column`&&e.leafColumns[0].hidden));let e=new Set(j.hiddenColumns);return i.applyColumnState(W,j.columnOrder,e)},[W,j]),K=(0,c.useMemo)(()=>i.flattenLeafColumns(G),[G]),q=(0,c.useMemo)(()=>i.hasGroupSlot(G),[G]),me=(0,c.useMemo)(()=>new Map(W.map(e=>[e.key,e])),[W]),he=e=>{let{active:t,over:n}=e;if(!j||!n||t.id===n.id)return;let r=me.get(String(n.id));if(r?.kind===`column`&&r.leafColumns[0].excludeFromPreset)return;let i=j.columnOrder,a=i.indexOf(String(t.id)),o=i.indexOf(String(n.id));a===-1||o===-1||j.onColumnOrderChange((0,d.arrayMove)(i,a,o))},{handleMouseDown:ge,handleDoubleClick:_e,getColumnWidth:J,measureRef:ve}=o.useColumnResize({columns:K,data:R,getCellContent:(e,t)=>{let n=K.find(e=>e.key===t);return n?.accessor?n.accessor(e):e[t]},tableRef:z,...j?{controlledWidths:j.columnWidths,onColumnWidthsChange:j.onColumnWidthsChange}:{storageKey:ue}}),ye=s.getTableBaseClasses(),be=s.getTableVariantClasses(ce),xe=s.getTableSizeClasses(le),Y=S&&C?48:0,Se=(0,c.useMemo)(()=>K.reduce((e,t)=>{let n=J(t.key,t.width),r=parseFloat(n);return e+(Number.isFinite(r)?r:0)},0)+Y,[K,J,Y]),X=(0,c.useMemo)(()=>{let e={};return k&&(e.height=typeof k==`number`?`${k}px`:k),A&&(e.maxHeight=typeof A==`number`?`${A}px`:A),e},[k,A]),{emptyRowCount:Ce,measuredRowHeight:we}=ee.useFillEmptyRows({enabled:M,containerRef:B,theadRef:V,tbodyRef:H,excludeRowsSelector:`tr:not([data-empty-row])`,remainingMode:`sum-real-rows`,deps:[R,K]}),Z=e=>!S||b.length===0?!1:w?b.some(t=>w(t,e)):b.some(t=>t===e),Te=(0,c.useMemo)(()=>!S||!C||R.length===0?!1:R.every(e=>Z(e)),[S,C,R,Z]),Ee=()=>{!S||!x||(Te?R.forEach(e=>{Z(e)&&x(e,!1)}):R.forEach(e=>{Z(e)||x(e,!0)}))},Q=S&&!!x&&!!T,$=te.useTableDragSelection({rows:R,getRowId:T??(()=>-1),isSelected:e=>Z(e),setSelected:(e,t)=>x?.(e,t),enabled:Q,scrollContainerRef:B}),De=(t,n)=>{let r=[s.getStripedRowClasses(n)];return Z(t)&&r.push(s.getSelectedRowClasses()),y&&r.push(s.getHoverableRowClasses()),e.cn(r)};return ie?(0,l.jsx)(`div`,{ref:p,className:e.cn(`flex items-center justify-center p-8 flex-1`,P),style:X,"data-testid":F,...I,children:(0,l.jsx)(n.LoadingSpinner,{message:`데이터를 불러오는 중이에요...`,className:`min-h-0`})}):(0,l.jsxs)(`div`,{ref:p,className:e.cn(`isolate relative flex flex-col min-h-0 gap-4 md:gap-5 xl:gap-6`,P),style:X,"data-testid":F,...I,children:[(0,l.jsx)(`div`,{ref:ve,className:`absolute invisible whitespace-nowrap`,style:{top:`-9999px`,left:`-9999px`}}),(0,l.jsxs)(`div`,{className:`flex flex-1 flex-col min-h-0 gap-4 md:gap-5 xl:gap-6`,children:[(0,l.jsxs)(`div`,{className:`relative flex flex-1 flex-col min-h-0`,children:[(0,l.jsx)(`div`,{className:e.cn(`pointer-events-none absolute inset-0 z-30 flex items-center justify-center bg-bg-surface/60 backdrop-blur-[2px] transition-opacity duration-150`,v?`opacity-100`:`opacity-0`),...v?{role:`status`,"aria-live":`polite`}:{"aria-hidden":!0},children:(0,l.jsx)(n.LoadingSpinner,{message:``,className:`min-h-0`})}),(0,l.jsx)(`div`,{ref:B,className:`scrollbar-table overflow-auto flex-1 bg-bg-page`,children:R.length===0?(0,l.jsx)(`div`,{className:`flex items-center justify-center p-8 h-full`,children:(0,l.jsx)(`p`,{className:`text-fg-muted`,children:ae})}):(0,l.jsx)(u.DndContext,{sensors:pe,collisionDetection:u.closestCenter,onDragEnd:he,modifiers:[re],children:(0,l.jsxs)(`table`,{ref:z,className:e.cn(ye,be,xe),style:{tableLayout:`fixed`,minWidth:`100%`,width:`${Se}px`},children:[(0,l.jsxs)(`colgroup`,{children:[S&&C&&(0,l.jsx)(`col`,{style:{width:`48px`}}),K.map(e=>(0,l.jsx)(`col`,{"data-col-key":e.key,style:{width:J(e.key,e.width)}},e.key))]}),(0,l.jsxs)(`thead`,{ref:V,className:s.getTableHeaderClasses(),style:{position:O?`sticky`:`relative`,top:O?0:void 0,zIndex:O?20:void 0},children:[(0,l.jsxs)(`tr`,{children:[S&&C&&(0,l.jsx)(`th`,{rowSpan:q?2:1,className:e.cn(s.getTableHeaderCellClasses(),s.getColumnAlignClasses(`center`),`w-12 px-0`),children:(0,l.jsx)(`div`,{className:`flex items-center justify-center`,children:(0,l.jsx)(r.TableCheckbox,{checked:Te,onChange:()=>Ee(),ariaLabel:`전체 선택`})})}),(0,l.jsx)(d.SortableContext,{items:G.map(e=>e.key),strategy:d.horizontalListSortingStrategy,children:G.map(n=>{if(n.kind===`group`)return(0,l.jsxs)(a.SortableHeaderCell,{id:n.key,disabled:!U,as:`th`,colSpan:n.leafColumns.length,className:e.cn(s.getTableHeaderCellClasses(),s.getColumnAlignClasses(`center`),`group/header-cell relative`,n.hideOnMobile&&`hidden md:table-cell`),children:[U&&(0,l.jsx)(`span`,{className:`absolute left-0.5 top-1/2 -translate-y-1/2 text-fg-subtle opacity-0 transition-opacity group-hover/header-cell:opacity-100`,"aria-hidden":`true`,children:(0,l.jsx)(t.GripVertical,{className:`h-3.5 w-3.5`})}),(0,l.jsx)(`div`,{className:`flex items-center justify-center w-full pr-1 pl-3 select-none`,children:(0,l.jsx)(`span`,{children:n.header})})]},n.key);let r=n.leafColumns[0],i=!U||r.excludeFromPreset===!0;return(0,l.jsxs)(a.SortableHeaderCell,{id:r.key,disabled:i,as:`th`,rowSpan:q?2:1,className:e.cn(s.getTableHeaderCellClasses(),s.getColumnAlignClasses(`center`),`group/header-cell relative`,r.sticky&&`sticky left-0 z-20 bg-bg-table-header`,r.hideOnMobile&&`hidden md:table-cell`),style:{width:J(r.key,r.width),minWidth:r.minWidth||50},children:[!i&&(0,l.jsx)(`span`,{className:`absolute left-0.5 top-1/2 -translate-y-1/2 text-fg-subtle opacity-0 transition-opacity group-hover/header-cell:opacity-100`,"aria-hidden":`true`,children:(0,l.jsx)(t.GripVertical,{className:`h-3.5 w-3.5`})}),(0,l.jsx)(`div`,{className:`flex items-center justify-center w-full pr-1 pl-3 select-none`,children:(0,l.jsx)(`span`,{children:r.header})}),r.excludeFromPreset!==!0&&(0,l.jsx)(`div`,{className:`group/resize absolute right-0 top-0 h-full w-3 cursor-col-resize z-50 flex items-center justify-center`,onPointerDown:e=>e.stopPropagation(),onMouseDown:e=>{e.preventDefault(),e.stopPropagation(),ge(r.key,e)},onDoubleClick:e=>{e.preventDefault(),e.stopPropagation(),_e(r.key,e)},onClick:e=>{e.preventDefault(),e.stopPropagation()},style:{touchAction:`none`},title:`드래그하여 너비 조절, 더블 클릭하여 자동 조절`,children:(0,l.jsx)(`span`,{"aria-hidden":`true`,className:`h-1/2 w-0.5 rounded-full bg-transparent transition-colors group-hover/header-cell:bg-border-default group-hover/resize:!bg-primary group-active/resize:!bg-primary-hover`})})]},r.key)})})]}),q&&(0,l.jsx)(`tr`,{children:G.filter(e=>e.kind===`group`).flatMap(e=>e.leafColumns).map(t=>(0,l.jsx)(`th`,{className:e.cn(s.getTableHeaderCellClasses(),s.getColumnAlignClasses(t.align??`center`),t.hideOnMobile&&`hidden md:table-cell`),style:{width:J(t.key,t.width),minWidth:t.minWidth||50},children:(0,l.jsx)(`div`,{className:`flex items-center justify-center w-full pr-1 pl-3 select-none`,children:(0,l.jsx)(`span`,{children:t.header})})},t.key))})]}),(0,l.jsxs)(`tbody`,{ref:H,children:[R.map((t,n)=>{let i=Z(t);return(0,l.jsxs)(`tr`,{className:De(t,n),onClick:()=>y?.(t,n),style:_?{height:`${_}px`}:void 0,children:[S&&C&&(0,l.jsx)(`td`,{className:e.cn(s.getTableCellClasses(),s.getColumnAlignClasses(`center`),`w-12 select-none`),onClick:e=>e.stopPropagation(),onMouseDown:Q?e=>{e.preventDefault(),$.onRowMouseDown(n)}:void 0,onMouseEnter:Q?()=>$.onRowMouseEnter(n):void 0,children:(0,l.jsx)(`div`,{className:`flex items-center justify-center`,children:(0,l.jsx)(r.TableCheckbox,{checked:i,onChange:e=>x?.(t,e),pointerEventsNone:Q,ariaLabel:`행 선택`})})}),K.map(n=>{let r=n.accessor?n.accessor(t):t[n.key];return(0,l.jsx)(`td`,{className:e.cn(s.getTableCellClasses(),s.getColumnAlignClasses(n.align),n.sticky&&`sticky left-0 z-10 bg-inherit`,n.hideOnMobile&&`hidden md:table-cell`),style:{width:J(n.key,n.width),minWidth:n.minWidth||50,..._?{height:`${_}px`,maxHeight:`${_}px`,overflow:`hidden`}:{}},children:r},n.key)})]},n)}),M&&Array.from({length:Ce}).map((t,n)=>{let r=R.length+n,i=_??we??void 0;return(0,l.jsxs)(`tr`,{"data-empty-row":!0,"aria-hidden":`true`,className:s.getStripedRowClasses(r),style:i?{height:`${i}px`}:void 0,children:[S&&C&&(0,l.jsx)(`td`,{className:e.cn(s.getTableCellClasses(),`w-12`),style:i?{height:`${i}px`}:void 0}),K.map(t=>(0,l.jsx)(`td`,{className:e.cn(s.getTableCellClasses(),t.hideOnMobile&&`hidden md:table-cell`),style:{width:J(t.key,t.width),minWidth:t.minWidth||50,...i?{height:`${i}px`}:{}}},t.key))]},`empty-${n}`)})]})]})})})]}),de??(N===void 0?null:(0,l.jsx)(`div`,{className:`flex justify-end shrink-0 text-sm text-fg-muted`,children:(0,l.jsxs)(`span`,{children:[`총 `,N.toLocaleString(),`건`]})}))]})]})});f.displayName=`Table`,exports.Table=f;
|
|
1
|
+
const e=require("../../lib/utils.cjs"),t=require("../../node_modules/lucide-react/dist/esm/icons/grip-vertical.cjs"),n=require("../loading-spinner/LoadingSpinner.cjs"),r=require("../table-checkbox/TableCheckbox.cjs"),i=require("./column-group-utils.cjs"),a=require("./components/SortableHeaderCell.cjs"),o=require("./components/SortHeader.cjs"),s=require("./hooks/sort-state.cjs"),ee=require("./hooks/useColumnResize.cjs"),te=require("../../hooks/useFillEmptyRows.cjs"),ne=require("../../hooks/useTableDragSelection.cjs"),re=require("./hooks/useTableSort.cjs"),c=require("./utils.cjs");let l=require("react"),u=require("react/jsx-runtime"),d=require("@dnd-kit/core"),f=require("@dnd-kit/sortable");var ie=({transform:e,draggingNodeRect:t,containerNodeRect:n})=>{let r={...e,y:0};if(!t||!n)return r;let i=n.left-t.left,a=n.right-t.right;return r.x=Math.min(Math.max(r.x,i),a),r},p=(0,l.forwardRef)((p,m)=>{let{data:h,columns:g,columnGroups:ae,rowHeight:_,loading:oe=!1,isFetching:v=!1,emptyMessage:se=`데이터가 없어요`,onRowClick:y,selectedRows:b=[],onRowSelect:x,enableRowSelection:S=!1,enableSelectAll:C=!1,rowCompare:ce,getRowId:le,enableSorting:w=!1,sortCycle:ue=`tri`,formatSortLabel:de,serverSideSorting:T=!1,onSortChange:fe,initialSort:pe,variant:me=`default`,size:he=`medium`,stickyHeader:E=!0,height:D,maxHeight:O,storageKey:ge,columnState:k,fillEmptyRows:A=!0,totalElements:j,footerSlot:_e,className:M=``,"data-testid":N,...P}=p,{sort:F,sortedData:I,handleSort:ve}=re.useTableSort({initialSort:pe,cycle:ue,serverSide:T,onSort:fe||void 0}),L=e=>!!(e.sortable&&(w||T)),R=e=>L(e)?s.ariaSort(s.sortDirectionFor(F,e.key)):void 0,z=e=>{if(!L(e))return(0,u.jsx)(`span`,{children:e.header});let t=s.sortDirectionFor(F,e.key),n=s.nextSort(F,e.key,ue)?.direction??null;return(0,u.jsx)(o.SortHeader,{current:t,label:de?.(e,t,n),onSort:()=>ve(e.key),children:e.header})},B=(0,l.useMemo)(()=>!w||T?h:I(h,(e,t)=>{let n=g.find(e=>e.key===t);if(n?.accessor){let r=n.accessor(e);return typeof r==`string`||typeof r==`number`?r:e[t]}return e[t]}),[h,w,T,F,I,g]),V=(0,l.useRef)(null),H=(0,l.useRef)(null),U=(0,l.useRef)(null),ye=(0,l.useRef)(null),W=!!k,be=(0,d.useSensors)((0,d.useSensor)(d.PointerSensor,{activationConstraint:{distance:5}}),(0,d.useSensor)(d.KeyboardSensor,{coordinateGetter:f.sortableKeyboardCoordinates})),G=(0,l.useMemo)(()=>i.buildColumnSlots(g,ae),[g,ae]),K=(0,l.useMemo)(()=>{if(!k)return G.filter(e=>!(e.kind===`column`&&e.leafColumns[0].hidden));let e=new Set(k.hiddenColumns);return i.applyColumnState(G,k.columnOrder,e)},[G,k]),q=(0,l.useMemo)(()=>i.flattenLeafColumns(K),[K]),J=(0,l.useMemo)(()=>i.hasGroupSlot(K),[K]),xe=(0,l.useMemo)(()=>new Map(G.map(e=>[e.key,e])),[G]),Se=e=>{let{active:t,over:n}=e;if(!k||!n||t.id===n.id)return;let r=xe.get(String(n.id));if(r?.kind===`column`&&r.leafColumns[0].excludeFromPreset)return;let i=k.columnOrder,a=i.indexOf(String(t.id)),o=i.indexOf(String(n.id));a===-1||o===-1||k.onColumnOrderChange((0,f.arrayMove)(i,a,o))},{handleMouseDown:Ce,handleDoubleClick:we,getColumnWidth:Y,measureRef:Te}=ee.useColumnResize({columns:q,data:B,getCellContent:(e,t)=>{let n=q.find(e=>e.key===t);return n?.accessor?n.accessor(e):e[t]},tableRef:V,...k?{controlledWidths:k.columnWidths,onColumnWidthsChange:k.onColumnWidthsChange}:{storageKey:ge}}),Ee=c.getTableBaseClasses(),De=c.getTableVariantClasses(me),Oe=c.getTableSizeClasses(he),ke=S&&C?48:0,Ae=(0,l.useMemo)(()=>q.reduce((e,t)=>{let n=Y(t.key,t.width),r=parseFloat(n);return e+(Number.isFinite(r)?r:0)},0)+ke,[q,Y,ke]),X=(0,l.useMemo)(()=>{let e={};return D&&(e.height=typeof D==`number`?`${D}px`:D),O&&(e.maxHeight=typeof O==`number`?`${O}px`:O),e},[D,O]),{emptyRowCount:je,measuredRowHeight:Me}=te.useFillEmptyRows({enabled:A,containerRef:H,theadRef:U,tbodyRef:ye,excludeRowsSelector:`tr:not([data-empty-row])`,remainingMode:`sum-real-rows`,deps:[B,q]}),Z=e=>!S||b.length===0?!1:ce?b.some(t=>ce(t,e)):b.some(t=>t===e),Ne=(0,l.useMemo)(()=>!S||!C||B.length===0?!1:B.every(e=>Z(e)),[S,C,B,Z]),Pe=()=>{!S||!x||(Ne?B.forEach(e=>{Z(e)&&x(e,!1)}):B.forEach(e=>{Z(e)||x(e,!0)}))},Q=S&&!!x&&!!le,$=ne.useTableDragSelection({rows:B,getRowId:le??(()=>-1),isSelected:e=>Z(e),setSelected:(e,t)=>x?.(e,t),enabled:Q,scrollContainerRef:H}),Fe=(t,n)=>{let r=[c.getStripedRowClasses(n)];return Z(t)&&r.push(c.getSelectedRowClasses()),y&&r.push(c.getHoverableRowClasses()),e.cn(r)};return oe?(0,u.jsx)(`div`,{ref:m,className:e.cn(`flex items-center justify-center p-8 flex-1`,M),style:X,"data-testid":N,...P,children:(0,u.jsx)(n.LoadingSpinner,{message:`데이터를 불러오는 중이에요...`,className:`min-h-0`})}):(0,u.jsxs)(`div`,{ref:m,className:e.cn(`isolate relative flex flex-col min-h-0 gap-4 md:gap-5 xl:gap-6`,M),style:X,"data-testid":N,...P,children:[(0,u.jsx)(`div`,{ref:Te,className:`absolute invisible whitespace-nowrap`,style:{top:`-9999px`,left:`-9999px`}}),(0,u.jsxs)(`div`,{className:`flex flex-1 flex-col min-h-0 gap-4 md:gap-5 xl:gap-6`,children:[(0,u.jsxs)(`div`,{className:`relative flex flex-1 flex-col min-h-0`,children:[(0,u.jsx)(`div`,{className:e.cn(`pointer-events-none absolute inset-0 z-30 flex items-center justify-center bg-bg-surface/60 backdrop-blur-[2px] transition-opacity duration-150`,v?`opacity-100`:`opacity-0`),...v?{role:`status`,"aria-live":`polite`}:{"aria-hidden":!0},children:(0,u.jsx)(n.LoadingSpinner,{message:``,className:`min-h-0`})}),(0,u.jsx)(`div`,{ref:H,className:`scrollbar-table overflow-auto flex-1 bg-bg-page`,children:B.length===0?(0,u.jsx)(`div`,{className:`flex items-center justify-center p-8 h-full`,children:(0,u.jsx)(`p`,{className:`text-fg-muted`,children:se})}):(0,u.jsx)(d.DndContext,{sensors:be,collisionDetection:d.closestCenter,onDragEnd:Se,modifiers:[ie],children:(0,u.jsxs)(`table`,{ref:V,className:e.cn(Ee,De,Oe),style:{tableLayout:`fixed`,minWidth:`100%`,width:`${Ae}px`},children:[(0,u.jsxs)(`colgroup`,{children:[S&&C&&(0,u.jsx)(`col`,{style:{width:`48px`}}),q.map(e=>(0,u.jsx)(`col`,{"data-col-key":e.key,style:{width:Y(e.key,e.width)}},e.key))]}),(0,u.jsxs)(`thead`,{ref:U,className:c.getTableHeaderClasses(),style:{position:E?`sticky`:`relative`,top:E?0:void 0,zIndex:E?20:void 0},children:[(0,u.jsxs)(`tr`,{children:[S&&C&&(0,u.jsx)(`th`,{rowSpan:J?2:1,className:e.cn(c.getTableHeaderCellClasses(),c.getColumnAlignClasses(`center`),`w-12 px-0`),children:(0,u.jsx)(`div`,{className:`flex items-center justify-center`,children:(0,u.jsx)(r.TableCheckbox,{checked:Ne,onChange:()=>Pe(),ariaLabel:`전체 선택`})})}),(0,u.jsx)(f.SortableContext,{items:K.map(e=>e.key),strategy:f.horizontalListSortingStrategy,children:K.map(n=>{if(n.kind===`group`)return(0,u.jsxs)(a.SortableHeaderCell,{id:n.key,disabled:!W,as:`th`,colSpan:n.leafColumns.length,className:e.cn(c.getTableHeaderCellClasses(),c.getColumnAlignClasses(`center`),`group/header-cell relative`,n.hideOnMobile&&`hidden md:table-cell`),children:[W&&(0,u.jsx)(`span`,{className:`absolute left-0.5 top-1/2 -translate-y-1/2 text-fg-subtle opacity-0 transition-opacity group-hover/header-cell:opacity-100`,"aria-hidden":`true`,children:(0,u.jsx)(t.GripVertical,{className:`h-3.5 w-3.5`})}),(0,u.jsx)(`div`,{className:`flex items-center justify-center w-full pr-1 pl-3 select-none`,children:(0,u.jsx)(`span`,{children:n.header})})]},n.key);let r=n.leafColumns[0],i=!W||r.excludeFromPreset===!0;return(0,u.jsxs)(a.SortableHeaderCell,{id:r.key,disabled:i,as:`th`,"aria-sort":R(r),hasSortButton:L(r),rowSpan:J?2:1,className:e.cn(c.getTableHeaderCellClasses(),c.getColumnAlignClasses(`center`),`group/header-cell relative`,r.sticky&&`sticky left-0 z-20 bg-bg-table-header`,r.hideOnMobile&&`hidden md:table-cell`),style:{width:Y(r.key,r.width),minWidth:r.minWidth||50},children:[!i&&(0,u.jsx)(`span`,{className:`absolute left-0.5 top-1/2 -translate-y-1/2 text-fg-subtle opacity-0 transition-opacity group-hover/header-cell:opacity-100`,"aria-hidden":`true`,children:(0,u.jsx)(t.GripVertical,{className:`h-3.5 w-3.5`})}),(0,u.jsx)(`div`,{className:`flex items-center justify-center w-full pr-1 pl-3 select-none`,children:z(r)}),r.excludeFromPreset!==!0&&(0,u.jsx)(`div`,{className:`group/resize absolute right-0 top-0 h-full w-3 cursor-col-resize z-50 flex items-center justify-center`,onPointerDown:e=>e.stopPropagation(),onMouseDown:e=>{e.preventDefault(),e.stopPropagation(),Ce(r.key,e)},onDoubleClick:e=>{e.preventDefault(),e.stopPropagation(),we(r.key,e)},onClick:e=>{e.preventDefault(),e.stopPropagation()},style:{touchAction:`none`},title:`드래그하여 너비 조절, 더블 클릭하여 자동 조절`,children:(0,u.jsx)(`span`,{"aria-hidden":`true`,className:`h-1/2 w-0.5 rounded-full bg-transparent transition-colors group-hover/header-cell:bg-border-default group-hover/resize:!bg-primary group-active/resize:!bg-primary-hover`})})]},r.key)})})]}),J&&(0,u.jsx)(`tr`,{children:K.filter(e=>e.kind===`group`).flatMap(e=>e.leafColumns).map(t=>(0,u.jsx)(`th`,{"aria-sort":R(t),className:e.cn(c.getTableHeaderCellClasses(),c.getColumnAlignClasses(t.align??`center`),t.hideOnMobile&&`hidden md:table-cell`),style:{width:Y(t.key,t.width),minWidth:t.minWidth||50},children:(0,u.jsx)(`div`,{className:`flex items-center justify-center w-full pr-1 pl-3 select-none`,children:z(t)})},t.key))})]}),(0,u.jsxs)(`tbody`,{ref:ye,children:[B.map((t,n)=>{let i=Z(t);return(0,u.jsxs)(`tr`,{className:Fe(t,n),onClick:()=>y?.(t,n),style:_?{height:`${_}px`}:void 0,children:[S&&C&&(0,u.jsx)(`td`,{className:e.cn(c.getTableCellClasses(),c.getColumnAlignClasses(`center`),`w-12 select-none`),onClick:e=>e.stopPropagation(),onMouseDown:Q?e=>{e.preventDefault(),$.onRowMouseDown(n)}:void 0,onMouseEnter:Q?()=>$.onRowMouseEnter(n):void 0,children:(0,u.jsx)(`div`,{className:`flex items-center justify-center`,children:(0,u.jsx)(r.TableCheckbox,{checked:i,onChange:e=>x?.(t,e),pointerEventsNone:Q,ariaLabel:`행 선택`})})}),q.map(n=>{let r=n.accessor?n.accessor(t):t[n.key];return(0,u.jsx)(`td`,{className:e.cn(c.getTableCellClasses(),c.getColumnAlignClasses(n.align),n.sticky&&`sticky left-0 z-10 bg-inherit`,n.hideOnMobile&&`hidden md:table-cell`),style:{width:Y(n.key,n.width),minWidth:n.minWidth||50,..._?{height:`${_}px`,maxHeight:`${_}px`,overflow:`hidden`}:{}},children:r},n.key)})]},n)}),A&&Array.from({length:je}).map((t,n)=>{let r=B.length+n,i=_??Me??void 0;return(0,u.jsxs)(`tr`,{"data-empty-row":!0,"aria-hidden":`true`,className:c.getStripedRowClasses(r),style:i?{height:`${i}px`}:void 0,children:[S&&C&&(0,u.jsx)(`td`,{className:e.cn(c.getTableCellClasses(),`w-12`),style:i?{height:`${i}px`}:void 0}),q.map(t=>(0,u.jsx)(`td`,{className:e.cn(c.getTableCellClasses(),t.hideOnMobile&&`hidden md:table-cell`),style:{width:Y(t.key,t.width),minWidth:t.minWidth||50,...i?{height:`${i}px`}:{}}},t.key))]},`empty-${n}`)})]})]})})})]}),_e??(j===void 0?null:(0,u.jsx)(`div`,{className:`flex justify-end shrink-0 text-sm text-fg-muted`,children:(0,u.jsxs)(`span`,{children:[`총 `,j.toLocaleString(),`건`]})}))]})]})});p.displayName=`Table`,exports.Table=p;
|
|
@@ -4,6 +4,8 @@ import { TableProps } from './types.js';
|
|
|
4
4
|
*
|
|
5
5
|
* 페이지네이션이 없는 조회 API 또는 페이지네이션 영역을 별도로 렌더하는 경우 사용.
|
|
6
6
|
* PaginatedTable은 이 컴포넌트를 wrap해서 footer(Pagination/PageJump/PageSize)를 추가.
|
|
7
|
+
* 클라이언트 정렬은 전달된 현재 페이지 데이터만 정렬한다. 서버 페이지네이션이면 serverSideSorting을 사용하고,
|
|
8
|
+
* 정렬 변경 시 페이지 초기화는 호출부에서 처리한다.
|
|
7
9
|
* 컬럼 너비 합이 컨테이너보다 작아 열이 늘어나면 브라우저가 남는 폭을 재분배하므로 드래그 이동량과 화면 변화량이 비례하지 않는다. 컬럼 합을 컨테이너 이상으로 지정한다(여백 컬럼이 필요하면 AccordionTable을 쓴다 — Table에는 여백 컬럼 옵션이 없다).
|
|
8
10
|
*/
|
|
9
11
|
export declare const Table: <T>(props: TableProps<T> & {
|