From b11bbad7ed4dee1f4b5fbb35f1cc5752ab7a06c4 Mon Sep 17 00:00:00 2001
From: "gpt-engineer-app[bot]"
<159125892+gpt-engineer-app[bot]@users.noreply.github.com>
Date: Sat, 18 Apr 2026 07:10:43 +0000
Subject: [PATCH] Changes
Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com>
---
src/routes/collections.index.tsx | 41 ++++++++++++++++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git a/src/routes/collections.index.tsx b/src/routes/collections.index.tsx
index 6e2205c..8e56dc0 100644
--- a/src/routes/collections.index.tsx
+++ b/src/routes/collections.index.tsx
@@ -121,6 +121,47 @@ function CollectionsIndexPage() {
);
});
+ const sorted = useMemo(() => {
+ const getVal = (r: any): string | number => {
+ switch (sortKey) {
+ case "homeowner":
+ return `${r.homeowner?.last_name ?? ""} ${r.homeowner?.first_name ?? ""}`.toLowerCase();
+ case "case":
+ return (r.case?.client?.name ?? "").toLowerCase();
+ case "stage":
+ return (stages.find((s) => s.key === r.current_stage)?.label ?? "").toLowerCase();
+ case "tasks":
+ return openTaskCounts[r.id] ?? 0;
+ case "opened":
+ return r.opened_at ? new Date(r.opened_at).getTime() : 0;
+ case "balance":
+ return balances[r.id] ?? 0;
+ }
+ };
+ return [...filtered].sort((a, b) => {
+ const av = getVal(a);
+ const bv = getVal(b);
+ if (av < bv) return sortDir === "asc" ? -1 : 1;
+ if (av > bv) return sortDir === "asc" ? 1 : -1;
+ return 0;
+ });
+ }, [filtered, sortKey, sortDir, balances, openTaskCounts, stages]);
+
+ const SortHeader = ({ k, label, className }: { k: typeof sortKey; label: string; className?: string }) => {
+ const Icon = sortKey !== k ? ArrowUpDown : sortDir === "asc" ? ArrowUp : ArrowDown;
+ return (
+
+
+
+ );
+ };
+
return (