fix(work-orders): distinguish unassigned loading from empty pin

This commit is contained in:
arthur.bassi 2026-08-18 17:40:16 -03:00
parent dc9e146080
commit 358495cfe9
5 changed files with 41 additions and 1 deletions

View file

@ -23,8 +23,13 @@ export function WoTableBody({ tableData, renderRow, renderInlineRow }: WoTableBo
const unassignedRows = tableData.unassigned ?? [];
const showUnscheduled =
(tableData.unscheduled?.length ?? 0) > 0 || tableData.draftDayKey === UNSCHEDULED_DAY_KEY;
const showUnassignedLoading =
tableData.unassignedOpen && Boolean(tableData.unassignedLoading) && !tableData.unassignedError;
const showUnassignedEmpty =
tableData.unassignedOpen && unassignedRows.length === 0 && !tableData.unassignedError;
tableData.unassignedOpen &&
unassignedRows.length === 0 &&
!tableData.unassignedError &&
!tableData.unassignedLoading;
return (
<tbody>
@ -47,6 +52,15 @@ export function WoTableBody({ tableData, renderRow, renderInlineRow }: WoTableBo
</td>
</tr>
)}
{showUnassignedLoading && (
<tr>
<td colSpan={WO_TABLE_COLS.length} style={{ padding: "8px 14px" }}>
<Text variant="feedback" tone="muted">
Loading unassigned work orders.
</Text>
</td>
</tr>
)}
{showUnassignedEmpty && (
<tr>
<td colSpan={WO_TABLE_COLS.length} style={{ padding: "8px 14px" }}>

View file

@ -23,6 +23,7 @@ export type WorkOrdersBoardSource = {
data: WorkOrderBoardListResult | undefined;
unassignedQueue: WorkOrderTableRow[];
unassignedError: Error | null;
unassignedLoading: boolean;
isLoading: boolean;
isFetching: boolean;
error: Error | null;
@ -75,6 +76,7 @@ export function useWorkOrdersBoardSource(filters: FiltersReturn): WorkOrdersBoar
} = useWorkOrdersBoardSearch(resolvedSearchParams ?? { datePreset: "ThisWeek" }, advActive);
const {
data: queueData,
isPending: queuePending,
isFetching: queueFetching,
error: queueError,
refetch: refetchQueue,
@ -94,6 +96,7 @@ export function useWorkOrdersBoardSource(filters: FiltersReturn): WorkOrdersBoar
data: advActive ? searchData : boardData,
unassignedQueue: advActive ? EMPTY_UNASSIGNED_QUEUE : (queueData ?? EMPTY_UNASSIGNED_QUEUE),
unassignedError: advActive ? null : (queueError ?? null),
unassignedLoading: advActive ? false : queuePending,
isLoading: advActive ? searchLoading : boardLoading,
isFetching: advActive ? searchFetching : boardFetching || queueFetching,
error: advActive ? searchError : boardError,

View file

@ -26,6 +26,7 @@ export function useWorkOrdersTableData(filters: FiltersReturn) {
data,
unassignedQueue,
unassignedError,
unassignedLoading,
isLoading,
isFetching,
error,
@ -107,6 +108,7 @@ export function useWorkOrdersTableData(filters: FiltersReturn) {
advResults,
unassigned,
unassignedError,
unassignedLoading,
unscheduled,
displayGroups,
searchActive,

View file

@ -76,6 +76,7 @@ function baseTableData(
advResults: [],
unassigned: [],
unassignedError: null,
unassignedLoading: false,
unscheduled: [],
displayGroups: [],
searchActive: false,
@ -350,6 +351,25 @@ describe("WoTableBody Unassigned queue (SH-165)", () => {
expect(screen.queryByTestId(/row-/)).not.toBeInTheDocument();
});
it("shows a loading state instead of empty while the unassigned queue is pending", () => {
render(
<table>
<WoTableBody
tableData={baseTableData({ unassignedLoading: true })}
renderRow={(row) => (
<tr key={String(row.id)} data-testid={`row-${row.id}`}>
<td>{row.woNumber}</td>
</tr>
)}
renderInlineRow={() => null}
/>
</table>,
);
expect(screen.getByText("Loading unassigned work orders.")).toBeInTheDocument();
expect(screen.queryByText("No unassigned work orders.")).not.toBeInTheDocument();
});
it("removes a pinned row immediately after assigning through the board PATCH path", async () => {
const user = userEvent.setup();
const pinned = makeRow({

View file

@ -78,6 +78,7 @@ function renderUnscheduledHarness() {
advActive: false,
unassigned: [],
unassignedError: null,
unassignedLoading: false,
unassignedOpen: true,
setUnassignedOpen: vi.fn(),
unscheduled: [unscheduledRow],