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

Open
wants to merge 11 commits into
base: integrationTesting
Choose a base branch
from
126 changes: 96 additions & 30 deletions src/pages/Admin/RequestedOfficeUsers/RequestedOfficeUserList.jsx
Original file line number Diff line number Diff line change
@@ -1,23 +1,25 @@
import { React } from 'react';
import { Toolbar } from '@material-ui/core';
import {
Datagrid,
DateField,
Filter,
List,
ReferenceField,
TextField,
TopToolbar,
ArrayField,
SearchInput,
useRecordContext,
BulkExportButton,
downloadCSV,
useListContext,
useDataProvider,
} 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 = () => (
<Filter>
Expand All @@ -29,7 +31,7 @@ const RequestedOfficeUserListFilter = () => (

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

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

let roleStr = '';
Expand All @@ -46,32 +48,96 @@ 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 handleExport = 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 <BulkExportButton label="Export" onClick={() => handleExport(data, dataProvider, selectedIds)} />;
};
const ListActions = () => {
return <Toolbar />;
};

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;