From 49d4ac31237d5bbfb872274386333be6dd4b932e Mon Sep 17 00:00:00 2001 From: jpbuizon Date: Thu, 26 Mar 2026 08:54:37 +0800 Subject: [PATCH 01/12] feat: users should be able to see their own pins on the map --- apps/web/app/page.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx index 2b970b7..eb24260 100644 --- a/apps/web/app/page.tsx +++ b/apps/web/app/page.tsx @@ -189,7 +189,10 @@ export default function Home() { !!(matchesCategory && matchesSearch) && (currentUser?.userRole === "admin" ? pinData.status !== "DELETED" - : pinData.status === "ACTIVE"); + : currentUser?.userRole === "user" && + pinData.ownerId === currentUser?.id + ? pinData.status !== "DELETED" + : pinData.status === "ACTIVE"); return ( Date: Thu, 26 Mar 2026 10:17:11 +0800 Subject: [PATCH 02/12] feat: locate button on dashboard --- apps/web/app/dashboard/page.tsx | 47 ++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/apps/web/app/dashboard/page.tsx b/apps/web/app/dashboard/page.tsx index 50afe41..e2ae445 100644 --- a/apps/web/app/dashboard/page.tsx +++ b/apps/web/app/dashboard/page.tsx @@ -6,6 +6,7 @@ import { signOut } from "@/lib/auth-client"; import { trpc } from "@/lib/trpc"; import { PIN_CATEGORIES, getPinColor } from "@/data/pin-categories"; import { useTheme } from "@/lib/ThemeContext"; +import Link from "next/link"; export default function Dashboard() { const router = useRouter(); @@ -496,11 +497,24 @@ export default function Dashboard() { - + ); })} @@ -564,11 +578,24 @@ export default function Dashboard() { - + ); })} From 57bc3bcb00a7488e36f98b47986514f23ab7dd9c Mon Sep 17 00:00:00 2001 From: jpbuizon Date: Thu, 26 Mar 2026 10:21:47 +0800 Subject: [PATCH 03/12] fix: params refuses to close pin details --- apps/web/app/admin/page.tsx | 170 ++++++++++++++++++++++++++++-------- 1 file changed, 136 insertions(+), 34 deletions(-) diff --git a/apps/web/app/admin/page.tsx b/apps/web/app/admin/page.tsx index d306298..8b49a4b 100644 --- a/apps/web/app/admin/page.tsx +++ b/apps/web/app/admin/page.tsx @@ -13,6 +13,9 @@ export default function AdminDashboard() { const { data, isLoading } = trpc.user.getCurrent.useQuery(); + const { data: pendingModifications } = + trpc.modification.getPending.useQuery(); + const { data: pinCounts } = trpc.pin.getStatusCounts.useQuery(); const { data: userCount } = trpc.user.getCount.useQuery(); const { data: commentCount } = trpc.comment.getCount.useQuery(); @@ -28,11 +31,23 @@ export default function AdminDashboard() { const rejectPin = trpc.pin.reject.useMutation({ onSuccess: (output) => { utils.pin.getAllAdmin.invalidate(); + utils.modification.getPending.invalidate(); }, }); const approvePin = trpc.pin.approve.useMutation({ onSuccess: (output) => { utils.pin.getAllAdmin.invalidate(); + utils.modification.getPending.invalidate(); + }, + }); + const applyMod = trpc.modification.applyModification.useMutation({ + onSuccess: (output) => { + utils.modification.getPending.invalidate(); + }, + }); + const rejectMod = trpc.modification.rejectModification.useMutation({ + onSuccess: (output) => { + utils.modification.getPending.invalidate(); }, }); @@ -114,40 +129,6 @@ export default function AdminDashboard() { // newUsers30Days: 45, }; - const recentUsers = [ - { - id: "u1", - name: "User 1", - email: "user1@up.edu.ph", - joinedAt: "2 hours ago", - }, - { - id: "u2", - name: "User 2", - email: "user2@up.edu.ph", - joinedAt: "5 hours ago", - }, - { - id: "u3", - name: "User 3", - email: "user3@up.edu.ph", - joinedAt: "1 day ago", - }, - { - id: "u4", - name: "User 4", - email: "user4@up.edu.ph", - joinedAt: "2 days ago", - }, - ]; - - const topUsers = [ - { id: "u1", name: "User 1", pinCount: 142, rank: 1 }, - { id: "u2", name: "User 2", pinCount: 89, rank: 2 }, - { id: "u3", name: "User 3", pinCount: 75, rank: 3 }, - { id: "u4", name: "User 4", pinCount: 60, rank: 4 }, - ]; - return (
{/* --- MOBILE OVERLAY --- */} @@ -749,6 +730,127 @@ export default function AdminDashboard() {
+ +
+
+

RECENT MODIFICATION REQUESTS

+
+ +
+
+ {pendingModifications?.map((mod) => { + const color = "var(--text-primary)"; + return ( +
+
+
+ + {mod.pin.title.charAt(0).toUpperCase()} + +
+ +
+ + {mod.pin.title} + + + Modification by {mod.user.name} + +
+
+ +
+ + + + + + + + + +
+
+ ); + })} +
+
+
From 6efd7cf6ace977cc95c4231daa90871eef220405 Mon Sep 17 00:00:00 2001 From: jpbuizon Date: Thu, 26 Mar 2026 10:25:29 +0800 Subject: [PATCH 04/12] fix: don't pass in status when creating pin initial modification --- packages/api/src/services/pins.service.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/api/src/services/pins.service.ts b/packages/api/src/services/pins.service.ts index e2f0e0d..ee9101f 100644 --- a/packages/api/src/services/pins.service.ts +++ b/packages/api/src/services/pins.service.ts @@ -54,11 +54,11 @@ export function makePinService( message: "Failed to create pin", code: "BAD_REQUEST", }); - + const { status, ...dataWithoutStatus } = data; await repositories.modification.create({ userId: data.ownerId, pinId: res.id, - after: { data: data, tags: tags }, + after: { data: dataWithoutStatus, tags: tags }, status: data.status === "ACTIVE" ? "APPLIED" : "PENDING", }); @@ -194,7 +194,7 @@ export function makePinService( id, ); - if (initialMod) + if (!!initialMod) await repositories.modification.applyModification(initialMod.id, adminId); return result; From 10c7004826b2c724b3fba0ff3d04ab7c7a0578c5 Mon Sep 17 00:00:00 2001 From: jpbuizon Date: Thu, 26 Mar 2026 14:21:27 +0800 Subject: [PATCH 05/12] fix: don't lock preselect --- apps/web/app/page.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx index eb24260..03bb4ac 100644 --- a/apps/web/app/page.tsx +++ b/apps/web/app/page.tsx @@ -33,6 +33,8 @@ export default function Home() { const session = useSession(); const params = useSearchParams(); + const [hasPreselected, setHasPreselected] = useState(false); + const { data: pins } = trpc.pin.getAll.useQuery(undefined, { refetchOnWindowFocus: false, }); @@ -125,11 +127,12 @@ export default function Home() { }, [isAddingPin]); useEffect(() => { - if (params.has("pin")) { + if (params.has("pin") && !hasPreselected) { const preselectedPin = params.get("pin") as string; selectPin(preselectedPin); + setHasPreselected(true); } - }, [params, selectPin]); + }, [params, selectPin, hasPreselected]); return ( From 7f8d8d2d7e1b24319cf163946ef29f5467b0d018 Mon Sep 17 00:00:00 2001 From: jpbuizon Date: Thu, 26 Mar 2026 14:21:53 +0800 Subject: [PATCH 06/12] fix: wrong endpoint --- apps/web/app/admin/page.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/web/app/admin/page.tsx b/apps/web/app/admin/page.tsx index 8b49a4b..313f15b 100644 --- a/apps/web/app/admin/page.tsx +++ b/apps/web/app/admin/page.tsx @@ -40,12 +40,12 @@ export default function AdminDashboard() { utils.modification.getPending.invalidate(); }, }); - const applyMod = trpc.modification.applyModification.useMutation({ + const applyMod = trpc.pin.applyUpdate.useMutation({ onSuccess: (output) => { utils.modification.getPending.invalidate(); }, }); - const rejectMod = trpc.modification.rejectModification.useMutation({ + const rejectMod = trpc.pin.rejectUpdate.useMutation({ onSuccess: (output) => { utils.modification.getPending.invalidate(); }, From a32a0733d2ad052130bf7da37a7578c302d734b7 Mon Sep 17 00:00:00 2001 From: jpbuizon Date: Thu, 26 Mar 2026 14:22:22 +0800 Subject: [PATCH 07/12] feat: show if logged in not just owner --- apps/web/components/ExpandedPinView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/components/ExpandedPinView.tsx b/apps/web/components/ExpandedPinView.tsx index efd43e1..317d090 100644 --- a/apps/web/components/ExpandedPinView.tsx +++ b/apps/web/components/ExpandedPinView.tsx @@ -358,7 +358,7 @@ export function ExpandedPinView({ pinId, onClose }: ExpandedPinViewProps) {
- {sessionData?.user?.id === pin?.ownerId && ( + {!!sessionData && (