@cobaltcore-dev/aurora 0.23.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/App.d.ts +3 -2
- package/dist/client/AuroraApp.d.ts +25 -0
- package/dist/client/{AuthProvider-CQ6Yppoh.mjs → AuthProvider-BS5OVv8n.mjs} +4 -4
- package/dist/client/AuthProvider-BS5OVv8n.mjs.map +1 -0
- package/dist/client/{ContentHeader-9KZdhOoA.mjs → ContentHeader-BHMUzd9H.mjs} +27 -26
- package/dist/client/ContentHeader-BHMUzd9H.mjs.map +1 -0
- package/dist/client/DeleteFlavorModal-BP83t9zX.mjs +721 -0
- package/dist/client/DeleteFlavorModal-BP83t9zX.mjs.map +1 -0
- package/dist/client/FiltersInput-B8CNBg1L.mjs +82 -0
- package/dist/client/FiltersInput-B8CNBg1L.mjs.map +1 -0
- package/dist/client/{FloatingIpActionModals-BcceUHcg.mjs → FloatingIpActionModals-BraiJWBi.mjs} +66 -66
- package/dist/client/{FloatingIpActionModals-BcceUHcg.mjs.map → FloatingIpActionModals-BraiJWBi.mjs.map} +1 -1
- package/dist/client/ImageToastNotifications-BXMHJaIH.mjs +1131 -0
- package/dist/client/ImageToastNotifications-BXMHJaIH.mjs.map +1 -0
- package/dist/client/{RouteError-Rm08PcxN.mjs → RouteError-hAF8_jbe.mjs} +2 -2
- package/dist/client/{RouteError-Rm08PcxN.mjs.map → RouteError-hAF8_jbe.mjs.map} +1 -1
- package/dist/client/Slot-CWb612-_.mjs.map +1 -1
- package/dist/client/{SortInput-D_q_jDfe.mjs → SortInput-Cqs2poV3.mjs} +9 -9
- package/dist/client/{SortInput-D_q_jDfe.mjs.map → SortInput-Cqs2poV3.mjs.map} +1 -1
- package/dist/client/{StatusError-2ZU1gFpu.mjs → StatusError-C5KodQOq.mjs} +7 -7
- package/dist/client/{StatusError-2ZU1gFpu.mjs.map → StatusError-C5KodQOq.mjs.map} +1 -1
- package/dist/client/TwoColumnDescriptionList-DiDx3PnH.mjs +22 -0
- package/dist/client/TwoColumnDescriptionList-DiDx3PnH.mjs.map +1 -0
- package/dist/client/{_auth-D5_QNUos.mjs → _auth-DJ9wHZaj.mjs} +2 -2
- package/dist/client/_auth-DJ9wHZaj.mjs.map +1 -0
- package/dist/client/{_flavorId-CFmkmg2Y.mjs → _flavorId-BN_qessZ.mjs} +4 -4
- package/dist/client/{_flavorId-CFmkmg2Y.mjs.map → _flavorId-BN_qessZ.mjs.map} +1 -1
- package/dist/client/_flavorId-CJjEB_Ao.mjs +210 -0
- package/dist/client/_flavorId-CJjEB_Ao.mjs.map +1 -0
- package/dist/client/{_floatingIpId-Dzh6_JCI.mjs → _floatingIpId-CwDGHkWm.mjs} +4 -4
- package/dist/client/{_floatingIpId-Dzh6_JCI.mjs.map → _floatingIpId-CwDGHkWm.mjs.map} +1 -1
- package/dist/client/_floatingIpId-foMIwbE4.mjs +215 -0
- package/dist/client/_floatingIpId-foMIwbE4.mjs.map +1 -0
- package/dist/client/_imageId-BtJ7GmYB.mjs +558 -0
- package/dist/client/_imageId-BtJ7GmYB.mjs.map +1 -0
- package/dist/client/{_projectId-D-b7paXE.mjs → _projectId-BmtCuzJu.mjs} +4 -4
- package/dist/client/{_projectId-D-b7paXE.mjs.map → _projectId-BmtCuzJu.mjs.map} +1 -1
- package/dist/client/_projectId-Byt3GQDW.mjs +99 -0
- package/dist/client/_projectId-Byt3GQDW.mjs.map +1 -0
- package/dist/client/_projectId-NYk1IN_a.mjs +291 -0
- package/dist/client/_projectId-NYk1IN_a.mjs.map +1 -0
- package/dist/client/{_projectId-CAQkJHZ4.mjs → _projectId-QueiFczy.mjs} +3 -3
- package/dist/client/{_projectId-CAQkJHZ4.mjs.map → _projectId-QueiFczy.mjs.map} +1 -1
- package/dist/client/{_securityGroupId-DRkY3Gt6.mjs → _securityGroupId-BcbkRhsN.mjs} +4 -4
- package/dist/client/{_securityGroupId-DRkY3Gt6.mjs.map → _securityGroupId-BcbkRhsN.mjs.map} +1 -1
- package/dist/client/{_securityGroupId-DFdNKa2l.mjs → _securityGroupId-pPtJsCoe.mjs} +541 -527
- package/dist/client/_securityGroupId-pPtJsCoe.mjs.map +1 -0
- package/dist/client/_storageType-BmqrU06i.mjs +2202 -0
- package/dist/client/_storageType-BmqrU06i.mjs.map +1 -0
- package/dist/client/_storageType-zeSZe--V.mjs.map +1 -1
- package/dist/client/{about-C8tTrQaW.mjs → about-_73VmpTB.mjs} +8 -8
- package/dist/client/about-_73VmpTB.mjs.map +1 -0
- package/dist/client/assets/objectDownload.worker-CWWLPDyb.js.map +1 -0
- package/dist/client/assets/objectDownload.worker-kZlQuo3F.js.map +1 -0
- package/dist/client/{aurora-jyvXcI4T.mjs → aurora-EbwGRLLf.mjs} +2 -2
- package/dist/client/aurora-EbwGRLLf.mjs.map +1 -0
- package/dist/client/{build-CRLQyqu2.mjs → build-C_4vRMCq.mjs} +8072 -8533
- package/dist/client/build-C_4vRMCq.mjs.map +1 -0
- package/dist/client/components/Auth/LoginForm.d.ts +1 -1
- package/dist/client/components/Auth/SessionExpirationTimer.d.ts +1 -1
- package/dist/client/components/ContentHeader/ContentHeader.d.ts +1 -1
- package/dist/client/components/Error/RouteError.d.ts +1 -1
- package/dist/client/components/Error/StatusError.d.ts +1 -1
- package/dist/client/components/JsonEditor.d.ts +1 -1
- package/dist/client/components/ListToolbar/FiltersInput.d.ts +3 -1
- package/dist/client/components/ListToolbar/SelectedFilters.d.ts +1 -1
- package/dist/client/components/ListToolbar/index.d.ts +1 -1
- package/dist/client/components/ProjectView/ProjectInfoBox.d.ts +1 -1
- package/dist/client/components/Slot.d.ts +1 -1
- package/dist/client/components/TwoColumnDescriptionList.d.ts +11 -0
- package/dist/client/components/navigation/LanguageSelect.d.ts +1 -1
- package/dist/client/components/navigation/MainNavigation.d.ts +1 -1
- package/dist/client/components/navigation/UserMenu.d.ts +1 -1
- package/dist/client/{flavors-Dy-2mRGv.mjs → flavors-CiHCYrtZ.mjs} +2 -2
- package/dist/client/{flavors-Dy-2mRGv.mjs.map → flavors-CiHCYrtZ.mjs.map} +1 -1
- package/dist/client/flavors-DWMZ6TuJ.mjs.map +1 -1
- package/dist/client/{flavors-BfTXqmoD.mjs → flavors-DY-bDc8l.mjs} +196 -194
- package/dist/client/flavors-DY-bDc8l.mjs.map +1 -0
- package/dist/client/floatingips-Ci4jHkaG.mjs +591 -0
- package/dist/client/floatingips-Ci4jHkaG.mjs.map +1 -0
- package/dist/client/formatBytes-CZv_XyCY.mjs.map +1 -1
- package/dist/client/helpers-1PpYf-fC.mjs.map +1 -1
- package/dist/client/hooks/useAvailableViewportHeight.d.ts +8 -5
- package/dist/client/hooks/useVirtualizedTableBody.d.ts +1 -3
- package/dist/client/{hooks-Bw3sHHOg.mjs → hooks-LutR2Yg3.mjs} +2 -2
- package/dist/client/{hooks-Bw3sHHOg.mjs.map → hooks-LutR2Yg3.mjs.map} +1 -1
- package/dist/client/images-91U7tr9Y2.mjs +1976 -0
- package/dist/client/images-91U7tr9Y2.mjs.map +1 -0
- package/dist/client/{images-DPKUXryV.mjs → images-CS4kZQyu.mjs} +2 -2
- package/dist/client/{images-DPKUXryV.mjs.map → images-CS4kZQyu.mjs.map} +1 -1
- package/dist/client/images-NBf2bV43.mjs.map +1 -1
- package/dist/client/index.d.ts +4 -1
- package/dist/client/index.js +559 -545
- package/dist/client/index.js.map +1 -1
- package/dist/client/{md-CyCflQee.mjs → md-kvaGCNAK.mjs} +6 -78
- package/dist/client/{md-CyCflQee.mjs.map → md-kvaGCNAK.mjs.map} +1 -1
- package/dist/client/network-DuZm76BZ.mjs.map +1 -1
- package/dist/client/objects-C3azvW8m.mjs +10074 -0
- package/dist/client/objects-C3azvW8m.mjs.map +1 -0
- package/dist/client/objects-CM265S6b.mjs +56 -0
- package/dist/client/objects-CM265S6b.mjs.map +1 -0
- package/dist/client/objects-EE9Cd1wI.mjs +56 -0
- package/dist/client/objects-EE9Cd1wI.mjs.map +1 -0
- package/dist/client/projects-yiK0HGSA.mjs.map +1 -1
- package/dist/client/{routeInfo-CdTRlSxv.mjs → routeInfo-DXqB2HCf.mjs} +3 -3
- package/dist/client/routeInfo-DXqB2HCf.mjs.map +1 -0
- package/dist/client/router.d.ts +2 -1
- package/dist/client/{routes-BOf-GDMM.mjs → routes-CBd8CCuM.mjs} +27 -24
- package/dist/client/routes-CBd8CCuM.mjs.map +1 -0
- package/dist/client/{routes-CtfnI-aY.mjs → routes-CdDm-hhO.mjs} +2 -2
- package/dist/client/{routes-CtfnI-aY.mjs.map → routes-CdDm-hhO.mjs.map} +1 -1
- package/dist/client/securitygroups-Bd_uV4S9.mjs +595 -0
- package/dist/client/securitygroups-Bd_uV4S9.mjs.map +1 -0
- package/dist/client/{securitygroups-B8aLyFK7.mjs → securitygroups-Byte-iSp.mjs} +2 -2
- package/dist/client/{securitygroups-B8aLyFK7.mjs.map → securitygroups-Byte-iSp.mjs.map} +1 -1
- package/dist/client/services-D1PbooD1.mjs +6 -0
- package/dist/client/services-D1PbooD1.mjs.map +1 -0
- package/dist/client/services-DEMVtFyn.mjs +9 -0
- package/dist/client/services-DEMVtFyn.mjs.map +1 -0
- package/dist/client/store/AuthProvider.d.ts +1 -1
- package/dist/client/{trpcClient-Di56hpVv.mjs → trpcClient-D7gpR7YG.mjs} +2 -2
- package/dist/client/{trpcClient-Di56hpVv.mjs.map → trpcClient-D7gpR7YG.mjs.map} +1 -1
- package/dist/client/trpcClient.d.ts +139 -374
- package/dist/client/useModal-DCs1OJh7.mjs.map +1 -1
- package/dist/client/{useSecurityGroupPermissions-BPS1ibWq.mjs → useSecurityGroupPermissions-C29mzb3b.mjs} +15 -15
- package/dist/client/{useSecurityGroupPermissions-BPS1ibWq.mjs.map → useSecurityGroupPermissions-C29mzb3b.mjs.map} +1 -1
- package/dist/server/index.d.ts +164 -376
- package/dist/server/index.js +4223 -3131
- package/package.json +7 -9
- package/dist/client/AuthProvider-CQ6Yppoh.mjs.map +0 -1
- package/dist/client/BucketToastNotifications-Dq4dudkM.mjs +0 -665
- package/dist/client/BucketToastNotifications-Dq4dudkM.mjs.map +0 -1
- package/dist/client/ContentHeader-9KZdhOoA.mjs.map +0 -1
- package/dist/client/DeleteFlavorModal-Be2qZo4w.mjs +0 -713
- package/dist/client/DeleteFlavorModal-Be2qZo4w.mjs.map +0 -1
- package/dist/client/DeletePcaModal-CIFsGWyj.mjs +0 -80
- package/dist/client/DeletePcaModal-CIFsGWyj.mjs.map +0 -1
- package/dist/client/DetailsInfo-CHVD7d-W.mjs +0 -52
- package/dist/client/DetailsInfo-CHVD7d-W.mjs.map +0 -1
- package/dist/client/FiltersInput-DqT08Ib-.mjs +0 -81
- package/dist/client/FiltersInput-DqT08Ib-.mjs.map +0 -1
- package/dist/client/ImageToastNotifications-BGyX2J6j.mjs +0 -1219
- package/dist/client/ImageToastNotifications-BGyX2J6j.mjs.map +0 -1
- package/dist/client/_auth-D5_QNUos.mjs.map +0 -1
- package/dist/client/_flavorId-BsmqS9hP.mjs +0 -194
- package/dist/client/_flavorId-BsmqS9hP.mjs.map +0 -1
- package/dist/client/_floatingIpId-Bb9ZEJ6b.mjs +0 -228
- package/dist/client/_floatingIpId-Bb9ZEJ6b.mjs.map +0 -1
- package/dist/client/_imageId-C3As7sHE.mjs +0 -534
- package/dist/client/_imageId-C3As7sHE.mjs.map +0 -1
- package/dist/client/_pcaId-n0q0aDb6.mjs +0 -545
- package/dist/client/_pcaId-n0q0aDb6.mjs.map +0 -1
- package/dist/client/_projectId-BuBIFdgG.mjs +0 -291
- package/dist/client/_projectId-BuBIFdgG.mjs.map +0 -1
- package/dist/client/_projectId-DNZsNxJw.mjs +0 -98
- package/dist/client/_projectId-DNZsNxJw.mjs.map +0 -1
- package/dist/client/_securityGroupId-DFdNKa2l.mjs.map +0 -1
- package/dist/client/_storageType-Cn7TSOki.mjs +0 -81
- package/dist/client/_storageType-Cn7TSOki.mjs.map +0 -1
- package/dist/client/_storageType-_8Ambhxc.mjs +0 -2859
- package/dist/client/_storageType-_8Ambhxc.mjs.map +0 -1
- package/dist/client/about-C8tTrQaW.mjs.map +0 -1
- package/dist/client/assets/objectDownload.worker-BAc5Au4B.js.map +0 -1
- package/dist/client/aurora-jyvXcI4T.mjs.map +0 -1
- package/dist/client/build-CRLQyqu2.mjs.map +0 -1
- package/dist/client/flavors-BfTXqmoD.mjs.map +0 -1
- package/dist/client/floatingips-zhNK6Xxn.mjs +0 -562
- package/dist/client/floatingips-zhNK6Xxn.mjs.map +0 -1
- package/dist/client/images-DhZnqUG_.mjs +0 -1890
- package/dist/client/images-DhZnqUG_.mjs.map +0 -1
- package/dist/client/objects-B3mbk6V0.mjs +0 -6636
- package/dist/client/objects-B3mbk6V0.mjs.map +0 -1
- package/dist/client/objects-BQ8xvSW8.mjs +0 -103
- package/dist/client/objects-BQ8xvSW8.mjs.map +0 -1
- package/dist/client/objects-o2Cj_ndZ.mjs +0 -8
- package/dist/client/objects-o2Cj_ndZ.mjs.map +0 -1
- package/dist/client/pca-B60iWWfG.mjs +0 -251
- package/dist/client/pca-B60iWWfG.mjs.map +0 -1
- package/dist/client/pca-D0kKxHp4.mjs +0 -25
- package/dist/client/pca-D0kKxHp4.mjs.map +0 -1
- package/dist/client/pcaAccess-Br4kVjLQ.mjs +0 -9
- package/dist/client/pcaAccess-Br4kVjLQ.mjs.map +0 -1
- package/dist/client/routeInfo-CdTRlSxv.mjs.map +0 -1
- package/dist/client/routes-BOf-GDMM.mjs.map +0 -1
- package/dist/client/securitygroups-DRhFle2O.mjs +0 -589
- package/dist/client/securitygroups-DRhFle2O.mjs.map +0 -1
- package/dist/client/useListWithFiltering-aPTUNRaW.mjs +0 -32
- package/dist/client/useListWithFiltering-aPTUNRaW.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeleteFlavorModal-BP83t9zX.mjs","names":["useErrorTranslation","useLingui","translateError","errorCode","t","isRetryableError","includes","React","TextInput","ButtonRow","Button","Stack","SpecFormRow","specKey","value","errors","isLoading","onKeyChange","onValueChange","onSave","onCancel","useLingui","gap","direction","alignment","className","onChange","e","target","placeholder","t","errortext","key","label","required","icon","onClick","variant","title","disabled","React","Fragment","useState","useEffect","DescriptionTerm","DescriptionDefinition","Button","Spinner","SpecRow","specKey","value","isDeleting","onDelete","canDelete","useLingui","confirm","setConfirm","timer","setTimeout","clearTimeout","handleConfirmDelete","deleteButton","variant","size","onClick","title","t","aria-label","data-testid","icon","className","span","React","use","Suspense","useState","startTransition","ErrorBoundary","useErrorTranslation","Modal","Message","DescriptionList","Stack","Button","Spinner","DescriptionTerm","DescriptionDefinition","SpecFormRow","SpecRow","createPermissionsPromise","client","project","compute","canUser","query","project_id","permission","then","canCreate","canDelete","createExtraSpecsPromise","flavorId","getExtraSpecs","SpecsLoading","distribution","alignment","className","variant","SpecsError","error","useLingui","translateError","message","Error","t","text","EditSpecContent","permissionsPromise","extraSpecsPromise","flavor","onSpecsUpdate","isAddingSpec","setIsAddingSpec","setMessage","permissions","initialExtraSpecs","extraSpecs","setExtraSpecs","key","setKey","value","setValue","errors","setErrors","isDeleting","setIsDeleting","isSavingSpec","setIsSavingSpec","validateForm","trimmedKey","trim","trimmedValue","newErrors","Object","keys","includes","length","resetForm","handleSave","type","createExtraSpecs","mutate","id","extra_specs","newSpecs","handleDelete","keyToDelete","deleteExtraSpec","handleKeyChange","newKey","prev","undefined","handleValueChange","newValue","shouldShowEmptyState","direction","label","data-testid","onClick","disabled","specKey","isLoading","onKeyChange","onValueChange","onSave","onCancel","p","entries","map","specValue","onDelete","EditSpecModal","isOpen","onClose","canEdit","setExtraSpecsPromise","resolvedCanEdit","setResolvedCanEdit","useMemo","Promise","resolve","useEffect","title","handleClose","handleSpecsUpdate","specs","open","size","div","onDismiss","fallbackRender","fallback","React","DataGridRow","DataGridCell","TextInput","ButtonRow","Button","TenantAccessFormRow","tenantId","errors","isLoading","onTenantIdChange","onSave","onCancel","useLingui","className","value","onChange","e","target","placeholder","t","errortext","required","icon","onClick","variant","title","disabled","React","useState","useEffect","DataGridRow","DataGridCell","Button","Stack","Spinner","TenantAccessRow","access","isDeleting","onDelete","canDelete","useLingui","confirm","setConfirm","timer","setTimeout","clearTimeout","handleConfirmDelete","button","variant","onClick","title","t","aria-label","data-testid","disabled","tenantId","tenant_id","icon","className","distribution","alignment","React","use","Suspense","useState","startTransition","useEffect","useMemo","useErrorTranslation","Modal","Message","DataGrid","DataGridRow","DataGridHeadCell","DataGridCell","Stack","Spinner","Button","TenantAccessFormRow","TenantAccessRow","createPermissionsPromise","client","project","compute","canUser","query","project_id","permission","then","canAdd","canRemove","createFlavorAccessPromise","flavorId","getFlavorAccess","AccessLoading","colSpan","distribution","alignment","variant","AccessContent","permissionsPromise","flavorAccessPromise","flavor","onAccessUpdate","isAddingAccess","setIsAddingAccess","setMessage","useLingui","translateError","permissions","flavorAccess","tenantId","setTenantId","errors","setErrors","deletingTenants","setDeletingTenants","Set","isLoading","setIsLoading","isPublicFlavor","shouldShowEmptyState","length","validateForm","trimmedTenantId","trim","newErrors","some","access","tenant_id","Object","keys","resetForm","handleSave","text","t","type","updatedAccess","addTenantAccess","mutate","id","targetProjectId","error","errorMessage","message","handleRemoveTenant","tenantIdToRemove","prev","add","removeTenantAccess","newSet","delete","handleTenantIdChange","newTenantId","undefined","columns","className","direction","label","data-testid","onClick","disabled","onTenantIdChange","onSave","onCancel","map","isDeleting","has","onDelete","canDelete","ManageAccessModal","isOpen","onClose","filter","entry","idx","arr","findIndex","e","catch","msg","flavorAccessOverride","setFlavorAccessOverride","accessKey","activeFlavorAccessPromise","key","promise","handleClose","handleAccessUpdate","deduplicated","Promise","resolve","flavorName","name","title","open","size","div","onDismiss","dismissible","fallback","React","useState","useEffect","Modal","Stack","TextInput","DescriptionList","DescriptionTerm","DescriptionDefinition","useErrorTranslation","DeleteFlavorModal","client","isOpen","onClose","project","flavor","onSuccess","useLingui","translateError","isLoading","setIsLoading","generalError","setGeneralError","confirmText","setConfirmText","handleClose","handleConfirm","id","t","compute","deleteFlavor","mutate","project_id","flavorId","error","errorMessage","message","isConfirmValid","confirmLabel","open","onCancel","title","size","confirmButtonLabel","confirmButtonVariant","onConfirm","cancelButtonLabel","disableConfirmButton","disableCancelButton","disableCloseButton","direction","gap","p","className","role","aria-live","name","vcpus","ram","disk","swap","Number","div","label","value","onChange","e","target","placeholder","autoFocus"],"sources":["../../src/client/utils/useErrorTranslation.ts","../../src/client/routes/_auth/projects/$projectId/compute/-components/Flavors/-components/SpecFormRow.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-components/Flavors/-components/SpecRow.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-components/Flavors/-components/EditSpecModal.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-components/Flavors/-components/TenantAccessFormRow.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-components/Flavors/-components/TenantAccessRow.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-components/Flavors/-components/ManageAccessModal.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-components/Flavors/-components/DeleteFlavorModal.tsx"],"sourcesContent":["import { useLingui } from \"@lingui/react/macro\"\n\nexport const useErrorTranslation = () => {\n const { t } = useLingui()\n\n const translateError = (errorCode: string): string => {\n switch (errorCode) {\n // List Flavor\n case \"FLAVORS_UNAUTHORIZED\":\n return t`Your session has expired. Please log in again.`\n case \"FLAVORS_FORBIDDEN\":\n return t`You don't have permission to access flavors for this project.`\n case \"FLAVORS_NOT_FOUND\":\n return t`Flavor service is not available for this project.`\n case \"FLAVORS_SERVER_ERROR\":\n return t`Server is experiencing issues. Please try again later.`\n case \"FLAVORS_FETCH_FAILED\":\n return t`Failed to fetch flavors from server.`\n case \"FLAVORS_PARSE_ERROR\":\n return t`Server returned unexpected data format.`\n\n // Get flavor\n case \"GET_FLAVOR_DETAILS_UNAUTHORIZED\":\n return t`You are not authorized to view flavor details. Please log in again.`\n case \"GET_FLAVOR_DETAILS_FORBIDDEN\":\n return t`You don't have permission to view this flavor's details.`\n case \"GET_FLAVOR_DETAILS_NOT_FOUND\":\n return t`The flavor could not be found. It may have been deleted.`\n case \"GET_FLAVOR_DETAILS_SERVER_ERROR\":\n return t`Server error occurred while fetching flavor details. Please try again later.`\n case \"GET_FLAVOR_DETAILS_INVALID_ID\":\n return t`Flavor ID is required and cannot be empty.`\n case \"GET_FLAVOR_DETAILS_PARSE_ERROR\":\n return t`Server returned unexpected data format for flavor details.`\n case \"GET_FLAVOR_DETAILS_FAILED\":\n return t`Failed to load flavor details. Please try again.`\n\n // Create Flavor\n case \"CREATE_FLAVOR_INVALID_DATA\":\n return t`The flavor data provided is invalid. Please check your input.`\n case \"CREATE_FLAVOR_UNAUTHORIZED\":\n return t`You are not authorized to create flavors. Please log in again.`\n case \"CREATE_FLAVOR_FORBIDDEN\":\n return t`You don't have permission to create flavors in this project.`\n case \"CREATE_FLAVOR_CONFLICT\":\n return t`A flavor with this ID or name already exists. Please use different values.`\n case \"CREATE_FLAVOR_SERVER_ERROR\":\n return t`Server error occurred while creating the flavor. Please try again later.`\n case \"CREATE_FLAVOR_FAILED\":\n return t`Failed to create the flavor. Please try again.`\n\n // Delete Flavor\n case \"DELETE_FLAVOR_UNAUTHORIZED\":\n return t`You are not authorized to delete flavors. Please log in again.`\n case \"DELETE_FLAVOR_FORBIDDEN\":\n return t`You don't have permission to delete flavors in this project.`\n case \"DELETE_FLAVOR_NOT_FOUND\":\n return t`The flavor could not be found. It may have already been deleted.`\n case \"DELETE_FLAVOR_SERVER_ERROR\":\n return t`Server error occurred while deleting the flavor. Please try again later.`\n case \"DELETE_FLAVOR_FAILED\":\n return t`Failed to delete the flavor. Please try again.`\n case \"DELETE_FLAVOR_INVALID_ID\":\n return t`Flavor ID is required and cannot be empty.`\n\n // Create Metadata\n case \"CREATE_EXTRA_SPECS_UNAUTHORIZED\":\n return t`You are not authorized to create extra specs. Please log in again.`\n case \"CREATE_EXTRA_SPECS_FORBIDDEN\":\n return t`You don't have permission to create extra specs for this flavor.`\n case \"CREATE_EXTRA_SPECS_NOT_FOUND\":\n return t`The flavor could not be found. It may have been deleted.`\n case \"CREATE_EXTRA_SPECS_CONFLICT\":\n return t`This extra spec keys already exist. Please use different keys.`\n case \"CREATE_EXTRA_SPECS_INVALID_DATA\":\n return t`The extra spec data provided is invalid. Please check your input.`\n case \"CREATE_EXTRA_SPECS_SERVER_ERROR\":\n return t`Server error occurred while creating extra specs. Please try again later.`\n case \"CREATE_EXTRA_SPECS_PARSE_ERROR\":\n return t`Server returned unexpected data format for extra specs.`\n case \"CREATE_EXTRA_SPECS_FAILED\":\n return t`Failed to create extra specs. Please try again.`\n\n // Get Metadata\n case \"GET_EXTRA_SPECS_UNAUTHORIZED\":\n return t`You are not authorized to view extra specs. Please log in again.`\n case \"GET_EXTRA_SPECS_FORBIDDEN\":\n return t`You don't have permission to view extra specs for this flavor.`\n case \"GET_EXTRA_SPECS_NOT_FOUND\":\n return t`The flavor could not be found or has no extra specs.`\n case \"GET_EXTRA_SPECS_SERVER_ERROR\":\n return t`Server error occurred while fetching extra specs. Please try again later.`\n case \"GET_EXTRA_SPECS_PARSE_ERROR\":\n return t`Server returned unexpected data format for extra specs.`\n case \"GET_EXTRA_SPECS_FAILED\":\n return t`Failed to load extra specs. Please try again.`\n\n // Delete Metadata\n case \"DELETE_EXTRA_SPEC_UNAUTHORIZED\":\n return t`You are not authorized to delete extra specs. Please log in again.`\n case \"DELETE_EXTRA_SPEC_FORBIDDEN\":\n return t`You don't have permission to delete extra specs for this flavor.`\n case \"DELETE_EXTRA_SPEC_NOT_FOUND\":\n return t`The extra spec could not be found. It may have already been deleted.`\n case \"DELETE_EXTRA_SPEC_SERVER_ERROR\":\n return t`Server error occurred while deleting the extra spec. Please try again later.`\n case \"DELETE_EXTRA_SPEC_INVALID_KEY\":\n return t`Extra spec key is required and cannot be empty.`\n case \"DELETE_EXTRA_SPEC_FAILED\":\n return t`Failed to delete the extra spec. Please try again.`\n\n // Get Flavor Access\n case \"GET_FLAVOR_ACCESS_UNAUTHORIZED\":\n return t`You are not authorized to access flavor access information. Please log in again.`\n case \"GET_FLAVOR_ACCESS_FORBIDDEN\":\n return t`You don't have permission to access flavor access information for this flavor.`\n case \"GET_FLAVOR_ACCESS_NOT_FOUND\":\n return t`The flavor could not be found. It may have been deleted.`\n case \"GET_FLAVOR_ACCESS_SERVER_ERROR\":\n return t`Server error occurred while fetching flavor access information. Please try again later.`\n case \"GET_FLAVOR_ACCESS_FAILED\":\n return t`Failed to fetch flavor access information. Please try again.`\n\n // Add Tenant Access\n case \"ADD_TENANT_ACCESS_FAILED\":\n return t`Failed to add tenant access to flavor. Please try again.`\n case \"ADD_TENANT_ACCESS_INVALID_DATA\":\n return t`The tenant ID provided is invalid. Please check your input.`\n case \"ADD_TENANT_ACCESS_UNAUTHORIZED\":\n return t`You are not authorized to add tenant access. Please log in again.`\n case \"ADD_TENANT_ACCESS_FORBIDDEN\":\n return t`You don't have permission to add tenant access to this flavor.`\n case \"ADD_TENANT_ACCESS_NOT_FOUND\":\n return t`The flavor or tenant could not be found. Please verify they exist.`\n case \"ADD_TENANT_ACCESS_CONFLICT\":\n return t`This tenant already has access to the flavor.`\n case \"ADD_TENANT_ACCESS_SERVER_ERROR\":\n return t`Server error occurred while adding tenant access. Please try again later.`\n\n // Remove Tenant Access\n case \"REMOVE_TENANT_ACCESS_FAILED\":\n return t`Failed to remove tenant access from flavor. Please try again.`\n case \"REMOVE_TENANT_ACCESS_INVALID_DATA\":\n return t`The tenant ID provided is invalid. Please check your input.`\n case \"REMOVE_TENANT_ACCESS_UNAUTHORIZED\":\n return t`You are not authorized to remove tenant access. Please log in again.`\n case \"REMOVE_TENANT_ACCESS_FORBIDDEN\":\n return t`You don't have permission to remove tenant access from this flavor.`\n case \"REMOVE_TENANT_ACCESS_NOT_FOUND\":\n return t`The flavor or tenant could not be found. It may have already been removed.`\n case \"REMOVE_TENANT_ACCESS_CONFLICT\":\n return t`This tenant does not have access to the flavor.`\n case \"REMOVE_TENANT_ACCESS_SERVER_ERROR\":\n return t`Server error occurred while removing tenant access. Please try again later.`\n\n // Service Connection Errors\n case \"COMPUTE_SERVICE_UNAVAILABLE\":\n return t`The compute service is currently unavailable for this project. Please try again later.`\n case \"COMPUTE_SERVICE_CONNECTION_FAILED\":\n return t`Unable to connect to the compute service. Please check your connection and try again.`\n\n default:\n return t`An unexpected error occurred. Please try again.`\n }\n }\n\n const isRetryableError = (errorCode: string): boolean => {\n return [\"FLAVORS_SERVER_ERROR\", \"FLAVORS_FETCH_FAILED\"].includes(errorCode)\n }\n\n return { translateError, isRetryableError }\n}\n","import React from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { TextInput, ButtonRow, Button, Stack } from \"@cloudoperators/juno-ui-components\"\n\ninterface SpecFormRowProps {\n specKey: string\n value: string\n errors: { key?: string; value?: string }\n isLoading: boolean\n onKeyChange: (key: string) => void\n onValueChange: (value: string) => void\n onSave: () => void\n onCancel: () => void\n}\n\nexport const SpecFormRow: React.FC<SpecFormRowProps> = ({\n specKey,\n value,\n errors,\n isLoading,\n onKeyChange,\n onValueChange,\n onSave,\n onCancel,\n}) => {\n const { t } = useLingui()\n\n return (\n <Stack gap=\"4\" direction=\"horizontal\" alignment=\"start\" className=\"border-theme-background-lvl-3 border-b p-4\">\n <TextInput\n value={specKey}\n onChange={(e) => onKeyChange(e.target.value)}\n placeholder={t`Enter key`}\n errortext={errors.key}\n label={t`Key`}\n required\n />\n <TextInput\n value={value}\n onChange={(e) => onValueChange(e.target.value)}\n placeholder={t`Enter value`}\n errortext={errors.value}\n label={t`Value`}\n required\n />\n <ButtonRow className=\"mt-6\">\n <Button icon=\"check\" onClick={onSave} variant=\"primary\" title={t`Save Metadata`} disabled={isLoading} />\n <Button icon=\"cancel\" onClick={onCancel} title={t`Cancel`} disabled={isLoading} />\n </ButtonRow>\n </Stack>\n )\n}\n","import React, { Fragment, useState, useEffect } from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { DescriptionTerm, DescriptionDefinition, Button, Spinner } from \"@cloudoperators/juno-ui-components\"\n\ninterface SpecRowProps {\n specKey: string\n value: string\n isDeleting: boolean\n onDelete: () => void\n canDelete?: boolean\n}\n\nexport const SpecRow: React.FC<SpecRowProps> = ({ specKey, value, isDeleting, onDelete, canDelete }) => {\n const { t } = useLingui()\n const [confirm, setConfirm] = useState(false)\n useEffect(() => {\n if (confirm) {\n const timer = setTimeout(() => {\n setConfirm(false)\n }, 3000)\n\n return () => clearTimeout(timer)\n }\n }, [confirm])\n\n const handleConfirmDelete = () => {\n setConfirm(false)\n onDelete()\n }\n\n const deleteButton = () => {\n if (!canDelete) return null\n if (isDeleting) {\n return <Spinner variant=\"primary\" size=\"small\" />\n }\n if (confirm) {\n return (\n <Button\n variant=\"primary-danger\"\n onClick={handleConfirmDelete}\n title={t`Delete`}\n aria-label={t`Delete`}\n data-testid=\"confirm-deletion\"\n size=\"small\"\n >\n {t`Delete`}\n </Button>\n )\n }\n return (\n <Button\n icon=\"deleteForever\"\n onClick={() => setConfirm(true)}\n title={t`Delete ${specKey}`}\n aria-label={t`Delete ${specKey}`}\n data-testid={`delete-${specKey}`}\n size=\"small\"\n />\n )\n }\n\n return (\n <Fragment>\n <DescriptionTerm>{specKey}</DescriptionTerm>\n <DescriptionDefinition className=\"flex justify-between\">\n <span className=\"break-all\">{value}</span>\n {deleteButton()}\n </DescriptionDefinition>\n </Fragment>\n )\n}\n","import React, { use, Suspense, useState, startTransition } from \"react\"\nimport { ErrorBoundary } from \"react-error-boundary\"\nimport { TrpcClient } from \"@/client/trpcClient\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { useErrorTranslation } from \"@/client/utils/useErrorTranslation\"\nimport {\n Modal,\n Message,\n DescriptionList,\n Stack,\n Button,\n Spinner,\n DescriptionTerm,\n DescriptionDefinition,\n} from \"@cloudoperators/juno-ui-components\"\nimport { Flavor } from \"@/server/Compute/types/flavor\"\nimport { SpecFormRow } from \"./SpecFormRow\"\nimport { SpecRow } from \"./SpecRow\"\n\ninterface EditSpecModalProps {\n client: TrpcClient\n isOpen: boolean\n onClose: () => void\n project: string\n flavor: Flavor | null\n canEdit?: boolean\n}\n\nconst createPermissionsPromise = (client: TrpcClient, project: string) => {\n return client.compute.canUser\n .query({\n project_id: project,\n permission: [\"flavor_specs:create\", \"flavor_specs:delete\"],\n })\n .then(([canCreate, canDelete]) => ({ canCreate, canDelete }))\n}\n\nconst createExtraSpecsPromise = (client: TrpcClient, project: string, flavorId: string) => {\n return client.compute.getExtraSpecs.query({\n project_id: project,\n flavorId: flavorId,\n })\n}\n\nfunction SpecsLoading() {\n return (\n <Stack distribution=\"center\" alignment=\"center\" className=\"py-4\">\n <Spinner variant=\"primary\" />\n </Stack>\n )\n}\n\nfunction SpecsError({ error }: { error: unknown }) {\n const { t } = useLingui()\n const { translateError } = useErrorTranslation()\n const message = error instanceof Error ? translateError(error.message) : t`An unexpected error occurred.`\n return <Message variant=\"error\" text={message} />\n}\n\nfunction EditSpecContent({\n permissionsPromise,\n extraSpecsPromise,\n client,\n project,\n flavor,\n onSpecsUpdate,\n isAddingSpec,\n setIsAddingSpec,\n setMessage,\n}: {\n permissionsPromise: Promise<{ canCreate: boolean; canDelete: boolean }>\n extraSpecsPromise: Promise<Record<string, string>>\n client: TrpcClient\n project: string\n flavor: Flavor\n onSpecsUpdate: (specs: Record<string, string>) => void\n isAddingSpec: boolean\n setIsAddingSpec: (adding: boolean) => void\n message: { text: string; type: \"error\" | \"info\" } | null\n setMessage: (msg: { text: string; type: \"error\" | \"info\" } | null) => void\n}) {\n const { t } = useLingui()\n const { translateError } = useErrorTranslation()\n\n const permissions = use(permissionsPromise)\n const initialExtraSpecs = use(extraSpecsPromise)\n\n const [extraSpecs, setExtraSpecs] = useState(initialExtraSpecs)\n const [key, setKey] = useState(\"\")\n const [value, setValue] = useState(\"\")\n const [errors, setErrors] = useState<{ key?: string; value?: string }>({})\n const [isDeleting, setIsDeleting] = useState<string | null>(null)\n const [isSavingSpec, setIsSavingSpec] = useState(false)\n\n const validateForm = () => {\n const trimmedKey = key.trim()\n const trimmedValue = value.trim()\n const newErrors: { key?: string; value?: string } = {}\n\n if (!trimmedKey) {\n newErrors.key = \"Key is required.\"\n } else if (Object.keys(extraSpecs).includes(trimmedKey)) {\n newErrors.key = \"Key already exists.\"\n }\n\n if (!trimmedValue) {\n newErrors.value = \"Value is required.\"\n }\n\n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }\n\n const resetForm = () => {\n setKey(\"\")\n setValue(\"\")\n setErrors({})\n }\n\n const handleSave = async () => {\n if (isSavingSpec) return\n\n if (!validateForm()) {\n setMessage({ text: t`Please fix the validation errors below.`, type: \"error\" })\n return\n }\n\n try {\n setIsSavingSpec(true)\n const trimmedKey = key.trim()\n const trimmedValue = value.trim()\n\n await client.compute.createExtraSpecs.mutate({\n project_id: project,\n flavorId: flavor.id,\n extra_specs: { [trimmedKey]: trimmedValue },\n })\n\n const newSpecs = { [trimmedKey]: trimmedValue, ...extraSpecs }\n setExtraSpecs(newSpecs)\n onSpecsUpdate(newSpecs)\n\n setMessage({\n text: t`Metadata \"${trimmedKey}\" has been added successfully.`,\n type: \"info\",\n })\n resetForm()\n setIsAddingSpec(false)\n } catch (error) {\n setMessage({\n text: translateError(error instanceof Error ? error.message : \"Failed to create extra spec\"),\n type: \"error\",\n })\n } finally {\n setIsSavingSpec(false)\n }\n }\n\n const handleDelete = async (keyToDelete: string) => {\n try {\n setIsDeleting(keyToDelete)\n await client.compute.deleteExtraSpec.mutate({\n project_id: project,\n flavorId: flavor.id,\n key: keyToDelete,\n })\n\n const newSpecs = { ...extraSpecs }\n delete newSpecs[keyToDelete]\n setExtraSpecs(newSpecs)\n onSpecsUpdate(newSpecs)\n\n setMessage({\n text: t`Metadata \"${keyToDelete}\" has been deleted successfully.`,\n type: \"info\",\n })\n } catch (error) {\n setMessage({\n text: translateError(error instanceof Error ? error.message : `Failed to delete extra spec \"${keyToDelete}\"`),\n type: \"error\",\n })\n } finally {\n setIsDeleting(null)\n }\n }\n\n const handleKeyChange = (newKey: string) => {\n setKey(newKey)\n if (errors.key) setErrors((prev) => ({ ...prev, key: undefined }))\n }\n\n const handleValueChange = (newValue: string) => {\n setValue(newValue)\n if (errors.value) setErrors((prev) => ({ ...prev, value: undefined }))\n }\n\n const shouldShowEmptyState = Object.keys(extraSpecs).length === 0 && !isAddingSpec\n\n return (\n <>\n {permissions.canCreate && (\n <Stack direction=\"horizontal\" className=\"bg-theme-background-lvl-1 mb-4 justify-end p-2\">\n <Button\n label={t`Add Metadata`}\n data-testid=\"addExtraButton\"\n onClick={() => setIsAddingSpec(true)}\n variant=\"primary\"\n disabled={isAddingSpec}\n />\n </Stack>\n )}\n\n {isAddingSpec && (\n <SpecFormRow\n specKey={key}\n value={value}\n errors={errors}\n isLoading={isSavingSpec}\n onKeyChange={handleKeyChange}\n onValueChange={handleValueChange}\n onSave={handleSave}\n onCancel={() => {\n resetForm()\n setIsAddingSpec(false)\n setMessage(null)\n }}\n />\n )}\n\n {shouldShowEmptyState ? (\n <p className=\"text-theme-default py-4 text-center\">\n {t`No extra specs found. Click \"Add Metadata\" to create one.`}\n </p>\n ) : (\n <DescriptionList>\n <DescriptionTerm>{t`Key`}</DescriptionTerm>\n <DescriptionDefinition>{t`Value`}</DescriptionDefinition>\n\n <>\n {Object.entries(extraSpecs).map(([specKey, specValue]) => (\n <SpecRow\n key={specKey}\n specKey={specKey}\n value={specValue}\n isDeleting={isDeleting === specKey}\n onDelete={() => handleDelete(specKey)}\n canDelete={permissions.canDelete}\n />\n ))}\n </>\n </DescriptionList>\n )}\n </>\n )\n}\n\nexport const EditSpecModal: React.FC<EditSpecModalProps> = ({ client, isOpen, onClose, project, flavor, canEdit }) => {\n const { t } = useLingui()\n\n const [message, setMessage] = useState<{ text: string; type: \"error\" | \"info\" } | null>(null)\n const [isAddingSpec, setIsAddingSpec] = useState(false)\n const [extraSpecsPromise, setExtraSpecsPromise] = useState<Promise<Record<string, string>> | null>(null)\n const [resolvedCanEdit, setResolvedCanEdit] = useState<boolean | undefined>(canEdit)\n\n const permissionsPromise = React.useMemo(() => {\n if (!isOpen) return null\n if (canEdit !== undefined) return Promise.resolve({ canCreate: canEdit, canDelete: canEdit })\n return createPermissionsPromise(client, project)\n }, [client, project, isOpen, canEdit])\n\n React.useEffect(() => {\n if (canEdit !== undefined) {\n setResolvedCanEdit(canEdit)\n return\n }\n permissionsPromise?.then(({ canCreate, canDelete }) => setResolvedCanEdit(canCreate || canDelete))\n }, [permissionsPromise, canEdit])\n\n const title = resolvedCanEdit ? t`Edit Metadata` : t`Metadata`\n\n React.useEffect(() => {\n if (isOpen && flavor?.id) {\n startTransition(() => {\n setExtraSpecsPromise(createExtraSpecsPromise(client, project, flavor.id))\n })\n }\n }, [isOpen, flavor?.id, client, project])\n\n const handleClose = () => {\n setMessage(null)\n setIsAddingSpec(false)\n setExtraSpecsPromise(null)\n onClose()\n }\n\n const handleSpecsUpdate = (specs: Record<string, string>) => {\n startTransition(() => {\n setExtraSpecsPromise(Promise.resolve(specs))\n })\n }\n\n if (!isOpen || !flavor || !permissionsPromise || !extraSpecsPromise) {\n return null\n }\n\n return (\n <Modal onCancel={handleClose} title={title} open={isOpen} size=\"xl\">\n <div>\n {message && (\n <Message onDismiss={() => setMessage(null)} text={message.text} variant={message.type} className=\"mb-4\" />\n )}\n\n <ErrorBoundary fallbackRender={({ error }) => <SpecsError error={error} />}>\n <Suspense fallback={<SpecsLoading />}>\n <EditSpecContent\n permissionsPromise={permissionsPromise}\n extraSpecsPromise={extraSpecsPromise}\n client={client}\n project={project}\n flavor={flavor}\n onSpecsUpdate={handleSpecsUpdate}\n isAddingSpec={isAddingSpec}\n setIsAddingSpec={setIsAddingSpec}\n message={message}\n setMessage={setMessage}\n />\n </Suspense>\n </ErrorBoundary>\n </div>\n </Modal>\n )\n}\n","import React from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { DataGridRow, DataGridCell, TextInput, ButtonRow, Button } from \"@cloudoperators/juno-ui-components\"\n\ninterface TenantAccessFormRowProps {\n tenantId: string\n errors: { tenantId?: string }\n isLoading: boolean\n onTenantIdChange: (tenantId: string) => void\n onSave: () => void\n onCancel: () => void\n}\n\nexport const TenantAccessFormRow: React.FC<TenantAccessFormRowProps> = ({\n tenantId,\n errors,\n isLoading,\n onTenantIdChange,\n onSave,\n onCancel,\n}) => {\n const { t } = useLingui()\n\n return (\n <DataGridRow>\n <DataGridCell className=\"pl-0\">\n <TextInput\n value={tenantId}\n onChange={(e) => onTenantIdChange(e.target.value)}\n placeholder={t`Enter tenant ID`}\n errortext={errors.tenantId}\n required\n />\n </DataGridCell>\n <DataGridCell>\n <ButtonRow>\n <Button icon=\"check\" onClick={onSave} variant=\"primary\" title={t`Add Tenant Access`} disabled={isLoading} />\n <Button icon=\"cancel\" onClick={onCancel} title={t`Cancel`} disabled={isLoading} />\n </ButtonRow>\n </DataGridCell>\n </DataGridRow>\n )\n}\n","import React, { useState, useEffect } from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { DataGridRow, DataGridCell, Button, Stack, Spinner } from \"@cloudoperators/juno-ui-components\"\n\ninterface FlavorAccess {\n flavor_id: string\n tenant_id: string\n}\n\ninterface TenantAccessRowProps {\n access: FlavorAccess\n isDeleting: boolean\n onDelete: () => void\n canDelete: boolean\n}\n\nexport const TenantAccessRow: React.FC<TenantAccessRowProps> = ({ access, isDeleting, onDelete, canDelete }) => {\n const { t } = useLingui()\n const [confirm, setConfirm] = useState(false)\n\n useEffect(() => {\n if (confirm) {\n const timer = setTimeout(() => {\n setConfirm(false)\n }, 3000)\n\n return () => clearTimeout(timer)\n }\n }, [confirm])\n\n const handleConfirmDelete = () => {\n setConfirm(false)\n onDelete()\n }\n\n const button = () => {\n if (!canDelete) {\n return <></>\n }\n if (confirm) {\n return (\n <Button\n variant=\"primary-danger\"\n onClick={handleConfirmDelete}\n title={t`Remove tenant access`}\n aria-label={t`Remove tenant access`}\n data-testid=\"confirm-removal\"\n disabled={isDeleting}\n >\n {t`Remove`}\n </Button>\n )\n } else {\n const tenantId = access.tenant_id\n\n return (\n <Button\n icon=\"deleteForever\"\n onClick={() => setConfirm(true)}\n title={t`Remove access for ${tenantId}`}\n aria-label={t`Remove access for ${tenantId}`}\n data-testid={`remove-${tenantId}`}\n disabled={isDeleting}\n />\n )\n }\n }\n\n return (\n <DataGridRow>\n <DataGridCell className=\"break-all\">{access.tenant_id}</DataGridCell>\n <DataGridCell>\n {isDeleting ? (\n <Stack distribution=\"center\" alignment=\"center\">\n <Spinner variant=\"primary\" />\n </Stack>\n ) : (\n <Stack distribution=\"end\" alignment=\"end\">\n {button()}\n </Stack>\n )}\n </DataGridCell>\n </DataGridRow>\n )\n}\n","import React, { use, Suspense, useState, startTransition, useEffect, useMemo } from \"react\"\nimport { TrpcClient } from \"@/client/trpcClient\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { useErrorTranslation } from \"@/client/utils/useErrorTranslation\"\nimport {\n Modal,\n Message,\n DataGrid,\n DataGridRow,\n DataGridHeadCell,\n DataGridCell,\n Stack,\n Spinner,\n Button,\n} from \"@cloudoperators/juno-ui-components\"\nimport { Flavor } from \"@/server/Compute/types/flavor\"\nimport { TenantAccessFormRow } from \"./TenantAccessFormRow\"\nimport { TenantAccessRow } from \"./TenantAccessRow\"\n\ninterface ManageAccessProps {\n client: TrpcClient\n isOpen: boolean\n onClose: () => void\n project: string\n flavor: Flavor | null\n}\n\ninterface FlavorAccess {\n flavor_id: string\n tenant_id: string\n}\n\nconst createPermissionsPromise = (client: TrpcClient, project: string) => {\n return client.compute.canUser\n .query({\n project_id: project,\n permission: [\"flavors:add_project\", \"flavors:remove_project\"],\n })\n .then(([canAdd, canRemove]) => ({ canAdd, canRemove }))\n}\n\nconst createFlavorAccessPromise = (client: TrpcClient, project: string, flavorId: string) => {\n return client.compute.getFlavorAccess.query({\n project_id: project,\n flavorId: flavorId,\n })\n}\n\nfunction AccessLoading() {\n return (\n <DataGridRow>\n <DataGridCell colSpan={2}>\n <Stack distribution=\"center\" alignment=\"center\">\n <Spinner variant=\"primary\" />\n </Stack>\n </DataGridCell>\n </DataGridRow>\n )\n}\n\nfunction AccessContent({\n permissionsPromise,\n flavorAccessPromise,\n client,\n project,\n flavor,\n onAccessUpdate,\n isAddingAccess,\n setIsAddingAccess,\n setMessage,\n}: {\n permissionsPromise: Promise<{ canAdd: boolean; canRemove: boolean }>\n flavorAccessPromise: Promise<FlavorAccess[]>\n client: TrpcClient\n project: string\n flavor: Flavor\n onAccessUpdate: (access: FlavorAccess[]) => void\n isAddingAccess: boolean\n setIsAddingAccess: (adding: boolean) => void\n setMessage: (msg: { text: string; type: \"error\" | \"info\" } | null) => void\n}) {\n const { t } = useLingui()\n const { translateError } = useErrorTranslation()\n\n const permissions = use(permissionsPromise)\n const flavorAccess = use(flavorAccessPromise) // Direkt verwenden - React 19 macht es reaktiv\n\n const [tenantId, setTenantId] = useState(\"\")\n const [errors, setErrors] = useState<{ tenantId?: string }>({})\n const [deletingTenants, setDeletingTenants] = useState<Set<string>>(new Set())\n const [isLoading, setIsLoading] = useState(false)\n\n const isPublicFlavor = flavor[\"os-flavor-access:is_public\"] !== false\n const shouldShowEmptyState = flavorAccess.length === 0 && !isAddingAccess\n\n const validateForm = () => {\n const trimmedTenantId = tenantId.trim()\n const newErrors: { tenantId?: string } = {}\n\n if (!trimmedTenantId) {\n newErrors.tenantId = \"Tenant ID is required.\"\n } else if (flavorAccess.some((access) => access.tenant_id === trimmedTenantId)) {\n newErrors.tenantId = \"This tenant already has access to this flavor.\"\n }\n\n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }\n\n const resetForm = () => {\n setTenantId(\"\")\n setErrors({})\n }\n\n const handleSave = async () => {\n if (!validateForm()) {\n setMessage({ text: t`Please fix the validation errors below.`, type: \"error\" })\n return\n }\n\n setIsLoading(true)\n try {\n const trimmedTenantId = tenantId.trim()\n\n const updatedAccess = await client.compute.addTenantAccess.mutate({\n project_id: project,\n flavorId: flavor.id,\n targetProjectId: trimmedTenantId,\n })\n\n onAccessUpdate(updatedAccess)\n\n setMessage({\n text: t`Tenant access for \"${trimmedTenantId}\" has been added successfully.`,\n type: \"info\",\n })\n resetForm()\n setIsAddingAccess(false)\n } catch (error) {\n const errorMessage = (error as Error)?.message || \"Failed to add tenant access\"\n\n setMessage({\n text: translateError(errorMessage || \"Failed to add tenant access\"),\n type: \"error\",\n })\n } finally {\n setIsLoading(false)\n }\n }\n\n const handleRemoveTenant = async (tenantIdToRemove: string) => {\n setDeletingTenants((prev) => new Set(prev).add(tenantIdToRemove))\n\n try {\n const updatedAccess = await client.compute.removeTenantAccess.mutate({\n project_id: project,\n flavorId: flavor.id,\n targetProjectId: tenantIdToRemove,\n })\n\n onAccessUpdate(updatedAccess)\n setMessage({\n text: t`Tenant access for \"${tenantIdToRemove}\" has been removed successfully.`,\n type: \"info\",\n })\n } catch (error) {\n const errorMessage = (error as Error)?.message || \"Failed to remove tenant access\"\n\n setMessage({\n text: translateError(errorMessage || `Failed to remove tenant access for \"${tenantIdToRemove}\"`),\n type: \"error\",\n })\n } finally {\n setDeletingTenants((prev) => {\n const newSet = new Set(prev)\n newSet.delete(tenantIdToRemove)\n return newSet\n })\n }\n }\n\n const handleTenantIdChange = (newTenantId: string) => {\n setTenantId(newTenantId)\n if (errors.tenantId) setErrors((prev) => ({ ...prev, tenantId: undefined }))\n }\n\n if (isPublicFlavor) {\n return (\n <DataGrid columns={2}>\n <DataGridRow>\n <DataGridHeadCell>{t`Tenant ID`}</DataGridHeadCell>\n <DataGridHeadCell> </DataGridHeadCell>\n </DataGridRow>\n <DataGridRow>\n <DataGridCell colSpan={2} className=\"text-theme-default py-4 text-center\">\n {t`This is a public flavor. All tenants have access to it.`}\n </DataGridCell>\n </DataGridRow>\n </DataGrid>\n )\n }\n\n return (\n <>\n {permissions.canAdd && (\n <Stack direction=\"horizontal\" className=\"bg-theme-background-lvl-1 justify-end p-2\">\n <Button\n label={t`Add Tenant Access`}\n data-testid=\"addTenantButton\"\n onClick={() => setIsAddingAccess(true)}\n variant=\"primary\"\n disabled={isAddingAccess}\n />\n </Stack>\n )}\n\n <DataGrid columns={2}>\n <DataGridRow>\n <DataGridHeadCell>{t`Tenant ID`}</DataGridHeadCell>\n <DataGridHeadCell></DataGridHeadCell>\n </DataGridRow>\n\n {isAddingAccess && (\n <TenantAccessFormRow\n tenantId={tenantId}\n errors={errors}\n isLoading={isLoading}\n onTenantIdChange={handleTenantIdChange}\n onSave={handleSave}\n onCancel={() => {\n resetForm()\n setIsAddingAccess(false)\n setMessage(null)\n }}\n />\n )}\n\n {flavorAccess.map((access) => (\n <TenantAccessRow\n key={access.tenant_id}\n access={access}\n isDeleting={deletingTenants.has(access.tenant_id)}\n onDelete={() => handleRemoveTenant(access.tenant_id)}\n canDelete={permissions.canRemove}\n />\n ))}\n\n {shouldShowEmptyState && (\n <DataGridRow>\n <DataGridCell colSpan={2} className=\"text-theme-default py-4 text-center\">\n {t`No specific tenant access configured for this private flavor. Click \"Add Tenant Access\" to grant access.`}\n </DataGridCell>\n </DataGridRow>\n )}\n </DataGrid>\n </>\n )\n}\n\nexport const ManageAccessModal: React.FC<ManageAccessProps> = ({ client, isOpen, onClose, project, flavor }) => {\n const { t } = useLingui()\n const { translateError } = useErrorTranslation()\n\n const [message, setMessage] = useState<{ text: string; type: \"error\" | \"info\" } | null>(null)\n const [isAddingAccess, setIsAddingAccess] = useState(false)\n\n const permissionsPromise = useMemo(\n () => (isOpen ? createPermissionsPromise(client, project) : null),\n [client, project, isOpen]\n )\n\n const flavorAccessPromise = useMemo(() => {\n if (!isOpen || !flavor?.id) return null\n return createFlavorAccessPromise(client, project, flavor.id)\n .then((access) =>\n access.filter((entry, idx, arr) => arr.findIndex((e) => e.tenant_id === entry.tenant_id) === idx)\n )\n .catch((error) => {\n const msg = translateError((error as Error)?.message || \"GET_FLAVOR_ACCESS_FAILED\")\n setMessage({ text: msg, type: \"error\" })\n return [] as FlavorAccess[]\n })\n }, [isOpen, flavor?.id, client, project])\n\n useEffect(() => {\n if (isOpen) setMessage(null)\n }, [isOpen, flavor?.id])\n\n // After add/remove, the server returns the updated list. We store it as an override so\n // the UI reflects the change immediately without refetching. The key prevents a stale\n // override from a previously opened flavor from leaking into the current modal session.\n const [flavorAccessOverride, setFlavorAccessOverride] = useState<{\n key: string\n promise: Promise<FlavorAccess[]>\n } | null>(null)\n\n const accessKey = `${isOpen}-${flavor?.id}`\n const activeFlavorAccessPromise =\n flavorAccessOverride?.key === accessKey ? flavorAccessOverride.promise : flavorAccessPromise\n\n const handleClose = () => {\n setMessage(null)\n setIsAddingAccess(false)\n setFlavorAccessOverride(null)\n onClose()\n }\n\n const handleAccessUpdate = (access: FlavorAccess[]) => {\n const deduplicated = access.filter(\n (entry, idx, arr) => arr.findIndex((e) => e.tenant_id === entry.tenant_id) === idx\n )\n startTransition(() => {\n setFlavorAccessOverride({ key: accessKey, promise: Promise.resolve(deduplicated) })\n })\n }\n\n if (!isOpen || !flavor || !permissionsPromise || !activeFlavorAccessPromise) {\n return null\n }\n const flavorName = flavor.name\n\n return (\n <Modal onCancel={handleClose} title={t`Manage Access - ${flavorName}`} open={isOpen} size=\"xl\">\n <div>\n {message && (\n <Message\n onDismiss={() => setMessage(null)}\n text={message.text}\n variant={message.type}\n className=\"mb-4\"\n dismissible\n />\n )}\n\n <Suspense fallback={<AccessLoading />}>\n <AccessContent\n permissionsPromise={permissionsPromise}\n flavorAccessPromise={activeFlavorAccessPromise}\n client={client}\n project={project}\n flavor={flavor}\n onAccessUpdate={handleAccessUpdate}\n isAddingAccess={isAddingAccess}\n setIsAddingAccess={setIsAddingAccess}\n setMessage={setMessage}\n />\n </Suspense>\n </div>\n </Modal>\n )\n}\n","import React, { useState, useEffect } from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { TrpcClient } from \"@/client/trpcClient\"\nimport {\n Modal,\n Stack,\n TextInput,\n DescriptionList,\n DescriptionTerm,\n DescriptionDefinition,\n} from \"@cloudoperators/juno-ui-components\"\nimport { Flavor } from \"@/server/Compute/types/flavor\"\nimport { Trans } from \"@lingui/react/macro\"\nimport { useErrorTranslation } from \"@/client/utils/useErrorTranslation\"\n\ninterface DeleteFlavorModalProps {\n client: TrpcClient\n isOpen: boolean\n onClose: () => void\n project: string\n flavor: Flavor | null\n onSuccess: () => void\n}\n\nexport const DeleteFlavorModal: React.FC<DeleteFlavorModalProps> = ({\n client,\n isOpen,\n onClose,\n project,\n flavor,\n onSuccess,\n}) => {\n const { t } = useLingui()\n const { translateError } = useErrorTranslation()\n const [isLoading, setIsLoading] = useState(false)\n const [generalError, setGeneralError] = useState<string | null>(null)\n const [confirmText, setConfirmText] = useState(\"\")\n\n useEffect(() => {\n if (!isOpen) {\n setConfirmText(\"\")\n setGeneralError(null)\n }\n }, [isOpen])\n\n const handleClose = () => {\n setGeneralError(null)\n setConfirmText(\"\")\n setIsLoading(false)\n onClose()\n }\n\n const handleConfirm = async () => {\n if (!flavor?.id) {\n setGeneralError(t`No flavor selected for deletion.`)\n return\n }\n\n setGeneralError(null)\n\n try {\n setIsLoading(true)\n\n await client.compute.deleteFlavor.mutate({\n project_id: project,\n flavorId: flavor.id,\n })\n onSuccess()\n handleClose()\n } catch (error) {\n const errorMessage = (error as Error)?.message\n ? translateError((error as Error).message)\n : t`Failed to delete flavor. Please try again.`\n setGeneralError(errorMessage)\n } finally {\n setIsLoading(false)\n }\n }\n\n const isConfirmValid = confirmText === \"delete\"\n const confirmLabel = isLoading ? t`Deleting...` : t`Delete Flavor`\n\n return (\n <Modal\n open={isOpen}\n onCancel={handleClose}\n title={t`Delete Flavor`}\n size=\"large\"\n confirmButtonLabel={confirmLabel}\n confirmButtonVariant=\"primary-danger\"\n onConfirm={handleConfirm}\n cancelButtonLabel={t`Cancel`}\n disableConfirmButton={!isConfirmValid || isLoading}\n disableCancelButton={isLoading}\n disableCloseButton={isLoading}\n >\n <Stack direction=\"vertical\" gap=\"4\">\n {generalError && (\n <p className=\"text-theme-error\" role=\"alert\" aria-live=\"assertive\">\n {generalError}\n </p>\n )}\n\n <p className=\"text-theme-default\">\n <Trans>This action cannot be undone. The flavor will be permanently deleted.</Trans>\n </p>\n\n {flavor && (\n <DescriptionList>\n <DescriptionTerm>{t`Name`}</DescriptionTerm>\n <DescriptionDefinition>{flavor.name}</DescriptionDefinition>\n\n <DescriptionTerm>{t`ID`}</DescriptionTerm>\n <DescriptionDefinition>{flavor.id}</DescriptionDefinition>\n\n <DescriptionTerm>{t`VCPUs`}</DescriptionTerm>\n <DescriptionDefinition>{flavor.vcpus}</DescriptionDefinition>\n\n <DescriptionTerm>{t`RAM`}</DescriptionTerm>\n <DescriptionDefinition>{flavor.ram} MiB</DescriptionDefinition>\n\n <DescriptionTerm>{t`Disk`}</DescriptionTerm>\n <DescriptionDefinition>{flavor.disk} GiB</DescriptionDefinition>\n\n <DescriptionTerm>{t`Swap`}</DescriptionTerm>\n <DescriptionDefinition>\n {flavor.swap === 0 || flavor.swap === \"\" ? <Trans>None</Trans> : `${Number(flavor.swap)} MiB`}\n </DescriptionDefinition>\n </DescriptionList>\n )}\n\n <div>\n <TextInput\n label={t`Type \"delete\" to confirm`}\n value={confirmText}\n onChange={(e) => setConfirmText(e.target.value)}\n placeholder=\"delete\"\n autoFocus\n />\n </div>\n </Stack>\n </Modal>\n )\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { H as e, I as t, K as n, V as r, X as i, Z as a, a as o, tt as s } from "./build-C_4vRMCq.mjs";
|
|
2
|
+
import { t as c } from "./cn-DM4Cy3jv.mjs";
|
|
3
|
+
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
4
|
+
import { useCallback as d, useState as f } from "react";
|
|
5
|
+
import { useLingui as p } from "@lingui/react";
|
|
6
|
+
//#region src/client/components/ListToolbar/SelectedFilters.tsx
|
|
7
|
+
var m = ({ selectedFilters: e, onDelete: t, onClear: n }) => {
|
|
8
|
+
let { i18n: a, _: s } = p();
|
|
9
|
+
return /*#__PURE__*/ u(i, {
|
|
10
|
+
gap: "2",
|
|
11
|
+
wrap: !0,
|
|
12
|
+
alignment: "start",
|
|
13
|
+
distribution: "start",
|
|
14
|
+
children: [e.map((e) => /*#__PURE__*/ l(r, {
|
|
15
|
+
closeable: !0,
|
|
16
|
+
pillKey: e.name,
|
|
17
|
+
pillValue: e.value,
|
|
18
|
+
onClose: () => t(e)
|
|
19
|
+
}, `${e.name}:${e.value}`)), e.length > 1 && /*#__PURE__*/ l(o, {
|
|
20
|
+
size: "small",
|
|
21
|
+
label: a._({ id: "yYxB17" }),
|
|
22
|
+
onClick: n
|
|
23
|
+
})]
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
//#endregion
|
|
27
|
+
//#region src/client/components/ListToolbar/FiltersInput.tsx
|
|
28
|
+
function h(e) {
|
|
29
|
+
return e == null ? !0 : typeof e == "string" || Array.isArray(e) ? e.length === 0 : e instanceof Map || e instanceof Set ? e.size === 0 : typeof e == "object" && Object.keys(e).length === 0;
|
|
30
|
+
}
|
|
31
|
+
var g = ({ filters: r, onChange: i, selectClassName: o = "", comboboxClassName: m = "" }) => {
|
|
32
|
+
let { i18n: g, _ } = p(), [v, y] = f(""), [b, x] = f(""), S = r.find((e) => e.filterName === v)?.values?.filter((e) => e), C = d((e) => {
|
|
33
|
+
x(e), !h(v) && !h(e) && i({
|
|
34
|
+
name: v,
|
|
35
|
+
value: e
|
|
36
|
+
}), setTimeout(() => {
|
|
37
|
+
x("");
|
|
38
|
+
}, 0);
|
|
39
|
+
}, [
|
|
40
|
+
v,
|
|
41
|
+
x,
|
|
42
|
+
i
|
|
43
|
+
]), w = () => ({
|
|
44
|
+
className: c("w-full sm:min-w-0 sm:flex-1", o),
|
|
45
|
+
name: "filter",
|
|
46
|
+
"data-testid": "select-filterValue",
|
|
47
|
+
label: g._({ id: "0cVgUw" }),
|
|
48
|
+
value: v,
|
|
49
|
+
onChange: (e) => {
|
|
50
|
+
y(String(e));
|
|
51
|
+
}
|
|
52
|
+
}), T = () => ({
|
|
53
|
+
className: c("w-full sm:min-w-0 sm:flex-1", m),
|
|
54
|
+
name: "filterValue",
|
|
55
|
+
"data-testid": "combobox-filterValue",
|
|
56
|
+
value: b,
|
|
57
|
+
disabled: !v,
|
|
58
|
+
onChange: C
|
|
59
|
+
});
|
|
60
|
+
return /*#__PURE__*/ u(a, {
|
|
61
|
+
className: "flex w-full flex-col sm:w-auto sm:flex-row sm:items-end",
|
|
62
|
+
children: [/*#__PURE__*/ l(s, {
|
|
63
|
+
...w(),
|
|
64
|
+
children: r?.map(({ displayName: e, filterName: n }) => /*#__PURE__*/ l(t, {
|
|
65
|
+
value: n,
|
|
66
|
+
label: e,
|
|
67
|
+
"data-testid": n
|
|
68
|
+
}, n))
|
|
69
|
+
}), /*#__PURE__*/ l(n, {
|
|
70
|
+
...T(),
|
|
71
|
+
children: S?.map((t) => /*#__PURE__*/ l(e, {
|
|
72
|
+
value: t,
|
|
73
|
+
label: t,
|
|
74
|
+
"data-testid": t
|
|
75
|
+
}, t))
|
|
76
|
+
})]
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
//#endregion
|
|
80
|
+
export { m as n, g as t };
|
|
81
|
+
|
|
82
|
+
//# sourceMappingURL=FiltersInput-B8CNBg1L.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FiltersInput-B8CNBg1L.mjs","names":["Button","Pill","Stack","SelectedFilters","selectedFilters","onDelete","onClear","useLingui","gap","wrap","alignment","distribution","map","filter","closeable","pillKey","name","pillValue","value","onClose","length","size","label","t","onClick","useCallback","useState","InputGroup","ComboBox","ComboBoxOption","SelectOption","Select","cn","isEmpty","value","Array","isArray","length","Map","Set","size","Object","keys","FiltersInput","filters","onChange","selectClassName","comboboxClassName","useLingui","selectedFilterName","setSelectedFilterName","selectedFilterValue","setSelectedFilterValue","filterValues","find","filter","filterName","values","handleValueChange","name","setTimeout","getSelectProps","className","label","t","String","getComboBoxProps","disabled","map","displayName","data-testid"],"sources":["../../src/client/components/ListToolbar/SelectedFilters.tsx","../../src/client/components/ListToolbar/FiltersInput.tsx"],"sourcesContent":["import { useLingui } from \"@lingui/react/macro\"\nimport { Button, Pill, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { SelectedFilter } from \"./types\"\n\nexport type SelectedFiltersProps = {\n /**\n * Array of currently active filters to be displayed as closeable pills.\n */\n selectedFilters: SelectedFilter[]\n\n /**\n * Callback function invoked when a user removes an individual filter pill.\n */\n onDelete: (filter: SelectedFilter) => void\n\n /**\n * Callback function invoked when the \"Clear all\" button is clicked.\n */\n onClear: () => void\n}\n\n/**\n * SelectedFilters Component\n *\n * Displays currently active filters as closeable pill components with individual\n * remove buttons and an optional \"Clear all\" button (shown when 2+ filters are active).\n *\n * The pills are arranged in a flexible, wrapping layout that adapts to available space.\n */\nexport const SelectedFilters = ({ selectedFilters, onDelete, onClear }: SelectedFiltersProps) => {\n const { t } = useLingui()\n\n return (\n <Stack gap=\"2\" wrap={true} alignment=\"start\" distribution=\"start\">\n {/* Render a closeable pill for each selected filter */}\n {selectedFilters.map((filter) => (\n <Pill\n key={`${filter.name}:${filter.value}`}\n closeable\n pillKey={filter.name}\n pillValue={filter.value}\n onClose={() => onDelete(filter)}\n />\n ))}\n {selectedFilters.length > 1 && <Button size=\"small\" label={t`Clear all`} onClick={onClear} />}\n </Stack>\n )\n}\n","import { useCallback, useState } from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport {\n InputGroup,\n ComboBox,\n ComboBoxProps,\n ComboBoxOption,\n SelectOption,\n Select,\n SelectProps,\n} from \"@cloudoperators/juno-ui-components\"\nimport { cn } from \"@/client/utils/cn\"\nimport { Filter, SelectedFilter } from \"./types\"\n\nexport type FiltersInputProps = {\n filters: Filter[]\n onChange: (filter: SelectedFilter) => void\n selectClassName?: string\n comboboxClassName?: string\n}\n\nfunction isEmpty(value: unknown) {\n if (value == null) return true\n if (typeof value === \"string\" || Array.isArray(value)) return value.length === 0\n if (value instanceof Map || value instanceof Set) return value.size === 0\n if (typeof value === \"object\") return Object.keys(value).length === 0\n return false\n}\n\nexport const FiltersInput = ({\n filters,\n onChange,\n selectClassName = \"\",\n comboboxClassName = \"\",\n}: FiltersInputProps) => {\n const { t } = useLingui()\n\n const [selectedFilterName, setSelectedFilterName] = useState<string>(\"\")\n const [selectedFilterValue, setSelectedFilterValue] = useState<string>(\"\")\n\n const filterValues: string[] | undefined = filters\n .find((filter) => filter.filterName === selectedFilterName)\n ?.values?.filter((value) => value)\n\n const handleValueChange = useCallback(\n (value: string) => {\n setSelectedFilterValue(value)\n if (!isEmpty(selectedFilterName) && !isEmpty(value)) {\n onChange({\n name: selectedFilterName,\n value: value,\n })\n }\n setTimeout(() => {\n setSelectedFilterValue(\"\")\n }, 0)\n },\n [selectedFilterName, setSelectedFilterValue, onChange]\n )\n\n const getSelectProps = (): SelectProps & { \"data-testid\"?: string } => ({\n className: cn(\"w-full sm:min-w-0 sm:flex-1\", selectClassName),\n name: \"filter\",\n \"data-testid\": \"select-filterValue\",\n label: t`Filter by`,\n value: selectedFilterName,\n onChange: (value: string | number | string[] | undefined) => {\n setSelectedFilterName(String(value))\n },\n })\n\n const getComboBoxProps = (): ComboBoxProps & { \"data-testid\"?: string } => ({\n className: cn(\"w-full sm:min-w-0 sm:flex-1\", comboboxClassName),\n name: \"filterValue\",\n \"data-testid\": \"combobox-filterValue\",\n value: selectedFilterValue,\n disabled: !selectedFilterName,\n onChange: handleValueChange,\n })\n\n return (\n <InputGroup className=\"flex w-full flex-col sm:w-auto sm:flex-row sm:items-end\">\n <Select {...getSelectProps()}>\n {filters?.map(({ displayName, filterName }) => (\n <SelectOption value={filterName} label={displayName} key={filterName} data-testid={filterName} />\n ))}\n </Select>\n <ComboBox {...getComboBoxProps()}>\n {filterValues?.map((value) => (\n <ComboBoxOption value={value} key={value} label={value} data-testid={value} />\n ))}\n </ComboBox>\n </InputGroup>\n )\n}\n"],"mappings":";;;;;;AA6BA,IAAaG,KAAmB,EAAEC,oBAAiBC,aAAUC,iBAA+B;CAC1F,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,EAAAA;CAEd,OACE,gBAACL,GAAAA;EAAMM,KAAI;EAAIC,MAAM;EAAMC,WAAU;EAAQC,cAAa;EAEvDP,UAAAA,CAAAA,EAAgBQ,KAAKC,MACpB,gBAACZ,GAAAA;GAECa,WAAS;GACTC,SAASF,EAAOG;GAChBC,WAAWJ,EAAOK;GAClBC,eAAed,EAASQ,CAAAA;EAJnB,GAAA,GAAGA,EAAOG,KAAK,GAAGH,EAAOK,OAAO,CAAA,GAOxCd,EAAgBgB,SAAS,KAAK,gBAACpB,GAAAA;GAAOqB,MAAK;GAAQC,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAU,CAAA;GAAGC,SAASlB;;;AAGxF;;;AC1BA,SAAS2B,EAAQC,GAAc;CAK7B,OAJIA,KAAS,OAAa,KACtB,OAAOA,KAAU,YAAYC,MAAMC,QAAQF,CAAAA,IAAeA,EAAMG,WAAW,IAC3EH,aAAiBI,OAAOJ,aAAiBK,MAAYL,EAAMM,SAAS,IACpE,OAAON,KAAU,YAAiBO,OAAOC,KAAKR,CAAAA,CAAAA,CAAOG,WAAW;AAEtE;AAEA,IAAaM,KAAgB,EAC3BC,YACAC,aACAC,qBAAkB,IAClBC,uBAAoB,SACF;CAClB,IAAM,EAAA,MAAA,GAAA,MAAQC,EAAAA,GAER,CAACC,GAAoBC,KAAyBxB,EAAiB,EAAA,GAC/D,CAACyB,GAAqBC,KAA0B1B,EAAiB,EAAA,GAEjE2B,IAAqCT,EACxCU,MAAMC,MAAWA,EAAOC,eAAeP,CAAAA,CAAAA,EACtCQ,QAAQF,QAAQrB,MAAUA,CAAAA,GAExBwB,IAAoBjC,GACvBS,MAAAA;EAQC0B,AAPAR,EAAuBlB,CAAAA,GACnB,CAACD,EAAQgB,CAAAA,KAAuB,CAAChB,EAAQC,CAAAA,KAC3CW,EAAS;GACPc,MAAMV;GACCf;EACT,CAAA,GAEF0B,iBAAW;GACTR,EAAuB,EAAA;EACzB,GAAG,CAAA;CACL,GACA;EAACH;EAAoBG;EAAwBP;CAAS,CAAA,GAGlDgB,WAAkE;EACtEC,WAAW9B,EAAG,+BAA+Bc,CAAAA;EAC7Ca,MAAM;EACN,eAAe;EACfI,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAU,CAAA;EAClB9B,OAAOe;EACPJ,WAAWX,MAAAA;GACTgB,EAAsBe,OAAO/B,CAAAA,CAAAA;EAC/B;CACF,IAEMgC,WAAsE;EAC1EJ,WAAW9B,EAAG,+BAA+Be,CAAAA;EAC7CY,MAAM;EACN,eAAe;EACfzB,OAAOiB;EACPgB,UAAU,CAAClB;EACXJ,UAAUa;CACZ;CAEA,OACE,gBAAC/B,GAAAA;EAAWmC,WAAU;EACpB,UAAA,CAAA,gBAAC/B,GAAAA;GAAQ,GAAG8B,EAAAA;GACTjB,UAAAA,GAASwB,KAAK,EAAEC,gBAAab,oBAC5B,gBAAC1B,GAAAA;IAAaI,OAAOsB;IAAYO,OAAOM;IAA8BC,eAAad;GAAzBA,GAAAA,CAAAA,CAAAA;EAG9D,CAAA,GAAA,gBAAC5B,GAAAA;GAAU,GAAGsC,EAAAA;GACXb,UAAAA,GAAce,KAAKlC,MAClB,gBAACL,GAAAA;IAAsBK;IAAmB6B,OAAO7B;IAAOoC,eAAapC;GAAlCA,GAAAA,CAAAA,CAAAA;;;AAK7C"}
|
package/dist/client/{FloatingIpActionModals-BcceUHcg.mjs → FloatingIpActionModals-BraiJWBi.mjs}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { a as u } from "./trpcClient-
|
|
1
|
+
import { F as e, I as t, J as n, W as r, X as i, m as a, p as o, st as s, tt as c, ut as l } from "./build-C_4vRMCq.mjs";
|
|
2
|
+
import { a as u } from "./trpcClient-D7gpR7YG.mjs";
|
|
3
3
|
import { t as d } from "./useProjectId-DBc5lpoU.mjs";
|
|
4
|
-
import "./hooks-
|
|
4
|
+
import "./hooks-LutR2Yg3.mjs";
|
|
5
5
|
import { t as f } from "./useModal-DCs1OJh7.mjs";
|
|
6
6
|
import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
7
7
|
import { Trans as g, useLingui as _ } from "@lingui/react";
|
|
@@ -68,28 +68,28 @@ var x = () => {
|
|
|
68
68
|
isDeletePending: r.isPending,
|
|
69
69
|
deleteError: r.error?.message ?? null
|
|
70
70
|
};
|
|
71
|
-
}, S = ({ floatingIp:
|
|
72
|
-
let { i18n: S, _: C } = _(), w = d(), { floating_ip_address: T } =
|
|
71
|
+
}, S = ({ floatingIp: i, open: a, onClose: s, onUpdate: f, isLoading: p = !1, error: x = null }) => {
|
|
72
|
+
let { i18n: S, _: C } = _(), w = d(), { floating_ip_address: T } = i, E = v.object({
|
|
73
73
|
port_id: v.string(),
|
|
74
74
|
fixed_ip_address: v.string()
|
|
75
75
|
}), { data: D = [] } = u.network.floatingIp.listAvailablePorts.useQuery({ project_id: w }), O = y({
|
|
76
76
|
defaultValues: {
|
|
77
|
-
port_id:
|
|
77
|
+
port_id: i.port_id ?? "",
|
|
78
78
|
fixed_ip_address: ""
|
|
79
79
|
},
|
|
80
80
|
validators: { onSubmit: E },
|
|
81
81
|
onSubmit: async ({ value: e }) => {
|
|
82
|
-
p || (await f(
|
|
82
|
+
p || (await f(i.id, {
|
|
83
83
|
project_id: w,
|
|
84
84
|
port_id: e.port_id,
|
|
85
85
|
...e.fixed_ip_address && { fixed_ip_address: e.fixed_ip_address }
|
|
86
86
|
}), k());
|
|
87
87
|
}
|
|
88
88
|
}), k = () => {
|
|
89
|
-
O.reset(),
|
|
89
|
+
O.reset(), s();
|
|
90
90
|
}, A = b(O.store, (e) => e.values.port_id), j = D.find((e) => e.id === A)?.fixed_ips ?? [];
|
|
91
|
-
return /*#__PURE__*/ h(
|
|
92
|
-
id:
|
|
91
|
+
return /*#__PURE__*/ h(n, {
|
|
92
|
+
id: i.id,
|
|
93
93
|
open: a,
|
|
94
94
|
size: "large",
|
|
95
95
|
title: S._({
|
|
@@ -110,22 +110,22 @@ var x = () => {
|
|
|
110
110
|
}),
|
|
111
111
|
p && /*#__PURE__*/ h("div", {
|
|
112
112
|
className: "mb-4 flex items-center justify-center gap-2",
|
|
113
|
-
children: [/*#__PURE__*/ m(
|
|
113
|
+
children: [/*#__PURE__*/ m(r, { variant: "primary" }), /*#__PURE__*/ m("span", {
|
|
114
114
|
className: "text-theme-high text-sm",
|
|
115
115
|
children: /*#__PURE__*/ m(g, { id: "tejJLY" })
|
|
116
116
|
})]
|
|
117
117
|
}),
|
|
118
|
-
!p && /*#__PURE__*/ h(
|
|
118
|
+
!p && /*#__PURE__*/ h(l, {
|
|
119
119
|
className: "mb-0",
|
|
120
120
|
id: "associate-floating-ip-form",
|
|
121
121
|
onSubmit: (e) => {
|
|
122
122
|
e.preventDefault(), O.handleSubmit();
|
|
123
123
|
},
|
|
124
|
-
children: [/*#__PURE__*/ m(
|
|
124
|
+
children: [/*#__PURE__*/ m(o, {
|
|
125
125
|
className: "mb-4",
|
|
126
126
|
children: /*#__PURE__*/ m(O.Field, {
|
|
127
127
|
name: "port_id",
|
|
128
|
-
children: (e) => /*#__PURE__*/ m(
|
|
128
|
+
children: (e) => /*#__PURE__*/ m(c, {
|
|
129
129
|
id: e.name,
|
|
130
130
|
name: e.name,
|
|
131
131
|
value: e.state.value,
|
|
@@ -139,15 +139,15 @@ var x = () => {
|
|
|
139
139
|
placeholder: S._({ id: "UztfYZ" }),
|
|
140
140
|
errortext: e.state.meta.errors.map((e) => e?.message).join(", "),
|
|
141
141
|
disabled: p,
|
|
142
|
-
children: D.map((e) => /*#__PURE__*/ m(
|
|
142
|
+
children: D.map((e) => /*#__PURE__*/ m(t, {
|
|
143
143
|
value: e.id,
|
|
144
144
|
label: e.name ? `${e.name} (${e.id})` : e.id
|
|
145
145
|
}, e.id))
|
|
146
146
|
})
|
|
147
147
|
})
|
|
148
|
-
}), /*#__PURE__*/ m(
|
|
148
|
+
}), /*#__PURE__*/ m(o, { children: /*#__PURE__*/ m(O.Field, {
|
|
149
149
|
name: "fixed_ip_address",
|
|
150
|
-
children: (e) => /*#__PURE__*/ m(
|
|
150
|
+
children: (e) => /*#__PURE__*/ m(c, {
|
|
151
151
|
id: e.name,
|
|
152
152
|
name: e.name,
|
|
153
153
|
value: e.state.value,
|
|
@@ -157,7 +157,7 @@ var x = () => {
|
|
|
157
157
|
helptext: S._({ id: "PtjzS+" }),
|
|
158
158
|
errortext: e.state.meta.errors.map((e) => e?.message).join(", "),
|
|
159
159
|
disabled: p || j.length === 0,
|
|
160
|
-
children: j.map(({ ip_address: e }) => /*#__PURE__*/ m(
|
|
160
|
+
children: j.map(({ ip_address: e }) => /*#__PURE__*/ m(t, {
|
|
161
161
|
value: e,
|
|
162
162
|
label: e
|
|
163
163
|
}, e))
|
|
@@ -166,31 +166,31 @@ var x = () => {
|
|
|
166
166
|
})
|
|
167
167
|
]
|
|
168
168
|
});
|
|
169
|
-
}, C = ({ floatingIp:
|
|
170
|
-
let { i18n: x, _: S } = _(), C = d(), { floating_ip_address: w } =
|
|
169
|
+
}, C = ({ floatingIp: t, open: s, onClose: c, onUpdate: u, isLoading: f = !1, error: p = null }) => {
|
|
170
|
+
let { i18n: x, _: S } = _(), C = d(), { floating_ip_address: w } = t, T = v.object({ detach: v.string().refine((e) => e === "detach", { message: x._({ id: "dPoCVe" }) }) }), E = y({
|
|
171
171
|
defaultValues: { detach: "" },
|
|
172
|
-
validators: { onSubmit:
|
|
172
|
+
validators: { onSubmit: T },
|
|
173
173
|
onSubmit: async () => {
|
|
174
|
-
f || (await u(
|
|
174
|
+
f || (await u(t.id, {
|
|
175
175
|
project_id: C,
|
|
176
176
|
port_id: null
|
|
177
|
-
}),
|
|
177
|
+
}), O());
|
|
178
178
|
}
|
|
179
|
-
}),
|
|
180
|
-
|
|
179
|
+
}), D = b(E.store, (e) => e.isSubmitting || e.values.detach !== "detach"), O = () => {
|
|
180
|
+
E.reset(), c();
|
|
181
181
|
};
|
|
182
|
-
return /*#__PURE__*/ h(
|
|
183
|
-
open:
|
|
182
|
+
return /*#__PURE__*/ h(n, {
|
|
183
|
+
open: s,
|
|
184
184
|
size: "large",
|
|
185
185
|
title: x._({
|
|
186
186
|
id: "vZUKSz",
|
|
187
187
|
values: { floating_ip_address: w }
|
|
188
188
|
}),
|
|
189
|
-
onCancel:
|
|
189
|
+
onCancel: O,
|
|
190
190
|
cancelButtonLabel: x._({ id: "dEgA5A" }),
|
|
191
191
|
confirmButtonLabel: x._({ id: "FOcBn3" }),
|
|
192
|
-
onConfirm:
|
|
193
|
-
disableConfirmButton: f ||
|
|
192
|
+
onConfirm: E.handleSubmit,
|
|
193
|
+
disableConfirmButton: f || D,
|
|
194
194
|
children: [
|
|
195
195
|
p && /*#__PURE__*/ m(e, {
|
|
196
196
|
dismissible: !1,
|
|
@@ -200,12 +200,12 @@ var x = () => {
|
|
|
200
200
|
}),
|
|
201
201
|
f && /*#__PURE__*/ h("div", {
|
|
202
202
|
className: "mb-4 flex items-center justify-center gap-2",
|
|
203
|
-
children: [/*#__PURE__*/ m(
|
|
203
|
+
children: [/*#__PURE__*/ m(r, { variant: "primary" }), /*#__PURE__*/ m("span", {
|
|
204
204
|
className: "text-theme-high text-sm",
|
|
205
205
|
children: /*#__PURE__*/ m(g, { id: "D3IRXw" })
|
|
206
206
|
})]
|
|
207
207
|
}),
|
|
208
|
-
/*#__PURE__*/ h(
|
|
208
|
+
/*#__PURE__*/ h(i, {
|
|
209
209
|
gap: "2.5",
|
|
210
210
|
direction: "vertical",
|
|
211
211
|
className: "mb-2.5",
|
|
@@ -214,15 +214,15 @@ var x = () => {
|
|
|
214
214
|
components: { 0: /*#__PURE__*/ m("strong", {}) }
|
|
215
215
|
}) })]
|
|
216
216
|
}),
|
|
217
|
-
!f && /*#__PURE__*/ m(
|
|
217
|
+
!f && /*#__PURE__*/ m(l, {
|
|
218
218
|
className: "mb-0",
|
|
219
219
|
id: "detach-floating-ip-form",
|
|
220
220
|
onSubmit: (e) => {
|
|
221
|
-
e.preventDefault(),
|
|
221
|
+
e.preventDefault(), E.handleSubmit();
|
|
222
222
|
},
|
|
223
|
-
children: /*#__PURE__*/ m(
|
|
223
|
+
children: /*#__PURE__*/ m(o, { children: /*#__PURE__*/ m(E.Field, {
|
|
224
224
|
name: "detach",
|
|
225
|
-
children: (e) => /*#__PURE__*/ m(
|
|
225
|
+
children: (e) => /*#__PURE__*/ m(a, {
|
|
226
226
|
id: e.name,
|
|
227
227
|
name: e.name,
|
|
228
228
|
value: e.state.value,
|
|
@@ -236,23 +236,23 @@ var x = () => {
|
|
|
236
236
|
})
|
|
237
237
|
]
|
|
238
238
|
});
|
|
239
|
-
}, w = ({ floatingIp:
|
|
240
|
-
let { i18n: p, _: x } = _(), S = d(), { description: C, floating_ip_address: w } =
|
|
239
|
+
}, w = ({ floatingIp: t, open: i, onClose: a, onUpdate: c, isLoading: u = !1, error: f = null }) => {
|
|
240
|
+
let { i18n: p, _: x } = _(), S = d(), { description: C, floating_ip_address: w } = t, T = v.object({ description: v.string().trim().min(1, p._({ id: "47eI0x" })).max(255, p._({ id: "lZvIXd" })) }), E = y({
|
|
241
241
|
defaultValues: { description: C ?? "" },
|
|
242
242
|
validators: { onSubmit: T },
|
|
243
243
|
onSubmit: async ({ value: e }) => {
|
|
244
244
|
if (u) return;
|
|
245
|
-
let
|
|
245
|
+
let n = {
|
|
246
246
|
project_id: S,
|
|
247
|
-
port_id:
|
|
247
|
+
port_id: t.port_id,
|
|
248
248
|
description: e.description.trim()
|
|
249
249
|
};
|
|
250
|
-
await
|
|
250
|
+
await c(t.id, n), D();
|
|
251
251
|
}
|
|
252
252
|
}), D = () => {
|
|
253
|
-
E.reset(),
|
|
253
|
+
E.reset(), a();
|
|
254
254
|
}, O = b(E.store, (e) => e.isSubmitting || !e.isDirty);
|
|
255
|
-
return /*#__PURE__*/ h(
|
|
255
|
+
return /*#__PURE__*/ h(n, {
|
|
256
256
|
open: i,
|
|
257
257
|
size: "large",
|
|
258
258
|
title: p._({
|
|
@@ -273,20 +273,20 @@ var x = () => {
|
|
|
273
273
|
}),
|
|
274
274
|
u && /*#__PURE__*/ h("div", {
|
|
275
275
|
className: "mb-4 flex items-center justify-center gap-2",
|
|
276
|
-
children: [/*#__PURE__*/ m(
|
|
276
|
+
children: [/*#__PURE__*/ m(r, { variant: "primary" }), /*#__PURE__*/ m("span", {
|
|
277
277
|
className: "text-theme-high text-sm",
|
|
278
278
|
children: /*#__PURE__*/ m(g, { id: "5g7owI" })
|
|
279
279
|
})]
|
|
280
280
|
}),
|
|
281
|
-
!u && /*#__PURE__*/ m(
|
|
281
|
+
!u && /*#__PURE__*/ m(l, {
|
|
282
282
|
className: "mb-0",
|
|
283
283
|
id: "edit-floating-ip-form",
|
|
284
284
|
onSubmit: (e) => {
|
|
285
285
|
e.preventDefault(), E.handleSubmit();
|
|
286
286
|
},
|
|
287
|
-
children: /*#__PURE__*/ m(
|
|
287
|
+
children: /*#__PURE__*/ m(o, { children: /*#__PURE__*/ m(E.Field, {
|
|
288
288
|
name: "description",
|
|
289
|
-
children: (e) => /*#__PURE__*/ m(
|
|
289
|
+
children: (e) => /*#__PURE__*/ m(s, {
|
|
290
290
|
id: e.name,
|
|
291
291
|
name: e.name,
|
|
292
292
|
value: e.state.value,
|
|
@@ -300,29 +300,29 @@ var x = () => {
|
|
|
300
300
|
}) })
|
|
301
301
|
})
|
|
302
302
|
]
|
|
303
|
-
},
|
|
304
|
-
}, T = ({ floatingIp:
|
|
305
|
-
let { i18n: p, _: x } = _(), { floating_ip_address: S } =
|
|
303
|
+
}, t.id);
|
|
304
|
+
}, T = ({ floatingIp: t, open: s, onClose: c, onUpdate: u, isLoading: d = !1, error: f = null }) => {
|
|
305
|
+
let { i18n: p, _: x } = _(), { floating_ip_address: S } = t, C = v.object({ release: v.string().refine((e) => e === "release", { message: p._({ id: "TPMaxo" }) }) }), w = y({
|
|
306
306
|
defaultValues: { release: "" },
|
|
307
|
-
validators: { onSubmit:
|
|
307
|
+
validators: { onSubmit: C },
|
|
308
308
|
onSubmit: async () => {
|
|
309
|
-
d || (await u(
|
|
309
|
+
d || (await u(t.id), E());
|
|
310
310
|
}
|
|
311
|
-
}),
|
|
312
|
-
|
|
311
|
+
}), T = b(w.store, (e) => e.isSubmitting || e.values.release !== "release"), E = () => {
|
|
312
|
+
w.reset(), c();
|
|
313
313
|
};
|
|
314
|
-
return /*#__PURE__*/ h(
|
|
315
|
-
open:
|
|
314
|
+
return /*#__PURE__*/ h(n, {
|
|
315
|
+
open: s,
|
|
316
316
|
size: "large",
|
|
317
317
|
title: p._({
|
|
318
318
|
id: "Ovofy+",
|
|
319
319
|
values: { floating_ip_address: S }
|
|
320
320
|
}),
|
|
321
|
-
onCancel:
|
|
321
|
+
onCancel: E,
|
|
322
322
|
cancelButtonLabel: p._({ id: "dEgA5A" }),
|
|
323
323
|
confirmButtonLabel: p._({ id: "H+a5j6" }),
|
|
324
|
-
onConfirm:
|
|
325
|
-
disableConfirmButton: d ||
|
|
324
|
+
onConfirm: w.handleSubmit,
|
|
325
|
+
disableConfirmButton: d || T,
|
|
326
326
|
children: [
|
|
327
327
|
f && /*#__PURE__*/ m(e, {
|
|
328
328
|
dismissible: !1,
|
|
@@ -332,12 +332,12 @@ var x = () => {
|
|
|
332
332
|
}),
|
|
333
333
|
d && /*#__PURE__*/ h("div", {
|
|
334
334
|
className: "mb-4 flex items-center justify-center gap-2",
|
|
335
|
-
children: [/*#__PURE__*/ m(
|
|
335
|
+
children: [/*#__PURE__*/ m(r, { variant: "primary" }), /*#__PURE__*/ m("span", {
|
|
336
336
|
className: "text-theme-high text-sm",
|
|
337
337
|
children: /*#__PURE__*/ m(g, { id: "Yin3uB" })
|
|
338
338
|
})]
|
|
339
339
|
}),
|
|
340
|
-
/*#__PURE__*/ h(
|
|
340
|
+
/*#__PURE__*/ h(i, {
|
|
341
341
|
gap: "2.5",
|
|
342
342
|
direction: "vertical",
|
|
343
343
|
className: "mb-2.5",
|
|
@@ -346,15 +346,15 @@ var x = () => {
|
|
|
346
346
|
components: { 0: /*#__PURE__*/ m("strong", {}) }
|
|
347
347
|
}) })]
|
|
348
348
|
}),
|
|
349
|
-
!d && /*#__PURE__*/ m(
|
|
349
|
+
!d && /*#__PURE__*/ m(l, {
|
|
350
350
|
className: "mb-0",
|
|
351
351
|
id: "release-floating-ip-form",
|
|
352
352
|
onSubmit: (e) => {
|
|
353
|
-
e.preventDefault(),
|
|
353
|
+
e.preventDefault(), w.handleSubmit();
|
|
354
354
|
},
|
|
355
|
-
children: /*#__PURE__*/ m(
|
|
355
|
+
children: /*#__PURE__*/ m(o, { children: /*#__PURE__*/ m(w.Field, {
|
|
356
356
|
name: "release",
|
|
357
|
-
children: (e) => /*#__PURE__*/ m(
|
|
357
|
+
children: (e) => /*#__PURE__*/ m(a, {
|
|
358
358
|
id: e.name,
|
|
359
359
|
name: e.name,
|
|
360
360
|
value: e.state.value,
|
|
@@ -414,4 +414,4 @@ var x = () => {
|
|
|
414
414
|
//#endregion
|
|
415
415
|
export { E as t };
|
|
416
416
|
|
|
417
|
-
//# sourceMappingURL=FloatingIpActionModals-
|
|
417
|
+
//# sourceMappingURL=FloatingIpActionModals-BraiJWBi.mjs.map
|