From 49897a21edf0f301bc2f235955a4d52a74890157 Mon Sep 17 00:00:00 2001 From: Dmitri Korin Date: Fri, 27 Sep 2024 15:29:38 -0700 Subject: [PATCH 1/2] Add complaint method filter option --- .../complaints/complaint-filter-parameters.ts | 1 + .../src/v1/complaint/complaint.controller.ts | 9 +- backend/src/v1/complaint/complaint.service.ts | 24 ++- .../complaints/complaint-filter-bar.tsx | 10 ++ .../complaints/complaint-filter.tsx | 167 +++++++++++------- .../containers/complaints/complaint-list.tsx | 2 + .../containers/complaints/complaint-map.tsx | 16 +- .../providers/complaint-filter-provider.tsx | 1 + frontend/src/app/store/reducers/complaints.ts | 4 + .../app/types/complaints/complaint-filters.ts | 1 + .../complaint-filters/complaint-filters.ts | 2 + migrations/migrations/R__Create-Test-Data.sql | 4 + 12 files changed, 169 insertions(+), 72 deletions(-) diff --git a/backend/src/types/models/complaints/complaint-filter-parameters.ts b/backend/src/types/models/complaints/complaint-filter-parameters.ts index e212574b5..c61ef73bb 100644 --- a/backend/src/types/models/complaints/complaint-filter-parameters.ts +++ b/backend/src/types/models/complaints/complaint-filter-parameters.ts @@ -10,4 +10,5 @@ export interface ComplaintFilterParameters { incidentReportedEnd?: Date; status?: string; girTypeCode?: string; + complaintMethod?: string; } diff --git a/backend/src/v1/complaint/complaint.controller.ts b/backend/src/v1/complaint/complaint.controller.ts index 27b743795..ece547b7e 100644 --- a/backend/src/v1/complaint/complaint.controller.ts +++ b/backend/src/v1/complaint/complaint.controller.ts @@ -41,8 +41,13 @@ export class ComplaintController { @Get("/map/search/:complaintType") @Roles(Role.COS_OFFICER, Role.CEEB) - mapSearch(@Param("complaintType") complaintType: COMPLAINT_TYPE, @Query() model: ComplaintSearchParameters) { - return this.service.mapSearch(complaintType, model); + mapSearch( + @Param("complaintType") complaintType: COMPLAINT_TYPE, + @Query() model: ComplaintSearchParameters, + @Request() req, + ) { + const hasCEEBRole = hasRole(req, "CEEB"); + return this.service.mapSearch(complaintType, model, hasCEEBRole); } @Get("/search/:complaintType") diff --git a/backend/src/v1/complaint/complaint.service.ts b/backend/src/v1/complaint/complaint.service.ts index ae4e01af8..331069b24 100644 --- a/backend/src/v1/complaint/complaint.service.ts +++ b/backend/src/v1/complaint/complaint.service.ts @@ -254,6 +254,7 @@ export class ComplaintService { speciesCode, violationCode, girTypeCode, + complaintMethod, }: ComplaintFilterParameters, complaintType: COMPLAINT_TYPE, ): SelectQueryBuilder { @@ -311,6 +312,11 @@ export class ComplaintService { ViolationCode: violationCode, }); } + if (complaintMethod) { + builder.andWhere("method_xref.complaint_method_received_code = :ComplaintMethod", { + ComplaintMethod: complaintMethod, + }); + } break; } case "GIR": { @@ -938,7 +944,11 @@ export class ComplaintService { } }; - mapSearch = async (complaintType: COMPLAINT_TYPE, model: ComplaintSearchParameters): Promise => { + mapSearch = async ( + complaintType: COMPLAINT_TYPE, + model: ComplaintSearchParameters, + hasCEEBRole: boolean, + ): Promise => { const { orderBy, sortBy, page, pageSize, query, ...filters } = model; try { @@ -967,6 +977,12 @@ export class ComplaintService { }); } + //-- added this for consistency with search method + //-- return Waste and Pestivide complaints for CEEB users + if (hasCEEBRole && complaintType === "ERS") { + complaintBuilder.andWhere("violation_code.agency_code = :agency", { agency: "EPO" }); + } + //-- filter locations without coordinates complaintBuilder.andWhere("ST_X(complaint.location_geometry_point) <> 0"); complaintBuilder.andWhere("ST_Y(complaint.location_geometry_point) <> 0"); @@ -994,6 +1010,12 @@ export class ComplaintService { }); } + //-- added this for consistency with search method + //-- return Waste and Pestivide complaints for CEEB users + if (hasCEEBRole && complaintType === "ERS") { + unMappedBuilder.andWhere("violation_code.agency_code = :agency", { agency: "EPO" }); + } + //-- filter locations without coordinates unMappedBuilder.andWhere("ST_X(complaint.location_geometry_point) = 0"); unMappedBuilder.andWhere("ST_Y(complaint.location_geometry_point) = 0"); diff --git a/frontend/src/app/components/containers/complaints/complaint-filter-bar.tsx b/frontend/src/app/components/containers/complaints/complaint-filter-bar.tsx index e1fbdfdcd..9c253d1a5 100644 --- a/frontend/src/app/components/containers/complaints/complaint-filter-bar.tsx +++ b/frontend/src/app/components/containers/complaints/complaint-filter-bar.tsx @@ -40,6 +40,7 @@ export const ComplaintFilterBar: FC = ({ natureOfComplaint, violationType, girType, + complaintMethod, } = state; const dateRangeLabel = (): string | undefined => { @@ -209,6 +210,15 @@ export const ComplaintFilterBar: FC = ({ clear={removeFilter} /> )} + + {hasFilter("complaintMethod") && ( + + )} ); diff --git a/frontend/src/app/components/containers/complaints/complaint-filter.tsx b/frontend/src/app/components/containers/complaints/complaint-filter.tsx index 99373bbed..07af6acb2 100644 --- a/frontend/src/app/components/containers/complaints/complaint-filter.tsx +++ b/frontend/src/app/components/containers/complaints/complaint-filter.tsx @@ -11,6 +11,7 @@ import { selectCascadedCommunity, selectComplaintStatusWithPendingCodeDropdown, selectGirTypeCodeDropdown, + selectComplaintReceivedMethodDropdown, } from "../../../store/reducers/code-table"; import { selectOfficersDropdown } from "../../../store/reducers/officer"; import COMPLAINT_TYPES from "../../../types/app/complaint-types"; @@ -40,6 +41,7 @@ export const ComplaintFilter: FC = ({ type }) => { startDate, endDate, girType, + complaintMethod, }, dispatch, } = useContext(ComplaintFilterContext); @@ -59,6 +61,8 @@ export const ComplaintFilter: FC = ({ type }) => { const zones = useAppSelector(selectCascadedZone(region?.value, zone?.value, community?.value)); const communities = useAppSelector(selectCascadedCommunity(region?.value, zone?.value, community?.value)); + const complaintMethods = useAppSelector(selectComplaintReceivedMethodDropdown); + const activeFilters = useAppSelector(listActiveFilters()); const setFilter = useCallback( @@ -112,98 +116,102 @@ export const ComplaintFilter: FC = ({ type }) => { const renderComplaintFilters = (): JSX.Element => { return (
- {COMPLAINT_TYPES.HWCR === type && activeFilters.showNatureComplaintFilter && activeFilters.showSpeciesFilter && ( // wildlife only filter - <> -
- + {COMPLAINT_TYPES.HWCR === type && + activeFilters.showNatureComplaintFilter && + activeFilters.showSpeciesFilter && ( // wildlife only filter + <> +
+ +
+ { + setFilter("natureOfComplaint", option); + }} + classNames={{ + menu: () => "top-layer-select", + }} + options={natureOfComplaintTypes} + placeholder="Select" + enableValidation={false} + value={natureOfComplaint} + isClearable={true} + /> +
+
+ +
+ +
+ { + setFilter("species", option); + }} + classNames={{ + menu: () => "top-layer-select", + }} + options={speciesTypes} + placeholder="Select" + enableValidation={false} + value={species} + isClearable={true} + /> +
+
+ + )} + + {COMPLAINT_TYPES.ERS === type && + activeFilters.showViolationFilter && ( // wildlife only filter +
+ {/* */} +
{ - setFilter("natureOfComplaint", option); + setFilter("violationType", option); }} classNames={{ menu: () => "top-layer-select", }} - options={natureOfComplaintTypes} + options={violationTypes} placeholder="Select" enableValidation={false} - value={natureOfComplaint} + value={violationType} isClearable={true} />
+ )} -
- + {COMPLAINT_TYPES.GIR === type && + activeFilters.showGirTypeFilter && ( // GIR only filter +
+
{ - setFilter("species", option); + setFilter("girType", option); }} classNames={{ menu: () => "top-layer-select", }} - options={speciesTypes} + options={girTypes} placeholder="Select" enableValidation={false} - value={species} + value={girType} isClearable={true} />
- - )} - - {COMPLAINT_TYPES.ERS === type && activeFilters.showViolationFilter && ( // wildlife only filter -
- {/* */} - -
- { - setFilter("violationType", option); - }} - classNames={{ - menu: () => "top-layer-select", - }} - options={violationTypes} - placeholder="Select" - enableValidation={false} - value={violationType} - isClearable={true} - /> -
-
- )} - - {COMPLAINT_TYPES.GIR === type && activeFilters.showGirTypeFilter && ( // GIR only filter -
- -
- { - setFilter("girType", option); - }} - classNames={{ - menu: () => "top-layer-select", - }} - options={girTypes} - placeholder="Select" - enableValidation={false} - value={girType} - isClearable={true} - /> -
-
- )} + )} {activeFilters.showDateFilter && (
@@ -216,8 +224,9 @@ export const ComplaintFilter: FC = ({ type }) => {
)} + + {COMPLAINT_TYPES.ERS === type && activeFilters.showMethodFilter && ( +
+ +
+ { + setFilter("complaintMethod", option); + }} + classNames={{ + menu: () => "top-layer-select", + }} + options={complaintMethods} + placeholder="Select" + enableValidation={false} + value={complaintMethod} + isClearable={true} + /> +
+
+ )}
); }; diff --git a/frontend/src/app/components/containers/complaints/complaint-list.tsx b/frontend/src/app/components/containers/complaints/complaint-list.tsx index 2c002c23a..c668337eb 100644 --- a/frontend/src/app/components/containers/complaints/complaint-list.tsx +++ b/frontend/src/app/components/containers/complaints/complaint-list.tsx @@ -51,6 +51,7 @@ export const generateComplaintRequestPayload = ( natureOfComplaint, violationType, girType, + complaintMethod, } = filters; const common = { @@ -78,6 +79,7 @@ export const generateComplaintRequestPayload = ( return { ...common, violationFilter: violationType, + complaintMethodFilter: complaintMethod, } as ComplaintRequestPayload; case COMPLAINT_TYPES.HWCR: default: diff --git a/frontend/src/app/components/containers/complaints/complaint-map.tsx b/frontend/src/app/components/containers/complaints/complaint-map.tsx index 5de0ce89e..4ad79b41d 100644 --- a/frontend/src/app/components/containers/complaints/complaint-map.tsx +++ b/frontend/src/app/components/containers/complaints/complaint-map.tsx @@ -24,8 +24,19 @@ export const generateMapComplaintRequestPayload = ( sortKey: string, sortDirection: string, ): ComplaintRequestPayload => { - const { region, zone, community, officer, startDate, endDate, status, species, natureOfComplaint, violationType } = - filters; + const { + region, + zone, + community, + officer, + startDate, + endDate, + status, + species, + natureOfComplaint, + violationType, + complaintMethod, + } = filters; const common = { sortColumn: sortKey, @@ -44,6 +55,7 @@ export const generateMapComplaintRequestPayload = ( return { ...common, violationFilter: violationType, + complaintMethodFilter: complaintMethod, } as ComplaintRequestPayload; case COMPLAINT_TYPES.HWCR: default: diff --git a/frontend/src/app/providers/complaint-filter-provider.tsx b/frontend/src/app/providers/complaint-filter-provider.tsx index 23f927e27..61bfd985e 100644 --- a/frontend/src/app/providers/complaint-filter-provider.tsx +++ b/frontend/src/app/providers/complaint-filter-provider.tsx @@ -25,6 +25,7 @@ let initialState: ComplaintFilters = { natureOfComplaint: null, violationType: null, filters: [], + complaintMethod: null, }; const ComplaintFilterContext = createContext({ diff --git a/frontend/src/app/store/reducers/complaints.ts b/frontend/src/app/store/reducers/complaints.ts index ad3b09e10..68357c65f 100644 --- a/frontend/src/app/store/reducers/complaints.ts +++ b/frontend/src/app/store/reducers/complaints.ts @@ -276,6 +276,7 @@ export const getComplaints = violationFilter, girTypeFilter, complaintStatusFilter, + complaintMethodFilter, page, pageSize, query, @@ -298,6 +299,7 @@ export const getComplaints = violationCode: violationFilter?.value, girTypeCode: girTypeFilter?.value, status: complaintStatusFilter?.value, + complaintMethod: complaintMethodFilter?.value, page: page, pageSize: pageSize, query: query, @@ -328,6 +330,7 @@ export const getMappedComplaints = endDateFilter, violationFilter, complaintStatusFilter, + complaintMethodFilter, page, pageSize, query, @@ -349,6 +352,7 @@ export const getMappedComplaints = incidentReportedEnd: endDateFilter, violationCode: violationFilter?.value, status: complaintStatusFilter?.value, + complaintMethod: complaintMethodFilter?.value, page: page, pageSize: pageSize, query: query, diff --git a/frontend/src/app/types/complaints/complaint-filters.ts b/frontend/src/app/types/complaints/complaint-filters.ts index 1a49a46f4..40e84c81d 100644 --- a/frontend/src/app/types/complaints/complaint-filters.ts +++ b/frontend/src/app/types/complaints/complaint-filters.ts @@ -14,6 +14,7 @@ export interface ComplaintFilters { startDateFilter?: Date; endDateFilter?: Date; complaintStatusFilter?: Option; + complaintMethodFilter?: Option; page?: number; pageSize?: number; query?: string; diff --git a/frontend/src/app/types/complaints/complaint-filters/complaint-filters.ts b/frontend/src/app/types/complaints/complaint-filters/complaint-filters.ts index 3821ec9d4..6e8975c90 100644 --- a/frontend/src/app/types/complaints/complaint-filters/complaint-filters.ts +++ b/frontend/src/app/types/complaints/complaint-filters/complaint-filters.ts @@ -18,5 +18,7 @@ export type ComplaintFilters = { girType?: DropdownOption | null; + complaintMethod: DropdownOption | null; + filters: Array; }; diff --git a/migrations/migrations/R__Create-Test-Data.sql b/migrations/migrations/R__Create-Test-Data.sql index 229179a23..29b067f73 100644 --- a/migrations/migrations/R__Create-Test-Data.sql +++ b/migrations/migrations/R__Create-Test-Data.sql @@ -9483,6 +9483,10 @@ SELECT now() ON CONFLICT DO NOTHING; +UPDATE feature_agency_xref SET active_ind = false WHERE feature_code = 'METH_FLTR' AND agancy_code = 'COS' +UPDATE feature_agency_xref SET active_ind = false WHERE feature_code = 'METH_FLTR' AND agancy_code = 'PARKS' +UPDATE feature_agency_xref SET active_ind = true WHERE feature_code = 'METH_FLTR' AND agancy_code = 'EPO' + -------------------------- -- New Changes above this line ------------------------- From 59625caf9a8b09b11386432b7b66829ddbdc58bb Mon Sep 17 00:00:00 2001 From: afwilcox Date: Fri, 27 Sep 2024 16:26:30 -0700 Subject: [PATCH 2/2] Update R__Create-Test-Data.sql Update SQL to make it deploy --- migrations/migrations/R__Create-Test-Data.sql | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/migrations/migrations/R__Create-Test-Data.sql b/migrations/migrations/R__Create-Test-Data.sql index 29b067f73..d2dd0a9c2 100644 --- a/migrations/migrations/R__Create-Test-Data.sql +++ b/migrations/migrations/R__Create-Test-Data.sql @@ -9483,9 +9483,9 @@ SELECT now() ON CONFLICT DO NOTHING; -UPDATE feature_agency_xref SET active_ind = false WHERE feature_code = 'METH_FLTR' AND agancy_code = 'COS' -UPDATE feature_agency_xref SET active_ind = false WHERE feature_code = 'METH_FLTR' AND agancy_code = 'PARKS' -UPDATE feature_agency_xref SET active_ind = true WHERE feature_code = 'METH_FLTR' AND agancy_code = 'EPO' +UPDATE feature_agency_xref SET active_ind = false WHERE feature_code = 'METH_FLTR' AND agency_code = 'COS'; +UPDATE feature_agency_xref SET active_ind = false WHERE feature_code = 'METH_FLTR' AND agency_code = 'PARKS'; +UPDATE feature_agency_xref SET active_ind = true WHERE feature_code = 'METH_FLTR' AND agency_code = 'EPO'; -------------------------- -- New Changes above this line @@ -9494,4 +9494,4 @@ UPDATE configuration SET configuration_value = configuration_value::int + 1 WHERE - configuration_code = 'CDTABLEVER'; \ No newline at end of file + configuration_code = 'CDTABLEVER';