From 7da1b283ce84d9a8b04393e905c964844d912254 Mon Sep 17 00:00:00 2001 From: MichalC <103170279+wSBMichalee@users.noreply.github.com> Date: Thu, 3 Sep 2026 22:33:19 +0200 Subject: [PATCH] fix(ui): improve header navigation contrast on dark theme and add frontend not-found route --- scripts/fix_faq.ts | 145 ++++++++++++++++++++++ src/app/(frontend)/not-found.tsx | 22 ++++ src/blocks/Eligibility/Component.tsx | 6 +- src/blocks/FAQTeaser/Component.tsx | 79 ++++++++---- src/blocks/FAQTeaser/config.ts | 2 - src/blocks/ServicesDetailed/Component.tsx | 6 +- src/components/Header/index.tsx | 4 +- src/payload-types.ts | 4 - 8 files changed, 226 insertions(+), 42 deletions(-) create mode 100644 scripts/fix_faq.ts create mode 100644 src/app/(frontend)/not-found.tsx diff --git a/scripts/fix_faq.ts b/scripts/fix_faq.ts new file mode 100644 index 0000000..359114a --- /dev/null +++ b/scripts/fix_faq.ts @@ -0,0 +1,145 @@ +import { getPayload } from 'payload' +import configPromise from '../src/payload.config' + +async function run() { + console.log('Connecting to Payload Local API...') + const payload = await getPayload({ config: configPromise }) + + console.log('1. DELETING FAQ PAGE (ID 5)...') + try { + await payload.delete({ + collection: 'pages', + id: 5, + }) + console.log('FAQ page deleted.') + } catch (err: any) { + if (err.message?.includes('Not Found')) { + console.log('FAQ page already deleted.') + } else { + console.log('Error deleting FAQ page (might be already deleted or foreign key constraint):', err.message) + } + } + + console.log('2. UPDATING HEADER GLOBAL...') + for (const locale of ['pl', 'de']) { + const header = await payload.findGlobal({ slug: 'header', locale: locale as any }) + if (header.navigation) { + const newNav = header.navigation.filter((item: any) => { + const pageId = typeof item.page === 'object' && item.page !== null ? item.page.id : item.page + return pageId !== 5 && pageId !== 1 + }) + await payload.updateGlobal({ + slug: 'header', + locale: locale as any, + data: { navigation: newNav }, + }) + console.log(`Updated Header navigation for ${locale}`) + } + } + + console.log('3. UPDATING FOOTER GLOBAL...') + for (const locale of ['pl', 'de']) { + const footer = await payload.findGlobal({ slug: 'footer', locale: locale as any }) + if (footer.navigation) { + const newNav = footer.navigation.filter((item: any) => { + const pageId = typeof item.page === 'object' && item.page !== null ? item.page.id : item.page + return pageId !== 5 && pageId !== 1 + }) + await payload.updateGlobal({ + slug: 'footer', + locale: locale as any, + data: { navigation: newNav }, + }) + console.log(`Updated Footer navigation for ${locale}`) + } + } + + console.log('4. UPDATING FAQ TEASER ON HOME PAGE...') + const homePl = await payload.findByID({ collection: 'pages', id: 1, locale: 'pl' }) + if (homePl && homePl.layout) { + const layoutPl = homePl.layout.map((block: any) => { + if (block.blockType === 'faqTeaser') { + return { + ...block, + title: 'Częste pytania', + questions: [ + { + question: 'Czy muszę przyjeżdżać osobiście do biura?', + answer: 'Nie, wszystkie formalności możemy załatwić w 100% zdalnie. Dokumenty przesyłasz online przez bezpieczne kanały, a konsultacje prowadzimy telefonicznie lub przez WhatsApp.' + }, + { + question: 'Do kiedy muszę złożyć deklarację podatkową w Niemczech?', + answer: 'Standardowy termin to 31 sierpnia kolejnego roku, jednak korzystając z usług doradcy podatkowego, zyskujesz dodatkowy czas – nawet do końca lutego lub maja następnego roku (w zależności od ustaleń na dany rok).' + }, + { + question: 'Jak długo czeka się na zwrot podatku z Finanzamt?', + answer: 'Czas oczekiwania na decyzję i przelew zależy od urzędu skarbowego (Finanzamt) – najczęściej wynosi on od 3 do 8 tygodni po złożeniu kompletnej deklaracji.' + }, + { + question: 'Czy załatwiacie również zasiłek Kindergeld?', + answer: 'Tak, pomagamy w formalnościach związanych z pozyskaniem zasiłku rodzinnego Kindergeld dla pracowników zatrudnionych na terenie Niemiec.' + } + ] + } + } + return block + }) + + await payload.update({ + collection: 'pages', + id: 1, + locale: 'pl', + data: { layout: layoutPl }, + }) + console.log('Updated Home Page FAQ (PL)') + } + + const homeDe = await payload.findByID({ collection: 'pages', id: 1, locale: 'de' }) + if (homeDe && homeDe.layout) { + const layoutDe = homeDe.layout.map((block: any) => { + if (block.blockType === 'faqTeaser') { + return { + ...block, + title: 'Häufig gestellte Fragen (FAQ)', + questions: [ + { + question: 'Muss ich persönlich ins Büro kommen?', + answer: 'Nein, wir können alle Formalitäten zu 100 % online erledigen. Sie übermitteln Dokumente sicher online, und wir beraten Sie telefonisch oder per WhatsApp.' + }, + { + question: 'Bis wann muss ich die Steuererklärung in Deutschland einreichen?', + answer: 'Die Standardfrist ist der 31. August des Folgejahres. Wenn Sie jedoch die Dienste eines Steuerberaters in Anspruch nehmen, verlängert sich diese Frist (oft bis Ende Februar oder Mai des übernächsten Jahres, je nach Vorgaben).' + }, + { + question: 'Wie lange dauert es, bis das Finanzamt die Erstattung überweist?', + answer: 'Die Bearbeitungszeit hängt vom jeweiligen Finanzamt ab und beträgt in der Regel zwischen 3 und 8 Wochen nach Einreichung einer vollständigen Steuererklärung.' + }, + { + question: 'Unterstützen Sie auch beim Kindergeld?', + answer: 'Ja, wir helfen Ihnen gerne bei allen Formalitäten rund um die Beantragung von Kindergeld für in Deutschland Beschäftigte.' + } + ] + } + } + return block + }) + + await payload.update({ + collection: 'pages', + id: 1, + locale: 'de', + data: { layout: layoutDe }, + }) + console.log('Updated Home Page FAQ (DE)') + } + + console.log('Setup completed successfully!') + process.exit(0) +} + +try { + await run() +} catch (err) { + console.error('ERROR during setup:', err) + process.exit(1) +} diff --git a/src/app/(frontend)/not-found.tsx b/src/app/(frontend)/not-found.tsx new file mode 100644 index 0000000..7fe59e5 --- /dev/null +++ b/src/app/(frontend)/not-found.tsx @@ -0,0 +1,22 @@ +import Link from 'next/link' +import React from 'react' + +export default function NotFound() { + return ( +
+

404

+

+ Strona nie została znaleziona +

+

+ Przepraszamy, ale strona, której szukasz nie istnieje, została usunięta lub zmieniono jej adres. +

+ + Wróć na stronę główną + +
+ ) +} diff --git a/src/blocks/Eligibility/Component.tsx b/src/blocks/Eligibility/Component.tsx index b331a57..48f9dec 100644 --- a/src/blocks/Eligibility/Component.tsx +++ b/src/blocks/Eligibility/Component.tsx @@ -28,11 +28,7 @@ export const EligibilityBlock: React.FC = ({ eyebrow, title,
- {eyebrow && ( -
- // {eyebrow} -
- )} +

{title}

diff --git a/src/blocks/FAQTeaser/Component.tsx b/src/blocks/FAQTeaser/Component.tsx index 4447722..3ea6fb2 100644 --- a/src/blocks/FAQTeaser/Component.tsx +++ b/src/blocks/FAQTeaser/Component.tsx @@ -1,41 +1,68 @@ 'use client' -import React from 'react' - -import Link from 'next/link' +import React, { useState } from 'react' +import { motion, AnimatePresence } from 'framer-motion' +import { ChevronDown } from 'lucide-react' import type { Page } from '../../payload-types' type Props = Extract[0], { blockType: 'faqTeaser' }> -export const FAQTeaserBlock: React.FC = ({ eyebrow, title, questions, linkText }) => { - return ( -
-
-
+export const FAQTeaserBlock: React.FC = ({ title, questions }) => { + const [openIndex, setOpenIndex] = useState(0) + const toggleQuestion = (index: number) => { + setOpenIndex(openIndex === index ? null : index) + } + + return ( +
+
+

{title}

-
- {questions?.map((q: NonNullable[0], index: number) => ( -
-

{q.question}

-

{q.answer}

-
- ))} +
+ {questions?.map((q: NonNullable[0], index: number) => { + const isOpen = openIndex === index + + return ( +
+ + + {isOpen && ( + +
+ {q.answer} +
+
+ )} +
+
+ ) + })}
- - {linkText && ( -
- - {linkText} - -
- )}
) diff --git a/src/blocks/FAQTeaser/config.ts b/src/blocks/FAQTeaser/config.ts index 9e6f221..1747100 100644 --- a/src/blocks/FAQTeaser/config.ts +++ b/src/blocks/FAQTeaser/config.ts @@ -3,7 +3,6 @@ import type { Block } from 'payload' export const FAQTeaser: Block = { slug: 'faqTeaser', fields: [ - { name: 'eyebrow', type: 'text', localized: true }, { name: 'title', type: 'text', required: true, localized: true }, { name: 'questions', @@ -15,6 +14,5 @@ export const FAQTeaser: Block = { { name: 'answer', type: 'textarea', required: true }, ], }, - { name: 'linkText', type: 'text', localized: true }, ], } diff --git a/src/blocks/ServicesDetailed/Component.tsx b/src/blocks/ServicesDetailed/Component.tsx index 011c919..88c39ce 100644 --- a/src/blocks/ServicesDetailed/Component.tsx +++ b/src/blocks/ServicesDetailed/Component.tsx @@ -74,14 +74,14 @@ export const ServicesDetailedBlock: React.FC = ({ isFirst ? 'bg-foreground text-background border-0 shadow-md p-8 md:p-10' : 'bg-card text-foreground border border-border shadow-xs p-6 md:p-8' - } rounded-none min-h-[240px] flex flex-col justify-between`} + } rounded-none min-h-[240px] flex flex-col justify-between overflow-hidden`} > -
+

Finanz- & Lohnbuchhaltung - + Dipl.-Ing. Janusz Kędzierski

@@ -57,7 +57,7 @@ export function Header({ navItems = [] }: { navItems?: any[] }) { key={index} page={page} currentLocaleCode={currentLocale.code} - className="text-sm font-medium text-foreground/80 hover:text-accent transition-colors" + className="text-sm font-medium text-foreground/90 hover:text-accent transition-colors" /> ))} diff --git a/src/payload-types.ts b/src/payload-types.ts index 07b90a2..869ab71 100644 --- a/src/payload-types.ts +++ b/src/payload-types.ts @@ -413,7 +413,6 @@ export interface Page { blockType: 'testimonialsGrid'; } | { - eyebrow?: string | null; title: string; questions?: | { @@ -422,7 +421,6 @@ export interface Page { id?: string | null; }[] | null; - linkText?: string | null; id?: string | null; blockName?: string | null; blockType: 'faqTeaser'; @@ -848,7 +846,6 @@ export interface PagesSelect { faqTeaser?: | T | { - eyebrow?: T; title?: T; questions?: | T @@ -857,7 +854,6 @@ export interface PagesSelect { answer?: T; id?: T; }; - linkText?: T; id?: T; blockName?: T; };