diff --git a/.sonarcloud.properties b/.sonarcloud.properties index cafc53f12ba3..1865422be111 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=nickel-butterfly-3 +sonar.projectVersion=rhenium-chinchilla 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 d994da8d6d3b..76c7b3ea618c 100644 --- a/packages/manager/apps/account-creation/CHANGELOG.md +++ b/packages/manager/apps/account-creation/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. +## [0.13.7](https://github.com/ovh/manager/compare/@ovh-ux/manager-account-creation-app@0.13.6...@ovh-ux/manager-account-creation-app@0.13.7) (2026-04-21) + + +### Bug Fixes + +* **i18n:** add missing translations [CDS 4727] ([462bf1b](https://github.com/ovh/manager/commit/462bf1bc5dd4663c906b8b7fe3b3b287d2a9b63b)) +* **i18n:** add missing translations [CDS 4730] ([974462d](https://github.com/ovh/manager/commit/974462da5051776b1e86e7d7332373e167ebea1e)) +* **i18n:** add missing translations [CDS 4736] ([4fe94cf](https://github.com/ovh/manager/commit/4fe94cfc6356a7083e26a54595474b1021da15c3)) + + + + + ## [0.13.6](https://github.com/ovh/manager/compare/@ovh-ux/manager-account-creation-app@0.13.5...@ovh-ux/manager-account-creation-app@0.13.6) (2026-04-03) diff --git a/packages/manager/apps/account-creation/package.json b/packages/manager/apps/account-creation/package.json index 3e3e799b0867..a92df1264ac4 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.6", + "version": "0.13.7", "private": true, "description": "Application used to finalize an account creation", "repository": { diff --git a/packages/manager/apps/account/CHANGELOG.md b/packages/manager/apps/account/CHANGELOG.md index c095379a8f4d..e9a4187386d5 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.26](https://github.com/ovh/manager/compare/@ovh-ux/manager-account-app@0.6.25...@ovh-ux/manager-account-app@0.6.26) (2026-04-16) + +**Note:** Version bump only for package @ovh-ux/manager-account-app + + + + + ## [0.6.25](https://github.com/ovh/manager/compare/@ovh-ux/manager-account-app@0.6.24...@ovh-ux/manager-account-app@0.6.25) (2026-03-18) **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 616802585e3a..a6798d7f7f8e 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.25", + "version": "0.6.26", "private": true, "description": "User account and contacts management application", "repository": { @@ -17,7 +17,7 @@ "start": "webpack-dev-server" }, "dependencies": { - "@ovh-ux/manager-account": "^0.21.3", + "@ovh-ux/manager-account": "^0.22.0", "@ovh-ux/manager-at-internet-configuration": "^1.5.1", "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-core": "^13.4.4", diff --git a/packages/manager/apps/billing/CHANGELOG.md b/packages/manager/apps/billing/CHANGELOG.md index 173d531bc9de..be6c051cb110 100644 --- a/packages/manager/apps/billing/CHANGELOG.md +++ b/packages/manager/apps/billing/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.6.14](https://github.com/ovh/manager/compare/@ovh-ux/manager-billing-app@0.6.13...@ovh-ux/manager-billing-app@0.6.14) (2026-04-21) + +**Note:** Version bump only for package @ovh-ux/manager-billing-app + + + + + +## [0.6.13](https://github.com/ovh/manager/compare/@ovh-ux/manager-billing-app@0.6.12...@ovh-ux/manager-billing-app@0.6.13) (2026-04-16) + +**Note:** Version bump only for package @ovh-ux/manager-billing-app + + + + + ## [0.6.12](https://github.com/ovh/manager/compare/@ovh-ux/manager-billing-app@0.6.11...@ovh-ux/manager-billing-app@0.6.12) (2026-04-09) **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 7bd2dbb6dcc6..7f95990c7fea 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.12", + "version": "0.6.14", "private": true, "description": "OVHcloud Billing app", "repository": { @@ -19,8 +19,8 @@ "dependencies": { "@ovh-ux/manager-advices": "^1.8.7", "@ovh-ux/manager-at-internet-configuration": "^1.5.1", - "@ovh-ux/manager-billing": "^0.65.7", - "@ovh-ux/manager-billing-components": "^4.36.0", + "@ovh-ux/manager-billing": "^0.66.0", + "@ovh-ux/manager-billing-components": "^4.36.1", "@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/communication/CHANGELOG.md b/packages/manager/apps/communication/CHANGELOG.md index 06d206e7e7be..d5d1c88d212d 100644 --- a/packages/manager/apps/communication/CHANGELOG.md +++ b/packages/manager/apps/communication/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.11.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-communication-app@0.11.1...@ovh-ux/manager-communication-app@0.11.2) (2026-04-28) + + +### Bug Fixes + +* **communication:** add download attachment functionality ([ec58398](https://github.com/ovh/manager/commit/ec5839832108c41aa9ffd8b87f44e5a443f9505b)), closes [#INC0205629](https://github.com/ovh/manager/issues/INC0205629) + + + + + ## [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 diff --git a/packages/manager/apps/communication/package.json b/packages/manager/apps/communication/package.json index af27dddceebf..16d05ba04a2b 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.1", + "version": "0.11.2", "private": true, "description": "An app for customer communication", "repository": { diff --git a/packages/manager/apps/communication/src/components/attachmentLink/AttachmentLink.component.tsx b/packages/manager/apps/communication/src/components/attachmentLink/AttachmentLink.component.tsx new file mode 100644 index 000000000000..9c7344da4388 --- /dev/null +++ b/packages/manager/apps/communication/src/components/attachmentLink/AttachmentLink.component.tsx @@ -0,0 +1,55 @@ +import { fetchAttachmentUrl } from "@/data/api/notification"; +import useTracking from "@/hooks/useTracking/useTracking"; +import { TrackingSubApps } from "@/tracking.constant"; +import { ButtonType, PageLocation } from "@ovh-ux/manager-react-shell-client"; +import { Button, Icon } from "@ovhcloud/ods-react"; +import { useState } from "react"; + + +export default function AttachmentLink({ + notificationId, + name, +}: { + notificationId: string; + name: string; +}) { + const { trackClick } = useTracking(); + const [isDownloading, setIsDownloading] = useState(false); + + const handleDownload = async (e: React.MouseEvent) => { + e.preventDefault(); + if (isDownloading) return; + + setIsDownloading(true); + + try { + const detail = await fetchAttachmentUrl(notificationId, name); + window.open(detail.url, "_blank", "noopener,noreferrer"); + } catch { + } finally { + setIsDownloading(false); + } + }; + + return ( + + ); +} diff --git a/packages/manager/apps/communication/src/data/api/notification.ts b/packages/manager/apps/communication/src/data/api/notification.ts index a469fecec653..706f20842dcb 100644 --- a/packages/manager/apps/communication/src/data/api/notification.ts +++ b/packages/manager/apps/communication/src/data/api/notification.ts @@ -1,6 +1,6 @@ import apiClient from '@ovh-ux/manager-core-api'; import { NotificationReference } from '../types/reference.type'; -import { Notification } from '../types/notification.type'; +import { Notification, NotificationAttachmentDetail } from '../types/notification.type'; export const getNotificationReference = async (): Promise => { const { data } = await apiClient.v2.get('/notification/reference'); @@ -15,3 +15,13 @@ export const getNotification = async ( ); return data; }; + +export async function fetchAttachmentUrl( + notificationId: string, + attachmentName: string, +): Promise { + const { data } = await apiClient.v2.get( + `/notification/history/${encodeURIComponent(notificationId)}/attachment/${encodeURIComponent(attachmentName)}`, + ); + return data; +} diff --git a/packages/manager/apps/communication/src/data/types/notification.type.ts b/packages/manager/apps/communication/src/data/types/notification.type.ts index 728c90673903..ee9df03ab0bd 100644 --- a/packages/manager/apps/communication/src/data/types/notification.type.ts +++ b/packages/manager/apps/communication/src/data/types/notification.type.ts @@ -30,3 +30,10 @@ export type Contact = { to: string; type: ContactType; }; + +export interface NotificationAttachmentDetail { + name: string; + contentType: string; + sizeBytes: number; + url: string; +} diff --git a/packages/manager/apps/communication/src/pages/communications/detail/CommunicationsDetail.page.tsx b/packages/manager/apps/communication/src/pages/communications/detail/CommunicationsDetail.page.tsx index 75b19c3f392e..0ac10cce47aa 100644 --- a/packages/manager/apps/communication/src/pages/communications/detail/CommunicationsDetail.page.tsx +++ b/packages/manager/apps/communication/src/pages/communications/detail/CommunicationsDetail.page.tsx @@ -15,9 +15,10 @@ import { useNotification } from '@/data'; import { getFirstCleanEmail } from '@/utils/notifications'; import { useTracking } from '@/hooks/useTracking/useTracking'; import { TrackingSubApps } from '@/tracking.constant'; +import AttachmentLink from '@/components/attachmentLink/AttachmentLink.component'; export default function CommunicationsDetailPage() { - const { notificationId } = useParams(); + const { notificationId } = useParams<{ notificationId: string }>(); const formatDate = useFormatDate(); const { t } = useTranslation('detail'); const { t: tCommon } = useTranslation('common'); @@ -137,22 +138,11 @@ export default function CommunicationsDetailPage() { { - trackClick({ - location: PageLocation.page, - buttonType: ButtonType.button, - actionType: 'download', - actions: ['download_subject-file'], - subApp: TrackingSubApps.Communications, - }); - }} - > - - {t('button_download_attachment')} - +
+ {notification.attachments.map((attachment) => ( + + ))} +
) : ( undefined ) diff --git a/packages/manager/apps/dbaas-logs/CHANGELOG.md b/packages/manager/apps/dbaas-logs/CHANGELOG.md index 0d726b6a86e6..c817d55aa3d2 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.155](https://github.com/ovh/manager/compare/@ovh-ux/manager-dbaas-logs-app@3.0.154...@ovh-ux/manager-dbaas-logs-app@3.0.155) (2026-04-21) + +**Note:** Version bump only for package @ovh-ux/manager-dbaas-logs-app + + + + + ## [3.0.154](https://github.com/ovh/manager/compare/@ovh-ux/manager-dbaas-logs-app@3.0.153...@ovh-ux/manager-dbaas-logs-app@3.0.154) (2026-03-26) **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 098a40187c87..2fbc1d829a84 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.154", + "version": "3.0.155", "private": true, "description": "Logs Data Platform standalone application.", "repository": { @@ -18,7 +18,7 @@ }, "dependencies": { "@ovh-ux/manager-at-internet-configuration": "^1.5.1", - "@ovh-ux/manager-billing-components": "^4.36.0", + "@ovh-ux/manager-billing-components": "^4.36.1", "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-core": "^13.4.4", "@ovh-ux/manager-dbaas-logs": "^1.37.5", diff --git a/packages/manager/apps/dedicated/CHANGELOG.md b/packages/manager/apps/dedicated/CHANGELOG.md index 82b16cdcc371..4c7699b0bfc3 100644 --- a/packages/manager/apps/dedicated/CHANGELOG.md +++ b/packages/manager/apps/dedicated/CHANGELOG.md @@ -3,6 +3,41 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [20.77.8](https://github.com/ovh/manager/compare/@ovh-ux/manager-dedicated@20.77.7...@ovh-ux/manager-dedicated@20.77.8) (2026-04-30) + + +### Bug Fixes + +* **dedicated.download:** open pdf in new tab to prevent cross origin error ([6c34eec](https://github.com/ovh/manager/commit/6c34eecf32296c97e854bc1078e8dbebd0b74523)), closes [#MANAGER-12345](https://github.com/ovh/manager/issues/MANAGER-12345) + + + + + +## [20.77.7](https://github.com/ovh/manager/compare/@ovh-ux/manager-dedicated@20.77.6...@ovh-ux/manager-dedicated@20.77.7) (2026-04-22) + +**Note:** Version bump only for package @ovh-ux/manager-dedicated + + + + + +## [20.77.6](https://github.com/ovh/manager/compare/@ovh-ux/manager-dedicated@20.77.5...@ovh-ux/manager-dedicated@20.77.6) (2026-04-21) + +**Note:** Version bump only for package @ovh-ux/manager-dedicated + + + + + +## [20.77.5](https://github.com/ovh/manager/compare/@ovh-ux/manager-dedicated@20.77.4...@ovh-ux/manager-dedicated@20.77.5) (2026-04-16) + +**Note:** Version bump only for package @ovh-ux/manager-dedicated + + + + + ## [20.77.4](https://github.com/ovh/manager/compare/@ovh-ux/manager-dedicated@20.77.3...@ovh-ux/manager-dedicated@20.77.4) (2026-04-09) **Note:** Version bump only for package @ovh-ux/manager-dedicated diff --git a/packages/manager/apps/dedicated/client/app/download/download.controller.js b/packages/manager/apps/dedicated/client/app/download/download.controller.js index b3fb679a0a52..cf6fe8049534 100644 --- a/packages/manager/apps/dedicated/client/app/download/download.controller.js +++ b/packages/manager/apps/dedicated/client/app/download/download.controller.js @@ -19,7 +19,10 @@ class DownloadCtrl { this.$stateParams.type, this.$stateParams.extension, ) - .then((url) => this.$window.open(url, '_self')) + .then((url) => { + this.$window.open(url, '_blank', 'noopener'); + }) + .catch((err) => { this.Alerter.error(this.$translate.instant('download_bill_error')); return this.$q.reject(err); diff --git a/packages/manager/apps/dedicated/package.json b/packages/manager/apps/dedicated/package.json index 3f9dd5c83b13..739bc76c8532 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.77.4", + "version": "20.77.8", "private": true, "description": "OVHcloud Dedicated control panel.", "repository": { @@ -25,9 +25,9 @@ "@ovh-ux/manager-at-internet-configuration": "^1.5.1", "@ovh-ux/manager-banner": "^1.3.7", "@ovh-ux/manager-beta-preference": "^1.0.6", - "@ovh-ux/manager-billing": "^0.65.7", - "@ovh-ux/manager-billing-components": "^4.36.0", - "@ovh-ux/manager-bm-server-components": "^2.23.1", + "@ovh-ux/manager-billing": "^0.66.0", + "@ovh-ux/manager-billing-components": "^4.36.1", + "@ovh-ux/manager-bm-server-components": "^2.23.2", "@ovh-ux/manager-catalog-price": "^1.8.1", "@ovh-ux/manager-cda": "^1.10.2", "@ovh-ux/manager-cloud-connect": "^1.27.1", diff --git a/packages/manager/apps/ips/CHANGELOG.md b/packages/manager/apps/ips/CHANGELOG.md index 27cda2c20939..2518cdff92d0 100644 --- a/packages/manager/apps/ips/CHANGELOG.md +++ b/packages/manager/apps/ips/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.8.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-ips-app@0.8.1...@ovh-ux/manager-ips-app@0.8.2) (2026-04-22) + + +### Bug Fixes + +* **network-ip:** byoip using the right plan code according to user region ([8f61fb1](https://github.com/ovh/manager/commit/8f61fb1834ff8532951737fdc4ce5481b8ca4c8a)), closes [#MANAGER-21455](https://github.com/ovh/manager/issues/MANAGER-21455) + + + + + ## [0.8.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-ips-app@0.8.0...@ovh-ux/manager-ips-app@0.8.1) (2026-03-26) diff --git a/packages/manager/apps/ips/package.json b/packages/manager/apps/ips/package.json index a3073f500716..cd6b81b5fedc 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.8.1", + "version": "0.8.2", "private": true, "description": "Ips manager app", "repository": { diff --git a/packages/manager/apps/ips/src/data/hooks/catalog/useGetCatalog.spec.ts b/packages/manager/apps/ips/src/data/hooks/catalog/useGetCatalog.spec.ts new file mode 100644 index 000000000000..ab37790b9b90 --- /dev/null +++ b/packages/manager/apps/ips/src/data/hooks/catalog/useGetCatalog.spec.ts @@ -0,0 +1,15 @@ +import { getRirFromPlanCode } from './useGetCatalog'; + +describe('getRirFromPlanCode', () => { + it.each([ + { planCode: 'byoip-failover-v4-arin', expected: 'ARIN' }, + { planCode: 'byoip-failover-v4-ripe', expected: 'RIPE' }, + { planCode: 'byoip-failover-v4-apnic', expected: 'APNIC' }, + { planCode: 'byoip-failover-v4', expected: '' }, + { planCode: 'unrelated-plan-code', expected: '' }, + { planCode: '', expected: '' }, + { planCode: undefined as unknown as string, expected: '' }, + ])('$planCode => $expected', ({ planCode, expected }) => { + expect(getRirFromPlanCode(planCode)).toBe(expected); + }); +}); diff --git a/packages/manager/apps/ips/src/data/hooks/catalog/useGetCatalog.ts b/packages/manager/apps/ips/src/data/hooks/catalog/useGetCatalog.ts index fba018032b9c..2e8cc1201523 100644 --- a/packages/manager/apps/ips/src/data/hooks/catalog/useGetCatalog.ts +++ b/packages/manager/apps/ips/src/data/hooks/catalog/useGetCatalog.ts @@ -17,6 +17,13 @@ export type Campus = { planCode: string; }; +// Extract the RIR from a byoip plan code, e.g. "byoip-failover-v4-arin" -> "ARIN". +// Returns an empty string when the plan code cannot be decoded. +export const getRirFromPlanCode = (planCode: string): string => { + if (!planCode?.startsWith(`${BYOIP_FAILOVER_V4}-`)) return ''; + return planCode.slice(BYOIP_FAILOVER_V4.length + 1).toUpperCase(); +}; + export type ProductConfiguration = { name: string; values: string[] | Campus[]; @@ -131,6 +138,37 @@ export const useGetCatalog = () => { if (index !== -1 && plan?.details?.product?.configurations?.[index]) { plan.details.product.configurations[index].values = campusList; } + + // On some subsidiaries (e.g. US) the catalog does not expose an ipRir + // configuration. In that case we derive the available RIRs from the + // campus plan codes so the RIR selection step is still usable. + const ipRirIndex = plan.details.product.configurations.findIndex( + ({ name }) => name === CONFIG_NAME.IPRIR, + ); + const derivedIpRirValues = Array.from( + new Set( + campusList + .map(({ planCode }) => getRirFromPlanCode(planCode)) + .filter(Boolean), + ), + ); + + if (ipRirIndex === -1) { + if (derivedIpRirValues.length > 0) { + plan.details.product.configurations.push({ + name: CONFIG_NAME.IPRIR, + values: derivedIpRirValues, + }); + } + } else { + const existingValues = + (plan.details.product.configurations[ipRirIndex] + .values as string[]) || []; + if (existingValues.length === 0) { + plan.details.product.configurations[ipRirIndex].values = + derivedIpRirValues; + } + } } return plan as unknown as Plan; diff --git a/packages/manager/apps/ips/src/pages/byoip/Byoip.utils.ts b/packages/manager/apps/ips/src/pages/byoip/Byoip.utils.ts index 279e0b7dd50e..bc8239d77c9e 100644 --- a/packages/manager/apps/ips/src/pages/byoip/Byoip.utils.ts +++ b/packages/manager/apps/ips/src/pages/byoip/Byoip.utils.ts @@ -47,9 +47,12 @@ export type ConfigItem = { /** * Returns the express order settings */ -export const getByoipProductSettings = (config: ConfigItem[]) => +export const getByoipProductSettings = ( + config: ConfigItem[], + planCode: string = BYOIP_FAILOVER_V4, +) => JSURL.stringify({ - planCode: BYOIP_FAILOVER_V4, + planCode, configuration: [...config].filter(Boolean), option: [], quantity: 1, diff --git a/packages/manager/apps/ips/src/pages/byoip/ByoipOrderModal/ByoipOrderModal.page.tsx b/packages/manager/apps/ips/src/pages/byoip/ByoipOrderModal/ByoipOrderModal.page.tsx index 710531688f78..c647968a3fc2 100644 --- a/packages/manager/apps/ips/src/pages/byoip/ByoipOrderModal/ByoipOrderModal.page.tsx +++ b/packages/manager/apps/ips/src/pages/byoip/ByoipOrderModal/ByoipOrderModal.page.tsx @@ -26,7 +26,12 @@ import { useOvhTracking, } from '@ovh-ux/manager-react-shell-client'; -import { BYOIP_FAILOVER_V4, CONFIG_NAME } from '@/data/hooks/catalog'; +import { + BYOIP_FAILOVER_V4, + Campus, + CONFIG_NAME, + useGetCatalog, +} from '@/data/hooks/catalog'; import { urls } from '@/routes/routes.constant'; import { ByoipContext } from '../Byoip.context'; @@ -34,6 +39,7 @@ import { ByoipPayloadParams, ConfigItem, getByoipProductSettings, + getConfigValues, } from '../Byoip.utils'; interface DeclarationItem { @@ -47,6 +53,17 @@ export const ByoipOrderModal: React.FC = () => { const { trackClick } = useOvhTracking(); const { ipRir, selectedRegion, ipRange, asOwnRirType, asOwnNumberType } = React.useContext(ByoipContext); + const { data: catalog } = useGetCatalog(); + + const campusValues = getConfigValues( + catalog?.details?.product.configurations, + CONFIG_NAME.CAMPUS, + ) as Campus[]; + + const selectedCampus = campusValues.find( + (campus) => campus.name === selectedRegion, + ); + const selectedPlanCode = selectedCampus?.planCode ?? BYOIP_FAILOVER_V4; const orderBaseUrl = useOrderURL('express_review_base'); @@ -165,7 +182,7 @@ export const ByoipOrderModal: React.FC = () => { ipRir, campus: { name: selectedRegion, - planCode: BYOIP_FAILOVER_V4, + planCode: selectedPlanCode, }, ip: ipRange, ...(asOwnRirType && { asRir: asOwnRirType }), @@ -195,7 +212,10 @@ export const ByoipOrderModal: React.FC = () => { if (campus && updateConfig[campusId]) { updateConfig[campusId].values = [campus.name]; } - const settings = getByoipProductSettings(updateConfig); + const settings = getByoipProductSettings( + updateConfig, + selectedPlanCode, + ); window.open( `${orderBaseUrl}?products=~(${settings})`, '_blank', diff --git a/packages/manager/apps/ips/src/pages/byoip/sections/RegionSelectionSection.component.tsx b/packages/manager/apps/ips/src/pages/byoip/sections/RegionSelectionSection.component.tsx index 5f461079c4ef..fc8d24a6ea93 100644 --- a/packages/manager/apps/ips/src/pages/byoip/sections/RegionSelectionSection.component.tsx +++ b/packages/manager/apps/ips/src/pages/byoip/sections/RegionSelectionSection.component.tsx @@ -13,7 +13,11 @@ import { import { OrderSection } from '@/components/OrderSection/OrderSection.component'; import { RegionCard } from '@/components/RegionCard/RegionCard.component'; import { DATACENTER_TO_REGION } from '@/data/hooks/catalog'; -import { CONFIG_NAME, useGetCatalog } from '@/data/hooks/catalog/useGetCatalog'; +import { + CONFIG_NAME, + getRirFromPlanCode, + useGetCatalog, +} from '@/data/hooks/catalog/useGetCatalog'; import { TRANSLATION_NAMESPACES } from '@/utils'; import { ByoipContext } from '../Byoip.context'; @@ -27,14 +31,25 @@ type CampusType = { export const RegionSelectionSection: React.FC = () => { const { t } = useTranslation([TRANSLATION_NAMESPACES.byoip]); const { data: catalog, isLoading } = useGetCatalog(); - const { selectedRegion, setSelectedRegion } = React.useContext(ByoipContext); + const { ipRir, selectedRegion, setSelectedRegion } = + React.useContext(ByoipContext); const { trackClick } = useOvhTracking(); - const campusValues = getConfigValues( + const allCampusValues = getConfigValues( catalog?.details?.product.configurations, CONFIG_NAME.CAMPUS, ) as CampusType[]; + // When the catalog exposes multiple RIR-specific plan codes, keep only the + // campuses attached to the selected RIR. Otherwise fall back to the full list. + const campusValues = ipRir + ? allCampusValues.filter( + (campus) => getRirFromPlanCode(campus.planCode) === ipRir.toUpperCase(), + ) + : allCampusValues; + const campusValuesToDisplay = + campusValues.length > 0 ? campusValues : allCampusValues; + return ( { > }>
- {campusValues.map((value) => { + {campusValuesToDisplay.map((value) => { const region = DATACENTER_TO_REGION[value.name]; return ( result.data?.regions.includes(region)) + .filter((result) => result.data?.regions?.includes(region) ?? false) .map(({ data }) => data ?? defaultIpDetailValue), ipv6List: ipv6Results - .filter((result) => result.data?.regions.includes(region)) + .filter((result) => result.data?.regions?.includes(region) ?? false) .map(({ data }) => data ?? defaultIpDetailValue), isComplete: data?.status !== 'pending', isLoading: diff --git a/packages/manager/apps/nutanix/CHANGELOG.md b/packages/manager/apps/nutanix/CHANGELOG.md index 3c7ce6591bb1..300b148194e9 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.142](https://github.com/ovh/manager/compare/@ovh-ux/manager-nutanix-app@3.0.141...@ovh-ux/manager-nutanix-app@3.0.142) (2026-04-22) + +**Note:** Version bump only for package @ovh-ux/manager-nutanix-app + + + + + ## [3.0.141](https://github.com/ovh/manager/compare/@ovh-ux/manager-nutanix-app@3.0.140...@ovh-ux/manager-nutanix-app@3.0.141) (2026-03-25) **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 f43378152c8a..19f890fff672 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.141", + "version": "3.0.142", "private": true, "description": "OVHcloud Nutanix app", "repository": { @@ -17,7 +17,7 @@ "start": "webpack-dev-server" }, "dependencies": { - "@ovh-ux/manager-bm-server-components": "^2.23.1", + "@ovh-ux/manager-bm-server-components": "^2.23.2", "@ovh-ux/manager-components": "^1.29.1", "@ovh-ux/manager-config": "^8.9.0", "@ovh-ux/manager-core": "^13.4.4", diff --git a/packages/manager/apps/pci-ai-tools/CHANGELOG.md b/packages/manager/apps/pci-ai-tools/CHANGELOG.md index fc58420c32c5..6c3a2e1b4108 100644 --- a/packages/manager/apps/pci-ai-tools/CHANGELOG.md +++ b/packages/manager/apps/pci-ai-tools/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.23.3](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-ai-tools-app@1.23.2...@ovh-ux/manager-pci-ai-tools-app@1.23.3) (2026-04-21) + + +### Bug Fixes + +* **i18n:** add missing translations [CDS 4725] ([98f8a70](https://github.com/ovh/manager/commit/98f8a70a33f4f2950611e043d4e59115dbb8678c)) +* **i18n:** add missing translations [CDS 4735] ([a847603](https://github.com/ovh/manager/commit/a847603f0c7b48e61c4363a0de39c0b0d8f2b8f9)) + + + + + ## [1.23.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-ai-tools-app@1.23.1...@ovh-ux/manager-pci-ai-tools-app@1.23.2) (2026-03-26) diff --git a/packages/manager/apps/pci-ai-tools/package.json b/packages/manager/apps/pci-ai-tools/package.json index 6c2aaaca255b..e3b7bde340e8 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.23.2", + "version": "1.23.3", "private": true, "description": "pci-ai-tools", "repository": { diff --git a/packages/manager/apps/pci-billing/CHANGELOG.md b/packages/manager/apps/pci-billing/CHANGELOG.md index 27e2e3d75cb3..cf344ad49db7 100644 --- a/packages/manager/apps/pci-billing/CHANGELOG.md +++ b/packages/manager/apps/pci-billing/CHANGELOG.md @@ -3,6 +3,29 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [0.18.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-billing-app@0.17.1...@ovh-ux/manager-pci-billing-app@0.18.0) (2026-04-22) + + +### Features + +* **pci-billing:** update US billing history ([f63cfc9](https://github.com/ovh/manager/commit/f63cfc9274640254830b4b5af3656f7995d5cf82)), closes [#TAPC-6467](https://github.com/ovh/manager/issues/TAPC-6467) + + + + + +## [0.17.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-billing-app@0.17.0...@ovh-ux/manager-pci-billing-app@0.17.1) (2026-04-21) + + +### Bug Fixes + +* **i18n:** add missing translations [CDS 4725] ([98f8a70](https://github.com/ovh/manager/commit/98f8a70a33f4f2950611e043d4e59115dbb8678c)) +* **i18n:** add missing translations [CDS 4727] ([462bf1b](https://github.com/ovh/manager/commit/462bf1bc5dd4663c906b8b7fe3b3b287d2a9b63b)) + + + + + # [0.17.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-billing-app@0.16.3...@ovh-ux/manager-pci-billing-app@0.17.0) (2026-04-03) diff --git a/packages/manager/apps/pci-billing/package.json b/packages/manager/apps/pci-billing/package.json index 50fa7538debc..a10e5d54b0f0 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.17.0", + "version": "0.18.0", "private": true, "description": "PCI Billing react app", "type": "module", diff --git a/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_de_DE.json b/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_de_DE.json index c058b063cfdc..b19dea61b019 100644 --- a/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_de_DE.json +++ b/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_de_DE.json @@ -6,5 +6,6 @@ "cpbc_savings_plan_col_name": "Name", "cpbc_savings_plan_col_size": "Größe des Savings Plan", "cpbc_savings_plan_col_flavor": "Flavor", - "cpbc_savings_plan_col_price": "Preis" + "cpbc_savings_plan_col_price": "Preis", + "cpbc_no_consumption_data": "Kein Verbrauch im gewählten Zeitraum." } diff --git a/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_en_GB.json b/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_en_GB.json index 1d9b461d2f0b..1996db5f797d 100644 --- a/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_en_GB.json +++ b/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_en_GB.json @@ -6,5 +6,6 @@ "cpbc_savings_plan_col_name": "Name", "cpbc_savings_plan_col_size": "Savings Plan size", "cpbc_savings_plan_col_flavor": "Flavor", - "cpbc_savings_plan_col_price": "Price" + "cpbc_savings_plan_col_price": "Price", + "cpbc_no_consumption_data": "No usage for the period selected." } diff --git a/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_es_ES.json b/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_es_ES.json index 908490848df3..0b80d26ecfad 100644 --- a/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_es_ES.json +++ b/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_es_ES.json @@ -6,5 +6,6 @@ "cpbc_savings_plan_col_name": "Nombre", "cpbc_savings_plan_col_size": "Tamaño del Savings Plan", "cpbc_savings_plan_col_flavor": "Flavor", - "cpbc_savings_plan_col_price": "Precio" + "cpbc_savings_plan_col_price": "Precio", + "cpbc_no_consumption_data": "No hay consumo en el período seleccionado." } diff --git a/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_fr_CA.json b/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_fr_CA.json index 0aa6a9d6224c..513cf843603e 100644 --- a/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_fr_CA.json +++ b/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_fr_CA.json @@ -6,5 +6,6 @@ "cpbc_savings_plan_col_name": "Nom", "cpbc_savings_plan_col_size": "Taille du Savings Plan", "cpbc_savings_plan_col_flavor": "Flavor", - "cpbc_savings_plan_col_price": "Prix" + "cpbc_savings_plan_col_price": "Prix", + "cpbc_no_consumption_data": "Pas de consommation pour la période sélectionnée." } diff --git a/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_fr_FR.json b/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_fr_FR.json index 0aa6a9d6224c..513cf843603e 100644 --- a/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_fr_FR.json +++ b/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_fr_FR.json @@ -6,5 +6,6 @@ "cpbc_savings_plan_col_name": "Nom", "cpbc_savings_plan_col_size": "Taille du Savings Plan", "cpbc_savings_plan_col_flavor": "Flavor", - "cpbc_savings_plan_col_price": "Prix" + "cpbc_savings_plan_col_price": "Prix", + "cpbc_no_consumption_data": "Pas de consommation pour la période sélectionnée." } diff --git a/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_it_IT.json b/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_it_IT.json index 5f3cb512670b..d97c7710bb34 100644 --- a/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_it_IT.json +++ b/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_it_IT.json @@ -6,5 +6,6 @@ "cpbc_savings_plan_col_name": "Cognome", "cpbc_savings_plan_col_size": "Dimensione del Savings Plan", "cpbc_savings_plan_col_flavor": "Flavor", - "cpbc_savings_plan_col_price": "Prezzo" + "cpbc_savings_plan_col_price": "Prezzo", + "cpbc_no_consumption_data": "Nessun consumo per il periodo selezionato." } diff --git a/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_pl_PL.json b/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_pl_PL.json index 12e798196e6d..76fd894a4bce 100644 --- a/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_pl_PL.json +++ b/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_pl_PL.json @@ -6,5 +6,6 @@ "cpbc_savings_plan_col_name": "Nazwa", "cpbc_savings_plan_col_size": "Poziom Savings Plan", "cpbc_savings_plan_col_flavor": "Wariant", - "cpbc_savings_plan_col_price": "Cena" + "cpbc_savings_plan_col_price": "Cena", + "cpbc_no_consumption_data": "Brak zużycia dla wybranego okresu." } diff --git a/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_pt_PT.json b/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_pt_PT.json index 322fbbbc227c..9c11c18d1039 100644 --- a/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_pt_PT.json +++ b/packages/manager/apps/pci-billing/public/translations/consumption/monthly-instance/Messages_pt_PT.json @@ -6,5 +6,6 @@ "cpbc_savings_plan_col_name": "Nome", "cpbc_savings_plan_col_size": "Tamanho do Savings Plan", "cpbc_savings_plan_col_flavor": "Flavor", - "cpbc_savings_plan_col_price": "Preço" + "cpbc_savings_plan_col_price": "Preço", + "cpbc_no_consumption_data": "Sem consumo no período selecionado." } diff --git a/packages/manager/apps/pci-billing/src/components/history/HistoryHeader.component.tsx b/packages/manager/apps/pci-billing/src/components/history/HistoryHeader.component.tsx index 7a116f97ee41..9c1a8e33002d 100644 --- a/packages/manager/apps/pci-billing/src/components/history/HistoryHeader.component.tsx +++ b/packages/manager/apps/pci-billing/src/components/history/HistoryHeader.component.tsx @@ -12,6 +12,7 @@ import { OsdsButton, OsdsIcon, OsdsText } from '@ovhcloud/ods-components/react'; import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router-dom'; import { isSameDay, startOfMonth, isBefore } from 'date-fns'; +import { useEnvironment } from '@/hooks/useEnvironment'; import { useComputeDate } from './useComputeDate.hook'; type HistoryHeaderProps = { @@ -30,12 +31,16 @@ export default function HistoryHeader({ translationValues, } = useComputeDate(); + const isUsRegion = useEnvironment().getRegion() === 'US'; + const isLimitReached = isSameDay(billingDate, startOfMonth(new Date())); const isPreviousMonthBeforeCreation = projectCreationDate ? isBefore(startOfMonth(prevMonthDate), new Date(projectCreationDate)) : false; + const isPreviousMonthDisabled = isUsRegion || isPreviousMonthBeforeCreation; + const navigate = useNavigate(); const navigateToMonth = (date: Date) => { navigate(`../history/${date.getFullYear()}/${date.getMonth() + 1}`); @@ -49,7 +54,7 @@ export default function HistoryHeader({ size={ODS_BUTTON_SIZE.sm} variant={ODS_BUTTON_VARIANT.ghost} onClick={() => navigateToMonth(prevMonthDate)} - disabled={isPreviousMonthBeforeCreation || undefined} + disabled={isPreviousMonthDisabled || undefined} className="flex" > { - const { data } = useFeatureAvailability([PCI_FEATURES_SVP_CONSUMPTION]); - - const hasSVPConsumption = data?.[PCI_FEATURES_SVP_CONSUMPTION]; - - return { - hasSVPConsumption, - }; -}; diff --git a/packages/manager/apps/pci-billing/src/pages/billing/Billing.page.tsx b/packages/manager/apps/pci-billing/src/pages/billing/Billing.page.tsx index afd3c7525128..4dd184d8a4d8 100644 --- a/packages/manager/apps/pci-billing/src/pages/billing/Billing.page.tsx +++ b/packages/manager/apps/pci-billing/src/pages/billing/Billing.page.tsx @@ -27,9 +27,11 @@ export default function BillingPage() { const { data: project } = useProject(); const [activePanelName, setActivePanelName] = useState(''); - const anteriorDate = sub(new Date(), { months: 1 }); + const { environment } = useContext(ShellContext); + const { ovhSubsidiary } = environment.getUser(); + const isUsRegion = environment.getRegion() === 'US'; - const { ovhSubsidiary } = useContext(ShellContext).environment.getUser(); + const historyDate = isUsRegion ? new Date() : sub(new Date(), { months: 1 }); const { hasFreeLocalZonesBanner, @@ -38,7 +40,7 @@ export default function BillingPage() { // date-fns begin the index of month in 0 instead of 1 // Ex: January is 0, February is 1, etc. - const historyHref = `history/${anteriorDate.getFullYear()}/${anteriorDate.getMonth() + + const historyHref = `history/${historyDate.getFullYear()}/${historyDate.getMonth() + 1}`; const tabs = [ @@ -56,7 +58,7 @@ export default function BillingPage() { name: 'cpbc_tab_history', title: t('cpbc_tab_history'), to: useResolvedPath(historyHref).pathname, - isDisabled: !!hasOldBillingBanner, + isDisabled: !!hasOldBillingBanner && !isUsRegion, }, ]; diff --git a/packages/manager/apps/pci-billing/src/pages/billing/consumption/Consumption.page.tsx b/packages/manager/apps/pci-billing/src/pages/billing/consumption/Consumption.page.tsx index 053a4336675a..c7ac36bcf152 100644 --- a/packages/manager/apps/pci-billing/src/pages/billing/consumption/Consumption.page.tsx +++ b/packages/manager/apps/pci-billing/src/pages/billing/consumption/Consumption.page.tsx @@ -26,7 +26,6 @@ import MonthlyConsumption from '@/components/consumption/MonthlyConsumption.comp import HourlyConsumption from '@/components/consumption/HourlyConsumption.component'; import { useCurrentUsage } from '@/api/hook/useConsumption'; import SavingsPlanConsumption from '@/components/consumption/SavingsPlanConsumption.component'; -import { useSVPConsumptionFeatures } from '@/hooks/useSVPConsumptionFeatures'; import { useHiddenProducts } from '@/hooks/useHiddenProducts'; export default function Consumption() { @@ -39,7 +38,6 @@ export default function Consumption() { TRUSTED_ZONE, ]); - const { hasSVPConsumption } = useSVPConsumptionFeatures(); const { hasHiddenProducts } = useHiddenProducts(); const { data: consumption, isPending, error } = useCurrentUsage(projectId); @@ -106,10 +104,9 @@ export default function Consumption() { {consumption && ( )} - {!!hasSVPConsumption || - (consumption && ( - - ))} + {consumption && ( + + )}
diff --git a/packages/manager/apps/pci-billing/src/wrapperRenders.tsx b/packages/manager/apps/pci-billing/src/wrapperRenders.tsx index 0e38ef92ab8c..aa75cb51b55d 100644 --- a/packages/manager/apps/pci-billing/src/wrapperRenders.tsx +++ b/packages/manager/apps/pci-billing/src/wrapperRenders.tsx @@ -8,6 +8,7 @@ import { vi } from 'vitest'; const shellContext = { environment: { getUser: () => ({ ovhSubsidiary: 'FR', currency: '€' }), + getRegion: () => 'EU', }, shell: { navigation: { diff --git a/packages/manager/apps/pci-file-storage/CHANGELOG.md b/packages/manager/apps/pci-file-storage/CHANGELOG.md index 34cc45f1eb55..d52c2013aea4 100644 --- a/packages/manager/apps/pci-file-storage/CHANGELOG.md +++ b/packages/manager/apps/pci-file-storage/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.6.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-file-storage-app@0.6.0...@ovh-ux/manager-pci-file-storage-app@0.6.1) (2026-04-21) + + +### Bug Fixes + +* **i18n:** add missing translations [CDS 4735] ([a847603](https://github.com/ovh/manager/commit/a847603f0c7b48e61c4363a0de39c0b0d8f2b8f9)) +* **i18n:** add missing translations [CDS 4736] ([4fe94cf](https://github.com/ovh/manager/commit/4fe94cfc6356a7083e26a54595474b1021da15c3)) +* **i18n:** add missing translations [CDS 4737] ([28392aa](https://github.com/ovh/manager/commit/28392aa1ca888a30b452457b941d126075b888ad)) +* **i18n:** add missing translations [CDS 4741] ([aa5083b](https://github.com/ovh/manager/commit/aa5083b6a53d73d6f5fec9b8bfb1ea31b6c6aa5a)) +* **i18n:** add missing translations [CDS 4742] ([d3a8e27](https://github.com/ovh/manager/commit/d3a8e278eb1c4432fd7914153e6301b59712eeb1)) +* **i18n:** add missing translations [CDS 4744] ([a2e4de9](https://github.com/ovh/manager/commit/a2e4de93148d25efd6ec4d49ccd0132c257c86e7)) + + + + + # [0.6.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-file-storage-app@0.5.0...@ovh-ux/manager-pci-file-storage-app@0.6.0) (2026-04-13) diff --git a/packages/manager/apps/pci-file-storage/package.json b/packages/manager/apps/pci-file-storage/package.json index c05543097f78..4f22594ef77e 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.6.0", + "version": "0.6.1", "private": true, "description": "PCI file storage react app", "repository": { diff --git a/packages/manager/apps/pci-instances/CHANGELOG.md b/packages/manager/apps/pci-instances/CHANGELOG.md index 2e26a65ad620..b5892d20584f 100644 --- a/packages/manager/apps/pci-instances/CHANGELOG.md +++ b/packages/manager/apps/pci-instances/CHANGELOG.md @@ -3,6 +3,21 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.17.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-instances-app@0.17.1...@ovh-ux/manager-pci-instances-app@0.17.2) (2026-04-21) + + +### Bug Fixes + +* **i18n:** add missing translations [CDS 4735] ([a847603](https://github.com/ovh/manager/commit/a847603f0c7b48e61c4363a0de39c0b0d8f2b8f9)) +* **i18n:** add missing translations [CDS 4737] ([28392aa](https://github.com/ovh/manager/commit/28392aa1ca888a30b452457b941d126075b888ad)) +* **i18n:** add missing translations [CDS 4740] ([40b7b07](https://github.com/ovh/manager/commit/40b7b07c604cc98692cffd602ce02fab7b179cae)) +* **i18n:** add missing translations [CDS 4741] ([aa5083b](https://github.com/ovh/manager/commit/aa5083b6a53d73d6f5fec9b8bfb1ea31b6c6aa5a)) +* **i18n:** add missing translations [CDS 4744] ([a2e4de9](https://github.com/ovh/manager/commit/a2e4de93148d25efd6ec4d49ccd0132c257c86e7)) + + + + + ## [0.17.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-instances-app@0.17.0...@ovh-ux/manager-pci-instances-app@0.17.1) (2026-04-10) diff --git a/packages/manager/apps/pci-instances/package.json b/packages/manager/apps/pci-instances/package.json index 56a228db89c1..5f734bb6786f 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.17.1", + "version": "0.17.2", "private": true, "type": "module", "scripts": { diff --git a/packages/manager/apps/pci-object-storage/CHANGELOG.md b/packages/manager/apps/pci-object-storage/CHANGELOG.md index 65c1d48410eb..2f95e8b9e70c 100644 --- a/packages/manager/apps/pci-object-storage/CHANGELOG.md +++ b/packages/manager/apps/pci-object-storage/CHANGELOG.md @@ -3,6 +3,40 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [0.37.6](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-object-storage-app@0.37.5...@ovh-ux/manager-pci-object-storage-app@0.37.6) (2026-04-27) + + +### Bug Fixes + +* **pci.object-storage:** region are not filter by type of offer ([f46d5e0](https://github.com/ovh/manager/commit/f46d5e0f7e77aa542cb4dc02f93305046552236b)), closes [#DATATR-3151](https://github.com/ovh/manager/issues/DATATR-3151) + + + + + +## [0.37.5](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-object-storage-app@0.37.4...@ovh-ux/manager-pci-object-storage-app@0.37.5) (2026-04-21) + + +### Bug Fixes + +* **i18n:** add missing translations [CDS 4725] ([98f8a70](https://github.com/ovh/manager/commit/98f8a70a33f4f2950611e043d4e59115dbb8678c)) +* **i18n:** add missing translations [CDS 4735] ([a847603](https://github.com/ovh/manager/commit/a847603f0c7b48e61c4363a0de39c0b0d8f2b8f9)) + + + + + +## [0.37.4](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-object-storage-app@0.37.3...@ovh-ux/manager-pci-object-storage-app@0.37.4) (2026-04-17) + + +### Bug Fixes + +* **os:** upload field ([acffc0f](https://github.com/ovh/manager/commit/acffc0feec5571e7b7ec1655200128e21cec6b4c)) + + + + + ## [0.37.3](https://github.com/ovh/manager/compare/@ovh-ux/manager-pci-object-storage-app@0.37.2...@ovh-ux/manager-pci-object-storage-app@0.37.3) (2026-03-26) diff --git a/packages/manager/apps/pci-object-storage/package.json b/packages/manager/apps/pci-object-storage/package.json index 77156c25ce90..e33dfdf906c1 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.37.3", + "version": "0.37.6", "private": true, "description": "pci-object-storage", "repository": { diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/create/_components/useOrderFunnel.hook.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/create/_components/useOrderFunnel.hook.tsx index 31e27af93823..133867b287e8 100644 --- a/packages/manager/apps/pci-object-storage/src/pages/object-storage/create/_components/useOrderFunnel.hook.tsx +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/create/_components/useOrderFunnel.hook.tsx @@ -84,7 +84,9 @@ export function useOrderFunnel({ const currentRegion = regions.find((r) => r.name === region); const availableRegions: Region[] = useAvailableRegions({ - regions, + regions: regions.filter((r) => + r.services.some((service) => service.name === offer), + ), availabilities, options: { filterDisabledRegions: offer === ObjectContainerOffers['s3-standard'], diff --git a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/add-user-s3/AddUserS3.modal.tsx b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/add-user-s3/AddUserS3.modal.tsx index 1df870f6ff28..7d93647147ad 100644 --- a/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/add-user-s3/AddUserS3.modal.tsx +++ b/packages/manager/apps/pci-object-storage/src/pages/object-storage/storage/add-user-s3/AddUserS3.modal.tsx @@ -129,7 +129,6 @@ const AddUserS3Modal = () => { {users.map((user, i) => ( { const { t } = useTranslation('create'); const formatDate = useFormatDate(); + const isUsRegion = + useContext(ShellContext).environment?.getRegion?.() === 'US'; const [isLegalChecked, setIsLegalChecked] = useState(false); const onPrimaryButtonClick = () => { @@ -121,7 +124,10 @@ const CreatePlanConfirmModal = ({
@@ -129,6 +135,9 @@ const CreatePlanConfirmModal = ({
+ +  {isUsRegion ? '/month' : t('commitment_price_month')} +
diff --git a/packages/manager/apps/pci-savings-plan/src/components/CreatePlanForm/CreatePlanForm.tsx b/packages/manager/apps/pci-savings-plan/src/components/CreatePlanForm/CreatePlanForm.tsx index e191018ed39d..2d852eb5b1a8 100644 --- a/packages/manager/apps/pci-savings-plan/src/components/CreatePlanForm/CreatePlanForm.tsx +++ b/packages/manager/apps/pci-savings-plan/src/components/CreatePlanForm/CreatePlanForm.tsx @@ -60,7 +60,7 @@ import SelectQuantity, { DEFAULT_QUANTITY, MAX_QUANTITY, } from './SelectQuantity'; -import { toLocalDateUTC } from '../../utils/formatter/date'; +import { toLocalDateUTC, toUsDateUTC } from '../../utils/formatter/date'; import { buildDisplayName, DeploymentMode, @@ -139,6 +139,8 @@ const CreatePlanForm: FC = ({ const { trackClick } = useOvhTracking(); const navigate = useNavigate(); const { t } = useTranslation('create'); + const isUsRegion = + useContext(ShellContext).environment?.getRegion?.() === 'US'; const [selectedResource, setSelectedResource] = useState( ResourceType.instance, ); @@ -372,6 +374,7 @@ const CreatePlanForm: FC = ({ name="savings-plan-start-date" min={minStartDate} max={maxStartDate} + format={isUsRegion ? 'mm-dd-yyyy' : undefined} onOdsChange={(e) => { setStartDate(e.target.value); }} @@ -433,6 +436,7 @@ export const CreatePlanFormContainer = ({ }) => { const { environment } = useContext(ShellContext); const locale = environment.getUserLocale(); + const isUsRegion = environment.getRegion() === 'US'; const { t } = useTranslation(['create', 'listing']); const { addSuccess } = useNotifications(); @@ -482,11 +486,13 @@ export const CreatePlanFormContainer = ({ (data: { startDate: string }) => { addSuccess( t('listing:banner_create_sp', { - startDate: toLocalDateUTC(data.startDate, locale), + startDate: isUsRegion + ? toUsDateUTC(data.startDate) + : toLocalDateUTC(data.startDate, locale), }), ); }, - [addSuccess, t, locale], + [addSuccess, t, locale, isUsRegion], ); const { diff --git a/packages/manager/apps/pci-savings-plan/src/components/CreatePlanForm/SelectDeployment.tsx b/packages/manager/apps/pci-savings-plan/src/components/CreatePlanForm/SelectDeployment.tsx index 6d6a3ea810c0..5931a65a52dd 100644 --- a/packages/manager/apps/pci-savings-plan/src/components/CreatePlanForm/SelectDeployment.tsx +++ b/packages/manager/apps/pci-savings-plan/src/components/CreatePlanForm/SelectDeployment.tsx @@ -25,7 +25,11 @@ const SelectDeployment = ({ {t('choose_deployment')} - + {t('choose_deployment_description')} diff --git a/packages/manager/apps/pci-savings-plan/src/components/Dashboard/ConsumptionDatagrid/ConsumptionDatagrid.tsx b/packages/manager/apps/pci-savings-plan/src/components/Dashboard/ConsumptionDatagrid/ConsumptionDatagrid.tsx index de2c7cf9686c..879f96abbd38 100644 --- a/packages/manager/apps/pci-savings-plan/src/components/Dashboard/ConsumptionDatagrid/ConsumptionDatagrid.tsx +++ b/packages/manager/apps/pci-savings-plan/src/components/Dashboard/ConsumptionDatagrid/ConsumptionDatagrid.tsx @@ -20,7 +20,7 @@ import { SavingsPlanFlavorConsumption, SavingsPlanPeriodConsumption, } from '@/types/savingsPlanConsumption.type'; -import { toLocalDateUTC } from '@/utils/formatter/date'; +import { toLocalDateUTC, toUsDateTimeUTC } from '@/utils/formatter/date'; import { paginateResults } from '@/utils/paginate/utils'; import { useProjectId } from '@/hooks/useProject'; import ConsumptionResourceList from './ConsumptionResourceList'; @@ -43,6 +43,9 @@ const ConsumptionDatagrid = ({ const { pagination, setPagination } = useDataGrid(); const { environment } = useContext(ShellContext); const locale = environment.getUserLocale(); + const isUsRegion = environment.getRegion() === 'US'; + const formatPeriodDate = (date: string) => + isUsRegion ? toUsDateTimeUTC(date) : toLocalDateUTC(date, locale); const { t } = useTranslation(['dashboard', 'listing']); const { trackClick } = useOvhTracking(); const [isDrawerOpen, setDrawerOpen] = useState(false); @@ -56,14 +59,14 @@ const ConsumptionDatagrid = ({ label: t('dashboard_columns_start'), id: 'begin', cell: (props: SavingsPlanPeriodConsumption) => ( - + ), }, { label: t('dashboard_columns_end'), id: 'end', cell: (props: SavingsPlanPeriodConsumption) => ( - + ), }, { diff --git a/packages/manager/apps/pci-savings-plan/src/components/LegalLinks/LegalLinks.test.tsx b/packages/manager/apps/pci-savings-plan/src/components/LegalLinks/LegalLinks.test.tsx index 97a32d5101bf..0962e151fb17 100644 --- a/packages/manager/apps/pci-savings-plan/src/components/LegalLinks/LegalLinks.test.tsx +++ b/packages/manager/apps/pci-savings-plan/src/components/LegalLinks/LegalLinks.test.tsx @@ -3,9 +3,11 @@ import { vi } from 'vitest'; import { HttpResponse, http } from 'msw'; import { setupServer } from 'msw/node'; import React from 'react'; -import { render, waitFor, screen } from '@/utils/testProvider'; +import { render, waitFor } from '@/utils/testProvider'; import LegalLinks from './LegalLinks'; import { SavingsPlanContract } from '@/types'; +import { US_LEGAL_LINKS } from '@/constants'; +import { queryClient } from '@/App'; const MOCK_CONTRACTS: SavingsPlanContract[] = [ { @@ -22,20 +24,20 @@ const MOCK_CONTRACTS: SavingsPlanContract[] = [ }, ]; +let currentRegion: string | undefined; + const server = setupServer( - http.get('/engine/apiv6/services?resourceName=789', () => { - return HttpResponse.json([123]); - }), - http.get('/engine/apiv6/services/789/savingsPlans/contracts', () => { - return HttpResponse.json(MOCK_CONTRACTS); - }), + http.get('/engine/apiv6/services?resourceName=789', () => + HttpResponse.json([123]), + ), + http.get('/engine/apiv6/services/789/savingsPlans/contracts', () => + HttpResponse.json(currentRegion === 'US' ? [] : MOCK_CONTRACTS), + ), ); -vi.mock('@/hooks/useProject', () => { - return { - useProjectId: () => '123', - }; -}); +vi.mock('@/hooks/useProject', () => ({ + useProjectId: () => '123', +})); vi.mock('react-router-dom', async (importOriginal) => { const actual = await importOriginal(); @@ -47,12 +49,32 @@ vi.mock('react-router-dom', async (importOriginal) => { }; }); +vi.mock('@ovh-ux/manager-react-shell-client', async (importOriginal) => { + const actual = await importOriginal< + typeof import('@ovh-ux/manager-react-shell-client') + >(); + const { createContext } = await import('react'); + return { + ...actual, + ShellContext: createContext({ + shell: {}, + environment: { + getRegion: () => currentRegion, + }, + }), + }; +}); + beforeAll(() => server.listen()); -afterEach(() => server.resetHandlers()); +afterEach(() => { + server.resetHandlers(); + queryClient.clear(); +}); afterAll(() => server.close()); describe('LegalLinks', async () => { it('renders the legal links correctly', async () => { + currentRegion = undefined; const { container } = render(); await waitFor(() => { @@ -65,4 +87,17 @@ describe('LegalLinks', async () => { }); }); }); + + it('renders the hardcoded US legal links when region is US (API returns no contract)', async () => { + currentRegion = 'US'; + const { container } = render(); + + await waitFor(() => { + Object.entries(US_LEGAL_LINKS).forEach(([name, url]) => { + expect( + container.querySelector(`[label='${name}'][href='${url}']`), + ).toBeInTheDocument(); + }); + }); + }); }); diff --git a/packages/manager/apps/pci-savings-plan/src/components/LegalLinks/LegalLinks.tsx b/packages/manager/apps/pci-savings-plan/src/components/LegalLinks/LegalLinks.tsx index 7ce160b503b7..22f992318241 100644 --- a/packages/manager/apps/pci-savings-plan/src/components/LegalLinks/LegalLinks.tsx +++ b/packages/manager/apps/pci-savings-plan/src/components/LegalLinks/LegalLinks.tsx @@ -1,17 +1,30 @@ import { Links, LinkType } from '@ovh-ux/manager-react-components'; -import React from 'react'; +import React, { useContext } from 'react'; +import { ShellContext } from '@ovh-ux/manager-react-shell-client'; import { useSavingsPlanContract } from '@/hooks/useSavingsPlan'; +import { US_LEGAL_LINKS } from '@/constants'; type TLegalLinksProps = { className?: string; }; +type TLegalLink = { + name: string; + url: string; +}; + const LegalLinks: React.FC = ({ className = '' }) => { + const isUsRegion = + useContext(ShellContext).environment?.getRegion?.() === 'US'; const { data = [] } = useSavingsPlanContract(); + const links: TLegalLink[] = isUsRegion + ? Object.entries(US_LEGAL_LINKS).map(([name, url]) => ({ name, url })) + : data.map(({ name, url }) => ({ name, url })); + return ( <> - {data.map((link) => ( + {links.map((link) => ( = { + 'Service Specific Terms': + 'https://us.ovhcloud.com/legal/service-specific-terms/', + 'Terms of Service': 'https://us.ovhcloud.com/legal/terms-of-service/', + 'Privacy Policy': 'https://us.ovhcloud.com/legal/privacy-policy/', +}; + export const CHANGELOG_LINKS: ChangelogLinks = { changelog: 'https://github.com/orgs/ovh/projects/16/views/6?pane=info', roadmap: 'https://github.com/orgs/ovh/projects/16/views/1?pane=info', diff --git a/packages/manager/apps/pci-savings-plan/src/utils/formatter/date.test.ts b/packages/manager/apps/pci-savings-plan/src/utils/formatter/date.test.ts index b7630e706958..917798a96757 100644 --- a/packages/manager/apps/pci-savings-plan/src/utils/formatter/date.test.ts +++ b/packages/manager/apps/pci-savings-plan/src/utils/formatter/date.test.ts @@ -1,4 +1,10 @@ -import { formatDate, getLastXMonths, toIsoDate } from './date'; +import { + formatDate, + getLastXMonths, + toIsoDate, + toUsDateTimeUTC, + toUsDateUTC, +} from './date'; describe('Date helper', () => { describe('formatDate', () => { @@ -47,4 +53,34 @@ describe('Date helper', () => { expect(formattedDate).toBe('2024-02-29'); }); }); + + describe('toUsDateUTC', () => { + it('should format date to MM-DD-YYYY in UTC from string', () => { + expect(toUsDateUTC('2024-03-05T23:30:00.000Z')).toBe('03-05-2024'); + }); + + it('should pad single digit months and days', () => { + expect(toUsDateUTC('2024-01-01T00:00:00.000Z')).toBe('01-01-2024'); + }); + + it('should accept a Date object', () => { + expect(toUsDateUTC(new Date('2024-12-25T12:00:00.000Z'))).toBe( + '12-25-2024', + ); + }); + }); + + describe('toUsDateTimeUTC', () => { + it('should format date+time as MM-DD-YYYY, HH:mm UTC', () => { + expect(toUsDateTimeUTC('2026-04-01T00:00:00.000Z')).toBe( + '04-01-2026, 00:00 UTC', + ); + }); + + it('should format an afternoon datetime in 24h UTC', () => { + expect(toUsDateTimeUTC('2026-04-22T08:57:00.000Z')).toBe( + '04-22-2026, 08:57 UTC', + ); + }); + }); }); diff --git a/packages/manager/apps/pci-savings-plan/src/utils/formatter/date.ts b/packages/manager/apps/pci-savings-plan/src/utils/formatter/date.ts index 836c16e54b62..ad0de3718bf3 100644 --- a/packages/manager/apps/pci-savings-plan/src/utils/formatter/date.ts +++ b/packages/manager/apps/pci-savings-plan/src/utils/formatter/date.ts @@ -17,6 +17,30 @@ export const toLocalDateUTC = (date: string, locale: string) => timeZoneName: 'short', }); +export const toUsDateUTC = (date: string | Date) => + new Date(date) + .toLocaleDateString('en-US', { + timeZone: 'UTC', + month: '2-digit', + day: '2-digit', + year: 'numeric', + }) + .replace(/\//g, '-'); + +export const toUsDateTimeUTC = (date: string | Date) => + new Date(date) + .toLocaleString('en-US', { + timeZone: 'UTC', + month: '2-digit', + day: '2-digit', + year: 'numeric', + hour: '2-digit', + minute: '2-digit', + hour12: false, + timeZoneName: 'short', + }) + .replace(/^(\d{2})\/(\d{2})\/(\d{4})/, '$1-$2-$3'); + const DEFAULT_MONTHS = 6; export const getLastXMonths = (nbrMonths: number = DEFAULT_MONTHS) => { diff --git a/packages/manager/apps/web-hosting/CHANGELOG.md b/packages/manager/apps/web-hosting/CHANGELOG.md index 82cd51702d3e..ee158b8fb583 100644 --- a/packages/manager/apps/web-hosting/CHANGELOG.md +++ b/packages/manager/apps/web-hosting/CHANGELOG.md @@ -3,6 +3,18 @@ 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-web-hosting-app@0.20.1...@ovh-ux/manager-web-hosting-app@0.20.2) (2026-04-21) + + +### Bug Fixes + +* **i18n:** add missing translations [CDS 4735] ([a847603](https://github.com/ovh/manager/commit/a847603f0c7b48e61c4363a0de39c0b0d8f2b8f9)) +* **i18n:** add missing translations [CDS 4737] ([28392aa](https://github.com/ovh/manager/commit/28392aa1ca888a30b452457b941d126075b888ad)) + + + + + ## [0.20.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-web-hosting-app@0.20.0...@ovh-ux/manager-web-hosting-app@0.20.1) (2026-04-03) diff --git a/packages/manager/apps/web-hosting/package.json b/packages/manager/apps/web-hosting/package.json index 5dc7e6f844cf..b915eb305b86 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.20.1", + "version": "0.20.2", "private": true, "description": "Manage web hostings in the OVH Control Panel", "repository": { diff --git a/packages/manager/apps/web/CHANGELOG.md b/packages/manager/apps/web/CHANGELOG.md index 7d3c6edc8b23..c6de2ff216db 100644 --- a/packages/manager/apps/web/CHANGELOG.md +++ b/packages/manager/apps/web/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. +# [19.39.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-web@19.38.3...@ovh-ux/manager-web@19.39.0) (2026-04-29) + + +### Bug Fixes + +* **i18n:** add missing translations [CDS 1234] ([8a16cb8](https://github.com/ovh/manager/commit/8a16cb838f55f7f2fb082e67f5d9e75b28b8efa9)) +* **web-hosting:** manage addon renew period ([012d071](https://github.com/ovh/manager/commit/012d07176c1907c3ef600a2ff7d68a06a987020e)), closes [#PUWEBPT-323](https://github.com/ovh/manager/issues/PUWEBPT-323) +* **web-hosting:** manage agency offers when channging offers ([fedd06b](https://github.com/ovh/manager/commit/fedd06b9262ef1800b316e9c342e2d29a236578e)), closes [#PUWEBPT-289](https://github.com/ovh/manager/issues/PUWEBPT-289) + + +### Features + +* **web-hosting:** add new offer upgrade ([2fb65ec](https://github.com/ovh/manager/commit/2fb65ec758c9983bfc6cb56df8423d48b08f4de9)), closes [#PUWEBPT-289](https://github.com/ovh/manager/issues/PUWEBPT-289) + + + + + ## [19.38.3](https://github.com/ovh/manager/compare/@ovh-ux/manager-web@19.38.2...@ovh-ux/manager-web@19.38.3) (2026-03-25) diff --git a/packages/manager/apps/web/client/app/components/hosting-domain-offers/constants.js b/packages/manager/apps/web/client/app/components/hosting-domain-offers/constants.js index 6ddec4623374..3ef90ec57476 100644 --- a/packages/manager/apps/web/client/app/components/hosting-domain-offers/constants.js +++ b/packages/manager/apps/web/client/app/components/hosting-domain-offers/constants.js @@ -13,6 +13,12 @@ export const CATEGORIES_MAP = { 'hosting-performance-2': 'PERFORMANCE', 'hosting-performance-3': 'PERFORMANCE', 'hosting-performance-4': 'PERFORMANCE', + 'hosting-free-100M': 'FREE_100M', + 'hosting-starter': 'STARTER', + 'hosting-startup': 'STARTUP', + 'hosting-agency': 'AGENCY', + 'hosting-agency-plus': 'AGENCY_PLUS', + 'hosting-agency-max': 'AGENCY_MAX', }; export const CLOUDWEB_OFFER = ['cloudweb1', 'cloudweb2', 'cloudweb3']; @@ -30,6 +36,12 @@ export const VERSION_MAP = { 'hosting-performance-2': 'PERFORMANCE_2', 'hosting-performance-3': 'PERFORMANCE_3', 'hosting-performance-4': 'PERFORMANCE_4', + 'hosting-free-100M': 'FREE_100M', + 'hosting-starter': 'STARTER', + 'hosting-startup': 'STARTUP', + 'hosting-agency': 'AGENCY', + 'hosting-agency-plus': 'AGENCY_PLUS', + 'hosting-agency-max': 'AGENCY_MAX', }; export const BADGES = { @@ -47,6 +59,18 @@ export const NEW_OFFERS_PLAN_CODES = { PERFORMANCE_4: 'hosting-performance-4', }; +export const OFFERS_PLAN_CODES = { + FREE_100M: 'hosting-free-100M', + STARTER: 'hosting-starter', + PERSO: 'hosting-perso', + STARTUP: 'hosting-startup', + PRO: 'hosting-pro', + PERFORMANCE_1: 'hosting-performance-1', + AGENCY: 'hosting-agency', + AGENCY_PLUS: 'hosting-agency-plus', + AGENCY_MAX: 'hosting-agency-max', +}; + export const WEB_CLOUD_DB_VALUES = '512MB RAM - 8GB'; export default { diff --git a/packages/manager/apps/web/client/app/components/hosting-domain-offers/controller.js b/packages/manager/apps/web/client/app/components/hosting-domain-offers/controller.js index 8533b3f2e7d0..9ab68fae29fb 100644 --- a/packages/manager/apps/web/client/app/components/hosting-domain-offers/controller.js +++ b/packages/manager/apps/web/client/app/components/hosting-domain-offers/controller.js @@ -6,6 +6,7 @@ import { NEW_OFFERS_END_DATE, BADGES, NEW_OFFERS_PLAN_CODES, + OFFERS_PLAN_CODES, CATEGORIES_MAP, VERSION_MAP, CLOUDWEB_OFFER, @@ -15,10 +16,174 @@ import { export default class WebComponentsHostingDomainOffersController { /* @ngInject */ - constructor($translate, $filter) { + constructor($translate, $filter, ovhFeatureFlipping) { this.$translate = $translate; + this.ovhFeatureFlipping = ovhFeatureFlipping; const bytes = $filter('bytes'); + this.OFFERS = { + FREE_100M: { + TECHNICALS: [ + { prefix: 'sites', values: [1] }, + { prefix: 'disk', values: ['100 Mo SSD'] }, + { prefix: 'emailStorage', values: [1, '5 Go'] }, + ], + SELECTORS: { + FREE_100M: { + planCode: OFFERS_PLAN_CODES.FREE_100M, + }, + }, + }, + STARTER: { + TECHNICALS: [ + { prefix: 'sites', values: [1] }, + { prefix: 'nddFree', values: [1] }, + { prefix: 'emailStorage', values: [2, '5 Go'] }, + { prefix: 'disk', values: ['1 Go SSD'] }, + { prefix: 'cms', values: [] }, + ], + SELECTORS: { + STARTER: { + planCode: OFFERS_PLAN_CODES.STARTER, + }, + }, + }, + PERSO: { + TECHNICALS: [ + { prefix: 'sites', values: [5] }, + { prefix: 'nddFree', values: [1] }, + { prefix: 'emailStorage', values: [10, '5 Go'] }, + { prefix: 'disk', values: ['100 Go SSD'] }, + { prefix: 'cms', values: [] }, + ], + SELECTORS: { + PERSO: { + planCode: OFFERS_PLAN_CODES.PERSO, + }, + }, + }, + STARTUP: { + TECHNICALS: [ + { prefix: 'vcores', values: ['< 1'] }, + { prefix: 'ram', values: ['< 1 Go'] }, + { prefix: 'backupIncluded', values: [] }, + { prefix: 'uptime', values: ['99,9%'] }, + { prefix: 'disk', values: ['100 Go SSD'] }, + { prefix: 'sites', values: [5] }, + { prefix: 'emailStorage', values: [10, '5 Go'] }, + { prefix: 'dbs', values: [5, '1 Go'] }, + { prefix: 'nddFree', values: [1] }, + ], + SELECTORS: { + STARTUP: { + planCode: OFFERS_PLAN_CODES.STARTUP, + }, + }, + }, + PRO: { + TECHNICALS: [ + { prefix: 'vcores', values: [1] }, + { prefix: 'ram', values: ['2 Go'] }, + { prefix: 'backupIncluded', values: [] }, + { prefix: 'uptime', values: ['99,9%'] }, + { prefix: 'disk', values: ['250 Go SSD'] }, + { prefix: 'sites', values: [100] }, + { prefix: 'emailStorage', values: [100, '5 Go'] }, + { prefix: 'dbs', values: [10, '2 Go'] }, + { prefix: 'nddFree', values: [1] }, + { prefix: 'cdn', values: [] }, + ], + SELECTORS: { + PRO: { + planCode: OFFERS_PLAN_CODES.PRO, + }, + }, + }, + PERFORMANCE: { + TECHNICALS: [ + { prefix: 'vcores', values: [2] }, + { prefix: 'ram', values: ['4 Go'] }, + { prefix: 'backupIncluded', values: [] }, + { prefix: 'uptime', values: ['99,9%'] }, + { prefix: 'disk', values: ['500 Go'] }, + { prefix: 'sites', values: [150] }, + { prefix: 'emailStorage', values: [1000, '5 Go'] }, + { prefix: 'dbs', values: [20, '2 Go'] }, + { prefix: 'webcloudDb', values: [] }, + { prefix: 'nddFree', values: [1] }, + { prefix: 'cdn', values: [] }, + ], + SELECTORS: { + PERFORMANCE_1: { + planCode: OFFERS_PLAN_CODES.PERFORMANCE_1, + }, + }, + }, + AGENCY: { + TECHNICALS: [ + { prefix: 'sites', values: [200] }, + { prefix: 'disk', values: ['500 Go SSD'] }, + { prefix: 'ram', values: ['8 Go'] }, + { prefix: 'vcores', values: [6] }, + { prefix: 'backupIncluded', values: [] }, + { prefix: 'uptime', values: ['99,9%'] }, + { prefix: 'userManagement', values: [] }, + { prefix: 'emailStorage', values: [1000, '5 Go'] }, + { prefix: 'dbs', values: [30, '2 Go'] }, + { prefix: 'webcloudDb', values: [] }, + { prefix: 'cdn', values: [] }, + { prefix: 'git', values: [] }, + ], + SELECTORS: { + AGENCY: { + planCode: OFFERS_PLAN_CODES.AGENCY, + }, + }, + }, + AGENCY_PLUS: { + TECHNICALS: [ + { prefix: 'sites', values: [500] }, + { prefix: 'disk', values: ['700 Go SSD'] }, + { prefix: 'ram', values: ['12 Go'] }, + { prefix: 'vcores', values: [10] }, + { prefix: 'backupIncluded', values: [] }, + { prefix: 'uptime', values: ['99,9%'] }, + { prefix: 'userManagement', values: [] }, + { prefix: 'emailStorage', values: [1000, '5 Go'] }, + { prefix: 'dbs', values: [40, '2 Go'] }, + { prefix: 'webcloudDb', values: [] }, + { prefix: 'cdn', values: [] }, + { prefix: 'git', values: [] }, + ], + SELECTORS: { + AGENCY_PLUS: { + planCode: OFFERS_PLAN_CODES.AGENCY_PLUS, + }, + }, + }, + AGENCY_MAX: { + TECHNICALS: [ + { prefix: 'sites', values: [3000] }, + { prefix: 'disk', values: ['1 To SSD'] }, + { prefix: 'ram', values: ['16 Go'] }, + { prefix: 'vcores', values: [14] }, + { prefix: 'backupIncluded', values: [] }, + { prefix: 'uptime', values: ['99,9%'] }, + { prefix: 'userManagement', values: [] }, + { prefix: 'emailStorage', values: [1000, '5 Go'] }, + { prefix: 'dbs', values: [50, '2 Go'] }, + { prefix: 'webcloudDb', values: [] }, + { prefix: 'cdn', values: [] }, + { prefix: 'git', values: [] }, + ], + SELECTORS: { + AGENCY_MAX: { + planCode: OFFERS_PLAN_CODES.AGENCY_MAX, + }, + }, + }, + }; + this.NEW_OFFERS = { PERSO: { TECHNICALS: [ @@ -89,7 +254,19 @@ export default class WebComponentsHostingDomainOffersController { } $onInit() { - this.groupedOffers = this.buildOffersGroup(); + return this.ovhFeatureFlipping + .checkFeatureAvailability(['web-hosting:change-offer']) + .then((featureAvailability) => { + this.useNewOffers = featureAvailability.isFeatureAvailable( + 'web-hosting:change-offer', + ); + }) + .catch(() => { + this.useNewOffers = false; + }) + .finally(() => { + this.groupedOffers = this.buildOffersGroup(); + }); } static buildBadgeModel(type, className) { @@ -193,7 +370,8 @@ export default class WebComponentsHostingDomainOffersController { } getNewOffer(offerCategory) { - return this.NEW_OFFERS[offerCategory.toUpperCase()]; + const offers = this.useNewOffers ? this.OFFERS : this.NEW_OFFERS; + return offers[offerCategory.toUpperCase()]; } getOfferTechnicalsInfo(offerCategory) { @@ -202,10 +380,13 @@ export default class WebComponentsHostingDomainOffersController { let serviceDatas = values[1]; if (prefix === 'services' && !serviceDatas) serviceDatas = WEB_CLOUD_DB_VALUES; - return this.$translate.instant( - `web_components_hosting_domain_offers_offer_${offerCategory}_technicals_${prefix}`, - { value1: values[0], value2: serviceDatas }, - ); + const key = this.useNewOffers + ? `web_components_hosting_domain_offers_${prefix}` + : `web_components_hosting_domain_offers_offer_${offerCategory}_technicals_${prefix}`; + return this.$translate.instant(key, { + value1: values[0], + value2: serviceDatas, + }); }, ); } diff --git a/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_de_DE.json b/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_de_DE.json index 00eb6696dd5c..cb7ef2ac0b10 100644 --- a/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_de_DE.json +++ b/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_de_DE.json @@ -30,5 +30,22 @@ "web_components_hosting_domain_offers_offer_badge_current": "Derzeitiges Angebot", "web_components_hosting_domain_offers_offer_select_version_placeholder": "Version auswählen", "web_components_hosting_domain_offers_offer_select_version_performance": "{{coreNumber}} vCores, {{ramSize}} RAM", - "web_components_hosting_domain_offers_offer_price": "{{priceValue}} zzgl. MwSt./Monat" -} \ No newline at end of file + "web_components_hosting_domain_offers_offer_price": "{{priceValue}} zzgl. MwSt./Monat", + "web_components_hosting_domain_offers_offer_agency": "Agentur", + "web_components_hosting_domain_offers_offer_agency_plus": "Agentur Plus", + "web_components_hosting_domain_offers_offer_agency_max": "Agentur Max", + "web_components_hosting_domain_offers_sites": "{{value1}} Seiten", + "web_components_hosting_domain_offers_disk": "{{value1}}", + "web_components_hosting_domain_offers_emailStorage": "{{value1}} E-Mails {{value2}}", + "web_components_hosting_domain_offers_cms": "CMS 1-Klick", + "web_components_hosting_domain_offers_nddFree": "{{value1}} NDD kostenlos", + "web_components_hosting_domain_offers_vcores": "{{value1}} vCore", + "web_components_hosting_domain_offers_ram": "{{value1}} RAM", + "web_components_hosting_domain_offers_backupIncluded": "Backup inklusive", + "web_components_hosting_domain_offers_uptime": "Uptime {{value1}}", + "web_components_hosting_domain_offers_dbs": "{{value1}} DB {{value2}}", + "web_components_hosting_domain_offers_webcloudDb": "WebCloud DB", + "web_components_hosting_domain_offers_cdn": "CDN", + "web_components_hosting_domain_offers_git": "GIT", + "web_components_hosting_domain_offers_userManagement": "Benutzerverwaltung" +} diff --git a/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_en_GB.json b/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_en_GB.json index 280fe8c773bf..52c51b54b34b 100644 --- a/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_en_GB.json +++ b/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_en_GB.json @@ -30,5 +30,22 @@ "web_components_hosting_domain_offers_offer_badge_current": "Current solution", "web_components_hosting_domain_offers_offer_select_version_placeholder": "Choose a version", "web_components_hosting_domain_offers_offer_select_version_performance": "{{coreNumber}} vCores, {{ramSize}} RAM", - "web_components_hosting_domain_offers_offer_price": "{{priceValue}} ex. VAT/month" -} \ No newline at end of file + "web_components_hosting_domain_offers_offer_price": "{{priceValue}} ex. VAT/month", + "web_components_hosting_domain_offers_offer_agency": "Agency", + "web_components_hosting_domain_offers_offer_agency_plus": "Agency Plus", + "web_components_hosting_domain_offers_offer_agency_max": "Agency Max", + "web_components_hosting_domain_offers_sites": "{{value1}} Sites", + "web_components_hosting_domain_offers_disk": "{{value1}}", + "web_components_hosting_domain_offers_emailStorage": "{{value1}} emails {{value2}}", + "web_components_hosting_domain_offers_cms": "CMS 1click", + "web_components_hosting_domain_offers_nddFree": "{{value1}} free domain", + "web_components_hosting_domain_offers_vcores": "{{value1}} vCore", + "web_components_hosting_domain_offers_ram": "{{value1}} of RAM", + "web_components_hosting_domain_offers_backupIncluded": "Backup included", + "web_components_hosting_domain_offers_uptime": "Uptime {{value1}}", + "web_components_hosting_domain_offers_dbs": "{{value1}} database {{value2}}", + "web_components_hosting_domain_offers_webcloudDb": "WebCloud Database", + "web_components_hosting_domain_offers_cdn": "CDN", + "web_components_hosting_domain_offers_git": "GIT", + "web_components_hosting_domain_offers_userManagement": "User management" +} diff --git a/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_es_ES.json b/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_es_ES.json index 5a1ffc21d569..583fa18963de 100644 --- a/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_es_ES.json +++ b/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_es_ES.json @@ -30,5 +30,22 @@ "web_components_hosting_domain_offers_offer_badge_current": "Producto actual", "web_components_hosting_domain_offers_offer_select_version_placeholder": "Elegir una versión", "web_components_hosting_domain_offers_offer_select_version_performance": "{{coreNumber}} vCores, {{ramSize}} RAM", - "web_components_hosting_domain_offers_offer_price": "{{priceValue}}/mes + IVA" -} \ No newline at end of file + "web_components_hosting_domain_offers_offer_price": "{{priceValue}}/mes + IVA", + "web_components_hosting_domain_offers_offer_agency": "Agencia", + "web_components_hosting_domain_offers_offer_agency_plus": "Agencia más", + "web_components_hosting_domain_offers_offer_agency_max": "Agencia máxima", + "web_components_hosting_domain_offers_sites": "{{value1}} Sitios", + "web_components_hosting_domain_offers_disk": "{{value1}}", + "web_components_hosting_domain_offers_emailStorage": "{{value1}} correos {{value2}}", + "web_components_hosting_domain_offers_cms": "CMS 1clic", + "web_components_hosting_domain_offers_nddFree": "{{value1}} ndd gratis", + "web_components_hosting_domain_offers_vcores": "{{value1}} vCore", + "web_components_hosting_domain_offers_ram": "{{value1}} de RAM", + "web_components_hosting_domain_offers_backupIncluded": "Backup incluido", + "web_components_hosting_domain_offers_uptime": "Uptime {{value1}}", + "web_components_hosting_domain_offers_dbs": "{{value1}} db {{value2}}", + "web_components_hosting_domain_offers_webcloudDb": "WebCloud DB", + "web_components_hosting_domain_offers_cdn": "CDN", + "web_components_hosting_domain_offers_git": "GIT", + "web_components_hosting_domain_offers_userManagement": "Gestión de usuario" +} diff --git a/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_fr_CA.json b/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_fr_CA.json index c7d7a4b740e7..f2454ee603c3 100644 --- a/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_fr_CA.json +++ b/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_fr_CA.json @@ -1,5 +1,9 @@ { "web_components_hosting_domain_offers_offer_starter": "Starter", + "web_components_hosting_domain_offers_offer_agency": "Agence", + "web_components_hosting_domain_offers_offer_agency_plus": "Agence plus", + "web_components_hosting_domain_offers_offer_agency_max": "Agence max", + "web_components_hosting_domain_offers_offer_perso": "Perso", "web_components_hosting_domain_offers_offer_perso_technicals_discs": "{{value1}} d'espace disque", "web_components_hosting_domain_offers_offer_perso_technicals_emails": "{{value1}} adresses e-mail", @@ -7,6 +11,7 @@ "web_components_hosting_domain_offers_offer_perso_technicals_multisite": "Multisites", "web_components_hosting_domain_offers_offer_perso_technicals_ftp": "Accès FTP illimité", "web_components_hosting_domain_offers_offer_perso_technicals_dbs": "{{value1}} × base de données MySQL {{value2}}", + "web_components_hosting_domain_offers_offer_pro": "Pro", "web_components_hosting_domain_offers_offer_pro_technicals_discs": "{{value1}} d'espace disque", "web_components_hosting_domain_offers_offer_pro_technicals_emails": "{{value1}} adresses e-mail", @@ -14,6 +19,7 @@ "web_components_hosting_domain_offers_offer_pro_technicals_multisite": "Multisites", "web_components_hosting_domain_offers_offer_pro_technicals_ssh": "Accès SSH illimité", "web_components_hosting_domain_offers_offer_pro_technicals_dbs": "{{value1}} × base de données MySQL {{value2}}", + "web_components_hosting_domain_offers_offer_performance": "Performance", "web_components_hosting_domain_offers_offer_performance_technicals_discs": "{{value1}} d'espace disque", "web_components_hosting_domain_offers_offer_performance_technicals_emails": "{{value1}} adresses e-mail", @@ -30,5 +36,19 @@ "web_components_hosting_domain_offers_offer_badge_current": "Offre actuelle", "web_components_hosting_domain_offers_offer_select_version_placeholder": "Choisir une version", "web_components_hosting_domain_offers_offer_select_version_performance": "{{coreNumber}} vCores, {{ramSize}} RAM", - "web_components_hosting_domain_offers_offer_price": "{{priceValue}} HT/mois" -} \ No newline at end of file + "web_components_hosting_domain_offers_offer_price": "{{priceValue}} HT/mois", + "web_components_hosting_domain_offers_sites": "{{value1}} Sites", + "web_components_hosting_domain_offers_disk": "{{value1}}", + "web_components_hosting_domain_offers_emailStorage": "{{value1}} mails {{value2}}", + "web_components_hosting_domain_offers_cms": "CMS 1clic", + "web_components_hosting_domain_offers_nddFree": "{{value1}} ndd free", + "web_components_hosting_domain_offers_vcores": "{{value1}} vCore", + "web_components_hosting_domain_offers_ram": "{{value1}} de RAM", + "web_components_hosting_domain_offers_backupIncluded": "Backup inclus", + "web_components_hosting_domain_offers_uptime": "Uptime {{value1}}", + "web_components_hosting_domain_offers_dbs": "{{value1}} db {{value2}}", + "web_components_hosting_domain_offers_webcloudDb": "WebCloud DB", + "web_components_hosting_domain_offers_cdn": "CDN", + "web_components_hosting_domain_offers_git": "GIT", + "web_components_hosting_domain_offers_userManagement": "Gestion user" +} diff --git a/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_fr_FR.json b/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_fr_FR.json index c20eeeeb53f5..f2454ee603c3 100644 --- a/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_fr_FR.json +++ b/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_fr_FR.json @@ -1,5 +1,9 @@ { "web_components_hosting_domain_offers_offer_starter": "Starter", + "web_components_hosting_domain_offers_offer_agency": "Agence", + "web_components_hosting_domain_offers_offer_agency_plus": "Agence plus", + "web_components_hosting_domain_offers_offer_agency_max": "Agence max", + "web_components_hosting_domain_offers_offer_perso": "Perso", "web_components_hosting_domain_offers_offer_perso_technicals_discs": "{{value1}} d'espace disque", "web_components_hosting_domain_offers_offer_perso_technicals_emails": "{{value1}} adresses e-mail", @@ -32,5 +36,19 @@ "web_components_hosting_domain_offers_offer_badge_current": "Offre actuelle", "web_components_hosting_domain_offers_offer_select_version_placeholder": "Choisir une version", "web_components_hosting_domain_offers_offer_select_version_performance": "{{coreNumber}} vCores, {{ramSize}} RAM", - "web_components_hosting_domain_offers_offer_price": "{{priceValue}} HT/mois" + "web_components_hosting_domain_offers_offer_price": "{{priceValue}} HT/mois", + "web_components_hosting_domain_offers_sites": "{{value1}} Sites", + "web_components_hosting_domain_offers_disk": "{{value1}}", + "web_components_hosting_domain_offers_emailStorage": "{{value1}} mails {{value2}}", + "web_components_hosting_domain_offers_cms": "CMS 1clic", + "web_components_hosting_domain_offers_nddFree": "{{value1}} ndd free", + "web_components_hosting_domain_offers_vcores": "{{value1}} vCore", + "web_components_hosting_domain_offers_ram": "{{value1}} de RAM", + "web_components_hosting_domain_offers_backupIncluded": "Backup inclus", + "web_components_hosting_domain_offers_uptime": "Uptime {{value1}}", + "web_components_hosting_domain_offers_dbs": "{{value1}} db {{value2}}", + "web_components_hosting_domain_offers_webcloudDb": "WebCloud DB", + "web_components_hosting_domain_offers_cdn": "CDN", + "web_components_hosting_domain_offers_git": "GIT", + "web_components_hosting_domain_offers_userManagement": "Gestion user" } diff --git a/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_it_IT.json b/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_it_IT.json index e3340d43e8f2..798e4fc77eb7 100644 --- a/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_it_IT.json +++ b/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_it_IT.json @@ -30,5 +30,22 @@ "web_components_hosting_domain_offers_offer_badge_current": "Soluzione corrente", "web_components_hosting_domain_offers_offer_select_version_placeholder": "Scegliere una versione", "web_components_hosting_domain_offers_offer_select_version_performance": "{{coreNumber}} vCore, {{ramSize}} RAM", - "web_components_hosting_domain_offers_offer_price": "{{priceValue}} +IVA/mese" -} \ No newline at end of file + "web_components_hosting_domain_offers_offer_price": "{{priceValue}} +IVA/mese", + "web_components_hosting_domain_offers_offer_agency": "Agenzia", + "web_components_hosting_domain_offers_offer_agency_plus": "Agenzia plus", + "web_components_hosting_domain_offers_offer_agency_max": "Agenzia max", + "web_components_hosting_domain_offers_sites": "{{value1}} Siti", + "web_components_hosting_domain_offers_disk": "{{value1}}", + "web_components_hosting_domain_offers_emailStorage": "{{value1}} email {{value2}}", + "web_components_hosting_domain_offers_cms": "CMS 1clic", + "web_components_hosting_domain_offers_nddFree": "{{value1}} ndd free", + "web_components_hosting_domain_offers_vcores": "{{value1}} vCore", + "web_components_hosting_domain_offers_ram": "{{value1}} di RAM", + "web_components_hosting_domain_offers_backupIncluded": "Backup inclusi", + "web_components_hosting_domain_offers_uptime": "Uptime {{value1}}", + "web_components_hosting_domain_offers_dbs": "{{value1}} db {{value2}}", + "web_components_hosting_domain_offers_webcloudDb": "WebCloud DB", + "web_components_hosting_domain_offers_cdn": "CDN", + "web_components_hosting_domain_offers_git": "GIT", + "web_components_hosting_domain_offers_userManagement": "Gestione utente" +} diff --git a/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_pl_PL.json b/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_pl_PL.json index 2eabffbe533b..a67915438cfd 100644 --- a/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_pl_PL.json +++ b/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_pl_PL.json @@ -30,5 +30,22 @@ "web_components_hosting_domain_offers_offer_badge_current": "Aktualna oferta", "web_components_hosting_domain_offers_offer_select_version_placeholder": "Wybierz wersję", "web_components_hosting_domain_offers_offer_select_version_performance": "{{coreNumber}} vCores, {{ramSize}} RAM", - "web_components_hosting_domain_offers_offer_price": "{{priceValue}} netto/m-c" -} \ No newline at end of file + "web_components_hosting_domain_offers_offer_price": "{{priceValue}} netto/m-c", + "web_components_hosting_domain_offers_offer_agency": "Agencja", + "web_components_hosting_domain_offers_offer_agency_plus": "Agencja plus", + "web_components_hosting_domain_offers_offer_agency_max": "Agencja max", + "web_components_hosting_domain_offers_sites": "{{value1}} Strony", + "web_components_hosting_domain_offers_disk": "{{value1}}", + "web_components_hosting_domain_offers_emailStorage": "{{value1}} maile {{value2}}", + "web_components_hosting_domain_offers_cms": "CMS 1klik", + "web_components_hosting_domain_offers_nddFree": "{{value1}} ndd free", + "web_components_hosting_domain_offers_vcores": "{{value1}} vCore", + "web_components_hosting_domain_offers_ram": "{{value1}} RAM", + "web_components_hosting_domain_offers_backupIncluded": "Backup wliczony", + "web_components_hosting_domain_offers_uptime": "Uptime {{value1}}", + "web_components_hosting_domain_offers_dbs": "{{value1}} db {{value2}}", + "web_components_hosting_domain_offers_webcloudDb": "WebCloud DB", + "web_components_hosting_domain_offers_cdn": "CDN", + "web_components_hosting_domain_offers_git": "GIT", + "web_components_hosting_domain_offers_userManagement": "Zarządzanie użytkownikami" +} diff --git a/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_pt_PT.json b/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_pt_PT.json index a6be859398c0..ae4adc9d0d9f 100644 --- a/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_pt_PT.json +++ b/packages/manager/apps/web/client/app/components/hosting-domain-offers/translations/Messages_pt_PT.json @@ -30,5 +30,22 @@ "web_components_hosting_domain_offers_offer_badge_current": "Oferta atual", "web_components_hosting_domain_offers_offer_select_version_placeholder": "Escolher uma versão", "web_components_hosting_domain_offers_offer_select_version_performance": "{{coreNumber}} vCores, {{ramSize}} RAM", - "web_components_hosting_domain_offers_offer_price": "{{priceValue}} /mês + IVA" -} \ No newline at end of file + "web_components_hosting_domain_offers_offer_price": "{{priceValue}} /mês + IVA", + "web_components_hosting_domain_offers_offer_agency": "Agência", + "web_components_hosting_domain_offers_offer_agency_plus": "Agência mais", + "web_components_hosting_domain_offers_offer_agency_max": "Agência máxima", + "web_components_hosting_domain_offers_sites": "{{value1}} Sites", + "web_components_hosting_domain_offers_disk": "{{value1}}", + "web_components_hosting_domain_offers_emailStorage": "{{value1}} e-mails {{value2}}", + "web_components_hosting_domain_offers_cms": "CMS 1clic", + "web_components_hosting_domain_offers_nddFree": "{{value1}} ndd grátis", + "web_components_hosting_domain_offers_vcores": "{{value1}} vCore", + "web_components_hosting_domain_offers_ram": "{{value1}} de RAM", + "web_components_hosting_domain_offers_backupIncluded": "Backup incluído", + "web_components_hosting_domain_offers_uptime": "Uptime {{value1}}", + "web_components_hosting_domain_offers_dbs": "{{value1}} db {{value2}}", + "web_components_hosting_domain_offers_webcloudDb": "WebCloud DB", + "web_components_hosting_domain_offers_cdn": "CDN", + "web_components_hosting_domain_offers_git": "GIT", + "web_components_hosting_domain_offers_userManagement": "Gestão de utilizador" +} diff --git a/packages/manager/apps/web/client/app/hosting/cdn/order/hosting-cdn-order.routing.js b/packages/manager/apps/web/client/app/hosting/cdn/order/hosting-cdn-order.routing.js index d3e958e2992d..d93c8cb4bc53 100644 --- a/packages/manager/apps/web/client/app/hosting/cdn/order/hosting-cdn-order.routing.js +++ b/packages/manager/apps/web/client/app/hosting/cdn/order/hosting-cdn-order.routing.js @@ -165,30 +165,50 @@ export default /* @ngInject */ ($stateProvider) => { workflowOptions: /* @ngInject */ ( catalog, cdnProperties, + serviceInfo, serviceName, trackClick, - ) => ({ - catalog, - catalogItemTypeName: workflowConstants.CATALOG_ITEM_TYPE_NAMES.ADDON, - onPricingSubmit: (pricing) => { - trackClick({ - ...ORDER_CDN_TRACKING.PRICING.NEXT, - name: ORDER_CDN_TRACKING.PRICING.NEXT.name.replace( - /{{pricing}}/g, - `${pricing.interval}M`, - ), - }); - }, - onValidateSubmit() { - const newPlanCode = this.getPlanCode(); - - trackClick('web::hosting::cdn::order::confirm'); - trackClick(`web_hosting_cdn_order::order::${newPlanCode}`); - }, - productName: HOSTING_PRODUCT_NAME, - serviceNameToAddProduct: serviceName, - expressOrder: true, - }), + ) => { + const renewPeriod = serviceInfo?.renew?.period; + const filteredCatalog = + renewPeriod != null + ? { + ...catalog, + addons: (catalog.addons || []).map((addon) => ({ + ...addon, + pricings: (addon.pricings || []).filter( + (p) => + !(p.capacities || []).includes( + pricingConstants.PRICING_CAPACITIES.RENEW, + ) || p.interval === renewPeriod, + ), + })), + } + : catalog; + + return { + catalog: filteredCatalog, + catalogItemTypeName: workflowConstants.CATALOG_ITEM_TYPE_NAMES.ADDON, + onPricingSubmit: (pricing) => { + trackClick({ + ...ORDER_CDN_TRACKING.PRICING.NEXT, + name: ORDER_CDN_TRACKING.PRICING.NEXT.name.replace( + /{{pricing}}/g, + `${pricing.interval}M`, + ), + }); + }, + onValidateSubmit() { + const newPlanCode = this.getPlanCode(); + + trackClick('web::hosting::cdn::order::confirm'); + trackClick(`web_hosting_cdn_order::order::${newPlanCode}`); + }, + productName: HOSTING_PRODUCT_NAME, + serviceNameToAddProduct: serviceName, + expressOrder: true, + }; + }, trackClick: /* @ngInject */ (atInternet) => (hit) => { atInternet.trackClick({ ...hit, diff --git a/packages/manager/apps/web/client/app/hosting/dashboard/hosting.controller.js b/packages/manager/apps/web/client/app/hosting/dashboard/hosting.controller.js index ed5b0909d9a9..b86099c3b41b 100644 --- a/packages/manager/apps/web/client/app/hosting/dashboard/hosting.controller.js +++ b/packages/manager/apps/web/client/app/hosting/dashboard/hosting.controller.js @@ -71,6 +71,7 @@ export default class { user, userStatisticsLink, userLogsLink, + isChangeOfferFeatureAvailable, isWebsiteFeatureAvailable, isOslToLdpFeatureAvailable, HOSTING_STATUS, @@ -140,6 +141,7 @@ export default class { this.user = user; this.userStatisticsLink = userStatisticsLink; this.userLogsLink = userLogsLink; + this.isChangeOfferFeatureAvailable = isChangeOfferFeatureAvailable; this.isOslToLdpFeatureAvailable = isOslToLdpFeatureAvailable; this.DOMAIN_ORDER_URL = DOMAIN_ORDER_URL; this.HOSTING_ORDER_URL = HOSTING_ORDER_URL; diff --git a/packages/manager/apps/web/client/app/hosting/dashboard/hosting.html b/packages/manager/apps/web/client/app/hosting/dashboard/hosting.html index a63d71d8a18f..ffca1a956459 100644 --- a/packages/manager/apps/web/client/app/hosting/dashboard/hosting.html +++ b/packages/manager/apps/web/client/app/hosting/dashboard/hosting.html @@ -180,6 +180,20 @@

data-ovh-alert-hide-remove-button class="mt-4" > + + + + + { configurationSelected: true, }); }, + isChangeOfferFeatureAvailable: /* @ngInject */ (ovhFeatureFlipping) => + ovhFeatureFlipping + .checkFeatureAvailability('web-hosting:change-offer') + .then((featureAvailability) => + featureAvailability.isFeatureAvailable('web-hosting:change-offer'), + ) + .catch(() => false), isLocalSeoAvailable: /* @ngInject */ (availableOptions) => availableOptions.find(({ family }) => family === LOCAL_SEO_FAMILY), diff --git a/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_de_DE.json b/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_de_DE.json index 724cdc52d38b..5cb99bd6e47d 100644 --- a/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_de_DE.json +++ b/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_de_DE.json @@ -1,4 +1,6 @@ { + "hosting_change_offer_banner": "Unsere Webhosting-Angebote entwickeln sich ab dem 1. Juni 2026 weiter. Entdecken Sie die Verbesserungen und Neuheiten, die enthalten sind.", + "hosting_change_offer_banner_link": "Mehr erfahren", "hosting_change_offer_for_service": "Der Dienst ist für dieses Angebot nicht verfügbar.", "hosting_change_offer_for_service_offer": "Dieser Dienst ist für das {{offer}} Angebot nicht verfügbar.", "hosting_common_password_conditions": "Bitte beachten Sie, dass das Passwort nach folgenden Regeln vergeben werden muss:
- mindestens {{t0}} Zeichen
- höchstens {{t1}} Zeichen
- mindestens ein Großbuchstabe
- mindestens ein Kleinbuchstabe
- mindestens eine Zahl
- ausschließlich Zahlen und Buchstaben", @@ -1127,6 +1129,16 @@ "hosting_order_upgrade_start_time_summary_today": "Update geplant für heute um {{time}}.", "hosting_order_upgrade_start_time_summary_tomorrow": "Update geplant für morgen um {{time}}.", "hosting_order_upgrade_no_contract": "Keine neuen Verträge zur Validierung vorhanden", + "hosting_order_upgrade_summary_empty": "Ihr Warenkorb ist leer", + "hosting_order_upgrade_summary_product": "Webhosting", + "hosting_order_upgrade_summary_product_lower": "Webhosting", + "hosting_order_upgrade_summary_duration": "Dauer", + "hosting_order_upgrade_summary_duration_value": "12 Monate", + "hosting_order_upgrade_summary_options": "Optionen", + "hosting_order_upgrade_summary_included": "Inklusive", + "hosting_order_upgrade_summary_total": "Summe", + "hosting_order_upgrade_summary_vat_period": "HT/12 Monate", + "hosting_order_upgrade_summary_cta": "Bestellung fortsetzen", "hosting_migrate_my_ovh_org_success": "Die Migration Ihrer ovh.org-Domain wurde registriert. Sobald sie abgeschlossen ist, erhalten Sie eine E-Mail.", "hosting_migrate_my_ovh_org_error": "Bei der Migration Ihrer OVH Domain ist ein Fehler aufgetreten.", "hosting_tab_DATABASES_configuration_order_title_button_public": "Eine Datenbank bestellen", diff --git a/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_en_GB.json b/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_en_GB.json index d21582dc7641..b414e351798e 100644 --- a/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_en_GB.json +++ b/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_en_GB.json @@ -1,4 +1,6 @@ { + "hosting_change_offer_banner": "Our web hosting offers will evolve from 1st June 2026. Discover the improvements and new features included.", + "hosting_change_offer_banner_link": "Find out more", "hosting_change_offer_for_service": "This service is not available for this solution.", "hosting_change_offer_for_service_offer": "This service is not accessible for the {{offer}} solution.", "hosting_common_password_conditions": "Please note that the password must meet the following criteria:
- Minimum {{t0}} characters
- Maximum {{t1}} characters
- At least one capital letter
- At least one lower-case letter
- At least one number
- Must only contain letters and numbers", @@ -1127,6 +1129,16 @@ "hosting_order_upgrade_start_time_summary_today": "Update scheduled at {{time}} today.", "hosting_order_upgrade_start_time_summary_tomorrow": "Update scheduled at {{time}} tomorrow.", "hosting_order_upgrade_no_contract": "No new contracts to validate", + "hosting_order_upgrade_summary_empty": "Your basket is empty.", + "hosting_order_upgrade_summary_product": "Web hosting", + "hosting_order_upgrade_summary_product_lower": "web hosting plan", + "hosting_order_upgrade_summary_duration": "Duration", + "hosting_order_upgrade_summary_duration_value": "12 months", + "hosting_order_upgrade_summary_options": "Options", + "hosting_order_upgrade_summary_included": "Included", + "hosting_order_upgrade_summary_total": "Total", + "hosting_order_upgrade_summary_vat_period": "Excl. VAT/12 months", + "hosting_order_upgrade_summary_cta": "Continue the order.", "hosting_migrate_my_ovh_org_success": "Your ovh.org domain migration has been processed. You will receive an email when it is complete.", "hosting_migrate_my_ovh_org_error": "An error has occurred migrating your ovh.org domain. ", "hosting_tab_DATABASES_configuration_order_title_button_public": "Order a database", diff --git a/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_es_ES.json b/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_es_ES.json index d22a89ec7f52..6b7f183a787f 100644 --- a/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_es_ES.json +++ b/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_es_ES.json @@ -1,4 +1,6 @@ { + "hosting_change_offer_banner": "Nuestras ofertas de alojamiento web evolucionarán a partir del 1 de junio de 2026. Descubrid las mejoras y las novedades incluidas.", + "hosting_change_offer_banner_link": "Más información", "hosting_change_offer_for_service": "El servicio no está disponible para este producto.", "hosting_change_offer_for_service_offer": "Este servicio no está disponible para la solución {{offer}}.", "hosting_common_password_conditions": "Atención: La contraseña debe cumplir los siguientes criterios:
- mínimo {{t0}} caracteres
- máximo {{t1}} caracteres
- al menos una letra mayúscula
- al menos una letra minúscula
- al menos una cifra
- debe estar compuesto únicamente por cifras y letras", @@ -1117,6 +1119,16 @@ "hosting_order_upgrade_start_time_summary_today": "Actualización prevista a las {{time}} hoy.", "hosting_order_upgrade_start_time_summary_tomorrow": "Actualización prevista a las {{time}} mañana.", "hosting_order_upgrade_no_contract": "No hay ningún contrato pendiente de validación.", + "hosting_order_upgrade_summary_empty": "Vuestro carrito está vacío.", + "hosting_order_upgrade_summary_product": "Web hosting", + "hosting_order_upgrade_summary_product_lower": "alojamiento web", + "hosting_order_upgrade_summary_duration": "Duración", + "hosting_order_upgrade_summary_duration_value": "12 meses", + "hosting_order_upgrade_summary_options": "Opciones", + "hosting_order_upgrade_summary_included": "Incluido", + "hosting_order_upgrade_summary_total": "Total", + "hosting_order_upgrade_summary_vat_period": "Sin IVA/12 meses", + "hosting_order_upgrade_summary_cta": "Continuar con el pedido", "hosting_migrate_my_ovh_org_success": "Hemos recibido la solicitud de migración de su dominio .ovh.org. Recibirá una notificación por correo electrónico cuando haya finalizado.", "hosting_migrate_my_ovh_org_error": "Se ha producido un error al migrar su dominio .ovh.org.", "hosting_tab_DATABASES_configuration_order_title_button_public": "Contratar una base de datos", diff --git a/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_fr_CA.json b/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_fr_CA.json index cc8c5a68a33d..f29e8f858345 100644 --- a/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_fr_CA.json +++ b/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_fr_CA.json @@ -1,4 +1,6 @@ { + "hosting_change_offer_banner": "Nos offres d'hébergement web évoluent à partir du 1er juin 2026. Découvrez les améliorations et les nouveautés incluses.", + "hosting_change_offer_banner_link": "En savoir plus", "hosting_change_offer_for_service": "Ce service n'est pas accessible pour cette offre.", "hosting_change_offer_for_service_offer": "Ce service n'est pas accessible pour l'offre {{offer}}.", "hosting_common_password_conditions": "Attention, le mot de passe doit respecter les conditions suivantes :
- Minimum {{t0}} caractères
- Maximum {{t1}} caractères
- Au moins une lettre majuscule
- Au moins une lettre minuscule
- Au moins un chiffre
- Doit être composé uniquement de chiffres et de lettres", @@ -1146,6 +1148,16 @@ "hosting_order_upgrade_start_time_summary_today": "Mise à jour prévue à {{time}} aujourd'hui.", "hosting_order_upgrade_start_time_summary_tomorrow": "Mise à jour prévue à {{time}} demain.", "hosting_order_upgrade_no_contract": "Pas de nouveaux contrats à valider", + "hosting_order_upgrade_summary_empty": "Votre panier est vide", + "hosting_order_upgrade_summary_product": "Hébergement Web", + "hosting_order_upgrade_summary_product_lower": "hébergement web", + "hosting_order_upgrade_summary_duration": "Durée", + "hosting_order_upgrade_summary_duration_value": "12 mois", + "hosting_order_upgrade_summary_options": "Options", + "hosting_order_upgrade_summary_included": "Inclus", + "hosting_order_upgrade_summary_total": "Total", + "hosting_order_upgrade_summary_vat_period": "HT/12 mois", + "hosting_order_upgrade_summary_cta": "Continuer la commande", "hosting_migrate_my_ovh_org_success": "La migration de votre domaine ovh.org a bien été prise en compte. Vous recevrez un e-mail lorsqu'elle sera terminée.", "hosting_migrate_my_ovh_org_error": "Une erreur est survenue lors de la migration de votre domaine ovh.org.", "hosting_tab_DATABASES_configuration_order_title_button_public": "Commander une base de données", diff --git a/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_fr_FR.json b/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_fr_FR.json index cc8c5a68a33d..f29e8f858345 100644 --- a/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_fr_FR.json +++ b/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_fr_FR.json @@ -1,4 +1,6 @@ { + "hosting_change_offer_banner": "Nos offres d'hébergement web évoluent à partir du 1er juin 2026. Découvrez les améliorations et les nouveautés incluses.", + "hosting_change_offer_banner_link": "En savoir plus", "hosting_change_offer_for_service": "Ce service n'est pas accessible pour cette offre.", "hosting_change_offer_for_service_offer": "Ce service n'est pas accessible pour l'offre {{offer}}.", "hosting_common_password_conditions": "Attention, le mot de passe doit respecter les conditions suivantes :
- Minimum {{t0}} caractères
- Maximum {{t1}} caractères
- Au moins une lettre majuscule
- Au moins une lettre minuscule
- Au moins un chiffre
- Doit être composé uniquement de chiffres et de lettres", @@ -1146,6 +1148,16 @@ "hosting_order_upgrade_start_time_summary_today": "Mise à jour prévue à {{time}} aujourd'hui.", "hosting_order_upgrade_start_time_summary_tomorrow": "Mise à jour prévue à {{time}} demain.", "hosting_order_upgrade_no_contract": "Pas de nouveaux contrats à valider", + "hosting_order_upgrade_summary_empty": "Votre panier est vide", + "hosting_order_upgrade_summary_product": "Hébergement Web", + "hosting_order_upgrade_summary_product_lower": "hébergement web", + "hosting_order_upgrade_summary_duration": "Durée", + "hosting_order_upgrade_summary_duration_value": "12 mois", + "hosting_order_upgrade_summary_options": "Options", + "hosting_order_upgrade_summary_included": "Inclus", + "hosting_order_upgrade_summary_total": "Total", + "hosting_order_upgrade_summary_vat_period": "HT/12 mois", + "hosting_order_upgrade_summary_cta": "Continuer la commande", "hosting_migrate_my_ovh_org_success": "La migration de votre domaine ovh.org a bien été prise en compte. Vous recevrez un e-mail lorsqu'elle sera terminée.", "hosting_migrate_my_ovh_org_error": "Une erreur est survenue lors de la migration de votre domaine ovh.org.", "hosting_tab_DATABASES_configuration_order_title_button_public": "Commander une base de données", diff --git a/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_it_IT.json b/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_it_IT.json index 834ecc336f26..fc88307f8019 100644 --- a/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_it_IT.json +++ b/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_it_IT.json @@ -1,4 +1,6 @@ { + "hosting_change_offer_banner": "Le nostre offerte di hosting web evolveranno a partire dal 1° giugno 2026. Scoprite i miglioramenti e le novità incluse.", + "hosting_change_offer_banner_link": "Scopri di più", "hosting_change_offer_for_service": "Questo servizio non è disponibile per questa offerta. ", "hosting_change_offer_for_service_offer": "Questo servizio non è disponibile per la soluzione {{offer}}.", "hosting_common_password_conditions": "Attenzione, la password deve rispettare queste condizioni:
- minimo {{t0}} caratteri
- massimo {{t1}} caratteri
- Almeno una lettera maiuscola
- Almeno una lettera minuscola
- Almeno una cifra
- Deve essere composto esclusivamente da cifre e lettere", @@ -1127,6 +1129,16 @@ "hosting_order_upgrade_start_time_summary_today": "Aggiornamento pianificato oggi alle {{time}}.", "hosting_order_upgrade_start_time_summary_tomorrow": "Aggiornamento pianificato domani alle {{time}}.", "hosting_order_upgrade_no_contract": "Nessun nuovo contratto da convalidare", + "hosting_order_upgrade_summary_empty": "Il vostro carrello è vuoto", + "hosting_order_upgrade_summary_product": "Hosting web", + "hosting_order_upgrade_summary_product_lower": "l’hosting Web", + "hosting_order_upgrade_summary_duration": "Durata", + "hosting_order_upgrade_summary_duration_value": "12 mesi", + "hosting_order_upgrade_summary_options": "Opzioni", + "hosting_order_upgrade_summary_included": "Incluso", + "hosting_order_upgrade_summary_total": "Totale", + "hosting_order_upgrade_summary_vat_period": "HT/12 mesi", + "hosting_order_upgrade_summary_cta": "Continua l'ordine", "hosting_migrate_my_ovh_org_success": "La migrazione del tuo dominio ovh.org è stata presa in carico. Una volta completata, riceverai un'email.", "hosting_migrate_my_ovh_org_error": "Si è verificato un errore durante la migrazione del tuo dominio ovh.org.", "hosting_tab_DATABASES_configuration_order_title_button_public": "Ordinare un database", diff --git a/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_pl_PL.json b/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_pl_PL.json index 9758ea97dfff..3ea881c2d934 100644 --- a/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_pl_PL.json +++ b/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_pl_PL.json @@ -1,4 +1,6 @@ { + "hosting_change_offer_banner": "Nasze oferty hostingu internetowego będą się rozwijać od 1 czerwca 2026 roku. Odkryj ulepszenia i nowości, które są w zestawie.", + "hosting_change_offer_banner_link": "Sprawdź", "hosting_change_offer_for_service": "Ta usługa nie jest dostępna dla tej oferty.", "hosting_change_offer_for_service_offer": "Ta usługa nie jest dostępna w ramach oferty {{offer}}.", "hosting_common_password_conditions": "Uwaga: hasło musi spełniać następujące warunki:
- Minimalna liczba znaków: {{t0}}
- Maksymalna liczba znaków: {{t1}}
- Przynajmniej jedna wielka litera
- Przynajmniej jedna mała litera
- Przynajmniej jedna cyfra
- Może zawierać wyłącznie cyfry i litery", @@ -1127,6 +1129,16 @@ "hosting_order_upgrade_start_time_summary_today": "Aktualizacja przewidziana dzisiaj o {{time}}.", "hosting_order_upgrade_start_time_summary_tomorrow": "Aktualizacja przewidziana jutro o {{time}}.", "hosting_order_upgrade_no_contract": "Brak nowych regulaminów do zatwierdzenia", + "hosting_order_upgrade_summary_empty": "Twój koszyk jest pusty", + "hosting_order_upgrade_summary_product": "Hosting", + "hosting_order_upgrade_summary_product_lower": "hosting internetowy", + "hosting_order_upgrade_summary_duration": "Czas trwania", + "hosting_order_upgrade_summary_duration_value": "12 miesięcy", + "hosting_order_upgrade_summary_options": "Opcje", + "hosting_order_upgrade_summary_included": "W cenie", + "hosting_order_upgrade_summary_total": "Razem", + "hosting_order_upgrade_summary_vat_period": "HT/12 miesięcy", + "hosting_order_upgrade_summary_cta": "Kontynuuj zamówienie", "hosting_migrate_my_ovh_org_success": "Migracja Twojej domeny ovh.org została zarejestrowana. Po zakończeniu operacji otrzymasz e-mail.", "hosting_migrate_my_ovh_org_error": "Wystąpił błąd podczas migracji Twojego konta ovh.org.", "hosting_tab_DATABASES_configuration_order_title_button_public": "Zamów bazę danych", diff --git a/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_pt_PT.json b/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_pt_PT.json index f9da5cda617e..f5368b47c95a 100644 --- a/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_pt_PT.json +++ b/packages/manager/apps/web/client/app/hosting/dashboard/translations/Messages_pt_PT.json @@ -1,4 +1,6 @@ { + "hosting_change_offer_banner": "As nossas ofertas de alojamento web evoluem a partir de 1 de junho de 2026. Descubra as melhorias e as novidades incluídas.", + "hosting_change_offer_banner_link": "Saber mais", "hosting_change_offer_for_service": "Este serviço não está disponível para esta oferta.", "hosting_change_offer_for_service_offer": "Este serviço não está disponível para a oferta {{offer}}.", "hosting_common_password_conditions": "Tenha em conta que a palavra-passe deve respeitar as seguintes condições:
- Mínimo de {{t0}} caracteres
- Máximo de {{t1}} caracteres
- Pelo menos uma letra maiúscula
- Pelo menos uma letra minúscula
- Pelo menos um número
- Deve ser composto unicamente por números e letras.", @@ -1117,6 +1119,16 @@ "hosting_order_upgrade_start_time_summary_today": "Atualização prevista para hoje, às {{time}}.", "hosting_order_upgrade_start_time_summary_tomorrow": "Atualização prevista para amanhã, às {{time}}.", "hosting_order_upgrade_no_contract": "Sem novos contratos por validar", + "hosting_order_upgrade_summary_empty": "O seu carrinho está vazio", + "hosting_order_upgrade_summary_product": "Alojamento web", + "hosting_order_upgrade_summary_product_lower": "alojamento web", + "hosting_order_upgrade_summary_duration": "Duração", + "hosting_order_upgrade_summary_duration_value": "12 meses", + "hosting_order_upgrade_summary_options": "Opções", + "hosting_order_upgrade_summary_included": "Incluído", + "hosting_order_upgrade_summary_total": "Total", + "hosting_order_upgrade_summary_vat_period": "HT/12 meses", + "hosting_order_upgrade_summary_cta": "Continuar a encomenda", "hosting_migrate_my_ovh_org_success": "A migração do seu domínio ovh.org foi registada com êxito. Receberá um e-mail assim que a operação estiver concluída.", "hosting_migrate_my_ovh_org_error": "Ocorreu um erro aquando da migração do seu domínio ovh.org.", "hosting_tab_DATABASES_configuration_order_title_button_public": "Encomendar uma base de dados", diff --git a/packages/manager/apps/web/client/app/hosting/database/hosting-database.controller.js b/packages/manager/apps/web/client/app/hosting/database/hosting-database.controller.js index 827ab2eadc86..7e4faa636be3 100644 --- a/packages/manager/apps/web/client/app/hosting/database/hosting-database.controller.js +++ b/packages/manager/apps/web/client/app/hosting/database/hosting-database.controller.js @@ -126,43 +126,46 @@ angular.module('App').controller( this.loading.orderCapabilities = true; }); } - -loadExtraSqlPerso() { - return this.hostingDatabaseService - .getExtraSqlPerso(this.hosting.serviceName) - .then((result) => { - const sqlPerso = result?.find((item) => item?.name === SQL_PERSO); - const sqlPersoDelta = - sqlPerso?.database && sqlPerso?.usage - ? sqlPerso?.database - sqlPerso?.usage?.length - : 0; - this.emptySqlPerso = sqlPersoDelta > 0 ? [{ - id: SQL_PERSO, - name: "sqlPerso", - availableSlots: sqlPersoDelta, - isIncluded: true, - }] : []; - - this.extraSqlPerso = result?.filter( - (item) => item?.name?.startsWith(EXTRA_SQL_PERSO_PREFIX), - ); - - this.emptyExtraSqlPerso = this.extraSqlPerso - ?.map((item) => { - const delta = item?.database - (item?.usage?.length || 0); - return { - id: item.id, - name: item.serviceName, - availableSlots: delta, - isIncluded: false, - usage: item?.usage, - }; - }) - .filter((item) => item.availableSlots > 0); - }); -} + loadExtraSqlPerso() { + return this.hostingDatabaseService + .getExtraSqlPerso(this.hosting.serviceName) + .then((result) => { + const sqlPerso = result?.find((item) => item?.name === SQL_PERSO); + const sqlPersoDelta = + sqlPerso?.database && sqlPerso?.usage + ? sqlPerso?.database - sqlPerso?.usage?.length + : 0; + this.emptySqlPerso = + sqlPersoDelta > 0 + ? [ + { + id: SQL_PERSO, + name: 'sqlPerso', + availableSlots: sqlPersoDelta, + isIncluded: true, + }, + ] + : []; + + this.extraSqlPerso = result?.filter((item) => + item?.name?.startsWith(EXTRA_SQL_PERSO_PREFIX), + ); + this.emptyExtraSqlPerso = this.extraSqlPerso + ?.map((item) => { + const delta = item?.database - (item?.usage?.length || 0); + return { + id: item.id, + name: item.serviceName, + availableSlots: delta, + isIncluded: false, + usage: item?.usage, + }; + }) + .filter((item) => item.availableSlots > 0); + }); + } static formatVersion(version) { return (version || '').replace(/_/gi, '.'); @@ -350,10 +353,14 @@ loadExtraSqlPerso() { } onTerminateDatabaseSqlPerso(element) { - return this.coreURLBuilder.buildURL('dedicated', `#/billing/autorenew/delete?serviceId=${element?.name}`, { - selectedType: 'HOSTING_WEB_EXTRA_SQL_PERSO', - }); -} + return this.coreURLBuilder.buildURL( + 'dedicated', + `#/billing/autorenew/delete?serviceId=${element?.name}`, + { + selectedType: 'HOSTING_WEB_EXTRA_SQL_PERSO', + }, + ); + } onOrderDatabaseClick() { this.trackClick(DATABASES_TRACKING.SELECT_LIST_ACTION_ORDER_DB); diff --git a/packages/manager/apps/web/client/app/hosting/database/order/public/hosting-database-order-public.component.js b/packages/manager/apps/web/client/app/hosting/database/order/public/hosting-database-order-public.component.js index 5dbb30b4141f..572f861f981b 100644 --- a/packages/manager/apps/web/client/app/hosting/database/order/public/hosting-database-order-public.component.js +++ b/packages/manager/apps/web/client/app/hosting/database/order/public/hosting-database-order-public.component.js @@ -7,6 +7,7 @@ export default { template, bindings: { serviceName: '<', + serviceInfo: '<', hosting: '<', user: '<', cart: '<', diff --git a/packages/manager/apps/web/client/app/hosting/database/order/public/hosting-database-order-public.controller.js b/packages/manager/apps/web/client/app/hosting/database/order/public/hosting-database-order-public.controller.js index 207a81430de2..c7938868b8ea 100644 --- a/packages/manager/apps/web/client/app/hosting/database/order/public/hosting-database-order-public.controller.js +++ b/packages/manager/apps/web/client/app/hosting/database/order/public/hosting-database-order-public.controller.js @@ -19,6 +19,22 @@ export default class HostingDatabaseOrderPublicCtrl { } $onInit() { + const renewPeriod = this.serviceInfo?.renew?.period; + if (renewPeriod != null && this.catalog) { + this.catalog = { + ...this.catalog, + addons: (this.catalog.addons || []).map((addon) => ({ + ...addon, + pricings: (addon.pricings || []).filter( + (p) => + !(p.capacities || []).includes( + pricingConstants.PRICING_CAPACITIES.RENEW, + ) || p.interval === renewPeriod, + ), + })), + }; + } + const { catalog, catalogItemTypeName } = this.getRightCatalogConfig(true); this.productOffers = { pricingType: pricingConstants.PRICING_CAPACITIES.RENEW, diff --git a/packages/manager/apps/web/client/app/hosting/database/order/public/hosting-database-order-public.routing.js b/packages/manager/apps/web/client/app/hosting/database/order/public/hosting-database-order-public.routing.js index 914fc03d7de1..9dcb49b335b3 100644 --- a/packages/manager/apps/web/client/app/hosting/database/order/public/hosting-database-order-public.routing.js +++ b/packages/manager/apps/web/client/app/hosting/database/order/public/hosting-database-order-public.routing.js @@ -14,6 +14,8 @@ export default /* @ngInject */ ($stateProvider) => { goBack: /* @ngInject */ (goToDatabase) => goToDatabase, hosting: /* @ngInject */ (Hosting, serviceName) => Hosting.getSelected(serviceName, true), + serviceInfo: /* @ngInject */ (Hosting, serviceName) => + Hosting.getServiceInfos(serviceName), onError: /* @ngInject */ ($translate, goBack) => (error) => goBack( $translate.instant('ovhManagerHostingDatabaseOrderPublic_error', { diff --git a/packages/manager/apps/web/client/app/hosting/database/private-sql-activation/private-sql-activation.component.js b/packages/manager/apps/web/client/app/hosting/database/private-sql-activation/private-sql-activation.component.js index 9dd9b53ab79c..1e4c584b7bd2 100644 --- a/packages/manager/apps/web/client/app/hosting/database/private-sql-activation/private-sql-activation.component.js +++ b/packages/manager/apps/web/client/app/hosting/database/private-sql-activation/private-sql-activation.component.js @@ -10,6 +10,7 @@ export default { dbCategories: '<', privateSqlCatalog: '<', hosting: '<', + serviceInfo: '<', onError: '<', onSuccess: '<', }, diff --git a/packages/manager/apps/web/client/app/hosting/database/private-sql-activation/private-sql-activation.controller.js b/packages/manager/apps/web/client/app/hosting/database/private-sql-activation/private-sql-activation.controller.js index 0410c16dc680..f4ff9dd70907 100644 --- a/packages/manager/apps/web/client/app/hosting/database/private-sql-activation/private-sql-activation.controller.js +++ b/packages/manager/apps/web/client/app/hosting/database/private-sql-activation/private-sql-activation.controller.js @@ -25,6 +25,30 @@ export default class PrivateSqlActivationController { $onInit() { this.preselectDbCategory = PRESELECTED_DB_CATEGORY; + + const renewPeriod = this.serviceInfo?.renew?.period; + if (this.privateSqlCatalog) { + this.privateSqlCatalog = { + ...this.privateSqlCatalog, + addons: (this.privateSqlCatalog.addons || []).map((addon) => ({ + ...addon, + pricings: (addon.pricings || []) + .filter( + (p) => + renewPeriod == null || + !(p.capacities || []).includes( + pricingConstants.PRICING_CAPACITIES.RENEW, + ) || + p.interval === renewPeriod, + ) + .map((p) => ({ + ...p, + description: `${p.description}-${p.mode}-${p.interval}${p.intervalUnit}`, + })), + })), + }; + } + const { catalog, catalogItemTypeName } = this.getRightCatalogConfig(true); this.productOffers = { pricingType: pricingConstants.PRICING_CAPACITIES.RENEW, diff --git a/packages/manager/apps/web/client/app/hosting/database/private-sql-activation/private-sql-activation.routing.js b/packages/manager/apps/web/client/app/hosting/database/private-sql-activation/private-sql-activation.routing.js index cfeb05b7bd44..481ced2fe594 100644 --- a/packages/manager/apps/web/client/app/hosting/database/private-sql-activation/private-sql-activation.routing.js +++ b/packages/manager/apps/web/client/app/hosting/database/private-sql-activation/private-sql-activation.routing.js @@ -23,6 +23,8 @@ export default /* @ngInject */ ($stateProvider) => { me: /* @ngInject */ (user) => user, hosting: /* @ngInject */ ($transition$) => $transition$.params().productId, + serviceInfo: /* @ngInject */ (Hosting, hosting) => + Hosting.getServiceInfos(hosting), privateSqlCatalog: /* @ngInject */ (HostingDatabasePrivateSql, me) => HostingDatabasePrivateSql.getPrivateSqlCatalogForHosting( me.ovhSubsidiary, diff --git a/packages/manager/apps/web/client/app/hosting/general-informations/GENERAL_INFORMATIONS.controller.js b/packages/manager/apps/web/client/app/hosting/general-informations/GENERAL_INFORMATIONS.controller.js index 7c30fb987797..a84510fd7f5a 100644 --- a/packages/manager/apps/web/client/app/hosting/general-informations/GENERAL_INFORMATIONS.controller.js +++ b/packages/manager/apps/web/client/app/hosting/general-informations/GENERAL_INFORMATIONS.controller.js @@ -8,7 +8,7 @@ import { LANGUAGES_VERSIONS_GUIDE_URL, } from './general-informations.constants'; import { HOSTING_CDN_ORDER_CDN_VERSION_V1 } from '../cdn/order/hosting-cdn-order.constant'; -import { NEW_OFFERS_NAME } from '../hosting.constants'; +import { OFFERS_NAME, NEW_OFFERS_NAME } from '../hosting.constants'; export default class HostingGeneralInformationsCtrl { /* @ngInject */ @@ -33,6 +33,7 @@ export default class HostingGeneralInformationsCtrl { HostingLocalSeo, HostingRuntimes, hostingSSLCertificate, + isChangeOfferFeatureAvailable, OvhApiScreenshot, user, ) { @@ -56,6 +57,7 @@ export default class HostingGeneralInformationsCtrl { this.HostingLocalSeo = HostingLocalSeo; this.HostingRuntimes = HostingRuntimes; this.hostingSSLCertificate = hostingSSLCertificate; + this.isChangeOfferFeatureAvailable = isChangeOfferFeatureAvailable; this.OvhApiScreenshot = OvhApiScreenshot; this.user = user; this.Domain = Domain; @@ -375,6 +377,12 @@ export default class HostingGeneralInformationsCtrl { } getOfferName(offer) { + if (this.isChangeOfferFeatureAvailable) { + const offerName = OFFERS_NAME[offer]; + return this.$translate.instant( + offerName || `hosting_dashboard_service_offer_${offer}`, + ); + } const offerPrefix = NEW_OFFERS_NAME[offer]; const translateKey = offerPrefix ? `hostings_offer_${offerPrefix}` diff --git a/packages/manager/apps/web/client/app/hosting/general-informations/general-informations.routing.js b/packages/manager/apps/web/client/app/hosting/general-informations/general-informations.routing.js index 68e24b71b2bb..efdde47ad763 100644 --- a/packages/manager/apps/web/client/app/hosting/general-informations/general-informations.routing.js +++ b/packages/manager/apps/web/client/app/hosting/general-informations/general-informations.routing.js @@ -7,6 +7,14 @@ export default /* @ngInject */ ($stateProvider) => { controllerAs: '$ctrl', template, resolve: { + isChangeOfferFeatureAvailable: /* @ngInject */ (ovhFeatureFlipping) => + ovhFeatureFlipping + .checkFeatureAvailability('web-hosting:change-offer') + .then((featureAvailability) => { + return featureAvailability.isFeatureAvailable( + 'web-hosting:change-offer', + ); + }), breadcrumb: () => null, }, }); diff --git a/packages/manager/apps/web/client/app/hosting/hosting.constants.js b/packages/manager/apps/web/client/app/hosting/hosting.constants.js index 33a4ebc25524..b81eea96ed10 100644 --- a/packages/manager/apps/web/client/app/hosting/hosting.constants.js +++ b/packages/manager/apps/web/client/app/hosting/hosting.constants.js @@ -7,6 +7,18 @@ export const NEW_OFFERS_NAME = { PERFORMANCE_4: 'performance_4', }; +export const OFFERS_NAME = { + HOSTING_FREE_100_M: 'hosting-free-100M', + HOSTING_STARTER: 'hosting-starter', + HOSTING_PERSO: 'hosting-perso', + HOSTING_STARTUP: 'hosting-startup', + HOSTING_PRO: 'hosting-pro', + HOSTING_PERFORMANCE_1: 'hosting-performance-1', + HOSTING_AGENCY: 'hosting-agency', + HOSTING_AGENCY_PLUS: 'hosting-agency-plus', + HOSTING_AGENCY_MAX: 'hosting-agency-max', +}; + export const OFFERS_UNELIGIBLE_FOR_MODULE = [ 'START_10_M', 'HOSTING_FREE_100_M', diff --git a/packages/manager/apps/web/client/app/hosting/module/MODULE.html b/packages/manager/apps/web/client/app/hosting/module/MODULE.html index 5540aa0054f8..6d5520858aff 100644 --- a/packages/manager/apps/web/client/app/hosting/module/MODULE.html +++ b/packages/manager/apps/web/client/app/hosting/module/MODULE.html @@ -25,7 +25,7 @@

+
+ + + + + + Consultez la page de maintenance poursuivre la progression des travaux.", "hosting_guides_general_information": "Informations générales", "hosting_datagrid_description": "Créez votre projet web en quelques minutes. Publiez votre blog, votre site internet professionnel ou votre boutique en ligne avec nos hébergements évolutifs taillés pour tous vos projets.", diff --git a/packages/manager/apps/web/client/app/hosting/translations/Messages_fr_FR.json b/packages/manager/apps/web/client/app/hosting/translations/Messages_fr_FR.json index 76bb9fd98e20..720368cc16f2 100644 --- a/packages/manager/apps/web/client/app/hosting/translations/Messages_fr_FR.json +++ b/packages/manager/apps/web/client/app/hosting/translations/Messages_fr_FR.json @@ -11,6 +11,15 @@ "hostings_offer_performance_2": "Performance 2", "hostings_offer_performance_3": "Performance 3", "hostings_offer_performance_4": "Performance 4", + "hosting-free-100M": "Free hosting", + "hosting-starter": "STARTER", + "hosting-perso": "PERSO", + "hosting-startup": "STARTUP", + "hosting-pro": "PRO", + "hosting-performance-1": "PERFORMANCE", + "hosting-agency": "AGENCY", + "hosting-agency-plus": "AGENCY PLUS", + "hosting-agency-max": "AGENCY MAX", "hosting_offer_changing_datavis_tool": "L'outil de visualisation des statistiques de votre hébergement web évolue et est temporairement indisponible. Consultez la page de maintenance poursuivre la progression des travaux.", "hosting_guides_general_information": "Informations générales", "hosting_datagrid_description": "Créez votre projet web en quelques minutes. Publiez votre blog, votre site internet professionnel ou votre boutique en ligne avec nos hébergements évolutifs taillés pour tous vos projets.", diff --git a/packages/manager/apps/web/client/app/hosting/translations/Messages_it_IT.json b/packages/manager/apps/web/client/app/hosting/translations/Messages_it_IT.json index d7eecddfeccf..dbf8a2c410fd 100644 --- a/packages/manager/apps/web/client/app/hosting/translations/Messages_it_IT.json +++ b/packages/manager/apps/web/client/app/hosting/translations/Messages_it_IT.json @@ -19,5 +19,14 @@ "hosting_databgrid_column_state": "Stato", "hosting_databgrid_column_resource_type": "Tipo di risorsa", "hosting_databgrid_column_datacenter": "Localizzazione", - "hosting_databgrid_column_service_name": "Nome del servizio" + "hosting_databgrid_column_service_name": "Nome del servizio", + "hosting-free-100M": "Hosting gratuito", + "hosting-starter": "STARTER", + "hosting-perso": "PERSONALE", + "hosting-startup": "STARTUP", + "hosting-pro": "PRO", + "hosting-performance-1": "PERFORMANCE", + "hosting-agency": "AGENZIA", + "hosting-agency-plus": "AGENZIA PLUS", + "hosting-agency-max": "AGENZIA MAX" } diff --git a/packages/manager/apps/web/client/app/hosting/translations/Messages_pl_PL.json b/packages/manager/apps/web/client/app/hosting/translations/Messages_pl_PL.json index 1d518913f06e..cb06d1be3dc5 100644 --- a/packages/manager/apps/web/client/app/hosting/translations/Messages_pl_PL.json +++ b/packages/manager/apps/web/client/app/hosting/translations/Messages_pl_PL.json @@ -19,5 +19,14 @@ "hosting_databgrid_column_state": "Status", "hosting_databgrid_column_resource_type": "Rodzaj zasobów", "hosting_databgrid_column_datacenter": "Lokalizacja", - "hosting_databgrid_column_service_name": "Nazwa usługi" + "hosting_databgrid_column_service_name": "Nazwa usługi", + "hosting-free-100M": "Darmowe hosting", + "hosting-starter": "STARTER", + "hosting-perso": "PERSO", + "hosting-startup": "STARTUP", + "hosting-pro": "PRO", + "hosting-performance-1": "PERFORMANCE", + "hosting-agency": "AGENCJA", + "hosting-agency-plus": "AGENCJA PLUS", + "hosting-agency-max": "AGENCJA MAX" } diff --git a/packages/manager/apps/web/client/app/hosting/translations/Messages_pt_PT.json b/packages/manager/apps/web/client/app/hosting/translations/Messages_pt_PT.json index 8c17570b4128..1eae9fb1c1a9 100644 --- a/packages/manager/apps/web/client/app/hosting/translations/Messages_pt_PT.json +++ b/packages/manager/apps/web/client/app/hosting/translations/Messages_pt_PT.json @@ -19,5 +19,14 @@ "hosting_databgrid_column_state": "Estado", "hosting_databgrid_column_resource_type": "Tipo de recurso", "hosting_databgrid_column_datacenter": "Localização", - "hosting_databgrid_column_service_name": "Nome do serviço" + "hosting_databgrid_column_service_name": "Nome do serviço", + "hosting-free-100M": "Alojamento gratuito", + "hosting-starter": "STARTER", + "hosting-perso": "PERSO", + "hosting-startup": "STARTUP", + "hosting-pro": "PRO", + "hosting-performance-1": "PERFORMANCE", + "hosting-agency": "AGÊNCIA", + "hosting-agency-plus": "AGÊNCIA PLUS", + "hosting-agency-max": "AGÊNCIA MAX" } diff --git a/packages/manager/apps/web/client/app/private-database/order/clouddb/private-database-order-clouddb.service.js b/packages/manager/apps/web/client/app/private-database/order/clouddb/private-database-order-clouddb.service.js index d21788c123d3..a2cd08215d10 100644 --- a/packages/manager/apps/web/client/app/private-database/order/clouddb/private-database-order-clouddb.service.js +++ b/packages/manager/apps/web/client/app/private-database/order/clouddb/private-database-order-clouddb.service.js @@ -141,7 +141,6 @@ export default class PrivateDatabaseOrderCloudDb { }); } - static getWebCloudCategory(webCloudCatalog) { const offers = webCloudCatalog.plans .filter(({ family }) => family === DB_OFFERS.PRIVATE.FAMILY) diff --git a/packages/manager/apps/web/package.json b/packages/manager/apps/web/package.json index 7f87a1c892f9..288223d81fa3 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.38.3", + "version": "19.39.0", "private": true, "description": "OVHcloud Web control panel.", "repository": { diff --git a/packages/manager/apps/web/webpack.config.js b/packages/manager/apps/web/webpack.config.js index dae250c1fdc7..99eb5ca3c934 100644 --- a/packages/manager/apps/web/webpack.config.js +++ b/packages/manager/apps/web/webpack.config.js @@ -101,7 +101,9 @@ module.exports = (env = {}) => { alias: { angular: require.resolve('angular'), 'angular-translate': require.resolve('angular-translate'), - 'angular-translate-loader-partial': require.resolve('angular-translate-loader-partial'), + 'angular-translate-loader-partial': require.resolve( + 'angular-translate-loader-partial', + ), }, }, plugins: [ diff --git a/packages/manager/modules/account/CHANGELOG.md b/packages/manager/modules/account/CHANGELOG.md index 71a16b64216f..13f342dab7f7 100644 --- a/packages/manager/modules/account/CHANGELOG.md +++ b/packages/manager/modules/account/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.22.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-account@0.21.3...@ovh-ux/manager-account@0.22.0) (2026-04-16) + + +### Features + +* **account:** add billing autorenew for network snc ([c8f8774](https://github.com/ovh/manager/commit/c8f87740e41e0f59517c04f454b5a578c0ca74c3)), closes [#MANAGER-20619](https://github.com/ovh/manager/issues/MANAGER-20619) + + + + + ## [0.21.3](https://github.com/ovh/manager/compare/@ovh-ux/manager-account@0.21.2...@ovh-ux/manager-account@0.21.3) (2026-03-18) diff --git a/packages/manager/modules/account/package.json b/packages/manager/modules/account/package.json index 11992acc2d40..cc6741a086e7 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.3", + "version": "0.22.0", "private": true, "description": "OVHcloud Account product", "repository": { diff --git a/packages/manager/modules/account/src/contacts/service/translations/Messages_de_DE.json b/packages/manager/modules/account/src/contacts/service/translations/Messages_de_DE.json index c3122ffffb64..c3dbe5887a3e 100644 --- a/packages/manager/modules/account/src/contacts/service/translations/Messages_de_DE.json +++ b/packages/manager/modules/account/src/contacts/service/translations/Messages_de_DE.json @@ -43,5 +43,6 @@ "account_contacts_service_category_DEDICATED_CLUSTER": "3-AZ server", "account_contacts_service_category_HYCU": "HYCU", "account_contacts_service_category_ALL_DOM": "AllDom", - "account_contacts_service_category_RESELLER": "Domain-Reseller-Programm" + "account_contacts_service_category_RESELLER": "Domain-Reseller-Programm", + "account_contacts_service_category_NETWORK_SNC": "Network SNC" } diff --git a/packages/manager/modules/account/src/contacts/service/translations/Messages_en_GB.json b/packages/manager/modules/account/src/contacts/service/translations/Messages_en_GB.json index eb2e2c26fe39..ba766688c24c 100644 --- a/packages/manager/modules/account/src/contacts/service/translations/Messages_en_GB.json +++ b/packages/manager/modules/account/src/contacts/service/translations/Messages_en_GB.json @@ -43,5 +43,6 @@ "account_contacts_service_category_DEDICATED_CLUSTER": "3-AZ server", "account_contacts_service_category_HYCU": "HYCU", "account_contacts_service_category_ALL_DOM": "AllDom", - "account_contacts_service_category_RESELLER": "Domain Name Reseller Program" + "account_contacts_service_category_RESELLER": "Domain Name Reseller Program", + "account_contacts_service_category_NETWORK_SNC": "SNC Network" } diff --git a/packages/manager/modules/account/src/contacts/service/translations/Messages_es_ES.json b/packages/manager/modules/account/src/contacts/service/translations/Messages_es_ES.json index 017351a3c288..7a9429c1e87b 100644 --- a/packages/manager/modules/account/src/contacts/service/translations/Messages_es_ES.json +++ b/packages/manager/modules/account/src/contacts/service/translations/Messages_es_ES.json @@ -43,5 +43,6 @@ "account_contacts_service_category_DEDICATED_CLUSTER": "3-AZ server", "account_contacts_service_category_HYCU": "HYCU", "account_contacts_service_category_ALL_DOM": "AllDom", - "account_contacts_service_category_RESELLER": "Programa de Revendedores de Dominios" + "account_contacts_service_category_RESELLER": "Programa de Revendedores de Dominios", + "account_contacts_service_category_NETWORK_SNC": "Network SNC" } diff --git a/packages/manager/modules/account/src/contacts/service/translations/Messages_fr_CA.json b/packages/manager/modules/account/src/contacts/service/translations/Messages_fr_CA.json index 01ac9e45e060..6979be0e7637 100644 --- a/packages/manager/modules/account/src/contacts/service/translations/Messages_fr_CA.json +++ b/packages/manager/modules/account/src/contacts/service/translations/Messages_fr_CA.json @@ -43,5 +43,6 @@ "account_contacts_service_category_LOGS": "Logs Data Platform", "account_contacts_service_category_NETAPP": "NetApp", "account_contacts_service_category_ALL_DOM": "AllDom", - "account_contacts_service_category_RESELLER": "Programme Revendeur de Noms de Domaine" + "account_contacts_service_category_RESELLER": "Programme Revendeur de Noms de Domaine", + "account_contacts_service_category_NETWORK_SNC": "Network SNC" } diff --git a/packages/manager/modules/account/src/contacts/service/translations/Messages_fr_FR.json b/packages/manager/modules/account/src/contacts/service/translations/Messages_fr_FR.json index 01ac9e45e060..6979be0e7637 100644 --- a/packages/manager/modules/account/src/contacts/service/translations/Messages_fr_FR.json +++ b/packages/manager/modules/account/src/contacts/service/translations/Messages_fr_FR.json @@ -43,5 +43,6 @@ "account_contacts_service_category_LOGS": "Logs Data Platform", "account_contacts_service_category_NETAPP": "NetApp", "account_contacts_service_category_ALL_DOM": "AllDom", - "account_contacts_service_category_RESELLER": "Programme Revendeur de Noms de Domaine" + "account_contacts_service_category_RESELLER": "Programme Revendeur de Noms de Domaine", + "account_contacts_service_category_NETWORK_SNC": "Network SNC" } diff --git a/packages/manager/modules/account/src/contacts/service/translations/Messages_it_IT.json b/packages/manager/modules/account/src/contacts/service/translations/Messages_it_IT.json index 8377617a97cc..a34a316df782 100644 --- a/packages/manager/modules/account/src/contacts/service/translations/Messages_it_IT.json +++ b/packages/manager/modules/account/src/contacts/service/translations/Messages_it_IT.json @@ -43,5 +43,6 @@ "account_contacts_service_category_DEDICATED_CLUSTER": "3-AZ server", "account_contacts_service_category_HYCU": "HYCU", "account_contacts_service_category_ALL_DOM": "AllDom", - "account_contacts_service_category_RESELLER": "Programma Rivenditori di domini" + "account_contacts_service_category_RESELLER": "Programma Rivenditori di domini", + "account_contacts_service_category_NETWORK_SNC": "Network SNC" } diff --git a/packages/manager/modules/account/src/contacts/service/translations/Messages_pl_PL.json b/packages/manager/modules/account/src/contacts/service/translations/Messages_pl_PL.json index d3fba9752714..37bbae7036bc 100644 --- a/packages/manager/modules/account/src/contacts/service/translations/Messages_pl_PL.json +++ b/packages/manager/modules/account/src/contacts/service/translations/Messages_pl_PL.json @@ -43,5 +43,6 @@ "account_contacts_service_category_DEDICATED_CLUSTER": "3-AZ server", "account_contacts_service_category_HYCU": "HYCU", "account_contacts_service_category_ALL_DOM": "AllDom", - "account_contacts_service_category_RESELLER": "Program dla resellerów domen" + "account_contacts_service_category_RESELLER": "Program dla resellerów domen", + "account_contacts_service_category_NETWORK_SNC": "Network SNC" } diff --git a/packages/manager/modules/account/src/contacts/service/translations/Messages_pt_PT.json b/packages/manager/modules/account/src/contacts/service/translations/Messages_pt_PT.json index 8e16b89fc985..425c8f8e9822 100644 --- a/packages/manager/modules/account/src/contacts/service/translations/Messages_pt_PT.json +++ b/packages/manager/modules/account/src/contacts/service/translations/Messages_pt_PT.json @@ -43,5 +43,6 @@ "account_contacts_service_category_DEDICATED_CLUSTER": "3-AZ server", "account_contacts_service_category_HYCU": "HYCU", "account_contacts_service_category_ALL_DOM": "AllDom", - "account_contacts_service_category_RESELLER": "Programa de Revendedores de Domínios" + "account_contacts_service_category_RESELLER": "Programa de Revendedores de Domínios", + "account_contacts_service_category_NETWORK_SNC": "Network SNC" } diff --git a/packages/manager/modules/account/src/contacts/user-contacts.constants.js b/packages/manager/modules/account/src/contacts/user-contacts.constants.js index 9f7fc4426bfe..a2716cb1707c 100644 --- a/packages/manager/modules/account/src/contacts/user-contacts.constants.js +++ b/packages/manager/modules/account/src/contacts/user-contacts.constants.js @@ -27,6 +27,7 @@ export const AVAILABLE_SERVICES = [ 'HYCU', 'ALL_DOM', 'RESELLER', + 'NETWORK_SNC', ]; export default { diff --git a/packages/manager/modules/billing-components/CHANGELOG.md b/packages/manager/modules/billing-components/CHANGELOG.md index d3bb6d02e3b8..93e8eb8ba8ff 100644 --- a/packages/manager/modules/billing-components/CHANGELOG.md +++ b/packages/manager/modules/billing-components/CHANGELOG.md @@ -3,6 +3,20 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.36.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-billing-components@4.36.0...@ovh-ux/manager-billing-components@4.36.1) (2026-04-21) + + +### Bug Fixes + +* **i18n:** add missing translations [CDS 4727] ([462bf1b](https://github.com/ovh/manager/commit/462bf1bc5dd4663c906b8b7fe3b3b287d2a9b63b)) +* **i18n:** add missing translations [CDS 4730] ([974462d](https://github.com/ovh/manager/commit/974462da5051776b1e86e7d7332373e167ebea1e)) +* **i18n:** add missing translations [CDS 4736] ([4fe94cf](https://github.com/ovh/manager/commit/4fe94cfc6356a7083e26a54595474b1021da15c3)) +* **i18n:** add missing translations [CDS 4737] ([28392aa](https://github.com/ovh/manager/commit/28392aa1ca888a30b452457b941d126075b888ad)) + + + + + # [4.36.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-billing-components@4.35.8...@ovh-ux/manager-billing-components@4.36.0) (2026-03-26) diff --git a/packages/manager/modules/billing-components/package.json b/packages/manager/modules/billing-components/package.json index 11defe5bb1c4..7be24ec8bc2c 100644 --- a/packages/manager/modules/billing-components/package.json +++ b/packages/manager/modules/billing-components/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-billing-components", - "version": "4.36.0", + "version": "4.36.1", "private": true, "description": "OVHcloud manager billing components", "repository": { diff --git a/packages/manager/modules/billing/CHANGELOG.md b/packages/manager/modules/billing/CHANGELOG.md index 16c1a681daba..7a6ce4654dce 100644 --- a/packages/manager/modules/billing/CHANGELOG.md +++ b/packages/manager/modules/billing/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.66.0](https://github.com/ovh/manager/compare/@ovh-ux/manager-billing@0.65.7...@ovh-ux/manager-billing@0.66.0) (2026-04-16) + + +### Features + +* **account:** add billing autorenew for network snc ([c8f8774](https://github.com/ovh/manager/commit/c8f87740e41e0f59517c04f454b5a578c0ca74c3)), closes [#MANAGER-20619](https://github.com/ovh/manager/issues/MANAGER-20619) + + + + + ## [0.65.7](https://github.com/ovh/manager/compare/@ovh-ux/manager-billing@0.65.6...@ovh-ux/manager-billing@0.65.7) (2026-04-09) diff --git a/packages/manager/modules/billing/package.json b/packages/manager/modules/billing/package.json index 0600cca77cb5..d56360be0107 100644 --- a/packages/manager/modules/billing/package.json +++ b/packages/manager/modules/billing/package.json @@ -1,6 +1,6 @@ { "name": "@ovh-ux/manager-billing", - "version": "0.65.7", + "version": "0.66.0", "private": true, "description": "Manager billing section", "repository": { diff --git a/packages/manager/modules/billing/src/autoRenew/translations/Messages_de_DE.json b/packages/manager/modules/billing/src/autoRenew/translations/Messages_de_DE.json index 47c5bdf72fe3..4c9a8ccdd14f 100644 --- a/packages/manager/modules/billing/src/autoRenew/translations/Messages_de_DE.json +++ b/packages/manager/modules/billing/src/autoRenew/translations/Messages_de_DE.json @@ -174,5 +174,6 @@ "billing_autorenew_service_renew_automatic": "Automatisch", "billing_autorenew_service_renew_manual": "Manuell", "billing_autorenew_service_renew": "Verlängerung", - "billing_autorenew_criterion_renew": "Verlängerung" + "billing_autorenew_criterion_renew": "Verlängerung", + "billing_autorenew_service_type_NETWORK_SNC": "Network SNC" } diff --git a/packages/manager/modules/billing/src/autoRenew/translations/Messages_en_GB.json b/packages/manager/modules/billing/src/autoRenew/translations/Messages_en_GB.json index 79a155da519e..6bee3692bab7 100644 --- a/packages/manager/modules/billing/src/autoRenew/translations/Messages_en_GB.json +++ b/packages/manager/modules/billing/src/autoRenew/translations/Messages_en_GB.json @@ -174,5 +174,6 @@ "billing_autorenew_service_renew_automatic": "Automatic", "billing_autorenew_service_renew_manual": "Manual", "billing_autorenew_service_renew": "Renewal", - "billing_autorenew_criterion_renew": "Renewal" + "billing_autorenew_criterion_renew": "Renewal", + "billing_autorenew_service_type_NETWORK_SNC": "SNC Network" } diff --git a/packages/manager/modules/billing/src/autoRenew/translations/Messages_es_ES.json b/packages/manager/modules/billing/src/autoRenew/translations/Messages_es_ES.json index 320c87e0b005..ee321435a83d 100644 --- a/packages/manager/modules/billing/src/autoRenew/translations/Messages_es_ES.json +++ b/packages/manager/modules/billing/src/autoRenew/translations/Messages_es_ES.json @@ -174,5 +174,6 @@ "billing_autorenew_service_renew_automatic": "Automática", "billing_autorenew_service_renew_manual": "Manual", "billing_autorenew_service_renew": "Renovación", - "billing_autorenew_criterion_renew": "Renovación" + "billing_autorenew_criterion_renew": "Renovación", + "billing_autorenew_service_type_NETWORK_SNC": "Network SNC" } diff --git a/packages/manager/modules/billing/src/autoRenew/translations/Messages_fr_CA.json b/packages/manager/modules/billing/src/autoRenew/translations/Messages_fr_CA.json index fbb4c0fad975..7e675a547d68 100644 --- a/packages/manager/modules/billing/src/autoRenew/translations/Messages_fr_CA.json +++ b/packages/manager/modules/billing/src/autoRenew/translations/Messages_fr_CA.json @@ -164,6 +164,7 @@ "billing_autorenew_service_type_ZIMBRA_SLOT": "Compte Email Zimbra", "billing_autorenew_service_type_HOSTING_WEB_CDN": "Shared CDN", "billing_autorenew_service_type_DOMAIN_RESELLER": "Programme Revendeur de Noms de Domaine", + "billing_autorenew_service_type_NETWORK_SNC": "Network SNC", "billing_export_csv": "Exporter en CSV", "billing_common_link_new_window": "(nouvelle fenêtre)", "billing_autorenew_renew_action": "Renouveler", diff --git a/packages/manager/modules/billing/src/autoRenew/translations/Messages_fr_FR.json b/packages/manager/modules/billing/src/autoRenew/translations/Messages_fr_FR.json index fbb4c0fad975..7e675a547d68 100644 --- a/packages/manager/modules/billing/src/autoRenew/translations/Messages_fr_FR.json +++ b/packages/manager/modules/billing/src/autoRenew/translations/Messages_fr_FR.json @@ -164,6 +164,7 @@ "billing_autorenew_service_type_ZIMBRA_SLOT": "Compte Email Zimbra", "billing_autorenew_service_type_HOSTING_WEB_CDN": "Shared CDN", "billing_autorenew_service_type_DOMAIN_RESELLER": "Programme Revendeur de Noms de Domaine", + "billing_autorenew_service_type_NETWORK_SNC": "Network SNC", "billing_export_csv": "Exporter en CSV", "billing_common_link_new_window": "(nouvelle fenêtre)", "billing_autorenew_renew_action": "Renouveler", diff --git a/packages/manager/modules/billing/src/autoRenew/translations/Messages_it_IT.json b/packages/manager/modules/billing/src/autoRenew/translations/Messages_it_IT.json index f42e13bb5234..2fe1abf8edd2 100644 --- a/packages/manager/modules/billing/src/autoRenew/translations/Messages_it_IT.json +++ b/packages/manager/modules/billing/src/autoRenew/translations/Messages_it_IT.json @@ -174,5 +174,6 @@ "billing_autorenew_service_renew_automatic": "Automatico", "billing_autorenew_service_renew_manual": "Manuale", "billing_autorenew_service_renew": "Rinnovo", - "billing_autorenew_criterion_renew": "Rinnovo" + "billing_autorenew_criterion_renew": "Rinnovo", + "billing_autorenew_service_type_NETWORK_SNC": "Network SNC" } diff --git a/packages/manager/modules/billing/src/autoRenew/translations/Messages_pl_PL.json b/packages/manager/modules/billing/src/autoRenew/translations/Messages_pl_PL.json index c6af4a34fd2e..8d9dbef9b9f2 100644 --- a/packages/manager/modules/billing/src/autoRenew/translations/Messages_pl_PL.json +++ b/packages/manager/modules/billing/src/autoRenew/translations/Messages_pl_PL.json @@ -174,5 +174,6 @@ "billing_autorenew_service_renew_automatic": "Automatyczne", "billing_autorenew_service_renew_manual": "Ręczne", "billing_autorenew_service_renew": "Odnowienie", - "billing_autorenew_criterion_renew": "Odnowienie" + "billing_autorenew_criterion_renew": "Odnowienie", + "billing_autorenew_service_type_NETWORK_SNC": "Network SNC" } diff --git a/packages/manager/modules/billing/src/autoRenew/translations/Messages_pt_PT.json b/packages/manager/modules/billing/src/autoRenew/translations/Messages_pt_PT.json index 6e89a242aaa7..3a20f4e1d6a6 100644 --- a/packages/manager/modules/billing/src/autoRenew/translations/Messages_pt_PT.json +++ b/packages/manager/modules/billing/src/autoRenew/translations/Messages_pt_PT.json @@ -174,5 +174,6 @@ "billing_autorenew_service_renew_automatic": "Automático", "billing_autorenew_service_renew_manual": "Manual", "billing_autorenew_service_renew": "Renovação", - "billing_autorenew_criterion_renew": "Renovação" + "billing_autorenew_criterion_renew": "Renovação", + "billing_autorenew_service_type_NETWORK_SNC": "Network SNC" } diff --git a/packages/manager/modules/bm-server-components/CHANGELOG.md b/packages/manager/modules/bm-server-components/CHANGELOG.md index 3d396583d2db..7e1f63a5a468 100644 --- a/packages/manager/modules/bm-server-components/CHANGELOG.md +++ b/packages/manager/modules/bm-server-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. +## [2.23.2](https://github.com/ovh/manager/compare/@ovh-ux/manager-bm-server-components@2.23.1...@ovh-ux/manager-bm-server-components@2.23.2) (2026-04-22) + + +### Bug Fixes + +* **bm-server-components:** preserve boolean type in OS install customizations ([6ad0540](https://github.com/ovh/manager/commit/6ad05407b903dce3e1c4d0b5eb7d7a69e61e68b9)), closes [#PUBM-52327](https://github.com/ovh/manager/issues/PUBM-52327) + + + + + ## [2.23.1](https://github.com/ovh/manager/compare/@ovh-ux/manager-bm-server-components@2.23.0...@ovh-ux/manager-bm-server-components@2.23.1) (2026-03-25) diff --git a/packages/manager/modules/bm-server-components/package.json b/packages/manager/modules/bm-server-components/package.json index d13721bd331c..0a07095ac8e0 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.23.1", + "version": "2.23.2", "private": true, "description": "OVHcloud BmServerComponents product", "repository": { diff --git a/packages/manager/modules/bm-server-components/src/general-information/installation/ovh/server-installation-ovh.controller.js b/packages/manager/modules/bm-server-components/src/general-information/installation/ovh/server-installation-ovh.controller.js index 6ee13de04cfa..b324cb643e12 100644 --- a/packages/manager/modules/bm-server-components/src/general-information/installation/ovh/server-installation-ovh.controller.js +++ b/packages/manager/modules/bm-server-components/src/general-information/installation/ovh/server-installation-ovh.controller.js @@ -2156,7 +2156,11 @@ export default class ServerInstallationOvhCtrl { getCustomizations() { const customizations = {}; Object.values(this.$scope.installation.inputs).forEach((input) => { - if ( + if (input.name === 'enableLacpBonding') { + customizations[input.name] = !!this.$scope.installation.input[ + input.name + ]; + } else if ( input.type !== 'keyValue' && this.$scope.installation.input[input.name] ) {