@cobaltcore-dev/aurora 2.1.1 → 2.2.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 (173) hide show
  1. package/README.md +31 -25
  2. package/dist/client/AuroraApp.d.ts +9 -2
  3. package/dist/client/context/AppConfigContext.d.ts +44 -0
  4. package/dist/client/index.d.ts +2 -0
  5. package/dist/client/index.js +41221 -845
  6. package/dist/client/index.js.map +1 -1
  7. package/dist/client/trpcClient.d.ts +314 -0
  8. package/dist/client/utils/appConfigGating.d.ts +21 -0
  9. package/dist/server/index.d.ts +694 -3
  10. package/dist/server/index.js +1748 -722
  11. package/package.json +3 -3
  12. package/dist/client/AuthProvider-CVSAwW9f.mjs +0 -83
  13. package/dist/client/AuthProvider-CVSAwW9f.mjs.map +0 -1
  14. package/dist/client/ContentHeader-fKKZVu-o.mjs +0 -116
  15. package/dist/client/ContentHeader-fKKZVu-o.mjs.map +0 -1
  16. package/dist/client/DeleteFlavorModal-C4nAi7gY.mjs +0 -724
  17. package/dist/client/DeleteFlavorModal-C4nAi7gY.mjs.map +0 -1
  18. package/dist/client/DynamicBreadcrumbContext-CVcUQFou.mjs +0 -26
  19. package/dist/client/DynamicBreadcrumbContext-CVcUQFou.mjs.map +0 -1
  20. package/dist/client/FiltersInput-Becwxo_J.mjs +0 -85
  21. package/dist/client/FiltersInput-Becwxo_J.mjs.map +0 -1
  22. package/dist/client/FloatingIpActionModals-Cq10WljB.mjs +0 -466
  23. package/dist/client/FloatingIpActionModals-Cq10WljB.mjs.map +0 -1
  24. package/dist/client/RouteIdLevelDefaultError-DPF_x2tG.mjs +0 -26
  25. package/dist/client/RouteIdLevelDefaultError-DPF_x2tG.mjs.map +0 -1
  26. package/dist/client/Slot-CWb612-_.mjs +0 -28
  27. package/dist/client/Slot-CWb612-_.mjs.map +0 -1
  28. package/dist/client/SortInput-4g7nSTHW.mjs +0 -34
  29. package/dist/client/SortInput-4g7nSTHW.mjs.map +0 -1
  30. package/dist/client/StorageNotFound-B-zVinVD.mjs +0 -30
  31. package/dist/client/StorageNotFound-B-zVinVD.mjs.map +0 -1
  32. package/dist/client/TwoColumnDescriptionList-DKS42RKa.mjs +0 -28
  33. package/dist/client/TwoColumnDescriptionList-DKS42RKa.mjs.map +0 -1
  34. package/dist/client/_-CAsCx-Ay.mjs +0 -6
  35. package/dist/client/_-CAsCx-Ay.mjs.map +0 -1
  36. package/dist/client/_auth-SrDjHL6j.mjs +0 -12
  37. package/dist/client/_auth-SrDjHL6j.mjs.map +0 -1
  38. package/dist/client/_flavorId-BPvssEzn.mjs +0 -277
  39. package/dist/client/_flavorId-BPvssEzn.mjs.map +0 -1
  40. package/dist/client/_flavorId-CFUBcU-l.mjs +0 -27
  41. package/dist/client/_flavorId-CFUBcU-l.mjs.map +0 -1
  42. package/dist/client/_flavorId-CZcIp0Ih.mjs +0 -22
  43. package/dist/client/_flavorId-CZcIp0Ih.mjs.map +0 -1
  44. package/dist/client/_floatingIpId-B8r64AL9.mjs +0 -196
  45. package/dist/client/_floatingIpId-B8r64AL9.mjs.map +0 -1
  46. package/dist/client/_floatingIpId-lEobpOER.mjs +0 -26
  47. package/dist/client/_floatingIpId-lEobpOER.mjs.map +0 -1
  48. package/dist/client/_imageId-BAezmV0Y.mjs +0 -526
  49. package/dist/client/_imageId-BAezmV0Y.mjs.map +0 -1
  50. package/dist/client/_imageId-D-jqz3e3.mjs +0 -40
  51. package/dist/client/_imageId-D-jqz3e3.mjs.map +0 -1
  52. package/dist/client/_imageId-gMdrdnVt.mjs +0 -22
  53. package/dist/client/_imageId-gMdrdnVt.mjs.map +0 -1
  54. package/dist/client/_projectId-BYccdAtX.mjs +0 -77
  55. package/dist/client/_projectId-BYccdAtX.mjs.map +0 -1
  56. package/dist/client/_projectId-CBjZC1tv.mjs +0 -283
  57. package/dist/client/_projectId-CBjZC1tv.mjs.map +0 -1
  58. package/dist/client/_projectId-CLEa1zgw.mjs +0 -30
  59. package/dist/client/_projectId-CLEa1zgw.mjs.map +0 -1
  60. package/dist/client/_projectId-D3VOH5lN.mjs +0 -94
  61. package/dist/client/_projectId-D3VOH5lN.mjs.map +0 -1
  62. package/dist/client/_securityGroupId-BwgZnoiR.mjs +0 -29
  63. package/dist/client/_securityGroupId-BwgZnoiR.mjs.map +0 -1
  64. package/dist/client/_securityGroupId-Cz2NUHdB.mjs +0 -1819
  65. package/dist/client/_securityGroupId-Cz2NUHdB.mjs.map +0 -1
  66. package/dist/client/_serviceType-DS8DxsrP.mjs +0 -20
  67. package/dist/client/_serviceType-DS8DxsrP.mjs.map +0 -1
  68. package/dist/client/_serviceType-M8d9rOT6.mjs +0 -6
  69. package/dist/client/_serviceType-M8d9rOT6.mjs.map +0 -1
  70. package/dist/client/_storageType-BNpP1A2N.mjs +0 -13
  71. package/dist/client/_storageType-BNpP1A2N.mjs.map +0 -1
  72. package/dist/client/_storageType-BxSGKhAI.mjs +0 -15
  73. package/dist/client/_storageType-BxSGKhAI.mjs.map +0 -1
  74. package/dist/client/_storageType-DZYCmiLt.mjs +0 -30
  75. package/dist/client/_storageType-DZYCmiLt.mjs.map +0 -1
  76. package/dist/client/_storageType-UqAMP-8d.mjs +0 -859
  77. package/dist/client/_storageType-UqAMP-8d.mjs.map +0 -1
  78. package/dist/client/_storageType-u51_7OwJ.mjs +0 -7
  79. package/dist/client/_storageType-u51_7OwJ.mjs.map +0 -1
  80. package/dist/client/about-BmQTyLWc.mjs +0 -92
  81. package/dist/client/about-BmQTyLWc.mjs.map +0 -1
  82. package/dist/client/assets/__mocks__/svgMock.d.ts +0 -3
  83. package/dist/client/aurora-CIml-f2f.mjs +0 -19
  84. package/dist/client/aurora-CIml-f2f.mjs.map +0 -1
  85. package/dist/client/build-WuxXRAqf.mjs +0 -14530
  86. package/dist/client/build-WuxXRAqf.mjs.map +0 -1
  87. package/dist/client/cn-DM4Cy3jv.mjs +0 -10
  88. package/dist/client/cn-DM4Cy3jv.mjs.map +0 -1
  89. package/dist/client/flavors-CJVSNz6R.mjs +0 -15
  90. package/dist/client/flavors-CJVSNz6R.mjs.map +0 -1
  91. package/dist/client/flavors-CflJDIEH.mjs +0 -667
  92. package/dist/client/flavors-CflJDIEH.mjs.map +0 -1
  93. package/dist/client/flavors-DWMZ6TuJ.mjs +0 -8
  94. package/dist/client/flavors-DWMZ6TuJ.mjs.map +0 -1
  95. package/dist/client/floatingips-Cz9k80cc.mjs +0 -8
  96. package/dist/client/floatingips-Cz9k80cc.mjs.map +0 -1
  97. package/dist/client/floatingips-DXnRlLvV.mjs +0 -551
  98. package/dist/client/floatingips-DXnRlLvV.mjs.map +0 -1
  99. package/dist/client/floatingips-HRbuLxiN.mjs +0 -22
  100. package/dist/client/floatingips-HRbuLxiN.mjs.map +0 -1
  101. package/dist/client/floatingips-nN1kQmsu.mjs +0 -14
  102. package/dist/client/floatingips-nN1kQmsu.mjs.map +0 -1
  103. package/dist/client/formatBytes-CZv_XyCY.mjs +0 -38
  104. package/dist/client/formatBytes-CZv_XyCY.mjs.map +0 -1
  105. package/dist/client/helpers-1PpYf-fC.mjs +0 -6
  106. package/dist/client/helpers-1PpYf-fC.mjs.map +0 -1
  107. package/dist/client/hooks-D0yKIumu.mjs +0 -22
  108. package/dist/client/hooks-D0yKIumu.mjs.map +0 -1
  109. package/dist/client/imageHelpers-DBhL2ebL.mjs +0 -1272
  110. package/dist/client/imageHelpers-DBhL2ebL.mjs.map +0 -1
  111. package/dist/client/images-BsylWUiH.mjs +0 -2011
  112. package/dist/client/images-BsylWUiH.mjs.map +0 -1
  113. package/dist/client/images-NBf2bV43.mjs +0 -8
  114. package/dist/client/images-NBf2bV43.mjs.map +0 -1
  115. package/dist/client/images-zQq1nSVv.mjs +0 -15
  116. package/dist/client/images-zQq1nSVv.mjs.map +0 -1
  117. package/dist/client/md-kvaGCNAK.mjs +0 -336
  118. package/dist/client/md-kvaGCNAK.mjs.map +0 -1
  119. package/dist/client/network-DuZm76BZ.mjs +0 -8
  120. package/dist/client/network-DuZm76BZ.mjs.map +0 -1
  121. package/dist/client/objects-BudUAfWY.mjs +0 -12909
  122. package/dist/client/objects-BudUAfWY.mjs.map +0 -1
  123. package/dist/client/objects-Dc7sKUr8.mjs +0 -67
  124. package/dist/client/objects-Dc7sKUr8.mjs.map +0 -1
  125. package/dist/client/objects-Dw7oeTq2.mjs +0 -80
  126. package/dist/client/objects-Dw7oeTq2.mjs.map +0 -1
  127. package/dist/client/objects-_g7nGIn5.mjs +0 -25
  128. package/dist/client/objects-_g7nGIn5.mjs.map +0 -1
  129. package/dist/client/objects-eBxvY6_n.mjs +0 -78
  130. package/dist/client/objects-eBxvY6_n.mjs.map +0 -1
  131. package/dist/client/projects-yiK0HGSA.mjs +0 -7
  132. package/dist/client/projects-yiK0HGSA.mjs.map +0 -1
  133. package/dist/client/routeInfo-DP3v74Wg.mjs +0 -19
  134. package/dist/client/routeInfo-DP3v74Wg.mjs.map +0 -1
  135. package/dist/client/routes-CJj7SR_K.mjs +0 -10
  136. package/dist/client/routes-CJj7SR_K.mjs.map +0 -1
  137. package/dist/client/routes-xofA3ksU.mjs +0 -110
  138. package/dist/client/routes-xofA3ksU.mjs.map +0 -1
  139. package/dist/client/securitygroups-CSmsBzUb.mjs +0 -581
  140. package/dist/client/securitygroups-CSmsBzUb.mjs.map +0 -1
  141. package/dist/client/securitygroups-CtKne8UQ.mjs +0 -8
  142. package/dist/client/securitygroups-CtKne8UQ.mjs.map +0 -1
  143. package/dist/client/securitygroups-T7kaNFEp.mjs +0 -15
  144. package/dist/client/securitygroups-T7kaNFEp.mjs.map +0 -1
  145. package/dist/client/securitygroups-WLB1_IM6.mjs +0 -22
  146. package/dist/client/securitygroups-WLB1_IM6.mjs.map +0 -1
  147. package/dist/client/securitygroups-o0IXZM6S.mjs +0 -14
  148. package/dist/client/securitygroups-o0IXZM6S.mjs.map +0 -1
  149. package/dist/client/serviceCatalog-B3lKWC9V.mjs +0 -6
  150. package/dist/client/serviceCatalog-B3lKWC9V.mjs.map +0 -1
  151. package/dist/client/services-D1PbooD1.mjs +0 -6
  152. package/dist/client/services-D1PbooD1.mjs.map +0 -1
  153. package/dist/client/services-DEMVtFyn.mjs +0 -9
  154. package/dist/client/services-DEMVtFyn.mjs.map +0 -1
  155. package/dist/client/storageProviders-CJ5rOh13.mjs +0 -15
  156. package/dist/client/storageProviders-CJ5rOh13.mjs.map +0 -1
  157. package/dist/client/trpcClient-D7gpR7YG.mjs +0 -71
  158. package/dist/client/trpcClient-D7gpR7YG.mjs.map +0 -1
  159. package/dist/client/useBreadcrumbs-ha3IlaxX.mjs +0 -54
  160. package/dist/client/useBreadcrumbs-ha3IlaxX.mjs.map +0 -1
  161. package/dist/client/useErrorTranslation-Dc0eE8Zt.mjs +0 -83
  162. package/dist/client/useErrorTranslation-Dc0eE8Zt.mjs.map +0 -1
  163. package/dist/client/useModal-DCs1OJh7.mjs +0 -12
  164. package/dist/client/useModal-DCs1OJh7.mjs.map +0 -1
  165. package/dist/client/useModalTracking-BYd37pXm.mjs +0 -37
  166. package/dist/client/useModalTracking-BYd37pXm.mjs.map +0 -1
  167. package/dist/client/useProjectId-DBc5lpoU.mjs +0 -11
  168. package/dist/client/useProjectId-DBc5lpoU.mjs.map +0 -1
  169. package/dist/client/useSecurityGroupPermissions--hK4aR8Y.mjs +0 -294
  170. package/dist/client/useSecurityGroupPermissions--hK4aR8Y.mjs.map +0 -1
  171. package/dist/client/useSetBreadcrumb-tn7lBaQV.mjs +0 -19
  172. package/dist/client/useSetBreadcrumb-tn7lBaQV.mjs.map +0 -1
  173. package/dist/client/utils/trpcErrors.d.ts +0 -13
