diff --git a/packages/manager/apps/pci-object-storage/package.json b/packages/manager/apps/pci-object-storage/package.json index 84a3dd2925c0..ee963aba4a3f 100644 --- a/packages/manager/apps/pci-object-storage/package.json +++ b/packages/manager/apps/pci-object-storage/package.json @@ -18,7 +18,7 @@ "@ovh-ux/manager-config": "^8.0.0", "@ovh-ux/manager-core-api": "^0.9.0", "@ovh-ux/manager-pci-common": "^0.9.1", - "@ovh-ux/manager-react-components": "^1.41.2", + "@ovh-ux/manager-react-components": "^1.43.0", "@ovh-ux/manager-react-core-application": "^0.11.1", "@ovh-ux/manager-react-shell-client": "^0.8.1", "@ovh-ux/manager-tailwind-config": "^0.2.1", @@ -30,6 +30,7 @@ "@ovhcloud/ods-theme-blue-jeans": "17.2.2", "@tanstack/react-query": "^5.51.21", "@tanstack/react-table": "^8.20.1", + "clsx": "^2.1.1", "element-internals-polyfill": "^1.3.12", "i18next": "^23.8.2", "i18next-http-backend": "^2.5.2", diff --git a/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_de_DE.json b/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_de_DE.json new file mode 100644 index 000000000000..0bf2e76e1646 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_de_DE.json @@ -0,0 +1,10 @@ +{ + "pci_projects_project_storages_containers_add_linked_user_success_message": "Die S3-Login-Daten für den Nutzer {{username}} sind verfügbar.", + "pci_projects_project_storages_containers_add_create_user_success_message": "Der S3-Nutzer {{username}} wurde mit folgenden Login-Daten erstellt:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_fail_message": "Die S3-Login-Daten wurden nicht erstellt.", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_credential_fail_message": "Es war nicht möglich, den Nutzer {{username}} zu erstellen.", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_username_label": "Ihr S3-Nutzername:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_description_label": "Ihre Beschreibung:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_access-key_label": "Ihr S3-Zugangsschlüssel:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_secret-key_label": "Ihr geheimer S3-Schlüssel:" +} diff --git a/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_en_GB.json b/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_en_GB.json new file mode 100644 index 000000000000..236c2aadb7de --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_en_GB.json @@ -0,0 +1,10 @@ +{ + "pci_projects_project_storages_containers_add_linked_user_success_message": "S3 credentials for user {{username}} are available.", + "pci_projects_project_storages_containers_add_create_user_success_message": "The S3 user {{username}} was generated with the following credentials:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_fail_message": "S3 credentials not generated.", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_credential_fail_message": "Failed to create user {{username}}.", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_username_label": "Your S3 username:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_description_label": "Your description:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_access-key_label": "Your S3 access key:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_secret-key_label": "Your S3 secret key:" +} diff --git a/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_es_ES.json b/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_es_ES.json new file mode 100644 index 000000000000..3834a1520686 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_es_ES.json @@ -0,0 +1,10 @@ +{ + "pci_projects_project_storages_containers_add_linked_user_success_message": "Las claves de conexión S3 del usuario {{username}} ya están disponibles.", + "pci_projects_project_storages_containers_add_create_user_success_message": "Se ha generado el usuario S3 {{username}} con las siguientes claves de conexión:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_fail_message": "No se han generado las claves de conexión S3.", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_credential_fail_message": "No se ha podido crear el usuario {{username}}.", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_username_label": "Su nombre de usuario S3:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_description_label": "Su descripción:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_access-key_label": "Su clave de acceso S3:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_secret-key_label": "Su llave secreta S3:" +} diff --git a/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_fr_CA.json b/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_fr_CA.json new file mode 100644 index 000000000000..3e285c260215 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_fr_CA.json @@ -0,0 +1,10 @@ +{ + "pci_projects_project_storages_containers_add_linked_user_success_message": "Les informations d'identification S3 pour l'utilisateur {{username}} sont disponibles.", + "pci_projects_project_storages_containers_add_create_user_success_message": "L'utilisateur s3 {{username}} a été généré avec les informations d'identification suivantes :", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_fail_message": "Les informations d'identification S3 n'ont pas été générées.", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_credential_fail_message": "La création de l'utilisateur {{username}} a échoué.", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_username_label": "Votre nom d'utilisateur S3 :", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_description_label": "Votre description :", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_access-key_label": "Votre clé d'accès S3 :", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_secret-key_label": "Votre clé secrète S3 :" +} diff --git a/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_fr_FR.json b/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_fr_FR.json new file mode 100644 index 000000000000..3e285c260215 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_fr_FR.json @@ -0,0 +1,10 @@ +{ + "pci_projects_project_storages_containers_add_linked_user_success_message": "Les informations d'identification S3 pour l'utilisateur {{username}} sont disponibles.", + "pci_projects_project_storages_containers_add_create_user_success_message": "L'utilisateur s3 {{username}} a été généré avec les informations d'identification suivantes :", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_fail_message": "Les informations d'identification S3 n'ont pas été générées.", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_credential_fail_message": "La création de l'utilisateur {{username}} a échoué.", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_username_label": "Votre nom d'utilisateur S3 :", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_description_label": "Votre description :", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_access-key_label": "Votre clé d'accès S3 :", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_secret-key_label": "Votre clé secrète S3 :" +} diff --git a/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_it_IT.json b/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_it_IT.json new file mode 100644 index 000000000000..5009dfe7b992 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_it_IT.json @@ -0,0 +1,10 @@ +{ + "pci_projects_project_storages_containers_add_linked_user_success_message": "Le informazioni di identificazione S3 per l'utente {{username}} sono disponibili.", + "pci_projects_project_storages_containers_add_create_user_success_message": "L'utente S3 {{username}} è stato generato con queste informazioni di identificazione:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_fail_message": "Le informazioni di identificazione S3 non sono state generate.", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_credential_fail_message": "La creazione dell'utente {{username}} non è andata a buon fine.", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_username_label": "Il tuo nome utente S3:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_description_label": "La tua descrizione:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_access-key_label": "La tua chiave di accesso S3:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_secret-key_label": "La tua chiave segreta S3:" +} diff --git a/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_pl_PL.json b/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_pl_PL.json new file mode 100644 index 000000000000..91e268676dac --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_pl_PL.json @@ -0,0 +1,10 @@ +{ + "pci_projects_project_storages_containers_add_linked_user_success_message": "Dane identyfikacyjne S3 dla użytkownika {{username}} są dostępne.", + "pci_projects_project_storages_containers_add_create_user_success_message": "Użytkownik S3 {{username}} został wygenerowany z następującymi danymi identyfikacyjnymi:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_fail_message": "Dane identyfikacyjne S3 nie zostały wygenerowane.", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_credential_fail_message": "Utworzenie użytkownika {{username}} nie powiodło się.", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_username_label": "Nazwa użytkownika S3:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_description_label": "Opis:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_access-key_label": "Klucz dostępowy S3:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_secret-key_label": "Tajny klucz S3:" +} diff --git a/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_pt_PT.json b/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_pt_PT.json new file mode 100644 index 000000000000..8562c7511ada --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/credential-banner/Messages_pt_PT.json @@ -0,0 +1,10 @@ +{ + "pci_projects_project_storages_containers_add_linked_user_success_message": "As informações de identificação S3 para o utilizador {{username}} estão disponíveis.", + "pci_projects_project_storages_containers_add_create_user_success_message": "O utilizador S3 {{username}} foi gerado com as seguintes informações de identificação:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_fail_message": "As informações de identificação S3 não foram geradas.", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_credential_fail_message": "A criação do utilizador {{username}} falhou.", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_username_label": "O seu nome de utilizador S3:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_description_label": "A sua descrição:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_access-key_label": "A sua chave de acesso S3:", + "pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_secret-key_label": "A sua chave secreta S3:" +} diff --git a/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_de_DE.json b/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_de_DE.json new file mode 100644 index 000000000000..a27a107fe35b --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_de_DE.json @@ -0,0 +1,18 @@ +{ + "pci_projects_project_users_add_title": "Einen S3-Nutzer hinzufügen", + "pci_projects_project_users_add_short_description": "Bitte fügen Sie Ihrem Container einen Nutzer hinzu, um auf den Object Storage zuzugreifen. Wählen Sie dazu einen bestehenden Nutzer aus, oder erstellen Sie einen neuen. Jedem Nutzer (OpenStack) wird ein oder mehrere Paare von S3-Schlüsseln, die S3-Zugangsdaten, zugewiesen. Sie bestehen jeweils aus einem „Access Key“ und einem „Secret Key“.", + "pci_projects_project_users_add_submit_label": "Erstellen", + "pci_projects_project_users_add_cancel_label": "Abbrechen", + "pci_projects_project_users_add_description_label": "Beschreibung des Nutzers", + "pci_projects_project_users_add_existing_user": "Einen bestehenden Nutzer auswählen", + "pci_projects_project_users_add_create_user": "Einen neuen Nutzer erstellen", + "pci_projects_project_users_add_success_message": "Die S3-Login-Daten für den Nutzer {{user}} wurden erstellt.", + "pci_projects_project_users_add_error_message": "Die S3-Login-Daten für den Nutzer {{user}} konnten nicht erstellt werden.", + "pci_projects_project_users_add_username": "Ihr OpenStack-Nutzername:", + "pci_projects_project_users_add_description": "Ihre Beschreibung:", + "pci_projects_project_users_add_accesskey": "Ihr S3-Zugangsschlüssel:", + "pci_projects_project_users_add_secretkey": "Ihr geheimer S3-Schlüssel:", + "pci_projects_project_users_add_as_no_credentials": "Keine Zugangsdaten", + "pci_projects_project_users_add_as_credentials": "Erstellte Zugangsdaten", + "pci_projects_project_users_add_info_banner": "Neue User haben automatisch Zugriff auf alle Container in den Local Zones." +} diff --git a/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_en_GB.json b/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_en_GB.json new file mode 100644 index 000000000000..88c0c1aa9e0d --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_en_GB.json @@ -0,0 +1,18 @@ +{ + "pci_projects_project_users_add_title": "Add S3 user", + "pci_projects_project_users_add_short_description": "To access object storage, please add a user to your container. You can select an existing user or create a new user. Each user (OpenStack) will be linked to one or more S3 key pairs (S3 credentials), each consisting of an 'Access Key' and a 'Secret Key'.", + "pci_projects_project_users_add_submit_label": "Create", + "pci_projects_project_users_add_cancel_label": "Cancel", + "pci_projects_project_users_add_description_label": "User description", + "pci_projects_project_users_add_existing_user": "Select an existing user", + "pci_projects_project_users_add_create_user": "Create a new user", + "pci_projects_project_users_add_success_message": "S3 credentials for user {{user}} have been generated", + "pci_projects_project_users_add_error_message": "S3 credentials for user {{user}} could not be generated.", + "pci_projects_project_users_add_username": "Your OpenStack username:", + "pci_projects_project_users_add_description": "Your description:", + "pci_projects_project_users_add_accesskey": "Your S3 access key:", + "pci_projects_project_users_add_secretkey": "Your S3 secret key:", + "pci_projects_project_users_add_as_no_credentials": "No credentials", + "pci_projects_project_users_add_as_credentials": "Credentials generated", + "pci_projects_project_users_add_info_banner": "New users will automatically have access to all containers in Local Zones." +} diff --git a/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_es_ES.json b/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_es_ES.json new file mode 100644 index 000000000000..e7df7f4fc133 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_es_ES.json @@ -0,0 +1,18 @@ +{ + "pci_projects_project_users_add_title": "Añadir un usuario S3", + "pci_projects_project_users_add_short_description": "Añada un usuario a su contenedor para acceder al almacenamiento de objetos. Puede seleccionar un usuario existente o crear uno nuevo. Cada usuario (OpenStack) se asociará a uno o más pares de claves S3 compuestas cada una por una clave de acceso («Access Key») y una clave secreta («Secret Key»).", + "pci_projects_project_users_add_submit_label": "Crear", + "pci_projects_project_users_add_cancel_label": "Cancelar", + "pci_projects_project_users_add_description_label": "Descripción del usuario", + "pci_projects_project_users_add_existing_user": "Seleccionar un usuario existente", + "pci_projects_project_users_add_create_user": "Crear un nuevo usuario", + "pci_projects_project_users_add_success_message": "Se han generado las claves de conexión S3 del usuario {{user}}.", + "pci_projects_project_users_add_error_message": "No se han podido generar las claves de conexión S3 para el usuario {{user}}.", + "pci_projects_project_users_add_username": "Su nombre de usuario OpenStack:", + "pci_projects_project_users_add_description": "Su descripción:", + "pci_projects_project_users_add_accesskey": "Su clave de acceso S3:", + "pci_projects_project_users_add_secretkey": "Su clave secreta S3:", + "pci_projects_project_users_add_as_no_credentials": "Sin claves", + "pci_projects_project_users_add_as_credentials": "Claves generadas", + "pci_projects_project_users_add_info_banner": "Los nuevos usuarios tendrán acceso automáticamente a todos los contenedores en las Local Zones." +} diff --git a/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_fr_CA.json b/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_fr_CA.json new file mode 100644 index 000000000000..190ea486d85e --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_fr_CA.json @@ -0,0 +1,18 @@ +{ + "pci_projects_project_users_add_title": "Ajouter un utilisateur S3", + "pci_projects_project_users_add_short_description": "Afin d'accéder au stockage objet, veuillez ajouter un utilisateur à votre conteneur. Vous pouvez sélectionner un utilisateur existant ou en créer un nouveau. Chaque utilisateur (OpenStack) sera associé à une ou plusieurs paires de clés S3 (les credentials S3) composées chacune d'un 'Access Key' et d'un 'Secret Key'.", + "pci_projects_project_users_add_submit_label": "Créer", + "pci_projects_project_users_add_cancel_label": "Annuler", + "pci_projects_project_users_add_description_label": "Description de l'utilisateur", + "pci_projects_project_users_add_existing_user": "Sélectionner un utilisateur existant", + "pci_projects_project_users_add_create_user": "Créer un nouvel utilisateur", + "pci_projects_project_users_add_success_message": "Les informations d'identification S3 pour l'utilisateur {{user}} ont été générées", + "pci_projects_project_users_add_error_message": "Les informations d'identification S3 pour l'utilisateur {{user}} n'ont pas pu être générées.", + "pci_projects_project_users_add_username": "Votre nom d'utilisateur OpenStack :", + "pci_projects_project_users_add_description": "Votre description :", + "pci_projects_project_users_add_accesskey": "Votre clé d'accès S3 :", + "pci_projects_project_users_add_secretkey": "Votre clé secrète S3 :", + "pci_projects_project_users_add_as_no_credentials": "Pas de credentials", + "pci_projects_project_users_add_as_credentials": "Credentials générés", + "pci_projects_project_users_add_info_banner": "Les nouveaux utilisateurs auront automatiquement accès à tous les conteneurs dans les Local Zones." +} diff --git a/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_fr_FR.json b/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_fr_FR.json new file mode 100644 index 000000000000..190ea486d85e --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_fr_FR.json @@ -0,0 +1,18 @@ +{ + "pci_projects_project_users_add_title": "Ajouter un utilisateur S3", + "pci_projects_project_users_add_short_description": "Afin d'accéder au stockage objet, veuillez ajouter un utilisateur à votre conteneur. Vous pouvez sélectionner un utilisateur existant ou en créer un nouveau. Chaque utilisateur (OpenStack) sera associé à une ou plusieurs paires de clés S3 (les credentials S3) composées chacune d'un 'Access Key' et d'un 'Secret Key'.", + "pci_projects_project_users_add_submit_label": "Créer", + "pci_projects_project_users_add_cancel_label": "Annuler", + "pci_projects_project_users_add_description_label": "Description de l'utilisateur", + "pci_projects_project_users_add_existing_user": "Sélectionner un utilisateur existant", + "pci_projects_project_users_add_create_user": "Créer un nouvel utilisateur", + "pci_projects_project_users_add_success_message": "Les informations d'identification S3 pour l'utilisateur {{user}} ont été générées", + "pci_projects_project_users_add_error_message": "Les informations d'identification S3 pour l'utilisateur {{user}} n'ont pas pu être générées.", + "pci_projects_project_users_add_username": "Votre nom d'utilisateur OpenStack :", + "pci_projects_project_users_add_description": "Votre description :", + "pci_projects_project_users_add_accesskey": "Votre clé d'accès S3 :", + "pci_projects_project_users_add_secretkey": "Votre clé secrète S3 :", + "pci_projects_project_users_add_as_no_credentials": "Pas de credentials", + "pci_projects_project_users_add_as_credentials": "Credentials générés", + "pci_projects_project_users_add_info_banner": "Les nouveaux utilisateurs auront automatiquement accès à tous les conteneurs dans les Local Zones." +} diff --git a/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_it_IT.json b/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_it_IT.json new file mode 100644 index 000000000000..e8ea26dc7eb8 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_it_IT.json @@ -0,0 +1,18 @@ +{ + "pci_projects_project_users_add_title": "Aggiungi un utente S3", + "pci_projects_project_users_add_short_description": "Aggiungi un utente al tuo container per accedere all’object storage. È possibile selezionare un utente esistente o crearne uno nuovo. Ogni utente (OpenStack) sarà associato a una o più coppie di chiavi S3 (credenziali S3) composte da a chiave di accesso (Access Key) e una chiave segreta (Secret Key).", + "pci_projects_project_users_add_submit_label": "Crea", + "pci_projects_project_users_add_cancel_label": "Annullare", + "pci_projects_project_users_add_description_label": "Descrizione dell'utente", + "pci_projects_project_users_add_existing_user": "Seleziona un utente esistente", + "pci_projects_project_users_add_create_user": "Crea un nuovo utente", + "pci_projects_project_users_add_success_message": "Le informazioni di identificazione S3 per l'utente {{user}} sono state generate", + "pci_projects_project_users_add_error_message": "Impossibile generare le informazioni di identificazione S3 per l'utente {{user}}.", + "pci_projects_project_users_add_username": "Il tuo nome utente OpenStack:", + "pci_projects_project_users_add_description": "La tua descrizione:", + "pci_projects_project_users_add_accesskey": "La tua chiave di accesso S3:", + "pci_projects_project_users_add_secretkey": "La tua chiave segreta S3:", + "pci_projects_project_users_add_as_no_credentials": "Nessuna credenziale", + "pci_projects_project_users_add_as_credentials": "Credenziali generate", + "pci_projects_project_users_add_info_banner": "I nuovi utenti avranno automaticamente accesso a tutti i container nelle Local Zone." +} diff --git a/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_pl_PL.json b/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_pl_PL.json new file mode 100644 index 000000000000..653b6bed0ce1 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_pl_PL.json @@ -0,0 +1,18 @@ +{ + "pci_projects_project_users_add_title": "Dodaj użytkownika S3", + "pci_projects_project_users_add_short_description": "Aby uzyskać dostęp do Object Storage, dodaj użytkownika do Twojego kontenera. Możesz wybrać istniejącego użytkownika lub utworzyć nowego. Każdy użytkownik (OpenStack) będzie przypisany do jednej lub kilku par kluczy S3 (poświadczenia S3) składających się z „Access Key” i „Secret Key”.", + "pci_projects_project_users_add_submit_label": "Utwórz", + "pci_projects_project_users_add_cancel_label": "Anuluj", + "pci_projects_project_users_add_description_label": "Opis użytkownika", + "pci_projects_project_users_add_existing_user": "Wybierz istniejącego użytkownika", + "pci_projects_project_users_add_create_user": "Utwórz nowego użytkownika", + "pci_projects_project_users_add_success_message": "Dane identyfikacyjne S3 dla użytkownika {{user}} zostały wygenerowane.", + "pci_projects_project_users_add_error_message": "Dane identyfikacyjne S3 dla użytkownika {{user}} nie mogły zostać wygenerowane.", + "pci_projects_project_users_add_username": "Nazwa użytkownika OpenStack:", + "pci_projects_project_users_add_description": "Opis:", + "pci_projects_project_users_add_accesskey": "Klucz dostępowy S3:", + "pci_projects_project_users_add_secretkey": "Tajny klucz S3:", + "pci_projects_project_users_add_as_no_credentials": "Brak poświadczeń", + "pci_projects_project_users_add_as_credentials": "Poświadczenia zostały wygenerowane", + "pci_projects_project_users_add_info_banner": "Nowi użytkownicy będą mieli automatycznie dostęp do wszystkich kontenerów w Local Zones." +} diff --git a/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_pt_PT.json b/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_pt_PT.json new file mode 100644 index 000000000000..a4070b16b1e6 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/objects/users/add/Messages_pt_PT.json @@ -0,0 +1,18 @@ +{ + "pci_projects_project_users_add_title": "Adicionar um utilizador S3", + "pci_projects_project_users_add_short_description": "Para aceder ao armazenamento de objetos, adicione um utilizador ao seu container. Pode selecionar um utilizador existente ou criar um novo utilizador. Cada utilizador (OpenStack) estará associado a um ou vários pares de chaves S3 (credenciais S3), cada um deles composto por um “Access Key” e um “Secret Key”.", + "pci_projects_project_users_add_submit_label": "Criar", + "pci_projects_project_users_add_cancel_label": "Anular", + "pci_projects_project_users_add_description_label": "Descrição do utilizador", + "pci_projects_project_users_add_existing_user": "Selecionar um utilizador existente", + "pci_projects_project_users_add_create_user": "Criar um novo utilizador", + "pci_projects_project_users_add_success_message": "As informações de identificação S3 para o utilizador {{user}} foram geradas.", + "pci_projects_project_users_add_error_message": "Não foi possível gerar as informações de identificação S3 para o utilizador {{user}}.", + "pci_projects_project_users_add_username": "O seu nome de utilizador OpenStack:", + "pci_projects_project_users_add_description": "A sua descrição:", + "pci_projects_project_users_add_accesskey": "A sua chave de acesso S3:", + "pci_projects_project_users_add_secretkey": "A sua chave secreta S3:", + "pci_projects_project_users_add_as_no_credentials": "Sem credenciais", + "pci_projects_project_users_add_as_credentials": "Credenciais geradas", + "pci_projects_project_users_add_info_banner": "Os novos utilizadores terão automaticamente acesso a todos os containers nas Local Zones." +} diff --git a/packages/manager/apps/pci-object-storage/src/api/data/user.ts b/packages/manager/apps/pci-object-storage/src/api/data/user.ts index 4331eb3ec36a..5af4edd77167 100644 --- a/packages/manager/apps/pci-object-storage/src/api/data/user.ts +++ b/packages/manager/apps/pci-object-storage/src/api/data/user.ts @@ -1,20 +1,40 @@ import { v6 } from '@ovh-ux/manager-core-api'; +import { OBJECT_STORAGE_USER_ROLE } from '@/constants'; export type TS3Credentials = { userId: string; tenantId: string; access: string; + secret: string; }; export type TUser = { - id: number; + id: string; username: string; creationDate: string; description: string; openstackId: string; - status: string; + // TODO add status when necessery + status: 'creating' | 'ok'; access?: string; search?: string; + password: string; + roles: { + id: string; + name: string; + description: string; + permissions: string[]; + }[]; +}; + +export const getUser = async ( + projectId: string, + userId: string, +): Promise => { + const { data } = await v6.get( + `/cloud/project/${projectId}/user/${userId}`, + ); + return data; }; export const getAllUsers = async (projectId: string): Promise => { @@ -32,16 +52,6 @@ export const getS3Credentials = async ( return data; }; -export const getUser = async ( - projectId: string, - userId: string, -): Promise => { - const { data } = await v6.get( - `/cloud/project/${projectId}/user/${userId}`, - ); - return data; -}; - export const deleteUser = async ( projectId: string, userId: string, @@ -53,7 +63,7 @@ export const deleteUser = async ( }; export const getUserStoragePolicy = async ( projectId: string, - userId: number, + userId: string, ): Promise<{ policy: string }> => { const { data } = await v6.get( `/cloud/project/${projectId}/user/${userId}/policy`, @@ -63,7 +73,7 @@ export const getUserStoragePolicy = async ( export const postS3Secret = async ( projectId: string, - userId: number, + userId: string, userAccess: string, ): Promise<{ secret: string }> => { const { data } = await v6.post( @@ -86,3 +96,26 @@ export const importUserPolicy = async ( ); return data; }; + +export const generateS3Credentials = async ( + projectId: string, + userId: string, +): Promise => { + const { data } = await v6.post( + `/cloud/project/${projectId}/user/${userId}/s3Credentials`, + ); + return data; +}; + +export const createUser = async ( + projectId: string, + description: string, + role: string = OBJECT_STORAGE_USER_ROLE, +): Promise => { + const { data } = await v6.post(`/cloud/project/${projectId}/user`, { + description, + role, + }); + + return data; +}; diff --git a/packages/manager/apps/pci-object-storage/src/api/hooks/useUser.tsx b/packages/manager/apps/pci-object-storage/src/api/hooks/useUser.ts similarity index 83% rename from packages/manager/apps/pci-object-storage/src/api/hooks/useUser.tsx rename to packages/manager/apps/pci-object-storage/src/api/hooks/useUser.ts index 39f749315984..8f93e1392718 100644 --- a/packages/manager/apps/pci-object-storage/src/api/hooks/useUser.tsx +++ b/packages/manager/apps/pci-object-storage/src/api/hooks/useUser.ts @@ -3,7 +3,7 @@ import { ColumnSort, PaginationState } from '@ovh-ux/manager-react-components'; import { ApiError, applyFilters, Filter } from '@ovh-ux/manager-core-api'; import { useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { isJson, paginateResults, sortResults } from '@/helpers'; +import { isJson, paginateResults, sortResults } from '../../helpers'; import { deleteUser, getAllUsers, @@ -12,8 +12,8 @@ import { postS3Secret, TS3Credentials, TUser, -} from '@/api/data/user'; -import queryClient from '@/queryClient'; +} from '../data/user'; +import queryClient from '../../queryClient'; const getQueryKeyUsers = (projectId: string) => ['project', projectId, 'users']; @@ -25,10 +25,10 @@ export const useAllUsers = (projectId: string) => export const useUsers = (projectId: string) => { const { data: users, isPending } = useAllUsers(projectId); - return useQueries({ + const allUsersQueries = useQueries({ queries: (users || [])?.map((user) => ({ queryKey: [...getQueryKeyUsers(projectId), user.id, 's3Credentials'], - queryFn: () => getS3Credentials(projectId, `${user.id}`), + queryFn: () => getS3Credentials(projectId, user.id), enabled: !isPending, select: (s3Credentials: TS3Credentials[]) => s3Credentials[0], })), @@ -41,18 +41,32 @@ export const useUsers = (projectId: string) => { (result) => result.data?.userId === user.openstackId, )?.data; - if (s3Credentials) { - all.push({ - ...user, - access: s3Credentials.access, - search: `${user.username} ${user.description} ${s3Credentials.access}`, - }); - } + all.push({ + ...user, + access: s3Credentials?.access, + search: `${user.username} ${user.description} ${ + s3Credentials ? s3Credentials?.access : '' + }`.trimEnd(), + }); return all; }, []), }), }); + + const allUsers = allUsersQueries.data; + const validUsers = allUsers?.filter((user) => user.status === 'ok'); + const validUsersWithCredentials = validUsers?.filter((user) => !!user.access); + const validUsersWithoutCredentials = validUsers?.filter( + (user) => !user.access, + ); + + return { + ...allUsersQueries, + validUsers, + validUsersWithCredentials, + validUsersWithoutCredentials, + }; }; export const usePaginatedUsers = ( @@ -111,7 +125,7 @@ export const useDeleteUser = ({ type UsePostS3SecretParams = { projectId: string; - userId: number; + userId: string; userAccess: string; onSuccess: ({ secret }: { secret: string }) => void; onError: (cause: ApiError) => void; diff --git a/packages/manager/apps/pci-object-storage/src/constants.ts b/packages/manager/apps/pci-object-storage/src/constants.ts index 0c4de8903f0f..12f2db1cce2f 100644 --- a/packages/manager/apps/pci-object-storage/src/constants.ts +++ b/packages/manager/apps/pci-object-storage/src/constants.ts @@ -74,3 +74,7 @@ export const STANDARD_S3 = [ ]; export const DOWNLOAD_FILENAME = 'import.json'; export const DOWNLOAD_TYPE = 'application/json"'; + +export const OBJECT_STORAGE_USER_ROLE = 'objectstore_operator'; + +export const TRACKING_S3_POLICY_ADD = 's3-policies-users::add'; diff --git a/packages/manager/apps/pci-object-storage/src/pages/objects/container/users/Create.page.tsx b/packages/manager/apps/pci-object-storage/src/pages/objects/container/users/Create.page.tsx new file mode 100644 index 000000000000..600649ccc5ef --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/objects/container/users/Create.page.tsx @@ -0,0 +1,408 @@ +import { PciModal } from '@ovh-ux/manager-pci-common'; +import { useTranslation } from 'react-i18next'; +import { + OsdsText, + OsdsMessage, + OsdsRadioButton, + OsdsRadio, + OsdsSelectOption, + OsdsSelect, + OsdsFormField, + OsdsInput, +} from '@ovhcloud/ods-components/react'; +import { + ODS_INPUT_TYPE, + ODS_MESSAGE_TYPE, + ODS_RADIO_BUTTON_SIZE, +} from '@ovhcloud/ods-components'; +import { + ODS_THEME_COLOR_INTENT, + ODS_THEME_TYPOGRAPHY_LEVEL, + ODS_THEME_TYPOGRAPHY_SIZE, +} from '@ovhcloud/ods-common-theming'; +import { useContext, useEffect, useState } from 'react'; +import clsx from 'clsx'; +import { useNavigate, useParams } from 'react-router-dom'; +import { ShellContext } from '@ovh-ux/manager-react-shell-client'; +import { useNotifications, Clipboard } from '@ovh-ux/manager-react-components'; +import { useUsers } from '@/api/hooks/useUser'; +import { + createUser, + generateS3Credentials, + getUser, + TUser, +} from '@/api/data/user'; +import { poll } from '@/utils'; +import { TRACKING_PREFIX, TRACKING_S3_POLICY_ADD } from '@/constants'; +import queryClient from '@/queryClient'; + +type TState = { + userType?: 'new' | 'existing'; + selectedUserId?: string; + userDescription: { + value: string; + isTouched: boolean; + }; + isLoading: boolean; +}; + +export default function UserCreatePage(): JSX.Element { + const { t: tAdd } = useTranslation('objects/users/add'); + const { t: tCredential } = useTranslation('credential-banner'); + + const navigate = useNavigate(); + + const goBack = () => { + navigate('..'); + }; + + const { addSuccess, addError } = useNotifications(); + + const { tracking } = useContext(ShellContext).shell; + + const [state, setState] = useState({ + userDescription: { + value: '', + isTouched: false, + }, + isLoading: false, + }); + + const trackClick = (name: string) => { + tracking?.trackClick({ + name, + type: 'action', + }); + }; + + const trackPage = (name: string) => { + tracking?.trackPage({ + name: `${TRACKING_PREFIX}::${name}`, + type: 'navigation', + }); + }; + + const { projectId } = useParams(); + + const { validUsersWithoutCredentials } = useUsers(projectId); + + const onSuccess = ({ + username, + description, + access, + secret, + }: { + username: string; + description: string; + access: string; + secret: string; + }) => { + const content = ( + <> +
+ {tCredential( + 'pci_projects_project_storages_containers_add_linked_user_success_message', + { username }, + )} +
+
+
+ + + {tCredential( + 'pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_username_label', + )} + + + +
+
+ + + {tCredential( + 'pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_access-key_label', + )} + + + +
+
+ + + {tCredential( + 'pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_description_label', + )} + + + +
+
+ + + {tCredential( + 'pci_projects_project_storages_containers_add_create_or_linked_user_create_user_success_secret-key_label', + )} + + + +
+
+ + ); + addSuccess(content, true); + queryClient.invalidateQueries({ + queryKey: ['project', projectId, 'users'], + }); + goBack(); + }; + + const onConfirm = async () => { + trackClick(`${TRACKING_S3_POLICY_ADD}::confirm`); + setState({ ...state, isLoading: true }); + if (state.userType === 'new') { + try { + const newUser = await createUser( + projectId, + state.userDescription.value, + ); + + poll({ + fn: () => getUser(projectId, newUser.id), + ruleFn: (user: TUser) => user.status === 'ok', + onSuccess: async ({ value }) => { + try { + const credentials = await generateS3Credentials( + projectId, + value.id, + ); + setState({ ...state, isLoading: false }); + onSuccess({ + username: value.username, + description: value.description, + access: credentials.access, + secret: credentials.secret, + }); + } catch (e) { + trackPage(`${TRACKING_S3_POLICY_ADD}-error`); + addError( + tAdd('pci_projects_project_users_add_error_message', { + user: value.description, + }), + ); + setState({ ...state, isLoading: false }); + goBack(); + } + }, + onFail: () => { + trackPage(`${TRACKING_S3_POLICY_ADD}-error`); + addError( + tAdd('pci_projects_project_users_add_error_message', { + user: newUser.description, + }), + ); + setState({ ...state, isLoading: false }); + goBack(); + }, + }); + } catch (e) { + addError(tAdd('pci_projects_project_users_add_error_message')); + } + } + if (state.userType === 'existing') { + const targetUser = validUsersWithoutCredentials?.find( + (user) => user.id === state.selectedUserId, + ); + if (targetUser) { + try { + const credentials = await generateS3Credentials( + projectId, + targetUser.id, + ); + setState({ ...state, isLoading: false }); + onSuccess({ + username: targetUser.username, + description: targetUser.description, + access: credentials.access, + secret: credentials.secret, + }); + } catch (e) { + trackPage(`${TRACKING_S3_POLICY_ADD}-error`); + addError( + tAdd('pci_projects_project_users_add_error_message', { + user: targetUser.description, + }), + ); + setState({ ...state, isLoading: false }); + goBack(); + } + } + } + }; + + const onCancel = () => { + trackClick(`${TRACKING_S3_POLICY_ADD}::cancel`); + goBack(); + }; + + const onClose = () => { + goBack(); + }; + + useEffect(() => { + if ( + state.userType === 'existing' && + validUsersWithoutCredentials?.length > 0 + ) { + setState({ + ...state, + selectedUserId: validUsersWithoutCredentials[0].id, + }); + } + }, [state.userType]); + + return ( + + {validUsersWithoutCredentials?.length > 0 && ( + + + {tAdd('pci_projects_project_users_add_info_banner')} + + + )} +

+ + {tAdd('pci_projects_project_users_add_short_description')} + +

+
+ {validUsersWithoutCredentials?.length > 0 && ( + + { + setState({ ...state, userType: 'existing' }); + }} + > + + {tAdd('pci_projects_project_users_add_existing_user')} + + + + )} + {state.userType === 'existing' && ( +
+ { + setState({ + ...state, + selectedUserId: event.detail.value as string, + }); + }} + className="ml-10 mt-4" + > + {validUsersWithoutCredentials?.map((user) => ( + + {user.username} - {user.description} + + ))} + +
+ )} + + { + setState({ ...state, userType: 'new' }); + }} + > + + {tAdd('pci_projects_project_users_add_create_user')} + + + + {state.userType === 'new' && ( + + + {tAdd('pci_projects_project_users_add_description_label')} + + { + setState({ + ...state, + userDescription: { + value: event.detail.value as string, + isTouched: true, + }, + }); + }} + /> + + )} +
+
+ ); +} diff --git a/packages/manager/apps/pci-object-storage/src/pages/objects/container/users/Listing.page.tsx b/packages/manager/apps/pci-object-storage/src/pages/objects/container/users/Listing.page.tsx index 7b38d147b7fc..c458b954d1ad 100644 --- a/packages/manager/apps/pci-object-storage/src/pages/objects/container/users/Listing.page.tsx +++ b/packages/manager/apps/pci-object-storage/src/pages/objects/container/users/Listing.page.tsx @@ -108,7 +108,7 @@ export default function Listing() { className="xs:mb-0.5 sm:mb-0" onClick={() => { clearNotifications(); - navigate('../create'); + navigate('./new'); }} > navigate(`..`); const onCancel = () => navigate(`..`); const [user, setUser] = useState(undefined); - const { data: listUsers, isPending: isPendingUsers } = useUsers(projectId); + const { + validUsersWithCredentials: listUsers, + isPending: isPendingUsers, + } = useUsers(projectId); const { deleteUser, isPending: isPendingDelete } = useDeleteUser({ projectId, userId, diff --git a/packages/manager/apps/pci-object-storage/src/pages/objects/container/users/import-policy/ImportPolicy.page.tsx b/packages/manager/apps/pci-object-storage/src/pages/objects/container/users/import-policy/ImportPolicy.page.tsx index a1b1398f3dbc..823d39d05922 100644 --- a/packages/manager/apps/pci-object-storage/src/pages/objects/container/users/import-policy/ImportPolicy.page.tsx +++ b/packages/manager/apps/pci-object-storage/src/pages/objects/container/users/import-policy/ImportPolicy.page.tsx @@ -18,7 +18,10 @@ export default function ImportPolicyPage() { const [searchParams] = useSearchParams(); const userId = searchParams.get('userId'); const [user, setUser] = useState(undefined); - const { data: listUsers, isPending: isPendingUsers } = useUsers(projectId); + const { + validUsersWithCredentials: listUsers, + isPending: isPendingUsers, + } = useUsers(projectId); const { t } = useTranslation('objects/users/import-policy'); const [filesToUpload, setFilesToUpload] = useState([]); const navigate = useNavigate(); diff --git a/packages/manager/apps/pci-object-storage/src/routes.tsx b/packages/manager/apps/pci-object-storage/src/routes.tsx index fd56af7aac51..c60bd3f3e3c1 100644 --- a/packages/manager/apps/pci-object-storage/src/routes.tsx +++ b/packages/manager/apps/pci-object-storage/src/routes.tsx @@ -7,6 +7,7 @@ export const ROUTE_PATHS = { OBJECTS: '', CONTAINER_DELETE: 'delete', USER_LIST: 'users', + USER_CREATE: 'new', USER_DELETE: ':userId/delete', USER_IMPORT_POLICY: 'import-policy', }; @@ -23,6 +24,9 @@ const DeleteContainerPage = lazy(() => const UserListPage = lazy(() => import('@/pages/objects/container/users/Listing.page'), ); +const UserCreatePage = lazy(() => + import('@/pages/objects/container/users/Create.page'), +); const DeleteUserPage = lazy(() => import('@/pages/objects/container/users/delete/Delete.page'), ); @@ -42,6 +46,7 @@ const RoutesComponent = () => ( /> + = { + fn: () => Promise; + ruleFn: (value: T) => boolean; + maxTries?: number; + interval?: number; + onSuccess?: ({ value, iteration }: { value: T; iteration: number }) => void; + onFail?: (iteration: number) => void; +}; + +export const poll = async (param: TParam, iteration = 0) => { + const [maxTries, interval] = [param.maxTries || 10, param.interval || 5000]; + if (iteration < maxTries) { + const value: T = await param.fn(); + if (param.ruleFn(value)) { + param?.onSuccess({ value, iteration }); + } else { + setTimeout(() => poll(param, iteration + 1), interval); + } + } else { + param?.onFail(iteration); + } +}; + export const downloadContent = ({ - fileContent, - fileName, - downloadType, -}: { + fileContent, + fileName, + downloadType, + }: { fileContent: string; fileName: string; downloadType: string; @@ -17,3 +40,5 @@ export const downloadContent = ({ document.body.removeChild(link); }; + + diff --git a/yarn.lock b/yarn.lock index cf61fb6f3df6..67960255325c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5165,6 +5165,26 @@ tailwindcss "^3.4.4" uuid "^9.0.1" +"@ovh-ux/manager-react-components@^1.43.0": + version "1.43.0" + resolved "https://registry.yarnpkg.com/@ovh-ux/manager-react-components/-/manager-react-components-1.43.0.tgz#dc6ec7f3636510792c425e617d25c7b6d39a3041" + integrity sha512-ipxEFvXrTv15IQqyLuwlkLHeqIE7U0B1yugcGSmYsgQ6yokP74+7TNEyt7JqpVwt+spszRIBv+MnVPqvq24LPg== + dependencies: + "@ovhcloud/ods-common-core" "17.2.2" + "@ovhcloud/ods-common-theming" "17.2.2" + "@ovhcloud/ods-components" "17.2.2" + "@ovhcloud/ods-theme-blue-jeans" "17.2.2" + "@tanstack/react-query" "^5.51.21" + "@tanstack/react-table" "^8.20.1" + clsx "^2.1.1" + lodash.isdate "^4.0.1" + lodash.isequal "^4.5.0" + react-i18next "^14.0.5" + react-use "^17.5.0" + sass "1.71.0" + tailwindcss "^3.4.4" + uuid "^9.0.1" + "@ovh-ux/manager-react-shell-client@^0.8.1": version "0.8.1" resolved "https://registry.yarnpkg.com/@ovh-ux/manager-react-shell-client/-/manager-react-shell-client-0.8.1.tgz#9091056f0d5fb0e3ccbec26f85051550427d7167" @@ -25954,16 +25974,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -26077,14 +26088,7 @@ stringify-entities@^3.0.0: character-entities-legacy "^1.0.0" xtend "^4.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -28813,7 +28817,7 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -28831,15 +28835,6 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"