From 655f33091f62d4b220997191c62a23c0a1d92b93 Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Tue, 3 Mar 2026 12:38:55 +0100 Subject: [PATCH] fix: resolve layout, pdf datasheets data generation and excel 404 routing --- app/[locale]/products/[...slug]/page.tsx | 11 +- app/actions/brochure.ts | 10 +- app/actions/contact.ts | 8 + components/ContactForm.tsx | 9 + components/FooterBrochureForm.tsx | 10 + components/RequestQuoteForm.tsx | 10 + middleware.ts | 2 +- next.config.mjs | 12 + public/brochure/klz-product-catalog-de.pdf | Bin 9904058 -> 9897912 bytes public/brochure/klz-product-catalog-en.pdf | Bin 9903183 -> 9896939 bytes public/datasheets/h1z2z2-k-de.pdf | Bin 4143 -> 7543 bytes public/datasheets/h1z2z2-k-en.pdf | Bin 4113 -> 7568 bytes public/datasheets/n2x2y-de.pdf | Bin 4153 -> 18033 bytes public/datasheets/n2x2y-en.pdf | Bin 4123 -> 18064 bytes public/datasheets/n2xfk2y-de.pdf | Bin 4152 -> 8375 bytes public/datasheets/n2xfk2y-en.pdf | Bin 4129 -> 8371 bytes public/datasheets/n2xfkld2y-de.pdf | Bin 4154 -> 7924 bytes public/datasheets/n2xfkld2y-en.pdf | Bin 4131 -> 7923 bytes public/datasheets/n2xs2y-de.pdf | Bin 4154 -> 19359 bytes public/datasheets/n2xs2y-en.pdf | Bin 4129 -> 19384 bytes public/datasheets/n2xsf2y-de.pdf | Bin 4157 -> 10458 bytes public/datasheets/n2xsf2y-en.pdf | Bin 4131 -> 10491 bytes public/datasheets/n2xsfl2y-hv-de.pdf | Bin 4153 -> 18769 bytes public/datasheets/n2xsfl2y-hv-en.pdf | Bin 4131 -> 18793 bytes public/datasheets/n2xsfl2y-mv-de.pdf | Bin 4159 -> 18768 bytes public/datasheets/n2xsfl2y-mv-en.pdf | Bin 4133 -> 18793 bytes public/datasheets/n2xsy-de.pdf | Bin 4154 -> 19348 bytes public/datasheets/n2xsy-en.pdf | Bin 4128 -> 19367 bytes public/datasheets/n2xy-de.pdf | Bin 4150 -> 18846 bytes public/datasheets/n2xy-en.pdf | Bin 4123 -> 18851 bytes public/datasheets/na2x2y-de.pdf | Bin 4153 -> 17640 bytes public/datasheets/na2x2y-en.pdf | Bin 4126 -> 17674 bytes public/datasheets/na2xfk2y-de.pdf | Bin 4153 -> 8392 bytes public/datasheets/na2xfk2y-en.pdf | Bin 4130 -> 8383 bytes public/datasheets/na2xfkld2y-de.pdf | Bin 4154 -> 8088 bytes public/datasheets/na2xfkld2y-en.pdf | Bin 4132 -> 8077 bytes public/datasheets/na2xs2y-de.pdf | Bin 4155 -> 21660 bytes public/datasheets/na2xs2y-en.pdf | Bin 4130 -> 21680 bytes public/datasheets/na2xsf2y-de.pdf | Bin 4159 -> 21399 bytes public/datasheets/na2xsf2y-en.pdf | Bin 4132 -> 21424 bytes public/datasheets/na2xsfl2y-hv-de.pdf | Bin 4154 -> 21938 bytes public/datasheets/na2xsfl2y-hv-en.pdf | Bin 4132 -> 21965 bytes public/datasheets/na2xsfl2y-mv-de.pdf | Bin 4160 -> 21939 bytes public/datasheets/na2xsfl2y-mv-en.pdf | Bin 4134 -> 21966 bytes public/datasheets/na2xsy-de.pdf | Bin 4154 -> 21798 bytes public/datasheets/na2xsy-en.pdf | Bin 4129 -> 21817 bytes public/datasheets/na2xy-de.pdf | Bin 4150 -> 18831 bytes public/datasheets/na2xy-en.pdf | Bin 4125 -> 18856 bytes public/datasheets/nay2y-de.pdf | Bin 4153 -> 18783 bytes public/datasheets/nay2y-en.pdf | Bin 4124 -> 18810 bytes public/datasheets/naycwy-de.pdf | Bin 4154 -> 17501 bytes public/datasheets/naycwy-en.pdf | Bin 4128 -> 17520 bytes public/datasheets/nayy-de.pdf | Bin 4152 -> 22873 bytes public/datasheets/nayy-en.pdf | Bin 4124 -> 22880 bytes public/datasheets/ny2y-de.pdf | Bin 4150 -> 13112 bytes public/datasheets/ny2y-en.pdf | Bin 4123 -> 13140 bytes public/datasheets/nycwy-de.pdf | Bin 4153 -> 16232 bytes public/datasheets/nycwy-en.pdf | Bin 4126 -> 16250 bytes public/datasheets/nyy-de.pdf | Bin 4148 -> 26959 bytes public/datasheets/nyy-en.pdf | Bin 4123 -> 26962 bytes public/datasheets/products/h1z2z2-k-de.xlsx | Bin 15995 -> 18271 bytes public/datasheets/products/h1z2z2-k-en.xlsx | Bin 15992 -> 18272 bytes public/datasheets/products/n2x2y-de.xlsx | Bin 15986 -> 33098 bytes public/datasheets/products/n2x2y-en.xlsx | Bin 15983 -> 33099 bytes public/datasheets/products/n2xs2y-de.xlsx | Bin 15989 -> 32774 bytes public/datasheets/products/n2xs2y-en.xlsx | Bin 15986 -> 32774 bytes public/datasheets/products/n2xsf2y-de.xlsx | Bin 15998 -> 21954 bytes public/datasheets/products/n2xsf2y-en.xlsx | Bin 15995 -> 21955 bytes .../datasheets/products/n2xsfl2y-hv-de.xlsx | Bin 16001 -> 31807 bytes .../datasheets/products/n2xsfl2y-hv-en.xlsx | Bin 15998 -> 31807 bytes .../datasheets/products/n2xsfl2y-mv-de.xlsx | Bin 16001 -> 31807 bytes .../datasheets/products/n2xsfl2y-mv-en.xlsx | Bin 15998 -> 31807 bytes public/datasheets/products/n2xsy-de.xlsx | Bin 15986 -> 32774 bytes public/datasheets/products/n2xsy-en.xlsx | Bin 15983 -> 32774 bytes public/datasheets/products/n2xy-de.xlsx | Bin 15983 -> 34395 bytes public/datasheets/products/n2xy-en.xlsx | Bin 15980 -> 34396 bytes public/datasheets/products/na2x2y-de.xlsx | Bin 15989 -> 32434 bytes public/datasheets/products/na2x2y-en.xlsx | Bin 15986 -> 32435 bytes public/datasheets/products/na2xs2y-de.xlsx | Bin 15992 -> 36718 bytes public/datasheets/products/na2xs2y-en.xlsx | Bin 15989 -> 36718 bytes public/datasheets/products/na2xsf2y-de.xlsx | Bin 16001 -> 36232 bytes public/datasheets/products/na2xsf2y-en.xlsx | Bin 15998 -> 36232 bytes .../datasheets/products/na2xsfl2y-hv-de.xlsx | Bin 16004 -> 37232 bytes .../datasheets/products/na2xsfl2y-hv-en.xlsx | Bin 16001 -> 37232 bytes .../datasheets/products/na2xsfl2y-mv-de.xlsx | Bin 16004 -> 37232 bytes .../datasheets/products/na2xsfl2y-mv-en.xlsx | Bin 16001 -> 37232 bytes public/datasheets/products/na2xsy-de.xlsx | Bin 15989 -> 37704 bytes public/datasheets/products/na2xsy-en.xlsx | Bin 15986 -> 37704 bytes public/datasheets/products/na2xy-de.xlsx | Bin 15986 -> 34367 bytes public/datasheets/products/na2xy-en.xlsx | Bin 15983 -> 34368 bytes public/datasheets/products/nay2y-de.xlsx | Bin 15986 -> 34349 bytes public/datasheets/products/nay2y-en.xlsx | Bin 15983 -> 34350 bytes public/datasheets/products/naycwy-de.xlsx | Bin 15989 -> 32535 bytes public/datasheets/products/naycwy-en.xlsx | Bin 15986 -> 32536 bytes public/datasheets/products/nayy-de.xlsx | Bin 15983 -> 39517 bytes public/datasheets/products/nayy-en.xlsx | Bin 15980 -> 39518 bytes public/datasheets/products/ny2y-de.xlsx | Bin 15983 -> 24975 bytes public/datasheets/products/ny2y-en.xlsx | Bin 15980 -> 24976 bytes public/datasheets/products/nycwy-de.xlsx | Bin 15986 -> 30255 bytes public/datasheets/products/nycwy-en.xlsx | Bin 15983 -> 30256 bytes public/datasheets/products/nyy-de.xlsx | Bin 15980 -> 46262 bytes public/datasheets/products/nyy-en.xlsx | Bin 15977 -> 46263 bytes scripts/generate-brochure.ts | 767 ++++---- scripts/generate-pdf-datasheets-pdf-lib.ts | 8 +- scripts/lib/excel-data-parser.ts | 1567 +++++++++-------- 105 files changed, 1337 insertions(+), 1077 deletions(-) diff --git a/app/[locale]/products/[...slug]/page.tsx b/app/[locale]/products/[...slug]/page.tsx index 94f7964f..d58e4892 100644 --- a/app/[locale]/products/[...slug]/page.tsx +++ b/app/[locale]/products/[...slug]/page.tsx @@ -499,9 +499,14 @@ export default async function ProductPage({ params }: ProductPageProps) {
-
- - {excelPath && } +
+ + {excelPath && ( + + )}
)} diff --git a/app/actions/brochure.ts b/app/actions/brochure.ts index c5397624..a8a25a8a 100644 --- a/app/actions/brochure.ts +++ b/app/actions/brochure.ts @@ -23,6 +23,14 @@ export async function requestBrochureAction(formData: FormData) { const email = formData.get('email') as string; const locale = (formData.get('locale') as string) || 'en'; + // Anti-spam Honeypot Check + const honeypot = formData.get('company_website') as string; + if (honeypot) { + logger.warn('Spam detected via honeypot in brochure request', { email }); + // Silently succeed to fool the bot without doing actual work + return { success: true }; + } + if (!email) { logger.warn('Missing email in brochure request'); return { success: false, error: 'Missing email address' }; @@ -77,7 +85,7 @@ export async function requestBrochureAction(formData: FormData) { const html = await render( React.createElement(BrochureDeliveryEmail, { - email, + _email: email, brochureUrl, locale: locale as 'en' | 'de', }), diff --git a/app/actions/contact.ts b/app/actions/contact.ts index f1ee3c57..2e692761 100644 --- a/app/actions/contact.ts +++ b/app/actions/contact.ts @@ -25,6 +25,14 @@ export async function sendContactFormAction(formData: FormData) { // Track attempt services.analytics.track('contact-form-attempt'); + // Anti-spam Honeypot Check + const honeypot = formData.get('company_website') as string; + if (honeypot) { + logger.warn('Spam detected via honeypot in contact request', { email: formData.get('email') }); + // Silently succeed to fool the bot without doing actual work + return { success: true }; + } + const name = formData.get('name') as string; const email = formData.get('email') as string; const message = formData.get('message') as string; diff --git a/components/ContactForm.tsx b/components/ContactForm.tsx index 47116404..87c44bdf 100644 --- a/components/ContactForm.tsx +++ b/components/ContactForm.tsx @@ -139,6 +139,15 @@ export default function ContactForm() { {t('form.title')}
+ {/* Anti-spam Honeypot */} +
+ {/* Anti-spam Honeypot */} + +
+ {/* Anti-spam Honeypot */} + +