From 9d419fe16476d8e0a38c2ee3d33a3f7b7e8577fb Mon Sep 17 00:00:00 2001 From: Moheeb Zara Date: Sun, 17 May 2026 01:54:14 -0700 Subject: [PATCH] feat(ux): mobile card layouts for members & payments tables The two dense tables were overflow-x-auto only; on phones the action buttons sat off-screen. Table is now hidden md:block; under md a stacked card list renders the same data + key actions reusing the existing handlers/dialogs (members: approve/edit/certs/cards/forms/remove; payments: link member). Desktop unchanged. --- app/(app)/members/members-client.tsx | 54 +++++++++++++++++++++++++- app/(app)/payments/payments-client.tsx | 42 +++++++++++++++++++- 2 files changed, 94 insertions(+), 2 deletions(-) diff --git a/app/(app)/members/members-client.tsx b/app/(app)/members/members-client.tsx index f3ff3ab..2f68eee 100644 --- a/app/(app)/members/members-client.tsx +++ b/app/(app)/members/members-client.tsx @@ -306,7 +306,7 @@ export function MembersClient({ members: initialMembers, currentRole, areaLeadRo
-
+
@@ -480,6 +480,58 @@ export function MembersClient({ members: initialMembers, currentRole, areaLeadRo
+ + {/* Mobile: stacked cards (the table is unusable on phones). */} +
+ {sortedMembers.length > 0 ? sortedMembers.map(m => { + const hasIssue = m.payment_status && m.payment_status !== 'current' + return ( +
+
+
+

{m.display_name}

+

{m.email}

+
+ + {m.tier?.toUpperCase()} + +
+

+ {m.status === 'unverified' ? 'unverified' : (m.payment_status || m.status)} + {m.joined_at ? ` · joined ${new Date(m.joined_at).toLocaleDateString('en-US', { month: 'short', year: 'numeric' })}` : ''} +

+
+ {isAdmin(currentRole) && m.status === 'unverified' && ( + + )} + {isAdmin(currentRole) && ( + + )} + {canGrantCerts && ( + + )} + {canManageCards && ( + + )} + {canViewForms && ( + + )} + {isAdmin(currentRole) && ( + + )} +
+
+ ) + }) : ( + + + + No members match this filter + Try a different tab, clear the search, or change the tier filter. + + + )} +
diff --git a/app/(app)/payments/payments-client.tsx b/app/(app)/payments/payments-client.tsx index 316a67a..f347004 100644 --- a/app/(app)/payments/payments-client.tsx +++ b/app/(app)/payments/payments-client.tsx @@ -202,7 +202,7 @@ export function PaymentsClient({ payments: initialPayments, members, integration
-
+
@@ -262,6 +262,46 @@ export function PaymentsClient({ payments: initialPayments, members, integration
+ + {/* Mobile: stacked cards */} +
+ {filtered.length > 0 ? filtered.map(p => ( +
+
+ {'$'}{Number(p.amount).toFixed(2)} + {p.platform?.toUpperCase()} +
+

+ {p.from_identifier}{p.from_note ? ` · "${p.from_note}"` : ''} + {p.transaction_date ? ` · ${new Date(p.transaction_date).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}` : ''} +

+
+ {p.link_status === 'linked' && p.space_members ? ( + + ✓ {p.space_members.display_name} + + ) : canEdit(currentRole) ? ( + + ) : ( + unlinked + )} +
+
+ )) : ( + + + + No payments yet + Synced and logged transactions show up here once they exist. + + + )} +