canvas-datagrid 0.26.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/dist/canvas-datagrid.debug.js +175 -49
- package/dist/canvas-datagrid.debug.map +1 -1
- package/dist/canvas-datagrid.js +1 -1
- package/dist/canvas-datagrid.module.js +1 -1
- package/dist/canvas-datagrid.module.js.map +1 -1
- package/dist/types.d.ts +5 -5
- package/lib/docs.js +3 -3
- package/lib/dom.js +86 -4
- package/lib/draw.js +20 -4
- package/lib/events/index.js +70 -47
- package/lib/intf.js +6 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvas-datagrid.module.js","sources":["../lib/defaults.js","../lib/selections/util.js","../node_modules/is-printable-key-event/dist/index.js","../lib/events/util.js","../lib/main.js","../lib/component.js","../lib/draw.js","../lib/events/index.js","../lib/touch.js","../lib/intf.js","../lib/selections/index.js","../lib/contextMenu.js","../lib/button.js","../lib/dom.js","../lib/publicMethods.js","../lib/groups/util.js"],"sourcesContent":["/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n\n'use strict';\nexport default function (self) {\n self.defaults = {\n attributes: [\n ['allowColumnReordering', true],\n ['allowColumnSelection', true],\n ['allowColumnResize', true],\n ['allowColumnResizeFromCell', false],\n ['allowFreezingRows', false],\n ['allowFreezingColumns', false],\n ['allowMovingSelection', true],\n ['allowRowHeaderResize', true],\n ['allowRowReordering', false],\n ['allowRowResize', true],\n ['allowRowResizeFromCell', false],\n ['allowSorting', true],\n ['allowGroupingRows', true],\n ['allowGroupingColumns', true],\n ['allowGridExpandOnPaste', false],\n ['animationDurationShowContextMenu', 50],\n ['animationDurationHideContextMenu', 50],\n ['autoGenerateSchema', false],\n ['fillLastColumn', false],\n ['autoResizeColumns', false],\n ['autoResizeRows', false],\n ['autoScrollOnMousemove', false],\n ['autoScrollMargin', 5],\n ['allowShrinkingSelection', false],\n ['blanksText', '(Blanks)'],\n ['borderDragBehavior', 'none'],\n ['borderResizeZone', 10],\n ['clearCellsWhenShrinkingSelection', false],\n ['clearSettingsOptionText', 'Clear saved settings'],\n ['columnHeaderClickBehavior', 'sort'],\n ['columnSelectorHiddenText', ' '],\n ['columnSelectorText', 'Add/Remove columns'],\n ['columnSelectorVisibleText', '\\u2713'],\n ['contextHoverScrollAmount', 2],\n ['contextHoverScrollRateMs', 5],\n ['copyHeadersOnSelectAll', true],\n ['copyText', 'Copy'],\n ['debug', false],\n ['editable', true],\n ['ellipsisText', '...'],\n ['filterOptionText', 'Filter %s'],\n ['filterTextPrefix', '(filtered) '],\n ['filterFrozenRows', true],\n ['globalRowResize', false],\n ['hideColumnText', 'Hide %s'],\n ['showUnhideColumnsIndicator', false],\n ['showUnhideRowsIndicator', false],\n ['showHideRow', 'Hide row %s'],\n ['showHideRows', 'Hide rows %s'],\n ['hoverMode', 'cell'],\n ['keepFocusOnMouseOut', false],\n ['maxAutoCompleteItems', 200],\n ['multiLine', false],\n ['name', ''],\n ['pageUpDownOverlap', 1],\n ['pasteText', 'Paste'],\n ['persistantSelectionMode', false],\n ['removeFilterOptionText', 'Remove filter on %s'],\n ['reorderDeadZone', 3],\n ['resizeAfterDragged', false],\n ['resizeScrollZone', 20],\n ['rowGrabZoneSize', 5],\n ['columnGrabZoneSize', 30],\n ['saveAppearance', true],\n ['scrollAnimationPPSThreshold', 0.75],\n ['scrollPointerLock', false],\n ['scrollRepeatRate', 75],\n ['selectionFollowsActiveCell', false],\n ['selectionHandleBehavior', 'none'],\n ['selectionMode', 'cell'],\n ['selectionScrollIncrement', 20],\n ['selectionScrollZone', 20],\n ['showClearSettingsOption', true],\n ['showColumnHeaders', true],\n ['showColumnSelector', true],\n ['showCopy', false],\n ['showFilter', true],\n ['showFilterInCell', false],\n ['showNewRow', false],\n ['showOrderByOption', true],\n ['showOrderByOptionTextAsc', 'Order by %s ascending'],\n ['showOrderByOptionTextDesc', 'Order by %s descending'],\n //#region grouping\n ['showGroupColumns', 'Group columns %s'],\n ['showGroupRows', 'Group rows %s'],\n ['showRemoveGroupColumns', 'Remove group %s'],\n ['showRemoveGroupRows', 'Remove group %s'],\n ['showRemoveAllGroupColumns', 'Remove all column groups'],\n ['showRemoveAllGroupRows', 'Remove all row groups'],\n ['showExpandAllGroupColumns', 'Expand all column groups'],\n ['showExpandAllGroupRows', 'Expand all row groups'],\n ['showCollapseAllGroupColumns', 'Collapse all column groups'],\n ['showCollapseAllGroupRows', 'Collapse all row groups'],\n ['columnGroupIndicatorPosition', 'right'],\n ['rowGroupIndicatorPosition', 'bottom'],\n //#endregion grouping\n ['showPaste', false],\n ['showPerformance', false],\n ['showRowHeaders', true],\n ['showRowNumbers', true],\n ['showRowNumberGaps', true],\n ['singleSelectionMode', false],\n ['snapToRow', false],\n ['sortFrozenRows', true],\n ['touchContextMenuTimeMs', 800],\n ['touchDeadZone', 3],\n ['touchEasingMethod', 'easeOutQuad'],\n ['touchReleaseAcceleration', 1000],\n ['touchReleaseAnimationDurationMs', 2000],\n ['touchScrollZone', 20],\n ['touchSelectHandleZone', 20],\n ['touchZoomSensitivity', 0.005],\n ['touchZoomMin', 0.5],\n ['touchZoomMax', 1.75],\n ['maxPixelRatio', 2],\n ['maxCanvasSize', 16384],\n ['tree', false],\n ['treeHorizontalScroll', false],\n ['rowTree', []],\n ['rowTreeColIndex', 0],\n ['columnTree', []],\n ['columnTreeRowStartIndex', 0],\n ['columnTreeRowEndIndex', 0],\n ],\n styles: [\n ['activeCellBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['activeCellBorderColor', 'rgba(110, 168, 255, 1)'],\n ['activeCellBorderWidth', 1],\n ['activeCellColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellFont', '16px sans-serif'],\n ['activeCellHoverBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['activeCellHorizontalAlignment', 'left'],\n ['activeCellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['activeCellOverlayBorderWidth', 1],\n ['activeCellPaddingBottom', 5],\n ['activeCellPaddingLeft', 5],\n ['activeCellPaddingRight', 5],\n ['activeCellPaddingTop', 5],\n ['activeCellSelectedBackgroundColor', 'rgba(236, 243, 255, 1)'],\n ['activeCellSelectedColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellVerticalAlignment', 'center'],\n ['activeColumnHeaderCellBackgroundColor', 'rgba(225, 225, 225, 1)'],\n ['activeColumnHeaderCellColor', 'rgba(0, 0, 0, 1)'],\n ['activeRowHeaderCellBackgroundColor', 'rgba(225, 225, 225, 1)'],\n ['activeRowHeaderCellColor', 'rgba(0, 0, 0, 1)'],\n ['autocompleteBottomMargin', 60],\n ['autosizeHeaderCellPadding', 8],\n ['autosizePadding', 5],\n ['buttonActiveBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['buttonActiveBorderColor', 'rgba(110, 168, 255, 1)'],\n ['buttonArrowColor', 'rgba(50, 50, 50, 1)'],\n ['buttonArrowDownHTML', '▼'],\n ['buttonZIndex', 10000],\n ['buttonBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['buttonBorderColor', 'rgba(172, 172, 172, 1)'],\n ['buttonHoverBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['buttonMenuWindowMargin', 30],\n ['buttonPadding', '3px'],\n ['cellAutoResizePadding', 13],\n ['cellBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['cellBorderColor', 'rgba(195, 199, 202, 1)'],\n ['cellBorderWidth', 1],\n ['cellColor', 'rgba(0, 0, 0, 1)'],\n ['cellFont', '16px sans-serif'],\n ['cellGridHeight', 250],\n ['cellHeight', 24],\n ['cellHeightWithChildGrid', 150],\n ['cellHorizontalAlignment', 'left'],\n ['cellHoverBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['cellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['cellPaddingBottom', 5],\n ['cellPaddingLeft', 5],\n ['cellPaddingRight', 5],\n ['cellPaddingTop', 5],\n ['cellSelectedBackgroundColor', 'rgba(236, 243, 255, 1)'],\n ['cellSelectedColor', 'rgba(0, 0, 0, 1)'],\n ['cellTreeIconBorderColor', 'rgba(162, 174, 207, 1)'],\n ['cellTreeIconFillColor', 'rgba(240, 240, 240, 1)'],\n ['cellTreeIconHoverFillColor', 'rgba(198, 217, 233, 1)'],\n ['cellTreeIconLineColor', 'rgba(43, 53, 81, 1)'],\n ['cellTreeIconLineWidth', 1.5],\n ['cellTreeIconMarginLeft', 0],\n ['cellTreeIconMarginRight', 5],\n ['cellTreeIconMarginTop', 6],\n ['cellTreeIconWidth', 13],\n ['cellVerticalAlignment', 'center'],\n ['cellWidth', 250],\n ['cellWidthWithChildGrid', 250],\n ['cellWhiteSpace', 'nowrap'],\n ['cellLineHeight', 1],\n ['cellLineSpacing', 3],\n ['childContextMenuArrowColor', 'rgba(43, 48, 43, 1)'],\n ['childContextMenuArrowHTML', '►'],\n ['childContextMenuMarginLeft', -11],\n ['childContextMenuMarginTop', -6],\n ['columnGroupRowHeight', 25],\n ['columnHeaderCellBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['columnHeaderCellBorderColor', 'rgba(172, 172, 172, 1)'],\n ['columnHeaderCellBorderWidth', 1],\n ['columnHeaderCellCapBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['columnHeaderCellCapBorderColor', 'rgba(172, 172, 172, 1)'],\n ['columnHeaderCellCapBorderWidth', 1],\n ['columnHeaderCellColor', 'rgba(50, 50, 50, 1)'],\n ['columnHeaderCellFont', '16px sans-serif'],\n ['columnHeaderCellHeight', 25],\n ['columnHeaderCellHorizontalAlignment', 'left'],\n ['columnHeaderCellHoverBackgroundColor', 'rgba(235, 235, 235, 1)'],\n ['columnHeaderCellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['columnHeaderCellPaddingBottom', 5],\n ['columnHeaderCellPaddingLeft', 5],\n ['columnHeaderCellPaddingRight', 5],\n ['columnHeaderCellPaddingTop', 5],\n ['columnHeaderCellVerticalAlignment', 'center'],\n ['columnHeaderOrderByArrowBorderColor', 'rgba(195, 199, 202, 1)'],\n ['columnHeaderOrderByArrowBorderWidth', 1],\n ['columnHeaderOrderByArrowColor', 'rgba(155, 155, 155, 1)'],\n ['columnHeaderOrderByArrowHeight', 8],\n ['columnHeaderOrderByArrowMarginLeft', 0],\n ['columnHeaderOrderByArrowMarginRight', 5],\n ['columnHeaderOrderByArrowMarginTop', 6],\n ['columnHeaderOrderByArrowWidth', 13],\n ['contextFilterButtonBorder', 'solid 1px rgba(158, 163, 169, 1)'],\n ['contextFilterButtonBorderRadius', '3px'],\n ['contextFilterButtonHTML', '▼'],\n ['contextFilterInputBackground', 'rgba(255,255,255,1)'],\n ['contextFilterInputBorder', 'solid 1px rgba(158, 163, 169, 1)'],\n ['contextFilterInputBorderRadius', '0'],\n ['contextFilterInputColor', 'rgba(0,0,0,1)'],\n ['contextFilterInputFontFamily', 'sans-serif'],\n ['contextFilterInputFontSize', '14px'],\n ['contextFilterInvalidRegExpBackground', 'rgba(180, 6, 1, 1)'],\n ['contextFilterInvalidRegExpColor', 'rgba(255, 255, 255, 1)'],\n ['contextMenuArrowColor', 'rgba(43, 48, 43, 1)'],\n ['contextMenuArrowDownHTML', '▼'],\n ['contextMenuArrowUpHTML', '▲'],\n ['contextMenuBackground', 'rgba(240, 240, 240, 1)'],\n ['contextMenuBorder', 'solid 1px rgba(158, 163, 169, 1)'],\n ['contextMenuBorderRadius', '3px'],\n ['contextMenuChildArrowFontSize', '12px'],\n ['contextMenuColor', 'rgba(43, 48, 43, 1)'],\n ['contextMenuCursor', 'default'],\n ['contextMenuFilterButtonFontFamily', 'sans-serif'],\n ['contextMenuFilterButtonFontSize', '10px'],\n ['contextMenuFilterInvalidExpresion', 'rgba(237, 155, 156, 1)'],\n ['contextMenuFontFamily', 'sans-serif'],\n ['contextMenuFontSize', '16px'],\n ['contextMenuHoverBackground', 'rgba(182, 205, 250, 1)'],\n ['contextMenuHoverColor', 'rgba(43, 48, 153, 1)'],\n ['contextMenuItemBorderRadius', '3px'],\n ['contextMenuItemMargin', '2px'],\n ['contextMenuLabelDisplay', 'inline-block'],\n ['contextMenuLabelMargin', '0 3px 0 0'],\n ['contextMenuLabelMaxWidth', '700px'],\n ['contextMenuLabelMinWidth', '75px'],\n ['contextMenuMarginLeft', 3],\n ['contextMenuMarginTop', -3],\n ['contextMenuOpacity', '0.98'],\n ['contextMenuPadding', '2px'],\n ['contextMenuWindowMargin', 30],\n ['contextMenuZIndex', 10000],\n ['cornerCellBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['cornerCellBorderColor', 'rgba(202, 202, 202, 1)'],\n ['debugBackgroundColor', 'rgba(0, 0, 0, .0)'],\n ['debugColor', 'rgba(255, 15, 24, 1)'],\n ['debugEntitiesColor', 'rgba(76, 231, 239, 1.00)'],\n ['debugFont', '11px sans-serif'],\n ['debugPerfChartBackground', 'rgba(29, 25, 26, 1.00)'],\n ['debugPerfChartTextColor', 'rgba(255, 255, 255, 0.8)'],\n ['debugPerformanceColor', 'rgba(252, 255, 37, 1.00)'],\n ['debugScrollHeightColor', 'rgba(248, 33, 103, 1.00)'],\n ['debugScrollWidthColor', 'rgba(66, 255, 27, 1.00)'],\n ['debugTouchPPSXColor', 'rgba(246, 102, 24, 1.00)'],\n ['debugTouchPPSYColor', 'rgba(186, 0, 255, 1.00)'],\n ['display', 'inline-block'],\n ['editCellBackgroundColor', 'white'],\n ['editCellBorder', 'solid 1px rgba(110, 168, 255, 1)'],\n ['editCellBoxShadow', '0 2px 5px rgba(0,0,0,0.4)'],\n ['editCellColor', 'black'],\n ['editCellFontFamily', 'sans-serif'],\n ['editCellFontSize', '16px'],\n ['editCellPaddingLeft', 4],\n ['editCellZIndex', 10000],\n ['filterButtonActiveBackgroundColor', 'rgba(225, 225, 225, 1)'],\n ['filterButtonArrowBorderColor', 'rgba(195, 199, 202, 1)'],\n ['filterButtonArrowBorderWidth', 1],\n ['filterButtonArrowClickRadius', 5],\n ['filterButtonArrowColor', 'rgba(50, 50, 50, 1)'],\n ['filterButtonArrowHeight', 5],\n ['filterButtonArrowWidth', 8],\n ['filterButtonBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['filterButtonBorderColor', 'rgba(172, 172, 172, 1)'],\n ['filterButtonBorderRadius', 3],\n ['filterButtonHeight', 20],\n ['filterButtonHoverBackgroundColor', 'rgba(235, 235, 235, 1)'],\n ['filterButtonMenuOffsetTop', 10],\n ['filterButtonWidth', 20],\n ['frozenMarkerHoverColor', 'rgba(165, 198, 254, 1)'],\n ['frozenMarkerHoverBorderColor', 'rgba(165, 198, 254, 1)'],\n ['frozenMarkerActiveColor', 'rgba(165, 198, 254, 0.2)'],\n ['frozenMarkerActiveBorderColor', 'rgba(165, 198, 254, 0.5)'],\n ['frozenMarkerActiveHeaderColor', 'rgba(165, 198, 254, 1)'],\n ['frozenMarkerColor', 'rgba(221, 221, 221, 1)'],\n ['frozenMarkerBorderColor', 'rgba(221, 221, 221, 1)'],\n ['frozenMarkerBorderWidth', 1],\n ['frozenMarkerHeaderColor', 'rgba(188, 188, 188, 1)'],\n ['frozenMarkerWidth', 4],\n ['groupingAreaBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['gridBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['gridBorderCollapse', 'collapse'],\n ['gridBorderColor', 'rgba(202, 202, 202, 1)'],\n ['gridBorderWidth', 1],\n ['groupIndicatorColor', 'rgba(155, 155, 155, 1)'],\n ['groupIndicatorBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['height', 'auto'],\n ['maxHeight', 'inherit'],\n ['maxWidth', 'inherit'],\n ['minColumnWidth', 45],\n ['minHeight', 'inherit'],\n ['minRowHeight', 24],\n ['minWidth', 'inherit'],\n ['mobileContextMenuMargin', 10],\n ['mobileEditInputHeight', 30],\n ['mobileEditFontFamily', 'sans-serif'],\n ['mobileEditFontSize', '16px'],\n ['moveOverlayBorderWidth', 1],\n ['moveOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['moveOverlayBorderSegments', '12, 7'],\n ['name', 'default'],\n ['overflowY', 'auto'],\n ['overflowX', 'auto'],\n ['reorderMarkerBackgroundColor', 'rgba(0, 0, 0, 0.1)'],\n ['reorderMarkerBorderColor', 'rgba(0, 0, 0, 0.2)'],\n ['reorderMarkerBorderWidth', 1.25],\n ['reorderMarkerIndexBorderColor', 'rgba(66, 133, 244, 1)'],\n ['reorderMarkerIndexBorderWidth', 2.75],\n ['resizeMarkerColor', 'rgba(0, 0, 0, 0.2)'],\n ['resizeMarkerSize', 2],\n ['rowGroupColumnWidth', 25],\n ['rowHeaderCellBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['rowHeaderCellBorderColor', 'rgba(200, 200, 200, 1)'],\n ['rowHeaderCellBorderWidth', 1],\n ['rowHeaderCellColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellFont', '16px sans-serif'],\n ['rowHeaderCellHeight', 25],\n ['rowHeaderCellHorizontalAlignment', 'left'],\n ['rowHeaderCellHoverBackgroundColor', 'rgba(235, 235, 235, 1)'],\n ['rowHeaderCellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['rowHeaderCellPaddingBottom', 5],\n ['rowHeaderCellPaddingLeft', 5],\n ['rowHeaderCellPaddingRight', 5],\n ['rowHeaderCellPaddingTop', 5],\n ['rowHeaderCellRowNumberGapHeight', 5],\n ['rowHeaderCellRowNumberGapColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellSelectedBackgroundColor', 'rgba(217, 217, 217, 1)'],\n ['rowHeaderCellSelectedColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellVerticalAlignment', 'center'],\n ['rowHeaderCellWidth', 57],\n ['scrollBarActiveColor', 'rgba(125, 125, 125, 1)'],\n ['scrollBarBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['scrollBarBorderColor', 'rgba(202, 202, 202, 1)'],\n ['scrollBarBorderWidth', 0.5],\n ['scrollBarBoxBorderRadius', 4.125],\n ['scrollBarBoxColor', 'rgba(192, 192, 192, 1)'],\n ['scrollBarBoxMargin', 2],\n ['scrollBarBoxMinSize', 15],\n ['scrollBarBoxWidth', 8],\n ['scrollBarCornerBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['scrollBarCornerBorderColor', 'rgba(202, 202, 202, 1)'],\n ['scrollBarWidth', 11],\n ['selectionHandleBorderColor', 'rgba(255, 255, 255, 1)'],\n ['selectionHandleBorderWidth', 1.5],\n ['selectionHandleColor', 'rgba(66, 133, 244, 1)'],\n ['selectionHandleSize', 8],\n ['selectionHandleType', 'square'],\n ['fillOverlayBorderColor', 'rgba(127, 127, 127, 1)'],\n ['fillOverlayBorderWidth', 2],\n ['selectionOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['selectionOverlayBorderWidth', 1],\n ['treeArrowBorderColor', 'rgba(195, 199, 202, 1)'],\n ['treeArrowBorderWidth', 1],\n ['treeArrowClickRadius', 5],\n ['treeArrowColor', 'rgba(155, 155, 155, 1)'],\n ['treeArrowHeight', 8],\n ['treeArrowMarginLeft', 0],\n ['treeArrowMarginRight', 5],\n ['treeArrowMarginTop', 6],\n ['treeArrowWidth', 13],\n ['treeGridHeight', 250],\n ['unhideIndicatorColor', 'rgba(0, 0, 0, 1)'],\n ['unhideIndicatorBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['unhideIndicatorBorderColor', 'rgba(174, 193, 232, 1)'],\n ['unhideIndicatorSize', 16],\n ['width', 'auto'],\n ],\n };\n}\n","'use strict';\n//@ts-check\n/// <reference path=\"./type.d.ts\" />\n\n// Abbreviation in this file\n// - sel: selection\n// - sel0, sel1: If there are two selections in the parameters, these two names are for them.\n\n// Types of Selection\n// 0. (High Priority) Unselected cells from [startRow, startColumn] to [endRow, endColumn]\n// 1. Cells from [startRow, startColumn] to [endRow, endColumn]\n// 2. Rows from startRow to endRow\n// 3. Columns from startColumn to endColumn\n\nconst SelectionType = {\n UnselectedCells: 0,\n Cells: 1,\n Rows: 2,\n Columns: 3,\n};\n\n/**\n * Swap values between two properties in an object\n * @param {object} obj The object\n * @param {string} prop0 First property name\n * @param {string} prop1 Another property name\n */\nconst swapProps = (obj, prop0, prop1) => {\n const t = obj[prop0];\n obj[prop0] = obj[prop1];\n obj[prop1] = t;\n};\n\n/**\n * This function transforms a selection object to normalized.\n * Here is the definition of **normalized selection object**:\n * - It contains these required properties: type, startRow, startColumn, endRow, endColumn\n * - Property `endRow` and property `endColumn` must exist even if their value are the same with `startRow` or `startColumn`.\n * - The value of `endRow` must be equals or greater than the value of `startRow`\n * - The value of `endColumn` must be equals or greater than the value of `startColumn`\n * @param {SelectionDescriptor} sel\n * @returns {SelectionDescriptor}\n */\nconst normalizeSelection = (sel) => {\n if (!sel) return sel;\n switch (sel.type) {\n case SelectionType.UnselectedCells:\n case SelectionType.Cells:\n if (typeof sel.endRow !== 'number') sel.endRow = sel.startRow;\n else if (sel.endRow < sel.startRow) swapProps(sel, 'startRow', 'endRow');\n\n if (typeof sel.endColumn !== 'number') sel.endColumn = sel.startColumn;\n else if (sel.endColumn < sel.startColumn)\n swapProps(sel, 'startColumn', 'endColumn');\n\n break;\n case SelectionType.Rows:\n if (typeof sel.endRow !== 'number') sel.endRow = sel.startRow;\n else if (sel.endRow < sel.startRow) swapProps(sel, 'startRow', 'endRow');\n\n break;\n case SelectionType.Columns:\n if (typeof sel.endColumn !== 'number') sel.endColumn = sel.startColumn;\n else if (sel.endColumn < sel.startColumn)\n swapProps(sel, 'startColumn', 'endColumn');\n\n break;\n }\n return sel;\n};\n\n/**\n * Parse a string expression to a selection object. Here are some example expressions:\n * - cells:20,30-40,50\n * - row:5\n * - cols:5-9\n * @param {string} str\n * @returns {SelectionDescriptor}\n */\nconst getSelectionFromString = (str) => {\n if (typeof str !== 'string') return;\n\n const index = str.indexOf(':');\n if (index < 0) return;\n\n const type = str.slice(0, index);\n const num = str\n .slice(index + 1)\n .split(/[,:;-]+/)\n .map((it) => parseInt(it, 10));\n switch (type) {\n case 'cell':\n case 'cells':\n case '-cell':\n case '-cells':\n return normalizeSelection({\n type: SelectionType[type[0] === '-' ? 'UnselectedCells' : 'Cells'],\n startRow: num[0],\n startColumn: num[1],\n endRow: num[2],\n endColumn: num[3],\n });\n case 'row':\n case 'rows':\n return normalizeSelection({\n type: SelectionType.Rows,\n startRow: num[0],\n endRow: num[1],\n });\n case 'col':\n case 'cols':\n return normalizeSelection({\n type: SelectionType.Columns,\n startColumn: num[0],\n endColumn: num[1],\n });\n }\n};\n\n/**\n * Check are two cells block the same\n * @param {SelectionDescriptor} block0\n * @param {SelectionDescriptor} block1\n * @returns {boolean}\n */\nconst isSameCellsBlock = (block0, block1) => {\n return (\n block0.startRow === block1.startRow &&\n block0.endRow === block1.endRow &&\n block0.startColumn === block1.startColumn &&\n block0.endColumn === block1.endColumn\n );\n};\n\n/**\n * This function is used in the function `mergeSelections`\n * @see mergeSelections\n * @param {SelectionDescriptor} cells\n * @param {SelectionDescriptor} rowsOrColumns\n * @returns {SelectionDescriptor}\n */\nconst mergeCellsIntoRowsOrColumns = (cells, rowsOrColumns) => {\n if (rowsOrColumns.type === SelectionType.Rows) {\n if (\n cells.startRow >= rowsOrColumns.startRow &&\n cells.endRow <= rowsOrColumns.endRow\n )\n return rowsOrColumns;\n return;\n }\n if (\n cells.startColumn >= rowsOrColumns.startColumn &&\n cells.endColumn <= rowsOrColumns.endColumn\n )\n return rowsOrColumns;\n};\n\n/**\n * Merge two selection objects (Splicing, Containing)\n * @param {SelectionDescriptor} sel0\n * @param {SelectionDescriptor} sel1\n * @returns {SelectionDescriptor} A concatenated selection object based on `block0`.\n * Or `undefined` if they can't be concatenated\n */\nconst mergeSelections = (sel0, sel1) => {\n if (sel0.type !== sel1.type) {\n if (sel1.type <= SelectionType.Cells && sel0.type > SelectionType.Cells)\n return mergeCellsIntoRowsOrColumns(sel1, sel0);\n if (sel0.type <= SelectionType.Cells && sel1.type > SelectionType.Cells)\n return mergeCellsIntoRowsOrColumns(sel0, sel1);\n return;\n }\n\n /** These two selection objects may be concatenated horizontally */\n const horizontalConcat =\n sel0.type === SelectionType.Columns\n ? true\n : sel0.startRow === sel1.startRow && sel0.endRow === sel1.endRow;\n\n /** These two selection objects may be concatenated vertically */\n const verticalConcat =\n sel0.type === SelectionType.Rows\n ? true\n : sel0.startColumn === sel1.startColumn &&\n sel0.endColumn === sel1.endColumn;\n\n if (horizontalConcat) {\n // Are they the same\n if (verticalConcat) return sel0;\n // Are they neighbor\n if (\n sel1.startColumn > sel0.endColumn + 1 ||\n sel1.endColumn < sel0.startColumn - 1\n )\n return;\n return Object.assign({}, sel0, {\n startColumn: Math.min(sel0.startColumn, sel1.startColumn),\n endColumn: Math.max(sel0.endColumn, sel1.endColumn),\n });\n }\n\n if (verticalConcat) {\n // Are they neighbor\n if (sel1.startRow > sel0.endRow + 1 || sel1.endRow < sel0.startRow - 1)\n return;\n return Object.assign({}, sel0, {\n startRow: Math.min(sel0.startRow, sel1.startRow),\n endRow: Math.max(sel0.endRow, sel1.endRow),\n });\n }\n\n // Does one of them contain other one\n if (\n sel0.type === SelectionType.Cells ||\n sel0.type === SelectionType.UnselectedCells\n ) {\n const intersection = getIntersection(sel0, sel1);\n if (intersection) {\n if (isSameCellsBlock(intersection, sel0)) return sel1;\n if (isSameCellsBlock(intersection, sel1)) return sel0;\n }\n }\n};\n\n/**\n * Remove some rows from a rows selection\n * @param {SelectionDescriptor} selection It must be a selection with type as `Rows`\n * @param {SelectionDescriptor} remove It must be a selection with type as `Rows`\n * @returns {SelectionDescriptor[]} Returning a `undefined` represents parameter `remove` doesn't intersect with parameter `selection`\n */\nconst removePartOfRowsSelection = (selection, remove) => {\n if (remove.endRow < selection.startRow) return;\n if (remove.startRow > selection.endRow) return;\n if (remove.startRow <= selection.startRow) {\n // all rows of the selection is removed\n if (remove.endRow >= selection.endRow) return [];\n return [Object.assign({}, selection, { startRow: remove.endRow + 1 })];\n }\n if (remove.endRow >= selection.endRow)\n return [Object.assign({}, selection, { endRow: remove.startRow - 1 })];\n // the selection be divided into two parts\n return [\n Object.assign({}, selection, { endRow: remove.startRow - 1 }),\n Object.assign({}, selection, { startRow: remove.endRow + 1 }),\n ];\n};\n\n/**\n * Remove some columns from a columns selection\n * @param {object} selection It must be a selection with type as `Columns`\n * @param {object} remove It must be a selection with type as `Columns`\n * @returns {object[]} Returning a `undefined` represents parameter `remove` doesn't intersect with parameter `selection`\n */\nconst removePartOfColumnsSelection = (selection, remove) => {\n if (remove.endColumn < selection.startColumn) return;\n if (remove.startColumn > selection.endColumn) return;\n if (remove.startColumn <= selection.startColumn) {\n // all cols of the selection is removed\n if (remove.endColumn >= selection.endColumn) return [];\n return [\n Object.assign({}, selection, { startColumn: remove.endColumn + 1 }),\n ];\n }\n if (remove.endColumn >= selection.endColumn)\n return [\n Object.assign({}, selection, { endColumn: remove.startColumn - 1 }),\n ];\n // the selection be divided into two parts\n return [\n Object.assign({}, selection, { endColumn: remove.startColumn - 1 }),\n Object.assign({}, selection, { startColumn: remove.endColumn + 1 }),\n ];\n};\n\n/**\n * Remove a cells block from a cells selection\n * @param {SelectionDescriptor} selection It must be a selection with type as `Cells` or `UnselectedCells`\n * @param {SelectionDescriptor} remove It must be a selection\n * @returns {SelectionDescriptor[]} Returning a `undefined` represents parameter `remove` doesn't intersect with parameter `selection`\n */\nconst removePartOfCellsSelection = (selection, remove) => {\n const intersect = getIntersection(selection, remove);\n if (!intersect) return;\n // all of cells in the selection are removed\n if (isSameCellsBlock(selection, intersect)) return [];\n const result = [];\n let minStartRow = selection.startRow;\n let maxEndRow = selection.endRow;\n let maxEndColumn = selection.endColumn;\n if (intersect.startRow > selection.startRow) {\n // Top\n result.push(\n Object.assign({}, selection, { endRow: intersect.startRow - 1 }),\n );\n minStartRow = intersect.startRow;\n }\n if (intersect.endColumn < selection.endColumn) {\n // Right\n result.push(\n Object.assign({}, selection, {\n startRow: minStartRow,\n startColumn: intersect.endColumn + 1,\n }),\n );\n maxEndColumn = intersect.endColumn;\n }\n if (intersect.endRow < selection.endRow) {\n // Bottom\n result.push(\n Object.assign({}, selection, {\n endColumn: maxEndColumn,\n startRow: intersect.endRow + 1,\n }),\n );\n maxEndRow = intersect.endRow;\n }\n if (intersect.startColumn > selection.startColumn) {\n // Bottom\n result.push(\n Object.assign({}, selection, {\n startRow: minStartRow,\n endRow: maxEndRow,\n endColumn: intersect.startColumn - 1,\n }),\n );\n }\n return result;\n};\n\n/**\n * Get intersection of two selection object\n * @param {SelectionDescriptor} sel0\n * @param {SelectionDescriptor} sel1\n * @returns {SelectionDescriptor} a selection object or undefined\n */\nconst getIntersection = (sel0, sel1) => {\n if (sel0.type > sel1.type) return getIntersection(sel1, sel0);\n if (sel0.type <= SelectionType.Cells) {\n if (sel1.type <= SelectionType.Cells) {\n const startColumn = Math.max(sel0.startColumn, sel1.startColumn);\n const endColumn = Math.min(sel0.endColumn, sel1.endColumn);\n if (startColumn > endColumn) return;\n\n const startRow = Math.max(sel0.startRow, sel1.startRow);\n const endRow = Math.min(sel0.endRow, sel1.endRow);\n if (startRow > endRow) return;\n\n return {\n type: SelectionType.Cells,\n startRow: startRow,\n startColumn: startColumn,\n endRow: endRow,\n endColumn: endColumn,\n };\n }\n if (sel1.type === SelectionType.Rows) {\n const startRow = Math.max(sel0.startRow, sel1.startRow);\n const endRow = Math.min(sel0.endRow, sel1.endRow);\n if (startRow > endRow) return;\n return {\n type: SelectionType.Cells,\n startRow: startRow,\n startColumn: sel0.startColumn,\n endRow: endRow,\n endColumn: sel0.endColumn,\n };\n } else {\n // SelectionType.Columns\n const startColumn = Math.max(sel0.startColumn, sel1.startColumn);\n const endColumn = Math.min(sel0.endColumn, sel1.endColumn);\n if (startColumn > endColumn) return;\n return {\n type: SelectionType.Cells,\n startColumn: startColumn,\n startRow: sel0.startRow,\n endColumn: endColumn,\n endRow: sel0.endRow,\n };\n }\n }\n if (sel0.type === SelectionType.Rows) {\n if (sel1.type === SelectionType.Rows) {\n const startRow = Math.max(sel0.startRow, sel1.startRow);\n const endRow = Math.min(sel0.endRow, sel1.endRow);\n if (startRow > endRow) return;\n return { type: SelectionType.Rows, startRow: startRow, endRow: endRow };\n } else {\n // SelectionType.Columns\n return {\n type: SelectionType.Cells,\n startRow: sel0.startRow,\n startColumn: sel1.startColumn,\n endRow: sel0.endRow,\n endColumn: sel1.endColumn,\n };\n }\n }\n // SelectionType.Columns\n const startColumn = Math.max(sel0.startColumn, sel1.startColumn);\n const endColumn = Math.min(sel0.endColumn, sel1.endColumn);\n if (startColumn > endColumn) return;\n return {\n type: SelectionType.Columns,\n startColumn: startColumn,\n endColumn: endColumn,\n };\n};\n\n/**\n * Add a selection object into `selections` array. And there are two behaviours if this function:\n * - It appends a new selection object into the `selections` array\n * - It rewrites the selection item in the `selections` array (merge or change its type)\n *\n * @param {SelectionDescriptor[]} selections\n * @param {SelectionDescriptor} add Supported types: Cells, Rows, Columns\n * @param {ContextForSelectionAction} [context] Eg: {rows:1000, columns:1000}\n * @returns {boolean} is the selections array changed\n */\nconst addIntoSelections = (selections, add, context) => {\n if (!add || typeof add.type !== 'number') return false;\n if (add.type === SelectionType.Cells) {\n for (let i = 0; i < selections.length; i++) {\n const sel = selections[i];\n if (sel.type === SelectionType.UnselectedCells) {\n const parts = removePartOfCellsSelection(sel, add);\n if (parts) {\n selections.splice(i, 1, ...parts);\n i += parts.length - 1;\n }\n continue;\n }\n if (sel.type === SelectionType.Cells) {\n const parts = removePartOfCellsSelection(add, sel);\n if (Array.isArray(parts)) {\n let result = false;\n for (let i = 0; i < parts.length; i++) {\n const isChanged = addIntoSelections(selections, parts[i], context);\n if (isChanged) result = true;\n }\n if (result) cleanupSelections(selections);\n return result;\n }\n }\n }\n\n // has context info of the grid\n if (context) {\n const selectedAllRows =\n add.startRow === 0 && add.endRow + 1 >= context.rows;\n const selectedAllColumns =\n add.startColumn === 0 && add.endColumn + 1 >= context.columns;\n let isChanged0, isChanged1;\n if (selectedAllRows) {\n isChanged0 = addIntoSelections(\n selections,\n {\n type: SelectionType.Columns,\n startColumn: add.startColumn,\n endColumn: add.endColumn,\n },\n context,\n );\n }\n if (selectedAllColumns) {\n isChanged1 = addIntoSelections(\n selections,\n {\n type: SelectionType.Rows,\n startRow: add.startRow,\n endRow: add.endRow,\n },\n context,\n );\n }\n if (selectedAllRows || selectedAllColumns)\n return isChanged0 || isChanged1;\n }\n\n selections.push(add);\n cleanupSelections(selections);\n return true;\n }\n // end of cells selection\n\n const isRowsSelection = add.type === SelectionType.Rows;\n if (isRowsSelection || add.type === SelectionType.Columns) {\n for (let i = 0; i < selections.length; i++) {\n const sel = selections[i];\n if (sel.type === SelectionType.UnselectedCells) {\n const parts = removePartOfCellsSelection(\n sel,\n isRowsSelection\n ? {\n startRow: add.startRow,\n endRow: add.endRow,\n startColumn: 0,\n endColumn: sel.endColumn,\n }\n : {\n startColumn: add.startColumn,\n endColumn: add.endColumn,\n startRow: 0,\n endRow: sel.endRow,\n },\n );\n if (parts) {\n selections.splice(i, 1, ...parts);\n i += parts.length - 1;\n }\n continue;\n }\n if (sel.type !== add.type) continue;\n // try to concat them\n let merged = mergeSelections(sel, add);\n if (merged) {\n for (let j = i + 1; j < selections.length; j++) {\n if (selections[j].type !== add.type) continue;\n const newMerged = mergeSelections(selections[j], merged);\n if (newMerged) {\n selections.splice(j, 1);\n j--;\n merged = newMerged;\n }\n }\n selections[i] = merged;\n cleanupSelections(selections);\n return true;\n }\n }\n selections.push(add);\n cleanupSelections(selections);\n return true;\n }\n return false;\n};\n\n/**\n * Remove a selection area from `selections` array\n * @param {SelectionDescriptor[]} selections\n * @param {SelectionDescriptor} remove Supported types: Cells, Rows, Columns\n * @param {ContextForSelectionAction} [context] Eg: {rows:1000, columns:1000}\n * @returns {boolean} is the selections array changed\n */\nconst removeFromSelections = (selections, remove, context) => {\n if (!remove || typeof remove.type !== 'number') return false;\n if (remove.type === SelectionType.Cells) {\n for (let i = 0; i < selections.length; i++) {\n const sel = selections[i];\n if (sel.type === SelectionType.UnselectedCells) {\n const parts = removePartOfCellsSelection(remove, sel);\n if (Array.isArray(parts)) {\n let result = false;\n for (let i = 0; i < parts.length; i++) {\n const isChanged = removeFromSelections(\n selections,\n parts[i],\n context,\n );\n if (isChanged) result = true;\n }\n if (result) cleanupSelections(selections);\n return result;\n }\n }\n if (sel.type === SelectionType.Cells) {\n const parts = removePartOfCellsSelection(sel, remove);\n if (parts) {\n selections.splice(i, 1, ...parts);\n i += parts.length - 1;\n }\n continue;\n }\n }\n // has context info of the grid\n if (context) {\n const unselectedAllRows =\n remove.startRow === 0 && remove.endRow + 1 >= context.rows;\n const unselectedAllColumns =\n remove.startColumn === 0 && remove.endColumn + 1 >= context.columns;\n let isChanged0, isChanged1;\n if (unselectedAllRows) {\n isChanged0 = removeFromSelections(\n selections,\n {\n type: SelectionType.Columns,\n startColumn: remove.startColumn,\n endColumn: remove.endColumn,\n },\n context,\n );\n }\n if (unselectedAllColumns) {\n isChanged1 = removeFromSelections(\n selections,\n {\n type: SelectionType.Rows,\n startRow: remove.startRow,\n endRow: remove.endRow,\n },\n context,\n );\n }\n if (unselectedAllRows || unselectedAllColumns)\n return isChanged0 || isChanged1;\n }\n\n remove.type = SelectionType.UnselectedCells;\n selections.unshift(remove);\n cleanupSelections(selections);\n return true;\n }\n // end of cells selection\n\n const isRowsSelection = remove.type === SelectionType.Rows;\n if (isRowsSelection || remove.type === SelectionType.Columns) {\n let isChanged = false;\n for (let i = 0; i < selections.length; i++) {\n const sel = selections[i];\n if (sel.type === SelectionType.Cells) {\n const parts = removePartOfCellsSelection(\n sel,\n isRowsSelection\n ? {\n startRow: remove.startRow,\n endRow: remove.endRow,\n startColumn: 0,\n endColumn: sel.endColumn,\n }\n : {\n startColumn: remove.startColumn,\n endColumn: remove.endColumn,\n startRow: 0,\n endRow: sel.endRow,\n },\n );\n if (parts) {\n selections.splice(i, 1, ...parts);\n i += parts.length - 1;\n }\n continue;\n }\n if (sel.type === SelectionType.UnselectedCells) {\n if (isRowsSelection) {\n if (sel.startRow >= remove.startRow && sel.endRow <= remove.endRow) {\n selections.splice(i, 1);\n i--;\n }\n } else {\n if (\n sel.startColumn >= remove.startColumn &&\n sel.endColumn <= remove.endColumn\n ) {\n selections.splice(i, 1);\n i--;\n }\n }\n continue;\n }\n if (sel.type === remove.type) {\n const newSelection = isRowsSelection\n ? removePartOfRowsSelection(sel, remove)\n : removePartOfColumnsSelection(sel, remove);\n if (!newSelection) continue;\n isChanged = true;\n selections.splice(i, 1, ...newSelection);\n i += newSelection.length - 1;\n } else {\n isChanged = true;\n /** @type {SelectionDescriptor} */\n let newSelection;\n if (sel.type === SelectionType.Rows) {\n newSelection = {\n type: SelectionType.UnselectedCells,\n startColumn: remove.startColumn,\n endColumn: remove.endColumn,\n startRow: sel.startRow,\n endRow: sel.endRow,\n };\n } else {\n newSelection = {\n type: SelectionType.UnselectedCells,\n startRow: remove.startRow,\n endRow: remove.endRow,\n startColumn: sel.startColumn,\n endColumn: sel.endColumn,\n };\n }\n selections.unshift(newSelection);\n }\n }\n if (isChanged) cleanupSelections(selections);\n return isChanged;\n }\n return false;\n};\n\n/**\n * Clean up a selections array.\n * This function removes unnecessary selection object, and it tries to merge different selections.\n * @param {SelectionDescriptor[]} selections\n */\nconst cleanupSelections = (selections) => {\n let unselect = [];\n let select = [];\n for (let i = 0; i < selections.length; i++) {\n const sel = selections[i];\n if (sel.type === SelectionType.UnselectedCells) unselect.push(sel);\n else select.push(sel);\n }\n // clean unused unselected objects\n unselect = unselect.filter((unsel) => {\n for (let i = 0; i < select.length; i++)\n if (getIntersection(unsel, select[i])) return true;\n return false;\n });\n // merge neighbor cells block selections\n let endMerge = false;\n while (!endMerge) {\n endMerge = true;\n for (let i = 0; i < select.length; i++) {\n const sel0 = select[i];\n for (let j = i + 1; j < select.length; j++) {\n const sel1 = select[j];\n const newSel = mergeSelections(sel0, sel1);\n if (!newSel) continue;\n select[i] = newSel;\n select.splice(j, 1);\n endMerge = false;\n break;\n }\n if (!endMerge) break;\n }\n }\n // save back to `selections`\n let ptr = 0;\n for (let i = 0; i < unselect.length; i++) selections[ptr++] = unselect[i];\n for (let i = 0; i < select.length; i++) selections[ptr++] = select[i];\n selections.splice(ptr, selections.length - ptr);\n};\n\n/**\n * Check if all cells in a given row selected\n * @param {SelectionDescriptor[]} selections\n * @param {number} rowIndex\n */\nconst isRowSelected = (selections, rowIndex) => {\n for (let i = 0; i < selections.length; i++) {\n const sel = selections[i];\n switch (sel.type) {\n case SelectionType.UnselectedCells:\n if (rowIndex >= sel.startRow && rowIndex <= sel.endRow) return false;\n break;\n case SelectionType.Rows:\n if (rowIndex >= sel.startRow && rowIndex <= sel.endRow) return true;\n }\n }\n return false;\n};\n\n/**\n * Check if all cells in a given column selected\n * @param {SelectionDescriptor[]} selections\n * @param {number} columnIndex\n */\nconst isColumnSelected = (selections, columnIndex) => {\n for (let i = 0; i < selections.length; i++) {\n const sel = selections[i];\n switch (sel.type) {\n case SelectionType.UnselectedCells:\n if (columnIndex >= sel.startColumn && columnIndex <= sel.endColumn)\n return false;\n break;\n case SelectionType.Columns:\n if (columnIndex >= sel.startColumn && columnIndex <= sel.endColumn)\n return true;\n }\n }\n return false;\n};\n\n/**\n * Check if a given cell selected\n * @param {SelectionDescriptor[]} selections\n * @param {number} rowIndex\n * @param {number} columnIndex\n */\nconst isCellSelected = (selections, rowIndex, columnIndex) => {\n for (let i = 0; i < selections.length; i++) {\n const sel = selections[i];\n switch (sel.type) {\n case SelectionType.UnselectedCells:\n case SelectionType.Cells:\n if (\n columnIndex >= sel.startColumn &&\n columnIndex <= sel.endColumn &&\n rowIndex >= sel.startRow &&\n rowIndex <= sel.endRow\n )\n return sel.type === SelectionType.Cells;\n break;\n case SelectionType.Rows:\n if (rowIndex >= sel.startRow && rowIndex <= sel.endRow) return true;\n break;\n case SelectionType.Columns:\n if (columnIndex >= sel.startColumn && columnIndex <= sel.endColumn)\n return true;\n }\n }\n return false;\n};\n\n/**\n * Check if all given cells selected\n * @param {SelectionDescriptor[]} selections\n * @param {RangeDescriptor} range the range of cells block\n * @returns {boolean}\n */\nconst areAllCellsSelected = (selections, range) => {\n const {\n startRow: startRow,\n startColumn: startColumn,\n endRow: endRow,\n endColumn: endColumn,\n } = range;\n for (let i = 0, iTo = selections.length; i < iTo; i++) {\n const sel = selections[i];\n if (!sel) continue;\n switch (sel.type) {\n case SelectionType.UnselectedCells:\n case SelectionType.Cells:\n {\n const matched0 =\n startColumn >= sel.startColumn && startRow >= sel.startRow;\n const matched1 = endColumn <= sel.endColumn && endRow <= sel.endRow;\n if (matched0 || matched1) {\n if (matched0 && matched1) return sel.type === SelectionType.Cells;\n if (\n (matched0 &&\n startColumn <= sel.endColumn &&\n startRow <= sel.endRow) ||\n (matched1 &&\n endColumn >= sel.startColumn &&\n endRow >= sel.startRow)\n )\n return false;\n }\n }\n break;\n case SelectionType.Rows:\n if (startRow >= sel.startRow) {\n if (endRow <= sel.endRow) return true;\n if (startRow <= sel.endRow) return false;\n } else if (endRow >= sel.startRow) return false;\n break;\n case SelectionType.Columns:\n if (startColumn >= sel.startColumn) {\n if (endColumn <= sel.endColumn) return true;\n if (startColumn <= sel.endColumn) return false;\n } else if (endColumn >= sel.startColumn) return false;\n }\n }\n return false;\n};\n\n/**\n * Get selection state from cells\n * @param {SelectionDescriptor[]} selections\n * @param {RangeDescriptor} range\n * @returns {boolean|boolean[][]} Returning `true` means all given cells are selected,\n * Returning `false` means all given cells are not selected.\n * Returning a two-dimensional array means some cells are selected and some cells are not selected.\n * A reference for returned value: `state[rowIndex - range.startRow][colIndex - range.startColumn]`\n */\nconst getSelectionStateFromCells = (selections, range) => {\n if (!Array.isArray(selections) || selections.length === 0) return false;\n selections = selections.filter((sel) => {\n if (typeof sel.startRow === 'number')\n if (sel.endRow < range.startRow || sel.startRow > range.endRow)\n return false;\n if (typeof sel.startColumn === 'number')\n if (\n sel.endColumn < range.startColumn ||\n sel.startColumn > range.endColumn\n )\n return false;\n return sel;\n });\n if (selections.length === 0) return false;\n if (areAllCellsSelected(selections, range)) return true;\n\n const countOfColumns = range.endColumn - range.startColumn + 1;\n const result = new Array(range.endRow - range.startRow + 1)\n .fill(null)\n .map(() => new Array(countOfColumns));\n\n const test = Object.assign({ type: SelectionType.Cells }, range);\n for (let i = selections.length - 1; i >= 0; i--) {\n const sel = selections[i];\n const intersection = getIntersection(test, sel);\n if (!intersection) continue;\n const value = sel.type !== SelectionType.UnselectedCells;\n for (\n let rowIndex = intersection.startRow;\n rowIndex <= intersection.endRow;\n rowIndex++\n ) {\n const row = result[rowIndex - range.startRow];\n let columnOffset = intersection.startColumn - range.startColumn;\n const columnOffsetEnd = intersection.endColumn - range.startColumn;\n for (; columnOffset <= columnOffsetEnd; columnOffset++)\n row[columnOffset] = value;\n }\n }\n return result;\n};\n\n/**\n * Get verbose selection state from cells.\n * (`verbose` in here means that you can locate particular selection for selected cells)\n * @param {SelectionDescriptor[]} selections\n * @param {RangeDescriptor} range\n * @returns {number[][]} Each item in this two-dimensional array is 0 or a positive int,\n * it represents the index of matched selection plus 1 if it is a positive int.\n * And if the value of item is 0, it means this cell is not selected.\n * A reference for returned value: `state[rowIndex - range.startRow][colIndex - range.startColumn]`\n */\nconst getVerboseSelectionStateFromCells = (selections, range) => {\n if (!Array.isArray(selections) || selections.length === 0) return [];\n selections = selections.map((sel) => {\n if (typeof sel.startRow === 'number')\n if (sel.endRow < range.startRow || sel.startRow > range.endRow)\n return null;\n if (typeof sel.startColumn === 'number')\n if (\n sel.endColumn < range.startColumn ||\n sel.startColumn > range.endColumn\n )\n return null;\n return sel;\n });\n if (selections.length === 0) return [];\n\n const countOfColumns = range.endColumn - range.startColumn + 1;\n const result = new Array(range.endRow - range.startRow + 1)\n .fill(null)\n .map(() => new Array(countOfColumns));\n\n const test = Object.assign({ type: SelectionType.Cells }, range);\n for (let i = selections.length - 1; i >= 0; i--) {\n const sel = selections[i];\n if (!sel) continue;\n const intersection = getIntersection(test, sel);\n if (!intersection) continue;\n const value = sel.type !== SelectionType.UnselectedCells;\n for (\n let rowIndex = intersection.startRow;\n rowIndex <= intersection.endRow;\n rowIndex++\n ) {\n const row = result[rowIndex - range.startRow];\n let columnOffset = intersection.startColumn - range.startColumn;\n const columnOffsetEnd = intersection.endColumn - range.startColumn;\n for (; columnOffset <= columnOffsetEnd; columnOffset++)\n row[columnOffset] = value ? i + 1 : 0;\n }\n }\n return result;\n};\n\n/**\n * Check if any contiguous columns are selected.\n * (This function is useful for the preconditions for actions on columns, Eg: grouping, hiding)\n * @param {SelectionDescriptor[]} selections\n * @param {boolean} allowImpurity This function ignores other selected rows/cells if its value is `true`\n * @returns {number[]} a tuple [beginViewColumnIndex, endViewColumnIndex] or `undefined`\n */\nconst getSelectedContiguousColumns = (selections, allowImpurity) => {\n if (!selections || selections.length === 0) return;\n /** A selection object */\n let matched;\n for (let i = selections.length - 1; i >= 0; i--) {\n const selection = selections[i];\n switch (selection.type) {\n case SelectionType.Columns:\n if (matched) {\n const newMatched = mergeSelections(matched, selection);\n if (newMatched) {\n matched = newMatched;\n break;\n }\n }\n matched = selection;\n break;\n case SelectionType.Rows:\n case SelectionType.Cells:\n if (!allowImpurity) return;\n break;\n case SelectionType.UnselectedCells:\n if (!matched) return;\n if (getIntersection(selection, matched)) return;\n }\n }\n if (matched) return [matched.startColumn, matched.endColumn];\n};\n\n/**\n * Check if any contiguous rows are selected.\n * (This function is useful for the preconditions for actions on rows, Eg: grouping, hiding)\n * @param {SelectionDescriptor[]} selections\n * @param {boolean} allowImpurity This function ignores other selected columns/cells if its value is `true`\n * @returns {number[]} a tuple [beginRowOrderIndex, endRowOrderIndex] or `undefined`\n */\nconst getSelectedContiguousRows = (selections, allowImpurity) => {\n if (!selections || selections.length === 0) return;\n /** A selection object */\n let matched;\n for (let i = selections.length - 1; i >= 0; i--) {\n const selection = selections[i];\n switch (selection.type) {\n case SelectionType.Rows:\n if (matched) {\n const newMatched = mergeSelections(matched, selection);\n if (newMatched) {\n matched = newMatched;\n break;\n }\n }\n matched = selection;\n break;\n case SelectionType.Columns:\n case SelectionType.Cells:\n if (!allowImpurity) return;\n break;\n case SelectionType.UnselectedCells:\n if (!matched) return;\n if (getIntersection(selection, matched)) return;\n }\n }\n if (matched) return [matched.startRow, matched.endRow];\n};\n\n/**\n * Check if current selections are complex.\n * How we defined \"complex\" in here:\n * - There are any unselected cells in selected rows/columns\n * - More than one selection type in current selections\n * @param {SelectionDescriptor[]} selections\n * @returns {boolean}\n */\nconst areSelectionsComplex = (selections) => {\n if (!selections || selections.length <= 1) return false;\n const baseType = selections[0].type;\n if (baseType === SelectionType.UnselectedCells) return true;\n return selections.findIndex((it) => it.type !== baseType) >= 0;\n};\n\n/**\n * Check if current selections are neat.\n * This method is used for make new API are compatible with obsolete API\n * For example:\n * - Selected like <0,0-10,10> or rows<5-10> is neat\n * - Selected like <0,0-10,10>&<11,1-11,10> is untidy\n * @param {SelectionDescriptor[]} selections selections after clean up\n * @returns {boolean}\n */\nconst areSelectionsNeat = (selections) => {\n if (!selections) return false;\n // nothing selected is trivially neat (copy with only an active cell, #566)\n if (selections.length <= 1) return true;\n\n const base = selections[0];\n const baseType = base.type;\n if (baseType === SelectionType.UnselectedCells) return true;\n\n for (let i = 0; i < selections.length; i++) {\n const sel = selections[i];\n if (baseType !== sel.type) return false;\n if (baseType === SelectionType.Cells) {\n if (\n sel.startColumn === base.startColumn &&\n sel.endColumn === base.endColumn\n )\n continue;\n if (sel.startRow === base.startRow && sel.endRow === base.endRow)\n continue;\n // they are not aligned\n return false;\n }\n }\n return true;\n};\n\n/**\n * @param {SelectionDescriptor[]} selections\n * @param {number} offsetX\n * @param {number} offsetY\n */\nconst moveSelections = (selections, offsetX, offsetY) => {\n for (let i = 0; i < selections.length; i++) {\n const selection = selections[i];\n switch (selection.type) {\n case SelectionType.Cells:\n case SelectionType.UnselectedCells:\n selection.startRow += offsetY;\n selection.endRow += offsetY;\n selection.startColumn += offsetX;\n selection.endColumn += offsetX;\n break;\n case SelectionType.Rows:\n selection.startRow += offsetY;\n selection.endRow += offsetY;\n break;\n case SelectionType.Columns:\n selection.startColumn += offsetX;\n selection.endColumn += offsetX;\n break;\n }\n }\n};\n\n/**\n * @param {SelectionDescriptor[]} selections\n * @returns {SelectionDescriptor[]}\n */\nconst cloneSelections = (selections) => {\n const clonedSelections = [];\n for (let i = 0; i < selections.length; i++) {\n const sel = selections[i];\n if (!sel) continue;\n clonedSelections.push(Object.assign({}, sel));\n }\n return clonedSelections;\n};\n\n/**\n * @param {SelectionDescriptor[]} selections\n * @returns {RectangleObject}\n */\nconst getSelectionBounds = (selections) => {\n /**\n * The reason why the initialize values are `Infinity` is used for making\n * the bound is compatible with the obsolete API.\n */\n let top = Infinity,\n bottom = -Infinity,\n left = Infinity,\n right = -Infinity;\n for (let i = 0; i < selections.length; i++) {\n const sel = selections[i];\n if (sel.type === SelectionType.UnselectedCells) continue;\n\n if (typeof sel.startColumn !== 'number') left = 0;\n else if (sel.startColumn < left) left = sel.startColumn;\n\n if (typeof sel.endColumn !== 'number') right = Infinity;\n else if (sel.endColumn > right) right = sel.endColumn;\n\n if (typeof sel.startRow !== 'number') top = 0;\n else if (sel.startRow < top) top = sel.startRow;\n\n if (typeof sel.endRow !== 'number') bottom = Infinity;\n else if (sel.endRow > bottom) bottom = sel.endRow;\n }\n return { top, left, bottom, right };\n};\n\n/**\n * @param {SelectionDescriptor[]} selections\n * @param {object} cell Signature: `{rowIndex:number;columnIndex:number}`\n * @param {object} keyEvent Signature: `{key:string;shiftKey:boolean}`\n * @param {object} context Signature: `{columns:number;rows:number}`\n * @returns {boolean}\n */\nconst shrinkOrExpandSelections = (selections, cell, keyEvent, context) => {\n const { rowIndex, columnIndex } = cell;\n if (rowIndex < 0 || columnIndex < 0) return false;\n\n const keyInfo = {\n ArrowLeft: { x: 1, y: 0, isLeft: true },\n ArrowUp: { x: 0, y: 1, isUp: true },\n ArrowRight: { x: -1, y: 0, isRight: true },\n ArrowDown: { x: 0, y: -1, isDown: true },\n }[keyEvent.key];\n if (!keyInfo) return false;\n\n const originalRowIndex = rowIndex + keyInfo.y;\n const originalColumnIndex = columnIndex + keyInfo.x;\n\n /** @type {number[]} */\n let matchedSelections = [];\n for (let i = 0; i < selections.length; i++) {\n /** @type {SelectionDescriptor} */\n const sel = selections[i];\n switch (sel.type) {\n case SelectionType.Cells:\n case SelectionType.UnselectedCells:\n if (\n (originalRowIndex === sel.startRow ||\n originalRowIndex === sel.endRow) &&\n (originalColumnIndex === sel.startColumn ||\n originalColumnIndex === sel.endColumn)\n ) {\n // we can't shrink or expand from a unselected areas\n if (sel.type === SelectionType.UnselectedCells) return false;\n matchedSelections.push(sel);\n }\n break;\n case SelectionType.Rows:\n if (\n originalRowIndex === sel.startRow ||\n originalRowIndex === sel.endRow\n )\n matchedSelections.push(sel);\n break;\n case SelectionType.Columns:\n if (\n originalColumnIndex === sel.startColumn ||\n originalColumnIndex === sel.endColumn\n )\n matchedSelections.push(sel);\n break;\n }\n }\n // The selection is complex.\n // Or the expanding / shrinking action is not from the border cell of selected area\n if (matchedSelections.length !== 1) return false;\n const selection = matchedSelections[0];\n\n const isTopBorder = selection.startRow === originalRowIndex;\n const isBottomBorder = selection.endRow === originalRowIndex;\n\n const isLeftBorder = selection.startColumn === originalColumnIndex;\n const isRightBorder = selection.endColumn === originalColumnIndex;\n\n const maxRow = context ? context.rows - 1 : Infinity;\n const maxColumn = context ? context.columns - 1 : Infinity;\n\n const afterChange = () => {\n cleanupSelections(selections);\n return true;\n };\n\n if (isTopBorder) {\n if (keyInfo.isUp) {\n // at the topmost row\n if (selection.startRow === 0) return false;\n // expand to the up\n selection.startRow--;\n return afterChange();\n } else if (keyInfo.isDown && selection.startRow < selection.endRow) {\n selection.startRow++;\n return afterChange();\n }\n }\n if (isBottomBorder) {\n if (keyInfo.isDown) {\n // at the bottomost row\n if (selection.endRow >= maxRow) return false;\n // expand to the down\n selection.endRow++;\n return afterChange();\n } else if (keyInfo.isUp && selection.startRow < selection.endRow) {\n selection.endRow--;\n return afterChange();\n }\n }\n if (isLeftBorder) {\n if (keyInfo.isLeft) {\n // at the leftmost column\n if (selection.startColumn === 0) return false;\n // expand to the left\n selection.startColumn--;\n return afterChange();\n } else if (keyInfo.isRight && selection.startColumn < selection.endColumn) {\n selection.startColumn++;\n return afterChange();\n }\n }\n if (isRightBorder) {\n if (keyInfo.isRight) {\n // at the rightmost column\n if (selection.endColumn >= maxColumn) return false;\n // expand to the down\n selection.endColumn++;\n return afterChange();\n } else if (keyInfo.isLeft && selection.startColumn < selection.endColumn) {\n selection.endColumn--;\n return afterChange();\n }\n }\n return false;\n};\n\nexport {\n SelectionType,\n getSelectionFromString,\n normalizeSelection,\n addIntoSelections,\n removeFromSelections,\n mergeSelections,\n removePartOfRowsSelection,\n removePartOfColumnsSelection,\n removePartOfCellsSelection,\n cleanupSelections,\n getIntersection,\n isRowSelected,\n isColumnSelected,\n isCellSelected,\n areAllCellsSelected,\n areSelectionsNeat,\n getSelectionStateFromCells,\n getVerboseSelectionStateFromCells,\n areSelectionsComplex,\n getSelectedContiguousColumns,\n getSelectedContiguousRows,\n moveSelections,\n cloneSelections,\n getSelectionBounds,\n shrinkOrExpandSelections,\n};\n","module.exports=function(e){var o={};function a(t){if(o[t])return o[t].exports;var r=o[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,a),r.l=!0,r.exports}return a.m=e,a.c=o,a.d=function(e,o,t){a.o(e,o)||Object.defineProperty(e,o,{enumerable:!0,get:t})},a.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},a.t=function(e,o){if(1&o&&(e=a(e)),8&o)return e;if(4&o&&\"object\"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(a.r(t),Object.defineProperty(t,\"default\",{enumerable:!0,value:e}),2&o&&\"string\"!=typeof e)for(var r in e)a.d(t,r,function(o){return e[o]}.bind(null,r));return t},a.n=function(e){var o=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(o,\"a\",o),o},a.o=function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},a.p=\"\",a(a.s=0)}([function(e,o,a){\"use strict\";Object.defineProperty(o,\"__esModule\",{value:!0});var t=a(1),r=Object.keys(t.default).reduce((function(e,o){return e.concat(t.default[o])}),[]);o.default=function(e){return-1===r.indexOf(e.key)}},function(e,o,a){\"use strict\";Object.defineProperty(o,\"__esModule\",{value:!0});o.default={modifier:[\"Alt\",\"AltGraph\",\"CapsLock\",\"Control\",\"Fn\",\"FnLock\",\"Meta\",\"NumLock\",\"ScrollLock\",\"Shift\",\"Symbol\",\"SymbolLock\"],legacyModifier:[\"Hyper\",\"Super\"],whiteSpace:[\"Enter\",\"Tab\"],navigation:[\"ArrowDown\",\"ArrowLeft\",\"ArrowRight\",\"ArrowUp\",\"End\",\"Home\",\"PageDown\",\"PageUp\"],editing:[\"Backspace\",\"Clear\",\"Copy\",\"CrSel\",\"Cut\",\"Delete\",\"EraseEof\",\"ExSel\",\"Insert\",\"Paste\",\"Redo\",\"Undo\"],ui:[\"Accept\",\"Again\",\"Attn\",\"Cancel\",\"ContextMenu\",\"Escape\",\"Execute\",\"Find\",\"Help\",\"Pause\",\"Play\",\"Props\",\"Select\",\"ZoomIn\",\"ZoomOut\"],device:[\"BrightnessDown\",\"BrightnessUp\",\"Eject\",\"LogOff\",\"Power\",\"PowerOff\",\"PrintScreen\",\"Hibernate\",\"Standby\",\"WakeUp\"],imeCompositionKeys:[\"AllCandidates\",\"Alphanumeric\",\"CodeInput\",\"Compose\",\"Convert\",\"Dead\",\"FinalMode\",\"GroupFirst\",\"GroupLast\",\"GroupNext\",\"GroupPrevious\",\"ModeChange\",\"NextCandidate\",\"NonConvert\",\"PreviousCandidate\",\"Process\",\"SingleCandidate\"],koreanSpecific:[\"HangulMode\",\"HanjaMode\",\"JunjaMode\"],japaneseSpecific:[\"Eisu\",\"Hankaku\",\"Hiragana\",\"HiraganaKatakana\",\"KanaMode\",\"KanjiMode\",\"Katakana\",\"Romaji\",\"Zenkaku\",\"ZenkakuHankaku\"],commonFunction:[\"F1\",\"F2\",\"F3\",\"F4\",\"F5\",\"F6\",\"F7\",\"F8\",\"F9\",\"F10\",\"F11\",\"F12\",\"Soft1\",\"Soft2\",\"Soft3\",\"Soft4\"],multimedia:[\"ChannelDown\",\"ChannelUp\",\"Close\",\"MailForward\",\"MailReply\",\"MailSend\",\"MediaClose\",\"MediaFastForward\",\"MediaPause\",\"MediaPlay\",\"MediaPlayPause\",\"MediaRecord\",\"MediaRewind\",\"MediaStop\",\"MediaTrackNext\",\"MediaTrackPrevious\",\"New\",\"Open\",\"Print\",\"Save\",\"SpellCheck\"],multimediaNumpad:[\"Key11\",\"Key12\"],audio:[\"AudioBalanceLeft\",\"AudioBalanceRight\",\"AudioBassBoostDown\",\"AudioBassBoostToggle\",\"AudioBassBoostUp\",\"AudioFaderFront\",\"AudioFaderRear\",\"AudioSurroundModeNext\",\"AudioTrebleDown\",\"AudioTrebleUp\",\"AudioVolumeDown\",\"AudioVolumeUp\",\"AudioVolumeMute\",\"MicrophoneToggle\",\"MicrophoneVolumeDown\",\"MicrophoneVolumeUp\",\"MicrophoneVolumeMute\"],speech:[\"SpeechCorrectionList\",\"SpeechInputToggle\"],application:[\"LaunchApplication1\",\"LaunchApplication2\",\"LaunchCalendar\",\"LaunchContacts\",\"LaunchMail\",\"LaunchMediaPlayer\",\"LaunchMusicPlayer\",\"LaunchPhone\",\"LaunchScreenSaver\",\"LaunchSpreadsheet\",\"LaunchWebBrowser\",\"LaunchWebCam\",\"LaunchWordProcessor\"],browser:[\"BrowserBack\",\"BrowserFavorites\",\"BrowserForward\",\"BrowserHome\",\"BrowserRefresh\",\"BrowserSearch\",\"BrowserStop\"],mobilePhone:[\"AppSwitch\",\"Call\",\"Camera\",\"CameraFocus\",\"EndCall\",\"GoBack\",\"GoHome\",\"HeadsetHook\",\"LastNumberRedial\",\"Notification\",\"MannerMode\",\"VoiceDial\"],tv:[\"TV\",\"TV3DMode\",\"TVAntennaCable\",\"TVAudioDescription\",\"TVAudioDescriptionMixDown\",\"TVAudioDescriptionMixUp\",\"TVContentsMenu\",\"TVDataService\",\"TVInput\",\"TVInputComponent1\",\"TVInputComponent2\",\"TVInputComposite1\",\"TVInputComposite2\",\"TVInputHDMI1\",\"TVInputHDMI2\",\"TVInputHDMI3\",\"TVInputHDMI4\",\"TVInputVGA1\",\"TVMediaContext\",\"TVNetwork\",\"TVNumberEntry\",\"TVPower\",\"TVRadioService\",\"TVSatellite\",\"TVSatelliteBS\",\"TVSatelliteCS\",\"TVSatelliteToggle\",\"TVTerrestrialAnalog\",\"TVTerrestrialDigital\",\"TVTimer\"],mediaControls:[\"AVRInput\",\"AVRPower\",\"ColorF0Red\",\"ColorF1Green\",\"ColorF2Yellow\",\"ColorF3Blue\",\"ColorF4Grey\",\"ColorF5Brown\",\"ClosedCaptionToggle\",\"Dimmer\",\"DisplaySwap\",\"DVR\",\"Exit\",\"FavoriteClear0\",\"FavoriteClear1\",\"FavoriteClear2\",\"FavoriteClear3\",\"FavoriteRecall0\",\"FavoriteRecall1\",\"FavoriteRecall2\",\"FavoriteRecall3\",\"FavoriteStore0\",\"FavoriteStore1\",\"FavoriteStore2\",\"FavoriteStore3\",\"Guide\",\"GuideNextDay\",\"GuidePreviousDay\",\"Info\",\"InstantReplay\",\"Link\",\"ListProgram\",\"LiveContent\",\"Lock\",\"MediaApps\",\"MediaAudioTrack\",\"MediaLast\",\"MediaSkipBackward\",\"MediaSkipForward\",\"MediaStepBackward\",\"MediaStepForward\",\"MediaTopMenu\",\"NavigateIn\",\"NavigateNext\",\"NavigateOut\",\"NavigatePrevious\",\"NextFavoriteChannel\",\"NextUserProfile\",\"OnDemand\",\"Pairing\",\"PinPDown\",\"PinPMove\",\"PinPToggle\",\"PinPUp\",\"PlaySpeedDown\",\"PlaySpeedReset\",\"PlaySpeedUp\",\"RandomToggle\",\"RcLowBattery\",\"RecordSpeedNext\",\"RfBypass\",\"ScanChannelsToggle\",\"ScreenModeNext\",\"Settings\",\"SplitScreenToggle\",\"STBInput\",\"STBPower\",\"Subtitle\",\"Teletext\",\"VideoModeNext\",\"Wink\",\"ZoomToggle\"]}}]).default;","'use strict';\n\nconst isSupportedHtml = function (pasteValue) {\n // We need to match new lines in the HTML, .* won't match new line characters.\n // `s` regex modifier can't be used with `ecmaVersion === 2017`.\n // As a workaround using [\\s\\S]*. Fix when we upgrade `ecmaVersion`.\n const genericDiv = /(?:^(<meta[^>]*>)?[\\s\\S]*<div[^>]*>)/;\n const genericSpan = /(?:^(<meta[^>]*>)?[\\s\\S]*<span[^>]*>)/;\n const genericTable = /(?:^(<meta[^>]*>)?[\\s\\S]*<table[^>]*>)/; // Matches Google Sheets format clipboard data format too.\n const excelTable = /(?:<!--StartFragment-->[\\s\\S]*<tr[^>]*>)/;\n const excelTableRow = /(?:<!--StartFragment-->[\\s\\S]*<td[^>]*>)/;\n\n return [\n genericDiv,\n genericTable,\n genericSpan,\n excelTable,\n excelTableRow,\n ].some((expression) => expression.test(pasteValue));\n};\n\n// Explanation of nodeType here: https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst IGNORE_NODETYPES = [8, 3]; // '#text' and '#comment'\n\nconst isHtmlTable = function (pasteValue) {\n return /(?:<table[^>]*>)|(?:<tr[^]*>)/.test(pasteValue);\n};\n\nconst sanitizeElementData = function (element) {\n // It is not entirely clear if this check on nodeType is required.\n let elementData = element.nodeType === 1 ? element.innerText : element.data;\n\n return String(elementData).replace(/\\s+/g, ' ').trim();\n};\n\nconst parseHtmlText = function (data) {\n const doc = new DOMParser().parseFromString(data, 'text/html');\n const element = doc.querySelector('div') || doc.querySelector('span');\n const elementData = sanitizeElementData(element);\n\n return elementData\n .split('\\n')\n .map((item) => item.split('\\t').map((value) => ({ value: [{ value }] })));\n};\n\nconst parseHtmlTable = function (data) {\n const doc = new DOMParser().parseFromString(data, 'text/html');\n const trs = doc.querySelectorAll('table tr');\n const rows = [];\n\n for (const tr of trs) {\n const row = [];\n\n for (const childNode of tr.childNodes) {\n if (IGNORE_NODETYPES.includes(childNode.nodeType)) continue;\n\n const col = { value: [] };\n const value = sanitizeElementData(childNode);\n\n if (value) col.value.push({ value });\n\n row.push(col);\n }\n\n rows.push(row);\n }\n\n return rows;\n};\n\nconst parseText = function (data) {\n return data\n .split('\\n')\n .map((item) => item.split('\\t').map((value) => ({ value: [{ value }] })));\n};\n\nconst parseData = function (data, mimeType) {\n if (mimeType === 'text/html' && isHtmlTable(data)) {\n return parseHtmlTable(data);\n } else if (mimeType === 'text/html') {\n return parseHtmlText(data);\n }\n\n // Default data format is string, so split on new line,\n // and then enclose in an array (a row with one cell):\n return parseText(data);\n};\n\nconst htmlSafe = function (value) {\n if (typeof value !== 'string') return value;\n\n return value.replace(/</g, '<').replace(/>/g, '>');\n};\n\nconst createTextString = function (selectedData, isNeat) {\n // Selected like [[0, 1], [0, 1]] of [[0, 3]] is neat; Selected like [[0, 1], [1, 2]] is untidy.\n // If not isNeat we just return a simple string of concatenated values.\n if (!isNeat)\n return selectedData.map((row) => Object.values(row).join('')).join('');\n\n // If isNeat, we can create tab separated mutti-line text.\n return selectedData.map((row) => Object.values(row).join('\\t')).join('\\n');\n};\n\nconst createHTMLString = function (selectedData, isNeat) {\n if (!isNeat) return createTextString(selectedData, isNeat);\n\n // If isNeat, we can create a HTML table with the selected data.\n let htmlString = '<table>';\n htmlString += selectedData\n .map(\n (row) =>\n '<tr>' +\n Object.values(row)\n .map((value) => ['<td>', htmlSafe(value), '</td>'].join(''))\n .join('') +\n '</tr>',\n )\n .join('');\n htmlString += '</table>';\n\n return htmlString;\n};\n\n/**\n * deduce the type of values in the column 'colNum' of data represented by 'rows'\n * if the column is not empty and all values in the column are numbers, then the type is 'number',\n * otherwise the type is 'string'.\n * Purpose: check the type of pasted data when a new column is created dynamically\n * @param {Array} rows - array of rows, e.g. [ [{\"value\": [{\"value\": \"a\"}]},{\"value\": [{\"value\": \"b\"}]}], [{\"value\": [{\"value\": \"1\"}]},{\"value\": [{\"value\": \"2\"}]}] ]\n * @param {number} colNum - Column index to check\n * @returns {(\"string\" | \"number\")} deduced type\n */\nconst deduceColTypeFromData = function (rows, colNum) {\n const len = rows.length;\n // the first row can represent column headings.\n // if one row is pasted, check it, otherwise start from the second row.\n const startRow = len === 1 ? 0 : 1;\n let isColEmpty = true;\n for (let i = startRow; i < len; i += 1) {\n const cellData = rows[i][colNum];\n if (!cellData || cellData.value.length === 0) {\n continue;\n }\n isColEmpty = false;\n const val = cellData.value[0].value;\n if (!Number.isFinite(Number(val))) {\n return 'string';\n }\n }\n return isColEmpty ? 'string' : 'number';\n};\n\nexport {\n createTextString,\n createHTMLString,\n isSupportedHtml,\n htmlSafe,\n parseData,\n parseHtmlTable,\n parseHtmlText,\n parseText,\n sanitizeElementData,\n deduceColTypeFromData,\n};\n","/*jslint browser: true, unparam: true, todo: true, evil: true*/\n/*globals Reflect: false, HTMLElement: true, define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport component from './component';\nimport defaults from './defaults';\nimport draw from './draw';\nimport events from './events';\nimport touch from './touch';\nimport intf from './intf';\nimport selections from './selections/index';\nimport contextMenu from './contextMenu';\nimport button from './button';\nimport dom from './dom';\nimport publicMethods from './publicMethods';\n\nvar webComponent = component();\n\nvar modules = [\n defaults,\n draw,\n events,\n touch,\n intf,\n selections,\n contextMenu,\n button,\n dom,\n publicMethods,\n];\n\nfunction Grid(args) {\n args = args || {};\n var self = {};\n self.isComponent = args.component === undefined;\n self.isChildGrid =\n args.parentNode &&\n /canvas-datagrid-(cell|tree)/.test(args.parentNode.nodeType);\n if (self.isChildGrid) {\n self.intf = {};\n } else {\n // Written directly (no eval) so the bundle works under a Content Security\n // Policy without 'unsafe-eval' (#311); ES5-only browsers are not targeted.\n self.intf = self.isComponent\n ? Reflect.construct(HTMLElement, [], new.target)\n : document.createElement('canvas');\n }\n self.args = args;\n self.intf.args = args;\n self.applyComponentStyle = webComponent.applyComponentStyle;\n self.hyphenateProperty = webComponent.hyphenateProperty;\n self.dehyphenateProperty = webComponent.dehyphenateProperty;\n self.createGrid = function grid(args) {\n args.component = false;\n return new Grid(args);\n };\n\n modules.forEach(function (module) {\n module(self);\n });\n\n if (self.isChildGrid) {\n self.shadowRoot = args.parentNode.shadowRoot;\n self.parentNode = args.parentNode;\n } else {\n self.shadowRoot = self.intf.attachShadow({ mode: 'open' });\n self.parentNode = self.shadowRoot;\n }\n self.init();\n return self.intf;\n}\nif (window.HTMLElement) {\n Grid.prototype = Object.create(window.HTMLElement.prototype);\n}\n// export web component\nif (window.customElements) {\n Grid.observedAttributes = webComponent.getObservableAttributes();\n Grid.prototype.disconnectedCallback = webComponent.disconnectedCallback;\n Grid.prototype.attributeChangedCallback =\n webComponent.attributeChangedCallback;\n Grid.prototype.connectedCallback = webComponent.connectedCallback;\n Grid.prototype.adoptedCallback = webComponent.adoptedCallback;\n window.customElements.define('canvas-datagrid', Grid);\n}\n\n// export global\nif (\n window &&\n !window.canvasDatagrid &&\n !window.require &&\n // Present to exclude global declarations from ES Module bundles\n !window.EXCLUDE_GLOBAL\n) {\n window.canvasDatagrid = function (args) {\n return new Grid(args);\n };\n}\n\n// export amd loader\nexport default function canvasDatagrid(args) {\n args = args || {};\n var i,\n tKeys = [\n 'style',\n 'formatters',\n 'sorters',\n 'filters',\n 'treeGridAttributes',\n 'cellGridAttributes',\n 'fillCellCallback',\n 'data',\n 'schema',\n ];\n if (window.customElements) {\n i = document.createElement('canvas-datagrid');\n Object.keys(args).forEach(function (argKey) {\n // set data and parentNode after everything else\n if (argKey === 'data') {\n return;\n }\n if (argKey === 'parentNode') {\n return;\n }\n // top level keys in args\n if (tKeys.indexOf(argKey) !== -1) {\n tKeys.forEach(function (tKey) {\n if (args[tKey] === undefined || tKey !== argKey) {\n return;\n }\n if (['formatters', 'sorters', 'filters'].indexOf(argKey) !== -1) {\n if (typeof args[tKey] === 'object' && args[tKey] !== null) {\n Object.keys(args[tKey]).forEach(function (sKey) {\n i[tKey][sKey] = args[tKey][sKey];\n });\n }\n } else {\n i[tKey] = args[tKey];\n }\n });\n return;\n }\n // all others are attribute level keys\n i.attributes[argKey] = args[argKey];\n });\n if (args.data) {\n i.data = args.data;\n }\n // add to the dom very last to avoid redraws\n if (args.parentNode) {\n args.parentNode.appendChild(i);\n }\n return i;\n }\n args.component = false;\n i = new Grid(args);\n if (args.parentNode && args.parentNode.appendChild) {\n args.parentNode.appendChild(i);\n }\n return i;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport defaults from './defaults';\n\nexport default function () {\n var typeMap,\n component = {};\n component.dehyphenateProperty = function hyphenateProperty(prop) {\n prop = prop.replace('--cdg-', '');\n var p = '',\n nextLetterCap;\n Array.prototype.forEach.call(prop, function (char) {\n if (nextLetterCap) {\n nextLetterCap = false;\n p += char.toUpperCase();\n return;\n }\n if (char === '-') {\n nextLetterCap = true;\n return;\n }\n p += char;\n });\n return p;\n };\n component.hyphenateProperty = function hyphenateProperty(prop, cust) {\n var p = '';\n Array.prototype.forEach.call(prop, function (char) {\n if (char === char.toUpperCase()) {\n p += '-' + char.toLowerCase();\n return;\n }\n p += char;\n });\n return (cust ? '--cdg-' : '') + p;\n };\n function getDefaultItem(base, item) {\n var i = {},\n r;\n defaults(i);\n r = i.defaults[base].filter(function (i) {\n return (\n i[0].toLowerCase() === item.toLowerCase() ||\n component.hyphenateProperty(i[0]) === item.toLowerCase() ||\n component.hyphenateProperty(i[0], true) === item.toLowerCase()\n );\n })[0];\n return r;\n }\n component.applyComponentStyle = function (supressChangeAndDrawEvents, intf) {\n if (!intf.isComponent) {\n return;\n }\n var cStyle = window.getComputedStyle(\n intf.tagName === 'CANVAS-DATAGRID' ? intf : intf.canvas,\n null,\n ),\n defs = {};\n intf.computedStyle = cStyle;\n defaults(defs);\n defs.defaults.styles.forEach(function (def) {\n var val;\n val = cStyle.getPropertyValue(component.hyphenateProperty(def[0], true));\n if (val === '') {\n val = cStyle.getPropertyValue(\n component.hyphenateProperty(def[0], false),\n );\n }\n if (\n /^overflow[XY]$/.test(def[0]) &&\n typeof val === 'string' &&\n val.trim() === 'visible'\n ) {\n // 'visible' is the CSS default, not something the page asked for,\n // and not a grid value: keep the overflow set through grid.style\n // instead of overwriting it on every style pass (#248)\n return;\n }\n if (val !== '' && typeof val === 'string') {\n intf.setStyleProperty(\n def[0],\n typeMap[typeof def[1]](\n val.replace(/^\\s+/, '').replace(/\\s+$/, ''),\n def[1],\n ),\n true,\n );\n }\n });\n if (!supressChangeAndDrawEvents && intf.dispatchEvent) {\n requestAnimationFrame(function () {\n intf.resize(true);\n });\n intf.dispatchEvent('stylechanged', intf.style);\n }\n };\n typeMap = {\n data: function (strData) {\n try {\n return JSON.parse(strData);\n } catch (e) {\n throw new Error('Cannot read JSON data in canvas-datagrid data.');\n }\n },\n schema: function (strSchema) {\n try {\n return JSON.parse(strSchema);\n } catch (e) {\n throw new Error(\n 'Cannot read JSON data in canvas-datagrid schema attribute.',\n );\n }\n },\n number: function (strNum, def) {\n var n = parseInt(strNum, 10);\n return isNaN(n) ? def : n;\n },\n boolean: function (strBool) {\n return /true/i.test(strBool);\n },\n string: function (str) {\n return str;\n },\n };\n component.getObservableAttributes = function () {\n var i = {},\n attrs = ['data', 'schema', 'style', 'className', 'name'];\n defaults(i);\n i.defaults.attributes.forEach(function (attr) {\n attrs.push(attr[0].toLowerCase());\n });\n return attrs;\n };\n component.disconnectedCallback = function () {\n this.connected = false;\n // stop observing while detached so a removed grid can be collected (#338)\n if (this.observer && this.observer.disconnect) {\n this.observer.disconnect();\n this.observer = undefined;\n }\n if (typeof this.unobserveResizeTargets === 'function') {\n this.unobserveResizeTargets();\n }\n };\n component.connectedCallback = function () {\n var intf = this;\n intf.parentDOMNode.innerHTML = '';\n intf.parentDOMNode.appendChild(intf.canvas);\n intf.connected = true;\n component.observe(intf);\n if (typeof intf.observeResizeTargets === 'function') {\n intf.observeResizeTargets();\n }\n component.applyComponentStyle(true, intf);\n intf.resize(true);\n };\n component.adoptedCallback = function () {\n this.resize();\n };\n component.attributeChangedCallback = function (attrName, oldVal, newVal) {\n var tfn,\n intf = this,\n def;\n if (attrName === 'style') {\n component.applyComponentStyle(false, intf);\n return;\n }\n if (attrName === 'data') {\n if (intf.dataType === 'application/x-canvas-datagrid') {\n intf.dataType = 'application/json+x-canvas-datagrid';\n }\n intf.data = newVal;\n return;\n }\n if (attrName === 'schema') {\n intf.schema = typeMap.schema(newVal);\n return;\n }\n if (attrName === 'name') {\n intf.name = newVal;\n return;\n }\n if (attrName === 'class' || attrName === 'className') {\n return;\n }\n def = getDefaultItem('attributes', attrName);\n if (def) {\n tfn = typeMap[typeof def[1]];\n intf.attributes[def[0]] = tfn(newVal);\n return;\n }\n if (/^on/.test(attrName)) {\n // inline handler attributes need the Function constructor, which a\n // strict Content Security Policy forbids; degrade with a warning (#311)\n var handler;\n try {\n handler = new Function('e', newVal);\n } catch (err) {\n console.warn(\n 'canvas-datagrid: cannot bind the %s attribute under the current Content Security Policy; use addEventListener instead.',\n attrName,\n );\n return;\n }\n intf.addEventListener('on' + attrName, handler);\n }\n return;\n };\n component.observe = function (intf) {\n var observer;\n if (!window.MutationObserver) {\n return;\n }\n // connectedCallback runs on every (re)attach: never stack observers (#338)\n if (intf.observer && intf.observer.disconnect) {\n intf.observer.disconnect();\n }\n intf.applyComponentStyle = function () {\n component.applyComponentStyle(false, intf);\n intf.resize();\n };\n /**\n * Applies the computed css styles to the grid. In some browsers, changing directives in attached style sheets does not automatically update the styles in this component. It is necessary to call this method to update in these cases.\n * @memberof canvasDatagrid\n * @name applyComponentStyle\n * @method\n */\n observer = new window.MutationObserver(function (mutations) {\n var checkInnerHTML, checkStyle;\n Array.prototype.forEach.call(mutations, function (mutation) {\n if (\n mutation.attributeName === 'class' ||\n mutation.attributeName === 'style'\n ) {\n checkStyle = true;\n return;\n }\n if (mutation.target.nodeName === 'STYLE') {\n checkStyle = true;\n return;\n }\n if (\n mutation.target.parentNode &&\n mutation.target.parentNode.nodeName === 'STYLE'\n ) {\n checkStyle = true;\n return;\n }\n if (\n mutation.target === intf &&\n (mutation.addedNodes.length > 0 || mutation.type === 'characterData')\n ) {\n checkInnerHTML = true;\n }\n });\n if (checkStyle) {\n intf.applyComponentStyle(false, intf);\n }\n if (checkInnerHTML) {\n if (intf.dataType === 'application/x-canvas-datagrid') {\n intf.dataType = 'application/json+x-canvas-datagrid';\n }\n intf.data = intf.innerHTML;\n }\n });\n intf.observer = observer;\n observer.observe(intf, {\n characterData: true,\n childList: true,\n attributes: true,\n subtree: true,\n });\n Array.prototype.forEach.call(\n document.querySelectorAll('style'),\n function (el) {\n observer.observe(el, {\n characterData: true,\n childList: true,\n attributes: true,\n subtree: true,\n });\n },\n );\n };\n return component;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals XMLSerializer: false, define: true, Blob: false, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport { isCellSelected } from './selections/util';\n\nexport default function (self) {\n var perfCounters = [],\n cachedImagesDrawn = false,\n drawCount = 0,\n perfWindowSize = 300,\n entityCount = [],\n hiddenFrozenColumnCount = 0,\n scrollDebugCounters = [],\n touchPPSCounters = [];\n self.htmlImageCache = {};\n // more heavyweight version than fillArray defined in intf.js\n function fillArray(low, high, step, def) {\n step = step || 1;\n var i = [],\n x;\n for (x = low; x <= high; x += step) {\n i[x] = def === undefined ? x : typeof def === 'function' ? def(x) : def;\n }\n return i;\n }\n function drawPerfLine(w, h, x, y, perfArr, arrIndex, max, color, useAbs) {\n var i = w / perfArr.length,\n r = h / max;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.moveTo(x, y + h);\n perfArr.forEach(function (n) {\n var val = arrIndex === undefined ? n : n[arrIndex],\n cx,\n cy;\n if (useAbs) {\n val = Math.abs(val);\n }\n cx = x + i;\n cy = y + h - val * r;\n self.ctx.lineTo(cx, cy);\n x += i;\n });\n self.ctx.moveTo(x + w, y + h);\n self.ctx.strokeStyle = color;\n self.ctx.stroke();\n }\n function drawOnAllImagesLoaded() {\n var loaded = true;\n Object.keys(self.htmlImageCache).forEach(function (html) {\n if (!self.htmlImageCache[html].img.complete) {\n loaded = false;\n }\n });\n if (loaded && !cachedImagesDrawn) {\n cachedImagesDrawn = true;\n self.draw();\n }\n }\n function drawHtml(cell) {\n var img,\n v = cell.innerHTML || cell.formattedValue,\n cacheKey =\n v.toString() + cell.rowIndex.toString() + cell.columnIndex.toString(),\n x = Math.round(cell.x + self.canvasOffsetLeft),\n y = Math.round(cell.y + self.canvasOffsetTop);\n if (self.htmlImageCache[cacheKey]) {\n img = self.htmlImageCache[cacheKey].img;\n if (\n self.htmlImageCache[cacheKey].height !== cell.height ||\n self.htmlImageCache[cacheKey].width !== cell.width\n ) {\n // height and width of the cell has changed, invalidate cache\n self.htmlImageCache[cacheKey] = undefined;\n } else {\n if (!img.complete) {\n return;\n }\n return self.ctx.drawImage(img, x, y);\n }\n } else {\n cachedImagesDrawn = false;\n }\n img = new Image(cell.width, cell.height);\n self.htmlImageCache[cacheKey] = {\n img,\n width: cell.width,\n height: cell.height,\n };\n img.onload = function () {\n self.ctx.drawImage(img, x, y);\n drawOnAllImagesLoaded();\n };\n img.src =\n 'data:image/svg+xml;base64,' +\n btoa(\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"' +\n cell.width +\n '\" height=\"' +\n cell.height +\n '\">\\n' +\n '<foreignObject class=\"node\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\">\\n' +\n '<body xmlns=\"http://www.w3.org/1999/xhtml\" style=\"margin:0;padding:0;\">\\n' +\n v +\n '\\n' +\n '</body>' +\n '</foreignObject>\\n' +\n '</svg>\\n',\n );\n }\n /**\n * @param {number[]} coords [x0,y0, x1,y1, x2,y2, ...]\n * @param {boolean} [fill] fill the area that construct by these lines but not stroke\n */\n function drawLines(coords, fill) {\n if (coords.length < 4) return;\n self.ctx.beginPath();\n self.ctx.moveTo(\n coords[0] + self.canvasOffsetLeft,\n coords[1] + self.canvasOffsetTop,\n );\n for (let i = 2; i < coords.length; i += 2) {\n const x = coords[i] + self.canvasOffsetLeft;\n const y = coords[i + 1] + self.canvasOffsetTop;\n self.ctx.lineTo(x, y);\n }\n if (fill) self.ctx.fill();\n else self.ctx.stroke();\n }\n /**\n * @param {number} x based-X (left-top)\n * @param {number} y based-Y (left-top)\n * @param {number} width\n * @param {boolean} collapsed true: '+'; false: '-'\n */\n function drawGroupHandle(x, y, width, collapsed) {\n fillRect(x, y, width, width);\n strokeRect(x, y, width, width);\n const cx = x + width * 0.5;\n const cy = y + width * 0.5;\n drawLines([x + width * 0.2, cy, x + width * 0.78, cy]);\n if (collapsed) drawLines([cx, y + width * 0.22, cx, y + width * 0.8]);\n }\n /**\n * @param {number} x\n * @param {number} y\n * @param {number} size\n * @param {string} dir Direction of the triangle, one of the 't','b','l' and 'r'\n * @param {boolean} [active]\n */\n function drawUnhideIndicator(x, y, size, dir, active) {\n const minPadding = size * 0.2;\n const maxPadding = size * 0.3;\n /** The long edge width of the triangle */\n const longEdge = size - 2 * minPadding;\n /** The median width of the triangle */\n const median = size - 2 * maxPadding;\n const halfLongEdge = longEdge * 0.5;\n let x0, y0;\n let coords, borderCoords;\n switch (dir) {\n case 'r':\n x0 = x + maxPadding;\n y0 = y + minPadding;\n borderCoords = [x, y, x + size, y, x + size, y + size, x, y + size];\n coords = [x0, y0, x0, y0 + longEdge, x0 + median, y0 + halfLongEdge];\n break;\n case 'l':\n x0 = x + size - maxPadding;\n y0 = y + minPadding;\n borderCoords = [x + size, y, x, y, x, y + size, x + size, y + size];\n coords = [x0, y0, x0, y0 + longEdge, x0 - median, y0 + halfLongEdge];\n break;\n case 't':\n x0 = x + minPadding;\n y0 = y + size - maxPadding;\n borderCoords = [x, y + size, x, y, x + size, y, x + size, y + size];\n coords = [x0, y0, x0 + longEdge, y0, x0 + halfLongEdge, y0 - median];\n break;\n case 'b':\n x0 = x + minPadding;\n y0 = y + maxPadding;\n borderCoords = [x, y, x, y + size, x + size, y + size, x + size, y];\n coords = [x0, y0, x0 + longEdge, y0, x0 + halfLongEdge, y0 + median];\n break;\n }\n\n if (active) {\n self.ctx.strokeStyle = self.style.unhideIndicatorBorderColor;\n self.ctx.lineWidth = 2;\n drawLines(borderCoords);\n\n self.ctx.fillStyle = self.style.unhideIndicatorBackgroundColor;\n let offset = dir === 'r' || dir === 'b' ? 1 : 0;\n if (dir === 'l' || dir === 'r')\n fillRect(x - offset, y, size + offset, size);\n else fillRect(x, y - offset, size, size + offset);\n }\n\n self.ctx.fillStyle = self.style.unhideIndicatorColor;\n drawLines(coords, true);\n }\n function drawOrderByArrow(x, y) {\n var mt = self.style.columnHeaderOrderByArrowMarginTop * self.scale,\n ml = self.style.columnHeaderOrderByArrowMarginLeft * self.scale,\n mr = self.style.columnHeaderOrderByArrowMarginRight * self.scale,\n aw = self.style.columnHeaderOrderByArrowWidth * self.scale,\n ah = self.style.columnHeaderOrderByArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.columnHeaderOrderByArrowColor;\n self.ctx.strokeStyle = self.style.columnHeaderOrderByArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n if (self.orderDirection === 'asc') {\n self.ctx.lineTo(x, y + ah);\n self.ctx.lineTo(x + aw, y + ah);\n self.ctx.lineTo(x + aw * 0.5, y);\n self.ctx.lineTo(x, y + ah);\n } else {\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n }\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw + mr;\n }\n function drawTreeArrow(cell, x, y) {\n var mt = self.style.treeArrowMarginTop * self.scale,\n mr = self.style.treeArrowMarginRight * self.scale,\n ml = self.style.treeArrowMarginLeft * self.scale,\n aw = self.style.treeArrowWidth * self.scale,\n ah = self.style.treeArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.treeArrowColor;\n self.ctx.strokeStyle = self.style.treeArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n if (self.openChildren[cell.rowIndex]) {\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n } else {\n self.ctx.lineTo(x, y);\n self.ctx.lineTo(x + ah, y + aw * 0.5);\n self.ctx.lineTo(x, y + aw);\n self.ctx.lineTo(x, y);\n }\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw + mr;\n }\n function drawCellTreeIcon(cell, tree, rowTree) {\n const parentCount = rowTree ? tree.parentCount : 0;\n const iconSize = self.style.cellTreeIconWidth * self.scale,\n marginTop = self.style.cellTreeIconMarginTop * self.scale,\n marginRight = self.style.cellTreeIconMarginRight * self.scale,\n marginLeft =\n self.style.cellTreeIconMarginLeft * self.scale +\n parentCount * (iconSize + cell.paddingLeft);\n\n let x = cell.x + cell.paddingLeft + self.canvasOffsetLeft + marginLeft,\n y = cell.y + self.canvasOffsetTop + marginTop;\n\n if (tree.icon) {\n self.ctx.beginPath();\n const oldFillStyle = self.ctx.fillStyle;\n const oldStrokeStyle = self.ctx.strokeStyle;\n\n if (cell.hovered && self.hovers.onCellTreeIcon) {\n self.ctx.fillStyle = self.style.cellTreeIconHoverFillColor;\n } else {\n self.ctx.fillStyle = self.style.cellTreeIconFillColor;\n }\n\n self.ctx.fillRect(x, y, iconSize, iconSize);\n self.ctx.strokeStyle = self.style.cellTreeIconBorderColor;\n self.ctx.rect(x, y, iconSize, iconSize);\n self.ctx.stroke();\n\n self.ctx.beginPath();\n if (tree.expand) {\n self.ctx.moveTo(x + 3, y + iconSize * 0.5);\n self.ctx.lineTo(x + iconSize - 3, y + iconSize * 0.5);\n } else {\n self.ctx.moveTo(x + 2, y + iconSize * 0.5);\n self.ctx.lineTo(x + iconSize - 2, y + iconSize * 0.5);\n self.ctx.moveTo(x + iconSize * 0.5, y + 2);\n self.ctx.lineTo(x + iconSize * 0.5, y + iconSize - 2);\n }\n self.ctx.lineWidth = self.style.cellTreeIconLineWidth;\n self.ctx.strokeStyle = self.style.cellTreeIconLineColor;\n self.ctx.stroke();\n\n self.ctx.strokeStyle = oldStrokeStyle;\n self.ctx.fillStyle = oldFillStyle;\n }\n\n return marginLeft + iconSize + marginRight;\n }\n function drawFilterButtonArrow(x, y) {\n var mt =\n ((self.style.filterButtonHeight - self.style.filterButtonArrowHeight) /\n 2) *\n self.scale,\n ml =\n ((self.style.filterButtonWidth - self.style.filterButtonArrowWidth) /\n 2) *\n self.scale,\n aw = self.style.filterButtonArrowWidth * self.scale,\n ah = self.style.filterButtonArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.filterButtonArrowColor;\n self.ctx.strokeStyle = self.style.filterButtonArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw;\n }\n function radiusRect(x, y, w, h, radius) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n var r = x + w,\n b = y + h;\n self.ctx.beginPath();\n self.ctx.moveTo(x + radius, y);\n self.ctx.lineTo(r - radius, y);\n self.ctx.quadraticCurveTo(r, y, r, y + radius);\n self.ctx.lineTo(r, y + h - radius);\n self.ctx.quadraticCurveTo(r, b, r - radius, b);\n self.ctx.lineTo(x + radius, b);\n self.ctx.quadraticCurveTo(x, b, x, b - radius);\n self.ctx.lineTo(x, y + radius);\n self.ctx.quadraticCurveTo(x, y, x + radius, y);\n }\n function fillRect(x, y, w, h) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillRect(x, y, w, h);\n }\n function strokeRect(x, y, w, h) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.strokeRect(x, y, w, h);\n }\n function fillText(text, x, y) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillText(text, x, y);\n }\n function fillCircle(x, y, r) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.arc(x, y, r, 0, 2 * Math.PI);\n self.ctx.fill();\n }\n function strokeCircle(x, y, r) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.arc(x, y, r, 0, 2 * Math.PI);\n self.ctx.stroke();\n }\n function clipFrozenArea(mode) {\n // 0 both, 1 rows, 2 cols\n // self.lastFrozenColumnPixel;\n // self.lastFrozenRowPixel;\n self.ctx.beginPath();\n if (mode === 0) {\n self.ctx.moveTo(self.lastFrozenColumnPixel, self.lastFrozenRowPixel);\n self.ctx.lineTo(self.lastFrozenColumnPixel, self.height);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.width, self.lastFrozenRowPixel);\n }\n if (mode === 1) {\n self.ctx.moveTo(0, self.lastFrozenRowPixel);\n self.ctx.lineTo(0, self.height);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.width, self.lastFrozenRowPixel);\n }\n if (mode === 2) {\n self.ctx.moveTo(self.lastFrozenColumnPixel, 0);\n self.ctx.lineTo(self.width, 0);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.lastFrozenColumnPixel, self.height);\n }\n self.ctx.clip();\n }\n function fillHandle(x, y, r) {\n if (self.style.selectionHandleType === 'circle') {\n return fillCircle(x, y, r * 0.5);\n }\n fillRect(x - r * 0.5, y - r * 0.5, r, r);\n }\n function strokeHandle(x, y, r) {\n if (self.style.selectionHandleType === 'circle') {\n return strokeCircle(x, y, r * 0.5);\n }\n strokeRect(x - r * 0.5, y - r * 0.5, r, r);\n }\n function addselectionHandle(c, pos) {\n var hw = self.style.selectionHandleSize,\n p = {\n tr: function () {\n fillHandle(c.x + c.width, c.y, hw);\n strokeHandle(c.x + c.width, c.y, hw);\n },\n br: function () {\n fillHandle(c.x + c.width, c.y + c.height, hw);\n strokeHandle(c.x + c.width, c.y + c.height, hw);\n },\n tl: function () {\n fillHandle(c.x, c.y, hw);\n strokeHandle(c.x, c.y, hw);\n },\n bl: function () {\n fillHandle(c.x, c.y + c.height, hw);\n strokeHandle(c.x, c.y + c.height, hw);\n },\n };\n p[pos]();\n }\n function addBorderLine(c, pos) {\n self.ctx.beginPath();\n var p = {\n t: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop,\n );\n },\n r: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n b: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop + c.height,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n l: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n };\n p[pos]();\n self.ctx.stroke();\n }\n function addEllipsis(text, width) {\n var c,\n w = 0;\n if (self.ellipsisCache[text] && self.ellipsisCache[text][width]) {\n return self.ellipsisCache[text][width];\n }\n //TODO Add ellipsis back when there is a fast way to do it\n w = self.ctx.measureText(text).width;\n self.ellipsisCache[text] = self.ellipsisCache[text] || {};\n c = { value: text, width: w };\n self.ellipsisCache[text][width] = c;\n return c;\n }\n function wrapText(cell, splitChar) {\n if (!cell.formattedValue) {\n return {\n lines: [{ width: 0, value: '' }],\n width: 0,\n height: cell.calculatedLineHeight,\n };\n }\n var max = 0,\n n = '\\n',\n x,\n word,\n words = cell.formattedValue.split(splitChar),\n textHeight = cell.calculatedLineHeight,\n lines = [],\n out = [],\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n autoResize = self.attributes.autoResizeRows && wrap,\n elWidth,\n et = self.attributes.ellipsisText,\n elClipLength,\n plWidth,\n clippedVal,\n ogWordWidth,\n previousLine,\n line = {\n width: 0,\n value: '',\n },\n cHeight = wrap ? cell.paddedHeight : cell.calculatedLineHeight;\n lines.push(line);\n elWidth = self.ctx.measureText(' ' + et).width;\n for (x = 0; x < words.length; x += 1) {\n word = words[x];\n var curSplitChar = word[word.length - 1] === '-' ? '' : splitChar;\n var measure = self.ctx.measureText(word + curSplitChar);\n if (line.width + measure.width + elWidth < cell.paddedWidth) {\n line.value += word + curSplitChar;\n line.width += measure.width;\n continue;\n }\n // if there is a hyphenated word that is too long\n // split it and add the split set to the array\n // then back up and re-read new split set\n // this behavior seems right, it might not be\n if (/\\w-\\w/.test(word) && cell.paddedWidth < measure.width) {\n var arr = word.split('-');\n arr = arr.map((item, index) => {\n return index === arr.length - 1 ? item : item + '-';\n });\n words.splice(x, 1, ...arr);\n x -= 1;\n continue;\n }\n line = {\n width: measure.width,\n value: word + curSplitChar,\n };\n if (x === 0) {\n lines = [];\n lines.push(line);\n }\n textHeight += cell.calculatedLineHeight;\n if (textHeight > cHeight && !autoResize) {\n if (lines.length === 0) {\n break;\n }\n elClipLength = 1;\n previousLine = lines[lines.length - 1];\n if (previousLine.width < cell.paddedWidth && words.length === 1) {\n break;\n }\n clippedVal = previousLine.value + word;\n plWidth = self.ctx.measureText(clippedVal + et).width;\n var originText = clippedVal;\n if (plWidth > cell.paddedWidth) {\n var stepLength = parseInt(clippedVal.length / 2);\n var direction = -1;\n while (stepLength > 0) {\n clippedVal = originText.substr(\n 0,\n stepLength * direction + clippedVal.length,\n );\n plWidth = self.ctx.measureText(clippedVal + et).width;\n direction = plWidth > cell.paddedWidth ? -1 : 1;\n stepLength = parseInt(stepLength / 2);\n }\n }\n clippedVal =\n clippedVal + (originText.length != clippedVal.length ? et : '');\n previousLine.value = clippedVal;\n previousLine.width = plWidth;\n break;\n }\n if (x > 0) {\n lines.push(line);\n }\n }\n return {\n lines: lines,\n width: max,\n height: cell.calculatedLineHeight * lines.length,\n };\n }\n function drawText(cell, treeCellPadding = 0) {\n var ll = cell.text.lines.length,\n h = cell.fontHeight * cell.lineHeight,\n x,\n line,\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n textHeight = 0;\n // text supplied by a rendertext handler may omit width/height (#460)\n var textBlockHeight =\n cell.text.height === undefined\n ? cell.calculatedLineHeight * ll\n : cell.text.height;\n for (x = 0; x < cell.text.lines.length; x += 1) {\n line = cell.text.lines[x];\n if (line.width === undefined) {\n line.width = self.ctx.measureText(\n line.value === undefined || line.value === null\n ? ''\n : String(line.value),\n ).width;\n }\n var vPos =\n Math.max(\n (cell.height -\n (wrap ? textBlockHeight : cell.calculatedLineHeight)) *\n 0.5,\n 0,\n ) + h,\n hPos =\n cell.paddingLeft +\n treeCellPadding +\n cell.treeArrowWidth +\n cell.orderByArrowWidth;\n if (cell.horizontalAlignment === 'right') {\n hPos =\n cell.paddingLeft + treeCellPadding + cell.paddedWidth - line.width;\n } else if (cell.horizontalAlignment === 'center') {\n hPos =\n cell.paddingLeft +\n treeCellPadding +\n (cell.paddedWidth + cell.paddingRight) / 2 -\n line.width / 2;\n }\n if (cell.verticalAlignment === 'top') {\n vPos = cell.calculatedLineHeight;\n } else if (cell.verticalAlignment === 'bottom') {\n // baseline of the last line sits on the bottom padding (#530)\n vPos =\n cell.height -\n cell.paddingBottom -\n textBlockHeight +\n cell.calculatedLineHeight;\n }\n line.height = h + cell.lineSpacing;\n line.offsetLeft = hPos;\n line.offsetTop = vPos;\n line.x = cell.x + hPos;\n line.y = cell.y + textHeight + vPos;\n textHeight += line.height;\n fillText(line.value, line.x, line.y);\n }\n if (self.attributes.debug && cell.active) {\n requestAnimationFrame(function () {\n self.ctx.font = self.style.debugFont;\n self.ctx.fillStyle = self.style.debugColor;\n fillText(\n JSON.stringify(\n {\n x: cell.x,\n y: cell.y,\n h: cell.height,\n w: cell.width,\n pw: cell.paddedWidth,\n idx: cell.columnIndex,\n idx_ord: cell.sortColumnIndex,\n },\n null,\n '\\t',\n ),\n cell.x + 14,\n cell.y + 14,\n );\n fillText(\n JSON.stringify(\n cell.text.lines.map(function (l) {\n return { w: l.width, v: l.value.length };\n }),\n null,\n '\\t',\n ),\n cell.x + 14,\n cell.y + 30,\n );\n });\n }\n }\n function getFrozenColumnsWidth() {\n var w = 0,\n s = self.getSchema(),\n x = 0,\n n = Math.min(self.frozenColumn, s.length),\n collapsedGroups = self.getCollapsedColumnGroups(),\n column;\n hiddenFrozenColumnCount = 0;\n while (x < n) {\n column = s[x];\n if (column.hidden) {\n hiddenFrozenColumnCount += 1;\n } else {\n const isCollapsed =\n collapsedGroups.findIndex(\n (group) => x >= group.from && x <= group.to,\n ) >= 0;\n if (isCollapsed) {\n hiddenFrozenColumnCount += 1;\n } else {\n w += self.getColumnWidth(x);\n }\n }\n x += 1;\n }\n return w;\n }\n /**\n * Redraws the grid. No matter what the change, this is the only method required to refresh everything.\n * @memberof canvasDatagrid\n * @name draw\n * @method\n */\n // r = literal row index\n // rd = row data array\n // i = user order index\n // o = literal data index\n // y = y drawing cursor\n // x = x drawing cursor\n // s = visible schema array\n // cx = current x drawing cursor sub calculation var\n // cy = current y drawing cursor sub calculation var\n // a = static cell (like corner cell)\n // p = perf counter\n // l = data length\n // u = current cell\n // h = current height\n // w = current width\n self.draw = function (internal) {\n if (self.dispatchEvent('beforedraw', {})) {\n return;\n }\n if (!self.isChildGrid && (!self.height || !self.width)) {\n return;\n }\n if (self.isChildGrid && internal) {\n requestAnimationFrame(self.parentGrid.draw);\n return;\n }\n if (self.intf.visible === false) {\n return;\n }\n // initial values\n var checkScrollHeight,\n rowHeaderCell,\n p,\n cx,\n cy,\n treeGrid,\n rowOpen,\n rowHeight,\n cornerCell,\n y,\n x,\n c,\n h,\n w,\n schema,\n rowIndex,\n rowData,\n aCell,\n viewData = self.viewData || [],\n bc = self.style.gridBorderCollapse === 'collapse',\n selectionBorders = [],\n moveBorders = [],\n selectionHandles = [],\n rowHeaders = [],\n l = viewData.length,\n u = self.currentCell || {},\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n rowGroupsAreaWidth = self.getRowGroupAreaWidth(),\n columnGroupsAreaHeight = self.getColumnGroupAreaHeight(),\n /** key: boundRowIndex, value: `{y,h}` */\n rowGroupsRectInfo = {},\n /** value: `{y,h}` */\n rowGroupsFrozenInfo = {},\n /** key: columnIndex, value: `{x,w}` */\n columnGroupsRectInfo = {},\n collapsedColumnGroups = self.getCollapsedColumnGroups(),\n collapsedRowGroups = self.getCollapsedRowGroups(),\n cellHeight = self.style.cellHeight,\n currentRowIndexOffset = 0,\n /** @type {Array<{from:number,plus:number}>} */\n rowIndexOffsetByHiddenRows = self.hiddenRowRanges\n .map((range) => ({\n from: range[0],\n plus: range[1] - range[0] + 1,\n }))\n .sort((a, b) => a.from - b.from);\n drawCount += 1;\n p = performance.now();\n self.visibleRowHeights = [];\n // if data length has changed, there is no way to know\n if (viewData.length > self.orders.rows.length) {\n self.createRowOrders();\n }\n function saveRowGroupsRectInfo(cell) {\n let index = cell.boundRowIndex;\n if (index >= -1 === false)\n if (cell.rowIndex === -1) index = -1;\n else return;\n if (rowGroupsRectInfo[index]) return;\n rowGroupsRectInfo[index] = { y: cell.y, h: cell.height };\n }\n function saveColumnGroupsRectInfo(cell) {\n const index = cell.columnIndex;\n if (columnGroupsRectInfo[index]) return;\n columnGroupsRectInfo[index] = { x: cell.x, w: cell.width };\n }\n /**\n * @param {number} columnIndex\n * @returns {boolean}\n */\n function isColumnCollapsedByGroup(columnIndex) {\n return (\n collapsedColumnGroups.findIndex(\n (group) => columnIndex >= group.from && columnIndex <= group.to,\n ) >= 0\n );\n }\n\n function drawScrollBars() {\n var drawCorner,\n en = self.scrollBox.entities,\n m = self.style.scrollBarBoxMargin * 2;\n self.ctx.strokeStyle = self.style.scrollBarBorderColor;\n self.ctx.lineWidth = self.style.scrollBarBorderWidth;\n if (self.frozenColumn > 0) {\n en.horizontalBox.x =\n rowHeaderCellWidth +\n self.style.scrollBarBoxMargin +\n self.scrollCache.x[self.frozenColumn - 1] +\n (en.horizontalBar.width -\n self.scrollCache.x[self.frozenColumn - 1] -\n self.scrollBox.scrollBoxWidth) *\n (self.scrollBox.scrollLeft / self.scrollBox.scrollWidth);\n } else {\n en.horizontalBox.x =\n rowHeaderCellWidth +\n self.style.scrollBarBoxMargin +\n (en.horizontalBar.width - self.scrollBox.scrollBoxWidth) *\n (self.scrollBox.scrollLeft / self.scrollBox.scrollWidth);\n }\n en.verticalBox.y =\n columnHeaderCellHeight +\n self.style.scrollBarBoxMargin +\n self.scrollCache.y[self.frozenRow] +\n (en.verticalBar.height -\n self.scrollBox.scrollBoxHeight -\n self.scrollCache.y[self.frozenRow]) *\n (self.scrollBox.scrollTop / self.scrollBox.scrollHeight);\n if (self.scrollBox.horizontalBarVisible) {\n self.ctx.fillStyle = self.style.scrollBarBackgroundColor;\n fillRect(\n en.horizontalBar.x,\n en.horizontalBar.y,\n en.horizontalBar.width + m,\n en.horizontalBar.height,\n );\n strokeRect(\n en.horizontalBar.x,\n en.horizontalBar.y,\n en.horizontalBar.width + m,\n en.horizontalBar.height,\n );\n self.ctx.fillStyle = self.style.scrollBarBoxColor;\n if (self.scrollBox.horizontalBoxVisible) {\n if (/horizontal/.test(u.context)) {\n self.ctx.fillStyle = self.style.scrollBarActiveColor;\n }\n radiusRect(\n en.horizontalBox.x,\n en.horizontalBox.y,\n en.horizontalBox.width,\n en.horizontalBox.height,\n self.style.scrollBarBoxBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n }\n drawCorner = true;\n self.visibleCells.unshift(en.horizontalBar);\n self.visibleCells.unshift(en.horizontalBox);\n }\n if (self.scrollBox.verticalBarVisible) {\n self.ctx.fillStyle = self.style.scrollBarBackgroundColor;\n fillRect(\n en.verticalBar.x,\n en.verticalBar.y,\n en.verticalBar.width,\n en.verticalBar.height + m,\n );\n strokeRect(\n en.verticalBar.x,\n en.verticalBar.y,\n en.verticalBar.width,\n en.verticalBar.height + m,\n );\n if (self.scrollBox.verticalBoxVisible) {\n self.ctx.fillStyle = self.style.scrollBarBoxColor;\n if (/vertical/.test(u.context)) {\n self.ctx.fillStyle = self.style.scrollBarActiveColor;\n }\n radiusRect(\n en.verticalBox.x,\n en.verticalBox.y,\n en.verticalBox.width,\n en.verticalBox.height,\n self.style.scrollBarBoxBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n }\n drawCorner = true;\n self.visibleCells.unshift(en.verticalBar);\n self.visibleCells.unshift(en.verticalBox);\n }\n if (drawCorner) {\n //corner\n self.ctx.strokeStyle = self.style.scrollBarCornerBorderColor;\n self.ctx.fillStyle = self.style.scrollBarCornerBackgroundColor;\n radiusRect(\n en.corner.x,\n en.corner.y,\n en.corner.width,\n en.corner.height,\n 0,\n );\n self.ctx.stroke();\n self.ctx.fill();\n self.visibleCells.unshift(en.corner);\n }\n }\n function createHandlesOverlayArray(cell) {\n if (self.attributes.allowMovingSelection || self.mobile) {\n if (\n cell.selectionBorderTop &&\n cell.selectionBorderRight &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'tr']);\n cell.selectionHandle = 'tr';\n }\n if (cell.selectionBorderTop && cell.selectionBorderLeft) {\n if (self.mobile) {\n selectionHandles.push([cell, 'tl']);\n cell.selectionHandle = 'tl';\n }\n if (self.fillOverlay.handle) {\n self.fillOverlay.snapTo = {\n x: cell.x,\n y: cell.y,\n };\n }\n }\n if (\n cell.selectionBorderBottom &&\n cell.selectionBorderLeft &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'bl']);\n cell.selectionHandle = 'bl';\n }\n if (\n cell.selectionBorderBottom &&\n cell.selectionBorderRight &&\n (self.attributes.selectionHandleBehavior !== 'none' || self.mobile)\n ) {\n selectionHandles.push([cell, 'br']);\n cell.selectionHandle = 'br';\n\n if (self.fillOverlay.handle) {\n self.fillOverlay.handle.x = cell.x + cell.width;\n self.fillOverlay.handle.y = cell.y + cell.height;\n }\n }\n\n if (self.fillOverlay.handle) {\n // Some corners may not be displaying, so we get at least\n // one correct axis in order to display a fill overlay.\n if (self.fillOverlay.snapTo.x === -1 && cell.selectionBorderLeft) {\n self.fillOverlay.snapTo.x = cell.x;\n }\n if (self.fillOverlay.snapTo.y === -1 && cell.selectionBorderTop) {\n self.fillOverlay.snapTo.y = cell.y;\n }\n }\n }\n }\n function createBorderOverlayArray(\n cell,\n drawArray,\n propPrefix,\n offsetPoint,\n ) {\n cell.selectionBorder = '';\n // TODO: optimize it by `getSelectionStateFromCells`\n const isSelected = offsetPoint\n ? (row, col) =>\n isCellSelected(\n self.selections,\n row - offsetPoint.y,\n col - offsetPoint.x,\n )\n : (row, col) => isCellSelected(self.selections, row, col);\n const lastColumnIndex = Math.max(schema.length - 1, 0);\n const lastRowIndex = Math.max(viewData.length - 1, 0);\n const { isRowHeader, rowIndex, columnIndex } = cell;\n\n if (!isRowHeader && isSelected(rowIndex, columnIndex)) {\n if (\n (!isSelected(rowIndex - 1, columnIndex) || rowIndex === 0) &&\n !cell.isHeader\n ) {\n drawArray.push([cell, 't']);\n cell[propPrefix + 'BorderTop'] = true;\n cell[propPrefix + 'Border'] += 't';\n }\n if (\n rowIndex >= lastRowIndex ||\n !isSelected(rowIndex + 1, columnIndex)\n ) {\n drawArray.push([cell, 'b']);\n cell[propPrefix + 'BorderBottom'] = true;\n cell[propPrefix + 'Border'] += 'b';\n }\n if (columnIndex === 0 || !isSelected(rowIndex, columnIndex - 1)) {\n drawArray.push([cell, 'l']);\n cell[propPrefix + 'BorderLeft'] = true;\n cell[propPrefix + 'Border'] += 'l';\n }\n if (\n columnIndex >= lastColumnIndex ||\n !isSelected(rowIndex, columnIndex + 1)\n ) {\n drawArray.push([cell, 'r']);\n cell[propPrefix + 'BorderRight'] = true;\n cell[propPrefix + 'Border'] += 'r';\n }\n }\n }\n function drawCell(rowData, rowOrderIndex, rowIndex) {\n const isActiveRowHeader =\n self.orders.rows[self.activeCell.rowIndex] === rowOrderIndex ||\n self.isRowSelected(rowOrderIndex);\n\n return function drawEach(header, headerIndex, columnOrderIndex) {\n if (header.hidden) {\n return 0;\n }\n var cellStyle = header.style || 'cell',\n cellGridAttributes,\n cell,\n isHeader = /HeaderCell/.test(cellStyle),\n isCorner = /cornerCell/.test(cellStyle),\n isRowHeader = 'rowHeaderCell' === cellStyle,\n isColumnHeader = 'columnHeaderCell' === cellStyle,\n isFilterable =\n self.filterable.rows.includes(rowIndex) &&\n self.filterable.columns.includes(headerIndex),\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n // TODO: optimize it by `getSelectionStateFromCells`\n selected = isCellSelected(\n self.selections,\n rowOrderIndex,\n columnOrderIndex,\n ),\n hovered =\n self.hovers.rowIndex === rowOrderIndex &&\n (self.attributes.hoverMode === 'row' ||\n self.hovers.columnIndex === columnOrderIndex),\n openedFilter =\n self.selectedFilterButton.rowIndex == rowIndex &&\n self.selectedFilterButton.columnIndex == headerIndex,\n active =\n self.activeCell.rowIndex === rowOrderIndex &&\n self.activeCell.columnIndex === columnOrderIndex,\n isColumnHeaderCellCap = cellStyle === 'columnHeaderCellCap',\n rawValue = rowData ? rowData[header.name] : undefined,\n isGrid = header.type === 'canvas-datagrid',\n val,\n f = self.formatters[header.type || 'string'],\n orderByArrowSize = 0,\n treeArrowSize = 0,\n cellWidth =\n headerIndex >= 0\n ? self.getColumnWidth(headerIndex)\n : self.sizes.columns[headerIndex] || header.width,\n ev = {\n value: rawValue,\n row: rowData,\n header: header,\n };\n\n const isActiveColumnHeader =\n self.orders.columns[self.activeCell.columnIndex] === headerIndex ||\n self.isColumnSelected(self.activeCell.viewColumnIndex);\n let activeHeader = false;\n if (\n (isActiveColumnHeader || isActiveRowHeader) &&\n (columnOrderIndex === -1 || rowOrderIndex === -1)\n )\n activeHeader = isRowHeader\n ? 'activeRowHeaderCell'\n : 'activeColumnHeaderCell';\n\n if (isColumnHeaderCellCap) {\n cellWidth = w - x;\n }\n // if no data or schema are defined, a width is provided to the stub column\n if (cellWidth === undefined) {\n cellWidth = self.style.cellWidth;\n }\n if (headerIndex < 0) {\n cellWidth = cellWidth * self.scale;\n }\n if (x + cellWidth + self.style.cellBorderWidth < 0) {\n x += cellWidth + self.style.cellBorderWidth;\n }\n if (active && cellStyle !== 'cornerCell') {\n cellStyle = 'activeCell';\n }\n if (self.visibleRows.indexOf(rowIndex) === -1 && !isHeader) {\n self.visibleRows.push(rowIndex);\n }\n val = self.dispatchEvent('formatcellvalue', ev);\n cx = x;\n cy = y;\n if (cellStyle === 'cornerCell') {\n cx = 0;\n cy = 0;\n } else if (isRowHeader) {\n cx = 0;\n } else if (isHeader) {\n cy = 0;\n }\n cell = {\n type: isGrid ? 'canvas-datagrid-cell' : header.type,\n style: cellStyle,\n nodeType: 'canvas-datagrid-cell',\n x: cx,\n y: cy,\n fontHeight: (self.style[cellStyle + 'FontHeight'] || 0) * self.scale,\n horizontalAlignment: self.style[cellStyle + 'HorizontalAlignment'],\n verticalAlignment: self.style[cellStyle + 'VerticalAlignment'],\n paddingLeft:\n (self.style[cellStyle + 'PaddingLeft'] || 0) * self.scale,\n paddingTop: (self.style[cellStyle + 'PaddingTop'] || 0) * self.scale,\n paddingRight:\n (self.style[cellStyle + 'PaddingRight'] || 0) * self.scale,\n paddingBottom:\n (self.style[cellStyle + 'PaddingBottom'] || 0) * self.scale,\n whiteSpace: self.style.cellWhiteSpace,\n lineHeight: self.style.cellLineHeight,\n lineSpacing: self.style.cellLineSpacing,\n offsetTop: self.canvasOffsetTop + cy,\n offsetLeft: self.canvasOffsetLeft + cx,\n scrollTop: self.scrollBox.scrollTop,\n scrollLeft: self.scrollBox.scrollLeft,\n active: active || activeHeader,\n hovered: hovered,\n selected: selected,\n width: cellWidth,\n height: cellHeight,\n offsetWidth: cellWidth,\n offsetHeight: cellHeight,\n parentNode: self.intf.parentNode,\n offsetParent: self.intf.parentNode,\n data: rowData,\n isCorner: isCorner,\n isHeader: isHeader,\n isColumnHeader: isColumnHeader,\n isColumnHeaderCellCap: isColumnHeaderCellCap,\n isRowHeader: isRowHeader,\n isFilterable: isFilterable,\n openedFilter: openedFilter,\n rowOpen: rowOpen,\n header: header,\n\n columnIndex: columnOrderIndex,\n rowIndex: rowOrderIndex,\n\n viewRowIndex: rowOrderIndex,\n viewColumnIndex: columnOrderIndex,\n\n boundRowIndex: self.getBoundRowIndexFromViewRowIndex(rowOrderIndex),\n boundColumnIndex:\n self.getBoundColumnIndexFromViewColumnIndex(columnOrderIndex),\n\n sortColumnIndex: headerIndex,\n sortRowIndex: rowIndex,\n\n isGrid: isGrid,\n isNormal: !isGrid && !isCorner && !isHeader,\n gridId: (self.attributes.name || '') + rowIndex + ':' + headerIndex,\n parentGrid: self.intf,\n innerHTML: '',\n activeHeader: activeHeader,\n value:\n isHeader && !isRowHeader ? header.title || header.name : rawValue,\n isRowTree:\n rowOrderIndex >= 0 &&\n columnOrderIndex == self.cellTree.rowTreeColIndex &&\n self.cellTree.rows.length > 0 &&\n self.cellTree.rows[rowOrderIndex].icon,\n isColumnTree:\n columnOrderIndex >= 0 &&\n self.cellTree.columns[rowOrderIndex] &&\n self.cellTree.columns[rowOrderIndex][columnOrderIndex].icon,\n };\n cell.calculatedLineHeight =\n cell.fontHeight * cell.lineHeight + cell.lineSpacing;\n cell.paddedWidth = cell.width - cell.paddingRight - cell.paddingLeft;\n cell.paddedHeight = cell.height - cell.paddingTop - cell.paddingBottom;\n ev.cell = cell;\n cell.userHeight = cell.isHeader ? self.sizes.rows[-1] : rowHeight;\n cell.userWidth = cell.isHeader\n ? self.sizes.columns.cornerCell\n : self.sizes.columns[headerIndex];\n self.visibleCells.unshift(cell);\n saveRowGroupsRectInfo(cell);\n saveColumnGroupsRectInfo(cell);\n if (self.dispatchEvent('beforerendercell', ev)) {\n return;\n }\n self.ctx.fillStyle = self.style[cellStyle + 'BackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'BorderColor'];\n self.ctx.lineWidth = self.style[cellStyle + 'BorderWidth'];\n if (hovered) {\n self.ctx.fillStyle = self.style[cellStyle + 'HoverBackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'HoverBorderColor'];\n }\n if (selected) {\n self.ctx.fillStyle =\n self.style[cellStyle + 'SelectedBackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'SelectedBorderColor'];\n }\n if (activeHeader) {\n self.ctx.fillStyle = self.style[activeHeader + 'BackgroundColor'];\n }\n self.dispatchEvent('rendercell', ev);\n if (cell.isGrid) {\n if (cell.height !== rowHeight) {\n cell.height = rowHeight || self.style.cellHeightWithChildGrid;\n checkScrollHeight = true;\n }\n cell.width =\n self.sizes.columns[headerIndex] ||\n self.style.cellWidthWithChildGrid;\n }\n if (rowOpen && !cell.isRowHeader) {\n cell.height = self.sizes.rows[rowIndex] || self.style.cellHeight;\n }\n if (!cell.isGrid) {\n fillRect(cx, cy, cell.width, cell.height);\n strokeRect(cx, cy, cell.width, cell.height);\n }\n self.ctx.save();\n radiusRect(cell.x, cell.y, cell.width, cell.height, 0);\n self.ctx.clip();\n self.dispatchEvent('afterrendercell', ev);\n if (cell.height !== cellHeight && !(rowOpen && !cell.isRowHeader)) {\n self.sizes.rows[isHeader ? -1 : rowIndex] = cell.height;\n checkScrollHeight = true;\n }\n if (cell.width !== cellWidth) {\n self.sizes.columns[headerIndex] = cell.width;\n checkScrollHeight = true;\n }\n if (isRowHeader && self.attributes.tree) {\n if (!self.dispatchEvent('rendertreearrow', ev)) {\n treeArrowSize = drawTreeArrow(\n cell,\n self.style[cellStyle + 'PaddingLeft'],\n cy,\n 0,\n );\n }\n }\n if ((self.attributes.showRowNumbers && isRowHeader) || !isRowHeader) {\n if (cell.isGrid && !self.dispatchEvent('beforerendercellgrid', ev)) {\n if (!self.childGrids[cell.gridId]) {\n // HACK: this only allows setting of the child grids styles if data is set _after_\n // this is less than desirable. An interface needs to be made to effect the\n // style of all cell grids. One for individual grids already exists.\n cellGridAttributes = self.cellGridAttributes;\n cellGridAttributes.name = self.attributes.saveAppearance\n ? cell.gridId\n : undefined;\n cellGridAttributes.component = false;\n cellGridAttributes.parentNode = cell;\n cellGridAttributes.data = rawValue;\n ev.cellGridAttributes = cellGridAttributes;\n if (self.dispatchEvent('beforecreatecellgrid', ev)) {\n return;\n }\n self.childGrids[cell.gridId] =\n self.createGrid(cellGridAttributes);\n self.sizes.rows[rowIndex] =\n self.sizes.rows[rowIndex] || self.style.cellGridHeight;\n checkScrollHeight = true;\n }\n cell.grid = self.childGrids[cell.gridId];\n cell.grid.parentNode = cell;\n cell.grid.visible = true;\n cell.grid.draw();\n self.dispatchEvent('rendercellgrid', ev);\n } else if (!cell.isGrid) {\n if (self.childGrids[cell.gridId]) {\n self.childGrids[cell.gridId].parentNode.offsetHeight = 0;\n }\n if (isHeader && self.orderBy === header.name) {\n if (!self.dispatchEvent('renderorderbyarrow', ev)) {\n orderByArrowSize = drawOrderByArrow(\n cx + self.style[cellStyle + 'PaddingLeft'],\n 0,\n );\n }\n }\n self.ctx.fillStyle = self.style[cellStyle + 'Color'];\n if (hovered) {\n self.ctx.fillStyle = self.style[cellStyle + 'HoverColor'];\n }\n if (selected) {\n self.ctx.fillStyle = self.style[cellStyle + 'SelectedColor'];\n }\n if (activeHeader) {\n self.ctx.fillStyle = self.style[activeHeader + 'Color'];\n }\n cell.treeArrowWidth = treeArrowSize;\n cell.orderByArrowWidth = orderByArrowSize;\n // create text ref to see if height needs to expand\n val = val !== undefined ? val : f ? f(ev) : '';\n if (val === undefined && !f) {\n val = '';\n console.warn(\n 'canvas-datagrid: Unknown format ' +\n header.type +\n ' add a cellFormater',\n );\n }\n cell.formattedValue = (\n val !== undefined && val !== null ? val : ''\n ).toString();\n if (\n self.columnFilters &&\n self.columnFilters[val] !== undefined &&\n isHeader\n ) {\n cell.formattedValue = self.attributes.filterTextPrefix + val;\n }\n self.ctx.font = self.getScaledFont(cellStyle + 'Font');\n if (!self.dispatchEvent('formattext', ev)) {\n cell.text = wrapText(cell, ' ');\n }\n if (!self.dispatchEvent('rendertext', ev)) {\n if (cell.innerHTML || header.type === 'html') {\n drawHtml(cell);\n } else {\n let treeCellPadding = 0,\n isDrawText = true;\n if (\n cell.columnIndex == self.cellTree.rowTreeColIndex &&\n !cell.isColumnHeader &&\n self.cellTree.rows.length > 0 &&\n Object.keys(self.cellTree.rows[cell.rowIndex]).length > 1\n )\n treeCellPadding = drawCellTreeIcon(\n cell,\n self.cellTree.rows[cell.rowIndex],\n true,\n );\n\n if (\n !cell.isRowHeader &&\n cell.rowIndex > 0 &&\n self.cellTree.columns[cell.rowIndex - 1] &&\n self.cellTree.columns[cell.rowIndex - 1][cell.columnIndex]\n .icon\n ) {\n for (let r = cell.rowIndex - 1; r >= 0; r--) {\n if (!self.cellTree.columns[r]) break;\n if (!self.cellTree.columns[r][cell.columnIndex].icon) break;\n if (!self.cellTree.columns[r][cell.columnIndex].expand) {\n isDrawText = false;\n break;\n }\n }\n }\n if (\n isDrawText &&\n !cell.isRowHeader &&\n self.cellTree.columns[cell.rowIndex] &&\n self.cellTree.columns[cell.rowIndex][cell.columnIndex].icon\n ) {\n if (\n self.viewData.length > 0 &&\n self.viewData[cell.rowIndex][cell.columnIndex].length > 0\n )\n treeCellPadding = drawCellTreeIcon(\n cell,\n self.cellTree.columns[cell.rowIndex][cell.columnIndex],\n false,\n );\n }\n if (isDrawText) drawText(cell, treeCellPadding);\n }\n\n if (wrap && cell.text && cell.text.height > rowHeight) {\n self.sizes.rows[isHeader ? -1 : rowIndex] = cell.text.height;\n checkScrollHeight = true;\n }\n }\n }\n }\n if (active) {\n aCell = cell;\n }\n createBorderOverlayArray(cell, selectionBorders, 'selection');\n // createBorderOverlayArray calculates data for createHandlesOverlayArray so it must go 2nd\n createHandlesOverlayArray(cell);\n if (self.movingSelection) {\n createBorderOverlayArray(cell, moveBorders, 'move', self.moveOffset);\n }\n self.ctx.restore();\n\n if (isFilterable) {\n drawFilterButton(cell);\n }\n\n // Gaps may occur in row numbers between consecutively rendered rows\n // when we are filtering. We draw attention to this by drawing a thick\n // border overlapping the two consecutive row headers. If sorting, visible\n // row numbers stay the same (i.e. they don't correspond to the underlying\n // data's row number), so we do not show row gaps in that case.\n const isSorting =\n self.orderings.columns && self.orderings.columns.length > 0;\n\n if (\n isRowHeader &&\n self.attributes.showRowNumbers &&\n self.attributes.showRowNumberGaps &&\n isSorting === false\n ) {\n const previousRowNumber = self.getBoundRowIndexFromViewRowIndex(\n rowOrderIndex - 1,\n );\n let hasRowGap =\n previousRowNumber !== undefined &&\n cell.boundRowIndex > 0 &&\n cell.boundRowIndex - previousRowNumber > 1;\n if (hasRowGap && collapsedRowGroups.length > 0) {\n hasRowGap =\n collapsedRowGroups.find(\n (group) =>\n group.from === previousRowNumber &&\n group.to === cell.boundRowIndex,\n ) >= 0;\n }\n // We don't treat the row index difference from hidden rows as the row gap.\n if (hasRowGap && self.hiddenRowRanges.length > 0) {\n for (let i = 0; i < self.hiddenRowRanges.length; i++) {\n const [beginRowIndex, endRowIndex] = self.hiddenRowRanges[i];\n if (\n cell.boundRowIndex === endRowIndex + 1 &&\n previousRowNumber === beginRowIndex - 1\n ) {\n hasRowGap = false;\n break;\n }\n }\n }\n\n if (hasRowGap) {\n const barHeight = self.style.rowHeaderCellRowNumberGapHeight;\n const barColor = self.style.rowHeaderCellRowNumberGapColor;\n\n self.ctx.save();\n\n self.ctx.fillStyle = barColor;\n\n fillRect(cell.x, cell.y - barHeight / 2, cell.width, barHeight);\n\n self.ctx.restore();\n }\n }\n\n //#region draw unhide indicator for column headers\n if (isColumnHeader && self.attributes.showUnhideColumnsIndicator) {\n const hovered = self.hovers.unhideIndicator;\n const size = self.style.unhideIndicatorSize;\n const cellX = x;\n const topY = cell.y + Math.max(0.5 * (cell.height - size), 0);\n\n const isActive = (orderIndex) =>\n hovered &&\n (hovered.dir === 'l' || hovered.dir === 'r') &&\n orderIndex >= hovered.orderIndex0 &&\n orderIndex <= hovered.orderIndex1;\n const isHiddenColumn = (columnIndex) =>\n columnIndex >= 0 &&\n schema[columnIndex] &&\n schema[columnIndex].hidden;\n\n let orderIndex0, orderIndex1;\n const drawIndicator = (leftX, dir, active) => {\n self.visibleUnhideIndicators.push({\n x: leftX - 1,\n y: topY - 1,\n x2: leftX + size + 2,\n y2: topY + size + 2,\n orderIndex0,\n orderIndex1,\n dir,\n });\n if (!active) {\n const line = cell.text && cell.text.lines && cell.text.lines[0];\n if (line) {\n const iconsWidth = orderByArrowSize + treeArrowSize;\n const lineX0 = iconsWidth > 0 ? iconsWidth : line.x;\n const lineX1 = line.x + line.width;\n if (leftX + size >= lineX0 && leftX <= lineX1) return;\n }\n }\n drawUnhideIndicator(leftX, topY, size, dir, active);\n }; // end of drawIndicator\n\n let orderIndexPtr = columnOrderIndex - 1;\n const prevColumnIndex = self.orders.columns[orderIndexPtr];\n if (isHiddenColumn(prevColumnIndex)) {\n const active = isActive(prevColumnIndex);\n orderIndex0 = orderIndexPtr;\n orderIndex1 = orderIndexPtr;\n while (--orderIndexPtr >= 0) {\n if (isHiddenColumn(self.orders.columns[orderIndexPtr]))\n orderIndex0 = orderIndexPtr;\n else break;\n }\n drawIndicator(cellX, 'r', active);\n }\n\n orderIndexPtr = columnOrderIndex + 1;\n const nextColumnIndex = self.orders.columns[orderIndexPtr];\n if (isHiddenColumn(nextColumnIndex)) {\n const active = isActive(nextColumnIndex);\n orderIndex0 = orderIndexPtr;\n orderIndex1 = orderIndexPtr;\n while (++orderIndexPtr < self.orders.columns.length) {\n if (isHiddenColumn(self.orders.columns[orderIndexPtr]))\n orderIndex1 = orderIndexPtr;\n else break;\n }\n const indicatorX = x + cell.width - size;\n drawIndicator(indicatorX, 'l', active);\n }\n }\n //#endregion draw unhide indicator for column headers\n\n //#region draw unhide indicator for row headers\n if (\n isRowHeader &&\n self.attributes.showUnhideRowsIndicator &&\n self.hiddenRowRanges.length > 0\n ) {\n // Leo's comment:\n // from the first row to the last row, `rowIndex` is from 0 to the count of rows\n // but `boundRowIndex` can be disordered if there are any ordered columns or filtered columns\n // Like this statement:\n // console.log(rowIndex, cell.boundRowIndex, cell.formattedValue);\n // can output the result like this:\n // 0 1 '2'\n // 1 3 '4'\n const hovered = self.hovers.unhideIndicator;\n const size = self.style.unhideIndicatorSize;\n const leftX = cell.x + cell.width - size - 2;\n const cellY = y;\n const topIndicators = {};\n const bottomIndicators = {};\n self.hiddenRowRanges.forEach((it) => {\n topIndicators[it[0] - 1] = it;\n bottomIndicators[it[1] + 1] = it;\n });\n\n const rowIndex = cell.rowIndex + currentRowIndexOffset;\n const isActive = () =>\n hovered &&\n (hovered.dir === 't' || hovered.dir === 'b') &&\n rowIndex >= hovered.orderIndex0 - 1 &&\n rowIndex <= hovered.orderIndex1 + 1;\n\n let orderIndex0, orderIndex1;\n const drawIndicator = (topY, dir, active) => {\n self.visibleUnhideIndicators.push({\n x: leftX - 1,\n y: topY - 1,\n x2: leftX + size + 2,\n y2: topY + size + 2,\n orderIndex0,\n orderIndex1,\n dir,\n });\n drawUnhideIndicator(leftX, topY, size, dir, active);\n }; // end of drawIndicator\n\n let matched = topIndicators[rowIndex];\n if (matched) {\n const indicatorY = cellY + cell.height - size;\n [orderIndex0, orderIndex1] = matched;\n drawIndicator(indicatorY, 't', isActive());\n }\n matched = bottomIndicators[rowIndex];\n if (matched) {\n const indicatorY = cellY;\n [orderIndex0, orderIndex1] = matched;\n drawIndicator(indicatorY, 'b', isActive());\n }\n }\n //#endregion draw unhide indicator for row headers\n\n x += cell.width + (bc ? 0 : self.style.cellBorderWidth);\n return cell.width;\n }; // end of drawEach\n }\n function drawFilterButton(cell, ev) {\n var posX = cell.x + cell.width - self.style.filterButtonWidth - 1;\n var posY = cell.y + cell.height - self.style.filterButtonHeight - 2;\n if (self.dispatchEvent('beforerenderfilterbutton', ev)) {\n return;\n }\n self.ctx.save();\n self.ctx.strokeStyle = self.style.filterButtonBorderColor;\n self.ctx.fillStyle = self.style.filterButtonBackgroundColor;\n if (cell.openedFilter) {\n self.ctx.fillStyle = self.style.filterButtonActiveBackgroundColor;\n } else if (cell.hovered && self.hovers.onFilterButton) {\n self.ctx.fillStyle = self.style.filterButtonHoverBackgroundColor;\n }\n radiusRect(\n posX,\n posY,\n self.style.filterButtonWidth,\n self.style.filterButtonHeight,\n self.style.filterButtonBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n drawFilterButtonArrow(posX, posY);\n self.ctx.clip();\n self.dispatchEvent('afterrenderfilterbutton', ev);\n self.ctx.restore();\n }\n function drawRowHeader(rowData, rowIndex, rowOrderIndex) {\n if (self.attributes.showRowHeaders) {\n x = 0;\n\n // When filtering we'd like to display the actual row numbers,\n // as it is in the unfiltered data, instead of simply the viewed\n // row index + 1. If rowIndex > viewData.length, it's a new row\n // added to the end, and we want to render that new row's number\n let filteredRowNumber;\n if (self.viewData && rowIndex < self.viewData.length)\n filteredRowNumber =\n self.getBoundRowIndexFromViewRowIndex(rowIndex) + 1;\n else\n filteredRowNumber = self.originalData\n ? self.originalData.length + 1\n : rowOrderIndex + 1;\n\n let rowHeaderValue =\n self.hasActiveFilters() || self.hasCollapsedRowGroup()\n ? filteredRowNumber\n : rowIndex + 1;\n rowHeaderValue += currentRowIndexOffset;\n\n const rowHeaderCell = { rowHeaderCell: rowHeaderValue };\n const headerDescription = {\n name: 'rowHeaderCell',\n width: self.sizes.columns[-1] || self.style.rowHeaderCellWidth,\n style: 'rowHeaderCell',\n type: 'string',\n data: rowHeaderValue,\n index: -1,\n };\n rowOpen = self.openChildren[rowIndex];\n drawCell(rowHeaderCell, rowOrderIndex, rowIndex)(\n headerDescription,\n -1,\n -1,\n );\n\n if (\n rowIndexOffsetByHiddenRows[0] &&\n rowHeaderValue >= rowIndexOffsetByHiddenRows[0].from\n ) {\n const { plus } = rowIndexOffsetByHiddenRows.shift();\n currentRowIndexOffset += plus;\n }\n }\n }\n function drawHeaders() {\n var d,\n g = schema.length,\n i,\n o,\n columnHeaderCell,\n header,\n nonFrozenHeaderWidth;\n function drawHeaderColumnRange(start, end) {\n end = Math.min(end, g);\n for (o = start; o < end; o += 1) {\n i = self.orders.columns[o];\n header = schema[i];\n if (!header.hidden && !isColumnCollapsedByGroup(o)) {\n d = {\n title: header.title,\n name: header.name,\n width: header.width || self.style.cellWidth,\n style: 'columnHeaderCell',\n type: 'string',\n index: o,\n order: i,\n };\n columnHeaderCell = {\n columnHeaderCell: header.title || header.name,\n };\n x += drawCell(columnHeaderCell, -1, -1)(d, i, o);\n if (x > self.width + self.scrollBox.scrollLeft) {\n break;\n }\n }\n }\n }\n rowHeaders.forEach(function (rArgs, rhIndex) {\n y = rArgs[3];\n cellHeight = rArgs[4];\n if (rhIndex === self.frozenRow) {\n self.ctx.save();\n radiusRect(\n 0,\n self.lastFrozenRowPixel,\n self.width,\n self.height - self.lastFrozenRowPixel,\n 0,\n );\n self.ctx.clip();\n }\n drawRowHeader(rArgs[0], rArgs[1], rArgs[2]);\n });\n self.ctx.restore();\n if (self.attributes.showColumnHeaders) {\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.columnHeaderCellBorderWidth;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n y = 0;\n // cell height might have changed during drawing\n cellHeight = self.getColumnHeaderCellHeight();\n drawHeaderColumnRange(self.scrollIndexLeft, g);\n nonFrozenHeaderWidth = x;\n x = self.style.columnHeaderCellBorderWidth;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n drawHeaderColumnRange(0, self.frozenColumn);\n // fill in the space right of the headers\n x = nonFrozenHeaderWidth;\n if (x < w) {\n c = {\n name: '',\n width: self.style.scrollBarWidth,\n style: 'columnHeaderCellCap',\n isColumnHeaderCell: true,\n isColumnHeaderCellCap: true,\n type: 'string',\n index: schema.length,\n };\n drawCell({ endCap: '' }, -1, -1)(c, -1, -1);\n }\n // fill in the space right of the headers\n if (self.attributes.showRowHeaders) {\n cornerCell = { cornerCell: '' };\n x = 0;\n c = {\n name: 'cornerCell',\n width: self.style.rowHeaderCellWidth,\n style: 'cornerCell',\n type: 'string',\n index: -1,\n };\n drawCell(cornerCell, -1, -1)(c, -1, -1);\n }\n }\n }\n function drawRow(rowOrderIndex, rowIndex) {\n var headerIndex,\n treeHeight,\n rowSansTreeHeight,\n columnOrderIndex,\n g = schema.length;\n if (y - cellHeight * 2 > h) {\n return false;\n }\n rowData = viewData[rowOrderIndex];\n rowOpen = self.openChildren[rowOrderIndex];\n rowSansTreeHeight =\n (self.sizes.rows[rowOrderIndex] || self.style.cellHeight) * self.scale;\n treeHeight = (rowOpen ? self.sizes.trees[rowOrderIndex] : 0) * self.scale;\n rowHeight = rowSansTreeHeight + treeHeight;\n if (y < -rowHeight) {\n return false;\n }\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n cellHeight = rowHeight;\n //draw normal columns\n for (\n columnOrderIndex = self.scrollIndexLeft;\n columnOrderIndex < g;\n columnOrderIndex += 1\n ) {\n if (!isColumnCollapsedByGroup(columnOrderIndex)) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(rowData, rowOrderIndex, rowIndex)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n }\n if (x > self.width) {\n self.scrollIndexRight = columnOrderIndex;\n self.scrollPixelRight = x;\n break;\n }\n }\n //draw frozen columns\n x = 1;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n for (\n columnOrderIndex = 0;\n columnOrderIndex < self.frozenColumn;\n columnOrderIndex += 1\n ) {\n if (!isColumnCollapsedByGroup(columnOrderIndex)) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(rowData, rowOrderIndex, rowIndex)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n }\n if (x > self.width) {\n break;\n }\n }\n self.lastFrozenColumnPixel = x;\n // cell height might have changed during drawing\n cellHeight = rowHeight;\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n // don't draw a tree for the new row\n treeGrid = self.childGrids[rowOrderIndex];\n if (rowOrderIndex !== viewData.length && rowOpen) {\n treeGrid.visible = true;\n treeGrid.parentNode = {\n offsetTop: y + rowSansTreeHeight + self.canvasOffsetTop,\n offsetLeft: rowHeaderCellWidth - 1 + self.canvasOffsetLeft,\n offsetHeight: treeHeight,\n offsetWidth:\n self.width - rowHeaderCellWidth - self.style.scrollBarWidth - 1,\n offsetParent: self.intf.parentNode,\n parentNode: self.intf.parentNode,\n style: self.style,\n nodeType: 'canvas-datagrid-tree',\n scrollTop: self.scrollBox.scrollTop,\n scrollLeft: self.scrollBox.scrollLeft,\n rowIndex: rowOrderIndex,\n columnGroupsAreaHeight: columnGroupsAreaHeight,\n rowGroupsAreaWidth: rowGroupsAreaWidth,\n };\n if (self.intf.parentNode) {\n const { columnGroupsAreaHeight, rowGroupsAreaWidth } =\n self.intf.parentNode;\n treeGrid.parentNode.columnGroupsAreaHeight +=\n columnGroupsAreaHeight || 0;\n treeGrid.parentNode.rowGroupsAreaWidth += rowGroupsAreaWidth || 0;\n }\n self.visibleCells.unshift({\n rowIndex: rowOrderIndex,\n columnIndex: 0,\n y: treeGrid.parentNode.offsetTop,\n x: treeGrid.parentNode.offsetLeft,\n height: treeGrid.height,\n width: treeGrid.width,\n style: 'tree-grid',\n type: treeGrid.parentNode.nodeType,\n });\n treeGrid.draw();\n } else if (treeGrid) {\n treeGrid.parentNode.offsetHeight = 0;\n delete self.sizes.trees[rowOrderIndex];\n }\n rowHeaders.push([rowData, rowOrderIndex, rowIndex, y, rowHeight]);\n self.visibleRowHeights[rowOrderIndex] = rowHeight;\n y += cellHeight + (bc ? 0 : self.style.cellBorderWidth);\n return true;\n }\n function initDraw() {\n self.visibleRows = [];\n schema = self.getSchema();\n self.visibleCells = [];\n self.visibleGroups = [];\n self.visibleUnhideIndicators = [];\n self.canvasOffsetTop = self.isChildGrid ? self.parentNode.offsetTop : 0.5;\n self.canvasOffsetLeft = self.isChildGrid\n ? self.parentNode.offsetLeft\n : -0.5;\n h = self.height;\n w = self.width;\n\n // patch for first row being hidden\n const firstRowIndexOffset = rowIndexOffsetByHiddenRows[0];\n if (firstRowIndexOffset && firstRowIndexOffset.from === 0) {\n currentRowIndexOffset = firstRowIndexOffset.plus;\n rowIndexOffsetByHiddenRows.shift();\n }\n }\n function drawBackground() {\n radiusRect(0, 0, w, h, 0);\n self.ctx.clip();\n self.ctx.clearRect(0, 0, w, h);\n self.ctx.fillStyle = self.style.gridBackgroundColor;\n fillRect(0, 0, w, h);\n }\n function initGroupArea() {\n self.ctx.translate(rowGroupsAreaWidth, columnGroupsAreaHeight);\n }\n function drawGroupArea() {\n const mx = rowGroupsAreaWidth;\n const my = columnGroupsAreaHeight;\n const frozenColumnsWidth = getFrozenColumnsWidth();\n const frozenRowsHeight =\n rowGroupsFrozenInfo.y + rowGroupsFrozenInfo.h - columnHeaderCellHeight;\n const onTheLeft = self.attributes.columnGroupIndicatorPosition === 'left';\n const onTheTop = self.attributes.rowGroupIndicatorPosition === 'top';\n\n /** @type {CanvasRenderingContext2D} */\n const ctx = self.ctx;\n ctx.save();\n ctx.fillStyle = self.style.groupingAreaBackgroundColor;\n fillRect(0, -my, w, my);\n fillRect(-mx, -my, mx, h);\n ctx.restore();\n\n //#region Columns Grouping\n /** it extends `self.groupedRows` */\n const groupedColumns = [];\n for (let row = 0; row < self.groupedColumns.length; row++) {\n const groups = self.groupedColumns[row];\n for (let j = 0; j < groups.length; j++) {\n groupedColumns.push(Object.assign({ row }, groups[j]));\n }\n }\n if (groupedColumns.length > 0) {\n const rowHeight = self.style.columnGroupRowHeight;\n const toggleHandleSize = rowHeight * 0.5;\n const toggleHandlePadding = (rowHeight - toggleHandleSize) * 0.5;\n\n for (let i = 0; i < groupedColumns.length; i++) {\n const group = groupedColumns[i];\n const { row, collapsed } = group;\n\n const topY = -my + row * rowHeight;\n const centerY = topY + rowHeight * 0.5;\n const bottomY = topY + rowHeight - toggleHandlePadding;\n const leftmostX =\n rowHeaderCellWidth - toggleHandleSize - toggleHandlePadding;\n\n const drawGroupHandleAtX = (x) =>\n drawGroupHandle(\n x,\n topY + toggleHandlePadding,\n toggleHandleSize,\n group.collapsed,\n );\n const pushToVisibleGroups = (leftX, rightX) =>\n self.visibleGroups.push({\n type: 'c',\n collapsed,\n from: group.from,\n to: group.to,\n row,\n x: leftX + mx,\n y: topY + my,\n x2: rightX + mx,\n y2: bottomY + my,\n });\n\n //#region check the relationship between this group and frozen columns\n const crossTheFrozen =\n group.from < self.frozenColumn && group.to >= self.frozenColumn;\n const notInFrozen = group.from >= self.frozenColumn;\n //#endregion\n\n if (collapsed) {\n let leftX = leftmostX + toggleHandleSize;\n // This group is not sticking on the first column\n if (group.from > 0) {\n let colIndex = group.to + 1;\n let col = columnGroupsRectInfo[colIndex];\n if (!col) {\n colIndex = group.from - 1;\n col = columnGroupsRectInfo[colIndex];\n if (!col) continue; // don't draw this group indicator because it is invisible\n leftX = col.x + col.w - toggleHandleSize * 0.5;\n } else {\n leftX = col.x + toggleHandlePadding;\n }\n if (colIndex >= self.frozenColumn) {\n const compare =\n frozenColumnsWidth + rowHeaderCellWidth - toggleHandlePadding;\n // don't draw this group indicator because it is hidden by frozen columns\n if (leftX < compare) continue;\n }\n }\n const rightX = leftX + toggleHandleSize;\n ctx.save();\n ctx.strokeStyle = self.style.groupIndicatorColor;\n ctx.fillStyle = self.style.groupIndicatorBackgroundColor;\n drawGroupHandleAtX(leftX);\n ctx.restore();\n pushToVisibleGroups(leftX, rightX);\n } // end of collapsed group\n\n /** @type {number} pointer for loop */\n let ptr;\n let left = columnGroupsRectInfo[group.from];\n let right = columnGroupsRectInfo[group.to];\n\n let containsBegining = true;\n let containsEnd = true;\n ptr = group.from;\n while (!left && ptr < group.to) {\n left = columnGroupsRectInfo[++ptr];\n containsBegining = false;\n }\n ptr = group.to;\n while (!right && ptr > group.from) {\n right = columnGroupsRectInfo[--ptr];\n containsEnd = false;\n }\n if (!left || !right) continue;\n let rightX = right.x + right.w;\n let leftX = left.x;\n if (crossTheFrozen) {\n const rightCompare = columnGroupsRectInfo[self.frozenColumn - 1];\n if (rightCompare) {\n let compareX = rightCompare.x + rightCompare.w;\n if (!onTheLeft) compareX += toggleHandleSize;\n if (compareX >= rightX) {\n right = rightCompare;\n rightX = right.x + right.w;\n containsEnd = false;\n }\n }\n }\n\n let minLeftX =\n rowHeaderCellWidth + (notInFrozen ? frozenColumnsWidth : 0);\n if (rightX + (onTheLeft ? 0 : toggleHandleSize) < minLeftX) continue;\n\n rightX -= toggleHandlePadding;\n leftX += toggleHandlePadding;\n\n ctx.save();\n ctx.strokeStyle = self.style.groupIndicatorColor;\n ctx.fillStyle = self.style.groupIndicatorBackgroundColor;\n const lineCoords = [];\n\n if (onTheLeft) {\n // avoid lines from two groups be overlapping\n minLeftX += toggleHandlePadding * 2;\n if (leftX < minLeftX) leftX = minLeftX;\n if (group.from === 0) leftX -= toggleHandlePadding * 2;\n if (rightX >= leftX) {\n lineCoords.push(leftX, centerY, rightX, centerY);\n if (containsEnd) lineCoords.push(rightX, bottomY);\n } else {\n rightX = leftX;\n }\n\n leftX -= toggleHandleSize;\n drawGroupHandleAtX(leftX);\n // add more clickable area into `visibleGroups`\n rightX += toggleHandlePadding - 1;\n } else {\n // handle on the right\n if (leftX < minLeftX) leftX = minLeftX;\n if (group.from === 0) leftX -= toggleHandlePadding * 2;\n if (containsEnd) {\n if (group.to === self.frozenColumn - 1) {\n rightX -= toggleHandleSize;\n } else {\n rightX += toggleHandlePadding * 2;\n }\n drawGroupHandleAtX(rightX);\n }\n if (leftX > rightX) {\n leftX = rightX;\n } else {\n if (group.from === 0) {\n containsBegining = true;\n leftX = leftmostX + toggleHandleSize;\n }\n if (containsBegining) lineCoords.push(leftX, bottomY);\n lineCoords.push(leftX, centerY, rightX, centerY);\n }\n\n // add more clickable area into `visibleGroups`\n leftX -= toggleHandlePadding + 1;\n if (containsEnd) rightX += toggleHandleSize;\n }\n drawLines(lineCoords);\n ctx.restore();\n pushToVisibleGroups(leftX, rightX);\n }\n }\n //#endregion Columns Grouping\n\n //#region Rows Grouping\n /** it extends `self.groupedRows` */\n const groupedRows = [];\n for (let col = 0; col < self.groupedRows.length; col++) {\n const groups = self.groupedRows[col];\n for (let j = 0; j < groups.length; j++) {\n groupedRows.push(Object.assign({ col }, groups[j]));\n }\n }\n if (groupedRows.length > 0) {\n const colWidth = self.style.rowGroupColumnWidth;\n const toggleHandleSize = colWidth * 0.5;\n const toggleHandlePadding = (colWidth - toggleHandleSize) * 0.5;\n\n for (let i = 0; i < groupedRows.length; i++) {\n const group = groupedRows[i];\n const { col, collapsed } = group;\n\n const leftX = -mx + col * colWidth;\n const centerX = leftX + colWidth * 0.5;\n const rightX = leftX + colWidth - toggleHandlePadding;\n const topmostY =\n columnHeaderCellHeight - toggleHandleSize - toggleHandlePadding;\n\n const drawGroupHandleAtY = (y) =>\n drawGroupHandle(\n leftX + toggleHandlePadding,\n y,\n toggleHandleSize,\n group.collapsed,\n );\n const pushToVisibleGroups = (topY, bottomY) =>\n self.visibleGroups.push({\n type: 'r',\n collapsed,\n from: group.from,\n to: group.to,\n col,\n x: leftX + mx,\n y: topY + my,\n x2: rightX + mx,\n y2: bottomY + my,\n });\n\n //#region check the relationship between this group and frozen columns\n const crossTheFrozen =\n group.from < self.frozenRow && group.to >= self.frozenRow;\n const notInFrozen = group.from >= self.frozenRow;\n //#endregion\n\n if (collapsed) {\n let topY = topmostY + toggleHandleSize;\n // This group is not sticking on the first column\n if (group.from > 0) {\n let rowIndex = group.to + 1;\n let row = rowGroupsRectInfo[rowIndex];\n if (!row) {\n rowIndex = group.from - 1;\n row = rowGroupsRectInfo[rowIndex];\n if (!row) continue; // don't draw this group indicator because it is invisible\n topY = row.y + row.h - toggleHandleSize * 0.5;\n } else {\n topY = row.y;\n }\n if (rowIndex >= self.frozenRow) {\n const compare =\n frozenRowsHeight +\n columnHeaderCellHeight -\n toggleHandlePadding;\n // don't draw this group indicator because it is hidden by frozen columns\n if (topY < compare) continue;\n }\n }\n const bottomY = topY + toggleHandleSize;\n ctx.save();\n ctx.strokeStyle = self.style.groupIndicatorColor;\n ctx.fillStyle = self.style.groupIndicatorBackgroundColor;\n drawGroupHandleAtY(topY);\n ctx.restore();\n pushToVisibleGroups(topY, bottomY);\n } // end of collapsed group\n\n /** @type {number} pointer for loop */\n let ptr;\n let top = rowGroupsRectInfo[group.from];\n let bottom = rowGroupsRectInfo[group.to];\n\n let containsBegining = true;\n let containsEnd = true;\n ptr = group.from;\n while (!top && ptr < group.to) {\n top = rowGroupsRectInfo[++ptr];\n containsBegining = false;\n }\n ptr = group.to;\n while (!bottom && ptr > group.from) {\n bottom = rowGroupsRectInfo[--ptr];\n containsEnd = false;\n }\n if (!top || !bottom) continue;\n let bottomY = bottom.y + bottom.h;\n let topY = top.y;\n if (crossTheFrozen) {\n const bottomCompare = rowGroupsRectInfo[self.frozenRow - 1];\n if (bottomCompare) {\n let compareY = bottomCompare.y + bottomCompare.h;\n if (!onTheTop) compareY += toggleHandleSize;\n if (compareY >= bottomY) {\n bottom = bottomCompare;\n bottomY = bottom.y + bottom.h;\n containsEnd = false;\n }\n }\n }\n\n let minTopY =\n columnHeaderCellHeight + (notInFrozen ? frozenRowsHeight : 0);\n if (bottomY + (onTheTop ? 0 : toggleHandleSize) < minTopY) continue;\n\n bottomY -= toggleHandlePadding;\n topY += toggleHandlePadding;\n\n ctx.save();\n ctx.strokeStyle = self.style.groupIndicatorColor;\n ctx.fillStyle = self.style.groupIndicatorBackgroundColor;\n const lineCoords = [];\n\n if (onTheTop) {\n // avoid lines from two groups be overlapping\n minTopY += toggleHandlePadding * 2;\n if (topY < minTopY) topY = minTopY;\n if (group.from === 0) topY -= toggleHandlePadding * 2;\n if (bottomY >= topY) {\n lineCoords.push(centerX, topY, centerX, bottomY);\n if (containsEnd) lineCoords.push(rightX, bottomY);\n } else {\n bottomY = topY;\n }\n\n topY -= toggleHandleSize;\n drawGroupHandleAtY(topY);\n\n // add more clickable area into `visibleGroups`\n bottomY += toggleHandlePadding - 1;\n } else {\n // handle on the bottom\n if (topY < minTopY) topY = minTopY;\n if (group.from === 0) topY -= toggleHandlePadding * 2;\n if (containsEnd) {\n if (group.to === self.frozenRow - 1) {\n bottomY -= toggleHandleSize;\n } else {\n // bottomY += toggleHandlePadding * 2;\n }\n drawGroupHandleAtY(bottomY);\n }\n if (topY > bottomY) {\n topY = bottomY;\n } else {\n if (group.from === 0) {\n containsBegining = true;\n topY = topmostY + toggleHandleSize;\n }\n if (containsBegining) lineCoords.push(rightX, topY);\n lineCoords.push(centerX, topY, centerX, bottomY);\n // add more clickable area into `visibleGroups`\n topY -= toggleHandlePadding + 1;\n }\n // add more clickable area into `visibleGroups`\n if (containsEnd) bottomY += toggleHandleSize;\n }\n drawLines(lineCoords);\n ctx.restore();\n pushToVisibleGroups(topY, bottomY);\n }\n }\n //#endregion Rows Grouping\n }\n function drawFrozenRows() {\n var rowOrderIndex,\n ln = Math.min(viewData.length, self.frozenRow);\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n y = columnHeaderCellHeight;\n for (rowIndex = 0; rowIndex < ln; rowIndex += 1) {\n rowOrderIndex = self.orders.rows[rowIndex];\n if (!drawRow(rowOrderIndex, rowIndex)) {\n break;\n }\n }\n if (self.attributes.allowFreezingRows) {\n // HACK great, another stupid magic number.\n // Background will appear as a 0.5px artifact behind the row freeze bar without this hack\n if (y > columnHeaderCellHeight) y += self.style.frozenMarkerWidth;\n y += self.style.frozenMarkerBorderWidth - 0.4999999999;\n }\n self.lastFrozenRowPixel = y;\n }\n function drawRows() {\n self.ctx.save();\n if (self.frozenRow > 0) {\n radiusRect(\n 0,\n self.lastFrozenRowPixel,\n self.width,\n self.height - self.lastFrozenRowPixel,\n 0,\n );\n self.ctx.clip();\n }\n var columnOrderIndex,\n rowOrderIndex,\n headerIndex,\n g = schema.length;\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n if (!self.attributes.snapToRow) {\n y +=\n -self.scrollBox.scrollTop +\n self.scrollPixelTop +\n self.style.cellBorderWidth;\n }\n for (\n rowIndex = self.frozenRow + self.scrollIndexTop;\n rowIndex < l;\n rowIndex += 1\n ) {\n rowOrderIndex = self.orders.rows[rowIndex];\n self.scrollIndexBottom = rowIndex;\n self.scrollPixelBottom = y;\n if (\n self.cellTree.rows.length > 0 &&\n Object.keys(self.cellTree.rows[rowOrderIndex]).length > 0 &&\n self.cellTree.rows[rowOrderIndex].hide\n )\n continue;\n if (!drawRow(rowOrderIndex, rowIndex)) {\n break;\n }\n }\n if (self.attributes.showNewRow) {\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n rowHeight = cellHeight = self.style.cellHeight;\n rowOpen = false;\n for (\n columnOrderIndex = self.scrollIndexLeft;\n columnOrderIndex < g;\n columnOrderIndex += 1\n ) {\n if (!isColumnCollapsedByGroup(columnOrderIndex)) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(self.newRow, viewData.length, viewData.length)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n }\n if (x > self.width + self.scrollBox.scrollLeft) {\n break;\n }\n }\n rowHeaders.push([\n self.newRow,\n viewData.length,\n viewData.length,\n y,\n rowHeight,\n ]);\n }\n self.ctx.restore();\n }\n function drawMoveMarkers() {\n if (!self.movingSelection) {\n return;\n }\n self.ctx.lineWidth = self.style.moveOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.moveOverlayBorderColor;\n self.ctx.setLineDash(self.style.moveOverlayBorderSegments);\n moveBorders.forEach(function (c) {\n addBorderLine(c[0], c[1]);\n });\n self.ctx.setLineDash([]);\n }\n function drawReorderMarkers() {\n if (!self.reorderObject) {\n return;\n }\n var b = {\n height: self.reorderObject.height,\n width: self.reorderObject.width,\n x: self.reorderObject.x + self.reorderObject.dragOffset.x,\n y: self.reorderObject.y + self.reorderObject.dragOffset.y,\n },\n m = {\n width: w,\n height: h,\n x: 0,\n y: 0,\n };\n self.ctx.fillStyle = self.style.reorderMarkerBackgroundColor;\n self.ctx.lineWidth = self.style.reorderMarkerBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerBorderColor;\n if (self.dragMode === 'row-reorder') {\n b.height = self.getSelectedRowsHeight();\n b.width = w;\n b.x = 0;\n m.width = w;\n m.height = self.currentCell.height;\n m.y = self.currentCell.y;\n fillRect(b.x, b.y, b.width, b.height);\n strokeRect(b.x, b.y, b.width, b.height);\n self.ctx.lineWidth = self.style.reorderMarkerIndexBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerIndexBorderColor;\n if (\n !self.isRowSelected(self.reorderTarget.sortRowIndex) &&\n self.currentCell.rowIndex !== self.reorderObject.rowIndex &&\n self.currentCell.rowIndex > -1 &&\n self.currentCell.rowIndex < l\n ) {\n addBorderLine(\n m,\n self.reorderTarget.sortRowIndex > self.reorderObject.sortRowIndex\n ? 'b'\n : 't',\n );\n }\n } else if (self.dragMode === 'column-reorder' && self.reorderObject) {\n b.width = self.getSelectedColumnsWidth();\n b.height = h;\n b.y = 0;\n m.height = h;\n m.width = self.currentCell.width;\n m.y = 0;\n m.x = self.currentCell.x;\n fillRect(b.x, b.y, b.width, b.height);\n strokeRect(b.x, b.y, b.width, b.height);\n self.ctx.lineWidth = self.style.reorderMarkerIndexBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerIndexBorderColor;\n if (\n !self.isColumnSelected(self.reorderTarget.sortColumnIndex) &&\n self.currentCell.sortColumnIndex !==\n self.reorderObject.sortColumnIndex &&\n self.reorderTarget.columnIndex !== self.reorderObject.columnIndex &&\n self.currentCell.sortColumnIndex > -1 &&\n self.currentCell.sortColumnIndex < schema.length\n ) {\n addBorderLine(\n m,\n self.reorderTarget.columnIndex > self.reorderObject.columnIndex\n ? 'r'\n : 'l',\n );\n }\n }\n }\n function drawResizeMarkers() {\n if (\n !self.attributes.resizeAfterDragged ||\n !self.draggingItem ||\n !self.pendingDragResize ||\n (self.dragMode != 'ew-resize' && self.dragMode != 'ns-resize')\n ) {\n return;\n }\n\n const resizingRow = self.dragMode == 'ns-resize';\n const height = resizingRow ? self.style.resizeMarkerSize : self.height;\n const width = resizingRow ? self.width : self.style.resizeMarkerSize;\n const minX =\n self.dragStart.x -\n (self.resizingStartingWidth - self.style.minColumnWidth);\n const minY =\n self.dragStart.y -\n (self.resizingStartingHeight - self.style.minRowHeight);\n const x = resizingRow ? 0 : Math.max(self.pendingDragResize.x, minX);\n const y = !resizingRow ? 0 : Math.max(self.pendingDragResize.y, minY);\n\n self.ctx.fillStyle = self.style.resizeMarkerColor;\n fillRect(x, y, width, height);\n }\n function drawBorder() {\n self.ctx.lineWidth = self.style.gridBorderWidth;\n self.ctx.strokeStyle = self.style.gridBorderColor;\n strokeRect(0, 0, self.width, self.height);\n }\n function drawSelectionBorders() {\n function dsb(c) {\n if (!self.fillOverlay.handle) {\n self.ctx.lineWidth = self.style.selectionOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.selectionOverlayBorderColor;\n addBorderLine(c[0], c[1]);\n }\n }\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex < self.frozenRow &&\n c[0].columnIndex < self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.save();\n clipFrozenArea(0);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex >= self.frozenRow &&\n c[0].columnIndex >= self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n self.ctx.save();\n clipFrozenArea(1);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex >= self.frozenRow &&\n c[0].columnIndex < self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n self.ctx.save();\n clipFrozenArea(2);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex < self.frozenRow &&\n c[0].columnIndex >= self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n\n drawFillOverlay();\n }\n function drawSelectionHandles() {\n if (\n (self.mobile || self.attributes.allowMovingSelection) &&\n self.attributes.editable\n ) {\n self.ctx.lineWidth = self.style.selectionHandleBorderWidth;\n self.ctx.strokeStyle = self.style.selectionHandleBorderColor;\n self.ctx.fillStyle = self.style.selectionHandleColor;\n selectionHandles.forEach(function (c) {\n addselectionHandle(c[0], c[1]);\n var az = self.attributes.touchSelectHandleZone / 2,\n ax =\n c[0].x + (c[1] === 'tl' || c[1] === 'bl' ? 0 : c[0].width) - az,\n ay =\n c[0].y + (c[1] === 'bl' || c[1] === 'br' ? c[0].height : 0) - az;\n self.visibleCells.unshift({\n x: ax,\n y: ay,\n height: self.style.selectionHandleSize + az,\n width: self.style.selectionHandleSize + az,\n style: 'selection-handle-' + c[1],\n });\n });\n }\n }\n function drawFillOverlay() {\n if (!self.fillOverlay.handle || !self.fillOverlay.snapTo) {\n return;\n }\n\n self.ctx.save();\n\n const overlay = self.fillOverlay;\n const handle = overlay.handle;\n const toX = overlay.snapTo.x;\n const toY = overlay.snapTo.y;\n\n // The cell that the cursor is moving over. This may be unavailable\n // when the cursor is outside the grid or is pointing to something else.\n //\n // When unavailable, we use the actual position of the cursor to draw\n // the overlay.\n const snap = overlay.snap;\n\n // Calculate the X, Y coordinates of the cursor with snap positions and\n // the direction of the movement in mind.\n //\n // When the movement is horizontal, we get the Y coordinate from the handle,\n // and vice-versa.\n const cursorX =\n overlay.direction === 'x'\n ? snap\n ? snap.x + (overlay.x < toX ? 0 : snap.width)\n : overlay.x\n : handle.x;\n const cursorY =\n overlay.direction === undefined || overlay.direction === 'y'\n ? snap\n ? snap.y + (overlay.y < toY ? 0 : snap.height)\n : overlay.y\n : handle.y;\n\n // The final coordinates of the rect. We use 'minX' and 'minY' to avoid\n // drawing on the frozen area.\n const x = Math.max(Math.min(toX, cursorX), overlay.minX);\n const y = Math.max(Math.min(toY, cursorY), overlay.minY);\n\n // Width and height of the rect are the difference between the\n // coordinates of both the rect and the cursor. The user may be pointing\n // behind and/or upwards of the rect, so we need to take that into\n // account.\n const width = Math.max(toX, cursorX) - x;\n const height = Math.max(toY, cursorY) - y;\n\n self.ctx.strokeStyle = self.style.fillOverlayBorderColor;\n self.ctx.lineWidth = self.style.fillOverlayBorderWidth;\n self.ctx.setLineDash([3, 3]);\n strokeRect(x, y, width, height);\n self.ctx.setLineDash([]);\n self.ctx.restore();\n }\n function drawActiveCell() {\n if (!aCell) {\n return;\n }\n self.ctx.save();\n var cl =\n self.activeCell.columnIndex + 1 > self.frozenColumn ||\n self.activeCell.rowIndex + 1 > self.frozenRow,\n acx = cl ? self.lastFrozenColumnPixel : 0,\n acy = cl ? self.lastFrozenRowPixel : 0,\n acw = cl ? self.width - self.lastFrozenColumnPixel : self.width,\n ach = cl ? self.height - self.lastFrozenRowPixel : self.height;\n radiusRect(acx, acy, acw, ach, 0);\n self.ctx.clip();\n if (self.attributes.selectionMode === 'row') {\n if (self.activeCell && self.activeCell.rowIndex === aCell.rowIndex) {\n self.ctx.lineWidth = self.style.activeCellOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.activeCellOverlayBorderColor;\n strokeRect(\n 1,\n aCell.y,\n self.getHeaderWidth() + rowHeaderCellWidth,\n self.visibleRowHeights[aCell.rowIndex],\n );\n }\n } else {\n self.ctx.lineWidth = self.style.activeCellOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.activeCellOverlayBorderColor;\n strokeRect(aCell.x, aCell.y, aCell.width, aCell.height);\n }\n self.ctx.restore();\n }\n function drawFrozenMarkers() {\n var my = self.lastFrozenRowPixel - self.style.frozenMarkerWidth,\n mx = self.lastFrozenColumnPixel - self.style.frozenMarkerWidth,\n xHover =\n self.currentCell && self.currentCell.style === 'frozen-row-marker',\n yHover =\n self.currentCell && self.currentCell.style === 'frozen-column-marker';\n let rowHeaderCellWidth = self.getRowHeaderCellWidth();\n self.ctx.lineWidth = self.style.frozenMarkerBorderWidth;\n if (self.attributes.allowFreezingColumns) {\n if (\n !self.freezeMarkerPosition ||\n (self.freezeMarkerPosition && self.dragMode === 'frozen-row-marker')\n ) {\n if (mx > self.style.rowHeaderCellWidth) {\n self.ctx.fillStyle = self.style.frozenMarkerColor;\n self.ctx.strokeStyle = self.style.frozenMarkerBorderColor;\n fillRect(mx, 0, self.style.frozenMarkerWidth, self.height);\n strokeRect(mx, 0, self.style.frozenMarkerWidth, self.height);\n }\n self.ctx.fillStyle = yHover\n ? self.style.frozenMarkerHoverColor\n : self.style.frozenMarkerHeaderColor;\n self.ctx.strokeStyle = yHover\n ? self.style.frozenMarkerHoverBorderColor\n : self.style.frozenMarkerHeaderColor;\n fillRect(\n mx,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n strokeRect(\n mx,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n }\n\n if (\n !self.dragStartObject ||\n (self.dragStartObject &&\n self.dragStartObject.style !== 'rowHeaderCell')\n ) {\n self.visibleCells.unshift({\n x: mx,\n y: 0,\n height: self.height,\n width: self.style.frozenMarkerWidth, // + self.style.frozenMarkerBorderWidth,\n style: 'frozen-column-marker',\n });\n }\n }\n if (self.attributes.allowFreezingRows) {\n if (\n !self.freezeMarkerPosition ||\n (self.freezeMarkerPosition &&\n self.dragMode === 'frozen-column-marker')\n ) {\n if (my > rowHeaderCellWidth) {\n self.ctx.fillStyle = self.style.frozenMarkerColor;\n self.ctx.strokeStyle = self.style.frozenMarkerBorderColor;\n fillRect(0, my, self.width, self.style.frozenMarkerWidth);\n strokeRect(0, my, self.width, self.style.frozenMarkerWidth);\n }\n self.ctx.fillStyle = xHover\n ? self.style.frozenMarkerHoverColor\n : self.style.frozenMarkerHeaderColor;\n self.ctx.strokeStyle = xHover\n ? self.style.frozenMarkerHoverBorderColor\n : self.style.frozenMarkerHeaderColor;\n fillRect(0, my, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n strokeRect(0, my, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n }\n var height =\n self.style.frozenMarkerWidth + self.style.frozenMarkerBorderWidth;\n if (\n !self.dragStartObject ||\n (self.dragStartObject &&\n self.dragStartObject.style !== 'columnHeaderCell')\n ) {\n self.visibleCells.unshift({\n x: 0,\n y: my,\n height: height,\n width: self.width,\n style: 'frozen-row-marker',\n });\n }\n rowGroupsFrozenInfo = { y: my, h: height };\n }\n if (self.freezeMarkerPosition) {\n self.ctx.fillStyle = self.style.frozenMarkerActiveColor;\n self.ctx.strokeStyle = self.style.frozenMarkerActiveBorderColor;\n if (self.dragMode === 'frozen-column-marker') {\n let posX = self.freezeMarkerPosition.x;\n let nearCell = self.getCellAt(posX, 0);\n if (self.freezeMarkerPosition.isGrab) posX = mx;\n if (posX > rowHeaderCellWidth) {\n let x =\n nearCell.x -\n self.style.frozenMarkerWidth -\n self.style.frozenMarkerBorderWidth;\n if (posX > x + nearCell.width / 2) x = x + nearCell.width;\n self.ctx.fillStyle = self.style.frozenMarkerColor;\n self.ctx.strokeStyle = self.style.frozenMarkerBorderColor;\n fillRect(x, 0, self.style.frozenMarkerWidth, self.height);\n strokeRect(x, 0, self.style.frozenMarkerWidth, self.height);\n self.ctx.fillStyle = self.style.frozenMarkerHeaderColor;\n self.ctx.strokeStyle = self.style.frozenMarkerHeaderColor;\n fillRect(\n x,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n strokeRect(\n x,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n }\n self.ctx.fillStyle = self.style.frozenMarkerActiveHeaderColor;\n self.ctx.strokeStyle = self.style.frozenMarkerActiveBorderColor;\n fillRect(\n posX,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n strokeRect(\n posX,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n self.ctx.fillStyle = self.style.frozenMarkerActiveColor;\n fillRect(posX, 0, self.style.frozenMarkerWidth, self.height);\n strokeRect(posX, 0, self.style.frozenMarkerWidth, self.height);\n } else {\n let posY = self.freezeMarkerPosition.y;\n let nearCell = self.getCellAt(0, posY);\n if (self.freezeMarkerPosition.isGrab) posY = my;\n if (posY > self.style.columnHeaderCellHeight) {\n let y =\n nearCell.y -\n self.style.frozenMarkerWidth -\n self.style.frozenMarkerBorderWidth;\n if (posY > y + nearCell.height / 2) y = y + nearCell.height;\n self.ctx.fillStyle = self.style.frozenMarkerColor;\n self.ctx.strokeStyle = self.style.frozenMarkerBorderColor;\n fillRect(0, y, self.width, self.style.frozenMarkerWidth);\n strokeRect(0, y, self.width, self.style.frozenMarkerWidth);\n self.ctx.fillStyle = self.style.frozenMarkerHeaderColor;\n self.ctx.strokeStyle = self.style.frozenMarkerHeaderColor;\n fillRect(0, y, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n strokeRect(0, y, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n }\n self.ctx.fillStyle = self.style.frozenMarkerActiveHeaderColor;\n self.ctx.strokeStyle = self.style.frozenMarkerActiveBorderColor;\n fillRect(0, posY, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n strokeRect(0, posY, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n self.ctx.fillStyle = self.style.frozenMarkerActiveColor;\n fillRect(0, posY, self.width, self.style.frozenMarkerWidth);\n strokeRect(0, posY, self.width, self.style.frozenMarkerWidth);\n }\n }\n }\n function drawPerfLines() {\n if (!self.attributes.showPerformance) {\n return;\n }\n var pw = 250,\n px =\n self.width -\n pw -\n self.style.scrollBarWidth -\n self.style.scrollBarBorderWidth * 2,\n py = columnHeaderCellHeight,\n ph = 100;\n if (scrollDebugCounters.length === 0) {\n scrollDebugCounters = fillArray(0, perfWindowSize, 1, function () {\n return [0, 0];\n });\n }\n if (touchPPSCounters.length === 0) {\n touchPPSCounters = fillArray(0, perfWindowSize, 1, function () {\n return [0, 0];\n });\n }\n if (entityCount.length === 0) {\n entityCount = fillArray(0, perfWindowSize, 1, 0);\n }\n self.ctx.lineWidth = 0.5;\n function dpl(name, perfArr, arrIndex, max, color, useAbs, rowIndex) {\n var v;\n drawPerfLine(pw, ph, px, py, perfArr, arrIndex, max, color, useAbs);\n self.ctx.fillStyle = color;\n fillRect(3 + px, py + 9 + rowIndex * 11, 8, 8);\n self.ctx.fillStyle = self.style.debugPerfChartTextColor;\n v = arrIndex !== undefined ? perfArr[0][arrIndex] : perfArr[0];\n fillText(\n name + ' ' + (isNaN(v) ? 0 : v).toFixed(3),\n 14 + px,\n py + 16 + rowIndex * 11,\n );\n }\n self.ctx.textAlign = 'left';\n self.ctx.font = self.style.debugFont;\n self.ctx.fillStyle = self.style.debugPerfChartBackground;\n fillRect(px, py, pw, ph);\n [\n [\n 'Scroll Height',\n scrollDebugCounters,\n 0,\n self.scrollBox.scrollHeight,\n self.style.debugScrollHeightColor,\n false,\n ],\n [\n 'Scroll Width',\n scrollDebugCounters,\n 1,\n self.scrollBox.scrollWidth,\n self.style.debugScrollWidthColor,\n false,\n ],\n [\n 'Performance',\n perfCounters,\n undefined,\n 200,\n self.style.debugPerformanceColor,\n false,\n ],\n [\n 'Entities',\n entityCount,\n undefined,\n 1500,\n self.style.debugEntitiesColor,\n false,\n ],\n [\n 'TouchPPSX',\n touchPPSCounters,\n 0,\n 1000,\n self.style.debugTouchPPSXColor,\n true,\n ],\n [\n 'TouchPPSY',\n touchPPSCounters,\n 1,\n 1000,\n self.style.debugTouchPPSYColor,\n true,\n ],\n ].forEach(function (i, index) {\n i.push(index);\n dpl.apply(null, i);\n });\n self.ctx.fillStyle = self.style.debugPerfChartBackground;\n entityCount.pop();\n entityCount.unshift(self.visibleCells.length);\n scrollDebugCounters.pop();\n scrollDebugCounters.unshift([\n self.scrollBox.scrollTop,\n self.scrollBox.scrollLeft,\n ]);\n touchPPSCounters.pop();\n touchPPSCounters.unshift([self.yPPS, self.xPPS]);\n }\n function drawDebug() {\n self.ctx.save();\n var d;\n if (self.attributes.showPerformance || self.attributes.debug) {\n if (perfCounters.length === 0) {\n perfCounters = fillArray(0, perfWindowSize, 1, 0);\n }\n perfCounters.pop();\n perfCounters.unshift(performance.now() - p);\n }\n if (!self.attributes.debug) {\n self.ctx.restore();\n return;\n }\n self.ctx.font = self.style.debugFont;\n d = {};\n d.perf = (\n perfCounters.reduce(function (a, b) {\n return a + b;\n }, 0) / Math.min(drawCount, perfCounters.length)\n ).toFixed(1);\n d.perfDelta = perfCounters[0].toFixed(1);\n d.frozenColumnsWidth = getFrozenColumnsWidth();\n d.htmlImages = Object.keys(self.htmlImageCache).length;\n d.reorderObject =\n 'x: ' +\n (self.reorderObject || { columnIndex: 0 }).columnIndex +\n ', y: ' +\n (self.reorderObject || { rowIndex: 0 }).rowIndex;\n d.reorderTarget =\n 'x: ' +\n (self.reorderTarget || { columnIndex: 0 }).columnIndex +\n ', y: ' +\n (self.reorderTarget || { rowIndex: 0 }).rowIndex;\n d.scale = self.scale;\n d.startScale = self.startScale;\n d.scaleDelta = self.scaleDelta;\n d.zoomDeltaStart = self.zoomDeltaStart;\n d.touchLength = self.touchLength;\n d.touches =\n 'y0: ' +\n (self.touchPosition || { y: 0 }).y +\n ' y1: ' +\n (self.touchPosition1 || { y: 0 }).y;\n d.scrollBox = self.scrollBox.toString();\n d.scrollIndex =\n 'x: ' + self.scrollIndexLeft + ', y: ' + self.scrollIndexTop;\n d.scrollPixel =\n 'x: ' + self.scrollPixelLeft + ', y: ' + self.scrollPixelTop;\n d.canvasOffset =\n 'x: ' + self.canvasOffsetLeft + ', y: ' + self.canvasOffsetTop;\n d.touchDelta = 'x: ' + self.touchDelta.x + ', y: ' + self.touchDelta.y;\n d.touchAnimateTo =\n 'x: ' + self.touchAnimateTo.x + ', y: ' + self.touchAnimateTo.y;\n d.scrollAnimation =\n 'x: ' + self.scrollAnimation.x + ', y: ' + self.scrollAnimation.y;\n d.touchPPS = 'x: ' + self.xPPS + ', y: ' + self.yPPS;\n d.touchPPST = 'x: ' + self.xPPST + ', y: ' + self.yPPST;\n d.touchDuration = self.touchDuration;\n d.pointerLockPosition = self.pointerLockPosition\n ? self.pointerLockPosition.x + ', ' + self.pointerLockPosition.y\n : '';\n d.size = 'w: ' + self.width + ', h: ' + self.height;\n d.mouse = 'x: ' + self.mouse.x + ', y: ' + self.mouse.y;\n d.touch = !self.touchStart\n ? ''\n : 'x: ' + self.touchStart.x + ', y: ' + self.touchStart.y;\n d.entities = self.visibleCells.length;\n d.hasFocus = self.hasFocus;\n d.dragMode = self.dragMode;\n if (self.currentCell) {\n d.columnIndex = self.currentCell.columnIndex;\n d.rowIndex = self.currentCell.rowIndex;\n d.sortColumnIndex = self.currentCell.sortColumnIndex;\n d.sortRowIndex = self.currentCell.sortRowIndex;\n d.context = self.currentCell.context;\n d.dragContext = self.currentCell.dragContext;\n d.style = self.currentCell.style;\n d.type = self.currentCell.type;\n }\n self.ctx.textAlign = 'right';\n self.ctx.fillStyle = self.style.debugBackgroundColor;\n fillRect(0, 0, self.width, self.height);\n Object.keys(d).forEach(function (key, index) {\n var m = key + ': ' + d[key],\n lh = 14;\n self.ctx.fillStyle = self.style.debugColor;\n fillText(\n m,\n w - 20,\n (self.attributes.showPerformance ? 140 : 24) + index * lh,\n );\n });\n self.ctx.restore();\n }\n self.ctx.save();\n initDraw();\n drawBackground();\n initGroupArea();\n drawFrozenRows();\n drawRows();\n drawActiveCell();\n drawHeaders();\n drawFrozenMarkers();\n drawSelectionHandles();\n drawReorderMarkers();\n drawMoveMarkers();\n drawResizeMarkers();\n drawBorder();\n drawSelectionBorders();\n drawScrollBars();\n if (checkScrollHeight) {\n self.resize(true);\n }\n drawGroupArea();\n drawDebug();\n drawPerfLines();\n if (self.dispatchEvent('afterdraw', {})) {\n return;\n }\n self.ctx.restore();\n };\n}\n","/*jslint browser: true, unparam: true, todo: true, plusplus: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport isPrintableKeyEvent from 'is-printable-key-event';\nimport { isSupportedHtml, parseData, deduceColTypeFromData } from './util';\n\nexport default function (self) {\n var wheeling;\n self.stopPropagation = function (e) {\n e.stopPropagation();\n };\n /**\n * Adds an event listener to the given event.\n * @memberof canvasDatagrid\n * @name addEventListener\n * @method\n * @param {string} ev The name of the event to subscribe to.\n * @param {function} fn The event procedure to execute when the event is raised.\n */\n self.addEventListener = function (ev, fn) {\n self.events[ev] = self.events[ev] || [];\n self.events[ev].unshift(fn);\n };\n /**\n * Removes the given listener function from the given event. Must be an actual reference to the function that was bound.\n * @memberof canvasDatagrid\n * @name removeEventListener\n * @method\n * @param {string} ev The name of the event to unsubscribe from.\n * @param {function} fn The event procedure to execute when the event is raised.\n */\n self.removeEventListener = function (ev, fn) {\n (self.events[ev] || []).forEach(function removeEachListener(sfn, idx) {\n if (fn === sfn) {\n self.events[ev].splice(idx, 1);\n }\n });\n };\n /**\n * Fires the given event, passing an event object to the event subscribers.\n * @memberof canvasDatagrid\n * @name dispatchEvent\n * @method\n * @param {number} ev The name of the event to dispatch.\n * @param {number} e The event object.\n */\n self.dispatchEvent = function (ev, e) {\n e = ev.type ? ev : e || {};\n ev = ev.type || ev;\n var defaultPrevented;\n function preventDefault() {\n defaultPrevented = true;\n }\n if (!self.events[ev]) {\n return;\n }\n self.events[ev].forEach(function dispatchEachEvent(fn) {\n e.ctx = self.ctx;\n e.preventDefault = preventDefault;\n fn.apply(self.intf, [e]);\n });\n return defaultPrevented;\n };\n self.getRatio = function () {\n return Math.min(\n self.attributes.maxPixelRatio,\n (window.devicePixelRatio || 1) /\n (self.ctx.webkitBackingStorePixelRatio ||\n self.ctx.mozBackingStorePixelRatio ||\n self.ctx.msBackingStorePixelRatio ||\n self.ctx.oBackingStorePixelRatio ||\n self.ctx.backingStorePixelRatio ||\n 1),\n );\n };\n /**\n * @returns {number} dataWidth\n */\n self.refreshScrollCacheX = function () {\n const s = self.getSchema();\n self.scrollCache.x = [];\n\n /** @type {number} it will be used in `reduceSchema` only */\n let frozenWidth = 0;\n\n const collapsedColumnGroups = self.getCollapsedColumnGroups();\n const isColumnCollapsed = (columnIndex) =>\n collapsedColumnGroups.findIndex(\n (group) => columnIndex >= group.from && columnIndex <= group.to,\n ) >= 0;\n\n const dataWidth =\n s.reduce(function reduceSchema(accumulator, column, columnIndex) {\n // intentional redefintion of column. This causes scrollCache to be in the correct order\n const schemaIndex = self.orders.columns[columnIndex];\n const columnWidth = self.getColumnWidth(schemaIndex);\n column = s[schemaIndex];\n if (!column.hidden && !isColumnCollapsed(columnIndex))\n accumulator += columnWidth;\n if (columnIndex < self.frozenColumn) {\n self.scrollCache.x[columnIndex] = accumulator;\n frozenWidth = accumulator;\n } else {\n self.scrollCache.x[columnIndex] = Math.max(\n frozenWidth + columnWidth,\n accumulator,\n );\n }\n return accumulator;\n }, 0) || 0;\n return dataWidth;\n };\n self.resize = function (drawAfterResize) {\n if (!self.canvas) {\n return;\n }\n var x,\n v = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'vertical-scroll-bar',\n },\n n = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'horizontal-scroll-bar',\n },\n vb = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'vertical-scroll-box',\n },\n nb = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'horizontal-scroll-box',\n },\n co = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n isCorner: true,\n isScrollBoxCorner: true,\n style: 'scroll-box-corner',\n },\n m = self.style.scrollBarBoxMargin * 2,\n b = self.style.scrollBarBorderWidth * 2,\n d = self.style.scrollBarBoxMargin * 0.5,\n sbw = self.style.scrollBarWidth + self.style.scrollBarBorderWidth * 2,\n ratio = self.getRatio(),\n bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n cellBorder = self.style.cellBorderWidth * bm,\n columnHeaderCellBorder = self.style.columnHeaderCellBorderWidth * bm,\n dataHeight = 0,\n dataWidth = 0,\n dims,\n l = (self.viewData || []).length,\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n topGroupAreaHeight = self.getColumnGroupAreaHeight(),\n leftGroupAreaWidth = self.getRowGroupAreaWidth(),\n ch = self.style.cellHeight;\n // sets actual DOM canvas element\n function checkScrollBoxVisibility() {\n var capped = self.autoSizeCapped || {};\n self.scrollBox.horizontalBarVisible =\n ((self.style.width !== 'auto' || capped.width) &&\n dataWidth > self.scrollBox.width &&\n self.style.overflowX !== 'hidden') ||\n self.style.overflowX === 'scroll';\n self.scrollBox.horizontalBoxVisible = dataWidth > self.scrollBox.width;\n self.scrollBox.verticalBarVisible =\n ((self.style.height !== 'auto' || capped.height) &&\n dataHeight > self.scrollBox.height &&\n self.style.overflowY !== 'hidden') ||\n self.style.overflowY === 'scroll';\n self.scrollBox.verticalBoxVisible = dataHeight > self.scrollBox.height;\n }\n function setScrollBoxSize() {\n self.scrollBox.width =\n self.width - rowHeaderCellWidth - leftGroupAreaWidth;\n self.scrollBox.height =\n self.height - columnHeaderCellHeight - topGroupAreaHeight;\n }\n function setCanvasSize() {\n if (self.isChildGrid) {\n return;\n }\n dims = {\n // HACK +1 ? maybe it's a magic cell border? Required to line up properly in auto height mode.\n height:\n columnHeaderCellHeight +\n topGroupAreaHeight +\n dataHeight +\n cellBorder +\n 1,\n width: dataWidth + rowHeaderCellWidth + cellBorder + leftGroupAreaWidth,\n };\n // Browsers refuse to paint canvases beyond roughly 16k px per side, so\n // an auto-sized grid with enough rows went blank past that point\n // (#254). Cap the element and let it scroll for the remainder.\n var maxCanvasSize = self.attributes.maxCanvasSize;\n self.autoSizeCapped = { width: false, height: false };\n ['width', 'height'].forEach(function (dim) {\n if (dims[dim] > maxCanvasSize) {\n dims[dim] = maxCanvasSize;\n self.autoSizeCapped[dim] = true;\n }\n });\n ['width', 'height'].forEach(function (dim) {\n //TODO: support inherit\n if (\n ['auto', undefined].indexOf(self.style[dim]) !== -1 &&\n ['auto', undefined].indexOf(self.appliedInlineStyles[dim]) !== -1\n ) {\n self.parentNodeStyle[dim] = dims[dim] + 'px';\n } else if (\n ['auto', undefined].indexOf(self.style[dim]) == -1 &&\n ['auto', undefined].indexOf(self.appliedInlineStyles[dim]) == -1\n ) {\n self.parentNodeStyle[dim] = self.style[dim];\n if (self.isComponent) {\n self.canvas.style[dim] = self.style[dim];\n }\n }\n });\n }\n self.autoLastColumnWidth = undefined;\n dataWidth = self.refreshScrollCacheX();\n self.scrollCache.y = [];\n for (x = 0; x < l; x += 1) {\n self.scrollCache.y[x] = dataHeight;\n dataHeight +=\n ((self.sizes.rows[x] || ch) + (self.sizes.trees[x] || 0)) * self.scale +\n // HACK? if an expanded tree row is frozen it is necessary to add the tree row's height a second time.\n (self.frozenRow > x ? self.sizes.trees[x] || 0 : 0);\n }\n if (l > 1) {\n self.scrollCache.y[x] = dataHeight;\n }\n if (self.attributes.showNewRow) {\n dataHeight += ch;\n }\n if (self.attributes.snapToRow) {\n dataHeight += self.style.cellHeight;\n }\n setCanvasSize();\n if (self.isChildGrid) {\n self.width = self.parentNode.offsetWidth;\n self.height = self.parentNode.offsetHeight;\n } else if (\n self.height !== self.canvas.offsetHeight ||\n self.width !== self.canvas.offsetWidth\n ) {\n self.height = self.canvas.offsetHeight;\n self.width = self.canvas.offsetWidth;\n self.canvasOffsetLeft = self.args.canvasOffsetLeft || 0;\n self.canvasOffsetTop = self.args.canvasOffsetTop || 0;\n }\n /// calculate scroll bar dimensions\n // non-controversial\n self.scrollBox.top =\n columnHeaderCellHeight + topGroupAreaHeight + columnHeaderCellBorder;\n self.scrollBox.left = rowHeaderCellWidth + leftGroupAreaWidth;\n // width and height of scroll box\n setScrollBoxSize();\n // is the data larger than the scroll box\n checkScrollBoxVisibility();\n // if the scroll box is visible, make room for it by expanding the size of the element\n // if the other dimension is set to auto\n if (self.scrollBox.horizontalBarVisible) {\n if (self.style.height === 'auto' && !self.isChildGrid) {\n self.height += sbw;\n }\n dataHeight += sbw;\n setCanvasSize();\n setScrollBoxSize();\n checkScrollBoxVisibility();\n }\n if (self.scrollBox.verticalBarVisible) {\n if (self.style.width === 'auto' && !self.isChildGrid) {\n self.width += sbw;\n }\n dataWidth += sbw;\n setCanvasSize();\n setScrollBoxSize();\n checkScrollBoxVisibility();\n }\n // set again after bar visibility checks\n setScrollBoxSize();\n if (self.attributes.fillLastColumn) {\n const lastColumnIndex = self.getLastVisibleColumnIndex();\n const availableWidth =\n self.scrollBox.width -\n (self.scrollBox.verticalBarVisible ? sbw : 0) -\n cellBorder;\n if (lastColumnIndex >= 0 && dataWidth < availableWidth) {\n self.autoLastColumnWidth = {\n index: lastColumnIndex,\n width:\n self.getColumnWidth(lastColumnIndex) + availableWidth - dataWidth,\n };\n dataWidth = self.refreshScrollCacheX();\n checkScrollBoxVisibility();\n }\n }\n self.scrollBox.scrollWidth = dataWidth - self.scrollBox.width;\n self.scrollBox.scrollHeight = dataHeight - self.scrollBox.height;\n if (self.frozenColumn > 0) {\n self.scrollBox.widthBoxRatio =\n (self.scrollBox.width - self.scrollCache.x[self.frozenColumn - 1]) /\n dataWidth;\n } else {\n self.scrollBox.widthBoxRatio = self.scrollBox.width / dataWidth;\n }\n self.scrollBox.scrollBoxWidth =\n self.scrollBox.width * self.scrollBox.widthBoxRatio -\n self.style.scrollBarWidth -\n b -\n d;\n // TODO: This heightBoxRatio number is terribly wrong.\n // They should be a result of the size of the grid/canvas?\n // it being off causes the scroll bar to \"slide\" under\n // the dragged mouse.\n // https://github.com/TonyGermaneri/canvas-datagrid/issues/97\n self.scrollBox.heightBoxRatio =\n (self.scrollBox.height -\n columnHeaderCellHeight -\n topGroupAreaHeight -\n self.scrollCache.y[self.frozenRow]) /\n dataHeight;\n self.scrollBox.scrollBoxHeight =\n self.scrollBox.height * self.scrollBox.heightBoxRatio -\n self.style.scrollBarWidth -\n b -\n d;\n self.scrollBox.scrollBoxWidth = Math.max(\n self.scrollBox.scrollBoxWidth,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.scrollBoxHeight = Math.max(\n self.scrollBox.scrollBoxHeight,\n self.style.scrollBarBoxMinSize,\n );\n // horizontal\n n.x += rowHeaderCellWidth;\n n.y += self.height - self.style.scrollBarWidth - d - topGroupAreaHeight;\n n.width =\n self.width -\n self.style.scrollBarWidth -\n rowHeaderCellWidth -\n leftGroupAreaWidth -\n d -\n m;\n n.height = self.style.scrollBarWidth + self.style.scrollBarBorderWidth + d;\n // horizontal box\n nb.y = n.y + self.style.scrollBarBoxMargin;\n nb.width = self.scrollBox.scrollBoxWidth;\n nb.height = self.style.scrollBarBoxWidth;\n // vertical\n v.x +=\n self.width -\n leftGroupAreaWidth -\n self.style.scrollBarWidth -\n self.style.scrollBarBorderWidth -\n d;\n v.y += columnHeaderCellHeight + self.scrollCache.y[self.frozenRow];\n v.width = self.style.scrollBarWidth + self.style.scrollBarBorderWidth + d;\n v.height =\n self.height -\n columnHeaderCellHeight -\n topGroupAreaHeight -\n self.style.scrollBarWidth -\n d -\n m;\n // vertical box\n vb.x = v.x + self.style.scrollBarBoxMargin;\n vb.y += self.scrollCache.y[self.frozenRow];\n vb.width = self.style.scrollBarBoxWidth;\n vb.height = self.scrollBox.scrollBoxHeight;\n // corner\n co.x = n.x + n.width + m;\n co.y = v.y + v.height + m;\n co.width = self.style.scrollBarWidth + self.style.scrollBarBorderWidth;\n co.height = self.style.scrollBarWidth + self.style.scrollBarBorderWidth;\n self.scrollBox.entities = {\n horizontalBar: n,\n horizontalBox: nb,\n verticalBar: v,\n verticalBox: vb,\n corner: co,\n };\n self.scrollBox.bar = {\n v: v,\n h: n,\n };\n self.scrollBox.box = {\n v: vb,\n h: nb,\n };\n /// calculate page and dom elements\n self.page = Math.max(\n 1,\n self.visibleRows.length - 3 - self.attributes.pageUpDownOverlap,\n );\n // set canvas drawing related items\n if (!self.isChildGrid) {\n const newWidth = self.width * ratio;\n const newHeight = self.height * ratio;\n // We need to check is settings size to canvas necessary,\n // because settings the canvas'size will cause the canvas and its state be cleared\n // even if the size is the same.\n // Notes: Please don't call `self.resize()` without a subsequent call to `self.draw()`\n if (self.canvas.width !== newWidth || self.canvas.height !== newHeight) {\n self.canvas.width = newWidth;\n self.canvas.height = newHeight;\n self.ctx.scale(ratio, ratio);\n }\n }\n // resize any open dom elements (input/textarea)\n self.resizeEditInput();\n self.scroll(true);\n if (drawAfterResize) {\n self.draw(true);\n }\n self.dispatchEvent('resize', {});\n return true;\n };\n self.scroll = function (dontDraw) {\n var s = self.getSchema(),\n l = (self.viewData || []).length,\n ch = self.style.cellHeight;\n // go too far in leaps, then get focused\n self.scrollIndexTop = Math.floor(\n l * (self.scrollBox.scrollTop / self.scrollBox.scrollHeight) - 100,\n );\n self.scrollIndexTop = Math.max(self.scrollIndexTop, 0);\n self.scrollPixelTop = self.scrollCache.y[self.scrollIndexTop];\n // sometimes the grid is rendered but the height is zero\n if (self.scrollBox.scrollHeight === 0) {\n self.scrollIndexTop = 0;\n }\n self.scrollPixelTop = 0;\n self.scrollIndexLeft = self.frozenColumn;\n self.scrollPixelLeft = 0;\n while (\n self.scrollPixelTop < self.scrollBox.scrollTop &&\n self.scrollIndexTop < self.viewData.length\n ) {\n // start on index +1 since index 0 was used in \"go too far\" section above\n self.scrollIndexTop += 1;\n self.scrollPixelTop = self.scrollCache.y[self.scrollIndexTop];\n }\n while (\n self.scrollPixelLeft < self.scrollBox.scrollLeft + 1 &&\n self.scrollIndexLeft < s.length\n ) {\n self.scrollPixelLeft = self.scrollCache.x[self.scrollIndexLeft];\n self.scrollIndexLeft += 1;\n }\n if (s.length > 0) {\n self.scrollIndexLeft = Math.max(self.scrollIndexLeft - 1, 0);\n self.scrollPixelLeft -= self.getColumnWidth(\n self.orders.columns[self.scrollIndexLeft],\n );\n }\n if ((self.viewData || []).length > 0) {\n self.scrollIndexTop = Math.max(self.scrollIndexTop - 1, 0);\n self.scrollPixelTop = Math.max(\n self.scrollPixelTop -\n (self.viewData[self.scrollIndexTop]\n ? (self.sizes.rows[self.scrollIndexTop] || ch) +\n (self.sizes.trees[self.scrollIndexTop] || 0)\n : ch) *\n self.scale,\n 0,\n );\n }\n self.ellipsisCache = {};\n if (!dontDraw) {\n self.draw(true);\n }\n //TODO: figure out why this has to be delayed for child grids\n //BUG: wheeling event on 3rd level hierarchy fails to move input box\n requestAnimationFrame(self.resizeEditInput);\n self.dispatchEvent('scroll', {\n top: self.scrollBox.scrollTop,\n left: self.scrollBox.scrollLeft,\n });\n };\n self.mousemove = function (e, overridePos) {\n if (self.contextMenu || self.input) {\n return;\n }\n\n // Cancel dragging action if user ventures outside grid\n if (self.draggingItem && e.which === 0) {\n self.stopFreezeMove(e);\n self.mouseup(e);\n return;\n }\n\n self.mouse = overridePos || self.getLayerPos(e);\n var ctrl =\n (e.ctrlKey || e.metaKey || self.attributes.persistantSelectionMode) &&\n !self.attributes.singleSelectionMode,\n i,\n s = self.getSchema(),\n dragBounds,\n sBounds,\n x = self.mouse.x,\n y = self.mouse.y,\n cell = self.getCellAt(x, y),\n delta,\n disallowVerticalAutoScroll = false,\n disallowHorizontalAutoScroll = false,\n ev = { NativeEvent: e, cell: cell, x: x, y: y },\n previousCell = self.currentCell;\n clearTimeout(self.scrollTimer);\n if (!self.isInGrid({ x: x, y: y })) {\n self.hasFocus = false;\n }\n if (self.dispatchEvent('mousemove', ev)) {\n return;\n }\n if (cell && self.currentCell) {\n self.rowBoundaryCrossed = self.currentCell.rowIndex !== cell.rowIndex;\n self.columnBoundaryCrossed =\n self.currentCell.columnIndex !== cell.columnIndex;\n self.cellBoundaryCrossed =\n self.rowBoundaryCrossed || self.columnBoundaryCrossed;\n ['row', 'column', 'cell'].forEach(function (prefix) {\n if (self[prefix + 'BoundaryCrossed']) {\n ev.cell = previousCell;\n self.dispatchEvent(prefix + 'mouseout', ev);\n ev.cell = cell;\n self.dispatchEvent(prefix + 'mouseover', ev);\n }\n });\n }\n self.currentCell = cell;\n\n if (\n !self.draggingItem && // It is not in dragging mode (avoid changing hovers frequent)\n cell &&\n (cell.context === 'cell' || cell.context === self.cursorGrab)\n ) {\n const indicator = self.getUnhideIndicator(self.mouse.x, self.mouse.y);\n if (indicator) {\n self.cursor = 'pointer';\n self.hovers = { unhideIndicator: indicator };\n self.draw();\n return;\n }\n }\n\n self.hovers = {};\n if (!self.draggingItem && cell) {\n self.dragItem = cell;\n self.dragMode = cell.dragContext;\n self.cursor = cell.context;\n if (cell.context === 'cell') {\n self.cursor = 'default';\n self.hovers = {\n rowIndex: cell.rowIndex,\n columnIndex: cell.columnIndex,\n onFilterButton: false,\n onCellTreeIcon: false,\n };\n if (\n cell.isFilterable &&\n x >\n cell.x +\n cell.width +\n self.canvasOffsetLeft -\n self.style.filterButtonWidth &&\n x < cell.x + cell.width + self.canvasOffsetLeft &&\n y >\n cell.y +\n cell.height +\n self.canvasOffsetTop -\n self.style.filterButtonHeight &&\n y < cell.y + cell.height + self.canvasOffsetTop\n ) {\n self.hovers.onFilterButton = true;\n self.draw();\n }\n if (cell.isRowTree || cell.isColumnTree) {\n const pc = cell.isRowTree\n ? self.cellTree.rows[cell.rowIndex].parentCount\n : 0;\n const rc = self.style.cellTreeIconWidth * self.scale,\n rx =\n cell.x +\n cell.paddingLeft +\n self.canvasOffsetLeft +\n self.style.cellTreeIconMarginLeft +\n pc * (rc + cell.paddingLeft),\n ry =\n cell.y +\n self.canvasOffsetTop +\n self.style.cellTreeIconMarginTop * self.scale;\n if (x >= rx && x <= rx + rc && y >= ry && y < ry + rc) {\n self.hovers.onCellTreeIcon = true;\n self.draw();\n }\n }\n }\n if (self.selecting || self.reorderObject) {\n delta = {\n x: Math.abs(self.dragStart.x - x),\n y: Math.abs(self.dragStart.y - y),\n };\n if (\n self.dragStartObject.columnIndex !== -1 &&\n e.shiftKey &&\n !self.attributes.singleSelectionMode\n ) {\n self.dragStartObject = {\n rowIndex: self.activeCell.rowIndex,\n columnIndex: self.activeCell.columnIndex,\n };\n }\n dragBounds = {\n top: Math.min(self.dragStartObject.rowIndex, cell.rowIndex),\n left: Math.min(self.dragStartObject.columnIndex, cell.columnIndex),\n bottom: Math.max(self.dragStartObject.rowIndex, cell.rowIndex),\n right: Math.max(self.dragStartObject.columnIndex, cell.columnIndex),\n };\n if (self.dragStartObject.columnIndex === -1) {\n sBounds = self.getSelectionBounds();\n dragBounds.left = -1;\n dragBounds.right = s.length - 1;\n dragBounds.top = Math.min(sBounds.top, cell.rowIndex);\n dragBounds.bottom = Math.max(sBounds.bottom, cell.rowIndex);\n if (dragBounds.top < 0) dragBounds.top = 0;\n }\n\n if (self.dragStartObject.rowIndex === -1) {\n sBounds = self.getSelectionBounds();\n dragBounds.left =\n cell.columnIndex === undefined\n ? sBounds.left\n : Math.min(sBounds.left, cell.columnIndex);\n dragBounds.right =\n cell.columnIndex === undefined\n ? sBounds.right\n : Math.max(sBounds.right, cell.columnIndex);\n dragBounds.top = -1;\n dragBounds.bottom = self.viewData.length - 1;\n if (dragBounds.left < 0) dragBounds.left = 0;\n if (dragBounds.left != dragBounds.right)\n self.isMultiColumnsSelected = true;\n else self.isMultiRowsSelected = false;\n }\n\n if (\n self.dragStartObject.rowIndex !== cell.rowIndex ||\n self.dragStartObject.columnIndex !== cell.columnIndex\n ) {\n self.ignoreNextClick = true;\n }\n if (\n self.cellBoundaryCrossed ||\n (delta.x === 0 && delta.y === 0) ||\n self.attributes.selectionMode === 'row'\n ) {\n if (\n cell.rowIndex !== undefined &&\n (self.attributes.selectionMode === 'row' ||\n self.dragStartObject.columnIndex === -1) &&\n self.rowBoundaryCrossed\n ) {\n if (self.dragStartObject.rowIndex < cell.rowIndex) {\n dragBounds.top = self.dragStartObject.rowIndex;\n dragBounds.bottom = cell.rowIndex;\n } else {\n dragBounds.top = cell.rowIndex;\n dragBounds.bottom = self.dragStartObject.rowIndex;\n }\n } else if (\n cell.rowIndex !== undefined &&\n (self.attributes.selectionMode === 'column' ||\n self.dragStartObject.rowIndex === -1) &&\n self.columnBoundaryCrossed\n ) {\n if (self.dragStartObject.columnIndex < cell.columnIndex) {\n dragBounds.left = self.dragStartObject.columnIndex;\n dragBounds.right = cell.columnIndex;\n } else {\n dragBounds.left = cell.columnIndex;\n dragBounds.right = self.dragStartObject.columnIndex;\n }\n } else if (self.attributes.selectionMode !== 'row') {\n if (cell.hovered && self.hovers.onFilterButton) {\n if (cell.openedFilter) {\n cell.openedFilter = false;\n self.selectedFilterButton = {\n columnIndex: -1,\n rowIndex: -1,\n };\n } else {\n self.selectedFilterButton.rowIndex = cell.rowIndex;\n self.selectedFilterButton.columnIndex = cell.columnIndex;\n self.contextmenuEvent(e, {\n x: cell.x + cell.width - self.style.filterButtonWidth,\n y: cell.y + cell.height,\n rect: { left: 0, top: 0 },\n });\n }\n self.draw();\n return;\n } else if (\n cell.hovered &&\n self.hovers.onCellTreeIcon &&\n e.type == 'mousedown'\n ) {\n self.toggleCollapseTree(cell.rowIndex, cell.columnIndex);\n return;\n } else {\n self.selectedFilterButton = {\n columnIndex: -1,\n rowIndex: -1,\n };\n if (self.hovers.onFilterButton) return;\n if (self.hovers.onCellTreeIcon) return;\n if (!self.dragAddToSelection && cell.rowIndex !== undefined) {\n if (self.isCellSelected(cell)) self.unselectCell(cell);\n } else {\n if (!self.isCellSelected(cell)) self.selectCell(cell);\n }\n }\n }\n }\n if (self.attributes.singleSelectionMode) {\n // only one row (row mode) or one cell may be selected at a time, so\n // a drag follows the pointer instead of growing a range (#472)\n if (\n self.dragStartObject.rowIndex !== -1 &&\n cell.rowIndex !== undefined &&\n cell.rowIndex > -1\n ) {\n dragBounds.top = cell.rowIndex;\n dragBounds.bottom = cell.rowIndex;\n }\n if (\n self.attributes.selectionMode !== 'row' &&\n self.dragStartObject.columnIndex !== -1 &&\n cell.columnIndex !== undefined &&\n cell.columnIndex > -1\n ) {\n dragBounds.left = cell.columnIndex;\n dragBounds.right = cell.columnIndex;\n }\n }\n if (\n (!self.selectionBounds ||\n dragBounds.top !== self.selectionBounds.top ||\n dragBounds.left !== self.selectionBounds.left ||\n dragBounds.bottom !== self.selectionBounds.bottom ||\n dragBounds.right !== self.selectionBounds.right) &&\n !ctrl\n ) {\n if (!(cell.hovered && self.hovers.onFilterButton))\n self.clearSelections();\n if (dragBounds.top === -1) {\n dragBounds.top = 0;\n }\n sBounds = dragBounds;\n if (self.attributes.selectionMode === 'row') {\n for (i = sBounds.top; i <= sBounds.bottom; i += 1) {\n self.selectRow(i, true, null, true);\n }\n } else {\n self.selectArea(sBounds, true);\n self.activeCell.rowIndex = sBounds.top;\n self.activeCell.columnIndex = sBounds.left;\n if (sBounds.left == -1 && sBounds.top !== sBounds.bottom) {\n self.activeCell.columnIndex = 0;\n self.isMultiRowsSelected = true;\n self.isMultiColumnsSelected = false;\n }\n }\n }\n } else if (self.movingSelectionHandle) {\n delta = {\n x: Math.abs(self.dragStart.x - x),\n y: Math.abs(self.dragStart.y - y),\n };\n\n // Disallow auto-scroll to the direction that overlay is not\n // moving towards.\n if (self.fillOverlay.direction === 'y') {\n disallowHorizontalAutoScroll = true;\n } else if (self.fillOverlay.direction === 'x') {\n disallowVerticalAutoScroll = true;\n }\n }\n\n if (delta) {\n if (\n self.attributes.autoScrollOnMousemove ||\n disallowVerticalAutoScroll ||\n disallowHorizontalAutoScroll\n ) {\n var movedVertically =\n !disallowVerticalAutoScroll &&\n delta.y > self.attributes.autoScrollMargin;\n var movedHorizontally =\n !disallowHorizontalAutoScroll &&\n delta.x > self.attributes.autoScrollMargin;\n\n if (movedVertically && !movedHorizontally)\n self.autoScrollZone(e, -1, y, ctrl);\n else if (movedHorizontally && !movedVertically)\n self.autoScrollZone(e, x, -1, ctrl);\n else if (movedHorizontally && movedVertically)\n self.autoScrollZone(e, x, y, ctrl);\n } else {\n self.autoScrollZone(e, x, y, ctrl);\n }\n }\n }\n const columnGroup = self.getColumnGroupAt(self.mouse.x, self.mouse.y);\n if (columnGroup) self.cursor = 'pointer';\n\n const rowGroup = self.getRowGroupAt(self.mouse.x, self.mouse.y);\n if (rowGroup) self.cursor = 'pointer';\n\n self.cellBoundaryCrossed = false;\n self.rowBoundaryCrossed = false;\n self.columnBoundaryCrossed = false;\n self.draw(true);\n };\n self.click = function (e, overridePos) {\n var i,\n startingBounds = JSON.stringify(self.getSelectionBounds()),\n ctrl =\n (e.ctrlKey || e.metaKey || self.attributes.persistantSelectionMode) &&\n !self.attributes.singleSelectionMode,\n pos = overridePos || self.getLayerPos(e);\n self.currentCell = self.getCellAt(pos.x, pos.y);\n if (self.currentCell.grid !== undefined) {\n return;\n }\n function checkSelectionChange() {\n var ev,\n sb = self.getSelectionBounds();\n\n if (startingBounds === JSON.stringify(sb)) {\n return;\n }\n self.dispatchEvent('selectionchanged', self.getContextOfSelectionEvent());\n }\n if (self.input) {\n self.endEdit();\n }\n if (self.ignoreNextClick) {\n self.ignoreNextClick = false;\n return;\n }\n i = self.currentCell;\n if (\n self.dispatchEvent('click', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n\n const unhideIndicator = self.getUnhideIndicator(pos.x, pos.y);\n if (unhideIndicator) {\n const { dir, orderIndex0, orderIndex1 } = unhideIndicator;\n if (dir === 'l' || dir === 'r')\n self.unhideColumns(orderIndex0, orderIndex1);\n else self.unhideRows(orderIndex0, orderIndex1);\n return;\n }\n\n let group = self.getColumnGroupAt(pos.x, pos.y);\n if (!group) group = self.getRowGroupAt(pos.x, pos.y);\n if (group) {\n if (self.toggleGroup(group)) {\n self.setStorageData();\n self.refresh();\n return;\n }\n }\n\n if (!self.hasFocus) {\n return;\n }\n\n const leftOffset = self.getRowGroupAreaWidth();\n const topOffset = self.getColumnGroupAreaHeight();\n const xInGrid = pos.x - leftOffset;\n const yInGrid = pos.y - topOffset;\n if (\n ['rowHeaderCell', 'columnHeaderCell'].indexOf(self.currentCell.style) ===\n -1 &&\n !ctrl\n ) {\n if (!self.hovers.onFilterButton) {\n self.setActiveCell(i.columnIndex, i.rowIndex);\n }\n }\n if (\n self.currentCell.style === 'columnHeaderCell' &&\n self.attributes.columnHeaderClickBehavior === 'sort' &&\n // a header is also a reorder grab zone when column reordering is on;\n // a plain click (no drag, which sets ignoreNextClick) still sorts (#514)\n (self.currentCell.context === 'cell' ||\n self.currentCell.dragContext === 'column-reorder')\n ) {\n if (self.orderBy === i.header.name) {\n self.orderDirection = self.orderDirection === 'asc' ? 'desc' : 'asc';\n } else {\n self.orderDirection = 'asc';\n }\n self.order(i.header.name, self.orderDirection);\n checkSelectionChange();\n return;\n }\n if (self.currentCell.context === 'cell') {\n if (self.currentCell.style === 'cornerCell') {\n self.selectAll();\n self.draw();\n checkSelectionChange();\n return;\n }\n if (\n self.attributes.selectionMode === 'row' ||\n self.currentCell.style === 'rowHeaderCell'\n ) {\n if (\n self.currentCell.style === 'rowHeaderCell' &&\n self.attributes.tree &&\n xInGrid > 0 &&\n xInGrid - self.currentCell.x <\n self.style.treeArrowWidth +\n self.style.treeArrowMarginLeft +\n self.style.treeArrowMarginRight +\n self.style.treeArrowClickRadius &&\n yInGrid - self.currentCell.y <\n self.style.treeArrowHeight +\n self.style.treeArrowMarginTop +\n self.style.treeArrowClickRadius &&\n yInGrid > 0\n ) {\n self.toggleTree(i.rowIndex);\n return;\n }\n }\n if (e.shiftKey && !ctrl && !self.attributes.singleSelectionMode) {\n self.selectionBounds = self.getSelectionBounds();\n self.selectArea(undefined, false);\n }\n }\n checkSelectionChange();\n self.draw(true);\n };\n self.dragResizeColumn = function (e) {\n const resizingColumn = self.dragMode === 'ew-resize';\n var pos, x, y;\n pos = self.getLayerPos(e);\n x = self.resizingStartingWidth + pos.x - self.dragStart.x;\n y = self.resizingStartingHeight + pos.y - self.dragStart.y;\n if (x < self.style.minColumnWidth) {\n x = self.style.minColumnWidth;\n }\n if (y < self.style.minRowHeight) {\n y = self.style.minRowHeight;\n }\n const resizeEventDetails = {\n x: x,\n y: y,\n width: x,\n height: y,\n columnIndex: resizingColumn ? self.draggingItem.columnIndex : undefined,\n rowIndex: resizingColumn ? undefined : self.draggingItem.rowIndex,\n draggingItem: self.draggingItem,\n NativeEvent: e,\n };\n if (\n resizingColumn\n ? self.dispatchEvent('resizecolumn', resizeEventDetails)\n : self.dispatchResizeRow(resizeEventDetails)\n ) {\n return false;\n }\n if (self.attributes.resizeAfterDragged) {\n self.pendingDragResize = {\n item: self.draggingItem,\n width: x,\n height: y,\n x: e.clientX,\n y: e.clientY,\n };\n } else {\n self.dragResizeApply(self.draggingItem, x, y);\n }\n };\n self.dragResizeApply = function (draggingItem, width, height) {\n if (\n self.scrollBox.scrollLeft >\n self.scrollBox.scrollWidth - self.attributes.resizeScrollZone &&\n self.dragMode === 'ew-resize'\n ) {\n self.resize(true);\n }\n if (self.dragMode === 'ew-resize') {\n self.sizes.columns[\n draggingItem.header.style === 'rowHeaderCell'\n ? 'cornerCell'\n : draggingItem.sortColumnIndex\n ] = width;\n if (\n ['rowHeaderCell', 'cornerCell'].indexOf(draggingItem.header.style) !==\n -1\n ) {\n self.resize(true);\n }\n self.resizeChildGrids();\n return;\n } else if (self.dragMode === 'ns-resize') {\n if (draggingItem.rowOpen) {\n self.sizes.trees[draggingItem.rowIndex] = height;\n } else if (self.attributes.globalRowResize) {\n self.style.cellHeight = height;\n } else {\n self.sizes.rows[draggingItem.rowIndex] = height;\n }\n self.dispatchResizeRow({\n height: height,\n rowIndex: draggingItem.rowIndex,\n draggingItem: draggingItem,\n });\n self.resizeChildGrids();\n return;\n }\n self.ellipsisCache = {};\n };\n self.stopDragResize = function (event) {\n const pos = self.getLayerPos(event);\n\n if (self.attributes.resizeAfterDragged) {\n self.dragResizeApply(\n self.pendingDragResize.item,\n self.pendingDragResize.width,\n self.pendingDragResize.height,\n );\n self.pendingDragResize = undefined;\n }\n\n if (self.dragMode === 'ew-resize') {\n const hasMoved = !!(pos.x - self.dragStart.x);\n // Check that dragItem is selected or part of selection.\n const dragItemIsSelected = self.isColumnSelected(\n self.dragItem.columnIndex,\n );\n\n if (hasMoved && dragItemIsSelected) {\n const width = Math.max(\n self.resizingStartingWidth + pos.x - self.dragStart.x,\n self.style.minColumnWidth,\n );\n // If the column is selected, resize it to width plus any other selected columns.\n self.fitSelectedColumns(width);\n }\n } else if (self.dragMode === 'ns-resize') {\n // Do the above for rows.\n const hasMoved = !!(pos.y - self.dragStart.y);\n const dragItemIsSelected = self.isRowSelected(self.dragItem.rowIndex);\n\n if (hasMoved && dragItemIsSelected) {\n const height = Math.max(\n self.resizingStartingHeight + pos.y - self.dragStart.y,\n self.style.minRowHeight,\n );\n self.fitSelectedRows(height);\n }\n }\n\n self.resize();\n window.removeEventListener('mousemove', self.dragResizeColumn, false);\n window.removeEventListener('mouseup', self.stopDragResize, false);\n self.setStorageData();\n self.draw(true);\n self.ignoreNextClick = true;\n };\n self.scrollGrid = function (e) {\n var pos = self.getLayerPos(e);\n if (\n self.attributes.scrollPointerLock &&\n self.pointerLockPosition &&\n ['horizontal-scroll-box', 'vertical-scroll-box'].indexOf(\n self.scrollStartMode,\n ) !== -1\n ) {\n self.pointerLockPosition.x += e.movementX;\n self.pointerLockPosition.y += e.movementY;\n self.pointerLockPosition.x = Math.min(\n self.width - self.style.scrollBarWidth,\n Math.max(0, self.pointerLockPosition.x),\n );\n self.pointerLockPosition.y = Math.min(\n self.height - self.style.scrollBarWidth,\n Math.max(0, self.pointerLockPosition.y),\n );\n pos = self.pointerLockPosition;\n }\n self.scrollMode = self.getCellAt(pos.x, pos.y).context;\n if (\n self.scrollMode === 'horizontal-scroll-box' &&\n self.scrollStartMode !== 'horizontal-scroll-box'\n ) {\n self.scrollStartMode = 'horizontal-scroll-box';\n self.dragStart = pos;\n self.scrollStart.left = self.scrollBox.scrollLeft;\n clearTimeout(self.scrollTimer);\n return;\n }\n if (\n self.scrollMode === 'vertical-scroll-box' &&\n self.scrollStartMode !== 'vertical-scroll-box'\n ) {\n self.scrollStartMode = 'vertical-scroll-box';\n self.dragStart = pos;\n self.scrollStart.top = self.scrollBox.scrollTop;\n clearTimeout(self.scrollTimer);\n return;\n }\n if (\n self.scrollStartMode === 'vertical-scroll-box' &&\n self.scrollMode !== 'vertical-scroll-box'\n ) {\n self.scrollMode = 'vertical-scroll-box';\n }\n if (\n self.scrollStartMode === 'horizontal-scroll-box' &&\n self.scrollMode !== 'horizontal-scroll-box'\n ) {\n self.scrollMode = 'horizontal-scroll-box';\n }\n clearTimeout(self.scrollTimer);\n if (self.scrollModes.indexOf(self.scrollMode) === -1) {\n return;\n }\n if (self.scrollMode === 'vertical-scroll-box') {\n self.scrollBox.scrollTop =\n self.scrollStart.top +\n (pos.y - self.dragStart.y) / self.scrollBox.heightBoxRatio;\n } else if (self.scrollMode === 'vertical-scroll-top') {\n self.scrollBox.scrollTop -= self.page * self.style.cellHeight;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n } else if (self.scrollMode === 'vertical-scroll-bottom') {\n self.scrollBox.scrollTop += self.page * self.style.cellHeight;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n if (self.scrollMode === 'horizontal-scroll-box') {\n self.scrollBox.scrollLeft =\n self.scrollStart.left +\n (pos.x - self.dragStart.x) / self.scrollBox.widthBoxRatio;\n } else if (self.scrollMode === 'horizontal-scroll-right') {\n self.scrollBox.scrollLeft += self.attributes.selectionScrollIncrement;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n } else if (self.scrollMode === 'horizontal-scroll-left') {\n self.scrollBox.scrollLeft -= self.attributes.selectionScrollIncrement;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n };\n self.stopScrollGrid = function () {\n clearTimeout(self.scrollTimer);\n if (document.exitPointerLock) {\n document.exitPointerLock();\n }\n window.removeEventListener('mousemove', self.scrollGrid, false);\n };\n self.dragReorder = function (e) {\n var pos,\n x,\n y,\n columReorder = self.dragMode === 'column-reorder',\n rowReorder = self.dragMode === 'row-reorder';\n pos = self.getLayerPos(e);\n x = pos.x - self.dragStart.x;\n y = pos.y - self.dragStart.y;\n if (!self.attributes.allowColumnReordering && columReorder) {\n return;\n }\n if (!self.attributes.allowRowReordering && rowReorder) {\n return;\n }\n if ((e.ctrlKey || e.metaKey || e.shiftKey) && self.reorderObject) {\n if (self.dragMode === 'column-reorder' && !self.isMultiColumnsSelected) {\n self.selectColumn(self.draggingItem.header.index, false, false);\n }\n }\n if (\n self.dispatchEvent('reordering', {\n NativeEvent: e,\n source: self.dragStartObject,\n target: self.currentCell,\n dragMode: self.dragMode,\n })\n ) {\n return;\n }\n if (\n Math.abs(x) > self.attributes.reorderDeadZone ||\n Math.abs(y) > self.attributes.reorderDeadZone\n ) {\n self.reorderObject = self.draggingItem;\n if (self.isMultiRowsSelected)\n self.reorderObject = self.getVisibleCellByIndex(\n -1,\n self.activeCell.rowIndex,\n );\n if (self.isMultiColumnsSelected)\n self.reorderObject = self.getVisibleCellByIndex(\n self.activeCell.columnIndex,\n -1,\n );\n if (!self.reorderObject) return;\n self.reorderTarget = self.currentCell;\n self.reorderObject.dragOffset = {\n x: x,\n y: y,\n };\n self.autoScrollZone(\n e,\n columReorder ? pos.x : -1,\n rowReorder ? pos.y : -1,\n false,\n );\n }\n };\n self.stopDragReorder = function (e) {\n let originalIndex;\n let targetIndex;\n const orderLists = {\n 'row-reorder': self.orders.rows,\n 'column-reorder': self.orders.columns,\n };\n const indexName = {\n 'row-reorder': 'rowIndex',\n 'column-reorder': 'sortColumnIndex',\n }[self.dragMode];\n window.removeEventListener('mousemove', self.dragReorder, false);\n window.removeEventListener('mouseup', self.stopDragReorder, false);\n if (\n self.reorderObject &&\n self.reorderTarget &&\n ((self.dragMode === 'column-reorder' &&\n self.reorderTarget.sortColumnIndex > -1 &&\n self.reorderTarget.sortColumnIndex < self.getSchema().length) ||\n (self.dragMode === 'row-reorder' &&\n self.reorderTarget.rowIndex > -1 &&\n self.reorderTarget.rowIndex < self.viewData.length)) &&\n self.reorderObject[indexName] !== self.reorderTarget[indexName] &&\n !self.dispatchEvent('reorder', {\n NativeEvent: e,\n source: self.reorderObject,\n target: self.reorderTarget,\n dragMode: self.dragMode,\n })\n ) {\n self.ignoreNextClick = true;\n originalIndex = orderLists[self.dragMode].indexOf(\n self.reorderObject[indexName],\n );\n targetIndex = orderLists[self.dragMode].indexOf(\n self.reorderTarget[indexName],\n );\n if (self.dragMode === 'column-reorder') {\n /** Select column view indexes in the first row */\n const selectedIndexes = self.getRowSelectionStates(0);\n const sortColumnIndices = [];\n const selectedColumnIndices = [];\n if (selectedIndexes) {\n originalIndex = selectedIndexes[0];\n selectedIndexes.forEach(function (value) {\n sortColumnIndices.push(self.orders.columns[value]);\n });\n }\n const deleteCount = sortColumnIndices.length;\n if (\n targetIndex < originalIndex ||\n (targetIndex > originalIndex &&\n Math.abs(targetIndex - originalIndex) >= deleteCount)\n ) {\n orderLists[self.dragMode].splice(originalIndex, deleteCount);\n if (targetIndex > originalIndex)\n targetIndex = targetIndex - (deleteCount - 1);\n\n for (let i = 0; i < sortColumnIndices.length; i++) {\n if (i === 0) self.activeCell.columnIndex = targetIndex;\n selectedColumnIndices.push(targetIndex + i);\n orderLists[self.dragMode].splice(\n targetIndex + i,\n 0,\n sortColumnIndices[i],\n );\n }\n\n self.orders.columns = orderLists[self.dragMode];\n self.selectColumnViewIndexes(selectedColumnIndices);\n }\n } else {\n /** The original name of this variable is `odata` */\n const rowIndexes = self.getRowViewIndexesFromSelection();\n const originalData = rowIndexes.map(\n (rowIndex) => self.viewData[rowIndex],\n );\n if (\n targetIndex < originalIndex ||\n (targetIndex > originalIndex &&\n Math.abs(targetIndex - originalIndex) >= originalData.length)\n ) {\n self.viewData.splice(originalIndex, originalData.length);\n if (targetIndex > originalIndex)\n targetIndex = targetIndex - (originalData.length - 1);\n self.activeCell.rowIndex = targetIndex;\n for (let i = 0; i < originalData.length; i++)\n self.viewData.splice(targetIndex + i, 0, originalData[i]);\n self.moveSelection(0, targetIndex);\n }\n }\n self.resize();\n self.setStorageData();\n }\n self.reorderObject = undefined;\n self.reorderTarget = undefined;\n self.draw(true);\n };\n self.dragMove = function (e) {\n if (\n self.dispatchEvent('moving', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n var pos = self.getLayerPos(e);\n self.moveOffset = {\n x: self.currentCell.columnIndex - self.dragStartObject.columnIndex,\n y: self.currentCell.rowIndex - self.dragStartObject.rowIndex,\n };\n if (\n Math.abs(pos.x) > self.attributes.reorderDeadZone ||\n Math.abs(pos.y) > self.attributes.reorderDeadZone\n ) {\n setTimeout(function () {\n self.autoScrollZone(e, pos.x, pos.y, false);\n }, 1);\n }\n };\n self.stopDragMove = function (e) {\n window.removeEventListener('mousemove', self.dragMove, false);\n window.removeEventListener('mouseup', self.stopDragMove, false);\n var b = self.getSelectionBounds();\n if (\n self.dispatchEvent('endmove', { NativeEvent: e, cell: self.currentCell })\n ) {\n self.movingSelection = undefined;\n self.moveOffset = undefined;\n self.draw(true);\n return;\n }\n if (self.moveOffset) {\n self.moveTo(\n self.movingSelection,\n b.left + self.moveOffset.x,\n b.top + self.moveOffset.y,\n );\n self.moveSelection(self.moveOffset.x, self.moveOffset.y);\n }\n self.movingSelection = undefined;\n self.moveOffset = undefined;\n self.draw(true);\n };\n self.freezeMove = function (e) {\n if (\n self.dispatchEvent('freezemoving', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n var pos = self.getLayerPos(e);\n\n self.ignoreNextClick = true;\n self.freezeMarkerPosition = pos;\n pos.x -= self.getRowGroupAreaWidth();\n pos.y -= self.getColumnGroupAreaHeight();\n if (\n Math.abs(pos.x) > self.attributes.reorderDeadZone ||\n Math.abs(pos.y) > self.attributes.reorderDeadZone\n ) {\n setTimeout(function () {\n self.autoScrollZone(e, pos.x, pos.y, false);\n }, 1);\n }\n };\n self.stopFreezeMove = function (e) {\n let pos = self.getLayerPos(e),\n bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n columnHeaderCellBorder = self.style.columnHeaderCellBorderWidth * bm,\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth();\n pos.x -= self.getRowGroupAreaWidth();\n pos.y -= self.getColumnGroupAreaHeight();\n\n if (\n self.currentCell &&\n self.currentCell.rowIndex !== undefined &&\n self.dragMode === 'frozen-row-marker'\n ) {\n self.scrollBox.scrollTop = 0;\n self.frozenRow = self.currentCell.rowIndex + 1;\n self.scrollBox.bar.v.y =\n columnHeaderCellHeight +\n columnHeaderCellBorder +\n self.scrollCache.y[self.frozenRow];\n self.scrollBox.box.v.y =\n columnHeaderCellHeight +\n columnHeaderCellBorder +\n self.scrollCache.y[self.frozenRow];\n var dataHeight = self.scrollCache.y[self.scrollCache.y.length - 1];\n self.scrollBox.heightBoxRatio =\n (self.scrollBox.height -\n columnHeaderCellHeight -\n self.scrollCache.y[self.frozenRow]) /\n dataHeight;\n self.scrollBox.scrollBoxHeight =\n self.scrollBox.height * self.scrollBox.heightBoxRatio -\n self.style.scrollBarWidth;\n self.scrollBox.scrollBoxHeight = Math.max(\n self.scrollBox.scrollBoxHeight,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.box.v.height = self.scrollBox.scrollBoxHeight;\n }\n if (\n self.currentCell &&\n self.currentCell.columnIndex !== undefined &&\n self.dragMode === 'frozen-column-marker'\n ) {\n const dataWidth = self.refreshScrollCacheX();\n self.scrollBox.scrollLeft = 0;\n let x =\n self.currentCell.x -\n self.style.frozenMarkerWidth -\n self.style.frozenMarkerBorderWidth;\n if (pos.x > x + self.currentCell.width / 2)\n self.frozenColumn = self.currentCell.columnIndex + 1;\n else if (self.currentCell.columnIndex >= 0)\n self.frozenColumn = self.currentCell.columnIndex;\n self.scrollBox.bar.h.x =\n rowHeaderCellWidth + self.scrollCache.x[self.frozenColumn];\n self.scrollBox.widthBoxRatio =\n (self.scrollBox.width - self.scrollCache.x[self.frozenColumn]) /\n dataWidth;\n self.scrollBox.scrollBoxWidth =\n self.scrollBox.width * self.scrollBox.widthBoxRatio -\n self.style.scrollBarWidth;\n self.scrollBox.scrollBoxWidth = Math.max(\n self.scrollBox.scrollBoxWidth,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.box.h.width = self.scrollBox.scrollBoxWidth;\n }\n if (\n Math.abs(pos.x) > self.attributes.reorderDeadZone ||\n Math.abs(pos.y) > self.attributes.reorderDeadZone\n ) {\n setTimeout(function () {\n self.autoScrollZone(e, pos.x, pos.y, false);\n }, 1);\n }\n\n window.removeEventListener('mousemove', self.freezeMove, false);\n window.removeEventListener('mouseup', self.stopFreezeMove, false);\n self.freezeMarkerPosition = undefined;\n if (\n self.dispatchEvent('endfreezemove', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n self.frozenRow = self.startFreezeMove.x;\n self.frozenColumn = self.startFreezeMove.y;\n self.draw(true);\n return;\n }\n self.draw(true);\n self.resize();\n };\n self.mousedown = function (e, overridePos) {\n self.lastMouseDownTarget = e.target;\n if (\n self.dispatchEvent('mousedown', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n if (e.button === 2 || self.input) {\n return;\n }\n var ctrl = (e.ctrlKey || e.metaKey) && !self.attributes.singleSelectionMode,\n shift = e.shiftKey && !self.attributes.singleSelectionMode,\n move = /-move/.test(self.dragMode),\n freeze = /frozen-row-marker|frozen-column-marker/.test(self.dragMode),\n resize = /-resize/.test(self.dragMode),\n selectionHandleMove = /selection-handle-br/.test(self.dragMode);\n const onUnhideIndicator = self.hovers && self.hovers.unhideIndicator;\n self.dragStart = overridePos || self.getLayerPos(e);\n self.scrollStart = {\n left: self.scrollBox.scrollLeft,\n top: self.scrollBox.scrollTop,\n };\n self.dragStartObject = self.getCellAt(self.dragStart.x, self.dragStart.y);\n self.dragAddToSelection = !self.dragStartObject.selected;\n if (\n !ctrl &&\n !shift &&\n !/(vertical|horizontal)-scroll-(bar|box)/.test(\n self.dragStartObject.context,\n ) &&\n self.currentCell &&\n !self.currentCell.isColumnHeader &&\n !move &&\n !freeze &&\n !resize &&\n !selectionHandleMove\n ) {\n if (\n !(self.dragMode == 'row-reorder' && self.isMultiRowsSelected) &&\n !(self.currentCell.hovered && self.hovers.onFilterButton)\n ) {\n self.clearSelections();\n }\n }\n if (self.dragStartObject.isGrid) {\n return;\n }\n if (\n self.scrollModes.indexOf(self.dragStartObject.context) !== -1 &&\n !onUnhideIndicator\n ) {\n self.scrollMode = self.dragStartObject.context;\n self.scrollStartMode = self.dragStartObject.context;\n self.scrollGrid(e);\n if (\n self.attributes.scrollPointerLock &&\n ['horizontal-scroll-box', 'vertical-scroll-box'].indexOf(\n self.scrollStartMode,\n ) !== -1\n ) {\n self.pointerLockPosition = {\n x: self.dragStart.x,\n y: self.dragStart.y,\n };\n self.canvas.requestPointerLock();\n }\n window.addEventListener('mousemove', self.scrollGrid, false);\n window.addEventListener('mouseup', self.stopScrollGrid, false);\n self.ignoreNextClick = true;\n return;\n }\n if (self.dragMode === 'cell') {\n self.selecting = true;\n if (\n (self.attributes.selectionMode === 'row' ||\n self.dragStartObject.columnIndex === -1) &&\n self.dragStartObject.rowIndex > -1\n ) {\n self.selectRow(self.dragStartObject.rowIndex, ctrl, null);\n } else if (\n (self.attributes.selectionMode === 'column' ||\n self.dragStartObject.rowIndex === -1) &&\n self.dragStartObject.columnIndex > -1\n ) {\n if (self.attributes.allowColumnSelection) {\n self.selectColumn(self.currentCell.header.index, ctrl, shift);\n }\n return;\n }\n if (self.attributes.selectionMode !== 'row') {\n self.mousemove(e);\n }\n return;\n }\n if (selectionHandleMove && self.attributes.editable) {\n self.movingSelectionHandle = true;\n self.fillOverlay = {\n handle: {\n x: self.dragStartObject.x + self.dragStartObject.width / 2,\n y: self.dragStartObject.y + self.dragStartObject.height / 2,\n },\n snapTo: { x: -1, y: -1 },\n selection: self.getSelectionBounds(),\n };\n if (self.dispatchEvent('beginselectionhandlemove', { NativeEvent: e })) {\n return;\n }\n window.addEventListener('mousemove', self.selectionHandleMove, false);\n window.addEventListener('mouseup', self.stopSelectionHandleMove, false);\n return self.selectionHandleMove(e);\n }\n if (move) {\n self.draggingItem = self.dragItem;\n self.movingSelection = self.cloneSelections();\n self.dragging = self.dragStartObject;\n if (\n self.dispatchEvent('beginmove', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n window.addEventListener('mousemove', self.dragMove, false);\n window.addEventListener('mouseup', self.stopDragMove, false);\n return self.mousemove(e);\n }\n if (freeze) {\n self.draggingItem = self.dragItem;\n self.startFreezeMove = {\n x: self.frozenRow,\n y: self.frozenColumn,\n };\n if (self.dispatchEvent('beginfreezemove', { NativeEvent: e })) {\n return;\n }\n\n self.freezeMarkerPosition = self.getLayerPos(e);\n self.freezeMarkerPosition.isGrab = true;\n\n window.addEventListener('mousemove', self.freezeMove, false);\n window.addEventListener('mouseup', self.stopFreezeMove, false);\n return self.mousemove(e);\n }\n if (resize && !onUnhideIndicator) {\n self.draggingItem = self.dragItem;\n if (self.draggingItem.rowOpen) {\n self.resizingStartingHeight =\n self.sizes.trees[self.draggingItem.rowIndex];\n } else {\n self.resizingStartingHeight =\n self.sizes.rows[self.draggingItem.rowIndex] || self.style.cellHeight;\n }\n self.resizingStartingWidth =\n self.sizes.columns[\n self.draggingItem.header.style === 'rowHeaderCell'\n ? 'cornerCell'\n : self.draggingItem.sortColumnIndex\n ] || self.draggingItem.width;\n window.addEventListener('mousemove', self.dragResizeColumn, false);\n window.addEventListener('mouseup', self.stopDragResize, false);\n return;\n }\n if (['row-reorder', 'column-reorder'].indexOf(self.dragMode) !== -1) {\n self.draggingItem = self.dragStartObject;\n if (\n self.dragMode === 'column-reorder' &&\n !self.isMultiColumnsSelected &&\n self.attributes.allowColumnSelection\n ) {\n self.selectColumn(self.currentCell.header.index, ctrl, shift);\n } else if (self.dragMode === 'row-reorder' && !self.isMultiRowsSelected) {\n self.selectRow(self.dragStartObject.rowIndex, ctrl, null);\n }\n window.addEventListener('mousemove', self.dragReorder, false);\n window.addEventListener('mouseup', self.stopDragReorder, false);\n return;\n }\n };\n /**\n * A mouseup anywhere ends a selection drag. Only the canvas receives the\n * full mouseup handler, so releasing the button outside the grid used to\n * leave it in \"selecting\" mode and the next mousemove kept extending the\n * selection.\n */\n self.mouseupOutsideGrid = function (e) {\n if (e.target === self.canvas) {\n return; // handled by mouseup\n }\n self.selecting = undefined;\n self.cellBoundaryCrossed = true;\n self.rowBoundaryCrossed = true;\n self.columnBoundaryCrossed = true;\n };\n self.mouseup = function (e) {\n clearTimeout(self.scrollTimer);\n self.cellBoundaryCrossed = true;\n self.rowBoundaryCrossed = true;\n self.columnBoundaryCrossed = true;\n self.selecting = undefined;\n self.draggingItem = undefined;\n self.dragStartObject = undefined;\n if (\n self.dispatchEvent('mouseup', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus && e.target !== self.canvas) {\n return;\n }\n if (self.currentCell && self.currentCell.grid !== undefined) {\n return;\n }\n if (self.contextMenu || self.input) {\n return;\n }\n if (self.dragStart && self.isInGrid(self.dragStart)) {\n self.controlInput.focus();\n }\n e.preventDefault();\n };\n // gets the horizontal adjacent cells as well as first/last based on column visibility\n self.getAdjacentCells = function () {\n var x,\n i,\n s = self.getSchema(),\n o = {};\n for (x = 0; x < s.length; x += 1) {\n i = self.orders.columns[x];\n if (!s[i].hidden) {\n if (o.first === undefined) {\n o.first = x;\n o.left = x;\n }\n o.last = x;\n if (x > self.activeCell.columnIndex && o.right === undefined) {\n o.right = x;\n }\n if (x < self.activeCell.columnIndex) {\n o.left = x;\n }\n }\n }\n if (o.right === undefined) {\n o.right = o.last;\n }\n return o;\n };\n self.keydown = function (e) {\n var i,\n ev,\n adjacentCells = self.getAdjacentCells(),\n x = Math.max(self.activeCell.columnIndex, 0),\n y = Math.max(self.activeCell.rowIndex, 0),\n ctrl = e.ctrlKey || e.metaKey,\n last = self.viewData.length - 1,\n s = self.getSchema(),\n cols = s.length - 1;\n\n var defaultPrevented = self.dispatchEvent('keydown', {\n NativeEvent: e,\n cell: self.currentCell,\n });\n\n if (defaultPrevented) {\n return;\n }\n\n if (!self.attributes.keepFocusOnMouseOut && !self.hasFocus) {\n return;\n }\n\n // If a user starts typing content, switch to \"Enter\" mode\n if (isPrintableKeyEvent(e) && !ctrl) {\n return self.beginEditAt(x, y, e, true);\n }\n\n if (self.attributes.showNewRow) {\n last += 1;\n }\n\n if (e.key === 'Tab') {\n e.preventDefault();\n }\n\n if (e.key === 'Escape') {\n self.selectNone();\n } else if (ctrl && e.key === 'a') {\n self.selectAll();\n } else if (['Backspace', 'Delete'].includes(e.key)) {\n // read-only grids must not lose data on Delete/Backspace (#587, #458)\n if (self.attributes.editable) {\n self.deleteSelectedData();\n }\n } else if (e.key === 'ArrowDown') {\n y += 1;\n } else if (e.key === 'ArrowUp') {\n y -= 1;\n } else if (\n (e.key === 'ArrowLeft' && !ctrl) ||\n (e.shiftKey && e.key === 'Tab')\n ) {\n x = adjacentCells.left;\n } else if (\n (e.key === 'ArrowRight' && !ctrl) ||\n (!e.shiftKey && e.key === 'Tab')\n ) {\n x = adjacentCells.right;\n } else if (e.key === 'PageUp') {\n y -= self.page;\n e.preventDefault();\n } else if (e.key === 'PageDown') {\n y += self.page;\n e.preventDefault();\n } else if (e.key === 'Home' || (ctrl && e.key === 'ArrowUp')) {\n y = 0;\n } else if (e.key === 'End' || (ctrl && e.key === 'ArrowDown')) {\n y = self.viewData.length - 1;\n } else if (ctrl && e.key === 'ArrowRight') {\n x = adjacentCells.last;\n } else if (ctrl && e.key === 'ArrowLeft') {\n x = adjacentCells.first;\n }\n\n if (e.key === 'Enter') {\n e.preventDefault();\n return self.beginEditAt(x, y, e);\n }\n if (x < 0 || Number.isNaN(x)) {\n x = adjacentCells.first;\n }\n if (y > last) {\n y = last;\n }\n if (y < 0 || Number.isNaN(y)) {\n y = 0;\n }\n if (x > cols) {\n x = adjacentCells.last;\n }\n\n // TODO - most likely some column order related bugs in key based selection\n // Arrows\n const isArrowKey = [\n 'ArrowLeft',\n 'ArrowUp',\n 'ArrowRight',\n 'ArrowDown',\n ].includes(e.key);\n\n // Shrinking and expanding selection using shift and arrow keys\n if (e.shiftKey && isArrowKey && !self.attributes.singleSelectionMode) {\n const changed = self.shrinkOrExpandSelections(\n { rowIndex: y, columnIndex: x },\n e,\n true,\n );\n if (changed) self.draw(true);\n }\n\n if (x !== self.activeCell.columnIndex || y !== self.activeCell.rowIndex) {\n self.scrollIntoView(\n x !== self.activeCell.columnIndex ? x : undefined,\n y !== self.activeCell.rowIndex && !Number.isNaN(y) ? y : undefined,\n );\n\n self.setActiveCell(x, y);\n if (!e.shiftKey && self.attributes.selectionFollowsActiveCell) {\n if (!ctrl) self.clearSelections();\n self.selectCell({ rowIndex: y, viewColumnIndex: x });\n }\n self.draw(true);\n }\n };\n self.keyup = function (e) {\n if (\n self.dispatchEvent('keyup', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n };\n self.keypress = function (e) {\n if (!self.hasFocus) {\n return;\n }\n if (\n self.dispatchEvent('keypress', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n };\n self.dblclick = function (e) {\n if (\n self.dispatchEvent('dblclick', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n if (\n self.currentCell.context === 'ew-resize' &&\n self.currentCell.style === 'columnHeaderCell'\n ) {\n // Check that double-clicked cell is selected or part of selection.\n const currentCellIsSelected = self.isColumnSelected(\n self.currentCell.columnIndex,\n );\n\n if (currentCellIsSelected) {\n // There might be more\n self.fitSelectedColumns();\n } else {\n self.fitColumnToValues(self.currentCell.header.name);\n }\n } else if (\n self.currentCell.context === 'ew-resize' &&\n self.currentCell.style === 'cornerCell'\n ) {\n self.autosize();\n } else if (\n ['cell', 'activeCell'].includes(self.currentCell.style) &&\n !self.hovers.onFilterButton &&\n !self.hovers.onCellTreeIcon\n ) {\n if (self.currentCell.isRowTree || self.currentCell.isColumnTree) {\n self.cellTreeExpandCollapse(\n self.currentCell.rowIndex,\n self.currentCell.columnIndex,\n );\n self.draw();\n } else {\n self.beginEditAt(\n self.currentCell.columnIndex,\n self.currentCell.rowIndex,\n );\n }\n }\n };\n self.scrollWheel = function (e) {\n var l,\n t,\n ev = e,\n deltaX = e.deltaX === undefined ? e.NativeEvent.deltaX : e.deltaX,\n deltaY = e.deltaY === undefined ? e.NativeEvent.deltaY : e.deltaY,\n deltaMode =\n e.deltaMode === undefined ? e.NativeEvent.deltaMode : e.deltaMode;\n if (e.NativeEvent) e = e.NativeEvent;\n if (wheeling) {\n ev.preventDefault(e);\n return;\n }\n if (self.dispatchEvent('wheel', { NativeEvent: e })) {\n return;\n }\n self.touchHaltAnimation = true;\n l = self.scrollBox.scrollLeft;\n t = self.scrollBox.scrollTop;\n if (self.hasFocus) {\n //BUG Issue 42: https://github.com/TonyGermaneri/canvas-datagrid/issues/42\n //https://stackoverflow.com/questions/20110224/what-is-the-height-of-a-line-in-a-wheel-event-deltamode-dom-delta-line\n if (deltaMode === 1) {\n // line mode = 17 pixels per line\n deltaY = deltaY * 17;\n }\n if (\n (self.scrollBox.scrollTop < self.scrollBox.scrollHeight &&\n deltaY > 0) ||\n (self.scrollBox.scrollLeft < self.scrollBox.scrollWidth &&\n deltaX > 0) ||\n (self.scrollBox.scrollTop > 0 && deltaY < 0) ||\n (self.scrollBox.scrollLeft > 0 && deltaX < 0)\n ) {\n ev.preventDefault(e);\n }\n wheeling = setTimeout(function () {\n wheeling = undefined;\n self.scrollBox.scrollTo(deltaX + l, deltaY + t);\n }, 1);\n }\n };\n self.pasteData = function (\n pasteValue,\n mimeType,\n startRowIndex,\n startColIndex,\n minRowsLength = 0,\n minColumnsLength = 0,\n ) {\n if (mimeType === 'text/html' && !isSupportedHtml(pasteValue)) {\n console.warn(\n 'Unrecognized HTML format. HTML must be a simple table, e.g.: <table><tr><td>data</td></tr></table>.',\n );\n console.warn(\n 'Data with the mime type text/html not in this format will not be imported as row data.',\n );\n\n return;\n }\n\n const rows = parseData(pasteValue, mimeType);\n const columnsLength = rows[0].length;\n\n // selected cell. This mimics Excel's paste functionality, and works\n // as a poor-man's fill-down.\n if (\n rows.length === 1 &&\n columnsLength === 1 &&\n minRowsLength <= 1 &&\n minColumnsLength <= 1\n ) {\n var cellData = rows[0][0].value.map((item) => item.value).join();\n\n self.forEachSelectedCell(function (data, rowIndex, colName) {\n data[rowIndex][colName] = cellData;\n });\n } else {\n let direction = null;\n\n if (minRowsLength > rows.length && minColumnsLength > columnsLength) {\n direction = 'both';\n } else if (minRowsLength > rows.length) {\n direction = 'vertical';\n } else if (minColumnsLength > columnsLength) {\n direction = 'horizontal';\n }\n\n self.insert({\n rows: rows,\n startRowIndex: startRowIndex,\n startColumnIndex: startColIndex,\n minRowsLength: minRowsLength,\n minColumnsLength: minColumnsLength,\n reverseRows: false,\n reverseColumns: false,\n clearSelections: true,\n alwaysFilling: false,\n direction: direction,\n });\n }\n\n // selections is a sparse array, so we condense:\n const affectedCells = [];\n self.forEachSelectedCell((viewData, viewRowIndex, columnName, cell) => {\n affectedCells.push([\n viewRowIndex,\n cell.viewColumnIndex,\n cell.boundRowIndex,\n cell.boundColumnIndex,\n // the pasted value, so listeners need not look it up (#549)\n viewData[viewRowIndex] ? viewData[viewRowIndex][columnName] : undefined,\n ]);\n });\n\n self.dispatchEvent('afterpaste', {\n cells: affectedCells,\n });\n self.dispatchDataChanged('paste', { cells: affectedCells });\n\n return rows.length;\n };\n /**\n * Grows the data set and the schema so that `insert` can write every pasted\n * cell, adding all missing rows and columns in one pass with a single\n * refresh instead of calling `addRow`/`addColumn` per cell.\n * @param {Array} rows Parsed clipboard rows (see `parseData`).\n * @param {number} requiredRowCount Number of rows the grid needs to have.\n * @param {number} requiredColumnCount Number of columns the grid needs to have.\n */\n self.expandGridForInsert = function (\n rows,\n requiredRowCount,\n requiredColumnCount,\n ) {\n const schema = self.getSchema();\n let changed = false;\n const missingColumns = requiredColumnCount - schema.length;\n if (missingColumns > 0) {\n const lastColumn = schema[self.orders.columns[schema.length - 1]] || {};\n for (let i = 0; i < missingColumns; i += 1) {\n const column = {\n name: `col${schema.length + 1}:${Date.now()}${i}`,\n type: deduceColTypeFromData(rows, i),\n title: ' ',\n width: lastColumn.width,\n };\n self.validateColumn(column, schema);\n schema.push(column);\n self.originalData.forEach(function (row, rowIndex) {\n self.applyDefaultValue(row, column, rowIndex);\n });\n }\n self.intf.schema = schema;\n changed = true;\n }\n const missingRows = requiredRowCount - self.originalData.length;\n if (missingRows > 0) {\n for (let i = 0; i < missingRows; i += 1) {\n const row = {};\n self.originalData.push(row);\n self.getSchema().forEach(function (c) {\n self.applyDefaultValue(row, c, self.originalData.length - 1);\n });\n }\n changed = true;\n }\n if (changed) {\n // setFilter re-applies filters and sorting and calls refresh() once\n self.setFilter();\n self.resize(true);\n }\n return changed;\n };\n self.insert = function ({\n rows = [],\n startRowIndex = 0,\n startColumnIndex = 0,\n minRowsLength = 0,\n minColumnsLength = 0,\n reverseRows = false,\n reverseColumns = false,\n clearSelections = false,\n alwaysFilling = false,\n direction = 'both',\n }) {\n const rowsLength = Math.max(rows.length, minRowsLength);\n const fillCellCallback = self.fillCellCallback;\n const filledCells = [];\n\n if (self.attributes.allowGridExpandOnPaste) {\n self.expandGridForInsert(\n rows,\n startRowIndex + rowsLength,\n startColumnIndex +\n Math.max(minColumnsLength, ...rows.map((cells) => cells.length)),\n );\n }\n\n if (clearSelections) self.selections = [];\n\n for (\n let rowPosReal = 0, rowDataPos = 0;\n rowPosReal < rowsLength;\n rowPosReal++, rowDataPos++\n ) {\n if (rowDataPos >= rows.length) {\n rowDataPos = 0;\n }\n\n const fillingRow = rowPosReal >= rows.length;\n const rowPosition = reverseRows\n ? rowsLength - rowPosReal - 1\n : rowPosReal;\n // Rows may have been moved by user, so get the actual row index\n // (instead of the row index at which the row is rendered):\n if (self.originalData[startRowIndex + rowPosition] === undefined) {\n console.warn('Paste data exceeded grid bounds. Skipping.');\n break;\n }\n const realRowIndex = self.orders.rows[startRowIndex + rowPosition];\n\n const cells = rows[rowDataPos];\n const cellsLength = Math.max(cells.length, minColumnsLength);\n\n const existingRowData = self.viewData[realRowIndex];\n const newRowData = Object.assign({}, existingRowData);\n const fillArgs = fillCellCallback\n ? {\n rows: rows,\n direction: direction,\n rowData: newRowData,\n existingRowData: existingRowData,\n rowIndex: realRowIndex,\n rowOffset: rowDataPos,\n cells: cells,\n reversed: direction === 'horizontal' ? reverseColumns : reverseRows,\n isFillingRow: fillingRow || alwaysFilling,\n fillingRowPosition: alwaysFilling\n ? rowPosReal\n : fillingRow\n ? rowPosReal - rows.length\n : -1,\n fillingRowLength: alwaysFilling\n ? rowsLength\n : fillingRow\n ? rowsLength - rows.length\n : -1,\n }\n : undefined;\n\n for (\n let colPosReal = 0, cellDataPos = 0;\n colPosReal < cellsLength;\n colPosReal++, cellDataPos++\n ) {\n if (cellDataPos >= cells.length) {\n cellDataPos = 0;\n }\n\n const fillingColumn = colPosReal >= cells.length;\n const colPosition = reverseColumns\n ? cellsLength - colPosReal - 1\n : colPosReal;\n const columnIndex = startColumnIndex + colPosition;\n if (!self.getSchema()[columnIndex]) {\n console.warn('Paste data exceeded grid bounds. Skipping.');\n continue;\n }\n const column = self.getSchema()[self.orders.columns[columnIndex]];\n const columnName = column.name;\n let cellData = cells[cellDataPos];\n if (cellData && cellData.value) {\n cellData = cellData.value.map((item) => item.value).join('');\n }\n\n const existingCellData = existingRowData[columnName];\n\n if (\n fillCellCallback &&\n (fillingColumn || fillingRow || alwaysFilling)\n ) {\n newRowData[columnName] = fillCellCallback({\n ...fillArgs,\n column: column,\n columnIndex: columnIndex,\n columnOffset: cellDataPos,\n newCellData: cellData,\n existingCellData: existingCellData,\n isFillingColumn: fillingColumn || alwaysFilling,\n fillingColumnPosition: alwaysFilling\n ? colPosReal\n : fillingColumn\n ? colPosReal - cells.length\n : -1,\n fillingColumnLength: alwaysFilling\n ? cellsLength\n : fillingColumn\n ? cellsLength - cells.length\n : -1,\n });\n } else {\n newRowData[columnName] =\n cellData === undefined || cellData === null\n ? existingCellData\n : cellData;\n }\n\n self.selectCell(\n { rowIndex: realRowIndex, viewColumnIndex: columnIndex },\n true,\n );\n\n if (alwaysFilling || fillingRow || fillingColumn) {\n filledCells.push([\n realRowIndex,\n columnIndex,\n self.getBoundRowIndexFromViewRowIndex(realRowIndex),\n self.getBoundColumnIndexFromViewColumnIndex(columnIndex),\n ]);\n }\n }\n\n self.originalData[self.boundRowIndexMap.get(realRowIndex)] = newRowData;\n // Update view date here to avoid a full refresh of `viewData`.\n // To stay in line with Excel and Google Sheet behaviour,\n // don't perform a full refresh (and filter/sort results)\n // as this would make any pasted values disappear and/or suddenly change position.\n self.viewData[realRowIndex] = newRowData;\n }\n\n if (filledCells.length > 0 || alwaysFilling) {\n self.dispatchEvent('afterfill', {\n filledCells: filledCells,\n });\n }\n };\n self.getNextVisibleColumnIndex = function (visibleColumnIndex) {\n var x,\n s = self.getVisibleSchema();\n for (x = 0; x < s.length; x += 1) {\n if (s[x].columnIndex === visibleColumnIndex) {\n return s[x + 1].columnIndex;\n }\n }\n return -1;\n };\n self.getVisibleColumnIndexOf = function (columnIndex) {\n var x,\n s = self.getVisibleSchema();\n for (x = 0; x < s.length; x += 1) {\n if (s[x].columnIndex === columnIndex) {\n return x;\n }\n }\n return -1;\n };\n self.getSelectionIndex = function () {\n const bounds = self.getSelectionBounds(true);\n if (!bounds) return;\n const { top, bottom } = bounds;\n for (let rowIndex = top; rowIndex <= bottom; rowIndex++) {\n const row = self.getRowSelectionStates(rowIndex);\n if (row) {\n if (row[0] === undefined) break;\n\n return {\n row: rowIndex,\n column: row[0] < 0 ? row[1] : row[0],\n rowLength: bottom - rowIndex + 1,\n columnLength: row.length - (row[0] < 0 ? 1 : 0),\n };\n }\n }\n\n return null;\n };\n self.paste = function (event) {\n if (!self.attributes.editable) {\n return;\n }\n\n var defaultPrevented = self.dispatchEvent('beforepaste', {\n NativeEvent: event,\n });\n\n if (defaultPrevented) {\n return;\n }\n\n var clipboardItems = new Map(\n Array.from(event.clipboardData.items).map((item) => [item.type, item]),\n );\n\n // Supported MIME types, in order of preference:\n var supportedMimeTypes = ['text/html', 'text/csv', 'text/plain'];\n\n // The clipboard will often contain the same data in multiple formats,\n // which can be used depending on the context in which it's pasted. Here\n // we'll prefere more structured (HTML/CSV) over less structured, when\n // available, so we try to find those first:\n var pasteableItems = supportedMimeTypes\n .map((mimeType) => clipboardItems.get(mimeType))\n .filter((item) => !!item); // filter out not-found MIME types (= undefined)\n\n if (pasteableItems.length === 0) {\n console.warn(\n 'Cannot find supported clipboard data type. Supported types are:',\n supportedMimeTypes.join(', '),\n );\n return;\n }\n\n const selectionIndex = self.getSelectionIndex();\n if (!selectionIndex) return;\n\n var itemToPaste = pasteableItems[0];\n\n // itemToPaste is cleared once accessed (getData or getAsString),\n // so we need to store the type here, before reading its value:\n var pasteType = itemToPaste.type;\n\n itemToPaste.getAsString(function (pasteValue) {\n self.pasteData(\n pasteValue,\n pasteType,\n selectionIndex.row,\n selectionIndex.column,\n selectionIndex.rowLength,\n selectionIndex.columnLength,\n );\n\n self.draw();\n });\n };\n self.cut = function (event) {\n if (self.dispatchEvent('cut', { NativeEvent: event })) {\n return;\n }\n\n // Expecting instance of `ClipboardEvent` with `clipboardData` attribute\n if (!self.hasFocus || !event.clipboardData) {\n return;\n }\n\n if (!self.attributes.editable) {\n // A read-only grid can still put the selection on the clipboard,\n // but nothing is removed from the data (#587).\n self.copySelectedCellsToClipboard(event.clipboardData);\n event.preventDefault();\n return;\n }\n\n self.copySelectedCellsToClipboard(event.clipboardData);\n\n const affectedCells = self.clearSelectedCells();\n const apiCompatibleCells = affectedCells.map((cell) => {\n return [\n cell.viewRowIndex,\n cell.viewColumnIndex,\n cell.boundRowIndex,\n cell.boundColumnIndex,\n ];\n });\n\n self.dispatchEvent('aftercut', {\n cells: apiCompatibleCells,\n });\n self.dispatchDataChanged('cut', { cells: apiCompatibleCells });\n\n requestAnimationFrame(() => self.draw());\n event.preventDefault();\n };\n self.copy = function (event) {\n if (self.dispatchEvent('copy', { NativeEvent: event })) {\n return;\n }\n\n // Expecting instance of `ClipboardEvent` with `clipboardData` attribute\n if (!self.hasFocus || !event.clipboardData) {\n return;\n }\n\n self.copySelectedCellsToClipboard(event.clipboardData);\n\n event.preventDefault();\n };\n self.selectionHandleMove = function (e) {\n if (!self.movingSelectionHandle) {\n return;\n }\n\n const clippingRect = self.getClippingRect(e);\n const rowIndex = self.currentCell.rowIndex;\n const columnIndex = self.currentCell.columnIndex;\n const isInSelectionBounds =\n rowIndex >= -1 &&\n columnIndex >= -1 &&\n self.fillOverlay.selection.left <= columnIndex &&\n self.fillOverlay.selection.right >= columnIndex &&\n self.fillOverlay.selection.top <= rowIndex &&\n self.fillOverlay.selection.bottom >= rowIndex;\n\n self.fillOverlay.minX = clippingRect.x;\n self.fillOverlay.minY = clippingRect.y;\n self.fillOverlay.x = Math.max(clippingRect.x, e.clientX);\n self.fillOverlay.y = Math.max(clippingRect.y, e.clientY);\n\n // If we are in the selection bounds, allow user to change directions.\n if (isInSelectionBounds) {\n self.fillOverlay.lastInBoundsLocation = {\n x: e.clientX,\n y: e.clientY,\n };\n } else if (\n self.fillOverlay.lastInBoundsLocation ||\n !self.fillOverlay.direction\n ) {\n const lastInBoundsLocation = self.fillOverlay.lastInBoundsLocation;\n self.fillOverlay.lastInBoundsLocation = undefined;\n\n const x = lastInBoundsLocation\n ? lastInBoundsLocation.x\n : self.fillOverlay.handle.x;\n const y = lastInBoundsLocation\n ? lastInBoundsLocation.y\n : self.fillOverlay.handle.y;\n const dx = Math.abs(e.clientX - x);\n const dy = Math.abs(e.clientY - y);\n\n if (dx > 5 || dy > 5) {\n self.fillOverlay.direction = dx > dy ? 'x' : 'y';\n }\n }\n\n if (rowIndex >= 0) {\n self.fillOverlay.rowIndex = rowIndex;\n }\n if (columnIndex >= 0) {\n self.fillOverlay.columnIndex = columnIndex;\n if (rowIndex === -1 && self.visibleRows.length) {\n self.fillOverlay.rowIndex = self.visibleRows[0];\n }\n }\n\n if (rowIndex >= -1 && columnIndex >= -1) {\n self.fillOverlay.snap = self.currentCell;\n } else {\n self.fillOverlay.snap = undefined;\n }\n };\n self.stopSelectionHandleMove = function (e) {\n if (!self.fillOverlay.handle) {\n return false;\n }\n\n self.ignoreNextClick = true;\n\n window.removeEventListener('mousemove', self.selectionHandleMove, false);\n window.removeEventListener('mouseup', self.stopSelectionHandleMove, false);\n\n const overlay = self.fillOverlay;\n const selectionIndex = self.getSelectionIndex();\n const bounds = overlay.selection;\n if (!selectionIndex) return;\n\n self.movingSelectionHandle = undefined;\n self.fillOverlay = {};\n\n if (overlay.rowIndex >= 0 && overlay.columnIndex >= 0) {\n const boundsOld = { ...bounds };\n const isVertical = overlay.direction === 'y';\n const isHorizontal = overlay.direction === 'x';\n\n let startRow,\n rowLength,\n startColumn,\n columnLength,\n reverseVertically = false,\n reverseHorizontally = false;\n\n if (isVertical) {\n if (overlay.rowIndex < bounds.top) {\n bounds.top = overlay.rowIndex;\n reverseVertically = true;\n } else if (overlay.rowIndex > bounds.bottom) {\n bounds.bottom = overlay.rowIndex;\n }\n\n startRow =\n bounds.top < boundsOld.top ? bounds.top : boundsOld.bottom + 1;\n rowLength =\n bounds.top < boundsOld.top\n ? boundsOld.top - bounds.top\n : bounds.bottom - boundsOld.bottom;\n startColumn = selectionIndex.column;\n columnLength = selectionIndex.columnLength;\n } else if (isHorizontal) {\n if (overlay.columnIndex < bounds.left) {\n bounds.left = overlay.columnIndex;\n reverseHorizontally = true;\n } else if (overlay.columnIndex > bounds.right) {\n bounds.right = overlay.columnIndex;\n }\n\n startColumn =\n bounds.left < boundsOld.left ? bounds.left : boundsOld.right + 1;\n columnLength =\n bounds.left < boundsOld.left\n ? boundsOld.left - bounds.left\n : bounds.right - boundsOld.right;\n startRow = selectionIndex.row;\n rowLength = selectionIndex.rowLength;\n }\n\n if (\n bounds.left <= bounds.right &&\n bounds.top <= bounds.bottom &&\n (bounds.left < boundsOld.left ||\n bounds.top < boundsOld.top ||\n bounds.right > boundsOld.right ||\n bounds.bottom > boundsOld.bottom)\n ) {\n const schema = self.getSchema();\n const rows = [];\n\n for (\n let rowIndex = 0;\n rowIndex < Math.min(rowLength, selectionIndex.rowLength);\n rowIndex++\n ) {\n const rowData = self.viewData[selectionIndex.row + rowIndex];\n\n rows[rowIndex] = [];\n\n for (\n let columnIndex = 0;\n columnIndex < Math.min(columnLength, selectionIndex.columnLength);\n columnIndex++\n ) {\n const column = schema[selectionIndex.column + columnIndex];\n if (!column) continue;\n\n const cellData = rowData[column.name];\n\n rows[rowIndex][columnIndex] = cellData;\n }\n }\n\n self.insert({\n rows: rows,\n startRowIndex: startRow,\n startColumnIndex: startColumn,\n minRowsLength: rowLength,\n minColumnsLength: columnLength,\n reverseRows: reverseVertically,\n reverseColumns: reverseHorizontally,\n clearSelections: false,\n alwaysFilling: true,\n direction: isHorizontal ? 'horizontal' : 'vertical',\n });\n self.dispatchDataChanged('fill');\n\n self.draw();\n }\n }\n\n return true;\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true, plusplus: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n var touchTimerMs = 50,\n debounceTouchMove,\n touchMoving,\n touchScrollTimeout;\n self.scrollAnimation = {};\n self.touchDelta = {};\n self.touchAnimateTo = {};\n self.animationFrames = 0;\n self.getTouchPos = function (e, touchIndex) {\n var t = touchIndex ? e.touches[touchIndex] : e.touches[0],\n rect = self.canvas.getBoundingClientRect(),\n pos;\n if (!t) {\n return;\n }\n pos = {\n x: t.clientX - rect.left,\n y: t.clientY - rect.top,\n };\n if (self.isChildGrid) {\n pos.x -= self.canvasOffsetLeft;\n pos.y -= self.canvasOffsetTop;\n }\n return {\n x: pos.x,\n y: pos.y,\n rect: rect,\n };\n };\n // shamelessly stolen from from https://gist.github.com/gre/1650294\n self.easingFunctions = {\n linear: function (t) {\n return t;\n },\n easeInQuad: function (t) {\n return t * t;\n },\n easeOutQuad: function (t) {\n return t * (2 - t);\n },\n easeInOutQuad: function (t) {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n },\n easeInCubic: function (t) {\n return t * t * t;\n },\n easeOutCubic: function (t) {\n return --t * t * t + 1;\n },\n easeInOutCubic: function (t) {\n return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;\n },\n easeInQuart: function (t) {\n return t * t * t * t;\n },\n easeOutQuart: function (t) {\n return 1 - --t * t * t * t;\n },\n easeInOutQuart: function (t) {\n return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t;\n },\n easeInQuint: function (t) {\n return t * t * t * t * t;\n },\n easeOutQuint: function (t) {\n return 1 + --t * t * t * t * t;\n },\n easeInOutQuint: function (t) {\n return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t;\n },\n };\n self.easing = function (t, b, c, d) {\n return (\n c * self.easingFunctions[self.attributes.touchEasingMethod](t / d) + b\n );\n };\n self.calculatePPSTimed = function () {\n self.xPPST = -(\n (self.touchDelta.x - self.touchSigmaTimed.x) /\n (self.touchDelta.t - self.touchSigmaTimed.t)\n );\n self.yPPST = -(\n (self.touchDelta.y - self.touchSigmaTimed.y) /\n (self.touchDelta.t - self.touchSigmaTimed.t)\n );\n self.touchSigmaTimed = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: performance.now(),\n };\n };\n self.calculatePPS = function () {\n self.xPPS = -(\n (self.touchDelta.x - self.touchSigma.x) /\n (self.touchDelta.t - self.touchSigma.t)\n );\n self.yPPS = -(\n (self.touchDelta.y - self.touchSigma.y) /\n (self.touchDelta.t - self.touchSigma.t)\n );\n self.touchSigma = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: performance.now(),\n };\n };\n self.touchEndAnimation = function () {\n if (!self.canvas || !self.scrollBox.scrollTo) {\n return requestAnimationFrame(self.touchEndAnimation);\n }\n var n = performance.now(),\n d = self.attributes.touchReleaseAnimationDurationMs,\n t;\n t = n - self.touchDelta.t;\n self.animationFrames += 1;\n self.scrollAnimation.x = self.easing(\n t,\n self.touchDelta.scrollLeft,\n self.touchAnimateTo.x,\n d,\n );\n self.scrollAnimation.y = self.easing(\n t,\n self.touchDelta.scrollTop,\n self.touchAnimateTo.y,\n d,\n );\n if (\n t > d ||\n (self.scrollAnimation.y === self.scrollBox.scrollTop &&\n self.scrollAnimation.x === self.scrollBox.scrollLeft) ||\n self.stopAnimation\n ) {\n return;\n }\n self.scrollBox.scrollTo(self.scrollAnimation.x, self.scrollAnimation.y);\n requestAnimationFrame(self.touchEndAnimation);\n };\n self.touchEditCell = function (cell) {\n self.beginEditAt(cell.columnIndex, cell.rowIndex);\n };\n self.touchstart = function (e) {\n if (e.changedTouches[0]) {\n self.touchStart = self.getTouchPos(e);\n self.startingCell = self.getCellAt(\n self.touchStart.x,\n self.touchStart.y,\n true,\n );\n } else {\n // nothing to start from (#554)\n self.startingCell = undefined;\n return;\n }\n if (\n self.dispatchEvent('touchstart', {\n NativeEvent: e,\n cell: self.startingCell,\n })\n ) {\n return;\n }\n self.disposeContextMenu();\n clearInterval(self.calculatePPSTimer);\n clearTimeout(self.touchContextTimeout);\n self.touchStartEvent = e;\n self.stopAnimation = true;\n self.animationFrames = 0;\n self.stopPropagation(e);\n if (e.touches.length === 1 && e.changedTouches[0] && !self.zoomAltered) {\n self.touchLength = 1;\n self.touchStart = self.touchStart || self.touchStart1;\n self.touchScrollStart = {\n x: self.scrollBox.scrollLeft,\n y: self.scrollBox.scrollTop,\n t: performance.now(),\n };\n self.touchDelta = {\n x: 0,\n y: 0,\n scrollLeft: self.scrollBox.scrollLeft,\n scrollTop: self.scrollBox.scrollTop,\n t: self.touchScrollStart.t,\n };\n self.touchSigma = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: self.touchDelta.t,\n };\n self.touchSigmaTimed = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: self.touchDelta.t,\n };\n self.touchContextTimeout = setTimeout(function () {\n self.contextmenuEvent(e, self.touchStart);\n }, self.attributes.touchContextMenuTimeMs);\n self.calculatePPSTimer = setInterval(\n self.calculatePPSTimed,\n touchTimerMs,\n );\n if (\n self.startingCell &&\n (self.startingCell.isGrid ||\n ['tree', 'inherit'].indexOf(self.startingCell.context) !== -1)\n ) {\n self.hasFocus = false;\n return;\n }\n self.hasFocus = true;\n if (self.startingCell && self.startingCell.isHeader) {\n if (self.startingCell.isRowHeader) {\n self.selectArea({\n top: self.startingCell.rowIndex,\n bottom: self.startingCell.rowIndex,\n left: 0,\n right: self.getVisibleSchema().length - 1,\n });\n self.draw(true);\n } else if (self.startingCell.isColumnHeader) {\n if (self.attributes.columnHeaderClickBehavior === 'sort') {\n if (self.orderBy === self.startingCell.header.name) {\n self.orderDirection =\n self.orderDirection === 'asc' ? 'desc' : 'asc';\n } else {\n self.orderDirection = 'asc';\n }\n self.order(self.startingCell.header.name, self.orderDirection);\n }\n if (\n self.attributes.columnHeaderClickBehavior === 'select' &&\n self.attributes.allowColumnSelection\n ) {\n self.selectArea({\n top: 0,\n bottom: self.viewData.length - 1,\n left: self.startingCell.columnIndex,\n right: self.startingCell.columnIndex,\n });\n self.draw(true);\n }\n }\n self.touchEndEvents(e);\n return;\n }\n }\n if (self.zoomAltered) {\n return;\n }\n document.body.addEventListener('touchmove', self.touchmove, {\n passive: false,\n });\n document.body.addEventListener('touchend', self.touchend, false);\n document.body.addEventListener('touchcancel', self.touchcancel, false);\n self.draw(true);\n };\n self.touchSelect = function (cell, handleType) {\n if (cell.rowIndex === undefined || cell.columnIndex === undefined) {\n return;\n }\n self.touchSelecting = true;\n var bounds = self.getSelectionBounds();\n if (\n handleType === 'selection-handle-bl' &&\n cell.rowIndex >= bounds.top &&\n cell.columnIndex <= bounds.right\n ) {\n bounds.bottom = cell.rowIndex;\n bounds.left = cell.columnIndex;\n } else if (\n handleType === 'selection-handle-tl' &&\n cell.rowIndex <= bounds.bottom &&\n cell.columnIndex <= bounds.right\n ) {\n bounds.top = cell.rowIndex;\n bounds.left = cell.columnIndex;\n } else if (\n handleType === 'selection-handle-tr' &&\n cell.rowIndex <= bounds.bottom &&\n cell.columnIndex >= bounds.left\n ) {\n bounds.top = cell.rowIndex;\n bounds.right = cell.columnIndex;\n } else if (\n handleType === 'selection-handle-br' &&\n cell.rowIndex >= bounds.top &&\n cell.columnIndex >= bounds.left\n ) {\n bounds.bottom = cell.rowIndex;\n bounds.right = cell.columnIndex;\n }\n if (self.attributes.selectionMode === 'row' || cell.rowIndex === -1) {\n bounds.left = 0;\n bounds.right = self.getSchema().length - 1;\n } else {\n bounds.left = Math.max(0, bounds.left);\n }\n self.selectArea(bounds);\n self.draw(true);\n };\n function touchMove(e) {\n var ch, rw, rScrollZone, lScrollZone, bScrollZone, tScrollZone, sbw, t1, t2;\n if (self.dispatchEvent('beforetouchmove', { NativeEvent: e })) {\n return;\n }\n clearTimeout(touchScrollTimeout);\n if (e.changedTouches[0]) {\n self.touchPosition = self.getTouchPos(e);\n }\n if (e.changedTouches[1]) {\n self.touchPosition1 = self.getTouchPos(e, 1);\n }\n if (\n Math.abs(self.touchDelta.x) + Math.abs(self.touchDelta.y) >\n self.attributes.touchDeadZone\n ) {\n clearTimeout(self.touchContextTimeout);\n }\n if (e.touches.length === 2 && self.touchPosition && self.touchPosition1) {\n t1 = self.touchPosition.y;\n t2 = self.touchPosition1.y;\n if (!self.zoomDeltaStart) {\n self.zoomDeltaStart = Math.abs(t1 - t2);\n self.startScale = self.scale;\n }\n self.touchLength = 2;\n self.scaleDelta = self.zoomDeltaStart - Math.abs(t1 - t2);\n self.scale =\n self.startScale -\n self.scaleDelta * self.attributes.touchZoomSensitivity;\n self.scale = Math.min(\n Math.max(self.scale, self.attributes.touchZoomMin),\n self.attributes.touchZoomMax,\n );\n self.zoomAltered = true;\n self.resize(true);\n self.resizeChildGrids();\n return;\n }\n if (self.zoomAltered) {\n return;\n }\n self.touchLength = 1;\n self.touchPosition = self.touchPosition || self.touchPosition1;\n ch = self.getColumnHeaderCellHeight();\n rw = self.getRowHeaderCellWidth();\n rScrollZone =\n self.width - self.style.scrollBarWidth - self.touchPosition.x <\n self.attributes.selectionScrollZone;\n lScrollZone =\n self.touchPosition.x - rw < self.attributes.selectionScrollZone;\n bScrollZone =\n self.height - self.style.scrollBarWidth - self.touchPosition.y <\n self.attributes.selectionScrollZone;\n tScrollZone =\n self.touchPosition.y - ch < self.attributes.selectionScrollZone;\n sbw = self.style.scrollBarWidth;\n function touchScroll() {\n var x = self.scrollBox.scrollLeft,\n y = self.scrollBox.scrollTop;\n x += rScrollZone ? self.attributes.selectionScrollIncrement : 0;\n y += bScrollZone ? self.attributes.selectionScrollIncrement : 0;\n y -= tScrollZone ? self.attributes.selectionScrollIncrement : 0;\n x -= lScrollZone ? self.attributes.selectionScrollIncrement : 0;\n self.scrollBox.scrollTo(x, y);\n touchScrollTimeout = setTimeout(\n touchScroll,\n self.attributes.scrollRepeatRate,\n );\n }\n e.stopPropagation();\n self.touchDelta = {\n x: self.touchPosition.x - self.touchStart.x,\n y: self.touchPosition.y - self.touchStart.y,\n scrollLeft: self.scrollBox.scrollLeft,\n scrollTop: self.scrollBox.scrollTop,\n t: performance.now(),\n };\n self.currentCell = self.getCellAt(\n self.touchPosition.x,\n self.touchPosition.y,\n );\n self.dispatchEvent('touchmove', { NativeEvent: e, cell: self.currentCell });\n self.calculatePPS();\n self.touchDuration = performance.now() - self.touchScrollStart.t;\n self.stopAnimation = true;\n self.animationFrames = 0;\n if (\n self.touchSelecting &&\n (rScrollZone || lScrollZone || tScrollZone || bScrollZone)\n ) {\n touchScroll();\n }\n // the starting cell can be missing when the touch began off-grid (#554)\n var startingCellStyle =\n (self.startingCell && self.startingCell.style) || '';\n if (/vertical-scroll-/.test(startingCellStyle)) {\n self.scrollBox.scrollTop =\n self.scrollBox.scrollHeight *\n ((self.touchPosition.y - ch - sbw) /\n (self.scrollBox.height - sbw - ch));\n return;\n }\n if (/horizontal-scroll-/.test(startingCellStyle)) {\n self.scrollBox.scrollLeft =\n self.scrollBox.scrollWidth *\n ((self.touchPosition.x - rw - sbw) / (self.scrollBox.width - sbw - rw));\n return;\n }\n if (/selection-handle-/.test(startingCellStyle)) {\n self.touchSelect(self.currentCell, startingCellStyle);\n return;\n }\n self.scrollBox.scrollTo(\n self.touchScrollStart.x - self.touchDelta.x,\n self.touchScrollStart.y - self.touchDelta.y,\n );\n }\n self.touchmove = function (e) {\n if (touchMoving) {\n return;\n }\n requestAnimationFrame(function () {\n touchMoving = true;\n touchMove(e);\n touchMoving = false;\n });\n };\n self.touchEndEvents = function (e) {\n self.zoomDeltaStart = undefined;\n self.touchSelecting = false;\n clearInterval(self.touchScrollTimeout);\n clearInterval(self.touchContextTimeout);\n clearInterval(self.calculatePPSTimer);\n e.stopPropagation();\n document.body.removeEventListener('touchmove', self.touchmove, {\n passive: false,\n });\n document.body.removeEventListener('touchend', self.touchend, false);\n document.body.removeEventListener('touchcancel', self.touchcancel, false);\n };\n self.touchend = function (e) {\n if (\n self.dispatchEvent('touchend', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n self.zoomDeltaStart = undefined;\n if (e.changedTouches[0]) {\n self.touchPosition = undefined;\n }\n if (e.changedTouches[1]) {\n self.touchPosition1 = undefined;\n }\n if (self.zoomAltered) {\n if (e.touches.length === 0) {\n self.zoomAltered = false;\n }\n return;\n }\n var dz =\n Math.abs(self.touchDelta.x) + Math.abs(self.touchDelta.y) <\n self.attributes.touchDeadZone;\n if (isNaN(self.xPPS)) {\n self.xPPS = 0;\n }\n if (isNaN(self.yPPS)) {\n self.yPPS = 0;\n }\n if (isNaN(self.xPPST)) {\n self.xPPST = 0;\n }\n if (isNaN(self.yPPST)) {\n self.yPPST = 0;\n }\n self.touchAnimateTo.x =\n self.xPPS * self.attributes.touchReleaseAcceleration;\n self.touchAnimateTo.y =\n self.yPPS * self.attributes.touchReleaseAcceleration;\n self.calculatePPSTimed();\n if (\n !dz &&\n self.animationFrames === 0 &&\n (Math.abs(self.xPPST) > self.attributes.scrollAnimationPPSThreshold ||\n Math.abs(self.yPPST) > self.attributes.scrollAnimationPPSThreshold) &&\n !/-scroll-/.test((self.startingCell && self.startingCell.style) || '') &&\n !dz\n ) {\n self.stopAnimation = false;\n self.touchEndAnimation();\n }\n self.touchEndEvents(e);\n };\n self.touchcancel = function (e) {\n if (\n self.dispatchEvent('touchcancel', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n self.touchEndEvents(e);\n };\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals HTMLElement: false, Reflect: false, define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport { createHTMLString, createTextString } from './events/util';\n\nexport default function (self, ctor) {\n self.scale = 1;\n self.orders = {\n rows: [],\n columns: [],\n };\n self.appliedInlineStyles = {};\n self.cellGridAttributes = {};\n self.treeGridAttributes = {};\n self.visibleRowHeights = [];\n self.hasFocus = false;\n self.activeCell = {\n columnIndex: 0,\n rowIndex: 0,\n };\n self.innerHTML = '';\n self.storageName = 'canvasDataGrid';\n self.invalidSearchExpClass = 'canvas-datagrid-invalid-search-regExp';\n self.localStyleLibraryStorageKey = 'canvas-datagrid-user-style-library';\n self.dataType = 'application/x-canvas-datagrid';\n self.orderBy = null;\n self.orderDirection = 'asc';\n self.orderings = {\n columns: [],\n add: function (orderBy, orderDirection, sortFunction) {\n self.orderings.columns = self.orderings.columns.filter(function (col) {\n return col.orderBy !== orderBy;\n });\n self.orderings.columns.push({\n orderBy: orderBy,\n orderDirection: orderDirection,\n sortFunction: sortFunction,\n });\n },\n sort: function () {\n console.warn(\n 'grid.orderings.sort has been deprecated. Please use grid.refresh().',\n );\n\n self.orderings.columns.forEach(function (col) {\n self.viewData.sort(col.sortFunction(col.orderBy, col.orderDirection));\n });\n },\n };\n self.columnFilters = {};\n self.filters = {};\n self.frozenRow = 0;\n self.frozenColumn = 0;\n self.ellipsisCache = {};\n self.scrollCache = { x: [], y: [] };\n self.scrollBox = {};\n self.visibleRows = [];\n self.visibleCells = [];\n /**\n * Each item of this array contains these properties:\n * - `x`, `y`, `x2`, `y2`\n * - `orderIndex0`, `orderIndex1`: The closed interval of the hiding rows/columns.\n * - `dir`: The directon of the unhide indicator. 'l' and 'r' for columns, 't' and 'b' for rows\n */\n self.visibleUnhideIndicators = [];\n /**\n * Each item is a tuple conatins two numbers:\n * its type difination: Array<[beginRowIndex, endRowIndex]>\n * Each tuple represents a closed Interval\n */\n self.hiddenRowRanges = [];\n /**\n * This array stored all groups information with context for drawing,\n * it is generated by drawing functions,\n * and be used for searching groups when users operate on the spreadsheet\n * Each item of this array contains these properties:\n * - `type`: its available values: 'c' and 'r'. indicates the type of this item, 'c' for column group\n * and 'r' for row group.\n * - `x`,`y`: the left-top point of this group's rendering area.\n * - `x2`, `y2`: the right-bottom of this group's rendering area.\n * - `collapsed`: this value indicates the collapsed status of this group.\n * - `from`, `to`: The column index range of this group (We use this value for searching the group)\n * - `row`: The row index for column groups (We use this value for searching the group)\n */\n self.visibleGroups = [];\n self.sizes = {\n rows: {},\n columns: {},\n trees: {},\n };\n self.fillOverlay = {};\n self.filterable = {\n rows: [],\n columns: [],\n };\n self.selectedFilterButton = {\n columnIndex: -1,\n rowIndex: -1,\n };\n self.cellTree = {\n rows: [],\n columns: {},\n tempSchema: {},\n rowTreeColIndex: 0,\n columnTreeRowStartIndex: 0,\n columnTreeRowEndIndex: 0,\n origin: {\n rows: [],\n columns: {},\n },\n };\n self.hovers = {};\n self.attributes = {};\n self.style = {};\n self.formatters = {};\n self.sorters = {};\n self.parsers = {};\n self.schemaHashes = {};\n self.events = {};\n self.changes = [];\n self.scrollIndexTop = 0;\n self.scrollIndexBottom = 0;\n self.scrollIndexRight = 0;\n self.scrollPixelTop = 0;\n self.scrollIndexLeft = 0;\n self.scrollPixelLeft = 0;\n self.childGrids = {};\n self.openChildren = {};\n\n /**\n * Array for grouped columns\n * Each item in this array is an array and it represents some grouping in one row\n * A grouping descriptor has three properties:\n * - `from`: The column index of the first column\n * - `to`: The column index of the last column\n * - `collapsed`: Is this group be collapsed\n * @example [[{ from: 1, to: 2, collapsed: false }]]\n */\n self.groupedColumns = [];\n\n /**\n * Array for grouped rows\n * Each item in this array is an array and it represents some grouping in one column\n * A grouping descriptor has three properties:\n * - `from`: The row index of the first row\n * - `to`: The row index of the last row\n * - `collapsed`: Is this group be collapsed\n * @example [[{ from: 1, to: 2, collapsed: false }]]\n */\n self.groupedRows = [];\n\n self.scrollModes = [\n 'vertical-scroll-box',\n 'vertical-scroll-top',\n 'vertical-scroll-bottom',\n 'horizontal-scroll-box',\n 'horizontal-scroll-right',\n 'horizontal-scroll-left',\n ];\n self.componentL1Events = {};\n self.eventNames = [\n 'activecellchanged',\n 'afterdraw',\n 'afterrendercell',\n 'afterrenderfilterbutton',\n 'aftercreategroup',\n 'attributechanged',\n 'beforebeginedit',\n 'beforecreatecellgrid',\n 'beforedraw',\n 'beforeendedit',\n 'beforerendercell',\n 'beforerendercellgrid',\n 'beforerenderfilterbutton',\n 'beginedit',\n 'cellmouseout',\n 'cellmouseover',\n 'click',\n 'collapsetree',\n 'columnhide',\n 'columnunhide',\n 'contextmenu',\n 'copy',\n 'datachanged',\n 'dblclick',\n 'endedit',\n 'expandtree',\n 'formatcellvalue',\n 'keydown',\n 'keypress',\n 'keyup',\n 'mousedown',\n 'mousemove',\n 'mouseup',\n 'newrow',\n 'ordercolumn',\n 'rendercell',\n 'rendercellgrid',\n 'renderorderbyarrow',\n 'rendertext',\n 'rendertreearrow',\n 'reorder',\n 'reordering',\n 'resize',\n 'resizecolumn',\n 'resizerow',\n 'schemachanged',\n 'scroll',\n 'selectionchanged',\n 'stylechanged',\n 'touchcancel',\n 'touchend',\n 'touchmove',\n 'touchstart',\n 'wheel',\n ];\n self.mouse = { x: 0, y: 0 };\n\n self.getBoundRowIndexFromViewRowIndex = function (viewRowIndex) {\n if (self.boundRowIndexMap && self.boundRowIndexMap.has(viewRowIndex)) {\n return self.boundRowIndexMap.get(viewRowIndex);\n }\n\n return undefined;\n };\n self.getBoundColumnIndexFromViewColumnIndex = function (viewColumnIndex) {\n return self.orders.columns[viewColumnIndex];\n };\n /**\n * Get the height of the area about column groups for rendering and handling events.\n */\n self.getColumnGroupAreaHeight = function () {\n if (!self.attributes.allowGroupingColumns) {\n return 0;\n }\n const groups = self.groupedColumns.length;\n const base = self.style.columnGroupRowHeight * self.scale;\n return base * groups;\n };\n /**\n * Get the width of the area about row groups for rendering and handling events.\n */\n self.getRowGroupAreaWidth = function () {\n if (!self.attributes.allowGroupingRows) {\n return 0;\n }\n const groups = self.groupedRows.length;\n const base = self.style.rowGroupColumnWidth * self.scale;\n return base * groups;\n };\n self.getCollapsedColumnGroups = function () {\n const result = [];\n for (let rowIndex = 0; rowIndex < self.groupedColumns.length; rowIndex++) {\n const groups = self.groupedColumns[rowIndex];\n for (let groupIndex = 0; groupIndex < groups.length; groupIndex++) {\n const group = groups[groupIndex];\n if (group.collapsed) result.push(group);\n }\n }\n return result;\n };\n self.getCollapsedRowGroups = function () {\n const result = [];\n for (let rowIndex = 0; rowIndex < self.groupedRows.length; rowIndex++) {\n const groups = self.groupedRows[rowIndex];\n for (let groupIndex = 0; groupIndex < groups.length; groupIndex++) {\n const group = groups[groupIndex];\n if (group.collapsed) result.push(group);\n }\n }\n return result;\n };\n /**\n * Toggle the collapse status of a group (expanded/collapsed)\n * @param {{type:string,from:number,to:number}} group\n */\n self.toggleGroup = function (group) {\n if (group.type === 'c') {\n const { from, to } = group;\n /** @type {{from:number,to:number,collapsed:boolean}} */\n let matchedGroup;\n /** @type {Array<Array<{from:number,to:number,collapsed:boolean}>>} */\n const allGroups = self.groupedColumns;\n for (let i = 0; i < allGroups.length; i++) {\n const groups = allGroups[i];\n for (let gi = 0; gi < groups.length; gi++) {\n const group = groups[gi];\n if (group.from === from && group.to === to) {\n matchedGroup = group;\n break;\n }\n }\n if (matchedGroup) break;\n }\n if (!matchedGroup) return;\n const nextCollapsed = !matchedGroup.collapsed;\n matchedGroup.collapsed = nextCollapsed;\n return true;\n }\n if (group.type === 'r') {\n const { from, to } = group;\n /** @type {{from:number,to:number,collapsed:boolean}} */\n let matchedGroup;\n /** @type {Array<Array<{from:number,to:number,collapsed:boolean}>>} */\n const allGroups = self.groupedRows;\n for (let i = 0; i < allGroups.length; i++) {\n const groups = allGroups[i];\n for (let gi = 0; gi < groups.length; gi++) {\n const group = groups[gi];\n if (group.from === from && group.to === to) {\n matchedGroup = group;\n break;\n }\n }\n if (matchedGroup) break;\n }\n if (!matchedGroup) return;\n const nextCollapsed = !matchedGroup.collapsed;\n matchedGroup.collapsed = nextCollapsed;\n return true;\n }\n return false;\n };\n self.isNewGroupRangeValid = function (groupsArray, from, to) {\n for (let i = 0; i < groupsArray.length; i++) {\n const groups = groupsArray[i];\n for (let gIndex = 0; gIndex < groups.length; gIndex++) {\n const group = groups[gIndex];\n if (from === group.to + 1) return false;\n if (from > group.to) continue;\n\n if (from === group.from) {\n if (to === group.to) return false;\n if (to > group.to) return true;\n break; // check smaller range\n }\n if (from > group.from) {\n if (to > group.to) return false;\n break; // check smaller range\n }\n if (to < group.to) return false;\n return true;\n }\n }\n return true;\n };\n self.getColumnHeaderCellHeight = function () {\n if (!self.attributes.showColumnHeaders) {\n return 0;\n }\n return (\n (self.sizes.rows[-1] || self.style.columnHeaderCellHeight) * self.scale\n );\n };\n self.getRowHeaderCellWidth = function () {\n if (!self.attributes.showRowHeaders) {\n return 0;\n }\n return (\n (self.sizes.columns[-1] || self.style.rowHeaderCellWidth) * self.scale\n );\n };\n self.setStorageData = function () {\n if (!self.attributes.saveAppearance || !self.attributes.name) {\n return;\n }\n var visibility = {};\n self.getSchema().forEach(function (column) {\n visibility[column.name] = !column.hidden;\n });\n localStorage.setItem(\n self.storageName + '-' + self.attributes.name,\n JSON.stringify({\n sizes: {\n rows: self.sizes.rows,\n columns: self.sizes.columns,\n },\n orders: {\n rows: self.orders.rows,\n columns: self.orders.columns,\n },\n orderBy: self.orderBy,\n orderDirection: self.orderDirection,\n visibility: visibility,\n }),\n );\n };\n self.getSchema = function () {\n return self.schema || self.tempSchema || [];\n };\n function fillArray(low, high) {\n var i = [],\n x;\n for (x = low; x <= high; x += 1) {\n i[x] = x;\n }\n return i;\n }\n self.createColumnOrders = function () {\n var s = self.getSchema();\n self.orders.columns = fillArray(0, s.length - 1);\n };\n self.createRowOrders = function () {\n self.orders.rows = fillArray(0, self.originalData.length - 1);\n };\n self.getVisibleSchema = function () {\n return self.getSchema().filter(function (col) {\n return !col.hidden;\n });\n };\n self.applyDefaultValue = function (row, header, rowIndex) {\n var d = header.defaultValue || '';\n if (typeof d === 'function') {\n d = d.apply(self.intf, [header, rowIndex]);\n }\n row[header.name] = d;\n };\n self.createNewRowData = function () {\n self.newRow = {};\n\n // The third argument of applyDefaultValue is the row index\n // of the row for which to apply the default value. In this\n // case, we're creating a new row but not yet appending it\n // to self.originalData, so no row index exists\n const newRowIndex = undefined;\n\n self.getSchema().forEach(function forEachHeader(header) {\n self.applyDefaultValue(self.newRow, header, newRowIndex);\n });\n };\n self.getSchemaNameHash = function (key) {\n var n = 0;\n while (self.schemaHashes[key]) {\n n += 1;\n key = key + n;\n }\n return key;\n };\n self.filter = function (type) {\n var f = self.filters[type];\n if (!f && type !== undefined) {\n console.warn(\n 'Cannot find filter for type %s, falling back to substring match.',\n type,\n );\n f = self.filters.string;\n }\n return f;\n };\n self.hasActiveFilters = function () {\n return self.columnFilters && Object.keys(self.columnFilters).length > 0;\n };\n self.hasCollapsedRowGroup = function () {\n for (let i = 0; i < self.groupedRows.length; i++) {\n const groups = self.groupedRows[i];\n for (let j = 0; j < groups.length; j++) {\n const g = groups[j];\n if (g.collapsed) return true;\n }\n }\n return false;\n };\n self.getFilteredAndSortedViewData = function (originalData) {\n // We make a copy of originalData here in order be able to\n // filter and sort rows without modifying the original array.\n // Each row is turned into a (row, rowIndex) tuple\n // so that when we apply filters, we can refer back to the\n // row's original row number in originalData. This becomes\n // useful when emitting cell events.\n let newViewData = originalData.map((row, originalRowIndex) => [\n row,\n originalRowIndex,\n ]);\n\n // Remove hidden rows here. So we can keep the bound indexes correct\n if (self.hiddenRowRanges.length > 0) {\n const ranges = self.hiddenRowRanges.sort((a, b) => b[1] - a[1]);\n for (let i = 0; i < ranges.length; i++) {\n const [beginRowIndex, endRowIndex] = ranges[i];\n const countOfRows = endRowIndex - beginRowIndex + 1;\n newViewData.splice(beginRowIndex, countOfRows);\n }\n }\n\n // Apply filtering\n for (const [headerName, filterText] of Object.entries(self.columnFilters)) {\n const header = self.getHeaderByName(headerName);\n\n if (!header) {\n continue;\n }\n\n const currentFilterFunction =\n header.filter || self.filter(header.type || 'string');\n\n newViewData = newViewData.filter(function ([row, originalRowIndex]) {\n if (\n self.attributes.allowFreezingRows &&\n !self.attributes.filterFrozenRows &&\n originalRowIndex < self.frozenRow\n )\n return true;\n\n return currentFilterFunction(row[headerName], filterText);\n });\n }\n\n //#region Hide rows from collapsed group\n /** @type {number[][]} */\n let collapsedGroups = [];\n for (let i = 0; i < self.groupedRows.length; i++) {\n const rows = self.groupedRows[i];\n for (let j = 0; j < rows.length; j++) {\n const r = rows[j];\n if (!r.collapsed) continue;\n collapsedGroups.push([r.from, r.to]);\n }\n }\n if (collapsedGroups.length > 0) {\n //#region merge groups\n collapsedGroups.sort((a, b) => a[0] - b[0]);\n let newLen = 0;\n const len = collapsedGroups.length;\n for (let i = 0; i < len; i++) {\n const r = collapsedGroups[i];\n if (i === len - 1) {\n collapsedGroups[newLen++] = r;\n break;\n }\n const to = r[1];\n const [from2, to2] = collapsedGroups[i + 1];\n if (from2 > to + 1) {\n collapsedGroups[newLen++] = r;\n continue;\n }\n collapsedGroups[i + 1] = r;\n if (to2 > to) collapsedGroups[i + 1][1] = to2;\n }\n collapsedGroups = collapsedGroups.slice(0, newLen);\n //#endregion merge groups\n\n //#region omit rows by groups\n let g = collapsedGroups.shift();\n for (let start = 0; start < newViewData.length; start++) {\n const it = newViewData[start][1];\n if (it < g[0]) continue;\n let end = start + 1;\n for (; end < newViewData.length; end++) {\n const it2 = newViewData[end][1];\n if (it2 > g[1]) break;\n }\n newViewData.splice(start, end - start);\n g = collapsedGroups.shift();\n if (!g) break;\n start--;\n }\n //#endregion omit rows by groups\n }\n //#endregion Hide rows from collapsed group\n\n // Apply sorting\n for (const column of self.orderings.columns) {\n const sortFn = column.sortFunction(column.orderBy, column.orderDirection);\n\n newViewData.sort(([rowA], [rowB, rowIndexB]) => {\n if (\n self.attributes.allowFreezingRows &&\n !self.attributes.sortFrozenRows &&\n rowIndexB < self.frozenRow\n )\n return 0;\n return sortFn(rowA, rowB);\n });\n }\n\n return {\n viewData: newViewData.map(([row]) => row),\n boundRowIndexMap: new Map(\n newViewData.map(([_row, originalRowIndex], viewRowIndex) => [\n viewRowIndex,\n originalRowIndex,\n ]),\n ),\n };\n };\n self.refresh = function () {\n const { viewData, boundRowIndexMap } = self.getFilteredAndSortedViewData(\n self.originalData,\n );\n\n self.viewData = viewData;\n self.boundRowIndexMap = boundRowIndexMap;\n\n self.resize();\n self.draw(true);\n };\n self.getBestGuessDataType = function (columnName, data) {\n var t,\n x,\n l = data.length;\n for (x = 0; x < l; x += 1) {\n if (\n data[x] !== undefined &&\n data[x] !== null &&\n [null, undefined].indexOf(data[x][columnName]) !== -1\n ) {\n t = typeof data[x];\n return t === 'object' ? 'string' : t;\n }\n }\n return 'string';\n };\n self.drawChildGrids = function () {\n Object.keys(self.childGrids).forEach(function (gridKey) {\n self.childGrids[gridKey].draw();\n });\n };\n self.resizeChildGrids = function () {\n Object.keys(self.childGrids).forEach(function (gridKey) {\n self.childGrids[gridKey].resize();\n });\n };\n self.autoScrollZone = function (e, x, y, ctrl) {\n var setTimer,\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n columnHeaderCellHeight = self.getColumnHeaderCellHeight();\n if (x !== -1) {\n if (x > self.width - self.attributes.selectionScrollZone) {\n self.scrollBox.scrollLeft += self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n if (x - self.attributes.selectionScrollZone - rowHeaderCellWidth < 0) {\n self.scrollBox.scrollLeft -= self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n }\n if (y !== -1) {\n if (y > self.height - self.attributes.selectionScrollZone) {\n self.scrollBox.scrollTop += self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n if (\n y - self.attributes.selectionScrollZone - columnHeaderCellHeight <\n 0\n ) {\n self.scrollBox.scrollTop -= self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n }\n if (\n setTimer &&\n !ctrl &&\n self.currentCell &&\n self.currentCell.columnIndex !== -1\n ) {\n self.scrollTimer = setTimeout(\n self.mousemove,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n };\n self.validateColumn = function (c, s) {\n if (!c.name) {\n throw new Error('A column must contain at least a name.');\n }\n if (\n s.filter(function (i) {\n return i.name === c.name;\n }).length > 0\n ) {\n throw new Error(\n 'A column with the name ' +\n c.name +\n ' already exists and cannot be added again.',\n );\n }\n return true;\n };\n self.setDefaults = function (obj1, obj2, key, def) {\n obj1[key] = obj2[key] === undefined ? def : obj2[key];\n };\n self.setAttributes = function () {\n self.defaults.attributes.forEach(function eachAttribute(i) {\n self.setDefaults(self.attributes, self.args, i[0], i[1]);\n });\n };\n self.setStyle = function () {\n self.defaults.styles.forEach(function eachStyle(i) {\n self.setDefaults(self.style, self.args.style || {}, i[0], i[1]);\n });\n };\n self.autosize = function (colName) {\n self.getVisibleSchema().forEach(function (col, colIndex) {\n if (col.name === colName || colName === undefined) {\n self.sizes.columns[colIndex] = Math.max(\n self.findColumnMaxTextLength(col.name),\n self.style.minColumnWidth,\n );\n }\n });\n self.sizes.columns[-1] = self.findColumnMaxTextLength('cornerCell');\n };\n self.dispose = function () {\n // dispose is idempotent (#338, #455): a second call is a no-op\n if (self.disposed) {\n return;\n }\n self.disposed = true;\n // child (tree) grids first\n Object.keys(self.openChildren || {}).forEach(function (key) {\n var child = self.openChildren[key];\n if (child && typeof child.dispose === 'function') {\n child.dispose();\n }\n });\n if (self.contextMenu) {\n self.disposeContextMenu();\n }\n document.removeEventListener('click', self.disposeContextMenu);\n if (self.resizeObserver) {\n self.resizeObserver.disconnect();\n self.resizeObserver = undefined;\n }\n if (self.resizeObserverFrame) {\n cancelAnimationFrame(self.resizeObserverFrame);\n self.resizeObserverFrame = undefined;\n }\n if (!self.isChildGrid && self.canvas && self.canvas.parentNode) {\n self.canvas.parentNode.removeChild(self.canvas);\n }\n if (\n !self.isChildGrid &&\n self.controlInput &&\n self.controlInput.parentNode\n ) {\n self.controlInput.parentNode.removeChild(self.controlInput);\n }\n if (self.eventParent) {\n self.eventParent.removeEventListener('scroll', self.resize, false);\n self.eventParent.removeEventListener('mouseup', self.mouseup, false);\n self.eventParent.removeEventListener('touchstart', self.touchstart);\n }\n document.body.removeEventListener('touchmove', self.touchmove);\n document.body.removeEventListener('touchend', self.touchend, false);\n document.body.removeEventListener('touchcancel', self.touchcancel, false);\n self.eventParent.removeEventListener('mousedown', self.mousedown, false);\n self.eventParent.removeEventListener('dblclick', self.dblclick, false);\n self.eventParent.removeEventListener('click', self.click, false);\n self.eventParent.removeEventListener('mousemove', self.mousemove);\n self.eventParent.removeEventListener('wheel', self.scrollWheel, false);\n self.canvas.removeEventListener(\n 'contextmenu',\n self.contextmenuEvent,\n false,\n );\n self.canvas.removeEventListener('copy', self.copy);\n self.controlInput.removeEventListener('copy', self.copy);\n self.controlInput.removeEventListener('cut', self.cut);\n self.controlInput.removeEventListener('paste', self.paste);\n self.controlInput.removeEventListener('keypress', self.keypress, false);\n self.controlInput.removeEventListener('keyup', self.keyup, false);\n self.controlInput.removeEventListener('keydown', self.keydown, false);\n window.removeEventListener('mouseup', self.mouseup, false);\n window.removeEventListener('mouseup', self.mouseupOutsideGrid, false);\n window.removeEventListener('mousemove', self.mousemove);\n window.removeEventListener('resize', self.resize);\n // the MutationObserver is created by the web component wrapper and kept\n // on the host element (#237, #338)\n var observer = self.observer || (self.intf && self.intf.observer);\n if (observer && observer.disconnect) {\n observer.disconnect();\n }\n if (self.intf) {\n self.intf.observer = undefined;\n }\n };\n self.tryLoadStoredSettings = function () {\n var s;\n self.reloadStoredValues();\n if (\n self.storedSettings &&\n typeof self.storedSettings.orders === 'object' &&\n self.storedSettings.orders !== null\n ) {\n if (\n self.storedSettings.orders.rows.length >= (self.viewData || []).length\n ) {\n self.orders.rows = self.storedSettings.orders.rows;\n }\n s = self.getSchema();\n if (self.storedSettings.orders.columns.length === s.length) {\n self.orders.columns = self.storedSettings.orders.columns;\n }\n self.orderBy =\n self.storedSettings.orderBy === undefined\n ? s[0].name\n : self.storedSettings.orderBy;\n self.orderDirection =\n self.storedSettings.orderDirection === undefined\n ? 'asc'\n : self.storedSettings.orderDirection;\n if (\n self.storedSettings.orderBy !== undefined &&\n self.getHeaderByName(self.orderBy) &&\n self.orderDirection\n ) {\n self.order(self.orderBy, self.orderDirection);\n }\n }\n };\n self.toggleCollapseTree = function (rowIndex, columnIndex, type) {\n let tempData = [];\n let collapsedCount = 0;\n if (\n columnIndex == self.cellTree.rowTreeColIndex &&\n (rowIndex > 0 || (rowIndex == 0 && self.cellTree.rows[0].icon))\n ) {\n let ctr = self.cellTree.rows;\n switch (type) {\n case 'Expand':\n ctr[rowIndex].expand = true;\n self.cellTree.origin.rows[ctr[rowIndex].index].expand = true;\n break;\n\n case 'Collapse':\n ctr[rowIndex].expand = false;\n self.cellTree.origin.rows[ctr[rowIndex].index].expand = false;\n break;\n\n default:\n ctr[rowIndex].expand = !ctr[rowIndex].expand;\n self.cellTree.origin.rows[ctr[rowIndex].index].expand =\n ctr[rowIndex].expand;\n }\n for (\n let ri = ctr[rowIndex].index + 1;\n ri <= ctr[rowIndex].lastchild;\n ri++\n ) {\n let orTree = self.cellTree.origin.rows[ri];\n if (ctr[rowIndex].expand) {\n orTree.hide = false;\n if (orTree.icon && !orTree.expand) ri = orTree.lastchild;\n } else {\n orTree.hide = true;\n }\n }\n } else if (self.cellTree.columns[rowIndex]) {\n let ctc = self.cellTree.columns[rowIndex];\n\n switch (type) {\n case 'Expand':\n ctc[columnIndex].expand = true;\n break;\n\n case 'Collapse':\n ctc[columnIndex].expand = false;\n break;\n\n default:\n ctc[columnIndex].expand = !ctc[columnIndex].expand;\n }\n for (\n let ci = ctc[columnIndex].index + 1;\n ci <= ctc[columnIndex].lastchild;\n ci++\n ) {\n if (ctc[columnIndex].expand)\n self.cellTree.tempSchema[ci].hidden = false;\n else self.cellTree.tempSchema[ci].hidden = true;\n }\n let rc = 0,\n _ri;\n\n if (ctc[columnIndex].expand) {\n while (rc < ctc[columnIndex].child) {\n _ri = rowIndex + rc + 1;\n\n for (\n let _ci = ctc[columnIndex].index;\n _ci <= ctc[columnIndex].lastchild;\n _ci++\n ) {\n if (\n self.cellTree.origin.columns[_ri] &&\n self.cellTree.origin.columns[_ri][_ci].icon &&\n !self.cellTree.origin.columns[_ri][_ci].expand\n ) {\n for (\n let si = _ci + 1;\n si <= self.cellTree.origin.columns[_ri][_ci].lastchild;\n si++\n ) {\n self.cellTree.tempSchema[si].hidden = true;\n }\n }\n }\n\n rc++;\n }\n }\n }\n let otherData = {};\n let collapsed = [];\n self.cellTree.rows = [];\n self.cellTree.columns = {};\n for (let k in self.cellTree.origin.rows) {\n let tempRow = [];\n let tree = self.cellTree.origin.rows[k];\n if (!tree.hide) {\n let colTrees = [];\n let collapsedColCount = 0;\n if (k < self.cellTree.columnTreeRowStartIndex) {\n tempData.push(self.originalData[k]);\n } else {\n if (k > self.cellTree.columnTreeRowEndIndex) {\n otherData[k] = self.viewData[k];\n collapsedCount++;\n } else {\n for (let l = 0; l < self.originalData[k].length; l++) {\n if (!self.cellTree.tempSchema[l].hidden) {\n if (l < self.cellTree.rowTreeColIndex) {\n if (!Object.prototype.hasOwnProperty.call(otherData, k))\n otherData[k] = [];\n otherData[k].push(self.viewData[k][l]);\n }\n tempRow.push(self.originalData[k][l]);\n if (\n Object.prototype.hasOwnProperty.call(\n self.cellTree.origin.columns,\n k,\n )\n )\n colTrees.push(self.cellTree.origin.columns[k][l]);\n } else collapsedColCount++;\n }\n tempRow.push(...Array(collapsedColCount).fill(''));\n if (colTrees.length) {\n colTrees.push(\n ...Array(collapsedColCount)\n .fill()\n .map(() => {\n return {};\n }),\n );\n self.cellTree.columns[k] = colTrees;\n }\n tempData.push(tempRow);\n }\n }\n self.cellTree.rows.push(tree);\n } else {\n for (let l = 0; l < self.cellTree.rowTreeColIndex; l++) {\n tempRow.push(self.viewData[k][l]);\n }\n otherData[k] = tempRow;\n collapsed.push(Array(self.viewData[0].length).fill(''));\n collapsedCount++;\n }\n }\n if (collapsedCount) {\n self.cellTree.rows.push(\n ...Array(collapsedCount)\n .fill()\n .map((u, index) => {\n return { index: self.cellTree.rows.length + index };\n }),\n );\n tempData.push(...collapsed);\n }\n for (let k in otherData) {\n if (k > self.cellTree.columnTreeRowEndIndex) tempData[k] = otherData[k];\n else\n for (let l in otherData[k]) {\n tempData[k][l] = otherData[k][l];\n }\n }\n self.viewData = tempData;\n };\n self.cellTreeExpandCollapse = function (rowIndex, columnIndex, type) {\n if (\n columnIndex == self.cellTree.rowTreeColIndex &&\n (rowIndex > 0 || (rowIndex == 0 && self.cellTree.rows[0].icon))\n ) {\n const ctr = self.cellTree.rows;\n switch (type) {\n case 'Expand':\n ctr[rowIndex].expand = true;\n break;\n case 'Collapse':\n ctr[rowIndex].expand = false;\n break;\n default:\n ctr[rowIndex].expand = !ctr[rowIndex].expand;\n }\n for (let ri = rowIndex + 1; ri <= ctr[rowIndex].lastchild; ri++) {\n if (ctr[rowIndex].expand) {\n ctr[ri].hide = false;\n if (ctr[ri].icon && !ctr[ri].expand) ri = ctr[ri].lastchild;\n } else {\n ctr[ri].hide = true;\n }\n }\n } else if (self.cellTree.columns[rowIndex]) {\n const ctc = self.cellTree.columns[rowIndex];\n switch (type) {\n case 'Expand':\n ctc[columnIndex].expand = true;\n break;\n case 'Collapse':\n ctc[columnIndex].expand = false;\n break;\n default:\n ctc[columnIndex].expand = !ctc[columnIndex].expand;\n }\n\n for (let ci = columnIndex + 1; ci <= ctc[columnIndex].lastchild; ci++) {\n if (ctc[columnIndex].expand) self.tempSchema[ci].hidden = false;\n else self.tempSchema[ci].hidden = true;\n }\n\n let rc = 0,\n ri;\n if (ctc[columnIndex].expand) {\n while (rc < ctc[columnIndex].child) {\n ri = rowIndex + rc + 1;\n for (let ci = columnIndex; ci <= ctc[columnIndex].lastchild; ci++) {\n if (\n self.cellTree.columns[ri] &&\n self.cellTree.columns[ri][ci].icon &&\n !self.cellTree.columns[ri][ci].expand\n ) {\n for (\n let si = ci + 1;\n si <= self.cellTree.columns[ri][ci].lastchild;\n si++\n )\n self.tempSchema[si].hidden = true;\n }\n }\n rc++;\n }\n }\n }\n };\n\n self.initCellTreeSettings = function () {\n if (self.viewData === undefined) return;\n if (self.attributes.rowTree.length > 0 && self.viewData.length > 0) {\n self.cellTree.rows = Array(self.viewData.length)\n .fill()\n .map((u, index) => ({ index: index }));\n self.cellTree.rowTreeColIndex = self.attributes.rowTreeColIndex;\n let invalidRowTree = false;\n for (let rt of self.attributes.rowTree) {\n if (self.cellTree.rows.length <= rt.end) {\n invalidRowTree = true;\n break;\n }\n\n for (let ri = rt.begin; ri <= rt.end; ri++) {\n if (ri == rt.begin) {\n self.cellTree.rows[ri].icon = true;\n self.cellTree.rows[ri].lastchild = rt.end;\n self.cellTree.rows[ri].expand = true;\n if (!self.cellTree.rows[ri].parentCount)\n self.cellTree.rows[ri].parentCount = 0;\n } else {\n self.cellTree.rows[ri].hide = false;\n self.cellTree.rows[ri].parentIndex = rt.begin;\n if (self.cellTree.rows[ri] && self.cellTree.rows[ri].parentCount)\n self.cellTree.rows[ri].parentCount += 1;\n else self.cellTree.rows[ri].parentCount = 1;\n }\n }\n }\n if (invalidRowTree) self.cellTree.rows = {};\n }\n if (self.attributes.columnTree.length > 0 && self.viewData.length > 0) {\n self.cellTree.columnTreeRowStartIndex =\n self.attributes.columnTreeRowStartIndex;\n self.cellTree.columnTreeRowEndIndex =\n self.attributes.columnTreeRowEndIndex;\n let dataColumnLength = Object.keys(self.viewData[0]).length;\n let invalidColumnTree = false;\n for (let ct of self.attributes.columnTree) {\n if (dataColumnLength <= ct.end) {\n invalidColumnTree = true;\n break;\n }\n\n if (!self.cellTree.columns[ct.row])\n self.cellTree.columns[ct.row] = Array(dataColumnLength)\n .fill()\n .map((u, index) => ({ index: index }));\n\n for (let i = ct.begin; i <= ct.end; i++) {\n const ctc = self.cellTree.columns[ct.row][i];\n if (i == ct.begin) {\n ctc.icon = true;\n ctc.lastchild = ct.end;\n ctc.length = ct.end - ct.begin;\n ctc.expand = true;\n if (ct.child) ctc.child = ct.child;\n else ctc.child = 0;\n }\n }\n }\n self.cellTree.tempSchema = Array(dataColumnLength)\n .fill()\n .map(function () {\n return { hidden: false };\n });\n if (invalidColumnTree) self.cellTree.columns = {};\n }\n self.cellTree.origin = {\n rows: self.cellTree.rows,\n columns: self.cellTree.columns,\n };\n };\n\n self.getDomRoot = function () {\n return self.shadowRoot ? self.shadowRoot.host : self.parentNode;\n };\n /**\n * Parses a CSS font shorthand (`[style] [variant] [weight] [stretch]\n * size[/line-height] family`) into the pieces the grid needs to rebuild a\n * scaled font string. Sizes in pt/em/rem/% are converted to px (#157).\n * @param {string} fontStyle A CSS font value such as `bold 14px Roboto, sans-serif`.\n * @returns {{prefix: string, height: number, name: string}}\n */\n self.parseFont = function (fontStyle) {\n var value = String(\n fontStyle === undefined || fontStyle === null ? '' : fontStyle,\n ).trim();\n var m = /(\\d*\\.?\\d+)(px|pt|em|rem|%)?(?:\\s*\\/\\s*[\\w.%]+)?\\s+(.+)$/.exec(\n value,\n );\n if (!m) {\n return {\n prefix: '',\n height: parseFloat(value) || 0,\n name: value.replace(/\\d+\\.?\\d*px/, '').trim(),\n };\n }\n var size = parseFloat(m[1]),\n unit = m[2] || 'px',\n height = size;\n if (unit === 'pt') {\n height = size * (4 / 3);\n } else if (unit === 'em' || unit === 'rem') {\n height = size * 16;\n } else if (unit === '%') {\n height = size * 0.16;\n }\n return {\n prefix: value.slice(0, m.index).trim(),\n height: height,\n name: m[3].trim(),\n };\n };\n self.getFontName = function (fontStyle) {\n return self.parseFont(fontStyle).name;\n };\n self.getFontHeight = function (fontStyle) {\n return self.parseFont(fontStyle).height;\n };\n /**\n * Builds the canvas font string for a `*Font` style key at the current\n * scale, keeping any style/weight prefix from the shorthand (#157).\n * @param {string} styleKey e.g. `cellFont`.\n * @returns {string}\n */\n self.getScaledFont = function (styleKey) {\n var prefix = self.style[styleKey + 'Prefix'];\n return (\n (prefix ? prefix + ' ' : '') +\n self.style[styleKey + 'Height'] * self.scale +\n 'px ' +\n self.style[styleKey + 'Name']\n );\n };\n self.parseStyleValue = function (key) {\n if (/Font/.test(key)) {\n var font = self.parseFont(self.style[key]);\n self.style[key + 'Height'] = font.height;\n self.style[key + 'Name'] = font.name;\n self.style[key + 'Prefix'] = font.prefix;\n return;\n }\n // when inheriting styles from already instantiated grids, don't parse already parsed values.\n if (\n key === 'moveOverlayBorderSegments' &&\n typeof self.style[key] === 'string'\n ) {\n self.style[key] = self.style[key].split(',').map(function (i) {\n return parseInt(i, 10);\n });\n }\n };\n self.initProp = function (propName) {\n if (!self.args[propName]) {\n return;\n }\n Object.keys(self.args[propName]).forEach(function (key) {\n self[propName][key] = self.args[propName][key];\n });\n };\n self.getStyleProperty = function (key) {\n if (self.styleKeys.indexOf(key) === -1) {\n return self.parentNodeStyle[key];\n }\n return self.style[key];\n };\n self.setStyleProperty = function (key, value, supressDrawAndEvent) {\n var isDim =\n [\n 'height',\n 'width',\n 'minHeight',\n 'minWidth',\n 'maxHeight',\n 'maxWidth',\n ].indexOf(key) !== -1;\n if (self.styleKeys.indexOf(key) === -1) {\n self.parentNodeStyle[key] = value;\n } else {\n if (/-/.test(key)) {\n key = self.dehyphenateProperty(key);\n }\n self.style[key] = value;\n self.parseStyleValue(key);\n }\n if (isDim) {\n self.resize();\n }\n if (!supressDrawAndEvent) {\n self.draw(true);\n self.dispatchEvent('stylechanged', { name: 'style', value: value });\n }\n };\n self.reloadStoredValues = function () {\n if (self.attributes.name && self.attributes.saveAppearance) {\n try {\n self.storedSettings = localStorage.getItem(\n self.storageName + '-' + self.attributes.name,\n );\n } catch (e) {\n console.warn('Error loading stored values. ' + e.message);\n self.storedSettings = undefined;\n }\n if (self.storedSettings) {\n try {\n self.storedSettings = JSON.parse(self.storedSettings);\n } catch (e) {\n console.warn('could not read settings from localStore', e);\n self.storedSettings = undefined;\n }\n }\n if (self.storedSettings) {\n if (\n typeof self.storedSettings.sizes === 'object' &&\n self.storedSettings.sizes !== null\n ) {\n self.sizes.rows = self.storedSettings.sizes.rows;\n self.sizes.columns = self.storedSettings.sizes.columns;\n ['trees', 'columns', 'rows'].forEach(function (i) {\n if (!self.sizes[i]) {\n self.sizes[i] = {};\n }\n });\n }\n if (typeof self.storedSettings.visibility === 'object') {\n self.getSchema().forEach(function (column) {\n if (\n self.storedSettings.visibility &&\n self.storedSettings.visibility[column.name] !== undefined\n ) {\n column.hidden = !self.storedSettings.visibility[column.name];\n }\n });\n }\n }\n }\n };\n self.init = function () {\n if (self.initialized) {\n return;\n }\n function addStyleKeyIfNoneExists(key) {\n if (self.styleKeys.indexOf(key) === -1) {\n self.styleKeys.push(key);\n }\n }\n var publicStyleKeyIntf = {};\n self.setAttributes();\n self.setStyle();\n self.initScrollBox();\n self.setDom();\n self.nodeType = 'canvas-datagrid';\n self.ie = /Trident/.test(window.navigator.userAgent);\n self.edge = /Edge/.test(window.navigator.userAgent);\n self.webKit = /WebKit/.test(window.navigator.userAgent);\n self.moz = /Gecko/.test(window.navigator.userAgent);\n self.mobile = /Mobile/i.test(window.navigator.userAgent);\n self.blankValues = [undefined, null, ''];\n self.cursorGrab = 'grab';\n self.cursorGrabing = 'grabbing';\n self.cursorGrab = self.webKit ? '-webkit-grab' : self.cursorGrab;\n self.cursorGrabing = self.moz ? '-webkit-grabbing' : self.cursorGrabbing;\n self.pointerLockPosition = { x: 0, y: 0 };\n Object.keys(self.style).forEach(self.parseStyleValue);\n self.intf.moveSelection = self.moveSelection;\n self.intf.deleteSelectedData = self.deleteSelectedData;\n self.intf.moveTo = self.moveTo;\n self.intf.addEventListener = self.addEventListener;\n self.intf.removeEventListener = self.removeEventListener;\n self.intf.dispatchEvent = self.dispatchEvent;\n /**\n * Releases grid resources and removes grid elements.\n * @memberof canvasDatagrid\n * @name dispose\n * @method\n */\n self.intf.dispose = self.dispose;\n /**\n * Appends the grid to another element later. Not implemented.\n * @memberof canvasDatagrid\n * @name appendTo\n * @method\n * @param {number} el The element to append the grid to.\n */\n self.intf.appendTo = self.appendTo;\n self.intf.getVisibleCellByIndex = self.getVisibleCellByIndex;\n self.intf.filters = self.filters;\n self.intf.sorters = self.sorters;\n self.intf.autosize = self.autosize;\n self.intf.beginEditAt = self.beginEditAt;\n self.intf.endEdit = self.endEdit;\n self.intf.setActiveCell = self.setActiveCell;\n self.intf.forEachSelectedCell = self.forEachSelectedCell;\n self.intf.scrollIntoView = self.scrollIntoView;\n self.intf.clearChangeLog = self.clearChangeLog;\n self.intf.gotoCell = self.gotoCell;\n self.intf.gotoRow = self.gotoRow;\n self.intf.addButton = self.addButton;\n self.intf.toggleCellCollapseTree = self.toggleCellCollapseTree;\n self.intf.expandCollapseCellTree = self.expandCollapseCellTree;\n self.intf.getHeaderByName = self.getHeaderByName;\n self.intf.getColumnWidth = self.getColumnWidth;\n self.intf.getRowHeight = self.getRowHeight;\n // internal: used by the web component connected/disconnected callbacks\n self.intf.observeResizeTargets = self.observeResizeTargets;\n self.intf.unobserveResizeTargets = self.unobserveResizeTargets;\n self.intf.findColumnScrollLeft = self.findColumnScrollLeft;\n self.intf.findRowScrollTop = self.findRowScrollTop;\n self.intf.fitColumnToValues = self.fitColumnToValues;\n self.intf.findColumnMaxTextLength = self.findColumnMaxTextLength;\n self.intf.disposeContextMenu = self.disposeContextMenu;\n self.intf.getCellAt = self.getCellAt;\n self.intf.groupColumns = self.groupColumns;\n self.intf.groupRows = self.groupRows;\n self.intf.removeGroupColumns = self.removeGroupColumns;\n self.intf.removeGroupRows = self.removeGroupRows;\n self.intf.toggleGroupColumns = self.toggleGroupColumns;\n self.intf.toggleGroupRows = self.toggleGroupRows;\n self.intf.getGroupsColumnBelongsTo = self.getGroupsColumnBelongsTo;\n self.intf.getGroupsRowBelongsTo = self.getGroupsRowBelongsTo;\n self.intf.isCellVisible = self.isCellVisible;\n self.intf.isRowVisible = self.isRowVisible;\n self.intf.isColumnVisible = self.isColumnVisible;\n self.intf.order = self.order;\n self.intf.draw = self.draw;\n self.intf.refresh = self.refresh;\n self.intf.isComponent = self.isComponent;\n self.intf.selectArea = self.selectArea;\n self.intf.clipElement = self.clipElement;\n self.intf.getSchemaFromData = self.getSchemaFromData;\n self.intf.setFilter = self.setFilter;\n self.intf.parentGrid = self.parentGrid;\n self.intf.toggleTree = self.toggleTree;\n self.intf.expandTree = self.expandTree;\n self.intf.collapseTree = self.collapseTree;\n self.intf.canvas = self.canvas;\n self.intf.context = self.ctx;\n self.intf.insertRow = self.insertRow;\n self.intf.deleteRow = self.deleteRow;\n self.intf.addRow = self.addRow;\n self.intf.insertColumn = self.insertColumn;\n self.intf.deleteColumn = self.deleteColumn;\n self.intf.addColumn = self.addColumn;\n self.intf.getClippingRect = self.getClippingRect;\n self.intf.setRowHeight = self.setRowHeight;\n self.intf.setColumnWidth = self.setColumnWidth;\n self.intf.resetColumnWidths = self.resetColumnWidths;\n self.intf.resetRowHeights = self.resetRowHeights;\n self.intf.resize = self.resize;\n self.intf.selectColumn = self.selectColumn;\n self.intf.selectRow = self.selectRow;\n self.intf.selectAll = self.selectAll;\n self.intf.selectNone = self.selectNone;\n self.intf.drawChildGrids = self.drawChildGrids;\n self.intf.assertPxColor = self.assertPxColor;\n self.intf.clearPxColorAssertions = self.clearPxColorAssertions;\n self.intf.integerToAlpha = self.integerToAlpha;\n self.intf.copy = self.copy;\n self.intf.cut = self.cut;\n self.intf.paste = self.paste;\n self.intf.setStyleProperty = self.setStyleProperty;\n self.intf.hideColumns = self.hideColumns;\n self.intf.unhideColumns = self.unhideColumns;\n self.intf.hideRows = self.hideRows;\n self.intf.unhideRows = self.unhideRows;\n Object.defineProperty(self.intf, 'defaults', {\n get: function () {\n return {\n styles: self.defaults.styles.reduce(function (a, i) {\n a[i[0]] = i[1];\n return a;\n }, {}),\n attributes: self.defaults.attributes.reduce(function (a, i) {\n a[i[0]] = i[1];\n return a;\n }, {}),\n };\n },\n });\n self.styleKeys = Object.keys(self.intf.defaults.styles);\n self.styleKeys\n .map(function (i) {\n return self.hyphenateProperty(i, false);\n })\n .forEach(addStyleKeyIfNoneExists);\n self.styleKeys\n .map(function (i) {\n return self.hyphenateProperty(i, true);\n })\n .forEach(addStyleKeyIfNoneExists);\n self.DOMStyles = window.getComputedStyle(document.body, null);\n self.styleKeys.concat(Object.keys(self.DOMStyles)).forEach(function (key) {\n // unless this line is here, Object.keys() will not work on <instance>.style\n publicStyleKeyIntf[key] = undefined;\n Object.defineProperty(publicStyleKeyIntf, key, {\n get: function () {\n return self.getStyleProperty(key);\n },\n set: function (value) {\n if (self.initialized) {\n self.appliedInlineStyles[key] = value;\n }\n self.setStyleProperty(key, value);\n },\n });\n });\n Object.defineProperty(self.intf, 'shadowRoot', {\n get: function () {\n return self.shadowRoot;\n },\n });\n Object.defineProperty(self.intf, 'activeCell', {\n get: function () {\n return self.activeCell;\n },\n });\n Object.defineProperty(self.intf, 'hasFocus', {\n get: function () {\n return self.hasFocus;\n },\n });\n Object.defineProperty(self.intf, 'hasActiveFilters', {\n get: function () {\n return self.hasActiveFilters();\n },\n });\n Object.defineProperty(self.intf, 'style', {\n get: function () {\n return publicStyleKeyIntf;\n },\n set: function (valueObject) {\n Object.keys(valueObject).forEach(function (key) {\n self.setStyleProperty(key, valueObject[key], true);\n });\n self.draw(true);\n self.dispatchEvent('stylechanged', {\n name: 'style',\n value: valueObject,\n });\n },\n });\n Object.defineProperty(self.intf, 'attributes', { value: {} });\n Object.keys(self.attributes).forEach(function (key) {\n Object.defineProperty(self.intf.attributes, key, {\n get: function () {\n return self.attributes[key];\n },\n set: function (value) {\n self.attributes[key] = value;\n if (key === 'name') {\n self.tryLoadStoredSettings();\n }\n if (\n key === 'rowTree' ||\n key === 'columnTree' ||\n key === 'columnTreeRowEndIndex'\n ) {\n self.initCellTreeSettings();\n }\n if (key === 'fillLastColumn') {\n self.resize(true);\n } else {\n self.draw(true);\n }\n self.dispatchEvent('attributechanged', {\n name: key,\n value: value[key],\n });\n },\n });\n });\n self.filters.string = function (value, filterFor) {\n if (filterFor === self.attributes.blanksText) {\n return self.blankValues.includes(\n value == null ? value : String(value).trim(),\n );\n }\n\n value = String(value);\n var filterRegExp,\n regEnd = /\\/(i|g|m)*$/,\n pattern = regEnd.exec(filterFor),\n flags = pattern ? pattern[0].substring(1) : '',\n flagLength = flags.length;\n self.invalidFilterRegEx = undefined;\n if (filterFor.substring(0, 1) === '/' && pattern) {\n try {\n filterRegExp = new RegExp(\n filterFor.substring(1, filterFor.length - (flagLength + 1)),\n flags,\n );\n } catch (e) {\n self.invalidFilterRegEx = e;\n return;\n }\n return filterRegExp.test(value);\n }\n return value.toString\n ? value\n .toString()\n .toLocaleUpperCase()\n .indexOf(filterFor.toLocaleUpperCase()) !== -1\n : false;\n };\n self.filters.number = function (value, filterFor) {\n if (filterFor === self.attributes.blanksText) {\n return self.blankValues.includes(\n value == null ? value : String(value).trim(),\n );\n }\n\n if (!filterFor) {\n return true;\n }\n if (value === filterFor) {\n return true;\n }\n // the filter text always arrives as a string; compare numerically\n // when both sides parse as numbers (#431)\n const numericValue = Number(value);\n const numericFilter = Number(filterFor);\n if (!Number.isNaN(numericValue) && !Number.isNaN(numericFilter)) {\n return numericValue === numericFilter;\n }\n return String(value) === String(filterFor);\n };\n ['formatters', 'filters', 'sorters'].forEach(self.initProp);\n self.applyComponentStyle(false, self.intf);\n self.reloadStoredValues();\n if (self.args.treeGridAttributes) {\n self.treeGridAttributes = self.args.treeGridAttributes;\n }\n if (self.args.cellGridAttributes) {\n self.cellGridAttributes = self.args.cellGridAttributes;\n }\n if (self.args.data) {\n self.intf.data = self.args.data;\n }\n if (self.intf.innerText || self.intf.textContent) {\n if (self.intf.dataType === 'application/x-canvas-datagrid') {\n self.intf.dataType = 'application/json+x-canvas-datagrid';\n }\n self.intf.data = self.intf.innerText || self.intf.textContent;\n }\n if (self.args.schema) {\n self.intf.schema = self.args.schema;\n }\n if (self.isChildGrid || !self.isComponent) {\n requestAnimationFrame(function () {\n self.resize(true);\n });\n } else {\n self.resize(true);\n }\n self.initialized = true;\n return self;\n };\n /**\n * Removes focus from the grid.\n * @memberof canvasDatagrid\n * @name blur\n * @method\n */\n self.intf.blur = function (e) {\n self.hasFocus = false;\n };\n /**\n * Focuses on the grid.\n * @memberof canvasDatagrid\n * @name focus\n * @method\n */\n self.intf.focus = function () {\n self.hasFocus = true;\n self.controlInput.focus();\n };\n if (self.shadowRoot || self.isChildGrid) {\n Object.defineProperty(self.intf, 'height', {\n get: function () {\n if (self.shadowRoot) {\n return self.shadowRoot.height;\n }\n return self.parentNode.height;\n },\n set: function (value) {\n if (self.shadowRoot) {\n self.shadowRoot.height = value;\n } else {\n self.parentNode.height = value;\n }\n self.resize(true);\n },\n });\n Object.defineProperty(self.intf, 'width', {\n get: function () {\n if (self.shadowRoot) {\n return self.shadowRoot.width;\n }\n return self.parentNode.width;\n },\n set: function (value) {\n if (self.shadowRoot) {\n self.shadowRoot.width = value;\n } else {\n self.parentNode.width = value;\n }\n self.resize(true);\n },\n });\n Object.defineProperty(self.intf, 'parentNode', {\n get: function () {\n return self.parentNode;\n },\n set: function (value) {\n if (!self.isChildGrid) {\n throw new TypeError(\n 'Cannot set property parentNode which has only a getter',\n );\n }\n self.parentNode = value;\n },\n });\n }\n Object.defineProperty(self.intf, 'visibleRowHeights', {\n get: function () {\n return self.visibleRowHeights;\n },\n });\n Object.defineProperty(self.intf, 'openChildren', {\n get: function () {\n return self.openChildren;\n },\n });\n Object.defineProperty(self.intf, 'childGrids', {\n get: function () {\n return Object.keys(self.childGrids).map(function (gridId) {\n return self.childGrids[gridId];\n });\n },\n });\n Object.defineProperty(self.intf, 'isChildGrid', {\n get: function () {\n return self.isChildGrid;\n },\n });\n Object.defineProperty(self, 'cursor', {\n get: function () {\n return self.parentNodeStyle.cursor;\n },\n set: function (value) {\n if (value === 'cell') {\n value = 'default';\n }\n if (self.currentCursor !== value) {\n self.parentNodeStyle.cursor = value;\n self.currentCursor = value;\n }\n },\n });\n Object.defineProperty(self.intf, 'orderDirection', {\n get: function () {\n return self.orderDirection;\n },\n set: function (value) {\n if (value !== 'desc') {\n value = 'asc';\n }\n self.orderDirection = value;\n self.order(self.orderBy, self.orderDirection);\n },\n });\n Object.defineProperty(self.intf, 'orderBy', {\n get: function () {\n return self.orderBy;\n },\n set: function (value) {\n if (\n self.getSchema().find(function (col) {\n return col.name === value;\n }) === undefined\n ) {\n throw new Error('Cannot sort by unknown column name.');\n }\n self.orderBy = value;\n self.order(self.orderBy, self.orderDirection);\n },\n });\n if (self.isComponent) {\n Object.defineProperty(self.intf, 'offsetHeight', {\n get: function () {\n return self.canvas.offsetHeight;\n },\n });\n Object.defineProperty(self.intf, 'offsetWidth', {\n get: function () {\n return self.canvas.offsetWidth;\n },\n });\n }\n Object.defineProperty(self.intf, 'scrollHeight', {\n get: function () {\n return self.scrollBox.scrollHeight;\n },\n });\n Object.defineProperty(self.intf, 'scrollWidth', {\n get: function () {\n return self.scrollBox.scrollWidth;\n },\n });\n Object.defineProperty(self.intf, 'scrollTop', {\n get: function () {\n return self.scrollBox.scrollTop;\n },\n set: function (value) {\n self.scrollBox.scrollTop = value;\n },\n });\n Object.defineProperty(self.intf, 'scrollLeft', {\n get: function () {\n return self.scrollBox.scrollLeft;\n },\n set: function (value) {\n self.scrollBox.scrollLeft = value;\n },\n });\n Object.defineProperty(self.intf, 'sizes', {\n get: function () {\n return self.sizes;\n },\n });\n Object.defineProperty(self.intf, 'parentDOMNode', {\n get: function () {\n return self.parentDOMNode;\n },\n });\n Object.defineProperty(self.intf, 'input', {\n get: function () {\n return self.input;\n },\n });\n Object.defineProperty(self.intf, 'controlInput', {\n get: function () {\n return self.controlInput;\n },\n });\n Object.defineProperty(self.intf, 'currentCell', {\n get: function () {\n return self.currentCell;\n },\n });\n Object.defineProperty(self.intf, 'visibleCells', {\n get: function () {\n return self.visibleCells;\n },\n });\n Object.defineProperty(self.intf, 'visibleRows', {\n get: function () {\n return self.visibleRows;\n },\n });\n let warnedForObsoleteSelections;\n Object.defineProperty(self.intf, 'selections', {\n get: function () {\n if (!warnedForObsoleteSelections) {\n console.warn(\n `DeprecationWarning: The property 'selections' is deprecated due to performance issue. ` +\n `And it will be removed in the future.` +\n `Please use new property 'selectionList' instead. ` +\n `Visit this link to get more information: ` +\n `https://github.com/TonyGermaneri/canvas-datagrid/pull/498`,\n );\n warnedForObsoleteSelections = true;\n }\n return self.getObsoleteSelectionMatrix();\n },\n });\n Object.defineProperty(self.intf, 'selectionList', {\n get: function () {\n return self.selections;\n },\n });\n Object.defineProperty(self.intf, 'dragMode', {\n get: function () {\n return self.dragMode;\n },\n });\n Object.defineProperty(self.intf, 'changes', {\n get: function () {\n return self.changes;\n },\n });\n self.intf.formatters = self.formatters;\n Object.defineProperty(self.intf, 'dataType', {\n get: function () {\n return self.dataType;\n },\n set: function (value) {\n if (!self.parsers[value]) {\n throw new Error('No parser for MIME type ' + value);\n }\n self.dataType = value;\n },\n });\n self.eventNames.forEach(function (eventName) {\n Object.defineProperty(self.intf, 'on' + eventName, {\n get: function () {\n return self.componentL1Events[eventName];\n },\n set: function (value) {\n self.events[eventName] = [];\n self.componentL1Events[eventName] = value;\n if (!value) {\n return;\n }\n self.addEventListener(eventName, value);\n },\n });\n });\n Object.defineProperty(self.intf, 'frozenRow', {\n get: function () {\n return self.frozenRow;\n },\n set: function (val) {\n if (isNaN(val)) {\n throw new TypeError('Expected value for frozenRow to be a number.');\n }\n if (self.visibleRows.length < val) {\n throw new RangeError(\n 'Cannot set a value larger than the number of visible rows.',\n );\n }\n self.frozenRow = val;\n },\n });\n Object.defineProperty(self.intf, 'frozenColumn', {\n get: function () {\n return self.frozenColumn;\n },\n set: function (val) {\n if (isNaN(val)) {\n throw new TypeError('Expected value for frozenRow to be a number.');\n }\n if (self.getVisibleSchema().length < val) {\n throw new RangeError(\n 'Cannot set a value larger than the number of visible columns.',\n );\n }\n self.frozenColumn = val;\n },\n });\n Object.defineProperty(self.intf, 'scrollIndexRect', {\n get: function () {\n return {\n top: self.scrollIndexTop,\n right: self.scrollIndexRight,\n bottom: self.scrollIndexBottom,\n left: self.scrollIndexLeft,\n };\n },\n });\n Object.defineProperty(self.intf, 'scrollPixelRect', {\n get: function () {\n return {\n top: self.scrollPixelTop,\n right: self.scrollPixelRight,\n bottom: self.scrollPixelBottom,\n left: self.scrollPixelLeft,\n };\n },\n });\n Object.defineProperty(self.intf, 'rowOrder', {\n get: function () {\n return self.orders.rows;\n },\n set: function (val) {\n if (!Array.isArray(val)) {\n throw new TypeError('Value must be an array.');\n }\n if (!self.originalData || val.length < self.originalData.length) {\n throw new RangeError(\n 'Array length must be equal to or greater than number of rows.',\n );\n }\n self.orders.rows = val;\n },\n });\n Object.defineProperty(self.intf, 'columnOrder', {\n get: function () {\n return self.orders.columns;\n },\n set: function (val) {\n if (!Array.isArray(val)) {\n throw new TypeError('Value must be an array.');\n }\n if (val.length < self.getSchema().length) {\n throw new RangeError(\n 'Array length must be equal to or greater than number of columns.',\n );\n }\n self.orders.columns = val;\n // redraw with the new order (#160)\n if (self.canvas) {\n self.resize(true);\n }\n },\n });\n Object.defineProperty(self.intf, 'selectionBounds', {\n get: function () {\n return self.getSelectionBounds();\n },\n });\n Object.defineProperty(self.intf, 'selectedRows', {\n get: function () {\n return self.getSelectedData(true);\n },\n });\n Object.defineProperty(self.intf, 'selectedCells', {\n get: function () {\n return self.getSelectedData();\n },\n });\n Object.defineProperty(self.intf, 'visibleSchema', {\n get: function () {\n return self.getVisibleSchema().map(function eachDataRow(col) {\n return col;\n });\n },\n });\n Object.defineProperty(self.intf, 'treeGridAttributes', {\n get: function () {\n return self.treeGridAttributes;\n },\n set: function setTreeGridAttributes(value) {\n self.treeGridAttributes = value;\n },\n });\n Object.defineProperty(self.intf, 'cellGridAttributes', {\n get: function () {\n return self.cellGridAttributes;\n },\n set: function setCellGridAttributes(value) {\n self.cellGridAttributes = value;\n },\n });\n Object.defineProperty(self.intf, 'fillCellCallback', {\n get: function () {\n return self.fillCellCallback;\n },\n set: function setFillCellCallback(value) {\n self.fillCellCallback = value;\n },\n });\n Object.defineProperty(self.intf, 'ctx', {\n get: function () {\n return self.ctx;\n },\n });\n Object.defineProperty(self.intf, 'schema', {\n get: function schemaGetter() {\n return self.getSchema();\n },\n set: function schemaSetter(value) {\n if (value === undefined) {\n // Issue #89 - allow schema to be set to initialized state\n self.schema = undefined;\n self.tempSchema = undefined;\n self.dispatchEvent('schemachanged', { schema: undefined });\n return;\n }\n if (!Array.isArray(value) || typeof value[0] !== 'object') {\n throw new Error('Schema must be an array of objects.');\n }\n if (value[0].name === undefined) {\n throw new Error(\n 'Expected schema to contain an object with at least a name property.',\n );\n }\n self.schema = value.map(function eachSchemaColumn(column, index) {\n column.width = column.width || self.style.cellWidth;\n column.filter = column.filter || self.filter(column.type);\n column.type = column.type || 'string';\n column.index = index;\n column.columnIndex = index;\n column.rowIndex = -1;\n return column;\n });\n self.tempSchema = undefined;\n self.createNewRowData();\n self.createColumnOrders();\n self.tryLoadStoredSettings();\n if (\n self.storedSettings &&\n typeof self.storedSettings.visibility === 'object'\n ) {\n self.schema.forEach(function hideEachSchemaColumn(column, index) {\n if (\n self.storedSettings &&\n self.storedSettings.visibility[column.name] !== undefined\n ) {\n column.hidden = !self.storedSettings.visibility[column.name];\n }\n });\n }\n self.resize(true);\n self.dispatchEvent('schemachanged', { schema: self.schema });\n },\n });\n /**\n * Gets an array of currently registered MIME types.\n * @memberof canvasDatagrid\n * @name getDataTypes\n * @method\n */\n self.intf.getTypes = function () {\n return Object.keys(self.parsers);\n };\n self.parseInnerHtml = function (data) {\n if (!data || /^ +$/.test(data)) {\n return [];\n }\n try {\n data = JSON.parse(data);\n } catch (e) {\n console.warn(\n Error(\n 'Cannot parse application/json+x-canvas-datagrid formated data. ' +\n e.message +\n ' \\nNote: canvas-datagrid.innerHTML is for string data only. ' +\n 'Use the canvas-datagrid.data property to set object data.',\n ),\n );\n }\n return data;\n };\n self.parsers['application/json+x-canvas-datagrid'] = function (\n data,\n callback,\n ) {\n self.parsers['application/x-canvas-datagrid'](\n self.parseInnerHtml(data),\n function (data, schema) {\n return callback(data, schema);\n },\n );\n };\n self.parsers['application/x-canvas-datagrid'] = function (data, callback) {\n return callback(data);\n };\n self.intf.parsers = self.parsers;\n // send to dataType ETL function to extract from input data\n // and transform into native [{}, {}] format\n self.etl = function (data, callback) {\n if (!self.intf.parsers[self.dataType]) {\n throw new Error('Unsupported data type.');\n }\n self.intf.parsers[self.dataType](data, function (data, schema) {\n // set the unfiltered/sorted data array\n self.originalData = data;\n self.viewData = Array.from(self.originalData);\n\n if (Array.isArray(schema)) {\n self.schema = schema;\n }\n // Issue #89 - allow schema to be auto-created every time data is set\n if (self.attributes.autoGenerateSchema) {\n self.schema = self.getSchemaFromData(data);\n }\n if (!self.schema) {\n self.tempSchema = self.getSchemaFromData(data);\n }\n if (self.getSchema()) {\n // keep a user's column order when the schema still fits (#116);\n // auto-generated schemas are re-ordered below\n var columnCount = self.getSchema().length;\n if (\n !self.orders.columns ||\n self.orders.columns.length !== columnCount\n ) {\n self.createColumnOrders();\n }\n }\n // apply filter, sort, etc to incoming dataset, set viewData:\n self.refresh();\n // empty data was set\n if (!self.schema && (self.originalData || []).length === 0) {\n self.tempSchema = [{ name: '' }];\n }\n self.fitColumnToValues('cornerCell', true);\n if (\n (self.tempSchema && !self.schema) ||\n self.attributes.autoGenerateSchema\n ) {\n self.createColumnOrders();\n self.dispatchEvent('schemachanged', { schema: self.tempSchema });\n }\n callback();\n });\n };\n Object.defineProperty(self.intf, 'viewData', {\n get: function () {\n return self.viewData;\n },\n });\n Object.defineProperty(self.intf, 'boundData', {\n get: function () {\n return self.originalData;\n },\n });\n Object.defineProperty(self.intf, 'data', {\n get: function dataGetter() {\n return self.originalData;\n },\n set: function dataSetter(value) {\n self.etl(value, function () {\n self.changes = [];\n self.createNewRowData();\n if (\n self.attributes.autoResizeColumns &&\n self.originalData.length > 0 &&\n self.storedSettings === undefined\n ) {\n self.autosize();\n }\n // set the header column to fit the numbers in it\n self.fitColumnToValues('cornerCell', true);\n self.createRowOrders();\n self.tryLoadStoredSettings();\n self.dispatchDataChanged('data');\n self.initCellTreeSettings();\n self.resize(true);\n });\n },\n });\n self.initScrollBox = function () {\n var sHeight = 0,\n sWidth = 0,\n scrollTop = 0,\n scrollLeft = 0,\n scrollHeight = 0,\n scrollWidth = 0,\n scrollBoxHeight = 20,\n scrollBoxWidth = 20;\n function setScrollTop(value, preventScrollEvent) {\n if (isNaN(value)) {\n throw new Error('ScrollTop value must be a number');\n }\n if (value < 0) {\n value = 0;\n }\n if (value > scrollHeight) {\n value = scrollHeight;\n }\n if (scrollHeight < 0) {\n value = 0;\n }\n scrollTop = value;\n if (!preventScrollEvent) {\n self.scroll();\n }\n if (self.button) {\n self.moveButtonPos();\n }\n }\n function setScrollLeft(value, preventScrollEvent) {\n if (isNaN(value)) {\n throw new Error('ScrollLeft value must be a number');\n }\n if (value < 0) {\n value = 0;\n }\n if (value > scrollWidth) {\n value = scrollWidth;\n }\n if (scrollWidth < 0) {\n value = 0;\n }\n scrollLeft = value;\n if (!preventScrollEvent) {\n self.scroll();\n }\n if (self.button) {\n self.moveButtonPos();\n }\n }\n self.scrollBox.toString = function () {\n return (\n '{\"width\": ' +\n scrollWidth.toFixed(2) +\n ', \"height\": ' +\n scrollHeight.toFixed(2) +\n ', \"left\": ' +\n scrollLeft.toFixed(2) +\n ', \"top\": ' +\n scrollTop.toFixed(2) +\n ', \"widthRatio\": ' +\n self.scrollBox.widthBoxRatio.toFixed(5) +\n ', \"heightRatio\": ' +\n self.scrollBox.heightBoxRatio.toFixed(5) +\n '}'\n );\n };\n self.scrollBox.scrollTo = function (x, y, supressDrawEvent) {\n setScrollLeft(x, true);\n setScrollTop(y, supressDrawEvent);\n };\n Object.defineProperty(self.scrollBox, 'scrollBoxHeight', {\n get: function () {\n return scrollBoxHeight;\n },\n set: function (value) {\n scrollBoxHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollBoxWidth', {\n get: function () {\n return scrollBoxWidth;\n },\n set: function (value) {\n scrollBoxWidth = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'height', {\n get: function () {\n return sHeight;\n },\n set: function (value) {\n sHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'width', {\n get: function () {\n return sWidth;\n },\n set: function (value) {\n sWidth = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollTop', {\n get: function () {\n return scrollTop;\n },\n set: setScrollTop,\n });\n Object.defineProperty(self.scrollBox, 'scrollLeft', {\n get: function () {\n return scrollLeft;\n },\n set: setScrollLeft,\n });\n Object.defineProperty(self.scrollBox, 'scrollHeight', {\n get: function () {\n return scrollHeight;\n },\n set: function (value) {\n if (scrollTop > value) {\n scrollTop = Math.max(value, 0);\n }\n scrollHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollWidth', {\n get: function () {\n return scrollWidth;\n },\n set: function (value) {\n if (scrollLeft > value) {\n scrollLeft = Math.max(value, 0);\n }\n scrollWidth = value;\n },\n });\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false, Event: false*/\n/// <reference path=\"./type.d.ts\" />\n'use strict';\n\nimport { createHTMLString, createTextString } from '../events/util';\nimport {\n addIntoSelections,\n areSelectionsComplex,\n areSelectionsNeat,\n cleanupSelections,\n cloneSelections,\n getSelectedContiguousColumns,\n getSelectedContiguousRows,\n getSelectionBounds,\n getSelectionStateFromCells,\n isCellSelected,\n isColumnSelected,\n isRowSelected,\n moveSelections,\n normalizeSelection,\n removeFromSelections,\n SelectionType,\n shrinkOrExpandSelections,\n} from './util';\n\n/**\n * Before reading the code of this module, you must know these things:\n *\n * You may see words like \"obsolete\", \"old API\", \"compatibility\" in the code later.\n * Because this grid component has used a different selection mechanism in the past.\n *\n * The old mechanism use a 2D array to represent the selection state.\n * For example: `[undefined x 10, [0, 5]]` indicates\n * there are two cells are selected in current grid. they are located in row 11.\n * and one in column 1, another in column 6.\n * And `[undefined x 5, [-1, 0,1,2,3,4,5,6...], undefined x 2, [1]]` indicates\n * the row 6 is selected and the cell that located in row 9 column 2 is selected.\n *\n * But this implementation has performance issue when the grid is shipping a large dataset.\n * You can just imagine about what will happen when you select all cells in a grid with 1 million rows.\n *\n * So we create a new way to implement the selection.\n * In this way, we use a selection list to represent the selection state.\n * Each element in this selection list is a selection descriptor.\n * Each descriptor represents an area whose selected or unselected by the user.\n * And we have four types for the descriptor: UnselectedCells, Cells, Rows and Columns\n *\n * Because the old selection mechanism has been in used for a long time and\n * we have many public APIs about it.\n * We still need to keep these APIs working in the 0.x versions in the future.\n * So we create some functions to make sure these APIs and context objects work like previous version.\n * This is the reason why you may see there are some functions in this file\n * be marked \"for compatibility\" without best practice.\n */\nexport default function (self) {\n /**\n * Here are explanation for the item of this array:\n *\n * The type of properties about the row in it is viewRowIndex (startRow, endRow).\n * Here is an example of accessing the row data from the selection object:\n * `const rowData = originalData[self.getBoundRowIndexFromViewRowIndex(selection.startRow)]`\n *\n * The type of properties about the column in it is columnOrderIndex (startColumn, endColumn)\n * Here is an example of accessing thr column schema from the selection object:\n * `const columnSchema = schema[self.orders.columns[selection.startColumn]]`\n * @type {SelectionDescriptor[]}\n */\n self.selections = [];\n\n /**\n * TODO support the cache\n */\n self.selectionCache = [];\n self.selectionCacheWidth = 0;\n self.selectionCacheHeight = 0;\n\n /**\n * This method is used for adapting old API and it has performance issue for the large data set.\n * We should keep this function and its related functions until version 1.x,\n * because this action can cause incompatible API changes <https://semver.org/>\n *\n * Generate a selection 2 dimensional array from the selection list.\n * Each row in this 2D array is a number array that indicates which columns are selected in this row.\n * And -1 in the result means entire cells are selected in particular row/column\n *\n * @param {object[]} [otherSelections] The function create a 2d array based on this selection list\n * if this parameter is provided. Otherwise, this function uses self.selections as the list input.\n * @returns {number[][]}\n */\n self.getObsoleteSelectionMatrix = (otherSelections) => {\n const bounds = self.getSelectionBounds(true, otherSelections);\n if (!bounds) return [];\n const { top, bottom, left, right } = bounds;\n const height = bottom - top + 1;\n const width = right - left + 1;\n const states = getSelectionStateFromCells(self.selections, {\n startRow: top,\n endRow: bottom,\n startColumn: left,\n endColumn: right,\n });\n if (states === false) return [];\n\n const result = [];\n for (let row = top, row2 = top + height; row < row2; row++) {\n if (states === true) {\n result[row] = new Array(width).fill(0).map((_, i) => left + i);\n continue;\n }\n\n const rowState = states[row - top];\n if (!rowState) continue;\n result[row] = [];\n for (let col = left, col2 = left + width; col < col2; col++) {\n if (rowState !== true && !rowState[col - left]) continue;\n result[row].push(col);\n }\n }\n for (let i = 0; i < self.selections.length; i++) {\n const selection = self.selections[i];\n if (selection.type !== SelectionType.Rows) continue;\n for (let row = selection.startRow; row <= selection.endRow; row++) {\n if (!result[row]) {\n result[row] = [-1];\n continue;\n }\n if (result[row][0] === -1) continue;\n result[row].unshift(-1);\n }\n }\n return result;\n };\n\n /**\n * Return a tuple if the user selected contiguous columns, otherwise `null`.\n * Info: Because the user may reorder the columns,\n * the schemaIndex of the first item may be greater than the schemaIndex of the second item,\n * but the columnIndex of the firs item must less than the columnIndex of the second item.\n * @param {object[]} [schema] from `self.getSchema()`\n * @returns {object[]} column schemas tuple (each schema has an additional field `schemaIndex`)\n */\n self.getSelectedContiguousColumns = function (schema) {\n if (!schema) schema = self.getSchema();\n const columnOrderIndexes = getSelectedContiguousColumns(\n self.selections,\n false,\n );\n if (!Array.isArray(columnOrderIndexes)) return;\n\n /** @type {number[]} orders[index] => columnIndex */\n const orders = self.orders.columns;\n return columnOrderIndexes.map((orderIndex) => {\n const schemaIndex = orders[orderIndex];\n const columnSchema = schema[schemaIndex];\n return Object.assign({}, columnSchema, { orderIndex });\n });\n };\n\n /**\n * @param {boolean} [allowOnlyOneRow]\n * @returns {number[]} a viewRowIndex tuple. It can contains one row index or two row indexes.\n */\n self.getSelectedContiguousRows = function (allowOnlyOneRow) {\n const viewRowIndexes = getSelectedContiguousRows(self.selections, false);\n if (!Array.isArray(viewRowIndexes)) return;\n if (!allowOnlyOneRow && viewRowIndexes[0] === viewRowIndexes[1]) return;\n return viewRowIndexes;\n };\n\n /**\n * Check if current selection are copyable for the system clipbaord\n * @returns {boolean}\n */\n self.canSelectionsBeCopied = function () {\n return self.selections.length > 0 && !areSelectionsComplex(self.selections);\n };\n\n /**\n * Return the height of the selection area.\n * This function is used for rendering the overlay for the dnd(drag and drop)\n * @returns {number} The height of the selection area\n */\n self.getSelectedRowsHeight = function () {\n const selected = getSelectedContiguousRows(self.selections, true);\n if (!selected) return 0;\n let height = 0;\n for (let row = selected[0]; row <= selected[1]; row++)\n height += self.getRowHeight(row);\n return height;\n };\n\n /**\n * Return the width of the selection area.\n * This function is used for rendering the overlay for the dnd(drag and drop)\n * @returns {number} The width of the selection area\n */\n self.getSelectedColumnsWidth = function () {\n const selected = getSelectedContiguousColumns(self.selections, true);\n if (!selected) return 0;\n let width = 0;\n for (let col = selected[0]; col <= selected[1]; col++)\n width += self.getColumnWidth(self.orders.columns[col]);\n return width;\n };\n\n /**\n * @param {object} cell This method needs two properties in this parameter: `rowIndex`\n * and `viewColumnIndex`\n */\n self.isCellSelected = (cell) => {\n return isCellSelected(self.selections, cell.rowIndex, cell.viewColumnIndex);\n };\n\n /**\n * Returns true if the selected columnIndex is selected on every row.\n * @memberof canvasDatagrid\n * @name isColumnSelected\n * @method\n * @param {number} columnIndex The column index to check.\n */\n self.isColumnSelected = (viewColumnIndex) => {\n if (typeof viewColumnIndex !== 'number') return false;\n return isColumnSelected(self.selections, viewColumnIndex);\n };\n\n /**\n * Returns true if the selected rowIndex is selected on every column.\n * @memberof canvasDatagrid\n * @name isRowSelected\n * @method\n * @param {number} rowIndex The row index to check.\n */\n self.isRowSelected = (rowIndex) => {\n if (typeof rowIndex !== 'number') return false;\n return isRowSelected(self.selections, rowIndex);\n };\n\n /**\n * Removes the selection.\n * @param {boolean} triggerEvent true for trigger a event\n */\n self.clearSelections = (triggerEvent) => {\n self.selections = [];\n if (triggerEvent) self.dispatchSelectionChangedEvent();\n };\n\n /**\n * Removes the selection.\n * @memberof canvasDatagrid\n * @name selectNone\n * @param {boolean} dontDraw Suppress the draw method after the selection change.\n * @method\n */\n self.selectNone = (dontDraw) => {\n self.clearSelections(true);\n if (dontDraw) return;\n self.draw();\n };\n\n /**\n * Selects every visible cell.\n * @memberof canvasDatagrid\n * @name selectAll\n * @param {boolean} dontDraw Suppress the draw method after the selection change.\n * @method\n */\n self.selectAll = function (dontDraw) {\n const changed = addIntoSelections(self.selections, {\n type: SelectionType.Columns,\n startColumn: 0,\n endColumn: self.getSchema().length - 1,\n });\n if (!changed || dontDraw) return;\n self.draw();\n };\n\n /**\n * @param {object} cell This method needs two properties in this parameter: `rowIndex`\n * and `viewColumnIndex`\n * @param {boolean} [suppressEvent]\n */\n self.unselectCell = (cell, suppressEvent) => {\n const result = removeFromSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Cells,\n startRow: cell.rowIndex,\n startColumn: cell.viewColumnIndex,\n }),\n );\n if (result && !suppressEvent) self.dispatchSelectionChangedEvent();\n return result;\n };\n\n /**\n * @param {number} startRow rowViewIndex\n * @param {number} endRow rowViewIndex\n * @param {boolean} suppressEvent When true, prevents the `selectionchanged` event from firing.\n * @returns {boolean} It returns whether the selection changed\n */\n self.unselectRows = (startRow, endRow, suppressEvent) => {\n const result = removeFromSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Rows,\n startRow: startRow,\n endRow: endRow,\n }),\n );\n if (result && !suppressEvent) self.dispatchSelectionChangedEvent();\n return result;\n };\n\n /**\n * @param {object} cell This method needs two properties in this parameter: `rowIndex`\n * and `viewColumnIndex`\n * @param {boolean} [suppressEvent]\n */\n self.selectCell = (cell, suppressEvent) => {\n const result = addIntoSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Cells,\n startRow: cell.rowIndex,\n startColumn: cell.viewColumnIndex,\n }),\n );\n if (result && !suppressEvent) self.dispatchSelectionChangedEvent();\n return result;\n };\n\n /**\n * Moves the current selection relative to the its current position. Note: this method does not move the selected data, just the selection itself.\n * @memberof canvasDatagrid\n * @name moveSelection\n * @method\n * @param {number} offsetX The number of columns to offset the selection.\n * @param {number} offsetY The number of rows to offset the selection.\n */\n self.moveSelection = function (offsetX, offsetY) {\n moveSelections(self.selections, offsetX, offsetY);\n };\n\n /**\n * Dispatch a event named `selectionchanged` with context info\n */\n self.dispatchSelectionChangedEvent = () => {\n self.dispatchEvent('selectionchanged', self.getContextOfSelectionEvent());\n };\n\n /**\n * Return the event context for event `selectionchanged`\n * @returns {object} the context for the event\n */\n self.getContextOfSelectionEvent = () => {\n const context = { selectionList: self.cloneSelections() };\n //#region for API compatibility\n Object.defineProperty(context, 'selections', {\n get: function () {\n return self.getObsoleteSelectionMatrix();\n },\n });\n Object.defineProperty(context, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n Object.defineProperty(context, 'selectedCells', {\n get: function () {\n return self.getSelectedCells();\n },\n });\n Object.defineProperty(context, 'selectionBounds', {\n get: function () {\n return self.getSelectionBounds();\n },\n });\n //#endregion for API compatibility\n return context;\n };\n\n /**\n * Return a cloned selection list from current selection list\n * @returns {object[]} A cloned selection list\n */\n self.cloneSelections = () => {\n return cloneSelections(self.selections);\n };\n\n /**\n * Gets the bounds of current selection.\n * @param {boolean} [sanitized] sanitize the bound object if the value of thie paramater is `true`\n * @memberof canvasDatagrid\n * @name getSelectionBounds\n * @method\n * @returns {rect} two situations:\n * 1. The result is always a bound object if `sanitized` is not `true`.\n * And the result is `{top: Infinity, left: Infinity, bottom: -Infinity, right: -Infinity}` if there haven't selections.\n * This is used for keeping compatibility with existing APIs.\n * 2. When the parameter `sanitized` is true. The result will be null if there haven't selections.\n */\n self.getSelectionBounds = (sanitized, otherSelections) => {\n const bounds = getSelectionBounds(otherSelections || self.selections);\n if (sanitized) {\n // nothing is selected\n if (bounds.top > bounds.bottom || bounds.left > bounds.right) return null;\n self.sanitizeSelectionBounds(bounds);\n }\n return bounds;\n };\n self.sanitizeSelectionBounds = (bounds) => {\n if (!bounds) return bounds;\n if (bounds.top < 0) bounds.top = 0;\n if (bounds.left < 0) bounds.left = 0;\n\n const viewDataLength = self.viewData.length;\n if (bounds.bottom > viewDataLength) bounds.bottom = viewDataLength - 1;\n\n const schemaLength = self.getSchema().length;\n if (bounds.right > schemaLength) bounds.right = schemaLength - 1;\n return bounds;\n };\n\n /**\n * This function is migrated from the old API,\n * It needs to be refactoring/deprecated to work with the large dataset.\n * @param {boolean} [expandToRow]\n * @returns {any[]}\n */\n self.getSelectedData = (expandToRow) => {\n const bounds = self.getSelectionBounds(true);\n if (!bounds) return [];\n\n const selectedData = [];\n const { top, bottom, left, right } = bounds;\n const height = bottom - top + 1;\n const width = right - left + 1;\n const states = getSelectionStateFromCells(self.selections, {\n startRow: top,\n endRow: bottom,\n startColumn: left,\n endColumn: right,\n });\n if (states === false) return [];\n\n const orderedSchema = getSchemaOrderByViewIndex(left, width);\n for (let row = top, row2 = top + height; row < row2; row++) {\n const viewData = self.viewData[row] || {};\n const rowData = {};\n let hasData = false;\n const rowState = states === true || states[row - top];\n if (!rowState) continue;\n\n for (let col = left, col2 = left + width; col < col2; col++) {\n if (states !== true && !rowState[col - left]) continue;\n const header = orderedSchema[col];\n if (!header || header.hidden) continue;\n hasData = true;\n if (expandToRow) break;\n rowData[header.name] = viewData[header.name];\n }\n if (hasData)\n selectedData[row] = expandToRow ? Object.assign({}, viewData) : rowData;\n }\n return selectedData;\n };\n\n /**\n * This function is migrated from the old API,\n * @param {boolean} [expandToRow]\n * @returns {any[]}\n */\n self.getSelectedCells = (expandToRow) => {\n const selectedCells = [];\n const bounds = self.getSelectionBounds(true);\n iterateSelectedCells(\n (cell) => selectedCells.push(cell),\n bounds,\n expandToRow,\n );\n return selectedCells;\n };\n\n /**\n * This function is migrated from the old API,\n * @returns {any[]} affected cells\n */\n self.clearSelectedCells = () => {\n const affectedCells = [];\n const bounds = self.getSelectionBounds(true);\n iterateSelectedCells(\n (cell) => {\n affectedCells.push(cell);\n self.viewData[cell.viewRowIndex][cell.columnName] = '';\n },\n bounds,\n false,\n );\n return affectedCells;\n };\n\n /**\n * Deletes currently selected data.\n * @memberof canvasDatagrid\n * @name deleteSelectedData\n * @method\n * @param {boolean} dontDraw Suppress the draw method after the selection change.\n */\n self.deleteSelectedData = (dontDraw) => {\n const affectedCells = self.clearSelectedCells();\n const apiCompatibleCells = affectedCells.map((cell) => {\n return [\n cell.viewRowIndex,\n cell.viewColumnIndex,\n cell.boundRowIndex,\n cell.boundColumnIndex,\n ];\n });\n self.dispatchEvent('afterdelete', {\n cells: apiCompatibleCells,\n });\n self.dispatchDataChanged('delete', { cells: apiCompatibleCells });\n if (dontDraw) return;\n requestAnimationFrame(() => self.draw());\n };\n\n /**\n * Runs the defined method on each selected cell.\n * @memberof canvasDatagrid\n * @name forEachSelectedCell\n * @method\n * @param {number} fn The function to execute. The signature of the function is: (data, rowIndex, columnName).\n * @param {number} expandToRow When true the data in the array is expanded to the entire row.\n */\n self.forEachSelectedCell = function (fn, expandToRow) {\n const bounds = self.getSelectionBounds(true);\n iterateSelectedCells(\n (cell) => fn(self.viewData, cell.viewRowIndex, cell.columnName, cell),\n bounds,\n expandToRow,\n );\n };\n\n /**\n * @param {ClipboardInterface} clipboardData\n */\n self.copySelectedCellsToClipboard = (clipboardData) => {\n // an active cell without a selection has nothing to copy (#566)\n if (!self.selections || self.selections.length === 0) return;\n const isNeat = areSelectionsNeat(self.selections);\n const selectedData = self.getSelectedData();\n const data = selectedData.filter((row) => row != null);\n\n if (data.length > 0) {\n const textString = createTextString(data, isNeat);\n const htmlString = createHTMLString(data, isNeat);\n\n const copiedData = {\n 'text/plain': textString,\n 'text/html': htmlString,\n 'text/csv': textString,\n 'application/json': JSON.stringify(data),\n };\n for (const [mimeType, data] of Object.entries(copiedData)) {\n clipboardData.setData(mimeType, data);\n }\n }\n };\n\n /**\n * (This function is migrated from the old API)\n * Modify the width of columns that contain selected cells to fit the content.\n * @param {number} [width] Custom width for each column\n */\n self.fitSelectedColumns = (width) => {\n const bounds = self.getSelectionBounds(true);\n if (!bounds) return;\n\n const hasCustomWidth = typeof width === 'number' && width > 0;\n // convert rectangle's height to only 1 row\n bounds.bottom = bounds.top;\n iterateSelectedCells(\n (cell) => {\n const { columnName, viewColumnIndex } = cell;\n if (hasCustomWidth) {\n self.sizes.columns[viewColumnIndex] = width;\n self.dispatchEvent('resizecolumn', {\n // TODO: Drop x, y from all 'resizecolumn' events and use height and width instead.\n x: width,\n y: self.resizingStartingHeight,\n width: width,\n height: self.resizingStartingHeight,\n columnIndex: viewColumnIndex,\n draggingItem: self.currentCell,\n });\n } else {\n self.fitColumnToValues(columnName);\n }\n },\n bounds,\n false,\n );\n };\n\n /**\n * Set the height of the selected rows to the given value.\n * @param {number} [height]\n */\n self.fitSelectedRows = (height) => {\n const bounds = self.getSelectionBounds(true);\n if (!bounds) return;\n\n for (let row = bounds.top; row <= bounds.bottom; row++) {\n if (!self.isRowSelected(row)) {\n continue;\n }\n self.sizes.rows[row] = height;\n self.dispatchResizeRow({\n width: self.resizingStartingWidth,\n height: height,\n rowIndex: row,\n draggingItem: self.currentCell,\n });\n }\n };\n\n /**\n * Selects a column.\n * @memberof canvasDatagrid\n * @name selectColumn\n * @method\n * @param {number} columnIndex The column index to select.\n * @param {boolean} toggleSelectMode When true, behaves as if you were holding control/command when you clicked the column.\n * @param {boolean} shift When true, behaves as if you were holding shift when you clicked the column.\n * @param {boolean} suppressEvent When true, prevents the selectionchanged event from firing.\n */\n self.selectColumn = (columnIndex, ctrl, shift, suppressEvent) => {\n self.isMultiRowsSelected = false;\n self.isMultiColumnsSelected = false;\n function addCol(i) {\n addIntoSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Columns,\n startColumn: i,\n }),\n );\n }\n function removeCol(i) {\n removeFromSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Columns,\n startColumn: i,\n }),\n );\n }\n if (shift) {\n if (!self.activeCell) {\n return;\n }\n const s = Math.min(self.activeCell.columnIndex, columnIndex);\n const e = Math.max(self.activeCell.columnIndex, columnIndex);\n addIntoSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Columns,\n startColumn: s,\n endColumn: e - 1,\n }),\n );\n if (s != e) self.isMultiColumnsSelected = true;\n }\n if (!ctrl && !shift) {\n self.selections = [];\n self.activeCell.columnIndex = columnIndex;\n self.activeCell.rowIndex = self.scrollIndexTop;\n }\n if (ctrl && self.isColumnSelected(columnIndex)) {\n removeCol(columnIndex);\n } else {\n addCol(columnIndex);\n }\n if (suppressEvent) {\n return;\n }\n self.dispatchSelectionChangedEvent();\n };\n\n /**\n * Selects a row.\n * @memberof canvasDatagrid\n * @name selectRow\n * @method\n * @param {number} rowIndex The row index to select.\n * @param {boolean} ctrl When true, behaves as if you were holding control/command when you clicked the row.\n * @param {boolean} shift When true, behaves as if you were holding shift when you clicked the row.\n * @param {boolean} supressSelectionchangedEvent When true, prevents the selectionchanged event from firing.\n */\n self.selectRow = (rowIndex, ctrl, shift, suppressEvent) => {\n self.isMultiRowsSelected = false;\n function de() {\n if (suppressEvent) {\n return;\n }\n self.dispatchSelectionChangedEvent();\n }\n function addRow(ri) {\n addIntoSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Rows,\n startRow: ri,\n }),\n );\n }\n if (self.dragAddToSelection === false || self.dragObject === undefined) {\n if (isRowSelected(self.selections, rowIndex) && ctrl) {\n removeFromSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Rows,\n startRow: rowIndex,\n }),\n );\n de();\n return;\n }\n }\n if (self.dragAddToSelection === true || self.dragObject === undefined) {\n if (shift && self.dragObject === undefined) {\n if (!self.activeCell) {\n return;\n }\n const st = Math.min(self.activeCell.rowIndex, rowIndex);\n const en = Math.max(self.activeCell.rowIndex, rowIndex);\n addIntoSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Rows,\n startRow: st,\n endRow: en,\n }),\n );\n } else {\n addRow(rowIndex);\n }\n }\n de();\n };\n\n /**\n * @param {function} iterator signature: `(cell: any) => any`\n * @param {object} bounds type: `{left:number;right:number;top:number;bottom:number}`\n * @param {boolean} [expandToRow]\n */\n function iterateSelectedCells(iterator, bounds, expandToRow) {\n if (!bounds) return;\n const { top, bottom, left, right } = bounds;\n const height = bottom - top + 1;\n const width = right - left + 1;\n const states = getSelectionStateFromCells(self.selections, {\n startRow: top,\n endRow: bottom,\n startColumn: left,\n endColumn: right,\n });\n if (states === false) return;\n\n const orderedSchema = getSchemaOrderByViewIndex(left, width);\n for (let row = top, row2 = top + height; row < row2; row++) {\n const viewData = self.viewData[row] || {};\n const rowState = states === true || states[row - top];\n if (!rowState) continue;\n for (let col = left, col2 = left + width; col < col2; col++) {\n if (rowState !== true && !rowState[col - left]) continue;\n\n const header = orderedSchema[col];\n if (!header || (header.hidden && !expandToRow)) continue;\n\n const cell = {\n value: viewData[header.name],\n header,\n columnName: header.name,\n boundRowIndex: self.getBoundRowIndexFromViewRowIndex(row),\n boundColumnIndex: self.orders.columns[col],\n viewRowIndex: row,\n viewColumnIndex: col,\n };\n iterator(cell);\n }\n }\n }\n\n /**\n * Selects an area of the grid.\n * @memberof canvasDatagrid\n * @name selectArea\n * @method\n * @param {rect} [bounds] A rect object representing the selected values.\n * @param {boolean} [ctrl]\n */\n self.selectArea = function (bounds, ctrl) {\n const schemaLength = self.getSchema().length;\n if (bounds) {\n if (bounds.right < 0) {\n // patch for API compatibility\n bounds.right = Math.max(schemaLength - 1, bounds.left, 0);\n }\n if (bounds.top > bounds.bottom || bounds.left > bounds.right)\n throw new Error('Impossible selection area');\n self.selectionBounds = self.sanitizeSelectionBounds(bounds);\n }\n let { top, bottom, left, right } = self.selectionBounds;\n if (!ctrl) self.selections = [];\n\n if (bottom >= self.viewData.length)\n bottom = Math.max(self.viewData.length - 1, top);\n if (top < -1 || left < -1 || right > schemaLength)\n throw new Error('Impossible selection area');\n\n /** @type {ContextForSelectionAction} */\n const context = { rows: self.viewData.length, columns: schemaLength };\n let changed = false;\n\n // In original API, number -1 indicates selecting whole row or selecting while column.\n if (top === -1) {\n // select whole columns\n const startColumn = Math.max(left, 0);\n // left eq -1 means selecting all cells\n const endRow =\n left === -1 ? schemaLength - 1 : Math.min(right, schemaLength - 1);\n changed = addIntoSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Columns,\n startColumn: startColumn,\n endColumn: endRow,\n }),\n context,\n );\n } else if (left === -1) {\n // select whole rows\n const startRow = Math.max(top, 0);\n const endRow = Math.min(bottom, self.viewData.length - 1);\n changed = addIntoSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Rows,\n startRow: startRow,\n endRow: endRow,\n }),\n context,\n );\n } else {\n changed = addIntoSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Cells,\n startRow: top,\n endRow: bottom,\n startColumn: left,\n endColumn: right,\n }),\n context,\n );\n }\n if (changed) self.dispatchSelectionChangedEvent();\n };\n\n /**\n * This private method is using for make existing API about selection works.\n * TODO: This method can be removed by a better way.\n * @param {number} [rowIndex] 0 by default\n * @returns {number[]|undefined}\n */\n self.getRowSelectionStates = (rowIndex) => {\n if (typeof rowIndex !== 'number' || rowIndex < 0) rowIndex = 0;\n const startColumn = 0;\n const endRow = self.getSchema().length - 1;\n const width = endRow - startColumn + 1;\n const state = getSelectionStateFromCells(self.selections, {\n startRow: rowIndex,\n startColumn: startColumn,\n endRow: rowIndex,\n endColumn: endRow,\n });\n if (state === false) return;\n if (state === true) return new Array(width).fill(true).map((_, i) => i);\n\n const firstRow = state[0];\n if (!firstRow) return;\n\n const result = [];\n for (let col = 0; col < firstRow.length; col++)\n if (firstRow[col]) result.push(col);\n return result;\n };\n\n /**\n * Replace current selection list with new selection list\n * @param {object[]} newSelections New selection list\n */\n self.replaceAllSelections = (newSelections) => {\n cleanupSelections(newSelections);\n self.selections = newSelections;\n };\n\n /**\n * Select given columns and remove other existing selection area\n * @param {number[]} viewIndexes A number array that represents column view indexes\n */\n self.selectColumnViewIndexes = (viewIndexes) => {\n const selections = viewIndexes.map((col) => ({\n type: SelectionType.Columns,\n startColumn: col,\n endRow: col,\n }));\n self.replaceAllSelections(selections);\n };\n\n /**\n * This method will be a bottleneck in the future if this component\n * need to ship large dataset. But why I wrote this function:\n * 1. it is used for compatibility with existing APIs\n * 2. this component still has a bottleneck on the selection even there is not this function.\n * @returns {number[]}\n */\n self.getRowViewIndexesFromSelection = () => {\n if (self.selections.length === 0) return [];\n const bounds = getSelectionBounds(self.selections, true);\n const result = [];\n for (let rowIndex = bounds.top; rowIndex <= bounds.bottom; rowIndex++)\n result.push(rowIndex);\n return result;\n };\n\n /**\n * @param {object} cell Signature: `{rowIndex:number;columnIndex:number}`\n * @param {object} keyEvent Signature: `{key:string;shiftKey:boolean}`\n * @param {boolean} [suppressEvent]\n */\n self.shrinkOrExpandSelections = (cell, keyEvent, suppressEvent) => {\n const result = shrinkOrExpandSelections(self.selections, cell, keyEvent, {\n columns: self.getSchema().length,\n rows: self.viewData.length,\n });\n if (result && !suppressEvent) self.dispatchSelectionChangedEvent();\n return result;\n };\n\n /**\n * @param {number} [fromIndex]\n * @param {number} [len]\n */\n function getSchemaOrderByViewIndex(fromIndex, len) {\n const schema = self.getSchema();\n const orderedSchema = [];\n for (let col = fromIndex, col2 = fromIndex + len; col < col2; col++) {\n const orderedIndex = self.orders.columns[col];\n const header = schema[orderedIndex];\n orderedSchema[col] = header;\n }\n return orderedSchema;\n }\n\n /**\n * TODO: this function will be used for caching\n * Concatenating two 2-dimensional array.\n * It is simuliar with the method `concatenating` method of the Python module named `numpy`\n * @template T\n * @param {T[][]} a the first 2d array\n * @param {T[][]} b the second 2d array\n * @param {number} axis 1 implies that it is being done column-wise, otherwise row-wise\n * @returns {T[][]}\n */\n function concatenate2DArray(a, b, axis) {\n if (axis === 1) {\n const result = new Array(a.length);\n for (let i = 0; i < a.length; i++) {\n const rowInA = a[i];\n const rowInB = b[i];\n result[i] = rowInA.concat(rowInB);\n }\n }\n return a.concat(b);\n }\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false, Event: false*/\n'use strict';\n\nexport default function (self) {\n var zIndexTop, hoverScrollTimeout, autoCompleteContext;\n function applyContextItemStyle(contextItemContainer) {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item' + (self.mobile ? '-mobile' : ''),\n );\n contextItemContainer.addEventListener('mouseover', function () {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item:hover',\n );\n });\n contextItemContainer.addEventListener('mouseout', function () {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item',\n );\n });\n }\n function createContextMenu(ev, pos, items, parentContextMenu) {\n var container = document.createElement('div'),\n upArrow = document.createElement('div'),\n downArrow = document.createElement('div'),\n children = [],\n selectedIndex = -1,\n intf = {},\n rect;\n if (!Array.isArray(items)) {\n throw new Error('createContextMenu expects an array.');\n }\n function createItems() {\n items.forEach(function (item) {\n var contextItemContainer = document.createElement('div'),\n childMenuArrow;\n function removeChildContext(e) {\n if (\n e.relatedTarget === container ||\n item.contextMenu.container === e.relatedTarget ||\n childMenuArrow === e.relatedTarget ||\n contextItemContainer === e.relatedTarget ||\n item.contextMenu.container.contains(e.relatedTarget)\n ) {\n return;\n }\n item.contextMenu.dispose();\n children.splice(children.indexOf(item.contextMenu), 1);\n item.contextMenu = undefined;\n contextItemContainer.removeEventListener(\n 'mouseout',\n removeChildContext,\n );\n container.removeEventListener('mouseout', removeChildContext);\n contextItemContainer.setAttribute('contextOpen', '0');\n contextItemContainer.setAttribute('opening', '0');\n }\n function contextAddCallback(items) {\n // check yet again if the user hasn't moved off\n if (\n contextItemContainer.getAttribute('opening') !== '1' ||\n contextItemContainer.getAttribute('contextOpen') === '1'\n ) {\n return;\n }\n var cPos = contextItemContainer.getBoundingClientRect();\n cPos = {\n left:\n cPos.left +\n self.style.childContextMenuMarginLeft +\n container.offsetWidth,\n top: cPos.top + self.style.childContextMenuMarginTop,\n bottom: cPos.bottom,\n right: cPos.right,\n };\n item.contextMenu = createContextMenu(ev, cPos, items, intf);\n contextItemContainer.setAttribute('contextOpen', '1');\n contextItemContainer.addEventListener('mouseout', removeChildContext);\n container.addEventListener('mouseout', removeChildContext);\n children.push(item.contextMenu);\n }\n function createChildContext() {\n var i;\n if (contextItemContainer.getAttribute('contextOpen') === '1') {\n return;\n }\n contextItemContainer.setAttribute('opening', '1');\n if (typeof item.items === 'function') {\n i = item.items.apply(intf, [\n function (items) {\n contextAddCallback(items);\n },\n ]);\n if (i !== undefined && Array.isArray(i)) {\n contextAddCallback(i);\n }\n return;\n }\n contextAddCallback(item.items);\n }\n function addItem(item) {\n function addContent(content) {\n if (content === null) {\n return;\n }\n if (typeof content === 'function') {\n return addContent(content(ev));\n }\n if (typeof content === 'object') {\n contextItemContainer.appendChild(content);\n return;\n }\n applyContextItemStyle(contextItemContainer);\n contextItemContainer.innerHTML = content;\n return;\n }\n addContent(item.title);\n item.contextItemContainer = contextItemContainer;\n if (\n (item.items && item.items.length > 0) ||\n typeof item.items === 'function'\n ) {\n childMenuArrow = document.createElement('div');\n self.createInlineStyle(\n childMenuArrow,\n 'canvas-datagrid-context-child-arrow',\n );\n childMenuArrow.innerHTML = self.style.childContextMenuArrowHTML;\n contextItemContainer.appendChild(childMenuArrow);\n contextItemContainer.addEventListener(\n 'mouseover',\n createChildContext,\n );\n contextItemContainer.addEventListener('mouseout', function () {\n contextItemContainer.setAttribute('opening', '0');\n });\n }\n if (item.click) {\n contextItemContainer.addEventListener('click', function (ev) {\n item.click.apply(self, [ev]);\n });\n }\n }\n addItem(item);\n container.appendChild(contextItemContainer);\n });\n }\n function clickIndex(idx) {\n items[idx].contextItemContainer.dispatchEvent(new Event('click'));\n }\n function checkArrowVisibility() {\n if (container.scrollTop > 0) {\n self.parentDOMNode.appendChild(upArrow);\n } else if (upArrow.parentNode) {\n upArrow.parentNode.removeChild(upArrow);\n }\n if (\n container.scrollTop >=\n container.scrollHeight - container.offsetHeight &&\n downArrow.parentNode\n ) {\n downArrow.parentNode.removeChild(downArrow);\n } else if (\n container.scrollHeight - container.offsetHeight > 0 &&\n !(\n container.scrollTop >=\n container.scrollHeight - container.offsetHeight\n )\n ) {\n self.parentDOMNode.appendChild(downArrow);\n }\n }\n function fade(element) {\n var opacity = 1;\n var timer = setInterval(function () {\n if (opacity <= 0.1) {\n clearInterval(timer);\n element.style.display = 'none';\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n }\n }\n element.style.opacity = opacity;\n element.style.filter = 'alpha(opacity=' + opacity * 100 + ')';\n opacity -= opacity * 0.1;\n }, self.attributes.animationDurationHideContextMenu * 0.1);\n }\n function unfade(element) {\n var opacity = 0.1;\n element.style.display = 'block';\n var timer = setInterval(function () {\n if (opacity >= 1) {\n clearInterval(timer);\n }\n element.style.opacity = opacity;\n element.style.filter = 'alpha(opacity=' + opacity * 100 + ')';\n opacity += opacity * 0.1;\n }, self.attributes.animationDurationShowContextMenu * 0.1);\n }\n function startHoverScroll(type) {\n return function t() {\n var a = self.attributes.contextHoverScrollAmount;\n if (type === 'up' && container.scrollTop === 0) {\n return;\n }\n if (type === 'down' && container.scrollTop === container.scrollHeight) {\n return;\n }\n container.scrollTop += type === 'up' ? -a : a;\n hoverScrollTimeout = setTimeout(\n t,\n self.attributes.contextHoverScrollRateMs,\n type,\n );\n };\n }\n function endHoverScroll(type) {\n return function () {\n clearTimeout(hoverScrollTimeout);\n };\n }\n function init() {\n var loc = {},\n s = self.scrollOffset(self.canvas);\n if (zIndexTop === undefined) {\n zIndexTop = self.style.contextMenuZIndex;\n }\n createItems();\n self.createInlineStyle(\n container,\n 'canvas-datagrid-context-menu' + (self.mobile ? '-mobile' : ''),\n );\n loc.x = pos.left - s.left;\n loc.y = pos.top - s.top;\n loc.height = 0;\n zIndexTop += 1;\n container.style.opacity = 0;\n container.style.position = 'absolute';\n upArrow.style.color = self.style.contextMenuArrowColor;\n downArrow.style.color = self.style.contextMenuArrowColor;\n [upArrow, downArrow].forEach(function (el) {\n el.style.textAlign = 'center';\n el.style.position = 'absolute';\n el.style.zIndex = zIndexTop + 1;\n });\n container.style.zIndex = zIndexTop;\n if (parentContextMenu && parentContextMenu.inputDropdown) {\n container.style.maxHeight =\n window.innerHeight -\n loc.y -\n self.style.autocompleteBottomMargin +\n 'px';\n container.style.minWidth = pos.width + 'px';\n loc.y += pos.height;\n }\n if (self.mobile) {\n container.style.width = pos.width + 'px';\n }\n container.style.left = loc.x + 'px';\n container.style.top = loc.y + 'px';\n container.addEventListener('scroll', checkArrowVisibility);\n container.addEventListener('wheel', function (e) {\n if (self.hasFocus) {\n container.scrollTop += e.deltaY;\n container.scrollLeft += e.deltaX;\n }\n checkArrowVisibility();\n });\n upArrow.innerHTML = self.style.contextMenuArrowUpHTML;\n downArrow.innerHTML = self.style.contextMenuArrowDownHTML;\n container.appendChild(upArrow);\n document.body.appendChild(downArrow);\n document.body.appendChild(container);\n unfade(container);\n rect = container.getBoundingClientRect();\n // TODO: fix !(parentContextMenu && parentContextMenu.inputDropdown) state (autocomplete)\n if (rect.bottom > window.innerHeight) {\n if (!(parentContextMenu && parentContextMenu.inputDropdown)) {\n loc.y -=\n rect.bottom +\n self.style.contextMenuWindowMargin -\n window.innerHeight;\n }\n if (loc.y < 0) {\n loc.y = self.style.contextMenuWindowMargin;\n }\n if (\n container.offsetHeight >\n window.innerHeight - self.style.contextMenuWindowMargin\n ) {\n container.style.height =\n window.innerHeight - self.style.contextMenuWindowMargin * 2 + 'px';\n }\n }\n if (rect.right > window.innerWidth) {\n loc.x -=\n rect.right - window.innerWidth + self.style.contextMenuWindowMargin;\n }\n if (loc.x < 0) {\n loc.x = self.style.contextMenuWindowMargin;\n }\n if (loc.y < 0) {\n loc.y = self.style.contextMenuWindowMargin;\n }\n container.style.left = loc.x + 'px';\n container.style.top = loc.y + 'px';\n rect = container.getBoundingClientRect();\n upArrow.style.top = rect.top + 'px';\n downArrow.style.top =\n rect.top + rect.height - downArrow.offsetHeight + 'px';\n upArrow.style.left = rect.left + 'px';\n downArrow.style.left = rect.left + 'px';\n downArrow.style.width = container.offsetWidth + 'px';\n upArrow.style.width = container.offsetWidth + 'px';\n downArrow.addEventListener('mouseover', startHoverScroll('down'));\n downArrow.addEventListener('mouseout', endHoverScroll('down'));\n upArrow.addEventListener('mouseover', startHoverScroll('up'));\n upArrow.addEventListener('mouseout', endHoverScroll('up'));\n checkArrowVisibility();\n }\n intf.parentGrid = self.intf;\n intf.parentContextMenu = parentContextMenu;\n intf.container = container;\n init();\n intf.clickIndex = clickIndex;\n intf.rect = rect;\n intf.items = items;\n intf.upArrow = upArrow;\n intf.downArrow = downArrow;\n intf.dispose = function () {\n clearTimeout(hoverScrollTimeout);\n children.forEach(function (c) {\n c.dispose();\n });\n [downArrow, upArrow, container].forEach(function (el) {\n fade(el);\n });\n };\n Object.defineProperty(intf, 'selectedIndex', {\n get: function () {\n return selectedIndex;\n },\n set: function (value) {\n if (typeof value !== 'number' || isNaN(value) || !isFinite(value)) {\n throw new Error('Context menu selected index must be a sane number.');\n }\n selectedIndex = value;\n if (selectedIndex > items.length - 1) {\n selectedIndex = items.length - 1;\n }\n if (selectedIndex < 0) {\n selectedIndex = 0;\n }\n items.forEach(function (item, index) {\n if (index === selectedIndex) {\n return self.createInlineStyle(\n item.contextItemContainer,\n 'canvas-datagrid-context-menu-item:hover',\n );\n }\n self.createInlineStyle(\n item.contextItemContainer,\n 'canvas-datagrid-context-menu-item',\n );\n });\n },\n });\n return intf;\n }\n function createFilterContextMenuItems(e) {\n var filterContainer = document.createElement('div'),\n filterLabel = document.createElement('div'),\n filterAutoCompleteButton = document.createElement('button'),\n filterInput = document.createElement('input'),\n n =\n e.cell && e.cell.header\n ? e.cell.header.title || e.cell.header.name\n : '',\n iRect;\n function checkRegExpErrorState() {\n filterInput.style.background = self.style.contextFilterInputBackground;\n filterInput.style.color = self.style.contextFilterInputColor;\n if (self.invalidFilterRegEx) {\n filterInput.style.background =\n self.style.contextFilterInvalidRegExpBackground;\n filterInput.style.color = self.style.contextFilterInvalidRegExpColor;\n }\n }\n function fillAutoComplete() {\n var count = 0;\n var items = {};\n var blanksItem = [];\n\n self.viewData.forEach(function (row) {\n var cellValue =\n row[e.cell.header.name] == null\n ? row[e.cell.header.name]\n : String(row[e.cell.header.name]).trim();\n var value = self.blankValues.includes(cellValue)\n ? self.attributes.blanksText\n : cellValue;\n\n if (items[value] || count > self.attributes.maxAutoCompleteItems) {\n return;\n }\n count += 1;\n items[value] = {\n title: self.formatters[e.cell.header.type || 'string']({\n cell: { value: value },\n }),\n click: function (e) {\n filterInput.value = value;\n e.stopPropagation();\n filterInput.dispatchEvent(new Event('keyup'));\n self.disposeAutocomplete();\n return;\n },\n };\n });\n\n if (Object.keys(items).indexOf(self.attributes.blanksText) !== -1) {\n blanksItem.push(items[self.attributes.blanksText]);\n delete items[self.attributes.blanksText];\n }\n\n return blanksItem.concat(\n Object.keys(items).map(function (key) {\n return items[key];\n }),\n );\n }\n\n function createAutoCompleteContext(ev) {\n if (ev && ['ArrowDown', 'ArrowUp', 'Enter', 'Tab'].includes(ev.key)) {\n return;\n }\n\n var autoCompleteItems = fillAutoComplete();\n\n iRect = filterInput.getBoundingClientRect();\n if (autoCompleteContext) {\n autoCompleteContext.dispose();\n autoCompleteContext = undefined;\n }\n autoCompleteContext = createContextMenu(\n e,\n {\n left: iRect.left,\n top: iRect.top,\n right: iRect.right,\n bottom: iRect.bottom,\n height: iRect.height,\n width: iRect.width,\n },\n autoCompleteItems,\n { inputDropdown: true },\n );\n autoCompleteContext.selectedIndex = 0;\n }\n self.createInlineStyle(filterLabel, 'canvas-datagrid-context-menu-label');\n self.createInlineStyle(\n filterAutoCompleteButton,\n 'canvas-datagrid-context-menu-filter-button',\n );\n self.createInlineStyle(\n filterInput,\n 'canvas-datagrid-context-menu-filter-input',\n );\n checkRegExpErrorState();\n filterInput.onclick = self.disposeAutocomplete;\n filterInput.addEventListener('keydown', function (e) {\n if (e.key === 'ArrowDown') {\n autoCompleteContext.selectedIndex += 1;\n }\n\n if (e.key === 'ArrowUp') {\n autoCompleteContext.selectedIndex -= 1;\n }\n\n if (e.key === 'Enter') {\n autoCompleteContext.clickIndex(autoCompleteContext.selectedIndex);\n self.disposeContextMenu();\n }\n\n if (e.key === 'Tab') {\n autoCompleteContext.clickIndex(autoCompleteContext.selectedIndex);\n e.preventDefault();\n }\n\n if (e.key === 'Escape') {\n self.disposeContextMenu();\n }\n });\n filterInput.addEventListener('keyup', function () {\n self.setFilter(e.cell.header.name, filterInput.value);\n });\n filterInput.addEventListener('keyup', createAutoCompleteContext);\n ['focus', 'blur', 'keydown', 'keyup', 'change'].forEach(function (en) {\n filterInput.addEventListener(en, checkRegExpErrorState);\n });\n filterInput.value = e.cell.header\n ? self.columnFilters[e.cell.header.name] || ''\n : '';\n filterLabel.innerHTML = self.attributes.filterOptionText.replace(/%s/g, n);\n filterAutoCompleteButton.onclick = function () {\n if (autoCompleteContext) {\n return self.disposeAutocomplete();\n }\n createAutoCompleteContext();\n };\n filterAutoCompleteButton.innerHTML = self.style.contextFilterButtonHTML;\n filterContainer.addEventListener('click', function (e) {\n return e.stopPropagation();\n });\n filterContainer.appendChild(filterLabel);\n filterContainer.appendChild(filterInput);\n filterContainer.appendChild(filterAutoCompleteButton);\n e.items.push({\n title: filterContainer,\n });\n if (Object.keys(self.columnFilters).length) {\n Object.keys(self.columnFilters).forEach(function (cf) {\n var h = self.getHeaderByName(cf);\n e.items.push({\n title: self.attributes.removeFilterOptionText.replace(\n /%s/g,\n h.title || h.name,\n ),\n click: function removeFilterClick(e) {\n e.preventDefault();\n self.setFilter(cf, '');\n self.controlInput.focus();\n },\n });\n });\n }\n }\n\n function addDefaultContextMenuItem(e) {\n const schema = self.getSchema();\n /**\n * A map between columnIndex and column data\n * @type {Map<string,any>}\n */\n let columns;\n const getColumnsMap = () => {\n if (!columns)\n columns = new Map(schema.map((_col) => [_col.columnIndex, _col]));\n return columns;\n };\n const isSorting =\n self.orderings.columns && self.orderings.columns.length > 0;\n\n const isNormalCell =\n !(\n e.cell.isBackground ||\n e.cell.isColumnHeaderCellCap ||\n e.cell.isScrollBar ||\n e.cell.isCorner ||\n e.cell.isRowHeader\n ) && e.cell.header;\n if (self.attributes.showFilter && isNormalCell) {\n createFilterContextMenuItems(e);\n }\n if (self.attributes.showCopy && self.canSelectionsBeCopied()) {\n e.items.push({\n title: self.attributes.copyText,\n click: function () {\n document.execCommand('copy');\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n if (self.attributes.showPaste && self.clipBoardData) {\n e.items.push({\n title: self.attributes.pasteText,\n click: function () {\n // Original function call:\n // self.paste(self.clipBoardData, e.cell.columnIndex, e.cell.rowIndex);\n // We can remove the last two parameters follow\n // because this function only need one parameter by following the function declaration\n self.paste(self.clipBoardData);\n self.draw();\n },\n });\n }\n if (self.attributes.showColumnSelector) {\n e.items.push({\n title: self.attributes.columnSelectorText,\n items: function () {\n var d = [];\n self.getSchema().forEach(function (column) {\n function toggleColumnVisibility(e) {\n column.hidden = !column.hidden;\n self.dispatchEvent('togglecolumn', {\n column: column,\n hidden: column.hidden,\n });\n e.preventDefault();\n self.stopPropagation(e);\n self.disposeContextMenu();\n self.resize(true);\n self.setStorageData();\n }\n var el = document.createElement('div');\n applyContextItemStyle(el);\n el.addEventListener('touchstart', toggleColumnVisibility);\n el.addEventListener('click', toggleColumnVisibility);\n el.innerHTML =\n (column.hidden\n ? self.attributes.columnSelectorHiddenText\n : self.attributes.columnSelectorVisibleText) +\n (column.title || column.name);\n d.push({\n title: el,\n });\n });\n return d;\n },\n });\n if (e.cell && e.cell.header && e.cell.columnIndex > -1) {\n // This variable represents the order index because of the following codes from `draw.js`:\n // columnIndex: columnOrderIndex,\n const columnOrderIndex = e.cell.columnIndex;\n const columnIndex = self.orders.columns[columnOrderIndex];\n\n const contiguousColumns = self.getSelectedContiguousColumns(schema);\n let title = '';\n if (contiguousColumns) {\n title = contiguousColumns\n .map((col) => col.title || col.name)\n .join('-');\n } else {\n const column = schema[columnIndex];\n if (column) title = column.title || column.name;\n }\n e.items.push({\n title: self.attributes.hideColumnText.replace(/%s/gi, title),\n click: function (ev) {\n ev.preventDefault();\n self.stopPropagation(ev);\n self.disposeContextMenu();\n if (contiguousColumns) {\n self.hideColumns(\n contiguousColumns[0].orderIndex,\n contiguousColumns[1].orderIndex,\n );\n } else {\n self.hideColumns(columnOrderIndex);\n }\n },\n });\n }\n }\n if (\n self.attributes.saveAppearance &&\n self.attributes.showClearSettingsOption &&\n (Object.keys(self.sizes.rows).length > 0 ||\n Object.keys(self.sizes.columns).length > 0)\n ) {\n e.items.push({\n title: self.attributes.clearSettingsOptionText,\n click: function (e) {\n e.preventDefault();\n self.sizes.rows = {};\n self.sizes.columns = {};\n self.createRowOrders();\n self.createColumnOrders();\n self.storedSettings = undefined;\n self.dispatchEvent('resizecolumn', {\n columnWidth: self.style.cellWidth,\n });\n self.dispatchResizeRow({\n height: self.style.cellHeight,\n });\n self.setStorageData();\n self.resize(true);\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n if (\n self.attributes.allowSorting &&\n self.attributes.showOrderByOption &&\n isNormalCell\n ) {\n e.items.push({\n title: self.attributes.showOrderByOptionTextAsc.replace(\n '%s',\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.order(e.cell.header.name, 'asc');\n self.controlInput.focus();\n },\n });\n e.items.push({\n title: self.attributes.showOrderByOptionTextDesc.replace(\n '%s',\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.order(e.cell.header.name, 'desc');\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n\n //#region hide rows\n const canHideRows = !isSorting && e.cell.isRowHeader && e.cell.header;\n if (canHideRows) {\n const range = self.getSelectedContiguousRows(true);\n if (range) {\n const boundRowIndexes = range.map((viewRowIndex) =>\n self.getBoundRowIndexFromViewRowIndex(viewRowIndex),\n );\n let title;\n if (boundRowIndexes.length === 1) {\n if (typeof boundRowIndexes[0] === 'number')\n title = boundRowIndexes[0] + 1;\n else title = range[0] + 1;\n\n title = self.attributes.showHideRow.replace('%s', title);\n // hide one row\n e.items.push({\n title,\n click: function (ev) {\n ev.preventDefault();\n self.hideRows(boundRowIndexes[0], boundRowIndexes[0]);\n },\n });\n } else if (boundRowIndexes[0] <= boundRowIndexes[1]) {\n title = boundRowIndexes\n .map((it, index) => {\n if (typeof it === 'number') return it + 1;\n return range[index] + 1;\n })\n .join('-');\n title = self.attributes.showHideRows.replace('%s', title);\n // hide rows\n e.items.push({\n title,\n click: function (ev) {\n ev.preventDefault();\n self.hideRows(boundRowIndexes[0], boundRowIndexes[1]);\n },\n });\n }\n }\n }\n //#endregion hide rows\n\n //#region group/ungroup columns\n const groupAreaHeight = self.getColumnGroupAreaHeight();\n const groupAreaWidth = self.getRowGroupAreaWidth();\n const setCollapseStateForAllGroups = (allGroups, collapsed) => {\n if (allGroups.length === 0) return;\n for (let i = 0; i < allGroups.length; i++) {\n const groups = allGroups[i];\n for (let j = 0; j < groups.length; j++) {\n const group = groups[j];\n group.collapsed = collapsed;\n }\n }\n self.refresh();\n };\n if (e.pos && e.pos.y < groupAreaHeight) {\n e.items.push({\n title: self.attributes.showRemoveAllGroupColumns,\n click: function (ev) {\n ev.preventDefault();\n self.groupedColumns = [];\n self.refresh();\n },\n });\n e.items.push({\n title: self.attributes.showExpandAllGroupColumns,\n click: function (ev) {\n ev.preventDefault();\n setCollapseStateForAllGroups(self.groupedColumns, false);\n },\n });\n e.items.push({\n title: self.attributes.showCollapseAllGroupColumns,\n click: function (ev) {\n ev.preventDefault();\n setCollapseStateForAllGroups(self.groupedColumns, true);\n },\n });\n }\n if (e.pos && e.pos.x < groupAreaWidth) {\n e.items.push({\n title: self.attributes.showRemoveAllGroupRows,\n click: function (ev) {\n ev.preventDefault();\n self.groupedRows = [];\n self.refresh();\n },\n });\n e.items.push({\n title: self.attributes.showExpandAllGroupRows,\n click: function (ev) {\n ev.preventDefault();\n setCollapseStateForAllGroups(self.groupedRows, false);\n },\n });\n e.items.push({\n title: self.attributes.showCollapseAllGroupRows,\n click: function (ev) {\n ev.preventDefault();\n setCollapseStateForAllGroups(self.groupedRows, true);\n },\n });\n }\n\n const canGroupByColumns =\n self.attributes.allowGroupingColumns &&\n e.cell.isColumnHeader &&\n e.cell.header &&\n e.cell.header.index > 0;\n const canUngroupColumns =\n self.attributes.allowGroupingColumns && e.cell.isColumnHeader;\n const canGroupByRows =\n !isSorting &&\n self.attributes.allowGroupingRows &&\n e.cell.isRowHeader &&\n e.cell.header;\n const canUngroupRows =\n self.attributes.allowGroupingRows && e.cell.isRowHeader;\n\n if (canGroupByColumns) {\n /** @type {number[]} */\n const groupIndexes = [];\n /** @type {number} */\n const headerIndex = e.cell.header.index;\n let col = headerIndex;\n for (; col >= 0; col--) {\n if (!self.isColumnSelected(col)) break;\n groupIndexes[0] = col;\n }\n for (col = headerIndex; ; col++) {\n if (!self.isColumnSelected(col)) break;\n groupIndexes[1] = col;\n }\n if (\n col !== headerIndex &&\n groupIndexes.length === 2 &&\n groupIndexes[1] > groupIndexes[0] &&\n self.isNewGroupRangeValid(\n self.groupedColumns,\n groupIndexes[0],\n groupIndexes[1],\n )\n ) {\n const columns = getColumnsMap();\n const groupTitles = [];\n const groupNames = [];\n for (let i = 0; i < groupIndexes.length; i++) {\n const columnIndex = groupIndexes[i];\n const column = columns.get(columnIndex);\n if (column) {\n groupNames.push(column.name);\n groupTitles.push(column.title || column.name || column.index);\n }\n }\n if (groupNames[0] && groupNames[1]) {\n // show group options\n e.items.push({\n title: self.attributes.showGroupColumns.replace(\n '%s',\n groupTitles[0] + '-' + groupTitles[1],\n ),\n click: function (ev) {\n ev.preventDefault();\n self.groupColumns(groupNames[0], groupNames[1]);\n self.controlInput.focus();\n },\n });\n }\n }\n }\n if (canUngroupColumns) {\n const columnIndex = e.cell.columnIndex;\n const groups = self.getGroupsColumnBelongsTo(columnIndex);\n const columns = getColumnsMap();\n for (let i = 0; i < groups.length; i++) {\n const { from, to } = groups[i];\n const cell0 = columns.get(from);\n const cell1 = columns.get(to);\n if (cell0 && cell1) {\n const formatArgs =\n (cell0.title || cell0.name || cell0.index) +\n '-' +\n (cell1.title || cell1.name || cell1.index);\n e.items.push({\n title: self.attributes.showRemoveGroupColumns.replace(\n '%s',\n formatArgs,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.removeGroupColumns(cell0.name, cell1.name);\n self.controlInput.focus();\n },\n });\n } else {\n console.warn(`Cannot find column ${from} or column ${to}`);\n }\n }\n }\n if (canGroupByRows) {\n const range = self.getSelectedContiguousRows(false) || [];\n const rangeTitle = range\n .map((rowIndex) => {\n const index = self.getBoundRowIndexFromViewRowIndex(rowIndex);\n if (typeof index === 'number') return index + 1;\n return rowIndex + 1;\n })\n .join('-');\n if (\n range.length === 2 &&\n self.isNewGroupRangeValid(self.groupedRows, range[0], range[1])\n ) {\n e.items.push({\n title: self.attributes.showGroupRows.replace('%s', rangeTitle),\n click: function (ev) {\n ev.preventDefault();\n self.groupRows(range[0], range[1]);\n },\n });\n }\n }\n if (canUngroupRows) {\n const rowIndex = e.cell.rowIndex;\n const groups = self.getGroupsRowBelongsTo(rowIndex);\n for (let i = 0; i < groups.length; i++) {\n const { from, to } = groups[i];\n const rangeTitle = [from, to]\n .map((rowIndex) => {\n const index = self.getBoundRowIndexFromViewRowIndex(rowIndex);\n if (typeof index === 'number') return index + 1;\n return rowIndex + 1;\n })\n .join('-');\n e.items.push({\n title: self.attributes.showRemoveGroupRows.replace('%s', rangeTitle),\n click: function (ev) {\n ev.preventDefault();\n self.removeGroupRows(from, to);\n self.controlInput.focus();\n },\n });\n }\n }\n //#endregion group/ungroup columns\n }\n self.disposeAutocomplete = function () {\n if (autoCompleteContext) {\n autoCompleteContext.dispose();\n autoCompleteContext = undefined;\n }\n };\n self.disposeContextMenu = function (event) {\n if (\n event &&\n event.type === 'click' &&\n event.ctrlKey &&\n self.contextMenuOpenedAt !== undefined &&\n performance.now() - self.contextMenuOpenedAt < 500\n ) {\n // macOS Safari dispatches a click right after a ctrl-click contextmenu,\n // which would close the menu immediately (#521)\n return;\n }\n document.removeEventListener('click', self.disposeContextMenu);\n zIndexTop = self.style.contextMenuZIndex;\n self.disposeAutocomplete();\n if (self.contextMenu) {\n self.contextMenu.dispose();\n }\n self.contextMenu = undefined;\n if (event) {\n self.canvas.focus();\n self.mousedown(event);\n self.mouseup(event);\n }\n };\n self.contextmenuEvent = function (e, overridePos) {\n if (!self.hasFocus && e.target !== self.canvas) {\n return;\n }\n // don't create context menu for parents if current position is located in child grid\n const children = Object.keys(self.childGrids);\n for (let i = 0; i < children.length; i++) {\n const childGrid = self.childGrids[children[i]];\n const parentNode = childGrid && childGrid.parentNode;\n if (!parentNode) continue;\n const { offsetLeft, offsetWidth, offsetTop, offsetHeight } = parentNode;\n if ((e.x >= offsetLeft && e.x <= offsetLeft + offsetWidth) === false)\n continue;\n if ((e.y >= offsetTop && e.y <= offsetTop + offsetHeight) === false)\n continue;\n return; // in child grid\n }\n // don't create context menu for child if current position is located in parent grid\n if (self.isChildGrid && self.parentNode) {\n //#region check is current child grid closed\n const childGridsOfParent = self.parentGrid && self.parentGrid.childGrids;\n if (!childGridsOfParent || !Array.isArray(childGridsOfParent)) return;\n const matchedMe = childGridsOfParent.find((grid) => {\n const nodeA = grid.parentNode;\n const nodeB = self.parentNode;\n return (\n nodeA.offsetTop == nodeB.offsetTop &&\n nodeA.offsetLeft === nodeB.offsetLeft\n );\n });\n if (!matchedMe) return;\n //#endregion\n\n let x0 = self.parentNode.offsetLeft;\n let x1 = self.parentNode.offsetLeft + self.parentNode.offsetWidth;\n let y0 = self.parentNode.offsetTop;\n let y1 = self.parentNode.offsetTop + self.parentNode.offsetHeight;\n let node = self.parentNode.parentNode;\n while (node) {\n const { offsetLeft, offsetWidth, offsetTop, offsetHeight } = node;\n if (offsetLeft > x0) x0 = offsetLeft;\n if (offsetTop > y0) y0 = offsetTop;\n const newX1 = offsetLeft + offsetWidth;\n const newY1 = offsetTop + offsetHeight;\n if (newX1 < x1) x1 = newX1;\n if (newY1 < y1) y1 = newY1;\n if (node.nodeType !== 'canvas-datagrid-tree') break;\n node = node.parentNode;\n }\n if ((e.x >= x0 && e.x <= x1 && e.y >= y0 && e.y <= y1) === false) return;\n }\n function createDisposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('click', self.disposeContextMenu);\n window.removeEventListener('mouseup', createDisposeEvent);\n });\n }\n var contextPosition,\n items = [],\n pos = overridePos || self.getLayerPos(e),\n ev = {\n NativeEvent: e,\n cell: self.getCellAt(pos.x, pos.y),\n pos,\n items: items,\n };\n if (!ev.cell.isGrid) {\n addDefaultContextMenuItem(ev);\n }\n if (e.type !== 'mousedown' && self.dispatchEvent('contextmenu', ev)) {\n return;\n }\n if (!ev.cell.isGrid) {\n if (self.contextMenu) {\n self.disposeContextMenu();\n }\n contextPosition = {\n left:\n pos.x +\n pos.rect.left +\n self.style.contextMenuMarginLeft +\n self.canvasOffsetLeft,\n top:\n pos.y +\n pos.rect.top +\n self.style.contextMenuMarginTop +\n self.canvasOffsetTop,\n right: ev.cell.width + ev.cell.x + pos.rect.left,\n bottom: ev.cell.height + ev.cell.y + pos.rect.top,\n height: ev.cell.height,\n width: ev.cell.width,\n };\n if (self.mobile) {\n contextPosition.left = self.style.mobileContextMenuMargin + 'px';\n contextPosition.width =\n self.width - self.style.mobileContextMenuMargin * 2 + 'px';\n }\n if (e.type == 'mousedown') {\n contextPosition.top += self.style.filterButtonMenuOffsetTop;\n }\n // use ev.items, not the captured array: a listener may assign a new\n // array to e.items (#263)\n self.contextMenu = createContextMenu(ev, contextPosition, ev.items);\n self.contextMenuOpenedAt = performance.now();\n if (e.type == 'mousedown') {\n window.addEventListener('mouseup', createDisposeEvent);\n } else {\n createDisposeEvent();\n }\n e.preventDefault();\n }\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false, Event: false*/\n'use strict';\n\nexport default function (self) {\n let zIndexTop;\n\n function applyButtonMenuItemStyle(buttonMenuItemContainer) {\n self.createInlineStyle(\n buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item' + (self.mobile ? '-mobile' : ''),\n );\n buttonMenuItemContainer.addEventListener('mouseover', function () {\n self.createInlineStyle(\n buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item:hover',\n );\n });\n buttonMenuItemContainer.addEventListener('mouseout', function () {\n self.createInlineStyle(\n buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item',\n );\n });\n }\n\n function applyButtonStyle(button) {\n self.createInlineStyle(button, 'canvas-datagrid-button-wrapper');\n button.addEventListener('mouseover', function () {\n if (!self.buttonMenu) {\n self.createInlineStyle(button, 'canvas-datagrid-button-wrapper:hover');\n }\n });\n button.addEventListener('mouseout', function () {\n if (!self.buttonMenu) {\n self.createInlineStyle(button, 'canvas-datagrid-button-wrapper');\n }\n });\n }\n\n function createButton(pos, items, imgSrc) {\n var wrapper = document.createElement('div'),\n buttonArrow = document.createElement('div'),\n buttonIcon = document.createElement('div'),\n intf = {};\n\n if (!Array.isArray(items)) {\n throw new Error('createButton expects an array.');\n }\n\n function init() {\n var loc = {},\n s = self.scrollOffset(self.canvas);\n\n if (zIndexTop === undefined) {\n zIndexTop = self.style.buttonZIndex;\n }\n\n applyButtonStyle(wrapper);\n self.createInlineStyle(buttonIcon, 'canvas-datagrid-button-icon');\n self.createInlineStyle(buttonArrow, 'canvas-datagrid-button-arrow');\n\n loc.x = pos.left - s.left;\n loc.y = pos.top - s.top;\n loc.height = 0;\n zIndexTop += 1;\n wrapper.style.position = 'absolute';\n wrapper.style.zIndex = zIndexTop;\n wrapper.style.left = loc.x + 'px';\n wrapper.style.top = loc.y + 'px';\n wrapper.left = pos.left + self.scrollBox.scrollLeft;\n wrapper.top = pos.top + self.scrollBox.scrollTop;\n buttonArrow.innerHTML = self.style.buttonArrowDownHTML;\n if (imgSrc) {\n let img = document.createElement('img');\n img.setAttribute('src', imgSrc);\n img.style.maxWidth = '100%';\n img.style.height = '100%';\n buttonIcon.appendChild(img);\n }\n wrapper.appendChild(buttonIcon);\n wrapper.appendChild(buttonArrow);\n document.body.appendChild(wrapper);\n wrapper.addEventListener('click', toggleButtonMenu);\n }\n\n intf.wrapper = wrapper;\n intf.items = items;\n init();\n\n intf.dispose = function () {\n if (wrapper.parentNode) {\n wrapper.parentNode.removeChild(wrapper);\n }\n };\n return intf;\n }\n\n function toggleButtonMenu() {\n function createDisposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('click', self.disposeButtonMenu);\n });\n }\n if (self.buttonMenu) {\n self.disposeButtonMenu();\n } else {\n let pos = {\n left: self.button.wrapper.left - self.scrollBox.scrollLeft,\n top:\n self.button.wrapper.top +\n self.button.wrapper.offsetHeight -\n self.scrollBox.scrollTop,\n };\n self.buttonMenu = createButtonMenu(pos, self.button.items);\n self.createInlineStyle(\n self.button.wrapper,\n 'canvas-datagrid-button-wrapper:active',\n );\n createDisposeEvent();\n }\n }\n\n function createButtonMenu(pos, items) {\n var buttonMenu = document.createElement('div'),\n selectedIndex = -1,\n intf = {},\n rect;\n\n function createItems() {\n function addItem(item, menuItemContainer) {\n function addContent(content) {\n if (content === null) {\n return;\n }\n\n if (typeof content === 'object') {\n menuItemContainer.appendChild(content);\n return;\n }\n\n applyButtonMenuItemStyle(menuItemContainer);\n menuItemContainer.innerHTML = content;\n return;\n }\n\n addContent(item.title);\n item.buttonMenuItemContainer = menuItemContainer;\n\n if (item.click) {\n menuItemContainer.addEventListener('click', function (ev) {\n item.click.apply(self, [ev]);\n self.disposeButton();\n });\n }\n }\n\n for (let item of items) {\n var buttonMenuItemContainer = document.createElement('div');\n addItem(item, buttonMenuItemContainer);\n buttonMenu.appendChild(buttonMenuItemContainer);\n }\n }\n\n function clickIndex(idx) {\n items[idx].buttonMenuItemContainer.dispatchEvent(new Event('click'));\n }\n\n function init() {\n var loc = {},\n s = self.scrollOffset(self.canvas);\n\n if (zIndexTop === undefined) {\n zIndexTop = self.style.buttonZIndex;\n }\n\n createItems();\n self.createInlineStyle(\n buttonMenu,\n 'canvas-datagrid-button-menu' + (self.mobile ? '-mobile' : ''),\n );\n\n loc.x = pos.left - s.left;\n loc.y = pos.top - s.top;\n loc.height = 0;\n zIndexTop += 1;\n buttonMenu.style.position = 'absolute';\n buttonMenu.style.zIndex = zIndexTop;\n buttonMenu.style.left = loc.x + 'px';\n buttonMenu.style.top = loc.y + 'px';\n document.body.appendChild(buttonMenu);\n rect = buttonMenu.getBoundingClientRect();\n\n if (rect.bottom > window.innerHeight) {\n loc.y =\n self.button.wrapper.top -\n buttonMenu.offsetHeight -\n self.scrollBox.scrollTop;\n if (loc.y < 0) {\n loc.y = self.style.buttonMenuWindowMargin;\n }\n\n if (\n buttonMenu.offsetHeight >\n window.innerHeight - self.style.buttonMenuWindowMargin\n ) {\n buttonMenu.style.height =\n window.innerHeight - self.style.buttonMenuWindowMargin * 2 + 'px';\n }\n }\n\n if (rect.right > window.innerWidth) {\n loc.x -=\n rect.right - window.innerWidth + self.style.buttonMenuWindowMargin;\n }\n\n if (loc.x < 0) {\n loc.x = self.style.buttonMenuWindowMargin;\n }\n\n if (loc.y < 0) {\n loc.y = self.style.buttonMenuWindowMargin;\n }\n\n buttonMenu.style.left = loc.x + 'px';\n buttonMenu.style.top = loc.y + 'px';\n }\n\n intf.buttonMenu = buttonMenu;\n init();\n intf.clickIndex = clickIndex;\n intf.rect = rect;\n intf.items = items;\n\n intf.dispose = function () {\n if (buttonMenu.parentNode) {\n buttonMenu.parentNode.removeChild(buttonMenu);\n }\n };\n\n Object.defineProperty(intf, 'selectedIndex', {\n get: function get() {\n return selectedIndex;\n },\n set: function set(value) {\n if (typeof value !== 'number' || isNaN(value) || !isFinite(value)) {\n throw new Error('Button menu selected index must be a sane number.');\n }\n\n selectedIndex = value;\n\n if (selectedIndex > items.length - 1) {\n selectedIndex = items.length - 1;\n }\n\n if (selectedIndex < 0) {\n selectedIndex = 0;\n }\n\n items.forEach(function (item, index) {\n if (index === selectedIndex) {\n return self.createInlineStyle(\n item.buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item:hover',\n );\n }\n\n self.createInlineStyle(\n item.buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item',\n );\n });\n },\n });\n return intf;\n }\n\n self.disposeButtonMenu = function () {\n if (self.buttonMenu) {\n document.removeEventListener('click', self.disposeButtonMenu);\n self.buttonMenu.dispose();\n self.buttonMenu = undefined;\n self.createInlineStyle(\n self.button.wrapper,\n 'canvas-datagrid-button-wrapper:hover',\n );\n }\n };\n\n self.disposeButton = function (e) {\n if (e && e.keyCode !== 27) return;\n document.removeEventListener('keydown', self.disposeButton);\n zIndexTop = self.style.buttonZIndex;\n self.disposeButtonMenu();\n\n if (self.button) {\n self.button.dispose();\n }\n\n self.button = undefined;\n };\n\n self.moveButtonPos = function () {\n self.button.wrapper.style.left =\n self.button.wrapper.left - self.scrollBox.scrollLeft + 'px';\n self.button.wrapper.style.top =\n self.button.wrapper.top - self.scrollBox.scrollTop + 'px';\n self.disposeButtonMenu();\n };\n\n self.attachButton = function (pos, items, imgSrc) {\n function createDisposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('keydown', self.disposeButton);\n });\n }\n\n if (self.button) {\n self.disposeButton();\n }\n\n self.button = createButton(pos, items, imgSrc);\n createDisposeEvent();\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n self.getClippingRect = function (ele) {\n var boundingRect = self.position(self.parentNode),\n eleRect = self.position(ele),\n s = self.scrollOffset(self.canvas),\n clipRect = {\n x: 0,\n y: 0,\n h: 0,\n w: 0,\n },\n parentRect = {\n x: -Infinity,\n y: -Infinity,\n h: Infinity,\n w: Infinity,\n },\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth();\n boundingRect.top -= s.top;\n boundingRect.left -= s.left;\n eleRect.top -= s.top;\n eleRect.left -= s.left;\n clipRect.h =\n boundingRect.top +\n boundingRect.height -\n ele.offsetTop -\n self.style.scrollBarWidth;\n clipRect.w =\n boundingRect.left +\n boundingRect.width -\n ele.offsetLeft -\n self.style.scrollBarWidth;\n clipRect.x = boundingRect.left + eleRect.left * -1 + rowHeaderCellWidth;\n clipRect.y = boundingRect.top + eleRect.top * -1 + columnHeaderCellHeight;\n return {\n x: clipRect.x > parentRect.x ? clipRect.x : parentRect.x,\n y: clipRect.y > parentRect.y ? clipRect.y : parentRect.y,\n h: clipRect.h < parentRect.h ? clipRect.h : parentRect.h,\n w: clipRect.w < parentRect.w ? clipRect.w : parentRect.w,\n };\n };\n self.clipElement = function (ele) {\n var clipRect = self.getClippingRect(ele);\n if (clipRect.w < 0) {\n clipRect.w = 0;\n }\n if (clipRect.h < 0) {\n clipRect.h = 0;\n }\n ele.style.clip =\n 'rect(' +\n clipRect.y +\n 'px,' +\n clipRect.w +\n 'px,' +\n clipRect.h +\n 'px,' +\n clipRect.x +\n 'px' +\n ')';\n // INFO https://developer.mozilla.org/en-US/docs/Web/CSS/clip\n // clip has been \"deprecated\" for clipPath. Of course nothing but chrome\n // supports clip path, so we'll keep using clip until someday clipPath becomes\n // more widely support. The code below works correctly, but setting clipPath and clip\n // at the same time has undesirable results.\n // ele.style.clipPath = 'polygon('\n // + clipRect.x + 'px ' + clipRect.y + 'px,'\n // + clipRect.x + 'px ' + clipRect.h + 'px,'\n // + clipRect.w + 'px ' + clipRect.h + 'px,'\n // + clipRect.w + 'px ' + clipRect.y + 'px'\n // + ')';\n };\n self.scrollOffset = function (e) {\n var x = 0,\n y = 0,\n scrollingElement = document.scrollingElement || {\n scrollLeft: 0,\n scrollTop: 0,\n };\n while (\n e.parentNode &&\n e.nodeName !== 'CANVAS-DATAGRID' &&\n e !== self.intf\n ) {\n if (\n e.nodeType !== 'canvas-datagrid-tree' &&\n e.nodeType !== 'canvas-datagrid-cell'\n ) {\n x -= e.scrollLeft;\n y -= e.scrollTop;\n }\n e = e.parentNode;\n }\n return {\n left: x - scrollingElement.scrollLeft,\n top: y - scrollingElement.scrollTop,\n };\n };\n self.resizeEditInput = function () {\n if (self.input && self.input.editCell) {\n var pos = self.canvas.getBoundingClientRect(),\n s = self.scrollOffset(self.intf),\n bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n borderWidth = self.style.cellBorderWidth * bm,\n cell = self.getVisibleCellByIndex(\n self.input.editCell.columnIndex,\n self.input.editCell.rowIndex,\n ) || { x: -100, y: -100, height: 0, width: 0 };\n if (self.mobile) {\n self.input.style.left = '0';\n self.input.style.top =\n self.height -\n self.style.mobileEditInputHeight -\n borderWidth -\n 1 +\n 'px';\n self.input.style.height = self.style.mobileEditInputHeight + 'px';\n self.input.style.width = self.width - borderWidth - 1 + 'px';\n return;\n }\n let groupAreaOffsetY = self.getColumnGroupAreaHeight();\n let groupAreaOffsetX = self.getRowGroupAreaWidth();\n if (self.parentNode) {\n const { columnGroupsAreaHeight, rowGroupsAreaWidth } = self.parentNode;\n if (columnGroupsAreaHeight) groupAreaOffsetY += columnGroupsAreaHeight;\n if (rowGroupsAreaWidth) groupAreaOffsetX += rowGroupsAreaWidth;\n }\n self.input.style.left =\n pos.left +\n cell.x +\n self.canvasOffsetLeft -\n s.left +\n groupAreaOffsetX +\n 'px';\n self.input.style.top =\n pos.top +\n cell.y -\n self.style.cellBorderWidth +\n self.canvasOffsetTop -\n s.top +\n groupAreaOffsetY +\n 'px';\n self.input.style.height = cell.height - borderWidth + 'px';\n self.input.style.width = cell.width - self.style.cellPaddingLeft + 'px';\n self.clipElement(self.input);\n }\n };\n self.position = function (e, ignoreScrollOffset) {\n var x = 0,\n y = 0,\n s = e,\n h,\n w;\n let calculatedTree = false;\n while (e.offsetParent && e.nodeName !== 'CANVAS-DATAGRID') {\n const isTree = e.nodeType === 'canvas-datagrid-tree';\n if (!isTree || !calculatedTree) {\n x += e.offsetLeft;\n y += e.offsetTop;\n h = e.offsetHeight;\n w = e.offsetWidth;\n }\n if (isTree) calculatedTree = true;\n e = e.offsetParent;\n }\n if (ignoreScrollOffset) {\n return { left: x, top: y, height: h, width: w };\n }\n e = s;\n s = self.scrollOffset(e);\n return { left: x + s.left, top: y + s.top, height: h, width: w };\n };\n self.getLayerPos = function (e) {\n var rect = self.canvas.getBoundingClientRect(),\n pos = {\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n };\n if (self.isChildGrid) {\n pos.x -= self.canvasOffsetLeft;\n pos.y -= self.canvasOffsetTop;\n if (self.parentNode.rowGroupsAreaWidth)\n pos.x -= self.parentNode.rowGroupsAreaWidth;\n if (self.parentNode.columnGroupsAreaHeight)\n pos.y -= self.parentNode.columnGroupsAreaHeight;\n }\n return {\n x: pos.x,\n y: pos.y,\n rect: rect,\n };\n };\n /**\n * Watches the host element and its parent for size changes so a grid sized\n * with auto/percentage dimensions follows layout changes (flex, splitters,\n * tab switches) without an explicit `resize()` call (#289, #239).\n * Falls back to the `window` resize listener when ResizeObserver is missing.\n */\n self.initResizeObserver = function () {\n if (self.isChildGrid || typeof window.ResizeObserver !== 'function') {\n return;\n }\n self.observedSizes = new Map();\n self.resizeObserver = new window.ResizeObserver(function (entries) {\n var changed = false;\n entries.forEach(function (entry) {\n var rect = entry.contentRect;\n var last = self.observedSizes.get(entry.target);\n if (!last || last.width !== rect.width || last.height !== rect.height) {\n self.observedSizes.set(entry.target, {\n width: rect.width,\n height: rect.height,\n });\n changed = true;\n }\n });\n if (!changed || self.disposed || self.resizeObserverFrame) {\n return;\n }\n // coalesce bursts of notifications into one resize per frame\n self.resizeObserverFrame = requestAnimationFrame(function () {\n self.resizeObserverFrame = undefined;\n if (self.disposed) {\n return;\n }\n self.resize(true);\n });\n });\n self.observeResizeTargets();\n };\n self.observeResizeTargets = function () {\n if (!self.resizeObserver) {\n return;\n }\n self.resizeObserver.disconnect();\n self.observedSizes = new Map();\n var host = self.intf && self.intf.nodeType === 1 ? self.intf : self.canvas;\n [host, host && host.parentNode].forEach(function (target) {\n if (target && target.nodeType === 1) {\n self.resizeObserver.observe(target);\n }\n });\n };\n self.unobserveResizeTargets = function () {\n if (self.resizeObserver) {\n self.resizeObserver.disconnect();\n }\n };\n /**\n * Ends editing, optionally aborting the edit.\n * @memberof canvasDatagrid\n * @name endEdit\n * @method\n * @param {boolean} abort When true, abort the edit.\n */\n self.endEdit = function (abort) {\n var cell = self.input.editCell,\n y = cell.rowIndex,\n // Decide up front whether this is the \"new row\" placeholder. A\n // beforeendedit handler may add or delete rows (#583), which would\n // otherwise make the last real row look like the placeholder.\n isNewRow = y === self.viewData.length;\n function abortEdit() {\n abort = true;\n }\n if (\n self.dispatchEvent('beforeendedit', {\n cell: cell,\n newValue: self.input.value,\n oldValue: cell.value,\n abort: abortEdit,\n input: self.input,\n })\n ) {\n return false;\n }\n if (self.input.value !== cell.value && !abort) {\n // key the change log by the bound (data) row index rather than the\n // view index so sorting/filtering cannot misattribute edits (#418)\n var changeIndex =\n cell.boundRowIndex === undefined ? y : cell.boundRowIndex;\n self.changes[changeIndex] = self.changes[changeIndex] || {};\n self.changes[changeIndex][cell.header.name] = self.input.value;\n if (!cell.data) {\n self.originalData[cell.boundRowIndex] = {};\n cell.data = self.originalData[cell.boundRowIndex];\n }\n cell.data[cell.header.name] = self.input.value;\n if (isNewRow) {\n if (\n self.dispatchEvent('newrow', {\n value: self.input.value,\n defaultValue: cell.value,\n aborted: abort,\n cell: cell,\n input: self.input,\n })\n ) {\n return false;\n }\n self.addRow(cell.data);\n self.createNewRowData();\n }\n self.dispatchDataChanged('edit', {\n cell: cell,\n value: self.input.value,\n });\n self.draw(true);\n }\n if (self.input.parentNode) {\n self.input.parentNode.removeChild(self.input);\n }\n self.intf.focus();\n self.dispatchEvent('endedit', {\n cell: cell,\n value: self.input.value,\n aborted: abort,\n input: self.input,\n });\n self.input = undefined;\n return true;\n };\n /**\n * Begins editing at cell x, row y.\n * @memberof canvasDatagrid\n * @name beginEditAt\n * @method\n * @param {number} x The column index of the cell to edit.\n * @param {number} y The row index of the cell to edit.\n * @param {boolean} inEnterMode If true, starting to type in cell will replace the\n * cell's previous value instead of appending, and using the arrow keys will allow\n * the user to navigate to adjacent cells instead of moving the text cursor around\n * (default is false, and means user is in 'edit' mode).\n */\n self.beginEditAt = function (x, y, NativeEvent, inEnterMode = false) {\n if (!self.attributes.editable) {\n return;\n }\n if (self.input) {\n self.endEdit();\n }\n var cell = self.getVisibleCellByIndex(x, y),\n s = self.getSchema(),\n adjacentCells,\n enumItems,\n enu,\n option,\n valueInEnum;\n if (!(cell && cell.header)) {\n return;\n }\n //HACK for IE10, does not like literal enum\n enu = cell.header['enum'];\n if (\n self.dispatchEvent('beforebeginedit', {\n cell: cell,\n NativeEvent: NativeEvent,\n })\n ) {\n return false;\n }\n self.scrollIntoView(x, y);\n self.setActiveCell(x, y);\n adjacentCells = self.getAdjacentCells();\n if (enu) {\n self.input = document.createElement('select');\n } else {\n self.input = document.createElement(\n self.attributes.multiLine ? 'textarea' : 'input',\n );\n }\n cell = self.getVisibleCellByIndex(x, y);\n //HACK on mobile devices sometimes edit can begin without the cell being in view, I don't know how.\n if (!cell) {\n return;\n }\n if (enu) {\n // add enums\n if (typeof enu === 'function') {\n enumItems = enu.apply(self.intf, [{ cell: cell }]);\n } else if (Array.isArray(enu)) {\n enumItems = enu;\n }\n enumItems.forEach(function (e) {\n var i = document.createElement('option'),\n val,\n title;\n if (Array.isArray(e)) {\n val = e[0];\n title = e[1];\n } else {\n val = e;\n title = e;\n }\n if (val === cell.value) {\n valueInEnum = true;\n }\n i.value = val;\n i.innerHTML = title;\n self.input.appendChild(i);\n });\n if (!valueInEnum) {\n option = document.createElement('option');\n option.value = cell.value;\n option.innerHTML = cell.value;\n self.input.appendChild(option);\n }\n self.input.addEventListener('change', function () {\n self.endEdit();\n self.draw(true);\n });\n }\n // if the user has not prevented the default action, append to the body\n if (\n !self.dispatchEvent('appendeditinput', { cell: cell, input: self.input })\n ) {\n document.body.appendChild(self.input);\n }\n self.createInlineStyle(\n self.input,\n self.mobile\n ? 'canvas-datagrid-edit-mobile-input'\n : 'canvas-datagrid-edit-input',\n );\n self.input.style.position = 'absolute';\n self.input.editCell = cell;\n self.resizeEditInput();\n if (enu && typeof self.input.showPicker === 'function') {\n // open the enum <select> immediately (#230); browsers only allow this\n // from a user gesture, so treat failure as harmless\n try {\n self.input.showPicker();\n } catch (err) {\n // no user activation\n }\n }\n self.input.style.zIndex = self.style.editCellZIndex;\n self.input.style.fontSize =\n parseInt(self.style.editCellFontSize, 10) * self.scale + 'px';\n\n var cellValueIsEmpty = [null, undefined].indexOf(cell.value) !== -1;\n var shouldClearCellValue = cellValueIsEmpty || inEnterMode;\n\n self.input.value = shouldClearCellValue ? '' : cell.value;\n let width = Math.round(\n self.input.value.length *\n parseInt(self.style.editCellFontSize, 10) *\n 0.7 *\n self.scale,\n );\n if (width + self.style.cellPaddingLeft < cell.width) {\n width = cell.width - self.style.cellPaddingLeft;\n } else if (width > self.width - cell.x - self.style.scrollBarWidth) {\n width = self.width - cell.x - self.style.scrollBarWidth;\n self.input.style.height = 'auto';\n }\n self.input.style.width = width + 'px';\n self.input.focus();\n self.input.addEventListener('click', self.stopPropagation);\n self.input.addEventListener('dblclick', self.stopPropagation);\n self.input.addEventListener('mouseup', self.stopPropagation);\n self.input.addEventListener('mousedown', self.stopPropagation);\n self.input.addEventListener('keydown', function (e) {\n var nx = cell.columnIndex,\n ny = cell.rowIndex;\n\n if (e.key === 'Escape') {\n self.endEdit(true); // end edit and abort the value change\n self.draw(true);\n } else if (e.key === 'Enter' && self.attributes.multiLine && e.altKey) {\n self.input.value = self.input.value + '\\n';\n self.input.scrollTop = self.input.scrollHeight;\n } else if (e.key === 'Enter') {\n self.endEdit();\n\n // Move to cell in next or previous row\n var nextRowIndex = e.shiftKey\n ? Math.max(0, ny - 1)\n : Math.min(ny + 1, self.viewData.length - 1);\n\n if (nextRowIndex !== ny) {\n self.scrollIntoView(nx, nextRowIndex);\n self.setActiveCell(nx, nextRowIndex);\n }\n\n self.draw(true);\n } else if (\n ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(e.key) &&\n inEnterMode\n ) {\n switch (e.key) {\n case 'ArrowUp':\n ny = Math.max(0, ny - 1);\n break;\n case 'ArrowDown':\n ny = Math.min(ny + 1, self.viewData.length - 1);\n break;\n case 'ArrowLeft':\n nx = Math.max(nx - 1, 0);\n break;\n case 'ArrowRight':\n nx = adjacentCells.right;\n break;\n }\n\n self.endEdit();\n\n self.scrollIntoView(nx, ny);\n self.setActiveCell(nx, ny);\n\n self.draw(true);\n } else if (e.key === 'Tab') {\n e.preventDefault();\n if (!self.endEdit()) {\n return;\n }\n if (e.shiftKey) {\n nx = adjacentCells.left;\n } else {\n nx = adjacentCells.right;\n }\n if (adjacentCells.left === x && e.shiftKey) {\n nx = adjacentCells.last;\n ny -= 1;\n }\n if (adjacentCells.right === x && !e.shiftKey) {\n nx = adjacentCells.first;\n ny += 1;\n }\n if (ny < 0) {\n ny = self.viewData.length - 1;\n }\n if (ny > self.viewData.length - 1) {\n ny = 0;\n }\n self.scrollIntoView(nx, ny);\n self.beginEditAt(nx, ny, e);\n } else {\n let width = Math.round(\n self.input.value.length *\n parseInt(self.style.editCellFontSize, 10) *\n 0.7 *\n self.scale,\n );\n if (width + self.style.cellPaddingLeft < cell.width) {\n width = cell.width - self.style.cellPaddingLeft;\n } else if (width > self.width - cell.x - self.style.scrollBarWidth) {\n width = self.width - cell.x - self.style.scrollBarWidth;\n self.input.style.height = 'auto';\n }\n self.input.style.width = width + 'px';\n }\n });\n\n self.dispatchEvent('beginedit', { cell: cell, input: self.input });\n };\n self.createInlineStyle = function (el, className) {\n var css = {\n 'canvas-datagrid-button-wrapper': {\n display: 'inline-block',\n padding: self.style.buttonPadding,\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: self.style.buttonBorderColor,\n cursor: 'pointer',\n background: self.style.buttonBackgroundColor,\n userSelect: 'none',\n },\n 'canvas-datagrid-button-wrapper:hover': {\n borderColor: self.style.buttonBorderColor,\n background: self.style.buttonHoverBackgroundColor,\n },\n 'canvas-datagrid-button-wrapper:active': {\n borderColor: self.style.buttonActiveBorderColor,\n background: self.style.buttonActiveBackgroundColor,\n },\n 'canvas-datagrid-button-icon': {\n width: '18px',\n height: '18px',\n display: 'inline-block',\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-button-arrow': {\n display: 'inline-block',\n color: self.style.buttonArrowColor,\n fontSize: '9px',\n },\n 'canvas-datagrid-button-menu-item-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-button-menu-item': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-button-menu-item:hover': {\n background: self.style.contextMenuHoverBackground,\n color: self.style.contextMenuHoverColor,\n },\n 'canvas-datagrid-button-menu-label': {\n margin: self.style.contextMenuLabelMargin,\n display: self.style.contextMenuLabelDisplay,\n minWidth: self.style.contextMenuLabelMinWidth,\n maxWidth: self.style.contextMenuLabelMaxWidth,\n },\n 'canvas-datagrid-button-menu-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n },\n 'canvas-datagrid-button-menu': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n cursor: self.style.contextMenuCursor,\n },\n 'canvas-datagrid-context-menu-filter-input': {\n height: '19px',\n verticalAlign: 'bottom',\n marginLeft: '2px',\n padding: '0',\n background: self.style.contextFilterInputBackground,\n color: self.style.contextFilterInputColor,\n border: self.style.contextFilterInputBorder,\n borderRadius: self.style.contextFilterInputBorderRadius,\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextFilterInputFontFamily,\n fontSize: self.style.contextFilterInputFontSize,\n },\n 'canvas-datagrid-context-menu-filter-button': {\n height: '19px',\n verticalAlign: 'bottom',\n marginLeft: '2px',\n padding: '0',\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextFilterButtonBorder,\n borderRadius: self.style.contextFilterButtonBorderRadius,\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFilterButtonFontFamily,\n fontSize: self.style.contextMenuFilterButtonFontSize,\n },\n 'canvas-datagrid-context-child-arrow': {\n cssFloat: 'right',\n color: self.style.childContextMenuArrowColor,\n fontSize: self.style.contextMenuChildArrowFontSize,\n fontFamily: self.style.contextMenuFontFamily,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-autocomplete': {\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n position: 'absolute',\n zIndex: 9999,\n overflow: 'hidden',\n },\n 'canvas-datagrid-autocomplete-item': {\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n },\n 'canvas-datagrid-autocomplete-item:hover': {\n background: self.style.contextMenuHoverBackground,\n color: self.style.contextMenuHoverColor,\n },\n 'canvas-datagrid-canvas': {\n position: 'absolute',\n zIndex: '-1',\n },\n 'canvas-datagrid': {\n display: 'block',\n },\n 'canvas-datagrid-control-input': {\n position: 'fixed',\n top: '-5px',\n left: '-5px',\n border: 'none',\n opacity: '0',\n cursor: 'pointer',\n width: '1px',\n height: '1px',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n },\n 'canvas-datagrid-edit-mobile-input': {\n boxSizing: 'content-box',\n outline: 'none',\n margin: '0',\n padding: '0 0 0 0',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.mobileEditFontFamily,\n fontSize: self.style.mobileEditFontSize,\n border: self.style.editCellBorder,\n color: self.style.editCellColor,\n background: self.style.editCellBackgroundColor,\n appearance: 'none',\n webkitAppearance: 'none',\n mozAppearance: 'none',\n borderRadius: '0',\n },\n 'canvas-datagrid-edit-input': {\n boxSizing: 'content-box',\n outline: 'none',\n margin: '0',\n padding: '0 0 0 ' + self.style.editCellPaddingLeft + 'px',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.editCellFontFamily,\n fontSize: self.style.editCellFontSize,\n boxShadow: self.style.editCellBoxShadow,\n border: self.style.editCellBorder,\n color: self.style.editCellColor,\n background: self.style.editCellBackgroundColor,\n appearance: 'none',\n webkitAppearance: 'none',\n mozAppearance: 'none',\n borderRadius: '0',\n },\n 'canvas-datagrid-context-menu-item-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-context-menu-item': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-context-menu-item:hover': {\n background: self.style.contextMenuHoverBackground,\n color: self.style.contextMenuHoverColor,\n },\n 'canvas-datagrid-context-menu-label': {\n margin: self.style.contextMenuLabelMargin,\n display: self.style.contextMenuLabelDisplay,\n minWidth: self.style.contextMenuLabelMinWidth,\n maxWidth: self.style.contextMenuLabelMaxWidth,\n },\n 'canvas-datagrid-context-menu-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n },\n 'canvas-datagrid-context-menu': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n cursor: self.style.contextMenuCursor,\n },\n 'canvas-datagrid-invalid-search-regExp': {\n background: self.style.contextMenuFilterInvalidExpresion,\n },\n };\n if (css[className]) {\n Object.keys(css[className]).map(function (prop) {\n el.style[prop] = css[className][prop];\n });\n el.className = className;\n }\n return;\n };\n self.appendTo = function (e) {\n self.parentNode = e;\n self.setDom();\n };\n self.setDom = function () {\n if (self.isChildGrid) {\n self.parentGrid = self.parentNode.parentGrid;\n self.ctx = self.parentGrid.context;\n self.canvas = self.parentGrid.canvas;\n self.controlInput = self.parentGrid.controlInput;\n self.eventParent = self.canvas;\n } else {\n self.controlInput = self.controlInput || document.createElement('input');\n self.controlInput.onblur = self.intf.blur;\n self.createInlineStyle(\n self.controlInput,\n 'canvas-datagrid-control-input',\n );\n self.isChildGrid = false;\n self.parentDOMNode = self.parentNode;\n self.parentIsCanvas = /^canvas$/i.test(self.parentDOMNode.tagName);\n if (self.parentIsCanvas) {\n self.canvas = self.parentDOMNode;\n } else {\n self.canvas = document.createElement('canvas');\n self.parentDOMNode.appendChild(self.canvas);\n }\n document.body.appendChild(self.controlInput);\n self.createInlineStyle(self.canvas, 'canvas-datagrid');\n self.ctx = self.canvas.getContext('2d');\n self.ctx.textBaseline = 'alphabetic';\n self.eventParent = self.canvas;\n }\n self.parentNodeStyle = self.canvas.style;\n self.controlInput.setAttribute('readonly', true);\n self.controlInput.addEventListener('blur', function (e) {\n if (e.target !== self.canvas) {\n self.hasFocus = false;\n }\n });\n self.eventParent.addEventListener('scroll', self.resize, false);\n self.eventParent.addEventListener('touchstart', self.touchstart, {\n passive: true,\n });\n self.eventParent.addEventListener('mousedown', self.mousedown, false);\n self.eventParent.addEventListener('dblclick', self.dblclick, false);\n self.eventParent.addEventListener('click', self.click, false);\n self.eventParent.addEventListener('mouseup', self.mouseup, false);\n window.addEventListener('mouseup', self.mouseupOutsideGrid, false);\n window.addEventListener('mousemove', self.mousemove);\n self[self.isChildGrid ? 'parentGrid' : 'eventParent'].addEventListener(\n 'wheel',\n self.scrollWheel,\n false,\n );\n self.canvas.addEventListener('contextmenu', self.contextmenuEvent, false);\n self.controlInput.addEventListener('copy', self.copy);\n self.controlInput.addEventListener('cut', self.cut);\n self.controlInput.addEventListener('paste', self.paste);\n self.controlInput.addEventListener('keypress', self.keypress, false);\n self.controlInput.addEventListener('keyup', self.keyup, false);\n self.controlInput.addEventListener('keydown', self.keydown, false);\n window.addEventListener('resize', self.resize);\n self.initResizeObserver();\n };\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport { mergeHiddenRowRanges } from './groups/util';\n\nexport default function (self) {\n /**\n * Converts a integer into a letter A - ZZZZZ...\n * @memberof canvasDatagrid\n * @name integerToAlpha\n * @method\n * @param {column} n The number to convert.\n */\n self.integerToAlpha = function (n) {\n var ordA = 'a'.charCodeAt(0),\n ordZ = 'z'.charCodeAt(0),\n len = ordZ - ordA + 1,\n s = '';\n while (n >= 0) {\n s = String.fromCharCode((n % len) + ordA) + s;\n n = Math.floor(n / len) - 1;\n }\n return s;\n };\n /**\n * Inserts a new column before the specified index into the schema.\n * @tutorial schema\n * @memberof canvasDatagrid\n * @name insertColumn\n * @method\n * @param {column} c The column to insert into the schema.\n * @param {number} index The index of the column to insert before.\n */\n self.insertColumn = function (c, index) {\n var s = self.getSchema();\n if (s.length < index) {\n throw new Error('Index is beyond the length of the schema.');\n }\n self.validateColumn(c, s);\n s.splice(index, 0, c);\n\n self.originalData.forEach(function (row, rowIndex) {\n self.applyDefaultValue(row, c, rowIndex);\n });\n self.intf.schema = s;\n\n self.refresh();\n self.dispatchDataChanged('insertcolumn', { column: c, index: index });\n };\n /**\n * Deletes a column from the schema at the specified index.\n * @memberof canvasDatagrid\n * @name deleteColumn\n * @tutorial schema\n * @method\n * @param {number} index The index of the column to delete.\n */\n self.deleteColumn = function (index) {\n var schema = self.getSchema();\n\n // remove data matching this column name from data\n self.originalData.forEach(function (row) {\n delete row[schema[index].name];\n });\n\n schema.splice(index, 1);\n self.intf.schema = schema;\n\n self.refresh();\n self.dispatchDataChanged('deletecolumn', { index: index });\n };\n /**\n * Adds a new column into the schema.\n * @tutorial schema\n * @memberof canvasDatagrid\n * @name addColumn\n * @method\n * @param {column} c The column to add to the schema.\n */\n self.addColumn = function (c) {\n var s = self.getSchema();\n self.validateColumn(c, s);\n s.push(c);\n self.originalData.forEach(function (row, rowIndex) {\n self.applyDefaultValue(row, c, rowIndex);\n });\n self.intf.schema = s;\n\n self.refresh();\n self.dispatchDataChanged('addcolumn', { column: c });\n };\n /**\n * Deletes a row from the dataset at the specified index.\n * @memberof canvasDatagrid\n * @name deleteRow\n * @method\n * @param {number} index The index of the row to delete.\n */\n self.deleteRow = function (index) {\n self.originalData.splice(index, 1);\n self.setFilter();\n self.resize(true);\n self.dispatchDataChanged('deleterow', { index: index });\n };\n /**\n * Inserts a new row into the dataset before the specified index.\n * @memberof canvasDatagrid\n * @name insertRow\n * @method\n * @param {object} d data.\n * @param {number} index The index of the row to insert before.\n */\n self.insertRow = function (d, index) {\n if (self.originalData.length < index) {\n throw new Error('Index is beyond the length of the dataset.');\n }\n self.originalData.splice(index, 0, d);\n self.getSchema().forEach(function (c) {\n if (d[c.name] === undefined) {\n self.applyDefaultValue(self.originalData[index], c, index);\n }\n });\n\n // setFilter calls .refresh(), so we need not call it again:\n self.setFilter();\n\n self.resize(true);\n self.dispatchDataChanged('insertrow', { row: d, index: index });\n };\n /**\n * Adds a new row into the dataset.\n * @memberof canvasDatagrid\n * @name addRow\n * @method\n * @param {object} d data.\n */\n self.addRow = function (d) {\n self.originalData.push(d);\n self.getSchema().forEach(function (c) {\n if (d[c.name] === undefined) {\n self.applyDefaultValue(\n self.originalData[self.originalData.length - 1],\n c,\n self.originalData.length - 1,\n );\n }\n });\n\n // setFilter calls .refresh(), so we need not call it again:\n self.setFilter();\n\n self.resize(true);\n self.dispatchDataChanged('addrow', { row: d });\n };\n /**\n * Sets the height of a given row by index number.\n * @memberof canvasDatagrid\n * @name setRowHeight\n * @method\n * @param {number} rowIndex The index of the row to set.\n * @param {number} height Height to set the row to.\n */\n self.setRowHeight = function (rowIndex, height) {\n self.sizes.rows[rowIndex] = height;\n self.draw(true);\n };\n /**\n * Sets the width of a given column by index number.\n * @memberof canvasDatagrid\n * @name setColumnWidth\n * @method\n * @param {number} colIndex The index of the column to set.\n * @param {number} width Width to set the column to.\n */\n self.setColumnWidth = function (colIndex, width) {\n self.sizes.columns[colIndex] = width;\n self.draw(true);\n };\n /**\n * Removes any changes to the width of the columns due to user or api interaction, setting them back to the schema or style default.\n * @memberof canvasDatagrid\n * @name resetColumnWidths\n * @tutorial schema\n * @method\n */\n self.resetColumnWidths = function () {\n self.sizes.columns = {};\n self.draw(true);\n };\n /**\n * Removes any changes to the height of the rows due to user or api interaction, setting them back to the schema or style default.\n * @memberof canvasDatagrid\n * @name resetRowHeights\n * @tutorial schema\n * @method\n */\n self.resetRowHeights = function () {\n self.sizes.rows = {};\n self.draw(true);\n };\n /**\n * Sets the value of the filter.\n * @memberof canvasDatagrid\n * @name setFilter\n * @method\n * @param {string} column Name of the column to filter.\n * @param {string} value The value to filter for.\n */\n self.setFilter = function (column, value) {\n if (column === undefined && value === undefined) {\n self.columnFilters = {};\n } else if (column && (value === '' || value === undefined)) {\n delete self.columnFilters[column];\n } else {\n self.columnFilters[column] = value;\n if (self.attributes.showFilterInCell) {\n self.filterable.rows.push(0);\n self.orders.columns.forEach(function (value, index) {\n self.filterable.columns.push(index);\n });\n }\n }\n if (!Object.keys(self.columnFilters).length) {\n self.filterable = {\n rows: [],\n columns: [],\n };\n }\n self.refresh();\n };\n /**\n * Returns the number of pixels to scroll down to line up with row rowIndex.\n * @memberof canvasDatagrid\n * @name findRowScrollTop\n * @method\n * @param {number} rowIndex The row index of the row to scroll find.\n */\n self.findRowScrollTop = function (rowIndex) {\n if (self.scrollCache.y[rowIndex] === undefined) {\n throw new RangeError(\n `Row index ${rowIndex} out of range: ${self.scrollCache.y.length}.`,\n );\n }\n return self.scrollCache.y[rowIndex];\n };\n /**\n * Returns the number of pixels to scroll to the left to line up with column columnIndex.\n * @memberof canvasDatagrid\n * @name findColumnScrollLeft\n * @method\n * @param {number} columnIndex The column index of the column to find.\n */\n self.findColumnScrollLeft = function (columnIndex) {\n var i = Math.max(columnIndex - 1, 0);\n if (self.scrollCache.x[i] === undefined) {\n throw new Error('Column index out of range.');\n }\n return (\n self.scrollCache.x[i] -\n self.getColumnWidth(self.orders.columns[columnIndex])\n );\n };\n /**\n * Scrolls to the cell at columnIndex x, and rowIndex y. If you define both rowIndex and columnIndex additional calculations can be made to center the cell using the target cell's height and width. Defining only one rowIndex or only columnIndex will result in simpler calculations.\n * @memberof canvasDatagrid\n * @name gotoCell\n * @method\n * @param {number} x The column index of the cell to scroll to.\n * @param {number} y The row index of the cell to scroll to.\n * @param {number} [offsetX=0] Percentage offset the cell should be from the left edge (not including headers). The default is 0, meaning the cell will appear at the left edge. Valid values are 0 through 1. 1 = Left, 0 = Right, 0.5 = Center.\n * @param {number} [offsetY=0] Percentage offset the cell should be from the top edge (not including headers). The default is 0, meaning the cell will appear at the top edge. Valid values are 0 through 1. 1 = Bottom, 0 = Top, 0.5 = Center.\n */\n self.gotoCell = function (x, y, offsetX, offsetY) {\n var targetX = x === undefined ? undefined : self.findColumnScrollLeft(x),\n targetY = y === undefined ? undefined : self.findRowScrollTop(y),\n cell,\n sbw =\n self.scrollBox.width -\n (self.scrollBox.verticalBarVisible ? self.style.scrollBarWidth : 0),\n sbh =\n self.scrollBox.height -\n (self.scrollBox.horizontalBarVisible ? self.style.scrollBarWidth : 0);\n offsetX = offsetX === undefined ? 0 : offsetX;\n offsetY = offsetY === undefined ? 0 : offsetY;\n targetX -= sbw * offsetX;\n targetY -= sbh * offsetY;\n if (x !== undefined && y !== undefined) {\n self.scrollBox.scrollTo(targetX, targetY);\n if (!offsetX && !offsetY) {\n // nothing to correct; a deferred re-scroll would only undo a scroll\n // the user made in the meantime (#313)\n return;\n }\n requestAnimationFrame(function () {\n cell = self.getVisibleCellByIndex(x, y);\n // HACK: just don't offset if the target cell cannot be seen\n // TODO: offset does not work on very small grids, not sure why\n if (!cell) {\n return;\n }\n targetX += cell.width * offsetX;\n targetY += cell.height * offsetY;\n self.scrollBox.scrollTo(targetX, targetY);\n });\n } else if (x !== undefined) {\n self.scrollBox.scrollLeft = targetX;\n } else if (y !== undefined) {\n self.scrollBox.scrollTop = targetY;\n }\n };\n /**\n * Scrolls the row y.\n * @memberof canvasDatagrid\n * @name gotoRow\n * @method\n * @param {number} y The row index of the cell to scroll to.\n */\n self.gotoRow = function (y) {\n self.gotoCell(0, y);\n };\n /**\n * Add a button into the cell.\n * @memberof canvasDatagrid\n * @name addButton\n * @method\n * @param {number} columnIndex The column index of the cell to to add a button.\n * @param {number} rowIndex The row index of the cell to to add a button.\n * @param {object} offset Offset how far go away from cell.\n * @param {object} items a list of items to add into button menu.\n * @param {string} imgSrc icon path to add into button.\n */\n self.addButton = function (columnIndex, rowIndex, offset, items, imgSrc) {\n var cells = self.visibleCells.filter(function (c) {\n return c.sortColumnIndex === columnIndex && c.sortRowIndex === rowIndex;\n });\n\n self.attachButton(\n {\n top: cells[0].y + cells[0].height + offset.y,\n left: cells[0].x + cells[0].width + offset.x,\n },\n items,\n imgSrc,\n );\n };\n\n /**\n * Expand/Collapse CellTree.\n * @memberof canvasDatagrid\n * @name toggleCellCollapseTree\n * @method\n * @param {array} treeData The array of cellTree to expand or collapse.\n */\n\n self.toggleCellCollapseTree = function (treeData) {\n for (let type in treeData) {\n for (let t of treeData[type])\n if (t.length > 0) self.toggleCollapseTree(t[0], t[1], type);\n }\n self.draw();\n };\n\n /**\n * Expand/Collapse CellTree.\n * @memberof canvasDatagrid\n * @name expandCollapseCellTree\n * @method\n * @param {array} treeData The array of cellTree to expand or collapse.\n */\n\n self.expandCollapseCellTree = function (treeData) {\n for (let type in treeData) {\n for (let t of treeData[type])\n if (t.length > 0) self.cellTreeExpandCollapse(t[0], t[1], type);\n }\n self.draw();\n };\n\n /**\n * Scrolls the cell at cell x, row y into view if it is not already.\n * @memberof canvasDatagrid\n * @name scrollIntoView\n * @method\n * @param {number} x The column index of the cell to scroll into view.\n * @param {number} y The row index of the cell to scroll into view.\n * @param {number} [offsetX=0] Percentage offset the cell should be from the left edge (not including headers). The default is 0, meaning the cell will appear at the left edge. Valid values are 0 through 1. 1 = Left, 0 = Right, 0.5 = Center.\n * @param {number} [offsetY=0] Percentage offset the cell should be from the top edge (not including headers). The default is 0, meaning the cell will appear at the top edge. Valid values are 0 through 1. 1 = Bottom, 0 = Top, 0.5 = Center.\n */\n self.scrollIntoView = function (x, y, offsetX, offsetY) {\n const matched = self.visibleCells.filter(function (cell) {\n return (\n (cell.rowIndex === y || y === undefined) &&\n (cell.columnIndex === x || x === undefined) &&\n cell.x > 0 &&\n cell.y > 0 &&\n cell.x + cell.width < self.width &&\n cell.y + cell.height < self.height\n );\n });\n if (matched.length === 1 && x !== undefined && y !== undefined) {\n // goto specific cell and its part be hidden by header\n if (\n matched[0].x < self.getRowHeaderCellWidth() ||\n matched[0].y < self.getColumnHeaderCellHeight()\n )\n matched.length = 0;\n }\n if (matched.length === 0) {\n self.gotoCell(x, y, offsetX, offsetY);\n }\n };\n /**\n * Sets the active cell. Requires redrawing.\n * @memberof canvasDatagrid\n * @name setActiveCell\n * @method\n * @param {number} x The column index of the cell to set active.\n * @param {number} y The row index of the cell to set active.\n */\n self.setActiveCell = function (x, y) {\n if (typeof x === 'undefined') return;\n if (x < 0) {\n x = 0;\n }\n if (y < 0) {\n y = 0;\n }\n self.activeCell = {\n rowIndex: y,\n columnIndex: x,\n };\n self.dispatchEvent('activecellchanged', {\n cell: self.activeCell,\n });\n };\n\n /**\n * Dispatches `datachanged` with the source of the change so listeners can\n * react to edits, pastes, deletions and row/column changes, not only to the\n * data setter (#250, #512).\n * @param {string} source One of data, edit, paste, cut, delete, fill, addrow, insertrow, deleterow, addcolumn, insertcolumn, deletecolumn.\n * @param {object} [details] Extra event details.\n */\n self.dispatchDataChanged = function (source, details) {\n self.dispatchEvent(\n 'datachanged',\n Object.assign({ data: self.originalData, source: source }, details || {}),\n );\n };\n /**\n * Dispatches the `resizerow` event with one consistent payload (#503).\n * Canonical keys: `rowIndex`, `height`, `width`, `x`, `y`, `draggingItem`,\n * `NativeEvent`. `cellHeight` and `row` are kept as deprecated aliases of\n * `height` for listeners written against older versions.\n * @param {object} details Event details; `height` is required.\n * @returns {boolean} true when a listener called preventDefault.\n */\n self.dispatchResizeRow = function (details) {\n var ev = Object.assign({}, details);\n if (ev.y === undefined) {\n ev.y = ev.height;\n }\n ev.cellHeight = ev.height;\n ev.row = ev.height;\n return self.dispatchEvent('resizerow', ev);\n };\n /**\n * Collapse a tree grid by row index.\n * @memberof canvasDatagrid\n * @name collapseTree\n * @method\n * @param {number} index The index of the row to collapse.\n */\n self.collapseTree = function (rowIndex) {\n self.dispatchEvent('collapsetree', {\n childGrid: self.childGrids[rowIndex],\n data: self.viewData[rowIndex],\n rowIndex: rowIndex,\n });\n self.openChildren[rowIndex].blur();\n self.openChildren[rowIndex].dispose();\n delete self.openChildren[rowIndex];\n delete self.sizes.trees[rowIndex];\n delete self.childGrids[rowIndex];\n self.dispatchResizeRow({\n height: self.style.cellHeight,\n rowIndex: rowIndex,\n });\n self.resize(true);\n self.draw(true);\n };\n /**\n * Expands a tree grid by row index.\n * @memberof canvasDatagrid\n * @name expandTree\n * @method\n * @param {number} index The index of the row to expand.\n */\n self.expandTree = function (rowIndex) {\n // copy so the caller's object is not mutated; `self.args` is empty in\n // web-component mode, the value lives on the instance (#444)\n var trArgs = Object.assign({}, self.treeGridAttributes || {}),\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth =\n self.sizes.columns.cornerCell || self.style.rowHeaderCellWidth,\n h = self.sizes.trees[rowIndex] || self.style.treeGridHeight,\n treeGrid;\n if (!self.childGrids[rowIndex]) {\n trArgs.debug = self.attributes.debug;\n trArgs.name = self.attributes.saveAppearance\n ? self.attributes.name + 'tree' + rowIndex\n : undefined;\n trArgs.style = trArgs.style || self.style;\n trArgs.parentNode = {\n parentGrid: self.intf,\n nodeType: 'canvas-datagrid-tree',\n offsetHeight: h,\n offsetWidth: self.width - rowHeaderCellWidth,\n header: { width: self.width - rowHeaderCellWidth },\n offsetLeft: rowHeaderCellWidth,\n offsetTop: columnHeaderCellHeight,\n offsetParent: self.intf.parentNode,\n parentNode: self.intf.parentNode,\n style: 'tree',\n data: self.viewData[rowIndex],\n };\n treeGrid = self.createGrid(trArgs);\n self.childGrids[rowIndex] = treeGrid;\n }\n treeGrid = self.childGrids[rowIndex];\n treeGrid.visible = true;\n self.dispatchEvent('expandtree', {\n treeGrid: treeGrid,\n data: self.viewData[rowIndex],\n rowIndex: rowIndex,\n });\n self.openChildren[rowIndex] = treeGrid;\n self.sizes.trees[rowIndex] = h;\n self.dispatchResizeRow({\n height: self.style.cellHeight,\n rowIndex: rowIndex,\n });\n self.resize(true);\n };\n /**\n * Toggles tree grid open and close by row index.\n * @memberof canvasDatagrid\n * @name toggleTree\n * @method\n * @param {number} index The index of the row to toggle.\n */\n self.toggleTree = function (rowIndex) {\n var i = self.openChildren[rowIndex];\n if (i) {\n return self.collapseTree(rowIndex);\n }\n self.expandTree(rowIndex);\n };\n /**\n * Returns a header from the schema by name.\n * @memberof canvasDatagrid\n * @name getHeaderByName\n * @tutorial schema\n * @method\n * @returns {header} header with the selected name, or undefined.\n * @param {string} name The name of the column to resize.\n */\n self.getHeaderByName = function (name) {\n var x,\n i = self.getSchema();\n for (x = 0; x < i.length; x += 1) {\n if (i[x].name === name) {\n return i[x];\n }\n }\n };\n /**\n * Hide column/columns\n * @memberof canvasDatagrid\n * @name hideColumns\n * @method\n * @param {number} beginColumnOrderIndex The begin column order index\n * @param {number} [endColumnOrderIndex] The end column order index\n */\n self.hideColumns = function (beginColumnOrderIndex, endColumnOrderIndex) {\n const schema = self.getSchema();\n const orders = self.orders.columns;\n const hiddenColumns = [];\n if (typeof endColumnOrderIndex !== 'number')\n endColumnOrderIndex = beginColumnOrderIndex;\n for (\n let orderIndex = beginColumnOrderIndex;\n orderIndex <= endColumnOrderIndex;\n orderIndex++\n ) {\n const columnIndex = orders[orderIndex];\n if (columnIndex >= 0 && !schema[columnIndex].hidden) {\n hiddenColumns.push(columnIndex);\n schema[columnIndex].hidden = true;\n\n self.dispatchEvent('columnhide', {\n columnIndex,\n });\n }\n }\n\n if (hiddenColumns.length > 0) {\n self.setStorageData();\n setTimeout(function () {\n self.resize(true);\n }, 10);\n }\n\n self.dispatchEvent('hidecolumns', {\n hiddenColumns,\n });\n };\n /**\n * Unihde column/columns\n * @memberof canvasDatagrid\n * @name unhideColumns\n * @method\n * @param {number} beginColumnOrderIndex The begin column order index\n * @param {number} [endColumnOrderIndex] The end column order index\n */\n self.unhideColumns = function (beginColumnOrderIndex, endColumnOrderIndex) {\n const orders = self.orders.columns;\n const schema = self.getSchema();\n\n for (let i = beginColumnOrderIndex; i <= endColumnOrderIndex; i++) {\n const columnIndex = orders[i];\n const s = schema[columnIndex];\n\n if (s && s.hidden) {\n s.hidden = false;\n\n self.dispatchEvent('columnunhide', {\n columnIndex,\n });\n }\n }\n self.refresh();\n };\n /**\n * Hide rows\n * @memberof canvasDatagrid\n * @name hideRows\n * @method\n * @param {number} beginRowIndex The begin row index\n * @param {number} endRowIndex The end row index\n */\n self.hideRows = function (beginRowIndex, endRowIndex) {\n if (\n mergeHiddenRowRanges(self.hiddenRowRanges, [beginRowIndex, endRowIndex])\n )\n self.refresh();\n };\n /**\n * Unhide rows\n * @memberof canvasDatagrid\n * @name unhideRows\n * @method\n * @param {number} beginRowIndex The begin row index\n * @param {number} endRowIndex The end row index\n */\n self.unhideRows = function (beginRowIndex, endRowIndex) {\n self.hiddenRowRanges = self.hiddenRowRanges.filter(\n (range) => range[0] !== beginRowIndex || range[1] !== endRowIndex,\n );\n self.refresh();\n };\n /**\n * Resizes a column to fit the longest value in the column. Call without a value to resize all columns.\n * Warning, can be slow on very large record sets (1m records ~3-5 seconds on an i7).\n * @memberof canvasDatagrid\n * @name fitColumnToValues\n * @method\n * @param {string} name The name of the column to resize.\n */\n self.fitColumnToValues = function (name, internal) {\n if (!self.canvas) {\n return;\n }\n\n if (name === undefined) {\n // fit every column, as documented (#193)\n self.getSchema().forEach(function (column) {\n self.fitColumnToValues(column.name, true);\n });\n if (!internal) {\n self.resize();\n self.draw(true);\n }\n return;\n }\n\n const header = name === 'cornerCell' ? null : self.getHeaderByName(name);\n if (name !== 'cornerCell' && !header) {\n console.warn('fitColumnToValues: no column named %s', name);\n return;\n }\n const columnIndex = name === 'cornerCell' ? -1 : header.index;\n\n const newSize = Math.max(\n self.findColumnMaxTextLength(name),\n self.style.minColumnWidth,\n );\n\n self.sizes.columns[columnIndex] = newSize;\n\n self.dispatchEvent('resizecolumn', {\n x: newSize,\n y: self.resizingStartingHeight,\n draggingItem: self.currentCell,\n });\n\n if (!internal) {\n self.resize();\n self.draw(true);\n }\n };\n /**\n * Checks if a cell is currently visible.\n * @memberof canvasDatagrid\n * @name isCellVisible\n * @overload\n * @method\n * @returns {boolean} when true, the cell is visible, when false the cell is not currently drawn.\n * @param {number} columnIndex The column index of the cell to check.\n * @param {number} rowIndex The row index of the cell to check.\n */\n self.isCellVisible = function (cell, rowIndex) {\n // overload\n if (rowIndex !== undefined) {\n return (\n self.visibleCells.filter(function (c) {\n return c.columnIndex === cell && c.rowIndex === rowIndex;\n }).length > 0\n );\n }\n var x,\n l = self.visibleCells.length;\n for (x = 0; x < l; x += 1) {\n if (\n cell.x === self.visibleCells[x].x &&\n cell.y === self.visibleCells[x].y\n ) {\n return true;\n }\n }\n return false;\n };\n /**\n * Sets the order of the data.\n * @memberof canvasDatagrid\n * @name order\n * @method\n * @param {number} columnName Name of the column to be sorted.\n * @param {string} direction `asc` for ascending or `desc` for descending.\n * @param {function} [sortFunction] When defined, override the default sorting method defined in the column's schema and use this one.\n * @param {bool} [dontSetStorageData] Don't store this setting for future use.\n */\n self.order = function (\n columnName,\n direction,\n sortFunction,\n dontSetStorageData,\n ) {\n if (!self.attributes.allowSorting) {\n self.refresh();\n return;\n }\n var f,\n c = self.getSchema().filter(function (col) {\n return col.name === columnName;\n });\n if (\n self.dispatchEvent('beforesortcolumn', {\n name: columnName,\n direction: direction,\n })\n ) {\n return;\n }\n self.orderBy = columnName;\n self.orderDirection = direction;\n if (!self.viewData || self.viewData.length === 0) {\n return;\n }\n if (c.length === 0) {\n throw new Error('Cannot sort. No such column name');\n }\n f = sortFunction || c[0].sorter || self.sorters[c[0].type];\n if (!f && c[0].type !== undefined) {\n console.warn(\n 'Cannot sort type \"%s\" falling back to string sort.',\n c[0].type,\n );\n }\n self.orderings.add(\n columnName,\n direction,\n typeof f === 'function' ? f : self.sorters.string,\n );\n self.refresh();\n self.dispatchEvent('sortcolumn', {\n name: columnName,\n direction: direction,\n });\n\n if (dontSetStorageData) {\n return;\n }\n self.setStorageData();\n };\n\n /**\n * Add grouping\n * @param {'columns'|'rows'} groupFor\n * @method\n * @param {number} from\n * @param {number} to\n */\n function addGroup(groupFor, from, to) {\n let newRow = false;\n const allGroups =\n groupFor === 'rows' ? self.groupedRows : self.groupedColumns;\n for (let i = allGroups.length - 1; i >= 0; i--) {\n const groups = allGroups[i];\n const min = groups[0].from,\n max = groups[groups.length - 1].to;\n if (from <= min && to >= max) {\n if (from === min && to === max && groups.length === 1) return; // nothings happened\n // new group wrap this row\n continue;\n }\n for (let gi = 0; gi < groups.length; gi++) {\n const g = groups[gi];\n if (from > g.to) continue;\n if (from >= g.from) {\n if (to > g.to) {\n if (from === g.from) {\n allGroups.splice(i, 0, [{ from, to, collapsed: false }]);\n self.refresh();\n return;\n }\n throw new Error(`Can't group these ${groupFor}`);\n }\n if (to === g.to) {\n if (from === g.from) return; // nothings happened\n }\n newRow = true;\n break;\n }\n if (to >= g.from) {\n if (to < g.to) throw new Error(`Can't group these ${groupFor}`);\n allGroups.splice(i, 0, [{ from, to, collapsed: false }]);\n } else {\n groups.splice(gi, 0, { from, to, collapsed: false });\n }\n self.refresh();\n return;\n }\n if (newRow) continue;\n groups.push({ from, to, collapsed: false });\n self.refresh();\n return;\n }\n if (newRow) allGroups.push([{ from, to, collapsed: false }]);\n else allGroups.unshift([{ from, to, collapsed: false }]);\n self.refresh();\n }\n /**\n * Remove grouping\n * @param {Array<Array<{from:number,to:number,collapsed:boolean}>>} allGroups\n * @method\n * @param {number} from\n * @param {number} to\n */\n function removeGroup(allGroups, from, to) {\n for (let i = 0; i < allGroups.length; i++) {\n const groups = allGroups[i];\n for (let gi = 0; gi < groups.length; gi++) {\n const group = groups[gi];\n if (group.from === from && group.to === to) {\n if (groups.length <= 1) allGroups.splice(i, 1);\n else groups.splice(gi, 1);\n self.refresh();\n return;\n }\n }\n }\n }\n /**\n * Grouping columns\n * @memberof canvasDatagrid\n * @name groupColumns\n * @method\n * @param {number|string} firstColumnName Name of the first column to be grouped.\n * @param {number|string} lastColumnName Name of the last column to be grouped.\n */\n self.groupColumns = function (firstColumnName, lastColumnName) {\n /** @type {Array<{name: string,columnIndex:number}>} */\n const schema = self.getSchema();\n let firstOne, lastOne;\n for (let i = 0; i < schema.length; i++) {\n const it = schema[i];\n if (firstOne && lastOne) break;\n if (it.name === firstColumnName) {\n firstOne = it;\n continue;\n }\n if (it.name === lastColumnName) {\n lastOne = it;\n continue;\n }\n }\n if (!firstOne) throw new Error(`No such column name for first column`);\n if (!lastOne) throw new Error(`No such column name for last column`);\n if (lastOne.columnIndex > firstOne.columnIndex !== true)\n throw new Error(`Can't group these columns`);\n\n const from = firstOne.columnIndex;\n const to = lastOne.columnIndex;\n const ev = { group: { type: 'columns', from, to } };\n try {\n addGroup('columns', from, to);\n } catch (error) {\n ev.error = error;\n }\n self.dispatchEvent('aftercreategroup', ev);\n };\n /**\n * Grouping columns\n * @memberof canvasDatagrid\n * @name groupRows\n * @method\n * @param {number} rowIndexFrom The row index which is the beginning of the group\n * @param {number} rowIndexTo The row index which is the end of the group\n */\n self.groupRows = function (rowIndexFrom, rowIndexTo) {\n if (!Number.isInteger(rowIndexFrom) || rowIndexFrom < 0)\n throw new Error(`No such row for the beginning of the group`);\n\n const dataLength = self.viewData.length;\n if (\n !Number.isInteger(rowIndexFrom) ||\n rowIndexTo <= rowIndexFrom ||\n rowIndexTo >= dataLength\n )\n throw new Error(`No such row for the end of the group`);\n const ev = {\n group: {\n type: 'rows',\n from: rowIndexFrom,\n to: rowIndexTo,\n },\n };\n try {\n addGroup('rows', rowIndexFrom, rowIndexTo);\n } catch (error) {\n ev.error = error;\n }\n self.dispatchEvent('aftercreategroup', ev);\n };\n /**\n * Remove grouping columns\n * @memberof canvasDatagrid\n * @name removeGroupColumns\n * @method\n * @param {number|string} firstColumnName Name of the first column to be grouped.\n * @param {number|string} lastColumnName Name of the last column to be grouped.\n */\n self.removeGroupColumns = function (firstColumnName, lastColumnName) {\n /** @type {Array<{name:string,columnIndex:number}>} */\n const schema = self.getSchema();\n let firstOne, lastOne;\n for (let i = 0; i < schema.length; i++) {\n const it = schema[i];\n if (firstOne && lastOne) break;\n if (it.name === firstColumnName) {\n firstOne = it;\n continue;\n }\n if (it.name === lastColumnName) {\n lastOne = it;\n continue;\n }\n }\n if (!firstOne) throw new Error(`No such column name for first column`);\n if (!lastOne) throw new Error(`No such column name for last column`);\n const from = firstOne.columnIndex;\n const to = lastOne.columnIndex;\n removeGroup(self.groupedColumns, from, to);\n };\n /**\n * Remove grouping columns\n * @memberof canvasDatagrid\n * @name removeGroupRows\n * @method\n * @param {number} rowIndexFrom The row index which is the beginning of the group\n * @param {number} rowIndexTo The row index which is the end of the group\n */\n self.removeGroupRows = function (rowIndexFrom, rowIndexTo) {\n removeGroup(self.groupedRows, rowIndexFrom, rowIndexTo);\n };\n /**\n * Toggle(expand/collapsed) grouping columns\n * @memberof canvasDatagrid\n * @name toggleGroupColumns\n * @method\n * @param {number|string} firstColumnName Name of the first column to be grouped.\n * @param {number|string} lastColumnName Name of the last column to be grouped.\n */\n self.toggleGroupColumns = function (firstColumnName, lastColumnName) {\n /** @type {Array<{name:string,columnIndex:number}>} */\n const schema = self.getSchema();\n let firstOne, lastOne;\n for (let i = 0; i < schema.length; i++) {\n const it = schema[i];\n if (firstOne && lastOne) break;\n if (it.name === firstColumnName) {\n firstOne = it;\n continue;\n }\n if (it.name === lastColumnName) {\n lastOne = it;\n continue;\n }\n }\n if (!firstOne || !lastOne) return;\n const from = firstOne.columnIndex;\n const to = lastOne.columnIndex;\n if (self.toggleGroup({ type: 'c', from, to })) {\n self.disposeContextMenu();\n self.setStorageData();\n self.refresh();\n }\n };\n /**\n * Toggle(expand/collapsed) grouping rows\n * @memberof canvasDatagrid\n * @name toggleGroupRows\n * @method\n * @param {number} rowIndexFrom The row index which is the beginning of the group\n * @param {number} rowIndexTo The row index which is the end of the group\n */\n self.toggleGroupRows = function (rowIndexFrom, rowIndexTo) {\n if (self.toggleGroup({ type: 'r', from: rowIndexFrom, to: rowIndexTo })) {\n self.disposeContextMenu();\n self.setStorageData();\n self.refresh();\n }\n };\n\n self.isInGrid = function (e) {\n if (e.x < 0 || e.x > self.width || e.y < 0 || e.y > self.height) {\n return false;\n }\n return true;\n };\n\n /**\n * Moves data in the provided selection to another position in the grid. Moving data off the edge of the schema (columns/x) will truncate data.\n * @memberof canvasDatagrid\n * @name moveTo\n * @method\n * @param {array} sel 2D array representing selected rows and columns. `canvasDatagrid.selections` is in this format and can be used here.\n * @param {number} x The column index to start inserting the selection at.\n * @param {number} y The row index to start inserting the selection at.\n */\n self.moveTo = function (sel, x, y) {\n // TODO: optimize this function,\n // we just transform the `sel` to obselete selection matrix\n sel = self.getObsoleteSelectionMatrix(sel);\n\n // TODO: this function is not migrated done\n var selectedData = self.getSelectedData(),\n visibleSchema = self.getVisibleSchema(),\n selectionLength = sel.length,\n xi,\n maxRowLength = -Infinity,\n minXi = Infinity,\n yi = y - 1;\n\n sel.forEach(function (row, rowIndex) {\n if (rowIndex === selectionLength) {\n return;\n }\n if (row.length === 0) {\n return;\n }\n minXi = Math.min(self.getVisibleColumnIndexOf(x), minXi);\n maxRowLength = Math.max(maxRowLength, row.length);\n row.forEach(function (colIndex) {\n // intentional redef of colIndex\n colIndex = self.getVisibleColumnIndexOf(colIndex);\n if (!visibleSchema[colIndex]) {\n return;\n }\n // TODO:\n if (!self.data) {\n self.data = {};\n }\n if (!self.data[rowIndex]) {\n self.data[rowIndex] = {};\n }\n // TODO:\n self.data[rowIndex][visibleSchema[colIndex].name] = null;\n });\n });\n\n sel.forEach(function (row, index) {\n var lastSourceIndex;\n yi += 1;\n xi = self.getVisibleColumnIndexOf(x);\n row.forEach(function (colIndex, cidx) {\n colIndex = self.getVisibleColumnIndexOf(colIndex);\n if (cidx > 0) {\n // this confusing bit of nonsense figures out\n // if the selection has skipped cells\n xi += colIndex - lastSourceIndex;\n }\n lastSourceIndex = colIndex;\n if (\n colIndex === -1 ||\n !visibleSchema[xi] ||\n !visibleSchema[colIndex] ||\n // TODO:\n self.data.length - 1 < yi ||\n yi < 0\n ) {\n return;\n }\n // TODO:\n if (!self.data[yi]) {\n self.data[yi] = {};\n }\n // TODO:\n self.data[yi][visibleSchema[xi].name] =\n selectedData[index][visibleSchema[colIndex].name];\n });\n });\n };\n /**\n * Get the column group info given column belongs to\n * @memberof canvasDatagrid\n * @name getGroupsColumnBelongsTo\n * @method\n * @param {number} columnIndex Column index.\n * @returns {Array<{from:number,to:number,collapsed:boolean}>}\n */\n self.getGroupsColumnBelongsTo = function (columnIndex) {\n if (!self.attributes.allowGroupingColumns) return [];\n const result = [];\n for (let i = 0; i < self.groupedColumns.length; i++) {\n const groups = self.groupedColumns[i];\n for (let j = 0; j < groups.length; j++) {\n const group = groups[j];\n if (columnIndex >= group.from && columnIndex <= group.to) {\n result.push(group);\n break;\n }\n }\n }\n return result;\n };\n /**\n * Get the row group info given row belongs to\n * @memberof canvasDatagrid\n * @name getGroupsRowBelongsTo\n * @method\n * @param {number} rowIndex Row index.\n * @returns {Array<{from:number,to:number,collapsed:boolean}>}\n */\n self.getGroupsRowBelongsTo = function (rowIndex) {\n if (!self.attributes.allowGroupingRows) return [];\n const result = [];\n for (let i = 0; i < self.groupedRows.length; i++) {\n const groups = self.groupedRows[i];\n for (let j = 0; j < groups.length; j++) {\n const group = groups[j];\n if (rowIndex >= group.from && rowIndex <= group.to) {\n result.push(group);\n break;\n }\n }\n }\n return result;\n };\n\n /**\n * Checks if a given column is visible.\n * @memberof canvasDatagrid\n * @name isColumnVisible\n * @method\n * @returns {boolean} When true, the column is visible.\n * @param {number} columnIndex Column index.\n */\n self.isColumnVisible = function (columnIndex) {\n return (\n self.visibleCells.filter(function (c) {\n return c.columnIndex === columnIndex;\n }).length > 0\n );\n };\n /**\n * Checks if a given row is visible.\n * @memberof canvasDatagrid\n * @name isRowVisible\n * @method\n * @returns {boolean} When true, the row is visible.\n * @param {number} rowIndex Row index.\n */\n self.isRowVisible = function (rowIndex) {\n return (\n self.visibleCells.filter(function (c) {\n return c.rowIndex === rowIndex;\n }).length > 0\n );\n };\n /**\n * Gets the cell at columnIndex and rowIndex.\n * @memberof canvasDatagrid\n * @name getVisibleCellByIndex\n * @method\n * @returns {cell} cell at the selected location.\n * @param {number} x Column index.\n * @param {number} y Row index.\n */\n self.getVisibleCellByIndex = function (x, y) {\n return self.visibleCells.filter(function (c) {\n return c.columnIndex === x && c.rowIndex === y;\n })[0];\n };\n /**\n * Get an unhide indicator at grid pixel coordinate x and y.\n * @memberof canvasDatagrid\n * @name getUnhideIndicator\n * @method\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getUnhideIndicator = function (x, y) {\n const indicators = self.visibleUnhideIndicators;\n if (indicators.length <= 0) return;\n for (let i = 0; i < indicators.length; i++) {\n const indicator = indicators[i];\n if (\n x >= indicator.x &&\n y >= indicator.y &&\n x <= indicator.x2 &&\n y <= indicator.y2\n )\n return indicator;\n }\n };\n /**\n * Get a column group at grid pixel coordinate x and y.\n * @memberof canvasDatagrid\n * @name getColumnGroupAt\n * @method\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getColumnGroupAt = function (x, y) {\n const groups = self.groupedColumns.length;\n if (groups <= 0) return;\n const yZero = self.getColumnGroupAreaHeight();\n if (y >= yZero) return;\n for (let i = 0; i < self.visibleGroups.length; i++) {\n const g = self.visibleGroups[i];\n if (g.type !== 'c') continue;\n if (x >= g.x && y >= g.y && x <= g.x2 && y <= g.y2) return g;\n }\n };\n /**\n * Get a row group at grid pixel coordinate x and y.\n * @memberof canvasDatagrid\n * @name getRowGroupAt\n * @method\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getRowGroupAt = function (x, y) {\n const groups = self.groupedRows.length;\n if (groups <= 0) return;\n const xZero = self.getRowGroupAreaWidth();\n if (x >= xZero) return;\n for (let i = 0; i < self.visibleGroups.length; i++) {\n const g = self.visibleGroups[i];\n if (g.type !== 'r') continue;\n if (x >= g.x && y >= g.y && x <= g.x2 && y <= g.y2) return g;\n }\n };\n /**\n * Gets the cell at grid pixel coordinate x and y. Author's note. This function ties drawing and events together. This is a very complex function and is core to the component.\n * @memberof canvasDatagrid\n * @name getCellAt\n * @method\n * @returns {cell} cell at the selected location.\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getCellAt = function (x, y, useTouchScrollZones) {\n function getBorder(entitiy) {\n if (\n entitiy.x + entitiy.width - self.attributes.borderResizeZone * 0.4 <\n x &&\n entitiy.x + entitiy.width + self.attributes.borderResizeZone * 0.6 > x\n ) {\n return 'r';\n }\n if (\n entitiy.x - self.attributes.borderResizeZone * 0.4 < x &&\n entitiy.x + self.attributes.borderResizeZone * 0.6 > x\n ) {\n return 'l';\n }\n if (\n entitiy.y + entitiy.height - self.attributes.borderResizeZone * 0.4 <\n y &&\n entitiy.y + entitiy.height + self.attributes.borderResizeZone * 0.6 > y\n ) {\n return 'b';\n }\n if (\n entitiy.y - self.attributes.borderResizeZone * 0.4 < y &&\n entitiy.y + self.attributes.borderResizeZone * 0.6 > y\n ) {\n return 't';\n }\n }\n if (!self.visibleCells) {\n return;\n }\n x -= self.getRowGroupAreaWidth();\n y -= self.getColumnGroupAreaHeight();\n\n if (self.dragStartObject !== undefined) {\n if (x <= 0) x = 1;\n if (x >= self.width) x = self.width - 1;\n if (y <= 0) y = 1;\n if (y >= self.height) y = self.height - 1;\n }\n\n var border,\n tsz = useTouchScrollZones ? self.attributes.touchScrollZone : 0,\n moveMode = self.attributes.borderDragBehavior === 'move',\n i,\n l = self.visibleCells.length,\n moveBorder,\n xBorderBehavior = moveMode ? self.cursorGrab : 'ew-resize',\n yBorderBehavior = moveMode ? self.cursorGrab : 'ns-resize',\n cell,\n entitiy;\n if (!self.visibleCells || !self.visibleCells.length) {\n return;\n }\n self.hasFocus = true;\n if (!(y < self.height && y > 0 && x < self.width && x > 0)) {\n self.hasFocus = false;\n return {\n dragContext: 'inherit',\n context: 'inherit',\n };\n }\n for (i = 0; i < l; i += 1) {\n cell = self.visibleCells[i];\n // interactive dimensions of the cell. used for touch \"over size\" zones\n entitiy = {\n x: cell.x,\n y: cell.y,\n height: cell.height,\n width: cell.width,\n };\n if (\n useTouchScrollZones &&\n /(vertical|horizontal)-scroll-/.test(cell.style)\n ) {\n entitiy.x -= tsz;\n entitiy.y -= tsz;\n entitiy.height += tsz;\n entitiy.width += tsz;\n }\n if (\n entitiy.x - self.style.cellBorderWidth < x &&\n entitiy.x + entitiy.width + self.style.cellBorderWidth > x &&\n entitiy.y - self.style.cellBorderWidth < y &&\n entitiy.y + entitiy.height + self.style.cellBorderWidth > y\n ) {\n if (/frozen-row-marker/.test(cell.style)) {\n if (self.dragMode === 'frozen-column-marker') continue;\n cell.dragContext = cell.style;\n cell.context = 'grab';\n return cell;\n }\n if (/frozen-column-marker/.test(cell.style)) {\n if (self.dragMode === 'frozen-row-marker') continue;\n cell.dragContext = cell.style;\n cell.context = 'grab';\n return cell;\n }\n if (/selection-handle-/.test(cell.style)) {\n cell.dragContext = cell.style;\n cell.context = 'crosshair';\n return cell;\n }\n if (/vertical-scroll-(bar|box)/.test(cell.style)) {\n cell.dragContext = 'vertical-scroll-box';\n cell.context = 'vertical-scroll-box';\n cell.isScrollBar = true;\n cell.isVerticalScrollBar = true;\n if (y > self.scrollBox.box.v.y + self.scrollBox.scrollBoxHeight) {\n cell.dragContext = 'vertical-scroll-bottom';\n cell.context = 'vertical-scroll-bottom';\n } else if (y < self.scrollBox.box.v.y) {\n cell.dragContext = 'vertical-scroll-top';\n cell.context = 'vertical-scroll-top';\n }\n self.cursor = 'default';\n return cell;\n }\n if (/horizontal-scroll-(bar|box)/.test(cell.style)) {\n cell.dragContext = 'horizontal-scroll-box';\n cell.context = 'horizontal-scroll-box';\n cell.isScrollBar = true;\n cell.isHorizontalScrollBar = true;\n if (x > self.scrollBox.box.h.x + self.scrollBox.scrollBoxWidth) {\n cell.dragContext = 'horizontal-scroll-right';\n cell.context = 'horizontal-scroll-right';\n } else if (x < self.scrollBox.box.h.x) {\n cell.dragContext = 'horizontal-scroll-left';\n cell.context = 'horizontal-scroll-left';\n }\n self.cursor = 'default';\n return cell;\n }\n border = getBorder(entitiy);\n // check if the border of this cell is the border of the selection and if so show move cursor in move mode\n moveBorder =\n moveMode &&\n cell.selectionBorder &&\n cell.selectionBorder.indexOf(border) !== -1;\n if (\n ['l', 'r'].indexOf(border) !== -1 &&\n (self.attributes.allowColumnResize || moveBorder) &&\n !(\n self.attributes.fillLastColumn &&\n border === 'r' &&\n cell.sortColumnIndex === self.getLastVisibleColumnIndex()\n ) &&\n ((self.attributes.allowColumnResizeFromCell && cell.isNormal) ||\n !cell.isNormal ||\n moveBorder) &&\n ((self.attributes.allowRowHeaderResize &&\n (cell.isRowHeader || cell.isCorner)) ||\n !(cell.isRowHeader && cell.isCorner))\n ) {\n if (\n (cell.isColumnHeader ||\n cell.isCorner ||\n (self.attributes.allowColumnResizeFromCell && cell.isNormal)) &&\n border === 'r'\n ) {\n cell.context = 'ew-resize';\n cell.dragContext = 'ew-resize';\n return cell;\n }\n if (!(cell.isColumnHeader || cell.isCorner) && moveBorder) {\n cell.context = xBorderBehavior;\n cell.dragContext = border + '-move';\n return cell;\n }\n }\n if (\n ['t', 'b'].indexOf(border) !== -1 &&\n cell.rowIndex > -1 &&\n (self.attributes.allowRowResize || moveBorder) &&\n ((self.attributes.allowRowResizeFromCell && cell.isNormal) ||\n !cell.isNormal ||\n moveBorder) &&\n !cell.isColumnHeader\n ) {\n if (\n (cell.isRowHeader ||\n cell.isCorner ||\n (self.attributes.allowRowResizeFromCell && cell.isNormal)) &&\n border === 'b'\n ) {\n cell.context = 'ns-resize';\n cell.dragContext = 'ns-resize';\n return cell;\n }\n if (!(cell.isRowHeader || cell.isCorner) && moveBorder) {\n cell.context = yBorderBehavior;\n cell.dragContext = border + '-move';\n return cell;\n }\n }\n if (cell.style === 'columnHeaderCell') {\n if (\n (!self.isColumnSelected(cell.columnIndex) &&\n cell.x +\n cell.width -\n self.attributes.columnGrabZoneSize -\n self.style.cellBorderWidth >\n x) ||\n !self.attributes.allowColumnReordering\n ) {\n cell.dragContext = 'cell';\n cell.context = 'cell';\n } else {\n cell.context = self.cursorGrab;\n cell.dragContext = 'column-reorder';\n }\n return cell;\n }\n if (cell.style === 'rowHeaderCell') {\n if (\n (!self.isRowSelected(cell.rowIndex) &&\n self.attributes.rowGrabZoneSize +\n (cell.y - self.style.cellBorderWidth) <\n y) ||\n !self.attributes.allowRowReordering\n ) {\n cell.dragContext = 'cell';\n cell.context = 'cell';\n } else {\n cell.context = self.cursorGrab;\n cell.dragContext = 'row-reorder';\n }\n return cell;\n }\n if (cell.isGrid) {\n self.hasFocus = false;\n cell.dragContext = 'cell-grid';\n cell.context = 'cell-grid';\n return cell;\n }\n if (cell.style === 'tree-grid') {\n self.hasFocus = false;\n cell.dragContext = 'tree';\n cell.context = 'tree';\n return cell;\n }\n cell.dragContext = 'cell';\n cell.context = 'cell';\n return cell;\n }\n }\n self.hasFocus = true;\n self.cursor = 'default';\n return {\n dragContext: 'background',\n context: 'background',\n style: 'background',\n isBackground: true,\n };\n };\n /**\n * Returns an auto generated schema based on data structure.\n * @memberof canvasDatagrid\n * @name getSchemaFromData\n * @method\n * @tutorial schema\n * @returns {schema} schema A schema based on the first item in the data array.\n */\n self.getSchemaFromData = function (d) {\n d = d || self.originalData;\n return Object.keys(d[0] || { ' ': '' }).map(function mapEachSchemaColumn(\n key,\n index,\n ) {\n var type = self.getBestGuessDataType(key, d),\n i = {\n name: key,\n title: isNaN(parseInt(key, 10))\n ? key\n : self.integerToAlpha(key).toUpperCase(),\n index: index,\n columnIndex: index,\n type: type,\n filter: self.filter(type),\n };\n if (\n self.storedSettings &&\n self.storedSettings.visibility &&\n self.storedSettings.visibility[i.name] !== undefined\n ) {\n i.hidden = !self.storedSettings.visibility[i.name];\n }\n return i;\n });\n };\n /**\n * Clears the change log grid.changes that keeps track of changes to the data set.\n * This does not undo changes or alter data it is simply a convince array to keep\n * track of changes made to the data since last this method was called.\n * @memberof canvasDatagrid\n * @name clearChangeLog\n * @method\n */\n self.clearChangeLog = function () {\n self.changes = [];\n };\n /**\n * Returns the maximum text width for a given column by column name.\n * @memberof canvasDatagrid\n * @name findColumnMaxTextLength\n * @method\n * @returns {number} The number of pixels wide the maximum width value in the selected column.\n * @param {string} name The name of the column to calculate the value's width of.\n */\n self.findColumnMaxTextLength = function (name) {\n var m = -Infinity;\n if (name === 'cornerCell') {\n self.ctx.font = self.style.rowHeaderCellFont;\n return (\n self.ctx.measureText(\n (\n self.viewData.length + (self.attributes.showNewRow ? 1 : 0)\n ).toString(),\n ).width +\n self.style.autosizePadding +\n self.style.autosizeHeaderCellPadding +\n self.style.rowHeaderCellPaddingRight +\n self.style.rowHeaderCellPaddingLeft +\n (self.attributes.tree\n ? self.style.treeArrowWidth +\n self.style.treeArrowMarginLeft +\n self.style.treeArrowMarginRight\n : 0)\n );\n }\n var formatter = null;\n self.getSchema().forEach(function (col) {\n if (col.name !== name) {\n return;\n }\n self.ctx.font = self.style.columnHeaderCellFont;\n var t =\n self.ctx.measureText(col.title || col.name).width +\n self.style.columnHeaderCellPaddingRight +\n self.style.columnHeaderCellPaddingLeft +\n self.style.cellAutoResizePadding;\n m = t > m ? t : m;\n formatter = self.formatters[col.type];\n });\n self.viewData.forEach(function (row) {\n var text = row[name];\n if (formatter) {\n text = formatter({ cell: { value: text } });\n }\n self.ctx.font = self.style.cellFont;\n var t =\n self.ctx.measureText(text).width +\n self.style.cellPaddingRight +\n self.style.cellPaddingLeft +\n self.style.cellAutoResizePadding;\n m = t > m ? t : m;\n });\n return m;\n };\n /**\n * Gets the total width of all header columns.\n * @memberof canvasDatagrid\n * @name getHeaderWidth\n * @method\n */\n self.getHeaderWidth = function () {\n return self.getVisibleSchema().reduce(function (total, header) {\n return total + parseInt(header.width || self.style.cellWidth, 10);\n }, 0);\n };\n /**\n * Gets the height of a row by index.\n * @memberof canvasDatagrid\n * @name getRowHeight\n * @method\n * @param {number} rowIndex The row index to lookup.\n */\n self.getRowHeight = function (rowIndex) {\n return (self.sizes.rows[rowIndex] || self.style.cellHeight) * self.scale;\n };\n /**\n * Gets the width of a column by index.\n * @memberof canvasDatagrid\n * @name getColumnWidth\n * @method\n * @param {number} columnIndex The column index to lookup.\n */\n self.getColumnWidth = function (columnIndex) {\n const column = self.getSchema()[columnIndex] || {};\n const configuredWidth =\n (self.sizes.columns[columnIndex] ||\n column.width ||\n self.style.cellWidth) * self.scale;\n if (\n self.autoLastColumnWidth &&\n self.autoLastColumnWidth.index === columnIndex\n ) {\n return Math.max(configuredWidth, self.autoLastColumnWidth.width);\n }\n return configuredWidth;\n };\n self.getLastVisibleColumnIndex = function () {\n const schema = self.getSchema();\n const collapsedColumnGroups = self.getCollapsedColumnGroups();\n const isColumnCollapsed = (columnIndex) =>\n collapsedColumnGroups.some(\n (group) => columnIndex >= group.from && columnIndex <= group.to,\n );\n for (\n let viewIndex = self.orders.columns.length - 1;\n viewIndex >= 0;\n viewIndex -= 1\n ) {\n const schemaIndex = self.orders.columns[viewIndex];\n if (\n schema[schemaIndex] &&\n !schema[schemaIndex].hidden &&\n !isColumnCollapsed(viewIndex)\n ) {\n return schemaIndex;\n }\n }\n return -1;\n };\n self.formatters.string = function cellFormatterString(e) {\n return e.cell.value !== undefined ? e.cell.value : '';\n };\n self.formatters.rowHeaderCell = self.formatters.string;\n self.formatters.headerCell = self.formatters.string;\n self.formatters.number = self.formatters.string;\n self.formatters.int = self.formatters.string;\n self.formatters.html = self.formatters.string;\n self.sorters.string = function (columnName, direction) {\n var asc = direction === 'asc';\n // Coerce every value to a string so numbers, booleans and blanks sort\n // consistently (blanks first ascending, last descending) (#256, #548).\n function toComparable(value) {\n return value === undefined || value === null ? '' : String(value);\n }\n return function (a, b) {\n const aValue = toComparable(a[columnName]);\n const bValue = toComparable(b[columnName]);\n return asc ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue);\n };\n };\n self.sorters.number = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n if (asc) {\n return a[columnName] - b[columnName];\n }\n return b[columnName] - a[columnName];\n };\n };\n self.sorters.date = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n if (asc) {\n return (\n new Date(a[columnName]).getTime() - new Date(b[columnName]).getTime()\n );\n }\n return (\n new Date(b[columnName]).getTime() - new Date(a[columnName]).getTime()\n );\n };\n };\n}\n","'use strict';\n\n/**\n * Merge a new hidden row range into existed ranges array\n * @param {any[]} hiddenRowRanges tuples: Array<[bgeinRowIndex, endRowIndex]>\n * @param {number[]} newRange tuple: [beginRowIndex, endRowIndex]\n * @returns {boolean}\n */\nconst mergeHiddenRowRanges = function (hiddenRowRanges, newRange) {\n const [beginRowIndex, endRowIndex] = newRange;\n if (endRowIndex < beginRowIndex) return false;\n let inserted = false;\n for (let i = 0; i < hiddenRowRanges.length; i++) {\n const range = hiddenRowRanges[i];\n if (beginRowIndex > range[1] + 1) continue;\n if (beginRowIndex <= range[0] && endRowIndex >= range[0]) {\n hiddenRowRanges[i] = [beginRowIndex, Math.max(endRowIndex, range[1])];\n inserted = true;\n break;\n }\n if (beginRowIndex >= range[0]) {\n hiddenRowRanges[i] = [range[0], Math.max(endRowIndex, range[1])];\n inserted = true;\n break;\n }\n }\n if (!inserted) hiddenRowRanges.push([beginRowIndex, endRowIndex]);\n // merge intersections after sorting ranges\n hiddenRowRanges.sort((a, b) => a[0] - b[0]);\n for (let i = 0; i < hiddenRowRanges.length - 1; i++) {\n const range = hiddenRowRanges[i];\n const nextRange = hiddenRowRanges[i + 1];\n if (nextRange[0] <= range[1] + 1) {\n hiddenRowRanges[i] = [range[0], Math.max(range[1], nextRange[1])];\n hiddenRowRanges.splice(i + 1, 1);\n i--;\n }\n }\n return true;\n};\n\nexport { mergeHiddenRowRanges };\n"],"names":["defaults","self","attributes","styles","SelectionType","swapProps","obj","prop0","prop1","t","normalizeSelection","sel","type","endRow","startRow","endColumn","startColumn","isSameCellsBlock","block0","block1","mergeCellsIntoRowsOrColumns","cells","rowsOrColumns","mergeSelections","sel0","sel1","horizontalConcat","verticalConcat","Object","assign","Math","min","max","intersection","getIntersection","removePartOfRowsSelection","selection","remove","removePartOfColumnsSelection","removePartOfCellsSelection","intersect","result","minStartRow","maxEndRow","maxEndColumn","push","addIntoSelections","selections","add","context","i","length","parts","splice","Array","isArray","cleanupSelections","selectedAllRows","rows","selectedAllColumns","columns","isChanged0","isChanged1","isRowsSelection","merged","j","newMerged","removeFromSelections","unselectedAllRows","unselectedAllColumns","unshift","isChanged","newSelection","unselect","select","filter","unsel","endMerge","newSel","ptr","isRowSelected","rowIndex","isCellSelected","columnIndex","getSelectionStateFromCells","range","areAllCellsSelected","iTo","matched0","matched1","countOfColumns","fill","map","test","value","row","columnOffset","columnOffsetEnd","getSelectedContiguousColumns","allowImpurity","matched","newMatched","getSelectedContiguousRows","getSelectionBounds","top","Infinity","bottom","left","right","module","exports","e","o","a","r","l","call","m","c","d","defineProperty","enumerable","get","Symbol","toStringTag","__esModule","create","bind","n","default","prototype","hasOwnProperty","p","s","keys","reduce","concat","indexOf","key","modifier","legacyModifier","whiteSpace","navigation","editing","ui","device","imeCompositionKeys","koreanSpecific","japaneseSpecific","commonFunction","multimedia","multimediaNumpad","audio","speech","application","browser","mobilePhone","tv","mediaControls","IGNORE_NODETYPES","sanitizeElementData","element","elementData","nodeType","innerText","data","String","replace","trim","parseData","mimeType","trs","DOMParser","parseFromString","querySelectorAll","tr","childNode","childNodes","includes","col","parseHtmlTable","doc","querySelector","split","item","parseHtmlText","parseText","htmlSafe","createTextString","selectedData","isNeat","values","join","deduceColTypeFromData","colNum","len","isColEmpty","cellData","val","Number","isFinite","webComponent","typeMap","component","prop","nextLetterCap","forEach","char","toUpperCase","cust","toLowerCase","applyComponentStyle","supressChangeAndDrawEvents","intf","isComponent","cStyle","window","getComputedStyle","tagName","canvas","defs","computedStyle","def","getPropertyValue","hyphenateProperty","setStyleProperty","dispatchEvent","requestAnimationFrame","resize","style","strData","JSON","parse","Error","schema","strSchema","number","strNum","parseInt","isNaN","boolean","strBool","string","str","getObservableAttributes","attrs","attr","disconnectedCallback","this","connected","observer","disconnect","undefined","unobserveResizeTargets","connectedCallback","parentDOMNode","innerHTML","appendChild","observe","observeResizeTargets","adoptedCallback","attributeChangedCallback","attrName","oldVal","newVal","tfn","dataType","base","handler","Function","err","console","warn","addEventListener","name","MutationObserver","mutations","checkInnerHTML","checkStyle","mutation","attributeName","target","nodeName","parentNode","addedNodes","characterData","childList","subtree","document","el","modules","perfCounters","cachedImagesDrawn","drawCount","perfWindowSize","entityCount","scrollDebugCounters","touchPPSCounters","fillArray","low","high","step","x","drawHtml","cell","img","v","formattedValue","cacheKey","toString","round","canvasOffsetLeft","y","canvasOffsetTop","htmlImageCache","height","width","complete","ctx","drawImage","Image","onload","loaded","html","draw","src","btoa","drawLines","coords","beginPath","moveTo","lineTo","stroke","drawGroupHandle","collapsed","fillRect","strokeRect","cx","cy","drawUnhideIndicator","size","dir","active","minPadding","maxPadding","longEdge","median","halfLongEdge","x0","y0","borderCoords","strokeStyle","unhideIndicatorBorderColor","lineWidth","fillStyle","unhideIndicatorBackgroundColor","offset","unhideIndicatorColor","drawCellTreeIcon","tree","rowTree","parentCount","iconSize","cellTreeIconWidth","scale","marginTop","cellTreeIconMarginTop","marginRight","cellTreeIconMarginRight","marginLeft","cellTreeIconMarginLeft","paddingLeft","icon","oldFillStyle","oldStrokeStyle","hovered","hovers","onCellTreeIcon","cellTreeIconHoverFillColor","cellTreeIconFillColor","cellTreeIconBorderColor","rect","expand","cellTreeIconLineWidth","cellTreeIconLineColor","radiusRect","w","h","radius","b","quadraticCurveTo","fillText","text","clipFrozenArea","mode","lastFrozenColumnPixel","lastFrozenRowPixel","clip","fillHandle","selectionHandleType","arc","PI","fillCircle","strokeHandle","strokeCircle","addBorderLine","pos","getFrozenColumnsWidth","getSchema","frozenColumn","collapsedGroups","getCollapsedColumnGroups","hidden","findIndex","group","from","to","getColumnWidth","internal","isChildGrid","parentGrid","visible","checkScrollHeight","treeGrid","rowOpen","rowHeight","cornerCell","rowData","aCell","drawCorner","en","viewData","bc","gridBorderCollapse","selectionBorders","moveBorders","selectionHandles","rowHeaders","u","currentCell","columnHeaderCellHeight","getColumnHeaderCellHeight","rowHeaderCellWidth","getRowHeaderCellWidth","rowGroupsAreaWidth","getRowGroupAreaWidth","columnGroupsAreaHeight","getColumnGroupAreaHeight","rowGroupsRectInfo","rowGroupsFrozenInfo","columnGroupsRectInfo","collapsedColumnGroups","collapsedRowGroups","getCollapsedRowGroups","cellHeight","currentRowIndexOffset","rowIndexOffsetByHiddenRows","hiddenRowRanges","plus","sort","performance","now","visibleRowHeights","orders","createRowOrders","save","visibleRows","visibleCells","visibleGroups","visibleUnhideIndicators","offsetTop","offsetLeft","firstRowIndexOffset","shift","initDraw","clearRect","gridBackgroundColor","translate","ln","frozenRow","scrollBox","scrollLeft","scrollPixelLeft","cellBorderWidth","drawRow","allowFreezingRows","frozenMarkerWidth","frozenMarkerBorderWidth","drawFrozenRows","columnOrderIndex","rowOrderIndex","headerIndex","g","snapToRow","scrollTop","scrollPixelTop","scrollIndexTop","scrollIndexBottom","scrollPixelBottom","cellTree","hide","showNewRow","showRowHeaders","scrollIndexLeft","isColumnCollapsedByGroup","drawCell","newRow","restore","drawRows","cl","activeCell","selectionMode","activeCellOverlayBorderWidth","activeCellOverlayBorderColor","getHeaderWidth","drawActiveCell","columnHeaderCell","header","nonFrozenHeaderWidth","drawHeaderColumnRange","start","end","title","cellWidth","index","order","rArgs","rhIndex","filteredRowNumber","getBoundRowIndexFromViewRowIndex","originalData","rowHeaderValue","hasActiveFilters","hasCollapsedRowGroup","rowHeaderCell","headerDescription","sizes","openChildren","drawRowHeader","showColumnHeaders","columnHeaderCellBorderWidth","scrollBarWidth","isColumnHeaderCell","isColumnHeaderCellCap","endCap","drawHeaders","my","mx","xHover","yHover","allowFreezingColumns","freezeMarkerPosition","dragMode","frozenMarkerColor","frozenMarkerBorderColor","frozenMarkerHoverColor","frozenMarkerHeaderColor","frozenMarkerHoverBorderColor","dragStartObject","frozenMarkerActiveColor","frozenMarkerActiveBorderColor","posX","nearCell","getCellAt","isGrab","frozenMarkerActiveHeaderColor","posY","drawFrozenMarkers","mobile","allowMovingSelection","editable","selectionHandleBorderWidth","selectionHandleBorderColor","selectionHandleColor","hw","selectionHandleSize","br","tl","bl","addselectionHandle","az","touchSelectHandleZone","ax","ay","reorderObject","dragOffset","reorderMarkerBackgroundColor","reorderMarkerBorderWidth","reorderMarkerBorderColor","getSelectedRowsHeight","reorderMarkerIndexBorderWidth","reorderMarkerIndexBorderColor","reorderTarget","sortRowIndex","getSelectedColumnsWidth","isColumnSelected","sortColumnIndex","drawReorderMarkers","movingSelection","moveOverlayBorderWidth","moveOverlayBorderColor","setLineDash","moveOverlayBorderSegments","resizeAfterDragged","draggingItem","pendingDragResize","resizingRow","resizeMarkerSize","minX","dragStart","resizingStartingWidth","minColumnWidth","minY","resizingStartingHeight","minRowHeight","resizeMarkerColor","drawResizeMarkers","gridBorderWidth","gridBorderColor","dsb","fillOverlay","handle","selectionOverlayBorderWidth","selectionOverlayBorderColor","snapTo","overlay","toX","toY","snap","cursorX","direction","cursorY","fillOverlayBorderColor","fillOverlayBorderWidth","drawFillOverlay","drawSelectionBorders","entities","scrollBarBoxMargin","scrollBarBorderColor","scrollBarBorderWidth","horizontalBox","scrollCache","horizontalBar","scrollBoxWidth","scrollWidth","verticalBox","verticalBar","scrollBoxHeight","scrollHeight","horizontalBarVisible","scrollBarBackgroundColor","scrollBarBoxColor","horizontalBoxVisible","scrollBarActiveColor","scrollBarBoxBorderRadius","verticalBarVisible","verticalBoxVisible","scrollBarCornerBorderColor","scrollBarCornerBackgroundColor","corner","frozenColumnsWidth","frozenRowsHeight","onTheLeft","columnGroupIndicatorPosition","onTheTop","rowGroupIndicatorPosition","groupingAreaBackgroundColor","groupedColumns","groups","columnGroupRowHeight","toggleHandleSize","toggleHandlePadding","topY","centerY","bottomY","leftmostX","drawGroupHandleAtX","pushToVisibleGroups","leftX","rightX","x2","y2","crossTheFrozen","notInFrozen","colIndex","groupIndicatorColor","groupIndicatorBackgroundColor","containsBegining","containsEnd","rightCompare","compareX","minLeftX","lineCoords","groupedRows","colWidth","rowGroupColumnWidth","centerX","topmostY","drawGroupHandleAtY","bottomCompare","compareY","minTopY","drawGroupArea","showPerformance","debug","pop","font","debugFont","perf","toFixed","perfDelta","htmlImages","startScale","scaleDelta","zoomDeltaStart","touchLength","touches","touchPosition","touchPosition1","scrollIndex","scrollPixel","canvasOffset","touchDelta","touchAnimateTo","scrollAnimation","touchPPS","xPPS","yPPS","touchPPST","xPPST","yPPST","touchDuration","pointerLockPosition","mouse","touch","touchStart","hasFocus","dragContext","textAlign","debugBackgroundColor","debugColor","px","py","debugPerfChartBackground","debugScrollHeightColor","debugScrollWidthColor","debugPerformanceColor","debugEntitiesColor","debugTouchPPSXColor","debugTouchPPSYColor","dpl","apply","perfArr","arrIndex","color","useAbs","abs","drawPerfLine","debugPerfChartTextColor","drawPerfLines","createBorderOverlayArray","drawArray","propPrefix","offsetPoint","selectionBorder","isSelected","lastColumnIndex","lastRowIndex","isRowHeader","isHeader","isActiveRowHeader","cellGridAttributes","cellStyle","isCorner","isColumnHeader","isFilterable","filterable","wrap","cellWhiteSpace","selected","hoverMode","openedFilter","selectedFilterButton","rawValue","isGrid","f","formatters","orderByArrowSize","treeArrowSize","ev","activeHeader","viewColumnIndex","fontHeight","horizontalAlignment","verticalAlignment","paddingTop","paddingRight","paddingBottom","lineHeight","cellLineHeight","lineSpacing","cellLineSpacing","offsetWidth","offsetHeight","offsetParent","viewRowIndex","boundRowIndex","boundColumnIndex","getBoundColumnIndexFromViewColumnIndex","isNormal","gridId","isRowTree","rowTreeColIndex","isColumnTree","calculatedLineHeight","paddedWidth","paddedHeight","userHeight","userWidth","saveRowGroupsRectInfo","saveColumnGroupsRectInfo","cellHeightWithChildGrid","cellWidthWithChildGrid","mt","treeArrowMarginTop","mr","treeArrowMarginRight","ml","treeArrowMarginLeft","aw","treeArrowWidth","ah","treeArrowHeight","treeArrowColor","treeArrowBorderColor","drawTreeArrow","showRowNumbers","childGrids","saveAppearance","createGrid","cellGridHeight","grid","orderBy","columnHeaderOrderByArrowMarginTop","columnHeaderOrderByArrowMarginLeft","columnHeaderOrderByArrowMarginRight","columnHeaderOrderByArrowWidth","columnHeaderOrderByArrowHeight","columnHeaderOrderByArrowColor","columnHeaderOrderByArrowBorderColor","orderDirection","drawOrderByArrow","orderByArrowWidth","columnFilters","filterTextPrefix","getScaledFont","splitChar","lines","word","elWidth","plWidth","clippedVal","previousLine","words","textHeight","autoResize","autoResizeRows","et","ellipsisText","line","cHeight","measureText","curSplitChar","measure","arr","originText","stepLength","substr","wrapText","treeCellPadding","isDrawText","ll","textBlockHeight","vPos","hPos","stringify","pw","idx","idx_ord","drawText","selectionBorderTop","selectionBorderRight","selectionHandle","selectionBorderLeft","selectionBorderBottom","selectionHandleBehavior","createHandlesOverlayArray","moveOffset","filterButtonWidth","filterButtonHeight","filterButtonBorderColor","filterButtonBackgroundColor","filterButtonActiveBackgroundColor","onFilterButton","filterButtonHoverBackgroundColor","filterButtonBorderRadius","filterButtonArrowHeight","filterButtonArrowWidth","filterButtonArrowColor","filterButtonArrowBorderColor","drawFilterButtonArrow","drawFilterButton","isSorting","orderings","showRowNumberGaps","previousRowNumber","hasRowGap","find","beginRowIndex","endRowIndex","barHeight","rowHeaderCellRowNumberGapHeight","barColor","rowHeaderCellRowNumberGapColor","showUnhideColumnsIndicator","unhideIndicator","unhideIndicatorSize","cellX","isActive","orderIndex","orderIndex0","orderIndex1","isHiddenColumn","drawIndicator","iconsWidth","lineX0","lineX1","orderIndexPtr","prevColumnIndex","nextColumnIndex","showUnhideRowsIndicator","cellY","topIndicators","bottomIndicators","it","indicatorY","treeHeight","rowSansTreeHeight","trees","scrollIndexRight","scrollPixelRight","wheeling","stopPropagation","fn","events","removeEventListener","sfn","defaultPrevented","preventDefault","getRatio","maxPixelRatio","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","refreshScrollCacheX","frozenWidth","accumulator","column","schemaIndex","columnWidth","isColumnCollapsed","drawAfterResize","dims","vb","nb","co","isScrollBoxCorner","sbw","ratio","bm","cellBorder","columnHeaderCellBorder","dataHeight","dataWidth","topGroupAreaHeight","leftGroupAreaWidth","ch","autoLastColumnWidth","setCanvasSize","args","setScrollBoxSize","checkScrollBoxVisibility","fillLastColumn","getLastVisibleColumnIndex","availableWidth","widthBoxRatio","heightBoxRatio","scrollBarBoxMinSize","scrollBarBoxWidth","bar","box","page","pageUpDownOverlap","newWidth","newHeight","resizeEditInput","scroll","capped","autoSizeCapped","overflowX","overflowY","maxCanvasSize","dim","appliedInlineStyles","parentNodeStyle","dontDraw","floor","ellipsisCache","mousemove","overridePos","contextMenu","input","which","stopFreezeMove","mouseup","getLayerPos","dragBounds","sBounds","delta","ctrl","ctrlKey","metaKey","persistantSelectionMode","singleSelectionMode","disallowVerticalAutoScroll","disallowHorizontalAutoScroll","NativeEvent","previousCell","clearTimeout","scrollTimer","isInGrid","rowBoundaryCrossed","columnBoundaryCrossed","cellBoundaryCrossed","prefix","cursorGrab","indicator","getUnhideIndicator","cursor","dragItem","pc","rc","rx","ry","selecting","shiftKey","isMultiColumnsSelected","isMultiRowsSelected","ignoreNextClick","contextmenuEvent","toggleCollapseTree","dragAddToSelection","selectCell","unselectCell","selectionBounds","clearSelections","selectRow","selectArea","movingSelectionHandle","autoScrollOnMousemove","movedVertically","autoScrollMargin","movedHorizontally","autoScrollZone","getColumnGroupAt","getRowGroupAt","click","startingBounds","checkSelectionChange","sb","getContextOfSelectionEvent","endEdit","unhideColumns","unhideRows","toggleGroup","setStorageData","refresh","leftOffset","topOffset","xInGrid","yInGrid","setActiveCell","columnHeaderClickBehavior","selectAll","treeArrowClickRadius","toggleTree","dragResizeColumn","resizingColumn","resizeEventDetails","dispatchResizeRow","clientX","clientY","dragResizeApply","resizeScrollZone","resizeChildGrids","globalRowResize","stopDragResize","event","hasMoved","dragItemIsSelected","fitSelectedColumns","fitSelectedRows","scrollGrid","scrollPointerLock","scrollStartMode","movementX","movementY","scrollMode","scrollStart","scrollModes","setTimeout","scrollRepeatRate","selectionScrollIncrement","stopScrollGrid","exitPointerLock","dragReorder","columReorder","rowReorder","allowColumnReordering","allowRowReordering","selectColumn","source","reorderDeadZone","getVisibleCellByIndex","stopDragReorder","originalIndex","targetIndex","orderLists","indexName","selectedIndexes","getRowSelectionStates","sortColumnIndices","selectedColumnIndices","deleteCount","selectColumnViewIndexes","getRowViewIndexesFromSelection","moveSelection","dragMove","stopDragMove","freezeMove","startFreezeMove","mousedown","lastMouseDownTarget","button","move","freeze","selectionHandleMove","onUnhideIndicator","requestPointerLock","stopSelectionHandleMove","cloneSelections","dragging","allowColumnSelection","mouseupOutsideGrid","controlInput","focus","getAdjacentCells","first","last","keydown","adjacentCells","cols","keepFocusOnMouseOut","isPrintableKeyEvent","beginEditAt","selectNone","deleteSelectedData","isArrowKey","shrinkOrExpandSelections","scrollIntoView","selectionFollowsActiveCell","keyup","keypress","dblclick","fitColumnToValues","autosize","cellTreeExpandCollapse","scrollWheel","deltaX","deltaY","deltaMode","touchHaltAnimation","scrollTo","pasteData","pasteValue","startRowIndex","startColIndex","minRowsLength","minColumnsLength","some","expression","isSupportedHtml","columnsLength","forEachSelectedCell","colName","insert","startColumnIndex","reverseRows","reverseColumns","alwaysFilling","affectedCells","columnName","dispatchDataChanged","expandGridForInsert","requiredRowCount","requiredColumnCount","changed","missingColumns","lastColumn","Date","validateColumn","applyDefaultValue","missingRows","setFilter","rowsLength","fillCellCallback","filledCells","allowGridExpandOnPaste","rowPosReal","rowDataPos","fillingRow","rowPosition","realRowIndex","cellsLength","existingRowData","newRowData","fillArgs","rowOffset","reversed","isFillingRow","fillingRowPosition","fillingRowLength","colPosReal","cellDataPos","fillingColumn","existingCellData","newCellData","isFillingColumn","fillingColumnPosition","fillingColumnLength","boundRowIndexMap","getNextVisibleColumnIndex","visibleColumnIndex","getVisibleSchema","getVisibleColumnIndexOf","getSelectionIndex","bounds","rowLength","columnLength","paste","clipboardItems","Map","clipboardData","items","supportedMimeTypes","pasteableItems","selectionIndex","itemToPaste","pasteType","getAsString","cut","copySelectedCellsToClipboard","apiCompatibleCells","clearSelectedCells","copy","clippingRect","getClippingRect","isInSelectionBounds","lastInBoundsLocation","dx","dy","boundsOld","isVertical","isHorizontal","reverseVertically","reverseHorizontally","touchTimerMs","touchMoving","touchScrollTimeout","animationFrames","getTouchPos","touchIndex","getBoundingClientRect","easingFunctions","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easing","touchEasingMethod","calculatePPSTimed","touchSigmaTimed","calculatePPS","touchSigma","touchEndAnimation","touchReleaseAnimationDurationMs","stopAnimation","touchEditCell","touchstart","changedTouches","startingCell","disposeContextMenu","clearInterval","calculatePPSTimer","touchContextTimeout","touchStartEvent","zoomAltered","touchStart1","touchScrollStart","touchContextMenuTimeMs","setInterval","touchEndEvents","body","touchmove","passive","touchend","touchcancel","touchSelect","handleType","touchSelecting","rw","rScrollZone","lScrollZone","bScrollZone","tScrollZone","t1","t2","touchDeadZone","touchZoomSensitivity","touchZoomMin","touchZoomMax","selectionScrollZone","touchScroll","startingCellStyle","touchMove","dz","touchReleaseAcceleration","scrollAnimationPPSThreshold","ctor","warnedForObsoleteSelections","treeGridAttributes","storageName","invalidSearchExpClass","localStyleLibraryStorageKey","sortFunction","filters","tempSchema","columnTreeRowStartIndex","columnTreeRowEndIndex","origin","sorters","parsers","schemaHashes","changes","componentL1Events","eventNames","has","allowGroupingColumns","allowGroupingRows","groupIndex","matchedGroup","allGroups","gi","nextCollapsed","isNewGroupRangeValid","groupsArray","gIndex","visibility","localStorage","setItem","createColumnOrders","defaultValue","createNewRowData","getSchemaNameHash","getFilteredAndSortedViewData","newViewData","originalRowIndex","ranges","countOfRows","headerName","filterText","entries","getHeaderByName","currentFilterFunction","filterFrozenRows","newLen","from2","to2","slice","sortFn","rowA","rowB","rowIndexB","sortFrozenRows","_row","getBestGuessDataType","drawChildGrids","gridKey","setTimer","setDefaults","obj1","obj2","setAttributes","setStyle","findColumnMaxTextLength","dispose","disposed","child","resizeObserver","resizeObserverFrame","cancelAnimationFrame","removeChild","eventParent","tryLoadStoredSettings","reloadStoredValues","storedSettings","tempData","collapsedCount","ctr","ri","lastchild","orTree","ctc","ci","_ri","_ci","si","otherData","k","tempRow","colTrees","collapsedColCount","initCellTreeSettings","invalidRowTree","rt","begin","parentIndex","columnTree","dataColumnLength","invalidColumnTree","ct","getDomRoot","shadowRoot","host","parseFont","fontStyle","exec","parseFloat","unit","getFontName","getFontHeight","styleKey","parseStyleValue","initProp","propName","getStyleProperty","styleKeys","supressDrawAndEvent","isDim","dehyphenateProperty","getItem","message","init","initialized","publicStyleKeyIntf","initScrollBox","setDom","ie","navigator","userAgent","edge","webKit","moz","blankValues","cursorGrabing","cursorGrabbing","appendTo","clearChangeLog","gotoCell","gotoRow","addButton","toggleCellCollapseTree","expandCollapseCellTree","getRowHeight","findColumnScrollLeft","findRowScrollTop","groupColumns","groupRows","removeGroupColumns","removeGroupRows","toggleGroupColumns","toggleGroupRows","getGroupsColumnBelongsTo","getGroupsRowBelongsTo","isCellVisible","isRowVisible","isColumnVisible","clipElement","getSchemaFromData","expandTree","collapseTree","insertRow","deleteRow","addRow","insertColumn","deleteColumn","addColumn","setRowHeight","setColumnWidth","resetColumnWidths","resetRowHeights","assertPxColor","clearPxColorAssertions","integerToAlpha","hideColumns","hideRows","addStyleKeyIfNoneExists","DOMStyles","set","valueObject","filterFor","blanksText","filterRegExp","pattern","flags","substring","flagLength","invalidFilterRegEx","RegExp","toLocaleUpperCase","numericValue","numericFilter","textContent","blur","TypeError","currentCursor","getObsoleteSelectionMatrix","eventName","RangeError","getSelectedData","getTypes","parseInnerHtml","callback","etl","autoGenerateSchema","columnCount","autoResizeColumns","sHeight","sWidth","setScrollTop","preventScrollEvent","moveButtonPos","setScrollLeft","supressDrawEvent","iterateSelectedCells","iterator","expandToRow","states","orderedSchema","getSchemaOrderByViewIndex","row2","rowState","col2","fromIndex","selectionCache","selectionCacheWidth","selectionCacheHeight","otherSelections","_","columnOrderIndexes","columnSchema","allowOnlyOneRow","viewRowIndexes","canSelectionsBeCopied","baseType","areSelectionsComplex","triggerEvent","dispatchSelectionChangedEvent","suppressEvent","unselectRows","offsetX","offsetY","moveSelections","selectionList","getSelectedCells","clonedSelections","sanitized","sanitizeSelectionBounds","viewDataLength","schemaLength","hasData","selectedCells","areSelectionsNeat","textString","htmlString","createHTMLString","copiedData","setData","hasCustomWidth","addCol","de","dragObject","st","state","firstRow","replaceAllSelections","newSelections","viewIndexes","keyEvent","keyInfo","ArrowLeft","isLeft","ArrowUp","isUp","ArrowRight","isRight","ArrowDown","isDown","originalColumnIndex","matchedSelections","isTopBorder","isBottomBorder","isLeftBorder","isRightBorder","maxRow","maxColumn","afterChange","zIndexTop","hoverScrollTimeout","autoCompleteContext","applyContextItemStyle","contextItemContainer","createInlineStyle","createContextMenu","parentContextMenu","loc","container","createElement","upArrow","downArrow","children","selectedIndex","checkArrowVisibility","startHoverScroll","contextHoverScrollAmount","contextHoverScrollRateMs","endHoverScroll","scrollOffset","contextMenuZIndex","childMenuArrow","removeChildContext","relatedTarget","contains","setAttribute","contextAddCallback","getAttribute","cPos","childContextMenuMarginLeft","childContextMenuMarginTop","createChildContext","addContent","content","childContextMenuArrowHTML","addItem","opacity","position","contextMenuArrowColor","zIndex","inputDropdown","maxHeight","innerHeight","autocompleteBottomMargin","minWidth","contextMenuArrowUpHTML","contextMenuArrowDownHTML","display","timer","animationDurationShowContextMenu","unfade","contextMenuWindowMargin","innerWidth","clickIndex","Event","animationDurationHideContextMenu","createFilterContextMenuItems","iRect","filterContainer","filterLabel","filterAutoCompleteButton","filterInput","checkRegExpErrorState","background","contextFilterInputBackground","contextFilterInputColor","contextFilterInvalidRegExpBackground","contextFilterInvalidRegExpColor","createAutoCompleteContext","count","blanksItem","autoCompleteItems","cellValue","maxAutoCompleteItems","disposeAutocomplete","onclick","filterOptionText","contextFilterButtonHTML","cf","removeFilterOptionText","contextMenuOpenedAt","childGrid","childGridsOfParent","nodeA","nodeB","x1","y1","node","newX1","newY1","createDisposeEvent","contextPosition","getColumnsMap","_col","isNormalCell","isBackground","isScrollBar","showFilter","showCopy","copyText","execCommand","showPaste","clipBoardData","pasteText","showColumnSelector","columnSelectorText","toggleColumnVisibility","columnSelectorHiddenText","columnSelectorVisibleText","contiguousColumns","hideColumnText","showClearSettingsOption","clearSettingsOptionText","allowSorting","showOrderByOption","showOrderByOptionTextAsc","showOrderByOptionTextDesc","boundRowIndexes","showHideRow","showHideRows","groupAreaHeight","groupAreaWidth","setCollapseStateForAllGroups","showRemoveAllGroupColumns","showExpandAllGroupColumns","showCollapseAllGroupColumns","showRemoveAllGroupRows","showExpandAllGroupRows","showCollapseAllGroupRows","canGroupByColumns","canUngroupColumns","canGroupByRows","canUngroupRows","groupIndexes","groupTitles","groupNames","showGroupColumns","cell0","cell1","formatArgs","showRemoveGroupColumns","rangeTitle","showGroupRows","showRemoveGroupRows","addDefaultContextMenuItem","contextMenuMarginLeft","contextMenuMarginTop","mobileContextMenuMargin","filterButtonMenuOffsetTop","createButton","imgSrc","wrapper","buttonArrow","buttonIcon","buttonZIndex","buttonMenu","applyButtonStyle","buttonArrowDownHTML","maxWidth","toggleButtonMenu","disposeButtonMenu","createItems","menuItemContainer","buttonMenuItemContainer","applyButtonMenuItemStyle","disposeButton","buttonMenuWindowMargin","createButtonMenu","keyCode","attachButton","ele","boundingRect","eleRect","clipRect","parentRect","scrollingElement","editCell","borderWidth","mobileEditInputHeight","groupAreaOffsetY","groupAreaOffsetX","cellPaddingLeft","ignoreScrollOffset","calculatedTree","isTree","initResizeObserver","ResizeObserver","observedSizes","entry","contentRect","abort","isNewRow","newValue","oldValue","changeIndex","aborted","inEnterMode","enumItems","enu","option","valueInEnum","multiLine","showPicker","editCellZIndex","fontSize","editCellFontSize","shouldClearCellValue","nx","ny","altKey","nextRowIndex","className","css","padding","buttonPadding","borderStyle","borderColor","buttonBorderColor","buttonBackgroundColor","userSelect","buttonHoverBackgroundColor","buttonActiveBorderColor","buttonActiveBackgroundColor","verticalAlign","buttonArrowColor","fontWeight","fontFamily","contextMenuFontFamily","contextMenuFontSize","margin","contextMenuItemMargin","borderRadius","contextMenuItemBorderRadius","contextMenuHoverBackground","contextMenuHoverColor","contextMenuLabelMargin","contextMenuLabelDisplay","contextMenuLabelMinWidth","contextMenuLabelMaxWidth","contextMenuBackground","contextMenuColor","border","contextMenuBorder","contextMenuPadding","contextMenuBorderRadius","contextMenuOpacity","overflow","contextMenuCursor","contextFilterInputBorder","contextFilterInputBorderRadius","contextFilterInputFontFamily","contextFilterInputFontSize","contextFilterButtonBorder","contextFilterButtonBorderRadius","contextMenuFilterButtonFontFamily","contextMenuFilterButtonFontSize","cssFloat","childContextMenuArrowColor","contextMenuChildArrowFontSize","boxSizing","outline","mobileEditFontFamily","mobileEditFontSize","editCellBorder","editCellColor","editCellBackgroundColor","appearance","webkitAppearance","mozAppearance","editCellPaddingLeft","editCellFontFamily","boxShadow","editCellBoxShadow","contextMenuFilterInvalidExpresion","onblur","parentIsCanvas","getContext","textBaseline","addGroup","groupFor","removeGroup","ordA","charCodeAt","fromCharCode","showFilterInCell","targetX","targetY","sbh","treeData","details","trArgs","treeGridHeight","beginColumnOrderIndex","endColumnOrderIndex","hiddenColumns","newRange","inserted","nextRange","mergeHiddenRowRanges","newSize","dontSetStorageData","sorter","firstColumnName","lastColumnName","firstOne","lastOne","error","rowIndexFrom","rowIndexTo","isInteger","dataLength","xi","visibleSchema","selectionLength","maxRowLength","minXi","yi","lastSourceIndex","cidx","indicators","useTouchScrollZones","getBorder","entitiy","borderResizeZone","moveBorder","tsz","touchScrollZone","moveMode","borderDragBehavior","xBorderBehavior","yBorderBehavior","isVerticalScrollBar","isHorizontalScrollBar","allowColumnResize","allowColumnResizeFromCell","allowRowHeaderResize","allowRowResize","allowRowResizeFromCell","columnGrabZoneSize","rowGrabZoneSize","rowHeaderCellFont","autosizePadding","autosizeHeaderCellPadding","rowHeaderCellPaddingRight","rowHeaderCellPaddingLeft","formatter","columnHeaderCellFont","columnHeaderCellPaddingRight","columnHeaderCellPaddingLeft","cellAutoResizePadding","cellFont","cellPaddingRight","total","configuredWidth","viewIndex","headerCell","int","asc","toComparable","aValue","bValue","localeCompare","date","getTime","Grid","Reflect","construct","HTMLElement","attachShadow","canvasDatagrid","tKeys","customElements","argKey","tKey","sKey","observedAttributes","define","require"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"canvas-datagrid.module.js","sources":["../lib/defaults.js","../lib/selections/util.js","../node_modules/is-printable-key-event/dist/index.js","../lib/events/util.js","../lib/main.js","../lib/component.js","../lib/draw.js","../lib/events/index.js","../lib/touch.js","../lib/intf.js","../lib/selections/index.js","../lib/contextMenu.js","../lib/button.js","../lib/dom.js","../lib/publicMethods.js","../lib/groups/util.js"],"sourcesContent":["/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n\n'use strict';\nexport default function (self) {\n self.defaults = {\n attributes: [\n ['allowColumnReordering', true],\n ['allowColumnSelection', true],\n ['allowColumnResize', true],\n ['allowColumnResizeFromCell', false],\n ['allowFreezingRows', false],\n ['allowFreezingColumns', false],\n ['allowMovingSelection', true],\n ['allowRowHeaderResize', true],\n ['allowRowReordering', false],\n ['allowRowResize', true],\n ['allowRowResizeFromCell', false],\n ['allowSorting', true],\n ['allowGroupingRows', true],\n ['allowGroupingColumns', true],\n ['allowGridExpandOnPaste', false],\n ['animationDurationShowContextMenu', 50],\n ['animationDurationHideContextMenu', 50],\n ['autoGenerateSchema', false],\n ['fillLastColumn', false],\n ['autoResizeColumns', false],\n ['autoResizeRows', false],\n ['autoScrollOnMousemove', false],\n ['autoScrollMargin', 5],\n ['allowShrinkingSelection', false],\n ['blanksText', '(Blanks)'],\n ['borderDragBehavior', 'none'],\n ['borderResizeZone', 10],\n ['clearCellsWhenShrinkingSelection', false],\n ['clearSettingsOptionText', 'Clear saved settings'],\n ['columnHeaderClickBehavior', 'sort'],\n ['columnSelectorHiddenText', ' '],\n ['columnSelectorText', 'Add/Remove columns'],\n ['columnSelectorVisibleText', '\\u2713'],\n ['contextHoverScrollAmount', 2],\n ['contextHoverScrollRateMs', 5],\n ['copyHeadersOnSelectAll', true],\n ['copyText', 'Copy'],\n ['debug', false],\n ['editable', true],\n ['ellipsisText', '...'],\n ['filterOptionText', 'Filter %s'],\n ['filterTextPrefix', '(filtered) '],\n ['filterFrozenRows', true],\n ['globalRowResize', false],\n ['hideColumnText', 'Hide %s'],\n ['showUnhideColumnsIndicator', false],\n ['showUnhideRowsIndicator', false],\n ['showHideRow', 'Hide row %s'],\n ['showHideRows', 'Hide rows %s'],\n ['hoverMode', 'cell'],\n ['keepFocusOnMouseOut', false],\n ['maxAutoCompleteItems', 200],\n ['multiLine', false],\n ['name', ''],\n ['pageUpDownOverlap', 1],\n ['pasteText', 'Paste'],\n ['persistantSelectionMode', false],\n ['removeFilterOptionText', 'Remove filter on %s'],\n ['reorderDeadZone', 3],\n ['resizeAfterDragged', false],\n ['resizeScrollZone', 20],\n ['rowGrabZoneSize', 5],\n ['columnGrabZoneSize', 30],\n ['saveAppearance', true],\n ['scrollAnimationPPSThreshold', 0.75],\n ['scrollPointerLock', false],\n ['scrollRepeatRate', 75],\n ['selectionFollowsActiveCell', false],\n ['selectionHandleBehavior', 'none'],\n ['selectionMode', 'cell'],\n ['selectionScrollIncrement', 20],\n ['selectionScrollZone', 20],\n ['showClearSettingsOption', true],\n ['showColumnHeaders', true],\n ['showColumnSelector', true],\n ['showCopy', false],\n ['showFilter', true],\n ['showFilterInCell', false],\n ['showNewRow', false],\n ['showOrderByOption', true],\n ['showOrderByOptionTextAsc', 'Order by %s ascending'],\n ['showOrderByOptionTextDesc', 'Order by %s descending'],\n //#region grouping\n ['showGroupColumns', 'Group columns %s'],\n ['showGroupRows', 'Group rows %s'],\n ['showRemoveGroupColumns', 'Remove group %s'],\n ['showRemoveGroupRows', 'Remove group %s'],\n ['showRemoveAllGroupColumns', 'Remove all column groups'],\n ['showRemoveAllGroupRows', 'Remove all row groups'],\n ['showExpandAllGroupColumns', 'Expand all column groups'],\n ['showExpandAllGroupRows', 'Expand all row groups'],\n ['showCollapseAllGroupColumns', 'Collapse all column groups'],\n ['showCollapseAllGroupRows', 'Collapse all row groups'],\n ['columnGroupIndicatorPosition', 'right'],\n ['rowGroupIndicatorPosition', 'bottom'],\n //#endregion grouping\n ['showPaste', false],\n ['showPerformance', false],\n ['showRowHeaders', true],\n ['showRowNumbers', true],\n ['showRowNumberGaps', true],\n ['singleSelectionMode', false],\n ['snapToRow', false],\n ['sortFrozenRows', true],\n ['touchContextMenuTimeMs', 800],\n ['touchDeadZone', 3],\n ['touchEasingMethod', 'easeOutQuad'],\n ['touchReleaseAcceleration', 1000],\n ['touchReleaseAnimationDurationMs', 2000],\n ['touchScrollZone', 20],\n ['touchSelectHandleZone', 20],\n ['touchZoomSensitivity', 0.005],\n ['touchZoomMin', 0.5],\n ['touchZoomMax', 1.75],\n ['maxPixelRatio', 2],\n ['maxCanvasSize', 16384],\n ['tree', false],\n ['treeHorizontalScroll', false],\n ['rowTree', []],\n ['rowTreeColIndex', 0],\n ['columnTree', []],\n ['columnTreeRowStartIndex', 0],\n ['columnTreeRowEndIndex', 0],\n ],\n styles: [\n ['activeCellBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['activeCellBorderColor', 'rgba(110, 168, 255, 1)'],\n ['activeCellBorderWidth', 1],\n ['activeCellColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellFont', '16px sans-serif'],\n ['activeCellHoverBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['activeCellHorizontalAlignment', 'left'],\n ['activeCellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['activeCellOverlayBorderWidth', 1],\n ['activeCellPaddingBottom', 5],\n ['activeCellPaddingLeft', 5],\n ['activeCellPaddingRight', 5],\n ['activeCellPaddingTop', 5],\n ['activeCellSelectedBackgroundColor', 'rgba(236, 243, 255, 1)'],\n ['activeCellSelectedColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellVerticalAlignment', 'center'],\n ['activeColumnHeaderCellBackgroundColor', 'rgba(225, 225, 225, 1)'],\n ['activeColumnHeaderCellColor', 'rgba(0, 0, 0, 1)'],\n ['activeRowHeaderCellBackgroundColor', 'rgba(225, 225, 225, 1)'],\n ['activeRowHeaderCellColor', 'rgba(0, 0, 0, 1)'],\n ['autocompleteBottomMargin', 60],\n ['autosizeHeaderCellPadding', 8],\n ['autosizePadding', 5],\n ['buttonActiveBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['buttonActiveBorderColor', 'rgba(110, 168, 255, 1)'],\n ['buttonArrowColor', 'rgba(50, 50, 50, 1)'],\n ['buttonArrowDownHTML', '▼'],\n ['buttonZIndex', 10000],\n ['buttonBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['buttonBorderColor', 'rgba(172, 172, 172, 1)'],\n ['buttonHoverBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['buttonMenuWindowMargin', 30],\n ['buttonPadding', '3px'],\n ['cellAutoResizePadding', 13],\n ['cellBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['cellBorderColor', 'rgba(195, 199, 202, 1)'],\n ['cellBorderWidth', 1],\n ['cellColor', 'rgba(0, 0, 0, 1)'],\n ['cellFont', '16px sans-serif'],\n ['cellGridHeight', 250],\n ['cellHeight', 24],\n ['cellHeightWithChildGrid', 150],\n ['cellHorizontalAlignment', 'left'],\n ['cellHoverBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['cellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['cellPaddingBottom', 5],\n ['cellPaddingLeft', 5],\n ['cellPaddingRight', 5],\n ['cellPaddingTop', 5],\n ['cellSelectedBackgroundColor', 'rgba(236, 243, 255, 1)'],\n ['cellSelectedColor', 'rgba(0, 0, 0, 1)'],\n ['cellTreeIconBorderColor', 'rgba(162, 174, 207, 1)'],\n ['cellTreeIconFillColor', 'rgba(240, 240, 240, 1)'],\n ['cellTreeIconHoverFillColor', 'rgba(198, 217, 233, 1)'],\n ['cellTreeIconLineColor', 'rgba(43, 53, 81, 1)'],\n ['cellTreeIconLineWidth', 1.5],\n ['cellTreeIconMarginLeft', 0],\n ['cellTreeIconMarginRight', 5],\n ['cellTreeIconMarginTop', 6],\n ['cellTreeIconWidth', 13],\n ['cellVerticalAlignment', 'center'],\n ['cellWidth', 250],\n ['cellWidthWithChildGrid', 250],\n ['cellWhiteSpace', 'nowrap'],\n ['cellLineHeight', 1],\n ['cellLineSpacing', 3],\n ['childContextMenuArrowColor', 'rgba(43, 48, 43, 1)'],\n ['childContextMenuArrowHTML', '►'],\n ['childContextMenuMarginLeft', -11],\n ['childContextMenuMarginTop', -6],\n ['columnGroupRowHeight', 25],\n ['columnHeaderCellBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['columnHeaderCellBorderColor', 'rgba(172, 172, 172, 1)'],\n ['columnHeaderCellBorderWidth', 1],\n ['columnHeaderCellCapBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['columnHeaderCellCapBorderColor', 'rgba(172, 172, 172, 1)'],\n ['columnHeaderCellCapBorderWidth', 1],\n ['columnHeaderCellColor', 'rgba(50, 50, 50, 1)'],\n ['columnHeaderCellFont', '16px sans-serif'],\n ['columnHeaderCellHeight', 25],\n ['columnHeaderCellHorizontalAlignment', 'left'],\n ['columnHeaderCellHoverBackgroundColor', 'rgba(235, 235, 235, 1)'],\n ['columnHeaderCellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['columnHeaderCellPaddingBottom', 5],\n ['columnHeaderCellPaddingLeft', 5],\n ['columnHeaderCellPaddingRight', 5],\n ['columnHeaderCellPaddingTop', 5],\n ['columnHeaderCellVerticalAlignment', 'center'],\n ['columnHeaderOrderByArrowBorderColor', 'rgba(195, 199, 202, 1)'],\n ['columnHeaderOrderByArrowBorderWidth', 1],\n ['columnHeaderOrderByArrowColor', 'rgba(155, 155, 155, 1)'],\n ['columnHeaderOrderByArrowHeight', 8],\n ['columnHeaderOrderByArrowMarginLeft', 0],\n ['columnHeaderOrderByArrowMarginRight', 5],\n ['columnHeaderOrderByArrowMarginTop', 6],\n ['columnHeaderOrderByArrowWidth', 13],\n ['contextFilterButtonBorder', 'solid 1px rgba(158, 163, 169, 1)'],\n ['contextFilterButtonBorderRadius', '3px'],\n ['contextFilterButtonHTML', '▼'],\n ['contextFilterInputBackground', 'rgba(255,255,255,1)'],\n ['contextFilterInputBorder', 'solid 1px rgba(158, 163, 169, 1)'],\n ['contextFilterInputBorderRadius', '0'],\n ['contextFilterInputColor', 'rgba(0,0,0,1)'],\n ['contextFilterInputFontFamily', 'sans-serif'],\n ['contextFilterInputFontSize', '14px'],\n ['contextFilterInvalidRegExpBackground', 'rgba(180, 6, 1, 1)'],\n ['contextFilterInvalidRegExpColor', 'rgba(255, 255, 255, 1)'],\n ['contextMenuArrowColor', 'rgba(43, 48, 43, 1)'],\n ['contextMenuArrowDownHTML', '▼'],\n ['contextMenuArrowUpHTML', '▲'],\n ['contextMenuBackground', 'rgba(240, 240, 240, 1)'],\n ['contextMenuBorder', 'solid 1px rgba(158, 163, 169, 1)'],\n ['contextMenuBorderRadius', '3px'],\n ['contextMenuChildArrowFontSize', '12px'],\n ['contextMenuColor', 'rgba(43, 48, 43, 1)'],\n ['contextMenuCursor', 'default'],\n ['contextMenuFilterButtonFontFamily', 'sans-serif'],\n ['contextMenuFilterButtonFontSize', '10px'],\n ['contextMenuFilterInvalidExpresion', 'rgba(237, 155, 156, 1)'],\n ['contextMenuFontFamily', 'sans-serif'],\n ['contextMenuFontSize', '16px'],\n ['contextMenuHoverBackground', 'rgba(182, 205, 250, 1)'],\n ['contextMenuHoverColor', 'rgba(43, 48, 153, 1)'],\n ['contextMenuItemBorderRadius', '3px'],\n ['contextMenuItemMargin', '2px'],\n ['contextMenuLabelDisplay', 'inline-block'],\n ['contextMenuLabelMargin', '0 3px 0 0'],\n ['contextMenuLabelMaxWidth', '700px'],\n ['contextMenuLabelMinWidth', '75px'],\n ['contextMenuMarginLeft', 3],\n ['contextMenuMarginTop', -3],\n ['contextMenuOpacity', '0.98'],\n ['contextMenuPadding', '2px'],\n ['contextMenuWindowMargin', 30],\n ['contextMenuZIndex', 10000],\n ['cornerCellBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['cornerCellBorderColor', 'rgba(202, 202, 202, 1)'],\n ['debugBackgroundColor', 'rgba(0, 0, 0, .0)'],\n ['debugColor', 'rgba(255, 15, 24, 1)'],\n ['debugEntitiesColor', 'rgba(76, 231, 239, 1.00)'],\n ['debugFont', '11px sans-serif'],\n ['debugPerfChartBackground', 'rgba(29, 25, 26, 1.00)'],\n ['debugPerfChartTextColor', 'rgba(255, 255, 255, 0.8)'],\n ['debugPerformanceColor', 'rgba(252, 255, 37, 1.00)'],\n ['debugScrollHeightColor', 'rgba(248, 33, 103, 1.00)'],\n ['debugScrollWidthColor', 'rgba(66, 255, 27, 1.00)'],\n ['debugTouchPPSXColor', 'rgba(246, 102, 24, 1.00)'],\n ['debugTouchPPSYColor', 'rgba(186, 0, 255, 1.00)'],\n ['display', 'inline-block'],\n ['editCellBackgroundColor', 'white'],\n ['editCellBorder', 'solid 1px rgba(110, 168, 255, 1)'],\n ['editCellBoxShadow', '0 2px 5px rgba(0,0,0,0.4)'],\n ['editCellColor', 'black'],\n ['editCellFontFamily', 'sans-serif'],\n ['editCellFontSize', '16px'],\n ['editCellPaddingLeft', 4],\n ['editCellZIndex', 10000],\n ['filterButtonActiveBackgroundColor', 'rgba(225, 225, 225, 1)'],\n ['filterButtonArrowBorderColor', 'rgba(195, 199, 202, 1)'],\n ['filterButtonArrowBorderWidth', 1],\n ['filterButtonArrowClickRadius', 5],\n ['filterButtonArrowColor', 'rgba(50, 50, 50, 1)'],\n ['filterButtonArrowHeight', 5],\n ['filterButtonArrowWidth', 8],\n ['filterButtonBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['filterButtonBorderColor', 'rgba(172, 172, 172, 1)'],\n ['filterButtonBorderRadius', 3],\n ['filterButtonHeight', 20],\n ['filterButtonHoverBackgroundColor', 'rgba(235, 235, 235, 1)'],\n ['filterButtonMenuOffsetTop', 10],\n ['filterButtonWidth', 20],\n ['frozenMarkerHoverColor', 'rgba(165, 198, 254, 1)'],\n ['frozenMarkerHoverBorderColor', 'rgba(165, 198, 254, 1)'],\n ['frozenMarkerActiveColor', 'rgba(165, 198, 254, 0.2)'],\n ['frozenMarkerActiveBorderColor', 'rgba(165, 198, 254, 0.5)'],\n ['frozenMarkerActiveHeaderColor', 'rgba(165, 198, 254, 1)'],\n ['frozenMarkerColor', 'rgba(221, 221, 221, 1)'],\n ['frozenMarkerBorderColor', 'rgba(221, 221, 221, 1)'],\n ['frozenMarkerBorderWidth', 1],\n ['frozenMarkerHeaderColor', 'rgba(188, 188, 188, 1)'],\n ['frozenMarkerWidth', 4],\n ['groupingAreaBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['gridBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['gridBorderCollapse', 'collapse'],\n ['gridBorderColor', 'rgba(202, 202, 202, 1)'],\n ['gridBorderWidth', 1],\n ['groupIndicatorColor', 'rgba(155, 155, 155, 1)'],\n ['groupIndicatorBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['height', 'auto'],\n ['maxHeight', 'inherit'],\n ['maxWidth', 'inherit'],\n ['minColumnWidth', 45],\n ['minHeight', 'inherit'],\n ['minRowHeight', 24],\n ['minWidth', 'inherit'],\n ['mobileContextMenuMargin', 10],\n ['mobileEditInputHeight', 30],\n ['mobileEditFontFamily', 'sans-serif'],\n ['mobileEditFontSize', '16px'],\n ['moveOverlayBorderWidth', 1],\n ['moveOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['moveOverlayBorderSegments', '12, 7'],\n ['name', 'default'],\n ['overflowY', 'auto'],\n ['overflowX', 'auto'],\n ['reorderMarkerBackgroundColor', 'rgba(0, 0, 0, 0.1)'],\n ['reorderMarkerBorderColor', 'rgba(0, 0, 0, 0.2)'],\n ['reorderMarkerBorderWidth', 1.25],\n ['reorderMarkerIndexBorderColor', 'rgba(66, 133, 244, 1)'],\n ['reorderMarkerIndexBorderWidth', 2.75],\n ['resizeMarkerColor', 'rgba(0, 0, 0, 0.2)'],\n ['resizeMarkerSize', 2],\n ['rowGroupColumnWidth', 25],\n ['rowHeaderCellBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['rowHeaderCellBorderColor', 'rgba(200, 200, 200, 1)'],\n ['rowHeaderCellBorderWidth', 1],\n ['rowHeaderCellColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellFont', '16px sans-serif'],\n ['rowHeaderCellHeight', 25],\n ['rowHeaderCellHorizontalAlignment', 'left'],\n ['rowHeaderCellHoverBackgroundColor', 'rgba(235, 235, 235, 1)'],\n ['rowHeaderCellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['rowHeaderCellPaddingBottom', 5],\n ['rowHeaderCellPaddingLeft', 5],\n ['rowHeaderCellPaddingRight', 5],\n ['rowHeaderCellPaddingTop', 5],\n ['rowHeaderCellRowNumberGapHeight', 5],\n ['rowHeaderCellRowNumberGapColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellSelectedBackgroundColor', 'rgba(217, 217, 217, 1)'],\n ['rowHeaderCellSelectedColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellVerticalAlignment', 'center'],\n ['rowHeaderCellWidth', 57],\n ['scrollBarActiveColor', 'rgba(125, 125, 125, 1)'],\n ['scrollBarBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['scrollBarBorderColor', 'rgba(202, 202, 202, 1)'],\n ['scrollBarBorderWidth', 0.5],\n ['scrollBarBoxBorderRadius', 4.125],\n ['scrollBarBoxColor', 'rgba(192, 192, 192, 1)'],\n ['scrollBarBoxMargin', 2],\n ['scrollBarBoxMinSize', 15],\n ['scrollBarBoxWidth', 8],\n ['scrollBarCornerBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['scrollBarCornerBorderColor', 'rgba(202, 202, 202, 1)'],\n ['scrollBarWidth', 11],\n ['selectionHandleBorderColor', 'rgba(255, 255, 255, 1)'],\n ['selectionHandleBorderWidth', 1.5],\n ['selectionHandleColor', 'rgba(66, 133, 244, 1)'],\n ['selectionHandleSize', 8],\n ['selectionHandleType', 'square'],\n ['fillOverlayBorderColor', 'rgba(127, 127, 127, 1)'],\n ['fillOverlayBorderWidth', 2],\n ['selectionOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['selectionOverlayBorderWidth', 1],\n ['treeArrowBorderColor', 'rgba(195, 199, 202, 1)'],\n ['treeArrowBorderWidth', 1],\n ['treeArrowClickRadius', 5],\n ['treeArrowColor', 'rgba(155, 155, 155, 1)'],\n ['treeArrowHeight', 8],\n ['treeArrowMarginLeft', 0],\n ['treeArrowMarginRight', 5],\n ['treeArrowMarginTop', 6],\n ['treeArrowWidth', 13],\n ['treeGridHeight', 250],\n ['unhideIndicatorColor', 'rgba(0, 0, 0, 1)'],\n ['unhideIndicatorBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['unhideIndicatorBorderColor', 'rgba(174, 193, 232, 1)'],\n ['unhideIndicatorSize', 16],\n ['width', 'auto'],\n ],\n };\n}\n","'use strict';\n//@ts-check\n/// <reference path=\"./type.d.ts\" />\n\n// Abbreviation in this file\n// - sel: selection\n// - sel0, sel1: If there are two selections in the parameters, these two names are for them.\n\n// Types of Selection\n// 0. (High Priority) Unselected cells from [startRow, startColumn] to [endRow, endColumn]\n// 1. Cells from [startRow, startColumn] to [endRow, endColumn]\n// 2. Rows from startRow to endRow\n// 3. Columns from startColumn to endColumn\n\nconst SelectionType = {\n UnselectedCells: 0,\n Cells: 1,\n Rows: 2,\n Columns: 3,\n};\n\n/**\n * Swap values between two properties in an object\n * @param {object} obj The object\n * @param {string} prop0 First property name\n * @param {string} prop1 Another property name\n */\nconst swapProps = (obj, prop0, prop1) => {\n const t = obj[prop0];\n obj[prop0] = obj[prop1];\n obj[prop1] = t;\n};\n\n/**\n * This function transforms a selection object to normalized.\n * Here is the definition of **normalized selection object**:\n * - It contains these required properties: type, startRow, startColumn, endRow, endColumn\n * - Property `endRow` and property `endColumn` must exist even if their value are the same with `startRow` or `startColumn`.\n * - The value of `endRow` must be equals or greater than the value of `startRow`\n * - The value of `endColumn` must be equals or greater than the value of `startColumn`\n * @param {SelectionDescriptor} sel\n * @returns {SelectionDescriptor}\n */\nconst normalizeSelection = (sel) => {\n if (!sel) return sel;\n switch (sel.type) {\n case SelectionType.UnselectedCells:\n case SelectionType.Cells:\n if (typeof sel.endRow !== 'number') sel.endRow = sel.startRow;\n else if (sel.endRow < sel.startRow) swapProps(sel, 'startRow', 'endRow');\n\n if (typeof sel.endColumn !== 'number') sel.endColumn = sel.startColumn;\n else if (sel.endColumn < sel.startColumn)\n swapProps(sel, 'startColumn', 'endColumn');\n\n break;\n case SelectionType.Rows:\n if (typeof sel.endRow !== 'number') sel.endRow = sel.startRow;\n else if (sel.endRow < sel.startRow) swapProps(sel, 'startRow', 'endRow');\n\n break;\n case SelectionType.Columns:\n if (typeof sel.endColumn !== 'number') sel.endColumn = sel.startColumn;\n else if (sel.endColumn < sel.startColumn)\n swapProps(sel, 'startColumn', 'endColumn');\n\n break;\n }\n return sel;\n};\n\n/**\n * Parse a string expression to a selection object. Here are some example expressions:\n * - cells:20,30-40,50\n * - row:5\n * - cols:5-9\n * @param {string} str\n * @returns {SelectionDescriptor}\n */\nconst getSelectionFromString = (str) => {\n if (typeof str !== 'string') return;\n\n const index = str.indexOf(':');\n if (index < 0) return;\n\n const type = str.slice(0, index);\n const num = str\n .slice(index + 1)\n .split(/[,:;-]+/)\n .map((it) => parseInt(it, 10));\n switch (type) {\n case 'cell':\n case 'cells':\n case '-cell':\n case '-cells':\n return normalizeSelection({\n type: SelectionType[type[0] === '-' ? 'UnselectedCells' : 'Cells'],\n startRow: num[0],\n startColumn: num[1],\n endRow: num[2],\n endColumn: num[3],\n });\n case 'row':\n case 'rows':\n return normalizeSelection({\n type: SelectionType.Rows,\n startRow: num[0],\n endRow: num[1],\n });\n case 'col':\n case 'cols':\n return normalizeSelection({\n type: SelectionType.Columns,\n startColumn: num[0],\n endColumn: num[1],\n });\n }\n};\n\n/**\n * Check are two cells block the same\n * @param {SelectionDescriptor} block0\n * @param {SelectionDescriptor} block1\n * @returns {boolean}\n */\nconst isSameCellsBlock = (block0, block1) => {\n return (\n block0.startRow === block1.startRow &&\n block0.endRow === block1.endRow &&\n block0.startColumn === block1.startColumn &&\n block0.endColumn === block1.endColumn\n );\n};\n\n/**\n * This function is used in the function `mergeSelections`\n * @see mergeSelections\n * @param {SelectionDescriptor} cells\n * @param {SelectionDescriptor} rowsOrColumns\n * @returns {SelectionDescriptor}\n */\nconst mergeCellsIntoRowsOrColumns = (cells, rowsOrColumns) => {\n if (rowsOrColumns.type === SelectionType.Rows) {\n if (\n cells.startRow >= rowsOrColumns.startRow &&\n cells.endRow <= rowsOrColumns.endRow\n )\n return rowsOrColumns;\n return;\n }\n if (\n cells.startColumn >= rowsOrColumns.startColumn &&\n cells.endColumn <= rowsOrColumns.endColumn\n )\n return rowsOrColumns;\n};\n\n/**\n * Merge two selection objects (Splicing, Containing)\n * @param {SelectionDescriptor} sel0\n * @param {SelectionDescriptor} sel1\n * @returns {SelectionDescriptor} A concatenated selection object based on `block0`.\n * Or `undefined` if they can't be concatenated\n */\nconst mergeSelections = (sel0, sel1) => {\n if (sel0.type !== sel1.type) {\n if (sel1.type <= SelectionType.Cells && sel0.type > SelectionType.Cells)\n return mergeCellsIntoRowsOrColumns(sel1, sel0);\n if (sel0.type <= SelectionType.Cells && sel1.type > SelectionType.Cells)\n return mergeCellsIntoRowsOrColumns(sel0, sel1);\n return;\n }\n\n /** These two selection objects may be concatenated horizontally */\n const horizontalConcat =\n sel0.type === SelectionType.Columns\n ? true\n : sel0.startRow === sel1.startRow && sel0.endRow === sel1.endRow;\n\n /** These two selection objects may be concatenated vertically */\n const verticalConcat =\n sel0.type === SelectionType.Rows\n ? true\n : sel0.startColumn === sel1.startColumn &&\n sel0.endColumn === sel1.endColumn;\n\n if (horizontalConcat) {\n // Are they the same\n if (verticalConcat) return sel0;\n // Are they neighbor\n if (\n sel1.startColumn > sel0.endColumn + 1 ||\n sel1.endColumn < sel0.startColumn - 1\n )\n return;\n return Object.assign({}, sel0, {\n startColumn: Math.min(sel0.startColumn, sel1.startColumn),\n endColumn: Math.max(sel0.endColumn, sel1.endColumn),\n });\n }\n\n if (verticalConcat) {\n // Are they neighbor\n if (sel1.startRow > sel0.endRow + 1 || sel1.endRow < sel0.startRow - 1)\n return;\n return Object.assign({}, sel0, {\n startRow: Math.min(sel0.startRow, sel1.startRow),\n endRow: Math.max(sel0.endRow, sel1.endRow),\n });\n }\n\n // Does one of them contain other one\n if (\n sel0.type === SelectionType.Cells ||\n sel0.type === SelectionType.UnselectedCells\n ) {\n const intersection = getIntersection(sel0, sel1);\n if (intersection) {\n if (isSameCellsBlock(intersection, sel0)) return sel1;\n if (isSameCellsBlock(intersection, sel1)) return sel0;\n }\n }\n};\n\n/**\n * Remove some rows from a rows selection\n * @param {SelectionDescriptor} selection It must be a selection with type as `Rows`\n * @param {SelectionDescriptor} remove It must be a selection with type as `Rows`\n * @returns {SelectionDescriptor[]} Returning a `undefined` represents parameter `remove` doesn't intersect with parameter `selection`\n */\nconst removePartOfRowsSelection = (selection, remove) => {\n if (remove.endRow < selection.startRow) return;\n if (remove.startRow > selection.endRow) return;\n if (remove.startRow <= selection.startRow) {\n // all rows of the selection is removed\n if (remove.endRow >= selection.endRow) return [];\n return [Object.assign({}, selection, { startRow: remove.endRow + 1 })];\n }\n if (remove.endRow >= selection.endRow)\n return [Object.assign({}, selection, { endRow: remove.startRow - 1 })];\n // the selection be divided into two parts\n return [\n Object.assign({}, selection, { endRow: remove.startRow - 1 }),\n Object.assign({}, selection, { startRow: remove.endRow + 1 }),\n ];\n};\n\n/**\n * Remove some columns from a columns selection\n * @param {object} selection It must be a selection with type as `Columns`\n * @param {object} remove It must be a selection with type as `Columns`\n * @returns {object[]} Returning a `undefined` represents parameter `remove` doesn't intersect with parameter `selection`\n */\nconst removePartOfColumnsSelection = (selection, remove) => {\n if (remove.endColumn < selection.startColumn) return;\n if (remove.startColumn > selection.endColumn) return;\n if (remove.startColumn <= selection.startColumn) {\n // all cols of the selection is removed\n if (remove.endColumn >= selection.endColumn) return [];\n return [\n Object.assign({}, selection, { startColumn: remove.endColumn + 1 }),\n ];\n }\n if (remove.endColumn >= selection.endColumn)\n return [\n Object.assign({}, selection, { endColumn: remove.startColumn - 1 }),\n ];\n // the selection be divided into two parts\n return [\n Object.assign({}, selection, { endColumn: remove.startColumn - 1 }),\n Object.assign({}, selection, { startColumn: remove.endColumn + 1 }),\n ];\n};\n\n/**\n * Remove a cells block from a cells selection\n * @param {SelectionDescriptor} selection It must be a selection with type as `Cells` or `UnselectedCells`\n * @param {SelectionDescriptor} remove It must be a selection\n * @returns {SelectionDescriptor[]} Returning a `undefined` represents parameter `remove` doesn't intersect with parameter `selection`\n */\nconst removePartOfCellsSelection = (selection, remove) => {\n const intersect = getIntersection(selection, remove);\n if (!intersect) return;\n // all of cells in the selection are removed\n if (isSameCellsBlock(selection, intersect)) return [];\n const result = [];\n let minStartRow = selection.startRow;\n let maxEndRow = selection.endRow;\n let maxEndColumn = selection.endColumn;\n if (intersect.startRow > selection.startRow) {\n // Top\n result.push(\n Object.assign({}, selection, { endRow: intersect.startRow - 1 }),\n );\n minStartRow = intersect.startRow;\n }\n if (intersect.endColumn < selection.endColumn) {\n // Right\n result.push(\n Object.assign({}, selection, {\n startRow: minStartRow,\n startColumn: intersect.endColumn + 1,\n }),\n );\n maxEndColumn = intersect.endColumn;\n }\n if (intersect.endRow < selection.endRow) {\n // Bottom\n result.push(\n Object.assign({}, selection, {\n endColumn: maxEndColumn,\n startRow: intersect.endRow + 1,\n }),\n );\n maxEndRow = intersect.endRow;\n }\n if (intersect.startColumn > selection.startColumn) {\n // Bottom\n result.push(\n Object.assign({}, selection, {\n startRow: minStartRow,\n endRow: maxEndRow,\n endColumn: intersect.startColumn - 1,\n }),\n );\n }\n return result;\n};\n\n/**\n * Get intersection of two selection object\n * @param {SelectionDescriptor} sel0\n * @param {SelectionDescriptor} sel1\n * @returns {SelectionDescriptor} a selection object or undefined\n */\nconst getIntersection = (sel0, sel1) => {\n if (sel0.type > sel1.type) return getIntersection(sel1, sel0);\n if (sel0.type <= SelectionType.Cells) {\n if (sel1.type <= SelectionType.Cells) {\n const startColumn = Math.max(sel0.startColumn, sel1.startColumn);\n const endColumn = Math.min(sel0.endColumn, sel1.endColumn);\n if (startColumn > endColumn) return;\n\n const startRow = Math.max(sel0.startRow, sel1.startRow);\n const endRow = Math.min(sel0.endRow, sel1.endRow);\n if (startRow > endRow) return;\n\n return {\n type: SelectionType.Cells,\n startRow: startRow,\n startColumn: startColumn,\n endRow: endRow,\n endColumn: endColumn,\n };\n }\n if (sel1.type === SelectionType.Rows) {\n const startRow = Math.max(sel0.startRow, sel1.startRow);\n const endRow = Math.min(sel0.endRow, sel1.endRow);\n if (startRow > endRow) return;\n return {\n type: SelectionType.Cells,\n startRow: startRow,\n startColumn: sel0.startColumn,\n endRow: endRow,\n endColumn: sel0.endColumn,\n };\n } else {\n // SelectionType.Columns\n const startColumn = Math.max(sel0.startColumn, sel1.startColumn);\n const endColumn = Math.min(sel0.endColumn, sel1.endColumn);\n if (startColumn > endColumn) return;\n return {\n type: SelectionType.Cells,\n startColumn: startColumn,\n startRow: sel0.startRow,\n endColumn: endColumn,\n endRow: sel0.endRow,\n };\n }\n }\n if (sel0.type === SelectionType.Rows) {\n if (sel1.type === SelectionType.Rows) {\n const startRow = Math.max(sel0.startRow, sel1.startRow);\n const endRow = Math.min(sel0.endRow, sel1.endRow);\n if (startRow > endRow) return;\n return { type: SelectionType.Rows, startRow: startRow, endRow: endRow };\n } else {\n // SelectionType.Columns\n return {\n type: SelectionType.Cells,\n startRow: sel0.startRow,\n startColumn: sel1.startColumn,\n endRow: sel0.endRow,\n endColumn: sel1.endColumn,\n };\n }\n }\n // SelectionType.Columns\n const startColumn = Math.max(sel0.startColumn, sel1.startColumn);\n const endColumn = Math.min(sel0.endColumn, sel1.endColumn);\n if (startColumn > endColumn) return;\n return {\n type: SelectionType.Columns,\n startColumn: startColumn,\n endColumn: endColumn,\n };\n};\n\n/**\n * Add a selection object into `selections` array. And there are two behaviours if this function:\n * - It appends a new selection object into the `selections` array\n * - It rewrites the selection item in the `selections` array (merge or change its type)\n *\n * @param {SelectionDescriptor[]} selections\n * @param {SelectionDescriptor} add Supported types: Cells, Rows, Columns\n * @param {ContextForSelectionAction} [context] Eg: {rows:1000, columns:1000}\n * @returns {boolean} is the selections array changed\n */\nconst addIntoSelections = (selections, add, context) => {\n if (!add || typeof add.type !== 'number') return false;\n if (add.type === SelectionType.Cells) {\n for (let i = 0; i < selections.length; i++) {\n const sel = selections[i];\n if (sel.type === SelectionType.UnselectedCells) {\n const parts = removePartOfCellsSelection(sel, add);\n if (parts) {\n selections.splice(i, 1, ...parts);\n i += parts.length - 1;\n }\n continue;\n }\n if (sel.type === SelectionType.Cells) {\n const parts = removePartOfCellsSelection(add, sel);\n if (Array.isArray(parts)) {\n let result = false;\n for (let i = 0; i < parts.length; i++) {\n const isChanged = addIntoSelections(selections, parts[i], context);\n if (isChanged) result = true;\n }\n if (result) cleanupSelections(selections);\n return result;\n }\n }\n }\n\n // has context info of the grid\n if (context) {\n const selectedAllRows =\n add.startRow === 0 && add.endRow + 1 >= context.rows;\n const selectedAllColumns =\n add.startColumn === 0 && add.endColumn + 1 >= context.columns;\n let isChanged0, isChanged1;\n if (selectedAllRows) {\n isChanged0 = addIntoSelections(\n selections,\n {\n type: SelectionType.Columns,\n startColumn: add.startColumn,\n endColumn: add.endColumn,\n },\n context,\n );\n }\n if (selectedAllColumns) {\n isChanged1 = addIntoSelections(\n selections,\n {\n type: SelectionType.Rows,\n startRow: add.startRow,\n endRow: add.endRow,\n },\n context,\n );\n }\n if (selectedAllRows || selectedAllColumns)\n return isChanged0 || isChanged1;\n }\n\n selections.push(add);\n cleanupSelections(selections);\n return true;\n }\n // end of cells selection\n\n const isRowsSelection = add.type === SelectionType.Rows;\n if (isRowsSelection || add.type === SelectionType.Columns) {\n for (let i = 0; i < selections.length; i++) {\n const sel = selections[i];\n if (sel.type === SelectionType.UnselectedCells) {\n const parts = removePartOfCellsSelection(\n sel,\n isRowsSelection\n ? {\n startRow: add.startRow,\n endRow: add.endRow,\n startColumn: 0,\n endColumn: sel.endColumn,\n }\n : {\n startColumn: add.startColumn,\n endColumn: add.endColumn,\n startRow: 0,\n endRow: sel.endRow,\n },\n );\n if (parts) {\n selections.splice(i, 1, ...parts);\n i += parts.length - 1;\n }\n continue;\n }\n if (sel.type !== add.type) continue;\n // try to concat them\n let merged = mergeSelections(sel, add);\n if (merged) {\n for (let j = i + 1; j < selections.length; j++) {\n if (selections[j].type !== add.type) continue;\n const newMerged = mergeSelections(selections[j], merged);\n if (newMerged) {\n selections.splice(j, 1);\n j--;\n merged = newMerged;\n }\n }\n selections[i] = merged;\n cleanupSelections(selections);\n return true;\n }\n }\n selections.push(add);\n cleanupSelections(selections);\n return true;\n }\n return false;\n};\n\n/**\n * Remove a selection area from `selections` array\n * @param {SelectionDescriptor[]} selections\n * @param {SelectionDescriptor} remove Supported types: Cells, Rows, Columns\n * @param {ContextForSelectionAction} [context] Eg: {rows:1000, columns:1000}\n * @returns {boolean} is the selections array changed\n */\nconst removeFromSelections = (selections, remove, context) => {\n if (!remove || typeof remove.type !== 'number') return false;\n if (remove.type === SelectionType.Cells) {\n for (let i = 0; i < selections.length; i++) {\n const sel = selections[i];\n if (sel.type === SelectionType.UnselectedCells) {\n const parts = removePartOfCellsSelection(remove, sel);\n if (Array.isArray(parts)) {\n let result = false;\n for (let i = 0; i < parts.length; i++) {\n const isChanged = removeFromSelections(\n selections,\n parts[i],\n context,\n );\n if (isChanged) result = true;\n }\n if (result) cleanupSelections(selections);\n return result;\n }\n }\n if (sel.type === SelectionType.Cells) {\n const parts = removePartOfCellsSelection(sel, remove);\n if (parts) {\n selections.splice(i, 1, ...parts);\n i += parts.length - 1;\n }\n continue;\n }\n }\n // has context info of the grid\n if (context) {\n const unselectedAllRows =\n remove.startRow === 0 && remove.endRow + 1 >= context.rows;\n const unselectedAllColumns =\n remove.startColumn === 0 && remove.endColumn + 1 >= context.columns;\n let isChanged0, isChanged1;\n if (unselectedAllRows) {\n isChanged0 = removeFromSelections(\n selections,\n {\n type: SelectionType.Columns,\n startColumn: remove.startColumn,\n endColumn: remove.endColumn,\n },\n context,\n );\n }\n if (unselectedAllColumns) {\n isChanged1 = removeFromSelections(\n selections,\n {\n type: SelectionType.Rows,\n startRow: remove.startRow,\n endRow: remove.endRow,\n },\n context,\n );\n }\n if (unselectedAllRows || unselectedAllColumns)\n return isChanged0 || isChanged1;\n }\n\n remove.type = SelectionType.UnselectedCells;\n selections.unshift(remove);\n cleanupSelections(selections);\n return true;\n }\n // end of cells selection\n\n const isRowsSelection = remove.type === SelectionType.Rows;\n if (isRowsSelection || remove.type === SelectionType.Columns) {\n let isChanged = false;\n for (let i = 0; i < selections.length; i++) {\n const sel = selections[i];\n if (sel.type === SelectionType.Cells) {\n const parts = removePartOfCellsSelection(\n sel,\n isRowsSelection\n ? {\n startRow: remove.startRow,\n endRow: remove.endRow,\n startColumn: 0,\n endColumn: sel.endColumn,\n }\n : {\n startColumn: remove.startColumn,\n endColumn: remove.endColumn,\n startRow: 0,\n endRow: sel.endRow,\n },\n );\n if (parts) {\n selections.splice(i, 1, ...parts);\n i += parts.length - 1;\n }\n continue;\n }\n if (sel.type === SelectionType.UnselectedCells) {\n if (isRowsSelection) {\n if (sel.startRow >= remove.startRow && sel.endRow <= remove.endRow) {\n selections.splice(i, 1);\n i--;\n }\n } else {\n if (\n sel.startColumn >= remove.startColumn &&\n sel.endColumn <= remove.endColumn\n ) {\n selections.splice(i, 1);\n i--;\n }\n }\n continue;\n }\n if (sel.type === remove.type) {\n const newSelection = isRowsSelection\n ? removePartOfRowsSelection(sel, remove)\n : removePartOfColumnsSelection(sel, remove);\n if (!newSelection) continue;\n isChanged = true;\n selections.splice(i, 1, ...newSelection);\n i += newSelection.length - 1;\n } else {\n isChanged = true;\n /** @type {SelectionDescriptor} */\n let newSelection;\n if (sel.type === SelectionType.Rows) {\n newSelection = {\n type: SelectionType.UnselectedCells,\n startColumn: remove.startColumn,\n endColumn: remove.endColumn,\n startRow: sel.startRow,\n endRow: sel.endRow,\n };\n } else {\n newSelection = {\n type: SelectionType.UnselectedCells,\n startRow: remove.startRow,\n endRow: remove.endRow,\n startColumn: sel.startColumn,\n endColumn: sel.endColumn,\n };\n }\n selections.unshift(newSelection);\n }\n }\n if (isChanged) cleanupSelections(selections);\n return isChanged;\n }\n return false;\n};\n\n/**\n * Clean up a selections array.\n * This function removes unnecessary selection object, and it tries to merge different selections.\n * @param {SelectionDescriptor[]} selections\n */\nconst cleanupSelections = (selections) => {\n let unselect = [];\n let select = [];\n for (let i = 0; i < selections.length; i++) {\n const sel = selections[i];\n if (sel.type === SelectionType.UnselectedCells) unselect.push(sel);\n else select.push(sel);\n }\n // clean unused unselected objects\n unselect = unselect.filter((unsel) => {\n for (let i = 0; i < select.length; i++)\n if (getIntersection(unsel, select[i])) return true;\n return false;\n });\n // merge neighbor cells block selections\n let endMerge = false;\n while (!endMerge) {\n endMerge = true;\n for (let i = 0; i < select.length; i++) {\n const sel0 = select[i];\n for (let j = i + 1; j < select.length; j++) {\n const sel1 = select[j];\n const newSel = mergeSelections(sel0, sel1);\n if (!newSel) continue;\n select[i] = newSel;\n select.splice(j, 1);\n endMerge = false;\n break;\n }\n if (!endMerge) break;\n }\n }\n // save back to `selections`\n let ptr = 0;\n for (let i = 0; i < unselect.length; i++) selections[ptr++] = unselect[i];\n for (let i = 0; i < select.length; i++) selections[ptr++] = select[i];\n selections.splice(ptr, selections.length - ptr);\n};\n\n/**\n * Check if all cells in a given row selected\n * @param {SelectionDescriptor[]} selections\n * @param {number} rowIndex\n */\nconst isRowSelected = (selections, rowIndex) => {\n for (let i = 0; i < selections.length; i++) {\n const sel = selections[i];\n switch (sel.type) {\n case SelectionType.UnselectedCells:\n if (rowIndex >= sel.startRow && rowIndex <= sel.endRow) return false;\n break;\n case SelectionType.Rows:\n if (rowIndex >= sel.startRow && rowIndex <= sel.endRow) return true;\n }\n }\n return false;\n};\n\n/**\n * Check if all cells in a given column selected\n * @param {SelectionDescriptor[]} selections\n * @param {number} columnIndex\n */\nconst isColumnSelected = (selections, columnIndex) => {\n for (let i = 0; i < selections.length; i++) {\n const sel = selections[i];\n switch (sel.type) {\n case SelectionType.UnselectedCells:\n if (columnIndex >= sel.startColumn && columnIndex <= sel.endColumn)\n return false;\n break;\n case SelectionType.Columns:\n if (columnIndex >= sel.startColumn && columnIndex <= sel.endColumn)\n return true;\n }\n }\n return false;\n};\n\n/**\n * Check if a given cell selected\n * @param {SelectionDescriptor[]} selections\n * @param {number} rowIndex\n * @param {number} columnIndex\n */\nconst isCellSelected = (selections, rowIndex, columnIndex) => {\n for (let i = 0; i < selections.length; i++) {\n const sel = selections[i];\n switch (sel.type) {\n case SelectionType.UnselectedCells:\n case SelectionType.Cells:\n if (\n columnIndex >= sel.startColumn &&\n columnIndex <= sel.endColumn &&\n rowIndex >= sel.startRow &&\n rowIndex <= sel.endRow\n )\n return sel.type === SelectionType.Cells;\n break;\n case SelectionType.Rows:\n if (rowIndex >= sel.startRow && rowIndex <= sel.endRow) return true;\n break;\n case SelectionType.Columns:\n if (columnIndex >= sel.startColumn && columnIndex <= sel.endColumn)\n return true;\n }\n }\n return false;\n};\n\n/**\n * Check if all given cells selected\n * @param {SelectionDescriptor[]} selections\n * @param {RangeDescriptor} range the range of cells block\n * @returns {boolean}\n */\nconst areAllCellsSelected = (selections, range) => {\n const {\n startRow: startRow,\n startColumn: startColumn,\n endRow: endRow,\n endColumn: endColumn,\n } = range;\n for (let i = 0, iTo = selections.length; i < iTo; i++) {\n const sel = selections[i];\n if (!sel) continue;\n switch (sel.type) {\n case SelectionType.UnselectedCells:\n case SelectionType.Cells:\n {\n const matched0 =\n startColumn >= sel.startColumn && startRow >= sel.startRow;\n const matched1 = endColumn <= sel.endColumn && endRow <= sel.endRow;\n if (matched0 || matched1) {\n if (matched0 && matched1) return sel.type === SelectionType.Cells;\n if (\n (matched0 &&\n startColumn <= sel.endColumn &&\n startRow <= sel.endRow) ||\n (matched1 &&\n endColumn >= sel.startColumn &&\n endRow >= sel.startRow)\n )\n return false;\n }\n }\n break;\n case SelectionType.Rows:\n if (startRow >= sel.startRow) {\n if (endRow <= sel.endRow) return true;\n if (startRow <= sel.endRow) return false;\n } else if (endRow >= sel.startRow) return false;\n break;\n case SelectionType.Columns:\n if (startColumn >= sel.startColumn) {\n if (endColumn <= sel.endColumn) return true;\n if (startColumn <= sel.endColumn) return false;\n } else if (endColumn >= sel.startColumn) return false;\n }\n }\n return false;\n};\n\n/**\n * Get selection state from cells\n * @param {SelectionDescriptor[]} selections\n * @param {RangeDescriptor} range\n * @returns {boolean|boolean[][]} Returning `true` means all given cells are selected,\n * Returning `false` means all given cells are not selected.\n * Returning a two-dimensional array means some cells are selected and some cells are not selected.\n * A reference for returned value: `state[rowIndex - range.startRow][colIndex - range.startColumn]`\n */\nconst getSelectionStateFromCells = (selections, range) => {\n if (!Array.isArray(selections) || selections.length === 0) return false;\n selections = selections.filter((sel) => {\n if (typeof sel.startRow === 'number')\n if (sel.endRow < range.startRow || sel.startRow > range.endRow)\n return false;\n if (typeof sel.startColumn === 'number')\n if (\n sel.endColumn < range.startColumn ||\n sel.startColumn > range.endColumn\n )\n return false;\n return sel;\n });\n if (selections.length === 0) return false;\n if (areAllCellsSelected(selections, range)) return true;\n\n const countOfColumns = range.endColumn - range.startColumn + 1;\n const result = new Array(range.endRow - range.startRow + 1)\n .fill(null)\n .map(() => new Array(countOfColumns));\n\n const test = Object.assign({ type: SelectionType.Cells }, range);\n for (let i = selections.length - 1; i >= 0; i--) {\n const sel = selections[i];\n const intersection = getIntersection(test, sel);\n if (!intersection) continue;\n const value = sel.type !== SelectionType.UnselectedCells;\n for (\n let rowIndex = intersection.startRow;\n rowIndex <= intersection.endRow;\n rowIndex++\n ) {\n const row = result[rowIndex - range.startRow];\n let columnOffset = intersection.startColumn - range.startColumn;\n const columnOffsetEnd = intersection.endColumn - range.startColumn;\n for (; columnOffset <= columnOffsetEnd; columnOffset++)\n row[columnOffset] = value;\n }\n }\n return result;\n};\n\n/**\n * Get verbose selection state from cells.\n * (`verbose` in here means that you can locate particular selection for selected cells)\n * @param {SelectionDescriptor[]} selections\n * @param {RangeDescriptor} range\n * @returns {number[][]} Each item in this two-dimensional array is 0 or a positive int,\n * it represents the index of matched selection plus 1 if it is a positive int.\n * And if the value of item is 0, it means this cell is not selected.\n * A reference for returned value: `state[rowIndex - range.startRow][colIndex - range.startColumn]`\n */\nconst getVerboseSelectionStateFromCells = (selections, range) => {\n if (!Array.isArray(selections) || selections.length === 0) return [];\n selections = selections.map((sel) => {\n if (typeof sel.startRow === 'number')\n if (sel.endRow < range.startRow || sel.startRow > range.endRow)\n return null;\n if (typeof sel.startColumn === 'number')\n if (\n sel.endColumn < range.startColumn ||\n sel.startColumn > range.endColumn\n )\n return null;\n return sel;\n });\n if (selections.length === 0) return [];\n\n const countOfColumns = range.endColumn - range.startColumn + 1;\n const result = new Array(range.endRow - range.startRow + 1)\n .fill(null)\n .map(() => new Array(countOfColumns));\n\n const test = Object.assign({ type: SelectionType.Cells }, range);\n for (let i = selections.length - 1; i >= 0; i--) {\n const sel = selections[i];\n if (!sel) continue;\n const intersection = getIntersection(test, sel);\n if (!intersection) continue;\n const value = sel.type !== SelectionType.UnselectedCells;\n for (\n let rowIndex = intersection.startRow;\n rowIndex <= intersection.endRow;\n rowIndex++\n ) {\n const row = result[rowIndex - range.startRow];\n let columnOffset = intersection.startColumn - range.startColumn;\n const columnOffsetEnd = intersection.endColumn - range.startColumn;\n for (; columnOffset <= columnOffsetEnd; columnOffset++)\n row[columnOffset] = value ? i + 1 : 0;\n }\n }\n return result;\n};\n\n/**\n * Check if any contiguous columns are selected.\n * (This function is useful for the preconditions for actions on columns, Eg: grouping, hiding)\n * @param {SelectionDescriptor[]} selections\n * @param {boolean} allowImpurity This function ignores other selected rows/cells if its value is `true`\n * @returns {number[]} a tuple [beginViewColumnIndex, endViewColumnIndex] or `undefined`\n */\nconst getSelectedContiguousColumns = (selections, allowImpurity) => {\n if (!selections || selections.length === 0) return;\n /** A selection object */\n let matched;\n for (let i = selections.length - 1; i >= 0; i--) {\n const selection = selections[i];\n switch (selection.type) {\n case SelectionType.Columns:\n if (matched) {\n const newMatched = mergeSelections(matched, selection);\n if (newMatched) {\n matched = newMatched;\n break;\n }\n }\n matched = selection;\n break;\n case SelectionType.Rows:\n case SelectionType.Cells:\n if (!allowImpurity) return;\n break;\n case SelectionType.UnselectedCells:\n if (!matched) return;\n if (getIntersection(selection, matched)) return;\n }\n }\n if (matched) return [matched.startColumn, matched.endColumn];\n};\n\n/**\n * Check if any contiguous rows are selected.\n * (This function is useful for the preconditions for actions on rows, Eg: grouping, hiding)\n * @param {SelectionDescriptor[]} selections\n * @param {boolean} allowImpurity This function ignores other selected columns/cells if its value is `true`\n * @returns {number[]} a tuple [beginRowOrderIndex, endRowOrderIndex] or `undefined`\n */\nconst getSelectedContiguousRows = (selections, allowImpurity) => {\n if (!selections || selections.length === 0) return;\n /** A selection object */\n let matched;\n for (let i = selections.length - 1; i >= 0; i--) {\n const selection = selections[i];\n switch (selection.type) {\n case SelectionType.Rows:\n if (matched) {\n const newMatched = mergeSelections(matched, selection);\n if (newMatched) {\n matched = newMatched;\n break;\n }\n }\n matched = selection;\n break;\n case SelectionType.Columns:\n case SelectionType.Cells:\n if (!allowImpurity) return;\n break;\n case SelectionType.UnselectedCells:\n if (!matched) return;\n if (getIntersection(selection, matched)) return;\n }\n }\n if (matched) return [matched.startRow, matched.endRow];\n};\n\n/**\n * Check if current selections are complex.\n * How we defined \"complex\" in here:\n * - There are any unselected cells in selected rows/columns\n * - More than one selection type in current selections\n * @param {SelectionDescriptor[]} selections\n * @returns {boolean}\n */\nconst areSelectionsComplex = (selections) => {\n if (!selections || selections.length <= 1) return false;\n const baseType = selections[0].type;\n if (baseType === SelectionType.UnselectedCells) return true;\n return selections.findIndex((it) => it.type !== baseType) >= 0;\n};\n\n/**\n * Check if current selections are neat.\n * This method is used for make new API are compatible with obsolete API\n * For example:\n * - Selected like <0,0-10,10> or rows<5-10> is neat\n * - Selected like <0,0-10,10>&<11,1-11,10> is untidy\n * @param {SelectionDescriptor[]} selections selections after clean up\n * @returns {boolean}\n */\nconst areSelectionsNeat = (selections) => {\n if (!selections) return false;\n // nothing selected is trivially neat (copy with only an active cell, #566)\n if (selections.length <= 1) return true;\n\n const base = selections[0];\n const baseType = base.type;\n if (baseType === SelectionType.UnselectedCells) return true;\n\n for (let i = 0; i < selections.length; i++) {\n const sel = selections[i];\n if (baseType !== sel.type) return false;\n if (baseType === SelectionType.Cells) {\n if (\n sel.startColumn === base.startColumn &&\n sel.endColumn === base.endColumn\n )\n continue;\n if (sel.startRow === base.startRow && sel.endRow === base.endRow)\n continue;\n // they are not aligned\n return false;\n }\n }\n return true;\n};\n\n/**\n * @param {SelectionDescriptor[]} selections\n * @param {number} offsetX\n * @param {number} offsetY\n */\nconst moveSelections = (selections, offsetX, offsetY) => {\n for (let i = 0; i < selections.length; i++) {\n const selection = selections[i];\n switch (selection.type) {\n case SelectionType.Cells:\n case SelectionType.UnselectedCells:\n selection.startRow += offsetY;\n selection.endRow += offsetY;\n selection.startColumn += offsetX;\n selection.endColumn += offsetX;\n break;\n case SelectionType.Rows:\n selection.startRow += offsetY;\n selection.endRow += offsetY;\n break;\n case SelectionType.Columns:\n selection.startColumn += offsetX;\n selection.endColumn += offsetX;\n break;\n }\n }\n};\n\n/**\n * @param {SelectionDescriptor[]} selections\n * @returns {SelectionDescriptor[]}\n */\nconst cloneSelections = (selections) => {\n const clonedSelections = [];\n for (let i = 0; i < selections.length; i++) {\n const sel = selections[i];\n if (!sel) continue;\n clonedSelections.push(Object.assign({}, sel));\n }\n return clonedSelections;\n};\n\n/**\n * @param {SelectionDescriptor[]} selections\n * @returns {RectangleObject}\n */\nconst getSelectionBounds = (selections) => {\n /**\n * The reason why the initialize values are `Infinity` is used for making\n * the bound is compatible with the obsolete API.\n */\n let top = Infinity,\n bottom = -Infinity,\n left = Infinity,\n right = -Infinity;\n for (let i = 0; i < selections.length; i++) {\n const sel = selections[i];\n if (sel.type === SelectionType.UnselectedCells) continue;\n\n if (typeof sel.startColumn !== 'number') left = 0;\n else if (sel.startColumn < left) left = sel.startColumn;\n\n if (typeof sel.endColumn !== 'number') right = Infinity;\n else if (sel.endColumn > right) right = sel.endColumn;\n\n if (typeof sel.startRow !== 'number') top = 0;\n else if (sel.startRow < top) top = sel.startRow;\n\n if (typeof sel.endRow !== 'number') bottom = Infinity;\n else if (sel.endRow > bottom) bottom = sel.endRow;\n }\n return { top, left, bottom, right };\n};\n\n/**\n * @param {SelectionDescriptor[]} selections\n * @param {object} cell Signature: `{rowIndex:number;columnIndex:number}`\n * @param {object} keyEvent Signature: `{key:string;shiftKey:boolean}`\n * @param {object} context Signature: `{columns:number;rows:number}`\n * @returns {boolean}\n */\nconst shrinkOrExpandSelections = (selections, cell, keyEvent, context) => {\n const { rowIndex, columnIndex } = cell;\n if (rowIndex < 0 || columnIndex < 0) return false;\n\n const keyInfo = {\n ArrowLeft: { x: 1, y: 0, isLeft: true },\n ArrowUp: { x: 0, y: 1, isUp: true },\n ArrowRight: { x: -1, y: 0, isRight: true },\n ArrowDown: { x: 0, y: -1, isDown: true },\n }[keyEvent.key];\n if (!keyInfo) return false;\n\n const originalRowIndex = rowIndex + keyInfo.y;\n const originalColumnIndex = columnIndex + keyInfo.x;\n\n /** @type {number[]} */\n let matchedSelections = [];\n for (let i = 0; i < selections.length; i++) {\n /** @type {SelectionDescriptor} */\n const sel = selections[i];\n switch (sel.type) {\n case SelectionType.Cells:\n case SelectionType.UnselectedCells:\n if (\n (originalRowIndex === sel.startRow ||\n originalRowIndex === sel.endRow) &&\n (originalColumnIndex === sel.startColumn ||\n originalColumnIndex === sel.endColumn)\n ) {\n // we can't shrink or expand from a unselected areas\n if (sel.type === SelectionType.UnselectedCells) return false;\n matchedSelections.push(sel);\n }\n break;\n case SelectionType.Rows:\n if (\n originalRowIndex === sel.startRow ||\n originalRowIndex === sel.endRow\n )\n matchedSelections.push(sel);\n break;\n case SelectionType.Columns:\n if (\n originalColumnIndex === sel.startColumn ||\n originalColumnIndex === sel.endColumn\n )\n matchedSelections.push(sel);\n break;\n }\n }\n // The selection is complex.\n // Or the expanding / shrinking action is not from the border cell of selected area\n if (matchedSelections.length !== 1) return false;\n const selection = matchedSelections[0];\n\n const isTopBorder = selection.startRow === originalRowIndex;\n const isBottomBorder = selection.endRow === originalRowIndex;\n\n const isLeftBorder = selection.startColumn === originalColumnIndex;\n const isRightBorder = selection.endColumn === originalColumnIndex;\n\n const maxRow = context ? context.rows - 1 : Infinity;\n const maxColumn = context ? context.columns - 1 : Infinity;\n\n const afterChange = () => {\n cleanupSelections(selections);\n return true;\n };\n\n if (isTopBorder) {\n if (keyInfo.isUp) {\n // at the topmost row\n if (selection.startRow === 0) return false;\n // expand to the up\n selection.startRow--;\n return afterChange();\n } else if (keyInfo.isDown && selection.startRow < selection.endRow) {\n selection.startRow++;\n return afterChange();\n }\n }\n if (isBottomBorder) {\n if (keyInfo.isDown) {\n // at the bottomost row\n if (selection.endRow >= maxRow) return false;\n // expand to the down\n selection.endRow++;\n return afterChange();\n } else if (keyInfo.isUp && selection.startRow < selection.endRow) {\n selection.endRow--;\n return afterChange();\n }\n }\n if (isLeftBorder) {\n if (keyInfo.isLeft) {\n // at the leftmost column\n if (selection.startColumn === 0) return false;\n // expand to the left\n selection.startColumn--;\n return afterChange();\n } else if (keyInfo.isRight && selection.startColumn < selection.endColumn) {\n selection.startColumn++;\n return afterChange();\n }\n }\n if (isRightBorder) {\n if (keyInfo.isRight) {\n // at the rightmost column\n if (selection.endColumn >= maxColumn) return false;\n // expand to the down\n selection.endColumn++;\n return afterChange();\n } else if (keyInfo.isLeft && selection.startColumn < selection.endColumn) {\n selection.endColumn--;\n return afterChange();\n }\n }\n return false;\n};\n\nexport {\n SelectionType,\n getSelectionFromString,\n normalizeSelection,\n addIntoSelections,\n removeFromSelections,\n mergeSelections,\n removePartOfRowsSelection,\n removePartOfColumnsSelection,\n removePartOfCellsSelection,\n cleanupSelections,\n getIntersection,\n isRowSelected,\n isColumnSelected,\n isCellSelected,\n areAllCellsSelected,\n areSelectionsNeat,\n getSelectionStateFromCells,\n getVerboseSelectionStateFromCells,\n areSelectionsComplex,\n getSelectedContiguousColumns,\n getSelectedContiguousRows,\n moveSelections,\n cloneSelections,\n getSelectionBounds,\n shrinkOrExpandSelections,\n};\n","module.exports=function(e){var o={};function a(t){if(o[t])return o[t].exports;var r=o[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,a),r.l=!0,r.exports}return a.m=e,a.c=o,a.d=function(e,o,t){a.o(e,o)||Object.defineProperty(e,o,{enumerable:!0,get:t})},a.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},a.t=function(e,o){if(1&o&&(e=a(e)),8&o)return e;if(4&o&&\"object\"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(a.r(t),Object.defineProperty(t,\"default\",{enumerable:!0,value:e}),2&o&&\"string\"!=typeof e)for(var r in e)a.d(t,r,function(o){return e[o]}.bind(null,r));return t},a.n=function(e){var o=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(o,\"a\",o),o},a.o=function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},a.p=\"\",a(a.s=0)}([function(e,o,a){\"use strict\";Object.defineProperty(o,\"__esModule\",{value:!0});var t=a(1),r=Object.keys(t.default).reduce((function(e,o){return e.concat(t.default[o])}),[]);o.default=function(e){return-1===r.indexOf(e.key)}},function(e,o,a){\"use strict\";Object.defineProperty(o,\"__esModule\",{value:!0});o.default={modifier:[\"Alt\",\"AltGraph\",\"CapsLock\",\"Control\",\"Fn\",\"FnLock\",\"Meta\",\"NumLock\",\"ScrollLock\",\"Shift\",\"Symbol\",\"SymbolLock\"],legacyModifier:[\"Hyper\",\"Super\"],whiteSpace:[\"Enter\",\"Tab\"],navigation:[\"ArrowDown\",\"ArrowLeft\",\"ArrowRight\",\"ArrowUp\",\"End\",\"Home\",\"PageDown\",\"PageUp\"],editing:[\"Backspace\",\"Clear\",\"Copy\",\"CrSel\",\"Cut\",\"Delete\",\"EraseEof\",\"ExSel\",\"Insert\",\"Paste\",\"Redo\",\"Undo\"],ui:[\"Accept\",\"Again\",\"Attn\",\"Cancel\",\"ContextMenu\",\"Escape\",\"Execute\",\"Find\",\"Help\",\"Pause\",\"Play\",\"Props\",\"Select\",\"ZoomIn\",\"ZoomOut\"],device:[\"BrightnessDown\",\"BrightnessUp\",\"Eject\",\"LogOff\",\"Power\",\"PowerOff\",\"PrintScreen\",\"Hibernate\",\"Standby\",\"WakeUp\"],imeCompositionKeys:[\"AllCandidates\",\"Alphanumeric\",\"CodeInput\",\"Compose\",\"Convert\",\"Dead\",\"FinalMode\",\"GroupFirst\",\"GroupLast\",\"GroupNext\",\"GroupPrevious\",\"ModeChange\",\"NextCandidate\",\"NonConvert\",\"PreviousCandidate\",\"Process\",\"SingleCandidate\"],koreanSpecific:[\"HangulMode\",\"HanjaMode\",\"JunjaMode\"],japaneseSpecific:[\"Eisu\",\"Hankaku\",\"Hiragana\",\"HiraganaKatakana\",\"KanaMode\",\"KanjiMode\",\"Katakana\",\"Romaji\",\"Zenkaku\",\"ZenkakuHankaku\"],commonFunction:[\"F1\",\"F2\",\"F3\",\"F4\",\"F5\",\"F6\",\"F7\",\"F8\",\"F9\",\"F10\",\"F11\",\"F12\",\"Soft1\",\"Soft2\",\"Soft3\",\"Soft4\"],multimedia:[\"ChannelDown\",\"ChannelUp\",\"Close\",\"MailForward\",\"MailReply\",\"MailSend\",\"MediaClose\",\"MediaFastForward\",\"MediaPause\",\"MediaPlay\",\"MediaPlayPause\",\"MediaRecord\",\"MediaRewind\",\"MediaStop\",\"MediaTrackNext\",\"MediaTrackPrevious\",\"New\",\"Open\",\"Print\",\"Save\",\"SpellCheck\"],multimediaNumpad:[\"Key11\",\"Key12\"],audio:[\"AudioBalanceLeft\",\"AudioBalanceRight\",\"AudioBassBoostDown\",\"AudioBassBoostToggle\",\"AudioBassBoostUp\",\"AudioFaderFront\",\"AudioFaderRear\",\"AudioSurroundModeNext\",\"AudioTrebleDown\",\"AudioTrebleUp\",\"AudioVolumeDown\",\"AudioVolumeUp\",\"AudioVolumeMute\",\"MicrophoneToggle\",\"MicrophoneVolumeDown\",\"MicrophoneVolumeUp\",\"MicrophoneVolumeMute\"],speech:[\"SpeechCorrectionList\",\"SpeechInputToggle\"],application:[\"LaunchApplication1\",\"LaunchApplication2\",\"LaunchCalendar\",\"LaunchContacts\",\"LaunchMail\",\"LaunchMediaPlayer\",\"LaunchMusicPlayer\",\"LaunchPhone\",\"LaunchScreenSaver\",\"LaunchSpreadsheet\",\"LaunchWebBrowser\",\"LaunchWebCam\",\"LaunchWordProcessor\"],browser:[\"BrowserBack\",\"BrowserFavorites\",\"BrowserForward\",\"BrowserHome\",\"BrowserRefresh\",\"BrowserSearch\",\"BrowserStop\"],mobilePhone:[\"AppSwitch\",\"Call\",\"Camera\",\"CameraFocus\",\"EndCall\",\"GoBack\",\"GoHome\",\"HeadsetHook\",\"LastNumberRedial\",\"Notification\",\"MannerMode\",\"VoiceDial\"],tv:[\"TV\",\"TV3DMode\",\"TVAntennaCable\",\"TVAudioDescription\",\"TVAudioDescriptionMixDown\",\"TVAudioDescriptionMixUp\",\"TVContentsMenu\",\"TVDataService\",\"TVInput\",\"TVInputComponent1\",\"TVInputComponent2\",\"TVInputComposite1\",\"TVInputComposite2\",\"TVInputHDMI1\",\"TVInputHDMI2\",\"TVInputHDMI3\",\"TVInputHDMI4\",\"TVInputVGA1\",\"TVMediaContext\",\"TVNetwork\",\"TVNumberEntry\",\"TVPower\",\"TVRadioService\",\"TVSatellite\",\"TVSatelliteBS\",\"TVSatelliteCS\",\"TVSatelliteToggle\",\"TVTerrestrialAnalog\",\"TVTerrestrialDigital\",\"TVTimer\"],mediaControls:[\"AVRInput\",\"AVRPower\",\"ColorF0Red\",\"ColorF1Green\",\"ColorF2Yellow\",\"ColorF3Blue\",\"ColorF4Grey\",\"ColorF5Brown\",\"ClosedCaptionToggle\",\"Dimmer\",\"DisplaySwap\",\"DVR\",\"Exit\",\"FavoriteClear0\",\"FavoriteClear1\",\"FavoriteClear2\",\"FavoriteClear3\",\"FavoriteRecall0\",\"FavoriteRecall1\",\"FavoriteRecall2\",\"FavoriteRecall3\",\"FavoriteStore0\",\"FavoriteStore1\",\"FavoriteStore2\",\"FavoriteStore3\",\"Guide\",\"GuideNextDay\",\"GuidePreviousDay\",\"Info\",\"InstantReplay\",\"Link\",\"ListProgram\",\"LiveContent\",\"Lock\",\"MediaApps\",\"MediaAudioTrack\",\"MediaLast\",\"MediaSkipBackward\",\"MediaSkipForward\",\"MediaStepBackward\",\"MediaStepForward\",\"MediaTopMenu\",\"NavigateIn\",\"NavigateNext\",\"NavigateOut\",\"NavigatePrevious\",\"NextFavoriteChannel\",\"NextUserProfile\",\"OnDemand\",\"Pairing\",\"PinPDown\",\"PinPMove\",\"PinPToggle\",\"PinPUp\",\"PlaySpeedDown\",\"PlaySpeedReset\",\"PlaySpeedUp\",\"RandomToggle\",\"RcLowBattery\",\"RecordSpeedNext\",\"RfBypass\",\"ScanChannelsToggle\",\"ScreenModeNext\",\"Settings\",\"SplitScreenToggle\",\"STBInput\",\"STBPower\",\"Subtitle\",\"Teletext\",\"VideoModeNext\",\"Wink\",\"ZoomToggle\"]}}]).default;","'use strict';\n\nconst isSupportedHtml = function (pasteValue) {\n // We need to match new lines in the HTML, .* won't match new line characters.\n // `s` regex modifier can't be used with `ecmaVersion === 2017`.\n // As a workaround using [\\s\\S]*. Fix when we upgrade `ecmaVersion`.\n const genericDiv = /(?:^(<meta[^>]*>)?[\\s\\S]*<div[^>]*>)/;\n const genericSpan = /(?:^(<meta[^>]*>)?[\\s\\S]*<span[^>]*>)/;\n const genericTable = /(?:^(<meta[^>]*>)?[\\s\\S]*<table[^>]*>)/; // Matches Google Sheets format clipboard data format too.\n const excelTable = /(?:<!--StartFragment-->[\\s\\S]*<tr[^>]*>)/;\n const excelTableRow = /(?:<!--StartFragment-->[\\s\\S]*<td[^>]*>)/;\n\n return [\n genericDiv,\n genericTable,\n genericSpan,\n excelTable,\n excelTableRow,\n ].some((expression) => expression.test(pasteValue));\n};\n\n// Explanation of nodeType here: https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst IGNORE_NODETYPES = [8, 3]; // '#text' and '#comment'\n\nconst isHtmlTable = function (pasteValue) {\n return /(?:<table[^>]*>)|(?:<tr[^]*>)/.test(pasteValue);\n};\n\nconst sanitizeElementData = function (element) {\n // It is not entirely clear if this check on nodeType is required.\n let elementData = element.nodeType === 1 ? element.innerText : element.data;\n\n return String(elementData).replace(/\\s+/g, ' ').trim();\n};\n\nconst parseHtmlText = function (data) {\n const doc = new DOMParser().parseFromString(data, 'text/html');\n const element = doc.querySelector('div') || doc.querySelector('span');\n const elementData = sanitizeElementData(element);\n\n return elementData\n .split('\\n')\n .map((item) => item.split('\\t').map((value) => ({ value: [{ value }] })));\n};\n\nconst parseHtmlTable = function (data) {\n const doc = new DOMParser().parseFromString(data, 'text/html');\n const trs = doc.querySelectorAll('table tr');\n const rows = [];\n\n for (const tr of trs) {\n const row = [];\n\n for (const childNode of tr.childNodes) {\n if (IGNORE_NODETYPES.includes(childNode.nodeType)) continue;\n\n const col = { value: [] };\n const value = sanitizeElementData(childNode);\n\n if (value) col.value.push({ value });\n\n row.push(col);\n }\n\n rows.push(row);\n }\n\n return rows;\n};\n\nconst parseText = function (data) {\n return data\n .split('\\n')\n .map((item) => item.split('\\t').map((value) => ({ value: [{ value }] })));\n};\n\nconst parseData = function (data, mimeType) {\n if (mimeType === 'text/html' && isHtmlTable(data)) {\n return parseHtmlTable(data);\n } else if (mimeType === 'text/html') {\n return parseHtmlText(data);\n }\n\n // Default data format is string, so split on new line,\n // and then enclose in an array (a row with one cell):\n return parseText(data);\n};\n\nconst htmlSafe = function (value) {\n if (typeof value !== 'string') return value;\n\n return value.replace(/</g, '<').replace(/>/g, '>');\n};\n\nconst createTextString = function (selectedData, isNeat) {\n // Selected like [[0, 1], [0, 1]] of [[0, 3]] is neat; Selected like [[0, 1], [1, 2]] is untidy.\n // If not isNeat we just return a simple string of concatenated values.\n if (!isNeat)\n return selectedData.map((row) => Object.values(row).join('')).join('');\n\n // If isNeat, we can create tab separated mutti-line text.\n return selectedData.map((row) => Object.values(row).join('\\t')).join('\\n');\n};\n\nconst createHTMLString = function (selectedData, isNeat) {\n if (!isNeat) return createTextString(selectedData, isNeat);\n\n // If isNeat, we can create a HTML table with the selected data.\n let htmlString = '<table>';\n htmlString += selectedData\n .map(\n (row) =>\n '<tr>' +\n Object.values(row)\n .map((value) => ['<td>', htmlSafe(value), '</td>'].join(''))\n .join('') +\n '</tr>',\n )\n .join('');\n htmlString += '</table>';\n\n return htmlString;\n};\n\n/**\n * deduce the type of values in the column 'colNum' of data represented by 'rows'\n * if the column is not empty and all values in the column are numbers, then the type is 'number',\n * otherwise the type is 'string'.\n * Purpose: check the type of pasted data when a new column is created dynamically\n * @param {Array} rows - array of rows, e.g. [ [{\"value\": [{\"value\": \"a\"}]},{\"value\": [{\"value\": \"b\"}]}], [{\"value\": [{\"value\": \"1\"}]},{\"value\": [{\"value\": \"2\"}]}] ]\n * @param {number} colNum - Column index to check\n * @returns {(\"string\" | \"number\")} deduced type\n */\nconst deduceColTypeFromData = function (rows, colNum) {\n const len = rows.length;\n // the first row can represent column headings.\n // if one row is pasted, check it, otherwise start from the second row.\n const startRow = len === 1 ? 0 : 1;\n let isColEmpty = true;\n for (let i = startRow; i < len; i += 1) {\n const cellData = rows[i][colNum];\n if (!cellData || cellData.value.length === 0) {\n continue;\n }\n isColEmpty = false;\n const val = cellData.value[0].value;\n if (!Number.isFinite(Number(val))) {\n return 'string';\n }\n }\n return isColEmpty ? 'string' : 'number';\n};\n\nexport {\n createTextString,\n createHTMLString,\n isSupportedHtml,\n htmlSafe,\n parseData,\n parseHtmlTable,\n parseHtmlText,\n parseText,\n sanitizeElementData,\n deduceColTypeFromData,\n};\n","/*jslint browser: true, unparam: true, todo: true, evil: true*/\n/*globals Reflect: false, HTMLElement: true, define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport component from './component';\nimport defaults from './defaults';\nimport draw from './draw';\nimport events from './events';\nimport touch from './touch';\nimport intf from './intf';\nimport selections from './selections/index';\nimport contextMenu from './contextMenu';\nimport button from './button';\nimport dom from './dom';\nimport publicMethods from './publicMethods';\n\nvar webComponent = component();\n\nvar modules = [\n defaults,\n draw,\n events,\n touch,\n intf,\n selections,\n contextMenu,\n button,\n dom,\n publicMethods,\n];\n\nfunction Grid(args) {\n args = args || {};\n var self = {};\n self.isComponent = args.component === undefined;\n self.isChildGrid =\n args.parentNode &&\n /canvas-datagrid-(cell|tree)/.test(args.parentNode.nodeType);\n if (self.isChildGrid) {\n self.intf = {};\n } else {\n // Written directly (no eval) so the bundle works under a Content Security\n // Policy without 'unsafe-eval' (#311); ES5-only browsers are not targeted.\n self.intf = self.isComponent\n ? Reflect.construct(HTMLElement, [], new.target)\n : document.createElement('canvas');\n }\n self.args = args;\n self.intf.args = args;\n self.applyComponentStyle = webComponent.applyComponentStyle;\n self.hyphenateProperty = webComponent.hyphenateProperty;\n self.dehyphenateProperty = webComponent.dehyphenateProperty;\n self.createGrid = function grid(args) {\n args.component = false;\n return new Grid(args);\n };\n\n modules.forEach(function (module) {\n module(self);\n });\n\n if (self.isChildGrid) {\n self.shadowRoot = args.parentNode.shadowRoot;\n self.parentNode = args.parentNode;\n } else {\n self.shadowRoot = self.intf.attachShadow({ mode: 'open' });\n self.parentNode = self.shadowRoot;\n }\n self.init();\n return self.intf;\n}\nif (window.HTMLElement) {\n Grid.prototype = Object.create(window.HTMLElement.prototype);\n}\n// export web component\nif (window.customElements) {\n Grid.observedAttributes = webComponent.getObservableAttributes();\n Grid.prototype.disconnectedCallback = webComponent.disconnectedCallback;\n Grid.prototype.attributeChangedCallback =\n webComponent.attributeChangedCallback;\n Grid.prototype.connectedCallback = webComponent.connectedCallback;\n Grid.prototype.adoptedCallback = webComponent.adoptedCallback;\n window.customElements.define('canvas-datagrid', Grid);\n}\n\n// export global\nif (\n window &&\n !window.canvasDatagrid &&\n !window.require &&\n // Present to exclude global declarations from ES Module bundles\n !window.EXCLUDE_GLOBAL\n) {\n window.canvasDatagrid = function (args) {\n return new Grid(args);\n };\n}\n\n// export amd loader\nexport default function canvasDatagrid(args) {\n args = args || {};\n var i,\n tKeys = [\n 'style',\n 'formatters',\n 'sorters',\n 'filters',\n 'treeGridAttributes',\n 'cellGridAttributes',\n 'fillCellCallback',\n 'data',\n 'schema',\n ];\n if (window.customElements) {\n i = document.createElement('canvas-datagrid');\n Object.keys(args).forEach(function (argKey) {\n // set data and parentNode after everything else\n if (argKey === 'data') {\n return;\n }\n if (argKey === 'parentNode') {\n return;\n }\n // top level keys in args\n if (tKeys.indexOf(argKey) !== -1) {\n tKeys.forEach(function (tKey) {\n if (args[tKey] === undefined || tKey !== argKey) {\n return;\n }\n if (['formatters', 'sorters', 'filters'].indexOf(argKey) !== -1) {\n if (typeof args[tKey] === 'object' && args[tKey] !== null) {\n Object.keys(args[tKey]).forEach(function (sKey) {\n i[tKey][sKey] = args[tKey][sKey];\n });\n }\n } else {\n i[tKey] = args[tKey];\n }\n });\n return;\n }\n // all others are attribute level keys\n i.attributes[argKey] = args[argKey];\n });\n if (args.data) {\n i.data = args.data;\n }\n // add to the dom very last to avoid redraws\n if (args.parentNode) {\n args.parentNode.appendChild(i);\n }\n return i;\n }\n args.component = false;\n i = new Grid(args);\n if (args.parentNode && args.parentNode.appendChild) {\n args.parentNode.appendChild(i);\n }\n return i;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport defaults from './defaults';\n\nexport default function () {\n var typeMap,\n component = {};\n component.dehyphenateProperty = function hyphenateProperty(prop) {\n prop = prop.replace('--cdg-', '');\n var p = '',\n nextLetterCap;\n Array.prototype.forEach.call(prop, function (char) {\n if (nextLetterCap) {\n nextLetterCap = false;\n p += char.toUpperCase();\n return;\n }\n if (char === '-') {\n nextLetterCap = true;\n return;\n }\n p += char;\n });\n return p;\n };\n component.hyphenateProperty = function hyphenateProperty(prop, cust) {\n var p = '';\n Array.prototype.forEach.call(prop, function (char) {\n if (char === char.toUpperCase()) {\n p += '-' + char.toLowerCase();\n return;\n }\n p += char;\n });\n return (cust ? '--cdg-' : '') + p;\n };\n function getDefaultItem(base, item) {\n var i = {},\n r;\n defaults(i);\n r = i.defaults[base].filter(function (i) {\n return (\n i[0].toLowerCase() === item.toLowerCase() ||\n component.hyphenateProperty(i[0]) === item.toLowerCase() ||\n component.hyphenateProperty(i[0], true) === item.toLowerCase()\n );\n })[0];\n return r;\n }\n component.applyComponentStyle = function (supressChangeAndDrawEvents, intf) {\n if (!intf.isComponent) {\n return;\n }\n var cStyle = window.getComputedStyle(\n intf.tagName === 'CANVAS-DATAGRID' ? intf : intf.canvas,\n null,\n ),\n defs = {};\n intf.computedStyle = cStyle;\n defaults(defs);\n defs.defaults.styles.forEach(function (def) {\n var val;\n val = cStyle.getPropertyValue(component.hyphenateProperty(def[0], true));\n if (val === '') {\n val = cStyle.getPropertyValue(\n component.hyphenateProperty(def[0], false),\n );\n }\n if (\n /^overflow[XY]$/.test(def[0]) &&\n typeof val === 'string' &&\n val.trim() === 'visible'\n ) {\n // 'visible' is the CSS default, not something the page asked for,\n // and not a grid value: keep the overflow set through grid.style\n // instead of overwriting it on every style pass (#248)\n return;\n }\n if (val !== '' && typeof val === 'string') {\n intf.setStyleProperty(\n def[0],\n typeMap[typeof def[1]](\n val.replace(/^\\s+/, '').replace(/\\s+$/, ''),\n def[1],\n ),\n true,\n );\n }\n });\n if (!supressChangeAndDrawEvents && intf.dispatchEvent) {\n requestAnimationFrame(function () {\n intf.resize(true);\n });\n intf.dispatchEvent('stylechanged', intf.style);\n }\n };\n typeMap = {\n data: function (strData) {\n try {\n return JSON.parse(strData);\n } catch (e) {\n throw new Error('Cannot read JSON data in canvas-datagrid data.');\n }\n },\n schema: function (strSchema) {\n try {\n return JSON.parse(strSchema);\n } catch (e) {\n throw new Error(\n 'Cannot read JSON data in canvas-datagrid schema attribute.',\n );\n }\n },\n number: function (strNum, def) {\n var n = parseInt(strNum, 10);\n return isNaN(n) ? def : n;\n },\n boolean: function (strBool) {\n return /true/i.test(strBool);\n },\n string: function (str) {\n return str;\n },\n };\n component.getObservableAttributes = function () {\n var i = {},\n attrs = ['data', 'schema', 'style', 'className', 'name'];\n defaults(i);\n i.defaults.attributes.forEach(function (attr) {\n attrs.push(attr[0].toLowerCase());\n });\n return attrs;\n };\n component.disconnectedCallback = function () {\n this.connected = false;\n // stop observing while detached so a removed grid can be collected (#338)\n if (this.observer && this.observer.disconnect) {\n this.observer.disconnect();\n this.observer = undefined;\n }\n if (typeof this.unobserveResizeTargets === 'function') {\n this.unobserveResizeTargets();\n }\n };\n component.connectedCallback = function () {\n var intf = this;\n intf.parentDOMNode.innerHTML = '';\n intf.parentDOMNode.appendChild(intf.canvas);\n intf.connected = true;\n component.observe(intf);\n if (typeof intf.observeResizeTargets === 'function') {\n intf.observeResizeTargets();\n }\n component.applyComponentStyle(true, intf);\n intf.resize(true);\n };\n component.adoptedCallback = function () {\n this.resize();\n };\n component.attributeChangedCallback = function (attrName, oldVal, newVal) {\n var tfn,\n intf = this,\n def;\n if (attrName === 'style') {\n component.applyComponentStyle(false, intf);\n return;\n }\n if (attrName === 'data') {\n if (intf.dataType === 'application/x-canvas-datagrid') {\n intf.dataType = 'application/json+x-canvas-datagrid';\n }\n intf.data = newVal;\n return;\n }\n if (attrName === 'schema') {\n intf.schema = typeMap.schema(newVal);\n return;\n }\n if (attrName === 'name') {\n intf.name = newVal;\n return;\n }\n if (attrName === 'class' || attrName === 'className') {\n return;\n }\n def = getDefaultItem('attributes', attrName);\n if (def) {\n tfn = typeMap[typeof def[1]];\n intf.attributes[def[0]] = tfn(newVal);\n return;\n }\n if (/^on/.test(attrName)) {\n // inline handler attributes need the Function constructor, which a\n // strict Content Security Policy forbids; degrade with a warning (#311)\n var handler;\n try {\n handler = new Function('e', newVal);\n } catch (err) {\n console.warn(\n 'canvas-datagrid: cannot bind the %s attribute under the current Content Security Policy; use addEventListener instead.',\n attrName,\n );\n return;\n }\n intf.addEventListener('on' + attrName, handler);\n }\n return;\n };\n component.observe = function (intf) {\n var observer;\n if (!window.MutationObserver) {\n return;\n }\n // connectedCallback runs on every (re)attach: never stack observers (#338)\n if (intf.observer && intf.observer.disconnect) {\n intf.observer.disconnect();\n }\n intf.applyComponentStyle = function () {\n component.applyComponentStyle(false, intf);\n intf.resize();\n };\n /**\n * Applies the computed css styles to the grid. In some browsers, changing directives in attached style sheets does not automatically update the styles in this component. It is necessary to call this method to update in these cases.\n * @memberof canvasDatagrid\n * @name applyComponentStyle\n * @method\n */\n observer = new window.MutationObserver(function (mutations) {\n var checkInnerHTML, checkStyle;\n Array.prototype.forEach.call(mutations, function (mutation) {\n if (\n mutation.attributeName === 'class' ||\n mutation.attributeName === 'style'\n ) {\n checkStyle = true;\n return;\n }\n if (mutation.target.nodeName === 'STYLE') {\n checkStyle = true;\n return;\n }\n if (\n mutation.target.parentNode &&\n mutation.target.parentNode.nodeName === 'STYLE'\n ) {\n checkStyle = true;\n return;\n }\n if (\n mutation.target === intf &&\n (mutation.addedNodes.length > 0 || mutation.type === 'characterData')\n ) {\n checkInnerHTML = true;\n }\n });\n if (checkStyle) {\n intf.applyComponentStyle(false, intf);\n }\n if (checkInnerHTML) {\n if (intf.dataType === 'application/x-canvas-datagrid') {\n intf.dataType = 'application/json+x-canvas-datagrid';\n }\n intf.data = intf.innerHTML;\n }\n });\n intf.observer = observer;\n observer.observe(intf, {\n characterData: true,\n childList: true,\n attributes: true,\n subtree: true,\n });\n Array.prototype.forEach.call(\n document.querySelectorAll('style'),\n function (el) {\n observer.observe(el, {\n characterData: true,\n childList: true,\n attributes: true,\n subtree: true,\n });\n },\n );\n };\n return component;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals XMLSerializer: false, define: true, Blob: false, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport { isCellSelected } from './selections/util';\n\nexport default function (self) {\n var perfCounters = [],\n cachedImagesDrawn = false,\n drawCount = 0,\n perfWindowSize = 300,\n entityCount = [],\n hiddenFrozenColumnCount = 0,\n scrollDebugCounters = [],\n touchPPSCounters = [];\n self.htmlImageCache = {};\n // more heavyweight version than fillArray defined in intf.js\n function fillArray(low, high, step, def) {\n step = step || 1;\n var i = [],\n x;\n for (x = low; x <= high; x += step) {\n i[x] = def === undefined ? x : typeof def === 'function' ? def(x) : def;\n }\n return i;\n }\n function drawPerfLine(w, h, x, y, perfArr, arrIndex, max, color, useAbs) {\n var i = w / perfArr.length,\n r = h / max;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.moveTo(x, y + h);\n perfArr.forEach(function (n) {\n var val = arrIndex === undefined ? n : n[arrIndex],\n cx,\n cy;\n if (useAbs) {\n val = Math.abs(val);\n }\n cx = x + i;\n cy = y + h - val * r;\n self.ctx.lineTo(cx, cy);\n x += i;\n });\n self.ctx.moveTo(x + w, y + h);\n self.ctx.strokeStyle = color;\n self.ctx.stroke();\n }\n function drawOnAllImagesLoaded() {\n var loaded = true;\n Object.keys(self.htmlImageCache).forEach(function (html) {\n if (!self.htmlImageCache[html].img.complete) {\n loaded = false;\n }\n });\n if (loaded && !cachedImagesDrawn) {\n cachedImagesDrawn = true;\n self.draw();\n }\n }\n function drawHtml(cell) {\n var img,\n v = cell.innerHTML || cell.formattedValue,\n cacheKey =\n v.toString() + cell.rowIndex.toString() + cell.columnIndex.toString(),\n x = Math.round(cell.x + self.canvasOffsetLeft),\n y = Math.round(cell.y + self.canvasOffsetTop);\n if (self.htmlImageCache[cacheKey]) {\n img = self.htmlImageCache[cacheKey].img;\n if (\n self.htmlImageCache[cacheKey].height !== cell.height ||\n self.htmlImageCache[cacheKey].width !== cell.width\n ) {\n // height and width of the cell has changed, invalidate cache\n self.htmlImageCache[cacheKey] = undefined;\n } else {\n if (!img.complete) {\n return;\n }\n return self.ctx.drawImage(img, x, y);\n }\n } else {\n cachedImagesDrawn = false;\n }\n img = new Image(cell.width, cell.height);\n self.htmlImageCache[cacheKey] = {\n img,\n width: cell.width,\n height: cell.height,\n };\n img.onload = function () {\n self.ctx.drawImage(img, x, y);\n drawOnAllImagesLoaded();\n };\n img.src =\n 'data:image/svg+xml;base64,' +\n btoa(\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"' +\n cell.width +\n '\" height=\"' +\n cell.height +\n '\">\\n' +\n '<foreignObject class=\"node\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\">\\n' +\n '<body xmlns=\"http://www.w3.org/1999/xhtml\" style=\"margin:0;padding:0;\">\\n' +\n v +\n '\\n' +\n '</body>' +\n '</foreignObject>\\n' +\n '</svg>\\n',\n );\n }\n /**\n * @param {number[]} coords [x0,y0, x1,y1, x2,y2, ...]\n * @param {boolean} [fill] fill the area that construct by these lines but not stroke\n */\n function drawLines(coords, fill) {\n if (coords.length < 4) return;\n self.ctx.beginPath();\n self.ctx.moveTo(\n coords[0] + self.canvasOffsetLeft,\n coords[1] + self.canvasOffsetTop,\n );\n for (let i = 2; i < coords.length; i += 2) {\n const x = coords[i] + self.canvasOffsetLeft;\n const y = coords[i + 1] + self.canvasOffsetTop;\n self.ctx.lineTo(x, y);\n }\n if (fill) self.ctx.fill();\n else self.ctx.stroke();\n }\n /**\n * @param {number} x based-X (left-top)\n * @param {number} y based-Y (left-top)\n * @param {number} width\n * @param {boolean} collapsed true: '+'; false: '-'\n */\n function drawGroupHandle(x, y, width, collapsed) {\n fillRect(x, y, width, width);\n strokeRect(x, y, width, width);\n const cx = x + width * 0.5;\n const cy = y + width * 0.5;\n drawLines([x + width * 0.2, cy, x + width * 0.78, cy]);\n if (collapsed) drawLines([cx, y + width * 0.22, cx, y + width * 0.8]);\n }\n /**\n * @param {number} x\n * @param {number} y\n * @param {number} size\n * @param {string} dir Direction of the triangle, one of the 't','b','l' and 'r'\n * @param {boolean} [active]\n */\n function drawUnhideIndicator(x, y, size, dir, active) {\n const minPadding = size * 0.2;\n const maxPadding = size * 0.3;\n /** The long edge width of the triangle */\n const longEdge = size - 2 * minPadding;\n /** The median width of the triangle */\n const median = size - 2 * maxPadding;\n const halfLongEdge = longEdge * 0.5;\n let x0, y0;\n let coords, borderCoords;\n switch (dir) {\n case 'r':\n x0 = x + maxPadding;\n y0 = y + minPadding;\n borderCoords = [x, y, x + size, y, x + size, y + size, x, y + size];\n coords = [x0, y0, x0, y0 + longEdge, x0 + median, y0 + halfLongEdge];\n break;\n case 'l':\n x0 = x + size - maxPadding;\n y0 = y + minPadding;\n borderCoords = [x + size, y, x, y, x, y + size, x + size, y + size];\n coords = [x0, y0, x0, y0 + longEdge, x0 - median, y0 + halfLongEdge];\n break;\n case 't':\n x0 = x + minPadding;\n y0 = y + size - maxPadding;\n borderCoords = [x, y + size, x, y, x + size, y, x + size, y + size];\n coords = [x0, y0, x0 + longEdge, y0, x0 + halfLongEdge, y0 - median];\n break;\n case 'b':\n x0 = x + minPadding;\n y0 = y + maxPadding;\n borderCoords = [x, y, x, y + size, x + size, y + size, x + size, y];\n coords = [x0, y0, x0 + longEdge, y0, x0 + halfLongEdge, y0 + median];\n break;\n }\n\n if (active) {\n self.ctx.strokeStyle = self.style.unhideIndicatorBorderColor;\n self.ctx.lineWidth = 2;\n drawLines(borderCoords);\n\n self.ctx.fillStyle = self.style.unhideIndicatorBackgroundColor;\n let offset = dir === 'r' || dir === 'b' ? 1 : 0;\n if (dir === 'l' || dir === 'r')\n fillRect(x - offset, y, size + offset, size);\n else fillRect(x, y - offset, size, size + offset);\n }\n\n self.ctx.fillStyle = self.style.unhideIndicatorColor;\n drawLines(coords, true);\n }\n function drawOrderByArrow(x, y) {\n var mt = self.style.columnHeaderOrderByArrowMarginTop * self.scale,\n ml = self.style.columnHeaderOrderByArrowMarginLeft * self.scale,\n mr = self.style.columnHeaderOrderByArrowMarginRight * self.scale,\n aw = self.style.columnHeaderOrderByArrowWidth * self.scale,\n ah = self.style.columnHeaderOrderByArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.columnHeaderOrderByArrowColor;\n self.ctx.strokeStyle = self.style.columnHeaderOrderByArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n if (self.orderDirection === 'asc') {\n self.ctx.lineTo(x, y + ah);\n self.ctx.lineTo(x + aw, y + ah);\n self.ctx.lineTo(x + aw * 0.5, y);\n self.ctx.lineTo(x, y + ah);\n } else {\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n }\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw + mr;\n }\n function drawTreeArrow(cell, x, y) {\n var mt = self.style.treeArrowMarginTop * self.scale,\n mr = self.style.treeArrowMarginRight * self.scale,\n ml = self.style.treeArrowMarginLeft * self.scale,\n aw = self.style.treeArrowWidth * self.scale,\n ah = self.style.treeArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.treeArrowColor;\n self.ctx.strokeStyle = self.style.treeArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n if (self.openChildren[cell.rowIndex]) {\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n } else {\n self.ctx.lineTo(x, y);\n self.ctx.lineTo(x + ah, y + aw * 0.5);\n self.ctx.lineTo(x, y + aw);\n self.ctx.lineTo(x, y);\n }\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw + mr;\n }\n function drawCellTreeIcon(cell, tree, rowTree) {\n const parentCount = rowTree ? tree.parentCount : 0;\n const iconSize = self.style.cellTreeIconWidth * self.scale,\n marginTop = self.style.cellTreeIconMarginTop * self.scale,\n marginRight = self.style.cellTreeIconMarginRight * self.scale,\n marginLeft =\n self.style.cellTreeIconMarginLeft * self.scale +\n parentCount * (iconSize + cell.paddingLeft);\n\n let x = cell.x + cell.paddingLeft + self.canvasOffsetLeft + marginLeft,\n y = cell.y + self.canvasOffsetTop + marginTop;\n\n if (tree.icon) {\n self.ctx.beginPath();\n const oldFillStyle = self.ctx.fillStyle;\n const oldStrokeStyle = self.ctx.strokeStyle;\n\n if (cell.hovered && self.hovers.onCellTreeIcon) {\n self.ctx.fillStyle = self.style.cellTreeIconHoverFillColor;\n } else {\n self.ctx.fillStyle = self.style.cellTreeIconFillColor;\n }\n\n self.ctx.fillRect(x, y, iconSize, iconSize);\n self.ctx.strokeStyle = self.style.cellTreeIconBorderColor;\n self.ctx.rect(x, y, iconSize, iconSize);\n self.ctx.stroke();\n\n self.ctx.beginPath();\n if (tree.expand) {\n self.ctx.moveTo(x + 3, y + iconSize * 0.5);\n self.ctx.lineTo(x + iconSize - 3, y + iconSize * 0.5);\n } else {\n self.ctx.moveTo(x + 2, y + iconSize * 0.5);\n self.ctx.lineTo(x + iconSize - 2, y + iconSize * 0.5);\n self.ctx.moveTo(x + iconSize * 0.5, y + 2);\n self.ctx.lineTo(x + iconSize * 0.5, y + iconSize - 2);\n }\n self.ctx.lineWidth = self.style.cellTreeIconLineWidth;\n self.ctx.strokeStyle = self.style.cellTreeIconLineColor;\n self.ctx.stroke();\n\n self.ctx.strokeStyle = oldStrokeStyle;\n self.ctx.fillStyle = oldFillStyle;\n }\n\n return marginLeft + iconSize + marginRight;\n }\n function drawFilterButtonArrow(x, y) {\n var mt =\n ((self.style.filterButtonHeight - self.style.filterButtonArrowHeight) /\n 2) *\n self.scale,\n ml =\n ((self.style.filterButtonWidth - self.style.filterButtonArrowWidth) /\n 2) *\n self.scale,\n aw = self.style.filterButtonArrowWidth * self.scale,\n ah = self.style.filterButtonArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.filterButtonArrowColor;\n self.ctx.strokeStyle = self.style.filterButtonArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw;\n }\n function radiusRect(x, y, w, h, radius) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n var r = x + w,\n b = y + h;\n self.ctx.beginPath();\n self.ctx.moveTo(x + radius, y);\n self.ctx.lineTo(r - radius, y);\n self.ctx.quadraticCurveTo(r, y, r, y + radius);\n self.ctx.lineTo(r, y + h - radius);\n self.ctx.quadraticCurveTo(r, b, r - radius, b);\n self.ctx.lineTo(x + radius, b);\n self.ctx.quadraticCurveTo(x, b, x, b - radius);\n self.ctx.lineTo(x, y + radius);\n self.ctx.quadraticCurveTo(x, y, x + radius, y);\n }\n function fillRect(x, y, w, h) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillRect(x, y, w, h);\n }\n function strokeRect(x, y, w, h) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.strokeRect(x, y, w, h);\n }\n function fillText(text, x, y) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillText(text, x, y);\n }\n function fillCircle(x, y, r) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.arc(x, y, r, 0, 2 * Math.PI);\n self.ctx.fill();\n }\n function strokeCircle(x, y, r) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.arc(x, y, r, 0, 2 * Math.PI);\n self.ctx.stroke();\n }\n function clipFrozenArea(mode) {\n // 0 both, 1 rows, 2 cols\n // self.lastFrozenColumnPixel;\n // self.lastFrozenRowPixel;\n self.ctx.beginPath();\n if (mode === 0) {\n self.ctx.moveTo(self.lastFrozenColumnPixel, self.lastFrozenRowPixel);\n self.ctx.lineTo(self.lastFrozenColumnPixel, self.height);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.width, self.lastFrozenRowPixel);\n }\n if (mode === 1) {\n self.ctx.moveTo(0, self.lastFrozenRowPixel);\n self.ctx.lineTo(0, self.height);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.width, self.lastFrozenRowPixel);\n }\n if (mode === 2) {\n self.ctx.moveTo(self.lastFrozenColumnPixel, 0);\n self.ctx.lineTo(self.width, 0);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.lastFrozenColumnPixel, self.height);\n }\n self.ctx.clip();\n }\n function fillHandle(x, y, r) {\n if (self.style.selectionHandleType === 'circle') {\n return fillCircle(x, y, r * 0.5);\n }\n fillRect(x - r * 0.5, y - r * 0.5, r, r);\n }\n function strokeHandle(x, y, r) {\n if (self.style.selectionHandleType === 'circle') {\n return strokeCircle(x, y, r * 0.5);\n }\n strokeRect(x - r * 0.5, y - r * 0.5, r, r);\n }\n function addselectionHandle(c, pos) {\n var hw = self.style.selectionHandleSize,\n p = {\n tr: function () {\n fillHandle(c.x + c.width, c.y, hw);\n strokeHandle(c.x + c.width, c.y, hw);\n },\n br: function () {\n fillHandle(c.x + c.width, c.y + c.height, hw);\n strokeHandle(c.x + c.width, c.y + c.height, hw);\n },\n tl: function () {\n fillHandle(c.x, c.y, hw);\n strokeHandle(c.x, c.y, hw);\n },\n bl: function () {\n fillHandle(c.x, c.y + c.height, hw);\n strokeHandle(c.x, c.y + c.height, hw);\n },\n };\n p[pos]();\n }\n function addBorderLine(c, pos) {\n self.ctx.beginPath();\n var p = {\n t: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop,\n );\n },\n r: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n b: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop + c.height,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n l: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n };\n p[pos]();\n self.ctx.stroke();\n }\n function addEllipsis(text, width) {\n var c,\n w = 0;\n if (self.ellipsisCache[text] && self.ellipsisCache[text][width]) {\n return self.ellipsisCache[text][width];\n }\n //TODO Add ellipsis back when there is a fast way to do it\n w = self.ctx.measureText(text).width;\n self.ellipsisCache[text] = self.ellipsisCache[text] || {};\n c = { value: text, width: w };\n self.ellipsisCache[text][width] = c;\n return c;\n }\n function wrapText(cell, splitChar) {\n if (!cell.formattedValue) {\n return {\n lines: [{ width: 0, value: '' }],\n width: 0,\n height: cell.calculatedLineHeight,\n };\n }\n var max = 0,\n n = '\\n',\n x,\n word,\n words = cell.formattedValue.split(splitChar),\n textHeight = cell.calculatedLineHeight,\n lines = [],\n out = [],\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n autoResize = self.attributes.autoResizeRows && wrap,\n elWidth,\n et = self.attributes.ellipsisText,\n elClipLength,\n plWidth,\n clippedVal,\n ogWordWidth,\n previousLine,\n line = {\n width: 0,\n value: '',\n },\n cHeight = wrap ? cell.paddedHeight : cell.calculatedLineHeight;\n lines.push(line);\n elWidth = self.ctx.measureText(' ' + et).width;\n for (x = 0; x < words.length; x += 1) {\n word = words[x];\n var curSplitChar = word[word.length - 1] === '-' ? '' : splitChar;\n var measure = self.ctx.measureText(word + curSplitChar);\n if (line.width + measure.width + elWidth < cell.paddedWidth) {\n line.value += word + curSplitChar;\n line.width += measure.width;\n continue;\n }\n // if there is a hyphenated word that is too long\n // split it and add the split set to the array\n // then back up and re-read new split set\n // this behavior seems right, it might not be\n if (/\\w-\\w/.test(word) && cell.paddedWidth < measure.width) {\n var arr = word.split('-');\n arr = arr.map((item, index) => {\n return index === arr.length - 1 ? item : item + '-';\n });\n words.splice(x, 1, ...arr);\n x -= 1;\n continue;\n }\n line = {\n width: measure.width,\n value: word + curSplitChar,\n };\n if (x === 0) {\n lines = [];\n lines.push(line);\n }\n textHeight += cell.calculatedLineHeight;\n if (textHeight > cHeight && !autoResize) {\n if (lines.length === 0) {\n break;\n }\n elClipLength = 1;\n previousLine = lines[lines.length - 1];\n if (previousLine.width < cell.paddedWidth && words.length === 1) {\n break;\n }\n clippedVal = previousLine.value + word;\n plWidth = self.ctx.measureText(clippedVal + et).width;\n var originText = clippedVal;\n if (plWidth > cell.paddedWidth) {\n var stepLength = parseInt(clippedVal.length / 2);\n var direction = -1;\n while (stepLength > 0) {\n clippedVal = originText.substr(\n 0,\n stepLength * direction + clippedVal.length,\n );\n plWidth = self.ctx.measureText(clippedVal + et).width;\n direction = plWidth > cell.paddedWidth ? -1 : 1;\n stepLength = parseInt(stepLength / 2);\n }\n }\n clippedVal =\n clippedVal + (originText.length != clippedVal.length ? et : '');\n previousLine.value = clippedVal;\n previousLine.width = plWidth;\n break;\n }\n if (x > 0) {\n lines.push(line);\n }\n }\n return {\n lines: lines,\n width: max,\n height: cell.calculatedLineHeight * lines.length,\n };\n }\n function drawText(cell, treeCellPadding = 0) {\n var ll = cell.text.lines.length,\n h = cell.fontHeight * cell.lineHeight,\n x,\n line,\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n textHeight = 0;\n // text supplied by a rendertext handler may omit width/height (#460)\n var textBlockHeight =\n cell.text.height === undefined\n ? cell.calculatedLineHeight * ll\n : cell.text.height;\n for (x = 0; x < cell.text.lines.length; x += 1) {\n line = cell.text.lines[x];\n if (line.width === undefined) {\n line.width = self.ctx.measureText(\n line.value === undefined || line.value === null\n ? ''\n : String(line.value),\n ).width;\n }\n var vPos =\n Math.max(\n (cell.height -\n (wrap ? textBlockHeight : cell.calculatedLineHeight)) *\n 0.5,\n 0,\n ) + h,\n hPos =\n cell.paddingLeft +\n treeCellPadding +\n cell.treeArrowWidth +\n cell.orderByArrowWidth;\n if (cell.horizontalAlignment === 'right') {\n hPos =\n cell.paddingLeft + treeCellPadding + cell.paddedWidth - line.width;\n } else if (cell.horizontalAlignment === 'center') {\n hPos =\n cell.paddingLeft +\n treeCellPadding +\n (cell.paddedWidth + cell.paddingRight) / 2 -\n line.width / 2;\n }\n if (cell.verticalAlignment === 'top') {\n vPos = cell.calculatedLineHeight;\n } else if (cell.verticalAlignment === 'bottom') {\n // baseline of the last line sits on the bottom padding (#530)\n vPos =\n cell.height -\n cell.paddingBottom -\n textBlockHeight +\n cell.calculatedLineHeight;\n }\n line.height = h + cell.lineSpacing;\n line.offsetLeft = hPos;\n line.offsetTop = vPos;\n line.x = cell.x + hPos;\n line.y = cell.y + textHeight + vPos;\n textHeight += line.height;\n fillText(line.value, line.x, line.y);\n }\n if (self.attributes.debug && cell.active) {\n requestAnimationFrame(function () {\n self.ctx.font = self.style.debugFont;\n self.ctx.fillStyle = self.style.debugColor;\n fillText(\n JSON.stringify(\n {\n x: cell.x,\n y: cell.y,\n h: cell.height,\n w: cell.width,\n pw: cell.paddedWidth,\n idx: cell.columnIndex,\n idx_ord: cell.sortColumnIndex,\n },\n null,\n '\\t',\n ),\n cell.x + 14,\n cell.y + 14,\n );\n fillText(\n JSON.stringify(\n cell.text.lines.map(function (l) {\n return { w: l.width, v: l.value.length };\n }),\n null,\n '\\t',\n ),\n cell.x + 14,\n cell.y + 30,\n );\n });\n }\n }\n function getFrozenColumnsWidth() {\n var w = 0,\n s = self.getSchema(),\n x = 0,\n n = Math.min(self.frozenColumn, s.length),\n collapsedGroups = self.getCollapsedColumnGroups(),\n column;\n hiddenFrozenColumnCount = 0;\n while (x < n) {\n column = s[x];\n if (column.hidden) {\n hiddenFrozenColumnCount += 1;\n } else {\n const isCollapsed =\n collapsedGroups.findIndex(\n (group) => x >= group.from && x <= group.to,\n ) >= 0;\n if (isCollapsed) {\n hiddenFrozenColumnCount += 1;\n } else {\n w += self.getColumnWidth(x);\n }\n }\n x += 1;\n }\n return w;\n }\n /**\n * Redraws the grid. No matter what the change, this is the only method required to refresh everything.\n * @memberof canvasDatagrid\n * @name draw\n * @method\n */\n // r = literal row index\n // rd = row data array\n // i = user order index\n // o = literal data index\n // y = y drawing cursor\n // x = x drawing cursor\n // s = visible schema array\n // cx = current x drawing cursor sub calculation var\n // cy = current y drawing cursor sub calculation var\n // a = static cell (like corner cell)\n // p = perf counter\n // l = data length\n // u = current cell\n // h = current height\n // w = current width\n self.draw = function (internal) {\n if (self.dispatchEvent('beforedraw', {})) {\n return;\n }\n if (!self.isChildGrid && (!self.height || !self.width)) {\n return;\n }\n if (self.isChildGrid && internal) {\n requestAnimationFrame(self.parentGrid.draw);\n return;\n }\n if (self.intf.visible === false) {\n return;\n }\n // initial values\n var checkScrollHeight,\n rowHeaderCell,\n p,\n cx,\n cy,\n treeGrid,\n rowOpen,\n rowHeight,\n cornerCell,\n y,\n x,\n c,\n h,\n w,\n schema,\n rowIndex,\n rowData,\n aCell,\n viewData = self.viewData || [],\n bc = self.style.gridBorderCollapse === 'collapse',\n selectionBorders = [],\n moveBorders = [],\n selectionHandles = [],\n rowHeaders = [],\n l = viewData.length,\n u = self.currentCell || {},\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n rowGroupsAreaWidth = self.getRowGroupAreaWidth(),\n columnGroupsAreaHeight = self.getColumnGroupAreaHeight(),\n /** key: boundRowIndex, value: `{y,h}` */\n rowGroupsRectInfo = {},\n /** value: `{y,h}` */\n rowGroupsFrozenInfo = {},\n /** key: columnIndex, value: `{x,w}` */\n columnGroupsRectInfo = {},\n collapsedColumnGroups = self.getCollapsedColumnGroups(),\n collapsedRowGroups = self.getCollapsedRowGroups(),\n cellHeight = self.style.cellHeight,\n currentRowIndexOffset = 0,\n /** @type {Array<{from:number,plus:number}>} */\n rowIndexOffsetByHiddenRows = self.hiddenRowRanges\n .map((range) => ({\n from: range[0],\n plus: range[1] - range[0] + 1,\n }))\n .sort((a, b) => a.from - b.from);\n drawCount += 1;\n p = performance.now();\n self.visibleRowHeights = [];\n // if data length has changed, there is no way to know\n if (viewData.length > self.orders.rows.length) {\n self.createRowOrders();\n }\n function saveRowGroupsRectInfo(cell) {\n let index = cell.boundRowIndex;\n if (index >= -1 === false)\n if (cell.rowIndex === -1) index = -1;\n else return;\n if (rowGroupsRectInfo[index]) return;\n rowGroupsRectInfo[index] = { y: cell.y, h: cell.height };\n }\n function saveColumnGroupsRectInfo(cell) {\n const index = cell.columnIndex;\n if (columnGroupsRectInfo[index]) return;\n columnGroupsRectInfo[index] = { x: cell.x, w: cell.width };\n }\n /**\n * @param {number} columnIndex\n * @returns {boolean}\n */\n function isColumnCollapsedByGroup(columnIndex) {\n return (\n collapsedColumnGroups.findIndex(\n (group) => columnIndex >= group.from && columnIndex <= group.to,\n ) >= 0\n );\n }\n\n function drawScrollBars() {\n var drawCorner,\n en = self.scrollBox.entities,\n m = self.style.scrollBarBoxMargin * 2;\n self.ctx.strokeStyle = self.style.scrollBarBorderColor;\n self.ctx.lineWidth = self.style.scrollBarBorderWidth;\n if (self.frozenColumn > 0) {\n en.horizontalBox.x =\n rowHeaderCellWidth +\n self.style.scrollBarBoxMargin +\n self.scrollCache.x[self.frozenColumn - 1] +\n (en.horizontalBar.width -\n self.scrollCache.x[self.frozenColumn - 1] -\n self.scrollBox.scrollBoxWidth) *\n (self.scrollBox.scrollLeft / self.scrollBox.scrollWidth);\n } else {\n en.horizontalBox.x =\n rowHeaderCellWidth +\n self.style.scrollBarBoxMargin +\n (en.horizontalBar.width - self.scrollBox.scrollBoxWidth) *\n (self.scrollBox.scrollLeft / self.scrollBox.scrollWidth);\n }\n en.verticalBox.y =\n columnHeaderCellHeight +\n self.style.scrollBarBoxMargin +\n self.scrollCache.y[self.frozenRow] +\n (en.verticalBar.height -\n self.scrollBox.scrollBoxHeight -\n self.scrollCache.y[self.frozenRow]) *\n (self.scrollBox.scrollTop / self.scrollBox.scrollHeight);\n if (self.scrollBox.horizontalBarVisible) {\n self.ctx.fillStyle = self.style.scrollBarBackgroundColor;\n fillRect(\n en.horizontalBar.x,\n en.horizontalBar.y,\n en.horizontalBar.width + m,\n en.horizontalBar.height,\n );\n strokeRect(\n en.horizontalBar.x,\n en.horizontalBar.y,\n en.horizontalBar.width + m,\n en.horizontalBar.height,\n );\n self.ctx.fillStyle = self.style.scrollBarBoxColor;\n if (self.scrollBox.horizontalBoxVisible) {\n if (/horizontal/.test(u.context)) {\n self.ctx.fillStyle = self.style.scrollBarActiveColor;\n }\n radiusRect(\n en.horizontalBox.x,\n en.horizontalBox.y,\n en.horizontalBox.width,\n en.horizontalBox.height,\n self.style.scrollBarBoxBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n }\n drawCorner = true;\n self.visibleCells.unshift(en.horizontalBar);\n self.visibleCells.unshift(en.horizontalBox);\n }\n if (self.scrollBox.verticalBarVisible) {\n self.ctx.fillStyle = self.style.scrollBarBackgroundColor;\n fillRect(\n en.verticalBar.x,\n en.verticalBar.y,\n en.verticalBar.width,\n en.verticalBar.height + m,\n );\n strokeRect(\n en.verticalBar.x,\n en.verticalBar.y,\n en.verticalBar.width,\n en.verticalBar.height + m,\n );\n if (self.scrollBox.verticalBoxVisible) {\n self.ctx.fillStyle = self.style.scrollBarBoxColor;\n if (/vertical/.test(u.context)) {\n self.ctx.fillStyle = self.style.scrollBarActiveColor;\n }\n radiusRect(\n en.verticalBox.x,\n en.verticalBox.y,\n en.verticalBox.width,\n en.verticalBox.height,\n self.style.scrollBarBoxBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n }\n drawCorner = true;\n self.visibleCells.unshift(en.verticalBar);\n self.visibleCells.unshift(en.verticalBox);\n }\n if (drawCorner) {\n //corner\n self.ctx.strokeStyle = self.style.scrollBarCornerBorderColor;\n self.ctx.fillStyle = self.style.scrollBarCornerBackgroundColor;\n radiusRect(\n en.corner.x,\n en.corner.y,\n en.corner.width,\n en.corner.height,\n 0,\n );\n self.ctx.stroke();\n self.ctx.fill();\n self.visibleCells.unshift(en.corner);\n }\n }\n function createHandlesOverlayArray(cell) {\n if (self.attributes.allowMovingSelection || self.mobile) {\n if (\n cell.selectionBorderTop &&\n cell.selectionBorderRight &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'tr']);\n cell.selectionHandle = 'tr';\n }\n if (cell.selectionBorderTop && cell.selectionBorderLeft) {\n if (self.mobile) {\n selectionHandles.push([cell, 'tl']);\n cell.selectionHandle = 'tl';\n }\n if (self.fillOverlay.handle) {\n self.fillOverlay.snapTo = {\n x: cell.x,\n y: cell.y,\n };\n }\n }\n if (\n cell.selectionBorderBottom &&\n cell.selectionBorderLeft &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'bl']);\n cell.selectionHandle = 'bl';\n }\n if (\n cell.selectionBorderBottom &&\n cell.selectionBorderRight &&\n (self.attributes.selectionHandleBehavior !== 'none' || self.mobile)\n ) {\n selectionHandles.push([cell, 'br']);\n cell.selectionHandle = 'br';\n\n if (self.fillOverlay.handle) {\n self.fillOverlay.handle.x = cell.x + cell.width;\n self.fillOverlay.handle.y = cell.y + cell.height;\n }\n }\n\n if (self.fillOverlay.handle) {\n // Some corners may not be displaying, so we get at least\n // one correct axis in order to display a fill overlay.\n if (self.fillOverlay.snapTo.x === -1 && cell.selectionBorderLeft) {\n self.fillOverlay.snapTo.x = cell.x;\n }\n if (self.fillOverlay.snapTo.y === -1 && cell.selectionBorderTop) {\n self.fillOverlay.snapTo.y = cell.y;\n }\n }\n }\n }\n function createBorderOverlayArray(\n cell,\n drawArray,\n propPrefix,\n offsetPoint,\n ) {\n cell.selectionBorder = '';\n // TODO: optimize it by `getSelectionStateFromCells`\n const isSelected = offsetPoint\n ? (row, col) =>\n isCellSelected(\n self.selections,\n row - offsetPoint.y,\n col - offsetPoint.x,\n )\n : (row, col) => isCellSelected(self.selections, row, col);\n const lastColumnIndex = Math.max(schema.length - 1, 0);\n const lastRowIndex = Math.max(viewData.length - 1, 0);\n const { isRowHeader, rowIndex, columnIndex } = cell;\n\n if (!isRowHeader && isSelected(rowIndex, columnIndex)) {\n if (\n (!isSelected(rowIndex - 1, columnIndex) || rowIndex === 0) &&\n !cell.isHeader\n ) {\n drawArray.push([cell, 't']);\n cell[propPrefix + 'BorderTop'] = true;\n cell[propPrefix + 'Border'] += 't';\n }\n if (\n rowIndex >= lastRowIndex ||\n !isSelected(rowIndex + 1, columnIndex)\n ) {\n drawArray.push([cell, 'b']);\n cell[propPrefix + 'BorderBottom'] = true;\n cell[propPrefix + 'Border'] += 'b';\n }\n if (columnIndex === 0 || !isSelected(rowIndex, columnIndex - 1)) {\n drawArray.push([cell, 'l']);\n cell[propPrefix + 'BorderLeft'] = true;\n cell[propPrefix + 'Border'] += 'l';\n }\n if (\n columnIndex >= lastColumnIndex ||\n !isSelected(rowIndex, columnIndex + 1)\n ) {\n drawArray.push([cell, 'r']);\n cell[propPrefix + 'BorderRight'] = true;\n cell[propPrefix + 'Border'] += 'r';\n }\n }\n }\n function drawCell(rowData, rowOrderIndex, rowIndex) {\n const isActiveRowHeader =\n self.orders.rows[self.activeCell.rowIndex] === rowOrderIndex ||\n self.isRowSelected(rowOrderIndex);\n\n return function drawEach(header, headerIndex, columnOrderIndex) {\n if (header.hidden) {\n return 0;\n }\n var cellStyle = header.style || 'cell',\n cellGridAttributes,\n cell,\n isHeader = /HeaderCell/.test(cellStyle),\n isCorner = /cornerCell/.test(cellStyle),\n isRowHeader = 'rowHeaderCell' === cellStyle,\n isColumnHeader = 'columnHeaderCell' === cellStyle,\n isFilterable =\n self.filterable.rows.includes(rowIndex) &&\n self.filterable.columns.includes(headerIndex),\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n // TODO: optimize it by `getSelectionStateFromCells`\n selected = isCellSelected(\n self.selections,\n rowOrderIndex,\n columnOrderIndex,\n ),\n hovered =\n self.hovers.rowIndex === rowOrderIndex &&\n (self.attributes.hoverMode === 'row' ||\n self.hovers.columnIndex === columnOrderIndex),\n openedFilter =\n self.selectedFilterButton.rowIndex == rowIndex &&\n self.selectedFilterButton.columnIndex == headerIndex,\n active =\n self.activeCell.rowIndex === rowOrderIndex &&\n self.activeCell.columnIndex === columnOrderIndex,\n isColumnHeaderCellCap = cellStyle === 'columnHeaderCellCap',\n rawValue = rowData ? rowData[header.name] : undefined,\n isGrid = header.type === 'canvas-datagrid',\n val,\n f = self.formatters[header.type || 'string'],\n orderByArrowSize = 0,\n treeArrowSize = 0,\n cellWidth =\n headerIndex >= 0\n ? self.getColumnWidth(headerIndex)\n : self.sizes.columns[headerIndex] || header.width,\n ev = {\n value: rawValue,\n row: rowData,\n header: header,\n };\n\n const isActiveColumnHeader =\n self.orders.columns[self.activeCell.columnIndex] === headerIndex ||\n self.isColumnSelected(self.activeCell.viewColumnIndex);\n let activeHeader = false;\n if (\n (isActiveColumnHeader || isActiveRowHeader) &&\n (columnOrderIndex === -1 || rowOrderIndex === -1)\n )\n activeHeader = isRowHeader\n ? 'activeRowHeaderCell'\n : 'activeColumnHeaderCell';\n\n if (isColumnHeaderCellCap) {\n cellWidth = w - x;\n }\n // if no data or schema are defined, a width is provided to the stub column\n if (cellWidth === undefined) {\n cellWidth = self.style.cellWidth;\n }\n if (headerIndex < 0) {\n cellWidth = cellWidth * self.scale;\n }\n if (x + cellWidth + self.style.cellBorderWidth < 0) {\n x += cellWidth + self.style.cellBorderWidth;\n }\n if (active && cellStyle !== 'cornerCell') {\n cellStyle = 'activeCell';\n }\n if (self.visibleRows.indexOf(rowIndex) === -1 && !isHeader) {\n self.visibleRows.push(rowIndex);\n }\n val = self.dispatchEvent('formatcellvalue', ev);\n cx = x;\n cy = y;\n if (cellStyle === 'cornerCell') {\n cx = 0;\n cy = 0;\n } else if (isRowHeader) {\n cx = 0;\n } else if (isHeader) {\n cy = 0;\n }\n cell = {\n type: isGrid ? 'canvas-datagrid-cell' : header.type,\n style: cellStyle,\n nodeType: 'canvas-datagrid-cell',\n x: cx,\n y: cy,\n fontHeight: (self.style[cellStyle + 'FontHeight'] || 0) * self.scale,\n horizontalAlignment: self.style[cellStyle + 'HorizontalAlignment'],\n verticalAlignment: self.style[cellStyle + 'VerticalAlignment'],\n paddingLeft:\n (self.style[cellStyle + 'PaddingLeft'] || 0) * self.scale,\n paddingTop: (self.style[cellStyle + 'PaddingTop'] || 0) * self.scale,\n paddingRight:\n (self.style[cellStyle + 'PaddingRight'] || 0) * self.scale,\n paddingBottom:\n (self.style[cellStyle + 'PaddingBottom'] || 0) * self.scale,\n whiteSpace: self.style.cellWhiteSpace,\n lineHeight: self.style.cellLineHeight,\n lineSpacing: self.style.cellLineSpacing,\n offsetTop: self.canvasOffsetTop + cy,\n offsetLeft: self.canvasOffsetLeft + cx,\n scrollTop: self.scrollBox.scrollTop,\n scrollLeft: self.scrollBox.scrollLeft,\n active: active || activeHeader,\n hovered: hovered,\n selected: selected,\n width: cellWidth,\n height: cellHeight,\n offsetWidth: cellWidth,\n offsetHeight: cellHeight,\n parentNode: self.intf.parentNode,\n offsetParent: self.intf.parentNode,\n data: rowData,\n isCorner: isCorner,\n isHeader: isHeader,\n isColumnHeader: isColumnHeader,\n isColumnHeaderCellCap: isColumnHeaderCellCap,\n isRowHeader: isRowHeader,\n isFilterable: isFilterable,\n openedFilter: openedFilter,\n rowOpen: rowOpen,\n header: header,\n\n columnIndex: columnOrderIndex,\n rowIndex: rowOrderIndex,\n\n viewRowIndex: rowOrderIndex,\n viewColumnIndex: columnOrderIndex,\n\n boundRowIndex: self.getBoundRowIndexFromViewRowIndex(rowOrderIndex),\n boundColumnIndex:\n self.getBoundColumnIndexFromViewColumnIndex(columnOrderIndex),\n\n sortColumnIndex: headerIndex,\n sortRowIndex: rowIndex,\n\n isGrid: isGrid,\n isNormal: !isGrid && !isCorner && !isHeader,\n gridId: (self.attributes.name || '') + rowIndex + ':' + headerIndex,\n parentGrid: self.intf,\n innerHTML: '',\n activeHeader: activeHeader,\n value:\n isHeader && !isRowHeader ? header.title || header.name : rawValue,\n isRowTree:\n rowOrderIndex >= 0 &&\n columnOrderIndex == self.cellTree.rowTreeColIndex &&\n self.cellTree.rows.length > 0 &&\n self.cellTree.rows[rowOrderIndex].icon,\n isColumnTree:\n columnOrderIndex >= 0 &&\n self.cellTree.columns[rowOrderIndex] &&\n self.cellTree.columns[rowOrderIndex][columnOrderIndex].icon,\n };\n cell.calculatedLineHeight =\n cell.fontHeight * cell.lineHeight + cell.lineSpacing;\n cell.paddedWidth = cell.width - cell.paddingRight - cell.paddingLeft;\n cell.paddedHeight = cell.height - cell.paddingTop - cell.paddingBottom;\n ev.cell = cell;\n cell.userHeight = cell.isHeader ? self.sizes.rows[-1] : rowHeight;\n cell.userWidth = cell.isHeader\n ? self.sizes.columns.cornerCell\n : self.sizes.columns[headerIndex];\n self.visibleCells.unshift(cell);\n saveRowGroupsRectInfo(cell);\n saveColumnGroupsRectInfo(cell);\n if (self.dispatchEvent('beforerendercell', ev)) {\n return;\n }\n self.ctx.fillStyle = self.style[cellStyle + 'BackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'BorderColor'];\n self.ctx.lineWidth = self.style[cellStyle + 'BorderWidth'];\n if (hovered) {\n self.ctx.fillStyle = self.style[cellStyle + 'HoverBackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'HoverBorderColor'];\n }\n if (selected) {\n self.ctx.fillStyle =\n self.style[cellStyle + 'SelectedBackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'SelectedBorderColor'];\n }\n if (activeHeader) {\n self.ctx.fillStyle = self.style[activeHeader + 'BackgroundColor'];\n }\n self.dispatchEvent('rendercell', ev);\n if (cell.isGrid) {\n if (cell.height !== rowHeight) {\n cell.height = rowHeight || self.style.cellHeightWithChildGrid;\n checkScrollHeight = true;\n }\n cell.width =\n self.sizes.columns[headerIndex] ||\n self.style.cellWidthWithChildGrid;\n }\n if (rowOpen && !cell.isRowHeader) {\n cell.height = self.sizes.rows[rowIndex] || self.style.cellHeight;\n }\n if (!cell.isGrid) {\n fillRect(cx, cy, cell.width, cell.height);\n strokeRect(cx, cy, cell.width, cell.height);\n }\n self.ctx.save();\n radiusRect(cell.x, cell.y, cell.width, cell.height, 0);\n self.ctx.clip();\n self.dispatchEvent('afterrendercell', ev);\n if (cell.height !== cellHeight && !(rowOpen && !cell.isRowHeader)) {\n self.sizes.rows[isHeader ? -1 : rowIndex] = cell.height;\n checkScrollHeight = true;\n }\n if (cell.width !== cellWidth) {\n self.sizes.columns[headerIndex] = cell.width;\n checkScrollHeight = true;\n }\n if (isRowHeader && self.attributes.tree) {\n if (!self.dispatchEvent('rendertreearrow', ev)) {\n treeArrowSize = drawTreeArrow(\n cell,\n self.style[cellStyle + 'PaddingLeft'],\n cy,\n 0,\n );\n }\n }\n if ((self.attributes.showRowNumbers && isRowHeader) || !isRowHeader) {\n if (cell.isGrid && !self.dispatchEvent('beforerendercellgrid', ev)) {\n if (!self.childGrids[cell.gridId]) {\n // HACK: this only allows setting of the child grids styles if data is set _after_\n // this is less than desirable. An interface needs to be made to effect the\n // style of all cell grids. One for individual grids already exists.\n cellGridAttributes = self.cellGridAttributes;\n cellGridAttributes.name = self.attributes.saveAppearance\n ? cell.gridId\n : undefined;\n cellGridAttributes.component = false;\n cellGridAttributes.parentNode = cell;\n cellGridAttributes.data = rawValue;\n ev.cellGridAttributes = cellGridAttributes;\n if (self.dispatchEvent('beforecreatecellgrid', ev)) {\n return;\n }\n self.childGrids[cell.gridId] =\n self.createGrid(cellGridAttributes);\n self.sizes.rows[rowIndex] =\n self.sizes.rows[rowIndex] || self.style.cellGridHeight;\n checkScrollHeight = true;\n }\n cell.grid = self.childGrids[cell.gridId];\n cell.grid.parentNode = cell;\n cell.grid.visible = true;\n cell.grid.draw();\n self.dispatchEvent('rendercellgrid', ev);\n } else if (!cell.isGrid) {\n if (self.childGrids[cell.gridId]) {\n self.childGrids[cell.gridId].parentNode.offsetHeight = 0;\n }\n if (isHeader && self.orderBy === header.name) {\n if (!self.dispatchEvent('renderorderbyarrow', ev)) {\n orderByArrowSize = drawOrderByArrow(\n cx + self.style[cellStyle + 'PaddingLeft'],\n 0,\n );\n }\n }\n self.ctx.fillStyle = self.style[cellStyle + 'Color'];\n if (hovered) {\n self.ctx.fillStyle = self.style[cellStyle + 'HoverColor'];\n }\n if (selected) {\n self.ctx.fillStyle = self.style[cellStyle + 'SelectedColor'];\n }\n if (activeHeader) {\n self.ctx.fillStyle = self.style[activeHeader + 'Color'];\n }\n cell.treeArrowWidth = treeArrowSize;\n cell.orderByArrowWidth = orderByArrowSize;\n // create text ref to see if height needs to expand\n val = val !== undefined ? val : f ? f(ev) : '';\n if (val === undefined && !f) {\n val = '';\n console.warn(\n 'canvas-datagrid: Unknown format ' +\n header.type +\n ' add a cellFormater',\n );\n }\n cell.formattedValue = (\n val !== undefined && val !== null ? val : ''\n ).toString();\n if (\n self.columnFilters &&\n self.columnFilters[val] !== undefined &&\n isHeader\n ) {\n cell.formattedValue = self.attributes.filterTextPrefix + val;\n }\n self.ctx.font = self.getScaledFont(cellStyle + 'Font');\n if (!self.dispatchEvent('formattext', ev)) {\n cell.text = wrapText(cell, ' ');\n }\n if (!self.dispatchEvent('rendertext', ev)) {\n if (cell.innerHTML || header.type === 'html') {\n drawHtml(cell);\n } else {\n let treeCellPadding = 0,\n isDrawText = true;\n if (\n cell.columnIndex == self.cellTree.rowTreeColIndex &&\n !cell.isColumnHeader &&\n self.cellTree.rows.length > 0 &&\n Object.keys(self.cellTree.rows[cell.rowIndex]).length > 1\n )\n treeCellPadding = drawCellTreeIcon(\n cell,\n self.cellTree.rows[cell.rowIndex],\n true,\n );\n\n if (\n !cell.isRowHeader &&\n cell.rowIndex > 0 &&\n self.cellTree.columns[cell.rowIndex - 1] &&\n self.cellTree.columns[cell.rowIndex - 1][cell.columnIndex]\n .icon\n ) {\n for (let r = cell.rowIndex - 1; r >= 0; r--) {\n if (!self.cellTree.columns[r]) break;\n if (!self.cellTree.columns[r][cell.columnIndex].icon) break;\n if (!self.cellTree.columns[r][cell.columnIndex].expand) {\n isDrawText = false;\n break;\n }\n }\n }\n if (\n isDrawText &&\n !cell.isRowHeader &&\n self.cellTree.columns[cell.rowIndex] &&\n self.cellTree.columns[cell.rowIndex][cell.columnIndex].icon\n ) {\n if (\n self.viewData.length > 0 &&\n self.viewData[cell.rowIndex][cell.columnIndex].length > 0\n )\n treeCellPadding = drawCellTreeIcon(\n cell,\n self.cellTree.columns[cell.rowIndex][cell.columnIndex],\n false,\n );\n }\n if (isDrawText) drawText(cell, treeCellPadding);\n }\n\n if (wrap && cell.text && cell.text.height > rowHeight) {\n self.sizes.rows[isHeader ? -1 : rowIndex] = cell.text.height;\n checkScrollHeight = true;\n }\n }\n }\n }\n if (active) {\n aCell = cell;\n }\n createBorderOverlayArray(cell, selectionBorders, 'selection');\n // createBorderOverlayArray calculates data for createHandlesOverlayArray so it must go 2nd\n createHandlesOverlayArray(cell);\n if (self.movingSelection) {\n createBorderOverlayArray(cell, moveBorders, 'move', self.moveOffset);\n }\n self.ctx.restore();\n\n if (isFilterable) {\n drawFilterButton(cell);\n }\n\n // Gaps may occur in row numbers between consecutively rendered rows\n // when we are filtering. We draw attention to this by drawing a thick\n // border overlapping the two consecutive row headers. If sorting, visible\n // row numbers stay the same (i.e. they don't correspond to the underlying\n // data's row number), so we do not show row gaps in that case.\n const isSorting =\n self.orderings.columns && self.orderings.columns.length > 0;\n\n if (\n isRowHeader &&\n self.attributes.showRowNumbers &&\n self.attributes.showRowNumberGaps &&\n isSorting === false\n ) {\n const previousRowNumber = self.getBoundRowIndexFromViewRowIndex(\n rowOrderIndex - 1,\n );\n let hasRowGap =\n previousRowNumber !== undefined &&\n cell.boundRowIndex > 0 &&\n cell.boundRowIndex - previousRowNumber > 1;\n if (hasRowGap && collapsedRowGroups.length > 0) {\n hasRowGap =\n collapsedRowGroups.find(\n (group) =>\n group.from === previousRowNumber &&\n group.to === cell.boundRowIndex,\n ) >= 0;\n }\n // We don't treat the row index difference from hidden rows as the row gap.\n if (hasRowGap && self.hiddenRowRanges.length > 0) {\n for (let i = 0; i < self.hiddenRowRanges.length; i++) {\n const [beginRowIndex, endRowIndex] = self.hiddenRowRanges[i];\n if (\n cell.boundRowIndex === endRowIndex + 1 &&\n previousRowNumber === beginRowIndex - 1\n ) {\n hasRowGap = false;\n break;\n }\n }\n }\n\n if (hasRowGap) {\n const barHeight = self.style.rowHeaderCellRowNumberGapHeight;\n const barColor = self.style.rowHeaderCellRowNumberGapColor;\n\n self.ctx.save();\n\n self.ctx.fillStyle = barColor;\n\n fillRect(cell.x, cell.y - barHeight / 2, cell.width, barHeight);\n\n self.ctx.restore();\n }\n }\n\n //#region draw unhide indicator for column headers\n if (isColumnHeader && self.attributes.showUnhideColumnsIndicator) {\n const hovered = self.hovers.unhideIndicator;\n const size = self.style.unhideIndicatorSize;\n const cellX = x;\n const topY = cell.y + Math.max(0.5 * (cell.height - size), 0);\n\n const isActive = (orderIndex) =>\n hovered &&\n (hovered.dir === 'l' || hovered.dir === 'r') &&\n orderIndex >= hovered.orderIndex0 &&\n orderIndex <= hovered.orderIndex1;\n const isHiddenColumn = (columnIndex) =>\n columnIndex >= 0 &&\n schema[columnIndex] &&\n schema[columnIndex].hidden;\n\n let orderIndex0, orderIndex1;\n const drawIndicator = (leftX, dir, active) => {\n self.visibleUnhideIndicators.push({\n x: leftX - 1,\n y: topY - 1,\n x2: leftX + size + 2,\n y2: topY + size + 2,\n orderIndex0,\n orderIndex1,\n dir,\n });\n if (!active) {\n const line = cell.text && cell.text.lines && cell.text.lines[0];\n if (line) {\n const iconsWidth = orderByArrowSize + treeArrowSize;\n const lineX0 = iconsWidth > 0 ? iconsWidth : line.x;\n const lineX1 = line.x + line.width;\n if (leftX + size >= lineX0 && leftX <= lineX1) return;\n }\n }\n drawUnhideIndicator(leftX, topY, size, dir, active);\n }; // end of drawIndicator\n\n let orderIndexPtr = columnOrderIndex - 1;\n const prevColumnIndex = self.orders.columns[orderIndexPtr];\n if (isHiddenColumn(prevColumnIndex)) {\n const active = isActive(prevColumnIndex);\n orderIndex0 = orderIndexPtr;\n orderIndex1 = orderIndexPtr;\n while (--orderIndexPtr >= 0) {\n if (isHiddenColumn(self.orders.columns[orderIndexPtr]))\n orderIndex0 = orderIndexPtr;\n else break;\n }\n drawIndicator(cellX, 'r', active);\n }\n\n orderIndexPtr = columnOrderIndex + 1;\n const nextColumnIndex = self.orders.columns[orderIndexPtr];\n if (isHiddenColumn(nextColumnIndex)) {\n const active = isActive(nextColumnIndex);\n orderIndex0 = orderIndexPtr;\n orderIndex1 = orderIndexPtr;\n while (++orderIndexPtr < self.orders.columns.length) {\n if (isHiddenColumn(self.orders.columns[orderIndexPtr]))\n orderIndex1 = orderIndexPtr;\n else break;\n }\n const indicatorX = x + cell.width - size;\n drawIndicator(indicatorX, 'l', active);\n }\n }\n //#endregion draw unhide indicator for column headers\n\n //#region draw unhide indicator for row headers\n if (\n isRowHeader &&\n self.attributes.showUnhideRowsIndicator &&\n self.hiddenRowRanges.length > 0\n ) {\n // Leo's comment:\n // from the first row to the last row, `rowIndex` is from 0 to the count of rows\n // but `boundRowIndex` can be disordered if there are any ordered columns or filtered columns\n // Like this statement:\n // console.log(rowIndex, cell.boundRowIndex, cell.formattedValue);\n // can output the result like this:\n // 0 1 '2'\n // 1 3 '4'\n const hovered = self.hovers.unhideIndicator;\n const size = self.style.unhideIndicatorSize;\n const leftX = cell.x + cell.width - size - 2;\n const cellY = y;\n const topIndicators = {};\n const bottomIndicators = {};\n self.hiddenRowRanges.forEach((it) => {\n topIndicators[it[0] - 1] = it;\n bottomIndicators[it[1] + 1] = it;\n });\n\n const rowIndex = cell.rowIndex + currentRowIndexOffset;\n const isActive = () =>\n hovered &&\n (hovered.dir === 't' || hovered.dir === 'b') &&\n rowIndex >= hovered.orderIndex0 - 1 &&\n rowIndex <= hovered.orderIndex1 + 1;\n\n let orderIndex0, orderIndex1;\n const drawIndicator = (topY, dir, active) => {\n self.visibleUnhideIndicators.push({\n x: leftX - 1,\n y: topY - 1,\n x2: leftX + size + 2,\n y2: topY + size + 2,\n orderIndex0,\n orderIndex1,\n dir,\n });\n drawUnhideIndicator(leftX, topY, size, dir, active);\n }; // end of drawIndicator\n\n let matched = topIndicators[rowIndex];\n if (matched) {\n const indicatorY = cellY + cell.height - size;\n [orderIndex0, orderIndex1] = matched;\n drawIndicator(indicatorY, 't', isActive());\n }\n matched = bottomIndicators[rowIndex];\n if (matched) {\n const indicatorY = cellY;\n [orderIndex0, orderIndex1] = matched;\n drawIndicator(indicatorY, 'b', isActive());\n }\n }\n //#endregion draw unhide indicator for row headers\n\n x += cell.width + (bc ? 0 : self.style.cellBorderWidth);\n return cell.width;\n }; // end of drawEach\n }\n function drawFilterButton(cell, ev) {\n var posX = cell.x + cell.width - self.style.filterButtonWidth - 1;\n var posY = cell.y + cell.height - self.style.filterButtonHeight - 2;\n if (self.dispatchEvent('beforerenderfilterbutton', ev)) {\n return;\n }\n self.ctx.save();\n self.ctx.strokeStyle = self.style.filterButtonBorderColor;\n self.ctx.fillStyle = self.style.filterButtonBackgroundColor;\n if (cell.openedFilter) {\n self.ctx.fillStyle = self.style.filterButtonActiveBackgroundColor;\n } else if (cell.hovered && self.hovers.onFilterButton) {\n self.ctx.fillStyle = self.style.filterButtonHoverBackgroundColor;\n }\n radiusRect(\n posX,\n posY,\n self.style.filterButtonWidth,\n self.style.filterButtonHeight,\n self.style.filterButtonBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n drawFilterButtonArrow(posX, posY);\n self.ctx.clip();\n self.dispatchEvent('afterrenderfilterbutton', ev);\n self.ctx.restore();\n }\n function drawRowHeader(rowData, rowIndex, rowOrderIndex) {\n if (self.attributes.showRowHeaders) {\n x = 0;\n\n // When filtering we'd like to display the actual row numbers,\n // as it is in the unfiltered data, instead of simply the viewed\n // row index + 1. If rowIndex > viewData.length, it's a new row\n // added to the end, and we want to render that new row's number\n let filteredRowNumber;\n if (self.viewData && rowIndex < self.viewData.length)\n filteredRowNumber =\n self.getBoundRowIndexFromViewRowIndex(rowIndex) + 1;\n else\n filteredRowNumber = self.originalData\n ? self.originalData.length + 1\n : rowOrderIndex + 1;\n\n let rowHeaderValue =\n self.hasActiveFilters() || self.hasCollapsedRowGroup()\n ? filteredRowNumber\n : rowIndex + 1;\n rowHeaderValue += currentRowIndexOffset;\n\n const rowHeaderCell = { rowHeaderCell: rowHeaderValue };\n const headerDescription = {\n name: 'rowHeaderCell',\n width: self.sizes.columns[-1] || self.style.rowHeaderCellWidth,\n style: 'rowHeaderCell',\n type: 'string',\n data: rowHeaderValue,\n index: -1,\n };\n rowOpen = self.openChildren[rowIndex];\n drawCell(rowHeaderCell, rowOrderIndex, rowIndex)(\n headerDescription,\n -1,\n -1,\n );\n\n if (\n rowIndexOffsetByHiddenRows[0] &&\n rowHeaderValue >= rowIndexOffsetByHiddenRows[0].from\n ) {\n const { plus } = rowIndexOffsetByHiddenRows.shift();\n currentRowIndexOffset += plus;\n }\n }\n }\n function drawHeaders() {\n var d,\n g = schema.length,\n i,\n o,\n columnHeaderCell,\n header,\n nonFrozenHeaderWidth;\n function drawHeaderColumnRange(start, end) {\n end = Math.min(end, g);\n for (o = start; o < end; o += 1) {\n i = self.orders.columns[o];\n header = schema[i];\n if (!header.hidden && !isColumnCollapsedByGroup(o)) {\n d = {\n title: header.title,\n name: header.name,\n width: header.width || self.style.cellWidth,\n style: 'columnHeaderCell',\n type: 'string',\n index: o,\n order: i,\n };\n columnHeaderCell = {\n columnHeaderCell: header.title || header.name,\n };\n x += drawCell(columnHeaderCell, -1, -1)(d, i, o);\n if (x > self.width + self.scrollBox.scrollLeft) {\n break;\n }\n }\n }\n }\n rowHeaders.forEach(function (rArgs, rhIndex) {\n y = rArgs[3];\n cellHeight = rArgs[4];\n if (rhIndex === self.frozenRow) {\n self.ctx.save();\n radiusRect(\n 0,\n self.lastFrozenRowPixel,\n self.width,\n self.height - self.lastFrozenRowPixel,\n 0,\n );\n self.ctx.clip();\n }\n drawRowHeader(rArgs[0], rArgs[1], rArgs[2]);\n });\n self.ctx.restore();\n if (self.attributes.showColumnHeaders) {\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.columnHeaderCellBorderWidth;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n y = 0;\n // cell height might have changed during drawing\n cellHeight = self.getColumnHeaderCellHeight();\n drawHeaderColumnRange(self.scrollIndexLeft, g);\n nonFrozenHeaderWidth = x;\n x = self.style.columnHeaderCellBorderWidth;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n drawHeaderColumnRange(0, self.frozenColumn);\n // fill in the space right of the headers\n x = nonFrozenHeaderWidth;\n if (x < w) {\n c = {\n name: '',\n width: self.style.scrollBarWidth,\n style: 'columnHeaderCellCap',\n isColumnHeaderCell: true,\n isColumnHeaderCellCap: true,\n type: 'string',\n index: schema.length,\n };\n drawCell({ endCap: '' }, -1, -1)(c, -1, -1);\n }\n // fill in the space right of the headers\n if (self.attributes.showRowHeaders) {\n cornerCell = { cornerCell: '' };\n x = 0;\n c = {\n name: 'cornerCell',\n width: self.style.rowHeaderCellWidth,\n style: 'cornerCell',\n type: 'string',\n index: -1,\n };\n drawCell(cornerCell, -1, -1)(c, -1, -1);\n }\n }\n }\n function drawRow(rowOrderIndex, rowIndex) {\n var headerIndex,\n treeHeight,\n rowSansTreeHeight,\n columnOrderIndex,\n g = schema.length;\n if (y - cellHeight * 2 > h) {\n return false;\n }\n rowData = viewData[rowOrderIndex];\n rowOpen = self.openChildren[rowOrderIndex];\n rowSansTreeHeight =\n (self.sizes.rows[rowOrderIndex] || self.style.cellHeight) * self.scale;\n treeHeight = (rowOpen ? self.sizes.trees[rowOrderIndex] : 0) * self.scale;\n rowHeight = rowSansTreeHeight + treeHeight;\n if (y < -rowHeight) {\n return false;\n }\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n cellHeight = rowHeight;\n //draw normal columns\n for (\n columnOrderIndex = self.scrollIndexLeft;\n columnOrderIndex < g;\n columnOrderIndex += 1\n ) {\n if (!isColumnCollapsedByGroup(columnOrderIndex)) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(rowData, rowOrderIndex, rowIndex)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n }\n if (x > self.width) {\n self.scrollIndexRight = columnOrderIndex;\n self.scrollPixelRight = x;\n break;\n }\n }\n //draw frozen columns\n x = 1;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n for (\n columnOrderIndex = 0;\n columnOrderIndex < self.frozenColumn;\n columnOrderIndex += 1\n ) {\n if (!isColumnCollapsedByGroup(columnOrderIndex)) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(rowData, rowOrderIndex, rowIndex)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n }\n if (x > self.width) {\n break;\n }\n }\n self.lastFrozenColumnPixel = x;\n // cell height might have changed during drawing\n cellHeight = rowHeight;\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n // don't draw a tree for the new row\n treeGrid = self.childGrids[rowOrderIndex];\n if (rowOrderIndex !== viewData.length && rowOpen) {\n treeGrid.visible = true;\n treeGrid.parentNode = {\n offsetTop: y + rowSansTreeHeight + self.canvasOffsetTop,\n offsetLeft: rowHeaderCellWidth - 1 + self.canvasOffsetLeft,\n offsetHeight: treeHeight,\n offsetWidth:\n self.width - rowHeaderCellWidth - self.style.scrollBarWidth - 1,\n offsetParent: self.intf.parentNode,\n parentNode: self.intf.parentNode,\n style: self.style,\n nodeType: 'canvas-datagrid-tree',\n scrollTop: self.scrollBox.scrollTop,\n scrollLeft: self.scrollBox.scrollLeft,\n rowIndex: rowOrderIndex,\n columnGroupsAreaHeight: columnGroupsAreaHeight,\n rowGroupsAreaWidth: rowGroupsAreaWidth,\n };\n if (self.intf.parentNode) {\n const { columnGroupsAreaHeight, rowGroupsAreaWidth } =\n self.intf.parentNode;\n treeGrid.parentNode.columnGroupsAreaHeight +=\n columnGroupsAreaHeight || 0;\n treeGrid.parentNode.rowGroupsAreaWidth += rowGroupsAreaWidth || 0;\n }\n // Hit-test entry for the child grid's area. Like every other visible\n // cell it is in this grid's own coordinates (the child's offsetTop and\n // offsetLeft are canvas coordinates) and carries the real tree size:\n // `treeGrid.height`/`width` are undefined on child grids, which made\n // this entry unmatchable, so a pointer over a tree grid still counted\n // as hovering the parent and the parent scrolled along with the tree.\n self.visibleCells.unshift({\n rowIndex: rowOrderIndex,\n columnIndex: 0,\n y: y + rowSansTreeHeight,\n x: rowHeaderCellWidth - 1,\n height: treeHeight,\n width: treeGrid.parentNode.offsetWidth,\n style: 'tree-grid',\n type: treeGrid.parentNode.nodeType,\n data: rowData,\n header: {},\n isGrid: false,\n isNormal: false,\n isHeader: false,\n isCorner: false,\n isRowHeader: false,\n isColumnHeader: false,\n selected: false,\n hovered: false,\n });\n treeGrid.draw();\n } else if (treeGrid) {\n treeGrid.parentNode.offsetHeight = 0;\n delete self.sizes.trees[rowOrderIndex];\n }\n rowHeaders.push([rowData, rowOrderIndex, rowIndex, y, rowHeight]);\n self.visibleRowHeights[rowOrderIndex] = rowHeight;\n y += cellHeight + (bc ? 0 : self.style.cellBorderWidth);\n return true;\n }\n function initDraw() {\n self.visibleRows = [];\n schema = self.getSchema();\n self.visibleCells = [];\n self.visibleGroups = [];\n self.visibleUnhideIndicators = [];\n self.canvasOffsetTop = self.isChildGrid ? self.parentNode.offsetTop : 0.5;\n self.canvasOffsetLeft = self.isChildGrid\n ? self.parentNode.offsetLeft\n : -0.5;\n h = self.height;\n w = self.width;\n\n // patch for first row being hidden\n const firstRowIndexOffset = rowIndexOffsetByHiddenRows[0];\n if (firstRowIndexOffset && firstRowIndexOffset.from === 0) {\n currentRowIndexOffset = firstRowIndexOffset.plus;\n rowIndexOffsetByHiddenRows.shift();\n }\n }\n function drawBackground() {\n radiusRect(0, 0, w, h, 0);\n self.ctx.clip();\n self.ctx.clearRect(0, 0, w, h);\n self.ctx.fillStyle = self.style.gridBackgroundColor;\n fillRect(0, 0, w, h);\n }\n function initGroupArea() {\n self.ctx.translate(rowGroupsAreaWidth, columnGroupsAreaHeight);\n }\n function drawGroupArea() {\n const mx = rowGroupsAreaWidth;\n const my = columnGroupsAreaHeight;\n const frozenColumnsWidth = getFrozenColumnsWidth();\n const frozenRowsHeight =\n rowGroupsFrozenInfo.y + rowGroupsFrozenInfo.h - columnHeaderCellHeight;\n const onTheLeft = self.attributes.columnGroupIndicatorPosition === 'left';\n const onTheTop = self.attributes.rowGroupIndicatorPosition === 'top';\n\n /** @type {CanvasRenderingContext2D} */\n const ctx = self.ctx;\n ctx.save();\n ctx.fillStyle = self.style.groupingAreaBackgroundColor;\n fillRect(0, -my, w, my);\n fillRect(-mx, -my, mx, h);\n ctx.restore();\n\n //#region Columns Grouping\n /** it extends `self.groupedRows` */\n const groupedColumns = [];\n for (let row = 0; row < self.groupedColumns.length; row++) {\n const groups = self.groupedColumns[row];\n for (let j = 0; j < groups.length; j++) {\n groupedColumns.push(Object.assign({ row }, groups[j]));\n }\n }\n if (groupedColumns.length > 0) {\n const rowHeight = self.style.columnGroupRowHeight;\n const toggleHandleSize = rowHeight * 0.5;\n const toggleHandlePadding = (rowHeight - toggleHandleSize) * 0.5;\n\n for (let i = 0; i < groupedColumns.length; i++) {\n const group = groupedColumns[i];\n const { row, collapsed } = group;\n\n const topY = -my + row * rowHeight;\n const centerY = topY + rowHeight * 0.5;\n const bottomY = topY + rowHeight - toggleHandlePadding;\n const leftmostX =\n rowHeaderCellWidth - toggleHandleSize - toggleHandlePadding;\n\n const drawGroupHandleAtX = (x) =>\n drawGroupHandle(\n x,\n topY + toggleHandlePadding,\n toggleHandleSize,\n group.collapsed,\n );\n const pushToVisibleGroups = (leftX, rightX) =>\n self.visibleGroups.push({\n type: 'c',\n collapsed,\n from: group.from,\n to: group.to,\n row,\n x: leftX + mx,\n y: topY + my,\n x2: rightX + mx,\n y2: bottomY + my,\n });\n\n //#region check the relationship between this group and frozen columns\n const crossTheFrozen =\n group.from < self.frozenColumn && group.to >= self.frozenColumn;\n const notInFrozen = group.from >= self.frozenColumn;\n //#endregion\n\n if (collapsed) {\n let leftX = leftmostX + toggleHandleSize;\n // This group is not sticking on the first column\n if (group.from > 0) {\n let colIndex = group.to + 1;\n let col = columnGroupsRectInfo[colIndex];\n if (!col) {\n colIndex = group.from - 1;\n col = columnGroupsRectInfo[colIndex];\n if (!col) continue; // don't draw this group indicator because it is invisible\n leftX = col.x + col.w - toggleHandleSize * 0.5;\n } else {\n leftX = col.x + toggleHandlePadding;\n }\n if (colIndex >= self.frozenColumn) {\n const compare =\n frozenColumnsWidth + rowHeaderCellWidth - toggleHandlePadding;\n // don't draw this group indicator because it is hidden by frozen columns\n if (leftX < compare) continue;\n }\n }\n const rightX = leftX + toggleHandleSize;\n ctx.save();\n ctx.strokeStyle = self.style.groupIndicatorColor;\n ctx.fillStyle = self.style.groupIndicatorBackgroundColor;\n drawGroupHandleAtX(leftX);\n ctx.restore();\n pushToVisibleGroups(leftX, rightX);\n } // end of collapsed group\n\n /** @type {number} pointer for loop */\n let ptr;\n let left = columnGroupsRectInfo[group.from];\n let right = columnGroupsRectInfo[group.to];\n\n let containsBegining = true;\n let containsEnd = true;\n ptr = group.from;\n while (!left && ptr < group.to) {\n left = columnGroupsRectInfo[++ptr];\n containsBegining = false;\n }\n ptr = group.to;\n while (!right && ptr > group.from) {\n right = columnGroupsRectInfo[--ptr];\n containsEnd = false;\n }\n if (!left || !right) continue;\n let rightX = right.x + right.w;\n let leftX = left.x;\n if (crossTheFrozen) {\n const rightCompare = columnGroupsRectInfo[self.frozenColumn - 1];\n if (rightCompare) {\n let compareX = rightCompare.x + rightCompare.w;\n if (!onTheLeft) compareX += toggleHandleSize;\n if (compareX >= rightX) {\n right = rightCompare;\n rightX = right.x + right.w;\n containsEnd = false;\n }\n }\n }\n\n let minLeftX =\n rowHeaderCellWidth + (notInFrozen ? frozenColumnsWidth : 0);\n if (rightX + (onTheLeft ? 0 : toggleHandleSize) < minLeftX) continue;\n\n rightX -= toggleHandlePadding;\n leftX += toggleHandlePadding;\n\n ctx.save();\n ctx.strokeStyle = self.style.groupIndicatorColor;\n ctx.fillStyle = self.style.groupIndicatorBackgroundColor;\n const lineCoords = [];\n\n if (onTheLeft) {\n // avoid lines from two groups be overlapping\n minLeftX += toggleHandlePadding * 2;\n if (leftX < minLeftX) leftX = minLeftX;\n if (group.from === 0) leftX -= toggleHandlePadding * 2;\n if (rightX >= leftX) {\n lineCoords.push(leftX, centerY, rightX, centerY);\n if (containsEnd) lineCoords.push(rightX, bottomY);\n } else {\n rightX = leftX;\n }\n\n leftX -= toggleHandleSize;\n drawGroupHandleAtX(leftX);\n // add more clickable area into `visibleGroups`\n rightX += toggleHandlePadding - 1;\n } else {\n // handle on the right\n if (leftX < minLeftX) leftX = minLeftX;\n if (group.from === 0) leftX -= toggleHandlePadding * 2;\n if (containsEnd) {\n if (group.to === self.frozenColumn - 1) {\n rightX -= toggleHandleSize;\n } else {\n rightX += toggleHandlePadding * 2;\n }\n drawGroupHandleAtX(rightX);\n }\n if (leftX > rightX) {\n leftX = rightX;\n } else {\n if (group.from === 0) {\n containsBegining = true;\n leftX = leftmostX + toggleHandleSize;\n }\n if (containsBegining) lineCoords.push(leftX, bottomY);\n lineCoords.push(leftX, centerY, rightX, centerY);\n }\n\n // add more clickable area into `visibleGroups`\n leftX -= toggleHandlePadding + 1;\n if (containsEnd) rightX += toggleHandleSize;\n }\n drawLines(lineCoords);\n ctx.restore();\n pushToVisibleGroups(leftX, rightX);\n }\n }\n //#endregion Columns Grouping\n\n //#region Rows Grouping\n /** it extends `self.groupedRows` */\n const groupedRows = [];\n for (let col = 0; col < self.groupedRows.length; col++) {\n const groups = self.groupedRows[col];\n for (let j = 0; j < groups.length; j++) {\n groupedRows.push(Object.assign({ col }, groups[j]));\n }\n }\n if (groupedRows.length > 0) {\n const colWidth = self.style.rowGroupColumnWidth;\n const toggleHandleSize = colWidth * 0.5;\n const toggleHandlePadding = (colWidth - toggleHandleSize) * 0.5;\n\n for (let i = 0; i < groupedRows.length; i++) {\n const group = groupedRows[i];\n const { col, collapsed } = group;\n\n const leftX = -mx + col * colWidth;\n const centerX = leftX + colWidth * 0.5;\n const rightX = leftX + colWidth - toggleHandlePadding;\n const topmostY =\n columnHeaderCellHeight - toggleHandleSize - toggleHandlePadding;\n\n const drawGroupHandleAtY = (y) =>\n drawGroupHandle(\n leftX + toggleHandlePadding,\n y,\n toggleHandleSize,\n group.collapsed,\n );\n const pushToVisibleGroups = (topY, bottomY) =>\n self.visibleGroups.push({\n type: 'r',\n collapsed,\n from: group.from,\n to: group.to,\n col,\n x: leftX + mx,\n y: topY + my,\n x2: rightX + mx,\n y2: bottomY + my,\n });\n\n //#region check the relationship between this group and frozen columns\n const crossTheFrozen =\n group.from < self.frozenRow && group.to >= self.frozenRow;\n const notInFrozen = group.from >= self.frozenRow;\n //#endregion\n\n if (collapsed) {\n let topY = topmostY + toggleHandleSize;\n // This group is not sticking on the first column\n if (group.from > 0) {\n let rowIndex = group.to + 1;\n let row = rowGroupsRectInfo[rowIndex];\n if (!row) {\n rowIndex = group.from - 1;\n row = rowGroupsRectInfo[rowIndex];\n if (!row) continue; // don't draw this group indicator because it is invisible\n topY = row.y + row.h - toggleHandleSize * 0.5;\n } else {\n topY = row.y;\n }\n if (rowIndex >= self.frozenRow) {\n const compare =\n frozenRowsHeight +\n columnHeaderCellHeight -\n toggleHandlePadding;\n // don't draw this group indicator because it is hidden by frozen columns\n if (topY < compare) continue;\n }\n }\n const bottomY = topY + toggleHandleSize;\n ctx.save();\n ctx.strokeStyle = self.style.groupIndicatorColor;\n ctx.fillStyle = self.style.groupIndicatorBackgroundColor;\n drawGroupHandleAtY(topY);\n ctx.restore();\n pushToVisibleGroups(topY, bottomY);\n } // end of collapsed group\n\n /** @type {number} pointer for loop */\n let ptr;\n let top = rowGroupsRectInfo[group.from];\n let bottom = rowGroupsRectInfo[group.to];\n\n let containsBegining = true;\n let containsEnd = true;\n ptr = group.from;\n while (!top && ptr < group.to) {\n top = rowGroupsRectInfo[++ptr];\n containsBegining = false;\n }\n ptr = group.to;\n while (!bottom && ptr > group.from) {\n bottom = rowGroupsRectInfo[--ptr];\n containsEnd = false;\n }\n if (!top || !bottom) continue;\n let bottomY = bottom.y + bottom.h;\n let topY = top.y;\n if (crossTheFrozen) {\n const bottomCompare = rowGroupsRectInfo[self.frozenRow - 1];\n if (bottomCompare) {\n let compareY = bottomCompare.y + bottomCompare.h;\n if (!onTheTop) compareY += toggleHandleSize;\n if (compareY >= bottomY) {\n bottom = bottomCompare;\n bottomY = bottom.y + bottom.h;\n containsEnd = false;\n }\n }\n }\n\n let minTopY =\n columnHeaderCellHeight + (notInFrozen ? frozenRowsHeight : 0);\n if (bottomY + (onTheTop ? 0 : toggleHandleSize) < minTopY) continue;\n\n bottomY -= toggleHandlePadding;\n topY += toggleHandlePadding;\n\n ctx.save();\n ctx.strokeStyle = self.style.groupIndicatorColor;\n ctx.fillStyle = self.style.groupIndicatorBackgroundColor;\n const lineCoords = [];\n\n if (onTheTop) {\n // avoid lines from two groups be overlapping\n minTopY += toggleHandlePadding * 2;\n if (topY < minTopY) topY = minTopY;\n if (group.from === 0) topY -= toggleHandlePadding * 2;\n if (bottomY >= topY) {\n lineCoords.push(centerX, topY, centerX, bottomY);\n if (containsEnd) lineCoords.push(rightX, bottomY);\n } else {\n bottomY = topY;\n }\n\n topY -= toggleHandleSize;\n drawGroupHandleAtY(topY);\n\n // add more clickable area into `visibleGroups`\n bottomY += toggleHandlePadding - 1;\n } else {\n // handle on the bottom\n if (topY < minTopY) topY = minTopY;\n if (group.from === 0) topY -= toggleHandlePadding * 2;\n if (containsEnd) {\n if (group.to === self.frozenRow - 1) {\n bottomY -= toggleHandleSize;\n } else {\n // bottomY += toggleHandlePadding * 2;\n }\n drawGroupHandleAtY(bottomY);\n }\n if (topY > bottomY) {\n topY = bottomY;\n } else {\n if (group.from === 0) {\n containsBegining = true;\n topY = topmostY + toggleHandleSize;\n }\n if (containsBegining) lineCoords.push(rightX, topY);\n lineCoords.push(centerX, topY, centerX, bottomY);\n // add more clickable area into `visibleGroups`\n topY -= toggleHandlePadding + 1;\n }\n // add more clickable area into `visibleGroups`\n if (containsEnd) bottomY += toggleHandleSize;\n }\n drawLines(lineCoords);\n ctx.restore();\n pushToVisibleGroups(topY, bottomY);\n }\n }\n //#endregion Rows Grouping\n }\n function drawFrozenRows() {\n var rowOrderIndex,\n ln = Math.min(viewData.length, self.frozenRow);\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n y = columnHeaderCellHeight;\n for (rowIndex = 0; rowIndex < ln; rowIndex += 1) {\n rowOrderIndex = self.orders.rows[rowIndex];\n if (!drawRow(rowOrderIndex, rowIndex)) {\n break;\n }\n }\n if (self.attributes.allowFreezingRows) {\n // HACK great, another stupid magic number.\n // Background will appear as a 0.5px artifact behind the row freeze bar without this hack\n if (y > columnHeaderCellHeight) y += self.style.frozenMarkerWidth;\n y += self.style.frozenMarkerBorderWidth - 0.4999999999;\n }\n self.lastFrozenRowPixel = y;\n }\n function drawRows() {\n self.ctx.save();\n if (self.frozenRow > 0) {\n radiusRect(\n 0,\n self.lastFrozenRowPixel,\n self.width,\n self.height - self.lastFrozenRowPixel,\n 0,\n );\n self.ctx.clip();\n }\n var columnOrderIndex,\n rowOrderIndex,\n headerIndex,\n g = schema.length;\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n if (!self.attributes.snapToRow) {\n y +=\n -self.scrollBox.scrollTop +\n self.scrollPixelTop +\n self.style.cellBorderWidth;\n }\n for (\n rowIndex = self.frozenRow + self.scrollIndexTop;\n rowIndex < l;\n rowIndex += 1\n ) {\n rowOrderIndex = self.orders.rows[rowIndex];\n self.scrollIndexBottom = rowIndex;\n self.scrollPixelBottom = y;\n if (\n self.cellTree.rows.length > 0 &&\n Object.keys(self.cellTree.rows[rowOrderIndex]).length > 0 &&\n self.cellTree.rows[rowOrderIndex].hide\n )\n continue;\n if (!drawRow(rowOrderIndex, rowIndex)) {\n break;\n }\n }\n if (self.attributes.showNewRow) {\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n rowHeight = cellHeight = self.style.cellHeight;\n rowOpen = false;\n for (\n columnOrderIndex = self.scrollIndexLeft;\n columnOrderIndex < g;\n columnOrderIndex += 1\n ) {\n if (!isColumnCollapsedByGroup(columnOrderIndex)) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(self.newRow, viewData.length, viewData.length)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n }\n if (x > self.width + self.scrollBox.scrollLeft) {\n break;\n }\n }\n rowHeaders.push([\n self.newRow,\n viewData.length,\n viewData.length,\n y,\n rowHeight,\n ]);\n }\n self.ctx.restore();\n }\n function drawMoveMarkers() {\n if (!self.movingSelection) {\n return;\n }\n self.ctx.lineWidth = self.style.moveOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.moveOverlayBorderColor;\n self.ctx.setLineDash(self.style.moveOverlayBorderSegments);\n moveBorders.forEach(function (c) {\n addBorderLine(c[0], c[1]);\n });\n self.ctx.setLineDash([]);\n }\n function drawReorderMarkers() {\n if (!self.reorderObject) {\n return;\n }\n var b = {\n height: self.reorderObject.height,\n width: self.reorderObject.width,\n x: self.reorderObject.x + self.reorderObject.dragOffset.x,\n y: self.reorderObject.y + self.reorderObject.dragOffset.y,\n },\n m = {\n width: w,\n height: h,\n x: 0,\n y: 0,\n };\n self.ctx.fillStyle = self.style.reorderMarkerBackgroundColor;\n self.ctx.lineWidth = self.style.reorderMarkerBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerBorderColor;\n if (self.dragMode === 'row-reorder') {\n b.height = self.getSelectedRowsHeight();\n b.width = w;\n b.x = 0;\n m.width = w;\n m.height = self.currentCell.height;\n m.y = self.currentCell.y;\n fillRect(b.x, b.y, b.width, b.height);\n strokeRect(b.x, b.y, b.width, b.height);\n self.ctx.lineWidth = self.style.reorderMarkerIndexBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerIndexBorderColor;\n if (\n !self.isRowSelected(self.reorderTarget.sortRowIndex) &&\n self.currentCell.rowIndex !== self.reorderObject.rowIndex &&\n self.currentCell.rowIndex > -1 &&\n self.currentCell.rowIndex < l\n ) {\n addBorderLine(\n m,\n self.reorderTarget.sortRowIndex > self.reorderObject.sortRowIndex\n ? 'b'\n : 't',\n );\n }\n } else if (self.dragMode === 'column-reorder' && self.reorderObject) {\n b.width = self.getSelectedColumnsWidth();\n b.height = h;\n b.y = 0;\n m.height = h;\n m.width = self.currentCell.width;\n m.y = 0;\n m.x = self.currentCell.x;\n fillRect(b.x, b.y, b.width, b.height);\n strokeRect(b.x, b.y, b.width, b.height);\n self.ctx.lineWidth = self.style.reorderMarkerIndexBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerIndexBorderColor;\n if (\n !self.isColumnSelected(self.reorderTarget.sortColumnIndex) &&\n self.currentCell.sortColumnIndex !==\n self.reorderObject.sortColumnIndex &&\n self.reorderTarget.columnIndex !== self.reorderObject.columnIndex &&\n self.currentCell.sortColumnIndex > -1 &&\n self.currentCell.sortColumnIndex < schema.length\n ) {\n addBorderLine(\n m,\n self.reorderTarget.columnIndex > self.reorderObject.columnIndex\n ? 'r'\n : 'l',\n );\n }\n }\n }\n function drawResizeMarkers() {\n if (\n !self.attributes.resizeAfterDragged ||\n !self.draggingItem ||\n !self.pendingDragResize ||\n (self.dragMode != 'ew-resize' && self.dragMode != 'ns-resize')\n ) {\n return;\n }\n\n const resizingRow = self.dragMode == 'ns-resize';\n const height = resizingRow ? self.style.resizeMarkerSize : self.height;\n const width = resizingRow ? self.width : self.style.resizeMarkerSize;\n const minX =\n self.dragStart.x -\n (self.resizingStartingWidth - self.style.minColumnWidth);\n const minY =\n self.dragStart.y -\n (self.resizingStartingHeight - self.style.minRowHeight);\n const x = resizingRow ? 0 : Math.max(self.pendingDragResize.x, minX);\n const y = !resizingRow ? 0 : Math.max(self.pendingDragResize.y, minY);\n\n self.ctx.fillStyle = self.style.resizeMarkerColor;\n fillRect(x, y, width, height);\n }\n function drawBorder() {\n self.ctx.lineWidth = self.style.gridBorderWidth;\n self.ctx.strokeStyle = self.style.gridBorderColor;\n strokeRect(0, 0, self.width, self.height);\n }\n function drawSelectionBorders() {\n function dsb(c) {\n if (!self.fillOverlay.handle) {\n self.ctx.lineWidth = self.style.selectionOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.selectionOverlayBorderColor;\n addBorderLine(c[0], c[1]);\n }\n }\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex < self.frozenRow &&\n c[0].columnIndex < self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.save();\n clipFrozenArea(0);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex >= self.frozenRow &&\n c[0].columnIndex >= self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n self.ctx.save();\n clipFrozenArea(1);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex >= self.frozenRow &&\n c[0].columnIndex < self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n self.ctx.save();\n clipFrozenArea(2);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex < self.frozenRow &&\n c[0].columnIndex >= self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n\n drawFillOverlay();\n }\n function drawSelectionHandles() {\n if (\n (self.mobile || self.attributes.allowMovingSelection) &&\n self.attributes.editable\n ) {\n self.ctx.lineWidth = self.style.selectionHandleBorderWidth;\n self.ctx.strokeStyle = self.style.selectionHandleBorderColor;\n self.ctx.fillStyle = self.style.selectionHandleColor;\n selectionHandles.forEach(function (c) {\n addselectionHandle(c[0], c[1]);\n var az = self.attributes.touchSelectHandleZone / 2,\n ax =\n c[0].x + (c[1] === 'tl' || c[1] === 'bl' ? 0 : c[0].width) - az,\n ay =\n c[0].y + (c[1] === 'bl' || c[1] === 'br' ? c[0].height : 0) - az;\n self.visibleCells.unshift({\n x: ax,\n y: ay,\n height: self.style.selectionHandleSize + az,\n width: self.style.selectionHandleSize + az,\n style: 'selection-handle-' + c[1],\n });\n });\n }\n }\n function drawFillOverlay() {\n if (!self.fillOverlay.handle || !self.fillOverlay.snapTo) {\n return;\n }\n\n self.ctx.save();\n\n const overlay = self.fillOverlay;\n const handle = overlay.handle;\n const toX = overlay.snapTo.x;\n const toY = overlay.snapTo.y;\n\n // The cell that the cursor is moving over. This may be unavailable\n // when the cursor is outside the grid or is pointing to something else.\n //\n // When unavailable, we use the actual position of the cursor to draw\n // the overlay.\n const snap = overlay.snap;\n\n // Calculate the X, Y coordinates of the cursor with snap positions and\n // the direction of the movement in mind.\n //\n // When the movement is horizontal, we get the Y coordinate from the handle,\n // and vice-versa.\n const cursorX =\n overlay.direction === 'x'\n ? snap\n ? snap.x + (overlay.x < toX ? 0 : snap.width)\n : overlay.x\n : handle.x;\n const cursorY =\n overlay.direction === undefined || overlay.direction === 'y'\n ? snap\n ? snap.y + (overlay.y < toY ? 0 : snap.height)\n : overlay.y\n : handle.y;\n\n // The final coordinates of the rect. We use 'minX' and 'minY' to avoid\n // drawing on the frozen area.\n const x = Math.max(Math.min(toX, cursorX), overlay.minX);\n const y = Math.max(Math.min(toY, cursorY), overlay.minY);\n\n // Width and height of the rect are the difference between the\n // coordinates of both the rect and the cursor. The user may be pointing\n // behind and/or upwards of the rect, so we need to take that into\n // account.\n const width = Math.max(toX, cursorX) - x;\n const height = Math.max(toY, cursorY) - y;\n\n self.ctx.strokeStyle = self.style.fillOverlayBorderColor;\n self.ctx.lineWidth = self.style.fillOverlayBorderWidth;\n self.ctx.setLineDash([3, 3]);\n strokeRect(x, y, width, height);\n self.ctx.setLineDash([]);\n self.ctx.restore();\n }\n function drawActiveCell() {\n if (!aCell) {\n return;\n }\n self.ctx.save();\n var cl =\n self.activeCell.columnIndex + 1 > self.frozenColumn ||\n self.activeCell.rowIndex + 1 > self.frozenRow,\n acx = cl ? self.lastFrozenColumnPixel : 0,\n acy = cl ? self.lastFrozenRowPixel : 0,\n acw = cl ? self.width - self.lastFrozenColumnPixel : self.width,\n ach = cl ? self.height - self.lastFrozenRowPixel : self.height;\n radiusRect(acx, acy, acw, ach, 0);\n self.ctx.clip();\n if (self.attributes.selectionMode === 'row') {\n if (self.activeCell && self.activeCell.rowIndex === aCell.rowIndex) {\n self.ctx.lineWidth = self.style.activeCellOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.activeCellOverlayBorderColor;\n strokeRect(\n 1,\n aCell.y,\n self.getHeaderWidth() + rowHeaderCellWidth,\n self.visibleRowHeights[aCell.rowIndex],\n );\n }\n } else {\n self.ctx.lineWidth = self.style.activeCellOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.activeCellOverlayBorderColor;\n strokeRect(aCell.x, aCell.y, aCell.width, aCell.height);\n }\n self.ctx.restore();\n }\n function drawFrozenMarkers() {\n var my = self.lastFrozenRowPixel - self.style.frozenMarkerWidth,\n mx = self.lastFrozenColumnPixel - self.style.frozenMarkerWidth,\n xHover =\n self.currentCell && self.currentCell.style === 'frozen-row-marker',\n yHover =\n self.currentCell && self.currentCell.style === 'frozen-column-marker';\n let rowHeaderCellWidth = self.getRowHeaderCellWidth();\n self.ctx.lineWidth = self.style.frozenMarkerBorderWidth;\n if (self.attributes.allowFreezingColumns) {\n if (\n !self.freezeMarkerPosition ||\n (self.freezeMarkerPosition && self.dragMode === 'frozen-row-marker')\n ) {\n if (mx > self.style.rowHeaderCellWidth) {\n self.ctx.fillStyle = self.style.frozenMarkerColor;\n self.ctx.strokeStyle = self.style.frozenMarkerBorderColor;\n fillRect(mx, 0, self.style.frozenMarkerWidth, self.height);\n strokeRect(mx, 0, self.style.frozenMarkerWidth, self.height);\n }\n self.ctx.fillStyle = yHover\n ? self.style.frozenMarkerHoverColor\n : self.style.frozenMarkerHeaderColor;\n self.ctx.strokeStyle = yHover\n ? self.style.frozenMarkerHoverBorderColor\n : self.style.frozenMarkerHeaderColor;\n fillRect(\n mx,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n strokeRect(\n mx,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n }\n\n if (\n !self.dragStartObject ||\n (self.dragStartObject &&\n self.dragStartObject.style !== 'rowHeaderCell')\n ) {\n self.visibleCells.unshift({\n x: mx,\n y: 0,\n height: self.height,\n width: self.style.frozenMarkerWidth, // + self.style.frozenMarkerBorderWidth,\n style: 'frozen-column-marker',\n });\n }\n }\n if (self.attributes.allowFreezingRows) {\n if (\n !self.freezeMarkerPosition ||\n (self.freezeMarkerPosition &&\n self.dragMode === 'frozen-column-marker')\n ) {\n if (my > rowHeaderCellWidth) {\n self.ctx.fillStyle = self.style.frozenMarkerColor;\n self.ctx.strokeStyle = self.style.frozenMarkerBorderColor;\n fillRect(0, my, self.width, self.style.frozenMarkerWidth);\n strokeRect(0, my, self.width, self.style.frozenMarkerWidth);\n }\n self.ctx.fillStyle = xHover\n ? self.style.frozenMarkerHoverColor\n : self.style.frozenMarkerHeaderColor;\n self.ctx.strokeStyle = xHover\n ? self.style.frozenMarkerHoverBorderColor\n : self.style.frozenMarkerHeaderColor;\n fillRect(0, my, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n strokeRect(0, my, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n }\n var height =\n self.style.frozenMarkerWidth + self.style.frozenMarkerBorderWidth;\n if (\n !self.dragStartObject ||\n (self.dragStartObject &&\n self.dragStartObject.style !== 'columnHeaderCell')\n ) {\n self.visibleCells.unshift({\n x: 0,\n y: my,\n height: height,\n width: self.width,\n style: 'frozen-row-marker',\n });\n }\n rowGroupsFrozenInfo = { y: my, h: height };\n }\n if (self.freezeMarkerPosition) {\n self.ctx.fillStyle = self.style.frozenMarkerActiveColor;\n self.ctx.strokeStyle = self.style.frozenMarkerActiveBorderColor;\n if (self.dragMode === 'frozen-column-marker') {\n let posX = self.freezeMarkerPosition.x;\n let nearCell = self.getCellAt(posX, 0);\n if (self.freezeMarkerPosition.isGrab) posX = mx;\n if (posX > rowHeaderCellWidth) {\n let x =\n nearCell.x -\n self.style.frozenMarkerWidth -\n self.style.frozenMarkerBorderWidth;\n if (posX > x + nearCell.width / 2) x = x + nearCell.width;\n self.ctx.fillStyle = self.style.frozenMarkerColor;\n self.ctx.strokeStyle = self.style.frozenMarkerBorderColor;\n fillRect(x, 0, self.style.frozenMarkerWidth, self.height);\n strokeRect(x, 0, self.style.frozenMarkerWidth, self.height);\n self.ctx.fillStyle = self.style.frozenMarkerHeaderColor;\n self.ctx.strokeStyle = self.style.frozenMarkerHeaderColor;\n fillRect(\n x,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n strokeRect(\n x,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n }\n self.ctx.fillStyle = self.style.frozenMarkerActiveHeaderColor;\n self.ctx.strokeStyle = self.style.frozenMarkerActiveBorderColor;\n fillRect(\n posX,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n strokeRect(\n posX,\n 0,\n self.style.frozenMarkerWidth,\n self.style.columnHeaderCellHeight,\n );\n self.ctx.fillStyle = self.style.frozenMarkerActiveColor;\n fillRect(posX, 0, self.style.frozenMarkerWidth, self.height);\n strokeRect(posX, 0, self.style.frozenMarkerWidth, self.height);\n } else {\n let posY = self.freezeMarkerPosition.y;\n let nearCell = self.getCellAt(0, posY);\n if (self.freezeMarkerPosition.isGrab) posY = my;\n if (posY > self.style.columnHeaderCellHeight) {\n let y =\n nearCell.y -\n self.style.frozenMarkerWidth -\n self.style.frozenMarkerBorderWidth;\n if (posY > y + nearCell.height / 2) y = y + nearCell.height;\n self.ctx.fillStyle = self.style.frozenMarkerColor;\n self.ctx.strokeStyle = self.style.frozenMarkerBorderColor;\n fillRect(0, y, self.width, self.style.frozenMarkerWidth);\n strokeRect(0, y, self.width, self.style.frozenMarkerWidth);\n self.ctx.fillStyle = self.style.frozenMarkerHeaderColor;\n self.ctx.strokeStyle = self.style.frozenMarkerHeaderColor;\n fillRect(0, y, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n strokeRect(0, y, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n }\n self.ctx.fillStyle = self.style.frozenMarkerActiveHeaderColor;\n self.ctx.strokeStyle = self.style.frozenMarkerActiveBorderColor;\n fillRect(0, posY, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n strokeRect(0, posY, rowHeaderCellWidth, self.style.frozenMarkerWidth);\n self.ctx.fillStyle = self.style.frozenMarkerActiveColor;\n fillRect(0, posY, self.width, self.style.frozenMarkerWidth);\n strokeRect(0, posY, self.width, self.style.frozenMarkerWidth);\n }\n }\n }\n function drawPerfLines() {\n if (!self.attributes.showPerformance) {\n return;\n }\n var pw = 250,\n px =\n self.width -\n pw -\n self.style.scrollBarWidth -\n self.style.scrollBarBorderWidth * 2,\n py = columnHeaderCellHeight,\n ph = 100;\n if (scrollDebugCounters.length === 0) {\n scrollDebugCounters = fillArray(0, perfWindowSize, 1, function () {\n return [0, 0];\n });\n }\n if (touchPPSCounters.length === 0) {\n touchPPSCounters = fillArray(0, perfWindowSize, 1, function () {\n return [0, 0];\n });\n }\n if (entityCount.length === 0) {\n entityCount = fillArray(0, perfWindowSize, 1, 0);\n }\n self.ctx.lineWidth = 0.5;\n function dpl(name, perfArr, arrIndex, max, color, useAbs, rowIndex) {\n var v;\n drawPerfLine(pw, ph, px, py, perfArr, arrIndex, max, color, useAbs);\n self.ctx.fillStyle = color;\n fillRect(3 + px, py + 9 + rowIndex * 11, 8, 8);\n self.ctx.fillStyle = self.style.debugPerfChartTextColor;\n v = arrIndex !== undefined ? perfArr[0][arrIndex] : perfArr[0];\n fillText(\n name + ' ' + (isNaN(v) ? 0 : v).toFixed(3),\n 14 + px,\n py + 16 + rowIndex * 11,\n );\n }\n self.ctx.textAlign = 'left';\n self.ctx.font = self.style.debugFont;\n self.ctx.fillStyle = self.style.debugPerfChartBackground;\n fillRect(px, py, pw, ph);\n [\n [\n 'Scroll Height',\n scrollDebugCounters,\n 0,\n self.scrollBox.scrollHeight,\n self.style.debugScrollHeightColor,\n false,\n ],\n [\n 'Scroll Width',\n scrollDebugCounters,\n 1,\n self.scrollBox.scrollWidth,\n self.style.debugScrollWidthColor,\n false,\n ],\n [\n 'Performance',\n perfCounters,\n undefined,\n 200,\n self.style.debugPerformanceColor,\n false,\n ],\n [\n 'Entities',\n entityCount,\n undefined,\n 1500,\n self.style.debugEntitiesColor,\n false,\n ],\n [\n 'TouchPPSX',\n touchPPSCounters,\n 0,\n 1000,\n self.style.debugTouchPPSXColor,\n true,\n ],\n [\n 'TouchPPSY',\n touchPPSCounters,\n 1,\n 1000,\n self.style.debugTouchPPSYColor,\n true,\n ],\n ].forEach(function (i, index) {\n i.push(index);\n dpl.apply(null, i);\n });\n self.ctx.fillStyle = self.style.debugPerfChartBackground;\n entityCount.pop();\n entityCount.unshift(self.visibleCells.length);\n scrollDebugCounters.pop();\n scrollDebugCounters.unshift([\n self.scrollBox.scrollTop,\n self.scrollBox.scrollLeft,\n ]);\n touchPPSCounters.pop();\n touchPPSCounters.unshift([self.yPPS, self.xPPS]);\n }\n function drawDebug() {\n self.ctx.save();\n var d;\n if (self.attributes.showPerformance || self.attributes.debug) {\n if (perfCounters.length === 0) {\n perfCounters = fillArray(0, perfWindowSize, 1, 0);\n }\n perfCounters.pop();\n perfCounters.unshift(performance.now() - p);\n }\n if (!self.attributes.debug) {\n self.ctx.restore();\n return;\n }\n self.ctx.font = self.style.debugFont;\n d = {};\n d.perf = (\n perfCounters.reduce(function (a, b) {\n return a + b;\n }, 0) / Math.min(drawCount, perfCounters.length)\n ).toFixed(1);\n d.perfDelta = perfCounters[0].toFixed(1);\n d.frozenColumnsWidth = getFrozenColumnsWidth();\n d.htmlImages = Object.keys(self.htmlImageCache).length;\n d.reorderObject =\n 'x: ' +\n (self.reorderObject || { columnIndex: 0 }).columnIndex +\n ', y: ' +\n (self.reorderObject || { rowIndex: 0 }).rowIndex;\n d.reorderTarget =\n 'x: ' +\n (self.reorderTarget || { columnIndex: 0 }).columnIndex +\n ', y: ' +\n (self.reorderTarget || { rowIndex: 0 }).rowIndex;\n d.scale = self.scale;\n d.startScale = self.startScale;\n d.scaleDelta = self.scaleDelta;\n d.zoomDeltaStart = self.zoomDeltaStart;\n d.touchLength = self.touchLength;\n d.touches =\n 'y0: ' +\n (self.touchPosition || { y: 0 }).y +\n ' y1: ' +\n (self.touchPosition1 || { y: 0 }).y;\n d.scrollBox = self.scrollBox.toString();\n d.scrollIndex =\n 'x: ' + self.scrollIndexLeft + ', y: ' + self.scrollIndexTop;\n d.scrollPixel =\n 'x: ' + self.scrollPixelLeft + ', y: ' + self.scrollPixelTop;\n d.canvasOffset =\n 'x: ' + self.canvasOffsetLeft + ', y: ' + self.canvasOffsetTop;\n d.touchDelta = 'x: ' + self.touchDelta.x + ', y: ' + self.touchDelta.y;\n d.touchAnimateTo =\n 'x: ' + self.touchAnimateTo.x + ', y: ' + self.touchAnimateTo.y;\n d.scrollAnimation =\n 'x: ' + self.scrollAnimation.x + ', y: ' + self.scrollAnimation.y;\n d.touchPPS = 'x: ' + self.xPPS + ', y: ' + self.yPPS;\n d.touchPPST = 'x: ' + self.xPPST + ', y: ' + self.yPPST;\n d.touchDuration = self.touchDuration;\n d.pointerLockPosition = self.pointerLockPosition\n ? self.pointerLockPosition.x + ', ' + self.pointerLockPosition.y\n : '';\n d.size = 'w: ' + self.width + ', h: ' + self.height;\n d.mouse = 'x: ' + self.mouse.x + ', y: ' + self.mouse.y;\n d.touch = !self.touchStart\n ? ''\n : 'x: ' + self.touchStart.x + ', y: ' + self.touchStart.y;\n d.entities = self.visibleCells.length;\n d.hasFocus = self.hasFocus;\n d.dragMode = self.dragMode;\n if (self.currentCell) {\n d.columnIndex = self.currentCell.columnIndex;\n d.rowIndex = self.currentCell.rowIndex;\n d.sortColumnIndex = self.currentCell.sortColumnIndex;\n d.sortRowIndex = self.currentCell.sortRowIndex;\n d.context = self.currentCell.context;\n d.dragContext = self.currentCell.dragContext;\n d.style = self.currentCell.style;\n d.type = self.currentCell.type;\n }\n self.ctx.textAlign = 'right';\n self.ctx.fillStyle = self.style.debugBackgroundColor;\n fillRect(0, 0, self.width, self.height);\n Object.keys(d).forEach(function (key, index) {\n var m = key + ': ' + d[key],\n lh = 14;\n self.ctx.fillStyle = self.style.debugColor;\n fillText(\n m,\n w - 20,\n (self.attributes.showPerformance ? 140 : 24) + index * lh,\n );\n });\n self.ctx.restore();\n }\n self.ctx.save();\n initDraw();\n drawBackground();\n initGroupArea();\n drawFrozenRows();\n drawRows();\n drawActiveCell();\n drawHeaders();\n drawFrozenMarkers();\n drawSelectionHandles();\n drawReorderMarkers();\n drawMoveMarkers();\n drawResizeMarkers();\n drawBorder();\n drawSelectionBorders();\n drawScrollBars();\n if (checkScrollHeight) {\n self.resize(true);\n }\n drawGroupArea();\n drawDebug();\n drawPerfLines();\n if (self.dispatchEvent('afterdraw', {})) {\n return;\n }\n self.ctx.restore();\n };\n}\n","/*jslint browser: true, unparam: true, todo: true, plusplus: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport isPrintableKeyEvent from 'is-printable-key-event';\nimport { isSupportedHtml, parseData, deduceColTypeFromData } from './util';\n\nexport default function (self) {\n var wheeling;\n self.stopPropagation = function (e) {\n e.stopPropagation();\n };\n /**\n * Adds an event listener to the given event.\n * @memberof canvasDatagrid\n * @name addEventListener\n * @method\n * @param {string} ev The name of the event to subscribe to.\n * @param {function} fn The event procedure to execute when the event is raised.\n */\n self.addEventListener = function (ev, fn) {\n self.events[ev] = self.events[ev] || [];\n self.events[ev].unshift(fn);\n };\n /**\n * Removes the given listener function from the given event. Must be an actual reference to the function that was bound.\n * @memberof canvasDatagrid\n * @name removeEventListener\n * @method\n * @param {string} ev The name of the event to unsubscribe from.\n * @param {function} fn The event procedure to execute when the event is raised.\n */\n self.removeEventListener = function (ev, fn) {\n (self.events[ev] || []).forEach(function removeEachListener(sfn, idx) {\n if (fn === sfn) {\n self.events[ev].splice(idx, 1);\n }\n });\n };\n /**\n * Fires the given event, passing an event object to the event subscribers.\n * @memberof canvasDatagrid\n * @name dispatchEvent\n * @method\n * @param {number} ev The name of the event to dispatch.\n * @param {number} e The event object.\n */\n self.dispatchEvent = function (ev, e) {\n e = ev.type ? ev : e || {};\n ev = ev.type || ev;\n var defaultPrevented;\n function preventDefault() {\n defaultPrevented = true;\n }\n if (!self.events[ev]) {\n return;\n }\n self.events[ev].forEach(function dispatchEachEvent(fn) {\n e.ctx = self.ctx;\n e.preventDefault = preventDefault;\n fn.apply(self.intf, [e]);\n });\n return defaultPrevented;\n };\n self.getRatio = function () {\n return Math.min(\n self.attributes.maxPixelRatio,\n (window.devicePixelRatio || 1) /\n (self.ctx.webkitBackingStorePixelRatio ||\n self.ctx.mozBackingStorePixelRatio ||\n self.ctx.msBackingStorePixelRatio ||\n self.ctx.oBackingStorePixelRatio ||\n self.ctx.backingStorePixelRatio ||\n 1),\n );\n };\n /**\n * @returns {number} dataWidth\n */\n self.refreshScrollCacheX = function () {\n const s = self.getSchema();\n self.scrollCache.x = [];\n\n /** @type {number} it will be used in `reduceSchema` only */\n let frozenWidth = 0;\n\n const collapsedColumnGroups = self.getCollapsedColumnGroups();\n const isColumnCollapsed = (columnIndex) =>\n collapsedColumnGroups.findIndex(\n (group) => columnIndex >= group.from && columnIndex <= group.to,\n ) >= 0;\n\n const dataWidth =\n s.reduce(function reduceSchema(accumulator, column, columnIndex) {\n // intentional redefintion of column. This causes scrollCache to be in the correct order\n const schemaIndex = self.orders.columns[columnIndex];\n const columnWidth = self.getColumnWidth(schemaIndex);\n column = s[schemaIndex];\n if (!column.hidden && !isColumnCollapsed(columnIndex))\n accumulator += columnWidth;\n if (columnIndex < self.frozenColumn) {\n self.scrollCache.x[columnIndex] = accumulator;\n frozenWidth = accumulator;\n } else {\n self.scrollCache.x[columnIndex] = Math.max(\n frozenWidth + columnWidth,\n accumulator,\n );\n }\n return accumulator;\n }, 0) || 0;\n return dataWidth;\n };\n self.resize = function (drawAfterResize) {\n if (!self.canvas) {\n return;\n }\n var x,\n v = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'vertical-scroll-bar',\n },\n n = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'horizontal-scroll-bar',\n },\n vb = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'vertical-scroll-box',\n },\n nb = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'horizontal-scroll-box',\n },\n co = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n isCorner: true,\n isScrollBoxCorner: true,\n style: 'scroll-box-corner',\n },\n m = self.style.scrollBarBoxMargin * 2,\n b = self.style.scrollBarBorderWidth * 2,\n d = self.style.scrollBarBoxMargin * 0.5,\n sbw = self.style.scrollBarWidth + self.style.scrollBarBorderWidth * 2,\n ratio = self.getRatio(),\n bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n cellBorder = self.style.cellBorderWidth * bm,\n columnHeaderCellBorder = self.style.columnHeaderCellBorderWidth * bm,\n dataHeight = 0,\n dataWidth = 0,\n dims,\n l = (self.viewData || []).length,\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n topGroupAreaHeight = self.getColumnGroupAreaHeight(),\n leftGroupAreaWidth = self.getRowGroupAreaWidth(),\n ch = self.style.cellHeight,\n containerSpace = self.isChildGrid ? {} : self.measureContainerSpace();\n function isAutoSize(value) {\n return value === undefined || value === 'auto' || value === '';\n }\n function checkScrollBoxVisibility() {\n // an auto-sized grid shows a scroll bar only when it could not grow to\n // its content (container, viewport or canvas limit); a child grid is\n // always bounded by the tree row or cell that holds it\n var constrained = self.autoSizeConstrained || {};\n self.scrollBox.horizontalBarVisible =\n ((!isAutoSize(self.style.width) || constrained.width) &&\n dataWidth > self.scrollBox.width &&\n self.style.overflowX !== 'hidden') ||\n self.style.overflowX === 'scroll';\n self.scrollBox.horizontalBoxVisible = dataWidth > self.scrollBox.width;\n self.scrollBox.verticalBarVisible =\n ((!isAutoSize(self.style.height) || constrained.height) &&\n dataHeight > self.scrollBox.height &&\n self.style.overflowY !== 'hidden') ||\n self.style.overflowY === 'scroll';\n self.scrollBox.verticalBoxVisible = dataHeight > self.scrollBox.height;\n }\n function setScrollBoxSize() {\n self.scrollBox.width =\n self.width - rowHeaderCellWidth - leftGroupAreaWidth;\n self.scrollBox.height =\n self.height - columnHeaderCellHeight - topGroupAreaHeight;\n }\n // sizes the DOM canvas element and reads back the size the grid got\n function setCanvasSize() {\n if (self.isChildGrid) {\n // a child grid fills the tree row or cell that holds it\n self.autoSizeConstrained = { width: true, height: true };\n self.width = self.parentNode.offsetWidth;\n self.height = self.parentNode.offsetHeight;\n return;\n }\n dims = {\n // HACK +1 ? maybe it's a magic cell border? Required to line up properly in auto height mode.\n height:\n columnHeaderCellHeight +\n topGroupAreaHeight +\n dataHeight +\n cellBorder +\n 1,\n width: dataWidth + rowHeaderCellWidth + cellBorder + leftGroupAreaWidth,\n };\n var maxCanvasSize = self.attributes.maxCanvasSize;\n self.autoSizeConstrained = { width: false, height: false };\n ['width', 'height'].forEach(function (dim) {\n var styleIsAuto = isAutoSize(self.style[dim]),\n inlineIsAuto = isAutoSize(self.appliedInlineStyles[dim]),\n size;\n //TODO: support inherit\n if (styleIsAuto && inlineIsAuto) {\n // No explicit size: fill the container when it has a size of its\n // own in this dimension, otherwise fit the content but never grow\n // past the viewport. Browsers also refuse to paint canvases beyond\n // roughly 16k px per side (#254), so cap the element there too and\n // let the grid scroll for the remainder.\n size = dims[dim];\n if (containerSpace[dim] !== undefined) {\n size = containerSpace[dim];\n } else {\n size = Math.min(\n size,\n dim === 'height' ? window.innerHeight : window.innerWidth,\n );\n }\n size = Math.max(0, Math.min(size, maxCanvasSize));\n self.autoSizeConstrained[dim] = size < dims[dim];\n self.parentNodeStyle[dim] = size + 'px';\n } else if (!styleIsAuto && !inlineIsAuto) {\n self.parentNodeStyle[dim] = self.style[dim];\n }\n });\n self.width = self.canvas.offsetWidth;\n self.height = self.canvas.offsetHeight;\n self.canvasOffsetLeft = self.args.canvasOffsetLeft || 0;\n self.canvasOffsetTop = self.args.canvasOffsetTop || 0;\n }\n self.autoLastColumnWidth = undefined;\n dataWidth = self.refreshScrollCacheX();\n self.scrollCache.y = [];\n for (x = 0; x < l; x += 1) {\n self.scrollCache.y[x] = dataHeight;\n dataHeight +=\n ((self.sizes.rows[x] || ch) + (self.sizes.trees[x] || 0)) * self.scale +\n // HACK? if an expanded tree row is frozen it is necessary to add the tree row's height a second time.\n (self.frozenRow > x ? self.sizes.trees[x] || 0 : 0);\n }\n if (l > 1) {\n self.scrollCache.y[x] = dataHeight;\n }\n if (self.attributes.showNewRow) {\n dataHeight += ch;\n }\n if (self.attributes.snapToRow) {\n dataHeight += self.style.cellHeight;\n }\n setCanvasSize();\n /// calculate scroll bar dimensions\n // non-controversial\n self.scrollBox.top =\n columnHeaderCellHeight + topGroupAreaHeight + columnHeaderCellBorder;\n self.scrollBox.left = rowHeaderCellWidth + leftGroupAreaWidth;\n // width and height of scroll box\n setScrollBoxSize();\n // is the data larger than the scroll box\n checkScrollBoxVisibility();\n // if the scroll box is visible, make room for it by expanding the size of the element\n // if the other dimension is set to auto\n if (self.scrollBox.horizontalBarVisible) {\n dataHeight += sbw;\n setCanvasSize();\n setScrollBoxSize();\n checkScrollBoxVisibility();\n }\n if (self.scrollBox.verticalBarVisible) {\n dataWidth += sbw;\n setCanvasSize();\n setScrollBoxSize();\n checkScrollBoxVisibility();\n }\n // set again after bar visibility checks\n setScrollBoxSize();\n if (self.attributes.fillLastColumn) {\n const lastColumnIndex = self.getLastVisibleColumnIndex();\n const availableWidth =\n self.scrollBox.width -\n (self.scrollBox.verticalBarVisible ? sbw : 0) -\n cellBorder;\n if (lastColumnIndex >= 0 && dataWidth < availableWidth) {\n self.autoLastColumnWidth = {\n index: lastColumnIndex,\n width:\n self.getColumnWidth(lastColumnIndex) + availableWidth - dataWidth,\n };\n dataWidth = self.refreshScrollCacheX();\n checkScrollBoxVisibility();\n }\n }\n self.scrollBox.scrollWidth = dataWidth - self.scrollBox.width;\n self.scrollBox.scrollHeight = dataHeight - self.scrollBox.height;\n if (self.frozenColumn > 0) {\n self.scrollBox.widthBoxRatio =\n (self.scrollBox.width - self.scrollCache.x[self.frozenColumn - 1]) /\n dataWidth;\n } else {\n self.scrollBox.widthBoxRatio = self.scrollBox.width / dataWidth;\n }\n self.scrollBox.scrollBoxWidth =\n self.scrollBox.width * self.scrollBox.widthBoxRatio -\n self.style.scrollBarWidth -\n b -\n d;\n // TODO: This heightBoxRatio number is terribly wrong.\n // They should be a result of the size of the grid/canvas?\n // it being off causes the scroll bar to \"slide\" under\n // the dragged mouse.\n // https://github.com/TonyGermaneri/canvas-datagrid/issues/97\n self.scrollBox.heightBoxRatio =\n (self.scrollBox.height -\n columnHeaderCellHeight -\n topGroupAreaHeight -\n self.scrollCache.y[self.frozenRow]) /\n dataHeight;\n self.scrollBox.scrollBoxHeight =\n self.scrollBox.height * self.scrollBox.heightBoxRatio -\n self.style.scrollBarWidth -\n b -\n d;\n self.scrollBox.scrollBoxWidth = Math.max(\n self.scrollBox.scrollBoxWidth,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.scrollBoxHeight = Math.max(\n self.scrollBox.scrollBoxHeight,\n self.style.scrollBarBoxMinSize,\n );\n // horizontal\n n.x += rowHeaderCellWidth;\n n.y += self.height - self.style.scrollBarWidth - d - topGroupAreaHeight;\n n.width =\n self.width -\n self.style.scrollBarWidth -\n rowHeaderCellWidth -\n leftGroupAreaWidth -\n d -\n m;\n n.height = self.style.scrollBarWidth + self.style.scrollBarBorderWidth + d;\n // horizontal box\n nb.y = n.y + self.style.scrollBarBoxMargin;\n nb.width = self.scrollBox.scrollBoxWidth;\n nb.height = self.style.scrollBarBoxWidth;\n // vertical\n v.x +=\n self.width -\n leftGroupAreaWidth -\n self.style.scrollBarWidth -\n self.style.scrollBarBorderWidth -\n d;\n v.y += columnHeaderCellHeight + self.scrollCache.y[self.frozenRow];\n v.width = self.style.scrollBarWidth + self.style.scrollBarBorderWidth + d;\n v.height =\n self.height -\n columnHeaderCellHeight -\n topGroupAreaHeight -\n self.style.scrollBarWidth -\n d -\n m;\n // vertical box\n vb.x = v.x + self.style.scrollBarBoxMargin;\n vb.y += self.scrollCache.y[self.frozenRow];\n vb.width = self.style.scrollBarBoxWidth;\n vb.height = self.scrollBox.scrollBoxHeight;\n // corner\n co.x = n.x + n.width + m;\n co.y = v.y + v.height + m;\n co.width = self.style.scrollBarWidth + self.style.scrollBarBorderWidth;\n co.height = self.style.scrollBarWidth + self.style.scrollBarBorderWidth;\n self.scrollBox.entities = {\n horizontalBar: n,\n horizontalBox: nb,\n verticalBar: v,\n verticalBox: vb,\n corner: co,\n };\n self.scrollBox.bar = {\n v: v,\n h: n,\n };\n self.scrollBox.box = {\n v: vb,\n h: nb,\n };\n /// calculate page and dom elements\n self.page = Math.max(\n 1,\n self.visibleRows.length - 3 - self.attributes.pageUpDownOverlap,\n );\n // set canvas drawing related items\n if (!self.isChildGrid) {\n const newWidth = self.width * ratio;\n const newHeight = self.height * ratio;\n // We need to check is settings size to canvas necessary,\n // because settings the canvas'size will cause the canvas and its state be cleared\n // even if the size is the same.\n // Notes: Please don't call `self.resize()` without a subsequent call to `self.draw()`\n if (self.canvas.width !== newWidth || self.canvas.height !== newHeight) {\n self.canvas.width = newWidth;\n self.canvas.height = newHeight;\n self.ctx.scale(ratio, ratio);\n }\n }\n // resize any open dom elements (input/textarea)\n self.resizeEditInput();\n self.scroll(true);\n if (drawAfterResize) {\n self.draw(true);\n }\n self.dispatchEvent('resize', {});\n return true;\n };\n self.scroll = function (dontDraw) {\n var s = self.getSchema(),\n l = (self.viewData || []).length,\n ch = self.style.cellHeight;\n // go too far in leaps, then get focused\n self.scrollIndexTop = Math.floor(\n l * (self.scrollBox.scrollTop / self.scrollBox.scrollHeight) - 100,\n );\n self.scrollIndexTop = Math.max(self.scrollIndexTop, 0);\n self.scrollPixelTop = self.scrollCache.y[self.scrollIndexTop];\n // sometimes the grid is rendered but the height is zero\n if (self.scrollBox.scrollHeight === 0) {\n self.scrollIndexTop = 0;\n }\n self.scrollPixelTop = 0;\n self.scrollIndexLeft = self.frozenColumn;\n self.scrollPixelLeft = 0;\n while (\n self.scrollPixelTop < self.scrollBox.scrollTop &&\n self.scrollIndexTop < self.viewData.length\n ) {\n // start on index +1 since index 0 was used in \"go too far\" section above\n self.scrollIndexTop += 1;\n self.scrollPixelTop = self.scrollCache.y[self.scrollIndexTop];\n }\n while (\n self.scrollPixelLeft < self.scrollBox.scrollLeft + 1 &&\n self.scrollIndexLeft < s.length\n ) {\n self.scrollPixelLeft = self.scrollCache.x[self.scrollIndexLeft];\n self.scrollIndexLeft += 1;\n }\n if (s.length > 0) {\n self.scrollIndexLeft = Math.max(self.scrollIndexLeft - 1, 0);\n self.scrollPixelLeft -= self.getColumnWidth(\n self.orders.columns[self.scrollIndexLeft],\n );\n }\n if ((self.viewData || []).length > 0) {\n self.scrollIndexTop = Math.max(self.scrollIndexTop - 1, 0);\n self.scrollPixelTop = Math.max(\n self.scrollPixelTop -\n (self.viewData[self.scrollIndexTop]\n ? (self.sizes.rows[self.scrollIndexTop] || ch) +\n (self.sizes.trees[self.scrollIndexTop] || 0)\n : ch) *\n self.scale,\n 0,\n );\n }\n self.ellipsisCache = {};\n if (!dontDraw) {\n self.draw(true);\n }\n //TODO: figure out why this has to be delayed for child grids\n //BUG: wheeling event on 3rd level hierarchy fails to move input box\n requestAnimationFrame(self.resizeEditInput);\n self.dispatchEvent('scroll', {\n top: self.scrollBox.scrollTop,\n left: self.scrollBox.scrollLeft,\n });\n };\n self.mousemove = function (e, overridePos) {\n if (self.contextMenu || self.input) {\n return;\n }\n\n // Cancel dragging action if user ventures outside grid\n if (self.draggingItem && e.which === 0) {\n self.stopFreezeMove(e);\n self.mouseup(e);\n return;\n }\n\n self.mouse = overridePos || self.getLayerPos(e);\n var ctrl =\n (e.ctrlKey || e.metaKey || self.attributes.persistantSelectionMode) &&\n !self.attributes.singleSelectionMode,\n i,\n s = self.getSchema(),\n dragBounds,\n sBounds,\n x = self.mouse.x,\n y = self.mouse.y,\n cell = self.getCellAt(x, y),\n delta,\n disallowVerticalAutoScroll = false,\n disallowHorizontalAutoScroll = false,\n ev = { NativeEvent: e, cell: cell, x: x, y: y },\n previousCell = self.currentCell;\n clearTimeout(self.scrollTimer);\n if (!self.isInGrid({ x: x, y: y })) {\n self.hasFocus = false;\n }\n if (self.dispatchEvent('mousemove', ev)) {\n return;\n }\n if (cell && self.currentCell) {\n self.rowBoundaryCrossed = self.currentCell.rowIndex !== cell.rowIndex;\n self.columnBoundaryCrossed =\n self.currentCell.columnIndex !== cell.columnIndex;\n self.cellBoundaryCrossed =\n self.rowBoundaryCrossed || self.columnBoundaryCrossed;\n ['row', 'column', 'cell'].forEach(function (prefix) {\n if (self[prefix + 'BoundaryCrossed']) {\n ev.cell = previousCell;\n self.dispatchEvent(prefix + 'mouseout', ev);\n ev.cell = cell;\n self.dispatchEvent(prefix + 'mouseover', ev);\n }\n });\n }\n self.currentCell = cell;\n\n if (\n !self.draggingItem && // It is not in dragging mode (avoid changing hovers frequent)\n cell &&\n (cell.context === 'cell' || cell.context === self.cursorGrab)\n ) {\n const indicator = self.getUnhideIndicator(self.mouse.x, self.mouse.y);\n if (indicator) {\n self.cursor = 'pointer';\n self.hovers = { unhideIndicator: indicator };\n self.draw();\n return;\n }\n }\n\n self.hovers = {};\n if (!self.draggingItem && cell) {\n self.dragItem = cell;\n self.dragMode = cell.dragContext;\n self.cursor = cell.context;\n if (cell.context === 'cell') {\n self.cursor = 'default';\n self.hovers = {\n rowIndex: cell.rowIndex,\n columnIndex: cell.columnIndex,\n onFilterButton: false,\n onCellTreeIcon: false,\n };\n if (\n cell.isFilterable &&\n x >\n cell.x +\n cell.width +\n self.canvasOffsetLeft -\n self.style.filterButtonWidth &&\n x < cell.x + cell.width + self.canvasOffsetLeft &&\n y >\n cell.y +\n cell.height +\n self.canvasOffsetTop -\n self.style.filterButtonHeight &&\n y < cell.y + cell.height + self.canvasOffsetTop\n ) {\n self.hovers.onFilterButton = true;\n self.draw();\n }\n if (cell.isRowTree || cell.isColumnTree) {\n const pc = cell.isRowTree\n ? self.cellTree.rows[cell.rowIndex].parentCount\n : 0;\n const rc = self.style.cellTreeIconWidth * self.scale,\n rx =\n cell.x +\n cell.paddingLeft +\n self.canvasOffsetLeft +\n self.style.cellTreeIconMarginLeft +\n pc * (rc + cell.paddingLeft),\n ry =\n cell.y +\n self.canvasOffsetTop +\n self.style.cellTreeIconMarginTop * self.scale;\n if (x >= rx && x <= rx + rc && y >= ry && y < ry + rc) {\n self.hovers.onCellTreeIcon = true;\n self.draw();\n }\n }\n }\n if (self.selecting || self.reorderObject) {\n delta = {\n x: Math.abs(self.dragStart.x - x),\n y: Math.abs(self.dragStart.y - y),\n };\n if (\n self.dragStartObject.columnIndex !== -1 &&\n e.shiftKey &&\n !self.attributes.singleSelectionMode\n ) {\n self.dragStartObject = {\n rowIndex: self.activeCell.rowIndex,\n columnIndex: self.activeCell.columnIndex,\n };\n }\n dragBounds = {\n top: Math.min(self.dragStartObject.rowIndex, cell.rowIndex),\n left: Math.min(self.dragStartObject.columnIndex, cell.columnIndex),\n bottom: Math.max(self.dragStartObject.rowIndex, cell.rowIndex),\n right: Math.max(self.dragStartObject.columnIndex, cell.columnIndex),\n };\n if (self.dragStartObject.columnIndex === -1) {\n sBounds = self.getSelectionBounds();\n dragBounds.left = -1;\n dragBounds.right = s.length - 1;\n dragBounds.top = Math.min(sBounds.top, cell.rowIndex);\n dragBounds.bottom = Math.max(sBounds.bottom, cell.rowIndex);\n if (dragBounds.top < 0) dragBounds.top = 0;\n }\n\n if (self.dragStartObject.rowIndex === -1) {\n sBounds = self.getSelectionBounds();\n dragBounds.left =\n cell.columnIndex === undefined\n ? sBounds.left\n : Math.min(sBounds.left, cell.columnIndex);\n dragBounds.right =\n cell.columnIndex === undefined\n ? sBounds.right\n : Math.max(sBounds.right, cell.columnIndex);\n dragBounds.top = -1;\n dragBounds.bottom = self.viewData.length - 1;\n if (dragBounds.left < 0) dragBounds.left = 0;\n if (dragBounds.left != dragBounds.right)\n self.isMultiColumnsSelected = true;\n else self.isMultiRowsSelected = false;\n }\n\n if (\n self.dragStartObject.rowIndex !== cell.rowIndex ||\n self.dragStartObject.columnIndex !== cell.columnIndex\n ) {\n self.ignoreNextClick = true;\n }\n if (\n self.cellBoundaryCrossed ||\n (delta.x === 0 && delta.y === 0) ||\n self.attributes.selectionMode === 'row'\n ) {\n if (\n cell.rowIndex !== undefined &&\n (self.attributes.selectionMode === 'row' ||\n self.dragStartObject.columnIndex === -1) &&\n self.rowBoundaryCrossed\n ) {\n if (self.dragStartObject.rowIndex < cell.rowIndex) {\n dragBounds.top = self.dragStartObject.rowIndex;\n dragBounds.bottom = cell.rowIndex;\n } else {\n dragBounds.top = cell.rowIndex;\n dragBounds.bottom = self.dragStartObject.rowIndex;\n }\n } else if (\n cell.rowIndex !== undefined &&\n (self.attributes.selectionMode === 'column' ||\n self.dragStartObject.rowIndex === -1) &&\n self.columnBoundaryCrossed\n ) {\n if (self.dragStartObject.columnIndex < cell.columnIndex) {\n dragBounds.left = self.dragStartObject.columnIndex;\n dragBounds.right = cell.columnIndex;\n } else {\n dragBounds.left = cell.columnIndex;\n dragBounds.right = self.dragStartObject.columnIndex;\n }\n } else if (self.attributes.selectionMode !== 'row') {\n if (cell.hovered && self.hovers.onFilterButton) {\n if (cell.openedFilter) {\n cell.openedFilter = false;\n self.selectedFilterButton = {\n columnIndex: -1,\n rowIndex: -1,\n };\n } else {\n self.selectedFilterButton.rowIndex = cell.rowIndex;\n self.selectedFilterButton.columnIndex = cell.columnIndex;\n self.contextmenuEvent(e, {\n x: cell.x + cell.width - self.style.filterButtonWidth,\n y: cell.y + cell.height,\n rect: { left: 0, top: 0 },\n });\n }\n self.draw();\n return;\n } else if (\n cell.hovered &&\n self.hovers.onCellTreeIcon &&\n e.type == 'mousedown'\n ) {\n self.toggleCollapseTree(cell.rowIndex, cell.columnIndex);\n return;\n } else {\n self.selectedFilterButton = {\n columnIndex: -1,\n rowIndex: -1,\n };\n if (self.hovers.onFilterButton) return;\n if (self.hovers.onCellTreeIcon) return;\n if (!self.dragAddToSelection && cell.rowIndex !== undefined) {\n if (self.isCellSelected(cell)) self.unselectCell(cell);\n } else {\n if (!self.isCellSelected(cell)) self.selectCell(cell);\n }\n }\n }\n }\n if (self.attributes.singleSelectionMode) {\n // only one row (row mode) or one cell may be selected at a time, so\n // a drag follows the pointer instead of growing a range (#472)\n if (\n self.dragStartObject.rowIndex !== -1 &&\n cell.rowIndex !== undefined &&\n cell.rowIndex > -1\n ) {\n dragBounds.top = cell.rowIndex;\n dragBounds.bottom = cell.rowIndex;\n }\n if (\n self.attributes.selectionMode !== 'row' &&\n self.dragStartObject.columnIndex !== -1 &&\n cell.columnIndex !== undefined &&\n cell.columnIndex > -1\n ) {\n dragBounds.left = cell.columnIndex;\n dragBounds.right = cell.columnIndex;\n }\n }\n if (\n (!self.selectionBounds ||\n dragBounds.top !== self.selectionBounds.top ||\n dragBounds.left !== self.selectionBounds.left ||\n dragBounds.bottom !== self.selectionBounds.bottom ||\n dragBounds.right !== self.selectionBounds.right) &&\n !ctrl\n ) {\n if (!(cell.hovered && self.hovers.onFilterButton))\n self.clearSelections();\n if (dragBounds.top === -1) {\n dragBounds.top = 0;\n }\n sBounds = dragBounds;\n if (self.attributes.selectionMode === 'row') {\n for (i = sBounds.top; i <= sBounds.bottom; i += 1) {\n self.selectRow(i, true, null, true);\n }\n } else {\n self.selectArea(sBounds, true);\n self.activeCell.rowIndex = sBounds.top;\n self.activeCell.columnIndex = sBounds.left;\n if (sBounds.left == -1 && sBounds.top !== sBounds.bottom) {\n self.activeCell.columnIndex = 0;\n self.isMultiRowsSelected = true;\n self.isMultiColumnsSelected = false;\n }\n }\n }\n } else if (self.movingSelectionHandle) {\n delta = {\n x: Math.abs(self.dragStart.x - x),\n y: Math.abs(self.dragStart.y - y),\n };\n\n // Disallow auto-scroll to the direction that overlay is not\n // moving towards.\n if (self.fillOverlay.direction === 'y') {\n disallowHorizontalAutoScroll = true;\n } else if (self.fillOverlay.direction === 'x') {\n disallowVerticalAutoScroll = true;\n }\n }\n\n if (delta) {\n if (\n self.attributes.autoScrollOnMousemove ||\n disallowVerticalAutoScroll ||\n disallowHorizontalAutoScroll\n ) {\n var movedVertically =\n !disallowVerticalAutoScroll &&\n delta.y > self.attributes.autoScrollMargin;\n var movedHorizontally =\n !disallowHorizontalAutoScroll &&\n delta.x > self.attributes.autoScrollMargin;\n\n if (movedVertically && !movedHorizontally)\n self.autoScrollZone(e, -1, y, ctrl);\n else if (movedHorizontally && !movedVertically)\n self.autoScrollZone(e, x, -1, ctrl);\n else if (movedHorizontally && movedVertically)\n self.autoScrollZone(e, x, y, ctrl);\n } else {\n self.autoScrollZone(e, x, y, ctrl);\n }\n }\n }\n const columnGroup = self.getColumnGroupAt(self.mouse.x, self.mouse.y);\n if (columnGroup) self.cursor = 'pointer';\n\n const rowGroup = self.getRowGroupAt(self.mouse.x, self.mouse.y);\n if (rowGroup) self.cursor = 'pointer';\n\n self.cellBoundaryCrossed = false;\n self.rowBoundaryCrossed = false;\n self.columnBoundaryCrossed = false;\n self.draw(true);\n };\n self.click = function (e, overridePos) {\n var i,\n startingBounds = JSON.stringify(self.getSelectionBounds()),\n ctrl =\n (e.ctrlKey || e.metaKey || self.attributes.persistantSelectionMode) &&\n !self.attributes.singleSelectionMode,\n pos = overridePos || self.getLayerPos(e);\n self.currentCell = self.getCellAt(pos.x, pos.y);\n if (self.currentCell.grid !== undefined) {\n return;\n }\n function checkSelectionChange() {\n var ev,\n sb = self.getSelectionBounds();\n\n if (startingBounds === JSON.stringify(sb)) {\n return;\n }\n self.dispatchEvent('selectionchanged', self.getContextOfSelectionEvent());\n }\n if (self.input) {\n self.endEdit();\n }\n if (self.ignoreNextClick) {\n self.ignoreNextClick = false;\n return;\n }\n i = self.currentCell;\n if (\n self.dispatchEvent('click', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n\n const unhideIndicator = self.getUnhideIndicator(pos.x, pos.y);\n if (unhideIndicator) {\n const { dir, orderIndex0, orderIndex1 } = unhideIndicator;\n if (dir === 'l' || dir === 'r')\n self.unhideColumns(orderIndex0, orderIndex1);\n else self.unhideRows(orderIndex0, orderIndex1);\n return;\n }\n\n let group = self.getColumnGroupAt(pos.x, pos.y);\n if (!group) group = self.getRowGroupAt(pos.x, pos.y);\n if (group) {\n if (self.toggleGroup(group)) {\n self.setStorageData();\n self.refresh();\n return;\n }\n }\n\n if (!self.hasFocus) {\n return;\n }\n\n const leftOffset = self.getRowGroupAreaWidth();\n const topOffset = self.getColumnGroupAreaHeight();\n const xInGrid = pos.x - leftOffset;\n const yInGrid = pos.y - topOffset;\n if (\n ['rowHeaderCell', 'columnHeaderCell'].indexOf(self.currentCell.style) ===\n -1 &&\n !ctrl\n ) {\n if (!self.hovers.onFilterButton) {\n self.setActiveCell(i.columnIndex, i.rowIndex);\n }\n }\n if (\n self.currentCell.style === 'columnHeaderCell' &&\n self.attributes.columnHeaderClickBehavior === 'sort' &&\n // a header is also a reorder grab zone when column reordering is on;\n // a plain click (no drag, which sets ignoreNextClick) still sorts (#514)\n (self.currentCell.context === 'cell' ||\n self.currentCell.dragContext === 'column-reorder')\n ) {\n if (self.orderBy === i.header.name) {\n self.orderDirection = self.orderDirection === 'asc' ? 'desc' : 'asc';\n } else {\n self.orderDirection = 'asc';\n }\n self.order(i.header.name, self.orderDirection);\n checkSelectionChange();\n return;\n }\n if (self.currentCell.context === 'cell') {\n if (self.currentCell.style === 'cornerCell') {\n self.selectAll();\n self.draw();\n checkSelectionChange();\n return;\n }\n if (\n self.attributes.selectionMode === 'row' ||\n self.currentCell.style === 'rowHeaderCell'\n ) {\n if (\n self.currentCell.style === 'rowHeaderCell' &&\n self.attributes.tree &&\n xInGrid > 0 &&\n xInGrid - self.currentCell.x <\n self.style.treeArrowWidth +\n self.style.treeArrowMarginLeft +\n self.style.treeArrowMarginRight +\n self.style.treeArrowClickRadius &&\n yInGrid - self.currentCell.y <\n self.style.treeArrowHeight +\n self.style.treeArrowMarginTop +\n self.style.treeArrowClickRadius &&\n yInGrid > 0\n ) {\n self.toggleTree(i.rowIndex);\n return;\n }\n }\n if (e.shiftKey && !ctrl && !self.attributes.singleSelectionMode) {\n self.selectionBounds = self.getSelectionBounds();\n self.selectArea(undefined, false);\n }\n }\n checkSelectionChange();\n self.draw(true);\n };\n self.dragResizeColumn = function (e) {\n const resizingColumn = self.dragMode === 'ew-resize';\n var pos, x, y;\n pos = self.getLayerPos(e);\n x = self.resizingStartingWidth + pos.x - self.dragStart.x;\n y = self.resizingStartingHeight + pos.y - self.dragStart.y;\n if (x < self.style.minColumnWidth) {\n x = self.style.minColumnWidth;\n }\n if (y < self.style.minRowHeight) {\n y = self.style.minRowHeight;\n }\n const resizeEventDetails = {\n x: x,\n y: y,\n width: x,\n height: y,\n columnIndex: resizingColumn ? self.draggingItem.columnIndex : undefined,\n rowIndex: resizingColumn ? undefined : self.draggingItem.rowIndex,\n draggingItem: self.draggingItem,\n NativeEvent: e,\n };\n if (\n resizingColumn\n ? self.dispatchEvent('resizecolumn', resizeEventDetails)\n : self.dispatchResizeRow(resizeEventDetails)\n ) {\n return false;\n }\n if (self.attributes.resizeAfterDragged) {\n self.pendingDragResize = {\n item: self.draggingItem,\n width: x,\n height: y,\n x: e.clientX,\n y: e.clientY,\n };\n } else {\n self.dragResizeApply(self.draggingItem, x, y);\n }\n };\n self.dragResizeApply = function (draggingItem, width, height) {\n if (\n self.scrollBox.scrollLeft >\n self.scrollBox.scrollWidth - self.attributes.resizeScrollZone &&\n self.dragMode === 'ew-resize'\n ) {\n self.resize(true);\n }\n if (self.dragMode === 'ew-resize') {\n self.sizes.columns[\n draggingItem.header.style === 'rowHeaderCell'\n ? 'cornerCell'\n : draggingItem.sortColumnIndex\n ] = width;\n if (\n ['rowHeaderCell', 'cornerCell'].indexOf(draggingItem.header.style) !==\n -1\n ) {\n self.resize(true);\n }\n self.resizeChildGrids();\n return;\n } else if (self.dragMode === 'ns-resize') {\n if (draggingItem.rowOpen) {\n self.sizes.trees[draggingItem.rowIndex] = height;\n } else if (self.attributes.globalRowResize) {\n self.style.cellHeight = height;\n } else {\n self.sizes.rows[draggingItem.rowIndex] = height;\n }\n self.dispatchResizeRow({\n height: height,\n rowIndex: draggingItem.rowIndex,\n draggingItem: draggingItem,\n });\n self.resizeChildGrids();\n return;\n }\n self.ellipsisCache = {};\n };\n self.stopDragResize = function (event) {\n const pos = self.getLayerPos(event);\n\n if (self.attributes.resizeAfterDragged) {\n self.dragResizeApply(\n self.pendingDragResize.item,\n self.pendingDragResize.width,\n self.pendingDragResize.height,\n );\n self.pendingDragResize = undefined;\n }\n\n if (self.dragMode === 'ew-resize') {\n const hasMoved = !!(pos.x - self.dragStart.x);\n // Check that dragItem is selected or part of selection.\n const dragItemIsSelected = self.isColumnSelected(\n self.dragItem.columnIndex,\n );\n\n if (hasMoved && dragItemIsSelected) {\n const width = Math.max(\n self.resizingStartingWidth + pos.x - self.dragStart.x,\n self.style.minColumnWidth,\n );\n // If the column is selected, resize it to width plus any other selected columns.\n self.fitSelectedColumns(width);\n }\n } else if (self.dragMode === 'ns-resize') {\n // Do the above for rows.\n const hasMoved = !!(pos.y - self.dragStart.y);\n const dragItemIsSelected = self.isRowSelected(self.dragItem.rowIndex);\n\n if (hasMoved && dragItemIsSelected) {\n const height = Math.max(\n self.resizingStartingHeight + pos.y - self.dragStart.y,\n self.style.minRowHeight,\n );\n self.fitSelectedRows(height);\n }\n }\n\n self.resize();\n window.removeEventListener('mousemove', self.dragResizeColumn, false);\n window.removeEventListener('mouseup', self.stopDragResize, false);\n self.setStorageData();\n self.draw(true);\n self.ignoreNextClick = true;\n };\n self.scrollGrid = function (e) {\n var pos = self.getLayerPos(e);\n if (\n self.attributes.scrollPointerLock &&\n self.pointerLockPosition &&\n ['horizontal-scroll-box', 'vertical-scroll-box'].indexOf(\n self.scrollStartMode,\n ) !== -1\n ) {\n self.pointerLockPosition.x += e.movementX;\n self.pointerLockPosition.y += e.movementY;\n self.pointerLockPosition.x = Math.min(\n self.width - self.style.scrollBarWidth,\n Math.max(0, self.pointerLockPosition.x),\n );\n self.pointerLockPosition.y = Math.min(\n self.height - self.style.scrollBarWidth,\n Math.max(0, self.pointerLockPosition.y),\n );\n pos = self.pointerLockPosition;\n }\n self.scrollMode = self.getCellAt(pos.x, pos.y).context;\n if (\n self.scrollMode === 'horizontal-scroll-box' &&\n self.scrollStartMode !== 'horizontal-scroll-box'\n ) {\n self.scrollStartMode = 'horizontal-scroll-box';\n self.dragStart = pos;\n self.scrollStart.left = self.scrollBox.scrollLeft;\n clearTimeout(self.scrollTimer);\n return;\n }\n if (\n self.scrollMode === 'vertical-scroll-box' &&\n self.scrollStartMode !== 'vertical-scroll-box'\n ) {\n self.scrollStartMode = 'vertical-scroll-box';\n self.dragStart = pos;\n self.scrollStart.top = self.scrollBox.scrollTop;\n clearTimeout(self.scrollTimer);\n return;\n }\n if (\n self.scrollStartMode === 'vertical-scroll-box' &&\n self.scrollMode !== 'vertical-scroll-box'\n ) {\n self.scrollMode = 'vertical-scroll-box';\n }\n if (\n self.scrollStartMode === 'horizontal-scroll-box' &&\n self.scrollMode !== 'horizontal-scroll-box'\n ) {\n self.scrollMode = 'horizontal-scroll-box';\n }\n clearTimeout(self.scrollTimer);\n if (self.scrollModes.indexOf(self.scrollMode) === -1) {\n return;\n }\n if (self.scrollMode === 'vertical-scroll-box') {\n self.scrollBox.scrollTop =\n self.scrollStart.top +\n (pos.y - self.dragStart.y) / self.scrollBox.heightBoxRatio;\n } else if (self.scrollMode === 'vertical-scroll-top') {\n self.scrollBox.scrollTop -= self.page * self.style.cellHeight;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n } else if (self.scrollMode === 'vertical-scroll-bottom') {\n self.scrollBox.scrollTop += self.page * self.style.cellHeight;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n if (self.scrollMode === 'horizontal-scroll-box') {\n self.scrollBox.scrollLeft =\n self.scrollStart.left +\n (pos.x - self.dragStart.x) / self.scrollBox.widthBoxRatio;\n } else if (self.scrollMode === 'horizontal-scroll-right') {\n self.scrollBox.scrollLeft += self.attributes.selectionScrollIncrement;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n } else if (self.scrollMode === 'horizontal-scroll-left') {\n self.scrollBox.scrollLeft -= self.attributes.selectionScrollIncrement;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n };\n self.stopScrollGrid = function () {\n clearTimeout(self.scrollTimer);\n if (document.exitPointerLock) {\n document.exitPointerLock();\n }\n window.removeEventListener('mousemove', self.scrollGrid, false);\n };\n self.dragReorder = function (e) {\n var pos,\n x,\n y,\n columReorder = self.dragMode === 'column-reorder',\n rowReorder = self.dragMode === 'row-reorder';\n pos = self.getLayerPos(e);\n x = pos.x - self.dragStart.x;\n y = pos.y - self.dragStart.y;\n if (!self.attributes.allowColumnReordering && columReorder) {\n return;\n }\n if (!self.attributes.allowRowReordering && rowReorder) {\n return;\n }\n if ((e.ctrlKey || e.metaKey || e.shiftKey) && self.reorderObject) {\n if (self.dragMode === 'column-reorder' && !self.isMultiColumnsSelected) {\n self.selectColumn(self.draggingItem.header.index, false, false);\n }\n }\n if (\n self.dispatchEvent('reordering', {\n NativeEvent: e,\n source: self.dragStartObject,\n target: self.currentCell,\n dragMode: self.dragMode,\n })\n ) {\n return;\n }\n if (\n Math.abs(x) > self.attributes.reorderDeadZone ||\n Math.abs(y) > self.attributes.reorderDeadZone\n ) {\n self.reorderObject = self.draggingItem;\n if (self.isMultiRowsSelected)\n self.reorderObject = self.getVisibleCellByIndex(\n -1,\n self.activeCell.rowIndex,\n );\n if (self.isMultiColumnsSelected)\n self.reorderObject = self.getVisibleCellByIndex(\n self.activeCell.columnIndex,\n -1,\n );\n if (!self.reorderObject) return;\n self.reorderTarget = self.currentCell;\n self.reorderObject.dragOffset = {\n x: x,\n y: y,\n };\n self.autoScrollZone(\n e,\n columReorder ? pos.x : -1,\n rowReorder ? pos.y : -1,\n false,\n );\n }\n };\n self.stopDragReorder = function (e) {\n let originalIndex;\n let targetIndex;\n const orderLists = {\n 'row-reorder': self.orders.rows,\n 'column-reorder': self.orders.columns,\n };\n const indexName = {\n 'row-reorder': 'rowIndex',\n 'column-reorder': 'sortColumnIndex',\n }[self.dragMode];\n window.removeEventListener('mousemove', self.dragReorder, false);\n window.removeEventListener('mouseup', self.stopDragReorder, false);\n if (\n self.reorderObject &&\n self.reorderTarget &&\n ((self.dragMode === 'column-reorder' &&\n self.reorderTarget.sortColumnIndex > -1 &&\n self.reorderTarget.sortColumnIndex < self.getSchema().length) ||\n (self.dragMode === 'row-reorder' &&\n self.reorderTarget.rowIndex > -1 &&\n self.reorderTarget.rowIndex < self.viewData.length)) &&\n self.reorderObject[indexName] !== self.reorderTarget[indexName] &&\n !self.dispatchEvent('reorder', {\n NativeEvent: e,\n source: self.reorderObject,\n target: self.reorderTarget,\n dragMode: self.dragMode,\n })\n ) {\n self.ignoreNextClick = true;\n originalIndex = orderLists[self.dragMode].indexOf(\n self.reorderObject[indexName],\n );\n targetIndex = orderLists[self.dragMode].indexOf(\n self.reorderTarget[indexName],\n );\n if (self.dragMode === 'column-reorder') {\n /** Select column view indexes in the first row */\n const selectedIndexes = self.getRowSelectionStates(0);\n const sortColumnIndices = [];\n const selectedColumnIndices = [];\n if (selectedIndexes) {\n originalIndex = selectedIndexes[0];\n selectedIndexes.forEach(function (value) {\n sortColumnIndices.push(self.orders.columns[value]);\n });\n }\n const deleteCount = sortColumnIndices.length;\n if (\n targetIndex < originalIndex ||\n (targetIndex > originalIndex &&\n Math.abs(targetIndex - originalIndex) >= deleteCount)\n ) {\n orderLists[self.dragMode].splice(originalIndex, deleteCount);\n if (targetIndex > originalIndex)\n targetIndex = targetIndex - (deleteCount - 1);\n\n for (let i = 0; i < sortColumnIndices.length; i++) {\n if (i === 0) self.activeCell.columnIndex = targetIndex;\n selectedColumnIndices.push(targetIndex + i);\n orderLists[self.dragMode].splice(\n targetIndex + i,\n 0,\n sortColumnIndices[i],\n );\n }\n\n self.orders.columns = orderLists[self.dragMode];\n self.selectColumnViewIndexes(selectedColumnIndices);\n }\n } else {\n /** The original name of this variable is `odata` */\n const rowIndexes = self.getRowViewIndexesFromSelection();\n const originalData = rowIndexes.map(\n (rowIndex) => self.viewData[rowIndex],\n );\n if (\n targetIndex < originalIndex ||\n (targetIndex > originalIndex &&\n Math.abs(targetIndex - originalIndex) >= originalData.length)\n ) {\n self.viewData.splice(originalIndex, originalData.length);\n if (targetIndex > originalIndex)\n targetIndex = targetIndex - (originalData.length - 1);\n self.activeCell.rowIndex = targetIndex;\n for (let i = 0; i < originalData.length; i++)\n self.viewData.splice(targetIndex + i, 0, originalData[i]);\n self.moveSelection(0, targetIndex);\n }\n }\n self.resize();\n self.setStorageData();\n }\n self.reorderObject = undefined;\n self.reorderTarget = undefined;\n self.draw(true);\n };\n self.dragMove = function (e) {\n if (\n self.dispatchEvent('moving', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n var pos = self.getLayerPos(e);\n self.moveOffset = {\n x: self.currentCell.columnIndex - self.dragStartObject.columnIndex,\n y: self.currentCell.rowIndex - self.dragStartObject.rowIndex,\n };\n if (\n Math.abs(pos.x) > self.attributes.reorderDeadZone ||\n Math.abs(pos.y) > self.attributes.reorderDeadZone\n ) {\n setTimeout(function () {\n self.autoScrollZone(e, pos.x, pos.y, false);\n }, 1);\n }\n };\n self.stopDragMove = function (e) {\n window.removeEventListener('mousemove', self.dragMove, false);\n window.removeEventListener('mouseup', self.stopDragMove, false);\n var b = self.getSelectionBounds();\n if (\n self.dispatchEvent('endmove', { NativeEvent: e, cell: self.currentCell })\n ) {\n self.movingSelection = undefined;\n self.moveOffset = undefined;\n self.draw(true);\n return;\n }\n if (self.moveOffset) {\n self.moveTo(\n self.movingSelection,\n b.left + self.moveOffset.x,\n b.top + self.moveOffset.y,\n );\n self.moveSelection(self.moveOffset.x, self.moveOffset.y);\n }\n self.movingSelection = undefined;\n self.moveOffset = undefined;\n self.draw(true);\n };\n self.freezeMove = function (e) {\n if (\n self.dispatchEvent('freezemoving', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n var pos = self.getLayerPos(e);\n\n self.ignoreNextClick = true;\n self.freezeMarkerPosition = pos;\n pos.x -= self.getRowGroupAreaWidth();\n pos.y -= self.getColumnGroupAreaHeight();\n if (\n Math.abs(pos.x) > self.attributes.reorderDeadZone ||\n Math.abs(pos.y) > self.attributes.reorderDeadZone\n ) {\n setTimeout(function () {\n self.autoScrollZone(e, pos.x, pos.y, false);\n }, 1);\n }\n };\n self.stopFreezeMove = function (e) {\n let pos = self.getLayerPos(e),\n bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n columnHeaderCellBorder = self.style.columnHeaderCellBorderWidth * bm,\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth();\n pos.x -= self.getRowGroupAreaWidth();\n pos.y -= self.getColumnGroupAreaHeight();\n\n if (\n self.currentCell &&\n self.currentCell.rowIndex !== undefined &&\n self.dragMode === 'frozen-row-marker'\n ) {\n self.scrollBox.scrollTop = 0;\n self.frozenRow = self.currentCell.rowIndex + 1;\n self.scrollBox.bar.v.y =\n columnHeaderCellHeight +\n columnHeaderCellBorder +\n self.scrollCache.y[self.frozenRow];\n self.scrollBox.box.v.y =\n columnHeaderCellHeight +\n columnHeaderCellBorder +\n self.scrollCache.y[self.frozenRow];\n var dataHeight = self.scrollCache.y[self.scrollCache.y.length - 1];\n self.scrollBox.heightBoxRatio =\n (self.scrollBox.height -\n columnHeaderCellHeight -\n self.scrollCache.y[self.frozenRow]) /\n dataHeight;\n self.scrollBox.scrollBoxHeight =\n self.scrollBox.height * self.scrollBox.heightBoxRatio -\n self.style.scrollBarWidth;\n self.scrollBox.scrollBoxHeight = Math.max(\n self.scrollBox.scrollBoxHeight,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.box.v.height = self.scrollBox.scrollBoxHeight;\n }\n if (\n self.currentCell &&\n self.currentCell.columnIndex !== undefined &&\n self.dragMode === 'frozen-column-marker'\n ) {\n const dataWidth = self.refreshScrollCacheX();\n self.scrollBox.scrollLeft = 0;\n let x =\n self.currentCell.x -\n self.style.frozenMarkerWidth -\n self.style.frozenMarkerBorderWidth;\n if (pos.x > x + self.currentCell.width / 2)\n self.frozenColumn = self.currentCell.columnIndex + 1;\n else if (self.currentCell.columnIndex >= 0)\n self.frozenColumn = self.currentCell.columnIndex;\n self.scrollBox.bar.h.x =\n rowHeaderCellWidth + self.scrollCache.x[self.frozenColumn];\n self.scrollBox.widthBoxRatio =\n (self.scrollBox.width - self.scrollCache.x[self.frozenColumn]) /\n dataWidth;\n self.scrollBox.scrollBoxWidth =\n self.scrollBox.width * self.scrollBox.widthBoxRatio -\n self.style.scrollBarWidth;\n self.scrollBox.scrollBoxWidth = Math.max(\n self.scrollBox.scrollBoxWidth,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.box.h.width = self.scrollBox.scrollBoxWidth;\n }\n if (\n Math.abs(pos.x) > self.attributes.reorderDeadZone ||\n Math.abs(pos.y) > self.attributes.reorderDeadZone\n ) {\n setTimeout(function () {\n self.autoScrollZone(e, pos.x, pos.y, false);\n }, 1);\n }\n\n window.removeEventListener('mousemove', self.freezeMove, false);\n window.removeEventListener('mouseup', self.stopFreezeMove, false);\n self.freezeMarkerPosition = undefined;\n if (\n self.dispatchEvent('endfreezemove', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n self.frozenRow = self.startFreezeMove.x;\n self.frozenColumn = self.startFreezeMove.y;\n self.draw(true);\n return;\n }\n self.draw(true);\n self.resize();\n };\n self.mousedown = function (e, overridePos) {\n self.lastMouseDownTarget = e.target;\n if (\n self.dispatchEvent('mousedown', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n if (e.button === 2 || self.input) {\n return;\n }\n var ctrl = (e.ctrlKey || e.metaKey) && !self.attributes.singleSelectionMode,\n shift = e.shiftKey && !self.attributes.singleSelectionMode,\n move = /-move/.test(self.dragMode),\n freeze = /frozen-row-marker|frozen-column-marker/.test(self.dragMode),\n resize = /-resize/.test(self.dragMode),\n selectionHandleMove = /selection-handle-br/.test(self.dragMode);\n const onUnhideIndicator = self.hovers && self.hovers.unhideIndicator;\n self.dragStart = overridePos || self.getLayerPos(e);\n self.scrollStart = {\n left: self.scrollBox.scrollLeft,\n top: self.scrollBox.scrollTop,\n };\n self.dragStartObject = self.getCellAt(self.dragStart.x, self.dragStart.y);\n self.dragAddToSelection = !self.dragStartObject.selected;\n if (\n !ctrl &&\n !shift &&\n !/(vertical|horizontal)-scroll-(bar|box)/.test(\n self.dragStartObject.context,\n ) &&\n self.currentCell &&\n !self.currentCell.isColumnHeader &&\n !move &&\n !freeze &&\n !resize &&\n !selectionHandleMove\n ) {\n if (\n !(self.dragMode == 'row-reorder' && self.isMultiRowsSelected) &&\n !(self.currentCell.hovered && self.hovers.onFilterButton)\n ) {\n self.clearSelections();\n }\n }\n if (self.dragStartObject.isGrid) {\n return;\n }\n if (\n self.scrollModes.indexOf(self.dragStartObject.context) !== -1 &&\n !onUnhideIndicator\n ) {\n self.scrollMode = self.dragStartObject.context;\n self.scrollStartMode = self.dragStartObject.context;\n self.scrollGrid(e);\n if (\n self.attributes.scrollPointerLock &&\n ['horizontal-scroll-box', 'vertical-scroll-box'].indexOf(\n self.scrollStartMode,\n ) !== -1\n ) {\n self.pointerLockPosition = {\n x: self.dragStart.x,\n y: self.dragStart.y,\n };\n self.canvas.requestPointerLock();\n }\n window.addEventListener('mousemove', self.scrollGrid, false);\n window.addEventListener('mouseup', self.stopScrollGrid, false);\n self.ignoreNextClick = true;\n return;\n }\n if (self.dragMode === 'cell') {\n self.selecting = true;\n if (\n (self.attributes.selectionMode === 'row' ||\n self.dragStartObject.columnIndex === -1) &&\n self.dragStartObject.rowIndex > -1\n ) {\n self.selectRow(self.dragStartObject.rowIndex, ctrl, null);\n } else if (\n (self.attributes.selectionMode === 'column' ||\n self.dragStartObject.rowIndex === -1) &&\n self.dragStartObject.columnIndex > -1\n ) {\n if (self.attributes.allowColumnSelection) {\n self.selectColumn(self.currentCell.header.index, ctrl, shift);\n }\n return;\n }\n if (self.attributes.selectionMode !== 'row') {\n self.mousemove(e);\n }\n return;\n }\n if (selectionHandleMove && self.attributes.editable) {\n self.movingSelectionHandle = true;\n self.fillOverlay = {\n handle: {\n x: self.dragStartObject.x + self.dragStartObject.width / 2,\n y: self.dragStartObject.y + self.dragStartObject.height / 2,\n },\n snapTo: { x: -1, y: -1 },\n selection: self.getSelectionBounds(),\n };\n if (self.dispatchEvent('beginselectionhandlemove', { NativeEvent: e })) {\n return;\n }\n window.addEventListener('mousemove', self.selectionHandleMove, false);\n window.addEventListener('mouseup', self.stopSelectionHandleMove, false);\n return self.selectionHandleMove(e);\n }\n if (move) {\n self.draggingItem = self.dragItem;\n self.movingSelection = self.cloneSelections();\n self.dragging = self.dragStartObject;\n if (\n self.dispatchEvent('beginmove', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n window.addEventListener('mousemove', self.dragMove, false);\n window.addEventListener('mouseup', self.stopDragMove, false);\n return self.mousemove(e);\n }\n if (freeze) {\n self.draggingItem = self.dragItem;\n self.startFreezeMove = {\n x: self.frozenRow,\n y: self.frozenColumn,\n };\n if (self.dispatchEvent('beginfreezemove', { NativeEvent: e })) {\n return;\n }\n\n self.freezeMarkerPosition = self.getLayerPos(e);\n self.freezeMarkerPosition.isGrab = true;\n\n window.addEventListener('mousemove', self.freezeMove, false);\n window.addEventListener('mouseup', self.stopFreezeMove, false);\n return self.mousemove(e);\n }\n if (resize && !onUnhideIndicator) {\n self.draggingItem = self.dragItem;\n if (self.draggingItem.rowOpen) {\n self.resizingStartingHeight =\n self.sizes.trees[self.draggingItem.rowIndex];\n } else {\n self.resizingStartingHeight =\n self.sizes.rows[self.draggingItem.rowIndex] || self.style.cellHeight;\n }\n self.resizingStartingWidth =\n self.sizes.columns[\n self.draggingItem.header.style === 'rowHeaderCell'\n ? 'cornerCell'\n : self.draggingItem.sortColumnIndex\n ] || self.draggingItem.width;\n window.addEventListener('mousemove', self.dragResizeColumn, false);\n window.addEventListener('mouseup', self.stopDragResize, false);\n return;\n }\n if (['row-reorder', 'column-reorder'].indexOf(self.dragMode) !== -1) {\n self.draggingItem = self.dragStartObject;\n if (\n self.dragMode === 'column-reorder' &&\n !self.isMultiColumnsSelected &&\n self.attributes.allowColumnSelection\n ) {\n self.selectColumn(self.currentCell.header.index, ctrl, shift);\n } else if (self.dragMode === 'row-reorder' && !self.isMultiRowsSelected) {\n self.selectRow(self.dragStartObject.rowIndex, ctrl, null);\n }\n window.addEventListener('mousemove', self.dragReorder, false);\n window.addEventListener('mouseup', self.stopDragReorder, false);\n return;\n }\n };\n /**\n * A mouseup anywhere ends a selection drag. Only the canvas receives the\n * full mouseup handler, so releasing the button outside the grid used to\n * leave it in \"selecting\" mode and the next mousemove kept extending the\n * selection.\n */\n self.mouseupOutsideGrid = function (e) {\n if (e.target === self.canvas) {\n return; // handled by mouseup\n }\n self.selecting = undefined;\n self.cellBoundaryCrossed = true;\n self.rowBoundaryCrossed = true;\n self.columnBoundaryCrossed = true;\n };\n self.mouseup = function (e) {\n clearTimeout(self.scrollTimer);\n self.cellBoundaryCrossed = true;\n self.rowBoundaryCrossed = true;\n self.columnBoundaryCrossed = true;\n self.selecting = undefined;\n self.draggingItem = undefined;\n self.dragStartObject = undefined;\n if (\n self.dispatchEvent('mouseup', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus && e.target !== self.canvas) {\n return;\n }\n if (self.currentCell && self.currentCell.grid !== undefined) {\n return;\n }\n if (self.contextMenu || self.input) {\n return;\n }\n if (self.dragStart && self.isInGrid(self.dragStart)) {\n self.controlInput.focus();\n }\n e.preventDefault();\n };\n // gets the horizontal adjacent cells as well as first/last based on column visibility\n self.getAdjacentCells = function () {\n var x,\n i,\n s = self.getSchema(),\n o = {};\n for (x = 0; x < s.length; x += 1) {\n i = self.orders.columns[x];\n if (!s[i].hidden) {\n if (o.first === undefined) {\n o.first = x;\n o.left = x;\n }\n o.last = x;\n if (x > self.activeCell.columnIndex && o.right === undefined) {\n o.right = x;\n }\n if (x < self.activeCell.columnIndex) {\n o.left = x;\n }\n }\n }\n if (o.right === undefined) {\n o.right = o.last;\n }\n return o;\n };\n self.keydown = function (e) {\n var i,\n ev,\n adjacentCells = self.getAdjacentCells(),\n x = Math.max(self.activeCell.columnIndex, 0),\n y = Math.max(self.activeCell.rowIndex, 0),\n ctrl = e.ctrlKey || e.metaKey,\n last = self.viewData.length - 1,\n s = self.getSchema(),\n cols = s.length - 1;\n\n var defaultPrevented = self.dispatchEvent('keydown', {\n NativeEvent: e,\n cell: self.currentCell,\n });\n\n if (defaultPrevented) {\n return;\n }\n\n if (!self.attributes.keepFocusOnMouseOut && !self.hasFocus) {\n return;\n }\n\n // If a user starts typing content, switch to \"Enter\" mode\n if (isPrintableKeyEvent(e) && !ctrl) {\n return self.beginEditAt(x, y, e, true);\n }\n\n if (self.attributes.showNewRow) {\n last += 1;\n }\n\n if (e.key === 'Tab') {\n e.preventDefault();\n }\n\n if (e.key === 'Escape') {\n self.selectNone();\n } else if (ctrl && e.key === 'a') {\n self.selectAll();\n } else if (['Backspace', 'Delete'].includes(e.key)) {\n // read-only grids must not lose data on Delete/Backspace (#587, #458)\n if (self.attributes.editable) {\n self.deleteSelectedData();\n }\n } else if (e.key === 'ArrowDown') {\n y += 1;\n } else if (e.key === 'ArrowUp') {\n y -= 1;\n } else if (\n (e.key === 'ArrowLeft' && !ctrl) ||\n (e.shiftKey && e.key === 'Tab')\n ) {\n x = adjacentCells.left;\n } else if (\n (e.key === 'ArrowRight' && !ctrl) ||\n (!e.shiftKey && e.key === 'Tab')\n ) {\n x = adjacentCells.right;\n } else if (e.key === 'PageUp') {\n y -= self.page;\n e.preventDefault();\n } else if (e.key === 'PageDown') {\n y += self.page;\n e.preventDefault();\n } else if (e.key === 'Home' || (ctrl && e.key === 'ArrowUp')) {\n y = 0;\n } else if (e.key === 'End' || (ctrl && e.key === 'ArrowDown')) {\n y = self.viewData.length - 1;\n } else if (ctrl && e.key === 'ArrowRight') {\n x = adjacentCells.last;\n } else if (ctrl && e.key === 'ArrowLeft') {\n x = adjacentCells.first;\n }\n\n if (e.key === 'Enter') {\n e.preventDefault();\n return self.beginEditAt(x, y, e);\n }\n if (x < 0 || Number.isNaN(x)) {\n x = adjacentCells.first;\n }\n if (y > last) {\n y = last;\n }\n if (y < 0 || Number.isNaN(y)) {\n y = 0;\n }\n if (x > cols) {\n x = adjacentCells.last;\n }\n\n // TODO - most likely some column order related bugs in key based selection\n // Arrows\n const isArrowKey = [\n 'ArrowLeft',\n 'ArrowUp',\n 'ArrowRight',\n 'ArrowDown',\n ].includes(e.key);\n\n // Shrinking and expanding selection using shift and arrow keys\n if (e.shiftKey && isArrowKey && !self.attributes.singleSelectionMode) {\n const changed = self.shrinkOrExpandSelections(\n { rowIndex: y, columnIndex: x },\n e,\n true,\n );\n if (changed) self.draw(true);\n }\n\n if (x !== self.activeCell.columnIndex || y !== self.activeCell.rowIndex) {\n self.scrollIntoView(\n x !== self.activeCell.columnIndex ? x : undefined,\n y !== self.activeCell.rowIndex && !Number.isNaN(y) ? y : undefined,\n );\n\n self.setActiveCell(x, y);\n if (!e.shiftKey && self.attributes.selectionFollowsActiveCell) {\n if (!ctrl) self.clearSelections();\n self.selectCell({ rowIndex: y, viewColumnIndex: x });\n }\n self.draw(true);\n }\n };\n self.keyup = function (e) {\n if (\n self.dispatchEvent('keyup', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n };\n self.keypress = function (e) {\n if (!self.hasFocus) {\n return;\n }\n if (\n self.dispatchEvent('keypress', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n };\n self.dblclick = function (e) {\n if (\n self.dispatchEvent('dblclick', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n if (\n self.currentCell.context === 'ew-resize' &&\n self.currentCell.style === 'columnHeaderCell'\n ) {\n // Check that double-clicked cell is selected or part of selection.\n const currentCellIsSelected = self.isColumnSelected(\n self.currentCell.columnIndex,\n );\n\n if (currentCellIsSelected) {\n // There might be more\n self.fitSelectedColumns();\n } else {\n self.fitColumnToValues(self.currentCell.header.name);\n }\n } else if (\n self.currentCell.context === 'ew-resize' &&\n self.currentCell.style === 'cornerCell'\n ) {\n self.autosize();\n } else if (\n ['cell', 'activeCell'].includes(self.currentCell.style) &&\n !self.hovers.onFilterButton &&\n !self.hovers.onCellTreeIcon\n ) {\n if (self.currentCell.isRowTree || self.currentCell.isColumnTree) {\n self.cellTreeExpandCollapse(\n self.currentCell.rowIndex,\n self.currentCell.columnIndex,\n );\n self.draw();\n } else {\n self.beginEditAt(\n self.currentCell.columnIndex,\n self.currentCell.rowIndex,\n );\n }\n }\n };\n self.scrollWheel = function (e) {\n var l,\n t,\n ev = e,\n childEvent,\n deltaX = e.deltaX === undefined ? e.NativeEvent.deltaX : e.deltaX,\n deltaY = e.deltaY === undefined ? e.NativeEvent.deltaY : e.deltaY,\n deltaMode =\n e.deltaMode === undefined ? e.NativeEvent.deltaMode : e.deltaMode;\n if (e.NativeEvent) e = e.NativeEvent;\n if (self.disposed) {\n return;\n }\n // A child grid receives the wheel through its parent's `wheel` grid\n // event (`ev`), not from the DOM. Cancelling and marking that event tells\n // every ancestor that the grid under the pointer owns this wheel, so only\n // the hovered grid scrolls, even when it has nothing left to scroll.\n function claim() {\n if (ev !== e) {\n ev.claimedByChildGrid = true;\n ev.preventDefault();\n }\n }\n if (wheeling) {\n if (ev === e) {\n e.preventDefault();\n } else {\n claim();\n }\n return;\n }\n if (self.hasFocus) {\n claim();\n }\n childEvent = { NativeEvent: e };\n if (self.dispatchEvent('wheel', childEvent)) {\n if (childEvent.claimedByChildGrid) {\n claim();\n }\n return;\n }\n self.touchHaltAnimation = true;\n l = self.scrollBox.scrollLeft;\n t = self.scrollBox.scrollTop;\n if (self.hasFocus) {\n //BUG Issue 42: https://github.com/TonyGermaneri/canvas-datagrid/issues/42\n //https://stackoverflow.com/questions/20110224/what-is-the-height-of-a-line-in-a-wheel-event-deltamode-dom-delta-line\n if (deltaMode === 1) {\n // line mode = 17 pixels per line\n deltaY = deltaY * 17;\n }\n if (\n (self.scrollBox.scrollTop < self.scrollBox.scrollHeight &&\n deltaY > 0) ||\n (self.scrollBox.scrollLeft < self.scrollBox.scrollWidth &&\n deltaX > 0) ||\n (self.scrollBox.scrollTop > 0 && deltaY < 0) ||\n (self.scrollBox.scrollLeft > 0 && deltaX < 0)\n ) {\n ev.preventDefault(e);\n }\n wheeling = setTimeout(function () {\n wheeling = undefined;\n self.scrollBox.scrollTo(deltaX + l, deltaY + t);\n }, 1);\n }\n };\n self.pasteData = function (\n pasteValue,\n mimeType,\n startRowIndex,\n startColIndex,\n minRowsLength = 0,\n minColumnsLength = 0,\n ) {\n if (mimeType === 'text/html' && !isSupportedHtml(pasteValue)) {\n console.warn(\n 'Unrecognized HTML format. HTML must be a simple table, e.g.: <table><tr><td>data</td></tr></table>.',\n );\n console.warn(\n 'Data with the mime type text/html not in this format will not be imported as row data.',\n );\n\n return;\n }\n\n const rows = parseData(pasteValue, mimeType);\n const columnsLength = rows[0].length;\n\n // selected cell. This mimics Excel's paste functionality, and works\n // as a poor-man's fill-down.\n if (\n rows.length === 1 &&\n columnsLength === 1 &&\n minRowsLength <= 1 &&\n minColumnsLength <= 1\n ) {\n var cellData = rows[0][0].value.map((item) => item.value).join();\n\n self.forEachSelectedCell(function (data, rowIndex, colName) {\n data[rowIndex][colName] = cellData;\n });\n } else {\n let direction = null;\n\n if (minRowsLength > rows.length && minColumnsLength > columnsLength) {\n direction = 'both';\n } else if (minRowsLength > rows.length) {\n direction = 'vertical';\n } else if (minColumnsLength > columnsLength) {\n direction = 'horizontal';\n }\n\n self.insert({\n rows: rows,\n startRowIndex: startRowIndex,\n startColumnIndex: startColIndex,\n minRowsLength: minRowsLength,\n minColumnsLength: minColumnsLength,\n reverseRows: false,\n reverseColumns: false,\n clearSelections: true,\n alwaysFilling: false,\n direction: direction,\n });\n }\n\n // selections is a sparse array, so we condense:\n const affectedCells = [];\n self.forEachSelectedCell((viewData, viewRowIndex, columnName, cell) => {\n affectedCells.push([\n viewRowIndex,\n cell.viewColumnIndex,\n cell.boundRowIndex,\n cell.boundColumnIndex,\n // the pasted value, so listeners need not look it up (#549)\n viewData[viewRowIndex] ? viewData[viewRowIndex][columnName] : undefined,\n ]);\n });\n\n self.dispatchEvent('afterpaste', {\n cells: affectedCells,\n });\n self.dispatchDataChanged('paste', { cells: affectedCells });\n\n return rows.length;\n };\n /**\n * Grows the data set and the schema so that `insert` can write every pasted\n * cell, adding all missing rows and columns in one pass with a single\n * refresh instead of calling `addRow`/`addColumn` per cell.\n * @param {Array} rows Parsed clipboard rows (see `parseData`).\n * @param {number} requiredRowCount Number of rows the grid needs to have.\n * @param {number} requiredColumnCount Number of columns the grid needs to have.\n */\n self.expandGridForInsert = function (\n rows,\n requiredRowCount,\n requiredColumnCount,\n ) {\n const schema = self.getSchema();\n let changed = false;\n const missingColumns = requiredColumnCount - schema.length;\n if (missingColumns > 0) {\n const lastColumn = schema[self.orders.columns[schema.length - 1]] || {};\n for (let i = 0; i < missingColumns; i += 1) {\n const column = {\n name: `col${schema.length + 1}:${Date.now()}${i}`,\n type: deduceColTypeFromData(rows, i),\n title: ' ',\n width: lastColumn.width,\n };\n self.validateColumn(column, schema);\n schema.push(column);\n self.originalData.forEach(function (row, rowIndex) {\n self.applyDefaultValue(row, column, rowIndex);\n });\n }\n self.intf.schema = schema;\n changed = true;\n }\n const missingRows = requiredRowCount - self.originalData.length;\n if (missingRows > 0) {\n for (let i = 0; i < missingRows; i += 1) {\n const row = {};\n self.originalData.push(row);\n self.getSchema().forEach(function (c) {\n self.applyDefaultValue(row, c, self.originalData.length - 1);\n });\n }\n changed = true;\n }\n if (changed) {\n // setFilter re-applies filters and sorting and calls refresh() once\n self.setFilter();\n self.resize(true);\n }\n return changed;\n };\n self.insert = function ({\n rows = [],\n startRowIndex = 0,\n startColumnIndex = 0,\n minRowsLength = 0,\n minColumnsLength = 0,\n reverseRows = false,\n reverseColumns = false,\n clearSelections = false,\n alwaysFilling = false,\n direction = 'both',\n }) {\n const rowsLength = Math.max(rows.length, minRowsLength);\n const fillCellCallback = self.fillCellCallback;\n const filledCells = [];\n\n if (self.attributes.allowGridExpandOnPaste) {\n self.expandGridForInsert(\n rows,\n startRowIndex + rowsLength,\n startColumnIndex +\n Math.max(minColumnsLength, ...rows.map((cells) => cells.length)),\n );\n }\n\n if (clearSelections) self.selections = [];\n\n for (\n let rowPosReal = 0, rowDataPos = 0;\n rowPosReal < rowsLength;\n rowPosReal++, rowDataPos++\n ) {\n if (rowDataPos >= rows.length) {\n rowDataPos = 0;\n }\n\n const fillingRow = rowPosReal >= rows.length;\n const rowPosition = reverseRows\n ? rowsLength - rowPosReal - 1\n : rowPosReal;\n // Rows may have been moved by user, so get the actual row index\n // (instead of the row index at which the row is rendered):\n if (self.originalData[startRowIndex + rowPosition] === undefined) {\n console.warn('Paste data exceeded grid bounds. Skipping.');\n break;\n }\n const realRowIndex = self.orders.rows[startRowIndex + rowPosition];\n\n const cells = rows[rowDataPos];\n const cellsLength = Math.max(cells.length, minColumnsLength);\n\n const existingRowData = self.viewData[realRowIndex];\n const newRowData = Object.assign({}, existingRowData);\n const fillArgs = fillCellCallback\n ? {\n rows: rows,\n direction: direction,\n rowData: newRowData,\n existingRowData: existingRowData,\n rowIndex: realRowIndex,\n rowOffset: rowDataPos,\n cells: cells,\n reversed: direction === 'horizontal' ? reverseColumns : reverseRows,\n isFillingRow: fillingRow || alwaysFilling,\n fillingRowPosition: alwaysFilling\n ? rowPosReal\n : fillingRow\n ? rowPosReal - rows.length\n : -1,\n fillingRowLength: alwaysFilling\n ? rowsLength\n : fillingRow\n ? rowsLength - rows.length\n : -1,\n }\n : undefined;\n\n for (\n let colPosReal = 0, cellDataPos = 0;\n colPosReal < cellsLength;\n colPosReal++, cellDataPos++\n ) {\n if (cellDataPos >= cells.length) {\n cellDataPos = 0;\n }\n\n const fillingColumn = colPosReal >= cells.length;\n const colPosition = reverseColumns\n ? cellsLength - colPosReal - 1\n : colPosReal;\n const columnIndex = startColumnIndex + colPosition;\n if (!self.getSchema()[columnIndex]) {\n console.warn('Paste data exceeded grid bounds. Skipping.');\n continue;\n }\n const column = self.getSchema()[self.orders.columns[columnIndex]];\n const columnName = column.name;\n let cellData = cells[cellDataPos];\n if (cellData && cellData.value) {\n cellData = cellData.value.map((item) => item.value).join('');\n }\n\n const existingCellData = existingRowData[columnName];\n\n if (\n fillCellCallback &&\n (fillingColumn || fillingRow || alwaysFilling)\n ) {\n newRowData[columnName] = fillCellCallback({\n ...fillArgs,\n column: column,\n columnIndex: columnIndex,\n columnOffset: cellDataPos,\n newCellData: cellData,\n existingCellData: existingCellData,\n isFillingColumn: fillingColumn || alwaysFilling,\n fillingColumnPosition: alwaysFilling\n ? colPosReal\n : fillingColumn\n ? colPosReal - cells.length\n : -1,\n fillingColumnLength: alwaysFilling\n ? cellsLength\n : fillingColumn\n ? cellsLength - cells.length\n : -1,\n });\n } else {\n newRowData[columnName] =\n cellData === undefined || cellData === null\n ? existingCellData\n : cellData;\n }\n\n self.selectCell(\n { rowIndex: realRowIndex, viewColumnIndex: columnIndex },\n true,\n );\n\n if (alwaysFilling || fillingRow || fillingColumn) {\n filledCells.push([\n realRowIndex,\n columnIndex,\n self.getBoundRowIndexFromViewRowIndex(realRowIndex),\n self.getBoundColumnIndexFromViewColumnIndex(columnIndex),\n ]);\n }\n }\n\n self.originalData[self.boundRowIndexMap.get(realRowIndex)] = newRowData;\n // Update view date here to avoid a full refresh of `viewData`.\n // To stay in line with Excel and Google Sheet behaviour,\n // don't perform a full refresh (and filter/sort results)\n // as this would make any pasted values disappear and/or suddenly change position.\n self.viewData[realRowIndex] = newRowData;\n }\n\n if (filledCells.length > 0 || alwaysFilling) {\n self.dispatchEvent('afterfill', {\n filledCells: filledCells,\n });\n }\n };\n self.getNextVisibleColumnIndex = function (visibleColumnIndex) {\n var x,\n s = self.getVisibleSchema();\n for (x = 0; x < s.length; x += 1) {\n if (s[x].columnIndex === visibleColumnIndex) {\n return s[x + 1].columnIndex;\n }\n }\n return -1;\n };\n self.getVisibleColumnIndexOf = function (columnIndex) {\n var x,\n s = self.getVisibleSchema();\n for (x = 0; x < s.length; x += 1) {\n if (s[x].columnIndex === columnIndex) {\n return x;\n }\n }\n return -1;\n };\n self.getSelectionIndex = function () {\n const bounds = self.getSelectionBounds(true);\n if (!bounds) return;\n const { top, bottom } = bounds;\n for (let rowIndex = top; rowIndex <= bottom; rowIndex++) {\n const row = self.getRowSelectionStates(rowIndex);\n if (row) {\n if (row[0] === undefined) break;\n\n return {\n row: rowIndex,\n column: row[0] < 0 ? row[1] : row[0],\n rowLength: bottom - rowIndex + 1,\n columnLength: row.length - (row[0] < 0 ? 1 : 0),\n };\n }\n }\n\n return null;\n };\n self.paste = function (event) {\n if (!self.attributes.editable) {\n return;\n }\n\n var defaultPrevented = self.dispatchEvent('beforepaste', {\n NativeEvent: event,\n });\n\n if (defaultPrevented) {\n return;\n }\n\n var clipboardItems = new Map(\n Array.from(event.clipboardData.items).map((item) => [item.type, item]),\n );\n\n // Supported MIME types, in order of preference:\n var supportedMimeTypes = ['text/html', 'text/csv', 'text/plain'];\n\n // The clipboard will often contain the same data in multiple formats,\n // which can be used depending on the context in which it's pasted. Here\n // we'll prefere more structured (HTML/CSV) over less structured, when\n // available, so we try to find those first:\n var pasteableItems = supportedMimeTypes\n .map((mimeType) => clipboardItems.get(mimeType))\n .filter((item) => !!item); // filter out not-found MIME types (= undefined)\n\n if (pasteableItems.length === 0) {\n console.warn(\n 'Cannot find supported clipboard data type. Supported types are:',\n supportedMimeTypes.join(', '),\n );\n return;\n }\n\n const selectionIndex = self.getSelectionIndex();\n if (!selectionIndex) return;\n\n var itemToPaste = pasteableItems[0];\n\n // itemToPaste is cleared once accessed (getData or getAsString),\n // so we need to store the type here, before reading its value:\n var pasteType = itemToPaste.type;\n\n itemToPaste.getAsString(function (pasteValue) {\n self.pasteData(\n pasteValue,\n pasteType,\n selectionIndex.row,\n selectionIndex.column,\n selectionIndex.rowLength,\n selectionIndex.columnLength,\n );\n\n self.draw();\n });\n };\n self.cut = function (event) {\n if (self.dispatchEvent('cut', { NativeEvent: event })) {\n return;\n }\n\n // Expecting instance of `ClipboardEvent` with `clipboardData` attribute\n if (!self.hasFocus || !event.clipboardData) {\n return;\n }\n\n if (!self.attributes.editable) {\n // A read-only grid can still put the selection on the clipboard,\n // but nothing is removed from the data (#587).\n self.copySelectedCellsToClipboard(event.clipboardData);\n event.preventDefault();\n return;\n }\n\n self.copySelectedCellsToClipboard(event.clipboardData);\n\n const affectedCells = self.clearSelectedCells();\n const apiCompatibleCells = affectedCells.map((cell) => {\n return [\n cell.viewRowIndex,\n cell.viewColumnIndex,\n cell.boundRowIndex,\n cell.boundColumnIndex,\n ];\n });\n\n self.dispatchEvent('aftercut', {\n cells: apiCompatibleCells,\n });\n self.dispatchDataChanged('cut', { cells: apiCompatibleCells });\n\n requestAnimationFrame(() => self.draw());\n event.preventDefault();\n };\n self.copy = function (event) {\n if (self.dispatchEvent('copy', { NativeEvent: event })) {\n return;\n }\n\n // Expecting instance of `ClipboardEvent` with `clipboardData` attribute\n if (!self.hasFocus || !event.clipboardData) {\n return;\n }\n\n self.copySelectedCellsToClipboard(event.clipboardData);\n\n event.preventDefault();\n };\n self.selectionHandleMove = function (e) {\n if (!self.movingSelectionHandle) {\n return;\n }\n\n const clippingRect = self.getClippingRect(e);\n const rowIndex = self.currentCell.rowIndex;\n const columnIndex = self.currentCell.columnIndex;\n const isInSelectionBounds =\n rowIndex >= -1 &&\n columnIndex >= -1 &&\n self.fillOverlay.selection.left <= columnIndex &&\n self.fillOverlay.selection.right >= columnIndex &&\n self.fillOverlay.selection.top <= rowIndex &&\n self.fillOverlay.selection.bottom >= rowIndex;\n\n self.fillOverlay.minX = clippingRect.x;\n self.fillOverlay.minY = clippingRect.y;\n self.fillOverlay.x = Math.max(clippingRect.x, e.clientX);\n self.fillOverlay.y = Math.max(clippingRect.y, e.clientY);\n\n // If we are in the selection bounds, allow user to change directions.\n if (isInSelectionBounds) {\n self.fillOverlay.lastInBoundsLocation = {\n x: e.clientX,\n y: e.clientY,\n };\n } else if (\n self.fillOverlay.lastInBoundsLocation ||\n !self.fillOverlay.direction\n ) {\n const lastInBoundsLocation = self.fillOverlay.lastInBoundsLocation;\n self.fillOverlay.lastInBoundsLocation = undefined;\n\n const x = lastInBoundsLocation\n ? lastInBoundsLocation.x\n : self.fillOverlay.handle.x;\n const y = lastInBoundsLocation\n ? lastInBoundsLocation.y\n : self.fillOverlay.handle.y;\n const dx = Math.abs(e.clientX - x);\n const dy = Math.abs(e.clientY - y);\n\n if (dx > 5 || dy > 5) {\n self.fillOverlay.direction = dx > dy ? 'x' : 'y';\n }\n }\n\n if (rowIndex >= 0) {\n self.fillOverlay.rowIndex = rowIndex;\n }\n if (columnIndex >= 0) {\n self.fillOverlay.columnIndex = columnIndex;\n if (rowIndex === -1 && self.visibleRows.length) {\n self.fillOverlay.rowIndex = self.visibleRows[0];\n }\n }\n\n if (rowIndex >= -1 && columnIndex >= -1) {\n self.fillOverlay.snap = self.currentCell;\n } else {\n self.fillOverlay.snap = undefined;\n }\n };\n self.stopSelectionHandleMove = function (e) {\n if (!self.fillOverlay.handle) {\n return false;\n }\n\n self.ignoreNextClick = true;\n\n window.removeEventListener('mousemove', self.selectionHandleMove, false);\n window.removeEventListener('mouseup', self.stopSelectionHandleMove, false);\n\n const overlay = self.fillOverlay;\n const selectionIndex = self.getSelectionIndex();\n const bounds = overlay.selection;\n if (!selectionIndex) return;\n\n self.movingSelectionHandle = undefined;\n self.fillOverlay = {};\n\n if (overlay.rowIndex >= 0 && overlay.columnIndex >= 0) {\n const boundsOld = { ...bounds };\n const isVertical = overlay.direction === 'y';\n const isHorizontal = overlay.direction === 'x';\n\n let startRow,\n rowLength,\n startColumn,\n columnLength,\n reverseVertically = false,\n reverseHorizontally = false;\n\n if (isVertical) {\n if (overlay.rowIndex < bounds.top) {\n bounds.top = overlay.rowIndex;\n reverseVertically = true;\n } else if (overlay.rowIndex > bounds.bottom) {\n bounds.bottom = overlay.rowIndex;\n }\n\n startRow =\n bounds.top < boundsOld.top ? bounds.top : boundsOld.bottom + 1;\n rowLength =\n bounds.top < boundsOld.top\n ? boundsOld.top - bounds.top\n : bounds.bottom - boundsOld.bottom;\n startColumn = selectionIndex.column;\n columnLength = selectionIndex.columnLength;\n } else if (isHorizontal) {\n if (overlay.columnIndex < bounds.left) {\n bounds.left = overlay.columnIndex;\n reverseHorizontally = true;\n } else if (overlay.columnIndex > bounds.right) {\n bounds.right = overlay.columnIndex;\n }\n\n startColumn =\n bounds.left < boundsOld.left ? bounds.left : boundsOld.right + 1;\n columnLength =\n bounds.left < boundsOld.left\n ? boundsOld.left - bounds.left\n : bounds.right - boundsOld.right;\n startRow = selectionIndex.row;\n rowLength = selectionIndex.rowLength;\n }\n\n if (\n bounds.left <= bounds.right &&\n bounds.top <= bounds.bottom &&\n (bounds.left < boundsOld.left ||\n bounds.top < boundsOld.top ||\n bounds.right > boundsOld.right ||\n bounds.bottom > boundsOld.bottom)\n ) {\n const schema = self.getSchema();\n const rows = [];\n\n for (\n let rowIndex = 0;\n rowIndex < Math.min(rowLength, selectionIndex.rowLength);\n rowIndex++\n ) {\n const rowData = self.viewData[selectionIndex.row + rowIndex];\n\n rows[rowIndex] = [];\n\n for (\n let columnIndex = 0;\n columnIndex < Math.min(columnLength, selectionIndex.columnLength);\n columnIndex++\n ) {\n const column = schema[selectionIndex.column + columnIndex];\n if (!column) continue;\n\n const cellData = rowData[column.name];\n\n rows[rowIndex][columnIndex] = cellData;\n }\n }\n\n self.insert({\n rows: rows,\n startRowIndex: startRow,\n startColumnIndex: startColumn,\n minRowsLength: rowLength,\n minColumnsLength: columnLength,\n reverseRows: reverseVertically,\n reverseColumns: reverseHorizontally,\n clearSelections: false,\n alwaysFilling: true,\n direction: isHorizontal ? 'horizontal' : 'vertical',\n });\n self.dispatchDataChanged('fill');\n\n self.draw();\n }\n }\n\n return true;\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true, plusplus: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n var touchTimerMs = 50,\n debounceTouchMove,\n touchMoving,\n touchScrollTimeout;\n self.scrollAnimation = {};\n self.touchDelta = {};\n self.touchAnimateTo = {};\n self.animationFrames = 0;\n self.getTouchPos = function (e, touchIndex) {\n var t = touchIndex ? e.touches[touchIndex] : e.touches[0],\n rect = self.canvas.getBoundingClientRect(),\n pos;\n if (!t) {\n return;\n }\n pos = {\n x: t.clientX - rect.left,\n y: t.clientY - rect.top,\n };\n if (self.isChildGrid) {\n pos.x -= self.canvasOffsetLeft;\n pos.y -= self.canvasOffsetTop;\n }\n return {\n x: pos.x,\n y: pos.y,\n rect: rect,\n };\n };\n // shamelessly stolen from from https://gist.github.com/gre/1650294\n self.easingFunctions = {\n linear: function (t) {\n return t;\n },\n easeInQuad: function (t) {\n return t * t;\n },\n easeOutQuad: function (t) {\n return t * (2 - t);\n },\n easeInOutQuad: function (t) {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n },\n easeInCubic: function (t) {\n return t * t * t;\n },\n easeOutCubic: function (t) {\n return --t * t * t + 1;\n },\n easeInOutCubic: function (t) {\n return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;\n },\n easeInQuart: function (t) {\n return t * t * t * t;\n },\n easeOutQuart: function (t) {\n return 1 - --t * t * t * t;\n },\n easeInOutQuart: function (t) {\n return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t;\n },\n easeInQuint: function (t) {\n return t * t * t * t * t;\n },\n easeOutQuint: function (t) {\n return 1 + --t * t * t * t * t;\n },\n easeInOutQuint: function (t) {\n return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t;\n },\n };\n self.easing = function (t, b, c, d) {\n return (\n c * self.easingFunctions[self.attributes.touchEasingMethod](t / d) + b\n );\n };\n self.calculatePPSTimed = function () {\n self.xPPST = -(\n (self.touchDelta.x - self.touchSigmaTimed.x) /\n (self.touchDelta.t - self.touchSigmaTimed.t)\n );\n self.yPPST = -(\n (self.touchDelta.y - self.touchSigmaTimed.y) /\n (self.touchDelta.t - self.touchSigmaTimed.t)\n );\n self.touchSigmaTimed = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: performance.now(),\n };\n };\n self.calculatePPS = function () {\n self.xPPS = -(\n (self.touchDelta.x - self.touchSigma.x) /\n (self.touchDelta.t - self.touchSigma.t)\n );\n self.yPPS = -(\n (self.touchDelta.y - self.touchSigma.y) /\n (self.touchDelta.t - self.touchSigma.t)\n );\n self.touchSigma = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: performance.now(),\n };\n };\n self.touchEndAnimation = function () {\n if (!self.canvas || !self.scrollBox.scrollTo) {\n return requestAnimationFrame(self.touchEndAnimation);\n }\n var n = performance.now(),\n d = self.attributes.touchReleaseAnimationDurationMs,\n t;\n t = n - self.touchDelta.t;\n self.animationFrames += 1;\n self.scrollAnimation.x = self.easing(\n t,\n self.touchDelta.scrollLeft,\n self.touchAnimateTo.x,\n d,\n );\n self.scrollAnimation.y = self.easing(\n t,\n self.touchDelta.scrollTop,\n self.touchAnimateTo.y,\n d,\n );\n if (\n t > d ||\n (self.scrollAnimation.y === self.scrollBox.scrollTop &&\n self.scrollAnimation.x === self.scrollBox.scrollLeft) ||\n self.stopAnimation\n ) {\n return;\n }\n self.scrollBox.scrollTo(self.scrollAnimation.x, self.scrollAnimation.y);\n requestAnimationFrame(self.touchEndAnimation);\n };\n self.touchEditCell = function (cell) {\n self.beginEditAt(cell.columnIndex, cell.rowIndex);\n };\n self.touchstart = function (e) {\n if (e.changedTouches[0]) {\n self.touchStart = self.getTouchPos(e);\n self.startingCell = self.getCellAt(\n self.touchStart.x,\n self.touchStart.y,\n true,\n );\n } else {\n // nothing to start from (#554)\n self.startingCell = undefined;\n return;\n }\n if (\n self.dispatchEvent('touchstart', {\n NativeEvent: e,\n cell: self.startingCell,\n })\n ) {\n return;\n }\n self.disposeContextMenu();\n clearInterval(self.calculatePPSTimer);\n clearTimeout(self.touchContextTimeout);\n self.touchStartEvent = e;\n self.stopAnimation = true;\n self.animationFrames = 0;\n self.stopPropagation(e);\n if (e.touches.length === 1 && e.changedTouches[0] && !self.zoomAltered) {\n self.touchLength = 1;\n self.touchStart = self.touchStart || self.touchStart1;\n self.touchScrollStart = {\n x: self.scrollBox.scrollLeft,\n y: self.scrollBox.scrollTop,\n t: performance.now(),\n };\n self.touchDelta = {\n x: 0,\n y: 0,\n scrollLeft: self.scrollBox.scrollLeft,\n scrollTop: self.scrollBox.scrollTop,\n t: self.touchScrollStart.t,\n };\n self.touchSigma = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: self.touchDelta.t,\n };\n self.touchSigmaTimed = {\n x: self.touchDelta.x,\n y: self.touchDelta.y,\n t: self.touchDelta.t,\n };\n self.touchContextTimeout = setTimeout(function () {\n self.contextmenuEvent(e, self.touchStart);\n }, self.attributes.touchContextMenuTimeMs);\n self.calculatePPSTimer = setInterval(\n self.calculatePPSTimed,\n touchTimerMs,\n );\n if (\n self.startingCell &&\n (self.startingCell.isGrid ||\n ['tree', 'inherit'].indexOf(self.startingCell.context) !== -1)\n ) {\n self.hasFocus = false;\n return;\n }\n self.hasFocus = true;\n if (self.startingCell && self.startingCell.isHeader) {\n if (self.startingCell.isRowHeader) {\n self.selectArea({\n top: self.startingCell.rowIndex,\n bottom: self.startingCell.rowIndex,\n left: 0,\n right: self.getVisibleSchema().length - 1,\n });\n self.draw(true);\n } else if (self.startingCell.isColumnHeader) {\n if (self.attributes.columnHeaderClickBehavior === 'sort') {\n if (self.orderBy === self.startingCell.header.name) {\n self.orderDirection =\n self.orderDirection === 'asc' ? 'desc' : 'asc';\n } else {\n self.orderDirection = 'asc';\n }\n self.order(self.startingCell.header.name, self.orderDirection);\n }\n if (\n self.attributes.columnHeaderClickBehavior === 'select' &&\n self.attributes.allowColumnSelection\n ) {\n self.selectArea({\n top: 0,\n bottom: self.viewData.length - 1,\n left: self.startingCell.columnIndex,\n right: self.startingCell.columnIndex,\n });\n self.draw(true);\n }\n }\n self.touchEndEvents(e);\n return;\n }\n }\n if (self.zoomAltered) {\n return;\n }\n document.body.addEventListener('touchmove', self.touchmove, {\n passive: false,\n });\n document.body.addEventListener('touchend', self.touchend, false);\n document.body.addEventListener('touchcancel', self.touchcancel, false);\n self.draw(true);\n };\n self.touchSelect = function (cell, handleType) {\n if (cell.rowIndex === undefined || cell.columnIndex === undefined) {\n return;\n }\n self.touchSelecting = true;\n var bounds = self.getSelectionBounds();\n if (\n handleType === 'selection-handle-bl' &&\n cell.rowIndex >= bounds.top &&\n cell.columnIndex <= bounds.right\n ) {\n bounds.bottom = cell.rowIndex;\n bounds.left = cell.columnIndex;\n } else if (\n handleType === 'selection-handle-tl' &&\n cell.rowIndex <= bounds.bottom &&\n cell.columnIndex <= bounds.right\n ) {\n bounds.top = cell.rowIndex;\n bounds.left = cell.columnIndex;\n } else if (\n handleType === 'selection-handle-tr' &&\n cell.rowIndex <= bounds.bottom &&\n cell.columnIndex >= bounds.left\n ) {\n bounds.top = cell.rowIndex;\n bounds.right = cell.columnIndex;\n } else if (\n handleType === 'selection-handle-br' &&\n cell.rowIndex >= bounds.top &&\n cell.columnIndex >= bounds.left\n ) {\n bounds.bottom = cell.rowIndex;\n bounds.right = cell.columnIndex;\n }\n if (self.attributes.selectionMode === 'row' || cell.rowIndex === -1) {\n bounds.left = 0;\n bounds.right = self.getSchema().length - 1;\n } else {\n bounds.left = Math.max(0, bounds.left);\n }\n self.selectArea(bounds);\n self.draw(true);\n };\n function touchMove(e) {\n var ch, rw, rScrollZone, lScrollZone, bScrollZone, tScrollZone, sbw, t1, t2;\n if (self.dispatchEvent('beforetouchmove', { NativeEvent: e })) {\n return;\n }\n clearTimeout(touchScrollTimeout);\n if (e.changedTouches[0]) {\n self.touchPosition = self.getTouchPos(e);\n }\n if (e.changedTouches[1]) {\n self.touchPosition1 = self.getTouchPos(e, 1);\n }\n if (\n Math.abs(self.touchDelta.x) + Math.abs(self.touchDelta.y) >\n self.attributes.touchDeadZone\n ) {\n clearTimeout(self.touchContextTimeout);\n }\n if (e.touches.length === 2 && self.touchPosition && self.touchPosition1) {\n t1 = self.touchPosition.y;\n t2 = self.touchPosition1.y;\n if (!self.zoomDeltaStart) {\n self.zoomDeltaStart = Math.abs(t1 - t2);\n self.startScale = self.scale;\n }\n self.touchLength = 2;\n self.scaleDelta = self.zoomDeltaStart - Math.abs(t1 - t2);\n self.scale =\n self.startScale -\n self.scaleDelta * self.attributes.touchZoomSensitivity;\n self.scale = Math.min(\n Math.max(self.scale, self.attributes.touchZoomMin),\n self.attributes.touchZoomMax,\n );\n self.zoomAltered = true;\n self.resize(true);\n self.resizeChildGrids();\n return;\n }\n if (self.zoomAltered) {\n return;\n }\n self.touchLength = 1;\n self.touchPosition = self.touchPosition || self.touchPosition1;\n ch = self.getColumnHeaderCellHeight();\n rw = self.getRowHeaderCellWidth();\n rScrollZone =\n self.width - self.style.scrollBarWidth - self.touchPosition.x <\n self.attributes.selectionScrollZone;\n lScrollZone =\n self.touchPosition.x - rw < self.attributes.selectionScrollZone;\n bScrollZone =\n self.height - self.style.scrollBarWidth - self.touchPosition.y <\n self.attributes.selectionScrollZone;\n tScrollZone =\n self.touchPosition.y - ch < self.attributes.selectionScrollZone;\n sbw = self.style.scrollBarWidth;\n function touchScroll() {\n var x = self.scrollBox.scrollLeft,\n y = self.scrollBox.scrollTop;\n x += rScrollZone ? self.attributes.selectionScrollIncrement : 0;\n y += bScrollZone ? self.attributes.selectionScrollIncrement : 0;\n y -= tScrollZone ? self.attributes.selectionScrollIncrement : 0;\n x -= lScrollZone ? self.attributes.selectionScrollIncrement : 0;\n self.scrollBox.scrollTo(x, y);\n touchScrollTimeout = setTimeout(\n touchScroll,\n self.attributes.scrollRepeatRate,\n );\n }\n e.stopPropagation();\n self.touchDelta = {\n x: self.touchPosition.x - self.touchStart.x,\n y: self.touchPosition.y - self.touchStart.y,\n scrollLeft: self.scrollBox.scrollLeft,\n scrollTop: self.scrollBox.scrollTop,\n t: performance.now(),\n };\n self.currentCell = self.getCellAt(\n self.touchPosition.x,\n self.touchPosition.y,\n );\n self.dispatchEvent('touchmove', { NativeEvent: e, cell: self.currentCell });\n self.calculatePPS();\n self.touchDuration = performance.now() - self.touchScrollStart.t;\n self.stopAnimation = true;\n self.animationFrames = 0;\n if (\n self.touchSelecting &&\n (rScrollZone || lScrollZone || tScrollZone || bScrollZone)\n ) {\n touchScroll();\n }\n // the starting cell can be missing when the touch began off-grid (#554)\n var startingCellStyle =\n (self.startingCell && self.startingCell.style) || '';\n if (/vertical-scroll-/.test(startingCellStyle)) {\n self.scrollBox.scrollTop =\n self.scrollBox.scrollHeight *\n ((self.touchPosition.y - ch - sbw) /\n (self.scrollBox.height - sbw - ch));\n return;\n }\n if (/horizontal-scroll-/.test(startingCellStyle)) {\n self.scrollBox.scrollLeft =\n self.scrollBox.scrollWidth *\n ((self.touchPosition.x - rw - sbw) / (self.scrollBox.width - sbw - rw));\n return;\n }\n if (/selection-handle-/.test(startingCellStyle)) {\n self.touchSelect(self.currentCell, startingCellStyle);\n return;\n }\n self.scrollBox.scrollTo(\n self.touchScrollStart.x - self.touchDelta.x,\n self.touchScrollStart.y - self.touchDelta.y,\n );\n }\n self.touchmove = function (e) {\n if (touchMoving) {\n return;\n }\n requestAnimationFrame(function () {\n touchMoving = true;\n touchMove(e);\n touchMoving = false;\n });\n };\n self.touchEndEvents = function (e) {\n self.zoomDeltaStart = undefined;\n self.touchSelecting = false;\n clearInterval(self.touchScrollTimeout);\n clearInterval(self.touchContextTimeout);\n clearInterval(self.calculatePPSTimer);\n e.stopPropagation();\n document.body.removeEventListener('touchmove', self.touchmove, {\n passive: false,\n });\n document.body.removeEventListener('touchend', self.touchend, false);\n document.body.removeEventListener('touchcancel', self.touchcancel, false);\n };\n self.touchend = function (e) {\n if (\n self.dispatchEvent('touchend', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n self.zoomDeltaStart = undefined;\n if (e.changedTouches[0]) {\n self.touchPosition = undefined;\n }\n if (e.changedTouches[1]) {\n self.touchPosition1 = undefined;\n }\n if (self.zoomAltered) {\n if (e.touches.length === 0) {\n self.zoomAltered = false;\n }\n return;\n }\n var dz =\n Math.abs(self.touchDelta.x) + Math.abs(self.touchDelta.y) <\n self.attributes.touchDeadZone;\n if (isNaN(self.xPPS)) {\n self.xPPS = 0;\n }\n if (isNaN(self.yPPS)) {\n self.yPPS = 0;\n }\n if (isNaN(self.xPPST)) {\n self.xPPST = 0;\n }\n if (isNaN(self.yPPST)) {\n self.yPPST = 0;\n }\n self.touchAnimateTo.x =\n self.xPPS * self.attributes.touchReleaseAcceleration;\n self.touchAnimateTo.y =\n self.yPPS * self.attributes.touchReleaseAcceleration;\n self.calculatePPSTimed();\n if (\n !dz &&\n self.animationFrames === 0 &&\n (Math.abs(self.xPPST) > self.attributes.scrollAnimationPPSThreshold ||\n Math.abs(self.yPPST) > self.attributes.scrollAnimationPPSThreshold) &&\n !/-scroll-/.test((self.startingCell && self.startingCell.style) || '') &&\n !dz\n ) {\n self.stopAnimation = false;\n self.touchEndAnimation();\n }\n self.touchEndEvents(e);\n };\n self.touchcancel = function (e) {\n if (\n self.dispatchEvent('touchcancel', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n self.touchEndEvents(e);\n };\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals HTMLElement: false, Reflect: false, define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport { createHTMLString, createTextString } from './events/util';\n\nexport default function (self, ctor) {\n self.scale = 1;\n self.orders = {\n rows: [],\n columns: [],\n };\n self.appliedInlineStyles = {};\n self.cellGridAttributes = {};\n self.treeGridAttributes = {};\n self.visibleRowHeights = [];\n self.hasFocus = false;\n self.activeCell = {\n columnIndex: 0,\n rowIndex: 0,\n };\n self.innerHTML = '';\n self.storageName = 'canvasDataGrid';\n self.invalidSearchExpClass = 'canvas-datagrid-invalid-search-regExp';\n self.localStyleLibraryStorageKey = 'canvas-datagrid-user-style-library';\n self.dataType = 'application/x-canvas-datagrid';\n self.orderBy = null;\n self.orderDirection = 'asc';\n self.orderings = {\n columns: [],\n add: function (orderBy, orderDirection, sortFunction) {\n self.orderings.columns = self.orderings.columns.filter(function (col) {\n return col.orderBy !== orderBy;\n });\n self.orderings.columns.push({\n orderBy: orderBy,\n orderDirection: orderDirection,\n sortFunction: sortFunction,\n });\n },\n sort: function () {\n console.warn(\n 'grid.orderings.sort has been deprecated. Please use grid.refresh().',\n );\n\n self.orderings.columns.forEach(function (col) {\n self.viewData.sort(col.sortFunction(col.orderBy, col.orderDirection));\n });\n },\n };\n self.columnFilters = {};\n self.filters = {};\n self.frozenRow = 0;\n self.frozenColumn = 0;\n self.ellipsisCache = {};\n self.scrollCache = { x: [], y: [] };\n self.scrollBox = {};\n self.visibleRows = [];\n self.visibleCells = [];\n /**\n * Each item of this array contains these properties:\n * - `x`, `y`, `x2`, `y2`\n * - `orderIndex0`, `orderIndex1`: The closed interval of the hiding rows/columns.\n * - `dir`: The directon of the unhide indicator. 'l' and 'r' for columns, 't' and 'b' for rows\n */\n self.visibleUnhideIndicators = [];\n /**\n * Each item is a tuple conatins two numbers:\n * its type difination: Array<[beginRowIndex, endRowIndex]>\n * Each tuple represents a closed Interval\n */\n self.hiddenRowRanges = [];\n /**\n * This array stored all groups information with context for drawing,\n * it is generated by drawing functions,\n * and be used for searching groups when users operate on the spreadsheet\n * Each item of this array contains these properties:\n * - `type`: its available values: 'c' and 'r'. indicates the type of this item, 'c' for column group\n * and 'r' for row group.\n * - `x`,`y`: the left-top point of this group's rendering area.\n * - `x2`, `y2`: the right-bottom of this group's rendering area.\n * - `collapsed`: this value indicates the collapsed status of this group.\n * - `from`, `to`: The column index range of this group (We use this value for searching the group)\n * - `row`: The row index for column groups (We use this value for searching the group)\n */\n self.visibleGroups = [];\n self.sizes = {\n rows: {},\n columns: {},\n trees: {},\n };\n self.fillOverlay = {};\n self.filterable = {\n rows: [],\n columns: [],\n };\n self.selectedFilterButton = {\n columnIndex: -1,\n rowIndex: -1,\n };\n self.cellTree = {\n rows: [],\n columns: {},\n tempSchema: {},\n rowTreeColIndex: 0,\n columnTreeRowStartIndex: 0,\n columnTreeRowEndIndex: 0,\n origin: {\n rows: [],\n columns: {},\n },\n };\n self.hovers = {};\n self.attributes = {};\n self.style = {};\n self.formatters = {};\n self.sorters = {};\n self.parsers = {};\n self.schemaHashes = {};\n self.events = {};\n self.changes = [];\n self.scrollIndexTop = 0;\n self.scrollIndexBottom = 0;\n self.scrollIndexRight = 0;\n self.scrollPixelTop = 0;\n self.scrollIndexLeft = 0;\n self.scrollPixelLeft = 0;\n self.childGrids = {};\n self.openChildren = {};\n\n /**\n * Array for grouped columns\n * Each item in this array is an array and it represents some grouping in one row\n * A grouping descriptor has three properties:\n * - `from`: The column index of the first column\n * - `to`: The column index of the last column\n * - `collapsed`: Is this group be collapsed\n * @example [[{ from: 1, to: 2, collapsed: false }]]\n */\n self.groupedColumns = [];\n\n /**\n * Array for grouped rows\n * Each item in this array is an array and it represents some grouping in one column\n * A grouping descriptor has three properties:\n * - `from`: The row index of the first row\n * - `to`: The row index of the last row\n * - `collapsed`: Is this group be collapsed\n * @example [[{ from: 1, to: 2, collapsed: false }]]\n */\n self.groupedRows = [];\n\n self.scrollModes = [\n 'vertical-scroll-box',\n 'vertical-scroll-top',\n 'vertical-scroll-bottom',\n 'horizontal-scroll-box',\n 'horizontal-scroll-right',\n 'horizontal-scroll-left',\n ];\n self.componentL1Events = {};\n self.eventNames = [\n 'activecellchanged',\n 'afterdraw',\n 'afterrendercell',\n 'afterrenderfilterbutton',\n 'aftercreategroup',\n 'attributechanged',\n 'beforebeginedit',\n 'beforecreatecellgrid',\n 'beforedraw',\n 'beforeendedit',\n 'beforerendercell',\n 'beforerendercellgrid',\n 'beforerenderfilterbutton',\n 'beginedit',\n 'cellmouseout',\n 'cellmouseover',\n 'click',\n 'collapsetree',\n 'columnhide',\n 'columnunhide',\n 'contextmenu',\n 'copy',\n 'datachanged',\n 'dblclick',\n 'endedit',\n 'expandtree',\n 'formatcellvalue',\n 'keydown',\n 'keypress',\n 'keyup',\n 'mousedown',\n 'mousemove',\n 'mouseup',\n 'newrow',\n 'ordercolumn',\n 'rendercell',\n 'rendercellgrid',\n 'renderorderbyarrow',\n 'rendertext',\n 'rendertreearrow',\n 'reorder',\n 'reordering',\n 'resize',\n 'resizecolumn',\n 'resizerow',\n 'schemachanged',\n 'scroll',\n 'selectionchanged',\n 'stylechanged',\n 'touchcancel',\n 'touchend',\n 'touchmove',\n 'touchstart',\n 'wheel',\n ];\n self.mouse = { x: 0, y: 0 };\n\n self.getBoundRowIndexFromViewRowIndex = function (viewRowIndex) {\n if (self.boundRowIndexMap && self.boundRowIndexMap.has(viewRowIndex)) {\n return self.boundRowIndexMap.get(viewRowIndex);\n }\n\n return undefined;\n };\n self.getBoundColumnIndexFromViewColumnIndex = function (viewColumnIndex) {\n return self.orders.columns[viewColumnIndex];\n };\n /**\n * Get the height of the area about column groups for rendering and handling events.\n */\n self.getColumnGroupAreaHeight = function () {\n if (!self.attributes.allowGroupingColumns) {\n return 0;\n }\n const groups = self.groupedColumns.length;\n const base = self.style.columnGroupRowHeight * self.scale;\n return base * groups;\n };\n /**\n * Get the width of the area about row groups for rendering and handling events.\n */\n self.getRowGroupAreaWidth = function () {\n if (!self.attributes.allowGroupingRows) {\n return 0;\n }\n const groups = self.groupedRows.length;\n const base = self.style.rowGroupColumnWidth * self.scale;\n return base * groups;\n };\n self.getCollapsedColumnGroups = function () {\n const result = [];\n for (let rowIndex = 0; rowIndex < self.groupedColumns.length; rowIndex++) {\n const groups = self.groupedColumns[rowIndex];\n for (let groupIndex = 0; groupIndex < groups.length; groupIndex++) {\n const group = groups[groupIndex];\n if (group.collapsed) result.push(group);\n }\n }\n return result;\n };\n self.getCollapsedRowGroups = function () {\n const result = [];\n for (let rowIndex = 0; rowIndex < self.groupedRows.length; rowIndex++) {\n const groups = self.groupedRows[rowIndex];\n for (let groupIndex = 0; groupIndex < groups.length; groupIndex++) {\n const group = groups[groupIndex];\n if (group.collapsed) result.push(group);\n }\n }\n return result;\n };\n /**\n * Toggle the collapse status of a group (expanded/collapsed)\n * @param {{type:string,from:number,to:number}} group\n */\n self.toggleGroup = function (group) {\n if (group.type === 'c') {\n const { from, to } = group;\n /** @type {{from:number,to:number,collapsed:boolean}} */\n let matchedGroup;\n /** @type {Array<Array<{from:number,to:number,collapsed:boolean}>>} */\n const allGroups = self.groupedColumns;\n for (let i = 0; i < allGroups.length; i++) {\n const groups = allGroups[i];\n for (let gi = 0; gi < groups.length; gi++) {\n const group = groups[gi];\n if (group.from === from && group.to === to) {\n matchedGroup = group;\n break;\n }\n }\n if (matchedGroup) break;\n }\n if (!matchedGroup) return;\n const nextCollapsed = !matchedGroup.collapsed;\n matchedGroup.collapsed = nextCollapsed;\n return true;\n }\n if (group.type === 'r') {\n const { from, to } = group;\n /** @type {{from:number,to:number,collapsed:boolean}} */\n let matchedGroup;\n /** @type {Array<Array<{from:number,to:number,collapsed:boolean}>>} */\n const allGroups = self.groupedRows;\n for (let i = 0; i < allGroups.length; i++) {\n const groups = allGroups[i];\n for (let gi = 0; gi < groups.length; gi++) {\n const group = groups[gi];\n if (group.from === from && group.to === to) {\n matchedGroup = group;\n break;\n }\n }\n if (matchedGroup) break;\n }\n if (!matchedGroup) return;\n const nextCollapsed = !matchedGroup.collapsed;\n matchedGroup.collapsed = nextCollapsed;\n return true;\n }\n return false;\n };\n self.isNewGroupRangeValid = function (groupsArray, from, to) {\n for (let i = 0; i < groupsArray.length; i++) {\n const groups = groupsArray[i];\n for (let gIndex = 0; gIndex < groups.length; gIndex++) {\n const group = groups[gIndex];\n if (from === group.to + 1) return false;\n if (from > group.to) continue;\n\n if (from === group.from) {\n if (to === group.to) return false;\n if (to > group.to) return true;\n break; // check smaller range\n }\n if (from > group.from) {\n if (to > group.to) return false;\n break; // check smaller range\n }\n if (to < group.to) return false;\n return true;\n }\n }\n return true;\n };\n self.getColumnHeaderCellHeight = function () {\n if (!self.attributes.showColumnHeaders) {\n return 0;\n }\n return (\n (self.sizes.rows[-1] || self.style.columnHeaderCellHeight) * self.scale\n );\n };\n self.getRowHeaderCellWidth = function () {\n if (!self.attributes.showRowHeaders) {\n return 0;\n }\n return (\n (self.sizes.columns[-1] || self.style.rowHeaderCellWidth) * self.scale\n );\n };\n self.setStorageData = function () {\n if (!self.attributes.saveAppearance || !self.attributes.name) {\n return;\n }\n var visibility = {};\n self.getSchema().forEach(function (column) {\n visibility[column.name] = !column.hidden;\n });\n localStorage.setItem(\n self.storageName + '-' + self.attributes.name,\n JSON.stringify({\n sizes: {\n rows: self.sizes.rows,\n columns: self.sizes.columns,\n },\n orders: {\n rows: self.orders.rows,\n columns: self.orders.columns,\n },\n orderBy: self.orderBy,\n orderDirection: self.orderDirection,\n visibility: visibility,\n }),\n );\n };\n self.getSchema = function () {\n return self.schema || self.tempSchema || [];\n };\n function fillArray(low, high) {\n var i = [],\n x;\n for (x = low; x <= high; x += 1) {\n i[x] = x;\n }\n return i;\n }\n self.createColumnOrders = function () {\n var s = self.getSchema();\n self.orders.columns = fillArray(0, s.length - 1);\n };\n self.createRowOrders = function () {\n self.orders.rows = fillArray(0, self.originalData.length - 1);\n };\n self.getVisibleSchema = function () {\n return self.getSchema().filter(function (col) {\n return !col.hidden;\n });\n };\n self.applyDefaultValue = function (row, header, rowIndex) {\n var d = header.defaultValue || '';\n if (typeof d === 'function') {\n d = d.apply(self.intf, [header, rowIndex]);\n }\n row[header.name] = d;\n };\n self.createNewRowData = function () {\n self.newRow = {};\n\n // The third argument of applyDefaultValue is the row index\n // of the row for which to apply the default value. In this\n // case, we're creating a new row but not yet appending it\n // to self.originalData, so no row index exists\n const newRowIndex = undefined;\n\n self.getSchema().forEach(function forEachHeader(header) {\n self.applyDefaultValue(self.newRow, header, newRowIndex);\n });\n };\n self.getSchemaNameHash = function (key) {\n var n = 0;\n while (self.schemaHashes[key]) {\n n += 1;\n key = key + n;\n }\n return key;\n };\n self.filter = function (type) {\n var f = self.filters[type];\n if (!f && type !== undefined) {\n console.warn(\n 'Cannot find filter for type %s, falling back to substring match.',\n type,\n );\n f = self.filters.string;\n }\n return f;\n };\n self.hasActiveFilters = function () {\n return self.columnFilters && Object.keys(self.columnFilters).length > 0;\n };\n self.hasCollapsedRowGroup = function () {\n for (let i = 0; i < self.groupedRows.length; i++) {\n const groups = self.groupedRows[i];\n for (let j = 0; j < groups.length; j++) {\n const g = groups[j];\n if (g.collapsed) return true;\n }\n }\n return false;\n };\n self.getFilteredAndSortedViewData = function (originalData) {\n // We make a copy of originalData here in order be able to\n // filter and sort rows without modifying the original array.\n // Each row is turned into a (row, rowIndex) tuple\n // so that when we apply filters, we can refer back to the\n // row's original row number in originalData. This becomes\n // useful when emitting cell events.\n let newViewData = originalData.map((row, originalRowIndex) => [\n row,\n originalRowIndex,\n ]);\n\n // Remove hidden rows here. So we can keep the bound indexes correct\n if (self.hiddenRowRanges.length > 0) {\n const ranges = self.hiddenRowRanges.sort((a, b) => b[1] - a[1]);\n for (let i = 0; i < ranges.length; i++) {\n const [beginRowIndex, endRowIndex] = ranges[i];\n const countOfRows = endRowIndex - beginRowIndex + 1;\n newViewData.splice(beginRowIndex, countOfRows);\n }\n }\n\n // Apply filtering\n for (const [headerName, filterText] of Object.entries(self.columnFilters)) {\n const header = self.getHeaderByName(headerName);\n\n if (!header) {\n continue;\n }\n\n const currentFilterFunction =\n header.filter || self.filter(header.type || 'string');\n\n newViewData = newViewData.filter(function ([row, originalRowIndex]) {\n if (\n self.attributes.allowFreezingRows &&\n !self.attributes.filterFrozenRows &&\n originalRowIndex < self.frozenRow\n )\n return true;\n\n return currentFilterFunction(row[headerName], filterText);\n });\n }\n\n //#region Hide rows from collapsed group\n /** @type {number[][]} */\n let collapsedGroups = [];\n for (let i = 0; i < self.groupedRows.length; i++) {\n const rows = self.groupedRows[i];\n for (let j = 0; j < rows.length; j++) {\n const r = rows[j];\n if (!r.collapsed) continue;\n collapsedGroups.push([r.from, r.to]);\n }\n }\n if (collapsedGroups.length > 0) {\n //#region merge groups\n collapsedGroups.sort((a, b) => a[0] - b[0]);\n let newLen = 0;\n const len = collapsedGroups.length;\n for (let i = 0; i < len; i++) {\n const r = collapsedGroups[i];\n if (i === len - 1) {\n collapsedGroups[newLen++] = r;\n break;\n }\n const to = r[1];\n const [from2, to2] = collapsedGroups[i + 1];\n if (from2 > to + 1) {\n collapsedGroups[newLen++] = r;\n continue;\n }\n collapsedGroups[i + 1] = r;\n if (to2 > to) collapsedGroups[i + 1][1] = to2;\n }\n collapsedGroups = collapsedGroups.slice(0, newLen);\n //#endregion merge groups\n\n //#region omit rows by groups\n let g = collapsedGroups.shift();\n for (let start = 0; start < newViewData.length; start++) {\n const it = newViewData[start][1];\n if (it < g[0]) continue;\n let end = start + 1;\n for (; end < newViewData.length; end++) {\n const it2 = newViewData[end][1];\n if (it2 > g[1]) break;\n }\n newViewData.splice(start, end - start);\n g = collapsedGroups.shift();\n if (!g) break;\n start--;\n }\n //#endregion omit rows by groups\n }\n //#endregion Hide rows from collapsed group\n\n // Apply sorting\n for (const column of self.orderings.columns) {\n const sortFn = column.sortFunction(column.orderBy, column.orderDirection);\n\n newViewData.sort(([rowA], [rowB, rowIndexB]) => {\n if (\n self.attributes.allowFreezingRows &&\n !self.attributes.sortFrozenRows &&\n rowIndexB < self.frozenRow\n )\n return 0;\n return sortFn(rowA, rowB);\n });\n }\n\n return {\n viewData: newViewData.map(([row]) => row),\n boundRowIndexMap: new Map(\n newViewData.map(([_row, originalRowIndex], viewRowIndex) => [\n viewRowIndex,\n originalRowIndex,\n ]),\n ),\n };\n };\n self.refresh = function () {\n const { viewData, boundRowIndexMap } = self.getFilteredAndSortedViewData(\n self.originalData,\n );\n\n self.viewData = viewData;\n self.boundRowIndexMap = boundRowIndexMap;\n\n self.resize();\n self.draw(true);\n };\n self.getBestGuessDataType = function (columnName, data) {\n var t,\n x,\n l = data.length;\n for (x = 0; x < l; x += 1) {\n if (\n data[x] !== undefined &&\n data[x] !== null &&\n [null, undefined].indexOf(data[x][columnName]) !== -1\n ) {\n t = typeof data[x];\n return t === 'object' ? 'string' : t;\n }\n }\n return 'string';\n };\n self.drawChildGrids = function () {\n Object.keys(self.childGrids).forEach(function (gridKey) {\n self.childGrids[gridKey].draw();\n });\n };\n self.resizeChildGrids = function () {\n Object.keys(self.childGrids).forEach(function (gridKey) {\n self.childGrids[gridKey].resize();\n });\n };\n self.autoScrollZone = function (e, x, y, ctrl) {\n var setTimer,\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n columnHeaderCellHeight = self.getColumnHeaderCellHeight();\n if (x !== -1) {\n if (x > self.width - self.attributes.selectionScrollZone) {\n self.scrollBox.scrollLeft += self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n if (x - self.attributes.selectionScrollZone - rowHeaderCellWidth < 0) {\n self.scrollBox.scrollLeft -= self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n }\n if (y !== -1) {\n if (y > self.height - self.attributes.selectionScrollZone) {\n self.scrollBox.scrollTop += self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n if (\n y - self.attributes.selectionScrollZone - columnHeaderCellHeight <\n 0\n ) {\n self.scrollBox.scrollTop -= self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n }\n if (\n setTimer &&\n !ctrl &&\n self.currentCell &&\n self.currentCell.columnIndex !== -1\n ) {\n self.scrollTimer = setTimeout(\n self.mousemove,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n };\n self.validateColumn = function (c, s) {\n if (!c.name) {\n throw new Error('A column must contain at least a name.');\n }\n if (\n s.filter(function (i) {\n return i.name === c.name;\n }).length > 0\n ) {\n throw new Error(\n 'A column with the name ' +\n c.name +\n ' already exists and cannot be added again.',\n );\n }\n return true;\n };\n self.setDefaults = function (obj1, obj2, key, def) {\n obj1[key] = obj2[key] === undefined ? def : obj2[key];\n };\n self.setAttributes = function () {\n self.defaults.attributes.forEach(function eachAttribute(i) {\n self.setDefaults(self.attributes, self.args, i[0], i[1]);\n });\n };\n self.setStyle = function () {\n self.defaults.styles.forEach(function eachStyle(i) {\n self.setDefaults(self.style, self.args.style || {}, i[0], i[1]);\n });\n };\n self.autosize = function (colName) {\n self.getVisibleSchema().forEach(function (col, colIndex) {\n if (col.name === colName || colName === undefined) {\n self.sizes.columns[colIndex] = Math.max(\n self.findColumnMaxTextLength(col.name),\n self.style.minColumnWidth,\n );\n }\n });\n self.sizes.columns[-1] = self.findColumnMaxTextLength('cornerCell');\n };\n self.dispose = function () {\n // dispose is idempotent (#338, #455): a second call is a no-op\n if (self.disposed) {\n return;\n }\n self.disposed = true;\n // child (tree) grids first\n Object.keys(self.openChildren || {}).forEach(function (key) {\n var child = self.openChildren[key];\n if (child && typeof child.dispose === 'function') {\n child.dispose();\n }\n });\n if (self.contextMenu) {\n self.disposeContextMenu();\n }\n document.removeEventListener('click', self.disposeContextMenu);\n if (self.resizeObserver) {\n self.resizeObserver.disconnect();\n self.resizeObserver = undefined;\n }\n if (self.resizeObserverFrame) {\n cancelAnimationFrame(self.resizeObserverFrame);\n self.resizeObserverFrame = undefined;\n }\n if (!self.isChildGrid && self.canvas && self.canvas.parentNode) {\n self.canvas.parentNode.removeChild(self.canvas);\n }\n if (\n !self.isChildGrid &&\n self.controlInput &&\n self.controlInput.parentNode\n ) {\n self.controlInput.parentNode.removeChild(self.controlInput);\n }\n if (self.eventParent) {\n self.eventParent.removeEventListener('scroll', self.resize, false);\n self.eventParent.removeEventListener('mouseup', self.mouseup, false);\n self.eventParent.removeEventListener('touchstart', self.touchstart);\n }\n document.body.removeEventListener('touchmove', self.touchmove);\n document.body.removeEventListener('touchend', self.touchend, false);\n document.body.removeEventListener('touchcancel', self.touchcancel, false);\n self.eventParent.removeEventListener('mousedown', self.mousedown, false);\n self.eventParent.removeEventListener('dblclick', self.dblclick, false);\n self.eventParent.removeEventListener('click', self.click, false);\n self.eventParent.removeEventListener('mousemove', self.mousemove);\n // child grids listen for the wheel on the parent grid's event, not the DOM\n self[self.isChildGrid ? 'parentGrid' : 'eventParent'].removeEventListener(\n 'wheel',\n self.scrollWheel,\n false,\n );\n self.canvas.removeEventListener(\n 'contextmenu',\n self.contextmenuEvent,\n false,\n );\n self.canvas.removeEventListener('copy', self.copy);\n self.controlInput.removeEventListener('copy', self.copy);\n self.controlInput.removeEventListener('cut', self.cut);\n self.controlInput.removeEventListener('paste', self.paste);\n self.controlInput.removeEventListener('keypress', self.keypress, false);\n self.controlInput.removeEventListener('keyup', self.keyup, false);\n self.controlInput.removeEventListener('keydown', self.keydown, false);\n window.removeEventListener('mouseup', self.mouseup, false);\n window.removeEventListener('mouseup', self.mouseupOutsideGrid, false);\n window.removeEventListener('mousemove', self.mousemove);\n window.removeEventListener('resize', self.resize);\n // the MutationObserver is created by the web component wrapper and kept\n // on the host element (#237, #338)\n var observer = self.observer || (self.intf && self.intf.observer);\n if (observer && observer.disconnect) {\n observer.disconnect();\n }\n if (self.intf) {\n self.intf.observer = undefined;\n }\n };\n self.tryLoadStoredSettings = function () {\n var s;\n self.reloadStoredValues();\n if (\n self.storedSettings &&\n typeof self.storedSettings.orders === 'object' &&\n self.storedSettings.orders !== null\n ) {\n if (\n self.storedSettings.orders.rows.length >= (self.viewData || []).length\n ) {\n self.orders.rows = self.storedSettings.orders.rows;\n }\n s = self.getSchema();\n if (self.storedSettings.orders.columns.length === s.length) {\n self.orders.columns = self.storedSettings.orders.columns;\n }\n self.orderBy =\n self.storedSettings.orderBy === undefined\n ? s[0].name\n : self.storedSettings.orderBy;\n self.orderDirection =\n self.storedSettings.orderDirection === undefined\n ? 'asc'\n : self.storedSettings.orderDirection;\n if (\n self.storedSettings.orderBy !== undefined &&\n self.getHeaderByName(self.orderBy) &&\n self.orderDirection\n ) {\n self.order(self.orderBy, self.orderDirection);\n }\n }\n };\n self.toggleCollapseTree = function (rowIndex, columnIndex, type) {\n let tempData = [];\n let collapsedCount = 0;\n if (\n columnIndex == self.cellTree.rowTreeColIndex &&\n (rowIndex > 0 || (rowIndex == 0 && self.cellTree.rows[0].icon))\n ) {\n let ctr = self.cellTree.rows;\n switch (type) {\n case 'Expand':\n ctr[rowIndex].expand = true;\n self.cellTree.origin.rows[ctr[rowIndex].index].expand = true;\n break;\n\n case 'Collapse':\n ctr[rowIndex].expand = false;\n self.cellTree.origin.rows[ctr[rowIndex].index].expand = false;\n break;\n\n default:\n ctr[rowIndex].expand = !ctr[rowIndex].expand;\n self.cellTree.origin.rows[ctr[rowIndex].index].expand =\n ctr[rowIndex].expand;\n }\n for (\n let ri = ctr[rowIndex].index + 1;\n ri <= ctr[rowIndex].lastchild;\n ri++\n ) {\n let orTree = self.cellTree.origin.rows[ri];\n if (ctr[rowIndex].expand) {\n orTree.hide = false;\n if (orTree.icon && !orTree.expand) ri = orTree.lastchild;\n } else {\n orTree.hide = true;\n }\n }\n } else if (self.cellTree.columns[rowIndex]) {\n let ctc = self.cellTree.columns[rowIndex];\n\n switch (type) {\n case 'Expand':\n ctc[columnIndex].expand = true;\n break;\n\n case 'Collapse':\n ctc[columnIndex].expand = false;\n break;\n\n default:\n ctc[columnIndex].expand = !ctc[columnIndex].expand;\n }\n for (\n let ci = ctc[columnIndex].index + 1;\n ci <= ctc[columnIndex].lastchild;\n ci++\n ) {\n if (ctc[columnIndex].expand)\n self.cellTree.tempSchema[ci].hidden = false;\n else self.cellTree.tempSchema[ci].hidden = true;\n }\n let rc = 0,\n _ri;\n\n if (ctc[columnIndex].expand) {\n while (rc < ctc[columnIndex].child) {\n _ri = rowIndex + rc + 1;\n\n for (\n let _ci = ctc[columnIndex].index;\n _ci <= ctc[columnIndex].lastchild;\n _ci++\n ) {\n if (\n self.cellTree.origin.columns[_ri] &&\n self.cellTree.origin.columns[_ri][_ci].icon &&\n !self.cellTree.origin.columns[_ri][_ci].expand\n ) {\n for (\n let si = _ci + 1;\n si <= self.cellTree.origin.columns[_ri][_ci].lastchild;\n si++\n ) {\n self.cellTree.tempSchema[si].hidden = true;\n }\n }\n }\n\n rc++;\n }\n }\n }\n let otherData = {};\n let collapsed = [];\n self.cellTree.rows = [];\n self.cellTree.columns = {};\n for (let k in self.cellTree.origin.rows) {\n let tempRow = [];\n let tree = self.cellTree.origin.rows[k];\n if (!tree.hide) {\n let colTrees = [];\n let collapsedColCount = 0;\n if (k < self.cellTree.columnTreeRowStartIndex) {\n tempData.push(self.originalData[k]);\n } else {\n if (k > self.cellTree.columnTreeRowEndIndex) {\n otherData[k] = self.viewData[k];\n collapsedCount++;\n } else {\n for (let l = 0; l < self.originalData[k].length; l++) {\n if (!self.cellTree.tempSchema[l].hidden) {\n if (l < self.cellTree.rowTreeColIndex) {\n if (!Object.prototype.hasOwnProperty.call(otherData, k))\n otherData[k] = [];\n otherData[k].push(self.viewData[k][l]);\n }\n tempRow.push(self.originalData[k][l]);\n if (\n Object.prototype.hasOwnProperty.call(\n self.cellTree.origin.columns,\n k,\n )\n )\n colTrees.push(self.cellTree.origin.columns[k][l]);\n } else collapsedColCount++;\n }\n tempRow.push(...Array(collapsedColCount).fill(''));\n if (colTrees.length) {\n colTrees.push(\n ...Array(collapsedColCount)\n .fill()\n .map(() => {\n return {};\n }),\n );\n self.cellTree.columns[k] = colTrees;\n }\n tempData.push(tempRow);\n }\n }\n self.cellTree.rows.push(tree);\n } else {\n for (let l = 0; l < self.cellTree.rowTreeColIndex; l++) {\n tempRow.push(self.viewData[k][l]);\n }\n otherData[k] = tempRow;\n collapsed.push(Array(self.viewData[0].length).fill(''));\n collapsedCount++;\n }\n }\n if (collapsedCount) {\n self.cellTree.rows.push(\n ...Array(collapsedCount)\n .fill()\n .map((u, index) => {\n return { index: self.cellTree.rows.length + index };\n }),\n );\n tempData.push(...collapsed);\n }\n for (let k in otherData) {\n if (k > self.cellTree.columnTreeRowEndIndex) tempData[k] = otherData[k];\n else\n for (let l in otherData[k]) {\n tempData[k][l] = otherData[k][l];\n }\n }\n self.viewData = tempData;\n };\n self.cellTreeExpandCollapse = function (rowIndex, columnIndex, type) {\n if (\n columnIndex == self.cellTree.rowTreeColIndex &&\n (rowIndex > 0 || (rowIndex == 0 && self.cellTree.rows[0].icon))\n ) {\n const ctr = self.cellTree.rows;\n switch (type) {\n case 'Expand':\n ctr[rowIndex].expand = true;\n break;\n case 'Collapse':\n ctr[rowIndex].expand = false;\n break;\n default:\n ctr[rowIndex].expand = !ctr[rowIndex].expand;\n }\n for (let ri = rowIndex + 1; ri <= ctr[rowIndex].lastchild; ri++) {\n if (ctr[rowIndex].expand) {\n ctr[ri].hide = false;\n if (ctr[ri].icon && !ctr[ri].expand) ri = ctr[ri].lastchild;\n } else {\n ctr[ri].hide = true;\n }\n }\n } else if (self.cellTree.columns[rowIndex]) {\n const ctc = self.cellTree.columns[rowIndex];\n switch (type) {\n case 'Expand':\n ctc[columnIndex].expand = true;\n break;\n case 'Collapse':\n ctc[columnIndex].expand = false;\n break;\n default:\n ctc[columnIndex].expand = !ctc[columnIndex].expand;\n }\n\n for (let ci = columnIndex + 1; ci <= ctc[columnIndex].lastchild; ci++) {\n if (ctc[columnIndex].expand) self.tempSchema[ci].hidden = false;\n else self.tempSchema[ci].hidden = true;\n }\n\n let rc = 0,\n ri;\n if (ctc[columnIndex].expand) {\n while (rc < ctc[columnIndex].child) {\n ri = rowIndex + rc + 1;\n for (let ci = columnIndex; ci <= ctc[columnIndex].lastchild; ci++) {\n if (\n self.cellTree.columns[ri] &&\n self.cellTree.columns[ri][ci].icon &&\n !self.cellTree.columns[ri][ci].expand\n ) {\n for (\n let si = ci + 1;\n si <= self.cellTree.columns[ri][ci].lastchild;\n si++\n )\n self.tempSchema[si].hidden = true;\n }\n }\n rc++;\n }\n }\n }\n };\n\n self.initCellTreeSettings = function () {\n if (self.viewData === undefined) return;\n if (self.attributes.rowTree.length > 0 && self.viewData.length > 0) {\n self.cellTree.rows = Array(self.viewData.length)\n .fill()\n .map((u, index) => ({ index: index }));\n self.cellTree.rowTreeColIndex = self.attributes.rowTreeColIndex;\n let invalidRowTree = false;\n for (let rt of self.attributes.rowTree) {\n if (self.cellTree.rows.length <= rt.end) {\n invalidRowTree = true;\n break;\n }\n\n for (let ri = rt.begin; ri <= rt.end; ri++) {\n if (ri == rt.begin) {\n self.cellTree.rows[ri].icon = true;\n self.cellTree.rows[ri].lastchild = rt.end;\n self.cellTree.rows[ri].expand = true;\n if (!self.cellTree.rows[ri].parentCount)\n self.cellTree.rows[ri].parentCount = 0;\n } else {\n self.cellTree.rows[ri].hide = false;\n self.cellTree.rows[ri].parentIndex = rt.begin;\n if (self.cellTree.rows[ri] && self.cellTree.rows[ri].parentCount)\n self.cellTree.rows[ri].parentCount += 1;\n else self.cellTree.rows[ri].parentCount = 1;\n }\n }\n }\n if (invalidRowTree) self.cellTree.rows = {};\n }\n if (self.attributes.columnTree.length > 0 && self.viewData.length > 0) {\n self.cellTree.columnTreeRowStartIndex =\n self.attributes.columnTreeRowStartIndex;\n self.cellTree.columnTreeRowEndIndex =\n self.attributes.columnTreeRowEndIndex;\n let dataColumnLength = Object.keys(self.viewData[0]).length;\n let invalidColumnTree = false;\n for (let ct of self.attributes.columnTree) {\n if (dataColumnLength <= ct.end) {\n invalidColumnTree = true;\n break;\n }\n\n if (!self.cellTree.columns[ct.row])\n self.cellTree.columns[ct.row] = Array(dataColumnLength)\n .fill()\n .map((u, index) => ({ index: index }));\n\n for (let i = ct.begin; i <= ct.end; i++) {\n const ctc = self.cellTree.columns[ct.row][i];\n if (i == ct.begin) {\n ctc.icon = true;\n ctc.lastchild = ct.end;\n ctc.length = ct.end - ct.begin;\n ctc.expand = true;\n if (ct.child) ctc.child = ct.child;\n else ctc.child = 0;\n }\n }\n }\n self.cellTree.tempSchema = Array(dataColumnLength)\n .fill()\n .map(function () {\n return { hidden: false };\n });\n if (invalidColumnTree) self.cellTree.columns = {};\n }\n self.cellTree.origin = {\n rows: self.cellTree.rows,\n columns: self.cellTree.columns,\n };\n };\n\n self.getDomRoot = function () {\n return self.shadowRoot ? self.shadowRoot.host : self.parentNode;\n };\n /**\n * Parses a CSS font shorthand (`[style] [variant] [weight] [stretch]\n * size[/line-height] family`) into the pieces the grid needs to rebuild a\n * scaled font string. Sizes in pt/em/rem/% are converted to px (#157).\n * @param {string} fontStyle A CSS font value such as `bold 14px Roboto, sans-serif`.\n * @returns {{prefix: string, height: number, name: string}}\n */\n self.parseFont = function (fontStyle) {\n var value = String(\n fontStyle === undefined || fontStyle === null ? '' : fontStyle,\n ).trim();\n var m = /(\\d*\\.?\\d+)(px|pt|em|rem|%)?(?:\\s*\\/\\s*[\\w.%]+)?\\s+(.+)$/.exec(\n value,\n );\n if (!m) {\n return {\n prefix: '',\n height: parseFloat(value) || 0,\n name: value.replace(/\\d+\\.?\\d*px/, '').trim(),\n };\n }\n var size = parseFloat(m[1]),\n unit = m[2] || 'px',\n height = size;\n if (unit === 'pt') {\n height = size * (4 / 3);\n } else if (unit === 'em' || unit === 'rem') {\n height = size * 16;\n } else if (unit === '%') {\n height = size * 0.16;\n }\n return {\n prefix: value.slice(0, m.index).trim(),\n height: height,\n name: m[3].trim(),\n };\n };\n self.getFontName = function (fontStyle) {\n return self.parseFont(fontStyle).name;\n };\n self.getFontHeight = function (fontStyle) {\n return self.parseFont(fontStyle).height;\n };\n /**\n * Builds the canvas font string for a `*Font` style key at the current\n * scale, keeping any style/weight prefix from the shorthand (#157).\n * @param {string} styleKey e.g. `cellFont`.\n * @returns {string}\n */\n self.getScaledFont = function (styleKey) {\n var prefix = self.style[styleKey + 'Prefix'];\n return (\n (prefix ? prefix + ' ' : '') +\n self.style[styleKey + 'Height'] * self.scale +\n 'px ' +\n self.style[styleKey + 'Name']\n );\n };\n self.parseStyleValue = function (key) {\n if (/Font/.test(key)) {\n var font = self.parseFont(self.style[key]);\n self.style[key + 'Height'] = font.height;\n self.style[key + 'Name'] = font.name;\n self.style[key + 'Prefix'] = font.prefix;\n return;\n }\n // when inheriting styles from already instantiated grids, don't parse already parsed values.\n if (\n key === 'moveOverlayBorderSegments' &&\n typeof self.style[key] === 'string'\n ) {\n self.style[key] = self.style[key].split(',').map(function (i) {\n return parseInt(i, 10);\n });\n }\n };\n self.initProp = function (propName) {\n if (!self.args[propName]) {\n return;\n }\n Object.keys(self.args[propName]).forEach(function (key) {\n self[propName][key] = self.args[propName][key];\n });\n };\n self.getStyleProperty = function (key) {\n if (self.styleKeys.indexOf(key) === -1) {\n return self.parentNodeStyle[key];\n }\n return self.style[key];\n };\n self.setStyleProperty = function (key, value, supressDrawAndEvent) {\n var isDim =\n [\n 'height',\n 'width',\n 'minHeight',\n 'minWidth',\n 'maxHeight',\n 'maxWidth',\n ].indexOf(key) !== -1;\n if (self.styleKeys.indexOf(key) === -1) {\n self.parentNodeStyle[key] = value;\n } else {\n if (/-/.test(key)) {\n key = self.dehyphenateProperty(key);\n }\n self.style[key] = value;\n self.parseStyleValue(key);\n }\n if (isDim) {\n self.resize();\n }\n if (!supressDrawAndEvent) {\n self.draw(true);\n self.dispatchEvent('stylechanged', { name: 'style', value: value });\n }\n };\n self.reloadStoredValues = function () {\n if (self.attributes.name && self.attributes.saveAppearance) {\n try {\n self.storedSettings = localStorage.getItem(\n self.storageName + '-' + self.attributes.name,\n );\n } catch (e) {\n console.warn('Error loading stored values. ' + e.message);\n self.storedSettings = undefined;\n }\n if (self.storedSettings) {\n try {\n self.storedSettings = JSON.parse(self.storedSettings);\n } catch (e) {\n console.warn('could not read settings from localStore', e);\n self.storedSettings = undefined;\n }\n }\n if (self.storedSettings) {\n if (\n typeof self.storedSettings.sizes === 'object' &&\n self.storedSettings.sizes !== null\n ) {\n self.sizes.rows = self.storedSettings.sizes.rows;\n self.sizes.columns = self.storedSettings.sizes.columns;\n ['trees', 'columns', 'rows'].forEach(function (i) {\n if (!self.sizes[i]) {\n self.sizes[i] = {};\n }\n });\n }\n if (typeof self.storedSettings.visibility === 'object') {\n self.getSchema().forEach(function (column) {\n if (\n self.storedSettings.visibility &&\n self.storedSettings.visibility[column.name] !== undefined\n ) {\n column.hidden = !self.storedSettings.visibility[column.name];\n }\n });\n }\n }\n }\n };\n self.init = function () {\n if (self.initialized) {\n return;\n }\n function addStyleKeyIfNoneExists(key) {\n if (self.styleKeys.indexOf(key) === -1) {\n self.styleKeys.push(key);\n }\n }\n var publicStyleKeyIntf = {};\n self.setAttributes();\n self.setStyle();\n self.initScrollBox();\n self.setDom();\n self.nodeType = 'canvas-datagrid';\n self.ie = /Trident/.test(window.navigator.userAgent);\n self.edge = /Edge/.test(window.navigator.userAgent);\n self.webKit = /WebKit/.test(window.navigator.userAgent);\n self.moz = /Gecko/.test(window.navigator.userAgent);\n self.mobile = /Mobile/i.test(window.navigator.userAgent);\n self.blankValues = [undefined, null, ''];\n self.cursorGrab = 'grab';\n self.cursorGrabing = 'grabbing';\n self.cursorGrab = self.webKit ? '-webkit-grab' : self.cursorGrab;\n self.cursorGrabing = self.moz ? '-webkit-grabbing' : self.cursorGrabbing;\n self.pointerLockPosition = { x: 0, y: 0 };\n Object.keys(self.style).forEach(self.parseStyleValue);\n self.intf.moveSelection = self.moveSelection;\n self.intf.deleteSelectedData = self.deleteSelectedData;\n self.intf.moveTo = self.moveTo;\n self.intf.addEventListener = self.addEventListener;\n self.intf.removeEventListener = self.removeEventListener;\n self.intf.dispatchEvent = self.dispatchEvent;\n /**\n * Releases grid resources and removes grid elements.\n * @memberof canvasDatagrid\n * @name dispose\n * @method\n */\n self.intf.dispose = self.dispose;\n /**\n * Appends the grid to another element later. Not implemented.\n * @memberof canvasDatagrid\n * @name appendTo\n * @method\n * @param {number} el The element to append the grid to.\n */\n self.intf.appendTo = self.appendTo;\n self.intf.getVisibleCellByIndex = self.getVisibleCellByIndex;\n self.intf.filters = self.filters;\n self.intf.sorters = self.sorters;\n self.intf.autosize = self.autosize;\n self.intf.beginEditAt = self.beginEditAt;\n self.intf.endEdit = self.endEdit;\n self.intf.setActiveCell = self.setActiveCell;\n self.intf.forEachSelectedCell = self.forEachSelectedCell;\n self.intf.scrollIntoView = self.scrollIntoView;\n self.intf.clearChangeLog = self.clearChangeLog;\n self.intf.gotoCell = self.gotoCell;\n self.intf.gotoRow = self.gotoRow;\n self.intf.addButton = self.addButton;\n self.intf.toggleCellCollapseTree = self.toggleCellCollapseTree;\n self.intf.expandCollapseCellTree = self.expandCollapseCellTree;\n self.intf.getHeaderByName = self.getHeaderByName;\n self.intf.getColumnWidth = self.getColumnWidth;\n self.intf.getRowHeight = self.getRowHeight;\n // internal: used by the web component connected/disconnected callbacks\n self.intf.observeResizeTargets = self.observeResizeTargets;\n self.intf.unobserveResizeTargets = self.unobserveResizeTargets;\n self.intf.findColumnScrollLeft = self.findColumnScrollLeft;\n self.intf.findRowScrollTop = self.findRowScrollTop;\n self.intf.fitColumnToValues = self.fitColumnToValues;\n self.intf.findColumnMaxTextLength = self.findColumnMaxTextLength;\n self.intf.disposeContextMenu = self.disposeContextMenu;\n self.intf.getCellAt = self.getCellAt;\n self.intf.groupColumns = self.groupColumns;\n self.intf.groupRows = self.groupRows;\n self.intf.removeGroupColumns = self.removeGroupColumns;\n self.intf.removeGroupRows = self.removeGroupRows;\n self.intf.toggleGroupColumns = self.toggleGroupColumns;\n self.intf.toggleGroupRows = self.toggleGroupRows;\n self.intf.getGroupsColumnBelongsTo = self.getGroupsColumnBelongsTo;\n self.intf.getGroupsRowBelongsTo = self.getGroupsRowBelongsTo;\n self.intf.isCellVisible = self.isCellVisible;\n self.intf.isRowVisible = self.isRowVisible;\n self.intf.isColumnVisible = self.isColumnVisible;\n self.intf.order = self.order;\n self.intf.draw = self.draw;\n self.intf.refresh = self.refresh;\n self.intf.isComponent = self.isComponent;\n self.intf.selectArea = self.selectArea;\n self.intf.clipElement = self.clipElement;\n self.intf.getSchemaFromData = self.getSchemaFromData;\n self.intf.setFilter = self.setFilter;\n self.intf.parentGrid = self.parentGrid;\n self.intf.toggleTree = self.toggleTree;\n self.intf.expandTree = self.expandTree;\n self.intf.collapseTree = self.collapseTree;\n self.intf.canvas = self.canvas;\n self.intf.context = self.ctx;\n self.intf.insertRow = self.insertRow;\n self.intf.deleteRow = self.deleteRow;\n self.intf.addRow = self.addRow;\n self.intf.insertColumn = self.insertColumn;\n self.intf.deleteColumn = self.deleteColumn;\n self.intf.addColumn = self.addColumn;\n self.intf.getClippingRect = self.getClippingRect;\n self.intf.setRowHeight = self.setRowHeight;\n self.intf.setColumnWidth = self.setColumnWidth;\n self.intf.resetColumnWidths = self.resetColumnWidths;\n self.intf.resetRowHeights = self.resetRowHeights;\n self.intf.resize = self.resize;\n self.intf.selectColumn = self.selectColumn;\n self.intf.selectRow = self.selectRow;\n self.intf.selectAll = self.selectAll;\n self.intf.selectNone = self.selectNone;\n self.intf.drawChildGrids = self.drawChildGrids;\n self.intf.assertPxColor = self.assertPxColor;\n self.intf.clearPxColorAssertions = self.clearPxColorAssertions;\n self.intf.integerToAlpha = self.integerToAlpha;\n self.intf.copy = self.copy;\n self.intf.cut = self.cut;\n self.intf.paste = self.paste;\n self.intf.setStyleProperty = self.setStyleProperty;\n self.intf.hideColumns = self.hideColumns;\n self.intf.unhideColumns = self.unhideColumns;\n self.intf.hideRows = self.hideRows;\n self.intf.unhideRows = self.unhideRows;\n Object.defineProperty(self.intf, 'defaults', {\n get: function () {\n return {\n styles: self.defaults.styles.reduce(function (a, i) {\n a[i[0]] = i[1];\n return a;\n }, {}),\n attributes: self.defaults.attributes.reduce(function (a, i) {\n a[i[0]] = i[1];\n return a;\n }, {}),\n };\n },\n });\n self.styleKeys = Object.keys(self.intf.defaults.styles);\n self.styleKeys\n .map(function (i) {\n return self.hyphenateProperty(i, false);\n })\n .forEach(addStyleKeyIfNoneExists);\n self.styleKeys\n .map(function (i) {\n return self.hyphenateProperty(i, true);\n })\n .forEach(addStyleKeyIfNoneExists);\n self.DOMStyles = window.getComputedStyle(document.body, null);\n self.styleKeys.concat(Object.keys(self.DOMStyles)).forEach(function (key) {\n // unless this line is here, Object.keys() will not work on <instance>.style\n publicStyleKeyIntf[key] = undefined;\n Object.defineProperty(publicStyleKeyIntf, key, {\n get: function () {\n return self.getStyleProperty(key);\n },\n set: function (value) {\n if (self.initialized) {\n self.appliedInlineStyles[key] = value;\n }\n self.setStyleProperty(key, value);\n },\n });\n });\n Object.defineProperty(self.intf, 'shadowRoot', {\n get: function () {\n return self.shadowRoot;\n },\n });\n Object.defineProperty(self.intf, 'activeCell', {\n get: function () {\n return self.activeCell;\n },\n });\n Object.defineProperty(self.intf, 'hasFocus', {\n get: function () {\n return self.hasFocus;\n },\n });\n Object.defineProperty(self.intf, 'hasActiveFilters', {\n get: function () {\n return self.hasActiveFilters();\n },\n });\n Object.defineProperty(self.intf, 'style', {\n get: function () {\n return publicStyleKeyIntf;\n },\n set: function (valueObject) {\n Object.keys(valueObject).forEach(function (key) {\n self.setStyleProperty(key, valueObject[key], true);\n });\n self.draw(true);\n self.dispatchEvent('stylechanged', {\n name: 'style',\n value: valueObject,\n });\n },\n });\n Object.defineProperty(self.intf, 'attributes', { value: {} });\n Object.keys(self.attributes).forEach(function (key) {\n Object.defineProperty(self.intf.attributes, key, {\n get: function () {\n return self.attributes[key];\n },\n set: function (value) {\n self.attributes[key] = value;\n if (key === 'name') {\n self.tryLoadStoredSettings();\n }\n if (\n key === 'rowTree' ||\n key === 'columnTree' ||\n key === 'columnTreeRowEndIndex'\n ) {\n self.initCellTreeSettings();\n }\n if (key === 'fillLastColumn') {\n self.resize(true);\n } else {\n self.draw(true);\n }\n self.dispatchEvent('attributechanged', {\n name: key,\n value: value[key],\n });\n },\n });\n });\n self.filters.string = function (value, filterFor) {\n if (filterFor === self.attributes.blanksText) {\n return self.blankValues.includes(\n value == null ? value : String(value).trim(),\n );\n }\n\n value = String(value);\n var filterRegExp,\n regEnd = /\\/(i|g|m)*$/,\n pattern = regEnd.exec(filterFor),\n flags = pattern ? pattern[0].substring(1) : '',\n flagLength = flags.length;\n self.invalidFilterRegEx = undefined;\n if (filterFor.substring(0, 1) === '/' && pattern) {\n try {\n filterRegExp = new RegExp(\n filterFor.substring(1, filterFor.length - (flagLength + 1)),\n flags,\n );\n } catch (e) {\n self.invalidFilterRegEx = e;\n return;\n }\n return filterRegExp.test(value);\n }\n return value.toString\n ? value\n .toString()\n .toLocaleUpperCase()\n .indexOf(filterFor.toLocaleUpperCase()) !== -1\n : false;\n };\n self.filters.number = function (value, filterFor) {\n if (filterFor === self.attributes.blanksText) {\n return self.blankValues.includes(\n value == null ? value : String(value).trim(),\n );\n }\n\n if (!filterFor) {\n return true;\n }\n if (value === filterFor) {\n return true;\n }\n // the filter text always arrives as a string; compare numerically\n // when both sides parse as numbers (#431)\n const numericValue = Number(value);\n const numericFilter = Number(filterFor);\n if (!Number.isNaN(numericValue) && !Number.isNaN(numericFilter)) {\n return numericValue === numericFilter;\n }\n return String(value) === String(filterFor);\n };\n ['formatters', 'filters', 'sorters'].forEach(self.initProp);\n self.applyComponentStyle(false, self.intf);\n self.reloadStoredValues();\n if (self.args.treeGridAttributes) {\n self.treeGridAttributes = self.args.treeGridAttributes;\n }\n if (self.args.cellGridAttributes) {\n self.cellGridAttributes = self.args.cellGridAttributes;\n }\n if (self.args.data) {\n self.intf.data = self.args.data;\n }\n if (self.intf.innerText || self.intf.textContent) {\n if (self.intf.dataType === 'application/x-canvas-datagrid') {\n self.intf.dataType = 'application/json+x-canvas-datagrid';\n }\n self.intf.data = self.intf.innerText || self.intf.textContent;\n }\n if (self.args.schema) {\n self.intf.schema = self.args.schema;\n }\n if (self.isChildGrid || !self.isComponent) {\n requestAnimationFrame(function () {\n self.resize(true);\n });\n } else {\n self.resize(true);\n }\n self.initialized = true;\n return self;\n };\n /**\n * Removes focus from the grid.\n * @memberof canvasDatagrid\n * @name blur\n * @method\n */\n self.intf.blur = function (e) {\n self.hasFocus = false;\n };\n /**\n * Focuses on the grid.\n * @memberof canvasDatagrid\n * @name focus\n * @method\n */\n self.intf.focus = function () {\n self.hasFocus = true;\n self.controlInput.focus();\n };\n if (self.shadowRoot || self.isChildGrid) {\n Object.defineProperty(self.intf, 'height', {\n get: function () {\n if (self.shadowRoot) {\n return self.shadowRoot.height;\n }\n return self.parentNode.height;\n },\n set: function (value) {\n if (self.shadowRoot) {\n self.shadowRoot.height = value;\n } else {\n self.parentNode.height = value;\n }\n self.resize(true);\n },\n });\n Object.defineProperty(self.intf, 'width', {\n get: function () {\n if (self.shadowRoot) {\n return self.shadowRoot.width;\n }\n return self.parentNode.width;\n },\n set: function (value) {\n if (self.shadowRoot) {\n self.shadowRoot.width = value;\n } else {\n self.parentNode.width = value;\n }\n self.resize(true);\n },\n });\n Object.defineProperty(self.intf, 'parentNode', {\n get: function () {\n return self.parentNode;\n },\n set: function (value) {\n if (!self.isChildGrid) {\n throw new TypeError(\n 'Cannot set property parentNode which has only a getter',\n );\n }\n self.parentNode = value;\n },\n });\n }\n Object.defineProperty(self.intf, 'visibleRowHeights', {\n get: function () {\n return self.visibleRowHeights;\n },\n });\n Object.defineProperty(self.intf, 'openChildren', {\n get: function () {\n return self.openChildren;\n },\n });\n Object.defineProperty(self.intf, 'childGrids', {\n get: function () {\n return Object.keys(self.childGrids).map(function (gridId) {\n return self.childGrids[gridId];\n });\n },\n });\n Object.defineProperty(self.intf, 'isChildGrid', {\n get: function () {\n return self.isChildGrid;\n },\n });\n Object.defineProperty(self, 'cursor', {\n get: function () {\n return self.parentNodeStyle.cursor;\n },\n set: function (value) {\n if (value === 'cell') {\n value = 'default';\n }\n if (self.currentCursor !== value) {\n self.parentNodeStyle.cursor = value;\n self.currentCursor = value;\n }\n },\n });\n Object.defineProperty(self.intf, 'orderDirection', {\n get: function () {\n return self.orderDirection;\n },\n set: function (value) {\n if (value !== 'desc') {\n value = 'asc';\n }\n self.orderDirection = value;\n self.order(self.orderBy, self.orderDirection);\n },\n });\n Object.defineProperty(self.intf, 'orderBy', {\n get: function () {\n return self.orderBy;\n },\n set: function (value) {\n if (\n self.getSchema().find(function (col) {\n return col.name === value;\n }) === undefined\n ) {\n throw new Error('Cannot sort by unknown column name.');\n }\n self.orderBy = value;\n self.order(self.orderBy, self.orderDirection);\n },\n });\n if (self.isComponent) {\n Object.defineProperty(self.intf, 'offsetHeight', {\n get: function () {\n return self.canvas.offsetHeight;\n },\n });\n Object.defineProperty(self.intf, 'offsetWidth', {\n get: function () {\n return self.canvas.offsetWidth;\n },\n });\n }\n Object.defineProperty(self.intf, 'scrollHeight', {\n get: function () {\n return self.scrollBox.scrollHeight;\n },\n });\n Object.defineProperty(self.intf, 'scrollWidth', {\n get: function () {\n return self.scrollBox.scrollWidth;\n },\n });\n Object.defineProperty(self.intf, 'scrollTop', {\n get: function () {\n return self.scrollBox.scrollTop;\n },\n set: function (value) {\n self.scrollBox.scrollTop = value;\n },\n });\n Object.defineProperty(self.intf, 'scrollLeft', {\n get: function () {\n return self.scrollBox.scrollLeft;\n },\n set: function (value) {\n self.scrollBox.scrollLeft = value;\n },\n });\n Object.defineProperty(self.intf, 'sizes', {\n get: function () {\n return self.sizes;\n },\n });\n Object.defineProperty(self.intf, 'parentDOMNode', {\n get: function () {\n return self.parentDOMNode;\n },\n });\n Object.defineProperty(self.intf, 'input', {\n get: function () {\n return self.input;\n },\n });\n Object.defineProperty(self.intf, 'controlInput', {\n get: function () {\n return self.controlInput;\n },\n });\n Object.defineProperty(self.intf, 'currentCell', {\n get: function () {\n return self.currentCell;\n },\n });\n Object.defineProperty(self.intf, 'visibleCells', {\n get: function () {\n return self.visibleCells;\n },\n });\n Object.defineProperty(self.intf, 'visibleRows', {\n get: function () {\n return self.visibleRows;\n },\n });\n let warnedForObsoleteSelections;\n Object.defineProperty(self.intf, 'selections', {\n get: function () {\n if (!warnedForObsoleteSelections) {\n console.warn(\n `DeprecationWarning: The property 'selections' is deprecated due to performance issue. ` +\n `And it will be removed in the future.` +\n `Please use new property 'selectionList' instead. ` +\n `Visit this link to get more information: ` +\n `https://github.com/TonyGermaneri/canvas-datagrid/pull/498`,\n );\n warnedForObsoleteSelections = true;\n }\n return self.getObsoleteSelectionMatrix();\n },\n });\n Object.defineProperty(self.intf, 'selectionList', {\n get: function () {\n return self.selections;\n },\n });\n Object.defineProperty(self.intf, 'dragMode', {\n get: function () {\n return self.dragMode;\n },\n });\n Object.defineProperty(self.intf, 'changes', {\n get: function () {\n return self.changes;\n },\n });\n self.intf.formatters = self.formatters;\n Object.defineProperty(self.intf, 'dataType', {\n get: function () {\n return self.dataType;\n },\n set: function (value) {\n if (!self.parsers[value]) {\n throw new Error('No parser for MIME type ' + value);\n }\n self.dataType = value;\n },\n });\n self.eventNames.forEach(function (eventName) {\n Object.defineProperty(self.intf, 'on' + eventName, {\n get: function () {\n return self.componentL1Events[eventName];\n },\n set: function (value) {\n self.events[eventName] = [];\n self.componentL1Events[eventName] = value;\n if (!value) {\n return;\n }\n self.addEventListener(eventName, value);\n },\n });\n });\n Object.defineProperty(self.intf, 'frozenRow', {\n get: function () {\n return self.frozenRow;\n },\n set: function (val) {\n if (isNaN(val)) {\n throw new TypeError('Expected value for frozenRow to be a number.');\n }\n if (self.visibleRows.length < val) {\n throw new RangeError(\n 'Cannot set a value larger than the number of visible rows.',\n );\n }\n self.frozenRow = val;\n },\n });\n Object.defineProperty(self.intf, 'frozenColumn', {\n get: function () {\n return self.frozenColumn;\n },\n set: function (val) {\n if (isNaN(val)) {\n throw new TypeError('Expected value for frozenRow to be a number.');\n }\n if (self.getVisibleSchema().length < val) {\n throw new RangeError(\n 'Cannot set a value larger than the number of visible columns.',\n );\n }\n self.frozenColumn = val;\n },\n });\n Object.defineProperty(self.intf, 'scrollIndexRect', {\n get: function () {\n return {\n top: self.scrollIndexTop,\n right: self.scrollIndexRight,\n bottom: self.scrollIndexBottom,\n left: self.scrollIndexLeft,\n };\n },\n });\n Object.defineProperty(self.intf, 'scrollPixelRect', {\n get: function () {\n return {\n top: self.scrollPixelTop,\n right: self.scrollPixelRight,\n bottom: self.scrollPixelBottom,\n left: self.scrollPixelLeft,\n };\n },\n });\n Object.defineProperty(self.intf, 'rowOrder', {\n get: function () {\n return self.orders.rows;\n },\n set: function (val) {\n if (!Array.isArray(val)) {\n throw new TypeError('Value must be an array.');\n }\n if (!self.originalData || val.length < self.originalData.length) {\n throw new RangeError(\n 'Array length must be equal to or greater than number of rows.',\n );\n }\n self.orders.rows = val;\n },\n });\n Object.defineProperty(self.intf, 'columnOrder', {\n get: function () {\n return self.orders.columns;\n },\n set: function (val) {\n if (!Array.isArray(val)) {\n throw new TypeError('Value must be an array.');\n }\n if (val.length < self.getSchema().length) {\n throw new RangeError(\n 'Array length must be equal to or greater than number of columns.',\n );\n }\n self.orders.columns = val;\n // redraw with the new order (#160)\n if (self.canvas) {\n self.resize(true);\n }\n },\n });\n Object.defineProperty(self.intf, 'selectionBounds', {\n get: function () {\n return self.getSelectionBounds();\n },\n });\n Object.defineProperty(self.intf, 'selectedRows', {\n get: function () {\n return self.getSelectedData(true);\n },\n });\n Object.defineProperty(self.intf, 'selectedCells', {\n get: function () {\n return self.getSelectedData();\n },\n });\n Object.defineProperty(self.intf, 'visibleSchema', {\n get: function () {\n return self.getVisibleSchema().map(function eachDataRow(col) {\n return col;\n });\n },\n });\n Object.defineProperty(self.intf, 'treeGridAttributes', {\n get: function () {\n return self.treeGridAttributes;\n },\n set: function setTreeGridAttributes(value) {\n self.treeGridAttributes = value;\n },\n });\n Object.defineProperty(self.intf, 'cellGridAttributes', {\n get: function () {\n return self.cellGridAttributes;\n },\n set: function setCellGridAttributes(value) {\n self.cellGridAttributes = value;\n },\n });\n Object.defineProperty(self.intf, 'fillCellCallback', {\n get: function () {\n return self.fillCellCallback;\n },\n set: function setFillCellCallback(value) {\n self.fillCellCallback = value;\n },\n });\n Object.defineProperty(self.intf, 'ctx', {\n get: function () {\n return self.ctx;\n },\n });\n Object.defineProperty(self.intf, 'schema', {\n get: function schemaGetter() {\n return self.getSchema();\n },\n set: function schemaSetter(value) {\n if (value === undefined) {\n // Issue #89 - allow schema to be set to initialized state\n self.schema = undefined;\n self.tempSchema = undefined;\n self.dispatchEvent('schemachanged', { schema: undefined });\n return;\n }\n if (!Array.isArray(value) || typeof value[0] !== 'object') {\n throw new Error('Schema must be an array of objects.');\n }\n if (value[0].name === undefined) {\n throw new Error(\n 'Expected schema to contain an object with at least a name property.',\n );\n }\n self.schema = value.map(function eachSchemaColumn(column, index) {\n column.width = column.width || self.style.cellWidth;\n column.filter = column.filter || self.filter(column.type);\n column.type = column.type || 'string';\n column.index = index;\n column.columnIndex = index;\n column.rowIndex = -1;\n return column;\n });\n self.tempSchema = undefined;\n self.createNewRowData();\n self.createColumnOrders();\n self.tryLoadStoredSettings();\n if (\n self.storedSettings &&\n typeof self.storedSettings.visibility === 'object'\n ) {\n self.schema.forEach(function hideEachSchemaColumn(column, index) {\n if (\n self.storedSettings &&\n self.storedSettings.visibility[column.name] !== undefined\n ) {\n column.hidden = !self.storedSettings.visibility[column.name];\n }\n });\n }\n self.resize(true);\n self.dispatchEvent('schemachanged', { schema: self.schema });\n },\n });\n /**\n * Gets an array of currently registered MIME types.\n * @memberof canvasDatagrid\n * @name getDataTypes\n * @method\n */\n self.intf.getTypes = function () {\n return Object.keys(self.parsers);\n };\n self.parseInnerHtml = function (data) {\n if (!data || /^ +$/.test(data)) {\n return [];\n }\n try {\n data = JSON.parse(data);\n } catch (e) {\n console.warn(\n Error(\n 'Cannot parse application/json+x-canvas-datagrid formated data. ' +\n e.message +\n ' \\nNote: canvas-datagrid.innerHTML is for string data only. ' +\n 'Use the canvas-datagrid.data property to set object data.',\n ),\n );\n }\n return data;\n };\n self.parsers['application/json+x-canvas-datagrid'] = function (\n data,\n callback,\n ) {\n self.parsers['application/x-canvas-datagrid'](\n self.parseInnerHtml(data),\n function (data, schema) {\n return callback(data, schema);\n },\n );\n };\n self.parsers['application/x-canvas-datagrid'] = function (data, callback) {\n return callback(data);\n };\n self.intf.parsers = self.parsers;\n // send to dataType ETL function to extract from input data\n // and transform into native [{}, {}] format\n self.etl = function (data, callback) {\n if (!self.intf.parsers[self.dataType]) {\n throw new Error('Unsupported data type.');\n }\n self.intf.parsers[self.dataType](data, function (data, schema) {\n // set the unfiltered/sorted data array\n self.originalData = data;\n self.viewData = Array.from(self.originalData);\n\n if (Array.isArray(schema)) {\n self.schema = schema;\n }\n // Issue #89 - allow schema to be auto-created every time data is set\n if (self.attributes.autoGenerateSchema) {\n self.schema = self.getSchemaFromData(data);\n }\n if (!self.schema) {\n self.tempSchema = self.getSchemaFromData(data);\n }\n if (self.getSchema()) {\n // keep a user's column order when the schema still fits (#116);\n // auto-generated schemas are re-ordered below\n var columnCount = self.getSchema().length;\n if (\n !self.orders.columns ||\n self.orders.columns.length !== columnCount\n ) {\n self.createColumnOrders();\n }\n }\n // apply filter, sort, etc to incoming dataset, set viewData:\n self.refresh();\n // empty data was set\n if (!self.schema && (self.originalData || []).length === 0) {\n self.tempSchema = [{ name: '' }];\n }\n self.fitColumnToValues('cornerCell', true);\n if (\n (self.tempSchema && !self.schema) ||\n self.attributes.autoGenerateSchema\n ) {\n self.createColumnOrders();\n self.dispatchEvent('schemachanged', { schema: self.tempSchema });\n }\n callback();\n });\n };\n Object.defineProperty(self.intf, 'viewData', {\n get: function () {\n return self.viewData;\n },\n });\n Object.defineProperty(self.intf, 'boundData', {\n get: function () {\n return self.originalData;\n },\n });\n Object.defineProperty(self.intf, 'data', {\n get: function dataGetter() {\n return self.originalData;\n },\n set: function dataSetter(value) {\n self.etl(value, function () {\n self.changes = [];\n self.createNewRowData();\n if (\n self.attributes.autoResizeColumns &&\n self.originalData.length > 0 &&\n self.storedSettings === undefined\n ) {\n self.autosize();\n }\n // set the header column to fit the numbers in it\n self.fitColumnToValues('cornerCell', true);\n self.createRowOrders();\n self.tryLoadStoredSettings();\n self.dispatchDataChanged('data');\n self.initCellTreeSettings();\n self.resize(true);\n });\n },\n });\n self.initScrollBox = function () {\n var sHeight = 0,\n sWidth = 0,\n scrollTop = 0,\n scrollLeft = 0,\n scrollHeight = 0,\n scrollWidth = 0,\n scrollBoxHeight = 20,\n scrollBoxWidth = 20;\n function setScrollTop(value, preventScrollEvent) {\n if (isNaN(value)) {\n throw new Error('ScrollTop value must be a number');\n }\n if (value < 0) {\n value = 0;\n }\n if (value > scrollHeight) {\n value = scrollHeight;\n }\n if (scrollHeight < 0) {\n value = 0;\n }\n scrollTop = value;\n if (!preventScrollEvent) {\n self.scroll();\n }\n if (self.button) {\n self.moveButtonPos();\n }\n }\n function setScrollLeft(value, preventScrollEvent) {\n if (isNaN(value)) {\n throw new Error('ScrollLeft value must be a number');\n }\n if (value < 0) {\n value = 0;\n }\n if (value > scrollWidth) {\n value = scrollWidth;\n }\n if (scrollWidth < 0) {\n value = 0;\n }\n scrollLeft = value;\n if (!preventScrollEvent) {\n self.scroll();\n }\n if (self.button) {\n self.moveButtonPos();\n }\n }\n self.scrollBox.toString = function () {\n return (\n '{\"width\": ' +\n scrollWidth.toFixed(2) +\n ', \"height\": ' +\n scrollHeight.toFixed(2) +\n ', \"left\": ' +\n scrollLeft.toFixed(2) +\n ', \"top\": ' +\n scrollTop.toFixed(2) +\n ', \"widthRatio\": ' +\n self.scrollBox.widthBoxRatio.toFixed(5) +\n ', \"heightRatio\": ' +\n self.scrollBox.heightBoxRatio.toFixed(5) +\n '}'\n );\n };\n self.scrollBox.scrollTo = function (x, y, supressDrawEvent) {\n setScrollLeft(x, true);\n setScrollTop(y, supressDrawEvent);\n };\n Object.defineProperty(self.scrollBox, 'scrollBoxHeight', {\n get: function () {\n return scrollBoxHeight;\n },\n set: function (value) {\n scrollBoxHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollBoxWidth', {\n get: function () {\n return scrollBoxWidth;\n },\n set: function (value) {\n scrollBoxWidth = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'height', {\n get: function () {\n return sHeight;\n },\n set: function (value) {\n sHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'width', {\n get: function () {\n return sWidth;\n },\n set: function (value) {\n sWidth = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollTop', {\n get: function () {\n return scrollTop;\n },\n set: setScrollTop,\n });\n Object.defineProperty(self.scrollBox, 'scrollLeft', {\n get: function () {\n return scrollLeft;\n },\n set: setScrollLeft,\n });\n Object.defineProperty(self.scrollBox, 'scrollHeight', {\n get: function () {\n return scrollHeight;\n },\n set: function (value) {\n if (scrollTop > value) {\n scrollTop = Math.max(value, 0);\n }\n scrollHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollWidth', {\n get: function () {\n return scrollWidth;\n },\n set: function (value) {\n if (scrollLeft > value) {\n scrollLeft = Math.max(value, 0);\n }\n scrollWidth = value;\n },\n });\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false, Event: false*/\n/// <reference path=\"./type.d.ts\" />\n'use strict';\n\nimport { createHTMLString, createTextString } from '../events/util';\nimport {\n addIntoSelections,\n areSelectionsComplex,\n areSelectionsNeat,\n cleanupSelections,\n cloneSelections,\n getSelectedContiguousColumns,\n getSelectedContiguousRows,\n getSelectionBounds,\n getSelectionStateFromCells,\n isCellSelected,\n isColumnSelected,\n isRowSelected,\n moveSelections,\n normalizeSelection,\n removeFromSelections,\n SelectionType,\n shrinkOrExpandSelections,\n} from './util';\n\n/**\n * Before reading the code of this module, you must know these things:\n *\n * You may see words like \"obsolete\", \"old API\", \"compatibility\" in the code later.\n * Because this grid component has used a different selection mechanism in the past.\n *\n * The old mechanism use a 2D array to represent the selection state.\n * For example: `[undefined x 10, [0, 5]]` indicates\n * there are two cells are selected in current grid. they are located in row 11.\n * and one in column 1, another in column 6.\n * And `[undefined x 5, [-1, 0,1,2,3,4,5,6...], undefined x 2, [1]]` indicates\n * the row 6 is selected and the cell that located in row 9 column 2 is selected.\n *\n * But this implementation has performance issue when the grid is shipping a large dataset.\n * You can just imagine about what will happen when you select all cells in a grid with 1 million rows.\n *\n * So we create a new way to implement the selection.\n * In this way, we use a selection list to represent the selection state.\n * Each element in this selection list is a selection descriptor.\n * Each descriptor represents an area whose selected or unselected by the user.\n * And we have four types for the descriptor: UnselectedCells, Cells, Rows and Columns\n *\n * Because the old selection mechanism has been in used for a long time and\n * we have many public APIs about it.\n * We still need to keep these APIs working in the 0.x versions in the future.\n * So we create some functions to make sure these APIs and context objects work like previous version.\n * This is the reason why you may see there are some functions in this file\n * be marked \"for compatibility\" without best practice.\n */\nexport default function (self) {\n /**\n * Here are explanation for the item of this array:\n *\n * The type of properties about the row in it is viewRowIndex (startRow, endRow).\n * Here is an example of accessing the row data from the selection object:\n * `const rowData = originalData[self.getBoundRowIndexFromViewRowIndex(selection.startRow)]`\n *\n * The type of properties about the column in it is columnOrderIndex (startColumn, endColumn)\n * Here is an example of accessing thr column schema from the selection object:\n * `const columnSchema = schema[self.orders.columns[selection.startColumn]]`\n * @type {SelectionDescriptor[]}\n */\n self.selections = [];\n\n /**\n * TODO support the cache\n */\n self.selectionCache = [];\n self.selectionCacheWidth = 0;\n self.selectionCacheHeight = 0;\n\n /**\n * This method is used for adapting old API and it has performance issue for the large data set.\n * We should keep this function and its related functions until version 1.x,\n * because this action can cause incompatible API changes <https://semver.org/>\n *\n * Generate a selection 2 dimensional array from the selection list.\n * Each row in this 2D array is a number array that indicates which columns are selected in this row.\n * And -1 in the result means entire cells are selected in particular row/column\n *\n * @param {object[]} [otherSelections] The function create a 2d array based on this selection list\n * if this parameter is provided. Otherwise, this function uses self.selections as the list input.\n * @returns {number[][]}\n */\n self.getObsoleteSelectionMatrix = (otherSelections) => {\n const bounds = self.getSelectionBounds(true, otherSelections);\n if (!bounds) return [];\n const { top, bottom, left, right } = bounds;\n const height = bottom - top + 1;\n const width = right - left + 1;\n const states = getSelectionStateFromCells(self.selections, {\n startRow: top,\n endRow: bottom,\n startColumn: left,\n endColumn: right,\n });\n if (states === false) return [];\n\n const result = [];\n for (let row = top, row2 = top + height; row < row2; row++) {\n if (states === true) {\n result[row] = new Array(width).fill(0).map((_, i) => left + i);\n continue;\n }\n\n const rowState = states[row - top];\n if (!rowState) continue;\n result[row] = [];\n for (let col = left, col2 = left + width; col < col2; col++) {\n if (rowState !== true && !rowState[col - left]) continue;\n result[row].push(col);\n }\n }\n for (let i = 0; i < self.selections.length; i++) {\n const selection = self.selections[i];\n if (selection.type !== SelectionType.Rows) continue;\n for (let row = selection.startRow; row <= selection.endRow; row++) {\n if (!result[row]) {\n result[row] = [-1];\n continue;\n }\n if (result[row][0] === -1) continue;\n result[row].unshift(-1);\n }\n }\n return result;\n };\n\n /**\n * Return a tuple if the user selected contiguous columns, otherwise `null`.\n * Info: Because the user may reorder the columns,\n * the schemaIndex of the first item may be greater than the schemaIndex of the second item,\n * but the columnIndex of the firs item must less than the columnIndex of the second item.\n * @param {object[]} [schema] from `self.getSchema()`\n * @returns {object[]} column schemas tuple (each schema has an additional field `schemaIndex`)\n */\n self.getSelectedContiguousColumns = function (schema) {\n if (!schema) schema = self.getSchema();\n const columnOrderIndexes = getSelectedContiguousColumns(\n self.selections,\n false,\n );\n if (!Array.isArray(columnOrderIndexes)) return;\n\n /** @type {number[]} orders[index] => columnIndex */\n const orders = self.orders.columns;\n return columnOrderIndexes.map((orderIndex) => {\n const schemaIndex = orders[orderIndex];\n const columnSchema = schema[schemaIndex];\n return Object.assign({}, columnSchema, { orderIndex });\n });\n };\n\n /**\n * @param {boolean} [allowOnlyOneRow]\n * @returns {number[]} a viewRowIndex tuple. It can contains one row index or two row indexes.\n */\n self.getSelectedContiguousRows = function (allowOnlyOneRow) {\n const viewRowIndexes = getSelectedContiguousRows(self.selections, false);\n if (!Array.isArray(viewRowIndexes)) return;\n if (!allowOnlyOneRow && viewRowIndexes[0] === viewRowIndexes[1]) return;\n return viewRowIndexes;\n };\n\n /**\n * Check if current selection are copyable for the system clipbaord\n * @returns {boolean}\n */\n self.canSelectionsBeCopied = function () {\n return self.selections.length > 0 && !areSelectionsComplex(self.selections);\n };\n\n /**\n * Return the height of the selection area.\n * This function is used for rendering the overlay for the dnd(drag and drop)\n * @returns {number} The height of the selection area\n */\n self.getSelectedRowsHeight = function () {\n const selected = getSelectedContiguousRows(self.selections, true);\n if (!selected) return 0;\n let height = 0;\n for (let row = selected[0]; row <= selected[1]; row++)\n height += self.getRowHeight(row);\n return height;\n };\n\n /**\n * Return the width of the selection area.\n * This function is used for rendering the overlay for the dnd(drag and drop)\n * @returns {number} The width of the selection area\n */\n self.getSelectedColumnsWidth = function () {\n const selected = getSelectedContiguousColumns(self.selections, true);\n if (!selected) return 0;\n let width = 0;\n for (let col = selected[0]; col <= selected[1]; col++)\n width += self.getColumnWidth(self.orders.columns[col]);\n return width;\n };\n\n /**\n * @param {object} cell This method needs two properties in this parameter: `rowIndex`\n * and `viewColumnIndex`\n */\n self.isCellSelected = (cell) => {\n return isCellSelected(self.selections, cell.rowIndex, cell.viewColumnIndex);\n };\n\n /**\n * Returns true if the selected columnIndex is selected on every row.\n * @memberof canvasDatagrid\n * @name isColumnSelected\n * @method\n * @param {number} columnIndex The column index to check.\n */\n self.isColumnSelected = (viewColumnIndex) => {\n if (typeof viewColumnIndex !== 'number') return false;\n return isColumnSelected(self.selections, viewColumnIndex);\n };\n\n /**\n * Returns true if the selected rowIndex is selected on every column.\n * @memberof canvasDatagrid\n * @name isRowSelected\n * @method\n * @param {number} rowIndex The row index to check.\n */\n self.isRowSelected = (rowIndex) => {\n if (typeof rowIndex !== 'number') return false;\n return isRowSelected(self.selections, rowIndex);\n };\n\n /**\n * Removes the selection.\n * @param {boolean} triggerEvent true for trigger a event\n */\n self.clearSelections = (triggerEvent) => {\n self.selections = [];\n if (triggerEvent) self.dispatchSelectionChangedEvent();\n };\n\n /**\n * Removes the selection.\n * @memberof canvasDatagrid\n * @name selectNone\n * @param {boolean} dontDraw Suppress the draw method after the selection change.\n * @method\n */\n self.selectNone = (dontDraw) => {\n self.clearSelections(true);\n if (dontDraw) return;\n self.draw();\n };\n\n /**\n * Selects every visible cell.\n * @memberof canvasDatagrid\n * @name selectAll\n * @param {boolean} dontDraw Suppress the draw method after the selection change.\n * @method\n */\n self.selectAll = function (dontDraw) {\n const changed = addIntoSelections(self.selections, {\n type: SelectionType.Columns,\n startColumn: 0,\n endColumn: self.getSchema().length - 1,\n });\n if (!changed || dontDraw) return;\n self.draw();\n };\n\n /**\n * @param {object} cell This method needs two properties in this parameter: `rowIndex`\n * and `viewColumnIndex`\n * @param {boolean} [suppressEvent]\n */\n self.unselectCell = (cell, suppressEvent) => {\n const result = removeFromSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Cells,\n startRow: cell.rowIndex,\n startColumn: cell.viewColumnIndex,\n }),\n );\n if (result && !suppressEvent) self.dispatchSelectionChangedEvent();\n return result;\n };\n\n /**\n * @param {number} startRow rowViewIndex\n * @param {number} endRow rowViewIndex\n * @param {boolean} suppressEvent When true, prevents the `selectionchanged` event from firing.\n * @returns {boolean} It returns whether the selection changed\n */\n self.unselectRows = (startRow, endRow, suppressEvent) => {\n const result = removeFromSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Rows,\n startRow: startRow,\n endRow: endRow,\n }),\n );\n if (result && !suppressEvent) self.dispatchSelectionChangedEvent();\n return result;\n };\n\n /**\n * @param {object} cell This method needs two properties in this parameter: `rowIndex`\n * and `viewColumnIndex`\n * @param {boolean} [suppressEvent]\n */\n self.selectCell = (cell, suppressEvent) => {\n const result = addIntoSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Cells,\n startRow: cell.rowIndex,\n startColumn: cell.viewColumnIndex,\n }),\n );\n if (result && !suppressEvent) self.dispatchSelectionChangedEvent();\n return result;\n };\n\n /**\n * Moves the current selection relative to the its current position. Note: this method does not move the selected data, just the selection itself.\n * @memberof canvasDatagrid\n * @name moveSelection\n * @method\n * @param {number} offsetX The number of columns to offset the selection.\n * @param {number} offsetY The number of rows to offset the selection.\n */\n self.moveSelection = function (offsetX, offsetY) {\n moveSelections(self.selections, offsetX, offsetY);\n };\n\n /**\n * Dispatch a event named `selectionchanged` with context info\n */\n self.dispatchSelectionChangedEvent = () => {\n self.dispatchEvent('selectionchanged', self.getContextOfSelectionEvent());\n };\n\n /**\n * Return the event context for event `selectionchanged`\n * @returns {object} the context for the event\n */\n self.getContextOfSelectionEvent = () => {\n const context = { selectionList: self.cloneSelections() };\n //#region for API compatibility\n Object.defineProperty(context, 'selections', {\n get: function () {\n return self.getObsoleteSelectionMatrix();\n },\n });\n Object.defineProperty(context, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n Object.defineProperty(context, 'selectedCells', {\n get: function () {\n return self.getSelectedCells();\n },\n });\n Object.defineProperty(context, 'selectionBounds', {\n get: function () {\n return self.getSelectionBounds();\n },\n });\n //#endregion for API compatibility\n return context;\n };\n\n /**\n * Return a cloned selection list from current selection list\n * @returns {object[]} A cloned selection list\n */\n self.cloneSelections = () => {\n return cloneSelections(self.selections);\n };\n\n /**\n * Gets the bounds of current selection.\n * @param {boolean} [sanitized] sanitize the bound object if the value of thie paramater is `true`\n * @memberof canvasDatagrid\n * @name getSelectionBounds\n * @method\n * @returns {rect} two situations:\n * 1. The result is always a bound object if `sanitized` is not `true`.\n * And the result is `{top: Infinity, left: Infinity, bottom: -Infinity, right: -Infinity}` if there haven't selections.\n * This is used for keeping compatibility with existing APIs.\n * 2. When the parameter `sanitized` is true. The result will be null if there haven't selections.\n */\n self.getSelectionBounds = (sanitized, otherSelections) => {\n const bounds = getSelectionBounds(otherSelections || self.selections);\n if (sanitized) {\n // nothing is selected\n if (bounds.top > bounds.bottom || bounds.left > bounds.right) return null;\n self.sanitizeSelectionBounds(bounds);\n }\n return bounds;\n };\n self.sanitizeSelectionBounds = (bounds) => {\n if (!bounds) return bounds;\n if (bounds.top < 0) bounds.top = 0;\n if (bounds.left < 0) bounds.left = 0;\n\n const viewDataLength = self.viewData.length;\n if (bounds.bottom > viewDataLength) bounds.bottom = viewDataLength - 1;\n\n const schemaLength = self.getSchema().length;\n if (bounds.right > schemaLength) bounds.right = schemaLength - 1;\n return bounds;\n };\n\n /**\n * This function is migrated from the old API,\n * It needs to be refactoring/deprecated to work with the large dataset.\n * @param {boolean} [expandToRow]\n * @returns {any[]}\n */\n self.getSelectedData = (expandToRow) => {\n const bounds = self.getSelectionBounds(true);\n if (!bounds) return [];\n\n const selectedData = [];\n const { top, bottom, left, right } = bounds;\n const height = bottom - top + 1;\n const width = right - left + 1;\n const states = getSelectionStateFromCells(self.selections, {\n startRow: top,\n endRow: bottom,\n startColumn: left,\n endColumn: right,\n });\n if (states === false) return [];\n\n const orderedSchema = getSchemaOrderByViewIndex(left, width);\n for (let row = top, row2 = top + height; row < row2; row++) {\n const viewData = self.viewData[row] || {};\n const rowData = {};\n let hasData = false;\n const rowState = states === true || states[row - top];\n if (!rowState) continue;\n\n for (let col = left, col2 = left + width; col < col2; col++) {\n if (states !== true && !rowState[col - left]) continue;\n const header = orderedSchema[col];\n if (!header || header.hidden) continue;\n hasData = true;\n if (expandToRow) break;\n rowData[header.name] = viewData[header.name];\n }\n if (hasData)\n selectedData[row] = expandToRow ? Object.assign({}, viewData) : rowData;\n }\n return selectedData;\n };\n\n /**\n * This function is migrated from the old API,\n * @param {boolean} [expandToRow]\n * @returns {any[]}\n */\n self.getSelectedCells = (expandToRow) => {\n const selectedCells = [];\n const bounds = self.getSelectionBounds(true);\n iterateSelectedCells(\n (cell) => selectedCells.push(cell),\n bounds,\n expandToRow,\n );\n return selectedCells;\n };\n\n /**\n * This function is migrated from the old API,\n * @returns {any[]} affected cells\n */\n self.clearSelectedCells = () => {\n const affectedCells = [];\n const bounds = self.getSelectionBounds(true);\n iterateSelectedCells(\n (cell) => {\n affectedCells.push(cell);\n self.viewData[cell.viewRowIndex][cell.columnName] = '';\n },\n bounds,\n false,\n );\n return affectedCells;\n };\n\n /**\n * Deletes currently selected data.\n * @memberof canvasDatagrid\n * @name deleteSelectedData\n * @method\n * @param {boolean} dontDraw Suppress the draw method after the selection change.\n */\n self.deleteSelectedData = (dontDraw) => {\n const affectedCells = self.clearSelectedCells();\n const apiCompatibleCells = affectedCells.map((cell) => {\n return [\n cell.viewRowIndex,\n cell.viewColumnIndex,\n cell.boundRowIndex,\n cell.boundColumnIndex,\n ];\n });\n self.dispatchEvent('afterdelete', {\n cells: apiCompatibleCells,\n });\n self.dispatchDataChanged('delete', { cells: apiCompatibleCells });\n if (dontDraw) return;\n requestAnimationFrame(() => self.draw());\n };\n\n /**\n * Runs the defined method on each selected cell.\n * @memberof canvasDatagrid\n * @name forEachSelectedCell\n * @method\n * @param {number} fn The function to execute. The signature of the function is: (data, rowIndex, columnName).\n * @param {number} expandToRow When true the data in the array is expanded to the entire row.\n */\n self.forEachSelectedCell = function (fn, expandToRow) {\n const bounds = self.getSelectionBounds(true);\n iterateSelectedCells(\n (cell) => fn(self.viewData, cell.viewRowIndex, cell.columnName, cell),\n bounds,\n expandToRow,\n );\n };\n\n /**\n * @param {ClipboardInterface} clipboardData\n */\n self.copySelectedCellsToClipboard = (clipboardData) => {\n // an active cell without a selection has nothing to copy (#566)\n if (!self.selections || self.selections.length === 0) return;\n const isNeat = areSelectionsNeat(self.selections);\n const selectedData = self.getSelectedData();\n const data = selectedData.filter((row) => row != null);\n\n if (data.length > 0) {\n const textString = createTextString(data, isNeat);\n const htmlString = createHTMLString(data, isNeat);\n\n const copiedData = {\n 'text/plain': textString,\n 'text/html': htmlString,\n 'text/csv': textString,\n 'application/json': JSON.stringify(data),\n };\n for (const [mimeType, data] of Object.entries(copiedData)) {\n clipboardData.setData(mimeType, data);\n }\n }\n };\n\n /**\n * (This function is migrated from the old API)\n * Modify the width of columns that contain selected cells to fit the content.\n * @param {number} [width] Custom width for each column\n */\n self.fitSelectedColumns = (width) => {\n const bounds = self.getSelectionBounds(true);\n if (!bounds) return;\n\n const hasCustomWidth = typeof width === 'number' && width > 0;\n // convert rectangle's height to only 1 row\n bounds.bottom = bounds.top;\n iterateSelectedCells(\n (cell) => {\n const { columnName, viewColumnIndex } = cell;\n if (hasCustomWidth) {\n self.sizes.columns[viewColumnIndex] = width;\n self.dispatchEvent('resizecolumn', {\n // TODO: Drop x, y from all 'resizecolumn' events and use height and width instead.\n x: width,\n y: self.resizingStartingHeight,\n width: width,\n height: self.resizingStartingHeight,\n columnIndex: viewColumnIndex,\n draggingItem: self.currentCell,\n });\n } else {\n self.fitColumnToValues(columnName);\n }\n },\n bounds,\n false,\n );\n };\n\n /**\n * Set the height of the selected rows to the given value.\n * @param {number} [height]\n */\n self.fitSelectedRows = (height) => {\n const bounds = self.getSelectionBounds(true);\n if (!bounds) return;\n\n for (let row = bounds.top; row <= bounds.bottom; row++) {\n if (!self.isRowSelected(row)) {\n continue;\n }\n self.sizes.rows[row] = height;\n self.dispatchResizeRow({\n width: self.resizingStartingWidth,\n height: height,\n rowIndex: row,\n draggingItem: self.currentCell,\n });\n }\n };\n\n /**\n * Selects a column.\n * @memberof canvasDatagrid\n * @name selectColumn\n * @method\n * @param {number} columnIndex The column index to select.\n * @param {boolean} toggleSelectMode When true, behaves as if you were holding control/command when you clicked the column.\n * @param {boolean} shift When true, behaves as if you were holding shift when you clicked the column.\n * @param {boolean} suppressEvent When true, prevents the selectionchanged event from firing.\n */\n self.selectColumn = (columnIndex, ctrl, shift, suppressEvent) => {\n self.isMultiRowsSelected = false;\n self.isMultiColumnsSelected = false;\n function addCol(i) {\n addIntoSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Columns,\n startColumn: i,\n }),\n );\n }\n function removeCol(i) {\n removeFromSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Columns,\n startColumn: i,\n }),\n );\n }\n if (shift) {\n if (!self.activeCell) {\n return;\n }\n const s = Math.min(self.activeCell.columnIndex, columnIndex);\n const e = Math.max(self.activeCell.columnIndex, columnIndex);\n addIntoSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Columns,\n startColumn: s,\n endColumn: e - 1,\n }),\n );\n if (s != e) self.isMultiColumnsSelected = true;\n }\n if (!ctrl && !shift) {\n self.selections = [];\n self.activeCell.columnIndex = columnIndex;\n self.activeCell.rowIndex = self.scrollIndexTop;\n }\n if (ctrl && self.isColumnSelected(columnIndex)) {\n removeCol(columnIndex);\n } else {\n addCol(columnIndex);\n }\n if (suppressEvent) {\n return;\n }\n self.dispatchSelectionChangedEvent();\n };\n\n /**\n * Selects a row.\n * @memberof canvasDatagrid\n * @name selectRow\n * @method\n * @param {number} rowIndex The row index to select.\n * @param {boolean} ctrl When true, behaves as if you were holding control/command when you clicked the row.\n * @param {boolean} shift When true, behaves as if you were holding shift when you clicked the row.\n * @param {boolean} supressSelectionchangedEvent When true, prevents the selectionchanged event from firing.\n */\n self.selectRow = (rowIndex, ctrl, shift, suppressEvent) => {\n self.isMultiRowsSelected = false;\n function de() {\n if (suppressEvent) {\n return;\n }\n self.dispatchSelectionChangedEvent();\n }\n function addRow(ri) {\n addIntoSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Rows,\n startRow: ri,\n }),\n );\n }\n if (self.dragAddToSelection === false || self.dragObject === undefined) {\n if (isRowSelected(self.selections, rowIndex) && ctrl) {\n removeFromSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Rows,\n startRow: rowIndex,\n }),\n );\n de();\n return;\n }\n }\n if (self.dragAddToSelection === true || self.dragObject === undefined) {\n if (shift && self.dragObject === undefined) {\n if (!self.activeCell) {\n return;\n }\n const st = Math.min(self.activeCell.rowIndex, rowIndex);\n const en = Math.max(self.activeCell.rowIndex, rowIndex);\n addIntoSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Rows,\n startRow: st,\n endRow: en,\n }),\n );\n } else {\n addRow(rowIndex);\n }\n }\n de();\n };\n\n /**\n * @param {function} iterator signature: `(cell: any) => any`\n * @param {object} bounds type: `{left:number;right:number;top:number;bottom:number}`\n * @param {boolean} [expandToRow]\n */\n function iterateSelectedCells(iterator, bounds, expandToRow) {\n if (!bounds) return;\n const { top, bottom, left, right } = bounds;\n const height = bottom - top + 1;\n const width = right - left + 1;\n const states = getSelectionStateFromCells(self.selections, {\n startRow: top,\n endRow: bottom,\n startColumn: left,\n endColumn: right,\n });\n if (states === false) return;\n\n const orderedSchema = getSchemaOrderByViewIndex(left, width);\n for (let row = top, row2 = top + height; row < row2; row++) {\n const viewData = self.viewData[row] || {};\n const rowState = states === true || states[row - top];\n if (!rowState) continue;\n for (let col = left, col2 = left + width; col < col2; col++) {\n if (rowState !== true && !rowState[col - left]) continue;\n\n const header = orderedSchema[col];\n if (!header || (header.hidden && !expandToRow)) continue;\n\n const cell = {\n value: viewData[header.name],\n header,\n columnName: header.name,\n boundRowIndex: self.getBoundRowIndexFromViewRowIndex(row),\n boundColumnIndex: self.orders.columns[col],\n viewRowIndex: row,\n viewColumnIndex: col,\n };\n iterator(cell);\n }\n }\n }\n\n /**\n * Selects an area of the grid.\n * @memberof canvasDatagrid\n * @name selectArea\n * @method\n * @param {rect} [bounds] A rect object representing the selected values.\n * @param {boolean} [ctrl]\n */\n self.selectArea = function (bounds, ctrl) {\n const schemaLength = self.getSchema().length;\n if (bounds) {\n if (bounds.right < 0) {\n // patch for API compatibility\n bounds.right = Math.max(schemaLength - 1, bounds.left, 0);\n }\n if (bounds.top > bounds.bottom || bounds.left > bounds.right)\n throw new Error('Impossible selection area');\n self.selectionBounds = self.sanitizeSelectionBounds(bounds);\n }\n let { top, bottom, left, right } = self.selectionBounds;\n if (!ctrl) self.selections = [];\n\n if (bottom >= self.viewData.length)\n bottom = Math.max(self.viewData.length - 1, top);\n if (top < -1 || left < -1 || right > schemaLength)\n throw new Error('Impossible selection area');\n\n /** @type {ContextForSelectionAction} */\n const context = { rows: self.viewData.length, columns: schemaLength };\n let changed = false;\n\n // In original API, number -1 indicates selecting whole row or selecting while column.\n if (top === -1) {\n // select whole columns\n const startColumn = Math.max(left, 0);\n // left eq -1 means selecting all cells\n const endRow =\n left === -1 ? schemaLength - 1 : Math.min(right, schemaLength - 1);\n changed = addIntoSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Columns,\n startColumn: startColumn,\n endColumn: endRow,\n }),\n context,\n );\n } else if (left === -1) {\n // select whole rows\n const startRow = Math.max(top, 0);\n const endRow = Math.min(bottom, self.viewData.length - 1);\n changed = addIntoSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Rows,\n startRow: startRow,\n endRow: endRow,\n }),\n context,\n );\n } else {\n changed = addIntoSelections(\n self.selections,\n normalizeSelection({\n type: SelectionType.Cells,\n startRow: top,\n endRow: bottom,\n startColumn: left,\n endColumn: right,\n }),\n context,\n );\n }\n if (changed) self.dispatchSelectionChangedEvent();\n };\n\n /**\n * This private method is using for make existing API about selection works.\n * TODO: This method can be removed by a better way.\n * @param {number} [rowIndex] 0 by default\n * @returns {number[]|undefined}\n */\n self.getRowSelectionStates = (rowIndex) => {\n if (typeof rowIndex !== 'number' || rowIndex < 0) rowIndex = 0;\n const startColumn = 0;\n const endRow = self.getSchema().length - 1;\n const width = endRow - startColumn + 1;\n const state = getSelectionStateFromCells(self.selections, {\n startRow: rowIndex,\n startColumn: startColumn,\n endRow: rowIndex,\n endColumn: endRow,\n });\n if (state === false) return;\n if (state === true) return new Array(width).fill(true).map((_, i) => i);\n\n const firstRow = state[0];\n if (!firstRow) return;\n\n const result = [];\n for (let col = 0; col < firstRow.length; col++)\n if (firstRow[col]) result.push(col);\n return result;\n };\n\n /**\n * Replace current selection list with new selection list\n * @param {object[]} newSelections New selection list\n */\n self.replaceAllSelections = (newSelections) => {\n cleanupSelections(newSelections);\n self.selections = newSelections;\n };\n\n /**\n * Select given columns and remove other existing selection area\n * @param {number[]} viewIndexes A number array that represents column view indexes\n */\n self.selectColumnViewIndexes = (viewIndexes) => {\n const selections = viewIndexes.map((col) => ({\n type: SelectionType.Columns,\n startColumn: col,\n endRow: col,\n }));\n self.replaceAllSelections(selections);\n };\n\n /**\n * This method will be a bottleneck in the future if this component\n * need to ship large dataset. But why I wrote this function:\n * 1. it is used for compatibility with existing APIs\n * 2. this component still has a bottleneck on the selection even there is not this function.\n * @returns {number[]}\n */\n self.getRowViewIndexesFromSelection = () => {\n if (self.selections.length === 0) return [];\n const bounds = getSelectionBounds(self.selections, true);\n const result = [];\n for (let rowIndex = bounds.top; rowIndex <= bounds.bottom; rowIndex++)\n result.push(rowIndex);\n return result;\n };\n\n /**\n * @param {object} cell Signature: `{rowIndex:number;columnIndex:number}`\n * @param {object} keyEvent Signature: `{key:string;shiftKey:boolean}`\n * @param {boolean} [suppressEvent]\n */\n self.shrinkOrExpandSelections = (cell, keyEvent, suppressEvent) => {\n const result = shrinkOrExpandSelections(self.selections, cell, keyEvent, {\n columns: self.getSchema().length,\n rows: self.viewData.length,\n });\n if (result && !suppressEvent) self.dispatchSelectionChangedEvent();\n return result;\n };\n\n /**\n * @param {number} [fromIndex]\n * @param {number} [len]\n */\n function getSchemaOrderByViewIndex(fromIndex, len) {\n const schema = self.getSchema();\n const orderedSchema = [];\n for (let col = fromIndex, col2 = fromIndex + len; col < col2; col++) {\n const orderedIndex = self.orders.columns[col];\n const header = schema[orderedIndex];\n orderedSchema[col] = header;\n }\n return orderedSchema;\n }\n\n /**\n * TODO: this function will be used for caching\n * Concatenating two 2-dimensional array.\n * It is simuliar with the method `concatenating` method of the Python module named `numpy`\n * @template T\n * @param {T[][]} a the first 2d array\n * @param {T[][]} b the second 2d array\n * @param {number} axis 1 implies that it is being done column-wise, otherwise row-wise\n * @returns {T[][]}\n */\n function concatenate2DArray(a, b, axis) {\n if (axis === 1) {\n const result = new Array(a.length);\n for (let i = 0; i < a.length; i++) {\n const rowInA = a[i];\n const rowInB = b[i];\n result[i] = rowInA.concat(rowInB);\n }\n }\n return a.concat(b);\n }\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false, Event: false*/\n'use strict';\n\nexport default function (self) {\n var zIndexTop, hoverScrollTimeout, autoCompleteContext;\n function applyContextItemStyle(contextItemContainer) {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item' + (self.mobile ? '-mobile' : ''),\n );\n contextItemContainer.addEventListener('mouseover', function () {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item:hover',\n );\n });\n contextItemContainer.addEventListener('mouseout', function () {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item',\n );\n });\n }\n function createContextMenu(ev, pos, items, parentContextMenu) {\n var container = document.createElement('div'),\n upArrow = document.createElement('div'),\n downArrow = document.createElement('div'),\n children = [],\n selectedIndex = -1,\n intf = {},\n rect;\n if (!Array.isArray(items)) {\n throw new Error('createContextMenu expects an array.');\n }\n function createItems() {\n items.forEach(function (item) {\n var contextItemContainer = document.createElement('div'),\n childMenuArrow;\n function removeChildContext(e) {\n if (\n e.relatedTarget === container ||\n item.contextMenu.container === e.relatedTarget ||\n childMenuArrow === e.relatedTarget ||\n contextItemContainer === e.relatedTarget ||\n item.contextMenu.container.contains(e.relatedTarget)\n ) {\n return;\n }\n item.contextMenu.dispose();\n children.splice(children.indexOf(item.contextMenu), 1);\n item.contextMenu = undefined;\n contextItemContainer.removeEventListener(\n 'mouseout',\n removeChildContext,\n );\n container.removeEventListener('mouseout', removeChildContext);\n contextItemContainer.setAttribute('contextOpen', '0');\n contextItemContainer.setAttribute('opening', '0');\n }\n function contextAddCallback(items) {\n // check yet again if the user hasn't moved off\n if (\n contextItemContainer.getAttribute('opening') !== '1' ||\n contextItemContainer.getAttribute('contextOpen') === '1'\n ) {\n return;\n }\n var cPos = contextItemContainer.getBoundingClientRect();\n cPos = {\n left:\n cPos.left +\n self.style.childContextMenuMarginLeft +\n container.offsetWidth,\n top: cPos.top + self.style.childContextMenuMarginTop,\n bottom: cPos.bottom,\n right: cPos.right,\n };\n item.contextMenu = createContextMenu(ev, cPos, items, intf);\n contextItemContainer.setAttribute('contextOpen', '1');\n contextItemContainer.addEventListener('mouseout', removeChildContext);\n container.addEventListener('mouseout', removeChildContext);\n children.push(item.contextMenu);\n }\n function createChildContext() {\n var i;\n if (contextItemContainer.getAttribute('contextOpen') === '1') {\n return;\n }\n contextItemContainer.setAttribute('opening', '1');\n if (typeof item.items === 'function') {\n i = item.items.apply(intf, [\n function (items) {\n contextAddCallback(items);\n },\n ]);\n if (i !== undefined && Array.isArray(i)) {\n contextAddCallback(i);\n }\n return;\n }\n contextAddCallback(item.items);\n }\n function addItem(item) {\n function addContent(content) {\n if (content === null) {\n return;\n }\n if (typeof content === 'function') {\n return addContent(content(ev));\n }\n if (typeof content === 'object') {\n contextItemContainer.appendChild(content);\n return;\n }\n applyContextItemStyle(contextItemContainer);\n contextItemContainer.innerHTML = content;\n return;\n }\n addContent(item.title);\n item.contextItemContainer = contextItemContainer;\n if (\n (item.items && item.items.length > 0) ||\n typeof item.items === 'function'\n ) {\n childMenuArrow = document.createElement('div');\n self.createInlineStyle(\n childMenuArrow,\n 'canvas-datagrid-context-child-arrow',\n );\n childMenuArrow.innerHTML = self.style.childContextMenuArrowHTML;\n contextItemContainer.appendChild(childMenuArrow);\n contextItemContainer.addEventListener(\n 'mouseover',\n createChildContext,\n );\n contextItemContainer.addEventListener('mouseout', function () {\n contextItemContainer.setAttribute('opening', '0');\n });\n }\n if (item.click) {\n contextItemContainer.addEventListener('click', function (ev) {\n item.click.apply(self, [ev]);\n });\n }\n }\n addItem(item);\n container.appendChild(contextItemContainer);\n });\n }\n function clickIndex(idx) {\n items[idx].contextItemContainer.dispatchEvent(new Event('click'));\n }\n function checkArrowVisibility() {\n if (container.scrollTop > 0) {\n self.parentDOMNode.appendChild(upArrow);\n } else if (upArrow.parentNode) {\n upArrow.parentNode.removeChild(upArrow);\n }\n if (\n container.scrollTop >=\n container.scrollHeight - container.offsetHeight &&\n downArrow.parentNode\n ) {\n downArrow.parentNode.removeChild(downArrow);\n } else if (\n container.scrollHeight - container.offsetHeight > 0 &&\n !(\n container.scrollTop >=\n container.scrollHeight - container.offsetHeight\n )\n ) {\n self.parentDOMNode.appendChild(downArrow);\n }\n }\n function fade(element) {\n var opacity = 1;\n var timer = setInterval(function () {\n if (opacity <= 0.1) {\n clearInterval(timer);\n element.style.display = 'none';\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n }\n }\n element.style.opacity = opacity;\n element.style.filter = 'alpha(opacity=' + opacity * 100 + ')';\n opacity -= opacity * 0.1;\n }, self.attributes.animationDurationHideContextMenu * 0.1);\n }\n function unfade(element) {\n var opacity = 0.1;\n element.style.display = 'block';\n var timer = setInterval(function () {\n if (opacity >= 1) {\n clearInterval(timer);\n }\n element.style.opacity = opacity;\n element.style.filter = 'alpha(opacity=' + opacity * 100 + ')';\n opacity += opacity * 0.1;\n }, self.attributes.animationDurationShowContextMenu * 0.1);\n }\n function startHoverScroll(type) {\n return function t() {\n var a = self.attributes.contextHoverScrollAmount;\n if (type === 'up' && container.scrollTop === 0) {\n return;\n }\n if (type === 'down' && container.scrollTop === container.scrollHeight) {\n return;\n }\n container.scrollTop += type === 'up' ? -a : a;\n hoverScrollTimeout = setTimeout(\n t,\n self.attributes.contextHoverScrollRateMs,\n type,\n );\n };\n }\n function endHoverScroll(type) {\n return function () {\n clearTimeout(hoverScrollTimeout);\n };\n }\n function init() {\n var loc = {},\n s = self.scrollOffset(self.canvas);\n if (zIndexTop === undefined) {\n zIndexTop = self.style.contextMenuZIndex;\n }\n createItems();\n self.createInlineStyle(\n container,\n 'canvas-datagrid-context-menu' + (self.mobile ? '-mobile' : ''),\n );\n loc.x = pos.left - s.left;\n loc.y = pos.top - s.top;\n loc.height = 0;\n zIndexTop += 1;\n container.style.opacity = 0;\n container.style.position = 'absolute';\n upArrow.style.color = self.style.contextMenuArrowColor;\n downArrow.style.color = self.style.contextMenuArrowColor;\n [upArrow, downArrow].forEach(function (el) {\n el.style.textAlign = 'center';\n el.style.position = 'absolute';\n el.style.zIndex = zIndexTop + 1;\n });\n container.style.zIndex = zIndexTop;\n if (parentContextMenu && parentContextMenu.inputDropdown) {\n container.style.maxHeight =\n window.innerHeight -\n loc.y -\n self.style.autocompleteBottomMargin +\n 'px';\n container.style.minWidth = pos.width + 'px';\n loc.y += pos.height;\n }\n if (self.mobile) {\n container.style.width = pos.width + 'px';\n }\n container.style.left = loc.x + 'px';\n container.style.top = loc.y + 'px';\n container.addEventListener('scroll', checkArrowVisibility);\n container.addEventListener('wheel', function (e) {\n if (self.hasFocus) {\n container.scrollTop += e.deltaY;\n container.scrollLeft += e.deltaX;\n }\n checkArrowVisibility();\n });\n upArrow.innerHTML = self.style.contextMenuArrowUpHTML;\n downArrow.innerHTML = self.style.contextMenuArrowDownHTML;\n container.appendChild(upArrow);\n document.body.appendChild(downArrow);\n document.body.appendChild(container);\n unfade(container);\n rect = container.getBoundingClientRect();\n // TODO: fix !(parentContextMenu && parentContextMenu.inputDropdown) state (autocomplete)\n if (rect.bottom > window.innerHeight) {\n if (!(parentContextMenu && parentContextMenu.inputDropdown)) {\n loc.y -=\n rect.bottom +\n self.style.contextMenuWindowMargin -\n window.innerHeight;\n }\n if (loc.y < 0) {\n loc.y = self.style.contextMenuWindowMargin;\n }\n if (\n container.offsetHeight >\n window.innerHeight - self.style.contextMenuWindowMargin\n ) {\n container.style.height =\n window.innerHeight - self.style.contextMenuWindowMargin * 2 + 'px';\n }\n }\n if (rect.right > window.innerWidth) {\n loc.x -=\n rect.right - window.innerWidth + self.style.contextMenuWindowMargin;\n }\n if (loc.x < 0) {\n loc.x = self.style.contextMenuWindowMargin;\n }\n if (loc.y < 0) {\n loc.y = self.style.contextMenuWindowMargin;\n }\n container.style.left = loc.x + 'px';\n container.style.top = loc.y + 'px';\n rect = container.getBoundingClientRect();\n upArrow.style.top = rect.top + 'px';\n downArrow.style.top =\n rect.top + rect.height - downArrow.offsetHeight + 'px';\n upArrow.style.left = rect.left + 'px';\n downArrow.style.left = rect.left + 'px';\n downArrow.style.width = container.offsetWidth + 'px';\n upArrow.style.width = container.offsetWidth + 'px';\n downArrow.addEventListener('mouseover', startHoverScroll('down'));\n downArrow.addEventListener('mouseout', endHoverScroll('down'));\n upArrow.addEventListener('mouseover', startHoverScroll('up'));\n upArrow.addEventListener('mouseout', endHoverScroll('up'));\n checkArrowVisibility();\n }\n intf.parentGrid = self.intf;\n intf.parentContextMenu = parentContextMenu;\n intf.container = container;\n init();\n intf.clickIndex = clickIndex;\n intf.rect = rect;\n intf.items = items;\n intf.upArrow = upArrow;\n intf.downArrow = downArrow;\n intf.dispose = function () {\n clearTimeout(hoverScrollTimeout);\n children.forEach(function (c) {\n c.dispose();\n });\n [downArrow, upArrow, container].forEach(function (el) {\n fade(el);\n });\n };\n Object.defineProperty(intf, 'selectedIndex', {\n get: function () {\n return selectedIndex;\n },\n set: function (value) {\n if (typeof value !== 'number' || isNaN(value) || !isFinite(value)) {\n throw new Error('Context menu selected index must be a sane number.');\n }\n selectedIndex = value;\n if (selectedIndex > items.length - 1) {\n selectedIndex = items.length - 1;\n }\n if (selectedIndex < 0) {\n selectedIndex = 0;\n }\n items.forEach(function (item, index) {\n if (index === selectedIndex) {\n return self.createInlineStyle(\n item.contextItemContainer,\n 'canvas-datagrid-context-menu-item:hover',\n );\n }\n self.createInlineStyle(\n item.contextItemContainer,\n 'canvas-datagrid-context-menu-item',\n );\n });\n },\n });\n return intf;\n }\n function createFilterContextMenuItems(e) {\n var filterContainer = document.createElement('div'),\n filterLabel = document.createElement('div'),\n filterAutoCompleteButton = document.createElement('button'),\n filterInput = document.createElement('input'),\n n =\n e.cell && e.cell.header\n ? e.cell.header.title || e.cell.header.name\n : '',\n iRect;\n function checkRegExpErrorState() {\n filterInput.style.background = self.style.contextFilterInputBackground;\n filterInput.style.color = self.style.contextFilterInputColor;\n if (self.invalidFilterRegEx) {\n filterInput.style.background =\n self.style.contextFilterInvalidRegExpBackground;\n filterInput.style.color = self.style.contextFilterInvalidRegExpColor;\n }\n }\n function fillAutoComplete() {\n var count = 0;\n var items = {};\n var blanksItem = [];\n\n self.viewData.forEach(function (row) {\n var cellValue =\n row[e.cell.header.name] == null\n ? row[e.cell.header.name]\n : String(row[e.cell.header.name]).trim();\n var value = self.blankValues.includes(cellValue)\n ? self.attributes.blanksText\n : cellValue;\n\n if (items[value] || count > self.attributes.maxAutoCompleteItems) {\n return;\n }\n count += 1;\n items[value] = {\n title: self.formatters[e.cell.header.type || 'string']({\n cell: { value: value },\n }),\n click: function (e) {\n filterInput.value = value;\n e.stopPropagation();\n filterInput.dispatchEvent(new Event('keyup'));\n self.disposeAutocomplete();\n return;\n },\n };\n });\n\n if (Object.keys(items).indexOf(self.attributes.blanksText) !== -1) {\n blanksItem.push(items[self.attributes.blanksText]);\n delete items[self.attributes.blanksText];\n }\n\n return blanksItem.concat(\n Object.keys(items).map(function (key) {\n return items[key];\n }),\n );\n }\n\n function createAutoCompleteContext(ev) {\n if (ev && ['ArrowDown', 'ArrowUp', 'Enter', 'Tab'].includes(ev.key)) {\n return;\n }\n\n var autoCompleteItems = fillAutoComplete();\n\n iRect = filterInput.getBoundingClientRect();\n if (autoCompleteContext) {\n autoCompleteContext.dispose();\n autoCompleteContext = undefined;\n }\n autoCompleteContext = createContextMenu(\n e,\n {\n left: iRect.left,\n top: iRect.top,\n right: iRect.right,\n bottom: iRect.bottom,\n height: iRect.height,\n width: iRect.width,\n },\n autoCompleteItems,\n { inputDropdown: true },\n );\n autoCompleteContext.selectedIndex = 0;\n }\n self.createInlineStyle(filterLabel, 'canvas-datagrid-context-menu-label');\n self.createInlineStyle(\n filterAutoCompleteButton,\n 'canvas-datagrid-context-menu-filter-button',\n );\n self.createInlineStyle(\n filterInput,\n 'canvas-datagrid-context-menu-filter-input',\n );\n checkRegExpErrorState();\n filterInput.onclick = self.disposeAutocomplete;\n filterInput.addEventListener('keydown', function (e) {\n if (e.key === 'ArrowDown') {\n autoCompleteContext.selectedIndex += 1;\n }\n\n if (e.key === 'ArrowUp') {\n autoCompleteContext.selectedIndex -= 1;\n }\n\n if (e.key === 'Enter') {\n autoCompleteContext.clickIndex(autoCompleteContext.selectedIndex);\n self.disposeContextMenu();\n }\n\n if (e.key === 'Tab') {\n autoCompleteContext.clickIndex(autoCompleteContext.selectedIndex);\n e.preventDefault();\n }\n\n if (e.key === 'Escape') {\n self.disposeContextMenu();\n }\n });\n filterInput.addEventListener('keyup', function () {\n self.setFilter(e.cell.header.name, filterInput.value);\n });\n filterInput.addEventListener('keyup', createAutoCompleteContext);\n ['focus', 'blur', 'keydown', 'keyup', 'change'].forEach(function (en) {\n filterInput.addEventListener(en, checkRegExpErrorState);\n });\n filterInput.value = e.cell.header\n ? self.columnFilters[e.cell.header.name] || ''\n : '';\n filterLabel.innerHTML = self.attributes.filterOptionText.replace(/%s/g, n);\n filterAutoCompleteButton.onclick = function () {\n if (autoCompleteContext) {\n return self.disposeAutocomplete();\n }\n createAutoCompleteContext();\n };\n filterAutoCompleteButton.innerHTML = self.style.contextFilterButtonHTML;\n filterContainer.addEventListener('click', function (e) {\n return e.stopPropagation();\n });\n filterContainer.appendChild(filterLabel);\n filterContainer.appendChild(filterInput);\n filterContainer.appendChild(filterAutoCompleteButton);\n e.items.push({\n title: filterContainer,\n });\n if (Object.keys(self.columnFilters).length) {\n Object.keys(self.columnFilters).forEach(function (cf) {\n var h = self.getHeaderByName(cf);\n e.items.push({\n title: self.attributes.removeFilterOptionText.replace(\n /%s/g,\n h.title || h.name,\n ),\n click: function removeFilterClick(e) {\n e.preventDefault();\n self.setFilter(cf, '');\n self.controlInput.focus();\n },\n });\n });\n }\n }\n\n function addDefaultContextMenuItem(e) {\n const schema = self.getSchema();\n /**\n * A map between columnIndex and column data\n * @type {Map<string,any>}\n */\n let columns;\n const getColumnsMap = () => {\n if (!columns)\n columns = new Map(schema.map((_col) => [_col.columnIndex, _col]));\n return columns;\n };\n const isSorting =\n self.orderings.columns && self.orderings.columns.length > 0;\n\n const isNormalCell =\n !(\n e.cell.isBackground ||\n e.cell.isColumnHeaderCellCap ||\n e.cell.isScrollBar ||\n e.cell.isCorner ||\n e.cell.isRowHeader\n ) && e.cell.header;\n if (self.attributes.showFilter && isNormalCell) {\n createFilterContextMenuItems(e);\n }\n if (self.attributes.showCopy && self.canSelectionsBeCopied()) {\n e.items.push({\n title: self.attributes.copyText,\n click: function () {\n document.execCommand('copy');\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n if (self.attributes.showPaste && self.clipBoardData) {\n e.items.push({\n title: self.attributes.pasteText,\n click: function () {\n // Original function call:\n // self.paste(self.clipBoardData, e.cell.columnIndex, e.cell.rowIndex);\n // We can remove the last two parameters follow\n // because this function only need one parameter by following the function declaration\n self.paste(self.clipBoardData);\n self.draw();\n },\n });\n }\n if (self.attributes.showColumnSelector) {\n e.items.push({\n title: self.attributes.columnSelectorText,\n items: function () {\n var d = [];\n self.getSchema().forEach(function (column) {\n function toggleColumnVisibility(e) {\n column.hidden = !column.hidden;\n self.dispatchEvent('togglecolumn', {\n column: column,\n hidden: column.hidden,\n });\n e.preventDefault();\n self.stopPropagation(e);\n self.disposeContextMenu();\n self.resize(true);\n self.setStorageData();\n }\n var el = document.createElement('div');\n applyContextItemStyle(el);\n el.addEventListener('touchstart', toggleColumnVisibility);\n el.addEventListener('click', toggleColumnVisibility);\n el.innerHTML =\n (column.hidden\n ? self.attributes.columnSelectorHiddenText\n : self.attributes.columnSelectorVisibleText) +\n (column.title || column.name);\n d.push({\n title: el,\n });\n });\n return d;\n },\n });\n if (e.cell && e.cell.header && e.cell.columnIndex > -1) {\n // This variable represents the order index because of the following codes from `draw.js`:\n // columnIndex: columnOrderIndex,\n const columnOrderIndex = e.cell.columnIndex;\n const columnIndex = self.orders.columns[columnOrderIndex];\n\n const contiguousColumns = self.getSelectedContiguousColumns(schema);\n let title = '';\n if (contiguousColumns) {\n title = contiguousColumns\n .map((col) => col.title || col.name)\n .join('-');\n } else {\n const column = schema[columnIndex];\n if (column) title = column.title || column.name;\n }\n e.items.push({\n title: self.attributes.hideColumnText.replace(/%s/gi, title),\n click: function (ev) {\n ev.preventDefault();\n self.stopPropagation(ev);\n self.disposeContextMenu();\n if (contiguousColumns) {\n self.hideColumns(\n contiguousColumns[0].orderIndex,\n contiguousColumns[1].orderIndex,\n );\n } else {\n self.hideColumns(columnOrderIndex);\n }\n },\n });\n }\n }\n if (\n self.attributes.saveAppearance &&\n self.attributes.showClearSettingsOption &&\n (Object.keys(self.sizes.rows).length > 0 ||\n Object.keys(self.sizes.columns).length > 0)\n ) {\n e.items.push({\n title: self.attributes.clearSettingsOptionText,\n click: function (e) {\n e.preventDefault();\n self.sizes.rows = {};\n self.sizes.columns = {};\n self.createRowOrders();\n self.createColumnOrders();\n self.storedSettings = undefined;\n self.dispatchEvent('resizecolumn', {\n columnWidth: self.style.cellWidth,\n });\n self.dispatchResizeRow({\n height: self.style.cellHeight,\n });\n self.setStorageData();\n self.resize(true);\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n if (\n self.attributes.allowSorting &&\n self.attributes.showOrderByOption &&\n isNormalCell\n ) {\n e.items.push({\n title: self.attributes.showOrderByOptionTextAsc.replace(\n '%s',\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.order(e.cell.header.name, 'asc');\n self.controlInput.focus();\n },\n });\n e.items.push({\n title: self.attributes.showOrderByOptionTextDesc.replace(\n '%s',\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.order(e.cell.header.name, 'desc');\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n\n //#region hide rows\n const canHideRows = !isSorting && e.cell.isRowHeader && e.cell.header;\n if (canHideRows) {\n const range = self.getSelectedContiguousRows(true);\n if (range) {\n const boundRowIndexes = range.map((viewRowIndex) =>\n self.getBoundRowIndexFromViewRowIndex(viewRowIndex),\n );\n let title;\n if (boundRowIndexes.length === 1) {\n if (typeof boundRowIndexes[0] === 'number')\n title = boundRowIndexes[0] + 1;\n else title = range[0] + 1;\n\n title = self.attributes.showHideRow.replace('%s', title);\n // hide one row\n e.items.push({\n title,\n click: function (ev) {\n ev.preventDefault();\n self.hideRows(boundRowIndexes[0], boundRowIndexes[0]);\n },\n });\n } else if (boundRowIndexes[0] <= boundRowIndexes[1]) {\n title = boundRowIndexes\n .map((it, index) => {\n if (typeof it === 'number') return it + 1;\n return range[index] + 1;\n })\n .join('-');\n title = self.attributes.showHideRows.replace('%s', title);\n // hide rows\n e.items.push({\n title,\n click: function (ev) {\n ev.preventDefault();\n self.hideRows(boundRowIndexes[0], boundRowIndexes[1]);\n },\n });\n }\n }\n }\n //#endregion hide rows\n\n //#region group/ungroup columns\n const groupAreaHeight = self.getColumnGroupAreaHeight();\n const groupAreaWidth = self.getRowGroupAreaWidth();\n const setCollapseStateForAllGroups = (allGroups, collapsed) => {\n if (allGroups.length === 0) return;\n for (let i = 0; i < allGroups.length; i++) {\n const groups = allGroups[i];\n for (let j = 0; j < groups.length; j++) {\n const group = groups[j];\n group.collapsed = collapsed;\n }\n }\n self.refresh();\n };\n if (e.pos && e.pos.y < groupAreaHeight) {\n e.items.push({\n title: self.attributes.showRemoveAllGroupColumns,\n click: function (ev) {\n ev.preventDefault();\n self.groupedColumns = [];\n self.refresh();\n },\n });\n e.items.push({\n title: self.attributes.showExpandAllGroupColumns,\n click: function (ev) {\n ev.preventDefault();\n setCollapseStateForAllGroups(self.groupedColumns, false);\n },\n });\n e.items.push({\n title: self.attributes.showCollapseAllGroupColumns,\n click: function (ev) {\n ev.preventDefault();\n setCollapseStateForAllGroups(self.groupedColumns, true);\n },\n });\n }\n if (e.pos && e.pos.x < groupAreaWidth) {\n e.items.push({\n title: self.attributes.showRemoveAllGroupRows,\n click: function (ev) {\n ev.preventDefault();\n self.groupedRows = [];\n self.refresh();\n },\n });\n e.items.push({\n title: self.attributes.showExpandAllGroupRows,\n click: function (ev) {\n ev.preventDefault();\n setCollapseStateForAllGroups(self.groupedRows, false);\n },\n });\n e.items.push({\n title: self.attributes.showCollapseAllGroupRows,\n click: function (ev) {\n ev.preventDefault();\n setCollapseStateForAllGroups(self.groupedRows, true);\n },\n });\n }\n\n const canGroupByColumns =\n self.attributes.allowGroupingColumns &&\n e.cell.isColumnHeader &&\n e.cell.header &&\n e.cell.header.index > 0;\n const canUngroupColumns =\n self.attributes.allowGroupingColumns && e.cell.isColumnHeader;\n const canGroupByRows =\n !isSorting &&\n self.attributes.allowGroupingRows &&\n e.cell.isRowHeader &&\n e.cell.header;\n const canUngroupRows =\n self.attributes.allowGroupingRows && e.cell.isRowHeader;\n\n if (canGroupByColumns) {\n /** @type {number[]} */\n const groupIndexes = [];\n /** @type {number} */\n const headerIndex = e.cell.header.index;\n let col = headerIndex;\n for (; col >= 0; col--) {\n if (!self.isColumnSelected(col)) break;\n groupIndexes[0] = col;\n }\n for (col = headerIndex; ; col++) {\n if (!self.isColumnSelected(col)) break;\n groupIndexes[1] = col;\n }\n if (\n col !== headerIndex &&\n groupIndexes.length === 2 &&\n groupIndexes[1] > groupIndexes[0] &&\n self.isNewGroupRangeValid(\n self.groupedColumns,\n groupIndexes[0],\n groupIndexes[1],\n )\n ) {\n const columns = getColumnsMap();\n const groupTitles = [];\n const groupNames = [];\n for (let i = 0; i < groupIndexes.length; i++) {\n const columnIndex = groupIndexes[i];\n const column = columns.get(columnIndex);\n if (column) {\n groupNames.push(column.name);\n groupTitles.push(column.title || column.name || column.index);\n }\n }\n if (groupNames[0] && groupNames[1]) {\n // show group options\n e.items.push({\n title: self.attributes.showGroupColumns.replace(\n '%s',\n groupTitles[0] + '-' + groupTitles[1],\n ),\n click: function (ev) {\n ev.preventDefault();\n self.groupColumns(groupNames[0], groupNames[1]);\n self.controlInput.focus();\n },\n });\n }\n }\n }\n if (canUngroupColumns) {\n const columnIndex = e.cell.columnIndex;\n const groups = self.getGroupsColumnBelongsTo(columnIndex);\n const columns = getColumnsMap();\n for (let i = 0; i < groups.length; i++) {\n const { from, to } = groups[i];\n const cell0 = columns.get(from);\n const cell1 = columns.get(to);\n if (cell0 && cell1) {\n const formatArgs =\n (cell0.title || cell0.name || cell0.index) +\n '-' +\n (cell1.title || cell1.name || cell1.index);\n e.items.push({\n title: self.attributes.showRemoveGroupColumns.replace(\n '%s',\n formatArgs,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.removeGroupColumns(cell0.name, cell1.name);\n self.controlInput.focus();\n },\n });\n } else {\n console.warn(`Cannot find column ${from} or column ${to}`);\n }\n }\n }\n if (canGroupByRows) {\n const range = self.getSelectedContiguousRows(false) || [];\n const rangeTitle = range\n .map((rowIndex) => {\n const index = self.getBoundRowIndexFromViewRowIndex(rowIndex);\n if (typeof index === 'number') return index + 1;\n return rowIndex + 1;\n })\n .join('-');\n if (\n range.length === 2 &&\n self.isNewGroupRangeValid(self.groupedRows, range[0], range[1])\n ) {\n e.items.push({\n title: self.attributes.showGroupRows.replace('%s', rangeTitle),\n click: function (ev) {\n ev.preventDefault();\n self.groupRows(range[0], range[1]);\n },\n });\n }\n }\n if (canUngroupRows) {\n const rowIndex = e.cell.rowIndex;\n const groups = self.getGroupsRowBelongsTo(rowIndex);\n for (let i = 0; i < groups.length; i++) {\n const { from, to } = groups[i];\n const rangeTitle = [from, to]\n .map((rowIndex) => {\n const index = self.getBoundRowIndexFromViewRowIndex(rowIndex);\n if (typeof index === 'number') return index + 1;\n return rowIndex + 1;\n })\n .join('-');\n e.items.push({\n title: self.attributes.showRemoveGroupRows.replace('%s', rangeTitle),\n click: function (ev) {\n ev.preventDefault();\n self.removeGroupRows(from, to);\n self.controlInput.focus();\n },\n });\n }\n }\n //#endregion group/ungroup columns\n }\n self.disposeAutocomplete = function () {\n if (autoCompleteContext) {\n autoCompleteContext.dispose();\n autoCompleteContext = undefined;\n }\n };\n self.disposeContextMenu = function (event) {\n if (\n event &&\n event.type === 'click' &&\n event.ctrlKey &&\n self.contextMenuOpenedAt !== undefined &&\n performance.now() - self.contextMenuOpenedAt < 500\n ) {\n // macOS Safari dispatches a click right after a ctrl-click contextmenu,\n // which would close the menu immediately (#521)\n return;\n }\n document.removeEventListener('click', self.disposeContextMenu);\n zIndexTop = self.style.contextMenuZIndex;\n self.disposeAutocomplete();\n if (self.contextMenu) {\n self.contextMenu.dispose();\n }\n self.contextMenu = undefined;\n if (event) {\n self.canvas.focus();\n self.mousedown(event);\n self.mouseup(event);\n }\n };\n self.contextmenuEvent = function (e, overridePos) {\n if (!self.hasFocus && e.target !== self.canvas) {\n return;\n }\n // don't create context menu for parents if current position is located in child grid\n const children = Object.keys(self.childGrids);\n for (let i = 0; i < children.length; i++) {\n const childGrid = self.childGrids[children[i]];\n const parentNode = childGrid && childGrid.parentNode;\n if (!parentNode) continue;\n const { offsetLeft, offsetWidth, offsetTop, offsetHeight } = parentNode;\n if ((e.x >= offsetLeft && e.x <= offsetLeft + offsetWidth) === false)\n continue;\n if ((e.y >= offsetTop && e.y <= offsetTop + offsetHeight) === false)\n continue;\n return; // in child grid\n }\n // don't create context menu for child if current position is located in parent grid\n if (self.isChildGrid && self.parentNode) {\n //#region check is current child grid closed\n const childGridsOfParent = self.parentGrid && self.parentGrid.childGrids;\n if (!childGridsOfParent || !Array.isArray(childGridsOfParent)) return;\n const matchedMe = childGridsOfParent.find((grid) => {\n const nodeA = grid.parentNode;\n const nodeB = self.parentNode;\n return (\n nodeA.offsetTop == nodeB.offsetTop &&\n nodeA.offsetLeft === nodeB.offsetLeft\n );\n });\n if (!matchedMe) return;\n //#endregion\n\n let x0 = self.parentNode.offsetLeft;\n let x1 = self.parentNode.offsetLeft + self.parentNode.offsetWidth;\n let y0 = self.parentNode.offsetTop;\n let y1 = self.parentNode.offsetTop + self.parentNode.offsetHeight;\n let node = self.parentNode.parentNode;\n while (node) {\n const { offsetLeft, offsetWidth, offsetTop, offsetHeight } = node;\n if (offsetLeft > x0) x0 = offsetLeft;\n if (offsetTop > y0) y0 = offsetTop;\n const newX1 = offsetLeft + offsetWidth;\n const newY1 = offsetTop + offsetHeight;\n if (newX1 < x1) x1 = newX1;\n if (newY1 < y1) y1 = newY1;\n if (node.nodeType !== 'canvas-datagrid-tree') break;\n node = node.parentNode;\n }\n if ((e.x >= x0 && e.x <= x1 && e.y >= y0 && e.y <= y1) === false) return;\n }\n function createDisposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('click', self.disposeContextMenu);\n window.removeEventListener('mouseup', createDisposeEvent);\n });\n }\n var contextPosition,\n items = [],\n pos = overridePos || self.getLayerPos(e),\n ev = {\n NativeEvent: e,\n cell: self.getCellAt(pos.x, pos.y),\n pos,\n items: items,\n };\n if (!ev.cell.isGrid) {\n addDefaultContextMenuItem(ev);\n }\n if (e.type !== 'mousedown' && self.dispatchEvent('contextmenu', ev)) {\n return;\n }\n if (!ev.cell.isGrid) {\n if (self.contextMenu) {\n self.disposeContextMenu();\n }\n contextPosition = {\n left:\n pos.x +\n pos.rect.left +\n self.style.contextMenuMarginLeft +\n self.canvasOffsetLeft,\n top:\n pos.y +\n pos.rect.top +\n self.style.contextMenuMarginTop +\n self.canvasOffsetTop,\n right: ev.cell.width + ev.cell.x + pos.rect.left,\n bottom: ev.cell.height + ev.cell.y + pos.rect.top,\n height: ev.cell.height,\n width: ev.cell.width,\n };\n if (self.mobile) {\n contextPosition.left = self.style.mobileContextMenuMargin + 'px';\n contextPosition.width =\n self.width - self.style.mobileContextMenuMargin * 2 + 'px';\n }\n if (e.type == 'mousedown') {\n contextPosition.top += self.style.filterButtonMenuOffsetTop;\n }\n // use ev.items, not the captured array: a listener may assign a new\n // array to e.items (#263)\n self.contextMenu = createContextMenu(ev, contextPosition, ev.items);\n self.contextMenuOpenedAt = performance.now();\n if (e.type == 'mousedown') {\n window.addEventListener('mouseup', createDisposeEvent);\n } else {\n createDisposeEvent();\n }\n e.preventDefault();\n }\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false, Event: false*/\n'use strict';\n\nexport default function (self) {\n let zIndexTop;\n\n function applyButtonMenuItemStyle(buttonMenuItemContainer) {\n self.createInlineStyle(\n buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item' + (self.mobile ? '-mobile' : ''),\n );\n buttonMenuItemContainer.addEventListener('mouseover', function () {\n self.createInlineStyle(\n buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item:hover',\n );\n });\n buttonMenuItemContainer.addEventListener('mouseout', function () {\n self.createInlineStyle(\n buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item',\n );\n });\n }\n\n function applyButtonStyle(button) {\n self.createInlineStyle(button, 'canvas-datagrid-button-wrapper');\n button.addEventListener('mouseover', function () {\n if (!self.buttonMenu) {\n self.createInlineStyle(button, 'canvas-datagrid-button-wrapper:hover');\n }\n });\n button.addEventListener('mouseout', function () {\n if (!self.buttonMenu) {\n self.createInlineStyle(button, 'canvas-datagrid-button-wrapper');\n }\n });\n }\n\n function createButton(pos, items, imgSrc) {\n var wrapper = document.createElement('div'),\n buttonArrow = document.createElement('div'),\n buttonIcon = document.createElement('div'),\n intf = {};\n\n if (!Array.isArray(items)) {\n throw new Error('createButton expects an array.');\n }\n\n function init() {\n var loc = {},\n s = self.scrollOffset(self.canvas);\n\n if (zIndexTop === undefined) {\n zIndexTop = self.style.buttonZIndex;\n }\n\n applyButtonStyle(wrapper);\n self.createInlineStyle(buttonIcon, 'canvas-datagrid-button-icon');\n self.createInlineStyle(buttonArrow, 'canvas-datagrid-button-arrow');\n\n loc.x = pos.left - s.left;\n loc.y = pos.top - s.top;\n loc.height = 0;\n zIndexTop += 1;\n wrapper.style.position = 'absolute';\n wrapper.style.zIndex = zIndexTop;\n wrapper.style.left = loc.x + 'px';\n wrapper.style.top = loc.y + 'px';\n wrapper.left = pos.left + self.scrollBox.scrollLeft;\n wrapper.top = pos.top + self.scrollBox.scrollTop;\n buttonArrow.innerHTML = self.style.buttonArrowDownHTML;\n if (imgSrc) {\n let img = document.createElement('img');\n img.setAttribute('src', imgSrc);\n img.style.maxWidth = '100%';\n img.style.height = '100%';\n buttonIcon.appendChild(img);\n }\n wrapper.appendChild(buttonIcon);\n wrapper.appendChild(buttonArrow);\n document.body.appendChild(wrapper);\n wrapper.addEventListener('click', toggleButtonMenu);\n }\n\n intf.wrapper = wrapper;\n intf.items = items;\n init();\n\n intf.dispose = function () {\n if (wrapper.parentNode) {\n wrapper.parentNode.removeChild(wrapper);\n }\n };\n return intf;\n }\n\n function toggleButtonMenu() {\n function createDisposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('click', self.disposeButtonMenu);\n });\n }\n if (self.buttonMenu) {\n self.disposeButtonMenu();\n } else {\n let pos = {\n left: self.button.wrapper.left - self.scrollBox.scrollLeft,\n top:\n self.button.wrapper.top +\n self.button.wrapper.offsetHeight -\n self.scrollBox.scrollTop,\n };\n self.buttonMenu = createButtonMenu(pos, self.button.items);\n self.createInlineStyle(\n self.button.wrapper,\n 'canvas-datagrid-button-wrapper:active',\n );\n createDisposeEvent();\n }\n }\n\n function createButtonMenu(pos, items) {\n var buttonMenu = document.createElement('div'),\n selectedIndex = -1,\n intf = {},\n rect;\n\n function createItems() {\n function addItem(item, menuItemContainer) {\n function addContent(content) {\n if (content === null) {\n return;\n }\n\n if (typeof content === 'object') {\n menuItemContainer.appendChild(content);\n return;\n }\n\n applyButtonMenuItemStyle(menuItemContainer);\n menuItemContainer.innerHTML = content;\n return;\n }\n\n addContent(item.title);\n item.buttonMenuItemContainer = menuItemContainer;\n\n if (item.click) {\n menuItemContainer.addEventListener('click', function (ev) {\n item.click.apply(self, [ev]);\n self.disposeButton();\n });\n }\n }\n\n for (let item of items) {\n var buttonMenuItemContainer = document.createElement('div');\n addItem(item, buttonMenuItemContainer);\n buttonMenu.appendChild(buttonMenuItemContainer);\n }\n }\n\n function clickIndex(idx) {\n items[idx].buttonMenuItemContainer.dispatchEvent(new Event('click'));\n }\n\n function init() {\n var loc = {},\n s = self.scrollOffset(self.canvas);\n\n if (zIndexTop === undefined) {\n zIndexTop = self.style.buttonZIndex;\n }\n\n createItems();\n self.createInlineStyle(\n buttonMenu,\n 'canvas-datagrid-button-menu' + (self.mobile ? '-mobile' : ''),\n );\n\n loc.x = pos.left - s.left;\n loc.y = pos.top - s.top;\n loc.height = 0;\n zIndexTop += 1;\n buttonMenu.style.position = 'absolute';\n buttonMenu.style.zIndex = zIndexTop;\n buttonMenu.style.left = loc.x + 'px';\n buttonMenu.style.top = loc.y + 'px';\n document.body.appendChild(buttonMenu);\n rect = buttonMenu.getBoundingClientRect();\n\n if (rect.bottom > window.innerHeight) {\n loc.y =\n self.button.wrapper.top -\n buttonMenu.offsetHeight -\n self.scrollBox.scrollTop;\n if (loc.y < 0) {\n loc.y = self.style.buttonMenuWindowMargin;\n }\n\n if (\n buttonMenu.offsetHeight >\n window.innerHeight - self.style.buttonMenuWindowMargin\n ) {\n buttonMenu.style.height =\n window.innerHeight - self.style.buttonMenuWindowMargin * 2 + 'px';\n }\n }\n\n if (rect.right > window.innerWidth) {\n loc.x -=\n rect.right - window.innerWidth + self.style.buttonMenuWindowMargin;\n }\n\n if (loc.x < 0) {\n loc.x = self.style.buttonMenuWindowMargin;\n }\n\n if (loc.y < 0) {\n loc.y = self.style.buttonMenuWindowMargin;\n }\n\n buttonMenu.style.left = loc.x + 'px';\n buttonMenu.style.top = loc.y + 'px';\n }\n\n intf.buttonMenu = buttonMenu;\n init();\n intf.clickIndex = clickIndex;\n intf.rect = rect;\n intf.items = items;\n\n intf.dispose = function () {\n if (buttonMenu.parentNode) {\n buttonMenu.parentNode.removeChild(buttonMenu);\n }\n };\n\n Object.defineProperty(intf, 'selectedIndex', {\n get: function get() {\n return selectedIndex;\n },\n set: function set(value) {\n if (typeof value !== 'number' || isNaN(value) || !isFinite(value)) {\n throw new Error('Button menu selected index must be a sane number.');\n }\n\n selectedIndex = value;\n\n if (selectedIndex > items.length - 1) {\n selectedIndex = items.length - 1;\n }\n\n if (selectedIndex < 0) {\n selectedIndex = 0;\n }\n\n items.forEach(function (item, index) {\n if (index === selectedIndex) {\n return self.createInlineStyle(\n item.buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item:hover',\n );\n }\n\n self.createInlineStyle(\n item.buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item',\n );\n });\n },\n });\n return intf;\n }\n\n self.disposeButtonMenu = function () {\n if (self.buttonMenu) {\n document.removeEventListener('click', self.disposeButtonMenu);\n self.buttonMenu.dispose();\n self.buttonMenu = undefined;\n self.createInlineStyle(\n self.button.wrapper,\n 'canvas-datagrid-button-wrapper:hover',\n );\n }\n };\n\n self.disposeButton = function (e) {\n if (e && e.keyCode !== 27) return;\n document.removeEventListener('keydown', self.disposeButton);\n zIndexTop = self.style.buttonZIndex;\n self.disposeButtonMenu();\n\n if (self.button) {\n self.button.dispose();\n }\n\n self.button = undefined;\n };\n\n self.moveButtonPos = function () {\n self.button.wrapper.style.left =\n self.button.wrapper.left - self.scrollBox.scrollLeft + 'px';\n self.button.wrapper.style.top =\n self.button.wrapper.top - self.scrollBox.scrollTop + 'px';\n self.disposeButtonMenu();\n };\n\n self.attachButton = function (pos, items, imgSrc) {\n function createDisposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('keydown', self.disposeButton);\n });\n }\n\n if (self.button) {\n self.disposeButton();\n }\n\n self.button = createButton(pos, items, imgSrc);\n createDisposeEvent();\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n self.getClippingRect = function (ele) {\n var boundingRect = self.position(self.parentNode),\n eleRect = self.position(ele),\n s = self.scrollOffset(self.canvas),\n clipRect = {\n x: 0,\n y: 0,\n h: 0,\n w: 0,\n },\n parentRect = {\n x: -Infinity,\n y: -Infinity,\n h: Infinity,\n w: Infinity,\n },\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth();\n boundingRect.top -= s.top;\n boundingRect.left -= s.left;\n eleRect.top -= s.top;\n eleRect.left -= s.left;\n clipRect.h =\n boundingRect.top +\n boundingRect.height -\n ele.offsetTop -\n self.style.scrollBarWidth;\n clipRect.w =\n boundingRect.left +\n boundingRect.width -\n ele.offsetLeft -\n self.style.scrollBarWidth;\n clipRect.x = boundingRect.left + eleRect.left * -1 + rowHeaderCellWidth;\n clipRect.y = boundingRect.top + eleRect.top * -1 + columnHeaderCellHeight;\n return {\n x: clipRect.x > parentRect.x ? clipRect.x : parentRect.x,\n y: clipRect.y > parentRect.y ? clipRect.y : parentRect.y,\n h: clipRect.h < parentRect.h ? clipRect.h : parentRect.h,\n w: clipRect.w < parentRect.w ? clipRect.w : parentRect.w,\n };\n };\n self.clipElement = function (ele) {\n var clipRect = self.getClippingRect(ele);\n if (clipRect.w < 0) {\n clipRect.w = 0;\n }\n if (clipRect.h < 0) {\n clipRect.h = 0;\n }\n ele.style.clip =\n 'rect(' +\n clipRect.y +\n 'px,' +\n clipRect.w +\n 'px,' +\n clipRect.h +\n 'px,' +\n clipRect.x +\n 'px' +\n ')';\n // INFO https://developer.mozilla.org/en-US/docs/Web/CSS/clip\n // clip has been \"deprecated\" for clipPath. Of course nothing but chrome\n // supports clip path, so we'll keep using clip until someday clipPath becomes\n // more widely support. The code below works correctly, but setting clipPath and clip\n // at the same time has undesirable results.\n // ele.style.clipPath = 'polygon('\n // + clipRect.x + 'px ' + clipRect.y + 'px,'\n // + clipRect.x + 'px ' + clipRect.h + 'px,'\n // + clipRect.w + 'px ' + clipRect.h + 'px,'\n // + clipRect.w + 'px ' + clipRect.y + 'px'\n // + ')';\n };\n self.scrollOffset = function (e) {\n var x = 0,\n y = 0,\n scrollingElement = document.scrollingElement || {\n scrollLeft: 0,\n scrollTop: 0,\n };\n while (\n e.parentNode &&\n e.nodeName !== 'CANVAS-DATAGRID' &&\n e !== self.intf\n ) {\n if (\n e.nodeType !== 'canvas-datagrid-tree' &&\n e.nodeType !== 'canvas-datagrid-cell'\n ) {\n x -= e.scrollLeft;\n y -= e.scrollTop;\n }\n e = e.parentNode;\n }\n return {\n left: x - scrollingElement.scrollLeft,\n top: y - scrollingElement.scrollTop,\n };\n };\n self.resizeEditInput = function () {\n if (self.input && self.input.editCell) {\n var pos = self.canvas.getBoundingClientRect(),\n s = self.scrollOffset(self.intf),\n bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n borderWidth = self.style.cellBorderWidth * bm,\n cell = self.getVisibleCellByIndex(\n self.input.editCell.columnIndex,\n self.input.editCell.rowIndex,\n ) || { x: -100, y: -100, height: 0, width: 0 };\n if (self.mobile) {\n self.input.style.left = '0';\n self.input.style.top =\n self.height -\n self.style.mobileEditInputHeight -\n borderWidth -\n 1 +\n 'px';\n self.input.style.height = self.style.mobileEditInputHeight + 'px';\n self.input.style.width = self.width - borderWidth - 1 + 'px';\n return;\n }\n let groupAreaOffsetY = self.getColumnGroupAreaHeight();\n let groupAreaOffsetX = self.getRowGroupAreaWidth();\n if (self.parentNode) {\n const { columnGroupsAreaHeight, rowGroupsAreaWidth } = self.parentNode;\n if (columnGroupsAreaHeight) groupAreaOffsetY += columnGroupsAreaHeight;\n if (rowGroupsAreaWidth) groupAreaOffsetX += rowGroupsAreaWidth;\n }\n self.input.style.left =\n pos.left +\n cell.x +\n self.canvasOffsetLeft -\n s.left +\n groupAreaOffsetX +\n 'px';\n self.input.style.top =\n pos.top +\n cell.y -\n self.style.cellBorderWidth +\n self.canvasOffsetTop -\n s.top +\n groupAreaOffsetY +\n 'px';\n self.input.style.height = cell.height - borderWidth + 'px';\n self.input.style.width = cell.width - self.style.cellPaddingLeft + 'px';\n self.clipElement(self.input);\n }\n };\n self.position = function (e, ignoreScrollOffset) {\n var x = 0,\n y = 0,\n s = e,\n h,\n w;\n let calculatedTree = false;\n while (e.offsetParent && e.nodeName !== 'CANVAS-DATAGRID') {\n const isTree = e.nodeType === 'canvas-datagrid-tree';\n if (!isTree || !calculatedTree) {\n x += e.offsetLeft;\n y += e.offsetTop;\n h = e.offsetHeight;\n w = e.offsetWidth;\n }\n if (isTree) calculatedTree = true;\n e = e.offsetParent;\n }\n if (ignoreScrollOffset) {\n return { left: x, top: y, height: h, width: w };\n }\n e = s;\n s = self.scrollOffset(e);\n return { left: x + s.left, top: y + s.top, height: h, width: w };\n };\n self.getLayerPos = function (e) {\n var rect = self.canvas.getBoundingClientRect(),\n pos = {\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n };\n if (self.isChildGrid) {\n pos.x -= self.canvasOffsetLeft;\n pos.y -= self.canvasOffsetTop;\n if (self.parentNode.rowGroupsAreaWidth)\n pos.x -= self.parentNode.rowGroupsAreaWidth;\n if (self.parentNode.columnGroupsAreaHeight)\n pos.y -= self.parentNode.columnGroupsAreaHeight;\n }\n return {\n x: pos.x,\n y: pos.y,\n rect: rect,\n };\n };\n /**\n * The element the grid sits in: the parent of the `canvas-datagrid` host\n * element, or the host of the shadow tree the grid was placed in.\n * @returns {HTMLElement|undefined}\n */\n self.getContainerElement = function () {\n var host = self.intf && self.intf.nodeType === 1 ? self.intf : self.canvas,\n container = host && host.parentNode;\n if (container && container.nodeType === 11 && container.host) {\n container = container.host;\n }\n return container && container.nodeType === 1 ? container : undefined;\n };\n /**\n * Measures the room the container offers the grid in each dimension.\n * A dimension is `undefined` when the container has no size of its own\n * there, that is when it grows with the grid (an auto height block, a\n * shrink-to-fit width); the caller then falls back to the content size.\n *\n * The probe makes the canvas one pixel larger than the container's client\n * size and checks whether the container followed. When it did not, the\n * overflow that the probe produced tells how much of the container is\n * taken by padding and siblings. Everything is restored synchronously, so\n * nothing is painted and no ResizeObserver notification results.\n * @returns {{width: (number|undefined), height: (number|undefined)}}\n */\n self.measureContainerSpace = function () {\n var space = {},\n canvas = self.canvas,\n container = self.getContainerElement(),\n cache = self.containerSpaceCache,\n canvasStyle,\n saved;\n if (!container || !canvas) {\n return space;\n }\n if (\n cache &&\n cache.container === container &&\n cache.clientWidth === container.clientWidth &&\n cache.clientHeight === container.clientHeight\n ) {\n return cache.space;\n }\n canvasStyle = canvas.style;\n saved = { width: canvasStyle.width, height: canvasStyle.height };\n ['height', 'width'].forEach(function (dim) {\n var client = dim === 'height' ? 'clientHeight' : 'clientWidth',\n scroll = dim === 'height' ? 'scrollHeight' : 'scrollWidth',\n before = container[client],\n probe = before + 1,\n after;\n canvasStyle[dim] = probe + 'px';\n after = container[client];\n if (before === 0 || after > before) {\n // nothing to measure (hidden or inline) or the container grew with\n // the grid: it has no size of its own in this dimension\n space[dim] = undefined;\n } else {\n // the container kept its size and the grid overflows it by at least\n // one pixel; the overflow beyond that pixel is padding and siblings\n space[dim] = Math.max(\n 0,\n Math.min(after, 2 * after + 1 - container[scroll]),\n );\n }\n canvasStyle[dim] = saved[dim];\n });\n // resize() may run several times in one frame (drags, style changes);\n // the probe forces layout, so reuse the result while the container\n // keeps its size\n self.containerSpaceCache = {\n container: container,\n clientWidth: container.clientWidth,\n clientHeight: container.clientHeight,\n space: space,\n };\n requestAnimationFrame(function () {\n self.containerSpaceCache = undefined;\n });\n return space;\n };\n /**\n * Watches the host element and its container for size changes so a grid\n * sized with auto/percentage dimensions follows layout changes (flex,\n * splitters, tab switches) without an explicit `resize()` call (#289, #239).\n * Falls back to the `window` resize listener when ResizeObserver is missing.\n */\n self.initResizeObserver = function () {\n if (self.isChildGrid || typeof window.ResizeObserver !== 'function') {\n return;\n }\n self.observedSizes = new Map();\n self.resizeObserver = new window.ResizeObserver(function (entries) {\n var changed = false;\n entries.forEach(function (entry) {\n var rect = entry.contentRect;\n var last = self.observedSizes.get(entry.target);\n if (!last || last.width !== rect.width || last.height !== rect.height) {\n self.observedSizes.set(entry.target, {\n width: rect.width,\n height: rect.height,\n });\n changed = true;\n }\n });\n if (!changed || self.disposed || self.resizeObserverFrame) {\n return;\n }\n // coalesce bursts of notifications into one resize per frame\n self.resizeObserverFrame = requestAnimationFrame(function () {\n self.resizeObserverFrame = undefined;\n if (self.disposed) {\n return;\n }\n self.resize(true);\n });\n });\n self.observeResizeTargets();\n };\n self.observeResizeTargets = function () {\n if (!self.resizeObserver) {\n return;\n }\n self.resizeObserver.disconnect();\n self.observedSizes = new Map();\n var host = self.intf && self.intf.nodeType === 1 ? self.intf : self.canvas;\n [host, self.getContainerElement()].forEach(function (target) {\n if (target && target.nodeType === 1) {\n self.resizeObserver.observe(target);\n }\n });\n };\n self.unobserveResizeTargets = function () {\n if (self.resizeObserver) {\n self.resizeObserver.disconnect();\n }\n };\n /**\n * Ends editing, optionally aborting the edit.\n * @memberof canvasDatagrid\n * @name endEdit\n * @method\n * @param {boolean} abort When true, abort the edit.\n */\n self.endEdit = function (abort) {\n var cell = self.input.editCell,\n y = cell.rowIndex,\n // Decide up front whether this is the \"new row\" placeholder. A\n // beforeendedit handler may add or delete rows (#583), which would\n // otherwise make the last real row look like the placeholder.\n isNewRow = y === self.viewData.length;\n function abortEdit() {\n abort = true;\n }\n if (\n self.dispatchEvent('beforeendedit', {\n cell: cell,\n newValue: self.input.value,\n oldValue: cell.value,\n abort: abortEdit,\n input: self.input,\n })\n ) {\n return false;\n }\n if (self.input.value !== cell.value && !abort) {\n // key the change log by the bound (data) row index rather than the\n // view index so sorting/filtering cannot misattribute edits (#418)\n var changeIndex =\n cell.boundRowIndex === undefined ? y : cell.boundRowIndex;\n self.changes[changeIndex] = self.changes[changeIndex] || {};\n self.changes[changeIndex][cell.header.name] = self.input.value;\n if (!cell.data) {\n self.originalData[cell.boundRowIndex] = {};\n cell.data = self.originalData[cell.boundRowIndex];\n }\n cell.data[cell.header.name] = self.input.value;\n if (isNewRow) {\n if (\n self.dispatchEvent('newrow', {\n value: self.input.value,\n defaultValue: cell.value,\n aborted: abort,\n cell: cell,\n input: self.input,\n })\n ) {\n return false;\n }\n self.addRow(cell.data);\n self.createNewRowData();\n }\n self.dispatchDataChanged('edit', {\n cell: cell,\n value: self.input.value,\n });\n self.draw(true);\n }\n if (self.input.parentNode) {\n self.input.parentNode.removeChild(self.input);\n }\n self.intf.focus();\n self.dispatchEvent('endedit', {\n cell: cell,\n value: self.input.value,\n aborted: abort,\n input: self.input,\n });\n self.input = undefined;\n return true;\n };\n /**\n * Begins editing at cell x, row y.\n * @memberof canvasDatagrid\n * @name beginEditAt\n * @method\n * @param {number} x The column index of the cell to edit.\n * @param {number} y The row index of the cell to edit.\n * @param {boolean} inEnterMode If true, starting to type in cell will replace the\n * cell's previous value instead of appending, and using the arrow keys will allow\n * the user to navigate to adjacent cells instead of moving the text cursor around\n * (default is false, and means user is in 'edit' mode).\n */\n self.beginEditAt = function (x, y, NativeEvent, inEnterMode = false) {\n if (!self.attributes.editable) {\n return;\n }\n if (self.input) {\n self.endEdit();\n }\n var cell = self.getVisibleCellByIndex(x, y),\n s = self.getSchema(),\n adjacentCells,\n enumItems,\n enu,\n option,\n valueInEnum;\n if (!(cell && cell.header)) {\n return;\n }\n //HACK for IE10, does not like literal enum\n enu = cell.header['enum'];\n if (\n self.dispatchEvent('beforebeginedit', {\n cell: cell,\n NativeEvent: NativeEvent,\n })\n ) {\n return false;\n }\n self.scrollIntoView(x, y);\n self.setActiveCell(x, y);\n adjacentCells = self.getAdjacentCells();\n if (enu) {\n self.input = document.createElement('select');\n } else {\n self.input = document.createElement(\n self.attributes.multiLine ? 'textarea' : 'input',\n );\n }\n cell = self.getVisibleCellByIndex(x, y);\n //HACK on mobile devices sometimes edit can begin without the cell being in view, I don't know how.\n if (!cell) {\n return;\n }\n if (enu) {\n // add enums\n if (typeof enu === 'function') {\n enumItems = enu.apply(self.intf, [{ cell: cell }]);\n } else if (Array.isArray(enu)) {\n enumItems = enu;\n }\n enumItems.forEach(function (e) {\n var i = document.createElement('option'),\n val,\n title;\n if (Array.isArray(e)) {\n val = e[0];\n title = e[1];\n } else {\n val = e;\n title = e;\n }\n if (val === cell.value) {\n valueInEnum = true;\n }\n i.value = val;\n i.innerHTML = title;\n self.input.appendChild(i);\n });\n if (!valueInEnum) {\n option = document.createElement('option');\n option.value = cell.value;\n option.innerHTML = cell.value;\n self.input.appendChild(option);\n }\n self.input.addEventListener('change', function () {\n self.endEdit();\n self.draw(true);\n });\n }\n // if the user has not prevented the default action, append to the body\n if (\n !self.dispatchEvent('appendeditinput', { cell: cell, input: self.input })\n ) {\n document.body.appendChild(self.input);\n }\n self.createInlineStyle(\n self.input,\n self.mobile\n ? 'canvas-datagrid-edit-mobile-input'\n : 'canvas-datagrid-edit-input',\n );\n self.input.style.position = 'absolute';\n self.input.editCell = cell;\n self.resizeEditInput();\n if (enu && typeof self.input.showPicker === 'function') {\n // open the enum <select> immediately (#230); browsers only allow this\n // from a user gesture, so treat failure as harmless\n try {\n self.input.showPicker();\n } catch (err) {\n // no user activation\n }\n }\n self.input.style.zIndex = self.style.editCellZIndex;\n self.input.style.fontSize =\n parseInt(self.style.editCellFontSize, 10) * self.scale + 'px';\n\n var cellValueIsEmpty = [null, undefined].indexOf(cell.value) !== -1;\n var shouldClearCellValue = cellValueIsEmpty || inEnterMode;\n\n self.input.value = shouldClearCellValue ? '' : cell.value;\n let width = Math.round(\n self.input.value.length *\n parseInt(self.style.editCellFontSize, 10) *\n 0.7 *\n self.scale,\n );\n if (width + self.style.cellPaddingLeft < cell.width) {\n width = cell.width - self.style.cellPaddingLeft;\n } else if (width > self.width - cell.x - self.style.scrollBarWidth) {\n width = self.width - cell.x - self.style.scrollBarWidth;\n self.input.style.height = 'auto';\n }\n self.input.style.width = width + 'px';\n self.input.focus();\n self.input.addEventListener('click', self.stopPropagation);\n self.input.addEventListener('dblclick', self.stopPropagation);\n self.input.addEventListener('mouseup', self.stopPropagation);\n self.input.addEventListener('mousedown', self.stopPropagation);\n self.input.addEventListener('keydown', function (e) {\n var nx = cell.columnIndex,\n ny = cell.rowIndex;\n\n if (e.key === 'Escape') {\n self.endEdit(true); // end edit and abort the value change\n self.draw(true);\n } else if (e.key === 'Enter' && self.attributes.multiLine && e.altKey) {\n self.input.value = self.input.value + '\\n';\n self.input.scrollTop = self.input.scrollHeight;\n } else if (e.key === 'Enter') {\n self.endEdit();\n\n // Move to cell in next or previous row\n var nextRowIndex = e.shiftKey\n ? Math.max(0, ny - 1)\n : Math.min(ny + 1, self.viewData.length - 1);\n\n if (nextRowIndex !== ny) {\n self.scrollIntoView(nx, nextRowIndex);\n self.setActiveCell(nx, nextRowIndex);\n }\n\n self.draw(true);\n } else if (\n ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(e.key) &&\n inEnterMode\n ) {\n switch (e.key) {\n case 'ArrowUp':\n ny = Math.max(0, ny - 1);\n break;\n case 'ArrowDown':\n ny = Math.min(ny + 1, self.viewData.length - 1);\n break;\n case 'ArrowLeft':\n nx = Math.max(nx - 1, 0);\n break;\n case 'ArrowRight':\n nx = adjacentCells.right;\n break;\n }\n\n self.endEdit();\n\n self.scrollIntoView(nx, ny);\n self.setActiveCell(nx, ny);\n\n self.draw(true);\n } else if (e.key === 'Tab') {\n e.preventDefault();\n if (!self.endEdit()) {\n return;\n }\n if (e.shiftKey) {\n nx = adjacentCells.left;\n } else {\n nx = adjacentCells.right;\n }\n if (adjacentCells.left === x && e.shiftKey) {\n nx = adjacentCells.last;\n ny -= 1;\n }\n if (adjacentCells.right === x && !e.shiftKey) {\n nx = adjacentCells.first;\n ny += 1;\n }\n if (ny < 0) {\n ny = self.viewData.length - 1;\n }\n if (ny > self.viewData.length - 1) {\n ny = 0;\n }\n self.scrollIntoView(nx, ny);\n self.beginEditAt(nx, ny, e);\n } else {\n let width = Math.round(\n self.input.value.length *\n parseInt(self.style.editCellFontSize, 10) *\n 0.7 *\n self.scale,\n );\n if (width + self.style.cellPaddingLeft < cell.width) {\n width = cell.width - self.style.cellPaddingLeft;\n } else if (width > self.width - cell.x - self.style.scrollBarWidth) {\n width = self.width - cell.x - self.style.scrollBarWidth;\n self.input.style.height = 'auto';\n }\n self.input.style.width = width + 'px';\n }\n });\n\n self.dispatchEvent('beginedit', { cell: cell, input: self.input });\n };\n self.createInlineStyle = function (el, className) {\n var css = {\n 'canvas-datagrid-button-wrapper': {\n display: 'inline-block',\n padding: self.style.buttonPadding,\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: self.style.buttonBorderColor,\n cursor: 'pointer',\n background: self.style.buttonBackgroundColor,\n userSelect: 'none',\n },\n 'canvas-datagrid-button-wrapper:hover': {\n borderColor: self.style.buttonBorderColor,\n background: self.style.buttonHoverBackgroundColor,\n },\n 'canvas-datagrid-button-wrapper:active': {\n borderColor: self.style.buttonActiveBorderColor,\n background: self.style.buttonActiveBackgroundColor,\n },\n 'canvas-datagrid-button-icon': {\n width: '18px',\n height: '18px',\n display: 'inline-block',\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-button-arrow': {\n display: 'inline-block',\n color: self.style.buttonArrowColor,\n fontSize: '9px',\n },\n 'canvas-datagrid-button-menu-item-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-button-menu-item': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-button-menu-item:hover': {\n background: self.style.contextMenuHoverBackground,\n color: self.style.contextMenuHoverColor,\n },\n 'canvas-datagrid-button-menu-label': {\n margin: self.style.contextMenuLabelMargin,\n display: self.style.contextMenuLabelDisplay,\n minWidth: self.style.contextMenuLabelMinWidth,\n maxWidth: self.style.contextMenuLabelMaxWidth,\n },\n 'canvas-datagrid-button-menu-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n },\n 'canvas-datagrid-button-menu': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n cursor: self.style.contextMenuCursor,\n },\n 'canvas-datagrid-context-menu-filter-input': {\n height: '19px',\n verticalAlign: 'bottom',\n marginLeft: '2px',\n padding: '0',\n background: self.style.contextFilterInputBackground,\n color: self.style.contextFilterInputColor,\n border: self.style.contextFilterInputBorder,\n borderRadius: self.style.contextFilterInputBorderRadius,\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextFilterInputFontFamily,\n fontSize: self.style.contextFilterInputFontSize,\n },\n 'canvas-datagrid-context-menu-filter-button': {\n height: '19px',\n verticalAlign: 'bottom',\n marginLeft: '2px',\n padding: '0',\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextFilterButtonBorder,\n borderRadius: self.style.contextFilterButtonBorderRadius,\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFilterButtonFontFamily,\n fontSize: self.style.contextMenuFilterButtonFontSize,\n },\n 'canvas-datagrid-context-child-arrow': {\n cssFloat: 'right',\n color: self.style.childContextMenuArrowColor,\n fontSize: self.style.contextMenuChildArrowFontSize,\n fontFamily: self.style.contextMenuFontFamily,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-autocomplete': {\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n position: 'absolute',\n zIndex: 9999,\n overflow: 'hidden',\n },\n 'canvas-datagrid-autocomplete-item': {\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n },\n 'canvas-datagrid-autocomplete-item:hover': {\n background: self.style.contextMenuHoverBackground,\n color: self.style.contextMenuHoverColor,\n },\n 'canvas-datagrid-canvas': {\n position: 'absolute',\n zIndex: '-1',\n },\n 'canvas-datagrid': {\n display: 'block',\n },\n 'canvas-datagrid-control-input': {\n position: 'fixed',\n top: '-5px',\n left: '-5px',\n border: 'none',\n opacity: '0',\n cursor: 'pointer',\n width: '1px',\n height: '1px',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n },\n 'canvas-datagrid-edit-mobile-input': {\n boxSizing: 'content-box',\n outline: 'none',\n margin: '0',\n padding: '0 0 0 0',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.mobileEditFontFamily,\n fontSize: self.style.mobileEditFontSize,\n border: self.style.editCellBorder,\n color: self.style.editCellColor,\n background: self.style.editCellBackgroundColor,\n appearance: 'none',\n webkitAppearance: 'none',\n mozAppearance: 'none',\n borderRadius: '0',\n },\n 'canvas-datagrid-edit-input': {\n boxSizing: 'content-box',\n outline: 'none',\n margin: '0',\n padding: '0 0 0 ' + self.style.editCellPaddingLeft + 'px',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.editCellFontFamily,\n fontSize: self.style.editCellFontSize,\n boxShadow: self.style.editCellBoxShadow,\n border: self.style.editCellBorder,\n color: self.style.editCellColor,\n background: self.style.editCellBackgroundColor,\n appearance: 'none',\n webkitAppearance: 'none',\n mozAppearance: 'none',\n borderRadius: '0',\n },\n 'canvas-datagrid-context-menu-item-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-context-menu-item': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-context-menu-item:hover': {\n background: self.style.contextMenuHoverBackground,\n color: self.style.contextMenuHoverColor,\n },\n 'canvas-datagrid-context-menu-label': {\n margin: self.style.contextMenuLabelMargin,\n display: self.style.contextMenuLabelDisplay,\n minWidth: self.style.contextMenuLabelMinWidth,\n maxWidth: self.style.contextMenuLabelMaxWidth,\n },\n 'canvas-datagrid-context-menu-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n },\n 'canvas-datagrid-context-menu': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n cursor: self.style.contextMenuCursor,\n },\n 'canvas-datagrid-invalid-search-regExp': {\n background: self.style.contextMenuFilterInvalidExpresion,\n },\n };\n if (css[className]) {\n Object.keys(css[className]).map(function (prop) {\n el.style[prop] = css[className][prop];\n });\n el.className = className;\n }\n return;\n };\n self.appendTo = function (e) {\n self.parentNode = e;\n self.setDom();\n };\n self.setDom = function () {\n if (self.isChildGrid) {\n self.parentGrid = self.parentNode.parentGrid;\n self.ctx = self.parentGrid.context;\n self.canvas = self.parentGrid.canvas;\n self.controlInput = self.parentGrid.controlInput;\n self.eventParent = self.canvas;\n } else {\n self.controlInput = self.controlInput || document.createElement('input');\n self.controlInput.onblur = self.intf.blur;\n self.createInlineStyle(\n self.controlInput,\n 'canvas-datagrid-control-input',\n );\n self.isChildGrid = false;\n self.parentDOMNode = self.parentNode;\n self.parentIsCanvas = /^canvas$/i.test(self.parentDOMNode.tagName);\n if (self.parentIsCanvas) {\n self.canvas = self.parentDOMNode;\n } else {\n self.canvas = document.createElement('canvas');\n self.parentDOMNode.appendChild(self.canvas);\n }\n document.body.appendChild(self.controlInput);\n self.createInlineStyle(self.canvas, 'canvas-datagrid');\n self.ctx = self.canvas.getContext('2d');\n self.ctx.textBaseline = 'alphabetic';\n self.eventParent = self.canvas;\n }\n self.parentNodeStyle = self.canvas.style;\n self.controlInput.setAttribute('readonly', true);\n self.controlInput.addEventListener('blur', function (e) {\n if (e.target !== self.canvas) {\n self.hasFocus = false;\n }\n });\n self.eventParent.addEventListener('scroll', self.resize, false);\n self.eventParent.addEventListener('touchstart', self.touchstart, {\n passive: true,\n });\n self.eventParent.addEventListener('mousedown', self.mousedown, false);\n self.eventParent.addEventListener('dblclick', self.dblclick, false);\n self.eventParent.addEventListener('click', self.click, false);\n self.eventParent.addEventListener('mouseup', self.mouseup, false);\n window.addEventListener('mouseup', self.mouseupOutsideGrid, false);\n window.addEventListener('mousemove', self.mousemove);\n self[self.isChildGrid ? 'parentGrid' : 'eventParent'].addEventListener(\n 'wheel',\n self.scrollWheel,\n false,\n );\n self.canvas.addEventListener('contextmenu', self.contextmenuEvent, false);\n self.controlInput.addEventListener('copy', self.copy);\n self.controlInput.addEventListener('cut', self.cut);\n self.controlInput.addEventListener('paste', self.paste);\n self.controlInput.addEventListener('keypress', self.keypress, false);\n self.controlInput.addEventListener('keyup', self.keyup, false);\n self.controlInput.addEventListener('keydown', self.keydown, false);\n window.addEventListener('resize', self.resize);\n self.initResizeObserver();\n };\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport { mergeHiddenRowRanges } from './groups/util';\n\nexport default function (self) {\n /**\n * Converts a integer into a letter A - ZZZZZ...\n * @memberof canvasDatagrid\n * @name integerToAlpha\n * @method\n * @param {column} n The number to convert.\n */\n self.integerToAlpha = function (n) {\n var ordA = 'a'.charCodeAt(0),\n ordZ = 'z'.charCodeAt(0),\n len = ordZ - ordA + 1,\n s = '';\n while (n >= 0) {\n s = String.fromCharCode((n % len) + ordA) + s;\n n = Math.floor(n / len) - 1;\n }\n return s;\n };\n /**\n * Inserts a new column before the specified index into the schema.\n * @tutorial schema\n * @memberof canvasDatagrid\n * @name insertColumn\n * @method\n * @param {column} c The column to insert into the schema.\n * @param {number} index The index of the column to insert before.\n */\n self.insertColumn = function (c, index) {\n var s = self.getSchema();\n if (s.length < index) {\n throw new Error('Index is beyond the length of the schema.');\n }\n self.validateColumn(c, s);\n s.splice(index, 0, c);\n\n self.originalData.forEach(function (row, rowIndex) {\n self.applyDefaultValue(row, c, rowIndex);\n });\n self.intf.schema = s;\n\n self.refresh();\n self.dispatchDataChanged('insertcolumn', { column: c, index: index });\n };\n /**\n * Deletes a column from the schema at the specified index.\n * @memberof canvasDatagrid\n * @name deleteColumn\n * @tutorial schema\n * @method\n * @param {number} index The index of the column to delete.\n */\n self.deleteColumn = function (index) {\n var schema = self.getSchema();\n\n // remove data matching this column name from data\n self.originalData.forEach(function (row) {\n delete row[schema[index].name];\n });\n\n schema.splice(index, 1);\n self.intf.schema = schema;\n\n self.refresh();\n self.dispatchDataChanged('deletecolumn', { index: index });\n };\n /**\n * Adds a new column into the schema.\n * @tutorial schema\n * @memberof canvasDatagrid\n * @name addColumn\n * @method\n * @param {column} c The column to add to the schema.\n */\n self.addColumn = function (c) {\n var s = self.getSchema();\n self.validateColumn(c, s);\n s.push(c);\n self.originalData.forEach(function (row, rowIndex) {\n self.applyDefaultValue(row, c, rowIndex);\n });\n self.intf.schema = s;\n\n self.refresh();\n self.dispatchDataChanged('addcolumn', { column: c });\n };\n /**\n * Deletes a row from the dataset at the specified index.\n * @memberof canvasDatagrid\n * @name deleteRow\n * @method\n * @param {number} index The index of the row to delete.\n */\n self.deleteRow = function (index) {\n self.originalData.splice(index, 1);\n self.setFilter();\n self.resize(true);\n self.dispatchDataChanged('deleterow', { index: index });\n };\n /**\n * Inserts a new row into the dataset before the specified index.\n * @memberof canvasDatagrid\n * @name insertRow\n * @method\n * @param {object} d data.\n * @param {number} index The index of the row to insert before.\n */\n self.insertRow = function (d, index) {\n if (self.originalData.length < index) {\n throw new Error('Index is beyond the length of the dataset.');\n }\n self.originalData.splice(index, 0, d);\n self.getSchema().forEach(function (c) {\n if (d[c.name] === undefined) {\n self.applyDefaultValue(self.originalData[index], c, index);\n }\n });\n\n // setFilter calls .refresh(), so we need not call it again:\n self.setFilter();\n\n self.resize(true);\n self.dispatchDataChanged('insertrow', { row: d, index: index });\n };\n /**\n * Adds a new row into the dataset.\n * @memberof canvasDatagrid\n * @name addRow\n * @method\n * @param {object} d data.\n */\n self.addRow = function (d) {\n self.originalData.push(d);\n self.getSchema().forEach(function (c) {\n if (d[c.name] === undefined) {\n self.applyDefaultValue(\n self.originalData[self.originalData.length - 1],\n c,\n self.originalData.length - 1,\n );\n }\n });\n\n // setFilter calls .refresh(), so we need not call it again:\n self.setFilter();\n\n self.resize(true);\n self.dispatchDataChanged('addrow', { row: d });\n };\n /**\n * Sets the height of a given row by index number.\n * @memberof canvasDatagrid\n * @name setRowHeight\n * @method\n * @param {number} rowIndex The index of the row to set.\n * @param {number} height Height to set the row to.\n */\n self.setRowHeight = function (rowIndex, height) {\n self.sizes.rows[rowIndex] = height;\n self.draw(true);\n };\n /**\n * Sets the width of a given column by index number.\n * @memberof canvasDatagrid\n * @name setColumnWidth\n * @method\n * @param {number} colIndex The index of the column to set.\n * @param {number} width Width to set the column to.\n */\n self.setColumnWidth = function (colIndex, width) {\n self.sizes.columns[colIndex] = width;\n self.draw(true);\n };\n /**\n * Removes any changes to the width of the columns due to user or api interaction, setting them back to the schema or style default.\n * @memberof canvasDatagrid\n * @name resetColumnWidths\n * @tutorial schema\n * @method\n */\n self.resetColumnWidths = function () {\n self.sizes.columns = {};\n self.draw(true);\n };\n /**\n * Removes any changes to the height of the rows due to user or api interaction, setting them back to the schema or style default.\n * @memberof canvasDatagrid\n * @name resetRowHeights\n * @tutorial schema\n * @method\n */\n self.resetRowHeights = function () {\n self.sizes.rows = {};\n self.draw(true);\n };\n /**\n * Sets the value of the filter.\n * @memberof canvasDatagrid\n * @name setFilter\n * @method\n * @param {string} column Name of the column to filter.\n * @param {string} value The value to filter for.\n */\n self.setFilter = function (column, value) {\n if (column === undefined && value === undefined) {\n self.columnFilters = {};\n } else if (column && (value === '' || value === undefined)) {\n delete self.columnFilters[column];\n } else {\n self.columnFilters[column] = value;\n if (self.attributes.showFilterInCell) {\n self.filterable.rows.push(0);\n self.orders.columns.forEach(function (value, index) {\n self.filterable.columns.push(index);\n });\n }\n }\n if (!Object.keys(self.columnFilters).length) {\n self.filterable = {\n rows: [],\n columns: [],\n };\n }\n self.refresh();\n };\n /**\n * Returns the number of pixels to scroll down to line up with row rowIndex.\n * @memberof canvasDatagrid\n * @name findRowScrollTop\n * @method\n * @param {number} rowIndex The row index of the row to scroll find.\n */\n self.findRowScrollTop = function (rowIndex) {\n if (self.scrollCache.y[rowIndex] === undefined) {\n throw new RangeError(\n `Row index ${rowIndex} out of range: ${self.scrollCache.y.length}.`,\n );\n }\n return self.scrollCache.y[rowIndex];\n };\n /**\n * Returns the number of pixels to scroll to the left to line up with column columnIndex.\n * @memberof canvasDatagrid\n * @name findColumnScrollLeft\n * @method\n * @param {number} columnIndex The column index of the column to find.\n */\n self.findColumnScrollLeft = function (columnIndex) {\n var i = Math.max(columnIndex - 1, 0);\n if (self.scrollCache.x[i] === undefined) {\n throw new Error('Column index out of range.');\n }\n return (\n self.scrollCache.x[i] -\n self.getColumnWidth(self.orders.columns[columnIndex])\n );\n };\n /**\n * Scrolls to the cell at columnIndex x, and rowIndex y. If you define both rowIndex and columnIndex additional calculations can be made to center the cell using the target cell's height and width. Defining only one rowIndex or only columnIndex will result in simpler calculations.\n * @memberof canvasDatagrid\n * @name gotoCell\n * @method\n * @param {number} x The column index of the cell to scroll to.\n * @param {number} y The row index of the cell to scroll to.\n * @param {number} [offsetX=0] Percentage offset the cell should be from the left edge (not including headers). The default is 0, meaning the cell will appear at the left edge. Valid values are 0 through 1. 1 = Left, 0 = Right, 0.5 = Center.\n * @param {number} [offsetY=0] Percentage offset the cell should be from the top edge (not including headers). The default is 0, meaning the cell will appear at the top edge. Valid values are 0 through 1. 1 = Bottom, 0 = Top, 0.5 = Center.\n */\n self.gotoCell = function (x, y, offsetX, offsetY) {\n var targetX = x === undefined ? undefined : self.findColumnScrollLeft(x),\n targetY = y === undefined ? undefined : self.findRowScrollTop(y),\n cell,\n sbw =\n self.scrollBox.width -\n (self.scrollBox.verticalBarVisible ? self.style.scrollBarWidth : 0),\n sbh =\n self.scrollBox.height -\n (self.scrollBox.horizontalBarVisible ? self.style.scrollBarWidth : 0);\n offsetX = offsetX === undefined ? 0 : offsetX;\n offsetY = offsetY === undefined ? 0 : offsetY;\n targetX -= sbw * offsetX;\n targetY -= sbh * offsetY;\n if (x !== undefined && y !== undefined) {\n self.scrollBox.scrollTo(targetX, targetY);\n if (!offsetX && !offsetY) {\n // nothing to correct; a deferred re-scroll would only undo a scroll\n // the user made in the meantime (#313)\n return;\n }\n requestAnimationFrame(function () {\n cell = self.getVisibleCellByIndex(x, y);\n // HACK: just don't offset if the target cell cannot be seen\n // TODO: offset does not work on very small grids, not sure why\n if (!cell) {\n return;\n }\n targetX += cell.width * offsetX;\n targetY += cell.height * offsetY;\n self.scrollBox.scrollTo(targetX, targetY);\n });\n } else if (x !== undefined) {\n self.scrollBox.scrollLeft = targetX;\n } else if (y !== undefined) {\n self.scrollBox.scrollTop = targetY;\n }\n };\n /**\n * Scrolls the row y.\n * @memberof canvasDatagrid\n * @name gotoRow\n * @method\n * @param {number} y The row index of the cell to scroll to.\n */\n self.gotoRow = function (y) {\n self.gotoCell(0, y);\n };\n /**\n * Add a button into the cell.\n * @memberof canvasDatagrid\n * @name addButton\n * @method\n * @param {number} columnIndex The column index of the cell to to add a button.\n * @param {number} rowIndex The row index of the cell to to add a button.\n * @param {object} offset Offset how far go away from cell.\n * @param {object} items a list of items to add into button menu.\n * @param {string} imgSrc icon path to add into button.\n */\n self.addButton = function (columnIndex, rowIndex, offset, items, imgSrc) {\n var cells = self.visibleCells.filter(function (c) {\n return c.sortColumnIndex === columnIndex && c.sortRowIndex === rowIndex;\n });\n\n self.attachButton(\n {\n top: cells[0].y + cells[0].height + offset.y,\n left: cells[0].x + cells[0].width + offset.x,\n },\n items,\n imgSrc,\n );\n };\n\n /**\n * Expand/Collapse CellTree.\n * @memberof canvasDatagrid\n * @name toggleCellCollapseTree\n * @method\n * @param {array} treeData The array of cellTree to expand or collapse.\n */\n\n self.toggleCellCollapseTree = function (treeData) {\n for (let type in treeData) {\n for (let t of treeData[type])\n if (t.length > 0) self.toggleCollapseTree(t[0], t[1], type);\n }\n self.draw();\n };\n\n /**\n * Expand/Collapse CellTree.\n * @memberof canvasDatagrid\n * @name expandCollapseCellTree\n * @method\n * @param {array} treeData The array of cellTree to expand or collapse.\n */\n\n self.expandCollapseCellTree = function (treeData) {\n for (let type in treeData) {\n for (let t of treeData[type])\n if (t.length > 0) self.cellTreeExpandCollapse(t[0], t[1], type);\n }\n self.draw();\n };\n\n /**\n * Scrolls the cell at cell x, row y into view if it is not already.\n * @memberof canvasDatagrid\n * @name scrollIntoView\n * @method\n * @param {number} x The column index of the cell to scroll into view.\n * @param {number} y The row index of the cell to scroll into view.\n * @param {number} [offsetX=0] Percentage offset the cell should be from the left edge (not including headers). The default is 0, meaning the cell will appear at the left edge. Valid values are 0 through 1. 1 = Left, 0 = Right, 0.5 = Center.\n * @param {number} [offsetY=0] Percentage offset the cell should be from the top edge (not including headers). The default is 0, meaning the cell will appear at the top edge. Valid values are 0 through 1. 1 = Bottom, 0 = Top, 0.5 = Center.\n */\n self.scrollIntoView = function (x, y, offsetX, offsetY) {\n const matched = self.visibleCells.filter(function (cell) {\n return (\n (cell.rowIndex === y || y === undefined) &&\n (cell.columnIndex === x || x === undefined) &&\n cell.x > 0 &&\n cell.y > 0 &&\n cell.x + cell.width < self.width &&\n cell.y + cell.height < self.height\n );\n });\n if (matched.length === 1 && x !== undefined && y !== undefined) {\n // goto specific cell and its part be hidden by header\n if (\n matched[0].x < self.getRowHeaderCellWidth() ||\n matched[0].y < self.getColumnHeaderCellHeight()\n )\n matched.length = 0;\n }\n if (matched.length === 0) {\n self.gotoCell(x, y, offsetX, offsetY);\n }\n };\n /**\n * Sets the active cell. Requires redrawing.\n * @memberof canvasDatagrid\n * @name setActiveCell\n * @method\n * @param {number} x The column index of the cell to set active.\n * @param {number} y The row index of the cell to set active.\n */\n self.setActiveCell = function (x, y) {\n if (typeof x === 'undefined') return;\n if (x < 0) {\n x = 0;\n }\n if (y < 0) {\n y = 0;\n }\n self.activeCell = {\n rowIndex: y,\n columnIndex: x,\n };\n self.dispatchEvent('activecellchanged', {\n cell: self.activeCell,\n });\n };\n\n /**\n * Dispatches `datachanged` with the source of the change so listeners can\n * react to edits, pastes, deletions and row/column changes, not only to the\n * data setter (#250, #512).\n * @param {string} source One of data, edit, paste, cut, delete, fill, addrow, insertrow, deleterow, addcolumn, insertcolumn, deletecolumn.\n * @param {object} [details] Extra event details.\n */\n self.dispatchDataChanged = function (source, details) {\n self.dispatchEvent(\n 'datachanged',\n Object.assign({ data: self.originalData, source: source }, details || {}),\n );\n };\n /**\n * Dispatches the `resizerow` event with one consistent payload (#503).\n * Canonical keys: `rowIndex`, `height`, `width`, `x`, `y`, `draggingItem`,\n * `NativeEvent`. `cellHeight` and `row` are kept as deprecated aliases of\n * `height` for listeners written against older versions.\n * @param {object} details Event details; `height` is required.\n * @returns {boolean} true when a listener called preventDefault.\n */\n self.dispatchResizeRow = function (details) {\n var ev = Object.assign({}, details);\n if (ev.y === undefined) {\n ev.y = ev.height;\n }\n ev.cellHeight = ev.height;\n ev.row = ev.height;\n return self.dispatchEvent('resizerow', ev);\n };\n /**\n * Collapse a tree grid by row index.\n * @memberof canvasDatagrid\n * @name collapseTree\n * @method\n * @param {number} index The index of the row to collapse.\n */\n self.collapseTree = function (rowIndex) {\n self.dispatchEvent('collapsetree', {\n childGrid: self.childGrids[rowIndex],\n data: self.viewData[rowIndex],\n rowIndex: rowIndex,\n });\n self.openChildren[rowIndex].blur();\n self.openChildren[rowIndex].dispose();\n delete self.openChildren[rowIndex];\n delete self.sizes.trees[rowIndex];\n delete self.childGrids[rowIndex];\n self.dispatchResizeRow({\n height: self.style.cellHeight,\n rowIndex: rowIndex,\n });\n self.resize(true);\n self.draw(true);\n };\n /**\n * Expands a tree grid by row index.\n * @memberof canvasDatagrid\n * @name expandTree\n * @method\n * @param {number} index The index of the row to expand.\n */\n self.expandTree = function (rowIndex) {\n // copy so the caller's object is not mutated; `self.args` is empty in\n // web-component mode, the value lives on the instance (#444)\n var trArgs = Object.assign({}, self.treeGridAttributes || {}),\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth =\n self.sizes.columns.cornerCell || self.style.rowHeaderCellWidth,\n h = self.sizes.trees[rowIndex] || self.style.treeGridHeight,\n treeGrid;\n if (!self.childGrids[rowIndex]) {\n trArgs.debug = self.attributes.debug;\n trArgs.name = self.attributes.saveAppearance\n ? self.attributes.name + 'tree' + rowIndex\n : undefined;\n trArgs.style = trArgs.style || self.style;\n trArgs.parentNode = {\n parentGrid: self.intf,\n nodeType: 'canvas-datagrid-tree',\n offsetHeight: h,\n offsetWidth: self.width - rowHeaderCellWidth,\n header: { width: self.width - rowHeaderCellWidth },\n offsetLeft: rowHeaderCellWidth,\n offsetTop: columnHeaderCellHeight,\n offsetParent: self.intf.parentNode,\n parentNode: self.intf.parentNode,\n style: 'tree',\n data: self.viewData[rowIndex],\n };\n treeGrid = self.createGrid(trArgs);\n self.childGrids[rowIndex] = treeGrid;\n }\n treeGrid = self.childGrids[rowIndex];\n treeGrid.visible = true;\n self.dispatchEvent('expandtree', {\n treeGrid: treeGrid,\n data: self.viewData[rowIndex],\n rowIndex: rowIndex,\n });\n self.openChildren[rowIndex] = treeGrid;\n self.sizes.trees[rowIndex] = h;\n self.dispatchResizeRow({\n height: self.style.cellHeight,\n rowIndex: rowIndex,\n });\n self.resize(true);\n };\n /**\n * Toggles tree grid open and close by row index.\n * @memberof canvasDatagrid\n * @name toggleTree\n * @method\n * @param {number} index The index of the row to toggle.\n */\n self.toggleTree = function (rowIndex) {\n var i = self.openChildren[rowIndex];\n if (i) {\n return self.collapseTree(rowIndex);\n }\n self.expandTree(rowIndex);\n };\n /**\n * Returns a header from the schema by name.\n * @memberof canvasDatagrid\n * @name getHeaderByName\n * @tutorial schema\n * @method\n * @returns {header} header with the selected name, or undefined.\n * @param {string} name The name of the column to resize.\n */\n self.getHeaderByName = function (name) {\n var x,\n i = self.getSchema();\n for (x = 0; x < i.length; x += 1) {\n if (i[x].name === name) {\n return i[x];\n }\n }\n };\n /**\n * Hide column/columns\n * @memberof canvasDatagrid\n * @name hideColumns\n * @method\n * @param {number} beginColumnOrderIndex The begin column order index\n * @param {number} [endColumnOrderIndex] The end column order index\n */\n self.hideColumns = function (beginColumnOrderIndex, endColumnOrderIndex) {\n const schema = self.getSchema();\n const orders = self.orders.columns;\n const hiddenColumns = [];\n if (typeof endColumnOrderIndex !== 'number')\n endColumnOrderIndex = beginColumnOrderIndex;\n for (\n let orderIndex = beginColumnOrderIndex;\n orderIndex <= endColumnOrderIndex;\n orderIndex++\n ) {\n const columnIndex = orders[orderIndex];\n if (columnIndex >= 0 && !schema[columnIndex].hidden) {\n hiddenColumns.push(columnIndex);\n schema[columnIndex].hidden = true;\n\n self.dispatchEvent('columnhide', {\n columnIndex,\n });\n }\n }\n\n if (hiddenColumns.length > 0) {\n self.setStorageData();\n setTimeout(function () {\n self.resize(true);\n }, 10);\n }\n\n self.dispatchEvent('hidecolumns', {\n hiddenColumns,\n });\n };\n /**\n * Unihde column/columns\n * @memberof canvasDatagrid\n * @name unhideColumns\n * @method\n * @param {number} beginColumnOrderIndex The begin column order index\n * @param {number} [endColumnOrderIndex] The end column order index\n */\n self.unhideColumns = function (beginColumnOrderIndex, endColumnOrderIndex) {\n const orders = self.orders.columns;\n const schema = self.getSchema();\n\n for (let i = beginColumnOrderIndex; i <= endColumnOrderIndex; i++) {\n const columnIndex = orders[i];\n const s = schema[columnIndex];\n\n if (s && s.hidden) {\n s.hidden = false;\n\n self.dispatchEvent('columnunhide', {\n columnIndex,\n });\n }\n }\n self.refresh();\n };\n /**\n * Hide rows\n * @memberof canvasDatagrid\n * @name hideRows\n * @method\n * @param {number} beginRowIndex The begin row index\n * @param {number} endRowIndex The end row index\n */\n self.hideRows = function (beginRowIndex, endRowIndex) {\n if (\n mergeHiddenRowRanges(self.hiddenRowRanges, [beginRowIndex, endRowIndex])\n )\n self.refresh();\n };\n /**\n * Unhide rows\n * @memberof canvasDatagrid\n * @name unhideRows\n * @method\n * @param {number} beginRowIndex The begin row index\n * @param {number} endRowIndex The end row index\n */\n self.unhideRows = function (beginRowIndex, endRowIndex) {\n self.hiddenRowRanges = self.hiddenRowRanges.filter(\n (range) => range[0] !== beginRowIndex || range[1] !== endRowIndex,\n );\n self.refresh();\n };\n /**\n * Resizes a column to fit the longest value in the column. Call without a value to resize all columns.\n * Warning, can be slow on very large record sets (1m records ~3-5 seconds on an i7).\n * @memberof canvasDatagrid\n * @name fitColumnToValues\n * @method\n * @param {string} name The name of the column to resize.\n */\n self.fitColumnToValues = function (name, internal) {\n if (!self.canvas) {\n return;\n }\n\n if (name === undefined) {\n // fit every column, as documented (#193)\n self.getSchema().forEach(function (column) {\n self.fitColumnToValues(column.name, true);\n });\n if (!internal) {\n self.resize();\n self.draw(true);\n }\n return;\n }\n\n const header = name === 'cornerCell' ? null : self.getHeaderByName(name);\n if (name !== 'cornerCell' && !header) {\n console.warn('fitColumnToValues: no column named %s', name);\n return;\n }\n const columnIndex = name === 'cornerCell' ? -1 : header.index;\n\n const newSize = Math.max(\n self.findColumnMaxTextLength(name),\n self.style.minColumnWidth,\n );\n\n self.sizes.columns[columnIndex] = newSize;\n\n self.dispatchEvent('resizecolumn', {\n x: newSize,\n y: self.resizingStartingHeight,\n draggingItem: self.currentCell,\n });\n\n if (!internal) {\n self.resize();\n self.draw(true);\n }\n };\n /**\n * Checks if a cell is currently visible.\n * @memberof canvasDatagrid\n * @name isCellVisible\n * @overload\n * @method\n * @returns {boolean} when true, the cell is visible, when false the cell is not currently drawn.\n * @param {number} columnIndex The column index of the cell to check.\n * @param {number} rowIndex The row index of the cell to check.\n */\n self.isCellVisible = function (cell, rowIndex) {\n // overload\n if (rowIndex !== undefined) {\n return (\n self.visibleCells.filter(function (c) {\n return c.columnIndex === cell && c.rowIndex === rowIndex;\n }).length > 0\n );\n }\n var x,\n l = self.visibleCells.length;\n for (x = 0; x < l; x += 1) {\n if (\n cell.x === self.visibleCells[x].x &&\n cell.y === self.visibleCells[x].y\n ) {\n return true;\n }\n }\n return false;\n };\n /**\n * Sets the order of the data.\n * @memberof canvasDatagrid\n * @name order\n * @method\n * @param {number} columnName Name of the column to be sorted.\n * @param {string} direction `asc` for ascending or `desc` for descending.\n * @param {function} [sortFunction] When defined, override the default sorting method defined in the column's schema and use this one.\n * @param {bool} [dontSetStorageData] Don't store this setting for future use.\n */\n self.order = function (\n columnName,\n direction,\n sortFunction,\n dontSetStorageData,\n ) {\n if (!self.attributes.allowSorting) {\n self.refresh();\n return;\n }\n var f,\n c = self.getSchema().filter(function (col) {\n return col.name === columnName;\n });\n if (\n self.dispatchEvent('beforesortcolumn', {\n name: columnName,\n direction: direction,\n })\n ) {\n return;\n }\n self.orderBy = columnName;\n self.orderDirection = direction;\n if (!self.viewData || self.viewData.length === 0) {\n return;\n }\n if (c.length === 0) {\n throw new Error('Cannot sort. No such column name');\n }\n f = sortFunction || c[0].sorter || self.sorters[c[0].type];\n if (!f && c[0].type !== undefined) {\n console.warn(\n 'Cannot sort type \"%s\" falling back to string sort.',\n c[0].type,\n );\n }\n self.orderings.add(\n columnName,\n direction,\n typeof f === 'function' ? f : self.sorters.string,\n );\n self.refresh();\n self.dispatchEvent('sortcolumn', {\n name: columnName,\n direction: direction,\n });\n\n if (dontSetStorageData) {\n return;\n }\n self.setStorageData();\n };\n\n /**\n * Add grouping\n * @param {'columns'|'rows'} groupFor\n * @method\n * @param {number} from\n * @param {number} to\n */\n function addGroup(groupFor, from, to) {\n let newRow = false;\n const allGroups =\n groupFor === 'rows' ? self.groupedRows : self.groupedColumns;\n for (let i = allGroups.length - 1; i >= 0; i--) {\n const groups = allGroups[i];\n const min = groups[0].from,\n max = groups[groups.length - 1].to;\n if (from <= min && to >= max) {\n if (from === min && to === max && groups.length === 1) return; // nothings happened\n // new group wrap this row\n continue;\n }\n for (let gi = 0; gi < groups.length; gi++) {\n const g = groups[gi];\n if (from > g.to) continue;\n if (from >= g.from) {\n if (to > g.to) {\n if (from === g.from) {\n allGroups.splice(i, 0, [{ from, to, collapsed: false }]);\n self.refresh();\n return;\n }\n throw new Error(`Can't group these ${groupFor}`);\n }\n if (to === g.to) {\n if (from === g.from) return; // nothings happened\n }\n newRow = true;\n break;\n }\n if (to >= g.from) {\n if (to < g.to) throw new Error(`Can't group these ${groupFor}`);\n allGroups.splice(i, 0, [{ from, to, collapsed: false }]);\n } else {\n groups.splice(gi, 0, { from, to, collapsed: false });\n }\n self.refresh();\n return;\n }\n if (newRow) continue;\n groups.push({ from, to, collapsed: false });\n self.refresh();\n return;\n }\n if (newRow) allGroups.push([{ from, to, collapsed: false }]);\n else allGroups.unshift([{ from, to, collapsed: false }]);\n self.refresh();\n }\n /**\n * Remove grouping\n * @param {Array<Array<{from:number,to:number,collapsed:boolean}>>} allGroups\n * @method\n * @param {number} from\n * @param {number} to\n */\n function removeGroup(allGroups, from, to) {\n for (let i = 0; i < allGroups.length; i++) {\n const groups = allGroups[i];\n for (let gi = 0; gi < groups.length; gi++) {\n const group = groups[gi];\n if (group.from === from && group.to === to) {\n if (groups.length <= 1) allGroups.splice(i, 1);\n else groups.splice(gi, 1);\n self.refresh();\n return;\n }\n }\n }\n }\n /**\n * Grouping columns\n * @memberof canvasDatagrid\n * @name groupColumns\n * @method\n * @param {number|string} firstColumnName Name of the first column to be grouped.\n * @param {number|string} lastColumnName Name of the last column to be grouped.\n */\n self.groupColumns = function (firstColumnName, lastColumnName) {\n /** @type {Array<{name: string,columnIndex:number}>} */\n const schema = self.getSchema();\n let firstOne, lastOne;\n for (let i = 0; i < schema.length; i++) {\n const it = schema[i];\n if (firstOne && lastOne) break;\n if (it.name === firstColumnName) {\n firstOne = it;\n continue;\n }\n if (it.name === lastColumnName) {\n lastOne = it;\n continue;\n }\n }\n if (!firstOne) throw new Error(`No such column name for first column`);\n if (!lastOne) throw new Error(`No such column name for last column`);\n if (lastOne.columnIndex > firstOne.columnIndex !== true)\n throw new Error(`Can't group these columns`);\n\n const from = firstOne.columnIndex;\n const to = lastOne.columnIndex;\n const ev = { group: { type: 'columns', from, to } };\n try {\n addGroup('columns', from, to);\n } catch (error) {\n ev.error = error;\n }\n self.dispatchEvent('aftercreategroup', ev);\n };\n /**\n * Grouping columns\n * @memberof canvasDatagrid\n * @name groupRows\n * @method\n * @param {number} rowIndexFrom The row index which is the beginning of the group\n * @param {number} rowIndexTo The row index which is the end of the group\n */\n self.groupRows = function (rowIndexFrom, rowIndexTo) {\n if (!Number.isInteger(rowIndexFrom) || rowIndexFrom < 0)\n throw new Error(`No such row for the beginning of the group`);\n\n const dataLength = self.viewData.length;\n if (\n !Number.isInteger(rowIndexFrom) ||\n rowIndexTo <= rowIndexFrom ||\n rowIndexTo >= dataLength\n )\n throw new Error(`No such row for the end of the group`);\n const ev = {\n group: {\n type: 'rows',\n from: rowIndexFrom,\n to: rowIndexTo,\n },\n };\n try {\n addGroup('rows', rowIndexFrom, rowIndexTo);\n } catch (error) {\n ev.error = error;\n }\n self.dispatchEvent('aftercreategroup', ev);\n };\n /**\n * Remove grouping columns\n * @memberof canvasDatagrid\n * @name removeGroupColumns\n * @method\n * @param {number|string} firstColumnName Name of the first column to be grouped.\n * @param {number|string} lastColumnName Name of the last column to be grouped.\n */\n self.removeGroupColumns = function (firstColumnName, lastColumnName) {\n /** @type {Array<{name:string,columnIndex:number}>} */\n const schema = self.getSchema();\n let firstOne, lastOne;\n for (let i = 0; i < schema.length; i++) {\n const it = schema[i];\n if (firstOne && lastOne) break;\n if (it.name === firstColumnName) {\n firstOne = it;\n continue;\n }\n if (it.name === lastColumnName) {\n lastOne = it;\n continue;\n }\n }\n if (!firstOne) throw new Error(`No such column name for first column`);\n if (!lastOne) throw new Error(`No such column name for last column`);\n const from = firstOne.columnIndex;\n const to = lastOne.columnIndex;\n removeGroup(self.groupedColumns, from, to);\n };\n /**\n * Remove grouping columns\n * @memberof canvasDatagrid\n * @name removeGroupRows\n * @method\n * @param {number} rowIndexFrom The row index which is the beginning of the group\n * @param {number} rowIndexTo The row index which is the end of the group\n */\n self.removeGroupRows = function (rowIndexFrom, rowIndexTo) {\n removeGroup(self.groupedRows, rowIndexFrom, rowIndexTo);\n };\n /**\n * Toggle(expand/collapsed) grouping columns\n * @memberof canvasDatagrid\n * @name toggleGroupColumns\n * @method\n * @param {number|string} firstColumnName Name of the first column to be grouped.\n * @param {number|string} lastColumnName Name of the last column to be grouped.\n */\n self.toggleGroupColumns = function (firstColumnName, lastColumnName) {\n /** @type {Array<{name:string,columnIndex:number}>} */\n const schema = self.getSchema();\n let firstOne, lastOne;\n for (let i = 0; i < schema.length; i++) {\n const it = schema[i];\n if (firstOne && lastOne) break;\n if (it.name === firstColumnName) {\n firstOne = it;\n continue;\n }\n if (it.name === lastColumnName) {\n lastOne = it;\n continue;\n }\n }\n if (!firstOne || !lastOne) return;\n const from = firstOne.columnIndex;\n const to = lastOne.columnIndex;\n if (self.toggleGroup({ type: 'c', from, to })) {\n self.disposeContextMenu();\n self.setStorageData();\n self.refresh();\n }\n };\n /**\n * Toggle(expand/collapsed) grouping rows\n * @memberof canvasDatagrid\n * @name toggleGroupRows\n * @method\n * @param {number} rowIndexFrom The row index which is the beginning of the group\n * @param {number} rowIndexTo The row index which is the end of the group\n */\n self.toggleGroupRows = function (rowIndexFrom, rowIndexTo) {\n if (self.toggleGroup({ type: 'r', from: rowIndexFrom, to: rowIndexTo })) {\n self.disposeContextMenu();\n self.setStorageData();\n self.refresh();\n }\n };\n\n self.isInGrid = function (e) {\n if (e.x < 0 || e.x > self.width || e.y < 0 || e.y > self.height) {\n return false;\n }\n return true;\n };\n\n /**\n * Moves data in the provided selection to another position in the grid. Moving data off the edge of the schema (columns/x) will truncate data.\n * @memberof canvasDatagrid\n * @name moveTo\n * @method\n * @param {array} sel 2D array representing selected rows and columns. `canvasDatagrid.selections` is in this format and can be used here.\n * @param {number} x The column index to start inserting the selection at.\n * @param {number} y The row index to start inserting the selection at.\n */\n self.moveTo = function (sel, x, y) {\n // TODO: optimize this function,\n // we just transform the `sel` to obselete selection matrix\n sel = self.getObsoleteSelectionMatrix(sel);\n\n // TODO: this function is not migrated done\n var selectedData = self.getSelectedData(),\n visibleSchema = self.getVisibleSchema(),\n selectionLength = sel.length,\n xi,\n maxRowLength = -Infinity,\n minXi = Infinity,\n yi = y - 1;\n\n sel.forEach(function (row, rowIndex) {\n if (rowIndex === selectionLength) {\n return;\n }\n if (row.length === 0) {\n return;\n }\n minXi = Math.min(self.getVisibleColumnIndexOf(x), minXi);\n maxRowLength = Math.max(maxRowLength, row.length);\n row.forEach(function (colIndex) {\n // intentional redef of colIndex\n colIndex = self.getVisibleColumnIndexOf(colIndex);\n if (!visibleSchema[colIndex]) {\n return;\n }\n // TODO:\n if (!self.data) {\n self.data = {};\n }\n if (!self.data[rowIndex]) {\n self.data[rowIndex] = {};\n }\n // TODO:\n self.data[rowIndex][visibleSchema[colIndex].name] = null;\n });\n });\n\n sel.forEach(function (row, index) {\n var lastSourceIndex;\n yi += 1;\n xi = self.getVisibleColumnIndexOf(x);\n row.forEach(function (colIndex, cidx) {\n colIndex = self.getVisibleColumnIndexOf(colIndex);\n if (cidx > 0) {\n // this confusing bit of nonsense figures out\n // if the selection has skipped cells\n xi += colIndex - lastSourceIndex;\n }\n lastSourceIndex = colIndex;\n if (\n colIndex === -1 ||\n !visibleSchema[xi] ||\n !visibleSchema[colIndex] ||\n // TODO:\n self.data.length - 1 < yi ||\n yi < 0\n ) {\n return;\n }\n // TODO:\n if (!self.data[yi]) {\n self.data[yi] = {};\n }\n // TODO:\n self.data[yi][visibleSchema[xi].name] =\n selectedData[index][visibleSchema[colIndex].name];\n });\n });\n };\n /**\n * Get the column group info given column belongs to\n * @memberof canvasDatagrid\n * @name getGroupsColumnBelongsTo\n * @method\n * @param {number} columnIndex Column index.\n * @returns {Array<{from:number,to:number,collapsed:boolean}>}\n */\n self.getGroupsColumnBelongsTo = function (columnIndex) {\n if (!self.attributes.allowGroupingColumns) return [];\n const result = [];\n for (let i = 0; i < self.groupedColumns.length; i++) {\n const groups = self.groupedColumns[i];\n for (let j = 0; j < groups.length; j++) {\n const group = groups[j];\n if (columnIndex >= group.from && columnIndex <= group.to) {\n result.push(group);\n break;\n }\n }\n }\n return result;\n };\n /**\n * Get the row group info given row belongs to\n * @memberof canvasDatagrid\n * @name getGroupsRowBelongsTo\n * @method\n * @param {number} rowIndex Row index.\n * @returns {Array<{from:number,to:number,collapsed:boolean}>}\n */\n self.getGroupsRowBelongsTo = function (rowIndex) {\n if (!self.attributes.allowGroupingRows) return [];\n const result = [];\n for (let i = 0; i < self.groupedRows.length; i++) {\n const groups = self.groupedRows[i];\n for (let j = 0; j < groups.length; j++) {\n const group = groups[j];\n if (rowIndex >= group.from && rowIndex <= group.to) {\n result.push(group);\n break;\n }\n }\n }\n return result;\n };\n\n /**\n * Checks if a given column is visible.\n * @memberof canvasDatagrid\n * @name isColumnVisible\n * @method\n * @returns {boolean} When true, the column is visible.\n * @param {number} columnIndex Column index.\n */\n self.isColumnVisible = function (columnIndex) {\n return (\n self.visibleCells.filter(function (c) {\n return c.columnIndex === columnIndex;\n }).length > 0\n );\n };\n /**\n * Checks if a given row is visible.\n * @memberof canvasDatagrid\n * @name isRowVisible\n * @method\n * @returns {boolean} When true, the row is visible.\n * @param {number} rowIndex Row index.\n */\n self.isRowVisible = function (rowIndex) {\n return (\n self.visibleCells.filter(function (c) {\n return c.rowIndex === rowIndex;\n }).length > 0\n );\n };\n /**\n * Gets the cell at columnIndex and rowIndex.\n * @memberof canvasDatagrid\n * @name getVisibleCellByIndex\n * @method\n * @returns {cell} cell at the selected location.\n * @param {number} x Column index.\n * @param {number} y Row index.\n */\n self.getVisibleCellByIndex = function (x, y) {\n return self.visibleCells.filter(function (c) {\n return c.columnIndex === x && c.rowIndex === y;\n })[0];\n };\n /**\n * Get an unhide indicator at grid pixel coordinate x and y.\n * @memberof canvasDatagrid\n * @name getUnhideIndicator\n * @method\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getUnhideIndicator = function (x, y) {\n const indicators = self.visibleUnhideIndicators;\n if (indicators.length <= 0) return;\n for (let i = 0; i < indicators.length; i++) {\n const indicator = indicators[i];\n if (\n x >= indicator.x &&\n y >= indicator.y &&\n x <= indicator.x2 &&\n y <= indicator.y2\n )\n return indicator;\n }\n };\n /**\n * Get a column group at grid pixel coordinate x and y.\n * @memberof canvasDatagrid\n * @name getColumnGroupAt\n * @method\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getColumnGroupAt = function (x, y) {\n const groups = self.groupedColumns.length;\n if (groups <= 0) return;\n const yZero = self.getColumnGroupAreaHeight();\n if (y >= yZero) return;\n for (let i = 0; i < self.visibleGroups.length; i++) {\n const g = self.visibleGroups[i];\n if (g.type !== 'c') continue;\n if (x >= g.x && y >= g.y && x <= g.x2 && y <= g.y2) return g;\n }\n };\n /**\n * Get a row group at grid pixel coordinate x and y.\n * @memberof canvasDatagrid\n * @name getRowGroupAt\n * @method\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getRowGroupAt = function (x, y) {\n const groups = self.groupedRows.length;\n if (groups <= 0) return;\n const xZero = self.getRowGroupAreaWidth();\n if (x >= xZero) return;\n for (let i = 0; i < self.visibleGroups.length; i++) {\n const g = self.visibleGroups[i];\n if (g.type !== 'r') continue;\n if (x >= g.x && y >= g.y && x <= g.x2 && y <= g.y2) return g;\n }\n };\n /**\n * Gets the cell at grid pixel coordinate x and y. Author's note. This function ties drawing and events together. This is a very complex function and is core to the component.\n * @memberof canvasDatagrid\n * @name getCellAt\n * @method\n * @returns {cell} cell at the selected location.\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getCellAt = function (x, y, useTouchScrollZones) {\n function getBorder(entitiy) {\n if (\n entitiy.x + entitiy.width - self.attributes.borderResizeZone * 0.4 <\n x &&\n entitiy.x + entitiy.width + self.attributes.borderResizeZone * 0.6 > x\n ) {\n return 'r';\n }\n if (\n entitiy.x - self.attributes.borderResizeZone * 0.4 < x &&\n entitiy.x + self.attributes.borderResizeZone * 0.6 > x\n ) {\n return 'l';\n }\n if (\n entitiy.y + entitiy.height - self.attributes.borderResizeZone * 0.4 <\n y &&\n entitiy.y + entitiy.height + self.attributes.borderResizeZone * 0.6 > y\n ) {\n return 'b';\n }\n if (\n entitiy.y - self.attributes.borderResizeZone * 0.4 < y &&\n entitiy.y + self.attributes.borderResizeZone * 0.6 > y\n ) {\n return 't';\n }\n }\n if (!self.visibleCells) {\n return;\n }\n x -= self.getRowGroupAreaWidth();\n y -= self.getColumnGroupAreaHeight();\n\n if (self.dragStartObject !== undefined) {\n if (x <= 0) x = 1;\n if (x >= self.width) x = self.width - 1;\n if (y <= 0) y = 1;\n if (y >= self.height) y = self.height - 1;\n }\n\n var border,\n tsz = useTouchScrollZones ? self.attributes.touchScrollZone : 0,\n moveMode = self.attributes.borderDragBehavior === 'move',\n i,\n l = self.visibleCells.length,\n moveBorder,\n xBorderBehavior = moveMode ? self.cursorGrab : 'ew-resize',\n yBorderBehavior = moveMode ? self.cursorGrab : 'ns-resize',\n cell,\n entitiy;\n if (!self.visibleCells || !self.visibleCells.length) {\n return;\n }\n self.hasFocus = true;\n if (!(y < self.height && y > 0 && x < self.width && x > 0)) {\n self.hasFocus = false;\n return {\n dragContext: 'inherit',\n context: 'inherit',\n };\n }\n for (i = 0; i < l; i += 1) {\n cell = self.visibleCells[i];\n // interactive dimensions of the cell. used for touch \"over size\" zones\n entitiy = {\n x: cell.x,\n y: cell.y,\n height: cell.height,\n width: cell.width,\n };\n if (\n useTouchScrollZones &&\n /(vertical|horizontal)-scroll-/.test(cell.style)\n ) {\n entitiy.x -= tsz;\n entitiy.y -= tsz;\n entitiy.height += tsz;\n entitiy.width += tsz;\n }\n if (\n entitiy.x - self.style.cellBorderWidth < x &&\n entitiy.x + entitiy.width + self.style.cellBorderWidth > x &&\n entitiy.y - self.style.cellBorderWidth < y &&\n entitiy.y + entitiy.height + self.style.cellBorderWidth > y\n ) {\n if (/frozen-row-marker/.test(cell.style)) {\n if (self.dragMode === 'frozen-column-marker') continue;\n cell.dragContext = cell.style;\n cell.context = 'grab';\n return cell;\n }\n if (/frozen-column-marker/.test(cell.style)) {\n if (self.dragMode === 'frozen-row-marker') continue;\n cell.dragContext = cell.style;\n cell.context = 'grab';\n return cell;\n }\n if (/selection-handle-/.test(cell.style)) {\n cell.dragContext = cell.style;\n cell.context = 'crosshair';\n return cell;\n }\n if (/vertical-scroll-(bar|box)/.test(cell.style)) {\n cell.dragContext = 'vertical-scroll-box';\n cell.context = 'vertical-scroll-box';\n cell.isScrollBar = true;\n cell.isVerticalScrollBar = true;\n if (y > self.scrollBox.box.v.y + self.scrollBox.scrollBoxHeight) {\n cell.dragContext = 'vertical-scroll-bottom';\n cell.context = 'vertical-scroll-bottom';\n } else if (y < self.scrollBox.box.v.y) {\n cell.dragContext = 'vertical-scroll-top';\n cell.context = 'vertical-scroll-top';\n }\n self.cursor = 'default';\n return cell;\n }\n if (/horizontal-scroll-(bar|box)/.test(cell.style)) {\n cell.dragContext = 'horizontal-scroll-box';\n cell.context = 'horizontal-scroll-box';\n cell.isScrollBar = true;\n cell.isHorizontalScrollBar = true;\n if (x > self.scrollBox.box.h.x + self.scrollBox.scrollBoxWidth) {\n cell.dragContext = 'horizontal-scroll-right';\n cell.context = 'horizontal-scroll-right';\n } else if (x < self.scrollBox.box.h.x) {\n cell.dragContext = 'horizontal-scroll-left';\n cell.context = 'horizontal-scroll-left';\n }\n self.cursor = 'default';\n return cell;\n }\n border = getBorder(entitiy);\n // check if the border of this cell is the border of the selection and if so show move cursor in move mode\n moveBorder =\n moveMode &&\n cell.selectionBorder &&\n cell.selectionBorder.indexOf(border) !== -1;\n if (\n ['l', 'r'].indexOf(border) !== -1 &&\n (self.attributes.allowColumnResize || moveBorder) &&\n !(\n self.attributes.fillLastColumn &&\n border === 'r' &&\n cell.sortColumnIndex === self.getLastVisibleColumnIndex()\n ) &&\n ((self.attributes.allowColumnResizeFromCell && cell.isNormal) ||\n !cell.isNormal ||\n moveBorder) &&\n ((self.attributes.allowRowHeaderResize &&\n (cell.isRowHeader || cell.isCorner)) ||\n !(cell.isRowHeader && cell.isCorner))\n ) {\n if (\n (cell.isColumnHeader ||\n cell.isCorner ||\n (self.attributes.allowColumnResizeFromCell && cell.isNormal)) &&\n border === 'r'\n ) {\n cell.context = 'ew-resize';\n cell.dragContext = 'ew-resize';\n return cell;\n }\n if (!(cell.isColumnHeader || cell.isCorner) && moveBorder) {\n cell.context = xBorderBehavior;\n cell.dragContext = border + '-move';\n return cell;\n }\n }\n if (\n ['t', 'b'].indexOf(border) !== -1 &&\n cell.rowIndex > -1 &&\n (self.attributes.allowRowResize || moveBorder) &&\n ((self.attributes.allowRowResizeFromCell && cell.isNormal) ||\n !cell.isNormal ||\n moveBorder) &&\n !cell.isColumnHeader\n ) {\n if (\n (cell.isRowHeader ||\n cell.isCorner ||\n (self.attributes.allowRowResizeFromCell && cell.isNormal)) &&\n border === 'b'\n ) {\n cell.context = 'ns-resize';\n cell.dragContext = 'ns-resize';\n return cell;\n }\n if (!(cell.isRowHeader || cell.isCorner) && moveBorder) {\n cell.context = yBorderBehavior;\n cell.dragContext = border + '-move';\n return cell;\n }\n }\n if (cell.style === 'columnHeaderCell') {\n if (\n (!self.isColumnSelected(cell.columnIndex) &&\n cell.x +\n cell.width -\n self.attributes.columnGrabZoneSize -\n self.style.cellBorderWidth >\n x) ||\n !self.attributes.allowColumnReordering\n ) {\n cell.dragContext = 'cell';\n cell.context = 'cell';\n } else {\n cell.context = self.cursorGrab;\n cell.dragContext = 'column-reorder';\n }\n return cell;\n }\n if (cell.style === 'rowHeaderCell') {\n if (\n (!self.isRowSelected(cell.rowIndex) &&\n self.attributes.rowGrabZoneSize +\n (cell.y - self.style.cellBorderWidth) <\n y) ||\n !self.attributes.allowRowReordering\n ) {\n cell.dragContext = 'cell';\n cell.context = 'cell';\n } else {\n cell.context = self.cursorGrab;\n cell.dragContext = 'row-reorder';\n }\n return cell;\n }\n if (cell.isGrid) {\n self.hasFocus = false;\n cell.dragContext = 'cell-grid';\n cell.context = 'cell-grid';\n return cell;\n }\n if (cell.style === 'tree-grid') {\n self.hasFocus = false;\n cell.dragContext = 'tree';\n cell.context = 'tree';\n return cell;\n }\n cell.dragContext = 'cell';\n cell.context = 'cell';\n return cell;\n }\n }\n self.hasFocus = true;\n self.cursor = 'default';\n return {\n dragContext: 'background',\n context: 'background',\n style: 'background',\n isBackground: true,\n };\n };\n /**\n * Returns an auto generated schema based on data structure.\n * @memberof canvasDatagrid\n * @name getSchemaFromData\n * @method\n * @tutorial schema\n * @returns {schema} schema A schema based on the first item in the data array.\n */\n self.getSchemaFromData = function (d) {\n d = d || self.originalData;\n return Object.keys(d[0] || { ' ': '' }).map(function mapEachSchemaColumn(\n key,\n index,\n ) {\n var type = self.getBestGuessDataType(key, d),\n i = {\n name: key,\n title: isNaN(parseInt(key, 10))\n ? key\n : self.integerToAlpha(key).toUpperCase(),\n index: index,\n columnIndex: index,\n type: type,\n filter: self.filter(type),\n };\n if (\n self.storedSettings &&\n self.storedSettings.visibility &&\n self.storedSettings.visibility[i.name] !== undefined\n ) {\n i.hidden = !self.storedSettings.visibility[i.name];\n }\n return i;\n });\n };\n /**\n * Clears the change log grid.changes that keeps track of changes to the data set.\n * This does not undo changes or alter data it is simply a convince array to keep\n * track of changes made to the data since last this method was called.\n * @memberof canvasDatagrid\n * @name clearChangeLog\n * @method\n */\n self.clearChangeLog = function () {\n self.changes = [];\n };\n /**\n * Returns the maximum text width for a given column by column name.\n * @memberof canvasDatagrid\n * @name findColumnMaxTextLength\n * @method\n * @returns {number} The number of pixels wide the maximum width value in the selected column.\n * @param {string} name The name of the column to calculate the value's width of.\n */\n self.findColumnMaxTextLength = function (name) {\n var m = -Infinity;\n if (name === 'cornerCell') {\n self.ctx.font = self.style.rowHeaderCellFont;\n return (\n self.ctx.measureText(\n (\n self.viewData.length + (self.attributes.showNewRow ? 1 : 0)\n ).toString(),\n ).width +\n self.style.autosizePadding +\n self.style.autosizeHeaderCellPadding +\n self.style.rowHeaderCellPaddingRight +\n self.style.rowHeaderCellPaddingLeft +\n (self.attributes.tree\n ? self.style.treeArrowWidth +\n self.style.treeArrowMarginLeft +\n self.style.treeArrowMarginRight\n : 0)\n );\n }\n var formatter = null;\n self.getSchema().forEach(function (col) {\n if (col.name !== name) {\n return;\n }\n self.ctx.font = self.style.columnHeaderCellFont;\n var t =\n self.ctx.measureText(col.title || col.name).width +\n self.style.columnHeaderCellPaddingRight +\n self.style.columnHeaderCellPaddingLeft +\n self.style.cellAutoResizePadding;\n m = t > m ? t : m;\n formatter = self.formatters[col.type];\n });\n self.viewData.forEach(function (row) {\n var text = row[name];\n if (formatter) {\n text = formatter({ cell: { value: text } });\n }\n self.ctx.font = self.style.cellFont;\n var t =\n self.ctx.measureText(text).width +\n self.style.cellPaddingRight +\n self.style.cellPaddingLeft +\n self.style.cellAutoResizePadding;\n m = t > m ? t : m;\n });\n return m;\n };\n /**\n * Gets the total width of all header columns.\n * @memberof canvasDatagrid\n * @name getHeaderWidth\n * @method\n */\n self.getHeaderWidth = function () {\n return self.getVisibleSchema().reduce(function (total, header) {\n return total + parseInt(header.width || self.style.cellWidth, 10);\n }, 0);\n };\n /**\n * Gets the height of a row by index.\n * @memberof canvasDatagrid\n * @name getRowHeight\n * @method\n * @param {number} rowIndex The row index to lookup.\n */\n self.getRowHeight = function (rowIndex) {\n return (self.sizes.rows[rowIndex] || self.style.cellHeight) * self.scale;\n };\n /**\n * Gets the width of a column by index.\n * @memberof canvasDatagrid\n * @name getColumnWidth\n * @method\n * @param {number} columnIndex The column index to lookup.\n */\n self.getColumnWidth = function (columnIndex) {\n const column = self.getSchema()[columnIndex] || {};\n const configuredWidth =\n (self.sizes.columns[columnIndex] ||\n column.width ||\n self.style.cellWidth) * self.scale;\n if (\n self.autoLastColumnWidth &&\n self.autoLastColumnWidth.index === columnIndex\n ) {\n return Math.max(configuredWidth, self.autoLastColumnWidth.width);\n }\n return configuredWidth;\n };\n self.getLastVisibleColumnIndex = function () {\n const schema = self.getSchema();\n const collapsedColumnGroups = self.getCollapsedColumnGroups();\n const isColumnCollapsed = (columnIndex) =>\n collapsedColumnGroups.some(\n (group) => columnIndex >= group.from && columnIndex <= group.to,\n );\n for (\n let viewIndex = self.orders.columns.length - 1;\n viewIndex >= 0;\n viewIndex -= 1\n ) {\n const schemaIndex = self.orders.columns[viewIndex];\n if (\n schema[schemaIndex] &&\n !schema[schemaIndex].hidden &&\n !isColumnCollapsed(viewIndex)\n ) {\n return schemaIndex;\n }\n }\n return -1;\n };\n self.formatters.string = function cellFormatterString(e) {\n return e.cell.value !== undefined ? e.cell.value : '';\n };\n self.formatters.rowHeaderCell = self.formatters.string;\n self.formatters.headerCell = self.formatters.string;\n self.formatters.number = self.formatters.string;\n self.formatters.int = self.formatters.string;\n self.formatters.html = self.formatters.string;\n self.sorters.string = function (columnName, direction) {\n var asc = direction === 'asc';\n // Coerce every value to a string so numbers, booleans and blanks sort\n // consistently (blanks first ascending, last descending) (#256, #548).\n function toComparable(value) {\n return value === undefined || value === null ? '' : String(value);\n }\n return function (a, b) {\n const aValue = toComparable(a[columnName]);\n const bValue = toComparable(b[columnName]);\n return asc ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue);\n };\n };\n self.sorters.number = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n if (asc) {\n return a[columnName] - b[columnName];\n }\n return b[columnName] - a[columnName];\n };\n };\n self.sorters.date = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n if (asc) {\n return (\n new Date(a[columnName]).getTime() - new Date(b[columnName]).getTime()\n );\n }\n return (\n new Date(b[columnName]).getTime() - new Date(a[columnName]).getTime()\n );\n };\n };\n}\n","'use strict';\n\n/**\n * Merge a new hidden row range into existed ranges array\n * @param {any[]} hiddenRowRanges tuples: Array<[bgeinRowIndex, endRowIndex]>\n * @param {number[]} newRange tuple: [beginRowIndex, endRowIndex]\n * @returns {boolean}\n */\nconst mergeHiddenRowRanges = function (hiddenRowRanges, newRange) {\n const [beginRowIndex, endRowIndex] = newRange;\n if (endRowIndex < beginRowIndex) return false;\n let inserted = false;\n for (let i = 0; i < hiddenRowRanges.length; i++) {\n const range = hiddenRowRanges[i];\n if (beginRowIndex > range[1] + 1) continue;\n if (beginRowIndex <= range[0] && endRowIndex >= range[0]) {\n hiddenRowRanges[i] = [beginRowIndex, Math.max(endRowIndex, range[1])];\n inserted = true;\n break;\n }\n if (beginRowIndex >= range[0]) {\n hiddenRowRanges[i] = [range[0], Math.max(endRowIndex, range[1])];\n inserted = true;\n break;\n }\n }\n if (!inserted) hiddenRowRanges.push([beginRowIndex, endRowIndex]);\n // merge intersections after sorting ranges\n hiddenRowRanges.sort((a, b) => a[0] - b[0]);\n for (let i = 0; i < hiddenRowRanges.length - 1; i++) {\n const range = hiddenRowRanges[i];\n const nextRange = hiddenRowRanges[i + 1];\n if (nextRange[0] <= range[1] + 1) {\n hiddenRowRanges[i] = [range[0], Math.max(range[1], nextRange[1])];\n hiddenRowRanges.splice(i + 1, 1);\n i--;\n }\n }\n return true;\n};\n\nexport { mergeHiddenRowRanges };\n"],"names":["defaults","self","attributes","styles","SelectionType","swapProps","obj","prop0","prop1","t","normalizeSelection","sel","type","endRow","startRow","endColumn","startColumn","isSameCellsBlock","block0","block1","mergeCellsIntoRowsOrColumns","cells","rowsOrColumns","mergeSelections","sel0","sel1","horizontalConcat","verticalConcat","Object","assign","Math","min","max","intersection","getIntersection","removePartOfRowsSelection","selection","remove","removePartOfColumnsSelection","removePartOfCellsSelection","intersect","result","minStartRow","maxEndRow","maxEndColumn","push","addIntoSelections","selections","add","context","i","length","parts","splice","Array","isArray","cleanupSelections","selectedAllRows","rows","selectedAllColumns","columns","isChanged0","isChanged1","isRowsSelection","merged","j","newMerged","removeFromSelections","unselectedAllRows","unselectedAllColumns","unshift","isChanged","newSelection","unselect","select","filter","unsel","endMerge","newSel","ptr","isRowSelected","rowIndex","isCellSelected","columnIndex","getSelectionStateFromCells","range","areAllCellsSelected","iTo","matched0","matched1","countOfColumns","fill","map","test","value","row","columnOffset","columnOffsetEnd","getSelectedContiguousColumns","allowImpurity","matched","newMatched","getSelectedContiguousRows","getSelectionBounds","top","Infinity","bottom","left","right","module","exports","e","o","a","r","l","call","m","c","d","defineProperty","enumerable","get","Symbol","toStringTag","__esModule","create","bind","n","default","prototype","hasOwnProperty","p","s","keys","reduce","concat","indexOf","key","modifier","legacyModifier","whiteSpace","navigation","editing","ui","device","imeCompositionKeys","koreanSpecific","japaneseSpecific","commonFunction","multimedia","multimediaNumpad","audio","speech","application","browser","mobilePhone","tv","mediaControls","IGNORE_NODETYPES","sanitizeElementData","element","elementData","nodeType","innerText","data","String","replace","trim","parseData","mimeType","trs","DOMParser","parseFromString","querySelectorAll","tr","childNode","childNodes","includes","col","parseHtmlTable","doc","querySelector","split","item","parseHtmlText","parseText","htmlSafe","createTextString","selectedData","isNeat","values","join","deduceColTypeFromData","colNum","len","isColEmpty","cellData","val","Number","isFinite","webComponent","typeMap","component","prop","nextLetterCap","forEach","char","toUpperCase","cust","toLowerCase","applyComponentStyle","supressChangeAndDrawEvents","intf","isComponent","cStyle","window","getComputedStyle","tagName","canvas","defs","computedStyle","def","getPropertyValue","hyphenateProperty","setStyleProperty","dispatchEvent","requestAnimationFrame","resize","style","strData","JSON","parse","Error","schema","strSchema","number","strNum","parseInt","isNaN","boolean","strBool","string","str","getObservableAttributes","attrs","attr","disconnectedCallback","this","connected","observer","disconnect","undefined","unobserveResizeTargets","connectedCallback","parentDOMNode","innerHTML","appendChild","observe","observeResizeTargets","adoptedCallback","attributeChangedCallback","attrName","oldVal","newVal","tfn","dataType","base","handler","Function","err","console","warn","addEventListener","name","MutationObserver","mutations","checkInnerHTML","checkStyle","mutation","attributeName","target","nodeName","parentNode","addedNodes","characterData","childList","subtree","document","el","modules","perfCounters","cachedImagesDrawn","drawCount","perfWindowSize","entityCount","scrollDebugCounters","touchPPSCounters","fillArray","low","high","step","x","drawHtml","cell","img","v","formattedValue","cacheKey","toString","round","canvasOffsetLeft","y","canvasOffsetTop","htmlImageCache","height","width","complete","ctx","drawImage","Image","onload","loaded","html","draw","src","btoa","drawLines","coords","beginPath","moveTo","lineTo","stroke","drawGroupHandle","collapsed","fillRect","strokeRect","cx","cy","drawUnhideIndicator","size","dir","active","minPadding","maxPadding","longEdge","median","halfLongEdge","x0","y0","borderCoords","strokeStyle","unhideIndicatorBorderColor","lineWidth","fillStyle","unhideIndicatorBackgroundColor","offset","unhideIndicatorColor","drawCellTreeIcon","tree","rowTree","parentCount","iconSize","cellTreeIconWidth","scale","marginTop","cellTreeIconMarginTop","marginRight","cellTreeIconMarginRight","marginLeft","cellTreeIconMarginLeft","paddingLeft","icon","oldFillStyle","oldStrokeStyle","hovered","hovers","onCellTreeIcon","cellTreeIconHoverFillColor","cellTreeIconFillColor","cellTreeIconBorderColor","rect","expand","cellTreeIconLineWidth","cellTreeIconLineColor","radiusRect","w","h","radius","b","quadraticCurveTo","fillText","text","clipFrozenArea","mode","lastFrozenColumnPixel","lastFrozenRowPixel","clip","fillHandle","selectionHandleType","arc","PI","fillCircle","strokeHandle","strokeCircle","addBorderLine","pos","getFrozenColumnsWidth","getSchema","frozenColumn","collapsedGroups","getCollapsedColumnGroups","hidden","findIndex","group","from","to","getColumnWidth","internal","isChildGrid","parentGrid","visible","checkScrollHeight","treeGrid","rowOpen","rowHeight","cornerCell","rowData","aCell","drawCorner","en","viewData","bc","gridBorderCollapse","selectionBorders","moveBorders","selectionHandles","rowHeaders","u","currentCell","columnHeaderCellHeight","getColumnHeaderCellHeight","rowHeaderCellWidth","getRowHeaderCellWidth","rowGroupsAreaWidth","getRowGroupAreaWidth","columnGroupsAreaHeight","getColumnGroupAreaHeight","rowGroupsRectInfo","rowGroupsFrozenInfo","columnGroupsRectInfo","collapsedColumnGroups","collapsedRowGroups","getCollapsedRowGroups","cellHeight","currentRowIndexOffset","rowIndexOffsetByHiddenRows","hiddenRowRanges","plus","sort","performance","now","visibleRowHeights","orders","createRowOrders","save","visibleRows","visibleCells","visibleGroups","visibleUnhideIndicators","offsetTop","offsetLeft","firstRowIndexOffset","shift","initDraw","clearRect","gridBackgroundColor","translate","ln","frozenRow","scrollBox","scrollLeft","scrollPixelLeft","cellBorderWidth","drawRow","allowFreezingRows","frozenMarkerWidth","frozenMarkerBorderWidth","drawFrozenRows","columnOrderIndex","rowOrderIndex","headerIndex","g","snapToRow","scrollTop","scrollPixelTop","scrollIndexTop","scrollIndexBottom","scrollPixelBottom","cellTree","hide","showNewRow","showRowHeaders","scrollIndexLeft","isColumnCollapsedByGroup","drawCell","newRow","restore","drawRows","cl","activeCell","selectionMode","activeCellOverlayBorderWidth","activeCellOverlayBorderColor","getHeaderWidth","drawActiveCell","columnHeaderCell","header","nonFrozenHeaderWidth","drawHeaderColumnRange","start","end","title","cellWidth","index","order","rArgs","rhIndex","filteredRowNumber","getBoundRowIndexFromViewRowIndex","originalData","rowHeaderValue","hasActiveFilters","hasCollapsedRowGroup","rowHeaderCell","headerDescription","sizes","openChildren","drawRowHeader","showColumnHeaders","columnHeaderCellBorderWidth","scrollBarWidth","isColumnHeaderCell","isColumnHeaderCellCap","endCap","drawHeaders","my","mx","xHover","yHover","allowFreezingColumns","freezeMarkerPosition","dragMode","frozenMarkerColor","frozenMarkerBorderColor","frozenMarkerHoverColor","frozenMarkerHeaderColor","frozenMarkerHoverBorderColor","dragStartObject","frozenMarkerActiveColor","frozenMarkerActiveBorderColor","posX","nearCell","getCellAt","isGrab","frozenMarkerActiveHeaderColor","posY","drawFrozenMarkers","mobile","allowMovingSelection","editable","selectionHandleBorderWidth","selectionHandleBorderColor","selectionHandleColor","hw","selectionHandleSize","br","tl","bl","addselectionHandle","az","touchSelectHandleZone","ax","ay","reorderObject","dragOffset","reorderMarkerBackgroundColor","reorderMarkerBorderWidth","reorderMarkerBorderColor","getSelectedRowsHeight","reorderMarkerIndexBorderWidth","reorderMarkerIndexBorderColor","reorderTarget","sortRowIndex","getSelectedColumnsWidth","isColumnSelected","sortColumnIndex","drawReorderMarkers","movingSelection","moveOverlayBorderWidth","moveOverlayBorderColor","setLineDash","moveOverlayBorderSegments","resizeAfterDragged","draggingItem","pendingDragResize","resizingRow","resizeMarkerSize","minX","dragStart","resizingStartingWidth","minColumnWidth","minY","resizingStartingHeight","minRowHeight","resizeMarkerColor","drawResizeMarkers","gridBorderWidth","gridBorderColor","dsb","fillOverlay","handle","selectionOverlayBorderWidth","selectionOverlayBorderColor","snapTo","overlay","toX","toY","snap","cursorX","direction","cursorY","fillOverlayBorderColor","fillOverlayBorderWidth","drawFillOverlay","drawSelectionBorders","entities","scrollBarBoxMargin","scrollBarBorderColor","scrollBarBorderWidth","horizontalBox","scrollCache","horizontalBar","scrollBoxWidth","scrollWidth","verticalBox","verticalBar","scrollBoxHeight","scrollHeight","horizontalBarVisible","scrollBarBackgroundColor","scrollBarBoxColor","horizontalBoxVisible","scrollBarActiveColor","scrollBarBoxBorderRadius","verticalBarVisible","verticalBoxVisible","scrollBarCornerBorderColor","scrollBarCornerBackgroundColor","corner","frozenColumnsWidth","frozenRowsHeight","onTheLeft","columnGroupIndicatorPosition","onTheTop","rowGroupIndicatorPosition","groupingAreaBackgroundColor","groupedColumns","groups","columnGroupRowHeight","toggleHandleSize","toggleHandlePadding","topY","centerY","bottomY","leftmostX","drawGroupHandleAtX","pushToVisibleGroups","leftX","rightX","x2","y2","crossTheFrozen","notInFrozen","colIndex","groupIndicatorColor","groupIndicatorBackgroundColor","containsBegining","containsEnd","rightCompare","compareX","minLeftX","lineCoords","groupedRows","colWidth","rowGroupColumnWidth","centerX","topmostY","drawGroupHandleAtY","bottomCompare","compareY","minTopY","drawGroupArea","showPerformance","debug","pop","font","debugFont","perf","toFixed","perfDelta","htmlImages","startScale","scaleDelta","zoomDeltaStart","touchLength","touches","touchPosition","touchPosition1","scrollIndex","scrollPixel","canvasOffset","touchDelta","touchAnimateTo","scrollAnimation","touchPPS","xPPS","yPPS","touchPPST","xPPST","yPPST","touchDuration","pointerLockPosition","mouse","touch","touchStart","hasFocus","dragContext","textAlign","debugBackgroundColor","debugColor","px","py","debugPerfChartBackground","debugScrollHeightColor","debugScrollWidthColor","debugPerformanceColor","debugEntitiesColor","debugTouchPPSXColor","debugTouchPPSYColor","dpl","apply","perfArr","arrIndex","color","useAbs","abs","drawPerfLine","debugPerfChartTextColor","drawPerfLines","createBorderOverlayArray","drawArray","propPrefix","offsetPoint","selectionBorder","isSelected","lastColumnIndex","lastRowIndex","isRowHeader","isHeader","isActiveRowHeader","cellGridAttributes","cellStyle","isCorner","isColumnHeader","isFilterable","filterable","wrap","cellWhiteSpace","selected","hoverMode","openedFilter","selectedFilterButton","rawValue","isGrid","f","formatters","orderByArrowSize","treeArrowSize","ev","activeHeader","viewColumnIndex","fontHeight","horizontalAlignment","verticalAlignment","paddingTop","paddingRight","paddingBottom","lineHeight","cellLineHeight","lineSpacing","cellLineSpacing","offsetWidth","offsetHeight","offsetParent","viewRowIndex","boundRowIndex","boundColumnIndex","getBoundColumnIndexFromViewColumnIndex","isNormal","gridId","isRowTree","rowTreeColIndex","isColumnTree","calculatedLineHeight","paddedWidth","paddedHeight","userHeight","userWidth","saveRowGroupsRectInfo","saveColumnGroupsRectInfo","cellHeightWithChildGrid","cellWidthWithChildGrid","mt","treeArrowMarginTop","mr","treeArrowMarginRight","ml","treeArrowMarginLeft","aw","treeArrowWidth","ah","treeArrowHeight","treeArrowColor","treeArrowBorderColor","drawTreeArrow","showRowNumbers","childGrids","saveAppearance","createGrid","cellGridHeight","grid","orderBy","columnHeaderOrderByArrowMarginTop","columnHeaderOrderByArrowMarginLeft","columnHeaderOrderByArrowMarginRight","columnHeaderOrderByArrowWidth","columnHeaderOrderByArrowHeight","columnHeaderOrderByArrowColor","columnHeaderOrderByArrowBorderColor","orderDirection","drawOrderByArrow","orderByArrowWidth","columnFilters","filterTextPrefix","getScaledFont","splitChar","lines","word","elWidth","plWidth","clippedVal","previousLine","words","textHeight","autoResize","autoResizeRows","et","ellipsisText","line","cHeight","measureText","curSplitChar","measure","arr","originText","stepLength","substr","wrapText","treeCellPadding","isDrawText","ll","textBlockHeight","vPos","hPos","stringify","pw","idx","idx_ord","drawText","selectionBorderTop","selectionBorderRight","selectionHandle","selectionBorderLeft","selectionBorderBottom","selectionHandleBehavior","createHandlesOverlayArray","moveOffset","filterButtonWidth","filterButtonHeight","filterButtonBorderColor","filterButtonBackgroundColor","filterButtonActiveBackgroundColor","onFilterButton","filterButtonHoverBackgroundColor","filterButtonBorderRadius","filterButtonArrowHeight","filterButtonArrowWidth","filterButtonArrowColor","filterButtonArrowBorderColor","drawFilterButtonArrow","drawFilterButton","isSorting","orderings","showRowNumberGaps","previousRowNumber","hasRowGap","find","beginRowIndex","endRowIndex","barHeight","rowHeaderCellRowNumberGapHeight","barColor","rowHeaderCellRowNumberGapColor","showUnhideColumnsIndicator","unhideIndicator","unhideIndicatorSize","cellX","isActive","orderIndex","orderIndex0","orderIndex1","isHiddenColumn","drawIndicator","iconsWidth","lineX0","lineX1","orderIndexPtr","prevColumnIndex","nextColumnIndex","showUnhideRowsIndicator","cellY","topIndicators","bottomIndicators","it","indicatorY","treeHeight","rowSansTreeHeight","trees","scrollIndexRight","scrollPixelRight","wheeling","stopPropagation","fn","events","removeEventListener","sfn","defaultPrevented","preventDefault","getRatio","maxPixelRatio","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","refreshScrollCacheX","frozenWidth","accumulator","column","schemaIndex","columnWidth","isColumnCollapsed","drawAfterResize","dims","vb","nb","co","isScrollBoxCorner","sbw","ratio","bm","cellBorder","columnHeaderCellBorder","dataHeight","dataWidth","topGroupAreaHeight","leftGroupAreaWidth","ch","containerSpace","measureContainerSpace","autoLastColumnWidth","setCanvasSize","setScrollBoxSize","checkScrollBoxVisibility","fillLastColumn","getLastVisibleColumnIndex","availableWidth","widthBoxRatio","heightBoxRatio","scrollBarBoxMinSize","scrollBarBoxWidth","bar","box","page","pageUpDownOverlap","newWidth","newHeight","resizeEditInput","scroll","isAutoSize","constrained","autoSizeConstrained","overflowX","overflowY","maxCanvasSize","dim","styleIsAuto","inlineIsAuto","appliedInlineStyles","innerHeight","innerWidth","parentNodeStyle","args","dontDraw","floor","ellipsisCache","mousemove","overridePos","contextMenu","input","which","stopFreezeMove","mouseup","getLayerPos","dragBounds","sBounds","delta","ctrl","ctrlKey","metaKey","persistantSelectionMode","singleSelectionMode","disallowVerticalAutoScroll","disallowHorizontalAutoScroll","NativeEvent","previousCell","clearTimeout","scrollTimer","isInGrid","rowBoundaryCrossed","columnBoundaryCrossed","cellBoundaryCrossed","prefix","cursorGrab","indicator","getUnhideIndicator","cursor","dragItem","pc","rc","rx","ry","selecting","shiftKey","isMultiColumnsSelected","isMultiRowsSelected","ignoreNextClick","contextmenuEvent","toggleCollapseTree","dragAddToSelection","selectCell","unselectCell","selectionBounds","clearSelections","selectRow","selectArea","movingSelectionHandle","autoScrollOnMousemove","movedVertically","autoScrollMargin","movedHorizontally","autoScrollZone","getColumnGroupAt","getRowGroupAt","click","startingBounds","checkSelectionChange","sb","getContextOfSelectionEvent","endEdit","unhideColumns","unhideRows","toggleGroup","setStorageData","refresh","leftOffset","topOffset","xInGrid","yInGrid","setActiveCell","columnHeaderClickBehavior","selectAll","treeArrowClickRadius","toggleTree","dragResizeColumn","resizingColumn","resizeEventDetails","dispatchResizeRow","clientX","clientY","dragResizeApply","resizeScrollZone","resizeChildGrids","globalRowResize","stopDragResize","event","hasMoved","dragItemIsSelected","fitSelectedColumns","fitSelectedRows","scrollGrid","scrollPointerLock","scrollStartMode","movementX","movementY","scrollMode","scrollStart","scrollModes","setTimeout","scrollRepeatRate","selectionScrollIncrement","stopScrollGrid","exitPointerLock","dragReorder","columReorder","rowReorder","allowColumnReordering","allowRowReordering","selectColumn","source","reorderDeadZone","getVisibleCellByIndex","stopDragReorder","originalIndex","targetIndex","orderLists","indexName","selectedIndexes","getRowSelectionStates","sortColumnIndices","selectedColumnIndices","deleteCount","selectColumnViewIndexes","getRowViewIndexesFromSelection","moveSelection","dragMove","stopDragMove","freezeMove","startFreezeMove","mousedown","lastMouseDownTarget","button","move","freeze","selectionHandleMove","onUnhideIndicator","requestPointerLock","stopSelectionHandleMove","cloneSelections","dragging","allowColumnSelection","mouseupOutsideGrid","controlInput","focus","getAdjacentCells","first","last","keydown","adjacentCells","cols","keepFocusOnMouseOut","isPrintableKeyEvent","beginEditAt","selectNone","deleteSelectedData","isArrowKey","shrinkOrExpandSelections","scrollIntoView","selectionFollowsActiveCell","keyup","keypress","dblclick","fitColumnToValues","autosize","cellTreeExpandCollapse","scrollWheel","childEvent","deltaX","deltaY","deltaMode","claim","claimedByChildGrid","disposed","touchHaltAnimation","scrollTo","pasteData","pasteValue","startRowIndex","startColIndex","minRowsLength","minColumnsLength","some","expression","isSupportedHtml","columnsLength","forEachSelectedCell","colName","insert","startColumnIndex","reverseRows","reverseColumns","alwaysFilling","affectedCells","columnName","dispatchDataChanged","expandGridForInsert","requiredRowCount","requiredColumnCount","changed","missingColumns","lastColumn","Date","validateColumn","applyDefaultValue","missingRows","setFilter","rowsLength","fillCellCallback","filledCells","allowGridExpandOnPaste","rowPosReal","rowDataPos","fillingRow","rowPosition","realRowIndex","cellsLength","existingRowData","newRowData","fillArgs","rowOffset","reversed","isFillingRow","fillingRowPosition","fillingRowLength","colPosReal","cellDataPos","fillingColumn","existingCellData","newCellData","isFillingColumn","fillingColumnPosition","fillingColumnLength","boundRowIndexMap","getNextVisibleColumnIndex","visibleColumnIndex","getVisibleSchema","getVisibleColumnIndexOf","getSelectionIndex","bounds","rowLength","columnLength","paste","clipboardItems","Map","clipboardData","items","supportedMimeTypes","pasteableItems","selectionIndex","itemToPaste","pasteType","getAsString","cut","copySelectedCellsToClipboard","apiCompatibleCells","clearSelectedCells","copy","clippingRect","getClippingRect","isInSelectionBounds","lastInBoundsLocation","dx","dy","boundsOld","isVertical","isHorizontal","reverseVertically","reverseHorizontally","touchTimerMs","touchMoving","touchScrollTimeout","animationFrames","getTouchPos","touchIndex","getBoundingClientRect","easingFunctions","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easing","touchEasingMethod","calculatePPSTimed","touchSigmaTimed","calculatePPS","touchSigma","touchEndAnimation","touchReleaseAnimationDurationMs","stopAnimation","touchEditCell","touchstart","changedTouches","startingCell","disposeContextMenu","clearInterval","calculatePPSTimer","touchContextTimeout","touchStartEvent","zoomAltered","touchStart1","touchScrollStart","touchContextMenuTimeMs","setInterval","touchEndEvents","body","touchmove","passive","touchend","touchcancel","touchSelect","handleType","touchSelecting","rw","rScrollZone","lScrollZone","bScrollZone","tScrollZone","t1","t2","touchDeadZone","touchZoomSensitivity","touchZoomMin","touchZoomMax","selectionScrollZone","touchScroll","startingCellStyle","touchMove","dz","touchReleaseAcceleration","scrollAnimationPPSThreshold","ctor","warnedForObsoleteSelections","treeGridAttributes","storageName","invalidSearchExpClass","localStyleLibraryStorageKey","sortFunction","filters","tempSchema","columnTreeRowStartIndex","columnTreeRowEndIndex","origin","sorters","parsers","schemaHashes","changes","componentL1Events","eventNames","has","allowGroupingColumns","allowGroupingRows","groupIndex","matchedGroup","allGroups","gi","nextCollapsed","isNewGroupRangeValid","groupsArray","gIndex","visibility","localStorage","setItem","createColumnOrders","defaultValue","createNewRowData","getSchemaNameHash","getFilteredAndSortedViewData","newViewData","originalRowIndex","ranges","countOfRows","headerName","filterText","entries","getHeaderByName","currentFilterFunction","filterFrozenRows","newLen","from2","to2","slice","sortFn","rowA","rowB","rowIndexB","sortFrozenRows","_row","getBestGuessDataType","drawChildGrids","gridKey","setTimer","setDefaults","obj1","obj2","setAttributes","setStyle","findColumnMaxTextLength","dispose","child","resizeObserver","resizeObserverFrame","cancelAnimationFrame","removeChild","eventParent","tryLoadStoredSettings","reloadStoredValues","storedSettings","tempData","collapsedCount","ctr","ri","lastchild","orTree","ctc","ci","_ri","_ci","si","otherData","k","tempRow","colTrees","collapsedColCount","initCellTreeSettings","invalidRowTree","rt","begin","parentIndex","columnTree","dataColumnLength","invalidColumnTree","ct","getDomRoot","shadowRoot","host","parseFont","fontStyle","exec","parseFloat","unit","getFontName","getFontHeight","styleKey","parseStyleValue","initProp","propName","getStyleProperty","styleKeys","supressDrawAndEvent","isDim","dehyphenateProperty","getItem","message","init","initialized","publicStyleKeyIntf","initScrollBox","setDom","ie","navigator","userAgent","edge","webKit","moz","blankValues","cursorGrabing","cursorGrabbing","appendTo","clearChangeLog","gotoCell","gotoRow","addButton","toggleCellCollapseTree","expandCollapseCellTree","getRowHeight","findColumnScrollLeft","findRowScrollTop","groupColumns","groupRows","removeGroupColumns","removeGroupRows","toggleGroupColumns","toggleGroupRows","getGroupsColumnBelongsTo","getGroupsRowBelongsTo","isCellVisible","isRowVisible","isColumnVisible","clipElement","getSchemaFromData","expandTree","collapseTree","insertRow","deleteRow","addRow","insertColumn","deleteColumn","addColumn","setRowHeight","setColumnWidth","resetColumnWidths","resetRowHeights","assertPxColor","clearPxColorAssertions","integerToAlpha","hideColumns","hideRows","addStyleKeyIfNoneExists","DOMStyles","set","valueObject","filterFor","blanksText","filterRegExp","pattern","flags","substring","flagLength","invalidFilterRegEx","RegExp","toLocaleUpperCase","numericValue","numericFilter","textContent","blur","TypeError","currentCursor","getObsoleteSelectionMatrix","eventName","RangeError","getSelectedData","getTypes","parseInnerHtml","callback","etl","autoGenerateSchema","columnCount","autoResizeColumns","sHeight","sWidth","setScrollTop","preventScrollEvent","moveButtonPos","setScrollLeft","supressDrawEvent","iterateSelectedCells","iterator","expandToRow","states","orderedSchema","getSchemaOrderByViewIndex","row2","rowState","col2","fromIndex","selectionCache","selectionCacheWidth","selectionCacheHeight","otherSelections","_","columnOrderIndexes","columnSchema","allowOnlyOneRow","viewRowIndexes","canSelectionsBeCopied","baseType","areSelectionsComplex","triggerEvent","dispatchSelectionChangedEvent","suppressEvent","unselectRows","offsetX","offsetY","moveSelections","selectionList","getSelectedCells","clonedSelections","sanitized","sanitizeSelectionBounds","viewDataLength","schemaLength","hasData","selectedCells","areSelectionsNeat","textString","htmlString","createHTMLString","copiedData","setData","hasCustomWidth","addCol","de","dragObject","st","state","firstRow","replaceAllSelections","newSelections","viewIndexes","keyEvent","keyInfo","ArrowLeft","isLeft","ArrowUp","isUp","ArrowRight","isRight","ArrowDown","isDown","originalColumnIndex","matchedSelections","isTopBorder","isBottomBorder","isLeftBorder","isRightBorder","maxRow","maxColumn","afterChange","zIndexTop","hoverScrollTimeout","autoCompleteContext","applyContextItemStyle","contextItemContainer","createInlineStyle","createContextMenu","parentContextMenu","loc","container","createElement","upArrow","downArrow","children","selectedIndex","checkArrowVisibility","startHoverScroll","contextHoverScrollAmount","contextHoverScrollRateMs","endHoverScroll","scrollOffset","contextMenuZIndex","childMenuArrow","removeChildContext","relatedTarget","contains","setAttribute","contextAddCallback","getAttribute","cPos","childContextMenuMarginLeft","childContextMenuMarginTop","createChildContext","addContent","content","childContextMenuArrowHTML","addItem","opacity","position","contextMenuArrowColor","zIndex","inputDropdown","maxHeight","autocompleteBottomMargin","minWidth","contextMenuArrowUpHTML","contextMenuArrowDownHTML","display","timer","animationDurationShowContextMenu","unfade","contextMenuWindowMargin","clickIndex","Event","animationDurationHideContextMenu","createFilterContextMenuItems","iRect","filterContainer","filterLabel","filterAutoCompleteButton","filterInput","checkRegExpErrorState","background","contextFilterInputBackground","contextFilterInputColor","contextFilterInvalidRegExpBackground","contextFilterInvalidRegExpColor","createAutoCompleteContext","count","blanksItem","autoCompleteItems","cellValue","maxAutoCompleteItems","disposeAutocomplete","onclick","filterOptionText","contextFilterButtonHTML","cf","removeFilterOptionText","contextMenuOpenedAt","childGrid","childGridsOfParent","nodeA","nodeB","x1","y1","node","newX1","newY1","createDisposeEvent","contextPosition","getColumnsMap","_col","isNormalCell","isBackground","isScrollBar","showFilter","showCopy","copyText","execCommand","showPaste","clipBoardData","pasteText","showColumnSelector","columnSelectorText","toggleColumnVisibility","columnSelectorHiddenText","columnSelectorVisibleText","contiguousColumns","hideColumnText","showClearSettingsOption","clearSettingsOptionText","allowSorting","showOrderByOption","showOrderByOptionTextAsc","showOrderByOptionTextDesc","boundRowIndexes","showHideRow","showHideRows","groupAreaHeight","groupAreaWidth","setCollapseStateForAllGroups","showRemoveAllGroupColumns","showExpandAllGroupColumns","showCollapseAllGroupColumns","showRemoveAllGroupRows","showExpandAllGroupRows","showCollapseAllGroupRows","canGroupByColumns","canUngroupColumns","canGroupByRows","canUngroupRows","groupIndexes","groupTitles","groupNames","showGroupColumns","cell0","cell1","formatArgs","showRemoveGroupColumns","rangeTitle","showGroupRows","showRemoveGroupRows","addDefaultContextMenuItem","contextMenuMarginLeft","contextMenuMarginTop","mobileContextMenuMargin","filterButtonMenuOffsetTop","createButton","imgSrc","wrapper","buttonArrow","buttonIcon","buttonZIndex","buttonMenu","applyButtonStyle","buttonArrowDownHTML","maxWidth","toggleButtonMenu","disposeButtonMenu","createItems","menuItemContainer","buttonMenuItemContainer","applyButtonMenuItemStyle","disposeButton","buttonMenuWindowMargin","createButtonMenu","keyCode","attachButton","ele","boundingRect","eleRect","clipRect","parentRect","scrollingElement","editCell","borderWidth","mobileEditInputHeight","groupAreaOffsetY","groupAreaOffsetX","cellPaddingLeft","ignoreScrollOffset","calculatedTree","isTree","getContainerElement","canvasStyle","saved","space","cache","containerSpaceCache","clientWidth","clientHeight","after","client","before","probe","initResizeObserver","ResizeObserver","observedSizes","entry","contentRect","abort","isNewRow","newValue","oldValue","changeIndex","aborted","inEnterMode","enumItems","enu","option","valueInEnum","multiLine","showPicker","editCellZIndex","fontSize","editCellFontSize","shouldClearCellValue","nx","ny","altKey","nextRowIndex","className","css","padding","buttonPadding","borderStyle","borderColor","buttonBorderColor","buttonBackgroundColor","userSelect","buttonHoverBackgroundColor","buttonActiveBorderColor","buttonActiveBackgroundColor","verticalAlign","buttonArrowColor","fontWeight","fontFamily","contextMenuFontFamily","contextMenuFontSize","margin","contextMenuItemMargin","borderRadius","contextMenuItemBorderRadius","contextMenuHoverBackground","contextMenuHoverColor","contextMenuLabelMargin","contextMenuLabelDisplay","contextMenuLabelMinWidth","contextMenuLabelMaxWidth","contextMenuBackground","contextMenuColor","border","contextMenuBorder","contextMenuPadding","contextMenuBorderRadius","contextMenuOpacity","overflow","contextMenuCursor","contextFilterInputBorder","contextFilterInputBorderRadius","contextFilterInputFontFamily","contextFilterInputFontSize","contextFilterButtonBorder","contextFilterButtonBorderRadius","contextMenuFilterButtonFontFamily","contextMenuFilterButtonFontSize","cssFloat","childContextMenuArrowColor","contextMenuChildArrowFontSize","boxSizing","outline","mobileEditFontFamily","mobileEditFontSize","editCellBorder","editCellColor","editCellBackgroundColor","appearance","webkitAppearance","mozAppearance","editCellPaddingLeft","editCellFontFamily","boxShadow","editCellBoxShadow","contextMenuFilterInvalidExpresion","onblur","parentIsCanvas","getContext","textBaseline","addGroup","groupFor","removeGroup","ordA","charCodeAt","fromCharCode","showFilterInCell","targetX","targetY","sbh","treeData","details","trArgs","treeGridHeight","beginColumnOrderIndex","endColumnOrderIndex","hiddenColumns","newRange","inserted","nextRange","mergeHiddenRowRanges","newSize","dontSetStorageData","sorter","firstColumnName","lastColumnName","firstOne","lastOne","error","rowIndexFrom","rowIndexTo","isInteger","dataLength","xi","visibleSchema","selectionLength","maxRowLength","minXi","yi","lastSourceIndex","cidx","indicators","useTouchScrollZones","getBorder","entitiy","borderResizeZone","moveBorder","tsz","touchScrollZone","moveMode","borderDragBehavior","xBorderBehavior","yBorderBehavior","isVerticalScrollBar","isHorizontalScrollBar","allowColumnResize","allowColumnResizeFromCell","allowRowHeaderResize","allowRowResize","allowRowResizeFromCell","columnGrabZoneSize","rowGrabZoneSize","rowHeaderCellFont","autosizePadding","autosizeHeaderCellPadding","rowHeaderCellPaddingRight","rowHeaderCellPaddingLeft","formatter","columnHeaderCellFont","columnHeaderCellPaddingRight","columnHeaderCellPaddingLeft","cellAutoResizePadding","cellFont","cellPaddingRight","total","configuredWidth","viewIndex","headerCell","int","asc","toComparable","aValue","bValue","localeCompare","date","getTime","Grid","Reflect","construct","HTMLElement","attachShadow","canvasDatagrid","tKeys","customElements","argKey","tKey","sKey","observedAttributes","define","require"],"mappings":"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"}
|