@quantlab/handsontable
Version:
Spreadsheet-like data grid editor that provides copy/paste functionality compatible with Excel/Google Docs
146 lines (120 loc) • 4.82 kB
JavaScript
;
exports.__esModule = true;
exports.DIRECTIONS = undefined;
exports.getDeltas = getDeltas;
exports.getDragDirectionAndRange = getDragDirectionAndRange;
exports.getMappedFillHandleSetting = getMappedFillHandleSetting;
var _object = require('./../../helpers/object');
var _mixed = require('./../../helpers/mixed');
var _src = require('./../../3rdparty/walkontable/src');
var DIRECTIONS = exports.DIRECTIONS = {
horizontal: 'horizontal',
vertical: 'vertical'
};
/**
* Get deltas array.
*
* @param {CellCoords} start
* @param {CellCoords} end
* @param {Array} data
* @param {String} direction
* @returns {Array}
*/
function getDeltas(start, end, data, direction) {
var rowsLength = data.length;
var columnsLength = data ? data[0].length : 0;
var deltas = [];
var diffRow = end.row - start.row;
var diffCol = end.col - start.col;
if (['down', 'up'].indexOf(direction) !== -1) {
var arr = [];
for (var col = 0; col <= diffCol; col++) {
var startValue = parseInt(data[0][col], 10);
var endValue = parseInt(data[rowsLength - 1][col], 10);
var delta = (direction === 'down' ? endValue - startValue : startValue - endValue) / (rowsLength - 1) || 0;
arr.push(delta);
}
deltas.push(arr);
}
if (['right', 'left'].indexOf(direction) !== -1) {
for (var row = 0; row <= diffRow; row++) {
var _startValue = parseInt(data[row][0], 10);
var _endValue = parseInt(data[row][columnsLength - 1], 10);
var _delta = (direction === 'right' ? _endValue - _startValue : _startValue - _endValue) / (columnsLength - 1) || 0;
deltas.push([_delta]);
}
}
return deltas;
}
/**
* Get direction between positions and cords of selections difference (drag area)
*
* @param {Array} startSelection
* @param {Array} endSelection
* @returns {{direction: String, start: CellCoords, end: CellCoords}}
*/
function getDragDirectionAndRange(startSelection, endSelection) {
var startOfDragCoords = void 0,
endOfDragCoords = void 0,
directionOfDrag = void 0;
if (endSelection[0] === startSelection[0] && endSelection[1] < startSelection[1]) {
directionOfDrag = 'left';
startOfDragCoords = new _src.CellCoords(endSelection[0], endSelection[1]);
endOfDragCoords = new _src.CellCoords(endSelection[2], startSelection[1] - 1);
} else if (endSelection[0] === startSelection[0] && endSelection[3] > startSelection[3]) {
directionOfDrag = 'right';
startOfDragCoords = new _src.CellCoords(endSelection[0], startSelection[3] + 1);
endOfDragCoords = new _src.CellCoords(endSelection[2], endSelection[3]);
} else if (endSelection[0] < startSelection[0] && endSelection[1] === startSelection[1]) {
directionOfDrag = 'up';
startOfDragCoords = new _src.CellCoords(endSelection[0], endSelection[1]);
endOfDragCoords = new _src.CellCoords(startSelection[0] - 1, endSelection[3]);
} else if (endSelection[2] > startSelection[2] && endSelection[1] === startSelection[1]) {
directionOfDrag = 'down';
startOfDragCoords = new _src.CellCoords(startSelection[2] + 1, endSelection[1]);
endOfDragCoords = new _src.CellCoords(endSelection[2], endSelection[3]);
}
return {
directionOfDrag: directionOfDrag,
startOfDragCoords: startOfDragCoords,
endOfDragCoords: 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
*/
function getMappedFillHandleSetting(fillHandle) {
var mappedSettings = {};
if (fillHandle === true) {
mappedSettings.directions = Object.keys(DIRECTIONS);
mappedSettings.autoInsertRow = true;
} else if ((0, _object.isObject)(fillHandle)) {
if ((0, _mixed.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 ((0, _mixed.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;
}