diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx
index 0467938c1..a18b2d170 100644
--- a/frontend/src/App.tsx
+++ b/frontend/src/App.tsx
@@ -86,7 +86,9 @@ 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'
function RedirectToSection() {
const { canEditReplenishment } = useContext(PermissionsContext)
@@ -441,23 +443,29 @@ export default function App() {
- {/* APR routes */}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ {/* APR routes */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* PCR 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..d3f436c95 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,9 @@ 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 useGetColumnDefs, {
- dataTypeDefinitions,
-} from '@ors/components/manage/Blocks/AnnualProgressReport/schema.tsx'
+import Loader from '@ors/components/manage/Blocks/ProjectReport/Loader.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'
@@ -27,9 +26,9 @@ import {
AnnualAgencyProjectReport,
AnnualProjectReport,
} from '@ors/app/annual-project-report/types.ts'
-import { useConfirmation } from '@ors/contexts/AnnualProjectReport/APRContext.tsx'
-import { validateRows } from '@ors/components/manage/Blocks/AnnualProgressReport/validation.tsx'
-import ValidationErrors from '@ors/components/manage/Blocks/AnnualProgressReport/ValidationErrors.tsx'
+import { useConfirmation } from '@ors/contexts/ConfirmationContext.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 bb1e4c9e1..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
@@ -10,9 +10,9 @@ 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'
+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 dc2bdab5a..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
@@ -19,15 +19,14 @@ 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 useGetColumnDefs, {
- dataTypeDefinitions,
-} from '@ors/components/manage/Blocks/AnnualProgressReport/schema.tsx'
+import Loader from '@ors/components/manage/Blocks/ProjectReport/Loader.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,
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,23 +48,21 @@ import {
FiTable,
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 { 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..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,27 +10,26 @@ 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/AnnualProgressReport/schema.tsx'
-import UploadDocumentsModal from '@ors/components/manage/Blocks/AnnualProgressReport/UploadDocumentsModal.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'
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/app/project-completion-report/view/page.tsx b/frontend/src/app/project-completion-report/view/page.tsx
new file mode 100644
index 000000000..32574a47d
--- /dev/null
+++ b/frontend/src/app/project-completion-report/view/page.tsx
@@ -0,0 +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 (
+
+
+
+ Project Completion Reports
+
+
+
+
+
+ )
+}
+
+export default PCRView
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 91%
rename from frontend/src/components/manage/Blocks/AnnualProgressReport/SubmitButton.tsx
rename to frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/SubmitButton.tsx
index 75afdf995..a03330dc0 100644
--- a/frontend/src/components/manage/Blocks/AnnualProgressReport/SubmitButton.tsx
+++ b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/SubmitButton.tsx
@@ -1,9 +1,9 @@
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'
+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 97%
rename from frontend/src/components/manage/Blocks/AnnualProgressReport/UploadDocumentsModal.tsx
rename to frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/UploadDocumentsModal.tsx
index 005c6482e..ca5b74ab6 100644
--- a/frontend/src/components/manage/Blocks/AnnualProgressReport/UploadDocumentsModal.tsx
+++ b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/UploadDocumentsModal.tsx
@@ -3,13 +3,12 @@ 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'
+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 90%
rename from frontend/src/components/manage/Blocks/AnnualProgressReport/schema.tsx
rename to frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/schema.tsx
index fceee61de..f78f6374f 100644
--- a/frontend/src/components/manage/Blocks/AnnualProgressReport/schema.tsx
+++ b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/schema.tsx
@@ -1,73 +1,16 @@
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/AnnualProgressReport/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/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'
-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/AnnualProgressReport/validation.tsx b/frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/validation.tsx
similarity index 98%
rename from frontend/src/components/manage/Blocks/AnnualProgressReport/validation.tsx
rename to frontend/src/components/manage/Blocks/ProjectReport/AnnualProgressReport/validation.tsx
index 131a7b5ae..294c584f5 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/dataTypes.ts'
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/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),
+ },
+}
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
diff --git a/frontend/src/contexts/AnnualProjectReport/APRContext.tsx b/frontend/src/contexts/AnnualProjectReport/APRContext.tsx
index 248137351..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/AnnualProjectReport/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 17fc487c3..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/AnnualProjectReport/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/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
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}
+ />
+
+ )
+}