UNPKG

tiptap-extensions

Version:

Extensions for tiptap

96 lines (84 loc) 2.23 kB
import { Node } from 'tiptap' import { tableEditing, columnResizing, goToNextCell, addColumnBefore, addColumnAfter, deleteColumn, addRowBefore, addRowAfter, deleteRow, deleteTable, mergeCells, splitCell, toggleHeaderColumn, toggleHeaderRow, toggleHeaderCell, setCellAttr, fixTables, } from 'prosemirror-tables' import { createTable } from 'tiptap-utils' import { TextSelection } from 'prosemirror-state' import TableNodes from './TableNodes' export default class Table extends Node { get name() { return 'table' } get defaultOptions() { return { resizable: false, } } get schema() { return TableNodes.table } commands({ schema }) { return { createTable: ({ rowsCount, colsCount, withHeaderRow }) => ( (state, dispatch) => { const offset = state.tr.selection.anchor + 1 const nodes = createTable(schema, rowsCount, colsCount, withHeaderRow) const tr = state.tr.replaceSelectionWith(nodes).scrollIntoView() const resolvedPos = tr.doc.resolve(offset) tr.setSelection(TextSelection.near(resolvedPos)) dispatch(tr) } ), addColumnBefore: () => addColumnBefore, addColumnAfter: () => addColumnAfter, deleteColumn: () => deleteColumn, addRowBefore: () => addRowBefore, addRowAfter: () => addRowAfter, deleteRow: () => deleteRow, deleteTable: () => deleteTable, toggleCellMerge: () => ( (state, dispatch) => { if (mergeCells(state, dispatch)) { return } splitCell(state, dispatch) } ), mergeCells: () => mergeCells, splitCell: () => splitCell, toggleHeaderColumn: () => toggleHeaderColumn, toggleHeaderRow: () => toggleHeaderRow, toggleHeaderCell: () => toggleHeaderCell, setCellAttr: ({ name, value }) => setCellAttr(name, value), fixTables: () => fixTables, } } keys() { return { Tab: goToNextCell(1), 'Shift-Tab': goToNextCell(-1), } } get plugins() { return [ ...(this.options.resizable ? [columnResizing()] : []), tableEditing(), ] } }