Skip to content

Commit 9603938

Browse files
authored
[MDS-6255] view mine report definitions (#3398)
* make the tab, put it on the page, fix the HSRC title * add pagination to mine report definitions in BE, take out of static content, and make a slice on the FE * missed adding the slice file * get the data in the table and pagination working properly with BE pagination. TODO: I'm missing data fields, and the sort only applies to data currently on the page * remove mine report definition options from static content, get basics of sort/filter working (still a bit buggy) * tell sqlalchemy where a table is * change loading logic * make fetch happen in other places that use report definitions * fix BE filters for boolean values * remove logs * use string because boolean doesn't work * fix some sorting on BE, fix page size on FE * do FE part of section filter * BE compliance article # search, little bit of clean up on codes page * add backend search, tweak ordering of section sort * add api param documentation, take out unecessary param * fix bug with searching section first, put search params in url * FE snapshot test, make params comparison better * make test fancier * don't disable buttons * fix diff * did merge conflict resolution wrong
1 parent e94bc2c commit 9603938

File tree

53 files changed

+3737
-1527
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+3737
-1527
lines changed

services/common/src/components/reports/ReportDefinitionFieldSelect.tsx

+12-7
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import { formatComplianceCodeReportName } from "@mds/common/redux/utils/helpers";
22
import React, { useEffect, useState } from "react";
3-
import { useSelector } from "react-redux";
3+
import { useAppDispatch as useDispatch, useAppSelector as useSelector } from "@mds/common/redux/rootState";
44
import { Field } from "@mds/common/components/forms/form";
5-
6-
import { getMineReportDefinitionOptions } from "@mds/common/redux/selectors/staticContentSelectors";
7-
5+
import { fetchComplianceReports, getMineReportDefinitionOptions, getReportDefinitionsLoaded, reportParamsGetAll } from "@mds/common/redux/slices/complianceReportsSlice";
86
import RenderSelect from "../forms/RenderSelect";
97
import { uniqBy } from "lodash";
108
import moment from "moment";
@@ -20,9 +18,10 @@ export interface ReportDefinitionFieldSelectProps {
2018
}
2119

2220
export const ReportDefinitionFieldSelect = (props: ReportDefinitionFieldSelectProps) => {
21+
const dispatch = useDispatch();
2322
const mineReportDefinitionOptions = useSelector(getMineReportDefinitionOptions);
24-
25-
const [formattedMineReportDefinitionOptions, setFormatMineReportDefinitionOptions] = useState([]);
23+
const [formattedMineReportDefinitionOptions, setFormattedMineReportDefinitionOptions] = useState([]);
24+
const reportDefinitionsLoaded = useSelector(getReportDefinitionsLoaded(reportParamsGetAll));
2625

2726
useEffect(() => {
2827
// Format the mine report definition options for the search bar
@@ -39,9 +38,15 @@ export const ReportDefinitionFieldSelect = (props: ReportDefinitionFieldSelectPr
3938
};
4039
})
4140
.sort((a, b) => a.label.localeCompare(b.label));
42-
setFormatMineReportDefinitionOptions(uniqBy(newFormattedMineReportDefinitionOptions, "value"));
41+
setFormattedMineReportDefinitionOptions(uniqBy(newFormattedMineReportDefinitionOptions, "value"));
4342
}, [mineReportDefinitionOptions]);
4443

