@cobaltcore-dev/aurora 1.3.0 → 2.0.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/DeleteFlavorModal-C2MqUgGR.mjs +801 -0
- package/dist/client/DeleteFlavorModal-C2MqUgGR.mjs.map +1 -0
- package/dist/client/{FiltersInput-CKI6zWnm.mjs → FiltersInput-Becwxo_J.mjs} +36 -33
- package/dist/client/FiltersInput-Becwxo_J.mjs.map +1 -0
- package/dist/client/{FloatingIpActionModals-Ch8uozH9.mjs → FloatingIpActionModals-Cq10WljB.mjs} +2 -2
- package/dist/client/{FloatingIpActionModals-Ch8uozH9.mjs.map → FloatingIpActionModals-Cq10WljB.mjs.map} +1 -1
- package/dist/client/ImageToastNotifications-BWfzOUMc.mjs +1135 -0
- package/dist/client/ImageToastNotifications-BWfzOUMc.mjs.map +1 -0
- package/dist/client/RouteIdLevelDefaultError-CSseJ1yG.mjs +26 -0
- package/dist/client/RouteIdLevelDefaultError-CSseJ1yG.mjs.map +1 -0
- package/dist/client/{_flavorId-Dg7MS0Af.mjs → _flavorId-CaA4-Pnf.mjs} +4 -3
- package/dist/client/_flavorId-CaA4-Pnf.mjs.map +1 -0
- package/dist/client/_flavorId-DYv_StX22.mjs +276 -0
- package/dist/client/_flavorId-DYv_StX22.mjs.map +1 -0
- package/dist/client/_flavorId-YV3jCS5g.mjs +22 -0
- package/dist/client/_flavorId-YV3jCS5g.mjs.map +1 -0
- package/dist/client/{_floatingIpId-C9xfRWot.mjs → _floatingIpId-BeYElanB.mjs} +2 -2
- package/dist/client/{_floatingIpId-C9xfRWot.mjs.map → _floatingIpId-BeYElanB.mjs.map} +1 -1
- package/dist/client/{_floatingIpId-DNn6ABCB.mjs → _floatingIpId-Dpsc7GU4.mjs} +5 -5
- package/dist/client/{_floatingIpId-DNn6ABCB.mjs.map → _floatingIpId-Dpsc7GU4.mjs.map} +1 -1
- package/dist/client/_imageId-mfKp3JHn.mjs +558 -0
- package/dist/client/_imageId-mfKp3JHn.mjs.map +1 -0
- package/dist/client/_imageId-mpXUMCh_.mjs +22 -0
- package/dist/client/_imageId-mpXUMCh_.mjs.map +1 -0
- package/dist/client/{_imageId-8JIbFmGB.mjs → _imageId-pBSS0YcC.mjs} +4 -3
- package/dist/client/_imageId-pBSS0YcC.mjs.map +1 -0
- package/dist/client/{_projectId-B3wmSala.mjs → _projectId-AjgJX6Gl.mjs} +2 -2
- package/dist/client/_projectId-AjgJX6Gl.mjs.map +1 -0
- package/dist/client/{_projectId-DPzv0CCp.mjs → _projectId-BnTBxKfp.mjs} +4 -4
- package/dist/client/_projectId-BnTBxKfp.mjs.map +1 -0
- package/dist/client/{_projectId-DfeVJy0G.mjs → _projectId-CVrdJ52s.mjs} +2 -2
- package/dist/client/_projectId-CVrdJ52s.mjs.map +1 -0
- package/dist/client/_projectId-DgciZslU.mjs +92 -0
- package/dist/client/_projectId-DgciZslU.mjs.map +1 -0
- package/dist/client/{_securityGroupId-C6eHmrx_.mjs → _securityGroupId-AO3wnH8g.mjs} +2 -2
- package/dist/client/_securityGroupId-AO3wnH8g.mjs.map +1 -0
- package/dist/client/{_securityGroupId-DmplhDgt.mjs → _securityGroupId-Bq0ZyG6z.mjs} +750 -741
- package/dist/client/_securityGroupId-Bq0ZyG6z.mjs.map +1 -0
- package/dist/client/_storageType-c-DAu8qr.mjs +858 -0
- package/dist/client/_storageType-c-DAu8qr.mjs.map +1 -0
- package/dist/client/components/{Error → Errors}/RouteError.d.ts +5 -0
- package/dist/client/components/Errors/RouteIdLevelDefaultError.d.ts +17 -0
- package/dist/client/components/Errors/ServiceLevelDefaultError.d.ts +9 -0
- package/dist/client/components/ListToolbar/SelectedFilters.d.ts +7 -2
- package/dist/client/components/ListToolbar/types.d.ts +6 -0
- package/dist/client/components/ListToolbar/valueLabels.d.ts +11 -0
- package/dist/client/flavors-Bgq3KZmx.mjs +659 -0
- package/dist/client/flavors-Bgq3KZmx.mjs.map +1 -0
- package/dist/client/{flavors-B1SDOPDu.mjs → flavors-ZudiAiTU.mjs} +2 -2
- package/dist/client/{flavors-B1SDOPDu.mjs.map → flavors-ZudiAiTU.mjs.map} +1 -1
- package/dist/client/{floatingips-DrCvtXtT.mjs → floatingips-B1oLH8z6.mjs} +6 -6
- package/dist/client/{floatingips-DrCvtXtT.mjs.map → floatingips-B1oLH8z6.mjs.map} +1 -1
- package/dist/client/floatingips-BeQEkVH8.mjs +14 -0
- package/dist/client/floatingips-BeQEkVH8.mjs.map +1 -0
- package/dist/client/floatingips-BtLg3yEQ.mjs +22 -0
- package/dist/client/floatingips-BtLg3yEQ.mjs.map +1 -0
- package/dist/client/floatingips-Cz9k80cc.mjs.map +1 -1
- package/dist/client/{images-BGQv9kKT.mjs → images-CnTW3bpy.mjs} +810 -770
- package/dist/client/images-CnTW3bpy.mjs.map +1 -0
- package/dist/client/{images-CPmMa4SQ.mjs → images-DZHDYDQu.mjs} +2 -2
- package/dist/client/{images-CPmMa4SQ.mjs.map → images-DZHDYDQu.mjs.map} +1 -1
- package/dist/client/index.js +412 -409
- package/dist/client/index.js.map +1 -1
- package/dist/client/{objects-DVccbrL1.mjs → objects-25xsh4Ia.mjs} +2 -2
- package/dist/client/objects-25xsh4Ia.mjs.map +1 -0
- package/dist/client/objects-KXY6dgwq.mjs +82 -0
- package/dist/client/objects-KXY6dgwq.mjs.map +1 -0
- package/dist/client/objects-QryuClU3.mjs +82 -0
- package/dist/client/objects-QryuClU3.mjs.map +1 -0
- package/dist/client/{objects-BR3eeSNH.mjs → objects-jYQBFzwg.mjs} +4668 -4699
- package/dist/client/objects-jYQBFzwg.mjs.map +1 -0
- package/dist/client/projects-yiK0HGSA.mjs.map +1 -1
- package/dist/client/securitygroups--0PS2wbM.mjs +580 -0
- package/dist/client/securitygroups--0PS2wbM.mjs.map +1 -0
- package/dist/client/{securitygroups-DEJQBcxm.mjs → securitygroups-BRndk7wh.mjs} +2 -2
- package/dist/client/{securitygroups-DEJQBcxm.mjs.map → securitygroups-BRndk7wh.mjs.map} +1 -1
- package/dist/client/securitygroups-CdN4yAAw.mjs +14 -0
- package/dist/client/securitygroups-CdN4yAAw.mjs.map +1 -0
- package/dist/client/securitygroups-Cs2Op-tu.mjs +22 -0
- package/dist/client/securitygroups-Cs2Op-tu.mjs.map +1 -0
- package/dist/client/securitygroups-CtKne8UQ.mjs.map +1 -1
- package/dist/client/trpcClient.d.ts +6 -1
- package/dist/client/useModalTracking-BYd37pXm.mjs +37 -0
- package/dist/client/useModalTracking-BYd37pXm.mjs.map +1 -0
- package/dist/client/useSecurityGroupPermissions--hK4aR8Y.mjs +294 -0
- package/dist/client/useSecurityGroupPermissions--hK4aR8Y.mjs.map +1 -0
- package/dist/server/index.d.ts +6 -1
- package/dist/server/index.js +96 -30
- package/package.json +4 -4
- package/dist/client/DeleteFlavorModal-V44QCJBd.mjs +0 -773
- package/dist/client/DeleteFlavorModal-V44QCJBd.mjs.map +0 -1
- package/dist/client/FiltersInput-CKI6zWnm.mjs.map +0 -1
- package/dist/client/ImageToastNotifications-m6c3tVPb.mjs +0 -1152
- package/dist/client/ImageToastNotifications-m6c3tVPb.mjs.map +0 -1
- package/dist/client/_flavorId-Dg7MS0Af.mjs.map +0 -1
- package/dist/client/_flavorId-kHl-b8rI.mjs +0 -232
- package/dist/client/_flavorId-kHl-b8rI.mjs.map +0 -1
- package/dist/client/_imageId-8JIbFmGB.mjs.map +0 -1
- package/dist/client/_imageId-BBAlRioC.mjs +0 -574
- package/dist/client/_imageId-BBAlRioC.mjs.map +0 -1
- package/dist/client/_projectId-7Nl1MQTJ.mjs +0 -99
- package/dist/client/_projectId-7Nl1MQTJ.mjs.map +0 -1
- package/dist/client/_projectId-B3wmSala.mjs.map +0 -1
- package/dist/client/_projectId-DPzv0CCp.mjs.map +0 -1
- package/dist/client/_projectId-DfeVJy0G.mjs.map +0 -1
- package/dist/client/_securityGroupId-C6eHmrx_.mjs.map +0 -1
- package/dist/client/_securityGroupId-DmplhDgt.mjs.map +0 -1
- package/dist/client/_storageType-C5gS9eut.mjs +0 -845
- package/dist/client/_storageType-C5gS9eut.mjs.map +0 -1
- package/dist/client/flavors-D8_PzQUB.mjs +0 -628
- package/dist/client/flavors-D8_PzQUB.mjs.map +0 -1
- package/dist/client/images-BGQv9kKT.mjs.map +0 -1
- package/dist/client/objects-AERkhfiM.mjs +0 -66
- package/dist/client/objects-AERkhfiM.mjs.map +0 -1
- package/dist/client/objects-BR3eeSNH.mjs.map +0 -1
- package/dist/client/objects-DVccbrL1.mjs.map +0 -1
- package/dist/client/securitygroups-BjhgLBHm.mjs +0 -620
- package/dist/client/securitygroups-BjhgLBHm.mjs.map +0 -1
- package/dist/client/useModalTracking-BcOKTYRN.mjs +0 -33
- package/dist/client/useModalTracking-BcOKTYRN.mjs.map +0 -1
- package/dist/client/useSecurityGroupPermissions-BOyLQLdC.mjs +0 -227
- package/dist/client/useSecurityGroupPermissions-BOyLQLdC.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DeleteFlavorModal-V44QCJBd.mjs","names":["useErrorTranslation","useLingui","translateError","errorCode","t","isRetryableError","includes","React","useState","useEffect","useMemo","useErrorTranslation","Modal","Button","Spinner","Stack","DescriptionList","DescriptionTerm","DescriptionDefinition","TextInput","Message","buildInitialSpecs","extraSpecs","Object","entries","map","key","value","isNew","isEditing","originalKey","originalValue","createPermissionsPromise","client","project","compute","canUser","query","project_id","permission","then","canCreate","canDelete","createExtraSpecsPromise","flavorId","getExtraSpecs","EditSpecModalInner","flavor","isLoading","onClose","initialSpecs","canEdit","useLingui","translateError","specs","setSpecs","errors","setErrors","isAddingNew","setIsAddingNew","newKey","setNewKey","newValue","setNewValue","isSaving","setIsSaving","saveError","setSaveError","hasChanges","currentSpecs","Map","s","trim","originalSpecs","size","get","isSubmitDisabled","some","e","validateKey","rowIndex","normalized","t","isDuplicate","entry","idx","handleAddNew","keyError","length","handleCancelAdd","handleEdit","index","i","handleSaveEdit","handleCancelEdit","handleDelete","filter","_","handleKeyChange","prev","next","handleValueChange","handleSubmit","currentKeys","Set","keysToDelete","initial","has","Boolean","forEach","push","specsToSave","deleteExtraSpec","mutate","id","keys","createExtraSpecs","extra_specs","error","Error","message","handleClose","open","onCancel","title","onConfirm","undefined","confirmButtonLabel","cancelButtonLabel","disableConfirmButton","disableCancelButton","disableCloseButton","distribution","alignment","variant","div","text","className","onDismiss","direction","label","onClick","disabled","icon","p","onChange","target","placeholder","errortext","autoFocus","gap","Fragment","span","data-testid","EditSpecModal","isOpen","extraSpecsData","setExtraSpecsData","isLoadingSpecs","setIsLoadingSpecs","loadError","setLoadError","resolvedCanEdit","setResolvedCanEdit","cancelled","loadData","permissions","Promise","all","resolve","React","useState","useEffect","useMemo","useErrorTranslation","Modal","Message","DescriptionList","DescriptionTerm","DescriptionDefinition","Stack","Spinner","Button","TextInput","buildInitialAccess","flavorAccess","map","access","projectId","tenant_id","isNew","originalProjectId","createPermissionsPromise","client","project","compute","canUser","query","project_id","permission","then","canAdd","canRemove","createFlavorAccessPromise","flavorId","getFlavorAccess","ManageAccessModalInner","flavor","isLoading","onClose","initialAccess","useLingui","translateError","setAccess","errors","setErrors","isAddingNew","setIsAddingNew","newProjectId","setNewProjectId","isSaving","setIsSaving","saveError","setSaveError","isPublicFlavor","canEdit","hasChanges","currentProjectIds","Set","a","initialProjectIds","size","id","has","isSubmitDisabled","validateProjectId","rowIndex","normalized","trim","t","isDuplicate","some","entry","idx","handleAddNew","error","length","handleCancelAdd","handleDelete","index","filter","_","i","handleSubmit","projectsToRemove","initial","Boolean","projectsToAdd","targetProjectId","removeTenantAccess","mutate","addTenantAccess","Error","message","handleClose","flavorName","name","open","onCancel","title","p","className","onConfirm","undefined","confirmButtonLabel","cancelButtonLabel","disableConfirmButton","disableCancelButton","disableCloseButton","distribution","alignment","variant","div","text","onDismiss","direction","label","onClick","disabled","icon","span","value","onChange","e","target","prev","next","placeholder","errortext","autoFocus","wrapperClassName","Fragment","gap","data-testid","ManageAccessModal","isOpen","flavorAccessData","setFlavorAccessData","permissionsData","setPermissionsData","isLoadingData","setIsLoadingData","loadError","setLoadError","cancelled","loadData","accessData","permissions","Promise","all","deduped","arr","findIndex","z","useForm","useStore","React","useState","Modal","Stack","Form","FormSection","TextInput","DescriptionList","DescriptionTerm","DescriptionDefinition","Message","useErrorTranslation","useModalTracking","DeleteFlavorModal","client","isOpen","onClose","project","flavor","onSuccess","useLingui","translateError","isLoading","setIsLoading","formError","setFormError","trackClose","markSubmitted","resetTracking","actionPrefix","formSchema","object","confirm","string","refine","value","message","t","form","defaultValues","validators","onSubmit","id","compute","deleteFlavor","mutate","project_id","flavorId","handleClose","error","errorMessage","canDelete","store","state","isSubmitting","values","reset","confirmLabel","flavorName","name","open","onCancel","title","size","confirmButtonLabel","confirmButtonVariant","onConfirm","handleSubmit","cancelButtonLabel","disableConfirmButton","disableCancelButton","disableCloseButton","direction","gap","variant","p","className","vcpus","ram","disk","swap","Number","e","preventDefault","Field","children","field","label","onChange","handleChange","target","placeholder","autoFocus","disabled","required"],"sources":["../../src/client/utils/useErrorTranslation.ts","../../src/client/routes/_auth/projects/$projectId/compute/flavors/-components/EditSpecModal.tsx","../../src/client/routes/_auth/projects/$projectId/compute/flavors/-components/ManageAccessModal.tsx","../../src/client/routes/_auth/projects/$projectId/compute/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, { useState, useEffect, useMemo } from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { TrpcClient } from \"@/client/trpcClient\"\nimport { useErrorTranslation } from \"@/client/utils/useErrorTranslation\"\nimport {\n Modal,\n Button,\n Spinner,\n Stack,\n DescriptionList,\n DescriptionTerm,\n DescriptionDefinition,\n TextInput,\n Message,\n} from \"@cloudoperators/juno-ui-components\"\nimport { Flavor } from \"@/server/Compute/types/flavor\"\n\ninterface EditSpecModalProps {\n client: TrpcClient\n isOpen: boolean\n onClose: () => void\n project: string\n flavor: Flavor | null\n canEdit?: boolean\n}\n\ninterface SpecEntry {\n key: string\n value: string\n isNew?: boolean\n isEditing?: boolean\n originalKey?: string\n originalValue?: string\n}\n\nfunction buildInitialSpecs(extraSpecs: Record<string, string>): SpecEntry[] {\n return Object.entries(extraSpecs).map(([key, value]) => ({\n key,\n value,\n isNew: false,\n isEditing: false,\n originalKey: key,\n originalValue: value,\n }))\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 EditSpecModalInner({\n client,\n project,\n flavor,\n isLoading,\n onClose,\n initialSpecs,\n canEdit,\n}: {\n client: TrpcClient\n project: string\n flavor: Flavor\n isLoading: boolean\n onClose: () => void\n initialSpecs: SpecEntry[]\n canEdit: boolean\n}) {\n const { t } = useLingui()\n const { translateError } = useErrorTranslation()\n\n const [specs, setSpecs] = useState<SpecEntry[]>(initialSpecs)\n const [errors, setErrors] = useState<{ [key: string]: string }>({})\n const [isAddingNew, setIsAddingNew] = useState(false)\n const [newKey, setNewKey] = useState(\"\")\n const [newValue, setNewValue] = useState(\"\")\n const [isSaving, setIsSaving] = useState(false)\n const [saveError, setSaveError] = useState<string | null>(null)\n\n const hasChanges = useMemo(() => {\n // Build maps for comparison\n const currentSpecs = new Map(specs.map((s) => [s.key.trim(), s.value.trim()]))\n const originalSpecs = new Map(initialSpecs.map((s) => [s.key.trim(), s.value.trim()]))\n\n if (currentSpecs.size !== originalSpecs.size) return true\n for (const [key, value] of currentSpecs) {\n if (originalSpecs.get(key) !== value) return true\n }\n return false\n }, [specs, initialSpecs])\n\n const isSubmitDisabled = !hasChanges || isLoading || isSaving || isAddingNew || specs.some((e) => e.isEditing)\n\n const validateKey = (key: string, rowIndex?: number): string | null => {\n const normalized = key?.trim()\n if (!normalized) {\n return t`Key is required`\n }\n const isDuplicate = specs.some((entry, idx) => entry.key.trim() === normalized && idx !== rowIndex)\n if (isDuplicate) {\n return t`A property with this key already exists`\n }\n return null\n }\n\n const handleAddNew = () => {\n const keyError = validateKey(newKey, specs.length)\n if (keyError) {\n setErrors({ newKey: keyError })\n return\n }\n if (!newValue.trim()) {\n setErrors({ newValue: t`Value is required` })\n return\n }\n setSpecs([...specs, { key: newKey.trim(), value: newValue.trim(), isNew: true, isEditing: false }])\n setNewKey(\"\")\n setNewValue(\"\")\n setIsAddingNew(false)\n setErrors({})\n }\n\n const handleCancelAdd = () => {\n setNewKey(\"\")\n setNewValue(\"\")\n setIsAddingNew(false)\n setErrors({})\n }\n\n const handleEdit = (index: number) => {\n setSpecs(specs.map((entry, i) => (i === index ? { ...entry, isEditing: true } : { ...entry, isEditing: false })))\n setIsAddingNew(false)\n }\n\n const handleSaveEdit = (index: number) => {\n const entry = specs[index]\n const keyError = validateKey(entry.key, index)\n if (keyError) {\n setErrors({ [`edit-${index}`]: keyError })\n return\n }\n if (!entry.value.trim()) {\n setErrors({ [`edit-${index}`]: t`Value is required` })\n return\n }\n setSpecs(\n specs.map((e, i) => (i === index ? { ...e, isEditing: false, key: e.key.trim(), value: e.value.trim() } : e))\n )\n setErrors({})\n }\n\n const handleCancelEdit = (index: number) => {\n setSpecs(\n specs.map((e, i) =>\n i === index ? { ...e, isEditing: false, key: e.originalKey ?? e.key, value: e.originalValue ?? e.value } : e\n )\n )\n setErrors({})\n }\n\n const handleDelete = (index: number) => {\n setSpecs(specs.filter((_, i) => i !== index))\n setErrors({})\n }\n\n const handleKeyChange = (index: number, value: string) => {\n setSpecs(specs.map((entry, i) => (i === index ? { ...entry, key: value } : entry)))\n if (errors[`edit-${index}`]) {\n setErrors((prev) => {\n const next = { ...prev }\n delete next[`edit-${index}`]\n return next\n })\n }\n }\n\n const handleValueChange = (index: number, value: string) => {\n setSpecs(specs.map((entry, i) => (i === index ? { ...entry, value } : entry)))\n if (errors[`edit-${index}`]) {\n setErrors((prev) => {\n const next = { ...prev }\n delete next[`edit-${index}`]\n return next\n })\n }\n }\n\n const handleSubmit = async () => {\n setIsSaving(true)\n setSaveError(null)\n\n try {\n // Collect keys to delete (in initialSpecs but not in current specs, or key was renamed)\n const currentKeys = new Set(specs.map((s) => s.key))\n const keysToDelete = initialSpecs\n .filter((initial) => !currentKeys.has(initial.key))\n .map((s) => s.originalKey!)\n .filter(Boolean)\n\n // Also delete old keys when a key was renamed\n specs.forEach((entry) => {\n if (entry.originalKey && entry.key !== entry.originalKey && !entry.isNew) {\n keysToDelete.push(entry.originalKey)\n }\n })\n\n // Collect specs to create/update\n const specsToSave: Record<string, string> = {}\n specs.forEach((entry) => {\n if (entry.isNew || entry.key !== entry.originalKey || entry.value !== entry.originalValue) {\n specsToSave[entry.key] = entry.value\n }\n })\n\n // Delete removed/renamed specs\n for (const key of new Set(keysToDelete)) {\n await client.compute.deleteExtraSpec.mutate({\n project_id: project,\n flavorId: flavor.id,\n key,\n })\n }\n\n // Create/update specs\n if (Object.keys(specsToSave).length > 0) {\n await client.compute.createExtraSpecs.mutate({\n project_id: project,\n flavorId: flavor.id,\n extra_specs: specsToSave,\n })\n }\n\n onClose()\n } catch (error) {\n setSaveError(translateError(error instanceof Error ? error.message : \"Failed to save changes\"))\n } finally {\n setIsSaving(false)\n }\n }\n\n const handleClose = () => {\n setSpecs(initialSpecs)\n setIsAddingNew(false)\n setNewKey(\"\")\n setNewValue(\"\")\n setErrors({})\n setSaveError(null)\n onClose()\n }\n\n return (\n <Modal\n open\n onCancel={handleClose}\n size=\"large\"\n title={canEdit ? t`Edit Metadata` : t`Metadata`}\n onConfirm={canEdit ? handleSubmit : undefined}\n confirmButtonLabel={isSaving ? t`Saving...` : t`Save Changes`}\n cancelButtonLabel={t`Cancel`}\n disableConfirmButton={isSubmitDisabled}\n disableCancelButton={isSaving}\n disableCloseButton={isSaving}\n >\n {isLoading ? (\n <Stack distribution=\"center\" alignment=\"center\">\n <Spinner variant=\"primary\" />\n </Stack>\n ) : (\n <div>\n {saveError && (\n <Message variant=\"error\" text={saveError} className=\"mb-4\" onDismiss={() => setSaveError(null)} />\n )}\n\n {canEdit && (\n <Stack direction=\"horizontal\" className=\"jn:bg-theme-background-lvl-1 mb-4 justify-end p-2\">\n <Button\n label={t`Add Property`}\n onClick={() => setIsAddingNew(true)}\n variant=\"primary\"\n disabled={isAddingNew || specs.some((e) => e.isEditing)}\n icon=\"addCircle\"\n />\n </Stack>\n )}\n\n {specs.length === 0 && !isAddingNew ? (\n <p className=\"jn:text-theme-light py-8 text-center\">\n {canEdit\n ? t`No metadata properties found. Click \"Add Property\" to create one.`\n : t`No metadata properties found.`}\n </p>\n ) : (\n <DescriptionList className=\"mb-6\">\n <DescriptionTerm>{t`Property Key`}</DescriptionTerm>\n <DescriptionDefinition>{t`Value`}</DescriptionDefinition>\n\n <>\n {isAddingNew && (\n <>\n <DescriptionTerm>\n <TextInput\n value={newKey}\n onChange={(e) => {\n setNewKey(e.target.value)\n if (errors.newKey) {\n setErrors((prev) => {\n const next = { ...prev }\n delete next.newKey\n return next\n })\n }\n }}\n placeholder={t`property_key`}\n errortext={errors.newKey}\n autoFocus\n />\n </DescriptionTerm>\n <DescriptionDefinition>\n <Stack direction=\"horizontal\" gap=\"2\" alignment=\"center\" className=\"justify-between\">\n <TextInput\n value={newValue}\n onChange={(e) => {\n setNewValue(e.target.value)\n if (errors.newValue) {\n setErrors((prev) => {\n const next = { ...prev }\n delete next.newValue\n return next\n })\n }\n }}\n placeholder={t`Value`}\n errortext={errors.newValue}\n />\n <Stack direction=\"horizontal\" gap=\"2\">\n <Button size=\"small\" variant=\"primary\" onClick={handleAddNew} icon=\"check\" title={t`Save`} />\n <Button\n size=\"small\"\n variant=\"subdued\"\n onClick={handleCancelAdd}\n icon=\"close\"\n title={t`Discard`}\n />\n </Stack>\n </Stack>\n </DescriptionDefinition>\n </>\n )}\n </>\n\n <>\n {specs.map((entry, index) => (\n <React.Fragment key={`${entry.originalKey}-${index}`}>\n <DescriptionTerm>\n {entry.isEditing ? (\n <TextInput\n value={entry.key}\n onChange={(e) => handleKeyChange(index, e.target.value)}\n errortext={errors[`edit-${index}`]}\n />\n ) : (\n <span className=\"jn:text-theme-high block max-w-xs truncate\" title={entry.key}>\n {entry.key}\n </span>\n )}\n </DescriptionTerm>\n <DescriptionDefinition className=\"flex items-center justify-between gap-2\">\n {entry.isEditing ? (\n <>\n <TextInput\n value={entry.value}\n onChange={(e) => handleValueChange(index, e.target.value)}\n errortext={errors[`edit-${index}`]}\n />\n <Stack direction=\"horizontal\" gap=\"2\">\n <Button\n size=\"small\"\n variant=\"primary\"\n onClick={() => handleSaveEdit(index)}\n icon=\"check\"\n title={t`Save`}\n />\n <Button\n size=\"small\"\n variant=\"subdued\"\n onClick={() => handleCancelEdit(index)}\n icon=\"close\"\n title={t`Discard`}\n />\n </Stack>\n </>\n ) : (\n <>\n <span className=\"jn:text-theme-default block max-w-md truncate\" title={entry.value}>\n {entry.value}\n </span>\n {canEdit && (\n <Stack direction=\"horizontal\" gap=\"2\">\n <Button\n size=\"small\"\n variant=\"subdued\"\n onClick={() => handleEdit(index)}\n icon=\"edit\"\n data-testid={`edit-${entry.key}`}\n title={t`Edit`}\n disabled={isAddingNew || specs.some((e) => e.isEditing)}\n />\n <Button\n size=\"small\"\n onClick={() => handleDelete(index)}\n icon=\"deleteForever\"\n data-testid={`delete-${entry.key}`}\n title={t`Delete`}\n disabled={isAddingNew || specs.some((e) => e.isEditing)}\n />\n </Stack>\n )}\n </>\n )}\n </DescriptionDefinition>\n </React.Fragment>\n ))}\n </>\n </DescriptionList>\n )}\n </div>\n )}\n </Modal>\n )\n}\n\nexport const EditSpecModal: React.FC<EditSpecModalProps> = ({ client, isOpen, onClose, project, flavor, canEdit }) => {\n const { t } = useLingui()\n const { translateError } = useErrorTranslation()\n\n const [extraSpecsData, setExtraSpecsData] = useState<Record<string, string> | null>(null)\n const [isLoadingSpecs, setIsLoadingSpecs] = useState(false)\n const [loadError, setLoadError] = useState<string | null>(null)\n const [resolvedCanEdit, setResolvedCanEdit] = useState<boolean | undefined>(canEdit)\n\n useEffect(() => {\n if (!isOpen || !flavor?.id) {\n setExtraSpecsData(null)\n setLoadError(null)\n return\n }\n\n let cancelled = false\n setIsLoadingSpecs(true)\n setLoadError(null)\n\n const loadData = async () => {\n try {\n const [specs, permissions] = await Promise.all([\n createExtraSpecsPromise(client, project, flavor.id),\n canEdit !== undefined\n ? Promise.resolve({ canCreate: canEdit, canDelete: canEdit })\n : createPermissionsPromise(client, project),\n ])\n if (cancelled) return\n setExtraSpecsData(specs)\n setResolvedCanEdit(permissions.canCreate || permissions.canDelete)\n } catch (error) {\n if (cancelled) return\n setLoadError(error instanceof Error ? error.message : \"Failed to load metadata\")\n } finally {\n if (!cancelled) setIsLoadingSpecs(false)\n }\n }\n\n loadData()\n return () => {\n cancelled = true\n }\n }, [isOpen, flavor?.id, client, project, canEdit])\n\n const initialSpecs = useMemo(() => (extraSpecsData ? buildInitialSpecs(extraSpecsData) : []), [extraSpecsData])\n\n if (!isOpen || !flavor) {\n return null\n }\n\n if (isLoadingSpecs) {\n return (\n <Modal open onCancel={onClose} size=\"large\" title={t`Edit Metadata`}>\n <Stack distribution=\"center\" alignment=\"center\">\n <Spinner variant=\"primary\" />\n </Stack>\n </Modal>\n )\n }\n\n if (loadError) {\n return (\n <Modal open onCancel={onClose} size=\"large\" title={t`Edit Metadata`}>\n <Message variant=\"error\" text={translateError(loadError)} />\n </Modal>\n )\n }\n\n return (\n <EditSpecModalInner\n key={flavor.id}\n client={client}\n project={project}\n flavor={flavor}\n isLoading={false}\n onClose={onClose}\n initialSpecs={initialSpecs}\n canEdit={resolvedCanEdit ?? false}\n />\n )\n}\n","import React, { useState, 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 DescriptionList,\n DescriptionTerm,\n DescriptionDefinition,\n Stack,\n Spinner,\n Button,\n TextInput,\n} from \"@cloudoperators/juno-ui-components\"\nimport { Flavor } from \"@/server/Compute/types/flavor\"\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\ninterface AccessEntry {\n projectId: string\n isNew?: boolean\n originalProjectId?: string\n}\n\nfunction buildInitialAccess(flavorAccess: FlavorAccess[]): AccessEntry[] {\n return flavorAccess.map((access) => ({\n projectId: access.tenant_id,\n isNew: false,\n originalProjectId: access.tenant_id,\n }))\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 ManageAccessModalInner({\n client,\n project,\n flavor,\n isLoading,\n onClose,\n initialAccess,\n canAdd,\n canRemove,\n}: {\n client: TrpcClient\n project: string\n flavor: Flavor\n isLoading: boolean\n onClose: () => void\n initialAccess: AccessEntry[]\n canAdd: boolean\n canRemove: boolean\n}) {\n const { t } = useLingui()\n const { translateError } = useErrorTranslation()\n\n const [access, setAccess] = useState<AccessEntry[]>(initialAccess)\n const [errors, setErrors] = useState<{ [key: string]: string }>({})\n const [isAddingNew, setIsAddingNew] = useState(false)\n const [newProjectId, setNewProjectId] = useState(\"\")\n const [isSaving, setIsSaving] = useState(false)\n const [saveError, setSaveError] = useState<string | null>(null)\n\n const isPublicFlavor = flavor[\"os-flavor-access:is_public\"] !== false\n const canEdit = canAdd || canRemove\n\n const hasChanges = useMemo(() => {\n const currentProjectIds = new Set(access.map((a) => a.projectId))\n const initialProjectIds = new Set(initialAccess.map((a) => a.projectId))\n if (currentProjectIds.size !== initialProjectIds.size) return true\n for (const id of currentProjectIds) {\n if (!initialProjectIds.has(id)) return true\n }\n return false\n }, [access, initialAccess])\n\n const isSubmitDisabled = !hasChanges || isLoading || isSaving || isAddingNew\n\n const validateProjectId = (projectId: string, rowIndex?: number): string | null => {\n const normalized = projectId?.trim()\n if (!normalized) {\n return t`Project ID is required`\n }\n const isDuplicate = access.some((entry, idx) => entry.projectId.trim() === normalized && idx !== rowIndex)\n if (isDuplicate) {\n return t`This project already has access`\n }\n return null\n }\n\n const handleAddNew = () => {\n const error = validateProjectId(newProjectId, access.length)\n if (error) {\n setErrors({ newProjectId: error })\n return\n }\n setAccess([...access, { projectId: newProjectId.trim(), isNew: true }])\n setNewProjectId(\"\")\n setIsAddingNew(false)\n setErrors({})\n }\n\n const handleCancelAdd = () => {\n setNewProjectId(\"\")\n setIsAddingNew(false)\n setErrors({})\n }\n\n const handleDelete = (index: number) => {\n setAccess(access.filter((_, i) => i !== index))\n setErrors({})\n }\n\n const handleSubmit = async () => {\n setIsSaving(true)\n setSaveError(null)\n\n try {\n const currentProjectIds = new Set(access.map((a) => a.projectId))\n const initialProjectIds = new Set(initialAccess.map((a) => a.projectId))\n\n // Collect projects to remove (in initialAccess but not in current access)\n const projectsToRemove = initialAccess\n .filter((initial) => !currentProjectIds.has(initial.projectId))\n .map((a) => a.originalProjectId!)\n .filter(Boolean)\n\n // Collect projects to add (in current access but not in initialAccess)\n const projectsToAdd = access.filter((entry) => !initialProjectIds.has(entry.projectId)).map((a) => a.projectId)\n\n // Remove projects\n for (const targetProjectId of projectsToRemove) {\n await client.compute.removeTenantAccess.mutate({\n project_id: project,\n flavorId: flavor.id,\n targetProjectId,\n })\n }\n\n // Add projects\n for (const targetProjectId of projectsToAdd) {\n await client.compute.addTenantAccess.mutate({\n project_id: project,\n flavorId: flavor.id,\n targetProjectId,\n })\n }\n\n onClose()\n } catch (error) {\n setSaveError(translateError(error instanceof Error ? error.message : \"Failed to save changes\"))\n } finally {\n setIsSaving(false)\n }\n }\n\n const handleClose = () => {\n setAccess(initialAccess)\n setIsAddingNew(false)\n setNewProjectId(\"\")\n setErrors({})\n setSaveError(null)\n onClose()\n }\n\n if (isPublicFlavor) {\n const flavorName = flavor.name\n return (\n <Modal open onCancel={handleClose} size=\"large\" title={t`Manage Access - ${flavorName}`}>\n <p className=\"jn:text-theme-light py-8 text-center\">\n {t`This is a public flavor. All projects have access to it.`}\n </p>\n </Modal>\n )\n }\n\n const flavorName = flavor.name\n return (\n <Modal\n open\n onCancel={handleClose}\n size=\"large\"\n title={t`Manage Access - ${flavorName}`}\n onConfirm={canEdit ? handleSubmit : undefined}\n confirmButtonLabel={isSaving ? t`Saving...` : t`Save Changes`}\n cancelButtonLabel={t`Cancel`}\n disableConfirmButton={isSubmitDisabled}\n disableCancelButton={isSaving}\n disableCloseButton={isSaving}\n >\n {isLoading ? (\n <Stack distribution=\"center\" alignment=\"center\">\n <Spinner variant=\"primary\" />\n </Stack>\n ) : (\n <div>\n {saveError && (\n <Message variant=\"error\" text={saveError} className=\"mb-4\" onDismiss={() => setSaveError(null)} />\n )}\n\n {canAdd && (\n <Stack direction=\"horizontal\" className=\"jn:bg-theme-background-lvl-1 mb-4 justify-end p-2\">\n <Button\n label={t`Add Project`}\n onClick={() => setIsAddingNew(true)}\n variant=\"primary\"\n disabled={isAddingNew}\n icon=\"addCircle\"\n />\n </Stack>\n )}\n\n {access.length === 0 && !isAddingNew ? (\n <p className=\"jn:text-theme-light py-8 text-center\">\n {canAdd\n ? t`No project access configured. Click \"Add Project\" to grant access.`\n : t`No project access configured.`}\n </p>\n ) : (\n <DescriptionList className=\"mb-6\">\n <>\n {isAddingNew && (\n <>\n <DescriptionTerm className=\"flex items-center justify-end\">\n <span className=\"jn:text-theme-high\">{t`Project`}</span>\n </DescriptionTerm>\n <DescriptionDefinition>\n <div className=\"flex w-full items-center gap-2\">\n <div className=\"flex-1\">\n <TextInput\n value={newProjectId}\n onChange={(e) => {\n setNewProjectId(e.target.value)\n if (errors.newProjectId) {\n setErrors((prev) => {\n const next = { ...prev }\n delete next.newProjectId\n return next\n })\n }\n }}\n placeholder={t`Enter project ID`}\n errortext={errors.newProjectId}\n autoFocus\n wrapperClassName=\"w-full\"\n />\n </div>\n <div className=\"flex shrink-0 gap-2\">\n <Button size=\"small\" variant=\"primary\" onClick={handleAddNew} icon=\"check\" title={t`Add`} />\n <Button\n size=\"small\"\n variant=\"subdued\"\n onClick={handleCancelAdd}\n icon=\"close\"\n title={t`Cancel`}\n />\n </div>\n </div>\n </DescriptionDefinition>\n </>\n )}\n </>\n\n <>\n {access.map((entry, index) => (\n <React.Fragment key={`${entry.originalProjectId || entry.projectId}-${index}`}>\n <DescriptionTerm>\n <span className=\"jn:text-theme-high\">{t`Project`}</span>\n </DescriptionTerm>\n <DescriptionDefinition>\n <Stack direction=\"horizontal\" gap=\"2\" alignment=\"center\" className=\"justify-between\">\n <span className=\"jn:text-theme-high block max-w-xs truncate\" title={entry.projectId}>\n {entry.projectId}\n </span>\n {canRemove && (\n <Button\n size=\"small\"\n onClick={() => handleDelete(index)}\n icon=\"deleteForever\"\n data-testid={`delete-${entry.projectId}`}\n title={t`Remove`}\n disabled={isAddingNew}\n />\n )}\n </Stack>\n </DescriptionDefinition>\n </React.Fragment>\n ))}\n </>\n </DescriptionList>\n )}\n </div>\n )}\n </Modal>\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 [flavorAccessData, setFlavorAccessData] = useState<FlavorAccess[] | null>(null)\n const [permissionsData, setPermissionsData] = useState<{ canAdd: boolean; canRemove: boolean } | null>(null)\n const [isLoadingData, setIsLoadingData] = useState(true)\n const [loadError, setLoadError] = useState<string | null>(null)\n\n useEffect(() => {\n if (!isOpen || !flavor?.id) {\n setFlavorAccessData(null)\n setPermissionsData(null)\n setLoadError(null)\n return\n }\n\n let cancelled = false\n setIsLoadingData(true)\n setLoadError(null)\n\n const loadData = async () => {\n try {\n const [accessData, permissions] = await Promise.all([\n createFlavorAccessPromise(client, project, flavor.id),\n createPermissionsPromise(client, project),\n ])\n if (cancelled) return\n // Deduplicate\n const deduped = accessData.filter(\n (entry, idx, arr) => arr.findIndex((e) => e.tenant_id === entry.tenant_id) === idx\n )\n setFlavorAccessData(deduped)\n setPermissionsData(permissions)\n } catch (error) {\n if (cancelled) return\n setLoadError(error instanceof Error ? error.message : \"Failed to load access data\")\n } finally {\n if (!cancelled) setIsLoadingData(false)\n }\n }\n\n loadData()\n return () => {\n cancelled = true\n }\n }, [isOpen, flavor?.id, client, project])\n\n const initialAccess = useMemo(\n () => (flavorAccessData ? buildInitialAccess(flavorAccessData) : []),\n [flavorAccessData]\n )\n\n if (!isOpen || !flavor) {\n return null\n }\n\n const flavorName = flavor.name\n\n if (isLoadingData) {\n return (\n <Modal open onCancel={onClose} size=\"large\" title={t`Manage Access - ${flavorName}`}>\n <Stack distribution=\"center\" alignment=\"center\">\n <Spinner variant=\"primary\" />\n </Stack>\n </Modal>\n )\n }\n\n if (loadError) {\n return (\n <Modal open onCancel={onClose} size=\"large\" title={t`Manage Access - ${flavorName}`}>\n <Message variant=\"error\" text={translateError(loadError)} />\n </Modal>\n )\n }\n\n return (\n <ManageAccessModalInner\n key={flavor.id}\n client={client}\n project={project}\n flavor={flavor}\n isLoading={false}\n onClose={onClose}\n initialAccess={initialAccess}\n canAdd={permissionsData?.canAdd ?? false}\n canRemove={permissionsData?.canRemove ?? false}\n />\n )\n}\n","import { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport React, { useState } from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { TrpcClient } from \"@/client/trpcClient\"\nimport {\n Modal,\n Stack,\n Form,\n FormSection,\n TextInput,\n DescriptionList,\n DescriptionTerm,\n DescriptionDefinition,\n Message,\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\"\nimport { useModalTracking } from \"@/client/hooks/useModalTracking\"\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 [formError, setFormError] = useState<string | null>(null)\n\n const { trackClose, markSubmitted, resetTracking } = useModalTracking({\n isOpen,\n actionPrefix: \"compute.flavor.delete\",\n })\n\n const formSchema = z.object({\n confirm: z.string().refine((value) => value === \"delete\", {\n message: t`Type \"delete\" to confirm`,\n }),\n })\n\n const form = useForm({\n defaultValues: {\n confirm: \"\",\n },\n validators: {\n onSubmit: formSchema,\n },\n onSubmit: async () => {\n if (!flavor?.id) {\n setFormError(t`No flavor selected for deletion.`)\n return\n }\n\n if (isLoading) return\n\n markSubmitted()\n setFormError(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 setFormError(errorMessage)\n } finally {\n setIsLoading(false)\n }\n },\n })\n\n const canDelete = useStore(form.store, (state) => state.isSubmitting || state.values.confirm !== \"delete\")\n\n const handleClose = () => {\n trackClose()\n setIsLoading(false)\n setFormError(null)\n form.reset()\n resetTracking()\n onClose()\n }\n\n const confirmLabel = isLoading ? t`Deleting...` : t`Delete Flavor`\n const flavorName = flavor?.name\n\n return (\n <Modal\n open={isOpen}\n onCancel={handleClose}\n title={t`Delete Flavor \"${flavorName}\"`}\n size=\"small\"\n confirmButtonLabel={confirmLabel}\n confirmButtonVariant=\"primary-danger\"\n onConfirm={form.handleSubmit}\n cancelButtonLabel={t`Cancel`}\n disableConfirmButton={canDelete || isLoading}\n disableCancelButton={isLoading}\n disableCloseButton={isLoading}\n >\n <Stack direction=\"vertical\" gap=\"4\">\n {formError && <Message variant=\"error\">{formError}</Message>}\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 <Form\n className=\"mb-0\"\n id=\"delete-flavor-form\"\n onSubmit={(e) => {\n e.preventDefault()\n form.handleSubmit()\n }}\n >\n <FormSection>\n <form.Field\n name=\"confirm\"\n children={(field) => (\n <TextInput\n id={field.name}\n name={field.name}\n label={t`Type \"delete\" to confirm`}\n value={field.state.value}\n onChange={(e) => field.handleChange(e.target.value)}\n placeholder=\"delete\"\n autoFocus\n disabled={isLoading}\n required\n />\n )}\n />\n </FormSection>\n </Form>\n </Stack>\n </Modal>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FiltersInput-CKI6zWnm.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"}
|