diff --git a/src/app/(protected)/uplifts/_components/format-uplift-money.ts b/src/app/(protected)/uplifts/_components/format-uplift-money.ts index 4f269493..01aa64ff 100644 --- a/src/app/(protected)/uplifts/_components/format-uplift-money.ts +++ b/src/app/(protected)/uplifts/_components/format-uplift-money.ts @@ -1,3 +1,6 @@ export function formatUpliftMoney(value: number): string { - return `$${value.toLocaleString("en-US", { maximumFractionDigits: 2 })}`; + return `$${value.toLocaleString("en-US", { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + })}`; } diff --git a/src/app/(protected)/uplifts/_components/uplift-reason-field.tsx b/src/app/(protected)/uplifts/_components/uplift-reason-field.tsx index 37e3899d..ee4deddc 100644 --- a/src/app/(protected)/uplifts/_components/uplift-reason-field.tsx +++ b/src/app/(protected)/uplifts/_components/uplift-reason-field.tsx @@ -33,6 +33,8 @@ export function UpliftReasonField({ value={value} disabled={disabled} placeholder={placeholder} + required={required} + aria-required={required} rows={3} autoFocus className={`${DLG_INPUT_CLS} resize-none`} diff --git a/src/app/(protected)/vendor-pos/_components/vendor-po-sections.tsx b/src/app/(protected)/vendor-pos/_components/vendor-po-sections.tsx index 14a80753..5d77b7cf 100644 --- a/src/app/(protected)/vendor-pos/_components/vendor-po-sections.tsx +++ b/src/app/(protected)/vendor-pos/_components/vendor-po-sections.tsx @@ -326,6 +326,7 @@ export function UpliftDecisionDialog({ minRows={2} className="mt-2" value={note} + required={noteRequired} onChange={(e) => onNoteChange(e.target.value)} /> diff --git a/src/app/(protected)/workorders/_components/dispatch/dispatch-detail/uplift-decision-dialog.tsx b/src/app/(protected)/workorders/_components/dispatch/dispatch-detail/uplift-decision-dialog.tsx index 1959e816..c55751b8 100644 --- a/src/app/(protected)/workorders/_components/dispatch/dispatch-detail/uplift-decision-dialog.tsx +++ b/src/app/(protected)/workorders/_components/dispatch/dispatch-detail/uplift-decision-dialog.tsx @@ -66,6 +66,7 @@ export function UpliftDecisionDialog({ minRows={2} className="mt-2" value={note} + required={noteRequired} onChange={(event) => setNote(event.target.value)} disabled={isPending} /> diff --git a/src/app/(protected)/workorders/_components/uplifts/revoke-uplift-dialog.tsx b/src/app/(protected)/workorders/_components/uplifts/revoke-uplift-dialog.tsx index b9be5673..2c7b9584 100644 --- a/src/app/(protected)/workorders/_components/uplifts/revoke-uplift-dialog.tsx +++ b/src/app/(protected)/workorders/_components/uplifts/revoke-uplift-dialog.tsx @@ -61,6 +61,7 @@ export function RevokeUpliftDialog({ multiline minRows={2} value={reason} + required={requireReason} onChange={(event) => setReason(event.target.value)} /> diff --git a/src/test/app/(protected)/uplifts/reject-revoke-dialogs.test.tsx b/src/test/app/(protected)/uplifts/reject-revoke-dialogs.test.tsx index c0365f8f..8b17deb5 100644 --- a/src/test/app/(protected)/uplifts/reject-revoke-dialogs.test.tsx +++ b/src/test/app/(protected)/uplifts/reject-revoke-dialogs.test.tsx @@ -101,7 +101,11 @@ describe("RejectDialog", () => { it("marks the reason as required with an asterisk", () => { renderReject(); + expect(screen.getByRole("heading", { name: "Reject uplift of $250.00?" })).toBeInTheDocument(); expectDestructiveAsterisk("Reason for rejection"); + const reason = screen.getByLabelText(/reason for rejection/i); + expect(reason).toBeRequired(); + expect(reason).toHaveAttribute("aria-required", "true"); }); it("blocks cancel and escape while pending", () => { @@ -115,7 +119,7 @@ describe("RejectDialog", () => { describe("RevokeDialog", () => { it("keeps confirm disabled until a reason is typed", () => { const { onConfirm } = renderRevoke(); - const confirm = screen.getByRole("button", { name: "Revoke $500" }); + const confirm = screen.getByRole("button", { name: "Revoke $500.00" }); expect(confirm).toBeDisabled(); fireEvent.change(screen.getByLabelText(/reason for revoking/i), { @@ -136,6 +140,10 @@ describe("RevokeDialog", () => { it("marks the reason as required with an asterisk", () => { renderRevoke(); + expect(screen.getByRole("button", { name: "Revoke $500.00" })).toBeInTheDocument(); expectDestructiveAsterisk("Reason for revoking"); + const reason = screen.getByLabelText(/reason for revoking/i); + expect(reason).toBeRequired(); + expect(reason).toHaveAttribute("aria-required", "true"); }); });