From c8514a11f1341bcf278810e08bae75773950b836 Mon Sep 17 00:00:00 2001 From: ewandor Date: Sat, 25 Jan 2025 03:16:50 +0100 Subject: [PATCH] Adding a price widget --- api/app/transaction/models.py | 3 +- gui/app/package-lock.json | 11 +++++++ gui/app/package.json | 1 + .../src/common/crud/widgets/bgfc-price.tsx | 33 +++++++++++++++++++ .../common/crud/widgets/crud-text-widget.tsx | 5 ++- 5 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 gui/app/src/common/crud/widgets/bgfc-price.tsx diff --git a/api/app/transaction/models.py b/api/app/transaction/models.py index 5e4034e..5dc1245 100644 --- a/api/app/transaction/models.py +++ b/api/app/transaction/models.py @@ -82,9 +82,10 @@ class SplitWrite(SplitBase): } } }) + amount: str = PydField(json_schema_extra={"format": "price-bgdc"}) class TransactionWrite(TransactionBase): - splits: list[SplitWrite] = Field() + splits: list[SplitWrite] = PydField(json_schema_extra={"minItems": 1}) class TransactionCreate(TransactionWrite): pass diff --git a/gui/app/package-lock.json b/gui/app/package-lock.json index 2e89f28..36f391e 100644 --- a/gui/app/package-lock.json +++ b/gui/app/package-lock.json @@ -26,6 +26,7 @@ "@rjsf/validator-ajv8": "^5.24.1", "react": "^18.0.0", "react-dom": "^18.0.0", + "react-number-format": "^5.4.3", "react-router": "^7.0.2" }, "devDependencies": { @@ -7070,6 +7071,16 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "license": "MIT" }, + "node_modules/react-number-format": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.3.tgz", + "integrity": "sha512-VCY5hFg/soBighAoGcdE+GagkJq0230qN6jcS5sp8wQX1qy1fYN/RX7/BXkrs0oyzzwqR8/+eSUrqXbGeywdUQ==", + "license": "MIT", + "peerDependencies": { + "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/react-reconciler": { "version": "0.29.2", "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.2.tgz", diff --git a/gui/app/package.json b/gui/app/package.json index 720ae8c..d14623d 100644 --- a/gui/app/package.json +++ b/gui/app/package.json @@ -40,6 +40,7 @@ "@rjsf/validator-ajv8": "^5.24.1", "react": "^18.0.0", "react-dom": "^18.0.0", + "react-number-format": "^5.4.3", "react-router": "^7.0.2" }, "devDependencies": { diff --git a/gui/app/src/common/crud/widgets/bgfc-price.tsx b/gui/app/src/common/crud/widgets/bgfc-price.tsx new file mode 100644 index 0000000..c7d43d8 --- /dev/null +++ b/gui/app/src/common/crud/widgets/bgfc-price.tsx @@ -0,0 +1,33 @@ +import { WidgetProps } from "@rjsf/utils"; +import { NumericFormat } from "react-number-format"; +import TextField from "@mui/material/TextField"; +import {InputAdornment} from "@mui/material"; + +export const BgfcPriceWidget = (props: WidgetProps) => { + const { inputRef, onChange, ...other } = props; + + return ( + { + onChange({ + target: { + name: props.name, + value: values.value + } + }); + }} + slotProps={{ + input: { + startAdornment: $, + endAdornment: + }, + }} + valueIsNumericString={true} + fixedDecimalScale={true} + decimalScale={2} + defaultValue={0} + /> + ); +} \ No newline at end of file diff --git a/gui/app/src/common/crud/widgets/crud-text-widget.tsx b/gui/app/src/common/crud/widgets/crud-text-widget.tsx index 49f5776..066f787 100644 --- a/gui/app/src/common/crud/widgets/crud-text-widget.tsx +++ b/gui/app/src/common/crud/widgets/crud-text-widget.tsx @@ -2,13 +2,16 @@ import TextWidget from "@rjsf/core/lib/components/widgets/TextWidget"; import { FormContextType, RJSFSchema, StrictRJSFSchema, WidgetProps } from "@rjsf/utils"; import { ForeignKeyWidget } from "./foreign-key"; +import {BgfcPriceWidget} from "./bgfc-price"; export default function CrudTextWidget( props: WidgetProps ) { if (props.schema.hasOwnProperty("foreign_key")) { return (); - }else { + } else if (props.schema.hasOwnProperty("format") && props.schema.format == "price-bgdc") { + return (); + } else { return (); } }