Skip to content

Commit 1148d15

Browse files
authored
feat: add csv export to users and group tables (#124)
Signed-off-by: Abdelsalem <[email protected]>
1 parent f4ba015 commit 1148d15

File tree

7 files changed

+78
-6
lines changed

7 files changed

+78
-6
lines changed

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"dependencies": {
1717
"@emotion/react": "^11.14.0",
1818
"@emotion/styled": "^11.14.0",
19-
"@gridsuite/commons-ui": "0.106.0",
19+
"@gridsuite/commons-ui": "0.112.0",
2020
"@hookform/resolvers": "^4.0.0",
2121
"@mui/icons-material": "^5.16.14",
2222
"@mui/lab": "5.0.0-alpha.175",

src/components/App/app-wrapper.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import {
2525
LIGHT_THEME,
2626
loginEn,
2727
loginFr,
28+
tableEn,
29+
tableFr,
2830
NotificationsProvider,
2931
SnackbarProvider,
3032
topBarEn,
@@ -119,12 +121,14 @@ const messages: Record<GsLangUser, IntlConfig['messages']> = {
119121
...loginEn,
120122
...topBarEn,
121123
...cardErrorBoundaryEn,
124+
...tableEn,
122125
},
123126
fr: {
124127
...messages_fr,
125128
...loginFr,
126129
...topBarFr,
127130
...cardErrorBoundaryFr,
131+
...tableFr,
128132
},
129133
};
130134

src/components/Grid/GridTable.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export interface GridTableProps<TData>
3636
PropsWithChildren<{}> {
3737
//accessRef: RefObject<GridTableRef<TData, TContext>>;
3838
dataLoader: () => Promise<TData[]>;
39+
alignedRightToolbarContent?: ReactNode;
3940
}
4041

4142
/*
@@ -58,7 +59,7 @@ export const GridTable: GridTableWithRef = forwardRef(function AgGridToolbar<TDa
5859
props: PropsWithChildren<GridTableProps<TData>>,
5960
gridRef: ForwardedRef<GridTableRef<TData, TContext>>
6061
): ReactNode {
61-
const { children: toolbarContent, context, dataLoader, ...agGridProps } = props;
62+
const { children: toolbarContent, alignedRightToolbarContent, context, dataLoader, ...agGridProps } = props;
6263
const { snackError } = useSnackMessage();
6364

6465
const [data, setData] = useState<TData[] | null>(null);
@@ -95,6 +96,7 @@ export const GridTable: GridTableWithRef = forwardRef(function AgGridToolbar<TDa
9596
>
9697
{toolbarContent}
9798
<Box sx={{ flexGrow: 1 }} />
99+
{alignedRightToolbarContent}
98100
</Toolbar>
99101
</AppBar>
100102
</Grid>
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/**
2+
* Copyright (c) 2025, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
*/
7+
8+
import { useMemo, RefObject } from 'react';
9+
import { CsvExport, GsLang } from '@gridsuite/commons-ui';
10+
import { IntlShape } from 'react-intl';
11+
import { GridTableRef } from '../../components/Grid';
12+
import { ColDef } from 'ag-grid-community';
13+
14+
export function useCsvExport<TData>({
15+
gridRef,
16+
columns,
17+
tableNameId,
18+
intl,
19+
language,
20+
}: {
21+
gridRef: RefObject<GridTableRef<TData>>;
22+
columns: ColDef[];
23+
tableNameId: string;
24+
intl: IntlShape;
25+
language: GsLang;
26+
}) {
27+
return useMemo(
28+
() => (
29+
<CsvExport
30+
columns={columns}
31+
tableName={intl.formatMessage({ id: tableNameId })}
32+
disabled={false}
33+
skipColumnHeaders={false}
34+
language={language}
35+
exportDataAsCsv={(params) => gridRef?.current?.aggrid?.api?.exportDataAsCsv(params)}
36+
/>
37+
),
38+
[gridRef, columns, intl, language, tableNameId]
39+
);
40+
}

src/pages/groups/groups-table.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@ import { GridButton, GridButtonDelete, GridTable, GridTableRef } from '../../com
1212
import { GroupInfos, UserAdminSrv, UserInfos } from '../../services';
1313
import { ColDef, GetRowIdParams, RowClickedEvent, TextFilterParams } from 'ag-grid-community';
1414
import { useSnackMessage } from '@gridsuite/commons-ui';
15+
import { useCsvExport } from '../common/use-csv-export';
1516
import DeleteConfirmationDialog from '../common/delete-confirmation-dialog';
1617
import { defaultColDef, defaultRowSelection } from '../common/table-config';
1718
import MultiChipCellRenderer from '../common/multi-chip-cell-renderer';
1819
import { useTableSelection } from '../../utils/hooks';
20+
import { useSelector } from 'react-redux';
21+
import { AppState } from '../../redux/reducer';
1922

2023
export interface GroupsTableProps {
2124
gridRef: RefObject<GridTableRef<GroupInfos>>;
@@ -29,6 +32,7 @@ const GroupsTable: FunctionComponent<GroupsTableProps> = (props) => {
2932

3033
const { rowsSelection, onSelectionChanged, onFilterChanged } = useTableSelection<GroupInfos>();
3134
const [showDeletionDialog, setShowDeletionDialog] = useState(false);
35+
const language = useSelector((state: AppState) => state.computedLanguage);
3236

3337
function getRowId(params: GetRowIdParams<GroupInfos>): string {
3438
return params.data.name;
@@ -97,6 +101,14 @@ const GroupsTable: FunctionComponent<GroupsTableProps> = (props) => {
97101
[intl]
98102
);
99103

104+
const csvExportComponent = useCsvExport<GroupInfos>({
105+
gridRef: props.gridRef,
106+
columns,
107+
tableNameId: 'appBar.tabs.groups',
108+
intl,
109+
language,
110+
});
111+
100112
return (
101113
<>
102114
<GridTable<GroupInfos, {}>
@@ -111,6 +123,7 @@ const GroupsTable: FunctionComponent<GroupsTableProps> = (props) => {
111123
onRowClicked={props.onRowClicked}
112124
onSelectionChanged={onSelectionChanged}
113125
onFilterChanged={onFilterChanged}
126+
alignedRightToolbarContent={csvExportComponent}
114127
>
115128
<GridButton
116129
labelId="groups.table.toolbar.add.label"

src/pages/users/users-table.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ import DeleteConfirmationDialog from '../common/delete-confirmation-dialog';
1616
import { defaultColDef, defaultRowSelection } from '../common/table-config';
1717
import MultiChipCellRenderer from '../common/multi-chip-cell-renderer';
1818
import { useTableSelection } from '../../utils/hooks';
19+
import { useSelector } from 'react-redux';
20+
import { AppState } from '../../redux/reducer';
21+
import { useCsvExport } from '../common/use-csv-export';
1922

2023
export interface UsersTableProps {
2124
gridRef: RefObject<GridTableRef<UserInfos>>;
@@ -29,6 +32,7 @@ const UsersTable: FunctionComponent<UsersTableProps> = (props) => {
2932

3033
const { rowsSelection, onSelectionChanged, onFilterChanged } = useTableSelection<UserInfos>();
3134
const [showDeletionDialog, setShowDeletionDialog] = useState(false);
35+
const language = useSelector((state: AppState) => state.computedLanguage);
3236

3337
function getRowId(params: GetRowIdParams<UserInfos>): string {
3438
return params.data.sub ?? '';
@@ -98,6 +102,14 @@ const UsersTable: FunctionComponent<UsersTableProps> = (props) => {
98102
[intl]
99103
);
100104

105+
const csvExportComponent = useCsvExport<UserInfos>({
106+
gridRef: props.gridRef,
107+
columns,
108+
tableNameId: 'appBar.tabs.users',
109+
intl,
110+
language,
111+
});
112+
101113
return (
102114
<>
103115
<GridTable<UserInfos, {}>
@@ -112,6 +124,7 @@ const UsersTable: FunctionComponent<UsersTableProps> = (props) => {
112124
onSelectionChanged={onSelectionChanged}
113125
onFilterChanged={onFilterChanged}
114126
tooltipShowDelay={1000}
127+
alignedRightToolbarContent={csvExportComponent}
115128
>
116129
<GridButton
117130
labelId="users.table.toolbar.add.label"

0 commit comments

Comments
 (0)