diff --git a/packages/manager/apps/pci-cold-archive/package.json b/packages/manager/apps/pci-cold-archive/package.json index 4c90abfdf255..ce417ee8a566 100644 --- a/packages/manager/apps/pci-cold-archive/package.json +++ b/packages/manager/apps/pci-cold-archive/package.json @@ -24,8 +24,8 @@ "@ovh-ux/manager-react-shell-client": "^0.8.5", "@ovh-ux/manager-tailwind-config": "^0.2.1", "@ovh-ux/shell": "^4.1.2", - "@ovhcloud/ods-components": "18.5.0", - "@ovhcloud/ods-themes": "18.5.0", + "@ovhcloud/ods-components": "18.5.1", + "@ovhcloud/ods-themes": "18.5.1", "@tanstack/react-query": "^5.51.21", "@tanstack/react-table": "^8.20.1", "date-fns": "^4.1.0", diff --git a/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_de_DE.json b/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_de_DE.json new file mode 100644 index 000000000000..b988b86d0ab0 --- /dev/null +++ b/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_de_DE.json @@ -0,0 +1,15 @@ +{ + "pci_projects_project_storages_cold_archive_containers_container_archive_title": "Ihren Container archivieren", + "pci_projects_project_storages_cold_archive_containers_container_archive_description": "Sie sind im Begriff, Ihren Container {{ containerName }} zu archivieren.", + "pci_projects_project_storages_cold_archive_containers_container_archive_submit_label": "Archivieren", + "pci_projects_project_storages_cold_archive_containers_container_archive_cancel_label": "Abbrechen", + "pci_projects_project_storages_cold_archive_containers_container_archive_success_message": "Der Container {{ containerName }} wird gerade archiviert.", + "pci_projects_project_storages_cold_archive_containers_container_archive_error_message": "Beim Archivieren des Containers {{ containerName }} ist ein Fehler aufgetreten: {{ message }}", + "pci_projects_project_storages_cold_archive_containers_container_archive_description_2": "Wenn Sie eine Aufbewahrungsdauer konfigurieren, wird Ihr Archiv gesperrt und Sie können Ihre Daten während der gesamten Aufbewahrungsdauer nicht mehr löschen.", + "pci_projects_project_storages_cold_archive_containers_container_archive_has_retention": "Beibehaltungsdauer planen", + "pci_projects_project_storages_cold_archive_containers_container_archive_has_no_retention": "Aufbewahrungsdauer nicht planen", + "pci_projects_project_storages_cold_archive_containers_container_archive_retention_days": "Anzahl der Aufbewahrungstage hinzufügen", + "pci_projects_project_storages_cold_archive_containers_container_retention_warning": "Ihre Vorhaltedauer endet am {{ date }} .", + "pci_projects_project_storages_cold_archive_containers_container_retention_warning_2": "Sie können erst nach Ablauf dieses Datums mit der Löschung Ihrer Daten fortfahren.", + "pci_projects_project_storages_cold_archive_containers_container_retention_retention_value_wartning": "Anzahl der Aufbewahrungstage hinzufügen (mindestens 1 Tag, maximal 4500 Tage)" +} diff --git a/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_en_GB.json b/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_en_GB.json new file mode 100644 index 000000000000..3e22f4543c1f --- /dev/null +++ b/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_en_GB.json @@ -0,0 +1,15 @@ +{ + "pci_projects_project_storages_cold_archive_containers_container_archive_title": "Archive your container", + "pci_projects_project_storages_cold_archive_containers_container_archive_description": "You are about to archive your {{ containerName }} container.", + "pci_projects_project_storages_cold_archive_containers_container_archive_submit_label": "Archive", + "pci_projects_project_storages_cold_archive_containers_container_archive_cancel_label": "Exit", + "pci_projects_project_storages_cold_archive_containers_container_archive_success_message": "Archiving the {{containerName}} container.", + "pci_projects_project_storages_cold_archive_containers_container_archive_error_message": "An error has occurred archiving the {{containerName}} container: {{message}}", + "pci_projects_project_storages_cold_archive_containers_container_archive_description_2": "By configuring a retention period, your archive will be locked and you will no longer be able to delete your data during the entire retention period.", + "pci_projects_project_storages_cold_archive_containers_container_archive_has_retention": "Schedule a retention period", + "pci_projects_project_storages_cold_archive_containers_container_archive_has_no_retention": "Do not schedule a retention period", + "pci_projects_project_storages_cold_archive_containers_container_archive_retention_days": "Add the number of retention days", + "pci_projects_project_storages_cold_archive_containers_container_retention_warning": "Your retention period will end on {{ date }} .", + "pci_projects_project_storages_cold_archive_containers_container_retention_warning_2": "You can only delete your data once this date has passed.", + "pci_projects_project_storages_cold_archive_containers_container_retention_retention_value_wartning": "Add the number of retention days (minimum 1 day, maximum 4,500 days)" +} diff --git a/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_es_ES.json b/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_es_ES.json new file mode 100644 index 000000000000..382d1b3072d2 --- /dev/null +++ b/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_es_ES.json @@ -0,0 +1,15 @@ +{ + "pci_projects_project_storages_cold_archive_containers_container_archive_title": "Archivar el contenedor", + "pci_projects_project_storages_cold_archive_containers_container_archive_description": "Va a archivar su contenedor {{ containerName }}.", + "pci_projects_project_storages_cold_archive_containers_container_archive_submit_label": "Archivar", + "pci_projects_project_storages_cold_archive_containers_container_archive_cancel_label": "Cancelar", + "pci_projects_project_storages_cold_archive_containers_container_archive_success_message": "El contenedor {{ containerName }} se está archivando...", + "pci_projects_project_storages_cold_archive_containers_container_archive_error_message": "Se ha producido un error al archivar el contenedor {{ containerName }}: {{ message }}.", + "pci_projects_project_storages_cold_archive_containers_container_archive_description_2": "Al configurar una duración de retención, el archivo se bloqueará y no podrá eliminar sus datos durante todo el período de retención.", + "pci_projects_project_storages_cold_archive_containers_container_archive_has_retention": "Programar una duración de retención", + "pci_projects_project_storages_cold_archive_containers_container_archive_has_no_retention": "No programar duración de retención", + "pci_projects_project_storages_cold_archive_containers_container_archive_retention_days": "Añadir el número de días de retención", + "pci_projects_project_storages_cold_archive_containers_container_retention_warning": "Su período de retención finalizará el {{ date }} .", + "pci_projects_project_storages_cold_archive_containers_container_retention_warning_2": "Solo podrá eliminar sus datos una vez superada esta fecha.", + "pci_projects_project_storages_cold_archive_containers_container_retention_retention_value_wartning": "Añadir el número de días de retención (mínimo 1 día, máximo 4500 días)" +} diff --git a/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_fr_CA.json b/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_fr_CA.json new file mode 100644 index 000000000000..ae458b6ae3fc --- /dev/null +++ b/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_fr_CA.json @@ -0,0 +1,15 @@ +{ + "pci_projects_project_storages_cold_archive_containers_container_archive_title": "Archiver votre conteneur", + "pci_projects_project_storages_cold_archive_containers_container_archive_description": "Vous êtes sur le point d'archiver votre conteneur {{ containerName }}.", + "pci_projects_project_storages_cold_archive_containers_container_archive_description_2": "En configurant une durée de rétention, votre archive sera verrouillée et vous ne pourrez plus supprimer vos données pendant toute la période de rétention.", + "pci_projects_project_storages_cold_archive_containers_container_archive_submit_label": "Archiver", + "pci_projects_project_storages_cold_archive_containers_container_archive_cancel_label": "Annuler", + "pci_projects_project_storages_cold_archive_containers_container_archive_success_message": "Le conteneur {{ containerName }} est en cours d'archivage.", + "pci_projects_project_storages_cold_archive_containers_container_archive_error_message": "Une erreur est survenue lors de l'archivage du conteneur {{ containerName }} : {{ message }}.", + "pci_projects_project_storages_cold_archive_containers_container_archive_has_retention": "Planifier une durée de rétention", + "pci_projects_project_storages_cold_archive_containers_container_archive_has_no_retention": "Ne pas planifier de durée de rétention", + "pci_projects_project_storages_cold_archive_containers_container_archive_retention_days": "Ajouter le nombre de jours de rétention", + "pci_projects_project_storages_cold_archive_containers_container_retention_warning": "Votre durée de rétention prendra fin le {{ date }}.", + "pci_projects_project_storages_cold_archive_containers_container_retention_warning_2": "Vous ne pourrez procéder à la suppression de vos données qu'une fois cette date passée.", + "pci_projects_project_storages_cold_archive_containers_container_retention_retention_value_wartning": "Ajouter le nombre de jours de rétention (minimum 1 jour, maximum 4500 jours)" +} diff --git a/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_fr_FR.json b/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_fr_FR.json new file mode 100644 index 000000000000..ae458b6ae3fc --- /dev/null +++ b/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_fr_FR.json @@ -0,0 +1,15 @@ +{ + "pci_projects_project_storages_cold_archive_containers_container_archive_title": "Archiver votre conteneur", + "pci_projects_project_storages_cold_archive_containers_container_archive_description": "Vous êtes sur le point d'archiver votre conteneur {{ containerName }}.", + "pci_projects_project_storages_cold_archive_containers_container_archive_description_2": "En configurant une durée de rétention, votre archive sera verrouillée et vous ne pourrez plus supprimer vos données pendant toute la période de rétention.", + "pci_projects_project_storages_cold_archive_containers_container_archive_submit_label": "Archiver", + "pci_projects_project_storages_cold_archive_containers_container_archive_cancel_label": "Annuler", + "pci_projects_project_storages_cold_archive_containers_container_archive_success_message": "Le conteneur {{ containerName }} est en cours d'archivage.", + "pci_projects_project_storages_cold_archive_containers_container_archive_error_message": "Une erreur est survenue lors de l'archivage du conteneur {{ containerName }} : {{ message }}.", + "pci_projects_project_storages_cold_archive_containers_container_archive_has_retention": "Planifier une durée de rétention", + "pci_projects_project_storages_cold_archive_containers_container_archive_has_no_retention": "Ne pas planifier de durée de rétention", + "pci_projects_project_storages_cold_archive_containers_container_archive_retention_days": "Ajouter le nombre de jours de rétention", + "pci_projects_project_storages_cold_archive_containers_container_retention_warning": "Votre durée de rétention prendra fin le {{ date }}.", + "pci_projects_project_storages_cold_archive_containers_container_retention_warning_2": "Vous ne pourrez procéder à la suppression de vos données qu'une fois cette date passée.", + "pci_projects_project_storages_cold_archive_containers_container_retention_retention_value_wartning": "Ajouter le nombre de jours de rétention (minimum 1 jour, maximum 4500 jours)" +} diff --git a/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_it_IT.json b/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_it_IT.json new file mode 100644 index 000000000000..5bbb2deec239 --- /dev/null +++ b/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_it_IT.json @@ -0,0 +1,15 @@ +{ + "pci_projects_project_storages_cold_archive_containers_container_archive_title": "Archiviare il container", + "pci_projects_project_storages_cold_archive_containers_container_archive_description": "Stai per archiviare il container {{ containerName }}.", + "pci_projects_project_storages_cold_archive_containers_container_archive_submit_label": "Archivia", + "pci_projects_project_storages_cold_archive_containers_container_archive_cancel_label": "Annullare", + "pci_projects_project_storages_cold_archive_containers_container_archive_success_message": "Archiviazione del container {{ containerName }} in corso...", + "pci_projects_project_storages_cold_archive_containers_container_archive_error_message": "Si è verificato un errore durante l'archiviazione del container {{ containerName }}: {{ message }}", + "pci_projects_project_storages_cold_archive_containers_container_archive_description_2": "Impostando una durata di conservazione, l'archivio verrà bloccato e non sarà possibile eliminare i dati per l'intero periodo di conservazione.", + "pci_projects_project_storages_cold_archive_containers_container_archive_has_retention": "Pianificare un periodo di conservazione", + "pci_projects_project_storages_cold_archive_containers_container_archive_has_no_retention": "Non pianificare periodi di conservazione", + "pci_projects_project_storages_cold_archive_containers_container_archive_retention_days": "Aggiungi il numero di giorni di retention", + "pci_projects_project_storages_cold_archive_containers_container_retention_warning": "Il periodo di retention terminerà il {{ date }} .", + "pci_projects_project_storages_cold_archive_containers_container_retention_warning_2": "I tuoi dati potranno essere cancellati solo dopo questa data.", + "pci_projects_project_storages_cold_archive_containers_container_retention_retention_value_wartning": "Aggiungere il numero di giorni di retention (minimo 1 giorno, massimo 4500 giorni)" +} diff --git a/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_pl_PL.json b/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_pl_PL.json new file mode 100644 index 000000000000..3d9f974edbbf --- /dev/null +++ b/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_pl_PL.json @@ -0,0 +1,15 @@ +{ + "pci_projects_project_storages_cold_archive_containers_container_archive_title": "Zarchiwizuj kontener", + "pci_projects_project_storages_cold_archive_containers_container_archive_description": "Za chwilę zarchiwizujesz kontener {{ containerName }}.", + "pci_projects_project_storages_cold_archive_containers_container_archive_submit_label": "Archiwizacja", + "pci_projects_project_storages_cold_archive_containers_container_archive_cancel_label": "Anuluj", + "pci_projects_project_storages_cold_archive_containers_container_archive_success_message": "Trwa archiwizacja kontenera {{containerName}}.", + "pci_projects_project_storages_cold_archive_containers_container_archive_error_message": "Wystąpił błąd podczas archiwizowania kontenera {{containerName}}: {{message}}", + "pci_projects_project_storages_cold_archive_containers_container_archive_description_2": "Po skonfigurowaniu czasu retencji Twoje archiwum zostanie zablokowane i nie będziesz mógł usunąć danych przez cały okres retencji.", + "pci_projects_project_storages_cold_archive_containers_container_archive_has_retention": "Zaplanuj czas retencji", + "pci_projects_project_storages_cold_archive_containers_container_archive_has_no_retention": "Nie planuj czasu retencji", + "pci_projects_project_storages_cold_archive_containers_container_archive_retention_days": "Dodaj liczbę dni retencji", + "pci_projects_project_storages_cold_archive_containers_container_retention_warning": "Czas retencji wygaśnie w dniu {{ date }}.", + "pci_projects_project_storages_cold_archive_containers_container_retention_warning_2": "Nie będziesz mógł usunąć danych, dopóki nie upłynie ta data.", + "pci_projects_project_storages_cold_archive_containers_container_retention_retention_value_wartning": "Dodaj liczbę dni retencji (minimum 1 dzień, maksimum 4500 dni)" +} diff --git a/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_pt_PT.json b/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_pt_PT.json new file mode 100644 index 000000000000..ed55b27653ae --- /dev/null +++ b/packages/manager/apps/pci-cold-archive/public/translations/containers/archive/Messages_pt_PT.json @@ -0,0 +1,15 @@ +{ + "pci_projects_project_storages_cold_archive_containers_container_archive_title": "Arquivar o seu container", + "pci_projects_project_storages_cold_archive_containers_container_archive_description": "Está prestes a arquivar o seu container {{ containerName }}.", + "pci_projects_project_storages_cold_archive_containers_container_archive_submit_label": "Arquivar", + "pci_projects_project_storages_cold_archive_containers_container_archive_cancel_label": "Anular", + "pci_projects_project_storages_cold_archive_containers_container_archive_success_message": "O container {{ containerName }} está a ser arquivado.", + "pci_projects_project_storages_cold_archive_containers_container_archive_error_message": "Ocorreu um erro ao arquivar o container {{ containerName }}: {{ message }}.", + "pci_projects_project_storages_cold_archive_containers_container_archive_description_2": "Ao configurar uma duração de retenção, o seu arquivo será bloqueado e não poderá eliminar os seus dados durante todo o período de retenção.", + "pci_projects_project_storages_cold_archive_containers_container_archive_has_retention": "Planificar uma duração de retenção", + "pci_projects_project_storages_cold_archive_containers_container_archive_has_no_retention": "Não programar duração de retenção", + "pci_projects_project_storages_cold_archive_containers_container_archive_retention_days": "Adicionar o número de dias de retenção", + "pci_projects_project_storages_cold_archive_containers_container_retention_warning": "A sua duração de retenção terminará a {{ date }} .", + "pci_projects_project_storages_cold_archive_containers_container_retention_warning_2": "Só poderá proceder à eliminação dos seus dados após essa data.", + "pci_projects_project_storages_cold_archive_containers_container_retention_retention_value_wartning": "Adicionar o número de dias de retenção (mínimo 1 dia, máximo 4500 dias)" +} diff --git a/packages/manager/apps/pci-cold-archive/src/api/data/archive.ts b/packages/manager/apps/pci-cold-archive/src/api/data/archive.ts index a14a44ac39bc..417e6dc040da 100644 --- a/packages/manager/apps/pci-cold-archive/src/api/data/archive.ts +++ b/packages/manager/apps/pci-cold-archive/src/api/data/archive.ts @@ -73,3 +73,23 @@ export const restoreArchiveContainer = async ({ ); return data; }; + +export const startArchiveContainer = async ({ + projectId, + region, + archiveName, + lockedUntilDays, +}: { + projectId: string; + region: string; + archiveName: string; + lockedUntilDays: number; +}) => { + const params = lockedUntilDays ? { lockedUntilDays } : {}; + + const { data } = await v6.post( + `/cloud/project/${projectId}/region/${region}/coldArchive/${archiveName}/archive`, + params, + ); + return data; +}; diff --git a/packages/manager/apps/pci-cold-archive/src/api/hooks/useArchive.ts b/packages/manager/apps/pci-cold-archive/src/api/hooks/useArchive.ts index 895ed0e83f71..7b0a13ea232a 100644 --- a/packages/manager/apps/pci-cold-archive/src/api/hooks/useArchive.ts +++ b/packages/manager/apps/pci-cold-archive/src/api/hooks/useArchive.ts @@ -9,6 +9,7 @@ import { deleteArchiveContainer, getArchiveContainers, restoreArchiveContainer, + startArchiveContainer, TArchiveContainer, } from '../data/archive'; import { paginateResults, sortResults } from '@/helpers'; @@ -198,3 +199,42 @@ export const useAddUser = ({ ...mutation, }; }; + +type StartArchiveContainerProps = { + projectId: string; + containerName: string; + region: string; + lockedUntilDays?: number; + onError: (cause: Error) => void; + onSuccess: () => void; +}; + +export const useStartArchiveContainer = ({ + projectId, + containerName, + region, + lockedUntilDays, + onError, + onSuccess, +}: Readonly) => { + const mutation = useMutation({ + mutationFn: () => + startArchiveContainer({ + projectId, + region, + archiveName: containerName, + lockedUntilDays, + }), + onError, + onSuccess: async () => { + await queryClient.invalidateQueries({ + queryKey: getQueryKeyArchive(projectId, region), + }); + onSuccess(); + }, + }); + return { + startArchiveContainer: () => mutation.mutate(), + ...mutation, + }; +}; diff --git a/packages/manager/apps/pci-cold-archive/src/pages/containers/ActionsComponent.tsx b/packages/manager/apps/pci-cold-archive/src/pages/containers/ActionsComponent.tsx index e29230c3cbb7..863da064559b 100644 --- a/packages/manager/apps/pci-cold-archive/src/pages/containers/ActionsComponent.tsx +++ b/packages/manager/apps/pci-cold-archive/src/pages/containers/ActionsComponent.tsx @@ -26,6 +26,45 @@ export default function ActionsComponent({ COLD_ARCHIVE_CONTAINER_STATUS.ARCHIVED, ].includes(archive.status); + const isActionArchiveAvailable = + archive.objectsCount > 0 && + [COLD_ARCHIVE_CONTAINER_STATUS.NONE].includes(archive.status); + + const isActionEditRetentionContainerAvailable = [ + COLD_ARCHIVE_CONTAINER_STATUS.ARCHIVED, + COLD_ARCHIVE_CONTAINER_STATUS.RESTORED, + ].includes(archive.status); + + const isActionFlushContainerAvailable = () => { + const validStatuses = [ + COLD_ARCHIVE_CONTAINER_STATUS.ARCHIVED, + COLD_ARCHIVE_CONTAINER_STATUS.RESTORED, + ]; + + if (archive.lockedUntil) { + return ( + new Date(archive.lockedUntil) < new Date() && + validStatuses.includes(archive.status) + ); + } + + return validStatuses.includes(archive.status); + }; + + const isActionDeleteContainerAvailable = [ + COLD_ARCHIVE_CONTAINER_STATUS.NONE, + COLD_ARCHIVE_CONTAINER_STATUS.FLUSHED, + ].includes(archive.status); + + const isActionsAvailable = [ + isActionAddUserAvailable, + isActionArchiveAvailable, + isActionRestoredAvailable, + isActionFlushContainerAvailable(), + isActionEditRetentionContainerAvailable, + isActionDeleteContainerAvailable, + ].some((isActionAvailable) => isActionAvailable === true); + const items = [ isActionAddUserAvailable ? { @@ -57,20 +96,41 @@ export default function ActionsComponent({ }, } : undefined, - { - id: 2, - label: t( - 'pci_projects_project_storages_cold_archive_container_action_delete_container', - ), - onClick: () => { - tracking?.trackClick({ - name: `${COLD_ARCHIVE_TRACKING.CONTAINERS.MAIN}::${COLD_ARCHIVE_TRACKING.CONTAINERS.DELETE_CONTAINER}`, - type: 'navigation', - }); - navigate(`./delete-container/${archive.name}`); - }, - }, + isActionArchiveAvailable + ? { + id: 1, + label: t( + 'pci_projects_project_storages_cold_archive_container_action_archive', + ), + onClick: () => { + tracking?.trackClick({ + name: `${COLD_ARCHIVE_TRACKING.CONTAINERS.MAIN}::${COLD_ARCHIVE_TRACKING.CONTAINERS.ARCHIVE}`, + type: 'navigaton', + }); + navigate(`./archive/${archive.name}`); + }, + } + : undefined, + isActionDeleteContainerAvailable + ? { + id: 2, + label: t( + 'pci_projects_project_storages_cold_archive_container_action_delete_container', + ), + onClick: () => { + tracking?.trackClick({ + name: `${COLD_ARCHIVE_TRACKING.CONTAINERS.MAIN}::${COLD_ARCHIVE_TRACKING.CONTAINERS.DELETE_CONTAINER}`, + type: 'navigation', + }); + navigate(`./delete-container/${archive.name}`); + }, + } + : undefined, ].filter(Boolean); - return ; + return isActionsAvailable ? ( + + ) : ( + <> + ); } diff --git a/packages/manager/apps/pci-cold-archive/src/pages/containers/archive/Archive.page.tsx b/packages/manager/apps/pci-cold-archive/src/pages/containers/archive/Archive.page.tsx new file mode 100644 index 000000000000..8f9fcf7b8795 --- /dev/null +++ b/packages/manager/apps/pci-cold-archive/src/pages/containers/archive/Archive.page.tsx @@ -0,0 +1,245 @@ +import { + PciModal, + useProductRegionsAvailability, +} from '@ovh-ux/manager-pci-common'; +import { ApiError } from '@ovh-ux/manager-core-api'; +import { useNotifications } from '@ovh-ux/manager-react-components'; +import { ShellContext } from '@ovh-ux/manager-react-shell-client'; +import { + OdsFormField, + OdsMessage, + OdsQuantity, + OdsRadio, + OdsText, +} from '@ovhcloud/ods-components/react'; +import { useContext, useMemo, useState } from 'react'; +import { Translation, useTranslation } from 'react-i18next'; +import { useNavigate, useParams } from 'react-router-dom'; +import { add } from 'date-fns'; +import LabelComponent from '@/components/Label.component'; +import { COLD_ARCHIVE_TRACKING } from '@/constants'; +import { useFormattedDate } from '@/hooks/useFormattedDate'; +import { useStartArchiveContainer } from '@/api/hooks/useArchive'; + +export default function ArchivePage() { + const { addSuccess, addError } = useNotifications(); + const navigate = useNavigate(); + const { projectId, archiveName } = useParams(); + const { t } = useTranslation(['containers/archive', 'pci-common']); + const { ovhSubsidiary } = useContext(ShellContext).environment.getUser(); + const { tracking } = useContext(ShellContext).shell; + + const [lockedUntilDays, setLockedUntilDays] = useState(1); + const [hasRetention, setHasRetention] = useState(true); + const retentionDate = useFormattedDate( + add(new Date(), { days: lockedUntilDays }).toString(), + 'P', + ); + + const trackStartArchiveModalClick = (action: string) => { + tracking?.trackClick({ + name: `${COLD_ARCHIVE_TRACKING.CONTAINERS.MAIN}::${COLD_ARCHIVE_TRACKING.CONTAINERS.ARCHIVE}::${action}`, + type: 'action', + }); + }; + const trackStartArchiveModalPage = (action: string) => { + tracking?.trackPage({ + name: `${COLD_ARCHIVE_TRACKING.CONTAINERS.MAIN}::${COLD_ARCHIVE_TRACKING.CONTAINERS.ARCHIVE}_${action}`, + type: 'navigation', + }); + }; + + const { + data: regions, + isPending: isRegionsPending, + } = useProductRegionsAvailability( + ovhSubsidiary, + 'coldarchive.archive.hour.consumption', + ); + + const { + startArchiveContainer, + isPending: isPendingStartArchive, + } = useStartArchiveContainer({ + projectId, + region: regions?.[0], + containerName: archiveName, + ...(hasRetention && { lockedUntilDays }), + onError(error: ApiError) { + addError( + + {(_t) => + _t( + 'pci_projects_project_storages_cold_archive_containers_container_archive_error_message', + { + containerName: archiveName, + message: + error?.response?.data?.message || error?.message || null, + }, + ) + } + , + true, + ); + trackStartArchiveModalPage(COLD_ARCHIVE_TRACKING.STATUS.ERROR); + navigate('..'); + }, + onSuccess() { + addSuccess( + + {(_t) => + _t( + 'pci_projects_project_storages_cold_archive_containers_container_archive_success_message', + { + containerName: archiveName, + }, + ) + } + , + true, + ); + trackStartArchiveModalPage(COLD_ARCHIVE_TRACKING.STATUS.SUCCESS); + navigate('..'); + }, + }); + + const onConfirm = () => { + trackStartArchiveModalClick(COLD_ARCHIVE_TRACKING.ACTIONS.CONFIRM); + startArchiveContainer(); + }; + const onCancel = () => { + trackStartArchiveModalClick(COLD_ARCHIVE_TRACKING.ACTIONS.CANCEL); + navigate('..'); + }; + const onClose = () => onCancel(); + const isPending = isRegionsPending || isPendingStartArchive; + const error = { + min: lockedUntilDays < 1, + max: lockedUntilDays > 365, + nan: !RegExp(/^\d*$/).test(`${lockedUntilDays}`), + }; + + const errorMessage = useMemo(() => { + if (error.nan) { + return t('pci-common:common_field_error_number'); + } + if (error.min) { + return t('pci-common:common_field_error_min', { min: 1 }); + } + if (error.max) { + return t('pci-common:common_field_error_max', { max: 365 }); + } + return ''; + }, [lockedUntilDays, error.min, error.max, error.nan]); + + return ( + + + ${archiveName}` }, + ), + }} + > + + + {t( + 'pci_projects_project_storages_cold_archive_containers_container_archive_description_2', + )} + + +
+ { + setHasRetention(!hasRetention); + }} + /> + +
+
+ {hasRetention && ( +
+ + + setLockedUntilDays(event.detail.value)} + /> + + +
+ + + {t( + 'pci_projects_project_storages_cold_archive_containers_container_retention_warning_2', + )} + +
+
+
+ )} + +
+ { + setHasRetention(!hasRetention); + }} + /> + +
+
+
+ ); +} diff --git a/packages/manager/apps/pci-cold-archive/src/pages/containers/delete/Delete.page.tsx b/packages/manager/apps/pci-cold-archive/src/pages/containers/delete/Delete.page.tsx index 1fd6269c840a..029906a4337e 100644 --- a/packages/manager/apps/pci-cold-archive/src/pages/containers/delete/Delete.page.tsx +++ b/packages/manager/apps/pci-cold-archive/src/pages/containers/delete/Delete.page.tsx @@ -121,7 +121,7 @@ export default function DeletePage() { onConfirm={onConfirm} > {archive?.objectsCount > 0 ? ( - +
{t( diff --git a/packages/manager/apps/pci-cold-archive/src/routes.tsx b/packages/manager/apps/pci-cold-archive/src/routes.tsx index eb784197e6ae..d94b435889cb 100644 --- a/packages/manager/apps/pci-cold-archive/src/routes.tsx +++ b/packages/manager/apps/pci-cold-archive/src/routes.tsx @@ -16,11 +16,11 @@ export const ROUTE_PATHS = { USER_DELETE: ':userId/delete', USER_IMPORT_POLICY: 'import-policy', USER_R_CLONE_DOWNLOAD: 'rclone/download', + ARCHIVE_CONTAINER: 'archive/:archiveName', }; const LayoutPage = lazy(() => import('@/pages/Layout')); const StoragePage = lazy(() => import('@/pages/Archive.page')); - const ListingContainerPage = lazy(() => import('@/pages/containers/Listing.page'), ); @@ -38,6 +38,9 @@ const RestoreContainerPage = lazy(() => ); const OnboardingPage = lazy(() => import('@/pages/onboarding/Onboarding.page')); +const ArchivePage = lazy(() => + import('@/pages/containers/archive/Archive.page'), +); const UserListingPage = lazy(() => import('@/pages/users/Listing.page')); const UserCreationPage = lazy(() => import('@/pages/users/create/Create.page')); @@ -70,8 +73,8 @@ const RoutesComponent = () => ( path={ROUTE_PATHS.RESTORE_CONTAINER} Component={RestoreContainerPage} /> + - diff --git a/yarn.lock b/yarn.lock index 333602770509..46c55f91b1d3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6127,7 +6127,19 @@ tslib "2.6.3" vanillajs-datepicker "1.3.4" -"@ovhcloud/ods-components@18.5.0", "@ovhcloud/ods-components@^18.5.0": +"@ovhcloud/ods-components@18.5.1": + version "18.5.1" + resolved "https://registry.yarnpkg.com/@ovhcloud/ods-components/-/ods-components-18.5.1.tgz#2cd471856178f6f49c5056658626c27d8f86f020" + integrity sha512-PrwAuXAVF8CwhdVQGOO59ZVVlmP05WBsLDmoorGkw57qb9rodggdUYFwocmAuntAf7bzMc//oi1oFf78znQkzA== + dependencies: + "@floating-ui/dom" "1.6.11" + "@stencil/core" "4.16.0" + google-libphonenumber "3.2.35" + tom-select "2.3.1" + tslib "2.6.3" + vanillajs-datepicker "1.3.4" + +"@ovhcloud/ods-components@^18.5.0": version "18.5.0" resolved "https://registry.yarnpkg.com/@ovhcloud/ods-components/-/ods-components-18.5.0.tgz#f5b9d3ace2dafab19340e1457a0d113ccb09a52c" integrity sha512-578ljWS0bQOROt2LTFMDVP8NIaSXu1K8OjqzaXnSBdw1sL/zbKCmtsvYMyaAuOTRK1iwYqL7BI45L2IIu9J4ig== @@ -6158,7 +6170,12 @@ resolved "https://registry.yarnpkg.com/@ovhcloud/ods-themes/-/ods-themes-18.4.1.tgz#1c8dfeff1ba0b829fd61e8dea41af4cdbed46912" integrity sha512-bezBp/Bgbo19IFPJ/+a/bFt2IArjq8wGrHPshpk/bVVZsxkgpAiUfRERmftU+l7gYU3e+yvFdopNL6eRaJDPWQ== -"@ovhcloud/ods-themes@18.5.0", "@ovhcloud/ods-themes@^18.5.0": +"@ovhcloud/ods-themes@18.5.1": + version "18.5.1" + resolved "https://registry.yarnpkg.com/@ovhcloud/ods-themes/-/ods-themes-18.5.1.tgz#392a5b3c380d1ea2b4195242a1a70dfdba0e0c6d" + integrity sha512-5LRplIJcchtgx8qBvs/XR0FkGxd1QM/xt6+otGJsJj/G8/0ZVT6gQGlJ6Pim/5yUfZCtXKFX79+56jS9fHXRVA== + +"@ovhcloud/ods-themes@^18.5.0": version "18.5.0" resolved "https://registry.yarnpkg.com/@ovhcloud/ods-themes/-/ods-themes-18.5.0.tgz#0da59e081ee1db44dadf5c3a63e49f73fc280ea3" integrity sha512-PAwRtQOYQ1mVVP1RMt2J65NMf7tRbk+jDEf46jUWwRsS2gFuzNrwH3pfgKk4G/nksZ5exTKNL0MeC/fLLVr4Wg==