import {arrayEach} from './../../helpers/array'; import {hasClass} from './../../helpers/dom/element'; import {KEY as SEPARATOR} from './predefinedItems/separator'; export function normalizeSelection(selRange) { return { start: selRange.getTopLeftCorner(), end: selRange.getBottomRightCorner() }; } export function isSeparator(cell) { return hasClass(cell, 'htSeparator'); } export function hasSubMenu(cell) { return hasClass(cell, 'htSubmenu'); } export function isDisabled(cell) { return hasClass(cell, 'htDisabled'); } export function isSelectionDisabled(cell) { return hasClass(cell, 'htSelectionDisabled'); } export function getValidSelection(hot) { let selected = hot.getSelected(); if (!selected) { return null; } if (selected[0] < 0) { return null; } return selected; } export function prepareVerticalAlignClass(className, alignment) { if (className.indexOf(alignment) != -1) { return className; } className = className .replace('htTop', '') .replace('htMiddle', '') .replace('htBottom', '') .replace(' ', ''); className += ` ${alignment}`; return className; } export function prepareHorizontalAlignClass(className, alignment) { if (className.indexOf(alignment) != -1) { return className; } className = className .replace('htLeft', '') .replace('htCenter', '') .replace('htRight', '') .replace('htJustify', '') .replace(' ', ''); className += ` ${alignment}`; return className; } export function getAlignmentClasses(range, callback) { const classes = {}; for (let row = range.from.row; row <= range.to.row; row++) { for (let col = range.from.col; col <= range.to.col; col++) { if (!classes[row]) { classes[row] = []; } classes[row][col] = callback(row, col); } } return classes; } export function align(range, type, alignment, cellDescriptor, propertySetter) { if (range.from.row == range.to.row && range.from.col == range.to.col) { applyAlignClassName(range.from.row, range.from.col, type, alignment, cellDescriptor, propertySetter); } else { for (let row = range.from.row; row <= range.to.row; row++) { for (let col = range.from.col; col <= range.to.col; col++) { applyAlignClassName(row, col, type, alignment, cellDescriptor, propertySetter); } } } } function applyAlignClassName(row, col, type, alignment, cellDescriptor, propertySetter) { let cellMeta = cellDescriptor(row, col); let className = alignment; if (cellMeta.className) { if (type === 'vertical') { className = prepareVerticalAlignClass(cellMeta.className, alignment); } else { className = prepareHorizontalAlignClass(cellMeta.className, alignment); } } propertySetter(row, col, 'className', className); } export function checkSelectionConsistency(range, comparator) { let result = false; if (range) { range.forAll((row, col) => { if (comparator(row, col)) { result = true; return false; } }); } return result; } export function markLabelAsSelected(label) { // workaround for https://github.com/handsontable/handsontable/issues/1946 return `${String.fromCharCode(10003)}${label}`; } export function isItemHidden(item, instance) { return !item.hidden || !(typeof item.hidden == 'function' && item.hidden.call(instance)); } function shiftSeparators(items, separator) { let result = items.slice(0); for (let i = 0; i < result.length;) { if (result[i].name === separator) { result.shift(); } else { break; } } return result; } function popSeparators(items, separator) { let result = items.slice(0); result.reverse(); result = shiftSeparators(result, separator); result.reverse(); return result; } function removeDuplicatedSeparators(items) { let result = []; arrayEach(items, (value, index) => { if (index > 0) { if (result[result.length - 1].name !== value.name) { result.push(value); } } else { result.push(value); } }); return result; } export function filterSeparators(items, separator = SEPARATOR) { let result = items.slice(0); result = shiftSeparators(result, separator); result = popSeparators(result, separator); result = removeDuplicatedSeparators(result); return result; }