"use client"; import { useState } from "react"; import { DndContext, PointerSensor, useSensor, useSensors, closestCenter, type DragEndEvent } from "@dnd-kit/core"; import { SortableContext, useSortable, verticalListSortingStrategy, arrayMove } from "@dnd-kit/sortable"; import { CSS } from "@dnd-kit/utilities"; import { Eye, EyeOff, GripVertical, Plus } from "lucide-react"; import { cn } from "@/lib/utils"; import type { Property } from "@/lib/databases/types"; import { useDb, usePropertyMutations } from "./hooks"; import { TypeIcon } from "./meta"; import { PropertyEditor } from "./PropertyEditor"; /** Popover body: visibility toggles, drag reorder, open editor, add property. */ export function PropertyManager({ onClose }: { onClose: () => void }) { const ctx = useDb(); const m = usePropertyMutations(ctx.db, ctx.db.pageId); const [editing, setEditing] = useState(null); const hidden = ctx.view.config.hidden ?? []; const sensors = useSensors(useSensor(PointerSensor, { activationConstraint: { distance: 4 } })); if (editing) return setEditing(null)} onBack={() => setEditing(null)} />; const onDragEnd = (e: DragEndEvent) => { const { active, over } = e; if (!over || active.id === over.id) return; const ids = ctx.props.map((p) => p.id); const next = arrayMove(ids, ids.indexOf(String(active.id)), ids.indexOf(String(over.id))); m.reorder.mutate(next); }; const toggle = (id: string) => ctx.patchView({ hidden: hidden.includes(id) ? hidden.filter((x) => x !== id) : [...hidden, id] }); return (
Properties{ctx.props.length}
p.id)} strategy={verticalListSortingStrategy}>
{ctx.props.map((p) =>
); } function Row({ p, hidden, onToggle, onEdit }: { p: Property; hidden: boolean; onToggle: () => void; onEdit: () => void }) { const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: p.id, disabled: p.type === "title" }); return ( ); }