diff --git a/src/components/SharedTable.js b/src/components/SharedTable.js index bfa4b278..594949f8 100644 --- a/src/components/SharedTable.js +++ b/src/components/SharedTable.js @@ -87,14 +87,16 @@ const SharedTable = ({ setPageSize, totalCount, loading, - error + error, + sortBy, + setSortBy, + sortDir, + setSortDir }) => { const totalPages = Math.max(1, Math.ceil(totalCount / pageSize)); const [colWidths, setColWidths] = useState(null); const [columnOrder, setColumnOrder] = useState(() => columns.map((c) => c.key)); const [hiddenColumns, setHiddenColumns] = useState([]); - const [sortKey, setSortKey] = useState("lastUpdated"); - const [sortDir, setSortDir] = useState("desc"); const gridRef = useRef(null); useEffect(() => { @@ -166,25 +168,16 @@ const SharedTable = ({ }, [snapshotWidths, visibleColumns]); const handleSort = (key) => { - if (sortKey === key) { - setSortDir((d) => (d === "asc" ? "desc" : "asc")); + if (!setSortBy || !setSortDir) return; + if (sortBy === key) { + setSortDir(sortDir === "asc" ? "desc" : "asc"); } else { - setSortKey(key); + setSortBy(key); setSortDir("asc"); } + if (setPage) setPage(1); }; - const sortedRows = [...rows].sort((a, b) => { - if (!sortKey) return 0; - let aVal = a[sortKey] ?? ""; - let bVal = b[sortKey] ?? ""; - if (typeof aVal === "string") aVal = aVal.toLowerCase(); - if (typeof bVal === "string") bVal = bVal.toLowerCase(); - if (aVal < bVal) return sortDir === "asc" ? -1 : 1; - if (aVal > bVal) return sortDir === "asc" ? 1 : -1; - return 0; - }); - if (loading) return
Loading...
; if (error) return
{error}
; @@ -243,11 +236,11 @@ const SharedTable = ({
handleSort(col.key)} > {col.label} - {sortKey === col.key && {sortDir === "asc" ? " ▲" : " ▼"}} + {sortBy === col.key && {sortDir === "asc" ? " ▲" : " ▼"}} { e.stopPropagation(); handleMouseDown(e, col.key); }} @@ -256,7 +249,7 @@ const SharedTable = ({ ))}
Actions
- {sortedRows.map((row, idx) => ( + {rows.map((row, idx) => (
diff --git a/src/hooks/usePaginatedList.js b/src/hooks/usePaginatedList.js index 4a5a05a0..0ac4f18f 100644 --- a/src/hooks/usePaginatedList.js +++ b/src/hooks/usePaginatedList.js @@ -9,6 +9,8 @@ export default function usePaginatedList(fetchFn, extraParams = {}) { const [totalCount, setTotalCount] = useState(0); const [loading, setLoading] = useState(true); const [err, setErr] = useState(""); + const [sortBy, setSortBy] = useState("lastUpdated"); + const [sortDir, setSortDir] = useState("desc"); const debounceRef = useRef(null); const extraKey = JSON.stringify(extraParams); @@ -25,19 +27,19 @@ export default function usePaginatedList(fetchFn, extraParams = {}) { const reload = useCallback(() => { setLoading(true); setErr(""); - fetchFn({ search: debouncedSearch, page, pageSize, ...extraParams }) + fetchFn({ search: debouncedSearch, page, pageSize, sortBy, sortDir, ...extraParams }) .then(({ rows, totalCount }) => { setRows(rows); setTotalCount(totalCount); }) .catch((e) => setErr(e.message || "Failed to load")) .finally(() => setLoading(false)); - }, [fetchFn, debouncedSearch, page, pageSize, extraKey]); + }, [fetchFn, debouncedSearch, page, pageSize, sortBy, sortDir, extraKey]); useEffect(() => { reload(); }, [reload]); return useMemo(() => ({ rows, search, setSearch, page, setPage, pageSize, setPageSize, - totalCount, loading, err, reload - }), [rows, search, page, pageSize, totalCount, loading, err, reload]); + totalCount, loading, err, reload, sortBy, setSortBy, sortDir, setSortDir + }), [rows, search, page, pageSize, totalCount, loading, err, reload, sortBy, sortDir]); } diff --git a/src/pages/workorders/list/List.js b/src/pages/workorders/list/List.js index 5970f835..9cf57507 100644 --- a/src/pages/workorders/list/List.js +++ b/src/pages/workorders/list/List.js @@ -11,16 +11,8 @@ import "./styles.css"; export default function WorkOrdersList() { const navigate = useNavigate(); const { - rows, - search, - setSearch, - page, - setPage, - pageSize, - setPageSize, - totalCount, - loading, - err + rows, search, setSearch, page, setPage, pageSize, setPageSize, + totalCount, loading, err, sortBy, setSortBy, sortDir, setSortDir } = usePaginatedList(fetchWorkOrdersPaged); const [deleteModal, setDeleteModal] = useState({ @@ -124,6 +116,10 @@ export default function WorkOrdersList() { setPageSize={setPageSize} totalCount={totalCount} totalPages={totalPages} + sortBy={sortBy} + setSortBy={setSortBy} + sortDir={sortDir} + setSortDir={setSortDir} /> { @@ -194,6 +194,6 @@ export default function Table({ loading, error, rows, onEdit, onDelete, page, se ]; return ( - + ); } diff --git a/src/pages/workorders/list/api.js b/src/pages/workorders/list/api.js index f5b5d70d..37e4e1fb 100644 --- a/src/pages/workorders/list/api.js +++ b/src/pages/workorders/list/api.js @@ -1,8 +1,11 @@ import { get } from "../../../apiUtil"; import { API_URL } from "../../../constants"; -export const fetchWorkOrdersPaged = async ({ search = "", page = 1, pageSize = 12 }) => { - const res = await get(`${API_URL}/WorkOrder/GetWorkOrderList?search=${encodeURIComponent(search)}&page=${page}&pageSize=${pageSize}`); +export const fetchWorkOrdersPaged = async ({ search = "", page = 1, pageSize = 12, sortBy = "", sortDir = "" }) => { + const params = new URLSearchParams({ search, page, pageSize }); + if (sortBy) params.append("sortBy", sortBy); + if (sortDir) params.append("sortDir", sortDir); + const res = await get(`${API_URL}/WorkOrder/GetWorkOrderList?${params.toString()}`); const rows = (res?.data || res?.Data || []).map(x => ({ id: x.id ?? x.Id, number: x.internalWONumber ?? x.number ?? x.workOrderNumber ?? "",