@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
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { a as e, i as t, n, o as r, t as i } from "./objects-C3azvW8m.mjs";
|
|
2
|
-
import { Fragment as a, jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
3
|
-
import { useParams as c } from "@tanstack/react-router";
|
|
4
|
-
import { Trans as l } from "@lingui/react";
|
|
5
|
-
import { ErrorBoundary as u } from "react-error-boundary";
|
|
6
|
-
//#region src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/index.tsx?tsr-split=component
|
|
7
|
-
function d() {
|
|
8
|
-
let { projectId: d, provider: f, containerName: p } = c({
|
|
9
|
-
from: "/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/",
|
|
10
|
-
select: (e) => ({
|
|
11
|
-
projectId: e.projectId,
|
|
12
|
-
provider: e.provider,
|
|
13
|
-
containerName: e.containerName
|
|
14
|
-
})
|
|
15
|
-
}), { prefix: m, sortBy: h, sortDirection: g, search: _, view: v } = i.useSearch();
|
|
16
|
-
return /*#__PURE__*/ s(a, { children: [f === "ceph" && /*#__PURE__*/ o(n, { bucketName: p }), /*#__PURE__*/ o("div", { children: d ? /*#__PURE__*/ o(u, {
|
|
17
|
-
resetKeys: [
|
|
18
|
-
d,
|
|
19
|
-
f,
|
|
20
|
-
p,
|
|
21
|
-
m,
|
|
22
|
-
h,
|
|
23
|
-
g,
|
|
24
|
-
_,
|
|
25
|
-
v
|
|
26
|
-
],
|
|
27
|
-
fallback: /*#__PURE__*/ o("div", {
|
|
28
|
-
className: "p-4 text-center",
|
|
29
|
-
children: /*#__PURE__*/ o(l, { id: "diFNkW" })
|
|
30
|
-
}),
|
|
31
|
-
children: (() => {
|
|
32
|
-
switch (f) {
|
|
33
|
-
case "swift": return /*#__PURE__*/ o(r, {
|
|
34
|
-
provider: f,
|
|
35
|
-
containerName: p
|
|
36
|
-
});
|
|
37
|
-
case "ceph": return o(v === "cors-rules" ? t : e, { bucketName: p });
|
|
38
|
-
default: return /*#__PURE__*/ o("div", {
|
|
39
|
-
className: "p-4",
|
|
40
|
-
children: /*#__PURE__*/ o(l, {
|
|
41
|
-
id: "ubUrot",
|
|
42
|
-
values: { containerName: p }
|
|
43
|
-
})
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
})()
|
|
47
|
-
}) : /*#__PURE__*/ o("div", {
|
|
48
|
-
className: "p-4 text-center",
|
|
49
|
-
children: /*#__PURE__*/ o(l, { id: "Z2fZGD" })
|
|
50
|
-
}) })] });
|
|
51
|
-
}
|
|
52
|
-
var f = () => /*#__PURE__*/ o(d, {});
|
|
53
|
-
//#endregion
|
|
54
|
-
export { d as ObjectsDashboard, f as component };
|
|
55
|
-
|
|
56
|
-
//# sourceMappingURL=objects-CM265S6b.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"objects-CM265S6b.mjs","names":["useParams","ErrorBoundary","Trans","SwiftObjects","CephObjects","CephCorsRules","BucketHeader","Route","ObjectsDashboard","projectId","provider","containerName","from","select","params","prefix","sortBy","sortDirection","search","view","useSearch","showContentHeader","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 } from \"../../../../-components/Ceph/Buckets\"\nimport { z } from \"zod\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { BucketHeader } from \"../../../../-components/Ceph/Buckets/BucketHeader\"\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)\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\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\"]).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})\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 isDetail: true,\n sectionCrumb: { labelKey: \"Storage\" },\n crumb: { useParamAsLabel: \"provider\", to: \"/projects/$projectId/storage/$provider/$storageType\" },\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 const { prefix, sortBy, sortDirection, search, view } = Route.useSearch()\n\n // For Ceph buckets, we show ContentHeader with badges and actions\n // For Swift containers, the component handles its own header\n const showContentHeader = provider === \"ceph\"\n\n return (\n <>\n {showContentHeader && <BucketHeader bucketName={containerName} />}\n <div>\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 === \"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":";;;;;;AA8EA,SAAgBQ,IAAAA;CACd,IAAM,EAAEC,cAAWC,aAAUC,qBAAkBX,EAAU;EACvDY,MAAM;EACNC,SAASC,OAAY;GACnBL,WAAWK,EAAOL;GAClBC,UAAUI,EAAOJ;GACjBC,eAAeG,EAAOH;EACxB;CACF,CAAA,GAEM,EAAEI,WAAQC,WAAQC,kBAAeC,WAAQC,YAASZ,EAAMa,UAAS;CAMvE,OACE,gBAAA,GAAA,EAAA,UAAA,CAHwBV,MAAa,UAIb,gBAAC,GAAA,EAAa,YAAYC,EAAAA,CAAAA,GAChD,gBAAC,OAAA,EACEF,UAAAA,IACC,gBAAC,GAAA;EACC,WAAW;GAACA;GAAWC;GAAUC;GAAeI;GAAQC;GAAQC;GAAeC;GAAQC;EAAK;EAC5F,UACE,gBAAC,OAAA;GAAI,WAAU;GACb,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;EAIH,iBAAC;GACA,QAAQT,GAAR;IACE,KAAK,SACH,OAAO,gBAAC,GAAA;KAAuBA;KAAyBC;;IAC1D,KAAK,QAIH,OAFS,EADLQ,MAAS,eACH,IAEF,GAFE,EAAc,YAAYR,EAAAA,CAAAA;IAGtC,SACE,OACE,gBAAC,OAAA;KAAI,WAAU;KACb,UAAA,gBAAA,GAAA;;MAAiBA,QAAAA,EAAAA,iBAAAA;;;GAGzB;EACF,EAAA,CAAA;CAGF,CAAA,IAAA,gBAAC,OAAA;EAAI,WAAU;EACb,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;AAMZ;AAAC,IAAAW,UAhFU,gBAAC,GAAA,CAAA,CAAA"}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { a as e, i as t, n, o as r, t as i } from "./objects-C3azvW8m.mjs";
|
|
2
|
-
import { Fragment as a, jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
3
|
-
import { useParams as c } from "@tanstack/react-router";
|
|
4
|
-
import { Trans as l } from "@lingui/react";
|
|
5
|
-
import { ErrorBoundary as u } from "react-error-boundary";
|
|
6
|
-
//#region src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/index.tsx?tsr-split=notFoundComponent
|
|
7
|
-
function d() {
|
|
8
|
-
let { projectId: d, provider: f, containerName: p } = c({
|
|
9
|
-
from: "/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/",
|
|
10
|
-
select: (e) => ({
|
|
11
|
-
projectId: e.projectId,
|
|
12
|
-
provider: e.provider,
|
|
13
|
-
containerName: e.containerName
|
|
14
|
-
})
|
|
15
|
-
}), { prefix: m, sortBy: h, sortDirection: g, search: _, view: v } = i.useSearch();
|
|
16
|
-
return /*#__PURE__*/ s(a, { children: [f === "ceph" && /*#__PURE__*/ o(n, { bucketName: p }), /*#__PURE__*/ o("div", { children: d ? /*#__PURE__*/ o(u, {
|
|
17
|
-
resetKeys: [
|
|
18
|
-
d,
|
|
19
|
-
f,
|
|
20
|
-
p,
|
|
21
|
-
m,
|
|
22
|
-
h,
|
|
23
|
-
g,
|
|
24
|
-
_,
|
|
25
|
-
v
|
|
26
|
-
],
|
|
27
|
-
fallback: /*#__PURE__*/ o("div", {
|
|
28
|
-
className: "p-4 text-center",
|
|
29
|
-
children: /*#__PURE__*/ o(l, { id: "diFNkW" })
|
|
30
|
-
}),
|
|
31
|
-
children: (() => {
|
|
32
|
-
switch (f) {
|
|
33
|
-
case "swift": return /*#__PURE__*/ o(r, {
|
|
34
|
-
provider: f,
|
|
35
|
-
containerName: p
|
|
36
|
-
});
|
|
37
|
-
case "ceph": return o(v === "cors-rules" ? t : e, { bucketName: p });
|
|
38
|
-
default: return /*#__PURE__*/ o("div", {
|
|
39
|
-
className: "p-4",
|
|
40
|
-
children: /*#__PURE__*/ o(l, {
|
|
41
|
-
id: "ubUrot",
|
|
42
|
-
values: { containerName: p }
|
|
43
|
-
})
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
})()
|
|
47
|
-
}) : /*#__PURE__*/ o("div", {
|
|
48
|
-
className: "p-4 text-center",
|
|
49
|
-
children: /*#__PURE__*/ o(l, { id: "Z2fZGD" })
|
|
50
|
-
}) })] });
|
|
51
|
-
}
|
|
52
|
-
var f = () => /*#__PURE__*/ o("p", { children: /*#__PURE__*/ o(l, { id: "FRtmJJ" }) });
|
|
53
|
-
//#endregion
|
|
54
|
-
export { d as ObjectsDashboard, f as notFoundComponent };
|
|
55
|
-
|
|
56
|
-
//# sourceMappingURL=objects-EE9Cd1wI.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"objects-EE9Cd1wI.mjs","names":["useParams","ErrorBoundary","Trans","SwiftObjects","CephObjects","CephCorsRules","BucketHeader","Route","ObjectsDashboard","projectId","provider","containerName","from","select","params","prefix","sortBy","sortDirection","search","view","useSearch","showContentHeader","SplitNotFoundComponent","notFoundComponent"],"sources":["../../src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/index.tsx?tsr-split=notFoundComponent"],"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 } from \"../../../../-components/Ceph/Buckets\"\nimport { z } from \"zod\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { BucketHeader } from \"../../../../-components/Ceph/Buckets/BucketHeader\"\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)\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\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\"]).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})\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 isDetail: true,\n sectionCrumb: { labelKey: \"Storage\" },\n crumb: { useParamAsLabel: \"provider\", to: \"/projects/$projectId/storage/$provider/$storageType\" },\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 const { prefix, sortBy, sortDirection, search, view } = Route.useSearch()\n\n // For Ceph buckets, we show ContentHeader with badges and actions\n // For Swift containers, the component handles its own header\n const showContentHeader = provider === \"ceph\"\n\n return (\n <>\n {showContentHeader && <BucketHeader bucketName={containerName} />}\n <div>\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 === \"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":";;;;;;AA8EA,SAAgBQ,IAAAA;CACd,IAAM,EAAEC,cAAWC,aAAUC,qBAAkBX,EAAU;EACvDY,MAAM;EACNC,SAASC,OAAY;GACnBL,WAAWK,EAAOL;GAClBC,UAAUI,EAAOJ;GACjBC,eAAeG,EAAOH;EACxB;CACF,CAAA,GAEM,EAAEI,WAAQC,WAAQC,kBAAeC,WAAQC,YAASZ,EAAMa,UAAS;CAMvE,OACE,gBAAA,GAAA,EAAA,UAAA,CAHwBV,MAAa,UAIb,gBAAC,GAAA,EAAa,YAAYC,EAAAA,CAAAA,GAChD,gBAAC,OAAA,EACEF,UAAAA,IACC,gBAAC,GAAA;EACC,WAAW;GAACA;GAAWC;GAAUC;GAAeI;GAAQC;GAAQC;GAAeC;GAAQC;EAAK;EAC5F,UACE,gBAAC,OAAA;GAAI,WAAU;GACb,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;EAIH,iBAAC;GACA,QAAQT,GAAR;IACE,KAAK,SACH,OAAO,gBAAC,GAAA;KAAuBA;KAAyBC;;IAC1D,KAAK,QAIH,OAFS,EADLQ,MAAS,eACH,IAEF,GAFE,EAAc,YAAYR,EAAAA,CAAAA;IAGtC,SACE,OACE,gBAAC,OAAA;KAAI,WAAU;KACb,UAAA,gBAAA,GAAA;;MAAiBA,QAAAA,EAAAA,iBAAAA;;;GAGzB;EACF,EAAA,CAAA;CAGF,CAAA,IAAA,gBAAC,OAAA;EAAI,WAAU;EACb,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;AAMZ;AAAC,IAAAW,UA5EK,gBAAC,KAAA,EACC,UAAA,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA,EAAA,CAAA"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { z as e } from "zod";
|
|
2
|
-
var t = e.object({
|
|
3
|
-
labelKey: e.enum([
|
|
4
|
-
"Compute",
|
|
5
|
-
"Network",
|
|
6
|
-
"Storage",
|
|
7
|
-
"Services",
|
|
8
|
-
"Images",
|
|
9
|
-
"Flavors",
|
|
10
|
-
"Security Groups",
|
|
11
|
-
"Floating IPs"
|
|
12
|
-
]).optional(),
|
|
13
|
-
label: e.string().optional(),
|
|
14
|
-
to: e.string().optional(),
|
|
15
|
-
useParamAsLabel: e.string().optional(),
|
|
16
|
-
useParentTitleAsLabel: e.boolean().optional()
|
|
17
|
-
}), n = e.object({ name: e.string() }), r = e.object({
|
|
18
|
-
section: e.string().optional(),
|
|
19
|
-
service: e.string().optional(),
|
|
20
|
-
isDetail: e.boolean().optional(),
|
|
21
|
-
crumb: t.optional(),
|
|
22
|
-
sectionCrumb: t.optional(),
|
|
23
|
-
intermediateCrumb: t.optional(),
|
|
24
|
-
analytics: n.optional()
|
|
25
|
-
});
|
|
26
|
-
function i(e) {
|
|
27
|
-
return r.safeParse(e).success;
|
|
28
|
-
}
|
|
29
|
-
//#endregion
|
|
30
|
-
export { i as t };
|
|
31
|
-
|
|
32
|
-
//# sourceMappingURL=routeInfo-DXqB2HCf.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"routeInfo-DXqB2HCf.mjs","names":["z","CRUMB_LABEL_KEYS","CrumbSchema","object","labelKey","enum","optional","label","string","to","useParamAsLabel","useParentTitleAsLabel","boolean","AnalyticsSchema","name","RouteInfoSchema","section","service","isDetail","crumb","sectionCrumb","intermediateCrumb","analytics","isRouteInfo","data","safeParse","success"],"sources":["../../src/client/routes/routeInfo.ts"],"sourcesContent":["import { z } from \"zod\"\n\nexport const CRUMB_LABEL_KEYS = [\n \"Compute\",\n \"Network\",\n \"Storage\",\n \"Services\",\n \"Images\",\n \"Flavors\",\n \"Security Groups\",\n \"Floating IPs\",\n] as const\n\nexport type CrumbLabelKey = (typeof CRUMB_LABEL_KEYS)[number]\n\nconst CrumbSchema = z.object({\n labelKey: z.enum(CRUMB_LABEL_KEYS).optional(),\n label: z.string().optional(),\n to: z.string().optional(),\n useParamAsLabel: z.string().optional(),\n useParentTitleAsLabel: z.boolean().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 isDetail: z.boolean().optional(),\n crumb: CrumbSchema.optional(),\n sectionCrumb: CrumbSchema.optional(),\n intermediateCrumb: 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":";AAeA,IAAME,IAAcF,EAAEG,OAAO;CAC3BC,UAAUJ,EAAEK,KAAKJ;EAbjB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAMiBA,CAAAA,CAAAA,CAAkBK,SAAQ;CAC3CC,OAAOP,EAAEQ,OAAM,CAAA,CAAGF,SAAQ;CAC1BG,IAAIT,EAAEQ,OAAM,CAAA,CAAGF,SAAQ;CACvBI,iBAAiBV,EAAEQ,OAAM,CAAA,CAAGF,SAAQ;CACpCK,uBAAuBX,EAAEY,QAAO,CAAA,CAAGN,SAAQ;AAC7C,CAAA,GAEMO,IAAkBb,EAAEG,OAAO,EAC/BW,MAAMd,EAAEQ,OAAM,EAChB,CAAA,GAEMO,IAAkBf,EAAEG,OAAO;CAC/Ba,SAAShB,EAAEQ,OAAM,CAAA,CAAGF,SAAQ;CAC5BW,SAASjB,EAAEQ,OAAM,CAAA,CAAGF,SAAQ;CAC5BY,UAAUlB,EAAEY,QAAO,CAAA,CAAGN,SAAQ;CAC9Ba,OAAOjB,EAAYI,SAAQ;CAC3Bc,cAAclB,EAAYI,SAAQ;CAClCe,mBAAmBnB,EAAYI,SAAQ;CACvCgB,WAAWT,EAAgBP,SAAQ;AACrC,CAAA;AAMA,SAAgBiB,EAAYC,GAAa;CACvC,OAAOT,EAAgBU,UAAUD,CAAAA,CAAAA,CAAME;AACzC"}
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
import { F as e, W as t, X as n, a as r, h as i, m as a, nt as o } from "./build-C_4vRMCq.mjs";
|
|
2
|
-
import { n as s } from "./AuthProvider-BS5OVv8n.mjs";
|
|
3
|
-
import { t as c } from "./Slot-CWb612-_.mjs";
|
|
4
|
-
import { t as l } from "./routes-CdDm-hhO.mjs";
|
|
5
|
-
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
6
|
-
import { useEffect as f } from "react";
|
|
7
|
-
import { useNavigate as p } from "@tanstack/react-router";
|
|
8
|
-
import { Trans as m } from "@lingui/react";
|
|
9
|
-
//#region src/client/components/Auth/LoginForm.tsx
|
|
10
|
-
function h() {
|
|
11
|
-
let { isLoading: t, error: n, login: c } = s();
|
|
12
|
-
return /*#__PURE__*/ u("div", {
|
|
13
|
-
className: "mt-8 flex justify-center",
|
|
14
|
-
children: /*#__PURE__*/ d("div", {
|
|
15
|
-
className: "border-theme-light relative w-full max-w-md rounded-lg border p-6 shadow-lg",
|
|
16
|
-
children: [
|
|
17
|
-
/*#__PURE__*/ u(o, {
|
|
18
|
-
className: "text-center",
|
|
19
|
-
children: /*#__PURE__*/ u(m, { id: "MDQl/K" })
|
|
20
|
-
}),
|
|
21
|
-
/*#__PURE__*/ u("p", {
|
|
22
|
-
className: "mb-6 text-center",
|
|
23
|
-
children: /*#__PURE__*/ u(m, { id: "N5vGcw" })
|
|
24
|
-
}),
|
|
25
|
-
/*#__PURE__*/ d("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
|
-
n && /*#__PURE__*/ u(e, {
|
|
38
|
-
text: n,
|
|
39
|
-
variant: "error"
|
|
40
|
-
}),
|
|
41
|
-
/*#__PURE__*/ u(i, { children: /*#__PURE__*/ u(a, {
|
|
42
|
-
id: "domain",
|
|
43
|
-
name: "domain",
|
|
44
|
-
label: "Domain",
|
|
45
|
-
autoComplete: "domain",
|
|
46
|
-
required: !0
|
|
47
|
-
}) }),
|
|
48
|
-
/*#__PURE__*/ u(i, { children: /*#__PURE__*/ u(a, {
|
|
49
|
-
id: "user",
|
|
50
|
-
name: "user",
|
|
51
|
-
label: "User",
|
|
52
|
-
autoComplete: "user",
|
|
53
|
-
required: !0
|
|
54
|
-
}) }),
|
|
55
|
-
/*#__PURE__*/ u(i, { children: /*#__PURE__*/ u(a, {
|
|
56
|
-
id: "password",
|
|
57
|
-
name: "password",
|
|
58
|
-
type: "password",
|
|
59
|
-
label: "Password",
|
|
60
|
-
autoComplete: "password",
|
|
61
|
-
required: !0
|
|
62
|
-
}) }),
|
|
63
|
-
/*#__PURE__*/ u(r, {
|
|
64
|
-
type: "submit",
|
|
65
|
-
variant: "primary",
|
|
66
|
-
className: "mt-2 w-full",
|
|
67
|
-
disabled: t,
|
|
68
|
-
children: t ? /*#__PURE__*/ u(m, { id: "Z3FXyt" }) : /*#__PURE__*/ u(m, { 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 { isLoading: e, isAuthenticated: r } = s(), { slots: i } = l.useRouteContext(), { redirect: a } = l.useSearch(), o = p();
|
|
83
|
-
return f(() => {
|
|
84
|
-
if (r && !e) {
|
|
85
|
-
let e = g(a) ? a : "/projects";
|
|
86
|
-
o({
|
|
87
|
-
to: e,
|
|
88
|
-
replace: !0
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
}, [
|
|
92
|
-
r,
|
|
93
|
-
e,
|
|
94
|
-
o,
|
|
95
|
-
a
|
|
96
|
-
]), e ? /*#__PURE__*/ d(n, {
|
|
97
|
-
className: "fixed inset-0",
|
|
98
|
-
distribution: "center",
|
|
99
|
-
alignment: "center",
|
|
100
|
-
children: [/*#__PURE__*/ u("div", { className: "absolute inset-0 backdrop-blur-sm" }), /*#__PURE__*/ u(t, {
|
|
101
|
-
variant: "primary",
|
|
102
|
-
size: "large"
|
|
103
|
-
})]
|
|
104
|
-
}) : i?.login && !r ? /*#__PURE__*/ u("div", {
|
|
105
|
-
className: "mt-8 flex justify-center",
|
|
106
|
-
children: /*#__PURE__*/ u(c, {
|
|
107
|
-
component: i.login,
|
|
108
|
-
useShadowDOM: !1
|
|
109
|
-
})
|
|
110
|
-
}) : r ? null : /*#__PURE__*/ u(h, {});
|
|
111
|
-
}
|
|
112
|
-
//#endregion
|
|
113
|
-
export { _ as component };
|
|
114
|
-
|
|
115
|
-
//# sourceMappingURL=routes-CBd8CCuM.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"routes-CBd8CCuM.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","Stack","Spinner","useEffect","LoginForm","Slot","useAuth","isSafeRedirect","path","startsWith","Route","LandingPage","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 { Stack, Spinner } 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\"\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 { 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 (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\">\n <div className=\"absolute inset-0 backdrop-blur-sm\" />\n <Spinner variant=\"primary\" size=\"large\" />\n </Stack>\n )\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;;;AC9CA,SAASmC,EAAeC,GAAa;CACnC,OAAO,OAAOA,KAAS,YAAYA,EAAKC,WAAW,GAAA,KAAQ,CAACD,EAAKC,WAAW,IAAA;AAC9E;AASA,SAASE,IAAAA;CACP,IAAM,EAAEC,cAAWC,uBAAoBP,EAAAA,GACjC,EAAEQ,aAAUJ,EAAMK,gBAAe,GACjC,EAAEC,UAAUC,MAAmBP,EAAMQ,UAAS,GAC9CC,IAAWnB,EAAAA;CAgCjB,OA7BAG,QAAU;EACR,IAAIU,KAAmB,CAACD,GAAW;GACjC,IAAMQ,IAASb,EAAeU,CAAAA,IAAkBA,IAAiB;GACjEE,EAAS;IAAEE,IAAID;IAAQE,SAAS;GAAK,CAAA;EACvC;CACF,GAAG;EAACT;EAAiBD;EAAWO;EAAUF;CAAe,CAAA,GAErDL,IAEA,gBAAC,GAAA;EAAM,WAAU;EAAgB,cAAa;EAAS,WAAU;EAC/D,UAAA,CAAA,gBAAC,OAAA,EAAI,WAAU,oCAAA,CAAA,GACf,gBAAC,GAAA;GAAQ,SAAQ;GAAU,MAAK;;MAKlCE,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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"routes-CdDm-hhO.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 { Stack, Spinner } 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\"\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 { 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 (\n <Stack className=\"fixed inset-0\" distribution=\"center\" alignment=\"center\">\n <div className=\"absolute inset-0 backdrop-blur-sm\" />\n <Spinner variant=\"primary\" size=\"large\" />\n </Stack>\n )\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":";;AAYA,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"}
|