@handled-ai/design-system 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -4
- package/dist/charts/bar-chart-component.d.ts +24 -0
- package/dist/charts/bar-chart-component.js +123 -0
- package/dist/charts/bar-chart-component.js.map +1 -0
- package/dist/charts/chart-tooltip.d.ts +26 -0
- package/dist/charts/chart-tooltip.js +69 -0
- package/dist/charts/chart-tooltip.js.map +1 -0
- package/dist/charts/chart.d.ts +64 -0
- package/dist/charts/chart.js +285 -0
- package/dist/charts/chart.js.map +1 -0
- package/dist/charts/donut-chart.d.ts +21 -0
- package/dist/charts/donut-chart.js +96 -0
- package/dist/charts/donut-chart.js.map +1 -0
- package/dist/charts/index.d.ts +11 -0
- package/dist/charts/index.js +10 -0
- package/dist/charts/index.js.map +1 -0
- package/dist/charts/pipeline-overview.d.ts +76 -0
- package/dist/charts/pipeline-overview.js +372 -0
- package/dist/charts/pipeline-overview.js.map +1 -0
- package/dist/charts/sankey-chart.d.ts +52 -0
- package/dist/charts/sankey-chart.js +219 -0
- package/dist/charts/sankey-chart.js.map +1 -0
- package/dist/charts/top-line-metrics.d.ts +26 -0
- package/dist/charts/top-line-metrics.js +224 -0
- package/dist/charts/top-line-metrics.js.map +1 -0
- package/dist/charts/trend-area-chart.d.ts +21 -0
- package/dist/charts/trend-area-chart.js +150 -0
- package/dist/charts/trend-area-chart.js.map +1 -0
- package/dist/charts/volume-analysis-chart.d.ts +19 -0
- package/dist/charts/volume-analysis-chart.js +121 -0
- package/dist/charts/volume-analysis-chart.js.map +1 -0
- package/dist/components/activity-detail.d.ts +38 -0
- package/dist/components/activity-detail.js +163 -0
- package/dist/components/activity-detail.js.map +1 -0
- package/dist/components/activity-log.d.ts +21 -0
- package/dist/components/activity-log.js +61 -0
- package/dist/components/activity-log.js.map +1 -0
- package/dist/components/agent-popover.d.ts +71 -0
- package/dist/components/agent-popover.js +282 -0
- package/dist/components/agent-popover.js.map +1 -0
- package/dist/components/agent-widget.d.ts +24 -0
- package/dist/components/agent-widget.js +117 -0
- package/dist/components/agent-widget.js.map +1 -0
- package/dist/components/avatar.d.ts +13 -0
- package/dist/components/avatar.js +140 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.d.ts +12 -0
- package/dist/components/badge.js +75 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/button.d.ts +13 -0
- package/dist/components/button.js +83 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/card.d.ts +11 -0
- package/dist/components/card.js +119 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/contact-list.d.ts +34 -0
- package/dist/components/contact-list.js +84 -0
- package/dist/components/contact-list.js.map +1 -0
- package/dist/components/dashboard-cards.d.ts +10 -0
- package/dist/components/dashboard-cards.js +164 -0
- package/dist/components/dashboard-cards.js.map +1 -0
- package/dist/components/data-table-display.d.ts +19 -0
- package/dist/components/data-table-display.js +109 -0
- package/dist/components/data-table-display.js.map +1 -0
- package/dist/components/data-table-filter.d.ts +18 -0
- package/dist/components/data-table-filter.js +107 -0
- package/dist/components/data-table-filter.js.map +1 -0
- package/dist/components/data-table-quick-views.d.ts +13 -0
- package/dist/components/data-table-quick-views.js +90 -0
- package/dist/components/data-table-quick-views.js.map +1 -0
- package/dist/components/data-table-toolbar.d.ts +18 -0
- package/dist/components/data-table-toolbar.js +45 -0
- package/dist/components/data-table-toolbar.js.map +1 -0
- package/dist/components/data-table.d.ts +39 -0
- package/dist/components/data-table.js +821 -0
- package/dist/components/data-table.js.map +1 -0
- package/dist/components/detail-view.d.ts +44 -0
- package/dist/components/detail-view.js +165 -0
- package/dist/components/detail-view.js.map +1 -0
- package/dist/components/dialog.d.ts +19 -0
- package/dist/components/dialog.js +188 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/dropdown-menu.d.ts +27 -0
- package/dist/components/dropdown-menu.js +279 -0
- package/dist/components/dropdown-menu.js.map +1 -0
- package/dist/components/entity-panel.d.ts +69 -0
- package/dist/components/entity-panel.js +584 -0
- package/dist/components/entity-panel.js.map +1 -0
- package/dist/components/inbox-row.d.ts +27 -0
- package/dist/components/inbox-row.js +139 -0
- package/dist/components/inbox-row.js.map +1 -0
- package/dist/components/inbox-toolbar.d.ts +21 -0
- package/dist/components/inbox-toolbar.js +203 -0
- package/dist/components/inbox-toolbar.js.map +1 -0
- package/dist/components/input.d.ts +5 -0
- package/dist/components/input.js +50 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/insights-filter-bar.d.ts +21 -0
- package/dist/components/insights-filter-bar.js +99 -0
- package/dist/components/insights-filter-bar.js.map +1 -0
- package/dist/components/item-list-display.d.ts +22 -0
- package/dist/components/item-list-display.js +240 -0
- package/dist/components/item-list-display.js.map +1 -0
- package/dist/components/item-list-filter.d.ts +16 -0
- package/dist/components/item-list-filter.js +87 -0
- package/dist/components/item-list-filter.js.map +1 -0
- package/dist/components/item-list-toolbar.d.ts +25 -0
- package/dist/components/item-list-toolbar.js +79 -0
- package/dist/components/item-list-toolbar.js.map +1 -0
- package/dist/components/item-list.d.ts +20 -0
- package/dist/components/item-list.js +702 -0
- package/dist/components/item-list.js.map +1 -0
- package/dist/components/label.d.ts +6 -0
- package/dist/components/label.js +55 -0
- package/dist/components/label.js.map +1 -0
- package/dist/components/message.d.ts +23 -0
- package/dist/components/message.js +117 -0
- package/dist/components/message.js.map +1 -0
- package/dist/components/metric-card.d.ts +25 -0
- package/dist/components/metric-card.js +107 -0
- package/dist/components/metric-card.js.map +1 -0
- package/dist/components/performance-metrics-table.d.ts +38 -0
- package/dist/components/performance-metrics-table.js +342 -0
- package/dist/components/performance-metrics-table.js.map +1 -0
- package/dist/components/preview-list.d.ts +14 -0
- package/dist/components/preview-list.js +83 -0
- package/dist/components/preview-list.js.map +1 -0
- package/dist/components/progress.d.ts +6 -0
- package/dist/components/progress.js +69 -0
- package/dist/components/progress.js.map +1 -0
- package/dist/components/quick-action-chat-area.d.ts +24 -0
- package/dist/components/quick-action-chat-area.js +178 -0
- package/dist/components/quick-action-chat-area.js.map +1 -0
- package/dist/components/quick-action-modal.d.ts +30 -0
- package/dist/components/quick-action-modal.js +288 -0
- package/dist/components/quick-action-modal.js.map +1 -0
- package/dist/components/quick-action-sidebar-nav.d.ts +51 -0
- package/dist/components/quick-action-sidebar-nav.js +528 -0
- package/dist/components/quick-action-sidebar-nav.js.map +1 -0
- package/dist/components/recommended-actions-section.d.ts +23 -0
- package/dist/components/recommended-actions-section.js +215 -0
- package/dist/components/recommended-actions-section.js.map +1 -0
- package/dist/components/report-card.d.ts +26 -0
- package/dist/components/report-card.js +69 -0
- package/dist/components/report-card.js.map +1 -0
- package/dist/components/score-analysis-modal.d.ts +26 -0
- package/dist/components/score-analysis-modal.js +141 -0
- package/dist/components/score-analysis-modal.js.map +1 -0
- package/dist/components/score-breakdown.d.ts +17 -0
- package/dist/components/score-breakdown.js +162 -0
- package/dist/components/score-breakdown.js.map +1 -0
- package/dist/components/score-feedback.d.ts +40 -0
- package/dist/components/score-feedback.js +209 -0
- package/dist/components/score-feedback.js.map +1 -0
- package/dist/components/score-ring.d.ts +14 -0
- package/dist/components/score-ring.js +79 -0
- package/dist/components/score-ring.js.map +1 -0
- package/dist/components/scroll-area.d.ts +7 -0
- package/dist/components/scroll-area.js +101 -0
- package/dist/components/scroll-area.js.map +1 -0
- package/dist/components/select.d.ts +17 -0
- package/dist/components/select.js +228 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/separator.d.ts +6 -0
- package/dist/components/separator.js +61 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/sheet.d.ts +16 -0
- package/dist/components/sheet.js +168 -0
- package/dist/components/sheet.js.map +1 -0
- package/dist/components/sidebar.d.ts +73 -0
- package/dist/components/sidebar.js +723 -0
- package/dist/components/sidebar.js.map +1 -0
- package/dist/components/signal-feedback-inline.d.ts +51 -0
- package/dist/components/signal-feedback-inline.js +548 -0
- package/dist/components/signal-feedback-inline.js.map +1 -0
- package/dist/components/simple-data-table.d.ts +15 -0
- package/dist/components/simple-data-table.js +91 -0
- package/dist/components/simple-data-table.js.map +1 -0
- package/dist/components/skeleton.d.ts +5 -0
- package/dist/components/skeleton.js +44 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/status-badge.d.ts +10 -0
- package/dist/components/status-badge.js +82 -0
- package/dist/components/status-badge.js.map +1 -0
- package/dist/components/styled-bar-list.d.ts +20 -0
- package/dist/components/styled-bar-list.js +59 -0
- package/dist/components/styled-bar-list.js.map +1 -0
- package/dist/components/suggested-actions.d.ts +110 -0
- package/dist/components/suggested-actions.js +1538 -0
- package/dist/components/suggested-actions.js.map +1 -0
- package/dist/components/table.d.ts +12 -0
- package/dist/components/table.js +147 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.d.ts +14 -0
- package/dist/components/tabs.js +129 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/textarea.d.ts +5 -0
- package/dist/components/textarea.js +47 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/timeline-activity.d.ts +34 -0
- package/dist/components/timeline-activity.js +181 -0
- package/dist/components/timeline-activity.js.map +1 -0
- package/dist/components/tooltip.d.ts +9 -0
- package/dist/components/tooltip.js +93 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/components/view-mode-toggle.d.ts +16 -0
- package/dist/components/view-mode-toggle.js +24 -0
- package/dist/components/view-mode-toggle.js.map +1 -0
- package/dist/hooks/use-mobile.d.ts +3 -0
- package/dist/hooks/use-mobile.js +21 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/index.d.ts +68 -1878
- package/dist/index.js +69 -10918
- package/dist/index.js.map +1 -1
- package/dist/lib/icons.d.ts +18 -0
- package/dist/lib/icons.js +21 -0
- package/dist/lib/icons.js.map +1 -0
- package/dist/lib/utils.d.ts +5 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/prototype/index.d.ts +20 -0
- package/dist/prototype/index.js +8 -0
- package/dist/prototype/index.js.map +1 -0
- package/dist/prototype/prototype-accounts-view.d.ts +22 -0
- package/dist/prototype/prototype-accounts-view.js +70 -0
- package/dist/prototype/prototype-accounts-view.js.map +1 -0
- package/dist/prototype/prototype-admin-view.d.ts +21 -0
- package/dist/prototype/prototype-admin-view.js +53 -0
- package/dist/prototype/prototype-admin-view.js.map +1 -0
- package/dist/prototype/prototype-config.d.ts +226 -0
- package/dist/prototype/prototype-config.js +1 -0
- package/dist/prototype/prototype-config.js.map +1 -0
- package/dist/prototype/prototype-inbox-view.d.ts +48 -0
- package/dist/prototype/prototype-inbox-view.js +701 -0
- package/dist/prototype/prototype-inbox-view.js.map +1 -0
- package/dist/prototype/prototype-insights-view.d.ts +23 -0
- package/dist/prototype/prototype-insights-view.js +335 -0
- package/dist/prototype/prototype-insights-view.js.map +1 -0
- package/dist/prototype/prototype-shell.d.ts +40 -0
- package/dist/prototype/prototype-shell.js +190 -0
- package/dist/prototype/prototype-shell.js.map +1 -0
- package/dist/prototype/prototype-work-queue-view.d.ts +8 -0
- package/dist/prototype/prototype-work-queue-view.js +17 -0
- package/dist/prototype/prototype-work-queue-view.js.map +1 -0
- package/dist/three/agent-orb.d.ts +39 -0
- package/dist/three/agent-orb.js +500 -0
- package/dist/three/agent-orb.js.map +1 -0
- package/dist/three/index.d.ts +2 -0
- package/dist/three/index.js +2 -0
- package/dist/three/index.js.map +1 -0
- package/package.json +98 -17
- package/src/charts/bar-chart-component.tsx +150 -0
- package/src/charts/chart-tooltip.tsx +86 -0
- package/src/charts/chart.tsx +371 -0
- package/src/charts/donut-chart.tsx +112 -0
- package/src/charts/index.ts +13 -0
- package/src/charts/pipeline-overview.tsx +476 -0
- package/src/charts/sankey-chart.tsx +290 -0
- package/src/charts/top-line-metrics.tsx +261 -0
- package/src/charts/trend-area-chart.tsx +150 -0
- package/src/charts/volume-analysis-chart.tsx +124 -0
- package/src/components/activity-detail.tsx +233 -0
- package/src/components/activity-log.tsx +89 -0
- package/src/components/agent-popover.tsx +373 -0
- package/src/components/agent-widget.tsx +163 -0
- package/src/components/avatar.tsx +109 -0
- package/src/components/badge.tsx +48 -0
- package/src/components/button.tsx +59 -0
- package/src/components/card.tsx +92 -0
- package/src/components/contact-list.tsx +121 -0
- package/src/components/dashboard-cards.tsx +170 -0
- package/src/components/data-table-display.tsx +139 -0
- package/src/components/data-table-filter.tsx +138 -0
- package/src/components/data-table-quick-views.tsx +103 -0
- package/src/components/data-table-toolbar.tsx +56 -0
- package/src/components/data-table.tsx +915 -0
- package/src/components/detail-view.tsx +237 -0
- package/src/components/dialog.tsx +158 -0
- package/src/components/dropdown-menu.tsx +257 -0
- package/src/components/entity-panel.tsx +767 -0
- package/src/components/inbox-row.tsx +132 -0
- package/src/components/inbox-toolbar.tsx +213 -0
- package/src/components/input.tsx +21 -0
- package/src/components/insights-filter-bar.tsx +132 -0
- package/src/components/item-list-display.tsx +278 -0
- package/src/components/item-list-filter.tsx +118 -0
- package/src/components/item-list-toolbar.tsx +97 -0
- package/src/components/item-list.tsx +843 -0
- package/src/components/label.tsx +24 -0
- package/src/components/message.tsx +83 -0
- package/src/components/metric-card.tsx +178 -0
- package/src/components/performance-metrics-table.tsx +442 -0
- package/src/components/preview-list.tsx +62 -0
- package/src/components/progress.tsx +31 -0
- package/src/components/quick-action-chat-area.tsx +156 -0
- package/src/components/quick-action-modal.tsx +331 -0
- package/src/components/quick-action-sidebar-nav.tsx +592 -0
- package/src/components/recommended-actions-section.tsx +258 -0
- package/src/components/report-card.tsx +106 -0
- package/src/components/score-analysis-modal.tsx +172 -0
- package/src/components/score-breakdown.tsx +179 -0
- package/src/components/score-feedback.tsx +288 -0
- package/src/components/score-ring.tsx +87 -0
- package/src/components/scroll-area.tsx +58 -0
- package/src/components/select.tsx +190 -0
- package/src/components/separator.tsx +28 -0
- package/src/components/sheet.tsx +143 -0
- package/src/components/sidebar.tsx +726 -0
- package/src/components/signal-feedback-inline.tsx +591 -0
- package/src/components/simple-data-table.tsx +124 -0
- package/src/components/skeleton.tsx +15 -0
- package/src/components/status-badge.tsx +63 -0
- package/src/components/styled-bar-list.tsx +70 -0
- package/src/components/suggested-actions.tsx +1985 -0
- package/src/components/table.tsx +116 -0
- package/src/components/tabs.tsx +91 -0
- package/src/components/textarea.tsx +18 -0
- package/src/components/timeline-activity.tsx +234 -0
- package/src/components/tooltip.tsx +57 -0
- package/src/components/view-mode-toggle.tsx +39 -0
- package/src/hooks/use-mobile.ts +21 -0
- package/src/index.ts +77 -0
- package/src/lib/icons.ts +18 -0
- package/src/lib/utils.ts +6 -0
- package/src/prototype/index.ts +11 -0
- package/src/prototype/prototype-accounts-view.tsx +112 -0
- package/src/prototype/prototype-admin-view.tsx +67 -0
- package/src/prototype/prototype-config.ts +243 -0
- package/src/prototype/prototype-inbox-view.tsx +810 -0
- package/src/prototype/prototype-insights-view.tsx +379 -0
- package/src/prototype/prototype-shell.tsx +219 -0
- package/src/prototype/prototype-work-queue-view.tsx +30 -0
- package/src/styles/globals.css +299 -0
- package/src/three/agent-orb.tsx +557 -0
- package/src/three/index.ts +5 -0
- package/src/types/r3f.d.ts +8 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Card, CardHeader, CardTitle, CardContent } from "./card.js";
|
|
3
|
+
import { Button } from "./button.js";
|
|
4
|
+
import { Badge } from "./badge.js";
|
|
5
|
+
import { PreviewList, PreviewListItem } from "./preview-list.js";
|
|
6
|
+
import { Square, Clock, Video, CheckCircle2, CheckSquare, Eye } from "lucide-react";
|
|
7
|
+
function TopTasksCard({ onViewAll }) {
|
|
8
|
+
return /* @__PURE__ */ jsxs(Card, { className: "rounded-xl border border-border shadow-sm overflow-hidden gap-0 py-0", children: [
|
|
9
|
+
/* @__PURE__ */ jsxs(CardHeader, { className: "flex flex-row items-center justify-between pt-4 pb-3 px-6 border-b border-border bg-muted/20", children: [
|
|
10
|
+
/* @__PURE__ */ jsx(CardTitle, { className: "text-sm font-bold tracking-tight", children: "Top Tasks" }),
|
|
11
|
+
/* @__PURE__ */ jsx(
|
|
12
|
+
Button,
|
|
13
|
+
{
|
|
14
|
+
variant: "ghost",
|
|
15
|
+
size: "sm",
|
|
16
|
+
onClick: onViewAll,
|
|
17
|
+
className: "text-xs h-7 text-brand-purple hover:text-brand-purple/80 hover:bg-brand-purple/10",
|
|
18
|
+
children: "View all tasks \u2192"
|
|
19
|
+
}
|
|
20
|
+
)
|
|
21
|
+
] }),
|
|
22
|
+
/* @__PURE__ */ jsx(CardContent, { className: "p-0", children: /* @__PURE__ */ jsxs(PreviewList, { children: [
|
|
23
|
+
/* @__PURE__ */ jsx(
|
|
24
|
+
PreviewListItem,
|
|
25
|
+
{
|
|
26
|
+
icon: /* @__PURE__ */ jsx(Square, { className: "w-4 h-4 text-muted-foreground hover:text-brand-purple transition-colors" }),
|
|
27
|
+
title: "Follow up with Lunchclub",
|
|
28
|
+
subtitle: "Churn Mitigation",
|
|
29
|
+
meta: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
30
|
+
/* @__PURE__ */ jsx("span", { className: "text-[11px] font-medium text-muted-foreground", children: "Due in 2h" }),
|
|
31
|
+
/* @__PURE__ */ jsx(Badge, { variant: "destructive", className: "text-[10px] px-2 py-0 h-4 uppercase tracking-wider rounded-full shadow-none font-bold bg-foreground text-background hover:bg-foreground/90", children: "Urgent" })
|
|
32
|
+
] }),
|
|
33
|
+
onClick: onViewAll
|
|
34
|
+
}
|
|
35
|
+
),
|
|
36
|
+
/* @__PURE__ */ jsx(
|
|
37
|
+
PreviewListItem,
|
|
38
|
+
{
|
|
39
|
+
icon: /* @__PURE__ */ jsx(Square, { className: "w-4 h-4 text-muted-foreground hover:text-brand-purple transition-colors" }),
|
|
40
|
+
title: "Outbound opportunity: CloudKitchen",
|
|
41
|
+
subtitle: "Outbound",
|
|
42
|
+
meta: /* @__PURE__ */ jsx("span", { className: "text-[11px] font-medium text-muted-foreground", children: "Due tomorrow" }),
|
|
43
|
+
onClick: onViewAll
|
|
44
|
+
}
|
|
45
|
+
),
|
|
46
|
+
/* @__PURE__ */ jsx(
|
|
47
|
+
PreviewListItem,
|
|
48
|
+
{
|
|
49
|
+
icon: /* @__PURE__ */ jsx(Square, { className: "w-4 h-4 text-muted-foreground hover:text-brand-purple transition-colors" }),
|
|
50
|
+
title: "New CFO welcome: Loom",
|
|
51
|
+
subtitle: "Relationship",
|
|
52
|
+
meta: /* @__PURE__ */ jsx("span", { className: "text-[11px] font-medium text-muted-foreground", children: "Due next week" }),
|
|
53
|
+
onClick: onViewAll
|
|
54
|
+
}
|
|
55
|
+
)
|
|
56
|
+
] }) })
|
|
57
|
+
] });
|
|
58
|
+
}
|
|
59
|
+
function UpcomingMeetingsCard() {
|
|
60
|
+
return /* @__PURE__ */ jsxs(Card, { className: "rounded-xl border border-border shadow-sm overflow-hidden gap-0 py-0", children: [
|
|
61
|
+
/* @__PURE__ */ jsxs(CardHeader, { className: "flex flex-row items-center justify-between pt-4 pb-3 px-6 border-b border-border bg-muted/20", children: [
|
|
62
|
+
/* @__PURE__ */ jsx(CardTitle, { className: "text-sm font-bold tracking-tight", children: "Upcoming Meetings" }),
|
|
63
|
+
/* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", className: "text-xs h-7 text-brand-purple hover:text-brand-purple/80 hover:bg-brand-purple/10", children: "View all meetings \u2192" })
|
|
64
|
+
] }),
|
|
65
|
+
/* @__PURE__ */ jsx(CardContent, { className: "p-0", children: /* @__PURE__ */ jsxs(PreviewList, { children: [
|
|
66
|
+
/* @__PURE__ */ jsx(
|
|
67
|
+
PreviewListItem,
|
|
68
|
+
{
|
|
69
|
+
icon: /* @__PURE__ */ jsx(Clock, { className: "w-4 h-4 text-blue-500" }),
|
|
70
|
+
title: "Q3 Review - Acme Corp",
|
|
71
|
+
subtitle: "2:00 PM - 3:00 PM",
|
|
72
|
+
meta: /* @__PURE__ */ jsx("span", { className: "text-[11px] font-medium text-blue-600 bg-blue-50 px-2 py-0.5 rounded-full", children: "Starts in 10 mins" }),
|
|
73
|
+
action: /* @__PURE__ */ jsxs(Button, { size: "sm", variant: "outline", className: "h-7 text-xs shadow-sm bg-background hover:bg-muted", children: [
|
|
74
|
+
/* @__PURE__ */ jsx(Video, { className: "w-3.5 h-3.5 mr-1.5" }),
|
|
75
|
+
" Join"
|
|
76
|
+
] })
|
|
77
|
+
}
|
|
78
|
+
),
|
|
79
|
+
/* @__PURE__ */ jsx(
|
|
80
|
+
PreviewListItem,
|
|
81
|
+
{
|
|
82
|
+
icon: /* @__PURE__ */ jsx(Clock, { className: "w-4 h-4 text-blue-500" }),
|
|
83
|
+
title: "Initial Sync - Initech",
|
|
84
|
+
subtitle: "4:30 PM - 5:00 PM",
|
|
85
|
+
action: /* @__PURE__ */ jsxs(Button, { size: "sm", variant: "outline", className: "h-7 text-xs shadow-sm bg-background hover:bg-muted", children: [
|
|
86
|
+
/* @__PURE__ */ jsx(Video, { className: "w-3.5 h-3.5 mr-1.5" }),
|
|
87
|
+
" Join"
|
|
88
|
+
] })
|
|
89
|
+
}
|
|
90
|
+
)
|
|
91
|
+
] }) })
|
|
92
|
+
] });
|
|
93
|
+
}
|
|
94
|
+
function RecentlyCompletedCard() {
|
|
95
|
+
return /* @__PURE__ */ jsxs(Card, { className: "rounded-xl border border-border shadow-sm overflow-hidden opacity-80 bg-muted/5 gap-0 py-0", children: [
|
|
96
|
+
/* @__PURE__ */ jsx(CardHeader, { className: "flex flex-row items-center justify-between pt-4 pb-3 px-6 border-b border-border bg-muted/10", children: /* @__PURE__ */ jsx(CardTitle, { className: "text-sm font-bold tracking-tight text-muted-foreground", children: "Recently Completed" }) }),
|
|
97
|
+
/* @__PURE__ */ jsx(CardContent, { className: "p-0", children: /* @__PURE__ */ jsxs(PreviewList, { children: [
|
|
98
|
+
/* @__PURE__ */ jsx(
|
|
99
|
+
PreviewListItem,
|
|
100
|
+
{
|
|
101
|
+
icon: /* @__PURE__ */ jsx(CheckCircle2, { className: "w-4 h-4 text-emerald-500" }),
|
|
102
|
+
title: /* @__PURE__ */ jsx("span", { className: "text-muted-foreground font-medium", children: "Sync - Globex Inc" }),
|
|
103
|
+
subtitle: "10:00 AM",
|
|
104
|
+
action: /* @__PURE__ */ jsxs(Button, { size: "sm", variant: "outline", className: "h-7 text-xs shadow-sm bg-background hover:bg-muted", children: [
|
|
105
|
+
/* @__PURE__ */ jsx(Eye, { className: "w-3.5 h-3.5 mr-1.5" }),
|
|
106
|
+
" View"
|
|
107
|
+
] })
|
|
108
|
+
}
|
|
109
|
+
),
|
|
110
|
+
/* @__PURE__ */ jsx(
|
|
111
|
+
PreviewListItem,
|
|
112
|
+
{
|
|
113
|
+
icon: /* @__PURE__ */ jsx(CheckCircle2, { className: "w-4 h-4 text-emerald-500" }),
|
|
114
|
+
title: /* @__PURE__ */ jsx("span", { className: "text-muted-foreground font-medium", children: "Check-in - Pied Piper" }),
|
|
115
|
+
subtitle: "9:00 AM",
|
|
116
|
+
action: /* @__PURE__ */ jsxs(Button, { size: "sm", variant: "outline", className: "h-7 text-xs shadow-sm bg-background hover:bg-muted", children: [
|
|
117
|
+
/* @__PURE__ */ jsx(Eye, { className: "w-3.5 h-3.5 mr-1.5" }),
|
|
118
|
+
" View"
|
|
119
|
+
] })
|
|
120
|
+
}
|
|
121
|
+
)
|
|
122
|
+
] }) })
|
|
123
|
+
] });
|
|
124
|
+
}
|
|
125
|
+
function CheckInsCard() {
|
|
126
|
+
return /* @__PURE__ */ jsxs(Card, { className: "rounded-xl border border-border shadow-sm overflow-hidden gap-0 py-0", children: [
|
|
127
|
+
/* @__PURE__ */ jsx(CardHeader, { className: "flex flex-row items-center justify-between pt-4 pb-3 px-6 border-b border-border bg-muted/20", children: /* @__PURE__ */ jsx(CardTitle, { className: "text-sm font-bold tracking-tight", children: "Today's Check-ins" }) }),
|
|
128
|
+
/* @__PURE__ */ jsx(CardContent, { className: "p-0", children: /* @__PURE__ */ jsxs(PreviewList, { children: [
|
|
129
|
+
/* @__PURE__ */ jsx(
|
|
130
|
+
PreviewListItem,
|
|
131
|
+
{
|
|
132
|
+
icon: /* @__PURE__ */ jsx("div", { className: "w-8 h-8 rounded-full bg-emerald-100 flex items-center justify-center shrink-0", children: /* @__PURE__ */ jsx(CheckSquare, { className: "w-4 h-4 text-emerald-600" }) }),
|
|
133
|
+
title: "Morning Standup",
|
|
134
|
+
subtitle: "9:00 AM",
|
|
135
|
+
meta: /* @__PURE__ */ jsx(Badge, { variant: "secondary", className: "bg-emerald-50 text-emerald-700 hover:bg-emerald-100 shadow-none border-transparent font-semibold text-[10px]", children: "Done" }),
|
|
136
|
+
action: /* @__PURE__ */ jsxs(Button, { size: "sm", variant: "outline", className: "h-7 text-xs shadow-sm bg-background hover:bg-muted", children: [
|
|
137
|
+
/* @__PURE__ */ jsx(Eye, { className: "w-3.5 h-3.5 mr-1.5" }),
|
|
138
|
+
" View"
|
|
139
|
+
] })
|
|
140
|
+
}
|
|
141
|
+
),
|
|
142
|
+
/* @__PURE__ */ jsx(
|
|
143
|
+
PreviewListItem,
|
|
144
|
+
{
|
|
145
|
+
icon: /* @__PURE__ */ jsx("div", { className: "w-8 h-8 rounded-full bg-muted flex items-center justify-center shrink-0", children: /* @__PURE__ */ jsx(Clock, { className: "w-4 h-4 text-muted-foreground" }) }),
|
|
146
|
+
title: "Evening Wrap-up",
|
|
147
|
+
subtitle: "5:00 PM",
|
|
148
|
+
meta: /* @__PURE__ */ jsx(Badge, { variant: "outline", className: "text-muted-foreground shadow-none font-semibold text-[10px]", children: "Pending" }),
|
|
149
|
+
action: /* @__PURE__ */ jsxs(Button, { size: "sm", variant: "outline", className: "h-7 text-xs shadow-sm bg-background hover:bg-muted", children: [
|
|
150
|
+
/* @__PURE__ */ jsx(CheckSquare, { className: "w-3.5 h-3.5 mr-1.5" }),
|
|
151
|
+
" Complete"
|
|
152
|
+
] })
|
|
153
|
+
}
|
|
154
|
+
)
|
|
155
|
+
] }) })
|
|
156
|
+
] });
|
|
157
|
+
}
|
|
158
|
+
export {
|
|
159
|
+
CheckInsCard,
|
|
160
|
+
RecentlyCompletedCard,
|
|
161
|
+
TopTasksCard,
|
|
162
|
+
UpcomingMeetingsCard
|
|
163
|
+
};
|
|
164
|
+
//# sourceMappingURL=dashboard-cards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/dashboard-cards.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { Card, CardHeader, CardTitle, CardContent } from \"./card\"\nimport { Button } from \"./button\"\nimport { Badge } from \"./badge\"\nimport { PreviewList, PreviewListItem } from \"./preview-list\"\nimport { Square, Clock, Video, CheckCircle2, CheckSquare, Eye } from \"lucide-react\"\n\nexport function TopTasksCard({ onViewAll }: { onViewAll?: () => void }) {\n return (\n <Card className=\"rounded-xl border border-border shadow-sm overflow-hidden gap-0 py-0\">\n <CardHeader className=\"flex flex-row items-center justify-between pt-4 pb-3 px-6 border-b border-border bg-muted/20\">\n <CardTitle className=\"text-sm font-bold tracking-tight\">Top Tasks</CardTitle>\n <Button \n variant=\"ghost\" \n size=\"sm\" \n onClick={onViewAll} \n className=\"text-xs h-7 text-brand-purple hover:text-brand-purple/80 hover:bg-brand-purple/10\"\n >\n View all tasks →\n </Button>\n </CardHeader>\n <CardContent className=\"p-0\">\n <PreviewList>\n <PreviewListItem\n icon={<Square className=\"w-4 h-4 text-muted-foreground hover:text-brand-purple transition-colors\" />}\n title=\"Follow up with Lunchclub\"\n subtitle=\"Churn Mitigation\"\n meta={\n <>\n <span className=\"text-[11px] font-medium text-muted-foreground\">Due in 2h</span>\n <Badge variant=\"destructive\" className=\"text-[10px] px-2 py-0 h-4 uppercase tracking-wider rounded-full shadow-none font-bold bg-foreground text-background hover:bg-foreground/90\">Urgent</Badge>\n </>\n }\n onClick={onViewAll}\n />\n <PreviewListItem\n icon={<Square className=\"w-4 h-4 text-muted-foreground hover:text-brand-purple transition-colors\" />}\n title=\"Outbound opportunity: CloudKitchen\"\n subtitle=\"Outbound\"\n meta={<span className=\"text-[11px] font-medium text-muted-foreground\">Due tomorrow</span>}\n onClick={onViewAll}\n />\n <PreviewListItem\n icon={<Square className=\"w-4 h-4 text-muted-foreground hover:text-brand-purple transition-colors\" />}\n title=\"New CFO welcome: Loom\"\n subtitle=\"Relationship\"\n meta={<span className=\"text-[11px] font-medium text-muted-foreground\">Due next week</span>}\n onClick={onViewAll}\n />\n </PreviewList>\n </CardContent>\n </Card>\n )\n}\n\nexport function UpcomingMeetingsCard() {\n return (\n <Card className=\"rounded-xl border border-border shadow-sm overflow-hidden gap-0 py-0\">\n <CardHeader className=\"flex flex-row items-center justify-between pt-4 pb-3 px-6 border-b border-border bg-muted/20\">\n <CardTitle className=\"text-sm font-bold tracking-tight\">Upcoming Meetings</CardTitle>\n <Button variant=\"ghost\" size=\"sm\" className=\"text-xs h-7 text-brand-purple hover:text-brand-purple/80 hover:bg-brand-purple/10\">\n View all meetings →\n </Button>\n </CardHeader>\n <CardContent className=\"p-0\">\n <PreviewList>\n <PreviewListItem\n icon={<Clock className=\"w-4 h-4 text-blue-500\" />}\n title=\"Q3 Review - Acme Corp\"\n subtitle=\"2:00 PM - 3:00 PM\"\n meta={<span className=\"text-[11px] font-medium text-blue-600 bg-blue-50 px-2 py-0.5 rounded-full\">Starts in 10 mins</span>}\n action={\n <Button size=\"sm\" variant=\"outline\" className=\"h-7 text-xs shadow-sm bg-background hover:bg-muted\">\n <Video className=\"w-3.5 h-3.5 mr-1.5\" /> Join\n </Button>\n }\n />\n <PreviewListItem\n icon={<Clock className=\"w-4 h-4 text-blue-500\" />}\n title=\"Initial Sync - Initech\"\n subtitle=\"4:30 PM - 5:00 PM\"\n action={\n <Button size=\"sm\" variant=\"outline\" className=\"h-7 text-xs shadow-sm bg-background hover:bg-muted\">\n <Video className=\"w-3.5 h-3.5 mr-1.5\" /> Join\n </Button>\n }\n />\n </PreviewList>\n </CardContent>\n </Card>\n )\n}\n\nexport function RecentlyCompletedCard() {\n return (\n <Card className=\"rounded-xl border border-border shadow-sm overflow-hidden opacity-80 bg-muted/5 gap-0 py-0\">\n <CardHeader className=\"flex flex-row items-center justify-between pt-4 pb-3 px-6 border-b border-border bg-muted/10\">\n <CardTitle className=\"text-sm font-bold tracking-tight text-muted-foreground\">Recently Completed</CardTitle>\n </CardHeader>\n <CardContent className=\"p-0\">\n <PreviewList>\n <PreviewListItem\n icon={<CheckCircle2 className=\"w-4 h-4 text-emerald-500\" />}\n title={<span className=\"text-muted-foreground font-medium\">Sync - Globex Inc</span>}\n subtitle=\"10:00 AM\"\n action={\n <Button size=\"sm\" variant=\"outline\" className=\"h-7 text-xs shadow-sm bg-background hover:bg-muted\">\n <Eye className=\"w-3.5 h-3.5 mr-1.5\" /> View\n </Button>\n }\n />\n <PreviewListItem\n icon={<CheckCircle2 className=\"w-4 h-4 text-emerald-500\" />}\n title={<span className=\"text-muted-foreground font-medium\">Check-in - Pied Piper</span>}\n subtitle=\"9:00 AM\"\n action={\n <Button size=\"sm\" variant=\"outline\" className=\"h-7 text-xs shadow-sm bg-background hover:bg-muted\">\n <Eye className=\"w-3.5 h-3.5 mr-1.5\" /> View\n </Button>\n }\n />\n </PreviewList>\n </CardContent>\n </Card>\n )\n}\n\nexport function CheckInsCard() {\n return (\n <Card className=\"rounded-xl border border-border shadow-sm overflow-hidden gap-0 py-0\">\n <CardHeader className=\"flex flex-row items-center justify-between pt-4 pb-3 px-6 border-b border-border bg-muted/20\">\n <CardTitle className=\"text-sm font-bold tracking-tight\">Today's Check-ins</CardTitle>\n </CardHeader>\n <CardContent className=\"p-0\">\n <PreviewList>\n <PreviewListItem\n icon={\n <div className=\"w-8 h-8 rounded-full bg-emerald-100 flex items-center justify-center shrink-0\">\n <CheckSquare className=\"w-4 h-4 text-emerald-600\" />\n </div>\n }\n title=\"Morning Standup\"\n subtitle=\"9:00 AM\"\n meta={<Badge variant=\"secondary\" className=\"bg-emerald-50 text-emerald-700 hover:bg-emerald-100 shadow-none border-transparent font-semibold text-[10px]\">Done</Badge>}\n action={\n <Button size=\"sm\" variant=\"outline\" className=\"h-7 text-xs shadow-sm bg-background hover:bg-muted\">\n <Eye className=\"w-3.5 h-3.5 mr-1.5\" /> View\n </Button>\n }\n />\n <PreviewListItem\n icon={\n <div className=\"w-8 h-8 rounded-full bg-muted flex items-center justify-center shrink-0\">\n <Clock className=\"w-4 h-4 text-muted-foreground\" />\n </div>\n }\n title=\"Evening Wrap-up\"\n subtitle=\"5:00 PM\"\n meta={<Badge variant=\"outline\" className=\"text-muted-foreground shadow-none font-semibold text-[10px]\">Pending</Badge>}\n action={\n <Button size=\"sm\" variant=\"outline\" className=\"h-7 text-xs shadow-sm bg-background hover:bg-muted\">\n <CheckSquare className=\"w-3.5 h-3.5 mr-1.5\" /> Complete\n </Button>\n }\n />\n </PreviewList>\n </CardContent>\n </Card>\n )\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { SortingState } from '@tanstack/react-table';
|
|
3
|
+
|
|
4
|
+
interface DataTableDisplayColumn {
|
|
5
|
+
id: string;
|
|
6
|
+
label: string;
|
|
7
|
+
visible: boolean;
|
|
8
|
+
canHide: boolean;
|
|
9
|
+
}
|
|
10
|
+
interface DataTableDisplayProps {
|
|
11
|
+
sorting: SortingState;
|
|
12
|
+
onSortingChange: (next: SortingState) => void;
|
|
13
|
+
columns: DataTableDisplayColumn[];
|
|
14
|
+
onToggleColumn: (columnId: string) => void;
|
|
15
|
+
onReset: () => void;
|
|
16
|
+
}
|
|
17
|
+
declare function DataTableDisplay({ sorting, onSortingChange, columns, onToggleColumn, onReset, }: DataTableDisplayProps): React.JSX.Element;
|
|
18
|
+
|
|
19
|
+
export { DataTableDisplay, type DataTableDisplayColumn };
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
"use client";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { ArrowDown, ArrowUp, ArrowUpDown, LayoutGrid } from "lucide-react";
|
|
6
|
+
import { cn } from "../lib/utils.js";
|
|
7
|
+
import { Button } from "./button.js";
|
|
8
|
+
import {
|
|
9
|
+
DropdownMenu,
|
|
10
|
+
DropdownMenuContent,
|
|
11
|
+
DropdownMenuTrigger
|
|
12
|
+
} from "./dropdown-menu.js";
|
|
13
|
+
import {
|
|
14
|
+
Select,
|
|
15
|
+
SelectContent,
|
|
16
|
+
SelectItem,
|
|
17
|
+
SelectTrigger,
|
|
18
|
+
SelectValue
|
|
19
|
+
} from "./select.js";
|
|
20
|
+
function DataTableDisplay({
|
|
21
|
+
sorting,
|
|
22
|
+
onSortingChange,
|
|
23
|
+
columns,
|
|
24
|
+
onToggleColumn,
|
|
25
|
+
onReset
|
|
26
|
+
}) {
|
|
27
|
+
var _a, _b, _c, _d, _e;
|
|
28
|
+
const sortableColumns = columns;
|
|
29
|
+
const currentSortId = (_d = (_c = (_a = sorting[0]) == null ? void 0 : _a.id) != null ? _c : (_b = sortableColumns[0]) == null ? void 0 : _b.id) != null ? _d : "";
|
|
30
|
+
const isDescending = Boolean((_e = sorting[0]) == null ? void 0 : _e.desc);
|
|
31
|
+
return /* @__PURE__ */ jsxs(DropdownMenu, { children: [
|
|
32
|
+
/* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
33
|
+
Button,
|
|
34
|
+
{
|
|
35
|
+
variant: "outline",
|
|
36
|
+
size: "sm",
|
|
37
|
+
className: "h-8 gap-2 rounded-md border-border/60 bg-background text-xs font-normal shadow-none hover:bg-muted/50",
|
|
38
|
+
children: [
|
|
39
|
+
/* @__PURE__ */ jsx(LayoutGrid, { className: "h-3.5 w-3.5" }),
|
|
40
|
+
"Display"
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
) }),
|
|
44
|
+
/* @__PURE__ */ jsx(DropdownMenuContent, { align: "end", className: "w-[320px] p-4", children: /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
45
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
46
|
+
/* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5 text-xs font-semibold text-foreground", children: [
|
|
47
|
+
/* @__PURE__ */ jsx(ArrowUpDown, { className: "h-3.5 w-3.5" }),
|
|
48
|
+
"Sorting"
|
|
49
|
+
] }),
|
|
50
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
51
|
+
/* @__PURE__ */ jsxs(
|
|
52
|
+
Select,
|
|
53
|
+
{
|
|
54
|
+
value: currentSortId,
|
|
55
|
+
onValueChange: (value) => {
|
|
56
|
+
var _a2, _b2;
|
|
57
|
+
return onSortingChange([{ id: value, desc: (_b2 = (_a2 = sorting[0]) == null ? void 0 : _a2.desc) != null ? _b2 : false }]);
|
|
58
|
+
},
|
|
59
|
+
children: [
|
|
60
|
+
/* @__PURE__ */ jsx(SelectTrigger, { className: "h-8 w-full text-xs", children: /* @__PURE__ */ jsx(SelectValue, { placeholder: "Sort by..." }) }),
|
|
61
|
+
/* @__PURE__ */ jsx(SelectContent, { children: sortableColumns.map((column) => /* @__PURE__ */ jsx(SelectItem, { value: column.id, className: "text-xs", children: column.label }, column.id)) })
|
|
62
|
+
]
|
|
63
|
+
}
|
|
64
|
+
),
|
|
65
|
+
/* @__PURE__ */ jsx(
|
|
66
|
+
Button,
|
|
67
|
+
{
|
|
68
|
+
variant: "outline",
|
|
69
|
+
size: "icon",
|
|
70
|
+
className: "h-8 w-8 shrink-0",
|
|
71
|
+
onClick: () => onSortingChange([{ id: currentSortId, desc: !isDescending }]),
|
|
72
|
+
disabled: !currentSortId,
|
|
73
|
+
children: isDescending ? /* @__PURE__ */ jsx(ArrowDown, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ jsx(ArrowUp, { className: "h-3.5 w-3.5" })
|
|
74
|
+
}
|
|
75
|
+
)
|
|
76
|
+
] })
|
|
77
|
+
] }),
|
|
78
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
79
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs font-medium text-muted-foreground", children: "Display properties" }),
|
|
80
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: columns.map((column) => /* @__PURE__ */ jsx(
|
|
81
|
+
"button",
|
|
82
|
+
{
|
|
83
|
+
disabled: !column.canHide,
|
|
84
|
+
onClick: () => onToggleColumn(column.id),
|
|
85
|
+
className: cn(
|
|
86
|
+
"rounded-md border px-2.5 py-1 text-[11px] font-medium transition-all",
|
|
87
|
+
column.visible ? "border-brand-purple/30 bg-brand-purple/10 text-brand-purple" : "border-border bg-muted/40 text-muted-foreground hover:bg-muted hover:text-foreground",
|
|
88
|
+
!column.canHide && "cursor-not-allowed opacity-50"
|
|
89
|
+
),
|
|
90
|
+
children: column.label
|
|
91
|
+
},
|
|
92
|
+
column.id
|
|
93
|
+
)) })
|
|
94
|
+
] }),
|
|
95
|
+
/* @__PURE__ */ jsx("div", { className: "mt-2 flex items-center justify-start border-t border-border pt-2", children: /* @__PURE__ */ jsx(
|
|
96
|
+
"button",
|
|
97
|
+
{
|
|
98
|
+
className: "text-[10px] font-medium text-muted-foreground transition-colors hover:text-foreground",
|
|
99
|
+
onClick: onReset,
|
|
100
|
+
children: "Reset"
|
|
101
|
+
}
|
|
102
|
+
) })
|
|
103
|
+
] }) })
|
|
104
|
+
] });
|
|
105
|
+
}
|
|
106
|
+
export {
|
|
107
|
+
DataTableDisplay
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=data-table-display.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/data-table-display.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { ArrowDown, ArrowUp, ArrowUpDown, LayoutGrid } from \"lucide-react\"\nimport type { SortingState } from \"@tanstack/react-table\"\n\nimport { cn } from \"../lib/utils\"\nimport { Button } from \"./button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuTrigger,\n} from \"./dropdown-menu\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./select\"\n\nexport interface DataTableDisplayColumn {\n id: string\n label: string\n visible: boolean\n canHide: boolean\n}\n\ninterface DataTableDisplayProps {\n sorting: SortingState\n onSortingChange: (next: SortingState) => void\n columns: DataTableDisplayColumn[]\n onToggleColumn: (columnId: string) => void\n onReset: () => void\n}\n\nexport function DataTableDisplay({\n sorting,\n onSortingChange,\n columns,\n onToggleColumn,\n onReset,\n}: DataTableDisplayProps) {\n const sortableColumns = columns\n const currentSortId = sorting[0]?.id ?? sortableColumns[0]?.id ?? \"\"\n const isDescending = Boolean(sorting[0]?.desc)\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 gap-2 rounded-md border-border/60 bg-background text-xs font-normal shadow-none hover:bg-muted/50\"\n >\n <LayoutGrid className=\"h-3.5 w-3.5\" />\n Display\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-[320px] p-4\">\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <span className=\"flex items-center gap-1.5 text-xs font-semibold text-foreground\">\n <ArrowUpDown className=\"h-3.5 w-3.5\" />\n Sorting\n </span>\n <div className=\"flex items-center gap-2\">\n <Select\n value={currentSortId}\n onValueChange={(value) =>\n onSortingChange([{ id: value, desc: sorting[0]?.desc ?? false }])\n }\n >\n <SelectTrigger className=\"h-8 w-full text-xs\">\n <SelectValue placeholder=\"Sort by...\" />\n </SelectTrigger>\n <SelectContent>\n {sortableColumns.map((column) => (\n <SelectItem key={column.id} value={column.id} className=\"text-xs\">\n {column.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n onClick={() =>\n onSortingChange([{ id: currentSortId, desc: !isDescending }])\n }\n disabled={!currentSortId}\n >\n {isDescending ? (\n <ArrowDown className=\"h-3.5 w-3.5\" />\n ) : (\n <ArrowUp className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n Display properties\n </span>\n <div className=\"flex flex-wrap gap-2\">\n {columns.map((column) => (\n <button\n key={column.id}\n disabled={!column.canHide}\n onClick={() => onToggleColumn(column.id)}\n className={cn(\n \"rounded-md border px-2.5 py-1 text-[11px] font-medium transition-all\",\n column.visible\n ? \"border-brand-purple/30 bg-brand-purple/10 text-brand-purple\"\n : \"border-border bg-muted/40 text-muted-foreground hover:bg-muted hover:text-foreground\",\n !column.canHide && \"cursor-not-allowed opacity-50\"\n )}\n >\n {column.label}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"mt-2 flex items-center justify-start border-t border-border pt-2\">\n <button\n className=\"text-[10px] font-medium text-muted-foreground transition-colors hover:text-foreground\"\n onClick={onReset}\n >\n Reset\n </button>\n </div>\n </div>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n"],"mappings":";AAkDQ,SAKE,KALF;AA/CR,SAAS,WAAW,SAAS,aAAa,kBAAkB;AAG5D,SAAS,UAAU;AACnB,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAiBA,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AA1C1B;AA2CE,QAAM,kBAAkB;AACxB,QAAM,iBAAgB,yBAAQ,CAAC,MAAT,mBAAY,OAAZ,aAAkB,qBAAgB,CAAC,MAAjB,mBAAoB,OAAtC,YAA4C;AAClE,QAAM,eAAe,SAAQ,aAAQ,CAAC,MAAT,mBAAY,IAAI;AAE7C,SACE,qBAAC,gBACC;AAAA,wBAAC,uBAAoB,SAAO,MAC1B;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA,QAEV;AAAA,8BAAC,cAAW,WAAU,eAAc;AAAA,UAAE;AAAA;AAAA;AAAA,IAExC,GACF;AAAA,IACA,oBAAC,uBAAoB,OAAM,OAAM,WAAU,iBACzC,+BAAC,SAAI,WAAU,aACb;AAAA,2BAAC,SAAI,WAAU,aACb;AAAA,6BAAC,UAAK,WAAU,mEACd;AAAA,8BAAC,eAAY,WAAU,eAAc;AAAA,UAAE;AAAA,WAEzC;AAAA,QACA,qBAAC,SAAI,WAAU,2BACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,eAAe,CAAC,UAAO;AArEvC,oBAAAA,KAAAC;AAsEkB,uCAAgB,CAAC,EAAE,IAAI,OAAO,OAAMA,OAAAD,MAAA,QAAQ,CAAC,MAAT,gBAAAA,IAAY,SAAZ,OAAAC,MAAoB,MAAM,CAAC,CAAC;AAAA;AAAA,cAGlE;AAAA,oCAAC,iBAAc,WAAU,sBACvB,8BAAC,eAAY,aAAY,cAAa,GACxC;AAAA,gBACA,oBAAC,iBACE,0BAAgB,IAAI,CAAC,WACpB,oBAAC,cAA2B,OAAO,OAAO,IAAI,WAAU,WACrD,iBAAO,SADO,OAAO,EAExB,CACD,GACH;AAAA;AAAA;AAAA,UACF;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS,MACP,gBAAgB,CAAC,EAAE,IAAI,eAAe,MAAM,CAAC,aAAa,CAAC,CAAC;AAAA,cAE9D,UAAU,CAAC;AAAA,cAEV,yBACC,oBAAC,aAAU,WAAU,eAAc,IAEnC,oBAAC,WAAQ,WAAU,eAAc;AAAA;AAAA,UAErC;AAAA,WACF;AAAA,SACF;AAAA,MAEA,qBAAC,SAAI,WAAU,aACb;AAAA,4BAAC,UAAK,WAAU,6CAA4C,gCAE5D;AAAA,QACA,oBAAC,SAAI,WAAU,wBACZ,kBAAQ,IAAI,CAAC,WACZ;AAAA,UAAC;AAAA;AAAA,YAEC,UAAU,CAAC,OAAO;AAAA,YAClB,SAAS,MAAM,eAAe,OAAO,EAAE;AAAA,YACvC,WAAW;AAAA,cACT;AAAA,cACA,OAAO,UACH,gEACA;AAAA,cACJ,CAAC,OAAO,WAAW;AAAA,YACrB;AAAA,YAEC,iBAAO;AAAA;AAAA,UAXH,OAAO;AAAA,QAYd,CACD,GACH;AAAA,SACF;AAAA,MAEA,oBAAC,SAAI,WAAU,oEACb;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS;AAAA,UACV;AAAA;AAAA,MAED,GACF;AAAA,OACF,GACF;AAAA,KACF;AAEJ;","names":["_a","_b"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
interface DataTableFilterCategory {
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
icon: React.ComponentType<{
|
|
7
|
+
className?: string;
|
|
8
|
+
}>;
|
|
9
|
+
options: string[];
|
|
10
|
+
}
|
|
11
|
+
interface DataTableFilterProps {
|
|
12
|
+
categories: DataTableFilterCategory[];
|
|
13
|
+
selectedFilters: Record<string, string[]>;
|
|
14
|
+
onToggleFilter: (categoryId: string, option: string) => void;
|
|
15
|
+
}
|
|
16
|
+
declare function DataTableFilter({ categories, selectedFilters, onToggleFilter, }: DataTableFilterProps): React.JSX.Element;
|
|
17
|
+
|
|
18
|
+
export { DataTableFilter, type DataTableFilterCategory };
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
"use client";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import * as React from "react";
|
|
6
|
+
import { ListFilter, Search } from "lucide-react";
|
|
7
|
+
import { Button } from "./button.js";
|
|
8
|
+
import {
|
|
9
|
+
DropdownMenu,
|
|
10
|
+
DropdownMenuContent,
|
|
11
|
+
DropdownMenuItem,
|
|
12
|
+
DropdownMenuSub,
|
|
13
|
+
DropdownMenuSubContent,
|
|
14
|
+
DropdownMenuSubTrigger,
|
|
15
|
+
DropdownMenuTrigger
|
|
16
|
+
} from "./dropdown-menu.js";
|
|
17
|
+
function DataTableFilter({
|
|
18
|
+
categories,
|
|
19
|
+
selectedFilters,
|
|
20
|
+
onToggleFilter
|
|
21
|
+
}) {
|
|
22
|
+
const [query, setQuery] = React.useState("");
|
|
23
|
+
const visibleCategories = React.useMemo(() => {
|
|
24
|
+
const normalized = query.trim().toLowerCase();
|
|
25
|
+
if (!normalized) {
|
|
26
|
+
return categories;
|
|
27
|
+
}
|
|
28
|
+
return categories.filter((category) => {
|
|
29
|
+
if (category.label.toLowerCase().includes(normalized)) {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
return category.options.some(
|
|
33
|
+
(option) => option.toLowerCase().includes(normalized)
|
|
34
|
+
);
|
|
35
|
+
});
|
|
36
|
+
}, [categories, query]);
|
|
37
|
+
const activeCount = React.useMemo(
|
|
38
|
+
() => Object.values(selectedFilters).reduce(
|
|
39
|
+
(count, selected) => count + selected.length,
|
|
40
|
+
0
|
|
41
|
+
),
|
|
42
|
+
[selectedFilters]
|
|
43
|
+
);
|
|
44
|
+
return /* @__PURE__ */ jsxs(DropdownMenu, { children: [
|
|
45
|
+
/* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
46
|
+
Button,
|
|
47
|
+
{
|
|
48
|
+
variant: "outline",
|
|
49
|
+
size: "sm",
|
|
50
|
+
className: "h-8 gap-2 rounded-md border-border/60 bg-background text-xs font-normal shadow-none hover:bg-muted/50",
|
|
51
|
+
children: [
|
|
52
|
+
/* @__PURE__ */ jsx(ListFilter, { className: "h-3.5 w-3.5" }),
|
|
53
|
+
"Filter",
|
|
54
|
+
activeCount > 0 ? /* @__PURE__ */ jsx("span", { className: "rounded bg-muted px-1.5 py-0 text-[10px] font-semibold", children: activeCount }) : null
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
) }),
|
|
58
|
+
/* @__PURE__ */ jsxs(DropdownMenuContent, { align: "start", className: "w-[240px] p-0", children: [
|
|
59
|
+
/* @__PURE__ */ jsx("div", { className: "sticky top-0 z-10 border-b border-border bg-popover p-2", children: /* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
60
|
+
/* @__PURE__ */ jsx(Search, { className: "absolute left-2 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground" }),
|
|
61
|
+
/* @__PURE__ */ jsx(
|
|
62
|
+
"input",
|
|
63
|
+
{
|
|
64
|
+
className: "h-8 w-full rounded-md bg-muted/50 py-1 pr-2 pl-7 text-xs outline-none transition-colors placeholder:text-muted-foreground/70 focus:bg-muted",
|
|
65
|
+
placeholder: "Search filters...",
|
|
66
|
+
value: query,
|
|
67
|
+
onChange: (event) => setQuery(event.target.value),
|
|
68
|
+
onClick: (event) => event.stopPropagation(),
|
|
69
|
+
onKeyDown: (event) => event.stopPropagation()
|
|
70
|
+
}
|
|
71
|
+
)
|
|
72
|
+
] }) }),
|
|
73
|
+
/* @__PURE__ */ jsxs("div", { className: "max-h-[320px] overflow-y-auto p-1", children: [
|
|
74
|
+
visibleCategories.map((category) => /* @__PURE__ */ jsxs(DropdownMenuSub, { children: [
|
|
75
|
+
/* @__PURE__ */ jsxs(DropdownMenuSubTrigger, { className: "cursor-pointer py-1.5 text-xs", children: [
|
|
76
|
+
/* @__PURE__ */ jsx(category.icon, { className: "mr-2 h-3.5 w-3.5 text-muted-foreground" }),
|
|
77
|
+
category.label
|
|
78
|
+
] }),
|
|
79
|
+
/* @__PURE__ */ jsx(DropdownMenuSubContent, { className: "w-52 p-1", children: category.options.map((option) => {
|
|
80
|
+
var _a, _b;
|
|
81
|
+
const selected = (_b = (_a = selectedFilters[category.id]) == null ? void 0 : _a.includes(option)) != null ? _b : false;
|
|
82
|
+
return /* @__PURE__ */ jsxs(
|
|
83
|
+
DropdownMenuItem,
|
|
84
|
+
{
|
|
85
|
+
className: "cursor-pointer justify-between text-xs",
|
|
86
|
+
onSelect: (event) => {
|
|
87
|
+
event.preventDefault();
|
|
88
|
+
onToggleFilter(category.id, option);
|
|
89
|
+
},
|
|
90
|
+
children: [
|
|
91
|
+
option,
|
|
92
|
+
selected ? /* @__PURE__ */ jsx("span", { className: "text-[10px] font-semibold text-brand-purple", children: "Applied" }) : null
|
|
93
|
+
]
|
|
94
|
+
},
|
|
95
|
+
option
|
|
96
|
+
);
|
|
97
|
+
}) })
|
|
98
|
+
] }, category.id)),
|
|
99
|
+
visibleCategories.length === 0 ? /* @__PURE__ */ jsx("div", { className: "p-2 text-center text-xs text-muted-foreground", children: "No filters found" }) : null
|
|
100
|
+
] })
|
|
101
|
+
] })
|
|
102
|
+
] });
|
|
103
|
+
}
|
|
104
|
+
export {
|
|
105
|
+
DataTableFilter
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=data-table-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/data-table-filter.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { ListFilter, Search } from \"lucide-react\"\n\nimport { Button } from \"./button\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from \"./dropdown-menu\"\n\nexport interface DataTableFilterCategory {\n id: string\n label: string\n icon: React.ComponentType<{ className?: string }>\n options: string[]\n}\n\ninterface DataTableFilterProps {\n categories: DataTableFilterCategory[]\n selectedFilters: Record<string, string[]>\n onToggleFilter: (categoryId: string, option: string) => void\n}\n\nexport function DataTableFilter({\n categories,\n selectedFilters,\n onToggleFilter,\n}: DataTableFilterProps) {\n const [query, setQuery] = React.useState(\"\")\n\n const visibleCategories = React.useMemo(() => {\n const normalized = query.trim().toLowerCase()\n if (!normalized) {\n return categories\n }\n\n return categories.filter((category) => {\n if (category.label.toLowerCase().includes(normalized)) {\n return true\n }\n\n return category.options.some((option) =>\n option.toLowerCase().includes(normalized)\n )\n })\n }, [categories, query])\n\n const activeCount = React.useMemo(\n () =>\n Object.values(selectedFilters).reduce(\n (count, selected) => count + selected.length,\n 0\n ),\n [selectedFilters]\n )\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 gap-2 rounded-md border-border/60 bg-background text-xs font-normal shadow-none hover:bg-muted/50\"\n >\n <ListFilter className=\"h-3.5 w-3.5\" />\n Filter\n {activeCount > 0 ? (\n <span className=\"rounded bg-muted px-1.5 py-0 text-[10px] font-semibold\">\n {activeCount}\n </span>\n ) : null}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-[240px] p-0\">\n <div className=\"sticky top-0 z-10 border-b border-border bg-popover p-2\">\n <div className=\"relative\">\n <Search className=\"absolute left-2 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <input\n className=\"h-8 w-full rounded-md bg-muted/50 py-1 pr-2 pl-7 text-xs outline-none transition-colors placeholder:text-muted-foreground/70 focus:bg-muted\"\n placeholder=\"Search filters...\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => event.stopPropagation()}\n />\n </div>\n </div>\n\n <div className=\"max-h-[320px] overflow-y-auto p-1\">\n {visibleCategories.map((category) => (\n <DropdownMenuSub key={category.id}>\n <DropdownMenuSubTrigger className=\"cursor-pointer py-1.5 text-xs\">\n <category.icon className=\"mr-2 h-3.5 w-3.5 text-muted-foreground\" />\n {category.label}\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent className=\"w-52 p-1\">\n {category.options.map((option) => {\n const selected =\n selectedFilters[category.id]?.includes(option) ?? false\n\n return (\n <DropdownMenuItem\n key={option}\n className=\"cursor-pointer justify-between text-xs\"\n onSelect={(event) => {\n event.preventDefault()\n onToggleFilter(category.id, option)\n }}\n >\n {option}\n {selected ? (\n <span className=\"text-[10px] font-semibold text-brand-purple\">\n Applied\n </span>\n ) : null}\n </DropdownMenuItem>\n )\n })}\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n ))}\n\n {visibleCategories.length === 0 ? (\n <div className=\"p-2 text-center text-xs text-muted-foreground\">\n No filters found\n </div>\n ) : null}\n </div>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n"],"mappings":";AAiEQ,SAKE,KALF;AA/DR,YAAY,WAAW;AACvB,SAAS,YAAY,cAAc;AAEnC,SAAS,cAAc;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAeA,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,EAAE;AAE3C,QAAM,oBAAoB,MAAM,QAAQ,MAAM;AAC5C,UAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AAEA,WAAO,WAAW,OAAO,CAAC,aAAa;AACrC,UAAI,SAAS,MAAM,YAAY,EAAE,SAAS,UAAU,GAAG;AACrD,eAAO;AAAA,MACT;AAEA,aAAO,SAAS,QAAQ;AAAA,QAAK,CAAC,WAC5B,OAAO,YAAY,EAAE,SAAS,UAAU;AAAA,MAC1C;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,YAAY,KAAK,CAAC;AAEtB,QAAM,cAAc,MAAM;AAAA,IACxB,MACE,OAAO,OAAO,eAAe,EAAE;AAAA,MAC7B,CAAC,OAAO,aAAa,QAAQ,SAAS;AAAA,MACtC;AAAA,IACF;AAAA,IACF,CAAC,eAAe;AAAA,EAClB;AAEA,SACE,qBAAC,gBACC;AAAA,wBAAC,uBAAoB,SAAO,MAC1B;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA,QAEV;AAAA,8BAAC,cAAW,WAAU,eAAc;AAAA,UAAE;AAAA,UAErC,cAAc,IACb,oBAAC,UAAK,WAAU,0DACb,uBACH,IACE;AAAA;AAAA;AAAA,IACN,GACF;AAAA,IACA,qBAAC,uBAAoB,OAAM,SAAQ,WAAU,iBAC3C;AAAA,0BAAC,SAAI,WAAU,2DACb,+BAAC,SAAI,WAAU,YACb;AAAA,4BAAC,UAAO,WAAU,8EAA6E;AAAA,QAC/F;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,aAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU,CAAC,UAAU,SAAS,MAAM,OAAO,KAAK;AAAA,YAChD,SAAS,CAAC,UAAU,MAAM,gBAAgB;AAAA,YAC1C,WAAW,CAAC,UAAU,MAAM,gBAAgB;AAAA;AAAA,QAC9C;AAAA,SACF,GACF;AAAA,MAEA,qBAAC,SAAI,WAAU,qCACZ;AAAA,0BAAkB,IAAI,CAAC,aACtB,qBAAC,mBACC;AAAA,+BAAC,0BAAuB,WAAU,iCAChC;AAAA,gCAAC,SAAS,MAAT,EAAc,WAAU,0CAAyC;AAAA,YACjE,SAAS;AAAA,aACZ;AAAA,UACA,oBAAC,0BAAuB,WAAU,YAC/B,mBAAS,QAAQ,IAAI,CAAC,WAAW;AAtGlD;AAuGkB,kBAAM,YACJ,2BAAgB,SAAS,EAAE,MAA3B,mBAA8B,SAAS,YAAvC,YAAkD;AAEpD,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,WAAU;AAAA,gBACV,UAAU,CAAC,UAAU;AACnB,wBAAM,eAAe;AACrB,iCAAe,SAAS,IAAI,MAAM;AAAA,gBACpC;AAAA,gBAEC;AAAA;AAAA,kBACA,WACC,oBAAC,UAAK,WAAU,+CAA8C,qBAE9D,IACE;AAAA;AAAA;AAAA,cAZC;AAAA,YAaP;AAAA,UAEJ,CAAC,GACH;AAAA,aA5BoB,SAAS,EA6B/B,CACD;AAAA,QAEA,kBAAkB,WAAW,IAC5B,oBAAC,SAAI,WAAU,iDAAgD,8BAE/D,IACE;AAAA,SACN;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
type DataTableQuickViewValue = string | null;
|
|
4
|
+
interface DataTableQuickViewsProps {
|
|
5
|
+
quickViews: string[];
|
|
6
|
+
moreViews: string[];
|
|
7
|
+
activeView: DataTableQuickViewValue;
|
|
8
|
+
onViewChange: (next: DataTableQuickViewValue) => void;
|
|
9
|
+
className?: string;
|
|
10
|
+
}
|
|
11
|
+
declare function DataTableQuickViews({ quickViews, moreViews, activeView, onViewChange, className, }: DataTableQuickViewsProps): React.JSX.Element;
|
|
12
|
+
|
|
13
|
+
export { type DataTableQuickViewValue, DataTableQuickViews };
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
"use client";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { ChevronDown, X } from "lucide-react";
|
|
6
|
+
import { cn } from "../lib/utils.js";
|
|
7
|
+
import {
|
|
8
|
+
DropdownMenu,
|
|
9
|
+
DropdownMenuContent,
|
|
10
|
+
DropdownMenuItem,
|
|
11
|
+
DropdownMenuTrigger
|
|
12
|
+
} from "./dropdown-menu.js";
|
|
13
|
+
function DataTableQuickViews({
|
|
14
|
+
quickViews,
|
|
15
|
+
moreViews,
|
|
16
|
+
activeView,
|
|
17
|
+
onViewChange,
|
|
18
|
+
className
|
|
19
|
+
}) {
|
|
20
|
+
const isMoreActive = Boolean(activeView && moreViews.includes(activeView));
|
|
21
|
+
return /* @__PURE__ */ jsxs(
|
|
22
|
+
"div",
|
|
23
|
+
{
|
|
24
|
+
className: cn(
|
|
25
|
+
"flex items-center gap-2 overflow-x-auto border-b border-border px-4 pb-3 pt-2",
|
|
26
|
+
className
|
|
27
|
+
),
|
|
28
|
+
children: [
|
|
29
|
+
/* @__PURE__ */ jsx("span", { className: "mr-1 shrink-0 text-xs font-medium text-muted-foreground/80", children: "Quick views:" }),
|
|
30
|
+
quickViews.map((view) => {
|
|
31
|
+
const isActive = activeView === view;
|
|
32
|
+
return /* @__PURE__ */ jsx(
|
|
33
|
+
"button",
|
|
34
|
+
{
|
|
35
|
+
onClick: () => onViewChange(isActive ? null : view),
|
|
36
|
+
className: cn(
|
|
37
|
+
"whitespace-nowrap rounded-full border px-3 py-1 text-xs transition-colors",
|
|
38
|
+
isActive ? "border-brand-purple/30 bg-brand-purple/10 font-medium text-brand-purple" : "border-border bg-background text-muted-foreground hover:bg-muted hover:text-foreground"
|
|
39
|
+
),
|
|
40
|
+
children: view
|
|
41
|
+
},
|
|
42
|
+
view
|
|
43
|
+
);
|
|
44
|
+
}),
|
|
45
|
+
/* @__PURE__ */ jsxs(DropdownMenu, { children: [
|
|
46
|
+
/* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
|
|
47
|
+
"button",
|
|
48
|
+
{
|
|
49
|
+
className: cn(
|
|
50
|
+
"flex items-center gap-1 whitespace-nowrap rounded-full border px-3 py-1 text-xs transition-colors",
|
|
51
|
+
isMoreActive ? "border-brand-purple/30 bg-brand-purple/10 font-medium text-brand-purple" : "border-border bg-background text-muted-foreground hover:bg-muted hover:text-foreground"
|
|
52
|
+
),
|
|
53
|
+
children: [
|
|
54
|
+
isMoreActive ? activeView : "More...",
|
|
55
|
+
/* @__PURE__ */ jsx(ChevronDown, { className: "h-3 w-3 opacity-60" })
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
) }),
|
|
59
|
+
/* @__PURE__ */ jsx(DropdownMenuContent, { align: "start", className: "w-56", children: moreViews.map((view) => /* @__PURE__ */ jsx(
|
|
60
|
+
DropdownMenuItem,
|
|
61
|
+
{
|
|
62
|
+
className: cn(
|
|
63
|
+
"cursor-pointer text-xs",
|
|
64
|
+
activeView === view && "bg-brand-purple/5 font-medium text-brand-purple"
|
|
65
|
+
),
|
|
66
|
+
onSelect: () => onViewChange(view),
|
|
67
|
+
children: view
|
|
68
|
+
},
|
|
69
|
+
view
|
|
70
|
+
)) })
|
|
71
|
+
] }),
|
|
72
|
+
activeView ? /* @__PURE__ */ jsxs(
|
|
73
|
+
"button",
|
|
74
|
+
{
|
|
75
|
+
onClick: () => onViewChange(null),
|
|
76
|
+
className: "ml-auto flex items-center gap-1 rounded-md px-2 py-1 text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground",
|
|
77
|
+
children: [
|
|
78
|
+
/* @__PURE__ */ jsx(X, { className: "h-3 w-3" }),
|
|
79
|
+
"Clear"
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
) : null
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
export {
|
|
88
|
+
DataTableQuickViews
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=data-table-quick-views.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/data-table-quick-views.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\nimport { ChevronDown, X } from \"lucide-react\"\n\nimport { cn } from \"../lib/utils\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"./dropdown-menu\"\n\nexport type DataTableQuickViewValue = string | null\n\ninterface DataTableQuickViewsProps {\n quickViews: string[]\n moreViews: string[]\n activeView: DataTableQuickViewValue\n onViewChange: (next: DataTableQuickViewValue) => void\n className?: string\n}\n\nexport function DataTableQuickViews({\n quickViews,\n moreViews,\n activeView,\n onViewChange,\n className,\n}: DataTableQuickViewsProps) {\n const isMoreActive = Boolean(activeView && moreViews.includes(activeView))\n\n return (\n <div\n className={cn(\n \"flex items-center gap-2 overflow-x-auto border-b border-border px-4 pb-3 pt-2\",\n className\n )}\n >\n <span className=\"mr-1 shrink-0 text-xs font-medium text-muted-foreground/80\">\n Quick views:\n </span>\n\n {quickViews.map((view) => {\n const isActive = activeView === view\n return (\n <button\n key={view}\n onClick={() => onViewChange(isActive ? null : view)}\n className={cn(\n \"whitespace-nowrap rounded-full border px-3 py-1 text-xs transition-colors\",\n isActive\n ? \"border-brand-purple/30 bg-brand-purple/10 font-medium text-brand-purple\"\n : \"border-border bg-background text-muted-foreground hover:bg-muted hover:text-foreground\"\n )}\n >\n {view}\n </button>\n )\n })}\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n className={cn(\n \"flex items-center gap-1 whitespace-nowrap rounded-full border px-3 py-1 text-xs transition-colors\",\n isMoreActive\n ? \"border-brand-purple/30 bg-brand-purple/10 font-medium text-brand-purple\"\n : \"border-border bg-background text-muted-foreground hover:bg-muted hover:text-foreground\"\n )}\n >\n {isMoreActive ? activeView : \"More...\"}\n <ChevronDown className=\"h-3 w-3 opacity-60\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-56\">\n {moreViews.map((view) => (\n <DropdownMenuItem\n key={view}\n className={cn(\n \"cursor-pointer text-xs\",\n activeView === view && \"bg-brand-purple/5 font-medium text-brand-purple\"\n )}\n onSelect={() => onViewChange(view)}\n >\n {view}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n\n {activeView ? (\n <button\n onClick={() => onViewChange(null)}\n className=\"ml-auto flex items-center gap-1 rounded-md px-2 py-1 text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <X className=\"h-3 w-3\" />\n Clear\n </button>\n ) : null}\n </div>\n )\n}\n"],"mappings":";AAuCM,cAwBI,YAxBJ;AApCN,SAAS,aAAa,SAAS;AAE/B,SAAS,UAAU;AACnB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAYA,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,eAAe,QAAQ,cAAc,UAAU,SAAS,UAAU,CAAC;AAEzE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MAEA;AAAA,4BAAC,UAAK,WAAU,8DAA6D,0BAE7E;AAAA,QAEC,WAAW,IAAI,CAAC,SAAS;AACxB,gBAAM,WAAW,eAAe;AAChC,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,SAAS,MAAM,aAAa,WAAW,OAAO,IAAI;AAAA,cAClD,WAAW;AAAA,gBACT;AAAA,gBACA,WACI,4EACA;AAAA,cACN;AAAA,cAEC;AAAA;AAAA,YATI;AAAA,UAUP;AAAA,QAEJ,CAAC;AAAA,QAED,qBAAC,gBACC;AAAA,8BAAC,uBAAoB,SAAO,MAC1B;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,eACI,4EACA;AAAA,cACN;AAAA,cAEC;AAAA,+BAAe,aAAa;AAAA,gBAC7B,oBAAC,eAAY,WAAU,sBAAqB;AAAA;AAAA;AAAA,UAC9C,GACF;AAAA,UACA,oBAAC,uBAAoB,OAAM,SAAQ,WAAU,QAC1C,oBAAU,IAAI,CAAC,SACd;AAAA,YAAC;AAAA;AAAA,cAEC,WAAW;AAAA,gBACT;AAAA,gBACA,eAAe,QAAQ;AAAA,cACzB;AAAA,cACA,UAAU,MAAM,aAAa,IAAI;AAAA,cAEhC;AAAA;AAAA,YAPI;AAAA,UAQP,CACD,GACH;AAAA,WACF;AAAA,QAEC,aACC;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,MAAM,aAAa,IAAI;AAAA,YAChC,WAAU;AAAA,YAEV;AAAA,kCAAC,KAAE,WAAU,WAAU;AAAA,cAAE;AAAA;AAAA;AAAA,QAE3B,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;","names":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { SortingState } from '@tanstack/react-table';
|
|
3
|
+
import { DataTableFilterCategory } from './data-table-filter.js';
|
|
4
|
+
import { DataTableDisplayColumn } from './data-table-display.js';
|
|
5
|
+
|
|
6
|
+
interface DataTableToolbarProps {
|
|
7
|
+
categories: DataTableFilterCategory[];
|
|
8
|
+
selectedFilters: Record<string, string[]>;
|
|
9
|
+
onToggleFilter: (categoryId: string, option: string) => void;
|
|
10
|
+
sorting: SortingState;
|
|
11
|
+
onSortingChange: (next: SortingState) => void;
|
|
12
|
+
displayColumns: DataTableDisplayColumn[];
|
|
13
|
+
onToggleColumn: (columnId: string) => void;
|
|
14
|
+
onResetDisplay: () => void;
|
|
15
|
+
}
|
|
16
|
+
declare function DataTableToolbar({ categories, selectedFilters, onToggleFilter, sorting, onSortingChange, displayColumns, onToggleColumn, onResetDisplay, }: DataTableToolbarProps): React.JSX.Element;
|
|
17
|
+
|
|
18
|
+
export { DataTableToolbar };
|