From c97d752dd664c40996eaddd890ec25793c295fc0 Mon Sep 17 00:00:00 2001 From: Arthur Bassi Date: Thu, 23 Jul 2026 14:06:05 -0300 Subject: [PATCH] fix(work-orders): hide CompDoc affordance until dialog slice Omit onOpenCompDoc on board-core so View Doc/Draft are not no-ops. --- .../list/table/cells/comp-doc-cell.tsx | 7 +++++- .../_components/list/table/wo-table-row.tsx | 4 ++-- .../_components/list/table/wo-table.tsx | 13 +++++++---- src/app/(protected)/workorders/index.tsx | 3 +-- ...ork-orders-board-core-affordances.test.tsx | 23 +++++++++++++++++++ 5 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/app/(protected)/workorders/_components/list/table/cells/comp-doc-cell.tsx b/src/app/(protected)/workorders/_components/list/table/cells/comp-doc-cell.tsx index 55199255..43f258c3 100644 --- a/src/app/(protected)/workorders/_components/list/table/cells/comp-doc-cell.tsx +++ b/src/app/(protected)/workorders/_components/list/table/cells/comp-doc-cell.tsx @@ -10,7 +10,8 @@ type CompDocCellProps = { status: CompletionDocStatus; woType: WOType | ""; mediaCount?: number; - onOpen: () => void; + /** Omit until completion-doc slice mounts CompDocDialog. */ + onOpen?: () => void; onOpenMedia: () => void; }; @@ -38,6 +39,10 @@ export function CompDocCell({ ); } + if (!onOpen) { + return null; + } + const generated = status === "Yes"; const notRequired = status === "NN"; const color = generated ? "var(--color-success)" : "var(--color-text-muted)"; diff --git a/src/app/(protected)/workorders/_components/list/table/wo-table-row.tsx b/src/app/(protected)/workorders/_components/list/table/wo-table-row.tsx index b20e4e60..db611f97 100644 --- a/src/app/(protected)/workorders/_components/list/table/wo-table-row.tsx +++ b/src/app/(protected)/workorders/_components/list/table/wo-table-row.tsx @@ -28,7 +28,7 @@ export type WoTableRowHandlers = { onRowClick: (row: WorkOrderTableRow) => void; onView: (row: WorkOrderTableRow) => void; onEdit: (row: WorkOrderTableRow) => void; - onOpenCompDoc: (row: WorkOrderTableRow) => void; + onOpenCompDoc?: (row: WorkOrderTableRow) => void; onOpenMedia: (row: WorkOrderTableRow) => void; onPatch: (id: string | number, patch: Partial) => void; onDuplicateFound?: (existing: WorkOrderTableRow) => void; @@ -305,7 +305,7 @@ export function WoTableRow({ status={row.docStatus} woType={row.type} mediaCount={row.mediaCount} - onOpen={() => handlers.onOpenCompDoc(row)} + onOpen={handlers.onOpenCompDoc ? () => handlers.onOpenCompDoc!(row) : undefined} onOpenMedia={() => handlers.onOpenMedia(row)} /> diff --git a/src/app/(protected)/workorders/_components/list/table/wo-table.tsx b/src/app/(protected)/workorders/_components/list/table/wo-table.tsx index f97c3071..dd714e48 100644 --- a/src/app/(protected)/workorders/_components/list/table/wo-table.tsx +++ b/src/app/(protected)/workorders/_components/list/table/wo-table.tsx @@ -32,7 +32,8 @@ type WoTableProps = { vendors: VendorDropdownItem[]; pmTypes: string[]; onOpenSlideOver: (row: WorkOrderTableRow, edit?: boolean) => void; - onOpenCompDoc: (row: WorkOrderTableRow) => void; + /** Omit until completion-doc slice mounts CompDocDialog. */ + onOpenCompDoc?: (row: WorkOrderTableRow) => void; onOpenMedia: (row: WorkOrderTableRow) => void; onClearSearch?: () => void; onOpenAdvancedFilters?: () => void; @@ -111,10 +112,12 @@ export function WoTable({ tableData.setSelectedId(row.id); onOpenSlideOver(row, true); }, - onOpenCompDoc: (row: WorkOrderTableRow) => { - tableData.setSelectedId(row.id); - onOpenCompDoc(row); - }, + onOpenCompDoc: onOpenCompDoc + ? (row: WorkOrderTableRow) => { + tableData.setSelectedId(row.id); + onOpenCompDoc(row); + } + : undefined, onOpenMedia: (row: WorkOrderTableRow) => { tableData.setSelectedId(row.id); onOpenMedia(row); diff --git a/src/app/(protected)/workorders/index.tsx b/src/app/(protected)/workorders/index.tsx index f3cc3d84..8229b28e 100644 --- a/src/app/(protected)/workorders/index.tsx +++ b/src/app/(protected)/workorders/index.tsx @@ -1,4 +1,4 @@ -import { useMemo, useState } from "react"; +import { useMemo, useState } from "react"; import { Box } from "@mui/material"; import { useNavigate } from "react-router"; import { PageHeader } from "@/components/ui/page-header"; @@ -102,7 +102,6 @@ export default function WorkOrdersListPage() { tableData.setSelectedId(row.id); navigate(edit ? `/workorders/edit/${row.id}` : `/workorders/${row.id}`); }} - onOpenCompDoc={() => undefined} onOpenMedia={setMediaRow} onClearSearch={() => filters.handleSearchChange("")} /> diff --git a/src/test/app/(protected)/workorders/work-orders-board-core-affordances.test.tsx b/src/test/app/(protected)/workorders/work-orders-board-core-affordances.test.tsx index 0c0b295f..c091e708 100644 --- a/src/test/app/(protected)/workorders/work-orders-board-core-affordances.test.tsx +++ b/src/test/app/(protected)/workorders/work-orders-board-core-affordances.test.tsx @@ -1,6 +1,7 @@ import { fireEvent, screen } from "@testing-library/react"; import { describe, expect, it, vi } from "vitest"; import { WorkOrdersListHeader } from "@/app/(protected)/workorders/_components/list/work-orders-list-header"; +import { CompDocCell } from "@/app/(protected)/workorders/_components/list/table/cells/comp-doc-cell"; import WorkOrdersListPage from "@/app/(protected)/workorders/index"; import type { WorkOrderTableRow } from "@/domain/work-orders/types/work-order-table-row"; import { renderWithProviders } from "@/test/test-utils"; @@ -140,8 +141,30 @@ describe("WorkOrdersListPage board-core public interface", () => { expect(screen.queryByRole("button", { name: /new wo/i })).not.toBeInTheDocument(); expect(screen.queryByLabelText("Advanced Filters")).not.toBeInTheDocument(); + expect(screen.queryByRole("button", { name: /view doc|draft/i })).not.toBeInTheDocument(); fireEvent.click(screen.getByRole("button", { name: /view canceled row/i })); expect(navigate).toHaveBeenCalledWith("/workorders/77"); }); }); + +describe("CompDocCell slice affordances", () => { + it("hides View Doc / Draft when onOpen is omitted", () => { + const { container } = renderWithProviders( + , + { withAuth: false }, + ); + + expect(screen.queryByRole("button", { name: /view doc|draft|n\/n/i })).not.toBeInTheDocument(); + expect(container.textContent).toBe(""); + }); + + it("shows View Doc when onOpen is provided", () => { + renderWithProviders( + , + { withAuth: false }, + ); + + expect(screen.getByRole("button", { name: /view doc/i })).toBeInTheDocument(); + }); +});