@wealthx/shadcn 1.1.0 → 1.2.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/.turbo/turbo-build.log +235 -154
- package/CHANGELOG.md +12 -0
- package/dist/{chunk-6OJF6XRN.mjs → chunk-24FUO7TD.mjs} +4 -8
- package/dist/{chunk-4AJ5HWHD.mjs → chunk-2I5S2AMY.mjs} +3 -3
- package/dist/{chunk-GPRJQ24C.mjs → chunk-34NWQURD.mjs} +2 -2
- package/dist/{chunk-MQ72DIBH.mjs → chunk-3GF7OVTP.mjs} +14 -5
- package/dist/chunk-3WMX6KWS.mjs +245 -0
- package/dist/{chunk-PMKODV6M.mjs → chunk-462HMNO4.mjs} +6 -10
- package/dist/chunk-4CX4SBRO.mjs +153 -0
- package/dist/chunk-4MN6UQHG.mjs +443 -0
- package/dist/chunk-4Y6R4WEC.mjs +250 -0
- package/dist/{chunk-BGP2N52Z.mjs → chunk-66MI7Q4B.mjs} +5 -5
- package/dist/{chunk-CGOKTPXU.mjs → chunk-6JQFUE5I.mjs} +20 -23
- package/dist/{chunk-Z3MK2KKZ.mjs → chunk-7DHU4VGG.mjs} +7 -3
- package/dist/chunk-7MMXNK3C.mjs +317 -0
- package/dist/{chunk-VZ2NR7L3.mjs → chunk-7PYJD5JI.mjs} +35 -27
- package/dist/{chunk-JU2RUWHF.mjs → chunk-7XJHLGUV.mjs} +1 -1
- package/dist/{chunk-BMFN37JH.mjs → chunk-7YAU5CY6.mjs} +1 -1
- package/dist/chunk-A56YQQHG.mjs +402 -0
- package/dist/{chunk-GLW2UO6O.mjs → chunk-BL3DXM2X.mjs} +84 -62
- package/dist/{chunk-SLWCCURD.mjs → chunk-CLIN5525.mjs} +8 -4
- package/dist/{chunk-3VQNJ235.mjs → chunk-CSDO6VBW.mjs} +7 -0
- package/dist/chunk-D4ILTPOG.mjs +293 -0
- package/dist/{chunk-HS7TFG7V.mjs → chunk-D6ID6M4V.mjs} +1 -1
- package/dist/chunk-DOH3EHX7.mjs +378 -0
- package/dist/{chunk-MJIEMGRD.mjs → chunk-EFRENWEJ.mjs} +9 -17
- package/dist/{chunk-YBXCIF5Q.mjs → chunk-ERGGHC2V.mjs} +36 -49
- package/dist/{chunk-OXQQNQZI.mjs → chunk-FEZKMUCF.mjs} +10 -1
- package/dist/{chunk-55CEW76V.mjs → chunk-FH6QVUVZ.mjs} +1 -1
- package/dist/chunk-FMAXJ2SI.mjs +71 -0
- package/dist/chunk-FZIXGLMV.mjs +173 -0
- package/dist/chunk-GGM2UYGG.mjs +273 -0
- package/dist/{chunk-DS2AMHN2.mjs → chunk-GYMYRIZP.mjs} +2 -2
- package/dist/{chunk-KQDD5MU3.mjs → chunk-H45TKD34.mjs} +5 -5
- package/dist/{chunk-BBJBJSXQ.mjs → chunk-J5UICVJS.mjs} +1 -1
- package/dist/{chunk-RL772EH7.mjs → chunk-JHJHG4GO.mjs} +4 -12
- package/dist/{chunk-RN67642N.mjs → chunk-JNQORUPP.mjs} +49 -42
- package/dist/{chunk-5JGQAAQV.mjs → chunk-K3JYD4IU.mjs} +86 -63
- package/dist/{chunk-FHNT55I5.mjs → chunk-KUDCQ4FI.mjs} +4 -4
- package/dist/{chunk-UEL4RD5P.mjs → chunk-LHYCMLVA.mjs} +82 -68
- package/dist/{chunk-NLLKTU4B.mjs → chunk-LLVQKSU3.mjs} +21 -17
- package/dist/{chunk-KKHTJNMM.mjs → chunk-MARPPFOJ.mjs} +8 -4
- package/dist/{chunk-6AFMNC42.mjs → chunk-N2PT566P.mjs} +15 -11
- package/dist/{chunk-YN5SYTOO.mjs → chunk-NQPOYKAQ.mjs} +9 -5
- package/dist/{chunk-ZZV5JVNW.mjs → chunk-NSLMILBT.mjs} +3 -7
- package/dist/chunk-OGOYQ7BG.mjs +150 -0
- package/dist/chunk-OPNQAVVH.mjs +162 -0
- package/dist/{chunk-3NQGYJEZ.mjs → chunk-P6AM5V7O.mjs} +10 -18
- package/dist/{chunk-CZ3BW5GL.mjs → chunk-P76HMUI6.mjs} +5 -11
- package/dist/chunk-PCPLO5HT.mjs +671 -0
- package/dist/chunk-PG6K5XEC.mjs +475 -0
- package/dist/{chunk-DDPA2XXS.mjs → chunk-PMB3A7V3.mjs} +2 -2
- package/dist/chunk-PR6V5XKM.mjs +209 -0
- package/dist/{chunk-46OFHMQA.mjs → chunk-Q76O3RIQ.mjs} +10 -6
- package/dist/chunk-RGU7HOEC.mjs +140 -0
- package/dist/{chunk-JF4PHPD5.mjs → chunk-RGVKLTLH.mjs} +4 -4
- package/dist/{chunk-VG6UF6UT.mjs → chunk-RP3SQYA3.mjs} +2 -2
- package/dist/chunk-RYCLWMZ7.mjs +162 -0
- package/dist/chunk-SIZMLSRU.mjs +162 -0
- package/dist/chunk-SPJ5KXW7.mjs +199 -0
- package/dist/chunk-SWGT756Z.mjs +210 -0
- package/dist/chunk-SYOD63OZ.mjs +225 -0
- package/dist/chunk-TS2ZX2VS.mjs +270 -0
- package/dist/chunk-UFYSFDER.mjs +42 -0
- package/dist/chunk-VACKZOMY.mjs +190 -0
- package/dist/chunk-VLQZANBF.mjs +42 -0
- package/dist/chunk-VPBN3WOO.mjs +164 -0
- package/dist/chunk-WA6O6EUR.mjs +1885 -0
- package/dist/{chunk-E3K6O4FZ.mjs → chunk-WAZD7NFU.mjs} +5 -2
- package/dist/chunk-WG6JGJXB.mjs +165 -0
- package/dist/{chunk-I64K754C.mjs → chunk-WNGWBVLV.mjs} +2 -2
- package/dist/{chunk-3U7SD3MS.mjs → chunk-WOEHFRGB.mjs} +3 -3
- package/dist/{chunk-DKZRJOMF.mjs → chunk-XIRTEFKH.mjs} +12 -12
- package/dist/chunk-Y6DWJSKZ.mjs +79 -0
- package/dist/{chunk-CJ46PDXE.mjs → chunk-ZRO5JO3H.mjs} +106 -66
- package/dist/{chunk-VYMHBV6D.mjs → chunk-ZU4NV6RG.mjs} +5 -3
- package/dist/components/ui/accordion.js +40 -4
- package/dist/components/ui/accordion.mjs +2 -2
- package/dist/components/ui/add-column-modal.js +789 -0
- package/dist/components/ui/add-column-modal.mjs +17 -0
- package/dist/components/ui/add-lead-modal.js +647 -0
- package/dist/components/ui/add-lead-modal.mjs +16 -0
- package/dist/components/ui/ai-assistant-drawer.js +686 -0
- package/dist/components/ui/ai-assistant-drawer.mjs +16 -0
- package/dist/components/ui/alert-dialog.js +37 -5
- package/dist/components/ui/alert-dialog.mjs +4 -4
- package/dist/components/ui/alert.js +37 -11
- package/dist/components/ui/alert.mjs +2 -2
- package/dist/components/ui/avatar.js +36 -8
- package/dist/components/ui/avatar.mjs +2 -2
- package/dist/components/ui/backoffice-alert-history-chart.js +624 -0
- package/dist/components/ui/backoffice-alert-history-chart.mjs +16 -0
- package/dist/components/ui/backoffice-contact-history-chart.js +687 -0
- package/dist/components/ui/backoffice-contact-history-chart.mjs +16 -0
- package/dist/components/ui/badge.js +37 -2
- package/dist/components/ui/badge.mjs +2 -2
- package/dist/components/ui/borrowing-capacity-line-chart.js +640 -0
- package/dist/components/ui/borrowing-capacity-line-chart.mjs +16 -0
- package/dist/components/ui/button.js +35 -3
- package/dist/components/ui/button.mjs +2 -2
- package/dist/components/ui/calendar.js +43 -19
- package/dist/components/ui/calendar.mjs +3 -3
- package/dist/components/ui/card.js +40 -4
- package/dist/components/ui/card.mjs +2 -2
- package/dist/components/ui/cash-balance-line-chart.js +628 -0
- package/dist/components/ui/cash-balance-line-chart.mjs +16 -0
- package/dist/components/ui/cashflow-bar-chart.js +124 -70
- package/dist/components/ui/cashflow-bar-chart.mjs +8 -8
- package/dist/components/ui/checkbox.js +36 -5
- package/dist/components/ui/checkbox.mjs +2 -3
- package/dist/components/ui/chip.js +37 -2
- package/dist/components/ui/chip.mjs +3 -3
- package/dist/components/ui/combobox.js +68 -49
- package/dist/components/ui/combobox.mjs +2 -2
- package/dist/components/ui/data-table.js +160 -88
- package/dist/components/ui/data-table.mjs +10 -11
- package/dist/components/ui/date-picker.js +44 -20
- package/dist/components/ui/date-picker.mjs +6 -7
- package/dist/components/ui/dialog.js +44 -12
- package/dist/components/ui/dialog.mjs +4 -4
- package/dist/components/ui/drawer.js +46 -10
- package/dist/components/ui/drawer.mjs +3 -3
- package/dist/components/ui/dropdown-menu.js +40 -16
- package/dist/components/ui/dropdown-menu.mjs +3 -3
- package/dist/components/ui/empty.js +41 -5
- package/dist/components/ui/empty.mjs +2 -2
- package/dist/components/ui/expense-bar-chart.js +166 -67
- package/dist/components/ui/expense-bar-chart.mjs +8 -8
- package/dist/components/ui/field.js +53 -21
- package/dist/components/ui/field.mjs +4 -4
- package/dist/components/ui/financial-cards.js +1002 -0
- package/dist/components/ui/financial-cards.mjs +24 -0
- package/dist/components/ui/financial-drawers.js +637 -0
- package/dist/components/ui/financial-drawers.mjs +17 -0
- package/dist/components/ui/financial-primitives.js +218 -0
- package/dist/components/ui/financial-primitives.mjs +22 -0
- package/dist/components/ui/financial-sections.js +1422 -0
- package/dist/components/ui/financial-sections.mjs +30 -0
- package/dist/components/ui/form-primitives.js +682 -0
- package/dist/components/ui/form-primitives.mjs +19 -0
- package/dist/components/ui/income-bar-chart.js +164 -66
- package/dist/components/ui/income-bar-chart.mjs +8 -8
- package/dist/components/ui/input-group.js +43 -7
- package/dist/components/ui/input-group.mjs +5 -5
- package/dist/components/ui/input-otp.js +39 -3
- package/dist/components/ui/input-otp.mjs +2 -2
- package/dist/components/ui/input.js +34 -2
- package/dist/components/ui/input.mjs +2 -2
- package/dist/components/ui/kanban-column.js +1143 -0
- package/dist/components/ui/kanban-column.mjs +20 -0
- package/dist/components/ui/label.js +35 -7
- package/dist/components/ui/label.mjs +2 -2
- package/dist/components/ui/opportunity-card.js +960 -0
- package/dist/components/ui/opportunity-card.mjs +20 -0
- package/dist/components/ui/opportunity-edit-modals.js +3360 -0
- package/dist/components/ui/opportunity-edit-modals.mjs +37 -0
- package/dist/components/ui/opportunity-summary-tab.js +4365 -0
- package/dist/components/ui/opportunity-summary-tab.mjs +34 -0
- package/dist/components/ui/pagination.js +35 -3
- package/dist/components/ui/pagination.mjs +3 -3
- package/dist/components/ui/pipeline-alerts.js +103 -0
- package/dist/components/ui/pipeline-alerts.mjs +8 -0
- package/dist/components/ui/pipeline-board.js +1408 -0
- package/dist/components/ui/pipeline-board.mjs +24 -0
- package/dist/components/ui/pipeline-chart.js +216 -0
- package/dist/components/ui/pipeline-chart.mjs +10 -0
- package/dist/components/ui/pipeline-dialogs.js +1183 -0
- package/dist/components/ui/pipeline-dialogs.mjs +23 -0
- package/dist/components/ui/pipeline-primitives.js +300 -0
- package/dist/components/ui/pipeline-primitives.mjs +11 -0
- package/dist/components/ui/popover.js +45 -4
- package/dist/components/ui/popover.mjs +3 -3
- package/dist/components/ui/progress.js +33 -1
- package/dist/components/ui/progress.mjs +2 -2
- package/dist/components/ui/property-cashflow-doughnut-chart.js +523 -0
- package/dist/components/ui/property-cashflow-doughnut-chart.mjs +16 -0
- package/dist/components/ui/property-debt-equity-doughnut-chart.js +521 -0
- package/dist/components/ui/property-debt-equity-doughnut-chart.mjs +16 -0
- package/dist/components/ui/property-mobile-estimate-line-chart.js +683 -0
- package/dist/components/ui/property-mobile-estimate-line-chart.mjs +16 -0
- package/dist/components/ui/radio-group.js +33 -1
- package/dist/components/ui/radio-group.mjs +2 -2
- package/dist/components/ui/select.js +66 -26
- package/dist/components/ui/select.mjs +3 -3
- package/dist/components/ui/separator.js +33 -1
- package/dist/components/ui/separator.mjs +2 -2
- package/dist/components/ui/sheet.js +37 -9
- package/dist/components/ui/sheet.mjs +3 -3
- package/dist/components/ui/skeleton.js +33 -1
- package/dist/components/ui/skeleton.mjs +2 -2
- package/dist/components/ui/slider.js +86 -102
- package/dist/components/ui/slider.mjs +2 -2
- package/dist/components/ui/spinner.js +33 -1
- package/dist/components/ui/spinner.mjs +2 -2
- package/dist/components/ui/stage-timeline.js +579 -0
- package/dist/components/ui/stage-timeline.mjs +15 -0
- package/dist/components/ui/switch.js +37 -4
- package/dist/components/ui/switch.mjs +2 -3
- package/dist/components/ui/table.js +37 -5
- package/dist/components/ui/table.mjs +2 -2
- package/dist/components/ui/tabs.js +36 -12
- package/dist/components/ui/tabs.mjs +2 -2
- package/dist/components/ui/textarea.js +34 -2
- package/dist/components/ui/textarea.mjs +2 -2
- package/dist/components/ui/toggle-group.js +35 -4
- package/dist/components/ui/toggle-group.mjs +3 -4
- package/dist/components/ui/toggle.js +35 -4
- package/dist/components/ui/toggle.mjs +2 -3
- package/dist/components/ui/tooltip.js +51 -22
- package/dist/components/ui/tooltip.mjs +3 -3
- package/dist/components/ui/transactions-expense-categories-doughnut-chart.js +528 -0
- package/dist/components/ui/transactions-expense-categories-doughnut-chart.mjs +16 -0
- package/dist/components/ui/transactions-income-expense-bar-chart.js +77 -39
- package/dist/components/ui/transactions-income-expense-bar-chart.mjs +8 -8
- package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.js +528 -0
- package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.mjs +16 -0
- package/dist/index.js +11620 -3832
- package/dist/index.mjs +333 -161
- package/dist/lib/theme-provider.js +10 -1
- package/dist/lib/theme-provider.mjs +1 -1
- package/dist/lib/typography.js +8 -0
- package/dist/lib/typography.mjs +3 -1
- package/dist/lib/utils.js +33 -1
- package/dist/lib/utils.mjs +1 -1
- package/dist/styles.css +1 -1
- package/package.json +140 -5
- package/src/components/index.tsx +296 -42
- package/src/components/ui/accordion.tsx +6 -3
- package/src/components/ui/add-column-modal.tsx +339 -0
- package/src/components/ui/add-lead-modal.tsx +290 -0
- package/src/components/ui/ai-assistant-drawer.tsx +408 -0
- package/src/components/ui/alert-dialog.tsx +80 -54
- package/src/components/ui/alert.tsx +28 -28
- package/src/components/ui/avatar.tsx +30 -29
- package/src/components/ui/backoffice-alert-history-chart.tsx +261 -0
- package/src/components/ui/backoffice-contact-history-chart.tsx +326 -0
- package/src/components/ui/badge.tsx +17 -15
- package/src/components/ui/borrowing-capacity-line-chart.tsx +359 -0
- package/src/components/ui/button.tsx +30 -27
- package/src/components/ui/calendar.tsx +53 -67
- package/src/components/ui/card.tsx +27 -24
- package/src/components/ui/cash-balance-line-chart.tsx +304 -0
- package/src/components/ui/cashflow-bar-chart.tsx +106 -78
- package/src/components/ui/chart-shared.tsx +176 -15
- package/src/components/ui/checkbox.tsx +30 -26
- package/src/components/ui/combobox.tsx +78 -72
- package/src/components/ui/data-table.tsx +160 -99
- package/src/components/ui/date-picker.tsx +0 -2
- package/src/components/ui/dialog.tsx +70 -60
- package/src/components/ui/drawer.tsx +57 -48
- package/src/components/ui/dropdown-menu.tsx +90 -82
- package/src/components/ui/empty.tsx +31 -27
- package/src/components/ui/expense-bar-chart.tsx +85 -66
- package/src/components/ui/field.tsx +70 -62
- package/src/components/ui/financial-cards.tsx +830 -0
- package/src/components/ui/financial-drawers.tsx +339 -0
- package/src/components/ui/financial-primitives.tsx +331 -0
- package/src/components/ui/financial-sections.tsx +672 -0
- package/src/components/ui/form-primitives.tsx +536 -0
- package/src/components/ui/income-bar-chart.tsx +81 -61
- package/src/components/ui/input-group.tsx +41 -34
- package/src/components/ui/input-otp.tsx +29 -24
- package/src/components/ui/input.tsx +8 -8
- package/src/components/ui/kanban-column.tsx +333 -0
- package/src/components/ui/label.tsx +9 -12
- package/src/components/ui/opportunity-card.tsx +616 -0
- package/src/components/ui/opportunity-edit-modals.tsx +2528 -0
- package/src/components/ui/opportunity-summary-tab.tsx +579 -0
- package/src/components/ui/pipeline-alerts.tsx +74 -0
- package/src/components/ui/pipeline-board.tsx +268 -0
- package/src/components/ui/pipeline-chart.tsx +173 -0
- package/src/components/ui/pipeline-dialogs.tsx +303 -0
- package/src/components/ui/pipeline-primitives.tsx +108 -0
- package/src/components/ui/popover.tsx +41 -36
- package/src/components/ui/property-cashflow-doughnut-chart.tsx +189 -0
- package/src/components/ui/property-debt-equity-doughnut-chart.tsx +186 -0
- package/src/components/ui/property-mobile-estimate-line-chart.tsx +395 -0
- package/src/components/ui/select.tsx +65 -52
- package/src/components/ui/sheet.tsx +55 -52
- package/src/components/ui/slider.tsx +54 -77
- package/src/components/ui/stage-timeline.tsx +205 -0
- package/src/components/ui/switch.tsx +42 -29
- package/src/components/ui/table.tsx +28 -28
- package/src/components/ui/tabs.tsx +22 -28
- package/src/components/ui/textarea.tsx +8 -8
- package/src/components/ui/toggle-group.tsx +0 -2
- package/src/components/ui/toggle.tsx +13 -15
- package/src/components/ui/tooltip.tsx +30 -28
- package/src/components/ui/transactions-expense-categories-doughnut-chart.tsx +192 -0
- package/src/components/ui/transactions-income-expense-bar-chart.tsx +47 -39
- package/src/components/ui/transactions-liabilities-breakdown-doughnut-chart.tsx +192 -0
- package/src/lib/theme-provider.tsx +10 -0
- package/src/lib/typography.ts +9 -0
- package/src/lib/utils.ts +41 -3
- package/src/styles/globals.css +371 -124
- package/src/styles/styles-css.ts +1 -1
- package/tsup.config.ts +27 -0
- package/dist/chunk-3EQP72AW.mjs +0 -58
- package/dist/chunk-K74JRTJR.mjs +0 -105
- package/dist/chunk-V7CNWJT3.mjs +0 -10
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
"use client"
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
2
|
* DataTable — WealthX Design System
|
|
5
3
|
*
|
|
@@ -16,8 +14,8 @@
|
|
|
16
14
|
*
|
|
17
15
|
* All colors use design tokens — no hex codes.
|
|
18
16
|
*/
|
|
19
|
-
import { type ReactElement } from "react"
|
|
20
|
-
import * as React from "react"
|
|
17
|
+
import { type ReactElement } from "react";
|
|
18
|
+
import * as React from "react";
|
|
21
19
|
import {
|
|
22
20
|
type ColumnDef,
|
|
23
21
|
type ColumnFiltersState,
|
|
@@ -31,7 +29,7 @@ import {
|
|
|
31
29
|
getPaginationRowModel,
|
|
32
30
|
getSortedRowModel,
|
|
33
31
|
useReactTable,
|
|
34
|
-
} from "@tanstack/react-table"
|
|
32
|
+
} from "@tanstack/react-table";
|
|
35
33
|
import {
|
|
36
34
|
ArrowUpDown,
|
|
37
35
|
ArrowUp,
|
|
@@ -41,8 +39,8 @@ import {
|
|
|
41
39
|
ChevronsLeftIcon,
|
|
42
40
|
ChevronsRightIcon,
|
|
43
41
|
SlidersHorizontal,
|
|
44
|
-
} from "lucide-react"
|
|
45
|
-
import { cn } from "@/lib/utils"
|
|
42
|
+
} from "lucide-react";
|
|
43
|
+
import { cn } from "@/lib/utils";
|
|
46
44
|
import {
|
|
47
45
|
Table,
|
|
48
46
|
TableBody,
|
|
@@ -50,17 +48,17 @@ import {
|
|
|
50
48
|
TableHead,
|
|
51
49
|
TableHeader,
|
|
52
50
|
TableRow,
|
|
53
|
-
} from "@/components/ui/table"
|
|
54
|
-
import { Input } from "@/components/ui/input"
|
|
55
|
-
import { Button } from "@/components/ui/button"
|
|
56
|
-
import { Checkbox } from "@/components/ui/checkbox"
|
|
51
|
+
} from "@/components/ui/table";
|
|
52
|
+
import { Input } from "@/components/ui/input";
|
|
53
|
+
import { Button } from "@/components/ui/button";
|
|
54
|
+
import { Checkbox } from "@/components/ui/checkbox";
|
|
57
55
|
import {
|
|
58
56
|
Select,
|
|
59
57
|
SelectContent,
|
|
60
58
|
SelectItem,
|
|
61
59
|
SelectTrigger,
|
|
62
60
|
SelectValue,
|
|
63
|
-
} from "@/components/ui/select"
|
|
61
|
+
} from "@/components/ui/select";
|
|
64
62
|
import {
|
|
65
63
|
DropdownMenu,
|
|
66
64
|
DropdownMenuCheckboxItem,
|
|
@@ -69,8 +67,8 @@ import {
|
|
|
69
67
|
DropdownMenuLabel,
|
|
70
68
|
DropdownMenuSeparator,
|
|
71
69
|
DropdownMenuTrigger,
|
|
72
|
-
} from "@/components/ui/dropdown-menu"
|
|
73
|
-
import { Skeleton } from "@/components/ui/skeleton"
|
|
70
|
+
} from "@/components/ui/dropdown-menu";
|
|
71
|
+
import { Skeleton } from "@/components/ui/skeleton";
|
|
74
72
|
|
|
75
73
|
// ---------------------------------------------------------------------------
|
|
76
74
|
// Types
|
|
@@ -78,31 +76,31 @@ import { Skeleton } from "@/components/ui/skeleton"
|
|
|
78
76
|
|
|
79
77
|
export interface DataTableProps<TData, TValue> {
|
|
80
78
|
/** Column definitions — pass ColumnDef[] from \@tanstack/react-table */
|
|
81
|
-
columns: ColumnDef<TData, TValue>[]
|
|
79
|
+
columns: ColumnDef<TData, TValue>[];
|
|
82
80
|
/** Row data */
|
|
83
|
-
data: TData[]
|
|
81
|
+
data: TData[];
|
|
84
82
|
/** Show a global search/filter input above the table */
|
|
85
|
-
searchKey?: string
|
|
83
|
+
searchKey?: string;
|
|
86
84
|
/** Placeholder for the search input */
|
|
87
|
-
searchPlaceholder?: string
|
|
85
|
+
searchPlaceholder?: string;
|
|
88
86
|
/** Enable row selection with checkboxes */
|
|
89
|
-
enableRowSelection?: boolean
|
|
87
|
+
enableRowSelection?: boolean;
|
|
90
88
|
/** Enable column visibility toggle dropdown */
|
|
91
|
-
enableColumnVisibility?: boolean
|
|
89
|
+
enableColumnVisibility?: boolean;
|
|
92
90
|
/** Page size options for the page-size selector */
|
|
93
|
-
pageSizeOptions?: number[]
|
|
91
|
+
pageSizeOptions?: number[];
|
|
94
92
|
/** Show loading skeleton */
|
|
95
|
-
loading?: boolean
|
|
93
|
+
loading?: boolean;
|
|
96
94
|
/** Number of skeleton rows to show while loading */
|
|
97
|
-
skeletonRows?: number
|
|
95
|
+
skeletonRows?: number;
|
|
98
96
|
/** Callback when row selection changes */
|
|
99
|
-
onRowSelectionChange?: (selection: RowSelectionState) => void
|
|
97
|
+
onRowSelectionChange?: (selection: RowSelectionState) => void;
|
|
100
98
|
/** Additional className for the root wrapper */
|
|
101
|
-
className?: string
|
|
99
|
+
className?: string;
|
|
102
100
|
/** Render a toolbar above the table (replaces default toolbar) */
|
|
103
|
-
toolbar?: (table: TanstackTable<TData>) => React.ReactNode
|
|
101
|
+
toolbar?: (table: TanstackTable<TData>) => React.ReactNode;
|
|
104
102
|
/** Text shown when no results found */
|
|
105
|
-
emptyText?: string
|
|
103
|
+
emptyText?: string;
|
|
106
104
|
}
|
|
107
105
|
|
|
108
106
|
// ---------------------------------------------------------------------------
|
|
@@ -114,36 +112,45 @@ export function DataTableColumnHeader({
|
|
|
114
112
|
title,
|
|
115
113
|
className,
|
|
116
114
|
}: {
|
|
117
|
-
column: {
|
|
118
|
-
|
|
119
|
-
|
|
115
|
+
column: {
|
|
116
|
+
getIsSorted: () => false | "asc" | "desc";
|
|
117
|
+
toggleSorting: (desc?: boolean) => void;
|
|
118
|
+
getCanSort: () => boolean;
|
|
119
|
+
};
|
|
120
|
+
title: string;
|
|
121
|
+
className?: string;
|
|
120
122
|
}): ReactElement {
|
|
121
123
|
if (!column.getCanSort()) {
|
|
122
|
-
return <span className={className}>{title}</span
|
|
124
|
+
return <span className={className}>{title}</span>;
|
|
123
125
|
}
|
|
124
126
|
|
|
125
|
-
const sorted = column.getIsSorted()
|
|
127
|
+
const sorted = column.getIsSorted();
|
|
126
128
|
|
|
127
|
-
let sortIcon: ReactElement
|
|
129
|
+
let sortIcon: ReactElement;
|
|
128
130
|
if (sorted === "asc") {
|
|
129
|
-
sortIcon = <ArrowUp className="ml-1 size-3.5"
|
|
131
|
+
sortIcon = <ArrowUp className="ml-1 size-3.5" />;
|
|
130
132
|
} else if (sorted === "desc") {
|
|
131
|
-
sortIcon = <ArrowDown className="ml-1 size-3.5"
|
|
133
|
+
sortIcon = <ArrowDown className="ml-1 size-3.5" />;
|
|
132
134
|
} else {
|
|
133
|
-
sortIcon = <ArrowUpDown className="ml-1 size-3.5"
|
|
135
|
+
sortIcon = <ArrowUpDown className="ml-1 size-3.5" />;
|
|
134
136
|
}
|
|
135
137
|
|
|
136
138
|
return (
|
|
137
139
|
<Button
|
|
138
|
-
className={cn(
|
|
139
|
-
|
|
140
|
+
className={cn(
|
|
141
|
+
"-ml-3 h-8 text-muted-foreground hover:text-foreground",
|
|
142
|
+
className,
|
|
143
|
+
)}
|
|
144
|
+
onClick={() => {
|
|
145
|
+
column.toggleSorting(sorted === "asc");
|
|
146
|
+
}}
|
|
140
147
|
size="sm"
|
|
141
148
|
variant="ghost"
|
|
142
149
|
>
|
|
143
150
|
{title}
|
|
144
151
|
{sortIcon}
|
|
145
152
|
</Button>
|
|
146
|
-
)
|
|
153
|
+
);
|
|
147
154
|
}
|
|
148
155
|
|
|
149
156
|
// ---------------------------------------------------------------------------
|
|
@@ -157,20 +164,26 @@ export function getSelectionColumn<TData>(): ColumnDef<TData> {
|
|
|
157
164
|
<Checkbox
|
|
158
165
|
aria-label="Select all"
|
|
159
166
|
checked={table.getIsAllPageRowsSelected()}
|
|
160
|
-
indeterminate={
|
|
161
|
-
|
|
167
|
+
indeterminate={
|
|
168
|
+
table.getIsSomePageRowsSelected() && !table.getIsAllPageRowsSelected()
|
|
169
|
+
}
|
|
170
|
+
onCheckedChange={(checked) => {
|
|
171
|
+
table.toggleAllPageRowsSelected(Boolean(checked));
|
|
172
|
+
}}
|
|
162
173
|
/>
|
|
163
174
|
),
|
|
164
175
|
cell: ({ row }) => (
|
|
165
176
|
<Checkbox
|
|
166
177
|
aria-label="Select row"
|
|
167
178
|
checked={row.getIsSelected()}
|
|
168
|
-
onCheckedChange={(checked) => {
|
|
179
|
+
onCheckedChange={(checked) => {
|
|
180
|
+
row.toggleSelected(Boolean(checked));
|
|
181
|
+
}}
|
|
169
182
|
/>
|
|
170
183
|
),
|
|
171
184
|
enableSorting: false,
|
|
172
185
|
enableHiding: false,
|
|
173
|
-
}
|
|
186
|
+
};
|
|
174
187
|
}
|
|
175
188
|
|
|
176
189
|
// ---------------------------------------------------------------------------
|
|
@@ -183,24 +196,38 @@ function DataTableToolbar<TData>({
|
|
|
183
196
|
searchPlaceholder,
|
|
184
197
|
enableColumnVisibility,
|
|
185
198
|
}: {
|
|
186
|
-
table: TanstackTable<TData
|
|
187
|
-
searchKey?: string
|
|
188
|
-
searchPlaceholder?: string
|
|
189
|
-
enableColumnVisibility?: boolean
|
|
199
|
+
table: TanstackTable<TData>;
|
|
200
|
+
searchKey?: string;
|
|
201
|
+
searchPlaceholder?: string;
|
|
202
|
+
enableColumnVisibility?: boolean;
|
|
190
203
|
}): ReactElement {
|
|
191
204
|
return (
|
|
192
|
-
<div
|
|
205
|
+
<div
|
|
206
|
+
className="flex items-center justify-between gap-2 py-4"
|
|
207
|
+
data-slot="data-table-toolbar"
|
|
208
|
+
>
|
|
193
209
|
<div className="flex flex-1 items-center gap-2">
|
|
194
|
-
{searchKey ?
|
|
210
|
+
{searchKey ? (
|
|
211
|
+
<Input
|
|
195
212
|
className="max-w-xs"
|
|
196
|
-
onChange={(e) =>
|
|
213
|
+
onChange={(e) =>
|
|
214
|
+
table.getColumn(searchKey)?.setFilterValue(e.target.value)
|
|
215
|
+
}
|
|
197
216
|
placeholder={searchPlaceholder ?? `Filter ${searchKey}...`}
|
|
198
217
|
value={table.getColumn(searchKey)?.getFilterValue() as string}
|
|
199
|
-
/>
|
|
218
|
+
/>
|
|
219
|
+
) : null}
|
|
200
220
|
</div>
|
|
201
|
-
{enableColumnVisibility ?
|
|
221
|
+
{enableColumnVisibility ? (
|
|
222
|
+
<DropdownMenu>
|
|
202
223
|
<DropdownMenuTrigger
|
|
203
|
-
render={
|
|
224
|
+
render={
|
|
225
|
+
<Button
|
|
226
|
+
className="ml-auto h-8 gap-1.5"
|
|
227
|
+
size="sm"
|
|
228
|
+
variant="outline"
|
|
229
|
+
/>
|
|
230
|
+
}
|
|
204
231
|
>
|
|
205
232
|
<SlidersHorizontal className="size-3.5" />
|
|
206
233
|
<span className="hidden sm:inline">Columns</span>
|
|
@@ -217,24 +244,27 @@ function DataTableToolbar<TData>({
|
|
|
217
244
|
checked={col.getIsVisible()}
|
|
218
245
|
className="capitalize"
|
|
219
246
|
key={col.id}
|
|
220
|
-
onCheckedChange={(value) => {
|
|
247
|
+
onCheckedChange={(value) => {
|
|
248
|
+
col.toggleVisibility(Boolean(value));
|
|
249
|
+
}}
|
|
221
250
|
>
|
|
222
251
|
{col.id}
|
|
223
252
|
</DropdownMenuCheckboxItem>
|
|
224
253
|
))}
|
|
225
254
|
</DropdownMenuGroup>
|
|
226
255
|
</DropdownMenuContent>
|
|
227
|
-
</DropdownMenu>
|
|
256
|
+
</DropdownMenu>
|
|
257
|
+
) : null}
|
|
228
258
|
</div>
|
|
229
|
-
)
|
|
259
|
+
);
|
|
230
260
|
}
|
|
231
261
|
|
|
232
262
|
function DataTablePagination<TData>({
|
|
233
263
|
table,
|
|
234
264
|
pageSizeOptions = [10, 20, 30, 50],
|
|
235
265
|
}: {
|
|
236
|
-
table: TanstackTable<TData
|
|
237
|
-
pageSizeOptions?: number[]
|
|
266
|
+
table: TanstackTable<TData>;
|
|
267
|
+
pageSizeOptions?: number[];
|
|
238
268
|
}): ReactElement {
|
|
239
269
|
return (
|
|
240
270
|
<div
|
|
@@ -242,7 +272,7 @@ function DataTablePagination<TData>({
|
|
|
242
272
|
data-slot="data-table-pagination"
|
|
243
273
|
>
|
|
244
274
|
{/* Selected rows info */}
|
|
245
|
-
<p className="text-
|
|
275
|
+
<p className="text-body-small text-muted-foreground">
|
|
246
276
|
{table.getFilteredSelectedRowModel().rows.length > 0 && (
|
|
247
277
|
<>
|
|
248
278
|
{table.getFilteredSelectedRowModel().rows.length} of{" "}
|
|
@@ -254,13 +284,19 @@ function DataTablePagination<TData>({
|
|
|
254
284
|
<div className="flex items-center gap-6">
|
|
255
285
|
{/* Page size selector */}
|
|
256
286
|
<div className="flex items-center gap-2">
|
|
257
|
-
<p className="text-
|
|
287
|
+
<p className="text-body-small text-muted-foreground whitespace-nowrap">
|
|
288
|
+
Rows per page
|
|
289
|
+
</p>
|
|
258
290
|
<Select
|
|
259
|
-
onValueChange={(value) => {
|
|
291
|
+
onValueChange={(value) => {
|
|
292
|
+
table.setPageSize(Number(value));
|
|
293
|
+
}}
|
|
260
294
|
value={`${table.getState().pagination.pageSize}`}
|
|
261
295
|
>
|
|
262
296
|
<SelectTrigger className="w-[70px]" size="sm">
|
|
263
|
-
<SelectValue
|
|
297
|
+
<SelectValue
|
|
298
|
+
placeholder={`${table.getState().pagination.pageSize}`}
|
|
299
|
+
/>
|
|
264
300
|
</SelectTrigger>
|
|
265
301
|
<SelectContent>
|
|
266
302
|
{pageSizeOptions.map((pageSize) => (
|
|
@@ -273,8 +309,9 @@ function DataTablePagination<TData>({
|
|
|
273
309
|
</div>
|
|
274
310
|
|
|
275
311
|
{/* Page info */}
|
|
276
|
-
<p className="text-
|
|
277
|
-
Page {table.getState().pagination.pageIndex + 1} of
|
|
312
|
+
<p className="text-body-small text-muted-foreground whitespace-nowrap">
|
|
313
|
+
Page {table.getState().pagination.pageIndex + 1} of{" "}
|
|
314
|
+
{table.getPageCount()}
|
|
278
315
|
</p>
|
|
279
316
|
|
|
280
317
|
{/* Page navigation */}
|
|
@@ -282,7 +319,9 @@ function DataTablePagination<TData>({
|
|
|
282
319
|
<Button
|
|
283
320
|
aria-label="Go to first page"
|
|
284
321
|
disabled={!table.getCanPreviousPage()}
|
|
285
|
-
onClick={() => {
|
|
322
|
+
onClick={() => {
|
|
323
|
+
table.setPageIndex(0);
|
|
324
|
+
}}
|
|
286
325
|
size="icon-sm"
|
|
287
326
|
variant="outline"
|
|
288
327
|
>
|
|
@@ -291,7 +330,9 @@ function DataTablePagination<TData>({
|
|
|
291
330
|
<Button
|
|
292
331
|
aria-label="Go to previous page"
|
|
293
332
|
disabled={!table.getCanPreviousPage()}
|
|
294
|
-
onClick={() => {
|
|
333
|
+
onClick={() => {
|
|
334
|
+
table.previousPage();
|
|
335
|
+
}}
|
|
295
336
|
size="icon-sm"
|
|
296
337
|
variant="outline"
|
|
297
338
|
>
|
|
@@ -300,7 +341,9 @@ function DataTablePagination<TData>({
|
|
|
300
341
|
<Button
|
|
301
342
|
aria-label="Go to next page"
|
|
302
343
|
disabled={!table.getCanNextPage()}
|
|
303
|
-
onClick={() => {
|
|
344
|
+
onClick={() => {
|
|
345
|
+
table.nextPage();
|
|
346
|
+
}}
|
|
304
347
|
size="icon-sm"
|
|
305
348
|
variant="outline"
|
|
306
349
|
>
|
|
@@ -309,7 +352,9 @@ function DataTablePagination<TData>({
|
|
|
309
352
|
<Button
|
|
310
353
|
aria-label="Go to last page"
|
|
311
354
|
disabled={!table.getCanNextPage()}
|
|
312
|
-
onClick={() => {
|
|
355
|
+
onClick={() => {
|
|
356
|
+
table.setPageIndex(table.getPageCount() - 1);
|
|
357
|
+
}}
|
|
313
358
|
size="icon-sm"
|
|
314
359
|
variant="outline"
|
|
315
360
|
>
|
|
@@ -318,7 +363,7 @@ function DataTablePagination<TData>({
|
|
|
318
363
|
</div>
|
|
319
364
|
</div>
|
|
320
365
|
</div>
|
|
321
|
-
)
|
|
366
|
+
);
|
|
322
367
|
}
|
|
323
368
|
|
|
324
369
|
// ---------------------------------------------------------------------------
|
|
@@ -329,22 +374,24 @@ function DataTableSkeleton({
|
|
|
329
374
|
columnCount,
|
|
330
375
|
rowCount = 5,
|
|
331
376
|
}: {
|
|
332
|
-
columnCount: number
|
|
333
|
-
rowCount?: number
|
|
377
|
+
columnCount: number;
|
|
378
|
+
rowCount?: number;
|
|
334
379
|
}): ReactElement {
|
|
335
380
|
return (
|
|
336
381
|
<>
|
|
337
382
|
{Array.from({ length: rowCount }).map((_, rowIdx) => (
|
|
338
383
|
<TableRow key={`skeleton-row-${String(rowIdx)}`}>
|
|
339
384
|
{Array.from({ length: columnCount }).map((_inner, colIdx) => (
|
|
340
|
-
<TableCell
|
|
385
|
+
<TableCell
|
|
386
|
+
key={`skeleton-cell-${String(rowIdx)}-${String(colIdx)}`}
|
|
387
|
+
>
|
|
341
388
|
<Skeleton className="h-4 w-3/4" />
|
|
342
389
|
</TableCell>
|
|
343
390
|
))}
|
|
344
391
|
</TableRow>
|
|
345
392
|
))}
|
|
346
393
|
</>
|
|
347
|
-
)
|
|
394
|
+
);
|
|
348
395
|
}
|
|
349
396
|
|
|
350
397
|
// ---------------------------------------------------------------------------
|
|
@@ -366,16 +413,22 @@ function DataTable<TData, TValue>({
|
|
|
366
413
|
toolbar,
|
|
367
414
|
emptyText = "No results.",
|
|
368
415
|
}: DataTableProps<TData, TValue>): ReactElement {
|
|
369
|
-
const [sorting, setSorting] = React.useState<SortingState>([])
|
|
370
|
-
const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>(
|
|
371
|
-
|
|
372
|
-
|
|
416
|
+
const [sorting, setSorting] = React.useState<SortingState>([]);
|
|
417
|
+
const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>(
|
|
418
|
+
[],
|
|
419
|
+
);
|
|
420
|
+
const [columnVisibility, setColumnVisibility] =
|
|
421
|
+
React.useState<VisibilityState>({});
|
|
422
|
+
const [rowSelection, setRowSelection] = React.useState<RowSelectionState>({});
|
|
373
423
|
|
|
374
424
|
// Prepend selection column if enabled
|
|
375
425
|
const resolvedColumns = React.useMemo(() => {
|
|
376
|
-
if (!enableRowSelection) return userColumns
|
|
377
|
-
return [getSelectionColumn<TData>(), ...userColumns] as ColumnDef<
|
|
378
|
-
|
|
426
|
+
if (!enableRowSelection) return userColumns;
|
|
427
|
+
return [getSelectionColumn<TData>(), ...userColumns] as ColumnDef<
|
|
428
|
+
TData,
|
|
429
|
+
TValue
|
|
430
|
+
>[];
|
|
431
|
+
}, [userColumns, enableRowSelection]);
|
|
379
432
|
|
|
380
433
|
const table = useReactTable({
|
|
381
434
|
data,
|
|
@@ -390,20 +443,26 @@ function DataTable<TData, TValue>({
|
|
|
390
443
|
onColumnFiltersChange: setColumnFilters,
|
|
391
444
|
onColumnVisibilityChange: setColumnVisibility,
|
|
392
445
|
onRowSelectionChange: (updater) => {
|
|
393
|
-
const next =
|
|
394
|
-
|
|
395
|
-
|
|
446
|
+
const next =
|
|
447
|
+
typeof updater === "function" ? updater(rowSelection) : updater;
|
|
448
|
+
setRowSelection(next);
|
|
449
|
+
onRowSelectionChange?.(next);
|
|
396
450
|
},
|
|
397
451
|
getCoreRowModel: getCoreRowModel(),
|
|
398
452
|
getFilteredRowModel: getFilteredRowModel(),
|
|
399
453
|
getPaginationRowModel: getPaginationRowModel(),
|
|
400
454
|
getSortedRowModel: getSortedRowModel(),
|
|
401
455
|
enableRowSelection,
|
|
402
|
-
})
|
|
456
|
+
});
|
|
403
457
|
|
|
404
458
|
function renderTableBody(): ReactElement {
|
|
405
459
|
if (loading) {
|
|
406
|
-
return
|
|
460
|
+
return (
|
|
461
|
+
<DataTableSkeleton
|
|
462
|
+
columnCount={resolvedColumns.length}
|
|
463
|
+
rowCount={skeletonRows}
|
|
464
|
+
/>
|
|
465
|
+
);
|
|
407
466
|
}
|
|
408
467
|
|
|
409
468
|
if (table.getRowModel().rows.length) {
|
|
@@ -422,7 +481,7 @@ function DataTable<TData, TValue>({
|
|
|
422
481
|
</TableRow>
|
|
423
482
|
))}
|
|
424
483
|
</>
|
|
425
|
-
)
|
|
484
|
+
);
|
|
426
485
|
}
|
|
427
486
|
|
|
428
487
|
return (
|
|
@@ -434,7 +493,7 @@ function DataTable<TData, TValue>({
|
|
|
434
493
|
{emptyText}
|
|
435
494
|
</TableCell>
|
|
436
495
|
</TableRow>
|
|
437
|
-
)
|
|
496
|
+
);
|
|
438
497
|
}
|
|
439
498
|
|
|
440
499
|
return (
|
|
@@ -461,30 +520,32 @@ function DataTable<TData, TValue>({
|
|
|
461
520
|
<TableHead key={header.id}>
|
|
462
521
|
{header.isPlaceholder
|
|
463
522
|
? null
|
|
464
|
-
: flexRender(
|
|
523
|
+
: flexRender(
|
|
524
|
+
header.column.columnDef.header,
|
|
525
|
+
header.getContext(),
|
|
526
|
+
)}
|
|
465
527
|
</TableHead>
|
|
466
528
|
))}
|
|
467
529
|
</TableRow>
|
|
468
530
|
))}
|
|
469
531
|
</TableHeader>
|
|
470
|
-
<TableBody>
|
|
471
|
-
{renderTableBody()}
|
|
472
|
-
</TableBody>
|
|
532
|
+
<TableBody>{renderTableBody()}</TableBody>
|
|
473
533
|
</Table>
|
|
474
534
|
</div>
|
|
475
535
|
|
|
476
536
|
{/* Pagination */}
|
|
477
537
|
<DataTablePagination pageSizeOptions={pageSizeOptions} table={table} />
|
|
478
538
|
</div>
|
|
479
|
-
)
|
|
539
|
+
);
|
|
480
540
|
}
|
|
481
541
|
|
|
482
|
-
export {
|
|
483
|
-
DataTable,
|
|
484
|
-
DataTableToolbar,
|
|
485
|
-
DataTablePagination,
|
|
486
|
-
DataTableSkeleton,
|
|
487
|
-
}
|
|
542
|
+
export { DataTable, DataTableToolbar, DataTablePagination, DataTableSkeleton };
|
|
488
543
|
|
|
489
544
|
// Re-export tanstack types for consumer convenience
|
|
490
|
-
export type {
|
|
545
|
+
export type {
|
|
546
|
+
ColumnDef,
|
|
547
|
+
SortingState,
|
|
548
|
+
ColumnFiltersState,
|
|
549
|
+
VisibilityState,
|
|
550
|
+
RowSelectionState,
|
|
551
|
+
};
|