Merge branch 'feature/excel' into feature-ai-search, resolve conflicts
All checks were successful
Build & Deploy / 🔍 Prepare (push) Successful in 10s
Build & Deploy / 🧪 QA (push) Successful in 1m28s
Build & Deploy / 🏗️ Build (push) Successful in 4m11s
Build & Deploy / 🚀 Deploy (push) Successful in 45s
Build & Deploy / 🧪 Post-Deploy Verification (push) Successful in 4m2s
Build & Deploy / 🔔 Notify (push) Successful in 2s

This commit is contained in:
2026-03-21 15:46:12 +01:00
255 changed files with 30803 additions and 1041 deletions

View File

@@ -0,0 +1,52 @@
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres';
export async function up({ db }: MigrateUpArgs): Promise<void> {
// Add featured_image_id to products and _products_v
await db.execute(sql`
ALTER TABLE "products" ADD COLUMN IF NOT EXISTS "featured_image_id" integer;
`);
await db.execute(sql`
ALTER TABLE "_products_v" ADD COLUMN IF NOT EXISTS "version_featured_image_id" integer;
`);
// Add foreign key constraints
await db.execute(sql`
DO $$ BEGIN
ALTER TABLE "products" ADD CONSTRAINT "products_featured_image_id_media_id_fk" FOREIGN KEY ("featured_image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
EXCEPTION WHEN duplicate_object THEN null; END $$;
`);
await db.execute(sql`
DO $$ BEGIN
ALTER TABLE "_products_v" ADD CONSTRAINT "_products_v_version_featured_image_id_media_id_fk" FOREIGN KEY ("version_featured_image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
EXCEPTION WHEN duplicate_object THEN null; END $$;
`);
// Add indexes
await db.execute(sql`
CREATE INDEX IF NOT EXISTS "products_featured_image_idx" ON "products" USING btree ("featured_image_id");
`);
await db.execute(sql`
CREATE INDEX IF NOT EXISTS "_products_v_version_version_featured_image_idx" ON "_products_v" USING btree ("version_featured_image_id");
`);
}
export async function down({ db }: MigrateDownArgs): Promise<void> {
await db.execute(sql`
ALTER TABLE "products" DROP CONSTRAINT IF EXISTS "products_featured_image_id_media_id_fk";
`);
await db.execute(sql`
ALTER TABLE "_products_v" DROP CONSTRAINT IF EXISTS "_products_v_version_featured_image_id_media_id_fk";
`);
await db.execute(sql`
DROP INDEX IF EXISTS "products_featured_image_idx";
`);
await db.execute(sql`
DROP INDEX IF EXISTS "_products_v_version_version_featured_image_idx";
`);
await db.execute(sql`
ALTER TABLE "products" DROP COLUMN IF EXISTS "featured_image_id";
`);
await db.execute(sql`
ALTER TABLE "_products_v" DROP COLUMN IF EXISTS "version_featured_image_id";
`);
}

View File

@@ -0,0 +1,31 @@
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres';
export async function up({ db }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_tablet_url" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_tablet_width" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_tablet_height" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_tablet_mime_type" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_tablet_filesize" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_tablet_filename" varchar;
`);
await db.execute(sql`
CREATE INDEX IF NOT EXISTS "media_sizes_tablet_sizes_tablet_filename_idx" ON "media" USING btree ("sizes_tablet_filename");
`);
}
export async function down({ db }: MigrateDownArgs): Promise<void> {
await db.execute(sql`
DROP INDEX IF EXISTS "media_sizes_tablet_sizes_tablet_filename_idx";
`);
await db.execute(sql`
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_tablet_filename";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_tablet_filesize";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_tablet_mime_type";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_tablet_height";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_tablet_width";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_tablet_url";
`);
}

View File

@@ -2,6 +2,8 @@ import * as migration_20260223_195005_products_collection from './20260223_19500
import * as migration_20260223_195151_remove_sku_unique from './20260223_195151_remove_sku_unique';
import * as migration_20260225_003500_add_pages_collection from './20260225_003500_add_pages_collection';
import * as migration_20260225_175000_native_localization from './20260225_175000_native_localization';
import * as migration_20260305_215000_products_featured_image from './20260305_215000_products_featured_image';
import * as migration_20260305_222000_media_sizes_tablet from './20260305_222000_media_sizes_tablet';
export const migrations = [
{
@@ -24,4 +26,14 @@ export const migrations = [
down: migration_20260225_175000_native_localization.down,
name: '20260225_175000_native_localization',
},
{
up: migration_20260305_215000_products_featured_image.up,
down: migration_20260305_215000_products_featured_image.down,
name: '20260305_215000_products_featured_image',
},
{
up: migration_20260305_222000_media_sizes_tablet.up,
down: migration_20260305_222000_media_sizes_tablet.down,
name: '20260305_222000_media_sizes_tablet',
},
];

View File

@@ -0,0 +1,30 @@
import { Block } from 'payload';
export const PDFDownload: Block = {
slug: 'pdfDownload',
labels: {
singular: 'PDF Download',
plural: 'PDF Downloads',
},
admin: {},
fields: [
{
name: 'label',
type: 'text',
label: 'Button Beschriftung',
required: true,
localized: true,
defaultValue: 'Als PDF herunterladen',
},
{
name: 'style',
type: 'select',
defaultValue: 'primary',
options: [
{ label: 'Primary', value: 'primary' },
{ label: 'Secondary', value: 'secondary' },
{ label: 'Outline', value: 'outline' },
],
},
],
};

View File

@@ -16,6 +16,7 @@ import { StickyNarrative } from './StickyNarrative';
import { TeamProfile } from './TeamProfile';
import { TechnicalGrid } from './TechnicalGrid';
import { VisualLinkPreview } from './VisualLinkPreview';
import { PDFDownload } from './PDFDownload';
import { homeBlocksArray } from './HomeBlocks';
export const payloadBlocks = [
@@ -38,4 +39,5 @@ export const payloadBlocks = [
TeamProfile,
TechnicalGrid,
VisualLinkPreview,
PDFDownload,
];

View File

@@ -38,6 +38,7 @@ export const FormSubmissions: CollectionConfig = {
options: [
{ label: 'General Contact', value: 'contact' },
{ label: 'Product Quote', value: 'product_quote' },
{ label: 'Brochure Download', value: 'brochure_download' },
],
required: true,
admin: {

View File

@@ -1,12 +1,13 @@
/* eslint-disable @next/next/no-img-element */
import React from 'react';
export default function Icon() {
return (
<img
src="/logo-blue.svg"
alt="KLZ"
className="klz-admin-icon"
style={{ maxWidth: '100%', height: 'auto', maxHeight: '32px', display: 'block' }}
/>
);
return (
<img
src="/logo-blue.svg"
alt="KLZ"
className="klz-admin-icon"
style={{ maxWidth: '100%', height: 'auto', maxHeight: '32px', display: 'block' }}
/>
);
}

View File

@@ -1,12 +1,13 @@
/* eslint-disable @next/next/no-img-element */
import React from 'react';
export default function Logo() {
return (
<img
src="/logo-blue.svg"
alt="KLZ Cables"
className="klz-admin-logo"
style={{ maxWidth: '100%', height: 'auto', maxHeight: '40px', display: 'block' }}
/>
);
return (
<img
src="/logo-blue.svg"
alt="KLZ Cables"
className="klz-admin-logo"
style={{ maxWidth: '100%', height: 'auto', maxHeight: '40px', display: 'block' }}
/>
);
}