Skip to content

Commit e56940e

Browse files
committed
feat(zimbra): add accounts export csv feature
ref: #PRDCOL-115 Signed-off-by: Guillaume Hyenne <[email protected]>
1 parent fcce2be commit e56940e

File tree

15 files changed

+428
-14
lines changed

15 files changed

+428
-14
lines changed

packages/manager/apps/zimbra/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
"@tanstack/react-table": "^8.20.1",
4040
"date-fns": "^4.1.0",
4141
"element-internals-polyfill": "^1.3.10",
42+
"export-to-csv": "^1.4.0",
4243
"i18next": "^23.8.2",
4344
"i18next-http-backend": "2.5.0",
4445
"jsurl": "^0.1.5",

packages/manager/apps/zimbra/public/translations/common/Messages_fr_FR.json

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,5 +101,25 @@
101101
"service_state_suspended": "Suspendu",
102102
"service_state_error": "Erreur",
103103
"service_state_ready": "Actif",
104-
"service_state_updating": "Mise à jour"
104+
"service_state_updating": "Mise à jour",
105+
"service_state_billinglocked": "Problème de facturation",
106+
"service_state_blockedforspam": "Suspendu pour activité suspecte",
107+
"export_success": "Le fichier a été correctement créé. Si le téléchargement ne démarre pas, vous pouvez le télécharger manuellement.",
108+
"export_error": "Le fichier n'a pas pu être créé. {{ error }}",
109+
"export_download_manually": "Télécharger ici",
110+
"last_connection": "Dernière connexion",
111+
"quota_used": "Quota utilisé",
112+
"quota_available": "Quota disponible",
113+
"hide_in_gal": "Adresse cachée dans l'annuaire",
114+
"contactInformation_profession": "Profession",
115+
"contactInformation_office": "Bureau",
116+
"contactInformation_service": "Service",
117+
"contactInformation_company": "Société",
118+
"contactInformation_mobileNumber": "Numéro de téléphone portable",
119+
"contactInformation_phoneNumber": "Numéro de téléphone",
120+
"contactInformation_faxNumber": "Numéro de fax",
121+
"contactInformation_street": "Rue",
122+
"contactInformation_postcode": "Code postal",
123+
"contactInformation_city": "Ville",
124+
"contactInformation_country": "Pays"
105125
}

packages/manager/apps/zimbra/src/data/api/service/type.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export type SlotService = {
1313
nextBillingDate?: string;
1414
state: keyof typeof ServiceBillingState;
1515
planCode?: ZimbraPlanCodes;
16+
price?: string;
1617
};
1718

1819
export const SlotServiceTerminationPolicy = {

packages/manager/apps/zimbra/src/data/api/service/utils.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export const makeSlotService = (service: ServiceDetails): SlotService => {
2424
nextBillingDate: service.billing?.nextBillingDate,
2525
state: getServiceBillingState(service),
2626
planCode: service.billing.plan.code as ZimbraPlanCodes,
27+
price: service.billing.pricing.price.text,
2728
};
2829
};
2930

packages/manager/apps/zimbra/src/pages/dashboard/domains/ActionButton.spec.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import React from 'react';
22

33
import { describe, expect } from 'vitest';
44

5+
import actionsCommonTranslation from '@ovh-ux/manager-common-translations/dist/@ovh-ux/manager-common-translations/actions/Messages_fr_FR.json';
6+
57
import commonTranslation from '@/public/translations/common/Messages_fr_FR.json';
68
import { render } from '@/utils/test.provider';
79

@@ -26,10 +28,10 @@ describe('Domains datagrid action menu', () => {
2628

2729
expect(menuItems.length).toBe(3);
2830

29-
expect(menuItems[0]).toHaveAttribute('label', 'configure');
31+
expect(menuItems[0]).toHaveAttribute('label', actionsCommonTranslation.configure);
3032

3133
expect(menuItems[1]).toHaveAttribute('label', commonTranslation.diagnostics);
3234

33-
expect(menuItems[2]).toHaveAttribute('label', 'delete');
35+
expect(menuItems[2]).toHaveAttribute('label', actionsCommonTranslation.delete);
3436
});
3537
});

