diff --git a/dictionaries/en.json b/dictionaries/en.json
index 01af7b5..ca68bf0 100644
--- a/dictionaries/en.json
+++ b/dictionaries/en.json
@@ -836,5 +836,35 @@
"swap request": "swap request",
"Waiting for": "Waiting for",
"approval(s)": "approval(s)",
- "All approved": "All approved"
+ "All approved": "All approved",
+ "Club Management": "Club Management",
+ "View and manage your venue locations": "View and manage your venue locations",
+ "Clubs": "Clubs",
+ "Coming soon": "Coming soon",
+ "Schedules": "Schedules",
+ "Bookings": "Bookings",
+ "Loading clubs...": "Loading clubs...",
+ "Error Loading Clubs": "Error Loading Clubs",
+ "Error code": "Error code",
+ "No Clubs Assigned": "No Clubs Assigned",
+ "You are not currently assigned as an administrator for any clubs. Contact your organization to request access.": "You are not currently assigned as an administrator for any clubs. Contact your organization to request access.",
+ "Courts": "Courts",
+ "Loading club details...": "Loading club details...",
+ "Access Denied": "Access Denied",
+ "Back to clubs": "Back to clubs",
+ "Error Loading Club": "Error Loading Club",
+ "Provider Information": "Provider Information",
+ "Type": "Type",
+ "Manages Slot Storage": "Manages Slot Storage",
+ "Supports Payment Verification": "Supports Payment Verification",
+ "No courts configured": "No courts configured",
+ "Slot Definitions": "Slot Definitions",
+ "No slot definitions configured": "No slot definitions configured",
+ "Slot definition": "Slot definition",
+ "Upcoming Slots": "Upcoming Slots",
+ "No upcoming slots available": "No upcoming slots available",
+ "Checking authentication...": "Checking authentication...",
+ "Redirecting to login...": "Redirecting to login...",
+ "Please log in to access the venue management portal.": "Please log in to access the venue management portal.",
+ "If you are a venue administrator and do not have access, please contact support.": "If you are a venue administrator and do not have access, please contact support."
}
diff --git a/src/app/[locale]/admin/clubs/AdminClubsList.tsx b/src/app/[locale]/admin/clubs/AdminClubsList.tsx
index d754fb6..24fce3b 100644
--- a/src/app/[locale]/admin/clubs/AdminClubsList.tsx
+++ b/src/app/[locale]/admin/clubs/AdminClubsList.tsx
@@ -35,10 +35,10 @@ export default function AdminClubsList() {
// Loading state
if (loading) {
return (
-
+
-
-
{t('Loading clubs...')}
+
+
{t('Loading clubs...')}
);
@@ -47,19 +47,19 @@ export default function AdminClubsList() {
// Authentication error (401)
if (error && error.status === 401) {
return (
-
+
-
+
-
+
-
+
{t('Authentication Required')}
-
+
{t('Please log in to access the venue management portal.')}
-
+
{t('If you are a venue administrator and do not have access, please contact support.')}
@@ -73,19 +73,19 @@ export default function AdminClubsList() {
// Other API errors
if (error) {
return (
-
+
-
+
-
+
{t('Error Loading Clubs')}
-
+
{error.detail}
-
+
{t('Error code')}: {error.code}
@@ -99,23 +99,23 @@ export default function AdminClubsList() {
// No clubs assigned
if (!clubs || clubs.length === 0) {
return (
-
+
-
+
{t('Club Management')}
-
+
{t('View and manage your venue locations')}
-
-
-
-
+
+
+
+
{t('No Clubs Assigned')}
-
+
{t('You are not currently assigned as an administrator for any clubs. Contact your organization to request access.')}
@@ -126,12 +126,12 @@ export default function AdminClubsList() {
// Success - render clubs list
return (
-
-
-
+
+
+
{t('Club Management')}
-
+
{t('View and manage your venue locations')}
@@ -141,27 +141,27 @@ export default function AdminClubsList() {
-
-
-
-
+
+
+
+
-
+
{club.name}
-
+
{club.timezone}
-
-
-
{t('Courts')}
-
{club.courts}
+
+
+ {t('Courts')}
+ {club.courts}
diff --git a/src/app/[locale]/admin/clubs/[club_id]/AdminClubDetail.tsx b/src/app/[locale]/admin/clubs/[club_id]/AdminClubDetail.tsx
index 27aa527..9e8140f 100644
--- a/src/app/[locale]/admin/clubs/[club_id]/AdminClubDetail.tsx
+++ b/src/app/[locale]/admin/clubs/[club_id]/AdminClubDetail.tsx
@@ -39,10 +39,10 @@ export default function AdminClubDetailComponent({ clubId }: AdminClubDetailProp
// Loading state
if (loading) {
return (
-
+
-
-
{t('Loading club details...')}
+
+
{t('Loading club details...')}
);
@@ -51,16 +51,16 @@ export default function AdminClubDetailComponent({ clubId }: AdminClubDetailProp
// Authentication error (401)
if (error && error.status === 401) {
return (
-
+
-
+
-
+
-
+
{t('Authentication Required')}
-
+
{t('Please log in to access the venue management portal.')}
@@ -74,21 +74,21 @@ export default function AdminClubDetailComponent({ clubId }: AdminClubDetailProp
// Forbidden error (403)
if (error && error.status === 403) {
return (
-
+
-
+
-
+
{t('Access Denied')}
-
+
{error.detail}
{t('Back to clubs')}
@@ -104,24 +104,24 @@ export default function AdminClubDetailComponent({ clubId }: AdminClubDetailProp
// Other API errors
if (error) {
return (
-
+
-
+
-
-
+
+
{t('Error Loading Club')}
-
+
{error.detail}
-
+
{t('Error code')}: {error.code}
{t('Back to clubs')}
@@ -140,12 +140,12 @@ export default function AdminClubDetailComponent({ clubId }: AdminClubDetailProp
// Success - render club detail
return (
-
+
{/* Breadcrumb */}
-
+
{t('Back to clubs')}
@@ -153,45 +153,43 @@ export default function AdminClubDetailComponent({ clubId }: AdminClubDetailProp
{/* Club Header */}
-
-
-
-
+
+
+
+
-
+
{clubDetail.club.name}
-
-
-
- {clubDetail.club.timezone}
-
+
+
+ {clubDetail.club.timezone}
{/* Provider Info */}
-
-
-
-
{t('Provider Information')}
+
+
+
+
{t('Provider Information')}
-
-
-
{t('Type')}:
-
{clubDetail.provider.remote_type}
+
+
+ {t('Type')}:
+ {clubDetail.provider.remote_type}
-
-
{t('Manages Slot Storage')}:
-
+
+ {t('Manages Slot Storage')}:
+
{clubDetail.provider.capabilities.manages_slot_storage ? t('Yes') : t('No')}
-
-
{t('Supports Payment Verification')}:
-
+
+ {t('Supports Payment Verification')}:
+
{clubDetail.provider.capabilities.supports_payment_verification ? t('Yes') : t('No')}
@@ -199,18 +197,18 @@ export default function AdminClubDetailComponent({ clubId }: AdminClubDetailProp
{/* Courts */}
-
-
{t('Courts')}
+
+
{t('Courts')}
{clubDetail.courts.length === 0 ? (
-
{t('No courts configured')}
+
{t('No courts configured')}
) : (
{clubDetail.courts.map((court) => (
-
{court.name}
+
{court.name}
))}
@@ -218,21 +216,21 @@ export default function AdminClubDetailComponent({ clubId }: AdminClubDetailProp
{/* Slot Definitions */}
-
-
-
-
{t('Slot Definitions')}
+
+
+
+
{t('Slot Definitions')}
{clubDetail.slot_definitions.length === 0 ? (
-
{t('No slot definitions configured')}
+
{t('No slot definitions configured')}
) : (
{clubDetail.slot_definitions.map((slotDef, index) => (
-
{t('Slot definition')} #{index + 1}
+
{t('Slot definition')} #{index + 1}
))}
@@ -240,18 +238,18 @@ export default function AdminClubDetailComponent({ clubId }: AdminClubDetailProp
{/* Upcoming Slots */}
-
-
{t('Upcoming Slots')}
+
+
{t('Upcoming Slots')}
{clubDetail.upcoming_slots.length === 0 ? (
-
{t('No upcoming slots available')}
+
{t('No upcoming slots available')}
) : (
{clubDetail.upcoming_slots.map((slot, index) => (
-
{t('Slot')} #{index + 1}
+
{t('Slot')} #{index + 1}
))}
diff --git a/src/app/[locale]/layout.tsx b/src/app/[locale]/layout.tsx
index bf07ef9..b075000 100644
--- a/src/app/[locale]/layout.tsx
+++ b/src/app/[locale]/layout.tsx
@@ -26,20 +26,20 @@ export default async function RootLayout({
return (
-
+
{children}
-
+
-
+
{t('© 2024 Playchoo Manager. Venue administration portal.')}
-
+
v{process.env.NEXT_PUBLIC_APP_VERSION}
diff --git a/src/components/AdminAuthGuard.tsx b/src/components/AdminAuthGuard.tsx
index 871c89e..56eb026 100644
--- a/src/components/AdminAuthGuard.tsx
+++ b/src/components/AdminAuthGuard.tsx
@@ -34,9 +34,9 @@ export default function AdminAuthGuard({ children }: AdminAuthGuardProps) {
// Show loading state while checking auth
if (loading) {
return (
-
-
-
{t('Checking authentication...')}
+
+
+
{t('Checking authentication...')}
);
}
@@ -44,9 +44,9 @@ export default function AdminAuthGuard({ children }: AdminAuthGuardProps) {
// Show loading state while redirecting
if (!user) {
return (
-
-
-
{t('Redirecting to login...')}
+
+
+
{t('Redirecting to login...')}
);
}
diff --git a/src/components/Navigation.tsx b/src/components/Navigation.tsx
index eb040b3..21a8a0a 100644
--- a/src/components/Navigation.tsx
+++ b/src/components/Navigation.tsx
@@ -169,21 +169,21 @@ export default function Navigation({ pageTitle }: NavigationProps) {
return (
<>
-
+
{/* Logo */}
{pageTitle && (
-
{pageTitle}
+
{pageTitle}
)}
@@ -195,13 +195,13 @@ export default function Navigation({ pageTitle }: NavigationProps) {
<>
login()}
- className="px-4 py-2 text-sm font-medium text-gray-700 hover:text-indigo-600 transition-colors duration-200"
+ className="px-4 py-2 text-sm font-medium text-slate-700 hover:text-slate-900 transition-colors duration-200"
>
{t('Login')}
login()}
- className="px-4 py-2 text-sm font-medium bg-gradient-to-r from-indigo-600 to-purple-600 text-white rounded-lg hover:from-indigo-700 hover:to-purple-700 transform hover:scale-105 transition-all duration-200 shadow-lg hover:shadow-xl"
+ className="px-4 py-2 text-sm font-medium bg-slate-900 text-white rounded-lg hover:bg-slate-800 transform hover:scale-105 transition-all duration-200 shadow-lg hover:shadow-xl"
>
{t('Register')}
@@ -211,7 +211,7 @@ export default function Navigation({ pageTitle }: NavigationProps) {
{/* Hamburger menu button - always visible on mobile, only for logged-in users on desktop */}
{isMenuOpen ? : }
-
@@ -250,7 +249,7 @@ export default function Navigation({ pageTitle }: NavigationProps) {
>
{/* Header */}
-
+
{isLoggedIn && appUser && currentUserData ? (
-
+
{currentUserData.initials}
-
+
{currentUserData.name}
-
{t('View Profile')}
+
{t('View Profile')}
) : (
-
{t('Menu')}
-
{t('Navigate your game')}
+
{t('Menu')}
+
{t('Navigate your game')}
)}
@@ -295,12 +294,12 @@ export default function Navigation({ pageTitle }: NavigationProps) {
>
{ login(); closeMenu(); }}
- className="flex items-center space-x-3 p-4 rounded-xl hover:bg-gray-50 transition-colors duration-200 group w-full"
+ className="flex items-center space-x-3 p-4 rounded-xl hover:bg-slate-50 transition-colors duration-200 group w-full"
>
-
-
+
+
-
{t('Login')}
+
{t('Login')}
@@ -312,12 +311,12 @@ export default function Navigation({ pageTitle }: NavigationProps) {
>
{ login(); closeMenu(); }}
- className="flex items-center space-x-3 p-4 rounded-xl hover:bg-gray-50 transition-colors duration-200 group w-full"
+ className="flex items-center space-x-3 p-4 rounded-xl hover:bg-slate-50 transition-colors duration-200 group w-full"
>
-
-
+
+
-
{t('Register')}
+
{t('Register')}
>
@@ -332,12 +331,12 @@ export default function Navigation({ pageTitle }: NavigationProps) {
-
-
+
+
-
{t('Dashboard')}
+
{t('Dashboard')}
@@ -354,17 +353,17 @@ export default function Navigation({ pageTitle }: NavigationProps) {
router.push(bookingLink);
}, 100);
}}
- className="w-full flex items-center space-x-3 p-4 rounded-xl hover:bg-gray-50 transition-colors duration-200 group text-left"
+ className="w-full flex items-center space-x-3 p-4 rounded-xl hover:bg-slate-50 transition-colors duration-200 group text-left"
>
-
-
+
+
-
{t('Booking')}
+
{t('Booking')}
{/* Divider */}
-
+
-
-
+
+
-
{t('Player Lookup')}
+
{t('Player Lookup')}
@@ -402,20 +401,20 @@ export default function Navigation({ pageTitle }: NavigationProps) {
-
-
+
+
-
{t("What's my level?")}
+
{t("What's my level?")}
>
)}
{/* Language Selector - Available for all users */}
-
-
+
+
-
- {t('Language')}
+
+ {t('Language')}
{languages.find(l => l.code === locale)?.flag}
- {languages.find(l => l.code === locale)?.label}
-
+ {languages.find(l => l.code === locale)?.label}
+
-
+
{/* Language Dropdown Options */}
{isLanguageDropdownOpen && (
@@ -458,7 +457,7 @@ export default function Navigation({ pageTitle }: NavigationProps) {
setIsLanguageDropdownOpen(false);
closeMenu();
}}
- className="w-full flex items-center space-x-3 px-3 py-2 rounded-lg hover:bg-gray-100 text-gray-700 transition-colors duration-200"
+ className="w-full flex items-center space-x-3 px-3 py-2 rounded-lg hover:bg-slate-100 text-slate-700 transition-colors duration-200"
>
{lang.flag}
{lang.label}
@@ -473,7 +472,7 @@ export default function Navigation({ pageTitle }: NavigationProps) {
{/* Footer */}
-
+
{isLoggedIn && (
-
+
)}
-
+
Version {process.env.NEXT_PUBLIC_APP_VERSION}
-
+
{t('Powered by passion')}