Skip to content

Commit dd5c931

Browse files
authored
[MDS-6328] - Select permit document to extract conditions from 🍰 (#3389)
* Add permit document selection modal for condition extraction Enhanced the extraction process by introducing a modal to select specific permit amendment documents when multiple are available. * Add tests and snapshot for PermitConditionsSelectDocumentModal * update snaps * update snaps * remove console log and simplify column * fixed re-extraction after delete. Added table styling. * update snap
1 parent 2a1d5d6 commit dd5c931

File tree

10 files changed

+596
-19
lines changed

10 files changed

+596
-19
lines changed

services/common/src/redux/slices/permitServiceSlice.ts

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export enum PermitExtractionStatus {
1515
in_progress = "In Progress",
1616
complete = "Extraction Complete",
1717
error = "Error Extracting",
18+
deleted = "Deleted",
1819
}
1920

2021
const permitExtractionStatusMap = {

services/common/src/tests/mocks/dataMocks.tsx

+11
Original file line numberDiff line numberDiff line change
@@ -1392,6 +1392,17 @@ export const PERMITS: IPermit[] = [
13921392
preamble_title: "Preamble Title",
13931393
preamble_date: "2019-04-02",
13941394
},
1395+
{
1396+
permit_id: 1,
1397+
mine_guid: "8e9ca839-a28e-427e-997e-9ef23d9d97cd",
1398+
permit_amendment_document_guid: "31204ba5-5207-4fb5-b6c3-d47e55a0971b",
1399+
document_name: "Adams_amendment_2.pdf",
1400+
document_manager_guid: "64caef0e-060d-4875-a470-6c225b242723",
1401+
active_ind: true,
1402+
preamble_author: "Preamble Author",
1403+
preamble_title: "Preamble Title",
1404+
preamble_date: "2019-04-02",
1405+
},
13951406
],
13961407
},
13971408
{

services/core-api/app/api/mines/permits/permit_extraction/resources/permit_condition_extraction_resource.py

+6
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,12 @@ def delete(self):
122122
PermitConditions.delete_all_by_permit_amendment_id(args['permit_amendment_id'], commit=True)
123123
PermitConditionCategory.delete_all_by_permit_amendment_id(args['permit_amendment_id'])
124124

125+
permit_amendment = PermitAmendment.find_by_permit_amendment_id(args['permit_amendment_id'])
126+
permit_extraction_tasks = PermitExtractionTask.get_by_permit_amendment_guid(permit_amendment.permit_amendment_guid)
127+
if permit_extraction_tasks:
128+
permit_extraction_tasks[0].task_status = 'Deleted'
129+
permit_extraction_tasks[0].save()
130+
125131

126132
class PermitConditionExtractionProgressResource(Resource, UserMixin):
127133
api.doc('Returns the status of the permit extraction task')
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { IPermitAmendmentDocument } from "@mds/common/interfaces";
2+
import React, { FC } from "react";
3+
import CoreTable from "@mds/common/components/common/CoreTable";
4+
import {
5+
renderDateColumn,
6+
renderTextColumn,
7+
} from "@mds/common/components/common/CoreTableCommonColumns";
8+
import { Button, Typography } from "antd";
9+
import { documentNameColumn } from "@mds/common/components/documents/DocumentColumns";
10+
11+
const { Title, Paragraph } = Typography;
12+
13+
interface PermitConditionsSelectDocumentModalProps {
14+
documents: IPermitAmendmentDocument[];
15+
onSubmit: (document: IPermitAmendmentDocument) => void;
16+
}
17+
18+
const PermitConditionsSelectDocumentModal: FC<PermitConditionsSelectDocumentModalProps> = ({
19+
documents,
20+
onSubmit,
21+
}) => {
22+
return (
23+
<div>
24+
<Title>Extract Permit Conditions</Title>
25+
<Paragraph>Select the permit for permit condition extraction.</Paragraph>
26+
<CoreTable
27+
rowKey="document_manager_guid"
28+
dataSource={documents}
29+
columns={[
30+
documentNameColumn("document_name", "File Name"),
31+
renderTextColumn("create_user", "Created By"),
32+
renderDateColumn("create_timestamp", "Uploaded"),
33+
{
34+
key: "action",
35+
className: "actions-column",
36+
width: 0,
37+
render: (record: IPermitAmendmentDocument) => {
38+
return (
39+
<Button type="primary" onClick={() => onSubmit(record)}>
40+
Extract
41+
</Button>
42+
);
43+
},
44+
},
45+
]}
46+
/>
47+
</div>
48+
);
49+
};
50+
51+
export default PermitConditionsSelectDocumentModal;

services/core-web/src/components/mine/Permit/ViewPermit.tsx

+51-19
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
getLatestAmendmentByPermitGuid,
66
getPermitByGuid,
77
} from "@mds/common/redux/selectors/permitSelectors";
8-
import { IMine, IPermit, IPermitAmendment } from "@mds/common/interfaces";
8+
import { IMine, IPermit, IPermitAmendment, IPermitAmendmentDocument } from "@mds/common/interfaces";
99
import ViewPermitOverview from "@/components/mine/Permit/ViewPermitOverview";
1010
import PermitConditions from "@/components/mine/Permit/PermitConditions";
1111

