@schandlergarcia/sf-web-components 1.6.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/library/cards/ActionList.d.ts +10 -10
- package/dist/components/library/cards/ActionList.js +2 -3
- package/dist/components/library/cards/ActionList.js.map +1 -1
- package/dist/components/library/cards/ActivityCard.d.ts +18 -5
- package/dist/components/library/cards/ActivityCard.js +3 -4
- package/dist/components/library/cards/ActivityCard.js.map +1 -1
- package/dist/components/library/cards/BaseCard.d.ts +30 -24
- package/dist/components/library/cards/BaseCard.js +2 -3
- package/dist/components/library/cards/BaseCard.js.map +1 -1
- package/dist/components/library/cards/CalloutCard.d.ts +11 -9
- package/dist/components/library/cards/CalloutCard.js +2 -3
- package/dist/components/library/cards/CalloutCard.js.map +1 -1
- package/dist/components/library/cards/ChartCard.d.ts +29 -17
- package/dist/components/library/cards/ChartCard.js +13 -14
- package/dist/components/library/cards/ChartCard.js.map +1 -1
- package/dist/components/library/cards/FeedPanel.d.ts +12 -11
- package/dist/components/library/cards/FeedPanel.js +3 -4
- package/dist/components/library/cards/FeedPanel.js.map +1 -1
- package/dist/components/library/cards/ListCard.d.ts +33 -20
- package/dist/components/library/cards/ListCard.js +35 -35
- package/dist/components/library/cards/ListCard.js.map +1 -1
- package/dist/components/library/cards/MetricCard.d.ts +23 -17
- package/dist/components/library/cards/MetricCard.js +10 -11
- package/dist/components/library/cards/MetricCard.js.map +1 -1
- package/dist/components/library/cards/MetricsStrip.d.ts +11 -11
- package/dist/components/library/cards/MetricsStrip.js +1 -1
- package/dist/components/library/cards/MetricsStrip.js.map +1 -1
- package/dist/components/library/cards/SectionCard.d.ts +17 -12
- package/dist/components/library/cards/SectionCard.js +18 -19
- package/dist/components/library/cards/SectionCard.js.map +1 -1
- package/dist/components/library/cards/SemanticMetricCard.d.ts +15 -20
- package/dist/components/library/cards/SemanticMetricCardWithLoading.d.ts +8 -7
- package/dist/components/library/cards/SemanticTableCard.d.ts +13 -18
- package/dist/components/library/cards/SemanticTableCardWithLoading.d.ts +8 -7
- package/dist/components/library/cards/StatusCard.d.ts +29 -15
- package/dist/components/library/cards/StatusCard.js +16 -17
- package/dist/components/library/cards/StatusCard.js.map +1 -1
- package/dist/components/library/cards/TableCard.d.ts +40 -23
- package/dist/components/library/cards/TableCard.js +59 -59
- package/dist/components/library/cards/TableCard.js.map +1 -1
- package/dist/components/library/cards/WidgetCard.d.ts +19 -11
- package/dist/components/library/cards/WidgetCard.js.map +1 -1
- package/dist/components/library/charts/D3Chart.d.ts +23 -16
- package/dist/components/library/charts/D3Chart.js.map +1 -1
- package/dist/components/library/charts/D3ChartTemplates.d.ts +33 -3
- package/dist/components/library/charts/D3ChartTemplates.js +7 -7
- package/dist/components/library/charts/D3ChartTemplates.js.map +1 -1
- package/dist/components/library/charts/GeoMap.d.ts +81 -18
- package/dist/components/library/charts/GeoMap.js +28 -26
- package/dist/components/library/charts/GeoMap.js.map +1 -1
- package/dist/components/library/filters/FilterBar.d.ts +18 -8
- package/dist/components/library/filters/FilterBar.js +2 -3
- package/dist/components/library/filters/FilterBar.js.map +1 -1
- package/dist/components/library/filters/SearchFilter.d.ts +7 -6
- package/dist/components/library/filters/SearchFilter.js +2 -3
- package/dist/components/library/filters/SearchFilter.js.map +1 -1
- package/dist/components/library/filters/SelectFilter.d.ts +13 -7
- package/dist/components/library/filters/SelectFilter.js +2 -3
- package/dist/components/library/filters/SelectFilter.js.map +1 -1
- package/dist/components/library/filters/ToggleFilter.d.ts +7 -5
- package/dist/components/library/filters/ToggleFilter.js +2 -3
- package/dist/components/library/filters/ToggleFilter.js.map +1 -1
- package/dist/components/library/forms/FormField.d.ts +10 -8
- package/dist/components/library/forms/FormField.js +3 -4
- package/dist/components/library/forms/FormField.js.map +1 -1
- package/dist/components/library/forms/FormModal.d.ts +23 -14
- package/dist/components/library/forms/FormModal.js.map +1 -1
- package/dist/components/library/forms/FormRenderer.d.ts +29 -9
- package/dist/components/library/forms/FormRenderer.js +6 -7
- package/dist/components/library/forms/FormRenderer.js.map +1 -1
- package/dist/components/library/forms/FormSection.d.ts +10 -8
- package/dist/components/library/forms/FormSection.js +2 -3
- package/dist/components/library/forms/FormSection.js.map +1 -1
- package/dist/components/library/forms/index.d.ts +5 -0
- package/dist/components/library/forms/useFormState.d.ts +23 -15
- package/dist/components/library/forms/useFormState.js +53 -47
- package/dist/components/library/forms/useFormState.js.map +1 -1
- package/dist/components/library/heroui/Accordion.d.ts +6 -5
- package/dist/components/library/heroui/Accordion.js +7 -8
- package/dist/components/library/heroui/Accordion.js.map +1 -1
- package/dist/components/library/heroui/Breadcrumbs.d.ts +5 -2
- package/dist/components/library/heroui/Breadcrumbs.js +4 -5
- package/dist/components/library/heroui/Breadcrumbs.js.map +1 -1
- package/dist/components/library/heroui/Collapsible.d.ts +19 -30
- package/dist/components/library/heroui/Collapsible.js +13 -13
- package/dist/components/library/heroui/Collapsible.js.map +1 -1
- package/dist/components/library/heroui/DatePicker.d.ts +24 -52
- package/dist/components/library/heroui/DatePicker.js +5 -6
- package/dist/components/library/heroui/DatePicker.js.map +1 -1
- package/dist/components/library/heroui/Dialog.d.ts +18 -32
- package/dist/components/library/heroui/Dialog.js +6 -7
- package/dist/components/library/heroui/Dialog.js.map +1 -1
- package/dist/components/library/heroui/Drawer.d.ts +6 -2
- package/dist/components/library/heroui/Drawer.js +2 -3
- package/dist/components/library/heroui/Drawer.js.map +1 -1
- package/dist/components/library/heroui/Dropdown.d.ts +6 -2
- package/dist/components/library/heroui/Dropdown.js +2 -3
- package/dist/components/library/heroui/Dropdown.js.map +1 -1
- package/dist/components/library/heroui/Field.d.ts +19 -38
- package/dist/components/library/heroui/Field.js +9 -10
- package/dist/components/library/heroui/Field.js.map +1 -1
- package/dist/components/library/heroui/Meter.d.ts +7 -5
- package/dist/components/library/heroui/Meter.js +4 -5
- package/dist/components/library/heroui/Meter.js.map +1 -1
- package/dist/components/library/heroui/Popover.d.ts +23 -38
- package/dist/components/library/heroui/Popover.js +12 -12
- package/dist/components/library/heroui/Popover.js.map +1 -1
- package/dist/components/library/heroui/Select.d.ts +31 -37
- package/dist/components/library/heroui/Select.js +3 -4
- package/dist/components/library/heroui/Select.js.map +1 -1
- package/dist/components/library/layout/PageContainer.d.ts +6 -4
- package/dist/components/library/layout/PageContainer.js +4 -5
- package/dist/components/library/layout/PageContainer.js.map +1 -1
- package/package.json +4 -1
- package/src/components/library/cards/{ActionList.jsx → ActionList.tsx} +13 -9
- package/src/components/library/cards/{ActivityCard.jsx → ActivityCard.tsx} +33 -4
- package/src/components/library/cards/{BaseCard.jsx → BaseCard.tsx} +33 -6
- package/src/components/library/cards/{CalloutCard.jsx → CalloutCard.tsx} +12 -10
- package/src/components/library/cards/{ChartCard.jsx → ChartCard.tsx} +32 -6
- package/src/components/library/cards/{FeedPanel.jsx → FeedPanel.tsx} +13 -2
- package/src/components/library/cards/{ListCard.jsx → ListCard.tsx} +43 -7
- package/src/components/library/cards/{MetricCard.jsx → MetricCard.tsx} +25 -6
- package/src/components/library/cards/{MetricsStrip.jsx → MetricsStrip.tsx} +22 -12
- package/src/components/library/cards/{SectionCard.jsx → SectionCard.tsx} +27 -8
- package/src/components/library/cards/{SemanticMetricCard.jsx → SemanticMetricCard.tsx} +17 -5
- package/src/components/library/cards/{SemanticMetricCardWithLoading.jsx → SemanticMetricCardWithLoading.tsx} +9 -3
- package/src/components/library/cards/{SemanticTableCard.jsx → SemanticTableCard.tsx} +14 -3
- package/src/components/library/cards/{SemanticTableCardWithLoading.jsx → SemanticTableCardWithLoading.tsx} +9 -5
- package/src/components/library/cards/{StatusCard.jsx → StatusCard.tsx} +61 -12
- package/src/components/library/cards/{TableCard.jsx → TableCard.tsx} +51 -12
- package/src/components/library/cards/{WidgetCard.jsx → WidgetCard.tsx} +28 -5
- package/src/components/library/charts/{D3Chart.jsx → D3Chart.tsx} +27 -7
- package/src/components/library/charts/{D3ChartTemplates.jsx → D3ChartTemplates.tsx} +60 -28
- package/src/components/library/charts/{GeoMap.jsx → GeoMap.tsx} +106 -17
- package/src/components/library/filters/{FilterBar.jsx → FilterBar.tsx} +21 -11
- package/src/components/library/filters/{SearchFilter.jsx → SearchFilter.tsx} +8 -2
- package/src/components/library/filters/{SelectFilter.jsx → SelectFilter.tsx} +15 -8
- package/src/components/library/filters/{ToggleFilter.jsx → ToggleFilter.tsx} +7 -6
- package/src/components/library/forms/{FormField.jsx → FormField.tsx} +91 -45
- package/src/components/library/forms/{FormModal.jsx → FormModal.tsx} +21 -20
- package/src/components/library/forms/{FormRenderer.jsx → FormRenderer.tsx} +32 -10
- package/src/components/library/forms/{FormSection.jsx → FormSection.tsx} +13 -7
- package/src/components/library/forms/index.tsx +11 -0
- package/src/components/library/forms/{useFormState.jsx → useFormState.tsx} +43 -23
- package/src/components/library/heroui/{Accordion.jsx → Accordion.tsx} +8 -3
- package/src/components/library/heroui/{Breadcrumbs.jsx → Breadcrumbs.tsx} +5 -2
- package/src/components/library/heroui/Collapsible.tsx +62 -0
- package/src/components/library/heroui/{DatePicker.jsx → DatePicker.tsx} +28 -4
- package/src/components/library/heroui/Dialog.tsx +43 -0
- package/src/components/library/heroui/{Drawer.jsx → Drawer.tsx} +6 -2
- package/src/components/library/heroui/{Dropdown.jsx → Dropdown.tsx} +6 -2
- package/src/components/library/heroui/{Field.jsx → Field.tsx} +23 -6
- package/src/components/library/heroui/Meter.tsx +13 -0
- package/src/components/library/heroui/{Popover.jsx → Popover.tsx} +29 -8
- package/src/components/library/heroui/Select.tsx +73 -0
- package/src/components/library/layout/{PageContainer.jsx → PageContainer.tsx} +6 -3
- package/src/components/library/forms/index.jsx +0 -5
- package/src/components/library/heroui/Collapsible.jsx +0 -42
- package/src/components/library/heroui/Dialog.jsx +0 -37
- package/src/components/library/heroui/Meter.jsx +0 -8
- package/src/components/library/heroui/Select.jsx +0 -37
- /package/src/components/library/filters/{index.jsx → index.ts} +0 -0
|
@@ -1,18 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
semanticId:
|
|
4
|
-
dataOverride
|
|
5
|
-
columnsOverride
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
isDark: any;
|
|
15
|
-
simulateInitialLoad: any;
|
|
16
|
-
minInitialDelayMs: any;
|
|
17
|
-
maxInitialDelayMs: any;
|
|
18
|
-
}): import("react/jsx-runtime").JSX.Element;
|
|
1
|
+
import { TableCardProps, TableColumn } from "./TableCard";
|
|
2
|
+
export interface SemanticTableCardProps extends Omit<TableCardProps, "data" | "columns"> {
|
|
3
|
+
semanticId: string;
|
|
4
|
+
dataOverride?: unknown[];
|
|
5
|
+
columnsOverride?: TableColumn[];
|
|
6
|
+
compact?: boolean;
|
|
7
|
+
striped?: boolean;
|
|
8
|
+
isDark?: boolean;
|
|
9
|
+
simulateInitialLoad?: boolean;
|
|
10
|
+
minInitialDelayMs?: number;
|
|
11
|
+
maxInitialDelayMs?: number;
|
|
12
|
+
}
|
|
13
|
+
export default function SemanticTableCard({ semanticId, dataOverride, columnsOverride, title, subtitle, searchable, sortable, paginated, pageSize, compact, striped, isDark, simulateInitialLoad, minInitialDelayMs, maxInitialDelayMs, ...rest }: SemanticTableCardProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
simulateInitialLoad?: boolean
|
|
4
|
-
minInitialDelayMs?: number
|
|
5
|
-
maxInitialDelayMs?: number
|
|
6
|
-
loading
|
|
7
|
-
}
|
|
1
|
+
import { SemanticTableCardProps } from "./SemanticTableCard";
|
|
2
|
+
export interface SemanticTableCardWithLoadingProps extends SemanticTableCardProps {
|
|
3
|
+
simulateInitialLoad?: boolean;
|
|
4
|
+
minInitialDelayMs?: number;
|
|
5
|
+
maxInitialDelayMs?: number;
|
|
6
|
+
loading?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export default function SemanticTableCardWithLoading({ simulateInitialLoad, minInitialDelayMs, maxInitialDelayMs, loading: loadingProp, ...props }: SemanticTableCardWithLoadingProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,15 +1,29 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { BaseCardProps } from "./BaseCard";
|
|
3
|
+
type Layout = "list" | "grid" | "timeline";
|
|
4
|
+
export interface StatusItem {
|
|
5
|
+
id?: string | number;
|
|
6
|
+
title?: string;
|
|
7
|
+
name?: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
status?: string;
|
|
10
|
+
timestamp?: string | Date;
|
|
11
|
+
value?: string | number;
|
|
12
|
+
unit?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface StatusCardProps extends Omit<BaseCardProps, "variant" | "header" | "body"> {
|
|
15
|
+
title?: string;
|
|
16
|
+
subtitle?: string;
|
|
17
|
+
status?: string;
|
|
18
|
+
items?: StatusItem[];
|
|
19
|
+
layout?: Layout;
|
|
20
|
+
showProgress?: boolean;
|
|
21
|
+
showTimestamp?: boolean;
|
|
22
|
+
actions?: React.ReactNode;
|
|
23
|
+
loading?: boolean;
|
|
24
|
+
error?: string | Error;
|
|
25
|
+
emptyMessage?: string;
|
|
26
|
+
maxBodyHeight?: string | number;
|
|
27
|
+
}
|
|
28
|
+
export default function StatusCard({ title, subtitle, status, items, layout, showProgress, showTimestamp, actions, loading, error, emptyMessage, maxBodyHeight, ...cardProps }: StatusCardProps): import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
export {};
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { jsx as e, jsxs as l } from "react/jsx-runtime";
|
|
2
|
-
import "react";
|
|
3
2
|
import w from "./BaseCard.js";
|
|
4
3
|
import y from "../ui/Text.js";
|
|
5
|
-
const
|
|
4
|
+
const x = {
|
|
6
5
|
operational: {
|
|
7
6
|
label: "Operational",
|
|
8
7
|
dot: "bg-emerald-500",
|
|
@@ -26,7 +25,7 @@ const g = {
|
|
|
26
25
|
};
|
|
27
26
|
function h(t) {
|
|
28
27
|
const a = String(t ?? "operational").toLowerCase();
|
|
29
|
-
return a === "ok" || a === "healthy" || a === "up" ? "operational" : a === "warn" || a === "warning" || a === "partial" ? "degraded" : a === "down" || a === "critical" ? "outage" :
|
|
28
|
+
return a === "ok" || a === "healthy" || a === "up" ? "operational" : a === "warn" || a === "warning" || a === "partial" ? "degraded" : a === "down" || a === "critical" ? "outage" : x[a] ? a : "operational";
|
|
30
29
|
}
|
|
31
30
|
function I(t) {
|
|
32
31
|
if (!t) return "";
|
|
@@ -38,13 +37,13 @@ function I(t) {
|
|
|
38
37
|
}
|
|
39
38
|
}
|
|
40
39
|
function S({ status: t }) {
|
|
41
|
-
const a = h(t), r =
|
|
40
|
+
const a = h(t), r = x[a];
|
|
42
41
|
return /* @__PURE__ */ l("span", { className: ["inline-flex items-center gap-2 rounded-full px-2.5 py-1 text-xs font-semibold", r.chip].join(" "), children: [
|
|
43
42
|
/* @__PURE__ */ e("span", { className: ["h-2 w-2 rounded-full", r.dot].join(" "), "aria-hidden": "true" }),
|
|
44
43
|
r.label
|
|
45
44
|
] });
|
|
46
45
|
}
|
|
47
|
-
function
|
|
46
|
+
function g({ item: t, showTimestamp: a }) {
|
|
48
47
|
const r = t?.title ?? t?.name ?? "Item", s = t?.description, i = t?.value, o = t?.unit, d = t?.timestamp, c = t?.status;
|
|
49
48
|
return /* @__PURE__ */ l("div", { className: "flex items-start justify-between gap-3 rounded-xl border border-slate-200 bg-white p-3 dark:border-slate-800 dark:bg-slate-900", children: [
|
|
50
49
|
/* @__PURE__ */ l("div", { className: "min-w-0", children: [
|
|
@@ -65,15 +64,15 @@ function M({ items: t, showTimestamp: a }) {
|
|
|
65
64
|
return /* @__PURE__ */ l("div", { className: "relative mt-4", children: [
|
|
66
65
|
/* @__PURE__ */ e("div", { className: "absolute left-3 top-0 h-full w-px bg-slate-200 dark:bg-slate-800", "aria-hidden": "true" }),
|
|
67
66
|
/* @__PURE__ */ e("div", { className: "space-y-3", children: t.map((r, s) => {
|
|
68
|
-
const i = r?.id ?? s, o = r?.status, d =
|
|
67
|
+
const i = r?.id ?? s, o = r?.status, d = x[h(o)];
|
|
69
68
|
return /* @__PURE__ */ l("div", { className: "relative pl-8", children: [
|
|
70
69
|
/* @__PURE__ */ e("div", { className: ["absolute left-[9px] top-3 h-2.5 w-2.5 rounded-full", d.dot].join(" "), "aria-hidden": "true" }),
|
|
71
|
-
/* @__PURE__ */ e(
|
|
70
|
+
/* @__PURE__ */ e(g, { item: r, showTimestamp: a })
|
|
72
71
|
] }, i);
|
|
73
72
|
}) })
|
|
74
73
|
] });
|
|
75
74
|
}
|
|
76
|
-
function
|
|
75
|
+
function _({
|
|
77
76
|
title: t,
|
|
78
77
|
subtitle: a,
|
|
79
78
|
status: r = "operational",
|
|
@@ -83,9 +82,9 @@ function E({
|
|
|
83
82
|
showTimestamp: d = !0,
|
|
84
83
|
actions: c,
|
|
85
84
|
loading: j = !1,
|
|
86
|
-
error:
|
|
85
|
+
error: p,
|
|
87
86
|
emptyMessage: C = "No status items.",
|
|
88
|
-
maxBodyHeight:
|
|
87
|
+
maxBodyHeight: u,
|
|
89
88
|
...f
|
|
90
89
|
}) {
|
|
91
90
|
const T = h(r), v = /* @__PURE__ */ l("div", { className: "flex items-start justify-between gap-3", children: [
|
|
@@ -98,26 +97,26 @@ function E({
|
|
|
98
97
|
c ? /* @__PURE__ */ e("div", { className: "ml-1", children: c }) : null
|
|
99
98
|
] })
|
|
100
99
|
] });
|
|
101
|
-
if (
|
|
100
|
+
if (p)
|
|
102
101
|
return /* @__PURE__ */ e(
|
|
103
102
|
w,
|
|
104
103
|
{
|
|
105
104
|
variant: "status",
|
|
106
105
|
header: v,
|
|
107
|
-
body: /* @__PURE__ */ e("div", { className: "mt-4 rounded-xl border border-rose-200 bg-rose-50 p-4 text-sm text-rose-900 dark:border-rose-900/40 dark:bg-rose-950/30 dark:text-rose-100", children: String(
|
|
106
|
+
body: /* @__PURE__ */ e("div", { className: "mt-4 rounded-xl border border-rose-200 bg-rose-50 p-4 text-sm text-rose-900 dark:border-rose-900/40 dark:bg-rose-950/30 dark:text-rose-100", children: String(p) }),
|
|
108
107
|
...f
|
|
109
108
|
}
|
|
110
109
|
);
|
|
111
|
-
const
|
|
110
|
+
const b = s.length, N = s.filter((n) => h(n?.status) === "operational").length, k = b > 0 ? Math.round(N / b * 100) : 100, z = u ? { maxHeight: typeof u == "number" ? `${u}px` : u, overflowY: "auto" } : {}, A = j ? /* @__PURE__ */ e("div", { className: "space-y-3", children: Array.from({ length: 3 }).map((n, m) => /* @__PURE__ */ l("div", { className: "flex items-center gap-3 rounded-xl border border-slate-200 bg-white p-3 dark:border-slate-800 dark:bg-slate-900", children: [
|
|
112
111
|
/* @__PURE__ */ e("div", { className: "h-4 w-1/4 animate-pulse rounded bg-slate-200 dark:bg-slate-800" }),
|
|
113
112
|
/* @__PURE__ */ e("div", { className: "h-4 w-1/3 animate-pulse rounded bg-slate-200 dark:bg-slate-800" })
|
|
114
|
-
] }, m)) }) : s.length === 0 ? /* @__PURE__ */ e("div", { className: "rounded-xl border border-dashed border-slate-300 bg-slate-50 p-6 text-center text-sm text-slate-600 dark:border-slate-700 dark:bg-slate-950/30 dark:text-slate-300", children: C }) : i === "grid" ? /* @__PURE__ */ e("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: s.map((n, m) => /* @__PURE__ */ e(
|
|
115
|
-
o &&
|
|
113
|
+
] }, m)) }) : s.length === 0 ? /* @__PURE__ */ e("div", { className: "rounded-xl border border-dashed border-slate-300 bg-slate-50 p-6 text-center text-sm text-slate-600 dark:border-slate-700 dark:bg-slate-950/30 dark:text-slate-300", children: C }) : i === "grid" ? /* @__PURE__ */ e("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: s.map((n, m) => /* @__PURE__ */ e(g, { item: n, showTimestamp: d }, n?.id ?? m)) }) : i === "timeline" ? /* @__PURE__ */ e(M, { items: s, showTimestamp: d }) : /* @__PURE__ */ e("div", { className: "space-y-3", children: s.map((n, m) => /* @__PURE__ */ e(g, { item: n, showTimestamp: d }, n?.id ?? m)) }), D = /* @__PURE__ */ l("div", { className: "mt-4", children: [
|
|
114
|
+
o && b > 0 ? /* @__PURE__ */ l("div", { className: "mb-4", children: [
|
|
116
115
|
/* @__PURE__ */ l("div", { className: "flex items-center justify-between text-xs text-slate-600 dark:text-slate-300", children: [
|
|
117
116
|
/* @__PURE__ */ l("span", { children: [
|
|
118
117
|
N,
|
|
119
118
|
" / ",
|
|
120
|
-
|
|
119
|
+
b,
|
|
121
120
|
" operational"
|
|
122
121
|
] }),
|
|
123
122
|
/* @__PURE__ */ l("span", { children: [
|
|
@@ -132,6 +131,6 @@ function E({
|
|
|
132
131
|
return /* @__PURE__ */ e(w, { variant: "status", header: v, body: D, ...f });
|
|
133
132
|
}
|
|
134
133
|
export {
|
|
135
|
-
|
|
134
|
+
_ as default
|
|
136
135
|
};
|
|
137
136
|
//# sourceMappingURL=StatusCard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusCard.js","sources":["../../../../src/components/library/cards/StatusCard.jsx"],"sourcesContent":["import React from \"react\";\nimport BaseCard from \"./BaseCard\";\nimport UIText from \"../ui/Text\";\n\nconst STATUS_META = {\n operational: {\n label: \"Operational\",\n dot: \"bg-emerald-500\",\n chip: \"bg-emerald-100 text-emerald-900 dark:bg-emerald-950/30 dark:text-emerald-200\"\n },\n degraded: {\n label: \"Degraded\",\n dot: \"bg-amber-500\",\n chip: \"bg-amber-100 text-amber-900 dark:bg-amber-950/30 dark:text-amber-200\"\n },\n outage: {\n label: \"Outage\",\n dot: \"bg-rose-500\",\n chip: \"bg-rose-100 text-rose-900 dark:bg-rose-950/30 dark:text-rose-200\"\n },\n maintenance: {\n label: \"Maintenance\",\n dot: \"bg-slate-500\",\n chip: \"bg-slate-100 text-slate-900 dark:bg-slate-800 dark:text-slate-100\"\n }\n};\n\nfunction normalizeStatus(status) {\n const s = String(status ?? \"operational\").toLowerCase();\n if (s === \"ok\" || s === \"healthy\" || s === \"up\") return \"operational\";\n if (s === \"warn\" || s === \"warning\" || s === \"partial\") return \"degraded\";\n if (s === \"down\" || s === \"critical\") return \"outage\";\n return STATUS_META[s] ? s : \"operational\";\n}\n\nfunction formatTimestamp(ts) {\n if (!ts) return \"\";\n try {\n const d = ts instanceof Date ? ts : new Date(ts);\n if (Number.isNaN(d.getTime())) return String(ts);\n return d.toLocaleString(undefined, { dateStyle: \"medium\", timeStyle: \"short\" });\n } catch {\n return String(ts);\n }\n}\n\nfunction StatusChip({ status }) {\n const key = normalizeStatus(status);\n const meta = STATUS_META[key];\n return (\n <span className={[\"inline-flex items-center gap-2 rounded-full px-2.5 py-1 text-xs font-semibold\", meta.chip].join(\" \")}>\n <span className={[\"h-2 w-2 rounded-full\", meta.dot].join(\" \")} aria-hidden=\"true\" />\n {meta.label}\n </span>\n );\n}\n\nfunction ItemRow({ item, showTimestamp }) {\n const name = item?.title ?? item?.name ?? \"Item\";\n const desc = item?.description;\n const value = item?.value;\n const unit = item?.unit;\n const ts = item?.timestamp;\n const status = item?.status;\n\n return (\n <div className=\"flex items-start justify-between gap-3 rounded-xl border border-slate-200 bg-white p-3 dark:border-slate-800 dark:bg-slate-900\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <div className=\"truncate text-sm font-semibold text-slate-900 dark:text-slate-50\">{name}</div>\n {status ? <StatusChip status={status} /> : null}\n </div>\n {desc ? (\n <div className=\"mt-1 text-sm text-slate-600 dark:text-slate-300\">{desc}</div>\n ) : null}\n {showTimestamp && ts ? (\n <div className=\"mt-1 text-xs text-slate-500 dark:text-slate-400\">{formatTimestamp(ts)}</div>\n ) : null}\n </div>\n {value != null ? (\n <div className=\"shrink-0 text-right\">\n <div className=\"text-sm font-semibold text-slate-900 dark:text-slate-50\">\n {String(value)}\n {unit ? <span className=\"ml-1 text-xs font-medium text-slate-500 dark:text-slate-400\">{unit}</span> : null}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction Timeline({ items, showTimestamp }) {\n return (\n <div className=\"relative mt-4\">\n <div className=\"absolute left-3 top-0 h-full w-px bg-slate-200 dark:bg-slate-800\" aria-hidden=\"true\" />\n <div className=\"space-y-3\">\n {items.map((item, idx) => {\n const key = item?.id ?? idx;\n const status = item?.status;\n const meta = STATUS_META[normalizeStatus(status)];\n return (\n <div key={key} className=\"relative pl-8\">\n <div className={[\"absolute left-[9px] top-3 h-2.5 w-2.5 rounded-full\", meta.dot].join(\" \")} aria-hidden=\"true\" />\n <ItemRow item={item} showTimestamp={showTimestamp} />\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport default function StatusCard({\n title,\n subtitle,\n status = \"operational\",\n items = [],\n layout = \"list\",\n showProgress = false,\n showTimestamp = true,\n actions,\n loading = false,\n error,\n emptyMessage = \"No status items.\",\n maxBodyHeight,\n ...cardProps\n}) {\n const overall = normalizeStatus(status);\n const header = (\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n {title ? (\n <UIText as=\"div\" size=\"sm\" weight=\"medium\">\n {title}\n </UIText>\n ) : null}\n {subtitle ? (\n <UIText as=\"div\" size=\"xs\" muted className=\"mt-1\">\n {subtitle}\n </UIText>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\n <StatusChip status={overall} />\n {actions ? <div className=\"ml-1\">{actions}</div> : null}\n </div>\n </div>\n );\n\n if (error) {\n return (\n <BaseCard\n variant=\"status\"\n header={header}\n body={\n <div className=\"mt-4 rounded-xl border border-rose-200 bg-rose-50 p-4 text-sm text-rose-900 dark:border-rose-900/40 dark:bg-rose-950/30 dark:text-rose-100\">\n {String(error)}\n </div>\n }\n {...cardProps}\n />\n );\n }\n\n const total = items.length;\n const okCount = items.filter((it) => normalizeStatus(it?.status) === \"operational\").length;\n const percentOk = total > 0 ? Math.round((okCount / total) * 100) : 100;\n\n const scrollStyle = maxBodyHeight ? { maxHeight: maxBodyHeight, overflowY: \"auto\" } : {};\n\n const itemsContent = loading ? (\n <div className=\"space-y-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-3 rounded-xl border border-slate-200 bg-white p-3 dark:border-slate-800 dark:bg-slate-900\">\n <div className=\"h-4 w-1/4 animate-pulse rounded bg-slate-200 dark:bg-slate-800\" />\n <div className=\"h-4 w-1/3 animate-pulse rounded bg-slate-200 dark:bg-slate-800\" />\n </div>\n ))}\n </div>\n ) : items.length === 0 ? (\n <div className=\"rounded-xl border border-dashed border-slate-300 bg-slate-50 p-6 text-center text-sm text-slate-600 dark:border-slate-700 dark:bg-slate-950/30 dark:text-slate-300\">\n {emptyMessage}\n </div>\n ) : layout === \"grid\" ? (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {items.map((it, idx) => (\n <ItemRow key={it?.id ?? idx} item={it} showTimestamp={showTimestamp} />\n ))}\n </div>\n ) : layout === \"timeline\" ? (\n <Timeline items={items} showTimestamp={showTimestamp} />\n ) : (\n <div className=\"space-y-3\">\n {items.map((it, idx) => (\n <ItemRow key={it?.id ?? idx} item={it} showTimestamp={showTimestamp} />\n ))}\n </div>\n );\n\n const body = (\n <div className=\"mt-4\">\n {showProgress && total > 0 ? (\n <div className=\"mb-4\">\n <div className=\"flex items-center justify-between text-xs text-slate-600 dark:text-slate-300\">\n <span>{okCount} / {total} operational</span>\n <span>{percentOk}%</span>\n </div>\n <div className=\"mt-2 h-2 w-full overflow-hidden rounded-full bg-slate-200 dark:bg-slate-800\">\n <div className=\"h-full bg-emerald-500\" style={{ width: `${percentOk}%` }} />\n </div>\n </div>\n ) : null}\n <div style={scrollStyle}>{itemsContent}</div>\n </div>\n );\n\n return <BaseCard variant=\"status\" header={header} body={body} {...cardProps} />;\n}\n\n\n"],"names":["STATUS_META","normalizeStatus","status","s","formatTimestamp","ts","d","StatusChip","key","meta","jsxs","jsx","ItemRow","item","showTimestamp","name","desc","value","unit","Timeline","items","idx","StatusCard","title","subtitle","layout","showProgress","actions","loading","error","emptyMessage","maxBodyHeight","cardProps","overall","header","UIText","BaseCard","total","okCount","it","percentOk","scrollStyle","itemsContent","_","i","body"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"StatusCard.js","sources":["../../../../src/components/library/cards/StatusCard.tsx"],"sourcesContent":["import React from \"react\";\nimport BaseCard, { BaseCardProps } from \"./BaseCard\";\nimport UIText from \"../ui/Text\";\n\ntype Status = \"operational\" | \"degraded\" | \"outage\" | \"maintenance\";\ntype Layout = \"list\" | \"grid\" | \"timeline\";\n\ninterface StatusMeta {\n label: string;\n dot: string;\n chip: string;\n}\n\nconst STATUS_META: Record<Status, StatusMeta> = {\n operational: {\n label: \"Operational\",\n dot: \"bg-emerald-500\",\n chip: \"bg-emerald-100 text-emerald-900 dark:bg-emerald-950/30 dark:text-emerald-200\"\n },\n degraded: {\n label: \"Degraded\",\n dot: \"bg-amber-500\",\n chip: \"bg-amber-100 text-amber-900 dark:bg-amber-950/30 dark:text-amber-200\"\n },\n outage: {\n label: \"Outage\",\n dot: \"bg-rose-500\",\n chip: \"bg-rose-100 text-rose-900 dark:bg-rose-950/30 dark:text-rose-200\"\n },\n maintenance: {\n label: \"Maintenance\",\n dot: \"bg-slate-500\",\n chip: \"bg-slate-100 text-slate-900 dark:bg-slate-800 dark:text-slate-100\"\n }\n};\n\nfunction normalizeStatus(status: string | undefined): Status {\n const s = String(status ?? \"operational\").toLowerCase();\n if (s === \"ok\" || s === \"healthy\" || s === \"up\") return \"operational\";\n if (s === \"warn\" || s === \"warning\" || s === \"partial\") return \"degraded\";\n if (s === \"down\" || s === \"critical\") return \"outage\";\n return STATUS_META[s as Status] ? (s as Status) : \"operational\";\n}\n\nfunction formatTimestamp(ts: string | Date | undefined): string {\n if (!ts) return \"\";\n try {\n const d = ts instanceof Date ? ts : new Date(ts);\n if (Number.isNaN(d.getTime())) return String(ts);\n return d.toLocaleString(undefined, { dateStyle: \"medium\", timeStyle: \"short\" });\n } catch {\n return String(ts);\n }\n}\n\ninterface StatusChipProps {\n status: string | undefined;\n}\n\nfunction StatusChip({ status }: StatusChipProps) {\n const key = normalizeStatus(status);\n const meta = STATUS_META[key];\n return (\n <span className={[\"inline-flex items-center gap-2 rounded-full px-2.5 py-1 text-xs font-semibold\", meta.chip].join(\" \")}>\n <span className={[\"h-2 w-2 rounded-full\", meta.dot].join(\" \")} aria-hidden=\"true\" />\n {meta.label}\n </span>\n );\n}\n\nexport interface StatusItem {\n id?: string | number;\n title?: string;\n name?: string;\n description?: string;\n status?: string;\n timestamp?: string | Date;\n value?: string | number;\n unit?: string;\n}\n\ninterface ItemRowProps {\n item: StatusItem;\n showTimestamp: boolean;\n}\n\nfunction ItemRow({ item, showTimestamp }: ItemRowProps) {\n const name = item?.title ?? item?.name ?? \"Item\";\n const desc = item?.description;\n const value = item?.value;\n const unit = item?.unit;\n const ts = item?.timestamp;\n const status = item?.status;\n\n return (\n <div className=\"flex items-start justify-between gap-3 rounded-xl border border-slate-200 bg-white p-3 dark:border-slate-800 dark:bg-slate-900\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <div className=\"truncate text-sm font-semibold text-slate-900 dark:text-slate-50\">{name}</div>\n {status ? <StatusChip status={status} /> : null}\n </div>\n {desc ? (\n <div className=\"mt-1 text-sm text-slate-600 dark:text-slate-300\">{desc}</div>\n ) : null}\n {showTimestamp && ts ? (\n <div className=\"mt-1 text-xs text-slate-500 dark:text-slate-400\">{formatTimestamp(ts)}</div>\n ) : null}\n </div>\n {value != null ? (\n <div className=\"shrink-0 text-right\">\n <div className=\"text-sm font-semibold text-slate-900 dark:text-slate-50\">\n {String(value)}\n {unit ? <span className=\"ml-1 text-xs font-medium text-slate-500 dark:text-slate-400\">{unit}</span> : null}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\ninterface TimelineProps {\n items: StatusItem[];\n showTimestamp: boolean;\n}\n\nfunction Timeline({ items, showTimestamp }: TimelineProps) {\n return (\n <div className=\"relative mt-4\">\n <div className=\"absolute left-3 top-0 h-full w-px bg-slate-200 dark:bg-slate-800\" aria-hidden=\"true\" />\n <div className=\"space-y-3\">\n {items.map((item, idx) => {\n const key = item?.id ?? idx;\n const status = item?.status;\n const meta = STATUS_META[normalizeStatus(status)];\n return (\n <div key={key} className=\"relative pl-8\">\n <div className={[\"absolute left-[9px] top-3 h-2.5 w-2.5 rounded-full\", meta.dot].join(\" \")} aria-hidden=\"true\" />\n <ItemRow item={item} showTimestamp={showTimestamp} />\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport interface StatusCardProps extends Omit<BaseCardProps, \"variant\" | \"header\" | \"body\"> {\n title?: string;\n subtitle?: string;\n status?: string;\n items?: StatusItem[];\n layout?: Layout;\n showProgress?: boolean;\n showTimestamp?: boolean;\n actions?: React.ReactNode;\n loading?: boolean;\n error?: string | Error;\n emptyMessage?: string;\n maxBodyHeight?: string | number;\n}\n\nexport default function StatusCard({\n title,\n subtitle,\n status = \"operational\",\n items = [],\n layout = \"list\",\n showProgress = false,\n showTimestamp = true,\n actions,\n loading = false,\n error,\n emptyMessage = \"No status items.\",\n maxBodyHeight,\n ...cardProps\n}: StatusCardProps) {\n const overall = normalizeStatus(status);\n const header = (\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n {title ? (\n <UIText as=\"div\" size=\"sm\" weight=\"medium\">\n {title}\n </UIText>\n ) : null}\n {subtitle ? (\n <UIText as=\"div\" size=\"xs\" muted className=\"mt-1\">\n {subtitle}\n </UIText>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\n <StatusChip status={overall} />\n {actions ? <div className=\"ml-1\">{actions}</div> : null}\n </div>\n </div>\n );\n\n if (error) {\n return (\n <BaseCard\n variant=\"status\"\n header={header}\n body={\n <div className=\"mt-4 rounded-xl border border-rose-200 bg-rose-50 p-4 text-sm text-rose-900 dark:border-rose-900/40 dark:bg-rose-950/30 dark:text-rose-100\">\n {String(error)}\n </div>\n }\n {...cardProps}\n />\n );\n }\n\n const total = items.length;\n const okCount = items.filter((it) => normalizeStatus(it?.status) === \"operational\").length;\n const percentOk = total > 0 ? Math.round((okCount / total) * 100) : 100;\n\n const scrollStyle: React.CSSProperties = maxBodyHeight\n ? { maxHeight: typeof maxBodyHeight === \"number\" ? `${maxBodyHeight}px` : maxBodyHeight, overflowY: \"auto\" }\n : {};\n\n const itemsContent = loading ? (\n <div className=\"space-y-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-3 rounded-xl border border-slate-200 bg-white p-3 dark:border-slate-800 dark:bg-slate-900\">\n <div className=\"h-4 w-1/4 animate-pulse rounded bg-slate-200 dark:bg-slate-800\" />\n <div className=\"h-4 w-1/3 animate-pulse rounded bg-slate-200 dark:bg-slate-800\" />\n </div>\n ))}\n </div>\n ) : items.length === 0 ? (\n <div className=\"rounded-xl border border-dashed border-slate-300 bg-slate-50 p-6 text-center text-sm text-slate-600 dark:border-slate-700 dark:bg-slate-950/30 dark:text-slate-300\">\n {emptyMessage}\n </div>\n ) : layout === \"grid\" ? (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {items.map((it, idx) => (\n <ItemRow key={it?.id ?? idx} item={it} showTimestamp={showTimestamp} />\n ))}\n </div>\n ) : layout === \"timeline\" ? (\n <Timeline items={items} showTimestamp={showTimestamp} />\n ) : (\n <div className=\"space-y-3\">\n {items.map((it, idx) => (\n <ItemRow key={it?.id ?? idx} item={it} showTimestamp={showTimestamp} />\n ))}\n </div>\n );\n\n const body = (\n <div className=\"mt-4\">\n {showProgress && total > 0 ? (\n <div className=\"mb-4\">\n <div className=\"flex items-center justify-between text-xs text-slate-600 dark:text-slate-300\">\n <span>{okCount} / {total} operational</span>\n <span>{percentOk}%</span>\n </div>\n <div className=\"mt-2 h-2 w-full overflow-hidden rounded-full bg-slate-200 dark:bg-slate-800\">\n <div className=\"h-full bg-emerald-500\" style={{ width: `${percentOk}%` }} />\n </div>\n </div>\n ) : null}\n <div style={scrollStyle}>{itemsContent}</div>\n </div>\n );\n\n return <BaseCard variant=\"status\" header={header} body={body} {...cardProps} />;\n}\n"],"names":["STATUS_META","normalizeStatus","status","s","formatTimestamp","ts","d","StatusChip","key","meta","jsxs","jsx","ItemRow","item","showTimestamp","name","desc","value","unit","Timeline","items","idx","StatusCard","title","subtitle","layout","showProgress","actions","loading","error","emptyMessage","maxBodyHeight","cardProps","overall","header","UIText","BaseCard","total","okCount","it","percentOk","scrollStyle","itemsContent","_","i","body"],"mappings":"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"}
|
|
@@ -1,23 +1,40 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
sortable?: boolean
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { BaseCardProps } from "./BaseCard";
|
|
3
|
+
type ColumnType = "currency" | "percentage" | "number" | "text";
|
|
4
|
+
export interface TableColumn {
|
|
5
|
+
key: string;
|
|
6
|
+
label: string;
|
|
7
|
+
type?: ColumnType;
|
|
8
|
+
sortable?: boolean;
|
|
9
|
+
mono?: boolean;
|
|
10
|
+
className?: string;
|
|
11
|
+
render?: (value: unknown, row: Record<string, unknown>) => React.ReactNode;
|
|
12
|
+
}
|
|
13
|
+
export interface SortState {
|
|
14
|
+
key: string;
|
|
15
|
+
direction: "asc" | "desc";
|
|
16
|
+
}
|
|
17
|
+
export interface TableCardProps extends Omit<BaseCardProps, "variant" | "header" | "body"> {
|
|
18
|
+
data?: Record<string, unknown>[];
|
|
19
|
+
columns?: TableColumn[];
|
|
20
|
+
title?: string;
|
|
21
|
+
subtitle?: string;
|
|
22
|
+
searchable?: boolean;
|
|
23
|
+
sortable?: boolean;
|
|
24
|
+
paginated?: boolean;
|
|
25
|
+
selectable?: boolean;
|
|
26
|
+
pageSize?: number;
|
|
27
|
+
actions?: React.ReactNode;
|
|
28
|
+
rowActions?: (row: Record<string, unknown>) => React.ReactNode;
|
|
29
|
+
onRowSelect?: (row: Record<string, unknown>) => void;
|
|
30
|
+
onSort?: (sort: SortState) => void;
|
|
31
|
+
onSearch?: (query: string) => void;
|
|
32
|
+
loading?: boolean;
|
|
33
|
+
error?: string | Error;
|
|
34
|
+
emptyMessage?: string;
|
|
35
|
+
simulateInitialLoad?: boolean;
|
|
36
|
+
minInitialDelayMs?: number;
|
|
37
|
+
maxInitialDelayMs?: number;
|
|
38
|
+
}
|
|
39
|
+
export default function TableCard({ data, columns, title, subtitle, searchable, sortable, paginated, selectable, pageSize, actions, rowActions, onRowSelect, onSort, onSearch, loading, error, emptyMessage, simulateInitialLoad, minInitialDelayMs, maxInitialDelayMs, ...cardProps }: TableCardProps): import("react/jsx-runtime").JSX.Element;
|
|
40
|
+
export {};
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsx as t, jsxs as d } from "react/jsx-runtime";
|
|
2
2
|
import i from "react";
|
|
3
3
|
import E from "./BaseCard.js";
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
function
|
|
4
|
+
import re from "../ui/UIInput.js";
|
|
5
|
+
import K from "../ui/UIButton.js";
|
|
6
|
+
import Q from "../ui/Text.js";
|
|
7
|
+
function se(o, s) {
|
|
8
8
|
if (s == null) return "";
|
|
9
9
|
if (!o) return String(s);
|
|
10
10
|
if (o === "currency") {
|
|
@@ -21,13 +21,13 @@ function re(o, s) {
|
|
|
21
21
|
}
|
|
22
22
|
return String(s);
|
|
23
23
|
}
|
|
24
|
-
function
|
|
24
|
+
function ae(o, s) {
|
|
25
25
|
return o.map((r, u) => ({ item: r, idx: u })).sort((r, u) => {
|
|
26
26
|
const b = s(r.item, u.item);
|
|
27
27
|
return b !== 0 ? b : r.idx - u.idx;
|
|
28
28
|
}).map((r) => r.item);
|
|
29
29
|
}
|
|
30
|
-
function
|
|
30
|
+
function me({
|
|
31
31
|
data: o = [],
|
|
32
32
|
columns: s = [],
|
|
33
33
|
title: r,
|
|
@@ -38,60 +38,60 @@ function ce({
|
|
|
38
38
|
selectable: M = !1,
|
|
39
39
|
pageSize: f = 10,
|
|
40
40
|
actions: F,
|
|
41
|
-
rowActions:
|
|
42
|
-
onRowSelect:
|
|
43
|
-
onSort:
|
|
44
|
-
onSearch:
|
|
45
|
-
loading:
|
|
41
|
+
rowActions: p,
|
|
42
|
+
onRowSelect: R,
|
|
43
|
+
onSort: G,
|
|
44
|
+
onSearch: H,
|
|
45
|
+
loading: J = !1,
|
|
46
46
|
error: P,
|
|
47
|
-
emptyMessage:
|
|
47
|
+
emptyMessage: O = "No results.",
|
|
48
48
|
simulateInitialLoad: B = !1,
|
|
49
49
|
minInitialDelayMs: L = 350,
|
|
50
50
|
maxInitialDelayMs: U = 900,
|
|
51
51
|
...$
|
|
52
52
|
}) {
|
|
53
|
-
const [
|
|
53
|
+
const [y, V] = i.useState(""), [x, W] = i.useState(null), [N, X] = i.useState("asc"), [T, k] = i.useState(1), [Y, Z] = i.useState(void 0), [z, A] = i.useState(B);
|
|
54
54
|
i.useEffect(() => {
|
|
55
55
|
if (!B) return;
|
|
56
|
-
const e = Math.floor(Math.random() * (U - L + 1)) + L, a = setTimeout(() =>
|
|
56
|
+
const e = Math.floor(Math.random() * (U - L + 1)) + L, a = setTimeout(() => A(!1), e);
|
|
57
57
|
return () => clearTimeout(a);
|
|
58
58
|
}, [B, L, U]);
|
|
59
|
-
const
|
|
60
|
-
if (!b || !
|
|
61
|
-
const e =
|
|
59
|
+
const I = J || z, v = i.useMemo(() => {
|
|
60
|
+
if (!b || !y.trim()) return o;
|
|
61
|
+
const e = y.trim().toLowerCase();
|
|
62
62
|
return o.filter(
|
|
63
63
|
(a) => s.some((n) => {
|
|
64
|
-
const
|
|
65
|
-
return
|
|
64
|
+
const m = a?.[n.key];
|
|
65
|
+
return m == null ? !1 : String(m).toLowerCase().includes(e);
|
|
66
66
|
})
|
|
67
67
|
);
|
|
68
|
-
}, [o, s,
|
|
68
|
+
}, [o, s, y, b]), S = i.useMemo(() => {
|
|
69
69
|
if (!j || !x || !s.find((n) => n.key === x)) return v;
|
|
70
|
-
const a =
|
|
71
|
-
return
|
|
72
|
-
const
|
|
73
|
-
return
|
|
70
|
+
const a = N === "desc" ? -1 : 1;
|
|
71
|
+
return ae(v, (n, m) => {
|
|
72
|
+
const h = n?.[x], l = m?.[x];
|
|
73
|
+
return h == null && l == null ? 0 : h == null ? -1 * a : l == null ? 1 * a : typeof h == "number" && typeof l == "number" ? (h - l) * a : String(h).localeCompare(String(l)) * a;
|
|
74
74
|
});
|
|
75
|
-
}, [v, j, x,
|
|
75
|
+
}, [v, j, x, N, s]), w = S.length, C = g ? Math.max(1, Math.ceil(w / f)) : 1, c = Math.min(T, C), _ = i.useMemo(() => {
|
|
76
76
|
if (!g) return S;
|
|
77
77
|
const e = (c - 1) * f;
|
|
78
78
|
return S.slice(e, e + f);
|
|
79
79
|
}, [S, g, c, f]);
|
|
80
80
|
i.useEffect(() => {
|
|
81
|
-
T !== c &&
|
|
81
|
+
T !== c && k(c);
|
|
82
82
|
}, [T, c]);
|
|
83
|
-
const
|
|
83
|
+
const q = /* @__PURE__ */ d("div", { className: "flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between", children: [
|
|
84
84
|
/* @__PURE__ */ d("div", { className: "min-w-0", children: [
|
|
85
|
-
r ? /* @__PURE__ */ t(
|
|
86
|
-
u ? /* @__PURE__ */ t(
|
|
85
|
+
r ? /* @__PURE__ */ t(Q, { as: "div", size: "sm", weight: "medium", children: r }) : null,
|
|
86
|
+
u ? /* @__PURE__ */ t(Q, { as: "div", size: "xs", muted: !0, className: "mt-1", children: u }) : null
|
|
87
87
|
] }),
|
|
88
88
|
/* @__PURE__ */ d("div", { className: "flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-end", children: [
|
|
89
89
|
b ? /* @__PURE__ */ t("div", { className: "w-full sm:w-64", children: /* @__PURE__ */ t(
|
|
90
|
-
|
|
90
|
+
re,
|
|
91
91
|
{
|
|
92
|
-
value:
|
|
92
|
+
value: y,
|
|
93
93
|
onChange: (e) => {
|
|
94
|
-
|
|
94
|
+
V(e.target.value), k(1), H?.(e.target.value);
|
|
95
95
|
},
|
|
96
96
|
placeholder: "Search…",
|
|
97
97
|
"aria-label": "Search table"
|
|
@@ -104,17 +104,17 @@ function ce({
|
|
|
104
104
|
return /* @__PURE__ */ t(
|
|
105
105
|
E,
|
|
106
106
|
{
|
|
107
|
-
header:
|
|
107
|
+
header: q,
|
|
108
108
|
body: /* @__PURE__ */ t("div", { className: "mt-4 rounded-xl border border-rose-200 bg-rose-50 p-4 text-sm text-rose-900 dark:border-rose-900/40 dark:bg-rose-950/30 dark:text-rose-100", children: String(P) }),
|
|
109
109
|
...$
|
|
110
110
|
}
|
|
111
111
|
);
|
|
112
|
-
const
|
|
112
|
+
const ee = (e) => j && (e.sortable ?? !0);
|
|
113
113
|
return /* @__PURE__ */ t(
|
|
114
114
|
E,
|
|
115
115
|
{
|
|
116
116
|
variant: "table",
|
|
117
|
-
header:
|
|
117
|
+
header: q,
|
|
118
118
|
body: /* @__PURE__ */ d("div", { className: "mt-4 overflow-hidden rounded-xl border border-slate-200 dark:border-slate-800", children: [
|
|
119
119
|
/* @__PURE__ */ t("div", { className: "w-full overflow-x-auto", children: /* @__PURE__ */ d("table", { className: "min-w-full border-separate border-spacing-0", children: [
|
|
120
120
|
/* @__PURE__ */ t("thead", { className: "bg-slate-50 dark:bg-slate-950/30", children: /* @__PURE__ */ d("tr", { children: [
|
|
@@ -128,18 +128,18 @@ function ce({
|
|
|
128
128
|
"whitespace-nowrap border-b border-slate-200 px-4 py-3 text-left text-xs font-semibold text-slate-600 dark:border-slate-800 dark:text-slate-300",
|
|
129
129
|
e.className ?? ""
|
|
130
130
|
].filter(Boolean).join(" "),
|
|
131
|
-
children:
|
|
131
|
+
children: ee(e) ? /* @__PURE__ */ d(
|
|
132
132
|
"button",
|
|
133
133
|
{
|
|
134
134
|
type: "button",
|
|
135
135
|
className: "inline-flex items-center gap-2 hover:text-slate-900 dark:hover:text-slate-50",
|
|
136
136
|
onClick: () => {
|
|
137
|
-
const n = a &&
|
|
138
|
-
|
|
137
|
+
const n = a && N === "asc" ? "desc" : "asc";
|
|
138
|
+
W(e.key), X(n), G?.({ key: e.key, direction: n });
|
|
139
139
|
},
|
|
140
140
|
children: [
|
|
141
141
|
/* @__PURE__ */ t("span", { children: e.label }),
|
|
142
|
-
/* @__PURE__ */ t("span", { className: "text-[10px] opacity-70", children: a ?
|
|
142
|
+
/* @__PURE__ */ t("span", { className: "text-[10px] opacity-70", children: a ? N === "asc" ? "▲" : "▼" : "↕" })
|
|
143
143
|
]
|
|
144
144
|
}
|
|
145
145
|
) : e.label
|
|
@@ -147,9 +147,9 @@ function ce({
|
|
|
147
147
|
e.key
|
|
148
148
|
);
|
|
149
149
|
}),
|
|
150
|
-
|
|
150
|
+
p ? /* @__PURE__ */ t("th", { className: "border-b border-slate-200 px-4 py-3 text-right text-xs font-semibold text-slate-600 dark:border-slate-800 dark:text-slate-300", children: "Actions" }) : null
|
|
151
151
|
] }) }),
|
|
152
|
-
/* @__PURE__ */ t("tbody", { className: "bg-white dark:bg-slate-900", children:
|
|
152
|
+
/* @__PURE__ */ t("tbody", { className: "bg-white dark:bg-slate-900", children: I ? Array.from({ length: Math.min(f, 6) }).map((e, a) => /* @__PURE__ */ d("tr", { children: [
|
|
153
153
|
s.map((n) => /* @__PURE__ */ t(
|
|
154
154
|
"td",
|
|
155
155
|
{
|
|
@@ -158,30 +158,30 @@ function ce({
|
|
|
158
158
|
},
|
|
159
159
|
n.key
|
|
160
160
|
)),
|
|
161
|
-
|
|
162
|
-
] }, a)) :
|
|
161
|
+
p ? /* @__PURE__ */ t("td", { className: "border-b border-slate-200 px-4 py-3 dark:border-slate-800", children: /* @__PURE__ */ t("div", { className: "h-4 w-10 animate-pulse rounded bg-slate-200 dark:bg-slate-800" }) }) : null
|
|
162
|
+
] }, a)) : _.length === 0 ? /* @__PURE__ */ t("tr", { children: /* @__PURE__ */ t(
|
|
163
163
|
"td",
|
|
164
164
|
{
|
|
165
|
-
colSpan: s.length + (
|
|
165
|
+
colSpan: s.length + (p ? 1 : 0),
|
|
166
166
|
className: "px-4 py-10 text-center text-sm text-slate-600 dark:text-slate-300",
|
|
167
|
-
children:
|
|
167
|
+
children: O
|
|
168
168
|
}
|
|
169
|
-
) }) :
|
|
170
|
-
const n = e?.id
|
|
169
|
+
) }) : _.map((e, a) => {
|
|
170
|
+
const n = e?.id, m = typeof n == "string" || typeof n == "number" ? n : a;
|
|
171
171
|
return /* @__PURE__ */ d(
|
|
172
172
|
"tr",
|
|
173
173
|
{
|
|
174
174
|
className: [
|
|
175
175
|
"group",
|
|
176
176
|
M ? "cursor-pointer" : "",
|
|
177
|
-
M &&
|
|
177
|
+
M && Y === m ? "bg-brand-50 dark:bg-brand-950/30" : ""
|
|
178
178
|
].filter(Boolean).join(" "),
|
|
179
179
|
onClick: () => {
|
|
180
|
-
M && (
|
|
180
|
+
M && (Z(m), R?.(e));
|
|
181
181
|
},
|
|
182
182
|
children: [
|
|
183
183
|
s.map((l) => {
|
|
184
|
-
const
|
|
184
|
+
const D = e?.[l.key], te = l.render ? l.render(D, e) : se(l.type, D);
|
|
185
185
|
return /* @__PURE__ */ t(
|
|
186
186
|
"td",
|
|
187
187
|
{
|
|
@@ -190,28 +190,28 @@ function ce({
|
|
|
190
190
|
l.mono ? "font-mono text-[13px]" : "",
|
|
191
191
|
l.className ?? ""
|
|
192
192
|
].filter(Boolean).join(" "),
|
|
193
|
-
children:
|
|
193
|
+
children: te
|
|
194
194
|
},
|
|
195
195
|
l.key
|
|
196
196
|
);
|
|
197
197
|
}),
|
|
198
|
-
|
|
198
|
+
p ? /* @__PURE__ */ t("td", { className: "border-b border-slate-200 px-4 py-3 text-right text-sm dark:border-slate-800", children: /* @__PURE__ */ t("div", { className: "inline-flex items-center justify-end gap-2 opacity-100 sm:opacity-0 sm:group-hover:opacity-100", children: p(e) }) }) : null
|
|
199
199
|
]
|
|
200
200
|
},
|
|
201
|
-
|
|
201
|
+
String(m)
|
|
202
202
|
);
|
|
203
203
|
}) })
|
|
204
204
|
] }) }),
|
|
205
|
-
g && !
|
|
205
|
+
g && !I ? /* @__PURE__ */ d("div", { className: "flex flex-col gap-2 border-t border-slate-200 bg-slate-50 px-4 py-3 dark:border-slate-800 dark:bg-slate-950/30 sm:flex-row sm:items-center sm:justify-between", children: [
|
|
206
206
|
/* @__PURE__ */ t("div", { className: "text-xs text-slate-600 dark:text-slate-300", children: w === 0 ? "0 results" : `Showing ${(c - 1) * f + 1}-${Math.min(c * f, w)} of ${w}` }),
|
|
207
207
|
/* @__PURE__ */ d("div", { className: "flex items-center gap-2", children: [
|
|
208
208
|
/* @__PURE__ */ t(
|
|
209
|
-
|
|
209
|
+
K,
|
|
210
210
|
{
|
|
211
211
|
variant: "outline",
|
|
212
212
|
size: "sm",
|
|
213
213
|
disabled: c <= 1,
|
|
214
|
-
onClick: () =>
|
|
214
|
+
onClick: () => k((e) => Math.max(1, e - 1)),
|
|
215
215
|
children: "Prev"
|
|
216
216
|
}
|
|
217
217
|
),
|
|
@@ -222,12 +222,12 @@ function ce({
|
|
|
222
222
|
C
|
|
223
223
|
] }),
|
|
224
224
|
/* @__PURE__ */ t(
|
|
225
|
-
|
|
225
|
+
K,
|
|
226
226
|
{
|
|
227
227
|
variant: "outline",
|
|
228
228
|
size: "sm",
|
|
229
229
|
disabled: c >= C,
|
|
230
|
-
onClick: () =>
|
|
230
|
+
onClick: () => k((e) => Math.min(C, e + 1)),
|
|
231
231
|
children: "Next"
|
|
232
232
|
}
|
|
233
233
|
)
|
|
@@ -239,6 +239,6 @@ function ce({
|
|
|
239
239
|
);
|
|
240
240
|
}
|
|
241
241
|
export {
|
|
242
|
-
|
|
242
|
+
me as default
|
|
243
243
|
};
|
|
244
244
|
//# sourceMappingURL=TableCard.js.map
|