pixelize-design-library 2.2.192 → 3.0.1-beta.1
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/.claude/settings.local.json +9 -0
- package/MIGRATION.md +562 -0
- package/coverage/clover.xml +638 -0
- package/coverage/coverage-final.json +20 -0
- package/coverage/lcov-report/Table/CompactSelect.tsx.html +379 -0
- package/coverage/lcov-report/Table/Components/ActiveFilters.tsx.html +514 -0
- package/coverage/lcov-report/Table/Components/HeaderActions.tsx.html +373 -0
- package/coverage/lcov-report/Table/Components/Pagination.tsx.html +574 -0
- package/coverage/lcov-report/Table/Components/TableActions.tsx.html +574 -0
- package/coverage/lcov-report/Table/Components/TableBody.tsx.html +1027 -0
- package/coverage/lcov-report/Table/Components/TableFilters.tsx.html +397 -0
- package/coverage/lcov-report/Table/Components/TableHeader.tsx.html +1060 -0
- package/coverage/lcov-report/Table/Components/TableLoading.tsx.html +361 -0
- package/coverage/lcov-report/Table/Components/TableSearch.tsx.html +337 -0
- package/coverage/lcov-report/Table/Components/index.html +266 -0
- package/coverage/lcov-report/Table/Components/useDebounce.ts.html +178 -0
- package/coverage/lcov-report/Table/Components/useTable.ts.html +778 -0
- package/coverage/lcov-report/Table/LeftFilterPane.tsx.html +1810 -0
- package/coverage/lcov-report/Table/SelectOperationControls.tsx.html +178 -0
- package/coverage/lcov-report/Table/Table.tsx.html +1567 -0
- package/coverage/lcov-report/Table/TableProps.tsx.html +658 -0
- package/coverage/lcov-report/Table/TableSettings/ManageColumns.tsx.html +619 -0
- package/coverage/lcov-report/Table/TableSettings/TableFilters.tsx.html +229 -0
- package/coverage/lcov-report/Table/TableSettings/TableSettings.tsx.html +532 -0
- package/coverage/lcov-report/Table/TableSettings/index.html +146 -0
- package/coverage/lcov-report/Table/TableToDo.tsx.html +973 -0
- package/coverage/lcov-report/Table/TextOperationControls.tsx.html +271 -0
- package/coverage/lcov-report/Table/filterTypes.ts.html +97 -0
- package/coverage/lcov-report/Table/index.html +176 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +146 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov.info +1836 -0
- package/dist/Assets/defaultLogo.tsx +31 -0
- package/dist/Components/Table/Components/ActiveFilters.js +3 -3
- package/dist/Theme/Dark/palette.d.ts +370 -0
- package/dist/Theme/Dark/palette.js +372 -0
- package/dist/components-v2/AlertDialog/AlertDialog.d.ts +23 -0
- package/dist/components-v2/AlertDialog/AlertDialog.js +98 -0
- package/dist/components-v2/Breadcrumbs/Breadcrumbs.d.ts +14 -0
- package/dist/components-v2/Breadcrumbs/Breadcrumbs.js +66 -0
- package/dist/components-v2/Charts/AreaChart.d.ts +23 -0
- package/dist/components-v2/Charts/AreaChart.js +63 -0
- package/dist/components-v2/Charts/BarChart.d.ts +25 -0
- package/dist/components-v2/Charts/BarChart.js +57 -0
- package/dist/components-v2/Charts/LineChart.d.ts +23 -0
- package/dist/components-v2/Charts/LineChart.js +55 -0
- package/dist/components-v2/Charts/PieChart.d.ts +15 -0
- package/dist/components-v2/Charts/PieChart.js +54 -0
- package/dist/components-v2/Charts/PolarChart.d.ts +14 -0
- package/dist/components-v2/Charts/PolarChart.js +54 -0
- package/dist/components-v2/Charts/chartOptions.d.ts +7 -0
- package/dist/components-v2/Charts/chartOptions.js +41 -0
- package/dist/components-v2/Charts/useChartTheme.d.ts +22 -0
- package/dist/components-v2/Charts/useChartTheme.js +106 -0
- package/dist/components-v2/ContactForm/ContactForm.d.ts +25 -0
- package/dist/components-v2/ContactForm/ContactForm.js +116 -0
- package/dist/components-v2/DatePicker/Calendar.d.ts +19 -0
- package/dist/components-v2/DatePicker/Calendar.js +212 -0
- package/dist/components-v2/DatePicker/DatePicker.d.ts +46 -0
- package/dist/components-v2/DatePicker/DatePicker.js +189 -0
- package/dist/components-v2/DatePicker/TimePicker.d.ts +12 -0
- package/dist/components-v2/DatePicker/TimePicker.js +105 -0
- package/dist/components-v2/DatePicker/utils.d.ts +31 -0
- package/dist/components-v2/DatePicker/utils.js +109 -0
- package/dist/components-v2/Drawer/Drawer.d.ts +27 -0
- package/dist/components-v2/Drawer/Drawer.js +132 -0
- package/dist/components-v2/FeedbackForm/FeedbackForm.d.ts +26 -0
- package/dist/components-v2/FeedbackForm/FeedbackForm.js +112 -0
- package/dist/components-v2/FileUploader/FileUploader.d.ts +28 -0
- package/dist/components-v2/FileUploader/FileUploader.js +127 -0
- package/dist/components-v2/Input/TextInput.d.ts +41 -0
- package/dist/components-v2/Input/TextInput.js +169 -0
- package/dist/components-v2/KanbanBoard/KanbanBoard.d.ts +39 -0
- package/dist/components-v2/KanbanBoard/KanbanBoard.js +101 -0
- package/dist/components-v2/Layout/AppLayout.d.ts +22 -0
- package/dist/components-v2/Layout/AppLayout.js +53 -0
- package/dist/components-v2/Loading/Loading.d.ts +19 -0
- package/dist/components-v2/Loading/Loading.js +55 -0
- package/dist/components-v2/Modal/Modal.d.ts +30 -0
- package/dist/components-v2/Modal/Modal.js +82 -0
- package/dist/components-v2/NavigationBar/NavigationBar.d.ts +47 -0
- package/dist/components-v2/NavigationBar/NavigationBar.js +148 -0
- package/dist/components-v2/Notification/Notification.d.ts +22 -0
- package/dist/components-v2/Notification/Notification.js +113 -0
- package/dist/components-v2/NumberInput/NumberInput.d.ts +37 -0
- package/dist/components-v2/NumberInput/NumberInput.js +210 -0
- package/dist/components-v2/PinInput/PinInput.d.ts +26 -0
- package/dist/components-v2/PinInput/PinInput.js +138 -0
- package/dist/components-v2/ProfilePhotoViewer/ProfilePhotoViewer.d.ts +18 -0
- package/dist/components-v2/ProfilePhotoViewer/ProfilePhotoViewer.js +91 -0
- package/dist/components-v2/Select/Select.d.ts +41 -0
- package/dist/components-v2/Select/Select.js +284 -0
- package/dist/components-v2/Sidebar/Sidebar.d.ts +41 -0
- package/dist/components-v2/Sidebar/Sidebar.js +182 -0
- package/dist/components-v2/Slider/Slider.d.ts +18 -0
- package/dist/components-v2/Slider/Slider.js +101 -0
- package/dist/components-v2/Table/Table.d.ts +7 -0
- package/dist/components-v2/Table/Table.js +172 -0
- package/dist/components-v2/Table/TableProps.d.ts +139 -0
- package/dist/components-v2/Table/TableProps.js +9 -0
- package/dist/components-v2/Table/components/ActiveFilters.d.ts +10 -0
- package/dist/components-v2/Table/components/ActiveFilters.js +70 -0
- package/dist/components-v2/Table/components/BulkActionBar.d.ts +11 -0
- package/dist/components-v2/Table/components/BulkActionBar.js +92 -0
- package/dist/components-v2/Table/components/ColumnResizeHandle.d.ts +7 -0
- package/dist/components-v2/Table/components/ColumnResizeHandle.js +41 -0
- package/dist/components-v2/Table/components/Pagination.d.ts +11 -0
- package/dist/components-v2/Table/components/Pagination.js +92 -0
- package/dist/components-v2/Table/components/TableBody.d.ts +23 -0
- package/dist/components-v2/Table/components/TableBody.js +69 -0
- package/dist/components-v2/Table/components/TableCell.d.ts +14 -0
- package/dist/components-v2/Table/components/TableCell.js +63 -0
- package/dist/components-v2/Table/components/TableEmptyState.d.ts +12 -0
- package/dist/components-v2/Table/components/TableEmptyState.js +55 -0
- package/dist/components-v2/Table/components/TableErrorState.d.ts +6 -0
- package/dist/components-v2/Table/components/TableErrorState.js +52 -0
- package/dist/components-v2/Table/components/TableHeader.d.ts +21 -0
- package/dist/components-v2/Table/components/TableHeader.js +94 -0
- package/dist/components-v2/Table/components/TableRow.d.ts +20 -0
- package/dist/components-v2/Table/components/TableRow.js +64 -0
- package/dist/components-v2/Table/components/TableSearch.d.ts +8 -0
- package/dist/components-v2/Table/components/TableSearch.js +47 -0
- package/dist/components-v2/Table/filters/FilterChips.d.ts +6 -0
- package/dist/components-v2/Table/filters/FilterChips.js +9 -0
- package/dist/components-v2/Table/filters/LeftFilterPane.d.ts +17 -0
- package/dist/components-v2/Table/filters/LeftFilterPane.js +105 -0
- package/dist/components-v2/Table/filters/TableFilters.d.ts +12 -0
- package/dist/components-v2/Table/filters/TableFilters.js +127 -0
- package/dist/components-v2/Table/hooks/useColumnResize.d.ts +15 -0
- package/dist/components-v2/Table/hooks/useColumnResize.js +104 -0
- package/dist/components-v2/Table/hooks/useTable.d.ts +58 -0
- package/dist/components-v2/Table/hooks/useTable.js +254 -0
- package/dist/components-v2/Table/hooks/useTableKeyboard.d.ts +25 -0
- package/dist/components-v2/Table/hooks/useTableKeyboard.js +112 -0
- package/dist/components-v2/Table/hooks/useVirtualScroll.d.ts +29 -0
- package/dist/components-v2/Table/hooks/useVirtualScroll.js +83 -0
- package/dist/components-v2/Table/settings/ManageColumns.d.ts +12 -0
- package/dist/components-v2/Table/settings/ManageColumns.js +59 -0
- package/dist/components-v2/Table/settings/TableSettings.d.ts +12 -0
- package/dist/components-v2/Table/settings/TableSettings.js +57 -0
- package/dist/components-v2/Table/utils/filterUtils.d.ts +7 -0
- package/dist/components-v2/Table/utils/filterUtils.js +149 -0
- package/dist/components-v2/Table/utils/sortUtils.d.ts +6 -0
- package/dist/components-v2/Table/utils/sortUtils.js +65 -0
- package/dist/components-v2/Tag/Tag.d.ts +15 -0
- package/dist/components-v2/Tag/Tag.js +87 -0
- package/dist/components-v2/Timeline/Timeline.d.ts +18 -0
- package/dist/components-v2/Timeline/Timeline.js +76 -0
- package/dist/components-v2/Toaster/Toaster.d.ts +61 -0
- package/dist/components-v2/Toaster/Toaster.js +63 -0
- package/dist/components-v2/Toggle/Toggle.d.ts +28 -0
- package/dist/components-v2/Toggle/Toggle.js +90 -0
- package/dist/components-v2/ui/accordion.d.ts +12 -0
- package/dist/components-v2/ui/accordion.js +104 -0
- package/dist/components-v2/ui/alert.d.ts +18 -0
- package/dist/components-v2/ui/alert.js +99 -0
- package/dist/components-v2/ui/avatar.d.ts +12 -0
- package/dist/components-v2/ui/avatar.js +80 -0
- package/dist/components-v2/ui/badge.d.ts +10 -0
- package/dist/components-v2/ui/badge.js +76 -0
- package/dist/components-v2/ui/button.d.ts +18 -0
- package/dist/components-v2/ui/button.js +97 -0
- package/dist/components-v2/ui/checkbox.d.ts +15 -0
- package/dist/components-v2/ui/checkbox.js +86 -0
- package/dist/components-v2/ui/dialog.d.ts +30 -0
- package/dist/components-v2/ui/dialog.js +115 -0
- package/dist/components-v2/ui/dropdown-menu.d.ts +26 -0
- package/dist/components-v2/ui/dropdown-menu.js +121 -0
- package/dist/components-v2/ui/field.d.ts +32 -0
- package/dist/components-v2/ui/field.js +62 -0
- package/dist/components-v2/ui/form-field.d.ts +25 -0
- package/dist/components-v2/ui/form-field.js +96 -0
- package/dist/components-v2/ui/input.d.ts +9 -0
- package/dist/components-v2/ui/input.js +73 -0
- package/dist/components-v2/ui/label.d.ts +10 -0
- package/dist/components-v2/ui/label.js +70 -0
- package/dist/components-v2/ui/popover.d.ts +9 -0
- package/dist/components-v2/ui/popover.js +60 -0
- package/dist/components-v2/ui/progress.d.ts +12 -0
- package/dist/components-v2/ui/progress.js +75 -0
- package/dist/components-v2/ui/radio-group.d.ts +17 -0
- package/dist/components-v2/ui/radio-group.js +91 -0
- package/dist/components-v2/ui/select.d.ts +24 -0
- package/dist/components-v2/ui/select.js +122 -0
- package/dist/components-v2/ui/separator.d.ts +5 -0
- package/dist/components-v2/ui/separator.js +55 -0
- package/dist/components-v2/ui/skeleton.d.ts +9 -0
- package/dist/components-v2/ui/skeleton.js +68 -0
- package/dist/components-v2/ui/spinner.d.ts +16 -0
- package/dist/components-v2/ui/spinner.js +64 -0
- package/dist/components-v2/ui/switch.d.ts +10 -0
- package/dist/components-v2/ui/switch.js +81 -0
- package/dist/components-v2/ui/tabs.d.ts +13 -0
- package/dist/components-v2/ui/tabs.js +95 -0
- package/dist/components-v2/ui/textarea.d.ts +10 -0
- package/dist/components-v2/ui/textarea.js +96 -0
- package/dist/components-v2/ui/tooltip.d.ts +17 -0
- package/dist/components-v2/ui/tooltip.js +75 -0
- package/dist/index.d.ts +128 -64
- package/dist/index.js +246 -173
- package/dist/lib/utils.d.ts +2 -0
- package/dist/lib/utils.js +8 -0
- package/dist/theme-v2/ThemeProvider.d.ts +19 -0
- package/dist/theme-v2/ThemeProvider.js +149 -0
- package/dist/theme-v2/dark.css +47 -0
- package/dist/theme-v2/tokens.css +72 -0
- package/package.json +41 -20
- package/tailwind.config.ts +91 -0
- package/vite.config.ts +49 -10
- package/index.html +0 -13
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.Sidebar = Sidebar;
|
|
37
|
+
const React = __importStar(require("react"));
|
|
38
|
+
const framer_motion_1 = require("framer-motion");
|
|
39
|
+
const lucide_react_1 = require("lucide-react");
|
|
40
|
+
const utils_1 = require("../../lib/utils");
|
|
41
|
+
const badge_1 = require("../ui/badge");
|
|
42
|
+
const popover_1 = require("../ui/popover");
|
|
43
|
+
const skeleton_1 = require("../ui/skeleton");
|
|
44
|
+
const EXPANDED_WIDTH = 240;
|
|
45
|
+
const COLLAPSED_WIDTH = 64;
|
|
46
|
+
function Sidebar({ menus, activeItem, onItemClick, logo, companyName, collapsed: collapsedProp, onCollapsedChange, defaultCollapsed = false, mobileOpen = false, onMobileOpenChange, otherApps, footer, isLoading = false, className, }) {
|
|
47
|
+
const isCollapsedControlled = collapsedProp !== undefined;
|
|
48
|
+
const [internalCollapsed, setInternalCollapsed] = React.useState(defaultCollapsed);
|
|
49
|
+
const collapsed = isCollapsedControlled ? collapsedProp : internalCollapsed;
|
|
50
|
+
const toggleCollapsed = () => {
|
|
51
|
+
const next = !collapsed;
|
|
52
|
+
if (!isCollapsedControlled)
|
|
53
|
+
setInternalCollapsed(next);
|
|
54
|
+
onCollapsedChange === null || onCollapsedChange === void 0 ? void 0 : onCollapsedChange(next);
|
|
55
|
+
};
|
|
56
|
+
return (React.createElement(React.Fragment, null,
|
|
57
|
+
React.createElement(framer_motion_1.motion.aside, { "aria-label": "Main navigation", animate: { width: collapsed ? COLLAPSED_WIDTH : EXPANDED_WIDTH }, initial: false, transition: { duration: 0.2, ease: "easeInOut" }, className: (0, utils_1.cn)("sticky top-0 hidden h-screen shrink-0 flex-col border-r border-border bg-card text-card-foreground md:flex", className) },
|
|
58
|
+
React.createElement(SidebarBody, { menus: menus, activeItem: activeItem, onItemClick: onItemClick, logo: logo, companyName: companyName, collapsed: collapsed, onToggleCollapsed: toggleCollapsed, otherApps: otherApps, footer: footer, isLoading: isLoading })),
|
|
59
|
+
React.createElement(framer_motion_1.AnimatePresence, null, mobileOpen && (React.createElement(React.Fragment, null,
|
|
60
|
+
React.createElement(framer_motion_1.motion.div, { key: "sidebar-backdrop", initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, transition: { duration: 0.15 }, onClick: () => onMobileOpenChange === null || onMobileOpenChange === void 0 ? void 0 : onMobileOpenChange(false), className: "fixed inset-0 z-40 bg-foreground/40 backdrop-blur-sm md:hidden", "aria-hidden": "true" }),
|
|
61
|
+
React.createElement(framer_motion_1.motion.aside, { key: "sidebar-drawer", initial: { x: "-100%" }, animate: { x: 0 }, exit: { x: "-100%" }, transition: { duration: 0.2, ease: "easeInOut" }, className: (0, utils_1.cn)("fixed inset-y-0 left-0 z-50 flex w-60 flex-col border-r border-border bg-card text-card-foreground md:hidden", className), "aria-label": "Main navigation" },
|
|
62
|
+
React.createElement(SidebarBody, { menus: menus, activeItem: activeItem, onItemClick: (item) => {
|
|
63
|
+
onItemClick === null || onItemClick === void 0 ? void 0 : onItemClick(item);
|
|
64
|
+
onMobileOpenChange === null || onMobileOpenChange === void 0 ? void 0 : onMobileOpenChange(false);
|
|
65
|
+
}, logo: logo, companyName: companyName, collapsed: false, onToggleCollapsed: () => onMobileOpenChange === null || onMobileOpenChange === void 0 ? void 0 : onMobileOpenChange(false), otherApps: otherApps, footer: footer, isLoading: isLoading, isMobileDrawer: true })))))));
|
|
66
|
+
}
|
|
67
|
+
function SidebarBody({ menus, activeItem, onItemClick, logo, companyName, collapsed, onToggleCollapsed, otherApps, footer, isLoading, isMobileDrawer = false, }) {
|
|
68
|
+
var _a, _b;
|
|
69
|
+
return (React.createElement("nav", { className: "flex h-full min-h-0 flex-col", "aria-label": "Sidebar" },
|
|
70
|
+
React.createElement("div", { className: (0, utils_1.cn)("flex h-14 shrink-0 items-center gap-2 border-b border-border px-3", collapsed && "justify-center px-2") },
|
|
71
|
+
logo ? (React.createElement("img", { src: logo, alt: "", className: "h-7 w-7 shrink-0 rounded-md object-contain" })) : (React.createElement("div", { className: "grid h-7 w-7 shrink-0 place-items-center rounded-md bg-primary text-xs font-semibold text-primary-foreground" }, (_b = (_a = companyName === null || companyName === void 0 ? void 0 : companyName[0]) === null || _a === void 0 ? void 0 : _a.toUpperCase()) !== null && _b !== void 0 ? _b : "P")),
|
|
72
|
+
!collapsed && companyName && (React.createElement("span", { className: "truncate text-sm font-semibold text-foreground" }, companyName))),
|
|
73
|
+
React.createElement("ul", { className: "flex-1 overflow-y-auto px-2 py-3", role: "list" }, isLoading
|
|
74
|
+
? Array.from({ length: 5 }).map((_, index) => (React.createElement("li", { key: `skeleton-${index}`, className: "mb-1" },
|
|
75
|
+
React.createElement("div", { className: (0, utils_1.cn)("flex items-center gap-2 px-2 py-1.5", collapsed && "justify-center") },
|
|
76
|
+
React.createElement(skeleton_1.Skeleton, { variant: "rectangle", className: "h-5 w-5 rounded" }),
|
|
77
|
+
!collapsed && (React.createElement(skeleton_1.Skeleton, { variant: "text", className: "h-3 w-24" }))))))
|
|
78
|
+
: menus.map((item) => (React.createElement(SidebarMenuRow, { key: item.id, item: item, activeItem: activeItem, collapsed: collapsed, onItemClick: onItemClick })))),
|
|
79
|
+
otherApps && otherApps.length > 0 && (React.createElement("div", { className: "shrink-0 border-t border-border px-2 py-2" }, collapsed ? (React.createElement(popover_1.Popover, null,
|
|
80
|
+
React.createElement(popover_1.PopoverTrigger, { asChild: true },
|
|
81
|
+
React.createElement("button", { type: "button", "aria-label": "Other apps", className: "flex h-9 w-full items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring" },
|
|
82
|
+
React.createElement(lucide_react_1.Grid3x3, { "aria-hidden": "true", className: "h-4 w-4" }))),
|
|
83
|
+
React.createElement(popover_1.PopoverContent, { side: "right", align: "end", className: "w-56 p-1" },
|
|
84
|
+
React.createElement(OtherAppsList, { apps: otherApps })))) : (React.createElement(React.Fragment, null,
|
|
85
|
+
React.createElement("p", { className: "px-2 pb-1 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground" }, "Other apps"),
|
|
86
|
+
React.createElement(OtherAppsList, { apps: otherApps }))))),
|
|
87
|
+
footer && (React.createElement("div", { className: "shrink-0 border-t border-border px-2 py-2" }, footer)),
|
|
88
|
+
React.createElement("div", { className: "shrink-0 border-t border-border px-2 py-2" },
|
|
89
|
+
React.createElement("button", { type: "button", onClick: onToggleCollapsed, "aria-label": isMobileDrawer
|
|
90
|
+
? "Close sidebar"
|
|
91
|
+
: collapsed
|
|
92
|
+
? "Expand sidebar"
|
|
93
|
+
: "Collapse sidebar", "aria-expanded": !collapsed, className: "flex h-8 w-full items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring" },
|
|
94
|
+
React.createElement(lucide_react_1.ChevronLeft, { "aria-hidden": "true", className: (0, utils_1.cn)("h-4 w-4 transition-transform motion-safe:duration-200", collapsed && "rotate-180") })))));
|
|
95
|
+
}
|
|
96
|
+
function SidebarMenuRow({ item, activeItem, collapsed, onItemClick, nested = false, }) {
|
|
97
|
+
var _a;
|
|
98
|
+
const hasChildren = !!item.children && item.children.length > 0;
|
|
99
|
+
const isActive = activeItem === item.id;
|
|
100
|
+
const childActive = hasChildren &&
|
|
101
|
+
item.children.some((child) => child.id === activeItem);
|
|
102
|
+
const [expanded, setExpanded] = React.useState(childActive);
|
|
103
|
+
React.useEffect(() => {
|
|
104
|
+
if (childActive)
|
|
105
|
+
setExpanded(true);
|
|
106
|
+
}, [childActive]);
|
|
107
|
+
const [hoverOpen, setHoverOpen] = React.useState(false);
|
|
108
|
+
const closeTimer = React.useRef(null);
|
|
109
|
+
const scheduleClose = () => {
|
|
110
|
+
if (closeTimer.current)
|
|
111
|
+
window.clearTimeout(closeTimer.current);
|
|
112
|
+
closeTimer.current = window.setTimeout(() => setHoverOpen(false), 120);
|
|
113
|
+
};
|
|
114
|
+
const cancelClose = () => {
|
|
115
|
+
if (closeTimer.current)
|
|
116
|
+
window.clearTimeout(closeTimer.current);
|
|
117
|
+
setHoverOpen(true);
|
|
118
|
+
};
|
|
119
|
+
const handleClick = (event) => {
|
|
120
|
+
if (item.disabled)
|
|
121
|
+
return;
|
|
122
|
+
event.preventDefault();
|
|
123
|
+
if (hasChildren && !collapsed) {
|
|
124
|
+
setExpanded((prev) => !prev);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
onItemClick === null || onItemClick === void 0 ? void 0 : onItemClick(item);
|
|
128
|
+
};
|
|
129
|
+
const IconComponent = item.icon;
|
|
130
|
+
const trigger = (React.createElement("button", { type: "button", disabled: item.disabled, "aria-current": isActive ? "page" : undefined, "aria-disabled": item.disabled || undefined, "aria-haspopup": hasChildren ? "menu" : undefined, "aria-expanded": hasChildren ? expanded || hoverOpen : undefined, "aria-label": collapsed ? item.title : undefined, onClick: handleClick, onMouseEnter: collapsed && hasChildren ? cancelClose : undefined, onMouseLeave: collapsed && hasChildren ? scheduleClose : undefined, className: (0, utils_1.cn)("group relative flex w-full items-center gap-2.5 rounded-md px-2 py-1.5 text-sm transition-colors", "text-muted-foreground hover:bg-accent hover:text-foreground", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", "disabled:cursor-not-allowed disabled:opacity-50", isActive && "bg-primary/10 text-primary hover:bg-primary/15", collapsed && "justify-center px-2", nested && "py-1 text-xs") },
|
|
131
|
+
isActive && (React.createElement("span", { "aria-hidden": "true", className: "absolute left-0 top-1/2 h-5 w-0.5 -translate-y-1/2 rounded-r bg-primary" })),
|
|
132
|
+
IconComponent ? (React.createElement(IconComponent, { "aria-hidden": "true", className: (0, utils_1.cn)("h-4 w-4 shrink-0", isActive && "text-primary") })) : (React.createElement("span", { "aria-hidden": "true", className: "h-4 w-4 shrink-0 rounded-sm bg-muted" })),
|
|
133
|
+
!collapsed && (React.createElement(React.Fragment, null,
|
|
134
|
+
React.createElement("span", { className: "flex-1 truncate text-left" }, item.title),
|
|
135
|
+
item.badge && (React.createElement(badge_1.Badge, { variant: badgeVariant(item.badge.variant), size: "sm", className: "px-1.5 py-0 text-[10px]" }, (_a = item.badge.label) !== null && _a !== void 0 ? _a : item.badge.count)),
|
|
136
|
+
hasChildren && (React.createElement(lucide_react_1.ChevronDown, { "aria-hidden": "true", className: (0, utils_1.cn)("h-3.5 w-3.5 shrink-0 text-muted-foreground transition-transform motion-safe:duration-200", expanded && "rotate-180") })))),
|
|
137
|
+
collapsed && item.badge && (React.createElement("span", { "aria-hidden": "true", className: (0, utils_1.cn)("absolute right-1 top-1 h-1.5 w-1.5 rounded-full", badgeDot(item.badge.variant)) }))));
|
|
138
|
+
if (collapsed && hasChildren) {
|
|
139
|
+
return (React.createElement("li", null,
|
|
140
|
+
React.createElement(popover_1.Popover, { open: hoverOpen, onOpenChange: setHoverOpen },
|
|
141
|
+
React.createElement(popover_1.PopoverTrigger, { asChild: true }, trigger),
|
|
142
|
+
React.createElement(popover_1.PopoverContent, { side: "right", align: "start", sideOffset: 8, onMouseEnter: cancelClose, onMouseLeave: scheduleClose, className: "w-56 p-1" },
|
|
143
|
+
React.createElement("div", { className: "px-2 py-1 text-xs font-semibold text-muted-foreground" }, item.title),
|
|
144
|
+
React.createElement("ul", { role: "list" }, item.children.map((child) => (React.createElement(SidebarMenuRow, { key: child.id, item: child, activeItem: activeItem, collapsed: false, onItemClick: (value) => {
|
|
145
|
+
setHoverOpen(false);
|
|
146
|
+
onItemClick === null || onItemClick === void 0 ? void 0 : onItemClick(value);
|
|
147
|
+
}, nested: true }))))))));
|
|
148
|
+
}
|
|
149
|
+
return (React.createElement("li", null,
|
|
150
|
+
trigger,
|
|
151
|
+
hasChildren && !collapsed && (React.createElement(framer_motion_1.AnimatePresence, { initial: false }, expanded && (React.createElement(framer_motion_1.motion.ul, { key: "submenu", initial: { height: 0, opacity: 0 }, animate: { height: "auto", opacity: 1 }, exit: { height: 0, opacity: 0 }, transition: { duration: 0.18, ease: "easeInOut" }, className: "ml-5 mt-0.5 overflow-hidden border-l border-border pl-2", role: "list" }, item.children.map((child) => (React.createElement(SidebarMenuRow, { key: child.id, item: child, activeItem: activeItem, collapsed: false, onItemClick: onItemClick, nested: true })))))))));
|
|
152
|
+
}
|
|
153
|
+
function OtherAppsList({ apps }) {
|
|
154
|
+
return (React.createElement("ul", { role: "list" }, apps.map((app) => (React.createElement("li", { key: app.id },
|
|
155
|
+
React.createElement("a", { href: app.url, className: "flex items-center gap-2 rounded-md px-2 py-1.5 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring" },
|
|
156
|
+
app.iconUrl ? (React.createElement("img", { src: app.iconUrl, alt: "", className: "h-4 w-4 rounded-sm object-contain" })) : app.icon ? (React.createElement(app.icon, { "aria-hidden": "true", className: "h-4 w-4" })) : (React.createElement(lucide_react_1.Grid3x3, { "aria-hidden": "true", className: "h-4 w-4" })),
|
|
157
|
+
React.createElement("span", { className: "truncate" }, app.name)))))));
|
|
158
|
+
}
|
|
159
|
+
function badgeVariant(variant) {
|
|
160
|
+
switch (variant) {
|
|
161
|
+
case "destructive":
|
|
162
|
+
return "destructive";
|
|
163
|
+
case "success":
|
|
164
|
+
return "success";
|
|
165
|
+
case "warning":
|
|
166
|
+
return "warning";
|
|
167
|
+
default:
|
|
168
|
+
return "default";
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
function badgeDot(variant) {
|
|
172
|
+
switch (variant) {
|
|
173
|
+
case "destructive":
|
|
174
|
+
return "bg-destructive";
|
|
175
|
+
case "success":
|
|
176
|
+
return "bg-success";
|
|
177
|
+
case "warning":
|
|
178
|
+
return "bg-warning";
|
|
179
|
+
default:
|
|
180
|
+
return "bg-primary";
|
|
181
|
+
}
|
|
182
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import * as SliderPrimitive from "@radix-ui/react-slider";
|
|
3
|
+
export interface SliderMark {
|
|
4
|
+
value: number;
|
|
5
|
+
label?: React.ReactNode;
|
|
6
|
+
}
|
|
7
|
+
export interface SliderProps extends Omit<React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>, "value" | "defaultValue" | "onValueChange"> {
|
|
8
|
+
/** Single value or pair for range mode. */
|
|
9
|
+
value?: number | number[];
|
|
10
|
+
defaultValue?: number | number[];
|
|
11
|
+
onValueChange?: (value: number | number[]) => void;
|
|
12
|
+
/** Show tooltip with current value on the thumb. */
|
|
13
|
+
showTooltip?: boolean;
|
|
14
|
+
/** Marks rendered along the track. */
|
|
15
|
+
marks?: SliderMark[];
|
|
16
|
+
formatValue?: (value: number) => string;
|
|
17
|
+
}
|
|
18
|
+
export declare const Slider: React.ForwardRefExoticComponent<SliderProps & React.RefAttributes<HTMLSpanElement>>;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
36
|
+
var t = {};
|
|
37
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
38
|
+
t[p] = s[p];
|
|
39
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
40
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
41
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
42
|
+
t[p[i]] = s[p[i]];
|
|
43
|
+
}
|
|
44
|
+
return t;
|
|
45
|
+
};
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.Slider = void 0;
|
|
48
|
+
const React = __importStar(require("react"));
|
|
49
|
+
const SliderPrimitive = __importStar(require("@radix-ui/react-slider"));
|
|
50
|
+
const utils_1 = require("../../lib/utils");
|
|
51
|
+
const tooltip_1 = require("../ui/tooltip");
|
|
52
|
+
exports.Slider = React.forwardRef((_a, ref) => {
|
|
53
|
+
var { className, value, defaultValue, onValueChange, showTooltip = false, marks, formatValue = String, min = 0, max = 100, step = 1 } = _a, rest = __rest(_a, ["className", "value", "defaultValue", "onValueChange", "showTooltip", "marks", "formatValue", "min", "max", "step"]);
|
|
54
|
+
const isRange = Array.isArray(value)
|
|
55
|
+
? value.length > 1
|
|
56
|
+
: Array.isArray(defaultValue)
|
|
57
|
+
? defaultValue.length > 1
|
|
58
|
+
: false;
|
|
59
|
+
const internalValue = React.useMemo(() => {
|
|
60
|
+
var _a;
|
|
61
|
+
const source = (_a = value !== null && value !== void 0 ? value : defaultValue) !== null && _a !== void 0 ? _a : (isRange ? [min, max] : [min]);
|
|
62
|
+
return Array.isArray(source) ? source : [source];
|
|
63
|
+
}, [value, defaultValue, isRange, min, max]);
|
|
64
|
+
const [trackedValue, setTrackedValue] = React.useState(internalValue);
|
|
65
|
+
const displayValue = value !== undefined
|
|
66
|
+
? Array.isArray(value)
|
|
67
|
+
? value
|
|
68
|
+
: [value]
|
|
69
|
+
: trackedValue;
|
|
70
|
+
return (React.createElement("div", { className: (0, utils_1.cn)("w-full select-none", className) },
|
|
71
|
+
React.createElement(SliderPrimitive.Root, Object.assign({ ref: ref, value: displayValue, defaultValue: defaultValue !== undefined
|
|
72
|
+
? Array.isArray(defaultValue)
|
|
73
|
+
? defaultValue
|
|
74
|
+
: [defaultValue]
|
|
75
|
+
: undefined, onValueChange: (next) => {
|
|
76
|
+
setTrackedValue(next);
|
|
77
|
+
onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(isRange ? next : next[0]);
|
|
78
|
+
}, min: min, max: max, step: step, className: "relative flex h-5 w-full touch-none items-center" }, rest),
|
|
79
|
+
React.createElement(SliderPrimitive.Track, { className: "relative h-1 w-full grow overflow-hidden rounded-full bg-muted" },
|
|
80
|
+
React.createElement(SliderPrimitive.Range, { className: "absolute h-full bg-primary" })),
|
|
81
|
+
displayValue.map((thumbValue, index) => {
|
|
82
|
+
const thumb = (React.createElement(SliderPrimitive.Thumb, { key: index, "aria-label": isRange
|
|
83
|
+
? index === 0
|
|
84
|
+
? "Minimum value"
|
|
85
|
+
: "Maximum value"
|
|
86
|
+
: "Value", className: (0, utils_1.cn)("block h-4 w-4 rounded-full border-2 border-primary bg-background shadow-sm transition-colors", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background", "disabled:pointer-events-none disabled:opacity-50") }));
|
|
87
|
+
if (!showTooltip)
|
|
88
|
+
return thumb;
|
|
89
|
+
return (React.createElement(tooltip_1.Tooltip, { key: index, open: true },
|
|
90
|
+
React.createElement(tooltip_1.TooltipTrigger, { asChild: true }, thumb),
|
|
91
|
+
React.createElement(tooltip_1.TooltipContent, { side: "top", sideOffset: 6 }, formatValue(thumbValue))));
|
|
92
|
+
})),
|
|
93
|
+
marks && marks.length > 0 && (React.createElement("div", { "aria-hidden": "true", className: "relative mt-1.5 h-4 text-[10px] text-muted-foreground" }, marks.map((mark) => {
|
|
94
|
+
var _a;
|
|
95
|
+
const ratio = (mark.value - min) / (max - min);
|
|
96
|
+
return (React.createElement("span", { key: mark.value, style: {
|
|
97
|
+
left: `${Math.min(Math.max(ratio, 0), 1) * 100}%`,
|
|
98
|
+
}, className: "absolute -translate-x-1/2" }, (_a = mark.label) !== null && _a !== void 0 ? _a : mark.value));
|
|
99
|
+
})))));
|
|
100
|
+
});
|
|
101
|
+
exports.Slider.displayName = "Slider";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { type ColumnDef, type TableProps } from "./TableProps";
|
|
3
|
+
export declare function Table<T>(props: TableProps<T>): React.ReactElement;
|
|
4
|
+
export declare namespace Table {
|
|
5
|
+
var displayName: string;
|
|
6
|
+
}
|
|
7
|
+
export type { ColumnDef, TableProps };
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.Table = Table;
|
|
37
|
+
const React = __importStar(require("react"));
|
|
38
|
+
const lucide_react_1 = require("lucide-react");
|
|
39
|
+
const utils_1 = require("../../lib/utils");
|
|
40
|
+
const button_1 = require("../ui/button");
|
|
41
|
+
const dropdown_menu_1 = require("../ui/dropdown-menu");
|
|
42
|
+
const ActiveFilters_1 = require("./components/ActiveFilters");
|
|
43
|
+
const BulkActionBar_1 = require("./components/BulkActionBar");
|
|
44
|
+
const Pagination_1 = require("./components/Pagination");
|
|
45
|
+
const TableBody_1 = require("./components/TableBody");
|
|
46
|
+
const TableEmptyState_1 = require("./components/TableEmptyState");
|
|
47
|
+
const TableErrorState_1 = require("./components/TableErrorState");
|
|
48
|
+
const TableHeader_1 = require("./components/TableHeader");
|
|
49
|
+
const TableSearch_1 = require("./components/TableSearch");
|
|
50
|
+
const LeftFilterPane_1 = require("./filters/LeftFilterPane");
|
|
51
|
+
const TableFilters_1 = require("./filters/TableFilters");
|
|
52
|
+
const useColumnResize_1 = require("./hooks/useColumnResize");
|
|
53
|
+
const useTable_1 = require("./hooks/useTable");
|
|
54
|
+
const useTableKeyboard_1 = require("./hooks/useTableKeyboard");
|
|
55
|
+
const useVirtualScroll_1 = require("./hooks/useVirtualScroll");
|
|
56
|
+
const ManageColumns_1 = require("./settings/ManageColumns");
|
|
57
|
+
const TableSettings_1 = require("./settings/TableSettings");
|
|
58
|
+
const TableProps_1 = require("./TableProps");
|
|
59
|
+
const sortUtils_1 = require("./utils/sortUtils");
|
|
60
|
+
const DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50, 100];
|
|
61
|
+
function Table(props) {
|
|
62
|
+
const { data, columns, rowKey, selectable = false, selectedRows, onSelectionChange, selectionMode = "multi", onRowClick, rowClassName, sortable = true, defaultSort, onSortChange, filterable = true, defaultFilters, onFilterChange, searchable = true, searchPlaceholder, onSearchChange, isServerSearch = false, pagination = true, paginationMode = "client", defaultPageSize = 50, pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS, totalCount, onPageChange, isLoading = false, loadingRowCount = 5, error = null, onRetry, emptyState, emptyTitle, emptyDescription, emptyAction, density: densityProp = "default", maxHeight, virtualScroll, rowHeight, virtualScrollThreshold = 500, defaultHiddenColumns = [], showColumnToggle = true, columnResizable = true, stickyHeader = true, noBorders = false, bulkActions = [], filterSidebar, filterMode = "inline", preferences, headerActions, exportOptions, className, style, } = props;
|
|
63
|
+
const tableState = (0, useTable_1.useTable)({
|
|
64
|
+
data,
|
|
65
|
+
columns,
|
|
66
|
+
rowKey,
|
|
67
|
+
selectable,
|
|
68
|
+
selectionMode,
|
|
69
|
+
selectedRows,
|
|
70
|
+
onSelectionChange,
|
|
71
|
+
sortable,
|
|
72
|
+
defaultSort,
|
|
73
|
+
onSortChange,
|
|
74
|
+
filterable,
|
|
75
|
+
defaultFilters,
|
|
76
|
+
onFilterChange,
|
|
77
|
+
searchable,
|
|
78
|
+
onSearchChange,
|
|
79
|
+
isServerSearch,
|
|
80
|
+
pagination,
|
|
81
|
+
paginationMode,
|
|
82
|
+
defaultPageSize,
|
|
83
|
+
totalCount,
|
|
84
|
+
onPageChange,
|
|
85
|
+
defaultHiddenColumns,
|
|
86
|
+
density: densityProp,
|
|
87
|
+
preferences,
|
|
88
|
+
});
|
|
89
|
+
const { pageData, processed, pageCount, visibleColumns, columnVisibility, setColumnHidden, columnWidths, setColumnWidth, density, setDensity, sort, setSort, filters, setFilters, searchQuery, setSearchQuery, selection, toggleRow, toggleAll, clearSelection, isAllSelected, isSomeSelected, pageIndex, pageSize, setPage, setPageSize, } = tableState;
|
|
90
|
+
const resize = (0, useColumnResize_1.useColumnResize)({
|
|
91
|
+
columns,
|
|
92
|
+
columnWidths,
|
|
93
|
+
setColumnWidth,
|
|
94
|
+
enabled: columnResizable,
|
|
95
|
+
});
|
|
96
|
+
const scrollRef = React.useRef(null);
|
|
97
|
+
const resolvedRowHeight = rowHeight !== null && rowHeight !== void 0 ? rowHeight : TableProps_1.ROW_HEIGHT[density];
|
|
98
|
+
const virtual = (0, useVirtualScroll_1.useVirtualScroll)({
|
|
99
|
+
rowCount: pageData.length,
|
|
100
|
+
rowHeight: resolvedRowHeight,
|
|
101
|
+
enabled: virtualScroll,
|
|
102
|
+
threshold: virtualScrollThreshold,
|
|
103
|
+
scrollContainerRef: scrollRef,
|
|
104
|
+
});
|
|
105
|
+
const keyboardEnabled = selectable || !!onRowClick;
|
|
106
|
+
const keyboard = (0, useTableKeyboard_1.useTableKeyboard)({
|
|
107
|
+
rowCount: pageData.length,
|
|
108
|
+
columnCount: visibleColumns.length,
|
|
109
|
+
hasSelectionColumn: selectable,
|
|
110
|
+
onActivateRow: (rowIndex) => {
|
|
111
|
+
const row = pageData[rowIndex];
|
|
112
|
+
if (row && onRowClick) {
|
|
113
|
+
onRowClick(row, {});
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
onToggleRow: (rowIndex) => {
|
|
117
|
+
const row = pageData[rowIndex];
|
|
118
|
+
if (row)
|
|
119
|
+
toggleRow((0, sortUtils_1.resolveRowKey)(row, rowKey));
|
|
120
|
+
},
|
|
121
|
+
onClearSelection: clearSelection,
|
|
122
|
+
});
|
|
123
|
+
const selectedKeys = React.useMemo(() => new Set(selection), [selection]);
|
|
124
|
+
const selectedRowData = React.useMemo(() => data.filter((row) => selectedKeys.has((0, sortUtils_1.resolveRowKey)(row, rowKey))), [data, selectedKeys, rowKey]);
|
|
125
|
+
const hasActiveFilters = filters.length > 0 || searchQuery.length > 0;
|
|
126
|
+
const showSidebar = (filterSidebar === null || filterSidebar === void 0 ? void 0 : filterSidebar.enabled) && filterMode === "sidebar";
|
|
127
|
+
const handleRemoveFilter = (filter) => {
|
|
128
|
+
setFilters((prev) => prev.filter((f) => f !== filter));
|
|
129
|
+
};
|
|
130
|
+
const clearAllFilters = () => {
|
|
131
|
+
setFilters([]);
|
|
132
|
+
if (searchQuery)
|
|
133
|
+
setSearchQuery("");
|
|
134
|
+
};
|
|
135
|
+
const totalRows = paginationMode === "server" ? totalCount !== null && totalCount !== void 0 ? totalCount : 0 : processed.length;
|
|
136
|
+
const hasError = error !== null && error !== undefined;
|
|
137
|
+
const isEmpty = !isLoading && !hasError && pageData.length === 0;
|
|
138
|
+
return (React.createElement("div", { className: (0, utils_1.cn)("flex flex-col overflow-hidden rounded-md border border-border bg-card text-card-foreground", className), style: Object.assign({ "--row-height": `${resolvedRowHeight}px` }, style) },
|
|
139
|
+
React.createElement("div", { className: "flex flex-wrap items-center justify-between gap-2 border-b border-border bg-card px-3 py-2" },
|
|
140
|
+
React.createElement("div", { className: "flex flex-1 items-center gap-2" }, searchable && (React.createElement(TableSearch_1.TableSearch, { value: searchQuery, onChange: setSearchQuery, placeholder: searchPlaceholder }))),
|
|
141
|
+
React.createElement("div", { className: "flex flex-wrap items-center gap-2" },
|
|
142
|
+
filterable && filterMode === "inline" && (React.createElement(TableFilters_1.TableFilters, { columns: columns, filters: filters, onApply: (next) => setFilters(next) })),
|
|
143
|
+
showColumnToggle && (React.createElement(ManageColumns_1.ManageColumns, { columns: columns, columnVisibility: columnVisibility, onChange: setColumnHidden })),
|
|
144
|
+
React.createElement(TableSettings_1.TableSettings, { density: density, onDensityChange: setDensity }),
|
|
145
|
+
exportOptions && exportOptions.length > 0 && (React.createElement(dropdown_menu_1.DropdownMenu, null,
|
|
146
|
+
React.createElement(dropdown_menu_1.DropdownMenuTrigger, { asChild: true },
|
|
147
|
+
React.createElement(button_1.Button, { size: "sm", variant: "outline", leftIcon: React.createElement(lucide_react_1.Download, null) }, "Export")),
|
|
148
|
+
React.createElement(dropdown_menu_1.DropdownMenuContent, { align: "end" }, exportOptions.map((option) => (React.createElement(dropdown_menu_1.DropdownMenuItem, { key: option.label, onClick: () => option.onExport(processed, selectedRowData) },
|
|
149
|
+
option.icon,
|
|
150
|
+
option.label)))))),
|
|
151
|
+
headerActions)),
|
|
152
|
+
React.createElement(ActiveFilters_1.ActiveFilters, { filters: filters, columns: columns, onRemove: handleRemoveFilter, onClearAll: () => setFilters([]) }),
|
|
153
|
+
React.createElement(BulkActionBar_1.BulkActionBar, { selectedCount: selection.length, selectedKeys: selection, selectedRows: selectedRowData, actions: bulkActions, onClear: clearSelection }),
|
|
154
|
+
React.createElement("div", { className: "flex flex-1 overflow-hidden" },
|
|
155
|
+
showSidebar && filterSidebar && filterSidebar.position !== "right" && (React.createElement(LeftFilterPane_1.LeftFilterPane, { filters: filterSidebar.filters, onApply: filterSidebar.onApply, isLoading: filterSidebar.isLoading })),
|
|
156
|
+
React.createElement("div", { ref: scrollRef, role: keyboardEnabled ? "grid" : undefined, "aria-busy": isLoading || undefined, "aria-rowcount": pageData.length || undefined, "aria-colcount": visibleColumns.length + (selectable ? 1 : 0) || undefined, tabIndex: keyboardEnabled ? 0 : undefined, onKeyDown: keyboardEnabled ? keyboard.handleKeyDown : undefined, style: {
|
|
157
|
+
maxHeight: typeof maxHeight === "number"
|
|
158
|
+
? `${maxHeight}px`
|
|
159
|
+
: maxHeight,
|
|
160
|
+
}, className: (0, utils_1.cn)("relative flex-1 overflow-auto", keyboardEnabled &&
|
|
161
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset") }, hasError ? (React.createElement(TableErrorState_1.TableErrorState, { error: error, onRetry: onRetry })) : isEmpty ? (emptyState !== null && emptyState !== void 0 ? emptyState : (React.createElement(TableEmptyState_1.TableEmptyState, { title: emptyTitle, description: emptyDescription, hasActiveFilters: hasActiveFilters, onClearFilters: hasActiveFilters ? clearAllFilters : undefined, action: emptyAction }))) : (React.createElement("table", { className: (0, utils_1.cn)("w-full border-collapse text-left", noBorders && "[&_td]:border-0"), style: { tableLayout: "fixed" } },
|
|
162
|
+
React.createElement(TableHeader_1.TableHeader, { columns: visibleColumns, columnWidths: columnWidths, sortable: sortable, sort: sort, onSortChange: setSort, selectable: selectable, selectionMode: selectionMode, isAllSelected: isAllSelected, isSomeSelected: isSomeSelected, onToggleAll: toggleAll, resizable: columnResizable, resizingColumnId: resize.resizingColumnId, onResizePointerDown: resize.handlePointerDown, sticky: stickyHeader, focusedColIndex: keyboard.active.row === -1
|
|
163
|
+
? keyboard.active.col
|
|
164
|
+
: -1, onCellClick: (colIndex) => keyboard.setActive({ row: -1, col: colIndex }) }),
|
|
165
|
+
React.createElement(TableBody_1.TableBody, { data: pageData, columns: visibleColumns, rowKey: rowKey, columnWidths: columnWidths, selectable: selectable, selectedKeys: selectedKeys, onToggleSelect: (key) => toggleRow(key), onRowClick: onRowClick, rowClassName: rowClassName, striped: true, noBorders: noBorders, focusedRowIndex: keyboard.active.row, focusedColIndex: keyboard.active.col, onCellClick: (rowIndex, colIndex) => keyboard.setActive({
|
|
166
|
+
row: rowIndex,
|
|
167
|
+
col: colIndex,
|
|
168
|
+
}), isLoading: isLoading, loadingRowCount: loadingRowCount, virtual: virtual })))),
|
|
169
|
+
showSidebar && filterSidebar && filterSidebar.position === "right" && (React.createElement(LeftFilterPane_1.LeftFilterPane, { filters: filterSidebar.filters, onApply: filterSidebar.onApply, isLoading: filterSidebar.isLoading, position: "right" }))),
|
|
170
|
+
pagination && !hasError && (React.createElement(Pagination_1.Pagination, { pageIndex: pageIndex, pageCount: pageCount, pageSize: pageSize, pageSizeOptions: pageSizeOptions, totalRows: totalRows, onPageChange: (page) => setPage(page), onPageSizeChange: (size) => setPageSize(size) }))));
|
|
171
|
+
}
|
|
172
|
+
Table.displayName = "Table";
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
export type SortDirection = "asc" | "desc" | null;
|
|
3
|
+
export type FilterOperator = "equals" | "not_equals" | "contains" | "not_contains" | "starts_with" | "ends_with" | "greater_than" | "less_than" | "between" | "is_empty" | "is_not_empty" | "in" | "not_in";
|
|
4
|
+
export type ColumnType = "text" | "number" | "date" | "boolean" | "select" | "custom";
|
|
5
|
+
export type Density = "compact" | "default" | "comfortable";
|
|
6
|
+
export interface ColumnDef<T = unknown> {
|
|
7
|
+
id: string;
|
|
8
|
+
header: string;
|
|
9
|
+
accessorKey?: keyof T;
|
|
10
|
+
accessorFn?: (row: T) => unknown;
|
|
11
|
+
cell?: (value: unknown, row: T) => React.ReactNode;
|
|
12
|
+
type?: ColumnType;
|
|
13
|
+
sortable?: boolean;
|
|
14
|
+
filterable?: boolean;
|
|
15
|
+
filterOptions?: {
|
|
16
|
+
label: string;
|
|
17
|
+
value: unknown;
|
|
18
|
+
}[];
|
|
19
|
+
width?: number;
|
|
20
|
+
minWidth?: number;
|
|
21
|
+
maxWidth?: number;
|
|
22
|
+
sticky?: "left" | "right";
|
|
23
|
+
hidden?: boolean;
|
|
24
|
+
enableHiding?: boolean;
|
|
25
|
+
enableResizing?: boolean;
|
|
26
|
+
align?: "left" | "center" | "right";
|
|
27
|
+
meta?: Record<string, unknown>;
|
|
28
|
+
}
|
|
29
|
+
export interface ActiveFilter {
|
|
30
|
+
columnId: string;
|
|
31
|
+
operator: FilterOperator;
|
|
32
|
+
/** A single value or [from, to] for `between` / array for `in`/`not_in`. */
|
|
33
|
+
value: unknown;
|
|
34
|
+
}
|
|
35
|
+
export interface SortState {
|
|
36
|
+
id: string;
|
|
37
|
+
direction: SortDirection;
|
|
38
|
+
}
|
|
39
|
+
export type RowKey<T> = keyof T | ((row: T) => string | number);
|
|
40
|
+
export interface FilterSidebarConfig {
|
|
41
|
+
id: string;
|
|
42
|
+
label: string;
|
|
43
|
+
type: "select" | "multi-select" | "date-range" | "number-range" | "text";
|
|
44
|
+
options?: {
|
|
45
|
+
label: string;
|
|
46
|
+
value: unknown;
|
|
47
|
+
}[];
|
|
48
|
+
}
|
|
49
|
+
export interface BulkAction<T = unknown> {
|
|
50
|
+
label: string;
|
|
51
|
+
icon?: React.ReactNode;
|
|
52
|
+
onClick: (selectedKeys: (string | number)[], selectedRows: T[]) => void;
|
|
53
|
+
variant?: "default" | "destructive";
|
|
54
|
+
/** When true, shows a confirmation dialog before invoking onClick. */
|
|
55
|
+
confirm?: boolean | {
|
|
56
|
+
title: string;
|
|
57
|
+
description?: string;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export interface ExportOption<T = unknown> {
|
|
61
|
+
label: string;
|
|
62
|
+
icon?: React.ReactNode;
|
|
63
|
+
onExport: (data: T[], selectedRows: T[]) => void;
|
|
64
|
+
}
|
|
65
|
+
export interface TablePreferences {
|
|
66
|
+
storageKey: string;
|
|
67
|
+
}
|
|
68
|
+
export interface PersistedTableState {
|
|
69
|
+
columnVisibility?: Record<string, boolean>;
|
|
70
|
+
columnOrder?: string[];
|
|
71
|
+
columnWidths?: Record<string, number>;
|
|
72
|
+
density?: Density;
|
|
73
|
+
pageSize?: number;
|
|
74
|
+
}
|
|
75
|
+
export interface TableProps<T = unknown> {
|
|
76
|
+
data: T[];
|
|
77
|
+
columns: ColumnDef<T>[];
|
|
78
|
+
rowKey: RowKey<T>;
|
|
79
|
+
selectable?: boolean;
|
|
80
|
+
selectedRows?: (string | number)[];
|
|
81
|
+
onSelectionChange?: (selectedKeys: (string | number)[]) => void;
|
|
82
|
+
selectionMode?: "single" | "multi";
|
|
83
|
+
onRowClick?: (row: T, event: React.MouseEvent) => void;
|
|
84
|
+
rowClassName?: (row: T) => string | undefined;
|
|
85
|
+
sortable?: boolean;
|
|
86
|
+
defaultSort?: SortState;
|
|
87
|
+
onSortChange?: (sort: SortState | null) => void;
|
|
88
|
+
filterable?: boolean;
|
|
89
|
+
defaultFilters?: ActiveFilter[];
|
|
90
|
+
onFilterChange?: (filters: ActiveFilter[]) => void;
|
|
91
|
+
searchable?: boolean;
|
|
92
|
+
searchPlaceholder?: string;
|
|
93
|
+
onSearchChange?: (query: string) => void;
|
|
94
|
+
isServerSearch?: boolean;
|
|
95
|
+
pagination?: boolean;
|
|
96
|
+
paginationMode?: "client" | "server";
|
|
97
|
+
defaultPageSize?: number;
|
|
98
|
+
pageSizeOptions?: number[];
|
|
99
|
+
totalCount?: number;
|
|
100
|
+
onPageChange?: (page: number, pageSize: number) => void;
|
|
101
|
+
isLoading?: boolean;
|
|
102
|
+
loadingRowCount?: number;
|
|
103
|
+
error?: Error | string | null;
|
|
104
|
+
onRetry?: () => void;
|
|
105
|
+
emptyState?: React.ReactNode;
|
|
106
|
+
emptyTitle?: string;
|
|
107
|
+
emptyDescription?: string;
|
|
108
|
+
emptyAction?: {
|
|
109
|
+
label: string;
|
|
110
|
+
onClick: () => void;
|
|
111
|
+
};
|
|
112
|
+
density?: Density;
|
|
113
|
+
maxHeight?: number | string;
|
|
114
|
+
virtualScroll?: boolean;
|
|
115
|
+
/** Defaults to 44 (default density). */
|
|
116
|
+
rowHeight?: number;
|
|
117
|
+
/** Threshold for auto-enabling virtual scroll. Default 500. */
|
|
118
|
+
virtualScrollThreshold?: number;
|
|
119
|
+
defaultHiddenColumns?: string[];
|
|
120
|
+
showColumnToggle?: boolean;
|
|
121
|
+
columnResizable?: boolean;
|
|
122
|
+
stickyHeader?: boolean;
|
|
123
|
+
noBorders?: boolean;
|
|
124
|
+
bulkActions?: BulkAction<T>[];
|
|
125
|
+
filterSidebar?: {
|
|
126
|
+
enabled: boolean;
|
|
127
|
+
position?: "left" | "right";
|
|
128
|
+
filters: FilterSidebarConfig[];
|
|
129
|
+
onApply: (filters: Record<string, unknown>) => void;
|
|
130
|
+
isLoading?: boolean;
|
|
131
|
+
};
|
|
132
|
+
filterMode?: "inline" | "sidebar" | "modal";
|
|
133
|
+
preferences?: TablePreferences;
|
|
134
|
+
headerActions?: React.ReactNode;
|
|
135
|
+
exportOptions?: ExportOption<T>[];
|
|
136
|
+
className?: string;
|
|
137
|
+
style?: React.CSSProperties;
|
|
138
|
+
}
|
|
139
|
+
export declare const ROW_HEIGHT: Record<Density, number>;
|