@cobaltcore-dev/aurora 0.10.0 → 0.11.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 +2 -1
- package/dist/client/AuroraApp.d.ts +2 -0
- package/dist/client/AuthProvider-DZqOvceF.mjs +64 -0
- package/dist/client/AuthProvider-DZqOvceF.mjs.map +1 -0
- package/dist/client/ContentHeader-DsuZD8fa.mjs +110 -0
- package/dist/client/ContentHeader-DsuZD8fa.mjs.map +1 -0
- package/dist/client/{DeleteFlavorModal-C3m7bQJu.mjs → DeleteFlavorModal-RnbspW_2.mjs} +135 -135
- package/dist/client/{DeleteFlavorModal-C3m7bQJu.mjs.map → DeleteFlavorModal-RnbspW_2.mjs.map} +1 -1
- package/dist/client/{DeleteVersionsModal-CyYZfB8d.mjs → DeleteVersionsModal-CsBJzXoW.mjs} +57 -57
- package/dist/client/{DeleteVersionsModal-CyYZfB8d.mjs.map → DeleteVersionsModal-CsBJzXoW.mjs.map} +1 -1
- package/dist/client/{EditSecurityGroupModal-DKusxfta.mjs → EditSecurityGroupModal-BPv3d7am.mjs} +15 -15
- package/dist/client/{EditSecurityGroupModal-DKusxfta.mjs.map → EditSecurityGroupModal-BPv3d7am.mjs.map} +1 -1
- package/dist/client/{FiltersInput-GzR4D0q6.mjs → FiltersInput-CViamP59.mjs} +2 -2
- package/dist/client/{FiltersInput-GzR4D0q6.mjs.map → FiltersInput-CViamP59.mjs.map} +1 -1
- package/dist/client/{FloatingIpActionModals-CRvROJ3H.mjs → FloatingIpActionModals-DTn3HFei.mjs} +45 -45
- package/dist/client/{FloatingIpActionModals-CRvROJ3H.mjs.map → FloatingIpActionModals-DTn3HFei.mjs.map} +1 -1
- package/dist/client/{ImageToastNotifications-BuDXpTkl.mjs → ImageToastNotifications-CFKQZTgf.mjs} +261 -261
- package/dist/client/{ImageToastNotifications-BuDXpTkl.mjs.map → ImageToastNotifications-CFKQZTgf.mjs.map} +1 -1
- package/dist/client/{RouteError-DVAiT0mT.mjs → RouteError-BebIhFpQ.mjs} +2 -2
- package/dist/client/{RouteError-DVAiT0mT.mjs.map → RouteError-BebIhFpQ.mjs.map} +1 -1
- package/dist/client/{SortInput-DLcusjGZ.mjs → SortInput-D0Vb864D.mjs} +2 -2
- package/dist/client/{SortInput-DLcusjGZ.mjs.map → SortInput-D0Vb864D.mjs.map} +1 -1
- package/dist/client/{_auth-DXJkv9QO.mjs → _auth-DnImOqR-.mjs} +2 -2
- package/dist/client/_auth-DnImOqR-.mjs.map +1 -0
- package/dist/client/{_flavorId-Dy7EYQum.mjs → _flavorId-C9SZd1jL.mjs} +8 -8
- package/dist/client/{_flavorId-Dy7EYQum.mjs.map → _flavorId-C9SZd1jL.mjs.map} +1 -1
- package/dist/client/{_flavorId-DsD2VTKA.mjs → _flavorId-DINgWoeV.mjs} +38 -38
- package/dist/client/{_flavorId-DsD2VTKA.mjs.map → _flavorId-DINgWoeV.mjs.map} +1 -1
- package/dist/client/{_floatingIpId-j17rCQqG2.mjs → _floatingIpId-BACLbMzi2.mjs} +32 -32
- package/dist/client/{_floatingIpId-j17rCQqG2.mjs.map → _floatingIpId-BACLbMzi2.mjs.map} +1 -1
- package/dist/client/{_floatingIpId-BjVbeNw_.mjs → _floatingIpId-BzVMOv97.mjs} +2 -2
- package/dist/client/{_floatingIpId-BjVbeNw_.mjs.map → _floatingIpId-BzVMOv97.mjs.map} +1 -1
- package/dist/client/_imageId-DCvaU7-S.mjs +534 -0
- package/dist/client/_imageId-DCvaU7-S.mjs.map +1 -0
- package/dist/client/{_pcaId-Bo7yHkNW.mjs → _pcaId-B3PqECyO.mjs} +115 -115
- package/dist/client/{_pcaId-Bo7yHkNW.mjs.map → _pcaId-B3PqECyO.mjs.map} +1 -1
- package/dist/client/{_pcaId-CKkCVC7b.mjs → _pcaId-DAJEt3ZI.mjs} +2 -2
- package/dist/client/{_pcaId-CKkCVC7b.mjs.map → _pcaId-DAJEt3ZI.mjs.map} +1 -1
- package/dist/client/{_projectId-CARHuZTU.mjs → _projectId-B2hG5peP.mjs} +3 -3
- package/dist/client/_projectId-B2hG5peP.mjs.map +1 -0
- package/dist/client/{_projectId-CY8W0IF6.mjs → _projectId-BnWXWTBR.mjs} +3 -3
- package/dist/client/{_projectId-CY8W0IF6.mjs.map → _projectId-BnWXWTBR.mjs.map} +1 -1
- package/dist/client/{_projectId-Dbck_MFa.mjs → _projectId-DRr9rLST.mjs} +66 -66
- package/dist/client/{_projectId-Dbck_MFa.mjs.map → _projectId-DRr9rLST.mjs.map} +1 -1
- package/dist/client/{_projectId-B_2sZKk-.mjs → _projectId-DU8qRiZk.mjs} +2 -2
- package/dist/client/_projectId-DU8qRiZk.mjs.map +1 -0
- package/dist/client/{_securityGroupId-gSEZbBII.mjs → _securityGroupId-Cj9IotMJ.mjs} +2 -2
- package/dist/client/{_securityGroupId-gSEZbBII.mjs.map → _securityGroupId-Cj9IotMJ.mjs.map} +1 -1
- package/dist/client/{_securityGroupId-CkN0CGVg.mjs → _securityGroupId-ClJiFh4R.mjs} +267 -267
- package/dist/client/{_securityGroupId-CkN0CGVg.mjs.map → _securityGroupId-ClJiFh4R.mjs.map} +1 -1
- package/dist/client/_storageType-BrHDa2bD.mjs +3005 -0
- package/dist/client/_storageType-BrHDa2bD.mjs.map +1 -0
- package/dist/client/{_storageType-6k8lUnQo.mjs → _storageType-CSLH93js.mjs} +2 -2
- package/dist/client/{_storageType-6k8lUnQo.mjs.map → _storageType-CSLH93js.mjs.map} +1 -1
- package/dist/client/_storageType-zeSZe--V.mjs.map +1 -1
- package/dist/client/{about-Nsxkyh9U.mjs → about-BnU297yB.mjs} +2 -2
- package/dist/client/about-BnU297yB.mjs.map +1 -0
- package/dist/client/{aurora-DDzsst74.mjs → aurora-6RsAZtnz.mjs} +2 -2
- package/dist/client/aurora-6RsAZtnz.mjs.map +1 -0
- package/dist/client/{build-BdRRmNf5.mjs → build-DF7MTyXG.mjs} +3582 -3114
- package/dist/client/{build-BdRRmNf5.mjs.map → build-DF7MTyXG.mjs.map} +1 -1
- package/dist/client/{constants-PMXUGI4Q.mjs → constants-BskfpGYY.mjs} +16 -16
- package/dist/client/{constants-PMXUGI4Q.mjs.map → constants-BskfpGYY.mjs.map} +1 -1
- package/dist/client/{flavors-p2TKcqP-.mjs → flavors-DAbtRoep.mjs} +151 -151
- package/dist/client/{flavors-p2TKcqP-.mjs.map → flavors-DAbtRoep.mjs.map} +1 -1
- package/dist/client/{flavors-BclEwobO.mjs → flavors-DODudzrA.mjs} +2 -2
- package/dist/client/{flavors-BclEwobO.mjs.map → flavors-DODudzrA.mjs.map} +1 -1
- package/dist/client/flavors-DWMZ6TuJ.mjs.map +1 -1
- package/dist/client/{floatingips-ph0ZxJw8.mjs → floatingips-DJW9ftN_.mjs} +83 -83
- package/dist/client/floatingips-DJW9ftN_.mjs.map +1 -0
- package/dist/client/{hooks-dSArr2Ca.mjs → hooks-CMgoYcDG.mjs} +1 -1
- package/dist/client/{images-CXdghaMW.mjs → images-BbLnuYrL.mjs} +2 -2
- package/dist/client/{images-CXdghaMW.mjs.map → images-BbLnuYrL.mjs.map} +1 -1
- package/dist/client/{images-Dbjo4yKn.mjs → images-C3JyPwer.mjs} +2 -2
- package/dist/client/images-C3JyPwer.mjs.map +1 -0
- package/dist/client/{images-BblnyWJq.mjs → images-Cp6V1nF5.mjs} +455 -455
- package/dist/client/{images-BblnyWJq.mjs.map → images-Cp6V1nF5.mjs.map} +1 -1
- package/dist/client/images-NBf2bV43.mjs.map +1 -1
- package/dist/client/index.js +257 -257
- package/dist/client/index.js.map +1 -1
- package/dist/client/network-DuZm76BZ.mjs.map +1 -1
- package/dist/client/{objects-B9Jh3SMG.mjs → objects-Bw96WXOs.mjs} +2 -2
- package/dist/client/{objects-B9Jh3SMG.mjs.map → objects-Bw96WXOs.mjs.map} +1 -1
- package/dist/client/{objects-Bw25cE1m.mjs → objects-DUmK3WgA.mjs} +1458 -1430
- package/dist/client/objects-DUmK3WgA.mjs.map +1 -0
- package/dist/client/objects-o2Cj_ndZ.mjs.map +1 -1
- package/dist/client/{pca-DUrQ_tIg.mjs → pca-DKeGzbww.mjs} +2 -2
- package/dist/client/{pca-DUrQ_tIg.mjs.map → pca-DKeGzbww.mjs.map} +1 -1
- package/dist/client/{pca-CiLPHmK7.mjs → pca-Dc_tdh4-.mjs} +47 -47
- package/dist/client/{pca-CiLPHmK7.mjs.map → pca-Dc_tdh4-.mjs.map} +1 -1
- package/dist/client/{projects-DNd3UTas.mjs → projects-CRL37ftA.mjs} +16 -16
- package/dist/client/{projects-DNd3UTas.mjs.map → projects-CRL37ftA.mjs.map} +1 -1
- package/dist/client/{projects-B5topuei.mjs → projects-DUWOgB3m.mjs} +2 -2
- package/dist/client/{projects-B5topuei.mjs.map → projects-DUWOgB3m.mjs.map} +1 -1
- package/dist/client/{projects-CHYn7L5e.mjs → projects-DpXQYfKc.mjs} +2 -2
- package/dist/client/projects-DpXQYfKc.mjs.map +1 -0
- package/dist/client/{securitygroups-CcA2TpAt.mjs → securitygroups-CWWFSjjj.mjs} +94 -94
- package/dist/client/securitygroups-CWWFSjjj.mjs.map +1 -0
- package/dist/client/{useListWithFiltering-CVzhMyEA.mjs → useListWithFiltering-C9k7xWqz.mjs} +7 -7
- package/dist/client/{useListWithFiltering-CVzhMyEA.mjs.map → useListWithFiltering-C9k7xWqz.mjs.map} +1 -1
- package/dist/server/index.js +697 -406
- package/package.json +3 -3
- package/dist/client/AuthProvider-Co4d0WzB.mjs +0 -100
- package/dist/client/AuthProvider-Co4d0WzB.mjs.map +0 -1
- package/dist/client/ContentHeader-D4jlOG-9.mjs +0 -96
- package/dist/client/ContentHeader-D4jlOG-9.mjs.map +0 -1
- package/dist/client/_auth-DXJkv9QO.mjs.map +0 -1
- package/dist/client/_imageId-BjfhqAje.mjs +0 -534
- package/dist/client/_imageId-BjfhqAje.mjs.map +0 -1
- package/dist/client/_projectId-B_2sZKk-.mjs.map +0 -1
- package/dist/client/_projectId-CARHuZTU.mjs.map +0 -1
- package/dist/client/_storageType-CLTxXjQZ.mjs +0 -3048
- package/dist/client/_storageType-CLTxXjQZ.mjs.map +0 -1
- package/dist/client/about-Nsxkyh9U.mjs.map +0 -1
- package/dist/client/aurora-DDzsst74.mjs.map +0 -1
- package/dist/client/floatingips-ph0ZxJw8.mjs.map +0 -1
- package/dist/client/images-Dbjo4yKn.mjs.map +0 -1
- package/dist/client/objects-Bw25cE1m.mjs.map +0 -1
- package/dist/client/projects-CHYn7L5e.mjs.map +0 -1
- package/dist/client/securitygroups-CcA2TpAt.mjs.map +0 -1
package/dist/client/{DeleteVersionsModal-CyYZfB8d.mjs.map → DeleteVersionsModal-CsBJzXoW.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeleteVersionsModal-CyYZfB8d.mjs","names":["useEffect","trpcReact","Modal","Stack","Spinner","Message","useProjectId","DeleteBucketPolicyModal","isOpen","bucketName","onClose","onSuccess","onError","useLingui","projectId","utils","useUtils","data","policyData","isLoading","isPolicyLoading","error","policyError","storage","ceph","bucketPolicy","get","useQuery","project_id","enabled","retry","deleteMutation","delete","useMutation","invalidate","name","handleClose","message","reset","handleDelete","mutate","hasPolicy","policy","isDeleting","isPending","title","t","open","onCancel","confirmButtonLabel","confirmButtonVariant","onConfirm","cancelButtonLabel","size","disableConfirmButton","direction","gap","div","className","variant","p","strong","isError","useState","trpcReact","Modal","TextInput","Stack","Checkbox","useProjectId","EmptyBucketModal","isOpen","bucket","onClose","onSuccess","onError","useLingui","projectId","confirmName","setConfirmName","nameError","setNameError","deleteVersionsAndMarkers","setDeleteVersionsAndMarkers","utils","useUtils","emptyBucketMutation","storage","ceph","objects","deleteAll","useMutation","onSettled","containers","list","invalidate","handleClose","reset","handleConfirmNameChange","e","value","target","handleSubmit","trim","name","t","bucketName","mutate","project_id","containerName","includeVersionsAndDeleteMarkers","deletedCount","error","message","handleKeyDown","key","title","open","onCancel","confirmButtonLabel","confirmButtonVariant","onConfirm","cancelButtonLabel","size","disableConfirmButton","isPending","direction","gap","p","className","checked","onChange","label","disabled","required","onKeyDown","invalid","errortext","undefined","placeholder","autoFocus","useState","useEffect","trpcReact","Modal","ModalFooter","ButtonRow","TextInput","Stack","Spinner","Button","useProjectId","DeleteBucketModal","isOpen","bucket","onClose","onSuccess","onError","useLingui","projectId","confirmName","setConfirmName","nameError","setNameError","utils","useUtils","data","objects","isLoading","isLoadingObjects","error","objectsError","storage","ceph","list","useQuery","project_id","containerName","name","maxKeys","delimiter","showVersions","enabled","deleteBucketMutation","containers","delete","useMutation","onSettled","invalidate","reset","handleClose","handleConfirmNameChange","e","value","target","handleSubmit","trim","t","bucketName","mutate","message","handleKeyDown","key","currentObjectCount","length","versionCount","versions","isNonEmpty","hasOnlyVersions","errorMessage","title","open","onCancel","confirmButtonLabel","undefined","confirmButtonVariant","onConfirm","cancelButtonLabel","modalFooter","className","variant","onClick","data-testid","size","disableConfirmButton","isPending","direction","gap","p","role","aria-live","alignment","span","strong","label","required","onChange","onKeyDown","invalid","errortext","disabled","placeholder","useState","trpcReact","Modal","TextInput","Stack","useProjectId","DeleteVersionsModal","isOpen","bucket","onClose","onSuccess","onError","useLingui","projectId","confirmName","setConfirmName","nameError","setNameError","utils","useUtils","deleteVersionsMutation","storage","ceph","objects","deleteAll","useMutation","onSettled","containers","list","invalidate","handleClose","reset","handleConfirmNameChange","e","value","target","handleSubmit","trim","name","t","bucketName","mutate","project_id","containerName","includeVersionsAndDeleteMarkers","deletedCount","error","message","handleKeyDown","key","title","open","onCancel","confirmButtonLabel","confirmButtonVariant","onConfirm","cancelButtonLabel","size","disableConfirmButton","isPending","direction","gap","p","className","label","required","onChange","onKeyDown","invalid","errortext","undefined","disabled","placeholder","autoFocus"],"sources":["../../src/client/routes/_auth/projects/$projectId/storage/-components/Ceph/Buckets/DeleteBucketPolicyModal.tsx","../../src/client/routes/_auth/projects/$projectId/storage/-components/Ceph/Buckets/EmptyBucketModal.tsx","../../src/client/routes/_auth/projects/$projectId/storage/-components/Ceph/Buckets/DeleteBucketModal.tsx","../../src/client/routes/_auth/projects/$projectId/storage/-components/Ceph/Buckets/DeleteVersionsModal.tsx"],"sourcesContent":["import { useEffect } from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { Modal, Stack, Spinner, Message } from \"@cloudoperators/juno-ui-components\"\nimport { useProjectId } from \"@/client/hooks/useProjectId\"\n\ninterface DeleteBucketPolicyModalProps {\n isOpen: boolean\n bucketName: string\n onClose: () => void\n onSuccess?: (bucketName: string) => void\n onError?: (bucketName: string, errorMessage: string) => void\n}\n\nexport const DeleteBucketPolicyModal = ({\n isOpen,\n bucketName,\n onClose,\n onSuccess,\n onError,\n}: DeleteBucketPolicyModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n // Query to verify policy exists\n const {\n data: policyData,\n isLoading: isPolicyLoading,\n error: policyError,\n } = trpcReact.storage.ceph.bucketPolicy.get.useQuery(\n {\n project_id: projectId,\n bucketName,\n },\n {\n enabled: isOpen && !!projectId,\n retry: false,\n }\n )\n\n // Delete mutation\n const deleteMutation = trpcReact.storage.ceph.bucketPolicy.delete.useMutation({\n onSuccess: () => {\n utils.storage.ceph.bucketPolicy.get.invalidate()\n const name = bucketName\n onSuccess?.(name)\n handleClose()\n },\n onError: (error) => {\n const name = bucketName\n onError?.(name, error.message)\n },\n })\n\n useEffect(() => {\n if (!isOpen) {\n deleteMutation.reset()\n }\n }, [isOpen, bucketName])\n\n const handleClose = () => {\n deleteMutation.reset()\n onClose()\n }\n\n const handleDelete = () => {\n deleteMutation.mutate({\n project_id: projectId,\n bucketName,\n })\n }\n\n if (!isOpen) return null\n\n const hasPolicy = !!policyData?.policy\n const isDeleting = deleteMutation.isPending\n\n return (\n <Modal\n title={t`Delete Bucket Policy`}\n open={isOpen}\n onCancel={handleClose}\n confirmButtonLabel={t`Delete Policy`}\n confirmButtonVariant=\"primary-danger\"\n onConfirm={handleDelete}\n cancelButtonLabel={t`Cancel`}\n size=\"small\"\n disableConfirmButton={isDeleting || isPolicyLoading || !hasPolicy || !!policyError}\n >\n <Stack direction=\"vertical\" gap=\"4\">\n {isPolicyLoading && (\n <div className=\"flex items-center justify-center py-4\">\n <Spinner variant=\"primary\" size=\"large\" />\n </div>\n )}\n\n {policyError && (\n <Message variant=\"error\" title={t`Failed to load policy`}>\n {policyError.message}\n </Message>\n )}\n\n {!isPolicyLoading && !policyError && !hasPolicy && (\n <Message variant=\"warning\" title={t`No policy found`}>\n <Trans>This bucket does not have a policy attached.</Trans>\n </Message>\n )}\n\n {!isPolicyLoading && !policyError && hasPolicy && (\n <>\n <p className=\"text-theme-default\">\n <Trans>\n Are you sure you want to delete the policy for bucket <strong>{bucketName}</strong>?\n </Trans>\n </p>\n <p className=\"text-theme-default\">\n <Trans>\n Deleting the policy will remove all access restrictions defined by it. This action cannot be undone.\n </Trans>\n </p>\n </>\n )}\n\n {deleteMutation.isError && (\n <Message variant=\"error\" title={t`Failed to delete policy`}>\n {deleteMutation.error?.message}\n </Message>\n )}\n </Stack>\n </Modal>\n )\n}\n","import { useState } from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { Modal, TextInput, Stack, Checkbox } from \"@cloudoperators/juno-ui-components\"\nimport { Bucket } from \"@/server/Storage/types/ceph\"\nimport { useProjectId } from \"@/client/hooks/useProjectId\"\n\ninterface EmptyBucketModalProps {\n isOpen: boolean\n bucket: Bucket | null\n onClose: () => void\n onSuccess?: (bucketName: string, deletedCount: number) => void\n onError?: (bucketName: string, errorMessage: string) => void\n}\n\nexport const EmptyBucketModal = ({ isOpen, bucket, onClose, onSuccess, onError }: EmptyBucketModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const [confirmName, setConfirmName] = useState(\"\")\n const [nameError, setNameError] = useState<string | null>(null)\n const [deleteVersionsAndMarkers, setDeleteVersionsAndMarkers] = useState(false)\n\n const utils = trpcReact.useUtils()\n\n const emptyBucketMutation = trpcReact.storage.ceph.objects.deleteAll.useMutation({\n onSettled: () => {\n // Invalidate both containers.list (to update bucket metadata) and objects.list (to refresh empty state)\n utils.storage.ceph.containers.list.invalidate()\n utils.storage.ceph.objects.list.invalidate()\n handleClose()\n },\n })\n\n const handleClose = () => {\n setConfirmName(\"\")\n setNameError(null)\n setDeleteVersionsAndMarkers(false)\n emptyBucketMutation.reset()\n onClose()\n }\n\n const handleConfirmNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setConfirmName(value)\n if (nameError) setNameError(null)\n }\n\n const handleSubmit = () => {\n if (!bucket) return\n if (confirmName.trim() !== bucket.name) {\n setNameError(t`Bucket name does not match`)\n return\n }\n\n // Capture bucket name before async operation to avoid dereferencing null bucket in callbacks\n const bucketName = bucket.name\n\n emptyBucketMutation.mutate(\n {\n project_id: projectId,\n containerName: bucketName,\n includeVersionsAndDeleteMarkers: deleteVersionsAndMarkers,\n },\n {\n onSuccess: (deletedCount) => {\n onSuccess?.(bucketName, deletedCount)\n },\n onError: (error) => {\n onError?.(bucketName, error.message)\n },\n }\n )\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") handleSubmit()\n }\n\n if (!isOpen || !bucket) return null\n\n const bucketName = bucket.name\n\n return (\n <Modal\n title={t`Empty Bucket`}\n open={isOpen}\n onCancel={handleClose}\n confirmButtonLabel={t`Empty Bucket`}\n confirmButtonVariant=\"primary-danger\"\n onConfirm={handleSubmit}\n cancelButtonLabel={t`Cancel`}\n size=\"small\"\n disableConfirmButton={emptyBucketMutation.isPending || confirmName.trim() !== bucket.name}\n >\n <Stack direction=\"vertical\" gap=\"6\">\n <p className=\"text-theme-default m-0\">\n <Trans>\n This action will permanently delete all objects from {bucketName}. You may choose to also delete all\n versions and delete markers. This will enable you to delete the bucket. This action cannot be undone.\n </Trans>\n </p>\n\n <Checkbox\n checked={deleteVersionsAndMarkers}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setDeleteVersionsAndMarkers(e.target.checked)}\n label={t`Also delete all versions and all delete markers`}\n disabled={emptyBucketMutation.isPending}\n />\n\n <TextInput\n label={t`Type the bucket name to confirm`}\n required\n value={confirmName}\n onChange={handleConfirmNameChange}\n onKeyDown={handleKeyDown}\n invalid={!!nameError}\n errortext={nameError || undefined}\n disabled={emptyBucketMutation.isPending}\n placeholder={bucket.name}\n autoFocus\n />\n </Stack>\n </Modal>\n )\n}\n","import { useState, useEffect } from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { Modal, ModalFooter, ButtonRow, TextInput, Stack, Spinner, Button } from \"@cloudoperators/juno-ui-components\"\nimport type { Bucket } from \"@/server/Storage/types/ceph\"\nimport { useProjectId } from \"@/client/hooks/useProjectId\"\n\ninterface DeleteBucketModalProps {\n isOpen: boolean\n bucket: Bucket | null\n onClose: () => void\n onSuccess?: (bucketName: string) => void\n onError?: (bucketName: string, errorMessage: string) => void\n}\n\nexport const DeleteBucketModal = ({ isOpen, bucket, onClose, onSuccess, onError }: DeleteBucketModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const [confirmName, setConfirmName] = useState(\"\")\n const [nameError, setNameError] = useState<string | null>(null)\n\n const utils = trpcReact.useUtils()\n\n // Fetch actual objects and versions to get accurate real-time state\n // Use showVersions=true to also detect delete markers in versioned buckets\n // Use delimiter=\"\" to get ALL objects including folder markers (zero-byte objects ending in \"/\")\n // Without this, folders are returned as CommonPrefixes and we can't accurately check if bucket is empty\n const {\n data: objects,\n isLoading: isLoadingObjects,\n error: objectsError,\n } = trpcReact.storage.ceph.objects.list.useQuery(\n { project_id: projectId ?? \"\", containerName: bucket?.name ?? \"\", maxKeys: 1, delimiter: \"\", showVersions: true },\n { enabled: isOpen && bucket !== null }\n )\n\n const deleteBucketMutation = trpcReact.storage.ceph.containers.delete.useMutation({\n onSettled: () => {\n utils.storage.ceph.containers.list.invalidate()\n },\n })\n\n useEffect(() => {\n if (!isOpen) {\n setConfirmName(\"\")\n setNameError(null)\n deleteBucketMutation.reset()\n }\n }, [isOpen, bucket?.name])\n\n const handleClose = () => {\n setConfirmName(\"\")\n setNameError(null)\n deleteBucketMutation.reset()\n onClose()\n }\n\n const handleConfirmNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setConfirmName(value)\n if (nameError) setNameError(null)\n }\n\n const handleSubmit = () => {\n if (!bucket) return\n if (objectsError) return\n if (confirmName.trim() !== bucket.name) {\n setNameError(t`Bucket name does not match`)\n return\n }\n\n // Capture bucket name before async operation to avoid dereferencing null bucket in callbacks\n const bucketName = bucket.name\n\n deleteBucketMutation.mutate(\n { project_id: projectId, bucketName },\n {\n onSuccess: () => {\n handleClose()\n onSuccess?.(bucketName)\n },\n onError: (error) => {\n handleClose()\n onError?.(bucketName, error.message)\n },\n }\n )\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") handleSubmit()\n }\n\n if (!isOpen || !bucket) return null\n\n // Check if bucket has current objects (not just versions/delete markers)\n // When delimiter=\"\", folders are returned as objects (keys ending in \"/\")\n const currentObjectCount = objects?.objects?.length ?? 0\n const versionCount = objects?.versions?.length ?? 0\n\n // Bucket is non-empty if it has current objects\n // If it only has versions/delete markers (no current objects), it's considered \"empty\" for deletion purposes\n const isNonEmpty = currentObjectCount > 0\n const hasOnlyVersions = currentObjectCount === 0 && versionCount > 0\n const errorMessage = objectsError?.message\n\n return (\n <Modal\n title={t`Delete Bucket`}\n open={isOpen}\n onCancel={handleClose}\n confirmButtonLabel={isNonEmpty || hasOnlyVersions ? undefined : t`Delete Bucket`}\n confirmButtonVariant={isNonEmpty || hasOnlyVersions ? undefined : \"primary-danger\"}\n onConfirm={isNonEmpty || hasOnlyVersions ? undefined : handleSubmit}\n cancelButtonLabel={isNonEmpty || hasOnlyVersions ? undefined : t`Cancel`}\n modalFooter={\n isNonEmpty || hasOnlyVersions ? (\n <ModalFooter className=\"flex justify-end\">\n <ButtonRow>\n <Button variant=\"primary\" onClick={handleClose} data-testid=\"delete-has-objects-close-button\">\n <Trans>Close</Trans>\n </Button>\n </ButtonRow>\n </ModalFooter>\n ) : undefined\n }\n size=\"small\"\n disableConfirmButton={\n deleteBucketMutation.isPending || isLoadingObjects || !!objectsError || confirmName.trim() !== bucket.name\n }\n >\n <Stack direction=\"vertical\" gap=\"6\">\n {objectsError && (\n <p className=\"text-theme-error\" role=\"alert\" aria-live=\"assertive\">\n <Trans>Failed to check bucket contents: {errorMessage}</Trans>\n </p>\n )}\n\n {isLoadingObjects ? (\n <Stack direction=\"horizontal\" gap=\"2\" alignment=\"center\">\n <Spinner />\n <span className=\"text-juno-grey-light-1 text-sm\">\n <Trans>Checking bucket contents...</Trans>\n </span>\n </Stack>\n ) : isNonEmpty ? (\n <p className=\"text-theme-default\">\n <Trans>\n This bucket contains objects and cannot be deleted. Use <strong>Empty Bucket</strong> action to remove all\n content first.\n </Trans>\n </p>\n ) : hasOnlyVersions ? (\n <p className=\"text-theme-default\">\n <Trans>\n This bucket contains old versions and delete markers. Use <strong>Delete Versions</strong> action to\n remove them before deleting the bucket.\n </Trans>\n </p>\n ) : (\n <>\n <p className=\"text-theme-default\">\n <Trans>\n This action is irreversible. Deleting a bucket permanently removes it and cannot be undone. The bucket\n must be empty before deletion.\n </Trans>\n </p>\n\n <TextInput\n label={t`Type the bucket name to confirm`}\n required\n value={confirmName}\n onChange={handleConfirmNameChange}\n onKeyDown={handleKeyDown}\n invalid={!!nameError}\n errortext={nameError || undefined}\n disabled={deleteBucketMutation.isPending}\n placeholder={bucket.name}\n />\n </>\n )}\n </Stack>\n </Modal>\n )\n}\n","import { useState } from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { Modal, TextInput, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { Bucket } from \"@/server/Storage/types/ceph\"\nimport { useProjectId } from \"@/client/hooks/useProjectId\"\n\ninterface DeleteVersionsModalProps {\n isOpen: boolean\n bucket: Bucket | null\n onClose: () => void\n onSuccess?: (bucketName: string, deletedCount: number) => void\n onError?: (bucketName: string, errorMessage: string) => void\n}\n\nexport const DeleteVersionsModal = ({ isOpen, bucket, onClose, onSuccess, onError }: DeleteVersionsModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const [confirmName, setConfirmName] = useState(\"\")\n const [nameError, setNameError] = useState<string | null>(null)\n\n const utils = trpcReact.useUtils()\n\n const deleteVersionsMutation = trpcReact.storage.ceph.objects.deleteAll.useMutation({\n onSettled: () => {\n // Invalidate both containers.list (to update bucket metadata) and objects.list (to refresh empty state)\n utils.storage.ceph.containers.list.invalidate()\n utils.storage.ceph.objects.list.invalidate()\n handleClose()\n },\n })\n\n const handleClose = () => {\n setConfirmName(\"\")\n setNameError(null)\n deleteVersionsMutation.reset()\n onClose()\n }\n\n const handleConfirmNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setConfirmName(value)\n if (nameError) setNameError(null)\n }\n\n const handleSubmit = () => {\n if (!bucket) return\n if (confirmName.trim() !== bucket.name) {\n setNameError(t`Bucket name does not match`)\n return\n }\n\n // Capture bucket name before async operation to avoid dereferencing null bucket in callbacks\n const bucketName = bucket.name\n\n // Always delete all versions and delete markers (includeVersionsAndDeleteMarkers: true)\n deleteVersionsMutation.mutate(\n {\n project_id: projectId,\n containerName: bucketName,\n includeVersionsAndDeleteMarkers: true,\n },\n {\n onSuccess: (deletedCount) => {\n onSuccess?.(bucketName, deletedCount)\n },\n onError: (error) => {\n onError?.(bucketName, error.message)\n },\n }\n )\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") handleSubmit()\n }\n\n if (!isOpen || !bucket) return null\n\n return (\n <Modal\n title={t`Delete Versions`}\n open={isOpen}\n onCancel={handleClose}\n confirmButtonLabel={t`Delete Versions`}\n confirmButtonVariant=\"primary-danger\"\n onConfirm={handleSubmit}\n cancelButtonLabel={t`Cancel`}\n size=\"small\"\n disableConfirmButton={deleteVersionsMutation.isPending || confirmName.trim() !== bucket.name}\n >\n <Stack direction=\"vertical\" gap=\"6\">\n <p className=\"text-theme-default m-0\">\n <Trans>\n This action will permanently delete all versions and delete markers. This will enable you to delete the\n bucket. This action cannot be undone.\n </Trans>\n </p>\n\n <TextInput\n label={t`Type the bucket name to confirm`}\n required\n value={confirmName}\n onChange={handleConfirmNameChange}\n onKeyDown={handleKeyDown}\n invalid={!!nameError}\n errortext={nameError || undefined}\n disabled={deleteVersionsMutation.isPending}\n placeholder={bucket.name}\n autoFocus\n />\n </Stack>\n </Modal>\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DeleteVersionsModal-CsBJzXoW.mjs","names":["useEffect","trpcReact","Modal","Stack","Spinner","Message","useProjectId","DeleteBucketPolicyModal","isOpen","bucketName","onClose","onSuccess","onError","useLingui","projectId","utils","useUtils","data","policyData","isLoading","isPolicyLoading","error","policyError","storage","ceph","bucketPolicy","get","useQuery","project_id","enabled","retry","deleteMutation","delete","useMutation","invalidate","name","handleClose","message","reset","handleDelete","mutate","hasPolicy","policy","isDeleting","isPending","title","t","open","onCancel","confirmButtonLabel","confirmButtonVariant","onConfirm","cancelButtonLabel","size","disableConfirmButton","direction","gap","div","className","variant","p","strong","isError","useState","trpcReact","Modal","TextInput","Stack","Checkbox","useProjectId","EmptyBucketModal","isOpen","bucket","onClose","onSuccess","onError","useLingui","projectId","confirmName","setConfirmName","nameError","setNameError","deleteVersionsAndMarkers","setDeleteVersionsAndMarkers","utils","useUtils","emptyBucketMutation","storage","ceph","objects","deleteAll","useMutation","onSettled","containers","list","invalidate","handleClose","reset","handleConfirmNameChange","e","value","target","handleSubmit","trim","name","t","bucketName","mutate","project_id","containerName","includeVersionsAndDeleteMarkers","deletedCount","error","message","handleKeyDown","key","title","open","onCancel","confirmButtonLabel","confirmButtonVariant","onConfirm","cancelButtonLabel","size","disableConfirmButton","isPending","direction","gap","p","className","checked","onChange","label","disabled","required","onKeyDown","invalid","errortext","undefined","placeholder","autoFocus","useState","useEffect","trpcReact","Modal","ModalFooter","ButtonRow","TextInput","Stack","Spinner","Button","useProjectId","DeleteBucketModal","isOpen","bucket","onClose","onSuccess","onError","useLingui","projectId","confirmName","setConfirmName","nameError","setNameError","utils","useUtils","data","objects","isLoading","isLoadingObjects","error","objectsError","storage","ceph","list","useQuery","project_id","containerName","name","maxKeys","delimiter","showVersions","enabled","deleteBucketMutation","containers","delete","useMutation","onSettled","invalidate","reset","handleClose","handleConfirmNameChange","e","value","target","handleSubmit","trim","t","bucketName","mutate","message","handleKeyDown","key","currentObjectCount","length","versionCount","versions","isNonEmpty","hasOnlyVersions","errorMessage","title","open","onCancel","confirmButtonLabel","undefined","confirmButtonVariant","onConfirm","cancelButtonLabel","modalFooter","className","variant","onClick","data-testid","size","disableConfirmButton","isPending","direction","gap","p","role","aria-live","alignment","span","strong","label","required","onChange","onKeyDown","invalid","errortext","disabled","placeholder","useState","trpcReact","Modal","TextInput","Stack","useProjectId","DeleteVersionsModal","isOpen","bucket","onClose","onSuccess","onError","useLingui","projectId","confirmName","setConfirmName","nameError","setNameError","utils","useUtils","deleteVersionsMutation","storage","ceph","objects","deleteAll","useMutation","onSettled","containers","list","invalidate","handleClose","reset","handleConfirmNameChange","e","value","target","handleSubmit","trim","name","t","bucketName","mutate","project_id","containerName","includeVersionsAndDeleteMarkers","deletedCount","error","message","handleKeyDown","key","title","open","onCancel","confirmButtonLabel","confirmButtonVariant","onConfirm","cancelButtonLabel","size","disableConfirmButton","isPending","direction","gap","p","className","label","required","onChange","onKeyDown","invalid","errortext","undefined","disabled","placeholder","autoFocus"],"sources":["../../src/client/routes/_auth/projects/$projectId/storage/-components/Ceph/Buckets/DeleteBucketPolicyModal.tsx","../../src/client/routes/_auth/projects/$projectId/storage/-components/Ceph/Buckets/EmptyBucketModal.tsx","../../src/client/routes/_auth/projects/$projectId/storage/-components/Ceph/Buckets/DeleteBucketModal.tsx","../../src/client/routes/_auth/projects/$projectId/storage/-components/Ceph/Buckets/DeleteVersionsModal.tsx"],"sourcesContent":["import { useEffect } from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { Modal, Stack, Spinner, Message } from \"@cloudoperators/juno-ui-components\"\nimport { useProjectId } from \"@/client/hooks/useProjectId\"\n\ninterface DeleteBucketPolicyModalProps {\n isOpen: boolean\n bucketName: string\n onClose: () => void\n onSuccess?: (bucketName: string) => void\n onError?: (bucketName: string, errorMessage: string) => void\n}\n\nexport const DeleteBucketPolicyModal = ({\n isOpen,\n bucketName,\n onClose,\n onSuccess,\n onError,\n}: DeleteBucketPolicyModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const utils = trpcReact.useUtils()\n\n // Query to verify policy exists\n const {\n data: policyData,\n isLoading: isPolicyLoading,\n error: policyError,\n } = trpcReact.storage.ceph.bucketPolicy.get.useQuery(\n {\n project_id: projectId,\n bucketName,\n },\n {\n enabled: isOpen && !!projectId,\n retry: false,\n }\n )\n\n // Delete mutation\n const deleteMutation = trpcReact.storage.ceph.bucketPolicy.delete.useMutation({\n onSuccess: () => {\n utils.storage.ceph.bucketPolicy.get.invalidate()\n const name = bucketName\n onSuccess?.(name)\n handleClose()\n },\n onError: (error) => {\n const name = bucketName\n onError?.(name, error.message)\n },\n })\n\n useEffect(() => {\n if (!isOpen) {\n deleteMutation.reset()\n }\n }, [isOpen, bucketName])\n\n const handleClose = () => {\n deleteMutation.reset()\n onClose()\n }\n\n const handleDelete = () => {\n deleteMutation.mutate({\n project_id: projectId,\n bucketName,\n })\n }\n\n if (!isOpen) return null\n\n const hasPolicy = !!policyData?.policy\n const isDeleting = deleteMutation.isPending\n\n return (\n <Modal\n title={t`Delete Bucket Policy`}\n open={isOpen}\n onCancel={handleClose}\n confirmButtonLabel={t`Delete Policy`}\n confirmButtonVariant=\"primary-danger\"\n onConfirm={handleDelete}\n cancelButtonLabel={t`Cancel`}\n size=\"small\"\n disableConfirmButton={isDeleting || isPolicyLoading || !hasPolicy || !!policyError}\n >\n <Stack direction=\"vertical\" gap=\"4\">\n {isPolicyLoading && (\n <div className=\"flex items-center justify-center py-4\">\n <Spinner variant=\"primary\" size=\"large\" />\n </div>\n )}\n\n {policyError && (\n <Message variant=\"error\" title={t`Failed to load policy`}>\n {policyError.message}\n </Message>\n )}\n\n {!isPolicyLoading && !policyError && !hasPolicy && (\n <Message variant=\"warning\" title={t`No policy found`}>\n <Trans>This bucket does not have a policy attached.</Trans>\n </Message>\n )}\n\n {!isPolicyLoading && !policyError && hasPolicy && (\n <>\n <p className=\"text-theme-default\">\n <Trans>\n Are you sure you want to delete the policy for bucket <strong>{bucketName}</strong>?\n </Trans>\n </p>\n <p className=\"text-theme-default\">\n <Trans>\n Deleting the policy will remove all access restrictions defined by it. This action cannot be undone.\n </Trans>\n </p>\n </>\n )}\n\n {deleteMutation.isError && (\n <Message variant=\"error\" title={t`Failed to delete policy`}>\n {deleteMutation.error?.message}\n </Message>\n )}\n </Stack>\n </Modal>\n )\n}\n","import { useState } from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { Modal, TextInput, Stack, Checkbox } from \"@cloudoperators/juno-ui-components\"\nimport { Bucket } from \"@/server/Storage/types/ceph\"\nimport { useProjectId } from \"@/client/hooks/useProjectId\"\n\ninterface EmptyBucketModalProps {\n isOpen: boolean\n bucket: Bucket | null\n onClose: () => void\n onSuccess?: (bucketName: string, deletedCount: number) => void\n onError?: (bucketName: string, errorMessage: string) => void\n}\n\nexport const EmptyBucketModal = ({ isOpen, bucket, onClose, onSuccess, onError }: EmptyBucketModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const [confirmName, setConfirmName] = useState(\"\")\n const [nameError, setNameError] = useState<string | null>(null)\n const [deleteVersionsAndMarkers, setDeleteVersionsAndMarkers] = useState(false)\n\n const utils = trpcReact.useUtils()\n\n const emptyBucketMutation = trpcReact.storage.ceph.objects.deleteAll.useMutation({\n onSettled: () => {\n // Invalidate both containers.list (to update bucket metadata) and objects.list (to refresh empty state)\n utils.storage.ceph.containers.list.invalidate()\n utils.storage.ceph.objects.list.invalidate()\n handleClose()\n },\n })\n\n const handleClose = () => {\n setConfirmName(\"\")\n setNameError(null)\n setDeleteVersionsAndMarkers(false)\n emptyBucketMutation.reset()\n onClose()\n }\n\n const handleConfirmNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setConfirmName(value)\n if (nameError) setNameError(null)\n }\n\n const handleSubmit = () => {\n if (!bucket) return\n if (confirmName.trim() !== bucket.name) {\n setNameError(t`Bucket name does not match`)\n return\n }\n\n // Capture bucket name before async operation to avoid dereferencing null bucket in callbacks\n const bucketName = bucket.name\n\n emptyBucketMutation.mutate(\n {\n project_id: projectId,\n containerName: bucketName,\n includeVersionsAndDeleteMarkers: deleteVersionsAndMarkers,\n },\n {\n onSuccess: (deletedCount) => {\n onSuccess?.(bucketName, deletedCount)\n },\n onError: (error) => {\n onError?.(bucketName, error.message)\n },\n }\n )\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") handleSubmit()\n }\n\n if (!isOpen || !bucket) return null\n\n const bucketName = bucket.name\n\n return (\n <Modal\n title={t`Empty Bucket`}\n open={isOpen}\n onCancel={handleClose}\n confirmButtonLabel={t`Empty Bucket`}\n confirmButtonVariant=\"primary-danger\"\n onConfirm={handleSubmit}\n cancelButtonLabel={t`Cancel`}\n size=\"small\"\n disableConfirmButton={emptyBucketMutation.isPending || confirmName.trim() !== bucket.name}\n >\n <Stack direction=\"vertical\" gap=\"6\">\n <p className=\"text-theme-default m-0\">\n <Trans>\n This action will permanently delete all objects from {bucketName}. You may choose to also delete all\n versions and delete markers. This will enable you to delete the bucket. This action cannot be undone.\n </Trans>\n </p>\n\n <Checkbox\n checked={deleteVersionsAndMarkers}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setDeleteVersionsAndMarkers(e.target.checked)}\n label={t`Also delete all versions and all delete markers`}\n disabled={emptyBucketMutation.isPending}\n />\n\n <TextInput\n label={t`Type the bucket name to confirm`}\n required\n value={confirmName}\n onChange={handleConfirmNameChange}\n onKeyDown={handleKeyDown}\n invalid={!!nameError}\n errortext={nameError || undefined}\n disabled={emptyBucketMutation.isPending}\n placeholder={bucket.name}\n autoFocus\n />\n </Stack>\n </Modal>\n )\n}\n","import { useState, useEffect } from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { Modal, ModalFooter, ButtonRow, TextInput, Stack, Spinner, Button } from \"@cloudoperators/juno-ui-components\"\nimport type { Bucket } from \"@/server/Storage/types/ceph\"\nimport { useProjectId } from \"@/client/hooks/useProjectId\"\n\ninterface DeleteBucketModalProps {\n isOpen: boolean\n bucket: Bucket | null\n onClose: () => void\n onSuccess?: (bucketName: string) => void\n onError?: (bucketName: string, errorMessage: string) => void\n}\n\nexport const DeleteBucketModal = ({ isOpen, bucket, onClose, onSuccess, onError }: DeleteBucketModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const [confirmName, setConfirmName] = useState(\"\")\n const [nameError, setNameError] = useState<string | null>(null)\n\n const utils = trpcReact.useUtils()\n\n // Fetch actual objects and versions to get accurate real-time state\n // Use showVersions=true to also detect delete markers in versioned buckets\n // Use delimiter=\"\" to get ALL objects including folder markers (zero-byte objects ending in \"/\")\n // Without this, folders are returned as CommonPrefixes and we can't accurately check if bucket is empty\n const {\n data: objects,\n isLoading: isLoadingObjects,\n error: objectsError,\n } = trpcReact.storage.ceph.objects.list.useQuery(\n { project_id: projectId ?? \"\", containerName: bucket?.name ?? \"\", maxKeys: 1, delimiter: \"\", showVersions: true },\n { enabled: isOpen && bucket !== null }\n )\n\n const deleteBucketMutation = trpcReact.storage.ceph.containers.delete.useMutation({\n onSettled: () => {\n utils.storage.ceph.containers.list.invalidate()\n },\n })\n\n useEffect(() => {\n if (!isOpen) {\n setConfirmName(\"\")\n setNameError(null)\n deleteBucketMutation.reset()\n }\n }, [isOpen, bucket?.name])\n\n const handleClose = () => {\n setConfirmName(\"\")\n setNameError(null)\n deleteBucketMutation.reset()\n onClose()\n }\n\n const handleConfirmNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setConfirmName(value)\n if (nameError) setNameError(null)\n }\n\n const handleSubmit = () => {\n if (!bucket) return\n if (objectsError) return\n if (confirmName.trim() !== bucket.name) {\n setNameError(t`Bucket name does not match`)\n return\n }\n\n // Capture bucket name before async operation to avoid dereferencing null bucket in callbacks\n const bucketName = bucket.name\n\n deleteBucketMutation.mutate(\n { project_id: projectId, bucketName },\n {\n onSuccess: () => {\n handleClose()\n onSuccess?.(bucketName)\n },\n onError: (error) => {\n handleClose()\n onError?.(bucketName, error.message)\n },\n }\n )\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") handleSubmit()\n }\n\n if (!isOpen || !bucket) return null\n\n // Check if bucket has current objects (not just versions/delete markers)\n // When delimiter=\"\", folders are returned as objects (keys ending in \"/\")\n const currentObjectCount = objects?.objects?.length ?? 0\n const versionCount = objects?.versions?.length ?? 0\n\n // Bucket is non-empty if it has current objects\n // If it only has versions/delete markers (no current objects), it's considered \"empty\" for deletion purposes\n const isNonEmpty = currentObjectCount > 0\n const hasOnlyVersions = currentObjectCount === 0 && versionCount > 0\n const errorMessage = objectsError?.message\n\n return (\n <Modal\n title={t`Delete Bucket`}\n open={isOpen}\n onCancel={handleClose}\n confirmButtonLabel={isNonEmpty || hasOnlyVersions ? undefined : t`Delete Bucket`}\n confirmButtonVariant={isNonEmpty || hasOnlyVersions ? undefined : \"primary-danger\"}\n onConfirm={isNonEmpty || hasOnlyVersions ? undefined : handleSubmit}\n cancelButtonLabel={isNonEmpty || hasOnlyVersions ? undefined : t`Cancel`}\n modalFooter={\n isNonEmpty || hasOnlyVersions ? (\n <ModalFooter className=\"flex justify-end\">\n <ButtonRow>\n <Button variant=\"primary\" onClick={handleClose} data-testid=\"delete-has-objects-close-button\">\n <Trans>Close</Trans>\n </Button>\n </ButtonRow>\n </ModalFooter>\n ) : undefined\n }\n size=\"small\"\n disableConfirmButton={\n deleteBucketMutation.isPending || isLoadingObjects || !!objectsError || confirmName.trim() !== bucket.name\n }\n >\n <Stack direction=\"vertical\" gap=\"6\">\n {objectsError && (\n <p className=\"text-theme-error\" role=\"alert\" aria-live=\"assertive\">\n <Trans>Failed to check bucket contents: {errorMessage}</Trans>\n </p>\n )}\n\n {isLoadingObjects ? (\n <Stack direction=\"horizontal\" gap=\"2\" alignment=\"center\">\n <Spinner />\n <span className=\"text-juno-grey-light-1 text-sm\">\n <Trans>Checking bucket contents...</Trans>\n </span>\n </Stack>\n ) : isNonEmpty ? (\n <p className=\"text-theme-default\">\n <Trans>\n This bucket contains objects and cannot be deleted. Use <strong>Empty Bucket</strong> action to remove all\n content first.\n </Trans>\n </p>\n ) : hasOnlyVersions ? (\n <p className=\"text-theme-default\">\n <Trans>\n This bucket contains old versions and delete markers. Use <strong>Delete Versions</strong> action to\n remove them before deleting the bucket.\n </Trans>\n </p>\n ) : (\n <>\n <p className=\"text-theme-default\">\n <Trans>\n This action is irreversible. Deleting a bucket permanently removes it and cannot be undone. The bucket\n must be empty before deletion.\n </Trans>\n </p>\n\n <TextInput\n label={t`Type the bucket name to confirm`}\n required\n value={confirmName}\n onChange={handleConfirmNameChange}\n onKeyDown={handleKeyDown}\n invalid={!!nameError}\n errortext={nameError || undefined}\n disabled={deleteBucketMutation.isPending}\n placeholder={bucket.name}\n />\n </>\n )}\n </Stack>\n </Modal>\n )\n}\n","import { useState } from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { Modal, TextInput, Stack } from \"@cloudoperators/juno-ui-components\"\nimport { Bucket } from \"@/server/Storage/types/ceph\"\nimport { useProjectId } from \"@/client/hooks/useProjectId\"\n\ninterface DeleteVersionsModalProps {\n isOpen: boolean\n bucket: Bucket | null\n onClose: () => void\n onSuccess?: (bucketName: string, deletedCount: number) => void\n onError?: (bucketName: string, errorMessage: string) => void\n}\n\nexport const DeleteVersionsModal = ({ isOpen, bucket, onClose, onSuccess, onError }: DeleteVersionsModalProps) => {\n const { t } = useLingui()\n const projectId = useProjectId()\n const [confirmName, setConfirmName] = useState(\"\")\n const [nameError, setNameError] = useState<string | null>(null)\n\n const utils = trpcReact.useUtils()\n\n const deleteVersionsMutation = trpcReact.storage.ceph.objects.deleteAll.useMutation({\n onSettled: () => {\n // Invalidate both containers.list (to update bucket metadata) and objects.list (to refresh empty state)\n utils.storage.ceph.containers.list.invalidate()\n utils.storage.ceph.objects.list.invalidate()\n handleClose()\n },\n })\n\n const handleClose = () => {\n setConfirmName(\"\")\n setNameError(null)\n deleteVersionsMutation.reset()\n onClose()\n }\n\n const handleConfirmNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setConfirmName(value)\n if (nameError) setNameError(null)\n }\n\n const handleSubmit = () => {\n if (!bucket) return\n if (confirmName.trim() !== bucket.name) {\n setNameError(t`Bucket name does not match`)\n return\n }\n\n // Capture bucket name before async operation to avoid dereferencing null bucket in callbacks\n const bucketName = bucket.name\n\n // Always delete all versions and delete markers (includeVersionsAndDeleteMarkers: true)\n deleteVersionsMutation.mutate(\n {\n project_id: projectId,\n containerName: bucketName,\n includeVersionsAndDeleteMarkers: true,\n },\n {\n onSuccess: (deletedCount) => {\n onSuccess?.(bucketName, deletedCount)\n },\n onError: (error) => {\n onError?.(bucketName, error.message)\n },\n }\n )\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") handleSubmit()\n }\n\n if (!isOpen || !bucket) return null\n\n return (\n <Modal\n title={t`Delete Versions`}\n open={isOpen}\n onCancel={handleClose}\n confirmButtonLabel={t`Delete Versions`}\n confirmButtonVariant=\"primary-danger\"\n onConfirm={handleSubmit}\n cancelButtonLabel={t`Cancel`}\n size=\"small\"\n disableConfirmButton={deleteVersionsMutation.isPending || confirmName.trim() !== bucket.name}\n >\n <Stack direction=\"vertical\" gap=\"6\">\n <p className=\"text-theme-default m-0\">\n <Trans>\n This action will permanently delete all versions and delete markers. This will enable you to delete the\n bucket. This action cannot be undone.\n </Trans>\n </p>\n\n <TextInput\n label={t`Type the bucket name to confirm`}\n required\n value={confirmName}\n onChange={handleConfirmNameChange}\n onKeyDown={handleKeyDown}\n invalid={!!nameError}\n errortext={nameError || undefined}\n disabled={deleteVersionsMutation.isPending}\n placeholder={bucket.name}\n autoFocus\n />\n </Stack>\n </Modal>\n )\n}\n"],"mappings":"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"}
|
package/dist/client/{EditSecurityGroupModal-DKusxfta.mjs → EditSecurityGroupModal-BPv3d7am.mjs}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { S as e, U as t, W as n, Y as r, _ as i, dt as a, f as o, m as s, ot as c, p as l, ut as u, x as d } from "./build-DF7MTyXG.mjs";
|
|
2
2
|
import { jsx as f, jsxs as p } from "react/jsx-runtime";
|
|
3
3
|
import { useEffect as m, useState as h } from "react";
|
|
4
4
|
import { Trans as g, useLingui as _ } from "@lingui/react";
|
|
@@ -40,14 +40,14 @@ var v = ({ securityGroup: v, open: y, onClose: b, onUpdate: x, isLoading: S = !1
|
|
|
40
40
|
}, N = () => {
|
|
41
41
|
k({}), b();
|
|
42
42
|
};
|
|
43
|
-
return /*#__PURE__*/ p(
|
|
43
|
+
return /*#__PURE__*/ p(u, {
|
|
44
44
|
open: y,
|
|
45
45
|
onCancel: N,
|
|
46
46
|
size: "large",
|
|
47
47
|
title: w._({ id: "yu9G3x" }),
|
|
48
48
|
modalFooter: /*#__PURE__*/ f(o, {
|
|
49
49
|
className: "flex justify-end",
|
|
50
|
-
children: /*#__PURE__*/ p(
|
|
50
|
+
children: /*#__PURE__*/ p(a, { children: [/*#__PURE__*/ f(i, {
|
|
51
51
|
variant: "default",
|
|
52
52
|
onClick: N,
|
|
53
53
|
disabled: S,
|
|
@@ -59,17 +59,17 @@ var v = ({ securityGroup: v, open: y, onClose: b, onUpdate: x, isLoading: S = !1
|
|
|
59
59
|
},
|
|
60
60
|
disabled: S,
|
|
61
61
|
"data-testid": "update-security-group-button",
|
|
62
|
-
children: S ? /*#__PURE__*/ f(
|
|
62
|
+
children: S ? /*#__PURE__*/ f(t, { size: "small" }) : /*#__PURE__*/ f(g, { id: "Df0YHr" })
|
|
63
63
|
})] })
|
|
64
64
|
}),
|
|
65
65
|
children: [
|
|
66
|
-
C && /*#__PURE__*/ f(
|
|
66
|
+
C && /*#__PURE__*/ f(r, {
|
|
67
67
|
dismissible: !1,
|
|
68
68
|
variant: "error",
|
|
69
69
|
className: "mb-4",
|
|
70
70
|
children: C
|
|
71
71
|
}),
|
|
72
|
-
/*#__PURE__*/ f(
|
|
72
|
+
/*#__PURE__*/ f(r, {
|
|
73
73
|
dismissible: !1,
|
|
74
74
|
variant: "info",
|
|
75
75
|
className: "mb-4",
|
|
@@ -77,19 +77,19 @@ var v = ({ securityGroup: v, open: y, onClose: b, onUpdate: x, isLoading: S = !1
|
|
|
77
77
|
}),
|
|
78
78
|
S && /*#__PURE__*/ p("div", {
|
|
79
79
|
className: "mb-4 flex items-center justify-center gap-2",
|
|
80
|
-
children: [/*#__PURE__*/ f(
|
|
80
|
+
children: [/*#__PURE__*/ f(t, { variant: "primary" }), /*#__PURE__*/ f("span", {
|
|
81
81
|
className: "text-theme-high text-sm",
|
|
82
82
|
children: /*#__PURE__*/ f(g, { id: "V804LY" })
|
|
83
83
|
})]
|
|
84
84
|
}),
|
|
85
85
|
!S && /*#__PURE__*/ f(d, {
|
|
86
86
|
className: "mb-6",
|
|
87
|
-
children: /*#__PURE__*/ p(
|
|
87
|
+
children: /*#__PURE__*/ p(l, {
|
|
88
88
|
className: "mb-6",
|
|
89
89
|
children: [
|
|
90
|
-
/*#__PURE__*/ f(
|
|
90
|
+
/*#__PURE__*/ f(e, {
|
|
91
91
|
className: "mb-6",
|
|
92
|
-
children: /*#__PURE__*/ f(
|
|
92
|
+
children: /*#__PURE__*/ f(s, {
|
|
93
93
|
id: "name",
|
|
94
94
|
name: "name",
|
|
95
95
|
label: w._({ id: "6YtxFj" }),
|
|
@@ -101,9 +101,9 @@ var v = ({ securityGroup: v, open: y, onClose: b, onUpdate: x, isLoading: S = !1
|
|
|
101
101
|
disabled: S
|
|
102
102
|
})
|
|
103
103
|
}),
|
|
104
|
-
/*#__PURE__*/ f(
|
|
104
|
+
/*#__PURE__*/ f(e, {
|
|
105
105
|
className: "mb-6",
|
|
106
|
-
children: /*#__PURE__*/ f(
|
|
106
|
+
children: /*#__PURE__*/ f(n, {
|
|
107
107
|
id: "description",
|
|
108
108
|
name: "description",
|
|
109
109
|
label: w._({ id: "Nu4oKW" }),
|
|
@@ -114,9 +114,9 @@ var v = ({ securityGroup: v, open: y, onClose: b, onUpdate: x, isLoading: S = !1
|
|
|
114
114
|
rows: 3
|
|
115
115
|
})
|
|
116
116
|
}),
|
|
117
|
-
/*#__PURE__*/ f(
|
|
117
|
+
/*#__PURE__*/ f(e, {
|
|
118
118
|
className: "mb-0",
|
|
119
|
-
children: /*#__PURE__*/ f(
|
|
119
|
+
children: /*#__PURE__*/ f(c, {
|
|
120
120
|
id: "stateful",
|
|
121
121
|
name: "stateful",
|
|
122
122
|
label: w._({ id: "Jim5X9" }),
|
|
@@ -134,4 +134,4 @@ var v = ({ securityGroup: v, open: y, onClose: b, onUpdate: x, isLoading: S = !1
|
|
|
134
134
|
//#endregion
|
|
135
135
|
export { v as t };
|
|
136
136
|
|
|
137
|
-
//# sourceMappingURL=EditSecurityGroupModal-
|
|
137
|
+
//# sourceMappingURL=EditSecurityGroupModal-BPv3d7am.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditSecurityGroupModal-
|
|
1
|
+
{"version":3,"file":"EditSecurityGroupModal-BPv3d7am.mjs","names":["React","useState","useEffect","Modal","Form","FormRow","FormSection","TextInput","Checkbox","Button","ButtonRow","Spinner","ModalFooter","Textarea","Message","EditSecurityGroupModal","securityGroup","open","onClose","onUpdate","isLoading","error","useLingui","properties","setProperties","name","description","stateful","errors","setErrors","handleInputChange","e","value","type","target","checked","prev","newErrors","validateForm","trim","t","Object","keys","length","handleSubmit","preventDefault","updateData","undefined","id","handleClose","onCancel","size","title","modalFooter","className","variant","onClick","disabled","data-testid","dismissible","div","span","label","onChange","required","errortext","placeholder","rows"],"sources":["../../src/client/routes/_auth/projects/$projectId/network/securitygroups/-components/-modals/EditSecurityGroupModal.tsx"],"sourcesContent":["import React, { useState, useEffect } from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n Modal,\n Form,\n FormRow,\n FormSection,\n TextInput,\n Checkbox,\n Button,\n ButtonRow,\n Spinner,\n ModalFooter,\n Textarea,\n Message,\n} from \"@cloudoperators/juno-ui-components\"\nimport type { SecurityGroup } from \"@/server/Network/types/securityGroup\"\nimport { UpdateSecurityGroupInput } from \"@/server/Network/types/securityGroup\"\n\ninterface EditSecurityGroupModalProps {\n securityGroup: SecurityGroup\n open: boolean\n onClose: () => void\n onUpdate?: (\n securityGroupId: string,\n data: Omit<UpdateSecurityGroupInput, \"securityGroupId\" | \"project_id\">\n ) => Promise<void>\n isLoading?: boolean\n error?: string | null\n}\n\ninterface SecurityGroupProperties {\n name: string\n description: string\n stateful: boolean\n}\n\nexport const EditSecurityGroupModal: React.FC<EditSecurityGroupModalProps> = ({\n securityGroup,\n open,\n onClose,\n onUpdate,\n isLoading = false,\n error = null,\n}) => {\n const { t } = useLingui()\n\n const [properties, setProperties] = useState<SecurityGroupProperties>({\n name: securityGroup.name || \"\",\n description: securityGroup.description || \"\",\n stateful: securityGroup.stateful ?? true,\n })\n const [errors, setErrors] = useState<{ [key: string]: string }>({})\n\n // Update properties when securityGroup changes\n useEffect(() => {\n setProperties({\n name: securityGroup.name || \"\",\n description: securityGroup.description || \"\",\n stateful: securityGroup.stateful ?? true,\n })\n }, [securityGroup])\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const { name, value, type } = e.target\n const checked = (e.target as HTMLInputElement).checked\n\n setProperties((prev) => ({\n ...prev,\n [name]: type === \"checkbox\" ? checked : value,\n }))\n\n if (errors[name]) {\n setErrors((prev) => {\n const newErrors = { ...prev }\n delete newErrors[name]\n return newErrors\n })\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`Security group name is required`\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 if (onUpdate) {\n const updateData: Omit<UpdateSecurityGroupInput, \"securityGroupId\" | \"project_id\"> = {\n name: properties.name.trim(),\n description: properties.description.trim() || undefined,\n stateful: properties.stateful,\n }\n\n await onUpdate(securityGroup.id, updateData)\n }\n }\n\n const handleClose = () => {\n setErrors({})\n onClose()\n }\n\n return (\n <Modal\n open={open}\n onCancel={handleClose}\n size=\"large\"\n title={t`Edit Security Group`}\n modalFooter={\n <ModalFooter className=\"flex justify-end\">\n <ButtonRow>\n <Button variant=\"default\" onClick={handleClose} disabled={isLoading}>\n <Trans>Cancel</Trans>\n </Button>\n <Button\n variant=\"primary\"\n onClick={(e) => {\n handleSubmit(e)\n }}\n disabled={isLoading}\n data-testid=\"update-security-group-button\"\n >\n {isLoading ? <Spinner size=\"small\" /> : <Trans>Update Security Group</Trans>}\n </Button>\n </ButtonRow>\n </ModalFooter>\n }\n >\n {/* Error Message */}\n {error && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {error}\n </Message>\n )}\n\n {/* Info message about stateful changes */}\n <Message dismissible={false} variant=\"info\" className=\"mb-4\">\n <Trans>\n Note: The 'stateful' attribute cannot be changed if this security group is currently in use by one or more\n ports.\n </Trans>\n </Message>\n\n {isLoading && (\n <div className=\"mb-4 flex items-center justify-center gap-2\">\n <Spinner variant=\"primary\" />\n <span className=\"text-theme-high text-sm\">\n <Trans>Updating security group...</Trans>\n </span>\n </div>\n )}\n\n {!isLoading && (\n <Form className=\"mb-6\">\n <FormSection className=\"mb-6\">\n <FormRow className=\"mb-6\">\n <TextInput\n id=\"name\"\n name=\"name\"\n label={t`Name`}\n value={properties.name}\n onChange={handleInputChange}\n required\n errortext={errors.name}\n placeholder={t`Type name`}\n disabled={isLoading}\n />\n </FormRow>\n\n <FormRow className=\"mb-6\">\n <Textarea\n id=\"description\"\n name=\"description\"\n label={t`Description`}\n value={properties.description}\n onChange={handleInputChange}\n placeholder={t`Description`}\n disabled={isLoading}\n rows={3}\n />\n </FormRow>\n\n <FormRow className=\"mb-0\">\n <Checkbox\n id=\"stateful\"\n name=\"stateful\"\n label={t`Stateful`}\n checked={properties.stateful}\n onChange={handleInputChange}\n disabled={isLoading}\n />\n </FormRow>\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n"],"mappings":";;;;;AAqCA,IAAae,KAAiE,EAC5EC,kBACAC,SACAC,YACAC,aACAC,eAAY,IACZC,WAAQ,WACT;CACC,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,EAAAA,GAER,CAACC,GAAYC,KAAiBvB,EAAkC;EACpEwB,MAAMT,EAAcS,QAAQ;EAC5BC,aAAaV,EAAcU,eAAe;EAC1CC,UAAUX,EAAcW,YAAY;CACtC,CAAA,GACM,CAACC,GAAQC,KAAa5B,EAAoC,CAAC,CAAA;CAGjEC,QAAU;EACRsB,EAAc;GACZC,MAAMT,EAAcS,QAAQ;GAC5BC,aAAaV,EAAcU,eAAe;GAC1CC,UAAUX,EAAcW,YAAY;EACtC,CAAA;CACF,GAAG,CAACX,CAAAA,CAAc;CAElB,IAAMc,KAAqBC,MAAAA;EACzB,IAAM,EAAEN,SAAMO,UAAOC,YAASF,EAAEG,QAC1BC,IAAU,EAAGD,OAA4BC;EAO/C,AALAX,GAAeY,OAAU;GACvB,GAAGA;IACFX,IAAOQ,MAAS,aAAaE,IAAUH;EAC1C,EAAA,GAEIJ,EAAOH,MACTI,GAAWO,MAAAA;GACT,IAAMC,IAAY,EAAE,GAAGD,EAAK;GAE5B,OADA,OAAOC,EAAUZ,IACVY;EACT,CAAA;CAEJ,GAEMC,UAAe;EACnB,IAAMD,IAAuC,CAAC;EAO9C,QALI,CAACd,EAAWE,QAAQF,EAAWE,KAAKc,KAAI,MAAO,QACjDF,EAAUZ,OAAOe,EAAAA,EAAC,EAAA,IAAA,SAAgC,CAAA,IAGpDX,EAAUQ,CAAAA,GACHI,OAAOC,KAAKL,CAAAA,EAAWM,WAAW;CAC3C,GAEMC,IAAe,OAAOb,MAAAA;EAC1BA,MAAEc,eAAc,GAEXP,EAAAA,KAIDnB,GAAU;GACZ,IAAM2B,IAA+E;IACnFrB,MAAMF,EAAWE,KAAKc,KAAI;IAC1Bb,aAAaH,EAAWG,YAAYa,KAAI,KAAMQ,KAAAA;IAC9CpB,UAAUJ,EAAWI;GACvB;GAEA,MAAMR,EAASH,EAAcgC,IAAIF,CAAAA;EACnC;CACF,GAEMG,UAAc;EAElB/B,AADAW,EAAU,CAAC,CAAA,GACXX,EAAAA;CACF;CAEA,OACE,gBAACf,GAAAA;EACOc;EACNiC,UAAUD;EACVE,MAAK;EACLC,OAAOZ,EAAAA,EAAC,EAAA,IAAA,SAAoB,CAAA;EAC5Ba,aACE,gBAACzC,GAAAA;GAAY0C,WAAU;aACrB,gBAAC5C,GAAAA,EAAAA,UAAAA,CACC,gBAACD,GAAAA;IAAO8C,SAAQ;IAAUC,SAASP;IAAaQ,UAAUrC;cACxD,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;OAEF,gBAACX,GAAAA;IACC8C,SAAQ;IACRC,UAAUzB,MAAAA;KACRa,EAAab,CAAAA;IACf;IACA0B,UAAUrC;IACVsC,eAAY;cAEXtC,IAAY,gBAACT,GAAAA,EAAQwC,MAAK,QAAA,CAAA,IAAa,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;;;GAO/C9B,KACC,gBAACP,GAAAA;IAAQ6C,aAAa;IAAOJ,SAAQ;IAAQD,WAAU;cACpDjC;;GAKL,gBAACP,GAAAA;IAAQ6C,aAAa;IAAOJ,SAAQ;IAAOD,WAAU;cACpD,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;GAMDlC,KACC,gBAACwC,OAAAA;IAAIN,WAAU;eACb,gBAAC3C,GAAAA,EAAQ4C,SAAQ,UAAA,CAAA,GACjB,gBAACM,QAAAA;KAAKP,WAAU;eACd,gBAAA,GAAA,EAAA,IAAA,SAAA,CAAA;;;GAKL,CAAClC,KACA,gBAAChB,GAAAA;IAAKkD,WAAU;cACd,gBAAChD,GAAAA;KAAYgD,WAAU;;MACrB,gBAACjD,GAAAA;OAAQiD,WAAU;iBACjB,gBAAC/C,GAAAA;QACCyC,IAAG;QACHvB,MAAK;QACLqC,OAAOtB,EAAAA,EAAC,EAAA,IAAA,SAAK,CAAA;QACbR,OAAOT,EAAWE;QAClBsC,UAAUjC;QACVkC,UAAQ;QACRC,WAAWrC,EAAOH;QAClByC,aAAa1B,EAAAA,EAAC,EAAA,IAAA,SAAU,CAAA;QACxBiB,UAAUrC;;;MAId,gBAACf,GAAAA;OAAQiD,WAAU;iBACjB,gBAACzC,GAAAA;QACCmC,IAAG;QACHvB,MAAK;QACLqC,OAAOtB,EAAAA,EAAC,EAAA,IAAA,SAAY,CAAA;QACpBR,OAAOT,EAAWG;QAClBqC,UAAUjC;QACVoC,aAAa1B,EAAAA,EAAC,EAAA,IAAA,SAAY,CAAA;QAC1BiB,UAAUrC;QACV+C,MAAM;;;MAIV,gBAAC9D,GAAAA;OAAQiD,WAAU;iBACjB,gBAAC9C,GAAAA;QACCwC,IAAG;QACHvB,MAAK;QACLqC,OAAOtB,EAAAA,EAAC,EAAA,IAAA,SAAS,CAAA;QACjBL,SAASZ,EAAWI;QACpBoC,UAAUjC;QACV2B,UAAUrC;;;;;;;;AAQ1B"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { X as e, _ as t, d as n, l as r, n as i, r as a, t as o, v as s } from "./build-DF7MTyXG.mjs";
|
|
2
2
|
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
3
3
|
import { useCallback as u, useState as d } from "react";
|
|
4
4
|
import { useLingui as f } from "@lingui/react";
|
|
@@ -78,4 +78,4 @@ var h = ({ filters: e, onChange: t }) => {
|
|
|
78
78
|
//#endregion
|
|
79
79
|
export { p as n, h as t };
|
|
80
80
|
|
|
81
|
-
//# sourceMappingURL=FiltersInput-
|
|
81
|
+
//# sourceMappingURL=FiltersInput-CViamP59.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FiltersInput-
|
|
1
|
+
{"version":3,"file":"FiltersInput-CViamP59.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","isEmpty","value","Array","isArray","length","Map","Set","size","Object","keys","FiltersInput","filters","onChange","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 { Filter, SelectedFilter } from \"./types\"\n\nexport type FiltersInputProps = {\n filters: Filter[]\n onChange: (filter: SelectedFilter) => void\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 = ({ filters, onChange }: 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: \"w-full sm:flex-1 sm:min-w-0\",\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: \"w-full sm:flex-1 sm:min-w-0\",\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;aAEvDP,EAAgBQ,KAAKC,MACpB,gBAACZ,GAAAA;GAECa,WAAS;GACTC,SAASF,EAAOG;GAChBC,WAAWJ,EAAOK;GAClBC,eAAed,EAASQ,CAAAA;KAJnB,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;;;AC7BA,SAAS0B,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,WAAiBO,OAAOC,KAAKR,CAAAA,EAAOG,WAAW,IAC7D;AACT;AAEA,IAAaM,KAAgB,EAAEC,YAASC,kBAA6B;CACnE,IAAM,EAAA,MAAA,GAAA,GAAA,MAAQC,EAAAA,GAER,CAACC,GAAoBC,KAAyBrB,EAAiB,EAAA,GAC/D,CAACsB,GAAqBC,KAA0BvB,EAAiB,EAAA,GAEjEwB,IAAqCP,EACxCQ,MAAMC,MAAWA,EAAOC,eAAeP,CAAAA,GACtCQ,QAAQF,QAAQnB,MAAUA,CAAAA,GAExBsB,IAAoB9B,GACvBQ,MAAAA;EAQCwB,AAPAR,EAAuBhB,CAAAA,GACnB,CAACD,EAAQc,CAAAA,KAAuB,CAACd,EAAQC,CAAAA,KAC3CW,EAAS;GACPY,MAAMV;GACCb;EACT,CAAA,GAEFwB,iBAAW;GACTR,EAAuB,EAAA;EACzB,GAAG,CAAA;CACL,GACA;EAACH;EAAoBG;EAAwBL;EAAS,GAGlDc,WAAkE;EACtEC,WAAW;EACXH,MAAM;EACN,eAAe;EACfI,OAAOC,EAAAA,EAAC,EAAA,IAAA,SAAU,CAAA;EAClB5B,OAAOa;EACPF,WAAWX,MAAAA;GACTc,EAAsBe,OAAO7B,CAAAA,CAAAA;EAC/B;CACF,IAEM8B,WAAsE;EAC1EJ,WAAW;EACXH,MAAM;EACN,eAAe;EACfvB,OAAOe;EACPgB,UAAU,CAAClB;EACXF,UAAUW;CACZ;CAEA,OACE,gBAAC5B,GAAAA;EAAWgC,WAAU;aACpB,gBAAC5B,GAAAA;GAAQ,GAAG2B,EAAAA;aACTf,GAASsB,KAAK,EAAEC,gBAAab,oBAC5B,gBAACvB,GAAAA;IAAaG,OAAOoB;IAAYO,OAAOM;IAA8BC,eAAad;MAAzBA,CAAAA,CAAAA;MAG9D,gBAACzB,GAAAA;GAAU,GAAGmC,EAAAA;aACXb,GAAce,KAAKhC,MAClB,gBAACJ,GAAAA;IAAsBI;IAAmB2B,OAAO3B;IAAOkC,eAAalC;MAAlCA,CAAAA,CAAAA;;;AAK7C"}
|