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

View file

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

View file

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

View file

@ -76,6 +76,7 @@ function baseTableData(
advResults: [], advResults: [],
unassigned: [], unassigned: [],
unassignedError: null, unassignedError: null,
unassignedLoading: false,
unscheduled: [], unscheduled: [],
displayGroups: [], displayGroups: [],
searchActive: false, searchActive: false,
@ -350,6 +351,25 @@ describe("WoTableBody Unassigned queue (SH-165)", () => {
expect(screen.queryByTestId(/row-/)).not.toBeInTheDocument(); 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 () => { it("removes a pinned row immediately after assigning through the board PATCH path", async () => {
const user = userEvent.setup(); const user = userEvent.setup();
const pinned = makeRow({ const pinned = makeRow({

View file

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