@cobaltcore-dev/aurora 0.20.3 → 0.21.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 (66) hide show
  1. package/dist/client/AuthProvider-p1e1DuKU.mjs +69 -0
  2. package/dist/client/AuthProvider-p1e1DuKU.mjs.map +1 -0
  3. package/dist/client/DeleteFlavorModal-lFMExcq_.mjs +713 -0
  4. package/dist/client/DeleteFlavorModal-lFMExcq_.mjs.map +1 -0
  5. package/dist/client/{DeletePcaModal-YUlNw8cw.mjs → DeletePcaModal-Dg9dej-H.mjs} +2 -2
  6. package/dist/client/{DeletePcaModal-YUlNw8cw.mjs.map → DeletePcaModal-Dg9dej-H.mjs.map} +1 -1
  7. package/dist/client/{DetailsInfo-Cv3oke-R.mjs → DetailsInfo-DwCo9P1o.mjs} +2 -2
  8. package/dist/client/{DetailsInfo-Cv3oke-R.mjs.map → DetailsInfo-DwCo9P1o.mjs.map} +1 -1
  9. package/dist/client/{FloatingIpActionModals-PLN6CWZ9.mjs → FloatingIpActionModals-CDF8LVtX.mjs} +2 -2
  10. package/dist/client/{FloatingIpActionModals-PLN6CWZ9.mjs.map → FloatingIpActionModals-CDF8LVtX.mjs.map} +1 -1
  11. package/dist/client/{ImageToastNotifications-BQM7HOyE.mjs → ImageToastNotifications-Dzq6jNTm.mjs} +2 -2
  12. package/dist/client/{ImageToastNotifications-BQM7HOyE.mjs.map → ImageToastNotifications-Dzq6jNTm.mjs.map} +1 -1
  13. package/dist/client/{_auth-BtRCgHQe.mjs → _auth-Dut7CaMR.mjs} +2 -2
  14. package/dist/client/{_auth-BtRCgHQe.mjs.map → _auth-Dut7CaMR.mjs.map} +1 -1
  15. package/dist/client/{_flavorId-BaNJ1CDY.mjs → _flavorId-BsIWL0XK.mjs} +2 -2
  16. package/dist/client/{_flavorId-BaNJ1CDY.mjs.map → _flavorId-BsIWL0XK.mjs.map} +1 -1
  17. package/dist/client/{_flavorId-BMX239RH.mjs → _flavorId-Cu1nWwOq.mjs} +13 -14
  18. package/dist/client/{_flavorId-BMX239RH.mjs.map → _flavorId-Cu1nWwOq.mjs.map} +1 -1
  19. package/dist/client/{_floatingIpId-DQFtZNeg.mjs → _floatingIpId-8-UPUV8M.mjs} +2 -2
  20. package/dist/client/{_floatingIpId-DQFtZNeg.mjs.map → _floatingIpId-8-UPUV8M.mjs.map} +1 -1
  21. package/dist/client/{_floatingIpId-E6x99cmW.mjs → _floatingIpId-B_M3gyMA.mjs} +4 -4
  22. package/dist/client/{_floatingIpId-E6x99cmW.mjs.map → _floatingIpId-B_M3gyMA.mjs.map} +1 -1
  23. package/dist/client/{_imageId-C2662dZr.mjs → _imageId-D1Z0xIco.mjs} +2 -2
  24. package/dist/client/{_imageId-C2662dZr.mjs.map → _imageId-D1Z0xIco.mjs.map} +1 -1
  25. package/dist/client/{_pcaId-CNbmhUF8.mjs → _pcaId-BcwGho7g.mjs} +4 -4
  26. package/dist/client/{_pcaId-CNbmhUF8.mjs.map → _pcaId-BcwGho7g.mjs.map} +1 -1
  27. package/dist/client/{_securityGroupId-ju2ZSIYe.mjs → _securityGroupId-B5-gJe1u.mjs} +3 -3
  28. package/dist/client/{_securityGroupId-ju2ZSIYe.mjs.map → _securityGroupId-B5-gJe1u.mjs.map} +1 -1
  29. package/dist/client/{_securityGroupId-a46ExjsA.mjs → _securityGroupId-fPJWtDPU.mjs} +2 -2
  30. package/dist/client/{_securityGroupId-a46ExjsA.mjs.map → _securityGroupId-fPJWtDPU.mjs.map} +1 -1
  31. package/dist/client/{aurora-Owys0YMN.mjs → aurora-Dp_NPGe8.mjs} +2 -2
  32. package/dist/client/{aurora-Owys0YMN.mjs.map → aurora-Dp_NPGe8.mjs.map} +1 -1
  33. package/dist/client/components/Auth/LoginForm.d.ts +1 -0
  34. package/dist/client/{flavors-Bwjig3k2.mjs → flavors-CT1bHP61.mjs} +11 -12
  35. package/dist/client/{flavors-Bwjig3k2.mjs.map → flavors-CT1bHP61.mjs.map} +1 -1
  36. package/dist/client/{flavors-C7PVJUqZ.mjs → flavors-q1j-y3e-.mjs} +2 -2
  37. package/dist/client/{flavors-C7PVJUqZ.mjs.map → flavors-q1j-y3e-.mjs.map} +1 -1
  38. package/dist/client/{floatingips-D98DrjA0.mjs → floatingips-DC5OrR8h.mjs} +3 -3
  39. package/dist/client/{floatingips-D98DrjA0.mjs.map → floatingips-DC5OrR8h.mjs.map} +1 -1
  40. package/dist/client/{hooks-BsbKkpZc.mjs → hooks-D0wGUhRF.mjs} +2 -2
  41. package/dist/client/{hooks-BsbKkpZc.mjs.map → hooks-D0wGUhRF.mjs.map} +1 -1
  42. package/dist/client/{images-CfBrglGJ.mjs → images-BklcxYWi.mjs} +4 -4
  43. package/dist/client/{images-CfBrglGJ.mjs.map → images-BklcxYWi.mjs.map} +1 -1
  44. package/dist/client/{images-CD7DNwru.mjs → images-CPYewah0.mjs} +2 -2
  45. package/dist/client/{images-CD7DNwru.mjs.map → images-CPYewah0.mjs.map} +1 -1
  46. package/dist/client/index.js +290 -491
  47. package/dist/client/index.js.map +1 -1
  48. package/dist/client/{pca-ZgGU0UPF.mjs → pca-BAuZA0K3.mjs} +2 -2
  49. package/dist/client/{pca-ZgGU0UPF.mjs.map → pca-BAuZA0K3.mjs.map} +1 -1
  50. package/dist/client/{pca-CpMqoF00.mjs → pca-Ddk0YfgK.mjs} +4 -4
  51. package/dist/client/{pca-CpMqoF00.mjs.map → pca-Ddk0YfgK.mjs.map} +1 -1
  52. package/dist/client/routes-BzBTVAjK.mjs +105 -0
  53. package/dist/client/routes-BzBTVAjK.mjs.map +1 -0
  54. package/dist/client/routes-DsisKFfG.mjs +10 -0
  55. package/dist/client/routes-DsisKFfG.mjs.map +1 -0
  56. package/dist/client/{securitygroups-BwhVyNmZ.mjs → securitygroups-JMvcJLpb.mjs} +2 -2
  57. package/dist/client/{securitygroups-BwhVyNmZ.mjs.map → securitygroups-JMvcJLpb.mjs.map} +1 -1
  58. package/dist/client/store/AuthProvider.d.ts +10 -11
  59. package/dist/server/index.js +1 -10
  60. package/package.json +3 -4
  61. package/dist/client/AuthProvider-Cj_Btfnc.mjs +0 -56
  62. package/dist/client/AuthProvider-Cj_Btfnc.mjs.map +0 -1
  63. package/dist/client/DeleteFlavorModal-Dwm0Hh84.mjs +0 -638
  64. package/dist/client/DeleteFlavorModal-Dwm0Hh84.mjs.map +0 -1
  65. package/dist/client/useErrorTranslation-Dc0eE8Zt.mjs +0 -83
  66. package/dist/client/useErrorTranslation-Dc0eE8Zt.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"floatingips-D98DrjA0.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","ContentHeading","Stack","Spinner","FloatingIpTableRow","TABLE_COLUMNS","FloatingIpListContainer","floatingIps","isLoading","isError","error","useLingui","columns","className","distribution","alignment","direction","variant","size","message","t","length","data-testid","colSpan","p","map","label","ip","floatingIp","id","z","useForm","useStore","Modal","Form","FormSection","Spinner","Message","Textarea","TextInput","Select","SelectOption","trpcReact","useProjectId","ipv4Regex","ipv6Regex","isValidIpAddress","value","test","dnsNameRegex","AllocateFloatingIpModal","open","onClose","useLingui","projectId","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","mutateAsync","tenant_id","handleClose","reset","currentPortId","store","state","values","currentFloatingNetworkId","selectedPort","find","port","id","portFixedIps","fixed_ips","formErrorMessage","size","title","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","dismissible","variant","className","div","span","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","Button","ListToolbar","trpcReact","buildFilterParams","useListWithFiltering","useModal","useProjectId","FloatingIpListContainer","AllocateFloatingIpModal","DEFAULT_SORT_KEY","DEFAULT_SORT_DIR","FloatingIpsList","useLingui","projectId","allocateModalOpen","toggleAllocateModal","searchTerm","handleSearchChange","sortSettings","handleSortChange","filterSettings","handleFilterChange","defaultSortKey","defaultSortDir","sortOptions","label","t","value","filters","displayName","filterName","values","supportsMultiValue","data","floatingIps","isLoading","isError","error","network","floatingIp","list","useQuery","project_id","sort_key","sortBy","sort_dir","sortDirection","div","className","onSearch","onSort","onFilter","actions","variant","onClick","open","onClose","useLingui","FloatingIpsList","ContentHeading","Route","RouteComponent","t","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/-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 \"Preview\", \"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>{floatingIp.description || \"—\"}</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`Preview`} 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 { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n DataGrid,\n DataGridHeadCell,\n DataGridRow,\n DataGridCell,\n ContentHeading,\n Stack,\n Spinner,\n} 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\n if (isLoading) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading...</Trans>\n </Stack>\n )\n }\n\n if (isError) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n {error?.message ?? t`Failed to load Floating IPs`}\n </Stack>\n )\n }\n\n if (floatingIps.length === 0) {\n return (\n <DataGrid columns={columns.length} className=\"floating-ips\" data-testid=\"no-floating-ips\">\n <DataGridRow>\n <DataGridCell colSpan={columns.length}>\n <ContentHeading>\n <Trans>No Floating IPs found</Trans>\n </ContentHeading>\n <p>\n <Trans>\n There are no Floating IPs available for this project. Floating IPs allow you to map public IP addresses\n to instances.\n </Trans>\n </p>\n </DataGridCell>\n </DataGridRow>\n </DataGrid>\n )\n }\n\n return (\n <DataGrid columns={columns.length}>\n <DataGridRow>\n {columns.map((label) => (\n <DataGridHeadCell key={label}>{label}</DataGridHeadCell>\n ))}\n </DataGridRow>\n {floatingIps.map((ip) => (\n <FloatingIpTableRow key={ip.id} floatingIp={ip} />\n ))}\n </DataGrid>\n )\n}\n","import { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n Modal,\n Form,\n FormSection,\n Spinner,\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 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 await createFloatingIpMutation.mutateAsync({\n project_id: projectId,\n tenant_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 },\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 >\n {formErrorMessage && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {formErrorMessage}\n </Message>\n )}\n\n {isPending && (\n <div className=\"mb-4 flex items-center justify-center gap-2\">\n <Spinner variant=\"primary\" />\n <span className=\"text-theme-high text-sm\">\n <Trans>Allocating Floating IP...</Trans>\n </span>\n </div>\n )}\n\n {!isPending && (\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 { useLingui } from \"@lingui/react/macro\"\nimport { Button } from \"@cloudoperators/juno-ui-components\"\nimport { FloatingIpQueryParameters } from \"@/server/Network/types/floatingIp\"\nimport { ListToolbar } from \"@/client/components/ListToolbar\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { buildFilterParams } from \"@/client/utils/buildFilterParams\"\nimport { useListWithFiltering } from \"@/client/utils/useListWithFiltering\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { FloatingIpListContainer } from \"./-table/FloatingIpListContainer\"\nimport { AllocateFloatingIpModal } from \"./-modals/AllocateFloatingIpModal\"\n\nconst DEFAULT_SORT_KEY = \"fixed_ip_address\"\nconst DEFAULT_SORT_DIR = \"asc\"\nexport type FloatingIpsSortKey = NonNullable<FloatingIpQueryParameters[\"sort_key\"]>\n\nexport const FloatingIpsList = () => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const [allocateModalOpen, toggleAllocateModal] = useModal(false)\n\n const { searchTerm, handleSearchChange, sortSettings, handleSortChange, filterSettings, handleFilterChange } =\n useListWithFiltering<FloatingIpsSortKey>({\n defaultSortKey: DEFAULT_SORT_KEY,\n defaultSortDir: DEFAULT_SORT_DIR,\n sortOptions: [\n { label: t`Fixed IP Address`, value: \"fixed_ip_address\" },\n { label: t`Floating IP Address`, value: \"floating_ip_address\" },\n { label: t`Floating Network ID`, value: \"floating_network_id\" },\n { label: t`ID`, value: \"id\" },\n { label: t`Router ID`, value: \"router_id\" },\n { label: t`Status`, value: \"status\" },\n // Tenant_id was kept for backward compatibility in case the deprecated tenant ID was used to sort instead of the project ID.\n { label: t`Tenant ID`, value: \"tenant_id\" },\n { label: t`Project ID`, value: \"project_id\" },\n ],\n filterSettings: {\n filters: [\n {\n displayName: t`Status`,\n filterName: \"status\",\n values: [\"ACTIVE\", \"DOWN\", \"ERROR\"],\n supportsMultiValue: false,\n },\n ],\n },\n })\n\n const {\n data: floatingIps = [],\n isLoading,\n isError,\n error,\n } = trpcReact.network.floatingIp.list.useQuery({\n project_id: projectId,\n sort_key: sortSettings.sortBy,\n sort_dir: sortSettings.sortDirection,\n ...buildFilterParams(filterSettings),\n ...(searchTerm ? { searchTerm } : {}),\n })\n\n return (\n <div className=\"relative\">\n <ListToolbar\n searchTerm={searchTerm}\n onSearch={handleSearchChange}\n sortSettings={sortSettings}\n onSort={handleSortChange}\n filterSettings={filterSettings}\n onFilter={handleFilterChange}\n actions={<Button variant=\"primary\" label={t`Allocate Floating IP`} onClick={toggleAllocateModal} />}\n />\n\n <FloatingIpListContainer floatingIps={floatingIps} isLoading={isLoading} isError={isError} error={error} />\n\n {allocateModalOpen && <AllocateFloatingIpModal open={allocateModalOpen} onClose={toggleAllocateModal} />}\n </div>\n )\n}\n","import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { FloatingIpsList } from \"./-components/FloatingIpsList\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeading } from \"@cloudoperators/juno-ui-components\"\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 sectionCrumb: { labelKey: \"Network\" },\n crumb: { labelKey: \"Floating IPs\" },\n } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`Floating IPs` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n return (\n <>\n <ContentHeading>{t`Floating IPs`}</ContentHeading>\n <FloatingIpsList />\n </>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"floatingips-DC5OrR8h.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","ContentHeading","Stack","Spinner","FloatingIpTableRow","TABLE_COLUMNS","FloatingIpListContainer","floatingIps","isLoading","isError","error","useLingui","columns","className","distribution","alignment","direction","variant","size","message","t","length","data-testid","colSpan","p","map","label","ip","floatingIp","id","z","useForm","useStore","Modal","Form","FormSection","Spinner","Message","Textarea","TextInput","Select","SelectOption","trpcReact","useProjectId","ipv4Regex","ipv6Regex","isValidIpAddress","value","test","dnsNameRegex","AllocateFloatingIpModal","open","onClose","useLingui","projectId","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","mutateAsync","tenant_id","handleClose","reset","currentPortId","store","state","values","currentFloatingNetworkId","selectedPort","find","port","id","portFixedIps","fixed_ips","formErrorMessage","size","title","onCancel","cancelButtonLabel","confirmButtonLabel","onConfirm","handleSubmit","disableConfirmButton","dismissible","variant","className","div","span","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","Button","ListToolbar","trpcReact","buildFilterParams","useListWithFiltering","useModal","useProjectId","FloatingIpListContainer","AllocateFloatingIpModal","DEFAULT_SORT_KEY","DEFAULT_SORT_DIR","FloatingIpsList","useLingui","projectId","allocateModalOpen","toggleAllocateModal","searchTerm","handleSearchChange","sortSettings","handleSortChange","filterSettings","handleFilterChange","defaultSortKey","defaultSortDir","sortOptions","label","t","value","filters","displayName","filterName","values","supportsMultiValue","data","floatingIps","isLoading","isError","error","network","floatingIp","list","useQuery","project_id","sort_key","sortBy","sort_dir","sortDirection","div","className","onSearch","onSort","onFilter","actions","variant","onClick","open","onClose","useLingui","FloatingIpsList","ContentHeading","Route","RouteComponent","t","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/-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 \"Preview\", \"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>{floatingIp.description || \"—\"}</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`Preview`} 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 { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n DataGrid,\n DataGridHeadCell,\n DataGridRow,\n DataGridCell,\n ContentHeading,\n Stack,\n Spinner,\n} 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\n if (isLoading) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n <Spinner variant=\"primary\" size=\"large\" className=\"mb-2\" />\n <Trans>Loading...</Trans>\n </Stack>\n )\n }\n\n if (isError) {\n return (\n <Stack className=\"py-8\" distribution=\"center\" alignment=\"center\" direction=\"vertical\">\n {error?.message ?? t`Failed to load Floating IPs`}\n </Stack>\n )\n }\n\n if (floatingIps.length === 0) {\n return (\n <DataGrid columns={columns.length} className=\"floating-ips\" data-testid=\"no-floating-ips\">\n <DataGridRow>\n <DataGridCell colSpan={columns.length}>\n <ContentHeading>\n <Trans>No Floating IPs found</Trans>\n </ContentHeading>\n <p>\n <Trans>\n There are no Floating IPs available for this project. Floating IPs allow you to map public IP addresses\n to instances.\n </Trans>\n </p>\n </DataGridCell>\n </DataGridRow>\n </DataGrid>\n )\n }\n\n return (\n <DataGrid columns={columns.length}>\n <DataGridRow>\n {columns.map((label) => (\n <DataGridHeadCell key={label}>{label}</DataGridHeadCell>\n ))}\n </DataGridRow>\n {floatingIps.map((ip) => (\n <FloatingIpTableRow key={ip.id} floatingIp={ip} />\n ))}\n </DataGrid>\n )\n}\n","import { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n Modal,\n Form,\n FormSection,\n Spinner,\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 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 await createFloatingIpMutation.mutateAsync({\n project_id: projectId,\n tenant_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 },\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 >\n {formErrorMessage && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {formErrorMessage}\n </Message>\n )}\n\n {isPending && (\n <div className=\"mb-4 flex items-center justify-center gap-2\">\n <Spinner variant=\"primary\" />\n <span className=\"text-theme-high text-sm\">\n <Trans>Allocating Floating IP...</Trans>\n </span>\n </div>\n )}\n\n {!isPending && (\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 { useLingui } from \"@lingui/react/macro\"\nimport { Button } from \"@cloudoperators/juno-ui-components\"\nimport { FloatingIpQueryParameters } from \"@/server/Network/types/floatingIp\"\nimport { ListToolbar } from \"@/client/components/ListToolbar\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { buildFilterParams } from \"@/client/utils/buildFilterParams\"\nimport { useListWithFiltering } from \"@/client/utils/useListWithFiltering\"\nimport { useModal } from \"@/client/utils/useModal\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { FloatingIpListContainer } from \"./-table/FloatingIpListContainer\"\nimport { AllocateFloatingIpModal } from \"./-modals/AllocateFloatingIpModal\"\n\nconst DEFAULT_SORT_KEY = \"fixed_ip_address\"\nconst DEFAULT_SORT_DIR = \"asc\"\nexport type FloatingIpsSortKey = NonNullable<FloatingIpQueryParameters[\"sort_key\"]>\n\nexport const FloatingIpsList = () => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const [allocateModalOpen, toggleAllocateModal] = useModal(false)\n\n const { searchTerm, handleSearchChange, sortSettings, handleSortChange, filterSettings, handleFilterChange } =\n useListWithFiltering<FloatingIpsSortKey>({\n defaultSortKey: DEFAULT_SORT_KEY,\n defaultSortDir: DEFAULT_SORT_DIR,\n sortOptions: [\n { label: t`Fixed IP Address`, value: \"fixed_ip_address\" },\n { label: t`Floating IP Address`, value: \"floating_ip_address\" },\n { label: t`Floating Network ID`, value: \"floating_network_id\" },\n { label: t`ID`, value: \"id\" },\n { label: t`Router ID`, value: \"router_id\" },\n { label: t`Status`, value: \"status\" },\n // Tenant_id was kept for backward compatibility in case the deprecated tenant ID was used to sort instead of the project ID.\n { label: t`Tenant ID`, value: \"tenant_id\" },\n { label: t`Project ID`, value: \"project_id\" },\n ],\n filterSettings: {\n filters: [\n {\n displayName: t`Status`,\n filterName: \"status\",\n values: [\"ACTIVE\", \"DOWN\", \"ERROR\"],\n supportsMultiValue: false,\n },\n ],\n },\n })\n\n const {\n data: floatingIps = [],\n isLoading,\n isError,\n error,\n } = trpcReact.network.floatingIp.list.useQuery({\n project_id: projectId,\n sort_key: sortSettings.sortBy,\n sort_dir: sortSettings.sortDirection,\n ...buildFilterParams(filterSettings),\n ...(searchTerm ? { searchTerm } : {}),\n })\n\n return (\n <div className=\"relative\">\n <ListToolbar\n searchTerm={searchTerm}\n onSearch={handleSearchChange}\n sortSettings={sortSettings}\n onSort={handleSortChange}\n filterSettings={filterSettings}\n onFilter={handleFilterChange}\n actions={<Button variant=\"primary\" label={t`Allocate Floating IP`} onClick={toggleAllocateModal} />}\n />\n\n <FloatingIpListContainer floatingIps={floatingIps} isLoading={isLoading} isError={isError} error={error} />\n\n {allocateModalOpen && <AllocateFloatingIpModal open={allocateModalOpen} onClose={toggleAllocateModal} />}\n </div>\n )\n}\n","import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { FloatingIpsList } from \"./-components/FloatingIpsList\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\nimport { ContentHeading } from \"@cloudoperators/juno-ui-components\"\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 sectionCrumb: { labelKey: \"Network\" },\n crumb: { labelKey: \"Floating IPs\" },\n } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`Floating IPs` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { t } = useLingui()\n return (\n <>\n <ContentHeading>{t`Floating IPs`}</ContentHeading>\n <FloatingIpsList />\n </>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;AASA,IAAaG,IAAmE;CAC9EC,QAAQ;EACNC,MAAM;EACNC,MAAM,gBAACJ,GAAAA;GAAcK,MAAM;GAAIC,OAAM;GAAQC,MAAK;;CACpD;CACAC,MAAM;EACJL,MAAM;EACNC,MAAM,gBAACL,GAAAA;GAAeM,MAAM;GAAIC,OAAM;GAAQC,MAAK;;CACrD;CACAE,OAAO;EACLN,MAAM;EACNC,MAAM,gBAACN,GAAAA;GAAQO,MAAM;GAAIC,OAAM;GAAQC,MAAK;;CAC9C;AACF,GAEaG,UACX;CACEC,EAAAA,EAAC,EAAA,IAAA,SAAO,CAAA;CACRA,EAAAA,EAAC,EAAA,IAAA,SAAoB,CAAA;CACrBA,EAAAA,EAAC,EAAA,IAAA,SAAiB,CAAA;CAClBA,EAAAA,EAAC,EAAA,IAAA,SAAO,CAAA;CACRA,EAAAA,EAAC,EAAA,IAAA,SAAY,CAAA;CACb;GCbSU,KAAsB,EAAEC,oBAAqC;CACxE,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,EAAAA,GACRC,IAAWZ,EAAAA,GACXa,IAAYL,EAAAA,GAEZM,UAAwB;EAC5BF,EAAS;GACPG,IAAI;GACJC,QAAQ;IAAEH;IAAWI,cAAcP,EAAWQ;GAAG;EACnD,CAAA;CACF;CAEA,OACE,gBAAChB,GAAAA;EAAgCiB,eAAa,mBAAmBT,EAAWQ;EAAME,SAASN;;GACzF,gBAACb,GAAAA,EAAAA,UACC,gBAACoB,OAAAA;IAAIC,WAAU;eACZhB,EAAcI,EAAWa,QAAQC,MACjClB,EAAcI,EAAWa,QAAQE,IAAAA;;GAGtC,gBAACxB,GAAAA,EAAAA,UAAcS,EAAWgB,oBAAAA,CAAAA;GAC1B,gBAACzB,GAAAA,EAAAA,UAAcS,EAAWiB,oBAAoB,IAAA,CAAA;GAC9C,gBAAC1B,GAAAA,EAAAA,UAAcS,EAAWkB,oBAAAA,CAAAA;GAC1B,gBAAC3B,GAAAA,EAAAA,UAAcS,EAAWmB,eAAe,IAAA,CAAA;GACzC,gBAAC5B,GAAAA;IAAamB,UAAUU,MAAMA,EAAEC,gBAAe;IAAIT,WAAU;cAC3D,gBAACf,GAAAA;KAAmCG;gBAChC,EAAEsB,oBAAiBC,sBAAmBC,sBAAmBC,4BACzD,gBAAChC,GAAAA,EAAAA,UACC,gBAACE,GAAAA,EAAAA,UAAAA;MACC,gBAACD,GAAAA;OAAcgC,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAQ,CAAA;OAAGjB,SAASN;;MAC3C,gBAACV,GAAAA;OAAcgC,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAiB,CAAA;OAAGjB,SAASY;;MACpD,gBAAC5B,GAAAA;OAAcgC,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAO,CAAA;OAAGjB,SAASa;;MAC1C,gBAAC7B,GAAAA;OAAcgC,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAO,CAAA;OAAGjB,SAASc;;MAC1C,gBAAC9B,GAAAA;OAAcgC,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAQ,CAAA;OAAGjB,SAASe;;;;;;IApBrCzB,EAAWQ,EAAE;AA4BnC,GCtCa6B,KAA2B,EAAEC,gBAAaC,cAAWC,YAASC,eAAqC;CAC9G,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,EAAAA,GACRC,IAAUP,EAAAA;CAuChB,OArCIG,IAEA,gBAACN,GAAAA;EAAMW,WAAU;EAAOC,cAAa;EAASC,WAAU;EAASC,WAAU;aACzE,gBAACb,GAAAA;GAAQc,SAAQ;GAAUC,MAAK;GAAQL,WAAU;MAClD,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA,CAAA;MAKFJ,IAEA,gBAACP,GAAAA;EAAMW,WAAU;EAAOC,cAAa;EAASC,WAAU;EAASC,WAAU;YACxEN,GAAOS,WAAWC,EAAAA,EAAC,EAAA,IAAA,SAA4B,CAAA;MAKlDb,EAAYc,WAAW,IAEvB,gBAACxB,GAAAA;EAASe,SAASA,EAAQS;EAAQR,WAAU;EAAeS,eAAY;YACtE,gBAACvB,GAAAA,EAAAA,UACC,gBAACC,GAAAA;GAAauB,SAASX,EAAQS;cAC7B,gBAACpB,GAAAA,EAAAA,UACC,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA,EAAA,CAAA,GAEF,gBAACuB,KAAAA,EAAAA,UACC,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA,EAAA,CAAA,CAAA;;MAYV,gBAAC3B,GAAAA;EAASe,SAASA,EAAQS;aACzB,gBAACtB,GAAAA,EAAAA,UACEa,EAAQa,KAAKC,MACZ,gBAAC5B,GAAAA,EAAAA,UAA8B4B,EAAAA,GAARA,CAAAA,CAAAA,EAAAA,CAAAA,GAG1BnB,EAAYkB,KAAKE,MAChB,gBAACvB,GAAAA,EAA+BwB,YAAYD,EAAAA,GAAnBA,EAAGE,EAAE,CAAA,CAAA;;AAItC,GCpDMe,IAAY,+EACZC,IACJ,4lBACIC,KAAoBC,MAAkBH,EAAUI,KAAKD,CAAAA,KAAUF,EAAUG,KAAKD,CAAAA,GAC9EE,IAAe,iGAERC,KAA2B,EAAEC,SAAMC,iBAAuC;CACrF,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,EAAAA,GACRC,IAAYX,EAAAA,GACZY,IAAQb,EAAUc,SAAQ,GAE1B,EAAEC,cAAW,GAAGC,MAA6BhB,EAAUiB,QAAQC,WAAWC,OAAOC,YAAY,EACjGC,iBAAiBR,EAAMI,QAAQC,WAAWI,KAAKC,WAAU,EAC3D,CAAA,GAEM,EACJC,MAAMC,IAAmB,CAAA,GACzBC,WAAWC,GACXC,OAAOC,MACL7B,EAAUiB,QAAQC,WAAWY,qBAAqBC,SAAS,EAAEC,YAAYpB,EAAU,CAAA,GAEjF,EACJY,MAAMS,IAAa,CAAA,GACnBP,WAAWQ,GACXN,OAAOO,MACLnC,EAAUiB,QAAQC,WAAWkB,eAAeL,SAAS,EAAEC,YAAYpB,EAAU,CAAA,GAE3E,EACJY,MAAMa,IAAiB,CAAA,GACvBX,WAAWY,GACXV,OAAOW,MACLvC,EAAUiB,QAAQC,WAAWsB,mBAAmBT,SAAS,EAAEC,YAAYpB,EAAU,CAAA,GA0B/E4C,IAAOnE,EAAQ;EACnBoE,eAAe;GACbd,qBAAqB;GACrBE,YAAY;GACZC,UAAU;GACVM,aAAa;GACbC,qBAAqB;GACrBC,SAAS;GACTC,kBAAkB;EACpB;EACAG,YAAY,EACVC,UAnCevE,EAAEsD,OAAO;GAC1BC,qBAAqBvD,EAAEwD,OAAM;GAC7BC,YAAYzD,EAAEwD,OAAM;GACpBE,UAAU1D,EACPwD,OAAM,EACNG,KAAI,EACJC,IAAI,IAAIC,EAAAA,EAAC,EAAA,IAAA,SAAwC,CAAA,CAAA,EACjDC,QAAQ7C,MAAUA,MAAU,MAAME,EAAaD,KAAKD,CAAAA,GAAQ,EAC3D8C,SAASF,EAAAA,EAAC,EAAA,IAAA,SAA+F,CAAA,EAC3G,CAAA;GACFG,aAAahE,EACVwD,OAAM,EACNG,KAAI,EACJC,IAAI,KAAKC,EAAAA,EAAC,EAAA,IAAA,SAA4C,CAAA,CAAA;GACzDI,qBAAqBjE,EAClBwD,OAAM,EACNG,KAAI,EACJG,QAAQ7C,MAAUA,MAAU,MAAMD,EAAiBC,CAAAA,GAAQ,EAC1D8C,SAASF,EAAAA,EAAC,EAAA,IAAA,SAAiF,CAAA,EAC7F,CAAA;GACFK,SAASlE,EAAEwD,OAAM;GACjBW,kBAAkBnE,EAAEwD,OAAM;EAC5B,CAacH,EACZ;EACAkB,UAAU,OAAO,EAAEtD,eAAO;GACpBU,MAEJ,MAAMC,EAAyB4C,YAAY;IACzC5B,YAAYpB;IACZiD,WAAWjD;IACX+B,qBAAqBtC,EAAMsC;IAC3B,GAAItC,EAAMwC,cAAc,EAAEA,YAAYxC,EAAMwC,WAAW;IACvD,GAAIxC,EAAMyC,YAAY,EAAEA,UAAUzC,EAAMyC,SAAS;IACjD,GAAIzC,EAAM+C,eAAe,EAAEA,aAAa/C,EAAM+C,YAAY;IAC1D,GAAI/C,EAAMgD,uBAAuB,EAAEA,qBAAqBhD,EAAMgD,oBAAoB;IAClF,GAAIhD,EAAMiD,WAAW,EAAEA,SAASjD,EAAMiD,QAAQ;IAC9C,GAAIjD,EAAMkD,oBAAoB,EAAEA,kBAAkBlD,EAAMkD,iBAAiB;GAC3E,CAAA,GACAO,EAAAA;EACF;CACF,CAAA,GAEMA,UAAc;EACd/C,MAEJyC,EAAKO,MAAK,GACV/C,EAAyB+C,MAAK,GAC9BrD,EAAAA;CACF,GAEMsD,IAAgB1E,EAASkE,EAAKS,QAAQC,MAAUA,EAAMC,OAAOb,OAAO,GACpEc,IAA2B9E,EAASkE,EAAKS,QAAQC,MAAUA,EAAMC,OAAOxB,mBAAmB,GAE3F8B,IADepC,EAAeiC,MAAMC,MAASA,EAAKC,OAAOR,CAC1CK,GAAcK,aAAa,CAAA,GAE1CC,KACH9C,GAAuBsB,WAAWhB,GAAiBgB,WAAWZ,GAAYY,YAC3EnC,EAAyBY,OAAOuB,WAChC;CAEF,OACE,gBAAC5D,GAAAA;EACOkB;EACNmE,MAAK;EACLC,OAAO5B,EAAAA,EAAC,EAAA,IAAA,SAAqB,CAAA;EAC7B6B,UAAUhB;EACViB,mBAAmB9B,EAAAA,EAAC,EAAA,IAAA,SAAO,CAAA;EAC3B+B,oBAAoB/B,EAAAA,EAAC,EAAA,IAAA,SAAS,CAAA;EAC9BgC,WAAWzB,EAAK0B;EAChBC,sBAAsBpE,KAAa,CAACqD;;GAEnCO,KACC,gBAAChF,GAAAA;IAAQyF,aAAa;IAAOC,SAAQ;IAAQC,WAAU;cACpDX;;GAIJ5D,KACC,gBAACwE,OAAAA;IAAID,WAAU;eACb,gBAAC5F,GAAAA,EAAQ2F,SAAQ,UAAA,CAAA,GACjB,gBAACG,QAAAA;KAAKF,WAAU;eACd,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;;GAKL,CAACvE,KACA,gBAACvB,GAAAA;IACC8F,WAAU;IACVd,IAAG;IACHb,WAAW8B,MAAAA;KAETjC,AADAiC,EAAEC,eAAc,GAChBlC,EAAK0B,aAAY;IACnB;;KAEA,gBAACzF,GAAAA;MAAY6F,WAAU;gBACrB,gBAAC9B,EAAKmC,OAAK;OACTC,MAAK;OACLC,WAAWC,MACT,gBAAChG,GAAAA;QACC0E,IAAIsB,EAAMF;QACVA,MAAME,EAAMF;QACZvF,OAAOyF,EAAM5B,MAAM7D;QACnB0F,WAAW1F,MAAUyF,EAAME,aAAa,OAAO3F,KAAU,WAAWA,IAAQ,EAAA;QAC5E4F,OAAOhD,EAAAA,EAAC,EAAA,IAAA,SAAiB,CAAA;QACzBiD,UAAUjD,EAAAA,EAAC,EAAA,IAAA,SAAuD,CAAA;QAClEkD,aAAalD,EAAAA,EAAC,EAAA,IAAA,SAA2B,CAAA;QACzCmD,UAAUrF,KAAaY;QACvB0E,UAAQ;QACRC,SAAS3E;kBAERF,EAAiB8E,KAAK,EAAE/B,OAAIoB,cAC3B,gBAAC7F,GAAAA;SAAsBM,OAAOmE;SAAIyB,OAAOL,IAAO,GAAGA,EAAK,IAAIpB,EAAG,KAAKA;WAAjDA,CAAAA,CAAAA;;;;KAM7B,gBAAC/E,GAAAA;MAAY6F,WAAU;gBACrB,gBAAC9B,EAAKmC,OAAK;OACTC,MAAK;OACLC,WAAWC,MACT,gBAAChG,GAAAA;QACC0E,IAAIsB,EAAMF;QACVA,MAAME,EAAMF;QACZvF,OAAOyF,EAAM5B,MAAM7D;QACnB0F,WAAW1F,MAAUyF,EAAME,aAAa,OAAO3F,KAAU,WAAWA,IAAQ,EAAA;QAC5E4F,OAAOhD,EAAAA,EAAC,EAAA,IAAA,SAAW,CAAA;QACnBiD,UAAUjD,EAAAA,EAAC,EAAA,IAAA,SAAqB,CAAA;QAChCmD,UAAUrF,KAAamB;QACvBoE,SAASpE;kBAERD,EAAWsE,KAAK,EAAE/B,OAAIoB,cACrB,gBAAC7F,GAAAA;SAAsBM,OAAOuF;SAAMK,OAAOL;WAAxBpB,CAAAA,CAAAA;;;;KAM7B,gBAAC/E,GAAAA;MAAY6F,WAAU;gBACrB,gBAAC9B,EAAKmC,OAAK;OACTC,MAAK;OACLC,WAAWC,MACT,gBAACjG,GAAAA;QACC2E,IAAIsB,EAAMF;QACVA,MAAME,EAAMF;QACZvF,OAAOyF,EAAM5B,MAAM7D;QACnBmG,QAAQV,EAAMW;QACdV,WAAWN,MAAMK,EAAME,aAAaP,EAAEiB,OAAOrG,KAAK;QAClD4F,OAAOhD,EAAAA,EAAC,EAAA,IAAA,SAAS,CAAA;QACjBkD,aAAalD,EAAAA,EAAC,EAAA,IAAA,SAAe,CAAA;QAC7BiD,UAAUjD,EAAAA,EAAC,EAAA,IAAA,SAA+H,CAAA;QAC1I0D,WAAWb,EAAM5B,MAAM0C,KAAKC,OAAON,KAAKd,MAAMA,GAAGtC,OAAAA,EAAS2D,KAAK,IAAA;QAC/DV,UAAUrF;;;;KAKlB,gBAACtB,GAAAA;MAAY6F,WAAU;gBACrB,gBAAC9B,EAAKmC,OAAK;OACTC,MAAK;OACLC,WAAWC,MACT,gBAAClG,GAAAA;QACC4E,IAAIsB,EAAMF;QACVA,MAAME,EAAMF;QACZvF,OAAOyF,EAAM5B,MAAM7D;QACnBmG,QAAQV,EAAMW;QACdV,WAAWN,MAAMK,EAAME,aAAaP,EAAEiB,OAAOrG,KAAK;QAClD8F,aAAalD,EAAAA,EAAC,EAAA,IAAA,SAAY,CAAA;QAC1B0D,WAAWb,EAAM5B,MAAM0C,KAAKC,OAAON,KAAKd,MAAMA,GAAGtC,OAAAA,EAAS2D,KAAK,IAAA;QAC/DV,UAAUrF;;;;KAKlB,gBAACtB,GAAAA;MAAY6F,WAAU;gBACrB,gBAAC9B,EAAKmC,OAAK;OACTC,MAAK;OACLC,WAAWC,MACT,gBAACjG,GAAAA;QACC2E,IAAIsB,EAAMF;QACVA,MAAME,EAAMF;QACZvF,OAAOyF,EAAM5B,MAAM7D;QACnBmG,QAAQV,EAAMW;QACdV,WAAWN,MAAMK,EAAME,aAAaP,EAAEiB,OAAOrG,KAAK;QAClD4F,OAAOhD,EAAAA,EAAC,EAAA,IAAA,SAAoB,CAAA;QAC5BkD,aAAalD,EAAAA,EAAC,EAAA,IAAA,SAAoB,CAAA;QAClCiD,UAAUjD,EAAAA,EAAC,EAAA,IAAA,SAAsD,CAAA;QACjE0D,WAAWb,EAAM5B,MAAM0C,KAAKC,OAAON,KAAKd,MAAMA,GAAGtC,OAAAA,EAAS2D,KAAK,IAAA;QAC/DV,UAAUrF;;;;KAKlB,gBAACtB,GAAAA;MAAY6F,WAAU;gBACrB,gBAAC9B,EAAKmC,OAAK;OACTC,MAAK;OACLC,WAAWC,MACT,gBAAChG,GAAAA;QACC0E,IAAIsB,EAAMF;QACVA,MAAME,EAAMF;QACZvF,OAAOyF,EAAM5B,MAAM7D;QACnB0F,WAAW1F,MAAAA;SACT,IAAM0G,IAAS,OAAO1G,KAAU,WAAWA,IAAQ;SACnDyF,EAAME,aAAae,CAAAA;SAEnB,IAAME,IADO5E,EAAeiC,MAAM0C,MAAMA,EAAExC,OAAOuC,CACrCxC,GAAMG,aAAa,CAAA;SAC/BlB,EAAK0D,cAAc,oBAAoBD,EAAIE,WAAW,IAAIF,EAAI,GAAGG,aAAa,EAAA;QAChF;QACAnB,OAAOhD,EAAAA,EAAC,EAAA,IAAA,SAAQ,CAAA;QAChBkD,aAAalD,EAAAA,EAAC,EAAA,IAAA,SAAyB,CAAA;QACvC0D,WAAWb,EAAM5B,MAAM0C,KAAKC,OAAON,KAAKd,MAAMA,GAAGtC,OAAAA,EAAS2D,KAAK,IAAA;QAC/DV,UAAUrF,KAAauB;QACvBgE,SAAShE;kBAERD,EAAekE,KAAKhC,MACnB,gBAACxE,GAAAA;SAECM,OAAOkE,EAAKC;SACZyB,OAAO1B,EAAKqB,OAAO,GAAGrB,EAAKqB,KAAK,IAAIrB,EAAKC,GAAG,KAAKD,EAAKC;WAFjDD,EAAKC,EAAE,CAAA;;;;KASxB,gBAAC/E,GAAAA,EAAAA,UACC,gBAAC+D,EAAKmC,OAAK;MACTC,MAAK;MACLC,WAAWC,MACT,gBAAChG,GAAAA;OACC0E,IAAIsB,EAAMF;OACVA,MAAME,EAAMF;OACZvF,OAAOyF,EAAM5B,MAAM7D;OACnBmG,QAAQV,EAAMW;OACdV,WAAW1F,MAAUyF,EAAME,aAAa,OAAO3F,KAAU,WAAWA,IAAQ,EAAA;OAC5E4F,OAAOhD,EAAAA,EAAC,EAAA,IAAA,SAAiB,CAAA;OACzBkD,aAAalD,EAAAA,EAAC,EAAA,IAAA,SAA0B,CAAA;OACxCiD,UAAUjD,EAAAA,EAAC,EAAA,IAAA,SAAoG,CAAA;OAC/G0D,WAAWb,EAAM5B,MAAM0C,KAAKC,OAAON,KAAKd,MAAMA,GAAGtC,OAAAA,EAAS2D,KAAK,IAAA;OAC/DV,UAAUrF,KAAa0D,EAAa0C,WAAW;iBAE9C1C,EAAa8B,KAAK,EAAEa,oBACnB,gBAACrH,GAAAA;QAA8BM,OAAO+G;QAAYnB,OAAOmB;UAAtCA,CAAAA,CAAAA;;;;;;;AAUvC,GCrTMU,IAAmB,oBACnBC,IAAmB,OAGZC,UAAkB;CAC7B,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,EAAAA,GACRC,IAAYP,EAAAA,GACZ,CAACQ,GAAmBC,KAAuBV,EAAS,EAAA,GAEpD,EAAEW,eAAYC,uBAAoBC,iBAAcC,qBAAkBC,mBAAgBC,0BACtFjB,EAAyC;EACvCkB,gBAAgBb;EAChBc,gBAAgBb;EAChBc,aAAa;GACX;IAAEC,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAiB,CAAA;IAAGC,OAAO;GAAmB;GACxD;IAAEF,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAoB,CAAA;IAAGC,OAAO;GAAsB;GAC9D;IAAEF,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAoB,CAAA;IAAGC,OAAO;GAAsB;GAC9D;IAAEF,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAG,CAAA;IAAGC,OAAO;GAAK;GAC5B;IAAEF,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAU,CAAA;IAAGC,OAAO;GAAY;GAC1C;IAAEF,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAO,CAAA;IAAGC,OAAO;GAAS;GAEpC;IAAEF,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAU,CAAA;IAAGC,OAAO;GAAY;GAC1C;IAAEF,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAW,CAAA;IAAGC,OAAO;GAAa;;EAE9CP,gBAAgB,EACdQ,SAAS,CACP;GACEC,aAAaH,EAAAA,EAAC,EAAA,IAAA,SAAO,CAAA;GACrBI,YAAY;GACZC,QAAQ;IAAC;IAAU;IAAQ;;GAC3BC,oBAAoB;EACtB,CAAA,EAEJ;CACF,CAAA,GAEI,EACJC,MAAMC,IAAc,CAAA,GACpBC,cACAC,YACAC,aACEnC,EAAUoC,QAAQC,WAAWC,KAAKC,SAAS;EAC7CC,YAAY7B;EACZ8B,UAAUzB,EAAa0B;EACvBC,UAAU3B,EAAa4B;EACvB,GAAG3C,EAAkBiB,CAAAA;EACrB,GAAIJ,IAAa,EAAEA,cAAW,IAAI,CAAC;CACrC,CAAA;CAEA,OACE,gBAAC+B,OAAAA;EAAIC,WAAU;;GACb,gBAAC/C,GAAAA;IACae;IACZiC,UAAUhC;IACIC;IACdgC,QAAQ/B;IACQC;IAChB+B,UAAU9B;IACV+B,SAAS,gBAACpD,GAAAA;KAAOqD,SAAQ;KAAU5B,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAqB,CAAA;KAAG4B,SAASvC;;;GAG9E,gBAACR,GAAAA;IAAqC2B;IAAwBC;IAAoBC;IAAgBC;;GAEjGvB,KAAqB,gBAACN,GAAAA;IAAwB+C,MAAMzC;IAAmB0C,SAASzC;;;;AAGvF;;;ACzDA,SAAS8C,IAAAA;CACP,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQJ,EAAAA;CACd,OACE,gBAAA,GAAA,EAAA,UAAA,CACE,gBAAC,GAAA,EAAA,UAAgBK,EAAAA,EAAC,EAAA,IAAA,SAAA,CAAA,EAAA,CAAA,GAClB,gBAAC,GAAA,CAAA,CAAA,CAAA,EAAA,CAAA;AAGP"}
