From b32721536613d605da19b6f51bfd1bf162bebb65 Mon Sep 17 00:00:00 2001 From: andreighh <61791875+andreighh@users.noreply.github.com> Date: Wed, 28 Jan 2026 12:19:28 +0200 Subject: [PATCH 1/6] Move confirm dialog --- frontend/src/contexts/AnnualProjectReport/APRContext.tsx | 2 +- frontend/src/contexts/AnnualProjectReport/APRProvider.tsx | 2 +- .../src/contexts/{AnnualProjectReport => }/ConfirmDialog.tsx | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename frontend/src/contexts/{AnnualProjectReport => }/ConfirmDialog.tsx (100%) diff --git a/frontend/src/contexts/AnnualProjectReport/APRContext.tsx b/frontend/src/contexts/AnnualProjectReport/APRContext.tsx index 248137351..2be01b9e0 100644 --- a/frontend/src/contexts/AnnualProjectReport/APRContext.tsx +++ b/frontend/src/contexts/AnnualProjectReport/APRContext.tsx @@ -1,5 +1,5 @@ import { createContext, useContext } from 'react' -import { ConfirmOptions } from '@ors/contexts/AnnualProjectReport/ConfirmDialog.tsx' +import { ConfirmOptions } from '@ors/contexts/ConfirmDialog.tsx' import { UseApiReturn } from '@ors/hooks/useApi.ts' import { AnnualProgressReportCurrentYear } from '@ors/app/annual-project-report/types.ts' diff --git a/frontend/src/contexts/AnnualProjectReport/APRProvider.tsx b/frontend/src/contexts/AnnualProjectReport/APRProvider.tsx index 17fc487c3..bd3f10f2e 100644 --- a/frontend/src/contexts/AnnualProjectReport/APRProvider.tsx +++ b/frontend/src/contexts/AnnualProjectReport/APRProvider.tsx @@ -2,7 +2,7 @@ import { APRContext } from '@ors/contexts/AnnualProjectReport/APRContext.tsx' import { PropsWithChildren, useCallback, useContext, useState } from 'react' import ConfirmDialog, { ConfirmOptions, -} from '@ors/contexts/AnnualProjectReport/ConfirmDialog.tsx' +} from '@ors/contexts/ConfirmDialog.tsx' import useApi from '@ors/hooks/useApi.ts' import { AnnualProgressReportCurrentYear } from '@ors/app/annual-project-report/types.ts' import PermissionsContext from '@ors/contexts/PermissionsContext.tsx' diff --git a/frontend/src/contexts/AnnualProjectReport/ConfirmDialog.tsx b/frontend/src/contexts/ConfirmDialog.tsx similarity index 100% rename from frontend/src/contexts/AnnualProjectReport/ConfirmDialog.tsx rename to frontend/src/contexts/ConfirmDialog.tsx From 1732c45ffa3e573f1c92b39dee6008fae4476bcb Mon Sep 17 00:00:00 2001 From: andreighh <61791875+andreighh@users.noreply.github.com> Date: Wed, 28 Jan 2026 12:40:40 +0200 Subject: [PATCH 2/6] Refactor out Confirmation modal --- frontend/src/App.tsx | 37 +++++++------- .../[year]/edit/page.tsx | 2 +- .../[year]/mlfs/workspace/EndorseAPRModal.tsx | 2 +- .../[year]/mlfs/workspace/page.tsx | 6 +-- .../AnnualProgressReport/SubmitButton.tsx | 2 +- .../UploadDocumentsModal.tsx | 5 +- .../AnnualProjectReport/APRContext.tsx | 10 ---- .../AnnualProjectReport/APRProvider.tsx | 45 ++--------------- frontend/src/contexts/ConfirmationContext.tsx | 17 +++++++ .../src/contexts/ConfirmationProvider.tsx | 50 +++++++++++++++++++ 10 files changed, 98 insertions(+), 78 deletions(-) create mode 100644 frontend/src/contexts/ConfirmationContext.tsx create mode 100644 frontend/src/contexts/ConfirmationProvider.tsx diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 0467938c1..16e527e52 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -87,6 +87,7 @@ import APRMLFSWorkspace from '@ors/app/annual-project-report/[year]/mlfs/workspa import APREdit from '@ors/app/annual-project-report/[year]/edit/page.tsx' import APRProvider from '@ors/contexts/AnnualProjectReport/APRProvider.tsx' import AprRedirect from '@ors/components/manage/Blocks/AnnualProgressReport/AprRedirect.tsx' +import ConfirmationProvider from '@ors/contexts/ConfirmationProvider.tsx' function RedirectToSection() { const { canEditReplenishment } = useContext(PermissionsContext) @@ -441,23 +442,25 @@ export default function App() { - {/* APR routes */} - - - - - - - - - - - - - - - - + + {/* APR routes */} + + + + + + + + + + + + + + + + + diff --git a/frontend/src/app/annual-project-report/[year]/edit/page.tsx b/frontend/src/app/annual-project-report/[year]/edit/page.tsx index 25df0c319..f19e3f87c 100644 --- a/frontend/src/app/annual-project-report/[year]/edit/page.tsx +++ b/frontend/src/app/annual-project-report/[year]/edit/page.tsx @@ -27,7 +27,7 @@ import { AnnualAgencyProjectReport, AnnualProjectReport, } from '@ors/app/annual-project-report/types.ts' -import { useConfirmation } from '@ors/contexts/AnnualProjectReport/APRContext.tsx' +import { useConfirmation } from '@ors/contexts/ConfirmationContext.tsx' import { validateRows } from '@ors/components/manage/Blocks/AnnualProgressReport/validation.tsx' import ValidationErrors from '@ors/components/manage/Blocks/AnnualProgressReport/ValidationErrors.tsx' import usePageTitle from '@ors/hooks/usePageTitle.ts' diff --git a/frontend/src/app/annual-project-report/[year]/mlfs/workspace/EndorseAPRModal.tsx b/frontend/src/app/annual-project-report/[year]/mlfs/workspace/EndorseAPRModal.tsx index bb1e4c9e1..2599379af 100644 --- a/frontend/src/app/annual-project-report/[year]/mlfs/workspace/EndorseAPRModal.tsx +++ b/frontend/src/app/annual-project-report/[year]/mlfs/workspace/EndorseAPRModal.tsx @@ -10,7 +10,7 @@ import { IoInformationCircleOutline } from 'react-icons/io5' import { api } from '@ors/helpers' import cx from 'classnames' import { AnnualProgressReport } from '@ors/app/annual-project-report/types.ts' -import { useConfirmation } from '@ors/contexts/AnnualProjectReport/APRContext.tsx' +import { useConfirmation } from '@ors/contexts/ConfirmationContext.tsx' import dayjs from 'dayjs' import { handleActionErrors } from '@ors/components/manage/Blocks/AnnualProgressReport/errors.ts' diff --git a/frontend/src/app/annual-project-report/[year]/mlfs/workspace/page.tsx b/frontend/src/app/annual-project-report/[year]/mlfs/workspace/page.tsx index dc2bdab5a..9d563f705 100644 --- a/frontend/src/app/annual-project-report/[year]/mlfs/workspace/page.tsx +++ b/frontend/src/app/annual-project-report/[year]/mlfs/workspace/page.tsx @@ -50,10 +50,8 @@ import { FiUnlock, } from 'react-icons/fi' import { formatDate } from '@ors/components/manage/Blocks/AnnualProgressReport/utils.ts' -import { - useAPRCurrentYear, - useConfirmation, -} from '@ors/contexts/AnnualProjectReport/APRContext.tsx' +import { useAPRCurrentYear } from '@ors/contexts/AnnualProjectReport/APRContext.tsx' +import { useConfirmation } from '@ors/contexts/ConfirmationContext.tsx' import { enqueueSnackbar } from 'notistack' import { api, formatApiUrl } from '@ors/helpers' import EndorseAprModal from '@ors/app/annual-project-report/[year]/mlfs/workspace/EndorseAPRModal.tsx' diff --git a/frontend/src/components/manage/Blocks/AnnualProgressReport/SubmitButton.tsx b/frontend/src/components/manage/Blocks/AnnualProgressReport/SubmitButton.tsx index 75afdf995..18825f0e4 100644 --- a/frontend/src/components/manage/Blocks/AnnualProgressReport/SubmitButton.tsx +++ b/frontend/src/components/manage/Blocks/AnnualProgressReport/SubmitButton.tsx @@ -1,6 +1,6 @@ import React from 'react' import Button from '@mui/material/Button' -import { useConfirmation } from '@ors/contexts/AnnualProjectReport/APRContext.tsx' +import { useConfirmation } from '@ors/contexts/ConfirmationContext.tsx' import { api } from '@ors/helpers' import { enqueueSnackbar } from 'notistack' import { handleActionErrors } from '@ors/components/manage/Blocks/AnnualProgressReport/errors.ts' diff --git a/frontend/src/components/manage/Blocks/AnnualProgressReport/UploadDocumentsModal.tsx b/frontend/src/components/manage/Blocks/AnnualProgressReport/UploadDocumentsModal.tsx index 005c6482e..c40d26277 100644 --- a/frontend/src/components/manage/Blocks/AnnualProgressReport/UploadDocumentsModal.tsx +++ b/frontend/src/components/manage/Blocks/AnnualProgressReport/UploadDocumentsModal.tsx @@ -3,11 +3,10 @@ import { Alert, Box, IconButton, Link, Modal, Typography } from '@mui/material' import { CancelButton } from '@ors/components/manage/Blocks/ProjectsListing/HelperComponents.tsx' import Button from '@mui/material/Button' import Cookies from 'js-cookie' -import { formatApiUrl } from '@ors/helpers' +import { api, formatApiUrl } from '@ors/helpers' import { enqueueSnackbar } from 'notistack' import { IoInformationCircleOutline, IoTrash } from 'react-icons/io5' -import { api } from '@ors/helpers' -import { useConfirmation } from '@ors/contexts/AnnualProjectReport/APRContext.tsx' +import { useConfirmation } from '@ors/contexts/ConfirmationContext.tsx' import { APRFile } from '@ors/app/annual-project-report/types.ts' import { handleActionErrors } from '@ors/components/manage/Blocks/AnnualProgressReport/errors.ts' diff --git a/frontend/src/contexts/AnnualProjectReport/APRContext.tsx b/frontend/src/contexts/AnnualProjectReport/APRContext.tsx index 2be01b9e0..8125ca4de 100644 --- a/frontend/src/contexts/AnnualProjectReport/APRContext.tsx +++ b/frontend/src/contexts/AnnualProjectReport/APRContext.tsx @@ -1,23 +1,13 @@ import { createContext, useContext } from 'react' -import { ConfirmOptions } from '@ors/contexts/ConfirmDialog.tsx' import { UseApiReturn } from '@ors/hooks/useApi.ts' import { AnnualProgressReportCurrentYear } from '@ors/app/annual-project-report/types.ts' interface APRContextProps { - confirm: (options: ConfirmOptions) => Promise aprCurrentYear: UseApiReturn } export const APRContext = createContext(null) -export function useConfirmation() { - const ctx = useContext(APRContext) - if (!ctx) { - throw new Error('useConfirmation must be used inside ConfirmationProvider') - } - return ctx.confirm -} - export function useAPRCurrentYear() { const ctx = useContext(APRContext) if (!ctx) { diff --git a/frontend/src/contexts/AnnualProjectReport/APRProvider.tsx b/frontend/src/contexts/AnnualProjectReport/APRProvider.tsx index bd3f10f2e..689dcac17 100644 --- a/frontend/src/contexts/AnnualProjectReport/APRProvider.tsx +++ b/frontend/src/contexts/AnnualProjectReport/APRProvider.tsx @@ -1,28 +1,12 @@ import { APRContext } from '@ors/contexts/AnnualProjectReport/APRContext.tsx' -import { PropsWithChildren, useCallback, useContext, useState } from 'react' -import ConfirmDialog, { - ConfirmOptions, -} from '@ors/contexts/ConfirmDialog.tsx' +import { PropsWithChildren, useContext } from 'react' import useApi from '@ors/hooks/useApi.ts' import { AnnualProgressReportCurrentYear } from '@ors/app/annual-project-report/types.ts' import PermissionsContext from '@ors/contexts/PermissionsContext.tsx' -interface ProjectsDataProviderProps extends PropsWithChildren {} +interface APRProviderProps extends PropsWithChildren {} -interface DialogState { - open: boolean - options: ConfirmOptions - resolve?: (value: boolean) => void -} - -export default function APRProvider({ children }: ProjectsDataProviderProps) { - const [dialog, setDialog] = useState({ - open: false, - options: { - title: '', - message: '', - }, - }) +export default function APRProvider({ children }: APRProviderProps) { const { canViewAPR } = useContext(PermissionsContext) const aprCurrentYear = useApi({ options: { @@ -32,30 +16,9 @@ export default function APRProvider({ children }: ProjectsDataProviderProps) { path: `api/annual-project-report/current-year/`, }) - const confirm = useCallback((options: ConfirmOptions) => { - return new Promise((resolve) => { - setDialog({ - open: true, - options, - resolve, - }) - }) - }, []) - - const handleClose = (result: boolean) => { - dialog.resolve?.(result) - setDialog((prev) => ({ ...prev, open: false })) - } - return ( - + {children} - handleClose(true)} - onCancel={() => handleClose(false)} - {...dialog.options} - /> ) } diff --git a/frontend/src/contexts/ConfirmationContext.tsx b/frontend/src/contexts/ConfirmationContext.tsx new file mode 100644 index 000000000..d49a839bc --- /dev/null +++ b/frontend/src/contexts/ConfirmationContext.tsx @@ -0,0 +1,17 @@ +import { ConfirmOptions } from '@ors/contexts/ConfirmDialog.tsx' +import { createContext, useContext } from 'react' + +interface ConfirmationContextProps { + confirm: (options: ConfirmOptions) => Promise +} + +export const ConfirmationContext = + createContext(null) + +export function useConfirmation() { + const ctx = useContext(ConfirmationContext) + if (!ctx) { + throw new Error('useConfirmation must be used inside ConfirmationProvider') + } + return ctx.confirm +} diff --git a/frontend/src/contexts/ConfirmationProvider.tsx b/frontend/src/contexts/ConfirmationProvider.tsx new file mode 100644 index 000000000..4ae999e10 --- /dev/null +++ b/frontend/src/contexts/ConfirmationProvider.tsx @@ -0,0 +1,50 @@ +import { PropsWithChildren, useCallback, useState } from 'react' +import ConfirmDialog, { ConfirmOptions } from '@ors/contexts/ConfirmDialog.tsx' +import { ConfirmationContext } from '@ors/contexts/ConfirmationContext.tsx' + +interface ConfirmationProviderProps extends PropsWithChildren {} + +interface DialogState { + open: boolean + options: ConfirmOptions + resolve?: (value: boolean) => void +} + +export default function ConfirmationProvider({ + children, +}: ConfirmationProviderProps) { + const [dialog, setDialog] = useState({ + open: false, + options: { + title: '', + message: '', + }, + }) + + const confirm = useCallback((options: ConfirmOptions) => { + return new Promise((resolve) => { + setDialog({ + open: true, + options, + resolve, + }) + }) + }, []) + + const handleClose = (result: boolean) => { + dialog.resolve?.(result) + setDialog((prev) => ({ ...prev, open: false })) + } + + return ( + + {children} + handleClose(true)} + onCancel={() => handleClose(false)} + {...dialog.options} + /> + + ) +} From 052a29b25fbc3d962d21cd8dc4dfbff45c11b967 Mon Sep 17 00:00:00 2001 From: andreighh <61791875+andreighh@users.noreply.github.com> Date: Wed, 28 Jan 2026 15:44:14 +0200 Subject: [PATCH 3/6] Add pcr view page --- frontend/src/App.tsx | 5 +++++ .../src/app/project-completion-report/view/page.tsx | 10 ++++++++++ 2 files changed, 15 insertions(+) create mode 100644 frontend/src/app/project-completion-report/view/page.tsx diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 16e527e52..99c12663b 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -88,6 +88,7 @@ import APREdit from '@ors/app/annual-project-report/[year]/edit/page.tsx' import APRProvider from '@ors/contexts/AnnualProjectReport/APRProvider.tsx' import AprRedirect from '@ors/components/manage/Blocks/AnnualProgressReport/AprRedirect.tsx' import ConfirmationProvider from '@ors/contexts/ConfirmationProvider.tsx' +import PCRView from '@ors/app/project-completion-report/view/page.tsx' function RedirectToSection() { const { canEditReplenishment } = useContext(PermissionsContext) @@ -460,6 +461,10 @@ export default function App() { + {/* PCR routes */} + + + diff --git a/frontend/src/app/project-completion-report/view/page.tsx b/frontend/src/app/project-completion-report/view/page.tsx new file mode 100644 index 000000000..bc429227b --- /dev/null +++ b/frontend/src/app/project-completion-report/view/page.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import PageWrapper from '@ors/components/theme/PageWrapper/PageWrapper.tsx' + +function PCRView() { + return +
+
+} + +export default PCRView From a55272eff5a14d975a05bcfb4f9c12fa9024d577 Mon Sep 17 00:00:00 2001 From: andreighh <61791875+andreighh@users.noreply.github.com> Date: Wed, 28 Jan 2026 16:36:30 +0200 Subject: [PATCH 4/6] Allow pcr and apr to share files --- frontend/src/App.tsx | 2 +- .../[year]/edit/page.tsx | 10 +++++----- .../[year]/mlfs/workspace/EndorseAPRModal.tsx | 2 +- .../[year]/mlfs/workspace/page.tsx | 20 +++++++++---------- .../[year]/workspace/page.tsx | 16 +++++++-------- .../AnnualProgressReport/AprRedirect.tsx | 2 +- .../AnnualProgressReport/AprYearDropdown.tsx | 0 .../AnnualProgressReport/CellValidation.tsx | 2 +- .../AnnualProgressReport/StatusFilter.tsx | 0 .../AnnualProgressReport/SubmitButton.tsx | 2 +- .../UploadDocumentsModal.tsx | 2 +- .../AnnualProgressReport/ValidationErrors.tsx | 0 .../AnnualProgressReport/constants.ts | 0 .../AnnualProgressReport/schema.tsx | 6 +++--- .../AnnualProgressReport/validation.tsx | 2 +- .../BackLink.tsx | 0 .../Loader.tsx | 0 .../errors.ts | 0 .../utils.ts | 0 19 files changed, 33 insertions(+), 33 deletions(-) rename frontend/src/components/manage/Blocks/{ => ProjectReport}/AnnualProgressReport/AprRedirect.tsx (89%) rename frontend/src/components/manage/Blocks/{ => ProjectReport}/AnnualProgressReport/AprYearDropdown.tsx (100%) rename frontend/src/components/manage/Blocks/{ => ProjectReport}/AnnualProgressReport/CellValidation.tsx (87%) rename frontend/src/components/manage/Blocks/{ => ProjectReport}/AnnualProgressReport/StatusFilter.tsx (100%) rename frontend/src/components/manage/Blocks/{ => ProjectReport}/AnnualProgressReport/SubmitButton.tsx (97%) rename frontend/src/components/manage/Blocks/{ => ProjectReport}/AnnualProgressReport/UploadDocumentsModal.tsx (99%) rename frontend/src/components/manage/Blocks/{ => ProjectReport}/AnnualProgressReport/ValidationErrors.tsx (100%) rename frontend/src/components/manage/Blocks/{ => ProjectReport}/AnnualProgressReport/constants.ts (100%) rename frontend/src/components/manage/Blocks/{ => ProjectReport}/AnnualProgressReport/schema.tsx (98%) rename frontend/src/components/manage/Blocks/{ => ProjectReport}/AnnualProgressReport/validation.tsx (97%) rename frontend/src/components/manage/Blocks/{AnnualProgressReport => ProjectReport}/BackLink.tsx (100%) rename frontend/src/components/manage/Blocks/{AnnualProgressReport => ProjectReport}/Loader.tsx (100%) rename frontend/src/components/manage/Blocks/{AnnualProgressReport => ProjectReport}/errors.ts (100%) rename frontend/src/components/manage/Blocks/{AnnualProgressReport => ProjectReport}/utils.ts (100%) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 99c12663b..a18b2d170 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -86,7 +86,7 @@ import APRWorkspace from '@ors/app/annual-project-report/[year]/workspace/page.t import APRMLFSWorkspace from '@ors/app/annual-project-report/[year]/mlfs/workspace/page.tsx' import APREdit from '@ors/app/annual-project-report/[year]/edit/page.tsx' import APRProvider from '@ors/contexts/AnnualProjectReport/APRProvider.tsx' -import AprRedirect from '@ors/components/manage/Blocks/AnnualProgressReport/AprRedirect.tsx' +import AprRedirect from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/AprRedirect.tsx' import ConfirmationProvider from '@ors/contexts/ConfirmationProvider.tsx' import PCRView from '@ors/app/project-completion-report/view/page.tsx' diff --git a/frontend/src/app/annual-project-report/[year]/edit/page.tsx b/frontend/src/app/annual-project-report/[year]/edit/page.tsx index f19e3f87c..d8cc778b4 100644 --- a/frontend/src/app/annual-project-report/[year]/edit/page.tsx +++ b/frontend/src/app/annual-project-report/[year]/edit/page.tsx @@ -1,6 +1,6 @@ import React, { useContext, useEffect, useRef, useState } from 'react' import PageWrapper from '@ors/components/theme/PageWrapper/PageWrapper.tsx' -import BackLink from '@ors/components/manage/Blocks/AnnualProgressReport/BackLink.tsx' +import BackLink from '@ors/components/manage/Blocks/ProjectReport/BackLink.tsx' import { useLocation, useParams } from 'wouter' import { PageHeading } from '@ors/components/ui/Heading/Heading.tsx' import { Alert, Box, Tab, Tabs } from '@mui/material' @@ -9,10 +9,10 @@ import NotFoundPage from '@ors/app/not-found.tsx' import PermissionsContext from '@ors/contexts/PermissionsContext.tsx' import { useStore } from '@ors/store.tsx' import cx from 'classnames' -import Loader from '@ors/components/manage/Blocks/AnnualProgressReport/Loader.tsx' +import Loader from '@ors/components/manage/Blocks/ProjectReport/Loader.tsx' import useGetColumnDefs, { dataTypeDefinitions, -} from '@ors/components/manage/Blocks/AnnualProgressReport/schema.tsx' +} from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/schema.tsx' import { AgGridReact } from 'ag-grid-react' import Button from '@mui/material/Button' import { api } from '@ors/helpers' @@ -28,8 +28,8 @@ import { AnnualProjectReport, } from '@ors/app/annual-project-report/types.ts' import { useConfirmation } from '@ors/contexts/ConfirmationContext.tsx' -import { validateRows } from '@ors/components/manage/Blocks/AnnualProgressReport/validation.tsx' -import ValidationErrors from '@ors/components/manage/Blocks/AnnualProgressReport/ValidationErrors.tsx' +import { validateRows } from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/validation.tsx' +import ValidationErrors from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/ValidationErrors.tsx' import usePageTitle from '@ors/hooks/usePageTitle.ts' const TABS = [ diff --git a/frontend/src/app/annual-project-report/[year]/mlfs/workspace/EndorseAPRModal.tsx b/frontend/src/app/annual-project-report/[year]/mlfs/workspace/EndorseAPRModal.tsx index 2599379af..efc7e97b6 100644 --- a/frontend/src/app/annual-project-report/[year]/mlfs/workspace/EndorseAPRModal.tsx +++ b/frontend/src/app/annual-project-report/[year]/mlfs/workspace/EndorseAPRModal.tsx @@ -12,7 +12,7 @@ import cx from 'classnames' import { AnnualProgressReport } from '@ors/app/annual-project-report/types.ts' import { useConfirmation } from '@ors/contexts/ConfirmationContext.tsx' import dayjs from 'dayjs' -import { handleActionErrors } from '@ors/components/manage/Blocks/AnnualProgressReport/errors.ts' +import { handleActionErrors } from '@ors/components/manage/Blocks/ProjectReport/errors.ts' const REMARKS_LIMIT = 400 diff --git a/frontend/src/app/annual-project-report/[year]/mlfs/workspace/page.tsx b/frontend/src/app/annual-project-report/[year]/mlfs/workspace/page.tsx index 9d563f705..634bccb39 100644 --- a/frontend/src/app/annual-project-report/[year]/mlfs/workspace/page.tsx +++ b/frontend/src/app/annual-project-report/[year]/mlfs/workspace/page.tsx @@ -19,15 +19,15 @@ import NotFoundPage from '@ors/app/not-found' import useApi from '@ors/hooks/useApi.ts' import usePageTitle from '@ors/hooks/usePageTitle.ts' import Field from '@ors/components/manage/Form/Field.tsx' -import Loader from '@ors/components/manage/Blocks/AnnualProgressReport/Loader.tsx' +import Loader from '@ors/components/manage/Blocks/ProjectReport/Loader.tsx' import useGetColumnDefs, { dataTypeDefinitions, -} from '@ors/components/manage/Blocks/AnnualProgressReport/schema.tsx' +} from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/schema.tsx' import { getFilterOptions } from '@ors/components/manage/Utils/utilFunctions.ts' import { INITIAL_PARAMS_MLFS, MANDATORY_STATUSES, -} from '@ors/components/manage/Blocks/AnnualProgressReport/constants.ts' +} from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/constants.ts' import { union } from 'lodash' import { useStore } from '@ors/store.tsx' import Tab from '@mui/material/Tab/Tab' @@ -49,21 +49,21 @@ import { FiTable, FiUnlock, } from 'react-icons/fi' -import { formatDate } from '@ors/components/manage/Blocks/AnnualProgressReport/utils.ts' +import { formatDate } from '@ors/components/manage/Blocks/ProjectReport/utils.ts' import { useAPRCurrentYear } from '@ors/contexts/AnnualProjectReport/APRContext.tsx' import { useConfirmation } from '@ors/contexts/ConfirmationContext.tsx' import { enqueueSnackbar } from 'notistack' import { api, formatApiUrl } from '@ors/helpers' import EndorseAprModal from '@ors/app/annual-project-report/[year]/mlfs/workspace/EndorseAPRModal.tsx' -import StatusFilter from '@ors/components/manage/Blocks/AnnualProgressReport/StatusFilter.tsx' +import StatusFilter from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/StatusFilter.tsx' import MlfsLink from '@ors/components/ui/Link/Link.tsx' import EditTable from '@ors/components/manage/Form/EditTable.tsx' import { AgGridReact } from 'ag-grid-react' -import BackLink from '@ors/components/manage/Blocks/AnnualProgressReport/BackLink.tsx' -import AprYearDropdown from '@ors/components/manage/Blocks/AnnualProgressReport/AprYearDropdown.tsx' -import { validateRows } from '@ors/components/manage/Blocks/AnnualProgressReport/validation.tsx' -import ValidationErrors from '@ors/components/manage/Blocks/AnnualProgressReport/ValidationErrors.tsx' -import { handleActionErrors } from '@ors/components/manage/Blocks/AnnualProgressReport/errors.ts' +import BackLink from '@ors/components/manage/Blocks/ProjectReport/BackLink.tsx' +import AprYearDropdown from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/AprYearDropdown.tsx' +import { validateRows } from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/validation.tsx' +import ValidationErrors from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/ValidationErrors.tsx' +import { handleActionErrors } from '@ors/components/manage/Blocks/ProjectReport/errors.ts' export default function APRMLFSWorkspace() { const [, navigate] = useLocation() diff --git a/frontend/src/app/annual-project-report/[year]/workspace/page.tsx b/frontend/src/app/annual-project-report/[year]/workspace/page.tsx index a0cf2086b..a03592ad0 100644 --- a/frontend/src/app/annual-project-report/[year]/workspace/page.tsx +++ b/frontend/src/app/annual-project-report/[year]/workspace/page.tsx @@ -12,25 +12,25 @@ import { formatApiUrl } from '@ors/helpers' import { useStore } from '@ors/store.tsx' import useGetColumnDefs, { dataTypeDefinitions, -} from '@ors/components/manage/Blocks/AnnualProgressReport/schema.tsx' -import UploadDocumentsModal from '@ors/components/manage/Blocks/AnnualProgressReport/UploadDocumentsModal.tsx' +} from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/schema.tsx' +import UploadDocumentsModal from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/UploadDocumentsModal.tsx' import useApi from '@ors/hooks/useApi.ts' import { union } from 'lodash' import { INITIAL_PARAMS, MANDATORY_STATUSES, -} from '@ors/components/manage/Blocks/AnnualProgressReport/constants.ts' -import Loader from '@ors/components/manage/Blocks/AnnualProgressReport/Loader.tsx' +} from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/constants.ts' +import Loader from '@ors/components/manage/Blocks/ProjectReport/Loader.tsx' import Link from '@ors/components/ui/Link/Link.tsx' import ViewTable from '@ors/components/manage/Form/ViewTable.tsx' -import SubmitButton from '@ors/components/manage/Blocks/AnnualProgressReport/SubmitButton.tsx' +import SubmitButton from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/SubmitButton.tsx' import { AnnualAgencyProjectReport, Filter, } from '@ors/app/annual-project-report/types.ts' -import StatusFilter from '@ors/components/manage/Blocks/AnnualProgressReport/StatusFilter.tsx' -import BackLink from '@ors/components/manage/Blocks/AnnualProgressReport/BackLink.tsx' -import AprYearDropdown from '@ors/components/manage/Blocks/AnnualProgressReport/AprYearDropdown.tsx' +import StatusFilter from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/StatusFilter.tsx' +import BackLink from '@ors/components/manage/Blocks/ProjectReport/BackLink.tsx' +import AprYearDropdown from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/AprYearDropdown.tsx' export default function APRWorkspace() { const [isUploadDocumentsModalOpen, setIsUploadDocumentsModalOpen] = diff --git a/frontend/src/components/manage/Blocks/AnnualProgressReport/AprRedirect.tsx b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/AprRedirect.tsx similarity index 89% rename from frontend/src/components/manage/Blocks/AnnualProgressReport/AprRedirect.tsx rename to frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/AprRedirect.tsx index 1150d2a75..a92ff2dc9 100644 --- a/frontend/src/components/manage/Blocks/AnnualProgressReport/AprRedirect.tsx +++ b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/AprRedirect.tsx @@ -1,6 +1,6 @@ import React, { useContext } from 'react' import { useAPRCurrentYear } from '@ors/contexts/AnnualProjectReport/APRContext.tsx' -import Loader from '@ors/components/manage/Blocks/AnnualProgressReport/Loader.tsx' +import Loader from '@ors/components/manage/Blocks/ProjectReport/Loader.tsx' import PermissionsContext from '@ors/contexts/PermissionsContext.tsx' import NotFoundPage from '@ors/app/not-found.tsx' import { Redirect } from 'wouter' diff --git a/frontend/src/components/manage/Blocks/AnnualProgressReport/AprYearDropdown.tsx b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/AprYearDropdown.tsx similarity index 100% rename from frontend/src/components/manage/Blocks/AnnualProgressReport/AprYearDropdown.tsx rename to frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/AprYearDropdown.tsx diff --git a/frontend/src/components/manage/Blocks/AnnualProgressReport/CellValidation.tsx b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/CellValidation.tsx similarity index 87% rename from frontend/src/components/manage/Blocks/AnnualProgressReport/CellValidation.tsx rename to frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/CellValidation.tsx index 1f61a1317..540d5aee6 100644 --- a/frontend/src/components/manage/Blocks/AnnualProgressReport/CellValidation.tsx +++ b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/CellValidation.tsx @@ -1,4 +1,4 @@ -import { validateField } from '@ors/components/manage/Blocks/AnnualProgressReport/validation.tsx' +import { validateField } from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/validation.tsx' import CellValidationAlert from '@ors/components/manage/AgWidgets/CellValidationWidget/CellValidationAlert.tsx' import cx from 'classnames' import React from 'react' diff --git a/frontend/src/components/manage/Blocks/AnnualProgressReport/StatusFilter.tsx b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/StatusFilter.tsx similarity index 100% rename from frontend/src/components/manage/Blocks/AnnualProgressReport/StatusFilter.tsx rename to frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/StatusFilter.tsx diff --git a/frontend/src/components/manage/Blocks/AnnualProgressReport/SubmitButton.tsx b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/SubmitButton.tsx similarity index 97% rename from frontend/src/components/manage/Blocks/AnnualProgressReport/SubmitButton.tsx rename to frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/SubmitButton.tsx index 18825f0e4..a03330dc0 100644 --- a/frontend/src/components/manage/Blocks/AnnualProgressReport/SubmitButton.tsx +++ b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/SubmitButton.tsx @@ -3,7 +3,7 @@ import Button from '@mui/material/Button' import { useConfirmation } from '@ors/contexts/ConfirmationContext.tsx' import { api } from '@ors/helpers' import { enqueueSnackbar } from 'notistack' -import { handleActionErrors } from '@ors/components/manage/Blocks/AnnualProgressReport/errors.ts' +import { handleActionErrors } from '@ors/components/manage/Blocks/ProjectReport/errors.ts' interface SubmitButtonProps { revalidateData: () => void diff --git a/frontend/src/components/manage/Blocks/AnnualProgressReport/UploadDocumentsModal.tsx b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/UploadDocumentsModal.tsx similarity index 99% rename from frontend/src/components/manage/Blocks/AnnualProgressReport/UploadDocumentsModal.tsx rename to frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/UploadDocumentsModal.tsx index c40d26277..ca5b74ab6 100644 --- a/frontend/src/components/manage/Blocks/AnnualProgressReport/UploadDocumentsModal.tsx +++ b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/UploadDocumentsModal.tsx @@ -8,7 +8,7 @@ import { enqueueSnackbar } from 'notistack' import { IoInformationCircleOutline, IoTrash } from 'react-icons/io5' import { useConfirmation } from '@ors/contexts/ConfirmationContext.tsx' import { APRFile } from '@ors/app/annual-project-report/types.ts' -import { handleActionErrors } from '@ors/components/manage/Blocks/AnnualProgressReport/errors.ts' +import { handleActionErrors } from '@ors/components/manage/Blocks/ProjectReport/errors.ts' interface UploadDocumentsModalProps { isModalOpen: boolean diff --git a/frontend/src/components/manage/Blocks/AnnualProgressReport/ValidationErrors.tsx b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/ValidationErrors.tsx similarity index 100% rename from frontend/src/components/manage/Blocks/AnnualProgressReport/ValidationErrors.tsx rename to frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/ValidationErrors.tsx diff --git a/frontend/src/components/manage/Blocks/AnnualProgressReport/constants.ts b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/constants.ts similarity index 100% rename from frontend/src/components/manage/Blocks/AnnualProgressReport/constants.ts rename to frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/constants.ts diff --git a/frontend/src/components/manage/Blocks/AnnualProgressReport/schema.tsx b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/schema.tsx similarity index 98% rename from frontend/src/components/manage/Blocks/AnnualProgressReport/schema.tsx rename to frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/schema.tsx index fceee61de..ab2aa6719 100644 --- a/frontend/src/components/manage/Blocks/AnnualProgressReport/schema.tsx +++ b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/schema.tsx @@ -7,7 +7,7 @@ import { formatPercent, formatUSD, parseDate, -} from '@ors/components/manage/Blocks/AnnualProgressReport/utils.ts' +} from '@ors/components/manage/Blocks/ProjectReport/utils.ts' import React from 'react' import { useStore } from '@ors/store.tsx' import { get, isEqual, isNil, isObject } from 'lodash' @@ -16,8 +16,8 @@ import { validateNumber, validateText, ValidatorMixin, -} from '@ors/components/manage/Blocks/AnnualProgressReport/validation.tsx' -import CellValidation from '@ors/components/manage/Blocks/AnnualProgressReport/CellValidation.tsx' +} from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/validation.tsx' +import CellValidation from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/CellValidation.tsx' import { BasePasteWrapper } from '@ors/components/manage/Blocks/BusinessPlans/BPEdit/pasteSupport/BasePasteWrapper.tsx' import dayjs from 'dayjs' diff --git a/frontend/src/components/manage/Blocks/AnnualProgressReport/validation.tsx b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/validation.tsx similarity index 97% rename from frontend/src/components/manage/Blocks/AnnualProgressReport/validation.tsx rename to frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/validation.tsx index 131a7b5ae..65e11e751 100644 --- a/frontend/src/components/manage/Blocks/AnnualProgressReport/validation.tsx +++ b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/validation.tsx @@ -1,6 +1,6 @@ import dayjs from 'dayjs' import { isNil } from 'lodash' -import { dataTypeDefinitions } from '@ors/components/manage/Blocks/AnnualProgressReport/schema.tsx' +import { dataTypeDefinitions } from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/schema.tsx' type Validator = (value: any, row: any) => string | null export type ValidatorMixin = { diff --git a/frontend/src/components/manage/Blocks/AnnualProgressReport/BackLink.tsx b/frontend/src/components/manage/Blocks/ProjectReport/BackLink.tsx similarity index 100% rename from frontend/src/components/manage/Blocks/AnnualProgressReport/BackLink.tsx rename to frontend/src/components/manage/Blocks/ProjectReport/BackLink.tsx diff --git a/frontend/src/components/manage/Blocks/AnnualProgressReport/Loader.tsx b/frontend/src/components/manage/Blocks/ProjectReport/Loader.tsx similarity index 100% rename from frontend/src/components/manage/Blocks/AnnualProgressReport/Loader.tsx rename to frontend/src/components/manage/Blocks/ProjectReport/Loader.tsx diff --git a/frontend/src/components/manage/Blocks/AnnualProgressReport/errors.ts b/frontend/src/components/manage/Blocks/ProjectReport/errors.ts similarity index 100% rename from frontend/src/components/manage/Blocks/AnnualProgressReport/errors.ts rename to frontend/src/components/manage/Blocks/ProjectReport/errors.ts diff --git a/frontend/src/components/manage/Blocks/AnnualProgressReport/utils.ts b/frontend/src/components/manage/Blocks/ProjectReport/utils.ts similarity index 100% rename from frontend/src/components/manage/Blocks/AnnualProgressReport/utils.ts rename to frontend/src/components/manage/Blocks/ProjectReport/utils.ts From 32f612f1d198090adb31cd192b240c59ef2f3a19 Mon Sep 17 00:00:00 2001 From: andreighh <61791875+andreighh@users.noreply.github.com> Date: Wed, 28 Jan 2026 17:02:02 +0200 Subject: [PATCH 5/6] Move data types to separate file --- .../[year]/edit/page.tsx | 5 +- .../[year]/mlfs/workspace/page.tsx | 5 +- .../[year]/workspace/page.tsx | 5 +- .../AnnualProgressReport/schema.tsx | 63 +------------------ .../AnnualProgressReport/validation.tsx | 2 +- .../manage/Blocks/ProjectReport/dataTypes.ts | 62 ++++++++++++++++++ 6 files changed, 72 insertions(+), 70 deletions(-) create mode 100644 frontend/src/components/manage/Blocks/ProjectReport/dataTypes.ts diff --git a/frontend/src/app/annual-project-report/[year]/edit/page.tsx b/frontend/src/app/annual-project-report/[year]/edit/page.tsx index d8cc778b4..d3f436c95 100644 --- a/frontend/src/app/annual-project-report/[year]/edit/page.tsx +++ b/frontend/src/app/annual-project-report/[year]/edit/page.tsx @@ -10,9 +10,8 @@ import PermissionsContext from '@ors/contexts/PermissionsContext.tsx' import { useStore } from '@ors/store.tsx' import cx from 'classnames' import Loader from '@ors/components/manage/Blocks/ProjectReport/Loader.tsx' -import useGetColumnDefs, { - dataTypeDefinitions, -} from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/schema.tsx' +import useGetColumnDefs from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/schema.tsx' +import { dataTypeDefinitions } from '@ors/components/manage/Blocks/ProjectReport/dataTypes.ts' import { AgGridReact } from 'ag-grid-react' import Button from '@mui/material/Button' import { api } from '@ors/helpers' diff --git a/frontend/src/app/annual-project-report/[year]/mlfs/workspace/page.tsx b/frontend/src/app/annual-project-report/[year]/mlfs/workspace/page.tsx index 634bccb39..6448d0393 100644 --- a/frontend/src/app/annual-project-report/[year]/mlfs/workspace/page.tsx +++ b/frontend/src/app/annual-project-report/[year]/mlfs/workspace/page.tsx @@ -20,9 +20,8 @@ import useApi from '@ors/hooks/useApi.ts' import usePageTitle from '@ors/hooks/usePageTitle.ts' import Field from '@ors/components/manage/Form/Field.tsx' import Loader from '@ors/components/manage/Blocks/ProjectReport/Loader.tsx' -import useGetColumnDefs, { - dataTypeDefinitions, -} from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/schema.tsx' +import useGetColumnDefs from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/schema.tsx' +import { dataTypeDefinitions } from '@ors/components/manage/Blocks/ProjectReport/dataTypes.ts' import { getFilterOptions } from '@ors/components/manage/Utils/utilFunctions.ts' import { INITIAL_PARAMS_MLFS, diff --git a/frontend/src/app/annual-project-report/[year]/workspace/page.tsx b/frontend/src/app/annual-project-report/[year]/workspace/page.tsx index a03592ad0..8f4878261 100644 --- a/frontend/src/app/annual-project-report/[year]/workspace/page.tsx +++ b/frontend/src/app/annual-project-report/[year]/workspace/page.tsx @@ -10,9 +10,8 @@ import { FiDownload, FiEdit, FiTable } from 'react-icons/fi' import Button from '@mui/material/Button' import { formatApiUrl } from '@ors/helpers' import { useStore } from '@ors/store.tsx' -import useGetColumnDefs, { - dataTypeDefinitions, -} from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/schema.tsx' +import useGetColumnDefs from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/schema.tsx' +import { dataTypeDefinitions } from '@ors/components/manage/Blocks/ProjectReport/dataTypes.ts' import UploadDocumentsModal from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/UploadDocumentsModal.tsx' import useApi from '@ors/hooks/useApi.ts' import { union } from 'lodash' diff --git a/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/schema.tsx b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/schema.tsx index ab2aa6719..f78f6374f 100644 --- a/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/schema.tsx +++ b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/schema.tsx @@ -1,19 +1,9 @@ import { AgGridReactProps, CustomCellRendererProps } from 'ag-grid-react' -import { DataTypeDefinition, IHeaderParams } from 'ag-grid-community' -import { - formatBoolean, - formatDate, - formatDecimal, - formatPercent, - formatUSD, - parseDate, -} from '@ors/components/manage/Blocks/ProjectReport/utils.ts' +import { IHeaderParams } from 'ag-grid-community' import React from 'react' import { useStore } from '@ors/store.tsx' -import { get, isEqual, isNil, isObject } from 'lodash' +import { get, isEqual, isObject } from 'lodash' import { - validateDate, - validateNumber, validateText, ValidatorMixin, } from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/validation.tsx' @@ -21,53 +11,6 @@ import CellValidation from '@ors/components/manage/Blocks/ProjectReport/AnnualPr import { BasePasteWrapper } from '@ors/components/manage/Blocks/BusinessPlans/BPEdit/pasteSupport/BasePasteWrapper.tsx' import dayjs from 'dayjs' -export const dataTypeDefinitions: Record< - string, - DataTypeDefinition & ValidatorMixin -> = { - dateString: { - baseDataType: 'dateString', - extendsDataType: 'dateString', - // From date picker to our ISO format (YYYY-MM-DD) - dateFormatter: (value) => formatDate(value, 'YYYY-MM-DD'), - // Format value to UI format (DD/MM/YYYY) - valueFormatter: (params) => formatDate(params.value), - // Parse to date from ISO format - dateParser: (value) => parseDate(value), - validators: [validateDate], - valueParser: (params) => { - if (isNil(params.newValue) || params.newValue === '') { - return null - } - - return params.newValue - }, - }, - currency: { - baseDataType: 'number', - extendsDataType: 'number', - valueFormatter: (params) => formatUSD(params.value), - validators: [validateNumber], - }, - percent: { - baseDataType: 'number', - extendsDataType: 'number', - valueFormatter: (params) => formatPercent(params.value), - validators: [validateNumber], - }, - decimal: { - baseDataType: 'number', - extendsDataType: 'number', - valueFormatter: (params) => formatDecimal(params.value), - validators: [validateNumber], - }, - boolean: { - baseDataType: 'boolean', - extendsDataType: 'boolean', - valueFormatter: (params) => formatBoolean(params.value), - }, -} - interface APRTableColumn { label: string fieldName: string @@ -668,7 +611,7 @@ export default function useGetColumnDefs({ } if (cellDataType === 'boolean') { - toBeAdded = value.toLowerCase() === 'yes'; + toBeAdded = value.toLowerCase() === 'yes' } row[field] = toBeAdded diff --git a/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/validation.tsx b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/validation.tsx index 65e11e751..294c584f5 100644 --- a/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/validation.tsx +++ b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/validation.tsx @@ -1,6 +1,6 @@ import dayjs from 'dayjs' import { isNil } from 'lodash' -import { dataTypeDefinitions } from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/schema.tsx' +import { dataTypeDefinitions } from '@ors/components/manage/Blocks/ProjectReport/dataTypes.ts' type Validator = (value: any, row: any) => string | null export type ValidatorMixin = { diff --git a/frontend/src/components/manage/Blocks/ProjectReport/dataTypes.ts b/frontend/src/components/manage/Blocks/ProjectReport/dataTypes.ts new file mode 100644 index 000000000..cdc1ee78e --- /dev/null +++ b/frontend/src/components/manage/Blocks/ProjectReport/dataTypes.ts @@ -0,0 +1,62 @@ +import { DataTypeDefinition } from 'ag-grid-community' +import { + formatBoolean, + formatDate, + formatDecimal, + formatPercent, + formatUSD, + parseDate, +} from '@ors/components/manage/Blocks/ProjectReport/utils.ts' +import { isNil } from 'lodash' +import { + validateDate, + validateNumber, + ValidatorMixin, +} from '@ors/components/manage/Blocks/ProjectReport/AnnualProgressReport/validation.tsx' + +export const dataTypeDefinitions: Record< + string, + DataTypeDefinition & ValidatorMixin +> = { + dateString: { + baseDataType: 'dateString', + extendsDataType: 'dateString', + // From date picker to our ISO format (YYYY-MM-DD) + dateFormatter: (value) => formatDate(value, 'YYYY-MM-DD'), + // Format value to UI format (DD/MM/YYYY) + valueFormatter: (params) => formatDate(params.value), + // Parse to date from ISO format + dateParser: (value) => parseDate(value), + validators: [validateDate], + valueParser: (params) => { + if (isNil(params.newValue) || params.newValue === '') { + return null + } + + return params.newValue + }, + }, + currency: { + baseDataType: 'number', + extendsDataType: 'number', + valueFormatter: (params) => formatUSD(params.value), + validators: [validateNumber], + }, + percent: { + baseDataType: 'number', + extendsDataType: 'number', + valueFormatter: (params) => formatPercent(params.value), + validators: [validateNumber], + }, + decimal: { + baseDataType: 'number', + extendsDataType: 'number', + valueFormatter: (params) => formatDecimal(params.value), + validators: [validateNumber], + }, + boolean: { + baseDataType: 'boolean', + extendsDataType: 'boolean', + valueFormatter: (params) => formatBoolean(params.value), + }, +} From eca47dc2d6b2edd1a3e7ecd214510e359f890f3d Mon Sep 17 00:00:00 2001 From: andreighh <61791875+andreighh@users.noreply.github.com> Date: Mon, 2 Feb 2026 10:11:42 +0200 Subject: [PATCH 6/6] Draft pcr view --- .../project-completion-report/view/page.tsx | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/project-completion-report/view/page.tsx b/frontend/src/app/project-completion-report/view/page.tsx index bc429227b..32574a47d 100644 --- a/frontend/src/app/project-completion-report/view/page.tsx +++ b/frontend/src/app/project-completion-report/view/page.tsx @@ -1,10 +1,22 @@ import React from 'react' import PageWrapper from '@ors/components/theme/PageWrapper/PageWrapper.tsx' +import BackLink from '@ors/components/manage/Blocks/ProjectReport/BackLink.tsx' +import Loader from '@ors/components/manage/Blocks/ProjectReport/Loader.tsx' +import { Box } from '@mui/material' +import { PageHeading } from '@ors/components/ui/Heading/Heading.tsx' function PCRView() { - return -
-
+ return ( + + + + Project Completion Reports + + + + + + ) } export default PCRView