Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

B-21962: Create Requested Users Report #14768

Merged
Merged
Changes from 10 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
0e9fce6
Export implementation complete
TevinAdams Feb 7, 2025
04fb88b
Merge branch 'B-21962-Create-Requested-Users-Report' into B-21962-Cre…
TevinAdams Feb 7, 2025
0275008
Merge branch 'integrationTesting' into B-21962-Create-Requested-Users…
TevinAdams Feb 7, 2025
c1d8a92
Merge branch 'integrationTesting' into B-21962-Create-Requested-Users…
TevinAdams Feb 7, 2025
69c2053
Merge branch 'integrationTesting' into B-21962-Create-Requested-Users…
TevinAdams Feb 7, 2025
3659078
Merge branch 'integrationTesting' into B-21962-Create-Requested-Users…
TevinAdams Feb 7, 2025
543222d
Export adjustment
TevinAdams Feb 7, 2025
d678bda
Export adjustment
TevinAdams Feb 7, 2025
d457059
Merge branch 'main' into B-21962-Create-Requested-Users-Report
TevinAdams Feb 10, 2025
6f78c93
Functional change for export
TevinAdams Feb 10, 2025
5d51a36
Merge branch 'integrationTesting' into B-21962-Create-Requested-Users…
TevinAdams Feb 10, 2025
1c4d4bd
Merge branch 'B-21962-Create-Requested-Users-Report' into B-21962-Cre…
TevinAdams Feb 10, 2025
41603e2
Merge branch 'integrationTesting' into B-21962-Create-Requested-Users…
TevinAdams Feb 11, 2025
a5e32b0
Merge branch 'integrationTesting' into B-21962-Create-Requested-Users…
TevinAdams Feb 11, 2025
5535795
Merge branch 'integrationTesting' into B-21962-Create-Requested-Users…
TevinAdams Feb 11, 2025
2401ad4
Merge branch 'integrationTesting' into B-21962-Create-Requested-Users…
TevinAdams Feb 11, 2025
8e51252
CSV header adjustment
TevinAdams Feb 11, 2025
612ef47
Merge branch 'B-21962-Create-Requested-Users-Report' into B-21962-Cre…
TevinAdams Feb 11, 2025
505474d
Merge branch 'integrationTesting' into B-21962-Create-Requested-Users…
TevinAdams Feb 11, 2025
60351ef
Merge branch 'integrationTesting' into B-21962-Create-Requested-Users…
TevinAdams Feb 12, 2025
42ecaa9
Merge branch 'integrationTesting' into B-21962-Create-Requested-Users…
TevinAdams Feb 12, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
126 changes: 98 additions & 28 deletions src/pages/Admin/RequestedOfficeUsers/RequestedOfficeUserList.jsx
Original file line number Diff line number Diff line change
@@ -1,22 +1,32 @@
import { React } from 'react';
import { Toolbar } from '@material-ui/core';
import {
Datagrid,
DateField,
Filter,
List,
ReferenceField,
TextField,
TopToolbar,
ArrayField,
SearchInput,
useRecordContext,
BulkExportButton,
downloadCSV,
useListContext,
Button,
useDataProvider,
} from 'react-admin';
import jsonExport from 'jsonexport/dist';

import AdminPagination from 'scenes/SystemAdmin/shared/AdminPagination';

// Overriding the default toolbar
const ListActions = () => {
return <TopToolbar />;
return (
<Toolbar>
<BulkExportButton />
</Toolbar>
);
};

const RequestedOfficeUserListFilter = () => (
Expand All @@ -29,7 +39,7 @@ const RequestedOfficeUserListFilter = () => (

const defaultSort = { field: 'createdAt', order: 'DESC' };

const RolesTextField = (user) => {
const UserRolesToString = (user) => {
const { roles } = user;

let roleStr = '';
Expand All @@ -46,32 +56,92 @@ const RolesTextField = (user) => {

const RolesField = () => {
const record = useRecordContext();
return <div>{RolesTextField(record)}</div>;
return <div>{UserRolesToString(record)}</div>;
};

const RequestedOfficeUserList = () => (
<List
pagination={<AdminPagination />}
perPage={25}
sort={defaultSort}
filters={<RequestedOfficeUserListFilter />}
actions={<ListActions />}
>
<Datagrid bulkActionButtons={false} rowClick="show" data-testid="requested-office-user-fields">
<TextField source="id" />
<TextField source="email" />
<TextField source="firstName" />
<TextField source="lastName" />
<ReferenceField label="Transportation Office" source="transportationOfficeId" reference="offices" link={false}>
<TextField source="name" />
</ReferenceField>
<TextField source="status" />
<DateField showTime source="createdAt" label="Requested on" />
<ArrayField source="roles" sortable={false} clickable={false} sort={{ field: 'roleName', order: 'DESC' }}>
<RolesField />
</ArrayField>
</Datagrid>
</List>
);
const exportButtonHandleOnClick = async (data, dataProvider, selectedIds) => {
const allRequestedOfficeUsers = data;

const selectedUserIdObjects = {};
selectedIds.forEach((id) => {
if (!selectedUserIdObjects[`${id}`]) {
selectedUserIdObjects[`${id}`] = id;
}
});

const selectedUsers = [];
allRequestedOfficeUsers.forEach((user) => {
if (selectedUserIdObjects[`${user.id}`]) {
selectedUsers.push(user);
}
});

const officeObjects = {};
const offices = await dataProvider.getMany('offices');
offices.data.forEach((office) => {
if (!officeObjects[`${office.id}`]) {
officeObjects[`${office.id}`] = office;
}
});

const usersWithTransportationOfficeName = selectedUsers.map((user) => ({
...user,
transportationOfficeName: officeObjects[user.transportationOfficeId]?.name,
}));

const userToCSV = [];
usersWithTransportationOfficeName.forEach((user) => {
const userRoles = UserRolesToString(user);
const csvUser = {
Id: user.id,
Email: user.email,
'First Name': user.firstName,
'Last Name': user.lastName,
'Transportation Office': user.transportationOfficeName,
Status: user.status,
'Requested On': user.createdAt,
Roles: userRoles,
};

userToCSV.push(csvUser);
});

jsonExport(userToCSV, (err, csv) => {
downloadCSV(csv, 'Requested_Office_Users');
});
};

const CustomBulkActions = ({ selectedIds }) => {
const { data } = useListContext();
const dataProvider = useDataProvider();
return <Button label="Export" onClick={() => exportButtonHandleOnClick(data, dataProvider, selectedIds)} />;
};

const RequestedOfficeUserList = () => {
return (
<List
pagination={<AdminPagination />}
perPage={25}
sort={defaultSort}
filters={<RequestedOfficeUserListFilter />}
actions={<ListActions />}
>
<Datagrid bulkActionButtons={<CustomBulkActions />} rowClick="show" data-testid="requested-office-user-fields">
<TextField source="id" />
<TextField source="email" />
<TextField source="firstName" />
<TextField source="lastName" />
<ReferenceField label="Transportation Office" source="transportationOfficeId" reference="offices" link={false}>
<TextField source="name" />
</ReferenceField>
<TextField source="status" />
<DateField showTime source="createdAt" label="Requested on" />
<ArrayField source="roles" sortable={false} clickable={false} sort={{ field: 'roleName', order: 'DESC' }}>
<RolesField />
</ArrayField>
</Datagrid>
</List>
);
};

export default RequestedOfficeUserList;