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 22559 add filtering to rejected tab int #14938

Open
wants to merge 24 commits into
base: integrationTesting
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
d3f8d84
Merge branch 'B-21966-Add-Rejected-Admin-MAIN' into B-22559-Add-Filte…
KonstanceH Feb 20, 2025
56c01a9
Merge branch 'main' into B-22559-Add-Filtering-To-Rejected-Tab
KonstanceH Feb 21, 2025
1210d4b
added filter button and styling
KonstanceH Feb 25, 2025
7ad4c72
Merge branch 'main' of github.com:transcom/mymove into MAIN-B-22039-r…
ryan-mchugh Feb 25, 2025
38d8bd6
fix filters display
KonstanceH Feb 26, 2025
27cdcd5
adding some frontend coverage
KonstanceH Feb 27, 2025
8191575
Merge branch 'main' of github.com:transcom/mymove into MAIN-B-22039-r…
ryan-mchugh Feb 28, 2025
29c9e8a
Merge branch 'main' of github.com:transcom/mymove into MAIN-B-22039-r…
ryan-mchugh Feb 28, 2025
3ebb152
Merge branch 'main' into MAIN-B-22039-remove_lat_lon
brianmanley-caci Mar 3, 2025
be8a59a
Merge branch 'main' into MAIN-B-22039-remove_lat_lon
brianmanley-caci Mar 3, 2025
d13d25a
Merge pull request #14924 from transcom/MAIN-B-22039-remove_lat_lon
brianmanley-caci Mar 3, 2025
a7edba6
merging in latest main and fix conflicts
KonstanceH Mar 3, 2025
0b306db
update test
KonstanceH Mar 3, 2025
b4649fb
update test
KonstanceH Mar 3, 2025
14d6d15
merge in dependency main branch
KonstanceH Mar 4, 2025
5fb1be7
mergining in from main
KonstanceH Mar 4, 2025
f5c9499
remove duplicate migration
KonstanceH Mar 4, 2025
fe633a8
put back test
KonstanceH Mar 4, 2025
d76e361
Merge branch 'integrationTesting' into B-22559-Add-Filtering-To-Rejec…
KonstanceH Mar 4, 2025
abc6e63
keep email in main search
KonstanceH Mar 4, 2025
a6fddd7
added tests and fixed rejectedOn filter. Working weird behavior
KonstanceH Mar 4, 2025
8f4f9d6
missed assert
KonstanceH Mar 4, 2025
db4619b
Merge branch 'integrationTesting' into B-22559-Add-Filtering-To-Rejec…
KonstanceH Mar 4, 2025
e8dc583
merge in changes from main
KonstanceH Mar 4, 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
44 changes: 43 additions & 1 deletion pkg/handlers/adminapi/rejected_office_users.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,49 @@ var rejectedOfficeUserFilterConverters = map[string]func(string) func(*pop.Query
"search": func(content string) func(*pop.Query) {
return func(query *pop.Query) {
nameSearch := fmt.Sprintf("%%%s%%", content)
query.Where("roles.role_name ILIKE ? AND office_users.status = 'REJECTED' OR transportation_offices.name ILIKE ? AND office_users.status = 'REJECTED' OR office_users.email ILIKE ? AND office_users.status = 'REJECTED' OR office_users.first_name ILIKE ? AND office_users.status = 'REJECTED' OR office_users.last_name ILIKE ? AND office_users.status = 'REJECTED'", nameSearch, nameSearch, nameSearch, nameSearch, nameSearch)
query.Where("office_users.first_name ILIKE ? AND office_users.status = 'REJECTED' OR office_users.last_name ILIKE ? AND office_users.status = 'REJECTED' OR office_users.email ILIKE ? AND office_users.status = 'REJECTED'", nameSearch, nameSearch, nameSearch)
}
},
"emails": func(content string) func(*pop.Query) {
return func(query *pop.Query) {
nameSearch := fmt.Sprintf("%%%s%%", content)
query.Where("office_users.email ILIKE ? AND office_users.status = 'REJECTED'", nameSearch)
}
},
"firstName": func(content string) func(*pop.Query) {
return func(query *pop.Query) {
nameSearch := fmt.Sprintf("%%%s%%", content)
query.Where("office_users.first_name ILIKE ? AND office_users.status = 'REJECTED'", nameSearch)
}
},
"lastName": func(content string) func(*pop.Query) {
return func(query *pop.Query) {
nameSearch := fmt.Sprintf("%%%s%%", content)
query.Where("office_users.last_name ILIKE ? AND office_users.status = 'REJECTED'", nameSearch)
}
},
"offices": func(content string) func(*pop.Query) {
return func(query *pop.Query) {
nameSearch := fmt.Sprintf("%%%s%%", content)
query.Where("transportation_offices.name ILIKE ? AND office_users.status = 'REJECTED'", nameSearch)
}
},
"rejectionReason": func(content string) func(*pop.Query) {
return func(query *pop.Query) {
nameSearch := fmt.Sprintf("%%%s%%", content)
query.Where("office_users.rejection_reason ILIKE ? AND office_users.status = 'REJECTED'", nameSearch)
}
},
"rejectedOn": func(content string) func(*pop.Query) {
return func(query *pop.Query) {
nameSearch := fmt.Sprintf("%%%s%%", content)
query.Where("office_users.rejected_on ILIKE ? AND office_users.status = 'REJECTED'", nameSearch)
}
},
"roles": func(content string) func(*pop.Query) {
return func(query *pop.Query) {
nameSearch := fmt.Sprintf("%%%s%%", content)
query.Where("roles.role_name ILIKE ? AND office_users.status = 'REJECTED'", nameSearch)
Copy link
Contributor

@cameroncaci cameroncaci Mar 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you add backend test coverage for explicit checks on these cases?

Copy link
Contributor Author

@KonstanceH KonstanceH Mar 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done! Adding the tests ended up showing where I had holes so I updated some logic for the searches too. I'm holding off on asking for a rereview until I address all my pr comments.

}
},
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ func (suite *RejectedOfficeUsersServiceSuite) TestFetchRejectedOfficeUserList()
factory.BuildOfficeUserWithRoles(suite.DB(), []factory.Customization{
{
Model: models.OfficeUser{
Status: &rejectedStatus,
Status: &rejectedStatus,
},
},
}, []roles.RoleType{roles.RoleTypeTOO})
Expand Down
32 changes: 26 additions & 6 deletions src/pages/Admin/RejectedOfficeUsers/RejectedOfficeUserList.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,19 @@ import React from 'react';
import {
Datagrid,
DateField,
Filter,
List,
ReferenceField,
TextField,
TextInput,
TopToolbar,
useRecordContext,
SearchInput,
FilterForm,
FilterButton,
} from 'react-admin';

import styles from './RejectedOfficeUserList.module.scss';

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

const RejectedOfficeUserShowRoles = () => {
Expand All @@ -33,20 +37,36 @@ const ListActions = () => {
return <TopToolbar />;
};

const RejectedOfficeUserListFilter = () => (
<Filter>
<TextInput source="search" alwaysOn />
</Filter>
const filterList = [
<SearchInput source="search" alwaysOn />,
<TextInput label="Email" source="emails" />,
<TextInput label="First Name" source="firstName" />,
<TextInput label="Last Name" source="lastName" />,
<TextInput label="Office" source="offices" />,
<TextInput label="Rejection Reason" source="rejectionReason" />,
<TextInput label="Rejected On" source="rejectedOn" />,
<TextInput label="Roles" source="roles" />,
];

const SearchFilters = () => (
<div className={styles.searchContainer}>
<div className={styles.searchBar}>
<FilterForm filters={filterList} />
</div>
<div className={styles.filters}>
<FilterButton filters={filterList} />
</div>
</div>
);

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

const RejectedOfficeUserList = () => (
<List
filters={<SearchFilters />}
pagination={<AdminPagination />}
perPage={25}
sort={defaultSort}
filters={<RejectedOfficeUserListFilter />}
actions={<ListActions />}
>
<Datagrid bulkActionButtons={false} rowClick="show" data-testid="rejected-office-user-fields">
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
@import 'shared/styles/colors.scss';

.searchContainer {
display: flex;
align-items: flex-end;

.searchBar {
float: left;
}

.filters {
padding-bottom: 5px;
}
}
33 changes: 33 additions & 0 deletions src/shared/Inputs/YesNoBoolen.test.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import YesNoBoolean from './YesNoBoolean';
import { fireEvent, getByLabelText, render } from '@testing-library/react';
import { Provider } from 'react-redux';
import { configureStore } from 'shared/store';

const testProps = {
input: {
value: true,
onChange: jest.fn(),
},
};

describe('YesNoBoolean', () => {
describe('with default props', () => {
it('renders without errors', () => {
const mockStore = configureStore({});
render(
<Provider store={mockStore.store}>
<YesNoBoolean {...testProps} />
</Provider>,
);
});

it('renders without input', () => {
const mockStore = configureStore({});
render(
<Provider store={mockStore.store}>
<YesNoBoolean />
</Provider>,
);
});
});
});