Kontakt
Haben Sie Fragen zu Ihrer Steuererklärung in Deutschland? Kontaktieren Sie uns — wir helfen Ihnen gerne.
Kontaktinformationen
Adresse
Vom Kunden zu bestätigen
Telefon
Öffnungszeiten
Mo-Fr: 9:00 - 17:00 +Nach vorheriger Terminvereinbarung
From ab4c5c83dd084dcff426dc7b6e11592404e5ccf3 Mon Sep 17 00:00:00 2001
From: MichalC <103170279+wSBMichalee@users.noreply.github.com>
Date: Thu, 17 Sep 2026 22:25:25 +0200
Subject: [PATCH] fix: resolve contact form placeholders, restore process block
layout, and fix testimonials carousel scroll logic
---
.agents/context/operations.md | 11 +
audit_results.txt | 45 +++
de_kontakt_form_grep.txt | 2 +
detect_dark_de.json | 403 ++++++++++++++++++++++
detect_dark_hero.json | 43 +++
detect_de.json | 22 --
detect_pl.json | 32 --
detect_pl_faq.json | 10 -
detect_pl_faq_final.json | 12 +
detect_pl_faq_new.json | 12 +
detect_pl_impressum.json | 12 +
detect_pl_jak-sie-umowic.json | 42 +++
detect_pl_jak-sie-umowic_final.json | 22 ++
detect_pl_kontakt.json | 42 +++
detect_pl_kontakt_final.json | 12 +
detect_pl_kontakt_new.json | 32 ++
detect_pl_o-nas.json | 122 +++++++
detect_pl_o-nas_final.json | 102 ++++++
detect_pl_polityka-prywatnosci.json | 12 +
detect_pl_uslugi.json | 46 +--
detect_pl_uslugi_final.json | 52 +++
detect_team_dark.json | 92 +++++
detect_team_light.json | 102 ++++++
package.json | 10 +-
pl_kontakt_form_grep.txt | 2 +
pnpm-lock.yaml | 211 +++++------
prompts/10-architektura-cms.md | 2 +
scripts/audit_translations.ts | 117 +++++++
scripts/check_arrays.ts | 37 ++
scripts/check_forms.ts | 12 +
scripts/check_options.js | 24 ++
scripts/dump_form.ts | 47 +++
scripts/dump_process.ts | 31 ++
scripts/dump_process_de.ts | 20 ++
scripts/dump_proof.ts | 43 +++
scripts/fix_de_team.ts | 61 ++++
scripts/fix_de_translations.ts | 114 ++++++
scripts/fix_kontakt_layout.ts | 61 ++++
scripts/fix_minimal.ts | 31 ++
scripts/fix_translations_properly.ts | 92 +++++
scripts/form_dump.txt | 88 +++++
scripts/form_dump_final.txt | 95 +++++
scripts/form_dump_fixed.txt | 88 +++++
scripts/form_dump_placeholders.txt | 95 +++++
scripts/form_dump_placeholders2.txt | 95 +++++
scripts/get_kontakt.ts | 57 +++
scripts/inspect_db.ts | 15 +
scripts/inspect_de.ts | 12 +
scripts/kontakt_dump.txt | 0
scripts/kontakt_dump_after.txt | 369 ++++++++++++++++++++
scripts/migrate_services_anchors.ts | 111 ++++++
scripts/restore_jak_sie_umowic.ts | 93 +++++
scripts/restore_kontakt.ts | 86 -----
scripts/restore_services.ts | 59 ++++
scripts/seed_test_form.ts | 92 +++++
scripts/test_dump_emails.ts | 16 +
scripts/test_links.ts | 70 ++++
scripts/test_payload_create.ts | 31 ++
scripts/test_slugs.ts | 9 +
scripts/test_submission.ts | 38 ++
scripts/test_submit.ts | 41 +++
scripts/test_titles.ts | 22 ++
scripts/test_uslugi_integrity.ts | 26 ++
scripts/test_validation.ts | 61 ++++
scripts/update_contact_form.ts | 124 +++++++
scripts/update_log.txt | 64 ++++
scripts/validation_proof.txt | 13 +
scripts/verify_header_footer.ts | 30 ++
scripts/verify_kontakt_db.ts | 25 +-
scripts/verify_layout.ts | 10 +
scripts/verify_translations_final.ts | 27 ++
src/app/(frontend)/[locale]/layout.tsx | 2 +-
src/blocks/ContactInfo/Component.tsx | 2 +-
src/blocks/ContactSection/Client.tsx | 127 +++++++
src/blocks/ContactSection/Component.tsx | 23 ++
src/blocks/ContactSection/config.ts | 43 +++
src/blocks/RenderBlocks.tsx | 2 +
src/blocks/ServicesDetailed/Component.tsx | 1 +
src/blocks/ServicesDetailed/config.ts | 2 +
src/blocks/Team/config.ts | 6 +-
src/blocks/Testimonials/Carousel.tsx | 53 ++-
src/collections/Pages.ts | 2 +
src/components/Consent/index.tsx | 2 +
src/components/FloatingWhatsApp/index.tsx | 3 +-
src/components/FormRenderer/actions.ts | 43 +++
src/components/FormRenderer/client.tsx | 173 ++++++++++
src/components/FormRenderer/index.tsx | 30 ++
src/components/Header/index.tsx | 8 +-
src/payload-types.ts | 385 +++++++++++++++++++++
src/payload.config.ts | 14 +-
take_screenshot.mjs | 29 ++
91 files changed, 4790 insertions(+), 319 deletions(-)
create mode 100644 audit_results.txt
create mode 100644 de_kontakt_form_grep.txt
create mode 100644 detect_dark_de.json
create mode 100644 detect_dark_hero.json
create mode 100644 detect_pl_faq_final.json
create mode 100644 detect_pl_faq_new.json
create mode 100644 detect_pl_impressum.json
create mode 100644 detect_pl_jak-sie-umowic.json
create mode 100644 detect_pl_jak-sie-umowic_final.json
create mode 100644 detect_pl_kontakt.json
create mode 100644 detect_pl_kontakt_final.json
create mode 100644 detect_pl_kontakt_new.json
create mode 100644 detect_pl_o-nas.json
create mode 100644 detect_pl_o-nas_final.json
create mode 100644 detect_pl_polityka-prywatnosci.json
create mode 100644 detect_pl_uslugi_final.json
create mode 100644 detect_team_dark.json
create mode 100644 detect_team_light.json
create mode 100644 pl_kontakt_form_grep.txt
create mode 100644 scripts/audit_translations.ts
create mode 100644 scripts/check_arrays.ts
create mode 100644 scripts/check_forms.ts
create mode 100644 scripts/check_options.js
create mode 100644 scripts/dump_form.ts
create mode 100644 scripts/dump_process.ts
create mode 100644 scripts/dump_process_de.ts
create mode 100644 scripts/dump_proof.ts
create mode 100644 scripts/fix_de_team.ts
create mode 100644 scripts/fix_de_translations.ts
create mode 100644 scripts/fix_kontakt_layout.ts
create mode 100644 scripts/fix_minimal.ts
create mode 100644 scripts/fix_translations_properly.ts
create mode 100644 scripts/form_dump.txt
create mode 100644 scripts/form_dump_final.txt
create mode 100644 scripts/form_dump_fixed.txt
create mode 100644 scripts/form_dump_placeholders.txt
create mode 100644 scripts/form_dump_placeholders2.txt
create mode 100644 scripts/get_kontakt.ts
create mode 100644 scripts/inspect_db.ts
create mode 100644 scripts/inspect_de.ts
create mode 100644 scripts/kontakt_dump.txt
create mode 100644 scripts/kontakt_dump_after.txt
create mode 100644 scripts/migrate_services_anchors.ts
create mode 100644 scripts/restore_jak_sie_umowic.ts
delete mode 100644 scripts/restore_kontakt.ts
create mode 100644 scripts/restore_services.ts
create mode 100644 scripts/seed_test_form.ts
create mode 100644 scripts/test_dump_emails.ts
create mode 100644 scripts/test_links.ts
create mode 100644 scripts/test_payload_create.ts
create mode 100644 scripts/test_slugs.ts
create mode 100644 scripts/test_submission.ts
create mode 100644 scripts/test_submit.ts
create mode 100644 scripts/test_titles.ts
create mode 100644 scripts/test_uslugi_integrity.ts
create mode 100644 scripts/test_validation.ts
create mode 100644 scripts/update_contact_form.ts
create mode 100644 scripts/update_log.txt
create mode 100644 scripts/validation_proof.txt
create mode 100644 scripts/verify_header_footer.ts
create mode 100644 scripts/verify_layout.ts
create mode 100644 scripts/verify_translations_final.ts
create mode 100644 src/blocks/ContactSection/Client.tsx
create mode 100644 src/blocks/ContactSection/Component.tsx
create mode 100644 src/blocks/ContactSection/config.ts
create mode 100644 src/components/Consent/index.tsx
create mode 100644 src/components/FormRenderer/actions.ts
create mode 100644 src/components/FormRenderer/client.tsx
create mode 100644 src/components/FormRenderer/index.tsx
create mode 100644 take_screenshot.mjs
diff --git a/.agents/context/operations.md b/.agents/context/operations.md
index 2ec2372..540d7e6 100644
--- a/.agents/context/operations.md
+++ b/.agents/context/operations.md
@@ -15,6 +15,13 @@ Jeśli błąd się powtórzy, upewnij się, że nie działają inne ukryte proce
W przeszłości wadliwe skrypty (np. wczesna wersja `migrate_faq.ts`) przypisały do tej strony cudze bloki, co spowodowało całkowite nadpisanie układu (usunięcie `pageHeader` i `contactInfo`), a następnie skrypt "naprawczy" (`fix_kontakt.ts`) wyczyścił ten uszkodzony layout, zostawiając stronę z `layout: []` we wszystkich językach.
Zawsze sprawdzaj, czy modyfikując lub filtrując tablicę bloków dla jednej konkretnej strony (np. FAQ o ID 6), nie nadpisujesz omyłkowo strony sąsiedniej (np. Kontakt o ID 5).
+## Bezpieczeństwo Skryptów Migracyjnych (Zasada Punktowych Modyfikacji Layoutu)
+
+**Zasada Ogólna:** Skrypty migracyjne modyfikujące `layout` strony MAJĄ czytać istniejącą tablicę i zmieniać/dopisywać punktowo — nigdy nie nadpisywać całej tablicy stałą wartością z pliku źródłowego typu `content-snapshot.json`, który mógł się zdezaktualizować od czasu utworzenia.
+To dotyczy wszystkich stron, by uniknąć incydentów, gdzie przywracana zawartość ze snapshotu cicho nadpisuje i usuwa nowo wypracowane bloki (np. usunięcie gotowego formularza `contactSection` przez stary `contactInfo`).
+
+**Zasada Ochrony Wewnętrznych ID:** Skrypty migracyjne modyfikujące bloki w Payloadzie (szczególnie pola typu `layout` lub `blocks` z wewnętrznymi tablicami np. `steps`) NIGDY nie mogą używać funkcji rekurencyjnie usuwających `id` (takich jak `deepStripIds`) przed wysłaniem danych przez `payload.update()`. Payload CMS bezwzględnie usunie wewnętrzne elementy tablic bloków (np. kroki na osi czasu), jeśli zostaną zaktualizowane bez ich oryginalnych `id`. Zamiast kopiować i "czyścić" całe tablice bloków, należy wyciągnąć konkretny blok, zmienić w nim tylko potrzebne pola i zostawić resztę struktury i wszystkie oryginalne `id` nienaruszone.
+
## Protokół Testowy: Hero i PageHeader (Responsywność i Motywy) - ZAKOŃCZONY
### Rozwiązanie "Pustego Czarnego Obszaru"
@@ -36,3 +43,7 @@ Macierz wynikowa:
10. `/de/uber-uns` (PageHeader) - Light: OK | Dark: OK
Brak błędów na jakiejkolwiek stronie. Tło widoczne. Text-occlusion: wyeliminowane. Kontrast > 4.5:1.
+
+### Ograniczenia pluginów i długu technicznego
+
+- **Formularz kontaktowy i pole Select**: Form-builder z `ipal-kit` wspiera pola `select`, ale opcje po zapisie są statyczne. Aktualna lista 7 usług została wygenerowana ze źródła (bloki `ServicesDetailed` na stronach) za pomocą jednorazowego skryptu migracyjnego, jednak nie ma mechanizmu stałej autosynchronizacji, ponieważ usługi są zdefiniowane jako bloki na stronie, a nie osobna kolekcja w bazie. **Uwaga dla redaktora/administratora:** Ten stan nadal wymaga pamięci operacyjnej — jeśli w przyszłości na stronie dodana zostanie nowa, 8. usługa, trzeba pamiętać, aby RĘCZNIE dodać ją również jako opcję w formularzu kontaktowym w panelu CMS (albo ponownie uruchomić skrypt aktualizujący).
diff --git a/audit_results.txt b/audit_results.txt
new file mode 100644
index 0000000..ff5812c
--- /dev/null
+++ b/audit_results.txt
@@ -0,0 +1,45 @@
+[PODEJRZANY DUPLIKAT] Page(home).layout[3].items[1].stat | PL: "100%" | DE: "100%"
+[PODEJRZANY DUPLIKAT] Page(home).layout[3].items[2].stat | PL: "§4 Nr. 11" | DE: "§4 Nr. 11"
+[PODEJRZANY DUPLIKAT] Page(home).layout[7].testimonials[1].author | PL: "Anna, Berlin" | DE: "Anna, Berlin"
+[PODEJRZANY DUPLIKAT] Page(home).layout[7].testimonials[2].author | PL: "Krzysztof, Dortmund" | DE: "Krzysztof, Dortmund"
+[PODEJRZANY DUPLIKAT] Page(home).layout[9].eyebrow | PL: "Kontakt" | DE: "Kontakt"
+[PODEJRZANY DUPLIKAT] Page(uslugi).layout[3].eyebrow | PL: "Kontakt" | DE: "Kontakt"
+[PODEJRZANY DUPLIKAT] Page(jak-sie-umowic).layout[2].address | PL: "DO POTWIERDZENIA PRZEZ KLIENTA" | DE: "DO POTWIERDZENIA PRZEZ KLIENTA"
+[PODEJRZANY DUPLIKAT] Page(o-nas).layout[1].title | PL: "Janusz Kędzierski" | DE: "Janusz Kędzierski"
+[PODEJRZANY DUPLIKAT] Page(faq).title | PL: "FAQ" | DE: "FAQ"
+[PODEJRZANY DUPLIKAT] Page(faq).layout[0].ctaUrl | PL: "#" | DE: "#"
+[PODEJRZANY DUPLIKAT] Page(kontakt).title | PL: "Kontakt" | DE: "Kontakt"
+[PODEJRZANY DUPLIKAT] Page(kontakt).layout[0].title | PL: "Kontakt" | DE: "Kontakt"
+[PODEJRZANY DUPLIKAT] Page(kontakt).layout[0].subtitle | PL: "Masz pytania dotyczące rozliczenia podatkowego w N" | DE: "Masz pytania dotyczące rozliczenia podatkowego w N"
+[PODEJRZANY DUPLIKAT] Page(kontakt).layout[1].address | PL: "DO POTWIERDZENIA PRZEZ KLIENTA" | DE: "DO POTWIERDZENIA PRZEZ KLIENTA"
+[PODEJRZANY DUPLIKAT] Page(kontakt).layout[1].hours | PL: "Pon-Pt: 9:00 - 17:00 Po wcześniejszym umówieniu" | DE: "Pon-Pt: 9:00 - 17:00 Po wcześniejszym umówieniu"
+[PODEJRZANY DUPLIKAT] Page(kontakt).layout[1].form.title | PL: "Kontaktformular" | DE: "Kontaktformular"
+[PODEJRZANY DUPLIKAT] Page(impressum).title | PL: "Impressum" | DE: "Impressum"
+[PODEJRZANY DUPLIKAT] Global(header).navigation[0].page.layout[3].eyebrow | PL: "Kontakt" | DE: "Kontakt"
+[PODEJRZANY DUPLIKAT] Global(header).navigation[1].page.layout[2].address | PL: "DO POTWIERDZENIA PRZEZ KLIENTA" | DE: "DO POTWIERDZENIA PRZEZ KLIENTA"
+[PODEJRZANY DUPLIKAT] Global(header).navigation[2].page.layout[1].title | PL: "Janusz Kędzierski" | DE: "Janusz Kędzierski"
+[PODEJRZANY DUPLIKAT] Global(header).navigation[3].anchor | PL: "faq" | DE: "faq"
+[PODEJRZANY DUPLIKAT] Global(header).navigation[4].page.title | PL: "Kontakt" | DE: "Kontakt"
+[PODEJRZANY DUPLIKAT] Global(header).navigation[4].page.layout[0].title | PL: "Kontakt" | DE: "Kontakt"
+[PODEJRZANY DUPLIKAT] Global(header).navigation[4].page.layout[0].subtitle | PL: "Masz pytania dotyczące rozliczenia podatkowego w N" | DE: "Masz pytania dotyczące rozliczenia podatkowego w N"
+[PODEJRZANY DUPLIKAT] Global(header).navigation[4].page.layout[1].address | PL: "DO POTWIERDZENIA PRZEZ KLIENTA" | DE: "DO POTWIERDZENIA PRZEZ KLIENTA"
+[PODEJRZANY DUPLIKAT] Global(header).navigation[4].page.layout[1].hours | PL: "Pon-Pt: 9:00 - 17:00 Po wcześniejszym umówieniu" | DE: "Pon-Pt: 9:00 - 17:00 Po wcześniejszym umówieniu"
+[PODEJRZANY DUPLIKAT] Global(header).navigation[4].page.layout[1].form.title | PL: "Kontaktformular" | DE: "Kontaktformular"
+[PODEJRZANY DUPLIKAT] Global(footer).navigation[0].page.layout[3].eyebrow | PL: "Kontakt" | DE: "Kontakt"
+[PODEJRZANY DUPLIKAT] Global(footer).navigation[1].page.layout[2].address | PL: "DO POTWIERDZENIA PRZEZ KLIENTA" | DE: "DO POTWIERDZENIA PRZEZ KLIENTA"
+[PODEJRZANY DUPLIKAT] Global(footer).navigation[2].page.layout[1].title | PL: "Janusz Kędzierski" | DE: "Janusz Kędzierski"
+[PODEJRZANY DUPLIKAT] Global(footer).navigation[3].page.title | PL: "Kontakt" | DE: "Kontakt"
+[PODEJRZANY DUPLIKAT] Global(footer).navigation[3].page.layout[0].title | PL: "Kontakt" | DE: "Kontakt"
+[PODEJRZANY DUPLIKAT] Global(footer).navigation[3].page.layout[0].subtitle | PL: "Masz pytania dotyczące rozliczenia podatkowego w N" | DE: "Masz pytania dotyczące rozliczenia podatkowego w N"
+[PODEJRZANY DUPLIKAT] Global(footer).navigation[3].page.layout[1].address | PL: "DO POTWIERDZENIA PRZEZ KLIENTA" | DE: "DO POTWIERDZENIA PRZEZ KLIENTA"
+[PODEJRZANY DUPLIKAT] Global(footer).navigation[3].page.layout[1].hours | PL: "Pon-Pt: 9:00 - 17:00 Po wcześniejszym umówieniu" | DE: "Pon-Pt: 9:00 - 17:00 Po wcześniejszym umówieniu"
+[PODEJRZANY DUPLIKAT] Global(footer).navigation[3].page.layout[1].form.title | PL: "Kontaktformular" | DE: "Kontaktformular"
+[PODEJRZANY DUPLIKAT] Global(footer).navigation[6].page.title | PL: "Impressum" | DE: "Impressum"
+[PODEJRZANY DUPLIKAT] Global(company).address | PL: "DO POTWIERDZENIA PRZEZ KLIENTA" | DE: "DO POTWIERDZENIA PRZEZ KLIENTA"
+[PODEJRZANY DUPLIKAT] Global(company).hours | PL: "Pon-Pt: 9:00 - 17:00 Po wcześniejszym umówieniu" | DE: "Pon-Pt: 9:00 - 17:00 Po wcześniejszym umówieniu"
+[PODEJRZANY DUPLIKAT] Global(site-settings).homepage.layout[3].items[1].stat | PL: "100%" | DE: "100%"
+[PODEJRZANY DUPLIKAT] Global(site-settings).homepage.layout[3].items[2].stat | PL: "§4 Nr. 11" | DE: "§4 Nr. 11"
+[PODEJRZANY DUPLIKAT] Global(site-settings).homepage.layout[7].testimonials[1].author | PL: "Anna, Berlin" | DE: "Anna, Berlin"
+[PODEJRZANY DUPLIKAT] Global(site-settings).homepage.layout[7].testimonials[2].author | PL: "Krzysztof, Dortmund" | DE: "Krzysztof, Dortmund"
+[PODEJRZANY DUPLIKAT] Global(site-settings).homepage.layout[9].eyebrow | PL: "Kontakt" | DE: "Kontakt"
+[PODEJRZANY DUPLIKAT] Form(Kontaktformular).title | PL: "Kontaktformular" | DE: "Kontaktformular"
\ No newline at end of file
diff --git a/de_kontakt_form_grep.txt b/de_kontakt_form_grep.txt
new file mode 100644
index 0000000..45d8748
--- /dev/null
+++ b/de_kontakt_form_grep.txt
@@ -0,0 +1,2 @@
+})("data-theme","theme","light",null,["light","dark"],null,false,true)
Haben Sie Fragen zu Ihrer Steuererklärung in Deutschland? Kontaktieren Sie uns — wir helfen Ihnen gerne.
Vom Kunden zu bestätigen
Mo-Fr: 9:00 - 17:00 +Nach vorheriger Terminvereinbarung