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..69f574d05e 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; @@ -139,8 +139,12 @@ 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 ae5753b9f0..398ab0d3e5 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 ( = ({ }} variant="h5" > - Manufacturer:* + Manufacturer: = ({ }} variant="h5" > - Part Details:* + Part Details: - + @@ -458,6 +405,41 @@ const MaterialFormView: React.FC = ({ + + + ( + + selected ? ( + reimbursementRequests.find((rr) => rr.reimbursementRequestId === selected)?.identifier + ) : ( + + Select Corresponding Reimbursement Request Number + + ) + }} + > + {reimbursementRequests.map((rr: ReimbursementRequest) => ( + + {rr.identifier} + + ))} + + )} + /> + +