@jameskabz/nextcraft-ui 0.7.4 → 0.8.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/dist/components/craft-card.cjs +2 -2
- package/dist/components/craft-card.cjs.map +1 -1
- package/dist/components/craft-card.js +2 -2
- package/dist/components/craft-card.js.map +1 -1
- package/dist/components/craft-data-table-filters.cjs +184 -0
- package/dist/components/craft-data-table-filters.cjs.map +1 -0
- package/dist/components/craft-data-table-filters.d.cts +58 -0
- package/dist/components/craft-data-table-filters.d.ts +58 -0
- package/dist/components/craft-data-table-filters.js +160 -0
- package/dist/components/craft-data-table-filters.js.map +1 -0
- package/dist/components/craft-data-table-header.cjs +1 -1
- package/dist/components/craft-data-table-header.cjs.map +1 -1
- package/dist/components/craft-data-table-header.js +1 -1
- package/dist/components/craft-data-table-header.js.map +1 -1
- package/dist/components/craft-data-table.cjs +11 -8
- package/dist/components/craft-data-table.cjs.map +1 -1
- package/dist/components/craft-data-table.js +11 -8
- package/dist/components/craft-data-table.js.map +1 -1
- package/dist/components/craft-filter-bar.cjs +75 -5
- package/dist/components/craft-filter-bar.cjs.map +1 -1
- package/dist/components/craft-filter-bar.d.cts +29 -3
- package/dist/components/craft-filter-bar.d.ts +29 -3
- package/dist/components/craft-filter-bar.js +75 -5
- package/dist/components/craft-filter-bar.js.map +1 -1
- package/dist/components/craft-loader.cjs +1 -1
- package/dist/components/craft-loader.cjs.map +1 -1
- package/dist/components/craft-loader.js +1 -1
- package/dist/components/craft-loader.js.map +1 -1
- package/dist/index.cjs +3 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/styles.css +44 -5
- package/package.json +1 -1
|
@@ -148,7 +148,7 @@ function CraftDataTable({
|
|
|
148
148
|
loadingColor = "rgb(var(--nc-accent-1))",
|
|
149
149
|
loadingText = "Loading...",
|
|
150
150
|
loadingTextPosition = "bottom",
|
|
151
|
-
loadingBackground = "
|
|
151
|
+
loadingBackground = "rgb(var(--nc-accent-soft)/0.1)",
|
|
152
152
|
showSkeleton = true,
|
|
153
153
|
skeletonRows = 5,
|
|
154
154
|
truncateWords = 10,
|
|
@@ -332,15 +332,18 @@ function CraftDataTable({
|
|
|
332
332
|
variant === "bordered" && "border-b border-[rgb(var(--nc-border)/0.2)]",
|
|
333
333
|
variant === "minimal" && "border-b border-[rgb(var(--nc-border)/0.15)]",
|
|
334
334
|
striped && index % 2 === 1 && "bg-[rgb(var(--nc-surface)/0.04)]",
|
|
335
|
-
hoverable && !clickableRows && "hover:bg-[rgb(var(--nc-surface)
|
|
336
|
-
clickableRows && "cursor-pointer hover:bg-[rgb(var(--nc-surface)/0.
|
|
335
|
+
hoverable && !clickableRows && "hover:bg-[rgb(var(--nc-surface)]",
|
|
336
|
+
clickableRows && "cursor-pointer hover:bg-[rgb(var(--nc-surface)/0.1)]",
|
|
337
337
|
isSelected && "bg-[rgb(var(--nc-accent-1)/0.12)]",
|
|
338
338
|
rowLoading[rowId] && "opacity-60"
|
|
339
339
|
);
|
|
340
340
|
const containerClasses = (0, import_cn.cn)(
|
|
341
|
-
"overflow-hidden rounded-3xl border border-[rgb(var(--nc-border)/0.3)]",
|
|
342
|
-
"
|
|
343
|
-
variant === "minimal"
|
|
341
|
+
"relative overflow-hidden rounded-3xl border border-[rgb(var(--nc-border)/0.3)]",
|
|
342
|
+
"shadow-[0_18px_50px_rgba(0,0,0,0.35)] backdrop-blur-2xl",
|
|
343
|
+
variant === "minimal" ? "border-transparent bg-transparent shadow-none" : (0, import_cn.cn)(
|
|
344
|
+
"border-[rgb(var(--nc-accent-1)/0.35)]",
|
|
345
|
+
"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)]"
|
|
346
|
+
)
|
|
344
347
|
);
|
|
345
348
|
const openModal = (content) => {
|
|
346
349
|
if (!enableTextModal) return;
|
|
@@ -429,7 +432,7 @@ function CraftDataTable({
|
|
|
429
432
|
}
|
|
430
433
|
),
|
|
431
434
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_cn.cn)("overflow-x-auto", (loading || dataLoading) && "opacity-60"), children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("table", { className: "min-w-full border-collapse text-left text-sm", children: [
|
|
432
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("thead", { className: "bg-[rgb(var(--nc-
|
|
435
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("thead", { className: "bg-linear-to-r from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)] text-[rgb(var(--nc-fg-muted))]", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("tr", { children: [
|
|
433
436
|
resolvedSelectable && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("th", { className: (0, import_cn.cn)("w-12", headerPaddingClasses[density]), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex items-center justify-center", children: bulkLoading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_craft_loader.CraftLoader, { loading: true, type: "spin", size: "small", color: loadingColor }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
434
437
|
import_craft_checkbox.CraftCheckbox,
|
|
435
438
|
{
|
|
@@ -625,7 +628,7 @@ function CraftDataTable({
|
|
|
625
628
|
}
|
|
626
629
|
)
|
|
627
630
|
] }),
|
|
628
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_craft_modal.CraftModal, { open: showModal, onOpenChange: setShowModal, title: "Full Text", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-3", children: [
|
|
631
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_craft_modal.CraftModal, { open: showModal, onOpenChange: setShowModal, title: "Full Text", tone, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-3", children: [
|
|
629
632
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-[rgb(var(--nc-fg-muted))]", children: "Full content" }),
|
|
630
633
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "text-sm text-[rgb(var(--nc-fg))] whitespace-pre-wrap wrap-break-words", children: modalContent }),
|
|
631
634
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex justify-end", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_craft_button.CraftButton, { type: "button", variant: "ghost", onClick: closeModal, children: "Close" }) })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/craft-data-table.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftButton } from \"@/components/craft-button\";\nimport { CraftCheckbox } from \"@/components/craft-checkbox\";\nimport { CraftIcon } from \"@/components/craft-icon\";\nimport { CraftModal } from \"@/components/craft-modal\";\nimport { CraftTooltip } from \"@/components/craft-tooltip\";\nimport { CraftLoader } from \"@/components/craft-loader\";\nimport { CraftDataTableHeader } from \"@/components/craft-data-table-header\";\nimport { CraftDataTablePagination } from \"@/components/craft-data-table-pagination\";\n\nexport type CraftDataTableColumn<T> = {\n id: string;\n header?: React.ReactNode;\n label?: React.ReactNode;\n accessor?: keyof T | ((row: T) => unknown);\n cell?: (row: T) => React.ReactNode;\n formatter?: (value: unknown, row: T) => React.ReactNode;\n sortable?: boolean;\n filterable?: boolean;\n width?: string | number;\n align?: \"left\" | \"center\" | \"right\";\n hidden?: boolean;\n headerClassName?: string;\n cellClassName?: string;\n truncate?: boolean;\n maxWords?: number;\n};\n\nexport type CraftDataTableSort = {\n id: string;\n desc?: boolean;\n};\n\nexport type CraftDataTableAction<T> = {\n key: string;\n label?: React.ReactNode;\n icon?: string | React.ReactNode;\n variant?:\n | \"solid\"\n | \"outline\"\n | \"ghost\"\n | \"gradient\"\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"danger\"\n | \"success\"\n | \"warning\"\n | \"info\"\n | \"subtle\"\n | \"dark\"\n | \"light\"\n | \"primaryOutline\"\n | \"dangerOutline\"\n | \"successOutline\"\n | \"link\";\n permission?: boolean | ((item: T) => boolean);\n visible?: boolean | ((item: T) => boolean);\n disabled?: boolean | ((item: T) => boolean);\n tooltip?: React.ReactNode | ((item: T) => React.ReactNode);\n onClick?: (item: T) => void;\n className?: string | ((item: T) => string);\n};\n\nexport type CraftDataTableProps<T> = {\n data: T[];\n columns: CraftDataTableColumn<T>[];\n title?: React.ReactNode;\n description?: React.ReactNode;\n tone?: ThemeName;\n className?: string;\n toolbar?: React.ReactNode;\n emptyState?: React.ReactNode;\n actions?: CraftDataTableAction<T>[];\n showActionsColumn?: boolean;\n selectable?: boolean;\n enableRowSelection?: boolean;\n selectedRowIds?: Record<string, boolean>;\n onRowSelectionChange?: (selection: Record<string, boolean>) => void;\n getRowId?: (row: T, index: number) => string;\n rowKey?: keyof T | string;\n enableSorting?: boolean;\n enableFiltering?: boolean;\n enableColumnVisibility?: boolean;\n enablePagination?: boolean;\n showGlobalFilter?: boolean;\n manualSorting?: boolean;\n manualFiltering?: boolean;\n manualPagination?: boolean;\n sortBy?: CraftDataTableSort | null;\n onSortChange?: (sort: CraftDataTableSort | null) => void;\n filters?: Record<string, string>;\n onFiltersChange?: (filters: Record<string, string>) => void;\n globalFilter?: string;\n onGlobalFilterChange?: (value: string) => void;\n columnVisibility?: Record<string, boolean>;\n onColumnVisibilityChange?: (visibility: Record<string, boolean>) => void;\n pageIndex?: number;\n pageSize?: number;\n pageCount?: number;\n onPageChange?: (pageIndex: number) => void;\n onPageSizeChange?: (size: number) => void;\n striped?: boolean;\n hoverable?: boolean;\n clickableRows?: boolean;\n emptyText?: string;\n emptySubtitle?: string;\n variant?: \"default\" | \"bordered\" | \"minimal\";\n density?: \"compact\" | \"normal\" | \"comfortable\";\n headerVariant?: \"default\" | \"minimal\";\n headerPadding?: \"compact\" | \"normal\" | \"comfortable\";\n paginationVariant?: \"default\" | \"minimal\";\n paginationPadding?: \"compact\" | \"normal\" | \"comfortable\";\n loading?: boolean;\n dataLoading?: boolean;\n sortLoading?: boolean;\n paginationLoading?: boolean;\n bulkLoading?: boolean;\n rowLoading?: Record<string, boolean>;\n loadingType?: \"spin\" | \"pulse\" | \"bounce\" | \"ripple\" | \"bars\" | \"dots\" | \"ring\";\n loadingSize?: \"small\" | \"medium\" | \"large\" | \"xl\";\n loadingColor?: string;\n loadingText?: string;\n loadingTextPosition?: \"top\" | \"bottom\";\n loadingBackground?: string;\n showSkeleton?: boolean;\n skeletonRows?: number;\n truncateWords?: number;\n enableTextModal?: boolean;\n onRowClick?: (payload: { item: T; index: number }) => void;\n};\n\nfunction getColumnValue<T>(column: CraftDataTableColumn<T>, row: T) {\n if (typeof column.accessor === \"function\") return column.accessor(row);\n const record = row as Record<string, unknown>;\n if (typeof column.accessor === \"string\") return record[column.accessor];\n return record[column.id];\n}\n\nfunction normalizeValue(value: unknown) {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") return value.toLowerCase();\n if (value instanceof Date) return value.getTime();\n return String(value).toLowerCase();\n}\n\nfunction truncateText(text: string, maxWords: number) {\n const words = text.split(\" \");\n if (words.length <= maxWords) return text;\n return `${words.slice(0, maxWords).join(\" \")}...`;\n}\n\nfunction resolveActionVariant(\n variant: CraftDataTableAction<unknown>[\"variant\"]\n): \"solid\" | \"outline\" | \"ghost\" | \"gradient\" {\n switch (variant) {\n case \"solid\":\n case \"default\":\n case \"primary\":\n return \"solid\";\n case \"gradient\":\n return \"gradient\";\n case \"outline\":\n case \"primaryOutline\":\n case \"dangerOutline\":\n case \"successOutline\":\n return \"outline\";\n case \"ghost\":\n case \"link\":\n case \"secondary\":\n case \"danger\":\n case \"success\":\n case \"warning\":\n case \"info\":\n case \"subtle\":\n case \"dark\":\n case \"light\":\n default:\n return \"ghost\";\n }\n}\n\nexport function CraftDataTable<T>({\n data,\n columns,\n title,\n description,\n tone,\n className,\n toolbar,\n emptyState,\n actions = [],\n showActionsColumn = true,\n selectable,\n enableRowSelection = true,\n selectedRowIds,\n onRowSelectionChange,\n getRowId,\n rowKey,\n enableSorting = true,\n enableFiltering = true,\n enableColumnVisibility = true,\n enablePagination = true,\n showGlobalFilter,\n manualSorting = false,\n manualFiltering = false,\n manualPagination = false,\n sortBy,\n onSortChange,\n filters,\n onFiltersChange,\n globalFilter,\n onGlobalFilterChange,\n columnVisibility,\n onColumnVisibilityChange,\n pageIndex,\n pageSize = 10,\n pageCount,\n onPageChange,\n onPageSizeChange,\n striped = false,\n hoverable = true,\n clickableRows = false,\n emptyText = \"No data available\",\n emptySubtitle = \"Try adjusting your search or filter criteria\",\n variant = \"default\",\n density = \"normal\",\n headerVariant = \"default\",\n headerPadding = \"normal\",\n paginationVariant = \"default\",\n paginationPadding = \"normal\",\n loading = false,\n dataLoading = false,\n sortLoading = false,\n paginationLoading = false,\n bulkLoading = false,\n rowLoading = {},\n loadingType = \"dots\",\n loadingSize = \"medium\",\n loadingColor = \"rgb(var(--nc-accent-1))\",\n loadingText = \"Loading...\",\n loadingTextPosition = \"bottom\",\n loadingBackground = \"rgba(0, 0, 0, 0.35)\",\n showSkeleton = true,\n skeletonRows = 5,\n truncateWords = 10,\n enableTextModal = true,\n onRowClick,\n}: CraftDataTableProps<T>) {\n const [internalSort, setInternalSort] = React.useState<CraftDataTableSort | null>(null);\n const [internalFilters, setInternalFilters] = React.useState<Record<string, string>>({});\n const [internalGlobalFilter, setInternalGlobalFilter] = React.useState(\"\");\n const [internalVisibility, setInternalVisibility] = React.useState<Record<string, boolean>>(() =>\n columns.reduce((acc, column) => {\n acc[column.id] = !column.hidden;\n return acc;\n }, {} as Record<string, boolean>)\n );\n const [internalSelection, setInternalSelection] = React.useState<Record<string, boolean>>({});\n const [internalPageIndex, setInternalPageIndex] = React.useState(0);\n const [showColumns, setShowColumns] = React.useState(false);\n const [showModal, setShowModal] = React.useState(false);\n const [modalContent, setModalContent] = React.useState<string>(\"\");\n\n const resolvedSort = sortBy ?? internalSort;\n const resolvedFilters = filters ?? internalFilters;\n const resolvedGlobalFilter = globalFilter ?? internalGlobalFilter;\n const resolvedVisibility = columnVisibility ?? internalVisibility;\n const resolvedSelection = selectedRowIds ?? internalSelection;\n const resolvedPageIndex = pageIndex ?? internalPageIndex;\n const resolvedSelectable = selectable ?? enableRowSelection;\n\n const setSort = (next: CraftDataTableSort | null) => {\n if (sortBy === undefined) setInternalSort(next);\n onSortChange?.(next);\n };\n\n const setFilters = (next: Record<string, string>) => {\n if (filters === undefined) setInternalFilters(next);\n onFiltersChange?.(next);\n };\n\n const setVisibility = (next: Record<string, boolean>) => {\n if (columnVisibility === undefined) setInternalVisibility(next);\n onColumnVisibilityChange?.(next);\n };\n\n const setSelection = (next: Record<string, boolean>) => {\n if (selectedRowIds === undefined) setInternalSelection(next);\n onRowSelectionChange?.(next);\n };\n\n const setPageIndex = React.useCallback(\n (next: number) => {\n if (pageIndex === undefined) setInternalPageIndex(next);\n onPageChange?.(next);\n },\n [pageIndex, onPageChange]\n );\n\n const visibleColumns = columns.filter(\n (column) => resolvedVisibility[column.id] !== false\n );\n\n const filteredData = React.useMemo(() => {\n if (manualFiltering) return data;\n const globalValue = resolvedGlobalFilter.trim();\n return data.filter((row) => {\n if (globalValue) {\n const matchesGlobal = columns.some((column) => {\n const value = normalizeValue(getColumnValue(column, row));\n return String(value).includes(globalValue.toLowerCase());\n });\n if (!matchesGlobal) return false;\n }\n\n return Object.entries(resolvedFilters).every(([columnId, value]) => {\n if (!value) return true;\n const column = columns.find((col) => col.id === columnId);\n if (!column) return true;\n const cellValue = normalizeValue(getColumnValue(column, row));\n return String(cellValue).includes(value.toLowerCase());\n });\n });\n }, [columns, data, manualFiltering, resolvedFilters, resolvedGlobalFilter]);\n\n const sortedData = React.useMemo(() => {\n if (manualSorting || !resolvedSort) return filteredData;\n const column = columns.find((col) => col.id === resolvedSort.id);\n if (!column) return filteredData;\n const sorted = [...filteredData].sort((a, b) => {\n const valueA = normalizeValue(getColumnValue(column, a));\n const valueB = normalizeValue(getColumnValue(column, b));\n if (typeof valueA === \"number\" && typeof valueB === \"number\") {\n return valueA - valueB;\n }\n return String(valueA).localeCompare(String(valueB));\n });\n return resolvedSort.desc ? sorted.reverse() : sorted;\n }, [columns, filteredData, manualSorting, resolvedSort]);\n\n const resolvedPageCount = manualPagination\n ? Math.max(pageCount ?? 1, 1)\n : Math.max(Math.ceil(sortedData.length / pageSize), 1);\n\n React.useEffect(() => {\n if (resolvedPageIndex > resolvedPageCount - 1) {\n setPageIndex(Math.max(resolvedPageCount - 1, 0));\n }\n }, [resolvedPageCount, resolvedPageIndex, setPageIndex]);\n\n const pagedData = React.useMemo(() => {\n if (!enablePagination || manualPagination) return sortedData;\n const start = resolvedPageIndex * pageSize;\n return sortedData.slice(start, start + pageSize);\n }, [enablePagination, manualPagination, pageSize, resolvedPageIndex, sortedData]);\n\n const rowIdFor = React.useCallback(\n (row: T, index: number) => {\n if (getRowId) return getRowId(row, index);\n if (rowKey) return String((row as Record<string, unknown>)[rowKey as string] ?? index);\n return String(index);\n },\n [getRowId, rowKey]\n );\n\n const pageStartIndex =\n enablePagination && !manualPagination ? resolvedPageIndex * pageSize : 0;\n const pageRowIds = pagedData.map((row: T, index: number) =>\n rowIdFor(row, pageStartIndex + index)\n );\n const allSelected =\n pageRowIds.length > 0 && pageRowIds.every((id) => resolvedSelection[id]);\n const someSelected = pageRowIds.some((id) => resolvedSelection[id]);\n const headerCheckboxRef = React.useRef<HTMLInputElement | null>(null);\n\n React.useEffect(() => {\n if (headerCheckboxRef.current) {\n headerCheckboxRef.current.indeterminate = someSelected && !allSelected;\n }\n }, [someSelected, allSelected]);\n\n const toggleSort = (column: CraftDataTableColumn<T>) => {\n if (!enableSorting || column.sortable === false) return;\n const current = resolvedSort;\n if (!current || current.id !== column.id) {\n setSort({ id: column.id, desc: false });\n return;\n }\n if (!current.desc) {\n setSort({ id: column.id, desc: true });\n return;\n }\n setSort(null);\n };\n\n const resolvedShowGlobalFilter =\n showGlobalFilter ?? (enableFiltering && !toolbar);\n\n const setGlobalFilter = (next: string) => {\n if (globalFilter === undefined) setInternalGlobalFilter(next);\n onGlobalFilterChange?.(next);\n };\n\n const shouldShowActionsColumn = React.useMemo(() => {\n if (!showActionsColumn) return false;\n if (!actions || actions.length === 0) return false;\n return actions.some((action) => {\n if (action.permission === undefined) return true;\n if (typeof action.permission === \"boolean\") return action.permission;\n return true;\n });\n }, [actions, showActionsColumn]);\n\n const getVisibleActions = (item: T) =>\n actions.filter((action) => {\n if (action.permission !== undefined) {\n if (typeof action.permission === \"boolean\" && !action.permission) return false;\n if (typeof action.permission === \"function\" && !action.permission(item)) return false;\n }\n if (action.visible && typeof action.visible === \"function\") {\n return action.visible(item);\n }\n if (typeof action.visible === \"boolean\") return action.visible;\n return true;\n });\n\n const isActionDisabled = (action: CraftDataTableAction<T>, item: T) => {\n if (action.disabled && typeof action.disabled === \"function\") return action.disabled(item);\n if (typeof action.disabled === \"boolean\") return action.disabled;\n return false;\n };\n\n const handleActionClick = (action: CraftDataTableAction<T>, item: T) => {\n if (isActionDisabled(action, item)) return;\n action.onClick?.(item);\n };\n\n const totalColumns =\n visibleColumns.length +\n (resolvedSelectable ? 1 : 0) +\n (shouldShowActionsColumn ? 1 : 0);\n\n const densityPadding = {\n compact: \"px-4 py-2\",\n normal: \"px-6 py-4\",\n comfortable: \"px-8 py-6\",\n } as const;\n\n const headerPaddingClasses = {\n compact: \"px-4 py-2\",\n normal: \"px-6 py-3\",\n comfortable: \"px-8 py-4\",\n } as const;\n\n const rowClassNames = (isSelected: boolean, rowId: string, index: number) =>\n cn(\n \"transition-colors\",\n variant === \"bordered\" && \"border-b border-[rgb(var(--nc-border)/0.2)]\",\n variant === \"minimal\" && \"border-b border-[rgb(var(--nc-border)/0.15)]\",\n striped && index % 2 === 1 && \"bg-[rgb(var(--nc-surface)/0.04)]\",\n hoverable && !clickableRows && \"hover:bg-[rgb(var(--nc-surface)/0.12)]\",\n clickableRows && \"cursor-pointer hover:bg-[rgb(var(--nc-surface)/0.16)]\",\n isSelected && \"bg-[rgb(var(--nc-accent-1)/0.12)]\",\n rowLoading[rowId] && \"opacity-60\"\n );\n\n const containerClasses = cn(\n \"overflow-hidden rounded-3xl border border-[rgb(var(--nc-border)/0.3)]\",\n \"bg-[rgb(var(--nc-surface)/0.08)] shadow-[0_18px_50px_rgba(0,0,0,0.35)] backdrop-blur-2xl\",\n variant === \"minimal\" && \"border-transparent bg-transparent shadow-none\"\n );\n\n const openModal = (content: string) => {\n if (!enableTextModal) return;\n setModalContent(content);\n setShowModal(true);\n };\n\n const closeModal = () => {\n setShowModal(false);\n setModalContent(\"\");\n };\n\n return (\n <div className={cn(\"space-y-4\", className)} data-nc-theme={tone}>\n {toolbar}\n\n <CraftDataTableHeader\n title={title}\n description={description}\n variant={headerVariant}\n padding={headerPadding}\n tone={tone}\n filters={\n resolvedShowGlobalFilter ? (\n <div className=\"flex items-center gap-2 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))]\">\n <CraftIcon name=\"search\" className=\"h-4 w-4 text-[rgb(var(--nc-fg-muted))]\" />\n <input\n type=\"search\"\n value={resolvedGlobalFilter}\n onChange={(event) => setGlobalFilter(event.target.value)}\n placeholder=\"Search all columns...\"\n className=\"w-full max-w-xs bg-transparent text-xs text-[rgb(var(--nc-fg))] placeholder:text-[rgb(var(--nc-fg-muted))] focus:outline-none\"\n />\n </div>\n ) : null\n }\n actions={\n enableColumnVisibility ? (\n <div className=\"relative\">\n <CraftButton\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowColumns((prev) => !prev)}\n >\n Columns\n </CraftButton>\n {showColumns && (\n <div className=\"absolute right-0 top-12 z-20 w-56 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.2)] p-3 shadow-[0_12px_30px_rgba(0,0,0,0.35)] backdrop-blur-2xl\">\n <div className=\"grid gap-2\">\n {columns.map((column) => (\n <label\n key={column.id}\n className=\"flex items-center gap-2 text-xs text-[rgb(var(--nc-fg))]\"\n >\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 accent-[rgb(var(--nc-accent-1))]\"\n checked={resolvedVisibility[column.id] !== false}\n onChange={(event) =>\n setVisibility({\n ...resolvedVisibility,\n [column.id]: event.target.checked,\n })\n }\n />\n {column.header ?? column.label ?? column.id}\n </label>\n ))}\n </div>\n </div>\n )}\n </div>\n ) : null\n }\n />\n\n <div className={containerClasses}>\n <div className=\"relative\">\n <CraftLoader\n loading={loading || dataLoading}\n type={loadingType}\n size={loadingSize}\n color={loadingColor}\n overlay\n text={loadingText}\n textPosition={loadingTextPosition}\n backgroundColor={loadingBackground}\n />\n\n <div className={cn(\"overflow-x-auto\", (loading || dataLoading) && \"opacity-60\")}>\n <table className=\"min-w-full border-collapse text-left text-sm\">\n <thead className=\"bg-[rgb(var(--nc-surface)/0.12)] text-[rgb(var(--nc-fg-muted))]\">\n <tr>\n {resolvedSelectable && (\n <th className={cn(\"w-12\", headerPaddingClasses[density])}>\n <div className=\"flex items-center justify-center\">\n {bulkLoading ? (\n <CraftLoader loading type=\"spin\" size=\"small\" color={loadingColor} />\n ) : (\n <CraftCheckbox\n ref={headerCheckboxRef}\n checked={allSelected}\n onChange={(event) => {\n const next = { ...resolvedSelection };\n pageRowIds.forEach((id) => {\n next[id] = event.target.checked;\n });\n setSelection(next);\n }}\n />\n )}\n </div>\n </th>\n )}\n {visibleColumns.map((column) => {\n const headerLabel = column.header ?? column.label ?? column.id;\n return (\n <th\n key={column.id}\n className={cn(\n headerPaddingClasses[density],\n \"text-xs font-semibold uppercase tracking-[0.2em]\",\n column.headerClassName\n )}\n style={{ width: column.width }}\n >\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center gap-2\",\n enableSorting && column.sortable !== false\n ? \"cursor-pointer\"\n : \"cursor-default\"\n )}\n onClick={() => toggleSort(column)}\n >\n <span>{headerLabel}</span>\n {sortLoading && resolvedSort?.id === column.id ? (\n <CraftLoader loading type=\"spin\" size=\"small\" color={loadingColor} />\n ) : null}\n {resolvedSort?.id === column.id && !sortLoading ? (\n <span className=\"text-[rgb(var(--nc-accent-1))]\">\n {resolvedSort.desc ? \"↓\" : \"↑\"}\n </span>\n ) : null}\n </button>\n {enableFiltering && column.filterable !== false && (\n <input\n type=\"text\"\n value={resolvedFilters[column.id] ?? \"\"}\n onChange={(event) =>\n setFilters({\n ...resolvedFilters,\n [column.id]: event.target.value,\n })\n }\n placeholder=\"Filter\"\n className=\"mt-2 w-full rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.18)] px-2 py-1 text-xs text-[rgb(var(--nc-fg))]\"\n />\n )}\n </th>\n );\n })}\n {shouldShowActionsColumn && (\n <th className={cn(headerPaddingClasses[density], \"text-xs uppercase\")}>Actions</th>\n )}\n </tr>\n </thead>\n <tbody className=\"text-[rgb(var(--nc-fg))]\">\n {showSkeleton && (loading || dataLoading) ? (\n Array.from({ length: skeletonRows }).map((_, rowIndex) => (\n <tr key={`skeleton-${rowIndex}`} className=\"animate-pulse\">\n {resolvedSelectable && (\n <td className={cn(headerPaddingClasses[density], \"w-12\")}> \n <div className=\"h-4 w-4 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </td>\n )}\n {visibleColumns.map((column) => (\n <td key={column.id} className={cn(densityPadding[density])}>\n <div className=\"h-4 w-3/4 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </td>\n ))}\n {shouldShowActionsColumn && (\n <td className={cn(densityPadding[density])}>\n <div className=\"flex items-center justify-center gap-2\">\n <div className=\"h-6 w-6 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n <div className=\"h-6 w-6 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </div>\n </td>\n )}\n </tr>\n ))\n ) : pagedData.length === 0 ? (\n <tr>\n <td colSpan={totalColumns} className={cn(densityPadding[density], \"py-12\")}> \n {emptyState ?? (\n <div className=\"flex flex-col items-center justify-center text-center\">\n <CraftIcon\n name=\"search\"\n className=\"mb-4 h-12 w-12 text-[rgb(var(--nc-fg-muted))]\"\n />\n <p className=\"text-base font-semibold text-[rgb(var(--nc-fg))]\">\n {emptyText}\n </p>\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">\n {emptySubtitle}\n </p>\n </div>\n )}\n </td>\n </tr>\n ) : (\n pagedData.map((row: T, rowIndex: number) => {\n const rowId = rowIdFor(row, pageStartIndex + rowIndex);\n const isSelected = Boolean(resolvedSelection[rowId]);\n return (\n <tr\n key={rowId}\n className={rowClassNames(isSelected, rowId, rowIndex)}\n onClick={() => {\n if (!clickableRows) return;\n onRowClick?.({ item: row, index: rowIndex });\n }}\n >\n {resolvedSelectable && (\n <td className={cn(densityPadding[density], \"w-12\")}> \n <CraftCheckbox\n checked={isSelected}\n onChange={(event) =>\n setSelection({\n ...resolvedSelection,\n [rowId]: event.target.checked,\n })\n }\n />\n </td>\n )}\n {visibleColumns.map((column) => {\n const rawValue = getColumnValue(column, row);\n const formatted = column.formatter\n ? column.formatter(rawValue, row)\n : rawValue;\n const content = column.cell\n ? column.cell(row)\n : formatted ?? \"\";\n\n if (\n enableTextModal &&\n !column.cell &&\n typeof formatted === \"string\" &&\n (column.truncate ?? true) &&\n formatted.split(\" \").length > (column.maxWords ?? truncateWords)\n ) {\n const maxWords = column.maxWords ?? truncateWords;\n return (\n <td\n key={column.id}\n className={cn(\n densityPadding[density],\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n column.cellClassName\n )}\n >\n <button\n type=\"button\"\n className=\"text-[rgb(var(--nc-accent-1))] hover:text-[rgb(var(--nc-accent-2))]\"\n onClick={() => openModal(formatted)}\n >\n {truncateText(formatted, maxWords)}\n </button>\n </td>\n );\n }\n\n return (\n <td\n key={column.id}\n className={cn(\n densityPadding[density],\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n column.cellClassName\n )}\n >\n {content as React.ReactNode}\n </td>\n );\n })}\n {shouldShowActionsColumn && (\n <td className={cn(densityPadding[density])}>\n <div className=\"flex items-center justify-center gap-2\">\n {getVisibleActions(row).map((action) => {\n const tooltip =\n typeof action.tooltip === \"function\"\n ? action.tooltip(row)\n : action.tooltip;\n const className =\n typeof action.className === \"function\"\n ? action.className(row)\n : action.className;\n const button = (\n <CraftButton\n type=\"button\"\n size=\"sm\"\n variant={resolveActionVariant(action.variant)}\n disabled={isActionDisabled(action, row)}\n className={cn(\"h-8 w-8 p-0\", className)}\n onClick={(event) => {\n event.stopPropagation();\n handleActionClick(action, row);\n }}\n >\n {action.icon ? (\n typeof action.icon === \"string\" ? (\n <CraftIcon name={action.icon} className=\"h-4 w-4\" />\n ) : (\n action.icon\n )\n ) : action.label ? (\n <span className=\"text-[11px]\">{action.label}</span>\n ) : null}\n </CraftButton>\n );\n\n if (tooltip) {\n return (\n <CraftTooltip key={action.key} content={tooltip}>\n {button}\n </CraftTooltip>\n );\n }\n\n return <React.Fragment key={action.key}>{button}</React.Fragment>;\n })}\n </div>\n </td>\n )}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n </div>\n\n <CraftDataTablePagination\n currentPage={resolvedPageIndex}\n totalPages={resolvedPageCount}\n total={filteredData.length}\n pageSize={pageSize}\n selectable={Boolean(resolvedSelectable)}\n selectedCount={Object.values(resolvedSelection).filter(Boolean).length}\n showPagination={enablePagination}\n loading={paginationLoading}\n disabled={loading || dataLoading}\n onPageChange={setPageIndex}\n onPageSizeChange={onPageSizeChange}\n variant={paginationVariant}\n padding={paginationPadding}\n tone={tone}\n />\n </div>\n\n <CraftModal open={showModal} onOpenChange={setShowModal} title=\"Full Text\">\n <div className=\"space-y-3\">\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">Full content</p>\n <div className=\"text-sm text-[rgb(var(--nc-fg))] whitespace-pre-wrap wrap-break-words\">\n {modalContent}\n </div>\n <div className=\"flex justify-end\">\n <CraftButton type=\"button\" variant=\"ghost\" onClick={closeModal}>\n Close\n </CraftButton>\n </div>\n </div>\n </CraftModal>\n </div>\n );\n}\n"],"mappings":"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","names":["className"]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/craft-data-table.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftButton } from \"@/components/craft-button\";\nimport { CraftCheckbox } from \"@/components/craft-checkbox\";\nimport { CraftIcon } from \"@/components/craft-icon\";\nimport { CraftModal } from \"@/components/craft-modal\";\nimport { CraftTooltip } from \"@/components/craft-tooltip\";\nimport { CraftLoader } from \"@/components/craft-loader\";\nimport { CraftDataTableHeader } from \"@/components/craft-data-table-header\";\nimport { CraftDataTablePagination } from \"@/components/craft-data-table-pagination\";\n\nexport type CraftDataTableColumn<T> = {\n id: string;\n header?: React.ReactNode;\n label?: React.ReactNode;\n accessor?: keyof T | ((row: T) => unknown);\n cell?: (row: T) => React.ReactNode;\n formatter?: (value: unknown, row: T) => React.ReactNode;\n sortable?: boolean;\n filterable?: boolean;\n width?: string | number;\n align?: \"left\" | \"center\" | \"right\";\n hidden?: boolean;\n headerClassName?: string;\n cellClassName?: string;\n truncate?: boolean;\n maxWords?: number;\n};\n\nexport type CraftDataTableSort = {\n id: string;\n desc?: boolean;\n};\n\nexport type CraftDataTableAction<T> = {\n key: string;\n label?: React.ReactNode;\n icon?: string | React.ReactNode;\n variant?:\n | \"solid\"\n | \"outline\"\n | \"ghost\"\n | \"gradient\"\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"danger\"\n | \"success\"\n | \"warning\"\n | \"info\"\n | \"subtle\"\n | \"dark\"\n | \"light\"\n | \"primaryOutline\"\n | \"dangerOutline\"\n | \"successOutline\"\n | \"link\";\n permission?: boolean | ((item: T) => boolean);\n visible?: boolean | ((item: T) => boolean);\n disabled?: boolean | ((item: T) => boolean);\n tooltip?: React.ReactNode | ((item: T) => React.ReactNode);\n onClick?: (item: T) => void;\n className?: string | ((item: T) => string);\n};\n\nexport type CraftDataTableProps<T> = {\n data: T[];\n columns: CraftDataTableColumn<T>[];\n title?: React.ReactNode;\n description?: React.ReactNode;\n tone?: ThemeName;\n className?: string;\n toolbar?: React.ReactNode;\n emptyState?: React.ReactNode;\n actions?: CraftDataTableAction<T>[];\n showActionsColumn?: boolean;\n selectable?: boolean;\n enableRowSelection?: boolean;\n selectedRowIds?: Record<string, boolean>;\n onRowSelectionChange?: (selection: Record<string, boolean>) => void;\n getRowId?: (row: T, index: number) => string;\n rowKey?: keyof T | string;\n enableSorting?: boolean;\n enableFiltering?: boolean;\n enableColumnVisibility?: boolean;\n enablePagination?: boolean;\n showGlobalFilter?: boolean;\n manualSorting?: boolean;\n manualFiltering?: boolean;\n manualPagination?: boolean;\n sortBy?: CraftDataTableSort | null;\n onSortChange?: (sort: CraftDataTableSort | null) => void;\n filters?: Record<string, string>;\n onFiltersChange?: (filters: Record<string, string>) => void;\n globalFilter?: string;\n onGlobalFilterChange?: (value: string) => void;\n columnVisibility?: Record<string, boolean>;\n onColumnVisibilityChange?: (visibility: Record<string, boolean>) => void;\n pageIndex?: number;\n pageSize?: number;\n pageCount?: number;\n onPageChange?: (pageIndex: number) => void;\n onPageSizeChange?: (size: number) => void;\n striped?: boolean;\n hoverable?: boolean;\n clickableRows?: boolean;\n emptyText?: string;\n emptySubtitle?: string;\n variant?: \"default\" | \"bordered\" | \"minimal\";\n density?: \"compact\" | \"normal\" | \"comfortable\";\n headerVariant?: \"default\" | \"minimal\";\n headerPadding?: \"compact\" | \"normal\" | \"comfortable\";\n paginationVariant?: \"default\" | \"minimal\";\n paginationPadding?: \"compact\" | \"normal\" | \"comfortable\";\n loading?: boolean;\n dataLoading?: boolean;\n sortLoading?: boolean;\n paginationLoading?: boolean;\n bulkLoading?: boolean;\n rowLoading?: Record<string, boolean>;\n loadingType?: \"spin\" | \"pulse\" | \"bounce\" | \"ripple\" | \"bars\" | \"dots\" | \"ring\";\n loadingSize?: \"small\" | \"medium\" | \"large\" | \"xl\";\n loadingColor?: string;\n loadingText?: string;\n loadingTextPosition?: \"top\" | \"bottom\";\n loadingBackground?: string;\n showSkeleton?: boolean;\n skeletonRows?: number;\n truncateWords?: number;\n enableTextModal?: boolean;\n onRowClick?: (payload: { item: T; index: number }) => void;\n};\n\nfunction getColumnValue<T>(column: CraftDataTableColumn<T>, row: T) {\n if (typeof column.accessor === \"function\") return column.accessor(row);\n const record = row as Record<string, unknown>;\n if (typeof column.accessor === \"string\") return record[column.accessor];\n return record[column.id];\n}\n\nfunction normalizeValue(value: unknown) {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") return value.toLowerCase();\n if (value instanceof Date) return value.getTime();\n return String(value).toLowerCase();\n}\n\nfunction truncateText(text: string, maxWords: number) {\n const words = text.split(\" \");\n if (words.length <= maxWords) return text;\n return `${words.slice(0, maxWords).join(\" \")}...`;\n}\n\nfunction resolveActionVariant(\n variant: CraftDataTableAction<unknown>[\"variant\"]\n): \"solid\" | \"outline\" | \"ghost\" | \"gradient\" {\n switch (variant) {\n case \"solid\":\n case \"default\":\n case \"primary\":\n return \"solid\";\n case \"gradient\":\n return \"gradient\";\n case \"outline\":\n case \"primaryOutline\":\n case \"dangerOutline\":\n case \"successOutline\":\n return \"outline\";\n case \"ghost\":\n case \"link\":\n case \"secondary\":\n case \"danger\":\n case \"success\":\n case \"warning\":\n case \"info\":\n case \"subtle\":\n case \"dark\":\n case \"light\":\n default:\n return \"ghost\";\n }\n}\n\nexport function CraftDataTable<T>({\n data,\n columns,\n title,\n description,\n tone,\n className,\n toolbar,\n emptyState,\n actions = [],\n showActionsColumn = true,\n selectable,\n enableRowSelection = true,\n selectedRowIds,\n onRowSelectionChange,\n getRowId,\n rowKey,\n enableSorting = true,\n enableFiltering = true,\n enableColumnVisibility = true,\n enablePagination = true,\n showGlobalFilter,\n manualSorting = false,\n manualFiltering = false,\n manualPagination = false,\n sortBy,\n onSortChange,\n filters,\n onFiltersChange,\n globalFilter,\n onGlobalFilterChange,\n columnVisibility,\n onColumnVisibilityChange,\n pageIndex,\n pageSize = 10,\n pageCount,\n onPageChange,\n onPageSizeChange,\n striped = false,\n hoverable = true,\n clickableRows = false,\n emptyText = \"No data available\",\n emptySubtitle = \"Try adjusting your search or filter criteria\",\n variant = \"default\",\n density = \"normal\",\n headerVariant = \"default\",\n headerPadding = \"normal\",\n paginationVariant = \"default\",\n paginationPadding = \"normal\",\n loading = false,\n dataLoading = false,\n sortLoading = false,\n paginationLoading = false,\n bulkLoading = false,\n rowLoading = {},\n loadingType = \"dots\",\n loadingSize = \"medium\",\n loadingColor = \"rgb(var(--nc-accent-1))\",\n loadingText = \"Loading...\",\n loadingTextPosition = \"bottom\",\n loadingBackground = \"rgb(var(--nc-accent-soft)/0.1)\",\n showSkeleton = true,\n skeletonRows = 5,\n truncateWords = 10,\n enableTextModal = true,\n onRowClick,\n}: CraftDataTableProps<T>) {\n const [internalSort, setInternalSort] = React.useState<CraftDataTableSort | null>(null);\n const [internalFilters, setInternalFilters] = React.useState<Record<string, string>>({});\n const [internalGlobalFilter, setInternalGlobalFilter] = React.useState(\"\");\n const [internalVisibility, setInternalVisibility] = React.useState<Record<string, boolean>>(() =>\n columns.reduce((acc, column) => {\n acc[column.id] = !column.hidden;\n return acc;\n }, {} as Record<string, boolean>)\n );\n const [internalSelection, setInternalSelection] = React.useState<Record<string, boolean>>({});\n const [internalPageIndex, setInternalPageIndex] = React.useState(0);\n const [showColumns, setShowColumns] = React.useState(false);\n const [showModal, setShowModal] = React.useState(false);\n const [modalContent, setModalContent] = React.useState<string>(\"\");\n\n const resolvedSort = sortBy ?? internalSort;\n const resolvedFilters = filters ?? internalFilters;\n const resolvedGlobalFilter = globalFilter ?? internalGlobalFilter;\n const resolvedVisibility = columnVisibility ?? internalVisibility;\n const resolvedSelection = selectedRowIds ?? internalSelection;\n const resolvedPageIndex = pageIndex ?? internalPageIndex;\n const resolvedSelectable = selectable ?? enableRowSelection;\n\n const setSort = (next: CraftDataTableSort | null) => {\n if (sortBy === undefined) setInternalSort(next);\n onSortChange?.(next);\n };\n\n const setFilters = (next: Record<string, string>) => {\n if (filters === undefined) setInternalFilters(next);\n onFiltersChange?.(next);\n };\n\n const setVisibility = (next: Record<string, boolean>) => {\n if (columnVisibility === undefined) setInternalVisibility(next);\n onColumnVisibilityChange?.(next);\n };\n\n const setSelection = (next: Record<string, boolean>) => {\n if (selectedRowIds === undefined) setInternalSelection(next);\n onRowSelectionChange?.(next);\n };\n\n const setPageIndex = React.useCallback(\n (next: number) => {\n if (pageIndex === undefined) setInternalPageIndex(next);\n onPageChange?.(next);\n },\n [pageIndex, onPageChange]\n );\n\n const visibleColumns = columns.filter(\n (column) => resolvedVisibility[column.id] !== false\n );\n\n const filteredData = React.useMemo(() => {\n if (manualFiltering) return data;\n const globalValue = resolvedGlobalFilter.trim();\n return data.filter((row) => {\n if (globalValue) {\n const matchesGlobal = columns.some((column) => {\n const value = normalizeValue(getColumnValue(column, row));\n return String(value).includes(globalValue.toLowerCase());\n });\n if (!matchesGlobal) return false;\n }\n\n return Object.entries(resolvedFilters).every(([columnId, value]) => {\n if (!value) return true;\n const column = columns.find((col) => col.id === columnId);\n if (!column) return true;\n const cellValue = normalizeValue(getColumnValue(column, row));\n return String(cellValue).includes(value.toLowerCase());\n });\n });\n }, [columns, data, manualFiltering, resolvedFilters, resolvedGlobalFilter]);\n\n const sortedData = React.useMemo(() => {\n if (manualSorting || !resolvedSort) return filteredData;\n const column = columns.find((col) => col.id === resolvedSort.id);\n if (!column) return filteredData;\n const sorted = [...filteredData].sort((a, b) => {\n const valueA = normalizeValue(getColumnValue(column, a));\n const valueB = normalizeValue(getColumnValue(column, b));\n if (typeof valueA === \"number\" && typeof valueB === \"number\") {\n return valueA - valueB;\n }\n return String(valueA).localeCompare(String(valueB));\n });\n return resolvedSort.desc ? sorted.reverse() : sorted;\n }, [columns, filteredData, manualSorting, resolvedSort]);\n\n const resolvedPageCount = manualPagination\n ? Math.max(pageCount ?? 1, 1)\n : Math.max(Math.ceil(sortedData.length / pageSize), 1);\n\n React.useEffect(() => {\n if (resolvedPageIndex > resolvedPageCount - 1) {\n setPageIndex(Math.max(resolvedPageCount - 1, 0));\n }\n }, [resolvedPageCount, resolvedPageIndex, setPageIndex]);\n\n const pagedData = React.useMemo(() => {\n if (!enablePagination || manualPagination) return sortedData;\n const start = resolvedPageIndex * pageSize;\n return sortedData.slice(start, start + pageSize);\n }, [enablePagination, manualPagination, pageSize, resolvedPageIndex, sortedData]);\n\n const rowIdFor = React.useCallback(\n (row: T, index: number) => {\n if (getRowId) return getRowId(row, index);\n if (rowKey) return String((row as Record<string, unknown>)[rowKey as string] ?? index);\n return String(index);\n },\n [getRowId, rowKey]\n );\n\n const pageStartIndex =\n enablePagination && !manualPagination ? resolvedPageIndex * pageSize : 0;\n const pageRowIds = pagedData.map((row: T, index: number) =>\n rowIdFor(row, pageStartIndex + index)\n );\n const allSelected =\n pageRowIds.length > 0 && pageRowIds.every((id) => resolvedSelection[id]);\n const someSelected = pageRowIds.some((id) => resolvedSelection[id]);\n const headerCheckboxRef = React.useRef<HTMLInputElement | null>(null);\n\n React.useEffect(() => {\n if (headerCheckboxRef.current) {\n headerCheckboxRef.current.indeterminate = someSelected && !allSelected;\n }\n }, [someSelected, allSelected]);\n\n const toggleSort = (column: CraftDataTableColumn<T>) => {\n if (!enableSorting || column.sortable === false) return;\n const current = resolvedSort;\n if (!current || current.id !== column.id) {\n setSort({ id: column.id, desc: false });\n return;\n }\n if (!current.desc) {\n setSort({ id: column.id, desc: true });\n return;\n }\n setSort(null);\n };\n\n const resolvedShowGlobalFilter =\n showGlobalFilter ?? (enableFiltering && !toolbar);\n\n const setGlobalFilter = (next: string) => {\n if (globalFilter === undefined) setInternalGlobalFilter(next);\n onGlobalFilterChange?.(next);\n };\n\n const shouldShowActionsColumn = React.useMemo(() => {\n if (!showActionsColumn) return false;\n if (!actions || actions.length === 0) return false;\n return actions.some((action) => {\n if (action.permission === undefined) return true;\n if (typeof action.permission === \"boolean\") return action.permission;\n return true;\n });\n }, [actions, showActionsColumn]);\n\n const getVisibleActions = (item: T) =>\n actions.filter((action) => {\n if (action.permission !== undefined) {\n if (typeof action.permission === \"boolean\" && !action.permission) return false;\n if (typeof action.permission === \"function\" && !action.permission(item)) return false;\n }\n if (action.visible && typeof action.visible === \"function\") {\n return action.visible(item);\n }\n if (typeof action.visible === \"boolean\") return action.visible;\n return true;\n });\n\n const isActionDisabled = (action: CraftDataTableAction<T>, item: T) => {\n if (action.disabled && typeof action.disabled === \"function\") return action.disabled(item);\n if (typeof action.disabled === \"boolean\") return action.disabled;\n return false;\n };\n\n const handleActionClick = (action: CraftDataTableAction<T>, item: T) => {\n if (isActionDisabled(action, item)) return;\n action.onClick?.(item);\n };\n\n const totalColumns =\n visibleColumns.length +\n (resolvedSelectable ? 1 : 0) +\n (shouldShowActionsColumn ? 1 : 0);\n\n const densityPadding = {\n compact: \"px-4 py-2\",\n normal: \"px-6 py-4\",\n comfortable: \"px-8 py-6\",\n } as const;\n\n const headerPaddingClasses = {\n compact: \"px-4 py-2\",\n normal: \"px-6 py-3\",\n comfortable: \"px-8 py-4\",\n } as const;\n\n const rowClassNames = (isSelected: boolean, rowId: string, index: number) =>\n cn(\n \"transition-colors\",\n variant === \"bordered\" && \"border-b border-[rgb(var(--nc-border)/0.2)]\",\n variant === \"minimal\" && \"border-b border-[rgb(var(--nc-border)/0.15)]\",\n striped && index % 2 === 1 && \"bg-[rgb(var(--nc-surface)/0.04)]\",\n hoverable && !clickableRows && \"hover:bg-[rgb(var(--nc-surface)]\",\n clickableRows && \"cursor-pointer hover:bg-[rgb(var(--nc-surface)/0.1)]\",\n isSelected && \"bg-[rgb(var(--nc-accent-1)/0.12)]\",\n rowLoading[rowId] && \"opacity-60\"\n );\n\n const containerClasses = cn(\n \"relative overflow-hidden rounded-3xl border border-[rgb(var(--nc-border)/0.3)]\",\n \"shadow-[0_18px_50px_rgba(0,0,0,0.35)] backdrop-blur-2xl\",\n variant === \"minimal\"\n ? \"border-transparent bg-transparent shadow-none\"\n : cn(\n \"border-[rgb(var(--nc-accent-1)/0.35)]\",\n \"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)]\"\n )\n );\n\n const openModal = (content: string) => {\n if (!enableTextModal) return;\n setModalContent(content);\n setShowModal(true);\n };\n\n const closeModal = () => {\n setShowModal(false);\n setModalContent(\"\");\n };\n\n return (\n <div className={cn(\"space-y-4\", className)} data-nc-theme={tone}>\n {toolbar}\n\n <CraftDataTableHeader\n title={title}\n description={description}\n variant={headerVariant}\n padding={headerPadding}\n tone={tone}\n filters={\n resolvedShowGlobalFilter ? (\n <div className=\"flex items-center gap-2 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))]\">\n <CraftIcon name=\"search\" className=\"h-4 w-4 text-[rgb(var(--nc-fg-muted))]\" />\n <input\n type=\"search\"\n value={resolvedGlobalFilter}\n onChange={(event) => setGlobalFilter(event.target.value)}\n placeholder=\"Search all columns...\"\n className=\"w-full max-w-xs bg-transparent text-xs text-[rgb(var(--nc-fg))] placeholder:text-[rgb(var(--nc-fg-muted))] focus:outline-none\"\n />\n </div>\n ) : null\n }\n actions={\n enableColumnVisibility ? (\n <div className=\"relative\">\n <CraftButton\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowColumns((prev) => !prev)}\n >\n Columns\n </CraftButton>\n {showColumns && (\n <div className=\"absolute right-0 top-12 z-20 w-56 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.2)] p-3 shadow-[0_12px_30px_rgba(0,0,0,0.35)] backdrop-blur-2xl\">\n <div className=\"grid gap-2\">\n {columns.map((column) => (\n <label\n key={column.id}\n className=\"flex items-center gap-2 text-xs text-[rgb(var(--nc-fg))]\"\n >\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 accent-[rgb(var(--nc-accent-1))]\"\n checked={resolvedVisibility[column.id] !== false}\n onChange={(event) =>\n setVisibility({\n ...resolvedVisibility,\n [column.id]: event.target.checked,\n })\n }\n />\n {column.header ?? column.label ?? column.id}\n </label>\n ))}\n </div>\n </div>\n )}\n </div>\n ) : null\n }\n />\n\n <div className={containerClasses}>\n <div className=\"relative\">\n <CraftLoader\n loading={loading || dataLoading}\n type={loadingType}\n size={loadingSize}\n color={loadingColor}\n overlay\n text={loadingText}\n textPosition={loadingTextPosition}\n backgroundColor={loadingBackground}\n />\n\n <div className={cn(\"overflow-x-auto\", (loading || dataLoading) && \"opacity-60\")}>\n <table className=\"min-w-full border-collapse text-left text-sm\">\n <thead className=\"bg-linear-to-r from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)] text-[rgb(var(--nc-fg-muted))]\">\n <tr>\n {resolvedSelectable && (\n <th className={cn(\"w-12\", headerPaddingClasses[density])}>\n <div className=\"flex items-center justify-center\">\n {bulkLoading ? (\n <CraftLoader loading type=\"spin\" size=\"small\" color={loadingColor} />\n ) : (\n <CraftCheckbox\n ref={headerCheckboxRef}\n checked={allSelected}\n onChange={(event) => {\n const next = { ...resolvedSelection };\n pageRowIds.forEach((id) => {\n next[id] = event.target.checked;\n });\n setSelection(next);\n }}\n />\n )}\n </div>\n </th>\n )}\n {visibleColumns.map((column) => {\n const headerLabel = column.header ?? column.label ?? column.id;\n return (\n <th\n key={column.id}\n className={cn(\n headerPaddingClasses[density],\n \"text-xs font-semibold uppercase tracking-[0.2em]\",\n column.headerClassName\n )}\n style={{ width: column.width }}\n >\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center gap-2\",\n enableSorting && column.sortable !== false\n ? \"cursor-pointer\"\n : \"cursor-default\"\n )}\n onClick={() => toggleSort(column)}\n >\n <span>{headerLabel}</span>\n {sortLoading && resolvedSort?.id === column.id ? (\n <CraftLoader loading type=\"spin\" size=\"small\" color={loadingColor} />\n ) : null}\n {resolvedSort?.id === column.id && !sortLoading ? (\n <span className=\"text-[rgb(var(--nc-accent-1))]\">\n {resolvedSort.desc ? \"↓\" : \"↑\"}\n </span>\n ) : null}\n </button>\n {enableFiltering && column.filterable !== false && (\n <input\n type=\"text\"\n value={resolvedFilters[column.id] ?? \"\"}\n onChange={(event) =>\n setFilters({\n ...resolvedFilters,\n [column.id]: event.target.value,\n })\n }\n placeholder=\"Filter\"\n className=\"mt-2 w-full rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.18)] px-2 py-1 text-xs text-[rgb(var(--nc-fg))]\"\n />\n )}\n </th>\n );\n })}\n {shouldShowActionsColumn && (\n <th className={cn(headerPaddingClasses[density], \"text-xs uppercase\")}>Actions</th>\n )}\n </tr>\n </thead>\n <tbody className=\"text-[rgb(var(--nc-fg))]\">\n {showSkeleton && (loading || dataLoading) ? (\n Array.from({ length: skeletonRows }).map((_, rowIndex) => (\n <tr key={`skeleton-${rowIndex}`} className=\"animate-pulse\">\n {resolvedSelectable && (\n <td className={cn(headerPaddingClasses[density], \"w-12\")}> \n <div className=\"h-4 w-4 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </td>\n )}\n {visibleColumns.map((column) => (\n <td key={column.id} className={cn(densityPadding[density])}>\n <div className=\"h-4 w-3/4 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </td>\n ))}\n {shouldShowActionsColumn && (\n <td className={cn(densityPadding[density])}>\n <div className=\"flex items-center justify-center gap-2\">\n <div className=\"h-6 w-6 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n <div className=\"h-6 w-6 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </div>\n </td>\n )}\n </tr>\n ))\n ) : pagedData.length === 0 ? (\n <tr>\n <td colSpan={totalColumns} className={cn(densityPadding[density], \"py-12\")}> \n {emptyState ?? (\n <div className=\"flex flex-col items-center justify-center text-center\">\n <CraftIcon\n name=\"search\"\n className=\"mb-4 h-12 w-12 text-[rgb(var(--nc-fg-muted))]\"\n />\n <p className=\"text-base font-semibold text-[rgb(var(--nc-fg))]\">\n {emptyText}\n </p>\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">\n {emptySubtitle}\n </p>\n </div>\n )}\n </td>\n </tr>\n ) : (\n pagedData.map((row: T, rowIndex: number) => {\n const rowId = rowIdFor(row, pageStartIndex + rowIndex);\n const isSelected = Boolean(resolvedSelection[rowId]);\n return (\n <tr\n key={rowId}\n className={rowClassNames(isSelected, rowId, rowIndex)}\n onClick={() => {\n if (!clickableRows) return;\n onRowClick?.({ item: row, index: rowIndex });\n }}\n >\n {resolvedSelectable && (\n <td className={cn(densityPadding[density], \"w-12\")}> \n <CraftCheckbox\n checked={isSelected}\n onChange={(event) =>\n setSelection({\n ...resolvedSelection,\n [rowId]: event.target.checked,\n })\n }\n />\n </td>\n )}\n {visibleColumns.map((column) => {\n const rawValue = getColumnValue(column, row);\n const formatted = column.formatter\n ? column.formatter(rawValue, row)\n : rawValue;\n const content = column.cell\n ? column.cell(row)\n : formatted ?? \"\";\n\n if (\n enableTextModal &&\n !column.cell &&\n typeof formatted === \"string\" &&\n (column.truncate ?? true) &&\n formatted.split(\" \").length > (column.maxWords ?? truncateWords)\n ) {\n const maxWords = column.maxWords ?? truncateWords;\n return (\n <td\n key={column.id}\n className={cn(\n densityPadding[density],\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n column.cellClassName\n )}\n >\n <button\n type=\"button\"\n className=\"text-[rgb(var(--nc-accent-1))] hover:text-[rgb(var(--nc-accent-2))]\"\n onClick={() => openModal(formatted)}\n >\n {truncateText(formatted, maxWords)}\n </button>\n </td>\n );\n }\n\n return (\n <td\n key={column.id}\n className={cn(\n densityPadding[density],\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n column.cellClassName\n )}\n >\n {content as React.ReactNode}\n </td>\n );\n })}\n {shouldShowActionsColumn && (\n <td className={cn(densityPadding[density])}>\n <div className=\"flex items-center justify-center gap-2\">\n {getVisibleActions(row).map((action) => {\n const tooltip =\n typeof action.tooltip === \"function\"\n ? action.tooltip(row)\n : action.tooltip;\n const className =\n typeof action.className === \"function\"\n ? action.className(row)\n : action.className;\n const button = (\n <CraftButton\n type=\"button\"\n size=\"sm\"\n variant={resolveActionVariant(action.variant)}\n disabled={isActionDisabled(action, row)}\n className={cn(\"h-8 w-8 p-0\", className)}\n onClick={(event) => {\n event.stopPropagation();\n handleActionClick(action, row);\n }}\n >\n {action.icon ? (\n typeof action.icon === \"string\" ? (\n <CraftIcon name={action.icon} className=\"h-4 w-4\" />\n ) : (\n action.icon\n )\n ) : action.label ? (\n <span className=\"text-[11px]\">{action.label}</span>\n ) : null}\n </CraftButton>\n );\n\n if (tooltip) {\n return (\n <CraftTooltip key={action.key} content={tooltip}>\n {button}\n </CraftTooltip>\n );\n }\n\n return <React.Fragment key={action.key}>{button}</React.Fragment>;\n })}\n </div>\n </td>\n )}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n </div>\n\n <CraftDataTablePagination\n currentPage={resolvedPageIndex}\n totalPages={resolvedPageCount}\n total={filteredData.length}\n pageSize={pageSize}\n selectable={Boolean(resolvedSelectable)}\n selectedCount={Object.values(resolvedSelection).filter(Boolean).length}\n showPagination={enablePagination}\n loading={paginationLoading}\n disabled={loading || dataLoading}\n onPageChange={setPageIndex}\n onPageSizeChange={onPageSizeChange}\n variant={paginationVariant}\n padding={paginationPadding}\n tone={tone}\n />\n </div>\n\n <CraftModal open={showModal} onOpenChange={setShowModal} title=\"Full Text\" tone={tone}>\n <div className=\"space-y-3\">\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">Full content</p>\n <div className=\"text-sm text-[rgb(var(--nc-fg))] whitespace-pre-wrap wrap-break-words\">\n {modalContent}\n </div>\n <div className=\"flex justify-end\">\n <CraftButton type=\"button\" variant=\"ghost\" onClick={closeModal}>\n Close\n </CraftButton>\n </div>\n </div>\n </CraftModal>\n </div>\n );\n}\n"],"mappings":"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","names":["className"]}
|
|
@@ -115,7 +115,7 @@ function CraftDataTable({
|
|
|
115
115
|
loadingColor = "rgb(var(--nc-accent-1))",
|
|
116
116
|
loadingText = "Loading...",
|
|
117
117
|
loadingTextPosition = "bottom",
|
|
118
|
-
loadingBackground = "
|
|
118
|
+
loadingBackground = "rgb(var(--nc-accent-soft)/0.1)",
|
|
119
119
|
showSkeleton = true,
|
|
120
120
|
skeletonRows = 5,
|
|
121
121
|
truncateWords = 10,
|
|
@@ -299,15 +299,18 @@ function CraftDataTable({
|
|
|
299
299
|
variant === "bordered" && "border-b border-[rgb(var(--nc-border)/0.2)]",
|
|
300
300
|
variant === "minimal" && "border-b border-[rgb(var(--nc-border)/0.15)]",
|
|
301
301
|
striped && index % 2 === 1 && "bg-[rgb(var(--nc-surface)/0.04)]",
|
|
302
|
-
hoverable && !clickableRows && "hover:bg-[rgb(var(--nc-surface)
|
|
303
|
-
clickableRows && "cursor-pointer hover:bg-[rgb(var(--nc-surface)/0.
|
|
302
|
+
hoverable && !clickableRows && "hover:bg-[rgb(var(--nc-surface)]",
|
|
303
|
+
clickableRows && "cursor-pointer hover:bg-[rgb(var(--nc-surface)/0.1)]",
|
|
304
304
|
isSelected && "bg-[rgb(var(--nc-accent-1)/0.12)]",
|
|
305
305
|
rowLoading[rowId] && "opacity-60"
|
|
306
306
|
);
|
|
307
307
|
const containerClasses = cn(
|
|
308
|
-
"overflow-hidden rounded-3xl border border-[rgb(var(--nc-border)/0.3)]",
|
|
309
|
-
"
|
|
310
|
-
variant === "minimal"
|
|
308
|
+
"relative overflow-hidden rounded-3xl border border-[rgb(var(--nc-border)/0.3)]",
|
|
309
|
+
"shadow-[0_18px_50px_rgba(0,0,0,0.35)] backdrop-blur-2xl",
|
|
310
|
+
variant === "minimal" ? "border-transparent bg-transparent shadow-none" : cn(
|
|
311
|
+
"border-[rgb(var(--nc-accent-1)/0.35)]",
|
|
312
|
+
"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)]"
|
|
313
|
+
)
|
|
311
314
|
);
|
|
312
315
|
const openModal = (content) => {
|
|
313
316
|
if (!enableTextModal) return;
|
|
@@ -396,7 +399,7 @@ function CraftDataTable({
|
|
|
396
399
|
}
|
|
397
400
|
),
|
|
398
401
|
/* @__PURE__ */ jsx("div", { className: cn("overflow-x-auto", (loading || dataLoading) && "opacity-60"), children: /* @__PURE__ */ jsxs("table", { className: "min-w-full border-collapse text-left text-sm", children: [
|
|
399
|
-
/* @__PURE__ */ jsx("thead", { className: "bg-[rgb(var(--nc-
|
|
402
|
+
/* @__PURE__ */ jsx("thead", { className: "bg-linear-to-r from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)] text-[rgb(var(--nc-fg-muted))]", children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
400
403
|
resolvedSelectable && /* @__PURE__ */ jsx("th", { className: cn("w-12", headerPaddingClasses[density]), children: /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center", children: bulkLoading ? /* @__PURE__ */ jsx(CraftLoader, { loading: true, type: "spin", size: "small", color: loadingColor }) : /* @__PURE__ */ jsx(
|
|
401
404
|
CraftCheckbox,
|
|
402
405
|
{
|
|
@@ -592,7 +595,7 @@ function CraftDataTable({
|
|
|
592
595
|
}
|
|
593
596
|
)
|
|
594
597
|
] }),
|
|
595
|
-
/* @__PURE__ */ jsx(CraftModal, { open: showModal, onOpenChange: setShowModal, title: "Full Text", children: /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
598
|
+
/* @__PURE__ */ jsx(CraftModal, { open: showModal, onOpenChange: setShowModal, title: "Full Text", tone, children: /* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
596
599
|
/* @__PURE__ */ jsx("p", { className: "text-sm text-[rgb(var(--nc-fg-muted))]", children: "Full content" }),
|
|
597
600
|
/* @__PURE__ */ jsx("div", { className: "text-sm text-[rgb(var(--nc-fg))] whitespace-pre-wrap wrap-break-words", children: modalContent }),
|
|
598
601
|
/* @__PURE__ */ jsx("div", { className: "flex justify-end", children: /* @__PURE__ */ jsx(CraftButton, { type: "button", variant: "ghost", onClick: closeModal, children: "Close" }) })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/craft-data-table.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftButton } from \"@/components/craft-button\";\nimport { CraftCheckbox } from \"@/components/craft-checkbox\";\nimport { CraftIcon } from \"@/components/craft-icon\";\nimport { CraftModal } from \"@/components/craft-modal\";\nimport { CraftTooltip } from \"@/components/craft-tooltip\";\nimport { CraftLoader } from \"@/components/craft-loader\";\nimport { CraftDataTableHeader } from \"@/components/craft-data-table-header\";\nimport { CraftDataTablePagination } from \"@/components/craft-data-table-pagination\";\n\nexport type CraftDataTableColumn<T> = {\n id: string;\n header?: React.ReactNode;\n label?: React.ReactNode;\n accessor?: keyof T | ((row: T) => unknown);\n cell?: (row: T) => React.ReactNode;\n formatter?: (value: unknown, row: T) => React.ReactNode;\n sortable?: boolean;\n filterable?: boolean;\n width?: string | number;\n align?: \"left\" | \"center\" | \"right\";\n hidden?: boolean;\n headerClassName?: string;\n cellClassName?: string;\n truncate?: boolean;\n maxWords?: number;\n};\n\nexport type CraftDataTableSort = {\n id: string;\n desc?: boolean;\n};\n\nexport type CraftDataTableAction<T> = {\n key: string;\n label?: React.ReactNode;\n icon?: string | React.ReactNode;\n variant?:\n | \"solid\"\n | \"outline\"\n | \"ghost\"\n | \"gradient\"\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"danger\"\n | \"success\"\n | \"warning\"\n | \"info\"\n | \"subtle\"\n | \"dark\"\n | \"light\"\n | \"primaryOutline\"\n | \"dangerOutline\"\n | \"successOutline\"\n | \"link\";\n permission?: boolean | ((item: T) => boolean);\n visible?: boolean | ((item: T) => boolean);\n disabled?: boolean | ((item: T) => boolean);\n tooltip?: React.ReactNode | ((item: T) => React.ReactNode);\n onClick?: (item: T) => void;\n className?: string | ((item: T) => string);\n};\n\nexport type CraftDataTableProps<T> = {\n data: T[];\n columns: CraftDataTableColumn<T>[];\n title?: React.ReactNode;\n description?: React.ReactNode;\n tone?: ThemeName;\n className?: string;\n toolbar?: React.ReactNode;\n emptyState?: React.ReactNode;\n actions?: CraftDataTableAction<T>[];\n showActionsColumn?: boolean;\n selectable?: boolean;\n enableRowSelection?: boolean;\n selectedRowIds?: Record<string, boolean>;\n onRowSelectionChange?: (selection: Record<string, boolean>) => void;\n getRowId?: (row: T, index: number) => string;\n rowKey?: keyof T | string;\n enableSorting?: boolean;\n enableFiltering?: boolean;\n enableColumnVisibility?: boolean;\n enablePagination?: boolean;\n showGlobalFilter?: boolean;\n manualSorting?: boolean;\n manualFiltering?: boolean;\n manualPagination?: boolean;\n sortBy?: CraftDataTableSort | null;\n onSortChange?: (sort: CraftDataTableSort | null) => void;\n filters?: Record<string, string>;\n onFiltersChange?: (filters: Record<string, string>) => void;\n globalFilter?: string;\n onGlobalFilterChange?: (value: string) => void;\n columnVisibility?: Record<string, boolean>;\n onColumnVisibilityChange?: (visibility: Record<string, boolean>) => void;\n pageIndex?: number;\n pageSize?: number;\n pageCount?: number;\n onPageChange?: (pageIndex: number) => void;\n onPageSizeChange?: (size: number) => void;\n striped?: boolean;\n hoverable?: boolean;\n clickableRows?: boolean;\n emptyText?: string;\n emptySubtitle?: string;\n variant?: \"default\" | \"bordered\" | \"minimal\";\n density?: \"compact\" | \"normal\" | \"comfortable\";\n headerVariant?: \"default\" | \"minimal\";\n headerPadding?: \"compact\" | \"normal\" | \"comfortable\";\n paginationVariant?: \"default\" | \"minimal\";\n paginationPadding?: \"compact\" | \"normal\" | \"comfortable\";\n loading?: boolean;\n dataLoading?: boolean;\n sortLoading?: boolean;\n paginationLoading?: boolean;\n bulkLoading?: boolean;\n rowLoading?: Record<string, boolean>;\n loadingType?: \"spin\" | \"pulse\" | \"bounce\" | \"ripple\" | \"bars\" | \"dots\" | \"ring\";\n loadingSize?: \"small\" | \"medium\" | \"large\" | \"xl\";\n loadingColor?: string;\n loadingText?: string;\n loadingTextPosition?: \"top\" | \"bottom\";\n loadingBackground?: string;\n showSkeleton?: boolean;\n skeletonRows?: number;\n truncateWords?: number;\n enableTextModal?: boolean;\n onRowClick?: (payload: { item: T; index: number }) => void;\n};\n\nfunction getColumnValue<T>(column: CraftDataTableColumn<T>, row: T) {\n if (typeof column.accessor === \"function\") return column.accessor(row);\n const record = row as Record<string, unknown>;\n if (typeof column.accessor === \"string\") return record[column.accessor];\n return record[column.id];\n}\n\nfunction normalizeValue(value: unknown) {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") return value.toLowerCase();\n if (value instanceof Date) return value.getTime();\n return String(value).toLowerCase();\n}\n\nfunction truncateText(text: string, maxWords: number) {\n const words = text.split(\" \");\n if (words.length <= maxWords) return text;\n return `${words.slice(0, maxWords).join(\" \")}...`;\n}\n\nfunction resolveActionVariant(\n variant: CraftDataTableAction<unknown>[\"variant\"]\n): \"solid\" | \"outline\" | \"ghost\" | \"gradient\" {\n switch (variant) {\n case \"solid\":\n case \"default\":\n case \"primary\":\n return \"solid\";\n case \"gradient\":\n return \"gradient\";\n case \"outline\":\n case \"primaryOutline\":\n case \"dangerOutline\":\n case \"successOutline\":\n return \"outline\";\n case \"ghost\":\n case \"link\":\n case \"secondary\":\n case \"danger\":\n case \"success\":\n case \"warning\":\n case \"info\":\n case \"subtle\":\n case \"dark\":\n case \"light\":\n default:\n return \"ghost\";\n }\n}\n\nexport function CraftDataTable<T>({\n data,\n columns,\n title,\n description,\n tone,\n className,\n toolbar,\n emptyState,\n actions = [],\n showActionsColumn = true,\n selectable,\n enableRowSelection = true,\n selectedRowIds,\n onRowSelectionChange,\n getRowId,\n rowKey,\n enableSorting = true,\n enableFiltering = true,\n enableColumnVisibility = true,\n enablePagination = true,\n showGlobalFilter,\n manualSorting = false,\n manualFiltering = false,\n manualPagination = false,\n sortBy,\n onSortChange,\n filters,\n onFiltersChange,\n globalFilter,\n onGlobalFilterChange,\n columnVisibility,\n onColumnVisibilityChange,\n pageIndex,\n pageSize = 10,\n pageCount,\n onPageChange,\n onPageSizeChange,\n striped = false,\n hoverable = true,\n clickableRows = false,\n emptyText = \"No data available\",\n emptySubtitle = \"Try adjusting your search or filter criteria\",\n variant = \"default\",\n density = \"normal\",\n headerVariant = \"default\",\n headerPadding = \"normal\",\n paginationVariant = \"default\",\n paginationPadding = \"normal\",\n loading = false,\n dataLoading = false,\n sortLoading = false,\n paginationLoading = false,\n bulkLoading = false,\n rowLoading = {},\n loadingType = \"dots\",\n loadingSize = \"medium\",\n loadingColor = \"rgb(var(--nc-accent-1))\",\n loadingText = \"Loading...\",\n loadingTextPosition = \"bottom\",\n loadingBackground = \"rgba(0, 0, 0, 0.35)\",\n showSkeleton = true,\n skeletonRows = 5,\n truncateWords = 10,\n enableTextModal = true,\n onRowClick,\n}: CraftDataTableProps<T>) {\n const [internalSort, setInternalSort] = React.useState<CraftDataTableSort | null>(null);\n const [internalFilters, setInternalFilters] = React.useState<Record<string, string>>({});\n const [internalGlobalFilter, setInternalGlobalFilter] = React.useState(\"\");\n const [internalVisibility, setInternalVisibility] = React.useState<Record<string, boolean>>(() =>\n columns.reduce((acc, column) => {\n acc[column.id] = !column.hidden;\n return acc;\n }, {} as Record<string, boolean>)\n );\n const [internalSelection, setInternalSelection] = React.useState<Record<string, boolean>>({});\n const [internalPageIndex, setInternalPageIndex] = React.useState(0);\n const [showColumns, setShowColumns] = React.useState(false);\n const [showModal, setShowModal] = React.useState(false);\n const [modalContent, setModalContent] = React.useState<string>(\"\");\n\n const resolvedSort = sortBy ?? internalSort;\n const resolvedFilters = filters ?? internalFilters;\n const resolvedGlobalFilter = globalFilter ?? internalGlobalFilter;\n const resolvedVisibility = columnVisibility ?? internalVisibility;\n const resolvedSelection = selectedRowIds ?? internalSelection;\n const resolvedPageIndex = pageIndex ?? internalPageIndex;\n const resolvedSelectable = selectable ?? enableRowSelection;\n\n const setSort = (next: CraftDataTableSort | null) => {\n if (sortBy === undefined) setInternalSort(next);\n onSortChange?.(next);\n };\n\n const setFilters = (next: Record<string, string>) => {\n if (filters === undefined) setInternalFilters(next);\n onFiltersChange?.(next);\n };\n\n const setVisibility = (next: Record<string, boolean>) => {\n if (columnVisibility === undefined) setInternalVisibility(next);\n onColumnVisibilityChange?.(next);\n };\n\n const setSelection = (next: Record<string, boolean>) => {\n if (selectedRowIds === undefined) setInternalSelection(next);\n onRowSelectionChange?.(next);\n };\n\n const setPageIndex = React.useCallback(\n (next: number) => {\n if (pageIndex === undefined) setInternalPageIndex(next);\n onPageChange?.(next);\n },\n [pageIndex, onPageChange]\n );\n\n const visibleColumns = columns.filter(\n (column) => resolvedVisibility[column.id] !== false\n );\n\n const filteredData = React.useMemo(() => {\n if (manualFiltering) return data;\n const globalValue = resolvedGlobalFilter.trim();\n return data.filter((row) => {\n if (globalValue) {\n const matchesGlobal = columns.some((column) => {\n const value = normalizeValue(getColumnValue(column, row));\n return String(value).includes(globalValue.toLowerCase());\n });\n if (!matchesGlobal) return false;\n }\n\n return Object.entries(resolvedFilters).every(([columnId, value]) => {\n if (!value) return true;\n const column = columns.find((col) => col.id === columnId);\n if (!column) return true;\n const cellValue = normalizeValue(getColumnValue(column, row));\n return String(cellValue).includes(value.toLowerCase());\n });\n });\n }, [columns, data, manualFiltering, resolvedFilters, resolvedGlobalFilter]);\n\n const sortedData = React.useMemo(() => {\n if (manualSorting || !resolvedSort) return filteredData;\n const column = columns.find((col) => col.id === resolvedSort.id);\n if (!column) return filteredData;\n const sorted = [...filteredData].sort((a, b) => {\n const valueA = normalizeValue(getColumnValue(column, a));\n const valueB = normalizeValue(getColumnValue(column, b));\n if (typeof valueA === \"number\" && typeof valueB === \"number\") {\n return valueA - valueB;\n }\n return String(valueA).localeCompare(String(valueB));\n });\n return resolvedSort.desc ? sorted.reverse() : sorted;\n }, [columns, filteredData, manualSorting, resolvedSort]);\n\n const resolvedPageCount = manualPagination\n ? Math.max(pageCount ?? 1, 1)\n : Math.max(Math.ceil(sortedData.length / pageSize), 1);\n\n React.useEffect(() => {\n if (resolvedPageIndex > resolvedPageCount - 1) {\n setPageIndex(Math.max(resolvedPageCount - 1, 0));\n }\n }, [resolvedPageCount, resolvedPageIndex, setPageIndex]);\n\n const pagedData = React.useMemo(() => {\n if (!enablePagination || manualPagination) return sortedData;\n const start = resolvedPageIndex * pageSize;\n return sortedData.slice(start, start + pageSize);\n }, [enablePagination, manualPagination, pageSize, resolvedPageIndex, sortedData]);\n\n const rowIdFor = React.useCallback(\n (row: T, index: number) => {\n if (getRowId) return getRowId(row, index);\n if (rowKey) return String((row as Record<string, unknown>)[rowKey as string] ?? index);\n return String(index);\n },\n [getRowId, rowKey]\n );\n\n const pageStartIndex =\n enablePagination && !manualPagination ? resolvedPageIndex * pageSize : 0;\n const pageRowIds = pagedData.map((row: T, index: number) =>\n rowIdFor(row, pageStartIndex + index)\n );\n const allSelected =\n pageRowIds.length > 0 && pageRowIds.every((id) => resolvedSelection[id]);\n const someSelected = pageRowIds.some((id) => resolvedSelection[id]);\n const headerCheckboxRef = React.useRef<HTMLInputElement | null>(null);\n\n React.useEffect(() => {\n if (headerCheckboxRef.current) {\n headerCheckboxRef.current.indeterminate = someSelected && !allSelected;\n }\n }, [someSelected, allSelected]);\n\n const toggleSort = (column: CraftDataTableColumn<T>) => {\n if (!enableSorting || column.sortable === false) return;\n const current = resolvedSort;\n if (!current || current.id !== column.id) {\n setSort({ id: column.id, desc: false });\n return;\n }\n if (!current.desc) {\n setSort({ id: column.id, desc: true });\n return;\n }\n setSort(null);\n };\n\n const resolvedShowGlobalFilter =\n showGlobalFilter ?? (enableFiltering && !toolbar);\n\n const setGlobalFilter = (next: string) => {\n if (globalFilter === undefined) setInternalGlobalFilter(next);\n onGlobalFilterChange?.(next);\n };\n\n const shouldShowActionsColumn = React.useMemo(() => {\n if (!showActionsColumn) return false;\n if (!actions || actions.length === 0) return false;\n return actions.some((action) => {\n if (action.permission === undefined) return true;\n if (typeof action.permission === \"boolean\") return action.permission;\n return true;\n });\n }, [actions, showActionsColumn]);\n\n const getVisibleActions = (item: T) =>\n actions.filter((action) => {\n if (action.permission !== undefined) {\n if (typeof action.permission === \"boolean\" && !action.permission) return false;\n if (typeof action.permission === \"function\" && !action.permission(item)) return false;\n }\n if (action.visible && typeof action.visible === \"function\") {\n return action.visible(item);\n }\n if (typeof action.visible === \"boolean\") return action.visible;\n return true;\n });\n\n const isActionDisabled = (action: CraftDataTableAction<T>, item: T) => {\n if (action.disabled && typeof action.disabled === \"function\") return action.disabled(item);\n if (typeof action.disabled === \"boolean\") return action.disabled;\n return false;\n };\n\n const handleActionClick = (action: CraftDataTableAction<T>, item: T) => {\n if (isActionDisabled(action, item)) return;\n action.onClick?.(item);\n };\n\n const totalColumns =\n visibleColumns.length +\n (resolvedSelectable ? 1 : 0) +\n (shouldShowActionsColumn ? 1 : 0);\n\n const densityPadding = {\n compact: \"px-4 py-2\",\n normal: \"px-6 py-4\",\n comfortable: \"px-8 py-6\",\n } as const;\n\n const headerPaddingClasses = {\n compact: \"px-4 py-2\",\n normal: \"px-6 py-3\",\n comfortable: \"px-8 py-4\",\n } as const;\n\n const rowClassNames = (isSelected: boolean, rowId: string, index: number) =>\n cn(\n \"transition-colors\",\n variant === \"bordered\" && \"border-b border-[rgb(var(--nc-border)/0.2)]\",\n variant === \"minimal\" && \"border-b border-[rgb(var(--nc-border)/0.15)]\",\n striped && index % 2 === 1 && \"bg-[rgb(var(--nc-surface)/0.04)]\",\n hoverable && !clickableRows && \"hover:bg-[rgb(var(--nc-surface)/0.12)]\",\n clickableRows && \"cursor-pointer hover:bg-[rgb(var(--nc-surface)/0.16)]\",\n isSelected && \"bg-[rgb(var(--nc-accent-1)/0.12)]\",\n rowLoading[rowId] && \"opacity-60\"\n );\n\n const containerClasses = cn(\n \"overflow-hidden rounded-3xl border border-[rgb(var(--nc-border)/0.3)]\",\n \"bg-[rgb(var(--nc-surface)/0.08)] shadow-[0_18px_50px_rgba(0,0,0,0.35)] backdrop-blur-2xl\",\n variant === \"minimal\" && \"border-transparent bg-transparent shadow-none\"\n );\n\n const openModal = (content: string) => {\n if (!enableTextModal) return;\n setModalContent(content);\n setShowModal(true);\n };\n\n const closeModal = () => {\n setShowModal(false);\n setModalContent(\"\");\n };\n\n return (\n <div className={cn(\"space-y-4\", className)} data-nc-theme={tone}>\n {toolbar}\n\n <CraftDataTableHeader\n title={title}\n description={description}\n variant={headerVariant}\n padding={headerPadding}\n tone={tone}\n filters={\n resolvedShowGlobalFilter ? (\n <div className=\"flex items-center gap-2 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))]\">\n <CraftIcon name=\"search\" className=\"h-4 w-4 text-[rgb(var(--nc-fg-muted))]\" />\n <input\n type=\"search\"\n value={resolvedGlobalFilter}\n onChange={(event) => setGlobalFilter(event.target.value)}\n placeholder=\"Search all columns...\"\n className=\"w-full max-w-xs bg-transparent text-xs text-[rgb(var(--nc-fg))] placeholder:text-[rgb(var(--nc-fg-muted))] focus:outline-none\"\n />\n </div>\n ) : null\n }\n actions={\n enableColumnVisibility ? (\n <div className=\"relative\">\n <CraftButton\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowColumns((prev) => !prev)}\n >\n Columns\n </CraftButton>\n {showColumns && (\n <div className=\"absolute right-0 top-12 z-20 w-56 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.2)] p-3 shadow-[0_12px_30px_rgba(0,0,0,0.35)] backdrop-blur-2xl\">\n <div className=\"grid gap-2\">\n {columns.map((column) => (\n <label\n key={column.id}\n className=\"flex items-center gap-2 text-xs text-[rgb(var(--nc-fg))]\"\n >\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 accent-[rgb(var(--nc-accent-1))]\"\n checked={resolvedVisibility[column.id] !== false}\n onChange={(event) =>\n setVisibility({\n ...resolvedVisibility,\n [column.id]: event.target.checked,\n })\n }\n />\n {column.header ?? column.label ?? column.id}\n </label>\n ))}\n </div>\n </div>\n )}\n </div>\n ) : null\n }\n />\n\n <div className={containerClasses}>\n <div className=\"relative\">\n <CraftLoader\n loading={loading || dataLoading}\n type={loadingType}\n size={loadingSize}\n color={loadingColor}\n overlay\n text={loadingText}\n textPosition={loadingTextPosition}\n backgroundColor={loadingBackground}\n />\n\n <div className={cn(\"overflow-x-auto\", (loading || dataLoading) && \"opacity-60\")}>\n <table className=\"min-w-full border-collapse text-left text-sm\">\n <thead className=\"bg-[rgb(var(--nc-surface)/0.12)] text-[rgb(var(--nc-fg-muted))]\">\n <tr>\n {resolvedSelectable && (\n <th className={cn(\"w-12\", headerPaddingClasses[density])}>\n <div className=\"flex items-center justify-center\">\n {bulkLoading ? (\n <CraftLoader loading type=\"spin\" size=\"small\" color={loadingColor} />\n ) : (\n <CraftCheckbox\n ref={headerCheckboxRef}\n checked={allSelected}\n onChange={(event) => {\n const next = { ...resolvedSelection };\n pageRowIds.forEach((id) => {\n next[id] = event.target.checked;\n });\n setSelection(next);\n }}\n />\n )}\n </div>\n </th>\n )}\n {visibleColumns.map((column) => {\n const headerLabel = column.header ?? column.label ?? column.id;\n return (\n <th\n key={column.id}\n className={cn(\n headerPaddingClasses[density],\n \"text-xs font-semibold uppercase tracking-[0.2em]\",\n column.headerClassName\n )}\n style={{ width: column.width }}\n >\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center gap-2\",\n enableSorting && column.sortable !== false\n ? \"cursor-pointer\"\n : \"cursor-default\"\n )}\n onClick={() => toggleSort(column)}\n >\n <span>{headerLabel}</span>\n {sortLoading && resolvedSort?.id === column.id ? (\n <CraftLoader loading type=\"spin\" size=\"small\" color={loadingColor} />\n ) : null}\n {resolvedSort?.id === column.id && !sortLoading ? (\n <span className=\"text-[rgb(var(--nc-accent-1))]\">\n {resolvedSort.desc ? \"↓\" : \"↑\"}\n </span>\n ) : null}\n </button>\n {enableFiltering && column.filterable !== false && (\n <input\n type=\"text\"\n value={resolvedFilters[column.id] ?? \"\"}\n onChange={(event) =>\n setFilters({\n ...resolvedFilters,\n [column.id]: event.target.value,\n })\n }\n placeholder=\"Filter\"\n className=\"mt-2 w-full rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.18)] px-2 py-1 text-xs text-[rgb(var(--nc-fg))]\"\n />\n )}\n </th>\n );\n })}\n {shouldShowActionsColumn && (\n <th className={cn(headerPaddingClasses[density], \"text-xs uppercase\")}>Actions</th>\n )}\n </tr>\n </thead>\n <tbody className=\"text-[rgb(var(--nc-fg))]\">\n {showSkeleton && (loading || dataLoading) ? (\n Array.from({ length: skeletonRows }).map((_, rowIndex) => (\n <tr key={`skeleton-${rowIndex}`} className=\"animate-pulse\">\n {resolvedSelectable && (\n <td className={cn(headerPaddingClasses[density], \"w-12\")}> \n <div className=\"h-4 w-4 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </td>\n )}\n {visibleColumns.map((column) => (\n <td key={column.id} className={cn(densityPadding[density])}>\n <div className=\"h-4 w-3/4 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </td>\n ))}\n {shouldShowActionsColumn && (\n <td className={cn(densityPadding[density])}>\n <div className=\"flex items-center justify-center gap-2\">\n <div className=\"h-6 w-6 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n <div className=\"h-6 w-6 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </div>\n </td>\n )}\n </tr>\n ))\n ) : pagedData.length === 0 ? (\n <tr>\n <td colSpan={totalColumns} className={cn(densityPadding[density], \"py-12\")}> \n {emptyState ?? (\n <div className=\"flex flex-col items-center justify-center text-center\">\n <CraftIcon\n name=\"search\"\n className=\"mb-4 h-12 w-12 text-[rgb(var(--nc-fg-muted))]\"\n />\n <p className=\"text-base font-semibold text-[rgb(var(--nc-fg))]\">\n {emptyText}\n </p>\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">\n {emptySubtitle}\n </p>\n </div>\n )}\n </td>\n </tr>\n ) : (\n pagedData.map((row: T, rowIndex: number) => {\n const rowId = rowIdFor(row, pageStartIndex + rowIndex);\n const isSelected = Boolean(resolvedSelection[rowId]);\n return (\n <tr\n key={rowId}\n className={rowClassNames(isSelected, rowId, rowIndex)}\n onClick={() => {\n if (!clickableRows) return;\n onRowClick?.({ item: row, index: rowIndex });\n }}\n >\n {resolvedSelectable && (\n <td className={cn(densityPadding[density], \"w-12\")}> \n <CraftCheckbox\n checked={isSelected}\n onChange={(event) =>\n setSelection({\n ...resolvedSelection,\n [rowId]: event.target.checked,\n })\n }\n />\n </td>\n )}\n {visibleColumns.map((column) => {\n const rawValue = getColumnValue(column, row);\n const formatted = column.formatter\n ? column.formatter(rawValue, row)\n : rawValue;\n const content = column.cell\n ? column.cell(row)\n : formatted ?? \"\";\n\n if (\n enableTextModal &&\n !column.cell &&\n typeof formatted === \"string\" &&\n (column.truncate ?? true) &&\n formatted.split(\" \").length > (column.maxWords ?? truncateWords)\n ) {\n const maxWords = column.maxWords ?? truncateWords;\n return (\n <td\n key={column.id}\n className={cn(\n densityPadding[density],\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n column.cellClassName\n )}\n >\n <button\n type=\"button\"\n className=\"text-[rgb(var(--nc-accent-1))] hover:text-[rgb(var(--nc-accent-2))]\"\n onClick={() => openModal(formatted)}\n >\n {truncateText(formatted, maxWords)}\n </button>\n </td>\n );\n }\n\n return (\n <td\n key={column.id}\n className={cn(\n densityPadding[density],\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n column.cellClassName\n )}\n >\n {content as React.ReactNode}\n </td>\n );\n })}\n {shouldShowActionsColumn && (\n <td className={cn(densityPadding[density])}>\n <div className=\"flex items-center justify-center gap-2\">\n {getVisibleActions(row).map((action) => {\n const tooltip =\n typeof action.tooltip === \"function\"\n ? action.tooltip(row)\n : action.tooltip;\n const className =\n typeof action.className === \"function\"\n ? action.className(row)\n : action.className;\n const button = (\n <CraftButton\n type=\"button\"\n size=\"sm\"\n variant={resolveActionVariant(action.variant)}\n disabled={isActionDisabled(action, row)}\n className={cn(\"h-8 w-8 p-0\", className)}\n onClick={(event) => {\n event.stopPropagation();\n handleActionClick(action, row);\n }}\n >\n {action.icon ? (\n typeof action.icon === \"string\" ? (\n <CraftIcon name={action.icon} className=\"h-4 w-4\" />\n ) : (\n action.icon\n )\n ) : action.label ? (\n <span className=\"text-[11px]\">{action.label}</span>\n ) : null}\n </CraftButton>\n );\n\n if (tooltip) {\n return (\n <CraftTooltip key={action.key} content={tooltip}>\n {button}\n </CraftTooltip>\n );\n }\n\n return <React.Fragment key={action.key}>{button}</React.Fragment>;\n })}\n </div>\n </td>\n )}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n </div>\n\n <CraftDataTablePagination\n currentPage={resolvedPageIndex}\n totalPages={resolvedPageCount}\n total={filteredData.length}\n pageSize={pageSize}\n selectable={Boolean(resolvedSelectable)}\n selectedCount={Object.values(resolvedSelection).filter(Boolean).length}\n showPagination={enablePagination}\n loading={paginationLoading}\n disabled={loading || dataLoading}\n onPageChange={setPageIndex}\n onPageSizeChange={onPageSizeChange}\n variant={paginationVariant}\n padding={paginationPadding}\n tone={tone}\n />\n </div>\n\n <CraftModal open={showModal} onOpenChange={setShowModal} title=\"Full Text\">\n <div className=\"space-y-3\">\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">Full content</p>\n <div className=\"text-sm text-[rgb(var(--nc-fg))] whitespace-pre-wrap wrap-break-words\">\n {modalContent}\n </div>\n <div className=\"flex justify-end\">\n <CraftButton type=\"button\" variant=\"ghost\" onClick={closeModal}>\n Close\n </CraftButton>\n </div>\n </div>\n </CraftModal>\n </div>\n );\n}\n"],"mappings":"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","names":["className"]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/craft-data-table.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"@/utils/cn\";\nimport type { ThemeName } from \"@/theme/theme-context\";\nimport { CraftButton } from \"@/components/craft-button\";\nimport { CraftCheckbox } from \"@/components/craft-checkbox\";\nimport { CraftIcon } from \"@/components/craft-icon\";\nimport { CraftModal } from \"@/components/craft-modal\";\nimport { CraftTooltip } from \"@/components/craft-tooltip\";\nimport { CraftLoader } from \"@/components/craft-loader\";\nimport { CraftDataTableHeader } from \"@/components/craft-data-table-header\";\nimport { CraftDataTablePagination } from \"@/components/craft-data-table-pagination\";\n\nexport type CraftDataTableColumn<T> = {\n id: string;\n header?: React.ReactNode;\n label?: React.ReactNode;\n accessor?: keyof T | ((row: T) => unknown);\n cell?: (row: T) => React.ReactNode;\n formatter?: (value: unknown, row: T) => React.ReactNode;\n sortable?: boolean;\n filterable?: boolean;\n width?: string | number;\n align?: \"left\" | \"center\" | \"right\";\n hidden?: boolean;\n headerClassName?: string;\n cellClassName?: string;\n truncate?: boolean;\n maxWords?: number;\n};\n\nexport type CraftDataTableSort = {\n id: string;\n desc?: boolean;\n};\n\nexport type CraftDataTableAction<T> = {\n key: string;\n label?: React.ReactNode;\n icon?: string | React.ReactNode;\n variant?:\n | \"solid\"\n | \"outline\"\n | \"ghost\"\n | \"gradient\"\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"danger\"\n | \"success\"\n | \"warning\"\n | \"info\"\n | \"subtle\"\n | \"dark\"\n | \"light\"\n | \"primaryOutline\"\n | \"dangerOutline\"\n | \"successOutline\"\n | \"link\";\n permission?: boolean | ((item: T) => boolean);\n visible?: boolean | ((item: T) => boolean);\n disabled?: boolean | ((item: T) => boolean);\n tooltip?: React.ReactNode | ((item: T) => React.ReactNode);\n onClick?: (item: T) => void;\n className?: string | ((item: T) => string);\n};\n\nexport type CraftDataTableProps<T> = {\n data: T[];\n columns: CraftDataTableColumn<T>[];\n title?: React.ReactNode;\n description?: React.ReactNode;\n tone?: ThemeName;\n className?: string;\n toolbar?: React.ReactNode;\n emptyState?: React.ReactNode;\n actions?: CraftDataTableAction<T>[];\n showActionsColumn?: boolean;\n selectable?: boolean;\n enableRowSelection?: boolean;\n selectedRowIds?: Record<string, boolean>;\n onRowSelectionChange?: (selection: Record<string, boolean>) => void;\n getRowId?: (row: T, index: number) => string;\n rowKey?: keyof T | string;\n enableSorting?: boolean;\n enableFiltering?: boolean;\n enableColumnVisibility?: boolean;\n enablePagination?: boolean;\n showGlobalFilter?: boolean;\n manualSorting?: boolean;\n manualFiltering?: boolean;\n manualPagination?: boolean;\n sortBy?: CraftDataTableSort | null;\n onSortChange?: (sort: CraftDataTableSort | null) => void;\n filters?: Record<string, string>;\n onFiltersChange?: (filters: Record<string, string>) => void;\n globalFilter?: string;\n onGlobalFilterChange?: (value: string) => void;\n columnVisibility?: Record<string, boolean>;\n onColumnVisibilityChange?: (visibility: Record<string, boolean>) => void;\n pageIndex?: number;\n pageSize?: number;\n pageCount?: number;\n onPageChange?: (pageIndex: number) => void;\n onPageSizeChange?: (size: number) => void;\n striped?: boolean;\n hoverable?: boolean;\n clickableRows?: boolean;\n emptyText?: string;\n emptySubtitle?: string;\n variant?: \"default\" | \"bordered\" | \"minimal\";\n density?: \"compact\" | \"normal\" | \"comfortable\";\n headerVariant?: \"default\" | \"minimal\";\n headerPadding?: \"compact\" | \"normal\" | \"comfortable\";\n paginationVariant?: \"default\" | \"minimal\";\n paginationPadding?: \"compact\" | \"normal\" | \"comfortable\";\n loading?: boolean;\n dataLoading?: boolean;\n sortLoading?: boolean;\n paginationLoading?: boolean;\n bulkLoading?: boolean;\n rowLoading?: Record<string, boolean>;\n loadingType?: \"spin\" | \"pulse\" | \"bounce\" | \"ripple\" | \"bars\" | \"dots\" | \"ring\";\n loadingSize?: \"small\" | \"medium\" | \"large\" | \"xl\";\n loadingColor?: string;\n loadingText?: string;\n loadingTextPosition?: \"top\" | \"bottom\";\n loadingBackground?: string;\n showSkeleton?: boolean;\n skeletonRows?: number;\n truncateWords?: number;\n enableTextModal?: boolean;\n onRowClick?: (payload: { item: T; index: number }) => void;\n};\n\nfunction getColumnValue<T>(column: CraftDataTableColumn<T>, row: T) {\n if (typeof column.accessor === \"function\") return column.accessor(row);\n const record = row as Record<string, unknown>;\n if (typeof column.accessor === \"string\") return record[column.accessor];\n return record[column.id];\n}\n\nfunction normalizeValue(value: unknown) {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") return value.toLowerCase();\n if (value instanceof Date) return value.getTime();\n return String(value).toLowerCase();\n}\n\nfunction truncateText(text: string, maxWords: number) {\n const words = text.split(\" \");\n if (words.length <= maxWords) return text;\n return `${words.slice(0, maxWords).join(\" \")}...`;\n}\n\nfunction resolveActionVariant(\n variant: CraftDataTableAction<unknown>[\"variant\"]\n): \"solid\" | \"outline\" | \"ghost\" | \"gradient\" {\n switch (variant) {\n case \"solid\":\n case \"default\":\n case \"primary\":\n return \"solid\";\n case \"gradient\":\n return \"gradient\";\n case \"outline\":\n case \"primaryOutline\":\n case \"dangerOutline\":\n case \"successOutline\":\n return \"outline\";\n case \"ghost\":\n case \"link\":\n case \"secondary\":\n case \"danger\":\n case \"success\":\n case \"warning\":\n case \"info\":\n case \"subtle\":\n case \"dark\":\n case \"light\":\n default:\n return \"ghost\";\n }\n}\n\nexport function CraftDataTable<T>({\n data,\n columns,\n title,\n description,\n tone,\n className,\n toolbar,\n emptyState,\n actions = [],\n showActionsColumn = true,\n selectable,\n enableRowSelection = true,\n selectedRowIds,\n onRowSelectionChange,\n getRowId,\n rowKey,\n enableSorting = true,\n enableFiltering = true,\n enableColumnVisibility = true,\n enablePagination = true,\n showGlobalFilter,\n manualSorting = false,\n manualFiltering = false,\n manualPagination = false,\n sortBy,\n onSortChange,\n filters,\n onFiltersChange,\n globalFilter,\n onGlobalFilterChange,\n columnVisibility,\n onColumnVisibilityChange,\n pageIndex,\n pageSize = 10,\n pageCount,\n onPageChange,\n onPageSizeChange,\n striped = false,\n hoverable = true,\n clickableRows = false,\n emptyText = \"No data available\",\n emptySubtitle = \"Try adjusting your search or filter criteria\",\n variant = \"default\",\n density = \"normal\",\n headerVariant = \"default\",\n headerPadding = \"normal\",\n paginationVariant = \"default\",\n paginationPadding = \"normal\",\n loading = false,\n dataLoading = false,\n sortLoading = false,\n paginationLoading = false,\n bulkLoading = false,\n rowLoading = {},\n loadingType = \"dots\",\n loadingSize = \"medium\",\n loadingColor = \"rgb(var(--nc-accent-1))\",\n loadingText = \"Loading...\",\n loadingTextPosition = \"bottom\",\n loadingBackground = \"rgb(var(--nc-accent-soft)/0.1)\",\n showSkeleton = true,\n skeletonRows = 5,\n truncateWords = 10,\n enableTextModal = true,\n onRowClick,\n}: CraftDataTableProps<T>) {\n const [internalSort, setInternalSort] = React.useState<CraftDataTableSort | null>(null);\n const [internalFilters, setInternalFilters] = React.useState<Record<string, string>>({});\n const [internalGlobalFilter, setInternalGlobalFilter] = React.useState(\"\");\n const [internalVisibility, setInternalVisibility] = React.useState<Record<string, boolean>>(() =>\n columns.reduce((acc, column) => {\n acc[column.id] = !column.hidden;\n return acc;\n }, {} as Record<string, boolean>)\n );\n const [internalSelection, setInternalSelection] = React.useState<Record<string, boolean>>({});\n const [internalPageIndex, setInternalPageIndex] = React.useState(0);\n const [showColumns, setShowColumns] = React.useState(false);\n const [showModal, setShowModal] = React.useState(false);\n const [modalContent, setModalContent] = React.useState<string>(\"\");\n\n const resolvedSort = sortBy ?? internalSort;\n const resolvedFilters = filters ?? internalFilters;\n const resolvedGlobalFilter = globalFilter ?? internalGlobalFilter;\n const resolvedVisibility = columnVisibility ?? internalVisibility;\n const resolvedSelection = selectedRowIds ?? internalSelection;\n const resolvedPageIndex = pageIndex ?? internalPageIndex;\n const resolvedSelectable = selectable ?? enableRowSelection;\n\n const setSort = (next: CraftDataTableSort | null) => {\n if (sortBy === undefined) setInternalSort(next);\n onSortChange?.(next);\n };\n\n const setFilters = (next: Record<string, string>) => {\n if (filters === undefined) setInternalFilters(next);\n onFiltersChange?.(next);\n };\n\n const setVisibility = (next: Record<string, boolean>) => {\n if (columnVisibility === undefined) setInternalVisibility(next);\n onColumnVisibilityChange?.(next);\n };\n\n const setSelection = (next: Record<string, boolean>) => {\n if (selectedRowIds === undefined) setInternalSelection(next);\n onRowSelectionChange?.(next);\n };\n\n const setPageIndex = React.useCallback(\n (next: number) => {\n if (pageIndex === undefined) setInternalPageIndex(next);\n onPageChange?.(next);\n },\n [pageIndex, onPageChange]\n );\n\n const visibleColumns = columns.filter(\n (column) => resolvedVisibility[column.id] !== false\n );\n\n const filteredData = React.useMemo(() => {\n if (manualFiltering) return data;\n const globalValue = resolvedGlobalFilter.trim();\n return data.filter((row) => {\n if (globalValue) {\n const matchesGlobal = columns.some((column) => {\n const value = normalizeValue(getColumnValue(column, row));\n return String(value).includes(globalValue.toLowerCase());\n });\n if (!matchesGlobal) return false;\n }\n\n return Object.entries(resolvedFilters).every(([columnId, value]) => {\n if (!value) return true;\n const column = columns.find((col) => col.id === columnId);\n if (!column) return true;\n const cellValue = normalizeValue(getColumnValue(column, row));\n return String(cellValue).includes(value.toLowerCase());\n });\n });\n }, [columns, data, manualFiltering, resolvedFilters, resolvedGlobalFilter]);\n\n const sortedData = React.useMemo(() => {\n if (manualSorting || !resolvedSort) return filteredData;\n const column = columns.find((col) => col.id === resolvedSort.id);\n if (!column) return filteredData;\n const sorted = [...filteredData].sort((a, b) => {\n const valueA = normalizeValue(getColumnValue(column, a));\n const valueB = normalizeValue(getColumnValue(column, b));\n if (typeof valueA === \"number\" && typeof valueB === \"number\") {\n return valueA - valueB;\n }\n return String(valueA).localeCompare(String(valueB));\n });\n return resolvedSort.desc ? sorted.reverse() : sorted;\n }, [columns, filteredData, manualSorting, resolvedSort]);\n\n const resolvedPageCount = manualPagination\n ? Math.max(pageCount ?? 1, 1)\n : Math.max(Math.ceil(sortedData.length / pageSize), 1);\n\n React.useEffect(() => {\n if (resolvedPageIndex > resolvedPageCount - 1) {\n setPageIndex(Math.max(resolvedPageCount - 1, 0));\n }\n }, [resolvedPageCount, resolvedPageIndex, setPageIndex]);\n\n const pagedData = React.useMemo(() => {\n if (!enablePagination || manualPagination) return sortedData;\n const start = resolvedPageIndex * pageSize;\n return sortedData.slice(start, start + pageSize);\n }, [enablePagination, manualPagination, pageSize, resolvedPageIndex, sortedData]);\n\n const rowIdFor = React.useCallback(\n (row: T, index: number) => {\n if (getRowId) return getRowId(row, index);\n if (rowKey) return String((row as Record<string, unknown>)[rowKey as string] ?? index);\n return String(index);\n },\n [getRowId, rowKey]\n );\n\n const pageStartIndex =\n enablePagination && !manualPagination ? resolvedPageIndex * pageSize : 0;\n const pageRowIds = pagedData.map((row: T, index: number) =>\n rowIdFor(row, pageStartIndex + index)\n );\n const allSelected =\n pageRowIds.length > 0 && pageRowIds.every((id) => resolvedSelection[id]);\n const someSelected = pageRowIds.some((id) => resolvedSelection[id]);\n const headerCheckboxRef = React.useRef<HTMLInputElement | null>(null);\n\n React.useEffect(() => {\n if (headerCheckboxRef.current) {\n headerCheckboxRef.current.indeterminate = someSelected && !allSelected;\n }\n }, [someSelected, allSelected]);\n\n const toggleSort = (column: CraftDataTableColumn<T>) => {\n if (!enableSorting || column.sortable === false) return;\n const current = resolvedSort;\n if (!current || current.id !== column.id) {\n setSort({ id: column.id, desc: false });\n return;\n }\n if (!current.desc) {\n setSort({ id: column.id, desc: true });\n return;\n }\n setSort(null);\n };\n\n const resolvedShowGlobalFilter =\n showGlobalFilter ?? (enableFiltering && !toolbar);\n\n const setGlobalFilter = (next: string) => {\n if (globalFilter === undefined) setInternalGlobalFilter(next);\n onGlobalFilterChange?.(next);\n };\n\n const shouldShowActionsColumn = React.useMemo(() => {\n if (!showActionsColumn) return false;\n if (!actions || actions.length === 0) return false;\n return actions.some((action) => {\n if (action.permission === undefined) return true;\n if (typeof action.permission === \"boolean\") return action.permission;\n return true;\n });\n }, [actions, showActionsColumn]);\n\n const getVisibleActions = (item: T) =>\n actions.filter((action) => {\n if (action.permission !== undefined) {\n if (typeof action.permission === \"boolean\" && !action.permission) return false;\n if (typeof action.permission === \"function\" && !action.permission(item)) return false;\n }\n if (action.visible && typeof action.visible === \"function\") {\n return action.visible(item);\n }\n if (typeof action.visible === \"boolean\") return action.visible;\n return true;\n });\n\n const isActionDisabled = (action: CraftDataTableAction<T>, item: T) => {\n if (action.disabled && typeof action.disabled === \"function\") return action.disabled(item);\n if (typeof action.disabled === \"boolean\") return action.disabled;\n return false;\n };\n\n const handleActionClick = (action: CraftDataTableAction<T>, item: T) => {\n if (isActionDisabled(action, item)) return;\n action.onClick?.(item);\n };\n\n const totalColumns =\n visibleColumns.length +\n (resolvedSelectable ? 1 : 0) +\n (shouldShowActionsColumn ? 1 : 0);\n\n const densityPadding = {\n compact: \"px-4 py-2\",\n normal: \"px-6 py-4\",\n comfortable: \"px-8 py-6\",\n } as const;\n\n const headerPaddingClasses = {\n compact: \"px-4 py-2\",\n normal: \"px-6 py-3\",\n comfortable: \"px-8 py-4\",\n } as const;\n\n const rowClassNames = (isSelected: boolean, rowId: string, index: number) =>\n cn(\n \"transition-colors\",\n variant === \"bordered\" && \"border-b border-[rgb(var(--nc-border)/0.2)]\",\n variant === \"minimal\" && \"border-b border-[rgb(var(--nc-border)/0.15)]\",\n striped && index % 2 === 1 && \"bg-[rgb(var(--nc-surface)/0.04)]\",\n hoverable && !clickableRows && \"hover:bg-[rgb(var(--nc-surface)]\",\n clickableRows && \"cursor-pointer hover:bg-[rgb(var(--nc-surface)/0.1)]\",\n isSelected && \"bg-[rgb(var(--nc-accent-1)/0.12)]\",\n rowLoading[rowId] && \"opacity-60\"\n );\n\n const containerClasses = cn(\n \"relative overflow-hidden rounded-3xl border border-[rgb(var(--nc-border)/0.3)]\",\n \"shadow-[0_18px_50px_rgba(0,0,0,0.35)] backdrop-blur-2xl\",\n variant === \"minimal\"\n ? \"border-transparent bg-transparent shadow-none\"\n : cn(\n \"border-[rgb(var(--nc-accent-1)/0.35)]\",\n \"bg-linear-to-br from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)]\"\n )\n );\n\n const openModal = (content: string) => {\n if (!enableTextModal) return;\n setModalContent(content);\n setShowModal(true);\n };\n\n const closeModal = () => {\n setShowModal(false);\n setModalContent(\"\");\n };\n\n return (\n <div className={cn(\"space-y-4\", className)} data-nc-theme={tone}>\n {toolbar}\n\n <CraftDataTableHeader\n title={title}\n description={description}\n variant={headerVariant}\n padding={headerPadding}\n tone={tone}\n filters={\n resolvedShowGlobalFilter ? (\n <div className=\"flex items-center gap-2 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.12)] px-3 py-2 text-xs text-[rgb(var(--nc-fg))]\">\n <CraftIcon name=\"search\" className=\"h-4 w-4 text-[rgb(var(--nc-fg-muted))]\" />\n <input\n type=\"search\"\n value={resolvedGlobalFilter}\n onChange={(event) => setGlobalFilter(event.target.value)}\n placeholder=\"Search all columns...\"\n className=\"w-full max-w-xs bg-transparent text-xs text-[rgb(var(--nc-fg))] placeholder:text-[rgb(var(--nc-fg-muted))] focus:outline-none\"\n />\n </div>\n ) : null\n }\n actions={\n enableColumnVisibility ? (\n <div className=\"relative\">\n <CraftButton\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowColumns((prev) => !prev)}\n >\n Columns\n </CraftButton>\n {showColumns && (\n <div className=\"absolute right-0 top-12 z-20 w-56 rounded-2xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.2)] p-3 shadow-[0_12px_30px_rgba(0,0,0,0.35)] backdrop-blur-2xl\">\n <div className=\"grid gap-2\">\n {columns.map((column) => (\n <label\n key={column.id}\n className=\"flex items-center gap-2 text-xs text-[rgb(var(--nc-fg))]\"\n >\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 accent-[rgb(var(--nc-accent-1))]\"\n checked={resolvedVisibility[column.id] !== false}\n onChange={(event) =>\n setVisibility({\n ...resolvedVisibility,\n [column.id]: event.target.checked,\n })\n }\n />\n {column.header ?? column.label ?? column.id}\n </label>\n ))}\n </div>\n </div>\n )}\n </div>\n ) : null\n }\n />\n\n <div className={containerClasses}>\n <div className=\"relative\">\n <CraftLoader\n loading={loading || dataLoading}\n type={loadingType}\n size={loadingSize}\n color={loadingColor}\n overlay\n text={loadingText}\n textPosition={loadingTextPosition}\n backgroundColor={loadingBackground}\n />\n\n <div className={cn(\"overflow-x-auto\", (loading || dataLoading) && \"opacity-60\")}>\n <table className=\"min-w-full border-collapse text-left text-sm\">\n <thead className=\"bg-linear-to-r from-[rgb(var(--nc-accent-1)/0.08)] via-[rgb(var(--nc-accent-2)/0.05)] to-[rgb(var(--nc-accent-3)/0.08)] text-[rgb(var(--nc-fg-muted))]\">\n <tr>\n {resolvedSelectable && (\n <th className={cn(\"w-12\", headerPaddingClasses[density])}>\n <div className=\"flex items-center justify-center\">\n {bulkLoading ? (\n <CraftLoader loading type=\"spin\" size=\"small\" color={loadingColor} />\n ) : (\n <CraftCheckbox\n ref={headerCheckboxRef}\n checked={allSelected}\n onChange={(event) => {\n const next = { ...resolvedSelection };\n pageRowIds.forEach((id) => {\n next[id] = event.target.checked;\n });\n setSelection(next);\n }}\n />\n )}\n </div>\n </th>\n )}\n {visibleColumns.map((column) => {\n const headerLabel = column.header ?? column.label ?? column.id;\n return (\n <th\n key={column.id}\n className={cn(\n headerPaddingClasses[density],\n \"text-xs font-semibold uppercase tracking-[0.2em]\",\n column.headerClassName\n )}\n style={{ width: column.width }}\n >\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center gap-2\",\n enableSorting && column.sortable !== false\n ? \"cursor-pointer\"\n : \"cursor-default\"\n )}\n onClick={() => toggleSort(column)}\n >\n <span>{headerLabel}</span>\n {sortLoading && resolvedSort?.id === column.id ? (\n <CraftLoader loading type=\"spin\" size=\"small\" color={loadingColor} />\n ) : null}\n {resolvedSort?.id === column.id && !sortLoading ? (\n <span className=\"text-[rgb(var(--nc-accent-1))]\">\n {resolvedSort.desc ? \"↓\" : \"↑\"}\n </span>\n ) : null}\n </button>\n {enableFiltering && column.filterable !== false && (\n <input\n type=\"text\"\n value={resolvedFilters[column.id] ?? \"\"}\n onChange={(event) =>\n setFilters({\n ...resolvedFilters,\n [column.id]: event.target.value,\n })\n }\n placeholder=\"Filter\"\n className=\"mt-2 w-full rounded-xl border border-[rgb(var(--nc-border)/0.3)] bg-[rgb(var(--nc-surface)/0.18)] px-2 py-1 text-xs text-[rgb(var(--nc-fg))]\"\n />\n )}\n </th>\n );\n })}\n {shouldShowActionsColumn && (\n <th className={cn(headerPaddingClasses[density], \"text-xs uppercase\")}>Actions</th>\n )}\n </tr>\n </thead>\n <tbody className=\"text-[rgb(var(--nc-fg))]\">\n {showSkeleton && (loading || dataLoading) ? (\n Array.from({ length: skeletonRows }).map((_, rowIndex) => (\n <tr key={`skeleton-${rowIndex}`} className=\"animate-pulse\">\n {resolvedSelectable && (\n <td className={cn(headerPaddingClasses[density], \"w-12\")}> \n <div className=\"h-4 w-4 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </td>\n )}\n {visibleColumns.map((column) => (\n <td key={column.id} className={cn(densityPadding[density])}>\n <div className=\"h-4 w-3/4 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </td>\n ))}\n {shouldShowActionsColumn && (\n <td className={cn(densityPadding[density])}>\n <div className=\"flex items-center justify-center gap-2\">\n <div className=\"h-6 w-6 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n <div className=\"h-6 w-6 rounded bg-[rgb(var(--nc-border)/0.3)]\" />\n </div>\n </td>\n )}\n </tr>\n ))\n ) : pagedData.length === 0 ? (\n <tr>\n <td colSpan={totalColumns} className={cn(densityPadding[density], \"py-12\")}> \n {emptyState ?? (\n <div className=\"flex flex-col items-center justify-center text-center\">\n <CraftIcon\n name=\"search\"\n className=\"mb-4 h-12 w-12 text-[rgb(var(--nc-fg-muted))]\"\n />\n <p className=\"text-base font-semibold text-[rgb(var(--nc-fg))]\">\n {emptyText}\n </p>\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">\n {emptySubtitle}\n </p>\n </div>\n )}\n </td>\n </tr>\n ) : (\n pagedData.map((row: T, rowIndex: number) => {\n const rowId = rowIdFor(row, pageStartIndex + rowIndex);\n const isSelected = Boolean(resolvedSelection[rowId]);\n return (\n <tr\n key={rowId}\n className={rowClassNames(isSelected, rowId, rowIndex)}\n onClick={() => {\n if (!clickableRows) return;\n onRowClick?.({ item: row, index: rowIndex });\n }}\n >\n {resolvedSelectable && (\n <td className={cn(densityPadding[density], \"w-12\")}> \n <CraftCheckbox\n checked={isSelected}\n onChange={(event) =>\n setSelection({\n ...resolvedSelection,\n [rowId]: event.target.checked,\n })\n }\n />\n </td>\n )}\n {visibleColumns.map((column) => {\n const rawValue = getColumnValue(column, row);\n const formatted = column.formatter\n ? column.formatter(rawValue, row)\n : rawValue;\n const content = column.cell\n ? column.cell(row)\n : formatted ?? \"\";\n\n if (\n enableTextModal &&\n !column.cell &&\n typeof formatted === \"string\" &&\n (column.truncate ?? true) &&\n formatted.split(\" \").length > (column.maxWords ?? truncateWords)\n ) {\n const maxWords = column.maxWords ?? truncateWords;\n return (\n <td\n key={column.id}\n className={cn(\n densityPadding[density],\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n column.cellClassName\n )}\n >\n <button\n type=\"button\"\n className=\"text-[rgb(var(--nc-accent-1))] hover:text-[rgb(var(--nc-accent-2))]\"\n onClick={() => openModal(formatted)}\n >\n {truncateText(formatted, maxWords)}\n </button>\n </td>\n );\n }\n\n return (\n <td\n key={column.id}\n className={cn(\n densityPadding[density],\n column.align === \"center\" && \"text-center\",\n column.align === \"right\" && \"text-right\",\n column.cellClassName\n )}\n >\n {content as React.ReactNode}\n </td>\n );\n })}\n {shouldShowActionsColumn && (\n <td className={cn(densityPadding[density])}>\n <div className=\"flex items-center justify-center gap-2\">\n {getVisibleActions(row).map((action) => {\n const tooltip =\n typeof action.tooltip === \"function\"\n ? action.tooltip(row)\n : action.tooltip;\n const className =\n typeof action.className === \"function\"\n ? action.className(row)\n : action.className;\n const button = (\n <CraftButton\n type=\"button\"\n size=\"sm\"\n variant={resolveActionVariant(action.variant)}\n disabled={isActionDisabled(action, row)}\n className={cn(\"h-8 w-8 p-0\", className)}\n onClick={(event) => {\n event.stopPropagation();\n handleActionClick(action, row);\n }}\n >\n {action.icon ? (\n typeof action.icon === \"string\" ? (\n <CraftIcon name={action.icon} className=\"h-4 w-4\" />\n ) : (\n action.icon\n )\n ) : action.label ? (\n <span className=\"text-[11px]\">{action.label}</span>\n ) : null}\n </CraftButton>\n );\n\n if (tooltip) {\n return (\n <CraftTooltip key={action.key} content={tooltip}>\n {button}\n </CraftTooltip>\n );\n }\n\n return <React.Fragment key={action.key}>{button}</React.Fragment>;\n })}\n </div>\n </td>\n )}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n </div>\n\n <CraftDataTablePagination\n currentPage={resolvedPageIndex}\n totalPages={resolvedPageCount}\n total={filteredData.length}\n pageSize={pageSize}\n selectable={Boolean(resolvedSelectable)}\n selectedCount={Object.values(resolvedSelection).filter(Boolean).length}\n showPagination={enablePagination}\n loading={paginationLoading}\n disabled={loading || dataLoading}\n onPageChange={setPageIndex}\n onPageSizeChange={onPageSizeChange}\n variant={paginationVariant}\n padding={paginationPadding}\n tone={tone}\n />\n </div>\n\n <CraftModal open={showModal} onOpenChange={setShowModal} title=\"Full Text\" tone={tone}>\n <div className=\"space-y-3\">\n <p className=\"text-sm text-[rgb(var(--nc-fg-muted))]\">Full content</p>\n <div className=\"text-sm text-[rgb(var(--nc-fg))] whitespace-pre-wrap wrap-break-words\">\n {modalContent}\n </div>\n <div className=\"flex justify-end\">\n <CraftButton type=\"button\" variant=\"ghost\" onClick={closeModal}>\n Close\n </CraftButton>\n </div>\n </div>\n </CraftModal>\n </div>\n );\n}\n"],"mappings":"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","names":["className"]}
|