UNPKG

handsontable

Version:

Handsontable is a JavaScript Data Grid available for React, Angular and Vue.

88 lines (85 loc) 3.55 kB
import { isObject } from "../../helpers/object.mjs"; import { isDefined } from "../../helpers/mixed.mjs"; export const DIRECTIONS = { horizontal: 'horizontal', vertical: 'vertical' }; /** * Get direction between positions and cords of selections difference (drag area). * * @param {Array} startSelection The coordinates where the selection starts. * @param {Array} endSelection The coordinates where the selection ends. * @param {Function} cellCoordsFactory The function factory for CellCoords objects. * @returns {{direction: string, start: CellCoords, end: CellCoords}} */ export function getDragDirectionAndRange(startSelection, endSelection, cellCoordsFactory) { let startOfDragCoords; let endOfDragCoords; let directionOfDrag; if (endSelection[0] === startSelection[0] && endSelection[1] < startSelection[1]) { directionOfDrag = 'left'; startOfDragCoords = cellCoordsFactory(endSelection[0], endSelection[1]); endOfDragCoords = cellCoordsFactory(endSelection[2], startSelection[1] - 1); } else if (endSelection[2] === startSelection[2] && endSelection[0] === startSelection[0] && endSelection[3] > startSelection[3]) { directionOfDrag = 'right'; startOfDragCoords = cellCoordsFactory(endSelection[0], startSelection[3] + 1); endOfDragCoords = cellCoordsFactory(endSelection[2], endSelection[3]); } else if (endSelection[0] < startSelection[0] && endSelection[1] === startSelection[1]) { directionOfDrag = 'up'; startOfDragCoords = cellCoordsFactory(endSelection[0], endSelection[1]); endOfDragCoords = cellCoordsFactory(startSelection[0] - 1, endSelection[3]); } else if (endSelection[2] > startSelection[2] && endSelection[1] === startSelection[1]) { directionOfDrag = 'down'; startOfDragCoords = cellCoordsFactory(startSelection[2] + 1, endSelection[1]); endOfDragCoords = cellCoordsFactory(endSelection[2], endSelection[3]); } if (startOfDragCoords) { startOfDragCoords.normalize(); } if (endOfDragCoords) { endOfDragCoords.normalize(); } return { directionOfDrag, startOfDragCoords, endOfDragCoords }; } /** * Get mapped FillHandle setting containing information about * allowed FillHandle directions and if allowed is automatic insertion of rows on drag. * * @param {boolean|object} fillHandle Property of Handsontable settings. * @returns {{directions: Array, autoInsertRow: boolean}} Object allowing access to information * about FillHandle in more useful way. */ export function getMappedFillHandleSetting(fillHandle) { const mappedSettings = {}; if (fillHandle === true) { mappedSettings.directions = Object.keys(DIRECTIONS); mappedSettings.autoInsertRow = true; } else if (isObject(fillHandle)) { if (isDefined(fillHandle.autoInsertRow)) { // autoInsertRow for horizontal direction will be always false if (fillHandle.direction === DIRECTIONS.horizontal) { mappedSettings.autoInsertRow = false; } else { mappedSettings.autoInsertRow = fillHandle.autoInsertRow; } } else { mappedSettings.autoInsertRow = false; } if (isDefined(fillHandle.direction)) { mappedSettings.directions = [fillHandle.direction]; } else { mappedSettings.directions = Object.keys(DIRECTIONS); } } else if (typeof fillHandle === 'string') { mappedSettings.directions = [fillHandle]; mappedSettings.autoInsertRow = true; } else { mappedSettings.directions = []; mappedSettings.autoInsertRow = false; } return mappedSettings; }