packages/manager/apps/zimbra/src/pages/dashboard/emailAccounts/ActionButton.spec.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import React from 'react';
22

33
import { describe, expect } from 'vitest';
44

5+
import actionsCommonTranslation from '@ovh-ux/manager-common-translations/dist/@ovh-ux/manager-common-translations/actions/Messages_fr_FR.json';
6+
57
import commonTranslation from '@/public/translations/common/Messages_fr_FR.json';
68
import { render } from '@/utils/test.provider';
79

@@ -29,10 +31,10 @@ describe('EmailAccounts datagrid action menu', () => {
2931

3032
expect(menuItems.length).toBe(3);
3133

32-
expect(menuItems[0]).toHaveAttribute('label', 'modify');
34+
expect(menuItems[0]).toHaveAttribute('label', actionsCommonTranslation.modify);
3335

3436
expect(menuItems[1]).toHaveAttribute('label', commonTranslation.alias);
3537

36-
expect(menuItems[2]).toHaveAttribute('label', 'delete');
38+
expect(menuItems[2]).toHaveAttribute('label', actionsCommonTranslation.delete);
3739
});
3840
});

packages/manager/apps/zimbra/src/pages/dashboard/emailAccounts/DatagridTopBar.component.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useMemo } from 'react';
1+
import { useMemo } from 'react';
22

33
import { useNavigate } from 'react-router-dom';
44

@@ -20,10 +20,13 @@ import { useAccountsStatistics, useGenerateUrl } from '@/hooks';
2020
import { ADD_EMAIL_ACCOUNT, ORDER_ZIMBRA_EMAIL_ACCOUNT } from '@/tracking.constants';
2121
import { IAM_ACTIONS } from '@/utils/iamAction.constants';
2222

23+
import { EmailAccountsExportCsv } from './EmailAccountsExportCsv.component';
24+
2325
export const DatagridTopbar = () => {
2426
const { t } = useTranslation(['accounts', 'common']);
2527
const { trackClick } = useOvhTracking();
2628
const navigate = useNavigate();
29+
2730
const { platformUrn } = usePlatform();
2831
const { accountsStatistics } = useAccountsStatistics();
2932

@@ -98,6 +101,7 @@ export const DatagridTopbar = () => {
98101
onClick={handleOrderEmailAccountClick}
99102
label={t('zimbra_account_account_order')}
100103
/>
104+
<EmailAccountsExportCsv />
101105
</div>
102106
);
103107
};

packages/manager/apps/zimbra/src/pages/dashboard/emailAccounts/EmailAccountForm.spec.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import '@testing-library/jest-dom';
77
import 'element-internals-polyfill';
88
import { describe, expect, vi } from 'vitest';
99

10+
import actionsCommonTranslation from '@ovh-ux/manager-common-translations/dist/@ovh-ux/manager-common-translations/actions/Messages_fr_FR.json';
11+
1012
import { accountMock, platformMock } from '@/data/api';
1113
import { act, render, waitFor } from '@/utils/test.provider';
1214
import { OdsHTMLElement } from '@/utils/test.utils';
@@ -21,7 +23,7 @@ describe('email account add and edit form', () => {
2123
expect(queryByTestId('spinner')).toBeNull();
2224
});
2325

24-
expect(getByTestId('confirm-btn')).toHaveAttribute('label', 'confirm');
26+
expect(getByTestId('confirm-btn')).toHaveAttribute('label', actionsCommonTranslation.confirm);
2527
});
2628

2729
it('should be in edit mode if accountId', async () => {
@@ -35,7 +37,7 @@ describe('email account add and edit form', () => {
3537
await waitFor(() => {
3638
expect(queryByTestId('spinner')).toBeNull();
3739
});
38-
expect(getByTestId('confirm-btn')).toHaveAttribute('label', 'save');
40+
expect(getByTestId('confirm-btn')).toHaveAttribute('label', actionsCommonTranslation.save);
3941
});
4042

4143
// @TODO: find why this test is inconsistent

0 commit comments

Comments
 (0)