"use client" import { useRef, useState } from "react" import type { Editor } from "@tiptap/react" import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuSeparator, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, } from "@/components/ui/context-menu" import { focusEditorAtPointer } from "@/lib/drive/focus-editor-at-pointer" import { docsClearTableCellBorders, docsDefaultTableBorder, docsSetTableAlignment, docsSetTableCellBackground, docsSetTableCellBordersAll, docsSetTableCellVerticalAlign, docsSetTableRowHeight, docsTableCanMerge, docsTableCanSplit, } from "@/lib/drive/docs-table-actions" import { DOCS_TABLE_BORDER_COLOR_PRESETS, DOCS_TABLE_CELL_BACKGROUND_PRESETS, } from "@/lib/drive/docs-table-types" export function DocsTableContextMenu({ editor, disabled, children, }: { editor: Editor disabled?: boolean children: React.ReactNode }) { const pointerRef = useRef<{ x: number; y: number } | null>(null) const [tableMenuActive, setTableMenuActive] = useState(false) const refreshTableMenuState = () => { const point = pointerRef.current if (point) focusEditorAtPointer(editor, point.x, point.y) setTableMenuActive(editor.isActive("table")) } const canMerge = tableMenuActive && docsTableCanMerge(editor) const canSplit = tableMenuActive && docsTableCanSplit(editor) return ( { if (open) refreshTableMenuState() else setTableMenuActive(false) }} > { pointerRef.current = { x: event.clientX, y: event.clientY } }} > {children} event.preventDefault()} > document.execCommand("cut")}> Couper document.execCommand("copy")}> Copier document.execCommand("paste")}> Coller editor.chain().focus().deleteSelection().run()} > Supprimer {tableMenuActive ? ( <> editor.chain().focus().addRowBefore().run()} > Insérer une ligne au-dessus editor.chain().focus().addRowAfter().run()} > Insérer une ligne en dessous editor.chain().focus().addColumnBefore().run()} > Insérer une colonne à gauche editor.chain().focus().addColumnAfter().run()} > Insérer une colonne à droite editor.chain().focus().mergeCells().run()} > Fusionner les cellules editor.chain().focus().splitCell().run()} > Scinder la cellule Couleur de cellule {DOCS_TABLE_CELL_BACKGROUND_PRESETS.map((preset) => ( docsSetTableCellBackground(editor, preset.color || null) } > {preset.label} ))} Bordures docsSetTableCellBordersAll(editor, docsDefaultTableBorder("#000000")) } > Bordures noires docsClearTableCellBorders(editor)}> Supprimer les bordures {DOCS_TABLE_BORDER_COLOR_PRESETS.slice(0, 6).map((color) => ( docsSetTableCellBordersAll(editor, docsDefaultTableBorder(color)) } > {color} ))} Alignement vertical docsSetTableCellVerticalAlign(editor, "top")} > Haut docsSetTableCellVerticalAlign(editor, "middle")} > Milieu docsSetTableCellVerticalAlign(editor, "bottom")} > Bas Alignement du tableau docsSetTableAlignment(editor, "left")}> Gauche docsSetTableAlignment(editor, "center")}> Centre docsSetTableAlignment(editor, "right")}> Droite Hauteur de ligne docsSetTableRowHeight(editor, "32px")}> Compacte docsSetTableRowHeight(editor, "48px")}> Normale docsSetTableRowHeight(editor, null)}> Automatique editor.chain().focus().toggleHeaderRow().run()} > Ligne d'en-tête editor.chain().focus().toggleHeaderColumn().run()} > Colonne d'en-tête editor.chain().focus().deleteRow().run()} > Supprimer la ligne editor.chain().focus().deleteColumn().run()} > Supprimer la colonne editor.chain().focus().deleteTable().run()} > Supprimer le tableau ) : null} ) }