Przejdź do głównej zawartości

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ę.

uwaga

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ć:

ListaZnaczenieDodano
employeeStreetPathsścieżki z wyborem lokalizacji dla pracownika/dashboard/user-activities
clientStreetPathsto 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.