@cobaltcore-dev/aurora 0.4.0 → 0.5.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.
Files changed (157) hide show
  1. package/README.md +73 -77
  2. package/dist/client/AuroraApp.d.ts +15 -0
  3. package/dist/client/{AuthProvider-D-5Jpa6F.mjs → AuthProvider-Co4d0WzB.mjs} +3 -3
  4. package/dist/client/{AuthProvider-D-5Jpa6F.mjs.map → AuthProvider-Co4d0WzB.mjs.map} +1 -1
  5. package/dist/client/{ContentHeader-BXZoN3B9.mjs → ContentHeader-xQVhO2yT.mjs} +20 -20
  6. package/dist/client/{ContentHeader-BXZoN3B9.mjs.map → ContentHeader-xQVhO2yT.mjs.map} +1 -1
  7. package/dist/client/{DeleteFlavorModal-BusYn32r.mjs → DeleteFlavorModal-CHTUZ3YV.mjs} +211 -202
  8. package/dist/client/DeleteFlavorModal-CHTUZ3YV.mjs.map +1 -0
  9. package/dist/client/{EditSecurityGroupModal-DK3WYikA.mjs → EditSecurityGroupModal-CWHHx2Xk.mjs} +22 -22
  10. package/dist/client/{EditSecurityGroupModal-DK3WYikA.mjs.map → EditSecurityGroupModal-CWHHx2Xk.mjs.map} +1 -1
  11. package/dist/client/{FiltersInput-OVeIJzIo.mjs → FiltersInput-UKJpNFdr.mjs} +10 -10
  12. package/dist/client/{FiltersInput-OVeIJzIo.mjs.map → FiltersInput-UKJpNFdr.mjs.map} +1 -1
  13. package/dist/client/{FloatingIpActionModals-Dok7fJss.mjs → FloatingIpActionModals-caXn6bYo.mjs} +54 -54
  14. package/dist/client/{FloatingIpActionModals-Dok7fJss.mjs.map → FloatingIpActionModals-caXn6bYo.mjs.map} +1 -1
  15. package/dist/client/{ImageToastNotifications-BG9LPnXf.mjs → ImageToastNotifications-BWimIzu_.mjs} +227 -227
  16. package/dist/client/{ImageToastNotifications-BG9LPnXf.mjs.map → ImageToastNotifications-BWimIzu_.mjs.map} +1 -1
  17. package/dist/client/{RouteError-pDEWC_k7.mjs → RouteError-CUj_m3gu.mjs} +6 -6
  18. package/dist/client/{RouteError-pDEWC_k7.mjs.map → RouteError-CUj_m3gu.mjs.map} +1 -1
  19. package/dist/client/{SortInput-DXWSqSny.mjs → SortInput-GQlQBlAj.mjs} +6 -6
  20. package/dist/client/{SortInput-DXWSqSny.mjs.map → SortInput-GQlQBlAj.mjs.map} +1 -1
  21. package/dist/client/{_auth-CJj1Cnbm.mjs → _auth-DXJkv9QO.mjs} +3 -3
  22. package/dist/client/{_auth-CJj1Cnbm.mjs.map → _auth-DXJkv9QO.mjs.map} +1 -1
  23. package/dist/client/_flavorId-C5dc1N_j.mjs +194 -0
  24. package/dist/client/_flavorId-C5dc1N_j.mjs.map +1 -0
  25. package/dist/client/{_flavorId-BoNcxYmF.mjs → _flavorId-sUWG0xuy.mjs} +15 -15
  26. package/dist/client/_flavorId-sUWG0xuy.mjs.map +1 -0
  27. package/dist/client/{_floatingIpId-DF_BSJN6.mjs → _floatingIpId-COK_TBrz2.mjs} +42 -42
  28. package/dist/client/_floatingIpId-COK_TBrz2.mjs.map +1 -0
  29. package/dist/client/{_floatingIpId-D33bOEmH.mjs → _floatingIpId-CT4y-60o.mjs} +3 -3
  30. package/dist/client/{_floatingIpId-D33bOEmH.mjs.map → _floatingIpId-CT4y-60o.mjs.map} +1 -1
  31. package/dist/client/_imageId-n3RcnhAR.mjs +534 -0
  32. package/dist/client/_imageId-n3RcnhAR.mjs.map +1 -0
  33. package/dist/client/{_pcaId-CbBhBrX1.mjs → _pcaId-B-f_6kqs.mjs} +99 -99
  34. package/dist/client/{_pcaId-CbBhBrX1.mjs.map → _pcaId-B-f_6kqs.mjs.map} +1 -1
  35. package/dist/client/{_pcaId-BYCoeK6_.mjs → _pcaId-ChnM_t-9.mjs} +3 -3
  36. package/dist/client/{_pcaId-BYCoeK6_.mjs.map → _pcaId-ChnM_t-9.mjs.map} +1 -1
  37. package/dist/client/_projectId-26bw-_rm.mjs +46 -0
  38. package/dist/client/_projectId-26bw-_rm.mjs.map +1 -0
  39. package/dist/client/{_projectId-BwLMEMGC.mjs → _projectId-BK9UqeYw.mjs} +14 -14
  40. package/dist/client/{_projectId-BwLMEMGC.mjs.map → _projectId-BK9UqeYw.mjs.map} +1 -1
  41. package/dist/client/{_projectId-D35MN1kY.mjs → _projectId-CCtpAQ8m.mjs} +78 -95
  42. package/dist/client/_projectId-CCtpAQ8m.mjs.map +1 -0
  43. package/dist/client/{_projectId-OW2xkK43.mjs → _projectId-Dhb4AyBD.mjs} +3 -3
  44. package/dist/client/{_projectId-OW2xkK43.mjs.map → _projectId-Dhb4AyBD.mjs.map} +1 -1
  45. package/dist/client/{_securityGroupId-B-Z-CzLp.mjs → _securityGroupId-CR1mKICQ.mjs} +3 -3
  46. package/dist/client/{_securityGroupId-B-Z-CzLp.mjs.map → _securityGroupId-CR1mKICQ.mjs.map} +1 -1
  47. package/dist/client/{_securityGroupId-B1bOYRbX.mjs → _securityGroupId-DroYG6cA.mjs} +254 -255
  48. package/dist/client/{_securityGroupId-B1bOYRbX.mjs.map → _securityGroupId-DroYG6cA.mjs.map} +1 -1
  49. package/dist/client/about-969pIiZ9.mjs +92 -0
  50. package/dist/client/{about-DLn1ShhF.mjs.map → about-969pIiZ9.mjs.map} +1 -1
  51. package/dist/client/aurora-DDzsst74.mjs +19 -0
  52. package/dist/client/{aurora-CRcxVUCo.mjs.map → aurora-DDzsst74.mjs.map} +1 -1
  53. package/dist/client/{build-BJDfnAyi.mjs → build-DracvfrJ.mjs} +5 -5
  54. package/dist/client/{build-BJDfnAyi.mjs.map → build-DracvfrJ.mjs.map} +1 -1
  55. package/dist/client/{buildFilterParams-TeyosGyK.mjs → buildFilterParams-DoZzMKX9.mjs} +1 -1
  56. package/dist/client/{buildFilterParams-TeyosGyK.mjs.map → buildFilterParams-DoZzMKX9.mjs.map} +1 -1
  57. package/dist/client/{cn-C3laVXMm.mjs → cn-DM4Cy3jv.mjs} +1 -1
  58. package/dist/client/{cn-C3laVXMm.mjs.map → cn-DM4Cy3jv.mjs.map} +1 -1
  59. package/dist/client/{constants-B-P2r5F1.mjs → constants-4lVQXort.mjs} +22 -22
  60. package/dist/client/{constants-B-P2r5F1.mjs.map → constants-4lVQXort.mjs.map} +1 -1
  61. package/dist/client/{containers-BjWqjNOx.mjs → containers-DGY2hoWw.mjs} +3 -3
  62. package/dist/client/{containers-BjWqjNOx.mjs.map → containers-DGY2hoWw.mjs.map} +1 -1
  63. package/dist/client/containers-ZMFTRaQL.mjs +3277 -0
  64. package/dist/client/containers-ZMFTRaQL.mjs.map +1 -0
  65. package/dist/client/{containers-DsRWc1L5.mjs → containers-xfsYgRyf.mjs} +2 -2
  66. package/dist/client/{containers-DsRWc1L5.mjs.map → containers-xfsYgRyf.mjs.map} +1 -1
  67. package/dist/client/{flavors-D8oElC2K.mjs → flavors-C4GtoybP.mjs} +2 -2
  68. package/dist/client/{flavors-D8oElC2K.mjs.map → flavors-C4GtoybP.mjs.map} +1 -1
  69. package/dist/client/{flavors-qvgPSI7J.mjs → flavors-CpirO_nr.mjs} +167 -148
  70. package/dist/client/flavors-CpirO_nr.mjs.map +1 -0
  71. package/dist/client/{flavors-BXPYAFyQ.mjs → flavors-DWMZ6TuJ.mjs} +2 -2
  72. package/dist/client/{flavors-BXPYAFyQ.mjs.map → flavors-DWMZ6TuJ.mjs.map} +1 -1
  73. package/dist/client/{floatingips-Fa6ocNUu.mjs → floatingips-BUf_oLRl.mjs} +74 -75
  74. package/dist/client/{floatingips-Fa6ocNUu.mjs.map → floatingips-BUf_oLRl.mjs.map} +1 -1
  75. package/dist/client/{formatBytes-tQBEnPoL.mjs → formatBytes-CZv_XyCY.mjs} +1 -1
  76. package/dist/client/{formatBytes-tQBEnPoL.mjs.map → formatBytes-CZv_XyCY.mjs.map} +1 -1
  77. package/dist/client/{helpers--JWXi40U.mjs → helpers-1PpYf-fC.mjs} +1 -1
  78. package/dist/client/{helpers--JWXi40U.mjs.map → helpers-1PpYf-fC.mjs.map} +1 -1
  79. package/dist/client/hooks-dSArr2Ca.mjs +2 -0
  80. package/dist/client/{images-tYfyOkX8.mjs → images-CsonlmFx.mjs} +3 -3
  81. package/dist/client/{images-tYfyOkX8.mjs.map → images-CsonlmFx.mjs.map} +1 -1
  82. package/dist/client/{images-CSFfefAu.mjs → images-Da1t5KPh.mjs} +507 -535
  83. package/dist/client/images-Da1t5KPh.mjs.map +1 -0
  84. package/dist/client/{images-DM9I8G0p.mjs → images-NBf2bV43.mjs} +2 -2
  85. package/dist/client/{images-DM9I8G0p.mjs.map → images-NBf2bV43.mjs.map} +1 -1
  86. package/dist/client/{images-CTLCY-yY.mjs → images-QnWf63uj.mjs} +2 -2
  87. package/dist/client/{images-CTLCY-yY.mjs.map → images-QnWf63uj.mjs.map} +1 -1
  88. package/dist/client/index.js +252 -258
  89. package/dist/client/index.js.map +1 -1
  90. package/dist/client/{md-BivyCkGC.mjs → md-sBiSNVSQ.mjs} +7 -7
  91. package/dist/client/{md-BivyCkGC.mjs.map → md-sBiSNVSQ.mjs.map} +1 -1
  92. package/dist/client/{network-rYLHyf15.mjs → network-DuZm76BZ.mjs} +2 -2
  93. package/dist/client/{network-rYLHyf15.mjs.map → network-DuZm76BZ.mjs.map} +1 -1
  94. package/dist/client/{objects-BciXwZ00.mjs → objects-B89dYCBq.mjs} +3 -3
  95. package/dist/client/{objects-BciXwZ00.mjs.map → objects-B89dYCBq.mjs.map} +1 -1
  96. package/dist/client/{objects-Cdew99tK.mjs → objects-CuFLUOe1.mjs} +2 -2
  97. package/dist/client/{objects-Cdew99tK.mjs.map → objects-CuFLUOe1.mjs.map} +1 -1
  98. package/dist/client/objects-H0NN_Sja.mjs +5460 -0
  99. package/dist/client/objects-H0NN_Sja.mjs.map +1 -0
  100. package/dist/client/{pca-oc7J0_Xd.mjs → pca-C-UFjicP.mjs} +42 -42
  101. package/dist/client/{pca-oc7J0_Xd.mjs.map → pca-C-UFjicP.mjs.map} +1 -1
  102. package/dist/client/{pca-COmKvp3J.mjs → pca-CtU6REww.mjs} +2 -2
  103. package/dist/client/{pca-COmKvp3J.mjs.map → pca-CtU6REww.mjs.map} +1 -1
  104. package/dist/client/{projects-Dl5XkXUP.mjs → projects-C-sjd9T5.mjs} +3 -3
  105. package/dist/client/{projects-Dl5XkXUP.mjs.map → projects-C-sjd9T5.mjs.map} +1 -1
  106. package/dist/client/{projects-BUabCzvw.mjs → projects-DNXsDnJM.mjs} +25 -21
  107. package/dist/client/projects-DNXsDnJM.mjs.map +1 -0
  108. package/dist/client/{projects-DI_L4oDw.mjs → projects-dhnQkuvV.mjs} +2 -2
  109. package/dist/client/{projects-DI_L4oDw.mjs.map → projects-dhnQkuvV.mjs.map} +1 -1
  110. package/dist/client/{projects-HoQ0gE5Y.mjs → projects-yiK0HGSA.mjs} +2 -2
  111. package/dist/client/{projects-HoQ0gE5Y.mjs.map → projects-yiK0HGSA.mjs.map} +1 -1
  112. package/dist/client/{securitygroups-BjkmHk2J.mjs → securitygroups-wHdrxZXd.mjs} +72 -73
  113. package/dist/client/{securitygroups-BjkmHk2J.mjs.map → securitygroups-wHdrxZXd.mjs.map} +1 -1
  114. package/dist/client/{trpcClient-BxguzNYF.mjs → trpcClient-BzPUgiM2.mjs} +1 -1
  115. package/dist/client/{trpcClient-BxguzNYF.mjs.map → trpcClient-BzPUgiM2.mjs.map} +1 -1
  116. package/dist/client/{useErrorTranslation-TZVwIAzq.mjs → useErrorTranslation-Dc0eE8Zt.mjs} +1 -1
  117. package/dist/client/{useErrorTranslation-TZVwIAzq.mjs.map → useErrorTranslation-Dc0eE8Zt.mjs.map} +1 -1
  118. package/dist/client/useListWithFiltering-DrgUwXef.mjs +157 -0
  119. package/dist/client/useListWithFiltering-DrgUwXef.mjs.map +1 -0
  120. package/dist/client/{useModal-DxxlilRm.mjs → useModal-DCs1OJh7.mjs} +1 -1
  121. package/dist/client/{useModal-DxxlilRm.mjs.map → useModal-DCs1OJh7.mjs.map} +1 -1
  122. package/dist/client/{useProjectId-OQv2KBbG.mjs → useProjectId-DBc5lpoU.mjs} +1 -1
  123. package/dist/client/{useProjectId-OQv2KBbG.mjs.map → useProjectId-DBc5lpoU.mjs.map} +1 -1
  124. package/dist/server/index.js +1281 -432
  125. package/package.json +6 -5
  126. package/dist/client/DeleteFlavorModal-BusYn32r.mjs.map +0 -1
  127. package/dist/client/ListToolbar-BojRTNbo.mjs +0 -129
  128. package/dist/client/ListToolbar-BojRTNbo.mjs.map +0 -1
  129. package/dist/client/_flavorId-BRonXvCo.mjs +0 -188
  130. package/dist/client/_flavorId-BRonXvCo.mjs.map +0 -1
  131. package/dist/client/_flavorId-BoNcxYmF.mjs.map +0 -1
  132. package/dist/client/_floatingIpId-DF_BSJN6.mjs.map +0 -1
  133. package/dist/client/_imageId-BL0I5_pv.mjs +0 -527
  134. package/dist/client/_imageId-BL0I5_pv.mjs.map +0 -1
  135. package/dist/client/_projectId-5NiasyXm.mjs +0 -26
  136. package/dist/client/_projectId-5NiasyXm.mjs.map +0 -1
  137. package/dist/client/_projectId-D35MN1kY.mjs.map +0 -1
  138. package/dist/client/about-DLn1ShhF.mjs +0 -92
  139. package/dist/client/aurora-CRcxVUCo.mjs +0 -19
  140. package/dist/client/containers-J7WFA18U.mjs +0 -3120
  141. package/dist/client/containers-J7WFA18U.mjs.map +0 -1
  142. package/dist/client/flavors-qvgPSI7J.mjs.map +0 -1
  143. package/dist/client/hooks-DEjb9d1F.mjs +0 -2
  144. package/dist/client/images-CSFfefAu.mjs.map +0 -1
  145. package/dist/client/objects-DaElrban.mjs +0 -5340
  146. package/dist/client/objects-DaElrban.mjs.map +0 -1
  147. package/dist/client/overview-BMhjFMIV.mjs +0 -15
  148. package/dist/client/overview-BMhjFMIV.mjs.map +0 -1
  149. package/dist/client/overview-BYIRj7_X.mjs +0 -15
  150. package/dist/client/overview-BYIRj7_X.mjs.map +0 -1
  151. package/dist/client/overview-DRCKNBH2.mjs +0 -15
  152. package/dist/client/overview-DRCKNBH2.mjs.map +0 -1
  153. package/dist/client/overview-urYLOVQE.mjs +0 -173
  154. package/dist/client/overview-urYLOVQE.mjs.map +0 -1
  155. package/dist/client/projects-BUabCzvw.mjs.map +0 -1
  156. package/dist/client/useListWithFiltering-CbhHJO4V.mjs +0 -32
  157. package/dist/client/useListWithFiltering-CbhHJO4V.mjs.map +0 -1
