@cobaltcore-dev/aurora 0.11.0 → 0.12.1

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.
Files changed (92) hide show
  1. package/dist/client/{ContentHeader-DsuZD8fa.mjs → ContentHeader-D2nIdJKJ.mjs} +22 -22
  2. package/dist/client/{ContentHeader-DsuZD8fa.mjs.map → ContentHeader-D2nIdJKJ.mjs.map} +1 -1
  3. package/dist/client/{DeleteFlavorModal-RnbspW_2.mjs → DeleteFlavorModal-Dwm0Hh84.mjs} +174 -174
  4. package/dist/client/{DeleteFlavorModal-RnbspW_2.mjs.map → DeleteFlavorModal-Dwm0Hh84.mjs.map} +1 -1
  5. package/dist/client/{DeleteVersionsModal-CsBJzXoW.mjs → DeleteVersionsModal-DQO8lGmS.mjs} +69 -69
  6. package/dist/client/{DeleteVersionsModal-CsBJzXoW.mjs.map → DeleteVersionsModal-DQO8lGmS.mjs.map} +1 -1
  7. package/dist/client/{EditSecurityGroupModal-BPv3d7am.mjs → EditSecurityGroupModal-BGPXglju.mjs} +17 -17
  8. package/dist/client/{EditSecurityGroupModal-BPv3d7am.mjs.map → EditSecurityGroupModal-BGPXglju.mjs.map} +1 -1
  9. package/dist/client/{FiltersInput-CViamP59.mjs → FiltersInput-cOaaRpcQ.mjs} +20 -20
  10. package/dist/client/{FiltersInput-CViamP59.mjs.map → FiltersInput-cOaaRpcQ.mjs.map} +1 -1
  11. package/dist/client/{FloatingIpActionModals-DTn3HFei.mjs → FloatingIpActionModals-RCvaamOg.mjs} +55 -55
  12. package/dist/client/{FloatingIpActionModals-DTn3HFei.mjs.map → FloatingIpActionModals-RCvaamOg.mjs.map} +1 -1
  13. package/dist/client/{ImageToastNotifications-CFKQZTgf.mjs → ImageToastNotifications-ClO-1yOH.mjs} +310 -310
  14. package/dist/client/{ImageToastNotifications-CFKQZTgf.mjs.map → ImageToastNotifications-ClO-1yOH.mjs.map} +1 -1
  15. package/dist/client/{RouteError-BebIhFpQ.mjs → RouteError-BmZRk_ss.mjs} +2 -2
  16. package/dist/client/{RouteError-BebIhFpQ.mjs.map → RouteError-BmZRk_ss.mjs.map} +1 -1
  17. package/dist/client/{SortInput-D0Vb864D.mjs → SortInput-DjaEHvcO.mjs} +6 -6
  18. package/dist/client/{SortInput-D0Vb864D.mjs.map → SortInput-DjaEHvcO.mjs.map} +1 -1
  19. package/dist/client/{_flavorId-C9SZd1jL.mjs → _flavorId-CtQEd28h.mjs} +8 -8
  20. package/dist/client/{_flavorId-C9SZd1jL.mjs.map → _flavorId-CtQEd28h.mjs.map} +1 -1
  21. package/dist/client/{_flavorId-DINgWoeV.mjs → _flavorId-DVsGdXUf.mjs} +46 -46
  22. package/dist/client/{_flavorId-DINgWoeV.mjs.map → _flavorId-DVsGdXUf.mjs.map} +1 -1
  23. package/dist/client/{_floatingIpId-BACLbMzi2.mjs → _floatingIpId-CKMq7-4p2.mjs} +36 -36
  24. package/dist/client/{_floatingIpId-BACLbMzi2.mjs.map → _floatingIpId-CKMq7-4p2.mjs.map} +1 -1
  25. package/dist/client/{_floatingIpId-BzVMOv97.mjs → _floatingIpId-DvTh6vdB.mjs} +2 -2
  26. package/dist/client/{_floatingIpId-BzVMOv97.mjs.map → _floatingIpId-DvTh6vdB.mjs.map} +1 -1
  27. package/dist/client/_imageId-xG8hC49j.mjs +534 -0
  28. package/dist/client/{_imageId-DCvaU7-S.mjs.map → _imageId-xG8hC49j.mjs.map} +1 -1
  29. package/dist/client/{_pcaId-B3PqECyO.mjs → _pcaId-Db_t0x6O.mjs} +147 -147
  30. package/dist/client/{_pcaId-B3PqECyO.mjs.map → _pcaId-Db_t0x6O.mjs.map} +1 -1
  31. package/dist/client/{_pcaId-DAJEt3ZI.mjs → _pcaId-WCJoukIk.mjs} +2 -2
  32. package/dist/client/{_pcaId-DAJEt3ZI.mjs.map → _pcaId-WCJoukIk.mjs.map} +1 -1
  33. package/dist/client/{_projectId-DU8qRiZk.mjs → _projectId-B2cvskLV.mjs} +2 -2
  34. package/dist/client/{_projectId-DU8qRiZk.mjs.map → _projectId-B2cvskLV.mjs.map} +1 -1
  35. package/dist/client/{_projectId-DRr9rLST.mjs → _projectId-BCMkaH_h.mjs} +35 -35
  36. package/dist/client/_projectId-BCMkaH_h.mjs.map +1 -0
  37. package/dist/client/{_projectId-B2hG5peP.mjs → _projectId-BdqRntcN.mjs} +15 -14
  38. package/dist/client/{_projectId-B2hG5peP.mjs.map → _projectId-BdqRntcN.mjs.map} +1 -1
  39. package/dist/client/{_projectId-BnWXWTBR.mjs → _projectId-C8RGOqZb.mjs} +3 -3
  40. package/dist/client/{_projectId-BnWXWTBR.mjs.map → _projectId-C8RGOqZb.mjs.map} +1 -1
  41. package/dist/client/{_securityGroupId-Cj9IotMJ.mjs → _securityGroupId-CyQ3XmpB.mjs} +2 -2
  42. package/dist/client/{_securityGroupId-Cj9IotMJ.mjs.map → _securityGroupId-CyQ3XmpB.mjs.map} +1 -1
  43. package/dist/client/{_securityGroupId-ClJiFh4R.mjs → _securityGroupId-DMi7YRux.mjs} +397 -397
  44. package/dist/client/{_securityGroupId-ClJiFh4R.mjs.map → _securityGroupId-DMi7YRux.mjs.map} +1 -1
  45. package/dist/client/{_storageType-BrHDa2bD.mjs → _storageType-Bb6YZgXf.mjs} +657 -660
  46. package/dist/client/{_storageType-BrHDa2bD.mjs.map → _storageType-Bb6YZgXf.mjs.map} +1 -1
  47. package/dist/client/{_storageType-CSLH93js.mjs → _storageType-g1zkFFRh.mjs} +2 -2
  48. package/dist/client/{_storageType-CSLH93js.mjs.map → _storageType-g1zkFFRh.mjs.map} +1 -1
  49. package/dist/client/{about-BnU297yB.mjs → about-B4sGnxeW.mjs} +8 -8
  50. package/dist/client/{about-BnU297yB.mjs.map → about-B4sGnxeW.mjs.map} +1 -1
  51. package/dist/client/{build-DF7MTyXG.mjs → build-DgeVmENN.mjs} +2395 -2390
  52. package/dist/client/{build-DF7MTyXG.mjs.map → build-DgeVmENN.mjs.map} +1 -1
  53. package/dist/client/{constants-BskfpGYY.mjs → constants-D6IO9bPs.mjs} +16 -16
  54. package/dist/client/{constants-BskfpGYY.mjs.map → constants-D6IO9bPs.mjs.map} +1 -1
  55. package/dist/client/{flavors-DAbtRoep.mjs → flavors-CO5l_6d0.mjs} +178 -178
  56. package/dist/client/{flavors-DAbtRoep.mjs.map → flavors-CO5l_6d0.mjs.map} +1 -1
  57. package/dist/client/{flavors-DODudzrA.mjs → flavors-D4nGSs0r.mjs} +2 -2
  58. package/dist/client/{flavors-DODudzrA.mjs.map → flavors-D4nGSs0r.mjs.map} +1 -1
  59. package/dist/client/{floatingips-DJW9ftN_.mjs → floatingips-ClkRV7a7.mjs} +108 -108
  60. package/dist/client/{floatingips-DJW9ftN_.mjs.map → floatingips-ClkRV7a7.mjs.map} +1 -1
  61. package/dist/client/{images-C3JyPwer.mjs → images-B5ktfqg6.mjs} +2 -2
  62. package/dist/client/{images-C3JyPwer.mjs.map → images-B5ktfqg6.mjs.map} +1 -1
  63. package/dist/client/{images-Cp6V1nF5.mjs → images-C_OYLPqv.mjs} +440 -440
  64. package/dist/client/{images-Cp6V1nF5.mjs.map → images-C_OYLPqv.mjs.map} +1 -1
  65. package/dist/client/{images-BbLnuYrL.mjs → images-CvPxoPC0.mjs} +2 -2
  66. package/dist/client/{images-BbLnuYrL.mjs.map → images-CvPxoPC0.mjs.map} +1 -1
  67. package/dist/client/index.js +274 -274
  68. package/dist/client/index.js.map +1 -1
  69. package/dist/client/{objects-DUmK3WgA.mjs → objects-D0grS6pk.mjs} +1361 -1361
  70. package/dist/client/{objects-DUmK3WgA.mjs.map → objects-D0grS6pk.mjs.map} +1 -1
  71. package/dist/client/{objects-Bw96WXOs.mjs → objects-UQyUQxBj.mjs} +2 -2
  72. package/dist/client/{objects-Bw96WXOs.mjs.map → objects-UQyUQxBj.mjs.map} +1 -1
  73. package/dist/client/{pca-Dc_tdh4-.mjs → pca-BJPxOIgq.mjs} +69 -69
  74. package/dist/client/{pca-Dc_tdh4-.mjs.map → pca-BJPxOIgq.mjs.map} +1 -1
  75. package/dist/client/{pca-DKeGzbww.mjs → pca-C9MKOi3Z.mjs} +2 -2
  76. package/dist/client/{pca-DKeGzbww.mjs.map → pca-C9MKOi3Z.mjs.map} +1 -1
  77. package/dist/client/{projects-CRL37ftA.mjs → projects-C3wR-lvM.mjs} +16 -19
  78. package/dist/client/projects-C3wR-lvM.mjs.map +1 -0
  79. package/dist/client/{projects-DUWOgB3m.mjs → projects-CGjBlG2w.mjs} +2 -2
  80. package/dist/client/{projects-DUWOgB3m.mjs.map → projects-CGjBlG2w.mjs.map} +1 -1
  81. package/dist/client/{projects-DpXQYfKc.mjs → projects-DvSiI5Vg.mjs} +2 -2
  82. package/dist/client/{projects-DpXQYfKc.mjs.map → projects-DvSiI5Vg.mjs.map} +1 -1
  83. package/dist/client/{securitygroups-CWWFSjjj.mjs → securitygroups-n8ujBpJP.mjs} +118 -118
  84. package/dist/client/{securitygroups-CWWFSjjj.mjs.map → securitygroups-n8ujBpJP.mjs.map} +1 -1
  85. package/dist/client/{useListWithFiltering-C9k7xWqz.mjs → useListWithFiltering-BuhE81I6.mjs} +10 -10
  86. package/dist/client/{useListWithFiltering-C9k7xWqz.mjs.map → useListWithFiltering-BuhE81I6.mjs.map} +1 -1
  87. package/dist/server/index.d.ts +6 -2
  88. package/dist/server/index.js +4 -17
  89. package/package.json +2 -2
  90. package/dist/client/_imageId-DCvaU7-S.mjs +0 -534
  91. package/dist/client/_projectId-DRr9rLST.mjs.map +0 -1
  92. package/dist/client/projects-CRL37ftA.mjs.map +0 -1
