From b65611b6b20ceccc94349f273ee0466fb8d5c08a Mon Sep 17 00:00:00 2001 From: Anthony Basko <75228079+nunnyu@users.noreply.github.com> Date: Thu, 22 Jan 2026 00:05:15 -0500 Subject: [PATCH 1/4] #3879: Changed layout and validation of the material form. Made it so only name, status, and material are required --- .../src/controllers/projects.controllers.ts | 6 +- src/backend/src/services/boms.services.ts | 2 +- src/backend/src/utils/validation.utils.ts | 6 +- .../BOM/MaterialForm/MaterialForm.tsx | 6 +- .../BOM/MaterialForm/MaterialFormView.tsx | 99 +++++++++---------- 5 files changed, 59 insertions(+), 60 deletions(-) diff --git a/src/backend/src/controllers/projects.controllers.ts b/src/backend/src/controllers/projects.controllers.ts index c874848b1e..bbd3d23527 100644 --- a/src/backend/src/controllers/projects.controllers.ts +++ b/src/backend/src/controllers/projects.controllers.ts @@ -226,7 +226,7 @@ export default class ProjectsController { subtotal, notes, assemblyId, - pdmFileName === '' ? undefined : pdmFileName, + pdmFileName, unitName, reimbursementRequestId ); @@ -379,8 +379,8 @@ export default class ProjectsController { name, status, materialTypeName, - linkUrl, req.organization, + linkUrl, manufacturerName, manufacturerPartNumber, quantity, @@ -389,7 +389,7 @@ export default class ProjectsController { notes, unitName, assemblyId, - pdmFileName === '' ? undefined : pdmFileName, + pdmFileName, reimbursementRequestId ); res.status(200).json(updatedMaterial); diff --git a/src/backend/src/services/boms.services.ts b/src/backend/src/services/boms.services.ts index 54c6c030d2..ed32cae2ae 100644 --- a/src/backend/src/services/boms.services.ts +++ b/src/backend/src/services/boms.services.ts @@ -566,8 +566,8 @@ export default class BillOfMaterialsService { name: string, status: Material_Status, materialTypeName: string, - linkUrl: string, organization: Organization, + linkUrl?: string, manufacturerName?: string, manufacturerPartNumber?: string, quantity?: Decimal, diff --git a/src/backend/src/utils/validation.utils.ts b/src/backend/src/utils/validation.utils.ts index 08a14d653b..e13d088851 100644 --- a/src/backend/src/utils/validation.utils.ts +++ b/src/backend/src/utils/validation.utils.ts @@ -198,14 +198,14 @@ export const materialValidators = [ nonEmptyString(body('assemblyId').optional()), isMaterialStatus(body('status')), nonEmptyString(body('materialTypeName')), - nonEmptyString(body('manufacturerName')).optional(), - nonEmptyString(body('manufacturerPartNumber')).optional(), + body('manufacturerName').optional().isString(), + body('manufacturerPartNumber').optional().isString(), body('pdmFileName').optional().isString(), decimalMinZero(body('quantity')).optional(), nonEmptyString(body('unitName')).optional(), intMinZero(body('price')).optional(), // in cents intMinZero(body('subtotal')).optional(), // in cents - nonEmptyString(body('linkUrl')), + body('linkUrl').optional().isString(), nonEmptyString(body('reimbursementRequestId')).optional(), body('notes').isString().optional() ]; diff --git a/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialForm.tsx b/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialForm.tsx index c794c1f49d..d4752dc209 100644 --- a/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialForm.tsx +++ b/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialForm.tsx @@ -26,7 +26,7 @@ const schema = yup.object().shape({ quantity: yup.number().optional(), price: yup.number().optional(), unitName: yup.string().optional(), - linkUrl: yup.string().required('URL is required!'), + linkUrl: yup.string().optional(), notes: yup.string().optional(), pdmFileName: yup.string().optional(), assemblyId: yup.string().optional(), @@ -43,7 +43,7 @@ export interface MaterialFormInput { price?: number; quantity?: number; unitName?: string; - linkUrl: string; + linkUrl?: string; notes?: string; assemblyId?: string; reimbursementRequestId?: string; @@ -59,7 +59,7 @@ export interface MaterialDataSubmission { price?: number; quantity?: Decimal; unitName?: string; - linkUrl: string; + linkUrl?: string; notes?: string; assemblyId?: string; subtotal?: number; diff --git a/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialFormView.tsx b/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialFormView.tsx index ae5753b9f0..bb970ec806 100644 --- a/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialFormView.tsx +++ b/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialFormView.tsx @@ -82,7 +82,7 @@ const MaterialFormView: React.FC = ({ showCloseButton > - + = ({ /> - - - - Reimbursement #: - - ( - - selected ? ( - reimbursementRequests.find((rr) => rr.reimbursementRequestId === selected)?.identifier - ) : ( - - Select Corresponding RR - - ) - }} - > - {reimbursementRequests.map((rr: ReimbursementRequest) => ( - - {rr.identifier} - - ))} - - )} - /> - - = ({ setValue('materialTypeName', ''); onChange(''); }; - return ( = ({ /> - + @@ -239,7 +193,7 @@ const MaterialFormView: React.FC = ({ }} variant="h5" > - Manufacturer:* + Manufacturer: = ({ + + + + Reimbursement #: + + ( + + selected ? ( + reimbursementRequests.find((rr) => rr.reimbursementRequestId === selected)?.identifier + ) : ( + + Select Corresponding RR + + ) + }} + > + {reimbursementRequests.map((rr: ReimbursementRequest) => ( + + {rr.identifier} + + ))} + + )} + /> + + = ({ }} variant="h5" > - Part Details:* + Part Details: Date: Thu, 22 Jan 2026 00:25:50 -0500 Subject: [PATCH 2/4] #3879: Moved RR# to additional info & fixed bug with quantity falsey value --- .../BOM/MaterialForm/MaterialForm.tsx | 4 +- .../BOM/MaterialForm/MaterialFormView.tsx | 80 ++++++++----------- 2 files changed, 37 insertions(+), 47 deletions(-) diff --git a/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialForm.tsx b/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialForm.tsx index d4752dc209..9d3f3e2edf 100644 --- a/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialForm.tsx +++ b/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialForm.tsx @@ -139,8 +139,8 @@ const MaterialForm: React.FC = ({ submitText, assemblies, onS const onSubmitWrapper = (data: MaterialFormInput): void => { const price = data.price ? Math.round(data.price * 100) : undefined; - const subtotal = price ? (data.quantity ? parseFloat((data.quantity * price).toFixed(2)) : undefined) : undefined; - onSubmit({ ...data, subtotal, price, quantity: data.quantity ? new Decimal(data.quantity) : undefined }); + const subtotal = price ? (data.quantity != null ? parseFloat((data.quantity * price).toFixed(2)) : undefined) : undefined; + onSubmit({ ...data, subtotal, price, quantity: data.quantity != null ? new Decimal(data.quantity) : undefined }); }; const createManufacturerWrapper = async (manufacturerName: string): Promise => { diff --git a/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialFormView.tsx b/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialFormView.tsx index bb970ec806..49465655f1 100644 --- a/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialFormView.tsx +++ b/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialFormView.tsx @@ -262,51 +262,6 @@ const MaterialFormView: React.FC = ({ - - - - Reimbursement #: - - ( - - selected ? ( - reimbursementRequests.find((rr) => rr.reimbursementRequestId === selected)?.identifier - ) : ( - - Select Corresponding RR - - ) - }} - > - {reimbursementRequests.map((rr: ReimbursementRequest) => ( - - {rr.identifier} - - ))} - - )} - /> - - = ({ + + + ( + + selected ? ( + reimbursementRequests.find((rr) => rr.reimbursementRequestId === selected)?.identifier + ) : ( + + Select Corresponding Reimbursement Request Number + + ) + }} + > + {reimbursementRequests.map((rr: ReimbursementRequest) => ( + + {rr.identifier} + + ))} + + )} + /> + + Date: Thu, 22 Jan 2026 00:34:29 -0500 Subject: [PATCH 3/4] #3879: Consistency with tooltips and improved visual clarity --- .../BOM/MaterialForm/MaterialFormView.tsx | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialFormView.tsx b/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialFormView.tsx index 49465655f1..bf2a0de703 100644 --- a/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialFormView.tsx +++ b/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialFormView.tsx @@ -181,7 +181,7 @@ const MaterialFormView: React.FC = ({ /> - + @@ -277,12 +277,7 @@ const MaterialFormView: React.FC = ({ From 4e47b0fb084a1124f4434cf723709f2dee62e668 Mon Sep 17 00:00:00 2001 From: Anthony Basko <75228079+nunnyu@users.noreply.github.com> Date: Thu, 22 Jan 2026 00:48:03 -0500 Subject: [PATCH 4/4] #3879: prettier linting fixes --- .../ProjectViewContainer/BOM/MaterialForm/MaterialForm.tsx | 6 +++++- .../BOM/MaterialForm/MaterialFormView.tsx | 6 ++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialForm.tsx b/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialForm.tsx index 9d3f3e2edf..69f574d05e 100644 --- a/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialForm.tsx +++ b/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialForm.tsx @@ -139,7 +139,11 @@ const MaterialForm: React.FC = ({ submitText, assemblies, onS const onSubmitWrapper = (data: MaterialFormInput): void => { const price = data.price ? Math.round(data.price * 100) : undefined; - const subtotal = price ? (data.quantity != null ? parseFloat((data.quantity * price).toFixed(2)) : undefined) : undefined; + const subtotal = price + ? data.quantity != null + ? parseFloat((data.quantity * price).toFixed(2)) + : undefined + : undefined; onSubmit({ ...data, subtotal, price, quantity: data.quantity != null ? new Decimal(data.quantity) : undefined }); }; diff --git a/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialFormView.tsx b/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialFormView.tsx index bf2a0de703..398ab0d3e5 100644 --- a/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialFormView.tsx +++ b/src/frontend/src/pages/ProjectDetailPage/ProjectViewContainer/BOM/MaterialForm/MaterialFormView.tsx @@ -276,9 +276,7 @@ const MaterialFormView: React.FC = ({ Part Details: - + @@ -407,7 +405,7 @@ const MaterialFormView: React.FC = ({ - +