@@ -1 +0,0 @@
1
- {"version":3,"file":"floatingips-DXnRlLvV.mjs","names":["MdError","MdRemoveCircle","MdCheckCircle","STATUS_CONFIG","ACTIVE","text","icon","size","color","fill","DOWN","ERROR","TABLE_COLUMNS","t","useNavigate","DataGridCell","DataGridRow","PopupMenu","PopupMenuItem","PopupMenuOptions","STATUS_CONFIG","FloatingIpActionModals","useProjectId","FloatingIpTableRow","floatingIp","useLingui","navigate","projectId","navigateToDetailsPage","to","params","floatingIpId","id","data-testid","onClick","div","className","status","icon","text","floating_ip_address","fixed_ip_address","floating_network_id","description","e","stopPropagation","toggleEditModal","toggleAttachModal","toggleDetachModal","toggleReleaseModal","label","t","DataGrid","DataGridHeadCell","DataGridRow","DataGridCell","Status","FloatingIpTableRow","TABLE_COLUMNS","FloatingIpListContainer","floatingIps","isLoading","isError","error","useLingui","columns","columnCount","length","status","title","t","message","minContentColumns","map","label","ip","floatingIp","id","colSpan","body","z","useForm","useStore","useNavigate","Modal","Form","FormSection","Status","Message","Textarea","TextInput","Select","SelectOption","trpcReact","useProjectId","ipv4Regex","ipv6Regex","isValidIpAddress","value","test","dnsNameRegex","AllocateFloatingIpModal","open","onClose","useLingui","projectId","navigate","utils","useUtils","isPending","createFloatingIpMutation","network","floatingIp","create","useMutation","onSettled","list","invalidate","data","externalNetworks","isLoading","isExternalNetworksLoading","error","externalNetworksError","listExternalNetworks","useQuery","project_id","dnsDomains","isDnsDomainsLoading","dnsDomainsError","listDnsDomains","availablePorts","isPortsLoading","portsError","listAvailablePorts","formSchema","object","floating_network_id","string","dns_domain","dns_name","trim","max","t","refine","message","description","floating_ip_address","port_id","fixed_ip_address","form","defaultValues","validators","onSubmit","created","mutateAsync","handleClose","to","params","floatingIpId","id","reset","currentPortId","store","state","values","currentFloatingNetworkId","selectedPort","find","port","portFixedIps","fixed_ips","formErrorMessage","size","title","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","disableCancelButton","disableCloseButton","dismissible","variant","className","status","e","preventDefault","Field","name","children","field","onChange","handleChange","label","helptext","placeholder","disabled","required","loading","map","onBlur","handleBlur","target","errortext","meta","errors","join","portId","p","ips","setFieldValue","length","ip_address","parseFiltersFromUrl","searchParams","filters","status","push","name","value","buildFilterParams","selectedFilters","filterDefinitions","params","length","filterGroups","filter","sf","inactive","reduce","acc","Object","entries","forEach","filterName","values","filterDef","find","f","supportsMultiValue","join","applyFilterSelection","current","selected","alreadySelected","some","supportsMulti","buildUrlSearchParams","baseParams","newParams","search","sortBy","sortDirection","useState","useRef","useEffect","useNavigate","useSearch","Button","Stack","DataGridToolbar","SearchInput","Message","Status","SortInput","SelectedFilters","FiltersInput","ContentHeader","trpcReact","useModal","useProjectId","FloatingIpListContainer","AllocateFloatingIpModal","parseFiltersFromUrl","buildFilterParams","buildUrlSearchParams","applyFilterSelection","DEFAULT_SORT_KEY","DEFAULT_SORT_DIR","FloatingIpsList","useLingui","navigate","searchParams","strict","projectId","allocateModalOpen","toggleAllocateModal","localSearchTerm","setLocalSearchTerm","search","debounceTimer","undefined","clearTimeout","current","sortSettings","setSortSettings","options","label","t","value","sortBy","sortDirection","filterSettings","setFilterSettings","filters","displayName","filterName","values","supportsMultiValue","selectedFilters","searchTerm","data","permissions","network","canUser","useQuery","project_id","permission","select","canCreate","urlFilters","urlSortBy","urlSortDirection","urlSearchTerm","prev","status","handleSortChange","newSortSettings","settings","toString","replace","handleFilterChange","newFilterSettings","handleSearchChange","term","floatingIps","isLoading","isError","error","floatingIp","list","sort_key","sort_dir","placeholderData","length","title","message","div","className","variant","distribution","alignment","gap","selectClassName","onSortByChange","v","onSortDirectionChange","dir","onClick","direction","comboboxClassName","onChange","selected","newSelected","placeholder","data-testid","onInput","e","currentTarget","window","setTimeout","onSearch","onClear","onDelete","filterToRemove","filter","f","name","open","onClose","FloatingIpsList","RouteComponent","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/network/floatingips/-components/-table/constants.tsx","../../src/client/routes/_auth/projects/$projectId/network/floatingips/-components/-table/FloatingIpTableRow.tsx","../../src/client/routes/_auth/projects/$projectId/network/floatingips/-components/-table/FloatingIpListContainer.tsx","../../src/client/routes/_auth/projects/$projectId/network/floatingips/-components/-modals/AllocateFloatingIpModal.tsx","../../src/client/routes/_auth/projects/$projectId/network/floatingips/urlHelpers.ts","../../src/client/routes/_auth/projects/$projectId/network/floatingips/-components/FloatingIpsList.tsx","../../src/client/routes/_auth/projects/$projectId/network/floatingips/index.tsx?tsr-split=component"],"sourcesContent":["import { MdError, MdRemoveCircle, MdCheckCircle } from \"react-icons/md\"\nimport { t } from \"@lingui/core/macro\"\nimport { FloatingIpStatus } from \"@/server/Network/types/floatingIp\"\n\ntype FloatingIpStatusDisplay = {\n text: string\n icon: React.ReactNode\n}\n\nexport const STATUS_CONFIG: Record<FloatingIpStatus, FloatingIpStatusDisplay> = {\n ACTIVE: {\n text: \"Active\",\n icon: <MdCheckCircle size={18} color=\"white\" fill=\"#4FB81C\" />,\n },\n DOWN: {\n text: \"Down\",\n icon: <MdRemoveCircle size={18} color=\"white\" fill=\"#969696\" />,\n },\n ERROR: {\n text: \"Error\",\n icon: <MdError size={18} color=\"white\" fill=\"#C70000\" />,\n },\n} as const\n\nexport const TABLE_COLUMNS = () =>\n [\n t`Status`,\n t`Floating IP Address`,\n t`Fixed IP Address`,\n t`Subnet`,\n t`Description`,\n \"\", // empty column for item-actions with context menu containing \"Show Details\", \"Edit Description\", \"Attach\", \"Detach\" and \"Release\"\n ] as const\n","import { useNavigate } from \"@tanstack/react-router\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport {\n DataGridCell,\n DataGridRow,\n PopupMenu,\n PopupMenuItem,\n PopupMenuOptions,\n} from \"@cloudoperators/juno-ui-components\"\nimport { FloatingIp } from \"@/server/Network/types/floatingIp\"\nimport { STATUS_CONFIG } from \"./constants\"\nimport { FloatingIpActionModals } from \"../-modals/FloatingIpActionModals\"\nimport { useProjectId } from \"@/client/hooks\"\n\ninterface FloatingIpTableRowProps {\n floatingIp: FloatingIp\n}\n\nexport const FloatingIpTableRow = ({ floatingIp }: FloatingIpTableRowProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n\n const navigateToDetailsPage = () => {\n navigate({\n to: \"/projects/$projectId/network/floatingips/$floatingIpId\",\n params: { projectId, floatingIpId: floatingIp.id },\n })\n }\n\n return (\n <DataGridRow key={floatingIp.id} data-testid={`floating-ip-row-${floatingIp.id}`} onClick={navigateToDetailsPage}>\n <DataGridCell>\n <div className=\"flex items-center gap-2\">\n {STATUS_CONFIG[floatingIp.status].icon}\n {STATUS_CONFIG[floatingIp.status].text}\n </div>\n </DataGridCell>\n <DataGridCell>{floatingIp.floating_ip_address}</DataGridCell>\n <DataGridCell>{floatingIp.fixed_ip_address || \"—\"}</DataGridCell>\n <DataGridCell>{floatingIp.floating_network_id}</DataGridCell>\n <DataGridCell>\n <div className=\"truncate\">{floatingIp.description || \"—\"}</div>\n </DataGridCell>\n <DataGridCell onClick={(e) => e.stopPropagation()} className=\"items-end pr-0\">\n <FloatingIpActionModals floatingIp={floatingIp}>\n {({ toggleEditModal, toggleAttachModal, toggleDetachModal, toggleReleaseModal }) => (\n <PopupMenu>\n <PopupMenuOptions>\n <PopupMenuItem label={t`Show Details`} onClick={navigateToDetailsPage} />\n <PopupMenuItem label={t`Edit Description`} onClick={toggleEditModal} />\n <PopupMenuItem label={t`Attach`} onClick={toggleAttachModal} />\n <PopupMenuItem label={t`Detach`} onClick={toggleDetachModal} />\n <PopupMenuItem label={t`Release`} onClick={toggleReleaseModal} />\n </PopupMenuOptions>\n </PopupMenu>\n )}\n </FloatingIpActionModals>\n </DataGridCell>\n </DataGridRow>\n )\n}\n","import { useLingui } from \"@lingui/react/macro\"\nimport { DataGrid, DataGridHeadCell, DataGridRow, DataGridCell, Status } from \"@cloudoperators/juno-ui-components\"\nimport { FloatingIp } from \"@/server/Network/types/floatingIp\"\nimport { FloatingIpTableRow } from \"./FloatingIpTableRow\"\nimport { TABLE_COLUMNS } from \"./constants\"\n\ninterface FloatingIpListContainerProps {\n floatingIps: FloatingIp[]\n isLoading: boolean\n isError: boolean\n error: { message?: string } | null\n}\n\nexport const FloatingIpListContainer = ({ floatingIps, isLoading, isError, error }: FloatingIpListContainerProps) => {\n const { t } = useLingui()\n const columns = TABLE_COLUMNS()\n const columnCount = columns.length\n\n if (isLoading) {\n return <Status status=\"progress\" title={t`Loading Floating IPs...`} />\n }\n\n if (isError) {\n return <Status status=\"error\" title={error?.message ?? t`Failed to Load Floating IPs`} />\n }\n\n return (\n <DataGrid columns={columnCount} minContentColumns={[columnCount - 1]}>\n <DataGridRow>\n {columns.map((label) => (\n <DataGridHeadCell key={label}>{label}</DataGridHeadCell>\n ))}\n </DataGridRow>\n {floatingIps.length > 0 ? (\n floatingIps.map((ip) => <FloatingIpTableRow key={ip.id} floatingIp={ip} />)\n ) : (\n <DataGridRow>\n <DataGridCell colSpan={columnCount}>\n <Status\n status=\"empty\"\n title={t`No Floating IPs Found`}\n body={t`There are no Floating IPs available for this project. Floating IPs allow you to map public IP addresses to instances.`}\n />\n </DataGridCell>\n </DataGridRow>\n )}\n </DataGrid>\n )\n}\n","import { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport { useNavigate } from \"@tanstack/react-router\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport {\n Modal,\n Form,\n FormSection,\n Status,\n Message,\n Textarea,\n TextInput,\n Select,\n SelectOption,\n} from \"@cloudoperators/juno-ui-components\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useProjectId } from \"@/client/hooks\"\n\nexport interface AllocateFloatingIpModalProps {\n open: boolean\n onClose: () => void\n}\n\nconst ipv4Regex = /^(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}$/\nconst ipv6Regex =\n /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|(([0-9a-fA-F]{1,4}:){1,7}:)|(([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4})|(([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2})|(([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3})|(([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4})|(([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5})|([0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6}))|(:((:[0-9a-fA-F]{1,4}){1,7}|:))|(::([fF]{4}(:0{1,4})?:)?((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|(([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})))$/\nconst isValidIpAddress = (value: string) => ipv4Regex.test(value) || ipv6Regex.test(value)\nconst dnsNameRegex = /^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)*[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$/\n\nexport const AllocateFloatingIpModal = ({ open, onClose }: AllocateFloatingIpModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const navigate = useNavigate()\n const utils = trpcReact.useUtils()\n\n const { isPending, ...createFloatingIpMutation } = trpcReact.network.floatingIp.create.useMutation({\n onSettled: () => utils.network.floatingIp.list.invalidate(),\n })\n\n const {\n data: externalNetworks = [],\n isLoading: isExternalNetworksLoading,\n error: externalNetworksError,\n } = trpcReact.network.floatingIp.listExternalNetworks.useQuery({ project_id: projectId })\n\n const {\n data: dnsDomains = [],\n isLoading: isDnsDomainsLoading,\n error: dnsDomainsError,\n } = trpcReact.network.floatingIp.listDnsDomains.useQuery({ project_id: projectId })\n\n const {\n data: availablePorts = [],\n isLoading: isPortsLoading,\n error: portsError,\n } = trpcReact.network.floatingIp.listAvailablePorts.useQuery({ project_id: projectId })\n\n const formSchema = z.object({\n floating_network_id: z.string(),\n dns_domain: z.string(),\n dns_name: z\n .string()\n .trim()\n .max(63, t`DNS name must be at most 63 characters.`)\n .refine((value) => value === \"\" || dnsNameRegex.test(value), {\n message: t`Must be a valid PQDN or FQDN (alphanumeric and hyphens only, cannot start or end with hyphen).`,\n }),\n description: z\n .string()\n .trim()\n .max(255, t`Description must be at most 255 characters.`),\n floating_ip_address: z\n .string()\n .trim()\n .refine((value) => value === \"\" || isValidIpAddress(value), {\n message: t`Must be a valid IPv4 or IPv6 address (for example: 172.24.4.228 or 2001:db8::1).`,\n }),\n port_id: z.string(),\n fixed_ip_address: z.string(),\n })\n\n const form = useForm({\n defaultValues: {\n floating_network_id: \"\",\n dns_domain: \"\",\n dns_name: \"\",\n description: \"\",\n floating_ip_address: \"\",\n port_id: \"\",\n fixed_ip_address: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async ({ value }) => {\n if (isPending) return\n\n const created = await createFloatingIpMutation.mutateAsync({\n project_id: projectId,\n floating_network_id: value.floating_network_id,\n ...(value.dns_domain && { dns_domain: value.dns_domain }),\n ...(value.dns_name && { dns_name: value.dns_name }),\n ...(value.description && { description: value.description }),\n ...(value.floating_ip_address && { floating_ip_address: value.floating_ip_address }),\n ...(value.port_id && { port_id: value.port_id }),\n ...(value.fixed_ip_address && { fixed_ip_address: value.fixed_ip_address }),\n })\n handleClose()\n navigate({\n to: \"/projects/$projectId/network/floatingips/$floatingIpId\",\n params: { projectId, floatingIpId: created.id },\n })\n },\n })\n\n const handleClose = () => {\n if (isPending) return\n\n form.reset()\n createFloatingIpMutation.reset()\n onClose()\n }\n\n const currentPortId = useStore(form.store, (state) => state.values.port_id)\n const currentFloatingNetworkId = useStore(form.store, (state) => state.values.floating_network_id)\n const selectedPort = availablePorts.find((port) => port.id === currentPortId)\n const portFixedIps = selectedPort?.fixed_ips ?? []\n\n const formErrorMessage =\n (externalNetworksError?.message || dnsDomainsError?.message || portsError?.message) ??\n createFloatingIpMutation.error?.message ??\n null\n\n return (\n <Modal\n open={open}\n size=\"large\"\n title={t`Allocate Floating IP`}\n onCancel={handleClose}\n cancelButtonLabel={t`Cancel`}\n confirmButtonLabel={t`Allocate`}\n onConfirm={form.handleSubmit}\n disableConfirmButton={isPending || !currentFloatingNetworkId}\n disableCancelButton={isPending}\n disableCloseButton={isPending}\n >\n {formErrorMessage && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {formErrorMessage}\n </Message>\n )}\n\n {isPending ? (\n <Status status=\"progress\" title={t`Allocating Floating IP...`} className=\"mt-0\" />\n ) : (\n <Form\n className=\"mb-0\"\n id=\"allocate-floating-ip-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection className=\"mb-4\">\n <form.Field\n name=\"floating_network_id\"\n children={(field) => (\n <Select\n id={field.name}\n name={field.name}\n value={field.state.value}\n onChange={(value) => field.handleChange(typeof value === \"string\" ? value : \"\")}\n label={t`External Network`}\n helptext={t`The ID of the network associated with the floating IP.`}\n placeholder={t`Select an external network`}\n disabled={isPending || isExternalNetworksLoading}\n required\n loading={isExternalNetworksLoading}\n >\n {externalNetworks.map(({ id, name }) => (\n <SelectOption key={id} value={id} label={name ? `${name} (${id})` : id} />\n ))}\n </Select>\n )}\n />\n </FormSection>\n <FormSection className=\"mb-4\">\n <form.Field\n name=\"dns_domain\"\n children={(field) => (\n <Select\n id={field.name}\n name={field.name}\n value={field.state.value}\n onChange={(value) => field.handleChange(typeof value === \"string\" ? value : \"\")}\n label={t`DNS Domain`}\n helptext={t`Select a DNS domain.`}\n disabled={isPending || isDnsDomainsLoading}\n loading={isDnsDomainsLoading}\n >\n {dnsDomains.map(({ id, name }) => (\n <SelectOption key={id} value={name} label={name} />\n ))}\n </Select>\n )}\n />\n </FormSection>\n <FormSection className=\"mb-4\">\n <form.Field\n name=\"dns_name\"\n children={(field) => (\n <TextInput\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n label={t`DNS Name`}\n placeholder={t`Enter DNS name`}\n helptext={t`Enter a valid PQDN or FQDN (max 63 characters) to associate with the floating IP. A and PTR records are created automatically.`}\n errortext={field.state.meta.errors.map((e) => e?.message).join(\", \")}\n disabled={isPending}\n />\n )}\n />\n </FormSection>\n <FormSection className=\"mb-4\">\n <form.Field\n name=\"description\"\n children={(field) => (\n <Textarea\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n placeholder={t`Description`}\n errortext={field.state.meta.errors.map((e) => e?.message).join(\", \")}\n disabled={isPending}\n />\n )}\n />\n </FormSection>\n <FormSection className=\"mb-4\">\n <form.Field\n name=\"floating_ip_address\"\n children={(field) => (\n <TextInput\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(e) => field.handleChange(e.target.value)}\n label={t`Floating IP Address`}\n placeholder={t`Enter a floating IP`}\n helptext={t`Enter a floating IP or leave blank to auto-assign one`}\n errortext={field.state.meta.errors.map((e) => e?.message).join(\", \")}\n disabled={isPending}\n />\n )}\n />\n </FormSection>\n <FormSection className=\"mb-4\">\n <form.Field\n name=\"port_id\"\n children={(field) => (\n <Select\n id={field.name}\n name={field.name}\n value={field.state.value}\n onChange={(value) => {\n const portId = typeof value === \"string\" ? value : \"\"\n field.handleChange(portId)\n const port = availablePorts.find((p) => p.id === portId)\n const ips = port?.fixed_ips ?? []\n form.setFieldValue(\"fixed_ip_address\", ips.length === 1 ? ips[0].ip_address : \"\")\n }}\n label={t`Port ID`}\n placeholder={t`Select port to associate`}\n errortext={field.state.meta.errors.map((e) => e?.message).join(\", \")}\n disabled={isPending || isPortsLoading}\n loading={isPortsLoading}\n >\n {availablePorts.map((port) => (\n <SelectOption\n key={port.id}\n value={port.id}\n label={port.name ? `${port.name} (${port.id})` : port.id}\n />\n ))}\n </Select>\n )}\n />\n </FormSection>\n <FormSection>\n <form.Field\n name=\"fixed_ip_address\"\n children={(field) => (\n <Select\n id={field.name}\n name={field.name}\n value={field.state.value}\n onBlur={field.handleBlur}\n onChange={(value) => field.handleChange(typeof value === \"string\" ? value : \"\")}\n label={t`Fixed IP Address`}\n placeholder={t`Select a fixed IP address`}\n helptext={t`Associates on the selected port. If the port has multiple IPs, select the desired fixed IP address.`}\n errortext={field.state.meta.errors.map((e) => e?.message).join(\", \")}\n disabled={isPending || portFixedIps.length === 0}\n >\n {portFixedIps.map(({ ip_address }) => (\n <SelectOption key={ip_address} value={ip_address} label={ip_address} />\n ))}\n </Select>\n )}\n />\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import { SelectedFilter, Filter } from \"@/client/components/ListToolbar/types\"\n\ntype FloatingIpsSearchParams = {\n status?: string\n search?: string\n sortBy?: string\n sortDirection?: \"asc\" | \"desc\"\n}\n\n/**\n * Parses URL search params into SelectedFilter array for ListToolbar\n */\nexport const parseFiltersFromUrl = (searchParams: FloatingIpsSearchParams): SelectedFilter[] => {\n const filters: SelectedFilter[] = []\n\n // Status filter\n if (searchParams.status) {\n filters.push({ name: \"status\", value: searchParams.status })\n }\n\n return filters\n}\n\n/**\n * Builds filter parameters for API request from SelectedFilter array\n */\nexport const buildFilterParams = (\n selectedFilters: SelectedFilter[],\n filterDefinitions: Filter[]\n): Record<string, string> => {\n const params: Record<string, string> = {}\n\n if (!selectedFilters?.length) return params\n\n // Group selected filters by filter name\n const filterGroups = selectedFilters\n .filter((sf) => !sf.inactive)\n .reduce(\n (acc, sf) => {\n if (!acc[sf.name]) acc[sf.name] = []\n acc[sf.name].push(sf.value)\n return acc\n },\n {} as Record<string, string[]>\n )\n\n // Build parameters based on whether filter supports multiple values\n Object.entries(filterGroups).forEach(([filterName, values]) => {\n const filterDef = filterDefinitions.find((f) => f.filterName === filterName)\n\n if (filterDef?.supportsMultiValue && values.length > 1) {\n params[filterName] = `in:${values.join(\",\")}`\n } else {\n params[filterName] = values[0]\n }\n })\n\n return params\n}\n\n/**\n * Merges a newly selected filter into the current list.\n * - Ignores duplicates (same name + value).\n * - For single-value filters, replaces any existing entry with the same name.\n * - For multi-value filters, appends.\n */\nexport const applyFilterSelection = (\n current: SelectedFilter[],\n selected: SelectedFilter,\n filterDefinitions: Filter[]\n): SelectedFilter[] => {\n const alreadySelected = current.some((f) => f.name === selected.name && f.value === selected.value)\n if (alreadySelected) return current\n\n const supportsMulti = filterDefinitions.find((f) => f.filterName === selected.name)?.supportsMultiValue\n return supportsMulti ? [...current, selected] : [...current.filter((f) => f.name !== selected.name), selected]\n}\n\n/**\n * Builds URL search params object from filter settings for navigation\n */\nexport const buildUrlSearchParams = (\n selectedFilters: SelectedFilter[],\n filterDefinitions: Filter[],\n baseParams: {\n search?: string\n sortBy?: string\n sortDirection?: \"asc\" | \"desc\"\n }\n): FloatingIpsSearchParams => {\n const newParams: FloatingIpsSearchParams = {\n search: baseParams.search,\n sortBy: baseParams.sortBy,\n sortDirection: baseParams.sortDirection,\n }\n\n if (!selectedFilters?.length) return newParams\n\n const filterGroups = selectedFilters\n .filter((sf) => !sf.inactive)\n .reduce(\n (acc, sf) => {\n if (!acc[sf.name]) acc[sf.name] = []\n acc[sf.name].push(sf.value)\n return acc\n },\n {} as Record<string, string[]>\n )\n\n Object.entries(filterGroups).forEach(([filterName, values]) => {\n const filterDef = filterDefinitions.find((f) => f.filterName === filterName)\n\n if (filterDef?.supportsMultiValue && values.length > 1) {\n // Type assertion needed because we're dynamically setting filter fields\n ;(newParams as Record<string, string>)[filterName] = `in:${values.join(\",\")}`\n } else {\n ;(newParams as Record<string, string>)[filterName] = values[0]\n }\n })\n\n return newParams\n}\n","import { useState, useRef, useEffect } from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { useNavigate, useSearch } from \"@tanstack/react-router\"\nimport { Button, Stack, DataGridToolbar, SearchInput, Message, Status } from \"@cloudoperators/juno-ui-components\"\nimport { FloatingIpQueryParameters } from \"@/server/Network/types/floatingIp\"\nimport { SortInput } from \"@/client/components/ListToolbar/SortInput\"\nimport { SelectedFilters } from \"@/client/components/ListToolbar/SelectedFilters\"\nimport { FiltersInput } from \"@/client/components/ListToolbar/FiltersInput\"\nimport { FilterSettings, SortSettings } from \"@/client/components/ListToolbar/types\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { FloatingIpListContainer } from \"./-table/FloatingIpListContainer\"\nimport { AllocateFloatingIpModal } from \"./-modals/AllocateFloatingIpModal\"\nimport { parseFiltersFromUrl, buildFilterParams, buildUrlSearchParams, applyFilterSelection } from \"../urlHelpers\"\n\nconst DEFAULT_SORT_KEY = \"status\"\nconst DEFAULT_SORT_DIR = \"asc\"\nexport type FloatingIpsSortKey = NonNullable<FloatingIpQueryParameters[\"sort_key\"]>\n\ntype FloatingIpsSearchParams = {\n status?: string\n search?: string\n sortBy?: string\n sortDirection?: \"asc\" | \"desc\"\n}\n\ntype RequiredSortSettings = {\n options: SortSettings[\"options\"]\n sortBy: string\n sortDirection: \"asc\" | \"desc\"\n}\n\nexport const FloatingIpsList = () => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const searchParams = useSearch({ strict: false }) as FloatingIpsSearchParams\n const projectId = useProjectId()\n const [allocateModalOpen, toggleAllocateModal] = useModal(false)\n const [localSearchTerm, setLocalSearchTerm] = useState(searchParams.search || \"\")\n const debounceTimer = useRef<number | undefined>(undefined)\n\n useEffect(() => () => clearTimeout(debounceTimer.current), [])\n\n const [sortSettings, setSortSettings] = useState<RequiredSortSettings>({\n options: [{ label: t`Status`, value: \"status\" }],\n sortBy: searchParams.sortBy || DEFAULT_SORT_KEY,\n sortDirection: searchParams.sortDirection || DEFAULT_SORT_DIR,\n })\n\n const [filterSettings, setFilterSettings] = useState<FilterSettings>({\n filters: [\n {\n displayName: t`Status`,\n filterName: \"status\",\n values: [\"ACTIVE\", \"DOWN\", \"ERROR\"],\n supportsMultiValue: false,\n },\n ],\n selectedFilters: parseFiltersFromUrl(searchParams),\n })\n\n const searchTerm = searchParams.search || \"\"\n\n const { data: permissions } = trpcReact.network.canUser.useQuery(\n { project_id: projectId, permission: [\"network:floatingips:create\"] },\n { select: ([canCreate]) => ({ canCreate }) }\n )\n\n useEffect(() => {\n const urlFilters = parseFiltersFromUrl(searchParams)\n const urlSortBy = searchParams.sortBy || DEFAULT_SORT_KEY\n const urlSortDirection = searchParams.sortDirection || DEFAULT_SORT_DIR\n const urlSearchTerm = searchParams.search || \"\"\n\n setFilterSettings((prev) => ({ ...prev, selectedFilters: urlFilters }))\n setSortSettings((prev) => ({ ...prev, sortBy: urlSortBy, sortDirection: urlSortDirection }))\n setLocalSearchTerm(urlSearchTerm)\n }, [searchParams.status, searchParams.sortBy, searchParams.sortDirection, searchParams.search])\n\n const handleSortChange = (newSortSettings: SortSettings) => {\n const settings: RequiredSortSettings = {\n options: newSortSettings.options,\n sortBy: newSortSettings.sortBy?.toString() || DEFAULT_SORT_KEY,\n sortDirection: newSortSettings.sortDirection || DEFAULT_SORT_DIR,\n }\n setSortSettings(settings)\n navigate({\n search: ((prev: FloatingIpsSearchParams) => ({\n ...prev,\n sortBy: settings.sortBy,\n sortDirection: settings.sortDirection,\n })) as unknown as true,\n replace: false,\n })\n }\n\n const handleFilterChange = (newFilterSettings: FilterSettings) => {\n setFilterSettings(newFilterSettings)\n navigate({\n search: ((prev: FloatingIpsSearchParams) =>\n buildUrlSearchParams(newFilterSettings.selectedFilters || [], newFilterSettings.filters, {\n search: prev.search,\n sortBy: prev.sortBy,\n sortDirection: prev.sortDirection,\n })) as unknown as true,\n replace: false,\n })\n }\n\n const handleSearchChange = (term: string, replace = false) => {\n navigate({\n search: ((prev: FloatingIpsSearchParams) => ({\n ...prev,\n search: term || undefined,\n })) as unknown as true,\n replace,\n })\n }\n\n const {\n data: floatingIps = [],\n isLoading,\n isError,\n error,\n } = trpcReact.network.floatingIp.list.useQuery(\n {\n project_id: projectId,\n sort_key: sortSettings.sortBy as FloatingIpsSortKey,\n sort_dir: sortSettings.sortDirection,\n ...buildFilterParams(filterSettings.selectedFilters || [], filterSettings.filters),\n ...(searchTerm ? { searchTerm } : {}),\n },\n { placeholderData: (prev) => prev }\n )\n\n if (isError && !floatingIps.length) {\n return <Status status=\"error\" title={error?.message ?? t`Failed to Load Floating IPs`} />\n }\n\n return (\n <>\n <ContentHeader title={t`Floating IPs`} projectId={projectId} />\n\n <div className=\"relative\">\n {/* Non-blocking error banner for refetch failures with cached data */}\n {isError && floatingIps.length > 0 && (\n <Message variant=\"error\" className=\"mb-4\">\n {error?.message ?? t`Failed to refresh Floating IPs. Showing cached data.`}\n </Message>\n )}\n\n {/* Zone 1 — sort + create button, no background */}\n <Stack distribution=\"end\" alignment=\"center\" gap=\"2\" className=\"pb-2\">\n <Stack gap=\"2\">\n <SortInput\n options={sortSettings.options}\n sortBy={sortSettings.sortBy}\n sortDirection={sortSettings.sortDirection ?? \"asc\"}\n selectClassName=\"min-w-52\"\n onSortByChange={(v) =>\n handleSortChange({ ...sortSettings, sortBy: v, sortDirection: sortSettings.sortDirection })\n }\n onSortDirectionChange={(dir) => handleSortChange({ ...sortSettings, sortDirection: dir })}\n />\n {permissions?.canCreate && (\n <Button onClick={toggleAllocateModal} variant=\"primary\" className=\"whitespace-nowrap\">\n <Trans>Allocate Floating IP</Trans>\n </Button>\n )}\n </Stack>\n </Stack>\n\n {/* Zone 2 — filter + search + active filter pills */}\n <DataGridToolbar>\n <Stack direction=\"vertical\" gap=\"2\">\n <Stack distribution=\"between\" alignment=\"center\">\n <FiltersInput\n filters={filterSettings.filters}\n selectClassName=\"sm:min-w-40\"\n comboboxClassName=\"sm:min-w-40\"\n onChange={(selected) => {\n const newSelected = applyFilterSelection(\n filterSettings.selectedFilters || [],\n selected,\n filterSettings.filters\n )\n if (newSelected === (filterSettings.selectedFilters || [])) return\n handleFilterChange({ ...filterSettings, selectedFilters: newSelected })\n }}\n />\n <SearchInput\n placeholder={t`Search floating IPs...`}\n data-testid=\"searchbar\"\n value={localSearchTerm}\n onInput={(e: React.FormEvent<HTMLInputElement>) => {\n const v = e.currentTarget.value\n setLocalSearchTerm(v)\n clearTimeout(debounceTimer.current)\n debounceTimer.current = window.setTimeout(() => handleSearchChange(v, true), 500)\n }}\n onSearch={(v) => {\n clearTimeout(debounceTimer.current)\n handleSearchChange(typeof v === \"string\" ? v : \"\", false)\n }}\n onClear={() => {\n clearTimeout(debounceTimer.current)\n setLocalSearchTerm(\"\")\n handleSearchChange(\"\", false)\n }}\n />\n </Stack>\n {filterSettings.selectedFilters && filterSettings.selectedFilters.length > 0 && (\n <SelectedFilters\n selectedFilters={filterSettings.selectedFilters}\n onDelete={(filterToRemove) =>\n handleFilterChange({\n ...filterSettings,\n selectedFilters: (filterSettings.selectedFilters || []).filter(\n (f) => !(f.name === filterToRemove.name && f.value === filterToRemove.value)\n ),\n })\n }\n onClear={() => handleFilterChange({ ...filterSettings, selectedFilters: [] })}\n />\n )}\n </Stack>\n </DataGridToolbar>\n\n <FloatingIpListContainer\n floatingIps={floatingIps}\n isLoading={isLoading}\n isError={isError && !floatingIps.length}\n error={error}\n />\n\n {allocateModalOpen && <AllocateFloatingIpModal open={allocateModalOpen} onClose={toggleAllocateModal} />}\n </div>\n </>\n )\n}\n","import { createFileRoute } from \"@tanstack/react-router\"\nimport { z } from \"zod\"\nimport { t } from \"@lingui/core/macro\"\nimport { FloatingIpQueryParametersSchema, FloatingIpStatusSchema } from \"@/server/Network/types/floatingIp\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { FloatingIpsList } from \"./-components/FloatingIpsList\"\n\nconst floatingIpsSearchFields = {\n status: FloatingIpStatusSchema.optional(),\n search: z.string().optional(),\n sortBy: FloatingIpQueryParametersSchema.shape.sort_key.unwrap().optional(),\n sortDirection: z.enum([\"asc\", \"desc\"]).optional(),\n}\n\nconst floatingIpsSearchSchema = z.looseObject(floatingIpsSearchFields)\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/network/floatingips/\")({\n staticData: {\n section: \"network\",\n service: \"floatingips\",\n analytics: {\n name: \"network.floatingips.list\",\n },\n } satisfies RouteInfo,\n validateSearch: (search) => {\n const result = floatingIpsSearchSchema.safeParse(search)\n if (result.success) return result.data\n return {\n ...search,\n status: floatingIpsSearchFields.status.safeParse(search.status).success ? search.status : undefined,\n search: floatingIpsSearchFields.search.safeParse(search.search).success ? search.search : undefined,\n sortBy: floatingIpsSearchFields.sortBy.safeParse(search.sortBy).success ? search.sortBy : undefined,\n sortDirection: floatingIpsSearchFields.sortDirection.safeParse(search.sortDirection).success\n ? search.sortDirection\n : undefined,\n }\n },\n head: () => ({ meta: [{ title: t`Floating IPs` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n return <FloatingIpsList />\n}\n"],"mappings":"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"}
@@ -1,22 +0,0 @@
1
- import { i as e } from "./build-WuxXRAqf.mjs";
2
- import { t } from "./floatingips-nN1kQmsu.mjs";
3
- import { t as n } from "./RouteIdLevelDefaultError-DPF_x2tG.mjs";
4
- import { jsx as r } from "react/jsx-runtime";
5
- import { useNavigate as i } from "@tanstack/react-router";
6
- import { useLingui as a } from "@lingui/react";
7
- //#region src/client/routes/_auth/projects/$projectId/network/floatingips.tsx?tsr-split=errorComponent
8
- var o = () => {
9
- let { i18n: o, _: s } = a(), c = i(), { projectId: l } = t.useParams();
10
- return /*#__PURE__*/ r(n, { action: /*#__PURE__*/ r(e, {
11
- variant: "primary",
12
- onClick: () => c({
13
- to: "/projects/$projectId/network/floatingips",
14
- params: { projectId: l }
15
- }),
16
- children: o._({ id: "z1JceR" })
17
- }) });
18
- };
19
- //#endregion
20
- export { o as errorComponent };
21
-
22
- //# sourceMappingURL=floatingips-HRbuLxiN.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"floatingips-HRbuLxiN.mjs","names":["useNavigate","RouteIdLevelDefaultError","Button","useLingui","FloatingIpsErrorComponent","t","navigate","projectId","Route","useParams","to","params","errorComponent"],"sources":["../../src/client/routes/_auth/projects/$projectId/network/floatingips.tsx?tsr-split=errorComponent"],"sourcesContent":["import { createFileRoute, Outlet, useNavigate } from \"@tanstack/react-router\"\nimport { RouteIdLevelDefaultError } from \"@/client/components/Errors/RouteIdLevelDefaultError\"\nimport { Button } from \"@cloudoperators/juno-ui-components\"\nimport { msg } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\n\nconst FloatingIpsErrorComponent = () => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const { projectId } = Route.useParams()\n\n return (\n <RouteIdLevelDefaultError\n action={\n <Button\n variant=\"primary\"\n onClick={() => navigate({ to: \"/projects/$projectId/network/floatingips\", params: { projectId } })}\n >\n {t`Back to Floating IPs`}\n </Button>\n }\n />\n )\n}\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/network/floatingips\")({\n staticData: {\n section: \"network\",\n service: \"floatingips\",\n crumb: { text: msg`Floating IPs` },\n } satisfies RouteInfo,\n component: () => <Outlet />,\n // Render errors from the floating IPs subtree inside the project layout\n // (side navigation, header, breadcrumbs) instead of the full-screen route error.\n errorComponent: FloatingIpsErrorComponent,\n})\n"],"mappings":";;;;;;;AAOA,IAAMI,UAA4BA;CAChC,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQD,EAAAA,GACRG,IAAWN,EAAAA,GACX,EAAEO,iBAAcC,EAAMC,UAAS;CAErC,OACE,gBAAC,GAAA,EACC,QACE,gBAAC,GAAA;EACC,SAAQ;EACR,eAAeH,EAAS;GAAEI,IAAI;GAA4CC,QAAQ,EAAEJ,aAAU;EAAE,CAAA;EAE/FF,UAAAA,EAAAA,EAAC,EAAA,IAAA,SAAA,CAAA;;AAKZ"}
@@ -1,14 +0,0 @@
1
- import { createFileRoute as e, lazyRouteComponent as t } from "@tanstack/react-router";
2
- var n = e("/_auth/projects/$projectId/network/floatingips")({
3
- staticData: {
4
- section: "network",
5
- service: "floatingips",
6
- crumb: { text: { id: "u77/s4" } }
7
- },
8
- component: t(() => import("./floatingips-Cz9k80cc.mjs"), "component"),
9
- errorComponent: t(() => import("./floatingips-HRbuLxiN.mjs"), "errorComponent")
10
- });
11
- //#endregion
12
- export { n as t };
13
-
14
- //# sourceMappingURL=floatingips-nN1kQmsu.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"floatingips-nN1kQmsu.mjs","names":["createFileRoute","msg","Route","staticData","section","service","crumb","text","RouteInfo","component","lazyRouteComponent","$$splitComponentImporter","errorComponent","$$splitErrorComponentImporter"],"sources":["../../src/client/routes/_auth/projects/$projectId/network/floatingips.tsx"],"sourcesContent":["import { createFileRoute, Outlet, useNavigate } from \"@tanstack/react-router\"\nimport { RouteIdLevelDefaultError } from \"@/client/components/Errors/RouteIdLevelDefaultError\"\nimport { Button } from \"@cloudoperators/juno-ui-components\"\nimport { msg } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\n\nconst FloatingIpsErrorComponent = () => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const { projectId } = Route.useParams()\n\n return (\n <RouteIdLevelDefaultError\n action={\n <Button\n variant=\"primary\"\n onClick={() => navigate({ to: \"/projects/$projectId/network/floatingips\", params: { projectId } })}\n >\n {t`Back to Floating IPs`}\n </Button>\n }\n />\n )\n}\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/network/floatingips\")({\n staticData: {\n section: \"network\",\n service: \"floatingips\",\n crumb: { text: msg`Floating IPs` },\n } satisfies RouteInfo,\n component: () => <Outlet />,\n // Render errors from the floating IPs subtree inside the project layout\n // (side navigation, header, breadcrumbs) instead of the full-screen route error.\n errorComponent: FloatingIpsErrorComponent,\n})\n"],"mappings":";AA0BA,IAAaE,IAAQF,EAAgB,gDAAA,CAAA,CAAkD;CACrFG,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,OAAO,EAAEC,MAAMN,EAAAA,IAAAA,SAAG,EAAe;CACnC;CACAQ,WAASC,8CAAA,WAAA;CAGTE,gBAAcF,8CAAA,gBAAA;AAChB,CAAA"}
@@ -1,38 +0,0 @@
1
- //#region src/client/utils/formatBytes.ts
2
- var e = [
3
- "B",
4
- "KiB",
5
- "MiB",
6
- "GiB",
7
- "TiB",
8
- "PiB",
9
- "EiB",
10
- "ZiB",
11
- "YiB"
12
- ], t = [
13
- "B",
14
- "KB",
15
- "MB",
16
- "GB",
17
- "TB",
18
- "PB",
19
- "EB",
20
- "ZB",
21
- "YB"
22
- ];
23
- function n(n, { decimals: r = 2, unitSystem: i = "binary" } = {}) {
24
- if (!n || n === 0) return "0 B";
25
- let a = i === "binary" ? 1024 : 1e3, o = i === "binary" ? e : t, s = Math.max(0, r), c = Math.min(Math.floor(Math.log(n) / Math.log(a)), o.length - 1);
26
- return `${Number.parseFloat((n / a ** +c).toFixed(s))} ${o[c]}`;
27
- }
28
- var r = (e, t) => n(e, {
29
- decimals: t,
30
- unitSystem: "decimal"
31
- }), i = (e, t) => n(e, {
32
- decimals: t,
33
- unitSystem: "binary"
34
- });
35
- //#endregion
36
- export { r as n, i as t };
37
-
38
- //# sourceMappingURL=formatBytes-CZv_XyCY.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatBytes-CZv_XyCY.mjs","names":["BINARY_UNITS","DECIMAL_UNITS","formatBytes","bytes","decimals","unitSystem","k","units","dm","Math","max","i","min","floor","log","length","Number","parseFloat","pow","toFixed","formatBytesDecimal","formatBytesBinary"],"sources":["../../src/client/utils/formatBytes.ts"],"sourcesContent":["/**\n * Supported unit systems for byte formatting.\n *\n * - `\"binary\"` (IEC): uses powers of 1024 → B, KiB, MiB, GiB, TiB, PiB, EiB, ZiB, YiB\n * - `\"decimal\"` (SI): uses powers of 1000 → B, KB, MB, GB, TB, PB, EB, ZB, YB\n *\n * Default is `\"binary\"`.\n */\nexport type ByteUnitSystem = \"binary\" | \"decimal\"\n\nexport interface FormatBytesOptions {\n /** Number of decimal places to display. Defaults to `2`. */\n decimals?: number\n /** Unit system to use. Defaults to `\"binary\"`. */\n unitSystem?: ByteUnitSystem\n}\n\nconst BINARY_UNITS = [\"B\", \"KiB\", \"MiB\", \"GiB\", \"TiB\", \"PiB\", \"EiB\", \"ZiB\", \"YiB\"] as const\nconst DECIMAL_UNITS = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"] as const\n\n/**\n * Formats a raw byte count into a human-readable string.\n *\n * @example\n * formatBytes(1536) // \"1.50 KiB\" (binary, default)\n * formatBytes(1500, { unitSystem: \"decimal\" }) // \"1.50 KB\"\n * formatBytes(1073741824) // \"1.00 GiB\"\n * formatBytes(0) // \"0 B\"\n * formatBytes(null) // \"0 B\"\n */\nexport function formatBytes(\n bytes: number | null | undefined,\n { decimals = 2, unitSystem = \"binary\" }: FormatBytesOptions = {}\n): string {\n if (!bytes || bytes === 0) return \"0 B\"\n\n const k = unitSystem === \"binary\" ? 1024 : 1000\n const units = unitSystem === \"binary\" ? BINARY_UNITS : DECIMAL_UNITS\n const dm = Math.max(0, decimals)\n\n const i = Math.min(Math.floor(Math.log(bytes) / Math.log(k)), units.length - 1)\n\n return `${Number.parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${units[i]}`\n}\n\n/**\n * Convenience wrapper that always uses the decimal (SI) unit system.\n *\n * @example\n * formatBytesDecimal(1500000) // \"1.50 MB\"\n */\nexport const formatBytesDecimal = (bytes: number | null | undefined, decimals?: number): string =>\n formatBytes(bytes, { decimals, unitSystem: \"decimal\" })\n\n/**\n * Convenience wrapper that always uses the binary (IEC) unit system.\n *\n * @example\n * formatBytesBinary(1048576) // \"1.00 MiB\"\n */\nexport const formatBytesBinary = (bytes: number | null | undefined, decimals?: number): string =>\n formatBytes(bytes, { decimals, unitSystem: \"binary\" })\n"],"mappings":";AAiBA,IAAMA,IAAe;CAAC;CAAK;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;CAAO;AAAM,GAC5EC,IAAgB;CAAC;CAAK;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;AAAK;AAY3E,SAAgBC,EACdC,GACA,EAAEC,cAAW,GAAGC,gBAAa,aAAiC,CAAC,GAAC;CAEhE,IAAI,CAACF,KAASA,MAAU,GAAG,OAAO;CAElC,IAAMG,IAAID,MAAe,WAAW,OAAO,KACrCE,IAAQF,MAAe,WAAWL,IAAeC,GACjDO,IAAKC,KAAKC,IAAI,GAAGN,CAAAA,GAEjBO,IAAIF,KAAKG,IAAIH,KAAKI,MAAMJ,KAAKK,IAAIX,CAAAA,IAASM,KAAKK,IAAIR,CAAAA,CAAAA,GAAKC,EAAMQ,SAAS,CAAA;CAE7E,OAAO,GAAGC,OAAOC,YAAYd,IAAiBG,MAAGK,EAAAA,CAAIQ,QAAQX,CAAAA,CAAAA,EAAK,GAAGD,EAAMI;AAC7E;AAQA,IAAaS,KAAsBjB,GAAkCC,MACnEF,EAAYC,GAAO;CAAEC;CAAUC,YAAY;AAAU,CAAA,GAQ1CgB,KAAqBlB,GAAkCC,MAClEF,EAAYC,GAAO;CAAEC;CAAUC,YAAY;AAAS,CAAA"}
@@ -1,6 +0,0 @@
1
- //#region src/server/Authentication/helpers/index.ts
2
- var e = (e) => e.reduce((e, t) => (e[t.type] || (e[t.type] = {}), e[t.type][t.name] = !0, e), {});
3
- //#endregion
4
- export { e as t };
5
-
6
- //# sourceMappingURL=helpers-1PpYf-fC.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"helpers-1PpYf-fC.mjs","names":["getServiceIndex","availableServices","reduce","acc","service","type","name"],"sources":["../../src/server/Authentication/helpers/index.ts"],"sourcesContent":["/**\n * Creates an indexed lookup object from a list of services, organized by service type.\n *\n * @param availableServices - Array of service objects containing name and type properties\n * @returns A nested object where the first level keys are service types, and second level\n * keys are service names with boolean values set to `true`. This structure enables\n * O(1) lookup to check if a specific service exists for a given type.\n */\nexport const getServiceIndex = (\n availableServices: {\n name: string\n type: string\n }[]\n) =>\n availableServices.reduce(\n (acc, service) => {\n if (!acc[service.type]) {\n acc[service.type] = {}\n }\n acc[service.type][service.name] = true\n return acc\n },\n {} as Record<string, Record<string, boolean>>\n )\n"],"mappings":";AAQA,IAAaA,KACXC,MAKAA,EAAkBC,QACfC,GAAKC,OACCD,EAAIC,EAAQC,UACfF,EAAIC,EAAQC,QAAQ,CAAC,IAEvBF,EAAIC,EAAQC,KAAK,CAACD,EAAQE,QAAQ,IAC3BH,IAET,CAAC,CAAA"}
@@ -1,22 +0,0 @@
1
- import { n as e } from "./AuthProvider-CVSAwW9f.mjs";
2
- import "./useProjectId-DBc5lpoU.mjs";
3
- import { useParams as t } from "@tanstack/react-router";
4
- //#region src/client/hooks/useDomainId.ts
5
- function n() {
6
- let { user: t } = e(), n = t?.domain?.id;
7
- if (!n) throw Error("useDomainId() requires an authenticated user with a domain. This is likely an authentication error. Ensure the user is logged in and has a domain assigned.");
8
- return n;
9
- }
10
- //#endregion
11
- //#region src/client/hooks/useScope.ts
12
- function r() {
13
- let n = e(), { projectId: r } = t({ strict: !1 });
14
- return {
15
- userDomainId: n.user?.domain?.id,
16
- projectId: r
17
- };
18
- }
19
- //#endregion
20
- export { n, r as t };
21
-
22
- //# sourceMappingURL=hooks-D0yKIumu.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hooks-D0yKIumu.mjs","names":["useAuth","useDomainId","user","domainId","domain","id","Error","useParams","useAuth","useScope","auth","projectId","strict","userDomainId","user","domain","id"],"sources":["../../src/client/hooks/useDomainId.ts","../../src/client/hooks/useScope.ts"],"sourcesContent":["import { useAuth } from \"@/client/store/AuthProvider\"\n\n/**\n * Get the current user's domain ID from the authentication context.\n *\n * This hook provides access to the domain ID of the currently authenticated user.\n * The domain ID is obtained from the user's session, not from URL parameters.\n *\n * @throws {Error} If user is not authenticated or domain ID is not available\n * @returns {string} The current domain ID from the user's session\n *\n * @example\n * ```tsx\n * function UsersList() {\n * const domainId = useDomainId()\n *\n * const { data } = trpc.identity.users.list.useQuery({\n * domain_id: domainId\n * })\n * }\n * ```\n */\nexport function useDomainId(): string {\n const { user } = useAuth()\n\n const domainId = user?.domain?.id\n\n if (!domainId) {\n throw new Error(\n \"useDomainId() requires an authenticated user with a domain. \" +\n \"This is likely an authentication error. \" +\n \"Ensure the user is logged in and has a domain assigned.\"\n )\n }\n\n return domainId\n}\n","import { useParams } from \"@tanstack/react-router\"\nimport { useAuth } from \"../store/AuthProvider\"\n\nexport function useScope() {\n const auth = useAuth()\n const { projectId } = useParams({ strict: false })\n\n const userDomainId = auth.user?.domain?.id\n return {\n userDomainId,\n projectId,\n }\n}\n"],"mappings":";;;;AAsBA,SAAgBC,IAAAA;CACd,IAAM,EAAEC,YAASF,EAAAA,GAEXG,IAAWD,GAAME,QAAQC;CAE/B,IAAI,CAACF,GACH,MAAUG,MACR,6JAEE;CAIN,OAAOH;AACT;;;ACjCA,SAAgBM,IAAAA;CACd,IAAMC,IAAOF,EAAAA,GACP,EAAEG,iBAAcJ,EAAU,EAAEK,QAAQ,GAAM,CAAA;CAGhD,OAAO;EACLC,cAFmBH,EAAKI,MAAMC,QAAQC;EAGtCL;CACF;AACF"}