@atlaskit/editor-plugin-table
Version:
Table plugin for the @atlaskit/editor
128 lines (127 loc) • 4.98 kB
JavaScript
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;
};