From d144407a6c786fa2d958c88676541797a0e2da5a Mon Sep 17 00:00:00 2001 From: Dustin Kroger Date: Fri, 27 Feb 2026 14:27:23 +0100 Subject: [PATCH 001/112] fix(account-creation): remove siret mandatory hotfix ref: #MANAGER-20933 Signed-off-by: Dustin Kroger --- .../accountDetails/accountDetails.page.tsx | 64 +++---------------- 1 file changed, 9 insertions(+), 55 deletions(-) diff --git a/packages/manager/apps/account-creation/src/pages/accountDetails/accountDetails.page.tsx b/packages/manager/apps/account-creation/src/pages/accountDetails/accountDetails.page.tsx index 845a91837cb7..7a9b97a64128 100644 --- a/packages/manager/apps/account-creation/src/pages/accountDetails/accountDetails.page.tsx +++ b/packages/manager/apps/account-creation/src/pages/accountDetails/accountDetails.page.tsx @@ -3,7 +3,7 @@ import { Trans, useTranslation } from 'react-i18next'; import { Controller, SubmitHandler, useForm, useWatch } from 'react-hook-form'; import { useSearchParams } from 'react-router-dom'; import { useMutation } from '@tanstack/react-query'; -import { z, ZodOptional } from 'zod'; +import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; import { BaseLayout, @@ -38,7 +38,7 @@ import { ODS_PHONE_NUMBER_COUNTRY_ISO_CODE, ODS_TEXT_PRESET, } from '@ovhcloud/ods-components'; -import { Country, User } from '@ovh-ux/manager-config'; +import { User } from '@ovh-ux/manager-config'; import { NAMESPACES } from '@ovh-ux/manager-common-translations'; import { ButtonType, @@ -53,8 +53,6 @@ import { useMe } from '@/data/hooks/useMe'; import { Rule, RuleField } from '@/types/rule'; import { getZodSchemaFromRule, - RuleZodSchema, - toZodField, useZodTranslatedError, } from '@/hooks/zod/useZod'; import { putMe } from '@/data/api/me'; @@ -73,8 +71,6 @@ import { useTrackBackButtonClick, } from '@/hooks/tracking/useTracking'; import { - CNIN_NON_MANDATORY_RULE, - CNIN_RULE, COUNTRIES_VAT_LABEL, TRACKING_GOAL_TYPE, } from './accountDetails.constants'; @@ -88,7 +84,6 @@ import { } from '@/components/formSkeleton'; import ExitGuard from '@/components/exitGuard/ExitGuard.component'; import InvalidationRedirectGuard from '@/components/invalidationRedirectGuard/InvalidationRedirectGuard.component'; -import { isCNINMandatory, isCNINVisible } from '@/helpers/xander/xanderHelper'; type AccountDetailsFormProps = { rules: Record; @@ -118,9 +113,6 @@ function AccountDetailsForm({ const pageTracking = usePageTracking(); const { trackClick, trackPage } = useTrackingContext(); const { trackError } = useTrackError('final-step'); - const [cninSchemaOverride, setCninSchemaOverride] = useState< - RuleZodSchema | undefined - >(undefined); const { legalForm, @@ -141,19 +133,11 @@ function AccountDetailsForm({ const zodSchema = useMemo(() => { const baseSchema = getZodSchemaFromRule(rules); - // TODO: Remove after mandatory check is implemented in Xander for FR - if (cninSchemaOverride) { - return baseSchema.extend({ - confirmSend: z.literal(true), - smsConsent: z.boolean().optional(), - companyNationalIdentificationNumber: cninSchemaOverride, - }); - } return baseSchema.extend({ confirmSend: z.literal(true), smsConsent: z.boolean().optional(), }); - }, [rules, cninSchemaOverride]); + }, [rules]); function renderTranslatedZodError(message: string | undefined, rule: Rule) { if (!message) return undefined; @@ -249,29 +233,6 @@ function AccountDetailsForm({ if (!phone && country !== phoneCountry) { setValue('phoneCountry', country); } - - // TODO: Remove after mandatory check is implemented in Xander for FR - if ( - legalForm === 'corporation' && // Add only for corporation legal form - isCNINMandatory({ - ovhSubsidiary, - country: (country as Country) || undefined, - defaultMandatory: - rules?.companyNationalIdentificationNumber?.mandatory, - }) - ) { - setCninSchemaOverride(toZodField(CNIN_RULE)); - } else if ( - (legalForm === 'association' || legalForm === 'administration') && - isCNINVisible({ - ovhSubsidiary, - country: (country as Country) || undefined, - }) - ) { - setCninSchemaOverride(toZodField(CNIN_NON_MANDATORY_RULE)); - } else { - setCninSchemaOverride(undefined); - } } }, [country]); @@ -471,8 +432,7 @@ function AccountDetailsForm({ )} /> - {(rules?.companyNationalIdentificationNumber || - !!cninSchemaOverride) && ( + {rules?.companyNationalIdentificationNumber && ( {t('account_details_field_siret')} - {(rules?.companyNationalIdentificationNumber - ?.mandatory || - !(cninSchemaOverride instanceof ZodOptional)) && // TODO: Remove next line after mandatory check is implemented in Xander for FR - ' *'} + {rules?.companyNationalIdentificationNumber + ?.mandatory && ' *'} {errors.companyNationalIdentificationNumber && - (rules?.companyNationalIdentificationNumber || - !!cninSchemaOverride) && ( + rules?.companyNationalIdentificationNumber && ( )} From 30d97412caaf2545aacc7e0b7f473f39ecdeaf23 Mon Sep 17 00:00:00 2001 From: Dustin Kroger Date: Fri, 27 Feb 2026 16:13:48 +0100 Subject: [PATCH 002/112] feat(account-creation): add corporation type ref: #MANAGER-20913 Signed-off-by: Dustin Kroger --- .../account-details/Messages_fr_FR.json | 12 +++++- .../accountDetails/accountDetails.page.tsx | 43 +++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/packages/manager/apps/account-creation/public/translations/account-details/Messages_fr_FR.json b/packages/manager/apps/account-creation/public/translations/account-details/Messages_fr_FR.json index 8298d45821bc..4838dc495946 100644 --- a/packages/manager/apps/account-creation/public/translations/account-details/Messages_fr_FR.json +++ b/packages/manager/apps/account-creation/public/translations/account-details/Messages_fr_FR.json @@ -46,5 +46,15 @@ "account_details_field_sms_consent": "J'accepte librement de recevoir des SMS relatifs aux nouveautés et offres commerciales d'OVHcloud", "account_details_button_validate": "Valider", "account_details_error_message": "Veuillez vérifier les champs marqués en rouge.", - "account_details_success_message": "Vos informations ont été enregistrées avec succès." + "account_details_success_message": "Vos informations ont été enregistrées avec succès.", + "account_details_field_corporationType": "Type d'entreprise", + "account_details_field_corporationType_sapa": "SAPA", + "account_details_field_corporationType_sas": "SAS", + "account_details_field_corporationType_sc": "SC", + "account_details_field_corporationType_scarl": "SCARL", + "account_details_field_corporationType_snc": "SNC", + "account_details_field_corporationType_spa": "SPA", + "account_details_field_corporationType_srl": "SRL", + "account_details_field_corporationType_ss": "SS", + "account_details_field_corporationType_personnelle": "Personnelle" } diff --git a/packages/manager/apps/account-creation/src/pages/accountDetails/accountDetails.page.tsx b/packages/manager/apps/account-creation/src/pages/accountDetails/accountDetails.page.tsx index 7a9b97a64128..c6bb37ded8ce 100644 --- a/packages/manager/apps/account-creation/src/pages/accountDetails/accountDetails.page.tsx +++ b/packages/manager/apps/account-creation/src/pages/accountDetails/accountDetails.page.tsx @@ -432,6 +432,49 @@ function AccountDetailsForm({ )} /> + {rules?.corporationType && ( + ( + + + + + {!isLoading && ( + <> + + {rules?.corporationType.in?.map((type) => ( + + ))} + + + )} + + )} + /> + )} {rules?.companyNationalIdentificationNumber && ( Date: Mon, 2 Mar 2026 13:11:43 +0100 Subject: [PATCH 003/112] fix(account-creation): add conditional NIN ref: #MANAGER-21054 Signed-off-by: Dustin Kroger --- .../account-details/Messages_fr_FR.json | 3 +- .../account-creation/src/hooks/zod/useZod.ts | 20 +++- .../accountDetails/accountDetails.page.tsx | 106 ++++++++++++++++++ 3 files changed, 126 insertions(+), 3 deletions(-) diff --git a/packages/manager/apps/account-creation/public/translations/account-details/Messages_fr_FR.json b/packages/manager/apps/account-creation/public/translations/account-details/Messages_fr_FR.json index 4838dc495946..a5503acb703b 100644 --- a/packages/manager/apps/account-creation/public/translations/account-details/Messages_fr_FR.json +++ b/packages/manager/apps/account-creation/public/translations/account-details/Messages_fr_FR.json @@ -56,5 +56,6 @@ "account_details_field_corporationType_spa": "SPA", "account_details_field_corporationType_srl": "SRL", "account_details_field_corporationType_ss": "SS", - "account_details_field_corporationType_personnelle": "Personnelle" + "account_details_field_corporationType_personnelle": "Personnelle", + "account_details_field_nationalIdentificationNumber": "Numéro d'identification national" } diff --git a/packages/manager/apps/account-creation/src/hooks/zod/useZod.ts b/packages/manager/apps/account-creation/src/hooks/zod/useZod.ts index 6d8378b9f955..2b24ad90ac38 100644 --- a/packages/manager/apps/account-creation/src/hooks/zod/useZod.ts +++ b/packages/manager/apps/account-creation/src/hooks/zod/useZod.ts @@ -1,10 +1,24 @@ import { z } from 'zod'; import { Rule } from '@/types/rule'; +type OptionalRuleZodSchema = z.ZodOptional< + z.ZodString | z.ZodEffects +>; + +type OptionalUnionWithEmpty = z.ZodUnion< + [OptionalRuleZodSchema, z.ZodLiteral<''>] +>; + export type RuleZodSchema = | z.ZodString | z.ZodEffects - | z.ZodOptional>; + | OptionalRuleZodSchema + | OptionalUnionWithEmpty + | z.ZodEffects< + OptionalUnionWithEmpty, + string | undefined, + string | undefined + >; export const toZodField = (field: Rule): RuleZodSchema => { let zodSchema: RuleZodSchema = z @@ -35,7 +49,9 @@ export const toZodField = (field: Rule): RuleZodSchema => { } if (!field.mandatory) { - return zodSchema.optional(); + return z + .union([zodSchema.optional(), z.literal('')]) + .transform((val) => (val === '' ? undefined : val)); } return zodSchema; diff --git a/packages/manager/apps/account-creation/src/pages/accountDetails/accountDetails.page.tsx b/packages/manager/apps/account-creation/src/pages/accountDetails/accountDetails.page.tsx index c6bb37ded8ce..10535358f8dd 100644 --- a/packages/manager/apps/account-creation/src/pages/accountDetails/accountDetails.page.tsx +++ b/packages/manager/apps/account-creation/src/pages/accountDetails/accountDetails.page.tsx @@ -384,6 +384,59 @@ function AccountDetailsForm({ ); }} /> + {/* Display national identification number if legal form is individual and national identification number rule is present */} + {isIndividualLegalForm(legalForm) && + rules?.nationalIdentificationNumber && ( + <> + ( + + + + {errors.nationalIdentificationNumber && + rules?.nationalIdentificationNumber && ( + + {renderTranslatedZodError( + errors.nationalIdentificationNumber.message, + rules?.nationalIdentificationNumber, + )} + + )} + + )} + /> + + )} {(rules?.organisation || @@ -545,6 +598,58 @@ function AccountDetailsForm({ )} /> )} + {rules?.nationalIdentificationNumber && !shouldDisplaySIREN && ( + <> + {/* Display NIN for organisations with NIN rule */} + ( + + + + {errors.nationalIdentificationNumber && + rules?.nationalIdentificationNumber && ( + + {renderTranslatedZodError( + errors.nationalIdentificationNumber.message, + rules?.nationalIdentificationNumber, + )} + + )} + + )} + /> + + )} {rules?.italianSDI && ( Date: Tue, 3 Mar 2026 08:59:56 +0000 Subject: [PATCH 004/112] fix(i18n): add missing translations [CDS 1193] Signed-off-by: CDS Translator Agent --- .../account-details/Messages_de_DE.json | 13 ++++++++++++- .../account-details/Messages_en_GB.json | 13 ++++++++++++- .../account-details/Messages_es_ES.json | 13 ++++++++++++- .../account-details/Messages_fr_CA.json | 13 ++++++++++++- .../account-details/Messages_it_IT.json | 13 ++++++++++++- .../account-details/Messages_pl_PL.json | 13 ++++++++++++- .../account-details/Messages_pt_PT.json | 13 ++++++++++++- 7 files changed, 84 insertions(+), 7 deletions(-) diff --git a/packages/manager/apps/account-creation/public/translations/account-details/Messages_de_DE.json b/packages/manager/apps/account-creation/public/translations/account-details/Messages_de_DE.json index 59977b10d3e6..0fde251fa9b2 100644 --- a/packages/manager/apps/account-creation/public/translations/account-details/Messages_de_DE.json +++ b/packages/manager/apps/account-creation/public/translations/account-details/Messages_de_DE.json @@ -50,5 +50,16 @@ "account_details_field_corporation_firstname": "Vorname des gesetzlichen Vertreters", "account_details_field_corporation_lastname": "Name des gesetzlichen Vertreters", "account_details_section_address_kyc_info": "Achten Sie darauf, alle Informationen einzugeben, und vergewissern Sie sich, dass Ihre persönlichen Daten mit dem Namen und der Adresse in Ihren offiziellen Dokumenten übereinstimmen, um eine Bestellung aufzugeben.
  • Geben Sie Ihre vollständige Adresse an.
  • Die Adresse muss mit der Adresse auf dem Adressnachweis übereinstimmen, der zur Überprüfung Ihrer Identität angefordert wird.
", - "account_details_field_italian_sdi": "Empfänger-Code für die elektronische Rechnungsstellung (SDI)" + "account_details_field_italian_sdi": "Empfänger-Code für die elektronische Rechnungsstellung (SDI)", + "account_details_field_corporationType": "Unternehmensart", + "account_details_field_corporationType_sapa": "SAPA", + "account_details_field_corporationType_sas": "SAS", + "account_details_field_corporationType_sc": "SC", + "account_details_field_corporationType_scarl": "SCARL", + "account_details_field_corporationType_snc": "SNC", + "account_details_field_corporationType_spa": "SPA", + "account_details_field_corporationType_srl": "SRL", + "account_details_field_corporationType_ss": "SS", + "account_details_field_corporationType_personnelle": "Personal", + "account_details_field_nationalIdentificationNumber": "Nationale Identifikationsnummer" } diff --git a/packages/manager/apps/account-creation/public/translations/account-details/Messages_en_GB.json b/packages/manager/apps/account-creation/public/translations/account-details/Messages_en_GB.json index a613897e62d5..0b8841e45e1b 100644 --- a/packages/manager/apps/account-creation/public/translations/account-details/Messages_en_GB.json +++ b/packages/manager/apps/account-creation/public/translations/account-details/Messages_en_GB.json @@ -50,5 +50,16 @@ "account_details_field_corporation_firstname": "Last name (legal representative):", "account_details_field_corporation_lastname": "First name (legal representative):", "account_details_section_address_kyc_info": "Please remember to fill in every field and confirm that your personal details match the name and address in your official documents before placing your order.
  • Enter your full address
  • The address must match the one on the proof of address for identity verification.
", - "account_details_field_italian_sdi": "Recipient code for electronic invoicing (SDI)" + "account_details_field_italian_sdi": "Recipient code for electronic invoicing (SDI)", + "account_details_field_corporationType": "Type of company", + "account_details_field_corporationType_sapa": "SAPA", + "account_details_field_corporationType_sas": "SAS", + "account_details_field_corporationType_sc": "SC", + "account_details_field_corporationType_scarl": "SCARL", + "account_details_field_corporationType_snc": "SNC", + "account_details_field_corporationType_spa": "SPA", + "account_details_field_corporationType_srl": "SRL", + "account_details_field_corporationType_ss": "SS", + "account_details_field_corporationType_personnelle": "Personal", + "account_details_field_nationalIdentificationNumber": "National identification number" } diff --git a/packages/manager/apps/account-creation/public/translations/account-details/Messages_es_ES.json b/packages/manager/apps/account-creation/public/translations/account-details/Messages_es_ES.json index c2277d1a7d5e..bd5f28fd2538 100644 --- a/packages/manager/apps/account-creation/public/translations/account-details/Messages_es_ES.json +++ b/packages/manager/apps/account-creation/public/translations/account-details/Messages_es_ES.json @@ -50,5 +50,16 @@ "account_details_field_corporation_firstname": "Nombre del representante legal", "account_details_field_corporation_lastname": "Apellido del representante legal", "account_details_section_address_kyc_info": "Para poder realizar su pedido, deberá incluir toda la información solicitada y asegurarse de que sus datos personales coinciden con el nombre y la dirección que aparecen en sus documentos oficiales.
  • Introduzca su dirección completa
  • La dirección debe corresponder a la que aparece en el justificante de dirección que se le solicitará para comprobar su identidad.
", - "account_details_field_italian_sdi": "Código del destinatario para la facturación electrónica (SDI)" + "account_details_field_italian_sdi": "Código del destinatario para la facturación electrónica (SDI)", + "account_details_field_corporationType": "Tipo de empresa", + "account_details_field_corporationType_sapa": "SAPA", + "account_details_field_corporationType_sas": "SAS", + "account_details_field_corporationType_sc": "SC", + "account_details_field_corporationType_scarl": "SCARL", + "account_details_field_corporationType_snc": "SNC", + "account_details_field_corporationType_spa": "SPA", + "account_details_field_corporationType_srl": "SRL", + "account_details_field_corporationType_ss": "SS", + "account_details_field_corporationType_personnelle": "Personal", + "account_details_field_nationalIdentificationNumber": "Número de identificación nacional" } diff --git a/packages/manager/apps/account-creation/public/translations/account-details/Messages_fr_CA.json b/packages/manager/apps/account-creation/public/translations/account-details/Messages_fr_CA.json index 8298d45821bc..a5503acb703b 100644 --- a/packages/manager/apps/account-creation/public/translations/account-details/Messages_fr_CA.json +++ b/packages/manager/apps/account-creation/public/translations/account-details/Messages_fr_CA.json @@ -46,5 +46,16 @@ "account_details_field_sms_consent": "J'accepte librement de recevoir des SMS relatifs aux nouveautés et offres commerciales d'OVHcloud", "account_details_button_validate": "Valider", "account_details_error_message": "Veuillez vérifier les champs marqués en rouge.", - "account_details_success_message": "Vos informations ont été enregistrées avec succès." + "account_details_success_message": "Vos informations ont été enregistrées avec succès.", + "account_details_field_corporationType": "Type d'entreprise", + "account_details_field_corporationType_sapa": "SAPA", + "account_details_field_corporationType_sas": "SAS", + "account_details_field_corporationType_sc": "SC", + "account_details_field_corporationType_scarl": "SCARL", + "account_details_field_corporationType_snc": "SNC", + "account_details_field_corporationType_spa": "SPA", + "account_details_field_corporationType_srl": "SRL", + "account_details_field_corporationType_ss": "SS", + "account_details_field_corporationType_personnelle": "Personnelle", + "account_details_field_nationalIdentificationNumber": "Numéro d'identification national" } diff --git a/packages/manager/apps/account-creation/public/translations/account-details/Messages_it_IT.json b/packages/manager/apps/account-creation/public/translations/account-details/Messages_it_IT.json index fa32358ec48d..e633a337cf81 100644 --- a/packages/manager/apps/account-creation/public/translations/account-details/Messages_it_IT.json +++ b/packages/manager/apps/account-creation/public/translations/account-details/Messages_it_IT.json @@ -50,5 +50,16 @@ "account_details_field_corporation_firstname": "Nome del rappresentante legale", "account_details_field_corporation_lastname": "Cognome del rappresentante legale", "account_details_section_address_kyc_info": "Per effettuare un ordine, ricordati di inserire tutte le informazioni richieste e assicurati che i tuoi dati personali coincidano con il nome e l’indirizzo che appaiono nei documenti ufficiali.
  • Inserisci il tuo indirizzo completo
  • L'indirizzo deve coincidere con quello presente nel giustificativo richiesto per verificare la tua identità
", - "account_details_field_italian_sdi": "Codice del destinatario per la fatturazione elettronica (SDI)" + "account_details_field_italian_sdi": "Codice del destinatario per la fatturazione elettronica (SDI)", + "account_details_field_corporationType": "Tipo di impresa", + "account_details_field_corporationType_sapa": "SAPA", + "account_details_field_corporationType_sas": "SAS", + "account_details_field_corporationType_sc": "SC", + "account_details_field_corporationType_scarl": "SCARL", + "account_details_field_corporationType_snc": "SNC", + "account_details_field_corporationType_spa": "SPA", + "account_details_field_corporationType_srl": "SRL", + "account_details_field_corporationType_ss": "SS", + "account_details_field_corporationType_personnelle": "Personale", + "account_details_field_nationalIdentificationNumber": "Numero di identificazione nazionale" } diff --git a/packages/manager/apps/account-creation/public/translations/account-details/Messages_pl_PL.json b/packages/manager/apps/account-creation/public/translations/account-details/Messages_pl_PL.json index 6be5f2b7a525..6933544719a8 100644 --- a/packages/manager/apps/account-creation/public/translations/account-details/Messages_pl_PL.json +++ b/packages/manager/apps/account-creation/public/translations/account-details/Messages_pl_PL.json @@ -50,5 +50,16 @@ "account_details_field_corporation_firstname": "Imię prawnego przedstawiciela", "account_details_field_corporation_lastname": "Nazwisko prawnego przedstawiciela", "account_details_section_address_kyc_info": "Przed złożeniem zamówienia pamiętaj o wprowadzeniu wszystkich informacji i upewnij się, że Twoje imię i nazwisko odpowiada danym osobowym podanym w Twoich oficjalnych dokumentach.
  • Wpisz pełny adres
  • Adres musi być zgodny z adresem widniejącym w dokumencie potwierdzającym Twoją tożsamość
", - "account_details_field_italian_sdi": "Kod odbiorcy do fakturowania elektronicznego (SDI)" + "account_details_field_italian_sdi": "Kod odbiorcy do fakturowania elektronicznego (SDI)", + "account_details_field_corporationType": "Rodzaj przedsiębiorstwa", + "account_details_field_corporationType_sapa": "SAPA", + "account_details_field_corporationType_sas": "SAS", + "account_details_field_corporationType_sc": "SC", + "account_details_field_corporationType_scarl": "SCARL", + "account_details_field_corporationType_snc": "SNC", + "account_details_field_corporationType_spa": "SPA", + "account_details_field_corporationType_srl": "SRL", + "account_details_field_corporationType_ss": "SS", + "account_details_field_corporationType_personnelle": "Osobowa", + "account_details_field_nationalIdentificationNumber": "Numer identyfikacji narodowej" } diff --git a/packages/manager/apps/account-creation/public/translations/account-details/Messages_pt_PT.json b/packages/manager/apps/account-creation/public/translations/account-details/Messages_pt_PT.json index a82ebfd8da92..7aa1b37911bf 100644 --- a/packages/manager/apps/account-creation/public/translations/account-details/Messages_pt_PT.json +++ b/packages/manager/apps/account-creation/public/translations/account-details/Messages_pt_PT.json @@ -50,5 +50,16 @@ "account_details_field_corporation_firstname": "Nome próprio do representante legal", "account_details_field_corporation_lastname": "Nome do representante legal", "account_details_section_address_kyc_info": "Não se esqueça de introduzir todas as informações e certifique-se de que os seus dados pessoais correspondem ao nome e endereço que constam nos seus documentos oficiais, para que possa efetuar uma encomenda.
  • Introduza a sua morada completa
  • A morada deve corresponder ao que figura no comprovativo de morada que lhe será pedido para verificar a sua identidade.
", - "account_details_field_italian_sdi": "Código do destinatário para a faturação eletrónica (SDI)" + "account_details_field_italian_sdi": "Código do destinatário para a faturação eletrónica (SDI)", + "account_details_field_corporationType": "Tipo de empresa", + "account_details_field_corporationType_sapa": "SAPA", + "account_details_field_corporationType_sas": "SAS", + "account_details_field_corporationType_sc": "SC", + "account_details_field_corporationType_scarl": "SCARL", + "account_details_field_corporationType_snc": "SNC", + "account_details_field_corporationType_spa": "SPA", + "account_details_field_corporationType_srl": "SRL", + "account_details_field_corporationType_ss": "SS", + "account_details_field_corporationType_personnelle": "Pessoal", + "account_details_field_nationalIdentificationNumber": "Número de identificação nacional" } From 77353b8f2c7dda73968a6fc2e14fb1410341ecd7 Mon Sep 17 00:00:00 2001 From: ovh-cds Date: Tue, 3 Mar 2026 14:10:07 +0000 Subject: [PATCH 005/112] release(*): tennessine-samurai-11 Signed-off-by: ovh-cds --- .sonarcloud.properties | 2 +- .../manager/apps/account-creation/CHANGELOG.md | 18 ++++++++++++++++++ .../manager/apps/account-creation/package.json | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/.sonarcloud.properties b/.sonarcloud.properties index da74ff29c3d2..da0e9ef317a2 100644 --- a/.sonarcloud.properties +++ b/.sonarcloud.properties @@ -7,7 +7,7 @@ sonar.projectName=manager sonar.sources=. sonar.sourceEncoding=UTF-8 sonar.ws.timeout=60 -sonar.projectVersion=tennessine-samurai-10 +sonar.projectVersion=tennessine-samurai-11 sonar.exclusions=node_modules/**, **/node_modules/**, **/dist/**, **/semantic/**, **/coverage/**, **/static/**, **/mock/**, **/mockServiceWorker.js sonar.coverage.exclusions=**/*.spec.js diff --git a/packages/manager/apps/account-creation/CHANGELOG.md b/packages/manager/apps/account-creation/CHANGELOG.md index 10325583ee5a..2bd3f74d7fb5 100644 --- a/packages/manager/apps/account-creation/CHANGELOG.md +++ b/packages/manager/apps/account-creation/CHANGELOG.md @@ -3,6 +3,24 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [0.13.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-account-creation-app@0.12.2...@ovh-ux/manager-account-creation-app@0.13.0) (2026-03-03) + + +### Bug Fixes + +* **account-creation:** add conditional NIN ([6e97d0a](https://github.com/ovh/manager/commit/6e97d0a257d60a9502abd5c149ec01a0d7e0dc70)), closes [#MANAGER-21054](https://github.com/ovh/manager/issues/MANAGER-21054) +* **account-creation:** remove siret mandatory hotfix ([d144407](https://github.com/ovh/manager/commit/d144407a6c786fa2d958c88676541797a0e2da5a)), closes [#MANAGER-20933](https://github.com/ovh/manager/issues/MANAGER-20933) +* **i18n:** add missing translations [CDS 1193] ([7af273e](https://github.com/ovh/manager/commit/7af273ebb84029ffcd5c4dafc8cca92fe72cf412)) + + +### Features + +* **account-creation:** add corporation type ([30d9741](https://github.com/ovh/manager/commit/30d97412caaf2545aacc7e0b7f473f39ecdeaf23)), closes [#MANAGER-20913](https://github.com/ovh/manager/issues/MANAGER-20913) + + + + + ## [0.12.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-account-creation-app@0.12.1...@ovh-ux/manager-account-creation-app@0.12.2) (2026-02-25) diff --git a/packages/manager/apps/account-creation/package.json b/packages/manager/apps/account-creation/package.json index 146daa300d13..0777b1e7d84a 100644 --- a/packages/manager/apps/account-creation/package.json +++ b/packages/manager/apps/account-creation/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-account-creation-app", - "version": "0.12.2", + "version": "0.13.0", "private": true, "description": "Application used to finalize an account creation", "repository": { From fa76916a60c7ff71888712c3a1c94101938a7a71 Mon Sep 17 00:00:00 2001 From: Toufik mouhmouh Date: Wed, 18 Feb 2026 16:22:19 +0100 Subject: [PATCH 006/112] feat(pci-ai-tools): information about the expiry date ref: #AIS-2004 Signed-off-by: Toufik mouhmouh Co-authored-by: CDS Translator Agent --- .../ai-tools/jobs/Messages_de_DE.json | 4 +- .../ai-tools/jobs/Messages_en_GB.json | 4 +- .../ai-tools/jobs/Messages_es_ES.json | 4 +- .../ai-tools/jobs/Messages_fr_CA.json | 4 +- .../ai-tools/jobs/Messages_fr_FR.json | 4 +- .../ai-tools/jobs/Messages_it_IT.json | 4 +- .../ai-tools/jobs/Messages_pl_PL.json | 4 +- .../ai-tools/jobs/Messages_pt_PT.json | 4 +- .../ai-tools/jobs/create/Messages_de_DE.json | 4 +- .../ai-tools/jobs/create/Messages_en_GB.json | 4 +- .../ai-tools/jobs/create/Messages_es_ES.json | 4 +- .../ai-tools/jobs/create/Messages_fr_CA.json | 4 +- .../ai-tools/jobs/create/Messages_fr_FR.json | 4 +- .../ai-tools/jobs/create/Messages_it_IT.json | 4 +- .../ai-tools/jobs/create/Messages_pl_PL.json | 4 +- .../ai-tools/jobs/create/Messages_pt_PT.json | 4 +- .../ai-tools/jobs/job/Messages_de_DE.json | 4 +- .../ai-tools/jobs/job/Messages_en_GB.json | 4 +- .../ai-tools/jobs/job/Messages_es_ES.json | 4 +- .../ai-tools/jobs/job/Messages_fr_CA.json | 4 +- .../ai-tools/jobs/job/Messages_fr_FR.json | 4 +- .../ai-tools/jobs/job/Messages_it_IT.json | 4 +- .../ai-tools/jobs/job/Messages_pl_PL.json | 4 +- .../ai-tools/jobs/job/Messages_pt_PT.json | 4 +- .../ai-tools/notebooks/Messages_de_DE.json | 4 +- .../ai-tools/notebooks/Messages_en_GB.json | 4 +- .../ai-tools/notebooks/Messages_es_ES.json | 4 +- .../ai-tools/notebooks/Messages_fr_CA.json | 4 +- .../ai-tools/notebooks/Messages_fr_FR.json | 4 +- .../ai-tools/notebooks/Messages_it_IT.json | 4 +- .../ai-tools/notebooks/Messages_pl_PL.json | 4 +- .../ai-tools/notebooks/Messages_pt_PT.json | 4 +- .../notebooks/create/Messages_de_DE.json | 4 +- .../notebooks/create/Messages_en_GB.json | 4 +- .../notebooks/create/Messages_es_ES.json | 4 +- .../notebooks/create/Messages_fr_CA.json | 4 +- .../notebooks/create/Messages_fr_FR.json | 4 +- .../notebooks/create/Messages_it_IT.json | 4 +- .../notebooks/create/Messages_pl_PL.json | 4 +- .../notebooks/create/Messages_pt_PT.json | 4 +- .../notebooks/notebook/Messages_de_DE.json | 10 +- .../notebooks/notebook/Messages_en_GB.json | 10 +- .../notebooks/notebook/Messages_es_ES.json | 10 +- .../notebooks/notebook/Messages_fr_CA.json | 10 +- .../notebooks/notebook/Messages_fr_FR.json | 10 +- .../notebooks/notebook/Messages_it_IT.json | 10 +- .../notebooks/notebook/Messages_pl_PL.json | 10 +- .../notebooks/notebook/Messages_pt_PT.json | 10 +- .../ai-tools/qpu/create/Messages_de_DE.json | 2 +- .../ai-tools/qpu/create/Messages_en_GB.json | 2 +- .../ai-tools/qpu/create/Messages_es_ES.json | 2 +- .../ai-tools/qpu/create/Messages_fr_CA.json | 2 +- .../ai-tools/qpu/create/Messages_fr_FR.json | 2 +- .../ai-tools/qpu/create/Messages_it_IT.json | 2 +- .../ai-tools/qpu/create/Messages_pl_PL.json | 2 +- .../ai-tools/qpu/create/Messages_pt_PT.json | 2 +- .../auto-restart/AutoRestartColumn.spec.tsx | 28 ++++++ .../auto-restart/AutoRestartColumn.tsx | 38 +++++++- .../_components/JobHeader.component.tsx | 89 ++++++++++++----- .../[jobId]/_components/JobHeader.spec.tsx | 39 ++++++++ .../_components/JobsListColumns.component.tsx | 5 + .../_components/NotebookHeader.component.tsx | 95 +++++++++++++------ .../_components/NotebookHeader.spec.tsx | 43 +++++++++ .../NotebooksListColumns.component.tsx | 7 ++ 64 files changed, 451 insertions(+), 149 deletions(-) create mode 100644 packages/manager/apps/pci-ai-tools/src/components/auto-restart/AutoRestartColumn.spec.tsx diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_de_DE.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_de_DE.json index 02e824924419..0a82df3e8e1f 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_de_DE.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_de_DE.json @@ -15,5 +15,7 @@ "shutdownLabel": "Beenden am {{timeout}}", "restartLabel": "Neustart am {{timeout}}", "timeOutLabel": "Ablaufdatum", - "tableActionClone": "Job klonen" + "tableActionClone": "Job klonen", + "waitingResourceLabel": "Warten auf eine verfügbare Ressource", + "pendingTimeoutHint": "Das Ablaufdatum wird festgelegt, wenn der Job ausgeführt wird." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_en_GB.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_en_GB.json index 5fc6b16f88ad..268c0b58883d 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_en_GB.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_en_GB.json @@ -15,5 +15,7 @@ "shutdownLabel": "Stops on {{timeout}}", "restartLabel": "Restarts on {{timeout}}", "timeOutLabel": "Expiry", - "tableActionClone": "Clone Job" + "tableActionClone": "Clone Job", + "waitingResourceLabel": "Waiting for an available resource", + "pendingTimeoutHint": "The expiration date will be set when the job is running." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_es_ES.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_es_ES.json index 8714da902ebd..c5c6b48c9801 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_es_ES.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_es_ES.json @@ -15,5 +15,7 @@ "shutdownLabel": "Detención el {{timeout}}", "restartLabel": "Reinicio el {{timeout}}", "timeOutLabel": "Expiración", - "tableActionClone": "Clonar el Job" + "tableActionClone": "Clonar el Job", + "waitingResourceLabel": "Esperando un recurso disponible", + "pendingTimeoutHint": "La fecha de expiración se definirá cuando el trabajo esté en ejecución." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_fr_CA.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_fr_CA.json index 9d60de75e82a..7fb91a22d2dd 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_fr_CA.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_fr_CA.json @@ -15,5 +15,7 @@ "tableActionRestart": "Redémarrer", "tableActionClone": "Cloner le Job", "tableActionStop": "Arrêter", - "tableActionDelete": "Supprimer" + "tableActionDelete": "Supprimer", + "waitingResourceLabel": "En attente d'une ressource disponible", + "pendingTimeoutHint": "La date d'expiration sera définie lorsque le job sera en cours d'exécution." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_fr_FR.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_fr_FR.json index 9d60de75e82a..7fb91a22d2dd 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_fr_FR.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_fr_FR.json @@ -15,5 +15,7 @@ "tableActionRestart": "Redémarrer", "tableActionClone": "Cloner le Job", "tableActionStop": "Arrêter", - "tableActionDelete": "Supprimer" + "tableActionDelete": "Supprimer", + "waitingResourceLabel": "En attente d'une ressource disponible", + "pendingTimeoutHint": "La date d'expiration sera définie lorsque le job sera en cours d'exécution." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_it_IT.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_it_IT.json index 3b0b7d1929ed..5b952fe38efb 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_it_IT.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_it_IT.json @@ -15,5 +15,7 @@ "shutdownLabel": "Arresto il {{timeout}}", "restartLabel": "Riavvio il {{timeout}}", "timeOutLabel": "Scadenza", - "tableActionClone": "Clonare il job" + "tableActionClone": "Clonare il job", + "waitingResourceLabel": "In attesa di una risorsa disponibile", + "pendingTimeoutHint": "La data di scadenza sarà impostata quando il lavoro sarà in esecuzione." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_pl_PL.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_pl_PL.json index ef29a53dfafe..2c791cdee3f7 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_pl_PL.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_pl_PL.json @@ -15,5 +15,7 @@ "shutdownLabel": "Zatrzymanie {{timeout}}", "restartLabel": "Restart {{timeout}}", "timeOutLabel": "Wygaśnięcie", - "tableActionClone": "Sklonuj zadanie" + "tableActionClone": "Sklonuj zadanie", + "waitingResourceLabel": "Oczekiwanie na dostępny zasób", + "pendingTimeoutHint": "Data wygaśnięcia zostanie ustalona, gdy zadanie będzie w toku." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_pt_PT.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_pt_PT.json index 37e782358241..93ff041fdc3a 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_pt_PT.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/Messages_pt_PT.json @@ -15,5 +15,7 @@ "shutdownLabel": "Interrupção a {{timeout}}", "restartLabel": "Reinicialização a {{timeout}}", "timeOutLabel": "Expiração", - "tableActionClone": "Clonar o Job" + "tableActionClone": "Clonar o Job", + "waitingResourceLabel": "Aguardando um recurso disponível", + "pendingTimeoutHint": "A data de expiração será definida quando o trabalho estiver em execução." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_de_DE.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_de_DE.json index 48c96efa0da7..b5a52b6a3dca 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_de_DE.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_de_DE.json @@ -47,10 +47,10 @@ "fieldDockerCommandLabel": "Docker-Befehle:", "summaryFieldVolumesLabel": "Volumes:", "summaryFieldFlavorVMemory": "{{memory}} VRAM", - "defaultAutoRestartInfo": "Der Job wird nach 7 Tagen automatisch beendet. Ihre Konfiguration und Daten werden gespeichert. ", + "defaultAutoRestartInfo": "Der Job wird automatisch nach 7 aufeinanderfolgenden Betriebstagen gestoppt. Ihre Konfiguration und Ihre Daten werden gespeichert. ", "fieldTimeOutLabel": "Ablaufdatum", "fieldAutoRestartLabel": "Automatischer Neustart", - "fieldAutoRestartDescription": "Bei Aktivierung wird der Job alle 7 Tage automatisch neu gestartet. Bei Deaktivierung wird der Job nach 7 Tagen automatisch beendet. In jedem Fall werden Ihre Konfiguration und Daten gespeichert.", + "fieldAutoRestartDescription": "Wenn aktiviert, wird der Job automatisch alle 7 aufeinanderfolgenden Betriebstage neu gestartet. Wenn deaktiviert, wird der Job automatisch nach 7 aufeinanderfolgenden Betriebstagen gestoppt. In beiden Fällen werden Ihre Konfiguration und Ihre Daten gespeichert.", "filedEnable": "Aktiviert", "filedDisable": "Deaktiviert" } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_en_GB.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_en_GB.json index 13c29d0ba4fc..8d4fb6b5b483 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_en_GB.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_en_GB.json @@ -47,10 +47,10 @@ "fieldDockerCommandLabel": "Docker commands:", "summaryFieldVolumesLabel": "Volumes", "summaryFieldFlavorVMemory": "{{memory}} VRAM", - "defaultAutoRestartInfo": "The job will automatically stop after 7 days. Your configuration and data will be saved. ", + "defaultAutoRestartInfo": "The job will be automatically stopped after 7 consecutive days of operation. Your configuration and data will be saved. ", "fieldTimeOutLabel": "Expiry", "fieldAutoRestartLabel": "Automatic restart", - "fieldAutoRestartDescription": "If enabled, the job will automatically restart every 7 days. If disabled, the job will automatically stop after 7 days. In both cases, your configuration and data will be saved.", + "fieldAutoRestartDescription": "If enabled, the job will be automatically restarted every 7 consecutive days of operation. If disabled, the job will be automatically stopped after 7 consecutive days of operation. In both cases, your configuration and data will be saved.", "filedEnable": "Enabled", "filedDisable": "Disabled" } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_es_ES.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_es_ES.json index 6545c4d6f933..c319ec46e516 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_es_ES.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_es_ES.json @@ -47,10 +47,10 @@ "fieldDockerCommandLabel": "Comandos Docker:", "summaryFieldVolumesLabel": "Volúmenes:", "summaryFieldFlavorVMemory": "{{memory}} VRAM", - "defaultAutoRestartInfo": "El job se detendrá automáticamente al cabo de 7 días. Se guardarán la configuración y los datos. ", + "defaultAutoRestartInfo": "El trabajo se detendrá automáticamente después de 7 días de funcionamiento consecutivos. Su configuración y sus datos serán guardados. ", "fieldTimeOutLabel": "Expiración", "fieldAutoRestartLabel": "Reinicio automático", - "fieldAutoRestartDescription": "Si se activa, el job se reiniciará automáticamente cada 7 días. Si se desactiva, el job se detendrá automáticamente al cabo de 7 días. En los dos casos, se guardarán la configuración y los datos.", + "fieldAutoRestartDescription": "Si está activado, el trabajo se reiniciará automáticamente cada 7 días de funcionamiento consecutivos. Si está desactivado, el trabajo se detendrá automáticamente después de 7 días de funcionamiento consecutivos. En ambos casos, su configuración y sus datos serán guardados.", "filedEnable": "Activado", "filedDisable": "Desactivado" } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_fr_CA.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_fr_CA.json index 3ff717bbc02b..add099ffd3d9 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_fr_CA.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_fr_CA.json @@ -25,10 +25,10 @@ "summaryFieldPrivacyLabel": "Confidentialité:", "summaryFieldPublicLabel": "Public", "summaryFieldPrivateLabel": "Private", - "defaultAutoRestartInfo": "Le job sera arrêté automatiquement après 7 jours. Votre configuration et vos données seront enregistrées. ", + "defaultAutoRestartInfo": "Le job sera arrêté automatiquement après 7 jours de fonctionnement consécutifs. Votre configuration et vos données seront enregistrées. ", "fieldTimeOutLabel": "Expiration", "fieldAutoRestartLabel": "Redémarrage automatique", - "fieldAutoRestartDescription": "Si activé, le job sera automatiquement redémarré tous les 7 jours. Si désactivé, le job sera automatiquement arrêté après 7 jours. Dans les 2 cas, votre configuration et vos données seront enregistrées.", + "fieldAutoRestartDescription": "Si activé, le job sera automatiquement redémarré tous les 7 jours de fonctionnement consécutifs. Si désactivé, le job sera automatiquement arrêté après 7 jours de fonctionnement consécutifs. Dans les 2 cas, votre configuration et vos données seront enregistrées.", "filedEnable": "Activé", "filedDisable": "Désactivé", "fieldDockerCommandLabel": "Commandes Docker:", diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_fr_FR.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_fr_FR.json index 3ff717bbc02b..add099ffd3d9 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_fr_FR.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_fr_FR.json @@ -25,10 +25,10 @@ "summaryFieldPrivacyLabel": "Confidentialité:", "summaryFieldPublicLabel": "Public", "summaryFieldPrivateLabel": "Private", - "defaultAutoRestartInfo": "Le job sera arrêté automatiquement après 7 jours. Votre configuration et vos données seront enregistrées. ", + "defaultAutoRestartInfo": "Le job sera arrêté automatiquement après 7 jours de fonctionnement consécutifs. Votre configuration et vos données seront enregistrées. ", "fieldTimeOutLabel": "Expiration", "fieldAutoRestartLabel": "Redémarrage automatique", - "fieldAutoRestartDescription": "Si activé, le job sera automatiquement redémarré tous les 7 jours. Si désactivé, le job sera automatiquement arrêté après 7 jours. Dans les 2 cas, votre configuration et vos données seront enregistrées.", + "fieldAutoRestartDescription": "Si activé, le job sera automatiquement redémarré tous les 7 jours de fonctionnement consécutifs. Si désactivé, le job sera automatiquement arrêté après 7 jours de fonctionnement consécutifs. Dans les 2 cas, votre configuration et vos données seront enregistrées.", "filedEnable": "Activé", "filedDisable": "Désactivé", "fieldDockerCommandLabel": "Commandes Docker:", diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_it_IT.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_it_IT.json index b42703fbf354..57603910ab0d 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_it_IT.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_it_IT.json @@ -47,10 +47,10 @@ "fieldDockerCommandLabel": "Comandi Docker:", "summaryFieldVolumesLabel": "Volumi:", "summaryFieldFlavorVMemory": "{{memory}} VRAM", - "defaultAutoRestartInfo": "Il job verrà arrestato automaticamente dopo 7 giorni. La tua configurazione e i tuoi dati verranno salvati. ", + "defaultAutoRestartInfo": "Il lavoro verrà interrotto automaticamente dopo 7 giorni di funzionamento consecutivi. La tua configurazione e i tuoi dati verranno salvati. ", "fieldTimeOutLabel": "Scadenza", "fieldAutoRestartLabel": "Riavvio automatico", - "fieldAutoRestartDescription": "Se attivato, il job verrà automaticamente riavviato ogni 7 giorni. Se disattivato, il job verrà automaticamente arrestato dopo 7 giorni. In entrambi i casi, la tua configurazione e i tuoi dati verranno salvati.", + "fieldAutoRestartDescription": "Se attivato, il lavoro verrà automaticamente riavviato ogni 7 giorni di funzionamento consecutivi. Se disattivato, il lavoro verrà automaticamente interrotto dopo 7 giorni di funzionamento consecutivi. In entrambi i casi, la tua configurazione e i tuoi dati verranno salvati.", "filedEnable": "Attivato", "filedDisable": "Disattivato" } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_pl_PL.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_pl_PL.json index 4d62f28193b7..b3081471c137 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_pl_PL.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_pl_PL.json @@ -47,10 +47,10 @@ "fieldDockerCommandLabel": "Polecenia Docker:", "summaryFieldVolumesLabel": "Wolumeny:", "summaryFieldFlavorVMemory": "{{memory}} VRAM", - "defaultAutoRestartInfo": "Zadanie zostanie automatycznie zatrzymane po 7 dniach. Konfiguracja i dane zostaną zapisane. ", + "defaultAutoRestartInfo": "Zadanie zostanie automatycznie zatrzymane po 7 dniach ciągłej pracy. Twoja konfiguracja i dane zostaną zapisane. ", "fieldTimeOutLabel": "Wygaśnięcie", "fieldAutoRestartLabel": "Automatyczny restart", - "fieldAutoRestartDescription": "Jeśli opcja jest włączona, zadanie będzie automatycznie restartowane co 7 dni. Jeśli opcja jest wyłączona, zadanie zostanie automatycznie zatrzymane po 7 dniach. W obu przypadkach konfiguracja i dane zostaną zapisane.", + "fieldAutoRestartDescription": "Jeśli włączone, zadanie zostanie automatycznie uruchomione ponownie co 7 dni ciągłej pracy. Jeśli wyłączone, zadanie zostanie automatycznie zatrzymane po 7 dniach ciągłej pracy. W obu przypadkach twoja konfiguracja i dane zostaną zapisane.", "filedEnable": "Włączona", "filedDisable": "Wyłączona" } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_pt_PT.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_pt_PT.json index 034ac0dd7762..72c1cdb8f90a 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_pt_PT.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/create/Messages_pt_PT.json @@ -47,10 +47,10 @@ "fieldDockerCommandLabel": "Comandos Docker:", "summaryFieldVolumesLabel": "Volumes:", "summaryFieldFlavorVMemory": "{{memory}} VRAM", - "defaultAutoRestartInfo": "O job será interrompido automaticamente após 7 dias. A sua configuração e os seus dados serão guardados. ", + "defaultAutoRestartInfo": "O trabalho será automaticamente interrompido após 7 dias de funcionamento consecutivos. A sua configuração e os seus dados serão guardados. ", "fieldTimeOutLabel": "Expiração", "fieldAutoRestartLabel": "Reinicialização automática", - "fieldAutoRestartDescription": "Se ativado, o job será automaticamente reiniciado a cada 7 dias. Se desativado, o job será automaticamente interrompido após 7 dias. Em ambos os casos, a sua configuração e os seus dados serão guardados.", + "fieldAutoRestartDescription": "Se ativado, o trabalho será automaticamente reiniciado a cada 7 dias de funcionamento consecutivos. Se desativado, o trabalho será automaticamente interrompido após 7 dias de funcionamento consecutivos. Em ambos os casos, a sua configuração e os seus dados serão guardados.", "filedEnable": "Ativado", "filedDisable": "Desativado" } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_de_DE.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_de_DE.json index 90c31716d7ac..1421d18386bb 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_de_DE.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_de_DE.json @@ -24,5 +24,7 @@ "restartJobToastSuccessDescription": "Der Job {{name}} wurde gestartet.", "cloneJobTitle": "Einen neuen Job klonen", "shutdownLabel": "Beenden am ", - "restartLabel": "Neustart am " + "restartLabel": "Neustart am ", + "waitingResourceLabel": "Warten auf eine verfügbare Ressource", + "pendingTimeoutHint": "Das Ablaufdatum wird festgelegt, wenn der Job ausgeführt wird." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_en_GB.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_en_GB.json index 5da87fe7c550..4537eb2a9332 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_en_GB.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_en_GB.json @@ -24,5 +24,7 @@ "restartJobToastSuccessDescription": "The {{name}} job has been launched", "cloneJobTitle": "Clone a new job", "shutdownLabel": "Stops on ", - "restartLabel": "Restarts on " + "restartLabel": "Restarts on ", + "waitingResourceLabel": "Waiting for an available resource", + "pendingTimeoutHint": "The expiration date will be set when the job is running." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_es_ES.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_es_ES.json index 0865b11038e1..30f0840c3874 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_es_ES.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_es_ES.json @@ -24,5 +24,7 @@ "restartJobToastSuccessDescription": "El job {{name}} se ha iniciado", "cloneJobTitle": "Clonar un nuevo job", "shutdownLabel": "Detención el ", - "restartLabel": "Reinicio el " + "restartLabel": "Reinicio el ", + "waitingResourceLabel": "Esperando un recurso disponible", + "pendingTimeoutHint": "La fecha de expiración se definirá cuando el trabajo esté en ejecución." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_fr_CA.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_fr_CA.json index 1e2f4377fdc3..db8cd5756380 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_fr_CA.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_fr_CA.json @@ -24,5 +24,7 @@ "shutdownLabel": "Arrêt le ", "restartLabel": "Redémarrage le ", "restartJobButtonConfirm": "Relancer", - "restartJobToastSuccessDescription": "Le job {{name}} a été démarré" + "restartJobToastSuccessDescription": "Le job {{name}} a été démarré", + "waitingResourceLabel": "En attente d'une ressource disponible", + "pendingTimeoutHint": "La date d'expiration sera définie lorsque le job sera en cours d'exécution." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_fr_FR.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_fr_FR.json index 1e2f4377fdc3..db8cd5756380 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_fr_FR.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_fr_FR.json @@ -24,5 +24,7 @@ "shutdownLabel": "Arrêt le ", "restartLabel": "Redémarrage le ", "restartJobButtonConfirm": "Relancer", - "restartJobToastSuccessDescription": "Le job {{name}} a été démarré" + "restartJobToastSuccessDescription": "Le job {{name}} a été démarré", + "waitingResourceLabel": "En attente d'une ressource disponible", + "pendingTimeoutHint": "La date d'expiration sera définie lorsque le job sera en cours d'exécution." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_it_IT.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_it_IT.json index 9640854fe91c..3c8dbefe6480 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_it_IT.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_it_IT.json @@ -24,5 +24,7 @@ "restartJobToastSuccessDescription": "Il job {{name}} è stato avviato", "cloneJobTitle": "Clonare un nuovo job", "shutdownLabel": "Arresto il ", - "restartLabel": "Riavvio il " + "restartLabel": "Riavvio il ", + "waitingResourceLabel": "In attesa di una risorsa disponibile", + "pendingTimeoutHint": "La data di scadenza sarà impostata quando il lavoro sarà in esecuzione." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_pl_PL.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_pl_PL.json index 831a35e60cf7..3f9a92247669 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_pl_PL.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_pl_PL.json @@ -24,5 +24,7 @@ "restartJobToastSuccessDescription": "Zadanie {{name}} zostało uruchomione", "cloneJobTitle": "Sklonuj nowe zadanie", "shutdownLabel": "Zatrzymanie dnia ", - "restartLabel": "Restart dnia " + "restartLabel": "Restart dnia ", + "waitingResourceLabel": "Oczekiwanie na dostępny zasób", + "pendingTimeoutHint": "Data wygaśnięcia zostanie ustalona, gdy zadanie będzie w toku." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_pt_PT.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_pt_PT.json index d54b7f6f9cba..9245d1064186 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_pt_PT.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/jobs/job/Messages_pt_PT.json @@ -24,5 +24,7 @@ "restartJobToastSuccessDescription": "O job {{name}} foi iniciado", "cloneJobTitle": "Clonar um novo job", "shutdownLabel": "Interrupção a ", - "restartLabel": "Reinicialização a " + "restartLabel": "Reinicialização a ", + "waitingResourceLabel": "Aguardando um recurso disponível", + "pendingTimeoutHint": "A data de expiração será definida quando o trabalho estiver em execução." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_de_DE.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_de_DE.json index 86da1a4704e7..2c28b5bc93d0 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_de_DE.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_de_DE.json @@ -21,5 +21,7 @@ "tableActionRestart": "Neu starten", "shutdownLabel": "Beenden am {{timeout}}", "restartLabel": "Neustart am {{timeout}}", - "timeOutLabel": "Ablaufdatum" + "timeOutLabel": "Ablaufdatum", + "waitingResourceLabel": "Warten auf eine verfügbare Ressource", + "pendingTimeoutHint": "Das Ablaufdatum wird festgelegt, wenn das Notebook ausgeführt wird." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_en_GB.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_en_GB.json index 8faea51e4392..d8bcebec7d96 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_en_GB.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_en_GB.json @@ -21,5 +21,7 @@ "tableActionRestart": "Restart", "shutdownLabel": "Stops on {{timeout}}", "restartLabel": "Restarts on {{timeout}}", - "timeOutLabel": "Expiry" + "timeOutLabel": "Expiry", + "waitingResourceLabel": "Waiting for an available resource", + "pendingTimeoutHint": "The expiration date will be set when the notebook is running." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_es_ES.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_es_ES.json index 276a0f710f71..4a23c1521ff2 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_es_ES.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_es_ES.json @@ -21,5 +21,7 @@ "tableActionRestart": "Reiniciar", "shutdownLabel": "Detención el {{timeout}}", "restartLabel": "Reinicio el {{timeout}}", - "timeOutLabel": "Expiración" + "timeOutLabel": "Expiración", + "waitingResourceLabel": "Esperando un recurso disponible", + "pendingTimeoutHint": "La fecha de caducidad se establecerá cuando el cuaderno esté en ejecución." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_fr_CA.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_fr_CA.json index a89dc30970a6..c28a0e15df60 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_fr_CA.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_fr_CA.json @@ -21,5 +21,7 @@ "restartLabel": "Redémarrage le {{timeout}}", "timeOutLabel": "Expiration", "tableActionDelete": "Supprimer", - "deleteTableTooltip": "Le notebook doit être en statut arrêté" + "deleteTableTooltip": "Le notebook doit être en statut arrêté", + "waitingResourceLabel": "En attente d'une ressource disponible", + "pendingTimeoutHint": "La date d'expiration sera définie lorsque le notebook sera en cours d'exécution." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_fr_FR.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_fr_FR.json index a89dc30970a6..c28a0e15df60 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_fr_FR.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_fr_FR.json @@ -21,5 +21,7 @@ "restartLabel": "Redémarrage le {{timeout}}", "timeOutLabel": "Expiration", "tableActionDelete": "Supprimer", - "deleteTableTooltip": "Le notebook doit être en statut arrêté" + "deleteTableTooltip": "Le notebook doit être en statut arrêté", + "waitingResourceLabel": "En attente d'une ressource disponible", + "pendingTimeoutHint": "La date d'expiration sera définie lorsque le notebook sera en cours d'exécution." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_it_IT.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_it_IT.json index 64f47d1f7783..efaf7ef0ad62 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_it_IT.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_it_IT.json @@ -21,5 +21,7 @@ "tableActionRestart": "Riavvia", "shutdownLabel": "Arresto il {{timeout}}", "restartLabel": "Riavvio il {{timeout}}", - "timeOutLabel": "Scadenza" + "timeOutLabel": "Scadenza", + "waitingResourceLabel": "In attesa di una risorsa disponibile", + "pendingTimeoutHint": "La data di scadenza sarà impostata quando il notebook sarà in esecuzione." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_pl_PL.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_pl_PL.json index cdca246aa9bf..e4bdb34149e9 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_pl_PL.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_pl_PL.json @@ -21,5 +21,7 @@ "tableActionRestart": "Restart", "shutdownLabel": "Zatrzymanie {{timeout}}", "restartLabel": "Restart {{timeout}}", - "timeOutLabel": "Data ważności" + "timeOutLabel": "Data ważności", + "waitingResourceLabel": "Oczekiwanie na dostępny zasób", + "pendingTimeoutHint": "Data wygaśnięcia zostanie ustalona, gdy notebook będzie w trakcie działania." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_pt_PT.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_pt_PT.json index 99683047387f..af47fadf28a8 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_pt_PT.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/Messages_pt_PT.json @@ -21,5 +21,7 @@ "tableActionRestart": "Reiniciar", "shutdownLabel": "Interrupção a {{timeout}}", "restartLabel": "Reinicialização a {{timeout}}", - "timeOutLabel": "Expiração" + "timeOutLabel": "Expiração", + "waitingResourceLabel": "Aguardando um recurso disponível", + "pendingTimeoutHint": "A data de expiração será definida quando o notebook estiver em execução." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_de_DE.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_de_DE.json index ec7b188a1f99..0ec9b4a2f25f 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_de_DE.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_de_DE.json @@ -54,10 +54,10 @@ "sshKeyConfigurationHelperBis": "Verwenden Sie die untenstehende Dropdown-Liste, um SSH-Schlüssel mit Ihrem Notebook zu verknüpfen", "summaryFieldFlavorVMemory": "{{memory}} VRAM", "qpuQubits": "Qubits", - "defaultAutoRestartInfo": "Das Notebook wird nach 7 Tagen automatisch beendet. Ihre Konfiguration und Daten werden gespeichert.", + "defaultAutoRestartInfo": "Das Notebook wird nach 7 aufeinanderfolgenden Betriebstagen automatisch heruntergefahren. Ihre Einstellungen und Daten werden gespeichert.", "fieldTimeOutLabel": "Ablaufdatum", "fieldAutoRestartLabel": "Automatischer Neustart", - "fieldAutoRestartDescription": "Bei Aktivierung wird das Notebook alle 7 Tage automatisch neu gestartet. Bei Deaktivierung wird das Notebook nach 7 Tagen automatisch beendet. In jedem Fall werden Ihre Konfiguration und Daten gespeichert.", + "fieldAutoRestartDescription": "Wenn aktiviert, wird das Notebook alle 7 aufeinanderfolgenden Betriebstage automatisch neu gestartet. Wenn deaktiviert, wird das Notebook nach 7 aufeinanderfolgenden Betriebstagen automatisch heruntergefahren. In beiden Fällen werden Ihre Einstellungen und Daten gespeichert.", "filedEnable": "Aktiviert", "filedDisable": "Deaktiviert" } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_en_GB.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_en_GB.json index 3c083b1c04f3..c5a149e53322 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_en_GB.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_en_GB.json @@ -54,10 +54,10 @@ "sshKeyConfigurationHelperBis": "Use the dropdown list below to link SSH keys to your notebook", "summaryFieldFlavorVMemory": "{{memory}} VRAM", "qpuQubits": "Qubits", - "defaultAutoRestartInfo": "The notebook will automatically stop after 7 days. Your configuration and data will be saved.", + "defaultAutoRestartInfo": "The notebook will be automatically shut down after 7 consecutive days of operation. Your settings and data will be saved.", "fieldTimeOutLabel": "Expiry", "fieldAutoRestartLabel": "Automatic restart", - "fieldAutoRestartDescription": "If enabled, the notebook will automatically restart every 7 days. If disabled, the notebook will automatically stop after 7 days. In both cases, your configuration and data will be saved.", + "fieldAutoRestartDescription": "If enabled, the notebook will be automatically restarted every 7 consecutive days of operation. If disabled, the notebook will be automatically shut down after 7 consecutive days of operation. In both cases, your settings and data will be saved.", "filedEnable": "Enabled", "filedDisable": "Disabled" } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_es_ES.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_es_ES.json index 4790bb647028..aaad996bc0b1 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_es_ES.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_es_ES.json @@ -54,10 +54,10 @@ "sshKeyConfigurationHelperBis": "Utilice la siguiente lista desplegable para asociar llaves SSH a su notebook", "summaryFieldFlavorVMemory": "{{memory}} VRAM", "qpuQubits": "Cúbits", - "defaultAutoRestartInfo": "El notebook se detendrá automáticamente al cabo de 7 días. Se guardarán la configuración y los datos.", + "defaultAutoRestartInfo": "El portátil se apagará automáticamente después de 7 días de funcionamiento continuo. Su configuración y sus datos serán guardados.", "fieldTimeOutLabel": "Expiración", "fieldAutoRestartLabel": "Reinicio automático", - "fieldAutoRestartDescription": "Si está activado, el notebook se reiniciará automáticamente cada 7 días. Si se desactiva, el notebook se detendrá automáticamente al cabo de 7 días. En los dos casos, se guardarán la configuración y los datos.", + "fieldAutoRestartDescription": "Si está activado, el portátil se reiniciará automáticamente cada 7 días de funcionamiento continuo. Si está desactivado, el portátil se apagará automáticamente después de 7 días de funcionamiento continuo. En ambos casos, su configuración y sus datos serán guardados.", "filedEnable": "Activado", "filedDisable": "Desactivado" } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_fr_CA.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_fr_CA.json index 4d4bb3f00437..d959fc9e01e5 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_fr_CA.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_fr_CA.json @@ -27,10 +27,10 @@ "summaryFieldPrivacyLabel": "Confidentialité:", "summaryFieldPublicLabel": "Public", "summaryFieldPrivateLabel": "Private", - "defaultAutoRestartInfo": "Le notebook sera arrêté automatiquement après 7 jours. Votre configuration et vos données seront enregistrées.", + "defaultAutoRestartInfo": "Le notebook sera arrêté automatiquement après 7 jours de fonctionnement consécutifs. Votre configuration et vos données seront enregistrées.", "fieldTimeOutLabel": "Expiration", "fieldAutoRestartLabel": "Redémarrage automatique", - "fieldAutoRestartDescription": "Si activé, le notebook sera automatiquement redémarré tous les 7 jours. Si désactivé, le notebook sera automatiquement arrêté après 7 jours. Dans les 2 cas, votre configuration et vos données seront enregistrées.", + "fieldAutoRestartDescription": "Si activé, le notebook sera automatiquement redémarré tous les 7 jours de fonctionnement consécutifs. Si désactivé, le notebook sera automatiquement arrêté après 7 jours de fonctionnement consécutifs. Dans les 2 cas, votre configuration et vos données seront enregistrées.", "filedEnable": "Activé", "filedDisable": "Désactivé", "formButtonAdvancedConfiguration": "Configuration avancée", diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_fr_FR.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_fr_FR.json index 4d4bb3f00437..d959fc9e01e5 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_fr_FR.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_fr_FR.json @@ -27,10 +27,10 @@ "summaryFieldPrivacyLabel": "Confidentialité:", "summaryFieldPublicLabel": "Public", "summaryFieldPrivateLabel": "Private", - "defaultAutoRestartInfo": "Le notebook sera arrêté automatiquement après 7 jours. Votre configuration et vos données seront enregistrées.", + "defaultAutoRestartInfo": "Le notebook sera arrêté automatiquement après 7 jours de fonctionnement consécutifs. Votre configuration et vos données seront enregistrées.", "fieldTimeOutLabel": "Expiration", "fieldAutoRestartLabel": "Redémarrage automatique", - "fieldAutoRestartDescription": "Si activé, le notebook sera automatiquement redémarré tous les 7 jours. Si désactivé, le notebook sera automatiquement arrêté après 7 jours. Dans les 2 cas, votre configuration et vos données seront enregistrées.", + "fieldAutoRestartDescription": "Si activé, le notebook sera automatiquement redémarré tous les 7 jours de fonctionnement consécutifs. Si désactivé, le notebook sera automatiquement arrêté après 7 jours de fonctionnement consécutifs. Dans les 2 cas, votre configuration et vos données seront enregistrées.", "filedEnable": "Activé", "filedDisable": "Désactivé", "formButtonAdvancedConfiguration": "Configuration avancée", diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_it_IT.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_it_IT.json index 47d9e7727c71..01b6317c1a57 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_it_IT.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_it_IT.json @@ -54,10 +54,10 @@ "sshKeyConfigurationHelperBis": "Utilizza il menu a tendina qui sotto per associare chiavi SSH al tuo notebook", "summaryFieldFlavorVMemory": "{{memory}} VRAM", "qpuQubits": "Qubit", - "defaultAutoRestartInfo": "Il notebook verrà arrestato automaticamente dopo 7 giorni. La tua configurazione e i tuoi dati verranno salvati.", + "defaultAutoRestartInfo": "Il notebook si spegnerà automaticamente dopo 7 giorni di funzionamento consecutivo. La tua configurazione e i tuoi dati saranno salvati.", "fieldTimeOutLabel": "Scadenza", "fieldAutoRestartLabel": "Riavvio automatico", - "fieldAutoRestartDescription": "Se attivato, il notebook verrà automaticamente riavviato ogni 7 giorni. Se disattivato, il notebook verrà automaticamente arrestato dopo 7 giorni. In entrambi i casi, la tua configurazione e i tuoi dati verranno salvati.", + "fieldAutoRestartDescription": "Se attivato, il notebook verrà riavviato automaticamente ogni 7 giorni di funzionamento consecutivo. Se disattivato, il notebook si spegnerà automaticamente dopo 7 giorni di funzionamento consecutivo. In entrambi i casi, la tua configurazione e i tuoi dati saranno salvati.", "filedEnable": "Attivato", "filedDisable": "Disattivato" } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_pl_PL.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_pl_PL.json index 14584ae20d02..59d960eef6a3 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_pl_PL.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_pl_PL.json @@ -54,10 +54,10 @@ "sshKeyConfigurationHelperBis": "Połącz klucze SSH z Twoim notebookiem za pomocą poniższej listy rozwijanej", "summaryFieldFlavorVMemory": "{{memory}} VRAM", "qpuQubits": "Kubity", - "defaultAutoRestartInfo": "Notebook zostanie automatycznie zatrzymany po 7 dniach. Konfiguracja i dane zostaną zapisane.", + "defaultAutoRestartInfo": "Notebook zostanie automatycznie wyłączony po 7 dniach ciągłej pracy. Twoja konfiguracja i dane zostaną zapisane.", "fieldTimeOutLabel": "Data ważności", "fieldAutoRestartLabel": "Automatyczny restart", - "fieldAutoRestartDescription": "Jeśli opcja jest włączona, notebook będzie automatycznie restartowany co 7 dni. Jeśli opcja jest wyłączona, notebook zostanie automatycznie zatrzymany po 7 dniach. W obu przypadkach konfiguracja i dane zostaną zapisane.", + "fieldAutoRestartDescription": "Jeśli włączone, notebook zostanie automatycznie uruchomiony ponownie co 7 dni ciągłej pracy. Jeśli wyłączone, notebook zostanie automatycznie wyłączony po 7 dniach ciągłej pracy. W obu przypadkach twoja konfiguracja i dane zostaną zapisane.", "filedEnable": "Włączony", "filedDisable": "Wyłączony" } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_pt_PT.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_pt_PT.json index 843e165381cc..33dc7baf5179 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_pt_PT.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/create/Messages_pt_PT.json @@ -54,10 +54,10 @@ "sshKeyConfigurationHelperBis": "Use a lista pendente abaixo para associar chaves SSH ao seu notebook", "summaryFieldFlavorVMemory": "{{memory}} VRAM", "qpuQubits": "Qubits", - "defaultAutoRestartInfo": "O notebook será interrompido automaticamente após 7 dias. A sua configuração e os seus dados serão guardados.", + "defaultAutoRestartInfo": "O notebook será desligado automaticamente após 7 dias de funcionamento consecutivos. A sua configuração e os seus dados serão guardados.", "fieldTimeOutLabel": "Expiração", "fieldAutoRestartLabel": "Reinicialização automática", - "fieldAutoRestartDescription": "Se ativado, o notebook será automaticamente reiniciado a cada 7 dias. Se desativado, o notebook será automaticamente interrompido após 7 dias. Em ambos os casos, a sua configuração e os seus dados serão guardados.", + "fieldAutoRestartDescription": "Se ativado, o notebook será reiniciado automaticamente a cada 7 dias de funcionamento consecutivos. Se desativado, o notebook será desligado automaticamente após 7 dias de funcionamento consecutivos. Em ambos os casos, a sua configuração e os seus dados serão guardados.", "filedEnable": "Ativado", "filedDisable": "Desativado" } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_de_DE.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_de_DE.json index 4ae8e405cfcb..30f79541b7e8 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_de_DE.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_de_DE.json @@ -32,18 +32,20 @@ "stopNotebookButtonConfirm": "Anhalten", "stopNotebookToastSuccessDescription": "Das Notebook {{name}} wurde angehalten", "restartNotebookTitle": "Notebook neu starten", - "restartNotebookDescription": "Möchten Sie das Notebook „{{name}}“ wirklich neu starten? Nach dem Neustart bleibt es für weitere 7 Tage ab dem Tag des Neustarts aktiv.", + "restartNotebookDescription": "Sind Sie sicher, dass Sie das Notebook {{name}} neu starten möchten? Nach dem Neustart bleibt es für weitere 7 aufeinanderfolgende Betriebstage aktiv, beginnend mit dem Tag des Neustarts.", "restartNotebookButtonConfirm": "Neu starten", "restartNotebookToastSuccessDescription": "Das Notebook {{name}} wurde neu gestartet.", "restartNotebookToastSuccess": "Das Notebook {{name}} wurde neu gestartet.", "enableAutoRestartTitle": "Automatischen Neustart aktivieren", - "enableAutoRestartDescription": "Möchten Sie den automatischen Neustart für das Notebook „{{name}}“ wirklich aktivieren? Ist diese Option einmal aktiviert, wird das Notebook alle 7 Tage automatisch neu gestartet.", + "enableAutoRestartDescription": "Sind Sie sicher, dass Sie den automatischen Neustart für das Notebook {{name}} aktivieren möchten? Sobald diese Option aktiviert ist, wird das Notebook alle 7 aufeinanderfolgende Betriebstage automatisch neu gestartet.", "enableAutoRestartButtonConfirm": "Aktivieren", "enableAutoRestartToastSuccessDescription": "Der automatische Neustart wurde für das Notebook {{name}} aktiviert.", "disableAutoRestartTitle": "Automatischen Neustart deaktivieren", - "disableAutoRestartDescription": "Möchten Sie den automatischen Neustart für das Notebook „{{name}}“ wirklich deaktivieren? Wenn diese Option deaktiviert ist, startet das Notebook nicht mehr automatisch alle 7 Tage neu. ", + "disableAutoRestartDescription": "Sind Sie sicher, dass Sie den automatischen Neustart für das Notebook {{name}} deaktivieren möchten? Sobald diese Option deaktiviert ist, wird das Notebook nicht mehr automatisch alle 7 aufeinanderfolgende Betriebstage neu gestartet. ", "disableAutoRestartButtonConfirm": "Deaktivieren", "disableAutoRestartToastSuccessDescription": "Der automatische Neustart wurde für das Notebook {{name}} deaktiviert.", "shutdownLabel": "Beenden am ", - "restartLabel": "Neustart am " + "restartLabel": "Neustart am ", + "waitingResourceLabel": "Warten auf eine verfügbare Ressource", + "pendingTimeoutHint": "Das Ablaufdatum wird festgelegt, wenn das Notebook ausgeführt wird." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_en_GB.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_en_GB.json index 26eff7807c40..849f0cf1c028 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_en_GB.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_en_GB.json @@ -33,18 +33,20 @@ "stopNotebookButtonConfirm": "Stop", "stopNotebookToastSuccessDescription": "The {{name}} notebook has been stopped", "restartNotebookTitle": "Restart notebook", - "restartNotebookDescription": "Are you sure you want to restart the {{name}} notebook? After restarting, it will remain active for an additional 7 days.", + "restartNotebookDescription": "Are you sure you want to restart the notebook {{name}}? Once restarted, it will remain active for an additional 7 consecutive days of operation from the day of the restart.", "restartNotebookButtonConfirm": "Restart", "restartNotebookToastSuccessDescription": "The {{name}} notebook has restarted", "restartNotebookToastSuccess": "The {{name}} notebook has restarted", "enableAutoRestartTitle": "Enable automatic restart", - "enableAutoRestartDescription": "Are you sure you want to enable automatic restart for the {{name}} notebook? Once this option is enabled, the notebook will automatically restart every 7 days.", + "enableAutoRestartDescription": "Are you sure you want to enable automatic restart for the notebook {{name}}? Once this option is enabled, the notebook will automatically restart every 7 consecutive days of operation.", "enableAutoRestartButtonConfirm": "Enable", "enableAutoRestartToastSuccessDescription": "Automatic restart has been enabled for the {{name}} notebook", "disableAutoRestartTitle": "Disable automatic restart", - "disableAutoRestartDescription": "Are you sure you want to disable automatic restart for the {{name}} notebook? Once this option is disabled, the notebook will no longer automatically restart every 7 days. ", + "disableAutoRestartDescription": "Are you sure you want to disable automatic restart for the notebook {{name}}? Once this option is disabled, the notebook will no longer automatically restart every 7 consecutive days of operation. ", "disableAutoRestartButtonConfirm": "Disable", "disableAutoRestartToastSuccessDescription": "Automatic restart has been disabled for the {{name}} notebook", "shutdownLabel": "Stops on ", - "restartLabel": "Restarts on " + "restartLabel": "Restarts on ", + "waitingResourceLabel": "Waiting for an available resource", + "pendingTimeoutHint": "The expiration date will be set when the notebook is running." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_es_ES.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_es_ES.json index faf69e8158db..066046f0844f 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_es_ES.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_es_ES.json @@ -32,18 +32,20 @@ "stopNotebookButtonConfirm": "Detener", "stopNotebookToastSuccessDescription": "El notebook {{name}} se ha detenido", "restartNotebookTitle": "Reiniciar el notebook", - "restartNotebookDescription": "¿Seguro que quiere reiniciar el notebook {{name}} ? Una vez reiniciado, permanecerá activo durante 7 días más a partir del día del reinicio.", + "restartNotebookDescription": "¿Está seguro de que desea reiniciar el cuaderno {{name}}? Una vez reiniciado, permanecerá activo durante 7 días de funcionamiento consecutivos a partir del día del reinicio.", "restartNotebookButtonConfirm": "Reiniciar", "restartNotebookToastSuccessDescription": "Se ha reiniciado el notebook {{name}}", "restartNotebookToastSuccess": "Se ha reiniciado el notebook {{name}}", "enableAutoRestartTitle": "Activar el reinicio automático", - "enableAutoRestartDescription": "¿Seguro que quiere activar el reinicio automático para el notebook {{name}} ? Una vez activado, el notebook se reiniciará automáticamente cada 7 días.", + "enableAutoRestartDescription": "¿Está seguro de que desea activar el reinicio automático para el cuaderno {{name}}? Una vez que esta opción esté activada, el cuaderno se reiniciará automáticamente cada 7 días de funcionamiento consecutivos.", "enableAutoRestartButtonConfirm": "Activar", "enableAutoRestartToastSuccessDescription": "Se ha habilitado el reinicio automático para el notebook {{name}}", "disableAutoRestartTitle": "Desactivar el reinicio automático", - "disableAutoRestartDescription": "¿Seguro que quiere desactivar el reinicio automático para el notebook {{name}} ? Una vez desactivada esta opción, el notebook no se reiniciará automáticamente cada 7 días. ", + "disableAutoRestartDescription": "¿Está seguro de que desea desactivar el reinicio automático para el cuaderno {{name}}? Una vez que esta opción esté desactivada, el cuaderno ya no se reiniciará automáticamente cada 7 días de funcionamiento consecutivos. ", "disableAutoRestartButtonConfirm": "Desactivar", "disableAutoRestartToastSuccessDescription": "Se ha deshabilitado el reinicio automático para el notebook {{name}}", "shutdownLabel": "Detención el ", - "restartLabel": "Reinicio el " + "restartLabel": "Reinicio el ", + "waitingResourceLabel": "Esperando un recurso disponible", + "pendingTimeoutHint": "La fecha de expiración se establecerá cuando el cuaderno esté en ejecución." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_fr_CA.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_fr_CA.json index 9c8ad008cf99..b83ec6879be1 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_fr_CA.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_fr_CA.json @@ -19,16 +19,16 @@ "startNotebookButtonConfirm": "Démarrer", "startNotebookToastSuccessDescription": "Le notebook {{name}} a été démarré", "restartNotebookTitle": "Redémarrer le notebook", - "restartNotebookDescription": "Êtes-vous sûr de vouloir redémarrer le notebook {{name}} ? Une fois redémarré, il restera actif pendant 7 jours supplémentaires à compter du jour du redémarrage.", + "restartNotebookDescription": "Êtes-vous sûr de vouloir redémarrer le notebook {{name}} ? Une fois redémarré, il restera actif pendant 7 jours de fonctionnement consécutifs supplémentaires à compter du jour du redémarrage.", "restartNotebookButtonConfirm": "Redémarrer", "restartNotebookToastSuccessDescription": "Le notebook {{name}} a été redémarré", "restartNotebookToastSuccess": "Le notebook {{name}} a été redémarré", "enableAutoRestartTitle": "Activer le redémarrage automatique", - "enableAutoRestartDescription": "Êtes-vous sûr de vouloir activer le redémarrage automatique pour le notebook {{name}} ? Une fois cette option activée, le notebook redémarrera automatiquement tous les 7 jours.", + "enableAutoRestartDescription": "Êtes-vous sûr de vouloir activer le redémarrage automatique pour le notebook {{name}} ? Une fois cette option activée, le notebook redémarrera automatiquement tous les 7 jours de fonctionnement consécutifs.", "enableAutoRestartButtonConfirm": "Activer", "enableAutoRestartToastSuccessDescription": "Le redémarrage automatique a été activé pour le notebook {{name}}", "disableAutoRestartTitle": "Désactiver le redémarrage automatique", - "disableAutoRestartDescription": "Êtes-vous sûr de vouloir désactiver le redémarrage automatique pour le notebook {{name}} ? Une fois cette option désactivée, le notebook ne redémarrera plus automatiquement tous les 7 jours. ", + "disableAutoRestartDescription": "Êtes-vous sûr de vouloir désactiver le redémarrage automatique pour le notebook {{name}} ? Une fois cette option désactivée, le notebook ne redémarrera plus automatiquement tous les 7 jours de fonctionnement consécutifs. ", "disableAutoRestartButtonConfirm": "Désactiver", "disableAutoRestartToastSuccessDescription": "Le redémarrage automatique a été désactivé pour le notebook {{name}}", "shutdownLabel": "Arrêt le ", @@ -45,5 +45,7 @@ "stopNotebookDescription3": "Nous restaurerons votre Espace de Travail et réallouerons des ressources de calculs.", "stopNotebookConfirmation": "Etes-vous sur de vouloir arrêter le notebook {{name}} ?", "stopNotebookButtonConfirm": "Arrêter", - "stopNotebookToastSuccessDescription": "Le notebook {{name}} a été arrêté" + "stopNotebookToastSuccessDescription": "Le notebook {{name}} a été arrêté", + "waitingResourceLabel": "En attente d'une ressource disponible", + "pendingTimeoutHint": "La date d'expiration sera définie lorsque le notebook sera en cours d'exécution." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_fr_FR.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_fr_FR.json index 9c8ad008cf99..b83ec6879be1 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_fr_FR.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_fr_FR.json @@ -19,16 +19,16 @@ "startNotebookButtonConfirm": "Démarrer", "startNotebookToastSuccessDescription": "Le notebook {{name}} a été démarré", "restartNotebookTitle": "Redémarrer le notebook", - "restartNotebookDescription": "Êtes-vous sûr de vouloir redémarrer le notebook {{name}} ? Une fois redémarré, il restera actif pendant 7 jours supplémentaires à compter du jour du redémarrage.", + "restartNotebookDescription": "Êtes-vous sûr de vouloir redémarrer le notebook {{name}} ? Une fois redémarré, il restera actif pendant 7 jours de fonctionnement consécutifs supplémentaires à compter du jour du redémarrage.", "restartNotebookButtonConfirm": "Redémarrer", "restartNotebookToastSuccessDescription": "Le notebook {{name}} a été redémarré", "restartNotebookToastSuccess": "Le notebook {{name}} a été redémarré", "enableAutoRestartTitle": "Activer le redémarrage automatique", - "enableAutoRestartDescription": "Êtes-vous sûr de vouloir activer le redémarrage automatique pour le notebook {{name}} ? Une fois cette option activée, le notebook redémarrera automatiquement tous les 7 jours.", + "enableAutoRestartDescription": "Êtes-vous sûr de vouloir activer le redémarrage automatique pour le notebook {{name}} ? Une fois cette option activée, le notebook redémarrera automatiquement tous les 7 jours de fonctionnement consécutifs.", "enableAutoRestartButtonConfirm": "Activer", "enableAutoRestartToastSuccessDescription": "Le redémarrage automatique a été activé pour le notebook {{name}}", "disableAutoRestartTitle": "Désactiver le redémarrage automatique", - "disableAutoRestartDescription": "Êtes-vous sûr de vouloir désactiver le redémarrage automatique pour le notebook {{name}} ? Une fois cette option désactivée, le notebook ne redémarrera plus automatiquement tous les 7 jours. ", + "disableAutoRestartDescription": "Êtes-vous sûr de vouloir désactiver le redémarrage automatique pour le notebook {{name}} ? Une fois cette option désactivée, le notebook ne redémarrera plus automatiquement tous les 7 jours de fonctionnement consécutifs. ", "disableAutoRestartButtonConfirm": "Désactiver", "disableAutoRestartToastSuccessDescription": "Le redémarrage automatique a été désactivé pour le notebook {{name}}", "shutdownLabel": "Arrêt le ", @@ -45,5 +45,7 @@ "stopNotebookDescription3": "Nous restaurerons votre Espace de Travail et réallouerons des ressources de calculs.", "stopNotebookConfirmation": "Etes-vous sur de vouloir arrêter le notebook {{name}} ?", "stopNotebookButtonConfirm": "Arrêter", - "stopNotebookToastSuccessDescription": "Le notebook {{name}} a été arrêté" + "stopNotebookToastSuccessDescription": "Le notebook {{name}} a été arrêté", + "waitingResourceLabel": "En attente d'une ressource disponible", + "pendingTimeoutHint": "La date d'expiration sera définie lorsque le notebook sera en cours d'exécution." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_it_IT.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_it_IT.json index 98a123fe7e37..743d0f659029 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_it_IT.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_it_IT.json @@ -32,18 +32,20 @@ "stopNotebookButtonConfirm": "Arrestare", "stopNotebookToastSuccessDescription": "Il notebook {{name}} è stato arrestato", "restartNotebookTitle": "Riavviare il notebook", - "restartNotebookDescription": "Vuoi davvero riavviare il notebook {{name}}? Una volta riavviato, resterà attivo per altri 7 giorni a partire dal giorno del riavvio.", + "restartNotebookDescription": "Sei sicuro di voler riavviare il notebook {{name}}? Una volta riavviato, rimarrà attivo per 7 giorni di funzionamento consecutivi a partire dal giorno del riavvio.", "restartNotebookButtonConfirm": "Riavvia", "restartNotebookToastSuccessDescription": "Il notebook {{name}} è stato riavviato", "restartNotebookToastSuccess": "Il notebook {{name}} è stato riavviato", "enableAutoRestartTitle": "Attivare il riavvio automatico", - "enableAutoRestartDescription": "Vuoi davvero attivare il riavvio automatico per il notebook {{name}}? Una volta attivata questa opzione, il notebook si riavvierà automaticamente ogni 7 giorni.", + "enableAutoRestartDescription": "Sei sicuro di voler attivare il riavvio automatico per il notebook {{name}}? Una volta attivata questa opzione, il notebook si riavvierà automaticamente ogni 7 giorni di funzionamento consecutivi.", "enableAutoRestartButtonConfirm": "Attivare", "enableAutoRestartToastSuccessDescription": "Il riavvio automatico è stato attivato per il notebook {{name}}", "disableAutoRestartTitle": "Disattivare il riavvio automatico", - "disableAutoRestartDescription": "Vuoi davvero disattivare il riavvio automatico per il notebook {{name}}? Una volta disattivata questa opzione, il notebook non si riavvierà più automaticamente ogni 7 giorni. ", + "disableAutoRestartDescription": "Sei sicuro di voler disattivare il riavvio automatico per il notebook {{name}}? Una volta disattivata questa opzione, il notebook non si riavvierà più automaticamente ogni 7 giorni di funzionamento consecutivi. ", "disableAutoRestartButtonConfirm": "Disattivare", "disableAutoRestartToastSuccessDescription": "Il riavvio automatico è stato disattivato per il notebook {{name}}", "shutdownLabel": "Arresto il ", - "restartLabel": "Riavvio il " + "restartLabel": "Riavvio il ", + "waitingResourceLabel": "In attesa di una risorsa disponibile", + "pendingTimeoutHint": "La data di scadenza sarà impostata quando il notebook sarà in esecuzione." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_pl_PL.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_pl_PL.json index fe7663aa0219..e7708642e651 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_pl_PL.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_pl_PL.json @@ -32,18 +32,20 @@ "stopNotebookButtonConfirm": "Zatrzymaj", "stopNotebookToastSuccessDescription": "Notebook {{name}} został zatrzymany", "restartNotebookTitle": "Zrestartuj notebook", - "restartNotebookDescription": "Czy na pewno chcesz zrestartować notebook {{name}}? Po restarcie notebook będzie aktywny przez kolejne 7 dni.", + "restartNotebookDescription": "Czy na pewno chcesz zrestartować notebook {{name}}? Po restarcie będzie aktywny przez dodatkowe 7 dni ciągłej pracy od dnia restartu.", "restartNotebookButtonConfirm": "Restart", "restartNotebookToastSuccessDescription": "Notebook {{name}} został zrestartowany", "restartNotebookToastSuccess": "Notebook {{name}} został zrestartowany", "enableAutoRestartTitle": "Włącz automatyczny restart", - "enableAutoRestartDescription": "Czy na pewno chcesz włączyć automatyczny restart dla notebooka {{name}}? Po włączeniu tej opcji notebook będzie automatycznie restartowany co 7 dni.", + "enableAutoRestartDescription": "Czy na pewno chcesz włączyć automatyczny restart dla notebooka {{name}}? Po włączeniu tej opcji notebook będzie automatycznie restartowany co 7 dni ciągłej pracy.", "enableAutoRestartButtonConfirm": "Włącz", "enableAutoRestartToastSuccessDescription": "Automatyczny restart został włączony dla notebooka {{name}}", "disableAutoRestartTitle": "Wyłącz automatyczny restart", - "disableAutoRestartDescription": "Czy na pewno chcesz wyłączyć automatyczny restart dla notebooka {{name}}? Po wyłączeniu tej opcji notebook nie będzie automatycznie restartowany co 7 dni. ", + "disableAutoRestartDescription": "Czy na pewno chcesz wyłączyć automatyczny restart dla notebooka {{name}}? Po wyłączeniu tej opcji notebook nie będzie już automatycznie restartowany co 7 dni ciągłej pracy. ", "disableAutoRestartButtonConfirm": "Wyłącz", "disableAutoRestartToastSuccessDescription": "Automatyczny restart został wyłączony dla notebooka {{name}}", "shutdownLabel": "Zatrzymanie dnia ", - "restartLabel": "Restart dnia " + "restartLabel": "Restart dnia ", + "waitingResourceLabel": "Oczekiwanie na dostępny zasób", + "pendingTimeoutHint": "Data wygaśnięcia zostanie ustawiona, gdy notebook będzie w trakcie działania." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_pt_PT.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_pt_PT.json index 312d1ff6c928..5cb9173ec672 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_pt_PT.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/notebooks/notebook/Messages_pt_PT.json @@ -32,18 +32,20 @@ "stopNotebookButtonConfirm": "Parar", "stopNotebookToastSuccessDescription": "O notebook {{name}} foi parado", "restartNotebookTitle": "Reiniciar o notebook", - "restartNotebookDescription": "Tem a certeza de que quer reiniciar o notebook {{name}}? Depois de reiniciado, estará ativo durante 7 dias suplementares a contar do dia da reinicialização.", + "restartNotebookDescription": "Tem certeza de que deseja reiniciar o notebook {{name}}? Uma vez reiniciado, ele permanecerá ativo por mais 7 dias de funcionamento consecutivos a partir do dia do reinício.", "restartNotebookButtonConfirm": "Reiniciar", "restartNotebookToastSuccessDescription": "O notebook {{name}} foi reiniciado", "restartNotebookToastSuccess": "O notebook {{name}} foi reiniciado", "enableAutoRestartTitle": "Ativar a reinicialização automática", - "enableAutoRestartDescription": "Tem a certeza de que quer ativar a reinicialização automática para o notebook {{name}}? Uma vez ativada esta opção, o notebook será automaticamente reiniciado a cada 7 dias.", + "enableAutoRestartDescription": "Tem certeza de que deseja ativar o reinício automático para o notebook {{name}}? Uma vez que esta opção esteja ativada, o notebook reiniciará automaticamente a cada 7 dias de funcionamento consecutivos.", "enableAutoRestartButtonConfirm": "Ativar", "enableAutoRestartToastSuccessDescription": "A reinicialização automática foi ativada para o notebook {{name}}", "disableAutoRestartTitle": "Desativar a reinicialização automática", - "disableAutoRestartDescription": "Tem a certeza de que quer desativar a reinicialização automática para o notebook {{name}} ? Uma vez desativada esta opção, o notebook não será reiniciado automaticamente a cada 7 dias. ", + "disableAutoRestartDescription": "Tem certeza de que deseja desativar o reinício automático para o notebook {{name}}? Uma vez que esta opção esteja desativada, o notebook não reiniciará mais automaticamente a cada 7 dias de funcionamento consecutivos. ", "disableAutoRestartButtonConfirm": "Desativar", "disableAutoRestartToastSuccessDescription": "A reinicialização automática foi desativada para o notebook {{name}}", "shutdownLabel": "Interrupção a ", - "restartLabel": "Reinicialização a " + "restartLabel": "Reinicialização a ", + "waitingResourceLabel": "Aguardando um recurso disponível", + "pendingTimeoutHint": "A data de expiração será definida quando o notebook estiver em execução." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_de_DE.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_de_DE.json index b263857ce5d3..bd0bca02b909 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_de_DE.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_de_DE.json @@ -59,5 +59,5 @@ "defaultAutoRestartInfo": "Die QPU-Notebooks können nicht ohne automatischen Neustart heruntergefahren werden. Diese Funktion ist standardmäßig aktiviert, um die Kontinuität Ihrer QPU-Berechnungen zu gewährleisten.", "fieldTimeOutLabel": "Ablauf", "fieldAutoRestartLabel": "Automatischer Neustart", - "fieldAutoRestartDescription": "Bei Aktivierung wird das Notebook alle 7 Tage automatisch neu gestartet. Bei Deaktivierung wird das Notebook nach 7 Tagen automatisch beendet. In jedem Fall werden Ihre Konfiguration und Daten gespeichert." + "fieldAutoRestartDescription": "Wenn aktiviert, wird das Notebook automatisch alle 7 aufeinanderfolgenden Betriebstage neu gestartet. Wenn deaktiviert, wird das Notebook automatisch nach 7 aufeinanderfolgenden Betriebstagen heruntergefahren. In beiden Fällen werden Ihre Konfiguration und Ihre Daten gespeichert." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_en_GB.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_en_GB.json index c027b010d34d..88f1ac4dc743 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_en_GB.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_en_GB.json @@ -59,5 +59,5 @@ "defaultAutoRestartInfo": "QPU notebooks cannot be stopped without automatic restart. This feature is enabled by default to ensure the continuity of your QPU calculations.", "fieldTimeOutLabel": "Expiry", "fieldAutoRestartLabel": "Automatic restart", - "fieldAutoRestartDescription": "If enabled, the notebook will automatically restart every 7 days. If disabled, the notebook will automatically stop after 7 days. In both cases, your configuration and data will be saved." + "fieldAutoRestartDescription": "If enabled, the notebook will automatically restart every 7 consecutive days of operation. If disabled, the notebook will automatically shut down after 7 consecutive days of operation. In both cases, your configuration and data will be saved." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_es_ES.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_es_ES.json index ea3558a21eb1..80967ac01cb3 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_es_ES.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_es_ES.json @@ -59,5 +59,5 @@ "defaultAutoRestartInfo": "Los notebooks QPU no se pueden apagar sin reinicio automático. Esta función está habilitada por defecto para asegurar la continuidad de sus cálculos QPU.", "fieldTimeOutLabel": "Expiración", "fieldAutoRestartLabel": "Reinicio automático", - "fieldAutoRestartDescription": "Si está activado, el notebook se reiniciará automáticamente cada 7 días. Si se desactiva, el notebook se detendrá automáticamente al cabo de 7 días. En los dos casos, se guardarán la configuración y los datos." + "fieldAutoRestartDescription": "Si se activa, el portátil se reiniciará automáticamente cada 7 días de funcionamiento consecutivos. Si se desactiva, el portátil se apagará automáticamente después de 7 días de funcionamiento consecutivos. En ambos casos, su configuración y sus datos se guardarán." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_fr_CA.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_fr_CA.json index bc9db5b89c56..dcdaad1dc440 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_fr_CA.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_fr_CA.json @@ -30,7 +30,7 @@ "defaultAutoRestartInfo": "Les notebooks QPU ne peuvent pas être arrêtés sans redémarrage automatique. Cette fonctionnalité est activée par défaut pour assurer la continuité de vos calculs QPU.", "fieldTimeOutLabel": "Expiration", "fieldAutoRestartLabel": "Redémarrage automatique", - "fieldAutoRestartDescription": "Si activé, le notebook sera automatiquement redémarré tous les 7 jours. Si désactivé, le notebook sera automatiquement arrêté après 7 jours. Dans les 2 cas, votre configuration et vos données seront enregistrées.", + "fieldAutoRestartDescription": "Si activé, le notebook sera automatiquement redémarré tous les 7 jours de fonctionnement consécutifs. Si désactivé, le notebook sera automatiquement arrêté après 7 jours de fonctionnement consécutifs. Dans les 2 cas, votre configuration et vos données seront enregistrées.", "formButtonAdvancedConfiguration": "Configuration avancée", "summaryFieldVolumesLabel": "Volume:", "summaryFieldVolumes_one": "{{count}} volume configuré", diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_fr_FR.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_fr_FR.json index bc9db5b89c56..dcdaad1dc440 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_fr_FR.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_fr_FR.json @@ -30,7 +30,7 @@ "defaultAutoRestartInfo": "Les notebooks QPU ne peuvent pas être arrêtés sans redémarrage automatique. Cette fonctionnalité est activée par défaut pour assurer la continuité de vos calculs QPU.", "fieldTimeOutLabel": "Expiration", "fieldAutoRestartLabel": "Redémarrage automatique", - "fieldAutoRestartDescription": "Si activé, le notebook sera automatiquement redémarré tous les 7 jours. Si désactivé, le notebook sera automatiquement arrêté après 7 jours. Dans les 2 cas, votre configuration et vos données seront enregistrées.", + "fieldAutoRestartDescription": "Si activé, le notebook sera automatiquement redémarré tous les 7 jours de fonctionnement consécutifs. Si désactivé, le notebook sera automatiquement arrêté après 7 jours de fonctionnement consécutifs. Dans les 2 cas, votre configuration et vos données seront enregistrées.", "formButtonAdvancedConfiguration": "Configuration avancée", "summaryFieldVolumesLabel": "Volume:", "summaryFieldVolumes_one": "{{count}} volume configuré", diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_it_IT.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_it_IT.json index 41650b8058e8..529f23cf0436 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_it_IT.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_it_IT.json @@ -59,5 +59,5 @@ "defaultAutoRestartInfo": "I notebook QPU non possono essere spenti senza riavvio automatico. Questa funzionalità è attivata per impostazione predefinita per garantire la continuità dei tuoi calcoli QPU.", "fieldTimeOutLabel": "Scadenza", "fieldAutoRestartLabel": "Riavvio automatico", - "fieldAutoRestartDescription": "Se attivato, il notebook verrà automaticamente riavviato ogni 7 giorni. Se disattivato, il notebook verrà automaticamente arrestato dopo 7 giorni. In entrambi i casi, la tua configurazione e i tuoi dati verranno salvati." + "fieldAutoRestartDescription": "Se attivato, il notebook verrà riavviato automaticamente ogni 7 giorni di funzionamento consecutivi. Se disattivato, il notebook verrà arrestato automaticamente dopo 7 giorni di funzionamento consecutivi. In entrambi i casi, la tua configurazione e i tuoi dati verranno salvati." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_pl_PL.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_pl_PL.json index a180b1c6ff32..25736c41ace6 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_pl_PL.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_pl_PL.json @@ -59,5 +59,5 @@ "defaultAutoRestartInfo": "Notatniki QPU nie mogą być zatrzymywane bez automatycznego ponownego uruchomienia. Ta funkcjonalność jest domyślnie włączona, aby zapewnić ciągłość obliczeń QPU.", "fieldTimeOutLabel": "Data ważności", "fieldAutoRestartLabel": "Automatyczny restart", - "fieldAutoRestartDescription": "Jeśli opcja jest włączona, notebook będzie automatycznie restartowany co 7 dni. Jeśli opcja jest wyłączona, notebook zostanie automatycznie zatrzymany po 7 dniach. W obu przypadkach konfiguracja i dane zostaną zapisane." + "fieldAutoRestartDescription": "Jeśli włączone, notebook zostanie automatycznie uruchomiony ponownie co 7 dni ciągłej pracy. Jeśli wyłączone, notebook zostanie automatycznie zatrzymany po 7 dniach ciągłej pracy. W obu przypadkach twoja konfiguracja i dane zostaną zapisane." } diff --git a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_pt_PT.json b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_pt_PT.json index a9d92dbc3335..c72164cbf62d 100644 --- a/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_pt_PT.json +++ b/packages/manager/apps/pci-ai-tools/public/translations/ai-tools/qpu/create/Messages_pt_PT.json @@ -59,5 +59,5 @@ "defaultAutoRestartInfo": "Os notebooks QPU não podem ser desligados sem reinicialização automática. Esta funcionalidade está ativada por defeito para garantir a continuidade dos seus cálculos QPU.", "fieldTimeOutLabel": "Expiração", "fieldAutoRestartLabel": "Reinicialização automática", - "fieldAutoRestartDescription": "Se ativado, o notebook será automaticamente reiniciado a cada 7 dias. Se desativado, o notebook será automaticamente interrompido após 7 dias. Em ambos os casos, a sua configuração e os seus dados serão guardados." + "fieldAutoRestartDescription": "Se ativado, o notebook será reiniciado automaticamente a cada 7 dias de funcionamento consecutivos. Se desativado, o notebook será automaticamente desligado após 7 dias de funcionamento consecutivos. Em ambos os casos, a sua configuração e os seus dados serão salvos." } diff --git a/packages/manager/apps/pci-ai-tools/src/components/auto-restart/AutoRestartColumn.spec.tsx b/packages/manager/apps/pci-ai-tools/src/components/auto-restart/AutoRestartColumn.spec.tsx new file mode 100644 index 000000000000..3f0e5596ea85 --- /dev/null +++ b/packages/manager/apps/pci-ai-tools/src/components/auto-restart/AutoRestartColumn.spec.tsx @@ -0,0 +1,28 @@ +import { describe, expect, it } from 'vitest'; +import { fireEvent, render, screen, waitFor } from '@testing-library/react'; +import { AutoRestartColumn } from './AutoRestartColumn'; +import { RouterWithQueryClientWrapper } from '@/__tests__/helpers/wrappers/RouterWithQueryClientWrapper'; + +describe('AutoRestartColumn', () => { + it('renders pending state instead of expiry date when job is waiting for resources', async () => { + render( + , + { + wrapper: RouterWithQueryClientWrapper, + }, + ); + + expect(screen.getByText('waitingResourceLabel')).toBeTruthy(); + + fireEvent.click(screen.getByTestId('pending-timeout-info-trigger')); + + await waitFor(() => { + expect(screen.getByText('pendingTimeoutHint')).toBeTruthy(); + }); + }); +}); diff --git a/packages/manager/apps/pci-ai-tools/src/components/auto-restart/AutoRestartColumn.tsx b/packages/manager/apps/pci-ai-tools/src/components/auto-restart/AutoRestartColumn.tsx index 2731adb73e59..6f78362182ca 100644 --- a/packages/manager/apps/pci-ai-tools/src/components/auto-restart/AutoRestartColumn.tsx +++ b/packages/manager/apps/pci-ai-tools/src/components/auto-restart/AutoRestartColumn.tsx @@ -1,4 +1,4 @@ -import { RefreshCcw, OctagonX, Info } from 'lucide-react'; +import { RefreshCcw, OctagonX, Info, CircleAlert } from 'lucide-react'; import { format } from 'date-fns'; import { useTranslation } from 'react-i18next'; import { Popover, PopoverContent, PopoverTrigger } from '@datatr-ux/uxlib'; @@ -8,22 +8,54 @@ import { useDateFnsLocale } from '@/hooks/useDateFnsLocale.hook'; interface AutoRestartColumnProps { timeoutAutoRestart: boolean; timeoutAt?: string; + statusCode?: string; + statusState?: string; translationNamespace?: string; } export const AutoRestartColumn = ({ timeoutAutoRestart, timeoutAt, + statusCode, + statusState, translationNamespace = 'ai-tools/jobs', }: AutoRestartColumnProps) => { const { t } = useTranslation(translationNamespace); + const isPendingCode = ['JOB_PENDING', 'NOTEBOOK_PENDING'].includes( + statusCode ?? '', + ); + const isPendingState = ['PENDING', 'QUEUED', 'STARTING'].includes( + statusState ?? '', + ); + const isJobPending = isPendingCode || isPendingState; + + if (isJobPending) { + return ( +
+ + + + + + +

{t('pendingTimeoutHint')}

+
+
+ {t('waitingResourceLabel')} +
+
+ ); + } if (!timeoutAt) { return --; } const Icon = timeoutAutoRestart ? RefreshCcw : OctagonX; - const prefix = timeoutAutoRestart ? t('restartLabel') : t('shutdownLabel'); + const labelKey = timeoutAutoRestart ? 'restartLabel' : 'shutdownLabel'; const dateLocale = useDateFnsLocale(); const timeoutAtDate = format(timeoutAt, 'PPpp', { locale: dateLocale }); const shortDate = format(timeoutAt, 'd MMM yyyy', { locale: fr }); @@ -41,7 +73,7 @@ export const AutoRestartColumn = ({ - {t(`${prefix}`, { + {t(labelKey, { timeout: timeoutAtDate, })} diff --git a/packages/manager/apps/pci-ai-tools/src/pages/jobs/[jobId]/_components/JobHeader.component.tsx b/packages/manager/apps/pci-ai-tools/src/pages/jobs/[jobId]/_components/JobHeader.component.tsx index 2323e311f70b..61e8b47687c0 100644 --- a/packages/manager/apps/pci-ai-tools/src/pages/jobs/[jobId]/_components/JobHeader.component.tsx +++ b/packages/manager/apps/pci-ai-tools/src/pages/jobs/[jobId]/_components/JobHeader.component.tsx @@ -3,6 +3,7 @@ import { useNavigate } from 'react-router-dom'; import { format } from 'date-fns'; import { BrainCircuitIcon, + CircleAlert, Globe, LockKeyhole, OctagonX, @@ -11,7 +12,14 @@ import { Square, } from 'lucide-react'; import { useState } from 'react'; -import { Badge, Button, Skeleton } from '@datatr-ux/uxlib'; +import { + Badge, + Button, + Popover, + PopoverContent, + PopoverTrigger, + Skeleton, +} from '@datatr-ux/uxlib'; import { useDateFnsLocale } from '@/hooks/useDateFnsLocale.hook'; import ai from '@/types/AI'; import JobStatusBadge from '../../_components/JobStatusBadge.component'; @@ -28,6 +36,61 @@ export const JobHeader = ({ job }: { job: ai.job.Job }) => { const [isStopOpen, setIsStopOpen] = useState(false); const dateLocale = useDateFnsLocale(); const isAutoRestart = job.spec.timeoutAutoRestart; + const pendingCode = + (job.status as unknown as { code?: string }).code ?? job.status.info?.code; + const isPendingState = ['PENDING', 'QUEUED'].includes(job.status.state ?? ''); + const isJobPending = + ['JOB_PENDING', 'NOTEBOOK_PENDING'].includes(pendingCode ?? '') || + isPendingState; + const timeoutAt = job.status.timeoutAt; + const timeoutAtDate = timeoutAt ? new Date(timeoutAt) : null; + const hasValidTimeoutAt = + !!timeoutAtDate && !Number.isNaN(timeoutAtDate.getTime()); + const formattedTimeoutAt = + hasValidTimeoutAt && timeoutAtDate + ? format(timeoutAtDate, 'PPpp', { + locale: dateLocale, + }) + : null; + let timeoutBadgeContent = null; + if (isJobPending) { + timeoutBadgeContent = ( + <> + + + + + +

{t('pendingTimeoutHint')}

+
+
+ {t('waitingResourceLabel')} + + ); + } else if (isAutoRestart && formattedTimeoutAt) { + timeoutBadgeContent = ( + <> + + + {t('restartLabel')} + {formattedTimeoutAt} + + + ); + } else if (formattedTimeoutAt) { + timeoutBadgeContent = ( + <> + + + {t('shutdownLabel')} + {formattedTimeoutAt} + + + ); + } return ( <>
{
{job.spec.image} - {job.status.timeoutAt && ( + {(isJobPending || hasValidTimeoutAt) && (
- {isAutoRestart ? ( - <> - - - {t('restartLabel')} - {format(job.status.timeoutAt, 'PPpp', { - locale: dateLocale, - })} - - - ) : ( - <> - - - {t('shutdownLabel')} - {format(job.status.timeoutAt, 'PPpp', { - locale: dateLocale, - })} - - - )} + {timeoutBadgeContent}
)} diff --git a/packages/manager/apps/pci-ai-tools/src/pages/jobs/[jobId]/_components/JobHeader.spec.tsx b/packages/manager/apps/pci-ai-tools/src/pages/jobs/[jobId]/_components/JobHeader.spec.tsx index 49de2408b61f..f22e461ed8bd 100644 --- a/packages/manager/apps/pci-ai-tools/src/pages/jobs/[jobId]/_components/JobHeader.spec.tsx +++ b/packages/manager/apps/pci-ai-tools/src/pages/jobs/[jobId]/_components/JobHeader.spec.tsx @@ -21,6 +21,21 @@ const stroppedJob: ai.job.Job = { state: ai.job.JobStateEnum.DONE, }, }; + +const pendingJob: ai.job.Job = { + ...mockedJob, + status: { + ...mockedJobStatus, + state: ai.job.JobStateEnum.PENDING, + timeoutAt: '2026-01-28T13:55:10Z', + info: { + ...mockedJobStatus.info, + code: 'JOB_PENDING' as ai.InfoCodeEnum, + message: + 'Warning: job is still looking for an available host (ranked 2 over 2 in the waiting queue for given flavor and count)', + }, + }, +}; describe('AppHeader component', () => { beforeEach(() => { vi.restoreAllMocks(); @@ -71,4 +86,28 @@ describe('AppHeader component', () => { expect(screen.queryByTestId('restart-job-modal')).toBeNull(); }); }); + + it('renders pending expiry information when job is waiting for resources', async () => { + render(, { + wrapper: RouterWithQueryClientWrapper, + }); + + expect(screen.getByText('waitingResourceLabel')).toBeTruthy(); + + fireEvent.click(screen.getByTestId('job-pending-timeout-info-trigger')); + + await waitFor(() => { + expect( + screen.getByText( + 'pendingTimeoutHint', + ), + ).toBeTruthy(); + }); + + expect( + screen.queryByText( + 'Warning: job is still looking for an available host (ranked 2 over 2 in the waiting queue for given flavor and count)', + ), + ).toBeNull(); + }); }); diff --git a/packages/manager/apps/pci-ai-tools/src/pages/jobs/_components/JobsListColumns.component.tsx b/packages/manager/apps/pci-ai-tools/src/pages/jobs/_components/JobsListColumns.component.tsx index aa100aaa716e..31fafb942a28 100644 --- a/packages/manager/apps/pci-ai-tools/src/pages/jobs/_components/JobsListColumns.component.tsx +++ b/packages/manager/apps/pci-ai-tools/src/pages/jobs/_components/JobsListColumns.component.tsx @@ -164,6 +164,11 @@ export const getColumns = ({ ), diff --git a/packages/manager/apps/pci-ai-tools/src/pages/notebooks/[notebookId]/_components/NotebookHeader.component.tsx b/packages/manager/apps/pci-ai-tools/src/pages/notebooks/[notebookId]/_components/NotebookHeader.component.tsx index 23c74cdca6f9..18051c8815b4 100644 --- a/packages/manager/apps/pci-ai-tools/src/pages/notebooks/[notebookId]/_components/NotebookHeader.component.tsx +++ b/packages/manager/apps/pci-ai-tools/src/pages/notebooks/[notebookId]/_components/NotebookHeader.component.tsx @@ -2,6 +2,7 @@ import { useTranslation } from 'react-i18next'; import { format } from 'date-fns'; import { ArrowUpRightFromSquare, + CircleAlert, Globe, LockKeyhole, NotebookText, @@ -11,7 +12,14 @@ import { Square, } from 'lucide-react'; import { useState } from 'react'; -import { Badge, Button, Skeleton } from '@datatr-ux/uxlib'; +import { + Badge, + Button, + Popover, + PopoverContent, + PopoverTrigger, + Skeleton, +} from '@datatr-ux/uxlib'; import ai from '@/types/AI'; import NotebookStatusBadge from '../../_components/NotebookStatusBadge.component'; import A from '@/components/links/A.component'; @@ -34,6 +42,63 @@ export const NotebookHeader = ({ const [isStopOpen, setIsStopOpen] = useState(false); const isAutoRestart = notebook.spec.timeoutAutoRestart; const dateLocale = useDateFnsLocale(); + const pendingCode = + notebook.status.info?.code ?? notebook.status.lastJobStatus.info?.code; + const isPendingState = ['STARTING', 'PENDING', 'QUEUED'].includes( + notebook.status.state ?? notebook.status.lastJobStatus.state ?? '', + ); + const isJobPending = + ['JOB_PENDING', 'NOTEBOOK_PENDING'].includes(pendingCode ?? '') || + isPendingState; + const timeoutAt = notebook.status.lastJobStatus.timeoutAt; + const timeoutAtDate = timeoutAt ? new Date(timeoutAt) : null; + const hasValidTimeoutAt = + !!timeoutAtDate && !Number.isNaN(timeoutAtDate.getTime()); + const formattedTimeoutAt = + hasValidTimeoutAt && timeoutAtDate + ? format(timeoutAtDate, 'PPpp', { + locale: dateLocale, + }) + : null; + let timeoutBadgeContent = null; + if (isJobPending) { + timeoutBadgeContent = ( + <> + + + + + +

{t('pendingTimeoutHint')}

+
+
+ {t('waitingResourceLabel')} + + ); + } else if (isAutoRestart && formattedTimeoutAt) { + timeoutBadgeContent = ( + <> + + + {t('restartLabel')} + {formattedTimeoutAt} + + + ); + } else if (formattedTimeoutAt) { + timeoutBadgeContent = ( + <> + + + {t('shutdownLabel')} + {formattedTimeoutAt} + + + ); + } return ( <>
- {notebook.status.lastJobStatus.timeoutAt && ( + {(isJobPending || hasValidTimeoutAt) && (
- {isAutoRestart ? ( - <> - - - {t('restartLabel')} - {format( - notebook.status.lastJobStatus.timeoutAt, - 'PPpp', - { locale: dateLocale }, - )} - - - ) : ( - <> - - - {t('shutdownLabel')} - {format( - notebook.status.lastJobStatus.timeoutAt, - 'PPpp', - { locale: dateLocale }, - )} - - - )} + {timeoutBadgeContent}
)} diff --git a/packages/manager/apps/pci-ai-tools/src/pages/notebooks/[notebookId]/_components/NotebookHeader.spec.tsx b/packages/manager/apps/pci-ai-tools/src/pages/notebooks/[notebookId]/_components/NotebookHeader.spec.tsx index 4622caed5a14..6b1d1add6e8d 100644 --- a/packages/manager/apps/pci-ai-tools/src/pages/notebooks/[notebookId]/_components/NotebookHeader.spec.tsx +++ b/packages/manager/apps/pci-ai-tools/src/pages/notebooks/[notebookId]/_components/NotebookHeader.spec.tsx @@ -8,6 +8,9 @@ import { mockedNotebookStatus, } from '@/__tests__/helpers/mocks/notebook/notebook'; +const hiddenNotebookApiMessage = + "Pulling notebook's data"; + const runningNotebook: ai.notebook.Notebook = { ...mockedNotebook, status: { @@ -23,6 +26,24 @@ const stroppedNotebook: ai.notebook.Notebook = { state: ai.notebook.NotebookStateEnum.STOPPED, }, }; + +const pendingNotebook: ai.notebook.Notebook = { + ...mockedNotebook, + status: { + ...mockedNotebookStatus, + info: undefined, + state: ai.notebook.NotebookStateEnum.STARTING, + lastJobStatus: { + ...mockedNotebookStatus.lastJobStatus, + timeoutAt: '2026-01-28T13:55:10Z', + info: { + ...mockedNotebookStatus.lastJobStatus.info, + code: 'JOB_PENDING' as ai.InfoCodeEnum, + message: hiddenNotebookApiMessage, + }, + }, + }, +}; describe('Notebook Header component', () => { beforeEach(() => { vi.restoreAllMocks(); @@ -74,4 +95,26 @@ describe('Notebook Header component', () => { expect(screen.queryByTestId('start-notebook-modal')).toBeNull(); }); }); + + it('renders pending expiry information when notebook is waiting for resources', async () => { + render(, { + wrapper: RouterWithQueryClientWrapper, + }); + + expect(screen.getByText('waitingResourceLabel')).toBeTruthy(); + + fireEvent.click(screen.getByTestId('notebook-pending-timeout-info-trigger')); + + await waitFor(() => { + expect( + screen.getByText( + 'pendingTimeoutHint', + ), + ).toBeTruthy(); + }); + + expect( + screen.queryByText(hiddenNotebookApiMessage), + ).toBeNull(); + }); }); diff --git a/packages/manager/apps/pci-ai-tools/src/pages/notebooks/_components/NotebooksListColumns.component.tsx b/packages/manager/apps/pci-ai-tools/src/pages/notebooks/_components/NotebooksListColumns.component.tsx index e211d10ab862..8970de6588f0 100644 --- a/packages/manager/apps/pci-ai-tools/src/pages/notebooks/_components/NotebooksListColumns.component.tsx +++ b/packages/manager/apps/pci-ai-tools/src/pages/notebooks/_components/NotebooksListColumns.component.tsx @@ -267,6 +267,13 @@ export const getColumns = ({ ), From 06e4f20ecea53480695b29cf05b27b3f18629a9d Mon Sep 17 00:00:00 2001 From: ovh-cds Date: Wed, 4 Mar 2026 10:24:21 +0000 Subject: [PATCH 007/112] release(*): tennessine-samurai-12 Signed-off-by: ovh-cds --- .sonarcloud.properties | 2 +- packages/manager/apps/pci-ai-tools/CHANGELOG.md | 11 +++++++++++ packages/manager/apps/pci-ai-tools/package.json | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/.sonarcloud.properties b/.sonarcloud.properties index da0e9ef317a2..f4b5347c537d 100644 --- a/.sonarcloud.properties +++ b/.sonarcloud.properties @@ -7,7 +7,7 @@ sonar.projectName=manager sonar.sources=. sonar.sourceEncoding=UTF-8 sonar.ws.timeout=60 -sonar.projectVersion=tennessine-samurai-11 +sonar.projectVersion=tennessine-samurai-12 sonar.exclusions=node_modules/**, **/node_modules/**, **/dist/**, **/semantic/**, **/coverage/**, **/static/**, **/mock/**, **/mockServiceWorker.js sonar.coverage.exclusions=**/*.spec.js diff --git a/packages/manager/apps/pci-ai-tools/CHANGELOG.md b/packages/manager/apps/pci-ai-tools/CHANGELOG.md index 4b241a4b7660..496de347181c 100644 --- a/packages/manager/apps/pci-ai-tools/CHANGELOG.md +++ b/packages/manager/apps/pci-ai-tools/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [1.22.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-ai-tools-app@1.21.0...@ovh-ux/manager-pci-ai-tools-app@1.22.0) (2026-03-04) + + +### Features + +* **pci-ai-tools:** information about the expiry date ([fa76916](https://github.com/ovh/manager/commit/fa76916a60c7ff71888712c3a1c94101938a7a71)), closes [#AIS-2004](https://github.com/ovh/manager/issues/AIS-2004) + + + + + # [1.21.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-ai-tools-app@1.20.1...@ovh-ux/manager-pci-ai-tools-app@1.21.0) (2026-02-18) diff --git a/packages/manager/apps/pci-ai-tools/package.json b/packages/manager/apps/pci-ai-tools/package.json index b1913775d537..907cff372c24 100644 --- a/packages/manager/apps/pci-ai-tools/package.json +++ b/packages/manager/apps/pci-ai-tools/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-ai-tools-app", - "version": "1.21.0", + "version": "1.22.0", "private": true, "description": "pci-ai-tools", "repository": { From fe97e7967b11f5c2f833cbe19fd5c59b83e37202 Mon Sep 17 00:00:00 2001 From: Lio B Date: Tue, 3 Mar 2026 18:07:38 +0100 Subject: [PATCH 008/112] feat(object-storage): create lifecycle rule (#22248) ref: #DATATR-2756 Signed-off-by: Lionel Bueno --- .../storages/s3/lifecycle/Messages_de_DE.json | 66 ++- .../storages/s3/lifecycle/Messages_en_GB.json | 66 ++- .../storages/s3/lifecycle/Messages_es_ES.json | 66 ++- .../storages/s3/lifecycle/Messages_fr_CA.json | 64 ++- .../storages/s3/lifecycle/Messages_fr_FR.json | 68 ++- .../storages/s3/lifecycle/Messages_it_IT.json | 66 ++- .../storages/s3/lifecycle/Messages_pl_PL.json | 66 ++- .../storages/s3/lifecycle/Messages_pt_PT.json | 66 ++- .../s3/lifecycle/delete/Messages_de_DE.json | 10 + .../s3/lifecycle/delete/Messages_en_GB.json | 10 + .../s3/lifecycle/delete/Messages_es_ES.json | 10 + .../s3/lifecycle/delete/Messages_fr_CA.json | 10 + .../s3/lifecycle/delete/Messages_fr_FR.json | 10 + .../s3/lifecycle/delete/Messages_it_IT.json | 10 + .../s3/lifecycle/delete/Messages_pl_PL.json | 10 + .../s3/lifecycle/delete/Messages_pt_PT.json | 10 + .../tag-input/TagInput.component.tsx | 116 +++++ .../src/data/api/lifecycle/lifecycle.api.ts | 39 ++ .../data/hooks/lifecycle/lifecycleQueryKey.ts | 18 + .../hooks/lifecycle/useAddLifecycle.hook.ts | 46 ++ .../lifecycle/useDeleteLifecycle.hook.ts | 61 +++ .../lifecycle/useFetchLifecycleRules.hook.ts | 24 + .../lifecycle/useUpdateLifecycle.hook.ts | 51 +++ .../s3-storage/useGetS3Lifecycle.hook.ts | 4 +- .../hooks/useAvailableStorageClasses.hook.tsx | 14 +- .../s3Id/_components/S3Tabs.component.tsx | 18 +- .../form/CheckboxField.component.tsx | 39 ++ .../form/LifecycleForm.component.tsx | 66 +++ .../form/LifecycleForm.context.tsx | 58 +++ .../LifecycleRuleAbortMultipart.component.tsx | 40 ++ .../form/LifecycleRuleContainer.tsx | 21 + .../LifecycleRuleCurrentVersion.component.tsx | 46 ++ .../LifecycleRuleIdentification.component.tsx | 32 ++ ...fecycleRuleNoncurrentVersion.component.tsx | 25 ++ .../form/LifecycleRuleScope.component.tsx | 145 ++++++ ...fecycleRuleVersionOperations.component.tsx | 118 +++++ .../form/PayloadPreview.component.tsx | 73 +++ .../form/SizeFilterField.component.tsx | 122 +++++ .../form/TransitionListField.component.tsx | 281 ++++++++++++ .../_components/form/buildLifecycleRule.ts | 114 +++++ .../form/lifecycleForm.schema.spec.ts | 422 ++++++++++++++++++ .../_components/form/lifecycleForm.schema.ts | 243 ++++++++++ .../form/lifecycleTransition.utils.spec.ts | 212 +++++++++ .../form/lifecycleTransition.utils.ts | 70 +++ ...seLifecycleAvailableStorageClasses.hook.ts | 15 + .../_components/form/useLifecycleForm.hook.ts | 146 ++++++ .../table/LifecycleListColumns.component.tsx | 13 +- .../s3Id/lifecycle/create/Create.page.tsx | 100 +++++ .../s3Id/lifecycle/delete/Delete.modal.tsx | 113 +++++ .../storage/s3Id/lifecycle/edit/Edit.page.tsx | 125 ++++++ .../form/ReplicationRuleScope.component.tsx | 3 +- .../_components/form/TagInput.component.tsx | 96 ---- .../storage-job/StorageJob.modal.tsx | 2 +- .../_components/SwiftTabs.component.tsx | 1 - .../pci-object-storage/src/routes/routes.tsx | 27 ++ 55 files changed, 3644 insertions(+), 123 deletions(-) create mode 100644 packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_de_DE.json create mode 100644 packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_en_GB.json create mode 100644 packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_es_ES.json create mode 100644 packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_fr_CA.json create mode 100644 packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_fr_FR.json create mode 100644 packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_it_IT.json create mode 100644 packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_pl_PL.json create mode 100644 packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_pt_PT.json create mode 100644 packages/manager/apps/pci-object-storage/src/components/tag-input/TagInput.component.tsx create mode 100644 packages/manager/apps/pci-object-storage/src/data/api/lifecycle/lifecycle.api.ts create mode 100644 packages/manager/apps/pci-object-storage/src/data/hooks/lifecycle/lifecycleQueryKey.ts create mode 100644 packages/manager/apps/pci-object-storage/src/data/hooks/lifecycle/useAddLifecycle.hook.ts create mode 100644 packages/manager/apps/pci-object-storage/src/data/hooks/lifecycle/useDeleteLifecycle.hook.ts create mode 100644 packages/manager/apps/pci-object-storage/src/data/hooks/lifecycle/useFetchLifecycleRules.hook.ts create mode 100644 packages/manager/apps/pci-object-storage/src/data/hooks/lifecycle/useUpdateLifecycle.hook.ts create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/CheckboxField.component.tsx create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleForm.component.tsx create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleForm.context.tsx create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleAbortMultipart.component.tsx create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleContainer.tsx create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleCurrentVersion.component.tsx create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleIdentification.component.tsx create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleNoncurrentVersion.component.tsx create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleScope.component.tsx create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleVersionOperations.component.tsx create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/PayloadPreview.component.tsx create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/SizeFilterField.component.tsx create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/TransitionListField.component.tsx create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/buildLifecycleRule.ts create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/lifecycleForm.schema.spec.ts create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/lifecycleForm.schema.ts create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/lifecycleTransition.utils.spec.ts create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/lifecycleTransition.utils.ts create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/useLifecycleAvailableStorageClasses.hook.ts create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/useLifecycleForm.hook.ts create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/create/Create.page.tsx create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/delete/Delete.modal.tsx create mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/edit/Edit.page.tsx delete mode 100644 packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/replication/_components/form/TagInput.component.tsx diff --git a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_de_DE.json b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_de_DE.json index 97cd97ef09c9..8f6ad6b02d1c 100644 --- a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_de_DE.json +++ b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_de_DE.json @@ -19,5 +19,67 @@ "actionEdit": "Ändern", "actionEnable": "Aktivieren", "actionDisable": "Deaktivieren", - "actionDelete": "Löschen" -} + "actionDelete": "Löschen", + "formAddBreadcrumb": "Create a rule", + "formAddTitle": "Create a lifecycle rule", + "formBackLink": "Back to lifecycle rules", + "formButtonCancel": "Cancel", + "formButtonConfirm": "Create rule", + "formAddToastSuccessTitle": "Rule created", + "formAddToastSuccessDescription": "The lifecycle rule has been created successfully.", + "formAddToastErrorTitle": "Error creating the rule", + "formEditBreadcrumb": "Edit a rule", + "formEditTitle": "Edit the lifecycle rule", + "formEditButtonConfirm": "Save changes", + "formEditToastSuccessTitle": "Rule updated", + "formEditToastSuccessDescription": "The lifecycle rule has been updated successfully.", + "formEditToastErrorTitle": "Error updating the rule", + "formRuleIdLabel": "Rule identifier", + "formRuleIdRequired": "The identifier is required", + "formRuleIdMaxLength": "The identifier cannot exceed 255 characters", + "formStatusLabel": "Status", + "formScopeTitle": "Rule scope", + "formScopeDescription": "Choose whether the rule applies to all objects or only to specific ones.", + "formScopeLimited": "Limit the application of this rule", + "formScopeForAll": "Apply to all objects in the container", + "formPrefixLabel": "Prefix", + "formPrefixPlaceholder": "e.g.: logs/", + "formTagsLabel": "Tags", + "tagKeyPlaceholder": "Key", + "tagValuePlaceholder": "Value", + "addTag": "Add a tag", + "formTagKeyRequired": "The tag key is required", + "formCurrentVersionTitle": "Lifecycle operations", + "formCurrentVersionDescription": "Set expiration dates for the current version of objects or manage transitions to other Object Storage classes.", + "formTransitionsLabel": "Transition the current version of objects", + "formTransitionsDescription": "Automate transition for current versions.", + "formTransitionDaysLabel": "Days after creation", + "formStorageClassLabel": "Storage class", + "formAddTransition": "Add a transition", + "formExpirationLabel": "Expire the current version of objects", + "formExpirationDaysLabel": "Days after creation", + "formExpiredDeleteMarkerLabel": "Delete expired delete markers", + "formNoncurrentTransitionsLabel": "Transition older versions of objects", + "formNoncurrentTransitionsDescription": "Automate transition for older versions.", + "formNoncurrentDaysLabel": "Days after becoming non-current", + "formNoncurrentExpirationLabel": "Expiration of non-current versions", + "formNoncurrentExpirationDaysLabel": "Days after becoming non-current", + "formNewerNoncurrentVersionsLabel": "Non-current versions to keep", + "formAbortMultipartLabel": "Delete incomplete multipart uploads", + "formAbortMultipartDescription": "This action will stop and delete incomplete multipart uploads", + "formAbortDaysLabel": "Days after initiation", + "formStorageClassPlaceholder": "Select a class", + "formStorageClassRequiredError": "A storage class must be selected", + "formAtLeastOneOperationError": "At least one operation must be selected", + "formTransitionMinDaysError": "The transition must be at least 30 days", + "formTransitionMinGapError": "The gap between two transitions must be at least 30 days", + "formExpirationMinDaysError": "The expiration must be at least 1 day", + "formExpirationAfterTransitionsError": "The expiration must be greater than the largest transition", + "formAbortMinDaysError": "The abort delay must be at least 1 day", + "formObjectSizeGreaterThanCheckbox": "Specify a minimum object size", + "formObjectSizeGreaterThanLabel": "Minimum object size", + "formObjectSizeLessThanCheckbox": "Specify a maximum object size", + "formObjectSizeLessThanLabel": "Maximum object size", + "formObjectSizeBytesDisplay": "= {{bytes}} bytes", + "formObjectSizeRangeError": "Minimum size must be less than maximum size" +} \ No newline at end of file diff --git a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_en_GB.json b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_en_GB.json index fc3afc57cb92..c8ad57d42884 100644 --- a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_en_GB.json +++ b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_en_GB.json @@ -19,5 +19,67 @@ "actionEdit": "Modify", "actionEnable": "Enable", "actionDisable": "Disable", - "actionDelete": "Delete" -} + "actionDelete": "Delete", + "formAddBreadcrumb": "Create a rule", + "formAddTitle": "Create a lifecycle rule", + "formBackLink": "Back to lifecycle rules", + "formButtonCancel": "Cancel", + "formButtonConfirm": "Create rule", + "formAddToastSuccessTitle": "Rule created", + "formAddToastSuccessDescription": "The lifecycle rule has been created successfully.", + "formAddToastErrorTitle": "Error creating the rule", + "formEditBreadcrumb": "Edit a rule", + "formEditTitle": "Edit the lifecycle rule", + "formEditButtonConfirm": "Save changes", + "formEditToastSuccessTitle": "Rule updated", + "formEditToastSuccessDescription": "The lifecycle rule has been updated successfully.", + "formEditToastErrorTitle": "Error updating the rule", + "formRuleIdLabel": "Rule identifier", + "formRuleIdRequired": "The identifier is required", + "formRuleIdMaxLength": "The identifier cannot exceed 255 characters", + "formStatusLabel": "Status", + "formScopeTitle": "Rule scope", + "formScopeDescription": "Choose whether the rule applies to all objects or only to specific ones.", + "formScopeLimited": "Limit the application of this rule", + "formScopeForAll": "Apply to all objects in the container", + "formPrefixLabel": "Prefix", + "formPrefixPlaceholder": "e.g.: logs/", + "formTagsLabel": "Tags", + "tagKeyPlaceholder": "Key", + "tagValuePlaceholder": "Value", + "addTag": "Add a tag", + "formTagKeyRequired": "The tag key is required", + "formCurrentVersionTitle": "Lifecycle operations", + "formCurrentVersionDescription": "Set expiration dates for the current version of objects or manage transitions to other Object Storage classes.", + "formTransitionsLabel": "Transition the current version of objects", + "formTransitionsDescription": "Automate transition for current versions.", + "formTransitionDaysLabel": "Days after creation", + "formStorageClassLabel": "Storage class", + "formAddTransition": "Add a transition", + "formExpirationLabel": "Expire the current version of objects", + "formExpirationDaysLabel": "Days after creation", + "formExpiredDeleteMarkerLabel": "Delete expired delete markers", + "formNoncurrentTransitionsLabel": "Transition older versions of objects", + "formNoncurrentTransitionsDescription": "Automate transition for older versions.", + "formNoncurrentDaysLabel": "Days after becoming non-current", + "formNoncurrentExpirationLabel": "Expiration of non-current versions", + "formNoncurrentExpirationDaysLabel": "Days after becoming non-current", + "formNewerNoncurrentVersionsLabel": "Non-current versions to keep", + "formAbortMultipartLabel": "Delete incomplete multipart uploads", + "formAbortMultipartDescription": "This action will stop and delete incomplete multipart uploads", + "formAbortDaysLabel": "Days after initiation", + "formStorageClassPlaceholder": "Select a class", + "formStorageClassRequiredError": "A storage class must be selected", + "formAtLeastOneOperationError": "At least one operation must be selected", + "formTransitionMinDaysError": "The transition must be at least 30 days", + "formTransitionMinGapError": "The gap between two transitions must be at least 30 days", + "formExpirationMinDaysError": "The expiration must be at least 1 day", + "formExpirationAfterTransitionsError": "The expiration must be greater than the largest transition", + "formAbortMinDaysError": "The abort delay must be at least 1 day", + "formObjectSizeGreaterThanCheckbox": "Specify a minimum object size", + "formObjectSizeGreaterThanLabel": "Minimum object size", + "formObjectSizeLessThanCheckbox": "Specify a maximum object size", + "formObjectSizeLessThanLabel": "Maximum object size", + "formObjectSizeBytesDisplay": "= {{bytes}} bytes", + "formObjectSizeRangeError": "Minimum size must be less than maximum size" +} \ No newline at end of file diff --git a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_es_ES.json b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_es_ES.json index 09e80f8d4b7a..2807bea9d32f 100644 --- a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_es_ES.json +++ b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_es_ES.json @@ -19,5 +19,67 @@ "actionEdit": "Modificar", "actionEnable": "Activar", "actionDisable": "Desactivar", - "actionDelete": "Eliminar" -} + "actionDelete": "Eliminar", + "formAddBreadcrumb": "Create a rule", + "formAddTitle": "Create a lifecycle rule", + "formBackLink": "Back to lifecycle rules", + "formButtonCancel": "Cancel", + "formButtonConfirm": "Create rule", + "formAddToastSuccessTitle": "Rule created", + "formAddToastSuccessDescription": "The lifecycle rule has been created successfully.", + "formAddToastErrorTitle": "Error creating the rule", + "formEditBreadcrumb": "Edit a rule", + "formEditTitle": "Edit the lifecycle rule", + "formEditButtonConfirm": "Save changes", + "formEditToastSuccessTitle": "Rule updated", + "formEditToastSuccessDescription": "The lifecycle rule has been updated successfully.", + "formEditToastErrorTitle": "Error updating the rule", + "formRuleIdLabel": "Rule identifier", + "formRuleIdRequired": "The identifier is required", + "formRuleIdMaxLength": "The identifier cannot exceed 255 characters", + "formStatusLabel": "Status", + "formScopeTitle": "Rule scope", + "formScopeDescription": "Choose whether the rule applies to all objects or only to specific ones.", + "formScopeLimited": "Limit the application of this rule", + "formScopeForAll": "Apply to all objects in the container", + "formPrefixLabel": "Prefix", + "formPrefixPlaceholder": "e.g.: logs/", + "formTagsLabel": "Tags", + "tagKeyPlaceholder": "Key", + "tagValuePlaceholder": "Value", + "addTag": "Add a tag", + "formTagKeyRequired": "The tag key is required", + "formCurrentVersionTitle": "Lifecycle operations", + "formCurrentVersionDescription": "Set expiration dates for the current version of objects or manage transitions to other Object Storage classes.", + "formTransitionsLabel": "Transition the current version of objects", + "formTransitionsDescription": "Automate transition for current versions.", + "formTransitionDaysLabel": "Days after creation", + "formStorageClassLabel": "Storage class", + "formAddTransition": "Add a transition", + "formExpirationLabel": "Expire the current version of objects", + "formExpirationDaysLabel": "Days after creation", + "formExpiredDeleteMarkerLabel": "Delete expired delete markers", + "formNoncurrentTransitionsLabel": "Transition older versions of objects", + "formNoncurrentTransitionsDescription": "Automate transition for older versions.", + "formNoncurrentDaysLabel": "Days after becoming non-current", + "formNoncurrentExpirationLabel": "Expiration of non-current versions", + "formNoncurrentExpirationDaysLabel": "Days after becoming non-current", + "formNewerNoncurrentVersionsLabel": "Non-current versions to keep", + "formAbortMultipartLabel": "Delete incomplete multipart uploads", + "formAbortMultipartDescription": "This action will stop and delete incomplete multipart uploads", + "formAbortDaysLabel": "Days after initiation", + "formStorageClassPlaceholder": "Select a class", + "formStorageClassRequiredError": "A storage class must be selected", + "formAtLeastOneOperationError": "At least one operation must be selected", + "formTransitionMinDaysError": "The transition must be at least 30 days", + "formTransitionMinGapError": "The gap between two transitions must be at least 30 days", + "formExpirationMinDaysError": "The expiration must be at least 1 day", + "formExpirationAfterTransitionsError": "The expiration must be greater than the largest transition", + "formAbortMinDaysError": "The abort delay must be at least 1 day", + "formObjectSizeGreaterThanCheckbox": "Specify a minimum object size", + "formObjectSizeGreaterThanLabel": "Minimum object size", + "formObjectSizeLessThanCheckbox": "Specify a maximum object size", + "formObjectSizeLessThanLabel": "Maximum object size", + "formObjectSizeBytesDisplay": "= {{bytes}} bytes", + "formObjectSizeRangeError": "Minimum size must be less than maximum size" +} \ No newline at end of file diff --git a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_fr_CA.json b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_fr_CA.json index 5cfe44ef4b35..86b1ef4a8d61 100644 --- a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_fr_CA.json +++ b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_fr_CA.json @@ -19,5 +19,67 @@ "actionEdit": "Modifier", "actionEnable": "Activer", "actionDisable": "Désactiver", - "actionDelete": "Supprimer" + "actionDelete": "Supprimer", + "formAddBreadcrumb": "Créer une règle", + "formAddTitle": "Créer une règle de cycle de vie", + "formBackLink": "Retour aux règles de cycle de vie", + "formButtonCancel": "Annuler", + "formButtonConfirm": "Créer la règle", + "formAddToastSuccessTitle": "Règle créée", + "formAddToastSuccessDescription": "La règle de cycle de vie a été créée avec succès.", + "formAddToastErrorTitle": "Erreur lors de la création de la règle", + "formEditBreadcrumb": "Modifier une règle", + "formEditTitle": "Modifier la règle de cycle de vie", + "formEditButtonConfirm": "Enregistrer les modifications", + "formEditToastSuccessTitle": "Règle modifiée", + "formEditToastSuccessDescription": "La règle de cycle de vie a été modifiée avec succès.", + "formEditToastErrorTitle": "Erreur lors de la modification de la règle", + "formRuleIdLabel": "Identifiant de la règle", + "formRuleIdRequired": "L'identifiant est requis", + "formRuleIdMaxLength": "L'identifiant ne peut pas dépasser 255 caractères", + "formStatusLabel": "Statut", + "formScopeTitle": "Portée de la règle", + "formScopeDescription": "Choisissez si la règle s'applique à tous les objets ou seulement à certains.", + "formScopeLimited": "Limiter l'application de cette règle", + "formScopeForAll": "Appliquer pour tous les objets du conteneur", + "formPrefixLabel": "Préfixe", + "formPrefixPlaceholder": "ex: logs/", + "formTagsLabel": "Tags", + "tagKeyPlaceholder": "Clé", + "tagValuePlaceholder": "Valeur", + "addTag": "Ajouter un tag", + "formTagKeyRequired": "La clé du tag est obligatoire", + "formCurrentVersionTitle": "Opérations de lifecycle", + "formCurrentVersionDescription": "Définir des dates d'expiration pour la version actuelle des objets ou afin de gérer les transitions vers d'autres classes de stockage Object Storage.", + "formTransitionsLabel": "Transitionner la version actuelle des objets", + "formTransitionsDescription": "Automatiser la transition pour les versions actuelles.", + "formTransitionDaysLabel": "Jours après la création", + "formStorageClassLabel": "Classe de stockage", + "formAddTransition": "Ajouter une transition", + "formExpirationLabel": "Expirer la version actuelle des objets", + "formExpirationDaysLabel": "Jours après la création", + "formExpiredDeleteMarkerLabel": "Supprimer les marqueurs de suppression expirés", + "formNoncurrentTransitionsLabel": "Transitionner des versions anciennes des objets", + "formNoncurrentTransitionsDescription": "Automatiser la transition pour les versions anciennes.", + "formNoncurrentDaysLabel": "Jours après passage en non-courant", + "formNoncurrentExpirationLabel": "Expiration des versions non-courantes", + "formNoncurrentExpirationDaysLabel": "Jours après passage en non-courant", + "formNewerNoncurrentVersionsLabel": "Versions non-courantes à conserver", + "formAbortMultipartLabel": "Supprimer les multipart uploads incomplets", + "formAbortMultipartDescription": "Cette action va arrêter et supprimer les multipart uploads incomplets", + "formAbortDaysLabel": "Jours après l'initiation", + "formStorageClassPlaceholder": "Sélectionner une classe", + "formStorageClassRequiredError": "Une classe de stockage doit être sélectionnée", + "formAtLeastOneOperationError": "Au moins une opération doit être sélectionnée", + "formTransitionMinDaysError": "La transition doit être d'au moins 30 jours", + "formTransitionMinGapError": "L'écart entre deux transitions doit être d'au moins 30 jours", + "formExpirationMinDaysError": "L'expiration doit être d'au moins 1 jour", + "formExpirationAfterTransitionsError": "L'expiration doit être supérieure à la plus grande transition", + "formAbortMinDaysError": "Le délai d'abandon doit être d'au moins 1 jour", + "formObjectSizeGreaterThanCheckbox": "Préciser une taille minimale d'objet", + "formObjectSizeGreaterThanLabel": "Taille minimum de l'objet", + "formObjectSizeLessThanCheckbox": "Préciser une taille maximale d'objet", + "formObjectSizeLessThanLabel": "Taille maximum de l'objet", + "formObjectSizeBytesDisplay": "= {{bytes}} bytes", + "formObjectSizeRangeError": "La taille minimum doit être inférieure à la taille maximum" } diff --git a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_fr_FR.json b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_fr_FR.json index 5cfe44ef4b35..3e214276c9e8 100644 --- a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_fr_FR.json +++ b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_fr_FR.json @@ -1,7 +1,7 @@ { "title": "Règles de cycle de vie", "createLifecycle": "Créer une règle", - "columnName": "Nom de la règle", + "columnName": "Nom", "columnStatus": "Statut", "columnScope": "Portée", "columnCurrentVersionOperations": "Opérations sur les versions courantes", @@ -19,5 +19,67 @@ "actionEdit": "Modifier", "actionEnable": "Activer", "actionDisable": "Désactiver", - "actionDelete": "Supprimer" -} + "actionDelete": "Supprimer", + "formAddBreadcrumb": "Créer une règle", + "formAddTitle": "Créer une règle de cycle de vie", + "formBackLink": "Retour aux règles de cycle de vie", + "formButtonCancel": "Annuler", + "formButtonConfirm": "Créer la règle", + "formAddToastSuccessTitle": "Règle créée", + "formAddToastSuccessDescription": "La règle de cycle de vie a été créée avec succès.", + "formAddToastErrorTitle": "Erreur lors de la création de la règle", + "formEditBreadcrumb": "Modifier une règle", + "formEditTitle": "Modifier la règle de cycle de vie", + "formEditButtonConfirm": "Enregistrer les modifications", + "formEditToastSuccessTitle": "Règle modifiée", + "formEditToastSuccessDescription": "La règle de cycle de vie a été modifiée avec succès.", + "formEditToastErrorTitle": "Erreur lors de la modification de la règle", + "formRuleIdLabel": "Identifiant de la règle", + "formRuleIdRequired": "L'identifiant est requis", + "formRuleIdMaxLength": "L'identifiant ne peut pas dépasser 255 caractères", + "formStatusLabel": "Statut", + "formScopeTitle": "Portée de la règle", + "formScopeDescription": "Choisissez si la règle s'applique à tous les objets ou seulement à certains.", + "formScopeLimited": "Limiter l'application de cette règle", + "formScopeForAll": "Appliquer pour tous les objets du conteneur", + "formPrefixLabel": "Préfixe", + "formPrefixPlaceholder": "ex: logs/", + "formTagsLabel": "Tags", + "tagKeyPlaceholder": "Clé", + "tagValuePlaceholder": "Valeur", + "addTag": "Ajouter un tag", + "formTagKeyRequired": "La clé du tag est obligatoire", + "formCurrentVersionTitle": "Opérations de lifecycle", + "formCurrentVersionDescription": "Définir des dates d'expiration pour la version actuelle des objets ou afin de gérer les transitions vers d'autres classes de stockage Object Storage.", + "formTransitionsLabel": "Transitionner la version actuelle des objets", + "formTransitionsDescription": "Automatiser la transition pour les versions actuelles.", + "formTransitionDaysLabel": "Jours après la création", + "formStorageClassLabel": "Classe de stockage", + "formAddTransition": "Ajouter une transition", + "formExpirationLabel": "Expirer la version actuelle des objets", + "formExpirationDaysLabel": "Jours après la création", + "formExpiredDeleteMarkerLabel": "Supprimer les marqueurs de suppression expirés", + "formNoncurrentTransitionsLabel": "Transitionner des versions anciennes des objets", + "formNoncurrentTransitionsDescription": "Automatiser la transition pour les versions anciennes.", + "formNoncurrentDaysLabel": "Jours après passage en non-courant", + "formNoncurrentExpirationLabel": "Expiration des versions non-courantes", + "formNoncurrentExpirationDaysLabel": "Jours après passage en non-courant", + "formNewerNoncurrentVersionsLabel": "Versions non-courantes à conserver", + "formAbortMultipartLabel": "Supprimer les multipart uploads incomplets", + "formAbortMultipartDescription": "Cette action va arrêter et supprimer les multipart uploads incomplets", + "formAbortDaysLabel": "Jours après l'initiation", + "formStorageClassPlaceholder": "Sélectionner une classe", + "formStorageClassRequiredError": "Une classe de stockage doit être sélectionnée", + "formAtLeastOneOperationError": "Au moins une opération doit être sélectionnée", + "formTransitionMinDaysError": "La transition doit être d'au moins 30 jours", + "formTransitionMinGapError": "L'écart entre deux transitions doit être d'au moins 30 jours", + "formExpirationMinDaysError": "L'expiration doit être d'au moins 1 jour", + "formExpirationAfterTransitionsError": "L'expiration doit être supérieure à la plus grande transition", + "formAbortMinDaysError": "Le délai d'abandon doit être d'au moins 1 jour", + "formObjectSizeGreaterThanCheckbox": "Préciser une taille minimale d'objet", + "formObjectSizeGreaterThanLabel": "Taille minimum de l'objet", + "formObjectSizeLessThanCheckbox": "Préciser une taille maximale d'objet", + "formObjectSizeLessThanLabel": "Taille maximum de l'objet", + "formObjectSizeBytesDisplay": "= {{bytes}} bytes", + "formObjectSizeRangeError": "La taille minimum doit être inférieure à la taille maximum" +} \ No newline at end of file diff --git a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_it_IT.json b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_it_IT.json index bec1af5f8060..72ddf0626a0c 100644 --- a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_it_IT.json +++ b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_it_IT.json @@ -19,5 +19,67 @@ "actionEdit": "Modifica", "actionEnable": "Attiva", "actionDisable": "Disattivare", - "actionDelete": "Eliminare" -} + "actionDelete": "Eliminare", + "formAddBreadcrumb": "Create a rule", + "formAddTitle": "Create a lifecycle rule", + "formBackLink": "Back to lifecycle rules", + "formButtonCancel": "Cancel", + "formButtonConfirm": "Create rule", + "formAddToastSuccessTitle": "Rule created", + "formAddToastSuccessDescription": "The lifecycle rule has been created successfully.", + "formAddToastErrorTitle": "Error creating the rule", + "formEditBreadcrumb": "Edit a rule", + "formEditTitle": "Edit the lifecycle rule", + "formEditButtonConfirm": "Save changes", + "formEditToastSuccessTitle": "Rule updated", + "formEditToastSuccessDescription": "The lifecycle rule has been updated successfully.", + "formEditToastErrorTitle": "Error updating the rule", + "formRuleIdLabel": "Rule identifier", + "formRuleIdRequired": "The identifier is required", + "formRuleIdMaxLength": "The identifier cannot exceed 255 characters", + "formStatusLabel": "Status", + "formScopeTitle": "Rule scope", + "formScopeDescription": "Choose whether the rule applies to all objects or only to specific ones.", + "formScopeLimited": "Limit the application of this rule", + "formScopeForAll": "Apply to all objects in the container", + "formPrefixLabel": "Prefix", + "formPrefixPlaceholder": "e.g.: logs/", + "formTagsLabel": "Tags", + "tagKeyPlaceholder": "Key", + "tagValuePlaceholder": "Value", + "addTag": "Add a tag", + "formTagKeyRequired": "The tag key is required", + "formCurrentVersionTitle": "Lifecycle operations", + "formCurrentVersionDescription": "Set expiration dates for the current version of objects or manage transitions to other Object Storage classes.", + "formTransitionsLabel": "Transition the current version of objects", + "formTransitionsDescription": "Automate transition for current versions.", + "formTransitionDaysLabel": "Days after creation", + "formStorageClassLabel": "Storage class", + "formAddTransition": "Add a transition", + "formExpirationLabel": "Expire the current version of objects", + "formExpirationDaysLabel": "Days after creation", + "formExpiredDeleteMarkerLabel": "Delete expired delete markers", + "formNoncurrentTransitionsLabel": "Transition older versions of objects", + "formNoncurrentTransitionsDescription": "Automate transition for older versions.", + "formNoncurrentDaysLabel": "Days after becoming non-current", + "formNoncurrentExpirationLabel": "Expiration of non-current versions", + "formNoncurrentExpirationDaysLabel": "Days after becoming non-current", + "formNewerNoncurrentVersionsLabel": "Non-current versions to keep", + "formAbortMultipartLabel": "Delete incomplete multipart uploads", + "formAbortMultipartDescription": "This action will stop and delete incomplete multipart uploads", + "formAbortDaysLabel": "Days after initiation", + "formStorageClassPlaceholder": "Select a class", + "formStorageClassRequiredError": "A storage class must be selected", + "formAtLeastOneOperationError": "At least one operation must be selected", + "formTransitionMinDaysError": "The transition must be at least 30 days", + "formTransitionMinGapError": "The gap between two transitions must be at least 30 days", + "formExpirationMinDaysError": "The expiration must be at least 1 day", + "formExpirationAfterTransitionsError": "The expiration must be greater than the largest transition", + "formAbortMinDaysError": "The abort delay must be at least 1 day", + "formObjectSizeGreaterThanCheckbox": "Specify a minimum object size", + "formObjectSizeGreaterThanLabel": "Minimum object size", + "formObjectSizeLessThanCheckbox": "Specify a maximum object size", + "formObjectSizeLessThanLabel": "Maximum object size", + "formObjectSizeBytesDisplay": "= {{bytes}} bytes", + "formObjectSizeRangeError": "Minimum size must be less than maximum size" +} \ No newline at end of file diff --git a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_pl_PL.json b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_pl_PL.json index 501fc036ca9f..27961210cfd2 100644 --- a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_pl_PL.json +++ b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_pl_PL.json @@ -19,5 +19,67 @@ "actionEdit": "Zmień", "actionEnable": "Włącz", "actionDisable": "Dezaktywuj", - "actionDelete": "Usuń" -} + "actionDelete": "Usuń", + "formAddBreadcrumb": "Create a rule", + "formAddTitle": "Create a lifecycle rule", + "formBackLink": "Back to lifecycle rules", + "formButtonCancel": "Cancel", + "formButtonConfirm": "Create rule", + "formAddToastSuccessTitle": "Rule created", + "formAddToastSuccessDescription": "The lifecycle rule has been created successfully.", + "formAddToastErrorTitle": "Error creating the rule", + "formEditBreadcrumb": "Edit a rule", + "formEditTitle": "Edit the lifecycle rule", + "formEditButtonConfirm": "Save changes", + "formEditToastSuccessTitle": "Rule updated", + "formEditToastSuccessDescription": "The lifecycle rule has been updated successfully.", + "formEditToastErrorTitle": "Error updating the rule", + "formRuleIdLabel": "Rule identifier", + "formRuleIdRequired": "The identifier is required", + "formRuleIdMaxLength": "The identifier cannot exceed 255 characters", + "formStatusLabel": "Status", + "formScopeTitle": "Rule scope", + "formScopeDescription": "Choose whether the rule applies to all objects or only to specific ones.", + "formScopeLimited": "Limit the application of this rule", + "formScopeForAll": "Apply to all objects in the container", + "formPrefixLabel": "Prefix", + "formPrefixPlaceholder": "e.g.: logs/", + "formTagsLabel": "Tags", + "tagKeyPlaceholder": "Key", + "tagValuePlaceholder": "Value", + "addTag": "Add a tag", + "formTagKeyRequired": "The tag key is required", + "formCurrentVersionTitle": "Lifecycle operations", + "formCurrentVersionDescription": "Set expiration dates for the current version of objects or manage transitions to other Object Storage classes.", + "formTransitionsLabel": "Transition the current version of objects", + "formTransitionsDescription": "Automate transition for current versions.", + "formTransitionDaysLabel": "Days after creation", + "formStorageClassLabel": "Storage class", + "formAddTransition": "Add a transition", + "formExpirationLabel": "Expire the current version of objects", + "formExpirationDaysLabel": "Days after creation", + "formExpiredDeleteMarkerLabel": "Delete expired delete markers", + "formNoncurrentTransitionsLabel": "Transition older versions of objects", + "formNoncurrentTransitionsDescription": "Automate transition for older versions.", + "formNoncurrentDaysLabel": "Days after becoming non-current", + "formNoncurrentExpirationLabel": "Expiration of non-current versions", + "formNoncurrentExpirationDaysLabel": "Days after becoming non-current", + "formNewerNoncurrentVersionsLabel": "Non-current versions to keep", + "formAbortMultipartLabel": "Delete incomplete multipart uploads", + "formAbortMultipartDescription": "This action will stop and delete incomplete multipart uploads", + "formAbortDaysLabel": "Days after initiation", + "formStorageClassPlaceholder": "Select a class", + "formStorageClassRequiredError": "A storage class must be selected", + "formAtLeastOneOperationError": "At least one operation must be selected", + "formTransitionMinDaysError": "The transition must be at least 30 days", + "formTransitionMinGapError": "The gap between two transitions must be at least 30 days", + "formExpirationMinDaysError": "The expiration must be at least 1 day", + "formExpirationAfterTransitionsError": "The expiration must be greater than the largest transition", + "formAbortMinDaysError": "The abort delay must be at least 1 day", + "formObjectSizeGreaterThanCheckbox": "Specify a minimum object size", + "formObjectSizeGreaterThanLabel": "Minimum object size", + "formObjectSizeLessThanCheckbox": "Specify a maximum object size", + "formObjectSizeLessThanLabel": "Maximum object size", + "formObjectSizeBytesDisplay": "= {{bytes}} bytes", + "formObjectSizeRangeError": "Minimum size must be less than maximum size" +} \ No newline at end of file diff --git a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_pt_PT.json b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_pt_PT.json index 66729eb6705c..cba50947b0be 100644 --- a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_pt_PT.json +++ b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/Messages_pt_PT.json @@ -19,5 +19,67 @@ "actionEdit": "Modificar", "actionEnable": "Ativar", "actionDisable": "Desativar", - "actionDelete": "Suprimir" -} + "actionDelete": "Suprimir", + "formAddBreadcrumb": "Create a rule", + "formAddTitle": "Create a lifecycle rule", + "formBackLink": "Back to lifecycle rules", + "formButtonCancel": "Cancel", + "formButtonConfirm": "Create rule", + "formAddToastSuccessTitle": "Rule created", + "formAddToastSuccessDescription": "The lifecycle rule has been created successfully.", + "formAddToastErrorTitle": "Error creating the rule", + "formEditBreadcrumb": "Edit a rule", + "formEditTitle": "Edit the lifecycle rule", + "formEditButtonConfirm": "Save changes", + "formEditToastSuccessTitle": "Rule updated", + "formEditToastSuccessDescription": "The lifecycle rule has been updated successfully.", + "formEditToastErrorTitle": "Error updating the rule", + "formRuleIdLabel": "Rule identifier", + "formRuleIdRequired": "The identifier is required", + "formRuleIdMaxLength": "The identifier cannot exceed 255 characters", + "formStatusLabel": "Status", + "formScopeTitle": "Rule scope", + "formScopeDescription": "Choose whether the rule applies to all objects or only to specific ones.", + "formScopeLimited": "Limit the application of this rule", + "formScopeForAll": "Apply to all objects in the container", + "formPrefixLabel": "Prefix", + "formPrefixPlaceholder": "e.g.: logs/", + "formTagsLabel": "Tags", + "tagKeyPlaceholder": "Key", + "tagValuePlaceholder": "Value", + "addTag": "Add a tag", + "formTagKeyRequired": "The tag key is required", + "formCurrentVersionTitle": "Lifecycle operations", + "formCurrentVersionDescription": "Set expiration dates for the current version of objects or manage transitions to other Object Storage classes.", + "formTransitionsLabel": "Transition the current version of objects", + "formTransitionsDescription": "Automate transition for current versions.", + "formTransitionDaysLabel": "Days after creation", + "formStorageClassLabel": "Storage class", + "formAddTransition": "Add a transition", + "formExpirationLabel": "Expire the current version of objects", + "formExpirationDaysLabel": "Days after creation", + "formExpiredDeleteMarkerLabel": "Delete expired delete markers", + "formNoncurrentTransitionsLabel": "Transition older versions of objects", + "formNoncurrentTransitionsDescription": "Automate transition for older versions.", + "formNoncurrentDaysLabel": "Days after becoming non-current", + "formNoncurrentExpirationLabel": "Expiration of non-current versions", + "formNoncurrentExpirationDaysLabel": "Days after becoming non-current", + "formNewerNoncurrentVersionsLabel": "Non-current versions to keep", + "formAbortMultipartLabel": "Delete incomplete multipart uploads", + "formAbortMultipartDescription": "This action will stop and delete incomplete multipart uploads", + "formAbortDaysLabel": "Days after initiation", + "formStorageClassPlaceholder": "Select a class", + "formStorageClassRequiredError": "A storage class must be selected", + "formAtLeastOneOperationError": "At least one operation must be selected", + "formTransitionMinDaysError": "The transition must be at least 30 days", + "formTransitionMinGapError": "The gap between two transitions must be at least 30 days", + "formExpirationMinDaysError": "The expiration must be at least 1 day", + "formExpirationAfterTransitionsError": "The expiration must be greater than the largest transition", + "formAbortMinDaysError": "The abort delay must be at least 1 day", + "formObjectSizeGreaterThanCheckbox": "Specify a minimum object size", + "formObjectSizeGreaterThanLabel": "Minimum object size", + "formObjectSizeLessThanCheckbox": "Specify a maximum object size", + "formObjectSizeLessThanLabel": "Maximum object size", + "formObjectSizeBytesDisplay": "= {{bytes}} bytes", + "formObjectSizeRangeError": "Minimum size must be less than maximum size" +} \ No newline at end of file diff --git a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_de_DE.json b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_de_DE.json new file mode 100644 index 000000000000..6c6908fdd47e --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_de_DE.json @@ -0,0 +1,10 @@ +{ + "deleteLifecycleTitle": "Delete a lifecycle rule", + "deleteLifecycleDescription": "Are you sure you want to delete the lifecycle rule {{decodedRuleId}}?", + "deleteLifecycleButtonConfirm": "Delete", + "deleteLifecycleButtonCancel": "Cancel", + "deleteLifecycleToastSuccessTitle": "Rule deleted", + "deleteLifecycleToastSuccessMessage": "Your lifecycle rule has been deleted.", + "deleteLifecycleToastErrorTitle": "Deletion error", + "deleteLifecycleToastErrorMessage": "An error occurred while deleting your lifecycle rule: {{ message }}." +} diff --git a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_en_GB.json b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_en_GB.json new file mode 100644 index 000000000000..6c6908fdd47e --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_en_GB.json @@ -0,0 +1,10 @@ +{ + "deleteLifecycleTitle": "Delete a lifecycle rule", + "deleteLifecycleDescription": "Are you sure you want to delete the lifecycle rule {{decodedRuleId}}?", + "deleteLifecycleButtonConfirm": "Delete", + "deleteLifecycleButtonCancel": "Cancel", + "deleteLifecycleToastSuccessTitle": "Rule deleted", + "deleteLifecycleToastSuccessMessage": "Your lifecycle rule has been deleted.", + "deleteLifecycleToastErrorTitle": "Deletion error", + "deleteLifecycleToastErrorMessage": "An error occurred while deleting your lifecycle rule: {{ message }}." +} diff --git a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_es_ES.json b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_es_ES.json new file mode 100644 index 000000000000..6c6908fdd47e --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_es_ES.json @@ -0,0 +1,10 @@ +{ + "deleteLifecycleTitle": "Delete a lifecycle rule", + "deleteLifecycleDescription": "Are you sure you want to delete the lifecycle rule {{decodedRuleId}}?", + "deleteLifecycleButtonConfirm": "Delete", + "deleteLifecycleButtonCancel": "Cancel", + "deleteLifecycleToastSuccessTitle": "Rule deleted", + "deleteLifecycleToastSuccessMessage": "Your lifecycle rule has been deleted.", + "deleteLifecycleToastErrorTitle": "Deletion error", + "deleteLifecycleToastErrorMessage": "An error occurred while deleting your lifecycle rule: {{ message }}." +} diff --git a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_fr_CA.json b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_fr_CA.json new file mode 100644 index 000000000000..133d8ad68e22 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_fr_CA.json @@ -0,0 +1,10 @@ +{ + "deleteLifecycleTitle": "Supprimer une règle de cycle de vie", + "deleteLifecycleDescription": "Voulez-vous vraiment supprimer la règle de cycle de vie {{decodedRuleId}} ?", + "deleteLifecycleButtonConfirm": "Supprimer", + "deleteLifecycleButtonCancel": "Annuler", + "deleteLifecycleToastSuccessTitle": "Règle supprimée", + "deleteLifecycleToastSuccessMessage": "La suppression de votre règle de cycle de vie a été effectuée avec succès.", + "deleteLifecycleToastErrorTitle": "Erreur de suppression", + "deleteLifecycleToastErrorMessage": "Une erreur est survenue lors de la suppression de votre règle de cycle de vie : {{message}}." +} diff --git a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_fr_FR.json b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_fr_FR.json new file mode 100644 index 000000000000..133d8ad68e22 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_fr_FR.json @@ -0,0 +1,10 @@ +{ + "deleteLifecycleTitle": "Supprimer une règle de cycle de vie", + "deleteLifecycleDescription": "Voulez-vous vraiment supprimer la règle de cycle de vie {{decodedRuleId}} ?", + "deleteLifecycleButtonConfirm": "Supprimer", + "deleteLifecycleButtonCancel": "Annuler", + "deleteLifecycleToastSuccessTitle": "Règle supprimée", + "deleteLifecycleToastSuccessMessage": "La suppression de votre règle de cycle de vie a été effectuée avec succès.", + "deleteLifecycleToastErrorTitle": "Erreur de suppression", + "deleteLifecycleToastErrorMessage": "Une erreur est survenue lors de la suppression de votre règle de cycle de vie : {{message}}." +} diff --git a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_it_IT.json b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_it_IT.json new file mode 100644 index 000000000000..6c6908fdd47e --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_it_IT.json @@ -0,0 +1,10 @@ +{ + "deleteLifecycleTitle": "Delete a lifecycle rule", + "deleteLifecycleDescription": "Are you sure you want to delete the lifecycle rule {{decodedRuleId}}?", + "deleteLifecycleButtonConfirm": "Delete", + "deleteLifecycleButtonCancel": "Cancel", + "deleteLifecycleToastSuccessTitle": "Rule deleted", + "deleteLifecycleToastSuccessMessage": "Your lifecycle rule has been deleted.", + "deleteLifecycleToastErrorTitle": "Deletion error", + "deleteLifecycleToastErrorMessage": "An error occurred while deleting your lifecycle rule: {{ message }}." +} diff --git a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_pl_PL.json b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_pl_PL.json new file mode 100644 index 000000000000..6c6908fdd47e --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_pl_PL.json @@ -0,0 +1,10 @@ +{ + "deleteLifecycleTitle": "Delete a lifecycle rule", + "deleteLifecycleDescription": "Are you sure you want to delete the lifecycle rule {{decodedRuleId}}?", + "deleteLifecycleButtonConfirm": "Delete", + "deleteLifecycleButtonCancel": "Cancel", + "deleteLifecycleToastSuccessTitle": "Rule deleted", + "deleteLifecycleToastSuccessMessage": "Your lifecycle rule has been deleted.", + "deleteLifecycleToastErrorTitle": "Deletion error", + "deleteLifecycleToastErrorMessage": "An error occurred while deleting your lifecycle rule: {{ message }}." +} diff --git a/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_pt_PT.json b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_pt_PT.json new file mode 100644 index 000000000000..6c6908fdd47e --- /dev/null +++ b/packages/manager/apps/pci-object-storage/public/translations/pci-object-storage/storages/s3/lifecycle/delete/Messages_pt_PT.json @@ -0,0 +1,10 @@ +{ + "deleteLifecycleTitle": "Delete a lifecycle rule", + "deleteLifecycleDescription": "Are you sure you want to delete the lifecycle rule {{decodedRuleId}}?", + "deleteLifecycleButtonConfirm": "Delete", + "deleteLifecycleButtonCancel": "Cancel", + "deleteLifecycleToastSuccessTitle": "Rule deleted", + "deleteLifecycleToastSuccessMessage": "Your lifecycle rule has been deleted.", + "deleteLifecycleToastErrorTitle": "Deletion error", + "deleteLifecycleToastErrorMessage": "An error occurred while deleting your lifecycle rule: {{ message }}." +} diff --git a/packages/manager/apps/pci-object-storage/src/components/tag-input/TagInput.component.tsx b/packages/manager/apps/pci-object-storage/src/components/tag-input/TagInput.component.tsx new file mode 100644 index 000000000000..9ea5a35d8b59 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/components/tag-input/TagInput.component.tsx @@ -0,0 +1,116 @@ +import { TFunction } from 'i18next'; +import { Plus, X } from 'lucide-react'; +import { Button, Input } from '@datatr-ux/uxlib'; +import { Tag } from '@/types/Tag'; + +type TagError = { + key?: { message?: string }; + value?: { message?: string }; +}; + +type TagInputProps = { + tags: Tag[]; + setTags: (tags: Tag[]) => void; + isPending: boolean; + disabled?: boolean; + showHeader?: boolean; + t: TFunction; + errors?: TagError[]; +}; + +export const TagInput = ({ + tags, + setTags, + isPending, + disabled = false, + showHeader = true, + t, + errors, +}: TagInputProps) => { + const removeTag = (index: number) => { + setTags(tags.filter((_, i) => i !== index)); + }; + + const updateTag = ( + index: number, + field: 'key' | 'value', + newValue: string, + ) => { + setTags( + tags.map((tag, i) => (i === index ? { ...tag, [field]: newValue } : tag)), + ); + }; + + const addNewTag = () => { + setTags([...tags, { key: '', value: '' }]); + }; + + const isDisabled = isPending || disabled; + return ( +
+ {showHeader && ( +
+

{t('tagsLabel')}

+

+ {t('tagsDescription')} +

+
+ )} + +
+ {tags.map((tag, index) => { + const keyError = errors?.[index]?.key?.message; + return ( +
+
+
+ updateTag(index, 'key', e.target.value)} + disabled={isDisabled} + data-invalid={!!keyError} + /> +
+
+ updateTag(index, 'value', e.target.value)} + disabled={isDisabled} + /> +
+ +
+ {keyError && ( +

{keyError}

+ )} +
+ ); + })} +
+ + +
+ ); +}; diff --git a/packages/manager/apps/pci-object-storage/src/data/api/lifecycle/lifecycle.api.ts b/packages/manager/apps/pci-object-storage/src/data/api/lifecycle/lifecycle.api.ts new file mode 100644 index 000000000000..284559ee43a5 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/data/api/lifecycle/lifecycle.api.ts @@ -0,0 +1,39 @@ +import { apiClient } from '../api.client'; +import storages from '@/types/Storages'; + +export interface UpdateLifecycleParams { + projectId: string; + region: string; + name: string; + lifecycleRules: storages.LifecycleRule[]; +} + +export interface DeleteLifecycleParams { + projectId: string; + region: string; + name: string; +} + +export const deleteLifecycle = async ({ + projectId, + region, + name, +}: DeleteLifecycleParams) => { + return apiClient.v6.delete( + `/cloud/project/${projectId}/region/${region}/storage/${name}/lifecycle`, + ); +}; + +export const updateLifecycle = async ({ + projectId, + region, + name, + lifecycleRules, +}: UpdateLifecycleParams) => { + return apiClient.v6.put( + `/cloud/project/${projectId}/region/${region}/storage/${name}/lifecycle`, + { + rules: lifecycleRules, + }, + ); +}; diff --git a/packages/manager/apps/pci-object-storage/src/data/hooks/lifecycle/lifecycleQueryKey.ts b/packages/manager/apps/pci-object-storage/src/data/hooks/lifecycle/lifecycleQueryKey.ts new file mode 100644 index 000000000000..5a2826e348ff --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/data/hooks/lifecycle/lifecycleQueryKey.ts @@ -0,0 +1,18 @@ +export type LifecycleStorageParams = { + projectId: string; + region: string; + name: string; +}; + +export const getLifecycleQueryKey = ({ + projectId, + region, + name, +}: LifecycleStorageParams) => [ + projectId, + 'region', + region, + 'storage', + name, + 'lifecycle', +]; diff --git a/packages/manager/apps/pci-object-storage/src/data/hooks/lifecycle/useAddLifecycle.hook.ts b/packages/manager/apps/pci-object-storage/src/data/hooks/lifecycle/useAddLifecycle.hook.ts new file mode 100644 index 000000000000..0dbf5fc0ce80 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/data/hooks/lifecycle/useAddLifecycle.hook.ts @@ -0,0 +1,46 @@ +import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { updateLifecycle } from '@/data/api/lifecycle/lifecycle.api'; +import { ObjStoError } from '@/data/api'; +import storages from '@/types/Storages'; +import { getLifecycleQueryKey } from './lifecycleQueryKey'; +import { useFetchLifecycleRules } from './useFetchLifecycleRules.hook'; + +type UseAddLifecycleParams = { + onSuccess?: () => void; + onError?: (error: ObjStoError) => void; +}; + +export interface AddLifecycleParams { + projectId: string; + region: string; + name: string; + lifecycleRule: storages.LifecycleRule; +} + +export function useAddLifecycle({ onSuccess, onError }: UseAddLifecycleParams) { + const queryClient = useQueryClient(); + const { fetchLifecycleRules } = useFetchLifecycleRules(); + + const { mutate: addLifecycleMutation, isPending } = useMutation({ + mutationFn: async (data: AddLifecycleParams) => { + const existingRules = await fetchLifecycleRules(data); + const updatedRules = [...existingRules, data.lifecycleRule]; + + return updateLifecycle({ + projectId: data.projectId, + region: data.region, + name: data.name, + lifecycleRules: updatedRules, + }); + }, + onSuccess: (_, variables) => { + queryClient.invalidateQueries({ + queryKey: getLifecycleQueryKey(variables), + }); + onSuccess?.(); + }, + onError, + }); + + return { addLifecycle: addLifecycleMutation, isPending }; +} diff --git a/packages/manager/apps/pci-object-storage/src/data/hooks/lifecycle/useDeleteLifecycle.hook.ts b/packages/manager/apps/pci-object-storage/src/data/hooks/lifecycle/useDeleteLifecycle.hook.ts new file mode 100644 index 000000000000..0f9755633b78 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/data/hooks/lifecycle/useDeleteLifecycle.hook.ts @@ -0,0 +1,61 @@ +import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { + updateLifecycle, + deleteLifecycle, +} from '@/data/api/lifecycle/lifecycle.api'; +import { ObjStoError } from '@/data/api'; +import { getLifecycleQueryKey } from './lifecycleQueryKey'; +import { useFetchLifecycleRules } from './useFetchLifecycleRules.hook'; + +export type DeleteLifecycleRuleParams = { + projectId: string; + region: string; + name: string; + ruleId: string; +}; + +type UseDeleteLifecycleParams = { + onSuccess?: () => void; + onError?: (error: ObjStoError) => void; +}; + +export function useDeleteLifecycle({ + onSuccess, + onError, +}: UseDeleteLifecycleParams) { + const queryClient = useQueryClient(); + const { fetchLifecycleRules } = useFetchLifecycleRules(); + + const { mutate: deleteLifecycleMutation, isPending } = useMutation({ + mutationFn: async (data: DeleteLifecycleRuleParams) => { + const existingRules = await fetchLifecycleRules(data); + const updatedRules = existingRules.filter( + (rule) => rule.id !== data.ruleId, + ); + + if (updatedRules.length === 0) { + return deleteLifecycle({ + projectId: data.projectId, + region: data.region, + name: data.name, + }); + } + + return updateLifecycle({ + projectId: data.projectId, + region: data.region, + name: data.name, + lifecycleRules: updatedRules, + }); + }, + onSuccess: (_, variables) => { + queryClient.invalidateQueries({ + queryKey: getLifecycleQueryKey(variables), + }); + onSuccess?.(); + }, + onError, + }); + + return { deleteLifecycle: deleteLifecycleMutation, isPending }; +} diff --git a/packages/manager/apps/pci-object-storage/src/data/hooks/lifecycle/useFetchLifecycleRules.hook.ts b/packages/manager/apps/pci-object-storage/src/data/hooks/lifecycle/useFetchLifecycleRules.hook.ts new file mode 100644 index 000000000000..d00cbbf66e65 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/data/hooks/lifecycle/useFetchLifecycleRules.hook.ts @@ -0,0 +1,24 @@ +import { useQueryClient } from '@tanstack/react-query'; +import { getS3Lifecycle } from '@/data/api/storage/s3Storage.api'; +import storages from '@/types/Storages'; +import { + getLifecycleQueryKey, + LifecycleStorageParams, +} from './lifecycleQueryKey'; + +export function useFetchLifecycleRules() { + const queryClient = useQueryClient(); + + const fetchLifecycleRules = async ( + params: LifecycleStorageParams, + ): Promise => { + const queryKey = getLifecycleQueryKey(params); + const existing = await queryClient.fetchQuery({ + queryKey, + queryFn: () => getS3Lifecycle(params), + }); + return existing?.rules || []; + }; + + return { fetchLifecycleRules }; +} diff --git a/packages/manager/apps/pci-object-storage/src/data/hooks/lifecycle/useUpdateLifecycle.hook.ts b/packages/manager/apps/pci-object-storage/src/data/hooks/lifecycle/useUpdateLifecycle.hook.ts new file mode 100644 index 000000000000..ad55f2648f54 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/data/hooks/lifecycle/useUpdateLifecycle.hook.ts @@ -0,0 +1,51 @@ +import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { updateLifecycle } from '@/data/api/lifecycle/lifecycle.api'; +import { ObjStoError } from '@/data/api'; +import storages from '@/types/Storages'; +import { getLifecycleQueryKey } from './lifecycleQueryKey'; +import { useFetchLifecycleRules } from './useFetchLifecycleRules.hook'; + +type UseUpdateLifecycleParams = { + onSuccess?: () => void; + onError?: (error: ObjStoError) => void; +}; + +export interface UpdateLifecycleParams { + projectId: string; + region: string; + name: string; + lifecycleRule: storages.LifecycleRule; +} + +export function useUpdateLifecycle({ + onSuccess, + onError, +}: UseUpdateLifecycleParams) { + const queryClient = useQueryClient(); + const { fetchLifecycleRules } = useFetchLifecycleRules(); + + const { mutate: updateLifecycleMutation, isPending } = useMutation({ + mutationFn: async (data: UpdateLifecycleParams) => { + const existingRules = await fetchLifecycleRules(data); + const updatedRules = existingRules.map((rule) => + rule.id === data.lifecycleRule.id ? data.lifecycleRule : rule, + ); + + return updateLifecycle({ + projectId: data.projectId, + region: data.region, + name: data.name, + lifecycleRules: updatedRules, + }); + }, + onSuccess: (_, variables) => { + queryClient.invalidateQueries({ + queryKey: getLifecycleQueryKey(variables), + }); + onSuccess?.(); + }, + onError, + }); + + return { updateLifecycle: updateLifecycleMutation, isPending }; +} diff --git a/packages/manager/apps/pci-object-storage/src/data/hooks/s3-storage/useGetS3Lifecycle.hook.ts b/packages/manager/apps/pci-object-storage/src/data/hooks/s3-storage/useGetS3Lifecycle.hook.ts index 4aa19ad54a4e..7f05a350a11f 100644 --- a/packages/manager/apps/pci-object-storage/src/data/hooks/s3-storage/useGetS3Lifecycle.hook.ts +++ b/packages/manager/apps/pci-object-storage/src/data/hooks/s3-storage/useGetS3Lifecycle.hook.ts @@ -3,6 +3,7 @@ import { OptionsFor, useQueryImmediateRefetch, } from '@/hooks/useImmediateRefetch'; +import { getLifecycleQueryKey } from '@/data/hooks/lifecycle/lifecycleQueryKey'; export type UseGetS3LifecycleProps = { projectId: string; @@ -17,9 +18,8 @@ export function useGetS3Lifecycle({ name, options, }: UseGetS3LifecycleProps) { - const queryKey = [projectId, 'region', region, 'storage', name, 'lifecycle']; return useQueryImmediateRefetch({ - queryKey, + queryKey: getLifecycleQueryKey({ projectId, region, name }), queryFn: () => getS3Lifecycle({ projectId, region, name }), ...options, }); diff --git a/packages/manager/apps/pci-object-storage/src/hooks/useAvailableStorageClasses.hook.tsx b/packages/manager/apps/pci-object-storage/src/hooks/useAvailableStorageClasses.hook.tsx index e81c8b9ac7aa..44c374135c44 100644 --- a/packages/manager/apps/pci-object-storage/src/hooks/useAvailableStorageClasses.hook.tsx +++ b/packages/manager/apps/pci-object-storage/src/hooks/useAvailableStorageClasses.hook.tsx @@ -8,6 +8,14 @@ import { } from '@/configuration/region.const'; import { useFeatureAvailability } from '@ovh-ux/manager-module-common-api'; +export const STORAGE_CLASS_TIER: Record = { + STANDARD: 0, + HIGH_PERF: 0, + STANDARD_IA: 1, + GLACIER_IR: 2, + DEEP_ARCHIVE: 3, +}; + export function useAvailableStorageClasses(region: string) { const { data: featuresAvailable } = useFeatureAvailability([ 'pci-object-storage:storage-class-active-archive', @@ -55,8 +63,12 @@ export function useAvailableStorageClasses(region: string) { } }); + const sorted = [...availableStorageClasses].sort( + (a, b) => (STORAGE_CLASS_TIER[a] ?? 0) - (STORAGE_CLASS_TIER[b] ?? 0), + ); + return { - availableStorageClasses, + availableStorageClasses: sorted, isPending: regionQuery.isPending, }; } diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/_components/S3Tabs.component.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/_components/S3Tabs.component.tsx index 62b43afc1d04..0e9ac589cbac 100644 --- a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/_components/S3Tabs.component.tsx +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/_components/S3Tabs.component.tsx @@ -4,18 +4,27 @@ import TabsMenu from '@/components/tabs-menu/TabsMenu.component'; import { useIsLocaleZone } from '@/hooks/useIsLocalZone.hook'; import { useObjectStorageData } from '@/pages/object-storage/ObjectStorage.context'; import { useFeatureAvailability } from '@ovh-ux/manager-module-common-api'; +import { useParams } from 'react-router-dom'; +import { useGetS3Lifecycle } from '@/data/hooks/s3-storage/useGetS3Lifecycle.hook'; interface S3TabsProps { s3: StorageContainer; } const S3Tabs = ({ s3 }: S3TabsProps) => { const { t } = useTranslation('pci-object-storage/storages/header-tabs'); + const { projectId, region, s3Name } = useParams(); const { regions } = useObjectStorageData(); const isLocaleZone = useIsLocaleZone(s3, regions); const { data: featuresAvailable } = useFeatureAvailability([ 'pci-object-storage:manage-lifecycle', ]); + const lifecycleQuery = useGetS3Lifecycle({ + projectId, + region, + name: s3Name, + }); + const isManageLifecycleFeatureAvailable = featuresAvailable?.['pci-object-storage:manage-lifecycle']; @@ -31,10 +40,11 @@ const S3Tabs = ({ s3 }: S3TabsProps) => { count: s3.replication?.rules?.length || 0, }, !isLocaleZone && - isManageLifecycleFeatureAvailable && { - href: 'lifecycle', - label: t('lifecycleTab'), - }, + isManageLifecycleFeatureAvailable && { + href: 'lifecycle', + label: t('lifecycleTab'), + count: lifecycleQuery.data?.rules?.length || 0, + }, ].filter((tab) => tab); return ; diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/CheckboxField.component.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/CheckboxField.component.tsx new file mode 100644 index 000000000000..3559efca9686 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/CheckboxField.component.tsx @@ -0,0 +1,39 @@ +import { Checkbox, Label } from '@datatr-ux/uxlib'; + +interface CheckboxFieldProps { + id: string; + label: string; + description?: string; + checked: boolean; + onCheckedChange: (checked: boolean) => void; + disabled?: boolean; + className?: string; +} + +export const CheckboxField = ({ + id, + label, + description, + checked, + onCheckedChange, + disabled, + className, +}: CheckboxFieldProps) => ( +
+ onCheckedChange(value === true)} + disabled={disabled} + className='mt-1' + /> +
+ + {description && ( +

{description}

+ )} +
+
+); diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleForm.component.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleForm.component.tsx new file mode 100644 index 000000000000..6ca7f3238e23 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleForm.component.tsx @@ -0,0 +1,66 @@ +import { UseFormReturn, useFormState } from 'react-hook-form'; +import storages from '@/types/Storages'; +import { useTranslation } from 'react-i18next'; +import { LifecycleFormValues } from './useLifecycleForm.hook'; +import { LifecycleFormProvider } from './LifecycleForm.context'; +import { LifecycleRuleIdentification } from './LifecycleRuleIdentification.component'; +import { LifecycleRuleScope } from './LifecycleRuleScope.component'; +import { LifecycleRuleCurrentVersion } from './LifecycleRuleCurrentVersion.component'; +import { LifecycleRuleNoncurrentVersion } from './LifecycleRuleNoncurrentVersion.component'; +import { LifecycleRuleAbortMultipart } from './LifecycleRuleAbortMultipart.component'; +import { Separator } from '@datatr-ux/uxlib'; + +interface LifecycleFormProps { + isEditMode?: boolean; + lifecycleTitle: string; + form: UseFormReturn; + isPending: boolean; + availableStorageClasses: storages.StorageClassEnum[]; + onSubmit: () => void; +} + +export const LifecycleForm = ({ + isEditMode = false, + lifecycleTitle, + form, + isPending, + availableStorageClasses, + onSubmit, +}: LifecycleFormProps) => { + const { t } = useTranslation('pci-object-storage/storages/s3/lifecycle'); + const { isSubmitted } = useFormState({ control: form.control }); + + const hasOperation = form.watch('hasCurrentVersionTransitions') + || form.watch('hasCurrentVersionExpiration') + || form.watch('expiredObjectDeleteMarker') + || form.watch('hasNoncurrentVersionTransitions') + || form.watch('hasNoncurrentVersionExpiration') + || form.watch('hasAbortIncompleteMultipartUpload'); + + const showNoOperationError = isSubmitted && !hasOperation; + + return ( + +
+ + + + + {showNoOperationError && ( +

+ {t('formAtLeastOneOperationError')} +

+ )} + + + + +
+ ); +}; diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleForm.context.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleForm.context.tsx new file mode 100644 index 000000000000..8b10b3d910f7 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleForm.context.tsx @@ -0,0 +1,58 @@ +import React, { createContext, useContext } from 'react'; +import { UseFormReturn, FormProvider } from 'react-hook-form'; +import storages from '@/types/Storages'; +import { LifecycleFormValues } from './useLifecycleForm.hook'; + +interface LifecycleFormContextProps { + form: UseFormReturn; + isPending: boolean; + isEditMode: boolean; + lifecycleTitle: string; + availableStorageClasses: storages.StorageClassEnum[]; +} + +const LifecycleFormContext = createContext( + null, +); + +export const useLifecycleFormContext = () => { + const context = useContext(LifecycleFormContext); + if (!context) { + throw new Error( + 'useLifecycleFormContext must be used within a LifecycleFormProvider', + ); + } + return context; +}; + +interface LifecycleFormProviderProps { + form: UseFormReturn; + isPending: boolean; + isEditMode?: boolean; + lifecycleTitle: string; + availableStorageClasses: storages.StorageClassEnum[]; + children: React.ReactNode; +} + +export const LifecycleFormProvider = ({ + form, + isPending, + isEditMode = false, + lifecycleTitle, + availableStorageClasses, + children, +}: LifecycleFormProviderProps) => { + const contextValue: LifecycleFormContextProps = { + form, + isPending, + isEditMode, + lifecycleTitle, + availableStorageClasses, + }; + + return ( + + {children} + + ); +}; diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleAbortMultipart.component.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleAbortMultipart.component.tsx new file mode 100644 index 000000000000..7ca16915f457 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleAbortMultipart.component.tsx @@ -0,0 +1,40 @@ +import { useTranslation } from 'react-i18next'; +import { FieldLabel, Input } from '@datatr-ux/uxlib'; +import { FormField } from '@/components/form-field/FormField.component'; +import { useLifecycleFormContext } from './LifecycleForm.context'; +import { CheckboxField } from './CheckboxField.component'; + +export const LifecycleRuleAbortMultipart = () => { + const { form, isPending } = useLifecycleFormContext(); + const { t } = useTranslation('pci-object-storage/storages/s3/lifecycle'); + + const hasAbort = form.watch('hasAbortIncompleteMultipartUpload'); + + return ( + <> + + form.setValue('hasAbortIncompleteMultipartUpload', checked) + } + disabled={isPending} + /> + + {hasAbort && ( +
+ + {(field) => ( + <> + {t('formAbortDaysLabel')} + + + )} + +
+ )} + + ); +}; diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleContainer.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleContainer.tsx new file mode 100644 index 000000000000..791d56aa52b8 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleContainer.tsx @@ -0,0 +1,21 @@ +import React from 'react'; + +export const LifecycleRuleContainer = ({ + title, + description, + children, +}: { + title: string; + description?: string; + children: React.ReactNode; +}) => { + return ( +
+

{title}

+ {description && ( +

{description}

+ )} +
{children}
+
+ ); +}; diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleCurrentVersion.component.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleCurrentVersion.component.tsx new file mode 100644 index 000000000000..e20410fd51aa --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleCurrentVersion.component.tsx @@ -0,0 +1,46 @@ +import { useTranslation } from 'react-i18next'; +import { useLifecycleFormContext } from './LifecycleForm.context'; +import { LifecycleRuleVersionOperations } from './LifecycleRuleVersionOperations.component'; +import { CheckboxField } from './CheckboxField.component'; + +export const LifecycleRuleCurrentVersion = () => { + const { form, isPending } = useLifecycleFormContext(); + const { t } = useTranslation('pci-object-storage/storages/s3/lifecycle'); + + const expiredObjectDeleteMarker = form.watch('expiredObjectDeleteMarker'); + + return ( + + + form.setValue('expiredObjectDeleteMarker', checked) + } + disabled={isPending} + className="mt-4" + /> + + ); +}; diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleIdentification.component.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleIdentification.component.tsx new file mode 100644 index 000000000000..cc50f441ae73 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleIdentification.component.tsx @@ -0,0 +1,32 @@ +import { useTranslation } from 'react-i18next'; +import { FieldLabel, Input } from '@datatr-ux/uxlib'; +import { LifecycleRuleContainer } from './LifecycleRuleContainer'; +import { FormField } from '@/components/form-field/FormField.component'; +import { useLifecycleFormContext } from './LifecycleForm.context'; + +export const LifecycleRuleIdentification = () => { + const { + form, + isPending, + isEditMode, + lifecycleTitle, + } = useLifecycleFormContext(); + const { t } = useTranslation('pci-object-storage/storages/s3/lifecycle'); + + return ( + + + {(field) => ( + <> + {t('formRuleIdLabel')} + + + )} + + + ); +}; diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleNoncurrentVersion.component.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleNoncurrentVersion.component.tsx new file mode 100644 index 000000000000..b14441a89744 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleNoncurrentVersion.component.tsx @@ -0,0 +1,25 @@ +import { LifecycleRuleVersionOperations } from './LifecycleRuleVersionOperations.component'; + +export const LifecycleRuleNoncurrentVersion = () => ( + +); diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleScope.component.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleScope.component.tsx new file mode 100644 index 000000000000..5af133bb8382 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleScope.component.tsx @@ -0,0 +1,145 @@ +import { useTranslation } from 'react-i18next'; +import { Controller } from 'react-hook-form'; +import { + FieldDescription, + FieldLabel, + Input, + RadioGroup, + RadioGroupItem, + Label, +} from '@datatr-ux/uxlib'; +import { LifecycleRuleContainer } from './LifecycleRuleContainer'; +import { FormField } from '@/components/form-field/FormField.component'; +import { useLifecycleFormContext } from './LifecycleForm.context'; +import { TagInput } from '@/components/tag-input/TagInput.component'; +import { CheckboxField } from './CheckboxField.component'; +import { SizeFilterField } from './SizeFilterField.component'; + +export const LifecycleRuleScope = () => { + const { form, isPending } = useLifecycleFormContext(); + const { t } = useTranslation('pci-object-storage/storages/s3/lifecycle'); + const hasFilter = form.watch('hasFilter'); + const hasObjectSizeGreaterThan = form.watch('hasObjectSizeGreaterThan'); + const hasObjectSizeLessThan = form.watch('hasObjectSizeLessThan'); + + return ( + + {t('formScopeDescription')} + ( + field.onChange(value === 'limited')} + disabled={isPending} + > +
+ + +
+
+ + +
+
+ )} + /> + + {hasFilter && ( +
+ + {(field) => ( + <> + {t('formPrefixLabel')} + + + )} + + +
+ {t('formTagsLabel')} + ( + tagsField.onChange(newTags)} + isPending={isPending} + showHeader={false} + t={t} + errors={Array.isArray(form.formState.errors.tags) ? form.formState.errors.tags : []} + /> + )} + /> +
+ +
+ + form.setValue('hasObjectSizeGreaterThan', checked) + } + disabled={isPending} + /> + {hasObjectSizeGreaterThan && ( +
+ +
+ )} +
+ +
+ + form.setValue('hasObjectSizeLessThan', checked) + } + disabled={isPending} + /> + {hasObjectSizeLessThan && ( +
+ +
+ )} +
+ + {form.formState.errors.objectSizeGreaterThan && ( +

+ {form.formState.errors.objectSizeGreaterThan.message} +

+ )} +
+ )} +
+ ); +}; diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleVersionOperations.component.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleVersionOperations.component.tsx new file mode 100644 index 000000000000..d81815264925 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/LifecycleRuleVersionOperations.component.tsx @@ -0,0 +1,118 @@ +import React from 'react'; +import { useTranslation } from 'react-i18next'; +import { FieldLabel, Input } from '@datatr-ux/uxlib'; +import { LifecycleRuleContainer } from './LifecycleRuleContainer'; +import { FormField } from '@/components/form-field/FormField.component'; +import { useLifecycleFormContext } from './LifecycleForm.context'; +import { CheckboxField } from './CheckboxField.component'; +import { + TransitionListField, + TransitionListFieldConfig, +} from './TransitionListField.component'; +import { LifecycleFormValues } from './useLifecycleForm.hook'; + +type BooleanFieldName = { + [K in keyof LifecycleFormValues]: LifecycleFormValues[K] extends boolean + ? K + : never; +}[keyof LifecycleFormValues]; + +type NumberFieldName = { + [K in keyof LifecycleFormValues]: LifecycleFormValues[K] extends number + ? K + : never; +}[keyof LifecycleFormValues]; + +interface ExpirationConfig { + hasFieldName: BooleanFieldName; + daysFieldName: NumberFieldName; + newerVersionsFieldName?: NumberFieldName; + checkboxId: string; + checkboxLabelKey: string; + daysLabelKey: string; + newerVersionsLabelKey?: string; +} + +interface LifecycleRuleVersionOperationsProps { + titleKey?: string; + descriptionKey?: string; + transition: TransitionListFieldConfig; + expiration: ExpirationConfig; + children?: React.ReactNode; +} + +export const LifecycleRuleVersionOperations = ({ + titleKey, + descriptionKey, + transition, + expiration, + children, +}: LifecycleRuleVersionOperationsProps) => { + const { form, isPending } = useLifecycleFormContext(); + const { t } = useTranslation('pci-object-storage/storages/s3/lifecycle'); + + const hasExpiration = form.watch(expiration.hasFieldName); + + const content = ( + <> + + + + form.setValue(expiration.hasFieldName, checked) + } + disabled={isPending} + className="mt-2" + /> + + {hasExpiration && ( +
+ + {(field) => ( + <> + {t(expiration.daysLabelKey)} + + + )} + + {expiration.newerVersionsFieldName && + expiration.newerVersionsLabelKey && ( + + {(field) => ( + <> + + {t(expiration.newerVersionsLabelKey)} + + + + )} + + )} +
+ )} + + {children} + + ); + + if (titleKey) { + return ( + + {content} + + ); + } + + return content; +}; diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/PayloadPreview.component.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/PayloadPreview.component.tsx new file mode 100644 index 000000000000..473a6fefcab4 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/PayloadPreview.component.tsx @@ -0,0 +1,73 @@ +import { useState } from 'react'; +import { UseFormReturn } from 'react-hook-form'; +import { Code, EyeOff, Copy, Check } from 'lucide-react'; +import { Button } from '@datatr-ux/uxlib'; +import { LifecycleFormValues } from './useLifecycleForm.hook'; +import { buildLifecycleRule } from './buildLifecycleRule'; + +interface PayloadPreviewProps { + form: UseFormReturn; +} + +export const PayloadPreview = ({ form }: PayloadPreviewProps) => { + const [isOpen, setIsOpen] = useState(false); + const [copied, setCopied] = useState(false); + const formValues = form.watch(); + + const rule = buildLifecycleRule({ + ...formValues, + ruleId: formValues.ruleId || '', + }); + const payload = JSON.stringify({ rules: [rule] }, null, 2); + + const handleCopy = async () => { + await navigator.clipboard.writeText(payload); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + }; + + if (!isOpen) { + return ( + + ); + } + + return ( +
+
+ + + API Payload + +
+ + +
+
+
+        {payload}
+      
+
+ ); +}; diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/SizeFilterField.component.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/SizeFilterField.component.tsx new file mode 100644 index 000000000000..d7ed036c7d70 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/SizeFilterField.component.tsx @@ -0,0 +1,122 @@ +import { useState } from 'react'; +import { UseFormReturn } from 'react-hook-form'; +import { + FieldLabel, + Input, + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@datatr-ux/uxlib'; +import { useTranslation } from 'react-i18next'; +import { LifecycleFormValues } from './useLifecycleForm.hook'; + +type SizeUnit = 'KB' | 'MB' | 'GB'; + +const SIZE_UNIT_KEYS: SizeUnit[] = ['KB', 'MB', 'GB']; + +const SIZE_UNITS: Record = { + KB: 1024, + MB: 1024 * 1024, + GB: 1024 * 1024 * 1024, +}; + +const deriveBestUnit = (bytes: number): { value: number; unit: SizeUnit } => { + if (bytes <= 0) return { value: 0, unit: 'KB' }; + + const units: SizeUnit[] = ['GB', 'MB', 'KB']; + for (const unit of units) { + const multiplier = SIZE_UNITS[unit]; + if (bytes >= multiplier && bytes % multiplier === 0) { + return { value: bytes / multiplier, unit }; + } + } + return { value: bytes / SIZE_UNITS.KB, unit: 'KB' }; +}; + +interface SizeFilterFieldProps { + name: 'objectSizeGreaterThan' | 'objectSizeLessThan'; + label: string; + form: UseFormReturn; + isPending: boolean; +} + +export const SizeFilterField = ({ + name, + label, + form, + isPending, +}: SizeFilterFieldProps) => { + const { t } = useTranslation('pci-object-storage/storages/s3/lifecycle'); + const initialBytes = Number(form.getValues(name)); + + const [unit, setUnit] = useState( + () => deriveBestUnit(initialBytes).unit, + ); + const [inputValue, setInputValue] = useState( + () => deriveBestUnit(initialBytes).value, + ); + + const derivedBytes = Math.round(inputValue * SIZE_UNITS[unit]); + + const updateForm = (value: number, selectedUnit: SizeUnit) => { + const newBytes = Math.round(value * SIZE_UNITS[selectedUnit]); + form.setValue(name, newBytes >= 0 ? newBytes : 0, { + shouldValidate: true, + }); + }; + + const handleInputChange = (e: React.ChangeEvent) => { + const raw = e.target.value; + if (raw === '') { + setInputValue(0); + updateForm(0, unit); + return; + } + const value = Number(raw); + setInputValue(value); + updateForm(value, unit); + }; + + const handleUnitChange = (newUnit: SizeUnit) => { + setUnit(newUnit); + updateForm(inputValue, newUnit); + }; + + return ( +
+ {label} + {derivedBytes > 0 && ( +

+ {t('formObjectSizeBytesDisplay', { bytes: derivedBytes })} +

+ )} +
+
+ +
+
+ +
+
+
+ ); +}; diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/TransitionListField.component.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/TransitionListField.component.tsx new file mode 100644 index 000000000000..98e1edc64a80 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/TransitionListField.component.tsx @@ -0,0 +1,281 @@ +import { useTranslation } from 'react-i18next'; +import { + FieldLabel, + Input, + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, + Button, +} from '@datatr-ux/uxlib'; +import { Plus, X } from 'lucide-react'; +import storages from '@/types/Storages'; +import { CheckboxField } from './CheckboxField.component'; +import { useLifecycleFormContext } from './LifecycleForm.context'; +import { + MIN_TRANSITION_GAP_DAYS, + getDisabledStorageClasses, + canAddTransition, + getNextTransitionDays, +} from './lifecycleTransition.utils'; +import { LifecycleFormValues } from './useLifecycleForm.hook'; +import { Controller, FieldPath, PathValue } from 'react-hook-form'; + +type CurrentTransition = LifecycleFormValues['transitions'][number]; +type NoncurrentTransition = LifecycleFormValues['noncurrentVersionTransitions'][number]; + +const getTransitionDays = ( + tr: CurrentTransition | NoncurrentTransition, +): number | undefined => { + if ('noncurrentDays' in tr) return tr.noncurrentDays; + if ('days' in tr) return tr.days; + return undefined; +}; + +export type TransitionListFieldConfig = { + hasFieldName: + | 'hasCurrentVersionTransitions' + | 'hasNoncurrentVersionTransitions'; + transitionsFieldName: 'transitions' | 'noncurrentVersionTransitions'; + daysKey: 'days' | 'noncurrentDays'; + checkboxId: string; + checkboxLabelKey: string; + checkboxDescriptionKey?: string; + daysLabelKey: string; + addButtonLabelKey: string; +}; + +export function TransitionListField(config: TransitionListFieldConfig) { + const { + form, + isPending, + availableStorageClasses, + } = useLifecycleFormContext(); + const { t } = useTranslation('pci-object-storage/storages/s3/lifecycle'); + const { t: tObj } = useTranslation( + 'pci-object-storage/storages/s3/object-class', + ); + + const isNoncurrent = + config.transitionsFieldName === 'noncurrentVersionTransitions'; + + const hasField = form.watch(config.hasFieldName); + const currentTransitions = form.watch('transitions') ?? []; + const noncurrentTransitions = + form.watch('noncurrentVersionTransitions') ?? []; + const transitionsList: (CurrentTransition | NoncurrentTransition)[] = + isNoncurrent ? noncurrentTransitions : currentTransitions; + const transitionLike = transitionsList.map((tr) => ({ + storageClass: tr.storageClass, + })); + const daysList = transitionsList.map((tr) => ({ + days: getTransitionDays(tr) ?? 0, + })); + + const addTransition = () => { + const nextDays = getNextTransitionDays(daysList); + const storageClass: storages.StorageClassEnum | undefined = undefined; + const newItem = isNoncurrent + ? { noncurrentDays: nextDays, storageClass, newerNoncurrentVersions: 0 } + : { days: nextDays, storageClass }; + form.setValue( + config.transitionsFieldName, + [...transitionsList, newItem], + ); + }; + + const removeTransition = (index: number) => { + form.setValue( + config.transitionsFieldName, + transitionsList.filter((_, i) => i !== index), + { shouldValidate: true }, + ); + }; + + const handleToggle = (checked: boolean) => { + form.setValue(config.hasFieldName, checked); + if (checked && transitionsList.length === 0) { + const storageClass: storages.StorageClassEnum | undefined = undefined; + const initialItem = isNoncurrent + ? { + noncurrentDays: MIN_TRANSITION_GAP_DAYS, + storageClass, + newerNoncurrentVersions: 0, + } + : { days: MIN_TRANSITION_GAP_DAYS, storageClass }; + form.setValue( + config.transitionsFieldName, + [initialItem], + ); + } + }; + + const daysPath = (index: number) => + `${config.transitionsFieldName}.${index}.${config.daysKey}` as FieldPath< + LifecycleFormValues + >; + const storageClassPath = (index: number) => + `${config.transitionsFieldName}.${index}.storageClass` as FieldPath< + LifecycleFormValues + >; + const newerNoncurrentVersionsPath = (index: number) => + `${config.transitionsFieldName}.${index}.newerNoncurrentVersions` as FieldPath< + LifecycleFormValues + >; + + return ( + <> + + + {hasField && ( +
+ {transitionsList.map((transition, index) => { + const daysValue = getTransitionDays(transition); + const daysErrorMessage = form.getFieldState(daysPath(index)) + .error?.message; + const storageClassErrorMessage = form.getFieldState( + storageClassPath(index), + ).error?.message; + + return ( +
+
+
+ {t(config.daysLabelKey)} + { + const raw = e.target.value; + form.setValue( + daysPath(index), + raw === '' ? '' : Number(raw), + { shouldValidate: true }, + ); + }} + disabled={isPending} + /> +
+
+ ( + <> + {t('formStorageClassLabel')} + + + )} + /> +
+ {isNoncurrent && ( +
+ + {t('formNewerNoncurrentVersionsLabel')} + + { + const raw = e.target.value; + form.setValue( + newerNoncurrentVersionsPath(index), + raw === '' ? '' : Number(raw), + { shouldValidate: true }, + ); + }} + disabled={isPending} + /> +
+ )} + {index > 0 && ( + + )} +
+
+

+ {daysErrorMessage} +

+

+ {storageClassErrorMessage} +

+ {isNoncurrent &&
} +
+
+ ); + })} + {canAddTransition(availableStorageClasses, transitionLike) && ( + + )} +
+ )} + + ); +} diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/buildLifecycleRule.ts b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/buildLifecycleRule.ts new file mode 100644 index 000000000000..a9b284b43bbd --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/buildLifecycleRule.ts @@ -0,0 +1,114 @@ +import storages from '@/types/Storages'; +import { LifecycleFormValues } from './useLifecycleForm.hook'; + +export const buildLifecycleRule = ( + formValues: LifecycleFormValues, +): storages.LifecycleRule | null => { + const { + ruleId, + status, + hasFilter, + prefix, + tags, + hasObjectSizeGreaterThan, + objectSizeGreaterThan, + hasObjectSizeLessThan, + objectSizeLessThan, + hasCurrentVersionTransitions, + transitions, + hasCurrentVersionExpiration, + expirationDays, + expiredObjectDeleteMarker, + hasNoncurrentVersionTransitions, + noncurrentVersionTransitions, + hasNoncurrentVersionExpiration, + noncurrentVersionExpirationDays, + hasAbortIncompleteMultipartUpload, + abortDaysAfterInitiation, + } = formValues; + + if (!ruleId) return null; + + const filteredTags = (tags || []) + .filter((tag) => tag.key.trim() !== '') + .reduce>( + (acc, { key, value }) => ({ ...acc, [key]: value }), + {}, + ); + + const hasPrefix = hasFilter && prefix; + const hasTags = hasFilter && Object.keys(filteredTags).length > 0; + const hasSizeGreaterThan = + hasFilter && hasObjectSizeGreaterThan && objectSizeGreaterThan > 0; + const hasSizeLessThan = + hasFilter && hasObjectSizeLessThan && objectSizeLessThan > 0; + const hasFilterData = + hasPrefix || hasTags || hasSizeGreaterThan || hasSizeLessThan; + + const rule: storages.LifecycleRule = { + id: ruleId, + status, + ...(hasFilterData && { + filter: { + ...(hasPrefix && { prefix }), + ...(hasTags && { tags: filteredTags }), + ...(hasSizeGreaterThan && { objectSizeGreaterThan }), + ...(hasSizeLessThan && { objectSizeLessThan }), + }, + }), + ...(hasCurrentVersionTransitions && + transitions.length > 0 && { + transitions: transitions + .filter((t) => t.days > 0) + .map((t) => ({ + days: t.days, + storageClass: + storages.LifecycleRuleTransitionStorageClassEnum[ + t.storageClass as keyof typeof storages.LifecycleRuleTransitionStorageClassEnum + ], + })), + }), + ...((hasCurrentVersionExpiration && expirationDays > 0) || + expiredObjectDeleteMarker + ? { + expiration: { + ...(hasCurrentVersionExpiration && + expirationDays > 0 && { days: expirationDays }), + ...(expiredObjectDeleteMarker && { + expiredObjectDeleteMarker: true, + }), + }, + } + : {}), + ...(hasNoncurrentVersionTransitions && + noncurrentVersionTransitions.length > 0 && { + noncurrentVersionTransitions: noncurrentVersionTransitions + .filter((t) => t.noncurrentDays > 0) + .map((t) => ({ + noncurrentDays: t.noncurrentDays, + storageClass: t.storageClass, + ...(t.newerNoncurrentVersions > 0 && { + newerNoncurrentVersions: t.newerNoncurrentVersions, + }), + })), + }), + ...(hasNoncurrentVersionExpiration && + noncurrentVersionExpirationDays > 0 && { + noncurrentVersionExpiration: { + noncurrentDays: noncurrentVersionExpirationDays, + ...(formValues.noncurrentVersionExpirationNewerVersions > 0 && { + newerNoncurrentVersions: + formValues.noncurrentVersionExpirationNewerVersions, + }), + }, + }), + ...(hasAbortIncompleteMultipartUpload && + abortDaysAfterInitiation > 0 && { + abortIncompleteMultipartUpload: { + daysAfterInitiation: abortDaysAfterInitiation, + }, + }), + }; + + return rule; +}; diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/lifecycleForm.schema.spec.ts b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/lifecycleForm.schema.spec.ts new file mode 100644 index 000000000000..f20714ec66f9 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/lifecycleForm.schema.spec.ts @@ -0,0 +1,422 @@ +import { describe, it, expect } from 'vitest'; +import { createLifecycleSchema } from './lifecycleForm.schema'; + +const mockT = (key: string) => key; +const schema = createLifecycleSchema(mockT); + +const baseData = { + ruleId: 'test-rule', + status: 'enabled', + hasFilter: false, + prefix: '', + tags: [] as { key: string; value: string }[], + hasCurrentVersionTransitions: false, + transitions: [] as { days: number; storageClass: string }[], + hasCurrentVersionExpiration: false, + expirationDays: 0, + expiredObjectDeleteMarker: false, + hasNoncurrentVersionTransitions: false, + noncurrentVersionTransitions: [] as { noncurrentDays: number; storageClass: string }[], + hasNoncurrentVersionExpiration: false, + noncurrentVersionExpirationDays: 0, + hasObjectSizeGreaterThan: false, + objectSizeGreaterThan: 0, + hasObjectSizeLessThan: false, + objectSizeLessThan: 0, + hasAbortIncompleteMultipartUpload: true, + abortDaysAfterInitiation: 1, +}; + +describe('createLifecycleSchema', () => { + it('should accept valid base data', () => { + const result = schema.safeParse(baseData); + expect(result.success).toBe(true); + }); + + it('should require ruleId', () => { + const result = schema.safeParse({ ...baseData, ruleId: '' }); + expect(result.success).toBe(false); + }); + + describe('current version transitions - min 30 days', () => { + it('should reject a transition with days < 30', () => { + const result = schema.safeParse({ + ...baseData, + hasCurrentVersionTransitions: true, + transitions: [{ days: 10, storageClass: 'STANDARD_IA' }], + }); + expect(result.success).toBe(false); + if (!result.success) { + const daysError = result.error.issues.find( + (i) => i.path.includes('days') && i.path.includes(0), + ); + expect(daysError).toBeDefined(); + } + }); + + it('should accept a transition with days = 30', () => { + const result = schema.safeParse({ + ...baseData, + hasCurrentVersionTransitions: true, + transitions: [{ days: 30, storageClass: 'STANDARD_IA' }], + }); + expect(result.success).toBe(true); + }); + }); + + describe('current version transitions - 30-day gap between consecutive transitions', () => { + it('should reject transitions with less than 30-day gap (sorted by tier)', () => { + const result = schema.safeParse({ + ...baseData, + hasCurrentVersionTransitions: true, + transitions: [ + { days: 30, storageClass: 'STANDARD_IA' }, + { days: 40, storageClass: 'GLACIER_IR' }, + ], + }); + expect(result.success).toBe(false); + if (!result.success) { + const gapError = result.error.issues.find( + (i) => i.message === 'formTransitionMinGapError', + ); + expect(gapError).toBeDefined(); + } + }); + + it('should accept transitions with exactly 30-day gap', () => { + const result = schema.safeParse({ + ...baseData, + hasCurrentVersionTransitions: true, + transitions: [ + { days: 30, storageClass: 'STANDARD_IA' }, + { days: 60, storageClass: 'GLACIER_IR' }, + ], + }); + expect(result.success).toBe(true); + }); + + it('should accept transitions with more than 30-day gap', () => { + const result = schema.safeParse({ + ...baseData, + hasCurrentVersionTransitions: true, + transitions: [ + { days: 30, storageClass: 'STANDARD_IA' }, + { days: 90, storageClass: 'GLACIER_IR' }, + { days: 120, storageClass: 'DEEP_ARCHIVE' }, + ], + }); + expect(result.success).toBe(true); + }); + + it('should sort transitions by tier before validating gap', () => { + // Transitions entered in reverse tier order but with valid gaps when sorted + const result = schema.safeParse({ + ...baseData, + hasCurrentVersionTransitions: true, + transitions: [ + { days: 60, storageClass: 'GLACIER_IR' }, + { days: 30, storageClass: 'STANDARD_IA' }, + ], + }); + expect(result.success).toBe(true); + }); + }); + + describe('noncurrent version transitions - min 30 days', () => { + it('should reject a noncurrent transition with days < 30', () => { + const result = schema.safeParse({ + ...baseData, + hasNoncurrentVersionTransitions: true, + noncurrentVersionTransitions: [ + { noncurrentDays: 15, storageClass: 'STANDARD_IA' }, + ], + }); + expect(result.success).toBe(false); + }); + + it('should accept a noncurrent transition with days = 30', () => { + const result = schema.safeParse({ + ...baseData, + hasNoncurrentVersionTransitions: true, + noncurrentVersionTransitions: [ + { noncurrentDays: 30, storageClass: 'STANDARD_IA' }, + ], + }); + expect(result.success).toBe(true); + }); + }); + + describe('noncurrent version transitions - 30-day gap', () => { + it('should reject noncurrent transitions with less than 30-day gap', () => { + const result = schema.safeParse({ + ...baseData, + hasNoncurrentVersionTransitions: true, + noncurrentVersionTransitions: [ + { noncurrentDays: 30, storageClass: 'STANDARD_IA' }, + { noncurrentDays: 50, storageClass: 'GLACIER_IR' }, + ], + }); + expect(result.success).toBe(false); + if (!result.success) { + const gapError = result.error.issues.find( + (i) => i.message === 'formTransitionMinGapError', + ); + expect(gapError).toBeDefined(); + } + }); + + it('should accept noncurrent transitions with valid gaps', () => { + const result = schema.safeParse({ + ...baseData, + hasNoncurrentVersionTransitions: true, + noncurrentVersionTransitions: [ + { noncurrentDays: 30, storageClass: 'STANDARD_IA' }, + { noncurrentDays: 60, storageClass: 'GLACIER_IR' }, + ], + }); + expect(result.success).toBe(true); + }); + }); + + describe('expiration must be greater than max transition days', () => { + it('should reject expirationDays <= max transition days', () => { + const result = schema.safeParse({ + ...baseData, + hasCurrentVersionTransitions: true, + transitions: [ + { days: 30, storageClass: 'STANDARD_IA' }, + { days: 60, storageClass: 'GLACIER_IR' }, + ], + hasCurrentVersionExpiration: true, + expirationDays: 60, + }); + expect(result.success).toBe(false); + if (!result.success) { + const error = result.error.issues.find((i) => + i.path.includes('expirationDays'), + ); + expect(error?.message).toBe('formExpirationAfterTransitionsError'); + } + }); + + it('should accept expirationDays > max transition days', () => { + const result = schema.safeParse({ + ...baseData, + hasCurrentVersionTransitions: true, + transitions: [ + { days: 30, storageClass: 'STANDARD_IA' }, + { days: 60, storageClass: 'GLACIER_IR' }, + ], + hasCurrentVersionExpiration: true, + expirationDays: 61, + }); + expect(result.success).toBe(true); + }); + + it('should not validate when hasCurrentVersionTransitions is false', () => { + const result = schema.safeParse({ + ...baseData, + hasCurrentVersionTransitions: false, + transitions: [{ days: 90, storageClass: 'STANDARD_IA' }], + hasCurrentVersionExpiration: true, + expirationDays: 30, + }); + expect(result.success).toBe(true); + }); + + it('should not validate when hasCurrentVersionExpiration is false', () => { + const result = schema.safeParse({ + ...baseData, + hasCurrentVersionTransitions: true, + transitions: [{ days: 60, storageClass: 'STANDARD_IA' }], + hasCurrentVersionExpiration: false, + expirationDays: 30, + }); + expect(result.success).toBe(true); + }); + }); + + describe('noncurrent expiration must be greater than max noncurrent transition days', () => { + it('should reject noncurrentVersionExpirationDays <= max noncurrent transition days', () => { + const result = schema.safeParse({ + ...baseData, + hasNoncurrentVersionTransitions: true, + noncurrentVersionTransitions: [ + { noncurrentDays: 30, storageClass: 'STANDARD_IA' }, + { noncurrentDays: 60, storageClass: 'GLACIER_IR' }, + ], + hasNoncurrentVersionExpiration: true, + noncurrentVersionExpirationDays: 60, + }); + expect(result.success).toBe(false); + if (!result.success) { + const error = result.error.issues.find((i) => + i.path.includes('noncurrentVersionExpirationDays'), + ); + expect(error?.message).toBe('formExpirationAfterTransitionsError'); + } + }); + + it('should accept noncurrentVersionExpirationDays > max noncurrent transition days', () => { + const result = schema.safeParse({ + ...baseData, + hasNoncurrentVersionTransitions: true, + noncurrentVersionTransitions: [ + { noncurrentDays: 30, storageClass: 'STANDARD_IA' }, + { noncurrentDays: 60, storageClass: 'GLACIER_IR' }, + ], + hasNoncurrentVersionExpiration: true, + noncurrentVersionExpirationDays: 90, + }); + expect(result.success).toBe(true); + }); + }); + + it('should not validate gaps when hasCurrentVersionTransitions is false', () => { + const result = schema.safeParse({ + ...baseData, + hasCurrentVersionTransitions: false, + transitions: [ + { days: 30, storageClass: 'STANDARD_IA' }, + { days: 31, storageClass: 'GLACIER_IR' }, + ], + }); + expect(result.success).toBe(true); + }); + + it('should not validate gaps when hasNoncurrentVersionTransitions is false', () => { + const result = schema.safeParse({ + ...baseData, + hasNoncurrentVersionTransitions: false, + noncurrentVersionTransitions: [ + { noncurrentDays: 30, storageClass: 'STANDARD_IA' }, + { noncurrentDays: 31, storageClass: 'GLACIER_IR' }, + ], + }); + expect(result.success).toBe(true); + }); + + describe('tag key validation', () => { + it('should reject a tag with empty key but non-empty value', () => { + const result = schema.safeParse({ + ...baseData, + hasFilter: true, + tags: [{ key: '', value: 'some-value' }], + }); + expect(result.success).toBe(false); + if (!result.success) { + const error = result.error.issues.find( + (i) => i.path.includes('tags') && i.path.includes('key'), + ); + expect(error?.message).toBe('formTagKeyRequired'); + } + }); + + it('should accept a tag with both key and value', () => { + const result = schema.safeParse({ + ...baseData, + hasFilter: true, + tags: [{ key: 'env', value: 'prod' }], + }); + expect(result.success).toBe(true); + }); + + it('should accept a tag with key only (empty value)', () => { + const result = schema.safeParse({ + ...baseData, + hasFilter: true, + tags: [{ key: 'env', value: '' }], + }); + expect(result.success).toBe(true); + }); + + it('should not validate tags when hasFilter is false', () => { + const result = schema.safeParse({ + ...baseData, + hasFilter: false, + tags: [{ key: '', value: 'some-value' }], + }); + expect(result.success).toBe(true); + }); + }); + + describe('object size filter validation', () => { + it('should accept objectSizeGreaterThan alone > 0', () => { + const result = schema.safeParse({ + ...baseData, + hasFilter: true, + hasObjectSizeGreaterThan: true, + objectSizeGreaterThan: 1024, + hasObjectSizeLessThan: false, + objectSizeLessThan: 0, + }); + expect(result.success).toBe(true); + }); + + it('should accept objectSizeLessThan alone > 0', () => { + const result = schema.safeParse({ + ...baseData, + hasFilter: true, + hasObjectSizeGreaterThan: false, + objectSizeGreaterThan: 0, + hasObjectSizeLessThan: true, + objectSizeLessThan: 1048576, + }); + expect(result.success).toBe(true); + }); + + it('should reject when objectSizeGreaterThan >= objectSizeLessThan (both checked and > 0)', () => { + const result = schema.safeParse({ + ...baseData, + hasFilter: true, + hasObjectSizeGreaterThan: true, + objectSizeGreaterThan: 2048, + hasObjectSizeLessThan: true, + objectSizeLessThan: 1024, + }); + expect(result.success).toBe(false); + if (!result.success) { + const error = result.error.issues.find((i) => + i.path.includes('objectSizeGreaterThan'), + ); + expect(error?.message).toBe('formObjectSizeRangeError'); + } + }); + + it('should reject when objectSizeGreaterThan equals objectSizeLessThan (both checked and > 0)', () => { + const result = schema.safeParse({ + ...baseData, + hasFilter: true, + hasObjectSizeGreaterThan: true, + objectSizeGreaterThan: 1024, + hasObjectSizeLessThan: true, + objectSizeLessThan: 1024, + }); + expect(result.success).toBe(false); + }); + + it('should accept when objectSizeGreaterThan < objectSizeLessThan', () => { + const result = schema.safeParse({ + ...baseData, + hasFilter: true, + hasObjectSizeGreaterThan: true, + objectSizeGreaterThan: 1024, + hasObjectSizeLessThan: true, + objectSizeLessThan: 1048576, + }); + expect(result.success).toBe(true); + }); + + it('should not validate size range when checkboxes are unchecked', () => { + const result = schema.safeParse({ + ...baseData, + hasFilter: true, + hasObjectSizeGreaterThan: false, + objectSizeGreaterThan: 2048, + hasObjectSizeLessThan: false, + objectSizeLessThan: 1024, + }); + expect(result.success).toBe(true); + }); + }); +}); diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/lifecycleForm.schema.ts b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/lifecycleForm.schema.ts new file mode 100644 index 000000000000..0749ecbb41b5 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/lifecycleForm.schema.ts @@ -0,0 +1,243 @@ +import { z } from 'zod'; +import storages from '@/types/Storages'; +import { STORAGE_CLASS_TIER } from '@/hooks/useAvailableStorageClasses.hook'; +import { + MIN_TRANSITION_GAP_DAYS, + getMaxTransitionDays, +} from './lifecycleTransition.utils'; + +type TFunction = (key: string) => string; + +const validateTransitionGaps = ( + transitions: Array<{ storageClass?: storages.StorageClassEnum; days?: number }>, + pathPrefix: string, + daysKey: string, + t: TFunction, + ctx: z.RefinementCtx, +) => { + if (transitions.length <= 1) return; + + const indexed = transitions.map((tr, originalIndex) => ({ + storageClass: tr.storageClass ?? storages.StorageClassEnum.STANDARD, + days: tr.days ?? 0, + originalIndex, + })); + + const sorted = indexed.sort( + (a, b) => + STORAGE_CLASS_TIER[a.storageClass] - + STORAGE_CLASS_TIER[b.storageClass], + ); + + for (let i = 1; i < sorted.length; i += 1) { + if (sorted[i].days - sorted[i - 1].days < MIN_TRANSITION_GAP_DAYS) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: t('formTransitionMinGapError'), + path: [pathPrefix, sorted[i].originalIndex, daysKey], + }); + } + } +}; + +const validateExpirationAfterTransitions = ( + hasCurrentVersionTransitions: boolean, + hasCurrentVersionExpiration: boolean, + expirationDays: number, + transitions: Array<{ days?: number }>, + expirationPath: string, + t: TFunction, + ctx: z.RefinementCtx, +) => { + if ( + !hasCurrentVersionTransitions || + !hasCurrentVersionExpiration || + expirationDays <= 0 || + transitions.length === 0 + ) + return; + + const maxDays = getMaxTransitionDays( + transitions.map((tr) => ({ days: tr.days ?? 0 })), + ); + if (expirationDays <= maxDays) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: t('formExpirationAfterTransitionsError'), + path: [expirationPath], + }); + } +}; + +export const createLifecycleSchema = (t: TFunction) => + z + .object({ + ruleId: z + .string() + .min(1, t('formRuleIdRequired')) + .max(255, t('formRuleIdMaxLength')), + status: z.nativeEnum(storages.LifecycleRuleStatusEnum).default(storages.LifecycleRuleStatusEnum.enabled), + + hasFilter: z.boolean().default(false), + prefix: z.string().default(''), + tags: z + .array( + z.object({ + key: z.string(), + value: z.string(), + }), + ) + .default([]), + + hasCurrentVersionTransitions: z.boolean().default(false), + transitions: z + .array( + z.object({ + days: z.coerce + .number() + .int() + .min(MIN_TRANSITION_GAP_DAYS, t('formTransitionMinDaysError')), + storageClass: z.nativeEnum(storages.StorageClassEnum, { message: t('formStorageClassRequiredError') }), + }), + ) + .default([]), + + hasCurrentVersionExpiration: z.boolean().default(false), + expirationDays: z.coerce + .number() + .int() + .min(0) + .default(0), + expiredObjectDeleteMarker: z.boolean().default(false), + + hasNoncurrentVersionTransitions: z.boolean().default(false), + noncurrentVersionTransitions: z + .array( + z.object({ + noncurrentDays: z.coerce + .number() + .int() + .min(MIN_TRANSITION_GAP_DAYS, t('formTransitionMinDaysError')), + storageClass: z.nativeEnum(storages.StorageClassEnum, { message: t('formStorageClassRequiredError') }), + newerNoncurrentVersions: z.coerce + .number() + .int() + .min(0) + .default(0), + }), + ) + .default([]), + + hasNoncurrentVersionExpiration: z.boolean().default(false), + noncurrentVersionExpirationDays: z.coerce + .number() + .int() + .min(0) + .default(0), + noncurrentVersionExpirationNewerVersions: z.coerce + .number() + .int() + .min(0) + .default(0), + + hasObjectSizeGreaterThan: z.boolean().default(false), + objectSizeGreaterThan: z.coerce + .number() + .int() + .min(0) + .default(0), + hasObjectSizeLessThan: z.boolean().default(false), + objectSizeLessThan: z.coerce + .number() + .int() + .min(0) + .default(0), + + hasAbortIncompleteMultipartUpload: z.boolean().default(false), + abortDaysAfterInitiation: z.coerce + .number() + .int() + .min(0) + .default(0), + }) + .superRefine((data, ctx) => { + const hasAtLeastOneOperation = + data.hasCurrentVersionTransitions || + data.hasCurrentVersionExpiration || + data.expiredObjectDeleteMarker || + data.hasNoncurrentVersionTransitions || + data.hasNoncurrentVersionExpiration || + data.hasAbortIncompleteMultipartUpload; + + if (!hasAtLeastOneOperation) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: t('formAtLeastOneOperationError'), + path: [], + }); + } + + if ( + data.hasFilter && + data.hasObjectSizeGreaterThan && + data.hasObjectSizeLessThan && + data.objectSizeGreaterThan > 0 && + data.objectSizeLessThan > 0 && + data.objectSizeGreaterThan >= data.objectSizeLessThan + ) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: t('formObjectSizeRangeError'), + path: ['objectSizeGreaterThan'], + }); + } + + if (data.hasFilter && data.tags) { + data.tags.forEach((tag, index) => { + if (tag.key.trim() === '' && tag.value.trim() !== '') { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: t('formTagKeyRequired'), + path: ['tags', index, 'key'], + }); + } + }); + } + + if (data.hasCurrentVersionTransitions) { + validateTransitionGaps(data.transitions, 'transitions', 'days', t, ctx); + } + + if (data.hasNoncurrentVersionTransitions) { + validateTransitionGaps( + data.noncurrentVersionTransitions.map((tr) => ({ + storageClass: tr.storageClass, + days: tr.noncurrentDays, + })), + 'noncurrentVersionTransitions', + 'noncurrentDays', + t, + ctx, + ); + } + + validateExpirationAfterTransitions( + data.hasCurrentVersionTransitions, + data.hasCurrentVersionExpiration, + data.expirationDays, + data.transitions, + 'expirationDays', + t, + ctx, + ); + + validateExpirationAfterTransitions( + data.hasNoncurrentVersionTransitions, + data.hasNoncurrentVersionExpiration, + data.noncurrentVersionExpirationDays, + data.noncurrentVersionTransitions.map((tr) => ({ days: tr.noncurrentDays })), + 'noncurrentVersionExpirationDays', + t, + ctx, + ); + }); diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/lifecycleTransition.utils.spec.ts b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/lifecycleTransition.utils.spec.ts new file mode 100644 index 000000000000..f1645fab01df --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/lifecycleTransition.utils.spec.ts @@ -0,0 +1,212 @@ +import { describe, it, expect } from 'vitest'; +import storages from '@/types/Storages'; +import { + getDisabledStorageClasses, + getRemainingStorageClasses, + canAddTransition, + getMaxTransitionDays, + getNextTransitionDays, +} from './lifecycleTransition.utils'; + +const { StorageClassEnum } = storages; + +const AVAILABLE_CLASSES = [ + StorageClassEnum.STANDARD_IA, + StorageClassEnum.GLACIER_IR, + StorageClassEnum.DEEP_ARCHIVE, +]; + +describe('getDisabledStorageClasses', () => { + it('should disable classes already used by other transitions', () => { + const transitions = [ + { storageClass: StorageClassEnum.STANDARD_IA }, + { storageClass: StorageClassEnum.GLACIER_IR }, + ]; + const disabled = getDisabledStorageClasses( + AVAILABLE_CLASSES, + transitions, + 0, + ); + expect(disabled.has(StorageClassEnum.GLACIER_IR)).toBe(true); + }); + + it('should disable classes with a tier lower than or equal to the max previous tier', () => { + const transitions = [ + { storageClass: StorageClassEnum.GLACIER_IR }, + { storageClass: undefined }, + ]; + const disabled = getDisabledStorageClasses( + AVAILABLE_CLASSES, + transitions, + 1, + ); + expect(disabled.has(StorageClassEnum.STANDARD_IA)).toBe(true); + expect(disabled.has(StorageClassEnum.GLACIER_IR)).toBe(true); + expect(disabled.has(StorageClassEnum.DEEP_ARCHIVE)).toBe(false); + }); + + it('should return empty set for single transition at index 0', () => { + const transitions: { storageClass?: storages.StorageClassEnum }[] = [ + { storageClass: undefined }, + ]; + const disabled = getDisabledStorageClasses( + AVAILABLE_CLASSES, + transitions, + 0, + ); + expect(disabled.size).toBe(0); + }); + + it('should combine both used-by-others and tier-based disabling', () => { + const transitions = [ + { storageClass: StorageClassEnum.STANDARD_IA }, + { storageClass: undefined }, + { storageClass: StorageClassEnum.DEEP_ARCHIVE }, + ]; + const disabled = getDisabledStorageClasses( + AVAILABLE_CLASSES, + transitions, + 1, + ); + expect(disabled.has(StorageClassEnum.STANDARD_IA)).toBe(true); + expect(disabled.has(StorageClassEnum.DEEP_ARCHIVE)).toBe(true); + expect(disabled.has(StorageClassEnum.GLACIER_IR)).toBe(false); + }); + + it('should only consider classes in availableStorageClasses', () => { + const limitedClasses = [ + StorageClassEnum.STANDARD_IA, + StorageClassEnum.DEEP_ARCHIVE, + ]; + const transitions: { storageClass?: storages.StorageClassEnum }[] = [ + { storageClass: undefined }, + ]; + const disabled = getDisabledStorageClasses(limitedClasses, transitions, 0); + expect(disabled.size).toBe(0); + }); +}); + +describe('getRemainingStorageClasses', () => { + it('should return all classes when no transitions exist', () => { + const remaining = getRemainingStorageClasses(AVAILABLE_CLASSES, []); + expect(remaining).toEqual([ + StorageClassEnum.STANDARD_IA, + StorageClassEnum.GLACIER_IR, + StorageClassEnum.DEEP_ARCHIVE, + ]); + }); + + it('should exclude used classes and lower-tier classes', () => { + const transitions = [{ storageClass: StorageClassEnum.STANDARD_IA }]; + const remaining = getRemainingStorageClasses( + AVAILABLE_CLASSES, + transitions, + ); + expect(remaining).toEqual([ + StorageClassEnum.GLACIER_IR, + StorageClassEnum.DEEP_ARCHIVE, + ]); + }); + + it('should return only higher-tier classes after GLACIER_IR', () => { + const transitions = [ + { storageClass: StorageClassEnum.STANDARD_IA }, + { storageClass: StorageClassEnum.GLACIER_IR }, + ]; + const remaining = getRemainingStorageClasses( + AVAILABLE_CLASSES, + transitions, + ); + expect(remaining).toEqual([StorageClassEnum.DEEP_ARCHIVE]); + }); + + it('should return empty when all classes are used', () => { + const transitions = [ + { storageClass: StorageClassEnum.STANDARD_IA }, + { storageClass: StorageClassEnum.GLACIER_IR }, + { storageClass: StorageClassEnum.DEEP_ARCHIVE }, + ]; + const remaining = getRemainingStorageClasses( + AVAILABLE_CLASSES, + transitions, + ); + expect(remaining).toEqual([]); + }); + + it('should ignore undefined storageClass values', () => { + const transitions: { storageClass?: storages.StorageClassEnum }[] = [ + { storageClass: undefined }, + ]; + const remaining = getRemainingStorageClasses( + AVAILABLE_CLASSES, + transitions, + ); + expect(remaining).toEqual([ + StorageClassEnum.STANDARD_IA, + StorageClassEnum.GLACIER_IR, + StorageClassEnum.DEEP_ARCHIVE, + ]); + }); + + it('should only return classes present in availableStorageClasses', () => { + const limitedClasses = [StorageClassEnum.STANDARD_IA]; + const remaining = getRemainingStorageClasses(limitedClasses, []); + expect(remaining).toEqual([StorageClassEnum.STANDARD_IA]); + }); +}); + +describe('canAddTransition', () => { + it('should return true when there are remaining classes', () => { + expect(canAddTransition(AVAILABLE_CLASSES, [])).toBe(true); + expect( + canAddTransition(AVAILABLE_CLASSES, [ + { storageClass: StorageClassEnum.STANDARD_IA }, + ]), + ).toBe(true); + }); + + it('should return false when all classes are used', () => { + const transitions = [ + { storageClass: StorageClassEnum.STANDARD_IA }, + { storageClass: StorageClassEnum.GLACIER_IR }, + { storageClass: StorageClassEnum.DEEP_ARCHIVE }, + ]; + expect(canAddTransition(AVAILABLE_CLASSES, transitions)).toBe(false); + }); + + it('should return false when available classes is empty', () => { + expect(canAddTransition([], [])).toBe(false); + }); +}); + +describe('getMaxTransitionDays', () => { + it('should return 0 when no transitions exist', () => { + expect(getMaxTransitionDays([])).toBe(0); + }); + + it('should return the max days value', () => { + const transitions = [{ days: 30 }, { days: 90 }, { days: 60 }]; + expect(getMaxTransitionDays(transitions)).toBe(90); + }); + + it('should handle undefined days as 0', () => { + const transitions = [{ days: 60 }, { days: undefined }]; + expect(getMaxTransitionDays(transitions)).toBe(60); + }); +}); + +describe('getNextTransitionDays', () => { + it('should return MIN_TRANSITION_GAP_DAYS when no transitions exist', () => { + expect(getNextTransitionDays([])).toBe(30); + }); + + it('should return last transition days + 30', () => { + const transitions = [{ days: 30 }]; + expect(getNextTransitionDays(transitions)).toBe(60); + }); + + it('should use the last transition in the array', () => { + const transitions = [{ days: 30 }, { days: 60 }]; + expect(getNextTransitionDays(transitions)).toBe(90); + }); +}); diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/lifecycleTransition.utils.ts b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/lifecycleTransition.utils.ts new file mode 100644 index 000000000000..c4a26161b003 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/lifecycleTransition.utils.ts @@ -0,0 +1,70 @@ +import storages from '@/types/Storages'; +import { STORAGE_CLASS_TIER } from '@/hooks/useAvailableStorageClasses.hook'; + +export const MIN_TRANSITION_GAP_DAYS = 30; + +interface TransitionLike { + storageClass?: storages.StorageClassEnum; +} + +const getTier = (sc?: storages.StorageClassEnum): number => + sc ? STORAGE_CLASS_TIER[sc] : -1; + +export const getDisabledStorageClasses = ( + availableStorageClasses: storages.StorageClassEnum[], + transitions: TransitionLike[], + currentIndex: number, +): Set => { + const usedByOthers = new Set( + transitions + .filter((_, i) => i !== currentIndex) + .map((t) => t.storageClass) + .filter(Boolean), + ); + + const maxPreviousTier = transitions + .slice(0, currentIndex) + .reduce((max, t) => Math.max(max, getTier(t.storageClass)), -1); + + return new Set( + availableStorageClasses.filter( + (sc) => usedByOthers.has(sc) || STORAGE_CLASS_TIER[sc] <= maxPreviousTier, + ), + ); +}; + +export const getRemainingStorageClasses = ( + availableStorageClasses: storages.StorageClassEnum[], + transitions: TransitionLike[], +): storages.StorageClassEnum[] => { + const usedStorageClasses = new Set( + transitions.map((t) => t.storageClass).filter(Boolean), + ); + const maxUsedTier = transitions.reduce( + (max, t) => Math.max(max, getTier(t.storageClass)), + -1, + ); + + return availableStorageClasses.filter( + (sc) => !usedStorageClasses.has(sc) && STORAGE_CLASS_TIER[sc] > maxUsedTier, + ); +}; + +export const canAddTransition = ( + availableStorageClasses: storages.StorageClassEnum[], + transitions: TransitionLike[], +): boolean => + getRemainingStorageClasses(availableStorageClasses, transitions).length > 0; + +export const getMaxTransitionDays = ( + transitions: { days?: number }[], +): number => transitions.reduce((max, t) => Math.max(max, t.days ?? 0), 0); + +export const getNextTransitionDays = ( + transitions: { days?: number }[], +): number => { + const lastTransition = transitions[transitions.length - 1]; + return lastTransition + ? (lastTransition.days ?? 0) + MIN_TRANSITION_GAP_DAYS + : MIN_TRANSITION_GAP_DAYS; +}; diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/useLifecycleAvailableStorageClasses.hook.ts b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/useLifecycleAvailableStorageClasses.hook.ts new file mode 100644 index 000000000000..553c12053be9 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/useLifecycleAvailableStorageClasses.hook.ts @@ -0,0 +1,15 @@ +import storages from '@/types/Storages'; +import { useAvailableStorageClasses } from '@/hooks/useAvailableStorageClasses.hook'; + +export function useLifecycleAvailableStorageClasses(region: string) { + const { availableStorageClasses, isPending } = useAvailableStorageClasses( + region, + ); + + return { + availableStorageClasses: availableStorageClasses.filter( + (sc) => sc !== storages.StorageClassEnum.HIGH_PERF, + ), + isPending, + }; +} diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/useLifecycleForm.hook.ts b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/useLifecycleForm.hook.ts new file mode 100644 index 000000000000..5dbfe615cdc2 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/form/useLifecycleForm.hook.ts @@ -0,0 +1,146 @@ +import { z } from 'zod'; +import { useTranslation } from 'react-i18next'; +import { useMemo } from 'react'; +import { useForm } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { Tag } from '@/types/Tag'; +import { createLifecycleSchema } from './lifecycleForm.schema'; +import storages from '@/types/Storages'; + +type InferSchema = T extends z.ZodTypeAny ? z.infer : never; + +type BuildLifecycleFormValues = Omit< + InferSchema, + 'tags' +> & { + tags: Tag[]; +}; + +type LifecycleSchemaValues = z.infer>; + +interface UseLifecycleFormParams { + existingRule?: storages.LifecycleRule; +} + +export const useLifecycleForm = ({ existingRule }: UseLifecycleFormParams) => { + const { t } = useTranslation('pci-object-storage/storages/s3/lifecycle'); + + const schema = createLifecycleSchema(t); + + const emptyTags: Tag[] = []; + const emptyTransitions: LifecycleSchemaValues['transitions'] = []; + const emptyNoncurrentTransitions: LifecycleSchemaValues['noncurrentVersionTransitions'] = []; + + const defaultValues = useMemo(() => { + const base = { + ruleId: '', + status: storages.LifecycleRuleStatusEnum.enabled, + hasFilter: false, + prefix: '', + tags: emptyTags, + hasCurrentVersionTransitions: false, + transitions: emptyTransitions, + hasCurrentVersionExpiration: false, + expirationDays: 0, + expiredObjectDeleteMarker: false, + hasNoncurrentVersionTransitions: false, + noncurrentVersionTransitions: emptyNoncurrentTransitions, + hasNoncurrentVersionExpiration: false, + noncurrentVersionExpirationDays: 0, + noncurrentVersionExpirationNewerVersions: 0, + hasObjectSizeGreaterThan: false, + objectSizeGreaterThan: 0, + hasObjectSizeLessThan: false, + objectSizeLessThan: 0, + hasAbortIncompleteMultipartUpload: false, + abortDaysAfterInitiation: 0, + }; + + if (!existingRule) { + return base; + } + + const hasCurrentVersionTransitions = Boolean( + existingRule.transitions?.length, + ); + const hasCurrentVersionExpiration = Boolean( + existingRule.expiration?.days, + ); + const hasNoncurrentVersionTransitions = Boolean( + existingRule.noncurrentVersionTransitions?.length, + ); + const hasNoncurrentVersionExpiration = Boolean( + existingRule.noncurrentVersionExpiration?.noncurrentDays, + ); + const hasAbort = Boolean( + existingRule.abortIncompleteMultipartUpload?.daysAfterInitiation, + ); + const hasFilter = Boolean( + existingRule.filter?.prefix || + (existingRule.filter?.tags && + Object.keys(existingRule.filter.tags).length > 0) || + existingRule.filter?.objectSizeGreaterThan || + existingRule.filter?.objectSizeLessThan, + ); + + return { + ...base, + ruleId: existingRule.id, + status: existingRule.status, + hasFilter, + prefix: existingRule.filter?.prefix ?? '', + tags: Object.entries( + existingRule.filter?.tags ?? {}, + ).map(([key, value]) => ({ key, value })), + hasObjectSizeGreaterThan: Boolean( + existingRule.filter?.objectSizeGreaterThan, + ), + objectSizeGreaterThan: + existingRule.filter?.objectSizeGreaterThan ?? 0, + hasObjectSizeLessThan: Boolean( + existingRule.filter?.objectSizeLessThan, + ), + objectSizeLessThan: existingRule.filter?.objectSizeLessThan ?? 0, + hasCurrentVersionTransitions, + transitions: (existingRule.transitions ?? []).map((tr) => ({ + days: tr.days ?? 0, + storageClass: + storages.StorageClassEnum[ + tr.storageClass as keyof typeof storages.StorageClassEnum + ], + })), + hasCurrentVersionExpiration, + expirationDays: existingRule.expiration?.days ?? 0, + expiredObjectDeleteMarker: + existingRule.expiration?.expiredObjectDeleteMarker ?? false, + hasNoncurrentVersionTransitions, + noncurrentVersionTransitions: ( + existingRule.noncurrentVersionTransitions ?? [] + ).map((tr) => ({ + noncurrentDays: tr.noncurrentDays ?? 0, + storageClass: tr.storageClass, + newerNoncurrentVersions: tr.newerNoncurrentVersions ?? 0, + })), + hasNoncurrentVersionExpiration, + noncurrentVersionExpirationDays: + existingRule.noncurrentVersionExpiration?.noncurrentDays ?? 0, + noncurrentVersionExpirationNewerVersions: + existingRule.noncurrentVersionExpiration?.newerNoncurrentVersions ?? 0, + hasAbortIncompleteMultipartUpload: hasAbort, + abortDaysAfterInitiation: + existingRule.abortIncompleteMultipartUpload?.daysAfterInitiation ?? 0, + }; + }, [existingRule]); + + const form = useForm>({ + resolver: zodResolver(schema), + mode: 'onChange', + defaultValues, + }); + + return { schema, form }; +}; + +export type LifecycleFormValues = BuildLifecycleFormValues< + ReturnType['schema'] +>; diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/table/LifecycleListColumns.component.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/table/LifecycleListColumns.component.tsx index 95eb35baddfa..e0b61e086af7 100644 --- a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/table/LifecycleListColumns.component.tsx +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/_components/table/LifecycleListColumns.component.tsx @@ -59,13 +59,19 @@ export function getColumns({ ), cell: ({ row }) => ( - {row.original.id} + {row.original.id} ), }, { id: 'scope', + accessorFn: (row) => { + const prefix = row.filter?.prefix; + const tags = row.filter?.tags; + const tagsCount = tags ? Object.keys(tags).length : 0; + return Boolean(prefix || tagsCount); + }, header: ({ column }) => ( {t('columnScope')} @@ -84,6 +90,7 @@ export function getColumns({ }, { id: 'currentVersionOperations', + accessorFn: (row) => getCurrentVersionOperationsCount(row), header: ({ column }) => ( @@ -102,6 +109,7 @@ export function getColumns({ }, { id: 'noncurrentVersionOperations', + accessorFn: (row) => getNoncurrentVersionOperationsCount(row), header: ({ column }) => ( @@ -123,6 +131,7 @@ export function getColumns({ }, { id: 'deleteMarker', + accessorFn: (row) => Boolean(row.expiration?.expiredObjectDeleteMarker), header: ({ column }) => ( @@ -143,6 +152,8 @@ export function getColumns({ }, { id: 'abortMultipart', + accessorFn: (row) => + Boolean(row.abortIncompleteMultipartUpload?.daysAfterInitiation), header: ({ column }) => ( diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/create/Create.page.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/create/Create.page.tsx new file mode 100644 index 000000000000..02dba1c85b18 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/create/Create.page.tsx @@ -0,0 +1,100 @@ +import { useNavigate, useParams } from 'react-router-dom'; +import { useTranslation } from 'react-i18next'; +import { ArrowLeft } from 'lucide-react'; +import { Button, useToast } from '@datatr-ux/uxlib'; +import { useS3Data } from '../../S3.context'; +import { useAddLifecycle } from '@/data/hooks/lifecycle/useAddLifecycle.hook'; +import { getObjectStoreApiErrorMessage } from '@/lib/apiHelper'; +import { LifecycleForm } from '../_components/form/LifecycleForm.component'; +import { buildLifecycleRule } from '../_components/form/buildLifecycleRule'; +import { useLifecycleForm } from '../_components/form/useLifecycleForm.hook'; +import { PayloadPreview } from '../_components/form/PayloadPreview.component'; +import BreadcrumbItem from '@/components/breadcrumb/BreadcrumbItem.component'; +import LinkComponent from '@/components/links/Link.component'; +import { useLifecycleAvailableStorageClasses } from '../_components/form/useLifecycleAvailableStorageClasses.hook'; + +export function breadcrumb() { + return ( + + ); +} + +const CreateLifecycle = () => { + const { t } = useTranslation('pci-object-storage/storages/s3/lifecycle'); + const { s3 } = useS3Data(); + const toast = useToast(); + const navigate = useNavigate(); + const { form } = useLifecycleForm({}); + const { projectId } = useParams(); + const { availableStorageClasses } = useLifecycleAvailableStorageClasses( + s3?.region ?? '', + ); + + const { addLifecycle, isPending } = useAddLifecycle({ + onError: (err) => { + toast.toast({ + title: t('formAddToastErrorTitle'), + variant: 'critical', + description: getObjectStoreApiErrorMessage(err), + }); + }, + onSuccess: () => { + toast.toast({ + title: t('formAddToastSuccessTitle'), + description: t('formAddToastSuccessDescription'), + }); + navigate('../'); + }, + }); + + const onSubmit = form.handleSubmit((formValues) => { + const lifecycleRule = buildLifecycleRule(formValues); + if (!lifecycleRule || !s3?.region || !s3?.name) return; + + addLifecycle({ + projectId, + region: s3.region, + name: s3.name, + lifecycleRule, + }); + }); + + return ( + <> + + + {t('formBackLink')} + + +
+ + +
+ + + ); +}; + +export default CreateLifecycle; diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/delete/Delete.modal.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/delete/Delete.modal.tsx new file mode 100644 index 000000000000..38c8a0971c9b --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/delete/Delete.modal.tsx @@ -0,0 +1,113 @@ +import { useNavigate, useParams } from 'react-router-dom'; +import { useTranslation, Trans } from 'react-i18next'; +import { + Button, + DialogBody, + DialogClose, + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, + useToast, +} from '@datatr-ux/uxlib'; +import RouteModal from '@/components/route-modal/RouteModal'; +import { getObjectStoreApiErrorMessage } from '@/lib/apiHelper'; +import { useDeleteLifecycle } from '@/data/hooks/lifecycle/useDeleteLifecycle.hook'; +import { useGetS3Lifecycle } from '@/data/hooks/s3-storage/useGetS3Lifecycle.hook'; +import { useS3Data } from '../../S3.context'; + +const DeleteLifecycle = () => { + const { t } = useTranslation( + 'pci-object-storage/storages/s3/lifecycle/delete', + ); + const { s3 } = useS3Data(); + const toast = useToast(); + const navigate = useNavigate(); + const { projectId, ruleId } = useParams(); + + const decodedRuleId = ruleId ? decodeURIComponent(ruleId) : ''; + + const lifecycleQuery = useGetS3Lifecycle({ + projectId, + region: s3?.region, + name: s3?.name, + }); + + const existingRule = lifecycleQuery.data?.rules?.find( + (rule) => rule.id === decodedRuleId, + ); + + const { deleteLifecycle, isPending } = useDeleteLifecycle({ + onError: (err) => { + toast.toast({ + title: t('deleteLifecycleToastErrorTitle'), + variant: 'critical', + description: t('deleteLifecycleToastErrorMessage', { + message: getObjectStoreApiErrorMessage(err), + }), + }); + navigate('../'); + }, + onSuccess: () => { + toast.toast({ + title: t('deleteLifecycleToastSuccessTitle'), + description: t('deleteLifecycleToastSuccessMessage'), + }); + navigate('../'); + }, + }); + + const handleConfirm = () => { + if (!projectId || !s3?.region || !s3?.name || !decodedRuleId) return; + + deleteLifecycle({ + projectId, + region: s3.region, + name: s3.name, + ruleId: decodedRuleId, + }); + }; + + if (!existingRule && !lifecycleQuery.isLoading) navigate('./'); + + return ( + + + + + {t('deleteLifecycleTitle')} + + + +

+ , + }} + /> +

+
+ + + + + + +
+
+ ); +}; + +export default DeleteLifecycle; diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/edit/Edit.page.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/edit/Edit.page.tsx new file mode 100644 index 000000000000..900293be0132 --- /dev/null +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/lifecycle/edit/Edit.page.tsx @@ -0,0 +1,125 @@ +import { useNavigate, useParams } from 'react-router-dom'; +import { useTranslation } from 'react-i18next'; +import { ArrowLeft } from 'lucide-react'; +import { Button, Skeleton, useToast } from '@datatr-ux/uxlib'; +import { useS3Data } from '../../S3.context'; +import { useUpdateLifecycle } from '@/data/hooks/lifecycle/useUpdateLifecycle.hook'; +import { useGetS3Lifecycle } from '@/data/hooks/s3-storage/useGetS3Lifecycle.hook'; +import { getObjectStoreApiErrorMessage } from '@/lib/apiHelper'; +import { LifecycleForm } from '../_components/form/LifecycleForm.component'; +import { buildLifecycleRule } from '../_components/form/buildLifecycleRule'; +import { useLifecycleForm } from '../_components/form/useLifecycleForm.hook'; +import { PayloadPreview } from '../_components/form/PayloadPreview.component'; +import BreadcrumbItem from '@/components/breadcrumb/BreadcrumbItem.component'; +import LinkComponent from '@/components/links/Link.component'; +import { useLifecycleAvailableStorageClasses } from '../_components/form/useLifecycleAvailableStorageClasses.hook'; + +export function breadcrumb() { + return ( + + ); +} + +const EditLifecycleContent = ({ + existingRule, +}: { + existingRule: Parameters[0]['existingRule']; +}) => { + const { t } = useTranslation('pci-object-storage/storages/s3/lifecycle'); + const { s3 } = useS3Data(); + const toast = useToast(); + const navigate = useNavigate(); + const { projectId } = useParams(); + const { availableStorageClasses } = useLifecycleAvailableStorageClasses( + s3?.region ?? '', + ); + + const { form } = useLifecycleForm({ existingRule }); + + const { updateLifecycle, isPending } = useUpdateLifecycle({ + onError: (err) => { + toast.toast({ + title: t('formEditToastErrorTitle'), + variant: 'critical', + description: getObjectStoreApiErrorMessage(err), + }); + }, + onSuccess: () => { + toast.toast({ + title: t('formEditToastSuccessTitle'), + description: t('formEditToastSuccessDescription'), + }); + navigate('../'); + }, + }); + + const onSubmit = form.handleSubmit((formValues) => { + const lifecycleRule = buildLifecycleRule(formValues); + if (!lifecycleRule || !s3?.region || !s3?.name) return; + + updateLifecycle({ + projectId, + region: s3.region, + name: s3.name, + lifecycleRule, + }); + }); + + return ( + <> + + + {t('formBackLink')} + + +
+ + +
+ + + ); +}; + +const EditLifecycle = () => { + const { projectId, region, s3Name, ruleId } = useParams(); + + const lifecycleQuery = useGetS3Lifecycle({ + projectId, + region, + name: s3Name, + }); + + if (lifecycleQuery.isLoading) { + return ; + } + + const existingRule = lifecycleQuery.data?.rules?.find((r) => r.id === ruleId); + + return ; +}; + +export default EditLifecycle; diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/replication/_components/form/ReplicationRuleScope.component.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/replication/_components/form/ReplicationRuleScope.component.tsx index c685480338f3..452506b6bcc0 100644 --- a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/replication/_components/form/ReplicationRuleScope.component.tsx +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/replication/_components/form/ReplicationRuleScope.component.tsx @@ -11,7 +11,7 @@ import { } from '@datatr-ux/uxlib'; import { Info } from 'lucide-react'; import { FormField } from '@/components/form-field/FormField.component'; -import { TagInput } from './TagInput.component'; +import { TagInput } from '@/components/tag-input/TagInput.component'; import { ReplicationRuleContainer } from './ReplicatationRuleContainer'; import { useReplicationFormContext } from './ReplicationForm.context'; @@ -91,6 +91,7 @@ export const ReplicationRuleScope = () => { setTags={(tags) => field.onChange(tags)} isPending={isPending} disabled={isTagsDisabled} + t={t} /> {isTagsDisabled && ( diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/replication/_components/form/TagInput.component.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/replication/_components/form/TagInput.component.tsx deleted file mode 100644 index 05594f451955..000000000000 --- a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/replication/_components/form/TagInput.component.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import { useTranslation } from 'react-i18next'; -import { Plus, X } from 'lucide-react'; -import { Button, Input } from '@datatr-ux/uxlib'; -import { Tag } from '@/types/Tag'; - -type TagInputProps = { - tags: Tag[]; - setTags: (tags: Tag[]) => void; - isPending: boolean; - disabled?: boolean; -}; - -export const TagInput = ({ - tags, - setTags, - isPending, - disabled = false, -}: TagInputProps) => { - const { t } = useTranslation('pci-object-storage/storages/s3/replication'); - - const removeTag = (index: number) => { - setTags(tags.filter((_, i) => i !== index)); - }; - - const updateTag = ( - index: number, - field: 'key' | 'value', - newValue: string, - ) => { - setTags( - tags.map((tag, i) => (i === index ? { ...tag, [field]: newValue } : tag)), - ); - }; - - const addNewTag = () => { - setTags([...tags, { key: '', value: '' }]); - }; - - const isDisabled = isPending || disabled; - return ( -
-
-

{t('tagsLabel')}

-

- {t('tagsDescription')} -

-
- -
- {tags.map((tag, index) => ( -
-
- updateTag(index, 'key', e.target.value)} - disabled={isDisabled} - /> -
-
- updateTag(index, 'value', e.target.value)} - disabled={isDisabled} - /> -
- -
- ))} -
- - -
- ); -}; diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/replication/storage-job/StorageJob.modal.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/replication/storage-job/StorageJob.modal.tsx index 3006bcc4e629..d20ffd0342fa 100644 --- a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/replication/storage-job/StorageJob.modal.tsx +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/s3Id/replication/storage-job/StorageJob.modal.tsx @@ -63,7 +63,7 @@ const StorageJobModal = () => { return ( - + {t('storageJobTitle')} diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/swiftId/_components/SwiftTabs.component.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/swiftId/_components/SwiftTabs.component.tsx index 969a1fe0b8cf..57d81867adf8 100644 --- a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/swiftId/_components/SwiftTabs.component.tsx +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/swiftId/_components/SwiftTabs.component.tsx @@ -1,6 +1,5 @@ import { useTranslation } from 'react-i18next'; import TabsMenu from '@/components/tabs-menu/TabsMenu.component'; -import storages from '@/types/Storages'; const SwiftTabs = () => { const { t } = useTranslation('pci-object-storage/storages/header-tabs'); diff --git a/packages/manager/apps/pci-object-storage/src/routes/routes.tsx b/packages/manager/apps/pci-object-storage/src/routes/routes.tsx index a8e64dff044e..e738e38b29c1 100644 --- a/packages/manager/apps/pci-object-storage/src/routes/routes.tsx +++ b/packages/manager/apps/pci-object-storage/src/routes/routes.tsx @@ -488,8 +488,35 @@ export default [ { index: true, }, + { + path: 'delete/:ruleId', + id: 'lifecycle.delete', + ...lazyLoadRoute(() => + import( + '@/pages/object-storage/storage/s3Id/lifecycle/delete/Delete.modal' + ), + ), + }, ], }, + { + path: 'new', + id: 'lifecycle.create', + ...lazyLoadRoute(() => + import( + '@/pages/object-storage/storage/s3Id/lifecycle/create/Create.page' + ), + ), + }, + { + path: 'edit/:ruleId', + id: 'lifecycle.edit', + ...lazyLoadRoute(() => + import( + '@/pages/object-storage/storage/s3Id/lifecycle/edit/Edit.page' + ), + ), + }, ], }, ], From a3f1df8a47124399283116476d37444b68cf240f Mon Sep 17 00:00:00 2001 From: ovh-cds Date: Wed, 4 Mar 2026 11:15:08 +0000 Subject: [PATCH 009/112] release(*): tennessine-samurai-13 Signed-off-by: ovh-cds --- .sonarcloud.properties | 2 +- packages/manager/apps/pci-object-storage/CHANGELOG.md | 11 +++++++++++ packages/manager/apps/pci-object-storage/package.json | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/.sonarcloud.properties b/.sonarcloud.properties index f4b5347c537d..f20b58f90657 100644 --- a/.sonarcloud.properties +++ b/.sonarcloud.properties @@ -7,7 +7,7 @@ sonar.projectName=manager sonar.sources=. sonar.sourceEncoding=UTF-8 sonar.ws.timeout=60 -sonar.projectVersion=tennessine-samurai-12 +sonar.projectVersion=tennessine-samurai-13 sonar.exclusions=node_modules/**, **/node_modules/**, **/dist/**, **/semantic/**, **/coverage/**, **/static/**, **/mock/**, **/mockServiceWorker.js sonar.coverage.exclusions=**/*.spec.js diff --git a/packages/manager/apps/pci-object-storage/CHANGELOG.md b/packages/manager/apps/pci-object-storage/CHANGELOG.md index adf09050c2de..71eb352532d9 100644 --- a/packages/manager/apps/pci-object-storage/CHANGELOG.md +++ b/packages/manager/apps/pci-object-storage/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [0.36.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-object-storage-app@0.35.1...@ovh-ux/manager-pci-object-storage-app@0.36.0) (2026-03-04) + + +### Features + +* **object-storage:** create lifecycle rule ([#22248](https://github.com/ovh/manager/issues/22248)) ([fe97e79](https://github.com/ovh/manager/commit/fe97e7967b11f5c2f833cbe19fd5c59b83e37202)), closes [#DATATR-2756](https://github.com/ovh/manager/issues/DATATR-2756) + + + + + ## [0.35.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-object-storage-app@0.35.0...@ovh-ux/manager-pci-object-storage-app@0.35.1) (2026-02-26) diff --git a/packages/manager/apps/pci-object-storage/package.json b/packages/manager/apps/pci-object-storage/package.json index 1b0555a51014..03705b310c42 100644 --- a/packages/manager/apps/pci-object-storage/package.json +++ b/packages/manager/apps/pci-object-storage/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-object-storage-app", - "version": "0.35.1", + "version": "0.36.0", "private": true, "description": "pci-object-storage", "repository": { From d81f245b6186d67a200ef073de9745334bd4fbd0 Mon Sep 17 00:00:00 2001 From: Maxime Bajeux Date: Thu, 12 Feb 2026 17:18:40 +0100 Subject: [PATCH 010/112] feat(*): fix ovh at internet behavior ref: #MANAGER-20904 Signed-off-by: Maxime Bajeux --- .../ovh-at-internet/src/ovh-at-internet.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/components/ovh-at-internet/src/ovh-at-internet.ts b/packages/components/ovh-at-internet/src/ovh-at-internet.ts index d6e7587212c2..6bd26a05d6e6 100644 --- a/packages/components/ovh-at-internet/src/ovh-at-internet.ts +++ b/packages/components/ovh-at-internet/src/ovh-at-internet.ts @@ -43,6 +43,16 @@ function isTrackingDebug() { return window.localStorage?.getItem('MANAGER_TRACKING_DEBUG'); } +function deleteCookieOnAllDomains(cookieName: string) { + const parts = window.location.hostname?.split('.'); + const expired = 'Expires=Thu, 01 Jan 1970 00:00:01 GMT'; + ['', ...parts.map((_, i) => ` Domain=.${parts.slice(i + 1).join('.')};`)] + .filter((d) => d !== ' Domain=.;') + .forEach((domainPart) => { + document.cookie = `${cookieName}=; Path=/;${domainPart} ${expired};`; + }); +} + export default class OvhAtInternet extends OvhAtInternetConfig { /** * Reference to ATInternet Tag object from their JS library. @@ -229,6 +239,7 @@ export default class OvhAtInternet extends OvhAtInternetConfig { window.pa.privacy.include.event('*', 'beforeConsent'); window.pa.privacy.exclude.storageKey('pa_uid', ['beforeConsent']); window.pa.privacy.setMode('beforeConsent'); + deleteCookieOnAllDomains('pa_privacy'); } } @@ -256,8 +267,9 @@ export default class OvhAtInternet extends OvhAtInternetConfig { .finally(() => { this.setEnabled(consent); if (!consent && this.shouldUsePianoAnalytics()) { - document.cookie = `_pctx=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;`; - document.cookie = `_pcid=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;`; + deleteCookieOnAllDomains('_pctx'); + deleteCookieOnAllDomains('_pcid'); + deleteCookieOnAllDomains('pa_privacy'); } }); } From 3de1c38ddbe221af27e7b1fccbdcc9b42f4adfe1 Mon Sep 17 00:00:00 2001 From: ovh-cds Date: Wed, 4 Mar 2026 14:23:19 +0000 Subject: [PATCH 011/112] release(*): francium-hamster Signed-off-by: ovh-cds --- .sonarcloud.properties | 2 +- packages/components/ng-at-internet/CHANGELOG.md | 8 ++++++++ packages/components/ng-at-internet/package.json | 4 ++-- packages/components/ng-shell-tracking/CHANGELOG.md | 8 ++++++++ packages/components/ng-shell-tracking/package.json | 4 ++-- packages/components/ovh-at-internet/CHANGELOG.md | 11 +++++++++++ packages/components/ovh-at-internet/package.json | 2 +- packages/components/ovh-shell/CHANGELOG.md | 8 ++++++++ packages/components/ovh-shell/package.json | 4 ++-- packages/manager-ui-kit/CHANGELOG.md | 8 ++++++++ packages/manager-ui-kit/package.json | 4 ++-- packages/manager-wiki/CHANGELOG.md | 8 ++++++++ packages/manager-wiki/package.json | 6 +++--- packages/manager/apps/account-creation/CHANGELOG.md | 8 ++++++++ packages/manager/apps/account-creation/package.json | 8 ++++---- packages/manager/apps/account/CHANGELOG.md | 8 ++++++++ packages/manager/apps/account/package.json | 10 +++++----- packages/manager/apps/billing/CHANGELOG.md | 8 ++++++++ packages/manager/apps/billing/package.json | 8 ++++---- .../apps/bmc-backup-agent-baremetal/CHANGELOG.md | 8 ++++++++ .../apps/bmc-backup-agent-baremetal/package.json | 6 +++--- packages/manager/apps/carbon-calculator/CHANGELOG.md | 8 ++++++++ packages/manager/apps/carbon-calculator/package.json | 8 ++++---- packages/manager/apps/catalog/CHANGELOG.md | 8 ++++++++ packages/manager/apps/catalog/package.json | 6 +++--- packages/manager/apps/cda/CHANGELOG.md | 8 ++++++++ packages/manager/apps/cda/package.json | 4 ++-- packages/manager/apps/cloud-connect/CHANGELOG.md | 8 ++++++++ packages/manager/apps/cloud-connect/package.json | 4 ++-- packages/manager/apps/cloud-shell/CHANGELOG.md | 8 ++++++++ packages/manager/apps/cloud-shell/package.json | 6 +++--- packages/manager/apps/communication/CHANGELOG.md | 8 ++++++++ packages/manager/apps/communication/package.json | 4 ++-- packages/manager/apps/container/CHANGELOG.md | 8 ++++++++ packages/manager/apps/container/package.json | 4 ++-- packages/manager/apps/dbaas-logs/CHANGELOG.md | 8 ++++++++ packages/manager/apps/dbaas-logs/package.json | 4 ++-- packages/manager/apps/dedicated-servers/CHANGELOG.md | 8 ++++++++ packages/manager/apps/dedicated-servers/package.json | 6 +++--- packages/manager/apps/dedicated/CHANGELOG.md | 8 ++++++++ packages/manager/apps/dedicated/package.json | 8 ++++---- packages/manager/apps/exchange/CHANGELOG.md | 8 ++++++++ packages/manager/apps/exchange/package.json | 4 ++-- packages/manager/apps/freefax/CHANGELOG.md | 8 ++++++++ packages/manager/apps/freefax/package.json | 4 ++-- .../manager/apps/hpc-backup-agent-iaas/CHANGELOG.md | 8 ++++++++ .../manager/apps/hpc-backup-agent-iaas/package.json | 6 +++--- .../apps/hpc-vmware-public-vcf-aas/CHANGELOG.md | 8 ++++++++ .../apps/hpc-vmware-public-vcf-aas/package.json | 4 ++-- packages/manager/apps/hpc-vmware-vsphere/CHANGELOG.md | 8 ++++++++ packages/manager/apps/hpc-vmware-vsphere/package.json | 4 ++-- packages/manager/apps/hub/CHANGELOG.md | 8 ++++++++ packages/manager/apps/hub/package.json | 4 ++-- packages/manager/apps/hycu/CHANGELOG.md | 8 ++++++++ packages/manager/apps/hycu/package.json | 4 ++-- packages/manager/apps/iam/CHANGELOG.md | 8 ++++++++ packages/manager/apps/iam/package.json | 8 ++++---- .../apps/identity-access-management/CHANGELOG.md | 8 ++++++++ .../apps/identity-access-management/package.json | 4 ++-- packages/manager/apps/iplb/CHANGELOG.md | 8 ++++++++ packages/manager/apps/iplb/package.json | 4 ++-- packages/manager/apps/ips/CHANGELOG.md | 8 ++++++++ packages/manager/apps/ips/package.json | 4 ++-- packages/manager/apps/metrics/CHANGELOG.md | 8 ++++++++ packages/manager/apps/metrics/package.json | 4 ++-- packages/manager/apps/nasha/CHANGELOG.md | 8 ++++++++ packages/manager/apps/nasha/package.json | 4 ++-- packages/manager/apps/netapp/CHANGELOG.md | 8 ++++++++ packages/manager/apps/netapp/package.json | 4 ++-- packages/manager/apps/nutanix/CHANGELOG.md | 8 ++++++++ packages/manager/apps/nutanix/package.json | 4 ++-- packages/manager/apps/observability/CHANGELOG.md | 8 ++++++++ packages/manager/apps/observability/package.json | 8 ++++---- packages/manager/apps/okms/CHANGELOG.md | 8 ++++++++ packages/manager/apps/okms/package.json | 4 ++-- packages/manager/apps/order-tracking/CHANGELOG.md | 8 ++++++++ packages/manager/apps/order-tracking/package.json | 4 ++-- packages/manager/apps/overthebox/CHANGELOG.md | 8 ++++++++ packages/manager/apps/overthebox/package.json | 4 ++-- packages/manager/apps/pci-ai-endpoints/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-ai-endpoints/package.json | 6 +++--- packages/manager/apps/pci-ai-tools/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-ai-tools/package.json | 4 ++-- packages/manager/apps/pci-billing/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-billing/package.json | 8 ++++---- packages/manager/apps/pci-block-storage/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-block-storage/package.json | 6 +++--- packages/manager/apps/pci-cold-archive/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-cold-archive/package.json | 6 +++--- packages/manager/apps/pci-contacts/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-contacts/package.json | 4 ++-- .../manager/apps/pci-databases-analytics/CHANGELOG.md | 8 ++++++++ .../manager/apps/pci-databases-analytics/package.json | 4 ++-- packages/manager/apps/pci-dataplatform/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-dataplatform/package.json | 4 ++-- packages/manager/apps/pci-file-storage/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-file-storage/package.json | 10 +++++----- packages/manager/apps/pci-gateway/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-gateway/package.json | 4 ++-- packages/manager/apps/pci-instances/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-instances/package.json | 6 +++--- packages/manager/apps/pci-kubernetes/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-kubernetes/package.json | 4 ++-- packages/manager/apps/pci-load-balancer/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-load-balancer/package.json | 6 +++--- packages/manager/apps/pci-object-storage/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-object-storage/package.json | 6 +++--- .../manager/apps/pci-private-network/CHANGELOG.md | 8 ++++++++ .../manager/apps/pci-private-network/package.json | 6 +++--- .../manager/apps/pci-private-registry/CHANGELOG.md | 8 ++++++++ .../manager/apps/pci-private-registry/package.json | 6 +++--- packages/manager/apps/pci-project/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-project/package.json | 6 +++--- packages/manager/apps/pci-public-ip/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-public-ip/package.json | 6 +++--- packages/manager/apps/pci-quota/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-quota/package.json | 6 +++--- packages/manager/apps/pci-rancher/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-rancher/package.json | 4 ++-- packages/manager/apps/pci-savings-plan/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-savings-plan/package.json | 4 ++-- packages/manager/apps/pci-ssh-keys/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-ssh-keys/package.json | 6 +++--- packages/manager/apps/pci-users/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-users/package.json | 6 +++--- packages/manager/apps/pci-volume-backup/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-volume-backup/package.json | 4 ++-- .../manager/apps/pci-volume-snapshot/CHANGELOG.md | 8 ++++++++ .../manager/apps/pci-volume-snapshot/package.json | 6 +++--- packages/manager/apps/pci-vouchers/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-vouchers/package.json | 6 +++--- packages/manager/apps/pci-workflow/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci-workflow/package.json | 6 +++--- packages/manager/apps/pci/CHANGELOG.md | 8 ++++++++ packages/manager/apps/pci/package.json | 4 ++-- packages/manager/apps/procedures/CHANGELOG.md | 8 ++++++++ packages/manager/apps/procedures/package.json | 4 ++-- packages/manager/apps/public-cloud/CHANGELOG.md | 8 ++++++++ packages/manager/apps/public-cloud/package.json | 8 ++++---- packages/manager/apps/sap-features-hub/CHANGELOG.md | 8 ++++++++ packages/manager/apps/sap-features-hub/package.json | 4 ++-- packages/manager/apps/sign-up/CHANGELOG.md | 8 ++++++++ packages/manager/apps/sign-up/package.json | 4 ++-- packages/manager/apps/sms/CHANGELOG.md | 8 ++++++++ packages/manager/apps/sms/package.json | 4 ++-- packages/manager/apps/support/CHANGELOG.md | 8 ++++++++ packages/manager/apps/support/package.json | 4 ++-- packages/manager/apps/telecom-dashboard/CHANGELOG.md | 8 ++++++++ packages/manager/apps/telecom-dashboard/package.json | 4 ++-- packages/manager/apps/telecom/CHANGELOG.md | 8 ++++++++ packages/manager/apps/telecom/package.json | 8 ++++---- packages/manager/apps/veeam-backup/CHANGELOG.md | 8 ++++++++ packages/manager/apps/veeam-backup/package.json | 4 ++-- packages/manager/apps/veeam-enterprise/CHANGELOG.md | 8 ++++++++ packages/manager/apps/veeam-enterprise/package.json | 4 ++-- packages/manager/apps/vps/CHANGELOG.md | 8 ++++++++ packages/manager/apps/vps/package.json | 4 ++-- packages/manager/apps/vrack-services/CHANGELOG.md | 8 ++++++++ packages/manager/apps/vrack-services/package.json | 4 ++-- packages/manager/apps/vrack/CHANGELOG.md | 8 ++++++++ packages/manager/apps/vrack/package.json | 4 ++-- packages/manager/apps/web-domains/CHANGELOG.md | 8 ++++++++ packages/manager/apps/web-domains/package.json | 6 +++--- packages/manager/apps/web-hosting/CHANGELOG.md | 8 ++++++++ packages/manager/apps/web-hosting/package.json | 6 +++--- packages/manager/apps/web-office/CHANGELOG.md | 8 ++++++++ packages/manager/apps/web-office/package.json | 8 ++++---- .../manager/apps/web-ongoing-operations/CHANGELOG.md | 8 ++++++++ .../manager/apps/web-ongoing-operations/package.json | 4 ++-- packages/manager/apps/web/CHANGELOG.md | 8 ++++++++ packages/manager/apps/web/package.json | 8 ++++---- packages/manager/apps/zimbra/CHANGELOG.md | 8 ++++++++ packages/manager/apps/zimbra/package.json | 6 +++--- packages/manager/core/application/CHANGELOG.md | 8 ++++++++ packages/manager/core/application/package.json | 8 ++++---- packages/manager/core/shell-client/CHANGELOG.md | 8 ++++++++ packages/manager/core/shell-client/package.json | 6 +++--- packages/manager/modules/account/CHANGELOG.md | 8 ++++++++ packages/manager/modules/account/package.json | 8 ++++---- packages/manager/modules/gcj/CHANGELOG.md | 8 ++++++++ packages/manager/modules/gcj/package.json | 4 ++-- .../manager/modules/logs-to-customer/CHANGELOG.md | 8 ++++++++ .../manager/modules/logs-to-customer/package.json | 4 ++-- 183 files changed, 971 insertions(+), 240 deletions(-) diff --git a/.sonarcloud.properties b/.sonarcloud.properties index f20b58f90657..4754ee7baa4d 100644 --- a/.sonarcloud.properties +++ b/.sonarcloud.properties @@ -7,7 +7,7 @@ sonar.projectName=manager sonar.sources=. sonar.sourceEncoding=UTF-8 sonar.ws.timeout=60 -sonar.projectVersion=tennessine-samurai-13 +sonar.projectVersion=francium-hamster sonar.exclusions=node_modules/**, **/node_modules/**, **/dist/**, **/semantic/**, **/coverage/**, **/static/**, **/mock/**, **/mockServiceWorker.js sonar.coverage.exclusions=**/*.spec.js diff --git a/packages/components/ng-at-internet/CHANGELOG.md b/packages/components/ng-at-internet/CHANGELOG.md index e1558c17180a..f77380c896cc 100644 --- a/packages/components/ng-at-internet/CHANGELOG.md +++ b/packages/components/ng-at-internet/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [6.0.46](https://github.com/ovh/manager/compare/@ovh-ux/ng-at-internet@6.0.45...@ovh-ux/ng-at-internet@6.0.46) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/ng-at-internet + + + + + ## [6.0.45](https://github.com/ovh/manager/compare/@ovh-ux/ng-at-internet@6.0.44...@ovh-ux/ng-at-internet@6.0.45) (2026-02-05) **Note:** Version bump only for package @ovh-ux/ng-at-internet diff --git a/packages/components/ng-at-internet/package.json b/packages/components/ng-at-internet/package.json index 4ee3e4642589..7fcf19ea7f67 100644 --- a/packages/components/ng-at-internet/package.json +++ b/packages/components/ng-at-internet/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/ng-at-internet", - "version": "6.0.45", + "version": "6.0.46", "private": true, "description": "ATInternet tracking library wrapper for AngularJS", "keywords": [ @@ -35,7 +35,7 @@ "prepare": "rollup -c --environment BUILD:production" }, "dependencies": { - "@ovh-ux/ovh-at-internet": "^0.29.4" + "@ovh-ux/ovh-at-internet": "^0.30.0" }, "devDependencies": { "@ovh-ux/component-rollup-config": "^13.2.0", diff --git a/packages/components/ng-shell-tracking/CHANGELOG.md b/packages/components/ng-shell-tracking/CHANGELOG.md index 99ce824ed4a4..2165cf46081b 100644 --- a/packages/components/ng-shell-tracking/CHANGELOG.md +++ b/packages/components/ng-shell-tracking/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.7.40](https://github.com/ovh/manager/compare/@ovh-ux/ng-shell-tracking@0.7.39...@ovh-ux/ng-shell-tracking@0.7.40) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/ng-shell-tracking + + + + + ## [0.7.39](https://github.com/ovh/manager/compare/@ovh-ux/ng-shell-tracking@0.7.38...@ovh-ux/ng-shell-tracking@0.7.39) (2026-02-05) **Note:** Version bump only for package @ovh-ux/ng-shell-tracking diff --git a/packages/components/ng-shell-tracking/package.json b/packages/components/ng-shell-tracking/package.json index 9cb082c4d6d1..eb36089c6022 100644 --- a/packages/components/ng-shell-tracking/package.json +++ b/packages/components/ng-shell-tracking/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/ng-shell-tracking", - "version": "0.7.39", + "version": "0.7.40", "private": true, "description": "ATInternet tracking library wrapper for AngularJS", "keywords": [ @@ -36,7 +36,7 @@ "prepare": "rollup -c --environment BUILD:production" }, "dependencies": { - "@ovh-ux/ovh-at-internet": "^0.29.4" + "@ovh-ux/ovh-at-internet": "^0.30.0" }, "devDependencies": { "@ovh-ux/component-rollup-config": "^13.2.0", diff --git a/packages/components/ovh-at-internet/CHANGELOG.md b/packages/components/ovh-at-internet/CHANGELOG.md index 6265aab404aa..3c28ce32374d 100644 --- a/packages/components/ovh-at-internet/CHANGELOG.md +++ b/packages/components/ovh-at-internet/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [0.30.0](https://github.com/ovh/manager/compare/@ovh-ux/ovh-at-internet@0.29.4...@ovh-ux/ovh-at-internet@0.30.0) (2026-03-04) + + +### Features + +* fix ovh at internet behavior ([d81f245](https://github.com/ovh/manager/commit/d81f245b6186d67a200ef073de9745334bd4fbd0)), closes [#MANAGER-20904](https://github.com/ovh/manager/issues/MANAGER-20904) + + + + + ## [0.29.4](https://github.com/ovh/manager/compare/@ovh-ux/ovh-at-internet@0.29.3...@ovh-ux/ovh-at-internet@0.29.4) (2026-02-05) **Note:** Version bump only for package @ovh-ux/ovh-at-internet diff --git a/packages/components/ovh-at-internet/package.json b/packages/components/ovh-at-internet/package.json index 3df8a69da172..ec0e52c92aa6 100644 --- a/packages/components/ovh-at-internet/package.json +++ b/packages/components/ovh-at-internet/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/ovh-at-internet", - "version": "0.29.4", + "version": "0.30.0", "description": "ATInternet tracking library for OVHcloud.", "keywords": [ "at-internet", diff --git a/packages/components/ovh-shell/CHANGELOG.md b/packages/components/ovh-shell/CHANGELOG.md index 2d7bd8017160..47a4cc48442d 100644 --- a/packages/components/ovh-shell/CHANGELOG.md +++ b/packages/components/ovh-shell/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.10.7](https://github.com/ovh/manager/compare/@ovh-ux/shell@4.10.6...@ovh-ux/shell@4.10.7) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/shell + + + + + ## [4.10.6](https://github.com/ovh/manager/compare/@ovh-ux/shell@4.10.5...@ovh-ux/shell@4.10.6) (2026-02-05) **Note:** Version bump only for package @ovh-ux/shell diff --git a/packages/components/ovh-shell/package.json b/packages/components/ovh-shell/package.json index 335c1ce2256f..d0bcafef2960 100644 --- a/packages/components/ovh-shell/package.json +++ b/packages/components/ovh-shell/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/shell", - "version": "4.10.6", + "version": "4.10.7", "description": "Communication and interaction between applications", "repository": { "type": "git", @@ -30,7 +30,7 @@ "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-core-api": "^0.21.2", "@ovh-ux/manager-core-sso": "^0.7.2", - "@ovh-ux/ovh-at-internet": "^0.29.4", + "@ovh-ux/ovh-at-internet": "^0.30.0", "@ovh-ux/request-tagger": "^0.6.0", "@ovh-ux/url-builder": "^2.4.3", "dompurify": "^3.2.4", diff --git a/packages/manager-ui-kit/CHANGELOG.md b/packages/manager-ui-kit/CHANGELOG.md index cae93ed4c5cd..d812e8be5ce8 100644 --- a/packages/manager-ui-kit/CHANGELOG.md +++ b/packages/manager-ui-kit/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.2.4](https://github.com/ovh/manager/compare/@ovh-ux/muk@1.2.3...@ovh-ux/muk@1.2.4) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/muk + + + + + ## [1.2.3](https://github.com/ovh/manager/compare/@ovh-ux/muk@1.2.2...@ovh-ux/muk@1.2.3) (2026-02-06) **Note:** Version bump only for package @ovh-ux/muk diff --git a/packages/manager-ui-kit/package.json b/packages/manager-ui-kit/package.json index d0446f6fcdca..d022a975399b 100644 --- a/packages/manager-ui-kit/package.json +++ b/packages/manager-ui-kit/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/muk", - "version": "1.2.3", + "version": "1.2.4", "description": "MUK:Manager UI Kit", "homepage": "https://github.com/ovh/manager/blob/master/packages/manager-ui-kit/README.md", "bugs": { @@ -60,7 +60,7 @@ "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-core-api": "^0.21.2", "@ovh-ux/manager-core-utils": "^0.5.0", - "@ovh-ux/manager-react-shell-client": "^1.2.3", + "@ovh-ux/manager-react-shell-client": "^1.2.4", "@ovh-ux/manager-static-analysis-kit": "^0.15.0", "@ovh-ux/manager-tailwind-config": "^0.6.2", "@ovh-ux/manager-tests-setup": "^0.8.0", diff --git a/packages/manager-wiki/CHANGELOG.md b/packages/manager-wiki/CHANGELOG.md index 19de9445789a..90200c7f51b0 100644 --- a/packages/manager-wiki/CHANGELOG.md +++ b/packages/manager-wiki/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.26.8](https://github.com/ovh/manager/compare/@ovh-ux/manager-wiki@0.26.7...@ovh-ux/manager-wiki@0.26.8) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-wiki + + + + + ## [0.26.7](https://github.com/ovh/manager/compare/@ovh-ux/manager-wiki@0.26.6...@ovh-ux/manager-wiki@0.26.7) (2026-02-06) **Note:** Version bump only for package @ovh-ux/manager-wiki diff --git a/packages/manager-wiki/package.json b/packages/manager-wiki/package.json index 9fa7e9b652ba..aaee49b36970 100644 --- a/packages/manager-wiki/package.json +++ b/packages/manager-wiki/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-wiki", - "version": "0.26.7", + "version": "0.26.8", "private": true, "description": "Manager Wiki", "license": "BSD-3-Clause", @@ -13,7 +13,7 @@ }, "dependencies": { "@ovh-ux/manager-core-api": "^0.21.2", - "@ovh-ux/muk": "^1.2.3", + "@ovh-ux/muk": "^1.2.4", "@ovhcloud/ods-react": "19.5.0", "@ovhcloud/ods-themes": "19.5.0", "clsx": "^2.1.1", @@ -32,7 +32,7 @@ "@ovh-ux/manager-core-api": "^0.12.0", "@ovh-ux/ovh-at-internet": "^0.21.6", "@ovh-ux/request-tagger": "^0.6.0", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovh-ux/url-builder": "^2.4.3", "@storybook/addon-docs": "^8.6.7", "@storybook/addon-essentials": "^8.6.7", diff --git a/packages/manager/apps/account-creation/CHANGELOG.md b/packages/manager/apps/account-creation/CHANGELOG.md index 2bd3f74d7fb5..8f5699c1674c 100644 --- a/packages/manager/apps/account-creation/CHANGELOG.md +++ b/packages/manager/apps/account-creation/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.13.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-account-creation-app@0.13.0...@ovh-ux/manager-account-creation-app@0.13.1) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-account-creation-app + + + + + # [0.13.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-account-creation-app@0.12.2...@ovh-ux/manager-account-creation-app@0.13.0) (2026-03-03) diff --git a/packages/manager/apps/account-creation/package.json b/packages/manager/apps/account-creation/package.json index 0777b1e7d84a..9c360edbf454 100644 --- a/packages/manager/apps/account-creation/package.json +++ b/packages/manager/apps/account-creation/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-account-creation-app", - "version": "0.13.0", + "version": "0.13.1", "private": true, "description": "Application used to finalize an account creation", "repository": { @@ -24,12 +24,12 @@ "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-core-api": "^0.21.2", "@ovh-ux/manager-core-utils": "^0.5.0", - "@ovh-ux/manager-gcj-module": "^0.8.3", + "@ovh-ux/manager-gcj-module": "^0.8.4", "@ovh-ux/manager-react-components": "2.43.2", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/request-tagger": "^0.6.0", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-components": "18.6.4", "@ovhcloud/ods-react": "^19.3.0", "@ovhcloud/ods-themes": "19.3.0", diff --git a/packages/manager/apps/account/CHANGELOG.md b/packages/manager/apps/account/CHANGELOG.md index 386f9fe4ee92..7be4757374d5 100644 --- a/packages/manager/apps/account/CHANGELOG.md +++ b/packages/manager/apps/account/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.6.24](https://github.com/ovh/manager/compare/@ovh-ux/manager-account-app@0.6.23...@ovh-ux/manager-account-app@0.6.24) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-account-app + + + + + ## [0.6.23](https://github.com/ovh/manager/compare/@ovh-ux/manager-account-app@0.6.22...@ovh-ux/manager-account-app@0.6.23) (2026-02-26) **Note:** Version bump only for package @ovh-ux/manager-account-app diff --git a/packages/manager/apps/account/package.json b/packages/manager/apps/account/package.json index 582d5ad7bf7a..7ab5d77c7c28 100644 --- a/packages/manager/apps/account/package.json +++ b/packages/manager/apps/account/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-account-app", - "version": "0.6.23", + "version": "0.6.24", "private": true, "description": "User account and contacts management application", "repository": { @@ -17,13 +17,13 @@ "start": "webpack-dev-server" }, "dependencies": { - "@ovh-ux/manager-account": "^0.21.1", + "@ovh-ux/manager-account": "^0.21.2", "@ovh-ux/manager-at-internet-configuration": "^1.5.1", "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-core": "^13.4.4", "@ovh-ux/manager-error-page": "^2.4.7", "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-at-internet-ui-router-plugin": "^3.5.6", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", "@ovh-ux/ng-ovh-feature-flipping": "^1.1.8", @@ -35,12 +35,12 @@ "@ovh-ux/ng-ovh-user-pref": "^2.1.7", "@ovh-ux/ng-ovh-utils": "^14.5.5", "@ovh-ux/ng-pagination-front": "^10.3.7", - "@ovh-ux/ng-shell-tracking": "^0.7.39", + "@ovh-ux/ng-shell-tracking": "^0.7.40", "@ovh-ux/ng-translate-async-loader": "^2.2.7", "@ovh-ux/ng-ui-router-breadcrumb": "^1.4.3", "@ovh-ux/ng-ui-router-layout": "^4.3.7", "@ovh-ux/request-tagger": "^0.6.0", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovh-ux/sign-up": "^3.3.18", "@ovh-ux/ui-kit": "^6.10.5", "@uirouter/angularjs": "^1.0.23", diff --git a/packages/manager/apps/billing/CHANGELOG.md b/packages/manager/apps/billing/CHANGELOG.md index b1d1eeb159fd..dfba8106b334 100644 --- a/packages/manager/apps/billing/CHANGELOG.md +++ b/packages/manager/apps/billing/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.6.6](https://github.com/ovh/manager/compare/@ovh-ux/manager-billing-app@0.6.5...@ovh-ux/manager-billing-app@0.6.6) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-billing-app + + + + + ## [0.6.5](https://github.com/ovh/manager/compare/@ovh-ux/manager-billing-app@0.6.4...@ovh-ux/manager-billing-app@0.6.5) (2026-02-26) **Note:** Version bump only for package @ovh-ux/manager-billing-app diff --git a/packages/manager/apps/billing/package.json b/packages/manager/apps/billing/package.json index de926cb0513a..52a3eacf2c21 100644 --- a/packages/manager/apps/billing/package.json +++ b/packages/manager/apps/billing/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-billing-app", - "version": "0.6.5", + "version": "0.6.6", "private": true, "description": "OVHcloud Billing app", "repository": { @@ -26,7 +26,7 @@ "@ovh-ux/manager-error-page": "^2.4.7", "@ovh-ux/manager-models": "^2.7.11", "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-at-internet-ui-router-plugin": "^3.5.6", "@ovh-ux/ng-log-live-tail": "^2.7.2", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", @@ -45,12 +45,12 @@ "@ovh-ux/ng-ovh-utils": "^14.5.5", "@ovh-ux/ng-pagination-front": "^10.3.7", "@ovh-ux/ng-q-allsettled": "^2.1.7", - "@ovh-ux/ng-shell-tracking": "^0.7.39", + "@ovh-ux/ng-shell-tracking": "^0.7.40", "@ovh-ux/ng-translate-async-loader": "^2.2.7", "@ovh-ux/ng-ui-router-breadcrumb": "^1.4.3", "@ovh-ux/ng-ui-router-layout": "^4.3.7", "@ovh-ux/request-tagger": "^0.6.0", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovh-ux/ui-kit": "^6.10.5", "@uirouter/angularjs": "^1.0.23", "URIjs": "^1.14.0", diff --git a/packages/manager/apps/bmc-backup-agent-baremetal/CHANGELOG.md b/packages/manager/apps/bmc-backup-agent-baremetal/CHANGELOG.md index 7d44666ae695..1916e84aabea 100644 --- a/packages/manager/apps/bmc-backup-agent-baremetal/CHANGELOG.md +++ b/packages/manager/apps/bmc-backup-agent-baremetal/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.4.7](https://github.com/ovh/manager/compare/@ovh-ux/manager-bmc-backup-agent-baremetal-app@0.4.6...@ovh-ux/manager-bmc-backup-agent-baremetal-app@0.4.7) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-bmc-backup-agent-baremetal-app + + + + + ## [0.4.6](https://github.com/ovh/manager/compare/@ovh-ux/manager-bmc-backup-agent-baremetal-app@0.4.5...@ovh-ux/manager-bmc-backup-agent-baremetal-app@0.4.6) (2026-02-26) **Note:** Version bump only for package @ovh-ux/manager-bmc-backup-agent-baremetal-app diff --git a/packages/manager/apps/bmc-backup-agent-baremetal/package.json b/packages/manager/apps/bmc-backup-agent-baremetal/package.json index dbb61aa1ec8e..e6855baf9eec 100644 --- a/packages/manager/apps/bmc-backup-agent-baremetal/package.json +++ b/packages/manager/apps/bmc-backup-agent-baremetal/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-bmc-backup-agent-baremetal-app", - "version": "0.4.6", + "version": "0.4.7", "private": true, "description": "OVHcloud Backup Agent for Baremetal", "repository": { @@ -29,10 +29,10 @@ "@ovh-ux/manager-module-common-api": "^0.6.7", "@ovh-ux/manager-module-order": "^0.14.1", "@ovh-ux/manager-react-components": "2.42.4", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/request-tagger": "*", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-components": "~18.6.2", "@ovhcloud/ods-themes": "~18.6.2", "@tanstack/react-query": "5.51.21", diff --git a/packages/manager/apps/carbon-calculator/CHANGELOG.md b/packages/manager/apps/carbon-calculator/CHANGELOG.md index ae31b33cd83c..a832c8298a29 100644 --- a/packages/manager/apps/carbon-calculator/CHANGELOG.md +++ b/packages/manager/apps/carbon-calculator/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.5.88](https://github.com/ovh/manager/compare/@ovh-ux/manager-carbon-calculator-app@0.5.87...@ovh-ux/manager-carbon-calculator-app@0.5.88) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-carbon-calculator-app + + + + + ## [0.5.87](https://github.com/ovh/manager/compare/@ovh-ux/manager-carbon-calculator-app@0.5.86...@ovh-ux/manager-carbon-calculator-app@0.5.87) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-carbon-calculator-app diff --git a/packages/manager/apps/carbon-calculator/package.json b/packages/manager/apps/carbon-calculator/package.json index 0fb83b803073..fc8aa0e9015c 100644 --- a/packages/manager/apps/carbon-calculator/package.json +++ b/packages/manager/apps/carbon-calculator/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-carbon-calculator-app", - "version": "0.5.87", + "version": "0.5.88", "private": true, "description": "OVHcloud CarbonCalculator app", "repository": { @@ -23,7 +23,7 @@ "@ovh-ux/manager-core": "^13.4.4", "@ovh-ux/manager-error-page": "^2.4.7", "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-at-internet-ui-router-plugin": "^3.5.6", "@ovh-ux/ng-ovh-api-wrappers": "^5.0.0", "@ovh-ux/ng-ovh-feature-flipping": "^1.1.8", @@ -31,11 +31,11 @@ "@ovh-ux/ng-ovh-request-tagger": "^2.0.17", "@ovh-ux/ng-ovh-sso-auth": "^4.10.1", "@ovh-ux/ng-ovh-swimming-poll": "^5.1.7", - "@ovh-ux/ng-shell-tracking": "^0.7.39", + "@ovh-ux/ng-shell-tracking": "^0.7.40", "@ovh-ux/ng-translate-async-loader": "^2.2.7", "@ovh-ux/ng-ui-router-breadcrumb": "^1.4.3", "@ovh-ux/request-tagger": "^0.6.0", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovh-ux/ui-kit": "^6.10.5", "@uirouter/angularjs": "^1.0.23", "angular": "^1.7.5", diff --git a/packages/manager/apps/catalog/CHANGELOG.md b/packages/manager/apps/catalog/CHANGELOG.md index 95bd9661c733..6c626e76b0a9 100644 --- a/packages/manager/apps/catalog/CHANGELOG.md +++ b/packages/manager/apps/catalog/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.30.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-catalog-app@1.30.0...@ovh-ux/manager-catalog-app@1.30.1) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-catalog-app + + + + + # [1.30.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-catalog-app@1.29.0...@ovh-ux/manager-catalog-app@1.30.0) (2026-02-12) diff --git a/packages/manager/apps/catalog/package.json b/packages/manager/apps/catalog/package.json index 7d0c81070a8d..e1464b432704 100644 --- a/packages/manager/apps/catalog/package.json +++ b/packages/manager/apps/catalog/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-catalog-app", - "version": "1.30.0", + "version": "1.30.1", "private": true, "description": "OVHcloud Catalog application", "repository": { @@ -23,10 +23,10 @@ "@ovh-ux/manager-common-translations": "^0.29.0", "@ovh-ux/manager-core-api": "^0.21.2", "@ovh-ux/manager-core-utils": "^0.5.0", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/muk": "0.10.8", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-common-core": "17.2.2", "@ovhcloud/ods-common-theming": "17.2.2", "@ovhcloud/ods-components": "17.2.2", diff --git a/packages/manager/apps/cda/CHANGELOG.md b/packages/manager/apps/cda/CHANGELOG.md index b3de6c5a9f2c..99cad2fb01a2 100644 --- a/packages/manager/apps/cda/CHANGELOG.md +++ b/packages/manager/apps/cda/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.78](https://github.com/ovh/manager/compare/@ovh-ux/manager-cda-app@3.0.77...@ovh-ux/manager-cda-app@3.0.78) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-cda-app + + + + + ## [3.0.77](https://github.com/ovh/manager/compare/@ovh-ux/manager-cda-app@3.0.76...@ovh-ux/manager-cda-app@3.0.77) (2026-02-11) **Note:** Version bump only for package @ovh-ux/manager-cda-app diff --git a/packages/manager/apps/cda/package.json b/packages/manager/apps/cda/package.json index 79e175bff877..cc7a1ea97dab 100644 --- a/packages/manager/apps/cda/package.json +++ b/packages/manager/apps/cda/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-cda-app", - "version": "3.0.77", + "version": "3.0.78", "private": true, "repository": { "type": "git", @@ -21,7 +21,7 @@ "@ovh-ux/manager-core": "^13.4.4", "@ovh-ux/manager-filters": "^1.2.2", "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-at-internet-ui-router-plugin": "^3.5.6", "@ovh-ux/ng-ovh-actions-menu": "^5.1.7", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", diff --git a/packages/manager/apps/cloud-connect/CHANGELOG.md b/packages/manager/apps/cloud-connect/CHANGELOG.md index 15ae2abbec91..72b8b0075634 100644 --- a/packages/manager/apps/cloud-connect/CHANGELOG.md +++ b/packages/manager/apps/cloud-connect/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.0.99](https://github.com/ovh/manager/compare/@ovh-ux/manager-cloud-connect-app@2.0.98...@ovh-ux/manager-cloud-connect-app@2.0.99) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-cloud-connect-app + + + + + ## [2.0.98](https://github.com/ovh/manager/compare/@ovh-ux/manager-cloud-connect-app@2.0.97...@ovh-ux/manager-cloud-connect-app@2.0.98) (2026-02-11) **Note:** Version bump only for package @ovh-ux/manager-cloud-connect-app diff --git a/packages/manager/apps/cloud-connect/package.json b/packages/manager/apps/cloud-connect/package.json index b13af3067f7e..010352c80942 100644 --- a/packages/manager/apps/cloud-connect/package.json +++ b/packages/manager/apps/cloud-connect/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-cloud-connect-app", - "version": "2.0.98", + "version": "2.0.99", "private": true, "description": "OVHcloud Connect standalone application.", "repository": { @@ -21,7 +21,7 @@ "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-core": "^13.4.4", "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-at-internet-ui-router-plugin": "^3.5.6", "@ovh-ux/ng-log-live-tail": "^2.7.1", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", diff --git a/packages/manager/apps/cloud-shell/CHANGELOG.md b/packages/manager/apps/cloud-shell/CHANGELOG.md index 15af1186d2ea..74231f1c0788 100644 --- a/packages/manager/apps/cloud-shell/CHANGELOG.md +++ b/packages/manager/apps/cloud-shell/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.2.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-cloud-shell-app@0.2.1...@ovh-ux/manager-cloud-shell-app@0.2.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-cloud-shell-app + + + + + ## [0.2.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-cloud-shell-app@0.2.0...@ovh-ux/manager-cloud-shell-app@0.2.1) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-cloud-shell-app diff --git a/packages/manager/apps/cloud-shell/package.json b/packages/manager/apps/cloud-shell/package.json index e5be5a0d275c..428e5c0b9c99 100644 --- a/packages/manager/apps/cloud-shell/package.json +++ b/packages/manager/apps/cloud-shell/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-cloud-shell-app", - "version": "0.2.1", + "version": "0.2.2", "private": true, "description": "OVHcloud Shell", "type": "module", @@ -19,10 +19,10 @@ "@ovh-ux/manager-core-api": "^0.21.2", "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-react-components": "^1.46.0", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/manager-tailwind-config": "^0.6.2", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-common-core": "17.2.2", "@ovhcloud/ods-common-theming": "17.2.2", "@ovhcloud/ods-components": "17.2.2", diff --git a/packages/manager/apps/communication/CHANGELOG.md b/packages/manager/apps/communication/CHANGELOG.md index d33110bdfbc3..06d206e7e7be 100644 --- a/packages/manager/apps/communication/CHANGELOG.md +++ b/packages/manager/apps/communication/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.11.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-communication-app@0.11.0...@ovh-ux/manager-communication-app@0.11.1) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-communication-app + + + + + # [0.11.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-communication-app@0.10.2...@ovh-ux/manager-communication-app@0.11.0) (2026-02-09) diff --git a/packages/manager/apps/communication/package.json b/packages/manager/apps/communication/package.json index d79afd838320..af27dddceebf 100644 --- a/packages/manager/apps/communication/package.json +++ b/packages/manager/apps/communication/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-communication-app", - "version": "0.11.0", + "version": "0.11.1", "private": true, "description": "An app for customer communication", "repository": { @@ -26,7 +26,7 @@ "@ovh-ux/manager-core-api": "^0.21.2", "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-react-components": "2.43.2", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/muk": "0.11.0", "@ovh-ux/request-tagger": "^0.4.1", diff --git a/packages/manager/apps/container/CHANGELOG.md b/packages/manager/apps/container/CHANGELOG.md index ee50adfdad74..95723be20d38 100644 --- a/packages/manager/apps/container/CHANGELOG.md +++ b/packages/manager/apps/container/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.187.3](https://github.com/ovh/manager/compare/@ovh-ux/manager-container-app@0.187.2...@ovh-ux/manager-container-app@0.187.3) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-container-app + + + + + ## [0.187.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-container-app@0.187.1...@ovh-ux/manager-container-app@0.187.2) (2026-03-03) diff --git a/packages/manager/apps/container/package.json b/packages/manager/apps/container/package.json index 8ec10537cd0f..42315a15cfa0 100644 --- a/packages/manager/apps/container/package.json +++ b/packages/manager/apps/container/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-container-app", - "version": "0.187.2", + "version": "0.187.3", "private": true, "description": "OVHcloud Manager Container.", "repository": { @@ -31,7 +31,7 @@ "@ovh-ux/ovh-product-icons": "^0.17.1", "@ovh-ux/ovh-reket": "^2.1.28", "@ovh-ux/request-tagger": "^0.6.0", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovh-ux/ui-kit": "^6.10.5", "@ovhcloud/ods-common-core": "17.2.2", "@ovhcloud/ods-common-theming": "17.2.2", diff --git a/packages/manager/apps/dbaas-logs/CHANGELOG.md b/packages/manager/apps/dbaas-logs/CHANGELOG.md index f02257f1601f..c79a19dadbdc 100644 --- a/packages/manager/apps/dbaas-logs/CHANGELOG.md +++ b/packages/manager/apps/dbaas-logs/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.150](https://github.com/ovh/manager/compare/@ovh-ux/manager-dbaas-logs-app@3.0.149...@ovh-ux/manager-dbaas-logs-app@3.0.150) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-dbaas-logs-app + + + + + ## [3.0.149](https://github.com/ovh/manager/compare/@ovh-ux/manager-dbaas-logs-app@3.0.148...@ovh-ux/manager-dbaas-logs-app@3.0.149) (2026-03-03) **Note:** Version bump only for package @ovh-ux/manager-dbaas-logs-app diff --git a/packages/manager/apps/dbaas-logs/package.json b/packages/manager/apps/dbaas-logs/package.json index c21db3c9f204..3d5fba210016 100644 --- a/packages/manager/apps/dbaas-logs/package.json +++ b/packages/manager/apps/dbaas-logs/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-dbaas-logs-app", - "version": "3.0.149", + "version": "3.0.150", "private": true, "description": "Logs Data Platform standalone application.", "repository": { @@ -25,7 +25,7 @@ "@ovh-ux/manager-filters": "^1.2.2", "@ovh-ux/manager-ng-apiv2-helper": "^0.2.2", "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-at-internet-ui-router-plugin": "^3.5.6", "@ovh-ux/ng-ovh-actions-menu": "^5.1.7", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", diff --git a/packages/manager/apps/dedicated-servers/CHANGELOG.md b/packages/manager/apps/dedicated-servers/CHANGELOG.md index b1fff39ab15d..5ceb1dfca266 100644 --- a/packages/manager/apps/dedicated-servers/CHANGELOG.md +++ b/packages/manager/apps/dedicated-servers/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.10.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-dedicated-servers-app@0.10.1...@ovh-ux/manager-dedicated-servers-app@0.10.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-dedicated-servers-app + + + + + ## [0.10.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-dedicated-servers-app@0.10.0...@ovh-ux/manager-dedicated-servers-app@0.10.1) (2026-02-11) **Note:** Version bump only for package @ovh-ux/manager-dedicated-servers-app diff --git a/packages/manager/apps/dedicated-servers/package.json b/packages/manager/apps/dedicated-servers/package.json index 33aff6d56fa5..bfbfe98c5f33 100644 --- a/packages/manager/apps/dedicated-servers/package.json +++ b/packages/manager/apps/dedicated-servers/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-dedicated-servers-app", - "version": "0.10.1", + "version": "0.10.2", "private": true, "description": "Dedicated server listing ", "repository": { @@ -25,9 +25,9 @@ "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-module-common-api": "^0.6.7", "@ovh-ux/manager-react-components": "2.43.2", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", - "@ovh-ux/muk": "^1.1.1", + "@ovh-ux/muk": "^1.2.4", "@ovh-ux/request-tagger": "^0.6.0", "@ovhcloud/ods-components": "18.6.4", "@ovhcloud/ods-react": "^19.3.0", diff --git a/packages/manager/apps/dedicated/CHANGELOG.md b/packages/manager/apps/dedicated/CHANGELOG.md index b18283f14fe2..364411942b4c 100644 --- a/packages/manager/apps/dedicated/CHANGELOG.md +++ b/packages/manager/apps/dedicated/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [20.74.15](https://github.com/ovh/manager/compare/@ovh-ux/manager-dedicated@20.74.14...@ovh-ux/manager-dedicated@20.74.15) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-dedicated + + + + + ## [20.74.14](https://github.com/ovh/manager/compare/@ovh-ux/manager-dedicated@20.74.13...@ovh-ux/manager-dedicated@20.74.14) (2026-03-03) diff --git a/packages/manager/apps/dedicated/package.json b/packages/manager/apps/dedicated/package.json index 68587106f388..f307beeed4a7 100644 --- a/packages/manager/apps/dedicated/package.json +++ b/packages/manager/apps/dedicated/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-dedicated", - "version": "20.74.14", + "version": "20.74.15", "private": true, "description": "OVHcloud Dedicated control panel.", "repository": { @@ -53,7 +53,7 @@ "@ovh-ux/manager-veeam-enterprise": "^1.13.3", "@ovh-ux/manager-vps": "^2.50.15", "@ovh-ux/manager-vrack": "^1.22.0", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-at-internet-ui-router-plugin": "^3.5.6", "@ovh-ux/ng-log-live-tail": "^2.7.2", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", @@ -82,13 +82,13 @@ "@ovh-ux/ng-ovh-web-universe-components": "^9.21.3", "@ovh-ux/ng-pagination-front": "^10.3.7", "@ovh-ux/ng-q-allsettled": "^2.1.7", - "@ovh-ux/ng-shell-tracking": "^0.7.39", + "@ovh-ux/ng-shell-tracking": "^0.7.40", "@ovh-ux/ng-tail-logs": "^2.2.6", "@ovh-ux/ng-translate-async-loader": "^2.2.7", "@ovh-ux/ng-ui-router-breadcrumb": "^1.4.3", "@ovh-ux/ng-ui-router-layout": "^4.3.7", "@ovh-ux/request-tagger": "^0.6.0", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovh-ux/ui-kit": "^6.10.5", "@uirouter/angularjs": "^1.0.23", "URIjs": "^1.14.0", diff --git a/packages/manager/apps/exchange/CHANGELOG.md b/packages/manager/apps/exchange/CHANGELOG.md index 13ee698575d7..7736e53ef006 100644 --- a/packages/manager/apps/exchange/CHANGELOG.md +++ b/packages/manager/apps/exchange/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.13.49](https://github.com/ovh/manager/compare/@ovh-ux/manager-exchange-app@0.13.48...@ovh-ux/manager-exchange-app@0.13.49) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-exchange-app + + + + + ## [0.13.48](https://github.com/ovh/manager/compare/@ovh-ux/manager-exchange-app@0.13.47...@ovh-ux/manager-exchange-app@0.13.48) (2026-02-11) **Note:** Version bump only for package @ovh-ux/manager-exchange-app diff --git a/packages/manager/apps/exchange/package.json b/packages/manager/apps/exchange/package.json index 82fba888969b..2ba3adb716e5 100644 --- a/packages/manager/apps/exchange/package.json +++ b/packages/manager/apps/exchange/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-exchange-app", - "version": "0.13.48", + "version": "0.13.49", "private": true, "repository": { "type": "git", @@ -23,7 +23,7 @@ "@ovh-ux/manager-log-to-customer": "^2.8.2", "@ovh-ux/manager-ng-apiv2-helper": "^0.2.1", "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-log-live-tail": "^2.7.2", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", "@ovh-ux/ng-ovh-chart": "^1.3.5", diff --git a/packages/manager/apps/freefax/CHANGELOG.md b/packages/manager/apps/freefax/CHANGELOG.md index b15f233e3173..abe7480cc44a 100644 --- a/packages/manager/apps/freefax/CHANGELOG.md +++ b/packages/manager/apps/freefax/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [9.0.78](https://github.com/ovh/manager/compare/@ovh-ux/manager-freefax-app@9.0.77...@ovh-ux/manager-freefax-app@9.0.78) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-freefax-app + + + + + ## [9.0.77](https://github.com/ovh/manager/compare/@ovh-ux/manager-freefax-app@9.0.76...@ovh-ux/manager-freefax-app@9.0.77) (2026-02-20) diff --git a/packages/manager/apps/freefax/package.json b/packages/manager/apps/freefax/package.json index 5fa978f86853..4863ab8da9b4 100644 --- a/packages/manager/apps/freefax/package.json +++ b/packages/manager/apps/freefax/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-freefax-app", - "version": "9.0.77", + "version": "9.0.78", "private": true, "description": "Freefax standalone application.", "repository": { @@ -23,7 +23,7 @@ "@ovh-ux/manager-freefax": "^7.9.6", "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", "@ovh-ux/manager-telecom-styles": "^4.8.8", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", "@ovh-ux/ng-ovh-checkbox-table": "^2.1.7", "@ovh-ux/ng-ovh-contracts": "^4.6.6", diff --git a/packages/manager/apps/hpc-backup-agent-iaas/CHANGELOG.md b/packages/manager/apps/hpc-backup-agent-iaas/CHANGELOG.md index 78154e347bac..460de70169f7 100644 --- a/packages/manager/apps/hpc-backup-agent-iaas/CHANGELOG.md +++ b/packages/manager/apps/hpc-backup-agent-iaas/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.23](https://github.com/ovh/manager/compare/@ovh-ux/manager-hpc-backup-agent-iaas-app@0.1.22...@ovh-ux/manager-hpc-backup-agent-iaas-app@0.1.23) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-hpc-backup-agent-iaas-app + + + + + ## [0.1.22](https://github.com/ovh/manager/compare/@ovh-ux/manager-hpc-backup-agent-iaas-app@0.1.21...@ovh-ux/manager-hpc-backup-agent-iaas-app@0.1.22) (2026-02-26) **Note:** Version bump only for package @ovh-ux/manager-hpc-backup-agent-iaas-app diff --git a/packages/manager/apps/hpc-backup-agent-iaas/package.json b/packages/manager/apps/hpc-backup-agent-iaas/package.json index 144f505cbc26..a74c563fcf68 100644 --- a/packages/manager/apps/hpc-backup-agent-iaas/package.json +++ b/packages/manager/apps/hpc-backup-agent-iaas/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-hpc-backup-agent-iaas-app", - "version": "0.1.22", + "version": "0.1.23", "private": true, "description": "OVHcloud Backup Agent for IaaS", "repository": { @@ -25,10 +25,10 @@ "@ovh-ux/manager-core-api": "^0.21.2", "@ovh-ux/manager-core-utils": "*", "@ovh-ux/manager-react-components": "2.43.1", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/request-tagger": "*", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-components": "~18.6.2", "@ovhcloud/ods-themes": "~18.6.2", "@tanstack/react-query": "5.51.21", diff --git a/packages/manager/apps/hpc-vmware-public-vcf-aas/CHANGELOG.md b/packages/manager/apps/hpc-vmware-public-vcf-aas/CHANGELOG.md index b29faeaf0b40..6410678cbd21 100644 --- a/packages/manager/apps/hpc-vmware-public-vcf-aas/CHANGELOG.md +++ b/packages/manager/apps/hpc-vmware-public-vcf-aas/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.31.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-hpc-vmware-public-vcf-aas-app@0.31.0...@ovh-ux/manager-hpc-vmware-public-vcf-aas-app@0.31.1) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-hpc-vmware-public-vcf-aas-app + + + + + # [0.31.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-hpc-vmware-public-vcf-aas-app@0.30.3...@ovh-ux/manager-hpc-vmware-public-vcf-aas-app@0.31.0) (2026-02-24) diff --git a/packages/manager/apps/hpc-vmware-public-vcf-aas/package.json b/packages/manager/apps/hpc-vmware-public-vcf-aas/package.json index 6e84d55dcd57..c58ba95a1395 100644 --- a/packages/manager/apps/hpc-vmware-public-vcf-aas/package.json +++ b/packages/manager/apps/hpc-vmware-public-vcf-aas/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-hpc-vmware-public-vcf-aas-app", - "version": "0.31.0", + "version": "0.31.1", "private": true, "description": "New managed VMware Public VCF aas offers", "repository": { @@ -29,7 +29,7 @@ "@ovh-ux/manager-module-vcd-api": "^0.11.3", "@ovh-ux/manager-network-common": "^0.9.0", "@ovh-ux/manager-react-components": "^2.43.1", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/request-tagger": "^0.6.0", "@ovhcloud/ods-components": "^18.6.2", diff --git a/packages/manager/apps/hpc-vmware-vsphere/CHANGELOG.md b/packages/manager/apps/hpc-vmware-vsphere/CHANGELOG.md index 06eeb6ad6882..980446781c7c 100644 --- a/packages/manager/apps/hpc-vmware-vsphere/CHANGELOG.md +++ b/packages/manager/apps/hpc-vmware-vsphere/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.3.20](https://github.com/ovh/manager/compare/@ovh-ux/manager-hpc-vmware-vsphere-app@0.3.19...@ovh-ux/manager-hpc-vmware-vsphere-app@0.3.20) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-hpc-vmware-vsphere-app + + + + + ## [0.3.19](https://github.com/ovh/manager/compare/@ovh-ux/manager-hpc-vmware-vsphere-app@0.3.18...@ovh-ux/manager-hpc-vmware-vsphere-app@0.3.19) (2026-02-16) **Note:** Version bump only for package @ovh-ux/manager-hpc-vmware-vsphere-app diff --git a/packages/manager/apps/hpc-vmware-vsphere/package.json b/packages/manager/apps/hpc-vmware-vsphere/package.json index 4d2b12c38c09..2a5d38d75340 100644 --- a/packages/manager/apps/hpc-vmware-vsphere/package.json +++ b/packages/manager/apps/hpc-vmware-vsphere/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-hpc-vmware-vsphere-app", - "version": "0.3.19", + "version": "0.3.20", "private": true, "description": "Managed VMware vsphere services", "repository": { @@ -27,7 +27,7 @@ "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-module-order": "^0.14.1", "@ovh-ux/manager-react-components": "2.43.1", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/request-tagger": "^0.6.0", "@ovhcloud/ods-components": "18.6.2", diff --git a/packages/manager/apps/hub/CHANGELOG.md b/packages/manager/apps/hub/CHANGELOG.md index 130f060eb2c1..ef94a9e58af8 100644 --- a/packages/manager/apps/hub/CHANGELOG.md +++ b/packages/manager/apps/hub/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.29.8](https://github.com/ovh/manager/compare/@ovh-ux/manager-hub-app@0.29.7...@ovh-ux/manager-hub-app@0.29.8) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-hub-app + + + + + ## [0.29.7](https://github.com/ovh/manager/compare/@ovh-ux/manager-hub-app@0.29.6...@ovh-ux/manager-hub-app@0.29.7) (2026-02-16) diff --git a/packages/manager/apps/hub/package.json b/packages/manager/apps/hub/package.json index 452597caed57..eaa2ee427221 100644 --- a/packages/manager/apps/hub/package.json +++ b/packages/manager/apps/hub/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-hub-app", - "version": "0.29.7", + "version": "0.29.8", "private": true, "description": "OVHcloud Dashboard control panel.", "repository": { @@ -24,7 +24,7 @@ "@ovh-ux/manager-core-api": "^0.21.2", "@ovh-ux/manager-models": "^2.7.11", "@ovh-ux/manager-react-components": "^1.48.0", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/request-tagger": "^0.6.0", "@ovhcloud/ods-common-core": "17.2.1", diff --git a/packages/manager/apps/hycu/CHANGELOG.md b/packages/manager/apps/hycu/CHANGELOG.md index 972454d5113d..28818edb8111 100644 --- a/packages/manager/apps/hycu/CHANGELOG.md +++ b/packages/manager/apps/hycu/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.15.39](https://github.com/ovh/manager/compare/@ovh-ux/manager-hycu-app@0.15.38...@ovh-ux/manager-hycu-app@0.15.39) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-hycu-app + + + + + ## [0.15.38](https://github.com/ovh/manager/compare/@ovh-ux/manager-hycu-app@0.15.37...@ovh-ux/manager-hycu-app@0.15.38) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-hycu-app diff --git a/packages/manager/apps/hycu/package.json b/packages/manager/apps/hycu/package.json index 1f61c52ea3a1..41954f37e3c9 100644 --- a/packages/manager/apps/hycu/package.json +++ b/packages/manager/apps/hycu/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-hycu-app", - "version": "0.15.38", + "version": "0.15.39", "private": true, "description": "Backup HYCU for OVHcloud", "repository": { @@ -26,7 +26,7 @@ "@ovh-ux/manager-module-common-api": "^0.6.7", "@ovh-ux/manager-module-order": "^0.14.1", "@ovh-ux/manager-react-components": "1.48.0", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/manager-tailwind-config": "^0.6.2", "@ovh-ux/request-tagger": "^0.6.0", diff --git a/packages/manager/apps/iam/CHANGELOG.md b/packages/manager/apps/iam/CHANGELOG.md index a3ac9a074f89..cc32f5b5380f 100644 --- a/packages/manager/apps/iam/CHANGELOG.md +++ b/packages/manager/apps/iam/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.2.23](https://github.com/ovh/manager/compare/@ovh-ux/manager-iam-app@3.2.22...@ovh-ux/manager-iam-app@3.2.23) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-iam-app + + + + + ## [3.2.22](https://github.com/ovh/manager/compare/@ovh-ux/manager-iam-app@3.2.21...@ovh-ux/manager-iam-app@3.2.22) (2026-03-03) **Note:** Version bump only for package @ovh-ux/manager-iam-app diff --git a/packages/manager/apps/iam/package.json b/packages/manager/apps/iam/package.json index 3179ff293ec4..e10a9f6029cf 100644 --- a/packages/manager/apps/iam/package.json +++ b/packages/manager/apps/iam/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-iam-app", - "version": "3.2.22", + "version": "3.2.23", "private": true, "description": "IAM standalone application.", "repository": { @@ -27,7 +27,7 @@ "@ovh-ux/manager-iam": "^1.27.0", "@ovh-ux/manager-log-to-customer": "^2.8.2", "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-at-internet-ui-router-plugin": "^3.5.6", "@ovh-ux/ng-log-live-tail": "^2.7.2", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", @@ -38,11 +38,11 @@ "@ovh-ux/ng-ovh-swimming-poll": "^5.1.7", "@ovh-ux/ng-ovh-utils": "^14.5.5", "@ovh-ux/ng-pagination-front": "^10.3.7", - "@ovh-ux/ng-shell-tracking": "^0.7.39", + "@ovh-ux/ng-shell-tracking": "^0.7.40", "@ovh-ux/ng-ui-router-breadcrumb": "^1.4.3", "@ovh-ux/ng-ui-router-layout": "^4.3.7", "@ovh-ux/request-tagger": "^0.6.0", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovh-ux/ui-kit": "^6.10.5", "@uirouter/angularjs": "^1.0.23", "angular": "^1.7.5", diff --git a/packages/manager/apps/identity-access-management/CHANGELOG.md b/packages/manager/apps/identity-access-management/CHANGELOG.md index c560edd208c6..c915957d59a5 100644 --- a/packages/manager/apps/identity-access-management/CHANGELOG.md +++ b/packages/manager/apps/identity-access-management/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.8.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-identity-access-management-app@0.8.0...@ovh-ux/manager-identity-access-management-app@0.8.1) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-identity-access-management-app + + + + + # [0.8.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-identity-access-management-app@0.7.4...@ovh-ux/manager-identity-access-management-app@0.8.0) (2026-03-03) diff --git a/packages/manager/apps/identity-access-management/package.json b/packages/manager/apps/identity-access-management/package.json index c32f88393a66..371cd14c3975 100644 --- a/packages/manager/apps/identity-access-management/package.json +++ b/packages/manager/apps/identity-access-management/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-identity-access-management-app", - "version": "0.8.0", + "version": "0.8.1", "private": true, "description": "manage iam policies users tags etc", "repository": { @@ -24,7 +24,7 @@ "@ovh-ux/manager-core-api": "^0.21.2", "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-react-components": "^2.43.1", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/request-tagger": "^0.6.0", "@ovhcloud/ods-components": "^18.3.0", diff --git a/packages/manager/apps/iplb/CHANGELOG.md b/packages/manager/apps/iplb/CHANGELOG.md index d86be762849f..2d0507f19478 100644 --- a/packages/manager/apps/iplb/CHANGELOG.md +++ b/packages/manager/apps/iplb/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.2.49](https://github.com/ovh/manager/compare/@ovh-ux/manager-iplb-app@3.2.48...@ovh-ux/manager-iplb-app@3.2.49) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-iplb-app + + + + + ## [3.2.48](https://github.com/ovh/manager/compare/@ovh-ux/manager-iplb-app@3.2.47...@ovh-ux/manager-iplb-app@3.2.48) (2026-02-26) **Note:** Version bump only for package @ovh-ux/manager-iplb-app diff --git a/packages/manager/apps/iplb/package.json b/packages/manager/apps/iplb/package.json index 4739e2eef8bb..cbad3a20107e 100644 --- a/packages/manager/apps/iplb/package.json +++ b/packages/manager/apps/iplb/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-iplb-app", - "version": "3.2.48", + "version": "3.2.49", "private": true, "description": "IP Load Balancer standalone application.", "repository": { @@ -24,7 +24,7 @@ "@ovh-ux/manager-iplb": "^1.30.2", "@ovh-ux/manager-log-to-customer": "^2.8.2", "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-log-live-tail": "^2.7.2", "@ovh-ux/ng-ovh-actions-menu": "^5.1.7", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", diff --git a/packages/manager/apps/ips/CHANGELOG.md b/packages/manager/apps/ips/CHANGELOG.md index 25c11837d8bd..5f110932e178 100644 --- a/packages/manager/apps/ips/CHANGELOG.md +++ b/packages/manager/apps/ips/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.5.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-ips-app@0.5.1...@ovh-ux/manager-ips-app@0.5.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-ips-app + + + + + ## [0.5.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-ips-app@0.5.0...@ovh-ux/manager-ips-app@0.5.1) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-ips-app diff --git a/packages/manager/apps/ips/package.json b/packages/manager/apps/ips/package.json index 80c8a9b6d21f..97282292050e 100644 --- a/packages/manager/apps/ips/package.json +++ b/packages/manager/apps/ips/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-ips-app", - "version": "0.5.1", + "version": "0.5.2", "private": true, "description": "Ips manager app", "repository": { @@ -27,7 +27,7 @@ "@ovh-ux/manager-module-common-api": "^0.6.7", "@ovh-ux/manager-module-order": "^0.14.1", "@ovh-ux/manager-react-components": "^2.43.1", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/muk": "^0.10.1", "@ovh-ux/request-tagger": "^0.4.1", diff --git a/packages/manager/apps/metrics/CHANGELOG.md b/packages/manager/apps/metrics/CHANGELOG.md index f5fbfe975f6c..502688123edf 100644 --- a/packages/manager/apps/metrics/CHANGELOG.md +++ b/packages/manager/apps/metrics/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.95](https://github.com/ovh/manager/compare/@ovh-ux/manager-metrics-app@3.0.94...@ovh-ux/manager-metrics-app@3.0.95) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-metrics-app + + + + + ## [3.0.94](https://github.com/ovh/manager/compare/@ovh-ux/manager-metrics-app@3.0.93...@ovh-ux/manager-metrics-app@3.0.94) (2026-02-26) **Note:** Version bump only for package @ovh-ux/manager-metrics-app diff --git a/packages/manager/apps/metrics/package.json b/packages/manager/apps/metrics/package.json index 120c13751b9c..08e3d41a832f 100644 --- a/packages/manager/apps/metrics/package.json +++ b/packages/manager/apps/metrics/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-metrics-app", - "version": "3.0.94", + "version": "3.0.95", "private": true, "repository": { "type": "git", @@ -21,7 +21,7 @@ "@ovh-ux/manager-core": "^13.4.4", "@ovh-ux/manager-metrics": "^1.6.2", "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-ovh-actions-menu": "^5.1.7", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", "@ovh-ux/ng-ovh-cloud-universe-components": "^2.19.0", diff --git a/packages/manager/apps/nasha/CHANGELOG.md b/packages/manager/apps/nasha/CHANGELOG.md index 816b2ef9fef2..c3a6c4d2174e 100644 --- a/packages/manager/apps/nasha/CHANGELOG.md +++ b/packages/manager/apps/nasha/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.0.147](https://github.com/ovh/manager/compare/@ovh-ux/manager-nasha-app@4.0.146...@ovh-ux/manager-nasha-app@4.0.147) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-nasha-app + + + + + ## [4.0.146](https://github.com/ovh/manager/compare/@ovh-ux/manager-nasha-app@4.0.145...@ovh-ux/manager-nasha-app@4.0.146) (2026-02-26) **Note:** Version bump only for package @ovh-ux/manager-nasha-app diff --git a/packages/manager/apps/nasha/package.json b/packages/manager/apps/nasha/package.json index ab151fc5e923..13bddb958534 100644 --- a/packages/manager/apps/nasha/package.json +++ b/packages/manager/apps/nasha/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-nasha-app", - "version": "4.0.146", + "version": "4.0.147", "private": true, "description": "NAS-HA standalone application.", "repository": { @@ -26,7 +26,7 @@ "@ovh-ux/manager-models": "^2.7.11", "@ovh-ux/manager-nasha": "^2.20.3", "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-at-internet-ui-router-plugin": "^3.5.6", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", "@ovh-ux/ng-ovh-cloud-universe-components": "^2.19.0", diff --git a/packages/manager/apps/netapp/CHANGELOG.md b/packages/manager/apps/netapp/CHANGELOG.md index b563bc4b1956..e74e27a39124 100644 --- a/packages/manager/apps/netapp/CHANGELOG.md +++ b/packages/manager/apps/netapp/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.9.165](https://github.com/ovh/manager/compare/@ovh-ux/manager-netapp-app@0.9.164...@ovh-ux/manager-netapp-app@0.9.165) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-netapp-app + + + + + ## [0.9.164](https://github.com/ovh/manager/compare/@ovh-ux/manager-netapp-app@0.9.163...@ovh-ux/manager-netapp-app@0.9.164) (2026-03-03) **Note:** Version bump only for package @ovh-ux/manager-netapp-app diff --git a/packages/manager/apps/netapp/package.json b/packages/manager/apps/netapp/package.json index 34d7b57ad293..1d1f262ba52e 100644 --- a/packages/manager/apps/netapp/package.json +++ b/packages/manager/apps/netapp/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-netapp-app", - "version": "0.9.164", + "version": "0.9.165", "private": true, "description": "NetApp standalone application", "repository": { @@ -28,7 +28,7 @@ "@ovh-ux/manager-models": "^2.7.11", "@ovh-ux/manager-netapp": "^2.17.10", "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-at-internet-ui-router-plugin": "^3.5.6", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", "@ovh-ux/ng-ovh-feature-flipping": "^1.1.8", diff --git a/packages/manager/apps/nutanix/CHANGELOG.md b/packages/manager/apps/nutanix/CHANGELOG.md index 4c9e029be4c2..4dd7e2a00484 100644 --- a/packages/manager/apps/nutanix/CHANGELOG.md +++ b/packages/manager/apps/nutanix/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.137](https://github.com/ovh/manager/compare/@ovh-ux/manager-nutanix-app@3.0.136...@ovh-ux/manager-nutanix-app@3.0.137) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-nutanix-app + + + + + ## [3.0.136](https://github.com/ovh/manager/compare/@ovh-ux/manager-nutanix-app@3.0.135...@ovh-ux/manager-nutanix-app@3.0.136) (2026-02-26) **Note:** Version bump only for package @ovh-ux/manager-nutanix-app diff --git a/packages/manager/apps/nutanix/package.json b/packages/manager/apps/nutanix/package.json index 072e74d76a9a..a6035fbc82e6 100644 --- a/packages/manager/apps/nutanix/package.json +++ b/packages/manager/apps/nutanix/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-nutanix-app", - "version": "3.0.136", + "version": "3.0.137", "private": true, "description": "OVHcloud Nutanix app", "repository": { @@ -24,7 +24,7 @@ "@ovh-ux/manager-error-page": "^2.4.7", "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", "@ovh-ux/manager-nutanix": "^2.11.29", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-at-internet-ui-router-plugin": "^3.5.6", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", "@ovh-ux/ng-ovh-chart": "^1.3.5", diff --git a/packages/manager/apps/observability/CHANGELOG.md b/packages/manager/apps/observability/CHANGELOG.md index 16a88bc37b08..247a740b31ca 100644 --- a/packages/manager/apps/observability/CHANGELOG.md +++ b/packages/manager/apps/observability/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.1.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-observability-app@0.1.0...@ovh-ux/manager-observability-app@0.1.1) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-observability-app + + + + + # [0.1.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-observability-app@0.0.0...@ovh-ux/manager-observability-app@0.1.0) (2026-02-24) diff --git a/packages/manager/apps/observability/package.json b/packages/manager/apps/observability/package.json index 88e7cbc5bf59..efb75434307b 100644 --- a/packages/manager/apps/observability/package.json +++ b/packages/manager/apps/observability/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-observability-app", - "version": "0.1.0", + "version": "0.1.1", "private": true, "description": "OVHCloud Observability µApplication", "repository": { @@ -25,11 +25,11 @@ "@ovh-ux/manager-core-api": "*", "@ovh-ux/manager-core-utils": "*", "@ovh-ux/manager-module-order": "*", - "@ovh-ux/manager-react-core-application": "*", - "@ovh-ux/manager-react-shell-client": "*", + "@ovh-ux/manager-react-core-application": "^0.15.5", + "@ovh-ux/manager-react-shell-client": "^1.2.4", "@ovh-ux/muk": "1.2.0", "@ovh-ux/request-tagger": "*", - "@ovh-ux/shell": "^4.5.7", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-react": "19.5.0", "@ovhcloud/ods-themes": "19.5.0", "@tanstack/react-query": "5.51.21", diff --git a/packages/manager/apps/okms/CHANGELOG.md b/packages/manager/apps/okms/CHANGELOG.md index 5cd8d35d92c9..2d896e525ab4 100644 --- a/packages/manager/apps/okms/CHANGELOG.md +++ b/packages/manager/apps/okms/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.45.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-okms-app@0.45.0...@ovh-ux/manager-okms-app@0.45.1) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-okms-app + + + + + # [0.45.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-okms-app@0.44.7...@ovh-ux/manager-okms-app@0.45.0) (2026-03-03) diff --git a/packages/manager/apps/okms/package.json b/packages/manager/apps/okms/package.json index 8a8c26212345..f4d044559fee 100644 --- a/packages/manager/apps/okms/package.json +++ b/packages/manager/apps/okms/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-okms-app", - "version": "0.45.0", + "version": "0.45.1", "private": true, "description": "ovh okms", "repository": { @@ -32,7 +32,7 @@ "@ovh-ux/manager-module-common-api": "^0.6.7", "@ovh-ux/manager-module-order": "^0.14.1", "@ovh-ux/manager-react-components": "2.43.1", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "0.11.2", "@ovh-ux/muk": "1.2.0", "@ovh-ux/request-tagger": "^0.6.0", diff --git a/packages/manager/apps/order-tracking/CHANGELOG.md b/packages/manager/apps/order-tracking/CHANGELOG.md index 4d3bb689bc90..c71363733176 100644 --- a/packages/manager/apps/order-tracking/CHANGELOG.md +++ b/packages/manager/apps/order-tracking/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.69](https://github.com/ovh/manager/compare/@ovh-ux/order-tracking-app@3.0.68...@ovh-ux/order-tracking-app@3.0.69) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/order-tracking-app + + + + + ## [3.0.68](https://github.com/ovh/manager/compare/@ovh-ux/order-tracking-app@3.0.67...@ovh-ux/order-tracking-app@3.0.68) (2026-02-05) **Note:** Version bump only for package @ovh-ux/order-tracking-app diff --git a/packages/manager/apps/order-tracking/package.json b/packages/manager/apps/order-tracking/package.json index 6a7661816be1..d870c477534a 100644 --- a/packages/manager/apps/order-tracking/package.json +++ b/packages/manager/apps/order-tracking/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/order-tracking-app", - "version": "3.0.68", + "version": "3.0.69", "private": true, "description": "Order tracking standalone application.", "repository": { @@ -17,7 +17,7 @@ "dependencies": { "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-core": "^13.4.4", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-ovh-http": "^5.1.7", "@ovh-ux/ng-ovh-order-tracking": "^2.5.7", "@ovh-ux/ng-ovh-request-tagger": "^2.0.17", diff --git a/packages/manager/apps/overthebox/CHANGELOG.md b/packages/manager/apps/overthebox/CHANGELOG.md index c71faae24226..0eaf339ca856 100644 --- a/packages/manager/apps/overthebox/CHANGELOG.md +++ b/packages/manager/apps/overthebox/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [7.1.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-overthebox-app@7.1.1...@ovh-ux/manager-overthebox-app@7.1.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-overthebox-app + + + + + ## [7.1.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-overthebox-app@7.1.0...@ovh-ux/manager-overthebox-app@7.1.1) (2026-02-26) **Note:** Version bump only for package @ovh-ux/manager-overthebox-app diff --git a/packages/manager/apps/overthebox/package.json b/packages/manager/apps/overthebox/package.json index 897a983eb980..97d2e769c2d2 100644 --- a/packages/manager/apps/overthebox/package.json +++ b/packages/manager/apps/overthebox/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-overthebox-app", - "version": "7.1.1", + "version": "7.1.2", "private": true, "description": "OverTheBox standalone application.", "repository": { @@ -23,7 +23,7 @@ "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", "@ovh-ux/manager-overthebox": "^6.25.1", "@ovh-ux/manager-telecom-styles": "^4.8.8", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", "@ovh-ux/ng-ovh-chart": "^1.3.5", "@ovh-ux/ng-ovh-checkbox-table": "^2.1.7", diff --git a/packages/manager/apps/pci-ai-endpoints/CHANGELOG.md b/packages/manager/apps/pci-ai-endpoints/CHANGELOG.md index 6560aa17c0c9..f7ed68b41453 100644 --- a/packages/manager/apps/pci-ai-endpoints/CHANGELOG.md +++ b/packages/manager/apps/pci-ai-endpoints/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.13.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-ai-endpoints-app@0.13.0...@ovh-ux/manager-pci-ai-endpoints-app@0.13.1) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-ai-endpoints-app + + + + + # [0.13.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-ai-endpoints-app@0.12.1...@ovh-ux/manager-pci-ai-endpoints-app@0.13.0) (2026-02-18) diff --git a/packages/manager/apps/pci-ai-endpoints/package.json b/packages/manager/apps/pci-ai-endpoints/package.json index b0dd33278ea5..7b71ba441bc3 100644 --- a/packages/manager/apps/pci-ai-endpoints/package.json +++ b/packages/manager/apps/pci-ai-endpoints/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-ai-endpoints-app", - "version": "0.13.0", + "version": "0.13.1", "private": true, "description": "Manage AI Endpoints (usage and tokens) through OVHcloud control panel", "repository": { @@ -26,11 +26,11 @@ "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-pci-common": "^0.16.4", "@ovh-ux/manager-react-components": "1.48.0", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/manager-tailwind-config": "^0.6.2", "@ovh-ux/request-tagger": "^0.6.0", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-common-core": "17.2.1", "@ovhcloud/ods-common-theming": "17.2.1", "@ovhcloud/ods-react": "19.3.0", diff --git a/packages/manager/apps/pci-ai-tools/CHANGELOG.md b/packages/manager/apps/pci-ai-tools/CHANGELOG.md index 496de347181c..5b95ba8c2678 100644 --- a/packages/manager/apps/pci-ai-tools/CHANGELOG.md +++ b/packages/manager/apps/pci-ai-tools/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.22.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-ai-tools-app@1.22.0...@ovh-ux/manager-pci-ai-tools-app@1.22.1) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-ai-tools-app + + + + + # [1.22.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-ai-tools-app@1.21.0...@ovh-ux/manager-pci-ai-tools-app@1.22.0) (2026-03-04) diff --git a/packages/manager/apps/pci-ai-tools/package.json b/packages/manager/apps/pci-ai-tools/package.json index 907cff372c24..65b469ee06e9 100644 --- a/packages/manager/apps/pci-ai-tools/package.json +++ b/packages/manager/apps/pci-ai-tools/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-ai-tools-app", - "version": "1.22.0", + "version": "1.22.1", "private": true, "description": "pci-ai-tools", "repository": { @@ -29,7 +29,7 @@ "@ovh-ux/manager-core-api": "^0.21.2", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/request-tagger": "^0.6.0", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@tanstack/react-query": "5.90.12", "@tanstack/react-table": "8.21.3", "clsx": "^2.1.0", diff --git a/packages/manager/apps/pci-billing/CHANGELOG.md b/packages/manager/apps/pci-billing/CHANGELOG.md index f511f0eed8c0..b89fa5c80406 100644 --- a/packages/manager/apps/pci-billing/CHANGELOG.md +++ b/packages/manager/apps/pci-billing/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.15.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-billing-app@0.15.0...@ovh-ux/manager-pci-billing-app@0.15.1) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-billing-app + + + + + # [0.15.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-billing-app@0.14.0...@ovh-ux/manager-pci-billing-app@0.15.0) (2026-03-02) diff --git a/packages/manager/apps/pci-billing/package.json b/packages/manager/apps/pci-billing/package.json index 30f5cf0fa295..43d08d7aec6f 100644 --- a/packages/manager/apps/pci-billing/package.json +++ b/packages/manager/apps/pci-billing/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-billing-app", - "version": "0.15.0", + "version": "0.15.1", "private": true, "description": "PCI Billing react app", "type": "module", @@ -20,10 +20,10 @@ "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-pci-common": "^0.18.3", "@ovh-ux/manager-react-components": "1.48.0", - "@ovh-ux/manager-react-core-application": "^0.15.4", - "@ovh-ux/manager-react-shell-client": "^1.2.3", + "@ovh-ux/manager-react-core-application": "^0.15.5", + "@ovh-ux/manager-react-shell-client": "^1.2.4", "@ovh-ux/manager-tailwind-config": "^0.6.2", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-common-core": "17.2.2", "@ovhcloud/ods-common-stencil": "17.2.2", "@ovhcloud/ods-common-theming": "17.2.2", diff --git a/packages/manager/apps/pci-block-storage/CHANGELOG.md b/packages/manager/apps/pci-block-storage/CHANGELOG.md index a4085ea49e58..2798f82099fd 100644 --- a/packages/manager/apps/pci-block-storage/CHANGELOG.md +++ b/packages/manager/apps/pci-block-storage/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.25.6](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-block-storage-app@0.25.5...@ovh-ux/manager-pci-block-storage-app@0.25.6) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-block-storage-app + + + + + ## [0.25.5](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-block-storage-app@0.25.4...@ovh-ux/manager-pci-block-storage-app@0.25.5) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-pci-block-storage-app diff --git a/packages/manager/apps/pci-block-storage/package.json b/packages/manager/apps/pci-block-storage/package.json index 83e0f704eca3..32a99d7152dc 100644 --- a/packages/manager/apps/pci-block-storage/package.json +++ b/packages/manager/apps/pci-block-storage/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-block-storage-app", - "version": "0.25.5", + "version": "0.25.6", "private": true, "description": "PCI Block storage react app", "type": "module", @@ -20,11 +20,11 @@ "@ovh-ux/manager-core-api": "^0.21.2", "@ovh-ux/manager-pci-common": "^0.20.1", "@ovh-ux/manager-react-components": "^1.46.0", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/manager-tailwind-config": "^0.6.2", "@ovh-ux/request-tagger": "^0.6.0", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-common-core": "^17.2.2", "@ovhcloud/ods-common-stencil": "^17.2.2", "@ovhcloud/ods-common-theming": "^17.2.2", diff --git a/packages/manager/apps/pci-cold-archive/CHANGELOG.md b/packages/manager/apps/pci-cold-archive/CHANGELOG.md index 1bfec53f889e..0157ba551070 100644 --- a/packages/manager/apps/pci-cold-archive/CHANGELOG.md +++ b/packages/manager/apps/pci-cold-archive/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.6.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-cold-archive-app@0.6.1...@ovh-ux/manager-pci-cold-archive-app@0.6.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-cold-archive-app + + + + + ## [0.6.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-cold-archive-app@0.6.0...@ovh-ux/manager-pci-cold-archive-app@0.6.1) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-pci-cold-archive-app diff --git a/packages/manager/apps/pci-cold-archive/package.json b/packages/manager/apps/pci-cold-archive/package.json index b76c6e0dac6a..5501dd33dc25 100644 --- a/packages/manager/apps/pci-cold-archive/package.json +++ b/packages/manager/apps/pci-cold-archive/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-cold-archive-app", - "version": "0.6.1", + "version": "0.6.2", "private": true, "description": "PCI Cold Archive react app", "type": "module", @@ -18,10 +18,10 @@ "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-pci-common": "^2.8.0", "@ovh-ux/manager-react-components": "2.43.1", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/manager-tailwind-config": "^0.6.2", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-components": "18.6.4", "@ovhcloud/ods-themes": "18.6.4", "@tanstack/react-query": "5.90.12", diff --git a/packages/manager/apps/pci-contacts/CHANGELOG.md b/packages/manager/apps/pci-contacts/CHANGELOG.md index 01981433d5e2..9d244f206470 100644 --- a/packages/manager/apps/pci-contacts/CHANGELOG.md +++ b/packages/manager/apps/pci-contacts/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.3.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-contacts-app@0.3.1...@ovh-ux/manager-pci-contacts-app@0.3.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-contacts-app + + + + + ## [0.3.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-contacts-app@0.3.0...@ovh-ux/manager-pci-contacts-app@0.3.1) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-pci-contacts-app diff --git a/packages/manager/apps/pci-contacts/package.json b/packages/manager/apps/pci-contacts/package.json index 340651b4d346..02159f46f8de 100644 --- a/packages/manager/apps/pci-contacts/package.json +++ b/packages/manager/apps/pci-contacts/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-contacts-app", - "version": "0.3.1", + "version": "0.3.2", "private": true, "description": "PCI Contacts react application", "repository": { @@ -27,7 +27,7 @@ "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-pci-common": "^2.8.0", "@ovh-ux/manager-react-components": "2.42.4", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.9.1", "@ovh-ux/manager-tailwind-config": "^0.6.2", "@ovh-ux/request-tagger": "^0.6.0", diff --git a/packages/manager/apps/pci-databases-analytics/CHANGELOG.md b/packages/manager/apps/pci-databases-analytics/CHANGELOG.md index 1a2d37593637..0c73f2f46e95 100644 --- a/packages/manager/apps/pci-databases-analytics/CHANGELOG.md +++ b/packages/manager/apps/pci-databases-analytics/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.41.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-databases-analytics-app@1.41.1...@ovh-ux/manager-pci-databases-analytics-app@1.41.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-databases-analytics-app + + + + + ## [1.41.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-databases-analytics-app@1.41.0...@ovh-ux/manager-pci-databases-analytics-app@1.41.1) (2026-02-25) diff --git a/packages/manager/apps/pci-databases-analytics/package.json b/packages/manager/apps/pci-databases-analytics/package.json index 775212aaa543..abfa3e335b1c 100644 --- a/packages/manager/apps/pci-databases-analytics/package.json +++ b/packages/manager/apps/pci-databases-analytics/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-databases-analytics-app", - "version": "1.41.1", + "version": "1.41.2", "private": true, "description": "pci-databases-analytics", "repository": { @@ -33,7 +33,7 @@ "@ovh-ux/manager-react-components": "1.48.0", "@ovh-ux/manager-react-shell-client": "0.11.2", "@ovh-ux/request-tagger": "0.6.0", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-components": "17.2.2", "@ovhcloud/ods-react": "19.2.1", "@ovhcloud/ods-theme-blue-jeans": "17.2.2", diff --git a/packages/manager/apps/pci-dataplatform/CHANGELOG.md b/packages/manager/apps/pci-dataplatform/CHANGELOG.md index 39cfd8e9b1e9..52c693b5d7d4 100644 --- a/packages/manager/apps/pci-dataplatform/CHANGELOG.md +++ b/packages/manager/apps/pci-dataplatform/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.9.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-dataplatform-app@1.9.0...@ovh-ux/manager-pci-dataplatform-app@1.9.1) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-dataplatform-app + + + + + # [1.9.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-dataplatform-app@1.8.1...@ovh-ux/manager-pci-dataplatform-app@1.9.0) (2026-02-25) diff --git a/packages/manager/apps/pci-dataplatform/package.json b/packages/manager/apps/pci-dataplatform/package.json index 426a64d3ae2c..06c172914441 100644 --- a/packages/manager/apps/pci-dataplatform/package.json +++ b/packages/manager/apps/pci-dataplatform/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-dataplatform-app", - "version": "1.9.0", + "version": "1.9.1", "private": true, "description": "pci-dataplatform", "repository": { @@ -26,7 +26,7 @@ "@ovh-ux/manager-core-api": "^0.21.2", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/request-tagger": "^0.6.0", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@tanstack/react-query": "5.90.12", "@tanstack/react-table": "8.21.3", "clsx": "^2.1.0", diff --git a/packages/manager/apps/pci-file-storage/CHANGELOG.md b/packages/manager/apps/pci-file-storage/CHANGELOG.md index a801c9e97fc8..d971164f589f 100644 --- a/packages/manager/apps/pci-file-storage/CHANGELOG.md +++ b/packages/manager/apps/pci-file-storage/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.2.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-file-storage-app@0.2.0...@ovh-ux/manager-pci-file-storage-app@0.2.1) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-file-storage-app + + + + + # [0.2.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-file-storage-app@0.1.5...@ovh-ux/manager-pci-file-storage-app@0.2.0) (2026-03-03) diff --git a/packages/manager/apps/pci-file-storage/package.json b/packages/manager/apps/pci-file-storage/package.json index c8fa0b7da488..58935c5895dd 100644 --- a/packages/manager/apps/pci-file-storage/package.json +++ b/packages/manager/apps/pci-file-storage/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-file-storage-app", - "version": "0.2.0", + "version": "0.2.1", "private": true, "description": "PCI file storage react app", "repository": { @@ -25,11 +25,11 @@ "@ovh-ux/manager-core-api": "^0.21.2", "@ovh-ux/manager-core-utils": "*", "@ovh-ux/manager-pci-common": "^2.8.0", - "@ovh-ux/manager-react-core-application": "^0.15.4", - "@ovh-ux/manager-react-shell-client": "^1.2.3", - "@ovh-ux/muk": "~1.2.0", + "@ovh-ux/manager-react-core-application": "^0.15.5", + "@ovh-ux/manager-react-shell-client": "^1.2.4", + "@ovh-ux/muk": "^1.2.4", "@ovh-ux/request-tagger": "*", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-react": "~19.5.0", "@ovhcloud/ods-themes": "~19.5.0", "@tanstack/react-query": "5.51.21", diff --git a/packages/manager/apps/pci-gateway/CHANGELOG.md b/packages/manager/apps/pci-gateway/CHANGELOG.md index e7081bdde9a6..4349eba3b631 100644 --- a/packages/manager/apps/pci-gateway/CHANGELOG.md +++ b/packages/manager/apps/pci-gateway/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.26.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-gateway-app@0.26.1...@ovh-ux/manager-pci-gateway-app@0.26.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-gateway-app + + + + + ## [0.26.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-gateway-app@0.26.0...@ovh-ux/manager-pci-gateway-app@0.26.1) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-pci-gateway-app diff --git a/packages/manager/apps/pci-gateway/package.json b/packages/manager/apps/pci-gateway/package.json index 09707b883787..b8fa369d3d78 100644 --- a/packages/manager/apps/pci-gateway/package.json +++ b/packages/manager/apps/pci-gateway/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-gateway-app", - "version": "0.26.1", + "version": "0.26.2", "private": true, "description": "PCI Gateway react app", "type": "module", @@ -18,7 +18,7 @@ "@ovh-ux/manager-core-api": "^0.21.2", "@ovh-ux/manager-pci-common": "^0.17.0", "@ovh-ux/manager-react-components": "1.48.0", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/manager-tailwind-config": "^0.6.2", "@ovhcloud/ods-common-core": "17.2.2", diff --git a/packages/manager/apps/pci-instances/CHANGELOG.md b/packages/manager/apps/pci-instances/CHANGELOG.md index 161d7f2e756c..aacc110f9e47 100644 --- a/packages/manager/apps/pci-instances/CHANGELOG.md +++ b/packages/manager/apps/pci-instances/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.15.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-instances-app@0.15.1...@ovh-ux/manager-pci-instances-app@0.15.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-instances-app + + + + + ## [0.15.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-instances-app@0.15.0...@ovh-ux/manager-pci-instances-app@0.15.1) (2026-03-02) diff --git a/packages/manager/apps/pci-instances/package.json b/packages/manager/apps/pci-instances/package.json index c8dd2f36c693..532b8592e5fe 100644 --- a/packages/manager/apps/pci-instances/package.json +++ b/packages/manager/apps/pci-instances/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-instances-app", - "version": "0.15.1", + "version": "0.15.2", "private": true, "type": "module", "scripts": { @@ -22,8 +22,8 @@ "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-pci-common": "^0.18.3", "@ovh-ux/manager-react-components": "^1.48.0", - "@ovh-ux/manager-react-core-application": "^0.15.4", - "@ovh-ux/manager-react-shell-client": "^1.2.3", + "@ovh-ux/manager-react-core-application": "^0.15.5", + "@ovh-ux/manager-react-shell-client": "^1.2.4", "@ovh-ux/muk": "^0.10.4", "@ovhcloud/ods-common-core": "17.2.2", "@ovhcloud/ods-common-stencil": "17.2.2", diff --git a/packages/manager/apps/pci-kubernetes/CHANGELOG.md b/packages/manager/apps/pci-kubernetes/CHANGELOG.md index 4005692fee4f..39f9efce86ab 100644 --- a/packages/manager/apps/pci-kubernetes/CHANGELOG.md +++ b/packages/manager/apps/pci-kubernetes/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.41.7](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-kubernetes-app@0.41.6...@ovh-ux/manager-pci-kubernetes-app@0.41.7) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-kubernetes-app + + + + + ## [0.41.6](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-kubernetes-app@0.41.5...@ovh-ux/manager-pci-kubernetes-app@0.41.6) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-pci-kubernetes-app diff --git a/packages/manager/apps/pci-kubernetes/package.json b/packages/manager/apps/pci-kubernetes/package.json index 838a0595e86d..26b73d7be324 100644 --- a/packages/manager/apps/pci-kubernetes/package.json +++ b/packages/manager/apps/pci-kubernetes/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-kubernetes-app", - "version": "0.41.6", + "version": "0.41.7", "private": true, "description": "PCI Kubernetes react app", "type": "module", @@ -24,7 +24,7 @@ "@ovh-ux/manager-react-components": "1.46.0", "@ovh-ux/manager-react-core-application": "0.136", "@ovh-ux/manager-react-shell-client": "0.11.2", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-common-core": "17.2.2", "@ovhcloud/ods-common-stencil": "17.2.2", "@ovhcloud/ods-common-theming": "17.2.2", diff --git a/packages/manager/apps/pci-load-balancer/CHANGELOG.md b/packages/manager/apps/pci-load-balancer/CHANGELOG.md index f88b2a3131a1..6afefc29de71 100644 --- a/packages/manager/apps/pci-load-balancer/CHANGELOG.md +++ b/packages/manager/apps/pci-load-balancer/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.18.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-load-balancer-app@0.18.1...@ovh-ux/manager-pci-load-balancer-app@0.18.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-load-balancer-app + + + + + ## [0.18.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-load-balancer-app@0.18.0...@ovh-ux/manager-pci-load-balancer-app@0.18.1) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-pci-load-balancer-app diff --git a/packages/manager/apps/pci-load-balancer/package.json b/packages/manager/apps/pci-load-balancer/package.json index 3a48718d758d..5d6a33392d16 100644 --- a/packages/manager/apps/pci-load-balancer/package.json +++ b/packages/manager/apps/pci-load-balancer/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-load-balancer-app", - "version": "0.18.1", + "version": "0.18.2", "private": true, "description": "PCI Octavia load balancer react app", "type": "module", @@ -21,9 +21,9 @@ "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-pci-common": "^0.17.0", "@ovh-ux/manager-react-components": "1.48.0", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-common-core": "17.2.2", "@ovhcloud/ods-common-stencil": "17.2.2", "@ovhcloud/ods-common-theming": "17.2.2", diff --git a/packages/manager/apps/pci-object-storage/CHANGELOG.md b/packages/manager/apps/pci-object-storage/CHANGELOG.md index 71eb352532d9..b6f20c966d7c 100644 --- a/packages/manager/apps/pci-object-storage/CHANGELOG.md +++ b/packages/manager/apps/pci-object-storage/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.36.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-object-storage-app@0.36.0...@ovh-ux/manager-pci-object-storage-app@0.36.1) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-object-storage-app + + + + + # [0.36.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-object-storage-app@0.35.1...@ovh-ux/manager-pci-object-storage-app@0.36.0) (2026-03-04) diff --git a/packages/manager/apps/pci-object-storage/package.json b/packages/manager/apps/pci-object-storage/package.json index 03705b310c42..ff0da57fa891 100644 --- a/packages/manager/apps/pci-object-storage/package.json +++ b/packages/manager/apps/pci-object-storage/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-object-storage-app", - "version": "0.36.0", + "version": "0.36.1", "private": true, "description": "pci-object-storage", "repository": { @@ -31,11 +31,11 @@ "@ovh-ux/manager-module-common-api": "^0.6.5", "@ovh-ux/manager-pci-common": "^2.8.0", "@ovh-ux/manager-react-components": "2.43.1", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/manager-tailwind-config": "^0.6.2", "@ovh-ux/request-tagger": "^0.6.0", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-themes": "19.2.1", "@tanstack/react-query": "5.90.12", "@tanstack/react-table": "8.21.3", diff --git a/packages/manager/apps/pci-private-network/CHANGELOG.md b/packages/manager/apps/pci-private-network/CHANGELOG.md index 6d99d4857b81..6bbbb8987257 100644 --- a/packages/manager/apps/pci-private-network/CHANGELOG.md +++ b/packages/manager/apps/pci-private-network/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.22.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-private-network-app@0.22.1...@ovh-ux/manager-pci-private-network-app@0.22.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-private-network-app + + + + + ## [0.22.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-private-network-app@0.22.0...@ovh-ux/manager-pci-private-network-app@0.22.1) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-pci-private-network-app diff --git a/packages/manager/apps/pci-private-network/package.json b/packages/manager/apps/pci-private-network/package.json index 84a323174506..36200ce8e270 100644 --- a/packages/manager/apps/pci-private-network/package.json +++ b/packages/manager/apps/pci-private-network/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-private-network-app", - "version": "0.22.1", + "version": "0.22.2", "private": true, "description": "PCI Private network react app", "type": "module", @@ -19,9 +19,9 @@ "@ovh-ux/manager-core-api": "^0.21.2", "@ovh-ux/manager-pci-common": "^0.20.1", "@ovh-ux/manager-react-components": "1.48.0", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-common-core": "^17.2.2", "@ovhcloud/ods-common-stencil": "^17.2.2", "@ovhcloud/ods-common-theming": "^17.2.2", diff --git a/packages/manager/apps/pci-private-registry/CHANGELOG.md b/packages/manager/apps/pci-private-registry/CHANGELOG.md index 3a62475465ec..1e5ef807e83e 100644 --- a/packages/manager/apps/pci-private-registry/CHANGELOG.md +++ b/packages/manager/apps/pci-private-registry/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.13.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-private-registry-app@0.13.1...@ovh-ux/manager-pci-private-registry-app@0.13.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-private-registry-app + + + + + ## [0.13.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-private-registry-app@0.13.0...@ovh-ux/manager-pci-private-registry-app@0.13.1) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-pci-private-registry-app diff --git a/packages/manager/apps/pci-private-registry/package.json b/packages/manager/apps/pci-private-registry/package.json index 078848209272..33f96185deeb 100644 --- a/packages/manager/apps/pci-private-registry/package.json +++ b/packages/manager/apps/pci-private-registry/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-private-registry-app", - "version": "0.13.1", + "version": "0.13.2", "private": true, "description": "PCI Private registry react app", "type": "module", @@ -20,10 +20,10 @@ "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-pci-common": "^0.18.2", "@ovh-ux/manager-react-components": "1.48.0", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/manager-tailwind-config": "^0.6.2", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-common-core": "17.2.2", "@ovhcloud/ods-common-stencil": "17.2.2", "@ovhcloud/ods-common-theming": "17.2.2", diff --git a/packages/manager/apps/pci-project/CHANGELOG.md b/packages/manager/apps/pci-project/CHANGELOG.md index 2eb102cc5302..05eec3bcf88d 100644 --- a/packages/manager/apps/pci-project/CHANGELOG.md +++ b/packages/manager/apps/pci-project/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.4.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-project-app@0.4.0...@ovh-ux/manager-pci-project-app@0.4.1) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-project-app + + + + + # [0.4.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-project-app@0.3.0...@ovh-ux/manager-pci-project-app@0.4.0) (2026-03-02) diff --git a/packages/manager/apps/pci-project/package.json b/packages/manager/apps/pci-project/package.json index 0ff1655a28f8..983ee6497714 100644 --- a/packages/manager/apps/pci-project/package.json +++ b/packages/manager/apps/pci-project/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-project-app", - "version": "0.4.0", + "version": "0.4.1", "private": true, "description": "PCI Project react application", "repository": { @@ -29,8 +29,8 @@ "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-pci-common": "^2.8.0", "@ovh-ux/manager-react-components": "2.43.1", - "@ovh-ux/manager-react-core-application": "^0.15.4", - "@ovh-ux/manager-react-shell-client": "^1.2.3", + "@ovh-ux/manager-react-core-application": "^0.15.5", + "@ovh-ux/manager-react-shell-client": "^1.2.4", "@ovh-ux/request-tagger": "^0.6.0", "@ovhcloud/ods-components": "18.6.4", "@ovhcloud/ods-themes": "18.6.4", diff --git a/packages/manager/apps/pci-public-ip/CHANGELOG.md b/packages/manager/apps/pci-public-ip/CHANGELOG.md index 35fa824cbed1..004d61b29167 100644 --- a/packages/manager/apps/pci-public-ip/CHANGELOG.md +++ b/packages/manager/apps/pci-public-ip/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.20.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-public-ip-app@0.20.1...@ovh-ux/manager-pci-public-ip-app@0.20.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-public-ip-app + + + + + ## [0.20.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-public-ip-app@0.20.0...@ovh-ux/manager-pci-public-ip-app@0.20.1) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-pci-public-ip-app diff --git a/packages/manager/apps/pci-public-ip/package.json b/packages/manager/apps/pci-public-ip/package.json index f47490003384..8ace64df50a1 100644 --- a/packages/manager/apps/pci-public-ip/package.json +++ b/packages/manager/apps/pci-public-ip/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-public-ip-app", - "version": "0.20.1", + "version": "0.20.2", "private": true, "description": "PCI Public IPs react app", "type": "module", @@ -19,10 +19,10 @@ "@ovh-ux/manager-module-order": "^0.14.1", "@ovh-ux/manager-pci-common": "0.17.0", "@ovh-ux/manager-react-components": "1.46.0", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "0.11.2", "@ovh-ux/request-tagger": "0.5.9", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-common-core": "17.2.2", "@ovhcloud/ods-common-stencil": "17.2.2", "@ovhcloud/ods-common-theming": "17.2.2", diff --git a/packages/manager/apps/pci-quota/CHANGELOG.md b/packages/manager/apps/pci-quota/CHANGELOG.md index 982b3c94aabd..b44f23edacee 100644 --- a/packages/manager/apps/pci-quota/CHANGELOG.md +++ b/packages/manager/apps/pci-quota/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.4.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-quota-app@0.4.1...@ovh-ux/manager-pci-quota-app@0.4.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-quota-app + + + + + ## [0.4.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-quota-app@0.4.0...@ovh-ux/manager-pci-quota-app@0.4.1) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-pci-quota-app diff --git a/packages/manager/apps/pci-quota/package.json b/packages/manager/apps/pci-quota/package.json index 49fb8785aa11..e406a25df03b 100644 --- a/packages/manager/apps/pci-quota/package.json +++ b/packages/manager/apps/pci-quota/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-quota-app", - "version": "0.4.1", + "version": "0.4.2", "private": true, "description": "PCI Quota and Regions react app", "type": "module", @@ -23,9 +23,9 @@ "@ovh-ux/manager-core-utils": "^0.4.9", "@ovh-ux/manager-pci-common": "^2.8.0", "@ovh-ux/manager-react-components": "2.43.1", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-components": "18.6.2", "@ovhcloud/ods-themes": "18.6.2", "@tanstack/react-query": "5.51.21", diff --git a/packages/manager/apps/pci-rancher/CHANGELOG.md b/packages/manager/apps/pci-rancher/CHANGELOG.md index 64122b79c7fc..394129e72851 100644 --- a/packages/manager/apps/pci-rancher/CHANGELOG.md +++ b/packages/manager/apps/pci-rancher/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.33.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-rancher-app@1.33.1...@ovh-ux/manager-pci-rancher-app@1.33.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-rancher-app + + + + + ## [1.33.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-rancher-app@1.33.0...@ovh-ux/manager-pci-rancher-app@1.33.1) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-pci-rancher-app diff --git a/packages/manager/apps/pci-rancher/package.json b/packages/manager/apps/pci-rancher/package.json index b501abdbf934..55d40b876fca 100644 --- a/packages/manager/apps/pci-rancher/package.json +++ b/packages/manager/apps/pci-rancher/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-rancher-app", - "version": "1.33.1", + "version": "1.33.2", "private": true, "description": "pci-rancher", "repository": { @@ -30,7 +30,7 @@ "@ovh-ux/manager-react-core-application": "0.13.7", "@ovh-ux/manager-react-shell-client": "1.0.1", "@ovh-ux/request-tagger": "0.5.10", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-common-core": "17.2.2", "@ovhcloud/ods-common-theming": "17.2.2", "@ovhcloud/ods-components": "17.2.2", diff --git a/packages/manager/apps/pci-savings-plan/CHANGELOG.md b/packages/manager/apps/pci-savings-plan/CHANGELOG.md index ad9126f8c858..006c8c18cfe8 100644 --- a/packages/manager/apps/pci-savings-plan/CHANGELOG.md +++ b/packages/manager/apps/pci-savings-plan/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.23.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-savings-plan-app@1.23.1...@ovh-ux/manager-pci-savings-plan-app@1.23.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-savings-plan-app + + + + + ## [1.23.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-savings-plan-app@1.23.0...@ovh-ux/manager-pci-savings-plan-app@1.23.1) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-pci-savings-plan-app diff --git a/packages/manager/apps/pci-savings-plan/package.json b/packages/manager/apps/pci-savings-plan/package.json index 7f34ffa2d1c8..d45f4c933734 100644 --- a/packages/manager/apps/pci-savings-plan/package.json +++ b/packages/manager/apps/pci-savings-plan/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-savings-plan-app", - "version": "1.23.1", + "version": "1.23.2", "private": true, "description": "savings plan application", "repository": { @@ -25,7 +25,7 @@ "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-pci-common": "^2.8.0", "@ovh-ux/manager-react-components": "2.43.1", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/manager-tailwind-config": "^0.6.2", "@ovh-ux/request-tagger": "^0.6.0", diff --git a/packages/manager/apps/pci-ssh-keys/CHANGELOG.md b/packages/manager/apps/pci-ssh-keys/CHANGELOG.md index 91de5238395d..98a35b3ee883 100644 --- a/packages/manager/apps/pci-ssh-keys/CHANGELOG.md +++ b/packages/manager/apps/pci-ssh-keys/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.14.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-ssh-keys-app@0.14.1...@ovh-ux/manager-pci-ssh-keys-app@0.14.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-ssh-keys-app + + + + + ## [0.14.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-ssh-keys-app@0.14.0...@ovh-ux/manager-pci-ssh-keys-app@0.14.1) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-pci-ssh-keys-app diff --git a/packages/manager/apps/pci-ssh-keys/package.json b/packages/manager/apps/pci-ssh-keys/package.json index e468314983eb..a91630867005 100644 --- a/packages/manager/apps/pci-ssh-keys/package.json +++ b/packages/manager/apps/pci-ssh-keys/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-ssh-keys-app", - "version": "0.14.1", + "version": "0.14.2", "private": true, "description": "PCI SSH Keys react app", "type": "module", @@ -17,9 +17,9 @@ "@ovh-ux/manager-core-api": "^0.21.2", "@ovh-ux/manager-pci-common": "^0.17.0", "@ovh-ux/manager-react-components": "1.48.0", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-common-core": "17.2.2", "@ovhcloud/ods-common-theming": "17.2.2", "@ovhcloud/ods-components": "17.2.2", diff --git a/packages/manager/apps/pci-users/CHANGELOG.md b/packages/manager/apps/pci-users/CHANGELOG.md index ebb1152ffffa..e878ba3a34e5 100644 --- a/packages/manager/apps/pci-users/CHANGELOG.md +++ b/packages/manager/apps/pci-users/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.18.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-users-app@0.18.1...@ovh-ux/manager-pci-users-app@0.18.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-users-app + + + + + ## [0.18.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-users-app@0.18.0...@ovh-ux/manager-pci-users-app@0.18.1) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-pci-users-app diff --git a/packages/manager/apps/pci-users/package.json b/packages/manager/apps/pci-users/package.json index c5d7310b237c..687f8cada171 100644 --- a/packages/manager/apps/pci-users/package.json +++ b/packages/manager/apps/pci-users/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-users-app", - "version": "0.18.1", + "version": "0.18.2", "private": true, "description": "PCI Users react app", "type": "module", @@ -17,9 +17,9 @@ "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-pci-common": "^0.17.0", "@ovh-ux/manager-react-components": "1.48.0", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-common-core": "17.2.2", "@ovhcloud/ods-common-stencil": "17.2.2", "@ovhcloud/ods-common-theming": "17.2.2", diff --git a/packages/manager/apps/pci-volume-backup/CHANGELOG.md b/packages/manager/apps/pci-volume-backup/CHANGELOG.md index 074a8ac20815..16026354d730 100644 --- a/packages/manager/apps/pci-volume-backup/CHANGELOG.md +++ b/packages/manager/apps/pci-volume-backup/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.5.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-volume-backup-app@0.5.1...@ovh-ux/manager-pci-volume-backup-app@0.5.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-volume-backup-app + + + + + ## [0.5.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-volume-backup-app@0.5.0...@ovh-ux/manager-pci-volume-backup-app@0.5.1) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-pci-volume-backup-app diff --git a/packages/manager/apps/pci-volume-backup/package.json b/packages/manager/apps/pci-volume-backup/package.json index 847aa7aeff75..a1773d226f25 100644 --- a/packages/manager/apps/pci-volume-backup/package.json +++ b/packages/manager/apps/pci-volume-backup/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-volume-backup-app", - "version": "0.5.1", + "version": "0.5.2", "private": true, "description": "PCI volume backup react application ", "repository": { @@ -25,7 +25,7 @@ "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-pci-common": "^2.8.0", "@ovh-ux/manager-react-components": "2.43.1", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/request-tagger": "^0.6.0", "@ovhcloud/ods-components": "18.6.2", diff --git a/packages/manager/apps/pci-volume-snapshot/CHANGELOG.md b/packages/manager/apps/pci-volume-snapshot/CHANGELOG.md index 00dec9bcf993..a63be5f01119 100644 --- a/packages/manager/apps/pci-volume-snapshot/CHANGELOG.md +++ b/packages/manager/apps/pci-volume-snapshot/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.9.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-volume-snapshot-app@0.9.1...@ovh-ux/manager-pci-volume-snapshot-app@0.9.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-volume-snapshot-app + + + + + ## [0.9.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-volume-snapshot-app@0.9.0...@ovh-ux/manager-pci-volume-snapshot-app@0.9.1) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-pci-volume-snapshot-app diff --git a/packages/manager/apps/pci-volume-snapshot/package.json b/packages/manager/apps/pci-volume-snapshot/package.json index ca21dc6ad42d..50b39ce070e7 100644 --- a/packages/manager/apps/pci-volume-snapshot/package.json +++ b/packages/manager/apps/pci-volume-snapshot/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-volume-snapshot-app", - "version": "0.9.1", + "version": "0.9.2", "private": true, "description": "PCI Volume Snapshot react app", "type": "module", @@ -18,9 +18,9 @@ "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-pci-common": "^2.8.0", "@ovh-ux/manager-react-components": "2.43.1", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-components": "18.6.4", "@ovhcloud/ods-themes": "18.6.4", "@tanstack/react-query": "5.90.11", diff --git a/packages/manager/apps/pci-vouchers/CHANGELOG.md b/packages/manager/apps/pci-vouchers/CHANGELOG.md index 3c9dccd4bc49..6835aef3065a 100644 --- a/packages/manager/apps/pci-vouchers/CHANGELOG.md +++ b/packages/manager/apps/pci-vouchers/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.14.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-vouchers-app@0.14.1...@ovh-ux/manager-pci-vouchers-app@0.14.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-vouchers-app + + + + + ## [0.14.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-vouchers-app@0.14.0...@ovh-ux/manager-pci-vouchers-app@0.14.1) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-pci-vouchers-app diff --git a/packages/manager/apps/pci-vouchers/package.json b/packages/manager/apps/pci-vouchers/package.json index 6aa2dc0849d8..26803c51f995 100644 --- a/packages/manager/apps/pci-vouchers/package.json +++ b/packages/manager/apps/pci-vouchers/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-vouchers-app", - "version": "0.14.1", + "version": "0.14.2", "private": true, "description": "PCI Vouchers react app", "type": "module", @@ -18,9 +18,9 @@ "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-pci-common": "^0.17.0", "@ovh-ux/manager-react-components": "1.48.0", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-common-core": "17.2.2", "@ovhcloud/ods-common-theming": "17.2.2", "@ovhcloud/ods-components": "17.2.2", diff --git a/packages/manager/apps/pci-workflow/CHANGELOG.md b/packages/manager/apps/pci-workflow/CHANGELOG.md index 58cf3e848807..651002ee52f6 100644 --- a/packages/manager/apps/pci-workflow/CHANGELOG.md +++ b/packages/manager/apps/pci-workflow/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.12.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-workflow-app@0.12.1...@ovh-ux/manager-pci-workflow-app@0.12.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-workflow-app + + + + + ## [0.12.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-workflow-app@0.12.0...@ovh-ux/manager-pci-workflow-app@0.12.1) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-pci-workflow-app diff --git a/packages/manager/apps/pci-workflow/package.json b/packages/manager/apps/pci-workflow/package.json index f0588f2647db..ab1793908ce6 100644 --- a/packages/manager/apps/pci-workflow/package.json +++ b/packages/manager/apps/pci-workflow/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-workflow-app", - "version": "0.12.1", + "version": "0.12.2", "private": true, "description": "PCI Workflow react app", "type": "module", @@ -19,9 +19,9 @@ "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-pci-common": "^0.17.0", "@ovh-ux/manager-react-components": "1.46.0", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-common-core": "17.2.2", "@ovhcloud/ods-common-stencil": "17.2.2", "@ovhcloud/ods-common-theming": "17.2.2", diff --git a/packages/manager/apps/pci/CHANGELOG.md b/packages/manager/apps/pci/CHANGELOG.md index adaa885d478d..8d765a56eb0d 100644 --- a/packages/manager/apps/pci/CHANGELOG.md +++ b/packages/manager/apps/pci/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.1.21](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-app@5.1.20...@ovh-ux/manager-pci-app@5.1.21) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-pci-app + + + + + ## [5.1.20](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-app@5.1.19...@ovh-ux/manager-pci-app@5.1.20) (2026-02-26) **Note:** Version bump only for package @ovh-ux/manager-pci-app diff --git a/packages/manager/apps/pci/package.json b/packages/manager/apps/pci/package.json index 202317e8e068..4287b97d5a31 100644 --- a/packages/manager/apps/pci/package.json +++ b/packages/manager/apps/pci/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-app", - "version": "5.1.20", + "version": "5.1.21", "private": true, "description": "Public Cloud Instance standalone application.", "repository": { @@ -28,7 +28,7 @@ "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", "@ovh-ux/manager-pci": "^6.102.1", "@ovh-ux/manager-trusted-nic": "^1.2.2", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-at-internet-ui-router-plugin": "^3.5.6", "@ovh-ux/ng-log-live-tail": "^2.7.2", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", diff --git a/packages/manager/apps/procedures/CHANGELOG.md b/packages/manager/apps/procedures/CHANGELOG.md index 438355ed659a..fc48f9818dfd 100644 --- a/packages/manager/apps/procedures/CHANGELOG.md +++ b/packages/manager/apps/procedures/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.19.11](https://github.com/ovh/manager/compare/@ovh-ux/manager-procedures-app@0.19.10...@ovh-ux/manager-procedures-app@0.19.11) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-procedures-app + + + + + ## [0.19.10](https://github.com/ovh/manager/compare/@ovh-ux/manager-procedures-app@0.19.9...@ovh-ux/manager-procedures-app@0.19.10) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-procedures-app diff --git a/packages/manager/apps/procedures/package.json b/packages/manager/apps/procedures/package.json index 644b13f242d7..dce23d25c274 100644 --- a/packages/manager/apps/procedures/package.json +++ b/packages/manager/apps/procedures/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-procedures-app", - "version": "0.19.10", + "version": "0.19.11", "private": true, "description": "Procedures application", "repository": { @@ -26,7 +26,7 @@ "@ovh-ux/manager-core-sso": "^0.7.2", "@ovh-ux/manager-react-components": "^1.48.0", "@ovh-ux/manager-tailwind-config": "^0.6.2", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-common-core": "17.2.1", "@ovhcloud/ods-common-theming": "17.2.1", "@ovhcloud/ods-components": "17.2.1", diff --git a/packages/manager/apps/public-cloud/CHANGELOG.md b/packages/manager/apps/public-cloud/CHANGELOG.md index e34afeaefda0..c3e10f3756ef 100644 --- a/packages/manager/apps/public-cloud/CHANGELOG.md +++ b/packages/manager/apps/public-cloud/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [7.12.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-public-cloud@7.12.1...@ovh-ux/manager-public-cloud@7.12.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-public-cloud + + + + + ## [7.12.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-public-cloud@7.12.0...@ovh-ux/manager-public-cloud@7.12.1) (2026-02-26) **Note:** Version bump only for package @ovh-ux/manager-public-cloud diff --git a/packages/manager/apps/public-cloud/package.json b/packages/manager/apps/public-cloud/package.json index 9a337f0ebeb3..0ece7a94d54d 100644 --- a/packages/manager/apps/public-cloud/package.json +++ b/packages/manager/apps/public-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-public-cloud", - "version": "7.12.1", + "version": "7.12.2", "private": true, "description": "OVHcloud Public Cloud control panel.", "repository": { @@ -32,7 +32,7 @@ "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", "@ovh-ux/manager-pci": "^6.102.1", "@ovh-ux/manager-telecom-styles": "^4.8.8", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-at-internet-ui-router-plugin": "^3.5.6", "@ovh-ux/ng-log-live-tail": "^2.7.2", "@ovh-ux/ng-ovh-actions-menu": "^5.1.7", @@ -53,13 +53,13 @@ "@ovh-ux/ng-ovh-utils": "^14.5.5", "@ovh-ux/ng-pagination-front": "^10.3.7", "@ovh-ux/ng-q-allsettled": "^2.1.7", - "@ovh-ux/ng-shell-tracking": "^0.7.39", + "@ovh-ux/ng-shell-tracking": "^0.7.40", "@ovh-ux/ng-tail-logs": "^2.2.6", "@ovh-ux/ng-translate-async-loader": "^2.2.7", "@ovh-ux/ng-ui-router-breadcrumb": "^1.4.3", "@ovh-ux/ng-ui-router-layout": "^4.3.7", "@ovh-ux/request-tagger": "^0.6.0", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovh-ux/ui-kit": "^6.10.5", "@uirouter/angularjs": "^1.0.23", "angular": "^1.7.5", diff --git a/packages/manager/apps/sap-features-hub/CHANGELOG.md b/packages/manager/apps/sap-features-hub/CHANGELOG.md index 1e496ea3bd1e..476ba4d94981 100644 --- a/packages/manager/apps/sap-features-hub/CHANGELOG.md +++ b/packages/manager/apps/sap-features-hub/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.6.19](https://github.com/ovh/manager/compare/@ovh-ux/manager-sap-features-hub-app@0.6.18...@ovh-ux/manager-sap-features-hub-app@0.6.19) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-sap-features-hub-app + + + + + ## [0.6.18](https://github.com/ovh/manager/compare/@ovh-ux/manager-sap-features-hub-app@0.6.17...@ovh-ux/manager-sap-features-hub-app@0.6.18) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-sap-features-hub-app diff --git a/packages/manager/apps/sap-features-hub/package.json b/packages/manager/apps/sap-features-hub/package.json index 5b14417c83bf..0aa99c8a2c9f 100644 --- a/packages/manager/apps/sap-features-hub/package.json +++ b/packages/manager/apps/sap-features-hub/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-sap-features-hub-app", - "version": "0.6.18", + "version": "0.6.19", "private": true, "description": "Manage SAP workloads in HostedPrivateCloud", "repository": { @@ -25,7 +25,7 @@ "@ovh-ux/manager-core-api": "^0.21.2", "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-react-components": "^2.43.1", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/request-tagger": "^0.6.0", "@ovhcloud/ods-components": "^18.6.4", diff --git a/packages/manager/apps/sign-up/CHANGELOG.md b/packages/manager/apps/sign-up/CHANGELOG.md index 65f5bf8e2016..b94327f7e257 100644 --- a/packages/manager/apps/sign-up/CHANGELOG.md +++ b/packages/manager/apps/sign-up/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.6.16](https://github.com/ovh/manager/compare/@ovh-ux/sign-up-app@4.6.15...@ovh-ux/sign-up-app@4.6.16) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/sign-up-app + + + + + ## [4.6.15](https://github.com/ovh/manager/compare/@ovh-ux/sign-up-app@4.6.14...@ovh-ux/sign-up-app@4.6.15) (2026-02-05) **Note:** Version bump only for package @ovh-ux/sign-up-app diff --git a/packages/manager/apps/sign-up/package.json b/packages/manager/apps/sign-up/package.json index 554533ab4bfa..ce9c2616e28a 100644 --- a/packages/manager/apps/sign-up/package.json +++ b/packages/manager/apps/sign-up/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/sign-up-app", - "version": "4.6.15", + "version": "4.6.16", "private": true, "description": "Sign-up form application.", "repository": { @@ -22,7 +22,7 @@ "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-cookie-policy": "^1.6.1", "@ovh-ux/manager-core": "^13.4.4", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-at-internet-ui-router-plugin": "^3.5.6", "@ovh-ux/ng-ovh-feature-flipping": "^1.1.8", "@ovh-ux/ng-ovh-http": "^5.1.7", diff --git a/packages/manager/apps/sms/CHANGELOG.md b/packages/manager/apps/sms/CHANGELOG.md index aa83259e4458..f5bec0b1ec9f 100644 --- a/packages/manager/apps/sms/CHANGELOG.md +++ b/packages/manager/apps/sms/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [9.0.94](https://github.com/ovh/manager/compare/@ovh-ux/manager-sms-app@9.0.93...@ovh-ux/manager-sms-app@9.0.94) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-sms-app + + + + + ## [9.0.93](https://github.com/ovh/manager/compare/@ovh-ux/manager-sms-app@9.0.92...@ovh-ux/manager-sms-app@9.0.93) (2026-02-20) **Note:** Version bump only for package @ovh-ux/manager-sms-app diff --git a/packages/manager/apps/sms/package.json b/packages/manager/apps/sms/package.json index a8858e3f06bb..fe8198b0db1d 100644 --- a/packages/manager/apps/sms/package.json +++ b/packages/manager/apps/sms/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-sms-app", - "version": "9.0.93", + "version": "9.0.94", "private": true, "description": "SMS standalone application.", "repository": { @@ -23,7 +23,7 @@ "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", "@ovh-ux/manager-sms": "^8.20.9", "@ovh-ux/manager-telecom-styles": "^4.8.8", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-at-internet-ui-router-plugin": "^3.5.6", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", "@ovh-ux/ng-ovh-checkbox-table": "^2.1.7", diff --git a/packages/manager/apps/support/CHANGELOG.md b/packages/manager/apps/support/CHANGELOG.md index fe858ca848fe..e1ecd1abb11a 100644 --- a/packages/manager/apps/support/CHANGELOG.md +++ b/packages/manager/apps/support/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.73](https://github.com/ovh/manager/compare/@ovh-ux/manager-support-app@3.0.72...@ovh-ux/manager-support-app@3.0.73) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-support-app + + + + + ## [3.0.72](https://github.com/ovh/manager/compare/@ovh-ux/manager-support-app@3.0.71...@ovh-ux/manager-support-app@3.0.72) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-support-app diff --git a/packages/manager/apps/support/package.json b/packages/manager/apps/support/package.json index 9f76d67b0657..7cbecafb3a57 100644 --- a/packages/manager/apps/support/package.json +++ b/packages/manager/apps/support/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-support-app", - "version": "3.0.72", + "version": "3.0.73", "private": true, "description": "Support standalone application.", "repository": { @@ -18,7 +18,7 @@ "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-core": "^13.4.4", "@ovh-ux/manager-support": "^2.1.45", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", "@ovh-ux/ng-ovh-http": "^5.1.7", "@ovh-ux/ng-ovh-proxy-request": "^2.1.7", diff --git a/packages/manager/apps/telecom-dashboard/CHANGELOG.md b/packages/manager/apps/telecom-dashboard/CHANGELOG.md index 31ffc57ec13d..45c31e804da9 100644 --- a/packages/manager/apps/telecom-dashboard/CHANGELOG.md +++ b/packages/manager/apps/telecom-dashboard/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.0.83](https://github.com/ovh/manager/compare/@ovh-ux/manager-telecom-dashboard-app@8.0.82...@ovh-ux/manager-telecom-dashboard-app@8.0.83) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-telecom-dashboard-app + + + + + ## [8.0.82](https://github.com/ovh/manager/compare/@ovh-ux/manager-telecom-dashboard-app@8.0.81...@ovh-ux/manager-telecom-dashboard-app@8.0.82) (2026-02-20) diff --git a/packages/manager/apps/telecom-dashboard/package.json b/packages/manager/apps/telecom-dashboard/package.json index c3f04b8437be..f818402f51a8 100644 --- a/packages/manager/apps/telecom-dashboard/package.json +++ b/packages/manager/apps/telecom-dashboard/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-telecom-dashboard-app", - "version": "8.0.82", + "version": "8.0.83", "private": true, "description": "Telecom dashboard standalone application.", "repository": { @@ -22,7 +22,7 @@ "@ovh-ux/manager-core": "^13.4.4", "@ovh-ux/manager-telecom-dashboard": "^6.11.5", "@ovh-ux/manager-telecom-styles": "^4.8.8", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-at-internet-ui-router-plugin": "^3.5.6", "@ovh-ux/ng-ovh-checkbox-table": "^2.1.7", "@ovh-ux/ng-ovh-http": "^5.1.7", diff --git a/packages/manager/apps/telecom/CHANGELOG.md b/packages/manager/apps/telecom/CHANGELOG.md index 54bed3c73e8f..bae2045ba368 100644 --- a/packages/manager/apps/telecom/CHANGELOG.md +++ b/packages/manager/apps/telecom/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [16.26.8](https://github.com/ovh/manager/compare/@ovh-ux/manager-telecom@16.26.7...@ovh-ux/manager-telecom@16.26.8) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-telecom + + + + + ## [16.26.7](https://github.com/ovh/manager/compare/@ovh-ux/manager-telecom@16.26.6...@ovh-ux/manager-telecom@16.26.7) (2026-02-26) diff --git a/packages/manager/apps/telecom/package.json b/packages/manager/apps/telecom/package.json index 73191844afe5..19ea7263f85d 100644 --- a/packages/manager/apps/telecom/package.json +++ b/packages/manager/apps/telecom/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-telecom", - "version": "16.26.7", + "version": "16.26.8", "private": true, "description": "OVHcloud Telecom control panel.", "repository": { @@ -36,7 +36,7 @@ "@ovh-ux/manager-telecom-dashboard": "^6.11.5", "@ovh-ux/manager-telecom-styles": "^4.8.8", "@ovh-ux/manager-telecom-task": "^6.5.4", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-at-internet-ui-router-plugin": "^3.5.6", "@ovh-ux/ng-ovh-actions-menu": "^5.1.7", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", @@ -64,14 +64,14 @@ "@ovh-ux/ng-ovh-utils": "^14.5.5", "@ovh-ux/ng-pagination-front": "^10.3.7", "@ovh-ux/ng-q-allsettled": "^2.1.7", - "@ovh-ux/ng-shell-tracking": "^0.7.39", + "@ovh-ux/ng-shell-tracking": "^0.7.40", "@ovh-ux/ng-tail-logs": "^2.2.6", "@ovh-ux/ng-translate-async-loader": "^2.2.7", "@ovh-ux/ng-ui-router-breadcrumb": "^1.4.3", "@ovh-ux/ng-ui-router-layout": "^4.3.7", "@ovh-ux/ng-ui-router-title": "^3.1.7", "@ovh-ux/request-tagger": "^0.6.0", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovh-ux/ui-kit": "^6.10.5", "@uirouter/angularjs": "^1.0.23", "CSV-JS": "^1.0.0", diff --git a/packages/manager/apps/veeam-backup/CHANGELOG.md b/packages/manager/apps/veeam-backup/CHANGELOG.md index a3dd15e73fbf..2d5ab8498754 100644 --- a/packages/manager/apps/veeam-backup/CHANGELOG.md +++ b/packages/manager/apps/veeam-backup/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.22.21](https://github.com/ovh/manager/compare/@ovh-ux/manager-veeam-backup-app@0.22.20...@ovh-ux/manager-veeam-backup-app@0.22.21) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-veeam-backup-app + + + + + ## [0.22.20](https://github.com/ovh/manager/compare/@ovh-ux/manager-veeam-backup-app@0.22.19...@ovh-ux/manager-veeam-backup-app@0.22.20) (2026-02-11) **Note:** Version bump only for package @ovh-ux/manager-veeam-backup-app diff --git a/packages/manager/apps/veeam-backup/package.json b/packages/manager/apps/veeam-backup/package.json index fac934b4b687..8912f3f4f2d8 100644 --- a/packages/manager/apps/veeam-backup/package.json +++ b/packages/manager/apps/veeam-backup/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-veeam-backup-app", - "version": "0.22.20", + "version": "0.22.21", "private": true, "description": "veeam backup app", "repository": { @@ -27,7 +27,7 @@ "@ovh-ux/manager-module-order": "^0.14.1", "@ovh-ux/manager-module-vcd-api": "^0.11.3", "@ovh-ux/manager-react-components": "^2.43.1", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/request-tagger": "^0.6.0", "@ovhcloud/ods-components": "18.6.4", diff --git a/packages/manager/apps/veeam-enterprise/CHANGELOG.md b/packages/manager/apps/veeam-enterprise/CHANGELOG.md index 5112dbfba8fa..4f2d5579752e 100644 --- a/packages/manager/apps/veeam-enterprise/CHANGELOG.md +++ b/packages/manager/apps/veeam-enterprise/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.72](https://github.com/ovh/manager/compare/@ovh-ux/manager-veeam-enterprise-app@3.0.71...@ovh-ux/manager-veeam-enterprise-app@3.0.72) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-veeam-enterprise-app + + + + + ## [3.0.71](https://github.com/ovh/manager/compare/@ovh-ux/manager-veeam-enterprise-app@3.0.70...@ovh-ux/manager-veeam-enterprise-app@3.0.71) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-veeam-enterprise-app diff --git a/packages/manager/apps/veeam-enterprise/package.json b/packages/manager/apps/veeam-enterprise/package.json index ef1041f5e4b3..8b9106a20e8f 100644 --- a/packages/manager/apps/veeam-enterprise/package.json +++ b/packages/manager/apps/veeam-enterprise/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-veeam-enterprise-app", - "version": "3.0.71", + "version": "3.0.72", "private": true, "description": "Veeam Enterprise standalone application.", "repository": { @@ -21,7 +21,7 @@ "@ovh-ux/manager-core": "^13.4.4", "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", "@ovh-ux/manager-veeam-enterprise": "^1.13.3", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", "@ovh-ux/ng-ovh-cloud-universe-components": "^2.19.0", "@ovh-ux/ng-ovh-feature-flipping": "^1.1.8", diff --git a/packages/manager/apps/vps/CHANGELOG.md b/packages/manager/apps/vps/CHANGELOG.md index 8783606897a5..a59c14d18f49 100644 --- a/packages/manager/apps/vps/CHANGELOG.md +++ b/packages/manager/apps/vps/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.1.120](https://github.com/ovh/manager/compare/@ovh-ux/manager-vps-app@3.1.119...@ovh-ux/manager-vps-app@3.1.120) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-vps-app + + + + + ## [3.1.119](https://github.com/ovh/manager/compare/@ovh-ux/manager-vps-app@3.1.118...@ovh-ux/manager-vps-app@3.1.119) (2026-02-26) **Note:** Version bump only for package @ovh-ux/manager-vps-app diff --git a/packages/manager/apps/vps/package.json b/packages/manager/apps/vps/package.json index 78182e674584..3bdc34d74031 100644 --- a/packages/manager/apps/vps/package.json +++ b/packages/manager/apps/vps/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-vps-app", - "version": "3.1.119", + "version": "3.1.120", "private": true, "description": "VPS standalone application.", "repository": { @@ -27,7 +27,7 @@ "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", "@ovh-ux/manager-product-offers": "^5.6.2", "@ovh-ux/manager-vps": "^2.50.15", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", "@ovh-ux/ng-ovh-chart": "^1.3.5", "@ovh-ux/ng-ovh-cloud-universe-components": "^2.19.0", diff --git a/packages/manager/apps/vrack-services/CHANGELOG.md b/packages/manager/apps/vrack-services/CHANGELOG.md index 917657705919..ea613438e413 100644 --- a/packages/manager/apps/vrack-services/CHANGELOG.md +++ b/packages/manager/apps/vrack-services/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.26.23](https://github.com/ovh/manager/compare/@ovh-ux/manager-vrack-services-app@0.26.22...@ovh-ux/manager-vrack-services-app@0.26.23) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-vrack-services-app + + + + + ## [0.26.22](https://github.com/ovh/manager/compare/@ovh-ux/manager-vrack-services-app@0.26.21...@ovh-ux/manager-vrack-services-app@0.26.22) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-vrack-services-app diff --git a/packages/manager/apps/vrack-services/package.json b/packages/manager/apps/vrack-services/package.json index dfc3d81c1988..5088663d366a 100644 --- a/packages/manager/apps/vrack-services/package.json +++ b/packages/manager/apps/vrack-services/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-vrack-services-app", - "version": "0.26.22", + "version": "0.26.23", "private": true, "description": "OVHcloud VrackServices app", "repository": { @@ -27,7 +27,7 @@ "@ovh-ux/manager-module-order": "^0.14.1", "@ovh-ux/manager-network-common": "^0.9.0", "@ovh-ux/manager-react-components": "^2.43.1", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/request-tagger": "^0.6.0", "@ovhcloud/ods-components": "^18.6.2", diff --git a/packages/manager/apps/vrack/CHANGELOG.md b/packages/manager/apps/vrack/CHANGELOG.md index c1893108c692..f27b6ded25ea 100644 --- a/packages/manager/apps/vrack/CHANGELOG.md +++ b/packages/manager/apps/vrack/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.88](https://github.com/ovh/manager/compare/@ovh-ux/manager-vrack-app@3.0.87...@ovh-ux/manager-vrack-app@3.0.88) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-vrack-app + + + + + ## [3.0.87](https://github.com/ovh/manager/compare/@ovh-ux/manager-vrack-app@3.0.86...@ovh-ux/manager-vrack-app@3.0.87) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-vrack-app diff --git a/packages/manager/apps/vrack/package.json b/packages/manager/apps/vrack/package.json index e519ba92c604..90b58c011fa5 100644 --- a/packages/manager/apps/vrack/package.json +++ b/packages/manager/apps/vrack/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-vrack-app", - "version": "3.0.87", + "version": "3.0.88", "private": true, "description": "vRack standalone application.", "repository": { @@ -22,7 +22,7 @@ "@ovh-ux/manager-core": "^13.4.4", "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", "@ovh-ux/manager-vrack": "^1.22.0", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", "@ovh-ux/ng-ovh-cloud-universe-components": "^2.19.0", "@ovh-ux/ng-ovh-contracts": "^4.6.6", diff --git a/packages/manager/apps/web-domains/CHANGELOG.md b/packages/manager/apps/web-domains/CHANGELOG.md index 3dd214a9c9fa..5e0d2e5a5dc9 100644 --- a/packages/manager/apps/web-domains/CHANGELOG.md +++ b/packages/manager/apps/web-domains/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.13.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-web-domains-app@1.13.0...@ovh-ux/manager-web-domains-app@1.13.1) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-web-domains-app + + + + + # [1.13.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-web-domains-app@1.12.1...@ovh-ux/manager-web-domains-app@1.13.0) (2026-02-27) diff --git a/packages/manager/apps/web-domains/package.json b/packages/manager/apps/web-domains/package.json index 09e09a83923e..763d948572aa 100644 --- a/packages/manager/apps/web-domains/package.json +++ b/packages/manager/apps/web-domains/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-web-domains-app", - "version": "1.13.0", + "version": "1.13.1", "private": true, "description": "Domains, Alldom and Domain reseller program management", "repository": { @@ -28,8 +28,8 @@ "@ovh-ux/manager-module-order": "^0.12.2", "@ovh-ux/manager-react-components": "^2.43.1", "@ovh-ux/manager-react-core-application": "^0.14.3", - "@ovh-ux/manager-react-shell-client": "^1.2.3", - "@ovh-ux/muk": "^1.2.3", + "@ovh-ux/manager-react-shell-client": "^1.2.4", + "@ovh-ux/muk": "^1.2.4", "@ovh-ux/request-tagger": "^0.6.0", "@ovh-ux/url-builder": "^2.4.3", "@ovhcloud/ods-components": "^18.6.2", diff --git a/packages/manager/apps/web-hosting/CHANGELOG.md b/packages/manager/apps/web-hosting/CHANGELOG.md index e4fc0909c371..343e8e0f73f9 100644 --- a/packages/manager/apps/web-hosting/CHANGELOG.md +++ b/packages/manager/apps/web-hosting/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.18.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-web-hosting-app@0.18.1...@ovh-ux/manager-web-hosting-app@0.18.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-web-hosting-app + + + + + ## [0.18.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-web-hosting-app@0.18.0...@ovh-ux/manager-web-hosting-app@0.18.1) (2026-02-27) diff --git a/packages/manager/apps/web-hosting/package.json b/packages/manager/apps/web-hosting/package.json index 90320469b773..9bdb5824bd17 100644 --- a/packages/manager/apps/web-hosting/package.json +++ b/packages/manager/apps/web-hosting/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-web-hosting-app", - "version": "0.18.1", + "version": "0.18.2", "private": true, "description": "Manage web hostings in the OVH Control Panel", "repository": { @@ -28,12 +28,12 @@ "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-module-common-api": "^0.6.7", "@ovh-ux/manager-react-components": "^2.43.1", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/manager-tailwind-config": "^0.6.2", "@ovh-ux/muk": "^0.13.3", "@ovh-ux/request-tagger": "^0.6.0", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-react": "^19.3.0", "@ovhcloud/ods-themes": "^19.3.0", "@tanstack/react-query": "^5.51.21", diff --git a/packages/manager/apps/web-office/CHANGELOG.md b/packages/manager/apps/web-office/CHANGELOG.md index 11f2c159f54a..05b8d27287a8 100644 --- a/packages/manager/apps/web-office/CHANGELOG.md +++ b/packages/manager/apps/web-office/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.7.13](https://github.com/ovh/manager/compare/@ovh-ux/manager-web-office-app@0.7.12...@ovh-ux/manager-web-office-app@0.7.13) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-web-office-app + + + + + ## [0.7.12](https://github.com/ovh/manager/compare/@ovh-ux/manager-web-office-app@0.7.11...@ovh-ux/manager-web-office-app@0.7.12) (2026-02-16) diff --git a/packages/manager/apps/web-office/package.json b/packages/manager/apps/web-office/package.json index 8480d191596c..bb009f1ec78e 100644 --- a/packages/manager/apps/web-office/package.json +++ b/packages/manager/apps/web-office/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-web-office-app", - "version": "0.7.12", + "version": "0.7.13", "private": true, "description": "React app for web office 365", "repository": { @@ -27,12 +27,12 @@ "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-module-common-api": "0.6.4", "@ovh-ux/manager-module-order": "^0.14.1", - "@ovh-ux/manager-react-core-application": "^0.15.4", - "@ovh-ux/manager-react-shell-client": "^1.2.3", + "@ovh-ux/manager-react-core-application": "^0.15.5", + "@ovh-ux/manager-react-shell-client": "^1.2.4", "@ovh-ux/manager-tailwind-config": "^0.6.2", "@ovh-ux/muk": "^0.10.7", "@ovh-ux/request-tagger": "^0.6.0", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-react": "^19.3.0", "@ovhcloud/ods-themes": "^19.3.0", "@tanstack/react-query": "^5.90.10", diff --git a/packages/manager/apps/web-ongoing-operations/CHANGELOG.md b/packages/manager/apps/web-ongoing-operations/CHANGELOG.md index 35e5faebe11b..4cc3e510746b 100644 --- a/packages/manager/apps/web-ongoing-operations/CHANGELOG.md +++ b/packages/manager/apps/web-ongoing-operations/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.23.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-web-ongoing-operations-app@1.23.0...@ovh-ux/manager-web-ongoing-operations-app@1.23.1) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-web-ongoing-operations-app + + + + + # [1.23.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-web-ongoing-operations-app@1.22.0...@ovh-ux/manager-web-ongoing-operations-app@1.23.0) (2026-02-27) diff --git a/packages/manager/apps/web-ongoing-operations/package.json b/packages/manager/apps/web-ongoing-operations/package.json index 7306d9ab5415..b144e0b845c3 100644 --- a/packages/manager/apps/web-ongoing-operations/package.json +++ b/packages/manager/apps/web-ongoing-operations/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-web-ongoing-operations-app", - "version": "1.23.0", + "version": "1.23.1", "private": true, "description": "Domain And DNS ongoing operations", "repository": { @@ -25,7 +25,7 @@ "@ovh-ux/manager-core-api": "^0.21.2", "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-react-components": "2.43.1", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/request-tagger": "^0.6.0", "@ovhcloud/ods-components": "18.6.2", diff --git a/packages/manager/apps/web/CHANGELOG.md b/packages/manager/apps/web/CHANGELOG.md index c72da98fd37a..ba5393b3265a 100644 --- a/packages/manager/apps/web/CHANGELOG.md +++ b/packages/manager/apps/web/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [19.37.3](https://github.com/ovh/manager/compare/@ovh-ux/manager-web@19.37.2...@ovh-ux/manager-web@19.37.3) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-web + + + + + ## [19.37.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-web@19.37.1...@ovh-ux/manager-web@19.37.2) (2026-02-27) diff --git a/packages/manager/apps/web/package.json b/packages/manager/apps/web/package.json index 750680189e23..e42d26a71327 100644 --- a/packages/manager/apps/web/package.json +++ b/packages/manager/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-web", - "version": "19.37.2", + "version": "19.37.3", "private": true, "description": "OVHcloud Web control panel.", "repository": { @@ -33,7 +33,7 @@ "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", "@ovh-ux/manager-phone-prefix": "^1.1.7", "@ovh-ux/manager-product-offers": "^5.6.2", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-at-internet-ui-router-plugin": "^3.5.6", "@ovh-ux/ng-log-live-tail": "^2.7.2", "@ovh-ux/ng-ovh-actions-menu": "^5.1.7", @@ -57,13 +57,13 @@ "@ovh-ux/ng-ovh-web-universe-components": "^9.21.3", "@ovh-ux/ng-pagination-front": "^10.3.7", "@ovh-ux/ng-q-allsettled": "^2.1.7", - "@ovh-ux/ng-shell-tracking": "^0.7.39", + "@ovh-ux/ng-shell-tracking": "^0.7.40", "@ovh-ux/ng-tail-logs": "^2.2.6", "@ovh-ux/ng-translate-async-loader": "^2.2.7", "@ovh-ux/ng-ui-router-breadcrumb": "^1.4.3", "@ovh-ux/ng-ui-router-layout": "^4.3.7", "@ovh-ux/request-tagger": "^0.6.0", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovh-ux/ui-kit": "^6.10.5", "@uirouter/angularjs": "1.0.23", "URIjs": "^1.14.0", diff --git a/packages/manager/apps/zimbra/CHANGELOG.md b/packages/manager/apps/zimbra/CHANGELOG.md index 703a49551d58..be2a50b42ca1 100644 --- a/packages/manager/apps/zimbra/CHANGELOG.md +++ b/packages/manager/apps/zimbra/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.43.5](https://github.com/ovh/manager/compare/@ovh-ux/manager-zimbra-app@0.43.4...@ovh-ux/manager-zimbra-app@0.43.5) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-zimbra-app + + + + + ## [0.43.4](https://github.com/ovh/manager/compare/@ovh-ux/manager-zimbra-app@0.43.3...@ovh-ux/manager-zimbra-app@0.43.4) (2026-02-17) diff --git a/packages/manager/apps/zimbra/package.json b/packages/manager/apps/zimbra/package.json index 95971c15cc40..0c6e745a3ecf 100644 --- a/packages/manager/apps/zimbra/package.json +++ b/packages/manager/apps/zimbra/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-zimbra-app", - "version": "0.43.4", + "version": "0.43.5", "private": true, "description": "zimbra react app", "repository": { @@ -27,12 +27,12 @@ "@ovh-ux/manager-core-api": "^0.21.2", "@ovh-ux/manager-core-utils": "^0.5.0", "@ovh-ux/manager-module-order": "^0.14.1", - "@ovh-ux/manager-react-core-application": "^0.15.4", + "@ovh-ux/manager-react-core-application": "^0.15.5", "@ovh-ux/manager-react-shell-client": "^0.11.2", "@ovh-ux/manager-tailwind-config": "^0.6.2", "@ovh-ux/muk": "1.2.1", "@ovh-ux/request-tagger": "^0.6.0", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovhcloud/ods-react": "^19.5.0", "@ovhcloud/ods-themes": "^19.5.0", "@tanstack/react-query": "5.51.21", diff --git a/packages/manager/core/application/CHANGELOG.md b/packages/manager/core/application/CHANGELOG.md index a092a8524bbd..4cf540416f86 100644 --- a/packages/manager/core/application/CHANGELOG.md +++ b/packages/manager/core/application/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.15.5](https://github.com/ovh/manager/compare/@ovh-ux/manager-react-core-application@0.15.4...@ovh-ux/manager-react-core-application@0.15.5) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-react-core-application + + + + + ## [0.15.4](https://github.com/ovh/manager/compare/@ovh-ux/manager-react-core-application@0.15.3...@ovh-ux/manager-react-core-application@0.15.4) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-react-core-application diff --git a/packages/manager/core/application/package.json b/packages/manager/core/application/package.json index 23beaa0df7a0..915ecf9524c8 100644 --- a/packages/manager/core/application/package.json +++ b/packages/manager/core/application/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-react-core-application", - "version": "0.15.4", + "version": "0.15.5", "private": true, "description": "", "license": "BSD-3-Clause", @@ -23,9 +23,9 @@ "dependencies": { "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-core-api": "^0.21.2", - "@ovh-ux/manager-react-shell-client": "^1.2.3", - "@ovh-ux/ovh-at-internet": "^0.29.4", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/manager-react-shell-client": "^1.2.4", + "@ovh-ux/ovh-at-internet": "^0.30.0", + "@ovh-ux/shell": "^4.10.7", "@tanstack/react-query": "^5.51.21", "generouted": "1.6.4", "i18next": "^23.8.2", diff --git a/packages/manager/core/shell-client/CHANGELOG.md b/packages/manager/core/shell-client/CHANGELOG.md index 2f980bc1ede2..95b534d8138a 100644 --- a/packages/manager/core/shell-client/CHANGELOG.md +++ b/packages/manager/core/shell-client/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.2.4](https://github.com/ovh/manager/compare/@ovh-ux/manager-react-shell-client@1.2.3...@ovh-ux/manager-react-shell-client@1.2.4) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-react-shell-client + + + + + ## [1.2.3](https://github.com/ovh/manager/compare/@ovh-ux/manager-react-shell-client@1.2.2...@ovh-ux/manager-react-shell-client@1.2.3) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-react-shell-client diff --git a/packages/manager/core/shell-client/package.json b/packages/manager/core/shell-client/package.json index 3f6584396311..9aa54fae5c5e 100644 --- a/packages/manager/core/shell-client/package.json +++ b/packages/manager/core/shell-client/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-react-shell-client", - "version": "1.2.3", + "version": "1.2.4", "description": "OVH manager react shell client", "license": "BSD-3-Clause", "author": "OVH SAS", @@ -21,9 +21,9 @@ }, "dependencies": { "@ovh-ux/manager-config": "^8.9.0", - "@ovh-ux/ovh-at-internet": "^0.29.4", + "@ovh-ux/ovh-at-internet": "^0.30.0", "@ovh-ux/request-tagger": "^0.6.0", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovh-ux/url-builder": "^2.4.3", "i18next": "^23.8.2", "i18next-http-backend": "^2.4.2" diff --git a/packages/manager/modules/account/CHANGELOG.md b/packages/manager/modules/account/CHANGELOG.md index b5b1eee784c4..850980164958 100644 --- a/packages/manager/modules/account/CHANGELOG.md +++ b/packages/manager/modules/account/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.21.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-account@0.21.1...@ovh-ux/manager-account@0.21.2) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-account + + + + + ## [0.21.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-account@0.21.0...@ovh-ux/manager-account@0.21.1) (2026-02-26) diff --git a/packages/manager/modules/account/package.json b/packages/manager/modules/account/package.json index 79597de7c04f..e241cc1f2d43 100644 --- a/packages/manager/modules/account/package.json +++ b/packages/manager/modules/account/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-account", - "version": "0.21.1", + "version": "0.21.2", "private": true, "description": "OVHcloud Account product", "repository": { @@ -20,7 +20,7 @@ "@ovh-ux/manager-beta-preference": "^1.0.6", "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-models": "^2.7.11", - "@ovh-ux/ng-at-internet": "^6.0.45", + "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-at-internet-ui-router-plugin": "^3.5.6", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", "@ovh-ux/ng-ovh-contacts": "^5.3.8", @@ -32,12 +32,12 @@ "@ovh-ux/ng-ovh-user-pref": "^2.1.7", "@ovh-ux/ng-ovh-utils": "^14.5.5", "@ovh-ux/ng-pagination-front": "^10.3.7", - "@ovh-ux/ng-shell-tracking": "^0.7.39", + "@ovh-ux/ng-shell-tracking": "^0.7.40", "@ovh-ux/ng-translate-async-loader": "^2.2.7", "@ovh-ux/ng-ui-router-breadcrumb": "^1.4.3", "@ovh-ux/ng-ui-router-layout": "^4.3.7", "@ovh-ux/request-tagger": "^0.6.0", - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "@ovh-ux/sign-up": "^3.3.18", "@ovh-ux/ui-kit": "^6.10.5", "@uirouter/angularjs": "^1.0.23", diff --git a/packages/manager/modules/gcj/CHANGELOG.md b/packages/manager/modules/gcj/CHANGELOG.md index 08d1f9484f01..e31876878828 100644 --- a/packages/manager/modules/gcj/CHANGELOG.md +++ b/packages/manager/modules/gcj/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.8.4](https://github.com/ovh/manager/compare/@ovh-ux/manager-gcj-module@0.8.3...@ovh-ux/manager-gcj-module@0.8.4) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/manager-gcj-module + + + + + ## [0.8.3](https://github.com/ovh/manager/compare/@ovh-ux/manager-gcj-module@0.8.2...@ovh-ux/manager-gcj-module@0.8.3) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-gcj-module diff --git a/packages/manager/modules/gcj/package.json b/packages/manager/modules/gcj/package.json index 9bb01ab2c97a..4c22c880baee 100644 --- a/packages/manager/modules/gcj/package.json +++ b/packages/manager/modules/gcj/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-gcj-module", - "version": "0.8.3", + "version": "0.8.4", "private": true, "description": "Generic Customer Journey components and hooks", "homepage": "https://github.com/ovh/manager/blob/master/packages/manager/modules/gcj/README.md", @@ -29,7 +29,7 @@ "test:coverage": "manager-test run --coverage" }, "dependencies": { - "@ovh-ux/shell": "^4.10.6", + "@ovh-ux/shell": "^4.10.7", "react-cookie": "^8.0.1", "react-responsive": "^9.0.0-beta.6", "tailwindcss": "^3.4.4" diff --git a/packages/manager/modules/logs-to-customer/CHANGELOG.md b/packages/manager/modules/logs-to-customer/CHANGELOG.md index 683902370cce..f65eddac13aa 100644 --- a/packages/manager/modules/logs-to-customer/CHANGELOG.md +++ b/packages/manager/modules/logs-to-customer/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [2.0.3](https://github.com/ovh/manager/compare/@ovh-ux/logs-to-customer@2.0.2...@ovh-ux/logs-to-customer@2.0.3) (2026-03-04) + +**Note:** Version bump only for package @ovh-ux/logs-to-customer + + + + + ## [2.0.2](https://github.com/ovh/manager/compare/@ovh-ux/logs-to-customer@2.0.1...@ovh-ux/logs-to-customer@2.0.2) (2026-02-19) **Note:** Version bump only for package @ovh-ux/logs-to-customer diff --git a/packages/manager/modules/logs-to-customer/package.json b/packages/manager/modules/logs-to-customer/package.json index d8896f70c102..38e28022c407 100644 --- a/packages/manager/modules/logs-to-customer/package.json +++ b/packages/manager/modules/logs-to-customer/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/logs-to-customer", - "version": "2.0.2", + "version": "2.0.3", "description": "OVHcloud - observability - logs to customer module", "license": "BSD-3-Clause", "author": "OVH SAS", @@ -46,7 +46,7 @@ "@ovh-ux/manager-static-analysis-kit": "*", "@ovh-ux/manager-tests-setup": "latest", "@ovh-ux/manager-vite-config": "*", - "@ovh-ux/muk": "*", + "@ovh-ux/muk": "^1.2.4", "@ovhcloud/ods-react": "19.5.0", "@ovhcloud/ods-themes": "19.5.0", "@tanstack/react-virtual": "3.10.9", From 26bedcf38f5f1f764e0e2af372b225dc13b97a90 Mon Sep 17 00:00:00 2001 From: Quentin Pavy Date: Tue, 3 Jun 2025 08:48:28 +0200 Subject: [PATCH 012/112] feat(dedicated.ola): ola revamp on server dashboard ref: #MANAGER-17110 Signed-off-by: Quentin Pavy --- .../src/network-tile/controller.js | 1 + .../src/network-tile/template.html | 26 ++++++-------- .../translations/Messages_fr_FR.json | 10 +++++- .../bm-server-components/src/ola/ola.class.js | 36 +++++++++++++++++-- .../src/ola/ola.constants.js | 7 ++++ 5 files changed, 61 insertions(+), 19 deletions(-) diff --git a/packages/manager/modules/bm-server-components/src/network-tile/controller.js b/packages/manager/modules/bm-server-components/src/network-tile/controller.js index 916c8386c4fd..3741bae8dbb8 100644 --- a/packages/manager/modules/bm-server-components/src/network-tile/controller.js +++ b/packages/manager/modules/bm-server-components/src/network-tile/controller.js @@ -28,6 +28,7 @@ export default class BmServerComponentsNetworkTileController { .finally(() => { this.loading = false; }); + this.olaMode = this.ola.getCurrentMode(); } loadVrackInfos() { diff --git a/packages/manager/modules/bm-server-components/src/network-tile/template.html b/packages/manager/modules/bm-server-components/src/network-tile/template.html index 9d84229e8ce3..40d785772bda 100644 --- a/packages/manager/modules/bm-server-components/src/network-tile/template.html +++ b/packages/manager/modules/bm-server-components/src/network-tile/template.html @@ -160,25 +160,21 @@ -
- - - - -
{ + const updatedIfaces = interfaces; + updatedIfaces[iface.type] = iface.mac.split(', '); + return updatedIfaces; + }, + {}, + ); + + if ( + (formattedInterfaces[this.constants.OLA_MODES.VRACK_AGGREGATION] + ?.length === 4 || + formattedInterfaces[this.constants.OLA_MODES.VRACK_AGGREGATION] + ?.length === 2) && + !formattedInterfaces[this.constants.OLA_MODES.PUBLIC_AGGREGATION] + ) { + return this.constants.OLA_MODES.FULL_LAG; + } + + if ( + formattedInterfaces[this.constants.OLA_MODES.VRACK_AGGREGATION] + ?.length === 2 && + formattedInterfaces[this.constants.OLA_MODES.PUBLIC_AGGREGATION] + ?.length === 2 + ) { + return this.constants.OLA_MODES.DOUBLE_LAG; + } + + return this.constants.OLA_MODES.AVAILABLE; + } + + return this.constants.OLA_MODES.UNAVAILABLE; } isActivated() { diff --git a/packages/manager/modules/bm-server-components/src/ola/ola.constants.js b/packages/manager/modules/bm-server-components/src/ola/ola.constants.js index a8846bc6f7c6..f4460cb2cc3a 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola.constants.js +++ b/packages/manager/modules/bm-server-components/src/ola/ola.constants.js @@ -1,7 +1,14 @@ export const OLA_PLAN_CODE = 'ovh-link-aggregation-infra'; export const OLA_MODES = { + DOUBLE_LAG: 'double_lag', + FULL_LAG: 'full_lag', + AVAILABLE: 'available', + UNAVAILABLE: 'unavailable', VRACK_AGGREGATION: 'vrack_aggregation', + PUBLIC_AGGREGATION: 'public_aggregation', + PUBLIC: 'public', + VRACK: 'vrack', DEFAULT: 'default', }; From c451aa66cca353fda4887a066245bd5f45a613c6 Mon Sep 17 00:00:00 2001 From: aderghamov Date: Fri, 6 Jun 2025 17:25:36 +0200 Subject: [PATCH 013/112] feat(network-interfaces): reworking the display of aggregated network interfaces ref: #MANAGER-17094 Signed-off-by: aderghamov --- .../nodes/interfaces/interfaces.routing.js | 2 +- .../servers/interfaces/interfaces.routing.js | 2 +- .../src/network-interfaces/controller.js | 7 ++++ .../src/network-interfaces/template.html | 36 +++++++++++++------ .../translations/Messages_fr_FR.json | 4 ++- 5 files changed, 37 insertions(+), 14 deletions(-) diff --git a/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/clusters/nodes/interfaces/interfaces.routing.js b/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/clusters/nodes/interfaces/interfaces.routing.js index 747867bcbdd1..7064a46a04af 100644 --- a/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/clusters/nodes/interfaces/interfaces.routing.js +++ b/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/clusters/nodes/interfaces/interfaces.routing.js @@ -87,7 +87,7 @@ export default /* @ngInject */ ($stateProvider) => { urls: /* @ngInject */ (constants, user) => constants.urls[user.ovhSubsidiary], breadcrumb: /* @ngInject */ ($translate) => - $translate.instant('dedicated_server_interfaces'), + $translate.instant('dedicated_server_interfaces_breadcrumb'), goToInterfaces: ($state, Alerter, serverName) => ( message = false, type = 'success', diff --git a/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/servers/interfaces/interfaces.routing.js b/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/servers/interfaces/interfaces.routing.js index ce5cfcac108e..ad571d7b62d8 100644 --- a/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/servers/interfaces/interfaces.routing.js +++ b/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/servers/interfaces/interfaces.routing.js @@ -90,7 +90,7 @@ export default /* @ngInject */ ($stateProvider) => { urls: /* @ngInject */ (constants, user) => constants.urls[user.ovhSubsidiary], breadcrumb: /* @ngInject */ ($translate) => - $translate.instant('dedicated_server_interfaces'), + $translate.instant('dedicated_server_interfaces_breadcrumb'), goToInterfaces: ($state, Alerter, serverName) => ( message = false, type = 'success', diff --git a/packages/manager/modules/bm-server-components/src/network-interfaces/controller.js b/packages/manager/modules/bm-server-components/src/network-interfaces/controller.js index 3b237021310d..8b908afbf7d0 100644 --- a/packages/manager/modules/bm-server-components/src/network-interfaces/controller.js +++ b/packages/manager/modules/bm-server-components/src/network-interfaces/controller.js @@ -5,4 +5,11 @@ export default class BMNetworkInterfaceController { constructor() { this.LABELS = LABELS; } + + $onChanges({ interfaces }) { + this.displayedInterfaces = interfaces.currentValue.map((nic) => ({ + ...nic, + displayedMacAdresses: nic.mac ? nic.mac.split(', ') : [], + })); + } } diff --git a/packages/manager/modules/bm-server-components/src/network-interfaces/template.html b/packages/manager/modules/bm-server-components/src/network-interfaces/template.html index ca96696d3ce4..8bf0c348507d 100644 --- a/packages/manager/modules/bm-server-components/src/network-interfaces/template.html +++ b/packages/manager/modules/bm-server-components/src/network-interfaces/template.html @@ -28,28 +28,42 @@
- - - - + >
+
+ + + - +
+
    +
  • +

    +
  • +
+
+
+ +
Date: Tue, 17 Jun 2025 16:22:08 +0200 Subject: [PATCH 014/112] feat(ola-nics): include the OLA information into the bandwidth display ref: #MANAGER-17071 Signed-off-by: aderghamov --- .../clusters/nodes/interfaces/interfaces.html | 15 +------- .../servers/interfaces/interfaces.html | 15 +------- .../bandwidth-tile.controller.js | 38 +++++++++++++++++++ .../src/bandwidth-tile/component.js | 3 ++ .../src/bandwidth-tile/template.html | 38 ++++++++++++++++--- .../translations/Messages_de_DE.json | 3 +- .../translations/Messages_en_GB.json | 3 +- .../translations/Messages_es_ES.json | 3 +- .../translations/Messages_fr_CA.json | 3 +- .../translations/Messages_fr_FR.json | 9 ++++- .../translations/Messages_it_IT.json | 3 +- .../translations/Messages_pl_PL.json | 3 +- .../translations/Messages_pt_PT.json | 3 +- .../bm-server-components/src/ola/ola.class.js | 23 +++++++---- 14 files changed, 108 insertions(+), 54 deletions(-) create mode 100644 packages/manager/modules/bm-server-components/src/bandwidth-tile/bandwidth-tile.controller.js diff --git a/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/clusters/nodes/interfaces/interfaces.html b/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/clusters/nodes/interfaces/interfaces.html index 10a9f1c7ef09..caaaa16afa49 100644 --- a/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/clusters/nodes/interfaces/interfaces.html +++ b/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/clusters/nodes/interfaces/interfaces.html @@ -1,19 +1,7 @@
-
- - -
- -
+
diff --git a/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/servers/interfaces/interfaces.html b/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/servers/interfaces/interfaces.html index cbe493474fdf..881c0870e657 100644 --- a/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/servers/interfaces/interfaces.html +++ b/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/servers/interfaces/interfaces.html @@ -1,19 +1,7 @@
-
- - -
- -
+
diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-tile/bandwidth-tile.controller.js b/packages/manager/modules/bm-server-components/src/bandwidth-tile/bandwidth-tile.controller.js new file mode 100644 index 000000000000..341923c15ac3 --- /dev/null +++ b/packages/manager/modules/bm-server-components/src/bandwidth-tile/bandwidth-tile.controller.js @@ -0,0 +1,38 @@ +export default class BandwidthTileCtrl { + /* @ngInject */ + constructor(olaConstants, $translate) { + this.olaConstants = olaConstants; + this.$translate = $translate; + } + + $onInit() { + const { OLA_MODES } = this.olaConstants; + const currentOlaMode = this.ola.getCurrentMode(); + const nbNICs = this.ola.nbNICs(); + this.olaModeTanslateCode = `dedicated_server_interfaces_bandwidth_server_ola_mode_${currentOlaMode}`; + + const olaBadgeClass = { + [OLA_MODES.DOUBLE_LAG]: 'oui-badge_success', + [OLA_MODES.FULL_LAG]: 'oui-badge_success', + [OLA_MODES.AVAILABLE]: 'oui-badge_info', + [OLA_MODES.UNAVAILABLE]: 'oui-badge_sold-out', + }[currentOlaMode]; + const additionalOlaModeBadge = + olaBadgeClass !== undefined + ? olaBadgeClass + : 'oui-badge oui-badge_sold-out'; + + this.olaModeBadgeClasses = `d-inline-flex p-1 oui-badge ${additionalOlaModeBadge}`; + + const olaTooltipTranslateCode = { + [OLA_MODES.DOUBLE_LAG]: + 'dedicated_server_interfaces_bandwidth_server_ola_mode_double_lag_tooltip', + [OLA_MODES.FULL_LAG]: `dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag_${nbNICs}_tooltip`, + }[currentOlaMode]; + + this.tooltipText = + olaTooltipTranslateCode !== undefined + ? this.$translate.instant(olaTooltipTranslateCode) + : undefined; + } +} diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-tile/component.js b/packages/manager/modules/bm-server-components/src/bandwidth-tile/component.js index 48f38c75ef84..5a2e008994b4 100644 --- a/packages/manager/modules/bm-server-components/src/bandwidth-tile/component.js +++ b/packages/manager/modules/bm-server-components/src/bandwidth-tile/component.js @@ -1,9 +1,12 @@ import template from './template.html'; +import controller from './bandwidth-tile.controller'; export default { template, + controller, bindings: { server: '<', + ola: '<', bandwidth0ption: '<', bandwidthVrackOption: '<', bandwidthVrackOrderOption: '<', diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-tile/template.html b/packages/manager/modules/bm-server-components/src/bandwidth-tile/template.html index 05a7ac51f880..0d9dc1f0f0fb 100644 --- a/packages/manager/modules/bm-server-components/src/bandwidth-tile/template.html +++ b/packages/manager/modules/bm-server-components/src/bandwidth-tile/template.html @@ -3,11 +3,6 @@ data-heading="{{:: 'dedicated_server_interfaces_bandwidth_title' | translate}}" data-description="{{:: 'dedicated_server_interfaces_bandwidth_description' | translate }}" > - - - + + + + + + + + + + + + + + + + diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_de_DE.json b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_de_DE.json index 00f04e61febc..7a806f8cecf0 100644 --- a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_de_DE.json +++ b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_de_DE.json @@ -1,5 +1,4 @@ { "dedicated_server_interfaces_bandwidth_title": "Bandbreite", - "dedicated_server_interfaces_bandwidth_description": "Was die öffentliche Bandbreite (von und zum Internet) betrifft, ist die eingehende Bandbreite unbegrenzt. Sie können die öffentliche und private Bandbreite erhöhen, indem Sie eine Option bestellen", - "dedicated_server_interfaces_bandwidth_ola_warning": "Im Rahmen einer kompletten Private-Aggregation-Konfiguration wird Ihre Option für ausgehende öffentliche Bandbreite nicht genutzt, da das Interface für das öffentliche Netzwerk für das private Netzwerk verwendet wird." + "dedicated_server_interfaces_bandwidth_description": "Was die öffentliche Bandbreite (von und zum Internet) betrifft, ist die eingehende Bandbreite unbegrenzt. Sie können die öffentliche und private Bandbreite erhöhen, indem Sie eine Option bestellen" } diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_en_GB.json b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_en_GB.json index 632b29353d1f..7a50d8cc02b0 100644 --- a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_en_GB.json +++ b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_en_GB.json @@ -1,5 +1,4 @@ { "dedicated_server_interfaces_bandwidth_title": "Bandwidth", - "dedicated_server_interfaces_bandwidth_description": "Inbound public throughput (to and from the internet) is unlimited. You can increase your public and private bandwidth by signing up to the following options:", - "dedicated_server_interfaces_bandwidth_ola_warning": "To ensure that the aggregation configuration is completely private, your outbound public throughput option will not be used, because the public network dedicated interface will be used for the private network." + "dedicated_server_interfaces_bandwidth_description": "Inbound public throughput (to and from the internet) is unlimited. You can increase your public and private bandwidth by signing up to the following options:" } diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_es_ES.json b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_es_ES.json index 46974a2341f4..4d4183207f4e 100644 --- a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_es_ES.json +++ b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_es_ES.json @@ -1,5 +1,4 @@ { "dedicated_server_interfaces_bandwidth_title": "Tráfico", - "dedicated_server_interfaces_bandwidth_description": "El tráfico entrante (desde y hacia internet) no tiene limitación. Puede aumentar el ancho de banda público y privado contratando la opción correspondiente.", - "dedicated_server_interfaces_bandwidth_ola_warning": "Con una configuración de agregación privada completa, no se utilizará la opción de ancho de banda saliente público, ya que la interfaz dedicada a la red pública se utilizará para la red privada." + "dedicated_server_interfaces_bandwidth_description": "El tráfico entrante (desde y hacia internet) no tiene limitación. Puede aumentar el ancho de banda público y privado contratando la opción correspondiente." } diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_fr_CA.json b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_fr_CA.json index 4375fbbccb01..c8239185655a 100644 --- a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_fr_CA.json +++ b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_fr_CA.json @@ -1,5 +1,4 @@ { "dedicated_server_interfaces_bandwidth_title": "Bande passante", - "dedicated_server_interfaces_bandwidth_description": "La bande passante publique (depuis et vers internet) n'est pas limitée en entrée. Vous pouvez augmenter la bande passante publique et privée en souscrivant à une option", - "dedicated_server_interfaces_bandwidth_ola_warning": "Dans le cadre d'une configuration agrégation privée complète, votre option de bande passante sortante publique ne sera pas utilisée du fait que l'interface dédiée au réseau public sera utilisée pour le réseau privé." + "dedicated_server_interfaces_bandwidth_description": "La bande passante publique (depuis et vers internet) n'est pas limitée en entrée. Vous pouvez augmenter la bande passante publique et privée en souscrivant à une option" } diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_fr_FR.json b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_fr_FR.json index 4375fbbccb01..b833de1b6c4f 100644 --- a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_fr_FR.json +++ b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_fr_FR.json @@ -1,5 +1,12 @@ { "dedicated_server_interfaces_bandwidth_title": "Bande passante", "dedicated_server_interfaces_bandwidth_description": "La bande passante publique (depuis et vers internet) n'est pas limitée en entrée. Vous pouvez augmenter la bande passante publique et privée en souscrivant à une option", - "dedicated_server_interfaces_bandwidth_ola_warning": "Dans le cadre d'une configuration agrégation privée complète, votre option de bande passante sortante publique ne sera pas utilisée du fait que l'interface dédiée au réseau public sera utilisée pour le réseau privé." + "dedicated_server_interfaces_bandwidth_server_ola": "OVHcloud Link Aggregation", + "dedicated_server_interfaces_bandwidth_server_ola_mode_available": "Disponible", + "dedicated_server_interfaces_bandwidth_server_ola_mode_double_lag": "Actif - Double LAG", + "dedicated_server_interfaces_bandwidth_server_ola_mode_double_lag_tooltip": "Les deux paires d'interfaces réseau sont agrégées séparément, ce qui permet un trafic privé et public.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag": "Actif - total LAG", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag_2_tooltip": "Les deux interfaces réseau sont entièrement agrégées et privées.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag_4_tooltip": "Les quatres interfaces réseau sont entièrement agrégées et privées.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_unavailable": "Indisponible" } diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_it_IT.json b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_it_IT.json index ab1de7309963..ff6e99b54ec0 100644 --- a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_it_IT.json +++ b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_it_IT.json @@ -1,5 +1,4 @@ { "dedicated_server_interfaces_bandwidth_title": "Banda passante", - "dedicated_server_interfaces_bandwidth_description": "La banda passante pubblica in entrata (da e verso Internet) non presenta limitazioni. È possibile aumentare la banda passante pubblica e privata attivando l’opzione corrispondente.", - "dedicated_server_interfaces_bandwidth_ola_warning": "Nell’ambito di una configurazione di aggregazione completa, l’opzione di banda passante pubblica in uscita non verrà utilizzata perché l’interfaccia dedicata alla rete pubblica sarà usata per la rete privata." + "dedicated_server_interfaces_bandwidth_description": "La banda passante pubblica in entrata (da e verso Internet) non presenta limitazioni. È possibile aumentare la banda passante pubblica e privata attivando l’opzione corrispondente." } diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_pl_PL.json b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_pl_PL.json index 8eb79830516f..05ab8c3268f6 100644 --- a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_pl_PL.json +++ b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_pl_PL.json @@ -1,5 +1,4 @@ { "dedicated_server_interfaces_bandwidth_title": "Przepustowość", - "dedicated_server_interfaces_bandwidth_description": "Przepustowość do sieci publicznej (do i z Internetu) nie jest ograniczona na wejściu. Możesz zwiększyć przepustowość do sieci publicznej oraz prywatnej, wykupując odpowiednią opcję.", - "dedicated_server_interfaces_bandwidth_ola_warning": "W przypadku pełnej konfiguracji agregacji prywatnej opcja przepustowości do sieci publicznej nie będzie używana, ponieważ interfejs dedykowany dla sieci publicznej będzie używany do obsługi sieci prywatnej." + "dedicated_server_interfaces_bandwidth_description": "Przepustowość do sieci publicznej (do i z Internetu) nie jest ograniczona na wejściu. Możesz zwiększyć przepustowość do sieci publicznej oraz prywatnej, wykupując odpowiednią opcję." } diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_pt_PT.json b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_pt_PT.json index d825d3455a34..0762255672db 100644 --- a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_pt_PT.json +++ b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_pt_PT.json @@ -1,5 +1,4 @@ { "dedicated_server_interfaces_bandwidth_title": "Largura de banda", - "dedicated_server_interfaces_bandwidth_description": "A largura de banda pública de entrada (desde e para a Internet) não tem limitações. Pode aumentar a largura de banda pública e privada ativando a opção correspondente.", - "dedicated_server_interfaces_bandwidth_ola_warning": "No âmbito de uma configuração de agregação privada completa, a sua opção de largura de banda de saída pública não será utilizada, porque a interface dedicada à rede pública será utilizada para a rede privada." + "dedicated_server_interfaces_bandwidth_description": "A largura de banda pública de entrada (desde e para a Internet) não tem limitações. Pode aumentar a largura de banda pública e privada ativando a opção correspondente." } diff --git a/packages/manager/modules/bm-server-components/src/ola/ola.class.js b/packages/manager/modules/bm-server-components/src/ola/ola.class.js index e1e3d1633553..4e528350e6f6 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola.class.js +++ b/packages/manager/modules/bm-server-components/src/ola/ola.class.js @@ -7,14 +7,7 @@ export default class Ola { getCurrentMode() { if (this.isAvailable() && this.interfaces.length) { - const formattedInterfaces = this.interfaces.reduce( - (interfaces, iface) => { - const updatedIfaces = interfaces; - updatedIfaces[iface.type] = iface.mac.split(', '); - return updatedIfaces; - }, - {}, - ); + const formattedInterfaces = this.getFormattedInterfaces(); if ( (formattedInterfaces[this.constants.OLA_MODES.VRACK_AGGREGATION] @@ -41,6 +34,12 @@ export default class Ola { return this.constants.OLA_MODES.UNAVAILABLE; } + nbNICs() { + const formattedInterfaces = this.getFormattedInterfaces(); + return formattedInterfaces[this.constants.OLA_MODES.VRACK_AGGREGATION] + ?.length; + } + isActivated() { return !isEmpty(this.supportedModes); } @@ -54,4 +53,12 @@ export default class Ola { this.interfaces.length === 1 && this.interfaces[0].isVrackAggregation() ); } + + getFormattedInterfaces() { + return this.interfaces.reduce((interfaces, iface) => { + const updatedIfaces = interfaces; + updatedIfaces[iface.type] = iface.mac.split(', '); + return updatedIfaces; + }, {}); + } } From c9b13a2c3d987477c34af214f68bcf0249efc850 Mon Sep 17 00:00:00 2001 From: aderghamov Date: Wed, 11 Jun 2025 11:33:18 +0200 Subject: [PATCH 015/112] feat(ola-nics): adding aggregation/desaggregation buttons to nics lists ref: #MANAGER-17106 Signed-off-by: aderghamov --- .../clusters/nodes/interfaces/interfaces.html | 1 + .../servers/interfaces/interfaces.html | 1 + .../src/network-interfaces/component.js | 1 + .../src/network-interfaces/controller.js | 6 +- .../src/network-interfaces/template.html | 18 ++ .../translations/Messages_fr_FR.json | 2 + .../ola-configuration.controller.js | 56 +++---- .../ola-configuration/ola-configuration.html | 154 ++++++++++-------- .../translations/Messages_fr_FR.json | 2 +- .../translations/Messages_fr_FR.json | 6 +- 10 files changed, 141 insertions(+), 106 deletions(-) diff --git a/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/clusters/nodes/interfaces/interfaces.html b/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/clusters/nodes/interfaces/interfaces.html index caaaa16afa49..0d675723e98b 100644 --- a/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/clusters/nodes/interfaces/interfaces.html +++ b/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/clusters/nodes/interfaces/interfaces.html @@ -22,6 +22,7 @@ data-server="$ctrl.server" data-server-name="$ctrl.serverName" data-interfaces="$ctrl.interfaces" + data-ola="$ctrl.ola" data-specifications="$ctrl.specifications" data-urls="$ctrl.urls" data-failover-ips="$ctrl.failoverIps" diff --git a/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/servers/interfaces/interfaces.html b/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/servers/interfaces/interfaces.html index 881c0870e657..66aed1b923da 100644 --- a/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/servers/interfaces/interfaces.html +++ b/packages/manager/apps/dedicated/client/app/dedicated/dedicated-server/servers/interfaces/interfaces.html @@ -22,6 +22,7 @@ data-server="$ctrl.server" data-server-name="$ctrl.serverName" data-interfaces="$ctrl.interfaces" + data-ola="$ctrl.ola" data-specifications="$ctrl.specifications" data-urls="$ctrl.urls" data-failover-ips="$ctrl.failoverIps" diff --git a/packages/manager/modules/bm-server-components/src/network-interfaces/component.js b/packages/manager/modules/bm-server-components/src/network-interfaces/component.js index 035ede125344..0726bf015069 100644 --- a/packages/manager/modules/bm-server-components/src/network-interfaces/component.js +++ b/packages/manager/modules/bm-server-components/src/network-interfaces/component.js @@ -6,6 +6,7 @@ export default { server: '<', serverName: '<', interfaces: '<', + ola: '<', specifications: '<', urls: '<', failoverIps: '<', diff --git a/packages/manager/modules/bm-server-components/src/network-interfaces/controller.js b/packages/manager/modules/bm-server-components/src/network-interfaces/controller.js index 8b908afbf7d0..cf76e76be967 100644 --- a/packages/manager/modules/bm-server-components/src/network-interfaces/controller.js +++ b/packages/manager/modules/bm-server-components/src/network-interfaces/controller.js @@ -1,3 +1,4 @@ +import { OLA_MODES } from '../ola/ola.constants'; import { LABELS } from './interfaces.constants'; export default class BMNetworkInterfaceController { @@ -6,10 +7,13 @@ export default class BMNetworkInterfaceController { this.LABELS = LABELS; } - $onChanges({ interfaces }) { + $onChanges({ interfaces, ola }) { this.displayedInterfaces = interfaces.currentValue.map((nic) => ({ ...nic, displayedMacAdresses: nic.mac ? nic.mac.split(', ') : [], })); + + this.isFullyAggregated = + ola.currentValue.getCurrentMode() === OLA_MODES.FULL_LAG; } } diff --git a/packages/manager/modules/bm-server-components/src/network-interfaces/template.html b/packages/manager/modules/bm-server-components/src/network-interfaces/template.html index 8bf0c348507d..9f37186c66e7 100644 --- a/packages/manager/modules/bm-server-components/src/network-interfaces/template.html +++ b/packages/manager/modules/bm-server-components/src/network-interfaces/template.html @@ -27,6 +27,24 @@ >
+ + + + + + item.hasFailoverIps() || item.hasVrack(), ); - this.allowedInterfaces = this.interfaces.filter( - (i) => !this.notAllowedInterfaces.includes(i), - ); + this.allowedInterfaces = this.interfaces + .filter((i) => !this.notAllowedInterfaces.includes(i)) + .map((nic) => ({ + ...nic, + displayedMacAdresses: nic.mac ? nic.mac.split(', ') : [], + isPublic: nic.isPublic(), + isPrivate: nic.isPrivate(), + })); } selectAllRows() { @@ -88,30 +86,20 @@ export default class { onRowSelect(selectedRows) { this.selectedInterfaces = selectedRows; - - if (this.configuration.mode === OLA_MODES.DEFAULT) { - this.networkInterfaces = flatten( - map(this.selectedInterfaces, ({ mac }) => mac.split(',')), - ); - } } configureInterface() { - switch (this.configuration.mode) { - case OLA_MODES.VRACK_AGGREGATION: - return this.olaService.setPrivateAggregation( - this.serverName, - this.configuration.name, - this.selectedInterfaces, - ); - case OLA_MODES.DEFAULT: - return this.olaService.setDefaultInterfaces( - this.serverName, - this.selectedInterfaces[0], - ); - default: - return this.$q.when(); + if (this.ola.getCurrentMode() !== OLA_MODES.VRACK_AGGREGATION) { + return this.olaService.setPrivateAggregation( + this.serverName, + this.configurationName, + this.selectedInterfaces, + ); } + return this.olaService.setDefaultInterfaces( + this.serverName, + this.selectedInterfaces[0], + ); } onFinish() { diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.html b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.html index c4ed4ebbfbd2..db741c4137a8 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.html +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.html @@ -75,7 +75,7 @@ type="text" autocomplete="off" placeholder="{{:: 'dedicated_server_interfaces_ola_field_name_placeholder' | translate }}" - data-ng-model="$ctrl.configuration.name" + data-ng-model="$ctrl.configurationName" data-required /> @@ -118,30 +118,45 @@ data-on-row-select="$ctrl.onRowSelect($rows)" data-selectable-rows > - - - + >
+
+ + +
+
    +
  • +

    +
  • +
+
+
+ +
@@ -151,73 +166,78 @@ > - - - - - - - - - - - - - - - - - - -
- - - - - -
+
+ + + + + + + + + + + + + + + + + + +
+ + + + + +
+
diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_fr_FR.json b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_fr_FR.json index e92679522b19..90e3dd74446c 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_fr_FR.json +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_fr_FR.json @@ -8,7 +8,7 @@ "dedicated_server_interfaces_ola_alert_obsolete_option": "Dans le cadre d'une configuration Agrégation privée, votre option de bande passante sortante publique ne sera pas utilisée.", "dedicated_server_interfaces_ola_column_mode": "Mode", - "dedicated_server_interfaces_ola_column_name": "Interface", + "dedicated_server_interfaces_ola_column_mac_address": "Adresse MAC", "dedicated_server_interfaces_ola_column_current_type": "Type", "dedicated_server_interfaces_ola_column_network_offer": "Offre réseau", "dedicated_server_interfaces_ola_column_bandwidth_outgoing": "Bande passante sortante", diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_fr_FR.json b/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_fr_FR.json index 0f5bf071ab91..975e1241bcb2 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_fr_FR.json +++ b/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_fr_FR.json @@ -1,5 +1,5 @@ { - "dedicated_server_interfaces_ola_reset_title": "Déconfigurer l'agrégation privée", - "dedicated_server_interfaces_ola_reset_text": "Êtes-vous sûr de vouloir déconfigurer l'agrégation privée sur ce serveur?", - "dedicated_server_interfaces_ola_reset_error": "Une erreur est survenue lors de la déconfiguration de l'agrégation privée." + "dedicated_server_interfaces_ola_reset_title": "Détacher le réseau agrégé", + "dedicated_server_interfaces_ola_reset_text": "Vous sûr de vouloir détacher ce réseau agrégé ? Les interfaces réseau fonctionneront indépendamment après cette action.", + "dedicated_server_interfaces_ola_reset_error": "Une erreur est survenue lors du détachement du réseau agrégé." } From 72f07fb9fced075617fea70a0cb334f5163ed57c Mon Sep 17 00:00:00 2001 From: aderghamov Date: Wed, 18 Jun 2025 10:14:15 +0200 Subject: [PATCH 016/112] fix(ola-nics): fixing the display of unavailable OLA in the network panel ref: #MANAGER-17110 Signed-off-by: aderghamov --- .../bm-server-components/src/network-tile/template.html | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/manager/modules/bm-server-components/src/network-tile/template.html b/packages/manager/modules/bm-server-components/src/network-tile/template.html index 40d785772bda..c15df22748ba 100644 --- a/packages/manager/modules/bm-server-components/src/network-tile/template.html +++ b/packages/manager/modules/bm-server-components/src/network-tile/template.html @@ -178,16 +178,11 @@ > - - - Date: Wed, 18 Jun 2025 14:46:14 +0200 Subject: [PATCH 017/112] fix(ola-nics): fixing the display of the list of nics ref: #MANAGER-17094 Signed-off-by: aderghamov --- .../src/network-interfaces/controller.js | 10 +- .../src/network-interfaces/interface.class.js | 1 + .../network-interfaces/interfaces.service.js | 2 +- .../src/network-interfaces/template.html | 374 ++++++++++-------- 4 files changed, 209 insertions(+), 178 deletions(-) diff --git a/packages/manager/modules/bm-server-components/src/network-interfaces/controller.js b/packages/manager/modules/bm-server-components/src/network-interfaces/controller.js index cf76e76be967..dbb9c2941d3d 100644 --- a/packages/manager/modules/bm-server-components/src/network-interfaces/controller.js +++ b/packages/manager/modules/bm-server-components/src/network-interfaces/controller.js @@ -7,13 +7,7 @@ export default class BMNetworkInterfaceController { this.LABELS = LABELS; } - $onChanges({ interfaces, ola }) { - this.displayedInterfaces = interfaces.currentValue.map((nic) => ({ - ...nic, - displayedMacAdresses: nic.mac ? nic.mac.split(', ') : [], - })); - - this.isFullyAggregated = - ola.currentValue.getCurrentMode() === OLA_MODES.FULL_LAG; + $onInit() { + this.isFullyAggregated = this.ola.getCurrentMode() === OLA_MODES.FULL_LAG; } } diff --git a/packages/manager/modules/bm-server-components/src/network-interfaces/interface.class.js b/packages/manager/modules/bm-server-components/src/network-interfaces/interface.class.js index 58e674a255a2..be3f162ee0cb 100644 --- a/packages/manager/modules/bm-server-components/src/network-interfaces/interface.class.js +++ b/packages/manager/modules/bm-server-components/src/network-interfaces/interface.class.js @@ -4,6 +4,7 @@ export default class Interface { constructor(resource) { Object.assign(this, resource); this.taskInProgress = false; + this.displayedMacAdresses = this.mac ? this.mac.split(', ') : []; } isPhysical() { diff --git a/packages/manager/modules/bm-server-components/src/network-interfaces/interfaces.service.js b/packages/manager/modules/bm-server-components/src/network-interfaces/interfaces.service.js index c1ec4d5a5a60..491965d4f330 100644 --- a/packages/manager/modules/bm-server-components/src/network-interfaces/interfaces.service.js +++ b/packages/manager/modules/bm-server-components/src/network-interfaces/interfaces.service.js @@ -93,7 +93,7 @@ export default class DedicatedServerInterfacesService { ({ mac, linkType: type }) => new Interface({ id: mac, - name: mac, + name: '', mac, type, vrack: null, diff --git a/packages/manager/modules/bm-server-components/src/network-interfaces/template.html b/packages/manager/modules/bm-server-components/src/network-interfaces/template.html index 9f37186c66e7..11bd4ba080e8 100644 --- a/packages/manager/modules/bm-server-components/src/network-interfaces/template.html +++ b/packages/manager/modules/bm-server-components/src/network-interfaces/template.html @@ -27,6 +27,7 @@ >
+ - - -
-
-
- - - - -
-
    -
  • -

    -
  • -
-
-
- -
-
- -
- - -
-
- - - -
-
- -
- - -
-
- - - -
-
- - - - - - - - - - - - -
- - -
-
- - - -
-
- - - - - - - - - - - - - - - - - - - - -
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
    +
  • +

    +
  • +
+
+
+ +
+
+
+ + +
+
+ + + +
+
+
+ + +
+
+ + + +
+
+ + + - + + + - + +
+ + +
+
+ + - +
+
+ + + + + + + + + + + + + + + + + + + + +
+
From 65979f97e5ddae831d630b4b15582e22dbc3d353 Mon Sep 17 00:00:00 2001 From: aderghamov Date: Thu, 19 Jun 2025 16:18:37 +0200 Subject: [PATCH 018/112] feat(ola-nics): reworking the ola configuration component ref: #MANAGER-17069 Signed-off-by: aderghamov --- .../src/bandwidth-dashboard/dashboard.html | 2 +- .../src/bandwidth-tile/template.html | 2 +- .../src/network-interfaces/template.html | 2 +- .../src/network-tile/controller.js | 3 +- .../ola-configuration-table.component.js | 8 + .../ola-configuration-table.html | 63 ++++++ .../ola-configuration-table.module.js | 10 + .../ola-configuration.controller.js | 72 ++++--- .../ola-configuration/ola-configuration.html | 187 ++++-------------- .../ola-configuration.module.js | 3 +- .../translations/Messages_fr_FR.json | 3 +- .../src/ola/ola.constants.js | 3 + 12 files changed, 172 insertions(+), 186 deletions(-) create mode 100644 packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration-table/ola-configuration-table.component.js create mode 100644 packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration-table/ola-configuration-table.html create mode 100644 packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration-table/ola-configuration-table.module.js diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-dashboard/dashboard.html b/packages/manager/modules/bm-server-components/src/bandwidth-dashboard/dashboard.html index e2e537cc2fd0..abfb27e2aa99 100644 --- a/packages/manager/modules/bm-server-components/src/bandwidth-dashboard/dashboard.html +++ b/packages/manager/modules/bm-server-components/src/bandwidth-dashboard/dashboard.html @@ -7,7 +7,7 @@ diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-tile/template.html b/packages/manager/modules/bm-server-components/src/bandwidth-tile/template.html index 0d9dc1f0f0fb..d637ad50d1b1 100644 --- a/packages/manager/modules/bm-server-components/src/bandwidth-tile/template.html +++ b/packages/manager/modules/bm-server-components/src/bandwidth-tile/template.html @@ -5,7 +5,7 @@ > diff --git a/packages/manager/modules/bm-server-components/src/network-tile/controller.js b/packages/manager/modules/bm-server-components/src/network-tile/controller.js index 3741bae8dbb8..921b23d110e9 100644 --- a/packages/manager/modules/bm-server-components/src/network-tile/controller.js +++ b/packages/manager/modules/bm-server-components/src/network-tile/controller.js @@ -11,7 +11,8 @@ export default class BmServerComponentsNetworkTileController { $onInit() { this.statePrefix = this.statePrefix || 'app.dedicated-server.server'; - this.hidePublicBandwidth = this.hidePublicBandwidth || false; + this.hidePublicBandwidth = + this.hidePublicBandwidth || this.ola.isConfigured() || false; this.manageIpUrl = this.coreURLBuilder.buildURL( 'dedicated', '#/ip?serviceName=:serviceName', diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration-table/ola-configuration-table.component.js b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration-table/ola-configuration-table.component.js new file mode 100644 index 000000000000..5e342dd7788d --- /dev/null +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration-table/ola-configuration-table.component.js @@ -0,0 +1,8 @@ +import template from './ola-configuration-table.html'; + +export default { + bindings: { + interfaces: '<', + }, + template, +}; diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration-table/ola-configuration-table.html b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration-table/ola-configuration-table.html new file mode 100644 index 000000000000..4a12ba91aead --- /dev/null +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration-table/ola-configuration-table.html @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + +
+
+
+
+
+
    +
  • +

    +
  • +
+
+
+ +
+
+ + + + + +
diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration-table/ola-configuration-table.module.js b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration-table/ola-configuration-table.module.js new file mode 100644 index 000000000000..0cadd8de3f71 --- /dev/null +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration-table/ola-configuration-table.module.js @@ -0,0 +1,10 @@ +import component from './ola-configuration-table.component'; + +const moduleName = 'ovhManagerDedicatedServerInterfacesOlaConfigurationTable'; + +angular + .module(moduleName, []) + .component('dedicatedServerInterfacesOlaConfigurationTable', component) + .run(/* @ngTranslationsInject:json ./translations */); + +export default moduleName; diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.controller.js b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.controller.js index b208404ac111..6f95469fb316 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.controller.js +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.controller.js @@ -4,6 +4,7 @@ import { OLA_MODES, NEW_LACP_MODE_BANNER_FEATURE_ID, SCALE_HGR_MAC_COUNTER, + OLA_PREVIEW_ID } from '../ola.constants'; export default class { @@ -49,43 +50,54 @@ export default class { this.configurationName = undefined; this.targetInterfaceType = OLA_MODES.VRACK_AGGREGATION; - this.selectedInterfaces = []; this.notAllowedInterfaces = this.interfaces.filter( (item) => item.hasFailoverIps() || item.hasVrack(), ); - this.allowedInterfaces = this.interfaces - .filter((i) => !this.notAllowedInterfaces.includes(i)) - .map((nic) => ({ - ...nic, - displayedMacAdresses: nic.mac ? nic.mac.split(', ') : [], - isPublic: nic.isPublic(), - isPrivate: nic.isPrivate(), - })); - } - selectAllRows() { - const datagrid = get( - this.ouiDatagridService, - 'datagrids.olaConfigDatagrid', + this.displayedInterfaces = this.interfaces.map((nic) => ({ + id: nic.id, + name: nic.name, + type: nic.type, + mac: nic.mac, + displayedMacAdresses: nic.displayedMacAdresses, + uploadBandwidth: nic.isPublic() + ? this.specifications.bandwidth.OvhToInternet + : this.specifications.vrack.bandwidth, + downloadBandwidth: nic.isPublic() + ? this.specifications.connection + : this.specifications.vrack.bandwidth, + })); + + const hasExistingVrackAggregation = this.interfaces.some( + (nic) => nic.type === OLA_MODES.VRACK_AGGREGATION, ); - if (datagrid) { - this.$timeout(() => { - datagrid.toggleAllRowsSelection(true); - datagrid.selectAllRows = true; - }); - } - } + const previewBandwidth = hasExistingVrackAggregation + ? { + ...this.specifications.vrack.bandwidth, + value: this.specifications.vrack.bandwidth.value * 2, + } + : this.specifications.vrack.bandwidth; - hasObsoleteBandwithOption() { - return this.specifications.bandwidth.type !== 'included'; - } + this.previewAggregatedInterfaces = [ + { + id: OLA_PREVIEW_ID, + name: OLA_PREVIEW_ID, + type: OLA_MODES.VRACK_AGGREGATION, + displayedMacAdresses: this.interfaces.reduce( + (adresses, nic) => adresses.concat(nic.displayedMacAdresses), + [], + ), + uploadBandwidth: previewBandwidth, + downloadBandwidth: previewBandwidth, + }, + ]; - isInterfaceSelectionValid() { - return [2, 4].includes(this.selectedInterfaces.length); + this.hasObsoleteBandwithOption = + this.specifications.bandwidth.type !== 'included'; } - onRowSelect(selectedRows) { - this.selectedInterfaces = selectedRows; + isAggregationValid() { + return this.notAllowedInterfaces.length === 0; } configureInterface() { @@ -93,12 +105,12 @@ export default class { return this.olaService.setPrivateAggregation( this.serverName, this.configurationName, - this.selectedInterfaces, + this.interfaces, ); } return this.olaService.setDefaultInterfaces( this.serverName, - this.selectedInterfaces[0], + this.interfaces[0], ); } diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.html b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.html index db741c4137a8..ecc40cbedf1d 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.html +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.html @@ -65,28 +65,10 @@ data-ng-if="!$ctrl.isLoading" data-ng-submit="$ctrl.onFinish()" > - - - - -

- - -

-
- - -
-
    -
  • -

    -
  • -
-
-
- -
-
- - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
- - - - - -
+
+
+ + +
+
+ +
+
+ + +
- - - + + + - +
diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.module.js b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.module.js index fa211b1e47ce..3442503ba946 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.module.js +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.module.js @@ -1,9 +1,10 @@ import component from './ola-configuration.component'; +import olaConfigurationTable from './ola-configuration-table/ola-configuration-table.module'; const moduleName = 'ovhManagerDedicatedServerInterfacesOlaConfiguration'; angular - .module(moduleName, []) + .module(moduleName, [olaConfigurationTable]) .component('dedicatedServerInterfacesOlaConfiguration', component) .run(/* @ngTranslationsInject:json ./translations */); diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_fr_FR.json b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_fr_FR.json index 90e3dd74446c..3b8c8fbc7245 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_fr_FR.json +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_fr_FR.json @@ -15,7 +15,7 @@ "dedicated_server_interfaces_ola_column_bandwidth_incoming": "Bande passante entrante", "dedicated_server_interfaces_ola_network_interfaces": "Votre interface réseau actuelle", - "dedicated_server_interfaces_ola_network_interfaces_after": "Votre interface réseau après activation", + "dedicated_server_interfaces_ola_network_interfaces_after": "Simulation d'interface réseau après l'activation de l'aggregation des liens", "dedicated_server_interfaces_ola_field_mode_label": "Choisissez un mode", "dedicated_server_interfaces_ola_field_mode_description": "OLA est capable de proposer differents types de configuration des interfaces", @@ -25,6 +25,7 @@ "dedicated_server_interfaces_ola_field_mode_choice_vrack_aggregation_description": "Les 2 interfaces réseau du serveur sont utilisées pour le réseau privé (vRack). Chaque lien dispose alors de la bande passante de base ou prise en option. A savoir : le serveur n'est dès lors plus accessible par son IP publique.", "dedicated_server_interfaces_ola_field_name_label": "Nommez l'interface", "dedicated_server_interfaces_ola_field_name_placeholder": "Nom de l'interface", + "dedicated_server_interfaces_ola_activate": "Activer l'aggregation", "dedicated_server_interfaces_ola_step1_title": "Configurez votre OLA", "dedicated_server_interfaces_ola_step2_title": "Sélectionnez vos interfaces", diff --git a/packages/manager/modules/bm-server-components/src/ola/ola.constants.js b/packages/manager/modules/bm-server-components/src/ola/ola.constants.js index f4460cb2cc3a..799d208e2c09 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola.constants.js +++ b/packages/manager/modules/bm-server-components/src/ola/ola.constants.js @@ -17,6 +17,8 @@ export const INTERFACE_GROUP_TASK = 'INFRA_002_VirtualNetworkInterface_group'; export const INTERFACE_UNGROUP_TASK = 'INFRA_002_VirtualNetworkInterface_ungroup'; + +export const OLA_PREVIEW_ID = 'ola_preview'; export const NEW_LACP_MODE_BANNER_FEATURE_ID = 'dedicated-server:ola-new-lacp-mode-banner'; @@ -61,4 +63,5 @@ export default { INTERFACE_TASK, INTERFACE_GROUP_TASK, INTERFACE_UNGROUP_TASK, + OLA_PREVIEW_ID, }; From 475a48d648754cc46a1097442537b99d7133ffbb Mon Sep 17 00:00:00 2001 From: Quentin Pavy Date: Fri, 26 Dec 2025 10:11:44 +0100 Subject: [PATCH 019/112] feat(ola): rename full lag to full private ref: #MANAGER-17071 Signed-off-by: Quentin Pavy --- .../src/bandwidth-tile/translations/Messages_fr_FR.json | 2 +- .../src/network-tile/translations/Messages_fr_FR.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_fr_FR.json b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_fr_FR.json index b833de1b6c4f..5af70a1c75e2 100644 --- a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_fr_FR.json +++ b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_fr_FR.json @@ -5,7 +5,7 @@ "dedicated_server_interfaces_bandwidth_server_ola_mode_available": "Disponible", "dedicated_server_interfaces_bandwidth_server_ola_mode_double_lag": "Actif - Double LAG", "dedicated_server_interfaces_bandwidth_server_ola_mode_double_lag_tooltip": "Les deux paires d'interfaces réseau sont agrégées séparément, ce qui permet un trafic privé et public.", - "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag": "Actif - total LAG", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag": "Actif - Full private", "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag_2_tooltip": "Les deux interfaces réseau sont entièrement agrégées et privées.", "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag_4_tooltip": "Les quatres interfaces réseau sont entièrement agrégées et privées.", "dedicated_server_interfaces_bandwidth_server_ola_mode_unavailable": "Indisponible" diff --git a/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_fr_FR.json b/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_fr_FR.json index 6786c7efbc30..828c698d2bb4 100644 --- a/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_fr_FR.json +++ b/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_fr_FR.json @@ -29,7 +29,7 @@ "server_network_ola_terminate": "Résilier OLA", "server_network_ola_mode_vrack_aggregation": "Agrégation privée", "server_network_ola_mode_default": "Défaut", - "server_network_ola_mode_full_lag": "Actif - Total LAG", + "server_network_ola_mode_full_lag": "Actif - Full private", "server_network_ola_mode_double_lag": "Actif - Double LAG", "server_network_ola_mode_available": "Disponible", "server_network_ola_mode_unavailable": "Indisponible", From 31fb4b852775dfbf78738ea3133e018e0b3b5380 Mon Sep 17 00:00:00 2001 From: Quentin Pavy Date: Wed, 31 Dec 2025 13:19:04 +0100 Subject: [PATCH 020/112] feat(dedicated): show interface bandwidth by nic ref: #MANAGER-20611 Signed-off-by: Quentin Pavy --- .../dashboard.component.js | 1 + .../src/bandwidth-dashboard/dashboard.html | 5 +- .../component.js | 1 + .../template.html | 4 +- .../bandwidth-tile.controller.js | 4 +- .../src/bandwidth-tile/template.html | 1 + .../src/network-interfaces/controller.js | 1 + .../src/network-interfaces/template.html | 8 +- .../src/network-tile/controller.js | 2 +- .../src/network-tile/template.html | 2 + .../ola-configuration-table.component.js | 1 + .../ola-configuration-table.html | 4 +- .../ola-configuration.controller.js | 19 +-- .../ola-configuration/ola-configuration.html | 2 + .../bm-server-components/src/ola/ola.class.js | 6 +- .../bm-server-components/src/server/index.js | 4 +- .../src/server/server.service.js | 13 +- .../src/bandwidth/bandwidth.filter.js | 127 +----------------- .../src/bandwidth/constants.js | 36 +++++ .../manager-components/src/bandwidth/index.js | 2 + .../src/bandwidth/service.js | 77 +++++++++++ .../manager/modules/nutanix/src/service.js | 14 +- 22 files changed, 179 insertions(+), 155 deletions(-) create mode 100644 packages/manager/modules/manager-components/src/bandwidth/constants.js create mode 100644 packages/manager/modules/manager-components/src/bandwidth/service.js diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-dashboard/dashboard.component.js b/packages/manager/modules/bm-server-components/src/bandwidth-dashboard/dashboard.component.js index f3a09653e97c..bd3021966765 100644 --- a/packages/manager/modules/bm-server-components/src/bandwidth-dashboard/dashboard.component.js +++ b/packages/manager/modules/bm-server-components/src/bandwidth-dashboard/dashboard.component.js @@ -14,5 +14,6 @@ export default { server: '<', specifications: '<', isOldCluster: '<', + nbNics: '<', }, }; diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-dashboard/dashboard.html b/packages/manager/modules/bm-server-components/src/bandwidth-dashboard/dashboard.html index abfb27e2aa99..e66d20097ac4 100644 --- a/packages/manager/modules/bm-server-components/src/bandwidth-dashboard/dashboard.html +++ b/packages/manager/modules/bm-server-components/src/bandwidth-dashboard/dashboard.html @@ -3,6 +3,7 @@ data-specifications="$ctrl.specifications" data-bandwidth-option="$ctrl.bandwidthOption" data-is-cluster="$ctrl.isOldCluster" + data-nb-nics="$ctrl.nbNics" > @@ -24,7 +25,7 @@
@@ -130,7 +130,7 @@ class="oui-icon oui-icon-arrow-up font-inherit" >
@@ -153,7 +153,7 @@ class="oui-icon oui-icon-arrow-down font-inherit" > { this.loading = false; }); - this.olaMode = this.ola.getCurrentMode(); + this.olaMode = this.ola?.getCurrentMode(); } loadVrackInfos() { diff --git a/packages/manager/modules/bm-server-components/src/network-tile/template.html b/packages/manager/modules/bm-server-components/src/network-tile/template.html index c15df22748ba..53ec1f7da994 100644 --- a/packages/manager/modules/bm-server-components/src/network-tile/template.html +++ b/packages/manager/modules/bm-server-components/src/network-tile/template.html @@ -103,6 +103,7 @@ data-is-old-cluster="$ctrl.isOldCluster" data-specifications="$ctrl.specifications" data-service-id="$ctrl.serviceInfos.serviceId" + data-nb-nics="::$ctrl.ola.nbNICs()" > @@ -160,6 +161,7 @@ diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration-table/ola-configuration-table.component.js b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration-table/ola-configuration-table.component.js index 5e342dd7788d..e9591aea6ed3 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration-table/ola-configuration-table.component.js +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration-table/ola-configuration-table.component.js @@ -3,6 +3,7 @@ import template from './ola-configuration-table.html'; export default { bindings: { interfaces: '<', + nbNics: '<', }, template, }; diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration-table/ola-configuration-table.html b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration-table/ola-configuration-table.html index 4a12ba91aead..20a1992ab521 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration-table/ola-configuration-table.html +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration-table/ola-configuration-table.html @@ -49,13 +49,13 @@ diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.controller.js b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.controller.js index 6f95469fb316..6c80d65ef07f 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.controller.js +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.controller.js @@ -62,22 +62,12 @@ export default class { displayedMacAdresses: nic.displayedMacAdresses, uploadBandwidth: nic.isPublic() ? this.specifications.bandwidth.OvhToInternet - : this.specifications.vrack.bandwidth, + : this.specifications.vrack.realNicBandwidth, downloadBandwidth: nic.isPublic() ? this.specifications.connection - : this.specifications.vrack.bandwidth, + : this.specifications.vrack.realNicBandwidth, })); - const hasExistingVrackAggregation = this.interfaces.some( - (nic) => nic.type === OLA_MODES.VRACK_AGGREGATION, - ); - const previewBandwidth = hasExistingVrackAggregation - ? { - ...this.specifications.vrack.bandwidth, - value: this.specifications.vrack.bandwidth.value * 2, - } - : this.specifications.vrack.bandwidth; - this.previewAggregatedInterfaces = [ { id: OLA_PREVIEW_ID, @@ -87,8 +77,9 @@ export default class { (adresses, nic) => adresses.concat(nic.displayedMacAdresses), [], ), - uploadBandwidth: previewBandwidth, - downloadBandwidth: previewBandwidth, + uploadBandwidth: this.specifications.vrack.realNicBandwidth, + downloadBandwidth: this.specifications.vrack.realNicBandwidth, + nbNics: this.ola.nbNICs() * 2, }, ]; diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.html b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.html index ecc40cbedf1d..b12567f1cf50 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.html +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.html @@ -100,6 +100,7 @@ >
@@ -111,6 +112,7 @@ >
diff --git a/packages/manager/modules/bm-server-components/src/ola/ola.class.js b/packages/manager/modules/bm-server-components/src/ola/ola.class.js index 4e528350e6f6..3b8aec0cc173 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola.class.js +++ b/packages/manager/modules/bm-server-components/src/ola/ola.class.js @@ -36,8 +36,10 @@ export default class Ola { nbNICs() { const formattedInterfaces = this.getFormattedInterfaces(); - return formattedInterfaces[this.constants.OLA_MODES.VRACK_AGGREGATION] - ?.length; + return ( + formattedInterfaces[this.constants.OLA_MODES.VRACK_AGGREGATION]?.length || + 1 + ); } isActivated() { diff --git a/packages/manager/modules/bm-server-components/src/server/index.js b/packages/manager/modules/bm-server-components/src/server/index.js index 9892435d7043..09e7fafb3e15 100644 --- a/packages/manager/modules/bm-server-components/src/server/index.js +++ b/packages/manager/modules/bm-server-components/src/server/index.js @@ -2,7 +2,7 @@ import angular from 'angular'; import '@ovh-ux/ui-kit'; import 'angular-translate'; - +import { serverBandwidth } from '@ovh-ux/manager-components'; import bandwidthVrackOrderService from './server.bandwidth-vrack-order.service'; import component from './server.component'; import featureAvailability from './server.feature-availability'; @@ -12,7 +12,7 @@ import './server.less'; const moduleName = 'ovhManagerBmServerComponentsServer'; angular - .module(moduleName, ['oui', 'pascalprecht.translate']) + .module(moduleName, ['oui', 'pascalprecht.translate', serverBandwidth]) .component('serverMainPage', component) .service('Server', service) .service('BandwidthVrackOrderService', bandwidthVrackOrderService) diff --git a/packages/manager/modules/bm-server-components/src/server/server.service.js b/packages/manager/modules/bm-server-components/src/server/server.service.js index a600a1414007..8663257adf2b 100644 --- a/packages/manager/modules/bm-server-components/src/server/server.service.js +++ b/packages/manager/modules/bm-server-components/src/server/server.service.js @@ -24,7 +24,9 @@ export default class Server { Polling, WucApi, icebergUtils, + ServerBandwidthService, ) { + this.ServerBandwidthService = ServerBandwidthService; this.$cacheFactory = $cacheFactory; this.$http = $http; this.$q = $q; @@ -1000,7 +1002,16 @@ export default class Server { return this.get(productId, 'specifications/network', { proxypass: true, }) - .then((data) => data) + .then((data) => { + const specifications = data; + if (data.vrack.bandwidth) { + specifications.vrack.realNicBandwidth = this.ServerBandwidthService.constructor.compareBandwidths( + data.vrack.bandwidth, + data.connection, + ); + } + return specifications; + }) .catch((err) => { if (err.status === 404 || err.status === 460) { return {}; diff --git a/packages/manager/modules/manager-components/src/bandwidth/bandwidth.filter.js b/packages/manager/modules/manager-components/src/bandwidth/bandwidth.filter.js index d6fce6655543..ec3a8b0e5b24 100644 --- a/packages/manager/modules/manager-components/src/bandwidth/bandwidth.filter.js +++ b/packages/manager/modules/manager-components/src/bandwidth/bandwidth.filter.js @@ -1,129 +1,14 @@ -import angular from 'angular'; +export default /* @ngInject */ (ServerBandwidthService) => { + return function bandwidthFilter(bandwidth, _nbNICs) { + const nbNICs = _nbNICs ? `${_nbNICs} x` : ''; -export default /* @ngInject */ ($translate) => { - /* eslint-disable no-restricted-properties */ - const unitsValues = [ - { - unit: 'bps', - value: 1000, - }, - { - unit: 'Mbps', - value: Math.pow(1000, 2), - }, - { - unit: 'Gbps', - value: Math.pow(1000, 3), - }, - { - unit: 'Tbps', - value: Math.pow(1000, 4), - }, - { - unit: 'Pbps', - value: Math.pow(1000, 5), - }, - { - unit: 'Ebps', - value: Math.pow(1000, 6), - }, - { - unit: 'Zbps', - value: Math.pow(1000, 7), - }, - { - unit: 'Ybps', - value: Math.pow(1000, 8), - }, - ]; - /* eslint-enable no-restricted-properties */ - - function getValueAndUnitForToUnit(bytes, precision, toUnit) { - let i; - let ii; - let value = bytes; // Bytes by default - const unit = $translate.instant('bandwidth_unit_size_bps'); // Bytes by default - - if (toUnit !== $translate.instant('bandwidth_unit_size_bps')) { - for (i = 0, ii = unitsValues.length; i < ii; i += 1) { - if ( - toUnit === - $translate.instant(`bandwidth_unit_size_${unitsValues[i].unit}`) - ) { - value = (bytes / unitsValues[i].value).toFixed(precision); - break; - } - } - } - - return { value, unit }; - } - - function getValueAndUnit(bytes, precision) { - let i; - let ii; - let value = bytes; // Bytes by default - let unit = $translate.instant('bandwidth_unit_size_bps'); // Bytes by default - const absBytes = Math.abs(bytes); - - for (i = 0, ii = unitsValues.length; i < ii; i += 1) { - if ( - absBytes >= unitsValues[i].value && - (angular.isDefined(unitsValues[i + 1]) - ? absBytes < unitsValues[i + 1].value - : true) - ) { - value = (bytes / unitsValues[i].value).toFixed(precision); - unit = $translate.instant(`bandwidth_unit_size_${unitsValues[i].unit}`); - break; - } - } - - return { value, unit }; - } - - function convertFrom(bandwidth) { - let i; - let ii; - for (i = 0, ii = unitsValues.length; i < ii; i += 1) { - if (unitsValues[i].unit === bandwidth.unit) { - return bandwidth.value * unitsValues[i].value; - } - } - return bandwidth.value; - } - - return function bandwidthFilter(bandwidth, _mode, _precision, toUnit) { - let mode = _mode; - let precision = _precision; if (!bandwidth) { return null; } - const bytes = convertFrom(bandwidth); - let valueAndUnit = {}; - - if (!angular.isNumber(precision)) { - precision = 0; - } - if ($.inArray(mode, ['value', 'unit']) === -1) { - mode = null; - } - - if (toUnit) { - valueAndUnit = getValueAndUnitForToUnit(bytes, precision, toUnit); - } else { - valueAndUnit = getValueAndUnit(bytes, precision); - } + const bytes = ServerBandwidthService.constructor.convertFrom(bandwidth); + const valueAndUnit = ServerBandwidthService.getValueAndUnit(bytes, 0); - let result; - if (mode === 'value') { - result = valueAndUnit.value; - } else if (mode === 'unit') { - result = valueAndUnit.unit; - } else { - result = `${valueAndUnit.value} ${valueAndUnit.unit}`; - } - return result; + return `${nbNICs} ${valueAndUnit.value} ${valueAndUnit.unit}`; }; }; diff --git a/packages/manager/modules/manager-components/src/bandwidth/constants.js b/packages/manager/modules/manager-components/src/bandwidth/constants.js new file mode 100644 index 000000000000..c802df5d9ad3 --- /dev/null +++ b/packages/manager/modules/manager-components/src/bandwidth/constants.js @@ -0,0 +1,36 @@ +/* eslint-disable no-restricted-properties */ +export const unitsValues = [ + { + unit: 'bps', + value: 1000, + }, + { + unit: 'Mbps', + value: Math.pow(1000, 2), + }, + { + unit: 'Gbps', + value: Math.pow(1000, 3), + }, + { + unit: 'Tbps', + value: Math.pow(1000, 4), + }, + { + unit: 'Pbps', + value: Math.pow(1000, 5), + }, + { + unit: 'Ebps', + value: Math.pow(1000, 6), + }, + { + unit: 'Zbps', + value: Math.pow(1000, 7), + }, + { + unit: 'Ybps', + value: Math.pow(1000, 8), + }, +]; +/* eslint-enable no-restricted-properties */ diff --git a/packages/manager/modules/manager-components/src/bandwidth/index.js b/packages/manager/modules/manager-components/src/bandwidth/index.js index 94c9a80af97a..d8c34ecf990b 100644 --- a/packages/manager/modules/manager-components/src/bandwidth/index.js +++ b/packages/manager/modules/manager-components/src/bandwidth/index.js @@ -3,11 +3,13 @@ import ngTranslateAsyncLoader from '@ovh-ux/ng-translate-async-loader'; import translate from 'angular-translate'; import serverBandwidthFilter from './bandwidth.filter'; +import service from './service'; const moduleName = 'serverBandwidth'; angular .module(moduleName, [ngTranslateAsyncLoader, translate]) + .service('ServerBandwidthService', service) .filter('serverBandwidth', serverBandwidthFilter) .run(/* @ngTranslationsInject:json ./translations */); diff --git a/packages/manager/modules/manager-components/src/bandwidth/service.js b/packages/manager/modules/manager-components/src/bandwidth/service.js new file mode 100644 index 000000000000..aff69816b6f9 --- /dev/null +++ b/packages/manager/modules/manager-components/src/bandwidth/service.js @@ -0,0 +1,77 @@ +import angular from 'angular'; +import { unitsValues } from './constants'; + +export default class OvhManagerServerBandwidthService { + /* @ngInject */ + constructor($translate) { + this.$translate = $translate; + } + + getValueAndUnitForToUnit(bytes, precision, toUnit) { + let i; + let ii; + let value = bytes; // Bytes by default + const unit = this.$translate.instant('bandwidth_unit_size_bps'); // Bytes by default + + if (toUnit !== this.$translate.instant('bandwidth_unit_size_bps')) { + for (i = 0, ii = unitsValues.length; i < ii; i += 1) { + if ( + toUnit === + this.$translate.instant(`bandwidth_unit_size_${unitsValues[i].unit}`) + ) { + value = (bytes / unitsValues[i].value).toFixed(precision); + break; + } + } + } + + return { value, unit }; + } + + getValueAndUnit(bytes, precision) { + let i; + let ii; + let value = bytes; // Bytes by default + let unit = this.$translate.instant('bandwidth_unit_size_bps'); // Bytes by default + const absBytes = Math.abs(bytes); + + for (i = 0, ii = unitsValues.length; i < ii; i += 1) { + if ( + absBytes >= unitsValues[i].value && + (angular.isDefined(unitsValues[i + 1]) + ? absBytes < unitsValues[i + 1].value + : true) + ) { + value = (bytes / unitsValues[i].value).toFixed(precision); + unit = this.$translate.instant( + `bandwidth_unit_size_${unitsValues[i].unit}`, + ); + break; + } + } + + return { value, unit }; + } + + static convertFrom(bandwidth) { + let i; + let ii; + for (i = 0, ii = unitsValues.length; i < ii; i += 1) { + if (unitsValues[i].unit === bandwidth.unit) { + return bandwidth.value * unitsValues[i].value; + } + } + return bandwidth.value; + } + + static compareBandwidths(bandwidthA, bandwidthB) { + const bandwidthAValue = OvhManagerServerBandwidthService.convertFrom( + bandwidthA, + ); + const bandwidthBValue = OvhManagerServerBandwidthService.convertFrom( + bandwidthB, + ); + + return bandwidthAValue < bandwidthBValue ? bandwidthA : bandwidthB; + } +} diff --git a/packages/manager/modules/nutanix/src/service.js b/packages/manager/modules/nutanix/src/service.js index d8753a9b5539..e85a6cd78e4d 100644 --- a/packages/manager/modules/nutanix/src/service.js +++ b/packages/manager/modules/nutanix/src/service.js @@ -14,11 +14,12 @@ import TechnicalDetails from './technical-details.class'; export default class NutanixService { /* @ngInject */ - constructor($q, $http, $translate, iceberg) { + constructor($q, $http, $translate, iceberg, ServerBandwidthService) { this.$q = $q; this.$http = $http; this.$translate = $translate; this.iceberg = iceberg; + this.ServerBandwidthService = ServerBandwidthService; } getClusters() { @@ -282,7 +283,16 @@ export default class NutanixService { getBandwidth(productId) { return this.$http .get(`/dedicated/server/${productId}/specifications/network`) - .then(({ data }) => data) + .then(({ data }) => { + const specifications = data; + if (data.vrack.bandwidth) { + specifications.vrack.realNicBandwidth = this.ServerBandwidthService.constructor.compareBandwidths( + data.vrack.bandwidth, + data.connection, + ); + } + return specifications; + }) .catch((err) => { if (err.status === 404 || err.status === 460) { return {}; From 6bc53ca209eee372fe1db180862d99a302cc143b Mon Sep 17 00:00:00 2001 From: Quentin Pavy Date: Tue, 3 Feb 2026 14:06:28 +0100 Subject: [PATCH 021/112] feat(dedicated.ola): fix fr text ref: #MANAGER-17106 Signed-off-by: Quentin Pavy --- .../src/network-interfaces/translations/Messages_fr_FR.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_fr_FR.json b/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_fr_FR.json index c8ddf04ba5be..cac9a4a511dd 100644 --- a/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_fr_FR.json +++ b/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_fr_FR.json @@ -1,7 +1,7 @@ { "dedicated_server_interfaces": "Contrôleurs d'interfaces réseau (NICs)", "dedicated_server_interfaces_aggregate_button": "Agrégation réseaux", - "dedicated_server_interfaces_disaggregate_button": "Désaggréger les réseaux", + "dedicated_server_interfaces_disaggregate_button": "Désagréger les réseaux", "dedicated_server_interfaces_breadcrumb": "Interfaces réseau", "dedicated_server_interfaces_vrack_information": "Veuillez noter que par défaut aucune IP n’existe pour le réseau privé (vRack). En effet vous devez au préalable créer un réseau privé (vRack), y ajouter votre serveur, puis configurez vos IP.", "dedicated_server_interfaces_vrack_information_link_label": "En savoir plus sur le vRack.", From aecccf329fef4e2cfc24e1235e7cb3eb0d104c4e Mon Sep 17 00:00:00 2001 From: Charles Ilieff Date: Tue, 10 Feb 2026 15:59:16 +0100 Subject: [PATCH 022/112] fix(dedicated): remove warning banner for the OLA association ref: #MANAGER-20717 Signed-off-by: Charles Ilieff --- .../ola-configuration.controller.js | 10 +--------- .../ola-configuration/ola-configuration.html | 17 +---------------- .../translations/Messages_fr_FR.json | 1 - 3 files changed, 2 insertions(+), 26 deletions(-) diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.controller.js b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.controller.js index 6c80d65ef07f..13ca35995161 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.controller.js +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.controller.js @@ -4,7 +4,7 @@ import { OLA_MODES, NEW_LACP_MODE_BANNER_FEATURE_ID, SCALE_HGR_MAC_COUNTER, - OLA_PREVIEW_ID + OLA_PREVIEW_ID, } from '../ola.constants'; export default class { @@ -50,10 +50,6 @@ export default class { this.configurationName = undefined; this.targetInterfaceType = OLA_MODES.VRACK_AGGREGATION; - this.notAllowedInterfaces = this.interfaces.filter( - (item) => item.hasFailoverIps() || item.hasVrack(), - ); - this.displayedInterfaces = this.interfaces.map((nic) => ({ id: nic.id, name: nic.name, @@ -87,10 +83,6 @@ export default class { this.specifications.bandwidth.type !== 'included'; } - isAggregationValid() { - return this.notAllowedInterfaces.length === 0; - } - configureInterface() { if (this.ola.getCurrentMode() !== OLA_MODES.VRACK_AGGREGATION) { return this.olaService.setPrivateAggregation( diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.html b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.html index b12567f1cf50..77a255030a9b 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.html +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/ola-configuration.html @@ -78,21 +78,6 @@
- -

-
    -
  • -
-
diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_fr_FR.json b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_fr_FR.json index 3b8c8fbc7245..24ec6909f5d8 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_fr_FR.json +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_fr_FR.json @@ -4,7 +4,6 @@ "dedicated_server_interface_ola_new_tab": "(S'ouvre dans un nouvel onglet)", "dedicated_server_interfaces_ola_alert_configuration_reset": "Les interfaces seront dé-configurées. La connectivité à votre serveur sera perdue le temps de la configuration", - "dedicated_server_interfaces_ola_alert_not_allowed": "Les interfaces suivantes ne sont pas sélectionnables pour votre configuration. Pour pouvoir les configurer, retirez d'abord les vRacks et les IPFOs de celles-ci.", "dedicated_server_interfaces_ola_alert_obsolete_option": "Dans le cadre d'une configuration Agrégation privée, votre option de bande passante sortante publique ne sera pas utilisée.", "dedicated_server_interfaces_ola_column_mode": "Mode", From f74c807a96178ed91785966a53311a988ded9f1e Mon Sep 17 00:00:00 2001 From: CDS Translator Agent Date: Tue, 3 Mar 2026 14:50:39 +0000 Subject: [PATCH 023/112] fix(i18n): add missing translations [CDS 4695] Signed-off-by: CDS Translator Agent --- .../bandwidth-tile/translations/Messages_de_DE.json | 10 +++++++++- .../bandwidth-tile/translations/Messages_en_GB.json | 10 +++++++++- .../bandwidth-tile/translations/Messages_es_ES.json | 10 +++++++++- .../bandwidth-tile/translations/Messages_fr_CA.json | 10 +++++++++- .../bandwidth-tile/translations/Messages_it_IT.json | 10 +++++++++- .../bandwidth-tile/translations/Messages_pl_PL.json | 10 +++++++++- .../bandwidth-tile/translations/Messages_pt_PT.json | 10 +++++++++- .../translations/Messages_de_DE.json | 8 ++++++-- .../translations/Messages_en_GB.json | 8 ++++++-- .../translations/Messages_es_ES.json | 8 ++++++-- .../translations/Messages_fr_CA.json | 6 +++++- .../translations/Messages_it_IT.json | 8 ++++++-- .../translations/Messages_pl_PL.json | 8 ++++++-- .../translations/Messages_pt_PT.json | 8 ++++++-- .../src/network-tile/translations/Messages_de_DE.json | 10 +++++++++- .../src/network-tile/translations/Messages_en_GB.json | 10 +++++++++- .../src/network-tile/translations/Messages_es_ES.json | 10 +++++++++- .../src/network-tile/translations/Messages_fr_CA.json | 10 +++++++++- .../src/network-tile/translations/Messages_it_IT.json | 10 +++++++++- .../src/network-tile/translations/Messages_pl_PL.json | 10 +++++++++- .../src/network-tile/translations/Messages_pt_PT.json | 10 +++++++++- .../ola-configuration/translations/Messages_de_DE.json | 4 +++- .../ola-configuration/translations/Messages_en_GB.json | 4 +++- .../ola-configuration/translations/Messages_es_ES.json | 4 +++- .../ola-configuration/translations/Messages_fr_CA.json | 6 +++--- .../ola-configuration/translations/Messages_it_IT.json | 4 +++- .../ola-configuration/translations/Messages_pl_PL.json | 4 +++- .../ola-configuration/translations/Messages_pt_PT.json | 4 +++- .../src/ola/ola-reset/translations/Messages_de_DE.json | 6 +++--- .../src/ola/ola-reset/translations/Messages_en_GB.json | 6 +++--- .../src/ola/ola-reset/translations/Messages_es_ES.json | 6 +++--- .../src/ola/ola-reset/translations/Messages_fr_CA.json | 6 +++--- .../src/ola/ola-reset/translations/Messages_it_IT.json | 6 +++--- .../src/ola/ola-reset/translations/Messages_pl_PL.json | 6 +++--- .../src/ola/ola-reset/translations/Messages_pt_PT.json | 6 +++--- 35 files changed, 209 insertions(+), 57 deletions(-) diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_de_DE.json b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_de_DE.json index 7a806f8cecf0..2ae7174fa720 100644 --- a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_de_DE.json +++ b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_de_DE.json @@ -1,4 +1,12 @@ { "dedicated_server_interfaces_bandwidth_title": "Bandbreite", - "dedicated_server_interfaces_bandwidth_description": "Was die öffentliche Bandbreite (von und zum Internet) betrifft, ist die eingehende Bandbreite unbegrenzt. Sie können die öffentliche und private Bandbreite erhöhen, indem Sie eine Option bestellen" + "dedicated_server_interfaces_bandwidth_description": "Was die öffentliche Bandbreite (von und zum Internet) betrifft, ist die eingehende Bandbreite unbegrenzt. Sie können die öffentliche und private Bandbreite erhöhen, indem Sie eine Option bestellen", + "dedicated_server_interfaces_bandwidth_server_ola": "OVHcloud Link Aggregation", + "dedicated_server_interfaces_bandwidth_server_ola_mode_available": "Verfügbar", + "dedicated_server_interfaces_bandwidth_server_ola_mode_double_lag": "Aktiv – Double LAG", + "dedicated_server_interfaces_bandwidth_server_ola_mode_double_lag_tooltip": "Die beiden Netzwerkinterface-Paare werden separat aggregiert, was privaten und öffentlichen Traffic ermöglicht.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag": "Aktiv – Full Private", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag_2_tooltip": "Die beiden Netzwerkinterfaces sind vollständig aggregiert und privat.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag_4_tooltip": "Die vier Netzwerkinterfaces sind vollständig aggregiert und privat.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_unavailable": "Nicht verfügbar" } diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_en_GB.json b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_en_GB.json index 7a50d8cc02b0..f1a082ce25ca 100644 --- a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_en_GB.json +++ b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_en_GB.json @@ -1,4 +1,12 @@ { "dedicated_server_interfaces_bandwidth_title": "Bandwidth", - "dedicated_server_interfaces_bandwidth_description": "Inbound public throughput (to and from the internet) is unlimited. You can increase your public and private bandwidth by signing up to the following options:" + "dedicated_server_interfaces_bandwidth_description": "Inbound public throughput (to and from the internet) is unlimited. You can increase your public and private bandwidth by signing up to the following options:", + "dedicated_server_interfaces_bandwidth_server_ola": "OVHcloud Link Aggregation", + "dedicated_server_interfaces_bandwidth_server_ola_mode_available": "Available", + "dedicated_server_interfaces_bandwidth_server_ola_mode_double_lag": "Active - Double LAG", + "dedicated_server_interfaces_bandwidth_server_ola_mode_double_lag_tooltip": "The two pairs of network interfaces are aggregated separately, enabling private and public traffic.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag": "Active - Fully private", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag_2_tooltip": "Both network interfaces are fully aggregated and private.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag_4_tooltip": "All four network interfaces are fully aggregated and private.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_unavailable": "Unavailable" } diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_es_ES.json b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_es_ES.json index 4d4183207f4e..d87bd15bec6d 100644 --- a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_es_ES.json +++ b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_es_ES.json @@ -1,4 +1,12 @@ { "dedicated_server_interfaces_bandwidth_title": "Tráfico", - "dedicated_server_interfaces_bandwidth_description": "El tráfico entrante (desde y hacia internet) no tiene limitación. Puede aumentar el ancho de banda público y privado contratando la opción correspondiente." + "dedicated_server_interfaces_bandwidth_description": "El tráfico entrante (desde y hacia internet) no tiene limitación. Puede aumentar el ancho de banda público y privado contratando la opción correspondiente.", + "dedicated_server_interfaces_bandwidth_server_ola": "OVHcloud Link Aggregation", + "dedicated_server_interfaces_bandwidth_server_ola_mode_available": "Disponible", + "dedicated_server_interfaces_bandwidth_server_ola_mode_double_lag": "Activo - Double LAG", + "dedicated_server_interfaces_bandwidth_server_ola_mode_double_lag_tooltip": "Los dos pares de interfaces de red se agregan por separado, lo que permite el tráfico privado y público.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag": "Activo - Full private", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag_2_tooltip": "Las dos interfaces de red están completamente agregadas y son privadas.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag_4_tooltip": "Las cuatro interfaces de red están completamente agregadas y son privadas.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_unavailable": "No disponible" } diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_fr_CA.json b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_fr_CA.json index c8239185655a..5af70a1c75e2 100644 --- a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_fr_CA.json +++ b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_fr_CA.json @@ -1,4 +1,12 @@ { "dedicated_server_interfaces_bandwidth_title": "Bande passante", - "dedicated_server_interfaces_bandwidth_description": "La bande passante publique (depuis et vers internet) n'est pas limitée en entrée. Vous pouvez augmenter la bande passante publique et privée en souscrivant à une option" + "dedicated_server_interfaces_bandwidth_description": "La bande passante publique (depuis et vers internet) n'est pas limitée en entrée. Vous pouvez augmenter la bande passante publique et privée en souscrivant à une option", + "dedicated_server_interfaces_bandwidth_server_ola": "OVHcloud Link Aggregation", + "dedicated_server_interfaces_bandwidth_server_ola_mode_available": "Disponible", + "dedicated_server_interfaces_bandwidth_server_ola_mode_double_lag": "Actif - Double LAG", + "dedicated_server_interfaces_bandwidth_server_ola_mode_double_lag_tooltip": "Les deux paires d'interfaces réseau sont agrégées séparément, ce qui permet un trafic privé et public.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag": "Actif - Full private", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag_2_tooltip": "Les deux interfaces réseau sont entièrement agrégées et privées.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag_4_tooltip": "Les quatres interfaces réseau sont entièrement agrégées et privées.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_unavailable": "Indisponible" } diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_it_IT.json b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_it_IT.json index ff6e99b54ec0..6746a7a2adff 100644 --- a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_it_IT.json +++ b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_it_IT.json @@ -1,4 +1,12 @@ { "dedicated_server_interfaces_bandwidth_title": "Banda passante", - "dedicated_server_interfaces_bandwidth_description": "La banda passante pubblica in entrata (da e verso Internet) non presenta limitazioni. È possibile aumentare la banda passante pubblica e privata attivando l’opzione corrispondente." + "dedicated_server_interfaces_bandwidth_description": "La banda passante pubblica in entrata (da e verso Internet) non presenta limitazioni. È possibile aumentare la banda passante pubblica e privata attivando l’opzione corrispondente.", + "dedicated_server_interfaces_bandwidth_server_ola": "OVHcloud Link Aggregation", + "dedicated_server_interfaces_bandwidth_server_ola_mode_available": "Disponibile", + "dedicated_server_interfaces_bandwidth_server_ola_mode_double_lag": "Attivo - Double LAG", + "dedicated_server_interfaces_bandwidth_server_ola_mode_double_lag_tooltip": "Le due coppie di interfacce di rete sono aggregate separatamente, permettendo un traffico privato e pubblico.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag": "Attivo - Full private", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag_2_tooltip": "Le due interfacce di rete sono interamente aggregate e private.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag_4_tooltip": "Le quattro interfacce di rete sono interamente aggregate e private.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_unavailable": "Non disponibile" } diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_pl_PL.json b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_pl_PL.json index 05ab8c3268f6..015594215930 100644 --- a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_pl_PL.json +++ b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_pl_PL.json @@ -1,4 +1,12 @@ { "dedicated_server_interfaces_bandwidth_title": "Przepustowość", - "dedicated_server_interfaces_bandwidth_description": "Przepustowość do sieci publicznej (do i z Internetu) nie jest ograniczona na wejściu. Możesz zwiększyć przepustowość do sieci publicznej oraz prywatnej, wykupując odpowiednią opcję." + "dedicated_server_interfaces_bandwidth_description": "Przepustowość do sieci publicznej (do i z Internetu) nie jest ograniczona na wejściu. Możesz zwiększyć przepustowość do sieci publicznej oraz prywatnej, wykupując odpowiednią opcję.", + "dedicated_server_interfaces_bandwidth_server_ola": "OVHcloud Link Aggregation", + "dedicated_server_interfaces_bandwidth_server_ola_mode_available": "Dostępny", + "dedicated_server_interfaces_bandwidth_server_ola_mode_double_lag": "Aktywny - Double LAG", + "dedicated_server_interfaces_bandwidth_server_ola_mode_double_lag_tooltip": "Dwie pary interfejsów sieciowych są agregowane oddzielnie, co umożliwia ruch prywatny i publiczny.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag": "Aktywny - Full private", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag_2_tooltip": "Dwa interfejsy sieciowe są w pełni zagregowane i działają w sieci prywatnej.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag_4_tooltip": "Cztery interfejsy sieciowe są w pełni zagregowane i działają w sieci prywatnej.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_unavailable": "Niedostępny" } diff --git a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_pt_PT.json b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_pt_PT.json index 0762255672db..cb497b9e4416 100644 --- a/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_pt_PT.json +++ b/packages/manager/modules/bm-server-components/src/bandwidth-tile/translations/Messages_pt_PT.json @@ -1,4 +1,12 @@ { "dedicated_server_interfaces_bandwidth_title": "Largura de banda", - "dedicated_server_interfaces_bandwidth_description": "A largura de banda pública de entrada (desde e para a Internet) não tem limitações. Pode aumentar a largura de banda pública e privada ativando a opção correspondente." + "dedicated_server_interfaces_bandwidth_description": "A largura de banda pública de entrada (desde e para a Internet) não tem limitações. Pode aumentar a largura de banda pública e privada ativando a opção correspondente.", + "dedicated_server_interfaces_bandwidth_server_ola": "OVHcloud Link Aggregation", + "dedicated_server_interfaces_bandwidth_server_ola_mode_available": "Disponível", + "dedicated_server_interfaces_bandwidth_server_ola_mode_double_lag": "Ativo - LAG duplo", + "dedicated_server_interfaces_bandwidth_server_ola_mode_double_lag_tooltip": "Os dois pares de interfaces de rede são agregados separadamente, o que permite um tráfego privado e público.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag": "Ativo - Full private", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag_2_tooltip": "As duas interfaces de rede são inteiramente agregadas e privadas.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_full_lag_4_tooltip": "As quatro interfaces de rede são inteiramente agregadas e privadas.", + "dedicated_server_interfaces_bandwidth_server_ola_mode_unavailable": "Indisponível" } diff --git a/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_de_DE.json b/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_de_DE.json index a7c5767133e5..da4f1b40bf8e 100644 --- a/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_de_DE.json +++ b/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_de_DE.json @@ -11,7 +11,7 @@ "dedicated_server_interfaces_ola_alert_configuration_needed": "Führen Sie den in der Anleitung beschriebenen Vorgang per KVM IPMI aus, damit Ihr Netzwerk korrekt funktioniert. Andernfalls ist die Konfiguration nicht abgeschlossen.", "dedicated_server_interfaces_rename_title": "Interface umbenennen", "dedicated_server_interfaces_vrack_operation_attach": "Wird verbunden", - "dedicated_server_interfaces": "Netzwerkinterfaces", + "dedicated_server_interfaces": "Netzwerkinterface-Controller (NICs)", "dedicated_server_interfaces_vrack_information": "Bitte beachten Sie, dass standardmäßig keine IP für das private Netzwerk (vRack) vorhanden ist. Erstellen Sie zuerst ein privates vRack Netzwerk, fügen Sie Ihren Server hinzu und konfigurieren Sie anschließend Ihre IPs.", "dedicated_server_interfaces_vrack_information_link_label": "Weitere Informationen zum vRack.", "dedicated_server_interfaces_step_checker_title": "OVHcloud Link Aggregation (OLA)", @@ -69,5 +69,9 @@ "dedicated_server_interfaces_task_error": "Bei der Konfiguration ist ein Fehler aufgetreten: {{ errorMessage }}", "dedicated_server_interfaces_vrack_operation_detach": "Wird getrennt", "server_vrack_attach_in_progress": "Das vRack {{vRackname}} wird gerade verbunden", - "server_vrack_detach_in_progress": "Das vRack {{vRackname}} wird gerade abgetrennt" + "server_vrack_detach_in_progress": "Das vRack {{vRackname}} wird gerade abgetrennt", + "dedicated_server_interfaces_aggregate_button": "Netzwerk-Aggregation", + "dedicated_server_interfaces_disaggregate_button": "Netzwerke trennen", + "dedicated_server_interfaces_breadcrumb": "Netzwerkinterfaces", + "dedicated_server_interfaces_type_badge_aggregated": "Aggregiert" } diff --git a/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_en_GB.json b/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_en_GB.json index a6765b4451e3..6e9b9bfa81a8 100644 --- a/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_en_GB.json +++ b/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_en_GB.json @@ -11,7 +11,7 @@ "dedicated_server_interfaces_ola_alert_configuration_needed": "You need to monitor the procedure via the IPMI KVM, detailed in the guide, in order for your network to start working. Without this step, the configuration will be incomplete.", "dedicated_server_interfaces_rename_title": "Rename the interface", "dedicated_server_interfaces_vrack_operation_attach": "Attaching...", - "dedicated_server_interfaces": "Network interfaces", + "dedicated_server_interfaces": "Network Interface Controllers (NICs)", "dedicated_server_interfaces_vrack_information": "Please note that by default, no IPs exist for the private network (vRack). You will need to create a private network (vRack) beforehand, add your server to it, then configure your IPs.", "dedicated_server_interfaces_vrack_information_link_label": "Find out more about the vRack", "dedicated_server_interfaces_step_checker_title": "OVHcloud Link Aggregation (OLA)", @@ -69,5 +69,9 @@ "dedicated_server_interfaces_task_error": "An error has occurred during configuration: {{ errorMessage }}", "dedicated_server_interfaces_vrack_operation_detach": "Detaching...", "server_vrack_attach_in_progress": "The {{vRackname}} vRack is being attached", - "server_vrack_detach_in_progress": "The {{vRackname}} vRack is being detached" + "server_vrack_detach_in_progress": "The {{vRackname}} vRack is being detached", + "dedicated_server_interfaces_aggregate_button": "Network Aggregation", + "dedicated_server_interfaces_disaggregate_button": "Disaggregate networks", + "dedicated_server_interfaces_breadcrumb": "Network interfaces", + "dedicated_server_interfaces_type_badge_aggregated": "Aggregated" } diff --git a/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_es_ES.json b/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_es_ES.json index 740dc2353882..d255d2170aeb 100644 --- a/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_es_ES.json +++ b/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_es_ES.json @@ -11,7 +11,7 @@ "dedicated_server_interfaces_ola_alert_configuration_needed": "Para que su red esté operativa, ahora deberá seguir el procedimiento a través del KVM/IPMI que se explica en la siguiente guía (esa operación es necesaria para completar la configuración).", "dedicated_server_interfaces_rename_title": "Renombrar la interfaz", "dedicated_server_interfaces_vrack_operation_attach": "Asociando...", - "dedicated_server_interfaces": "Interfaces de red", + "dedicated_server_interfaces": "Controladores de interfaz de red (NIC)", "dedicated_server_interfaces_vrack_information": "Tenga en cuenta que no hay ninguna IP preconfigurada para la red privada (vRack), sino que deberá crear previamente una red privada (vRack), añadir a ella el servidor y configurar las direcciones IP.", "dedicated_server_interfaces_vrack_information_link_label": "Más información sobre el vRack.", "dedicated_server_interfaces_step_checker_title": "OVHcloud Link Aggregation (OLA)", @@ -69,5 +69,9 @@ "dedicated_server_interfaces_task_error": "Se ha producido un error durante la configuración: {{ errorMessage }}", "dedicated_server_interfaces_vrack_operation_detach": "Desvinculado", "server_vrack_attach_in_progress": "El vRack {{vRackname}} se está asociando...", - "server_vrack_detach_in_progress": "El vRack {{vRackname}} se está desvinculando..." + "server_vrack_detach_in_progress": "El vRack {{vRackname}} se está desvinculando...", + "dedicated_server_interfaces_aggregate_button": "Agregación de redes", + "dedicated_server_interfaces_disaggregate_button": "Desagrupar redes", + "dedicated_server_interfaces_breadcrumb": "Interfaces de red", + "dedicated_server_interfaces_type_badge_aggregated": "Agregado" } diff --git a/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_fr_CA.json b/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_fr_CA.json index e71891f05893..cac9a4a511dd 100644 --- a/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_fr_CA.json +++ b/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_fr_CA.json @@ -1,5 +1,8 @@ { - "dedicated_server_interfaces": "Interfaces réseau", + "dedicated_server_interfaces": "Contrôleurs d'interfaces réseau (NICs)", + "dedicated_server_interfaces_aggregate_button": "Agrégation réseaux", + "dedicated_server_interfaces_disaggregate_button": "Désagréger les réseaux", + "dedicated_server_interfaces_breadcrumb": "Interfaces réseau", "dedicated_server_interfaces_vrack_information": "Veuillez noter que par défaut aucune IP n’existe pour le réseau privé (vRack). En effet vous devez au préalable créer un réseau privé (vRack), y ajouter votre serveur, puis configurez vos IP.", "dedicated_server_interfaces_vrack_information_link_label": "En savoir plus sur le vRack.", "dedicated_server_interfaces_step_checker_title": "OVHcloud Link Aggregation (OLA)", @@ -48,6 +51,7 @@ "dedicated_server_interfaces_type_vrack_aggregation_label": "Agrégation Privée", "dedicated_server_interfaces_type_public_aggregation_label": "Agrégation Publique", "dedicated_server_interfaces_type_isolated_label": "Isolée", + "dedicated_server_interfaces_type_badge_aggregated": "Aggrégé", "dedicated_server_interfaces_mac_label": "Adresse MAC", "dedicated_server_interfaces_bandwidth_label": "Bande passante", "dedicated_server_interfaces_bandwidth_incoming_label": "Bande passante entrante", diff --git a/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_it_IT.json b/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_it_IT.json index 47be60656b96..72fb99233ebc 100644 --- a/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_it_IT.json +++ b/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_it_IT.json @@ -11,7 +11,7 @@ "dedicated_server_interfaces_ola_alert_configuration_needed": "Per il corretto funzionamento della rete è necessario seguire via KVM IPMI la procedura descritta nella guida. (questa operazione è necessaria per completare la configurazione).", "dedicated_server_interfaces_rename_title": "Rinominare l’interfaccia", "dedicated_server_interfaces_vrack_operation_attach": "In corso di associazione", - "dedicated_server_interfaces": "Interfacce di rete", + "dedicated_server_interfaces": "Controller delle interfacce di rete (NIC)", "dedicated_server_interfaces_vrack_information": "Ti ricordiamo che, di default, sulla rete privata (vRack) non sono presenti IP. Per configurarne uno è infatti necessario creare una rete privata e aggiungervi un server.", "dedicated_server_interfaces_vrack_information_link_label": "Scopri di più sulla vRack", "dedicated_server_interfaces_step_checker_title": "OVHcloud Link Aggregation (OLA)", @@ -69,5 +69,9 @@ "dedicated_server_interfaces_task_error": "Si è verificato un errore durante la configurazione: {{ errorMessage }}", "dedicated_server_interfaces_vrack_operation_detach": "In corso di scollegamento", "server_vrack_attach_in_progress": "Associazione della vRack {{vRackname}} in corso...", - "server_vrack_detach_in_progress": "Scollegamento della vRack {{vRackname}} in corso..." + "server_vrack_detach_in_progress": "Scollegamento della vRack {{vRackname}} in corso...", + "dedicated_server_interfaces_aggregate_button": "Aggregazione delle reti", + "dedicated_server_interfaces_disaggregate_button": "Disaggregare le reti", + "dedicated_server_interfaces_breadcrumb": "Interfacce di rete", + "dedicated_server_interfaces_type_badge_aggregated": "Aggregato" } diff --git a/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_pl_PL.json b/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_pl_PL.json index 7cea09c5bf23..6cc81f9297ec 100644 --- a/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_pl_PL.json +++ b/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_pl_PL.json @@ -11,7 +11,7 @@ "dedicated_server_interfaces_ola_alert_configuration_needed": "Aby sieć działała, przeprowadź operację za pośrednictwem KVM IPMI szczegółowo opisaną w przewodniku. Bez tej czynności konfiguracja nie jest ukończona.", "dedicated_server_interfaces_rename_title": "Zmień nazwę interfejsu", "dedicated_server_interfaces_vrack_operation_attach": "Dodawanie w trakcie", - "dedicated_server_interfaces": "Interfejsy sieciowe", + "dedicated_server_interfaces": "Kontrolery interfejsów sieciowych (NIC)", "dedicated_server_interfaces_vrack_information": "Pamiętaj, że żaden adres IP nie został ustanowiony domyślnie dla sieci prywatnej (vRack). Utwórz najpierw sieć prywatną (vRack), dodaj do niej serwer, a następnie skonfiguruj adresy IP.", "dedicated_server_interfaces_vrack_information_link_label": "Dowiedz się więcej o usłudze vRack.", "dedicated_server_interfaces_step_checker_title": "OVHcloud Link Aggregation (OLA)", @@ -69,5 +69,9 @@ "dedicated_server_interfaces_task_error": "Wystąpił problem podczas konfiguracji: {{errorMessage}}.", "dedicated_server_interfaces_vrack_operation_detach": "Odłączanie w trakcie", "server_vrack_attach_in_progress": "Trwa dodawanie vRack {{vRackname}}", - "server_vrack_detach_in_progress": "Trwa odłączanie vRack {{vRackname}}" + "server_vrack_detach_in_progress": "Trwa odłączanie vRack {{vRackname}}", + "dedicated_server_interfaces_aggregate_button": "Agregacja sieci", + "dedicated_server_interfaces_disaggregate_button": "Wyłącz agregację sieci", + "dedicated_server_interfaces_breadcrumb": "Interfejsy sieciowe", + "dedicated_server_interfaces_type_badge_aggregated": "Zagregowany" } diff --git a/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_pt_PT.json b/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_pt_PT.json index a7a1f6e2da3c..2a1cbb2fed56 100644 --- a/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_pt_PT.json +++ b/packages/manager/modules/bm-server-components/src/network-interfaces/translations/Messages_pt_PT.json @@ -11,7 +11,7 @@ "dedicated_server_interfaces_ola_alert_configuration_needed": "Para que a sua rede fique operacional, deverá seguir o procedimento manual através do KVM/IPMI explicado no manual Esta operação é necessária para concluir a configuração.", "dedicated_server_interfaces_rename_title": "Alterar o nome da interface", "dedicated_server_interfaces_vrack_operation_attach": "Associação em curso", - "dedicated_server_interfaces": "Interfaces de rede", + "dedicated_server_interfaces": "Controladores de interfaces de rede (NIC)", "dedicated_server_interfaces_vrack_information": "Tenha em conta que não existe nenhum IP predefinido para a rede privada (vRack). Precisará de criar uma rede privada (vRack) antes, adicionar-lhe o seu servidor e configurar os IP.", "dedicated_server_interfaces_vrack_information_link_label": "Saber mais sobre o vRack", "dedicated_server_interfaces_step_checker_title": "OVHcloud Link Aggregation (OLA)", @@ -69,5 +69,9 @@ "dedicated_server_interfaces_task_error": "Ocorreu um erro durante a configuração: {{ errorMessage }}", "dedicated_server_interfaces_vrack_operation_detach": "Em curso de dissociação", "server_vrack_attach_in_progress": "O vRack {{vRackname}} está a ser associado", - "server_vrack_detach_in_progress": "O vRack {{vRackname}} está a ser desassociado" + "server_vrack_detach_in_progress": "O vRack {{vRackname}} está a ser desassociado", + "dedicated_server_interfaces_aggregate_button": "Agregação de redes", + "dedicated_server_interfaces_disaggregate_button": "Desagregar as redes", + "dedicated_server_interfaces_breadcrumb": "Interfaces de rede", + "dedicated_server_interfaces_type_badge_aggregated": "Agregado" } diff --git a/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_de_DE.json b/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_de_DE.json index ba22970306ac..edee2428310e 100644 --- a/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_de_DE.json +++ b/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_de_DE.json @@ -28,5 +28,13 @@ "server_network_ola_reset": "Die private Aggregation dekonfigurieren", "server_network_ola_terminate": "OLA kündigen", "server_network_ola_mode_vrack_aggregation": "Private Aggregation", - "server_network_ola_mode_default": "Standard" + "server_network_ola_mode_default": "Standard", + "server_network_ola_mode_full_lag": "Aktiv – Full Private", + "server_network_ola_mode_double_lag": "Aktiv – Double LAG", + "server_network_ola_mode_available": "Verfügbar", + "server_network_ola_mode_unavailable": "Nicht verfügbar", + "server_network_ola_mode_full_lag_description": "Die Netzwerkinterfaces sind vollständig aggregiert und privat.", + "server_network_ola_mode_double_lag_description": "Die beiden Netzwerkinterface-Paare werden separat aggregiert, was privaten und öffentlichen Traffic ermöglicht.", + "server_network_ola_mode_available_description": "Die Netzwerkinterfaces können über das Konfigurationsinterface aggregiert werden.", + "server_network_ola_mode_unavailable_description": "Ihr Server unterstützt die Aggregation von Netzwerkinterfaces nicht." } diff --git a/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_en_GB.json b/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_en_GB.json index bf9aa53e15a1..cfe627c08466 100644 --- a/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_en_GB.json +++ b/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_en_GB.json @@ -28,5 +28,13 @@ "server_network_ola_reset": "Unconfigure private aggregation", "server_network_ola_terminate": "Cancel OLA", "server_network_ola_mode_vrack_aggregation": "Private aggregation", - "server_network_ola_mode_default": "Default" + "server_network_ola_mode_default": "Default", + "server_network_ola_mode_full_lag": "Active - Fully private", + "server_network_ola_mode_double_lag": "Active - Double LAG", + "server_network_ola_mode_available": "Available", + "server_network_ola_mode_unavailable": "Unavailable", + "server_network_ola_mode_full_lag_description": "Network interfaces are fully aggregated and private", + "server_network_ola_mode_double_lag_description": "The two pairs of network interfaces are aggregated separately, enabling private and public traffic.", + "server_network_ola_mode_available_description": "The network interfaces can be aggregated via the configuration interface", + "server_network_ola_mode_unavailable_description": "Your server does not support network interface aggregation" } diff --git a/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_es_ES.json b/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_es_ES.json index 9e18595d3f54..a06877a3ffb0 100644 --- a/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_es_ES.json +++ b/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_es_ES.json @@ -28,5 +28,13 @@ "server_network_ola_reset": "Desconfigurar la agregación privada", "server_network_ola_terminate": "Dar de baja OLA", "server_network_ola_mode_vrack_aggregation": "Agregación privada", - "server_network_ola_mode_default": "Por defecto" + "server_network_ola_mode_default": "Por defecto", + "server_network_ola_mode_full_lag": "Activo - Full private", + "server_network_ola_mode_double_lag": "Activo - Double LAG", + "server_network_ola_mode_available": "Disponible", + "server_network_ola_mode_unavailable": "No disponible", + "server_network_ola_mode_full_lag_description": "Las interfaces de red están completamente agregadas y son privadas", + "server_network_ola_mode_double_lag_description": "Los dos pares de interfaces de red se agregan por separado, lo que permite el tráfico privado y público.", + "server_network_ola_mode_available_description": "Las interfaces de red pueden agregarse a través de la interfaz de configuración", + "server_network_ola_mode_unavailable_description": "El servidor no permite la agregación de interfaces de red" } diff --git a/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_fr_CA.json b/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_fr_CA.json index 35ab67993a74..828c698d2bb4 100644 --- a/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_fr_CA.json +++ b/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_fr_CA.json @@ -28,5 +28,13 @@ "server_network_ola_reset": "Déconfigurer l'agrégation privée", "server_network_ola_terminate": "Résilier OLA", "server_network_ola_mode_vrack_aggregation": "Agrégation privée", - "server_network_ola_mode_default": "Défaut" + "server_network_ola_mode_default": "Défaut", + "server_network_ola_mode_full_lag": "Actif - Full private", + "server_network_ola_mode_double_lag": "Actif - Double LAG", + "server_network_ola_mode_available": "Disponible", + "server_network_ola_mode_unavailable": "Indisponible", + "server_network_ola_mode_full_lag_description": "Les interfaces réseau sont entièrement agrégées et privées", + "server_network_ola_mode_double_lag_description": "Les deux paires d'interfaces réseau sont agrégées séparément, ce qui permet un trafic privé et public.", + "server_network_ola_mode_available_description": "Les interfaces réseau peuvent être aggrégées via l'interface de configuration", + "server_network_ola_mode_unavailable_description": "Votre serveur ne permet pas l'aggrégation des interfaces réseau" } diff --git a/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_it_IT.json b/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_it_IT.json index bb74e3ed01b1..163d2c4051ef 100644 --- a/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_it_IT.json +++ b/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_it_IT.json @@ -28,5 +28,13 @@ "server_network_ola_reset": "Rimuovi la configurazione dell’aggregazione privata", "server_network_ola_terminate": "Disattiva OLA", "server_network_ola_mode_vrack_aggregation": "Aggregazione privata", - "server_network_ola_mode_default": "Predefinito" + "server_network_ola_mode_default": "Predefinito", + "server_network_ola_mode_full_lag": "Attivo - Full private", + "server_network_ola_mode_double_lag": "Attivo - Double LAG", + "server_network_ola_mode_available": "Disponibile", + "server_network_ola_mode_unavailable": "Non disponibile", + "server_network_ola_mode_full_lag_description": "Le interfacce di rete sono interamente aggregate e private", + "server_network_ola_mode_double_lag_description": "Le due coppie di interfacce di rete sono aggregate separatamente, permettendo un traffico privato e pubblico.", + "server_network_ola_mode_available_description": "Le interfacce di rete possono essere aggregate tramite l’interfaccia di configurazione", + "server_network_ola_mode_unavailable_description": "Il tuo server non permette l'aggregazione delle interfacce di rete" } diff --git a/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_pl_PL.json b/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_pl_PL.json index 995dbf9cefe2..5bd82f7af3b5 100644 --- a/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_pl_PL.json +++ b/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_pl_PL.json @@ -28,5 +28,13 @@ "server_network_ola_reset": "Wyłącz agregację prywatną", "server_network_ola_terminate": "Rezygnuj z OLA", "server_network_ola_mode_vrack_aggregation": "Agregacja prywatna", - "server_network_ola_mode_default": "Domyślnie" + "server_network_ola_mode_default": "Domyślnie", + "server_network_ola_mode_full_lag": "Aktywny - Full private", + "server_network_ola_mode_double_lag": "Aktywny - Double LAG", + "server_network_ola_mode_available": "Dostępny", + "server_network_ola_mode_unavailable": "Niedostępny", + "server_network_ola_mode_full_lag_description": "Interfejsy sieciowe są w pełni zagregowane i działają w sieci prywatnej.", + "server_network_ola_mode_double_lag_description": "Dwie pary interfejsów sieciowych są agregowane oddzielnie, co umożliwia ruch prywatny i publiczny.", + "server_network_ola_mode_available_description": "Agregację interfejsów sieciowych włączysz w panelu konfiguracji", + "server_network_ola_mode_unavailable_description": "Twój serwer nie pozwala na agregację interfejsów sieciowych" } diff --git a/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_pt_PT.json b/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_pt_PT.json index 8a6d90bcd9e0..0705bde216df 100644 --- a/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_pt_PT.json +++ b/packages/manager/modules/bm-server-components/src/network-tile/translations/Messages_pt_PT.json @@ -28,5 +28,13 @@ "server_network_ola_reset": "Remover a configuração da agregação privada", "server_network_ola_terminate": "Rescindir a opção OLA", "server_network_ola_mode_vrack_aggregation": "Agregação privada", - "server_network_ola_mode_default": "Defeito" + "server_network_ola_mode_default": "Defeito", + "server_network_ola_mode_full_lag": "Ativo - Full private", + "server_network_ola_mode_double_lag": "Ativo - LAG duplo", + "server_network_ola_mode_available": "Disponível", + "server_network_ola_mode_unavailable": "Indisponível", + "server_network_ola_mode_full_lag_description": "As interfaces de rede são inteiramente agregadas e privadas", + "server_network_ola_mode_double_lag_description": "Os dois pares de interfaces de rede são agregados separadamente, o que permite um tráfego privado e público.", + "server_network_ola_mode_available_description": "As interfaces de rede podem ser agregadas através da interface de configuração", + "server_network_ola_mode_unavailable_description": "O seu servidor não permite a agregação das interfaces de rede" } diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_de_DE.json b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_de_DE.json index 835f32e59f4d..e72c14880b46 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_de_DE.json +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_de_DE.json @@ -27,5 +27,7 @@ "dedicated_server_interfaces_ola_step3_submit": "Erstellen", "dedicated_server_interface_ola_new_tab": "(Wird in einem neuen Tab geöffnet)", "dedicated_server_interfaces_ola_network_interfaces": "Ihr derzeitiges Netzwerkinterface", - "dedicated_server_interfaces_ola_network_interfaces_after": "Ihr Netzwerkinterface nach der Aktivierung" + "dedicated_server_interfaces_ola_network_interfaces_after": "Netzwerkinterface-Simulation nach Aktivierung der Linkaggregation", + "dedicated_server_interfaces_ola_column_mac_address": "MAC-Adresse", + "dedicated_server_interfaces_ola_activate": "Aggregation aktivieren" } diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_en_GB.json b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_en_GB.json index 7c5d22de8721..455fb24734b0 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_en_GB.json +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_en_GB.json @@ -27,5 +27,7 @@ "dedicated_server_interfaces_ola_error": "An error has occurred during configuration: {{ errorMessage }}", "dedicated_server_interface_ola_new_tab": "(Opens in a new tab)", "dedicated_server_interfaces_ola_network_interfaces": "Your current network interface", - "dedicated_server_interfaces_ola_network_interfaces_after": "Your network interface after activation" + "dedicated_server_interfaces_ola_network_interfaces_after": "Simulate network interface after enabling link aggregation", + "dedicated_server_interfaces_ola_column_mac_address": "MAC address", + "dedicated_server_interfaces_ola_activate": "Enable Aggregation" } diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_es_ES.json b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_es_ES.json index 93921f34fcd9..7d02d538ef2a 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_es_ES.json +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_es_ES.json @@ -27,5 +27,7 @@ "dedicated_server_interfaces_ola_error": "Se ha producido un error durante la configuración: {{ errorMessage }}.", "dedicated_server_interface_ola_new_tab": "(se abrirá en una nueva pestaña)", "dedicated_server_interfaces_ola_network_interfaces": "Su interfaz de red actual", - "dedicated_server_interfaces_ola_network_interfaces_after": "Su interfaz de red tras la activación" + "dedicated_server_interfaces_ola_network_interfaces_after": "Simulación de la interfaz de red tras la activación de la agregación de enlaces", + "dedicated_server_interfaces_ola_column_mac_address": "Dirección MAC", + "dedicated_server_interfaces_ola_activate": "Activar la agregación" } diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_fr_CA.json b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_fr_CA.json index e92679522b19..24ec6909f5d8 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_fr_CA.json +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_fr_CA.json @@ -4,18 +4,17 @@ "dedicated_server_interface_ola_new_tab": "(S'ouvre dans un nouvel onglet)", "dedicated_server_interfaces_ola_alert_configuration_reset": "Les interfaces seront dé-configurées. La connectivité à votre serveur sera perdue le temps de la configuration", - "dedicated_server_interfaces_ola_alert_not_allowed": "Les interfaces suivantes ne sont pas sélectionnables pour votre configuration. Pour pouvoir les configurer, retirez d'abord les vRacks et les IPFOs de celles-ci.", "dedicated_server_interfaces_ola_alert_obsolete_option": "Dans le cadre d'une configuration Agrégation privée, votre option de bande passante sortante publique ne sera pas utilisée.", "dedicated_server_interfaces_ola_column_mode": "Mode", - "dedicated_server_interfaces_ola_column_name": "Interface", + "dedicated_server_interfaces_ola_column_mac_address": "Adresse MAC", "dedicated_server_interfaces_ola_column_current_type": "Type", "dedicated_server_interfaces_ola_column_network_offer": "Offre réseau", "dedicated_server_interfaces_ola_column_bandwidth_outgoing": "Bande passante sortante", "dedicated_server_interfaces_ola_column_bandwidth_incoming": "Bande passante entrante", "dedicated_server_interfaces_ola_network_interfaces": "Votre interface réseau actuelle", - "dedicated_server_interfaces_ola_network_interfaces_after": "Votre interface réseau après activation", + "dedicated_server_interfaces_ola_network_interfaces_after": "Simulation d'interface réseau après l'activation de l'aggregation des liens", "dedicated_server_interfaces_ola_field_mode_label": "Choisissez un mode", "dedicated_server_interfaces_ola_field_mode_description": "OLA est capable de proposer differents types de configuration des interfaces", @@ -25,6 +24,7 @@ "dedicated_server_interfaces_ola_field_mode_choice_vrack_aggregation_description": "Les 2 interfaces réseau du serveur sont utilisées pour le réseau privé (vRack). Chaque lien dispose alors de la bande passante de base ou prise en option. A savoir : le serveur n'est dès lors plus accessible par son IP publique.", "dedicated_server_interfaces_ola_field_name_label": "Nommez l'interface", "dedicated_server_interfaces_ola_field_name_placeholder": "Nom de l'interface", + "dedicated_server_interfaces_ola_activate": "Activer l'aggregation", "dedicated_server_interfaces_ola_step1_title": "Configurez votre OLA", "dedicated_server_interfaces_ola_step2_title": "Sélectionnez vos interfaces", diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_it_IT.json b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_it_IT.json index 8eb187e49ef7..d925df7c0904 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_it_IT.json +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_it_IT.json @@ -27,5 +27,7 @@ "dedicated_server_interfaces_ola_error": "Si è verificato un errore durante la configurazione: {{ errorMessage }}", "dedicated_server_interface_ola_new_tab": "(apri in una nuova scheda)", "dedicated_server_interfaces_ola_network_interfaces": "La tua interfaccia di rete corrente", - "dedicated_server_interfaces_ola_network_interfaces_after": "La tua interfaccia di rete dopo l'attivazione" + "dedicated_server_interfaces_ola_network_interfaces_after": "Simulazione dell'interfaccia di rete dopo l'attivazione dell'aggregazione dei collegamenti", + "dedicated_server_interfaces_ola_column_mac_address": "Indirizzo MAC", + "dedicated_server_interfaces_ola_activate": "Attivare l’aggregazione" } diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_pl_PL.json b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_pl_PL.json index 31638c986623..a417419565b6 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_pl_PL.json +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_pl_PL.json @@ -27,5 +27,7 @@ "dedicated_server_interfaces_ola_error": "Wystąpił problem podczas konfiguracji: {{errorMessage}}.", "dedicated_server_interface_ola_new_tab": "Otworzy się w nowej zakładce.", "dedicated_server_interfaces_ola_network_interfaces": "Aktualny interfejs sieciowy", - "dedicated_server_interfaces_ola_network_interfaces_after": "Interfejs sieciowy po aktywacji" + "dedicated_server_interfaces_ola_network_interfaces_after": "Symulacja interfejsu sieciowego po włączeniu agregacji łączy", + "dedicated_server_interfaces_ola_column_mac_address": "Adres MAC", + "dedicated_server_interfaces_ola_activate": "Włącz agregację" } diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_pt_PT.json b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_pt_PT.json index 0fb0b3775cdf..b6a15587e9e2 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_pt_PT.json +++ b/packages/manager/modules/bm-server-components/src/ola/ola-configuration/translations/Messages_pt_PT.json @@ -27,5 +27,7 @@ "dedicated_server_interfaces_ola_error": "Ocorreu um erro durante a configuração: {{ errorMessage }}.", "dedicated_server_interface_ola_new_tab": "Abre-se numa nova janela", "dedicated_server_interfaces_ola_network_interfaces": "A sua interface de rede atual", - "dedicated_server_interfaces_ola_network_interfaces_after": "A sua interface de rede após ativação" + "dedicated_server_interfaces_ola_network_interfaces_after": "Simulação de interface de rede após ativação da agregação dos links", + "dedicated_server_interfaces_ola_column_mac_address": "Endereço MAC", + "dedicated_server_interfaces_ola_activate": "Ativar a agregação" } diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_de_DE.json b/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_de_DE.json index ebf764b75f61..9ac6ea3a0d73 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_de_DE.json +++ b/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_de_DE.json @@ -1,5 +1,5 @@ { - "dedicated_server_interfaces_ola_reset_title": "Die private Aggregation dekonfigurieren", - "dedicated_server_interfaces_ola_reset_text": "Sind Sie sicher, dass Sie die private Aggregation auf diesem Server dekonfigurieren möchten?", - "dedicated_server_interfaces_ola_reset_error": "Bei der Dekonfiguration der privaten Aggregation ist ein Fehler aufgetreten." + "dedicated_server_interfaces_ola_reset_title": "Aggregiertes Netzwerk trennen", + "dedicated_server_interfaces_ola_reset_text": "Möchten Sie dieses aggregierte Netzwerk wirklich trennen? Die Netzwerkinterfaces funktionieren nach dieser Aktion unabhängig voneinander.", + "dedicated_server_interfaces_ola_reset_error": "Beim Trennen des aggregierten Netzwerks ist ein Fehler aufgetreten." } diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_en_GB.json b/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_en_GB.json index 72022a1474e6..80778ced14a4 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_en_GB.json +++ b/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_en_GB.json @@ -1,5 +1,5 @@ { - "dedicated_server_interfaces_ola_reset_title": "Unconfigure private aggregation", - "dedicated_server_interfaces_ola_reset_text": "Are you sure you want to unconfigure private aggregation on this server?", - "dedicated_server_interfaces_ola_reset_error": "An error has occurred unconfiguring private aggregation." + "dedicated_server_interfaces_ola_reset_title": "Detach aggregated network", + "dedicated_server_interfaces_ola_reset_text": "Are you sure you want to detach this aggregated network? The network interfaces will operate independently after this action.", + "dedicated_server_interfaces_ola_reset_error": "An error occurred while detaching the aggregated network." } diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_es_ES.json b/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_es_ES.json index e39b6d32ed97..32647b1d94a7 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_es_ES.json +++ b/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_es_ES.json @@ -1,5 +1,5 @@ { - "dedicated_server_interfaces_ola_reset_title": "Desconfigurar la agregación privada", - "dedicated_server_interfaces_ola_reset_text": "¿Seguro que quiere desconfigurar la agregación privada en este servidor?", - "dedicated_server_interfaces_ola_reset_error": "Se ha producido un error al desconfigurar la agregación privada." + "dedicated_server_interfaces_ola_reset_title": "Desvincular la red agregada", + "dedicated_server_interfaces_ola_reset_text": "¿Seguro/a que quiere desvincular esta red agregada? Las interfaces de red funcionarán de forma independiente después de esta acción.", + "dedicated_server_interfaces_ola_reset_error": "Se ha producido un error al desvincular la red agregada." } diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_fr_CA.json b/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_fr_CA.json index 0f5bf071ab91..975e1241bcb2 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_fr_CA.json +++ b/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_fr_CA.json @@ -1,5 +1,5 @@ { - "dedicated_server_interfaces_ola_reset_title": "Déconfigurer l'agrégation privée", - "dedicated_server_interfaces_ola_reset_text": "Êtes-vous sûr de vouloir déconfigurer l'agrégation privée sur ce serveur?", - "dedicated_server_interfaces_ola_reset_error": "Une erreur est survenue lors de la déconfiguration de l'agrégation privée." + "dedicated_server_interfaces_ola_reset_title": "Détacher le réseau agrégé", + "dedicated_server_interfaces_ola_reset_text": "Vous sûr de vouloir détacher ce réseau agrégé ? Les interfaces réseau fonctionneront indépendamment après cette action.", + "dedicated_server_interfaces_ola_reset_error": "Une erreur est survenue lors du détachement du réseau agrégé." } diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_it_IT.json b/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_it_IT.json index 3228cb3c09d9..fc7229b01fdd 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_it_IT.json +++ b/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_it_IT.json @@ -1,5 +1,5 @@ { - "dedicated_server_interfaces_ola_reset_title": "Rimuovi la configurazione dell’aggregazione privata", - "dedicated_server_interfaces_ola_reset_text": "Vuoi davvero rimuovere la configurazione dell'aggregazione privata su questo server?", - "dedicated_server_interfaces_ola_reset_error": "Si è verificato un errore durante la rimozione della configurazione dell'aggregazione privata." + "dedicated_server_interfaces_ola_reset_title": "Scollegare la rete aggregata", + "dedicated_server_interfaces_ola_reset_text": "Vuoi davvero scollegare questa rete aggregata? Le interfacce di rete funzioneranno in modo indipendente dopo questa azione.", + "dedicated_server_interfaces_ola_reset_error": "Si è verificato un errore durante lo scollegamento della rete aggregata." } diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_pl_PL.json b/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_pl_PL.json index 9fabba75c6ea..dd60f607feaa 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_pl_PL.json +++ b/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_pl_PL.json @@ -1,5 +1,5 @@ { - "dedicated_server_interfaces_ola_reset_title": "Wyłącz agregację prywatną", - "dedicated_server_interfaces_ola_reset_text": "Czy na pewno chcesz wyłączyć agregację prywatną na tym serwerze?", - "dedicated_server_interfaces_ola_reset_error": "Wystąpił błąd podczas wyłączania agregacji prywatnej." + "dedicated_server_interfaces_ola_reset_title": "Odłącz zagregowaną sieć", + "dedicated_server_interfaces_ola_reset_text": "Czy na pewno chcesz odłączyć tę zagregowaną sieć? Po tej operacji interfejsy sieciowe będą działać niezależnie.", + "dedicated_server_interfaces_ola_reset_error": "Wystąpił błąd podczas odłączania zagregowanej sieci." } diff --git a/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_pt_PT.json b/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_pt_PT.json index 1d4f6363f880..d2b47568303e 100644 --- a/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_pt_PT.json +++ b/packages/manager/modules/bm-server-components/src/ola/ola-reset/translations/Messages_pt_PT.json @@ -1,5 +1,5 @@ { - "dedicated_server_interfaces_ola_reset_title": "Remover a configuração da agregação privada", - "dedicated_server_interfaces_ola_reset_text": "Tem a certeza de que quer desconfigurar a agregação privada neste servidor?", - "dedicated_server_interfaces_ola_reset_error": "Ocorreu um erro durante a desconfiguração da agregação privada." + "dedicated_server_interfaces_ola_reset_title": "Desassociar a rede agregada", + "dedicated_server_interfaces_ola_reset_text": "Tem a certeza de que quer desassociar esta rede agregada? As interfaces de rede funcionarão de forma independente após esta ação.", + "dedicated_server_interfaces_ola_reset_error": "Ocorreu um erro ao desassociar a rede agregada." } From 5406ecf748ececef6c5946afa1e03b3f7cbff726 Mon Sep 17 00:00:00 2001 From: ovh-cds Date: Thu, 5 Mar 2026 08:30:55 +0000 Subject: [PATCH 024/112] release(*): francium-hamster-1 Signed-off-by: ovh-cds --- .sonarcloud.properties | 2 +- packages/manager/apps/dedicated/CHANGELOG.md | 13 ++++++++++ packages/manager/apps/dedicated/package.json | 8 +++--- packages/manager/apps/iplb/CHANGELOG.md | 8 ++++++ packages/manager/apps/iplb/package.json | 4 +-- packages/manager/apps/metrics/CHANGELOG.md | 8 ++++++ packages/manager/apps/metrics/package.json | 4 +-- packages/manager/apps/nasha/CHANGELOG.md | 8 ++++++ packages/manager/apps/nasha/package.json | 4 +-- packages/manager/apps/netapp/CHANGELOG.md | 8 ++++++ packages/manager/apps/netapp/package.json | 4 +-- packages/manager/apps/nutanix/CHANGELOG.md | 8 ++++++ packages/manager/apps/nutanix/package.json | 8 +++--- packages/manager/apps/pci/CHANGELOG.md | 8 ++++++ packages/manager/apps/pci/package.json | 4 +-- .../manager/apps/public-cloud/CHANGELOG.md | 8 ++++++ .../manager/apps/public-cloud/package.json | 4 +-- packages/manager/apps/telecom/CHANGELOG.md | 8 ++++++ packages/manager/apps/telecom/package.json | 4 +-- packages/manager/apps/vps/CHANGELOG.md | 8 ++++++ packages/manager/apps/vps/package.json | 4 +-- packages/manager/apps/web/CHANGELOG.md | 8 ++++++ packages/manager/apps/web/package.json | 4 +-- .../modules/bm-server-components/CHANGELOG.md | 26 +++++++++++++++++++ .../modules/bm-server-components/package.json | 2 +- .../modules/manager-components/CHANGELOG.md | 11 ++++++++ .../modules/manager-components/package.json | 2 +- packages/manager/modules/nutanix/CHANGELOG.md | 11 ++++++++ packages/manager/modules/nutanix/package.json | 2 +- .../pci-universe-components/CHANGELOG.md | 8 ++++++ .../pci-universe-components/package.json | 4 +-- 31 files changed, 181 insertions(+), 32 deletions(-) diff --git a/.sonarcloud.properties b/.sonarcloud.properties index 4754ee7baa4d..a87f67c94740 100644 --- a/.sonarcloud.properties +++ b/.sonarcloud.properties @@ -7,7 +7,7 @@ sonar.projectName=manager sonar.sources=. sonar.sourceEncoding=UTF-8 sonar.ws.timeout=60 -sonar.projectVersion=francium-hamster +sonar.projectVersion=francium-hamster-1 sonar.exclusions=node_modules/**, **/node_modules/**, **/dist/**, **/semantic/**, **/coverage/**, **/static/**, **/mock/**, **/mockServiceWorker.js sonar.coverage.exclusions=**/*.spec.js diff --git a/packages/manager/apps/dedicated/CHANGELOG.md b/packages/manager/apps/dedicated/CHANGELOG.md index 364411942b4c..98bfd81cceec 100644 --- a/packages/manager/apps/dedicated/CHANGELOG.md +++ b/packages/manager/apps/dedicated/CHANGELOG.md @@ -3,6 +3,19 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [20.75.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-dedicated@20.74.15...@ovh-ux/manager-dedicated@20.75.0) (2026-03-05) + + +### Features + +* **network-interfaces:** reworking the display of aggregated network interfaces ([c451aa6](https://github.com/ovh/manager/commit/c451aa66cca353fda4887a066245bd5f45a613c6)), closes [#MANAGER-17094](https://github.com/ovh/manager/issues/MANAGER-17094) +* **ola-nics:** adding aggregation/desaggregation buttons to nics lists ([c9b13a2](https://github.com/ovh/manager/commit/c9b13a2c3d987477c34af214f68bcf0249efc850)), closes [#MANAGER-17106](https://github.com/ovh/manager/issues/MANAGER-17106) +* **ola-nics:** include the OLA information into the bandwidth display ([5c68904](https://github.com/ovh/manager/commit/5c689043c2722c9bba794bb28c833654a69533d1)), closes [#MANAGER-17071](https://github.com/ovh/manager/issues/MANAGER-17071) + + + + + ## [20.74.15](https://github.com/ovh/manager/compare/@ovh-ux/manager-dedicated@20.74.14...@ovh-ux/manager-dedicated@20.74.15) (2026-03-04) **Note:** Version bump only for package @ovh-ux/manager-dedicated diff --git a/packages/manager/apps/dedicated/package.json b/packages/manager/apps/dedicated/package.json index f307beeed4a7..9f7f1b828c45 100644 --- a/packages/manager/apps/dedicated/package.json +++ b/packages/manager/apps/dedicated/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-dedicated", - "version": "20.74.15", + "version": "20.75.0", "private": true, "description": "OVHcloud Dedicated control panel.", "repository": { @@ -27,12 +27,12 @@ "@ovh-ux/manager-beta-preference": "^1.0.6", "@ovh-ux/manager-billing": "^0.65.4", "@ovh-ux/manager-billing-components": "^4.35.5", - "@ovh-ux/manager-bm-server-components": "^2.21.1", + "@ovh-ux/manager-bm-server-components": "^2.22.0", "@ovh-ux/manager-catalog-price": "^1.8.1", "@ovh-ux/manager-cda": "^1.10.2", "@ovh-ux/manager-cloud-connect": "^1.27.1", "@ovh-ux/manager-cloud-styles": "^1.9.3", - "@ovh-ux/manager-components": "^1.28.0", + "@ovh-ux/manager-components": "^1.29.0", "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-core": "^13.4.4", "@ovh-ux/manager-dbaas-logs": "^1.37.5", @@ -46,7 +46,7 @@ "@ovh-ux/manager-nasha": "^2.20.3", "@ovh-ux/manager-netapp": "^2.17.10", "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", - "@ovh-ux/manager-nutanix": "^2.11.29", + "@ovh-ux/manager-nutanix": "^2.12.0", "@ovh-ux/manager-resource-tagging": "^1.3.2", "@ovh-ux/manager-support": "^2.1.45", "@ovh-ux/manager-trusted-nic": "^1.2.2", diff --git a/packages/manager/apps/iplb/CHANGELOG.md b/packages/manager/apps/iplb/CHANGELOG.md index 2d0507f19478..58f999f5abcd 100644 --- a/packages/manager/apps/iplb/CHANGELOG.md +++ b/packages/manager/apps/iplb/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.2.50](https://github.com/ovh/manager/compare/@ovh-ux/manager-iplb-app@3.2.49...@ovh-ux/manager-iplb-app@3.2.50) (2026-03-05) + +**Note:** Version bump only for package @ovh-ux/manager-iplb-app + + + + + ## [3.2.49](https://github.com/ovh/manager/compare/@ovh-ux/manager-iplb-app@3.2.48...@ovh-ux/manager-iplb-app@3.2.49) (2026-03-04) **Note:** Version bump only for package @ovh-ux/manager-iplb-app diff --git a/packages/manager/apps/iplb/package.json b/packages/manager/apps/iplb/package.json index cbad3a20107e..6288827c0836 100644 --- a/packages/manager/apps/iplb/package.json +++ b/packages/manager/apps/iplb/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-iplb-app", - "version": "3.2.49", + "version": "3.2.50", "private": true, "description": "IP Load Balancer standalone application.", "repository": { @@ -17,7 +17,7 @@ "start": "webpack-dev-server" }, "dependencies": { - "@ovh-ux/manager-components": "^1.28.0", + "@ovh-ux/manager-components": "^1.29.0", "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-core": "^13.4.4", "@ovh-ux/manager-filters": "^1.2.2", diff --git a/packages/manager/apps/metrics/CHANGELOG.md b/packages/manager/apps/metrics/CHANGELOG.md index 502688123edf..da17dfe80bfe 100644 --- a/packages/manager/apps/metrics/CHANGELOG.md +++ b/packages/manager/apps/metrics/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.96](https://github.com/ovh/manager/compare/@ovh-ux/manager-metrics-app@3.0.95...@ovh-ux/manager-metrics-app@3.0.96) (2026-03-05) + +**Note:** Version bump only for package @ovh-ux/manager-metrics-app + + + + + ## [3.0.95](https://github.com/ovh/manager/compare/@ovh-ux/manager-metrics-app@3.0.94...@ovh-ux/manager-metrics-app@3.0.95) (2026-03-04) **Note:** Version bump only for package @ovh-ux/manager-metrics-app diff --git a/packages/manager/apps/metrics/package.json b/packages/manager/apps/metrics/package.json index 08e3d41a832f..4fe7dc939f7c 100644 --- a/packages/manager/apps/metrics/package.json +++ b/packages/manager/apps/metrics/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-metrics-app", - "version": "3.0.95", + "version": "3.0.96", "private": true, "repository": { "type": "git", @@ -16,7 +16,7 @@ "start": "webpack-dev-server" }, "dependencies": { - "@ovh-ux/manager-components": "^1.28.0", + "@ovh-ux/manager-components": "^1.29.0", "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-core": "^13.4.4", "@ovh-ux/manager-metrics": "^1.6.2", diff --git a/packages/manager/apps/nasha/CHANGELOG.md b/packages/manager/apps/nasha/CHANGELOG.md index c3a6c4d2174e..a2d8138411ae 100644 --- a/packages/manager/apps/nasha/CHANGELOG.md +++ b/packages/manager/apps/nasha/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.0.148](https://github.com/ovh/manager/compare/@ovh-ux/manager-nasha-app@4.0.147...@ovh-ux/manager-nasha-app@4.0.148) (2026-03-05) + +**Note:** Version bump only for package @ovh-ux/manager-nasha-app + + + + + ## [4.0.147](https://github.com/ovh/manager/compare/@ovh-ux/manager-nasha-app@4.0.146...@ovh-ux/manager-nasha-app@4.0.147) (2026-03-04) **Note:** Version bump only for package @ovh-ux/manager-nasha-app diff --git a/packages/manager/apps/nasha/package.json b/packages/manager/apps/nasha/package.json index 13bddb958534..eb1910e0a10b 100644 --- a/packages/manager/apps/nasha/package.json +++ b/packages/manager/apps/nasha/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-nasha-app", - "version": "4.0.147", + "version": "4.0.148", "private": true, "description": "NAS-HA standalone application.", "repository": { @@ -19,7 +19,7 @@ "dependencies": { "@ovh-ux/manager-billing-components": "^4.35.5", "@ovh-ux/manager-catalog-price": "^1.8.1", - "@ovh-ux/manager-components": "^1.28.0", + "@ovh-ux/manager-components": "^1.29.0", "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-core": "^13.4.4", "@ovh-ux/manager-filters": "^1.2.2", diff --git a/packages/manager/apps/netapp/CHANGELOG.md b/packages/manager/apps/netapp/CHANGELOG.md index e74e27a39124..472e6b9352aa 100644 --- a/packages/manager/apps/netapp/CHANGELOG.md +++ b/packages/manager/apps/netapp/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.9.166](https://github.com/ovh/manager/compare/@ovh-ux/manager-netapp-app@0.9.165...@ovh-ux/manager-netapp-app@0.9.166) (2026-03-05) + +**Note:** Version bump only for package @ovh-ux/manager-netapp-app + + + + + ## [0.9.165](https://github.com/ovh/manager/compare/@ovh-ux/manager-netapp-app@0.9.164...@ovh-ux/manager-netapp-app@0.9.165) (2026-03-04) **Note:** Version bump only for package @ovh-ux/manager-netapp-app diff --git a/packages/manager/apps/netapp/package.json b/packages/manager/apps/netapp/package.json index 1d1f262ba52e..b03df27a4832 100644 --- a/packages/manager/apps/netapp/package.json +++ b/packages/manager/apps/netapp/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-netapp-app", - "version": "0.9.165", + "version": "0.9.166", "private": true, "description": "NetApp standalone application", "repository": { @@ -20,7 +20,7 @@ "@ovh-ux/manager-advices": "^1.8.7", "@ovh-ux/manager-billing-components": "^4.35.5", "@ovh-ux/manager-catalog-price": "^1.8.1", - "@ovh-ux/manager-components": "^1.28.0", + "@ovh-ux/manager-components": "^1.29.0", "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-core": "^13.4.4", "@ovh-ux/manager-error-page": "^2.4.7", diff --git a/packages/manager/apps/nutanix/CHANGELOG.md b/packages/manager/apps/nutanix/CHANGELOG.md index 4dd7e2a00484..558fa672776b 100644 --- a/packages/manager/apps/nutanix/CHANGELOG.md +++ b/packages/manager/apps/nutanix/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.0.138](https://github.com/ovh/manager/compare/@ovh-ux/manager-nutanix-app@3.0.137...@ovh-ux/manager-nutanix-app@3.0.138) (2026-03-05) + +**Note:** Version bump only for package @ovh-ux/manager-nutanix-app + + + + + ## [3.0.137](https://github.com/ovh/manager/compare/@ovh-ux/manager-nutanix-app@3.0.136...@ovh-ux/manager-nutanix-app@3.0.137) (2026-03-04) **Note:** Version bump only for package @ovh-ux/manager-nutanix-app diff --git a/packages/manager/apps/nutanix/package.json b/packages/manager/apps/nutanix/package.json index a6035fbc82e6..b3947981fa14 100644 --- a/packages/manager/apps/nutanix/package.json +++ b/packages/manager/apps/nutanix/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-nutanix-app", - "version": "3.0.137", + "version": "3.0.138", "private": true, "description": "OVHcloud Nutanix app", "repository": { @@ -17,13 +17,13 @@ "start": "webpack-dev-server" }, "dependencies": { - "@ovh-ux/manager-bm-server-components": "^2.21.1", - "@ovh-ux/manager-components": "^1.28.0", + "@ovh-ux/manager-bm-server-components": "^2.22.0", + "@ovh-ux/manager-components": "^1.29.0", "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-core": "^13.4.4", "@ovh-ux/manager-error-page": "^2.4.7", "@ovh-ux/manager-ng-layout-helpers": "^2.13.1", - "@ovh-ux/manager-nutanix": "^2.11.29", + "@ovh-ux/manager-nutanix": "^2.12.0", "@ovh-ux/ng-at-internet": "^6.0.46", "@ovh-ux/ng-at-internet-ui-router-plugin": "^3.5.6", "@ovh-ux/ng-ovh-api-wrappers": "^5.1.0", diff --git a/packages/manager/apps/pci/CHANGELOG.md b/packages/manager/apps/pci/CHANGELOG.md index 8d765a56eb0d..2e4428df5261 100644 --- a/packages/manager/apps/pci/CHANGELOG.md +++ b/packages/manager/apps/pci/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [5.1.22](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-app@5.1.21...@ovh-ux/manager-pci-app@5.1.22) (2026-03-05) + +**Note:** Version bump only for package @ovh-ux/manager-pci-app + + + + + ## [5.1.21](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-app@5.1.20...@ovh-ux/manager-pci-app@5.1.21) (2026-03-04) **Note:** Version bump only for package @ovh-ux/manager-pci-app diff --git a/packages/manager/apps/pci/package.json b/packages/manager/apps/pci/package.json index 4287b97d5a31..8b96b84b19f1 100644 --- a/packages/manager/apps/pci/package.json +++ b/packages/manager/apps/pci/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-pci-app", - "version": "5.1.21", + "version": "5.1.22", "private": true, "description": "Public Cloud Instance standalone application.", "repository": { @@ -20,7 +20,7 @@ "@ovh-ux/manager-advices": "^1.8.7", "@ovh-ux/manager-banner": "^1.3.7", "@ovh-ux/manager-cloud-styles": "^1.9.3", - "@ovh-ux/manager-components": "^1.28.0", + "@ovh-ux/manager-components": "^1.29.0", "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-core": "^13.4.4", "@ovh-ux/manager-filters": "^1.2.2", diff --git a/packages/manager/apps/public-cloud/CHANGELOG.md b/packages/manager/apps/public-cloud/CHANGELOG.md index c3e10f3756ef..a49e87e82822 100644 --- a/packages/manager/apps/public-cloud/CHANGELOG.md +++ b/packages/manager/apps/public-cloud/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [7.12.3](https://github.com/ovh/manager/compare/@ovh-ux/manager-public-cloud@7.12.2...@ovh-ux/manager-public-cloud@7.12.3) (2026-03-05) + +**Note:** Version bump only for package @ovh-ux/manager-public-cloud + + + + + ## [7.12.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-public-cloud@7.12.1...@ovh-ux/manager-public-cloud@7.12.2) (2026-03-04) **Note:** Version bump only for package @ovh-ux/manager-public-cloud diff --git a/packages/manager/apps/public-cloud/package.json b/packages/manager/apps/public-cloud/package.json index 0ece7a94d54d..fc4c251ad2a0 100644 --- a/packages/manager/apps/public-cloud/package.json +++ b/packages/manager/apps/public-cloud/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-public-cloud", - "version": "7.12.2", + "version": "7.12.3", "private": true, "description": "OVHcloud Public Cloud control panel.", "repository": { @@ -23,7 +23,7 @@ "@ovh-ux/manager-banner": "^1.3.7", "@ovh-ux/manager-catalog-price": "^1.8.1", "@ovh-ux/manager-cloud-styles": "^1.9.3", - "@ovh-ux/manager-components": "^1.28.0", + "@ovh-ux/manager-components": "^1.29.0", "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-core": "^13.4.4", "@ovh-ux/manager-error-page": "^2.4.7", diff --git a/packages/manager/apps/telecom/CHANGELOG.md b/packages/manager/apps/telecom/CHANGELOG.md index bae2045ba368..8f83a162da80 100644 --- a/packages/manager/apps/telecom/CHANGELOG.md +++ b/packages/manager/apps/telecom/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [16.26.9](https://github.com/ovh/manager/compare/@ovh-ux/manager-telecom@16.26.8...@ovh-ux/manager-telecom@16.26.9) (2026-03-05) + +**Note:** Version bump only for package @ovh-ux/manager-telecom + + + + + ## [16.26.8](https://github.com/ovh/manager/compare/@ovh-ux/manager-telecom@16.26.7...@ovh-ux/manager-telecom@16.26.8) (2026-03-04) **Note:** Version bump only for package @ovh-ux/manager-telecom diff --git a/packages/manager/apps/telecom/package.json b/packages/manager/apps/telecom/package.json index 19ea7263f85d..2fb0d178b81f 100644 --- a/packages/manager/apps/telecom/package.json +++ b/packages/manager/apps/telecom/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-telecom", - "version": "16.26.8", + "version": "16.26.9", "private": true, "description": "OVHcloud Telecom control panel.", "repository": { @@ -22,7 +22,7 @@ "@ovh-ux/manager-banner": "^1.3.7", "@ovh-ux/manager-beta-preference": "^1.0.6", "@ovh-ux/manager-carrier-sip": "^2.3.2", - "@ovh-ux/manager-components": "^1.28.0", + "@ovh-ux/manager-components": "^1.29.0", "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-core": "^13.4.4", "@ovh-ux/manager-error-page": "^2.4.7", diff --git a/packages/manager/apps/vps/CHANGELOG.md b/packages/manager/apps/vps/CHANGELOG.md index a59c14d18f49..19bb2318c3c6 100644 --- a/packages/manager/apps/vps/CHANGELOG.md +++ b/packages/manager/apps/vps/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [3.1.121](https://github.com/ovh/manager/compare/@ovh-ux/manager-vps-app@3.1.120...@ovh-ux/manager-vps-app@3.1.121) (2026-03-05) + +**Note:** Version bump only for package @ovh-ux/manager-vps-app + + + + + ## [3.1.120](https://github.com/ovh/manager/compare/@ovh-ux/manager-vps-app@3.1.119...@ovh-ux/manager-vps-app@3.1.120) (2026-03-04) **Note:** Version bump only for package @ovh-ux/manager-vps-app diff --git a/packages/manager/apps/vps/package.json b/packages/manager/apps/vps/package.json index 3bdc34d74031..877686c19ebc 100644 --- a/packages/manager/apps/vps/package.json +++ b/packages/manager/apps/vps/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-vps-app", - "version": "3.1.120", + "version": "3.1.121", "private": true, "description": "VPS standalone application.", "repository": { @@ -19,7 +19,7 @@ "dependencies": { "@ovh-ux/manager-advices": "^1.8.7", "@ovh-ux/manager-catalog-price": "^1.8.1", - "@ovh-ux/manager-components": "^1.28.0", + "@ovh-ux/manager-components": "^1.29.0", "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-core": "^13.4.4", "@ovh-ux/manager-filters": "^1.2.2", diff --git a/packages/manager/apps/web/CHANGELOG.md b/packages/manager/apps/web/CHANGELOG.md index ba5393b3265a..f1954a18e941 100644 --- a/packages/manager/apps/web/CHANGELOG.md +++ b/packages/manager/apps/web/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [19.37.4](https://github.com/ovh/manager/compare/@ovh-ux/manager-web@19.37.3...@ovh-ux/manager-web@19.37.4) (2026-03-05) + +**Note:** Version bump only for package @ovh-ux/manager-web + + + + + ## [19.37.3](https://github.com/ovh/manager/compare/@ovh-ux/manager-web@19.37.2...@ovh-ux/manager-web@19.37.3) (2026-03-04) **Note:** Version bump only for package @ovh-ux/manager-web diff --git a/packages/manager/apps/web/package.json b/packages/manager/apps/web/package.json index e42d26a71327..5813aa33586c 100644 --- a/packages/manager/apps/web/package.json +++ b/packages/manager/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-web", - "version": "19.37.3", + "version": "19.37.4", "private": true, "description": "OVHcloud Web control panel.", "repository": { @@ -21,7 +21,7 @@ "@ovh-ux/manager-at-internet-configuration": "^1.5.1", "@ovh-ux/manager-banner": "^1.3.7", "@ovh-ux/manager-catalog-price": "^1.8.1", - "@ovh-ux/manager-components": "^1.28.0", + "@ovh-ux/manager-components": "^1.29.0", "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-core": "^13.4.4", "@ovh-ux/manager-email-domain": "^1.11.17", diff --git a/packages/manager/modules/bm-server-components/CHANGELOG.md b/packages/manager/modules/bm-server-components/CHANGELOG.md index 183fddc2a8b4..9cde726a1c6d 100644 --- a/packages/manager/modules/bm-server-components/CHANGELOG.md +++ b/packages/manager/modules/bm-server-components/CHANGELOG.md @@ -3,6 +3,32 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.22.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-bm-server-components@2.21.1...@ovh-ux/manager-bm-server-components@2.22.0) (2026-03-05) + + +### Bug Fixes + +* **dedicated:** remove warning banner for the OLA association ([aecccf3](https://github.com/ovh/manager/commit/aecccf329fef4e2cfc24e1235e7cb3eb0d104c4e)), closes [#MANAGER-20717](https://github.com/ovh/manager/issues/MANAGER-20717) +* **i18n:** add missing translations [CDS 4695] ([f74c807](https://github.com/ovh/manager/commit/f74c807a96178ed91785966a53311a988ded9f1e)) +* **ola-nics:** fixing the display of the list of nics ([9597b89](https://github.com/ovh/manager/commit/9597b89d9182603b836f68af20a785b77bcd1bc8)), closes [#MANAGER-17094](https://github.com/ovh/manager/issues/MANAGER-17094) +* **ola-nics:** fixing the display of unavailable OLA in the network panel ([72f07fb](https://github.com/ovh/manager/commit/72f07fb9fced075617fea70a0cb334f5163ed57c)), closes [#MANAGER-17110](https://github.com/ovh/manager/issues/MANAGER-17110) + + +### Features + +* **dedicated.ola:** fix fr text ([6bc53ca](https://github.com/ovh/manager/commit/6bc53ca209eee372fe1db180862d99a302cc143b)), closes [#MANAGER-17106](https://github.com/ovh/manager/issues/MANAGER-17106) +* **dedicated.ola:** ola revamp on server dashboard ([26bedcf](https://github.com/ovh/manager/commit/26bedcf38f5f1f764e0e2af372b225dc13b97a90)), closes [#MANAGER-17110](https://github.com/ovh/manager/issues/MANAGER-17110) +* **dedicated:** show interface bandwidth by nic ([31fb4b8](https://github.com/ovh/manager/commit/31fb4b852775dfbf78738ea3133e018e0b3b5380)), closes [#MANAGER-20611](https://github.com/ovh/manager/issues/MANAGER-20611) +* **network-interfaces:** reworking the display of aggregated network interfaces ([c451aa6](https://github.com/ovh/manager/commit/c451aa66cca353fda4887a066245bd5f45a613c6)), closes [#MANAGER-17094](https://github.com/ovh/manager/issues/MANAGER-17094) +* **ola-nics:** adding aggregation/desaggregation buttons to nics lists ([c9b13a2](https://github.com/ovh/manager/commit/c9b13a2c3d987477c34af214f68bcf0249efc850)), closes [#MANAGER-17106](https://github.com/ovh/manager/issues/MANAGER-17106) +* **ola-nics:** include the OLA information into the bandwidth display ([5c68904](https://github.com/ovh/manager/commit/5c689043c2722c9bba794bb28c833654a69533d1)), closes [#MANAGER-17071](https://github.com/ovh/manager/issues/MANAGER-17071) +* **ola-nics:** reworking the ola configuration component ([65979f9](https://github.com/ovh/manager/commit/65979f97e5ddae831d630b4b15582e22dbc3d353)), closes [#MANAGER-17069](https://github.com/ovh/manager/issues/MANAGER-17069) +* **ola:** rename full lag to full private ([475a48d](https://github.com/ovh/manager/commit/475a48d648754cc46a1097442537b99d7133ffbb)), closes [#MANAGER-17071](https://github.com/ovh/manager/issues/MANAGER-17071) + + + + + ## [2.21.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-bm-server-components@2.21.0...@ovh-ux/manager-bm-server-components@2.21.1) (2026-02-17) diff --git a/packages/manager/modules/bm-server-components/package.json b/packages/manager/modules/bm-server-components/package.json index bbdea86228d1..78accf2be254 100644 --- a/packages/manager/modules/bm-server-components/package.json +++ b/packages/manager/modules/bm-server-components/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-bm-server-components", - "version": "2.21.1", + "version": "2.22.0", "private": true, "description": "OVHcloud BmServerComponents product", "repository": { diff --git a/packages/manager/modules/manager-components/CHANGELOG.md b/packages/manager/modules/manager-components/CHANGELOG.md index 00bf1b16b6f8..79386241c14f 100644 --- a/packages/manager/modules/manager-components/CHANGELOG.md +++ b/packages/manager/modules/manager-components/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [1.29.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-components@1.28.0...@ovh-ux/manager-components@1.29.0) (2026-03-05) + + +### Features + +* **dedicated:** show interface bandwidth by nic ([31fb4b8](https://github.com/ovh/manager/commit/31fb4b852775dfbf78738ea3133e018e0b3b5380)), closes [#MANAGER-20611](https://github.com/ovh/manager/issues/MANAGER-20611) + + + + + # [1.28.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-components@1.27.3...@ovh-ux/manager-components@1.28.0) (2026-02-26) diff --git a/packages/manager/modules/manager-components/package.json b/packages/manager/modules/manager-components/package.json index 37765a46aee1..a63952a57d21 100644 --- a/packages/manager/modules/manager-components/package.json +++ b/packages/manager/modules/manager-components/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-components", - "version": "1.28.0", + "version": "1.29.0", "private": true, "description": "A set of reusable UI components, to be used across the OVH Manager", "repository": { diff --git a/packages/manager/modules/nutanix/CHANGELOG.md b/packages/manager/modules/nutanix/CHANGELOG.md index e970e495e380..191fab9508c3 100644 --- a/packages/manager/modules/nutanix/CHANGELOG.md +++ b/packages/manager/modules/nutanix/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.12.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-nutanix@2.11.29...@ovh-ux/manager-nutanix@2.12.0) (2026-03-05) + + +### Features + +* **dedicated:** show interface bandwidth by nic ([31fb4b8](https://github.com/ovh/manager/commit/31fb4b852775dfbf78738ea3133e018e0b3b5380)), closes [#MANAGER-20611](https://github.com/ovh/manager/issues/MANAGER-20611) + + + + + ## [2.11.29](https://github.com/ovh/manager/compare/@ovh-ux/manager-nutanix@2.11.28...@ovh-ux/manager-nutanix@2.11.29) (2026-02-05) **Note:** Version bump only for package @ovh-ux/manager-nutanix diff --git a/packages/manager/modules/nutanix/package.json b/packages/manager/modules/nutanix/package.json index 7495df12a7f1..801863cdbe9e 100644 --- a/packages/manager/modules/nutanix/package.json +++ b/packages/manager/modules/nutanix/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-nutanix", - "version": "2.11.29", + "version": "2.12.0", "private": true, "description": "OVHcloud Nutanix product", "repository": { diff --git a/packages/manager/modules/pci-universe-components/CHANGELOG.md b/packages/manager/modules/pci-universe-components/CHANGELOG.md index 37552b67784d..dffbf49cdff2 100644 --- a/packages/manager/modules/pci-universe-components/CHANGELOG.md +++ b/packages/manager/modules/pci-universe-components/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.2.9](https://github.com/ovh/manager/compare/@ovh-ux/ng-ovh-pci-universe-components@1.2.8...@ovh-ux/ng-ovh-pci-universe-components@1.2.9) (2026-03-05) + +**Note:** Version bump only for package @ovh-ux/ng-ovh-pci-universe-components + + + + + ## [1.2.8](https://github.com/ovh/manager/compare/@ovh-ux/ng-ovh-pci-universe-components@1.2.7...@ovh-ux/ng-ovh-pci-universe-components@1.2.8) (2026-02-26) **Note:** Version bump only for package @ovh-ux/ng-ovh-pci-universe-components diff --git a/packages/manager/modules/pci-universe-components/package.json b/packages/manager/modules/pci-universe-components/package.json index 5e5167d615cb..8374dc868ab1 100644 --- a/packages/manager/modules/pci-universe-components/package.json +++ b/packages/manager/modules/pci-universe-components/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/ng-ovh-pci-universe-components", - "version": "1.2.8", + "version": "1.2.9", "private": true, "description": "OVHCloud common PCI components", "repository": { @@ -16,7 +16,7 @@ "lint:fix": "manager-legacy-lint --kinds tsx,js,css,html,md --fix --continue" }, "dependencies": { - "@ovh-ux/manager-components": "^1.28.0", + "@ovh-ux/manager-components": "^1.29.0", "bootstrap4": "twbs/bootstrap#v4.0.0", "lodash": "^4.17.15", "ovh-api-services": "^15.0.0" From 0365f2df244e9441abc6a3e2b952d902d0c644f7 Mon Sep 17 00:00:00 2001 From: Quentin Pavy Date: Thu, 8 Jan 2026 12:41:32 +0100 Subject: [PATCH 025/112] feat(dedicated-servers): add manage view button popover and drawer ref: #MANAGER-20555 Signed-off-by: Quentin Pavy --- .../manage-view/Messages_fr_FR.json | 14 ++ .../src/components/manageView/index.tsx | 3 + .../manageView/manageView.constants.tsx | 3 + .../manageView/manageViewButton.tsx | 182 ++++++++++++++++++ .../manageView/manageViewDrawer.tsx | 97 ++++++++++ .../src/components/manageView/types.ts | 5 + .../src/components/orderMenu.tsx | 4 +- .../src/data/api/manager-preferences.ts | 46 +++++ .../manage-views/useCreateViewPreference.tsx | 54 ++++++ .../manage-views/useGetViewPreferences.tsx | 34 ++++ .../apps/dedicated-servers/src/index.tsx | 2 +- .../dedicated-servers/tailwind.config.mjs | 2 +- 12 files changed, 443 insertions(+), 3 deletions(-) create mode 100644 packages/manager/apps/dedicated-servers/public/translations/manage-view/Messages_fr_FR.json create mode 100644 packages/manager/apps/dedicated-servers/src/components/manageView/index.tsx create mode 100644 packages/manager/apps/dedicated-servers/src/components/manageView/manageView.constants.tsx create mode 100644 packages/manager/apps/dedicated-servers/src/components/manageView/manageViewButton.tsx create mode 100644 packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx create mode 100644 packages/manager/apps/dedicated-servers/src/components/manageView/types.ts create mode 100644 packages/manager/apps/dedicated-servers/src/data/api/manager-preferences.ts create mode 100644 packages/manager/apps/dedicated-servers/src/hooks/manage-views/useCreateViewPreference.tsx create mode 100644 packages/manager/apps/dedicated-servers/src/hooks/manage-views/useGetViewPreferences.tsx diff --git a/packages/manager/apps/dedicated-servers/public/translations/manage-view/Messages_fr_FR.json b/packages/manager/apps/dedicated-servers/public/translations/manage-view/Messages_fr_FR.json new file mode 100644 index 000000000000..9e618c3e5b58 --- /dev/null +++ b/packages/manager/apps/dedicated-servers/public/translations/manage-view/Messages_fr_FR.json @@ -0,0 +1,14 @@ +{ + "manage_view": "Gérer la vue", + "current_view": "Vue actuelle", + "configure_current_view": "Configurer la vue actuelle", + "delete_current_view": "Supprimer la vue actuelle", + "views": "Vues", + "add_new_view": "Ajouter une nouvelle vue", + "standard_view": "Vue standard", + "default": "Par défaut", + "new_view": "Nouvelle vue", + "set_as_default": "Définir par défaut", + "edit_view_name": "Modifier le nom de la vue", + "maximum_views_number_reached": "Le nombre de vues maximale est atteint (5)" +} diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/index.tsx b/packages/manager/apps/dedicated-servers/src/components/manageView/index.tsx new file mode 100644 index 000000000000..6b2d94db4ea6 --- /dev/null +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/index.tsx @@ -0,0 +1,3 @@ +import ManageViewButton from './manageViewButton'; + +export { ManageViewButton }; diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/manageView.constants.tsx b/packages/manager/apps/dedicated-servers/src/components/manageView/manageView.constants.tsx new file mode 100644 index 000000000000..70130d475809 --- /dev/null +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/manageView.constants.tsx @@ -0,0 +1,3 @@ +export const PREFERENCES_KEY = 'DATAGRID_VIEWS_CONFIG_DEDICATED_SERVERS'; +export const STANDARD_VIEW_ID = 'standard-view'; +export const MAX_VIEWS_NUMBER = 5; diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewButton.tsx b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewButton.tsx new file mode 100644 index 000000000000..e98b2b1be19b --- /dev/null +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewButton.tsx @@ -0,0 +1,182 @@ +import React, { useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { + Button, + BUTTON_VARIANT, + BUTTON_SIZE, + ICON_NAME, + Icon, + Popover, + PopoverTrigger, + PopoverContent, + Divider, + POPOVER_POSITION, + TEXT_PRESET, + Text, + RadioGroup, + Radio, + RadioControl, + RadioLabel, + Badge, + BADGE_COLOR, + BADGE_SIZE, + BUTTON_COLOR, + Tooltip, + TooltipTrigger, + TooltipContent, +} from '@ovh-ux/muk'; +import { + MAX_VIEWS_NUMBER, + PREFERENCES_KEY, + STANDARD_VIEW_ID, +} from './manageView.constants'; +import { ViewType } from './types'; +import ManageViewDrawer from './manageViewDrawer'; +import { useGetViewsPreferences } from '@/hooks/manage-views/useGetViewPreferences'; + +export const ManageViewButton = () => { + const { t } = useTranslation('manage-view'); + const [views, setViews] = useState([]); + const [isOpoverOpen, setIsPopoverOpen] = useState(false); + const [isDrawerOpen, setIsDrawerOpen] = useState(false); + const [currentView, setCurrentView] = useState(null); + + const { preferences, error, isLoading } = useGetViewsPreferences({ + key: PREFERENCES_KEY, + enabled: true, + }); + + useEffect(() => { + const viewList: ViewType[] = + preferences && !error && !isLoading ? preferences : []; + + const foundDefaultView = viewList.find((view) => view.default); + + viewList.unshift({ + name: t('standard_view'), + id: STANDARD_VIEW_ID, + default: !foundDefaultView, + }); + + setViews(viewList); + setCurrentView(foundDefaultView || viewList[0]); + }, [preferences, isLoading, error]); + + const popoverChange = ({ open }: { open: boolean }) => { + setIsPopoverOpen(open); + }; + + const closeDrawer = () => { + setIsDrawerOpen(false); + }; + + const changeView = ({ value: viewId }: { value: string }) => { + setCurrentView(views.find(({ id }) => id === viewId)); + }; + + return ( +
+ + + + + +
+ + {t('current_view')} + + + + + + + + + + {t('views')} + + + + {views.map((view) => ( + + + + + {view.name} + {view.default && ( + + {t('default')} + + )} + + + ))} + + + +
+
+
+ +
+ ); +}; + +export default ManageViewButton; diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx new file mode 100644 index 000000000000..bb37592fd239 --- /dev/null +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx @@ -0,0 +1,97 @@ +import React, { useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { NAMESPACES } from '@ovh-ux/manager-common-translations'; +import { + Button, + BUTTON_VARIANT, + ICON_NAME, + Icon, + TEXT_PRESET, + Text, + Drawer, + Checkbox, + CheckboxControl, + CheckboxLabel, +} from '@ovh-ux/muk'; +import { PREFERENCES_KEY, STANDARD_VIEW_ID } from './manageView.constants'; +import { ViewType } from './types'; +import { useCreateViewsPreference } from '@/hooks/manage-views/useCreateViewPreference'; + +export type ManageViewDrawerProps = { + views: ViewType[]; + view?: ViewType; + isOpen: boolean; + handleDismiss: () => void; + handleConfirm: () => void; + handleCancel: () => void; +}; +export const ManageViewDrawer = ({ + views, + view, + isOpen, + handleDismiss, + handleConfirm, + handleCancel, +}: ManageViewDrawerProps) => { + const { t } = useTranslation('manage-view'); + const { t: tCommon } = useTranslation(NAMESPACES.ACTIONS); + const [editingView, setEditingView] = useState(null); + const { isPending, mutate: createViews } = useCreateViewsPreference({ + key: PREFERENCES_KEY, + }); + + useEffect(() => { + setEditingView({ + name: view?.name || t('new_view'), + id: view?.id || `view-${views.length}`, + }); + }, [view, views]); + + const saveViewChanges = () => { + createViews({ + views: [ + ...views.filter((_view) => _view.id !== STANDARD_VIEW_ID), + editingView, + ], + }); + handleConfirm(); + }; + + return ( + + +
+
+ + {editingView?.name} + + +
+ + + {t('set_as_default')} + +
+ {/* Add view configuration here */} +
+ +
+ ); +}; + +export default ManageViewDrawer; diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/types.ts b/packages/manager/apps/dedicated-servers/src/components/manageView/types.ts new file mode 100644 index 000000000000..a427d14cede0 --- /dev/null +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/types.ts @@ -0,0 +1,5 @@ +export type ViewType = { + name: string; + id: string; + default?: boolean; +}; diff --git a/packages/manager/apps/dedicated-servers/src/components/orderMenu.tsx b/packages/manager/apps/dedicated-servers/src/components/orderMenu.tsx index 6c757ddecfba..2cbd6ef6bb68 100644 --- a/packages/manager/apps/dedicated-servers/src/components/orderMenu.tsx +++ b/packages/manager/apps/dedicated-servers/src/components/orderMenu.tsx @@ -12,6 +12,7 @@ import useLinkUtils, { UrlLinks } from '@/hooks/useLinkUtils'; import { orderLinks } from '@/data/constants/orderLinks'; import ExportCsv from './exportCsv'; import { ExportCsvDataType } from './exportCsv/types'; +import { ManageViewButton } from './manageView'; export const OrderMenu: React.FC<{ exportCsvData: ExportCsvDataType }> = ({ exportCsvData, @@ -33,7 +34,7 @@ export const OrderMenu: React.FC<{ exportCsvData: ExportCsvDataType }> = ({ }; return ( -
+
= ({ label={tCommon('order')} /> +
+ key + ? ['/me/preferences/manager', `/me/preferences/manager/${key}`] + : ['/me/preferences/manager']; + +export const getManagerPreferences = (key?: string): Promise => + apiClient.v6 + .get( + `/me/preferences/manager${key ? `/${encodeURIComponent(key)}` : ''}`, + ) + .then(({ data }) => { + return data?.value ? JSON.parse(data.value) : []; + }); + +export const postManagerPreferences = ( + params: PostManagerPreferencesParams, +): Promise> => + apiClient.v6.post(`/me/preferences/manager`, { + key: params.key, + value: params.value, + }); + +export type PutManagerPreferencesParams = { + key: string; + value: string; +}; + +export const putManagerPreferences = ( + params: PutManagerPreferencesParams, +): Promise> => + apiClient.v6.put(`/me/preferences/manager/${params.key}`, { + value: params.value, + }); diff --git a/packages/manager/apps/dedicated-servers/src/hooks/manage-views/useCreateViewPreference.tsx b/packages/manager/apps/dedicated-servers/src/hooks/manage-views/useCreateViewPreference.tsx new file mode 100644 index 000000000000..f159bde889c6 --- /dev/null +++ b/packages/manager/apps/dedicated-servers/src/hooks/manage-views/useCreateViewPreference.tsx @@ -0,0 +1,54 @@ +import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { ApiError } from '@ovh-ux/manager-core-api'; +import { useNotifications } from '@ovh-ux/manager-react-components'; +import { + getManagerPreferencesQueryKey, + postManagerPreferences, +} from '@/data/api/manager-preferences'; + +export type ViewType = { + name: string; + id: string; + default?: boolean; +}; + +export type CreateViewsPreferenceMutationParams = { + views: ViewType[]; +}; + +export type UseCreateViewsPreferenceParams = { + key: string; + onError?: (apiError: ApiError) => void; + onSuccess?: (variables: CreateViewsPreferenceMutationParams) => void; + onSettled?: () => void; +}; + +export const useCreateViewsPreference = ({ + key, + onError, + onSuccess, + onSettled, +}: UseCreateViewsPreferenceParams) => { + const queryClient = useQueryClient(); + const { clearNotifications } = useNotifications(); + + return useMutation({ + mutationFn: ({ views }: CreateViewsPreferenceMutationParams) => + postManagerPreferences({ + key, + value: JSON.stringify(views), + }), + onSuccess: async (_, variables) => { + clearNotifications(); + await queryClient.invalidateQueries({ + queryKey: getManagerPreferencesQueryKey(), + }); + onSuccess?.(variables); + }, + onError: (error: ApiError) => { + clearNotifications(); + onError?.(error); + }, + onSettled, + }); +}; diff --git a/packages/manager/apps/dedicated-servers/src/hooks/manage-views/useGetViewPreferences.tsx b/packages/manager/apps/dedicated-servers/src/hooks/manage-views/useGetViewPreferences.tsx new file mode 100644 index 000000000000..ecfc5c51b9ac --- /dev/null +++ b/packages/manager/apps/dedicated-servers/src/hooks/manage-views/useGetViewPreferences.tsx @@ -0,0 +1,34 @@ +import { useQuery } from '@tanstack/react-query'; +import { ApiError } from '@ovh-ux/manager-core-api'; +import { + getManagerPreferences, + getManagerPreferencesQueryKey, +} from '@/data/api/manager-preferences'; +import { ViewType } from '@/components/manageView/types'; + +export type UseGetViewsPreferencesParams = { + key?: string; + enabled?: boolean; +}; + +export const useGetViewsPreferences = ({ + key, + enabled = true, +}: UseGetViewsPreferencesParams) => { + const { data: preferences, isLoading, isError, error } = useQuery< + ViewType[], + ApiError + >({ + queryKey: getManagerPreferencesQueryKey(key), + queryFn: () => getManagerPreferences(key), + enabled, + retry: false, + }); + + return { + preferences, + isLoading, + isError, + error, + }; +}; diff --git a/packages/manager/apps/dedicated-servers/src/index.tsx b/packages/manager/apps/dedicated-servers/src/index.tsx index c6fa5cd487ec..1798dcd57541 100644 --- a/packages/manager/apps/dedicated-servers/src/index.tsx +++ b/packages/manager/apps/dedicated-servers/src/index.tsx @@ -34,7 +34,7 @@ const init = async (appName: string) => { context, reloadOnLocaleChange: true, defaultNS: appName, - ns: ['dedicated-servers', 'cluster', 'onboarding'], + ns: ['dedicated-servers', 'cluster', 'onboarding', 'manage-view'], }); const region = context.environment.getRegion(); diff --git a/packages/manager/apps/dedicated-servers/tailwind.config.mjs b/packages/manager/apps/dedicated-servers/tailwind.config.mjs index 9c8eddbbab15..a6a253e47893 100644 --- a/packages/manager/apps/dedicated-servers/tailwind.config.mjs +++ b/packages/manager/apps/dedicated-servers/tailwind.config.mjs @@ -9,7 +9,7 @@ export default { './src/**/*.{js,jsx,ts,tsx}', path.join( path.dirname(require.resolve('@ovh-ux/muk')), - '**/*.{js,jsx,ts,tsx}', + '**/*.{js,jsx,ts,tsx,cjs}', ), ], theme: { From 7d00a0dd14066d0d7916a8ad96bff677e9aef531 Mon Sep 17 00:00:00 2001 From: soufien mhelhali Date: Thu, 15 Jan 2026 08:29:43 +0100 Subject: [PATCH 026/112] feat(dedicated-server): edit view ref: #MANAGER-20561 Signed-off-by: soufien mhelhali --- .../manageView/manageViewButton.tsx | 18 ++- .../manageView/manageViewDrawer-v2.tsx | 135 ++++++++++++++++++ .../manageView/manageViewDrawer.tsx | 4 +- .../manageView/manageViewDrawerTitle.tsx | 87 +++++++++++ ...eference.tsx => useSaveViewPreference.tsx} | 12 +- 5 files changed, 245 insertions(+), 11 deletions(-) create mode 100644 packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer-v2.tsx create mode 100644 packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawerTitle.tsx rename packages/manager/apps/dedicated-servers/src/hooks/manage-views/{useCreateViewPreference.tsx => useSaveViewPreference.tsx} (76%) diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewButton.tsx b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewButton.tsx index e98b2b1be19b..ad24e5e2815e 100644 --- a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewButton.tsx +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewButton.tsx @@ -31,7 +31,7 @@ import { STANDARD_VIEW_ID, } from './manageView.constants'; import { ViewType } from './types'; -import ManageViewDrawer from './manageViewDrawer'; +import ManageViewDrawer from './manageViewDrawer-v2'; import { useGetViewsPreferences } from '@/hooks/manage-views/useGetViewPreferences'; export const ManageViewButton = () => { @@ -40,6 +40,7 @@ export const ManageViewButton = () => { const [isOpoverOpen, setIsPopoverOpen] = useState(false); const [isDrawerOpen, setIsDrawerOpen] = useState(false); const [currentView, setCurrentView] = useState(null); + const [selectedView, selectView] = useState(null); const { preferences, error, isLoading } = useGetViewsPreferences({ key: PREFERENCES_KEY, @@ -98,7 +99,16 @@ export const ManageViewButton = () => { {t('current_view')} - @@ -107,6 +117,7 @@ export const ManageViewButton = () => { role="menuitem" variant={BUTTON_VARIANT.ghost} color={BUTTON_COLOR.critical} + disabled={currentView?.id === views[0]?.id} > {t('delete_current_view')} @@ -144,6 +155,7 @@ export const ManageViewButton = () => { role="menuitem" variant={BUTTON_VARIANT.ghost} onClick={() => { + selectView(null); setIsPopoverOpen(false); setIsDrawerOpen(true); }} @@ -168,7 +180,7 @@ export const ManageViewButton = () => { void; + handleConfirm: () => void; + handleCancel: () => void; +}; +export const ManageViewDrawer = ({ + views, + view, + isOpen, + handleDismiss, + handleConfirm, + handleCancel, +}: ManageViewDrawerProps) => { + const { t } = useTranslation('manage-view'); + const { t: tCommon } = useTranslation(NAMESPACES.ACTIONS); + const [editingView, setEditingView] = useState(null); + const { isPending, mutate: createViews } = useSaveViewsPreference({ + key: PREFERENCES_KEY, + }); + + useEffect(() => { + setEditingView({ + name: view?.name || t('new_view'), + id: view?.id || `view-${views.length}`, + default: view?.default, + }); + }, [isOpen, view, views]); + + const handleNameChange = (value: string) => { + setEditingView({ + ...editingView, + name: value, + }); + }; + + const handelSetDefault = () => { + setEditingView({ + ...editingView, + default: !editingView.default, + }); + }; + + const saveViewChanges = () => { + const currentDefault = views.find((_view) => _view.default); + if (editingView.default && currentDefault) currentDefault.default = null; + const updatedViews = view + ? views.map((_view) => + _view.id === editingView.id ? editingView : _view, + ) + : [...views, editingView]; + + createViews({ + views: updatedViews.filter((_view) => _view.id !== STANDARD_VIEW_ID), + }); + handleConfirm(); + }; + + return ( +
+ {isOpen && ( + + )} +
+ ); +}; + +export default ManageViewDrawer; diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx index bb37592fd239..cea68a015d23 100644 --- a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx @@ -15,7 +15,7 @@ import { } from '@ovh-ux/muk'; import { PREFERENCES_KEY, STANDARD_VIEW_ID } from './manageView.constants'; import { ViewType } from './types'; -import { useCreateViewsPreference } from '@/hooks/manage-views/useCreateViewPreference'; +import { useSaveViewsPreference } from '@/hooks/manage-views/useSaveViewPreference'; export type ManageViewDrawerProps = { views: ViewType[]; @@ -36,7 +36,7 @@ export const ManageViewDrawer = ({ const { t } = useTranslation('manage-view'); const { t: tCommon } = useTranslation(NAMESPACES.ACTIONS); const [editingView, setEditingView] = useState(null); - const { isPending, mutate: createViews } = useCreateViewsPreference({ + const { isPending, mutate: createViews } = useSaveViewsPreference({ key: PREFERENCES_KEY, }); diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawerTitle.tsx b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawerTitle.tsx new file mode 100644 index 000000000000..168bfe286e59 --- /dev/null +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawerTitle.tsx @@ -0,0 +1,87 @@ +import { + Button, + BUTTON_VARIANT, + Icon, + ICON_NAME, + TEXT_PRESET, + Text, + INPUT_TYPE, + Input, +} from '@ovh-ux/muk'; +import React, { useState } from 'react'; +import { useTranslation } from 'react-i18next'; + +export type ManageViewDrawerTitleProps = { + value: string; + onChange: (value: string) => void; +}; + +export const ManageViewDrawerTitle = ({ + value, + onChange, +}: ManageViewDrawerTitleProps) => { + const { t } = useTranslation('dedicated-servers'); + const [isEditMode, setEditMode] = useState(false); + const [inputValue, setInputValue] = useState(''); + + const handleChange = (e: React.ChangeEvent) => { + setInputValue(e.target.value); + }; + + return ( +
+ {isEditMode && ( + <> + +
+ + +
+ + )} + {!isEditMode && ( + <> + + {value} + + + + )} +
+ ); +}; + +export default ManageViewDrawerTitle; diff --git a/packages/manager/apps/dedicated-servers/src/hooks/manage-views/useCreateViewPreference.tsx b/packages/manager/apps/dedicated-servers/src/hooks/manage-views/useSaveViewPreference.tsx similarity index 76% rename from packages/manager/apps/dedicated-servers/src/hooks/manage-views/useCreateViewPreference.tsx rename to packages/manager/apps/dedicated-servers/src/hooks/manage-views/useSaveViewPreference.tsx index f159bde889c6..996c1623491d 100644 --- a/packages/manager/apps/dedicated-servers/src/hooks/manage-views/useCreateViewPreference.tsx +++ b/packages/manager/apps/dedicated-servers/src/hooks/manage-views/useSaveViewPreference.tsx @@ -12,28 +12,28 @@ export type ViewType = { default?: boolean; }; -export type CreateViewsPreferenceMutationParams = { +export type SaveViewsPreferenceMutationParams = { views: ViewType[]; }; -export type UseCreateViewsPreferenceParams = { +export type UseSaveViewsPreferenceParams = { key: string; onError?: (apiError: ApiError) => void; - onSuccess?: (variables: CreateViewsPreferenceMutationParams) => void; + onSuccess?: (variables: SaveViewsPreferenceMutationParams) => void; onSettled?: () => void; }; -export const useCreateViewsPreference = ({ +export const useSaveViewsPreference = ({ key, onError, onSuccess, onSettled, -}: UseCreateViewsPreferenceParams) => { +}: UseSaveViewsPreferenceParams) => { const queryClient = useQueryClient(); const { clearNotifications } = useNotifications(); return useMutation({ - mutationFn: ({ views }: CreateViewsPreferenceMutationParams) => + mutationFn: ({ views }: SaveViewsPreferenceMutationParams) => postManagerPreferences({ key, value: JSON.stringify(views), From 88b04b85e15963d661e26e190e16dcff5dabb846 Mon Sep 17 00:00:00 2001 From: Quentin Pavy Date: Fri, 9 Jan 2026 13:52:49 +0100 Subject: [PATCH 027/112] feat(dedicated-servers): column visibility in views and switch views ref: #MANAGER-20621 Signed-off-by: Quentin Pavy --- .../manage-view/Messages_fr_FR.json | 3 +- .../src/components/dataGridColumns.tsx | 7 + .../manageView/manageView.constants.tsx | 20 +++ .../manageView/manageViewButton.tsx | 44 ++---- .../manageView/manageViewConfig.tsx | 86 +++++++++++ .../manageView/manageViewDrawer-v2.tsx | 135 ------------------ .../manageView/manageViewDrawer.tsx | 111 +++++++++----- .../components/manageView/style.module.scss | 32 +++++ .../src/components/manageView/types.ts | 3 + .../src/components/manageView/viewContext.tsx | 109 ++++++++++++++ .../src/components/serverDatagrid.tsx | 98 +++++++++++++ .../manage-views/useSaveViewPreference.tsx | 43 ++++-- .../src/pages/listing/server/index.tsx | 117 +-------------- 13 files changed, 476 insertions(+), 332 deletions(-) create mode 100644 packages/manager/apps/dedicated-servers/src/components/manageView/manageViewConfig.tsx delete mode 100644 packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer-v2.tsx create mode 100644 packages/manager/apps/dedicated-servers/src/components/manageView/style.module.scss create mode 100644 packages/manager/apps/dedicated-servers/src/components/manageView/viewContext.tsx create mode 100644 packages/manager/apps/dedicated-servers/src/components/serverDatagrid.tsx diff --git a/packages/manager/apps/dedicated-servers/public/translations/manage-view/Messages_fr_FR.json b/packages/manager/apps/dedicated-servers/public/translations/manage-view/Messages_fr_FR.json index 9e618c3e5b58..a93906e83cfa 100644 --- a/packages/manager/apps/dedicated-servers/public/translations/manage-view/Messages_fr_FR.json +++ b/packages/manager/apps/dedicated-servers/public/translations/manage-view/Messages_fr_FR.json @@ -10,5 +10,6 @@ "new_view": "Nouvelle vue", "set_as_default": "Définir par défaut", "edit_view_name": "Modifier le nom de la vue", - "maximum_views_number_reached": "Le nombre de vues maximale est atteint (5)" + "maximum_views_number_reached": "Le nombre de vues maximale est atteint (5)", + "select_columns_visibility": "Sélectionner les colonnes à afficher" } diff --git a/packages/manager/apps/dedicated-servers/src/components/dataGridColumns.tsx b/packages/manager/apps/dedicated-servers/src/components/dataGridColumns.tsx index 3633755c0275..2906d3ee06b2 100644 --- a/packages/manager/apps/dedicated-servers/src/components/dataGridColumns.tsx +++ b/packages/manager/apps/dedicated-servers/src/components/dataGridColumns.tsx @@ -161,6 +161,7 @@ export function useColumns(): DatagridColumn[] { isSortable: true, type: FilterTypeCategories.Boolean, header: t('server_display_state'), + label: t('server_display_state'), cell: ({ row: { original: server } }) => ( [] { enableHiding: true, type: FilterTypeCategories.Boolean, header: t('server_display_monitoring'), + label: t('server_display_monitoring'), cell: ({ row: { original: server } }) => MonitoringStatusChip(server), }, { @@ -189,6 +191,7 @@ export function useColumns(): DatagridColumn[] { enableHiding: true, type: FilterTypeCategories.String, header: t('server_display_vrack'), + label: t('server_display_vrack'), cell: ({ row: { original: server } }) => DSVrack(server), }, { @@ -200,6 +203,7 @@ export function useColumns(): DatagridColumn[] { enableHiding: true, type: FilterTypeCategories.String, header: t('server_display_renew'), + label: t('server_display_renew'), cell: ({ row: { original: server } }) => RenewCell(server), }, { @@ -211,6 +215,7 @@ export function useColumns(): DatagridColumn[] { enableHiding: true, type: FilterTypeCategories.String, header: t('server_display_expiration'), + label: t('server_display_expiration'), cell: ({ row: { original: server } }) => ExpirationCell(server), }, { @@ -222,6 +227,7 @@ export function useColumns(): DatagridColumn[] { enableHiding: true, type: FilterTypeCategories.String, header: t('server_display_engagement'), + label: t('server_display_engagement'), cell: ({ row: { original: server } }) => EngagementCell(server), }, { @@ -233,6 +239,7 @@ export function useColumns(): DatagridColumn[] { isSortable: false, type: FilterTypeCategories.String, header: t('server_display_price'), + label: t('server_display_price'), cell: ({ row: { original: server } }) => PriceCell(server), }, { diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/manageView.constants.tsx b/packages/manager/apps/dedicated-servers/src/components/manageView/manageView.constants.tsx index 70130d475809..7c425aca2e82 100644 --- a/packages/manager/apps/dedicated-servers/src/components/manageView/manageView.constants.tsx +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/manageView.constants.tsx @@ -1,3 +1,23 @@ export const PREFERENCES_KEY = 'DATAGRID_VIEWS_CONFIG_DEDICATED_SERVERS'; export const STANDARD_VIEW_ID = 'standard-view'; export const MAX_VIEWS_NUMBER = 5; +export const DEFAULT_COLUMN_VISIBILITY: Record = { + serverId: false, + 'iam.displayName': true, + ip: true, + reverse: false, + commercialRange: true, + os: false, + region: true, + rack: false, + datacenter: false, + state: true, + monitoring: false, + vrack: false, + renew: false, + expiration: false, + engagement: false, + price: false, + tags: true, + actions: true, +}; diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewButton.tsx b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewButton.tsx index ad24e5e2815e..63ffea9da58b 100644 --- a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewButton.tsx +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewButton.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import React, { useContext, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Button, @@ -25,43 +25,17 @@ import { TooltipTrigger, TooltipContent, } from '@ovh-ux/muk'; -import { - MAX_VIEWS_NUMBER, - PREFERENCES_KEY, - STANDARD_VIEW_ID, -} from './manageView.constants'; +import { MAX_VIEWS_NUMBER } from './manageView.constants'; import { ViewType } from './types'; -import ManageViewDrawer from './manageViewDrawer-v2'; -import { useGetViewsPreferences } from '@/hooks/manage-views/useGetViewPreferences'; +import ManageViewDrawer from './manageViewDrawer'; +import { ViewContext } from './viewContext'; export const ManageViewButton = () => { const { t } = useTranslation('manage-view'); - const [views, setViews] = useState([]); + const { views, currentView, setCurrentView } = useContext(ViewContext); const [isOpoverOpen, setIsPopoverOpen] = useState(false); const [isDrawerOpen, setIsDrawerOpen] = useState(false); - const [currentView, setCurrentView] = useState(null); - const [selectedView, selectView] = useState(null); - - const { preferences, error, isLoading } = useGetViewsPreferences({ - key: PREFERENCES_KEY, - enabled: true, - }); - - useEffect(() => { - const viewList: ViewType[] = - preferences && !error && !isLoading ? preferences : []; - - const foundDefaultView = viewList.find((view) => view.default); - - viewList.unshift({ - name: t('standard_view'), - id: STANDARD_VIEW_ID, - default: !foundDefaultView, - }); - - setViews(viewList); - setCurrentView(foundDefaultView || viewList[0]); - }, [preferences, isLoading, error]); + const [viewToEdit, selectViewToEdit] = useState(null); const popoverChange = ({ open }: { open: boolean }) => { setIsPopoverOpen(open); @@ -101,7 +75,7 @@ export const ManageViewButton = () => { - -
- - )} -
- ); -}; - -export default ManageViewDrawer; diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx index cea68a015d23..36fde61db26e 100644 --- a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx @@ -4,18 +4,17 @@ import { NAMESPACES } from '@ovh-ux/manager-common-translations'; import { Button, BUTTON_VARIANT, - ICON_NAME, Icon, - TEXT_PRESET, - Text, - Drawer, Checkbox, CheckboxControl, CheckboxLabel, } from '@ovh-ux/muk'; +import { ODS_ICON_NAME } from '@ovhcloud/ods-components'; import { PREFERENCES_KEY, STANDARD_VIEW_ID } from './manageView.constants'; import { ViewType } from './types'; import { useSaveViewsPreference } from '@/hooks/manage-views/useSaveViewPreference'; +import ManageViewDrawerTitle from './manageViewDrawerTitle'; +import ManageViewConfig from './manageViewConfig'; export type ManageViewDrawerProps = { views: ViewType[]; @@ -36,7 +35,7 @@ export const ManageViewDrawer = ({ const { t } = useTranslation('manage-view'); const { t: tCommon } = useTranslation(NAMESPACES.ACTIONS); const [editingView, setEditingView] = useState(null); - const { isPending, mutate: createViews } = useSaveViewsPreference({ + const { isPending, mutate: saveViews } = useSaveViewsPreference({ key: PREFERENCES_KEY, }); @@ -44,53 +43,87 @@ export const ManageViewDrawer = ({ setEditingView({ name: view?.name || t('new_view'), id: view?.id || `view-${views.length}`, + default: view?.default, }); - }, [view, views]); + }, [isOpen, view, views]); + + const handleNameChange = (value: string) => { + setEditingView({ + ...editingView, + name: value, + }); + }; + + const handelSetDefault = () => { + setEditingView({ + ...editingView, + default: !editingView.default, + }); + }; const saveViewChanges = () => { - createViews({ - views: [ - ...views.filter((_view) => _view.id !== STANDARD_VIEW_ID), - editingView, - ], + saveViews({ + view: editingView, }); handleConfirm(); }; return ( - - -
-
- - {editingView?.name} - +
+ {isOpen && ( +
- {/* Add view configuration here */} - - - + + )} +
); }; diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/style.module.scss b/packages/manager/apps/dedicated-servers/src/components/manageView/style.module.scss new file mode 100644 index 000000000000..89fd1df1f362 --- /dev/null +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/style.module.scss @@ -0,0 +1,32 @@ +.column-list { + display: flex; + flex-flow: column; + row-gap: 0.5rem; + margin: 0; + padding: 0; + list-style: none; + + &__item { + width: 100%; + // display: flex; + // flex-flow: row; + // align-items: center; + // flex-grow: 1; + + &__card { + width: 100%; + padding: 0.5rem 1rem; + display: flex; + justify-content: space-between; + align-items: center; + cursor: pointer; + &.disabled { + background-color: var(--ods-color-background-disabled-default); + cursor: not-allowed; + } + &.selected { + background-color: var(--ods-color-primary-025); + } + } + } +} diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/types.ts b/packages/manager/apps/dedicated-servers/src/components/manageView/types.ts index a427d14cede0..5412535a82d9 100644 --- a/packages/manager/apps/dedicated-servers/src/components/manageView/types.ts +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/types.ts @@ -1,5 +1,8 @@ +import { VisibilityState } from '@tanstack/react-table'; + export type ViewType = { name: string; id: string; default?: boolean; + columnVisibility?: VisibilityState; }; diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/viewContext.tsx b/packages/manager/apps/dedicated-servers/src/components/manageView/viewContext.tsx new file mode 100644 index 000000000000..ac98b6240b74 --- /dev/null +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/viewContext.tsx @@ -0,0 +1,109 @@ +import React, { + useMemo, + useState, + PropsWithChildren, + createContext, + useEffect, +} from 'react'; +import { useTranslation } from 'react-i18next'; +import { DatagridColumn } from '@ovh-ux/muk'; +import { VisibilityState } from '@tanstack/react-table'; +import { useColumns } from '../dataGridColumns'; +import { DedicatedServer } from '@/data/types/server.type'; +import { ViewType } from './types'; +import { useGetViewsPreferences } from '@/hooks/manage-views/useGetViewPreferences'; +import { + DEFAULT_COLUMN_VISIBILITY, + PREFERENCES_KEY, + STANDARD_VIEW_ID, +} from './manageView.constants'; + +export type ColumnsConfig = DatagridColumn & { + visible?: boolean; +}; + +export type ViewContextType = { + views: ViewType[]; + currentView?: ViewType; + setCurrentView: React.Dispatch>; + columnsConfig: ColumnsConfig[]; + columnVisibility: VisibilityState; + setColumnVisibility: React.Dispatch>; +}; + +export const ViewContext = createContext>({ + views: [], + currentView: null, + setCurrentView: () => {}, + columnsConfig: [], + columnVisibility: {}, + setColumnVisibility: () => {}, +}); + +export const ViewContextProvider = ({ children }: PropsWithChildren) => { + const { t } = useTranslation('manage-view'); + const [views, setViews] = useState([]); + const [currentView, setCurrentView] = useState(null); + const [columnVisibility, setColumnVisibility] = useState( + DEFAULT_COLUMN_VISIBILITY, + ); + + // Fetch saved views preferences + const { preferences, error, isLoading } = useGetViewsPreferences({ + key: PREFERENCES_KEY, + enabled: true, + }); + + // When preferences are loaded, set views and current view + useEffect(() => { + const viewList: ViewType[] = + preferences && !error && !isLoading ? preferences : []; + + const foundDefaultView = viewList.find((view) => view.default); + + viewList.unshift({ + name: t('standard_view'), + id: STANDARD_VIEW_ID, + default: !foundDefaultView, + }); + + setViews(viewList); + setCurrentView(foundDefaultView || viewList[0]); + + // Make datagrid reflect current view column visibility + if (foundDefaultView?.columnVisibility) { + setColumnVisibility(foundDefaultView.columnVisibility); + } + }, [preferences, isLoading, error]); + + // When current view changes, update column visibility state + useEffect(() => { + setColumnVisibility( + currentView?.columnVisibility || DEFAULT_COLUMN_VISIBILITY, + ); + }, [currentView]); + + const columns = useColumns(); + + const viewContext = useMemo(() => { + const columnsConfig = columns.map((column) => { + return { + ...column, + visible: columnVisibility[column.id], + }; + }); + + return { + views, + currentView, + setCurrentView, + columnsConfig, + columnVisibility, + setColumnVisibility, + }; + }, [views, currentView, columnVisibility]); + + return ( + {children} + ); +}; diff --git a/packages/manager/apps/dedicated-servers/src/components/serverDatagrid.tsx b/packages/manager/apps/dedicated-servers/src/components/serverDatagrid.tsx new file mode 100644 index 000000000000..8d5d1ed68d2c --- /dev/null +++ b/packages/manager/apps/dedicated-servers/src/components/serverDatagrid.tsx @@ -0,0 +1,98 @@ +import React, { useContext, useEffect, useState } from 'react'; +import { Datagrid, useDataApi, RedirectionGuard } from '@ovh-ux/muk'; +import { ApiError, FilterComparator } from '@ovh-ux/manager-core-api'; +import { VisibilityState } from '@tanstack/react-table'; +import OrderMenu from '@/components/orderMenu'; +import { useColumns } from '@/components/dataGridColumns'; +import { useDedicatedServer } from '@/hooks/useDedicatedServer'; +import { urls } from '@/routes/routes.constant'; +import { ErrorComponent } from '@/components/errorComponent'; +import { DedicatedServer } from '@/data/types/server.type'; +import { ViewContext } from '@/components/manageView/viewContext'; +import { useGetTemplateInfos } from '@/hooks/useGetTemplateInfo'; +import { FilterWithLabel } from '@ovh-ux/muk/dist/types/src/components/filters/Filter.props'; + +export default function ServerDatagrid() { + const { templateList } = useGetTemplateInfos(); + const columns = useColumns(); + const { columnVisibility, setColumnVisibility } = useContext(ViewContext); + + const { + flattenData, + isError, + error, + totalCount, + hasNextPage, + fetchNextPage, + isLoading, + search, + sorting, + filters, + } = useDataApi({ + version: 'v6', + iceberg: true, + enabled: true, + route: `/dedicated/server`, + cacheKey: ['dedicated-servers', `/dedicated/server`], + }); + const { error: errorListing, data: dedicatedServer } = useDedicatedServer(); + + const fnFilter = { ...filters }; + fnFilter.add = (value: FilterWithLabel) => { + const curentFilter = { ...value }; + if (curentFilter.key === 'os') { + const tps = templateList.filter((template) => + template.description + .toLowerCase() + .includes((curentFilter.value as string).toLowerCase()), + ); + if (!tps.length) return; + curentFilter.displayValue = curentFilter.value as string; + if (curentFilter.comparator === FilterComparator.Includes) { + if (tps.length === 1) { + curentFilter.value = tps[0]?.templateName; + } else { + curentFilter.comparator = FilterComparator.IsIn; + curentFilter.value = tps.map((os) => os.templateName); + } + } else { + curentFilter.value = tps[0]?.templateName; + } + } + filters.add(curentFilter); + }; + + return ( + <> + {(isError || errorListing) && ( + + )} + {!isError && !errorListing && ( + + {flattenData && ( +
+ } + resourceType="dedicatedServer" + /> +
+ )} +
+ )} + + ); +} diff --git a/packages/manager/apps/dedicated-servers/src/hooks/manage-views/useSaveViewPreference.tsx b/packages/manager/apps/dedicated-servers/src/hooks/manage-views/useSaveViewPreference.tsx index 996c1623491d..af819e4796a8 100644 --- a/packages/manager/apps/dedicated-servers/src/hooks/manage-views/useSaveViewPreference.tsx +++ b/packages/manager/apps/dedicated-servers/src/hooks/manage-views/useSaveViewPreference.tsx @@ -1,3 +1,4 @@ +import { useContext } from 'react'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { ApiError } from '@ovh-ux/manager-core-api'; import { useNotifications } from '@ovh-ux/manager-react-components'; @@ -5,15 +6,12 @@ import { getManagerPreferencesQueryKey, postManagerPreferences, } from '@/data/api/manager-preferences'; - -export type ViewType = { - name: string; - id: string; - default?: boolean; -}; +import { ViewContext } from '@/components/manageView/viewContext'; +import { STANDARD_VIEW_ID } from '@/components/manageView/manageView.constants'; +import { ViewType } from '@/components/manageView/types'; export type SaveViewsPreferenceMutationParams = { - views: ViewType[]; + view: ViewType; }; export type UseSaveViewsPreferenceParams = { @@ -30,14 +28,37 @@ export const useSaveViewsPreference = ({ onSettled, }: UseSaveViewsPreferenceParams) => { const queryClient = useQueryClient(); + const { views, columnVisibility } = useContext(ViewContext); const { clearNotifications } = useNotifications(); return useMutation({ - mutationFn: ({ views }: SaveViewsPreferenceMutationParams) => - postManagerPreferences({ + mutationFn: ({ view }: SaveViewsPreferenceMutationParams) => { + const currentDefault = views.find((_view) => _view.default); + if (view.default && currentDefault) currentDefault.default = false; + + const updatedView = { + ...view, + columnVisibility, + }; + + const updatedViews = [ + ...views.filter( + (_view) => + _view.id !== updatedView.id && + _view.id !== currentDefault?.id && + _view.id !== STANDARD_VIEW_ID, + ), + ...(![STANDARD_VIEW_ID, updatedView.id].includes(currentDefault?.id) + ? [currentDefault] + : []), + updatedView, + ]; + + return postManagerPreferences({ key, - value: JSON.stringify(views), - }), + value: JSON.stringify(updatedViews), + }); + }, onSuccess: async (_, variables) => { clearNotifications(); await queryClient.invalidateQueries({ diff --git a/packages/manager/apps/dedicated-servers/src/pages/listing/server/index.tsx b/packages/manager/apps/dedicated-servers/src/pages/listing/server/index.tsx index 005f37d32165..b1ec3a4537a8 100644 --- a/packages/manager/apps/dedicated-servers/src/pages/listing/server/index.tsx +++ b/packages/manager/apps/dedicated-servers/src/pages/listing/server/index.tsx @@ -1,117 +1,12 @@ -import React, { useState } from 'react'; +import React from 'react'; import './index.scss'; -import { Datagrid, useDataApi, RedirectionGuard } from '@ovh-ux/muk'; -import { ApiError, FilterComparator } from '@ovh-ux/manager-core-api'; -import { VisibilityState } from '@tanstack/react-table'; -import { FilterWithLabel } from '@ovh-ux/muk/dist/types/src/components/filters/Filter.props'; -import OrderMenu from '@/components/orderMenu'; -import { useColumns } from '@/components/dataGridColumns'; -import { useDedicatedServer } from '@/hooks/useDedicatedServer'; -import { urls } from '@/routes/routes.constant'; -import { ErrorComponent } from '@/components/errorComponent'; -import { DedicatedServer } from '@/data/types/server.type'; -import { useGetTemplateInfos } from '@/hooks/useGetTemplateInfo'; +import { ViewContextProvider } from '@/components/manageView/viewContext'; +import ServerDatagrid from '@/components/serverDatagrid'; export default function ServerListing() { - const { templateList } = useGetTemplateInfos(); - const columns = useColumns(); - const [columnVisibility, setColumnVisibility] = useState({ - serverId: false, - displayName: true, - ip: true, - reverse: false, - commercialRange: true, - os: false, - region: true, - rack: false, - datacenter: false, - state: true, - monitoring: false, - vrack: false, - renew: false, - expiration: false, - engagement: false, - price: false, - tags: true, - actions: true, - }); - - const { - flattenData, - isError, - error, - totalCount, - hasNextPage, - fetchNextPage, - isLoading, - search, - sorting, - filters, - } = useDataApi({ - version: 'v6', - iceberg: true, - enabled: true, - route: `/dedicated/server`, - cacheKey: ['dedicated-servers', `/dedicated/server`], - }); - const { error: errorListing, data: dedicatedServer } = useDedicatedServer(); - - const fnFilter = { ...filters }; - fnFilter.add = (value: FilterWithLabel) => { - const curentFilter = { ...value }; - if (curentFilter.key === 'os') { - const tps = templateList.filter((template) => - template.description - .toLowerCase() - .includes((curentFilter.value as string).toLowerCase()), - ); - if (!tps.length) return; - curentFilter.displayValue = curentFilter.value as string; - if (curentFilter.comparator === FilterComparator.Includes) { - if (tps.length === 1) { - curentFilter.value = tps[0]?.templateName; - } else { - curentFilter.comparator = FilterComparator.IsIn; - curentFilter.value = tps.map((os) => os.templateName); - } - } else { - curentFilter.value = tps[0]?.templateName; - } - } - filters.add(curentFilter); - }; - return ( - <> - {(isError || errorListing) && ( - - )} - {!isError && !errorListing && ( - - {flattenData && ( -
- } - resourceType="dedicatedServer" - /> -
- )} -
- )} - + + + ); } From b9609edbf096683c90c531d5f46154675dcf280d Mon Sep 17 00:00:00 2001 From: Quentin Pavy Date: Wed, 21 Jan 2026 14:22:10 +0100 Subject: [PATCH 028/112] feat(dedicated-servers): cancel changes if view not saved ref: #MANAGER-20621 Signed-off-by: Quentin Pavy --- .../manageView/manageViewDrawer.tsx | 20 +++++++++++++++---- .../components/manageView/style.module.scss | 4 ---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx index 36fde61db26e..8138b88432dc 100644 --- a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import React, { useContext, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { NAMESPACES } from '@ovh-ux/manager-common-translations'; import { @@ -10,11 +10,15 @@ import { CheckboxLabel, } from '@ovh-ux/muk'; import { ODS_ICON_NAME } from '@ovhcloud/ods-components'; -import { PREFERENCES_KEY, STANDARD_VIEW_ID } from './manageView.constants'; +import { + DEFAULT_COLUMN_VISIBILITY, + PREFERENCES_KEY, +} from './manageView.constants'; import { ViewType } from './types'; import { useSaveViewsPreference } from '@/hooks/manage-views/useSaveViewPreference'; import ManageViewDrawerTitle from './manageViewDrawerTitle'; import ManageViewConfig from './manageViewConfig'; +import { ViewContext } from './viewContext'; export type ManageViewDrawerProps = { views: ViewType[]; @@ -32,6 +36,7 @@ export const ManageViewDrawer = ({ handleConfirm, handleCancel, }: ManageViewDrawerProps) => { + const { setColumnVisibility, currentView } = useContext(ViewContext); const { t } = useTranslation('manage-view'); const { t: tCommon } = useTranslation(NAMESPACES.ACTIONS); const [editingView, setEditingView] = useState(null); @@ -68,6 +73,13 @@ export const ManageViewDrawer = ({ handleConfirm(); }; + const cancelChanges = () => { + setColumnVisibility( + currentView?.columnVisibility || DEFAULT_COLUMN_VISIBILITY, + ); + handleCancel(); + }; + return (
@@ -116,7 +128,7 @@ export const ManageViewDrawer = ({ diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/style.module.scss b/packages/manager/apps/dedicated-servers/src/components/manageView/style.module.scss index 89fd1df1f362..a25a5962b09a 100644 --- a/packages/manager/apps/dedicated-servers/src/components/manageView/style.module.scss +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/style.module.scss @@ -8,10 +8,6 @@ &__item { width: 100%; - // display: flex; - // flex-flow: row; - // align-items: center; - // flex-grow: 1; &__card { width: 100%; From 2c168eec665682abdc0d726e5c8ad82e6a5d5427 Mon Sep 17 00:00:00 2001 From: soufien mhelhali Date: Tue, 20 Jan 2026 07:51:04 +0100 Subject: [PATCH 029/112] feat(dedicated-server): delete view ref: #MANAGER-20562 Signed-off-by: soufien mhelhali --- .../manage-view/Messages_fr_FR.json | 4 + .../manageView/manageViewButton.tsx | 24 +++-- .../manageView/manageViewDelete.tsx | 95 +++++++++++++++++++ .../manage-views/useDeleteViewPreference.tsx | 61 ++++++++++++ 4 files changed, 171 insertions(+), 13 deletions(-) create mode 100644 packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDelete.tsx create mode 100644 packages/manager/apps/dedicated-servers/src/hooks/manage-views/useDeleteViewPreference.tsx diff --git a/packages/manager/apps/dedicated-servers/public/translations/manage-view/Messages_fr_FR.json b/packages/manager/apps/dedicated-servers/public/translations/manage-view/Messages_fr_FR.json index a93906e83cfa..2af563c43f47 100644 --- a/packages/manager/apps/dedicated-servers/public/translations/manage-view/Messages_fr_FR.json +++ b/packages/manager/apps/dedicated-servers/public/translations/manage-view/Messages_fr_FR.json @@ -3,6 +3,10 @@ "current_view": "Vue actuelle", "configure_current_view": "Configurer la vue actuelle", "delete_current_view": "Supprimer la vue actuelle", + "modal_delete_title": "Supprimer {{name}}", + "modal_delete_description": "Vous êtes sur le point de supprimer définitivement cette vue. Cette action est irréversible", + "modal_detete_cancel": "Garder la vue", + "modal_delete_confirm": "Supprimer la vue", "views": "Vues", "add_new_view": "Ajouter une nouvelle vue", "standard_view": "Vue standard", diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewButton.tsx b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewButton.tsx index 63ffea9da58b..f483ce2a3e17 100644 --- a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewButton.tsx +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewButton.tsx @@ -20,15 +20,15 @@ import { Badge, BADGE_COLOR, BADGE_SIZE, - BUTTON_COLOR, Tooltip, TooltipTrigger, TooltipContent, } from '@ovh-ux/muk'; -import { MAX_VIEWS_NUMBER } from './manageView.constants'; +import { MAX_VIEWS_NUMBER, STANDARD_VIEW_ID } from './manageView.constants'; import { ViewType } from './types'; import ManageViewDrawer from './manageViewDrawer'; import { ViewContext } from './viewContext'; +import ManageViewDelete from './manageViewDelete'; export const ManageViewButton = () => { const { t } = useTranslation('manage-view'); @@ -81,21 +81,19 @@ export const ManageViewButton = () => { }} role="menuitem" variant={BUTTON_VARIANT.ghost} - disabled={currentView?.id === views[0]?.id} + disabled={currentView?.id === STANDARD_VIEW_ID} > {t('configure_current_view')} - - + { + setIsPopoverOpen(false); + }} + /> diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDelete.tsx b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDelete.tsx new file mode 100644 index 000000000000..6942772da3f1 --- /dev/null +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDelete.tsx @@ -0,0 +1,95 @@ +import React, { useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; +import { OdsButton, OdsModal, OdsText } from '@ovhcloud/ods-components/react'; +import { ODS_TEXT_PRESET } from '@ovhcloud/ods-components'; +import { createPortal } from 'react-dom'; +import { + Button, + BUTTON_COLOR, + BUTTON_VARIANT, + Icon, + ICON_NAME, +} from '@ovh-ux/muk'; +import { ViewType } from './types'; +import { useDeleteViewPreference } from '@/hooks/manage-views/useDeleteViewPreference'; + +export type ManageViewDeleteProps = { + views: ViewType[]; + view: ViewType; + disabled: boolean; + onOpenModal?: () => void; +}; + +export default function ExportCsv({ + views, + view, + disabled, + onOpenModal, +}: ManageViewDeleteProps) { + const { t } = useTranslation('manage-view'); + const { mutate: deleteView } = useDeleteViewPreference({}); + const [isOpen, setOpen] = useState(false); + const [currentView, setCurrentView] = useState(null); + + useEffect(() => { + setCurrentView(view); + }, [isOpen, view, views]); + + const openModalHandler = () => { + setOpen(true); + if (onOpenModal) onOpenModal(); + }; + const cancelDeleteView = () => setOpen(false); + + const confirmDeleteView = () => { + if (currentView) { + deleteView({ + view: currentView, + }); + setOpen(false); + } + }; + + return ( + <> + + {view && + createPortal( + + + {t('modal_delete_title', { name: currentView?.name })} + + {t('modal_delete_description')} + + + , + document.body, + )} + + ); +} diff --git a/packages/manager/apps/dedicated-servers/src/hooks/manage-views/useDeleteViewPreference.tsx b/packages/manager/apps/dedicated-servers/src/hooks/manage-views/useDeleteViewPreference.tsx new file mode 100644 index 000000000000..febe7606c9e6 --- /dev/null +++ b/packages/manager/apps/dedicated-servers/src/hooks/manage-views/useDeleteViewPreference.tsx @@ -0,0 +1,61 @@ +import { useContext } from 'react'; +import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { ApiError } from '@ovh-ux/manager-core-api'; +import { useNotifications } from '@ovh-ux/manager-react-components'; +import { + getManagerPreferencesQueryKey, + postManagerPreferences, +} from '@/data/api/manager-preferences'; +import { ViewContext } from '@/components/manageView/viewContext'; +import { + PREFERENCES_KEY, + STANDARD_VIEW_ID, +} from '@/components/manageView/manageView.constants'; +import { ViewType } from '@/components/manageView/types'; + +export type DeleteViewPreferenceMutationParams = { + view: ViewType; +}; + +export type UseDeleteViewPreferenceParams = { + onError?: (apiError: ApiError) => void; + onSuccess?: (variables: DeleteViewPreferenceMutationParams) => void; + onSettled?: () => void; +}; + +export const useDeleteViewPreference = ({ + onError, + onSuccess, + onSettled, +}: UseDeleteViewPreferenceParams) => { + const queryClient = useQueryClient(); + const { views } = useContext(ViewContext); + const { clearNotifications } = useNotifications(); + + return useMutation({ + mutationFn: ({ view }: DeleteViewPreferenceMutationParams) => { + const updatedViews = [ + ...views.filter( + (_view) => _view.id !== view.id && _view.id !== STANDARD_VIEW_ID, + ), + ]; + + return postManagerPreferences({ + key: PREFERENCES_KEY, + value: JSON.stringify(updatedViews), + }); + }, + onSuccess: async (_, variables) => { + clearNotifications(); + await queryClient.invalidateQueries({ + queryKey: getManagerPreferencesQueryKey(), + }); + onSuccess?.(variables); + }, + onError: (error: ApiError) => { + clearNotifications(); + onError?.(error); + }, + onSettled, + }); +}; From e0e87ad84d598d91ced1e9bad88421c08a7d7b63 Mon Sep 17 00:00:00 2001 From: Quentin Pavy Date: Fri, 30 Jan 2026 09:11:32 +0100 Subject: [PATCH 030/112] feat(dedicated-servers): some drawer style fix ref: #MANAGER-20555 Signed-off-by: Quentin Pavy --- .../src/components/dataGridColumns.tsx | 1 + .../manageView/manageViewDrawer.tsx | 48 +++++++++++-------- .../manageView/manageViewDrawerTitle.tsx | 3 +- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/packages/manager/apps/dedicated-servers/src/components/dataGridColumns.tsx b/packages/manager/apps/dedicated-servers/src/components/dataGridColumns.tsx index 2906d3ee06b2..9d25043cc94f 100644 --- a/packages/manager/apps/dedicated-servers/src/components/dataGridColumns.tsx +++ b/packages/manager/apps/dedicated-servers/src/components/dataGridColumns.tsx @@ -263,6 +263,7 @@ export function useColumns(): DatagridColumn[] { header: '', isSortable: false, cell: ({ row: { original: server } }) => ActionCell(server), + size: 20, }, ]; } diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx index 8138b88432dc..4dbe6e66c05d 100644 --- a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx @@ -8,6 +8,8 @@ import { Checkbox, CheckboxControl, CheckboxLabel, + Text, + BUTTON_SIZE, } from '@ovh-ux/muk'; import { ODS_ICON_NAME } from '@ovhcloud/ods-components'; import { @@ -83,21 +85,26 @@ export const ManageViewDrawer = ({ return (
- {isOpen && ( - )}
); }; diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawerTitle.tsx b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawerTitle.tsx index 168bfe286e59..3f87dcb64309 100644 --- a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawerTitle.tsx +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawerTitle.tsx @@ -29,7 +29,7 @@ export const ManageViewDrawerTitle = ({ }; return ( -
+
{isEditMode && ( <> - -
- )} - {/* Drawer Content */} -
-
- -
- - - {t('set_as_default')} - - - -
- {/* Drawer footer */} -
+ + )} + {/* Drawer Content */} +
+
+ +
+ + + + {t('set_as_default')} + + + + +
+ {/* Drawer footer */} +
+ + +
+
); }; diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawerTitle.tsx b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawerTitle.tsx index 3f87dcb64309..10d97fef7e35 100644 --- a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawerTitle.tsx +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawerTitle.tsx @@ -7,7 +7,7 @@ import { Text, INPUT_TYPE, Input, -} from '@ovh-ux/muk'; +} from '@ovhcloud/ods-react'; import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/style.module.scss b/packages/manager/apps/dedicated-servers/src/components/manageView/style.module.scss index a25a5962b09a..5afdb29a577b 100644 --- a/packages/manager/apps/dedicated-servers/src/components/manageView/style.module.scss +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/style.module.scss @@ -5,6 +5,7 @@ margin: 0; padding: 0; list-style: none; + touch-action: none; // empêche le scroll de bloquer le drag &__item { width: 100%; @@ -12,6 +13,7 @@ &__card { width: 100%; padding: 0.5rem 1rem; + margin: 0.3rem 0; display: flex; justify-content: space-between; align-items: center; @@ -26,3 +28,18 @@ } } } + +.column-list__item__wrapper { + display: flex; + align-items: center; + gap: 8px; +} + +.dragHandle { + cursor: grab; + user-select: none; +} + +.dragHandle:active { + cursor: grabbing; +} diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/types.ts b/packages/manager/apps/dedicated-servers/src/components/manageView/types.ts index 5412535a82d9..6fae745c0239 100644 --- a/packages/manager/apps/dedicated-servers/src/components/manageView/types.ts +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/types.ts @@ -5,4 +5,5 @@ export type ViewType = { id: string; default?: boolean; columnVisibility?: VisibilityState; + columnOrder?: string[]; }; diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/viewContext.tsx b/packages/manager/apps/dedicated-servers/src/components/manageView/viewContext.tsx index ac98b6240b74..01487f25fa7b 100644 --- a/packages/manager/apps/dedicated-servers/src/components/manageView/viewContext.tsx +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/viewContext.tsx @@ -29,6 +29,11 @@ export type ViewContextType = { columnsConfig: ColumnsConfig[]; columnVisibility: VisibilityState; setColumnVisibility: React.Dispatch>; + setOrderedColumns: React.Dispatch< + React.SetStateAction[]> + >; + setColumnsOrder: (order?: string[]) => void; + setViews: React.Dispatch>; }; export const ViewContext = createContext>({ @@ -37,6 +42,9 @@ export const ViewContext = createContext>({ setCurrentView: () => {}, columnsConfig: [], columnVisibility: {}, + setViews: () => {}, + setOrderedColumns: () => {}, + setColumnsOrder: () => {}, setColumnVisibility: () => {}, }); @@ -47,6 +55,9 @@ export const ViewContextProvider = ({ children }: PropsWithChildren) => { const [columnVisibility, setColumnVisibility] = useState( DEFAULT_COLUMN_VISIBILITY, ); + const initialColumns = useColumns(); + const [orderedColumns, setOrderedColumns] = useState(initialColumns); + const columns = orderedColumns; // Fetch saved views preferences const { preferences, error, isLoading } = useGetViewsPreferences({ @@ -54,6 +65,15 @@ export const ViewContextProvider = ({ children }: PropsWithChildren) => { enabled: true, }); + const setColumnsOrder = (order?: string[]) => { + if (order) { + const currentOrderedColumns = order.map((key) => + columns.find((column) => column.id === key), + ); + setOrderedColumns(currentOrderedColumns); + } + }; + // When preferences are loaded, set views and current view useEffect(() => { const viewList: ViewType[] = @@ -70,6 +90,10 @@ export const ViewContextProvider = ({ children }: PropsWithChildren) => { setViews(viewList); setCurrentView(foundDefaultView || viewList[0]); + if (foundDefaultView?.columnOrder) { + setColumnsOrder(foundDefaultView?.columnOrder); + } + // Make datagrid reflect current view column visibility if (foundDefaultView?.columnVisibility) { setColumnVisibility(foundDefaultView.columnVisibility); @@ -83,10 +107,8 @@ export const ViewContextProvider = ({ children }: PropsWithChildren) => { ); }, [currentView]); - const columns = useColumns(); - const viewContext = useMemo(() => { - const columnsConfig = columns.map((column) => { + const columnsConfig = orderedColumns.map((column) => { return { ...column, visible: columnVisibility[column.id], @@ -100,8 +122,11 @@ export const ViewContextProvider = ({ children }: PropsWithChildren) => { columnsConfig, columnVisibility, setColumnVisibility, + setOrderedColumns, + setColumnsOrder, + setViews, }; - }, [views, currentView, columnVisibility]); + }, [views, currentView, columnVisibility, orderedColumns]); return ( {children} diff --git a/packages/manager/apps/dedicated-servers/src/components/serverDatagrid.tsx b/packages/manager/apps/dedicated-servers/src/components/serverDatagrid.tsx index 8d5d1ed68d2c..7f6ce892a353 100644 --- a/packages/manager/apps/dedicated-servers/src/components/serverDatagrid.tsx +++ b/packages/manager/apps/dedicated-servers/src/components/serverDatagrid.tsx @@ -1,4 +1,4 @@ -import React, { useContext, useEffect, useState } from 'react'; +import React, { useContext } from 'react'; import { Datagrid, useDataApi, RedirectionGuard } from '@ovh-ux/muk'; import { ApiError, FilterComparator } from '@ovh-ux/manager-core-api'; import { VisibilityState } from '@tanstack/react-table'; @@ -15,7 +15,9 @@ import { FilterWithLabel } from '@ovh-ux/muk/dist/types/src/components/filters/F export default function ServerDatagrid() { const { templateList } = useGetTemplateInfos(); const columns = useColumns(); - const { columnVisibility, setColumnVisibility } = useContext(ViewContext); + const { columnVisibility, setColumnVisibility, columnsConfig } = useContext( + ViewContext, + ); const { flattenData, @@ -76,7 +78,7 @@ export default function ServerDatagrid() { {flattenData && (
{ +export interface DedicatedServer extends Record { availabilityZone: string; bootId?: number | null; bootScript?: string | null; diff --git a/packages/manager/apps/dedicated-servers/src/hooks/manage-views/useSaveViewPreference.tsx b/packages/manager/apps/dedicated-servers/src/hooks/manage-views/useSaveViewPreference.tsx index af819e4796a8..b6757c196842 100644 --- a/packages/manager/apps/dedicated-servers/src/hooks/manage-views/useSaveViewPreference.tsx +++ b/packages/manager/apps/dedicated-servers/src/hooks/manage-views/useSaveViewPreference.tsx @@ -28,7 +28,7 @@ export const useSaveViewsPreference = ({ onSettled, }: UseSaveViewsPreferenceParams) => { const queryClient = useQueryClient(); - const { views, columnVisibility } = useContext(ViewContext); + const { views, columnVisibility, columnsConfig } = useContext(ViewContext); const { clearNotifications } = useNotifications(); return useMutation({ @@ -39,6 +39,7 @@ export const useSaveViewsPreference = ({ const updatedView = { ...view, columnVisibility, + columnOrder: columnsConfig.map((column) => column.id), }; const updatedViews = [ diff --git a/packages/manager/apps/dedicated-servers/src/pages/listing/index.tsx b/packages/manager/apps/dedicated-servers/src/pages/listing/index.tsx index d06a68d8d541..e8f71195682d 100644 --- a/packages/manager/apps/dedicated-servers/src/pages/listing/index.tsx +++ b/packages/manager/apps/dedicated-servers/src/pages/listing/index.tsx @@ -12,11 +12,7 @@ import { useRouteSynchro, ShellContext, } from '@ovh-ux/manager-react-shell-client'; -import { - ChangelogMenu, - BaseLayout, - GuideMenu, -} from '@ovh-ux/muk'; +import { ChangelogMenu, BaseLayout, GuideMenu } from '@ovh-ux/muk'; import { OdsTabs, OdsTab } from '@ovhcloud/ods-components/react'; import { useTranslation } from 'react-i18next'; import { CHANGELOG_LINKS } from '@/data/constants/changelogLinks'; @@ -72,7 +68,7 @@ export default function Layout() { header={{ title: t('title'), changelogButton: , - guideMenu: + guideMenu: , }} tabs={
diff --git a/packages/manager/apps/dedicated-servers/tsconfig.json b/packages/manager/apps/dedicated-servers/tsconfig.json index e2104f471575..d954594c183f 100644 --- a/packages/manager/apps/dedicated-servers/tsconfig.json +++ b/packages/manager/apps/dedicated-servers/tsconfig.json @@ -5,7 +5,7 @@ "target": "es2020", "types": ["vite/client", "node"], "module": "ES2020", - "moduleResolution": "node", + "moduleResolution": "bundler", "removeComments": true, "outDir": "dist", "esModuleInterop": true, From 773703489c7e9aa888664bc061e694c06c17856d Mon Sep 17 00:00:00 2001 From: Quentin Pavy Date: Thu, 5 Feb 2026 11:52:27 +0100 Subject: [PATCH 032/112] feat(dedicated-servers): react route migration ref: #MANAGER-20882 Signed-off-by: Quentin Pavy --- .../apps/dedicated-servers/src/App.tsx | 20 +++- .../dedicated-servers/src/routes/routes.tsx | 101 +++++++----------- .../src/test-utils/TestApp.tsx | 10 +- .../src/test-utils/setupTests.tsx | 4 + 4 files changed, 67 insertions(+), 68 deletions(-) diff --git a/packages/manager/apps/dedicated-servers/src/App.tsx b/packages/manager/apps/dedicated-servers/src/App.tsx index d01c7f6d5a05..9002a2e2e7f9 100644 --- a/packages/manager/apps/dedicated-servers/src/App.tsx +++ b/packages/manager/apps/dedicated-servers/src/App.tsx @@ -1,10 +1,14 @@ -import React, { useContext, useEffect } from 'react'; +import React, { Suspense, useContext, useEffect } from 'react'; import { QueryClientProvider, QueryClient } from '@tanstack/react-query'; import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; import { ShellContext } from '@ovh-ux/manager-react-shell-client'; -import { RouterProvider, createHashRouter } from 'react-router-dom'; +import { + RouterProvider, + createHashRouter, + createRoutesFromElements, +} from 'react-router-dom'; import { useFeatureAvailability } from '@ovh-ux/manager-module-common-api'; -import { routes } from './routes/routes'; +import routes from './routes/routes'; const queryClient = new QueryClient({ defaultOptions: { @@ -19,7 +23,7 @@ const queryClient = new QueryClient({ function Routes() { const { shell } = useContext(ShellContext); - const router = createHashRouter(routes); + const router = createHashRouter(createRoutesFromElements(routes)); const { data, isLoading, isError } = useFeatureAvailability([ 'dedicated-servers', ]); @@ -34,7 +38,13 @@ function Routes() { } }, [isLoading, isError, data, shell]); - return isLoading ? <> : ; + return isLoading ? ( + Loading... + ) : ( + Loading routes ...}> + + + ); } function App() { diff --git a/packages/manager/apps/dedicated-servers/src/routes/routes.tsx b/packages/manager/apps/dedicated-servers/src/routes/routes.tsx index c9f39b645873..ac0d7fb78b5a 100644 --- a/packages/manager/apps/dedicated-servers/src/routes/routes.tsx +++ b/packages/manager/apps/dedicated-servers/src/routes/routes.tsx @@ -1,63 +1,44 @@ -import React from 'react'; -import { RouteObject } from 'react-router-dom'; +import React, { lazy } from 'react'; +import { Route } from 'react-router-dom'; +import { urls } from './routes.constant'; +import { ErrorBoundary } from '@ovh-ux/muk'; import { PageType } from '@ovh-ux/manager-react-shell-client'; -import NotFound from '@/pages/404'; -import { urls } from '@/routes/routes.constant'; -const lazyRouteConfig = (importFn: CallableFunction): Partial => { - return { - lazy: async () => { - const { default: moduleDefault, ...moduleExports } = await importFn(); - return { - Component: moduleDefault, - ...moduleExports, - }; - }, - }; -}; +const LayoutPage = lazy(() => import('@/pages/listing')); +const ServerListing = lazy(() => import('@/pages/listing/server')); +const ClusterListing = lazy(() => import('@/pages/listing/cluster')); +const OnboardingPage = lazy(() => import('@/pages/onboarding')); -export const routes: any = [ - { - path: urls.root, - ...lazyRouteConfig(() => import('@/pages/listing/index')), - children: [ - { - id: 'server', - path: urls.server, - ...lazyRouteConfig(() => import('@/pages/listing/server')), - handle: { - tracking: { - pageName: 'all-servers', - pageType: PageType.listing, - }, - }, - }, - { - id: 'cluster', - path: urls.cluster, - ...lazyRouteConfig(() => import('@/pages/listing/cluster')), - handle: { - tracking: { - pageName: 'cluster', - pageType: PageType.listing, - }, - }, - }, - ], - }, - { - id: 'onboarding', - path: urls.onboarding, - ...lazyRouteConfig(() => import('@/pages/onboarding')), - handle: { - tracking: { - pageName: 'onboarding', - pageType: PageType.onboarding, - }, - }, - }, - { - path: '*', - element: , - }, -]; +export default ( + <> + } + > + + + + } + /> + +); diff --git a/packages/manager/apps/dedicated-servers/src/test-utils/TestApp.tsx b/packages/manager/apps/dedicated-servers/src/test-utils/TestApp.tsx index de7fbfd6f8d4..e3786ad19e36 100644 --- a/packages/manager/apps/dedicated-servers/src/test-utils/TestApp.tsx +++ b/packages/manager/apps/dedicated-servers/src/test-utils/TestApp.tsx @@ -1,10 +1,14 @@ import React from 'react'; import { QueryClientProvider, QueryClient } from '@tanstack/react-query'; -import { createMemoryRouter, RouterProvider } from 'react-router-dom'; -import { routes } from '../routes/routes'; +import { + createMemoryRouter, + createRoutesFromElements, + RouterProvider, +} from 'react-router-dom'; +import routes from '../routes/routes'; export function TestApp({ initialRoute = '/' }) { - const router = createMemoryRouter(routes, { + const router = createMemoryRouter(createRoutesFromElements(routes), { initialEntries: [initialRoute], initialIndex: 0, }); diff --git a/packages/manager/apps/dedicated-servers/src/test-utils/setupTests.tsx b/packages/manager/apps/dedicated-servers/src/test-utils/setupTests.tsx index 2701298e818c..15d0279ffd43 100644 --- a/packages/manager/apps/dedicated-servers/src/test-utils/setupTests.tsx +++ b/packages/manager/apps/dedicated-servers/src/test-utils/setupTests.tsx @@ -3,6 +3,7 @@ import React from 'react'; import '@testing-library/jest-dom'; import { Navigate, NavLinkProps, Path, To } from 'react-router-dom'; import { ShellContextType } from '@ovh-ux/manager-react-shell-client'; +import { ErrorBoundary } from '@ovh-ux/muk'; const shellMock = ({ ux: { @@ -261,6 +262,9 @@ vi.mock('@ovh-ux/muk', async () => { {children &&
{children}
} ), + ErrorBoundary: ({ children }: React.PropsWithChildren) => ( +
{children}
+ ), useDataApi: vi.fn(() => ({ flattenData: [], hasNextPage: false, From 8c7ac81cf483952d157d1c7f50b2a89929f0d60f Mon Sep 17 00:00:00 2001 From: Quentin Pavy Date: Tue, 10 Feb 2026 08:10:33 +0100 Subject: [PATCH 033/112] feat(dedicated-servers): improve drawer visibility ref: #MANAGER-20621 Signed-off-by: Quentin Pavy --- .../src/components/manageView/manageViewConfig.tsx | 4 ++-- .../src/components/manageView/manageViewDrawer.tsx | 10 ++++++---- .../src/components/manageView/style.module.scss | 12 ++++++++++++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewConfig.tsx b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewConfig.tsx index ac96c90309a7..06699ca50ffa 100644 --- a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewConfig.tsx +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewConfig.tsx @@ -23,14 +23,14 @@ export const ManageViewConfig = () => { const { t } = useTranslation('manage-view'); return ( - + {t('select_columns_visibility')} - + { if (!over || active.id === over.id) return; diff --git a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx index 6c85549d31f3..c4e26a4947e5 100644 --- a/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx +++ b/packages/manager/apps/dedicated-servers/src/components/manageView/manageViewDrawer.tsx @@ -91,7 +91,7 @@ export const ManageViewDrawer = ({ transition-all duration-300 ease-in-out bg-red-500 ${isOpen ? 'translate-x-0' : 'translate-x-full'}`} > -