@cobaltcore-dev/aurora 0.11.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/{ContentHeader-DsuZD8fa.mjs → ContentHeader-D2nIdJKJ.mjs} +22 -22
- package/dist/client/{ContentHeader-DsuZD8fa.mjs.map → ContentHeader-D2nIdJKJ.mjs.map} +1 -1
- package/dist/client/{DeleteFlavorModal-RnbspW_2.mjs → DeleteFlavorModal-Dwm0Hh84.mjs} +174 -174
- package/dist/client/{DeleteFlavorModal-RnbspW_2.mjs.map → DeleteFlavorModal-Dwm0Hh84.mjs.map} +1 -1
- package/dist/client/{DeleteVersionsModal-CsBJzXoW.mjs → DeleteVersionsModal-DQO8lGmS.mjs} +69 -69
- package/dist/client/{DeleteVersionsModal-CsBJzXoW.mjs.map → DeleteVersionsModal-DQO8lGmS.mjs.map} +1 -1
- package/dist/client/{EditSecurityGroupModal-BPv3d7am.mjs → EditSecurityGroupModal-BGPXglju.mjs} +17 -17
- package/dist/client/{EditSecurityGroupModal-BPv3d7am.mjs.map → EditSecurityGroupModal-BGPXglju.mjs.map} +1 -1
- package/dist/client/{FiltersInput-CViamP59.mjs → FiltersInput-cOaaRpcQ.mjs} +20 -20
- package/dist/client/{FiltersInput-CViamP59.mjs.map → FiltersInput-cOaaRpcQ.mjs.map} +1 -1
- package/dist/client/{FloatingIpActionModals-DTn3HFei.mjs → FloatingIpActionModals-RCvaamOg.mjs} +55 -55
- package/dist/client/{FloatingIpActionModals-DTn3HFei.mjs.map → FloatingIpActionModals-RCvaamOg.mjs.map} +1 -1
- package/dist/client/{ImageToastNotifications-CFKQZTgf.mjs → ImageToastNotifications-ClO-1yOH.mjs} +310 -310
- package/dist/client/{ImageToastNotifications-CFKQZTgf.mjs.map → ImageToastNotifications-ClO-1yOH.mjs.map} +1 -1
- package/dist/client/{RouteError-BebIhFpQ.mjs → RouteError-BmZRk_ss.mjs} +2 -2
- package/dist/client/{RouteError-BebIhFpQ.mjs.map → RouteError-BmZRk_ss.mjs.map} +1 -1
- package/dist/client/{SortInput-D0Vb864D.mjs → SortInput-DjaEHvcO.mjs} +6 -6
- package/dist/client/{SortInput-D0Vb864D.mjs.map → SortInput-DjaEHvcO.mjs.map} +1 -1
- package/dist/client/{_flavorId-C9SZd1jL.mjs → _flavorId-CtQEd28h.mjs} +8 -8
- package/dist/client/{_flavorId-C9SZd1jL.mjs.map → _flavorId-CtQEd28h.mjs.map} +1 -1
- package/dist/client/{_flavorId-DINgWoeV.mjs → _flavorId-DVsGdXUf.mjs} +46 -46
- package/dist/client/{_flavorId-DINgWoeV.mjs.map → _flavorId-DVsGdXUf.mjs.map} +1 -1
- package/dist/client/{_floatingIpId-BACLbMzi2.mjs → _floatingIpId-CKMq7-4p2.mjs} +36 -36
- package/dist/client/{_floatingIpId-BACLbMzi2.mjs.map → _floatingIpId-CKMq7-4p2.mjs.map} +1 -1
- package/dist/client/{_floatingIpId-BzVMOv97.mjs → _floatingIpId-DvTh6vdB.mjs} +2 -2
- package/dist/client/{_floatingIpId-BzVMOv97.mjs.map → _floatingIpId-DvTh6vdB.mjs.map} +1 -1
- package/dist/client/_imageId-xG8hC49j.mjs +534 -0
- package/dist/client/{_imageId-DCvaU7-S.mjs.map → _imageId-xG8hC49j.mjs.map} +1 -1
- package/dist/client/{_pcaId-B3PqECyO.mjs → _pcaId-Db_t0x6O.mjs} +147 -147
- package/dist/client/{_pcaId-B3PqECyO.mjs.map → _pcaId-Db_t0x6O.mjs.map} +1 -1
- package/dist/client/{_pcaId-DAJEt3ZI.mjs → _pcaId-WCJoukIk.mjs} +2 -2
- package/dist/client/{_pcaId-DAJEt3ZI.mjs.map → _pcaId-WCJoukIk.mjs.map} +1 -1
- package/dist/client/{_projectId-DU8qRiZk.mjs → _projectId-B2cvskLV.mjs} +2 -2
- package/dist/client/{_projectId-DU8qRiZk.mjs.map → _projectId-B2cvskLV.mjs.map} +1 -1
- package/dist/client/{_projectId-DRr9rLST.mjs → _projectId-BCMkaH_h.mjs} +35 -35
- package/dist/client/_projectId-BCMkaH_h.mjs.map +1 -0
- package/dist/client/{_projectId-B2hG5peP.mjs → _projectId-BdqRntcN.mjs} +15 -14
- package/dist/client/{_projectId-B2hG5peP.mjs.map → _projectId-BdqRntcN.mjs.map} +1 -1
- package/dist/client/{_projectId-BnWXWTBR.mjs → _projectId-C8RGOqZb.mjs} +3 -3
- package/dist/client/{_projectId-BnWXWTBR.mjs.map → _projectId-C8RGOqZb.mjs.map} +1 -1
- package/dist/client/{_securityGroupId-Cj9IotMJ.mjs → _securityGroupId-CyQ3XmpB.mjs} +2 -2
- package/dist/client/{_securityGroupId-Cj9IotMJ.mjs.map → _securityGroupId-CyQ3XmpB.mjs.map} +1 -1
- package/dist/client/{_securityGroupId-ClJiFh4R.mjs → _securityGroupId-DMi7YRux.mjs} +397 -397
- package/dist/client/{_securityGroupId-ClJiFh4R.mjs.map → _securityGroupId-DMi7YRux.mjs.map} +1 -1
- package/dist/client/{_storageType-BrHDa2bD.mjs → _storageType-Bb6YZgXf.mjs} +657 -660
- package/dist/client/{_storageType-BrHDa2bD.mjs.map → _storageType-Bb6YZgXf.mjs.map} +1 -1
- package/dist/client/{_storageType-CSLH93js.mjs → _storageType-g1zkFFRh.mjs} +2 -2
- package/dist/client/{_storageType-CSLH93js.mjs.map → _storageType-g1zkFFRh.mjs.map} +1 -1
- package/dist/client/{about-BnU297yB.mjs → about-B4sGnxeW.mjs} +8 -8
- package/dist/client/{about-BnU297yB.mjs.map → about-B4sGnxeW.mjs.map} +1 -1
- package/dist/client/{build-DF7MTyXG.mjs → build-DgeVmENN.mjs} +2395 -2390
- package/dist/client/{build-DF7MTyXG.mjs.map → build-DgeVmENN.mjs.map} +1 -1
- package/dist/client/{constants-BskfpGYY.mjs → constants-D6IO9bPs.mjs} +16 -16
- package/dist/client/{constants-BskfpGYY.mjs.map → constants-D6IO9bPs.mjs.map} +1 -1
- package/dist/client/{flavors-DAbtRoep.mjs → flavors-CO5l_6d0.mjs} +178 -178
- package/dist/client/{flavors-DAbtRoep.mjs.map → flavors-CO5l_6d0.mjs.map} +1 -1
- package/dist/client/{flavors-DODudzrA.mjs → flavors-D4nGSs0r.mjs} +2 -2
- package/dist/client/{flavors-DODudzrA.mjs.map → flavors-D4nGSs0r.mjs.map} +1 -1
- package/dist/client/{floatingips-DJW9ftN_.mjs → floatingips-ClkRV7a7.mjs} +108 -108
- package/dist/client/{floatingips-DJW9ftN_.mjs.map → floatingips-ClkRV7a7.mjs.map} +1 -1
- package/dist/client/{images-C3JyPwer.mjs → images-B5ktfqg6.mjs} +2 -2
- package/dist/client/{images-C3JyPwer.mjs.map → images-B5ktfqg6.mjs.map} +1 -1
- package/dist/client/{images-Cp6V1nF5.mjs → images-C_OYLPqv.mjs} +440 -440
- package/dist/client/{images-Cp6V1nF5.mjs.map → images-C_OYLPqv.mjs.map} +1 -1
- package/dist/client/{images-BbLnuYrL.mjs → images-CvPxoPC0.mjs} +2 -2
- package/dist/client/{images-BbLnuYrL.mjs.map → images-CvPxoPC0.mjs.map} +1 -1
- package/dist/client/index.js +275 -275
- package/dist/client/index.js.map +1 -1
- package/dist/client/{objects-DUmK3WgA.mjs → objects-D0grS6pk.mjs} +1361 -1361
- package/dist/client/{objects-DUmK3WgA.mjs.map → objects-D0grS6pk.mjs.map} +1 -1
- package/dist/client/{objects-Bw96WXOs.mjs → objects-UQyUQxBj.mjs} +2 -2
- package/dist/client/{objects-Bw96WXOs.mjs.map → objects-UQyUQxBj.mjs.map} +1 -1
- package/dist/client/{pca-Dc_tdh4-.mjs → pca-BJPxOIgq.mjs} +69 -69
- package/dist/client/{pca-Dc_tdh4-.mjs.map → pca-BJPxOIgq.mjs.map} +1 -1
- package/dist/client/{pca-DKeGzbww.mjs → pca-C9MKOi3Z.mjs} +2 -2
- package/dist/client/{pca-DKeGzbww.mjs.map → pca-C9MKOi3Z.mjs.map} +1 -1
- package/dist/client/{projects-CRL37ftA.mjs → projects-C3wR-lvM.mjs} +16 -19
- package/dist/client/projects-C3wR-lvM.mjs.map +1 -0
- package/dist/client/{projects-DUWOgB3m.mjs → projects-CGjBlG2w.mjs} +2 -2
- package/dist/client/{projects-DUWOgB3m.mjs.map → projects-CGjBlG2w.mjs.map} +1 -1
- package/dist/client/{projects-DpXQYfKc.mjs → projects-DvSiI5Vg.mjs} +2 -2
- package/dist/client/{projects-DpXQYfKc.mjs.map → projects-DvSiI5Vg.mjs.map} +1 -1
- package/dist/client/{securitygroups-CWWFSjjj.mjs → securitygroups-n8ujBpJP.mjs} +118 -118
- package/dist/client/{securitygroups-CWWFSjjj.mjs.map → securitygroups-n8ujBpJP.mjs.map} +1 -1
- package/dist/client/{useListWithFiltering-C9k7xWqz.mjs → useListWithFiltering-BuhE81I6.mjs} +10 -10
- package/dist/client/{useListWithFiltering-C9k7xWqz.mjs.map → useListWithFiltering-BuhE81I6.mjs.map} +1 -1
- package/dist/server/index.d.ts +6 -2
- package/dist/server/index.js +4 -17
- package/package.json +4 -4
- package/dist/client/_imageId-DCvaU7-S.mjs +0 -534
- package/dist/client/_projectId-DRr9rLST.mjs.map +0 -1
- package/dist/client/projects-CRL37ftA.mjs.map +0 -1
|
@@ -2,7 +2,7 @@ import { t as e } from "./helpers-1PpYf-fC.mjs";
|
|
|
2
2
|
import { createFileRoute as t, lazyRouteComponent as n, redirect as r } from "@tanstack/react-router";
|
|
3
3
|
import { z as i } from "zod";
|
|
4
4
|
//#region src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/index.tsx
|
|
5
|
-
var a = () => import("./objects-o2Cj_ndZ.mjs"), o = () => import("./objects-
|
|
5
|
+
var a = () => import("./objects-o2Cj_ndZ.mjs"), o = () => import("./objects-D0grS6pk.mjs"), s = (t, n) => {
|
|
6
6
|
let { provider: i, projectId: a, storageType: o, containerName: s } = n, c = e(t);
|
|
7
7
|
if (!c["object-store"]) throw r({
|
|
8
8
|
to: "/projects/$projectId",
|
|
@@ -99,4 +99,4 @@ var a = () => import("./objects-o2Cj_ndZ.mjs"), o = () => import("./objects-DUmK
|
|
|
99
99
|
//#endregion
|
|
100
100
|
export { l as t };
|
|
101
101
|
|
|
102
|
-
//# sourceMappingURL=objects-
|
|
102
|
+
//# sourceMappingURL=objects-UQyUQxBj.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"objects-Bw96WXOs.mjs","names":["createFileRoute","redirect","getServiceIndex","z","checkServiceAvailability","availableServices","type","name","params","projectId","provider","storageType","containerName","serviceIndex","to","hasSwift","Boolean","hasCeph","cephFallbackEnabled","hasEffectiveCeph","fallbackProvider","fallbackStorageType","expectedStorageType","objectsSearchSchema","object","prefix","string","optional","sortBy","enum","sortDirection","search","tab","default","Route","staticData","section","service","isDetail","sectionCrumb","labelKey","crumb","useParamAsLabel","RouteInfo","validateSearch","head","match","meta","title","component","lazyRouteComponent","$$splitComponentImporter","notFoundComponent","$$splitNotFoundComponentImporter","loader","context","trpcClient","auth","getAvailableServices","query","client","beforeLoad"],"sources":["../../src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/index.tsx"],"sourcesContent":["import { createFileRoute, redirect, useParams } from \"@tanstack/react-router\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\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 { z } from \"zod\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\n\nexport const checkServiceAvailability = (\n availableServices: {\n type: string\n name: string\n }[],\n params: {\n projectId: string\n provider: string\n storageType: string\n containerName: string\n }\n) => {\n const { provider, projectId, storageType, containerName } = params\n\n const serviceIndex = getServiceIndex(availableServices)\n\n // Redirect to the \"Projects Overview\" page if no storage services available\n if (!serviceIndex[\"object-store\"]) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n\n // Check provider availability\n const hasSwift = Boolean(serviceIndex[\"object-store\"][\"swift\"])\n const hasCeph = Boolean(serviceIndex[\"object-store\"][\"ceph\"])\n\n // TEMPORARY: Allow Ceph access even if not in catalog (relies on env config)\n // TODO: Properly register Ceph in OpenStack service catalog\n const cephFallbackEnabled = true // Set to false once Ceph is in catalog\n\n // Effective availability includes fallback flag for Ceph\n const hasEffectiveCeph = hasCeph || cephFallbackEnabled\n const fallbackProvider = hasSwift ? \"swift\" : hasEffectiveCeph ? \"ceph\" : null\n const fallbackStorageType = hasSwift ? \"containers\" : hasEffectiveCeph ? \"buckets\" : null\n\n if (provider !== \"swift\" && provider !== \"ceph\") {\n if (!fallbackProvider || !fallbackStorageType) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n throw redirect({\n to: \"/projects/$projectId/storage/$provider/$storageType/$containerName/objects\",\n params: { projectId, provider: fallbackProvider, storageType: fallbackStorageType, containerName },\n })\n }\n\n if (provider === \"swift\" && !hasSwift) {\n if (!hasEffectiveCeph) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n\n throw redirect({\n to: \"/projects/$projectId/storage/$provider/$storageType/$containerName/objects\",\n params: { projectId, provider: \"ceph\", storageType: \"buckets\", containerName },\n })\n }\n\n if (provider === \"ceph\" && !hasEffectiveCeph) {\n if (!hasSwift) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n\n throw redirect({\n to: \"/projects/$projectId/storage/$provider/$storageType/$containerName/objects\",\n params: { projectId, provider: \"swift\", storageType: \"containers\", containerName },\n })\n }\n\n // Canonicalize the URL terminology for the resolved provider. Availability is\n // already settled above, so by this point provider is a valid, available\n // swift|ceph. The storageType segment is user-controllable and the router never\n // validates it, so a mismatched noun (e.g. ceph + \"containers\", swift + \"buckets\")\n // must redirect to the canonical path to keep URLs normalized.\n if (provider === \"swift\" || provider === \"ceph\") {\n const expectedStorageType = provider === \"swift\" ? \"containers\" : \"buckets\"\n if (storageType !== expectedStorageType) {\n throw redirect({\n to: \"/projects/$projectId/storage/$provider/$storageType/$containerName/objects\",\n params: { projectId, provider, storageType: expectedStorageType, containerName },\n })\n }\n }\n}\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\nconst objectsSearchSchema = z.object({\n prefix: z.string().optional(),\n sortBy: z.enum([\"name\", \"last_modified\", \"bytes\", \"lastModified\", \"size\"]).optional(),\n sortDirection: z.enum([\"asc\", \"desc\"]).optional(),\n search: z.string().optional(),\n tab: z.enum([\"all\", \"deleted\"]).optional().default(\"all\"),\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 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\nfunction ObjectsDashboard() {\n const { project, provider, containerName } = useParams({\n from: \"/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/\",\n select: (params) => ({\n project: params.projectId,\n provider: params.provider,\n containerName: params.containerName,\n storageType: params.storageType,\n }),\n })\n\n const { prefix, sortBy, sortDirection, search } = Route.useSearch()\n\n // For Ceph buckets, we need to show ContentHeader\n // For Swift containers, the component handles its own header\n const showContentHeader = provider === \"ceph\"\n\n return (\n <>\n {showContentHeader && <ContentHeader title={containerName} projectId={project} />}\n <div>\n {project ? (\n <ErrorBoundary\n resetKeys={[project, provider, containerName, prefix, sortBy, sortDirection, search]}\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 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":";;;;4FAUaI,KACXC,GAIAG,MAAAA;CAOA,IAAM,EAAEE,aAAUD,cAAWE,gBAAaC,qBAAkBJ,GAEtDK,IAAeX,EAAgBG,CAAAA;CAGrC,IAAI,CAACQ,EAAa,iBAChB,MAAMZ,EAAS;EACba,IAAI;EACJN,QAAQ,EAAEC,aAAU;CACtB,CAAA;CAIF,IAAMM,IAAWC,EAAQH,EAAa,gBAAgB,OAQhDM,IAPUH,EAAQH,EAAa,gBAAgB,QAOjBK,IAC9BE,IAAmBL,IAAW,UAAUI,IAAmB,SAAS,MACpEE,IAAsBN,IAAW,eAAeI,IAAmB,YAAY;CAErF,IAAIT,MAAa,WAAWA,MAAa,QAOvC,MALQT,EADJ,CAACmB,KAAoB,CAACC,IACT;EACbP,IAAI;EACJN,QAAQ,EAAEC,aAAU;CACtB,IAEa;EACbK,IAAI;EACJN,QAAQ;GAAEC;GAAWC,UAAUU;GAAkBT,aAAaU;GAAqBT;EAAc;CACnG,CALE;CAQJ,IAAIF,MAAa,WAAW,CAACK,GAQ3B,MAAMd,EAPDkB,IAOU;EACbL,IAAI;EACJN,QAAQ;GAAEC;GAAWC,UAAU;GAAQC,aAAa;GAAWC;EAAc;CAC/E,IATiB;EACbE,IAAI;EACJN,QAAQ,EAAEC,aAAU;CACtB,CAAA;CASJ,IAAIC,MAAa,UAAU,CAACS,GAQ1B,MAAMlB,EAPDc,IAOU;EACbD,IAAI;EACJN,QAAQ;GAAEC;GAAWC,UAAU;GAASC,aAAa;GAAcC;EAAc;CACnF,IATiB;EACbE,IAAI;EACJN,QAAQ,EAAEC,aAAU;CACtB,CAAA;CAcJ,IAAIC,MAAa,WAAWA,MAAa,QAAQ;EAC/C,IAAMY,IAAsBZ,MAAa,UAAU,eAAe;EAClE,IAAIC,MAAgBW,GAClB,MAAMrB,EAAS;GACba,IAAI;GACJN,QAAQ;IAAEC;IAAWC;IAAUC,aAAaW;IAAqBV;GAAc;EACjF,CAAA;CAEJ;AACF,GAOMW,IAAsBpB,EAAEqB,OAAO;CACnCC,QAAQtB,EAAEuB,OAAM,EAAGC,SAAQ;CAC3BC,QAAQzB,EAAE0B,KAAK;EAAC;EAAQ;EAAiB;EAAS;EAAgB;EAAO,EAAEF,SAAQ;CACnFG,eAAe3B,EAAE0B,KAAK,CAAC,OAAO,MAAA,CAAO,EAAEF,SAAQ;CAC/CI,QAAQ5B,EAAEuB,OAAM,EAAGC,SAAQ;CAC3BK,KAAK7B,EAAE0B,KAAK,CAAC,OAAO,SAAA,CAAU,EAAEF,SAAQ,EAAGM,QAAQ,KAAA;AACrD,CAAA,GAEaC,IAAQlC,EACnB,mFAAA,EACA;CACAmC,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,UAAU;EACVC,cAAc,EAAEC,UAAU,UAAU;EACpCC,OAAO;GAAEC,iBAAiB;GAAY5B,IAAI;EAAsD;CAClG;CACA8B,gBAAgBrB;CAChBsB,OAAO,EAAEC,gBAAa,EACpBC,MAAM,CAAC,EAAEC,OAAOF,EAAMtC,OAAOI,cAAc,CAAA,EAC7C;CACAqC,WAASC,EAAAC,GAAA,WAAA;CAGTC,mBAAiBF,EAAAG,GAAA,mBAAA;CAOjBC,QAAQ,OAAO,EAAEC,iBAAS;EACxB,IAAM,EAAEC,kBAAeD;EAGvB,OAAO;GACLK,QAAQJ;GACRnD,mBAAAA,MAJ8BmD,GAAYC,KAAKC,qBAAqBC,MAAAA;EAKtE;CACF;CACAE,YAAY,OAAO,EAAEN,YAAS/C,gBAAQ;EACpC,IAAM,EAAEgD,kBAAeD;EAEvBnD,EAAyBC,MADOmD,GAAYC,KAAKC,qBAAqBC,MAAAA,GACzBnD,CAAAA;CAC/C;AACF,CAAA"}
|
|
1
|
+
{"version":3,"file":"objects-UQyUQxBj.mjs","names":["createFileRoute","redirect","getServiceIndex","z","checkServiceAvailability","availableServices","type","name","params","projectId","provider","storageType","containerName","serviceIndex","to","hasSwift","Boolean","hasCeph","cephFallbackEnabled","hasEffectiveCeph","fallbackProvider","fallbackStorageType","expectedStorageType","objectsSearchSchema","object","prefix","string","optional","sortBy","enum","sortDirection","search","tab","default","Route","staticData","section","service","isDetail","sectionCrumb","labelKey","crumb","useParamAsLabel","RouteInfo","validateSearch","head","match","meta","title","component","lazyRouteComponent","$$splitComponentImporter","notFoundComponent","$$splitNotFoundComponentImporter","loader","context","trpcClient","auth","getAvailableServices","query","client","beforeLoad"],"sources":["../../src/client/routes/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/index.tsx"],"sourcesContent":["import { createFileRoute, redirect, useParams } from \"@tanstack/react-router\"\nimport { getServiceIndex } from \"@/server/Authentication/helpers\"\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 { z } from \"zod\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\n\nexport const checkServiceAvailability = (\n availableServices: {\n type: string\n name: string\n }[],\n params: {\n projectId: string\n provider: string\n storageType: string\n containerName: string\n }\n) => {\n const { provider, projectId, storageType, containerName } = params\n\n const serviceIndex = getServiceIndex(availableServices)\n\n // Redirect to the \"Projects Overview\" page if no storage services available\n if (!serviceIndex[\"object-store\"]) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n\n // Check provider availability\n const hasSwift = Boolean(serviceIndex[\"object-store\"][\"swift\"])\n const hasCeph = Boolean(serviceIndex[\"object-store\"][\"ceph\"])\n\n // TEMPORARY: Allow Ceph access even if not in catalog (relies on env config)\n // TODO: Properly register Ceph in OpenStack service catalog\n const cephFallbackEnabled = true // Set to false once Ceph is in catalog\n\n // Effective availability includes fallback flag for Ceph\n const hasEffectiveCeph = hasCeph || cephFallbackEnabled\n const fallbackProvider = hasSwift ? \"swift\" : hasEffectiveCeph ? \"ceph\" : null\n const fallbackStorageType = hasSwift ? \"containers\" : hasEffectiveCeph ? \"buckets\" : null\n\n if (provider !== \"swift\" && provider !== \"ceph\") {\n if (!fallbackProvider || !fallbackStorageType) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n throw redirect({\n to: \"/projects/$projectId/storage/$provider/$storageType/$containerName/objects\",\n params: { projectId, provider: fallbackProvider, storageType: fallbackStorageType, containerName },\n })\n }\n\n if (provider === \"swift\" && !hasSwift) {\n if (!hasEffectiveCeph) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n\n throw redirect({\n to: \"/projects/$projectId/storage/$provider/$storageType/$containerName/objects\",\n params: { projectId, provider: \"ceph\", storageType: \"buckets\", containerName },\n })\n }\n\n if (provider === \"ceph\" && !hasEffectiveCeph) {\n if (!hasSwift) {\n throw redirect({\n to: \"/projects/$projectId\",\n params: { projectId },\n })\n }\n\n throw redirect({\n to: \"/projects/$projectId/storage/$provider/$storageType/$containerName/objects\",\n params: { projectId, provider: \"swift\", storageType: \"containers\", containerName },\n })\n }\n\n // Canonicalize the URL terminology for the resolved provider. Availability is\n // already settled above, so by this point provider is a valid, available\n // swift|ceph. The storageType segment is user-controllable and the router never\n // validates it, so a mismatched noun (e.g. ceph + \"containers\", swift + \"buckets\")\n // must redirect to the canonical path to keep URLs normalized.\n if (provider === \"swift\" || provider === \"ceph\") {\n const expectedStorageType = provider === \"swift\" ? \"containers\" : \"buckets\"\n if (storageType !== expectedStorageType) {\n throw redirect({\n to: \"/projects/$projectId/storage/$provider/$storageType/$containerName/objects\",\n params: { projectId, provider, storageType: expectedStorageType, containerName },\n })\n }\n }\n}\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\nconst objectsSearchSchema = z.object({\n prefix: z.string().optional(),\n sortBy: z.enum([\"name\", \"last_modified\", \"bytes\", \"lastModified\", \"size\"]).optional(),\n sortDirection: z.enum([\"asc\", \"desc\"]).optional(),\n search: z.string().optional(),\n tab: z.enum([\"all\", \"deleted\"]).optional().default(\"all\"),\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 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\nfunction ObjectsDashboard() {\n const { project, provider, containerName } = useParams({\n from: \"/_auth/projects/$projectId/storage/$provider/$storageType/$containerName/objects/\",\n select: (params) => ({\n project: params.projectId,\n provider: params.provider,\n containerName: params.containerName,\n storageType: params.storageType,\n }),\n })\n\n const { prefix, sortBy, sortDirection, search } = Route.useSearch()\n\n // For Ceph buckets, we need to show ContentHeader\n // For Swift containers, the component handles its own header\n const showContentHeader = provider === \"ceph\"\n\n return (\n <>\n {showContentHeader && <ContentHeader title={containerName} projectId={project} />}\n <div>\n {project ? (\n <ErrorBoundary\n resetKeys={[project, provider, containerName, prefix, sortBy, sortDirection, search]}\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 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":";;;;4FAUaI,KACXC,GAIAG,MAAAA;CAOA,IAAM,EAAEE,aAAUD,cAAWE,gBAAaC,qBAAkBJ,GAEtDK,IAAeX,EAAgBG,CAAAA;CAGrC,IAAI,CAACQ,EAAa,iBAChB,MAAMZ,EAAS;EACba,IAAI;EACJN,QAAQ,EAAEC,aAAU;CACtB,CAAA;CAIF,IAAMM,IAAWC,EAAQH,EAAa,gBAAgB,OAQhDM,IAPUH,EAAQH,EAAa,gBAAgB,QAOjBK,IAC9BE,IAAmBL,IAAW,UAAUI,IAAmB,SAAS,MACpEE,IAAsBN,IAAW,eAAeI,IAAmB,YAAY;CAErF,IAAIT,MAAa,WAAWA,MAAa,QAOvC,MALQT,EADJ,CAACmB,KAAoB,CAACC,IACT;EACbP,IAAI;EACJN,QAAQ,EAAEC,aAAU;CACtB,IAEa;EACbK,IAAI;EACJN,QAAQ;GAAEC;GAAWC,UAAUU;GAAkBT,aAAaU;GAAqBT;EAAc;CACnG,CALE;CAQJ,IAAIF,MAAa,WAAW,CAACK,GAQ3B,MAAMd,EAPDkB,IAOU;EACbL,IAAI;EACJN,QAAQ;GAAEC;GAAWC,UAAU;GAAQC,aAAa;GAAWC;EAAc;CAC/E,IATiB;EACbE,IAAI;EACJN,QAAQ,EAAEC,aAAU;CACtB,CAAA;CASJ,IAAIC,MAAa,UAAU,CAACS,GAQ1B,MAAMlB,EAPDc,IAOU;EACbD,IAAI;EACJN,QAAQ;GAAEC;GAAWC,UAAU;GAASC,aAAa;GAAcC;EAAc;CACnF,IATiB;EACbE,IAAI;EACJN,QAAQ,EAAEC,aAAU;CACtB,CAAA;CAcJ,IAAIC,MAAa,WAAWA,MAAa,QAAQ;EAC/C,IAAMY,IAAsBZ,MAAa,UAAU,eAAe;EAClE,IAAIC,MAAgBW,GAClB,MAAMrB,EAAS;GACba,IAAI;GACJN,QAAQ;IAAEC;IAAWC;IAAUC,aAAaW;IAAqBV;GAAc;EACjF,CAAA;CAEJ;AACF,GAOMW,IAAsBpB,EAAEqB,OAAO;CACnCC,QAAQtB,EAAEuB,OAAM,EAAGC,SAAQ;CAC3BC,QAAQzB,EAAE0B,KAAK;EAAC;EAAQ;EAAiB;EAAS;EAAgB;EAAO,EAAEF,SAAQ;CACnFG,eAAe3B,EAAE0B,KAAK,CAAC,OAAO,MAAA,CAAO,EAAEF,SAAQ;CAC/CI,QAAQ5B,EAAEuB,OAAM,EAAGC,SAAQ;CAC3BK,KAAK7B,EAAE0B,KAAK,CAAC,OAAO,SAAA,CAAU,EAAEF,SAAQ,EAAGM,QAAQ,KAAA;AACrD,CAAA,GAEaC,IAAQlC,EACnB,mFAAA,EACA;CACAmC,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,UAAU;EACVC,cAAc,EAAEC,UAAU,UAAU;EACpCC,OAAO;GAAEC,iBAAiB;GAAY5B,IAAI;EAAsD;CAClG;CACA8B,gBAAgBrB;CAChBsB,OAAO,EAAEC,gBAAa,EACpBC,MAAM,CAAC,EAAEC,OAAOF,EAAMtC,OAAOI,cAAc,CAAA,EAC7C;CACAqC,WAASC,EAAAC,GAAA,WAAA;CAGTC,mBAAiBF,EAAAG,GAAA,mBAAA;CAOjBC,QAAQ,OAAO,EAAEC,iBAAS;EACxB,IAAM,EAAEC,kBAAeD;EAGvB,OAAO;GACLK,QAAQJ;GACRnD,mBAAAA,MAJ8BmD,GAAYC,KAAKC,qBAAqBC,MAAAA;EAKtE;CACF;CACAE,YAAY,OAAO,EAAEN,YAAS/C,gBAAQ;EACpC,IAAM,EAAEgD,kBAAeD;EAEvBnD,EAAyBC,MADOmD,GAAYC,KAAKC,qBAAqBC,MAAAA,GACzBnD,CAAAA;CAC/C;AACF,CAAA"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { A as e, B as t, C as n, E as r, G as i, H as a, K as o, P as s, R as c, U as l, Y as u, at as d, o as f, r as p, rt as m, tt as h, y as g } from "./build-DgeVmENN.mjs";
|
|
2
2
|
import { r as _ } from "./trpcClient-BzPUgiM2.mjs";
|
|
3
|
-
import { t as v } from "./pca-
|
|
4
|
-
import { t as y } from "./ContentHeader-
|
|
3
|
+
import { t as v } from "./pca-C9MKOi3Z.mjs";
|
|
4
|
+
import { t as y } from "./ContentHeader-D2nIdJKJ.mjs";
|
|
5
5
|
import { t as b } from "./useModal-DCs1OJh7.mjs";
|
|
6
6
|
import { t as x } from "./useProjectId-DBc5lpoU.mjs";
|
|
7
7
|
import "./hooks-CMgoYcDG.mjs";
|
|
8
|
-
import { n as S, r as C, t as w } from "./constants-
|
|
8
|
+
import { n as S, r as C, t as w } from "./constants-D6IO9bPs.mjs";
|
|
9
9
|
import { Fragment as T, jsx as E, jsxs as D } from "react/jsx-runtime";
|
|
10
10
|
import { useState as O } from "react";
|
|
11
11
|
import { useNavigate as k } from "@tanstack/react-router";
|
|
@@ -14,105 +14,105 @@ import { z as M } from "zod";
|
|
|
14
14
|
import { useForm as N, useStore as P } from "@tanstack/react-form";
|
|
15
15
|
//#region src/client/routes/_auth/projects/$projectId/services/pca/-components/-table/PcaTableRow.tsx
|
|
16
16
|
var F = ({ pca: t }) => {
|
|
17
|
-
let { i18n:
|
|
17
|
+
let { i18n: n, _: a } = j(), o = k(), s = x(), [c, l] = b(!1), u = () => o({
|
|
18
18
|
to: "/projects/$projectId/services/pca/$pcaId",
|
|
19
19
|
params: {
|
|
20
20
|
projectId: s,
|
|
21
21
|
pcaId: t.id
|
|
22
22
|
}
|
|
23
23
|
});
|
|
24
|
-
return /*#__PURE__*/ D(T, { children: [/*#__PURE__*/ D(
|
|
24
|
+
return /*#__PURE__*/ D(T, { children: [/*#__PURE__*/ D(r, {
|
|
25
25
|
"data-testid": `pca-row-${t.id}`,
|
|
26
|
-
onClick:
|
|
26
|
+
onClick: u,
|
|
27
27
|
children: [
|
|
28
|
-
/*#__PURE__*/ E(
|
|
28
|
+
/*#__PURE__*/ E(i, { children: /*#__PURE__*/ D("div", {
|
|
29
29
|
className: "flex items-center gap-2",
|
|
30
30
|
children: [w[t.state].icon, w[t.state].text]
|
|
31
31
|
}) }),
|
|
32
|
-
/*#__PURE__*/ E(
|
|
33
|
-
/*#__PURE__*/ E(
|
|
34
|
-
/*#__PURE__*/ E(
|
|
32
|
+
/*#__PURE__*/ E(i, { children: t.id }),
|
|
33
|
+
/*#__PURE__*/ E(i, { children: t.configuration?.subject?.common_name || "—" }),
|
|
34
|
+
/*#__PURE__*/ E(i, {
|
|
35
35
|
onClick: (e) => e.stopPropagation(),
|
|
36
36
|
className: "items-end pr-0",
|
|
37
|
-
children: /*#__PURE__*/ E(
|
|
38
|
-
label:
|
|
39
|
-
onClick: f
|
|
40
|
-
}), /*#__PURE__*/ E(d, {
|
|
41
|
-
label: r._({ id: "nzFJqC" }),
|
|
37
|
+
children: /*#__PURE__*/ E(m, { children: /*#__PURE__*/ D(e, { children: [/*#__PURE__*/ E(d, {
|
|
38
|
+
label: n._({ id: "v0hPHE" }),
|
|
42
39
|
onClick: u
|
|
40
|
+
}), /*#__PURE__*/ E(d, {
|
|
41
|
+
label: n._({ id: "nzFJqC" }),
|
|
42
|
+
onClick: l
|
|
43
43
|
})] }) })
|
|
44
44
|
})
|
|
45
45
|
]
|
|
46
46
|
}, t.id), c && /*#__PURE__*/ E(C, {
|
|
47
47
|
pca: t,
|
|
48
48
|
open: c,
|
|
49
|
-
onClose:
|
|
49
|
+
onClose: l
|
|
50
50
|
})] });
|
|
51
|
-
}, I = /^(?=.{1,253}$)(?:\*\.)?(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z]{2,63}$/, L = (e) => I.test(e), R = ({ open: e, onClose:
|
|
52
|
-
let { i18n:
|
|
51
|
+
}, I = /^(?=.{1,253}$)(?:\*\.)?(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z]{2,63}$/, L = (e) => I.test(e), R = ({ open: e, onClose: n }) => {
|
|
52
|
+
let { i18n: r, _: i } = j(), s = k(), c = x(), u = _.useUtils(), { isPending: d, ...m } = _.services.pca.create.useMutation({ onSettled: () => u.services.pca.list.invalidate() }), h = N({
|
|
53
53
|
defaultValues: { common_name: "" },
|
|
54
|
-
validators: { onSubmit: M.object({ common_name: M.string().trim().min(1,
|
|
54
|
+
validators: { onSubmit: M.object({ common_name: M.string().trim().min(1, r._({ id: "qhDo93" })).refine((e) => L(e), { message: r._({ id: "gy6L1u" }) }) }) },
|
|
55
55
|
onSubmit: async ({ value: e }) => {
|
|
56
|
-
if (
|
|
57
|
-
let t = await
|
|
58
|
-
project_id:
|
|
56
|
+
if (d) return;
|
|
57
|
+
let t = await m.mutateAsync({
|
|
58
|
+
project_id: c,
|
|
59
59
|
configuration: { subject: { common_name: e.common_name } }
|
|
60
60
|
});
|
|
61
|
-
|
|
61
|
+
g(), await s({
|
|
62
62
|
to: "/projects/$projectId/services/pca/$pcaId",
|
|
63
63
|
params: {
|
|
64
|
-
projectId:
|
|
64
|
+
projectId: c,
|
|
65
65
|
pcaId: t.id
|
|
66
66
|
}
|
|
67
67
|
});
|
|
68
68
|
}
|
|
69
|
-
}),
|
|
70
|
-
|
|
71
|
-
}, v = P(
|
|
72
|
-
return /*#__PURE__*/ D(
|
|
69
|
+
}), g = () => {
|
|
70
|
+
d || (h.reset(), m.reset(), n());
|
|
71
|
+
}, v = P(h.store, (e) => e.isSubmitting || e.values.common_name.trim().length === 0);
|
|
72
|
+
return /*#__PURE__*/ D(p, {
|
|
73
73
|
open: e,
|
|
74
74
|
size: "large",
|
|
75
|
-
title:
|
|
76
|
-
onCancel:
|
|
77
|
-
cancelButtonLabel:
|
|
78
|
-
confirmButtonLabel:
|
|
79
|
-
onConfirm:
|
|
80
|
-
disableConfirmButton:
|
|
75
|
+
title: r._({ id: "WidMsn" }),
|
|
76
|
+
onCancel: g,
|
|
77
|
+
cancelButtonLabel: r._({ id: "dEgA5A" }),
|
|
78
|
+
confirmButtonLabel: r._({ id: "tfDRzk" }),
|
|
79
|
+
onConfirm: h.handleSubmit,
|
|
80
|
+
disableConfirmButton: d || v,
|
|
81
81
|
children: [
|
|
82
|
-
|
|
82
|
+
m.error?.message && /*#__PURE__*/ E(t, {
|
|
83
83
|
dismissible: !1,
|
|
84
84
|
variant: "error",
|
|
85
85
|
className: "mb-4",
|
|
86
|
-
children:
|
|
86
|
+
children: m.error.message
|
|
87
87
|
}),
|
|
88
|
-
|
|
88
|
+
d && /*#__PURE__*/ D("div", {
|
|
89
89
|
className: "mb-4 flex items-center justify-center gap-2",
|
|
90
|
-
children: [/*#__PURE__*/ E(
|
|
90
|
+
children: [/*#__PURE__*/ E(o, { variant: "primary" }), /*#__PURE__*/ E("span", {
|
|
91
91
|
className: "text-theme-high text-sm",
|
|
92
92
|
children: /*#__PURE__*/ E(A, { id: "wdUvGT" })
|
|
93
93
|
})]
|
|
94
94
|
}),
|
|
95
|
-
!
|
|
95
|
+
!d && /*#__PURE__*/ E(f, {
|
|
96
96
|
className: "mb-0",
|
|
97
97
|
id: "create-certificate-authority-form",
|
|
98
98
|
onSubmit: (e) => {
|
|
99
|
-
e.preventDefault(),
|
|
99
|
+
e.preventDefault(), h.handleSubmit();
|
|
100
100
|
},
|
|
101
|
-
children: /*#__PURE__*/ E(
|
|
101
|
+
children: /*#__PURE__*/ E(a, {
|
|
102
102
|
className: "mb-4",
|
|
103
|
-
children: /*#__PURE__*/ E(
|
|
103
|
+
children: /*#__PURE__*/ E(h.Field, {
|
|
104
104
|
name: "common_name",
|
|
105
|
-
children: (e) => /*#__PURE__*/ E(
|
|
105
|
+
children: (e) => /*#__PURE__*/ E(l, {
|
|
106
106
|
id: e.name,
|
|
107
107
|
name: e.name,
|
|
108
108
|
value: e.state.value,
|
|
109
109
|
onBlur: e.handleBlur,
|
|
110
110
|
onChange: (t) => e.handleChange(t.target.value),
|
|
111
|
-
label:
|
|
112
|
-
placeholder:
|
|
113
|
-
helptext:
|
|
111
|
+
label: r._({ id: "DHrCY6" }),
|
|
112
|
+
placeholder: r._({ id: "RWQ6BN" }),
|
|
113
|
+
helptext: r._({ id: "jVjr9h" }),
|
|
114
114
|
errortext: e.state.meta.errors.map((e) => e?.message).join(", "),
|
|
115
|
-
disabled:
|
|
115
|
+
disabled: d
|
|
116
116
|
})
|
|
117
117
|
})
|
|
118
118
|
})
|
|
@@ -120,59 +120,59 @@ var F = ({ pca: t }) => {
|
|
|
120
120
|
]
|
|
121
121
|
});
|
|
122
122
|
}, z = 50, B = () => {
|
|
123
|
-
let { i18n: e, _:
|
|
124
|
-
project_id:
|
|
123
|
+
let { i18n: e, _: t } = j(), a = x(), l = S(), d = l.length, [f, p] = b(!1), [m, v] = O([void 0]), [y, C] = O(1), w = m[y - 1], { data: T, isLoading: k, isError: M, error: N } = _.services.pca.list.useQuery({
|
|
124
|
+
project_id: a,
|
|
125
125
|
limit: z,
|
|
126
126
|
next_page_marker: w
|
|
127
|
-
}), P = T?.certificate_authorities ?? [], I = T?.next_page_marker, L = I ? y + 1 : y, B = Math.max(L,
|
|
127
|
+
}), P = T?.certificate_authorities ?? [], I = T?.next_page_marker, L = I ? y + 1 : y, B = Math.max(L, m.length), V = (e) => {
|
|
128
128
|
e < 1 || e > B || (e > y && I && v((t) => {
|
|
129
129
|
let n = [...t];
|
|
130
130
|
return n[e - 1] = I, n;
|
|
131
131
|
}), C(e));
|
|
132
132
|
};
|
|
133
|
-
return k ? /*#__PURE__*/ D(
|
|
133
|
+
return k ? /*#__PURE__*/ D(h, {
|
|
134
134
|
className: "py-8",
|
|
135
135
|
distribution: "center",
|
|
136
136
|
alignment: "center",
|
|
137
137
|
direction: "vertical",
|
|
138
|
-
children: [/*#__PURE__*/ E(
|
|
138
|
+
children: [/*#__PURE__*/ E(o, {
|
|
139
139
|
variant: "primary",
|
|
140
140
|
size: "large",
|
|
141
141
|
className: "mb-2"
|
|
142
142
|
}), /*#__PURE__*/ E(A, { id: "Z3FXyt" })]
|
|
143
|
-
}) : M ? /*#__PURE__*/ E(
|
|
143
|
+
}) : M ? /*#__PURE__*/ E(h, {
|
|
144
144
|
className: "py-8",
|
|
145
145
|
distribution: "center",
|
|
146
146
|
alignment: "center",
|
|
147
147
|
direction: "vertical",
|
|
148
148
|
children: N?.message ?? e._({ id: "Sf3Gvg" })
|
|
149
|
-
}) : P.length === 0 && y === 1 ? /*#__PURE__*/ E(
|
|
150
|
-
columns:
|
|
149
|
+
}) : P.length === 0 && y === 1 ? /*#__PURE__*/ E(s, {
|
|
150
|
+
columns: d,
|
|
151
151
|
className: "pca",
|
|
152
152
|
"data-testid": "no-pcas",
|
|
153
|
-
children: /*#__PURE__*/ E(
|
|
154
|
-
colSpan:
|
|
153
|
+
children: /*#__PURE__*/ E(r, { children: /*#__PURE__*/ D(i, {
|
|
154
|
+
colSpan: d,
|
|
155
155
|
children: [/*#__PURE__*/ E(u, { children: /*#__PURE__*/ E(A, { id: "8S2nDL" }) }), /*#__PURE__*/ E("p", { children: /*#__PURE__*/ E(A, { id: "ng+PCh" }) })]
|
|
156
156
|
}) })
|
|
157
157
|
}) : /*#__PURE__*/ D("div", {
|
|
158
158
|
className: "relative",
|
|
159
159
|
children: [
|
|
160
|
-
/*#__PURE__*/ E(
|
|
160
|
+
/*#__PURE__*/ E(h, {
|
|
161
161
|
className: "pt-3 pb-2",
|
|
162
162
|
distribution: "end",
|
|
163
|
-
children: /*#__PURE__*/ E(
|
|
163
|
+
children: /*#__PURE__*/ E(g, {
|
|
164
164
|
variant: "primary",
|
|
165
165
|
label: e._({ id: "WidMsn" }),
|
|
166
|
-
onClick:
|
|
166
|
+
onClick: p
|
|
167
167
|
})
|
|
168
168
|
}),
|
|
169
|
-
/*#__PURE__*/ D(
|
|
170
|
-
columns:
|
|
171
|
-
children: [/*#__PURE__*/ E(
|
|
169
|
+
/*#__PURE__*/ D(s, {
|
|
170
|
+
columns: d,
|
|
171
|
+
children: [/*#__PURE__*/ E(r, { children: l.map((e) => /*#__PURE__*/ E(c, { children: e }, e)) }), P.map((e) => /*#__PURE__*/ E(F, { pca: e }, e.id))]
|
|
172
172
|
}),
|
|
173
173
|
B > 1 && /*#__PURE__*/ E("div", {
|
|
174
174
|
className: "flex justify-center py-4",
|
|
175
|
-
children: /*#__PURE__*/ E(
|
|
175
|
+
children: /*#__PURE__*/ E(n, {
|
|
176
176
|
variant: "input",
|
|
177
177
|
currentPage: y,
|
|
178
178
|
pages: B,
|
|
@@ -180,9 +180,9 @@ var F = ({ pca: t }) => {
|
|
|
180
180
|
onPressNext: () => V(y + 1)
|
|
181
181
|
})
|
|
182
182
|
}),
|
|
183
|
-
|
|
184
|
-
open:
|
|
185
|
-
onClose:
|
|
183
|
+
f && /*#__PURE__*/ E(R, {
|
|
184
|
+
open: f,
|
|
185
|
+
onClose: p
|
|
186
186
|
})
|
|
187
187
|
]
|
|
188
188
|
});
|
|
@@ -199,4 +199,4 @@ function V() {
|
|
|
199
199
|
//#endregion
|
|
200
200
|
export { V as component };
|
|
201
201
|
|
|
202
|
-
//# sourceMappingURL=pca-
|
|
202
|
+
//# sourceMappingURL=pca-BJPxOIgq.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pca-Dc_tdh4-.mjs","names":["useNavigate","DataGridCell","DataGridRow","PopupMenu","PopupMenuItem","PopupMenuOptions","useModal","useProjectId","DeletePcaModal","STATE_CONFIG","PcaTableRow","pca","useLingui","navigate","projectId","deletePcaModalOpen","toggleDeletePcaModal","navigateToDetailsPage","to","params","pcaId","id","data-testid","onClick","div","className","state","icon","text","configuration","subject","common_name","e","stopPropagation","label","t","open","onClose","z","useForm","useStore","useNavigate","Modal","Form","FormSection","Spinner","TextInput","Message","trpcReact","useProjectId","csrRegex","isValidCommonName","value","test","CreatePcaModal","open","onClose","useLingui","navigate","projectId","utils","useUtils","isPending","createPcaMutation","services","pca","create","useMutation","onSettled","list","invalidate","formSchema","object","common_name","string","trim","min","t","refine","message","form","defaultValues","validators","onSubmit","createdPca","mutateAsync","project_id","configuration","subject","handleClose","to","params","pcaId","id","reset","isCreateDisabled","store","state","isSubmitting","values","length","size","title","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","error","dismissible","variant","className","div","span","e","preventDefault","Field","name","children","field","onBlur","handleBlur","onChange","handleChange","target","label","placeholder","helptext","errortext","meta","errors","map","join","disabled","useState","Stack","Spinner","DataGrid","DataGridRow","DataGridCell","ContentHeading","DataGridHeadCell","Button","Pagination","trpcReact","useProjectId","useModal","TABLE_COLUMNS","PcaTableRow","CreatePcaModal","ITEMS_PER_PAGE","PcaListContainer","useLingui","projectId","columns","columnsLength","length","createCaOpen","toggleCreateCa","pageMarkers","setPageMarkers","undefined","currentPage","setCurrentPage","currentMarker","data","isLoading","isError","error","services","pca","list","useQuery","project_id","limit","next_page_marker","pcas","certificate_authorities","nextMarker","computedTotal","totalPages","Math","max","goToPage","page","prev","updated","className","distribution","alignment","direction","variant","size","message","t","data-testid","colSpan","p","div","label","onClick","map","id","pages","onPressPrevious","onPressNext","open","onClose","useLingui","ContentHeader","PcaListContainer","Route","RouteComponent","t","projectId","useParams","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/pca/-components/-table/PcaTableRow.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/-components/-modals/CreatePcaModal.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/-components/PcaListContainer.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/index.tsx?tsr-split=component"],"sourcesContent":["import { useNavigate } from \"@tanstack/react-router\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport {\n DataGridCell,\n DataGridRow,\n PopupMenu,\n PopupMenuItem,\n PopupMenuOptions,\n} from \"@cloudoperators/juno-ui-components\"\nimport { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { DeletePcaModal } from \"../-modals/DeletePcaModal\"\nimport { STATE_CONFIG } from \"./constants\"\n\ninterface PcaTableRowProps {\n pca: CertificateAuthority\n}\n\nexport const PcaTableRow = ({ pca }: PcaTableRowProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n const [deletePcaModalOpen, toggleDeletePcaModal] = useModal(false)\n\n const navigateToDetailsPage = () =>\n navigate({\n to: \"/projects/$projectId/services/pca/$pcaId\",\n params: { projectId, pcaId: pca.id },\n })\n\n return (\n <>\n <DataGridRow key={pca.id} data-testid={`pca-row-${pca.id}`} onClick={navigateToDetailsPage}>\n <DataGridCell>\n <div className=\"flex items-center gap-2\">\n {STATE_CONFIG[pca.state].icon}\n {STATE_CONFIG[pca.state].text}\n </div>\n </DataGridCell>\n <DataGridCell>{pca.id}</DataGridCell>\n <DataGridCell>{pca.configuration?.subject?.common_name || \"—\"}</DataGridCell>\n <DataGridCell onClick={(e) => e.stopPropagation()} className=\"items-end pr-0\">\n <PopupMenu>\n <PopupMenuOptions>\n <PopupMenuItem label={t`Show Details`} onClick={navigateToDetailsPage} />\n <PopupMenuItem label={t`Delete CA`} onClick={toggleDeletePcaModal} />\n </PopupMenuOptions>\n </PopupMenu>\n </DataGridCell>\n </DataGridRow>\n\n {deletePcaModalOpen && <DeletePcaModal pca={pca} open={deletePcaModalOpen} onClose={toggleDeletePcaModal} />}\n </>\n )\n}\n","import { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport { useNavigate } from \"@tanstack/react-router\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Modal, Form, FormSection, Spinner, TextInput, Message } from \"@cloudoperators/juno-ui-components\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nexport interface CreateCaModalProps {\n open: boolean\n onClose: () => void\n}\n\nconst csrRegex = /^(?=.{1,253}$)(?:\\*\\.)?(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\\.)+[A-Za-z]{2,63}$/\nconst isValidCommonName = (value: string) => csrRegex.test(value)\n\nexport const CreatePcaModal = ({ open, onClose }: CreateCaModalProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...createPcaMutation } = trpcReact.services.pca.create.useMutation({\n onSettled: () => utils.services.pca.list.invalidate(),\n })\n\n const formSchema = z.object({\n common_name: z\n .string()\n .trim()\n .min(1, t`Common name is required.`)\n .refine((value) => isValidCommonName(value), { message: t`Must be a valid common name (FQDN).` }),\n })\n\n const form = useForm({\n defaultValues: {\n common_name: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async ({ value }) => {\n if (isPending) return\n\n const createdPca = await createPcaMutation.mutateAsync({\n project_id: projectId,\n configuration: {\n subject: { common_name: value.common_name },\n },\n })\n handleClose()\n\n await navigate({\n to: \"/projects/$projectId/services/pca/$pcaId\",\n params: { projectId, pcaId: createdPca.id },\n })\n },\n })\n\n const handleClose = () => {\n if (isPending) return\n\n form.reset()\n createPcaMutation.reset()\n onClose()\n }\n\n // Reactive subscription used to control create action disabled state.\n const isCreateDisabled = useStore(\n form.store,\n (state) => state.isSubmitting || state.values.common_name.trim().length === 0\n )\n\n return (\n <Modal\n open={open}\n size=\"large\"\n title={t`Create Certificate Authority`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Save`}\n onConfirm={form.handleSubmit}\n disableConfirmButton={isPending || isCreateDisabled}\n >\n {createPcaMutation.error?.message && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {createPcaMutation.error.message}\n </Message>\n )}\n\n {isPending && (\n <div className=\"mb-4 flex items-center justify-center gap-2\">\n <Spinner variant=\"primary\" />\n <span className=\"text-theme-high text-sm\">\n <Trans>Creating Certificate Authority...</Trans>\n </span>\n </div>\n )}\n\n {!isPending && (\n <Form\n className=\"mb-0\"\n id=\"create-certificate-authority-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection className=\"mb-4\">\n <form.Field\n name=\"common_name\"\n children={(field) => (\n <TextInput\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n label={t`Common name`}\n placeholder={t`Enter Common name (e.g., demo-ca.test.sci)`}\n helptext={t`Enter a valid common name in FQDN format (e.g., demo-ca.test.sci).`}\n errortext={field.state.meta.errors.map((e) => e?.message).join(\", \")}\n disabled={isPending}\n />\n )}\n />\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import { Trans, useLingui } from \"@lingui/react/macro\"\nimport { useState } from \"react\"\nimport {\n Stack,\n Spinner,\n DataGrid,\n DataGridRow,\n DataGridCell,\n ContentHeading,\n DataGridHeadCell,\n Button,\n Pagination,\n} from \"@cloudoperators/juno-ui-components\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { TABLE_COLUMNS } from \"./-table/constants\"\nimport { PcaTableRow } from \"./-table/PcaTableRow\"\nimport { CreatePcaModal } from \"./-modals/CreatePcaModal\"\n\nconst ITEMS_PER_PAGE = 50\n\nexport const PcaListContainer = () => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const columns = TABLE_COLUMNS()\n const columnsLength = columns.length\n const [createCaOpen, toggleCreateCa] = useModal(false)\n const [pageMarkers, setPageMarkers] = useState<(string | undefined)[]>([undefined])\n const [currentPage, setCurrentPage] = useState(1)\n\n const currentMarker = pageMarkers[currentPage - 1]\n\n const { data, isLoading, isError, error } = trpcReact.services.pca.list.useQuery({\n project_id: projectId,\n limit: ITEMS_PER_PAGE,\n next_page_marker: currentMarker,\n })\n\n const pcas = data?.certificate_authorities ?? []\n const nextMarker = data?.next_page_marker\n const computedTotal = nextMarker ? currentPage + 1 : currentPage\n const totalPages = Math.max(computedTotal, pageMarkers.length)\n\n const goToPage = (page: number) => {\n if (page < 1 || page > totalPages) return\n if (page > currentPage && nextMarker) {\n setPageMarkers((prev) => {\n const updated = [...prev]\n updated[page - 1] = nextMarker\n return updated\n })\n }\n setCurrentPage(page)\n }\n\n if (isLoading) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading...</Trans>\n </Stack>\n )\n }\n\n if (isError) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n {error?.message ?? t`Failed to load PCAs`}\n </Stack>\n )\n }\n\n if (pcas.length === 0 && currentPage === 1) {\n return (\n <DataGrid columns={columnsLength} className=\"pca\" data-testid=\"no-pcas\">\n <DataGridRow>\n <DataGridCell colSpan={columnsLength}>\n <ContentHeading>\n <Trans>No PCAs found</Trans>\n </ContentHeading>\n <p>\n <Trans>There are no PCAs available for this project.</Trans>\n </p>\n </DataGridCell>\n </DataGridRow>\n </DataGrid>\n )\n }\n\n return (\n <div className=\"relative\">\n <Stack className=\"pt-3 pb-2\" distribution=\"end\">\n <Button variant=\"primary\" label={t`Create Certificate Authority`} onClick={toggleCreateCa} />\n </Stack>\n <DataGrid columns={columnsLength}>\n <DataGridRow>\n {columns.map((label) => (\n <DataGridHeadCell key={label}>{label}</DataGridHeadCell>\n ))}\n </DataGridRow>\n {pcas.map((pca) => (\n <PcaTableRow key={pca.id} pca={pca} />\n ))}\n </DataGrid>\n\n {totalPages > 1 && (\n <div className=\"flex justify-center py-4\">\n <Pagination\n variant=\"input\"\n currentPage={currentPage}\n pages={totalPages}\n onPressPrevious={() => goToPage(currentPage - 1)}\n onPressNext={() => goToPage(currentPage + 1)}\n />\n </div>\n )}\n\n {createCaOpen && <CreatePcaModal open={createCaOpen} onClose={toggleCreateCa} />}\n </div>\n )\n}\n","import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\nimport { PcaListContainer } from \"./-components/PcaListContainer\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/pca/\")({\n staticData: {\n section: \"services\",\n service: \"pca\",\n sectionCrumb: { labelKey: \"Services\" },\n crumb: { labelKey: \"PCA (Clavis)\" },\n } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`PCA` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n const { projectId } = Route.useParams()\n\n return (\n <>\n <ContentHeader title={t`PCA`} projectId={projectId} />\n <PcaListContainer />\n </>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;AAmBA,IAAaU,KAAe,EAAEC,aAAuB;CACnD,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,EAAAA,GACRC,IAAWb,EAAAA,GACXc,IAAYP,EAAAA,GACZ,CAACQ,GAAoBC,KAAwBV,EAAS,EAAA,GAEtDW,UACJJ,EAAS;EACPK,IAAI;EACJC,QAAQ;GAAEL;GAAWM,OAAOT,EAAIU;EAAG;CACrC,CAAA;CAEF,OACE,gBAAA,GAAA,EAAA,UAAA,CACE,gBAACnB,GAAAA;EAAyBoB,eAAa,WAAWX,EAAIU;EAAME,SAASN;;GACnE,gBAAChB,GAAAA,EAAAA,UACC,gBAACuB,OAAAA;IAAIC,WAAU;eACZhB,EAAaE,EAAIe,OAAOC,MACxBlB,EAAaE,EAAIe,OAAOE,IAAAA;;GAG7B,gBAAC3B,GAAAA,EAAAA,UAAcU,EAAIU,GAAAA,CAAAA;GACnB,gBAACpB,GAAAA,EAAAA,UAAcU,EAAIkB,eAAeC,SAASC,eAAe,IAAA,CAAA;GAC1D,gBAAC9B,GAAAA;IAAasB,UAAUS,MAAMA,EAAEC,gBAAe;IAAIR,WAAU;cAC3D,gBAACtB,GAAAA,EAAAA,UACC,gBAACE,GAAAA,EAAAA,UAAAA,CACC,gBAACD,GAAAA;KAAc8B,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAa,CAAA;KAAGZ,SAASN;QAChD,gBAACb,GAAAA;KAAc8B,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAU,CAAA;KAAGZ,SAASP;;;;IAbnCL,EAAIU,EAAE,GAmBvBN,KAAsB,gBAACP,GAAAA;EAAoBG;EAAKyB,MAAMrB;EAAoBsB,SAASrB;;AAG1F,GC1CMkC,IAAW,8FACXC,KAAqBC,MAAkBF,EAASG,KAAKD,CAAAA,GAE9CE,KAAkB,EAAEC,SAAMC,iBAA6B;CAClE,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,EAAAA,GACRC,IAAWjB,EAAAA,GACXkB,IAAYV,EAAAA,GACZW,IAAQZ,EAAUa,SAAQ,GAE1B,EAAEC,cAAW,GAAGC,MAAsBf,EAAUgB,SAASC,IAAIC,OAAOC,YAAY,EACpFC,iBAAiBR,EAAMI,SAASC,IAAII,KAAKC,WAAU,EACrD,CAAA,GAUMU,IAAOzC,EAAQ;EACnB0C,eAAe,EACbR,aAAa,GACf;EACAS,YAAY,EACVC,UAbe7C,EAAEkC,OAAO,EAC1BC,aAAanC,EACVoC,OAAM,EACNC,KAAI,EACJC,IAAI,GAAGC,EAAAA,EAAC,EAAA,IAAA,SAAyB,CAAA,CAAA,EACjCC,QAAQ1B,MAAUD,EAAkBC,CAAAA,GAAQ,EAAE2B,SAASF,EAAAA,EAAC,EAAA,IAAA,SAAoC,CAAA,EAAE,CAAA,EACnG,CAOcN,EACZ;EACAY,UAAU,OAAO,EAAE/B,eAAO;GACxB,IAAIU,GAAW;GAEf,IAAMsB,IAAa,MAAMrB,EAAkBsB,YAAY;IACrDC,YAAY3B;IACZ4B,eAAe,EACbC,SAAS,EAAEf,aAAarB,EAAMqB,YAAY,EAC5C;GACF,CAAA;GAGA,AAFAgB,EAAAA,GAEA,MAAM/B,EAAS;IACbgC,IAAI;IACJC,QAAQ;KAAEhC;KAAWiC,OAAOR,EAAWS;IAAG;GAC5C,CAAA;EACF;CACF,CAAA,GAEMJ,UAAc;EACd3B,MAEJkB,EAAKc,MAAK,GACV/B,EAAkB+B,MAAK,GACvBtC,EAAAA;CACF,GAGMuC,IAAmBvD,EACvBwC,EAAKgB,QACJC,MAAUA,EAAMC,gBAAgBD,EAAME,OAAO1B,YAAYE,KAAI,EAAGyB,WAAW,CAAA;CAG9E,OACE,gBAAC1D,GAAAA;EACOa;EACN8C,MAAK;EACLC,OAAOzB,EAAAA,EAAC,EAAA,IAAA,SAA6B,CAAA;EACrC0B,UAAUd;EACVe,mBAAmB3B,EAAAA,EAAC,EAAA,IAAA,SAAO,CAAA;EAC3B4B,oBAAoB5B,EAAAA,EAAC,EAAA,IAAA,SAAK,CAAA;EAC1B6B,WAAW1B,EAAK2B;EAChBC,sBAAsB9C,KAAaiC;;GAElChC,EAAkB8C,OAAO9B,WACxB,gBAAChC,GAAAA;IAAQ+D,aAAa;IAAOC,SAAQ;IAAQC,WAAU;cACpDjD,EAAkB8C,MAAM9B;;GAI5BjB,KACC,gBAACmD,OAAAA;IAAID,WAAU;eACb,gBAACnE,GAAAA,EAAQkE,SAAQ,UAAA,CAAA,GACjB,gBAACG,QAAAA;KAAKF,WAAU;eACd,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;;GAKL,CAAClD,KACA,gBAACnB,GAAAA;IACCqE,WAAU;IACVnB,IAAG;IACHV,WAAWgC,MAAAA;KAETnC,AADAmC,EAAEC,eAAc,GAChBpC,EAAK2B,aAAY;IACnB;cAEA,gBAAC/D,GAAAA;KAAYoE,WAAU;eACrB,gBAAChC,EAAKqC,OAAK;MACTC,MAAK;MACLC,WAAWC,MACT,gBAAC1E,GAAAA;OACC+C,IAAI2B,EAAMF;OACVA,MAAME,EAAMF;OACZlE,OAAOoE,EAAMvB,MAAM7C;OACnBqE,QAAQD,EAAME;OACdC,WAAWR,MAAMK,EAAMI,aAAaT,EAAEU,OAAOzE,KAAK;OAClD0E,OAAOjD,EAAAA,EAAC,EAAA,IAAA,SAAY,CAAA;OACpBkD,aAAalD,EAAAA,EAAC,EAAA,IAAA,SAA2C,CAAA;OACzDmD,UAAUnD,EAAAA,EAAC,EAAA,IAAA,SAAmE,CAAA;OAC9EoD,WAAWT,EAAMvB,MAAMiC,KAAKC,OAAOC,KAAKjB,MAAMA,GAAGpC,OAAAA,EAASsD,KAAK,IAAA;OAC/DC,UAAUxE;;;;;;;AAS5B,GC/GMyF,IAAiB,IAEVC,UAAmB;CAC9B,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,EAAAA,GACRC,IAAYR,EAAAA,GACZS,IAAUP,EAAAA,GACVQ,IAAgBD,EAAQE,QACxB,CAACC,GAAcC,KAAkBZ,EAAS,EAAA,GAC1C,CAACa,GAAaC,KAAkB1B,EAAiC,CAAC2B,KAAAA,CAAAA,CAAU,GAC5E,CAACC,GAAaC,KAAkB7B,EAAS,CAAA,GAEzC8B,IAAgBL,EAAYG,IAAc,IAE1C,EAAEG,SAAMC,cAAWC,YAASC,aAAUxB,EAAUyB,SAASC,IAAIC,KAAKC,SAAS;EAC/EC,YAAYpB;EACZqB,OAAOxB;EACPyB,kBAAkBX;CACpB,CAAA,GAEMY,IAAOX,GAAMY,2BAA2B,CAAA,GACxCC,IAAab,GAAMU,kBACnBI,IAAgBD,IAAahB,IAAc,IAAIA,GAC/CkB,IAAaC,KAAKC,IAAIH,GAAepB,EAAYH,MAAM,GAEvD2B,KAAYC,MAAAA;EACZA,IAAO,KAAKA,IAAOJ,MACnBI,IAAOtB,KAAegB,KACxBlB,GAAgByB,MAAAA;GACd,IAAMC,IAAU,CAAA,GAAID,CAAAA;GAEpB,OADAC,EAAQF,IAAO,KAAKN,GACbQ;EACT,CAAA,GAEFvB,EAAeqB,CAAAA;CACjB;CAoCA,OAlCIlB,IAEA,gBAAC/B,GAAAA;EAAMoD,WAAU;EAAOC,cAAa;EAASC,WAAU;EAASC,WAAU;aACzE,gBAACtD,GAAAA;GAAQuD,SAAQ;GAAUC,MAAK;GAAQL,WAAU;MAClD,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA,CAAA;MAKFpB,IAEA,gBAAChC,GAAAA;EAAMoD,WAAU;EAAOC,cAAa;EAASC,WAAU;EAASC,WAAU;YACxEtB,GAAOyB,WAAWC,EAAAA,EAAC,EAAA,IAAA,SAAoB,CAAA;MAK1ClB,EAAKpB,WAAW,KAAKM,MAAgB,IAErC,gBAACzB,GAAAA;EAASiB,SAASC;EAAegC,WAAU;EAAMQ,eAAY;YAC5D,gBAACzD,GAAAA,EAAAA,UACC,gBAACC,GAAAA;GAAayD,SAASzC;cACrB,gBAACf,GAAAA,EAAAA,UACC,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA,EAAA,CAAA,GAEF,gBAACyD,KAAAA,EAAAA,UACC,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA,EAAA,CAAA,CAAA;;MASV,gBAACC,OAAAA;EAAIX,WAAU;;GACb,gBAACpD,GAAAA;IAAMoD,WAAU;IAAYC,cAAa;cACxC,gBAAC9C,GAAAA;KAAOiD,SAAQ;KAAUQ,OAAOL,EAAAA,EAAC,EAAA,IAAA,SAA6B,CAAA;KAAGM,SAAS1C;;;GAE7E,gBAACrB,GAAAA;IAASiB,SAASC;eACjB,gBAACjB,GAAAA,EAAAA,UACEgB,EAAQ+C,KAAKF,MACZ,gBAAC1D,GAAAA,EAAAA,UAA8B0D,EAAAA,GAARA,CAAAA,CAAAA,EAAAA,CAAAA,GAG1BvB,EAAKyB,KAAK/B,MACT,gBAACtB,GAAAA,EAA8BsB,OAAAA,GAAbA,EAAIgC,EAAE,CAAA,CAAA;;GAI3BtB,IAAa,KACZ,gBAACkB,OAAAA;IAAIX,WAAU;cACb,gBAAC5C,GAAAA;KACCgD,SAAQ;KACK7B;KACbyC,OAAOvB;KACPwB,uBAAuBrB,EAASrB,IAAc,CAAA;KAC9C2C,mBAAmBtB,EAASrB,IAAc,CAAA;;;GAK/CL,KAAgB,gBAACR,GAAAA;IAAeyD,MAAMjD;IAAckD,SAASjD;;;;AAGpE;;;ACvGA,SAASsD,IAAAA;CACP,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQJ,EAAAA,GACR,EAAEM,iBAAcH,EAAMI,UAAS;CAErC,OACE,gBAAA,GAAA,EAAA,UAAA,CACE,gBAAC,GAAA;EAAc,OAAOF,EAAAA,EAAC,EAAA,IAAA,SAAA,CAAA;EAAkBC;KACzC,gBAAC,GAAA,CAAA,CAAA,CAAA,EAAA,CAAA;AAGP"}
|
|
1
|
+
{"version":3,"file":"pca-BJPxOIgq.mjs","names":["useNavigate","DataGridCell","DataGridRow","PopupMenu","PopupMenuItem","PopupMenuOptions","useModal","useProjectId","DeletePcaModal","STATE_CONFIG","PcaTableRow","pca","useLingui","navigate","projectId","deletePcaModalOpen","toggleDeletePcaModal","navigateToDetailsPage","to","params","pcaId","id","data-testid","onClick","div","className","state","icon","text","configuration","subject","common_name","e","stopPropagation","label","t","open","onClose","z","useForm","useStore","useNavigate","Modal","Form","FormSection","Spinner","TextInput","Message","trpcReact","useProjectId","csrRegex","isValidCommonName","value","test","CreatePcaModal","open","onClose","useLingui","navigate","projectId","utils","useUtils","isPending","createPcaMutation","services","pca","create","useMutation","onSettled","list","invalidate","formSchema","object","common_name","string","trim","min","t","refine","message","form","defaultValues","validators","onSubmit","createdPca","mutateAsync","project_id","configuration","subject","handleClose","to","params","pcaId","id","reset","isCreateDisabled","store","state","isSubmitting","values","length","size","title","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","error","dismissible","variant","className","div","span","e","preventDefault","Field","name","children","field","onBlur","handleBlur","onChange","handleChange","target","label","placeholder","helptext","errortext","meta","errors","map","join","disabled","useState","Stack","Spinner","DataGrid","DataGridRow","DataGridCell","ContentHeading","DataGridHeadCell","Button","Pagination","trpcReact","useProjectId","useModal","TABLE_COLUMNS","PcaTableRow","CreatePcaModal","ITEMS_PER_PAGE","PcaListContainer","useLingui","projectId","columns","columnsLength","length","createCaOpen","toggleCreateCa","pageMarkers","setPageMarkers","undefined","currentPage","setCurrentPage","currentMarker","data","isLoading","isError","error","services","pca","list","useQuery","project_id","limit","next_page_marker","pcas","certificate_authorities","nextMarker","computedTotal","totalPages","Math","max","goToPage","page","prev","updated","className","distribution","alignment","direction","variant","size","message","t","data-testid","colSpan","p","div","label","onClick","map","id","pages","onPressPrevious","onPressNext","open","onClose","useLingui","ContentHeader","PcaListContainer","Route","RouteComponent","t","projectId","useParams","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/pca/-components/-table/PcaTableRow.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/-components/-modals/CreatePcaModal.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/-components/PcaListContainer.tsx","../../src/client/routes/_auth/projects/$projectId/services/pca/index.tsx?tsr-split=component"],"sourcesContent":["import { useNavigate } from \"@tanstack/react-router\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport {\n DataGridCell,\n DataGridRow,\n PopupMenu,\n PopupMenuItem,\n PopupMenuOptions,\n} from \"@cloudoperators/juno-ui-components\"\nimport { CertificateAuthority } from \"@/server/Services/types/pca\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { DeletePcaModal } from \"../-modals/DeletePcaModal\"\nimport { STATE_CONFIG } from \"./constants\"\n\ninterface PcaTableRowProps {\n pca: CertificateAuthority\n}\n\nexport const PcaTableRow = ({ pca }: PcaTableRowProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n const [deletePcaModalOpen, toggleDeletePcaModal] = useModal(false)\n\n const navigateToDetailsPage = () =>\n navigate({\n to: \"/projects/$projectId/services/pca/$pcaId\",\n params: { projectId, pcaId: pca.id },\n })\n\n return (\n <>\n <DataGridRow key={pca.id} data-testid={`pca-row-${pca.id}`} onClick={navigateToDetailsPage}>\n <DataGridCell>\n <div className=\"flex items-center gap-2\">\n {STATE_CONFIG[pca.state].icon}\n {STATE_CONFIG[pca.state].text}\n </div>\n </DataGridCell>\n <DataGridCell>{pca.id}</DataGridCell>\n <DataGridCell>{pca.configuration?.subject?.common_name || \"—\"}</DataGridCell>\n <DataGridCell onClick={(e) => e.stopPropagation()} className=\"items-end pr-0\">\n <PopupMenu>\n <PopupMenuOptions>\n <PopupMenuItem label={t`Show Details`} onClick={navigateToDetailsPage} />\n <PopupMenuItem label={t`Delete CA`} onClick={toggleDeletePcaModal} />\n </PopupMenuOptions>\n </PopupMenu>\n </DataGridCell>\n </DataGridRow>\n\n {deletePcaModalOpen && <DeletePcaModal pca={pca} open={deletePcaModalOpen} onClose={toggleDeletePcaModal} />}\n </>\n )\n}\n","import { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport { useNavigate } from \"@tanstack/react-router\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { Modal, Form, FormSection, Spinner, TextInput, Message } from \"@cloudoperators/juno-ui-components\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nexport interface CreateCaModalProps {\n open: boolean\n onClose: () => void\n}\n\nconst csrRegex = /^(?=.{1,253}$)(?:\\*\\.)?(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\\.)+[A-Za-z]{2,63}$/\nconst isValidCommonName = (value: string) => csrRegex.test(value)\n\nexport const CreatePcaModal = ({ open, onClose }: CreateCaModalProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...createPcaMutation } = trpcReact.services.pca.create.useMutation({\n onSettled: () => utils.services.pca.list.invalidate(),\n })\n\n const formSchema = z.object({\n common_name: z\n .string()\n .trim()\n .min(1, t`Common name is required.`)\n .refine((value) => isValidCommonName(value), { message: t`Must be a valid common name (FQDN).` }),\n })\n\n const form = useForm({\n defaultValues: {\n common_name: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async ({ value }) => {\n if (isPending) return\n\n const createdPca = await createPcaMutation.mutateAsync({\n project_id: projectId,\n configuration: {\n subject: { common_name: value.common_name },\n },\n })\n handleClose()\n\n await navigate({\n to: \"/projects/$projectId/services/pca/$pcaId\",\n params: { projectId, pcaId: createdPca.id },\n })\n },\n })\n\n const handleClose = () => {\n if (isPending) return\n\n form.reset()\n createPcaMutation.reset()\n onClose()\n }\n\n // Reactive subscription used to control create action disabled state.\n const isCreateDisabled = useStore(\n form.store,\n (state) => state.isSubmitting || state.values.common_name.trim().length === 0\n )\n\n return (\n <Modal\n open={open}\n size=\"large\"\n title={t`Create Certificate Authority`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Save`}\n onConfirm={form.handleSubmit}\n disableConfirmButton={isPending || isCreateDisabled}\n >\n {createPcaMutation.error?.message && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {createPcaMutation.error.message}\n </Message>\n )}\n\n {isPending && (\n <div className=\"mb-4 flex items-center justify-center gap-2\">\n <Spinner variant=\"primary\" />\n <span className=\"text-theme-high text-sm\">\n <Trans>Creating Certificate Authority...</Trans>\n </span>\n </div>\n )}\n\n {!isPending && (\n <Form\n className=\"mb-0\"\n id=\"create-certificate-authority-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection className=\"mb-4\">\n <form.Field\n name=\"common_name\"\n children={(field) => (\n <TextInput\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n label={t`Common name`}\n placeholder={t`Enter Common name (e.g., demo-ca.test.sci)`}\n helptext={t`Enter a valid common name in FQDN format (e.g., demo-ca.test.sci).`}\n errortext={field.state.meta.errors.map((e) => e?.message).join(\", \")}\n disabled={isPending}\n />\n )}\n />\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import { Trans, useLingui } from \"@lingui/react/macro\"\nimport { useState } from \"react\"\nimport {\n Stack,\n Spinner,\n DataGrid,\n DataGridRow,\n DataGridCell,\n ContentHeading,\n DataGridHeadCell,\n Button,\n Pagination,\n} from \"@cloudoperators/juno-ui-components\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { TABLE_COLUMNS } from \"./-table/constants\"\nimport { PcaTableRow } from \"./-table/PcaTableRow\"\nimport { CreatePcaModal } from \"./-modals/CreatePcaModal\"\n\nconst ITEMS_PER_PAGE = 50\n\nexport const PcaListContainer = () => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const columns = TABLE_COLUMNS()\n const columnsLength = columns.length\n const [createCaOpen, toggleCreateCa] = useModal(false)\n const [pageMarkers, setPageMarkers] = useState<(string | undefined)[]>([undefined])\n const [currentPage, setCurrentPage] = useState(1)\n\n const currentMarker = pageMarkers[currentPage - 1]\n\n const { data, isLoading, isError, error } = trpcReact.services.pca.list.useQuery({\n project_id: projectId,\n limit: ITEMS_PER_PAGE,\n next_page_marker: currentMarker,\n })\n\n const pcas = data?.certificate_authorities ?? []\n const nextMarker = data?.next_page_marker\n const computedTotal = nextMarker ? currentPage + 1 : currentPage\n const totalPages = Math.max(computedTotal, pageMarkers.length)\n\n const goToPage = (page: number) => {\n if (page < 1 || page > totalPages) return\n if (page > currentPage && nextMarker) {\n setPageMarkers((prev) => {\n const updated = [...prev]\n updated[page - 1] = nextMarker\n return updated\n })\n }\n setCurrentPage(page)\n }\n\n if (isLoading) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading...</Trans>\n </Stack>\n )\n }\n\n if (isError) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n {error?.message ?? t`Failed to load PCAs`}\n </Stack>\n )\n }\n\n if (pcas.length === 0 && currentPage === 1) {\n return (\n <DataGrid columns={columnsLength} className=\"pca\" data-testid=\"no-pcas\">\n <DataGridRow>\n <DataGridCell colSpan={columnsLength}>\n <ContentHeading>\n <Trans>No PCAs found</Trans>\n </ContentHeading>\n <p>\n <Trans>There are no PCAs available for this project.</Trans>\n </p>\n </DataGridCell>\n </DataGridRow>\n </DataGrid>\n )\n }\n\n return (\n <div className=\"relative\">\n <Stack className=\"pt-3 pb-2\" distribution=\"end\">\n <Button variant=\"primary\" label={t`Create Certificate Authority`} onClick={toggleCreateCa} />\n </Stack>\n <DataGrid columns={columnsLength}>\n <DataGridRow>\n {columns.map((label) => (\n <DataGridHeadCell key={label}>{label}</DataGridHeadCell>\n ))}\n </DataGridRow>\n {pcas.map((pca) => (\n <PcaTableRow key={pca.id} pca={pca} />\n ))}\n </DataGrid>\n\n {totalPages > 1 && (\n <div className=\"flex justify-center py-4\">\n <Pagination\n variant=\"input\"\n currentPage={currentPage}\n pages={totalPages}\n onPressPrevious={() => goToPage(currentPage - 1)}\n onPressNext={() => goToPage(currentPage + 1)}\n />\n </div>\n )}\n\n {createCaOpen && <CreatePcaModal open={createCaOpen} onClose={toggleCreateCa} />}\n </div>\n )\n}\n","import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\nimport { PcaListContainer } from \"./-components/PcaListContainer\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/pca/\")({\n staticData: {\n section: \"services\",\n service: \"pca\",\n sectionCrumb: { labelKey: \"Services\" },\n crumb: { labelKey: \"PCA (Clavis)\" },\n } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`PCA` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n const { projectId } = Route.useParams()\n\n return (\n <>\n <ContentHeader title={t`PCA`} projectId={projectId} />\n <PcaListContainer />\n </>\n )\n}\n"],"mappings":"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"}
|
|
@@ -8,9 +8,9 @@ var r = e("/_auth/projects/$projectId/services/pca/")({
|
|
|
8
8
|
crumb: { labelKey: "PCA (Clavis)" }
|
|
9
9
|
},
|
|
10
10
|
head: () => ({ meta: [{ title: n._({ id: "ffw//c" }) }] }),
|
|
11
|
-
component: t(() => import("./pca-
|
|
11
|
+
component: t(() => import("./pca-BJPxOIgq.mjs"), "component")
|
|
12
12
|
});
|
|
13
13
|
//#endregion
|
|
14
14
|
export { r as t };
|
|
15
15
|
|
|
16
|
-
//# sourceMappingURL=pca-
|
|
16
|
+
//# sourceMappingURL=pca-C9MKOi3Z.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pca-
|
|
1
|
+
{"version":3,"file":"pca-C9MKOi3Z.mjs","names":["createFileRoute","t","Route","staticData","section","service","sectionCrumb","labelKey","crumb","RouteInfo","head","meta","title","component","lazyRouteComponent","$$splitComponentImporter"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/pca/index.tsx"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\nimport { PcaListContainer } from \"./-components/PcaListContainer\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/pca/\")({\n staticData: {\n section: \"services\",\n service: \"pca\",\n sectionCrumb: { labelKey: \"Services\" },\n crumb: { labelKey: \"PCA (Clavis)\" },\n } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`PCA` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n const { projectId } = Route.useParams()\n\n return (\n <>\n <ContentHeader title={t`PCA`} projectId={projectId} />\n <PcaListContainer />\n </>\n )\n}\n"],"mappings":";;AAOA,IAAaE,IAAQF,EAAgB,0CAAA,EAA4C;CAC/EG,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,cAAc,EAAEC,UAAU,WAAW;EACrCC,OAAO,EAAED,UAAU,eAAe;CACpC;CACAG,aAAa,EAAEC,MAAM,CAAC,EAAEC,OAAOX,EAAAA,EAAC,EAAA,IAAA,SAAA,CAAA,EAAM,CAAA,EAAG;CACzCY,WAASC,sCAAA,WAAA;AACX,CAAA"}
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Y as e, Z as t, n, x as r } from "./build-DgeVmENN.mjs";
|
|
2
2
|
import { t as i } from "./Slot-CWb612-_.mjs";
|
|
3
|
-
import { t as a } from "./projects-
|
|
3
|
+
import { t as a } from "./projects-CGjBlG2w.mjs";
|
|
4
4
|
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
5
5
|
import { useEffect as c, useRef as l, useState as u } from "react";
|
|
6
6
|
import { useNavigate as d, useRouteContext as f } from "@tanstack/react-router";
|
|
7
7
|
import { Trans as p, useLingui as m } from "@lingui/react";
|
|
8
8
|
//#region src/client/routes/_auth/projects/-components/ProjectOverviewNavBar.tsx
|
|
9
|
-
function h({ onSearch:
|
|
10
|
-
let { i18n: r, _: i } = m(), a = l(null), s = l(!1), [d, f] = u(
|
|
9
|
+
function h({ onSearch: e, searchTerm: t = "" }) {
|
|
10
|
+
let { i18n: r, _: i } = m(), a = l(null), s = l(!1), [d, f] = u(t);
|
|
11
11
|
return c(() => {
|
|
12
|
-
!s.current && !a.current &&
|
|
13
|
-
}, [
|
|
12
|
+
!s.current && !a.current && t !== d && f(t);
|
|
13
|
+
}, [t]), c(() => () => {
|
|
14
14
|
a.current && clearTimeout(a.current);
|
|
15
|
-
}, []), /*#__PURE__*/ o(
|
|
15
|
+
}, []), /*#__PURE__*/ o(n, {
|
|
16
16
|
className: "w-full",
|
|
17
17
|
type: "text",
|
|
18
18
|
placeholder: r._({ id: "YIix5Y" }),
|
|
19
|
-
onChange: (
|
|
20
|
-
let n =
|
|
19
|
+
onChange: (t) => {
|
|
20
|
+
let n = t.target.value;
|
|
21
21
|
f(n), a.current && clearTimeout(a.current), a.current = setTimeout(() => {
|
|
22
|
-
a.current = null,
|
|
22
|
+
a.current = null, e(n);
|
|
23
23
|
}, 300);
|
|
24
24
|
},
|
|
25
25
|
onFocus: () => {
|
|
@@ -29,7 +29,7 @@ function h({ onSearch: t, searchTerm: n = "" }) {
|
|
|
29
29
|
s.current = !1;
|
|
30
30
|
},
|
|
31
31
|
onClear: () => {
|
|
32
|
-
a.current &&= (clearTimeout(a.current), null), f(""),
|
|
32
|
+
a.current &&= (clearTimeout(a.current), null), f(""), e("");
|
|
33
33
|
},
|
|
34
34
|
value: d
|
|
35
35
|
});
|
|
@@ -66,21 +66,18 @@ function _({ projects: e }) {
|
|
|
66
66
|
className: "w-full",
|
|
67
67
|
children: /*#__PURE__*/ o("div", {
|
|
68
68
|
className: "grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4",
|
|
69
|
-
children: e?.length ? e.map((e) => /*#__PURE__*/ o(g, { project: e }, e.id)) : /*#__PURE__*/ o("p", {
|
|
70
|
-
className: "text-center",
|
|
71
|
-
children: /*#__PURE__*/ o(p, { id: "Zgp2Sm" })
|
|
72
|
-
})
|
|
69
|
+
children: e?.length ? [...e].sort((e, t) => e.name.localeCompare(t.name)).map((e) => /*#__PURE__*/ o(g, { project: e }, e.id)) : /*#__PURE__*/ o("p", { children: /*#__PURE__*/ o(p, { id: "Zgp2Sm" }) })
|
|
73
70
|
})
|
|
74
71
|
});
|
|
75
72
|
}
|
|
76
73
|
//#endregion
|
|
77
74
|
//#region src/client/routes/_auth/projects/index.tsx?tsr-split=component
|
|
78
75
|
function v() {
|
|
79
|
-
let { projects:
|
|
76
|
+
let { projects: n } = a.useLoaderData(), { search: r = "" } = a.useSearch(), c = a.useNavigate(), { slots: l } = f({ strict: !1 });
|
|
80
77
|
return /*#__PURE__*/ s(t, {
|
|
81
78
|
py: !0,
|
|
82
79
|
children: [
|
|
83
|
-
/*#__PURE__*/ o(
|
|
80
|
+
/*#__PURE__*/ o(e, {
|
|
84
81
|
className: "pb-4",
|
|
85
82
|
children: /*#__PURE__*/ o(p, { id: "+0B+ue" })
|
|
86
83
|
}),
|
|
@@ -99,7 +96,7 @@ function v() {
|
|
|
99
96
|
}),
|
|
100
97
|
/*#__PURE__*/ o("div", {
|
|
101
98
|
className: "pt-5",
|
|
102
|
-
children: /*#__PURE__*/ o(_, { projects:
|
|
99
|
+
children: /*#__PURE__*/ o(_, { projects: n })
|
|
103
100
|
})
|
|
104
101
|
]
|
|
105
102
|
});
|
|
@@ -107,4 +104,4 @@ function v() {
|
|
|
107
104
|
//#endregion
|
|
108
105
|
export { v as component };
|
|
109
106
|
|
|
110
|
-
//# sourceMappingURL=projects-
|
|
107
|
+
//# sourceMappingURL=projects-C3wR-lvM.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects-C3wR-lvM.mjs","names":["useEffect","useRef","useState","SearchInput","ProjectsOverviewNavBar","onSearch","searchTerm","useLingui","timerRef","inputFocusedRef","inputValue","setInputValue","current","clearTimeout","handleSearchChange","e","value","target","setTimeout","handleClear","className","type","placeholder","t","onChange","onFocus","onBlur","onClear","useNavigate","Card","ProjectCard","project","navigate","padding","onClick","to","params","projectId","id","className","div","p","domain_name","domain_id","data-testid","name","description","ProjectCardView","projects","length","sort","a","b","localeCompare","map","useRouteContext","ProjectsOverviewNavBar","ProjectCardView","Container","ContentHeading","Trans","Slot","Route","ProjectsOverview","projects","useLoaderData","search","useSearch","navigate","useNavigate","slots","strict","handleSearch","value","replace","projectsBanner","component"],"sources":["../../src/client/routes/_auth/projects/-components/ProjectOverviewNavBar.tsx","../../src/client/routes/_auth/projects/-components/ProjectCardView.tsx","../../src/client/routes/_auth/projects/index.tsx?tsr-split=component"],"sourcesContent":["import { ChangeEvent, useEffect, useRef, useState } from \"react\"\nimport { SearchInput } from \"@cloudoperators/juno-ui-components\"\nimport { useLingui } from \"@lingui/react/macro\"\n\ntype ProjectsOverviewNavBarProps = {\n searchTerm?: string\n onSearch: (value: string) => void\n}\n\nexport function ProjectsOverviewNavBar({ onSearch, searchTerm = \"\" }: ProjectsOverviewNavBarProps) {\n const { t } = useLingui()\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const inputFocusedRef = useRef(false)\n const [inputValue, setInputValue] = useState(searchTerm)\n\n useEffect(() => {\n if (!inputFocusedRef.current && !timerRef.current && searchTerm !== inputValue) {\n setInputValue(searchTerm)\n }\n }, [searchTerm])\n\n useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current)\n }\n }, [])\n\n const handleSearchChange = (e: ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setInputValue(value)\n if (timerRef.current) clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => {\n timerRef.current = null\n onSearch(value)\n }, 300)\n }\n\n const handleClear = () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current)\n timerRef.current = null\n }\n setInputValue(\"\")\n onSearch(\"\")\n }\n\n return (\n <SearchInput\n className=\"w-full\"\n type=\"text\"\n placeholder={t`Search...`}\n onChange={handleSearchChange}\n onFocus={() => {\n inputFocusedRef.current = true\n }}\n onBlur={() => {\n inputFocusedRef.current = false\n }}\n onClear={handleClear}\n value={inputValue}\n />\n )\n}\n","import { useNavigate } from \"@tanstack/react-router\"\nimport { Project } from \"@/server/Project/types/models\"\nimport { Card } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\n\ntype ProjectCardProps = {\n project: Project\n}\ntype ProjectCardViewProps = {\n projects: Project[] | undefined\n}\n\nexport function ProjectCard({ project }: ProjectCardProps) {\n const navigate = useNavigate()\n return (\n <Card\n padding\n onClick={() => navigate({ to: \"/projects/$projectId\", params: { projectId: project.id } })}\n className=\"flex flex-col gap-4\"\n >\n <div className=\"flex min-w-0 flex-col\">\n <p className=\"text-theme-light text-xs leading-5 font-normal\">\n {project.domain_name ?? project.domain_id ?? <Trans>Unknown domain</Trans>}\n </p>\n <p data-testid=\"project-name\" className=\"text-theme-high text-lg leading-7 font-bold\">\n {project.name}\n </p>\n </div>\n {project.description && (\n <p className=\"text-theme-default line-clamp-2 text-sm font-normal\">{project.description}</p>\n )}\n </Card>\n )\n}\n\nexport function ProjectCardView({ projects }: ProjectCardViewProps) {\n return (\n <div className=\"w-full\">\n <div className=\"grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4\">\n {projects?.length ? (\n [...projects]\n .sort((a, b) => a.name.localeCompare(b.name))\n .map((project) => <ProjectCard key={project.id} project={project} />)\n ) : (\n <p>\n <Trans>No projects available.</Trans>\n </p>\n )}\n </div>\n </div>\n )\n}\n","import { createFileRoute } from \"@tanstack/react-router\"\nimport { 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 } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { z } from \"zod\"\nimport { Slot } from \"@/client/components/Slot\"\n\nconst searchSchema = z.object({\n search: z.string().optional(),\n})\n\nexport const Route = createFileRoute(\"/_auth/projects/\")({\n component: ProjectsOverview,\n errorComponent: ({ error }) => (\n <RouteError error={error} safeErrorMessage={error instanceof TRPCClientError ? error.message : undefined} />\n ),\n notFoundComponent: () => {\n return <p>Projects not found</p>\n },\n validateSearch: searchSchema,\n loaderDeps: ({ search }) => ({\n search: search.search || \"\",\n }),\n loader: async ({ context, deps }) => {\n const allProjects = await context.trpcClient?.project.getAuthProjects.query()\n\n let projects = allProjects\n if (deps.search && deps.search.trim() !== \"\") {\n const searchTermLower = deps.search.toLowerCase()\n projects = allProjects?.filter(\n (project) =>\n project.name?.toLowerCase().includes(searchTermLower) ||\n project.description?.toLowerCase().includes(searchTermLower)\n )\n }\n\n return { projects }\n },\n})\n\nfunction ProjectsOverview() {\n const { projects } = Route.useLoaderData()\n const { search = \"\" } = Route.useSearch()\n const navigate = Route.useNavigate()\n const { slots } = useRouteContext({ strict: false })\n\n const handleSearch = (value: string) => {\n navigate({ search: { search: value }, replace: true })\n }\n\n return (\n <Container py>\n <ContentHeading className=\"pb-4\">\n <Trans>Projects</Trans>\n </ContentHeading>\n {slots?.projectsBanner && <Slot component={slots.projectsBanner} useShadowDOM={false} />}\n <ProjectsOverviewNavBar searchTerm={search} onSearch={handleSearch} />\n <div className=\"pt-5\">\n <ProjectCardView projects={projects} />\n </div>\n </Container>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createFileRoute as e, lazyRouteComponent as t } from "@tanstack/react-router";
|
|
2
2
|
import { z as n } from "zod";
|
|
3
3
|
//#region src/client/routes/_auth/projects/index.tsx
|
|
4
|
-
var r = () => import("./projects-yiK0HGSA.mjs"), i = () => import("./projects-
|
|
4
|
+
var r = () => import("./projects-yiK0HGSA.mjs"), i = () => import("./projects-DvSiI5Vg.mjs"), a = () => import("./projects-C3wR-lvM.mjs"), o = n.object({ search: n.string().optional() }), s = e("/_auth/projects/")({
|
|
5
5
|
component: t(a, "component"),
|
|
6
6
|
errorComponent: t(i, "errorComponent"),
|
|
7
7
|
notFoundComponent: t(r, "notFoundComponent"),
|
|
@@ -19,4 +19,4 @@ var r = () => import("./projects-yiK0HGSA.mjs"), i = () => import("./projects-Dp
|
|
|
19
19
|
//#endregion
|
|
20
20
|
export { s as t };
|
|
21
21
|
|
|
22
|
-
//# sourceMappingURL=projects-
|
|
22
|
+
//# sourceMappingURL=projects-CGjBlG2w.mjs.map
|