UNPKG

handsontable

Version:

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

298 lines (290 loc) • 12.3 kB
"use strict"; exports.__esModule = true; require("core-js/modules/es.error.cause.js"); var _element = require("../../../helpers/dom/element"); var _object = require("../../../helpers/object"); function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /** * @todo Describe options. * @typedef SettingsPure * * @property {Option} facade @todo desc. * @property {Option} ariaTags Option `ariaTags`. * @property {Option} cellRenderer Option `cellRenderer`. * @property {Option} columnHeaders Option `columnHeaders`. * @property {Option} columnWidth Option `columnWidth`. * @property {Option} currentRowClassName Option `currentRowClassName`. * @property {Option} data Option `data`. * @property {Option} defaultColumnWidth Option `defaultColumnWidth`. * @property {Option} externalRowCalculator Option `externalRowCalculator`. * @property {Option} fixedColumnsStart Option `fixedColumnsStart`. * @property {Option} fixedRowsBottom Option `fixedRowsBottom`. * @property {Option} fixedRowsTop Option `fixedRowsTop`. * @property {Option} groups Option `groups`. * @property {Option} hideBorderOnMouseDownOver Option `hideBorderOnMouseDownOver`. * @property {Option} isRtl Option `isRtl`. * @property {Option} isDataViewInstance Option `isDataViewInstance`. * @property {Option} minSpareRows Option `minSpareRows`. * @property {Option} onBeforeHighlightingColumnHeader Option `onBeforeHighlightingColumnHeader`. * @property {Option} onBeforeHighlightingRowHeader Option `onBeforeHighlightingRowHeader`. * @property {Option} onBeforeRemoveCellClassNames Option `onBeforeRemoveCellClassNames`. * @property {Option} preventOverflow Option `preventOverflow`. * @property {Option} preventWheel Option `preventWheel`. * @property {Option} renderAllColumns Option `renderAllColumns`. * @property {Option} renderAllRows Option `renderAllRows`. * @property {Option} rowHeaders Option `rowHeaders`. * @property {Option} rowHeightOption `rowHeight`. * @property {Option} rowHeightByOverlayName Option `rowHeightByOverlayName`. * @property {Option} shouldRenderBottomOverlay Option `shouldRenderBottomOverlay`. * @property {Option} shouldRenderInlineStartOverlay Option `shouldRenderInlineStartOverlay`. * @property {Option} shouldRenderTopOverlay Option `shouldRenderTopOverlay`. * @property {Option} table Option `table`. * @property {Option} totalColumns Option `totalColumns`. * @property {Option} totalRows Option `totalRows`. * @property {?Option} beforeDraw Option `beforeDraw`. * @property {?Option} columnHeaderHeight Option `columnHeaderHeight`. * @property {?Option} currentColumnClassName Option `currentColumnClassName`. * @property {?Option} headerClassName Option `headerClassName`. * @property {?Option} onAfterDrawSelection Option `onAfterDrawSelection`. * @property {?Option} onAfterMomentumScroll Option `onAfterMomentumScroll`. * @property {?Option} onBeforeDrawBorders Option `onBeforeDrawBorders`. * @property {?Option} onBeforeTouchScroll Option `onBeforeTouchScroll`. * @property {?Option} onCellContextMenu Option `onCellContextMenu`. * @property {?Option} onCellCornerDblClick Option `onCellCornerDblClick`. * @property {?Option} onCellCornerMouseDown Option `onCellCornerMouseDown`. * @property {?Option} onCellDblClick Option `onCellDblClick`. * @property {?Option} onCellMouseDown Option `onCellMouseDown`. * @property {?Option} onCellMouseOut Option `onCellMouseOut`. * @property {?Option} onCellMouseOver Option `onCellMouseOver`. * @property {?Option} onCellMouseUp Option `onCellMouseUp`. * @property {?Option} onDraw Option `onDraw`. * @property {?Option} onModifyGetCellCoords Option `onModifyGetCellCoords`. * @property {?Option} onModifyGetCoordsElement Option `onModifyGetCoordsElement`. * @property {?Option} onModifyGetCoords Option `onModifyGetCoords`. * @property {?Option} onModifyRowHeaderWidth Option `onModifyRowHeaderWidth`. * @property {?Option} onBeforeViewportScrollHorizontally Option `onBeforeViewportScrollHorizontally`. * @property {?Option} onBeforeViewportScrollVertically Option `onBeforeViewportScrollVertically`. * @property {?Option} onScrollHorizontally Option `onScrollHorizontally`. * @property {?Option} onScrollVertically Option `onScrollVertically`. * @property {?Option} onWindowResize Option `onWindowResize`. * @property {?Option} rowHeaderWidth Option `rowHeaderWidth`. * @property {?Option} selections Option `selections`. * @property {?Option} viewportColumnCalculatorOverride Option `viewportColumnCalculatorOverride`. * @property {?Option} viewportRowCalculatorOverride Option `viewportRowCalculatorOverride`. * @property {?Option} viewportColumnRenderingThreshold Option `viewportColumnRenderingThreshold`. * @property {?Option} viewportRowRenderingThreshold Option `viewportRowRenderingThreshold`. * @property {?Option} stylesHandler Option `stylesHandler`. */ /** * @template TValue. * @typedef { TValue | Array.<TValue> | (function(...*): TValue) } Option */ /** * @class Settings */ class Settings { /** * @param {SettingsPure} settings The user defined settings. */ constructor(settings) { /** * Reference to settings. * * @protected * @type {SettingsPure} */ _defineProperty(this, "settings", {}); /** * The defaults values of settings. * Void 0 means it is required, null means it can be empty. * * @public * @type {Readonly<SettingsPure>} */ _defineProperty(this, "defaults", Object.freeze(this.getDefaults())); (0, _object.objectEach)(this.defaults, (value, key) => { if (settings[key] !== undefined) { this.settings[key] = settings[key]; } else if (value === undefined) { throw new Error(`A required setting "${key}" was not provided`); } else { this.settings[key] = value; } }); } /** * Generate defaults for a settings. * Void 0 means it is required, null means it can be empty. * * @private * @returns {SettingsPure} */ getDefaults() { return { facade: undefined, table: undefined, // Determines whether the Walkontable instance is used as dataset viewer. When its instance is used as // a context menu, autocomplete list, etc, the returned value is `false`. isDataViewInstance: true, // presentation mode externalRowCalculator: false, currentRowClassName: null, currentColumnClassName: null, preventOverflow() { return false; }, preventWheel: false, // data source data: undefined, // Number of renderable columns for the left overlay. fixedColumnsStart: 0, // Number of renderable rows for the top overlay. fixedRowsTop: 0, // Number of renderable rows for the bottom overlay. fixedRowsBottom: 0, // Enable the inline start overlay when conditions are met (left for LTR and right for RTL document mode). shouldRenderInlineStartOverlay: () => { return this.getSetting('fixedColumnsStart') > 0 || this.getSetting('rowHeaders').length > 0; }, // Enable the top overlay when conditions are met. shouldRenderTopOverlay: () => { return this.getSetting('fixedRowsTop') > 0 || this.getSetting('columnHeaders').length > 0; }, // Enable the bottom overlay when conditions are met. shouldRenderBottomOverlay: () => { return this.getSetting('fixedRowsBottom') > 0; }, minSpareRows: 0, // this must be array of functions: [function (row, TH) {}] rowHeaders() { return []; }, // this must be array of functions: [function (column, TH) {}] columnHeaders() { return []; }, totalRows: undefined, totalColumns: undefined, cellRenderer: (row, column, TD) => { const cellData = this.getSetting('data', row, column); (0, _element.fastInnerText)(TD, cellData === undefined || cellData === null ? '' : cellData); }, // columnWidth: 50, columnWidth() { // return undefined means use default size for the rendered cell content }, rowHeight() { // return undefined means use default size for the rendered cell content }, rowHeightByOverlayName() { // return undefined means use default size for the rendered cell content }, defaultColumnWidth: 50, selections: null, hideBorderOnMouseDownOver: false, viewportRowCalculatorOverride: null, viewportColumnCalculatorOverride: null, viewportRowRenderingThreshold: null, viewportColumnRenderingThreshold: null, // callbacks onCellMouseDown: null, onCellContextMenu: null, onCellMouseOver: null, onCellMouseOut: null, onCellMouseUp: null, // onCellMouseOut: null, onCellDblClick: null, onCellCornerMouseDown: null, onCellCornerDblClick: null, beforeDraw: null, onDraw: null, onBeforeRemoveCellClassNames: null, onAfterDrawSelection: null, onBeforeDrawBorders: null, // viewport scroll hooks onBeforeViewportScrollHorizontally: column => column, onBeforeViewportScrollVertically: row => row, // native scroll hooks onScrollHorizontally: null, onScrollVertically: null, // onBeforeTouchScroll: null, onAfterMomentumScroll: null, onModifyRowHeaderWidth: null, onModifyGetCellCoords: null, onModifyGetCoordsElement: null, onModifyGetCoords: null, onBeforeHighlightingRowHeader: sourceRow => sourceRow, onBeforeHighlightingColumnHeader: sourceCol => sourceCol, onWindowResize: null, onContainerElementResize: null, renderAllColumns: false, renderAllRows: false, groups: false, rowHeaderWidth: null, columnHeaderHeight: null, headerClassName: null, rtlMode: false, ariaTags: true, stylesHandler: null }; } /** * Update settings. * * @param {object|string} settings The singular settings to update or if passed as object to merge with. * @param {*} value The value to set if the first argument is passed as string. * @returns {Settings} */ update(settings, value) { if (value === undefined) { // settings is object (0, _object.objectEach)(settings, (settingValue, key) => { this.settings[key] = settingValue; }); } else { // if value is defined then settings is the key this.settings[settings] = value; } return this; } /** * Get setting by name. * * @param {$Keys<SettingsPure>} key The settings key to retrieve. * @param {*} [param1] Additional parameter passed to the options defined as function. * @param {*} [param2] Additional parameter passed to the options defined as function. * @param {*} [param3] Additional parameter passed to the options defined as function. * @param {*} [param4] Additional parameter passed to the options defined as function. * @returns {*} */ getSetting(key, param1, param2, param3, param4) { if (typeof this.settings[key] === 'function') { return this.settings[key](param1, param2, param3, param4); } else if (param1 !== undefined && Array.isArray(this.settings[key])) { return this.settings[key][param1]; } return this.settings[key]; } /** * Get a setting value without any evaluation. * * @param {string} key The settings key to retrieve. * @returns {*} */ getSettingPure(key) { return this.settings[key]; } /** * Checks if setting exists. * * @param {boolean} key The settings key to check. * @returns {boolean} */ has(key) { return !!this.settings[key]; } } exports.default = Settings;