@@ -1,534 +0,0 @@
1
- import { D as e, F as t, O as n, U as r, X as i, Y as a, _ as o, ct as s, dt as c, et as l, g as u, it as d, k as f, q as p, rt as m, tt as ee } from "./build-DF7MTyXG.mjs";
2
- import { r as h } from "./trpcClient-BzPUgiM2.mjs";
3
- import { n as g, t as te } from "./ContentHeader-DsuZD8fa.mjs";
4
- import { A as _, D as ne, E as re, F as v, I as y, N as ie, O as ae, P as b, T as oe, d as se, k as ce, u as le } from "./ImageToastNotifications-CFKQZTgf.mjs";
5
- import { Fragment as x, jsx as S, jsxs as C } from "react/jsx-runtime";
6
- import w, { useState as T } from "react";
7
- import { useNavigate as ue, useParams as de, useSearch as fe } from "@tanstack/react-router";
8
- import { Trans as E, useLingui as D } from "@lingui/react";
9
- //#region src/client/routes/_auth/projects/$projectId/compute/-components/Images/-components/ImageDetailsView.tsx
10
- var O = ({ image: e, myMemberData: t, canUpdateMember: n, onStatusChange: r, isLoading: i }) => {
11
- let { i18n: a, _: s } = D(), l = t.status === v.PENDING, d = t.status === v.REJECTED, f = t.created_at ? new Date(t.created_at).toLocaleString() : a._({ id: "fj5byd" }), p = t.updated_at ? new Date(t.updated_at).toLocaleString() : a._({ id: "fj5byd" }), m = e.owner ?? "";
12
- return /*#__PURE__*/ C(u, { children: [
13
- l && /*#__PURE__*/ S("p", {
14
- className: "text-theme-highest font-semibold",
15
- children: /*#__PURE__*/ S(E, { id: "/EcdUM" })
16
- }),
17
- /*#__PURE__*/ S("p", { children: /*#__PURE__*/ S(E, {
18
- id: "Uwo8Xw",
19
- values: {
20
- ownerProject: m,
21
- sharedAt: f
22
- },
23
- components: { 0: /*#__PURE__*/ S("span", { className: "font-semibold" }) }
24
- }) }),
25
- /*#__PURE__*/ C("ul", { children: [
26
- /*#__PURE__*/ C("li", { children: [
27
- /*#__PURE__*/ S("span", {
28
- className: "font-semibold",
29
- children: /*#__PURE__*/ S(E, { id: "azXlY+" })
30
- }),
31
- " ",
32
- t.status
33
- ] }),
34
- /*#__PURE__*/ C("li", { children: [
35
- /*#__PURE__*/ S("span", {
36
- className: "font-semibold",
37
- children: /*#__PURE__*/ S(E, { id: "G6AP+o" })
38
- }),
39
- " ",
40
- f
41
- ] }),
42
- /*#__PURE__*/ C("li", { children: [
43
- /*#__PURE__*/ S("span", {
44
- className: "font-semibold",
45
- children: /*#__PURE__*/ S(E, { id: "pFg+7w" })
46
- }),
47
- " ",
48
- p
49
- ] })
50
- ] }),
51
- n && (l || d) && /*#__PURE__*/ C(c, { children: [/*#__PURE__*/ S(o, {
52
- onClick: () => r(v.ACCEPTED),
53
- disabled: i,
54
- children: /*#__PURE__*/ S(E, { id: "g3UF2V" })
55
- }), l && /*#__PURE__*/ S(o, {
56
- onClick: () => r(v.REJECTED),
57
- disabled: i,
58
- children: /*#__PURE__*/ S(E, { id: "1t/NnN" })
59
- })] })
60
- ] });
61
- }, k = ({ image: e }) => {
62
- let { i18n: r, _: i } = D();
63
- return /*#__PURE__*/ C(n, {
64
- px: !1,
65
- py: !0,
66
- children: [/*#__PURE__*/ S(l, { children: r._({ id: "nW/hX9" }) }), /*#__PURE__*/ C(m, {
67
- alignTerms: "right",
68
- children: [
69
- /*#__PURE__*/ S(p, { children: r._({ id: "S0kLOH" }) }),
70
- /*#__PURE__*/ S(t, { children: /*#__PURE__*/ S(g, { text: e.id }) }),
71
- /*#__PURE__*/ S(p, { children: r._({ id: "6YtxFj" }) }),
72
- /*#__PURE__*/ S(t, { children: e.name }),
73
- /*#__PURE__*/ S(p, { children: r._({ id: "uAQUqI" }) }),
74
- /*#__PURE__*/ S(t, { children: e.status }),
75
- /*#__PURE__*/ S(p, { children: r._({ id: "Cj2Gtd" }) }),
76
- /*#__PURE__*/ S(t, { children: /*#__PURE__*/ S(y, { size: e.size }) }),
77
- /*#__PURE__*/ S(p, { children: r._({ id: "Cxgv2U" }) }),
78
- /*#__PURE__*/ C(t, { children: [e.min_disk, " GB"] }),
79
- /*#__PURE__*/ S(p, { children: r._({ id: "B2Czeb" }) }),
80
- /*#__PURE__*/ C(t, { children: [e.min_ram, " MB"] }),
81
- /*#__PURE__*/ S(p, { children: r._({ id: "NopYGU" }) }),
82
- /*#__PURE__*/ S(t, { children: /*#__PURE__*/ S("span", {
83
- className: "uppercase",
84
- children: e.disk_format
85
- }) }),
86
- /*#__PURE__*/ S(p, { children: r._({ id: "6/xipy" }) }),
87
- /*#__PURE__*/ S(t, { children: /*#__PURE__*/ S("span", {
88
- className: "uppercase",
89
- children: e.container_format
90
- }) }),
91
- /*#__PURE__*/ S(p, { children: r._({ id: "88kg0+" }) }),
92
- /*#__PURE__*/ S(t, { children: e.created_at ? new Date(e.created_at).toLocaleDateString() : r._({ id: "fj5byd" }) }),
93
- /*#__PURE__*/ S(p, { children: r._({ id: "Llcakz" }) }),
94
- /*#__PURE__*/ S(t, { children: e.updated_at ? new Date(e.updated_at).toLocaleDateString() : r._({ id: "fj5byd" }) })
95
- ]
96
- })]
97
- });
98
- }, A = ({ image: e, currentProjectId: r }) => {
99
- let { i18n: i, _: a } = D(), o = e.visibility === "shared" && e.owner !== void 0 && e.owner !== r;
100
- return /*#__PURE__*/ C(n, {
101
- px: !1,
102
- py: !0,
103
- children: [/*#__PURE__*/ S(l, { children: i._({ id: "a3LDKx" }) }), /*#__PURE__*/ C(m, {
104
- alignTerms: "right",
105
- children: [
106
- /*#__PURE__*/ S(p, { children: o ? i._({ id: "20axE5" }) : i._({ id: "YsrbQh" }) }),
107
- /*#__PURE__*/ S(t, { children: e.owner ? /*#__PURE__*/ S(g, { text: e.owner }) : "" }),
108
- /*#__PURE__*/ S(p, { children: i._({ id: "2q/Q7x" }) }),
109
- /*#__PURE__*/ S(t, { children: e.visibility }),
110
- /*#__PURE__*/ S(p, { children: i._({ id: "644xgx" }) }),
111
- /*#__PURE__*/ S(t, { children: e.protected ? i._({ id: "l75CjT" }) : i._({ id: "1UzENP" }) }),
112
- /*#__PURE__*/ S(p, { children: i._({ id: "PzgYM9" }) }),
113
- /*#__PURE__*/ S(t, { children: e?.checksum ? e.checksum : "" })
114
- ]
115
- })]
116
- });
117
- }, j = ({ image: e }) => {
118
- let { i18n: r, _: i } = D(), a = new Set([
119
- "id",
120
- "name",
121
- "status",
122
- "visibility",
123
- "size",
124
- "disk_format",
125
- "container_format",
126
- "min_disk",
127
- "min_ram",
128
- "owner",
129
- "protected",
130
- "created_at",
131
- "updated_at",
132
- "checksum"
133
- ]), o = Object.entries(e).filter(([e]) => !a.has(e)).sort(([e], [t]) => e.localeCompare(t)), s = o.length > 0;
134
- return /*#__PURE__*/ C(n, {
135
- px: !1,
136
- py: !0,
137
- children: [/*#__PURE__*/ S(l, { children: r._({ id: "bc67JN" }) }), s ? /*#__PURE__*/ S(m, {
138
- alignTerms: "right",
139
- className: "grid-cols-4",
140
- children: o.map(([e, n]) => /*#__PURE__*/ C(w.Fragment, { children: [/*#__PURE__*/ S(p, {
141
- className: "col-span-1",
142
- children: e
143
- }), /*#__PURE__*/ S(t, {
144
- className: "col-span-1",
145
- children: n == null ? /*#__PURE__*/ S("span", { children: "null" }) : typeof n == "object" ? /*#__PURE__*/ S("span", {
146
- className: "break-all",
147
- children: JSON.stringify(n)
148
- }) : typeof n == "boolean" ? n ? r._({ id: "c+xCSz" }) : r._({ id: "ocUvR+" }) : /*#__PURE__*/ S("span", {
149
- className: "break-all",
150
- children: String(n)
151
- })
152
- })] }, e))
153
- }) : /*#__PURE__*/ S("p", {
154
- className: "text-theme-light",
155
- children: r._({ id: "9v5VLp" })
156
- })]
157
- });
158
- }, M = (e) => {
159
- let t = "px-6 py-3 font-semibold border-b-2 transition-colors";
160
- return e ? `${t} border-theme-accent text-theme-highest` : `${t} border-transparent text-theme-secondary hover:text-theme-high`;
161
- }, N = ({ image: e, permissions: t, currentProjectId: r }) => {
162
- let [i, o] = T(!1), [s, c] = T(null), { data: l, isLoading: u } = h.compute.listImageMembers.useQuery({
163
- project_id: r,
164
- imageId: e.id
165
- }, { enabled: !!e.id && !!r });
166
- return /*#__PURE__*/ C(n, {
167
- px: !1,
168
- py: !0,
169
- children: [s && /*#__PURE__*/ S(a, {
170
- text: s.text,
171
- variant: s.type,
172
- onDismiss: () => c(null),
173
- className: "mb-4"
174
- }), /*#__PURE__*/ S(_, {
175
- image: e,
176
- imageMembers: l,
177
- isMembersLoading: u,
178
- canAdd: t?.canCreateMember ?? !1,
179
- canRemove: t?.canDeleteMember ?? !1,
180
- isAddingMember: i,
181
- setIsAddingMember: o,
182
- setMessage: c,
183
- projectId: r
184
- })]
185
- });
186
- }, pe = ({ image: e, currentProjectId: t, activeTab: n = "details", onTabChange: r, permissions: a, myMemberData: o, onMemberStatusChange: s, isMemberStatusChanging: c, actions: l }) => {
187
- let { i18n: u, _: d } = D(), f = e.visibility === "shared" && e.owner !== void 0 && e.owner !== t, p = e.owner === t && e.visibility === "shared";
188
- return /*#__PURE__*/ C(i, {
189
- direction: "vertical",
190
- gap: "6",
191
- children: [
192
- f && o && s && /*#__PURE__*/ S(O, {
193
- image: e,
194
- myMemberData: o,
195
- canUpdateMember: a?.canUpdateMember ?? !1,
196
- onStatusChange: s,
197
- isLoading: c ?? !1
198
- }),
199
- p && /*#__PURE__*/ S("div", {
200
- className: "border-theme-background-lvl-3 border-b",
201
- children: /*#__PURE__*/ C(i, {
202
- direction: "horizontal",
203
- gap: "0",
204
- children: [/*#__PURE__*/ S("button", {
205
- className: M(n === "details"),
206
- onClick: () => r?.("details"),
207
- children: u._({ id: "URmyfc" })
208
- }), /*#__PURE__*/ S("button", {
209
- className: M(n === "sharing"),
210
- onClick: () => r?.("sharing"),
211
- children: u._({ id: "aG9OiI" })
212
- })]
213
- })
214
- }),
215
- (n === "details" || !p) && /*#__PURE__*/ C(x, { children: [
216
- l,
217
- /*#__PURE__*/ S(k, { image: e }),
218
- /*#__PURE__*/ S(A, {
219
- image: e,
220
- currentProjectId: t
221
- }),
222
- /*#__PURE__*/ S(j, { image: e })
223
- ] }),
224
- n === "sharing" && p && /*#__PURE__*/ S(N, {
225
- image: e,
226
- permissions: a
227
- })
228
- ]
229
- });
230
- };
231
- //#endregion
232
- //#region src/client/routes/_auth/projects/$projectId/compute/images/$imageId.tsx?tsr-split=component
233
- function P() {
234
- let { projectId: t, imageId: n } = de({ from: "/_auth/projects/$projectId/compute/images/$imageId" }), { tab: a } = fe({ from: "/_auth/projects/$projectId/compute/images/$imageId" }), l = ue(), { i18n: u, _: p } = D(), { data: m, status: g, error: _ } = h.compute.getImageById.useQuery({
235
- project_id: t,
236
- imageId: n
237
- }), { data: v } = h.compute.canUser.useQuery({
238
- project_id: t,
239
- permission: [
240
- "images:delete",
241
- "images:update",
242
- "images:create_member",
243
- "images:delete_member",
244
- "images:update_member"
245
- ]
246
- }), y = {
247
- canDelete: v?.[0] ?? !1,
248
- canUpdate: v?.[1] ?? !1,
249
- canCreateMember: v?.[2] ?? !1,
250
- canDeleteMember: v?.[3] ?? !1,
251
- canUpdateMember: v?.[4] ?? !1
252
- }, w = h.useUtils(), [O, k] = T(!1), [A, j] = T(!1), [M, N] = T(!1), [P, F] = T(!1), [I, L] = T(!1), [R, z] = T(null), B = h.compute.updateImage.useMutation({ onSuccess: (e) => {
253
- w.compute.getImageById.setData({
254
- project_id: t,
255
- imageId: n
256
- }, e), w.compute.listImagesWithPagination.invalidate();
257
- } }), V = h.compute.deleteImage.useMutation({ onSuccess: () => {
258
- w.compute.listImagesWithPagination.invalidate();
259
- } }), H = h.compute.deactivateImage.useMutation({ onSuccess: () => {
260
- w.compute.getImageById.invalidate({
261
- project_id: t,
262
- imageId: n
263
- });
264
- } }), U = h.compute.reactivateImage.useMutation({ onSuccess: () => {
265
- w.compute.getImageById.invalidate({
266
- project_id: t,
267
- imageId: n
268
- });
269
- } }), W = h.compute.updateImageVisibility.useMutation({ onSuccess: (e) => {
270
- w.compute.getImageById.setData({
271
- project_id: t,
272
- imageId: n
273
- }, e);
274
- } }), G = m?.visibility === b.SHARED && m?.owner !== void 0 && m?.owner !== t, { data: K } = h.compute.getImageMember.useQuery({
275
- project_id: t,
276
- imageId: n,
277
- memberId: t
278
- }, { enabled: G && !!n && !!t }), q = h.compute.updateImageMember.useMutation({ onSuccess: () => {
279
- w.compute.getImageMember.invalidate({
280
- project_id: t,
281
- imageId: n,
282
- memberId: t
283
- }), w.compute.listImageMembers.invalidate({
284
- project_id: t,
285
- imageId: n
286
- }), w.compute.listImagesWithPagination.invalidate(), w.compute.listSharedImagesByMemberStatus.invalidate();
287
- } }), J = async (e) => {
288
- try {
289
- await q.mutateAsync({
290
- project_id: t,
291
- imageId: n,
292
- memberId: t,
293
- status: e
294
- }), z(se(e, { onDismiss: () => z(null) }));
295
- } catch (e) {
296
- let t = e?.message;
297
- z(le(t, { onDismiss: () => z(null) }));
298
- }
299
- }, Y = () => {
300
- l({
301
- to: "/projects/$projectId/compute/images",
302
- params: { projectId: t }
303
- });
304
- }, X = B.isPending || V.isPending || H.isPending || U.isPending || W.isPending, me = (e, t) => {
305
- let n = [];
306
- return Object.entries(e).forEach(([e, r]) => {
307
- let i = `/${e}`;
308
- if (r == null) e in t && n.push({
309
- op: "remove",
310
- path: i
311
- });
312
- else {
313
- let a = e in t;
314
- n.push({
315
- op: a ? "replace" : "add",
316
- path: i,
317
- value: r
318
- });
319
- }
320
- }), n;
321
- }, Z = async (e) => {
322
- if (!m) return !1;
323
- let r = me(e, m);
324
- try {
325
- return await B.mutateAsync({
326
- project_id: t,
327
- imageId: n,
328
- operations: r
329
- }), k(!1), !0;
330
- } catch {
331
- return !1;
332
- }
333
- }, he = async (e) => {
334
- try {
335
- await V.mutateAsync({
336
- project_id: t,
337
- imageId: e.id
338
- }), N(!1), Y();
339
- } catch {
340
- N(!1);
341
- }
342
- }, ge = async (e) => {
343
- try {
344
- await U.mutateAsync({
345
- project_id: t,
346
- imageId: e.id
347
- }), F(!1);
348
- } catch {
349
- F(!1);
350
- }
351
- }, _e = async (e) => {
352
- try {
353
- await H.mutateAsync({
354
- project_id: t,
355
- imageId: e.id
356
- }), L(!1);
357
- } catch {
358
- L(!1);
359
- }
360
- }, ve = async (e) => {
361
- if (m) try {
362
- await W.mutateAsync({
363
- project_id: t,
364
- imageId: m.id,
365
- visibility: e
366
- });
367
- } catch {}
368
- };
369
- if (g === "pending") return /*#__PURE__*/ C(i, {
370
- className: "fixed inset-0",
371
- distribution: "center",
372
- alignment: "center",
373
- direction: "vertical",
374
- children: [/*#__PURE__*/ S(r, {
375
- variant: "primary",
376
- size: "large",
377
- className: "mb-2"
378
- }), /*#__PURE__*/ S(E, { id: "hH3kDo" })]
379
- });
380
- if (g === "error") {
381
- let e = _?.message || "Unknown error";
382
- return /*#__PURE__*/ C(i, {
383
- className: "fixed inset-0",
384
- distribution: "center",
385
- alignment: "center",
386
- direction: "vertical",
387
- gap: "5",
388
- children: [
389
- /*#__PURE__*/ S("p", {
390
- className: "text-theme-error font-semibold",
391
- children: /*#__PURE__*/ S(E, { id: "Jh4rAZ" })
392
- }),
393
- /*#__PURE__*/ S("p", {
394
- className: "text-theme-highest",
395
- children: e
396
- }),
397
- /*#__PURE__*/ S(o, {
398
- onClick: Y,
399
- variant: "primary",
400
- children: /*#__PURE__*/ S(E, { id: "bnql/K" })
401
- })
402
- ]
403
- });
404
- }
405
- if (!m) return /*#__PURE__*/ C(i, {
406
- className: "fixed inset-0",
407
- distribution: "center",
408
- alignment: "center",
409
- direction: "vertical",
410
- gap: "5",
411
- children: [/*#__PURE__*/ S("p", {
412
- className: "text-theme-highest",
413
- children: /*#__PURE__*/ S(E, { id: "1pdLQw" })
414
- }), /*#__PURE__*/ S(o, {
415
- onClick: Y,
416
- variant: "primary",
417
- children: /*#__PURE__*/ S(E, { id: "bnql/K" })
418
- })]
419
- });
420
- let Q = m.status === ie.DEACTIVATED, ye = m.visibility === b.PRIVATE, be = K?.status === "accepted", $ = m.owner === t, xe = G && be && y.canUpdateMember, Se = !G && y.canUpdate, Ce = !G && y.canDelete && !m.protected, we = !G && $ && m.visibility === b.SHARED && (y.canCreateMember || y.canDeleteMember), Te = xe || Se || Ce || we, Ee = Te || !G && y.canUpdate ? /*#__PURE__*/ C(c, { children: [
421
- Te && /*#__PURE__*/ C(e, { children: [/*#__PURE__*/ S(d, {
422
- as: "div",
423
- children: /*#__PURE__*/ S(o, {
424
- icon: "moreVert",
425
- disabled: X,
426
- children: /*#__PURE__*/ S(E, { id: "PgNNGl" })
427
- })
428
- }), /*#__PURE__*/ C(s, { children: [
429
- xe && /*#__PURE__*/ S(f, {
430
- label: u._({ id: "1t/NnN" }),
431
- onClick: () => J("rejected")
432
- }),
433
- !G && y.canUpdate && /*#__PURE__*/ S(f, {
434
- label: Q ? u._({ id: "FQBaXG" }) : u._({ id: "5y3O+A" }),
435
- onClick: () => Q ? F(!0) : L(!0)
436
- }),
437
- !G && y.canUpdate && ye && /*#__PURE__*/ S(f, {
438
- label: u._({ id: "gMYsdZ" }),
439
- onClick: () => ve("shared")
440
- }),
441
- !G && $ && m.visibility === b.SHARED && (y.canCreateMember || y.canDeleteMember) && /*#__PURE__*/ S(f, {
442
- label: u._({ id: "cWbW6w" }),
443
- onClick: () => l({
444
- to: "/projects/$projectId/compute/images/$imageId",
445
- params: {
446
- projectId: t,
447
- imageId: m.id
448
- },
449
- search: { tab: "sharing" }
450
- })
451
- }),
452
- !G && y.canDelete && !m.protected && /*#__PURE__*/ S(f, {
453
- label: u._({ id: "cnGeoo" }),
454
- onClick: () => N(!0)
455
- })
456
- ] })] }),
457
- !G && y.canUpdate && /*#__PURE__*/ S(o, {
458
- onClick: () => j(!0),
459
- disabled: X,
460
- children: /*#__PURE__*/ S(E, { id: "SIfYq6" })
461
- }),
462
- !G && y.canUpdate && /*#__PURE__*/ S(o, {
463
- onClick: () => k(!0),
464
- variant: "primary",
465
- disabled: X,
466
- children: /*#__PURE__*/ S(E, { id: "Y1YKad" })
467
- })
468
- ] }) : void 0;
469
- return /*#__PURE__*/ C(x, { children: [
470
- /*#__PURE__*/ S(te, {
471
- title: String(m.name ?? m.id),
472
- projectId: t,
473
- actions: Ee
474
- }),
475
- /*#__PURE__*/ S("div", {
476
- className: "mt-3",
477
- children: /*#__PURE__*/ S(pe, {
478
- image: m,
479
- currentProjectId: t,
480
- activeTab: a ?? "details",
481
- onTabChange: (e) => l({ search: { tab: e === "details" ? void 0 : e } }),
482
- permissions: {
483
- canCreateMember: y.canCreateMember,
484
- canDeleteMember: y.canDeleteMember,
485
- canUpdateMember: y.canUpdateMember
486
- },
487
- myMemberData: K,
488
- onMemberStatusChange: J,
489
- isMemberStatusChanging: q.isPending
490
- }, m.id)
491
- }),
492
- R && /*#__PURE__*/ S(ee, { ...R }),
493
- O && /*#__PURE__*/ S(ce, {
494
- image: m,
495
- isOpen: O,
496
- isLoading: B.isPending,
497
- onClose: () => k(!1),
498
- onSave: Z
499
- }),
500
- A && /*#__PURE__*/ S(ae, {
501
- image: m,
502
- isOpen: A,
503
- isLoading: B.isPending,
504
- onClose: () => j(!1),
505
- onSave: Z
506
- }),
507
- M && /*#__PURE__*/ S(ne, {
508
- image: m,
509
- isOpen: M,
510
- isLoading: V.isPending,
511
- isDisabled: !!m.protected,
512
- onClose: () => N(!1),
513
- onDelete: he
514
- }),
515
- P && /*#__PURE__*/ S(re, {
516
- image: m,
517
- isOpen: P,
518
- isLoading: U.isPending,
519
- onClose: () => F(!1),
520
- onActivate: ge
521
- }),
522
- I && /*#__PURE__*/ S(oe, {
523
- image: m,
524
- isOpen: I,
525
- isLoading: H.isPending,
526
- onClose: () => L(!1),
527
- onDeactivate: _e
528
- })
529
- ] });
530
- }
531
- //#endregion
532
- export { P as component };
533
-
534
- //# sourceMappingURL=_imageId-DCvaU7-S.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"_projectId-DRr9rLST.mjs","names":["useNavigate","useMatches","useParams","useRouteContext","useState","useEffect","SideNavigation","SideNavigationList","SideNavigationGroup","SideNavigationItem","Divider","isRouteInfo","Slot","SideNavBar","projectId","projectName","domainName","sections","navigate","matches","provider","strict","slots","navBadge","service","serviceBadge","component","useShadowDOM","currentService","activeMatch","reverse","find","m","staticData","activeRouteInfo","undefined","activeSection","section","activeService","forceOpenCounter","setForceOpenCounter","Object","fromEntries","map","s","prev","ariaLabel","onClick","to","params","label","p","className","spacing","services","open","item","isStorageContainers","isSelected","span","selected","sideNavBanner","getServiceIndex","buildNavSections","projectId","availableServices","enabledServices","serviceIndex","isEnabled","service","includes","computeServices","label","t","navigate","nav","to","params","networkServices","storageServices","provider","storageType","pcaServices","clavisServices","section","services","filter","s","length","Breadcrumb","BreadcrumbItem","useMatches","useNavigate","useParams","useMemo","isRouteInfo","ProjectInfoBox","projectInfo","useLingui","navigate","matches","projectId","strict","breadcrumbs","crumbLabels","Compute","t","Network","Storage","Services","Images","Flavors","resolveProviderLabel","provider","items","push","icon","label","onClick","to","domain","name","projectMatches","filter","m","routeId","startsWith","deepest","length","info","staticData","undefined","active","params","sectionCrumb","labelKey","crumb","useParamAsLabel","resolvedLabel","isDetail","intermediateCrumb","iTo","iParam","useParentTitleAsLabel","parentMatch","parentTitle","meta","find","title","iLabel","className","map","item","index","Outlet","useLoaderData","useRouteContext","AppShell","Container","Stack","SideNavBar","buildNavSections","ProjectInfoBox","useMemo","Route","RouteComponent","availableServices","projectId","crumbProject","crumbDomain","from","id","enabledServices","strict","sections","name","domain","component"],"sources":["../../src/client/routes/_auth/projects/-components/SideNavBar.tsx","../../src/client/routes/_auth/projects/-components/buildNavSections.ts","../../src/client/components/ProjectView/ProjectInfoBox.tsx","../../src/client/routes/_auth/projects/$projectId.tsx?tsr-split=component"],"sourcesContent":["import { useNavigate, useMatches, useParams, useRouteContext } from \"@tanstack/react-router\"\nimport { useState, useEffect } from \"react\"\nimport {\n SideNavigation,\n SideNavigationList,\n SideNavigationGroup,\n SideNavigationItem,\n Divider,\n} from \"@cloudoperators/juno-ui-components/index\"\nimport { isRouteInfo } from \"@/client/routes/routeInfo\"\nimport { Slot } from \"@/client/components/Slot\"\nimport type { NavSection } from \"./buildNavSections\"\n\ninterface SideNavBarProps {\n projectId: string\n projectName: string\n domainName?: string\n sections: NavSection[]\n}\n\nexport const SideNavBar = ({ projectId, projectName, domainName, sections }: SideNavBarProps) => {\n const navigate = useNavigate()\n const matches = useMatches()\n const { provider } = useParams({ strict: false }) as { provider?: string }\n const { slots } = useRouteContext({ strict: false })\n\n const navBadge = (service: string) => {\n if (!slots?.serviceBadge) return null\n return <Slot component={slots.serviceBadge} useShadowDOM={false} currentService={service} />\n }\n\n // Read active section/service from the deepest match that has valid RouteInfo staticData\n const activeMatch = [...matches].reverse().find((m) => isRouteInfo(m.staticData))\n const activeRouteInfo = activeMatch && isRouteInfo(activeMatch.staticData) ? activeMatch.staticData : undefined\n const activeSection = activeRouteInfo?.section ?? null\n const activeService = activeRouteInfo?.service ?? null\n\n // Track which sections should be forced open by incrementing a counter\n // This forces a remount of SideNavigationGroup since it doesn't expose onToggle\n const [forceOpenCounter, setForceOpenCounter] = useState<Record<string, number>>(() =>\n Object.fromEntries(sections.map((s) => [s.section, 0]))\n )\n\n // When navigating to a section, force it to expand by remounting\n useEffect(() => {\n if (activeSection) {\n setForceOpenCounter((prev) => ({ ...prev, [activeSection]: (prev[activeSection] || 0) + 1 }))\n }\n }, [activeSection])\n\n return (\n <SideNavigation ariaLabel=\"Project Side Navigation\">\n <>\n <SideNavigationList>\n <>\n <SideNavigationItem\n onClick={() => navigate({ to: \"/projects/$projectId\", params: { projectId } })}\n label={\n <>\n {domainName && <p className=\"text-theme-light text-xs leading-4 font-bold\">{domainName} /</p>}\n <p className=\"leading-5 font-normal\">{projectName}</p>\n </>\n }\n />\n <Divider spacing=\"1\" />\n {sections.map(({ section, label, services }) => (\n <SideNavigationGroup key={`${section}-${forceOpenCounter[section]}`} label={label} open={true}>\n {services.map((item) => {\n const isStorageContainers = activeSection === \"storage\" && activeService === \"containers\"\n const isSelected =\n activeSection === section &&\n (isStorageContainers ? item.params.provider === provider : activeService === item.service)\n\n return (\n <SideNavigationItem\n key={item.service}\n onClick={() => item.navigate(navigate)}\n label={\n <span className=\"flex items-start gap-2\">\n {item.label}\n {navBadge(item.service)}\n </span>\n }\n selected={isSelected}\n />\n )\n })}\n </SideNavigationGroup>\n ))}\n </>\n </SideNavigationList>\n {slots?.sideNavBanner && <Slot component={slots.sideNavBanner} />}\n </>\n </SideNavigation>\n )\n}\n","import { getServiceIndex } from \"@/server/Authentication/helpers\"\nimport { t } from \"@lingui/core/macro\"\nimport type { NavigateFn } from \"@tanstack/react-router\"\n\nexport type NavItem = {\n service: string\n label: string\n navigate: (navigateFn: NavigateFn) => void\n params: Record<string, string>\n}\n\nexport type NavSection = {\n section: string\n label: string\n services: NavItem[]\n}\n\nexport function buildNavSections(\n projectId: string,\n availableServices: { type: string; name: string }[],\n enabledServices?: string[]\n): NavSection[] {\n const serviceIndex = getServiceIndex(availableServices)\n const isEnabled = (service: string) => !enabledServices || enabledServices.includes(service)\n\n const computeServices: NavItem[] = [\n ...(serviceIndex[\"image\"]?.[\"glance\"] && isEnabled(\"images\")\n ? [\n {\n service: \"images\",\n label: t`Images`,\n navigate: (nav: NavigateFn) => nav({ to: \"/projects/$projectId/compute/images\", params: { projectId } }),\n params: { projectId },\n },\n ]\n : []),\n ...(serviceIndex?.[\"compute\"]?.[\"nova\"] && isEnabled(\"flavors\")\n ? [\n {\n service: \"flavors\",\n label: t`Flavors`,\n navigate: (nav: NavigateFn) => nav({ to: \"/projects/$projectId/compute/flavors\", params: { projectId } }),\n params: { projectId },\n },\n ]\n : []),\n ]\n\n const networkServices: NavItem[] = serviceIndex[\"network\"]\n ? [\n ...(isEnabled(\"securitygroups\")\n ? [\n {\n service: \"securitygroups\",\n label: t`Security Groups`,\n navigate: (nav: NavigateFn) =>\n nav({ to: \"/projects/$projectId/network/securitygroups\", params: { projectId } }),\n params: { projectId },\n },\n ]\n : []),\n ...(isEnabled(\"floatingips\")\n ? [\n {\n service: \"floatingips\",\n label: t`Floating IPs`,\n navigate: (nav: NavigateFn) =>\n nav({ to: \"/projects/$projectId/network/floatingips\", params: { projectId } }),\n params: { projectId },\n },\n ]\n : []),\n ]\n : []\n\n const storageServices: NavItem[] = [\n ...(serviceIndex?.[\"object-store\"]?.[\"swift\"] && isEnabled(\"containers\")\n ? [\n {\n service: \"containers\",\n label: t`Object Storage (Swift)`,\n navigate: (nav: NavigateFn) =>\n nav({\n to: \"/projects/$projectId/storage/$provider/$storageType\",\n params: { projectId, provider: \"swift\", storageType: \"containers\" },\n }),\n params: { projectId, provider: \"swift\", storageType: \"containers\" },\n },\n ]\n : []),\n ...(isEnabled(\"ceph-containers\")\n ? [\n {\n service: \"ceph-containers\",\n label: t`Object Storage (Ceph)`,\n navigate: (nav: NavigateFn) =>\n nav({\n to: \"/projects/$projectId/storage/$provider/$storageType\",\n params: { projectId, provider: \"ceph\", storageType: \"buckets\" },\n }),\n params: { projectId, provider: \"ceph\", storageType: \"buckets\" },\n },\n ]\n : []),\n ]\n\n // temporary as clavis is not fully GA, after GA replace with [\"pca\"]?.[\"clavis\"]\n const pcaServices = serviceIndex[\"pca\"]?.[\"clavis-beta\"] || serviceIndex[\"pca\"]?.[\"clavis-dev\"]\n const clavisServices: NavItem[] =\n pcaServices && isEnabled(\"pca\")\n ? [\n {\n service: \"pca\",\n label: t`PCA (Clavis)`,\n navigate: (nav: NavigateFn) => nav({ to: \"/projects/$projectId/services/pca\", params: { projectId } }),\n params: { projectId },\n },\n ]\n : []\n\n return [\n { section: \"compute\", label: t`Compute`, services: computeServices },\n { section: \"network\", label: t`Network`, services: networkServices },\n { section: \"storage\", label: t`Storage`, services: storageServices },\n { section: \"services\", label: t`Services`, services: clavisServices },\n ].filter((s) => s.services.length > 0)\n}\n","import { Breadcrumb, BreadcrumbItem, KnownIcons } from \"@cloudoperators/juno-ui-components\"\nimport { useMatches, useNavigate, useParams } from \"@tanstack/react-router\"\nimport { useMemo } from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { isRouteInfo, CrumbLabelKey } from \"@/client/routes/routeInfo\"\n\ninterface ProjectInfoBoxProps {\n projectInfo: {\n id: string\n name: string\n description?: string\n domain?: {\n name?: string\n }\n }\n}\n\nexport function ProjectInfoBox({ projectInfo }: ProjectInfoBoxProps) {\n const { t } = useLingui()\n const navigate = useNavigate()\n const matches = useMatches()\n const { projectId } = useParams({ strict: false }) as { projectId: string }\n\n const breadcrumbs = useMemo(() => {\n const crumbLabels: Record<CrumbLabelKey, string> = {\n Compute: t`Compute`,\n Network: t`Network`,\n Storage: t`Storage`,\n Services: t`Services`,\n Images: t`Images`,\n Flavors: t`Flavors`,\n \"Security Groups\": t`Security Groups`,\n \"Floating IPs\": t`Floating IPs`,\n \"PCA (Clavis)\": t`PCA (Clavis)`,\n }\n\n const resolveProviderLabel = (provider: string | undefined) => {\n if (provider === \"swift\") return t`Object Storage (Swift)`\n if (provider === \"ceph\") return t`Object Storage (Ceph)`\n return t`Storage`\n }\n\n const items: Array<{ label?: string; icon?: KnownIcons; onClick?: () => void; active?: boolean }> = []\n\n items.push({ icon: \"home\", label: t`Home`, onClick: () => navigate({ to: \"/projects\" }) })\n\n if (projectInfo.domain?.name) {\n items.push({ label: projectInfo.domain.name })\n }\n\n const projectMatches = matches.filter(\n (m) => m.routeId !== \"/_auth/projects/$projectId\" && m.routeId.startsWith(\"/_auth/projects/$projectId\")\n )\n const deepest = projectMatches[projectMatches.length - 1]\n\n const info = deepest ? (isRouteInfo(deepest.staticData) ? deepest.staticData : undefined) : undefined\n\n if (!deepest || !info) {\n items.push({ label: projectInfo.name, active: true })\n return items\n }\n\n items.push({\n label: projectInfo.name,\n onClick: () => navigate({ to: \"/projects/$projectId\", params: { projectId } }),\n })\n\n const params = deepest.params as Record<string, string>\n\n if (info.sectionCrumb?.to) {\n const { labelKey, to } = info.sectionCrumb\n const label = labelKey ? crumbLabels[labelKey] : undefined\n items.push({ label, onClick: () => navigate({ to: to as never, params: params as never }) })\n }\n\n if (info.crumb) {\n const { labelKey, to, useParamAsLabel } = info.crumb\n const resolvedLabel = useParamAsLabel\n ? resolveProviderLabel(params[useParamAsLabel])\n : labelKey\n ? crumbLabels[labelKey]\n : undefined\n\n if (info.isDetail) {\n items.push({ label: resolvedLabel, onClick: () => navigate({ to: to as never, params: params as never }) })\n\n if (info.intermediateCrumb) {\n const { to: iTo, useParamAsLabel: iParam, useParentTitleAsLabel } = info.intermediateCrumb\n const parentMatch = projectMatches[projectMatches.length - 2]\n const parentTitle = parentMatch?.meta?.find((m) => m != null && \"title\" in m)?.title as string | undefined\n const iLabel = useParentTitleAsLabel\n ? (parentTitle ?? (iParam ? params[iParam] : undefined))\n : iParam\n ? params[iParam]\n : undefined\n items.push(\n iTo\n ? { label: iLabel, onClick: () => navigate({ to: iTo as never, params: params as never }) }\n : { label: iLabel }\n )\n }\n\n const title = deepest.meta?.find((m) => m != null && \"title\" in m)?.title as string | undefined\n if (title) items.push({ label: title, active: true })\n } else {\n items.push(\n to\n ? { label: resolvedLabel, onClick: () => navigate({ to: to as never, params: params as never }) }\n : { label: resolvedLabel, active: true }\n )\n }\n }\n\n return items\n }, [matches, projectInfo, projectId, navigate, t])\n\n return (\n <Breadcrumb className=\"relative z-1 mt-8 mb-4\">\n {breadcrumbs.map((item, index) => (\n <BreadcrumbItem key={index} label={item.label} icon={item.icon} onClick={item.onClick} active={item.active} />\n ))}\n </Breadcrumb>\n )\n}\n","import { createFileRoute, Outlet, useLoaderData, useRouteContext } from \"@tanstack/react-router\"\nimport { AppShell, Container, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { SideNavBar } from \"@/client/routes/_auth/projects/-components/SideNavBar\"\nimport { buildNavSections } from \"@/client/routes/_auth/projects/-components/buildNavSections\"\nimport { ProjectInfoBox } from \"@/client/components/ProjectView/ProjectInfoBox\"\nimport { RouteError } from \"@/client/components/Error/RouteError\"\nimport { useMemo } from \"react\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId\")({\n component: RouteComponent,\n errorComponent: ({ error }) => {\n return <RouteError error={error} />\n },\n loader: async (options) => {\n const { context, params } = options\n const data = await context.trpcClient?.auth.setCurrentScope.mutate({\n type: \"project\",\n projectId: params.projectId || \"\",\n })\n\n const [availableServices, projects] = await Promise.all([\n context.trpcClient?.auth.getAvailableServices.query(),\n context.trpcClient?.project.getAuthProjects.query().catch(() => null),\n ])\n\n const accountId = data?.domain?.id || \"\"\n const description = projects?.find((p) => p.id === params.projectId)?.description ?? null\n\n return {\n trpcClient: context.trpcClient,\n crumbDomain: { path: `/projects`, name: data?.domain?.name },\n crumbProject: data?.project,\n availableServices,\n accountId,\n projectId: params.projectId,\n description,\n }\n },\n})\n\nfunction RouteComponent() {\n const { availableServices, projectId, crumbProject, crumbDomain } = useLoaderData({ from: Route.id })\n const { enabledServices } = useRouteContext({ strict: false })\n\n const sections = useMemo(\n () => buildNavSections(projectId, availableServices!, enabledServices),\n [projectId, availableServices, enabledServices]\n )\n\n return (\n <AppShell\n embedded\n sideNavigation={\n <SideNavBar\n sections={sections}\n projectId={projectId}\n projectName={crumbProject?.name || projectId}\n domainName={crumbDomain?.name}\n />\n }\n className=\"h-min-screen\"\n >\n <Container>\n <Stack direction=\"vertical\" distribution=\"start\" alignment=\"stretch\" className=\"xl:flex-row\" gap=\"6\">\n {/* Main content area */}\n <div className=\"min-w-0 flex-1\">\n <ProjectInfoBox\n projectInfo={{\n id: projectId,\n name: crumbProject?.name || projectId,\n domain: crumbProject?.domain,\n }}\n />\n <Outlet />\n </div>\n </Stack>\n </Container>\n </AppShell>\n )\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"projects-CRL37ftA.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","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.map((project) => <ProjectCard key={project.id} project={project} />)\n ) : (\n <p className=\"text-center\">\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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"}