mirror of
https://github.com/Sea-Haven-Industries/shoc-frontend-new.git
synced 2026-10-07 08:09:00 +00:00
fix(work-orders): distinguish unassigned loading from empty pin
This commit is contained in:
parent
dc9e146080
commit
358495cfe9
5 changed files with 41 additions and 1 deletions
|
|
@ -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" }}>
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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({
|
||||||
|
|
|
||||||
|
|
@ -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],
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue