Skip to content

Commit

Permalink
Merge pull request #14768 from transcom/B-21962-Create-Requested-User…
Browse files Browse the repository at this point in the history
…s-Report-Int

B-21962: Create Requested Users Report
  • Loading branch information
TevinAdams authored Feb 12, 2025
2 parents 363b154 + 42ecaa9 commit 6d25068
Showing 1 changed file with 80 additions and 30 deletions.
110 changes: 80 additions & 30 deletions src/pages/Admin/RequestedOfficeUsers/RequestedOfficeUserList.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,15 @@ import {
TextInput,
TopToolbar,
useRecordContext,
downloadCSV,
useDataProvider,
ExportButton,
useListController,
} from 'react-admin';
import jsonExport from 'jsonexport/dist';

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

// Overriding the default toolbar
const ListActions = () => {
return <TopToolbar />;
};
const RequestedOfficeUserListFilter = (props) => (
<Filter {...props}>
<TextInput label="Search by Name/Email" source="search" alwaysOn resettable />
Expand All @@ -28,7 +29,7 @@ const RequestedOfficeUserListFilter = (props) => (

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

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

let roleStr = '';
Expand All @@ -45,32 +46,81 @@ 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 ListActions = () => {
const { total, resource, sort, filterValues } = useListController();
const dataProvider = useDataProvider();

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

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

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

// convert data to csv and download
jsonExport(usersForExport, {}, (err, csv) => {
if (err) throw err;
downloadCSV(csv, 'requested_office_users');
});
};

return (
<TopToolbar>
<ExportButton disabled={total === 0} resource={resource} sort={sort} filter={filterValues} exporter={exporter} />
</TopToolbar>
);
};

const RequestedOfficeUserList = () => {
return (
<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>
);
};

export default RequestedOfficeUserList;

0 comments on commit 6d25068

Please sign in to comment.