diff --git a/after-login.png b/after-login.png new file mode 100644 index 000000000..b4a7ea190 Binary files /dev/null and b/after-login.png differ diff --git a/app/[locale]/standorte/[slug]/page.tsx b/app/[locale]/standorte/[slug]/page.tsx index ab7f6df22..f02d93df6 100644 --- a/app/[locale]/standorte/[slug]/page.tsx +++ b/app/[locale]/standorte/[slug]/page.tsx @@ -63,9 +63,9 @@ export default async function StandortDetail(props: { params: Promise<{ locale: } return ( -
- {/* Industrial Hero Section */} -
+
+ {/* Generic Hero Section to match standard pages */} +
@@ -75,139 +75,110 @@ export default async function StandortDetail(props: { params: Promise<{ locale: {standort.type === 'hq' ? (safeLocale === 'de' ? 'Hauptsitz' : 'Headquarters') : (safeLocale === 'de' ? 'Niederlassung' : 'Branch')} - + {standort.name} -

- {standort.description[safeLocale]} -

- + {/* Main Content Area */} + + {/* Excerpt/Lead paragraph */} +
+

+ {standort.description[safeLocale]} +

+
-
- {/* Main Content (Images & Description) */} -
- {/* Featured Image */} -
- {standort.name} -
-
- - {/* Key Features */} -
-

- {safeLocale === 'de' ? 'Unsere Leistungen vor Ort' : 'Our Local Services'} -

-
    - {standort.keyFeatures[safeLocale].map((feature, idx) => ( -
  • - - {feature} -
  • - ))} -
-
+ {/* Main content in prose style */} +
+
- {/* Gallery (if any) */} + {standort.name} + +

{safeLocale === 'de' ? 'Unsere Leistungen vor Ort' : 'Our Local Services'}

+
    + {standort.keyFeatures[safeLocale].map((feature, idx) => ( +
  • + {feature} +
  • + ))} +
+ +

{safeLocale === 'de' ? 'Kontakt & Anfahrt' : 'Contact & Directions'}

+ +

+ {safeLocale === 'de' ? 'Adresse:' : 'Address:'}
+ {standort.address.street}
+ {standort.address.city} +

+

+ + {safeLocale === 'de' ? 'In Google Maps öffnen' : 'Open in Google Maps'} + + +

+ +

+ {safeLocale === 'de' ? 'Telefon:' : 'Phone:'}
+ + {standort.contact.phone} + +

+ +

+ Email:
+ + {standort.contact.email} + +

+ {standort.gallery && standort.gallery.length > 0 && ( -
- {standort.gallery.map((img, idx) => ( -
- {`Gallery -
- ))} -
+ <> +

Galerie

+
+ {standort.gallery.map((img, idx) => ( +
+ {`Gallery +
+ ))} +
+ )}
+
+ - {/* Sidebar (Contact & Address) */} -
-
- - {/* Contact Card */} -
- -
- -
-

- - {safeLocale === 'de' ? 'Kontakt & Anfahrt' : 'Contact & Directions'} -

- -
-
-
- -
-
-
- {safeLocale === 'de' ? 'Adresse' : 'Address'} -
-
- {standort.address.street}
- {standort.address.city} -
- {(() => { - const baseUrl = 'https://maps.google.com/'; - const mapsUrl = `${baseUrl}?q=${encodeURIComponent(`${standort.address.street}, ${standort.address.city}`)}`; - return ( - - {safeLocale === 'de' ? 'In Google Maps öffnen' : 'Open in Google Maps'} - - - ); - })()} -
-
- -
-
- -
-
-
- {safeLocale === 'de' ? 'Telefon' : 'Phone'} -
- - {standort.contact.phone} - -
-
- -
-
- -
- -
-
-
-
- -
+ {/* Support Section */} + +
+
+
+

{t('needHelp')}

+

{t('supportTeamAvailable')}

+ + + {t('contactUs')} + + → + + + +
diff --git a/components/blocks/InteractiveGermanyMap.tsx b/components/blocks/InteractiveGermanyMap.tsx index b28f2300f..3d993f49d 100644 --- a/components/blocks/InteractiveGermanyMap.tsx +++ b/components/blocks/InteractiveGermanyMap.tsx @@ -7,12 +7,10 @@ import Image from 'next/image'; import { useRouter } from 'next/navigation'; import Link from 'next/link'; import { AnimatedGlossyBorder } from '@/components/ui/AnimatedGlossyBorder'; -import { Location, defaultLocations, minorLocations } from '@/lib/map-data'; +import { Location, defaultLocations, minorLocations, projectLocations } from '@/lib/map-data'; import { standorteLocations } from '@/lib/standorte-data'; import { useLocale, useTranslations } from 'next-intl'; -const allLocations = [...standorteLocations, ...defaultLocations, ...minorLocations]; - interface Stat { value: string; suffix?: string; @@ -34,7 +32,7 @@ export function InteractiveGermanyMap({ title, description, stats, - locations = allLocations, + locations = projectLocations, isHero = false }: InteractiveGermanyMapProps) { const [activeLocation, setActiveLocation] = useState(null); diff --git a/contact-page-auth-debug.html b/contact-page-auth-debug.html new file mode 100644 index 000000000..217ea5d44 --- /dev/null +++ b/contact-page-auth-debug.html @@ -0,0 +1 @@ +Gatekeeper | Access Control
Mintel

etib-testing Gatekeeper

Infrastructure Protection

Encrypted Connection
etib-testing

© 2026 MINTEL

\ No newline at end of file diff --git a/contact-page-debug.html b/contact-page-debug.html new file mode 100644 index 000000000..af71c9eef --- /dev/null +++ b/contact-page-debug.html @@ -0,0 +1 @@ +Gatekeeper | Access Control
Mintel

etib-testing Gatekeeper

Infrastructure Protection

Encrypted Connection
etib-testing

© 2026 MINTEL

\ No newline at end of file diff --git a/contact.png b/contact.png new file mode 100644 index 000000000..6560a374e Binary files /dev/null and b/contact.png differ diff --git a/content/de/ueber-uns.mdx b/content/de/ueber-uns.mdx index 79f150e37..8a46a07ee 100644 --- a/content/de/ueber-uns.mdx +++ b/content/de/ueber-uns.mdx @@ -86,7 +86,7 @@ layout: "fullBleed" title: "E-TIB Bohrtechnik GmbH", description: "Präzise Horizontalspülbohrungen in allen Bodenklassen für eine oberflächenschonende und grabenlose Leitungsverlegung.", icon: "M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z", - url: "/de/bohrtechnik", + url: "/de/standorte/kirchheilingen", backgroundImage: "/assets/photos/DSC08653.JPG" } ]} diff --git a/content/en/ueber-uns.mdx b/content/en/ueber-uns.mdx index 65d9ac50e..5b72992aa 100644 --- a/content/en/ueber-uns.mdx +++ b/content/en/ueber-uns.mdx @@ -86,7 +86,7 @@ layout: "fullBleed" title: "E-TIB Bohrtechnik GmbH", description: "Precise horizontal directional drilling in all soil classes for surface-friendly and trenchless pipe laying.", icon: "M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z", - url: "/en/drilling-technology", + url: "/en/standorte/kirchheilingen", backgroundImage: "/assets/photos/DSC08653.JPG" } ]} diff --git a/lib/map-data.ts b/lib/map-data.ts index 3b62aa2ba..58605b172 100644 --- a/lib/map-data.ts +++ b/lib/map-data.ts @@ -896,3 +896,4 @@ export const minorLocations: Location[] = [ description: 'pv', }, ]; +export const projectLocations = [...defaultLocations, ...minorLocations]; diff --git a/login-result.html b/login-result.html new file mode 100644 index 000000000..d69c958e9 --- /dev/null +++ b/login-result.html @@ -0,0 +1 @@ +Gatekeeper | Access Control
Mintel

etib-testing Gatekeeper

Infrastructure Protection

Access Denied. Try Again.
Encrypted Connection
etib-testing

© 2026 MINTEL

\ No newline at end of file diff --git a/scripts/smoke.ts b/scripts/smoke.ts index e41238537..d7451bcfd 100644 --- a/scripts/smoke.ts +++ b/scripts/smoke.ts @@ -29,7 +29,12 @@ async function run() { console.log(` Waiting for potential Gatekeeper redirect...`); await new Promise((resolve) => setTimeout(resolve, 3000)); - const isGatekeeper = await page.$('input[name="password"]'); + let isGatekeeper = null; + try { + isGatekeeper = await page.$('input[name="password"]'); + } catch (e) { + console.log('Navigation happened while checking gatekeeper:', e.message); + } if (isGatekeeper) { await page.type('input[name="password"]', gatekeeperPassword); await Promise.all([ @@ -65,7 +70,7 @@ async function run() { urls.map(async (url) => { if (url.includes('openstreetmap.org') || url.includes('unpkg.com')) return; try { - const res = await fetch(url, { method: 'HEAD' }); + const res = await fetch(url, { method: 'GET' }); if (res.status >= 400) { // Diagnostic: check if the raw source is available const rawUrlMatch = url.match(/[?&]url=([^&]+)/); @@ -73,7 +78,7 @@ async function run() { const rawPath = decodeURIComponent(rawUrlMatch[1]); const baseUrl = new URL(url).origin; const rawUrl = `${baseUrl}${rawPath}`; - const rawRes = await fetch(rawUrl, { method: 'HEAD' }); + const rawRes = await fetch(rawUrl, { method: 'GET' }); broken.push(`${url} (Status: ${res.status}, Raw Status: ${rawRes.status})`); } else { broken.push(`${url} (Status: ${res.status})`); diff --git a/test-contact-auth.cjs b/test-contact-auth.cjs new file mode 100644 index 000000000..c8be29f96 --- /dev/null +++ b/test-contact-auth.cjs @@ -0,0 +1,32 @@ +const puppeteer = require('puppeteer'); +(async () => { + const targetUrl = 'https://test.e-tib.com'; + const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'klz2026'; + + const browser = await puppeteer.launch({ headless: true }); + const page = await browser.newPage(); + + await page.goto(targetUrl, { waitUntil: 'domcontentloaded' }); + await new Promise((resolve) => setTimeout(resolve, 3000)); + + const isGatekeeper = await page.$('input[name="password"]'); + if (isGatekeeper) { + await page.type('input[name="password"]', gatekeeperPassword); + await Promise.all([ + page.click('button[type="submit"]'), + ]); + await new Promise((resolve) => setTimeout(resolve, 5000)); + } + + await page.screenshot({ path: 'after-login.png' }); + + await page.goto(`${targetUrl}/de/kontakt`, { waitUntil: 'domcontentloaded' }); + await new Promise(r => setTimeout(r, 2000)); + + const html = await page.content(); + const fs = require('fs'); + fs.writeFileSync('contact-page-auth-debug.html', html); + await page.screenshot({ path: 'contact.png' }); + + await browser.close(); +})(); diff --git a/test-contact.cjs b/test-contact.cjs new file mode 100644 index 000000000..ff3ccce5e --- /dev/null +++ b/test-contact.cjs @@ -0,0 +1,12 @@ +const puppeteer = require('puppeteer'); +(async () => { + const browser = await puppeteer.launch({ headless: true }); + const page = await browser.newPage(); + + await page.goto('https://test.e-tib.com/de/kontakt', { waitUntil: 'networkidle0' }); + const html = await page.content(); + const fs = require('fs'); + fs.writeFileSync('contact-page-debug.html', html); + + await browser.close(); +})(); diff --git a/test-contact.js b/test-contact.js new file mode 100644 index 000000000..ff3ccce5e --- /dev/null +++ b/test-contact.js @@ -0,0 +1,12 @@ +const puppeteer = require('puppeteer'); +(async () => { + const browser = await puppeteer.launch({ headless: true }); + const page = await browser.newPage(); + + await page.goto('https://test.e-tib.com/de/kontakt', { waitUntil: 'networkidle0' }); + const html = await page.content(); + const fs = require('fs'); + fs.writeFileSync('contact-page-debug.html', html); + + await browser.close(); +})(); diff --git a/test-login-error.cjs b/test-login-error.cjs new file mode 100644 index 000000000..c507e25bd --- /dev/null +++ b/test-login-error.cjs @@ -0,0 +1,24 @@ +const puppeteer = require('puppeteer'); +(async () => { + const targetUrl = 'https://test.e-tib.com'; + const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'klz2026'; + + const browser = await puppeteer.launch({ headless: true }); + const page = await browser.newPage(); + + await page.goto(targetUrl, { waitUntil: 'networkidle0' }); + const isGatekeeper = await page.$('input[name="password"]'); + if (isGatekeeper) { + await page.type('input[name="password"]', gatekeeperPassword); + await Promise.all([ + page.click('button[type="submit"]'), + page.waitForNavigation({ waitUntil: 'networkidle0' }).catch(() => {}) + ]); + const html = await page.content(); + const fs = require('fs'); + fs.writeFileSync('login-result.html', html); + } else { + console.log("No gatekeeper found!"); + } + await browser.close(); +})();