Fix FAQFull: Use isDraft boolean for draft filtering, fix Kontakt ID override

This commit is contained in:
MichalC
2026-09-16 12:31:19 +02:00
parent 437e1e4823
commit 9043301da6
140 changed files with 23337 additions and 724 deletions
+132
View File
@@ -0,0 +1,132 @@
# Architektura i zmiany w CMS
Zgodnie z `fundamenty-projektu.md` i `standardy-kodu.md` — zmiany warstwowo:
co jest treścią (panel), co strukturą (Payload config), co kodem projektu.
Zero hardkodu — każda wartość poniżej ląduje w polu `localized`/`upload`/env,
zgodnie z `antigravity-zasady-agent.md` A1–A4.
---
## 1. Dane wejściowe od klienta (blokujące, zebrać przed dalszą pracą)
To jedyna sekcja tego planu, która nie jest decyzją projektową — to lista
pytań do Michała/klienta. Bez tego część planu z plików `02`–`09` zostaje na
placeholderach niezależnie od tego, jak dobrze zbudowany będzie kod.
| # | Dane | Gdzie trafia | Status w zipie |
|---|---|---|---|
| 1 | Realny adres biura | global `Company` | `"DO POTWIERDZENIA PRZEZ KLIENTA"` — dwie sprzeczne wersje w poprzednich ustaleniach (Böhlstraße 2 vs Bismarckstr. 112, Ludwigshafen), **wymaga jednoznacznej odpowiedzi klienta** |
| 2 | Realny telefon | global `Company` | placeholder `+49 123 456 789` |
| 3 | Realny e-mail | global `Company` | placeholder `[email protected]` |
| 4 | Numer WhatsApp (format `49XXXXXXXXX`, bez `+`/spacji) | global `Company.whatsappNumber` | placeholder `49123456789` |
| 5 | Zdjęcie Janusza (portret + kontekst pracy) | media, użyte w `hero`, `bio` | brak w paczce |
| 6 | Logo b.b.h. Lohnsteuerhilfeverein e.V. | media, użyte w `affiliation.logo`, `Footer.association.logo` | klient wg wcześniejszych ustaleń je posiada — brak w paczce, dostarczyć w wersji wektorowej/PNG na przezroczystym tle |
| 7 | Logo/marka własnej firmy Janusza (jeśli istnieje osobne od b.b.h.) | `site-settings.logo`, favicon | brak potwierdzenia czy istnieje |
| 8 | Forma prawna działalności, ew. Steuernummer/USt-IdNr. | strony prawne (Impressum) | nieustalone, patrz [09-strony-prawne.md](./09-strony-prawne.md) §1 |
| 9 | Czy istnieje formularz członkostwa/składka w ramach b.b.h. (dla treści strony Stowarzyszenie) | `/stowarzyszenie` | nieustalone, patrz [07-stowarzyszenie.md](./07-stowarzyszenie.md) §2 Sekcja D |
| 10 | Skala firmy: czy to tylko Janusz, czy zespół | blok `team` na `/o-nas` | dane pokazują 1 osobę — potwierdzić, nie zgadywać (patrz [05-o-nas.md](./05-o-nas.md)) |
| 11 | Aktualność progów `18 000 € / 36 000 €` i `§4 Nr. 11 StBerG` na bieżący rok podatkowy | blok `eligibility` | treść już jest, wymaga tylko potwierdzenia aktualności, nie przepisywania |
| 12 | Teksty bannera cookies PL/DE | global `Cookie Settings` w panelu | puste w bazie — renderuje się angielski fallback z pluginu, wymaga uzupełnienia |
---
## 2. Zmiany w blokach (Payload config + Component)
| Blok | Zmiana | Powód | Priorytet |
|---|---|---|---|
| `faqTeaser` → nowy `faqFull` (lub rozszerzenie configu istniejącego) | dodać pole grupowania `category` (opcjonalny text) w `questions[]`, wykorzystywane na `/faq`; `faqTeaser` na home zostaje bez zmian strukturalnych, tylko dodać `ctaText`/`ctaUrl` (wzorem `process`) do linkowania na pełne FAQ | patrz [06-faq.md](./06-faq.md) | P1 |
| `servicesList` | dodać pole `linkUrl` per usługa (obecnie tylko `linkText` bez celu linku) | naprawia martwe „Zobacz więcej" na home, patrz [02-strona-glowna.md](./02-strona-glowna.md) §5 | P1 |
| `affiliation` | wypełnić `trustPoints[]` (pole już istnieje w schemacie, obecnie puste `[]`) i `logo` | patrz [02-strona-glowna.md](./02-strona-glowna.md) §7 | P1 |
| `Team/Component.tsx` | dodać warunek: gdy `members.length === 1`, renderować pojedynczą kartę bez siatki grid (albo pominąć render bloku całkowicie — decyzja klienta, patrz [05-o-nas.md](./05-o-nas.md) §3) | unika redundancji z `bio` | P2 |
| `hero` | dodać `id` do sekcji `process` na home (`id="jak-to-dziala"`), żeby `secondaryCta.url` z hero (`#jak-to-dziala`) faktycznie trafiał gdzieś | martwy kotwica-link, błąd funkcjonalny | P1 |
| `TextSection` (Impressum/Datenschutz/Cookies/Stowarzyszenie/FAQ dziś) | upewnić się, że pole `text` to `richText`, nie zwykły `textarea` — długie strony prawne potrzebują list, nagłówków, linków w treści, nie jednego bloku tekstu | wymóg funkcjonalny dla treści z [07](./07-stowarzyszenie.md) i [09](./09-strony-prawne.md) | P1 |
**Nowy blok do rozważenia (faza 2, nie blokuje startu):** `VideoSection`
— patrz [02-strona-glowna.md](./02-strona-glowna.md) §11.
**Nowy element UI (nie blok CMS, komponent globalny):** floating WhatsApp
button — patrz [02-strona-glowna.md](./02-strona-glowna.md) §0. Dane
(`whatsappNumber`) już istnieją w globalu `Company` — tylko brakuje
komponentu w `layout.tsx`.
---
## 3. Media — kolekcja i pipeline
- `Media.ts` ma już `normalizeFilenameHook` (zgodnie ze standardem) — bez zmian.
- **Brak wariantów rozmiarów (`imageSizes`)** w przejrzanym configu —
do dodania zgodnie z `wymagania-projektowe-strony.md` §6 (P1: „Warianty
rozmiarowe generowane przy uploadzie w Payload (sharp)"). Bez tego każde
zdjęcie (hero, bio, process) ląduje w pełnej rozdzielczości na każdym
urządzeniu — bezpośrednio uderza w LCP (cel < 2,5s), patrz
[11-integracje-seo-wydajnosc.md](./11-integracje-seo-wydajnosc.md) §5.
- Format: AVIF/WebP w `next.config` (`formats: ['image/avif','image/webp']`)
— sprawdzić, czy już ustawione.
- Favicon: **brak w danych** (`site-settings.favicon: null`) — wgrać przez
panel, renderować przez `buildIconsMetadata` z pluginu (NIGDY ręcznie w
`<head>`, zgodnie z antywzorcem #favicon w `standardy-kodu.md` §6).
---
## 4. System Pages — role nieprzypisane
`site-settings.privacyPolicy`, `.cookiePolicy`, `.termsOfService` = `null` dla
obu języków. Bez tego `getSystemPagePath` (używane przez baner cookies,
stopkę, formularze) nie ma czego zwrócić — linki do polityk będą albo martwe,
albo (gorzej) zahardkodowane jako `/pl/polityka-prywatnosci` w obejściu, co
łamie zasadę A3 z `antigravity-zasady-agent.md`.
**Do zrobienia w panelu (nie w kodzie):** Site Settings → System Pages →
przypisać:
- `homepage` → już ustawione (page 1) ✓
- `privacyPolicy` → page 8 (Polityka prywatności / Datenschutzerklärung)
- `cookiePolicy` → page 9 (Polityka cookies / Cookie-Richtlinie)
- `termsOfService` → **brak strony regulaminu w ogóle w obecnej mapie stron**
— do decyzji: czy przy modelu „wizytówka + WhatsApp" (bez zamawiania usług
online, bez kont użytkowników) regulamin jest w ogóle wymagany. Wg
`wymagania-prawne.md` checklist: „Regulamin — jeśli strona świadczy usługi
/ sprzedaż / konta" — tu formalnie świadczona jest usługa doradztwa, więc
**rekomendacja: dodać krótki regulamin świadczenia usługi drogą
elektroniczną (zakres: korzystanie z formularza kontaktowego/WhatsApp,
nie regulamin sklepu)**, konsultowany z prawnikiem klienta, jako 11. strona.
Impressum ma częściowo tę rolę po stronie niemieckiej, ale nie zastępuje
polskiego wymogu regulaminu usług elektronicznych po stronie PL.
Satzung/Beitragsordnung (statut i regulamin składek b.b.h., wzorem bbh) — **nie
dotyczą tej strony**: to dokumenty SAMEGO stowarzyszenia b.b.h., nie firmy
Janusza. Jeśli mają się pojawić, to jako link zewnętrzny do
`bbh-lohnsteuerhilfe.de/satzung` w obrębie strony Stowarzyszenie ([07](./07-stowarzyszenie.md)),
nie jako własne strony w tym repo.
---
## 5. Nawigacja — Header/Footer
Obecna nawigacja header (5 pozycji: Usługi, Jak się umówić, O nas, kotwica
FAQ, Kontakt) pomija bezpośredni link do `/stowarzyszenie` — do rozważenia,
czy dodać do głównego menu, czy zostawić jako link wtórny (z bloku
`affiliation` + stopki, gdzie już jest). Rekomendacja: **zostawić poza
głównym menu** — to strona uzupełniająca, nie ścieżka konwersji; upychanie
jej w header rozmywa priorytet (Usługi → Jak się umówić → Kontakt to
właściwa ścieżka do WhatsApp, nie przeciążać nawigacji).
Stopka (`Footer.navigation`) linkuje już do stron 2,3,4,6,8,9,10 — brakuje
FAQ (5) i Stowarzyszenie (7) w liście stopki, mimo że istnieją jako strony —
**dodać oba do nawigacji stopki**, żeby były osiągalne bez polegania
wyłącznie na kotwicach/linkach kontekstowych.
---
## 6. Porządki w repo (drobne, ale wpływają na jakość odbioru)
- `src/app/(frontend)/styles.css` — domyślny boilerplate Payloada
(`background: rgb(0,0,0)`, `font-family: system-ui`), realny design system
żyje w `globals.css` przez Tailwind `@theme`. Zweryfikować, czy plik jest
w ogóle importowany; jeśli nie — usunąć, żeby nie mylić przyszłych sesji
co do „gdzie są prawdziwe tokeny" (zgodnie z zasadą jednego źródła prawdy,
`standardy-kodu.md` §2.2).
- `scripts/update_*.py`, `scripts/fix_*.ts` w repo — robocze skrypty
migracyjne z wcześniejszych sesji; jeśli zadania już wykonane i nieaktualne,
rozważyć przeniesienie do `scripts/archive/` albo usunięcie, żeby nie
myliły co do aktualnego sposobu edycji treści (treść edytuje się przez
panel, nie przez skrypty — `architektura-tresci.md`).