import { DefaultBlockSchema, DefaultInlineContentSchema, DefaultStyleSchema, InlineContentSchema, StyleSchema, } from "@blocknote/core"; import { TableHandlesExtension } from "@blocknote/core/extensions"; import { useComponentsContext } from "../../../../editor/ComponentsContext.js"; import { useBlockNoteEditor } from "../../../../hooks/useBlockNoteEditor.js"; import { useExtension, useExtensionState, } from "../../../../hooks/useExtension.js"; import { useDictionary } from "../../../../i18n/dictionary.js"; export const TableHeaderRowButton = < I extends InlineContentSchema = DefaultInlineContentSchema, S extends StyleSchema = DefaultStyleSchema, >(props: { orientation: "row" | "column"; }) => { const Components = useComponentsContext()!; const dict = useDictionary(); const editor = useBlockNoteEditor< { table: DefaultBlockSchema["table"] }, I, S >(); const tableHandles = useExtension(TableHandlesExtension); const { block, index } = useExtensionState(TableHandlesExtension, { selector: (state) => ({ block: state?.block, index: props.orientation === "column" ? state?.colIndex : state?.rowIndex, }), }); if ( tableHandles === undefined || block === undefined || index !== 0 || props.orientation !== "row" || !editor.settings.tables.headers ) { return null; } // We only support 1 header row for now const isHeaderRow = Boolean(block.content.headerRows); return ( { editor.updateBlock(block, { ...block, content: { ...block.content, headerRows: isHeaderRow ? undefined : 1, } as any, }); }} > {dict.drag_handle.header_row_menuitem} ); }; export const TableHeaderColumnButton = < I extends InlineContentSchema = DefaultInlineContentSchema, S extends StyleSchema = DefaultStyleSchema, >(props: { orientation: "row" | "column"; }) => { const Components = useComponentsContext()!; const dict = useDictionary(); const editor = useBlockNoteEditor< { table: DefaultBlockSchema["table"] }, I, S >(); const tableHandles = useExtension(TableHandlesExtension); const block = useExtensionState(TableHandlesExtension, { selector: (state) => state?.block, }); const index = useExtensionState(TableHandlesExtension, { selector: (state) => props.orientation === "column" ? state?.colIndex : state?.rowIndex, }); if ( !tableHandles || index !== 0 || !block || props.orientation !== "column" || !editor.settings.tables.headers ) { return null; } // We only support 1 header column for now const isHeaderColumn = Boolean(block.content.headerCols); return ( { editor.updateBlock(block, { ...block, content: { ...block.content, headerCols: isHeaderColumn ? undefined : 1, } as any, }); }} > {dict.drag_handle.header_column_menuitem} ); };