@cobaltcore-dev/aurora 2.1.1 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -25
- package/dist/client/AuroraApp.d.ts +9 -2
- package/dist/client/context/AppConfigContext.d.ts +44 -0
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.js +41221 -845
- package/dist/client/index.js.map +1 -1
- package/dist/client/trpcClient.d.ts +314 -0
- package/dist/client/utils/appConfigGating.d.ts +21 -0
- package/dist/server/index.d.ts +694 -3
- package/dist/server/index.js +1748 -722
- package/package.json +3 -3
- package/dist/client/AuthProvider-CVSAwW9f.mjs +0 -83
- package/dist/client/AuthProvider-CVSAwW9f.mjs.map +0 -1
- package/dist/client/ContentHeader-fKKZVu-o.mjs +0 -116
- package/dist/client/ContentHeader-fKKZVu-o.mjs.map +0 -1
- package/dist/client/DeleteFlavorModal-C4nAi7gY.mjs +0 -724
- package/dist/client/DeleteFlavorModal-C4nAi7gY.mjs.map +0 -1
- package/dist/client/DynamicBreadcrumbContext-CVcUQFou.mjs +0 -26
- package/dist/client/DynamicBreadcrumbContext-CVcUQFou.mjs.map +0 -1
- package/dist/client/FiltersInput-Becwxo_J.mjs +0 -85
- package/dist/client/FiltersInput-Becwxo_J.mjs.map +0 -1
- package/dist/client/FloatingIpActionModals-Cq10WljB.mjs +0 -466
- package/dist/client/FloatingIpActionModals-Cq10WljB.mjs.map +0 -1
- package/dist/client/RouteIdLevelDefaultError-DPF_x2tG.mjs +0 -26
- package/dist/client/RouteIdLevelDefaultError-DPF_x2tG.mjs.map +0 -1
- package/dist/client/Slot-CWb612-_.mjs +0 -28
- package/dist/client/Slot-CWb612-_.mjs.map +0 -1
- package/dist/client/SortInput-4g7nSTHW.mjs +0 -34
- package/dist/client/SortInput-4g7nSTHW.mjs.map +0 -1
- package/dist/client/StorageNotFound-B-zVinVD.mjs +0 -30
- package/dist/client/StorageNotFound-B-zVinVD.mjs.map +0 -1
- package/dist/client/TwoColumnDescriptionList-DKS42RKa.mjs +0 -28
- package/dist/client/TwoColumnDescriptionList-DKS42RKa.mjs.map +0 -1
- package/dist/client/_-CAsCx-Ay.mjs +0 -6
- package/dist/client/_-CAsCx-Ay.mjs.map +0 -1
- package/dist/client/_auth-SrDjHL6j.mjs +0 -12
- package/dist/client/_auth-SrDjHL6j.mjs.map +0 -1
- package/dist/client/_flavorId-BPvssEzn.mjs +0 -277
- package/dist/client/_flavorId-BPvssEzn.mjs.map +0 -1
- package/dist/client/_flavorId-CFUBcU-l.mjs +0 -27
- package/dist/client/_flavorId-CFUBcU-l.mjs.map +0 -1
- package/dist/client/_flavorId-CZcIp0Ih.mjs +0 -22
- package/dist/client/_flavorId-CZcIp0Ih.mjs.map +0 -1
- package/dist/client/_floatingIpId-B8r64AL9.mjs +0 -196
- package/dist/client/_floatingIpId-B8r64AL9.mjs.map +0 -1
- package/dist/client/_floatingIpId-lEobpOER.mjs +0 -26
- package/dist/client/_floatingIpId-lEobpOER.mjs.map +0 -1
- package/dist/client/_imageId-BAezmV0Y.mjs +0 -526
- package/dist/client/_imageId-BAezmV0Y.mjs.map +0 -1
- package/dist/client/_imageId-D-jqz3e3.mjs +0 -40
- package/dist/client/_imageId-D-jqz3e3.mjs.map +0 -1
- package/dist/client/_imageId-gMdrdnVt.mjs +0 -22
- package/dist/client/_imageId-gMdrdnVt.mjs.map +0 -1
- package/dist/client/_projectId-BYccdAtX.mjs +0 -77
- package/dist/client/_projectId-BYccdAtX.mjs.map +0 -1
- package/dist/client/_projectId-CBjZC1tv.mjs +0 -283
- package/dist/client/_projectId-CBjZC1tv.mjs.map +0 -1
- package/dist/client/_projectId-CLEa1zgw.mjs +0 -30
- package/dist/client/_projectId-CLEa1zgw.mjs.map +0 -1
- package/dist/client/_projectId-D3VOH5lN.mjs +0 -94
- package/dist/client/_projectId-D3VOH5lN.mjs.map +0 -1
- package/dist/client/_securityGroupId-BwgZnoiR.mjs +0 -29
- package/dist/client/_securityGroupId-BwgZnoiR.mjs.map +0 -1
- package/dist/client/_securityGroupId-Cz2NUHdB.mjs +0 -1819
- package/dist/client/_securityGroupId-Cz2NUHdB.mjs.map +0 -1
- package/dist/client/_serviceType-DS8DxsrP.mjs +0 -20
- package/dist/client/_serviceType-DS8DxsrP.mjs.map +0 -1
- package/dist/client/_serviceType-M8d9rOT6.mjs +0 -6
- package/dist/client/_serviceType-M8d9rOT6.mjs.map +0 -1
- package/dist/client/_storageType-BNpP1A2N.mjs +0 -13
- package/dist/client/_storageType-BNpP1A2N.mjs.map +0 -1
- package/dist/client/_storageType-BxSGKhAI.mjs +0 -15
- package/dist/client/_storageType-BxSGKhAI.mjs.map +0 -1
- package/dist/client/_storageType-DZYCmiLt.mjs +0 -30
- package/dist/client/_storageType-DZYCmiLt.mjs.map +0 -1
- package/dist/client/_storageType-UqAMP-8d.mjs +0 -859
- package/dist/client/_storageType-UqAMP-8d.mjs.map +0 -1
- package/dist/client/_storageType-u51_7OwJ.mjs +0 -7
- package/dist/client/_storageType-u51_7OwJ.mjs.map +0 -1
- package/dist/client/about-BmQTyLWc.mjs +0 -92
- package/dist/client/about-BmQTyLWc.mjs.map +0 -1
- package/dist/client/assets/__mocks__/svgMock.d.ts +0 -3
- package/dist/client/aurora-CIml-f2f.mjs +0 -19
- package/dist/client/aurora-CIml-f2f.mjs.map +0 -1
- package/dist/client/build-WuxXRAqf.mjs +0 -14530
- package/dist/client/build-WuxXRAqf.mjs.map +0 -1
- package/dist/client/cn-DM4Cy3jv.mjs +0 -10
- package/dist/client/cn-DM4Cy3jv.mjs.map +0 -1
- package/dist/client/flavors-CJVSNz6R.mjs +0 -15
- package/dist/client/flavors-CJVSNz6R.mjs.map +0 -1
- package/dist/client/flavors-CflJDIEH.mjs +0 -667
- package/dist/client/flavors-CflJDIEH.mjs.map +0 -1
- package/dist/client/flavors-DWMZ6TuJ.mjs +0 -8
- package/dist/client/flavors-DWMZ6TuJ.mjs.map +0 -1
- package/dist/client/floatingips-Cz9k80cc.mjs +0 -8
- package/dist/client/floatingips-Cz9k80cc.mjs.map +0 -1
- package/dist/client/floatingips-DXnRlLvV.mjs +0 -551
- package/dist/client/floatingips-DXnRlLvV.mjs.map +0 -1
- package/dist/client/floatingips-HRbuLxiN.mjs +0 -22
- package/dist/client/floatingips-HRbuLxiN.mjs.map +0 -1
- package/dist/client/floatingips-nN1kQmsu.mjs +0 -14
- package/dist/client/floatingips-nN1kQmsu.mjs.map +0 -1
- package/dist/client/formatBytes-CZv_XyCY.mjs +0 -38
- package/dist/client/formatBytes-CZv_XyCY.mjs.map +0 -1
- package/dist/client/helpers-1PpYf-fC.mjs +0 -6
- package/dist/client/helpers-1PpYf-fC.mjs.map +0 -1
- package/dist/client/hooks-D0yKIumu.mjs +0 -22
- package/dist/client/hooks-D0yKIumu.mjs.map +0 -1
- package/dist/client/imageHelpers-DBhL2ebL.mjs +0 -1272
- package/dist/client/imageHelpers-DBhL2ebL.mjs.map +0 -1
- package/dist/client/images-BsylWUiH.mjs +0 -2011
- package/dist/client/images-BsylWUiH.mjs.map +0 -1
- package/dist/client/images-NBf2bV43.mjs +0 -8
- package/dist/client/images-NBf2bV43.mjs.map +0 -1
- package/dist/client/images-zQq1nSVv.mjs +0 -15
- package/dist/client/images-zQq1nSVv.mjs.map +0 -1
- package/dist/client/md-kvaGCNAK.mjs +0 -336
- package/dist/client/md-kvaGCNAK.mjs.map +0 -1
- package/dist/client/network-DuZm76BZ.mjs +0 -8
- package/dist/client/network-DuZm76BZ.mjs.map +0 -1
- package/dist/client/objects-BudUAfWY.mjs +0 -12909
- package/dist/client/objects-BudUAfWY.mjs.map +0 -1
- package/dist/client/objects-Dc7sKUr8.mjs +0 -67
- package/dist/client/objects-Dc7sKUr8.mjs.map +0 -1
- package/dist/client/objects-Dw7oeTq2.mjs +0 -80
- package/dist/client/objects-Dw7oeTq2.mjs.map +0 -1
- package/dist/client/objects-_g7nGIn5.mjs +0 -25
- package/dist/client/objects-_g7nGIn5.mjs.map +0 -1
- package/dist/client/objects-eBxvY6_n.mjs +0 -78
- package/dist/client/objects-eBxvY6_n.mjs.map +0 -1
- package/dist/client/projects-yiK0HGSA.mjs +0 -7
- package/dist/client/projects-yiK0HGSA.mjs.map +0 -1
- package/dist/client/routeInfo-DP3v74Wg.mjs +0 -19
- package/dist/client/routeInfo-DP3v74Wg.mjs.map +0 -1
- package/dist/client/routes-CJj7SR_K.mjs +0 -10
- package/dist/client/routes-CJj7SR_K.mjs.map +0 -1
- package/dist/client/routes-xofA3ksU.mjs +0 -110
- package/dist/client/routes-xofA3ksU.mjs.map +0 -1
- package/dist/client/securitygroups-CSmsBzUb.mjs +0 -581
- package/dist/client/securitygroups-CSmsBzUb.mjs.map +0 -1
- package/dist/client/securitygroups-CtKne8UQ.mjs +0 -8
- package/dist/client/securitygroups-CtKne8UQ.mjs.map +0 -1
- package/dist/client/securitygroups-T7kaNFEp.mjs +0 -15
- package/dist/client/securitygroups-T7kaNFEp.mjs.map +0 -1
- package/dist/client/securitygroups-WLB1_IM6.mjs +0 -22
- package/dist/client/securitygroups-WLB1_IM6.mjs.map +0 -1
- package/dist/client/securitygroups-o0IXZM6S.mjs +0 -14
- package/dist/client/securitygroups-o0IXZM6S.mjs.map +0 -1
- package/dist/client/serviceCatalog-B3lKWC9V.mjs +0 -6
- package/dist/client/serviceCatalog-B3lKWC9V.mjs.map +0 -1
- package/dist/client/services-D1PbooD1.mjs +0 -6
- package/dist/client/services-D1PbooD1.mjs.map +0 -1
- package/dist/client/services-DEMVtFyn.mjs +0 -9
- package/dist/client/services-DEMVtFyn.mjs.map +0 -1
- package/dist/client/storageProviders-CJ5rOh13.mjs +0 -15
- package/dist/client/storageProviders-CJ5rOh13.mjs.map +0 -1
- package/dist/client/trpcClient-D7gpR7YG.mjs +0 -71
- package/dist/client/trpcClient-D7gpR7YG.mjs.map +0 -1
- package/dist/client/useBreadcrumbs-ha3IlaxX.mjs +0 -54
- package/dist/client/useBreadcrumbs-ha3IlaxX.mjs.map +0 -1
- package/dist/client/useErrorTranslation-Dc0eE8Zt.mjs +0 -83
- package/dist/client/useErrorTranslation-Dc0eE8Zt.mjs.map +0 -1
- package/dist/client/useModal-DCs1OJh7.mjs +0 -12
- package/dist/client/useModal-DCs1OJh7.mjs.map +0 -1
- package/dist/client/useModalTracking-BYd37pXm.mjs +0 -37
- package/dist/client/useModalTracking-BYd37pXm.mjs.map +0 -1
- package/dist/client/useProjectId-DBc5lpoU.mjs +0 -11
- package/dist/client/useProjectId-DBc5lpoU.mjs.map +0 -1
- package/dist/client/useSecurityGroupPermissions--hK4aR8Y.mjs +0 -294
- package/dist/client/useSecurityGroupPermissions--hK4aR8Y.mjs.map +0 -1
- package/dist/client/useSetBreadcrumb-tn7lBaQV.mjs +0 -19
- package/dist/client/useSetBreadcrumb-tn7lBaQV.mjs.map +0 -1
- package/dist/client/utils/trpcErrors.d.ts +0 -13
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"imageHelpers-DBhL2ebL.mjs","names":["formatBytesDecimal","SizeDisplay","size","undefined","span","MEMBER_STATUSES","PENDING","ACCEPTED","REJECTED","ALL","IMAGE_STATUSES","QUEUED","SAVING","ACTIVE","DEACTIVATED","KILLED","DELETED","PENDING_DELETE","IMAGE_VISIBILITY","PUBLIC","PRIVATE","SHARED","COMMUNITY","DISK_FORMATS","AMI","ARI","AKI","VHD","VHDX","VMDK","RAW","QCOW2","VDI","ISO","PLOOP","CONTAINER_FORMATS","BARE","OVF","OVA","DOCKER","React","useState","Modal","Form","FormRow","FormSection","TextInput","Select","SelectOption","Checkbox","Button","Status","Stack","Pill","IMAGE_VISIBILITY","EditImageDetailsModal","image","isOpen","isLoading","onClose","onSave","useLingui","properties","setProperties","name","tags","visibility","PRIVATE","protected","min_disk","min_ram","tagsInput","setTagsInput","errors","setErrors","arraysEqual","a","b","length","sortedA","sort","sortedB","every","val","index","isSubmitDisabled","handleInputChange","e","value","type","checked","target","prev","newErrors","handleSelectChange","handleNumericChange","numValue","parseInt","isNaN","handleTagsInputChange","handleAddTag","trimmedTag","trim","includes","handleTagKeyPress","key","preventDefault","handleRemoveTag","tagToRemove","filter","tag","validateForm","t","Object","keys","handleSubmit","updatedProperties","handleClose","open","onCancel","size","title","onConfirm","confirmButtonLabel","cancelButtonLabel","disableConfirmButton","status","className","id","label","onChange","required","errortext","div","gap","direction","alignment","onKeyDown","helptext","onClick","disabled","wrap","map","closeable","pillKey","pillValue","PUBLIC","SHARED","COMMUNITY","String","getImageUpdatedToast","imageName","message","description","getImageUpdateErrorToast","errorMessage","getImageCreatedToast","getImageCreateErrorToast","getImageFileUploadErrorToast","fileName","getImageUploadCancelledToast","getImageMetadataPropertyCreatedToast","getImageMetadataPropertyUpdatedToast","getImageMetadataPropertyDeletedToast","getImageDeletedToast","getImageDeleteErrorToast","imageId","getImageActivatedToast","getImageDeactivatedToast","getImageActivationErrorToast","getImageDeactivationErrorToast","getBulkDeleteSuccessToast","successCount","totalCount","getBulkDeleteErrorToast","failedCount","getBulkDeletePartialToast","getBulkActivateSuccessToast","getBulkActivateErrorToast","getBulkActivatePartialToast","getBulkDeactivateSuccessToast","getBulkDeactivateErrorToast","getBulkDeactivatePartialToast","getImageAccessStatusUpdatedToast","newStatus","getImageAccessStatusErrorToast","getImageVisibilityUpdatedToast","visibility","getImageVisibilityUpdateErrorToast","React","useState","useMemo","useEffect","Modal","Button","Status","Stack","DescriptionList","DescriptionTerm","DescriptionDefinition","TextInput","Message","toast","useErrorTranslation","getImageMetadataPropertyCreatedToast","getImageMetadataPropertyUpdatedToast","getImageMetadataPropertyDeletedToast","toStrValue","value","undefined","JSON","stringify","String","buildInitialMetadata","image","excludedProperties","Object","entries","filter","key","has","toLowerCase","map","strValue","isNew","isEditing","originalKey","originalValue","sort","a","b","localeCompare","EditImageMetadataModalInner","client","onClose","initialMetadata","canEdit","projectId","imageId","useLingui","translateError","metadata","setMetadata","errors","setErrors","isAddingNew","setIsAddingNew","newKey","setNewKey","newValue","setNewValue","operationInProgress","setOperationInProgress","validationMessage","setValidationMessage","isModalDisabled","some","e","validateKey","rowIndex","normalized","trim","t","isDuplicate","entry","idx","handleAddNew","keyError","length","compute","updateImage","mutate","project_id","operations","op","path","prev","message","options","success","error","errorMsg","Error","handleCancelAdd","handleEdit","index","i","editingValue","handleSaveEdit","trimmedValue","trimmedKey","keyChanged","handleCancelEdit","handleDelete","_","handleKeyChange","next","handleValueChange","handleClose","open","onCancel","size","title","cancelButtonLabel","disableCancelButton","div","variant","text","className","direction","label","onClick","disabled","p","alignTerms","onChange","target","invalid","autoFocus","gap","alignment","console","log","icon","Fragment","span","data-testid","aria-label","EditImageMetadataModal","isOpen","excludedPropertiesData","setExcludedPropertiesData","isLoadingExcluded","setIsLoadingExcluded","loadError","setLoadError","cancelled","loadData","data","getImageMetadataExcludedProperties","query","Set","s","id","updated_at","status","body","z","useForm","useStore","React","DescriptionDefinition","DescriptionList","DescriptionTerm","Modal","Stack","Form","FormSection","TextInput","SizeDisplay","useModalTracking","DeleteImageModal","image","isOpen","isLoading","isDisabled","onClose","onDelete","useLingui","trackClose","markSubmitted","resetTracking","actionPrefix","formSchema","object","confirm","string","refine","value","message","t","form","defaultValues","validators","onSubmit","handleClose","canDelete","store","state","isSubmitting","values","reset","confirmLabel","imageName","name","id","open","onCancel","size","title","confirmButtonLabel","confirmButtonVariant","onConfirm","handleSubmit","cancelButtonLabel","disableConfirmButton","disableCancelButton","disableCloseButton","direction","gap","p","className","status","visibility","disk_format","created_at","Date","toLocaleDateString","e","preventDefault","Field","children","field","label","onChange","handleChange","target","autoFocus","disabled","required","React","DescriptionDefinition","DescriptionList","DescriptionTerm","Modal","Status","SizeDisplay","ActivateImageModal","image","isOpen","isLoading","onClose","onActivate","useLingui","handleActivate","e","preventDefault","onCancel","size","title","t","open","onConfirm","confirmButtonLabel","cancelButtonLabel","disableConfirmButton","disableCancelButton","disableCloseButton","status","className","p","name","id","visibility","disk_format","dt","Date","created_at","isNaN","getTime","toLocaleDateString","React","DescriptionDefinition","DescriptionList","DescriptionTerm","Modal","Status","SizeDisplay","DeactivateImageModal","image","isOpen","isLoading","onClose","onDeactivate","useLingui","handleDeactivate","e","preventDefault","onCancel","size","title","t","open","onConfirm","confirmButtonLabel","cancelButtonLabel","disableConfirmButton","disableCancelButton","disableCloseButton","status","className","p","name","id","visibility","disk_format","dt","Date","created_at","isNaN","getTime","toLocaleDateString","React","DataGridRow","DataGridCell","TextInput","ButtonRow","Button","ImageMemberFormRow","memberId","imageId","errors","isLoading","onMemberIdChange","onSave","onCancel","useLingui","className","label","t","value","onChange","e","target","errortext","required","icon","onClick","variant","title","disabled","React","DataGridRow","DataGridCell","Button","Stack","Spinner","MEMBER_STATUSES","ImageMemberRow","member","isDeleting","onDelete","canDelete","useLingui","getStatusLabel","status","PENDING","t","ACCEPTED","REJECTED","deleteButton","memberIdDisplay","member_id","icon","onClick","title","aria-label","data-testid","disabled","className","image_id","distribution","alignment","variant","React","useState","DataGrid","DataGridRow","DataGridHeadCell","DataGridCell","Stack","Status","Button","Message","trpcReact","ImageMemberFormRow","ImageMemberRow","ImageMembersTable","image","imageMembers","isMembersLoading","canAdd","canRemove","isAddingMember","setIsAddingMember","setMessage","projectId","useLingui","utils","useUtils","memberId","setMemberId","errors","setErrors","deletingMembers","setDeletingMembers","Set","createMemberMutation","compute","createImageMember","useMutation","onSuccess","listImageMembers","invalidate","project_id","imageId","id","deleteMemberMutation","deleteImageMember","isPublicImage","visibility","shouldShowEmptyState","length","isLoading","isPending","sortedMembers","sort","a","b","statusOrder","pending","accepted","rejected","aOrder","status","bOrder","member_id","localeCompare","validateForm","trimmedMemberId","trim","newErrors","t","some","member","Object","keys","resetForm","handleAddMember","text","type","mutateAsync","error","errorMessage","message","handleRemoveMember","memberIdToRemove","prev","add","newSet","delete","handleMemberIdChange","newMemberId","undefined","columns","colSpan","title","variant","direction","className","label","data-testid","onClick","disabled","onMemberIdChange","onSave","onCancel","map","index","isDeleting","has","onDelete","canDelete","React","useState","useProjectId","Modal","Message","trpcReact","ImageMembersTable","ManageImageAccessModal","isOpen","onClose","image","permissions","canCreateMember","canDeleteMember","useLingui","projectId","message","setMessage","isAddingMember","setIsAddingMember","data","imageMembers","isLoading","isMembersLoading","compute","listImageMembers","useQuery","project_id","imageId","id","enabled","handleClose","imageName","name","onCancel","title","t","open","size","div","onDismiss","text","variant","type","className","canAdd","canRemove","convertToJsonPatchOperations","updatedProperties","originalImage","operations","Object","entries","forEach","key","value","path","undefined","push","op","propertyExists"],"sources":["../../src/client/routes/_auth/projects/$projectId/compute/images/-components/SizeDisplay.tsx","../../src/client/routes/_auth/projects/$projectId/compute/-constants/filters.ts","../../src/client/routes/_auth/projects/$projectId/compute/images/-components/EditImageDetailsModal.tsx","../../src/client/routes/_auth/projects/$projectId/compute/images/-components/ImageToastNotifications.tsx","../../src/client/routes/_auth/projects/$projectId/compute/images/-components/EditImageMetadataModal.tsx","../../src/client/routes/_auth/projects/$projectId/compute/images/-components/DeleteImageModal.tsx","../../src/client/routes/_auth/projects/$projectId/compute/images/-components/ActivateImageModal.tsx","../../src/client/routes/_auth/projects/$projectId/compute/images/-components/DeactivateImageModal.tsx","../../src/client/routes/_auth/projects/$projectId/compute/images/-components/ImageMemberFormRow.tsx","../../src/client/routes/_auth/projects/$projectId/compute/images/-components/ImageMemberRow.tsx","../../src/client/routes/_auth/projects/$projectId/compute/images/-components/ImageMembersTable.tsx","../../src/client/routes/_auth/projects/$projectId/compute/images/-components/ManageImageAccessModal.tsx","../../src/client/routes/_auth/projects/$projectId/compute/images/-utils/imageHelpers.ts"],"sourcesContent":["import { formatBytesDecimal } from \"@/client/utils/formatBytes\"\n\ninterface SizeDisplayProps {\n size: number | null | undefined\n}\n\nexport function SizeDisplay({ size }: SizeDisplayProps) {\n if (size === undefined) return <span>N/A</span>\n\n return <span>{formatBytesDecimal(size)}</span>\n}\n","/**\n * OpenStack Glance image member status values\n * Reference: https://docs.openstack.org/glance/latest/user/glanceapi.html#image-sharing\n */\nexport const MEMBER_STATUSES = {\n /** Initial status when image is shared; member hasn't responded */\n PENDING: \"pending\",\n /** Member has accepted the shared image; appears in their image list */\n ACCEPTED: \"accepted\",\n /** Member has explicitly rejected the shared image; won't appear in their list */\n REJECTED: \"rejected\",\n /** Special filter value: returns members in all states (pending, accepted, rejected) */\n ALL: \"all\",\n} as const\n\n/**\n * OpenStack Glance image lifecycle states\n */\nexport const IMAGE_STATUSES = {\n /** Image metadata created, awaiting upload */\n QUEUED: \"queued\",\n /** Image data is being uploaded */\n SAVING: \"saving\",\n /** Image is ready to use */\n ACTIVE: \"active\",\n /** Image exists but is disabled for use */\n DEACTIVATED: \"deactivated\",\n /** Image upload failed or was interrupted */\n KILLED: \"killed\",\n /** Image is marked for deletion */\n DELETED: \"deleted\",\n /** Image deletion is in progress */\n PENDING_DELETE: \"pending_delete\",\n} as const\n\n/**\n * Image visibility/sharing levels\n */\nexport const IMAGE_VISIBILITY = {\n /** Visible to all users in the cloud */\n PUBLIC: \"public\",\n /** Visible only to the owner */\n PRIVATE: \"private\",\n /** Explicitly shared with specific projects */\n SHARED: \"shared\",\n /** Shared with all users, no explicit members */\n COMMUNITY: \"community\",\n /** Special filter value: returns all images accessible to the user (public, private, shared, community) */\n ALL: \"all\",\n} as const\n\n/**\n * Supported virtual disk formats\n */\nexport const DISK_FORMATS = {\n /** Amazon Machine Image */\n AMI: \"ami\",\n /** Amazon Ramdisk Image */\n ARI: \"ari\",\n /** Amazon Kernel Image */\n AKI: \"aki\",\n /** Virtual Hard Disk (Hyper-V) */\n VHD: \"vhd\",\n /** Virtual Hard Disk v2 (Hyper-V) */\n VHDX: \"vhdx\",\n /** Virtual Machine Disk (VMware) */\n VMDK: \"vmdk\",\n /** Raw unformatted disk image */\n RAW: \"raw\",\n /** QEMU Copy-On-Write v2 */\n QCOW2: \"qcow2\",\n /** Virtual Disk Image (VirtualBox) */\n VDI: \"vdi\",\n /** ISO 9660 optical disc image */\n ISO: \"iso\",\n /** Parallels Loopback Disk */\n PLOOP: \"ploop\",\n} as const\n\n/**\n * Supported container/packaging formats\n */\nexport const CONTAINER_FORMATS = {\n /** Amazon Machine Image */\n AMI: \"ami\",\n /** Amazon Ramdisk Image */\n ARI: \"ari\",\n /** Amazon Kernel Image */\n AKI: \"aki\",\n /** No container, just disk image */\n BARE: \"bare\",\n /** Open Virtualization Format */\n OVF: \"ovf\",\n /** Open Virtualization Archive (tar of OVF) */\n OVA: \"ova\",\n /** Docker container image */\n DOCKER: \"docker\",\n} as const\n\n/** Valid image member status values */\nexport type MemberStatus = (typeof MEMBER_STATUSES)[keyof typeof MEMBER_STATUSES]\n\n/** Valid image lifecycle status values */\nexport type ImageStatus = (typeof IMAGE_STATUSES)[keyof typeof IMAGE_STATUSES]\n\n/** Valid image visibility/sharing levels */\nexport type ImageVisibility = (typeof IMAGE_VISIBILITY)[keyof typeof IMAGE_VISIBILITY]\n\n/** Valid virtual disk format types */\nexport type DiskFormat = (typeof DISK_FORMATS)[keyof typeof DISK_FORMATS]\n\n/** Valid container/packaging format types */\nexport type ContainerFormat = (typeof CONTAINER_FORMATS)[keyof typeof CONTAINER_FORMATS]\n","import React, { useState } from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n Modal,\n Form,\n FormRow,\n FormSection,\n TextInput,\n Select,\n SelectOption,\n Checkbox,\n Button,\n Status,\n Stack,\n Pill,\n} from \"@cloudoperators/juno-ui-components\"\nimport { GlanceImage } from \"@/server/Compute/types/image\"\nimport { IMAGE_VISIBILITY } from \"../../-constants/filters\"\n\ninterface EditImageDetailsModalProps {\n image: GlanceImage\n isOpen: boolean\n isLoading?: boolean\n onClose: () => void\n onSave: (updatedProperties: Partial<GlanceImage>) => void\n}\n\ninterface ImageProperties {\n name: string\n tags: string[]\n visibility: string\n protected: boolean\n min_disk: number\n min_ram: number\n}\n\nexport const EditImageDetailsModal: React.FC<EditImageDetailsModalProps> = ({\n image,\n isOpen,\n isLoading = false,\n onClose,\n onSave,\n}) => {\n const { t } = useLingui()\n\n // Initialize local state from image prop\n const [properties, setProperties] = useState<ImageProperties>({\n name: image.name || \"\",\n tags: image.tags || [],\n visibility: image.visibility || IMAGE_VISIBILITY.PRIVATE,\n protected: image.protected || false,\n min_disk: image.min_disk || 0,\n min_ram: image.min_ram || 0,\n })\n\n const [tagsInput, setTagsInput] = useState<string>(\"\")\n const [errors, setErrors] = useState<{ [key: string]: string }>({})\n\n // Helper function to compare arrays\n const arraysEqual = (a: string[], b: string[]) => {\n if (a.length !== b.length) return false\n const sortedA = [...a].sort()\n const sortedB = [...b].sort()\n return sortedA.every((val, index) => val === sortedB[index])\n }\n\n const isSubmitDisabled =\n image.name === properties.name &&\n arraysEqual(image.tags || [], properties.tags) &&\n image.visibility === properties.visibility &&\n image.protected === properties.protected &&\n image.min_disk === properties.min_disk &&\n image.min_ram === properties.min_ram\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const { name, value, type, checked } = e.target\n\n setProperties((prev) => ({\n ...prev,\n [name]: type === \"checkbox\" ? checked : value,\n }))\n\n // Clear error for this field\n if (errors[name]) {\n setErrors((prev) => {\n const newErrors = { ...prev }\n delete newErrors[name]\n return newErrors\n })\n }\n }\n\n const handleSelectChange = (name: string, value: string | number | string[] | undefined) => {\n setProperties((prev) => ({\n ...prev,\n [name]: value,\n }))\n\n // Clear error for this field\n if (errors[name]) {\n setErrors((prev) => {\n const newErrors = { ...prev }\n delete newErrors[name]\n return newErrors\n })\n }\n }\n\n const handleNumericChange = (name: string, value: string) => {\n const numValue = value === \"\" ? 0 : parseInt(value, 10)\n\n if (!isNaN(numValue)) {\n setProperties((prev) => ({\n ...prev,\n [name]: numValue,\n }))\n\n // Clear error for this field\n if (errors[name]) {\n setErrors((prev) => {\n const newErrors = { ...prev }\n delete newErrors[name]\n return newErrors\n })\n }\n }\n }\n\n const handleTagsInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setTagsInput(e.target.value)\n }\n\n const handleAddTag = () => {\n const trimmedTag = tagsInput.trim()\n\n if (trimmedTag === \"\") return\n\n // Check if tag already exists\n if (properties.tags.includes(trimmedTag)) {\n setTagsInput(\"\")\n return\n }\n\n // Add tag to properties\n setProperties((prev) => ({\n ...prev,\n tags: [...prev.tags, trimmedTag],\n }))\n\n // Clear input\n setTagsInput(\"\")\n }\n\n const handleTagKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault()\n handleAddTag()\n }\n }\n\n const handleRemoveTag = (tagToRemove: string) => {\n setProperties((prev) => ({\n ...prev,\n tags: prev.tags.filter((tag) => tag !== tagToRemove),\n }))\n }\n\n const validateForm = (): boolean => {\n const newErrors: { [key: string]: string } = {}\n\n if (!properties.name || properties.name.trim() === \"\") {\n newErrors.name = t`Image name is required`\n }\n\n if (properties.min_disk < 0) {\n newErrors.min_disk = t`Minimum disk must be 0 or greater`\n }\n\n if (properties.min_ram < 0) {\n newErrors.min_ram = t`Minimum RAM must be 0 or greater`\n }\n\n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n\n if (!validateForm()) {\n return\n }\n\n // Prepare updated properties\n const updatedProperties: Partial<GlanceImage> = {\n // Exclude entries without updates\n ...(image.name !== properties.name.trim() ? { name: properties.name.trim() } : {}),\n ...(!arraysEqual(image.tags || [], properties.tags) ? { tags: properties.tags } : {}),\n ...(image.visibility !== properties.visibility ? { visibility: properties.visibility } : {}),\n ...(image.protected !== properties.protected ? { protected: properties.protected } : {}),\n ...(image.min_disk !== properties.min_disk ? { min_disk: properties.min_disk } : {}),\n ...(image.min_ram !== properties.min_ram ? { min_ram: properties.min_ram } : {}),\n }\n\n await onSave(updatedProperties)\n }\n\n const handleClose = () => {\n setErrors({})\n onClose()\n }\n\n return (\n <Modal\n open={isOpen}\n onCancel={handleClose}\n size=\"large\"\n title={t`Edit Image Details`}\n onConfirm={handleSubmit}\n confirmButtonLabel={t`Save Changes`}\n cancelButtonLabel={t`Cancel`}\n disableConfirmButton={isLoading || isSubmitDisabled}\n >\n {isLoading ? (\n <Status status=\"progress\" title={t`Saving Image Details...`} className=\"mt-0\" />\n ) : (\n <Form>\n {/* Basic Metadata Section */}\n <FormSection className=\"mb-6\">\n <FormRow className=\"mb-4\">\n <TextInput\n id=\"name\"\n name=\"name\"\n label={t`Image Name`}\n value={properties.name}\n onChange={handleInputChange}\n required\n errortext={errors.name}\n />\n </FormRow>\n\n <FormRow className=\"my-6\">\n <div className=\"w-full\">\n <Stack gap=\"2\" direction=\"horizontal\" alignment=\"start\">\n <div className=\"flex-1\">\n <TextInput\n id=\"tags\"\n name=\"tags\"\n label={t`Tags`}\n value={tagsInput}\n onChange={handleTagsInputChange}\n onKeyDown={handleTagKeyPress}\n helptext={t`Enter a tag and press Enter or click Add`}\n />\n </div>\n <Button onClick={handleAddTag} disabled={isLoading || tagsInput.trim() === \"\"}>\n <Trans>Add</Trans>\n </Button>\n </Stack>\n\n {/* Display added tags as pills */}\n {properties.tags.length > 0 && (\n <Stack gap=\"2\" wrap={true} alignment=\"center\" className=\"mt-3\">\n {properties.tags.map((tag) => (\n <Pill key={tag} closeable pillKey=\"\" pillValue={tag} onClose={() => handleRemoveTag(tag)} />\n ))}\n </Stack>\n )}\n </div>\n </FormRow>\n\n <FormRow className=\"mb-4\">\n <Select\n id=\"visibility\"\n name=\"visibility\"\n label={t`Visibility`}\n value={properties.visibility}\n onChange={(value) => handleSelectChange(\"visibility\", value)}\n >\n <SelectOption value={IMAGE_VISIBILITY.PUBLIC} label={t`Public`} />\n <SelectOption value={IMAGE_VISIBILITY.PRIVATE} label={t`Private`} />\n <SelectOption value={IMAGE_VISIBILITY.SHARED} label={t`Shared`} />\n <SelectOption value={IMAGE_VISIBILITY.COMMUNITY} label={t`Community`} />\n </Select>\n </FormRow>\n\n <FormRow>\n <Checkbox\n id=\"protected\"\n name=\"protected\"\n label={t`Protected`}\n checked={properties.protected}\n onChange={handleInputChange}\n helptext={t`Protect this image from being deleted`}\n />\n </FormRow>\n </FormSection>\n\n {/* Resource Requirements Section */}\n <FormSection className=\"mb-6\">\n <FormRow className=\"mb-4\">\n <TextInput\n id=\"min_disk\"\n name=\"min_disk\"\n label={t`Minimum Disk (GB)`}\n type=\"number\"\n value={String(properties.min_disk)}\n onChange={(e) => handleNumericChange(\"min_disk\", e.target.value)}\n helptext={t`Minimum disk size required to boot this image`}\n errortext={errors.min_disk}\n // min={0}\n />\n </FormRow>\n\n <FormRow>\n <TextInput\n id=\"min_ram\"\n name=\"min_ram\"\n label={t`Minimum RAM (MB)`}\n type=\"number\"\n value={String(properties.min_ram)}\n onChange={(e) => handleNumericChange(\"min_ram\", e.target.value)}\n helptext={t`Minimum RAM required to boot this image`}\n errortext={errors.min_ram}\n // min={0}\n />\n </FormRow>\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import { ReactNode } from \"react\"\nimport { NotificationOptions } from \"@cloudoperators/juno-ui-components\"\nimport { Trans } from \"@lingui/react/macro\"\n\n// Builder helpers for the NotificationManager (Sonner-based) `toast` API.\n// Each returns `{ message, ...options }`; the caller destructures and dispatches\n// the appropriate severity, e.g.\n// const { message, ...options } = getImageUpdatedToast(name)\n// toast.success(message, options)\n// Severity lives at the call site (toast.success / error / warning / info),\n// mirroring the Swift/Ceph notification helpers.\n\n// ── Image lifecycle ─────────────────────────────────────────────────────────\n\nexport const getImageUpdatedToast = (imageName: string): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Image Instance</Trans>,\n description: <Trans>Image instance \"{imageName}\" has been updated</Trans>,\n})\n\nexport const getImageUpdateErrorToast = (\n imageName: string,\n errorMessage: string\n): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Unable to Update Image</Trans>,\n description: (\n <Trans>\n The image \"{imageName}\" could not be updated: {errorMessage}\n </Trans>\n ),\n})\n\nexport const getImageCreatedToast = (imageName: string): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Image Instance</Trans>,\n description: <Trans>Image instance \"{imageName}\" has been created</Trans>,\n})\n\nexport const getImageCreateErrorToast = (\n imageName: string,\n errorMessage: string\n): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Unable to Create Image</Trans>,\n description: (\n <Trans>\n The image \"{imageName}\" could not be created: {errorMessage}\n </Trans>\n ),\n})\n\nexport const getImageFileUploadErrorToast = (\n fileName: string,\n errorMessage: string\n): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Unable to Upload Image File</Trans>,\n description: (\n <Trans>\n Failed to upload file \"{fileName}\": {errorMessage}\n </Trans>\n ),\n})\n\nexport const getImageUploadCancelledToast = (): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Upload Cancelled</Trans>,\n description: <Trans>The image upload was cancelled.</Trans>,\n})\n\nexport const getImageMetadataPropertyCreatedToast = (): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Property Created</Trans>,\n description: <Trans>Property was successfully created.</Trans>,\n})\n\nexport const getImageMetadataPropertyUpdatedToast = (): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Property Updated</Trans>,\n description: <Trans>Property was successfully updated.</Trans>,\n})\n\nexport const getImageMetadataPropertyDeletedToast = (): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Property Deleted</Trans>,\n description: <Trans>Property was successfully deleted.</Trans>,\n})\n\nexport const getImageDeletedToast = (imageName: string): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Image Instance</Trans>,\n description: <Trans>Image instance \"{imageName}\" has been deleted</Trans>,\n})\n\nexport const getImageDeleteErrorToast = (\n imageId: string,\n errorMessage: string\n): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Unable to Delete Image</Trans>,\n description: (\n <Trans>\n The image \"{imageId}\" could not be deleted: {errorMessage}\n </Trans>\n ),\n})\n\nexport const getImageActivatedToast = (imageName: string): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Image Instance</Trans>,\n description: <Trans>Image instance \"{imageName}\" has been activated</Trans>,\n})\n\nexport const getImageDeactivatedToast = (imageName: string): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Image Instance</Trans>,\n description: <Trans>Image instance \"{imageName}\" has been deactivated</Trans>,\n})\n\nexport const getImageActivationErrorToast = (\n imageId: string,\n errorMessage: string\n): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Unable to Re-activate Image</Trans>,\n description: (\n <Trans>\n The image \"{imageId}\" could not be re-activated: {errorMessage}\n </Trans>\n ),\n})\n\nexport const getImageDeactivationErrorToast = (\n imageId: string,\n errorMessage: string\n): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Unable to Deactivate Image</Trans>,\n description: (\n <Trans>\n The image \"{imageId}\" could not be deactivated: {errorMessage}\n </Trans>\n ),\n})\n\n// ── Bulk operations ─────────────────────────────────────────────────────────\n\nexport const getBulkDeleteSuccessToast = (\n successCount: number,\n totalCount: number\n): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Images Deleted</Trans>,\n description: (\n <Trans>\n Successfully deleted {successCount} of {totalCount} image(s)\n </Trans>\n ),\n})\n\nexport const getBulkDeleteErrorToast = (\n failedCount: number,\n totalCount: number\n): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Failed to Delete Images</Trans>,\n description: (\n <Trans>\n Failed to delete {failedCount} of {totalCount} image(s). Some images may be protected or in use.\n </Trans>\n ),\n})\n\nexport const getBulkDeletePartialToast = (\n successCount: number,\n failedCount: number\n): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Partial Delete Success</Trans>,\n description: (\n <Trans>\n Deleted {successCount} image(s), but {failedCount} image(s) could not be deleted.\n </Trans>\n ),\n})\n\nexport const getBulkActivateSuccessToast = (\n successCount: number,\n totalCount: number\n): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Images Activated</Trans>,\n description: (\n <Trans>\n Successfully activated {successCount} of {totalCount} image(s)\n </Trans>\n ),\n})\n\nexport const getBulkActivateErrorToast = (\n failedCount: number,\n totalCount: number\n): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Failed to Activate Images</Trans>,\n description: (\n <Trans>\n Failed to activate {failedCount} of {totalCount} image(s). Some images may already be active or in an invalid\n state.\n </Trans>\n ),\n})\n\nexport const getBulkActivatePartialToast = (\n successCount: number,\n failedCount: number\n): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Partial Activation Success</Trans>,\n description: (\n <Trans>\n Activated {successCount} image(s), but {failedCount} image(s) could not be activated.\n </Trans>\n ),\n})\n\nexport const getBulkDeactivateSuccessToast = (\n successCount: number,\n totalCount: number\n): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Images Deactivated</Trans>,\n description: (\n <Trans>\n Successfully deactivated {successCount} of {totalCount} image(s)\n </Trans>\n ),\n})\n\nexport const getBulkDeactivateErrorToast = (\n failedCount: number,\n totalCount: number\n): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Failed to Deactivate Images</Trans>,\n description: (\n <Trans>\n Failed to deactivate {failedCount} of {totalCount} image(s). Some images may already be deactivated or in an\n invalid state.\n </Trans>\n ),\n})\n\nexport const getBulkDeactivatePartialToast = (\n successCount: number,\n failedCount: number\n): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Partial Deactivation Success</Trans>,\n description: (\n <Trans>\n Deactivated {successCount} image(s), but {failedCount} image(s) could not be deactivated.\n </Trans>\n ),\n})\n\n// ── Image access ────────────────────────────────────────────────────────────\n\nexport const getImageAccessStatusUpdatedToast = (newStatus: string): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Access Status</Trans>,\n description: <Trans>Access status updated to \"{newStatus}\".</Trans>,\n})\n\nexport const getImageAccessStatusErrorToast = (errorMessage: string): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Access Status</Trans>,\n description: errorMessage || <Trans>Failed to update access status</Trans>,\n})\n\n// ── Image visibility ────────────────────────────────────────────────────────\n\nexport const getImageVisibilityUpdatedToast = (\n imageName: string,\n visibility: string\n): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Image Visibility</Trans>,\n description: (\n <Trans>\n Image \"{imageName}\" visibility updated to {visibility}\n </Trans>\n ),\n})\n\nexport const getImageVisibilityUpdateErrorToast = (\n imageName: string,\n errorMessage: string\n): { message: ReactNode } & NotificationOptions => ({\n message: <Trans>Unable to Update Image Visibility</Trans>,\n description: (\n <Trans>\n Failed to update visibility for \"{imageName}\": {errorMessage}\n </Trans>\n ),\n})\n","import React, { useState, useMemo, useEffect } from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport {\n Modal,\n Button,\n Status,\n Stack,\n DescriptionList,\n DescriptionTerm,\n DescriptionDefinition,\n TextInput,\n Message,\n toast,\n} from \"@cloudoperators/juno-ui-components\"\nimport { GlanceImage } from \"@/server/Compute/types/image\"\nimport { TrpcClient } from \"@/client/trpcClient\"\nimport { useErrorTranslation } from \"@/client/utils/useErrorTranslation\"\nimport {\n getImageMetadataPropertyCreatedToast,\n getImageMetadataPropertyUpdatedToast,\n getImageMetadataPropertyDeletedToast,\n} from \"./ImageToastNotifications\"\n\ninterface EditImageMetadataModalProps {\n client: TrpcClient\n image: GlanceImage\n isOpen: boolean\n canEdit?: boolean\n onClose: () => void\n projectId: string\n}\n\ninterface MetadataEntry {\n key: string\n value: string\n isNew?: boolean\n isEditing?: boolean\n originalKey?: string\n originalValue?: string\n editingValue?: string\n}\n\nfunction toStrValue(value: unknown): string {\n if (value === null || value === undefined) return \"\"\n if (typeof value === \"object\") return JSON.stringify(value)\n return String(value)\n}\n\nfunction buildInitialMetadata(image: GlanceImage, excludedProperties: Set<string>): MetadataEntry[] {\n return Object.entries(image)\n .filter(([key]) => !excludedProperties.has(key.toLowerCase()))\n .map(([key, value]) => {\n const strValue = toStrValue(value)\n return { key, value: strValue, isNew: false, isEditing: false, originalKey: key, originalValue: strValue }\n })\n .sort((a, b) => a.key.localeCompare(b.key)) // Sort ascending A-Z\n}\n\n// Inner component receives already-computed initialMetadata so useState is seeded correctly\nfunction EditImageMetadataModalInner({\n client,\n onClose,\n initialMetadata,\n excludedProperties,\n canEdit = true,\n projectId,\n imageId,\n}: {\n client: TrpcClient\n onClose: () => void\n initialMetadata: MetadataEntry[]\n excludedProperties: Set<string>\n canEdit?: boolean\n projectId: string\n imageId: string\n}) {\n const { t } = useLingui()\n const { translateError } = useErrorTranslation()\n\n const [metadata, setMetadata] = useState<MetadataEntry[]>(initialMetadata)\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 [operationInProgress, setOperationInProgress] = useState(false)\n const [validationMessage, setValidationMessage] = useState<string | null>(null)\n\n const isModalDisabled = operationInProgress || isAddingNew || metadata.some((e) => e.isEditing)\n\n const validateKey = (key: string, originalKey?: string, rowIndex?: number): string | null => {\n const normalized = key?.trim().toLowerCase()\n if (!normalized) {\n return t`Key is required`\n }\n if (excludedProperties.has(normalized)) {\n return t`This property is reserved and cannot be modified`\n }\n const isDuplicate = metadata.some(\n (entry, idx) =>\n entry.key.trim().toLowerCase() === normalized && idx !== rowIndex && entry.originalKey !== originalKey\n )\n if (isDuplicate) {\n return t`A property with this key already exists`\n }\n return null\n }\n\n const handleAddNew = async () => {\n const keyError = validateKey(newKey, undefined, metadata.length)\n if (keyError) {\n setErrors({ newKey: \"error\" })\n setValidationMessage(keyError)\n return\n }\n if (!newValue.trim()) {\n setErrors({ newValue: \"error\" })\n setValidationMessage(t`Value is required`)\n return\n }\n\n setOperationInProgress(true)\n try {\n await client.compute.updateImage.mutate({\n project_id: projectId,\n imageId,\n operations: [{ op: \"add\", path: `/${newKey.trim()}`, value: newValue.trim() }],\n })\n\n setMetadata((prev) => [\n {\n key: newKey.trim(),\n value: newValue.trim(),\n isNew: false,\n isEditing: false,\n originalKey: newKey.trim(),\n originalValue: newValue.trim(),\n },\n ...prev,\n ])\n setNewKey(\"\")\n setNewValue(\"\")\n setIsAddingNew(false)\n setErrors({})\n setValidationMessage(null)\n const { message, ...options } = getImageMetadataPropertyCreatedToast()\n toast.success(message, options)\n } catch (error) {\n const errorMsg = translateError(error instanceof Error ? error.message : \"Failed to create property\")\n setValidationMessage(errorMsg)\n } finally {\n setOperationInProgress(false)\n }\n }\n\n const handleCancelAdd = () => {\n setNewKey(\"\")\n setNewValue(\"\")\n setIsAddingNew(false)\n setErrors({})\n setValidationMessage(null)\n }\n\n const handleEdit = (index: number) => {\n setMetadata((prev) =>\n prev.map((entry, i) =>\n i === index ? { ...entry, isEditing: true, editingValue: entry.value } : { ...entry, isEditing: false }\n )\n )\n setIsAddingNew(false)\n }\n\n const handleSaveEdit = async (index: number) => {\n const entry = metadata[index]\n const keyError = validateKey(entry.key, entry.originalKey, index)\n if (keyError) {\n setErrors({ [`edit-${index}`]: \"error\" })\n setValidationMessage(keyError)\n return\n }\n if (!entry.value.trim()) {\n setErrors({ [`edit-${index}`]: \"error\" })\n setValidationMessage(t`Value is required`)\n return\n }\n\n setOperationInProgress(true)\n try {\n const trimmedValue = entry.value.trim()\n const trimmedKey = entry.key.trim()\n const keyChanged = entry.originalKey !== undefined && entry.originalKey !== trimmedKey\n // A renamed key is a new JSON Pointer, so \"replace\" (RFC 6902) would fail.\n // Use \"add\" for the new key + \"remove\" for the old; \"replace\" only when unchanged.\n const operations: Array<{ op: \"add\" | \"replace\" | \"remove\"; path: string; value?: unknown }> = keyChanged\n ? [\n { op: \"add\", path: `/${trimmedKey}`, value: trimmedValue },\n { op: \"remove\", path: `/${entry.originalKey}` },\n ]\n : [{ op: \"replace\", path: `/${trimmedKey}`, value: trimmedValue }]\n\n await client.compute.updateImage.mutate({ project_id: projectId, imageId, operations })\n\n setMetadata((prev) =>\n prev.map((e, i) =>\n i === index\n ? {\n key: entry.key.trim(),\n value: trimmedValue,\n isEditing: false,\n originalKey: entry.key.trim(),\n originalValue: trimmedValue,\n }\n : e\n )\n )\n setErrors({})\n setValidationMessage(null)\n const { message, ...options } = getImageMetadataPropertyUpdatedToast()\n toast.success(message, options)\n } catch (error) {\n const errorMsg = translateError(error instanceof Error ? error.message : \"Failed to update property\")\n setValidationMessage(errorMsg)\n } finally {\n setOperationInProgress(false)\n }\n }\n\n const handleCancelEdit = (index: number) => {\n setMetadata((prev) =>\n prev.map((e, i) =>\n i === index ? { ...e, isEditing: false, key: e.originalKey ?? e.key, value: e.editingValue ?? e.value } : e\n )\n )\n setErrors({})\n setValidationMessage(null)\n }\n\n const handleDelete = async (index: number) => {\n const entry = metadata[index]\n setOperationInProgress(true)\n\n try {\n await client.compute.updateImage.mutate({\n project_id: projectId,\n imageId,\n operations: [{ op: \"remove\", path: `/${entry.key}` }],\n })\n setMetadata((prev) => prev.filter((_, i) => i !== index))\n setErrors({})\n setValidationMessage(null)\n const { message, ...options } = getImageMetadataPropertyDeletedToast()\n toast.success(message, options)\n } catch (error) {\n const errorMsg = translateError(error instanceof Error ? error.message : \"Failed to delete property\")\n setValidationMessage(errorMsg)\n } finally {\n setOperationInProgress(false)\n }\n }\n\n const handleKeyChange = (index: number, value: string) => {\n setMetadata((prev) => prev.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 setValidationMessage(null)\n }\n }\n\n const handleValueChange = (index: number, value: string) => {\n setMetadata((prev) => prev.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 setValidationMessage(null)\n }\n }\n\n const handleClose = () => {\n if (!operationInProgress) {\n setIsAddingNew(false)\n setNewKey(\"\")\n setNewValue(\"\")\n setErrors({})\n setValidationMessage(null)\n onClose()\n }\n }\n\n return (\n <Modal\n open\n onCancel={handleClose}\n size=\"xl\"\n title={canEdit ? t`Edit Metadata` : t`Show Metadata`}\n cancelButtonLabel={t`Close`}\n disableCancelButton={operationInProgress}\n >\n <div>\n {validationMessage && <Message variant=\"error\" text={validationMessage} className=\"mb-4\" />}\n\n {canEdit && (\n <Stack direction=\"horizontal\" className=\"mb-4 justify-end p-2\">\n <Button label={t`Add Property`} onClick={() => setIsAddingNew(true)} disabled={isModalDisabled} />\n </Stack>\n )}\n {metadata.length === 0 && !isAddingNew ? (\n <p className=\"jn:text-theme-light py-8 text-center\">\n {canEdit\n ? t`No custom metadata properties found. Click \"Add Property\" to create one.`\n : t`No custom metadata properties found.`}\n </p>\n ) : (\n <DescriptionList className=\"mb-6\" alignTerms=\"left\">\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 setValidationMessage(null)\n }\n }}\n invalid={!!errors.newKey}\n autoFocus\n disabled={operationInProgress}\n />\n </DescriptionTerm>\n <DescriptionDefinition>\n <Stack direction=\"horizontal\" gap=\"2\" alignment=\"center\" className=\"justify-between\">\n <div className=\"flex-1\">\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 setValidationMessage(null)\n }\n }}\n invalid={!!errors.newValue}\n disabled={operationInProgress}\n />\n </div>\n <Stack direction=\"horizontal\" gap=\"2\" className=\"shrink-0\">\n <Button\n size=\"small\"\n variant=\"primary\"\n onClick={() => {\n console.log(\"Save button clicked\")\n handleAddNew()\n }}\n icon=\"check\"\n title={t`Save`}\n disabled={!newKey.trim() || operationInProgress}\n />\n <Button\n size=\"small\"\n variant=\"subdued\"\n onClick={handleCancelAdd}\n icon=\"close\"\n title={t`Discard`}\n disabled={operationInProgress}\n />\n </Stack>\n </Stack>\n </DescriptionDefinition>\n </>\n )}\n </>\n\n <>\n {metadata.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 invalid={!!errors[`edit-${index}`]}\n disabled={operationInProgress}\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 <div className=\"flex-1\">\n <TextInput\n value={entry.value}\n onChange={(e) => handleValueChange(index, e.target.value)}\n invalid={!!errors[`edit-${index}`]}\n disabled={operationInProgress}\n />\n </div>\n <Stack direction=\"horizontal\" gap=\"2\" className=\"shrink-0\">\n <Button\n size=\"small\"\n variant=\"primary\"\n onClick={() => handleSaveEdit(index)}\n icon=\"check\"\n title={t`Save`}\n disabled={operationInProgress}\n />\n <Button\n size=\"small\"\n variant=\"subdued\"\n onClick={() => handleCancelEdit(index)}\n icon=\"close\"\n title={t`Discard`}\n disabled={operationInProgress}\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={isModalDisabled}\n />\n <Button\n size=\"small\"\n onClick={() => handleDelete(index)}\n icon=\"deleteForever\"\n aria-label={t`Delete`}\n data-testid={`delete-${entry.key}`}\n title={t`Delete`}\n disabled={isModalDisabled}\n />\n </Stack>\n )}\n </>\n )}\n </DescriptionDefinition>\n </React.Fragment>\n ))}\n </>\n </DescriptionList>\n )}\n </div>\n </Modal>\n )\n}\n\nexport const EditImageMetadataModal: React.FC<EditImageMetadataModalProps> = ({\n client,\n image,\n isOpen,\n canEdit = true,\n onClose,\n projectId,\n}) => {\n const { t } = useLingui()\n const { translateError } = useErrorTranslation()\n\n const [excludedPropertiesData, setExcludedPropertiesData] = useState<string[] | null>(null)\n const [isLoadingExcluded, setIsLoadingExcluded] = useState(false)\n const [loadError, setLoadError] = useState<string | null>(null)\n\n useEffect(() => {\n if (!isOpen || !projectId) {\n setExcludedPropertiesData(null)\n setLoadError(null)\n return\n }\n\n let cancelled = false\n setIsLoadingExcluded(true)\n setLoadError(null)\n\n const loadData = async () => {\n try {\n const data = await client.compute.getImageMetadataExcludedProperties.query({ project_id: projectId })\n if (cancelled) return\n setExcludedPropertiesData(data)\n } catch (error) {\n if (cancelled) return\n setLoadError(error instanceof Error ? error.message : \"Failed to Load Metadata Configuration\")\n } finally {\n if (!cancelled) setIsLoadingExcluded(false)\n }\n }\n\n loadData()\n return () => {\n cancelled = true\n }\n }, [isOpen, projectId])\n\n const excludedProperties = useMemo(\n () => new Set((excludedPropertiesData ?? []).map((s) => s.toLowerCase())),\n [excludedPropertiesData]\n )\n const initialMetadata = useMemo(\n () => buildInitialMetadata(image, excludedProperties),\n [image.id, image.updated_at, excludedProperties]\n )\n\n if (!isOpen) return null\n\n if (isLoadingExcluded) {\n return (\n <Modal open onCancel={onClose} size=\"xl\" title={canEdit ? t`Edit Metadata` : t`Show Metadata`}>\n <Status status=\"progress\" title={t`Loading Metadata Configuration...`} className=\"mt-0\" />\n </Modal>\n )\n }\n\n if (loadError) {\n return (\n <Modal open onCancel={onClose} size=\"xl\" title={canEdit ? t`Edit Metadata` : t`Show Metadata`}>\n <Status\n status=\"error\"\n title={t`Failed to Load Metadata Configuration`}\n body={translateError(loadError)}\n className=\"mt-0\"\n />\n </Modal>\n )\n }\n\n return (\n <EditImageMetadataModalInner\n client={client}\n onClose={onClose}\n initialMetadata={initialMetadata}\n excludedProperties={excludedProperties}\n canEdit={canEdit}\n projectId={projectId}\n imageId={image.id}\n />\n )\n}\n","import { z } from \"zod\"\nimport { useForm, useStore } from \"@tanstack/react-form\"\nimport React from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { GlanceImage } from \"@/server/Compute/types/image\"\nimport {\n DescriptionDefinition,\n DescriptionList,\n DescriptionTerm,\n Modal,\n Stack,\n Form,\n FormSection,\n TextInput,\n} from \"@cloudoperators/juno-ui-components\"\nimport { SizeDisplay } from \"./SizeDisplay\"\nimport { useModalTracking } from \"@/client/hooks/useModalTracking\"\n\ninterface DeleteImageModalProps {\n image: GlanceImage\n isOpen: boolean\n isLoading: boolean\n isDisabled: boolean\n onClose: () => void\n onDelete: (updatedImage: GlanceImage) => void\n}\n\nexport const DeleteImageModal: React.FC<DeleteImageModalProps> = ({\n image,\n isOpen,\n isLoading,\n isDisabled,\n onClose,\n onDelete,\n}) => {\n if (!image) return null\n\n const { t } = useLingui()\n\n const { trackClose, markSubmitted, resetTracking } = useModalTracking({\n isOpen,\n actionPrefix: \"compute.image.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 (isLoading || isDisabled) return\n\n markSubmitted()\n onDelete(image)\n handleClose()\n },\n })\n\n const canDelete = useStore(form.store, (state) => state.isSubmitting || state.values.confirm !== \"delete\")\n\n const handleClose = () => {\n trackClose()\n form.reset()\n resetTracking()\n onClose()\n }\n\n const confirmLabel = isLoading ? t`Deleting...` : t`Delete Image`\n const imageName = image?.name || image?.id\n\n return (\n <Modal\n open={isOpen}\n onCancel={handleClose}\n size=\"small\"\n title={t`Delete Image \"${imageName}\"`}\n confirmButtonLabel={confirmLabel}\n confirmButtonVariant=\"primary-danger\"\n onConfirm={form.handleSubmit}\n cancelButtonLabel={t`Cancel`}\n disableConfirmButton={canDelete || isLoading || isDisabled}\n disableCancelButton={isLoading}\n disableCloseButton={isLoading}\n >\n <Stack direction=\"vertical\" gap=\"4\">\n <p className=\"text-theme-default\">\n <Trans>This action cannot be undone. The image will be permanently deleted.</Trans>\n </p>\n\n {image && (\n <DescriptionList>\n <DescriptionTerm>{t`Name`}</DescriptionTerm>\n <DescriptionDefinition>{image.name || t`Unnamed`}</DescriptionDefinition>\n\n <DescriptionTerm>{t`Id`}</DescriptionTerm>\n <DescriptionDefinition>{image.id}</DescriptionDefinition>\n <DescriptionTerm>{t`Status`}</DescriptionTerm>\n <DescriptionDefinition>{image.status}</DescriptionDefinition>\n <DescriptionTerm>{t`Visibility`}</DescriptionTerm>\n <DescriptionDefinition>{image.visibility}</DescriptionDefinition>\n <DescriptionTerm>{t`Size`}</DescriptionTerm>\n <DescriptionDefinition>\n <SizeDisplay size={image.size} />\n </DescriptionDefinition>\n <DescriptionTerm>{t`Disk Format`}</DescriptionTerm>\n <DescriptionDefinition>{image.disk_format || t`N/A`}</DescriptionDefinition>\n <DescriptionTerm>{t`Created`}</DescriptionTerm>\n <DescriptionDefinition>\n {image.created_at ? new Date(image.created_at).toLocaleDateString() : t`N/A`}\n </DescriptionDefinition>\n </DescriptionList>\n )}\n\n <Form\n className=\"mb-0\"\n id=\"delete-image-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 autoFocus\n disabled={isLoading}\n required\n />\n )}\n />\n </FormSection>\n </Form>\n </Stack>\n </Modal>\n )\n}\n","import React from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { GlanceImage } from \"@/server/Compute/types/image\"\nimport {\n DescriptionDefinition,\n DescriptionList,\n DescriptionTerm,\n Modal,\n Status,\n} from \"@cloudoperators/juno-ui-components\"\nimport { SizeDisplay } from \"./SizeDisplay\"\n\ninterface ActivateImageModalProps {\n image: GlanceImage\n isOpen: boolean\n isLoading: boolean\n onClose: () => void\n onActivate: (image: GlanceImage) => void\n}\n\nexport const ActivateImageModal: React.FC<ActivateImageModalProps> = ({\n image,\n isOpen,\n isLoading,\n onClose,\n onActivate,\n}) => {\n if (!image) return null\n\n const { t } = useLingui()\n\n const handleActivate = (e: React.MouseEvent<HTMLElement>) => {\n e.preventDefault()\n onActivate(image)\n }\n\n return (\n <Modal\n onCancel={onClose}\n size=\"small\"\n title={t`Activate Image`}\n open={isOpen}\n onConfirm={handleActivate}\n confirmButtonLabel={t`Activate`}\n cancelButtonLabel={t`Cancel`}\n disableConfirmButton={isLoading}\n disableCancelButton={isLoading}\n disableCloseButton={isLoading}\n >\n {isLoading ? (\n <Status status=\"progress\" title={t`Activating Image...`} className=\"mt-0\" />\n ) : (\n <>\n <p className=\"mb-4\">{t`Activating this image will allow it to be used to launch new instances again.`}</p>\n\n <DescriptionList>\n <DescriptionTerm>{t`Name`}</DescriptionTerm>\n <DescriptionDefinition>{image.name || t`Unnamed`}</DescriptionDefinition>\n\n <DescriptionTerm>{t`Id`}</DescriptionTerm>\n <DescriptionDefinition>{image.id}</DescriptionDefinition>\n <DescriptionTerm>{t`Status`}</DescriptionTerm>\n <DescriptionDefinition>{image.status}</DescriptionDefinition>\n <DescriptionTerm>{t`Visibility`}</DescriptionTerm>\n <DescriptionDefinition>{image.visibility}</DescriptionDefinition>\n <DescriptionTerm>{t`Size`}</DescriptionTerm>\n <DescriptionDefinition>\n <SizeDisplay size={image.size} />\n </DescriptionDefinition>\n <DescriptionTerm>{t`Disk Format`}</DescriptionTerm>\n <DescriptionDefinition>{image.disk_format || t`N/A`}</DescriptionDefinition>\n <DescriptionTerm>{t`Created`}</DescriptionTerm>\n <DescriptionDefinition>\n {(() => {\n const dt = new Date(image.created_at ?? \"\")\n return !isNaN(dt.getTime()) ? dt.toLocaleDateString() : t`N/A`\n })()}\n </DescriptionDefinition>\n </DescriptionList>\n </>\n )}\n </Modal>\n )\n}\n","import React from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { GlanceImage } from \"@/server/Compute/types/image\"\nimport {\n DescriptionDefinition,\n DescriptionList,\n DescriptionTerm,\n Modal,\n Status,\n} from \"@cloudoperators/juno-ui-components\"\nimport { SizeDisplay } from \"./SizeDisplay\"\n\ninterface DeactivateImageModalProps {\n image: GlanceImage\n isOpen: boolean\n isLoading: boolean\n onClose: () => void\n onDeactivate: (image: GlanceImage) => void\n}\n\nexport const DeactivateImageModal: React.FC<DeactivateImageModalProps> = ({\n image,\n isOpen,\n isLoading,\n onClose,\n onDeactivate,\n}) => {\n if (!image) return null\n\n const { t } = useLingui()\n\n const handleDeactivate = (e: React.MouseEvent<HTMLElement>) => {\n e.preventDefault()\n onDeactivate(image)\n }\n\n return (\n <Modal\n onCancel={onClose}\n size=\"small\"\n title={t`Deactivate Image`}\n open={isOpen}\n onConfirm={handleDeactivate}\n confirmButtonLabel={t`Deactivate`}\n cancelButtonLabel={t`Cancel`}\n disableConfirmButton={isLoading}\n disableCancelButton={isLoading}\n disableCloseButton={isLoading}\n >\n {isLoading ? (\n <Status status=\"progress\" title={t`Deactivating Image...`} className=\"mt-0\" />\n ) : (\n <>\n <p className=\"mb-4\">\n {t`Deactivating this image will prevent it from being used to launch new instances. Existing instances will not be affected.`}\n </p>\n\n <DescriptionList>\n <DescriptionTerm>{t`Name`}</DescriptionTerm>\n <DescriptionDefinition>{image.name || t`Unnamed`}</DescriptionDefinition>\n\n <DescriptionTerm>{t`Id`}</DescriptionTerm>\n <DescriptionDefinition>{image.id}</DescriptionDefinition>\n <DescriptionTerm>{t`Status`}</DescriptionTerm>\n <DescriptionDefinition>{image.status}</DescriptionDefinition>\n <DescriptionTerm>{t`Visibility`}</DescriptionTerm>\n <DescriptionDefinition>{image.visibility}</DescriptionDefinition>\n <DescriptionTerm>{t`Size`}</DescriptionTerm>\n <DescriptionDefinition>\n <SizeDisplay size={image.size} />\n </DescriptionDefinition>\n <DescriptionTerm>{t`Disk Format`}</DescriptionTerm>\n <DescriptionDefinition>{image.disk_format || t`N/A`}</DescriptionDefinition>\n <DescriptionTerm>{t`Created`}</DescriptionTerm>\n <DescriptionDefinition>\n {(() => {\n const dt = new Date(image.created_at ?? \"\")\n return !isNaN(dt.getTime()) ? dt.toLocaleDateString() : t`N/A`\n })()}\n </DescriptionDefinition>\n </DescriptionList>\n </>\n )}\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 ImageMemberFormRowProps {\n memberId: string\n imageId: string\n errors: { memberId?: string }\n isLoading: boolean\n onMemberIdChange: (memberId: string) => void\n onSave: () => void\n onCancel: () => void\n}\n\nexport const ImageMemberFormRow: React.FC<ImageMemberFormRowProps> = ({\n memberId,\n imageId,\n errors,\n isLoading,\n onMemberIdChange,\n onSave,\n onCancel,\n}) => {\n const { t } = useLingui()\n\n return (\n <DataGridRow>\n <DataGridCell></DataGridCell>\n <DataGridCell className=\"pl-0\">\n <TextInput\n label={t`Project ID`}\n value={memberId}\n onChange={(e) => onMemberIdChange(e.target.value)}\n errortext={errors.memberId}\n required\n />\n </DataGridCell>\n <DataGridCell className=\"break-all\">{imageId}</DataGridCell>\n <DataGridCell>\n <ButtonRow>\n <Button icon=\"check\" onClick={onSave} variant=\"primary\" title={t`Add Member`} disabled={isLoading} />\n <Button icon=\"cancel\" onClick={onCancel} title={t`Cancel`} disabled={isLoading} />\n </ButtonRow>\n </DataGridCell>\n </DataGridRow>\n )\n}\n","import React from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { DataGridRow, DataGridCell, Button, Stack, Spinner } from \"@cloudoperators/juno-ui-components\"\nimport { MEMBER_STATUSES } from \"../../-constants/filters\"\n\ninterface ImageMember {\n image_id: string\n member_id: string\n status: string\n created_at: string\n updated_at: string\n}\n\ninterface ImageMemberRowProps {\n member: ImageMember\n isDeleting: boolean\n onDelete: () => void\n canDelete: boolean\n}\n\nexport const ImageMemberRow: React.FC<ImageMemberRowProps> = ({ member, isDeleting, onDelete, canDelete }) => {\n const { t } = useLingui()\n\n const getStatusLabel = (status: string): string => {\n switch (status) {\n case MEMBER_STATUSES.PENDING:\n return t`Pending`\n case MEMBER_STATUSES.ACCEPTED:\n return t`Accepted`\n case MEMBER_STATUSES.REJECTED:\n return t`Rejected`\n default:\n return status\n }\n }\n\n const deleteButton = () => {\n if (!canDelete) {\n return <></>\n }\n\n const memberIdDisplay = member.member_id\n\n return (\n <Button\n icon=\"deleteForever\"\n onClick={onDelete}\n title={t`Remove access for ${memberIdDisplay}`}\n aria-label={t`Remove access for ${memberIdDisplay}`}\n data-testid={`remove-${memberIdDisplay}`}\n disabled={isDeleting}\n />\n )\n }\n\n return (\n <DataGridRow>\n <DataGridCell className=\"break-all\">{getStatusLabel(member.status)}</DataGridCell>\n <DataGridCell className=\"break-all\">{member.member_id}</DataGridCell>\n <DataGridCell className=\"break-all\">{member.image_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 {deleteButton()}\n </Stack>\n )}\n </DataGridCell>\n </DataGridRow>\n )\n}\n","import React, { useState } from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport {\n DataGrid,\n DataGridRow,\n DataGridHeadCell,\n DataGridCell,\n Stack,\n Status,\n Button,\n Message,\n} from \"@cloudoperators/juno-ui-components\"\nimport { GlanceImage, ImageMember } from \"@/server/Compute/types/image\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { TRPCClientError } from \"@trpc/client\"\nimport { InferrableClientTypes } from \"@trpc/server/unstable-core-do-not-import\"\nimport { ImageMemberFormRow } from \"./ImageMemberFormRow\"\nimport { ImageMemberRow } from \"./ImageMemberRow\"\n\ninterface ImageMembersTableProps {\n image: GlanceImage\n imageMembers: ImageMember[] | undefined\n isMembersLoading: boolean\n canAdd: boolean\n canRemove: boolean\n isAddingMember: boolean\n setIsAddingMember: (adding: boolean) => void\n setMessage: (msg: { text: string; type: \"error\" | \"info\" } | null) => void\n projectId: string\n}\n\nexport const ImageMembersTable: React.FC<ImageMembersTableProps> = ({\n image,\n imageMembers,\n isMembersLoading,\n canAdd,\n canRemove,\n isAddingMember,\n setIsAddingMember,\n setMessage,\n projectId,\n}) => {\n const { t } = useLingui()\n const utils = trpcReact.useUtils()\n\n const [memberId, setMemberId] = useState(\"\")\n const [errors, setErrors] = useState<{ memberId?: string }>({})\n const [deletingMembers, setDeletingMembers] = useState<Set<string>>(new Set())\n\n const createMemberMutation = trpcReact.compute.createImageMember.useMutation({\n onSuccess: () => {\n utils.compute.listImageMembers.invalidate({ project_id: projectId, imageId: image.id })\n },\n })\n\n const deleteMemberMutation = trpcReact.compute.deleteImageMember.useMutation({\n onSuccess: () => {\n utils.compute.listImageMembers.invalidate({ project_id: projectId, imageId: image.id })\n },\n })\n\n const isPublicImage = image.visibility === \"public\"\n const shouldShowEmptyState = !imageMembers || imageMembers.length === 0\n const isLoading = createMemberMutation.isPending || deleteMemberMutation.isPending\n\n // Sort members: pending first, then accepted, then rejected, alphabetically by member_id within each group\n const sortedMembers = imageMembers\n ? [...imageMembers].sort((a, b) => {\n const statusOrder = { pending: 0, accepted: 1, rejected: 2 }\n const aOrder = statusOrder[a.status as keyof typeof statusOrder] ?? 3\n const bOrder = statusOrder[b.status as keyof typeof statusOrder] ?? 3\n\n if (aOrder !== bOrder) return aOrder - bOrder\n return a.member_id.localeCompare(b.member_id)\n })\n : []\n\n const validateForm = (): boolean => {\n const trimmedMemberId = memberId.trim()\n const newErrors: { memberId?: string } = {}\n\n if (!trimmedMemberId) {\n newErrors.memberId = t`Project ID (project UUID) is required.`\n } else if (imageMembers?.some((member) => member.member_id === trimmedMemberId)) {\n newErrors.memberId = t`This member already has access to this image.`\n }\n\n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }\n\n const resetForm = () => {\n setMemberId(\"\")\n setErrors({})\n }\n\n const handleAddMember = async () => {\n if (!validateForm()) {\n setMessage({ text: t`Please fix the validation errors below.`, type: \"error\" })\n return\n }\n\n const trimmedMemberId = memberId.trim()\n\n try {\n await createMemberMutation.mutateAsync({\n project_id: projectId,\n imageId: image.id,\n member: trimmedMemberId,\n })\n\n setMessage({\n text: t`Member \"${trimmedMemberId}\" has been added successfully.`,\n type: \"info\",\n })\n resetForm()\n setIsAddingMember(false)\n } catch (error) {\n const errorMessage = (error as TRPCClientError<InferrableClientTypes>)?.message || t`Failed to add member`\n setMessage({\n text: errorMessage,\n type: \"error\",\n })\n }\n }\n\n const handleRemoveMember = async (memberIdToRemove: string) => {\n setDeletingMembers((prev) => new Set(prev).add(memberIdToRemove))\n\n try {\n await deleteMemberMutation.mutateAsync({\n project_id: projectId,\n imageId: image.id,\n memberId: memberIdToRemove,\n })\n\n setMessage({\n text: t`Member \"${memberIdToRemove}\" has been removed successfully.`,\n type: \"info\",\n })\n } catch (error) {\n const errorMessage = (error as TRPCClientError<InferrableClientTypes>)?.message || t`Failed to remove member`\n setMessage({\n text: errorMessage || t`Failed to remove member \"${memberIdToRemove}\"`,\n type: \"error\",\n })\n } finally {\n setDeletingMembers((prev) => {\n const newSet = new Set(prev)\n newSet.delete(memberIdToRemove)\n return newSet\n })\n }\n }\n\n const handleMemberIdChange = (newMemberId: string) => {\n setMemberId(newMemberId)\n if (errors.memberId) setErrors((prev) => ({ ...prev, memberId: undefined }))\n }\n\n if (isMembersLoading) {\n return (\n <DataGrid columns={4}>\n <DataGridRow>\n <DataGridHeadCell>{t`Status`}</DataGridHeadCell>\n <DataGridHeadCell>{t`Project ID`}</DataGridHeadCell>\n <DataGridHeadCell>{t`Image ID`}</DataGridHeadCell>\n <DataGridHeadCell></DataGridHeadCell>\n </DataGridRow>\n\n <DataGridRow>\n <DataGridCell colSpan={4}>\n <Status status=\"progress\" title={t`Loading...`} />\n </DataGridCell>\n </DataGridRow>\n </DataGrid>\n )\n }\n\n if (isPublicImage) {\n return (\n <Message\n text={t`This is a public image. All users have access to it. Explicit sharing is not needed.`}\n variant=\"info\"\n />\n )\n }\n\n return (\n <>\n {canAdd && (\n <Stack direction=\"horizontal\" className=\"bg-theme-background-lvl-1 justify-end p-2\">\n <Button\n label={t`Add Project Access`}\n data-testid=\"addMemberButton\"\n onClick={() => setIsAddingMember(true)}\n disabled={isAddingMember}\n />\n </Stack>\n )}\n\n <DataGrid columns={4}>\n <DataGridRow>\n <DataGridHeadCell>{t`Status`}</DataGridHeadCell>\n <DataGridHeadCell>{t`Project ID`}</DataGridHeadCell>\n <DataGridHeadCell>{t`Image ID`}</DataGridHeadCell>\n <DataGridHeadCell></DataGridHeadCell>\n </DataGridRow>\n\n {isAddingMember && (\n <ImageMemberFormRow\n memberId={memberId}\n imageId={image.id}\n errors={errors}\n isLoading={isLoading}\n onMemberIdChange={handleMemberIdChange}\n onSave={handleAddMember}\n onCancel={() => {\n resetForm()\n setIsAddingMember(false)\n setMessage(null)\n }}\n />\n )}\n\n {sortedMembers.map((member, index) => (\n <ImageMemberRow\n key={`${member.member_id}-${index}`}\n member={member}\n isDeleting={deletingMembers.has(member.member_id)}\n onDelete={() => handleRemoveMember(member.member_id)}\n canDelete={canRemove}\n />\n ))}\n\n {shouldShowEmptyState && !isAddingMember && (\n <DataGridRow>\n <DataGridCell colSpan={4} className=\"text-theme-default py-4 text-center\">\n {t`No projects have access to this image yet. Click \"Add Project Access\" to grant access.`}\n </DataGridCell>\n </DataGridRow>\n )}\n </DataGrid>\n </>\n )\n}\n","import React, { useState } from \"react\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { useProjectId } from \"@/client/hooks\"\nimport { Modal, Message } from \"@cloudoperators/juno-ui-components\"\nimport { GlanceImage } from \"@/server/Compute/types/image\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { ImageMembersTable } from \"./ImageMembersTable\"\n\ninterface ManageImageAccessProps {\n isOpen: boolean\n onClose: () => void\n image: GlanceImage | null\n permissions: {\n canCreateMember: boolean\n canDeleteMember: boolean\n }\n}\n\nexport const ManageImageAccessModal: React.FC<ManageImageAccessProps> = ({\n isOpen,\n onClose,\n image,\n permissions: { canCreateMember, canDeleteMember },\n}) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n\n const [message, setMessage] = useState<{ text: string; type: \"error\" | \"info\" } | null>(null)\n const [isAddingMember, setIsAddingMember] = useState(false)\n\n const { data: imageMembers, isLoading: isMembersLoading } = trpcReact.compute.listImageMembers.useQuery(\n { project_id: projectId, imageId: image?.id || \"\" },\n {\n enabled: isOpen && !!image?.id,\n }\n )\n\n const handleClose = () => {\n setMessage(null)\n setIsAddingMember(false)\n onClose()\n }\n\n if (!isOpen || !image) {\n return null\n }\n\n const imageName = image.name || image.id\n\n return (\n <Modal onCancel={handleClose} title={t`Manage Access for Image - ${imageName}`} 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 <ImageMembersTable\n projectId={projectId}\n image={image}\n imageMembers={imageMembers}\n isMembersLoading={isMembersLoading}\n canAdd={canCreateMember}\n canRemove={canDeleteMember}\n isAddingMember={isAddingMember}\n setIsAddingMember={setIsAddingMember}\n setMessage={setMessage}\n />\n </div>\n </Modal>\n )\n}\n","import { GlanceImage } from \"@/server/Compute/types/image\"\n\n/**\n * Converts partial image properties to OpenStack JSON Patch operations\n * Determines whether to use 'add', 'replace', or 'remove' based on original image state\n */\nexport function convertToJsonPatchOperations(\n updatedProperties: Partial<GlanceImage>,\n originalImage: GlanceImage\n): Array<{ op: \"add\" | \"replace\" | \"remove\"; path: string; value?: unknown }> {\n const operations: Array<{ op: \"add\" | \"replace\" | \"remove\"; path: string; value?: unknown }> = []\n\n Object.entries(updatedProperties).forEach(([key, value]) => {\n const path = `/${key}`\n\n if (value === null || value === undefined) {\n // Remove operation for null/undefined values (only if property exists)\n if (key in originalImage) {\n operations.push({ op: \"remove\", path })\n }\n } else {\n // Check if property exists in original image\n const propertyExists = key in originalImage\n\n if (propertyExists) {\n // Use 'replace' for existing properties\n operations.push({ op: \"replace\", path, value })\n } else {\n // Use 'add' for new properties\n operations.push({ op: \"add\", path, value })\n }\n }\n })\n\n return operations\n}\n"],"mappings":"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"}
|