diff --git a/backend/src/document_type/document_type.controller.ts b/backend/src/document_type/document_type.controller.ts index f9f37306..4d0f322d 100644 --- a/backend/src/document_type/document_type.controller.ts +++ b/backend/src/document_type/document_type.controller.ts @@ -52,7 +52,6 @@ export class DocumentTypeController { @Post('remove-provision-group') removeProvisionGroup(@Body() data: { provision_group_id: number }) { - console.log('provision_group_id: ' + data.provision_group_id); return this.documentTypeService.removeProvisionGroup(data.provision_group_id); } } diff --git a/backend/src/main.ts b/backend/src/main.ts index 593a5793..be39041d 100644 --- a/backend/src/main.ts +++ b/backend/src/main.ts @@ -1,9 +1,12 @@ import { NestFactory } from '@nestjs/core'; import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger'; import { AppModule } from './app.module'; +import * as bodyParser from 'body-parser'; async function bootstrap() { const app = await NestFactory.create(AppModule); + app.use(bodyParser.json({ limit: '1mb' })); + app.use(bodyParser.urlencoded({ limit: '1mb', extended: true })); app.enableCors(); const config = new DocumentBuilder() .setTitle('Users example') diff --git a/backend/src/provision/provision.service.ts b/backend/src/provision/provision.service.ts index f01751be..2b9d631c 100644 --- a/backend/src/provision/provision.service.ts +++ b/backend/src/provision/provision.service.ts @@ -240,9 +240,9 @@ export class ProvisionService { id: document_type_id, }, }, + relations: ['provision'], }); - - return docTypeProvisions.map((provision) => provision.id); + return docTypeProvisions.map((provision) => provision.provision.id); } async getManageDocTypeProvisions(document_type_id: number) { @@ -374,7 +374,6 @@ export class ProvisionService { return existingProv; }); await this.documentTypeProvisionRepository.save(updatedProvisions); - console.log('Provisions updated successfully!'); } /** diff --git a/frontend/src/app/content/pages/IndexPage.tsx b/frontend/src/app/content/pages/IndexPage.tsx deleted file mode 100644 index 315dc0a0..00000000 --- a/frontend/src/app/content/pages/IndexPage.tsx +++ /dev/null @@ -1,60 +0,0 @@ -// Unused page - -import { FC } from 'react'; -import Collapsible from '../../../app/components/common/Collapsible'; -import { DTRDisplayObject } from '../../../app/types/types'; -import TenureDetails from '../display/TenureDetails'; -import AreaDetails from '../display/AreaDetails'; -import DtidDetails from '../display/DtidDetails'; -import { Button } from 'react-bootstrap'; -// import { generateReportNew } from '../../common/report'; -import { useParams } from 'react-router'; - -export interface IndexPageProps { - data: DTRDisplayObject; -} - -const IndexPage: FC = ({ data }) => { - // const { dtid } = useParams<{ dtid: string }>(); - // const dtidNumber = dtid ? parseInt(dtid, 10) : null; - // const generateReportHandler = () => { - // if (dtidNumber) { - // // generateReportNew(dtidNumber, data!.fileNum, 'Land Use Report'); - // } - // }; - // return ( - // <> - //
Preview - Land Use Report (Draft)
- //
- //
- //
DTID:
- //
- // {data.dtid} - //
- //
- //
- //
Tenure File Number:
- //
- // {data.fileNum} - //
- //
- //
- //
Primary Contact Name:
- //
{data.primaryContactName}
- //
- // - // - // - // - // - // - // - // - // - // - // - // ); - return <>; -}; - -export default IndexPage; diff --git a/frontend/src/app/content/pages/LandingPage.tsx b/frontend/src/app/content/pages/LandingPage.tsx index 81b7e8c3..cade344f 100644 --- a/frontend/src/app/content/pages/LandingPage.tsx +++ b/frontend/src/app/content/pages/LandingPage.tsx @@ -43,6 +43,8 @@ const LandingPage: FC = () => { const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [showError, setShowError] = useState(false); + const [generateError, setGenerateError] = useState(null); + const [showGenerateError, setShowGenerateError] = useState(false); const [data, setData] = useState(null); const [mandatoryProvisionIds, setMandatoryProvisionIds] = useState([]); @@ -225,15 +227,33 @@ const LandingPage: FC = () => { setDtidInput(!isNaN(parseInt(e.target.value)) ? parseInt(e.target.value) : null); }; + /** + * Checks each provision group for mandatory provisions, then + * checks that those provision groups have at least one provision + * selected. If not, returns an error message. + * + * @returns the error message if any, otherwise null + */ const validateProvisions = (): string | null => { - const unselectedMandatoryIds = mandatoryProvisionIds.filter( - (mandatoryId) => !selectedProvisionIds.includes(mandatoryId) - ); - const matchingProvisionIds = selectedProvisionIds.filter((id) => unselectedMandatoryIds.includes(id)); - const matchingProvisions = provisions.filter((p) => matchingProvisionIds.includes(p.id)); - const matchingGroupNumbers = [...new Set(matchingProvisions.map((provision) => provision.provision_group))]; - if (matchingGroupNumbers.length > 0) { - return `There are unselected mandatory provisions the following groups: ${matchingGroupNumbers.join(', ')}`; + const mandatoryGroups: number[] = []; + for (let p of provisions) { + if (p.type === 'M' && !mandatoryGroups.includes(p.provision_group.provision_group)) { + mandatoryGroups.push(p.provision_group.provision_group); + } + } + const nonEmptyProvisionGroups: number[] = []; + for (let p of provisions) { + if ( + selectedProvisionIds.includes(p.provision_id) && + !nonEmptyProvisionGroups.includes(p.provision_group.provision_group) + ) { + nonEmptyProvisionGroups.push(p.provision_group.provision_group); + } + } + const emptyMandatoryGroups = mandatoryGroups.filter((id) => !nonEmptyProvisionGroups.includes(id)); + emptyMandatoryGroups.sort((a, b) => a - b); + if (emptyMandatoryGroups.length > 0) { + return `There are unselected mandatory provisions the following groups: ${emptyMandatoryGroups.join(', ')}`; } else { return null; } @@ -276,6 +296,8 @@ const LandingPage: FC = () => { setData(null); setIsOpen(false); setSelectedDocTypeId(null); + setShowError(false); + setShowGenerateError(false); }; const getReportData = () => { @@ -297,36 +319,35 @@ const LandingPage: FC = () => { return { variableJsonArray, provisionJsonArray }; }; - const handleDocumentSave = () => { - const saveData = async () => { - if (dtid && documentType) { - try { - setLoading(true); - const { variableSaveData, provisionSaveData } = getSaveData(); - await saveDocument(dtid, documentType.id, provisionSaveData, variableSaveData); - } catch (err) { - console.log('Error saving Document Data'); - console.log(err); - } finally { - setLoading(false); - } - } else { - console.log('No DTID was found.'); + const handleDocumentSave = async () => { + if (dtid && documentType) { + try { + setLoading(true); + const { variableSaveData, provisionSaveData } = getSaveData(); + await saveDocument(dtid, documentType.id, provisionSaveData, variableSaveData); + } catch (err) { + console.log('Error saving Document Data'); + console.log(err); + } finally { + setLoading(false); } - }; - saveData(); + } else { + console.log('No DTID was found.'); + } }; - const handleGenerateReport = () => { + const handleGenerateReport = async () => { try { + setShowGenerateError(false); + setLoading(true); + await handleDocumentSave(); setLoading(true); - handleDocumentSave(); if (dtid) { const errorMessage = validateProvisions(); if (!errorMessage) { if (data && documentType && documentType.id) { const { variableJsonArray, provisionJsonArray } = getReportData(); - generateReport( + await generateReport( dtid, data && data.fileNum ? data.fileNum : '', documentType.id, @@ -335,11 +356,15 @@ const LandingPage: FC = () => { ); } } else { - alert(errorMessage); + setGenerateError(errorMessage); + setShowGenerateError(true); + // alert(errorMessage); } } } catch (err) { console.log(err); + setGenerateError('Something went wrong.'); + setShowGenerateError(true); // set error state } finally { setLoading(false); @@ -428,7 +453,14 @@ const LandingPage: FC = () => { ) : ( <> )} - + <> + {' '} + {showGenerateError && ( + + {generateError} + + )} +
<>