Wybór lokalizacji w zakładce „Zajęcia"
Zakładka Zajęcia pokazuje kalendarz zajęć uczestników zalogowanego konta. W mieście z dwiema lokalizacjami nie było jak powiedzieć, o którą chodzi — kalendarz mieszał oba adresy, a nagłówek strony milczał. Zmiana przenosi tu mechanizm znany z zakładki Rezerwacje.
👤 Instrukcja dla użytkownika
Przełącznik lokalizacji
W górnym pasku, obok wyboru miasta, pojawia się lista lokalizacji — ta sama, którą widać na zakładce Rezerwacje. Wybór zawęża kalendarz do zajęć odbywających się na kortach pod tym adresem.
Przełącznik pokazuje się tylko wtedy, gdy miasto ma więcej niż jedną lokalizację. Przy jednej lokalizacji nic się nie zmienia.
Kto co widzi:
- Klient — wybiera lokalizację, ale nie miasto: miasto pozostaje tym, które ma zapisane na koncie.
- Pracownik (recepcja, administrator, trener) — ma dodatkowo pozycję Wszystkie lokalizacje, która zdejmuje zawężenie, oraz wybór miasta ograniczony do konkretnych miast (bez „Wszystkie miasta" — kalendarz zawsze dotyczy jednego miasta).
Wybór jest zapamiętywany w adresie strony, więc odnośnik do zakładki Zajęcia niesie ze sobą lokalizację.
Klient nie ma pozycji „Wszystkie lokalizacje". Jeśli jego uczestnicy chodzą na zajęcia pod dwoma adresami w tym samym mieście, zobaczy naraz zajęcia tylko z jednego z nich i musi przełączyć lokalizację, żeby zobaczyć pozostałe.
Tytuł strony
Nagłówek zakładki podaje teraz miasto i — jeśli jest wybrana — lokalizację:
Zajęcia - Opole (ul. Spokojna)
Przy jednej lokalizacji w mieście nagłówek kończy się na mieście: Zajęcia - Opole.
Ten sam wzorzec ma zakładka Rezerwacje.
🔧 Dokumentacja techniczna
Pasek lokalizacji
Przełącznik pochodzi z components/layout/global-city-select-client.tsx —
jednego komponentu w nagłówku panelu, który sam decyduje, na których ścieżkach
się pokazać:
| Lista | Znaczenie | Dodano |
|---|---|---|
employeeStreetPaths | ścieżki z wyborem lokalizacji dla pracownika | /dashboard/user-activities |
clientStreetPaths | to samo dla klienta | /dashboard/user-activities |
limitedCityPathPrefixes | ścieżki bez pozycji „Wszystkie miasta", razem z podstronami | /dashboard/user-activities |
Dopasowanie idzie przez startsWith, więc obejmuje też
/dashboard/user-activities/[playerId]. Komponent dopisuje city i street do
adresu (router.push / router.replace), a strona czyta je z searchParams.
Wyboru miasta klient na tej zakładce nie dostaje — clientCityPaths nadal
zawiera samą zakładkę Rezerwacje.
Strona i zapytanie
app/(dashboard)/dashboard/user-activities/[playerId]/page.tsx:
const city =
searchParams.city && searchParams.city !== 'ALL'
? searchParams.city
: preferredCity;
const selectedStreet =
searchParams.street && searchParams.street !== 'ALL'
? searchParams.street
: undefined;
ALL jest wartownikiem paska lokalizacji („wszystkie"), nie nazwą ulicy — musi
dojść do zapytania jako brak filtra, bo jako ulica nie pasowałby do żadnego
kortu i kalendarz wyszedłby pusty.
getGamesByPlayerIdsAndCity (lib/actions/game.ts) przyjmuje opcję street
i dokłada jeden warunek do zapytania:
AND c.street = ?
Filtr działa na dołączonej już tabeli court, więc nie dochodzi ani jedno
zapytanie. Miasto i lokalizacja są przekazywane w dół przez
ResponsiveActivities do UserActivities, gdzie budują nagłówek h1
(userActivities.title + miasto + tennis.streetPrefix).
Czego zmiana nie obejmuje
Okna zapisów otwierane z tej zakładki (zajęcia próbne, zapis na grupę, trening indywidualny) dostają nadal samo miasto. Wybrana lokalizacja zawęża kalendarz, ale nie zawęża oferty w tych oknach.