@cobaltcore-dev/aurora 1.1.0 → 1.3.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 +59 -9
- package/dist/client/App.d.ts +2 -2
- package/dist/client/AuroraApp.d.ts +33 -13
- package/dist/client/{AuthProvider-BS5OVv8n.mjs → AuthProvider-CVSAwW9f.mjs} +22 -8
- package/dist/client/AuthProvider-CVSAwW9f.mjs.map +1 -0
- package/dist/client/{ContentHeader-BHMUzd9H.mjs → ContentHeader-CPJbgYWn.mjs} +18 -18
- package/dist/client/{ContentHeader-BHMUzd9H.mjs.map → ContentHeader-CPJbgYWn.mjs.map} +1 -1
- package/dist/client/DeleteFlavorModal-V44QCJBd.mjs +773 -0
- package/dist/client/DeleteFlavorModal-V44QCJBd.mjs.map +1 -0
- package/dist/client/DynamicBreadcrumbContext-CVcUQFou.mjs +26 -0
- package/dist/client/DynamicBreadcrumbContext-CVcUQFou.mjs.map +1 -0
- package/dist/client/{FiltersInput-B8CNBg1L.mjs → FiltersInput-CKI6zWnm.mjs} +18 -18
- package/dist/client/{FiltersInput-B8CNBg1L.mjs.map → FiltersInput-CKI6zWnm.mjs.map} +1 -1
- package/dist/client/FloatingIpActionModals-Ch8uozH9.mjs +466 -0
- package/dist/client/FloatingIpActionModals-Ch8uozH9.mjs.map +1 -0
- package/dist/client/ImageToastNotifications-m6c3tVPb.mjs +1152 -0
- package/dist/client/ImageToastNotifications-m6c3tVPb.mjs.map +1 -0
- package/dist/client/SortInput-4g7nSTHW.mjs +34 -0
- package/dist/client/SortInput-4g7nSTHW.mjs.map +1 -0
- package/dist/client/{TwoColumnDescriptionList-DiDx3PnH.mjs → TwoColumnDescriptionList-DKS42RKa.mjs} +10 -4
- package/dist/client/TwoColumnDescriptionList-DKS42RKa.mjs.map +1 -0
- package/dist/client/_-CAsCx-Ay.mjs +6 -0
- package/dist/client/_-CAsCx-Ay.mjs.map +1 -0
- package/dist/client/_auth-SrDjHL6j.mjs +12 -0
- package/dist/client/_auth-SrDjHL6j.mjs.map +1 -0
- package/dist/client/{_flavorId-BN_qessZ.mjs → _flavorId-Dg7MS0Af.mjs} +3 -9
- package/dist/client/_flavorId-Dg7MS0Af.mjs.map +1 -0
- package/dist/client/_flavorId-kHl-b8rI.mjs +232 -0
- package/dist/client/_flavorId-kHl-b8rI.mjs.map +1 -0
- package/dist/client/{_floatingIpId-CwDGHkWm.mjs → _floatingIpId-C9xfRWot.mjs} +3 -9
- package/dist/client/_floatingIpId-C9xfRWot.mjs.map +1 -0
- package/dist/client/_floatingIpId-DNn6ABCB.mjs +196 -0
- package/dist/client/_floatingIpId-DNn6ABCB.mjs.map +1 -0
- package/dist/client/_imageId-8JIbFmGB.mjs +39 -0
- package/dist/client/_imageId-8JIbFmGB.mjs.map +1 -0
- package/dist/client/{_imageId-BtJ7GmYB.mjs → _imageId-BBAlRioC.mjs} +217 -201
- package/dist/client/_imageId-BBAlRioC.mjs.map +1 -0
- package/dist/client/{_projectId-Byt3GQDW.mjs → _projectId-7Nl1MQTJ.mjs} +5 -5
- package/dist/client/_projectId-7Nl1MQTJ.mjs.map +1 -0
- package/dist/client/_projectId-B3wmSala.mjs +281 -0
- package/dist/client/_projectId-B3wmSala.mjs.map +1 -0
- package/dist/client/_projectId-DPzv0CCp.mjs +77 -0
- package/dist/client/_projectId-DPzv0CCp.mjs.map +1 -0
- package/dist/client/_projectId-DfeVJy0G.mjs +30 -0
- package/dist/client/_projectId-DfeVJy0G.mjs.map +1 -0
- package/dist/client/{_securityGroupId-BcbkRhsN.mjs → _securityGroupId-C6eHmrx_.mjs} +3 -9
- package/dist/client/_securityGroupId-C6eHmrx_.mjs.map +1 -0
- package/dist/client/_securityGroupId-DmplhDgt.mjs +1810 -0
- package/dist/client/_securityGroupId-DmplhDgt.mjs.map +1 -0
- package/dist/client/_serviceType-DS8DxsrP.mjs +20 -0
- package/dist/client/_serviceType-DS8DxsrP.mjs.map +1 -0
- package/dist/client/_serviceType-M8d9rOT6.mjs +6 -0
- package/dist/client/_serviceType-M8d9rOT6.mjs.map +1 -0
- package/dist/client/_storageType-BRWWJtow.mjs +14 -0
- package/dist/client/_storageType-BRWWJtow.mjs.map +1 -0
- package/dist/client/_storageType-C5gS9eut.mjs +845 -0
- package/dist/client/_storageType-C5gS9eut.mjs.map +1 -0
- package/dist/client/_storageType-CzZ4u9x_.mjs +12 -0
- package/dist/client/_storageType-CzZ4u9x_.mjs.map +1 -0
- package/dist/client/_storageType-zeSZe--V.mjs.map +1 -1
- package/dist/client/{about-_73VmpTB.mjs → about-BmQTyLWc.mjs} +2 -2
- package/dist/client/{about-_73VmpTB.mjs.map → about-BmQTyLWc.mjs.map} +1 -1
- package/dist/client/{aurora-EbwGRLLf.mjs → aurora-CIml-f2f.mjs} +2 -2
- package/dist/client/{aurora-EbwGRLLf.mjs.map → aurora-CIml-f2f.mjs.map} +1 -1
- package/dist/client/{build-C_4vRMCq.mjs → build-WuxXRAqf.mjs} +121 -24
- package/dist/client/{build-C_4vRMCq.mjs.map → build-WuxXRAqf.mjs.map} +1 -1
- package/dist/client/components/Breadcrumbs.d.ts +1 -0
- package/dist/client/components/ListToolbar/SortInput.d.ts +3 -0
- package/dist/client/context/BreadcrumbExtensionContext.d.ts +9 -0
- package/dist/client/context/DynamicBreadcrumbContext.d.ts +9 -0
- package/dist/client/{flavors-CiHCYrtZ.mjs → flavors-B1SDOPDu.mjs} +3 -5
- package/dist/client/flavors-B1SDOPDu.mjs.map +1 -0
- package/dist/client/flavors-D8_PzQUB.mjs +628 -0
- package/dist/client/flavors-D8_PzQUB.mjs.map +1 -0
- package/dist/client/flavors-DWMZ6TuJ.mjs.map +1 -1
- package/dist/client/floatingips-Cz9k80cc.mjs +8 -0
- package/dist/client/floatingips-Cz9k80cc.mjs.map +1 -0
- package/dist/client/floatingips-DrCvtXtT.mjs +551 -0
- package/dist/client/floatingips-DrCvtXtT.mjs.map +1 -0
- package/dist/client/hooks/useBreadcrumbs.d.ts +16 -0
- package/dist/client/hooks/usePushBreadcrumbs.d.ts +10 -0
- package/dist/client/hooks/useSetBreadcrumb.d.ts +11 -0
- package/dist/client/{hooks-LutR2Yg3.mjs → hooks-D0yKIumu.mjs} +2 -2
- package/dist/client/{hooks-LutR2Yg3.mjs.map → hooks-D0yKIumu.mjs.map} +1 -1
- package/dist/client/images-BGQv9kKT.mjs +1983 -0
- package/dist/client/images-BGQv9kKT.mjs.map +1 -0
- package/dist/client/{images-CS4kZQyu.mjs → images-CPmMa4SQ.mjs} +3 -5
- package/dist/client/images-CPmMa4SQ.mjs.map +1 -0
- package/dist/client/images-NBf2bV43.mjs.map +1 -1
- package/dist/client/index.d.ts +7 -3
- package/dist/client/index.js +549 -535
- package/dist/client/index.js.map +1 -1
- package/dist/client/objects-AERkhfiM.mjs +66 -0
- package/dist/client/objects-AERkhfiM.mjs.map +1 -0
- package/dist/client/{objects-C3azvW8m.mjs → objects-BR3eeSNH.mjs} +7087 -4211
- package/dist/client/objects-BR3eeSNH.mjs.map +1 -0
- package/dist/client/objects-DVccbrL1.mjs +66 -0
- package/dist/client/objects-DVccbrL1.mjs.map +1 -0
- package/dist/client/projects-yiK0HGSA.mjs.map +1 -1
- package/dist/client/routeInfo-DP3v74Wg.mjs +19 -0
- package/dist/client/routeInfo-DP3v74Wg.mjs.map +1 -0
- package/dist/client/router.d.ts +2 -2
- package/dist/client/{routes-CdDm-hhO.mjs → routes-CJj7SR_K.mjs} +2 -2
- package/dist/client/routes-CJj7SR_K.mjs.map +1 -0
- package/dist/client/routes-xofA3ksU.mjs +110 -0
- package/dist/client/routes-xofA3ksU.mjs.map +1 -0
- package/dist/client/securitygroups-BjhgLBHm.mjs +620 -0
- package/dist/client/securitygroups-BjhgLBHm.mjs.map +1 -0
- package/dist/client/securitygroups-CtKne8UQ.mjs +8 -0
- package/dist/client/securitygroups-CtKne8UQ.mjs.map +1 -0
- package/dist/client/{securitygroups-Byte-iSp.mjs → securitygroups-DEJQBcxm.mjs} +3 -5
- package/dist/client/securitygroups-DEJQBcxm.mjs.map +1 -0
- package/dist/client/trpcClient.d.ts +135 -3
- package/dist/client/useBreadcrumbs-ha3IlaxX.mjs +54 -0
- package/dist/client/useBreadcrumbs-ha3IlaxX.mjs.map +1 -0
- package/dist/client/useModalTracking-BcOKTYRN.mjs +33 -0
- package/dist/client/useModalTracking-BcOKTYRN.mjs.map +1 -0
- package/dist/client/{useSecurityGroupPermissions-C29mzb3b.mjs → useSecurityGroupPermissions-BOyLQLdC.mjs} +85 -19
- package/dist/client/useSecurityGroupPermissions-BOyLQLdC.mjs.map +1 -0
- package/dist/client/useSetBreadcrumb-tn7lBaQV.mjs +19 -0
- package/dist/client/useSetBreadcrumb-tn7lBaQV.mjs.map +1 -0
- package/dist/client/utils/formatSwiftDate.d.ts +30 -0
- package/dist/server/index.d.ts +136 -4
- package/dist/server/index.js +845 -260
- package/package.json +37 -36
- package/dist/client/AuthProvider-BS5OVv8n.mjs.map +0 -1
- package/dist/client/DeleteFlavorModal-BP83t9zX.mjs +0 -721
- package/dist/client/DeleteFlavorModal-BP83t9zX.mjs.map +0 -1
- package/dist/client/FloatingIpActionModals-BraiJWBi.mjs +0 -417
- package/dist/client/FloatingIpActionModals-BraiJWBi.mjs.map +0 -1
- package/dist/client/ImageToastNotifications-BXMHJaIH.mjs +0 -1131
- package/dist/client/ImageToastNotifications-BXMHJaIH.mjs.map +0 -1
- package/dist/client/RouteError-hAF8_jbe.mjs +0 -25
- package/dist/client/RouteError-hAF8_jbe.mjs.map +0 -1
- package/dist/client/SortInput-Cqs2poV3.mjs +0 -34
- package/dist/client/SortInput-Cqs2poV3.mjs.map +0 -1
- package/dist/client/StatusError-C5KodQOq.mjs +0 -39
- package/dist/client/StatusError-C5KodQOq.mjs.map +0 -1
- package/dist/client/TwoColumnDescriptionList-DiDx3PnH.mjs.map +0 -1
- package/dist/client/_auth-DJ9wHZaj.mjs +0 -11
- package/dist/client/_auth-DJ9wHZaj.mjs.map +0 -1
- package/dist/client/_flavorId-BN_qessZ.mjs.map +0 -1
- package/dist/client/_flavorId-CJjEB_Ao.mjs +0 -210
- package/dist/client/_flavorId-CJjEB_Ao.mjs.map +0 -1
- package/dist/client/_floatingIpId-CwDGHkWm.mjs.map +0 -1
- package/dist/client/_floatingIpId-foMIwbE4.mjs +0 -215
- package/dist/client/_floatingIpId-foMIwbE4.mjs.map +0 -1
- package/dist/client/_imageId-BtJ7GmYB.mjs.map +0 -1
- package/dist/client/_projectId-BmtCuzJu.mjs +0 -29
- package/dist/client/_projectId-BmtCuzJu.mjs.map +0 -1
- package/dist/client/_projectId-Byt3GQDW.mjs.map +0 -1
- package/dist/client/_projectId-NYk1IN_a.mjs +0 -291
- package/dist/client/_projectId-NYk1IN_a.mjs.map +0 -1
- package/dist/client/_projectId-QueiFczy.mjs +0 -46
- package/dist/client/_projectId-QueiFczy.mjs.map +0 -1
- package/dist/client/_securityGroupId-BcbkRhsN.mjs.map +0 -1
- package/dist/client/_securityGroupId-pPtJsCoe.mjs +0 -1797
- package/dist/client/_securityGroupId-pPtJsCoe.mjs.map +0 -1
- package/dist/client/_storageType-BmqrU06i.mjs +0 -2202
- package/dist/client/_storageType-BmqrU06i.mjs.map +0 -1
- package/dist/client/components/Error/StatusError.d.ts +0 -11
- package/dist/client/components/ProjectView/ProjectInfoBox.d.ts +0 -12
- package/dist/client/flavors-CiHCYrtZ.mjs.map +0 -1
- package/dist/client/flavors-DY-bDc8l.mjs +0 -650
- package/dist/client/flavors-DY-bDc8l.mjs.map +0 -1
- package/dist/client/floatingips-Ci4jHkaG.mjs +0 -591
- package/dist/client/floatingips-Ci4jHkaG.mjs.map +0 -1
- package/dist/client/images-91U7tr9Y2.mjs +0 -1976
- package/dist/client/images-91U7tr9Y2.mjs.map +0 -1
- package/dist/client/images-CS4kZQyu.mjs.map +0 -1
- package/dist/client/objects-C3azvW8m.mjs.map +0 -1
- package/dist/client/objects-CM265S6b.mjs +0 -56
- package/dist/client/objects-CM265S6b.mjs.map +0 -1
- package/dist/client/objects-EE9Cd1wI.mjs +0 -56
- package/dist/client/objects-EE9Cd1wI.mjs.map +0 -1
- package/dist/client/routeInfo-DXqB2HCf.mjs +0 -32
- package/dist/client/routeInfo-DXqB2HCf.mjs.map +0 -1
- package/dist/client/routes-CBd8CCuM.mjs +0 -115
- package/dist/client/routes-CBd8CCuM.mjs.map +0 -1
- package/dist/client/routes-CdDm-hhO.mjs.map +0 -1
- package/dist/client/securitygroups-Bd_uV4S9.mjs +0 -595
- package/dist/client/securitygroups-Bd_uV4S9.mjs.map +0 -1
- package/dist/client/securitygroups-Byte-iSp.mjs.map +0 -1
- package/dist/client/useSecurityGroupPermissions-C29mzb3b.mjs.map +0 -1
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { C as e, S as t, b as n, n as r, t as i, v as a, x as o } from "./objects-BR3eeSNH.mjs";
|
|
2
|
+
import { t as s } from "./useSetBreadcrumb-tn7lBaQV.mjs";
|
|
3
|
+
import { Fragment as c, jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
4
|
+
import { useParams as d } from "@tanstack/react-router";
|
|
5
|
+
import { Trans as f } from "@lingui/react";
|
|
6
|
+
import { ErrorBoundary as p } from "react-error-boundary";
|
|
7
|
+
//#region src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/index.tsx?tsr-split=component
|
|
8
|
+
function m() {
|
|
9
|
+
let { projectId: m, provider: h, containerName: g } = d({
|
|
10
|
+
from: "/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/",
|
|
11
|
+
select: (e) => ({
|
|
12
|
+
projectId: e.projectId,
|
|
13
|
+
provider: e.provider,
|
|
14
|
+
containerName: e.containerName
|
|
15
|
+
})
|
|
16
|
+
});
|
|
17
|
+
s(i.id, g);
|
|
18
|
+
let { prefix: _, sortBy: v, sortDirection: y, search: b, view: x } = i.useSearch();
|
|
19
|
+
return /*#__PURE__*/ u(c, { children: [
|
|
20
|
+
h === "ceph" && /*#__PURE__*/ l(a, { bucketName: g }),
|
|
21
|
+
h === "swift" && /*#__PURE__*/ l(r, { containerName: g }),
|
|
22
|
+
/*#__PURE__*/ l("div", {
|
|
23
|
+
className: h === "swift" ? "pt-4" : void 0,
|
|
24
|
+
children: m ? /*#__PURE__*/ l(p, {
|
|
25
|
+
resetKeys: [
|
|
26
|
+
m,
|
|
27
|
+
h,
|
|
28
|
+
g,
|
|
29
|
+
_,
|
|
30
|
+
v,
|
|
31
|
+
y,
|
|
32
|
+
b,
|
|
33
|
+
x
|
|
34
|
+
],
|
|
35
|
+
fallback: /*#__PURE__*/ l("div", {
|
|
36
|
+
className: "p-4 text-center",
|
|
37
|
+
children: /*#__PURE__*/ l(f, { id: "diFNkW" })
|
|
38
|
+
}),
|
|
39
|
+
children: (() => {
|
|
40
|
+
switch (h) {
|
|
41
|
+
case "swift": return /*#__PURE__*/ l(e, {
|
|
42
|
+
provider: h,
|
|
43
|
+
containerName: g
|
|
44
|
+
});
|
|
45
|
+
case "ceph": return l(x === "lifecycle-rules" ? n : x === "cors-rules" ? o : t, { bucketName: g });
|
|
46
|
+
default: return /*#__PURE__*/ l("div", {
|
|
47
|
+
className: "p-4",
|
|
48
|
+
children: /*#__PURE__*/ l(f, {
|
|
49
|
+
id: "ubUrot",
|
|
50
|
+
values: { containerName: g }
|
|
51
|
+
})
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
})()
|
|
55
|
+
}) : /*#__PURE__*/ l("div", {
|
|
56
|
+
className: "p-4 text-center",
|
|
57
|
+
children: /*#__PURE__*/ l(f, { id: "Z2fZGD" })
|
|
58
|
+
})
|
|
59
|
+
})
|
|
60
|
+
] });
|
|
61
|
+
}
|
|
62
|
+
var h = () => /*#__PURE__*/ l(m, {});
|
|
63
|
+
//#endregion
|
|
64
|
+
export { m as ObjectsDashboard, h as component };
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=objects-DVccbrL1.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"objects-DVccbrL1.mjs","names":["useParams","ErrorBoundary","Trans","SwiftObjects","CephObjects","CephCorsRules","CephLifecycleRules","BucketHeader","ContainerHeader","useSetBreadcrumb","Route","ObjectsDashboard","projectId","provider","containerName","from","select","params","id","prefix","sortBy","sortDirection","search","view","useSearch","undefined","SplitComponent","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/index.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute, useParams } from \"@tanstack/react-router\"\nimport { checkServiceAvailability } from \"../../../../-components/utils/serviceAvailability\"\nimport { ErrorBoundary } from \"react-error-boundary\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { SwiftObjects } from \"../../../../-components/Swift/Objects\"\nimport { CephObjects } from \"../../../../-components/Ceph/Objects\"\nimport { CephCorsRules, CephLifecycleRules } from \"../../../../-components/Ceph/Buckets\"\nimport { z } from \"zod\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { BucketHeader } from \"../../../../-components/Ceph/Buckets/BucketHeader\"\nimport { ContainerHeader } from \"../../../../-components/Swift/Containers/ContainerHeader\"\nimport { useSetBreadcrumb } from \"@/client/hooks/useSetBreadcrumb\"\n\n// Search params schema\n// - prefix: base64-encoded current folder path, safe to carry \"/\" chars in the URL\n// - sortBy: active sort column key — persisted so deep links and back navigation restore sort state\n// Accepts both Swift keys (last_modified, bytes) and Ceph keys (lastModified, size) for compatibility\n// - sortDirection: \"asc\" | \"desc\" — persisted alongside sortBy\n// - view: tab selection for Ceph bucket details page (overview shows objects, cors-rules shows CORS config, lifecycle-rules shows lifecycle config)\n// - corsSortBy: active sort column for CORS rules tab (ID, AllowedOrigins, etc.) — separate from objects sortBy\n// - corsSortDirection: \"asc\" | \"desc\" for CORS rules — separate from objects sortDirection\n// - corsSearch: search term for filtering CORS rules by Rule ID — separate from objects search\n// - lifecycleSortBy: active sort column for lifecycle rules tab (ID, Status, Expiration) — separate from objects sortBy\n// - lifecycleSortDirection: \"asc\" | \"desc\" for lifecycle rules — separate from objects sortDirection\n// - lifecycleSearch: search term for filtering lifecycle rules by Rule ID — separate from objects search\nconst objectsSearchSchema = z.object({\n prefix: z.string().optional(),\n sortBy: z.enum([\"name\", \"last_modified\", \"bytes\", \"lastModified\", \"size\"]).optional().default(\"name\"),\n sortDirection: z.enum([\"asc\", \"desc\"]).optional().default(\"asc\"),\n search: z.string().optional(),\n tab: z.enum([\"all\", \"deleted\"]).optional().default(\"all\"),\n view: z.enum([\"overview\", \"cors-rules\", \"lifecycle-rules\"]).optional().default(\"overview\"),\n corsSortBy: z\n .enum([\"ID\", \"AllowedOrigins\", \"AllowedMethods\", \"AllowedHeaders\", \"ExposeHeaders\", \"MaxAgeSeconds\"])\n .optional()\n .default(\"ID\"),\n corsSortDirection: z.enum([\"asc\", \"desc\"]).optional().default(\"asc\"),\n corsSearch: z.string().optional(),\n lifecycleSortBy: z.enum([\"ID\", \"Status\", \"Expiration\"]).optional().default(\"ID\"),\n lifecycleSortDirection: z.enum([\"asc\", \"desc\"]).optional().default(\"asc\"),\n lifecycleSearch: z.string().optional(),\n})\n\nexport const Route = createFileRoute(\n \"/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/\"\n)({\n staticData: {\n section: \"storage\",\n service: \"containers\",\n analytics: {\n name: \"storage.objectstore.detail\",\n },\n } satisfies RouteInfo,\n validateSearch: objectsSearchSchema,\n head: ({ match }) => ({\n meta: [{ title: match.params.containerName }],\n }),\n component: () => {\n return <ObjectsDashboard />\n },\n notFoundComponent: () => {\n return (\n <p>\n <Trans>Storage container not found</Trans>\n </p>\n )\n },\n loader: async ({ context }) => {\n const { trpcClient } = context\n const availableServices = await trpcClient?.auth.getAvailableServices.query()\n\n return {\n client: trpcClient,\n availableServices,\n }\n },\n beforeLoad: async ({ context, params }) => {\n const { trpcClient } = context\n const availableServices = await trpcClient?.auth.getAvailableServices.query()\n checkServiceAvailability(availableServices!, params)\n },\n})\n\nexport function ObjectsDashboard() {\n const { projectId, provider, containerName } = useParams({\n from: \"/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/\",\n select: (params) => ({\n projectId: params.projectId,\n provider: params.provider,\n containerName: params.containerName,\n }),\n })\n\n useSetBreadcrumb(Route.id, containerName)\n\n const { prefix, sortBy, sortDirection, search, view } = Route.useSearch()\n\n return (\n <>\n {provider === \"ceph\" && <BucketHeader bucketName={containerName} />}\n {provider === \"swift\" && <ContainerHeader containerName={containerName} />}\n {/* Ceph gets extra breathing room below its header from BucketHeader's own\n tabs block; Swift has no such block, so pad the content wrapper directly\n to avoid the overflow menu sitting too close to the toolbar below it. */}\n <div className={provider === \"swift\" ? \"pt-4\" : undefined}>\n {projectId ? (\n <ErrorBoundary\n resetKeys={[projectId, provider, containerName, prefix, sortBy, sortDirection, search, view]}\n fallback={\n <div className=\"p-4 text-center\">\n <Trans>Error loading component</Trans>\n </div>\n }\n >\n {(() => {\n switch (provider) {\n case \"swift\":\n return <SwiftObjects provider={provider} containerName={containerName} />\n case \"ceph\":\n if (view === \"lifecycle-rules\") {\n return <CephLifecycleRules bucketName={containerName} />\n }\n if (view === \"cors-rules\") {\n return <CephCorsRules bucketName={containerName} />\n }\n return <CephObjects bucketName={containerName} />\n default:\n return (\n <div className=\"p-4\">\n <Trans>Objects: {containerName}</Trans>\n </div>\n )\n }\n })()}\n </ErrorBoundary>\n ) : (\n <div className=\"p-4 text-center\">\n <Trans>No project selected</Trans>\n </div>\n )}\n </div>\n </>\n )\n}\n"],"mappings":";;;;;;;AAmFA,SAAgBW,IAAAA;CACd,IAAM,EAAEC,cAAWC,aAAUC,qBAAkBd,EAAU;EACvDe,MAAM;EACNC,SAASC,OAAY;GACnBL,WAAWK,EAAOL;GAClBC,UAAUI,EAAOJ;GACjBC,eAAeG,EAAOH;EACxB;CACF,CAAA;CAEAL,EAAiBC,EAAMQ,IAAIJ,CAAAA;CAE3B,IAAM,EAAEK,WAAQC,WAAQC,kBAAeC,WAAQC,YAASb,EAAMc,UAAS;CAEvE,OACE,gBAAA,GAAA,EAAA,UAAA;EACGX,MAAa,UAAU,gBAAC,GAAA,EAAa,YAAYC,EAAAA,CAAAA;EACjDD,MAAa,WAAW,gBAAC,GAAA,EAA+BC,iBAAAA,CAAAA;EAIzD,gBAAC,OAAA;GAAI,WAAWD,MAAa,UAAU,SAASY,KAAAA;GAC7Cb,UAAAA,IACC,gBAAC,GAAA;IACC,WAAW;KAACA;KAAWC;KAAUC;KAAeK;KAAQC;KAAQC;KAAeC;KAAQC;IAAK;IAC5F,UACE,gBAAC,OAAA;KAAI,WAAU;KACb,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAIH,iBAAC;KACA,QAAQV,GAAR;MACE,KAAK,SACH,OAAO,gBAAC,GAAA;OAAuBA;OAAyBC;;MAC1D,KAAK,QAOH,OALS,EADLS,MAAS,oBACH,IAENA,MAAS,eACH,IAEF,GALE,EAAmB,YAAYT,EAAAA,CAAAA;MAM3C,SACE,OACE,gBAAC,OAAA;OAAI,WAAU;OACb,UAAA,gBAAA,GAAA;;QAAiBA,QAAAA,EAAAA,iBAAAA;;;KAGzB;IACF,EAAA,CAAA;GAGF,CAAA,IAAA,gBAAC,OAAA;IAAI,WAAU;IACb,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;;;AAMZ;AAAC,IAAAY,UArFU,gBAAC,GAAA,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects-yiK0HGSA.mjs","names":["ProjectsContentProps","search","SplitNotFoundComponent","notFoundComponent"],"sources":["../../src/client/routes/_auth/projects/index.tsx?tsr-split=notFoundComponent"],"sourcesContent":["import { Suspense } from \"react\"\nimport { ErrorBoundary } from \"react-error-boundary\"\nimport { createFileRoute, useRouteContext } from \"@tanstack/react-router\"\nimport { ProjectsOverviewNavBar } from \"@/client/routes/_auth/projects/-components/ProjectOverviewNavBar\"\nimport { ProjectCardView } from \"@/client/routes/_auth/projects/-components/ProjectCardView\"\nimport { RouteError } from \"@/client/components/Error/RouteError\"\nimport { TRPCClientError } from \"@trpc/client\"\nimport { Container, ContentHeading,
|
|
1
|
+
{"version":3,"file":"projects-yiK0HGSA.mjs","names":["ProjectsContentProps","search","SplitNotFoundComponent","notFoundComponent"],"sources":["../../src/client/routes/_auth/projects/index.tsx?tsr-split=notFoundComponent"],"sourcesContent":["import { Suspense } from \"react\"\nimport { ErrorBoundary } from \"react-error-boundary\"\nimport { createFileRoute, useRouteContext } from \"@tanstack/react-router\"\nimport { ProjectsOverviewNavBar } from \"@/client/routes/_auth/projects/-components/ProjectOverviewNavBar\"\nimport { ProjectCardView } from \"@/client/routes/_auth/projects/-components/ProjectCardView\"\nimport { RouteError } from \"@/client/components/Error/RouteError\"\nimport { TRPCClientError } from \"@trpc/client\"\nimport { Container, ContentHeading, Status } from \"@cloudoperators/juno-ui-components\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { z } from \"zod\"\nimport { Slot } from \"@/client/components/Slot\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\n\nconst searchSchema = z.object({\n search: z.string().optional(),\n})\n\nexport const Route = createFileRoute(\"/_auth/projects/\")({\n staticData: {\n analytics: {\n name: \"projects.list\",\n },\n } satisfies RouteInfo,\n component: ProjectsOverview,\n notFoundComponent: () => {\n return <p>Projects not found</p>\n },\n validateSearch: searchSchema,\n})\n\ninterface ProjectsContentProps {\n search: string\n}\n\nfunction ProjectsContent({ search }: ProjectsContentProps) {\n const [allProjects] = trpcReact.project.getAuthProjects.useSuspenseQuery()\n\n const normalizedSearch = search.trim().toLowerCase()\n const projects =\n allProjects && normalizedSearch\n ? allProjects.filter(\n (project) =>\n project.name?.toLowerCase().includes(normalizedSearch) ||\n project.description?.toLowerCase().includes(normalizedSearch)\n )\n : allProjects\n\n return <ProjectCardView projects={projects} />\n}\n\nexport function ProjectsOverview() {\n const { search = \"\" } = Route.useSearch()\n const navigate = Route.useNavigate()\n const { slots } = useRouteContext({ strict: false })\n const { t } = useLingui()\n\n const handleSearch = (value: string) => {\n navigate({ search: (prev) => ({ ...prev, search: value || undefined }), replace: true })\n }\n\n return (\n <Container py>\n <ContentHeading className=\"pb-4\">\n <Trans>Projects</Trans>\n </ContentHeading>\n {slots?.projectsBanner && (\n <ErrorBoundary fallbackRender={() => null}>\n <Suspense fallback={null}>\n <Slot component={slots.projectsBanner} useShadowDOM={false} />\n </Suspense>\n </ErrorBoundary>\n )}\n <ErrorBoundary\n fallbackRender={({ error }) => (\n <RouteError error={error} safeErrorMessage={error instanceof TRPCClientError ? error.message : undefined} />\n )}\n >\n <ProjectsOverviewNavBar searchTerm={search} onSearch={handleSearch} />\n <div className=\"pt-5\">\n <Suspense fallback={<Status status=\"progress\" title={t`Loading...`} />}>\n <ProjectsContent search={search} />\n </Suspense>\n </div>\n </ErrorBoundary>\n </Container>\n )\n}\n"],"mappings":";;AAiCC,IAAAE,UAPU,gBAAC,KAAA,EAAE,UAAA,qBAAA,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { z as e } from "zod";
|
|
2
|
+
//#region src/client/routes/routeInfo.ts
|
|
3
|
+
var t = e.object({
|
|
4
|
+
text: e.custom().optional(),
|
|
5
|
+
to: e.string().optional(),
|
|
6
|
+
icon: e.string().optional()
|
|
7
|
+
}), n = e.object({ name: e.string() }), r = e.object({
|
|
8
|
+
section: e.string().optional(),
|
|
9
|
+
service: e.string().optional(),
|
|
10
|
+
crumb: t.optional(),
|
|
11
|
+
analytics: n.optional()
|
|
12
|
+
});
|
|
13
|
+
function i(e) {
|
|
14
|
+
return r.safeParse(e).success;
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
export { i as t };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=routeInfo-DP3v74Wg.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routeInfo-DP3v74Wg.mjs","names":["z","CrumbSchema","object","text","custom","optional","to","string","icon","AnalyticsSchema","name","RouteInfoSchema","section","service","crumb","analytics","isRouteInfo","data","safeParse","success"],"sources":["../../src/client/routes/routeInfo.ts"],"sourcesContent":["import { z } from \"zod\"\nimport type { MessageDescriptor } from \"@lingui/core\"\n\nconst CrumbSchema = z.object({\n text: z.custom<MessageDescriptor | string>().optional(),\n to: z.string().optional(),\n icon: z.string().optional(),\n})\n\nconst AnalyticsSchema = z.object({\n name: z.string(),\n})\n\nconst RouteInfoSchema = z.object({\n section: z.string().optional(),\n service: z.string().optional(),\n crumb: CrumbSchema.optional(),\n analytics: AnalyticsSchema.optional(),\n})\n\nexport type Crumb = z.infer<typeof CrumbSchema>\nexport type Analytics = z.infer<typeof AnalyticsSchema>\nexport type RouteInfo = z.infer<typeof RouteInfoSchema>\n\nexport function isRouteInfo(data: unknown): data is RouteInfo {\n return RouteInfoSchema.safeParse(data).success\n}\n"],"mappings":";;AAGA,IAAMC,IAAcD,EAAEE,OAAO;CAC3BC,MAAMH,EAAEI,OAAM,CAAA,CAA+BC,SAAQ;CACrDC,IAAIN,EAAEO,OAAM,CAAA,CAAGF,SAAQ;CACvBG,MAAMR,EAAEO,OAAM,CAAA,CAAGF,SAAQ;AAC3B,CAAA,GAEMI,IAAkBT,EAAEE,OAAO,EAC/BQ,MAAMV,EAAEO,OAAM,EAChB,CAAA,GAEMI,IAAkBX,EAAEE,OAAO;CAC/BU,SAASZ,EAAEO,OAAM,CAAA,CAAGF,SAAQ;CAC5BQ,SAASb,EAAEO,OAAM,CAAA,CAAGF,SAAQ;CAC5BS,OAAOb,EAAYI,SAAQ;CAC3BU,WAAWN,EAAgBJ,SAAQ;AACrC,CAAA;AAMA,SAAgBW,EAAYC,GAAa;CACvC,OAAON,EAAgBO,UAAUD,CAAAA,CAAAA,CAAME;AACzC"}
|
package/dist/client/router.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TrpcReact, TrpcClient } from './trpcClient';
|
|
2
|
-
import {
|
|
3
|
-
export declare function createAuroraRouter(trpcReact: TrpcReact, trpcClient: TrpcClient,
|
|
2
|
+
import { ServiceExtension } from './AuroraApp';
|
|
3
|
+
export declare function createAuroraRouter(trpcReact: TrpcReact, trpcClient: TrpcClient, serviceExtensions?: ServiceExtension[]): import('@tanstack/router-core').RouterCore<import('@tanstack/router-core').Route<import('@tanstack/react-router').Register, any, "/", "/", string, "__root__", undefined, {}, import('./routes/__root').RouterContext, import('@tanstack/router-core').AnyContext, import('@tanstack/router-core').AnyContext, {}, undefined, import('./routeTree.gen').RootRouteChildren, import('./routeTree.gen').FileRouteTypes, unknown, unknown, undefined>, "never", false, import('@tanstack/history').RouterHistory, Record<string, any>>;
|
|
4
4
|
declare module "@tanstack/react-router" {
|
|
5
5
|
interface Register {
|
|
6
6
|
router: ReturnType<typeof createAuroraRouter>;
|
|
@@ -2,9 +2,9 @@ import { createFileRoute as e, lazyRouteComponent as t } from "@tanstack/react-r
|
|
|
2
2
|
import { z as n } from "zod";
|
|
3
3
|
var r = e("/")({
|
|
4
4
|
validateSearch: n.object({ redirect: n.string().optional().catch("") }),
|
|
5
|
-
component: t(() => import("./routes-
|
|
5
|
+
component: t(() => import("./routes-xofA3ksU.mjs"), "component")
|
|
6
6
|
});
|
|
7
7
|
//#endregion
|
|
8
8
|
export { r as t };
|
|
9
9
|
|
|
10
|
-
//# sourceMappingURL=routes-
|
|
10
|
+
//# sourceMappingURL=routes-CJj7SR_K.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes-CJj7SR_K.mjs","names":["createFileRoute","z","Route","validateSearch","object","redirect","string","optional","catch","component","lazyRouteComponent","$$splitComponentImporter"],"sources":["../../src/client/routes/index.tsx"],"sourcesContent":["import { createFileRoute, useNavigate } from \"@tanstack/react-router\"\nimport { Status } from \"@cloudoperators/juno-ui-components\"\nimport { z } from \"zod\"\nimport { useEffect } from \"react\"\nimport { LoginForm } from \"../components/Auth/LoginForm\"\nimport { Slot } from \"../components/Slot\"\nimport { useAuth } from \"../store/AuthProvider\"\nimport { useLingui } from \"@lingui/react/macro\"\n\nfunction isSafeRedirect(path: unknown): path is string {\n return typeof path === \"string\" && path.startsWith(\"/\") && !path.startsWith(\"//\")\n}\n\nexport const Route = createFileRoute(\"/\")({\n validateSearch: z.object({\n redirect: z.string().optional().catch(\"\"),\n }),\n component: LandingPage,\n})\n\nfunction LandingPage() {\n const { t } = useLingui()\n const { isLoading, isAuthenticated } = useAuth()\n const { slots } = Route.useRouteContext()\n const { redirect: searchRedirect } = Route.useSearch()\n const navigate = useNavigate()\n\n // Redirect when authenticated\n useEffect(() => {\n if (isAuthenticated && !isLoading) {\n const target = isSafeRedirect(searchRedirect) ? searchRedirect : \"/projects\"\n navigate({ to: target, replace: true })\n }\n }, [isAuthenticated, isLoading, navigate, searchRedirect])\n\n if (isLoading) {\n return <Status status=\"progress\" title={t`Loading...`} />\n }\n\n if (slots?.login && !isAuthenticated) {\n return (\n <div className=\"mt-8 flex justify-center\">\n <Slot component={slots.login} useShadowDOM={false} />\n </div>\n )\n }\n\n if (!isAuthenticated) {\n return <LoginForm />\n }\n\n // Redirecting...\n return null\n}\n"],"mappings":";;AAaA,IAAaE,IAAQF,EAAgB,GAAA,CAAA,CAAK;CACxCG,gBAAgBF,EAAEG,OAAO,EACvBC,UAAUJ,EAAEK,OAAM,CAAA,CAAGC,SAAQ,CAAA,CAAGC,MAAM,EAAA,EACxC,CAAA;CACAC,WAASC,yCAAA,WAAA;AACX,CAAA"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { L as e, at as t, h as n, i as r, m as i, rt as a } from "./build-WuxXRAqf.mjs";
|
|
2
|
+
import { n as o } from "./AuthProvider-CVSAwW9f.mjs";
|
|
3
|
+
import { t as s } from "./Slot-CWb612-_.mjs";
|
|
4
|
+
import { t as c } from "./routes-CJj7SR_K.mjs";
|
|
5
|
+
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
6
|
+
import { useEffect as d } from "react";
|
|
7
|
+
import { useNavigate as f } from "@tanstack/react-router";
|
|
8
|
+
import { Trans as p, useLingui as m } from "@lingui/react";
|
|
9
|
+
//#region src/client/components/Auth/LoginForm.tsx
|
|
10
|
+
function h() {
|
|
11
|
+
let { isLoading: a, error: s, login: c } = o();
|
|
12
|
+
return /*#__PURE__*/ l("div", {
|
|
13
|
+
className: "mt-8 flex justify-center",
|
|
14
|
+
children: /*#__PURE__*/ u("div", {
|
|
15
|
+
className: "border-theme-light relative w-full max-w-md rounded-lg border p-6 shadow-lg",
|
|
16
|
+
children: [
|
|
17
|
+
/*#__PURE__*/ l(t, {
|
|
18
|
+
className: "text-center",
|
|
19
|
+
children: /*#__PURE__*/ l(p, { id: "MDQl/K" })
|
|
20
|
+
}),
|
|
21
|
+
/*#__PURE__*/ l("p", {
|
|
22
|
+
className: "mb-6 text-center",
|
|
23
|
+
children: /*#__PURE__*/ l(p, { id: "N5vGcw" })
|
|
24
|
+
}),
|
|
25
|
+
/*#__PURE__*/ u("form", {
|
|
26
|
+
className: "space-y-5",
|
|
27
|
+
onSubmit: (e) => {
|
|
28
|
+
e.preventDefault();
|
|
29
|
+
let t = new FormData(e.currentTarget);
|
|
30
|
+
c({
|
|
31
|
+
domain: String(t.get("domain") ?? ""),
|
|
32
|
+
user: String(t.get("user") ?? ""),
|
|
33
|
+
password: String(t.get("password") ?? "")
|
|
34
|
+
});
|
|
35
|
+
},
|
|
36
|
+
children: [
|
|
37
|
+
s && /*#__PURE__*/ l(e, {
|
|
38
|
+
text: s,
|
|
39
|
+
variant: "error"
|
|
40
|
+
}),
|
|
41
|
+
/*#__PURE__*/ l(n, { children: /*#__PURE__*/ l(i, {
|
|
42
|
+
id: "domain",
|
|
43
|
+
name: "domain",
|
|
44
|
+
label: "Domain",
|
|
45
|
+
autoComplete: "domain",
|
|
46
|
+
required: !0
|
|
47
|
+
}) }),
|
|
48
|
+
/*#__PURE__*/ l(n, { children: /*#__PURE__*/ l(i, {
|
|
49
|
+
id: "user",
|
|
50
|
+
name: "user",
|
|
51
|
+
label: "User",
|
|
52
|
+
autoComplete: "user",
|
|
53
|
+
required: !0
|
|
54
|
+
}) }),
|
|
55
|
+
/*#__PURE__*/ l(n, { children: /*#__PURE__*/ l(i, {
|
|
56
|
+
id: "password",
|
|
57
|
+
name: "password",
|
|
58
|
+
type: "password",
|
|
59
|
+
label: "Password",
|
|
60
|
+
autoComplete: "password",
|
|
61
|
+
required: !0
|
|
62
|
+
}) }),
|
|
63
|
+
/*#__PURE__*/ l(r, {
|
|
64
|
+
type: "submit",
|
|
65
|
+
variant: "primary",
|
|
66
|
+
className: "mt-2 w-full",
|
|
67
|
+
disabled: a,
|
|
68
|
+
children: a ? /*#__PURE__*/ l(p, { id: "Z3FXyt" }) : /*#__PURE__*/ l(p, { id: "n1ekoW" })
|
|
69
|
+
})
|
|
70
|
+
]
|
|
71
|
+
})
|
|
72
|
+
]
|
|
73
|
+
})
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
//#endregion
|
|
77
|
+
//#region src/client/routes/index.tsx?tsr-split=component
|
|
78
|
+
function g(e) {
|
|
79
|
+
return typeof e == "string" && e.startsWith("/") && !e.startsWith("//");
|
|
80
|
+
}
|
|
81
|
+
function _() {
|
|
82
|
+
let { i18n: e, _: t } = m(), { isLoading: n, isAuthenticated: r } = o(), { slots: i } = c.useRouteContext(), { redirect: u } = c.useSearch(), p = f();
|
|
83
|
+
return d(() => {
|
|
84
|
+
if (r && !n) {
|
|
85
|
+
let e = g(u) ? u : "/projects";
|
|
86
|
+
p({
|
|
87
|
+
to: e,
|
|
88
|
+
replace: !0
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}, [
|
|
92
|
+
r,
|
|
93
|
+
n,
|
|
94
|
+
p,
|
|
95
|
+
u
|
|
96
|
+
]), n ? /*#__PURE__*/ l(a, {
|
|
97
|
+
status: "progress",
|
|
98
|
+
title: e._({ id: "Z3FXyt" })
|
|
99
|
+
}) : i?.login && !r ? /*#__PURE__*/ l("div", {
|
|
100
|
+
className: "mt-8 flex justify-center",
|
|
101
|
+
children: /*#__PURE__*/ l(s, {
|
|
102
|
+
component: i.login,
|
|
103
|
+
useShadowDOM: !1
|
|
104
|
+
})
|
|
105
|
+
}) : r ? null : /*#__PURE__*/ l(h, {});
|
|
106
|
+
}
|
|
107
|
+
//#endregion
|
|
108
|
+
export { _ as component };
|
|
109
|
+
|
|
110
|
+
//# sourceMappingURL=routes-xofA3ksU.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes-xofA3ksU.mjs","names":["ContentHeading","Message","Button","FormRow","TextInput","useAuth","LoginForm","isLoading","error","loginError","login","div","className","p","form","onSubmit","e","preventDefault","formData","FormData","currentTarget","domain","String","get","user","password","text","variant","id","name","label","autoComplete","required","type","disabled","useNavigate","Status","useEffect","LoginForm","Slot","useAuth","useLingui","isSafeRedirect","path","startsWith","Route","LandingPage","t","isLoading","isAuthenticated","slots","useRouteContext","redirect","searchRedirect","useSearch","navigate","target","to","replace","login","component"],"sources":["../../src/client/components/Auth/LoginForm.tsx","../../src/client/routes/index.tsx?tsr-split=component"],"sourcesContent":["import { ContentHeading, Message, Button, FormRow, TextInput } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { useAuth } from \"../../store/AuthProvider\"\n\nexport function LoginForm() {\n const { isLoading, error: loginError, login } = useAuth()\n\n return (\n <div className=\"mt-8 flex justify-center\">\n <div className=\"border-theme-light relative w-full max-w-md rounded-lg border p-6 shadow-lg\">\n <ContentHeading className=\"text-center\">\n <Trans>Sign In to Your Account</Trans>\n </ContentHeading>\n <p className=\"mb-6 text-center\">\n <Trans>Enter your credentials to access your account</Trans>\n </p>\n\n <form\n className=\"space-y-5\"\n onSubmit={(e) => {\n e.preventDefault()\n const formData = new FormData(e.currentTarget)\n login({\n domain: String(formData.get(\"domain\") ?? \"\"),\n user: String(formData.get(\"user\") ?? \"\"),\n password: String(formData.get(\"password\") ?? \"\"),\n })\n }}\n >\n {loginError && <Message text={loginError} variant=\"error\" />}\n <FormRow>\n <TextInput id=\"domain\" name=\"domain\" label=\"Domain\" autoComplete=\"domain\" required />\n </FormRow>\n <FormRow>\n <TextInput id=\"user\" name=\"user\" label=\"User\" autoComplete=\"user\" required />\n </FormRow>\n <FormRow>\n <TextInput\n id=\"password\"\n name=\"password\"\n type=\"password\"\n label=\"Password\"\n autoComplete=\"password\"\n required\n />\n </FormRow>\n\n <Button type=\"submit\" variant=\"primary\" className=\"mt-2 w-full\" disabled={isLoading}>\n {isLoading ? <Trans>Loading...</Trans> : <Trans>Sign In</Trans>}\n </Button>\n </form>\n </div>\n </div>\n )\n}\n","import { createFileRoute, useNavigate } from \"@tanstack/react-router\"\nimport { Status } from \"@cloudoperators/juno-ui-components\"\nimport { z } from \"zod\"\nimport { useEffect } from \"react\"\nimport { LoginForm } from \"../components/Auth/LoginForm\"\nimport { Slot } from \"../components/Slot\"\nimport { useAuth } from \"../store/AuthProvider\"\nimport { useLingui } from \"@lingui/react/macro\"\n\nfunction isSafeRedirect(path: unknown): path is string {\n return typeof path === \"string\" && path.startsWith(\"/\") && !path.startsWith(\"//\")\n}\n\nexport const Route = createFileRoute(\"/\")({\n validateSearch: z.object({\n redirect: z.string().optional().catch(\"\"),\n }),\n component: LandingPage,\n})\n\nfunction LandingPage() {\n const { t } = useLingui()\n const { isLoading, isAuthenticated } = useAuth()\n const { slots } = Route.useRouteContext()\n const { redirect: searchRedirect } = Route.useSearch()\n const navigate = useNavigate()\n\n // Redirect when authenticated\n useEffect(() => {\n if (isAuthenticated && !isLoading) {\n const target = isSafeRedirect(searchRedirect) ? searchRedirect : \"/projects\"\n navigate({ to: target, replace: true })\n }\n }, [isAuthenticated, isLoading, navigate, searchRedirect])\n\n if (isLoading) {\n return <Status status=\"progress\" title={t`Loading...`} />\n }\n\n if (slots?.login && !isAuthenticated) {\n return (\n <div className=\"mt-8 flex justify-center\">\n <Slot component={slots.login} useShadowDOM={false} />\n </div>\n )\n }\n\n if (!isAuthenticated) {\n return <LoginForm />\n }\n\n // Redirecting...\n return null\n}\n"],"mappings":";;;;;;;;;AAIA,SAAgBM,IAAAA;CACd,IAAM,EAAEC,cAAWC,OAAOC,GAAYC,aAAUL,EAAAA;CAEhD,OACE,gBAACM,OAAAA;EAAIC,WAAU;EACb,UAAA,gBAACD,OAAAA;GAAIC,WAAU;;IACb,gBAACZ,GAAAA;KAAeY,WAAU;KACxB,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAEF,gBAACC,KAAAA;KAAED,WAAU;KACX,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;IAGF,gBAACE,QAAAA;KACCF,WAAU;KACVG,WAAWC,MAAAA;MACTA,EAAEC,eAAc;MAChB,IAAMC,IAAW,IAAIC,SAASH,EAAEI,aAAa;MAC7CV,EAAM;OACJW,QAAQC,OAAOJ,EAASK,IAAI,QAAA,KAAa,EAAA;OACzCC,MAAMF,OAAOJ,EAASK,IAAI,MAAA,KAAW,EAAA;OACrCE,UAAUH,OAAOJ,EAASK,IAAI,UAAA,KAAe,EAAA;MAC/C,CAAA;KACF;;MAECd,KAAc,gBAACR,GAAAA;OAAQyB,MAAMjB;OAAYkB,SAAQ;;MAClD,gBAACxB,GAAAA,EACC,UAAA,gBAACC,GAAAA;OAAUwB,IAAG;OAASC,MAAK;OAASC,OAAM;OAASC,cAAa;OAASC,UAAQ;;MAEpF,gBAAC7B,GAAAA,EACC,UAAA,gBAACC,GAAAA;OAAUwB,IAAG;OAAOC,MAAK;OAAOC,OAAM;OAAOC,cAAa;OAAOC,UAAQ;;MAE5E,gBAAC7B,GAAAA,EACC,UAAA,gBAACC,GAAAA;OACCwB,IAAG;OACHC,MAAK;OACLI,MAAK;OACLH,OAAM;OACNC,cAAa;OACbC,UAAQ;;MAIZ,gBAAC9B,GAAAA;OAAO+B,MAAK;OAASN,SAAQ;OAAUf,WAAU;OAAcsB,UAAU3B;OACvEA,UAAAA,IAAY,gBAAA,GAAA,EAAA,IAAA,SAA4B,CAAA,IAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;;;;;;AAMrD;;;AC7CA,SAASmC,EAAeC,GAAa;CACnC,OAAO,OAAOA,KAAS,YAAYA,EAAKC,WAAW,GAAA,KAAQ,CAACD,EAAKC,WAAW,IAAA;AAC9E;AASA,SAASE,IAAAA;CACP,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQL,EAAAA,GACR,EAAEO,cAAWC,uBAAoBT,EAAAA,GACjC,EAAEU,aAAUL,EAAMM,gBAAe,GACjC,EAAEC,UAAUC,MAAmBR,EAAMS,UAAS,GAC9CC,IAAWpB,EAAAA;CA2BjB,OAxBAE,QAAU;EACR,IAAIY,KAAmB,CAACD,GAAW;GACjC,IAAMQ,IAASd,EAAeW,CAAAA,IAAkBA,IAAiB;GACjEE,EAAS;IAAEE,IAAID;IAAQE,SAAS;GAAK,CAAA;EACvC;CACF,GAAG;EAACT;EAAiBD;EAAWO;EAAUF;CAAe,CAAA,GAErDL,IACK,gBAAC,GAAA;EAAO,QAAO;EAAW,OAAOD,EAAAA,EAAC,EAAA,IAAA,SAAA,CAAA;MAGvCG,GAAOS,SAAS,CAACV,IAEjB,gBAAC,OAAA;EAAI,WAAU;EACb,UAAA,gBAAC,GAAA;GAAK,WAAWC,EAAMS;GAAO,cAAc;;MAK7CV,IAKE,OAJE,gBAAC,GAAA,CAAA,CAAA;AAKZ"}
|