From 2cc2d3667c1a7dc13b143beebd6bb645d5b5b73f Mon Sep 17 00:00:00 2001 From: Nicolas Olmos Date: Thu, 22 Jan 2026 14:07:12 -0300 Subject: [PATCH 1/8] chore: add quantity validation helper --- src/utils/yup.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/utils/yup.js b/src/utils/yup.js index d350ad232..459811f75 100644 --- a/src/utils/yup.js +++ b/src/utils/yup.js @@ -53,6 +53,13 @@ export const decimalValidation = () => return /^\d+(\.\d{1,2})?$/.test(value.toString()); }); +export const quantityValidation = () => + yup + .number() + .typeError(T.translate("validation.number")) + .positive(T.translate("validation.number_positive")) + .required(T.translate("validation.required")); + export const rateCellValidation = () => yup .number() From 972cf658d2b9d0bbe9b4eeb0f3d0807e9e040fcd Mon Sep 17 00:00:00 2001 From: Nicolas Olmos Date: Thu, 22 Jan 2026 14:08:05 -0300 Subject: [PATCH 2/8] feat: create mui formik quantity field --- .../mui-formik-quantity-field.js | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/components/mui/formik-inputs/mui-formik-quantity-field.js diff --git a/src/components/mui/formik-inputs/mui-formik-quantity-field.js b/src/components/mui/formik-inputs/mui-formik-quantity-field.js new file mode 100644 index 000000000..2d3b7b271 --- /dev/null +++ b/src/components/mui/formik-inputs/mui-formik-quantity-field.js @@ -0,0 +1,30 @@ +import React from "react"; +import PropTypes from "prop-types"; +import MuiFormikTextField from "./mui-formik-textfield"; + +const BLOCKED_KEYS = ["e", "E", "+", "-"]; + +const MuiFormikQuantityField = ({ ...props }) => ( + { + if (BLOCKED_KEYS.includes(e.key)) { + e.nativeEvent.preventDefault(); + e.nativeEvent.stopImmediatePropagation(); + } + }} + inputProps={{ + min: 0, + inputMode: "decimal" + }} + // eslint-disable-next-line react/jsx-props-no-spreading + {...props} + /> +); + +MuiFormikQuantityField.propTypes = { + name: PropTypes.string.isRequired, + label: PropTypes.string +}; + +export default MuiFormikQuantityField; From 34680a32dd653b100f4bb7d50ebe671d2972f62b Mon Sep 17 00:00:00 2001 From: Nicolas Olmos Date: Thu, 22 Jan 2026 14:08:32 -0300 Subject: [PATCH 3/8] feat: use mui formik quantity field on forms --- .../form-templates/sponsor-inventory-popup.js | 7 ++++--- .../components/sponsor-form-item-form.js | 12 +++++++----- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/pages/sponsors-global/form-templates/sponsor-inventory-popup.js b/src/pages/sponsors-global/form-templates/sponsor-inventory-popup.js index 9299b2325..f66bfd749 100644 --- a/src/pages/sponsors-global/form-templates/sponsor-inventory-popup.js +++ b/src/pages/sponsors-global/form-templates/sponsor-inventory-popup.js @@ -35,6 +35,7 @@ import { formMetafieldsValidation } from "../../../utils/yup"; import AdditionalInputList from "../../../components/mui/formik-inputs/additional-input/additional-input-list"; +import MuiFormikQuantityField from "../../../components/mui/formik-inputs/mui-formik-quantity-field"; const SponsorItemDialog = ({ open, @@ -226,7 +227,7 @@ const SponsorItemDialog = ({ {T.translate("edit_inventory_item.default_quantity")} - - {T.translate("edit_inventory_item.quantity_limit_per_show")} - ({ ...data }); @@ -41,7 +43,7 @@ const SponsorFormItemForm = ({ initialValues, onSubmit }) => { early_bird_rate: decimalValidation(), standard_rate: decimalValidation(), onsite_rate: decimalValidation(), - default_quantity: positiveNumberValidation(), + default_quantity: quantityValidation(), quantity_limit_per_sponsor: positiveNumberValidation(), quantity_limit_per_show: positiveNumberValidation(), meta_fields: formMetafieldsValidation() @@ -119,7 +121,7 @@ const SponsorFormItemForm = ({ initialValues, onSubmit }) => { /> - { /> - { /> - Date: Thu, 22 Jan 2026 16:17:22 -0300 Subject: [PATCH 4/8] chore: tests --- .../mui-formik-quantity-field.test.js | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 src/components/mui/__tests__/mui-formik-quantity-field.test.js diff --git a/src/components/mui/__tests__/mui-formik-quantity-field.test.js b/src/components/mui/__tests__/mui-formik-quantity-field.test.js new file mode 100644 index 000000000..a73942773 --- /dev/null +++ b/src/components/mui/__tests__/mui-formik-quantity-field.test.js @@ -0,0 +1,68 @@ +import React from "react"; +import { render, screen, act } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { Formik, Form } from "formik"; +import "@testing-library/jest-dom"; +import MuiFormikQuantityField from "../formik-inputs/mui-formik-quantity-field"; + +const renderWithFormik = (props, initialValues = { testField: [] }) => + render( + +
+ + + +
+ ); + +describe("MuiFormikQuantityField", () => { + it("must accept user input", async () => { + const onSubmit = jest.fn(); + + renderWithFormik({ + label: "some field", + onSubmit + }); + + const field = screen.getByLabelText("some field"); + expect(field).toBeInTheDocument(); + + const submitButton = screen.getByText("submit"); + await act(async () => { + await userEvent.type(field, "12345"); + await userEvent.click(submitButton); + }); + + expect(onSubmit).toHaveBeenCalledWith( + expect.objectContaining({ + testField: 12345 + }), + expect.anything() + ); + }); + + it("must filter invalid characters", async () => { + const onSubmit = jest.fn(); + + renderWithFormik({ + label: "some field", + onSubmit + }); + + const field = screen.getByLabelText("some field"); + expect(field).toBeInTheDocument(); + + const submitButton = screen.getByText("submit"); + await act(async () => { + await userEvent.type(field, "123eEe45"); + await userEvent.click(submitButton); + }); + + expect(onSubmit).toHaveBeenCalledWith( + expect.objectContaining({ + testField: 12345 + }), + expect.anything() + ); + }); +}); From 481a8b2a692689d0036a56688f2d20d82ff15427 Mon Sep 17 00:00:00 2001 From: Nicolas Olmos Date: Fri, 23 Jan 2026 13:50:14 -0300 Subject: [PATCH 5/8] chore: remove unnecessary helper --- src/utils/yup.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/utils/yup.js b/src/utils/yup.js index 459811f75..d350ad232 100644 --- a/src/utils/yup.js +++ b/src/utils/yup.js @@ -53,13 +53,6 @@ export const decimalValidation = () => return /^\d+(\.\d{1,2})?$/.test(value.toString()); }); -export const quantityValidation = () => - yup - .number() - .typeError(T.translate("validation.number")) - .positive(T.translate("validation.number_positive")) - .required(T.translate("validation.required")); - export const rateCellValidation = () => yup .number() From 7eaedac994a68826dfc4af4192eb55168bdb5ccb Mon Sep 17 00:00:00 2001 From: Nicolas Olmos Date: Fri, 23 Jan 2026 13:51:00 -0300 Subject: [PATCH 6/8] chore: use positive number validation instead of the other one --- .../components/sponsor-form-item-form.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/pages/sponsors/sponsor-form-item-list-page/components/sponsor-form-item-form.js b/src/pages/sponsors/sponsor-form-item-list-page/components/sponsor-form-item-form.js index e03ee23c5..fe306f5fd 100644 --- a/src/pages/sponsors/sponsor-form-item-list-page/components/sponsor-form-item-form.js +++ b/src/pages/sponsors/sponsor-form-item-list-page/components/sponsor-form-item-form.js @@ -18,8 +18,7 @@ import { decimalValidation, formMetafieldsValidation, positiveNumberValidation, - requiredStringValidation, - quantityValidation + requiredStringValidation } from "../../../../utils/yup"; import MuiFormikTextField from "../../../../components/mui/formik-inputs/mui-formik-textfield"; import AdditionalInputList from "../../../../components/mui/formik-inputs/additional-input/additional-input-list"; @@ -43,7 +42,7 @@ const SponsorFormItemForm = ({ initialValues, onSubmit }) => { early_bird_rate: decimalValidation(), standard_rate: decimalValidation(), onsite_rate: decimalValidation(), - default_quantity: quantityValidation(), + default_quantity: positiveNumberValidation(), quantity_limit_per_sponsor: positiveNumberValidation(), quantity_limit_per_show: positiveNumberValidation(), meta_fields: formMetafieldsValidation() From d1168b7a0082bf79deade2e138f9fa866e4643f2 Mon Sep 17 00:00:00 2001 From: Nicolas Olmos Date: Fri, 23 Jan 2026 13:52:39 -0300 Subject: [PATCH 7/8] chore: replace input mode for numeric instead of decimal --- src/components/mui/formik-inputs/mui-formik-quantity-field.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/mui/formik-inputs/mui-formik-quantity-field.js b/src/components/mui/formik-inputs/mui-formik-quantity-field.js index 2d3b7b271..133716542 100644 --- a/src/components/mui/formik-inputs/mui-formik-quantity-field.js +++ b/src/components/mui/formik-inputs/mui-formik-quantity-field.js @@ -15,7 +15,7 @@ const MuiFormikQuantityField = ({ ...props }) => ( }} inputProps={{ min: 0, - inputMode: "decimal" + inputMode: "numeric" }} // eslint-disable-next-line react/jsx-props-no-spreading {...props} From 913f6be21047d7dd14d07af0313dcf1aa90cc06d Mon Sep 17 00:00:00 2001 From: Nicolas Olmos Date: Fri, 23 Jan 2026 14:06:43 -0300 Subject: [PATCH 8/8] chore: mark field as required --- .../components/sponsor-form-item-form.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pages/sponsors/sponsor-form-item-list-page/components/sponsor-form-item-form.js b/src/pages/sponsors/sponsor-form-item-list-page/components/sponsor-form-item-form.js index fe306f5fd..d2e350fc6 100644 --- a/src/pages/sponsors/sponsor-form-item-list-page/components/sponsor-form-item-form.js +++ b/src/pages/sponsors/sponsor-form-item-list-page/components/sponsor-form-item-form.js @@ -42,7 +42,9 @@ const SponsorFormItemForm = ({ initialValues, onSubmit }) => { early_bird_rate: decimalValidation(), standard_rate: decimalValidation(), onsite_rate: decimalValidation(), - default_quantity: positiveNumberValidation(), + default_quantity: positiveNumberValidation().required( + T.translate("validation.required") + ), quantity_limit_per_sponsor: positiveNumberValidation(), quantity_limit_per_show: positiveNumberValidation(), meta_fields: formMetafieldsValidation()