"use client"; import { ArrowLeft, HardHat, Loader2, Package, Pencil, Plus, Save, Trash2 } from "lucide-react"; import Link from "next/link"; import { useEffect, useRef, useState } from "react"; import { createBcItem, deleteBcItem, updateBcItem, updateBcPage } from "@/actions/catalog-bc"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Textarea } from "@/components/ui/textarea"; import { useServerAction } from "@/hooks/use-server-action"; // ── Types ──────────────────────────────────────────────────────────── export interface BcPageData { id: number; parentId: number; caption: string; pageLayout: string; iconColor: number; iconImage: number; orderNum: number; visible: string; enabled: string; pageHeadline: string; pageTeaser: string; pageSpecial: string; pageText1: string; pageText2: string; pageTextDetails: string; pageTextTeaser: string; } export interface BcItemData { id: number; pageId: number; itemIds: string; catalogName: string; orderNumber: number; extradata: string; } interface BcPageDetailProps { page: BcPageData; items: BcItemData[]; canEdit: boolean; } // ── Main Component ─────────────────────────────────────────────────── export function BcPageDetail({ page, items, canEdit }: BcPageDetailProps) { const { isPending, run } = useServerAction(); const formRef = useRef(null); const [editingItem, setEditingItem] = useState(null); const [addingItem, setAddingItem] = useState(false); const [form, setForm] = useState({ caption: page.caption, orderNum: page.orderNum, enabled: page.enabled as "0" | "1", visible: page.visible as "0" | "1", pageHeadline: page.pageHeadline, pageTeaser: page.pageTeaser, pageSpecial: page.pageSpecial, pageText1: page.pageText1, pageText2: page.pageText2, pageTextDetails: page.pageTextDetails, pageTextTeaser: page.pageTextTeaser, }); // Ctrl+S / Cmd+S to save useEffect(() => { if (!canEdit) return; function onKeyDown(e: KeyboardEvent) { if ((e.metaKey || e.ctrlKey) && e.key === "s") { e.preventDefault(); formRef.current?.requestSubmit(); } } document.addEventListener("keydown", onKeyDown); return () => document.removeEventListener("keydown", onKeyDown); }, [canEdit]); function update(key: K, value: (typeof form)[K]) { setForm((prev) => ({ ...prev, [key]: value })); } function handleSubmit(e: React.FormEvent) { e.preventDefault(); run(() => updateBcPage({ id: page.id, ...form }), { successMessage: "BC page updated and catalog synced.", errorMessage: "Failed to update.", }); } return (
{/* Header */}
BC Catalog /

{page.caption}

#{page.id} {page.pageLayout}
{/* ── Left column: form fields ─────────────── */}
Page Settings
update("caption", e.target.value)} disabled={!canEdit} />
update("orderNum", parseInt(e.target.value, 10) || 0)} disabled={!canEdit} />
update("pageHeadline", e.target.value)} disabled={!canEdit} placeholder="Headline image path" />
update("pageTeaser", e.target.value)} disabled={!canEdit} placeholder="Teaser image path" />