Skip to content

Commit 5a3d270

Browse files
committed
feat(web-domain): dns state + transfer
ref: #DCE-16 Signed-off-by: Brendan Seiller <brendan.seiller@ovhcloud.com>
1 parent 74e895e commit 5a3d270

File tree

7 files changed

+109
-65
lines changed

7 files changed

+109
-65
lines changed

packages/manager/apps/web-domains/public/translations/domain/Messages_fr_FR.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@
252252
"domain_tab_general_information_note_anycast": "Mettez à niveau vers une offre Anycast pour de meilleures performances.",
253253
"domain_tab_general_information_dns_anycast": "Anycast",
254254
"domain_tab_general_information_dns_personnalised": "Personnalisé",
255-
"domain_tab_general_information_dns_dedicad": "Dedié",
255+
"domain_tab_general_information_dns_dedicated": "Dédié",
256256
"domain_tab_general_information_dns_empty": "Aucun",
257257
"domain_tab_DNS_modification_form_dns_number": "Veuillez renseigner entre {{min}} et {{max}} DNS.",
258258
"domain_tab_DNS_modification_form_server_field": "Serveur DNS",

packages/manager/apps/web-domains/src/domain/components/ConfigurationCards/ConfigurationCards.spec.tsx

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ import { wrapper } from '@/common/utils/test.provider';
77
import ConfigurationCards from './ConfigurationCards';
88
import {
99
useGetDnssecStatus,
10+
useGetDomainAnycastOption,
1011
useGetDomainAuthInfo,
1112
useGetDomainResource,
13+
useTerminateAnycastMutation,
1214
useTransferTag,
1315
useUpdateDnssecService,
1416
useUpdateDomainResource,
@@ -22,7 +24,6 @@ import { ResourceStatusEnum } from '@/domain/enum/resourceStatus.enum';
2224
import { TDomainResource } from '@/domain/types/domainResource';
2325
import { StatusEnum } from '@/domain/enum/Status.enum';
2426

25-
vi.mock('@/domain/hooks/data/query');
2627
vi.mock('@ovh-ux/manager-react-components', async () => {
2728
const actual = await vi.importActual('@ovh-ux/manager-react-components');
2829
return {
@@ -31,6 +32,17 @@ vi.mock('@ovh-ux/manager-react-components', async () => {
3132
};
3233
});
3334

35+
vi.mock('@/domain/hooks/data/query', () => ({
36+
useGetDomainAnycastOption: vi.fn(),
37+
useGetDomainResource: vi.fn(),
38+
useGetDomainAuthInfo: vi.fn(),
39+
useGetDnssecStatus: vi.fn(),
40+
useUpdateDnssecService: vi.fn(),
41+
useUpdateDomainResource: vi.fn(),
42+
useTransferTag: vi.fn(),
43+
useTerminateAnycastMutation: vi.fn(),
44+
}));
45+
3446
describe('ConfigurationCards component', () => {
3547
const mockUpdateServiceDnssec = vi.fn();
3648
const mockUpdateDomain = vi.fn();
@@ -115,6 +127,14 @@ describe('ConfigurationCards component', () => {
115127
dnssecStatus: mockDnssecStatus,
116128
isDnssecStatusLoading: false,
117129
});
130+
(useGetDomainAnycastOption as jest.Mock).mockReturnValue({
131+
anycastOption: null,
132+
isFetchingAnycastOption: false,
133+
});
134+
(useTerminateAnycastMutation as jest.Mock).mockReturnValue({
135+
terminateAnycast: vi.fn(),
136+
isTerminateAnycastPending: false,
137+
});
118138
(useUpdateDnssecService as jest.Mock).mockReturnValue({
119139
updateServiceDnssec: mockUpdateServiceDnssec,
120140
isUpdateIsPending: false,
@@ -145,8 +165,12 @@ describe('ConfigurationCards component', () => {
145165
it('renders DNS server badge', () => {
146166
render(<ConfigurationCards serviceName="example.com" />, { wrapper });
147167

148-
expect(screen.getByText('Serveur DNS')).toBeInTheDocument();
149-
expect(screen.getByText('Enregistré')).toBeInTheDocument();
168+
expect(
169+
screen.getByText('domain_tab_general_information_dns_title'),
170+
).toBeInTheDocument();
171+
expect(
172+
screen.getByText('domain_tab_general_information_dns_standard'),
173+
).toBeInTheDocument();
150174
});
151175

152176
it('renders DnssecToggleStatus component', () => {

packages/manager/apps/web-domains/src/domain/components/ConfigurationCards/ConfigurationCards.tsx

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import {
2727
TContactsConfigurationAPI,
2828
} from '@/domain/types/domainResource';
2929
import DnsState from './DnsState';
30+
import AnycastTerminateModal from '../AnycastOrder/AnycastTerminateModal';
3031

3132
interface ConfigurationCardsProps {
3233
readonly serviceName: string;
@@ -228,14 +229,16 @@ export default function ConfigurationCards({
228229
{t('domain_tab_general_information_configuration')}
229230
</ManagerTile.Title>
230231
<ManagerTile.Divider />
231-
<ManagerTile.Item>
232-
<ManagerTile.Item.Label>Serveur DNS</ManagerTile.Item.Label>
233-
<ManagerTile.Item.Description>
234-
<Badge color={BADGE_COLOR.success} className="mt-4">
235-
Enregistré
236-
</Badge>
237-
</ManagerTile.Item.Description>
238-
</ManagerTile.Item>
232+
<DnsState
233+
domainResource={domainResource}
234+
serviceName={serviceName}
235+
anycastOption={anycastOption}
236+
isFetchingAnycastOption={isFetchingAnycastOption}
237+
anycastTerminateModalOpen={anycastTerminateModalOpen}
238+
setAnycastTerminateModalOpen={setAnycastTerminateModalOpen}
239+
restoreAnycast={restoreAnycast}
240+
setRestoreAnycast={setRestoreAnycast}
241+
/>
239242
<ManagerTile.Divider />
240243
<DnssecToggleStatus
241244
dnssecModalOpened={dnssecModalOpened}
@@ -302,6 +305,15 @@ export default function ConfigurationCards({
302305
handleUpdateDataProtection();
303306
}}
304307
/>
308+
<AnycastTerminateModal
309+
serviceName={serviceName}
310+
restore={restoreAnycast}
311+
anycastTerminateModalOpen={anycastTerminateModalOpen}
312+
expirationDate={anycastOption?.expirationDate}
313+
onOpenAnycastTerminateModal={() =>
314+
setAnycastTerminateModalOpen(!anycastTerminateModalOpen)
315+
}
316+
/>
305317
</ManagerTile>
306318
);
307319
}

packages/manager/apps/web-domains/src/domain/components/ConfigurationCards/DataProtection.spec.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
import '@/common/setupTests';
22
import React from 'react';
3-
import { render, screen, waitFor } from '@testing-library/react';
3+
import { render, screen } from '@testing-library/react';
44
import userEvent from '@testing-library/user-event';
55
import { vi } from 'vitest';
66
import { wrapper } from '@/common/utils/test.provider';
77
import DataProtection from './DataProtection';
88
import {
99
TDomainResource,
1010
DisclosureConfigurationEnum,
11-
DataProtectionStatus,
1211
} from '@/domain/types/domainResource';
1312
import { DnsConfigurationTypeEnum } from '@/domain/enum/dnsConfigurationType.enum';
1413
import { DomainStateEnum } from '@/domain/enum/domainState.enum';

packages/manager/apps/web-domains/src/domain/components/ConfigurationCards/DnsState.spec.tsx

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,35 @@ describe('DnsState component', () => {
4141
],
4242
dnssecSupported: true,
4343
},
44+
hostsConfiguration: {
45+
ipv4Supported: true,
46+
ipv6Supported: true,
47+
multipleIPsSupported: true,
48+
hostSupported: true,
49+
hosts: [],
50+
},
51+
contactsConfiguration: {
52+
contactAdministrator: {
53+
id: 'contact-admin-id',
54+
},
55+
contactBilling: {
56+
id: 'contact-billing-id',
57+
},
58+
contactTechnical: {
59+
id: 'contact-tech-id',
60+
},
61+
contactOwner: {
62+
id: 'contact-owner-id',
63+
},
64+
},
4465
extension: '.com',
4566
mainState: DomainStateEnum.OK,
4667
name: 'example.com',
4768
protectionState: ProtectionStateEnum.UNPROTECTED,
4869
suspensionState: SuspensionStateEnum.NOT_SUSPENDED,
70+
authInfoManagedByOVHcloud: true,
71+
authInfoSupported: true,
72+
createdAt: '2024-01-01T00:00:00Z',
4973
},
5074
currentTasks: [],
5175
iam: null,
@@ -85,7 +109,7 @@ describe('DnsState component', () => {
85109
});
86110

87111
it('renders tooltip with anycast label when anycast is subscribed', () => {
88-
render(
112+
const { container } = render(
89113
<DnsState
90114
domainResource={mockDomainResource}
91115
serviceName="example-service"
@@ -102,9 +126,10 @@ describe('DnsState component', () => {
102126
{ wrapper },
103127
);
104128

105-
expect(
106-
screen.getByText('domain_dns_tab_button_cancel_terminate_anycast'),
107-
).toBeInTheDocument();
129+
const button = container.querySelector(
130+
'ods-button[label*="domain_dns_tab_button_cancel_terminate_anycast"]',
131+
);
132+
expect(button).toBeInTheDocument();
108133
});
109134

110135
it('renders tooltip with anycast label when anycast is released', () => {
@@ -113,7 +138,7 @@ describe('DnsState component', () => {
113138
state: OptionStateEnum.RELEASED,
114139
};
115140

116-
render(
141+
const { container } = render(
117142
<DnsState
118143
serviceName="example-service"
119144
domainResource={mockDomainResource}
@@ -130,13 +155,14 @@ describe('DnsState component', () => {
130155
{ wrapper },
131156
);
132157

133-
expect(
134-
screen.getByText('domain_dns_tab_button_cancel_terminate_anycast'),
135-
).toBeInTheDocument();
158+
const button = container.querySelector(
159+
'ods-button[label*="domain_dns_tab_button_cancel_terminate_anycast"]',
160+
);
161+
expect(button).toBeInTheDocument();
136162
});
137163

138164
it('renders tooltip with anycast label when anycast is not set', () => {
139-
render(
165+
const { container } = render(
140166
<DnsState
141167
domainResource={mockDomainResource}
142168
serviceName="example-service"
@@ -150,8 +176,9 @@ describe('DnsState component', () => {
150176
{ wrapper },
151177
);
152178

153-
expect(
154-
screen.getByText('domain_dns_tab_button_order_anycast'),
155-
).toBeInTheDocument();
179+
const button = container.querySelector(
180+
'ods-button[label="domain_tab_DNS_anycast_order"]',
181+
);
182+
expect(button).toBeInTheDocument();
156183
});
157184
});

packages/manager/apps/web-domains/src/domain/components/ConfigurationCards/DnsState.tsx

Lines changed: 19 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,13 @@
11
import React from 'react';
22
import { Trans, useTranslation } from 'react-i18next';
33
import { useNavigate } from 'react-router-dom';
4-
import { ManagerTile, useFormatDate } from '@ovh-ux/manager-react-components';
5-
import { NAMESPACES } from '@ovh-ux/manager-common-translations';
64
import {
7-
Button,
8-
BUTTON_VARIANT,
9-
Icon,
10-
ICON_NAME,
11-
Link,
12-
Text,
13-
TEXT_PRESET,
14-
Tooltip,
15-
TOOLTIP_POSITION,
16-
TooltipContent,
17-
TooltipTrigger,
18-
} from '@ovhcloud/ods-react';
19-
import { useGetDomainResource } from '@/domain/hooks/data/query';
5+
ActionMenu,
6+
ManagerTile,
7+
useFormatDate,
8+
} from '@ovh-ux/manager-react-components';
9+
import { NAMESPACES } from '@ovh-ux/manager-common-translations';
10+
import { Text, TEXT_PRESET } from '@ovhcloud/ods-react';
2011
import { getDnsStateDetails } from '@/domain/utils/dnsUtils';
2112
import { OptionStateEnum } from '@/domain/enum/optionState.enum';
2213
import { useGenerateUrl } from '@/domain/hooks/generateUrl/useGenerateUrl';
@@ -46,7 +37,6 @@ export default function DnsState({
4637
setRestoreAnycast,
4738
}: DnsStateProps) {
4839
const { t } = useTranslation(['domain', NAMESPACES.ACTIONS]);
49-
const [btnOpenned, setBtnOpenned] = React.useState(false);
5040

5141
const formatDate = useFormatDate();
5242

@@ -76,7 +66,7 @@ export default function DnsState({
7666

7767
const handleAnycastLabel = () => {
7868
if (!anycastOption) {
79-
return t('domain_dns_tab_button_order_anycast');
69+
return t('domain_tab_DNS_anycast_order');
8070
}
8171

8272
if (anycastOption && restoreAnycast) {
@@ -112,22 +102,18 @@ export default function DnsState({
112102
<div className="flex items-center justify-between">
113103
<Text preset={TEXT_PRESET.label}>{t(dnsState.label)}</Text>
114104
{dnsState.anycastSupported && (
115-
<Tooltip open={btnOpenned} position={TOOLTIP_POSITION.bottom}>
116-
<TooltipTrigger asChild>
117-
<Button
118-
variant={BUTTON_VARIANT.outline}
119-
onClick={() => setBtnOpenned(!btnOpenned)}
120-
loading={isFetchingAnycastOption}
121-
>
122-
<Icon name={ICON_NAME.ellipsisVertical} />
123-
</Button>
124-
</TooltipTrigger>
125-
<TooltipContent withArrow={true}>
126-
<Link onClick={() => handleBtnClick()}>
127-
{handleAnycastLabel()}
128-
</Link>
129-
</TooltipContent>
130-
</Tooltip>
105+
<ActionMenu
106+
id="anycast-service"
107+
isCompact
108+
isLoading={isFetchingAnycastOption}
109+
items={[
110+
{
111+
id: 1,
112+
label: handleAnycastLabel(),
113+
onClick: () => handleBtnClick(),
114+
},
115+
]}
116+
/>
131117
)}
132118
</div>
133119
<Text preset={TEXT_PRESET.paragraph}>

packages/manager/apps/web-domains/src/domain/constants/configuration.card.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,7 @@ import { NAMESPACES } from '@ovh-ux/manager-common-translations';
22
import { BADGE_COLOR } from '@ovhcloud/ods-react';
33
import { ProtectionStateEnum } from '@/domain/enum/protectionState.enum';
44
import { DataProtectionStatus } from '../types/domainResource';
5-
import {
6-
ActiveConfigurationTypeEnum,
7-
DnsConfigurationTypeEnum,
8-
} from '../enum/dnsConfigurationType.enum';
9-
import { PublicNameServerTypeEnum } from '../enum/publicNameServerType.enum';
5+
import { DnsConfigurationTypeEnum } from '../enum/dnsConfigurationType.enum';
106

117
export const ConfigurationDnssecBadgeColorAndContent = {
128
not_supported: {
@@ -161,7 +157,7 @@ export const ConfigurationDnsStateAndContent = [
161157
{
162158
dnsTypes: [DnsConfigurationTypeEnum.DEDICATED],
163159
result: {
164-
label: 'domain_tab_general_information_dns_dedicad',
160+
label: 'domain_tab_general_information_dns_dedicated',
165161
notes: '',
166162
anycastSupported: false,
167163
},

0 commit comments

Comments
 (0)