UNPKG

@atlaskit/editor-plugin-table

Version:

Table plugin for the @atlaskit/editor

128 lines (127 loc) 4.98 kB
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray"; import { mapChildren } from '@atlaskit/editor-common/utils'; import { TableMap } from '@atlaskit/editor-tables/table-map'; import { findTable } from '@atlaskit/editor-tables/utils'; export var isIsolating = function isIsolating(node) { return !!node.type.spec.isolating; }; export var containsHeaderColumn = function containsHeaderColumn(table) { var map = TableMap.get(table); // Get cell positions for first column. var cellPositions = map.cellsInRect({ left: 0, top: 0, right: 1, bottom: map.height }); for (var i = 0; i < cellPositions.length; i++) { try { var cell = table.nodeAt(cellPositions[i]); if (cell && cell.type !== table.type.schema.nodes.tableHeader) { return false; } } catch (e) { return false; } } return true; }; export var containsHeaderRow = function containsHeaderRow(table) { var map = TableMap.get(table); for (var i = 0; i < map.width; i++) { var cell = table.nodeAt(map.map[i]); if (cell && cell.type !== table.type.schema.nodes.tableHeader) { return false; } } return true; }; export var checkIfHeaderColumnEnabled = function checkIfHeaderColumnEnabled(selection) { return filterNearSelection(selection, findTable, containsHeaderColumn, false); }; export var checkIfHeaderRowEnabled = function checkIfHeaderRowEnabled(selection) { return filterNearSelection(selection, findTable, containsHeaderRow, false); }; export var checkIfNumberColumnEnabled = function checkIfNumberColumnEnabled(selection) { return filterNearSelection(selection, findTable, function (table) { return !!table.attrs.isNumberColumnEnabled; }, false); }; export var getTableWidth = function getTableWidth(node) { return getTableWidths(node).reduce(function (acc, current) { return acc + current; }, 0); }; export var tablesHaveDifferentColumnWidths = function tablesHaveDifferentColumnWidths(currentTable, previousTable) { var currentTableWidths = getTableWidths(currentTable); var previousTableWidths = getTableWidths(previousTable); if (currentTableWidths.length !== previousTableWidths.length) { return true; } var sameWidths = currentTableWidths.every(function (value, index) { return value === previousTableWidths[index]; }); return sameWidths === false; }; export var tablesHaveDifferentNoOfColumns = function tablesHaveDifferentNoOfColumns(currentTable, previousTable) { var prevMap = TableMap.get(previousTable); var currentMap = TableMap.get(currentTable); return prevMap.width !== currentMap.width; }; export var tablesHaveDifferentNoOfRows = function tablesHaveDifferentNoOfRows(currentTable, previousTable) { var prevMap = TableMap.get(previousTable); var currentMap = TableMap.get(currentTable); return prevMap.height !== currentMap.height; }; function filterNearSelection(selection, findNode, predicate, defaultValue) { var found = findNode(selection); if (!found) { return defaultValue; } return predicate(found.node, found.pos); } function getTableWidths(node) { if (!node.content.firstChild) { return []; } var tableWidths = []; node.content.firstChild.content.forEach(function (cell) { if (Array.isArray(cell.attrs.colwidth)) { var colspan = cell.attrs.colspan || 1; tableWidths.push.apply(tableWidths, _toConsumableArray(cell.attrs.colwidth.slice(0, colspan))); } }); return tableWidths; } export var isTableNested = function isTableNested(state) { var tablePos = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var parent = state.doc.resolve(tablePos).parent; var nodeTypes = state.schema.nodes; return parent.type === nodeTypes.layoutColumn || parent.type === nodeTypes.expand || parent.type === nodeTypes.bodiedExtension || parent.type === nodeTypes.extensionFrame || parent.type === nodeTypes.tableHeader || parent.type === nodeTypes.tableCell; }; export var isTableNestedInMoreThanOneNode = function isTableNestedInMoreThanOneNode(state) { var tablePos = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; return state.doc.resolve(tablePos).depth > 2; }; var anyChildCellMergedAcrossRow = function anyChildCellMergedAcrossRow(node) { return mapChildren(node, function (child) { return child.attrs.rowspan || 0; }).some(function (rowspan) { return rowspan > 1; }); }; /** * Check if a given node is a header row with this definition: * - all children are tableHeader cells * - no table cells have been have merged with other table row cells * * @param node ProseMirror node * @return boolean if it meets definition */ export var supportedHeaderRow = function supportedHeaderRow(node) { var allHeaders = mapChildren(node, function (child) { return child.type.name === 'tableHeader'; }).every(Boolean); var someMerged = anyChildCellMergedAcrossRow(node); return allHeaders && !someMerged; };