@@ -1,4 +1,4 @@
1
- import { n as e } from "./AuthProvider-Cj_Btfnc.mjs";
1
+ import { n as e } from "./AuthProvider-p1e1DuKU.mjs";
2
2
  import "./useProjectId-DBc5lpoU.mjs";
3
3
  import { useParams as t } from "@tanstack/react-router";
4
4
  //#region src/client/hooks/useDomainId.ts
@@ -19,4 +19,4 @@ function r() {
19
19
  //#endregion
20
20
  export { n, r as t };
21
21
 
22
- //# sourceMappingURL=hooks-BsbKkpZc.mjs.map
22
+ //# sourceMappingURL=hooks-D0wGUhRF.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks-BsbKkpZc.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"}
1
+ {"version":3,"file":"hooks-D0wGUhRF.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"}
@@ -1,12 +1,12 @@
1
1
  import { A as e, B as t, C as n, E as r, G as i, H as a, I as o, J as s, K as c, M as l, P as u, R as d, U as f, X as p, Y as m, at as h, c as g, ct as _, dt as v, g as y, lt as ee, m as b, n as te, o as x, r as S, rt as C, st as w, tt as T, ut as E, y as D } from "./build-DgeVmENN.mjs";
2
2
  import { n as O, r as k } from "./trpcClient-BxcNKnhv.mjs";
3
3
  import { t as ne } from "./cn-DM4Cy3jv.mjs";
4
- import { t as A } from "./images-CD7DNwru.mjs";
4
+ import { t as A } from "./images-CPYewah0.mjs";
5
5
  import { t as j } from "./useProjectId-DBc5lpoU.mjs";
6
- import "./hooks-BsbKkpZc.mjs";
6
+ import "./hooks-D0wGUhRF.mjs";
7
7
  import { t as M } from "./ContentHeader-CIAzorGI.mjs";
8
8
  import { t as N } from "./SortInput-DjaEHvcO.mjs";
9
- import { A as P, C as re, D as ie, E as F, F as ae, I, M as L, N as R, O as oe, P as z, S as se, T as B, _ as ce, a as le, b as V, c as H, d as U, f as W, g as ue, h as de, i as fe, j as pe, k as me, l as he, m as ge, n as _e, o as ve, p as ye, r as be, s as xe, t as Se, u as Ce, v as we, w as Te, x as Ee, y as De } from "./ImageToastNotifications-BQM7HOyE.mjs";
9
+ import { A as P, C as re, D as ie, E as F, F as ae, I, M as L, N as R, O as oe, P as z, S as se, T as B, _ as ce, a as le, b as V, c as H, d as U, f as W, g as ue, h as de, i as fe, j as pe, k as me, l as he, m as ge, n as _e, o as ve, p as ye, r as be, s as xe, t as Se, u as Ce, v as we, w as Te, x as Ee, y as De } from "./ImageToastNotifications-Dzq6jNTm.mjs";
10
10
  import { n as Oe, t as ke } from "./FiltersInput-cOaaRpcQ.mjs";
11
11
  import { Fragment as G, jsx as K, jsxs as q } from "react/jsx-runtime";
12
12
  import { Suspense as Ae, startTransition as je, use as Me, useCallback as Ne, useEffect as Pe, useMemo as Fe, useRef as Ie, useState as J } from "react";
@@ -1887,4 +1887,4 @@ function ut() {
1887
1887
  //#endregion
1888
1888
  export { ut as component };
1889
1889
 
1890
- //# sourceMappingURL=images-CfBrglGJ.mjs.map
1890
+ //# sourceMappingURL=images-BklcxYWi.mjs.map