@cobaltcore-dev/aurora 0.10.0 → 0.11.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 +2 -1
- package/dist/client/AuroraApp.d.ts +2 -0
- package/dist/client/AuthProvider-DZqOvceF.mjs +64 -0
- package/dist/client/AuthProvider-DZqOvceF.mjs.map +1 -0
- package/dist/client/ContentHeader-DsuZD8fa.mjs +110 -0
- package/dist/client/ContentHeader-DsuZD8fa.mjs.map +1 -0
- package/dist/client/{DeleteFlavorModal-C3m7bQJu.mjs → DeleteFlavorModal-RnbspW_2.mjs} +135 -135
- package/dist/client/{DeleteFlavorModal-C3m7bQJu.mjs.map → DeleteFlavorModal-RnbspW_2.mjs.map} +1 -1
- package/dist/client/{DeleteVersionsModal-CyYZfB8d.mjs → DeleteVersionsModal-CsBJzXoW.mjs} +57 -57
- package/dist/client/{DeleteVersionsModal-CyYZfB8d.mjs.map → DeleteVersionsModal-CsBJzXoW.mjs.map} +1 -1
- package/dist/client/{EditSecurityGroupModal-DKusxfta.mjs → EditSecurityGroupModal-BPv3d7am.mjs} +15 -15
- package/dist/client/{EditSecurityGroupModal-DKusxfta.mjs.map → EditSecurityGroupModal-BPv3d7am.mjs.map} +1 -1
- package/dist/client/{FiltersInput-GzR4D0q6.mjs → FiltersInput-CViamP59.mjs} +2 -2
- package/dist/client/{FiltersInput-GzR4D0q6.mjs.map → FiltersInput-CViamP59.mjs.map} +1 -1
- package/dist/client/{FloatingIpActionModals-CRvROJ3H.mjs → FloatingIpActionModals-DTn3HFei.mjs} +45 -45
- package/dist/client/{FloatingIpActionModals-CRvROJ3H.mjs.map → FloatingIpActionModals-DTn3HFei.mjs.map} +1 -1
- package/dist/client/{ImageToastNotifications-BuDXpTkl.mjs → ImageToastNotifications-CFKQZTgf.mjs} +261 -261
- package/dist/client/{ImageToastNotifications-BuDXpTkl.mjs.map → ImageToastNotifications-CFKQZTgf.mjs.map} +1 -1
- package/dist/client/{RouteError-DVAiT0mT.mjs → RouteError-BebIhFpQ.mjs} +2 -2
- package/dist/client/{RouteError-DVAiT0mT.mjs.map → RouteError-BebIhFpQ.mjs.map} +1 -1
- package/dist/client/{SortInput-DLcusjGZ.mjs → SortInput-D0Vb864D.mjs} +2 -2
- package/dist/client/{SortInput-DLcusjGZ.mjs.map → SortInput-D0Vb864D.mjs.map} +1 -1
- package/dist/client/{_auth-DXJkv9QO.mjs → _auth-DnImOqR-.mjs} +2 -2
- package/dist/client/_auth-DnImOqR-.mjs.map +1 -0
- package/dist/client/{_flavorId-Dy7EYQum.mjs → _flavorId-C9SZd1jL.mjs} +8 -8
- package/dist/client/{_flavorId-Dy7EYQum.mjs.map → _flavorId-C9SZd1jL.mjs.map} +1 -1
- package/dist/client/{_flavorId-DsD2VTKA.mjs → _flavorId-DINgWoeV.mjs} +38 -38
- package/dist/client/{_flavorId-DsD2VTKA.mjs.map → _flavorId-DINgWoeV.mjs.map} +1 -1
- package/dist/client/{_floatingIpId-j17rCQqG2.mjs → _floatingIpId-BACLbMzi2.mjs} +32 -32
- package/dist/client/{_floatingIpId-j17rCQqG2.mjs.map → _floatingIpId-BACLbMzi2.mjs.map} +1 -1
- package/dist/client/{_floatingIpId-BjVbeNw_.mjs → _floatingIpId-BzVMOv97.mjs} +2 -2
- package/dist/client/{_floatingIpId-BjVbeNw_.mjs.map → _floatingIpId-BzVMOv97.mjs.map} +1 -1
- package/dist/client/_imageId-DCvaU7-S.mjs +534 -0
- package/dist/client/_imageId-DCvaU7-S.mjs.map +1 -0
- package/dist/client/{_pcaId-Bo7yHkNW.mjs → _pcaId-B3PqECyO.mjs} +115 -115
- package/dist/client/{_pcaId-Bo7yHkNW.mjs.map → _pcaId-B3PqECyO.mjs.map} +1 -1
- package/dist/client/{_pcaId-CKkCVC7b.mjs → _pcaId-DAJEt3ZI.mjs} +2 -2
- package/dist/client/{_pcaId-CKkCVC7b.mjs.map → _pcaId-DAJEt3ZI.mjs.map} +1 -1
- package/dist/client/{_projectId-CARHuZTU.mjs → _projectId-B2hG5peP.mjs} +3 -3
- package/dist/client/_projectId-B2hG5peP.mjs.map +1 -0
- package/dist/client/{_projectId-CY8W0IF6.mjs → _projectId-BnWXWTBR.mjs} +3 -3
- package/dist/client/{_projectId-CY8W0IF6.mjs.map → _projectId-BnWXWTBR.mjs.map} +1 -1
- package/dist/client/{_projectId-Dbck_MFa.mjs → _projectId-DRr9rLST.mjs} +66 -66
- package/dist/client/{_projectId-Dbck_MFa.mjs.map → _projectId-DRr9rLST.mjs.map} +1 -1
- package/dist/client/{_projectId-B_2sZKk-.mjs → _projectId-DU8qRiZk.mjs} +2 -2
- package/dist/client/_projectId-DU8qRiZk.mjs.map +1 -0
- package/dist/client/{_securityGroupId-gSEZbBII.mjs → _securityGroupId-Cj9IotMJ.mjs} +2 -2
- package/dist/client/{_securityGroupId-gSEZbBII.mjs.map → _securityGroupId-Cj9IotMJ.mjs.map} +1 -1
- package/dist/client/{_securityGroupId-CkN0CGVg.mjs → _securityGroupId-ClJiFh4R.mjs} +267 -267
- package/dist/client/{_securityGroupId-CkN0CGVg.mjs.map → _securityGroupId-ClJiFh4R.mjs.map} +1 -1
- package/dist/client/_storageType-BrHDa2bD.mjs +3005 -0
- package/dist/client/_storageType-BrHDa2bD.mjs.map +1 -0
- package/dist/client/{_storageType-6k8lUnQo.mjs → _storageType-CSLH93js.mjs} +2 -2
- package/dist/client/{_storageType-6k8lUnQo.mjs.map → _storageType-CSLH93js.mjs.map} +1 -1
- package/dist/client/_storageType-zeSZe--V.mjs.map +1 -1
- package/dist/client/{about-Nsxkyh9U.mjs → about-BnU297yB.mjs} +2 -2
- package/dist/client/about-BnU297yB.mjs.map +1 -0
- package/dist/client/{aurora-DDzsst74.mjs → aurora-6RsAZtnz.mjs} +2 -2
- package/dist/client/aurora-6RsAZtnz.mjs.map +1 -0
- package/dist/client/{build-BdRRmNf5.mjs → build-DF7MTyXG.mjs} +3582 -3114
- package/dist/client/{build-BdRRmNf5.mjs.map → build-DF7MTyXG.mjs.map} +1 -1
- package/dist/client/{constants-PMXUGI4Q.mjs → constants-BskfpGYY.mjs} +16 -16
- package/dist/client/{constants-PMXUGI4Q.mjs.map → constants-BskfpGYY.mjs.map} +1 -1
- package/dist/client/{flavors-p2TKcqP-.mjs → flavors-DAbtRoep.mjs} +151 -151
- package/dist/client/{flavors-p2TKcqP-.mjs.map → flavors-DAbtRoep.mjs.map} +1 -1
- package/dist/client/{flavors-BclEwobO.mjs → flavors-DODudzrA.mjs} +2 -2
- package/dist/client/{flavors-BclEwobO.mjs.map → flavors-DODudzrA.mjs.map} +1 -1
- package/dist/client/flavors-DWMZ6TuJ.mjs.map +1 -1
- package/dist/client/{floatingips-ph0ZxJw8.mjs → floatingips-DJW9ftN_.mjs} +83 -83
- package/dist/client/floatingips-DJW9ftN_.mjs.map +1 -0
- package/dist/client/{hooks-dSArr2Ca.mjs → hooks-CMgoYcDG.mjs} +1 -1
- package/dist/client/{images-CXdghaMW.mjs → images-BbLnuYrL.mjs} +2 -2
- package/dist/client/{images-CXdghaMW.mjs.map → images-BbLnuYrL.mjs.map} +1 -1
- package/dist/client/{images-Dbjo4yKn.mjs → images-C3JyPwer.mjs} +2 -2
- package/dist/client/images-C3JyPwer.mjs.map +1 -0
- package/dist/client/{images-BblnyWJq.mjs → images-Cp6V1nF5.mjs} +455 -455
- package/dist/client/{images-BblnyWJq.mjs.map → images-Cp6V1nF5.mjs.map} +1 -1
- package/dist/client/images-NBf2bV43.mjs.map +1 -1
- package/dist/client/index.js +257 -257
- package/dist/client/index.js.map +1 -1
- package/dist/client/network-DuZm76BZ.mjs.map +1 -1
- package/dist/client/{objects-B9Jh3SMG.mjs → objects-Bw96WXOs.mjs} +2 -2
- package/dist/client/{objects-B9Jh3SMG.mjs.map → objects-Bw96WXOs.mjs.map} +1 -1
- package/dist/client/{objects-Bw25cE1m.mjs → objects-DUmK3WgA.mjs} +1458 -1430
- package/dist/client/objects-DUmK3WgA.mjs.map +1 -0
- package/dist/client/objects-o2Cj_ndZ.mjs.map +1 -1
- package/dist/client/{pca-DUrQ_tIg.mjs → pca-DKeGzbww.mjs} +2 -2
- package/dist/client/{pca-DUrQ_tIg.mjs.map → pca-DKeGzbww.mjs.map} +1 -1
- package/dist/client/{pca-CiLPHmK7.mjs → pca-Dc_tdh4-.mjs} +47 -47
- package/dist/client/{pca-CiLPHmK7.mjs.map → pca-Dc_tdh4-.mjs.map} +1 -1
- package/dist/client/{projects-DNd3UTas.mjs → projects-CRL37ftA.mjs} +16 -16
- package/dist/client/{projects-DNd3UTas.mjs.map → projects-CRL37ftA.mjs.map} +1 -1
- package/dist/client/{projects-B5topuei.mjs → projects-DUWOgB3m.mjs} +2 -2
- package/dist/client/{projects-B5topuei.mjs.map → projects-DUWOgB3m.mjs.map} +1 -1
- package/dist/client/{projects-CHYn7L5e.mjs → projects-DpXQYfKc.mjs} +2 -2
- package/dist/client/projects-DpXQYfKc.mjs.map +1 -0
- package/dist/client/{securitygroups-CcA2TpAt.mjs → securitygroups-CWWFSjjj.mjs} +94 -94
- package/dist/client/securitygroups-CWWFSjjj.mjs.map +1 -0
- package/dist/client/{useListWithFiltering-CVzhMyEA.mjs → useListWithFiltering-C9k7xWqz.mjs} +7 -7
- package/dist/client/{useListWithFiltering-CVzhMyEA.mjs.map → useListWithFiltering-C9k7xWqz.mjs.map} +1 -1
- package/dist/server/index.js +697 -406
- package/package.json +3 -3
- package/dist/client/AuthProvider-Co4d0WzB.mjs +0 -100
- package/dist/client/AuthProvider-Co4d0WzB.mjs.map +0 -1
- package/dist/client/ContentHeader-D4jlOG-9.mjs +0 -96
- package/dist/client/ContentHeader-D4jlOG-9.mjs.map +0 -1
- package/dist/client/_auth-DXJkv9QO.mjs.map +0 -1
- package/dist/client/_imageId-BjfhqAje.mjs +0 -534
- package/dist/client/_imageId-BjfhqAje.mjs.map +0 -1
- package/dist/client/_projectId-B_2sZKk-.mjs.map +0 -1
- package/dist/client/_projectId-CARHuZTU.mjs.map +0 -1
- package/dist/client/_storageType-CLTxXjQZ.mjs +0 -3048
- package/dist/client/_storageType-CLTxXjQZ.mjs.map +0 -1
- package/dist/client/about-Nsxkyh9U.mjs.map +0 -1
- package/dist/client/aurora-DDzsst74.mjs.map +0 -1
- package/dist/client/floatingips-ph0ZxJw8.mjs.map +0 -1
- package/dist/client/images-Dbjo4yKn.mjs.map +0 -1
- package/dist/client/objects-Bw25cE1m.mjs.map +0 -1
- package/dist/client/projects-CHYn7L5e.mjs.map +0 -1
- package/dist/client/securitygroups-CcA2TpAt.mjs.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cobaltcore-dev/aurora",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Aurora OpenStack dashboard — server and client library",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -108,9 +108,9 @@
|
|
|
108
108
|
"vite-plugin-svgr": "^5.0.0",
|
|
109
109
|
"vite-tsconfig-paths": "^6.1.1",
|
|
110
110
|
"vitest": "^4.1.2",
|
|
111
|
-
"@cobaltcore-dev/
|
|
111
|
+
"@cobaltcore-dev/aurora-config": "0.0.1",
|
|
112
112
|
"@cobaltcore-dev/signal-openstack": "1.0.0",
|
|
113
|
-
"@cobaltcore-dev/
|
|
113
|
+
"@cobaltcore-dev/policy-engine": "2.0.0"
|
|
114
114
|
},
|
|
115
115
|
"scripts": {
|
|
116
116
|
"build": "pnpm build:server && pnpm build:client",
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import { jsx as e } from "react/jsx-runtime";
|
|
2
|
-
import t, { useCallback as n, useEffect as r, useRef as i, useState as a } from "react";
|
|
3
|
-
import { useRouter as o } from "@tanstack/react-router";
|
|
4
|
-
//#region src/client/store/AuthProvider.tsx
|
|
5
|
-
var s = /*#__PURE__*/ t.createContext(null), c = 3600 * 1e3;
|
|
6
|
-
function l({ children: l }) {
|
|
7
|
-
let u = o(), [d, f] = t.useState(null), [p, m] = t.useState(void 0), [h, g] = t.useState(void 0), [_, v] = a(!1), [y, b] = a(void 0), x = i(null), S = i(null), C = !!d, w = n(() => {
|
|
8
|
-
x.current &&= (clearTimeout(x.current), null);
|
|
9
|
-
}, []), T = n(() => {
|
|
10
|
-
S.current &&= (clearTimeout(S.current), null);
|
|
11
|
-
}, []), E = n(() => {
|
|
12
|
-
v(!1), u.navigate({
|
|
13
|
-
to: "/",
|
|
14
|
-
search: y ? { redirect: y } : void 0
|
|
15
|
-
});
|
|
16
|
-
}, [y]), D = n(async (e = "manual") => {
|
|
17
|
-
if (w(), T(), f(null), m(void 0), g(e), e === "inactive" || e === "expired") {
|
|
18
|
-
let e = window.location.pathname + window.location.search;
|
|
19
|
-
e && e.startsWith("/") && b(e), v(!0);
|
|
20
|
-
} else u.invalidate();
|
|
21
|
-
}, [w, T]), O = n(() => {
|
|
22
|
-
C && (T(), S.current = setTimeout(() => {
|
|
23
|
-
D("inactive");
|
|
24
|
-
}, c));
|
|
25
|
-
}, [
|
|
26
|
-
C,
|
|
27
|
-
T,
|
|
28
|
-
D
|
|
29
|
-
]), k = n(async (e, t) => {
|
|
30
|
-
f(e), g(void 0), v(!1), b(void 0), m(t ? new Date(t) : void 0), O();
|
|
31
|
-
}, [O]);
|
|
32
|
-
return r(() => {
|
|
33
|
-
if (w(), d && p) {
|
|
34
|
-
let e = p.getTime() - Date.now();
|
|
35
|
-
if (e <= 0) {
|
|
36
|
-
D("expired");
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
x.current = setTimeout(() => {
|
|
40
|
-
D("expired");
|
|
41
|
-
}, e);
|
|
42
|
-
}
|
|
43
|
-
return () => {
|
|
44
|
-
w();
|
|
45
|
-
};
|
|
46
|
-
}, [
|
|
47
|
-
d,
|
|
48
|
-
p,
|
|
49
|
-
D,
|
|
50
|
-
w
|
|
51
|
-
]), r(() => {
|
|
52
|
-
if (!C) {
|
|
53
|
-
T();
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
let e = [
|
|
57
|
-
"mousedown",
|
|
58
|
-
"mousemove",
|
|
59
|
-
"keypress",
|
|
60
|
-
"scroll",
|
|
61
|
-
"touchstart",
|
|
62
|
-
"click"
|
|
63
|
-
], t = () => {
|
|
64
|
-
O();
|
|
65
|
-
};
|
|
66
|
-
return O(), e.forEach((e) => {
|
|
67
|
-
document.addEventListener(e, t, !0);
|
|
68
|
-
}), () => {
|
|
69
|
-
T(), e.forEach((e) => {
|
|
70
|
-
document.removeEventListener(e, t, !0);
|
|
71
|
-
});
|
|
72
|
-
};
|
|
73
|
-
}, [
|
|
74
|
-
C,
|
|
75
|
-
O,
|
|
76
|
-
T
|
|
77
|
-
]), /*#__PURE__*/ e(s.Provider, {
|
|
78
|
-
value: {
|
|
79
|
-
isAuthenticated: C,
|
|
80
|
-
user: d,
|
|
81
|
-
login: k,
|
|
82
|
-
logout: D,
|
|
83
|
-
expiresAt: p,
|
|
84
|
-
logoutReason: h,
|
|
85
|
-
showInactivityModal: _,
|
|
86
|
-
closeInactivityModal: E,
|
|
87
|
-
redirectAfterModal: y
|
|
88
|
-
},
|
|
89
|
-
children: l
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
function u() {
|
|
93
|
-
let e = t.useContext(s);
|
|
94
|
-
if (!e) throw Error("useAuth must be used within an AuthProvider");
|
|
95
|
-
return e;
|
|
96
|
-
}
|
|
97
|
-
//#endregion
|
|
98
|
-
export { u as n, l as t };
|
|
99
|
-
|
|
100
|
-
//# sourceMappingURL=AuthProvider-Co4d0WzB.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AuthProvider-Co4d0WzB.mjs","names":["React","useEffect","useRef","useCallback","useState","useRouter","AuthContext","createContext","INACTIVITY_TIMEOUT","AuthProvider","children","router","user","setUser","expiresAt","setExpiresAt","undefined","logoutReason","setLogoutReason","showInactivityModal","setShowInactivityModal","redirectAfterModal","setRedirectAfterModal","logoutTimerRef","inactivityTimerRef","isAuthenticated","clearLogoutTimer","current","clearTimeout","clearInactivityTimer","closeInactivityModal","navigate","to","search","redirect","logout","reason","currentPath","window","location","pathname","startsWith","invalidate","resetInactivityTimer","setTimeout","login","expires_at","expiration","Date","timeUntilExpiry","getTime","now","events","handleActivity","forEach","event","document","addEventListener","removeEventListener","Provider","value","useAuth","context","useContext","Error"],"sources":["../../src/client/store/AuthProvider.tsx"],"sourcesContent":["import React, { useEffect, useRef, useCallback, useState } from \"react\"\nimport { TokenData } from \"../../server/Authentication/types/models\"\nimport { useRouter } from \"@tanstack/react-router\"\n\nexport type User = TokenData[\"user\"] | null\n\nexport interface AuthContext {\n isAuthenticated: boolean\n login: (user: User, expires_at?: string) => Promise<void>\n logout: (reason?: \"inactive\" | \"expired\" | \"manual\") => Promise<void>\n user?: User\n expiresAt?: Date\n logoutReason?: \"inactive\" | \"expired\" | \"manual\"\n showInactivityModal: boolean\n closeInactivityModal: () => void\n redirectAfterModal?: string\n}\n\nconst AuthContext = React.createContext<AuthContext | null>(null)\n\nconst INACTIVITY_TIMEOUT = 60 * 60 * 1000 // 60 minutes\n\nexport function AuthProvider({ children }: { children: React.ReactNode }) {\n const router = useRouter()\n const [user, setUser] = React.useState<User | null>(null)\n const [expiresAt, setExpiresAt] = React.useState<Date | undefined>(undefined)\n const [logoutReason, setLogoutReason] = React.useState<\"inactive\" | \"expired\" | \"manual\" | undefined>(undefined)\n const [showInactivityModal, setShowInactivityModal] = useState(false)\n const [redirectAfterModal, setRedirectAfterModal] = useState<string | undefined>(undefined)\n\n const logoutTimerRef = useRef<NodeJS.Timeout | null>(null)\n const inactivityTimerRef = useRef<NodeJS.Timeout | null>(null)\n\n const isAuthenticated = !!user\n\n const clearLogoutTimer = useCallback(() => {\n if (logoutTimerRef.current) {\n clearTimeout(logoutTimerRef.current)\n logoutTimerRef.current = null\n }\n }, [])\n\n const clearInactivityTimer = useCallback(() => {\n if (inactivityTimerRef.current) {\n clearTimeout(inactivityTimerRef.current)\n inactivityTimerRef.current = null\n }\n }, [])\n\n const closeInactivityModal = useCallback(() => {\n setShowInactivityModal(false)\n\n router.navigate({\n to: \"/\",\n search: redirectAfterModal ? { redirect: redirectAfterModal } : undefined,\n })\n }, [redirectAfterModal])\n\n const logout = useCallback(\n async (reason: \"inactive\" | \"expired\" | \"manual\" = \"manual\") => {\n clearLogoutTimer()\n clearInactivityTimer()\n\n setUser(null)\n setExpiresAt(undefined)\n setLogoutReason(reason)\n\n // For inactive/expired: Show modal instead of direct navigation\n if (reason === \"inactive\" || reason === \"expired\") {\n const currentPath = window.location.pathname + window.location.search\n if (currentPath && currentPath.startsWith(\"/\")) {\n setRedirectAfterModal(currentPath)\n }\n\n setShowInactivityModal(true)\n } else {\n // Manual logout: direct navigation\n router.invalidate()\n }\n },\n [clearLogoutTimer, clearInactivityTimer]\n )\n\n const resetInactivityTimer = useCallback(() => {\n if (!isAuthenticated) return\n\n clearInactivityTimer()\n\n inactivityTimerRef.current = setTimeout(() => {\n logout(\"inactive\")\n }, INACTIVITY_TIMEOUT)\n }, [isAuthenticated, clearInactivityTimer, logout])\n\n const login = useCallback(\n async (user: User, expires_at?: string) => {\n setUser(user)\n setLogoutReason(undefined)\n setShowInactivityModal(false)\n setRedirectAfterModal(undefined)\n\n if (expires_at) {\n const expiration = new Date(expires_at)\n setExpiresAt(expiration)\n } else {\n setExpiresAt(undefined)\n }\n\n resetInactivityTimer()\n },\n [resetInactivityTimer]\n )\n\n useEffect(() => {\n clearLogoutTimer()\n\n if (user && expiresAt) {\n const timeUntilExpiry = expiresAt.getTime() - Date.now()\n\n if (timeUntilExpiry <= 0) {\n logout(\"expired\")\n return\n }\n\n logoutTimerRef.current = setTimeout(() => {\n logout(\"expired\")\n }, timeUntilExpiry)\n }\n\n return () => {\n clearLogoutTimer()\n }\n }, [user, expiresAt, logout, clearLogoutTimer])\n\n useEffect(() => {\n if (!isAuthenticated) {\n clearInactivityTimer()\n return\n }\n\n const events = [\"mousedown\", \"mousemove\", \"keypress\", \"scroll\", \"touchstart\", \"click\"]\n\n const handleActivity = () => {\n resetInactivityTimer()\n }\n\n resetInactivityTimer()\n\n events.forEach((event) => {\n document.addEventListener(event, handleActivity, true)\n })\n\n return () => {\n clearInactivityTimer()\n events.forEach((event) => {\n document.removeEventListener(event, handleActivity, true)\n })\n }\n }, [isAuthenticated, resetInactivityTimer, clearInactivityTimer])\n\n return (\n <AuthContext.Provider\n value={{\n isAuthenticated,\n user,\n login,\n logout,\n expiresAt,\n logoutReason,\n showInactivityModal,\n closeInactivityModal,\n redirectAfterModal,\n }}\n >\n {children}\n </AuthContext.Provider>\n )\n}\n\nexport function useAuth() {\n const context = React.useContext(AuthContext)\n if (!context) {\n throw new Error(\"useAuth must be used within an AuthProvider\")\n }\n return context\n}\n"],"mappings":"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"}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { A as e, C as t, Q as n, Y as r, c as i, o as a, st as o } from "./build-BdRRmNf5.mjs";
|
|
2
|
-
import { t as s } from "./Slot-CWb612-_.mjs";
|
|
3
|
-
import { t as c } from "./routeInfo-Dy9l-wFB.mjs";
|
|
4
|
-
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
5
|
-
import { useState as d } from "react";
|
|
6
|
-
import { useMatches as f, useParams as p, useRouteContext as m } from "@tanstack/react-router";
|
|
7
|
-
import { Trans as h, useLingui as g } from "@lingui/react";
|
|
8
|
-
//#region src/client/components/ClipboardText.tsx
|
|
9
|
-
var _ = ({ text: n, tooltipContent: o, className: s, truncateAt: c, showTooltip: f = !0, ...p }) => {
|
|
10
|
-
let { i18n: m, _: h } = g(), [_, v] = d(!1), [y, b] = d(!1), x = `copyableTooltip inline-flex items-center ${s || ""}`, S = async (e) => {
|
|
11
|
-
e.preventDefault(), e.stopPropagation();
|
|
12
|
-
try {
|
|
13
|
-
await navigator.clipboard.writeText(n), v(!0), b(!1), setTimeout(() => v(!1), 2e3);
|
|
14
|
-
} catch (e) {
|
|
15
|
-
console.error("Failed to copy text:", e);
|
|
16
|
-
}
|
|
17
|
-
}, C = c && n.length > c ? `${n.slice(0, c)}...` : n, w = () => _ ? o || m._({ id: "u+VWhB" }) : m._({ id: "he3ygx" }), T = _ && f || y && f;
|
|
18
|
-
return /*#__PURE__*/ l("div", {
|
|
19
|
-
...p,
|
|
20
|
-
className: x,
|
|
21
|
-
children: /*#__PURE__*/ u(e, {
|
|
22
|
-
open: T,
|
|
23
|
-
children: [/*#__PURE__*/ l(a, {
|
|
24
|
-
onClick: S,
|
|
25
|
-
onMouseEnter: () => !_ && b(!0),
|
|
26
|
-
onMouseLeave: () => b(!1),
|
|
27
|
-
"aria-label": m._({
|
|
28
|
-
id: "Wbg1jv",
|
|
29
|
-
values: { text: n }
|
|
30
|
-
}),
|
|
31
|
-
className: "cursor-pointer",
|
|
32
|
-
asChild: !0,
|
|
33
|
-
"data-testid": "clipboard-copy-trigger",
|
|
34
|
-
children: /*#__PURE__*/ l("div", {
|
|
35
|
-
className: "group",
|
|
36
|
-
children: /*#__PURE__*/ u(r, {
|
|
37
|
-
direction: "horizontal",
|
|
38
|
-
gap: "1",
|
|
39
|
-
className: "items-center hover:underline",
|
|
40
|
-
children: [/*#__PURE__*/ l("span", {
|
|
41
|
-
className: "select-none",
|
|
42
|
-
children: C
|
|
43
|
-
}), /*#__PURE__*/ l(i, {
|
|
44
|
-
icon: _ ? "check" : "contentCopy",
|
|
45
|
-
size: "18"
|
|
46
|
-
})]
|
|
47
|
-
})
|
|
48
|
-
})
|
|
49
|
-
}), /*#__PURE__*/ l(t, { children: w() })]
|
|
50
|
-
})
|
|
51
|
-
});
|
|
52
|
-
};
|
|
53
|
-
//#endregion
|
|
54
|
-
//#region src/client/components/ContentHeader/ContentHeader.tsx
|
|
55
|
-
function v({ title: e, projectId: t, description: r, actions: i }) {
|
|
56
|
-
let { slots: a } = m({ strict: !1 }), d = f(), { provider: g } = p({ strict: !1 }), v = [...d].reverse().find((e) => c(e.staticData)), y = v && c(v.staticData) ? v.staticData.service : void 0, b = y === "containers" && g === "ceph" ? "ceph-containers" : y, x = a?.servicePageActions ? /*#__PURE__*/ l(s, {
|
|
57
|
-
component: a.servicePageActions,
|
|
58
|
-
useShadowDOM: !1,
|
|
59
|
-
currentService: b
|
|
60
|
-
}) : null;
|
|
61
|
-
return /*#__PURE__*/ u("header", { children: [
|
|
62
|
-
/*#__PURE__*/ u("div", {
|
|
63
|
-
className: "flex flex-col sm:flex-row sm:items-center sm:justify-between",
|
|
64
|
-
children: [/*#__PURE__*/ u("div", {
|
|
65
|
-
className: "flex items-center gap-3",
|
|
66
|
-
children: [/*#__PURE__*/ l(n, { children: e }), x]
|
|
67
|
-
}), /*#__PURE__*/ u("div", {
|
|
68
|
-
className: "text-theme-light flex shrink-0 items-center gap-1 text-sm",
|
|
69
|
-
children: [/*#__PURE__*/ u("span", {
|
|
70
|
-
className: "font-semibold",
|
|
71
|
-
children: [
|
|
72
|
-
/*#__PURE__*/ l(h, { id: "mSfwLL" }),
|
|
73
|
-
":",
|
|
74
|
-
" "
|
|
75
|
-
]
|
|
76
|
-
}), /*#__PURE__*/ l(_, {
|
|
77
|
-
text: t,
|
|
78
|
-
truncateAt: 15
|
|
79
|
-
})]
|
|
80
|
-
})]
|
|
81
|
-
}),
|
|
82
|
-
r && /*#__PURE__*/ l("p", {
|
|
83
|
-
className: "text-sm font-normal",
|
|
84
|
-
children: r
|
|
85
|
-
}),
|
|
86
|
-
/*#__PURE__*/ l(o, { className: "mt-4" }),
|
|
87
|
-
i && /*#__PURE__*/ l("div", {
|
|
88
|
-
className: "mt-3 flex justify-end",
|
|
89
|
-
children: i
|
|
90
|
-
})
|
|
91
|
-
] });
|
|
92
|
-
}
|
|
93
|
-
//#endregion
|
|
94
|
-
export { _ as n, v as t };
|
|
95
|
-
|
|
96
|
-
//# sourceMappingURL=ContentHeader-D4jlOG-9.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ContentHeader-D4jlOG-9.mjs","names":["React","useState","Tooltip","TooltipTrigger","TooltipContent","Icon","Stack","ClipboardText","text","tooltipContent","className","truncateAt","showTooltip","props","useLingui","copied","setCopied","isHovering","setIsHovering","combinedClassName","handleCopy","e","preventDefault","stopPropagation","navigator","clipboard","writeText","setTimeout","err","console","error","displayText","length","slice","getTooltipContent","t","tooltipIsOpen","div","open","onClick","onMouseEnter","onMouseLeave","aria-label","asChild","data-testid","direction","gap","span","icon","size","Divider","ContentHeading","useRouteContext","useMatches","useParams","ClipboardText","Slot","isRouteInfo","ContentHeader","title","projectId","description","actions","slots","strict","matches","provider","activeMatch","reverse","find","m","staticData","routeService","service","undefined","currentService","slotActions","servicePageActions","component","useShadowDOM","header","div","className","span","text","truncateAt","p"],"sources":["../../src/client/components/ClipboardText.tsx","../../src/client/components/ContentHeader/ContentHeader.tsx"],"sourcesContent":["import React, { useState } from \"react\"\nimport { Tooltip, TooltipTrigger, TooltipContent, Icon, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { useLingui } from \"@lingui/react/macro\"\n\nexport interface ClipboardTextProps extends React.HTMLAttributes<HTMLDivElement> {\n tooltipContent?: string\n text: string\n className?: string\n truncateAt?: number\n showTooltip?: boolean\n}\n\nconst ClipboardText: React.FC<ClipboardTextProps> = ({\n text,\n tooltipContent,\n className,\n truncateAt,\n showTooltip = true,\n ...props\n}) => {\n const { t } = useLingui()\n const [copied, setCopied] = useState(false)\n const [isHovering, setIsHovering] = useState(false)\n\n const combinedClassName = `copyableTooltip inline-flex items-center ${className || \"\"}`\n\n const handleCopy = async (e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n\n try {\n await navigator.clipboard.writeText(text)\n setCopied(true)\n setIsHovering(false)\n setTimeout(() => setCopied(false), 2000)\n } catch (err) {\n console.error(\"Failed to copy text:\", err)\n }\n }\n\n const displayText = truncateAt && text.length > truncateAt ? `${text.slice(0, truncateAt)}...` : text\n\n // Determine tooltip content based on state\n const getTooltipContent = () => {\n if (copied) {\n return tooltipContent || t`Copied to clipboard!`\n }\n return t`Copy`\n }\n\n const tooltipIsOpen = (copied && showTooltip) || (isHovering && showTooltip)\n\n return (\n <div {...props} className={combinedClassName}>\n <Tooltip open={tooltipIsOpen}>\n <TooltipTrigger\n onClick={handleCopy}\n onMouseEnter={() => !copied && setIsHovering(true)}\n onMouseLeave={() => setIsHovering(false)}\n aria-label={t`Copy ${text} to clipboard`}\n className=\"cursor-pointer\"\n asChild\n data-testid=\"clipboard-copy-trigger\"\n >\n <div className=\"group\">\n <Stack direction=\"horizontal\" gap=\"1\" className=\"items-center hover:underline\">\n <span className=\"select-none\">{displayText}</span>\n <Icon icon={copied ? \"check\" : \"contentCopy\"} size=\"18\" />\n </Stack>\n </div>\n </TooltipTrigger>\n <TooltipContent>{getTooltipContent()}</TooltipContent>\n </Tooltip>\n </div>\n )\n}\n\nexport default ClipboardText\n","import type { ReactNode } from \"react\"\nimport { Divider, ContentHeading } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { useRouteContext, useMatches, useParams } from \"@tanstack/react-router\"\nimport ClipboardText from \"../ClipboardText\"\nimport { Slot } from \"../Slot\"\nimport { isRouteInfo } from \"@/client/routes/routeInfo\"\n\ninterface ContentHeaderProps {\n title: string\n projectId: string\n description?: string | null\n actions?: ReactNode\n}\n\nexport function ContentHeader({ title, projectId, description, actions }: ContentHeaderProps) {\n const { slots } = useRouteContext({ strict: false })\n const matches = useMatches()\n const { provider } = useParams({ strict: false }) as { provider?: string }\n\n const activeMatch = [...matches].reverse().find((m) => isRouteInfo(m.staticData))\n const routeService = activeMatch && isRouteInfo(activeMatch.staticData) ? activeMatch.staticData.service : undefined\n\n // Storage routes share service: \"containers\" for both Swift and Ceph.\n // Distinguish them by the $provider param.\n const currentService = routeService === \"containers\" && provider === \"ceph\" ? \"ceph-containers\" : routeService\n\n const slotActions = slots?.servicePageActions ? (\n <Slot component={slots.servicePageActions} useShadowDOM={false} currentService={currentService} />\n ) : null\n\n return (\n <header>\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"flex items-center gap-3\">\n <ContentHeading>{title}</ContentHeading>\n {slotActions}\n </div>\n <div className=\"text-theme-light flex shrink-0 items-center gap-1 text-sm\">\n <span className=\"font-semibold\">\n <Trans>Project ID</Trans>:{\" \"}\n </span>\n <ClipboardText text={projectId} truncateAt={15} />\n </div>\n </div>\n {description && <p className=\"text-sm font-normal\">{description}</p>}\n <Divider className=\"mt-4\" />\n {actions && <div className=\"mt-3 flex justify-end\">{actions}</div>}\n </header>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_auth-DXJkv9QO.mjs","names":["Outlet","useAuth","RouteComponent","component"],"sources":["../../src/client/routes/_auth.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute, Outlet, redirect } from \"@tanstack/react-router\"\nimport { useAuth } from \"../store/AuthProvider\"\n\nexport const Route = createFileRoute(\"/_auth\")({\n component: RouteComponent,\n beforeLoad: async ({ context, location }) => {\n if (!context.auth?.isAuthenticated) {\n const token = await context.trpcClient?.auth.getCurrentUserSession.query()\n if (!token) {\n const redirectPath = location.pathname ? location.pathname : \"\"\n\n throw redirect({\n to: \"/\",\n search: { redirect: redirectPath },\n })\n }\n context.auth?.login(token.user, token.expires_at)\n }\n },\n})\n\nfunction RouteComponent() {\n useAuth()\n\n return <Outlet />\n}\n"],"mappings":";;;;AAqBA,SAASE,IAAAA;CAGP,OAFAD,EAAAA,GAEO,gBAAC,GAAA,CAAA,CAAA;AACV"}
|