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} + /> + + ) +}