/** * Migration: Seed team, contact, and other missing pages as Lexical block content into Payload CMS. * * Usage: * pnpm tsx scripts/seed-pages.ts */ import { getPayload } from 'payload'; import configPromise from '@payload-config'; function lexicalBlock(blockType: string, fields: Record) { return { type: 'block', version: 2, fields: { blockType, ...fields, }, }; } function lexicalDoc(blocks: any[]) { return { root: { type: 'root', format: '', indent: 0, version: 1, children: blocks, direction: 'ltr', }, }; } const PAGES = [ // ─── Team (DE) ──────────────────────────────────────────── { title: 'Team', slug: 'team', locale: 'de', layout: 'fullBleed', excerpt: '', _status: 'published', content: lexicalDoc([ lexicalBlock('heroSection', { badge: 'Das Team', title: 'Tradition trifft Moderne', subtitle: 'Zwei Generationen, eine Vision: Deutschlands zuverlässigster Partner für Kabel & Leitungen.', alignment: 'center', }), lexicalBlock('teamProfile', { name: 'Michael Bodemer', role: 'Geschäftsführer', quote: 'Innovation entsteht dort, wo Erfahrung auf frische Ideen trifft.', description: 'Als Geschäftsführer verbindet Michael jahrzehntelange Branchenexpertise mit einem klaren Blick für die Zukunft. Sein Fokus liegt auf nachhaltigen Lösungen und modernster Technologie.', linkedinUrl: 'https://www.linkedin.com/in/michael-bodemer-33b493122/', layout: 'imageRight', colorScheme: 'dark', }), lexicalBlock('stats', { stats: [ { value: '30+', label: 'Jahre Expertise' }, { value: 'Global', label: 'Netzwerk' }, ], }), lexicalBlock('teamProfile', { name: 'Klaus Mintel', role: 'Gründer & Berater', quote: 'Qualität ist kein Zufall – sie ist das Ergebnis von Engagement und Erfahrung.', description: 'Klaus gründete KLZ Cables und hat das Unternehmen zu einem der zuverlässigsten Partner der Kabelindustrie aufgebaut. Er bringt Jahrzehnte an Expertise ein.', linkedinUrl: 'https://www.linkedin.com/in/klaus-mintel-b80a8b193/', layout: 'imageLeft', colorScheme: 'light', }), lexicalBlock('manifestoGrid', { title: 'Unsere Werte', subtitle: 'Was uns antreibt', tagline: 'Seit der Gründung leiten uns klare Prinzipien, die wir jeden Tag leben.', items: [ { title: 'Qualität', description: 'Wir liefern nur Produkte, die höchsten Standards entsprechen.' }, { title: 'Zuverlässigkeit', description: 'Termingerechte Lieferung ist für uns selbstverständlich.' }, { title: 'Partnerschaft', description: 'Langfristige Beziehungen sind die Grundlage unseres Erfolgs.' }, { title: 'Innovation', description: 'Wir investieren in neue Technologien und nachhaltige Lösungen.' }, { title: 'Transparenz', description: 'Offene Kommunikation und faire Preise zeichnen uns aus.' }, { title: 'Nachhaltigkeit', description: 'Verantwortung für Umwelt und Gesellschaft ist Teil unserer DNA.' }, ], }), // Removed the imageGallery since it requires at least 1 image and we don't have media upload IDs yet. ]), }, // ─── Team (EN) ──────────────────────────────────────────── { title: 'Team', slug: 'team', locale: 'en', layout: 'fullBleed', excerpt: '', _status: 'published', content: lexicalDoc([ lexicalBlock('heroSection', { badge: 'The Team', title: 'Tradition Meets Innovation', subtitle: 'Two generations, one vision: Germany\'s most reliable partner for cables & wiring.', alignment: 'center', }), lexicalBlock('teamProfile', { name: 'Michael Bodemer', role: 'Managing Director', quote: 'Innovation happens where experience meets fresh ideas.', description: 'As Managing Director, Michael combines decades of industry expertise with a clear vision for the future. His focus is on sustainable solutions and cutting-edge technology.', linkedinUrl: 'https://www.linkedin.com/in/michael-bodemer-33b493122/', layout: 'imageRight', colorScheme: 'dark', }), lexicalBlock('stats', { stats: [ { value: '30+', label: 'Years of Expertise' }, { value: 'Global', label: 'Network' }, ], }), lexicalBlock('teamProfile', { name: 'Klaus Mintel', role: 'Founder & Advisor', quote: 'Quality is no accident – it is the result of commitment and experience.', description: 'Klaus founded KLZ Cables and built the company into one of the most reliable partners in the cable industry. He brings decades of expertise.', linkedinUrl: 'https://www.linkedin.com/in/klaus-mintel-b80a8b193/', layout: 'imageLeft', colorScheme: 'light', }), lexicalBlock('manifestoGrid', { title: 'Our Values', subtitle: 'What drives us', tagline: 'Since our founding, clear principles have guided us every day.', items: [ { title: 'Quality', description: 'We only deliver products that meet the highest standards.' }, { title: 'Reliability', description: 'On-time delivery is our standard.' }, { title: 'Partnership', description: 'Long-term relationships are the foundation of our success.' }, { title: 'Innovation', description: 'We invest in new technologies and sustainable solutions.' }, { title: 'Transparency', description: 'Open communication and fair pricing define us.' }, { title: 'Sustainability', description: 'Responsibility for the environment and society is part of our DNA.' }, ], }), ]), }, // ─── Contact (DE) ───────────────────────────────────────── { title: 'Kontakt', slug: 'kontakt', locale: 'de', layout: 'fullBleed', excerpt: '', _status: 'published', content: lexicalDoc([ lexicalBlock('heroSection', { badge: 'Kontakt', title: 'Sprechen Sie mit uns', subtitle: 'Wir sind für Sie da. Kontaktieren Sie uns für Beratung, Angebote oder technische Fragen.', alignment: 'left', }), lexicalBlock('contactSection', { showForm: true, showMap: true, showHours: true, }), ]), }, // ─── Contact (EN) ───────────────────────────────────────── { title: 'Contact', slug: 'contact', locale: 'en', layout: 'fullBleed', excerpt: '', _status: 'published', content: lexicalDoc([ lexicalBlock('heroSection', { badge: 'Contact', title: 'Talk to us', subtitle: 'We are here for you. Contact us for consulting, quotes, or technical questions.', alignment: 'left', }), lexicalBlock('contactSection', { showForm: true, showMap: true, showHours: true, }), ]), }, ]; async function seedPages() { const payload = await getPayload({ config: configPromise }); for (const page of PAGES) { const existing = await payload.find({ collection: 'pages', where: { slug: { equals: page.slug }, locale: { equals: page.locale }, }, limit: 1, }); const docs = existing.docs as any[]; if (docs.length > 0) { await payload.update({ collection: 'pages', id: docs[0].id, locale: page.locale, data: { title: page.title, layout: page.layout as any, _status: page._status as any, content: page.content as any, }, }); console.log(`✅ Updated: ${page.slug} (${page.locale})`); } else { await payload.create({ collection: 'pages', locale: page.locale, data: { title: page.title, slug: page.slug, layout: page.layout as any, excerpt: page.excerpt, _status: page._status as any, content: page.content as any, }, }); console.log(`✅ Created: ${page.slug} (${page.locale})`); } } console.log('\n🎉 All pages seeded successfully!'); process.exit(0); } seedPages().catch((err) => { console.error('❌ Seed failed:', err); process.exit(1); });