From 342b72eb7f718cceba713e0545c456aa38f9cc87 Mon Sep 17 00:00:00 2001 From: GlenAOT <160973940+GlenAOT@users.noreply.github.com> Date: Tue, 28 Jan 2025 10:55:56 -0800 Subject: [PATCH] bride calc tool complete pending manual testing --- frontend/package-lock.json | 14 +- frontend/package.json | 2 +- ...ridge_Formula_Calculation_Tool_Diagram.png | Bin 0 -> 71707 bytes .../BFCTDashboard.scss | 5 + .../BFCTDashboard.tsx | 10 +- .../components/BFCT.tsx | 78 ---- .../components/BFCTTable.tsx | 135 ------- .../BridgeFormulaCalculationTool.scss | 47 ++- .../BridgeFormulaCalculationTool.tsx | 200 ++++++++-- .../components/RefundPage.tsx | 207 ---------- .../components/RemoveAxleUnitModal.scss | 4 +- .../components/ResetModal.scss | 63 +++ .../components/ResetModal.tsx | 58 +++ .../components/TransactionHistoryTable.tsx | 368 ------------------ 14 files changed, 354 insertions(+), 837 deletions(-) create mode 100644 frontend/public/Bridge_Formula_Calculation_Tool_Diagram.png delete mode 100644 frontend/src/features/bridgeFormulaCalculationTool/components/BFCT.tsx delete mode 100644 frontend/src/features/bridgeFormulaCalculationTool/components/BFCTTable.tsx delete mode 100644 frontend/src/features/bridgeFormulaCalculationTool/components/RefundPage.tsx create mode 100644 frontend/src/features/bridgeFormulaCalculationTool/components/ResetModal.scss create mode 100644 frontend/src/features/bridgeFormulaCalculationTool/components/ResetModal.tsx delete mode 100644 frontend/src/features/bridgeFormulaCalculationTool/components/TransactionHistoryTable.tsx diff --git a/frontend/package-lock.json b/frontend/package-lock.json index f9da50897..78150510c 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -26,7 +26,7 @@ "material-react-table": "^2.13.3", "mui-nested-menu": "^3.4.0", "oidc-client-ts": "^3.1.0", - "onroute-policy-engine": "^1.4.1", + "onroute-policy-engine": "^1.5.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-error-boundary": "^4.1.2", @@ -7661,9 +7661,9 @@ } }, "node_modules/onroute-policy-engine": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/onroute-policy-engine/-/onroute-policy-engine-1.4.1.tgz", - "integrity": "sha512-NSlwb9j2IK6hSk2LOiP02pno51h19t/sCYNUsEpzRww3CPOVOeDw8N4zer7D3tbwDCA9EBkvaLKQh7c8v8nqFQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/onroute-policy-engine/-/onroute-policy-engine-1.5.0.tgz", + "integrity": "sha512-MAbbwtyJUGssrSOepZT0XpyfIKDaCDcNH3QxeybfvnGdd4Ly0sc+WawZoxraZJyo0dVDqt/5tFs8JAdGQQCdYw==", "dependencies": { "dayjs": "^1.11.13", "json-rules-engine": "^7.2.1", @@ -14923,9 +14923,9 @@ } }, "onroute-policy-engine": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/onroute-policy-engine/-/onroute-policy-engine-1.4.1.tgz", - "integrity": "sha512-NSlwb9j2IK6hSk2LOiP02pno51h19t/sCYNUsEpzRww3CPOVOeDw8N4zer7D3tbwDCA9EBkvaLKQh7c8v8nqFQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/onroute-policy-engine/-/onroute-policy-engine-1.5.0.tgz", + "integrity": "sha512-MAbbwtyJUGssrSOepZT0XpyfIKDaCDcNH3QxeybfvnGdd4Ly0sc+WawZoxraZJyo0dVDqt/5tFs8JAdGQQCdYw==", "requires": { "dayjs": "^1.11.13", "json-rules-engine": "^7.2.1", diff --git a/frontend/package.json b/frontend/package.json index da1d2aaaa..25caf20e9 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -21,7 +21,7 @@ "material-react-table": "^2.13.3", "mui-nested-menu": "^3.4.0", "oidc-client-ts": "^3.1.0", - "onroute-policy-engine": "^1.4.1", + "onroute-policy-engine": "^1.5.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-error-boundary": "^4.1.2", diff --git a/frontend/public/Bridge_Formula_Calculation_Tool_Diagram.png b/frontend/public/Bridge_Formula_Calculation_Tool_Diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..51bb57ba731c91f2b7b1896d20a5abc0af98f76f GIT binary patch literal 71707 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

jG8TQLQ@b|SqNg1b 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 DUC!F- literal 0 HcmV?d00001 diff --git a/frontend/src/features/bridgeFormulaCalculationTool/BFCTDashboard.scss b/frontend/src/features/bridgeFormulaCalculationTool/BFCTDashboard.scss index 36d34023f..caa3dc5f4 100644 --- a/frontend/src/features/bridgeFormulaCalculationTool/BFCTDashboard.scss +++ b/frontend/src/features/bridgeFormulaCalculationTool/BFCTDashboard.scss @@ -13,5 +13,10 @@ &__info-banner { font-weight: normal; + width: 100%; + } + + &__image { + width: 100%; } } \ No newline at end of file diff --git a/frontend/src/features/bridgeFormulaCalculationTool/BFCTDashboard.tsx b/frontend/src/features/bridgeFormulaCalculationTool/BFCTDashboard.tsx index 1f259ffca..03a93bf92 100644 --- a/frontend/src/features/bridgeFormulaCalculationTool/BFCTDashboard.tsx +++ b/frontend/src/features/bridgeFormulaCalculationTool/BFCTDashboard.tsx @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ import { Banner } from "../../common/components/dashboard/components/banner/Banner"; import { getNavButtonTitle, @@ -9,7 +8,6 @@ import { InfoBcGovBanner } from "../../common/components/banners/InfoBcGovBanner import { BANNER_MESSAGES } from "../../common/constants/bannerMessages"; import "./BFCTDashboard.scss"; import { BridgeFormulaCalculationTool } from "./components/BridgeFormulaCalculationTool"; -import { BFCT } from "./components/BFCT"; export const BFCTDashboard = () => { return ( @@ -28,13 +26,13 @@ export const BFCTDashboard = () => { className="bfct-dashboard__info-banner" msg={BANNER_MESSAGES.BRIDGE_FORMULA_CALCULATION_TOOL} /> - - {/* */} ); diff --git a/frontend/src/features/bridgeFormulaCalculationTool/components/BFCT.tsx b/frontend/src/features/bridgeFormulaCalculationTool/components/BFCT.tsx deleted file mode 100644 index 1c439a0a4..000000000 --- a/frontend/src/features/bridgeFormulaCalculationTool/components/BFCT.tsx +++ /dev/null @@ -1,78 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import { - Controller, - FormProvider, - useFieldArray, - useForm, -} from "react-hook-form"; -import "./BridgeFormulaCalculationTool.scss"; -import { NumberInput } from "../../../common/components/form/subFormComponents/NumberInput"; -import { RequiredOrNull } from "../../../common/types/common"; -import { getDefaultRequiredVal } from "../../../common/helpers/util"; -import { convertToNumberIfValid } from "../../../common/helpers/numeric/convertToNumberIfValid"; -import { requiredMessage } from "../../../common/helpers/validationMessages"; -import { useEffect } from "react"; -import { AxleUnit } from "../types/AxleUnit"; -import { BFCTTable } from "./BFCTTable"; - -export const BFCT = () => { - const defaultAxleUnits = [ - { - numberOfAxles: null, - axleSpread: null, - axleUnitWeight: null, - }, - { - interaxleSpacing: null, - }, - { - numberOfAxles: null, - axleSpread: null, - axleUnitWeight: null, - }, - ]; - - const formMethods = useForm<{ - axleUnits: AxleUnit[]; - }>({ - defaultValues: { - axleUnits: defaultAxleUnits, - }, - }); - - const fieldArrayMethods = useFieldArray({ - control: formMethods.control, - name: "axleUnits", - }); - - const addAxleUnit = () => { - fieldArrayMethods.append({ - interaxleSpacing: null, - }); - fieldArrayMethods.append({ - numberOfAxles: null, - axleSpread: null, - axleUnitWeight: null, - }); - }; - - const combineInteraxleSpacing = (axleUnits: AxleUnit[]) => { - for (let i = 1; i < axleUnits.length - 1; i++) { - axleUnits[i + 1].interaxleSpacing = axleUnits[i].interaxleSpacing; - axleUnits.splice(i, 1); - } - return axleUnits; - }; - - const onSubmit = (data: { axleUnits: AxleUnit[] }) => { - console.log(combineInteraxleSpacing(data.axleUnits)); - }; - - return ( -

- - - -
- ); -}; diff --git a/frontend/src/features/bridgeFormulaCalculationTool/components/BFCTTable.tsx b/frontend/src/features/bridgeFormulaCalculationTool/components/BFCTTable.tsx deleted file mode 100644 index 497d67a14..000000000 --- a/frontend/src/features/bridgeFormulaCalculationTool/components/BFCTTable.tsx +++ /dev/null @@ -1,135 +0,0 @@ -// TODO delete this file -/* eslint-disable @typescript-eslint/no-unused-vars */ -import { useEffect, useMemo, useState } from "react"; - -import { - MRT_Cell, - MRT_ColumnDef, - MRT_Row, - MRT_RowSelectionState, - MaterialReactTable, - useMaterialReactTable, -} from "material-react-table"; - -import { - applyWhenNotNullable, - getDefaultRequiredVal, -} from "../../../common/helpers/util"; - -import { - defaultTableInitialStateOptions, - defaultTableOptions, - defaultTableStateOptions, -} from "../../../common/helpers/tableHelper"; -import { CustomFormComponent } from "../../../common/components/form/CustomFormComponents"; -import { - FieldArrayWithId, - useFieldArray, - useFormContext, -} from "react-hook-form"; -import { Checkbox, FormControlLabel } from "@mui/material"; -import { requiredMessage } from "../../../common/helpers/validationMessages"; -import { AxleUnit } from "../types/AxleUnit"; - -export const BFCTTable = () => { - const formMethods = useFormContext(); - const { control, register, watch, setValue, trigger, getValues } = - formMethods; - const { fields } = useFieldArray({ control, name: "axleUnits" }); - - const axleUnits = getValues("axleUnits"); - - const columns = useMemo[]>( - () => [ - { - accessorKey: "property", - header: "Property", - }, - ...getValues("axleUnits").map( - ( - field: FieldArrayWithId< - { axleUnits: AxleUnit[] }, - "axleUnits", - "id" - >[], - index: number, - ) => ({ - accessorKey: `Axle ${index + 1}`, - header: `Axle ${index + 1}`, - }), - ), - ], - [], - ); - - const rowData = [ - { - property: "numberOfAxles", - ...Object.fromEntries( - axleUnits.map((unit, index) => [ - `Axle ${index + 1}`, - unit.numberOfAxles, - ]), - ), - }, - { - property: "axleSpread", - ...Object.fromEntries( - axleUnits.map((unit, index) => [`Axle ${index + 1}`, unit.axleSpread]), - ), - }, - { - property: "axleUnitWeight", - ...Object.fromEntries( - axleUnits.map((unit, index) => [ - `Axle ${index + 1}`, - unit.axleUnitWeight, - ]), - ), - }, - ]; - - const table = useMaterialReactTable({ - ...defaultTableOptions, - columns: columns, - data: validTransactionHistory, - onRowSelectionChange: setRowSelection, - state: { ...defaultTableStateOptions, rowSelection }, - initialState: { - ...defaultTableInitialStateOptions, - showGlobalFilter: false, - columnVisibility: { chequeRefund: totalRefundDue !== 0 }, - }, - getRowId: (row: RefundFormData) => row.permitNumber, - displayColumnDefOptions: { - "mrt-row-select": { - size: 10, - header: "", - }, - }, - enableRowActions: false, - enableGlobalFilter: false, - enableTopToolbar: false, - enableBottomToolbar: false, - enableRowSelection: (row: MRT_Row) => isRowSelectable(row), - enableSelectAll: false, - muiSelectCheckboxProps: ({ row }: { row: MRT_Row }) => ({ - className: `transaction-history-table__checkbox ${!isRowSelectable(row) && "transaction-history-table__checkbox--disabled"}`, - }), - muiTablePaperProps: { - className: "transaction-history-table", - }, - muiTableContainerProps: { - className: "transaction-history-table__container", - }, - muiTableBodyRowProps: ({ row }) => ({ - className: `transaction-history-table__row ${row.getIsSelected() && "transaction-history-table__row--selected"}`, - }), - }); - - return ( - <> - - - ); -}; diff --git a/frontend/src/features/bridgeFormulaCalculationTool/components/BridgeFormulaCalculationTool.scss b/frontend/src/features/bridgeFormulaCalculationTool/components/BridgeFormulaCalculationTool.scss index ec0829de3..753423998 100644 --- a/frontend/src/features/bridgeFormulaCalculationTool/components/BridgeFormulaCalculationTool.scss +++ b/frontend/src/features/bridgeFormulaCalculationTool/components/BridgeFormulaCalculationTool.scss @@ -7,7 +7,7 @@ display: flex; align-items: start; gap: 1rem; - overflow: scroll; + overflow-x: auto; } .table { @@ -28,6 +28,7 @@ min-width: 5rem; max-width: 5rem; } + } .column, .row { @@ -40,6 +41,17 @@ font-size: 1rem; color: $bc-black; white-space: nowrap; + + &:first-child { + position: sticky; + left: 0; + z-index: 1; + } + + &--fail { + background-color: $bc-messages-red-background; + color: $bc-red; + } } } @@ -55,7 +67,8 @@ .button-container { display: flex; gap: 1.5rem; - padding: 1.5rem 0; + padding-top: 1.5rem; + padding-bottom: 2.5rem; } .button-icon { @@ -69,16 +82,19 @@ box-shadow: none; min-width: fit-content; - &:hover { + &:hover, &:focus { box-shadow: none; } &--add { - margin-top: 1rem; + display: flex; + align-items: center; + gap: .5rem; + margin-top: 1.5rem; color: $bc-black; border: 2px solid $bc-text-box-border-grey; - &:hover { + &:hover, &:focus { background-color: $bc-background-light-grey; border: 2px solid $bc-text-box-border-grey; } @@ -88,7 +104,7 @@ border: 2px solid $bc-black; border-radius: 4px; - &:hover { + &:hover, &:focus { background: $bc-border-grey; } } @@ -98,7 +114,7 @@ background-color: $bc-background-light-grey; border: 2px solid $bc-background-light-grey; - &:hover { + &:hover, &:focus { background-color: $bc-background-light-grey; border-color: $bc-text-box-border-grey; } @@ -110,5 +126,22 @@ } } + .results { + border-top: 1px solid $bc-border-grey; + padding: 2.5rem 0; + &__heading { + color: $bc-black; + margin: 0; + } + + &__text { + &--fail { + color: $bc-red; + } + &--success { + color: $bc-green; + } + } + } } \ No newline at end of file diff --git a/frontend/src/features/bridgeFormulaCalculationTool/components/BridgeFormulaCalculationTool.tsx b/frontend/src/features/bridgeFormulaCalculationTool/components/BridgeFormulaCalculationTool.tsx index 6846f6aa2..b3819af12 100644 --- a/frontend/src/features/bridgeFormulaCalculationTool/components/BridgeFormulaCalculationTool.tsx +++ b/frontend/src/features/bridgeFormulaCalculationTool/components/BridgeFormulaCalculationTool.tsx @@ -1,6 +1,6 @@ import { useState } from "react"; import { Button, IconButton, Tooltip } from "@mui/material"; -import { faMinus } from "@fortawesome/free-solid-svg-icons"; +import { faMinus, faPlus } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { Controller, useFieldArray, useForm } from "react-hook-form"; @@ -10,6 +10,8 @@ import { RequiredOrNull } from "../../../common/types/common"; import { getDefaultRequiredVal } from "../../../common/helpers/util"; import { convertToNumberIfValid } from "../../../common/helpers/numeric/convertToNumberIfValid"; import { RemoveAxleUnitModal } from "./RemoveAxleUnitModal"; +import { ResetModal } from "./ResetModal"; +import { usePolicyEngine } from "../../policy/hooks/usePolicyEngine"; interface AxleUnit { numberOfAxles?: RequiredOrNull; @@ -20,8 +22,28 @@ interface AxleUnit { tireSize?: RequiredOrNull; } +// the type expected by the caculateBridge function in the policy engine +interface AxleConfiguration { + numberOfAxles: number; + axleSpread?: number; + interaxleSpacing?: number; + axleUnitWeight: number; + numberOfTires?: number; + tireSize?: number; +} + +interface BridgeCalculationResult { + startAxleUnit: number; + endAxleUnit: number; + maxBridge: number; + actualWeight: number; + success: boolean; +} + export const BridgeFormulaCalculationTool = () => { - const { control, handleSubmit, watch, setValue, reset } = useForm<{ + const policy = usePolicyEngine(); + + const { control, handleSubmit, watch, setValue, reset, formState } = useForm<{ axleUnits: AxleUnit[]; }>({ defaultValues: { @@ -61,24 +83,55 @@ export const BridgeFormulaCalculationTool = () => { }); }; + const [isRemoveAxleUnitModalOpen, setIsRemoveAxleUnitModalOpen] = + useState(false); + + const [axleUnitsToRemove, setAxleUnitsToRemove] = useState(); + + const handleRemoveAxleUnits = () => { + remove(axleUnitsToRemove); + setIsRemoveAxleUnitModalOpen(false); + }; + const handleCloseRemoveAxleUnitModal = () => { setAxleUnitsToRemove([]); setIsRemoveAxleUnitModalOpen(false); }; - const [axleUnitsToRemove, setAxleUnitsToRemove] = useState(); - const handleRemoveAxleUnitButton = (index: number) => { setAxleUnitsToRemove([index, index - 1]); setIsRemoveAxleUnitModalOpen(true); }; - const handleRemoveAxleUnits = () => { - remove(axleUnitsToRemove); - setIsRemoveAxleUnitModalOpen(false); + const [isResetModalOpen, setIsResetModalOpen] = useState(false); + + const handleReset = () => { + reset(); + setBridgeCalculationResults([]); + setIsResetModalOpen(false); }; - const combineInteraxleSpacing = (axleUnits: AxleUnit[]) => { + const [bridgeCalculationResults, setBridgeCalculationResults] = useState< + BridgeCalculationResult[] + >([]); + + const failedBridgeCalculationResults = bridgeCalculationResults.filter( + (result) => !result.success, + ); + + const bridgeCalculationSuccess = bridgeCalculationResults.length + ? bridgeCalculationResults.every((result) => result.success) + : false; + + const shouldShowResultsSection = + formState.errors.axleUnits?.length || + failedBridgeCalculationResults.length || + bridgeCalculationSuccess; + + const getFailedResultText = (failedResult: BridgeCalculationResult) => + `⮾ Bridge calculation failed between Axle Unit ${failedResult.startAxleUnit} and ${failedResult.endAxleUnit}, Axle Group Weight is ${failedResult.actualWeight}, Bridge Formula Weight max is ${failedResult.maxBridge}.`; + + const mergeInteraxleSpacingColumn = (axleUnits: AxleUnit[]) => { for (let i = 1; i < axleUnits.length - 1; i++) { axleUnits[i + 1].interaxleSpacing = axleUnits[i].interaxleSpacing; axleUnits.splice(i, 1); @@ -86,16 +139,50 @@ export const BridgeFormulaCalculationTool = () => { return axleUnits; }; - const handleReset = () => { - reset(); + const convertMetreValuesToCentimetres = (axleUnit: AxleUnit) => { + return { + ...axleUnit, + axleSpread: axleUnit.axleSpread + ? Math.round(axleUnit.axleSpread * 100) + : axleUnit.axleSpread, + interaxleSpacing: axleUnit.interaxleSpacing + ? Math.round(axleUnit.interaxleSpacing * 100) + : axleUnit.interaxleSpacing, + }; }; - const onSubmit = (data: { axleUnits: AxleUnit[] }) => { - console.log(combineInteraxleSpacing(data.axleUnits)); + const getDefaultAxleConfiguration = ( + axleUnit: AxleUnit, + ): AxleConfiguration => { + return { + numberOfAxles: getDefaultRequiredVal(0, axleUnit.numberOfAxles), + axleSpread: getDefaultRequiredVal(undefined, axleUnit.axleSpread), + interaxleSpacing: getDefaultRequiredVal( + undefined, + axleUnit.interaxleSpacing, + ), + axleUnitWeight: getDefaultRequiredVal(0, axleUnit.axleUnitWeight), + }; }; - const [isRemoveAxleUnitModalOpen, setIsRemoveAxleUnitModalOpen] = - useState(false); + const onSubmit = (data: { axleUnits: AxleUnit[] }) => { + const mergedAxleUnitData = mergeInteraxleSpacingColumn(data.axleUnits); + + const convertedAxleUnitData = mergedAxleUnitData.map((axleUnit) => + convertMetreValuesToCentimetres(axleUnit), + ); + + const serializedAxleUnitData = convertedAxleUnitData.map((axleUnit) => + getDefaultAxleConfiguration(axleUnit), + ); + + const bridgeCalculationResults = policy?.calculateBridge( + serializedAxleUnitData, + ); + + bridgeCalculationResults && + setBridgeCalculationResults(bridgeCalculationResults); + }; return (
@@ -105,11 +192,34 @@ export const BridgeFormulaCalculationTool = () => { Axle Unit {fields.map((field, index) => { - // Ensure the column number is shown for every axle unit (even and odd index) + const axleUnitNumber = Math.floor(index / 2) + 1; + + // Check if this axle unit fails based on failedBridgeCalculationResults + const axleUnitFailure = failedBridgeCalculationResults.some( + (result) => + axleUnitNumber >= result.startAxleUnit && + axleUnitNumber <= result.endAxleUnit, + ); + + // Check if the spacing column (odd index) is between two failing axle units + const spacingColumnFailure = + index % 2 === 1 && + failedBridgeCalculationResults.some( + (result) => + axleUnitNumber >= result.startAxleUnit && + axleUnitNumber < result.endAxleUnit, + ); + if (index % 2 === 0) { - const axleUnitNumber = Math.floor(index / 2) + 1; return ( - +
{axleUnitNumber} {axleUnitNumber >= 3 && ( @@ -131,8 +241,15 @@ export const BridgeFormulaCalculationTool = () => { ); } else { return ( - - {/* Blank column for odd indices */} + + {/* Blank column for interaxleSpacing */} ); } @@ -147,6 +264,7 @@ export const BridgeFormulaCalculationTool = () => { const axleSpreadFieldName = `axleUnits.${index}.axleSpread` as const; const numberOfAxles = axleUnits[index].numberOfAxles; + return ( {index % 2 === 0 && ( @@ -194,14 +312,10 @@ export const BridgeFormulaCalculationTool = () => { const axleSpread = axleUnits[index].axleSpread; const numberOfAxles = axleUnits[index].numberOfAxles; const disabled = numberOfAxles === 1; + return ( {index % 2 === 0 && ( - // { }} render={({ fieldState: { invalid } }) => ( @@ -240,6 +355,7 @@ export const BridgeFormulaCalculationTool = () => { const fieldName = `axleUnits.${index}.interaxleSpacing` as const; const interaxleSpacing = axleUnits[index].interaxleSpacing; + return ( {index % 2 !== 0 && ( @@ -252,6 +368,7 @@ export const BridgeFormulaCalculationTool = () => { }} render={({ fieldState: { invalid } }) => ( { {fields.map((field, index) => { const fieldName = `axleUnits.${index}.axleUnitWeight` as const; const axleUnitWeight = axleUnits[index].axleUnitWeight; + return ( {index % 2 === 0 && ( @@ -293,6 +411,7 @@ export const BridgeFormulaCalculationTool = () => { }} render={({ fieldState: { invalid } }) => ( { onClick={handleAddAxleUnit} className="button button--add" > - + Add Axle Unit + + Add Axle Unit
+ {shouldShowResultsSection && ( +
+

+ Bridge Formula Calculation Results +

+ + {formState.errors.axleUnits?.length ? ( +

Insufficient and/or invalid data.

+ ) : failedBridgeCalculationResults.length ? ( + failedBridgeCalculationResults.map((failedResult, index) => ( +

+ {getFailedResultText(failedResult)} +

+ )) + ) : ( +

+ ✓ Bridge Calculation is ok. +

+ )} +
+ )} + + + setIsResetModalOpen(false)} + onConfirm={handleReset} + />
); }; diff --git a/frontend/src/features/bridgeFormulaCalculationTool/components/RefundPage.tsx b/frontend/src/features/bridgeFormulaCalculationTool/components/RefundPage.tsx deleted file mode 100644 index b95dd9c18..000000000 --- a/frontend/src/features/bridgeFormulaCalculationTool/components/RefundPage.tsx +++ /dev/null @@ -1,207 +0,0 @@ -// TODO delete this file -// @ts-nocheck -/* eslint-disable @typescript-eslint/no-unused-vars */ -import { FormProvider, useForm } from "react-hook-form"; -import { Button, Typography } from "@mui/material"; -import "./RefundPage.scss"; -import { RefundFormData } from "./types/RefundFormData"; -import { PermitHistory } from "../../types/PermitHistory"; -import { TransactionHistoryTable } from "./components/TransactionHistoryTable"; -import { calculateNetAmount } from "../../helpers/feeSummary"; -import { isValidTransaction } from "../../helpers/payment"; -import { Nullable } from "../../../../common/types/common"; -import { RefundDetails } from "./components/RefundDetails"; -import { useState } from "react"; -import { RefundErrorModal } from "./components/RefundErrorModal"; -import { MRT_RowSelectionState } from "material-react-table"; - -export const PERMIT_REFUND_ACTIONS = { - VOID: "void", - REVOKE: "revoke", - AMEND: "amend", -} as const; - -export type PermitAction = - (typeof PERMIT_REFUND_ACTIONS)[keyof typeof PERMIT_REFUND_ACTIONS]; - -const permitActionText = (permitAction: PermitAction) => { - switch (permitAction) { - case PERMIT_REFUND_ACTIONS.VOID: - return "Voiding"; - case PERMIT_REFUND_ACTIONS.REVOKE: - return "Revoking"; - case PERMIT_REFUND_ACTIONS.AMEND: - default: - return "Amending"; - } -}; - -export const RefundPage = ({ - permitHistory, - email, - additionalEmail, - fax, - reason, - permitNumber, - permitAction, - amountToRefund, - handleFinish, - disableSubmitButton, -}: { - permitHistory: PermitHistory[]; - email?: Nullable; - additionalEmail?: Nullable; - fax?: Nullable; - reason?: Nullable; - permitNumber?: Nullable; - permitAction: PermitAction; - amountToRefund: number; - handleFinish: (refundData: RefundFormData[]) => void; - disableSubmitButton: boolean; -}) => { - const currentPermitValue = calculateNetAmount(permitHistory); - const newPermitValue = currentPermitValue - Math.abs(amountToRefund); - - const validTransactionHistory = permitHistory.filter((history) => - isValidTransaction(history.paymentMethodTypeCode, history.pgApproved), - ); - - const [showRefundErrorModal, setShowRefundErrorModal] = - useState(false); - - const handleCloseRefundErrorModal = () => { - setShowRefundErrorModal(false); - }; - - const formMethods = useForm<{ - refundData: RefundFormData[]; - }>({ - defaultValues: { - refundData: validTransactionHistory.map((transaction) => ({ - permitNumber: transaction.permitNumber, - pgPaymentMethod: transaction.pgPaymentMethod, - pgTransactionId: transaction.pgTransactionId, - transactionOrderNumber: transaction.transactionOrderNumber, - transactionTypeId: transaction.transactionTypeId, - paymentCardTypeCode: transaction.paymentCardTypeCode, - paymentMethodTypeCode: transaction.paymentMethodTypeCode, - transactionAmount: transaction.transactionAmount, - refundAmount: "", - refundTransactionId: "", - chequeRefund: false, - })), - }, - reValidateMode: "onChange", - }); - - const { handleSubmit } = formMethods; - - const [rowSelection, setRowSelection] = useState({}); - - const onSubmit = (data: { refundData: RefundFormData[] }) => { - if (amountToRefund <= 0) { - handleFinish(data.refundData); - } else { - // Get the selected row IDs based on permitNumber from rowSelection - const selectedRowIds = Object.keys(rowSelection).filter( - (id) => rowSelection[id], - ); - - // Filter table data to include only selected rows based on permitNumber - const selectedTransactions = data.refundData.filter( - (transaction: RefundFormData) => - selectedRowIds.includes(transaction.permitNumber), - ); - - // Call the onSubmit with the selected transactions - handleFinish(selectedTransactions); - } - }; - - return ( -
- - {permitActionText(permitAction)} Permit #: {permitNumber} - - - - Transaction History - - - - {(permitAction === PERMIT_REFUND_ACTIONS.VOID || - permitAction === PERMIT_REFUND_ACTIONS.REVOKE) && ( -
-
-
- Send Permit and Receipt to -
- {email && ( -
- Company Email: - - {email} - -
- )} - {additionalEmail && ( -
- Additional Email: - - {additionalEmail} - -
- )} - {fax && ( -
- Fax: - - {fax} - -
- )} -
- {reason && ( -
-
- Reason for {permitActionText(permitAction)} -
-
{reason}
-
- )} -
- )} - - -
- - {showRefundErrorModal && ( - - )} -
- ); -}; diff --git a/frontend/src/features/bridgeFormulaCalculationTool/components/RemoveAxleUnitModal.scss b/frontend/src/features/bridgeFormulaCalculationTool/components/RemoveAxleUnitModal.scss index 57082a741..c425e3685 100644 --- a/frontend/src/features/bridgeFormulaCalculationTool/components/RemoveAxleUnitModal.scss +++ b/frontend/src/features/bridgeFormulaCalculationTool/components/RemoveAxleUnitModal.scss @@ -41,7 +41,7 @@ & &__button { box-shadow: none; - &:hover { + &:hover, &:focus { box-shadow: none; } @@ -51,7 +51,7 @@ border-radius: 4px; color: $bc-black; - &:hover { + &:hover, &:focus { background-color: $bc-background-light-grey; border-color: $bc-text-box-border-grey; } diff --git a/frontend/src/features/bridgeFormulaCalculationTool/components/ResetModal.scss b/frontend/src/features/bridgeFormulaCalculationTool/components/ResetModal.scss new file mode 100644 index 000000000..8be37be38 --- /dev/null +++ b/frontend/src/features/bridgeFormulaCalculationTool/components/ResetModal.scss @@ -0,0 +1,63 @@ +@import "../../../themes/orbcStyles"; + +.reset-modal { + & &__container { + width: 100%; + display: flex; + flex-direction: column; + } + + &__header { + padding: 2rem 1.5rem; + display: flex; + flex-direction: row; + align-items: center; + background-color: $bc-background-light-grey; + border-bottom: 1px solid $bc-border-grey; + } + + &__title { + font-weight: bold; + font-size: 1.5rem; + margin: 0 0 0 0.5em; + } + + &__body { + padding: 1.5rem; + } + + &__text { + font-size: 1rem; + } + + &__footer { + display: flex; + flex-direction: row; + justify-content: flex-end; + padding: 0 1.5rem 1.5rem 1.5rem; + gap: 1.5rem; + } + + & &__button { + box-shadow: none; + + &:hover, &:focus { + box-shadow: none; + } + + &--cancel { + background-color: $bc-background-light-grey; + border: 2px solid $bc-background-light-grey; + border-radius: 4px; + color: $bc-black; + + &:hover, &:focus { + background-color: $bc-background-light-grey; + border-color: $bc-text-box-border-grey; + } + } + &--reset { + font-weight: bold; + } + } +} diff --git a/frontend/src/features/bridgeFormulaCalculationTool/components/ResetModal.tsx b/frontend/src/features/bridgeFormulaCalculationTool/components/ResetModal.tsx new file mode 100644 index 000000000..d02cfa7ab --- /dev/null +++ b/frontend/src/features/bridgeFormulaCalculationTool/components/ResetModal.tsx @@ -0,0 +1,58 @@ +import { Button, Dialog } from "@mui/material"; +import "./ResetModal.scss"; + +export const ResetModal = ({ + isOpen, + onCancel, + onConfirm, +}: { + /** + * Boolean to control the open and close state of Dialog box. + */ + isOpen: boolean; + /** + * A callback function on clicking cancel button. + * @returns void + */ + onCancel: () => void; + onConfirm: () => void; +}) => { + return ( + +
+

Reset all?

+
+ +
+

+ Reset will remove all data. This action cannot be undone. +

+
+ +
+ + +
+
+ ); +}; diff --git a/frontend/src/features/bridgeFormulaCalculationTool/components/TransactionHistoryTable.tsx b/frontend/src/features/bridgeFormulaCalculationTool/components/TransactionHistoryTable.tsx deleted file mode 100644 index 3505cae0d..000000000 --- a/frontend/src/features/bridgeFormulaCalculationTool/components/TransactionHistoryTable.tsx +++ /dev/null @@ -1,368 +0,0 @@ -// TODO delete this file -// @ts-nocheck -/* eslint-disable @typescript-eslint/no-unused-vars */ -import { useEffect, useMemo, useState } from "react"; - -import { - MRT_Cell, - MRT_ColumnDef, - MRT_Row, - MRT_RowSelectionState, - MaterialReactTable, - useMaterialReactTable, -} from "material-react-table"; - -import "./TransactionHistoryTable.scss"; -import { PermitHistory } from "../../../types/PermitHistory"; -import { getPaymentMethod } from "../../../../../common/types/paymentMethods"; -import { isValidTransaction } from "../../../helpers/payment"; -import { - applyWhenNotNullable, - getDefaultRequiredVal, -} from "../../../../../common/helpers/util"; - -import { - feeSummaryDisplayText, - isTransactionTypeRefund, - isZeroAmount, -} from "../../../helpers/feeSummary"; - -import { - defaultTableInitialStateOptions, - defaultTableOptions, - defaultTableStateOptions, -} from "../../../../../common/helpers/tableHelper"; -import { CustomFormComponent } from "../../../../../common/components/form/CustomFormComponents"; -import { useFormContext } from "react-hook-form"; -import { RefundFormData } from "../types/RefundFormData"; -import { Checkbox, FormControlLabel } from "@mui/material"; -import { requiredMessage } from "../../../../../common/helpers/validationMessages"; - -export const TransactionHistoryTable = ({ - permitHistory, - totalRefundDue, - rowSelection, - setRowSelection, -}: { - permitHistory: PermitHistory[]; - totalRefundDue: number; - rowSelection: MRT_RowSelectionState; - setRowSelection: (rowSelection: MRT_RowSelectionState) => void; -}) => { - const validTransactionHistory = permitHistory.filter((history) => - isValidTransaction(history.paymentMethodTypeCode, history.pgApproved), - ); - - const formMethods = useFormContext(); - const { register, watch, setValue, trigger } = formMethods; - - const isRowSelectable = (row: MRT_Row): boolean => { - return ( - !isTransactionTypeRefund(row.original.transactionTypeId) && - !isZeroAmount(row.original.transactionAmount) && - totalRefundDue !== 0 - ); - }; - - const columns = useMemo[]>( - () => [ - { - accessorKey: "permitNumber", - header: "Permit #", - muiTableHeadCellProps: { - className: - "transaction-history-table__header transaction-history-table__header--permit-number", - }, - muiTableBodyCellProps: { - className: - "transaction-history-table__data transaction-history-table__data--permit-number", - }, - size: 150, - enableSorting: false, - enableColumnActions: false, - }, - { - accessorFn: (originalRow) => { - return getPaymentMethod( - originalRow.paymentMethodTypeCode, - originalRow.paymentCardTypeCode, - ); - }, - id: "paymentMethod", - header: "Payment Method", - muiTableHeadCellProps: { - className: - "transaction-history-table__header transaction-history-table__header--payment-method", - }, - muiTableBodyCellProps: { - className: - "transaction-history-table__data transaction-history-table__data--payment-method", - }, - size: 130, - enableSorting: false, - enableColumnActions: false, - }, - { - accessorFn: (originalRow) => - getDefaultRequiredVal( - originalRow.transactionOrderNumber, - originalRow.pgTransactionId, - ), - id: "providerTransactionId", - header: "Provider Tran ID", - muiTableHeadCellProps: { - className: - "transaction-history-table__header transaction-history-table__header--provider-transaction-id", - }, - muiTableBodyCellProps: { - className: - "transaction-history-table__data transaction-history-table__data--provider-transaction-id", - }, - size: 100, - enableSorting: false, - enableColumnActions: false, - }, - { - accessorFn: (originalRow) => { - const amount = isTransactionTypeRefund(originalRow.transactionTypeId) - ? -1 * originalRow.transactionAmount - : originalRow.transactionAmount; - - return feeSummaryDisplayText( - applyWhenNotNullable((val) => `${val}`, amount), - ); - }, - header: "Amount (CAD)", - muiTableHeadCellProps: { - className: - "transaction-history-table__header transaction-history-table__header--amount", - }, - muiTableBodyCellProps: { - className: - "transaction-history-table__data transaction-history-table__data--amount", - }, - id: "transactionAmount", - size: 50, - enableSorting: false, - enableColumnActions: false, - }, - { - id: "refundAmount", - header: "Refund Amount (CAD)", - muiTableHeadCellProps: { - className: - "transaction-history-table__header transaction-history-table__header--refund-amount", - }, - muiTableBodyCellProps: { - className: - "transaction-history-table__data transaction-history-table__data--refund-amount", - }, - size: 20, - enableSorting: false, - enableColumnActions: false, - Cell: ({ cell }: { cell: MRT_Cell }) => { - const rowIsSelected = cell.row.getIsSelected(); - - // clear refundAmount when row is unselected - useEffect(() => { - !rowIsSelected && - setValue(`refundData.${cell.row.index}.refundAmount`, ""); - }, [rowIsSelected, setValue, cell.row.index]); - - return ( - isRowSelectable(cell.row) && ( - - ) - ); - }, - }, - { - id: "refundTransactionId", - header: "Refund Tran ID", - muiTableHeadCellProps: { - className: - "transaction-history-table__header transaction-history-table__header--refund-transaction-id", - }, - muiTableBodyCellProps: { - className: - "transaction-history-table__data transaction-history-table__data--refund-transaction-id", - }, - size: 20, - enableSorting: false, - enableColumnActions: false, - Cell: ({ cell }: { cell: MRT_Cell }) => { - const rowIsSelected = cell.row.getIsSelected(); - const refundAmount = watch( - `refundData.${cell.row.index}.refundAmount`, - ); - const chequeRefund = watch( - `refundData.${cell.row.index}.chequeRefund`, - ); - - // clear refundTransactionId when refundAmount is empty or zero - useEffect(() => { - if (!refundAmount || Number(refundAmount) <= 0) { - setValue(`refundData.${cell.row.index}.refundTransactionId`, ""); - } - }, [refundAmount, cell.row.index, setValue]); - - // re-validate refundTransactionId when chequeRefund is checked/unchecked - useEffect(() => { - trigger(`refundData.${cell.row.index}.refundTransactionId`); - }, [chequeRefund, cell.row.index, trigger]); - - // clear refundTransactionId when row is unselected - useEffect(() => { - !rowIsSelected && - setValue(`refundData.${cell.row.index}.refundTransactionId`, ""); - }, [rowIsSelected, setValue, cell.row.index]); - - return ( - isRowSelectable(cell.row) && ( - - ) - ); - }, - }, - { - id: "chequeRefund", - header: "Cheque Refund", - muiTableHeadCellProps: { - className: - "transaction-history-table__header transaction-history-table__header--refund-cheque-refund", - }, - muiTableBodyCellProps: { - className: - "transaction-history-table__data transaction-history-table__data--refund-cheque-refund", - }, - size: 20, - enableSorting: false, - enableColumnActions: false, - Cell: ({ cell }: { cell: MRT_Cell }) => { - const refundAmount = watch( - `refundData.${cell.row.index}.refundAmount`, - ); - const refundTransactionId = watch( - `refundData.${cell.row.index}.refundTransactionId`, - ); - - const rowIsSelected = cell.row.getIsSelected(); - - // local state necessary for 'chequeRefund' checkbox column to allow setting it to false when row is unselected - const [chequeRefund, setChequeRefund] = useState( - watch(`refundData.${cell.row.index}.chequeRefund`), - ); - - // sync react-hook-form state when local state changes - useEffect(() => { - setValue(`refundData.${cell.row.index}.chequeRefund`, chequeRefund); - }, [chequeRefund, setValue, cell.row.index]); - - // clear chequeRefund when row is unselected - useEffect(() => { - !rowIsSelected && setChequeRefund(false); - }, [rowIsSelected]); - - return ( - isRowSelectable(cell.row) && ( - setChequeRefund(e.target.checked)} - disabled={ - !cell.row.getIsSelected() || - Number(refundAmount) <= 0 || - refundTransactionId !== "" - } - /> - } - label="Cheque Refund" - classes={{ - root: "cheque-refund-label", - disabled: "cheque-refund-label--disabled", - }} - /> - ) - ); - }, - }, - ], - [], - ); - - const table = useMaterialReactTable({ - ...defaultTableOptions, - columns: columns, - data: validTransactionHistory, - onRowSelectionChange: setRowSelection, - state: { ...defaultTableStateOptions, rowSelection }, - initialState: { - ...defaultTableInitialStateOptions, - showGlobalFilter: false, - columnVisibility: { chequeRefund: totalRefundDue !== 0 }, - }, - getRowId: (row: RefundFormData) => row.permitNumber, - displayColumnDefOptions: { - "mrt-row-select": { - size: 10, - header: "", - }, - }, - enableRowActions: false, - enableGlobalFilter: false, - enableTopToolbar: false, - enableBottomToolbar: false, - enableRowSelection: (row: MRT_Row) => isRowSelectable(row), - enableSelectAll: false, - muiSelectCheckboxProps: ({ row }: { row: MRT_Row }) => ({ - className: `transaction-history-table__checkbox ${!isRowSelectable(row) && "transaction-history-table__checkbox--disabled"}`, - }), - muiTablePaperProps: { - className: "transaction-history-table", - }, - muiTableContainerProps: { - className: "transaction-history-table__container", - }, - muiTableBodyRowProps: ({ row }) => ({ - className: `transaction-history-table__row ${row.getIsSelected() && "transaction-history-table__row--selected"}`, - }), - }); - - return ( - <> - - - ); -};