handsontable
Version:
Handsontable is a JavaScript Spreadsheet Component available for React, Angular and Vue.
356 lines (307 loc) • 14 kB
JavaScript
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
import "core-js/modules/es.array.fill.js";
import "core-js/modules/es.array.iterator.js";
import "core-js/modules/es.map.js";
import "core-js/modules/es.object.to-string.js";
import "core-js/modules/es.string.iterator.js";
import "core-js/modules/web.dom-collections.iterator.js";
import "core-js/modules/es.array.includes.js";
import "core-js/modules/es.string.includes.js";
import "core-js/modules/es.symbol.iterator.js";
import "core-js/modules/es.symbol.js";
import "core-js/modules/es.symbol.description.js";
import "core-js/modules/es.array.concat.js";
import "core-js/modules/es.object.keys.js";
import "core-js/modules/es.array.filter.js";
import "core-js/modules/es.object.get-own-property-descriptor.js";
import "core-js/modules/web.dom-collections.for-each.js";
import "core-js/modules/es.object.get-own-property-descriptors.js";
import "core-js/modules/es.array.from.js";
import "core-js/modules/es.array.slice.js";
import "core-js/modules/es.function.name.js";
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
import { createHighlight } from "./types/index.mjs";
import { ACTIVE_HEADER_TYPE, AREA_TYPE, CELL_TYPE, CUSTOM_SELECTION_TYPE, FILL_TYPE, HEADER_TYPE } from "./constants.mjs";
import { arrayEach } from "./../../helpers/array.mjs";
/**
* Highlight class responsible for managing Walkontable Selection classes.
*
* With Highlight object you can manipulate four different highlight types:
* - `cell` can be added only to a single cell at a time and it defines currently selected cell;
* - `fill` can occur only once and its highlight defines selection of autofill functionality (managed by the plugin with the same name);
* - `areas` can be added to multiple cells at a time. This type highlights selected cell or multiple cells.
* The multiple cells have to be defined as an uninterrupted order (regular shape). Otherwise, the new layer of
* that type should be created to manage not-consecutive selection;
* - `header` can occur multiple times. This type is designed to highlight only headers. Like `area` type it
* can appear with multiple highlights (accessed under different level layers).
*
* @class Highlight
* @util
*/
var Highlight = /*#__PURE__*/function () {
function Highlight(options) {
_classCallCheck(this, Highlight);
/**
* Options consumed by Highlight class and Walkontable Selection classes.
*
* @type {object}
*/
this.options = options;
/**
* The property which describes which layer level of the visual selection will be modified.
* This option is valid only for `area` and `header` highlight types which occurs multiple times on
* the table (as a non-consecutive selection).
*
* An order of the layers is the same as the order of added new non-consecutive selections.
*
* @type {number}
* @default 0
*/
this.layerLevel = 0;
/**
* `cell` highlight object which describes attributes for the currently selected cell.
* It can only occur only once on the table.
*
* @type {Selection}
*/
this.cell = createHighlight(CELL_TYPE, options);
/**
* `fill` highlight object which describes attributes for the borders for autofill functionality.
* It can only occur only once on the table.
*
* @type {Selection}
*/
this.fill = createHighlight(FILL_TYPE, options);
/**
* Collection of the `area` highlights. That objects describes attributes for the borders and selection of
* the multiple selected cells. It can occur multiple times on the table.
*
* @type {Map.<number, Selection>}
*/
this.areas = new Map();
/**
* Collection of the `header` highlights. That objects describes attributes for the selection of
* the multiple selected rows and columns in the table header. It can occur multiple times on the table.
*
* @type {Map.<number, Selection>}
*/
this.headers = new Map();
/**
* Collection of the `active-header` highlights. That objects describes attributes for the selection of
* the multiple selected rows and columns in the table header. The table headers which have selected all items in
* a row will be marked as `active-header`.
*
* @type {Map.<number, Selection>}
*/
this.activeHeaders = new Map();
/**
* Collection of the `custom-selection`, holder for example borders added through CustomBorders plugin.
*
* @type {Selection[]}
*/
this.customSelections = [];
}
/**
* Check if highlight cell rendering is disabled for specified highlight type.
*
* @param {string} highlightType Highlight type. Possible values are: `cell`, `area`, `fill` or `header`.
* @param {CellCoords} coords The CellCoords instance with defined visual coordinates.
* @returns {boolean}
*/
_createClass(Highlight, [{
key: "isEnabledFor",
value: function isEnabledFor(highlightType, coords) {
var type = highlightType; // Legacy compatibility.
if (highlightType === CELL_TYPE) {
type = 'current'; // One from settings for `disableVisualSelection` up to Handsontable 0.36/Handsontable Pro 1.16.0.
}
var disableHighlight = this.options.disabledCellSelection(coords.row, coords.col);
if (typeof disableHighlight === 'string') {
disableHighlight = [disableHighlight];
}
return disableHighlight === false || Array.isArray(disableHighlight) && !disableHighlight.includes(type);
}
/**
* Set a new layer level to make access to the desire `area` and `header` highlights.
*
* @param {number} [level=0] Layer level to use.
* @returns {Highlight}
*/
}, {
key: "useLayerLevel",
value: function useLayerLevel() {
var level = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
this.layerLevel = level;
return this;
}
/**
* Get Walkontable Selection instance created for controlling highlight of the currently selected/edited cell.
*
* @returns {Selection}
*/
}, {
key: "getCell",
value: function getCell() {
return this.cell;
}
/**
* Get Walkontable Selection instance created for controlling highlight of the autofill functionality.
*
* @returns {Selection}
*/
}, {
key: "getFill",
value: function getFill() {
return this.fill;
}
/**
* Get or create (if not exist in the cache) Walkontable Selection instance created for controlling highlight
* of the multiple selected cells.
*
* @returns {Selection}
*/
}, {
key: "createOrGetArea",
value: function createOrGetArea() {
var layerLevel = this.layerLevel;
var area;
if (this.areas.has(layerLevel)) {
area = this.areas.get(layerLevel);
} else {
area = createHighlight(AREA_TYPE, _objectSpread({
layerLevel: layerLevel
}, this.options));
this.areas.set(layerLevel, area);
}
return area;
}
/**
* Get all Walkontable Selection instances which describes the state of the visual highlight of the cells.
*
* @returns {Selection[]}
*/
}, {
key: "getAreas",
value: function getAreas() {
return _toConsumableArray(this.areas.values());
}
/**
* Get or create (if not exist in the cache) Walkontable Selection instance created for controlling highlight
* of the multiple selected header cells.
*
* @returns {Selection}
*/
}, {
key: "createOrGetHeader",
value: function createOrGetHeader() {
var layerLevel = this.layerLevel;
var header;
if (this.headers.has(layerLevel)) {
header = this.headers.get(layerLevel);
} else {
header = createHighlight(HEADER_TYPE, _objectSpread({}, this.options));
this.headers.set(layerLevel, header);
}
return header;
}
/**
* Get all Walkontable Selection instances which describes the state of the visual highlight of the headers.
*
* @returns {Selection[]}
*/
}, {
key: "getHeaders",
value: function getHeaders() {
return _toConsumableArray(this.headers.values());
}
/**
* Get or create (if not exist in the cache) Walkontable Selection instance created for controlling highlight
* of the multiple selected active header cells.
*
* @returns {Selection}
*/
}, {
key: "createOrGetActiveHeader",
value: function createOrGetActiveHeader() {
var layerLevel = this.layerLevel;
var header;
if (this.activeHeaders.has(layerLevel)) {
header = this.activeHeaders.get(layerLevel);
} else {
header = createHighlight(ACTIVE_HEADER_TYPE, _objectSpread({}, this.options));
this.activeHeaders.set(layerLevel, header);
}
return header;
}
/**
* Get all Walkontable Selection instances which describes the state of the visual highlight of the active headers.
*
* @returns {Selection[]}
*/
}, {
key: "getActiveHeaders",
value: function getActiveHeaders() {
return _toConsumableArray(this.activeHeaders.values());
}
/**
* Get Walkontable Selection instance created for controlling highlight of the custom selection functionality.
*
* @returns {Selection}
*/
}, {
key: "getCustomSelections",
value: function getCustomSelections() {
return _toConsumableArray(this.customSelections.values());
}
/**
* Add selection to the custom selection instance. The new selection are added to the end of the selection collection.
*
* @param {object} selectionInstance The selection instance.
*/
}, {
key: "addCustomSelection",
value: function addCustomSelection(selectionInstance) {
this.customSelections.push(createHighlight(CUSTOM_SELECTION_TYPE, _objectSpread(_objectSpread({}, this.options), selectionInstance)));
}
/**
* Perform cleaning visual highlights for the whole table.
*/
}, {
key: "clear",
value: function clear() {
this.cell.clear();
this.fill.clear();
arrayEach(this.areas.values(), function (highlight) {
return void highlight.clear();
});
arrayEach(this.headers.values(), function (highlight) {
return void highlight.clear();
});
arrayEach(this.activeHeaders.values(), function (highlight) {
return void highlight.clear();
});
}
/**
* This object can be iterate over using `for of` syntax or using internal `arrayEach` helper.
*
* @returns {Selection[]}
*/
}, {
key: Symbol.iterator,
value: function value() {
return [this.cell, this.fill].concat(_toConsumableArray(this.areas.values()), _toConsumableArray(this.headers.values()), _toConsumableArray(this.activeHeaders.values()), _toConsumableArray(this.customSelections))[Symbol.iterator]();
}
}]);
return Highlight;
}();
export default Highlight;