From e5fdd0ecb86391090b3e9df95d1e63a53e225ded Mon Sep 17 00:00:00 2001 From: James Pattinson Date: Wed, 12 Nov 2025 16:47:21 +0000 Subject: [PATCH] Mobile improvements --- frontend/src/App.css | 68 ++++++- frontend/src/pages/Dashboard.tsx | 312 ++++++++++++++++--------------- frontend/src/pages/Login.tsx | 2 +- 3 files changed, 227 insertions(+), 155 deletions(-) diff --git a/frontend/src/App.css b/frontend/src/App.css index 9e6fc0d..c5baccf 100644 --- a/frontend/src/App.css +++ b/frontend/src/App.css @@ -79,7 +79,7 @@ body { padding: 10px; border: 1px solid #ddd; border-radius: 4px; - font-size: 14px; + font-size: 16px; } .form-group input:focus, @@ -185,6 +185,70 @@ body { margin-top: 20px; } +/* Mobile responsive adjustments */ +@media (max-width: 768px) { + .dashboard-grid { + grid-template-columns: 1fr; + } + + .container { + padding: 10px; + } + + .card { + padding: 16px; + } + + .navbar { + padding: 12px 16px; + } + + .navbar h1 { + font-size: 18px; + } + + /* Make tables responsive */ + table { + width: 100%; + min-width: 600px; /* Ensure minimum width for readability */ + } + + .table-container { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + + /* Auth pages mobile adjustments */ + .auth-container { + flex-direction: column; + padding: 20px; + gap: 20px; + } + + .auth-card { + max-width: 100%; + padding: 24px; + } + + /* Welcome section mobile adjustments */ + .welcome-section { + max-width: 100% !important; + padding: 20px !important; + } + + .welcome-section h1 { + font-size: 1.8rem !important; + } + + /* Form grid mobile adjustments */ + @media (max-width: 768px) { + form[style*="grid-template-columns"] { + grid-template-columns: 1fr !important; + gap: 16px !important; + } + } +} + .status-badge { display: inline-block; padding: 4px 12px; @@ -255,7 +319,7 @@ body { padding: 8px; border: 1px solid #ddd; border-radius: 4px; - font-size: 14px; + font-size: 16px; color: #333; background-color: #fff; } diff --git a/frontend/src/pages/Dashboard.tsx b/frontend/src/pages/Dashboard.tsx index 6d88639..faddda8 100644 --- a/frontend/src/pages/Dashboard.tsx +++ b/frontend/src/pages/Dashboard.tsx @@ -301,30 +301,32 @@ const Dashboard: React.FC = () => {

Payment History

{payments.length > 0 ? ( - - - - - - - - - - - {payments.map(payment => ( - - - - - +
+
DateAmountMethodStatus
{payment.payment_date ? formatDate(payment.payment_date) : 'Pending'}£{payment.amount.toFixed(2)}{payment.payment_method} - - {payment.status.toUpperCase()} - -
+ + + + + + - ))} - -
DateAmountMethodStatus
+ + + {payments.map(payment => ( + + {payment.payment_date ? formatDate(payment.payment_date) : 'Pending'} + £{payment.amount.toFixed(2)} + {payment.payment_method} + + + {payment.status.toUpperCase()} + + + + ))} + + +
) : (

No payment history available.

)} @@ -339,41 +341,43 @@ const Dashboard: React.FC = () => { {allPayments.filter(p => p.status === 'pending').length > 0 && (

Pending Payments

- - - - - - - - - - - - {allPayments.filter(p => p.status === 'pending').map(payment => { - const membership = allMemberships.find(m => m.id === payment.membership_id); - return ( - - - - - - - - ); - })} - -
UserAmountMethodMembershipActions
{getUserName(payment.user_id)}£{payment.amount.toFixed(2)}{payment.payment_method} - {membership ? `${membership.tier.name} (${membership.status})` : 'N/A'} - - -
+
+ + + + + + + + + + + + {allPayments.filter(p => p.status === 'pending').map(payment => { + const membership = allMemberships.find(m => m.id === payment.membership_id); + return ( + + + + + + + + ); + })} + +
UserAmountMethodMembershipActions
{getUserName(payment.user_id)}£{payment.amount.toFixed(2)}{payment.payment_method} + {membership ? `${membership.tier.name} (${membership.status})` : 'N/A'} + + +
+
)} @@ -381,30 +385,32 @@ const Dashboard: React.FC = () => { {allMemberships.filter(m => m.status === 'pending').length > 0 && (

Pending Memberships

- - - - - - - - - - - {allMemberships.filter(m => m.status === 'pending').map(membership => ( - - - - - +
+
UserTierStart DateStatus
{getUserName(membership.user_id)}{membership.tier.name}{formatDate(membership.start_date)} - - {membership.status.toUpperCase()} - -
+ + + + + + - ))} - -
UserTierStart DateStatus
+ + + {allMemberships.filter(m => m.status === 'pending').map(membership => ( + + {getUserName(membership.user_id)} + {membership.tier.name} + {formatDate(membership.start_date)} + + + {membership.status.toUpperCase()} + + + + ))} + + +
)} @@ -437,78 +443,80 @@ const Dashboard: React.FC = () => { /> - - - - - - - - - - - - - {filteredUsers.map(u => ( - handleUserClick(u)} - > - - - - - - +
+
NameEmailRoleStatusJoinedActions
{u.first_name} {u.last_name}{u.email} - - {u.role.toUpperCase()} - - - - {u.is_active ? 'ACTIVE' : 'INACTIVE'} - - {formatDate(u.created_at)} - {u.role === 'member' && ( - - )} - {u.role === 'admin' && u.id !== user?.id && ( - - )} - {u.role === 'super_admin' && ( - Super Admin - )} -
+ + + + + + + + - ))} - -
NameEmailRoleStatusJoinedActions
+ + + {filteredUsers.map(u => ( + handleUserClick(u)} + > + {u.first_name} {u.last_name} + {u.email} + + + {u.role.toUpperCase()} + + + + + {u.is_active ? 'ACTIVE' : 'INACTIVE'} + + + {formatDate(u.created_at)} + + {u.role === 'member' && ( + + )} + {u.role === 'admin' && u.id !== user?.id && ( + + )} + {u.role === 'super_admin' && ( + Super Admin + )} + + + ))} + + + )} diff --git a/frontend/src/pages/Login.tsx b/frontend/src/pages/Login.tsx index 6a0f89b..c13ff59 100644 --- a/frontend/src/pages/Login.tsx +++ b/frontend/src/pages/Login.tsx @@ -43,7 +43,7 @@ const Login: React.FC = () => { }; return ( -
+