fix(links): update all maps and tiles to use standorte pages as single source of truth
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 43s
Build & Deploy / 🧪 QA (push) Failing after 1m5s
Build & Deploy / 🏗️ Build (push) Has been skipped
Build & Deploy / 🚀 Deploy (push) Has been skipped
Build & Deploy / 🧪 Post-Deploy Verification (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 2s

This commit is contained in:
2026-06-14 21:40:48 +02:00
parent 17a807c48b
commit 233509db67
9 changed files with 26 additions and 46 deletions

View File

@@ -9,6 +9,7 @@ import { SITE_URL } from '@/lib/schema';
import Image from 'next/image';
import { InteractiveGermanyMap } from '@/components/blocks/InteractiveGermanyMap';
import { defaultLocations, minorLocations } from '@/lib/map-data';
import { standorteLocations } from '@/lib/standorte-data';
interface PageProps {
params: Promise<{
@@ -52,7 +53,7 @@ export default async function ReferenzenOverview(props: { params: Promise<{ loca
const references = await getAllReferences(locale);
const allLocations = [...defaultLocations, ...minorLocations];
const allLocations = [...standorteLocations, ...defaultLocations, ...minorLocations];
const enrichedLocations = allLocations.map(loc => {
if (loc.type === 'project') {
const ref = references.find(r => r.slug === loc.id);

View File

@@ -8,9 +8,10 @@ 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 { standorteLocations } from '@/lib/standorte-data';
import { useLocale, useTranslations } from 'next-intl';
const allLocations = [...defaultLocations, ...minorLocations];
const allLocations = [...standorteLocations, ...defaultLocations, ...minorLocations];
interface Stat {
value: string;

View File

@@ -3,6 +3,7 @@
import * as React from 'react';
import { motion, Variants } from 'framer-motion';
import Image from 'next/image';
import Link from 'next/link';
import { HoverShineOverlay } from '@/components/ui/HoverShineOverlay';
import { AnimatedGlossyBorder } from '@/components/ui/AnimatedGlossyBorder';
@@ -87,8 +88,9 @@ export function SubCompanyTiles(props: SubCompanyTilesProps) {
{companiesData.map((company: any, index: number) => {
const isCurrent = company.title.toUpperCase() === 'E-TIB GMBH';
const hasUrl = !!company.url;
const CardWrapper = hasUrl ? 'a' : 'div';
const wrapperProps = hasUrl ? { href: company.url, target: "_blank", rel: "noopener noreferrer" } : {};
const isExternal = hasUrl && company.url.startsWith('http');
const CardWrapper = hasUrl ? (isExternal ? 'a' : Link) : 'div';
const wrapperProps = hasUrl ? (isExternal ? { href: company.url, target: "_blank", rel: "noopener noreferrer" } : { href: company.url }) : {};
// Generate logo representation based on title
const isEtib = company.title.includes('E-TIB');
@@ -122,7 +124,7 @@ export function SubCompanyTiles(props: SubCompanyTilesProps) {
{...wrapperProps}
className={`group relative overflow-hidden aspect-[4/3] flex flex-col justify-center items-center shadow-xl transition-all duration-500 bg-neutral-dark block w-full h-full sm:rounded-xl select-none ${
isCurrent
? 'border-2 border-primary shadow-[0_0_30px_rgba(17,124,97,0.15)] cursor-default'
? 'border border-white/5 hover:shadow-2xl hover:-translate-y-1 hover:border-white/10 cursor-pointer'
: 'border border-white/5 hover:shadow-2xl hover:-translate-y-1 hover:border-white/10 cursor-pointer'
}`}
>
@@ -227,7 +229,7 @@ export function SubCompanyTiles(props: SubCompanyTilesProps) {
{company.url && (
<div className="absolute bottom-6 left-0 right-0 flex justify-center opacity-0 group-hover:opacity-100 transform translate-y-4 group-hover:translate-y-0 transition-all duration-500 z-20">
<div className="flex items-center text-white font-bold uppercase text-xs tracking-widest bg-white/10 backdrop-blur-md px-4 py-2 rounded-full border border-white/20">
Website Besuchen
{isExternal ? (isDe ? 'Website Besuchen' : 'Visit Website') : (isDe ? 'Zum Standort' : 'View Location')}
<svg className="w-4 h-4 ml-2" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
</div>
</div>

View File

@@ -20,6 +20,7 @@ description: "Die E-TIB GmbH ist Ihr zuverlässiger Partner für komplexe Kabelt
title: "E-TIB GMBH",
description: "Das komplette Leistungsspektrum zur Errichtung von Kabeltrassen aus einer Hand.",
icon: "M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",
url: "/de/standorte/guben",
backgroundImage: "/assets/photos/DJI_0243.JPG"
},
{
@@ -33,13 +34,14 @@ description: "Die E-TIB GmbH ist Ihr zuverlässiger Partner für komplexe Kabelt
title: "E-TIB Verwaltung GmbH",
description: "Zentrale Dienste, Einkauf und Finanzen sowie Verwaltung von Immobilien, Grundstücken, Maschinen und Geräten.",
icon: "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4",
url: "/de/standorte/buelstedt",
backgroundImage: "/assets/photos/DJI_0048.JPG"
},
{
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"
}
]}

View File

@@ -65,7 +65,7 @@ layout: "fullBleed"
title: "E-TIB GMBH",
description: "Das komplette Leistungsspektrum zur Errichtung von Kabeltrassen aus einer Hand.",
icon: "M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",
url: "/de/kabeltiefbau",
url: "/de/standorte/guben",
backgroundImage: "/assets/photos/DJI_0243.JPG"
},
{
@@ -79,13 +79,14 @@ layout: "fullBleed"
title: "E-TIB Verwaltung GmbH",
description: "Zentrale Dienste, Einkauf und Finanzen sowie Verwaltung von Immobilien, Grundstücken, Maschinen und Geräten.",
icon: "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4",
url: "/de/standorte/buelstedt",
backgroundImage: "/assets/photos/DJI_0048.JPG"
},
{
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"
}
]}

View File

@@ -20,6 +20,7 @@ description: "E-TIB GmbH is your reliable partner for complex cable routes, hori
title: "E-TIB GMBH",
description: "The complete range of services for the construction of cable routes from a single source.",
icon: "M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",
url: "/en/standorte/guben",
backgroundImage: "/assets/photos/DJI_0243.JPG"
},
{
@@ -33,13 +34,14 @@ description: "E-TIB GmbH is your reliable partner for complex cable routes, hori
title: "E-TIB Verwaltung GmbH",
description: "Central services, purchasing, finance, and management of real estate, properties, machinery, and equipment.",
icon: "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4",
url: "/en/standorte/buelstedt",
backgroundImage: "/assets/photos/DJI_0048.JPG"
},
{
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"
}
]}

View File

@@ -65,7 +65,7 @@ layout: "fullBleed"
title: "E-TIB GMBH",
description: "The complete range of services for the construction of cable routes from a single source.",
icon: "M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",
url: "/en/cable-civil-engineering",
url: "/en/standorte/guben",
backgroundImage: "/assets/photos/DJI_0243.JPG"
},
{
@@ -79,13 +79,14 @@ layout: "fullBleed"
title: "E-TIB Verwaltung GmbH",
description: "Central services, purchasing, finance, and management of real estate, properties, machinery, and equipment.",
icon: "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4",
url: "/en/standorte/buelstedt",
backgroundImage: "/assets/photos/DJI_0048.JPG"
},
{
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"
}
]}

View File

@@ -11,36 +11,6 @@ export interface Location {
}
export const defaultLocations: Location[] = [
{
id: 'guben',
name: 'Guben (Hauptsitz)',
type: 'hq',
x: 85,
y: 41.1,
description: 'E-TIB GmbH Holding & Bohrtechnik GmbH',
href: '/standorte/guben',
details: ['Zentrale Steuerung', 'Kabelleitungstiefbau', 'Maschinenpark'],
},
{
id: 'kirchheilingen',
name: 'E-TIB Bohrtechnik GmbH',
type: 'branch',
x: 52,
y: 55,
description: 'Standort in Thüringen',
href: '/standorte/kirchheilingen',
details: ['Bahnhofstraße 180a', '99947 Kirchheilingen'],
},
{
id: 'buelstedt',
name: 'Bülstedt (Ingenieurgesellschaft)',
type: 'branch',
x: 37,
y: 25.33,
description: 'E-TIB Ingenieurgesellschaft mbH',
href: '/standorte/buelstedt',
details: ['Planung & Projektierung', 'Vermessung', 'Dokumentation'],
},
{
id: 'dettmannsdorf',
name: 'Dettmannsdorf (PV)',

View File

@@ -18,12 +18,12 @@ describe('Task 12 TDD - Bohrtechnik and Reference Links', () => {
const urlDeIndex = bohrtechnikDeBlock.indexOf('url:');
const nextItemDeIndex = bohrtechnikDeBlock.indexOf('title:', 10);
// Ensure "url:" exists within the E-TIB Bohrtechnik block and points to "/de/bohrtechnik"
expect(deContent).toMatch(/title:\s*"E-TIB Bohrtechnik GmbH"[\s\S]*?url:\s*["']\/de\/bohrtechnik["']/);
// Ensure "url:" exists within the E-TIB Bohrtechnik block and points to "/de/standorte/kirchheilingen"
expect(deContent).toMatch(/title:\s*"E-TIB Bohrtechnik GmbH"[\s\S]*?url:\s*["']\/de\/standorte\/kirchheilingen["']/);
// Assert that E-TIB Bohrtechnik GmbH has url: "/en/drilling-technology" in English content
// Assert that E-TIB Bohrtechnik GmbH has url: "/en/standorte/kirchheilingen" in English content
expect(enContent).toContain('title: "E-TIB Bohrtechnik GmbH"');
expect(enContent).toMatch(/title:\s*"E-TIB Bohrtechnik GmbH"[\s\S]*?url:\s*["']\/en\/drilling-technology["']/);
expect(enContent).toMatch(/title:\s*"E-TIB Bohrtechnik GmbH"[\s\S]*?url:\s*["']\/en\/standorte\/kirchheilingen["']/);
});
it('should verify that all reference projects in map-data have no href links', () => {