From 6d12863860f015868a4e2db7870ad268660d2917 Mon Sep 17 00:00:00 2001 From: gunshiz Date: Sat, 12 Sep 2026 15:28:47 +0700 Subject: [PATCH] feat : improve extra section --- app/globals.css | 5 + components/admin/extra-sheet-editor.tsx | 176 ++++++------------------ 2 files changed, 49 insertions(+), 132 deletions(-) diff --git a/app/globals.css b/app/globals.css index 8fe1671..28794c9 100644 --- a/app/globals.css +++ b/app/globals.css @@ -159,6 +159,11 @@ color: var(--accent-foreground); } +.extra-sheet-grid .Spreadsheet__data-viewer, +.extra-sheet-grid .Spreadsheet__data-viewer * { + color: #000 !important; +} + @media (pointer: coarse) { [data-slot="button"], [data-slot="toggle-group-item"], diff --git a/components/admin/extra-sheet-editor.tsx b/components/admin/extra-sheet-editor.tsx index f5c1013..e2e054d 100644 --- a/components/admin/extra-sheet-editor.tsx +++ b/components/admin/extra-sheet-editor.tsx @@ -1,18 +1,12 @@ "use client"; import { - ArrowDownIcon, - ArrowLeftIcon, - ArrowRightIcon, - ArrowUpIcon, - Columns3Icon, GripHorizontalIcon, GripVerticalIcon, PlusIcon, PencilIcon, PaletteIcon, Redo2Icon, - Rows3Icon, Trash2Icon, Undo2Icon, } from "lucide-react"; @@ -57,23 +51,12 @@ import { DialogHeader, DialogTitle, } from "@/components/ui/dialog"; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuGroup, - DropdownMenuItem, - DropdownMenuLabel, - DropdownMenuSeparator, - DropdownMenuTrigger, -} from "@/components/ui/dropdown-menu"; import { Field, FieldGroup, FieldLabel } from "@/components/ui/field"; import { Input } from "@/components/ui/input"; import { Kbd } from "@/components/ui/kbd"; import { addExtraSheetColumn, addExtraSheetRow, - deleteExtraSheetColumn, - deleteExtraSheetRow, extraSheetToMatrix, matrixToExtraSheet, moveExtraSheetColumn, @@ -92,7 +75,6 @@ import { } from "@/lib/rich-text"; import { cn } from "@/lib/utils"; -type DeleteTarget = "column" | "row" | null; interface SheetHistory { items: ExtraSheet[]; index: number; @@ -132,20 +114,36 @@ function LiteralDataViewer({ cell }: { cell?: { value?: unknown; backgroundColor ); } -function DialogDataEditor({ +function InlineDataEditor({ cell, - row, - column, - exitEditMode, - onEdit, -}: DataEditorProps<{ value: string }> & { - onEdit: (point: Point, value: string) => void; -}) { + onChange, +}: DataEditorProps<{ value: string }>) { + const inputRef = useRef(null); + const text = useMemo(() => { + const document = new DOMParser().parseFromString( + normalizeExtraRichText(String(cell?.value ?? "")), + "text/html", + ); + document.querySelectorAll("br").forEach((br) => br.replaceWith("\n")); + document.querySelectorAll("p + p").forEach((p) => p.prepend("\n")); + return document.body.textContent ?? ""; + }, [cell?.value]); useEffect(() => { - onEdit({ row, column }, String(cell?.value ?? "")); - exitEditMode(); - }, [cell?.value, column, exitEditMode, onEdit, row]); - return ; + const input = inputRef.current; + input?.focus(); + input?.setSelectionRange(input.value.length, input.value.length); + }, []); + return ( +
+ onChange({ ...cell, value: event.target.value })} + /> +
+ ); } function EditableColumnIndicator({ @@ -244,7 +242,6 @@ export function ExtraSheetEditor({ const [labelDialogOpen, setLabelDialogOpen] = useState(false); const [renaming, setRenaming] = useState(false); const [columnLabel, setColumnLabel] = useState(""); - const [deleteTarget, setDeleteTarget] = useState(null); const [removeOpen, setRemoveOpen] = useState(false); const [cellDialogOpen, setCellDialogOpen] = useState(false); const [cellDraft, setCellDraft] = useState(""); @@ -411,9 +408,6 @@ export function ExtraSheetEditor({ const rowIndicator = useCallback((props: RowIndicatorProps) => ( ), [value.rows]); - const dataEditor = useCallback((props: DataEditorProps<{ value: string }>) => ( - - ), [openCellEditorAt]); return (
ล้างสีพื้นหลัง - - } - > - - แถว {active.row + 1} - - - - จัดการแถว {active.row + 1} - { - moveRow(active.row, active.row - 1); - }} - > - ย้ายขึ้น - - { - moveRow(active.row, active.row + 1); - }} - > - ย้ายลง - - - - - setDeleteTarget("row")} - > - ลบแถว - - - - - - } - > - - {activeColumn?.label ?? "คอลัมน์"} - - - - {activeColumn?.label} - openRenameColumn()}>แก้ไขชื่อ - { - moveColumn(active.column, active.column - 1); - }} - > - ย้ายไปทางซ้าย - - { - moveColumn(active.column, active.column + 1); - }} - > - ย้ายไปทางขวา - - - - - setDeleteTarget("column")} - > - ลบคอลัมน์ - - - -
-
+
{ + if ((event.target as HTMLElement).closest(".Spreadsheet__active-cell--view")) { + event.stopPropagation(); + } + }} + onDoubleClickCapture={(event) => { + if ((event.target as HTMLElement).closest(".Spreadsheet__cell, .Spreadsheet__active-cell")) { + event.preventDefault(); + event.stopPropagation(); + openCellEditorAt(active); + } + }} + > { setActive(point); setSelectedCount(1); @@ -682,23 +611,6 @@ export function ExtraSheetEditor({ - { if (!open) setDeleteTarget(null); }} - title={deleteTarget === "column" ? `ลบ ${activeColumn?.label}?` : `ลบแถว ${active.row + 1}?`} - description="ข้อมูลในรายการนี้จะถูกลบออกจากตาราง" - showSuccessToast={false} - onConfirm={() => { - if (deleteTarget === "column") { - commitSheet(deleteExtraSheetColumn(value, active.column)); - activateOnly({ ...active, column: Math.max(0, active.column - 1) }); - } else if (deleteTarget === "row") { - commitSheet(deleteExtraSheetRow(value, active.row)); - activateOnly({ ...active, row: Math.max(0, active.row - 1) }); - } - setDeleteTarget(null); - }} - />