From 341e96163d6c5dfe54705d31b4f90fdbd66875ab Mon Sep 17 00:00:00 2001 From: mgtennant <100305096+mgtennant@users.noreply.github.com> Date: Wed, 20 Mar 2024 08:49:21 -0700 Subject: [PATCH 1/2] wip --- .../src/document_data/document_data.module.ts | 2 + .../document_data/document_data.service.ts | 49 +++++------ backend/src/provision/provision.service.ts | 13 ++- backend/src/report/report.controller.ts | 33 ++++---- backend/src/report/report.service.ts | 82 ++----------------- frontend/src/app/App.tsx | 9 ++ frontend/src/app/common/report.ts | 36 ++++---- .../table/reports/ProvisionsTable.tsx | 14 +++- .../table/reports/SelectedProvisionsTable.tsx | 8 +- .../table/reports/VariablesTable.tsx | 44 +++++++--- .../src/app/content/display/Provisions.tsx | 23 ++---- frontend/src/app/content/pages/ReportPage.tsx | 60 ++++++++------ .../pages/documentpreview/DocumentPreview.tsx | 4 +- 13 files changed, 170 insertions(+), 207 deletions(-) diff --git a/backend/src/document_data/document_data.module.ts b/backend/src/document_data/document_data.module.ts index d1d080ac..542b019e 100644 --- a/backend/src/document_data/document_data.module.ts +++ b/backend/src/document_data/document_data.module.ts @@ -10,6 +10,7 @@ import { DocumentDataVariable } from './entities/document_data_variable.entity'; import { DocumentDataController } from './document_data.controller'; import { DocumentDataService } from './document_data.service'; import { DocumentDataLog } from 'src/document_data_log/entities/document_data_log.entity'; +import { DocumentTypeModule } from 'src/document_type/document_type.module'; @Module({ imports: [ @@ -20,6 +21,7 @@ import { DocumentDataLog } from 'src/document_data_log/entities/document_data_lo TypeOrmModule.forFeature([Provision]), ProvisionModule, DocumentTemplateModule, + DocumentTypeModule, ], controllers: [DocumentDataController], providers: [DocumentDataService], diff --git a/backend/src/document_data/document_data.service.ts b/backend/src/document_data/document_data.service.ts index 23821cd0..b6539511 100644 --- a/backend/src/document_data/document_data.service.ts +++ b/backend/src/document_data/document_data.service.ts @@ -11,6 +11,7 @@ import { DocumentDataView } from './entities/document_data_vw'; import { ProvisionService } from 'src/provision/provision.service'; import { DocumentTemplateService } from 'src/document_template/document_template.service'; import { DocumentType } from 'src/document_type/entities/document_type.entity'; +import { DocumentTypeService } from 'src/document_type/document_type.service'; @Injectable() export class DocumentDataService { @@ -27,6 +28,7 @@ export class DocumentDataService { private documentDataVariableRepository: Repository, private provisionService: ProvisionService, private documentTemplateService: DocumentTemplateService, + private documentTypeService: DocumentTypeService, private dataSource: DataSource ) {} @@ -35,8 +37,8 @@ export class DocumentDataService { provisionArray: { provision_id: number; free_text: string }[], variableArray: { variable_id: number; variable_value: string }[] ): Promise { + console.log(variableArray); const { dtid, document_type_id } = documentDataDto; - // const documentType: DocumentType = await this.documentTemplateService.getDocumentType(document_type_id); const documentData: DocumentData = await this.documentDataRepository.findOne({ where: { dtid: dtid, document_type: { id: document_type_id } }, relations: [ @@ -73,6 +75,8 @@ export class DocumentDataService { documentDataDto.document_type_id ); documentDataDto['template_id'] = documentTemplate ? documentTemplate.id : null; + documentDataDto['document_type'] = await this.documentTypeService.findById(document_type_id); + delete documentDataDto['document_type_id']; const newDocumentData: DocumentData = this.documentDataRepository.create(documentDataDto); const updatedDocumentData = await this.documentDataRepository.save(newDocumentData); @@ -252,34 +256,31 @@ export class DocumentDataService { provisionIds: number[]; variableIds: number[]; }> { + console.log(`document_type_id: ${document_type_id}, dtid: ${dtid}`); try { const documentData = await this.documentDataRepository.find({ where: { dtid: dtid }, - join: { - alias: 'document_data', - leftJoinAndSelect: { - document_data_provisions: 'document_data.document_data_provisions', - document_provision: 'document_data_provisions.document_provision', - document_data_variables: 'document_data.document_data_variables', - document_variable: 'document_data_variables.document_variable', + relations: { + document_data_provisions: { + document_provision: true, }, + document_data_variables: { + document_variable: true, + }, + document_type: true, }, }); - const filteredDocumentData = documentData.find((d) => d.document_type.id === document_type_id); - console.log(filteredDocumentData); + const filteredDocumentData = documentData.find((d) => d.document_type && d.document_type.id === document_type_id); const provisionIds = - filteredDocumentData && filteredDocumentData.document_data_provisions - ? filteredDocumentData.document_data_provisions.map((dataProvision) => dataProvision.document_provision.id) - : []; + filteredDocumentData?.document_data_provisions?.map((dataProvision) => dataProvision.document_provision.id) ?? + []; const variableIds = - filteredDocumentData && filteredDocumentData.document_data_variables - ? filteredDocumentData.document_data_variables.map((dataVariable) => dataVariable.document_variable.id) - : []; - return { documentData: filteredDocumentData, provisionIds, variableIds }; + filteredDocumentData?.document_data_variables?.map((dataVariable) => dataVariable.document_variable.id) ?? []; + return { documentData: filteredDocumentData || null, provisionIds, variableIds }; } catch (err) { - console.log('Error in findActiveByDtid'); + console.log('Error in findDocumentDataByDocTypeIdAndDtid'); console.log(err); - return null; + return { documentData: null, provisionIds: [], variableIds: [] }; } } @@ -336,17 +337,11 @@ export class DocumentDataService { .where('document_data.dtid = :dtid', { dtid }) .andWhere('document_data."documentTypeId" = :document_type_id', { document_type_id }) .getOne(); - console.log(documentData); - - // if the documentData doesn't exist yet, return null. This null value is caught elsewhere. - if (!documentData) { - return null; - } // saved provisions attached to the dtid const existingDataProvisions: DocumentDataProvision[] = []; - existingDataProvisions.push(...documentData.document_data_provisions); - // all provisions + if (documentData) existingDataProvisions.push(...documentData.document_data_provisions); + // all provisions with the specified document_type_id const provisions: Provision[] = await this.provisionService.getAllProvisionsByDocTypeId(document_type_id); const provisionIds = existingDataProvisions.map((dataProvision) => dataProvision.document_provision.id); return { provisions, provisionIds }; diff --git a/backend/src/provision/provision.service.ts b/backend/src/provision/provision.service.ts index 056181cc..20654b81 100644 --- a/backend/src/provision/provision.service.ts +++ b/backend/src/provision/provision.service.ts @@ -199,16 +199,15 @@ export class ProvisionService { const provisions: Provision[] = await this.provisionRepository .createQueryBuilder('provision') .innerJoinAndSelect('provision.provision_group', 'provision_group') - .innerJoin('provision_group.document_type', 'document_type') - .where('document_type.id = :document_type_id', { document_type_id }) - .andWhere('is_deleted = false') + .innerJoin('provision.document_types', 'document_type', 'document_type.id = :document_type_id', { + document_type_id, + }) + .where('provision.is_deleted = false') .getMany(); - return provisions; } catch (err) { - console.log('Error in getAllProvisionsByDocTypeId'); - console.log(err); - return null; + console.error('Error in getAllProvisionsByDocTypeId', err); + return []; } } diff --git a/backend/src/report/report.controller.ts b/backend/src/report/report.controller.ts index 4d582a98..520465fa 100644 --- a/backend/src/report/report.controller.ts +++ b/backend/src/report/report.controller.ts @@ -38,23 +38,21 @@ export class ReportController { }; } - // @Get('get-data/:dtid') - // async getData(@Session() session: { data?: SessionData }, @Param('dtid') dtid: number) { - // console.log(dtid); - // console.log(session); - // await this.reportService.getTtlsDataByDtid(dtid); - // await this.ttlsService.setWebadeToken(); - // const response: any = await firstValueFrom(this.ttlsService.callHttp(dtid)) - // .then((res) => { - // return res; - // }) - // .catch((err) => { - // console.log('callHttp failed'); - // console.log(err); - // console.log(err.response.data); - // }); - // return response; - // } + // Gets data from ttls route for displaying on report page + @Get('get-data/:dtid') + async getData(@Session() session: { data?: SessionData }, @Param('dtid') dtid: number) { + await this.ttlsService.setWebadeToken(); + const response: any = await firstValueFrom(this.ttlsService.callHttp(dtid)) + .then((res) => { + return res; + }) + .catch((err) => { + console.log('callHttp failed'); + console.log(err); + console.log(err.response.data); + }); + return response; + } @Get('get-document-data/:document_type_id/:dtid') getDocumentDataByDocTypeIdAndDtid( @@ -62,7 +60,6 @@ export class ReportController { @Param('document_type_id') document_type_id: number, @Param('dtid') dtid: number ) { - console.log('get-document-data ~ dtid:' + dtid + ', doctypeid: ' + document_type_id); return this.reportService.getDocumentDataByDocTypeIdAndDtid(document_type_id, dtid); } diff --git a/backend/src/report/report.service.ts b/backend/src/report/report.service.ts index 2568ca26..f8ce1758 100644 --- a/backend/src/report/report.service.ts +++ b/backend/src/report/report.service.ts @@ -11,6 +11,7 @@ import { DocumentDataService } from 'src/document_data/document_data.service'; import { DocumentTemplate } from 'src/document_template/entities/document_template.entity'; import { DocumentDataLogService } from 'src/document_data_log/document_data_log.service'; import { DocumentTypeService } from 'src/document_type/document_type.service'; +import { Provision } from 'src/provision/entities/provision.entity'; const axios = require('axios'); // generate report needs to be consolidated which is impossible until we figure out how provisions & variables will be dynamically inserted into the docx files @@ -750,54 +751,11 @@ export class ReportService { return response2.data; } - async getDocumentProvisionsByDocTypeIdAndDtid(document_type_id: number, dtid: number): Promise { - const returnItems = [ - 'type', - 'provision_name', - 'help_text', - 'free_text', - 'category', - 'provision_group', - 'id', - 'mandatory', - ]; - let reduced, provisions; - // nfrDataId exists so return a list of provisions with pre-existing free_text data inserted, certain provisions preselected - const documentProvisions = await this.documentDataService.getProvisionsByDocTypeIdAndDtid(document_type_id, dtid); - if (documentProvisions) { - const provisionIds = documentProvisions.provisionIds; - provisions = documentProvisions.provisions; - reduced = provisions.map((obj) => { - if (provisionIds.includes(obj.id)) { - obj.select = true; - } else { - obj.select = false; - } - return obj; - }); - } else { - // no nfrDataId so just return generic provisions with all of them deselected by default - provisions = await this.provisionService.getProvisionsByDocumentTypeId(document_type_id); - reduced = provisions.map((obj) => - Object.keys(obj) - .filter((key) => returnItems.includes(key)) - .reduce( - (acc, key) => { - acc[key] = obj[key]; - return acc; - }, - { select: false } - ) - ); - } - // make the returned data readable for the ajax request - return reduced.map((obj) => { - const groupObj = obj.provision_group; - delete obj['provision_group']; - obj['max'] = groupObj.max; - obj['provision_group'] = groupObj.provision_group; - return obj; - }); + async getDocumentProvisionsByDocTypeIdAndDtid( + document_type_id: number, + dtid: number + ): Promise<{ provisions: Provision[]; provisionIds: number[] }> { + return this.documentDataService.getProvisionsByDocTypeIdAndDtid(document_type_id, dtid); } getGroupMaxByDocTypeId(document_type_id: number): Promise { @@ -856,32 +814,6 @@ export class ReportService { async getDocumentDataByDocTypeIdAndDtid(document_type_id: number, dtid: number): Promise { return this.documentDataService.findDocumentDataByDocTypeIdAndDtid(document_type_id, dtid); - // const url = `${hostname}:${port}/document-data/dtid/${dtid}`; - // const response = await axios - // .get(url, { - // headers: { - // 'Content-Type': 'application/json', - // }, - // }) - // .then((res) => { - // return res.data; - // }); - // // const documentData = await this.documentDataService.findActiveByDtid(dtid); - // // console.log('!!!~~~~~~~~'); - // // console.log("this.getGroupMaxByVariant('NOTICE OF FINAL REVIEW')"); - // // const groupMax = await this.getGroupMaxByVariant('NOTICE OF FINAL REVIEW'); - // // // console.log(groupMax); - // // console.log('\ngetActiveNfrDataByDtid'); - // // console.log(response); - // // console.log('\ndocument_data_provisions'); - // // // console.log(response.nfrData.document_data_provisions); - // // console.log('\ndocument_data_variables'); - // // // console.log(response.nfrData.document_data_variables); - // // console.log('\nthis.getMandatoryProvisionsByVariant(NOTICE OF FINAL REVIEW)'); - // // const mandatoryProvisions = await this.getMandatoryProvisionsByVariant('NOTICE OF FINAL REVIEW'); - // // // console.log(mandatoryProvisions); - // // console.log('~~~~~~~~!!!'); - // return response; } // async saveNFR( @@ -928,7 +860,7 @@ export class ReportService { const data = { dtid: dtid, document_type_id: document_type_id, - template_id: documentTemplate.id, + template_id: documentTemplate ? documentTemplate.id : null, status: status, create_userid: idir_username, ttls_data: [], diff --git a/frontend/src/app/App.tsx b/frontend/src/app/App.tsx index 500dba19..cc380ded 100644 --- a/frontend/src/app/App.tsx +++ b/frontend/src/app/App.tsx @@ -12,6 +12,7 @@ import ContentWrapper from './content/ContentWrapper'; import SystemAdministration from './content/pages/SystemAdministration'; import ManageProvisionsPage from './content/pages/ManageProvisionsPage'; import ManageDocumentsPage from './content/pages/ManageDocumentsPage'; +import DocumentPreview from './content/pages/documentpreview/DocumentPreview'; const App: FC = () => { // used to render report pages @@ -29,6 +30,14 @@ const App: FC = () => {
+ + + + } + /> { -// const dataUrl = `${config.API_BASE_URL}/report/get-data/${dtid}`; - -// const data: DTR = await api.get({ url: dataUrl }); -// const displayData = buildDTRDisplayData(data); -// return displayData; -// } - -export async function getData(document_type_id: number, dtid: number): Promise { - const dataUrl = `${config.API_BASE_URL}/report/get-document-data/${document_type_id}/${dtid}`; - const data: DTR = await api.get({ url: dataUrl }); - console.log(data); +/** + * Gets ttls data and parses it for displaying + * + * @param dtid + * @returns + */ +export async function getDisplayData(dtid: number): Promise { + const url = `${config.API_BASE_URL}/report/get-data/${dtid}`; + const getParameters = api.generateApiParameters(url); + const data: DTR = await api.get(getParameters); const displayData = buildDTRDisplayData(data); return displayData; } -/** Section for Notice of Final Review which has lots of custom logic */ export const getDocumentDataByDocTypeIdAndDtid = async (document_type_id: number, dtid: number) => { const url = `${config.API_BASE_URL}/report/get-document-data/${document_type_id}/${dtid}`; const getParameters = api.generateApiParameters(url); @@ -54,10 +45,13 @@ export const getMandatoryProvisionsByDocTypeId = async (document_type_id: number export const getDocumentProvisionsByDocTypeIdDtid = async ( document_type_id: number, dtid: number -): Promise => { +): Promise<{ provisions: ProvisionData[]; provisionIds: number[] }> => { const url = `${config.API_BASE_URL}/report/provisions/${document_type_id}/${dtid}`; const getParameters = api.generateApiParameters(url); - const response: ProvisionData[] = await api.get(getParameters); + const response: { provisions: ProvisionData[]; provisionIds: number[] } = await api.get<{ + provisions: ProvisionData[]; + provisionIds: number[]; + }>(getParameters); return response; }; diff --git a/frontend/src/app/components/table/reports/ProvisionsTable.tsx b/frontend/src/app/components/table/reports/ProvisionsTable.tsx index 33b447da..61bb8c29 100644 --- a/frontend/src/app/components/table/reports/ProvisionsTable.tsx +++ b/frontend/src/app/components/table/reports/ProvisionsTable.tsx @@ -29,7 +29,9 @@ const ProvisionsTable: React.FC = ({ // get data useEffect(() => { const fetchData = async () => { - setAllProvisions(await getDocumentProvisionsByDocTypeIdDtid(docType.id, dtid)); + const fetchedProvisions: { provisions: ProvisionData[]; provisionIds: number[] } = + await getDocumentProvisionsByDocTypeIdDtid(docType.id, dtid); + setAllProvisions(fetchedProvisions.provisions); }; fetchData(); @@ -37,8 +39,14 @@ const ProvisionsTable: React.FC = ({ // filter based on current group useEffect(() => { - let filtered = allProvisions.filter((provision) => provision.provision_group === currentGroupNumber); - setFilteredProvisions(filtered); + if (allProvisions) { + console.log('allProvisions'); + console.log(allProvisions); + const filtered = allProvisions.filter( + (provision) => provision.provision_group.provision_group === currentGroupNumber + ); + setFilteredProvisions(filtered); + } }, [allProvisions, currentGroupNumber]); // xor logic for the two provisions which can't be selected at the same time. diff --git a/frontend/src/app/components/table/reports/SelectedProvisionsTable.tsx b/frontend/src/app/components/table/reports/SelectedProvisionsTable.tsx index 66930db1..00448353 100644 --- a/frontend/src/app/components/table/reports/SelectedProvisionsTable.tsx +++ b/frontend/src/app/components/table/reports/SelectedProvisionsTable.tsx @@ -32,7 +32,9 @@ const SelectedProvisionsTable: React.FC = ({ // grab all provisions useEffect(() => { const fetchData = async () => { - setAllProvisions(await getDocumentProvisionsByDocTypeIdDtid(docType.id, dtid)); + const provisionData: { provisions: ProvisionData[]; provisionIds: number[] } = + await getDocumentProvisionsByDocTypeIdDtid(docType.id, dtid); + setAllProvisions(provisionData.provisions); }; fetchData(); }, [docType, dtid]); @@ -55,7 +57,7 @@ const SelectedProvisionsTable: React.FC = ({ const collectProvisionData = () => { const provisionJson: ProvisionJson[] = selectedProvisions.map((provision) => ({ provision_id: provision.id, - provision_group: provision.provision_group, + provision_group: provision.provision_group.provision_group, provision_name: provision.provision_name, free_text: provision.free_text, })); @@ -75,7 +77,7 @@ const SelectedProvisionsTable: React.FC = ({ }), columnHelper.accessor('provision_group', { id: 'provision_group', - cell: (info) => , + cell: (info) => , header: () => 'Group', meta: { customCss: { width: '5%' } }, }), diff --git a/frontend/src/app/components/table/reports/VariablesTable.tsx b/frontend/src/app/components/table/reports/VariablesTable.tsx index f21df826..da083a38 100644 --- a/frontend/src/app/components/table/reports/VariablesTable.tsx +++ b/frontend/src/app/components/table/reports/VariablesTable.tsx @@ -23,6 +23,28 @@ interface VariablesTableProps { const VariablesTable: React.FC = React.memo(({ variables, updateHandler }) => { const [initialized, setInitialized] = useState(false); + const [edits, setEdits] = useState<{ [variableId: number]: string }>({}); + + const handleEdit = (variableId: number, newValue: string) => { + setEdits((currentEdits) => ({ ...currentEdits, [variableId]: newValue })); + }; + + useEffect(() => { + return () => { + const updatedVariables = variables.map((variable) => ({ + ...variable, + variable_value: edits[variable.id] ?? variable.variable_value, + })); + const variableJson = updatedVariables.map((variable) => ({ + provision_id: variable.provision.id, + variable_id: variable.id, + variable_name: variable.variable_name, + variable_value: variable.variable_value, + })); + updateHandler(variableJson); + }; + }, [edits]); + const saveChanges = (variableId: number, newValue: string) => { const updatedVariables = variables.map((variable) => variable.id === variableId ? { ...variable, variable_value: newValue } : variable @@ -36,7 +58,6 @@ const VariablesTable: React.FC = React.memo(({ variables, u updateHandler(variableJson); }; - // parent state is [] so initialize the variables from here useEffect(() => { if (variables.length > 0 && !initialized) { setInitialized(true); @@ -62,7 +83,7 @@ const VariablesTable: React.FC = React.memo(({ variables, u columnHelper.accessor('variable_value', { id: 'variable_value', cell: (info) => ( - + ), header: () => 'Enter Text', meta: { customCss: { width: '36%' } }, @@ -93,18 +114,17 @@ interface VariableValueCellProps { const VariableValueCell: React.FC = ({ value, updateValue, variableId }) => { const [inputValue, setInputValue] = useState(value); - const handleBlur = () => { - updateValue(variableId, inputValue); + useEffect(() => { + setInputValue(value); + }, [value]); + + const handleChange = (e: React.ChangeEvent) => { + const newValue = e.target.value; + setInputValue(newValue); + updateValue(variableId, newValue); }; - return ( - setInputValue(e.target.value)} - onBlur={handleBlur} - style={{ width: '100%' }} - /> - ); + return ; }; export default VariablesTable; diff --git a/frontend/src/app/content/display/Provisions.tsx b/frontend/src/app/content/display/Provisions.tsx index b0dec14c..5c8e0826 100644 --- a/frontend/src/app/content/display/Provisions.tsx +++ b/frontend/src/app/content/display/Provisions.tsx @@ -12,9 +12,8 @@ interface ProvisionsProps { updateSelectedProvisionIds: (selectedProvisionIds: number[]) => void; } -// TODO - variants are being removed, provisions will now have an array of document types instead of variants - export type ProvisionData = { + id: number; type: string; provision_name: string; free_text: string; @@ -22,13 +21,13 @@ export type ProvisionData = { active_flag: boolean; create_userid: string; update_userid: string; - id: number; help_text: string; create_timestamp: string; update_timestamp: string; select: boolean; max: number; - provision_group: number; + provision_group: ProvisionGroup; + is_deleted: boolean; }; const Provisions: FC = ({ @@ -38,28 +37,22 @@ const Provisions: FC = ({ updateHandler, updateSelectedProvisionIds, }) => { - const [documentData, setDocumentData] = useState(null); const [selectedProvisionIds, setSelectedProvisionIds] = useState([]); const [selectedProvisionGroup, setSelectedProvisionGroup] = useState(null); const [selectedProvisionGroupMax, setSelectedProvisionGroupMax] = useState(null); const [viewedProvisionGroups, setViewedProvisionGroups] = useState>(new Set()); - // Fetch NFR data if we are on the NFR page useEffect(() => { const fetchData = async () => { - if (documentType && documentType.name) { - if (dtid) { - const documentData: DocumentDataObject = await getDocumentDataByDocTypeIdAndDtid(documentType.id, dtid); - console.log(documentData); - if (documentData) { - setDocumentData(documentData); - setSelectedProvisionIds(documentData.provisionIds); - } + if (dtid && documentType && documentType.id) { + const documentData: DocumentDataObject = await getDocumentDataByDocTypeIdAndDtid(documentType.id, dtid); + if (documentData) { + setSelectedProvisionIds(documentData.provisionIds); } } }; fetchData(); - }, [dtid, documentType]); + }, [dtid, documentType.id]); const handleProvisionGroupChange = (event: React.ChangeEvent) => { const value = parseInt(event.target.value); diff --git a/frontend/src/app/content/pages/ReportPage.tsx b/frontend/src/app/content/pages/ReportPage.tsx index 1d7bc78f..ca3a5879 100644 --- a/frontend/src/app/content/pages/ReportPage.tsx +++ b/frontend/src/app/content/pages/ReportPage.tsx @@ -1,16 +1,17 @@ import { FC, useCallback, useEffect, useState } from 'react'; import Collapsible from '../../../app/components/common/Collapsible'; -import { DTRDisplayObject, DocType, ProvisionGroup } from '../../../app/types/types'; +import { DTRDisplayObject, DocType, DocumentDataObject, ProvisionGroup } from '../../../app/types/types'; import TenureDetails from '../display/TenureDetails'; import AreaDetails from '../display/AreaDetails'; import DtidDetails from '../display/DtidDetails'; import { generateReport, - getData, + getDisplayData, getDocumentProvisionsByDocTypeIdDtid, saveDocument, getMandatoryProvisionsByDocTypeId, getGroupMaxByDocTypeId, + getDocumentDataByDocTypeIdAndDtid, } from '../../common/report'; import { CURRENT_REPORT_PAGES } from '../../util/constants'; import InterestedParties from '../display/InterestedParties'; @@ -39,33 +40,39 @@ const ReportPage: FC = ({ documentType }) => { const [selectedProvisionIds, setSelectedProvisionIds] = useState([]); const [mandatoryProvisionIds, setMandatoryProvisionIds] = useState([]); const [provisionGroups, setProvisionGroups] = useState([]); - useEffect(() => { const fetchData = async () => { - if (dtidNumber) { - try { - setLoading(true); - const fetchedData: DTRDisplayObject = await getData(documentType.id, dtidNumber); - setData(fetchedData); - const fetchProvisions: ProvisionData[] = await getDocumentProvisionsByDocTypeIdDtid( - documentType.id, - dtidNumber - ); - setAllProvisions(fetchProvisions); - const mpIds: number[] = await getMandatoryProvisionsByDocTypeId(documentType.id); - setMandatoryProvisionIds(mpIds); - const provisionGroupsObject: ProvisionGroup[] = await getGroupMaxByDocTypeId(documentType.id); - setProvisionGroups(provisionGroupsObject); - } catch (error) { - console.error('Failed to fetch data', error); - setData(null); - } finally { - setLoading(false); - } + if (!dtidNumber) return; + try { + setLoading(true); + // Fetch any existing documentData + const displayData: DTRDisplayObject = await getDisplayData(dtidNumber); + setData(displayData); + // provisions, will be validated against + const fetchProvisions: { provisions: ProvisionData[]; provisionIds: number[] } = + await getDocumentProvisionsByDocTypeIdDtid(documentType.id, dtidNumber); + setAllProvisions(fetchProvisions.provisions); + const activeProvisionIDs = new Set( + fetchProvisions.provisions + .filter((provision) => provision.active_flag && !provision.is_deleted) + .map((provision) => provision.provision_group.id) + ); + // mandatory provisions, will be validated against + const mpIds: number[] = await getMandatoryProvisionsByDocTypeId(documentType.id); + setMandatoryProvisionIds(mpIds); + // get provision groups and filter out the empty ones + const provisionGroupsObject: ProvisionGroup[] = await getGroupMaxByDocTypeId(documentType.id); + const activeProvisionGroups = provisionGroupsObject.filter((group) => activeProvisionIDs.has(group.id)); + setProvisionGroups(activeProvisionGroups); + } catch (error) { + console.error('Failed to fetch data', error); + setData(null); + } finally { + setLoading(false); } }; fetchData(); - }, [dtidNumber, documentType]); + }, [dtidNumber, documentType.id]); const handleGenerateReport = () => { if (dtidNumber) { @@ -98,6 +105,8 @@ const ReportPage: FC = ({ documentType }) => { }, []); const updateVariableArray = useCallback((variableJsonData: VariableJson[]) => { + console.log('variableJsonData'); + console.log(variableJsonData); // used for saving setVariableArray( variableJsonData.map((variable) => { @@ -124,6 +133,9 @@ const ReportPage: FC = ({ documentType }) => { }, []); const handleDocumentSave = () => { + console.log('saving...'); + console.log('variableArray'); + console.log(variableArray); const saveData = async () => { if (dtidNumber) { try { diff --git a/frontend/src/app/content/pages/documentpreview/DocumentPreview.tsx b/frontend/src/app/content/pages/documentpreview/DocumentPreview.tsx index 26a2b0a4..f4307ffe 100644 --- a/frontend/src/app/content/pages/documentpreview/DocumentPreview.tsx +++ b/frontend/src/app/content/pages/documentpreview/DocumentPreview.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; import { - getData, + getDisplayData, getDocumentProvisionsByDocTypeIdDtid, getDocumentVariablesByDocTypeIdDtid, } from '../../../common/report'; @@ -104,7 +104,7 @@ const DocumentPreview: React.FC = () => { }; const fetchData = async () => { - const nfrData = (await getData(1, parseInt(dtid))) as DocumentPreviewResponse; + const nfrData = (await getDisplayData(parseInt(dtid))) as DocumentPreviewResponse; if (nfrData) { setDocumentPreviewResponse(nfrData); const dataProvisions = await getDocumentProvisionsByDocTypeIdDtid(1, 928437); From 6c545fde6c68825d925a80f41e5a999974788e0d Mon Sep 17 00:00:00 2001 From: mgtennant <100305096+mgtennant@users.noreply.github.com> Date: Wed, 20 Mar 2024 13:05:34 -0700 Subject: [PATCH 2/2] turn off initdb, switch backend port --- backend/src/main.ts | 4 ++-- backend/src/ormconfig.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/main.ts b/backend/src/main.ts index 8dddd1e6..982a558e 100644 --- a/backend/src/main.ts +++ b/backend/src/main.ts @@ -20,8 +20,8 @@ async function bootstrap() { const document = SwaggerModule.createDocument(app, config); SwaggerModule.setup('api', app, document); const appService = app.get(AppService); - await appService.initializeDb(); + // await appService.initializeDb(); - await app.listen(3001); + await app.listen(3000); } bootstrap(); diff --git a/backend/src/ormconfig.ts b/backend/src/ormconfig.ts index 39046219..8e630a5e 100644 --- a/backend/src/ormconfig.ts +++ b/backend/src/ormconfig.ts @@ -27,7 +27,7 @@ const config: TypeOrmModuleOptions = { DocumentTemplate, DocumentType, ], - synchronize: true, + synchronize: false, }; export default config;