88 lines
3.5 KiB
JavaScript
88 lines
3.5 KiB
JavaScript
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;
|
|
} |