@comitor/ui 1.9.0 → 1.11.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 +15 -4
- package/dist/data-grid/compose-refs.d.ts +19 -0
- package/dist/data-grid/compose-refs.js +41 -0
- package/dist/data-grid/compose-refs.js.map +1 -0
- package/dist/data-grid/data-grid-cell-variants.d.ts +15 -0
- package/dist/data-grid/data-grid-cell-variants.js +1734 -0
- package/dist/data-grid/data-grid-cell-variants.js.map +1 -0
- package/dist/data-grid/data-grid-cell-wrapper.d.ts +9 -0
- package/dist/data-grid/data-grid-cell-wrapper.js +179 -0
- package/dist/data-grid/data-grid-cell-wrapper.js.map +1 -0
- package/dist/data-grid/data-grid-cell.d.ts +8 -0
- package/dist/data-grid/data-grid-cell.js +101 -0
- package/dist/data-grid/data-grid-cell.js.map +1 -0
- package/dist/data-grid/data-grid-column-header.d.ts +12 -0
- package/dist/data-grid/data-grid-column-header.js +205 -0
- package/dist/data-grid/data-grid-column-header.js.map +1 -0
- package/dist/data-grid/data-grid-context-menu.d.ts +12 -0
- package/dist/data-grid/data-grid-context-menu.js +160 -0
- package/dist/data-grid/data-grid-context-menu.js.map +1 -0
- package/dist/data-grid/data-grid-filter-menu.d.ts +12 -0
- package/dist/data-grid/data-grid-filter-menu.js +714 -0
- package/dist/data-grid/data-grid-filter-menu.js.map +1 -0
- package/dist/data-grid/data-grid-keyboard-shortcuts.d.ts +20 -0
- package/dist/data-grid/data-grid-keyboard-shortcuts.js +227 -0
- package/dist/data-grid/data-grid-keyboard-shortcuts.js.map +1 -0
- package/dist/data-grid/data-grid-paste-dialog.d.ts +11 -0
- package/dist/data-grid/data-grid-paste-dialog.js +103 -0
- package/dist/data-grid/data-grid-paste-dialog.js.map +1 -0
- package/dist/data-grid/data-grid-presence.d.ts +14 -0
- package/dist/data-grid/data-grid-presence.js +16 -0
- package/dist/data-grid/data-grid-presence.js.map +1 -0
- package/dist/data-grid/data-grid-row-height-menu.d.ts +15 -0
- package/dist/data-grid/data-grid-row-height-menu.js +56 -0
- package/dist/data-grid/data-grid-row-height-menu.js.map +1 -0
- package/dist/data-grid/data-grid-row.d.ts +28 -0
- package/dist/data-grid/data-grid-row.js +206 -0
- package/dist/data-grid/data-grid-row.js.map +1 -0
- package/dist/data-grid/data-grid-search.d.ts +10 -0
- package/dist/data-grid/data-grid-search.js +183 -0
- package/dist/data-grid/data-grid-search.js.map +1 -0
- package/dist/data-grid/data-grid-select-column.d.ts +12 -0
- package/dist/data-grid/data-grid-select-column.js +177 -0
- package/dist/data-grid/data-grid-select-column.js.map +1 -0
- package/dist/data-grid/data-grid-skeleton.d.ts +13 -0
- package/dist/data-grid/data-grid-skeleton.js +52 -0
- package/dist/data-grid/data-grid-skeleton.js.map +1 -0
- package/dist/data-grid/data-grid-sort-menu.d.ts +12 -0
- package/dist/data-grid/data-grid-sort-menu.js +271 -0
- package/dist/data-grid/data-grid-sort-menu.js.map +1 -0
- package/dist/data-grid/data-grid-view-menu.d.ts +13 -0
- package/dist/data-grid/data-grid-view-menu.js +66 -0
- package/dist/data-grid/data-grid-view-menu.js.map +1 -0
- package/dist/data-grid/data-grid.d.ts +32 -0
- package/dist/data-grid/data-grid.js +235 -0
- package/dist/data-grid/data-grid.js.map +1 -0
- package/dist/data-grid/filters.d.ts +31 -0
- package/dist/data-grid/filters.js +212 -0
- package/dist/data-grid/filters.js.map +1 -0
- package/dist/data-grid/index.d.ts +22 -0
- package/dist/data-grid/index.js +77 -0
- package/dist/data-grid/index.js.map +1 -0
- package/dist/data-grid/messages.d.ts +280 -0
- package/dist/data-grid/messages.js +279 -0
- package/dist/data-grid/messages.js.map +1 -0
- package/dist/data-grid/sortable.d.ts +50 -0
- package/dist/data-grid/sortable.js +361 -0
- package/dist/data-grid/sortable.js.map +1 -0
- package/dist/data-grid/toast.d.ts +10 -0
- package/dist/data-grid/toast.js +21 -0
- package/dist/data-grid/toast.js.map +1 -0
- package/dist/data-grid/types.d.ts +189 -0
- package/dist/data-grid/types.js +1 -0
- package/dist/data-grid/types.js.map +1 -0
- package/dist/data-grid/use-as-ref.d.ts +5 -0
- package/dist/data-grid/use-as-ref.js +13 -0
- package/dist/data-grid/use-as-ref.js.map +1 -0
- package/dist/data-grid/use-badge-overflow.d.ts +24 -0
- package/dist/data-grid/use-badge-overflow.js +123 -0
- package/dist/data-grid/use-badge-overflow.js.map +1 -0
- package/dist/data-grid/use-callback-ref.d.ts +10 -0
- package/dist/data-grid/use-callback-ref.js +12 -0
- package/dist/data-grid/use-callback-ref.js.map +1 -0
- package/dist/data-grid/use-data-grid-undo-redo.d.ts +33 -0
- package/dist/data-grid/use-data-grid-undo-redo.js +345 -0
- package/dist/data-grid/use-data-grid-undo-redo.js.map +1 -0
- package/dist/data-grid/use-data-grid.d.ts +92 -0
- package/dist/data-grid/use-data-grid.js +2692 -0
- package/dist/data-grid/use-data-grid.js.map +1 -0
- package/dist/data-grid/use-debounced-callback.d.ts +6 -0
- package/dist/data-grid/use-debounced-callback.js +19 -0
- package/dist/data-grid/use-debounced-callback.js.map +1 -0
- package/dist/data-grid/use-isomorphic-layout-effect.d.ts +5 -0
- package/dist/data-grid/use-isomorphic-layout-effect.js +6 -0
- package/dist/data-grid/use-isomorphic-layout-effect.js.map +1 -0
- package/dist/data-grid/use-lazy-ref.d.ts +5 -0
- package/dist/data-grid/use-lazy-ref.js +12 -0
- package/dist/data-grid/use-lazy-ref.js.map +1 -0
- package/dist/data-grid/utils.d.ts +73 -0
- package/dist/data-grid/utils.js +408 -0
- package/dist/data-grid/utils.js.map +1 -0
- package/dist/shell/app-launcher.js +16 -16
- package/dist/shell/app-launcher.js.map +1 -1
- package/dist/shell/types.d.ts +13 -0
- package/dist/shell/types.js.map +1 -1
- package/package.json +33 -15
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useDirection } from "@radix-ui/react-direction";
|
|
4
|
+
import { Check, Settings2 } from "lucide-react";
|
|
5
|
+
import * as React from "react";
|
|
6
|
+
import { Button } from "../components/ui/button.js";
|
|
7
|
+
import {
|
|
8
|
+
Command,
|
|
9
|
+
CommandEmpty,
|
|
10
|
+
CommandGroup,
|
|
11
|
+
CommandInput,
|
|
12
|
+
CommandItem,
|
|
13
|
+
CommandList
|
|
14
|
+
} from "../components/ui/command.js";
|
|
15
|
+
import { Popover, PopoverContent, PopoverTrigger } from "../components/ui/popover.js";
|
|
16
|
+
import { cn } from "../lib/cn.js";
|
|
17
|
+
import { msg } from "./messages.js";
|
|
18
|
+
function DataGridViewMenu({ table, disabled, className, ...props }) {
|
|
19
|
+
const dir = useDirection();
|
|
20
|
+
const columns = React.useMemo(
|
|
21
|
+
() => table.getAllColumns().filter((column) => typeof column.accessorFn !== "undefined" && column.getCanHide()),
|
|
22
|
+
[table]
|
|
23
|
+
);
|
|
24
|
+
return /* @__PURE__ */ jsxs(Popover, { children: [
|
|
25
|
+
/* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
26
|
+
Button,
|
|
27
|
+
{
|
|
28
|
+
"aria-label": msg.view.toggleColumns,
|
|
29
|
+
role: "combobox",
|
|
30
|
+
dir,
|
|
31
|
+
variant: "outline",
|
|
32
|
+
className: "h-8 gap-2 font-normal",
|
|
33
|
+
disabled,
|
|
34
|
+
children: [
|
|
35
|
+
/* @__PURE__ */ jsx(Settings2, { "aria-hidden": "true", className: "text-muted-foreground" }),
|
|
36
|
+
msg.view.trigger
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
) }),
|
|
40
|
+
/* @__PURE__ */ jsx(PopoverContent, { dir, align: "end", className: cn("w-52 p-0", className), ...props, children: /* @__PURE__ */ jsxs(Command, { children: [
|
|
41
|
+
/* @__PURE__ */ jsx(CommandInput, { placeholder: msg.view.searchPlaceholder, "aria-label": msg.view.searchPlaceholder }),
|
|
42
|
+
/* @__PURE__ */ jsxs(CommandList, { children: [
|
|
43
|
+
/* @__PURE__ */ jsx(CommandEmpty, { children: msg.view.empty }),
|
|
44
|
+
/* @__PURE__ */ jsx(CommandGroup, { children: columns.map((column) => {
|
|
45
|
+
const isVisible = column.getIsVisible();
|
|
46
|
+
return /* @__PURE__ */ jsxs(
|
|
47
|
+
CommandItem,
|
|
48
|
+
{
|
|
49
|
+
value: column.columnDef.meta?.label ?? column.id,
|
|
50
|
+
onSelect: () => column.toggleVisibility(!isVisible),
|
|
51
|
+
children: [
|
|
52
|
+
/* @__PURE__ */ jsx("span", { className: "truncate", children: column.columnDef.meta?.label ?? column.id }),
|
|
53
|
+
/* @__PURE__ */ jsx(Check, { className: cn("ms-auto size-4", isVisible ? "opacity-100" : "opacity-0") })
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
column.id
|
|
57
|
+
);
|
|
58
|
+
}) })
|
|
59
|
+
] })
|
|
60
|
+
] }) })
|
|
61
|
+
] });
|
|
62
|
+
}
|
|
63
|
+
export {
|
|
64
|
+
DataGridViewMenu
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=data-grid-view-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/data-grid/data-grid-view-menu.tsx"],"sourcesContent":["\"use client\";\n\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport type { Table } from \"@tanstack/react-table\";\nimport { Check, Settings2 } from \"lucide-react\";\nimport * as React from \"react\";\nimport { Button } from \"../components/ui/button.js\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList\n} from \"../components/ui/command.js\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../components/ui/popover.js\";\nimport { cn } from \"../lib/cn.js\";\nimport { msg } from \"./messages.js\";\n\ninterface DataGridViewMenuProps<TData> extends React.ComponentProps<typeof PopoverContent> {\n table: Table<TData>;\n disabled?: boolean;\n}\n\n/** Ẩn/hiện cột của lưới. Cột muốn khoá luôn hiển thị thì đặt `enableHiding: false`. */\nexport function DataGridViewMenu<TData>({ table, disabled, className, ...props }: DataGridViewMenuProps<TData>) {\n const dir = useDirection();\n\n const columns = React.useMemo(\n () => table.getAllColumns().filter((column) => typeof column.accessorFn !== \"undefined\" && column.getCanHide()),\n [table]\n );\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n aria-label={msg.view.toggleColumns}\n role=\"combobox\"\n dir={dir}\n variant=\"outline\"\n className=\"h-8 gap-2 font-normal\"\n disabled={disabled}\n >\n <Settings2 aria-hidden=\"true\" className=\"text-muted-foreground\" />\n {msg.view.trigger}\n </Button>\n </PopoverTrigger>\n <PopoverContent dir={dir} align=\"end\" className={cn(\"w-52 p-0\", className)} {...props}>\n <Command>\n <CommandInput placeholder={msg.view.searchPlaceholder} aria-label={msg.view.searchPlaceholder} />\n <CommandList>\n <CommandEmpty>{msg.view.empty}</CommandEmpty>\n <CommandGroup>\n {columns.map((column) => {\n const isVisible = column.getIsVisible();\n\n return (\n <CommandItem\n key={column.id}\n value={column.columnDef.meta?.label ?? column.id}\n onSelect={() => column.toggleVisibility(!isVisible)}\n >\n <span className=\"truncate\">{column.columnDef.meta?.label ?? column.id}</span>\n <Check className={cn(\"ms-auto size-4\", isVisible ? \"opacity-100\" : \"opacity-0\")} />\n </CommandItem>\n );\n })}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":";AAoCQ,SAQE,KARF;AAlCR,SAAS,oBAAoB;AAE7B,SAAS,OAAO,iBAAiB;AACjC,YAAY,WAAW;AACvB,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,SAAS,gBAAgB,sBAAsB;AACxD,SAAS,UAAU;AACnB,SAAS,WAAW;AAQb,SAAS,iBAAwB,EAAE,OAAO,UAAU,WAAW,GAAG,MAAM,GAAiC;AAC9G,QAAM,MAAM,aAAa;AAEzB,QAAM,UAAU,MAAM;AAAA,IACpB,MAAM,MAAM,cAAc,EAAE,OAAO,CAAC,WAAW,OAAO,OAAO,eAAe,eAAe,OAAO,WAAW,CAAC;AAAA,IAC9G,CAAC,KAAK;AAAA,EACR;AAEA,SACE,qBAAC,WACC;AAAA,wBAAC,kBAAe,SAAO,MACrB;AAAA,MAAC;AAAA;AAAA,QACC,cAAY,IAAI,KAAK;AAAA,QACrB,MAAK;AAAA,QACL;AAAA,QACA,SAAQ;AAAA,QACR,WAAU;AAAA,QACV;AAAA,QAEA;AAAA,8BAAC,aAAU,eAAY,QAAO,WAAU,yBAAwB;AAAA,UAC/D,IAAI,KAAK;AAAA;AAAA;AAAA,IACZ,GACF;AAAA,IACA,oBAAC,kBAAe,KAAU,OAAM,OAAM,WAAW,GAAG,YAAY,SAAS,GAAI,GAAG,OAC9E,+BAAC,WACC;AAAA,0BAAC,gBAAa,aAAa,IAAI,KAAK,mBAAmB,cAAY,IAAI,KAAK,mBAAmB;AAAA,MAC/F,qBAAC,eACC;AAAA,4BAAC,gBAAc,cAAI,KAAK,OAAM;AAAA,QAC9B,oBAAC,gBACE,kBAAQ,IAAI,CAAC,WAAW;AACvB,gBAAM,YAAY,OAAO,aAAa;AAEtC,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO,OAAO,UAAU,MAAM,SAAS,OAAO;AAAA,cAC9C,UAAU,MAAM,OAAO,iBAAiB,CAAC,SAAS;AAAA,cAElD;AAAA,oCAAC,UAAK,WAAU,YAAY,iBAAO,UAAU,MAAM,SAAS,OAAO,IAAG;AAAA,gBACtE,oBAAC,SAAM,WAAW,GAAG,kBAAkB,YAAY,gBAAgB,WAAW,GAAG;AAAA;AAAA;AAAA,YAL5E,OAAO;AAAA,UAMd;AAAA,QAEJ,CAAC,GACH;AAAA,SACF;AAAA,OACF,GACF;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { Direction } from './types.js';
|
|
3
|
+
import { useDataGrid } from './use-data-grid.js';
|
|
4
|
+
import '@tanstack/react-table';
|
|
5
|
+
import '@tanstack/react-virtual';
|
|
6
|
+
|
|
7
|
+
interface DataGridProps<TData> extends Omit<ReturnType<typeof useDataGrid<TData>>, "dir">, Omit<React.ComponentProps<"div">, "contextMenu"> {
|
|
8
|
+
dir?: Direction;
|
|
9
|
+
/**
|
|
10
|
+
* Chiều cao tối đa của hộp cuộn: số = px, chuỗi = giá trị CSS bất kỳ
|
|
11
|
+
* (vd `"100%"`, `"calc(100dvh - 220px)"` khi muốn lưới lấp đầy phần còn lại của trang).
|
|
12
|
+
*/
|
|
13
|
+
height?: number | string;
|
|
14
|
+
/** Kéo giãn các cột cho vừa bề ngang khi tổng bề rộng cột nhỏ hơn khung */
|
|
15
|
+
stretchColumns?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Lưới dữ liệu sửa trực tiếp (như bảng tính): ảo hoá dòng, điều hướng bằng bàn phím,
|
|
19
|
+
* chọn vùng ô, sao chép/cắt/dán, ghim cột, đổi rộng cột.
|
|
20
|
+
*
|
|
21
|
+
* Nhận nguyên kết quả của {@link useDataGrid}:
|
|
22
|
+
* ```tsx
|
|
23
|
+
* const { table, ...dataGridProps } = useDataGrid({ data, columns, onDataChange });
|
|
24
|
+
* <DataGrid {...dataGridProps} table={table} aria-label="Danh sách bệnh nhân" />
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* `aria-label` / `aria-labelledby` / `aria-describedby` được đặt lên đúng thẻ mang
|
|
28
|
+
* `role="grid"` (thẻ bọc ngoài chỉ là hộp bố cục, gắn nhãn lên đó trình đọc màn hình bỏ qua).
|
|
29
|
+
*/
|
|
30
|
+
declare function DataGrid<TData>({ dataGridRef, headerRef, rowMapRef, footerRef, dir, table, tableMeta, virtualTotalSize, virtualItems, measureElement, columns, columnSizeVars, searchState, searchMatchesByRow, activeSearchMatch, cellSelectionMap, focusedCell, editingCell, rowHeight, contextMenu, pasteDialog, onRowAdd: onRowAddProp, height, stretchColumns, adjustLayout, className, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, "aria-describedby": ariaDescribedby, ...props }: DataGridProps<TData>): React.JSX.Element;
|
|
31
|
+
|
|
32
|
+
export { DataGrid };
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Plus } from "lucide-react";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { TooltipProvider } from "../components/ui/tooltip.js";
|
|
6
|
+
import { cn } from "../lib/cn.js";
|
|
7
|
+
import { DataGridColumnHeader } from "./data-grid-column-header.js";
|
|
8
|
+
import { DataGridContextMenu } from "./data-grid-context-menu.js";
|
|
9
|
+
import { DataGridPasteDialog } from "./data-grid-paste-dialog.js";
|
|
10
|
+
import { DataGridRow } from "./data-grid-row.js";
|
|
11
|
+
import { DataGridSearch } from "./data-grid-search.js";
|
|
12
|
+
import { msg } from "./messages.js";
|
|
13
|
+
import { useAsRef } from "./use-as-ref.js";
|
|
14
|
+
import { flexRender, getColumnBorderVisibility, getColumnPinningStyle } from "./utils.js";
|
|
15
|
+
const EMPTY_CELL_SELECTION_SET = /* @__PURE__ */ new Set();
|
|
16
|
+
function DataGrid({
|
|
17
|
+
dataGridRef,
|
|
18
|
+
headerRef,
|
|
19
|
+
rowMapRef,
|
|
20
|
+
footerRef,
|
|
21
|
+
dir = "ltr",
|
|
22
|
+
table,
|
|
23
|
+
tableMeta,
|
|
24
|
+
virtualTotalSize,
|
|
25
|
+
virtualItems,
|
|
26
|
+
measureElement,
|
|
27
|
+
columns,
|
|
28
|
+
columnSizeVars,
|
|
29
|
+
searchState,
|
|
30
|
+
searchMatchesByRow,
|
|
31
|
+
activeSearchMatch,
|
|
32
|
+
cellSelectionMap,
|
|
33
|
+
focusedCell,
|
|
34
|
+
editingCell,
|
|
35
|
+
rowHeight,
|
|
36
|
+
contextMenu,
|
|
37
|
+
pasteDialog,
|
|
38
|
+
onRowAdd: onRowAddProp,
|
|
39
|
+
height = 600,
|
|
40
|
+
stretchColumns = false,
|
|
41
|
+
adjustLayout = false,
|
|
42
|
+
className,
|
|
43
|
+
"aria-label": ariaLabel,
|
|
44
|
+
"aria-labelledby": ariaLabelledby,
|
|
45
|
+
"aria-describedby": ariaDescribedby,
|
|
46
|
+
...props
|
|
47
|
+
}) {
|
|
48
|
+
const rows = table.getRowModel().rows;
|
|
49
|
+
const readOnly = tableMeta?.readOnly ?? false;
|
|
50
|
+
const columnVisibility = table.getState().columnVisibility;
|
|
51
|
+
const columnPinning = table.getState().columnPinning;
|
|
52
|
+
const onRowAddRef = useAsRef(onRowAddProp);
|
|
53
|
+
const onRowAdd = React.useCallback(
|
|
54
|
+
(event) => {
|
|
55
|
+
onRowAddRef.current?.(event);
|
|
56
|
+
},
|
|
57
|
+
[onRowAddRef]
|
|
58
|
+
);
|
|
59
|
+
const onDataGridContextMenu = React.useCallback((event) => {
|
|
60
|
+
event.preventDefault();
|
|
61
|
+
}, []);
|
|
62
|
+
const onFooterCellKeyDown = React.useCallback(
|
|
63
|
+
(event) => {
|
|
64
|
+
if (!onRowAddRef.current) return;
|
|
65
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
66
|
+
event.preventDefault();
|
|
67
|
+
onRowAddRef.current();
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
[onRowAddRef]
|
|
71
|
+
);
|
|
72
|
+
return /* @__PURE__ */ jsx(TooltipProvider, { delayDuration: 200, children: /* @__PURE__ */ jsxs("div", { "data-slot": "grid-wrapper", dir, ...props, className: cn("relative flex w-full flex-col", className), children: [
|
|
73
|
+
searchState && /* @__PURE__ */ jsx(DataGridSearch, { ...searchState }),
|
|
74
|
+
/* @__PURE__ */ jsx(DataGridContextMenu, { tableMeta, columns, contextMenu }),
|
|
75
|
+
/* @__PURE__ */ jsx(DataGridPasteDialog, { tableMeta, pasteDialog }),
|
|
76
|
+
/* @__PURE__ */ jsxs(
|
|
77
|
+
"div",
|
|
78
|
+
{
|
|
79
|
+
role: "grid",
|
|
80
|
+
"aria-label": ariaLabelledby ? void 0 : ariaLabel ?? msg.grid.label,
|
|
81
|
+
"aria-labelledby": ariaLabelledby,
|
|
82
|
+
"aria-describedby": ariaDescribedby,
|
|
83
|
+
"aria-rowcount": rows.length + (onRowAddProp ? 1 : 0),
|
|
84
|
+
"aria-colcount": columns.length,
|
|
85
|
+
"data-slot": "grid",
|
|
86
|
+
tabIndex: 0,
|
|
87
|
+
ref: dataGridRef,
|
|
88
|
+
className: "relative grid select-none overflow-auto rounded-lg border bg-card focus:outline-none focus-visible:outline-none",
|
|
89
|
+
style: {
|
|
90
|
+
...columnSizeVars,
|
|
91
|
+
maxHeight: typeof height === "number" ? `${height}px` : height
|
|
92
|
+
},
|
|
93
|
+
onContextMenu: onDataGridContextMenu,
|
|
94
|
+
children: [
|
|
95
|
+
/* @__PURE__ */ jsx(
|
|
96
|
+
"div",
|
|
97
|
+
{
|
|
98
|
+
role: "rowgroup",
|
|
99
|
+
"data-slot": "grid-header",
|
|
100
|
+
ref: headerRef,
|
|
101
|
+
className: "sticky top-0 z-10 grid border-b bg-card",
|
|
102
|
+
children: table.getHeaderGroups().map((headerGroup, rowIndex) => /* @__PURE__ */ jsx(
|
|
103
|
+
"div",
|
|
104
|
+
{
|
|
105
|
+
role: "row",
|
|
106
|
+
"aria-rowindex": rowIndex + 1,
|
|
107
|
+
"data-slot": "grid-header-row",
|
|
108
|
+
tabIndex: -1,
|
|
109
|
+
className: "flex w-full",
|
|
110
|
+
children: headerGroup.headers.map((header, colIndex) => {
|
|
111
|
+
const sorting = table.getState().sorting;
|
|
112
|
+
const currentSort = sorting.find((sort) => sort.id === header.column.id);
|
|
113
|
+
const isSortable = header.column.getCanSort();
|
|
114
|
+
const nextHeader = headerGroup.headers[colIndex + 1];
|
|
115
|
+
const isLastColumn = colIndex === headerGroup.headers.length - 1;
|
|
116
|
+
const { showEndBorder, showStartBorder } = getColumnBorderVisibility({
|
|
117
|
+
column: header.column,
|
|
118
|
+
nextColumn: nextHeader?.column,
|
|
119
|
+
isLastColumn
|
|
120
|
+
});
|
|
121
|
+
return /* @__PURE__ */ jsx(
|
|
122
|
+
"div",
|
|
123
|
+
{
|
|
124
|
+
role: "columnheader",
|
|
125
|
+
"aria-colindex": colIndex + 1,
|
|
126
|
+
"aria-sort": currentSort?.desc === false ? "ascending" : currentSort?.desc === true ? "descending" : isSortable ? "none" : void 0,
|
|
127
|
+
"data-slot": "grid-header-cell",
|
|
128
|
+
tabIndex: -1,
|
|
129
|
+
className: cn("relative", {
|
|
130
|
+
grow: stretchColumns && header.column.id !== "select",
|
|
131
|
+
"border-e": showEndBorder && header.column.id !== "select",
|
|
132
|
+
"border-s": showStartBorder && header.column.id !== "select"
|
|
133
|
+
}),
|
|
134
|
+
style: {
|
|
135
|
+
...getColumnPinningStyle({ column: header.column, dir }),
|
|
136
|
+
width: `calc(var(--header-${header.id}-size) * 1px)`
|
|
137
|
+
},
|
|
138
|
+
children: header.isPlaceholder ? null : typeof header.column.columnDef.header === "function" ? /* @__PURE__ */ jsx("div", { className: "size-full px-3 py-1.5", children: flexRender(header.column.columnDef.header, header.getContext()) }) : /* @__PURE__ */ jsx(DataGridColumnHeader, { header, table })
|
|
139
|
+
},
|
|
140
|
+
header.id
|
|
141
|
+
);
|
|
142
|
+
})
|
|
143
|
+
},
|
|
144
|
+
headerGroup.id
|
|
145
|
+
))
|
|
146
|
+
}
|
|
147
|
+
),
|
|
148
|
+
/* @__PURE__ */ jsx(
|
|
149
|
+
"div",
|
|
150
|
+
{
|
|
151
|
+
role: "rowgroup",
|
|
152
|
+
"data-slot": "grid-body",
|
|
153
|
+
className: "relative grid",
|
|
154
|
+
style: {
|
|
155
|
+
height: `${virtualTotalSize}px`,
|
|
156
|
+
contain: adjustLayout ? "layout paint" : "strict"
|
|
157
|
+
},
|
|
158
|
+
children: virtualItems.map((virtualItem) => {
|
|
159
|
+
const row = rows[virtualItem.index];
|
|
160
|
+
if (!row) return null;
|
|
161
|
+
const cellSelectionKeys = cellSelectionMap?.get(virtualItem.index) ?? EMPTY_CELL_SELECTION_SET;
|
|
162
|
+
const searchMatchColumns = searchMatchesByRow?.get(virtualItem.index) ?? null;
|
|
163
|
+
const isActiveSearchRow = activeSearchMatch?.rowIndex === virtualItem.index;
|
|
164
|
+
return /* @__PURE__ */ jsx(
|
|
165
|
+
DataGridRow,
|
|
166
|
+
{
|
|
167
|
+
row,
|
|
168
|
+
tableMeta,
|
|
169
|
+
rowMapRef,
|
|
170
|
+
virtualItem,
|
|
171
|
+
measureElement,
|
|
172
|
+
rowHeight,
|
|
173
|
+
columnVisibility,
|
|
174
|
+
columnPinning,
|
|
175
|
+
focusedCell,
|
|
176
|
+
editingCell,
|
|
177
|
+
cellSelectionKeys,
|
|
178
|
+
searchMatchColumns,
|
|
179
|
+
activeSearchMatch: isActiveSearchRow ? activeSearchMatch : null,
|
|
180
|
+
dir,
|
|
181
|
+
adjustLayout,
|
|
182
|
+
stretchColumns,
|
|
183
|
+
readOnly
|
|
184
|
+
},
|
|
185
|
+
row.id
|
|
186
|
+
);
|
|
187
|
+
})
|
|
188
|
+
}
|
|
189
|
+
),
|
|
190
|
+
!readOnly && onRowAddProp && /* @__PURE__ */ jsx(
|
|
191
|
+
"div",
|
|
192
|
+
{
|
|
193
|
+
role: "rowgroup",
|
|
194
|
+
"data-slot": "grid-footer",
|
|
195
|
+
ref: footerRef,
|
|
196
|
+
className: "sticky bottom-0 z-10 grid border-t bg-card",
|
|
197
|
+
children: /* @__PURE__ */ jsx(
|
|
198
|
+
"div",
|
|
199
|
+
{
|
|
200
|
+
role: "row",
|
|
201
|
+
"aria-rowindex": rows.length + 2,
|
|
202
|
+
"data-slot": "grid-add-row",
|
|
203
|
+
tabIndex: -1,
|
|
204
|
+
className: "flex w-full",
|
|
205
|
+
children: /* @__PURE__ */ jsx(
|
|
206
|
+
"div",
|
|
207
|
+
{
|
|
208
|
+
role: "gridcell",
|
|
209
|
+
tabIndex: 0,
|
|
210
|
+
className: "relative flex h-9 grow items-center bg-muted/30 transition-colors hover:bg-muted/50 focus:bg-muted/50 focus:outline-none focus-visible:outline-none",
|
|
211
|
+
style: {
|
|
212
|
+
width: table.getTotalSize(),
|
|
213
|
+
minWidth: table.getTotalSize()
|
|
214
|
+
},
|
|
215
|
+
onClick: onRowAdd,
|
|
216
|
+
onKeyDown: onFooterCellKeyDown,
|
|
217
|
+
children: /* @__PURE__ */ jsxs("div", { className: "sticky start-0 flex items-center gap-2 px-3 text-muted-foreground", children: [
|
|
218
|
+
/* @__PURE__ */ jsx(Plus, { className: "size-3.5" }),
|
|
219
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm", children: msg.grid.addRow })
|
|
220
|
+
] })
|
|
221
|
+
}
|
|
222
|
+
)
|
|
223
|
+
}
|
|
224
|
+
)
|
|
225
|
+
}
|
|
226
|
+
)
|
|
227
|
+
]
|
|
228
|
+
}
|
|
229
|
+
)
|
|
230
|
+
] }) });
|
|
231
|
+
}
|
|
232
|
+
export {
|
|
233
|
+
DataGrid
|
|
234
|
+
};
|
|
235
|
+
//# sourceMappingURL=data-grid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/data-grid/data-grid.tsx"],"sourcesContent":["\"use client\";\n\nimport { Plus } from \"lucide-react\";\nimport * as React from \"react\";\nimport { TooltipProvider } from \"../components/ui/tooltip.js\";\nimport { cn } from \"../lib/cn.js\";\nimport { DataGridColumnHeader } from \"./data-grid-column-header.js\";\nimport { DataGridContextMenu } from \"./data-grid-context-menu.js\";\nimport { DataGridPasteDialog } from \"./data-grid-paste-dialog.js\";\nimport { DataGridRow } from \"./data-grid-row.js\";\nimport { DataGridSearch } from \"./data-grid-search.js\";\nimport { msg } from \"./messages.js\";\nimport type { Direction } from \"./types.js\";\nimport { useAsRef } from \"./use-as-ref.js\";\nimport type { useDataGrid } from \"./use-data-grid.js\";\nimport { flexRender, getColumnBorderVisibility, getColumnPinningStyle } from \"./utils.js\";\n\nconst EMPTY_CELL_SELECTION_SET = new Set<string>();\n\ninterface DataGridProps<TData>\n extends Omit<ReturnType<typeof useDataGrid<TData>>, \"dir\">,\n Omit<React.ComponentProps<\"div\">, \"contextMenu\"> {\n dir?: Direction;\n /**\n * Chiều cao tối đa của hộp cuộn: số = px, chuỗi = giá trị CSS bất kỳ\n * (vd `\"100%\"`, `\"calc(100dvh - 220px)\"` khi muốn lưới lấp đầy phần còn lại của trang).\n */\n height?: number | string;\n /** Kéo giãn các cột cho vừa bề ngang khi tổng bề rộng cột nhỏ hơn khung */\n stretchColumns?: boolean;\n}\n\n/**\n * Lưới dữ liệu sửa trực tiếp (như bảng tính): ảo hoá dòng, điều hướng bằng bàn phím,\n * chọn vùng ô, sao chép/cắt/dán, ghim cột, đổi rộng cột.\n *\n * Nhận nguyên kết quả của {@link useDataGrid}:\n * ```tsx\n * const { table, ...dataGridProps } = useDataGrid({ data, columns, onDataChange });\n * <DataGrid {...dataGridProps} table={table} aria-label=\"Danh sách bệnh nhân\" />\n * ```\n *\n * `aria-label` / `aria-labelledby` / `aria-describedby` được đặt lên đúng thẻ mang\n * `role=\"grid\"` (thẻ bọc ngoài chỉ là hộp bố cục, gắn nhãn lên đó trình đọc màn hình bỏ qua).\n */\nexport function DataGrid<TData>({\n dataGridRef,\n headerRef,\n rowMapRef,\n footerRef,\n dir = \"ltr\",\n table,\n tableMeta,\n virtualTotalSize,\n virtualItems,\n measureElement,\n columns,\n columnSizeVars,\n searchState,\n searchMatchesByRow,\n activeSearchMatch,\n cellSelectionMap,\n focusedCell,\n editingCell,\n rowHeight,\n contextMenu,\n pasteDialog,\n onRowAdd: onRowAddProp,\n height = 600,\n stretchColumns = false,\n adjustLayout = false,\n className,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledby,\n \"aria-describedby\": ariaDescribedby,\n ...props\n}: DataGridProps<TData>) {\n const rows = table.getRowModel().rows;\n const readOnly = tableMeta?.readOnly ?? false;\n const columnVisibility = table.getState().columnVisibility;\n const columnPinning = table.getState().columnPinning;\n\n const onRowAddRef = useAsRef(onRowAddProp);\n\n const onRowAdd = React.useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n onRowAddRef.current?.(event);\n },\n [onRowAddRef]\n );\n\n const onDataGridContextMenu = React.useCallback((event: React.MouseEvent<HTMLDivElement>) => {\n event.preventDefault();\n }, []);\n\n const onFooterCellKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!onRowAddRef.current) return;\n\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n onRowAddRef.current();\n }\n },\n [onRowAddRef]\n );\n\n return (\n <TooltipProvider delayDuration={200}>\n <div data-slot=\"grid-wrapper\" dir={dir} {...props} className={cn(\"relative flex w-full flex-col\", className)}>\n {searchState && <DataGridSearch {...searchState} />}\n <DataGridContextMenu tableMeta={tableMeta} columns={columns} contextMenu={contextMenu} />\n <DataGridPasteDialog tableMeta={tableMeta} pasteDialog={pasteDialog} />\n <div\n role=\"grid\"\n aria-label={ariaLabelledby ? undefined : (ariaLabel ?? msg.grid.label)}\n aria-labelledby={ariaLabelledby}\n aria-describedby={ariaDescribedby}\n aria-rowcount={rows.length + (onRowAddProp ? 1 : 0)}\n aria-colcount={columns.length}\n data-slot=\"grid\"\n tabIndex={0}\n ref={dataGridRef}\n className=\"relative grid select-none overflow-auto rounded-lg border bg-card focus:outline-none focus-visible:outline-none\"\n style={{\n ...columnSizeVars,\n maxHeight: typeof height === \"number\" ? `${height}px` : height\n }}\n onContextMenu={onDataGridContextMenu}\n >\n <div\n role=\"rowgroup\"\n data-slot=\"grid-header\"\n ref={headerRef}\n className=\"sticky top-0 z-10 grid border-b bg-card\"\n >\n {table.getHeaderGroups().map((headerGroup, rowIndex) => (\n <div\n key={headerGroup.id}\n role=\"row\"\n aria-rowindex={rowIndex + 1}\n data-slot=\"grid-header-row\"\n tabIndex={-1}\n className=\"flex w-full\"\n >\n {headerGroup.headers.map((header, colIndex) => {\n const sorting = table.getState().sorting;\n const currentSort = sorting.find((sort) => sort.id === header.column.id);\n const isSortable = header.column.getCanSort();\n\n const nextHeader = headerGroup.headers[colIndex + 1];\n const isLastColumn = colIndex === headerGroup.headers.length - 1;\n\n const { showEndBorder, showStartBorder } = getColumnBorderVisibility({\n column: header.column,\n nextColumn: nextHeader?.column,\n isLastColumn\n });\n\n return (\n <div\n key={header.id}\n role=\"columnheader\"\n aria-colindex={colIndex + 1}\n aria-sort={\n currentSort?.desc === false\n ? \"ascending\"\n : currentSort?.desc === true\n ? \"descending\"\n : isSortable\n ? \"none\"\n : undefined\n }\n data-slot=\"grid-header-cell\"\n tabIndex={-1}\n className={cn(\"relative\", {\n grow: stretchColumns && header.column.id !== \"select\",\n \"border-e\": showEndBorder && header.column.id !== \"select\",\n \"border-s\": showStartBorder && header.column.id !== \"select\"\n })}\n style={{\n ...getColumnPinningStyle({ column: header.column, dir }),\n width: `calc(var(--header-${header.id}-size) * 1px)`\n }}\n >\n {header.isPlaceholder ? null : typeof header.column.columnDef.header === \"function\" ? (\n <div className=\"size-full px-3 py-1.5\">\n {flexRender(header.column.columnDef.header, header.getContext())}\n </div>\n ) : (\n <DataGridColumnHeader header={header} table={table} />\n )}\n </div>\n );\n })}\n </div>\n ))}\n </div>\n <div\n role=\"rowgroup\"\n data-slot=\"grid-body\"\n className=\"relative grid\"\n style={{\n height: `${virtualTotalSize}px`,\n contain: adjustLayout ? \"layout paint\" : \"strict\"\n }}\n >\n {virtualItems.map((virtualItem) => {\n const row = rows[virtualItem.index];\n if (!row) return null;\n\n const cellSelectionKeys = cellSelectionMap?.get(virtualItem.index) ?? EMPTY_CELL_SELECTION_SET;\n\n const searchMatchColumns = searchMatchesByRow?.get(virtualItem.index) ?? null;\n const isActiveSearchRow = activeSearchMatch?.rowIndex === virtualItem.index;\n\n return (\n <DataGridRow\n key={row.id}\n row={row}\n tableMeta={tableMeta}\n rowMapRef={rowMapRef}\n virtualItem={virtualItem}\n measureElement={measureElement}\n rowHeight={rowHeight}\n columnVisibility={columnVisibility}\n columnPinning={columnPinning}\n focusedCell={focusedCell}\n editingCell={editingCell}\n cellSelectionKeys={cellSelectionKeys}\n searchMatchColumns={searchMatchColumns}\n activeSearchMatch={isActiveSearchRow ? activeSearchMatch : null}\n dir={dir}\n adjustLayout={adjustLayout}\n stretchColumns={stretchColumns}\n readOnly={readOnly}\n />\n );\n })}\n </div>\n {/* Chỉ hiện dòng \"Thêm dòng\" khi ứng dụng thật sự truyền onRowAdd\n (biến `onRowAdd` bên dưới là callback bọc, luôn khác undefined). */}\n {!readOnly && onRowAddProp && (\n <div\n role=\"rowgroup\"\n data-slot=\"grid-footer\"\n ref={footerRef}\n className=\"sticky bottom-0 z-10 grid border-t bg-card\"\n >\n <div\n role=\"row\"\n aria-rowindex={rows.length + 2}\n data-slot=\"grid-add-row\"\n tabIndex={-1}\n className=\"flex w-full\"\n >\n <div\n role=\"gridcell\"\n tabIndex={0}\n className=\"relative flex h-9 grow items-center bg-muted/30 transition-colors hover:bg-muted/50 focus:bg-muted/50 focus:outline-none focus-visible:outline-none\"\n style={{\n width: table.getTotalSize(),\n minWidth: table.getTotalSize()\n }}\n onClick={onRowAdd}\n onKeyDown={onFooterCellKeyDown}\n >\n <div className=\"sticky start-0 flex items-center gap-2 px-3 text-muted-foreground\">\n <Plus className=\"size-3.5\" />\n <span className=\"text-sm\">{msg.grid.addRow}</span>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </TooltipProvider>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { FilterFn } from '@tanstack/react-table';
|
|
2
|
+
import { BooleanFilterOperator, DateFilterOperator, NumberFilterOperator, SelectFilterOperator, TextFilterOperator, FilterOperator } from './types.js';
|
|
3
|
+
|
|
4
|
+
declare const TEXT_FILTER_OPERATORS: ReadonlyArray<{
|
|
5
|
+
label: string;
|
|
6
|
+
value: TextFilterOperator;
|
|
7
|
+
}>;
|
|
8
|
+
declare const NUMBER_FILTER_OPERATORS: ReadonlyArray<{
|
|
9
|
+
label: string;
|
|
10
|
+
value: NumberFilterOperator;
|
|
11
|
+
}>;
|
|
12
|
+
declare const DATE_FILTER_OPERATORS: ReadonlyArray<{
|
|
13
|
+
label: string;
|
|
14
|
+
value: DateFilterOperator;
|
|
15
|
+
}>;
|
|
16
|
+
declare const SELECT_FILTER_OPERATORS: ReadonlyArray<{
|
|
17
|
+
label: string;
|
|
18
|
+
value: SelectFilterOperator;
|
|
19
|
+
}>;
|
|
20
|
+
declare const BOOLEAN_FILTER_OPERATORS: ReadonlyArray<{
|
|
21
|
+
label: string;
|
|
22
|
+
value: BooleanFilterOperator;
|
|
23
|
+
}>;
|
|
24
|
+
declare function getDefaultOperator(variant: string): FilterOperator;
|
|
25
|
+
declare function getOperatorsForVariant(variant: string): ReadonlyArray<{
|
|
26
|
+
label: string;
|
|
27
|
+
value: FilterOperator;
|
|
28
|
+
}>;
|
|
29
|
+
declare function getFilterFn<TData>(): FilterFn<TData>;
|
|
30
|
+
|
|
31
|
+
export { BOOLEAN_FILTER_OPERATORS, DATE_FILTER_OPERATORS, NUMBER_FILTER_OPERATORS, SELECT_FILTER_OPERATORS, TEXT_FILTER_OPERATORS, getDefaultOperator, getFilterFn, getOperatorsForVariant };
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { msg } from "./messages.js";
|
|
2
|
+
const op = msg.filter.operators;
|
|
3
|
+
const TEXT_FILTER_OPERATORS = [
|
|
4
|
+
{ label: op.contains, value: "contains" },
|
|
5
|
+
{ label: op.notContains, value: "notContains" },
|
|
6
|
+
{ label: op.equals, value: "equals" },
|
|
7
|
+
{ label: op.notEquals, value: "notEquals" },
|
|
8
|
+
{ label: op.startsWith, value: "startsWith" },
|
|
9
|
+
{ label: op.endsWith, value: "endsWith" },
|
|
10
|
+
{ label: op.isEmpty, value: "isEmpty" },
|
|
11
|
+
{ label: op.isNotEmpty, value: "isNotEmpty" }
|
|
12
|
+
];
|
|
13
|
+
const NUMBER_FILTER_OPERATORS = [
|
|
14
|
+
{ label: op.equals, value: "equals" },
|
|
15
|
+
{ label: op.notEquals, value: "notEquals" },
|
|
16
|
+
{ label: op.lessThan, value: "lessThan" },
|
|
17
|
+
{ label: op.lessThanOrEqual, value: "lessThanOrEqual" },
|
|
18
|
+
{ label: op.greaterThan, value: "greaterThan" },
|
|
19
|
+
{ label: op.greaterThanOrEqual, value: "greaterThanOrEqual" },
|
|
20
|
+
{ label: op.isBetween, value: "isBetween" },
|
|
21
|
+
{ label: op.isEmpty, value: "isEmpty" },
|
|
22
|
+
{ label: op.isNotEmpty, value: "isNotEmpty" }
|
|
23
|
+
];
|
|
24
|
+
const DATE_FILTER_OPERATORS = [
|
|
25
|
+
{ label: op.dateEquals, value: "equals" },
|
|
26
|
+
{ label: op.dateNotEquals, value: "notEquals" },
|
|
27
|
+
{ label: op.before, value: "before" },
|
|
28
|
+
{ label: op.after, value: "after" },
|
|
29
|
+
{ label: op.onOrBefore, value: "onOrBefore" },
|
|
30
|
+
{ label: op.onOrAfter, value: "onOrAfter" },
|
|
31
|
+
{ label: op.isBetween, value: "isBetween" },
|
|
32
|
+
{ label: op.isEmpty, value: "isEmpty" },
|
|
33
|
+
{ label: op.isNotEmpty, value: "isNotEmpty" }
|
|
34
|
+
];
|
|
35
|
+
const SELECT_FILTER_OPERATORS = [
|
|
36
|
+
{ label: op.is, value: "is" },
|
|
37
|
+
{ label: op.isNot, value: "isNot" },
|
|
38
|
+
{ label: op.isAnyOf, value: "isAnyOf" },
|
|
39
|
+
{ label: op.isNoneOf, value: "isNoneOf" },
|
|
40
|
+
{ label: op.isEmpty, value: "isEmpty" },
|
|
41
|
+
{ label: op.isNotEmpty, value: "isNotEmpty" }
|
|
42
|
+
];
|
|
43
|
+
const BOOLEAN_FILTER_OPERATORS = [
|
|
44
|
+
{ label: op.isTrue, value: "isTrue" },
|
|
45
|
+
{ label: op.isFalse, value: "isFalse" }
|
|
46
|
+
];
|
|
47
|
+
function getDefaultOperator(variant) {
|
|
48
|
+
switch (variant) {
|
|
49
|
+
case "number":
|
|
50
|
+
return "equals";
|
|
51
|
+
case "date":
|
|
52
|
+
return "equals";
|
|
53
|
+
case "select":
|
|
54
|
+
case "multi-select":
|
|
55
|
+
return "is";
|
|
56
|
+
case "checkbox":
|
|
57
|
+
return "isTrue";
|
|
58
|
+
default:
|
|
59
|
+
return "contains";
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function getOperatorsForVariant(variant) {
|
|
63
|
+
switch (variant) {
|
|
64
|
+
case "number":
|
|
65
|
+
return NUMBER_FILTER_OPERATORS;
|
|
66
|
+
case "date":
|
|
67
|
+
return DATE_FILTER_OPERATORS;
|
|
68
|
+
case "select":
|
|
69
|
+
case "multi-select":
|
|
70
|
+
return SELECT_FILTER_OPERATORS;
|
|
71
|
+
case "checkbox":
|
|
72
|
+
return BOOLEAN_FILTER_OPERATORS;
|
|
73
|
+
default:
|
|
74
|
+
return TEXT_FILTER_OPERATORS;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function getFilterFn() {
|
|
78
|
+
return (row, columnId, filterValue) => {
|
|
79
|
+
if (!filterValue || typeof filterValue !== "object") {
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
const filter = filterValue;
|
|
83
|
+
const { operator, value, endValue } = filter;
|
|
84
|
+
const cellValue = row.getValue(columnId);
|
|
85
|
+
if (operator === "isEmpty") {
|
|
86
|
+
return cellValue === null || cellValue === void 0 || cellValue === "" || Array.isArray(cellValue) && cellValue.length === 0;
|
|
87
|
+
}
|
|
88
|
+
if (operator === "isNotEmpty") {
|
|
89
|
+
return !(cellValue === null || cellValue === void 0 || cellValue === "" || Array.isArray(cellValue) && cellValue.length === 0);
|
|
90
|
+
}
|
|
91
|
+
if (operator === "isTrue") {
|
|
92
|
+
return cellValue === true;
|
|
93
|
+
}
|
|
94
|
+
if (operator === "isFalse") {
|
|
95
|
+
return cellValue === false || !cellValue;
|
|
96
|
+
}
|
|
97
|
+
if (value === void 0 || value === null || value === "") {
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
const cellValueStr = String(cellValue ?? "").toLowerCase();
|
|
101
|
+
const filterValueStr = typeof value === "string" ? value.toLowerCase() : String(value);
|
|
102
|
+
if (operator === "contains") {
|
|
103
|
+
return cellValueStr.includes(filterValueStr);
|
|
104
|
+
}
|
|
105
|
+
if (operator === "notContains") {
|
|
106
|
+
return !cellValueStr.includes(filterValueStr);
|
|
107
|
+
}
|
|
108
|
+
if (operator === "equals") {
|
|
109
|
+
if (typeof cellValue === "number" && typeof value === "number") {
|
|
110
|
+
return cellValue === value;
|
|
111
|
+
}
|
|
112
|
+
if (cellValue instanceof Date && typeof value === "string") {
|
|
113
|
+
const cellDate = new Date(cellValue);
|
|
114
|
+
const filterDate = new Date(value);
|
|
115
|
+
return cellDate.toDateString() === filterDate.toDateString();
|
|
116
|
+
}
|
|
117
|
+
return cellValueStr === filterValueStr;
|
|
118
|
+
}
|
|
119
|
+
if (operator === "notEquals") {
|
|
120
|
+
if (typeof cellValue === "number" && typeof value === "number") {
|
|
121
|
+
return cellValue !== value;
|
|
122
|
+
}
|
|
123
|
+
if (cellValue instanceof Date && typeof value === "string") {
|
|
124
|
+
const cellDate = new Date(cellValue);
|
|
125
|
+
const filterDate = new Date(value);
|
|
126
|
+
return cellDate.toDateString() !== filterDate.toDateString();
|
|
127
|
+
}
|
|
128
|
+
return cellValueStr !== filterValueStr;
|
|
129
|
+
}
|
|
130
|
+
if (operator === "startsWith") {
|
|
131
|
+
return cellValueStr.startsWith(filterValueStr);
|
|
132
|
+
}
|
|
133
|
+
if (operator === "endsWith") {
|
|
134
|
+
return cellValueStr.endsWith(filterValueStr);
|
|
135
|
+
}
|
|
136
|
+
if (typeof cellValue === "number" && typeof value === "number") {
|
|
137
|
+
if (operator === "greaterThan") {
|
|
138
|
+
return cellValue > value;
|
|
139
|
+
}
|
|
140
|
+
if (operator === "greaterThanOrEqual") {
|
|
141
|
+
return cellValue >= value;
|
|
142
|
+
}
|
|
143
|
+
if (operator === "lessThan") {
|
|
144
|
+
return cellValue < value;
|
|
145
|
+
}
|
|
146
|
+
if (operator === "lessThanOrEqual") {
|
|
147
|
+
return cellValue <= value;
|
|
148
|
+
}
|
|
149
|
+
if (operator === "isBetween" && typeof endValue === "number") {
|
|
150
|
+
return cellValue >= value && cellValue <= endValue;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (cellValue instanceof Date || typeof cellValue === "string") {
|
|
154
|
+
const cellDate = new Date(cellValue);
|
|
155
|
+
if (!Number.isNaN(cellDate.getTime()) && typeof value === "string") {
|
|
156
|
+
const filterDate = new Date(value);
|
|
157
|
+
if (operator === "before") {
|
|
158
|
+
return cellDate < filterDate;
|
|
159
|
+
}
|
|
160
|
+
if (operator === "after") {
|
|
161
|
+
return cellDate > filterDate;
|
|
162
|
+
}
|
|
163
|
+
if (operator === "onOrBefore") {
|
|
164
|
+
return cellDate <= filterDate;
|
|
165
|
+
}
|
|
166
|
+
if (operator === "onOrAfter") {
|
|
167
|
+
return cellDate >= filterDate;
|
|
168
|
+
}
|
|
169
|
+
if (operator === "isBetween" && typeof endValue === "string") {
|
|
170
|
+
const filterDate2 = new Date(endValue);
|
|
171
|
+
return cellDate >= filterDate && cellDate <= filterDate2;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (operator === "is") {
|
|
176
|
+
if (Array.isArray(cellValue)) {
|
|
177
|
+
return cellValue.some((v) => String(v) === String(value));
|
|
178
|
+
}
|
|
179
|
+
return String(cellValue) === String(value);
|
|
180
|
+
}
|
|
181
|
+
if (operator === "isNot") {
|
|
182
|
+
if (Array.isArray(cellValue)) {
|
|
183
|
+
return !cellValue.some((v) => String(v) === String(value));
|
|
184
|
+
}
|
|
185
|
+
return String(cellValue) !== String(value);
|
|
186
|
+
}
|
|
187
|
+
if (operator === "isAnyOf" && Array.isArray(value)) {
|
|
188
|
+
if (Array.isArray(cellValue)) {
|
|
189
|
+
return cellValue.some((v) => value.some((fv) => String(v) === String(fv)));
|
|
190
|
+
}
|
|
191
|
+
return value.some((fv) => String(cellValue) === String(fv));
|
|
192
|
+
}
|
|
193
|
+
if (operator === "isNoneOf" && Array.isArray(value)) {
|
|
194
|
+
if (Array.isArray(cellValue)) {
|
|
195
|
+
return !cellValue.some((v) => value.some((fv) => String(v) === String(fv)));
|
|
196
|
+
}
|
|
197
|
+
return !value.some((fv) => String(cellValue) === String(fv));
|
|
198
|
+
}
|
|
199
|
+
return true;
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
export {
|
|
203
|
+
BOOLEAN_FILTER_OPERATORS,
|
|
204
|
+
DATE_FILTER_OPERATORS,
|
|
205
|
+
NUMBER_FILTER_OPERATORS,
|
|
206
|
+
SELECT_FILTER_OPERATORS,
|
|
207
|
+
TEXT_FILTER_OPERATORS,
|
|
208
|
+
getDefaultOperator,
|
|
209
|
+
getFilterFn,
|
|
210
|
+
getOperatorsForVariant
|
|
211
|
+
};
|
|
212
|
+
//# sourceMappingURL=filters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/data-grid/filters.ts"],"sourcesContent":["import type { FilterFn, Row } from \"@tanstack/react-table\";\nimport { msg } from \"./messages.js\";\nimport type {\n BooleanFilterOperator,\n DateFilterOperator,\n FilterOperator,\n FilterValue,\n NumberFilterOperator,\n SelectFilterOperator,\n TextFilterOperator\n} from \"./types.js\";\n\nconst op = msg.filter.operators;\n\nexport const TEXT_FILTER_OPERATORS: ReadonlyArray<{\n label: string;\n value: TextFilterOperator;\n}> = [\n { label: op.contains, value: \"contains\" },\n { label: op.notContains, value: \"notContains\" },\n { label: op.equals, value: \"equals\" },\n { label: op.notEquals, value: \"notEquals\" },\n { label: op.startsWith, value: \"startsWith\" },\n { label: op.endsWith, value: \"endsWith\" },\n { label: op.isEmpty, value: \"isEmpty\" },\n { label: op.isNotEmpty, value: \"isNotEmpty\" }\n];\n\nexport const NUMBER_FILTER_OPERATORS: ReadonlyArray<{\n label: string;\n value: NumberFilterOperator;\n}> = [\n { label: op.equals, value: \"equals\" },\n { label: op.notEquals, value: \"notEquals\" },\n { label: op.lessThan, value: \"lessThan\" },\n { label: op.lessThanOrEqual, value: \"lessThanOrEqual\" },\n { label: op.greaterThan, value: \"greaterThan\" },\n { label: op.greaterThanOrEqual, value: \"greaterThanOrEqual\" },\n { label: op.isBetween, value: \"isBetween\" },\n { label: op.isEmpty, value: \"isEmpty\" },\n { label: op.isNotEmpty, value: \"isNotEmpty\" }\n];\n\nexport const DATE_FILTER_OPERATORS: ReadonlyArray<{\n label: string;\n value: DateFilterOperator;\n}> = [\n { label: op.dateEquals, value: \"equals\" },\n { label: op.dateNotEquals, value: \"notEquals\" },\n { label: op.before, value: \"before\" },\n { label: op.after, value: \"after\" },\n { label: op.onOrBefore, value: \"onOrBefore\" },\n { label: op.onOrAfter, value: \"onOrAfter\" },\n { label: op.isBetween, value: \"isBetween\" },\n { label: op.isEmpty, value: \"isEmpty\" },\n { label: op.isNotEmpty, value: \"isNotEmpty\" }\n];\n\nexport const SELECT_FILTER_OPERATORS: ReadonlyArray<{\n label: string;\n value: SelectFilterOperator;\n}> = [\n { label: op.is, value: \"is\" },\n { label: op.isNot, value: \"isNot\" },\n { label: op.isAnyOf, value: \"isAnyOf\" },\n { label: op.isNoneOf, value: \"isNoneOf\" },\n { label: op.isEmpty, value: \"isEmpty\" },\n { label: op.isNotEmpty, value: \"isNotEmpty\" }\n];\n\nexport const BOOLEAN_FILTER_OPERATORS: ReadonlyArray<{\n label: string;\n value: BooleanFilterOperator;\n}> = [\n { label: op.isTrue, value: \"isTrue\" },\n { label: op.isFalse, value: \"isFalse\" }\n];\n\nexport function getDefaultOperator(variant: string): FilterOperator {\n switch (variant) {\n case \"number\":\n return \"equals\";\n case \"date\":\n return \"equals\";\n case \"select\":\n case \"multi-select\":\n return \"is\";\n case \"checkbox\":\n return \"isTrue\";\n default:\n return \"contains\";\n }\n}\n\nexport function getOperatorsForVariant(variant: string): ReadonlyArray<{\n label: string;\n value: FilterOperator;\n}> {\n switch (variant) {\n case \"number\":\n return NUMBER_FILTER_OPERATORS;\n case \"date\":\n return DATE_FILTER_OPERATORS;\n case \"select\":\n case \"multi-select\":\n return SELECT_FILTER_OPERATORS;\n case \"checkbox\":\n return BOOLEAN_FILTER_OPERATORS;\n default:\n return TEXT_FILTER_OPERATORS;\n }\n}\n\nexport function getFilterFn<TData>(): FilterFn<TData> {\n return (row: Row<TData>, columnId: string, filterValue: unknown): boolean => {\n if (!filterValue || typeof filterValue !== \"object\") {\n return true;\n }\n\n const filter = filterValue as FilterValue;\n const { operator, value, endValue } = filter;\n\n const cellValue = row.getValue(columnId);\n\n if (operator === \"isEmpty\") {\n return (\n cellValue === null ||\n cellValue === undefined ||\n cellValue === \"\" ||\n (Array.isArray(cellValue) && cellValue.length === 0)\n );\n }\n\n if (operator === \"isNotEmpty\") {\n return !(\n cellValue === null ||\n cellValue === undefined ||\n cellValue === \"\" ||\n (Array.isArray(cellValue) && cellValue.length === 0)\n );\n }\n\n if (operator === \"isTrue\") {\n return cellValue === true;\n }\n\n if (operator === \"isFalse\") {\n return cellValue === false || !cellValue;\n }\n\n if (value === undefined || value === null || value === \"\") {\n return true;\n }\n\n const cellValueStr = String(cellValue ?? \"\").toLowerCase();\n const filterValueStr = typeof value === \"string\" ? value.toLowerCase() : String(value);\n\n if (operator === \"contains\") {\n return cellValueStr.includes(filterValueStr);\n }\n\n if (operator === \"notContains\") {\n return !cellValueStr.includes(filterValueStr);\n }\n\n if (operator === \"equals\") {\n if (typeof cellValue === \"number\" && typeof value === \"number\") {\n return cellValue === value;\n }\n if (cellValue instanceof Date && typeof value === \"string\") {\n const cellDate = new Date(cellValue);\n const filterDate = new Date(value);\n return cellDate.toDateString() === filterDate.toDateString();\n }\n return cellValueStr === filterValueStr;\n }\n\n if (operator === \"notEquals\") {\n if (typeof cellValue === \"number\" && typeof value === \"number\") {\n return cellValue !== value;\n }\n if (cellValue instanceof Date && typeof value === \"string\") {\n const cellDate = new Date(cellValue);\n const filterDate = new Date(value);\n return cellDate.toDateString() !== filterDate.toDateString();\n }\n return cellValueStr !== filterValueStr;\n }\n\n if (operator === \"startsWith\") {\n return cellValueStr.startsWith(filterValueStr);\n }\n\n if (operator === \"endsWith\") {\n return cellValueStr.endsWith(filterValueStr);\n }\n\n if (typeof cellValue === \"number\" && typeof value === \"number\") {\n if (operator === \"greaterThan\") {\n return cellValue > value;\n }\n\n if (operator === \"greaterThanOrEqual\") {\n return cellValue >= value;\n }\n\n if (operator === \"lessThan\") {\n return cellValue < value;\n }\n\n if (operator === \"lessThanOrEqual\") {\n return cellValue <= value;\n }\n\n if (operator === \"isBetween\" && typeof endValue === \"number\") {\n return cellValue >= value && cellValue <= endValue;\n }\n }\n\n if (cellValue instanceof Date || typeof cellValue === \"string\") {\n const cellDate = new Date(cellValue);\n if (!Number.isNaN(cellDate.getTime()) && typeof value === \"string\") {\n const filterDate = new Date(value);\n\n if (operator === \"before\") {\n return cellDate < filterDate;\n }\n\n if (operator === \"after\") {\n return cellDate > filterDate;\n }\n\n if (operator === \"onOrBefore\") {\n return cellDate <= filterDate;\n }\n\n if (operator === \"onOrAfter\") {\n return cellDate >= filterDate;\n }\n\n if (operator === \"isBetween\" && typeof endValue === \"string\") {\n const filterDate2 = new Date(endValue);\n return cellDate >= filterDate && cellDate <= filterDate2;\n }\n }\n }\n\n if (operator === \"is\") {\n if (Array.isArray(cellValue)) {\n return cellValue.some((v) => String(v) === String(value));\n }\n return String(cellValue) === String(value);\n }\n\n if (operator === \"isNot\") {\n if (Array.isArray(cellValue)) {\n return !cellValue.some((v) => String(v) === String(value));\n }\n return String(cellValue) !== String(value);\n }\n\n if (operator === \"isAnyOf\" && Array.isArray(value)) {\n if (Array.isArray(cellValue)) {\n return cellValue.some((v) => value.some((fv) => String(v) === String(fv)));\n }\n return value.some((fv) => String(cellValue) === String(fv));\n }\n\n if (operator === \"isNoneOf\" && Array.isArray(value)) {\n if (Array.isArray(cellValue)) {\n return !cellValue.some((v) => value.some((fv) => String(v) === String(fv)));\n }\n return !value.some((fv) => String(cellValue) === String(fv));\n }\n\n return true;\n };\n}\n"],"mappings":"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","names":[]}
|