feat: OnyvaLeads customer UI — Suche + Leadspeicher
- New Topbar: logo, 2-tab pill switcher, live "Neu" badge - /suche page: SearchCard, LoadingCard, ExamplePills - /leadspeicher page: full leads table with filters, pagination - StatusBadge, StatusPopover, LeadSidePanel, BulkActionBar - POST /api/search: unified search entry point → serp-enrich - Remove Sidebar + old TopBar from layout - Title: OnyvaLeads, redirect / → /suche Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
54
components/leadspeicher/StatusBadge.tsx
Normal file
54
components/leadspeicher/StatusBadge.tsx
Normal file
@@ -0,0 +1,54 @@
|
||||
"use client";
|
||||
|
||||
export type LeadStatus = "new" | "contacted" | "in_progress" | "not_relevant" | "converted";
|
||||
|
||||
interface StatusConfig {
|
||||
label: string;
|
||||
background: string;
|
||||
color: string;
|
||||
}
|
||||
|
||||
export const STATUS_MAP: Record<string, StatusConfig> = {
|
||||
new: { label: "Neu", background: "#1e3a5f", color: "#93c5fd" },
|
||||
contacted: { label: "Kontaktiert", background: "#064e3b", color: "#6ee7b7" },
|
||||
in_progress: { label: "In Bearbeitung", background: "#451a03", color: "#fcd34d" },
|
||||
not_relevant: { label: "Nicht relevant", background: "#1e1e2e", color: "#6b7280" },
|
||||
converted: { label: "Konvertiert", background: "#2e1065", color: "#d8b4fe" },
|
||||
};
|
||||
|
||||
export const STATUS_OPTIONS = [
|
||||
{ value: "new", label: "Neu" },
|
||||
{ value: "contacted", label: "Kontaktiert" },
|
||||
{ value: "in_progress", label: "In Bearbeitung" },
|
||||
{ value: "not_relevant", label: "Nicht relevant" },
|
||||
{ value: "converted", label: "Konvertiert" },
|
||||
];
|
||||
|
||||
interface StatusBadgeProps {
|
||||
status: string;
|
||||
onClick?: (e: React.MouseEvent) => void;
|
||||
}
|
||||
|
||||
export function StatusBadge({ status, onClick }: StatusBadgeProps) {
|
||||
const cfg = STATUS_MAP[status] ?? STATUS_MAP.new;
|
||||
return (
|
||||
<span
|
||||
onClick={onClick}
|
||||
style={{
|
||||
display: "inline-flex",
|
||||
alignItems: "center",
|
||||
padding: "3px 10px",
|
||||
borderRadius: 20,
|
||||
fontSize: 12,
|
||||
fontWeight: 500,
|
||||
background: cfg.background,
|
||||
color: cfg.color,
|
||||
cursor: onClick ? "pointer" : "default",
|
||||
userSelect: "none",
|
||||
whiteSpace: "nowrap",
|
||||
}}
|
||||
>
|
||||
{cfg.label}
|
||||
</span>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user