@@ -1,15 +0,0 @@
1
- import { createFileRoute as e, lazyRouteComponent as t } from "@tanstack/react-router";
2
- import { i18n as n } from "@lingui/core";
3
- var r = e("/_auth/projects/$projectId/compute/overview")({
4
- staticData: {
5
- section: "compute",
6
- service: "overview",
7
- crumb: { labelKey: "Compute" }
8
- },
9
- head: () => ({ meta: [{ title: n._({ id: "grs4+e" }) }] }),
10
- component: t(() => import("./overview-urYLOVQE.mjs"), "component")
11
- });
12
- //#endregion
13
- export { r as t };
14
-
15
- //# sourceMappingURL=overview-BMhjFMIV.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"overview-BMhjFMIV.mjs","names":["createFileRoute","t","Route","staticData","section","service","crumb","labelKey","RouteInfo","head","meta","title","component","lazyRouteComponent","$$splitComponentImporter"],"sources":["../../src/client/routes/_auth/projects/$projectId/compute/overview.tsx"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { Overview } from \"./-components/Overview\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeading } from \"@cloudoperators/juno-ui-components\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/compute/overview\")({\n staticData: { section: \"compute\", service: \"overview\", crumb: { labelKey: \"Compute\" } } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`Compute Overview` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n const { projectId } = Route.useParams()\n const { trpcClient } = Route.useRouteContext()\n return (\n <>\n <ContentHeading>{t`Compute Overview`}</ContentHeading>\n <Overview project={projectId} client={trpcClient!} />\n </>\n )\n}\n"],"mappings":";;AAOA,IAAaE,IAAQF,EAAgB,8CAAA,CAA+C;CAClFG,YAAY;EAAEC,SAAS;EAAWC,SAAS;EAAYC,OAAO,EAAEC,UAAU,WAAU;EAAE;CACtFE,aAAa,EAAEC,MAAM,CAAC,EAAEC,OAAOV,EAAAA,EAAC,EAAA,IAAA,UAAA,CAAA,EAAmB,CAAC,EAAE;CACtDW,WAASC,2CAAA,YAAA;CACX,CAAA"}
@@ -1,15 +0,0 @@
1
- import { j as e } from "./build-BJDfnAyi.mjs";
2
- import { Fragment as t, jsx as n, jsxs as r } from "react/jsx-runtime";
3
- import { Trans as i, useLingui as a } from "@lingui/react";
4
- //#region src/client/routes/_auth/projects/$projectId/services/overview.tsx?tsr-split=component
5
- function o() {
6
- let { i18n: o, _: s } = a();
7
- return /* @__PURE__ */ r(t, { children: [/* @__PURE__ */ n(e, { children: o._({ id: "rvT6l1" }) }), /* @__PURE__ */ n("div", {
8
- className: "p-4 text-center",
9
- children: /* @__PURE__ */ n(i, { id: "rvT6l1" })
10
- })] });
11
- }
12
- //#endregion
13
- export { o as component };
14
-
15
- //# sourceMappingURL=overview-BYIRj7_X.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"overview-BYIRj7_X.mjs","names":["useLingui","Trans","ContentHeading","RouteComponent","t","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/services/overview.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui, Trans } from \"@lingui/react/macro\"\nimport { ContentHeading } from \"@cloudoperators/juno-ui-components\"\nimport { RouteInfo } from \"@/client/routes/routeInfo\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/services/overview\")({\n staticData: { section: \"services\", service: \"overview\", crumb: { labelKey: \"Services\" } } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`Services Overview` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n return (\n <>\n <ContentHeading>{t`Services Overview`}</ContentHeading>\n <div className=\"p-4 text-center\">\n <Trans>Services Overview</Trans>\n </div>\n </>\n )\n}\n"],"mappings":";;;;AAYA,SAASG,IAAAA;CACP,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQH,GAAAA;AACd,QACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAA,EAAA,UAAgBI,EAAAA,EAAC,EAAA,IAAA,UAAA,CAAA,EAAA,CAAA,EAClB,kBAAC,OAAA;EAAI,WAAU;YACb,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA"}
@@ -1,15 +0,0 @@
1
- import { j as e } from "./build-BJDfnAyi.mjs";
2
- import { Fragment as t, jsx as n, jsxs as r } from "react/jsx-runtime";
3
- import { Trans as i, useLingui as a } from "@lingui/react";
4
- //#region src/client/routes/_auth/projects/$projectId/network/overview.tsx?tsr-split=component
5
- function o() {
6
- let { i18n: o, _: s } = a();
7
- return /* @__PURE__ */ r(t, { children: [/* @__PURE__ */ n(e, { children: o._({ id: "vcXmqy" }) }), /* @__PURE__ */ n("div", {
8
- className: "p-4 text-center",
9
- children: /* @__PURE__ */ n(i, { id: "vcXmqy" })
10
- })] });
11
- }
12
- //#endregion
13
- export { o as component };
14
-
15
- //# sourceMappingURL=overview-DRCKNBH2.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"overview-DRCKNBH2.mjs","names":["useLingui","Trans","ContentHeading","RouteComponent","t","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/network/overview.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui, Trans } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeading } from \"@cloudoperators/juno-ui-components\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/network/overview\")({\n staticData: { section: \"network\", service: \"overview\", crumb: { labelKey: \"Network\" } } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`Network Overview` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n return (\n <>\n <ContentHeading>{t`Network Overview`}</ContentHeading>\n <div className=\"p-4 text-center\">\n <Trans>Network Overview</Trans>\n </div>\n </>\n )\n}\n"],"mappings":";;;;AAYA,SAASG,IAAAA;CACP,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQH,GAAAA;AACd,QACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAA,EAAA,UAAgBI,EAAAA,EAAC,EAAA,IAAA,UAAA,CAAA,EAAA,CAAA,EAClB,kBAAC,OAAA;EAAI,WAAU;YACb,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA"}
@@ -1,173 +0,0 @@
1
- import { j as e, nt as t } from "./build-BJDfnAyi.mjs";
2
- import { t as n } from "./overview-BMhjFMIV.mjs";
3
- import { Fragment as r, jsx as i, jsxs as a } from "react/jsx-runtime";
4
- import { Suspense as o, use as s } from "react";
5
- import { Trans as c, useLingui as l } from "@lingui/react";
6
- //#region src/client/routes/_auth/projects/$projectId/compute/-components/ActivitySummary.tsx
7
- var u = ({ progress: e, color: t, size: n = 100, strokeWidth: r = 8, label: o, value: s }) => {
8
- let c = n / 2, l = c - r / 2, u = l * 2 * Math.PI, d = u - e / 100 * u;
9
- return /* @__PURE__ */ a("div", {
10
- className: "flex flex-col items-center justify-center",
11
- children: [/* @__PURE__ */ a("div", {
12
- style: {
13
- position: "relative",
14
- width: n,
15
- height: n
16
- },
17
- children: [/* @__PURE__ */ a("svg", {
18
- height: n,
19
- width: n,
20
- style: { transform: "rotate(-90deg)" },
21
- children: [/* @__PURE__ */ i("circle", {
22
- stroke: `${t}33`,
23
- fill: "transparent",
24
- strokeWidth: r,
25
- r: l,
26
- cx: c,
27
- cy: c
28
- }), /* @__PURE__ */ i("circle", {
29
- stroke: t,
30
- fill: "transparent",
31
- strokeWidth: r,
32
- strokeDasharray: u + " " + u,
33
- style: { strokeDashoffset: d },
34
- r: l,
35
- cx: c,
36
- cy: c,
37
- strokeLinecap: "round"
38
- })]
39
- }), /* @__PURE__ */ i("div", {
40
- style: {
41
- position: "absolute",
42
- top: "50%",
43
- left: "50%",
44
- transform: "translate(-50%, -50%)",
45
- textAlign: "center"
46
- },
47
- children: /* @__PURE__ */ i("div", {
48
- className: "text-xl font-bold text-gray-200",
49
- children: s
50
- })
51
- })]
52
- }), /* @__PURE__ */ i("div", {
53
- className: "mt-2 text-sm text-gray-300",
54
- children: o
55
- })]
56
- });
57
- };
58
- function d({ activityData: n }) {
59
- return /* @__PURE__ */ a(t, {
60
- distribution: "center",
61
- alignment: "center",
62
- direction: "vertical",
63
- children: [/* @__PURE__ */ i(e, {
64
- className: "my-6 text-xl font-semibold",
65
- children: "Activity Summary"
66
- }), /* @__PURE__ */ a("div", {
67
- className: "flex flex-wrap justify-start gap-16",
68
- children: [
69
- /* @__PURE__ */ i(u, {
70
- progress: n.instances.current / n.instances.quota * 100,
71
- color: n.instances.color,
72
- label: "Instances",
73
- value: `${n.instances.current}/${n.instances.total}`,
74
- size: 120
75
- }),
76
- /* @__PURE__ */ i(u, {
77
- progress: n.cpu.percentage,
78
- color: n.cpu.color,
79
- label: "CPU",
80
- value: `${n.cpu.percentage}%`,
81
- size: 120
82
- }),
83
- /* @__PURE__ */ i(u, {
84
- progress: n.memory.percentage,
85
- color: n.memory.color,
86
- label: "Memory",
87
- value: `${n.memory.percentage}%`,
88
- size: 120
89
- }),
90
- /* @__PURE__ */ i(u, {
91
- progress: n.storage.percentage,
92
- color: n.storage.color,
93
- label: "Storage",
94
- value: `${n.storage.percentage}%`,
95
- size: 120
96
- })
97
- ]
98
- })]
99
- });
100
- }
101
- //#endregion
102
- //#region src/client/routes/_auth/projects/$projectId/compute/-components/Overview.tsx
103
- var f = ({ getDataPromise: e }) => {
104
- let [t, n] = s(e), r = n.images;
105
- if (!t && !r) return /* @__PURE__ */ i("div", {
106
- className: "p-4 text-center",
107
- children: "No data found"
108
- });
109
- let a = t?.filter((e) => e.status === "ACTIVE")?.length || 0, o = t?.length || 0, c = Math.max(10, Math.ceil(o * 1.5)), l = 0, u = 0, f = 0;
110
- t?.forEach((e) => {
111
- if (e.flavor && e.flavor.vcpus) l += e.flavor.vcpus;
112
- else {
113
- let t = e.name?.includes("small") || e.name?.includes("micro");
114
- l += t ? 1 : 2;
115
- }
116
- e.flavor && e.flavor.ram ? u += e.flavor.ram : u += 1024, e.flavor && e.flavor.disk ? f += e.flavor.disk : f += 20;
117
- });
118
- let p = r?.filter((e) => e.status === "active")?.length || 0, m = r?.length || 0, h = Math.min(100, Math.round(l / 32 * 100)), g = Math.min(100, Math.round(u / 131072 * 100)), _ = Math.min(100, Math.round(f / 1024 * 100));
119
- return /* @__PURE__ */ i("div", {
120
- className: "h-full",
121
- children: /* @__PURE__ */ i(d, { activityData: {
122
- instances: {
123
- current: a,
124
- total: o,
125
- quota: c,
126
- color: "#FF5733"
127
- },
128
- cpu: {
129
- percentage: h,
130
- cores: l,
131
- color: "#33A1FD"
132
- },
133
- memory: {
134
- percentage: g,
135
- usedMB: u,
136
- color: "#9B59B6"
137
- },
138
- storage: {
139
- percentage: _,
140
- sizeGB: f,
141
- color: "#4CAF50"
142
- },
143
- images: {
144
- active: p,
145
- total: m,
146
- color: "#F1C40F"
147
- }
148
- } })
149
- });
150
- };
151
- function p({ client: e, project: t }) {
152
- let n = Promise.all([e.compute.getServersByProjectId.query({ project_id: t }), e.compute.listImagesWithSearch.query({ project_id: t })]);
153
- return /* @__PURE__ */ i(o, {
154
- fallback: /* @__PURE__ */ i("div", {
155
- className: "p-4 text-center",
156
- children: /* @__PURE__ */ i(c, { id: "Z3FXyt" })
157
- }),
158
- children: /* @__PURE__ */ i(f, { getDataPromise: n })
159
- });
160
- }
161
- //#endregion
162
- //#region src/client/routes/_auth/projects/$projectId/compute/overview.tsx?tsr-split=component
163
- function m() {
164
- let { i18n: t, _: o } = l(), { projectId: s } = n.useParams(), { trpcClient: c } = n.useRouteContext();
165
- return /* @__PURE__ */ a(r, { children: [/* @__PURE__ */ i(e, { children: t._({ id: "grs4+e" }) }), /* @__PURE__ */ i(p, {
166
- project: s,
167
- client: c
168
- })] });
169
- }
170
- //#endregion
171
- export { m as component };
172
-
173
- //# sourceMappingURL=overview-urYLOVQE.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"overview-urYLOVQE.mjs","names":["ContentHeading","Stack","React","ActivityRing","progress","color","size","strokeWidth","label","value","radius","normalizedRadius","circumference","Math","PI","strokeDashoffset","div","className","style","position","width","height","svg","transform","circle","stroke","fill","r","cx","cy","strokeDasharray","strokeLinecap","top","left","textAlign","ActivitySummary","activityData","distribution","alignment","direction","instances","current","quota","total","cpu","percentage","memory","storage","ActivitySummary","Suspense","use","OverviewContainer","getDataPromise","servers","imagesResponse","images","div","className","activeServers","filter","server","status","length","totalServers","estimatedServerQuota","Math","max","ceil","totalCores","usedMemoryMB","totalDiskGB","forEach","flavor","vcpus","smallestSize","name","includes","ram","disk","activeImages","image","totalImages","cpuPercentage","min","round","memoryPercentage","storagePercentage","activityData","instances","current","total","quota","color","cpu","percentage","cores","memory","usedMB","storage","sizeGB","active","Overview","client","project","Promise","all","compute","getServersByProjectId","query","project_id","listImagesWithSearch","fallback","useLingui","Overview","ContentHeading","Route","RouteComponent","t","projectId","useParams","trpcClient","useRouteContext","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/compute/-components/ActivitySummary.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-components/Overview.tsx","../../src/client/routes/_auth/projects/$projectId/compute/overview.tsx?tsr-split=component"],"sourcesContent":["import { ContentHeading, Stack } from \"@cloudoperators/juno-ui-components/index\"\nimport React from \"react\"\n\ninterface ActivityRingProps {\n progress: number // Progress percentage (0-100)\n color: string // Color of the ring\n size?: number // Size of the ring (default: 100)\n strokeWidth?: number // Width of the stroke (default: 8)\n label: string // Label for the ring\n value: string // Value to display inside the ring\n}\n// Activity ring component inspired by Apple's activity rings\nconst ActivityRing = ({ progress, color, size = 100, strokeWidth = 8, label, value }: ActivityRingProps) => {\n const radius = size / 2\n const normalizedRadius = radius - strokeWidth / 2\n const circumference = normalizedRadius * 2 * Math.PI\n const strokeDashoffset = circumference - (progress / 100) * circumference\n\n return (\n <div className=\"flex flex-col items-center justify-center\">\n <div style={{ position: \"relative\", width: size, height: size }}>\n <svg height={size} width={size} style={{ transform: \"rotate(-90deg)\" }}>\n {/* Background circle */}\n <circle\n stroke={`${color}33`}\n fill=\"transparent\"\n strokeWidth={strokeWidth}\n r={normalizedRadius}\n cx={radius}\n cy={radius}\n />\n {/* Progress circle */}\n <circle\n stroke={color}\n fill=\"transparent\"\n strokeWidth={strokeWidth}\n strokeDasharray={circumference + \" \" + circumference}\n style={{ strokeDashoffset }}\n r={normalizedRadius}\n cx={radius}\n cy={radius}\n strokeLinecap=\"round\"\n />\n </svg>\n <div\n style={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n textAlign: \"center\",\n }}\n >\n <div className=\"text-xl font-bold text-gray-200\">{value}</div>\n </div>\n </div>\n <div className=\"mt-2 text-sm text-gray-300\">{label}</div>\n </div>\n )\n}\n\n// Interface for activity data props\ninterface ActivityData {\n instances: {\n current: number\n total: number\n quota: number\n color: string\n }\n cpu: {\n percentage: number\n cores: number\n color: string\n }\n memory: {\n percentage: number\n usedMB: number\n color: string\n }\n storage: {\n percentage: number\n sizeGB: number\n color: string\n }\n images: {\n active: number\n total: number\n color: string\n }\n}\n\nexport function ActivitySummary({ activityData }: { activityData: ActivityData }) {\n return (\n <Stack distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <ContentHeading className=\"my-6 text-xl font-semibold\">Activity Summary</ContentHeading>\n <div className=\"flex flex-wrap justify-start gap-16\">\n <ActivityRing\n progress={(activityData.instances.current / activityData.instances.quota) * 100}\n color={activityData.instances.color}\n label=\"Instances\"\n value={`${activityData.instances.current}/${activityData.instances.total}`}\n size={120}\n />\n <ActivityRing\n progress={activityData.cpu.percentage}\n color={activityData.cpu.color}\n label=\"CPU\"\n value={`${activityData.cpu.percentage}%`}\n size={120}\n />\n <ActivityRing\n progress={activityData.memory.percentage}\n color={activityData.memory.color}\n label=\"Memory\"\n value={`${activityData.memory.percentage}%`}\n size={120}\n />\n <ActivityRing\n progress={activityData.storage.percentage}\n color={activityData.storage.color}\n label=\"Storage\"\n value={`${activityData.storage.percentage}%`}\n size={120}\n />\n </div>\n </Stack>\n )\n}\n","import { ActivitySummary } from \"./ActivitySummary\"\nimport { Suspense, use } from \"react\"\nimport { Server } from \"@/server/Compute/types/server\"\nimport { ImagesPaginatedResponse } from \"@/server/Compute/types/image\"\nimport { TrpcClient } from \"@/client/trpcClient\"\nimport { Trans } from \"@lingui/react/macro\"\n\ninterface OverviewContainerProps {\n getDataPromise: Promise<[Server[] | undefined, ImagesPaginatedResponse]>\n}\nconst OverviewContainer = ({ getDataPromise }: OverviewContainerProps) => {\n const [servers, imagesResponse] = use(getDataPromise)\n const images = imagesResponse.images\n if (!servers && !images) return <div className=\"p-4 text-center\">No data found</div>\n\n // Calculate server statistics\n const activeServers = servers?.filter((server) => server.status === \"ACTIVE\")?.length || 0\n const totalServers = servers?.length || 0\n const estimatedServerQuota = Math.max(10, Math.ceil(totalServers * 1.5))\n\n // Calculate resource usage based on server flavors\n let totalCores = 0\n let usedMemoryMB = 0\n let totalDiskGB = 0\n\n // Process server data to extract resource usage\n servers?.forEach((server) => {\n // Extract core count from flavor if available\n if (server.flavor && server.flavor.vcpus) {\n totalCores += server.flavor.vcpus\n } else {\n // Fallback estimate based on server name or other heuristics\n const smallestSize = server.name?.includes(\"small\") || server.name?.includes(\"micro\")\n totalCores += smallestSize ? 1 : 2\n }\n\n // Extract memory usage from flavor if available\n if (server.flavor && server.flavor.ram) {\n usedMemoryMB += server.flavor.ram\n } else {\n // Fallback estimate\n usedMemoryMB += 1024 // Assume 1GB per instance as fallback\n }\n\n // Extract disk usage from flavor if available\n if (server.flavor && server.flavor.disk) {\n totalDiskGB += server.flavor.disk\n } else {\n // Fallback estimate\n totalDiskGB += 20 // Assume 20GB per instance as fallback\n }\n })\n\n // Calculate image statistics\n const activeImages = images?.filter((image) => image.status === \"active\")?.length || 0\n const totalImages = images?.length || 0\n\n // Calculate resource percentage utilizations\n const cpuPercentage = Math.min(100, Math.round((totalCores / 32) * 100))\n const memoryPercentage = Math.min(100, Math.round((usedMemoryMB / 131072) * 100))\n const storagePercentage = Math.min(100, Math.round((totalDiskGB / 1024) * 100))\n\n // Prepare data to pass to ActivitySummary\n const activityData = {\n instances: {\n current: activeServers,\n total: totalServers,\n quota: estimatedServerQuota,\n color: \"#FF5733\",\n },\n cpu: {\n percentage: cpuPercentage,\n cores: totalCores,\n color: \"#33A1FD\",\n },\n memory: {\n percentage: memoryPercentage,\n usedMB: usedMemoryMB,\n color: \"#9B59B6\", // Purple color for memory\n },\n storage: {\n percentage: storagePercentage,\n sizeGB: totalDiskGB,\n color: \"#4CAF50\",\n },\n images: {\n active: activeImages,\n total: totalImages,\n color: \"#F1C40F\", // Yellow color for images if you want to use it\n },\n }\n\n return (\n <div className=\"h-full\">\n <ActivitySummary activityData={activityData} />\n </div>\n )\n}\n\ninterface OverviewProps {\n client: TrpcClient\n project: string\n}\n\nexport function Overview({ client, project }: OverviewProps) {\n const getDataPromise = Promise.all([\n client.compute.getServersByProjectId.query({ project_id: project }),\n client.compute.listImagesWithSearch.query({ project_id: project }),\n ])\n\n return (\n <Suspense\n fallback={\n <div className=\"p-4 text-center\">\n <Trans>Loading...</Trans>\n </div>\n }\n >\n <OverviewContainer getDataPromise={getDataPromise} />\n </Suspense>\n )\n}\n","import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { Overview } from \"./-components/Overview\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeading } from \"@cloudoperators/juno-ui-components\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/compute/overview\")({\n staticData: { section: \"compute\", service: \"overview\", crumb: { labelKey: \"Compute\" } } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`Compute Overview` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n const { projectId } = Route.useParams()\n const { trpcClient } = Route.useRouteContext()\n return (\n <>\n <ContentHeading>{t`Compute Overview`}</ContentHeading>\n <Overview project={projectId} client={trpcClient!} />\n </>\n )\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"projects-BUabCzvw.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","span","domain_name","domain_id","h5","name","description","p","ProjectCardView","projects","length","map","ProjectsOverviewNavBar","ProjectCardView","Container","ContentHeading","Trans","Route","ProjectsOverview","projects","useLoaderData","search","useSearch","navigate","useNavigate","handleSearch","value","replace","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 <span className=\"text-theme-light text-xs leading-6\">\n {project.domain_name ?? project.domain_id ?? <Trans>Unknown domain</Trans>}\n </span>\n <h5>{project.name}</h5>\n </div>\n {project.description && <p className=\"text-theme-default line-clamp-2\">{project.description}</p>}\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 { 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\"\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\n const handleSearch = (value: string) => {\n navigate({ search: { search: value }, replace: true })\n }\n\n return (\n <Container>\n <ContentHeading>\n <Trans>Projects</Trans>\n </ContentHeading>\n <ProjectsOverviewNavBar searchTerm={search} onSearch={handleSearch} />\n <div className=\"pt-5\">\n <ProjectCardView projects={projects} />\n </div>\n </Container>\n )\n}\n"],"mappings":";;;;;;;AASA,SAAgBI,EAAuB,EAAEC,aAAUC,gBAAa,MAAiC;CAC/F,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,GAAAA,EACRC,IAAWP,EAA6C,KAAA,EACxDQ,IAAkBR,EAAO,GAAA,EACzB,CAACS,GAAYC,KAAiBT,EAASI,EAAAA;AAiC7C,QA/BAN,QAAU;AACR,EAAI,CAACS,EAAgBG,WAAW,CAACJ,EAASI,WAAWN,MAAeI,KAClEC,EAAcL,EAAAA;IAEf,CAACA,EAAW,CAAA,EAEfN,cACS;AACL,EAAIQ,EAASI,WAASC,aAAaL,EAASI,QAAO;IAEpD,EAAE,CAAA,EAsBH,kBAACT,GAAAA;EACCiB,WAAU;EACVC,MAAK;EACLC,aAAaC,EAAAA,EAAC,EAAA,IAAA,UAAU,CAAA;EACxBC,WAxBwBT,MAAAA;GAC1B,IAAMC,IAAQD,EAAEE,OAAOD;AAGvBR,GAFAG,EAAcK,EAAAA,EACVR,EAASI,WAASC,aAAaL,EAASI,QAAO,EACnDJ,EAASI,UAAUM,iBAAW;AAE5Bb,IADAG,EAASI,UAAU,MACnBP,EAASW,EAAAA;MACR,IAAA;;EAkBDS,eAAS;AACPhB,KAAgBG,UAAU;;EAE5Bc,cAAQ;AACNjB,KAAgBG,UAAU;;EAE5Be,eArBgB;AAMlBtB,GALA,AAEEG,EAASI,aADTC,aAAaL,EAASI,QAAO,EACV,OAErBD,EAAc,GAAA,EACdN,EAAS,GAAA;;EAgBPW,OAAON;;;;;AC/Cb,SAAgBoB,EAAY,EAAEC,cAA2B;CACvD,IAAMC,IAAWJ,GAAAA;AACjB,QACE,kBAACC,GAAAA;EACCI,SAAO;EACPC,eAAeF,EAAS;GAAEG,IAAI;GAAwBC,QAAQ,EAAEC,WAAWN,EAAQO,IAAG;GAAE,CAAA;EACxFC,WAAU;aAEV,kBAACC,OAAAA;GAAID,WAAU;cACb,kBAACE,QAAAA;IAAKF,WAAU;cACbR,EAAQW,eAAeX,EAAQY,aAAa,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;OAE/C,kBAACC,MAAAA,EAAAA,UAAIb,EAAQc,MAAAA,CAAAA,CAAAA;MAEdd,EAAQe,eAAe,kBAACC,KAAAA;GAAER,WAAU;aAAmCR,EAAQe;;;;AAKtF,SAAgBE,EAAgB,EAAEC,eAAgC;AAChE,QACE,kBAACT,OAAAA;EAAID,WAAU;YACb,kBAACC,OAAAA;GAAID,WAAU;aACZU,GAAUC,SACTD,EAASE,KAAKpB,MAAY,kBAACD,GAAAA,EAAsCC,YAAAA,EAArBA,EAAQO,GAAE,CAAA,GAEtD,kBAACS,KAAAA;IAAER,WAAU;cACX,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA;;;;;;;ACGZ,SAASmB,IAAAA;CACP,IAAM,EAAEC,gBAAaF,EAAMG,eAAa,EAClC,EAAEC,YAAS,OAAOJ,EAAMK,WAAS,EACjCC,IAAWN,EAAMO,aAAW;AAMlC,QACE,kBAAC,GAAA,EAAA,UAAA;EACC,kBAAC,GAAA,EAAA,UACC,kBAAA,GAAA,EAAA,IAAA,UAAA,CAAA,EAAA,CAAA;EAEF,kBAAC,GAAA;GAAuB,YAAYH;GAAQ,WAT1BK,MAAAA;AACpBH,MAAS;KAAEF,QAAQ,EAAEA,QAAQK,GAAM;KAAGC,SAAS;KAAK,CAAA;;;EASlD,kBAAC,OAAA;GAAI,WAAU;aACb,kBAAC,GAAA,EAA0BR,aAAAA,CAAAA"}
@@ -1,32 +0,0 @@
1
- import { startTransition as e, useState as t } from "react";
2
- //#region src/client/utils/useListWithFiltering.ts
3
- function n({ defaultSortKey: n, defaultSortDir: r, sortOptions: i, filterSettings: a }) {
4
- let [o, s] = t(""), c = (t) => {
5
- let n = typeof t == "string" ? t : "";
6
- e(() => s(n));
7
- }, [l, u] = t({
8
- options: i,
9
- sortBy: n,
10
- sortDirection: r
11
- }), d = (e) => {
12
- u({
13
- options: e.options ?? l.options,
14
- sortBy: e.sortBy?.toString() || n,
15
- sortDirection: e.sortDirection || r
16
- });
17
- }, [f, p] = t(a);
18
- return {
19
- searchTerm: o,
20
- sortSettings: l,
21
- filterSettings: f,
22
- handleSearchChange: c,
23
- handleSortChange: d,
24
- handleFilterChange: (t) => {
25
- e(() => p(t));
26
- }
27
- };
28
- }
29
- //#endregion
30
- export { n as t };
31
-
32
- //# sourceMappingURL=useListWithFiltering-CbhHJO4V.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useListWithFiltering-CbhHJO4V.mjs","names":["startTransition","useState","useListWithFiltering","defaultSortKey","defaultSortDir","sortOptions","filterSettings","initialFilterSettings","searchTerm","setSearchTerm","handleSearchChange","term","searchValue","sortSettings","setSortSettings","options","sortBy","sortDirection","handleSortChange","newSortSettings","settings","toString","setFilterSettings","handleFilterChange","newFilterSettings"],"sources":["../../src/client/utils/useListWithFiltering.ts"],"sourcesContent":["import { startTransition, useState } from \"react\"\nimport { FilterSettings, SortOption, SortSettings } from \"@/client/components/ListToolbar/types\"\n\n/**\n * Sort direction enumeration\n * Used across all sort-enabled list views\n */\nexport type SortDirection = \"asc\" | \"desc\"\n\n/**\n * Generic required sort settings with guaranteed non-optional properties\n * Used by components to maintain a fully-defined sort state\n *\n * Type parameter K is the sort key type (string literal union of allowed sort fields)\n *\n * @example\n * // For floating IPs\n * type FloatingIpListSortSettings = ListSortConfig<FloatingIpsSortKey>\n *\n * // For security groups\n * type SecurityGroupListSortSettings = ListSortConfig<\"name\" | \"project_id\">\n */\nexport type ListSortConfig<T extends string = string> = {\n /**\n * Array of available sort options to display in the UI\n */\n options: SortOption[]\n /**\n * The currently selected sort field (guaranteed to be one of the available options)\n */\n sortBy: T\n /**\n * The currently active sort direction (guaranteed to be either \"asc\" or \"desc\")\n */\n sortDirection: SortDirection\n}\n\n/**\n * Configuration options for the useListWithFiltering hook\n */\nexport interface UseListWithFilteringOptions<T extends string> {\n /** Default sort key to use on initial render */\n defaultSortKey: T\n /** Default sort direction to use on initial render */\n defaultSortDir: SortDirection\n /** Available sort options to display in the sort dropdown */\n sortOptions: Array<{ label: string; value: string }>\n /** Initial filter settings configuration */\n filterSettings: FilterSettings\n}\n\n/**\n * Return value from the useListWithFiltering hook\n */\nexport interface UseListWithFilteringReturn<T extends string> {\n // State\n searchTerm: string\n sortSettings: ListSortConfig<T>\n filterSettings: FilterSettings\n\n // Handlers\n handleSearchChange: (term: string | number | string[] | undefined) => void\n handleSortChange: (newSortSettings: SortSettings) => void\n handleFilterChange: (newFilterSettings: FilterSettings) => void\n}\n\n/**\n * Custom hook to manage common list view state: search, sort, and filter\n *\n * Extracts shared logic from list components to ensure consistent behavior\n * across all list pages and reduce code duplication.\n *\n * @example\n * ```tsx\n * const listState = useListWithFiltering({\n * defaultSortKey: \"name\",\n * defaultSortDir: \"asc\",\n * sortOptions: [\n * { label: t`Name`, value: \"name\" },\n * { label: t`Created`, value: \"created_at\" },\n * ],\n * filterSettings: {\n * filters: [\n * { displayName: t`Status`, filterName: \"status\", values: [\"active\", \"inactive\"] }\n * ]\n * }\n * })\n * ```\n */\nexport function useListWithFiltering<T extends string>({\n defaultSortKey,\n defaultSortDir,\n sortOptions,\n filterSettings: initialFilterSettings,\n}: UseListWithFilteringOptions<T>): UseListWithFilteringReturn<T> {\n // Search\n const [searchTerm, setSearchTerm] = useState(\"\")\n const handleSearchChange = (term: string | number | string[] | undefined) => {\n const searchValue = typeof term === \"string\" ? term : \"\"\n startTransition(() => setSearchTerm(searchValue))\n }\n\n // Sort\n const [sortSettings, setSortSettings] = useState<ListSortConfig<T>>({\n options: sortOptions,\n sortBy: defaultSortKey,\n sortDirection: defaultSortDir,\n })\n const handleSortChange = (newSortSettings: SortSettings) => {\n const settings: ListSortConfig<T> = {\n options: newSortSettings.options ?? sortSettings.options,\n sortBy: (newSortSettings.sortBy?.toString() as T) || defaultSortKey,\n sortDirection: (newSortSettings.sortDirection as SortDirection) || defaultSortDir,\n }\n setSortSettings(settings)\n }\n\n // Filter\n const [filterSettings, setFilterSettings] = useState<FilterSettings>(initialFilterSettings)\n const handleFilterChange = (newFilterSettings: FilterSettings) => {\n startTransition(() => setFilterSettings(newFilterSettings))\n }\n\n return {\n searchTerm,\n sortSettings,\n filterSettings,\n handleSearchChange,\n handleSortChange,\n handleFilterChange,\n }\n}\n"],"mappings":";;AAyFA,SAAgBE,EAAuC,EACrDC,mBACAC,mBACAC,gBACAC,gBAAgBC,KACe;CAE/B,IAAM,CAACC,GAAYC,KAAiBR,EAAS,GAAA,EACvCS,KAAsBC,MAAAA;EAC1B,IAAMC,IAAc,OAAOD,KAAS,WAAWA,IAAO;AACtDX,UAAsBS,EAAcG,EAAAA,CAAAA;IAIhC,CAACC,GAAcC,KAAmBb,EAA4B;EAClEc,SAASV;EACTW,QAAQb;EACRc,eAAeb;EACjB,CAAA,EACMc,KAAoBC,MAAAA;AAMxBL,IALoC;GAClCC,SAASI,EAAgBJ,WAAWF,EAAaE;GACjDC,QAAQ,EAAiBA,QAAQK,UAAAA,IAAoBlB;GACrDc,eAAe,EAAiBA,iBAAmCb;GACrE,CACgBgB;IAIZ,CAACd,GAAgBgB,KAAqBrB,EAAyBM,EAAAA;AAKrE,QAAO;EACLC;EACAK;EACAP;EACAI;EACAQ;EACAK,qBAV0BC,MAAAA;AAC1BxB,WAAsBsB,EAAkBE,EAAAA,CAAAA;;EAU1C"}