From 0d847896db9976c455ac11acc46b2ffb3b86e859 Mon Sep 17 00:00:00 2001 From: Adam Moussa <166072409+amoussa1229@users.noreply.github.com> Date: Fri, 17 Apr 2026 12:57:37 -0400 Subject: [PATCH] Move status and assignee filters to server-side - Pass status and assignee as API query parameters - Filters applied in SQL for accurate counts across all pages - Remove client-side row filtering - Pagination and total count now reflect filtered results --- src/pages/workorders/list/List.js | 24 +++++++----------------- src/pages/workorders/list/api.js | 4 +++- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/pages/workorders/list/List.js b/src/pages/workorders/list/List.js index dfc3bfdc..f3ed313a 100644 --- a/src/pages/workorders/list/List.js +++ b/src/pages/workorders/list/List.js @@ -10,10 +10,13 @@ import "./styles.css"; export default function WorkOrdersList() { const navigate = useNavigate(); + const [statusFilter, setStatusFilter] = useState(""); + const [assigneeFilter, setAssigneeFilter] = useState(""); + const { rows, search, setSearch, page, setPage, pageSize, setPageSize, totalCount, loading, err, sortBy, setSortBy, sortDir, setSortDir - } = usePaginatedList(fetchWorkOrdersPaged); + } = usePaginatedList(fetchWorkOrdersPaged, { status: statusFilter, assignee: assigneeFilter }); const [deleteModal, setDeleteModal] = useState({ isOpen: false, @@ -39,8 +42,6 @@ export default function WorkOrdersList() { } }; - const [statusFilter, setStatusFilter] = useState(""); - const [assigneeFilter, setAssigneeFilter] = useState(""); const [users, setUsers] = useState([]); const statuses = ["Open", "In Progress", "On Hold", "Done", "Cancelled"]; @@ -48,24 +49,13 @@ export default function WorkOrdersList() { fetchUsers().then(setUsers).catch(() => {}); }, []); - const filteredRows = rows.filter((r) => { - if (statusFilter && r.status !== statusFilter) return false; - if (assigneeFilter === "__unassigned" && r.assignedTo) return false; - if (assigneeFilter && assigneeFilter !== "__unassigned" && r.assignedTo !== assigneeFilter) return false; - return true; - }); - - const hasFilter = statusFilter || assigneeFilter; - return ( <>

Work Orders

- - {hasFilter ? `${filteredRows.length} of ${totalCount}` : `${totalCount} total`} - + {totalCount} total
navigate(`/workorders/${item.id}`)} onDelete={handleDeleteClick} page={page} setPage={setPage} pageSize={pageSize} setPageSize={setPageSize} - totalCount={hasFilter ? filteredRows.length : totalCount} + totalCount={totalCount} totalPages={totalPages} sortBy={sortBy} setSortBy={setSortBy} diff --git a/src/pages/workorders/list/api.js b/src/pages/workorders/list/api.js index 37e4e1fb..f6fc23ff 100644 --- a/src/pages/workorders/list/api.js +++ b/src/pages/workorders/list/api.js @@ -1,10 +1,12 @@ import { get } from "../../../apiUtil"; import { API_URL } from "../../../constants"; -export const fetchWorkOrdersPaged = async ({ search = "", page = 1, pageSize = 12, sortBy = "", sortDir = "" }) => { +export const fetchWorkOrdersPaged = async ({ search = "", page = 1, pageSize = 12, sortBy = "", sortDir = "", status = "", assignee = "" }) => { const params = new URLSearchParams({ search, page, pageSize }); if (sortBy) params.append("sortBy", sortBy); if (sortDir) params.append("sortDir", sortDir); + if (status) params.append("status", status); + if (assignee) params.append("assignee", assignee); const res = await get(`${API_URL}/WorkOrder/GetWorkOrderList?${params.toString()}`); const rows = (res?.data || res?.Data || []).map(x => ({ id: x.id ?? x.Id,