@@ -30,6 +30,8 @@ import {
3030
import { userHasRole } from "@mds/common/redux/selectors/authenticationSelectors";
3131
import { USER_ROLES } from "@mds/common/constants/environment";
3232
import { PERMIT_CONDITION_STATUS_CODE } from "@mds/common/constants/enums";
33+
import { closeModal, openModal } from "@mds/common/redux/actions/modalActions";
34+
import PermitConditionsSelectDocumentModal from "@/components/mine/Permit/PermitConditionsSelectDocumentModal";
3335

3436
const tabs = ["overview", "conditions"];
3537

@@ -60,13 +62,14 @@ const ViewPermit: FC = () => {
6062
const [pollForStatus, setPollForStatus] = useState(false);
6163

6264
const hasConditions = latestAmendment?.conditions?.length > 0;
63-
const isReviewComplete = latestAmendment?.conditions?.every((con) => con.permit_condition_status_code === PERMIT_CONDITION_STATUS_CODE.COM);
64-
65+
const isReviewComplete = latestAmendment?.conditions?.every(
66+
(con) => con.permit_condition_status_code === PERMIT_CONDITION_STATUS_CODE.COM
67+
);
6568

6669
const canStartExtraction =
67-
((documents.length > 0 && !permitExtraction?.status) ||
68-
[PermitExtractionStatus.error, PermitExtractionStatus.not_started].includes(
69-
permitExtraction?.status
70+
((documents.length > 0 && !permitExtraction?.task_status) ||
71+
[PermitExtractionStatus.error, PermitExtractionStatus.not_started, PermitExtractionStatus.deleted].includes(
72+
permitExtraction?.task_status
7073
)) &&
7174
!hasConditions;
7275

@@ -167,7 +170,35 @@ const ViewPermit: FC = () => {
167170

168171
const onConditionsTab = tab === tabs[1];
169172

173+
const handleSelectedDocumentExtraction = async (document: IPermitAmendmentDocument) => {
174+
dispatch(closeModal());
175+
await dispatch(
176+
initiatePermitExtraction({
177+
permit_amendment_id: latestAmendment?.permit_amendment_id,
178+
permit_amendment_document_guid: document.permit_amendment_document_guid,
179+
})
180+
);
181+
};
182+
183+
const handleOpenFileSelectionModal = () => {
184+
dispatch(
185+
openModal({
186+
props: {
187+
title: `Extract Permit Conditions`,
188+
documents: documents,
189+
onSubmit: handleSelectedDocumentExtraction,
190+
},
191+
content: PermitConditionsSelectDocumentModal,
192+
})
193+
);
194+
};
195+
170196
const handleInitiateExtraction = async () => {
197+
if (documents.length > 1) {
198+
handleOpenFileSelectionModal();
199+
return;
200+
}
201+
171202
await dispatch(
172203
initiatePermitExtraction({
173204
permit_amendment_id: latestAmendment?.permit_amendment_id,
@@ -186,22 +217,23 @@ const ViewPermit: FC = () => {
186217

187218
const headerActions = [
188219
onConditionsTab &&
189-
userCanEditConditions && {
190-
key: "extract",
191-
label: "Extract Permit Conditions",
192-
disabled: !canStartExtraction,
193-
clickFunction: handleInitiateExtraction,
194-
},
220+
userCanEditConditions && {
221+
key: "extract",
222+
label: "Extract Permit Conditions",
223+
disabled: !canStartExtraction,
224+
clickFunction: handleInitiateExtraction,
225+
},
195226
onConditionsTab &&
196-
userCanEditConditions && {
197-
key: "delete_conditions",
198-
label: "Delete Permit Conditions",
199-
disabled: !hasConditions,
200-
clickFunction: handleDeleteConditions,
201-
},
227+
userCanEditConditions && {
228+
key: "delete_conditions",
229+
label: "Delete Permit Conditions",
230+
disabled: !hasConditions,
231+
clickFunction: handleDeleteConditions,
232+
},
202233
].filter(Boolean);
203234

204-
const showHeaderActions = !is_generated_in_core && enablePermitConditionsTab && headerActions.length > 0;
235+
const showHeaderActions =
236+
!is_generated_in_core && enablePermitConditionsTab && headerActions.length > 0;
205237

206238
const headerActionComponent = showHeaderActions ? (
207239
<ActionMenuButton actions={headerActions} />

services/core-web/src/styles/components/Tables.scss

+6
Original file line numberDiff line numberDiff line change
@@ -207,4 +207,10 @@ td.ant-table-cell {
207207
&:focus {
208208
background-color: $disabled-grey !important;
209209
}
210+
}
211+
212+
// actions menu
213+
.actions-column {
214+
text-align: right;
215+
width: 0; // effectively "fit-content"
210216
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import React from "react";
2+
import { render } from "@testing-library/react";
3+
import * as MOCK from "@mds/common/tests/mocks/dataMocks";
4+
import { ReduxWrapper } from "@mds/common/tests/utils/ReduxWrapper";
5+
import { AUTHENTICATION, MINES, PERMITS, STATIC_CONTENT } from "@mds/common/constants/reducerTypes";
6+
import { USER_ROLES } from "@mds/common/constants/environment";
7+
import { BrowserRouter } from "react-router-dom";
8+
import PermitConditionsSelectDocumentModal from "@/components/mine/Permit/PermitConditionsSelectDocumentModal";
9+
10+
const initialState = {
11+
[PERMITS]: { permits: MOCK.PERMITS, permitAmendments: MOCK.PERMIT_AMENDMENT_STATE },
12+
[MINES]: { mines: MOCK.MINES.mines },
13+
[AUTHENTICATION]: {
14+
userAccessData: [USER_ROLES.role_admin, USER_ROLES.role_edit_template_conditions],
15+
},
16+
[STATIC_CONTENT]: {
17+
...MOCK.BULK_STATIC_CONTENT_RESPONSE,
18+
},
19+
};
20+
21+
function mockFunction() {
22+
const original = jest.requireActual("react-router-dom");
23+
return {
24+
...original,
25+
useParams: jest.fn().mockReturnValue({
26+
id: MOCK.MINES.mineIds[0],
27+
permitGuid: MOCK.PERMITS[0].permit_guid,
28+
}),
29+
};
30+
}
31+
32+
jest.mock("react-router-dom", () => mockFunction());
33+
34+
describe("PermitConditionsSelectDocumentModal", () => {
35+
it("renders properly", () => {
36+
const { container } = render(
37+
<ReduxWrapper initialState={initialState}>
38+
<BrowserRouter>
39+
<PermitConditionsSelectDocumentModal documents={MOCK.PERMITS[0].permit_amendments[0].related_documents} onSubmit={jest.fn()}/>
40+
</BrowserRouter>
41+
</ReduxWrapper>
42+
);
43+
expect(container.firstChild).toMatchSnapshot();
44+
});
45+
});

0 commit comments

Comments
 (0)