@quantlab/handsontable
Version:
Spreadsheet-like data grid editor that provides copy/paste functionality compatible with Excel/Google Docs
268 lines (211 loc) • 8.21 kB
JavaScript
'use strict';
exports.__esModule = true;
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _element = require('./../../../helpers/dom/element');
var _border2 = require('./border');
var _border3 = _interopRequireDefault(_border2);
var _coords = require('./cell/coords');
var _coords2 = _interopRequireDefault(_coords);
var _range = require('./cell/range');
var _range2 = _interopRequireDefault(_range);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/**
* @class Selection
*/
var Selection = function () {
/**
* @param {Object} settings
* @param {CellRange} cellRange
*/
function Selection(settings, cellRange) {
_classCallCheck(this, Selection);
this.settings = settings;
this.cellRange = cellRange || null;
this.instanceBorders = {};
}
/**
* Each Walkontable clone requires it's own border for every selection. This method creates and returns selection
* borders per instance
*
* @param {Walkontable} wotInstance
* @returns {Border}
*/
_createClass(Selection, [{
key: 'getBorder',
value: function getBorder(wotInstance) {
if (this.instanceBorders[wotInstance.guid]) {
return this.instanceBorders[wotInstance.guid];
}
// where is this returned?
this.instanceBorders[wotInstance.guid] = new _border3.default(wotInstance, this.settings);
}
/**
* Checks if selection is empty
*
* @returns {Boolean}
*/
}, {
key: 'isEmpty',
value: function isEmpty() {
return this.cellRange === null;
}
/**
* Adds a cell coords to the selection
*
* @param {CellCoords} coords
*/
}, {
key: 'add',
value: function add(coords) {
if (this.isEmpty()) {
this.cellRange = new _range2.default(coords, coords, coords);
} else {
this.cellRange.expand(coords);
}
}
/**
* If selection range from or to property equals oldCoords, replace it with newCoords. Return boolean
* information about success
*
* @param {CellCoords} oldCoords
* @param {CellCoords} newCoords
* @returns {Boolean}
*/
}, {
key: 'replace',
value: function replace(oldCoords, newCoords) {
if (!this.isEmpty()) {
if (this.cellRange.from.isEqual(oldCoords)) {
this.cellRange.from = newCoords;
return true;
}
if (this.cellRange.to.isEqual(oldCoords)) {
this.cellRange.to = newCoords;
return true;
}
}
return false;
}
/**
* Clears selection
*/
}, {
key: 'clear',
value: function clear() {
this.cellRange = null;
}
/**
* Returns the top left (TL) and bottom right (BR) selection coordinates
*
* @returns {Array} Returns array of coordinates for example `[1, 1, 5, 5]`
*/
}, {
key: 'getCorners',
value: function getCorners() {
var topLeft = this.cellRange.getTopLeftCorner();
var bottomRight = this.cellRange.getBottomRightCorner();
return [topLeft.row, topLeft.col, bottomRight.row, bottomRight.col];
}
/**
* Adds class name to cell element at given coords
*
* @param {Walkontable} wotInstance Walkontable instance
* @param {Number} sourceRow Cell row coord
* @param {Number} sourceColumn Cell column coord
* @param {String} className Class name
*/
}, {
key: 'addClassAtCoords',
value: function addClassAtCoords(wotInstance, sourceRow, sourceColumn, className) {
var TD = wotInstance.wtTable.getCell(new _coords2.default(sourceRow, sourceColumn));
if ((typeof TD === 'undefined' ? 'undefined' : _typeof(TD)) === 'object') {
(0, _element.addClass)(TD, className);
}
}
/**
* @param wotInstance
*/
}, {
key: 'draw',
value: function draw(wotInstance) {
if (this.isEmpty()) {
if (this.settings.border) {
var border = this.getBorder(wotInstance);
if (border) {
border.disappear();
}
}
return;
}
var renderedRows = wotInstance.wtTable.getRenderedRowsCount();
var renderedColumns = wotInstance.wtTable.getRenderedColumnsCount();
var corners = this.getCorners();
var sourceRow = void 0,
sourceCol = void 0,
TH = void 0;
for (var column = 0; column < renderedColumns; column++) {
sourceCol = wotInstance.wtTable.columnFilter.renderedToSource(column);
if (sourceCol >= corners[1] && sourceCol <= corners[3]) {
TH = wotInstance.wtTable.getColumnHeader(sourceCol);
if (TH) {
var newClasses = [];
if (this.settings.highlightHeaderClassName) {
newClasses.push(this.settings.highlightHeaderClassName);
}
if (this.settings.highlightColumnClassName) {
newClasses.push(this.settings.highlightColumnClassName);
}
(0, _element.addClass)(TH, newClasses);
}
}
}
for (var row = 0; row < renderedRows; row++) {
sourceRow = wotInstance.wtTable.rowFilter.renderedToSource(row);
if (sourceRow >= corners[0] && sourceRow <= corners[2]) {
TH = wotInstance.wtTable.getRowHeader(sourceRow);
if (TH) {
var _newClasses = [];
if (this.settings.highlightHeaderClassName) {
_newClasses.push(this.settings.highlightHeaderClassName);
}
if (this.settings.highlightRowClassName) {
_newClasses.push(this.settings.highlightRowClassName);
}
(0, _element.addClass)(TH, _newClasses);
}
}
for (var _column = 0; _column < renderedColumns; _column++) {
sourceCol = wotInstance.wtTable.columnFilter.renderedToSource(_column);
if (sourceRow >= corners[0] && sourceRow <= corners[2] && sourceCol >= corners[1] && sourceCol <= corners[3]) {
// selected cell
if (this.settings.className) {
this.addClassAtCoords(wotInstance, sourceRow, sourceCol, this.settings.className);
}
} else if (sourceRow >= corners[0] && sourceRow <= corners[2]) {
// selection is in this row
if (this.settings.highlightRowClassName) {
this.addClassAtCoords(wotInstance, sourceRow, sourceCol, this.settings.highlightRowClassName);
}
} else if (sourceCol >= corners[1] && sourceCol <= corners[3]) {
// selection is in this column
if (this.settings.highlightColumnClassName) {
this.addClassAtCoords(wotInstance, sourceRow, sourceCol, this.settings.highlightColumnClassName);
}
}
}
}
wotInstance.getSetting('onBeforeDrawBorders', corners, this.settings.className);
if (this.settings.border) {
var _border = this.getBorder(wotInstance);
if (_border) {
// warning! border.appear modifies corners!
_border.appear(corners);
}
}
}
}]);
return Selection;
}();
exports.default = Selection;