canvas-datagrid 0.4.6 → 0.4.7
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 +6 -0
- package/dist/canvas-datagrid.debug.js +6 -4
- 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 +31 -6
- package/lib/docs.js +8 -3
- package/lib/events/index.js +1 -1
- package/lib/selections/index.js +4 -3
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvas-datagrid.module.js","sources":["../lib/defaults.js","../lib/component.js","../lib/selections/util.js","../lib/draw.js","../node_modules/is-printable-key-event/dist/index.js","../lib/events/util.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/groups/util.js","../lib/publicMethods.js","../lib/main.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 ['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 ['animationDurationShowContextMenu', 50],\n ['animationDurationHideContextMenu', 50],\n ['autoGenerateSchema', 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 ['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","/*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 (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 };\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 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 intf.addEventListener('on' + attrName, Function('e', newVal));\n }\n return;\n };\n component.observe = function (intf) {\n var observer;\n if (!window.MutationObserver) {\n return;\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 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","'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 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","/*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 for (x = 0; x < cell.text.lines.length; x += 1) {\n line = cell.text.lines[x];\n var vPos =\n Math.max(\n (cell.height -\n (wrap ? cell.text.height : 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 vPos = cell.height - cell.paddingBottom - cell.text.height;\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 = 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 cellWidth = cellWidth * self.scale;\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: self.getBoundColumnIndexFromViewColumnIndex(\n columnOrderIndex,\n ),\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] = self.createGrid(\n cellGridAttributes,\n );\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 = (val !== undefined && val !== null\n ? val\n : ''\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 =\n self.style[cellStyle + 'FontHeight'] * self.scale +\n 'px ' +\n self.style[cellStyle + 'FontName'];\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 {\n columnGroupsAreaHeight,\n 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.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","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\nexport {\n createTextString,\n createHTMLString,\n isSupportedHtml,\n htmlSafe,\n parseData,\n parseHtmlTable,\n parseHtmlText,\n parseText,\n sanitizeElementData,\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 } 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 self.scrollBox.horizontalBarVisible =\n (self.style.width !== 'auto' &&\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' &&\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 ['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 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 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 (self.dragStartObject.columnIndex !== -1 && e.shiftKey) {\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 (\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 (self.currentCell.context === 'cell') {\n if (self.currentCell.style === 'cornerCell') {\n self.selectAll();\n self.draw();\n checkSelectionChange();\n return;\n }\n if (self.currentCell.style === 'columnHeaderCell') {\n if (self.attributes.columnHeaderClickBehavior === 'sort') {\n if (self.orderBy === i.header.name) {\n self.orderDirection =\n 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 }\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) {\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 if (\n self.dispatchEvent(resizingColumn ? 'resizecolumn' : 'resizerow', {\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 })\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.dispatchEvent('resizerow', { row: height });\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,\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 !e.shiftKey &&\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 self.selectColumn(self.currentCell.header.index, ctrl, e.shiftKey);\n return;\n }\n if (self.attributes.selectionMode !== 'row') {\n self.mousemove(e);\n }\n return;\n }\n if (selectionHandleMove) {\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 (self.dragMode === 'column-reorder' && !self.isMultiColumnsSelected) {\n self.selectColumn(self.currentCell.header.index, ctrl, e.shiftKey);\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 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 self.deleteSelectedData();\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) {\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 ]);\n });\n\n self.dispatchEvent('afterpaste', {\n cells: affectedCells,\n });\n\n return rows.length;\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 var schema = self.getSchema();\n const rowsLength = Math.max(rows.length, minRowsLength);\n const fillCellCallback = self.fillCellCallback;\n const filledCells = [];\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 var realRowIndex = self.orders.rows[startRowIndex + rowPosition];\n var cells = rows[rowDataPos];\n const cellsLength = Math.max(cells.length, minColumnsLength);\n\n var existingRowData = self.viewData[realRowIndex];\n var 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 var 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 var column = schema[columnIndex];\n\n if (!column) {\n console.warn('Paste data exceeded grid bounds. Skipping.');\n continue;\n }\n\n var columnName = column.name;\n var 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 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\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\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 }\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.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 (self.attributes.columnHeaderClickBehavior === 'select') {\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 if (/vertical-scroll-/.test(self.startingCell.style)) {\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(self.startingCell.style)) {\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(self.startingCell.style)) {\n self.touchSelect(self.currentCell, self.startingCell.style);\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.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.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 '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 if (!self.isChildGrid && self.canvas && self.canvas.parentNode) {\n self.canvas.parentNode.removeChild(self.canvas);\n }\n if (!self.isChildGrid) {\n document.body.removeChild(self.controlInput);\n }\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('mousemove', self.mousemove);\n window.removeEventListener('resize', self.resize);\n if (self.observer && self.observer.disconnect) {\n self.observer.disconnect();\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 self.getFontName = function (fontStyle) {\n return fontStyle.replace(/\\d+\\.?\\d*px/, '');\n };\n self.getFontHeight = function (fontStyle) {\n return parseFloat(fontStyle);\n };\n self.parseStyleValue = function (key) {\n if (/Font/.test(key)) {\n self.style[key + 'Height'] = self.getFontHeight(self.style[key]);\n self.style[key + 'Name'] = self.getFontName(self.style[key]);\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.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 self.draw(true);\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 return value === filterFor;\n };\n ['formatters', 'filters', 'sorters'].forEach(self.initProp);\n self.applyComponentStyle(false, self.intf);\n self.reloadStoredValues();\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 },\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 self.createColumnOrders();\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.dispatchEvent('datachanged', { data: self.originalData });\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.boundRowIndex][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 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 const isNeat = areSelectionsNeat(self.selections);\n const data = self.getSelectedData();\n if (data.length > 0) {\n // TODO: improve these two creating string method\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.dispatchEvent('resizerow', {\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.dispatchEvent('resizerow', {\n cellHeight: 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 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 self.contextMenu = createContextMenu(ev, contextPosition, items);\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 * 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 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 self.changes[y] = self.changes[y] || {};\n self.changes[y][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 (y === self.viewData.length) {\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.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 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, false);\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('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 };\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","/*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 };\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 };\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 };\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 };\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 };\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 };\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 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 };\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.dispatchEvent('resizerow', {\n cellHeight: self.style.cellHeight,\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 var trArgs = self.args.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.dispatchEvent('resizerow', { height: self.style.cellHeight });\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 const columnIndex =\n name === 'cornerCell' ? -1 : self.getHeaderByName(name).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 ((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.allowRowReordering\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 return (\n (self.sizes.columns[columnIndex] ||\n self.getSchema()[columnIndex].width ||\n self.style.cellWidth) * self.scale\n );\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 return function (a, b) {\n const aValue = a[columnName] || '';\n const bValue = b[columnName] || '';\n if (asc) {\n if (!aValue.localeCompare) {\n return 1;\n }\n return aValue.localeCompare(bValue);\n }\n if (!bValue.localeCompare) {\n return 1;\n }\n return 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","/*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 self.intf = self.isComponent\n ? eval('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"],"names":["self","defaults","attributes","styles","typeMap","component","dehyphenateProperty","prop","replace","nextLetterCap","p","Array","prototype","forEach","call","char","toUpperCase","hyphenateProperty","cust","toLowerCase","applyComponentStyle","supressChangeAndDrawEvents","intf","isComponent","cStyle","window","getComputedStyle","tagName","canvas","defs","computedStyle","def","val","getPropertyValue","setStyleProperty","dispatchEvent","requestAnimationFrame","resize","style","data","strData","JSON","parse","e","Error","schema","strSchema","number","strNum","n","parseInt","isNaN","boolean","strBool","test","string","str","getObservableAttributes","i","attrs","attr","push","disconnectedCallback","connected","connectedCallback","this","parentDOMNode","innerHTML","appendChild","observe","adoptedCallback","attributeChangedCallback","attrName","oldVal","newVal","tfn","dataType","base","item","filter","addEventListener","Function","name","observer","MutationObserver","mutations","checkInnerHTML","checkStyle","mutation","attributeName","target","nodeName","parentNode","addedNodes","length","type","characterData","childList","subtree","document","querySelectorAll","el","SelectionType","UnselectedCells","Cells","Rows","Columns","swapProps","obj","prop0","prop1","t","normalizeSelection","sel","endRow","startRow","endColumn","startColumn","getSelectionFromString","index","indexOf","slice","num","split","map","it","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","addIntoSelections","selections","add","context","parts","isArray","cleanupSelections","splice","isChanged0","isChanged1","selectedAllRows","rows","selectedAllColumns","columns","isRowsSelection","merged","j","newMerged","removeFromSelections","unselectedAllRows","unselectedAllColumns","unshift","isChanged","newSelection","unselect","select","unsel","endMerge","newSel","ptr","isRowSelected","rowIndex","isColumnSelected","columnIndex","isCellSelected","areAllCellsSelected","range","iTo","matched0","matched1","getSelectionStateFromCells","countOfColumns","fill","value","row","columnOffset","columnOffsetEnd","getVerboseSelectionStateFromCells","getSelectedContiguousColumns","allowImpurity","matched","newMatched","getSelectedContiguousRows","areSelectionsComplex","baseType","findIndex","areSelectionsNeat","moveSelections","offsetX","offsetY","cloneSelections","clonedSelections","getSelectionBounds","top","Infinity","bottom","left","right","shrinkOrExpandSelections","cell","keyEvent","keyInfo","ArrowLeft","x","y","isLeft","ArrowUp","isUp","ArrowRight","isRight","ArrowDown","isDown","key","originalRowIndex","originalColumnIndex","matchedSelections","isTopBorder","isBottomBorder","isLeftBorder","isRightBorder","maxRow","maxColumn","afterChange","perfCounters","cachedImagesDrawn","drawCount","perfWindowSize","entityCount","scrollDebugCounters","touchPPSCounters","fillArray","low","high","step","undefined","drawHtml","img","v","formattedValue","cacheKey","toString","round","canvasOffsetLeft","canvasOffsetTop","htmlImageCache","height","width","complete","ctx","drawImage","Image","onload","loaded","keys","html","draw","src","btoa","drawLines","coords","beginPath","moveTo","lineTo","stroke","drawGroupHandle","collapsed","fillRect","strokeRect","cx","cy","drawUnhideIndicator","size","dir","active","x0","y0","borderCoords","minPadding","maxPadding","longEdge","median","halfLongEdge","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","r","b","quadraticCurveTo","fillText","text","clipFrozenArea","mode","lastFrozenColumnPixel","lastFrozenRowPixel","clip","fillHandle","selectionHandleType","arc","PI","fillCircle","strokeHandle","strokeCircle","addBorderLine","c","pos","l","getFrozenColumnsWidth","s","getSchema","frozenColumn","collapsedGroups","getCollapsedColumnGroups","hidden","group","from","to","getColumnWidth","internal","isChildGrid","parentGrid","visible","checkScrollHeight","treeGrid","rowOpen","rowHeight","cornerCell","rowData","aCell","drawCorner","en","m","d","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","a","performance","now","visibleRowHeights","orders","createRowOrders","save","visibleRows","visibleCells","visibleGroups","visibleUnhideIndicators","offsetTop","offsetLeft","firstRowIndexOffset","shift","initDraw","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","o","columnHeaderCell","header","nonFrozenHeaderWidth","drawHeaderColumnRange","start","end","title","cellWidth","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","tr","br","tl","bl","addselectionHandle","az","touchSelectHandleZone","ax","ay","reorderObject","dragOffset","reorderMarkerBackgroundColor","reorderMarkerBorderWidth","reorderMarkerBorderColor","getSelectedRowsHeight","reorderMarkerIndexBorderWidth","reorderMarkerIndexBorderColor","reorderTarget","sortRowIndex","getSelectedColumnsWidth","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","col","groupIndicatorColor","groupIndicatorBackgroundColor","containsBegining","containsEnd","rightCompare","compareX","minLeftX","lineCoords","groupedRows","colWidth","rowGroupColumnWidth","centerX","topmostY","drawGroupHandleAtY","bottomCompare","compareY","minTopY","drawGroupArea","showPerformance","debug","pop","font","debugFont","perf","reduce","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","pw","px","py","ph","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","includes","wrap","cellWhiteSpace","selected","hoverMode","openedFilter","selectedFilterButton","rawValue","isGrid","f","formatters","orderByArrowSize","treeArrowSize","ev","activeHeader","viewColumnIndex","nodeType","fontHeight","horizontalAlignment","verticalAlignment","paddingTop","paddingRight","paddingBottom","whiteSpace","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","console","warn","columnFilters","filterTextPrefix","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","vPos","hPos","stringify","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","orderIndex0","orderIndex1","unhideIndicator","unhideIndicatorSize","cellX","isActive","orderIndex","isHiddenColumn","drawIndicator","iconsWidth","lineX0","lineX1","orderIndexPtr","prevColumnIndex","nextColumnIndex","showUnhideRowsIndicator","cellY","topIndicators","bottomIndicators","indicatorY","treeHeight","rowSansTreeHeight","trees","scrollIndexRight","scrollPixelRight","module","exports","defineProperty","enumerable","get","Symbol","toStringTag","__esModule","create","bind","default","hasOwnProperty","concat","modifier","legacyModifier","navigation","editing","ui","device","imeCompositionKeys","koreanSpecific","japaneseSpecific","commonFunction","multimedia","multimediaNumpad","audio","speech","application","browser","mobilePhone","tv","mediaControls","isSupportedHtml","pasteValue","some","expression","IGNORE_NODETYPES","isHtmlTable","sanitizeElementData","element","elementData","innerText","String","trim","parseHtmlText","doc","DOMParser","parseFromString","querySelector","parseHtmlTable","childNodes","childNode","parseText","parseData","mimeType","htmlSafe","createTextString","selectedData","isNeat","values","join","createHTMLString","htmlString","wheeling","stopPropagation","fn","events","removeEventListener","sfn","defaultPrevented","preventDefault","getRatio","maxPixelRatio","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","refreshScrollCacheX","frozenWidth","isColumnCollapsed","accumulator","column","schemaIndex","columnWidth","drawAfterResize","dims","vb","nb","co","isScrollBoxCorner","sbw","ratio","bm","cellBorder","columnHeaderCellBorder","dataHeight","dataWidth","topGroupAreaHeight","leftGroupAreaWidth","ch","setCanvasSize","args","setScrollBoxSize","checkScrollBoxVisibility","widthBoxRatio","heightBoxRatio","scrollBarBoxMinSize","scrollBarBoxWidth","bar","box","page","pageUpDownOverlap","newWidth","newHeight","resizeEditInput","scroll","overflowX","overflowY","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","endEdit","unhideColumns","unhideRows","toggleGroup","setStorageData","refresh","leftOffset","topOffset","xInGrid","yInGrid","setActiveCell","selectAll","checkSelectionChange","columnHeaderClickBehavior","treeArrowClickRadius","toggleTree","sb","getContextOfSelectionEvent","dragResizeColumn","resizingColumn","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","dragging","controlInput","focus","getAdjacentCells","first","last","keydown","adjacentCells","cols","keepFocusOnMouseOut","isPrintableKeyEvent","beginEditAt","selectNone","deleteSelectedData","Number","isArrowKey","scrollIntoView","selectionFollowsActiveCell","keyup","keypress","dblclick","fitColumnToValues","autosize","cellTreeExpandCollapse","scrollWheel","deltaX","deltaY","deltaMode","touchHaltAnimation","scrollTo","pasteData","startRowIndex","startColIndex","minRowsLength","minColumnsLength","columnsLength","cellData","forEachSelectedCell","colName","insert","startColumnIndex","reverseRows","reverseColumns","alwaysFilling","affectedCells","columnName","rowsLength","fillCellCallback","filledCells","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","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","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","applyDefaultValue","defaultValue","createNewRowData","getSchemaNameHash","getFilteredAndSortedViewData","newViewData","ranges","countOfRows","headerName","filterText","getHeaderByName","currentFilterFunction","filterFrozenRows","entries","newLen","len","from2","to2","sortFn","rowA","rowB","rowIndexB","sortFrozenRows","getBestGuessDataType","drawChildGrids","gridKey","setTimer","validateColumn","setDefaults","obj1","obj2","setAttributes","setStyle","findColumnMaxTextLength","dispose","removeChild","eventParent","disconnect","tryLoadStoredSettings","reloadStoredValues","storedSettings","_typeof","tempData","collapsedCount","ctr","ri","lastchild","orTree","ctc","ci","_ri","child","_ci","si","otherData","k","tempRow","colTrees","collapsedColCount","initCellTreeSettings","invalidRowTree","rt","begin","parentIndex","columnTree","dataColumnLength","invalidColumnTree","ct","getDomRoot","shadowRoot","host","getFontName","fontStyle","getFontHeight","parseFloat","parseStyleValue","initProp","propName","getStyleProperty","styleKeys","supressDrawAndEvent","isDim","getItem","message","init","initialized","publicStyleKeyIntf","initScrollBox","setDom","ie","navigator","userAgent","edge","webKit","moz","blankValues","cursorGrabing","cursorGrabbing","appendTo","clearChangeLog","gotoCell","gotoRow","addButton","toggleCellCollapseTree","expandCollapseCellTree","findColumnScrollLeft","findRowScrollTop","groupColumns","groupRows","removeGroupColumns","removeGroupRows","toggleGroupColumns","toggleGroupRows","getGroupsColumnBelongsTo","getGroupsRowBelongsTo","isCellVisible","isRowVisible","isColumnVisible","clipElement","getSchemaFromData","setFilter","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","exec","flags","substring","flagLength","invalidFilterRegEx","RegExp","toLocaleUpperCase","textContent","blur","TypeError","currentCursor","getObsoleteSelectionMatrix","eventName","RangeError","getSelectedData","getTypes","parseInnerHtml","callback","etl","autoGenerateSchema","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","getRowHeight","triggerEvent","dispatchSelectionChangedEvent","suppressEvent","unselectRows","selectionList","getSelectedCells","sanitized","sanitizeSelectionBounds","viewDataLength","schemaLength","hasData","selectedCells","textString","copiedData","setData","hasCustomWidth","addCol","de","dragObject","st","changed","state","firstRow","replaceAllSelections","newSelections","viewIndexes","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","isFinite","createFilterContextMenuItems","iRect","filterContainer","filterLabel","filterAutoCompleteButton","filterInput","checkRegExpErrorState","background","contextFilterInputBackground","contextFilterInputColor","contextFilterInvalidRegExpBackground","contextFilterInvalidRegExpColor","createAutoCompleteContext","count","blanksItem","autoCompleteItems","cellValue","maxAutoCompleteItems","disposeAutocomplete","onclick","filterOptionText","contextFilterButtonHTML","cf","removeFilterOptionText","childGrid","childGridsOfParent","nodeA","nodeB","x1","y1","node","newX1","newY1","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","createDisposeEvent","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","abort","newValue","oldValue","aborted","inEnterMode","enumItems","enu","option","valueInEnum","multiLine","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","mergeHiddenRowRanges","newRange","inserted","nextRange","addGroup","groupFor","removeGroup","ordA","charCodeAt","fromCharCode","showFilterInCell","targetX","targetY","sbh","treeData","trArgs","treeGridHeight","beginColumnOrderIndex","endColumnOrderIndex","hiddenColumns","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","headerCell","int","asc","aValue","bValue","localeCompare","date","Date","getTime","webComponent","modules","dom","publicMethods","Grid","eval","attachShadow","canvasDatagrid","tKeys","customElements","argKey","tKey","sKey","HTMLElement","observedAttributes","define","require"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"canvas-datagrid.module.js","sources":["../lib/defaults.js","../lib/component.js","../lib/selections/util.js","../lib/draw.js","../node_modules/is-printable-key-event/dist/index.js","../lib/events/util.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/groups/util.js","../lib/publicMethods.js","../lib/main.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 ['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 ['animationDurationShowContextMenu', 50],\n ['animationDurationHideContextMenu', 50],\n ['autoGenerateSchema', 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 ['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","/*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 (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 };\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 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 intf.addEventListener('on' + attrName, Function('e', newVal));\n }\n return;\n };\n component.observe = function (intf) {\n var observer;\n if (!window.MutationObserver) {\n return;\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 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","'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 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","/*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 for (x = 0; x < cell.text.lines.length; x += 1) {\n line = cell.text.lines[x];\n var vPos =\n Math.max(\n (cell.height -\n (wrap ? cell.text.height : 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 vPos = cell.height - cell.paddingBottom - cell.text.height;\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 = 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 cellWidth = cellWidth * self.scale;\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: self.getBoundColumnIndexFromViewColumnIndex(\n columnOrderIndex,\n ),\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] = self.createGrid(\n cellGridAttributes,\n );\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 = (val !== undefined && val !== null\n ? val\n : ''\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 =\n self.style[cellStyle + 'FontHeight'] * self.scale +\n 'px ' +\n self.style[cellStyle + 'FontName'];\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 {\n columnGroupsAreaHeight,\n 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.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","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\nexport {\n createTextString,\n createHTMLString,\n isSupportedHtml,\n htmlSafe,\n parseData,\n parseHtmlTable,\n parseHtmlText,\n parseText,\n sanitizeElementData,\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 } 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 self.scrollBox.horizontalBarVisible =\n (self.style.width !== 'auto' &&\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' &&\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 ['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 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 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 (self.dragStartObject.columnIndex !== -1 && e.shiftKey) {\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 (\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 (self.currentCell.context === 'cell') {\n if (self.currentCell.style === 'cornerCell') {\n self.selectAll();\n self.draw();\n checkSelectionChange();\n return;\n }\n if (self.currentCell.style === 'columnHeaderCell') {\n if (self.attributes.columnHeaderClickBehavior === 'sort') {\n if (self.orderBy === i.header.name) {\n self.orderDirection =\n 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 }\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) {\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 if (\n self.dispatchEvent(resizingColumn ? 'resizecolumn' : 'resizerow', {\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 })\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.dispatchEvent('resizerow', { row: height });\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,\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 !e.shiftKey &&\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 self.selectColumn(self.currentCell.header.index, ctrl, e.shiftKey);\n return;\n }\n if (self.attributes.selectionMode !== 'row') {\n self.mousemove(e);\n }\n return;\n }\n if (selectionHandleMove) {\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 (self.dragMode === 'column-reorder' && !self.isMultiColumnsSelected) {\n self.selectColumn(self.currentCell.header.index, ctrl, e.shiftKey);\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 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 self.deleteSelectedData();\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) {\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 ]);\n });\n\n self.dispatchEvent('afterpaste', {\n cells: affectedCells,\n });\n\n return rows.length;\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 var schema = self.getSchema();\n const rowsLength = Math.max(rows.length, minRowsLength);\n const fillCellCallback = self.fillCellCallback;\n const filledCells = [];\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 var realRowIndex = self.orders.rows[startRowIndex + rowPosition];\n var cells = rows[rowDataPos];\n const cellsLength = Math.max(cells.length, minColumnsLength);\n\n var existingRowData = self.viewData[realRowIndex];\n var 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 var 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 var column = schema[self.orders.columns[columnIndex]];\n\n if (!column) {\n console.warn('Paste data exceeded grid bounds. Skipping.');\n continue;\n }\n\n var columnName = column.name;\n var 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 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\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\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 }\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.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 (self.attributes.columnHeaderClickBehavior === 'select') {\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 if (/vertical-scroll-/.test(self.startingCell.style)) {\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(self.startingCell.style)) {\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(self.startingCell.style)) {\n self.touchSelect(self.currentCell, self.startingCell.style);\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.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.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 '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 if (!self.isChildGrid && self.canvas && self.canvas.parentNode) {\n self.canvas.parentNode.removeChild(self.canvas);\n }\n if (!self.isChildGrid) {\n document.body.removeChild(self.controlInput);\n }\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('mousemove', self.mousemove);\n window.removeEventListener('resize', self.resize);\n if (self.observer && self.observer.disconnect) {\n self.observer.disconnect();\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 self.getFontName = function (fontStyle) {\n return fontStyle.replace(/\\d+\\.?\\d*px/, '');\n };\n self.getFontHeight = function (fontStyle) {\n return parseFloat(fontStyle);\n };\n self.parseStyleValue = function (key) {\n if (/Font/.test(key)) {\n self.style[key + 'Height'] = self.getFontHeight(self.style[key]);\n self.style[key + 'Name'] = self.getFontName(self.style[key]);\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.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 self.draw(true);\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 return value === filterFor;\n };\n ['formatters', 'filters', 'sorters'].forEach(self.initProp);\n self.applyComponentStyle(false, self.intf);\n self.reloadStoredValues();\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 },\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 self.createColumnOrders();\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.dispatchEvent('datachanged', { data: self.originalData });\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 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 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.dispatchEvent('resizerow', {\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.dispatchEvent('resizerow', {\n cellHeight: 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 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 self.contextMenu = createContextMenu(ev, contextPosition, items);\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 * 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 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 self.changes[y] = self.changes[y] || {};\n self.changes[y][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 (y === self.viewData.length) {\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.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 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, false);\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('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 };\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","/*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 };\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 };\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 };\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 };\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 };\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 };\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 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 };\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.dispatchEvent('resizerow', {\n cellHeight: self.style.cellHeight,\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 var trArgs = self.args.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.dispatchEvent('resizerow', { height: self.style.cellHeight });\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 const columnIndex =\n name === 'cornerCell' ? -1 : self.getHeaderByName(name).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 ((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.allowRowReordering\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 return (\n (self.sizes.columns[columnIndex] ||\n self.getSchema()[columnIndex].width ||\n self.style.cellWidth) * self.scale\n );\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 return function (a, b) {\n const aValue = a[columnName] || '';\n const bValue = b[columnName] || '';\n if (asc) {\n if (!aValue.localeCompare) {\n return 1;\n }\n return aValue.localeCompare(bValue);\n }\n if (!bValue.localeCompare) {\n return 1;\n }\n return 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","/*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 self.intf = self.isComponent\n ? eval('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"],"names":["self","defaults","attributes","styles","typeMap","component","dehyphenateProperty","prop","replace","nextLetterCap","p","Array","prototype","forEach","call","char","toUpperCase","hyphenateProperty","cust","toLowerCase","applyComponentStyle","supressChangeAndDrawEvents","intf","isComponent","cStyle","window","getComputedStyle","tagName","canvas","defs","computedStyle","def","val","getPropertyValue","setStyleProperty","dispatchEvent","requestAnimationFrame","resize","style","data","strData","JSON","parse","e","Error","schema","strSchema","number","strNum","n","parseInt","isNaN","boolean","strBool","test","string","str","getObservableAttributes","i","attrs","attr","push","disconnectedCallback","connected","connectedCallback","this","parentDOMNode","innerHTML","appendChild","observe","adoptedCallback","attributeChangedCallback","attrName","oldVal","newVal","tfn","dataType","base","item","filter","addEventListener","Function","name","observer","MutationObserver","mutations","checkInnerHTML","checkStyle","mutation","attributeName","target","nodeName","parentNode","addedNodes","length","type","characterData","childList","subtree","document","querySelectorAll","el","SelectionType","UnselectedCells","Cells","Rows","Columns","swapProps","obj","prop0","prop1","t","normalizeSelection","sel","endRow","startRow","endColumn","startColumn","getSelectionFromString","index","indexOf","slice","num","split","map","it","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","addIntoSelections","selections","add","context","parts","isArray","cleanupSelections","splice","isChanged0","isChanged1","selectedAllRows","rows","selectedAllColumns","columns","isRowsSelection","merged","j","newMerged","removeFromSelections","unselectedAllRows","unselectedAllColumns","unshift","isChanged","newSelection","unselect","select","unsel","endMerge","newSel","ptr","isRowSelected","rowIndex","isColumnSelected","columnIndex","isCellSelected","areAllCellsSelected","range","iTo","matched0","matched1","getSelectionStateFromCells","countOfColumns","fill","value","row","columnOffset","columnOffsetEnd","getVerboseSelectionStateFromCells","getSelectedContiguousColumns","allowImpurity","matched","newMatched","getSelectedContiguousRows","areSelectionsComplex","baseType","findIndex","areSelectionsNeat","moveSelections","offsetX","offsetY","cloneSelections","clonedSelections","getSelectionBounds","top","Infinity","bottom","left","right","shrinkOrExpandSelections","cell","keyEvent","keyInfo","ArrowLeft","x","y","isLeft","ArrowUp","isUp","ArrowRight","isRight","ArrowDown","isDown","key","originalRowIndex","originalColumnIndex","matchedSelections","isTopBorder","isBottomBorder","isLeftBorder","isRightBorder","maxRow","maxColumn","afterChange","perfCounters","cachedImagesDrawn","drawCount","perfWindowSize","entityCount","scrollDebugCounters","touchPPSCounters","fillArray","low","high","step","undefined","drawHtml","img","v","formattedValue","cacheKey","toString","round","canvasOffsetLeft","canvasOffsetTop","htmlImageCache","height","width","complete","ctx","drawImage","Image","onload","loaded","keys","html","draw","src","btoa","drawLines","coords","beginPath","moveTo","lineTo","stroke","drawGroupHandle","collapsed","fillRect","strokeRect","cx","cy","drawUnhideIndicator","size","dir","active","x0","y0","borderCoords","minPadding","maxPadding","longEdge","median","halfLongEdge","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","r","b","quadraticCurveTo","fillText","text","clipFrozenArea","mode","lastFrozenColumnPixel","lastFrozenRowPixel","clip","fillHandle","selectionHandleType","arc","PI","fillCircle","strokeHandle","strokeCircle","addBorderLine","c","pos","l","getFrozenColumnsWidth","s","getSchema","frozenColumn","collapsedGroups","getCollapsedColumnGroups","hidden","group","from","to","getColumnWidth","internal","isChildGrid","parentGrid","visible","checkScrollHeight","treeGrid","rowOpen","rowHeight","cornerCell","rowData","aCell","drawCorner","en","m","d","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","a","performance","now","visibleRowHeights","orders","createRowOrders","save","visibleRows","visibleCells","visibleGroups","visibleUnhideIndicators","offsetTop","offsetLeft","firstRowIndexOffset","shift","initDraw","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","o","columnHeaderCell","header","nonFrozenHeaderWidth","drawHeaderColumnRange","start","end","title","cellWidth","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","tr","br","tl","bl","addselectionHandle","az","touchSelectHandleZone","ax","ay","reorderObject","dragOffset","reorderMarkerBackgroundColor","reorderMarkerBorderWidth","reorderMarkerBorderColor","getSelectedRowsHeight","reorderMarkerIndexBorderWidth","reorderMarkerIndexBorderColor","reorderTarget","sortRowIndex","getSelectedColumnsWidth","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","col","groupIndicatorColor","groupIndicatorBackgroundColor","containsBegining","containsEnd","rightCompare","compareX","minLeftX","lineCoords","groupedRows","colWidth","rowGroupColumnWidth","centerX","topmostY","drawGroupHandleAtY","bottomCompare","compareY","minTopY","drawGroupArea","showPerformance","debug","pop","font","debugFont","perf","reduce","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","pw","px","py","ph","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","includes","wrap","cellWhiteSpace","selected","hoverMode","openedFilter","selectedFilterButton","rawValue","isGrid","f","formatters","orderByArrowSize","treeArrowSize","ev","activeHeader","viewColumnIndex","nodeType","fontHeight","horizontalAlignment","verticalAlignment","paddingTop","paddingRight","paddingBottom","whiteSpace","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","console","warn","columnFilters","filterTextPrefix","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","vPos","hPos","stringify","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","orderIndex0","orderIndex1","unhideIndicator","unhideIndicatorSize","cellX","isActive","orderIndex","isHiddenColumn","drawIndicator","iconsWidth","lineX0","lineX1","orderIndexPtr","prevColumnIndex","nextColumnIndex","showUnhideRowsIndicator","cellY","topIndicators","bottomIndicators","indicatorY","treeHeight","rowSansTreeHeight","trees","scrollIndexRight","scrollPixelRight","module","exports","defineProperty","enumerable","get","Symbol","toStringTag","__esModule","create","bind","default","hasOwnProperty","concat","modifier","legacyModifier","navigation","editing","ui","device","imeCompositionKeys","koreanSpecific","japaneseSpecific","commonFunction","multimedia","multimediaNumpad","audio","speech","application","browser","mobilePhone","tv","mediaControls","isSupportedHtml","pasteValue","some","expression","IGNORE_NODETYPES","isHtmlTable","sanitizeElementData","element","elementData","innerText","String","trim","parseHtmlText","doc","DOMParser","parseFromString","querySelector","parseHtmlTable","childNodes","childNode","parseText","parseData","mimeType","htmlSafe","createTextString","selectedData","isNeat","values","join","createHTMLString","htmlString","wheeling","stopPropagation","fn","events","removeEventListener","sfn","defaultPrevented","preventDefault","getRatio","maxPixelRatio","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","refreshScrollCacheX","frozenWidth","isColumnCollapsed","accumulator","column","schemaIndex","columnWidth","drawAfterResize","dims","vb","nb","co","isScrollBoxCorner","sbw","ratio","bm","cellBorder","columnHeaderCellBorder","dataHeight","dataWidth","topGroupAreaHeight","leftGroupAreaWidth","ch","setCanvasSize","args","setScrollBoxSize","checkScrollBoxVisibility","widthBoxRatio","heightBoxRatio","scrollBarBoxMinSize","scrollBarBoxWidth","bar","box","page","pageUpDownOverlap","newWidth","newHeight","resizeEditInput","scroll","overflowX","overflowY","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","endEdit","unhideColumns","unhideRows","toggleGroup","setStorageData","refresh","leftOffset","topOffset","xInGrid","yInGrid","setActiveCell","selectAll","checkSelectionChange","columnHeaderClickBehavior","treeArrowClickRadius","toggleTree","sb","getContextOfSelectionEvent","dragResizeColumn","resizingColumn","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","dragging","controlInput","focus","getAdjacentCells","first","last","keydown","adjacentCells","cols","keepFocusOnMouseOut","isPrintableKeyEvent","beginEditAt","selectNone","deleteSelectedData","Number","isArrowKey","scrollIntoView","selectionFollowsActiveCell","keyup","keypress","dblclick","fitColumnToValues","autosize","cellTreeExpandCollapse","scrollWheel","deltaX","deltaY","deltaMode","touchHaltAnimation","scrollTo","pasteData","startRowIndex","startColIndex","minRowsLength","minColumnsLength","columnsLength","cellData","forEachSelectedCell","colName","insert","startColumnIndex","reverseRows","reverseColumns","alwaysFilling","affectedCells","columnName","rowsLength","fillCellCallback","filledCells","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","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","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","applyDefaultValue","defaultValue","createNewRowData","getSchemaNameHash","getFilteredAndSortedViewData","newViewData","ranges","countOfRows","headerName","filterText","getHeaderByName","currentFilterFunction","filterFrozenRows","entries","newLen","len","from2","to2","sortFn","rowA","rowB","rowIndexB","sortFrozenRows","getBestGuessDataType","drawChildGrids","gridKey","setTimer","validateColumn","setDefaults","obj1","obj2","setAttributes","setStyle","findColumnMaxTextLength","dispose","removeChild","eventParent","disconnect","tryLoadStoredSettings","reloadStoredValues","storedSettings","_typeof","tempData","collapsedCount","ctr","ri","lastchild","orTree","ctc","ci","_ri","child","_ci","si","otherData","k","tempRow","colTrees","collapsedColCount","initCellTreeSettings","invalidRowTree","rt","begin","parentIndex","columnTree","dataColumnLength","invalidColumnTree","ct","getDomRoot","shadowRoot","host","getFontName","fontStyle","getFontHeight","parseFloat","parseStyleValue","initProp","propName","getStyleProperty","styleKeys","supressDrawAndEvent","isDim","getItem","message","init","initialized","publicStyleKeyIntf","initScrollBox","setDom","ie","navigator","userAgent","edge","webKit","moz","blankValues","cursorGrabing","cursorGrabbing","appendTo","clearChangeLog","gotoCell","gotoRow","addButton","toggleCellCollapseTree","expandCollapseCellTree","findColumnScrollLeft","findRowScrollTop","groupColumns","groupRows","removeGroupColumns","removeGroupRows","toggleGroupColumns","toggleGroupRows","getGroupsColumnBelongsTo","getGroupsRowBelongsTo","isCellVisible","isRowVisible","isColumnVisible","clipElement","getSchemaFromData","setFilter","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","exec","flags","substring","flagLength","invalidFilterRegEx","RegExp","toLocaleUpperCase","textContent","blur","TypeError","currentCursor","getObsoleteSelectionMatrix","eventName","RangeError","getSelectedData","getTypes","parseInnerHtml","callback","etl","autoGenerateSchema","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","getRowHeight","triggerEvent","dispatchSelectionChangedEvent","suppressEvent","unselectRows","selectionList","getSelectedCells","sanitized","sanitizeSelectionBounds","viewDataLength","schemaLength","hasData","selectedCells","textString","copiedData","setData","hasCustomWidth","addCol","de","dragObject","st","changed","state","firstRow","replaceAllSelections","newSelections","viewIndexes","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","isFinite","createFilterContextMenuItems","iRect","filterContainer","filterLabel","filterAutoCompleteButton","filterInput","checkRegExpErrorState","background","contextFilterInputBackground","contextFilterInputColor","contextFilterInvalidRegExpBackground","contextFilterInvalidRegExpColor","createAutoCompleteContext","count","blanksItem","autoCompleteItems","cellValue","maxAutoCompleteItems","disposeAutocomplete","onclick","filterOptionText","contextFilterButtonHTML","cf","removeFilterOptionText","childGrid","childGridsOfParent","nodeA","nodeB","x1","y1","node","newX1","newY1","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","createDisposeEvent","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","abort","newValue","oldValue","aborted","inEnterMode","enumItems","enu","option","valueInEnum","multiLine","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","mergeHiddenRowRanges","newRange","inserted","nextRange","addGroup","groupFor","removeGroup","ordA","charCodeAt","fromCharCode","showFilterInCell","targetX","targetY","sbh","treeData","trArgs","treeGridHeight","beginColumnOrderIndex","endColumnOrderIndex","hiddenColumns","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","headerCell","int","asc","aValue","bValue","localeCompare","date","Date","getTime","webComponent","modules","dom","publicMethods","Grid","eval","attachShadow","canvasDatagrid","tKeys","customElements","argKey","tKey","sKey","HTMLElement","observedAttributes","define","require"],"mappings":"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"}
|