@replicated/portal-components 0.0.2 → 0.0.4
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/components/metadata/registry.json +83 -2
- package/components/metadata/registry.md +27 -2
- package/dist/actions/index.d.mts +566 -3
- package/dist/actions/index.d.ts +566 -3
- package/dist/actions/index.js +1853 -12
- package/dist/actions/index.js.map +1 -1
- package/dist/airgap-instances.d.mts +26 -0
- package/dist/airgap-instances.d.ts +26 -0
- package/dist/airgap-instances.js +354 -0
- package/dist/airgap-instances.js.map +1 -0
- package/dist/error-page.d.mts +14 -0
- package/dist/error-page.d.ts +14 -0
- package/dist/error-page.js +153 -0
- package/dist/error-page.js.map +1 -0
- package/dist/error.d.mts +15 -0
- package/dist/error.d.ts +15 -0
- package/dist/error.js +144 -0
- package/dist/error.js.map +1 -0
- package/dist/esm/actions/index.js +1816 -13
- package/dist/esm/actions/index.js.map +1 -1
- package/dist/esm/airgap-instances.js +352 -0
- package/dist/esm/airgap-instances.js.map +1 -0
- package/dist/esm/error-page.js +151 -0
- package/dist/esm/error-page.js.map +1 -0
- package/dist/esm/error.js +142 -0
- package/dist/esm/error.js.map +1 -0
- package/dist/esm/helm-install-wizard.js +1007 -0
- package/dist/esm/helm-install-wizard.js.map +1 -0
- package/dist/esm/index.js +2232 -155
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/install-actions.js +746 -0
- package/dist/esm/install-actions.js.map +1 -0
- package/dist/esm/install-card.js +115 -0
- package/dist/esm/install-card.js.map +1 -0
- package/dist/esm/install-targets.js +48 -0
- package/dist/esm/install-targets.js.map +1 -0
- package/dist/esm/instance-card.js +197 -0
- package/dist/esm/instance-card.js.map +1 -0
- package/dist/esm/join-team.js +218 -0
- package/dist/esm/join-team.js.map +1 -0
- package/dist/esm/license-card.js +131 -0
- package/dist/esm/license-card.js.map +1 -0
- package/dist/esm/license-details.js +667 -0
- package/dist/esm/license-details.js.map +1 -0
- package/dist/esm/linux-install-wizard.js +1083 -0
- package/dist/esm/linux-install-wizard.js.map +1 -0
- package/dist/esm/login.js +261 -0
- package/dist/esm/login.js.map +1 -0
- package/dist/esm/online-instance-list.js +287 -0
- package/dist/esm/online-instance-list.js.map +1 -0
- package/dist/esm/pending-installations.js +235 -0
- package/dist/esm/pending-installations.js.map +1 -0
- package/dist/esm/release-history-panel.js +100 -0
- package/dist/esm/release-history-panel.js.map +1 -0
- package/dist/esm/release-notes-card.js +23 -0
- package/dist/esm/release-notes-card.js.map +1 -0
- package/dist/esm/security-card.js +700 -0
- package/dist/esm/security-card.js.map +1 -0
- package/dist/esm/support-bundle-collection-card.js +170 -0
- package/dist/esm/support-bundle-collection-card.js.map +1 -0
- package/dist/esm/support-bundles-card.js +306 -0
- package/dist/esm/support-bundles-card.js.map +1 -0
- package/dist/esm/support-card.js +305 -0
- package/dist/esm/support-card.js.map +1 -0
- package/dist/esm/team-selection.js +117 -0
- package/dist/esm/team-selection.js.map +1 -0
- package/dist/esm/team-settings-card.js +78 -0
- package/dist/esm/team-settings-card.js.map +1 -0
- package/dist/esm/team-settings.js +136 -0
- package/dist/esm/team-settings.js.map +1 -0
- package/dist/esm/top-nav-user-menu.js +173 -0
- package/dist/esm/top-nav-user-menu.js.map +1 -0
- package/dist/esm/top-nav.js +398 -0
- package/dist/esm/top-nav.js.map +1 -0
- package/dist/esm/update-layout.js +405 -0
- package/dist/esm/update-layout.js.map +1 -0
- package/dist/esm/updates-card.js +85 -0
- package/dist/esm/updates-card.js.map +1 -0
- package/dist/esm/upload-support-bundle-modal.js +143 -0
- package/dist/esm/upload-support-bundle-modal.js.map +1 -0
- package/dist/esm/user-settings-card.js +21 -0
- package/dist/esm/user-settings-card.js.map +1 -0
- package/dist/esm/user-settings.js +368 -0
- package/dist/esm/user-settings.js.map +1 -0
- package/dist/esm/utils/index.js +170 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/helm-install-wizard.d.mts +38 -0
- package/dist/helm-install-wizard.d.ts +38 -0
- package/dist/helm-install-wizard.js +1011 -0
- package/dist/helm-install-wizard.js.map +1 -0
- package/dist/index.d.mts +11 -27
- package/dist/index.d.ts +11 -27
- package/dist/index.js +2258 -154
- package/dist/index.js.map +1 -1
- package/dist/install-B19AaKF_.d.mts +233 -0
- package/dist/install-Bi1qJ8Bu.d.ts +233 -0
- package/dist/install-actions.d.mts +141 -0
- package/dist/install-actions.d.ts +141 -0
- package/dist/install-actions.js +765 -0
- package/dist/install-actions.js.map +1 -0
- package/dist/install-card.d.mts +15 -0
- package/dist/install-card.d.ts +15 -0
- package/dist/install-card.js +117 -0
- package/dist/install-card.js.map +1 -0
- package/dist/install-targets.d.mts +19 -0
- package/dist/install-targets.d.ts +19 -0
- package/dist/install-targets.js +50 -0
- package/dist/install-targets.js.map +1 -0
- package/dist/instance-card.d.mts +22 -0
- package/dist/instance-card.d.ts +22 -0
- package/dist/instance-card.js +199 -0
- package/dist/instance-card.js.map +1 -0
- package/dist/join-team.d.mts +30 -0
- package/dist/join-team.d.ts +30 -0
- package/dist/join-team.js +220 -0
- package/dist/join-team.js.map +1 -0
- package/dist/license-card.d.mts +15 -0
- package/dist/license-card.d.ts +15 -0
- package/dist/license-card.js +133 -0
- package/dist/license-card.js.map +1 -0
- package/dist/license-details.d.mts +10 -0
- package/dist/license-details.d.ts +10 -0
- package/dist/license-details.js +669 -0
- package/dist/license-details.js.map +1 -0
- package/dist/linux-install-wizard.d.mts +66 -0
- package/dist/linux-install-wizard.d.ts +66 -0
- package/dist/linux-install-wizard.js +1093 -0
- package/dist/linux-install-wizard.js.map +1 -0
- package/dist/login.d.mts +37 -0
- package/dist/login.d.ts +37 -0
- package/dist/login.js +263 -0
- package/dist/login.js.map +1 -0
- package/dist/online-instance-list.d.mts +22 -0
- package/dist/online-instance-list.d.ts +22 -0
- package/dist/online-instance-list.js +289 -0
- package/dist/online-instance-list.js.map +1 -0
- package/dist/pending-installations.d.mts +15 -0
- package/dist/pending-installations.d.ts +15 -0
- package/dist/pending-installations.js +237 -0
- package/dist/pending-installations.js.map +1 -0
- package/dist/release-history-panel.d.mts +22 -0
- package/dist/release-history-panel.d.ts +22 -0
- package/dist/release-history-panel.js +102 -0
- package/dist/release-history-panel.js.map +1 -0
- package/dist/release-notes-card.d.mts +13 -0
- package/dist/release-notes-card.d.ts +13 -0
- package/dist/release-notes-card.js +25 -0
- package/dist/release-notes-card.js.map +1 -0
- package/dist/security-card.d.mts +73 -0
- package/dist/security-card.d.ts +73 -0
- package/dist/security-card.js +702 -0
- package/dist/security-card.js.map +1 -0
- package/dist/styles.css +1877 -194
- package/dist/support-bundle-collection-card.d.mts +20 -0
- package/dist/support-bundle-collection-card.d.ts +20 -0
- package/dist/support-bundle-collection-card.js +172 -0
- package/dist/support-bundle-collection-card.js.map +1 -0
- package/dist/support-bundles-card.d.mts +19 -0
- package/dist/support-bundles-card.d.ts +19 -0
- package/dist/support-bundles-card.js +308 -0
- package/dist/support-bundles-card.js.map +1 -0
- package/dist/support-card.d.mts +8 -0
- package/dist/support-card.d.ts +8 -0
- package/dist/support-card.js +307 -0
- package/dist/support-card.js.map +1 -0
- package/dist/team-selection.d.mts +23 -0
- package/dist/team-selection.d.ts +23 -0
- package/dist/team-selection.js +119 -0
- package/dist/team-selection.js.map +1 -0
- package/dist/team-settings-card-Dq1d9b5c.d.mts +14 -0
- package/dist/team-settings-card-Dq1d9b5c.d.ts +14 -0
- package/dist/team-settings-card.d.mts +2 -0
- package/dist/team-settings-card.d.ts +2 -0
- package/dist/team-settings-card.js +80 -0
- package/dist/team-settings-card.js.map +1 -0
- package/dist/team-settings.d.mts +25 -0
- package/dist/team-settings.d.ts +25 -0
- package/dist/team-settings.js +138 -0
- package/dist/team-settings.js.map +1 -0
- package/dist/top-nav-0mb1K_H0.d.mts +32 -0
- package/dist/top-nav-0mb1K_H0.d.ts +32 -0
- package/dist/top-nav-user-menu.d.mts +18 -0
- package/dist/top-nav-user-menu.d.ts +18 -0
- package/dist/top-nav-user-menu.js +175 -0
- package/dist/top-nav-user-menu.js.map +1 -0
- package/dist/top-nav.d.mts +3 -0
- package/dist/top-nav.d.ts +3 -0
- package/dist/top-nav.js +400 -0
- package/dist/top-nav.js.map +1 -0
- package/dist/update-layout.d.mts +12 -0
- package/dist/update-layout.d.ts +12 -0
- package/dist/update-layout.js +407 -0
- package/dist/update-layout.js.map +1 -0
- package/dist/updates-card-BbubBrVR.d.mts +18 -0
- package/dist/updates-card-BbubBrVR.d.ts +18 -0
- package/dist/updates-card.d.mts +2 -0
- package/dist/updates-card.d.ts +2 -0
- package/dist/updates-card.js +87 -0
- package/dist/updates-card.js.map +1 -0
- package/dist/upload-support-bundle-modal.d.mts +19 -0
- package/dist/upload-support-bundle-modal.d.ts +19 -0
- package/dist/upload-support-bundle-modal.js +145 -0
- package/dist/upload-support-bundle-modal.js.map +1 -0
- package/dist/user-settings-card.d.mts +8 -0
- package/dist/user-settings-card.d.ts +8 -0
- package/dist/user-settings-card.js +23 -0
- package/dist/user-settings-card.js.map +1 -0
- package/dist/user-settings.d.mts +47 -0
- package/dist/user-settings.d.ts +47 -0
- package/dist/user-settings.js +370 -0
- package/dist/user-settings.js.map +1 -0
- package/dist/utils/index.d.mts +70 -0
- package/dist/utils/index.d.ts +70 -0
- package/dist/utils/index.js +177 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +163 -3
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useState, useCallback } from 'react';
|
|
3
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Enterprise Portal Components
|
|
7
|
+
* This file is generated by tsup. Do not edit manually.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
var formatBytes = (bytes, decimals = 1) => {
|
|
11
|
+
if (bytes === 0) return "0 Bytes";
|
|
12
|
+
const k = 1024;
|
|
13
|
+
const dm = decimals < 0 ? 0 : decimals;
|
|
14
|
+
const sizes = ["Bytes", "KB", "MB", "GB", "TB"];
|
|
15
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
16
|
+
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;
|
|
17
|
+
};
|
|
18
|
+
var DownloadIcon = ({ className }) => /* @__PURE__ */ jsxs(
|
|
19
|
+
"svg",
|
|
20
|
+
{
|
|
21
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
22
|
+
viewBox: "0 0 24 24",
|
|
23
|
+
fill: "none",
|
|
24
|
+
stroke: "currentColor",
|
|
25
|
+
strokeWidth: "1.5",
|
|
26
|
+
className,
|
|
27
|
+
"aria-hidden": "true",
|
|
28
|
+
children: [
|
|
29
|
+
/* @__PURE__ */ jsx("path", { d: "M12 3v14" }),
|
|
30
|
+
/* @__PURE__ */ jsx("path", { d: "M8 13l4 4 4-4" }),
|
|
31
|
+
/* @__PURE__ */ jsx("path", { d: "M5 21h14" })
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
var TrashIcon = ({ className }) => /* @__PURE__ */ jsxs(
|
|
36
|
+
"svg",
|
|
37
|
+
{
|
|
38
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
39
|
+
viewBox: "0 0 24 24",
|
|
40
|
+
fill: "none",
|
|
41
|
+
stroke: "currentColor",
|
|
42
|
+
strokeWidth: "1.5",
|
|
43
|
+
className,
|
|
44
|
+
"aria-hidden": "true",
|
|
45
|
+
children: [
|
|
46
|
+
/* @__PURE__ */ jsx("path", { d: "M3 6h18" }),
|
|
47
|
+
/* @__PURE__ */ jsx("path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6" }),
|
|
48
|
+
/* @__PURE__ */ jsx("path", { d: "M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" }),
|
|
49
|
+
/* @__PURE__ */ jsx("line", { x1: "10", y1: "11", x2: "10", y2: "17" }),
|
|
50
|
+
/* @__PURE__ */ jsx("line", { x1: "14", y1: "11", x2: "14", y2: "17" })
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
);
|
|
54
|
+
var CheckIcon = ({ className }) => /* @__PURE__ */ jsxs(
|
|
55
|
+
"svg",
|
|
56
|
+
{
|
|
57
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
58
|
+
viewBox: "0 0 24 24",
|
|
59
|
+
fill: "none",
|
|
60
|
+
stroke: "currentColor",
|
|
61
|
+
strokeWidth: "2",
|
|
62
|
+
className,
|
|
63
|
+
"aria-hidden": "true",
|
|
64
|
+
children: [
|
|
65
|
+
/* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10" }),
|
|
66
|
+
/* @__PURE__ */ jsx("path", { d: "M9 12l2 2 4-4" })
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
var PendingIcon = ({ className }) => /* @__PURE__ */ jsx(
|
|
71
|
+
"svg",
|
|
72
|
+
{
|
|
73
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
74
|
+
viewBox: "0 0 24 24",
|
|
75
|
+
fill: "none",
|
|
76
|
+
stroke: "currentColor",
|
|
77
|
+
strokeWidth: "2",
|
|
78
|
+
className,
|
|
79
|
+
"aria-hidden": "true",
|
|
80
|
+
children: /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10", strokeDasharray: "4 2" })
|
|
81
|
+
}
|
|
82
|
+
);
|
|
83
|
+
var AlertTriangleIcon = ({ className }) => /* @__PURE__ */ jsxs(
|
|
84
|
+
"svg",
|
|
85
|
+
{
|
|
86
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
87
|
+
viewBox: "0 0 24 24",
|
|
88
|
+
fill: "none",
|
|
89
|
+
stroke: "currentColor",
|
|
90
|
+
strokeWidth: "2",
|
|
91
|
+
className,
|
|
92
|
+
"aria-hidden": "true",
|
|
93
|
+
children: [
|
|
94
|
+
/* @__PURE__ */ jsx("path", { d: "M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z" }),
|
|
95
|
+
/* @__PURE__ */ jsx("line", { x1: "12", y1: "9", x2: "12", y2: "13" }),
|
|
96
|
+
/* @__PURE__ */ jsx("line", { x1: "12", y1: "17", x2: "12.01", y2: "17" })
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
);
|
|
100
|
+
var SupportBundlesCard = ({
|
|
101
|
+
totalCount,
|
|
102
|
+
bundles,
|
|
103
|
+
onDownload,
|
|
104
|
+
onDelete,
|
|
105
|
+
primaryColor = "#6366f1"
|
|
106
|
+
}) => {
|
|
107
|
+
const [downloadingId, setDownloadingId] = useState(null);
|
|
108
|
+
const [deletingId, setDeletingId] = useState(null);
|
|
109
|
+
const [bundleToDelete, setBundleToDelete] = useState(null);
|
|
110
|
+
const [error, setError] = useState(null);
|
|
111
|
+
const handleDownload = useCallback(async (bundleId) => {
|
|
112
|
+
if (!onDownload) return;
|
|
113
|
+
setError(null);
|
|
114
|
+
setDownloadingId(bundleId);
|
|
115
|
+
try {
|
|
116
|
+
const signedUrl = await onDownload(bundleId);
|
|
117
|
+
const link = document.createElement("a");
|
|
118
|
+
link.href = signedUrl;
|
|
119
|
+
link.setAttribute("download", "");
|
|
120
|
+
document.body.appendChild(link);
|
|
121
|
+
link.click();
|
|
122
|
+
document.body.removeChild(link);
|
|
123
|
+
} catch (err) {
|
|
124
|
+
setError(err instanceof Error ? err.message : "Failed to download bundle");
|
|
125
|
+
} finally {
|
|
126
|
+
setDownloadingId(null);
|
|
127
|
+
}
|
|
128
|
+
}, [onDownload]);
|
|
129
|
+
const handleDeleteClick = useCallback((bundle) => {
|
|
130
|
+
setBundleToDelete(bundle);
|
|
131
|
+
}, []);
|
|
132
|
+
const handleDeleteConfirm = useCallback(async () => {
|
|
133
|
+
if (!onDelete || !bundleToDelete) return;
|
|
134
|
+
setError(null);
|
|
135
|
+
setDeletingId(bundleToDelete.id);
|
|
136
|
+
try {
|
|
137
|
+
await onDelete(bundleToDelete.id);
|
|
138
|
+
setBundleToDelete(null);
|
|
139
|
+
} catch (err) {
|
|
140
|
+
setError(err instanceof Error ? err.message : "Failed to delete bundle");
|
|
141
|
+
setBundleToDelete(null);
|
|
142
|
+
} finally {
|
|
143
|
+
setDeletingId(null);
|
|
144
|
+
}
|
|
145
|
+
}, [onDelete, bundleToDelete]);
|
|
146
|
+
const handleDeleteCancel = useCallback(() => {
|
|
147
|
+
setBundleToDelete(null);
|
|
148
|
+
}, []);
|
|
149
|
+
const isActionDisabled = downloadingId !== null || deletingId !== null;
|
|
150
|
+
const renderIssues = (insights) => {
|
|
151
|
+
const errors = insights?.filter((i) => i.level === "error")?.length ?? 0;
|
|
152
|
+
const warnings = insights?.filter((i) => i.level === "warn")?.length ?? 0;
|
|
153
|
+
if (!errors && !warnings) {
|
|
154
|
+
return /* @__PURE__ */ jsx("span", { className: "text-gray-400", children: "No issues found" });
|
|
155
|
+
}
|
|
156
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
157
|
+
errors > 0 && /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 text-red-600", children: [
|
|
158
|
+
/* @__PURE__ */ jsx(AlertTriangleIcon, { className: "h-4 w-4" }),
|
|
159
|
+
errors,
|
|
160
|
+
" ",
|
|
161
|
+
errors === 1 ? "error" : "errors"
|
|
162
|
+
] }),
|
|
163
|
+
warnings > 0 && /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 text-yellow-600", children: [
|
|
164
|
+
/* @__PURE__ */ jsx(AlertTriangleIcon, { className: "h-4 w-4" }),
|
|
165
|
+
warnings,
|
|
166
|
+
" ",
|
|
167
|
+
warnings === 1 ? "warning" : "warnings"
|
|
168
|
+
] })
|
|
169
|
+
] });
|
|
170
|
+
};
|
|
171
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
172
|
+
/* @__PURE__ */ jsxs("section", { className: "rounded-3xl border border-gray-100 bg-white p-8 shadow-[0_18px_45px_rgba(17,24,39,0.08)]", children: [
|
|
173
|
+
/* @__PURE__ */ jsxs("header", { className: "flex items-center justify-between", children: [
|
|
174
|
+
/* @__PURE__ */ jsx("h2", { className: "text-xl font-semibold text-gray-900", children: "Support Bundles" }),
|
|
175
|
+
totalCount > 0 && /* @__PURE__ */ jsxs("span", { className: "text-sm text-gray-500", children: [
|
|
176
|
+
totalCount,
|
|
177
|
+
" total"
|
|
178
|
+
] })
|
|
179
|
+
] }),
|
|
180
|
+
error && /* @__PURE__ */ jsx("div", { className: "mt-4 rounded-lg bg-red-50 px-3 py-2 text-sm text-red-700", children: error }),
|
|
181
|
+
/* @__PURE__ */ jsx("div", { className: "mt-4", children: bundles.length === 0 ? /* @__PURE__ */ jsx("p", { className: "rounded-2xl border border-dashed border-gray-200 bg-gray-50 px-6 py-10 text-center text-sm text-gray-500", children: "No support bundles have been uploaded yet." }) : /* @__PURE__ */ jsx("div", { className: "overflow-hidden rounded-xl border border-gray-200", children: /* @__PURE__ */ jsxs("table", { className: "min-w-full divide-y divide-gray-200", children: [
|
|
182
|
+
/* @__PURE__ */ jsx("thead", { className: "bg-gray-50", children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
183
|
+
/* @__PURE__ */ jsx("th", { scope: "col", className: "px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500", children: "Instance" }),
|
|
184
|
+
/* @__PURE__ */ jsx("th", { scope: "col", className: "px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500", children: "Date Collected" }),
|
|
185
|
+
/* @__PURE__ */ jsx("th", { scope: "col", className: "px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500", children: "Status" }),
|
|
186
|
+
/* @__PURE__ */ jsx("th", { scope: "col", className: "px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500", children: "Issues" }),
|
|
187
|
+
/* @__PURE__ */ jsx("th", { scope: "col", className: "px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500", children: "Size" }),
|
|
188
|
+
(onDownload || onDelete) && /* @__PURE__ */ jsx("th", { scope: "col", className: "relative px-4 py-3", children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Actions" }) })
|
|
189
|
+
] }) }),
|
|
190
|
+
/* @__PURE__ */ jsx("tbody", { className: "divide-y divide-gray-200 bg-white", children: bundles.map((bundle) => {
|
|
191
|
+
const isDownloading = downloadingId === bundle.id;
|
|
192
|
+
const isDeleting = deletingId === bundle.id;
|
|
193
|
+
const status = bundle.status ?? "uploaded";
|
|
194
|
+
const isUploaded = status === "uploaded";
|
|
195
|
+
return /* @__PURE__ */ jsxs("tr", { children: [
|
|
196
|
+
/* @__PURE__ */ jsx("td", { className: "whitespace-nowrap px-4 py-3 text-sm text-gray-900", children: (bundle.instanceId || bundle.id).slice(0, 7) }),
|
|
197
|
+
/* @__PURE__ */ jsx("td", { className: "whitespace-nowrap px-4 py-3 text-sm text-gray-500", children: bundle.createdAt ? new Date(bundle.createdAt).toLocaleString() : "Unknown" }),
|
|
198
|
+
/* @__PURE__ */ jsx("td", { className: "whitespace-nowrap px-4 py-3", children: /* @__PURE__ */ jsxs(
|
|
199
|
+
"span",
|
|
200
|
+
{
|
|
201
|
+
className: `inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium ${isUploaded ? "bg-green-50 text-green-700" : "bg-yellow-50 text-yellow-700"}`,
|
|
202
|
+
children: [
|
|
203
|
+
isUploaded ? /* @__PURE__ */ jsx(CheckIcon, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx(PendingIcon, { className: "h-3 w-3" }),
|
|
204
|
+
status.charAt(0).toUpperCase() + status.slice(1)
|
|
205
|
+
]
|
|
206
|
+
}
|
|
207
|
+
) }),
|
|
208
|
+
/* @__PURE__ */ jsx("td", { className: "whitespace-nowrap px-4 py-3 text-sm", children: renderIssues(bundle.insights) }),
|
|
209
|
+
/* @__PURE__ */ jsx("td", { className: "whitespace-nowrap px-4 py-3 text-sm text-gray-500", children: bundle.size ? formatBytes(bundle.size) : "\u2014" }),
|
|
210
|
+
(onDownload || onDelete) && /* @__PURE__ */ jsx("td", { className: "whitespace-nowrap px-4 py-3 text-right text-sm font-medium", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-3", children: [
|
|
211
|
+
onDownload && /* @__PURE__ */ jsxs(
|
|
212
|
+
"button",
|
|
213
|
+
{
|
|
214
|
+
type: "button",
|
|
215
|
+
onClick: () => handleDownload(bundle.id),
|
|
216
|
+
disabled: isActionDisabled,
|
|
217
|
+
className: "inline-flex items-center gap-1 text-gray-600 hover:text-gray-900 disabled:opacity-50",
|
|
218
|
+
children: [
|
|
219
|
+
/* @__PURE__ */ jsx(DownloadIcon, { className: "h-4 w-4" }),
|
|
220
|
+
isDownloading ? "Downloading..." : "Download"
|
|
221
|
+
]
|
|
222
|
+
}
|
|
223
|
+
),
|
|
224
|
+
onDelete && /* @__PURE__ */ jsxs(
|
|
225
|
+
"button",
|
|
226
|
+
{
|
|
227
|
+
type: "button",
|
|
228
|
+
onClick: () => handleDeleteClick(bundle),
|
|
229
|
+
disabled: isActionDisabled,
|
|
230
|
+
className: "inline-flex items-center gap-1 text-red-600 hover:text-red-700 disabled:opacity-50",
|
|
231
|
+
children: [
|
|
232
|
+
/* @__PURE__ */ jsx(TrashIcon, { className: "h-4 w-4" }),
|
|
233
|
+
isDeleting ? "Deleting..." : "Delete"
|
|
234
|
+
]
|
|
235
|
+
}
|
|
236
|
+
)
|
|
237
|
+
] }) })
|
|
238
|
+
] }, bundle.id);
|
|
239
|
+
}) })
|
|
240
|
+
] }) }) })
|
|
241
|
+
] }),
|
|
242
|
+
bundleToDelete && /* @__PURE__ */ jsx(
|
|
243
|
+
"div",
|
|
244
|
+
{
|
|
245
|
+
className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50",
|
|
246
|
+
role: "dialog",
|
|
247
|
+
"aria-modal": "true",
|
|
248
|
+
"aria-labelledby": "delete-modal-title",
|
|
249
|
+
children: /* @__PURE__ */ jsxs("div", { className: "w-full max-w-md rounded-2xl bg-white p-6 shadow-xl", children: [
|
|
250
|
+
/* @__PURE__ */ jsx("h3", { id: "delete-modal-title", className: "text-lg font-semibold text-gray-900", children: "Confirm Deletion" }),
|
|
251
|
+
/* @__PURE__ */ jsx("p", { className: "mt-2 text-sm text-gray-600", children: "Are you sure you want to delete this support bundle? This action cannot be undone." }),
|
|
252
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-4 rounded-lg bg-gray-50 p-3 text-sm text-gray-700", children: [
|
|
253
|
+
/* @__PURE__ */ jsxs("div", { className: "mb-1", children: [
|
|
254
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: "Instance ID:" }),
|
|
255
|
+
" ",
|
|
256
|
+
(bundleToDelete.instanceId || bundleToDelete.id).slice(0, 7)
|
|
257
|
+
] }),
|
|
258
|
+
/* @__PURE__ */ jsxs("div", { className: "mb-1", children: [
|
|
259
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: "Date Collected:" }),
|
|
260
|
+
" ",
|
|
261
|
+
bundleToDelete.createdAt ? new Date(bundleToDelete.createdAt).toLocaleString() : "Unknown"
|
|
262
|
+
] }),
|
|
263
|
+
bundleToDelete.size && /* @__PURE__ */ jsxs("div", { className: "mb-1", children: [
|
|
264
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: "Size:" }),
|
|
265
|
+
" ",
|
|
266
|
+
formatBytes(bundleToDelete.size)
|
|
267
|
+
] }),
|
|
268
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
269
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: "Status:" }),
|
|
270
|
+
" ",
|
|
271
|
+
(bundleToDelete.status ?? "uploaded").charAt(0).toUpperCase() + (bundleToDelete.status ?? "uploaded").slice(1)
|
|
272
|
+
] })
|
|
273
|
+
] }),
|
|
274
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-6 flex justify-end gap-3", children: [
|
|
275
|
+
/* @__PURE__ */ jsx(
|
|
276
|
+
"button",
|
|
277
|
+
{
|
|
278
|
+
type: "button",
|
|
279
|
+
onClick: handleDeleteCancel,
|
|
280
|
+
disabled: deletingId !== null,
|
|
281
|
+
className: "rounded-lg bg-gray-100 px-4 py-2 text-sm font-medium text-gray-700 transition hover:bg-gray-200 disabled:opacity-50",
|
|
282
|
+
children: "Cancel"
|
|
283
|
+
}
|
|
284
|
+
),
|
|
285
|
+
/* @__PURE__ */ jsx(
|
|
286
|
+
"button",
|
|
287
|
+
{
|
|
288
|
+
type: "button",
|
|
289
|
+
onClick: handleDeleteConfirm,
|
|
290
|
+
disabled: deletingId !== null,
|
|
291
|
+
className: "rounded-lg px-4 py-2 text-sm font-medium text-white transition hover:opacity-90 disabled:opacity-50",
|
|
292
|
+
style: { backgroundColor: primaryColor },
|
|
293
|
+
children: deletingId !== null ? "Deleting..." : "Delete"
|
|
294
|
+
}
|
|
295
|
+
)
|
|
296
|
+
] })
|
|
297
|
+
] })
|
|
298
|
+
}
|
|
299
|
+
)
|
|
300
|
+
] });
|
|
301
|
+
};
|
|
302
|
+
SupportBundlesCard.displayName = "SupportBundlesCard";
|
|
303
|
+
|
|
304
|
+
export { SupportBundlesCard };
|
|
305
|
+
//# sourceMappingURL=support-bundles-card.js.map
|
|
306
|
+
//# sourceMappingURL=support-bundles-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/support-bundles-card.tsx"],"names":[],"mappings":"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","file":"support-bundles-card.js","sourcesContent":["\"use client\";\n\nimport { useState, useCallback } from \"react\";\nimport type { SupportBundleSummary } from \"../actions\";\n\ninterface SupportBundlesCardProps {\n totalCount: number;\n bundles: SupportBundleSummary[];\n /** Callback to download a bundle. Returns a signed URL. */\n onDownload?: (bundleId: string) => Promise<string>;\n /** Callback to delete a bundle. */\n onDelete?: (bundleId: string) => Promise<void>;\n /** Primary brand color. Defaults to \"#6366f1\". */\n primaryColor?: string;\n}\n\nconst formatBytes = (bytes: number, decimals = 1): string => {\n if (bytes === 0) return \"0 Bytes\";\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\"];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;\n};\n\nconst DownloadIcon = ({ className }: { className?: string }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M12 3v14\" />\n <path d=\"M8 13l4 4 4-4\" />\n <path d=\"M5 21h14\" />\n </svg>\n);\n\nconst TrashIcon = ({ className }: { className?: string }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\" />\n <path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" />\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" />\n </svg>\n);\n\nconst CheckIcon = ({ className }: { className?: string }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9 12l2 2 4-4\" />\n </svg>\n);\n\nconst PendingIcon = ({ className }: { className?: string }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" strokeDasharray=\"4 2\" />\n </svg>\n);\n\nconst AlertTriangleIcon = ({ className }: { className?: string }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n);\n\nexport const SupportBundlesCard = ({\n totalCount,\n bundles,\n onDownload,\n onDelete,\n primaryColor = \"#6366f1\"\n}: SupportBundlesCardProps) => {\n const [downloadingId, setDownloadingId] = useState<string | null>(null);\n const [deletingId, setDeletingId] = useState<string | null>(null);\n const [bundleToDelete, setBundleToDelete] = useState<SupportBundleSummary | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const handleDownload = useCallback(async (bundleId: string) => {\n if (!onDownload) return;\n\n setError(null);\n setDownloadingId(bundleId);\n\n try {\n const signedUrl = await onDownload(bundleId);\n // Trigger download via temporary link\n const link = document.createElement(\"a\");\n link.href = signedUrl;\n link.setAttribute(\"download\", \"\");\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to download bundle\");\n } finally {\n setDownloadingId(null);\n }\n }, [onDownload]);\n\n const handleDeleteClick = useCallback((bundle: SupportBundleSummary) => {\n setBundleToDelete(bundle);\n }, []);\n\n const handleDeleteConfirm = useCallback(async () => {\n if (!onDelete || !bundleToDelete) return;\n\n setError(null);\n setDeletingId(bundleToDelete.id);\n\n try {\n await onDelete(bundleToDelete.id);\n setBundleToDelete(null);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to delete bundle\");\n setBundleToDelete(null);\n } finally {\n setDeletingId(null);\n }\n }, [onDelete, bundleToDelete]);\n\n const handleDeleteCancel = useCallback(() => {\n setBundleToDelete(null);\n }, []);\n\n const isActionDisabled = downloadingId !== null || deletingId !== null;\n\n const renderIssues = (insights: SupportBundleSummary[\"insights\"]) => {\n const errors = insights?.filter((i) => i.level === \"error\")?.length ?? 0;\n const warnings = insights?.filter((i) => i.level === \"warn\")?.length ?? 0;\n\n if (!errors && !warnings) {\n return (\n <span className=\"text-gray-400\">No issues found</span>\n );\n }\n\n return (\n <div className=\"flex items-center gap-2\">\n {errors > 0 && (\n <span className=\"inline-flex items-center gap-1 text-red-600\">\n <AlertTriangleIcon className=\"h-4 w-4\" />\n {errors} {errors === 1 ? \"error\" : \"errors\"}\n </span>\n )}\n {warnings > 0 && (\n <span className=\"inline-flex items-center gap-1 text-yellow-600\">\n <AlertTriangleIcon className=\"h-4 w-4\" />\n {warnings} {warnings === 1 ? \"warning\" : \"warnings\"}\n </span>\n )}\n </div>\n );\n };\n\n return (\n <>\n <section className=\"rounded-3xl border border-gray-100 bg-white p-8 shadow-[0_18px_45px_rgba(17,24,39,0.08)]\">\n <header className=\"flex items-center justify-between\">\n <h2 className=\"text-xl font-semibold text-gray-900\">Support Bundles</h2>\n {totalCount > 0 && (\n <span className=\"text-sm text-gray-500\">{totalCount} total</span>\n )}\n </header>\n\n {error && (\n <div className=\"mt-4 rounded-lg bg-red-50 px-3 py-2 text-sm text-red-700\">\n {error}\n </div>\n )}\n\n <div className=\"mt-4\">\n {bundles.length === 0 ? (\n <p className=\"rounded-2xl border border-dashed border-gray-200 bg-gray-50 px-6 py-10 text-center text-sm text-gray-500\">\n No support bundles have been uploaded yet.\n </p>\n ) : (\n <div className=\"overflow-hidden rounded-xl border border-gray-200\">\n <table className=\"min-w-full divide-y divide-gray-200\">\n <thead className=\"bg-gray-50\">\n <tr>\n <th scope=\"col\" className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500\">\n Instance\n </th>\n <th scope=\"col\" className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500\">\n Date Collected\n </th>\n <th scope=\"col\" className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500\">\n Status\n </th>\n <th scope=\"col\" className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500\">\n Issues\n </th>\n <th scope=\"col\" className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500\">\n Size\n </th>\n {(onDownload || onDelete) && (\n <th scope=\"col\" className=\"relative px-4 py-3\">\n <span className=\"sr-only\">Actions</span>\n </th>\n )}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-200 bg-white\">\n {bundles.map((bundle) => {\n const isDownloading = downloadingId === bundle.id;\n const isDeleting = deletingId === bundle.id;\n const status = bundle.status ?? \"uploaded\";\n const isUploaded = status === \"uploaded\";\n\n return (\n <tr key={bundle.id}>\n <td className=\"whitespace-nowrap px-4 py-3 text-sm text-gray-900\">\n {(bundle.instanceId || bundle.id).slice(0, 7)}\n </td>\n <td className=\"whitespace-nowrap px-4 py-3 text-sm text-gray-500\">\n {bundle.createdAt\n ? new Date(bundle.createdAt).toLocaleString()\n : \"Unknown\"}\n </td>\n <td className=\"whitespace-nowrap px-4 py-3\">\n <span\n className={`inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium ${\n isUploaded\n ? \"bg-green-50 text-green-700\"\n : \"bg-yellow-50 text-yellow-700\"\n }`}\n >\n {isUploaded ? (\n <CheckIcon className=\"h-3 w-3\" />\n ) : (\n <PendingIcon className=\"h-3 w-3\" />\n )}\n {status.charAt(0).toUpperCase() + status.slice(1)}\n </span>\n </td>\n <td className=\"whitespace-nowrap px-4 py-3 text-sm\">\n {renderIssues(bundle.insights)}\n </td>\n <td className=\"whitespace-nowrap px-4 py-3 text-sm text-gray-500\">\n {bundle.size ? formatBytes(bundle.size) : \"—\"}\n </td>\n {(onDownload || onDelete) && (\n <td className=\"whitespace-nowrap px-4 py-3 text-right text-sm font-medium\">\n <div className=\"flex items-center justify-end gap-3\">\n {onDownload && (\n <button\n type=\"button\"\n onClick={() => handleDownload(bundle.id)}\n disabled={isActionDisabled}\n className=\"inline-flex items-center gap-1 text-gray-600 hover:text-gray-900 disabled:opacity-50\"\n >\n <DownloadIcon className=\"h-4 w-4\" />\n {isDownloading ? \"Downloading...\" : \"Download\"}\n </button>\n )}\n {onDelete && (\n <button\n type=\"button\"\n onClick={() => handleDeleteClick(bundle)}\n disabled={isActionDisabled}\n className=\"inline-flex items-center gap-1 text-red-600 hover:text-red-700 disabled:opacity-50\"\n >\n <TrashIcon className=\"h-4 w-4\" />\n {isDeleting ? \"Deleting...\" : \"Delete\"}\n </button>\n )}\n </div>\n </td>\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n )}\n </div>\n </section>\n\n {/* Delete Confirmation Modal */}\n {bundleToDelete && (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"delete-modal-title\"\n >\n <div className=\"w-full max-w-md rounded-2xl bg-white p-6 shadow-xl\">\n <h3 id=\"delete-modal-title\" className=\"text-lg font-semibold text-gray-900\">\n Confirm Deletion\n </h3>\n <p className=\"mt-2 text-sm text-gray-600\">\n Are you sure you want to delete this support bundle? This action cannot be undone.\n </p>\n <div className=\"mt-4 rounded-lg bg-gray-50 p-3 text-sm text-gray-700\">\n <div className=\"mb-1\">\n <span className=\"font-medium\">Instance ID:</span>{\" \"}\n {(bundleToDelete.instanceId || bundleToDelete.id).slice(0, 7)}\n </div>\n <div className=\"mb-1\">\n <span className=\"font-medium\">Date Collected:</span>{\" \"}\n {bundleToDelete.createdAt\n ? new Date(bundleToDelete.createdAt).toLocaleString()\n : \"Unknown\"}\n </div>\n {bundleToDelete.size && (\n <div className=\"mb-1\">\n <span className=\"font-medium\">Size:</span> {formatBytes(bundleToDelete.size)}\n </div>\n )}\n <div>\n <span className=\"font-medium\">Status:</span>{\" \"}\n {(bundleToDelete.status ?? \"uploaded\").charAt(0).toUpperCase() +\n (bundleToDelete.status ?? \"uploaded\").slice(1)}\n </div>\n </div>\n <div className=\"mt-6 flex justify-end gap-3\">\n <button\n type=\"button\"\n onClick={handleDeleteCancel}\n disabled={deletingId !== null}\n className=\"rounded-lg bg-gray-100 px-4 py-2 text-sm font-medium text-gray-700 transition hover:bg-gray-200 disabled:opacity-50\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleDeleteConfirm}\n disabled={deletingId !== null}\n className=\"rounded-lg px-4 py-2 text-sm font-medium text-white transition hover:opacity-90 disabled:opacity-50\"\n style={{ backgroundColor: primaryColor }}\n >\n {deletingId !== null ? \"Deleting...\" : \"Delete\"}\n </button>\n </div>\n </div>\n </div>\n )}\n </>\n );\n};\n\nSupportBundlesCard.displayName = \"SupportBundlesCard\";\n"]}
|