canvas-datagrid 0.4.1 → 0.4.2
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 +7 -0
- package/dist/canvas-datagrid.debug.js +8 -1
- 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/lib/events/index.js +8 -0
- package/lib/intf.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvas-datagrid.module.js","sources":["../lib/defaults.js","../lib/component.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/contextMenu.js","../lib/button.js","../lib/dom.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 ['blanksText', '(Blanks)'],\n ['borderDragBehavior', 'none'],\n ['borderResizeZone', 10],\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 ['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 ['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(236, 243, 255, 1)'],\n ['frozenMarkerHoverBorderColor', 'rgba(110, 168, 255, 1)'],\n ['frozenMarkerActiveColor', 'rgba(236, 243, 255, 1)'],\n ['frozenMarkerActiveBorderColor', 'rgba(110, 168, 255, 1)'],\n ['frozenMarkerColor', 'rgba(222, 222, 222, 1)'],\n ['frozenMarkerBorderColor', 'rgba(168, 168, 168, 1)'],\n ['frozenMarkerBorderWidth', 1],\n ['frozenMarkerWidth', 2],\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 ['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 ['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 ['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 = defs.defaults.styles;\n defs.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","/*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\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 */\n function strokeLines(coords) {\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 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 strokeLines([x + width * 0.2, cy, x + width * 0.78, cy]);\n if (collapsed) strokeLines([cx, y + width * 0.22, cx, y + width * 0.8]);\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 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 (\n cell.selectionBorderTop &&\n cell.selectionBorderLeft &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'tl']);\n cell.selectionHandle = 'tl';\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 }\n }\n function createBorderOverlayArray(\n cell,\n drawArray,\n propPrefix,\n offsetPoint,\n ) {\n offsetPoint = offsetPoint || { x: 0, y: 0 };\n cell.selectionBorder = '';\n if (\n !cell.isRowHeader &&\n self.selections[cell.rowIndex + -offsetPoint.y] &&\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) !== -1\n ) {\n if (\n (!self.selections[cell.rowIndex - 1 + -offsetPoint.y] ||\n self.selections[cell.rowIndex - 1 + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) === -1 ||\n cell.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 !self.selections[cell.rowIndex + 1 + -offsetPoint.y] ||\n self.selections[cell.rowIndex + 1 + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) === -1\n ) {\n drawArray.push([cell, 'b']);\n cell[propPrefix + 'BorderBottom'] = true;\n cell[propPrefix + 'Border'] += 'b';\n }\n if (\n !self.selections[cell.rowIndex + -offsetPoint.y] ||\n cell.columnIndex === 0 ||\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex - 1 + -offsetPoint.x,\n ) === -1\n ) {\n drawArray.push([cell, 'l']);\n cell[propPrefix + 'BorderLeft'] = true;\n cell[propPrefix + 'Border'] += 'l';\n }\n if (\n !self.selections[cell.rowIndex + -offsetPoint.y] ||\n cell.columnIndex === schema.length ||\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex + 1 + -offsetPoint.x,\n ) === -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 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 selected =\n self.selections[rowOrderIndex] &&\n self.selections[rowOrderIndex].indexOf(columnOrderIndex) !== -1,\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 activeHeader =\n (self.orders.rows[self.activeCell.rowIndex] === rowOrderIndex ||\n self.orders.columns[self.activeCell.columnIndex] ===\n headerIndex) &&\n (columnOrderIndex === -1 || rowOrderIndex === -1)\n ? isRowHeader\n ? 'activeRowHeaderCell'\n : 'activeColumnHeaderCell'\n : false,\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 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\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 x += cell.width + (bc ? 0 : self.style.cellBorderWidth);\n return cell.width;\n };\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 const filteredRowNumber =\n self.viewData && rowIndex < self.viewData.length\n ? self.getBoundRowIndexFromViewRowIndex(rowIndex) + 1\n : self.originalData\n ? self.originalData.length + 1\n : rowOrderIndex + 1;\n\n const rowHeaderValue =\n self.hasActiveFilters() || self.hasCollapsedRowGroup()\n ? filteredRowNumber\n : rowIndex + 1;\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 }\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 = 0;\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.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 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 strokeLines(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 strokeLines(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 y +=\n self.style.frozenMarkerBorderWidth +\n self.style.frozenMarkerWidth -\n 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 for (var k = 0; k < self.selections.length; k++) {\n if (!self.selections[k] || k == self.reorderObject.rowIndex) continue;\n b.height += self.getRowHeight(k);\n }\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.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 var selectedColumns = self.selections[0];\n for (var k = 1; k < selectedColumns.length; k++) {\n b.width += self.getColumnWidth(\n self.orders.columns[selectedColumns[k]],\n );\n }\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.currentCell.sortColumnIndex !==\n self.reorderObject.sortColumnIndex &&\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 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 self.ctx.lineWidth = self.style.selectionOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.selectionOverlayBorderColor;\n function dsb(c) {\n addBorderLine(c[0], c[1]);\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 function drawSelectionHandles() {\n if (self.mobile || self.attributes.allowMovingSelection) {\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 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 if (self.dragStartObject !== undefined) return;\n var my = self.lastFrozenRowPixel - self.style.frozenMarkerWidth,\n mx = self.lastFrozenColumnPixel - self.style.frozenMarkerBorderWidth,\n xHover =\n self.currentCell && self.currentCell.style === 'frozen-row-marker',\n yHover =\n self.currentCell && self.currentCell.style === 'frozen-column-marker';\n self.ctx.lineWidth = self.style.frozenMarkerBorderWidth;\n if (self.attributes.allowFreezingColumns) {\n self.ctx.fillStyle = yHover\n ? self.style.frozenMarkerHoverColor\n : self.style.frozenMarkerColor;\n self.ctx.strokeStyle = yHover\n ? self.style.frozenMarkerHoverBorderColor\n : self.style.frozenMarkerBorderColor;\n fillRect(mx, 0, self.style.frozenMarkerWidth, self.height);\n strokeRect(mx, 0, self.style.frozenMarkerWidth, self.height);\n self.visibleCells.unshift({\n x: mx,\n y: 0,\n height: self.height,\n width:\n self.style.frozenMarkerWidth + self.style.frozenMarkerBorderWidth,\n style: 'frozen-column-marker',\n });\n }\n if (self.attributes.allowFreezingRows) {\n self.ctx.fillStyle = xHover\n ? self.style.frozenMarkerHoverColor\n : self.style.frozenMarkerColor;\n self.ctx.strokeStyle = xHover\n ? self.style.frozenMarkerHoverBorderColor\n : self.style.frozenMarkerBorderColor;\n fillRect(0, my, self.width, self.style.frozenMarkerWidth);\n strokeRect(0, my, self.width, self.style.frozenMarkerWidth);\n const height =\n self.style.frozenMarkerWidth + self.style.frozenMarkerBorderWidth;\n self.visibleCells.unshift({\n x: 0,\n y: my,\n height,\n width: self.width,\n style: 'frozen-row-marker',\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 fillRect(\n self.freezeMarkerPosition.x,\n 0,\n self.style.frozenMarkerWidth,\n self.height,\n );\n strokeRect(\n self.freezeMarkerPosition.x,\n 0,\n self.style.frozenMarkerWidth,\n self.height,\n );\n } else {\n fillRect(\n 0,\n self.freezeMarkerPosition.y,\n self.width,\n self.style.frozenMarkerWidth,\n );\n strokeRect(\n 0,\n self.freezeMarkerPosition.y,\n self.width,\n self.style.frozenMarkerWidth,\n );\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 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 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 s = self.getSchema();\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 self.scrollCache.x = [];\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 const collapsedColumnGroups = self.getCollapsedColumnGroups();\n const isColumnCollapsed = (columnIndex) =>\n collapsedColumnGroups.findIndex(\n (group) => columnIndex >= group.from && columnIndex <= group.to,\n ) >= 0;\n /** @type {number} it will be used in `reduceSchema` only */\n let frozenWidth = 0;\n 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 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 self.canvas.width = self.width * ratio;\n self.canvas.height = self.height * ratio;\n self.ctx.scale(ratio, ratio);\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 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 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 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 }\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 (\n self.selections[cell.rowIndex] &&\n self.selections[cell.rowIndex].indexOf(cell.columnIndex) !==\n -1\n ) {\n self.selections[cell.rowIndex].splice(\n self.selections[cell.rowIndex].indexOf(cell.columnIndex),\n 1,\n );\n }\n } else {\n self.selections[cell.rowIndex] =\n self.selections[cell.rowIndex] || [];\n if (\n self.selections[cell.rowIndex].indexOf(cell.columnIndex) ===\n -1\n ) {\n self.selections[cell.rowIndex].push(cell.columnIndex);\n var event = {\n selections: self.selections,\n selectedData: self.getSelectedData(),\n selectedCells: self.getSelectedCells(),\n selectionBounds: self.getSelectionBounds(),\n };\n self.dispatchEvent('selectionchanged', event);\n }\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.selections = [];\n }\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 if (sBounds.left == -1 && sBounds.top !== sBounds.bottom)\n self.isMultiRowsSelected = true;\n }\n }\n\n if (self.attributes.autoScrollOnMousemove) {\n var movedVertically = delta.y > self.attributes.autoScrollMargin;\n var movedHorizontally = 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 ev = {\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\n };\n Object.defineProperty(ev, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n self.dispatchEvent('selectionchanged', ev);\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 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 self.selections[i.rowIndex] = self.selections[i.rowIndex] || [];\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 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('resizecolumn', {\n x: x,\n y: y,\n draggingItem: self.draggingItem,\n })\n ) {\n return false;\n }\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 self.draggingItem.header.style === 'rowHeaderCell'\n ? 'cornerCell'\n : self.draggingItem.sortColumnIndex\n ] = x;\n if (\n ['rowHeaderCell', 'cornerCell'].indexOf(\n self.draggingItem.header.style,\n ) !== -1\n ) {\n self.resize(true);\n }\n self.resizeChildGrids();\n return;\n }\n if (self.dragMode === 'ns-resize') {\n if (self.draggingItem.rowOpen) {\n self.sizes.trees[self.draggingItem.rowIndex] = y;\n } else if (self.attributes.globalRowResize) {\n self.style.cellHeight = y;\n } else {\n self.sizes.rows[self.draggingItem.rowIndex] = y;\n }\n self.dispatchEvent('resizerow', { row: y });\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.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 }\n\n self.resize();\n document.body.removeEventListener(\n 'mousemove',\n self.dragResizeColumn,\n false,\n );\n document.body.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 document.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 (\n self.dragMode === 'column-reorder' &&\n !self.isMultiColumnsSelected(self.draggingItem.header.index)\n ) {\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.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 var oIndex,\n tIndex,\n odata = [],\n cr = {\n 'row-reorder': self.orders.rows,\n 'column-reorder': self.orders.columns,\n },\n i = {\n 'row-reorder': 'rowIndex',\n 'column-reorder': 'sortColumnIndex',\n }[self.dragMode];\n document.body.removeEventListener('mousemove', self.dragReorder, false);\n document.body.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[i] !== self.reorderTarget[i] &&\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 oIndex = cr[self.dragMode].indexOf(self.reorderObject[i]);\n tIndex = cr[self.dragMode].indexOf(self.reorderTarget[i]);\n if (self.dragMode === 'column-reorder') {\n var sortColumnIndices = [];\n var seletedColumnIndices = [];\n if (self.selections[0]) {\n self.selections[0].forEach(function (value) {\n sortColumnIndices.push(self.orders.columns[value]);\n });\n }\n var deleteCount = sortColumnIndices.length;\n cr[self.dragMode].splice(oIndex, deleteCount);\n if (tIndex > oIndex) tIndex = tIndex - (deleteCount - 1);\n for (var i = 0; i < sortColumnIndices.length; i++) {\n seletedColumnIndices.push(tIndex + i);\n cr[self.dragMode].splice(tIndex + i, 0, sortColumnIndices[i]);\n }\n self.orders.columns = cr[self.dragMode];\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = seletedColumnIndices;\n });\n } else {\n var selectedRows = [];\n self.selections.forEach(function (row, rowIndex) {\n if (row) {\n selectedRows.push(row);\n odata.push(self.viewData[rowIndex]);\n }\n });\n self.viewData.splice(oIndex, odata.length);\n self.selections = [];\n if (tIndex > oIndex) tIndex = tIndex - (odata.length - 1);\n self.activeCell.rowIndex = tIndex;\n for (var i = 0; i < odata.length; i++) {\n self.viewData.splice(tIndex + i, 0, odata[i]);\n self.selections[tIndex + i] = selectedRows[i];\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 document.body.removeEventListener('mousemove', self.dragMove, false);\n document.body.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 bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n columnHeaderCellBorder = self.style.columnHeaderCellBorderWidth * bm,\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth();\n\n self.ignoreNextClick = true;\n self.freezeMarkerPosition = pos;\n pos.x -= self.getRowGroupAreaWidth();\n pos.y -= self.getColumnGroupAreaHeight();\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 self.scrollBox.scrollLeft = 0;\n self.frozenColumn = self.currentCell.columnIndex + 1;\n self.scrollBox.bar.h.x =\n rowHeaderCellWidth + self.scrollCache.x[self.frozenColumn - 1];\n self.scrollBox.box.h.x =\n rowHeaderCellWidth + self.scrollCache.x[self.frozenColumn - 1];\n var dataWidth = self.scrollCache.x[self.scrollCache.x.length - 1];\n self.scrollBox.widthBoxRatio =\n (self.scrollBox.width - self.scrollCache.x[self.frozenColumn - 1]) /\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 self.stopFreezeMove = function (e) {\n document.body.removeEventListener('mousemove', self.freezeMove, false);\n document.body.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 };\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 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 ) {\n if (\n !(self.dragMode == 'row-reorder' && self.isMultiRowsSelected) &&\n !(self.currentCell.hovered && self.hovers.onFilterButton)\n ) {\n self.selections = [];\n }\n }\n if (self.dragStartObject.isGrid) {\n return;\n }\n if (self.scrollModes.indexOf(self.dragStartObject.context) !== -1) {\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 document.addEventListener('mousemove', self.scrollGrid, false);\n document.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 } else if (self.attributes.selectionMode !== 'row') {\n self.mousemove(e);\n }\n return;\n }\n if (move) {\n self.draggingItem = self.dragItem;\n self.movingSelection = self.selections.concat([]);\n self.dragging = self.dragStartObject;\n if (\n self.dispatchEvent('beginmove', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n document.body.addEventListener('mousemove', self.dragMove, false);\n document.body.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 document.body.addEventListener('mousemove', self.freezeMove, false);\n document.body.addEventListener('mouseup', self.stopFreezeMove, false);\n return self.mousemove(e);\n }\n if (resize) {\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 document.body.addEventListener('mousemove', self.dragResizeColumn, false);\n document.body.addEventListener('mouseup', self.stopDragResize, false);\n return;\n }\n if (['row-reorder', 'column-reorder'].indexOf(self.dragMode) !== -1) {\n self.draggingItem = self.dragStartObject;\n if (\n self.dragMode === 'column-reorder' &&\n !self.isMultiColumnsSelected(self.currentCell.header.index)\n ) {\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 document.body.addEventListener('mousemove', self.dragReorder, false);\n document.body.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 var 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 firstSelectedRowIndex = self.selections.findIndex((el) => !!el);\n const firstSelectedRow = self.selections[firstSelectedRowIndex];\n const firstSelectedColumnIndex = firstSelectedRow[0];\n const lastSelectedColumn = firstSelectedRow[firstSelectedRow.length - 1];\n const yAtTop = y === 0;\n const yAtBottom = y === last;\n const xAtLeft = x === 0;\n const xAtRight = x === cols;\n\n if (e.key === 'ArrowUp') {\n if (y + 1 > firstSelectedRowIndex && !yAtTop) {\n self.selections.pop();\n } else if (y < firstSelectedRowIndex) {\n self.selections[y] = self.selections[y] || [];\n self.selections[y].push(x);\n } else if (yAtTop && self.activeCell.rowIndex !== 0) {\n self.selections.pop();\n }\n }\n\n if (e.key === 'ArrowDown') {\n if (y > firstSelectedRowIndex && y === self.selections.length) {\n self.selections[y] = self.selections[y] || [];\n self.selections[y].push(x);\n } else if (y >= firstSelectedRowIndex && !yAtBottom) {\n delete self.selections[y - 1];\n } else if (yAtBottom && self.activeCell.rowIndex !== last) {\n delete self.selections[y - 1];\n }\n }\n\n for (const selection of self.selections) {\n if (e.key === 'ArrowRight' && selection) {\n if (x > lastSelectedColumn) {\n selection.push(x);\n } else if (x <= lastSelectedColumn && !xAtRight) {\n selection.shift();\n } else if (xAtRight && self.activeCell.columnIndex !== cols) {\n selection.shift();\n }\n }\n\n if (e.key === 'ArrowLeft' && selection) {\n if (x < firstSelectedColumnIndex) {\n selection.unshift(x);\n } else if (x >= firstSelectedColumnIndex && !xAtLeft) {\n selection.pop();\n } else if (xAtLeft && self.activeCell.columnIndex !== 0) {\n selection.pop();\n }\n }\n }\n\n self.selectionBounds = self.getSelectionBounds();\n self.selectArea(undefined, ctrl);\n\n 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) {\n self.selections = [];\n }\n self.selections[y] = self.selections[y] || [];\n self.selections[y].push(x);\n ev = {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\n };\n Object.defineProperty(ev, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n self.dispatchEvent('selectionchanged', ev);\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 var e = e.NativeEvent || e;\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 ) {\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 var schema = self.getSchema();\n var rows = parseData(pasteValue, mimeType);\n\n // selected cell. This mimics Excel's paste functionality, and works\n // as a poor-man's fill-down.\n if (rows.length === 1 && rows[0].length === 1) {\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 var selections = [];\n for (var rowIndex = 0; rowIndex < rows.length; rowIndex++) {\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 + rowIndex];\n var cells = rows[rowIndex];\n\n var existingRowData = self.viewData[realRowIndex];\n var newRowData = Object.assign({}, existingRowData);\n\n selections[realRowIndex] = [];\n\n for (var colIndex = 0; colIndex < cells.length; colIndex++) {\n var column = schema[startColIndex + colIndex];\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[colIndex].value\n .map((item) => item.value)\n .join('');\n\n if (cellData === undefined || cellData === null) {\n newRowData[columnName] = existingRowData[columnName];\n continue;\n }\n\n selections[realRowIndex].push(startColIndex + colIndex);\n\n newRowData[columnName] = cellData;\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 self.selections = selections;\n }\n\n // selections is a sparse array, so we condense:\n var affectedCells = [];\n\n self.selections.forEach(function (row, rowIndex) {\n if (rowIndex === undefined) return;\n\n row.forEach(function (columnIndex) {\n affectedCells.push([\n rowIndex,\n columnIndex,\n self.getBoundRowIndexFromViewRowIndex(rowIndex),\n self.getBoundColumnIndexFromViewColumnIndex(columnIndex),\n ]);\n });\n });\n\n self.dispatchEvent('afterpaste', {\n cells: affectedCells,\n });\n\n return rows.length;\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.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 var itemToPaste = pasteableItems[0];\n\n let startCell = [];\n for (\n let rowIndex = 0, len = self.selections.length;\n rowIndex < len;\n rowIndex++\n ) {\n const row = self.selections[rowIndex];\n if (row) {\n if (row[0] === undefined) return;\n startCell = [rowIndex, row[0] < 0 ? row[1] : row[0]];\n break;\n }\n }\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(pasteValue, pasteType, startCell[0], startCell[1]);\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\n self.dispatchEvent('aftercut', {\n cells: affectedCells,\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 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 * 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.selections = [];\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 '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 self.getSelectedData = function (expandToRow) {\n const selectedData = [];\n const schema = self.getSchema();\n const viewDataLength = self.viewData.length;\n\n if (viewDataLength === 0) {\n return [];\n }\n\n // self.selections is a sparse array, so `viewRowIndex` here\n // will equal the row index as where it's rendered,\n // not as where it is in the original data array.\n self.selections.forEach(function (row, viewRowIndex) {\n if (!row) {\n return;\n }\n\n if (viewRowIndex === viewDataLength) {\n return;\n }\n\n if (row.length === 0) {\n selectedData[viewRowIndex] = null;\n return;\n }\n\n selectedData[viewRowIndex] = {};\n\n row.forEach(function (col) {\n if (col === -1 || !schema[col]) {\n return;\n }\n\n const orderedIndex = self.orders.columns[col];\n\n if (!expandToRow && schema[orderedIndex].hidden) {\n return;\n }\n\n if (self.viewData[viewRowIndex]) {\n selectedData[viewRowIndex][schema[orderedIndex].name] =\n self.viewData[viewRowIndex][schema[orderedIndex].name];\n }\n });\n });\n\n return selectedData;\n };\n self.getSelectedCells = function (expandToRow) {\n const selectedCells = [];\n const schema = self.getSchema();\n const viewDataLength = self.viewData.length;\n\n if (viewDataLength === 0) {\n return [];\n }\n\n for (const [viewRowIndex, row] of self.selections.entries()) {\n if (!row || row.length === 0) continue;\n\n for (const [, viewColumnIndex] of row.entries()) {\n if (viewColumnIndex === -1 || !schema[viewColumnIndex]) {\n continue;\n }\n\n const boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(\n viewColumnIndex,\n );\n\n if (!expandToRow && schema[boundColumnIndex].hidden) {\n continue;\n }\n\n if (self.viewData[viewRowIndex]) {\n const header = schema[boundColumnIndex];\n const value = self.viewData[viewRowIndex][header.name];\n const boundRowIndex = self.getBoundRowIndexFromViewRowIndex(\n viewRowIndex,\n );\n\n const cell = {\n value,\n header,\n boundRowIndex,\n boundColumnIndex,\n viewRowIndex,\n viewColumnIndex,\n };\n\n selectedCells.push(cell);\n }\n }\n }\n\n return selectedCells;\n };\n self.copySelectedCellsToClipboard = function (clipboardData) {\n const selectedData = [];\n const schema = self.getSchema();\n let firstRowAsString;\n let isNeat = true; // Selected like [[0, 1], [0, 1]] of [[0, 3]] is neat; Selected like [[0, 1], [1, 2]] is untidy\n\n for (const [rowIndex, row] of self.selections.entries()) {\n // If no cells are selected for a particular rowIndex the selections array will contain an empty element for that rowIndex.\n if (!row) continue;\n\n // Convert to string for easy comparison to the first row.\n const rowAsString = row.join(',').toString();\n const rowDict = {};\n\n if (!firstRowAsString) firstRowAsString = row.join(',').toString();\n if (isNeat && rowAsString !== firstRowAsString) isNeat = false;\n\n const boundRowIndex = self.getBoundRowIndexFromViewRowIndex(rowIndex);\n\n for (let columnIndex of row) {\n // If the whole row is selected the columnIndex for the rowHeader is -1.\n if (columnIndex < 0) continue;\n\n const boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(\n columnIndex,\n );\n const columnName = schema[boundColumnIndex].name;\n\n const value = self.originalData[boundRowIndex][columnName];\n\n rowDict[columnName] = value;\n }\n selectedData.push(rowDict);\n }\n\n if (selectedData.length > 0) {\n const textString = createTextString(selectedData, isNeat);\n const htmlString = createHTMLString(selectedData, isNeat);\n\n const copiedData = {\n 'text/plain': textString,\n 'text/html': htmlString,\n 'text/csv': textString,\n 'application/json': JSON.stringify(selectedData),\n };\n\n for (const [mimeType, data] of Object.entries(copiedData)) {\n clipboardData.setData(mimeType, data);\n }\n }\n };\n self.clearSelectedCells = function () {\n const schema = self.getSchema();\n const affectedCells = [];\n\n for (const [rowIndex, row] of self.selections.entries()) {\n // If no cells are selected for a particular rowIndex the selections array will contain an empty element for that rowIndex.\n if (!row) continue;\n\n const boundRowIndex = self.getBoundRowIndexFromViewRowIndex(rowIndex);\n\n for (let columnIndex of row) {\n // If the whole row is selected the columnIndex for the rowHeader is -1.\n if (columnIndex < 0) continue;\n\n const boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(\n columnIndex,\n );\n const columnName = schema[boundColumnIndex].name;\n\n self.viewData[boundRowIndex][columnName] = '';\n\n affectedCells.push([\n rowIndex,\n columnIndex,\n boundRowIndex,\n boundColumnIndex,\n ]);\n }\n }\n\n return affectedCells;\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.fitSelectedColumns = function (width) {\n const selectedColumns = self.selections[0];\n const schema = self.getSchema();\n\n for (const selectedColumn of selectedColumns) {\n // Make sure the column is not the row header and that the whole column has in fact been selected.\n if (selectedColumn >= 0 && self.isColumnSelected(selectedColumn)) {\n if (isNaN(width)) {\n const column = schema[self.orders.columns[selectedColumn]];\n self.fitColumnToValues(column.name);\n } else {\n self.sizes.columns[selectedColumn] = width;\n self.dispatchEvent('resizecolumn', {\n x: width,\n y: self.resizingStartingHeight,\n draggingItem: self.currentCell,\n });\n }\n }\n }\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 // 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('mouseup', self.mouseup, false);\n self.eventParent.removeEventListener('mousedown', self.mousedown, false);\n self.eventParent.removeEventListener('dblclick', self.dblclick, false);\n self.eventParent.removeEventListener('click', self.click, false);\n self.eventParent.removeEventListener('mousemove', self.mousemove);\n self.eventParent.removeEventListener('wheel', self.scrollWheel, false);\n self.canvas.removeEventListener('contextmenu', self.contextmenu, false);\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 document.body.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(\n ...Array(collapsedColCount)\n .fill()\n .map(function () {\n return '';\n }),\n );\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(\n Array(self.viewData[0].length)\n .fill()\n .map(function () {\n return '';\n }),\n );\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, 10);\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.selectRow = self.selectRow;\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 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 Object.defineProperty(self.intf, 'selections', {\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, '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'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 function addDefaultContextMenuItem(e) {\n var 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 (\n self.attributes.showCopy &&\n self.selections.reduce(function (p, r) {\n return p + r.length;\n }, 0) > 0\n ) {\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 self.paste(self.clipBoardData, e.cell.columnIndex, e.cell.rowIndex);\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 e.items.push({\n title: self.attributes.hideColumnText.replace(\n /%s/gi,\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n self.getSchema()[columnIndex].hidden = true;\n ev.preventDefault();\n self.stopPropagation(ev);\n self.disposeContextMenu();\n self.setStorageData();\n setTimeout(function () {\n self.resize(true);\n }, 10);\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 //#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 self.attributes.allowGroupingRows && e.cell.isRowHeader && e.cell.header;\n const canUngroupRows =\n self.attributes.allowGroupingRows && e.cell.isRowHeader;\n\n /**\n * The value for storing the return value from `self.getSchema()`\n * @type {any[]}\n */\n let schema;\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 if (!schema) schema = self.getSchema();\n columns = new Map(schema.map((_col) => [_col.columnIndex, _col]));\n }\n return columns;\n };\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 let range = [];\n let prev = -2;\n let ok = true;\n self.selections.forEach(function (row, index) {\n if (!ok) return;\n if (prev < -1) {\n prev = index;\n range[0] = index;\n return;\n }\n if (index !== prev + 1 || !row || row.length === 0) {\n ok = false;\n return;\n }\n prev = index;\n range[1] = index;\n });\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 ok &&\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 document.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 document.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 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 }\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 }\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('mouseup', self.mouseup, 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 document.body.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","/*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 /**\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 (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 * 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 = function (dontDraw) {\n self.selections = [];\n self.dispatchEvent('selectionchanged', {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.selectionBounds,\n selectedCells: self.getSelectedCells(),\n });\n if (dontDraw) {\n return;\n }\n self.draw();\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 self.selectArea({\n top: 0,\n left: -1,\n right: self.getSchema().length - 1,\n bottom: self.viewData.length - 1,\n });\n if (dontDraw) {\n return;\n }\n self.draw();\n };\n /**\n * Returns true if indices of columns next to the selected columnIndex is selected on every row.\n * @memberof canvasDatagrid\n * @name isMultiColumnsSelected\n * @method\n * @param {number} columnIndex The column index to check.\n */\n self.isMultiColumnsSelected = function (columnIndex) {\n var multiColIsSelected = true;\n self.viewData.forEach(function (row, rowIndex) {\n var columnIndices = self.selections[rowIndex];\n if (\n !columnIndices ||\n columnIndices.length <= 1 ||\n columnIndices.indexOf(columnIndex) === -1\n ) {\n multiColIsSelected = false;\n } else if (columnIndices.length > 1) {\n if (columnIndices[0] != columnIndex) multiColIsSelected = false;\n else {\n for (var i = 0; i < columnIndices.length - 1; i++) {\n if (columnIndices[i] + 1 != columnIndices[i + 1]) {\n multiColIsSelected = false;\n break;\n }\n }\n }\n }\n });\n return multiColIsSelected;\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 = function (columnIndex) {\n var colIsSelected = true;\n self.viewData.forEach(function (row, rowIndex) {\n if (\n !self.selections[rowIndex] ||\n self.selections[rowIndex].indexOf(columnIndex) === -1\n ) {\n colIsSelected = false;\n }\n });\n return colIsSelected;\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 var d = [],\n s = expandToRow ? self.getSchema() : self.getVisibleSchema(),\n l = self.viewData.length;\n self.selections.forEach(function (row, index) {\n if (index === l) {\n return;\n }\n if (row.length === 0) {\n d[index] = null;\n return;\n }\n d[index] = {};\n row.forEach(function (col) {\n if (col === -1 || !s[col]) {\n return;\n }\n fn(self.viewData, index, s[col].name);\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} supressSelectionchangedEvent When true, prevents the selectionchanged event from firing.\n */\n self.selectColumn = function (columnIndex, ctrl, shift, supressEvent) {\n var s, e, x;\n function addCol(i) {\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = self.selections[rowIndex] || [];\n if (self.selections[rowIndex].indexOf(i) === -1) {\n self.selections[rowIndex].push(i);\n }\n });\n }\n function removeCol(i) {\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = self.selections[rowIndex] || [];\n if (self.selections[rowIndex].indexOf(i) !== -1) {\n self.selections[rowIndex].splice(\n self.selections[rowIndex].indexOf(i),\n 1,\n );\n }\n });\n }\n if (shift) {\n if (!self.activeCell) {\n return;\n }\n s = Math.min(self.activeCell.columnIndex, columnIndex);\n e = Math.max(self.activeCell.columnIndex, columnIndex);\n for (x = s; e > x; x += 1) {\n addCol(x);\n }\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 (supressEvent) {\n return;\n }\n self.dispatchEvent('selectionchanged', {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\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 = function (rowIndex, ctrl, shift, supressEvent) {\n var x,\n st,\n en,\n s = self.getVisibleSchema();\n self.isMultiRowsSelected = false;\n function de() {\n if (supressEvent) {\n return;\n }\n self.dispatchEvent('selectionchanged', {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.selectionBounds,\n selectedCells: self.getSelectedCells(),\n });\n }\n function addRow(ri) {\n self.selections[ri] = [];\n self.selections[ri].push(-1);\n s.forEach(function (col, index) {\n self.selections[ri].push(self.orders.columns.indexOf(col.index));\n });\n }\n if (self.dragAddToSelection === false || self.dragObject === undefined) {\n if (\n self.selections[rowIndex] &&\n self.selections[rowIndex].length - 1 === s.length\n ) {\n if (ctrl) {\n self.selections[rowIndex] = [];\n de();\n return;\n }\n }\n }\n if (self.dragAddToSelection === true || self.dragObject === undefined) {\n if (shift && self.dragObject === undefined) {\n if (!self.activeCell) {\n return;\n }\n st = Math.min(self.activeCell.rowIndex, rowIndex);\n en = Math.max(self.activeCell.rowIndex, rowIndex);\n for (x = st; en >= x; x += 1) {\n addRow(x);\n }\n } else {\n addRow(rowIndex);\n }\n }\n de();\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 * 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 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 * @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 * @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 * 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 var sel = [];\n self.selections.forEach(function (row, rowIndex) {\n sel[rowIndex + offsetY] = [];\n row.forEach(function (colIndex) {\n sel[rowIndex + offsetY].push(colIndex + offsetX);\n });\n });\n self.selections = sel;\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 = function (dontDraw) {\n const affectedCells = self.clearSelectedCells();\n\n self.dispatchEvent('afterdelete', {\n cells: affectedCells,\n });\n\n if (dontDraw) {\n return;\n }\n\n requestAnimationFrame(() => self.draw());\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 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 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 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 cell.dragContext = cell.style;\n cell.context = 'row-resize';\n return cell;\n }\n if (/frozen-column-marker/.test(cell.style)) {\n cell.dragContext = cell.style;\n cell.context = 'col-resize';\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 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.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 * Gets the bounds of current selection.\n * @returns {rect} selection.\n * @memberof canvasDatagrid\n * @name getSelectionBounds\n * @method\n */\n self.getSelectionBounds = function () {\n var low = { x: Infinity, y: Infinity },\n high = { x: -Infinity, y: -Infinity };\n self.selections.forEach(function (row, rowIndex) {\n var maxCol, minCol;\n low.y = rowIndex < low.y ? rowIndex : low.y;\n high.y = rowIndex > high.y ? rowIndex : high.y;\n maxCol = Math.max.apply(null, row);\n minCol = Math.min.apply(null, row);\n low.x = minCol < low.x ? minCol : low.x;\n high.x = maxCol > high.x ? maxCol : high.x;\n });\n return {\n top: low.y,\n left: low.x,\n bottom: high.y,\n right: high.x,\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 * 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 */\n self.selectArea = function (bounds, ctrl) {\n self.selectionBounds = bounds || self.selectionBounds;\n var ev,\n x,\n y,\n s = self.getSchema();\n if (!ctrl) {\n self.selections = [];\n }\n if (\n self.selectionBounds.top < -1 ||\n self.selectionBounds.bottom > self.viewData.length ||\n self.selectionBounds.left < -1 ||\n self.selectionBounds.right > s.length\n ) {\n throw new Error('Impossible selection area');\n }\n for (\n x = self.selectionBounds.top;\n x <= self.selectionBounds.bottom;\n x += 1\n ) {\n self.selections[x] = [];\n for (\n y = self.selectionBounds.left;\n y <= self.selectionBounds.right;\n y += 1\n ) {\n if (self.selections[x].indexOf(y) === -1) {\n self.selections[x].push(y);\n }\n }\n }\n ev = {\n selections: self.selections,\n selectionBounds: self.selectionBounds,\n selectedCells: self.getSelectedCells(),\n };\n Object.defineProperty(ev, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n self.dispatchEvent('selectionchanged', ev);\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.headerCellPaddingRight +\n self.style.headerCellPaddingLeft;\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 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 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 '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","perfCounters","cachedImagesDrawn","drawCount","perfWindowSize","entityCount","scrollDebugCounters","touchPPSCounters","fillArray","low","high","step","x","undefined","drawHtml","cell","img","v","formattedValue","cacheKey","toString","rowIndex","columnIndex","Math","round","canvasOffsetLeft","y","canvasOffsetTop","htmlImageCache","height","width","complete","ctx","drawImage","Image","onload","loaded","Object","keys","html","draw","src","btoa","strokeLines","coords","beginPath","moveTo","lineTo","stroke","drawGroupHandle","collapsed","fillRect","strokeRect","cx","cy","drawCellTreeIcon","tree","rowTree","parentCount","iconSize","cellTreeIconWidth","scale","marginTop","cellTreeIconMarginTop","marginRight","cellTreeIconMarginRight","marginLeft","cellTreeIconMarginLeft","paddingLeft","icon","oldFillStyle","fillStyle","oldStrokeStyle","strokeStyle","hovered","hovers","onCellTreeIcon","cellTreeIconHoverFillColor","cellTreeIconFillColor","cellTreeIconBorderColor","rect","expand","lineWidth","cellTreeIconLineWidth","cellTreeIconLineColor","radiusRect","w","h","radius","r","b","quadraticCurveTo","fillText","text","clipFrozenArea","mode","lastFrozenColumnPixel","lastFrozenRowPixel","clip","fillHandle","selectionHandleType","arc","PI","fill","fillCircle","strokeHandle","strokeCircle","addBorderLine","c","pos","t","l","getFrozenColumnsWidth","s","getSchema","min","frozenColumn","collapsedGroups","getCollapsedColumnGroups","hidden","findIndex","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","performance","now","visibleRowHeights","orders","rows","createRowOrders","save","visibleRows","visibleCells","visibleGroups","offsetTop","offsetLeft","gridBackgroundColor","translate","ln","frozenRow","scrollBox","scrollLeft","scrollPixelLeft","cellBorderWidth","drawRow","allowFreezingRows","frozenMarkerBorderWidth","frozenMarkerWidth","drawFrozenRows","columnOrderIndex","rowOrderIndex","headerIndex","g","snapToRow","scrollTop","scrollPixelTop","scrollIndexTop","scrollIndexBottom","scrollPixelBottom","cellTree","hide","showNewRow","showRowHeaders","scrollIndexLeft","isColumnCollapsedByGroup","columns","drawCell","newRow","restore","drawRows","cl","activeCell","selectionMode","activeCellOverlayBorderWidth","activeCellOverlayBorderColor","getHeaderWidth","drawActiveCell","o","columnHeaderCell","header","nonFrozenHeaderWidth","drawHeaderColumnRange","start","end","title","cellWidth","index","order","rArgs","rhIndex","filteredRowNumber","getBoundRowIndexFromViewRowIndex","originalData","rowHeaderValue","hasActiveFilters","hasCollapsedRowGroup","rowHeaderCell","headerDescription","sizes","openChildren","drawRowHeader","showColumnHeaders","columnHeaderCellBorderWidth","scrollBarWidth","isColumnHeaderCell","isColumnHeaderCellCap","endCap","drawHeaders","dragStartObject","my","mx","xHover","yHover","allowFreezingColumns","frozenMarkerHoverColor","frozenMarkerColor","frozenMarkerHoverBorderColor","frozenMarkerBorderColor","unshift","freezeMarkerPosition","frozenMarkerActiveColor","frozenMarkerActiveBorderColor","dragMode","drawFrozenMarkers","mobile","allowMovingSelection","selectionHandleBorderWidth","selectionHandleBorderColor","selectionHandleColor","hw","selectionHandleSize","tr","br","tl","bl","addselectionHandle","az","touchSelectHandleZone","ax","ay","reorderObject","dragOffset","reorderMarkerBackgroundColor","reorderMarkerBorderWidth","reorderMarkerBorderColor","k","selections","getRowHeight","reorderMarkerIndexBorderWidth","reorderMarkerIndexBorderColor","reorderTarget","sortRowIndex","selectedColumns","sortColumnIndex","drawReorderMarkers","movingSelection","moveOverlayBorderWidth","moveOverlayBorderColor","setLineDash","moveOverlayBorderSegments","gridBorderWidth","gridBorderColor","dsb","selectionOverlayBorderWidth","selectionOverlayBorderColor","drawSelectionBorders","entities","scrollBarBoxMargin","scrollBarBorderColor","scrollBarBorderWidth","horizontalBox","scrollCache","horizontalBar","scrollBoxWidth","scrollWidth","verticalBox","verticalBar","scrollBoxHeight","scrollHeight","horizontalBarVisible","scrollBarBackgroundColor","scrollBarBoxColor","horizontalBoxVisible","context","scrollBarActiveColor","scrollBarBoxBorderRadius","verticalBarVisible","verticalBoxVisible","scrollBarCornerBorderColor","scrollBarCornerBackgroundColor","corner","frozenColumnsWidth","frozenRowsHeight","onTheLeft","columnGroupIndicatorPosition","onTheTop","rowGroupIndicatorPosition","groupingAreaBackgroundColor","groupedColumns","row","groups","j","assign","columnGroupRowHeight","toggleHandleSize","toggleHandlePadding","topY","centerY","bottomY","leftmostX","drawGroupHandleAtX","pushToVisibleGroups","leftX","rightX","x2","y2","crossTheFrozen","notInFrozen","colIndex","col","groupIndicatorColor","groupIndicatorBackgroundColor","ptr","left","right","containsBegining","containsEnd","rightCompare","compareX","minLeftX","lineCoords","groupedRows","colWidth","rowGroupColumnWidth","centerX","topmostY","drawGroupHandleAtY","top","bottom","bottomCompare","compareY","minTopY","drawGroupArea","showPerformance","debug","pop","font","debugFont","perf","reduce","a","toFixed","perfDelta","htmlImages","startScale","scaleDelta","zoomDeltaStart","touchLength","touches","touchPosition","touchPosition1","scrollIndex","scrollPixel","canvasOffset","touchDelta","touchAnimateTo","scrollAnimation","touchPPS","xPPS","yPPS","touchPPST","xPPST","yPPST","touchDuration","pointerLockPosition","size","mouse","touch","touchStart","hasFocus","dragContext","textAlign","debugBackgroundColor","key","debugColor","px","py","debugPerfChartBackground","debugScrollHeightColor","debugScrollWidthColor","debugPerformanceColor","debugEntitiesColor","debugTouchPPSXColor","debugTouchPPSYColor","dpl","apply","perfArr","arrIndex","max","color","useAbs","abs","drawPerfLine","debugPerfChartTextColor","drawPerfLines","createBorderOverlayArray","drawArray","propPrefix","offsetPoint","selectionBorder","isRowHeader","indexOf","isHeader","cellGridAttributes","cellStyle","isCorner","isColumnHeader","isFilterable","filterable","includes","wrap","cellWhiteSpace","selected","hoverMode","openedFilter","selectedFilterButton","active","rawValue","isGrid","activeHeader","f","formatters","orderByArrowSize","treeArrowSize","ev","value","nodeType","fontHeight","horizontalAlignment","verticalAlignment","paddingTop","paddingRight","paddingBottom","whiteSpace","lineHeight","cellLineHeight","lineSpacing","cellLineSpacing","offsetWidth","offsetHeight","offsetParent","viewRowIndex","viewColumnIndex","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","split","textHeight","autoResize","autoResizeRows","et","ellipsisText","line","cHeight","measureText","curSplitChar","measure","arr","map","splice","originText","stepLength","direction","substr","wrapText","treeCellPadding","isDrawText","vPos","hPos","stringify","pw","idx","idx_ord","drawText","selectionBorderTop","selectionBorderRight","selectionHandle","selectionBorderLeft","selectionBorderBottom","selectionHandleBehavior","createHandlesOverlayArray","moveOffset","posX","filterButtonWidth","posY","filterButtonHeight","filterButtonBorderColor","filterButtonBackgroundColor","filterButtonActiveBackgroundColor","onFilterButton","filterButtonHoverBackgroundColor","filterButtonBorderRadius","filterButtonArrowHeight","filterButtonArrowWidth","filterButtonArrowColor","filterButtonArrowBorderColor","drawFilterButtonArrow","drawFilterButton","isSorting","orderings","showRowNumberGaps","previousRowNumber","hasRowGap","find","barHeight","rowHeaderCellRowNumberGapHeight","barColor","rowHeaderCellRowNumberGapColor","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","drawAfterResize","dims","vb","nb","co","isScrollBoxCorner","sbw","ratio","bm","cellBorder","columnHeaderCellBorder","dataHeight","dataWidth","topGroupAreaHeight","leftGroupAreaWidth","ch","isColumnCollapsed","frozenWidth","accumulator","column","schemaIndex","columnWidth","setCanvasSize","args","setScrollBoxSize","checkScrollBoxVisibility","widthBoxRatio","heightBoxRatio","scrollBarBoxMinSize","scrollBarBoxWidth","bar","box","page","pageUpDownOverlap","resizeEditInput","scroll","overflowX","overflowY","dim","appliedInlineStyles","parentNodeStyle","dontDraw","floor","ellipsisCache","mousemove","overridePos","contextMenu","input","getLayerPos","dragBounds","sBounds","delta","ctrl","ctrlKey","metaKey","persistantSelectionMode","singleSelectionMode","getCellAt","NativeEvent","previousCell","clearTimeout","scrollTimer","isInGrid","rowBoundaryCrossed","columnBoundaryCrossed","cellBoundaryCrossed","prefix","draggingItem","dragItem","cursor","pc","rc","rx","ry","selecting","dragStart","shiftKey","getSelectionBounds","ignoreNextClick","contextmenuEvent","toggleCollapseTree","dragAddToSelection","event","getSelectedData","selectedCells","getSelectedCells","selectionBounds","selectRow","selectArea","isMultiRowsSelected","autoScrollOnMousemove","movedVertically","autoScrollMargin","movedHorizontally","autoScrollZone","getColumnGroupAt","getRowGroupAt","click","startingBounds","endEdit","toggleGroup","setStorageData","refresh","leftOffset","topOffset","xInGrid","yInGrid","setActiveCell","selectAll","checkSelectionChange","columnHeaderClickBehavior","treeArrowClickRadius","toggleTree","sb","dragResizeColumn","resizingStartingWidth","resizingStartingHeight","minColumnWidth","minRowHeight","resizeScrollZone","resizeChildGrids","globalRowResize","stopDragResize","hasMoved","dragItemIsSelected","isColumnSelected","fitSelectedColumns","body","scrollGrid","scrollPointerLock","scrollStartMode","movementX","movementY","scrollMode","scrollStart","scrollModes","setTimeout","scrollRepeatRate","selectionScrollIncrement","stopScrollGrid","exitPointerLock","dragReorder","columReorder","rowReorder","allowColumnReordering","allowRowReordering","isMultiColumnsSelected","selectColumn","source","reorderDeadZone","getVisibleCellByIndex","stopDragReorder","oIndex","tIndex","odata","cr","sortColumnIndices","seletedColumnIndices","deleteCount","selectedRows","dragMove","stopDragMove","moveSelection","freezeMove","stopFreezeMove","startFreezeMove","mousedown","lastMouseDownTarget","button","move","freeze","requestPointerLock","dragging","mouseup","controlInput","focus","getAdjacentCells","first","last","keydown","adjacentCells","cols","keepFocusOnMouseOut","isPrintableKeyEvent","beginEditAt","selectNone","deleteSelectedData","Number","isArrowKey","firstSelectedRowIndex","firstSelectedRow","firstSelectedColumnIndex","lastSelectedColumn","yAtTop","yAtBottom","xAtLeft","xAtRight","selection","shift","scrollIntoView","selectionFollowsActiveCell","keyup","keypress","dblclick","fitColumnToValues","autosize","cellTreeExpandCollapse","scrollWheel","deltaX","deltaY","deltaMode","touchHaltAnimation","scrollTo","pasteData","startRowIndex","startColIndex","cellData","forEachSelectedCell","colName","realRowIndex","cells","existingRowData","newRowData","columnName","boundRowIndexMap","affectedCells","getNextVisibleColumnIndex","visibleColumnIndex","getVisibleSchema","getVisibleColumnIndexOf","paste","editable","clipboardItems","Map","clipboardData","items","supportedMimeTypes","pasteableItems","itemToPaste","startCell","len","pasteType","getAsString","cut","copySelectedCellsToClipboard","clearSelectedCells","copy","touchMoving","touchScrollTimeout","animationFrames","getTouchPos","touchIndex","getBoundingClientRect","clientX","clientY","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","touchmove","passive","touchend","touchcancel","touchSelect","handleType","touchSelecting","bounds","rw","rScrollZone","lScrollZone","bScrollZone","tScrollZone","t1","t2","touchDeadZone","touchZoomSensitivity","touchZoomMin","touchZoomMax","selectionScrollZone","touchScroll","touchMove","dz","touchReleaseAcceleration","scrollAnimationPPSThreshold","ctor","treeGridAttributes","storageName","invalidSearchExpClass","localStyleLibraryStorageKey","add","sortFunction","sort","filters","tempSchema","columnTreeRowStartIndex","columnTreeRowEndIndex","origin","sorters","parsers","schemaHashes","changes","componentL1Events","eventNames","expandToRow","viewDataLength","orderedIndex","entries","firstRowAsString","rowAsString","rowDict","textString","copiedData","setData","has","allowGroupingColumns","allowGroupingRows","result","groupIndex","matchedGroup","allGroups","gi","nextCollapsed","isNewGroupRangeValid","groupsArray","gIndex","visibility","localStorage","setItem","createColumnOrders","selectedColumn","applyDefaultValue","defaultValue","createNewRowData","getSchemaNameHash","getFilteredAndSortedViewData","newViewData","originalRowIndex","headerName","filterText","getHeaderByName","currentFilterFunction","filterFrozenRows","newLen","from2","to2","slice","sortFn","rowA","rowB","rowIndexB","sortFrozenRows","getBestGuessDataType","drawChildGrids","gridKey","setTimer","validateColumn","setDefaults","obj1","obj2","setAttributes","setStyle","findColumnMaxTextLength","dispose","removeChild","eventParent","contextmenu","disconnect","tryLoadStoredSettings","reloadStoredValues","storedSettings","_typeof","tempData","collapsedCount","ctr","ri","lastchild","orTree","ctc","ci","_ri","child","_ci","si","otherData","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","cursorGrab","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","getClippingRect","setRowHeight","setColumnWidth","resetColumnWidths","resetRowHeights","assertPxColor","clearPxColorAssertions","integerToAlpha","addStyleKeyIfNoneExists","DOMStyles","set","valueObject","filterFor","blanksText","filterRegExp","pattern","exec","flags","substring","flagLength","invalidFilterRegEx","RegExp","toLocaleUpperCase","textContent","blur","TypeError","currentCursor","eventName","RangeError","isArray","getTypes","parseInnerHtml","callback","etl","autoGenerateSchema","autoResizeColumns","sHeight","sWidth","setScrollTop","preventScrollEvent","moveButtonPos","setScrollLeft","supressDrawEvent","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","x0","x1","y0","y1","node","newX1","newY1","contextPosition","isNormalCell","isBackground","isScrollBar","showFilter","showCopy","copyText","execCommand","showPaste","clipBoardData","pasteText","showColumnSelector","columnSelectorText","toggleColumnVisibility","columnSelectorHiddenText","columnSelectorVisibleText","hideColumnText","showClearSettingsOption","clearSettingsOptionText","allowSorting","showOrderByOption","showOrderByOptionTextAsc","showOrderByOptionTextDesc","groupAreaHeight","groupAreaWidth","setCollapseStateForAllGroups","showRemoveAllGroupColumns","showExpandAllGroupColumns","showCollapseAllGroupColumns","showRemoveAllGroupRows","showExpandAllGroupRows","showCollapseAllGroupRows","canGroupByColumns","canUngroupColumns","canGroupByRows","canUngroupRows","getColumnsMap","_col","groupIndexes","groupTitles","groupNames","showGroupColumns","cell0","cell1","formatArgs","showRemoveGroupColumns","range","prev","ok","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","Infinity","scrollingElement","editCell","borderWidth","mobileEditInputHeight","groupAreaOffsetY","groupAreaOffsetX","cellPaddingLeft","ignoreScrollOffset","calculatedTree","isTree","abort","newValue","oldValue","aborted","inEnterMode","enumItems","enu","option","valueInEnum","multiLine","editCellZIndex","fontSize","editCellFontSize","cellValueIsEmpty","shouldClearCellValue","nx","ny","altKey","nextRowIndex","className","css","padding","buttonPadding","borderStyle","borderColor","buttonBorderColor","buttonBackgroundColor","userSelect","buttonHoverBackgroundColor","buttonActiveBorderColor","buttonActiveBackgroundColor","verticalAlign","buttonArrowColor","fontWeight","fontFamily","contextMenuFontFamily","contextMenuFontSize","margin","contextMenuItemMargin","borderRadius","contextMenuItemBorderRadius","contextMenuHoverBackground","contextMenuHoverColor","contextMenuLabelMargin","contextMenuLabelDisplay","contextMenuLabelMinWidth","contextMenuLabelMaxWidth","contextMenuBackground","contextMenuColor","border","contextMenuBorder","contextMenuPadding","contextMenuBorderRadius","contextMenuOpacity","overflow","contextMenuCursor","contextFilterInputBorder","contextFilterInputBorderRadius","contextFilterInputFontFamily","contextFilterInputFontSize","contextFilterButtonBorder","contextFilterButtonBorderRadius","contextMenuFilterButtonFontFamily","contextMenuFilterButtonFontSize","cssFloat","childContextMenuArrowColor","contextMenuChildArrowFontSize","boxSizing","outline","mobileEditFontFamily","mobileEditFontSize","editCellBorder","editCellColor","editCellBackgroundColor","appearance","webkitAppearance","mozAppearance","editCellPaddingLeft","editCellFontFamily","boxShadow","editCellBoxShadow","contextMenuFilterInvalidExpresion","onblur","parentIsCanvas","getContext","textBaseline","addGroup","groupFor","removeGroup","ordA","charCodeAt","fromCharCode","showFilterInCell","offsetX","offsetY","targetX","targetY","sbh","offset","treeData","matched","multiColIsSelected","columnIndices","colIsSelected","supressEvent","addCol","st","de","dragObject","trArgs","treeGridHeight","newSize","dontSetStorageData","sorter","firstColumnName","lastColumnName","firstOne","lastOne","it","error","rowIndexFrom","rowIndexTo","isInteger","dataLength","sel","xi","visibleSchema","selectionLength","maxRowLength","minXi","yi","lastSourceIndex","cidx","useTouchScrollZones","getBorder","entitiy","borderResizeZone","moveBorder","tsz","touchScrollZone","moveMode","borderDragBehavior","xBorderBehavior","yBorderBehavior","isVerticalScrollBar","isHorizontalScrollBar","allowColumnResize","allowColumnResizeFromCell","allowRowHeaderResize","allowRowResize","allowRowResizeFromCell","columnGrabZoneSize","rowGrabZoneSize","maxCol","minCol","rowHeaderCellFont","autosizePadding","autosizeHeaderCellPadding","rowHeaderCellPaddingRight","rowHeaderCellPaddingLeft","formatter","columnHeaderCellFont","headerCellPaddingRight","headerCellPaddingLeft","cellFont","cellPaddingRight","cellAutoResizePadding","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/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/contextMenu.js","../lib/button.js","../lib/dom.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 ['blanksText', '(Blanks)'],\n ['borderDragBehavior', 'none'],\n ['borderResizeZone', 10],\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 ['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 ['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(236, 243, 255, 1)'],\n ['frozenMarkerHoverBorderColor', 'rgba(110, 168, 255, 1)'],\n ['frozenMarkerActiveColor', 'rgba(236, 243, 255, 1)'],\n ['frozenMarkerActiveBorderColor', 'rgba(110, 168, 255, 1)'],\n ['frozenMarkerColor', 'rgba(222, 222, 222, 1)'],\n ['frozenMarkerBorderColor', 'rgba(168, 168, 168, 1)'],\n ['frozenMarkerBorderWidth', 1],\n ['frozenMarkerWidth', 2],\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 ['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 ['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 ['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 = defs.defaults.styles;\n defs.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","/*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\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 */\n function strokeLines(coords) {\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 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 strokeLines([x + width * 0.2, cy, x + width * 0.78, cy]);\n if (collapsed) strokeLines([cx, y + width * 0.22, cx, y + width * 0.8]);\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 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 (\n cell.selectionBorderTop &&\n cell.selectionBorderLeft &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'tl']);\n cell.selectionHandle = 'tl';\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 }\n }\n function createBorderOverlayArray(\n cell,\n drawArray,\n propPrefix,\n offsetPoint,\n ) {\n offsetPoint = offsetPoint || { x: 0, y: 0 };\n cell.selectionBorder = '';\n if (\n !cell.isRowHeader &&\n self.selections[cell.rowIndex + -offsetPoint.y] &&\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) !== -1\n ) {\n if (\n (!self.selections[cell.rowIndex - 1 + -offsetPoint.y] ||\n self.selections[cell.rowIndex - 1 + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) === -1 ||\n cell.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 !self.selections[cell.rowIndex + 1 + -offsetPoint.y] ||\n self.selections[cell.rowIndex + 1 + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) === -1\n ) {\n drawArray.push([cell, 'b']);\n cell[propPrefix + 'BorderBottom'] = true;\n cell[propPrefix + 'Border'] += 'b';\n }\n if (\n !self.selections[cell.rowIndex + -offsetPoint.y] ||\n cell.columnIndex === 0 ||\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex - 1 + -offsetPoint.x,\n ) === -1\n ) {\n drawArray.push([cell, 'l']);\n cell[propPrefix + 'BorderLeft'] = true;\n cell[propPrefix + 'Border'] += 'l';\n }\n if (\n !self.selections[cell.rowIndex + -offsetPoint.y] ||\n cell.columnIndex === schema.length ||\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex + 1 + -offsetPoint.x,\n ) === -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 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 selected =\n self.selections[rowOrderIndex] &&\n self.selections[rowOrderIndex].indexOf(columnOrderIndex) !== -1,\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 activeHeader =\n (self.orders.rows[self.activeCell.rowIndex] === rowOrderIndex ||\n self.orders.columns[self.activeCell.columnIndex] ===\n headerIndex) &&\n (columnOrderIndex === -1 || rowOrderIndex === -1)\n ? isRowHeader\n ? 'activeRowHeaderCell'\n : 'activeColumnHeaderCell'\n : false,\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 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\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 x += cell.width + (bc ? 0 : self.style.cellBorderWidth);\n return cell.width;\n };\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 const filteredRowNumber =\n self.viewData && rowIndex < self.viewData.length\n ? self.getBoundRowIndexFromViewRowIndex(rowIndex) + 1\n : self.originalData\n ? self.originalData.length + 1\n : rowOrderIndex + 1;\n\n const rowHeaderValue =\n self.hasActiveFilters() || self.hasCollapsedRowGroup()\n ? filteredRowNumber\n : rowIndex + 1;\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 }\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 = 0;\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.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 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 strokeLines(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 strokeLines(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 y +=\n self.style.frozenMarkerBorderWidth +\n self.style.frozenMarkerWidth -\n 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 for (var k = 0; k < self.selections.length; k++) {\n if (!self.selections[k] || k == self.reorderObject.rowIndex) continue;\n b.height += self.getRowHeight(k);\n }\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.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 var selectedColumns = self.selections[0];\n for (var k = 1; k < selectedColumns.length; k++) {\n b.width += self.getColumnWidth(\n self.orders.columns[selectedColumns[k]],\n );\n }\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.currentCell.sortColumnIndex !==\n self.reorderObject.sortColumnIndex &&\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 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 self.ctx.lineWidth = self.style.selectionOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.selectionOverlayBorderColor;\n function dsb(c) {\n addBorderLine(c[0], c[1]);\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 function drawSelectionHandles() {\n if (self.mobile || self.attributes.allowMovingSelection) {\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 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 if (self.dragStartObject !== undefined) return;\n var my = self.lastFrozenRowPixel - self.style.frozenMarkerWidth,\n mx = self.lastFrozenColumnPixel - self.style.frozenMarkerBorderWidth,\n xHover =\n self.currentCell && self.currentCell.style === 'frozen-row-marker',\n yHover =\n self.currentCell && self.currentCell.style === 'frozen-column-marker';\n self.ctx.lineWidth = self.style.frozenMarkerBorderWidth;\n if (self.attributes.allowFreezingColumns) {\n self.ctx.fillStyle = yHover\n ? self.style.frozenMarkerHoverColor\n : self.style.frozenMarkerColor;\n self.ctx.strokeStyle = yHover\n ? self.style.frozenMarkerHoverBorderColor\n : self.style.frozenMarkerBorderColor;\n fillRect(mx, 0, self.style.frozenMarkerWidth, self.height);\n strokeRect(mx, 0, self.style.frozenMarkerWidth, self.height);\n self.visibleCells.unshift({\n x: mx,\n y: 0,\n height: self.height,\n width:\n self.style.frozenMarkerWidth + self.style.frozenMarkerBorderWidth,\n style: 'frozen-column-marker',\n });\n }\n if (self.attributes.allowFreezingRows) {\n self.ctx.fillStyle = xHover\n ? self.style.frozenMarkerHoverColor\n : self.style.frozenMarkerColor;\n self.ctx.strokeStyle = xHover\n ? self.style.frozenMarkerHoverBorderColor\n : self.style.frozenMarkerBorderColor;\n fillRect(0, my, self.width, self.style.frozenMarkerWidth);\n strokeRect(0, my, self.width, self.style.frozenMarkerWidth);\n const height =\n self.style.frozenMarkerWidth + self.style.frozenMarkerBorderWidth;\n self.visibleCells.unshift({\n x: 0,\n y: my,\n height,\n width: self.width,\n style: 'frozen-row-marker',\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 fillRect(\n self.freezeMarkerPosition.x,\n 0,\n self.style.frozenMarkerWidth,\n self.height,\n );\n strokeRect(\n self.freezeMarkerPosition.x,\n 0,\n self.style.frozenMarkerWidth,\n self.height,\n );\n } else {\n fillRect(\n 0,\n self.freezeMarkerPosition.y,\n self.width,\n self.style.frozenMarkerWidth,\n );\n strokeRect(\n 0,\n self.freezeMarkerPosition.y,\n self.width,\n self.style.frozenMarkerWidth,\n );\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 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 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 s = self.getSchema();\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 self.scrollCache.x = [];\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 const collapsedColumnGroups = self.getCollapsedColumnGroups();\n const isColumnCollapsed = (columnIndex) =>\n collapsedColumnGroups.findIndex(\n (group) => columnIndex >= group.from && columnIndex <= group.to,\n ) >= 0;\n /** @type {number} it will be used in `reduceSchema` only */\n let frozenWidth = 0;\n 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 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 self.canvas.width = self.width * ratio;\n self.canvas.height = self.height * ratio;\n self.ctx.scale(ratio, ratio);\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 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 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 }\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 (\n self.selections[cell.rowIndex] &&\n self.selections[cell.rowIndex].indexOf(cell.columnIndex) !==\n -1\n ) {\n self.selections[cell.rowIndex].splice(\n self.selections[cell.rowIndex].indexOf(cell.columnIndex),\n 1,\n );\n }\n } else {\n self.selections[cell.rowIndex] =\n self.selections[cell.rowIndex] || [];\n if (\n self.selections[cell.rowIndex].indexOf(cell.columnIndex) ===\n -1\n ) {\n self.selections[cell.rowIndex].push(cell.columnIndex);\n var event = {\n selections: self.selections,\n selectedData: self.getSelectedData(),\n selectedCells: self.getSelectedCells(),\n selectionBounds: self.getSelectionBounds(),\n };\n self.dispatchEvent('selectionchanged', event);\n }\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.selections = [];\n }\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 if (sBounds.left == -1 && sBounds.top !== sBounds.bottom)\n self.isMultiRowsSelected = true;\n }\n }\n\n if (self.attributes.autoScrollOnMousemove) {\n var movedVertically = delta.y > self.attributes.autoScrollMargin;\n var movedHorizontally = 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 ev = {\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\n };\n Object.defineProperty(ev, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n self.dispatchEvent('selectionchanged', ev);\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 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 self.selections[i.rowIndex] = self.selections[i.rowIndex] || [];\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 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('resizecolumn', {\n x: x,\n y: y,\n draggingItem: self.draggingItem,\n })\n ) {\n return false;\n }\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 self.draggingItem.header.style === 'rowHeaderCell'\n ? 'cornerCell'\n : self.draggingItem.sortColumnIndex\n ] = x;\n if (\n ['rowHeaderCell', 'cornerCell'].indexOf(\n self.draggingItem.header.style,\n ) !== -1\n ) {\n self.resize(true);\n }\n self.resizeChildGrids();\n return;\n }\n if (self.dragMode === 'ns-resize') {\n if (self.draggingItem.rowOpen) {\n self.sizes.trees[self.draggingItem.rowIndex] = y;\n } else if (self.attributes.globalRowResize) {\n self.style.cellHeight = y;\n } else {\n self.sizes.rows[self.draggingItem.rowIndex] = y;\n }\n self.dispatchEvent('resizerow', { row: y });\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.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 }\n\n self.resize();\n document.body.removeEventListener(\n 'mousemove',\n self.dragResizeColumn,\n false,\n );\n document.body.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 document.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 (\n self.dragMode === 'column-reorder' &&\n !self.isMultiColumnsSelected(self.draggingItem.header.index)\n ) {\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.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 var oIndex,\n tIndex,\n odata = [],\n cr = {\n 'row-reorder': self.orders.rows,\n 'column-reorder': self.orders.columns,\n },\n i = {\n 'row-reorder': 'rowIndex',\n 'column-reorder': 'sortColumnIndex',\n }[self.dragMode];\n document.body.removeEventListener('mousemove', self.dragReorder, false);\n document.body.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[i] !== self.reorderTarget[i] &&\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 oIndex = cr[self.dragMode].indexOf(self.reorderObject[i]);\n tIndex = cr[self.dragMode].indexOf(self.reorderTarget[i]);\n if (self.dragMode === 'column-reorder') {\n var sortColumnIndices = [];\n var seletedColumnIndices = [];\n if (self.selections[0]) {\n self.selections[0].forEach(function (value) {\n sortColumnIndices.push(self.orders.columns[value]);\n });\n }\n var deleteCount = sortColumnIndices.length;\n cr[self.dragMode].splice(oIndex, deleteCount);\n if (tIndex > oIndex) tIndex = tIndex - (deleteCount - 1);\n for (var i = 0; i < sortColumnIndices.length; i++) {\n seletedColumnIndices.push(tIndex + i);\n cr[self.dragMode].splice(tIndex + i, 0, sortColumnIndices[i]);\n }\n self.orders.columns = cr[self.dragMode];\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = seletedColumnIndices;\n });\n } else {\n var selectedRows = [];\n self.selections.forEach(function (row, rowIndex) {\n if (row) {\n selectedRows.push(row);\n odata.push(self.viewData[rowIndex]);\n }\n });\n self.viewData.splice(oIndex, odata.length);\n self.selections = [];\n if (tIndex > oIndex) tIndex = tIndex - (odata.length - 1);\n self.activeCell.rowIndex = tIndex;\n for (var i = 0; i < odata.length; i++) {\n self.viewData.splice(tIndex + i, 0, odata[i]);\n self.selections[tIndex + i] = selectedRows[i];\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 document.body.removeEventListener('mousemove', self.dragMove, false);\n document.body.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 bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n columnHeaderCellBorder = self.style.columnHeaderCellBorderWidth * bm,\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth();\n\n self.ignoreNextClick = true;\n self.freezeMarkerPosition = pos;\n pos.x -= self.getRowGroupAreaWidth();\n pos.y -= self.getColumnGroupAreaHeight();\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 self.scrollBox.scrollLeft = 0;\n self.frozenColumn = self.currentCell.columnIndex + 1;\n self.scrollBox.bar.h.x =\n rowHeaderCellWidth + self.scrollCache.x[self.frozenColumn - 1];\n self.scrollBox.box.h.x =\n rowHeaderCellWidth + self.scrollCache.x[self.frozenColumn - 1];\n var dataWidth = self.scrollCache.x[self.scrollCache.x.length - 1];\n self.scrollBox.widthBoxRatio =\n (self.scrollBox.width - self.scrollCache.x[self.frozenColumn - 1]) /\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 self.stopFreezeMove = function (e) {\n document.body.removeEventListener('mousemove', self.freezeMove, false);\n document.body.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 };\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 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 ) {\n if (\n !(self.dragMode == 'row-reorder' && self.isMultiRowsSelected) &&\n !(self.currentCell.hovered && self.hovers.onFilterButton)\n ) {\n self.selections = [];\n }\n }\n if (self.dragStartObject.isGrid) {\n return;\n }\n if (self.scrollModes.indexOf(self.dragStartObject.context) !== -1) {\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 document.addEventListener('mousemove', self.scrollGrid, false);\n document.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 } else if (self.attributes.selectionMode !== 'row') {\n self.mousemove(e);\n }\n return;\n }\n if (move) {\n self.draggingItem = self.dragItem;\n self.movingSelection = self.selections.concat([]);\n self.dragging = self.dragStartObject;\n if (\n self.dispatchEvent('beginmove', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n document.body.addEventListener('mousemove', self.dragMove, false);\n document.body.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 document.body.addEventListener('mousemove', self.freezeMove, false);\n document.body.addEventListener('mouseup', self.stopFreezeMove, false);\n return self.mousemove(e);\n }\n if (resize) {\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 document.body.addEventListener('mousemove', self.dragResizeColumn, false);\n document.body.addEventListener('mouseup', self.stopDragResize, false);\n return;\n }\n if (['row-reorder', 'column-reorder'].indexOf(self.dragMode) !== -1) {\n self.draggingItem = self.dragStartObject;\n if (\n self.dragMode === 'column-reorder' &&\n !self.isMultiColumnsSelected(self.currentCell.header.index)\n ) {\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 document.body.addEventListener('mousemove', self.dragReorder, false);\n document.body.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 var 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 firstSelectedRowIndex = self.selections.findIndex((el) => !!el);\n const firstSelectedRow = self.selections[firstSelectedRowIndex];\n const firstSelectedColumnIndex = firstSelectedRow[0];\n const lastSelectedColumn = firstSelectedRow[firstSelectedRow.length - 1];\n const yAtTop = y === 0;\n const yAtBottom = y === last;\n const xAtLeft = x === 0;\n const xAtRight = x === cols;\n\n if (e.key === 'ArrowUp') {\n if (y + 1 > firstSelectedRowIndex && !yAtTop) {\n self.selections.pop();\n } else if (y < firstSelectedRowIndex) {\n self.selections[y] = self.selections[y] || [];\n self.selections[y].push(x);\n } else if (yAtTop && self.activeCell.rowIndex !== 0) {\n self.selections.pop();\n }\n }\n\n if (e.key === 'ArrowDown') {\n if (y > firstSelectedRowIndex && y === self.selections.length) {\n self.selections[y] = self.selections[y] || [];\n self.selections[y].push(x);\n } else if (y >= firstSelectedRowIndex && !yAtBottom) {\n delete self.selections[y - 1];\n } else if (yAtBottom && self.activeCell.rowIndex !== last) {\n delete self.selections[y - 1];\n }\n }\n\n for (const selection of self.selections) {\n if (e.key === 'ArrowRight' && selection) {\n if (x > lastSelectedColumn) {\n selection.push(x);\n } else if (x <= lastSelectedColumn && !xAtRight) {\n selection.shift();\n } else if (xAtRight && self.activeCell.columnIndex !== cols) {\n selection.shift();\n }\n }\n\n if (e.key === 'ArrowLeft' && selection) {\n if (x < firstSelectedColumnIndex) {\n selection.unshift(x);\n } else if (x >= firstSelectedColumnIndex && !xAtLeft) {\n selection.pop();\n } else if (xAtLeft && self.activeCell.columnIndex !== 0) {\n selection.pop();\n }\n }\n }\n\n self.selectionBounds = self.getSelectionBounds();\n self.selectArea(undefined, ctrl);\n\n 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) {\n self.selections = [];\n }\n self.selections[y] = self.selections[y] || [];\n self.selections[y].push(x);\n ev = {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\n };\n Object.defineProperty(ev, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n self.dispatchEvent('selectionchanged', ev);\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 var e = e.NativeEvent || e;\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 ) {\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 var schema = self.getSchema();\n var rows = parseData(pasteValue, mimeType);\n\n // selected cell. This mimics Excel's paste functionality, and works\n // as a poor-man's fill-down.\n if (rows.length === 1 && rows[0].length === 1) {\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 var selections = [];\n for (var rowIndex = 0; rowIndex < rows.length; rowIndex++) {\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 + rowIndex];\n var cells = rows[rowIndex];\n\n var existingRowData = self.viewData[realRowIndex];\n var newRowData = Object.assign({}, existingRowData);\n\n selections[realRowIndex] = [];\n\n for (var colIndex = 0; colIndex < cells.length; colIndex++) {\n var column = schema[startColIndex + colIndex];\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[colIndex].value\n .map((item) => item.value)\n .join('');\n\n if (cellData === undefined || cellData === null) {\n newRowData[columnName] = existingRowData[columnName];\n continue;\n }\n\n selections[realRowIndex].push(startColIndex + colIndex);\n\n newRowData[columnName] = cellData;\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 self.selections = selections;\n }\n\n // selections is a sparse array, so we condense:\n var affectedCells = [];\n\n self.selections.forEach(function (row, rowIndex) {\n if (rowIndex === undefined) return;\n\n row.forEach(function (columnIndex) {\n affectedCells.push([\n rowIndex,\n columnIndex,\n self.getBoundRowIndexFromViewRowIndex(rowIndex),\n self.getBoundColumnIndexFromViewColumnIndex(columnIndex),\n ]);\n });\n });\n\n self.dispatchEvent('afterpaste', {\n cells: affectedCells,\n });\n\n return rows.length;\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.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 var itemToPaste = pasteableItems[0];\n\n let startCell = [];\n for (\n let rowIndex = 0, len = self.selections.length;\n rowIndex < len;\n rowIndex++\n ) {\n const row = self.selections[rowIndex];\n if (row) {\n if (row[0] === undefined) return;\n startCell = [rowIndex, row[0] < 0 ? row[1] : row[0]];\n break;\n }\n }\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(pasteValue, pasteType, startCell[0], startCell[1]);\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\n self.dispatchEvent('aftercut', {\n cells: affectedCells,\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 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 * 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.selections = [];\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 '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 self.getSelectedData = function (expandToRow) {\n const selectedData = [];\n const schema = self.getSchema();\n const viewDataLength = self.viewData.length;\n\n if (viewDataLength === 0) {\n return [];\n }\n\n // self.selections is a sparse array, so `viewRowIndex` here\n // will equal the row index as where it's rendered,\n // not as where it is in the original data array.\n self.selections.forEach(function (row, viewRowIndex) {\n if (!row) {\n return;\n }\n\n if (viewRowIndex === viewDataLength) {\n return;\n }\n\n if (row.length === 0) {\n selectedData[viewRowIndex] = null;\n return;\n }\n\n selectedData[viewRowIndex] = {};\n\n row.forEach(function (col) {\n if (col === -1 || !schema[col]) {\n return;\n }\n\n const orderedIndex = self.orders.columns[col];\n\n if (!expandToRow && schema[orderedIndex].hidden) {\n return;\n }\n\n if (self.viewData[viewRowIndex]) {\n selectedData[viewRowIndex][schema[orderedIndex].name] =\n self.viewData[viewRowIndex][schema[orderedIndex].name];\n }\n });\n });\n\n return selectedData;\n };\n self.getSelectedCells = function (expandToRow) {\n const selectedCells = [];\n const schema = self.getSchema();\n const viewDataLength = self.viewData.length;\n\n if (viewDataLength === 0) {\n return [];\n }\n\n for (const [viewRowIndex, row] of self.selections.entries()) {\n if (!row || row.length === 0) continue;\n\n for (const [, viewColumnIndex] of row.entries()) {\n if (viewColumnIndex === -1 || !schema[viewColumnIndex]) {\n continue;\n }\n\n const boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(\n viewColumnIndex,\n );\n\n if (!expandToRow && schema[boundColumnIndex].hidden) {\n continue;\n }\n\n if (self.viewData[viewRowIndex]) {\n const header = schema[boundColumnIndex];\n const value = self.viewData[viewRowIndex][header.name];\n const boundRowIndex = self.getBoundRowIndexFromViewRowIndex(\n viewRowIndex,\n );\n\n const cell = {\n value,\n header,\n boundRowIndex,\n boundColumnIndex,\n viewRowIndex,\n viewColumnIndex,\n };\n\n selectedCells.push(cell);\n }\n }\n }\n\n return selectedCells;\n };\n self.copySelectedCellsToClipboard = function (clipboardData) {\n const selectedData = [];\n const schema = self.getSchema();\n let firstRowAsString;\n let isNeat = true; // Selected like [[0, 1], [0, 1]] of [[0, 3]] is neat; Selected like [[0, 1], [1, 2]] is untidy\n\n for (const [rowIndex, row] of self.selections.entries()) {\n // If no cells are selected for a particular rowIndex the selections array will contain an empty element for that rowIndex.\n if (!row) continue;\n\n // Convert to string for easy comparison to the first row.\n const rowAsString = row.join(',').toString();\n const rowDict = {};\n\n if (!firstRowAsString) firstRowAsString = row.join(',').toString();\n if (isNeat && rowAsString !== firstRowAsString) isNeat = false;\n\n const boundRowIndex = self.getBoundRowIndexFromViewRowIndex(rowIndex);\n\n for (let columnIndex of row) {\n // If the whole row is selected the columnIndex for the rowHeader is -1.\n if (columnIndex < 0) continue;\n\n const boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(\n columnIndex,\n );\n const columnName = schema[boundColumnIndex].name;\n\n const value = self.originalData[boundRowIndex][columnName];\n\n rowDict[columnName] = value;\n }\n selectedData.push(rowDict);\n }\n\n if (selectedData.length > 0) {\n const textString = createTextString(selectedData, isNeat);\n const htmlString = createHTMLString(selectedData, isNeat);\n\n const copiedData = {\n 'text/plain': textString,\n 'text/html': htmlString,\n 'text/csv': textString,\n 'application/json': JSON.stringify(selectedData),\n };\n\n for (const [mimeType, data] of Object.entries(copiedData)) {\n clipboardData.setData(mimeType, data);\n }\n }\n };\n self.clearSelectedCells = function () {\n const schema = self.getSchema();\n const affectedCells = [];\n\n for (const [rowIndex, row] of self.selections.entries()) {\n // If no cells are selected for a particular rowIndex the selections array will contain an empty element for that rowIndex.\n if (!row) continue;\n\n const boundRowIndex = self.getBoundRowIndexFromViewRowIndex(rowIndex);\n\n for (let columnIndex of row) {\n // If the whole row is selected the columnIndex for the rowHeader is -1.\n if (columnIndex < 0) continue;\n\n const boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(\n columnIndex,\n );\n const columnName = schema[boundColumnIndex].name;\n\n self.originalData[boundRowIndex][columnName] = '';\n\n affectedCells.push([\n rowIndex,\n columnIndex,\n boundRowIndex,\n boundColumnIndex,\n ]);\n }\n }\n\n return affectedCells;\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.fitSelectedColumns = function (width) {\n const selectedColumns = self.selections[0];\n const schema = self.getSchema();\n\n for (const selectedColumn of selectedColumns) {\n // Make sure the column is not the row header and that the whole column has in fact been selected.\n if (selectedColumn >= 0 && self.isColumnSelected(selectedColumn)) {\n if (isNaN(width)) {\n const column = schema[self.orders.columns[selectedColumn]];\n self.fitColumnToValues(column.name);\n } else {\n self.sizes.columns[selectedColumn] = width;\n self.dispatchEvent('resizecolumn', {\n x: width,\n y: self.resizingStartingHeight,\n draggingItem: self.currentCell,\n });\n }\n }\n }\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 // 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('mouseup', self.mouseup, false);\n self.eventParent.removeEventListener('mousedown', self.mousedown, false);\n self.eventParent.removeEventListener('dblclick', self.dblclick, false);\n self.eventParent.removeEventListener('click', self.click, false);\n self.eventParent.removeEventListener('mousemove', self.mousemove);\n self.eventParent.removeEventListener('wheel', self.scrollWheel, false);\n self.canvas.removeEventListener('contextmenu', self.contextmenu, false);\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 document.body.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(\n ...Array(collapsedColCount)\n .fill()\n .map(function () {\n return '';\n }),\n );\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(\n Array(self.viewData[0].length)\n .fill()\n .map(function () {\n return '';\n }),\n );\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, 10);\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.selectRow = self.selectRow;\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 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 Object.defineProperty(self.intf, 'selections', {\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, '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'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 function addDefaultContextMenuItem(e) {\n var 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 (\n self.attributes.showCopy &&\n self.selections.reduce(function (p, r) {\n return p + r.length;\n }, 0) > 0\n ) {\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 self.paste(self.clipBoardData, e.cell.columnIndex, e.cell.rowIndex);\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 e.items.push({\n title: self.attributes.hideColumnText.replace(\n /%s/gi,\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n self.getSchema()[columnIndex].hidden = true;\n ev.preventDefault();\n self.stopPropagation(ev);\n self.disposeContextMenu();\n self.setStorageData();\n setTimeout(function () {\n self.resize(true);\n }, 10);\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 //#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 self.attributes.allowGroupingRows && e.cell.isRowHeader && e.cell.header;\n const canUngroupRows =\n self.attributes.allowGroupingRows && e.cell.isRowHeader;\n\n /**\n * The value for storing the return value from `self.getSchema()`\n * @type {any[]}\n */\n let schema;\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 if (!schema) schema = self.getSchema();\n columns = new Map(schema.map((_col) => [_col.columnIndex, _col]));\n }\n return columns;\n };\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 let range = [];\n let prev = -2;\n let ok = true;\n self.selections.forEach(function (row, index) {\n if (!ok) return;\n if (prev < -1) {\n prev = index;\n range[0] = index;\n return;\n }\n if (index !== prev + 1 || !row || row.length === 0) {\n ok = false;\n return;\n }\n prev = index;\n range[1] = index;\n });\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 ok &&\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 document.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 document.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 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 }\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 }\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('mouseup', self.mouseup, 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 document.body.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","/*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 /**\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 (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 * 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 = function (dontDraw) {\n self.selections = [];\n self.dispatchEvent('selectionchanged', {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.selectionBounds,\n selectedCells: self.getSelectedCells(),\n });\n if (dontDraw) {\n return;\n }\n self.draw();\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 self.selectArea({\n top: 0,\n left: -1,\n right: self.getSchema().length - 1,\n bottom: self.viewData.length - 1,\n });\n if (dontDraw) {\n return;\n }\n self.draw();\n };\n /**\n * Returns true if indices of columns next to the selected columnIndex is selected on every row.\n * @memberof canvasDatagrid\n * @name isMultiColumnsSelected\n * @method\n * @param {number} columnIndex The column index to check.\n */\n self.isMultiColumnsSelected = function (columnIndex) {\n var multiColIsSelected = true;\n self.viewData.forEach(function (row, rowIndex) {\n var columnIndices = self.selections[rowIndex];\n if (\n !columnIndices ||\n columnIndices.length <= 1 ||\n columnIndices.indexOf(columnIndex) === -1\n ) {\n multiColIsSelected = false;\n } else if (columnIndices.length > 1) {\n if (columnIndices[0] != columnIndex) multiColIsSelected = false;\n else {\n for (var i = 0; i < columnIndices.length - 1; i++) {\n if (columnIndices[i] + 1 != columnIndices[i + 1]) {\n multiColIsSelected = false;\n break;\n }\n }\n }\n }\n });\n return multiColIsSelected;\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 = function (columnIndex) {\n var colIsSelected = true;\n self.viewData.forEach(function (row, rowIndex) {\n if (\n !self.selections[rowIndex] ||\n self.selections[rowIndex].indexOf(columnIndex) === -1\n ) {\n colIsSelected = false;\n }\n });\n return colIsSelected;\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 var d = [],\n s = expandToRow ? self.getSchema() : self.getVisibleSchema(),\n l = self.viewData.length;\n self.selections.forEach(function (row, index) {\n if (index === l) {\n return;\n }\n if (row.length === 0) {\n d[index] = null;\n return;\n }\n d[index] = {};\n row.forEach(function (col) {\n if (col === -1 || !s[col]) {\n return;\n }\n fn(self.viewData, index, s[col].name);\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} supressSelectionchangedEvent When true, prevents the selectionchanged event from firing.\n */\n self.selectColumn = function (columnIndex, ctrl, shift, supressEvent) {\n var s, e, x;\n function addCol(i) {\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = self.selections[rowIndex] || [];\n if (self.selections[rowIndex].indexOf(i) === -1) {\n self.selections[rowIndex].push(i);\n }\n });\n }\n function removeCol(i) {\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = self.selections[rowIndex] || [];\n if (self.selections[rowIndex].indexOf(i) !== -1) {\n self.selections[rowIndex].splice(\n self.selections[rowIndex].indexOf(i),\n 1,\n );\n }\n });\n }\n if (shift) {\n if (!self.activeCell) {\n return;\n }\n s = Math.min(self.activeCell.columnIndex, columnIndex);\n e = Math.max(self.activeCell.columnIndex, columnIndex);\n for (x = s; e > x; x += 1) {\n addCol(x);\n }\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 (supressEvent) {\n return;\n }\n self.dispatchEvent('selectionchanged', {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\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 = function (rowIndex, ctrl, shift, supressEvent) {\n var x,\n st,\n en,\n s = self.getVisibleSchema();\n self.isMultiRowsSelected = false;\n function de() {\n if (supressEvent) {\n return;\n }\n self.dispatchEvent('selectionchanged', {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.selectionBounds,\n selectedCells: self.getSelectedCells(),\n });\n }\n function addRow(ri) {\n self.selections[ri] = [];\n self.selections[ri].push(-1);\n s.forEach(function (col, index) {\n self.selections[ri].push(self.orders.columns.indexOf(col.index));\n });\n }\n if (self.dragAddToSelection === false || self.dragObject === undefined) {\n if (\n self.selections[rowIndex] &&\n self.selections[rowIndex].length - 1 === s.length\n ) {\n if (ctrl) {\n self.selections[rowIndex] = [];\n de();\n return;\n }\n }\n }\n if (self.dragAddToSelection === true || self.dragObject === undefined) {\n if (shift && self.dragObject === undefined) {\n if (!self.activeCell) {\n return;\n }\n st = Math.min(self.activeCell.rowIndex, rowIndex);\n en = Math.max(self.activeCell.rowIndex, rowIndex);\n for (x = st; en >= x; x += 1) {\n addRow(x);\n }\n } else {\n addRow(rowIndex);\n }\n }\n de();\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 * 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 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 * @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 * @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 * 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 var sel = [];\n self.selections.forEach(function (row, rowIndex) {\n sel[rowIndex + offsetY] = [];\n row.forEach(function (colIndex) {\n sel[rowIndex + offsetY].push(colIndex + offsetX);\n });\n });\n self.selections = sel;\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 = function (dontDraw) {\n const affectedCells = self.clearSelectedCells();\n\n self.dispatchEvent('afterdelete', {\n cells: affectedCells,\n });\n\n if (dontDraw) {\n return;\n }\n\n requestAnimationFrame(() => self.draw());\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 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 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 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 cell.dragContext = cell.style;\n cell.context = 'row-resize';\n return cell;\n }\n if (/frozen-column-marker/.test(cell.style)) {\n cell.dragContext = cell.style;\n cell.context = 'col-resize';\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 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.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 * Gets the bounds of current selection.\n * @returns {rect} selection.\n * @memberof canvasDatagrid\n * @name getSelectionBounds\n * @method\n */\n self.getSelectionBounds = function () {\n var low = { x: Infinity, y: Infinity },\n high = { x: -Infinity, y: -Infinity };\n self.selections.forEach(function (row, rowIndex) {\n var maxCol, minCol;\n low.y = rowIndex < low.y ? rowIndex : low.y;\n high.y = rowIndex > high.y ? rowIndex : high.y;\n maxCol = Math.max.apply(null, row);\n minCol = Math.min.apply(null, row);\n low.x = minCol < low.x ? minCol : low.x;\n high.x = maxCol > high.x ? maxCol : high.x;\n });\n return {\n top: low.y,\n left: low.x,\n bottom: high.y,\n right: high.x,\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 * 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 */\n self.selectArea = function (bounds, ctrl) {\n self.selectionBounds = bounds || self.selectionBounds;\n var ev,\n x,\n y,\n s = self.getSchema();\n if (!ctrl) {\n self.selections = [];\n }\n if (\n self.selectionBounds.top < -1 ||\n self.selectionBounds.bottom > self.viewData.length ||\n self.selectionBounds.left < -1 ||\n self.selectionBounds.right > s.length\n ) {\n throw new Error('Impossible selection area');\n }\n for (\n x = self.selectionBounds.top;\n x <= self.selectionBounds.bottom;\n x += 1\n ) {\n self.selections[x] = [];\n for (\n y = self.selectionBounds.left;\n y <= self.selectionBounds.right;\n y += 1\n ) {\n if (self.selections[x].indexOf(y) === -1) {\n self.selections[x].push(y);\n }\n }\n }\n ev = {\n selections: self.selections,\n selectionBounds: self.selectionBounds,\n selectedCells: self.getSelectedCells(),\n };\n Object.defineProperty(ev, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n self.dispatchEvent('selectionchanged', ev);\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.headerCellPaddingRight +\n self.style.headerCellPaddingLeft;\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 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 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 '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","perfCounters","cachedImagesDrawn","drawCount","perfWindowSize","entityCount","scrollDebugCounters","touchPPSCounters","fillArray","low","high","step","x","undefined","drawHtml","cell","img","v","formattedValue","cacheKey","toString","rowIndex","columnIndex","Math","round","canvasOffsetLeft","y","canvasOffsetTop","htmlImageCache","height","width","complete","ctx","drawImage","Image","onload","loaded","Object","keys","html","draw","src","btoa","strokeLines","coords","beginPath","moveTo","lineTo","stroke","drawGroupHandle","collapsed","fillRect","strokeRect","cx","cy","drawCellTreeIcon","tree","rowTree","parentCount","iconSize","cellTreeIconWidth","scale","marginTop","cellTreeIconMarginTop","marginRight","cellTreeIconMarginRight","marginLeft","cellTreeIconMarginLeft","paddingLeft","icon","oldFillStyle","fillStyle","oldStrokeStyle","strokeStyle","hovered","hovers","onCellTreeIcon","cellTreeIconHoverFillColor","cellTreeIconFillColor","cellTreeIconBorderColor","rect","expand","lineWidth","cellTreeIconLineWidth","cellTreeIconLineColor","radiusRect","w","h","radius","r","b","quadraticCurveTo","fillText","text","clipFrozenArea","mode","lastFrozenColumnPixel","lastFrozenRowPixel","clip","fillHandle","selectionHandleType","arc","PI","fill","fillCircle","strokeHandle","strokeCircle","addBorderLine","c","pos","t","l","getFrozenColumnsWidth","s","getSchema","min","frozenColumn","collapsedGroups","getCollapsedColumnGroups","hidden","findIndex","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","performance","now","visibleRowHeights","orders","rows","createRowOrders","save","visibleRows","visibleCells","visibleGroups","offsetTop","offsetLeft","gridBackgroundColor","translate","ln","frozenRow","scrollBox","scrollLeft","scrollPixelLeft","cellBorderWidth","drawRow","allowFreezingRows","frozenMarkerBorderWidth","frozenMarkerWidth","drawFrozenRows","columnOrderIndex","rowOrderIndex","headerIndex","g","snapToRow","scrollTop","scrollPixelTop","scrollIndexTop","scrollIndexBottom","scrollPixelBottom","cellTree","hide","showNewRow","showRowHeaders","scrollIndexLeft","isColumnCollapsedByGroup","columns","drawCell","newRow","restore","drawRows","cl","activeCell","selectionMode","activeCellOverlayBorderWidth","activeCellOverlayBorderColor","getHeaderWidth","drawActiveCell","o","columnHeaderCell","header","nonFrozenHeaderWidth","drawHeaderColumnRange","start","end","title","cellWidth","index","order","rArgs","rhIndex","filteredRowNumber","getBoundRowIndexFromViewRowIndex","originalData","rowHeaderValue","hasActiveFilters","hasCollapsedRowGroup","rowHeaderCell","headerDescription","sizes","openChildren","drawRowHeader","showColumnHeaders","columnHeaderCellBorderWidth","scrollBarWidth","isColumnHeaderCell","isColumnHeaderCellCap","endCap","drawHeaders","dragStartObject","my","mx","xHover","yHover","allowFreezingColumns","frozenMarkerHoverColor","frozenMarkerColor","frozenMarkerHoverBorderColor","frozenMarkerBorderColor","unshift","freezeMarkerPosition","frozenMarkerActiveColor","frozenMarkerActiveBorderColor","dragMode","drawFrozenMarkers","mobile","allowMovingSelection","selectionHandleBorderWidth","selectionHandleBorderColor","selectionHandleColor","hw","selectionHandleSize","tr","br","tl","bl","addselectionHandle","az","touchSelectHandleZone","ax","ay","reorderObject","dragOffset","reorderMarkerBackgroundColor","reorderMarkerBorderWidth","reorderMarkerBorderColor","k","selections","getRowHeight","reorderMarkerIndexBorderWidth","reorderMarkerIndexBorderColor","reorderTarget","sortRowIndex","selectedColumns","sortColumnIndex","drawReorderMarkers","movingSelection","moveOverlayBorderWidth","moveOverlayBorderColor","setLineDash","moveOverlayBorderSegments","gridBorderWidth","gridBorderColor","dsb","selectionOverlayBorderWidth","selectionOverlayBorderColor","drawSelectionBorders","entities","scrollBarBoxMargin","scrollBarBorderColor","scrollBarBorderWidth","horizontalBox","scrollCache","horizontalBar","scrollBoxWidth","scrollWidth","verticalBox","verticalBar","scrollBoxHeight","scrollHeight","horizontalBarVisible","scrollBarBackgroundColor","scrollBarBoxColor","horizontalBoxVisible","context","scrollBarActiveColor","scrollBarBoxBorderRadius","verticalBarVisible","verticalBoxVisible","scrollBarCornerBorderColor","scrollBarCornerBackgroundColor","corner","frozenColumnsWidth","frozenRowsHeight","onTheLeft","columnGroupIndicatorPosition","onTheTop","rowGroupIndicatorPosition","groupingAreaBackgroundColor","groupedColumns","row","groups","j","assign","columnGroupRowHeight","toggleHandleSize","toggleHandlePadding","topY","centerY","bottomY","leftmostX","drawGroupHandleAtX","pushToVisibleGroups","leftX","rightX","x2","y2","crossTheFrozen","notInFrozen","colIndex","col","groupIndicatorColor","groupIndicatorBackgroundColor","ptr","left","right","containsBegining","containsEnd","rightCompare","compareX","minLeftX","lineCoords","groupedRows","colWidth","rowGroupColumnWidth","centerX","topmostY","drawGroupHandleAtY","top","bottom","bottomCompare","compareY","minTopY","drawGroupArea","showPerformance","debug","pop","font","debugFont","perf","reduce","a","toFixed","perfDelta","htmlImages","startScale","scaleDelta","zoomDeltaStart","touchLength","touches","touchPosition","touchPosition1","scrollIndex","scrollPixel","canvasOffset","touchDelta","touchAnimateTo","scrollAnimation","touchPPS","xPPS","yPPS","touchPPST","xPPST","yPPST","touchDuration","pointerLockPosition","size","mouse","touch","touchStart","hasFocus","dragContext","textAlign","debugBackgroundColor","key","debugColor","px","py","debugPerfChartBackground","debugScrollHeightColor","debugScrollWidthColor","debugPerformanceColor","debugEntitiesColor","debugTouchPPSXColor","debugTouchPPSYColor","dpl","apply","perfArr","arrIndex","max","color","useAbs","abs","drawPerfLine","debugPerfChartTextColor","drawPerfLines","createBorderOverlayArray","drawArray","propPrefix","offsetPoint","selectionBorder","isRowHeader","indexOf","isHeader","cellGridAttributes","cellStyle","isCorner","isColumnHeader","isFilterable","filterable","includes","wrap","cellWhiteSpace","selected","hoverMode","openedFilter","selectedFilterButton","active","rawValue","isGrid","activeHeader","f","formatters","orderByArrowSize","treeArrowSize","ev","value","nodeType","fontHeight","horizontalAlignment","verticalAlignment","paddingTop","paddingRight","paddingBottom","whiteSpace","lineHeight","cellLineHeight","lineSpacing","cellLineSpacing","offsetWidth","offsetHeight","offsetParent","viewRowIndex","viewColumnIndex","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","split","textHeight","autoResize","autoResizeRows","et","ellipsisText","line","cHeight","measureText","curSplitChar","measure","arr","map","splice","originText","stepLength","direction","substr","wrapText","treeCellPadding","isDrawText","vPos","hPos","stringify","pw","idx","idx_ord","drawText","selectionBorderTop","selectionBorderRight","selectionHandle","selectionBorderLeft","selectionBorderBottom","selectionHandleBehavior","createHandlesOverlayArray","moveOffset","posX","filterButtonWidth","posY","filterButtonHeight","filterButtonBorderColor","filterButtonBackgroundColor","filterButtonActiveBackgroundColor","onFilterButton","filterButtonHoverBackgroundColor","filterButtonBorderRadius","filterButtonArrowHeight","filterButtonArrowWidth","filterButtonArrowColor","filterButtonArrowBorderColor","drawFilterButtonArrow","drawFilterButton","isSorting","orderings","showRowNumberGaps","previousRowNumber","hasRowGap","find","barHeight","rowHeaderCellRowNumberGapHeight","barColor","rowHeaderCellRowNumberGapColor","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","drawAfterResize","dims","vb","nb","co","isScrollBoxCorner","sbw","ratio","bm","cellBorder","columnHeaderCellBorder","dataHeight","dataWidth","topGroupAreaHeight","leftGroupAreaWidth","ch","isColumnCollapsed","frozenWidth","accumulator","column","schemaIndex","columnWidth","setCanvasSize","args","setScrollBoxSize","checkScrollBoxVisibility","widthBoxRatio","heightBoxRatio","scrollBarBoxMinSize","scrollBarBoxWidth","bar","box","page","pageUpDownOverlap","resizeEditInput","scroll","overflowX","overflowY","dim","appliedInlineStyles","parentNodeStyle","dontDraw","floor","ellipsisCache","mousemove","overridePos","contextMenu","input","draggingItem","which","stopFreezeMove","mouseup","getLayerPos","dragBounds","sBounds","delta","ctrl","ctrlKey","metaKey","persistantSelectionMode","singleSelectionMode","getCellAt","NativeEvent","previousCell","clearTimeout","scrollTimer","isInGrid","rowBoundaryCrossed","columnBoundaryCrossed","cellBoundaryCrossed","prefix","dragItem","cursor","pc","rc","rx","ry","selecting","dragStart","shiftKey","getSelectionBounds","ignoreNextClick","contextmenuEvent","toggleCollapseTree","dragAddToSelection","event","getSelectedData","selectedCells","getSelectedCells","selectionBounds","selectRow","selectArea","isMultiRowsSelected","autoScrollOnMousemove","movedVertically","autoScrollMargin","movedHorizontally","autoScrollZone","getColumnGroupAt","getRowGroupAt","click","startingBounds","endEdit","toggleGroup","setStorageData","refresh","leftOffset","topOffset","xInGrid","yInGrid","setActiveCell","selectAll","checkSelectionChange","columnHeaderClickBehavior","treeArrowClickRadius","toggleTree","sb","dragResizeColumn","resizingStartingWidth","resizingStartingHeight","minColumnWidth","minRowHeight","resizeScrollZone","resizeChildGrids","globalRowResize","stopDragResize","hasMoved","dragItemIsSelected","isColumnSelected","fitSelectedColumns","body","scrollGrid","scrollPointerLock","scrollStartMode","movementX","movementY","scrollMode","scrollStart","scrollModes","setTimeout","scrollRepeatRate","selectionScrollIncrement","stopScrollGrid","exitPointerLock","dragReorder","columReorder","rowReorder","allowColumnReordering","allowRowReordering","isMultiColumnsSelected","selectColumn","source","reorderDeadZone","getVisibleCellByIndex","stopDragReorder","oIndex","tIndex","odata","cr","sortColumnIndices","seletedColumnIndices","deleteCount","selectedRows","dragMove","stopDragMove","moveSelection","freezeMove","startFreezeMove","mousedown","lastMouseDownTarget","button","move","freeze","requestPointerLock","dragging","controlInput","focus","getAdjacentCells","first","last","keydown","adjacentCells","cols","keepFocusOnMouseOut","isPrintableKeyEvent","beginEditAt","selectNone","deleteSelectedData","Number","isArrowKey","firstSelectedRowIndex","firstSelectedRow","firstSelectedColumnIndex","lastSelectedColumn","yAtTop","yAtBottom","xAtLeft","xAtRight","selection","shift","scrollIntoView","selectionFollowsActiveCell","keyup","keypress","dblclick","fitColumnToValues","autosize","cellTreeExpandCollapse","scrollWheel","deltaX","deltaY","deltaMode","touchHaltAnimation","scrollTo","pasteData","startRowIndex","startColIndex","cellData","forEachSelectedCell","colName","realRowIndex","cells","existingRowData","newRowData","columnName","boundRowIndexMap","affectedCells","getNextVisibleColumnIndex","visibleColumnIndex","getVisibleSchema","getVisibleColumnIndexOf","paste","editable","clipboardItems","Map","clipboardData","items","supportedMimeTypes","pasteableItems","itemToPaste","startCell","len","pasteType","getAsString","cut","copySelectedCellsToClipboard","clearSelectedCells","copy","touchMoving","touchScrollTimeout","animationFrames","getTouchPos","touchIndex","getBoundingClientRect","clientX","clientY","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","touchmove","passive","touchend","touchcancel","touchSelect","handleType","touchSelecting","bounds","rw","rScrollZone","lScrollZone","bScrollZone","tScrollZone","t1","t2","touchDeadZone","touchZoomSensitivity","touchZoomMin","touchZoomMax","selectionScrollZone","touchScroll","touchMove","dz","touchReleaseAcceleration","scrollAnimationPPSThreshold","ctor","treeGridAttributes","storageName","invalidSearchExpClass","localStyleLibraryStorageKey","add","sortFunction","sort","filters","tempSchema","columnTreeRowStartIndex","columnTreeRowEndIndex","origin","sorters","parsers","schemaHashes","changes","componentL1Events","eventNames","expandToRow","viewDataLength","orderedIndex","entries","firstRowAsString","rowAsString","rowDict","textString","copiedData","setData","has","allowGroupingColumns","allowGroupingRows","result","groupIndex","matchedGroup","allGroups","gi","nextCollapsed","isNewGroupRangeValid","groupsArray","gIndex","visibility","localStorage","setItem","createColumnOrders","selectedColumn","applyDefaultValue","defaultValue","createNewRowData","getSchemaNameHash","getFilteredAndSortedViewData","newViewData","originalRowIndex","headerName","filterText","getHeaderByName","currentFilterFunction","filterFrozenRows","newLen","from2","to2","slice","sortFn","rowA","rowB","rowIndexB","sortFrozenRows","getBestGuessDataType","drawChildGrids","gridKey","setTimer","validateColumn","setDefaults","obj1","obj2","setAttributes","setStyle","findColumnMaxTextLength","dispose","removeChild","eventParent","contextmenu","disconnect","tryLoadStoredSettings","reloadStoredValues","storedSettings","_typeof","tempData","collapsedCount","ctr","ri","lastchild","orTree","ctc","ci","_ri","child","_ci","si","otherData","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","cursorGrab","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","getClippingRect","setRowHeight","setColumnWidth","resetColumnWidths","resetRowHeights","assertPxColor","clearPxColorAssertions","integerToAlpha","addStyleKeyIfNoneExists","DOMStyles","set","valueObject","filterFor","blanksText","filterRegExp","pattern","exec","flags","substring","flagLength","invalidFilterRegEx","RegExp","toLocaleUpperCase","textContent","blur","TypeError","currentCursor","eventName","RangeError","isArray","getTypes","parseInnerHtml","callback","etl","autoGenerateSchema","autoResizeColumns","sHeight","sWidth","setScrollTop","preventScrollEvent","moveButtonPos","setScrollLeft","supressDrawEvent","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","x0","x1","y0","y1","node","newX1","newY1","contextPosition","isNormalCell","isBackground","isScrollBar","showFilter","showCopy","copyText","execCommand","showPaste","clipBoardData","pasteText","showColumnSelector","columnSelectorText","toggleColumnVisibility","columnSelectorHiddenText","columnSelectorVisibleText","hideColumnText","showClearSettingsOption","clearSettingsOptionText","allowSorting","showOrderByOption","showOrderByOptionTextAsc","showOrderByOptionTextDesc","groupAreaHeight","groupAreaWidth","setCollapseStateForAllGroups","showRemoveAllGroupColumns","showExpandAllGroupColumns","showCollapseAllGroupColumns","showRemoveAllGroupRows","showExpandAllGroupRows","showCollapseAllGroupRows","canGroupByColumns","canUngroupColumns","canGroupByRows","canUngroupRows","getColumnsMap","_col","groupIndexes","groupTitles","groupNames","showGroupColumns","cell0","cell1","formatArgs","showRemoveGroupColumns","range","prev","ok","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","Infinity","scrollingElement","editCell","borderWidth","mobileEditInputHeight","groupAreaOffsetY","groupAreaOffsetX","cellPaddingLeft","ignoreScrollOffset","calculatedTree","isTree","abort","newValue","oldValue","aborted","inEnterMode","enumItems","enu","option","valueInEnum","multiLine","editCellZIndex","fontSize","editCellFontSize","cellValueIsEmpty","shouldClearCellValue","nx","ny","altKey","nextRowIndex","className","css","padding","buttonPadding","borderStyle","borderColor","buttonBorderColor","buttonBackgroundColor","userSelect","buttonHoverBackgroundColor","buttonActiveBorderColor","buttonActiveBackgroundColor","verticalAlign","buttonArrowColor","fontWeight","fontFamily","contextMenuFontFamily","contextMenuFontSize","margin","contextMenuItemMargin","borderRadius","contextMenuItemBorderRadius","contextMenuHoverBackground","contextMenuHoverColor","contextMenuLabelMargin","contextMenuLabelDisplay","contextMenuLabelMinWidth","contextMenuLabelMaxWidth","contextMenuBackground","contextMenuColor","border","contextMenuBorder","contextMenuPadding","contextMenuBorderRadius","contextMenuOpacity","overflow","contextMenuCursor","contextFilterInputBorder","contextFilterInputBorderRadius","contextFilterInputFontFamily","contextFilterInputFontSize","contextFilterButtonBorder","contextFilterButtonBorderRadius","contextMenuFilterButtonFontFamily","contextMenuFilterButtonFontSize","cssFloat","childContextMenuArrowColor","contextMenuChildArrowFontSize","boxSizing","outline","mobileEditFontFamily","mobileEditFontSize","editCellBorder","editCellColor","editCellBackgroundColor","appearance","webkitAppearance","mozAppearance","editCellPaddingLeft","editCellFontFamily","boxShadow","editCellBoxShadow","contextMenuFilterInvalidExpresion","onblur","parentIsCanvas","getContext","textBaseline","addGroup","groupFor","removeGroup","ordA","charCodeAt","fromCharCode","showFilterInCell","offsetX","offsetY","targetX","targetY","sbh","offset","treeData","matched","multiColIsSelected","columnIndices","colIsSelected","supressEvent","addCol","st","de","dragObject","trArgs","treeGridHeight","newSize","dontSetStorageData","sorter","firstColumnName","lastColumnName","firstOne","lastOne","it","error","rowIndexFrom","rowIndexTo","isInteger","dataLength","sel","xi","visibleSchema","selectionLength","maxRowLength","minXi","yi","lastSourceIndex","cidx","useTouchScrollZones","getBorder","entitiy","borderResizeZone","moveBorder","tsz","touchScrollZone","moveMode","borderDragBehavior","xBorderBehavior","yBorderBehavior","isVerticalScrollBar","isHorizontalScrollBar","allowColumnResize","allowColumnResizeFromCell","allowRowHeaderResize","allowRowResize","allowRowResizeFromCell","columnGrabZoneSize","rowGrabZoneSize","maxCol","minCol","rowHeaderCellFont","autosizePadding","autosizeHeaderCellPadding","rowHeaderCellPaddingRight","rowHeaderCellPaddingLeft","formatter","columnHeaderCellFont","headerCellPaddingRight","headerCellPaddingLeft","cellFont","cellPaddingRight","cellAutoResizePadding","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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"}
|