44+
useEffect(() => {
45+
if (!reportDefinitionsLoaded) {
46+
dispatch(fetchComplianceReports(reportParamsGetAll));
47+
}
48+
}, []);
49+
4550
return (
4651
<Field
4752
component={RenderSelect}

services/common/src/components/reports/ReportDetailsForm-view.spec.tsx

+11-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import * as MOCK from "@mds/common/tests/mocks/dataMocks";
88
import { SystemFlagEnum } from "@mds/common/constants/enums";
99
import { USER_ROLES } from "@mds/common/constants/environment";
1010
import { IMineReportSubmission } from "@mds/common/interfaces/reports/mineReportSubmission.interface";
11+
import { complianceReportReducerType, reportParamsGetAll } from "@mds/common/redux/slices/complianceReportsSlice";
1112

1213
const mineReportSubmission = MOCK.MINE_REPORT_SUBMISSIONS[0];
1314
const initialState = {
@@ -16,10 +17,19 @@ const initialState = {
1617
mineReportGuid: mineReportSubmission.mine_report_guid,
1718
},
1819
[STATIC_CONTENT]: {
19-
mineReportDefinitionOptions: MOCK.BULK_STATIC_CONTENT_RESPONSE.mineReportDefinitionOptions,
2020
permitConditionCategoryOptions:
2121
MOCK.BULK_STATIC_CONTENT_RESPONSE.permitConditionCategoryOptions,
2222
},
23+
[complianceReportReducerType]: {
24+
reportPageData: {
25+
records: MOCK.MINE_REPORT_DEFINITION_OPTIONS,
26+
current_page: 1,
27+
items_per_page: MOCK.MINE_REPORT_DEFINITION_OPTIONS.length,
28+
total: MOCK.MINE_REPORT_DEFINITION_OPTIONS.length,
29+
total_pages: 1
30+
},
31+
params: reportParamsGetAll,
32+
},
2333
[AUTHENTICATION]: {
2434
systemFlag: SystemFlagEnum.core,
2535
userAccessData: [USER_ROLES.role_edit_reports],

services/common/src/components/reports/ReportDetailsForm.tsx

+12-6
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
import { Alert, Button, Col, Row, Typography } from "antd";
22
import React, { FC, ReactNode, useEffect, useState } from "react";
3-
import { useDispatch, useSelector } from "react-redux";
3+
import { useAppDispatch as useDispatch, useAppSelector as useSelector } from "@mds/common/redux/rootState";
44
import { arrayPush, change, Field, FieldArray, getFormValues } from "@mds/common/components/forms/form";
55
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
66
import { faTrashAlt } from "@fortawesome/pro-light-svg-icons";
7-
87
import {
98
getDropdownPermitConditionCategoryOptions,
10-
getMineReportDefinitionOptions,
119
} from "@mds/common/redux/selectors/staticContentSelectors";
10+
import { fetchComplianceReports, getMineReportDefinitionOptions, getReportDefinitionsLoaded, reportParamsGetAll } from "@mds/common/redux/slices/complianceReportsSlice";
1211
import ReportFileUpload from "@mds/common/components/reports/ReportFileUpload";
13-
1412
import { FORM } from "@mds/common/constants/forms";
1513
import {
1614
email,
@@ -152,7 +150,7 @@ const ReportDetailsForm: FC<ReportDetailsFormProps> = ({
152150
} = formValues;
153151

154152
const [selectedReportCode, setSelectedReportCode] = useState("");
155-
const [formattedMineReportDefinitionOptions, setFormatMineReportDefinitionOptions] = useState([]);
153+
const [formattedMineReportDefinitionOptions, setFormattedMineReportDefinitionOptions] = useState([]);
156154
const [isLoading, setIsLoading] = useState(false);
157155

158156
const partyRelationships: IPartyAppt[] = useSelector((state) => getPartyRelationships(state));
@@ -165,6 +163,8 @@ const ReportDetailsForm: FC<ReportDetailsFormProps> = ({
165163
const MinistryContactsByRegion: IMinistryContact[] = useSelector(getMinistryContactsByRegion);
166164
const [contactEmail, setContactEmail] = useState<string>();
167165

166+
const reportDefinitionsLoaded = useSelector(getReportDefinitionsLoaded(reportParamsGetAll));
167+
168168
// PRR
169169
const permit = useSelector(getPermitByGuid(permit_guid));
170170
const dropdownPermitConditionCategoryOptions = useSelector(
@@ -245,7 +245,7 @@ const ReportDetailsForm: FC<ReportDetailsFormProps> = ({
245245
};
246246
})
247247
.sort((a, b) => a.label.localeCompare(b.label));
248-
setFormatMineReportDefinitionOptions(uniqBy(newFormattedMineReportDefinitionOptions, "value"));
248+
setFormattedMineReportDefinitionOptions(uniqBy(newFormattedMineReportDefinitionOptions, "value"));
249249
}, [mineReportDefinitionOptions]);
250250

251251
useEffect(() => {
@@ -287,6 +287,12 @@ const ReportDetailsForm: FC<ReportDetailsFormProps> = ({
287287
}
288288
}, [formValues.mine_report_guid, formValues.mine_report_submission_guid]);
289289

290+
useEffect(() => {
291+
if (!reportDefinitionsLoaded) {
292+
dispatch(fetchComplianceReports(reportParamsGetAll));
293+
}
294+
}, []);
295+
290296
const handleAddComment = async (values) => {
291297
const formVals = {
292298
report_comment: values.comment,

services/common/src/components/reports/ReportGetStarted.tsx

+10-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Alert, Button, Col, Row, Typography } from "antd";
22
import React, { FC, ReactNode, useEffect, useState } from "react";
33
import { Field, getFormValues, change } from "@mds/common/components/forms/form";
44
import ArrowRightOutlined from "@ant-design/icons/ArrowRightOutlined";
5-
import { useSelector, useDispatch } from "react-redux";
5+
import { useAppDispatch as useDispatch, useAppSelector as useSelector } from "@mds/common/redux/rootState";
66
import { IMine, IMineReportDefinition, IMineReportSubmission } from "@mds/common/interfaces";
77
import {
88
createDropDownList,
@@ -15,9 +15,8 @@ import { required, requiredRadioButton } from "@mds/common/redux/utils/Validate"
1515
import RenderSelect from "../forms/RenderSelect";
1616
import {
1717
getDropdownPermitConditionCategoryOptions,
18-
getFormattedMineReportDefinitionOptions,
19-
getMineReportDefinitionByGuid,
2018
} from "@mds/common/redux/selectors/staticContentSelectors";
19+
import { fetchComplianceReports, getFormattedMineReportDefinitionOptions, getMineReportDefinitionByGuid, getReportDefinitionsLoaded, reportParamsGetAll } from "@mds/common/redux/slices/complianceReportsSlice";
2120
import { getPermits } from "@mds/common/redux/selectors/permitSelectors";
2221
import { fetchPermits } from "@mds/common/redux/actionCreators/permitActionCreator";
2322
import { getSystemFlag } from "@mds/common/redux/selectors/authenticationSelectors";
@@ -171,9 +170,16 @@ const ReportGetStarted: FC<ReportGetStartedProps> = ({
171170
const selectedReportDefinition: IMineReportDefinition = useSelector(
172171
getMineReportDefinitionByGuid(formValues?.mine_report_definition_guid)
173172
);
173+
const reportDefinitionsLoaded = useSelector(getReportDefinitionsLoaded(reportParamsGetAll));
174174

175175
useEffect(() => {
176-
if (selectedReportDefinition && selectedReportDefinition.is_prr_only) {
176+
if (!reportDefinitionsLoaded) {
177+
dispatch(fetchComplianceReports(reportParamsGetAll));
178+
}
179+
}, []);
180+
181+
useEffect(() => {
182+
if (selectedReportDefinition?.is_prr_only) {
177183
setDisableNextButton(true);
178184
} else {
179185
setDisableNextButton(false);

services/common/src/constants/API.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ export const MINE_WORK_INFORMATION = (mineGuid, mineWorkInformationGuid) =>
259259
export const REPORTS = (params = {}) => `/mines/reports?${queryString.stringify(params)}`;
260260
export const REPORT_SUBMISSIONS = (params?) =>
261261
`/mines/reports/submissions?${queryString.stringify(params)}`;
262-
export const MINE_REPORT_DEFINITIONS = () => `/mines/reports/definitions`;
262+
export const MINE_REPORT_DEFINITIONS = (params = {}) => `/mines/reports/definitions?${queryString.stringify(params)}`;
263263
export const MINE_REPORTS = (mineGuid, params?) =>
264264
`/mines/${mineGuid}/reports?${queryString.stringify(params)}`;
265265
export const MINE_REPORT = (mineGuid, mineReportGuid) =>

services/common/src/constants/actionTypes.ts

-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ export const STORE_MINE_DOCUMENTS = "STORE_MINE_DOCUMENTS";
3434
export const STORE_MINE_TSF_REQUIRED_DOCUMENTS = "STORE_MINE_TSF_REQUIRED_DOCUMENTS";
3535
export const STORE_MINE_COMPLIANCE_INFO = "STORE_MINE_COMPLIANCE_INFO";
3636
export const STORE_PROVINCE_OPTIONS = "STORE_PROVINCE_OPTIONS";
37-
export const STORE_MINE_REPORT_DEFINITION_OPTIONS = "STORE_MINE_REPORT_DEFINITION_OPTIONS";
3837

3938
export const STORE_PARTY = "STORE_PARTY";
4039
export const STORE_PARTIES = "STORE_PARTIES";

services/common/src/constants/enums.ts

+2
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,8 @@ export enum REPORT_REGULATORY_AUTHORITY_CODES {
227227
export enum REPORT_REGULATORY_AUTHORITY_ENUM {
228228
CPO = "Chief Permitting Officer",
229229
CIM = "Chief Inspector of Mines",
230+
Both = "Both",
231+
230232
}
231233

232234
export enum MineReportType {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export interface ISearchParams {
2+
page?: number;
3+
per_page?: number;
4+
sort_field?: string;
5+
sort_dir?: string;
6+
};

services/common/src/interfaces/complianceArticle.interface.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ export interface IComplianceArticle {
1111
sub_paragraph: string;
1212
description: string;
1313
long_description: string;
14-
effective_date: Date;
15-
expiry_date: Date;
14+
effective_date: string;
15+
expiry_date: string;
1616
help_reference_link: string;
1717
cim_or_cpo: string;
1818
reports: IMineReportDefinition[];

services/common/src/interfaces/reports/mineReportDefinition.interface.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export interface IMineReportDefinition {
1010
active_ind: boolean;
1111
categories: IMineReportDefinitionCategory[];
1212
compliance_articles: IComplianceArticle[];
13-
default_due_date?: number;
13+
default_due_date?: string;
1414
description: string;
1515
due_date_period_months?: number;
1616
is_common: boolean;

services/common/src/redux/reducers/rootReducerShared.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,22 @@ import verifiableCredentialsReducer from "@mds/common/redux/slices/verifiableCre
3535

3636
import regionsReducer from "@mds/common/redux/slices/regionsSlice";
3737
import complianceCodeReducer, { complianceCodeReducerType } from "../slices/complianceCodesSlice";
38+
import complianceReportReducer, { complianceReportReducerType } from "../slices/complianceReportsSlice";
3839
import spatialDataReducer, { spatialDataReducerType } from "../slices/spatialDataSlice";
3940
import permitServiceReducer, { permitServiceReducerType } from "../slices/permitServiceSlice";
4041
import searchConditionCategoriesReducer, {
4142
searchConditionCategoriesType,
4243
} from "../slices/permitConditionCategorySlice";
4344
import helpReducer, { helpReducerType } from "../slices/helpSlice";
45+
import userReducer, { userReducerType } from "@mds/common/redux/slices/userSlice";
4446
import mineReportPermitRequirementReducer, { mineReportPermitRequirementReducerType } from "../slices/mineReportPermitRequirementSlice";
47+
import permitConditionDiffReducer, { permitConditionDiffReducerType } from "../slices/permitConditionDiffSlice";
48+
4549

4650
const networkReducers = Object.fromEntries(Object.entries(NetworkReducerTypes).map(([key, value]) =>
4751
[NetworkReducerTypes[key], createReducer(networkReducer, value)]
4852
));
4953

50-
import userReducer, { userReducerType } from "@mds/common/redux/slices/userSlice";
51-
import permitConditionDiffReducer, { permitConditionDiffReducerType } from "../slices/permitConditionDiffSlice";
52-
5354
export const sharedReducer = {
5455
...activityReducer,
5556
...authenticationReducer,
@@ -83,6 +84,7 @@ export const sharedReducer = {
8384
regions: regionsReducer,
8485
[spatialDataReducerType]: spatialDataReducer,
8586
[complianceCodeReducerType]: complianceCodeReducer,
87+
[complianceReportReducerType]: complianceReportReducer,
8688
[permitServiceReducerType]: permitServiceReducer,
8789
[helpReducerType]: helpReducer,
8890
[searchConditionCategoriesType]: searchConditionCategoriesReducer,

services/common/src/redux/reducers/staticContentReducer.js

-3
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ const initialState = {
2727
informationRequirementsTableDocumentTypes: [],
2828
majorMineApplicationStatusCodes: [],
2929
majorMineApplicationDocumentTypes: [],
30-
mineReportDefinitionOptions: [],
3130
mineReportStatusOptions: [],
3231
mineReportCategoryOptions: [],
3332
partyRelationshipTypes: [],
@@ -113,8 +112,6 @@ export const getMajorMinesApplicationStatusCodes = (state) =>
113112
state[STATIC_CONTENT].majorMineApplicationStatusCodes;
114113
export const getMajorMinesApplicationDocumentTypes = (state) =>
115114
state[STATIC_CONTENT].majorMineApplicationDocumentTypes;
116-
export const getMineReportDefinitionOptions = (state) =>
117-
state[STATIC_CONTENT].mineReportDefinitionOptions;
118115
export const getMineReportStatusOptions = (state) => state[STATIC_CONTENT].mineReportStatusOptions;
119116
export const getMineReportCategoryOptions = (state) =>
120117
state[STATIC_CONTENT].mineReportCategoryOptions;

services/common/src/redux/selectors/staticContentSelectors.ts

+1-44
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,9 @@ import {
55
createLabelHash,
66
createDropDownList,
77
compareCodes,
8-
formatComplianceCodeReportName,
98
} from "../utils/helpers";
109
import { RootState } from "@mds/common/redux/rootState";
1110
import { getMunicipalityOptions } from "../reducers/staticContentReducer";
12-
import { IMineReportDefinition } from "@mds/common/interfaces/reports/mineReportDefinition.interface";
1311

1412
export const {
1513
getStaticContentLoadingIsComplete,
@@ -18,7 +16,6 @@ export const {
1816
getMineTenureTypeOptions,
1917
getMineCommodityOptions,
2018
getMineDisturbanceOptions,
21-
getMineReportDefinitionOptions,
2219
getMineReportStatusOptions,
2320
getMineReportCategoryOptions,
2421
getProvinceOptions,
@@ -80,7 +77,7 @@ const getOptions = (transformOptionsFunc, showActiveOnly) => {
8077
: options;
8178
};
8279

83-
const createSelectorWrapper = (
80+
export const createSelectorWrapper = (
8481
getOptionsMethod,
8582
transformOptionsMethod,
8683
transformOptionsFuncArgs = []
@@ -460,46 +457,6 @@ export const getVarianceDocumentCategoryOptionsHash = createSelector(
460457
createLabelHash
461458
);
462459

463-
export const getDropdownMineReportDefinitionOptions = createSelectorWrapper(
464-
getMineReportDefinitionOptions,
465-
createDropDownList,
466-
["report_name", "mine_report_definition_guid", "active_ind"]
467-
);
468-
469-
export const getFormattedMineReportDefinitionOptions = createSelectorWrapper(
470-
getMineReportDefinitionOptions,
471-
(options: IMineReportDefinition[]) => {
472-
return options
473-
.map((item) => {
474-
return {
475-
label: formatComplianceCodeReportName(item),
476-
value: item.mine_report_definition_guid,
477-
isActive: item.active_ind,
478-
is_common: item.is_common,
479-
report_name: item.report_name,
480-
};
481-
})
482-
.sort((a, b) => a.label.localeCompare(b.label));
483-
}
484-
);
485-
486-
export const getMineReportDefinitionByGuid = (mineReportDefinitionGuid: string) =>
487-
createSelector([getMineReportDefinitionOptions], (reportDefs) => {
488-
return reportDefs.find((r) => r.mine_report_definition_guid === mineReportDefinitionGuid);
489-
});
490-
491-
export const getMineReportDefinitionHash = createSelector(
492-
getMineReportDefinitionOptions,
493-
(options) =>
494-
options.reduce(
495-
(map, mine_report_definition) => ({
496-
[mine_report_definition.mine_report_definition_guid]: mine_report_definition,
497-
...map,
498-
}),
499-
{}
500-
)
501-
);
502-
503460
export const getDropdownMineReportCategoryOptions = createSelectorWrapper(
504461
getMineReportCategoryOptions,
505462
createDropDownList,

0 commit comments

Comments
 (0)