Skip to content

Commit 67c1ea8

Browse files
committed
feat(backup-agent): move baremetal logics in backup-agent module
ref: #BKP-652 Signed-off-by: Thibault Barske <[email protected]>
1 parent 23f135e commit 67c1ea8

File tree

61 files changed

+593
-147
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+593
-147
lines changed

packages/manager/apps/bmc-backup-agent-baremetal/package.json

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,14 @@
1919
"test:coverage": "manager-test run --coverage"
2020
},
2121
"dependencies": {
22+
"@hookform/resolvers": "^5.2.2",
2223
"@ovh-ux/backup-agent": "*",
24+
"@ovh-ux/manager-billing-informations": "*",
2325
"@ovh-ux/manager-common-translations": "*",
2426
"@ovh-ux/manager-config": "*",
2527
"@ovh-ux/manager-core-api": "*",
2628
"@ovh-ux/manager-core-utils": "*",
29+
"@ovh-ux/manager-module-common-api": "*",
2730
"@ovh-ux/manager-react-components": "2.42.4",
2831
"@ovh-ux/manager-react-core-application": "*",
2932
"@ovh-ux/manager-react-shell-client": "*",
@@ -32,26 +35,30 @@
3235
"@ovhcloud/ods-components": "~18.6.2",
3336
"@ovhcloud/ods-themes": "~18.6.2",
3437
"@tanstack/react-query": "5.51.21",
38+
"@tanstack/react-virtual": "^3.10.9",
3539
"axios": "^1.1.2",
3640
"element-internals-polyfill": "^3.0.0",
3741
"i18next": "23.8.2",
3842
"i18next-http-backend": "2.4.3",
3943
"react": "^18.2.0",
4044
"react-dom": "^18.2.0",
45+
"react-hook-form": "7.66.1",
4146
"react-i18next": "14.1.0",
4247
"react-router-dom": "6.16.0",
43-
"tailwindcss": "^3.4.4"
48+
"tailwindcss": "^3.4.4",
49+
"zod": "4.1.12"
4450
},
4551
"devDependencies": {
52+
"@ovh-ux/manager-core-test-utils": "0.10.0",
4653
"@ovh-ux/manager-static-analysis-kit": "0.13.0",
4754
"@ovh-ux/manager-tailwind-config": "*",
4855
"@ovh-ux/manager-tests-setup": "0.6.0",
4956
"@ovh-ux/manager-vite-config": "0.15.0",
5057
"@tanstack/react-query-devtools": "5.51.21",
51-
"react-hook-form": "~7.66.0",
5258
"typescript": "5.4.5",
5359
"vite": "6.3.4",
54-
"vite-plugin-static-copy": "^3.1.4"
60+
"vite-plugin-static-copy": "^3.1.4",
61+
"vitest": "3.2.4"
5562
},
5663
"regions": [
5764
"CA",

packages/manager/apps/bmc-backup-agent-baremetal/src/components/onboarding/onboardingLayout/OnboardingLayout.component.tsx

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,7 @@ const OnboardingLayoutButton: React.FC<OnboardingLayoutButtonProps> = ({
4646
}
4747
return (
4848
<div className="flex sm:pt-8 xs:pt-2.5 flex-row items-center space-x-4 justify-center">
49-
<Link
50-
id={tooltipId}
51-
to={!isOrderDisabled && !isOrderLoading ? orderHref : ''}
52-
target="_blank"
53-
rel="noopener noreferrer"
54-
>
49+
<Link id={tooltipId} to={!isOrderDisabled && !isOrderLoading ? orderHref : ''}>
5550
<OdsButton
5651
size={ODS_BUTTON_SIZE.md}
5752
onClick={onOrderButtonClick}

packages/manager/apps/bmc-backup-agent-baremetal/src/pages/first-order/_components/__tests__/FirstOrderForm.spec.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,14 @@ const { useBaremetalsListMock } = vi.hoisted(() => ({
9494
.mockReturnValue({ flattenData: undefined, isLoading: true, isError: false }),
9595
}));
9696

97-
vi.mock('@/data/hooks/baremetal/useBaremetalsList', () => ({
98-
useBaremetalsList: useBaremetalsListMock,
99-
}));
97+
vi.mock('@ovh-ux/backup-agent', async () => {
98+
const actual = await vi.importActual('@ovh-ux/backup-agent');
99+
100+
return {
101+
...actual,
102+
useBaremetalsList: useBaremetalsListMock,
103+
};
104+
});
100105

101106
vi.mock('@/hooks/onboarding/useOnboardingData', () => ({
102107
useOnboardingContent: () => ({
@@ -168,9 +173,7 @@ describe('FirstOrderFormComponent', () => {
168173
);
169174

170175
await waitFor(() =>
171-
expect(
172-
screen.getByText(`translated_${NAMESPACES.FORM}:error_required_field`),
173-
).toBeInTheDocument(),
176+
expect(screen.getByText(`translated_${NAMESPACES.FORM}:required_field`)).toBeInTheDocument(),
174177
);
175178

176179
await waitFor(() => expect(getSelectBaremetal()).toHaveAttribute('data-disabled', 'false'), {

packages/manager/apps/bmc-backup-agent-baremetal/src/pages/first-order/_components/first-order-form/FirstOrderForm.component.tsx

Lines changed: 18 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,46 @@
1-
import { Controller, SubmitHandler, useForm } from 'react-hook-form';
1+
import { SubmitHandler, useForm } from 'react-hook-form';
22
import { useTranslation } from 'react-i18next';
33

4-
import {
5-
OdsButton,
6-
OdsCombobox,
7-
OdsComboboxItem,
8-
OdsFormField,
9-
OdsText,
10-
} from '@ovhcloud/ods-components/react';
4+
import { OdsButton } from '@ovhcloud/ods-components/react';
115

6+
import { BaremetalOption, RhfField, useBaremetalsList } from '@ovh-ux/backup-agent';
127
import { NAMESPACES } from '@ovh-ux/manager-common-translations';
138

14-
import { useBaremetalsList } from '@/data/hooks/baremetal/useBaremetalsList';
15-
169
type Inputs = {
1710
baremetal: string;
1811
};
1912

2013
export const FirstOrderFormComponent = () => {
21-
const { t } = useTranslation([NAMESPACES.ACTIONS, NAMESPACES.FORM]);
14+
const { t } = useTranslation(['onboarding', NAMESPACES.ACTIONS, NAMESPACES.FORM]);
2215
const { flattenData, isLoading } = useBaremetalsList();
2316

2417
const {
2518
control,
2619
handleSubmit,
20+
register,
2721
formState: { errors },
2822
} = useForm<Inputs>();
2923
const onSubmit: SubmitHandler<Inputs> = (dataForm) => console.log({ dataForm });
3024

3125
return (
3226
<form
3327
className={`flex justify-center ${!!errors.baremetal ? 'items-center' : 'items-end'} gap-4 w-full`}
28+
noValidate
3429
onSubmit={handleSubmit(onSubmit)}
3530
>
36-
<Controller
37-
name="baremetal"
31+
<RhfField
3832
control={control}
39-
rules={{ required: t(`${NAMESPACES.FORM}:error_required_field`) }}
40-
render={({ field }) => (
41-
<OdsFormField className="w-full max-w-xl" error={errors.baremetal?.message}>
42-
<label htmlFor="baremetal-field" slot="label">
43-
{t('select_baremetal')}
44-
</label>
45-
<OdsCombobox
46-
id="baremetal-field"
47-
ref={field.ref}
48-
name={field.name}
49-
value={field.value}
50-
onOdsChange={field.onChange}
51-
onOdsBlur={field.onBlur}
52-
placeholder={t('select_baremetal')}
53-
isDisabled={isLoading}
54-
isRequired={!!errors.baremetal}
55-
>
56-
{flattenData?.map((baremetalService) => (
57-
<OdsComboboxItem
58-
key={baremetalService.name}
59-
value={baremetalService.name}
60-
selectionLabel={`${baremetalService.name} - ${baremetalService.ip}`}
61-
>
62-
<div className="flex flex-col py-3">
63-
<OdsText preset="span">{baremetalService.iam.displayName}</OdsText>
64-
<OdsText
65-
preset="caption"
66-
className="[&::part(text)]:text-[var(--ods-color-neutral-400)] -mt-3"
67-
>
68-
{baremetalService.ip}
69-
</OdsText>
70-
</div>
71-
</OdsComboboxItem>
72-
))}
73-
</OdsCombobox>
74-
</OdsFormField>
75-
)}
76-
/>
33+
controllerParams={register('baremetal', { required: true })}
34+
helperMessage={t(`${NAMESPACES.FORM}:required_field`)}
35+
className="w-full max-w-xl"
36+
>
37+
<RhfField.Label>{t('select_baremetal')}</RhfField.Label>
38+
<RhfField.Combobox placeholder={t('select_baremetal')} isDisabled={isLoading}>
39+
{flattenData?.map(({ name, ip, iam: { displayName } }) => (
40+
<BaremetalOption key={name} name={name} ip={ip} displayName={displayName} />
41+
))}
42+
</RhfField.Combobox>
43+
</RhfField>
7744
<OdsButton type="submit" label={t(`${NAMESPACES.ACTIONS}:start`)} isDisabled={isLoading} />
7845
</form>
7946
);

packages/manager/apps/bmc-backup-agent-baremetal/src/pages/onboarding/Onboarding.page.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ import React, { useMemo } from 'react';
22

33
import { useTranslation } from 'react-i18next';
44

5+
import { useBaremetalsList } from '@ovh-ux/backup-agent';
56
import { NAMESPACES } from '@ovh-ux/manager-common-translations';
67
import { Card } from '@ovh-ux/manager-react-components';
78

89
import { OnboardingDescription } from '@/components/onboarding/onboardingDescription/OnboardingDescription.component';
910
import { OnboardingLayout } from '@/components/onboarding/onboardingLayout/OnboardingLayout.component';
10-
import { useBaremetalsList } from '@/data/hooks/baremetal/useBaremetalsList';
1111
import { useGuideLinks, useOnboardingContent } from '@/hooks/onboarding/useOnboardingData';
1212
import { useOnboardingHeroImage } from '@/hooks/onboarding/useOnboardingHeroImage';
13+
import { urls } from '@/routes/Routes.constants';
1314
import { OnboardingLinksType } from '@/types/Onboarding.type';
1415

1516
export default function OnboardingPage() {
@@ -37,7 +38,7 @@ export default function OnboardingPage() {
3738
moreInfoButtonLabel={t(`${NAMESPACES.ONBOARDING}:more_infos`)}
3839
onMoreInfoButtonClick={() => {}}
3940
isOrderLoading={isLoading}
40-
orderHref=""
41+
orderHref={urls.firstOrder}
4142
moreInfoHref="/#/"
4243
isOrderDisabled={!flattenData?.length}
4344
tooltipContent={!flattenData?.length ? t('no_baremetal_available') : undefined}

packages/manager/apps/bmc-backup-agent-baremetal/src/pages/onboarding/Onboarding.spec.tsx

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,17 @@ import { BAREMETAL_MOCK } from '@/mocks/baremetals/baremetals.mocks';
77

88
import OnboardingPage from './Onboarding.page';
99

10-
vi.mock('react-router-dom', () => ({
11-
Link: ({ to, children, ...props }: { to: string; children: React.ReactNode }) => (
12-
<a href={to} {...props}>
13-
{children}
14-
</a>
15-
),
16-
}));
10+
vi.mock('react-router-dom', async () => {
11+
const actual = await vi.importActual('react-router-dom')
12+
return {
13+
...actual,
14+
Link: ({to, children, ...props}: { to: string; children: React.ReactNode }) => (
15+
<a href={to} {...props}>
16+
{children}
17+
</a>
18+
),
19+
}
20+
});
1721

1822
// --- Mock translation ---
1923
vi.mock('react-i18next', () => ({
@@ -30,7 +34,7 @@ const { useBaremetalsListMock } = vi.hoisted(() => ({
3034
.mockReturnValue({ data: undefined, isLoading: true, isError: false }),
3135
}));
3236

33-
vi.mock('@/data/hooks/baremetal/useBaremetalsList', () => ({
37+
vi.mock('@ovh-ux/backup-agent', () => ({
3438
useBaremetalsList: useBaremetalsListMock,
3539
}));
3640

packages/manager/apps/bmc-backup-agent-baremetal/src/routes/Routes.constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export const subRoutes = Object.freeze({
1010
export const urls = Object.freeze({
1111
root: ROOT_URL,
1212
onboarding: `${ROOT_URL}${subRoutes.onboarding}`,
13+
firstOrder: `${ROOT_URL}${subRoutes.firstOrder}`,
1314
});
1415

1516
export const redirectionApp = appName;

packages/manager/apps/bmc-backup-agent-baremetal/vitest.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export default mergeConfig(
3030
],
3131
},
3232
},
33-
resolve: { dedupe: [...defaultDedupedDependencies],
33+
resolve: { dedupe: [...defaultDedupedDependencies, 'react-hook-form'],
3434
alias: {
3535
// eslint-disable-next-line no-undef
3636
'@': path.resolve(__dirname, 'src'),

packages/manager/modules/backup-agent/package.json

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,6 @@
1818
"test": "manager-test run",
1919
"test:coverage": "manager-test run --coverage"
2020
},
21-
"dependencies": {
22-
"@tanstack/react-virtual": "^3.10.9",
23-
"date-fns": "^3.6.0"
24-
},
2521
"devDependencies": {
2622
"@ovh-ux/manager-billing-informations": "*",
2723
"@ovh-ux/manager-common-translations": "*",
@@ -33,16 +29,14 @@
3329
"@ovh-ux/manager-vite-config": "0.15.0",
3430
"@ovhcloud/ods-components": "^18.6.2",
3531
"@ovhcloud/ods-themes": "^18.6.2",
36-
"@tanstack/react-query": "5.61.5",
37-
"@tanstack/react-virtual": "^3.10.9",
3832
"msw": "2.1.7",
39-
"react": "^18.2.0",
40-
"react-dom": "^18.2.0",
41-
"react-i18next": "^14.0.5",
42-
"react-router-dom": "^6.3.0",
43-
"tailwindcss": "^3.4.4"
33+
"tailwindcss": "^3.4.4",
34+
"tsc-alias": "^1.8.16",
35+
"typescript": "5.4.5",
36+
"zod": "3.22.4"
4437
},
4538
"peerDependencies": {
39+
"@hookform/resolvers": "^5.2.2",
4640
"@ovh-ux/manager-billing-informations": "*",
4741
"@ovh-ux/manager-common-translations": "*",
4842
"@ovh-ux/manager-config": "^8.0.2",
@@ -61,6 +55,7 @@
6155
"i18next": "^23.8.2",
6256
"react": "^18.2.0",
6357
"react-dom": "^18.2.0",
58+
"react-hook-form": "7.66.1",
6459
"react-i18next": "^14.0.5",
6560
"react-router-dom": "^6.3.0"
6661
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"add_configuration": "Ajouter une configuration",
3+
"link_agent_to_a_server": "Lier un agent à un serveur existant",
4+
"add_server": "Ajouter un serveur",
5+
"select_server": "Sélectionner le serveur",
6+
"product_name": "Nom du produit",
7+
"select_os": "Sélectionner un système d'exploitation",
8+
"os": "Système d'exploitation",
9+
"download_agent": "Télécharger l'agent"
10+
}

0 commit comments

Comments
 (0)