UNPKG

@atlaskit/editor-core

Version:

A package contains Atlassian editor core functionality

99 lines (85 loc) 2.87 kB
import { TableMap, Node, Slice, Fragment, Schema, EditorState, EditorView, CellSelection } from '../../prosemirror'; export interface TableRelativePosition { from: number; to: number; } export const getColumnPos = (column, tableNode: Node): TableRelativePosition => { const map = TableMap.get(tableNode); const from = map.positionAt(0, column, tableNode); const to = map.positionAt(map.height - 1, column, tableNode); return {from, to}; }; export const getRowPos = (row, tableNode: Node): TableRelativePosition => { const map = TableMap.get(tableNode); const from = map.positionAt(row, 0, tableNode); const to = map.positionAt(row, map.width - 1, tableNode); return {from, to}; }; export const getTablePos = (tableNode: Node): TableRelativePosition => { const map = TableMap.get(tableNode); const from = map.positionAt(0, 0, tableNode); const to = map.positionAt(map.height - 1, map.width - 1, tableNode); return {from, to}; }; export const createTableNode = (rows: number, columns: number, schema: Schema<any, any>): Node => { const { table, tableRow, tableCell, tableHeader } = schema.nodes; const rowNodes: Node[] = []; for (let i = 0; i < rows; i ++) { const cell = i === 0 ? tableHeader : tableCell; const cellNodes: Node[] = []; for (let j = 0; j < columns; j ++) { cellNodes.push(cell.createAndFill()); } rowNodes.push(tableRow.create(null, Fragment.from(cellNodes))); } return table.create(null, Fragment.from(rowNodes)); }; export const isIsolating = (node: Node): boolean => { return !!node.type.spec.isolating; }; export interface SelectedCells { anchor: number; head: number; } export const getSelectedColumn = (state: EditorState<any>, map: TableMap): SelectedCells => { const { $anchorCell, $headCell } = state.selection as CellSelection; const start = $anchorCell.start(-1); const anchor = map.colCount($anchorCell.pos - start); const head = map.colCount($headCell.pos - start); return { anchor, head }; }; export const getSelectedRow = (state: EditorState<any>): SelectedCells => { const { $anchorCell, $headCell } = state.selection as CellSelection; const anchor = $anchorCell.index(-1); const head = $headCell.index(-1); return { anchor, head }; }; export const containsTable = (view: EditorView, slice: Slice): boolean => { const { table } = view.state.schema.nodes; let tablePresent = false; slice.content.forEach(node => { if (node.type === table) { tablePresent = true; } }); return tablePresent; }; export const containsTableHeader = (view: EditorView, table: Node): boolean => { const { tableHeader } = view.state.schema.nodes; let headerPresent = false; table.content.forEach(row => { if (row.firstChild!.type === tableHeader) { headerPresent = true; } }); return headerPresent; };