From 5dfb2fb1c1461b6440ae766433a4b7855f491bfb Mon Sep 17 00:00:00 2001 From: Arthur Bassi Date: Tue, 25 Aug 2026 12:03:36 -0300 Subject: [PATCH] fix(work-orders): require explicit Aveta Extra Docs category --- .../detail/tabs/slide-over-extras-tab.tsx | 13 ++------- .../detail/use-slide-over-media-state.ts | 2 +- .../work-orders/utils/extra-docs-aveta.ts | 28 ++++++------------- .../slide-over-extras-aveta.test.tsx | 28 +++++++++++++++++-- .../utils/extra-docs-aveta.test.ts | 20 ++++++------- 5 files changed, 47 insertions(+), 44 deletions(-) diff --git a/src/app/(protected)/workorders/_components/detail/tabs/slide-over-extras-tab.tsx b/src/app/(protected)/workorders/_components/detail/tabs/slide-over-extras-tab.tsx index caed0bf3..8ad375e0 100644 --- a/src/app/(protected)/workorders/_components/detail/tabs/slide-over-extras-tab.tsx +++ b/src/app/(protected)/workorders/_components/detail/tabs/slide-over-extras-tab.tsx @@ -40,22 +40,16 @@ type SlideOverExtrasTabProps = { function ExtraDocRow({ file, - index, - uploads, - avetaRequired, isReadOnly, pending, onRemove, }: { file: MediaFile; - index: number; - uploads: MediaFile[]; - avetaRequired: boolean; isReadOnly: boolean; pending: boolean; onRemove: (id: string) => void; }) { - const category = resolveExtraDocCategory(file, index, avetaRequired, uploads); + const category = resolveExtraDocCategory(file); const isAveta = category === "Aveta"; const ItemIcon = isAveta ? ShieldCheck : FILETYPE_ICON[file.fileType]; const showDelete = !isReadOnly && canDeleteWorkOrderMedia(file); @@ -192,13 +186,10 @@ export function SlideOverExtrasTab({ ) : (
- {uploads.map((file, index) => ( + {uploads.map((file) => ( item.category === "Aveta"); - if (avetaRequired && index === 0 && !hasExplicitAveta) { - return "Aveta"; - } +/** + * Extra Docs overlay category. Board purpose stays Extra + * (API enum Before/After/Extra/Completion). Aveta is never inferred from + * upload order — only an explicit Aveta category counts. + */ +export function resolveExtraDocCategory(file: MediaFile): MediaCategory { return file.category; } -export function shouldDefaultFirstExtraToAveta( - avetaRequired: boolean, - existing: MediaFile[], -): boolean { - return avetaRequired && !existing.some((item) => item.category === "Aveta"); +export function hasExplicitAvetaFile(files: MediaFile[]): boolean { + return files.some((item) => item.category === "Aveta"); } diff --git a/src/test/app/(protected)/workorders/slide-over-extras-aveta.test.tsx b/src/test/app/(protected)/workorders/slide-over-extras-aveta.test.tsx index 25724db6..de6af331 100644 --- a/src/test/app/(protected)/workorders/slide-over-extras-aveta.test.tsx +++ b/src/test/app/(protected)/workorders/slide-over-extras-aveta.test.tsx @@ -12,8 +12,16 @@ const photo: MediaFile = { category: "Report", }; +const avetaDoc: MediaFile = { + id: "m2", + name: "aveta-clearance.pdf", + fileType: "pdf", + url: "blob:2", + category: "Aveta", +}; + describe("SlideOverExtrasTab Aveta", () => { - it("labels the first extra document as Aveta when the WO is flagged", () => { + it("does not label the first extra document as Aveta when none is explicitly Aveta", () => { renderWithProviders( { />, ); - expect(screen.getAllByText("Aveta").length).toBeGreaterThan(0); expect(screen.getByText("safety-form.pdf")).toBeInTheDocument(); + expect(screen.getAllByText("Aveta")).toHaveLength(1); + }); + + it("labels only an explicitly Aveta-categorized extra document", () => { + renderWithProviders( + , + ); + + expect(screen.getByText("safety-form.pdf")).toBeInTheDocument(); + expect(screen.getByText("aveta-clearance.pdf")).toBeInTheDocument(); + expect(screen.getAllByText("Aveta").length).toBeGreaterThanOrEqual(2); }); }); diff --git a/src/test/domain/work-orders/utils/extra-docs-aveta.test.ts b/src/test/domain/work-orders/utils/extra-docs-aveta.test.ts index 45b05469..ddc4b562 100644 --- a/src/test/domain/work-orders/utils/extra-docs-aveta.test.ts +++ b/src/test/domain/work-orders/utils/extra-docs-aveta.test.ts @@ -1,8 +1,8 @@ import { describe, expect, it } from "vitest"; import type { MediaFile } from "@/domain/work-orders/types/work-order-media"; import { + hasExplicitAvetaFile, resolveExtraDocCategory, - shouldDefaultFirstExtraToAveta, } from "@/domain/work-orders/utils/extra-docs-aveta"; function file(category: MediaFile["category"]): MediaFile { @@ -16,23 +16,23 @@ function file(category: MediaFile["category"]): MediaFile { } describe("extra-docs-aveta", () => { - it("defaults the first extra file to Aveta when required and none is Aveta", () => { + it("does not label the first extra file as Aveta when the WO is flagged and none is Aveta", () => { const files = [file("Photo"), file("Report")]; - expect(resolveExtraDocCategory(files[0], 0, true, files)).toBe("Aveta"); - expect(resolveExtraDocCategory(files[1], 1, true, files)).toBe("Report"); - expect(shouldDefaultFirstExtraToAveta(true, files)).toBe(true); + expect(resolveExtraDocCategory(files[0])).toBe("Photo"); + expect(resolveExtraDocCategory(files[1])).toBe("Report"); + expect(hasExplicitAvetaFile(files)).toBe(false); }); it("keeps an explicit Aveta file and does not relabel others", () => { const files = [file("Photo"), file("Aveta")]; - expect(resolveExtraDocCategory(files[0], 0, true, files)).toBe("Photo"); - expect(resolveExtraDocCategory(files[1], 1, true, files)).toBe("Aveta"); - expect(shouldDefaultFirstExtraToAveta(true, files)).toBe(false); + expect(resolveExtraDocCategory(files[0])).toBe("Photo"); + expect(resolveExtraDocCategory(files[1])).toBe("Aveta"); + expect(hasExplicitAvetaFile(files)).toBe(true); }); it("does not label extras as Aveta when the WO is not flagged", () => { const files = [file("Photo")]; - expect(resolveExtraDocCategory(files[0], 0, false, files)).toBe("Photo"); - expect(shouldDefaultFirstExtraToAveta(false, files)).toBe(false); + expect(resolveExtraDocCategory(files[0])).toBe("Photo"); + expect(hasExplicitAvetaFile(files)).toBe(false); }); });