canvas-datagrid 0.3.25 → 0.4.3

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.
@@ -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 ['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', '&nbsp;&nbsp;&nbsp;'],\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 ['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 ['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 ],\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', '&#x25BC;'],\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 ['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', '&#x25BA;'],\n ['childContextMenuMarginLeft', -11],\n ['childContextMenuMarginTop', -6],\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', '&#x25BC;'],\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', '&#x25BC;'],\n ['contextMenuArrowUpHTML', '&#x25B2;'],\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 ['gridBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['gridBorderCollapse', 'collapse'],\n ['gridBorderColor', 'rgba(202, 202, 202, 1)'],\n ['gridBorderWidth', 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 ['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 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 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) {\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 = cell.paddingLeft + cell.treeArrowWidth + cell.orderByArrowWidth;\n if (cell.horizontalAlignment === 'right') {\n hPos = cell.paddingLeft + cell.paddedWidth - line.width;\n } else if (cell.horizontalAlignment === 'center') {\n hPos =\n cell.paddingLeft +\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 column;\n hiddenFrozenColumnCount = 0;\n while (x < n) {\n column = s[x];\n if (column.hidden) {\n hiddenFrozenColumnCount += 1;\n } else {\n w += self.getColumnWidth(x);\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 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 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 };\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 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 drawText(cell);\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 const hasRowGap =\n previousRowNumber !== undefined &&\n cell.boundRowIndex > 0 &&\n cell.boundRowIndex - previousRowNumber > 1;\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 = self.hasActiveFilters()\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) {\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 headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(rowData, rowOrderIndex, rowIndex)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\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 headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(rowData, rowOrderIndex, rowIndex)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\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 };\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.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 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 (!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 headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(self.newRow, viewData.length, viewData.length)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\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 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 self.visibleCells.unshift({\n x: 0,\n y: my,\n height:\n self.style.frozenMarkerWidth + self.style.frozenMarkerBorderWidth,\n width: self.width,\n style: 'frozen-row-marker',\n });\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 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 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, '&lt;').replace(/>/g, '&gt;');\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>')\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 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 = self.width - rowHeaderCellWidth;\n self.scrollBox.height = self.height - columnHeaderCellHeight;\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: columnHeaderCellHeight + dataHeight + cellBorder + 1,\n width: dataWidth + rowHeaderCellWidth + cellBorder,\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 dataWidth =\n s.reduce(function reduceSchema(accumulator, column, columnIndex) {\n // intentional redefintion of column. This causes scrollCache to be in the correct order\n column = s[self.orders.columns[columnIndex]];\n if (column.hidden) {\n self.scrollCache.x[columnIndex] = accumulator;\n return accumulator;\n }\n var va =\n accumulator + self.getColumnWidth(self.orders.columns[columnIndex]);\n self.scrollCache.x[columnIndex] = va;\n return va;\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 = columnHeaderCellHeight + columnHeaderCellBorder;\n self.scrollBox.left = rowHeaderCellWidth;\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 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;\n n.width =\n self.width - self.style.scrollBarWidth - rowHeaderCellWidth - d - 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 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 - columnHeaderCellHeight - self.style.scrollBarWidth - d - 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 };\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 }\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 }\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 (self.attributes.selectionMode === 'row' ||\n self.dragStartObject.columnIndex === -1) &&\n self.rowBoundaryCrossed\n ) {\n self.selectRow(cell.rowIndex, ctrl, null, true);\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 {\n self.selectedFilterButton = {\n columnIndex: -1,\n rowIndex: -1,\n };\n if (self.hovers.onFilterButton) 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 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 if (!self.hasFocus) {\n return;\n }\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 pos.x > 0 &&\n pos.x - self.currentCell.x <\n self.style.treeArrowWidth +\n self.style.treeArrowMarginLeft +\n self.style.treeArrowMarginRight +\n self.style.treeArrowClickRadius &&\n pos.y - self.currentCell.y <\n self.style.treeArrowHeight +\n self.style.treeArrowMarginTop +\n self.style.treeArrowClickRadius &&\n pos.y > 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 self.scrollBox.scrollLeft += x;\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 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 (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 ) {\n self.beginEditAt(self.currentCell.columnIndex, self.currentCell.rowIndex);\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 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.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 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 '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 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.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 // 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.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.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.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 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.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 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()[e.cell.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 }\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 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 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 self.input.style.left =\n pos.left + cell.x + self.canvasOffsetLeft - s.left + 'px';\n self.input.style.top =\n pos.top +\n cell.y -\n self.style.cellBorderWidth +\n self.canvasOffsetTop -\n s.top +\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 }\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 * 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 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[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 * 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 * 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 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 cell.context = 'cell';\n cell.dragContext = 'column-reorder';\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","radiusRect","w","h","radius","r","b","beginPath","moveTo","lineTo","quadraticCurveTo","fillRect","strokeRect","fillText","text","clipFrozenArea","mode","lastFrozenColumnPixel","lastFrozenRowPixel","clip","fillHandle","selectionHandleType","arc","PI","fill","fillCircle","strokeHandle","stroke","strokeCircle","addBorderLine","c","pos","t","l","internal","isChildGrid","parentGrid","visible","checkScrollHeight","cx","cy","treeGrid","rowOpen","rowHeight","cornerCell","rowData","aCell","my","mx","xHover","yHover","drawCorner","en","m","d","viewData","bc","gridBorderCollapse","selectionBorders","moveBorders","selectionHandles","rowHeaders","u","currentCell","columnHeaderCellHeight","getColumnHeaderCellHeight","rowHeaderCellWidth","getRowHeaderCellWidth","cellHeight","performance","now","visibleRowHeights","orders","rows","createRowOrders","save","visibleRows","getSchema","visibleCells","offsetTop","offsetLeft","fillStyle","gridBackgroundColor","ln","min","frozenRow","scrollBox","scrollLeft","scrollPixelLeft","cellBorderWidth","drawRow","allowFreezingRows","frozenMarkerBorderWidth","frozenMarkerWidth","drawFrozenRows","columnOrderIndex","rowOrderIndex","headerIndex","g","snapToRow","scrollTop","scrollPixelTop","scrollIndexTop","scrollIndexBottom","scrollPixelBottom","showNewRow","showRowHeaders","scrollIndexLeft","columns","drawCell","newRow","restore","drawRows","cl","activeCell","frozenColumn","selectionMode","lineWidth","activeCellOverlayBorderWidth","strokeStyle","activeCellOverlayBorderColor","getHeaderWidth","drawActiveCell","o","columnHeaderCell","header","nonFrozenHeaderWidth","drawHeaderColumnRange","start","end","hidden","title","cellWidth","index","order","rArgs","rhIndex","filteredRowNumber","getBoundRowIndexFromViewRowIndex","originalData","rowHeaderValue","hasActiveFilters","rowHeaderCell","headerDescription","sizes","openChildren","drawRowHeader","showColumnHeaders","columnHeaderCellBorderWidth","scrollBarWidth","isColumnHeaderCell","isColumnHeaderCellCap","endCap","drawHeaders","allowFreezingColumns","frozenMarkerHoverColor","frozenMarkerColor","frozenMarkerHoverBorderColor","frozenMarkerBorderColor","unshift","freezeMarkerPosition","frozenMarkerActiveColor","frozenMarkerActiveBorderColor","dragMode","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","getColumnWidth","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","showPerformance","debug","pop","font","debugFont","perf","reduce","a","toFixed","perfDelta","frozenColumnsWidth","s","getFrozenColumnsWidth","htmlImages","scale","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","hovered","hovers","hoverMode","openedFilter","selectedFilterButton","active","rawValue","isGrid","activeHeader","f","formatters","orderByArrowSize","treeArrowSize","ev","value","row","nodeType","fontHeight","horizontalAlignment","verticalAlignment","paddingLeft","paddingTop","paddingRight","paddingBottom","whiteSpace","lineHeight","cellLineHeight","lineSpacing","cellLineSpacing","offsetWidth","offsetHeight","offsetParent","viewRowIndex","viewColumnIndex","boundRowIndex","boundColumnIndex","getBoundColumnIndexFromViewColumnIndex","isNormal","gridId","calculatedLineHeight","paddedWidth","paddedHeight","userHeight","userWidth","cellHeightWithChildGrid","cellWidthWithChildGrid","tree","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","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","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","col","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","ch","accumulator","column","va","setCanvasSize","args","top","left","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","selecting","dragStart","dragStartObject","shiftKey","bottom","right","getSelectionBounds","ignoreNextClick","contextmenuEvent","rect","dragAddToSelection","event","getSelectedData","selectedCells","getSelectedCells","selectionBounds","selectRow","selectArea","isMultiRowsSelected","autoScrollOnMousemove","movedVertically","autoScrollMargin","movedHorizontally","autoScrollZone","click","startingBounds","endEdit","setActiveCell","selectAll","checkSelectionChange","columnHeaderClickBehavior","treeArrowClickRadius","toggleTree","sb","dragResizeColumn","resizingStartingWidth","resizingStartingHeight","minColumnWidth","minRowHeight","resizeScrollZone","resizeChildGrids","globalRowResize","stopDragResize","hasMoved","dragItemIsSelected","isColumnSelected","fitSelectedColumns","body","setStorageData","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","findIndex","firstSelectedRow","firstSelectedColumnIndex","lastSelectedColumn","yAtTop","yAtBottom","xAtLeft","xAtRight","selection","shift","scrollIntoView","selectionFollowsActiveCell","keyup","keypress","dblclick","fitColumnToValues","autosize","scrollWheel","deltaX","deltaY","deltaMode","touchHaltAnimation","scrollTo","pasteData","startRowIndex","startColIndex","cellData","forEachSelectedCell","colName","realRowIndex","cells","existingRowData","newRowData","assign","colIndex","columnName","boundRowIndexMap","affectedCells","getNextVisibleColumnIndex","visibleColumnIndex","getVisibleSchema","getVisibleColumnIndexOf","paste","editable","clipboardItems","Map","from","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","sorters","parsers","schemaHashes","changes","componentL1Events","eventNames","expandToRow","viewDataLength","orderedIndex","entries","firstRowAsString","rowAsString","rowDict","textString","copiedData","setData","has","visibility","localStorage","setItem","tempSchema","createColumnOrders","selectedColumn","applyDefaultValue","defaultValue","createNewRowData","getSchemaNameHash","getFilteredAndSortedViewData","newViewData","originalRowIndex","headerName","filterText","getHeaderByName","currentFilterFunction","filterFrozenRows","sortFn","rowA","rowB","rowIndexB","sortFrozenRows","refresh","getBestGuessDataType","drawChildGrids","gridKey","setTimer","validateColumn","setDefaults","obj1","obj2","setAttributes","setStyle","findColumnMaxTextLength","dispose","removeChild","eventParent","contextmenu","disconnect","tryLoadStoredSettings","reloadStoredValues","storedSettings","_typeof","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","findColumnScrollLeft","findRowScrollTop","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","find","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","contextPosition","isNormalCell","isBackground","isScrollBar","showFilter","showCopy","copyText","execCommand","showPaste","clipBoardData","pasteText","showColumnSelector","columnSelectorText","toggleColumnVisibility","columnSelectorHiddenText","columnSelectorVisibleText","hideColumnText","showClearSettingsOption","clearSettingsOptionText","columnWidth","allowSorting","showOrderByOption","showOrderByOptionTextAsc","showOrderByOptionTextDesc","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","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","marginLeft","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","ordA","charCodeAt","fromCharCode","showFilterInCell","offsetX","offsetY","targetX","targetY","sbh","offset","matched","multiColIsSelected","columnIndices","colIsSelected","supressEvent","addCol","st","de","ri","dragObject","childGrid","trArgs","treeGridHeight","newSize","dontSetStorageData","sorter","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","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/groups/util.js","../lib/publicMethods.js","../lib/main.js"],"sourcesContent":["/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n\n'use strict';\nexport default function (self) {\n self.defaults = {\n attributes: [\n ['allowColumnReordering', true],\n ['allowColumnResize', true],\n ['allowColumnResizeFromCell', false],\n ['allowFreezingRows', false],\n ['allowFreezingColumns', false],\n ['allowMovingSelection', true],\n ['allowRowHeaderResize', true],\n ['allowRowReordering', false],\n ['allowRowResize', true],\n ['allowRowResizeFromCell', false],\n ['allowSorting', true],\n ['allowGroupingRows', true],\n ['allowGroupingColumns', true],\n ['animationDurationShowContextMenu', 50],\n ['animationDurationHideContextMenu', 50],\n ['autoGenerateSchema', false],\n ['autoResizeColumns', false],\n ['autoResizeRows', false],\n ['autoScrollOnMousemove', false],\n ['autoScrollMargin', 5],\n ['blanksText', '(Blanks)'],\n ['borderDragBehavior', 'none'],\n ['borderResizeZone', 10],\n ['clearSettingsOptionText', 'Clear saved settings'],\n ['columnHeaderClickBehavior', 'sort'],\n ['columnSelectorHiddenText', '&nbsp;&nbsp;&nbsp;'],\n ['columnSelectorText', 'Add/Remove columns'],\n ['columnSelectorVisibleText', '\\u2713'],\n ['contextHoverScrollAmount', 2],\n ['contextHoverScrollRateMs', 5],\n ['copyHeadersOnSelectAll', true],\n ['copyText', 'Copy'],\n ['debug', false],\n ['editable', true],\n ['ellipsisText', '...'],\n ['filterOptionText', 'Filter %s'],\n ['filterTextPrefix', '(filtered) '],\n ['filterFrozenRows', true],\n ['globalRowResize', false],\n ['hideColumnText', 'Hide %s'],\n ['showUnhideColumnsIndicator', false],\n ['showUnhideRowsIndicator', false],\n ['showHideRow', 'Hide row %s'],\n ['showHideRows', 'Hide rows %s'],\n ['hoverMode', 'cell'],\n ['keepFocusOnMouseOut', false],\n ['maxAutoCompleteItems', 200],\n ['multiLine', false],\n ['name', ''],\n ['pageUpDownOverlap', 1],\n ['pasteText', 'Paste'],\n ['persistantSelectionMode', false],\n ['removeFilterOptionText', 'Remove filter on %s'],\n ['reorderDeadZone', 3],\n ['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', '&#x25BC;'],\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', '&#x25BA;'],\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', '&#x25BC;'],\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', '&#x25BC;'],\n ['contextMenuArrowUpHTML', '&#x25B2;'],\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 ['unhideIndicatorColor', 'rgba(0, 0, 0, 1)'],\n ['unhideIndicatorBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['unhideIndicatorBorderColor', 'rgba(174, 193, 232, 1)'],\n ['unhideIndicatorSize', 16],\n ['width', 'auto'],\n ],\n };\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport defaults from './defaults';\n\nexport default function () {\n var typeMap,\n component = {};\n component.dehyphenateProperty = function hyphenateProperty(prop) {\n prop = prop.replace('--cdg-', '');\n var p = '',\n nextLetterCap;\n Array.prototype.forEach.call(prop, function (char) {\n if (nextLetterCap) {\n nextLetterCap = false;\n p += char.toUpperCase();\n return;\n }\n if (char === '-') {\n nextLetterCap = true;\n return;\n }\n p += char;\n });\n return p;\n };\n component.hyphenateProperty = function hyphenateProperty(prop, cust) {\n var p = '';\n Array.prototype.forEach.call(prop, function (char) {\n if (char === char.toUpperCase()) {\n p += '-' + char.toLowerCase();\n return;\n }\n p += char;\n });\n return (cust ? '--cdg-' : '') + p;\n };\n function getDefaultItem(base, item) {\n var i = {},\n r;\n defaults(i);\n r = i.defaults[base].filter(function (i) {\n return (\n i[0].toLowerCase() === item.toLowerCase() ||\n component.hyphenateProperty(i[0]) === item.toLowerCase() ||\n component.hyphenateProperty(i[0], true) === item.toLowerCase()\n );\n })[0];\n return r;\n }\n component.applyComponentStyle = function (supressChangeAndDrawEvents, intf) {\n if (!intf.isComponent) {\n return;\n }\n var cStyle = window.getComputedStyle(\n intf.tagName === 'CANVAS-DATAGRID' ? intf : intf.canvas,\n null,\n ),\n defs = {};\n intf.computedStyle = cStyle;\n defaults(defs);\n defs = 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 * @param {boolean} [fill] fill the area that construct by these lines but not stroke\n */\n function drawLines(coords, fill) {\n if (coords.length < 4) return;\n self.ctx.beginPath();\n self.ctx.moveTo(\n coords[0] + self.canvasOffsetLeft,\n coords[1] + self.canvasOffsetTop,\n );\n for (let i = 2; i < coords.length; i += 2) {\n const x = coords[i] + self.canvasOffsetLeft;\n const y = coords[i + 1] + self.canvasOffsetTop;\n self.ctx.lineTo(x, y);\n }\n if (fill) self.ctx.fill();\n else self.ctx.stroke();\n }\n /**\n * @param {number} x based-X (left-top)\n * @param {number} y based-Y (left-top)\n * @param {number} width\n * @param {boolean} collapsed true: '+'; false: '-'\n */\n function drawGroupHandle(x, y, width, collapsed) {\n fillRect(x, y, width, width);\n strokeRect(x, y, width, width);\n const cx = x + width * 0.5;\n const cy = y + width * 0.5;\n drawLines([x + width * 0.2, cy, x + width * 0.78, cy]);\n if (collapsed) drawLines([cx, y + width * 0.22, cx, y + width * 0.8]);\n }\n /**\n * @param {number} x\n * @param {number} y\n * @param {number} size\n * @param {string} dir Direction of the triangle, one of the 't','b','l' and 'r'\n * @param {boolean} [active]\n */\n function drawUnhideIndicator(x, y, size, dir, active) {\n const minPadding = size * 0.2;\n const maxPadding = size * 0.3;\n /** The long edge width of the triangle */\n const longEdge = size - 2 * minPadding;\n /** The median width of the triangle */\n const median = size - 2 * maxPadding;\n const halfLongEdge = longEdge * 0.5;\n let x0, y0;\n let coords, borderCoords;\n switch (dir) {\n case 'r':\n x0 = x + maxPadding;\n y0 = y + minPadding;\n borderCoords = [x, y, x + size, y, x + size, y + size, x, y + size];\n coords = [x0, y0, x0, y0 + longEdge, x0 + median, y0 + halfLongEdge];\n break;\n case 'l':\n x0 = x + size - maxPadding;\n y0 = y + minPadding;\n borderCoords = [x + size, y, x, y, x, y + size, x + size, y + size];\n coords = [x0, y0, x0, y0 + longEdge, x0 - median, y0 + halfLongEdge];\n break;\n case 't':\n x0 = x + minPadding;\n y0 = y + size - maxPadding;\n borderCoords = [x, y + size, x, y, x + size, y, x + size, y + size];\n coords = [x0, y0, x0 + longEdge, y0, x0 + halfLongEdge, y0 - median];\n break;\n case 'b':\n x0 = x + minPadding;\n y0 = y + maxPadding;\n borderCoords = [x, y, x, y + size, x + size, y + size, x + size, y];\n coords = [x0, y0, x0 + longEdge, y0, x0 + halfLongEdge, y0 + median];\n break;\n }\n\n if (active) {\n self.ctx.strokeStyle = self.style.unhideIndicatorBorderColor;\n self.ctx.lineWidth = 2;\n drawLines(borderCoords);\n\n self.ctx.fillStyle = self.style.unhideIndicatorBackgroundColor;\n let offset = dir === 'r' || dir === 'b' ? 1 : 0;\n if (dir === 'l' || dir === 'r')\n fillRect(x - offset, y, size + offset, size);\n else fillRect(x, y - offset, size, size + offset);\n }\n\n self.ctx.fillStyle = self.style.unhideIndicatorColor;\n drawLines(coords, true);\n }\n function drawOrderByArrow(x, y) {\n var mt = self.style.columnHeaderOrderByArrowMarginTop * self.scale,\n ml = self.style.columnHeaderOrderByArrowMarginLeft * self.scale,\n mr = self.style.columnHeaderOrderByArrowMarginRight * self.scale,\n aw = self.style.columnHeaderOrderByArrowWidth * self.scale,\n ah = self.style.columnHeaderOrderByArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.columnHeaderOrderByArrowColor;\n self.ctx.strokeStyle = self.style.columnHeaderOrderByArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n if (self.orderDirection === 'asc') {\n self.ctx.lineTo(x, y + ah);\n self.ctx.lineTo(x + aw, y + ah);\n self.ctx.lineTo(x + aw * 0.5, y);\n self.ctx.lineTo(x, y + ah);\n } else {\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n }\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw + mr;\n }\n function drawTreeArrow(cell, x, y) {\n var mt = self.style.treeArrowMarginTop * self.scale,\n mr = self.style.treeArrowMarginRight * self.scale,\n ml = self.style.treeArrowMarginLeft * self.scale,\n aw = self.style.treeArrowWidth * self.scale,\n ah = self.style.treeArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.treeArrowColor;\n self.ctx.strokeStyle = self.style.treeArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n if (self.openChildren[cell.rowIndex]) {\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n } else {\n self.ctx.lineTo(x, y);\n self.ctx.lineTo(x + ah, y + aw * 0.5);\n self.ctx.lineTo(x, y + aw);\n self.ctx.lineTo(x, y);\n }\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw + mr;\n }\n function drawCellTreeIcon(cell, tree, rowTree) {\n const parentCount = rowTree ? tree.parentCount : 0;\n const iconSize = self.style.cellTreeIconWidth * self.scale,\n marginTop = self.style.cellTreeIconMarginTop * self.scale,\n marginRight = self.style.cellTreeIconMarginRight * self.scale,\n marginLeft =\n self.style.cellTreeIconMarginLeft * self.scale +\n parentCount * (iconSize + cell.paddingLeft);\n\n let x = cell.x + cell.paddingLeft + self.canvasOffsetLeft + marginLeft,\n y = cell.y + self.canvasOffsetTop + marginTop;\n\n if (tree.icon) {\n self.ctx.beginPath();\n const oldFillStyle = self.ctx.fillStyle;\n const oldStrokeStyle = self.ctx.strokeStyle;\n\n if (cell.hovered && self.hovers.onCellTreeIcon) {\n self.ctx.fillStyle = self.style.cellTreeIconHoverFillColor;\n } else {\n self.ctx.fillStyle = self.style.cellTreeIconFillColor;\n }\n\n self.ctx.fillRect(x, y, iconSize, iconSize);\n self.ctx.strokeStyle = self.style.cellTreeIconBorderColor;\n self.ctx.rect(x, y, iconSize, iconSize);\n self.ctx.stroke();\n\n self.ctx.beginPath();\n if (tree.expand) {\n self.ctx.moveTo(x + 3, y + iconSize * 0.5);\n self.ctx.lineTo(x + iconSize - 3, y + iconSize * 0.5);\n } else {\n self.ctx.moveTo(x + 2, y + iconSize * 0.5);\n self.ctx.lineTo(x + iconSize - 2, y + iconSize * 0.5);\n self.ctx.moveTo(x + iconSize * 0.5, y + 2);\n self.ctx.lineTo(x + iconSize * 0.5, y + iconSize - 2);\n }\n self.ctx.lineWidth = self.style.cellTreeIconLineWidth;\n self.ctx.strokeStyle = self.style.cellTreeIconLineColor;\n self.ctx.stroke();\n\n self.ctx.strokeStyle = oldStrokeStyle;\n self.ctx.fillStyle = oldFillStyle;\n }\n\n return marginLeft + iconSize + marginRight;\n }\n function drawFilterButtonArrow(x, y) {\n var mt =\n ((self.style.filterButtonHeight - self.style.filterButtonArrowHeight) /\n 2) *\n self.scale,\n ml =\n ((self.style.filterButtonWidth - self.style.filterButtonArrowWidth) /\n 2) *\n self.scale,\n aw = self.style.filterButtonArrowWidth * self.scale,\n ah = self.style.filterButtonArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.filterButtonArrowColor;\n self.ctx.strokeStyle = self.style.filterButtonArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw;\n }\n function radiusRect(x, y, w, h, radius) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n var r = x + w,\n b = y + h;\n self.ctx.beginPath();\n self.ctx.moveTo(x + radius, y);\n self.ctx.lineTo(r - radius, y);\n self.ctx.quadraticCurveTo(r, y, r, y + radius);\n self.ctx.lineTo(r, y + h - radius);\n self.ctx.quadraticCurveTo(r, b, r - radius, b);\n self.ctx.lineTo(x + radius, b);\n self.ctx.quadraticCurveTo(x, b, x, b - radius);\n self.ctx.lineTo(x, y + radius);\n self.ctx.quadraticCurveTo(x, y, x + radius, y);\n }\n function fillRect(x, y, w, h) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillRect(x, y, w, h);\n }\n function strokeRect(x, y, w, h) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.strokeRect(x, y, w, h);\n }\n function fillText(text, x, y) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillText(text, x, y);\n }\n function fillCircle(x, y, r) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.arc(x, y, r, 0, 2 * Math.PI);\n self.ctx.fill();\n }\n function strokeCircle(x, y, r) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.arc(x, y, r, 0, 2 * Math.PI);\n self.ctx.stroke();\n }\n function clipFrozenArea(mode) {\n // 0 both, 1 rows, 2 cols\n // self.lastFrozenColumnPixel;\n // self.lastFrozenRowPixel;\n self.ctx.beginPath();\n if (mode === 0) {\n self.ctx.moveTo(self.lastFrozenColumnPixel, self.lastFrozenRowPixel);\n self.ctx.lineTo(self.lastFrozenColumnPixel, self.height);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.width, self.lastFrozenRowPixel);\n }\n if (mode === 1) {\n self.ctx.moveTo(0, self.lastFrozenRowPixel);\n self.ctx.lineTo(0, self.height);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.width, self.lastFrozenRowPixel);\n }\n if (mode === 2) {\n self.ctx.moveTo(self.lastFrozenColumnPixel, 0);\n self.ctx.lineTo(self.width, 0);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.lastFrozenColumnPixel, self.height);\n }\n self.ctx.clip();\n }\n function fillHandle(x, y, r) {\n if (self.style.selectionHandleType === 'circle') {\n return fillCircle(x, y, r * 0.5);\n }\n fillRect(x - r * 0.5, y - r * 0.5, r, r);\n }\n function strokeHandle(x, y, r) {\n if (self.style.selectionHandleType === 'circle') {\n return strokeCircle(x, y, r * 0.5);\n }\n strokeRect(x - r * 0.5, y - r * 0.5, r, r);\n }\n function addselectionHandle(c, pos) {\n var hw = self.style.selectionHandleSize,\n p = {\n tr: function () {\n fillHandle(c.x + c.width, c.y, hw);\n strokeHandle(c.x + c.width, c.y, hw);\n },\n br: function () {\n fillHandle(c.x + c.width, c.y + c.height, hw);\n strokeHandle(c.x + c.width, c.y + c.height, hw);\n },\n tl: function () {\n fillHandle(c.x, c.y, hw);\n strokeHandle(c.x, c.y, hw);\n },\n bl: function () {\n fillHandle(c.x, c.y + c.height, hw);\n strokeHandle(c.x, c.y + c.height, hw);\n },\n };\n p[pos]();\n }\n function addBorderLine(c, pos) {\n self.ctx.beginPath();\n var p = {\n t: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop,\n );\n },\n r: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n b: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop + c.height,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n l: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n };\n p[pos]();\n self.ctx.stroke();\n }\n function addEllipsis(text, width) {\n var c,\n w = 0;\n if (self.ellipsisCache[text] && self.ellipsisCache[text][width]) {\n return self.ellipsisCache[text][width];\n }\n //TODO Add ellipsis back when there is a fast way to do it\n w = self.ctx.measureText(text).width;\n self.ellipsisCache[text] = self.ellipsisCache[text] || {};\n c = { value: text, width: w };\n self.ellipsisCache[text][width] = c;\n return c;\n }\n function wrapText(cell, splitChar) {\n if (!cell.formattedValue) {\n return {\n lines: [{ width: 0, value: '' }],\n width: 0,\n height: cell.calculatedLineHeight,\n };\n }\n var max = 0,\n n = '\\n',\n x,\n word,\n words = cell.formattedValue.split(splitChar),\n textHeight = cell.calculatedLineHeight,\n lines = [],\n out = [],\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n autoResize = self.attributes.autoResizeRows && wrap,\n elWidth,\n et = self.attributes.ellipsisText,\n elClipLength,\n plWidth,\n clippedVal,\n ogWordWidth,\n previousLine,\n line = {\n width: 0,\n value: '',\n },\n cHeight = wrap ? cell.paddedHeight : cell.calculatedLineHeight;\n lines.push(line);\n elWidth = self.ctx.measureText(' ' + et).width;\n for (x = 0; x < words.length; x += 1) {\n word = words[x];\n var curSplitChar = word[word.length - 1] === '-' ? '' : splitChar;\n var measure = self.ctx.measureText(word + curSplitChar);\n if (line.width + measure.width + elWidth < cell.paddedWidth) {\n line.value += word + curSplitChar;\n line.width += measure.width;\n continue;\n }\n // if there is a hyphenated word that is too long\n // split it and add the split set to the array\n // then back up and re-read new split set\n // this behavior seems right, it might not be\n if (/\\w-\\w/.test(word) && cell.paddedWidth < measure.width) {\n var arr = word.split('-');\n arr = arr.map((item, index) => {\n return index === arr.length - 1 ? item : item + '-';\n });\n words.splice(x, 1, ...arr);\n x -= 1;\n continue;\n }\n line = {\n width: measure.width,\n value: word + curSplitChar,\n };\n if (x === 0) {\n lines = [];\n lines.push(line);\n }\n textHeight += cell.calculatedLineHeight;\n if (textHeight > cHeight && !autoResize) {\n if (lines.length === 0) {\n break;\n }\n elClipLength = 1;\n previousLine = lines[lines.length - 1];\n if (previousLine.width < cell.paddedWidth && words.length === 1) {\n break;\n }\n clippedVal = previousLine.value + word;\n plWidth = self.ctx.measureText(clippedVal + et).width;\n var originText = clippedVal;\n if (plWidth > cell.paddedWidth) {\n var stepLength = parseInt(clippedVal.length / 2);\n var direction = -1;\n while (stepLength > 0) {\n clippedVal = originText.substr(\n 0,\n stepLength * direction + clippedVal.length,\n );\n plWidth = self.ctx.measureText(clippedVal + et).width;\n direction = plWidth > cell.paddedWidth ? -1 : 1;\n stepLength = parseInt(stepLength / 2);\n }\n }\n clippedVal =\n clippedVal + (originText.length != clippedVal.length ? et : '');\n previousLine.value = clippedVal;\n previousLine.width = plWidth;\n break;\n }\n if (x > 0) {\n lines.push(line);\n }\n }\n return {\n lines: lines,\n width: max,\n height: cell.calculatedLineHeight * lines.length,\n };\n }\n function drawText(cell, treeCellPadding = 0) {\n var ll = cell.text.lines.length,\n h = cell.fontHeight * cell.lineHeight,\n x,\n line,\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n textHeight = 0;\n for (x = 0; x < cell.text.lines.length; x += 1) {\n line = cell.text.lines[x];\n var vPos =\n Math.max(\n (cell.height -\n (wrap ? cell.text.height : cell.calculatedLineHeight)) *\n 0.5,\n 0,\n ) + h,\n hPos =\n cell.paddingLeft +\n treeCellPadding +\n cell.treeArrowWidth +\n cell.orderByArrowWidth;\n if (cell.horizontalAlignment === 'right') {\n hPos =\n cell.paddingLeft + treeCellPadding + cell.paddedWidth - line.width;\n } else if (cell.horizontalAlignment === 'center') {\n hPos =\n cell.paddingLeft +\n treeCellPadding +\n (cell.paddedWidth + cell.paddingRight) / 2 -\n line.width / 2;\n }\n if (cell.verticalAlignment === 'top') {\n vPos = cell.calculatedLineHeight;\n } else if (cell.verticalAlignment === 'bottom') {\n vPos = cell.height - cell.paddingBottom - cell.text.height;\n }\n line.height = h + cell.lineSpacing;\n line.offsetLeft = hPos;\n line.offsetTop = vPos;\n line.x = cell.x + hPos;\n line.y = cell.y + textHeight + vPos;\n textHeight += line.height;\n fillText(line.value, line.x, line.y);\n }\n if (self.attributes.debug && cell.active) {\n requestAnimationFrame(function () {\n self.ctx.font = self.style.debugFont;\n self.ctx.fillStyle = self.style.debugColor;\n fillText(\n JSON.stringify(\n {\n x: cell.x,\n y: cell.y,\n h: cell.height,\n w: cell.width,\n pw: cell.paddedWidth,\n idx: cell.columnIndex,\n idx_ord: cell.sortColumnIndex,\n },\n null,\n '\\t',\n ),\n cell.x + 14,\n cell.y + 14,\n );\n fillText(\n JSON.stringify(\n cell.text.lines.map(function (l) {\n return { w: l.width, v: l.value.length };\n }),\n null,\n '\\t',\n ),\n cell.x + 14,\n cell.y + 30,\n );\n });\n }\n }\n function getFrozenColumnsWidth() {\n var w = 0,\n s = self.getSchema(),\n x = 0,\n n = Math.min(self.frozenColumn, s.length),\n collapsedGroups = self.getCollapsedColumnGroups(),\n column;\n hiddenFrozenColumnCount = 0;\n while (x < n) {\n column = s[x];\n if (column.hidden) {\n hiddenFrozenColumnCount += 1;\n } else {\n const isCollapsed =\n collapsedGroups.findIndex(\n (group) => x >= group.from && x <= group.to,\n ) >= 0;\n if (isCollapsed) {\n hiddenFrozenColumnCount += 1;\n } else {\n w += self.getColumnWidth(x);\n }\n }\n x += 1;\n }\n return w;\n }\n /**\n * Redraws the grid. No matter what the change, this is the only method required to refresh everything.\n * @memberof canvasDatagrid\n * @name draw\n * @method\n */\n // r = literal row index\n // rd = row data array\n // i = user order index\n // o = literal data index\n // y = y drawing cursor\n // x = x drawing cursor\n // s = visible schema array\n // cx = current x drawing cursor sub calculation var\n // cy = current y drawing cursor sub calculation var\n // a = static cell (like corner cell)\n // p = perf counter\n // l = data length\n // u = current cell\n // h = current height\n // w = current width\n self.draw = function (internal) {\n if (self.dispatchEvent('beforedraw', {})) {\n return;\n }\n if (!self.isChildGrid && (!self.height || !self.width)) {\n return;\n }\n if (self.isChildGrid && internal) {\n requestAnimationFrame(self.parentGrid.draw);\n return;\n }\n if (self.intf.visible === false) {\n return;\n }\n // initial values\n var checkScrollHeight,\n rowHeaderCell,\n p,\n cx,\n cy,\n treeGrid,\n rowOpen,\n rowHeight,\n cornerCell,\n y,\n x,\n c,\n h,\n w,\n schema,\n rowIndex,\n rowData,\n aCell,\n viewData = self.viewData || [],\n bc = self.style.gridBorderCollapse === 'collapse',\n selectionBorders = [],\n moveBorders = [],\n selectionHandles = [],\n rowHeaders = [],\n l = viewData.length,\n u = self.currentCell || {},\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n rowGroupsAreaWidth = self.getRowGroupAreaWidth(),\n columnGroupsAreaHeight = self.getColumnGroupAreaHeight(),\n /** key: boundRowIndex, value: `{y,h}` */\n rowGroupsRectInfo = {},\n /** value: `{y,h}` */\n rowGroupsFrozenInfo = {},\n /** key: columnIndex, value: `{x,w}` */\n columnGroupsRectInfo = {},\n collapsedColumnGroups = self.getCollapsedColumnGroups(),\n collapsedRowGroups = self.getCollapsedRowGroups(),\n cellHeight = self.style.cellHeight,\n currentRowIndexOffset = 0,\n /** @type {Array<{from:number,plus:number}>} */\n rowIndexOffsetByHiddenRows = self.hiddenRowRanges\n .map((range) => ({\n from: range[0],\n plus: range[1] - range[0] + 1,\n }))\n .sort((a, b) => a.from - b.from);\n drawCount += 1;\n p = performance.now();\n self.visibleRowHeights = [];\n // if data length has changed, there is no way to know\n if (viewData.length > self.orders.rows.length) {\n self.createRowOrders();\n }\n function saveRowGroupsRectInfo(cell) {\n let index = cell.boundRowIndex;\n if (index >= -1 === false)\n if (cell.rowIndex === -1) index = -1;\n else return;\n if (rowGroupsRectInfo[index]) return;\n rowGroupsRectInfo[index] = { y: cell.y, h: cell.height };\n }\n function saveColumnGroupsRectInfo(cell) {\n const index = cell.columnIndex;\n if (columnGroupsRectInfo[index]) return;\n columnGroupsRectInfo[index] = { x: cell.x, w: cell.width };\n }\n /**\n * @param {number} columnIndex\n * @returns {boolean}\n */\n function isColumnCollapsedByGroup(columnIndex) {\n return (\n collapsedColumnGroups.findIndex(\n (group) => columnIndex >= group.from && columnIndex <= group.to,\n ) >= 0\n );\n }\n\n function drawScrollBars() {\n var drawCorner,\n en = self.scrollBox.entities,\n m = self.style.scrollBarBoxMargin * 2;\n self.ctx.strokeStyle = self.style.scrollBarBorderColor;\n self.ctx.lineWidth = self.style.scrollBarBorderWidth;\n if (self.frozenColumn > 0) {\n en.horizontalBox.x =\n rowHeaderCellWidth +\n self.style.scrollBarBoxMargin +\n self.scrollCache.x[self.frozenColumn - 1] +\n (en.horizontalBar.width -\n self.scrollCache.x[self.frozenColumn - 1] -\n self.scrollBox.scrollBoxWidth) *\n (self.scrollBox.scrollLeft / self.scrollBox.scrollWidth);\n } else {\n en.horizontalBox.x =\n rowHeaderCellWidth +\n self.style.scrollBarBoxMargin +\n (en.horizontalBar.width - self.scrollBox.scrollBoxWidth) *\n (self.scrollBox.scrollLeft / self.scrollBox.scrollWidth);\n }\n en.verticalBox.y =\n columnHeaderCellHeight +\n self.style.scrollBarBoxMargin +\n self.scrollCache.y[self.frozenRow] +\n (en.verticalBar.height -\n self.scrollBox.scrollBoxHeight -\n self.scrollCache.y[self.frozenRow]) *\n (self.scrollBox.scrollTop / self.scrollBox.scrollHeight);\n if (self.scrollBox.horizontalBarVisible) {\n self.ctx.fillStyle = self.style.scrollBarBackgroundColor;\n fillRect(\n en.horizontalBar.x,\n en.horizontalBar.y,\n en.horizontalBar.width + m,\n en.horizontalBar.height,\n );\n strokeRect(\n en.horizontalBar.x,\n en.horizontalBar.y,\n en.horizontalBar.width + m,\n en.horizontalBar.height,\n );\n self.ctx.fillStyle = self.style.scrollBarBoxColor;\n if (self.scrollBox.horizontalBoxVisible) {\n if (/horizontal/.test(u.context)) {\n self.ctx.fillStyle = self.style.scrollBarActiveColor;\n }\n radiusRect(\n en.horizontalBox.x,\n en.horizontalBox.y,\n en.horizontalBox.width,\n en.horizontalBox.height,\n self.style.scrollBarBoxBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n }\n drawCorner = true;\n self.visibleCells.unshift(en.horizontalBar);\n self.visibleCells.unshift(en.horizontalBox);\n }\n if (self.scrollBox.verticalBarVisible) {\n self.ctx.fillStyle = self.style.scrollBarBackgroundColor;\n fillRect(\n en.verticalBar.x,\n en.verticalBar.y,\n en.verticalBar.width,\n en.verticalBar.height + m,\n );\n strokeRect(\n en.verticalBar.x,\n en.verticalBar.y,\n en.verticalBar.width,\n en.verticalBar.height + m,\n );\n if (self.scrollBox.verticalBoxVisible) {\n self.ctx.fillStyle = self.style.scrollBarBoxColor;\n if (/vertical/.test(u.context)) {\n self.ctx.fillStyle = self.style.scrollBarActiveColor;\n }\n radiusRect(\n en.verticalBox.x,\n en.verticalBox.y,\n en.verticalBox.width,\n en.verticalBox.height,\n self.style.scrollBarBoxBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n }\n drawCorner = true;\n self.visibleCells.unshift(en.verticalBar);\n self.visibleCells.unshift(en.verticalBox);\n }\n if (drawCorner) {\n //corner\n self.ctx.strokeStyle = self.style.scrollBarCornerBorderColor;\n self.ctx.fillStyle = self.style.scrollBarCornerBackgroundColor;\n radiusRect(\n en.corner.x,\n en.corner.y,\n en.corner.width,\n en.corner.height,\n 0,\n );\n self.ctx.stroke();\n self.ctx.fill();\n self.visibleCells.unshift(en.corner);\n }\n }\n function createHandlesOverlayArray(cell) {\n if (self.attributes.allowMovingSelection || self.mobile) {\n if (\n cell.selectionBorderTop &&\n cell.selectionBorderRight &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'tr']);\n cell.selectionHandle = 'tr';\n }\n if (\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 // We don't treat the row index difference from hidden rows as the row gap.\n if (hasRowGap && self.hiddenRowRanges.length > 0) {\n for (let i = 0; i < self.hiddenRowRanges.length; i++) {\n const [beginRowIndex, endRowIndex] = self.hiddenRowRanges[i];\n if (\n cell.boundRowIndex === endRowIndex + 1 &&\n previousRowNumber === beginRowIndex - 1\n ) {\n hasRowGap = false;\n break;\n }\n }\n }\n\n if (hasRowGap) {\n const barHeight = self.style.rowHeaderCellRowNumberGapHeight;\n const barColor = self.style.rowHeaderCellRowNumberGapColor;\n\n self.ctx.save();\n\n self.ctx.fillStyle = barColor;\n\n fillRect(cell.x, cell.y - barHeight / 2, cell.width, barHeight);\n\n self.ctx.restore();\n }\n }\n\n //#region draw unhide indicator for column headers\n if (isColumnHeader && self.attributes.showUnhideColumnsIndicator) {\n const hovered = self.hovers.unhideIndicator;\n const size = self.style.unhideIndicatorSize;\n const cellX = x;\n const topY = cell.y + Math.max(0.5 * (cell.height - size), 0);\n\n const isActive = (orderIndex) =>\n hovered &&\n (hovered.dir === 'l' || hovered.dir === 'r') &&\n orderIndex >= hovered.orderIndex0 &&\n orderIndex <= hovered.orderIndex1;\n const isHiddenColumn = (columnIndex) =>\n columnIndex >= 0 &&\n schema[columnIndex] &&\n schema[columnIndex].hidden;\n\n let orderIndex0, orderIndex1;\n const drawIndicator = (leftX, dir, active) => {\n self.visibleUnhideIndicators.push({\n x: leftX - 1,\n y: topY - 1,\n x2: leftX + size + 2,\n y2: topY + size + 2,\n orderIndex0,\n orderIndex1,\n dir,\n });\n if (!active) {\n const line = cell.text && cell.text.lines && cell.text.lines[0];\n if (line) {\n const iconsWidth = orderByArrowSize + treeArrowSize;\n const lineX0 = iconsWidth > 0 ? iconsWidth : line.x;\n const lineX1 = line.x + line.width;\n if (leftX + size >= lineX0 && leftX <= lineX1) return;\n }\n }\n drawUnhideIndicator(leftX, topY, size, dir, active);\n }; // end of drawIndicator\n\n let orderIndexPtr = columnOrderIndex - 1;\n const prevColumnIndex = self.orders.columns[orderIndexPtr];\n if (isHiddenColumn(prevColumnIndex)) {\n const active = isActive(prevColumnIndex);\n orderIndex0 = orderIndexPtr;\n orderIndex1 = orderIndexPtr;\n while (--orderIndexPtr >= 0) {\n if (isHiddenColumn(self.orders.columns[orderIndexPtr]))\n orderIndex0 = orderIndexPtr;\n else break;\n }\n drawIndicator(cellX, 'r', active);\n }\n\n orderIndexPtr = columnOrderIndex + 1;\n const nextColumnIndex = self.orders.columns[orderIndexPtr];\n if (isHiddenColumn(nextColumnIndex)) {\n const active = isActive(nextColumnIndex);\n orderIndex0 = orderIndexPtr;\n orderIndex1 = orderIndexPtr;\n while (++orderIndexPtr < self.orders.columns.length) {\n if (isHiddenColumn(self.orders.columns[orderIndexPtr]))\n orderIndex1 = orderIndexPtr;\n else break;\n }\n const indicatorX = x + cell.width - size;\n drawIndicator(indicatorX, 'l', active);\n }\n }\n //#endregion draw unhide indicator for column headers\n\n //#region draw unhide indicator for row headers\n if (\n isRowHeader &&\n self.attributes.showUnhideRowsIndicator &&\n self.hiddenRowRanges.length > 0\n ) {\n // Leo's comment:\n // from the first row to the last row, `rowIndex` is from 0 to the count of rows\n // but `boundRowIndex` can be disordered if there are any ordered columns or filtered columns\n // Like this statement:\n // console.log(rowIndex, cell.boundRowIndex, cell.formattedValue);\n // can output the result like this:\n // 0 1 '2'\n // 1 3 '4'\n const hovered = self.hovers.unhideIndicator;\n const size = self.style.unhideIndicatorSize;\n const leftX = cell.x + cell.width - size - 2;\n const cellY = y;\n const topIndicators = {};\n const bottomIndicators = {};\n self.hiddenRowRanges.forEach((it) => {\n topIndicators[it[0] - 1] = it;\n bottomIndicators[it[1] + 1] = it;\n });\n\n const rowIndex = cell.rowIndex + currentRowIndexOffset;\n const isActive = () =>\n hovered &&\n (hovered.dir === 't' || hovered.dir === 'b') &&\n rowIndex >= hovered.orderIndex0 - 1 &&\n rowIndex <= hovered.orderIndex1 + 1;\n\n let orderIndex0, orderIndex1;\n const drawIndicator = (topY, dir, active) => {\n self.visibleUnhideIndicators.push({\n x: leftX - 1,\n y: topY - 1,\n x2: leftX + size + 2,\n y2: topY + size + 2,\n orderIndex0,\n orderIndex1,\n dir,\n });\n drawUnhideIndicator(leftX, topY, size, dir, active);\n }; // end of drawIndicator\n\n let matched = topIndicators[rowIndex];\n if (matched) {\n const indicatorY = cellY + cell.height - size;\n [orderIndex0, orderIndex1] = matched;\n drawIndicator(indicatorY, 't', isActive());\n }\n matched = bottomIndicators[rowIndex];\n if (matched) {\n const indicatorY = cellY;\n [orderIndex0, orderIndex1] = matched;\n drawIndicator(indicatorY, 'b', isActive());\n }\n }\n //#endregion draw unhide indicator for row headers\n\n x += cell.width + (bc ? 0 : self.style.cellBorderWidth);\n return cell.width;\n }; // end of drawEach\n }\n function drawFilterButton(cell, ev) {\n var posX = cell.x + cell.width - self.style.filterButtonWidth - 1;\n var posY = cell.y + cell.height - self.style.filterButtonHeight - 2;\n if (self.dispatchEvent('beforerenderfilterbutton', ev)) {\n return;\n }\n self.ctx.save();\n self.ctx.strokeStyle = self.style.filterButtonBorderColor;\n self.ctx.fillStyle = self.style.filterButtonBackgroundColor;\n if (cell.openedFilter) {\n self.ctx.fillStyle = self.style.filterButtonActiveBackgroundColor;\n } else if (cell.hovered && self.hovers.onFilterButton) {\n self.ctx.fillStyle = self.style.filterButtonHoverBackgroundColor;\n }\n radiusRect(\n posX,\n posY,\n self.style.filterButtonWidth,\n self.style.filterButtonHeight,\n self.style.filterButtonBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n drawFilterButtonArrow(posX, posY);\n self.ctx.clip();\n self.dispatchEvent('afterrenderfilterbutton', ev);\n self.ctx.restore();\n }\n function drawRowHeader(rowData, rowIndex, rowOrderIndex) {\n if (self.attributes.showRowHeaders) {\n x = 0;\n\n // When filtering we'd like to display the actual row numbers,\n // as it is in the unfiltered data, instead of simply the viewed\n // row index + 1. If rowIndex > viewData.length, it's a new row\n // added to the end, and we want to render that new row's number\n let filteredRowNumber;\n if (self.viewData && rowIndex < self.viewData.length)\n filteredRowNumber =\n self.getBoundRowIndexFromViewRowIndex(rowIndex) + 1;\n else\n filteredRowNumber = self.originalData\n ? self.originalData.length + 1\n : rowOrderIndex + 1;\n\n let rowHeaderValue =\n self.hasActiveFilters() || self.hasCollapsedRowGroup()\n ? filteredRowNumber\n : rowIndex + 1;\n rowHeaderValue += currentRowIndexOffset;\n\n const rowHeaderCell = { rowHeaderCell: rowHeaderValue };\n const headerDescription = {\n name: 'rowHeaderCell',\n width: self.sizes.columns[-1] || self.style.rowHeaderCellWidth,\n style: 'rowHeaderCell',\n type: 'string',\n data: rowHeaderValue,\n index: -1,\n };\n rowOpen = self.openChildren[rowIndex];\n drawCell(rowHeaderCell, rowOrderIndex, rowIndex)(\n headerDescription,\n -1,\n -1,\n );\n\n if (\n rowIndexOffsetByHiddenRows[0] &&\n rowHeaderValue >= rowIndexOffsetByHiddenRows[0].from\n ) {\n const { plus } = rowIndexOffsetByHiddenRows.shift();\n currentRowIndexOffset += plus;\n }\n }\n }\n function drawHeaders() {\n var d,\n g = schema.length,\n i,\n o,\n columnHeaderCell,\n header,\n nonFrozenHeaderWidth;\n function drawHeaderColumnRange(start, end) {\n end = Math.min(end, g);\n for (o = start; o < end; o += 1) {\n i = self.orders.columns[o];\n header = schema[i];\n if (!header.hidden && !isColumnCollapsedByGroup(o)) {\n d = {\n title: header.title,\n name: header.name,\n width: header.width || self.style.cellWidth,\n style: 'columnHeaderCell',\n type: 'string',\n index: o,\n order: i,\n };\n columnHeaderCell = {\n columnHeaderCell: header.title || header.name,\n };\n x += drawCell(columnHeaderCell, -1, -1)(d, i, o);\n if (x > self.width + self.scrollBox.scrollLeft) {\n break;\n }\n }\n }\n }\n rowHeaders.forEach(function (rArgs, rhIndex) {\n y = rArgs[3];\n cellHeight = rArgs[4];\n if (rhIndex === self.frozenRow) {\n self.ctx.save();\n radiusRect(\n 0,\n self.lastFrozenRowPixel,\n self.width,\n self.height - self.lastFrozenRowPixel,\n 0,\n );\n self.ctx.clip();\n }\n drawRowHeader(rArgs[0], rArgs[1], rArgs[2]);\n });\n self.ctx.restore();\n if (self.attributes.showColumnHeaders) {\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.columnHeaderCellBorderWidth;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n y = 0;\n // cell height might have changed during drawing\n cellHeight = self.getColumnHeaderCellHeight();\n drawHeaderColumnRange(self.scrollIndexLeft, g);\n nonFrozenHeaderWidth = x;\n x = self.style.columnHeaderCellBorderWidth;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n drawHeaderColumnRange(0, self.frozenColumn);\n // fill in the space right of the headers\n x = nonFrozenHeaderWidth;\n if (x < w) {\n c = {\n name: '',\n width: self.style.scrollBarWidth,\n style: 'columnHeaderCellCap',\n isColumnHeaderCell: true,\n isColumnHeaderCellCap: true,\n type: 'string',\n index: schema.length,\n };\n drawCell({ endCap: '' }, -1, -1)(c, -1, -1);\n }\n // fill in the space right of the headers\n if (self.attributes.showRowHeaders) {\n cornerCell = { cornerCell: '' };\n x = 0;\n c = {\n name: 'cornerCell',\n width: self.style.rowHeaderCellWidth,\n style: 'cornerCell',\n type: 'string',\n index: -1,\n };\n drawCell(cornerCell, -1, -1)(c, -1, -1);\n }\n }\n }\n function drawRow(rowOrderIndex, rowIndex) {\n var headerIndex,\n treeHeight,\n rowSansTreeHeight,\n columnOrderIndex,\n g = schema.length;\n if (y - cellHeight * 2 > h) {\n return false;\n }\n rowData = viewData[rowOrderIndex];\n rowOpen = self.openChildren[rowOrderIndex];\n rowSansTreeHeight =\n (self.sizes.rows[rowOrderIndex] || self.style.cellHeight) * self.scale;\n treeHeight = (rowOpen ? self.sizes.trees[rowOrderIndex] : 0) * self.scale;\n rowHeight = rowSansTreeHeight + treeHeight;\n if (y < -rowHeight) {\n return false;\n }\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n cellHeight = rowHeight;\n //draw normal columns\n for (\n columnOrderIndex = self.scrollIndexLeft;\n columnOrderIndex < g;\n columnOrderIndex += 1\n ) {\n if (!isColumnCollapsedByGroup(columnOrderIndex)) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(rowData, rowOrderIndex, rowIndex)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n }\n if (x > self.width) {\n self.scrollIndexRight = columnOrderIndex;\n self.scrollPixelRight = x;\n break;\n }\n }\n //draw frozen columns\n x = 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.visibleUnhideIndicators = [];\n self.canvasOffsetTop = self.isChildGrid ? self.parentNode.offsetTop : 0.5;\n self.canvasOffsetLeft = self.isChildGrid\n ? self.parentNode.offsetLeft\n : -0.5;\n h = self.height;\n w = self.width;\n\n // patch for first row being hidden\n const firstRowIndexOffset = rowIndexOffsetByHiddenRows[0];\n if (firstRowIndexOffset && firstRowIndexOffset.from === 0) {\n currentRowIndexOffset = firstRowIndexOffset.plus;\n rowIndexOffsetByHiddenRows.shift();\n }\n }\n function drawBackground() {\n radiusRect(0, 0, w, h, 0);\n self.ctx.clip();\n self.ctx.fillStyle = self.style.gridBackgroundColor;\n fillRect(0, 0, w, h);\n }\n function initGroupArea() {\n self.ctx.translate(rowGroupsAreaWidth, columnGroupsAreaHeight);\n }\n function drawGroupArea() {\n const mx = rowGroupsAreaWidth;\n const my = columnGroupsAreaHeight;\n const frozenColumnsWidth = getFrozenColumnsWidth();\n const frozenRowsHeight =\n rowGroupsFrozenInfo.y + rowGroupsFrozenInfo.h - columnHeaderCellHeight;\n const onTheLeft = self.attributes.columnGroupIndicatorPosition === 'left';\n const onTheTop = self.attributes.rowGroupIndicatorPosition === 'top';\n\n /** @type {CanvasRenderingContext2D} */\n const ctx = self.ctx;\n ctx.save();\n ctx.fillStyle = self.style.groupingAreaBackgroundColor;\n fillRect(0, -my, w, my);\n fillRect(-mx, -my, mx, h);\n ctx.restore();\n\n //#region Columns Grouping\n /** it extends `self.groupedRows` */\n const groupedColumns = [];\n for (let row = 0; row < self.groupedColumns.length; row++) {\n const groups = self.groupedColumns[row];\n for (let j = 0; j < groups.length; j++) {\n groupedColumns.push(Object.assign({ row }, groups[j]));\n }\n }\n if (groupedColumns.length > 0) {\n const rowHeight = self.style.columnGroupRowHeight;\n const toggleHandleSize = rowHeight * 0.5;\n const toggleHandlePadding = (rowHeight - toggleHandleSize) * 0.5;\n\n for (let i = 0; i < groupedColumns.length; i++) {\n const group = groupedColumns[i];\n const { row, collapsed } = group;\n\n const topY = -my + row * rowHeight;\n const centerY = topY + rowHeight * 0.5;\n const bottomY = topY + rowHeight - toggleHandlePadding;\n const leftmostX =\n rowHeaderCellWidth - toggleHandleSize - toggleHandlePadding;\n\n const drawGroupHandleAtX = (x) =>\n drawGroupHandle(\n x,\n topY + toggleHandlePadding,\n toggleHandleSize,\n group.collapsed,\n );\n const pushToVisibleGroups = (leftX, rightX) =>\n self.visibleGroups.push({\n type: 'c',\n collapsed,\n from: group.from,\n to: group.to,\n row,\n x: leftX + mx,\n y: topY + my,\n x2: rightX + mx,\n y2: bottomY + my,\n });\n\n //#region check the relationship between this group and frozen columns\n const crossTheFrozen =\n group.from < self.frozenColumn && group.to >= self.frozenColumn;\n const notInFrozen = group.from >= self.frozenColumn;\n //#endregion\n\n if (collapsed) {\n let leftX = leftmostX + toggleHandleSize;\n // This group is not sticking on the first column\n if (group.from > 0) {\n let colIndex = group.to + 1;\n let col = columnGroupsRectInfo[colIndex];\n if (!col) {\n colIndex = group.from - 1;\n col = columnGroupsRectInfo[colIndex];\n if (!col) continue; // don't draw this group indicator because it is invisible\n leftX = col.x + col.w - toggleHandleSize * 0.5;\n } else {\n leftX = col.x + toggleHandlePadding;\n }\n if (colIndex >= self.frozenColumn) {\n const compare =\n frozenColumnsWidth + rowHeaderCellWidth - toggleHandlePadding;\n // don't draw this group indicator because it is hidden by frozen columns\n if (leftX < compare) continue;\n }\n }\n const rightX = leftX + toggleHandleSize;\n ctx.save();\n ctx.strokeStyle = self.style.groupIndicatorColor;\n ctx.fillStyle = self.style.groupIndicatorBackgroundColor;\n drawGroupHandleAtX(leftX);\n ctx.restore();\n pushToVisibleGroups(leftX, rightX);\n } // end of collapsed group\n\n /** @type {number} pointer for loop */\n let ptr;\n let left = columnGroupsRectInfo[group.from];\n let right = columnGroupsRectInfo[group.to];\n\n let containsBegining = true;\n let containsEnd = true;\n ptr = group.from;\n while (!left && ptr < group.to) {\n left = columnGroupsRectInfo[++ptr];\n containsBegining = false;\n }\n ptr = group.to;\n while (!right && ptr > group.from) {\n right = columnGroupsRectInfo[--ptr];\n containsEnd = false;\n }\n if (!left || !right) continue;\n let rightX = right.x + right.w;\n let leftX = left.x;\n if (crossTheFrozen) {\n const rightCompare = columnGroupsRectInfo[self.frozenColumn - 1];\n if (rightCompare) {\n let compareX = rightCompare.x + rightCompare.w;\n if (!onTheLeft) compareX += toggleHandleSize;\n if (compareX >= rightX) {\n right = rightCompare;\n rightX = right.x + right.w;\n containsEnd = false;\n }\n }\n }\n\n let minLeftX =\n rowHeaderCellWidth + (notInFrozen ? frozenColumnsWidth : 0);\n if (rightX + (onTheLeft ? 0 : toggleHandleSize) < minLeftX) continue;\n\n rightX -= toggleHandlePadding;\n leftX += toggleHandlePadding;\n\n ctx.save();\n ctx.strokeStyle = self.style.groupIndicatorColor;\n ctx.fillStyle = self.style.groupIndicatorBackgroundColor;\n const lineCoords = [];\n\n if (onTheLeft) {\n // avoid lines from two groups be overlapping\n minLeftX += toggleHandlePadding * 2;\n if (leftX < minLeftX) leftX = minLeftX;\n if (group.from === 0) leftX -= toggleHandlePadding * 2;\n if (rightX >= leftX) {\n lineCoords.push(leftX, centerY, rightX, centerY);\n if (containsEnd) lineCoords.push(rightX, bottomY);\n } else {\n rightX = leftX;\n }\n\n leftX -= toggleHandleSize;\n drawGroupHandleAtX(leftX);\n // add more clickable area into `visibleGroups`\n rightX += toggleHandlePadding - 1;\n } else {\n // handle on the right\n if (leftX < minLeftX) leftX = minLeftX;\n if (group.from === 0) leftX -= toggleHandlePadding * 2;\n if (containsEnd) {\n if (group.to === self.frozenColumn - 1) {\n rightX -= toggleHandleSize;\n } else {\n rightX += toggleHandlePadding * 2;\n }\n drawGroupHandleAtX(rightX);\n }\n if (leftX > rightX) {\n leftX = rightX;\n } else {\n if (group.from === 0) {\n containsBegining = true;\n leftX = leftmostX + toggleHandleSize;\n }\n if (containsBegining) lineCoords.push(leftX, bottomY);\n lineCoords.push(leftX, centerY, rightX, centerY);\n }\n\n // add more clickable area into `visibleGroups`\n leftX -= toggleHandlePadding + 1;\n if (containsEnd) rightX += toggleHandleSize;\n }\n drawLines(lineCoords);\n ctx.restore();\n pushToVisibleGroups(leftX, rightX);\n }\n }\n //#endregion Columns Grouping\n\n //#region Rows Grouping\n /** it extends `self.groupedRows` */\n const groupedRows = [];\n for (let col = 0; col < self.groupedRows.length; col++) {\n const groups = self.groupedRows[col];\n for (let j = 0; j < groups.length; j++) {\n groupedRows.push(Object.assign({ col }, groups[j]));\n }\n }\n if (groupedRows.length > 0) {\n const colWidth = self.style.rowGroupColumnWidth;\n const toggleHandleSize = colWidth * 0.5;\n const toggleHandlePadding = (colWidth - toggleHandleSize) * 0.5;\n\n for (let i = 0; i < groupedRows.length; i++) {\n const group = groupedRows[i];\n const { col, collapsed } = group;\n\n const leftX = -mx + col * colWidth;\n const centerX = leftX + colWidth * 0.5;\n const rightX = leftX + colWidth - toggleHandlePadding;\n const topmostY =\n columnHeaderCellHeight - toggleHandleSize - toggleHandlePadding;\n\n const drawGroupHandleAtY = (y) =>\n drawGroupHandle(\n leftX + toggleHandlePadding,\n y,\n toggleHandleSize,\n group.collapsed,\n );\n const pushToVisibleGroups = (topY, bottomY) =>\n self.visibleGroups.push({\n type: 'r',\n collapsed,\n from: group.from,\n to: group.to,\n col,\n x: leftX + mx,\n y: topY + my,\n x2: rightX + mx,\n y2: bottomY + my,\n });\n\n //#region check the relationship between this group and frozen columns\n const crossTheFrozen =\n group.from < self.frozenRow && group.to >= self.frozenRow;\n const notInFrozen = group.from >= self.frozenRow;\n //#endregion\n\n if (collapsed) {\n let topY = topmostY + toggleHandleSize;\n // This group is not sticking on the first column\n if (group.from > 0) {\n let rowIndex = group.to + 1;\n let row = rowGroupsRectInfo[rowIndex];\n if (!row) {\n rowIndex = group.from - 1;\n row = rowGroupsRectInfo[rowIndex];\n if (!row) continue; // don't draw this group indicator because it is invisible\n topY = row.y + row.h - toggleHandleSize * 0.5;\n } else {\n topY = row.y;\n }\n if (rowIndex >= self.frozenRow) {\n const compare =\n frozenRowsHeight +\n columnHeaderCellHeight -\n toggleHandlePadding;\n // don't draw this group indicator because it is hidden by frozen columns\n if (topY < compare) continue;\n }\n }\n const bottomY = topY + toggleHandleSize;\n ctx.save();\n ctx.strokeStyle = self.style.groupIndicatorColor;\n ctx.fillStyle = self.style.groupIndicatorBackgroundColor;\n drawGroupHandleAtY(topY);\n ctx.restore();\n pushToVisibleGroups(topY, bottomY);\n } // end of collapsed group\n\n /** @type {number} pointer for loop */\n let ptr;\n let top = rowGroupsRectInfo[group.from];\n let bottom = rowGroupsRectInfo[group.to];\n\n let containsBegining = true;\n let containsEnd = true;\n ptr = group.from;\n while (!top && ptr < group.to) {\n top = rowGroupsRectInfo[++ptr];\n containsBegining = false;\n }\n ptr = group.to;\n while (!bottom && ptr > group.from) {\n bottom = rowGroupsRectInfo[--ptr];\n containsEnd = false;\n }\n if (!top || !bottom) continue;\n let bottomY = bottom.y + bottom.h;\n let topY = top.y;\n if (crossTheFrozen) {\n const bottomCompare = rowGroupsRectInfo[self.frozenRow - 1];\n if (bottomCompare) {\n let compareY = bottomCompare.y + bottomCompare.h;\n if (!onTheTop) compareY += toggleHandleSize;\n if (compareY >= bottomY) {\n bottom = bottomCompare;\n bottomY = bottom.y + bottom.h;\n containsEnd = false;\n }\n }\n }\n\n let minTopY =\n columnHeaderCellHeight + (notInFrozen ? frozenRowsHeight : 0);\n if (bottomY + (onTheTop ? 0 : toggleHandleSize) < minTopY) continue;\n\n bottomY -= toggleHandlePadding;\n topY += toggleHandlePadding;\n\n ctx.save();\n ctx.strokeStyle = self.style.groupIndicatorColor;\n ctx.fillStyle = self.style.groupIndicatorBackgroundColor;\n const lineCoords = [];\n\n if (onTheTop) {\n // avoid lines from two groups be overlapping\n minTopY += toggleHandlePadding * 2;\n if (topY < minTopY) topY = minTopY;\n if (group.from === 0) topY -= toggleHandlePadding * 2;\n if (bottomY >= topY) {\n lineCoords.push(centerX, topY, centerX, bottomY);\n if (containsEnd) lineCoords.push(rightX, bottomY);\n } else {\n bottomY = topY;\n }\n\n topY -= toggleHandleSize;\n drawGroupHandleAtY(topY);\n\n // add more clickable area into `visibleGroups`\n bottomY += toggleHandlePadding - 1;\n } else {\n // handle on the bottom\n if (topY < minTopY) topY = minTopY;\n if (group.from === 0) topY -= toggleHandlePadding * 2;\n if (containsEnd) {\n if (group.to === self.frozenRow - 1) {\n bottomY -= toggleHandleSize;\n } else {\n // bottomY += toggleHandlePadding * 2;\n }\n drawGroupHandleAtY(bottomY);\n }\n if (topY > bottomY) {\n topY = bottomY;\n } else {\n if (group.from === 0) {\n containsBegining = true;\n topY = topmostY + toggleHandleSize;\n }\n if (containsBegining) lineCoords.push(rightX, topY);\n lineCoords.push(centerX, topY, centerX, bottomY);\n // add more clickable area into `visibleGroups`\n topY -= toggleHandlePadding + 1;\n }\n // add more clickable area into `visibleGroups`\n if (containsEnd) bottomY += toggleHandleSize;\n }\n drawLines(lineCoords);\n ctx.restore();\n pushToVisibleGroups(topY, bottomY);\n }\n }\n //#endregion Rows Grouping\n }\n function drawFrozenRows() {\n var rowOrderIndex,\n ln = Math.min(viewData.length, self.frozenRow);\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n y = columnHeaderCellHeight;\n for (rowIndex = 0; rowIndex < ln; rowIndex += 1) {\n rowOrderIndex = self.orders.rows[rowIndex];\n if (!drawRow(rowOrderIndex, rowIndex)) {\n break;\n }\n }\n if (self.attributes.allowFreezingRows) {\n // HACK great, another stupid magic number.\n // Background will appear as a 0.5px artifact behind the row freeze bar without this hack\n 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, '&lt;').replace(/>/g, '&gt;');\n};\n\nconst createTextString = function (selectedData, isNeat) {\n // Selected like [[0, 1], [0, 1]] of [[0, 3]] is neat; Selected like [[0, 1], [1, 2]] is untidy.\n // If not isNeat we just return a simple string of concatenated values.\n if (!isNeat)\n return selectedData.map((row) => Object.values(row).join('')).join('');\n\n // If isNeat, we can create tab separated mutti-line text.\n return selectedData.map((row) => Object.values(row).join('\\t')).join('\\n');\n};\n\nconst createHTMLString = function (selectedData, isNeat) {\n if (!isNeat) return createTextString(selectedData, isNeat);\n\n // If isNeat, we can create a HTML table with the selected data.\n let htmlString = '<table>';\n htmlString += selectedData\n .map(\n (row) =>\n '<tr>' +\n Object.values(row)\n .map((value) => ['<td>', htmlSafe(value), '</td>'].join(''))\n .join('') +\n '</tr>',\n )\n .join('');\n htmlString += '</table>';\n\n return htmlString;\n};\n\nexport {\n createTextString,\n createHTMLString,\n isSupportedHtml,\n htmlSafe,\n parseData,\n parseHtmlTable,\n parseHtmlText,\n parseText,\n sanitizeElementData,\n};\n","/*jslint browser: true, unparam: true, todo: true, plusplus: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport isPrintableKeyEvent from 'is-printable-key-event';\nimport { isSupportedHtml, parseData } from './util';\n\nexport default function (self) {\n var wheeling;\n self.stopPropagation = function (e) {\n e.stopPropagation();\n };\n /**\n * Adds an event listener to the given event.\n * @memberof canvasDatagrid\n * @name addEventListener\n * @method\n * @param {string} ev The name of the event to subscribe to.\n * @param {function} fn The event procedure to execute when the event is raised.\n */\n self.addEventListener = function (ev, fn) {\n self.events[ev] = self.events[ev] || [];\n self.events[ev].unshift(fn);\n };\n /**\n * Removes the given listener function from the given event. Must be an actual reference to the function that was bound.\n * @memberof canvasDatagrid\n * @name removeEventListener\n * @method\n * @param {string} ev The name of the event to unsubscribe from.\n * @param {function} fn The event procedure to execute when the event is raised.\n */\n self.removeEventListener = function (ev, fn) {\n (self.events[ev] || []).forEach(function removeEachListener(sfn, idx) {\n if (fn === sfn) {\n self.events[ev].splice(idx, 1);\n }\n });\n };\n /**\n * Fires the given event, passing an event object to the event subscribers.\n * @memberof canvasDatagrid\n * @name dispatchEvent\n * @method\n * @param {number} ev The name of the event to dispatch.\n * @param {number} e The event object.\n */\n self.dispatchEvent = function (ev, e) {\n e = ev.type ? ev : e || {};\n ev = ev.type || ev;\n var defaultPrevented;\n function preventDefault() {\n defaultPrevented = true;\n }\n if (!self.events[ev]) {\n return;\n }\n self.events[ev].forEach(function dispatchEachEvent(fn) {\n e.ctx = self.ctx;\n e.preventDefault = preventDefault;\n fn.apply(self.intf, [e]);\n });\n return defaultPrevented;\n };\n self.getRatio = function () {\n return Math.min(\n self.attributes.maxPixelRatio,\n (window.devicePixelRatio || 1) /\n (self.ctx.webkitBackingStorePixelRatio ||\n self.ctx.mozBackingStorePixelRatio ||\n self.ctx.msBackingStorePixelRatio ||\n self.ctx.oBackingStorePixelRatio ||\n self.ctx.backingStorePixelRatio ||\n 1),\n );\n };\n /**\n * @returns {number} dataWidth\n */\n self.refreshScrollCacheX = function () {\n const s = self.getSchema();\n self.scrollCache.x = [];\n\n /** @type {number} it will be used in `reduceSchema` only */\n let frozenWidth = 0;\n\n const collapsedColumnGroups = self.getCollapsedColumnGroups();\n const isColumnCollapsed = (columnIndex) =>\n collapsedColumnGroups.findIndex(\n (group) => columnIndex >= group.from && columnIndex <= group.to,\n ) >= 0;\n\n const dataWidth =\n s.reduce(function reduceSchema(accumulator, column, columnIndex) {\n // intentional redefintion of column. This causes scrollCache to be in the correct order\n const schemaIndex = self.orders.columns[columnIndex];\n const columnWidth = self.getColumnWidth(schemaIndex);\n column = s[schemaIndex];\n if (!column.hidden && !isColumnCollapsed(columnIndex))\n accumulator += columnWidth;\n if (columnIndex < self.frozenColumn) {\n self.scrollCache.x[columnIndex] = accumulator;\n frozenWidth = accumulator;\n } else {\n self.scrollCache.x[columnIndex] = Math.max(\n frozenWidth + columnWidth,\n accumulator,\n );\n }\n return accumulator;\n }, 0) || 0;\n return dataWidth;\n };\n self.resize = function (drawAfterResize) {\n if (!self.canvas) {\n return;\n }\n var x,\n v = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'vertical-scroll-bar',\n },\n n = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'horizontal-scroll-bar',\n },\n vb = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'vertical-scroll-box',\n },\n nb = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n style: 'horizontal-scroll-box',\n },\n co = {\n x: 0,\n y: 0,\n height: 0,\n width: 0,\n isCorner: true,\n isScrollBoxCorner: true,\n style: 'scroll-box-corner',\n },\n m = self.style.scrollBarBoxMargin * 2,\n b = self.style.scrollBarBorderWidth * 2,\n d = self.style.scrollBarBoxMargin * 0.5,\n sbw = self.style.scrollBarWidth + self.style.scrollBarBorderWidth * 2,\n ratio = self.getRatio(),\n bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n cellBorder = self.style.cellBorderWidth * bm,\n columnHeaderCellBorder = self.style.columnHeaderCellBorderWidth * bm,\n dataHeight = 0,\n dataWidth = 0,\n dims,\n l = (self.viewData || []).length,\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n topGroupAreaHeight = self.getColumnGroupAreaHeight(),\n leftGroupAreaWidth = self.getRowGroupAreaWidth(),\n ch = self.style.cellHeight;\n // sets actual DOM canvas element\n function checkScrollBoxVisibility() {\n self.scrollBox.horizontalBarVisible =\n (self.style.width !== 'auto' &&\n dataWidth > self.scrollBox.width &&\n self.style.overflowX !== 'hidden') ||\n self.style.overflowX === 'scroll';\n self.scrollBox.horizontalBoxVisible = dataWidth > self.scrollBox.width;\n self.scrollBox.verticalBarVisible =\n (self.style.height !== 'auto' &&\n dataHeight > self.scrollBox.height &&\n self.style.overflowY !== 'hidden') ||\n self.style.overflowY === 'scroll';\n self.scrollBox.verticalBoxVisible = dataHeight > self.scrollBox.height;\n }\n function setScrollBoxSize() {\n self.scrollBox.width =\n self.width - rowHeaderCellWidth - leftGroupAreaWidth;\n self.scrollBox.height =\n self.height - columnHeaderCellHeight - topGroupAreaHeight;\n }\n function setCanvasSize() {\n if (self.isChildGrid) {\n return;\n }\n dims = {\n // HACK +1 ? maybe it's a magic cell border? Required to line up properly in auto height mode.\n height:\n columnHeaderCellHeight +\n topGroupAreaHeight +\n dataHeight +\n cellBorder +\n 1,\n width: dataWidth + rowHeaderCellWidth + cellBorder + leftGroupAreaWidth,\n };\n ['width', 'height'].forEach(function (dim) {\n //TODO: support inherit\n if (\n ['auto', undefined].indexOf(self.style[dim]) !== -1 &&\n ['auto', undefined].indexOf(self.appliedInlineStyles[dim]) !== -1\n ) {\n self.parentNodeStyle[dim] = dims[dim] + 'px';\n } else if (\n ['auto', undefined].indexOf(self.style[dim]) == -1 &&\n ['auto', undefined].indexOf(self.appliedInlineStyles[dim]) == -1\n ) {\n self.parentNodeStyle[dim] = self.style[dim];\n if (self.isComponent) {\n self.canvas.style[dim] = self.style[dim];\n }\n }\n });\n }\n dataWidth = self.refreshScrollCacheX();\n self.scrollCache.y = [];\n for (x = 0; x < l; x += 1) {\n self.scrollCache.y[x] = dataHeight;\n dataHeight +=\n ((self.sizes.rows[x] || ch) + (self.sizes.trees[x] || 0)) * self.scale +\n // HACK? if an expanded tree row is frozen it is necessary to add the tree row's height a second time.\n (self.frozenRow > x ? self.sizes.trees[x] || 0 : 0);\n }\n if (l > 1) {\n self.scrollCache.y[x] = dataHeight;\n }\n if (self.attributes.showNewRow) {\n dataHeight += ch;\n }\n if (self.attributes.snapToRow) {\n dataHeight += self.style.cellHeight;\n }\n setCanvasSize();\n if (self.isChildGrid) {\n self.width = self.parentNode.offsetWidth;\n self.height = self.parentNode.offsetHeight;\n } else if (\n self.height !== self.canvas.offsetHeight ||\n self.width !== self.canvas.offsetWidth\n ) {\n self.height = self.canvas.offsetHeight;\n self.width = self.canvas.offsetWidth;\n self.canvasOffsetLeft = self.args.canvasOffsetLeft || 0;\n self.canvasOffsetTop = self.args.canvasOffsetTop || 0;\n }\n /// calculate scroll bar dimensions\n // non-controversial\n self.scrollBox.top =\n columnHeaderCellHeight + topGroupAreaHeight + columnHeaderCellBorder;\n self.scrollBox.left = rowHeaderCellWidth + leftGroupAreaWidth;\n // width and height of scroll box\n setScrollBoxSize();\n // is the data larger than the scroll box\n checkScrollBoxVisibility();\n // if the scroll box is visible, make room for it by expanding the size of the element\n // if the other dimension is set to auto\n if (self.scrollBox.horizontalBarVisible) {\n if (self.style.height === 'auto' && !self.isChildGrid) {\n self.height += sbw;\n }\n dataHeight += sbw;\n setCanvasSize();\n setScrollBoxSize();\n checkScrollBoxVisibility();\n }\n if (self.scrollBox.verticalBarVisible) {\n if (self.style.width === 'auto' && !self.isChildGrid) {\n self.width += sbw;\n }\n dataWidth += sbw;\n setCanvasSize();\n setScrollBoxSize();\n checkScrollBoxVisibility();\n }\n // set again after bar visibility checks\n setScrollBoxSize();\n self.scrollBox.scrollWidth = dataWidth - self.scrollBox.width;\n self.scrollBox.scrollHeight = dataHeight - self.scrollBox.height;\n if (self.frozenColumn > 0) {\n self.scrollBox.widthBoxRatio =\n (self.scrollBox.width - self.scrollCache.x[self.frozenColumn - 1]) /\n dataWidth;\n } else {\n self.scrollBox.widthBoxRatio = self.scrollBox.width / dataWidth;\n }\n self.scrollBox.scrollBoxWidth =\n self.scrollBox.width * self.scrollBox.widthBoxRatio -\n self.style.scrollBarWidth -\n b -\n d;\n // TODO: This heightBoxRatio number is terribly wrong.\n // They should be a result of the size of the grid/canvas?\n // it being off causes the scroll bar to \"slide\" under\n // the dragged mouse.\n // https://github.com/TonyGermaneri/canvas-datagrid/issues/97\n self.scrollBox.heightBoxRatio =\n (self.scrollBox.height -\n columnHeaderCellHeight -\n topGroupAreaHeight -\n self.scrollCache.y[self.frozenRow]) /\n dataHeight;\n self.scrollBox.scrollBoxHeight =\n self.scrollBox.height * self.scrollBox.heightBoxRatio -\n self.style.scrollBarWidth -\n b -\n d;\n self.scrollBox.scrollBoxWidth = Math.max(\n self.scrollBox.scrollBoxWidth,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.scrollBoxHeight = Math.max(\n self.scrollBox.scrollBoxHeight,\n self.style.scrollBarBoxMinSize,\n );\n // horizontal\n n.x += rowHeaderCellWidth;\n n.y += self.height - self.style.scrollBarWidth - d - topGroupAreaHeight;\n n.width =\n self.width -\n self.style.scrollBarWidth -\n rowHeaderCellWidth -\n leftGroupAreaWidth -\n d -\n m;\n n.height = self.style.scrollBarWidth + self.style.scrollBarBorderWidth + d;\n // horizontal box\n nb.y = n.y + self.style.scrollBarBoxMargin;\n nb.width = self.scrollBox.scrollBoxWidth;\n nb.height = self.style.scrollBarBoxWidth;\n // vertical\n v.x +=\n self.width -\n leftGroupAreaWidth -\n self.style.scrollBarWidth -\n self.style.scrollBarBorderWidth -\n d;\n v.y += columnHeaderCellHeight + self.scrollCache.y[self.frozenRow];\n v.width = self.style.scrollBarWidth + self.style.scrollBarBorderWidth + d;\n v.height =\n self.height -\n columnHeaderCellHeight -\n topGroupAreaHeight -\n self.style.scrollBarWidth -\n d -\n m;\n // vertical box\n vb.x = v.x + self.style.scrollBarBoxMargin;\n vb.y += self.scrollCache.y[self.frozenRow];\n vb.width = self.style.scrollBarBoxWidth;\n vb.height = self.scrollBox.scrollBoxHeight;\n // corner\n co.x = n.x + n.width + m;\n co.y = v.y + v.height + m;\n co.width = self.style.scrollBarWidth + self.style.scrollBarBorderWidth;\n co.height = self.style.scrollBarWidth + self.style.scrollBarBorderWidth;\n self.scrollBox.entities = {\n horizontalBar: n,\n horizontalBox: nb,\n verticalBar: v,\n verticalBox: vb,\n corner: co,\n };\n self.scrollBox.bar = {\n v: v,\n h: n,\n };\n self.scrollBox.box = {\n v: vb,\n h: nb,\n };\n /// calculate page and dom elements\n self.page = Math.max(\n 1,\n self.visibleRows.length - 3 - self.attributes.pageUpDownOverlap,\n );\n // set canvas drawing related items\n if (!self.isChildGrid) {\n 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 if (\n !self.draggingItem && // It is not in dragging mode (avoid changing hovers frequent)\n cell &&\n (cell.context === 'cell' || cell.context === self.cursorGrab)\n ) {\n const indicator = self.getUnhideIndicator(self.mouse.x, self.mouse.y);\n if (indicator) {\n self.cursor = 'pointer';\n self.hovers = { unhideIndicator: indicator };\n self.draw();\n return;\n }\n }\n\n self.hovers = {};\n if (!self.draggingItem && cell) {\n self.dragItem = cell;\n self.dragMode = cell.dragContext;\n self.cursor = cell.context;\n if (cell.context === 'cell') {\n self.cursor = 'default';\n self.hovers = {\n rowIndex: cell.rowIndex,\n columnIndex: cell.columnIndex,\n onFilterButton: false,\n onCellTreeIcon: false,\n };\n if (\n cell.isFilterable &&\n x >\n cell.x +\n cell.width +\n self.canvasOffsetLeft -\n self.style.filterButtonWidth &&\n x < cell.x + cell.width + self.canvasOffsetLeft &&\n y >\n cell.y +\n cell.height +\n self.canvasOffsetTop -\n self.style.filterButtonHeight &&\n y < cell.y + cell.height + self.canvasOffsetTop\n ) {\n self.hovers.onFilterButton = true;\n self.draw();\n }\n if (cell.isRowTree || cell.isColumnTree) {\n const pc = cell.isRowTree\n ? self.cellTree.rows[cell.rowIndex].parentCount\n : 0;\n const rc = self.style.cellTreeIconWidth * self.scale,\n rx =\n cell.x +\n cell.paddingLeft +\n self.canvasOffsetLeft +\n self.style.cellTreeIconMarginLeft +\n pc * (rc + cell.paddingLeft),\n ry =\n cell.y +\n self.canvasOffsetTop +\n self.style.cellTreeIconMarginTop * self.scale;\n if (x >= rx && x <= rx + rc && y >= ry && y < ry + rc) {\n self.hovers.onCellTreeIcon = true;\n self.draw();\n }\n }\n }\n if (self.selecting || self.reorderObject) {\n delta = {\n x: Math.abs(self.dragStart.x - x),\n y: Math.abs(self.dragStart.y - y),\n };\n if (self.dragStartObject.columnIndex !== -1 && e.shiftKey) {\n self.dragStartObject = {\n rowIndex: self.activeCell.rowIndex,\n columnIndex: self.activeCell.columnIndex,\n };\n }\n dragBounds = {\n top: Math.min(self.dragStartObject.rowIndex, cell.rowIndex),\n left: Math.min(self.dragStartObject.columnIndex, cell.columnIndex),\n bottom: Math.max(self.dragStartObject.rowIndex, cell.rowIndex),\n right: Math.max(self.dragStartObject.columnIndex, cell.columnIndex),\n };\n if (self.dragStartObject.columnIndex === -1) {\n sBounds = self.getSelectionBounds();\n dragBounds.left = -1;\n dragBounds.right = s.length - 1;\n dragBounds.top = Math.min(sBounds.top, cell.rowIndex);\n dragBounds.bottom = Math.max(sBounds.bottom, cell.rowIndex);\n if (dragBounds.top < 0) dragBounds.top = 0;\n }\n\n if (self.dragStartObject.rowIndex === -1) {\n sBounds = self.getSelectionBounds();\n dragBounds.left =\n cell.columnIndex === undefined\n ? sBounds.left\n : Math.min(sBounds.left, cell.columnIndex);\n dragBounds.right =\n cell.columnIndex === undefined\n ? sBounds.right\n : Math.max(sBounds.right, cell.columnIndex);\n dragBounds.top = -1;\n dragBounds.bottom = self.viewData.length - 1;\n if (dragBounds.left < 0) dragBounds.left = 0;\n }\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 const unhideIndicator = self.getUnhideIndicator(pos.x, pos.y);\n if (unhideIndicator) {\n const { dir, orderIndex0, orderIndex1 } = unhideIndicator;\n if (dir === 'l' || dir === 'r')\n self.unhideColumns(orderIndex0, orderIndex1);\n else self.unhideRows(orderIndex0, orderIndex1);\n return;\n }\n\n let group = self.getColumnGroupAt(pos.x, pos.y);\n if (!group) group = self.getRowGroupAt(pos.x, pos.y);\n if (group) {\n if (self.toggleGroup(group)) {\n self.setStorageData();\n self.refresh();\n return;\n }\n }\n\n if (!self.hasFocus) {\n return;\n }\n\n const leftOffset = self.getRowGroupAreaWidth();\n const topOffset = self.getColumnGroupAreaHeight();\n const xInGrid = pos.x - leftOffset;\n const yInGrid = pos.y - topOffset;\n if (\n ['rowHeaderCell', 'columnHeaderCell'].indexOf(self.currentCell.style) ===\n -1 &&\n !ctrl\n ) {\n if (!self.hovers.onFilterButton) {\n self.setActiveCell(i.columnIndex, i.rowIndex);\n }\n }\n if (self.currentCell.context === 'cell') {\n if (self.currentCell.style === 'cornerCell') {\n self.selectAll();\n self.draw();\n checkSelectionChange();\n return;\n }\n if (self.currentCell.style === 'columnHeaderCell') {\n if (self.attributes.columnHeaderClickBehavior === 'sort') {\n if (self.orderBy === i.header.name) {\n self.orderDirection =\n self.orderDirection === 'asc' ? 'desc' : 'asc';\n } else {\n self.orderDirection = 'asc';\n }\n self.order(i.header.name, self.orderDirection);\n checkSelectionChange();\n return;\n }\n }\n 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 const dataWidth = self.refreshScrollCacheX();\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 const onUnhideIndicator = self.hovers && self.hovers.unhideIndicator;\n self.dragStart = overridePos || self.getLayerPos(e);\n self.scrollStart = {\n left: self.scrollBox.scrollLeft,\n top: self.scrollBox.scrollTop,\n };\n self.dragStartObject = self.getCellAt(self.dragStart.x, self.dragStart.y);\n self.dragAddToSelection = !self.dragStartObject.selected;\n if (\n !ctrl &&\n !e.shiftKey &&\n !/(vertical|horizontal)-scroll-(bar|box)/.test(\n self.dragStartObject.context,\n ) &&\n self.currentCell &&\n !self.currentCell.isColumnHeader &&\n !move &&\n !freeze &&\n !resize\n ) {\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 (\n self.scrollModes.indexOf(self.dragStartObject.context) !== -1 &&\n !onUnhideIndicator\n ) {\n self.scrollMode = self.dragStartObject.context;\n self.scrollStartMode = self.dragStartObject.context;\n self.scrollGrid(e);\n if (\n self.attributes.scrollPointerLock &&\n ['horizontal-scroll-box', 'vertical-scroll-box'].indexOf(\n self.scrollStartMode,\n ) !== -1\n ) {\n self.pointerLockPosition = {\n x: self.dragStart.x,\n y: self.dragStart.y,\n };\n self.canvas.requestPointerLock();\n }\n 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 && !onUnhideIndicator) {\n self.draggingItem = self.dragItem;\n if (self.draggingItem.rowOpen) {\n self.resizingStartingHeight =\n self.sizes.trees[self.draggingItem.rowIndex];\n } else {\n self.resizingStartingHeight =\n self.sizes.rows[self.draggingItem.rowIndex] || self.style.cellHeight;\n }\n self.resizingStartingWidth =\n self.sizes.columns[\n self.draggingItem.header.style === 'rowHeaderCell'\n ? 'cornerCell'\n : self.draggingItem.sortColumnIndex\n ] || self.draggingItem.width;\n 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 * Each item of this array contains these properties:\n * - `x`, `y`, `x2`, `y2`\n * - `orderIndex0`, `orderIndex1`: The closed interval of the hiding rows/columns.\n * - `dir`: The directon of the unhide indicator. 'l' and 'r' for columns, 't' and 'b' for rows\n */\n self.visibleUnhideIndicators = [];\n /**\n * Each item is a tuple conatins two numbers:\n * its type difination: Array<[beginRowIndex, endRowIndex]>\n * Each tuple represents a closed Interval\n */\n self.hiddenRowRanges = [];\n /**\n * This array stored all groups information with context for drawing,\n * it is generated by drawing functions,\n * and be used for searching groups when users operate on the spreadsheet\n * Each item of this array contains these properties:\n * - `type`: its available values: 'c' and 'r'. indicates the type of this item, 'c' for column group\n * and 'r' for row group.\n * - `x`,`y`: the left-top point of this group's rendering area.\n * - `x2`, `y2`: the right-bottom of this group's rendering area.\n * - `collapsed`: this value indicates the collapsed status of this group.\n * - `from`, `to`: The column index range of this group (We use this value for searching the group)\n * - `row`: The row index for column groups (We use this value for searching the group)\n */\n self.visibleGroups = [];\n self.sizes = {\n rows: {},\n columns: {},\n trees: {},\n };\n self.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 // Remove hidden rows here. So we can keep the bound indexes correct\n if (self.hiddenRowRanges.length > 0) {\n const ranges = self.hiddenRowRanges.sort((a, b) => b[1] - a[1]);\n for (let i = 0; i < ranges.length; i++) {\n const [beginRowIndex, endRowIndex] = ranges[i];\n const countOfRows = endRowIndex - beginRowIndex + 1;\n newViewData.splice(beginRowIndex, countOfRows);\n }\n }\n\n // Apply filtering\n for (const [headerName, filterText] of Object.entries(self.columnFilters)) {\n const header = self.getHeaderByName(headerName);\n\n if (!header) {\n continue;\n }\n\n const currentFilterFunction =\n header.filter || self.filter(header.type || 'string');\n\n newViewData = newViewData.filter(function ([row, originalRowIndex]) {\n if (\n self.attributes.allowFreezingRows &&\n !self.attributes.filterFrozenRows &&\n originalRowIndex < self.frozenRow\n )\n return true;\n\n return currentFilterFunction(row[headerName], filterText);\n });\n }\n\n //#region Hide rows from collapsed group\n /** @type {number[][]} */\n let collapsedGroups = [];\n for (let i = 0; i < self.groupedRows.length; i++) {\n const rows = self.groupedRows[i];\n for (let j = 0; j < rows.length; j++) {\n const r = rows[j];\n if (!r.collapsed) continue;\n collapsedGroups.push([r.from, r.to]);\n }\n }\n if (collapsedGroups.length > 0) {\n //#region merge groups\n collapsedGroups.sort((a, b) => a[0] - b[0]);\n let newLen = 0;\n const len = collapsedGroups.length;\n for (let i = 0; i < len; i++) {\n const r = collapsedGroups[i];\n if (i === len - 1) {\n collapsedGroups[newLen++] = r;\n break;\n }\n const to = r[1];\n const [from2, to2] = collapsedGroups[i + 1];\n if (from2 > to + 1) {\n collapsedGroups[newLen++] = r;\n continue;\n }\n collapsedGroups[i + 1] = r;\n if (to2 > to) collapsedGroups[i + 1][1] = to2;\n }\n collapsedGroups = collapsedGroups.slice(0, newLen);\n //#endregion merge groups\n\n //#region omit rows by groups\n let g = collapsedGroups.shift();\n for (let start = 0; start < newViewData.length; start++) {\n const it = newViewData[start][1];\n if (it < g[0]) continue;\n let end = start + 1;\n for (; end < newViewData.length; end++) {\n const it2 = newViewData[end][1];\n if (it2 > g[1]) break;\n }\n newViewData.splice(start, end - start);\n g = collapsedGroups.shift();\n if (!g) break;\n start--;\n }\n //#endregion omit rows by groups\n }\n //#endregion Hide rows from collapsed group\n\n // Apply sorting\n for (const column of self.orderings.columns) {\n const sortFn = column.sortFunction(column.orderBy, column.orderDirection);\n\n newViewData.sort(([rowA], [rowB, rowIndexB]) => {\n if (\n self.attributes.allowFreezingRows &&\n !self.attributes.sortFrozenRows &&\n rowIndexB < self.frozenRow\n )\n return 0;\n return sortFn(rowA, rowB);\n });\n }\n\n return {\n viewData: newViewData.map(([row]) => row),\n boundRowIndexMap: new Map(\n newViewData.map(([_row, originalRowIndex], viewRowIndex) => [\n viewRowIndex,\n originalRowIndex,\n ]),\n ),\n };\n };\n self.refresh = function () {\n const { viewData, boundRowIndexMap } = self.getFilteredAndSortedViewData(\n self.originalData,\n );\n\n self.viewData = viewData;\n self.boundRowIndexMap = boundRowIndexMap;\n\n self.resize();\n self.draw(true);\n };\n self.getBestGuessDataType = function (columnName, data) {\n var t,\n x,\n l = data.length;\n for (x = 0; x < l; x += 1) {\n if (\n data[x] !== undefined &&\n data[x] !== null &&\n [null, undefined].indexOf(data[x][columnName]) !== -1\n ) {\n t = typeof data[x];\n return t === 'object' ? 'string' : t;\n }\n }\n return 'string';\n };\n self.drawChildGrids = function () {\n Object.keys(self.childGrids).forEach(function (gridKey) {\n self.childGrids[gridKey].draw();\n });\n };\n self.resizeChildGrids = function () {\n Object.keys(self.childGrids).forEach(function (gridKey) {\n self.childGrids[gridKey].resize();\n });\n };\n self.autoScrollZone = function (e, x, y, ctrl) {\n var setTimer,\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n columnHeaderCellHeight = self.getColumnHeaderCellHeight();\n if (x !== -1) {\n if (x > self.width - self.attributes.selectionScrollZone) {\n self.scrollBox.scrollLeft += self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n if (x - self.attributes.selectionScrollZone - rowHeaderCellWidth < 0) {\n self.scrollBox.scrollLeft -= self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n }\n if (y !== -1) {\n if (y > self.height - self.attributes.selectionScrollZone) {\n self.scrollBox.scrollTop += self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n if (\n y - self.attributes.selectionScrollZone - columnHeaderCellHeight <\n 0\n ) {\n self.scrollBox.scrollTop -= self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n }\n if (\n setTimer &&\n !ctrl &&\n self.currentCell &&\n self.currentCell.columnIndex !== -1\n ) {\n self.scrollTimer = setTimeout(\n self.mousemove,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n };\n self.validateColumn = function (c, s) {\n if (!c.name) {\n throw new Error('A column must contain at least a name.');\n }\n if (\n s.filter(function (i) {\n return i.name === c.name;\n }).length > 0\n ) {\n throw new Error(\n 'A column with the name ' +\n c.name +\n ' already exists and cannot be added again.',\n );\n }\n return true;\n };\n self.setDefaults = function (obj1, obj2, key, def) {\n obj1[key] = obj2[key] === undefined ? def : obj2[key];\n };\n self.setAttributes = function () {\n self.defaults.attributes.forEach(function eachAttribute(i) {\n self.setDefaults(self.attributes, self.args, i[0], i[1]);\n });\n };\n self.setStyle = function () {\n self.defaults.styles.forEach(function eachStyle(i) {\n self.setDefaults(self.style, self.args.style || {}, i[0], i[1]);\n });\n };\n self.autosize = function (colName) {\n self.getVisibleSchema().forEach(function (col, colIndex) {\n if (col.name === colName || colName === undefined) {\n self.sizes.columns[colIndex] = Math.max(\n self.findColumnMaxTextLength(col.name),\n self.style.minColumnWidth,\n );\n }\n });\n self.sizes.columns[-1] = self.findColumnMaxTextLength('cornerCell');\n };\n self.dispose = function () {\n if (!self.isChildGrid && self.canvas && self.canvas.parentNode) {\n self.canvas.parentNode.removeChild(self.canvas);\n }\n if (!self.isChildGrid) {\n document.body.removeChild(self.controlInput);\n }\n self.eventParent.removeEventListener('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.unhideColumns = function (orderIndex0, orderIndex1) {\n const orders = self.orders.columns;\n const schema = self.getSchema();\n for (let i = orderIndex0; i <= orderIndex1; i++) {\n const columnIndex = orders[i];\n const s = schema[columnIndex];\n if (s && s.hidden) s.hidden = false;\n }\n self.refresh();\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 self.intf.hideColumns = self.hideColumns;\n self.intf.hideRows = self.hideRows;\n self.intf.unhideRows = self.unhideRows;\n Object.defineProperty(self.intf, 'defaults', {\n get: function () {\n return {\n styles: self.defaults.styles.reduce(function (a, i) {\n a[i[0]] = i[1];\n return a;\n }, {}),\n attributes: self.defaults.attributes.reduce(function (a, i) {\n a[i[0]] = i[1];\n return a;\n }, {}),\n };\n },\n });\n self.styleKeys = Object.keys(self.intf.defaults.styles);\n self.styleKeys\n .map(function (i) {\n return self.hyphenateProperty(i, false);\n })\n .forEach(addStyleKeyIfNoneExists);\n self.styleKeys\n .map(function (i) {\n return self.hyphenateProperty(i, true);\n })\n .forEach(addStyleKeyIfNoneExists);\n self.DOMStyles = window.getComputedStyle(document.body, null);\n self.styleKeys.concat(Object.keys(self.DOMStyles)).forEach(function (key) {\n // unless this line is here, Object.keys() will not work on <instance>.style\n publicStyleKeyIntf[key] = undefined;\n Object.defineProperty(publicStyleKeyIntf, key, {\n get: function () {\n return self.getStyleProperty(key);\n },\n set: function (value) {\n if (self.initialized) {\n self.appliedInlineStyles[key] = value;\n }\n self.setStyleProperty(key, value);\n },\n });\n });\n Object.defineProperty(self.intf, 'shadowRoot', {\n get: function () {\n return self.shadowRoot;\n },\n });\n Object.defineProperty(self.intf, 'activeCell', {\n get: function () {\n return self.activeCell;\n },\n });\n Object.defineProperty(self.intf, 'hasFocus', {\n get: function () {\n return self.hasFocus;\n },\n });\n Object.defineProperty(self.intf, 'hasActiveFilters', {\n get: function () {\n return self.hasActiveFilters();\n },\n });\n Object.defineProperty(self.intf, 'style', {\n get: function () {\n return publicStyleKeyIntf;\n },\n set: function (valueObject) {\n Object.keys(valueObject).forEach(function (key) {\n self.setStyleProperty(key, valueObject[key], true);\n });\n self.draw(true);\n self.dispatchEvent('stylechanged', {\n name: 'style',\n value: valueObject,\n });\n },\n });\n Object.defineProperty(self.intf, 'attributes', { value: {} });\n Object.keys(self.attributes).forEach(function (key) {\n Object.defineProperty(self.intf.attributes, key, {\n get: function () {\n return self.attributes[key];\n },\n set: function (value) {\n self.attributes[key] = value;\n if (key === 'name') {\n self.tryLoadStoredSettings();\n }\n if (\n key === 'rowTree' ||\n key === 'columnTree' ||\n key === 'columnTreeRowEndIndex'\n ) {\n self.initCellTreeSettings();\n }\n self.draw(true);\n self.dispatchEvent('attributechanged', {\n name: key,\n value: value[key],\n });\n },\n });\n });\n self.filters.string = function (value, filterFor) {\n if (filterFor === self.attributes.blanksText) {\n return self.blankValues.includes(\n value == null ? value : String(value).trim(),\n );\n }\n\n value = String(value);\n var filterRegExp,\n regEnd = /\\/(i|g|m)*$/,\n pattern = regEnd.exec(filterFor),\n flags = pattern ? pattern[0].substring(1) : '',\n flagLength = flags.length;\n self.invalidFilterRegEx = undefined;\n if (filterFor.substring(0, 1) === '/' && pattern) {\n try {\n filterRegExp = new RegExp(\n filterFor.substring(1, filterFor.length - (flagLength + 1)),\n flags,\n );\n } catch (e) {\n self.invalidFilterRegEx = e;\n return;\n }\n return filterRegExp.test(value);\n }\n return value.toString\n ? value\n .toString()\n .toLocaleUpperCase()\n .indexOf(filterFor.toLocaleUpperCase()) !== -1\n : false;\n };\n self.filters.number = function (value, filterFor) {\n if (filterFor === self.attributes.blanksText) {\n return self.blankValues.includes(\n value == null ? value : String(value).trim(),\n );\n }\n\n if (!filterFor) {\n return true;\n }\n return value === filterFor;\n };\n ['formatters', 'filters', 'sorters'].forEach(self.initProp);\n self.applyComponentStyle(false, self.intf);\n self.reloadStoredValues();\n if (self.args.data) {\n self.intf.data = self.args.data;\n }\n if (self.intf.innerText || self.intf.textContent) {\n if (self.intf.dataType === 'application/x-canvas-datagrid') {\n self.intf.dataType = 'application/json+x-canvas-datagrid';\n }\n self.intf.data = self.intf.innerText || self.intf.textContent;\n }\n if (self.args.schema) {\n self.intf.schema = self.args.schema;\n }\n if (self.isChildGrid || !self.isComponent) {\n requestAnimationFrame(function () {\n self.resize(true);\n });\n } else {\n self.resize(true);\n }\n self.initialized = true;\n return self;\n };\n /**\n * Removes focus from the grid.\n * @memberof canvasDatagrid\n * @name blur\n * @method\n */\n self.intf.blur = function (e) {\n self.hasFocus = false;\n };\n /**\n * Focuses on the grid.\n * @memberof canvasDatagrid\n * @name focus\n * @method\n */\n self.intf.focus = function () {\n self.hasFocus = true;\n self.controlInput.focus();\n };\n if (self.shadowRoot || self.isChildGrid) {\n Object.defineProperty(self.intf, 'height', {\n get: function () {\n if (self.shadowRoot) {\n return self.shadowRoot.height;\n }\n return self.parentNode.height;\n },\n set: function (value) {\n if (self.shadowRoot) {\n self.shadowRoot.height = value;\n } else {\n self.parentNode.height = value;\n }\n self.resize(true);\n },\n });\n Object.defineProperty(self.intf, 'width', {\n get: function () {\n if (self.shadowRoot) {\n return self.shadowRoot.width;\n }\n return self.parentNode.width;\n },\n set: function (value) {\n if (self.shadowRoot) {\n self.shadowRoot.width = value;\n } else {\n self.parentNode.width = value;\n }\n self.resize(true);\n },\n });\n Object.defineProperty(self.intf, 'parentNode', {\n get: function () {\n return self.parentNode;\n },\n set: function (value) {\n if (!self.isChildGrid) {\n throw new TypeError(\n 'Cannot set property parentNode which has only a getter',\n );\n }\n self.parentNode = value;\n },\n });\n }\n Object.defineProperty(self.intf, 'visibleRowHeights', {\n get: function () {\n return self.visibleRowHeights;\n },\n });\n Object.defineProperty(self.intf, 'openChildren', {\n get: function () {\n return self.openChildren;\n },\n });\n Object.defineProperty(self.intf, 'childGrids', {\n get: function () {\n return Object.keys(self.childGrids).map(function (gridId) {\n return self.childGrids[gridId];\n });\n },\n });\n Object.defineProperty(self.intf, 'isChildGrid', {\n get: function () {\n return self.isChildGrid;\n },\n });\n Object.defineProperty(self, 'cursor', {\n get: function () {\n return self.parentNodeStyle.cursor;\n },\n set: function (value) {\n if (value === 'cell') {\n value = 'default';\n }\n if (self.currentCursor !== value) {\n self.parentNodeStyle.cursor = value;\n self.currentCursor = value;\n }\n },\n });\n Object.defineProperty(self.intf, 'orderDirection', {\n get: function () {\n return self.orderDirection;\n },\n set: function (value) {\n if (value !== 'desc') {\n value = 'asc';\n }\n self.orderDirection = value;\n self.order(self.orderBy, self.orderDirection);\n },\n });\n Object.defineProperty(self.intf, 'orderBy', {\n get: function () {\n return self.orderBy;\n },\n set: function (value) {\n if (\n self.getSchema().find(function (col) {\n return col.name === value;\n }) === undefined\n ) {\n throw new Error('Cannot sort by unknown column name.');\n }\n self.orderBy = value;\n self.order(self.orderBy, self.orderDirection);\n },\n });\n if (self.isComponent) {\n Object.defineProperty(self.intf, 'offsetHeight', {\n get: function () {\n return self.canvas.offsetHeight;\n },\n });\n Object.defineProperty(self.intf, 'offsetWidth', {\n get: function () {\n return self.canvas.offsetWidth;\n },\n });\n }\n Object.defineProperty(self.intf, 'scrollHeight', {\n get: function () {\n return self.scrollBox.scrollHeight;\n },\n });\n Object.defineProperty(self.intf, 'scrollWidth', {\n get: function () {\n return self.scrollBox.scrollWidth;\n },\n });\n Object.defineProperty(self.intf, 'scrollTop', {\n get: function () {\n return self.scrollBox.scrollTop;\n },\n set: function (value) {\n self.scrollBox.scrollTop = value;\n },\n });\n Object.defineProperty(self.intf, 'scrollLeft', {\n get: function () {\n return self.scrollBox.scrollLeft;\n },\n set: function (value) {\n self.scrollBox.scrollLeft = value;\n },\n });\n Object.defineProperty(self.intf, 'sizes', {\n get: function () {\n return self.sizes;\n },\n });\n Object.defineProperty(self.intf, 'parentDOMNode', {\n get: function () {\n return self.parentDOMNode;\n },\n });\n Object.defineProperty(self.intf, 'input', {\n get: function () {\n return self.input;\n },\n });\n Object.defineProperty(self.intf, 'controlInput', {\n get: function () {\n return self.controlInput;\n },\n });\n Object.defineProperty(self.intf, 'currentCell', {\n get: function () {\n return self.currentCell;\n },\n });\n Object.defineProperty(self.intf, 'visibleCells', {\n get: function () {\n return self.visibleCells;\n },\n });\n Object.defineProperty(self.intf, 'visibleRows', {\n get: function () {\n return self.visibleRows;\n },\n });\n 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\n /**\n * Return a tuple if the user selected contiguous columns, otherwise `null`.\n * Info: Because the user may reorder the columns,\n * the schemaIndex of the first item may be greater than the schemaIndex of the second item,\n * but the columnIndex of the firs item must less than the columnIndex of the second item.\n * @param {any[]} schema from `self.getSchema()`\n * @returns {any[]} column schemas tuple (each schema has an additional field `schemaIndex`)\n */\n function getSelectedContiguousColumns(ev, schema) {\n const memoKey = '__contiguousColumns';\n if (Array.isArray(ev[memoKey]) || ev[memoKey] === null) return ev[memoKey];\n ev[memoKey] = null;\n\n if (!Array.isArray(self.selections) || self.selections.length === 0) return;\n const selection = self.selections[0];\n if (!selection || selection.length === 0) return;\n for (let rowIndex = 0; rowIndex < self.viewData.length; rowIndex++) {\n const row = self.viewData[rowIndex];\n if (!row) continue;\n const compare = self.selections[rowIndex];\n if (!compare) return;\n if (compare.length !== selection.length) return;\n for (let i = 0; i < selection.length; i++)\n if (selection[i] !== compare[i]) return;\n }\n selection.sort((a, b) => a - b);\n\n /** @type {number[][]} */\n const ranges = [];\n let begin = selection[0];\n let end = selection[0];\n for (let i = 1; i < selection.length; i++) {\n const orderIndex = selection[i];\n if (orderIndex === end + 1) {\n end = orderIndex;\n continue;\n }\n ranges.push([begin, end]);\n begin = orderIndex;\n end = orderIndex;\n }\n ranges.push([begin, end]);\n\n const currentOrderIndex = ev.cell.columnIndex;\n const matchedRange = ranges.find(\n (range) =>\n currentOrderIndex >= range[0] &&\n currentOrderIndex <= range[1] &&\n range[0] !== range[1],\n );\n if (!matchedRange) return;\n\n /** @type {number[]} orders[index] => columnIndex */\n const orders = self.orders.columns;\n if (!Array.isArray(orders)) return;\n\n const matchedSchema = matchedRange.map((orderIndex) => {\n const schemaIndex = orders[orderIndex];\n const thisSchema = schema[schemaIndex];\n return Object.assign({}, thisSchema, { orderIndex });\n });\n if (matchedSchema.findIndex((it) => !it) >= 0) return;\n return (ev[memoKey] = matchedSchema);\n }\n /**\n * @param {boolean} [allowOnlyOneRow]\n * @returns {number[]} a rowIndex tuple. It can contains one row index or two row indexes.\n */\n function getSelectedContiguousRows(allowOnlyOneRow) {\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 if (ok) {\n if (range.length === 1) return allowOnlyOneRow ? range : null;\n return range;\n }\n }\n function addDefaultContextMenuItem(e) {\n const schema = self.getSchema();\n /**\n * A map between columnIndex and column data\n * @type {Map<string,any>}\n */\n let columns;\n const getColumnsMap = () => {\n if (!columns)\n columns = new Map(schema.map((_col) => [_col.columnIndex, _col]));\n return columns;\n };\n const isSorting =\n self.orderings.columns && self.orderings.columns.length > 0;\n\n const isNormalCell =\n !(\n e.cell.isBackground ||\n e.cell.isColumnHeaderCellCap ||\n e.cell.isScrollBar ||\n e.cell.isCorner ||\n e.cell.isRowHeader\n ) && e.cell.header;\n if (self.attributes.showFilter && isNormalCell) {\n createFilterContextMenuItems(e);\n }\n if (\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 const contiguousColumns = getSelectedContiguousColumns(e, schema);\n let title = '';\n if (contiguousColumns) {\n title = contiguousColumns\n .map((col) => col.title || col.name)\n .join('-');\n } else {\n const column = schema[columnIndex];\n if (column) title = column.title || column.name;\n }\n e.items.push({\n title: self.attributes.hideColumnText.replace(/%s/gi, title),\n click: function (ev) {\n ev.preventDefault();\n self.stopPropagation(ev);\n self.disposeContextMenu();\n if (contiguousColumns) {\n self.hideColumns(\n contiguousColumns[0].orderIndex,\n contiguousColumns[1].orderIndex,\n );\n } else {\n self.hideColumns(columnOrderIndex);\n }\n },\n });\n }\n }\n if (\n self.attributes.saveAppearance &&\n self.attributes.showClearSettingsOption &&\n (Object.keys(self.sizes.rows).length > 0 ||\n Object.keys(self.sizes.columns).length > 0)\n ) {\n e.items.push({\n title: self.attributes.clearSettingsOptionText,\n click: function (e) {\n e.preventDefault();\n self.sizes.rows = {};\n self.sizes.columns = {};\n self.createRowOrders();\n self.createColumnOrders();\n self.storedSettings = undefined;\n self.dispatchEvent('resizecolumn', {\n columnWidth: self.style.cellWidth,\n });\n self.dispatchEvent('resizerow', {\n cellHeight: self.style.cellHeight,\n });\n self.setStorageData();\n self.resize(true);\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n if (\n self.attributes.allowSorting &&\n self.attributes.showOrderByOption &&\n isNormalCell\n ) {\n e.items.push({\n title: self.attributes.showOrderByOptionTextAsc.replace(\n '%s',\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.order(e.cell.header.name, 'asc');\n self.controlInput.focus();\n },\n });\n e.items.push({\n title: self.attributes.showOrderByOptionTextDesc.replace(\n '%s',\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.order(e.cell.header.name, 'desc');\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n\n //#region hide rows\n const canHideRows = !isSorting && e.cell.isRowHeader && e.cell.header;\n if (canHideRows) {\n const range = getSelectedContiguousRows(true);\n if (range) {\n const boundRowIndexes = range.map((viewRowIndex) =>\n self.getBoundRowIndexFromViewRowIndex(viewRowIndex),\n );\n let title;\n if (boundRowIndexes.length === 1) {\n if (typeof boundRowIndexes[0] === 'number')\n title = boundRowIndexes[0] + 1;\n else title = range[0] + 1;\n\n title = self.attributes.showHideRow.replace('%s', title);\n // hide one row\n e.items.push({\n title,\n click: function (ev) {\n ev.preventDefault();\n self.hideRows(boundRowIndexes[0], boundRowIndexes[0]);\n },\n });\n } else if (boundRowIndexes[0] <= boundRowIndexes[1]) {\n title = boundRowIndexes\n .map((it, index) => {\n if (typeof it === 'number') return it + 1;\n return range[index] + 1;\n })\n .join('-');\n title = self.attributes.showHideRows.replace('%s', title);\n // hide rows\n e.items.push({\n title,\n click: function (ev) {\n ev.preventDefault();\n self.hideRows(boundRowIndexes[0], boundRowIndexes[1]);\n },\n });\n }\n }\n }\n //#endregion hide rows\n\n //#region group/ungroup columns\n const groupAreaHeight = self.getColumnGroupAreaHeight();\n const groupAreaWidth = self.getRowGroupAreaWidth();\n const setCollapseStateForAllGroups = (allGroups, collapsed) => {\n if (allGroups.length === 0) return;\n for (let i = 0; i < allGroups.length; i++) {\n const groups = allGroups[i];\n for (let j = 0; j < groups.length; j++) {\n const group = groups[j];\n group.collapsed = collapsed;\n }\n }\n self.refresh();\n };\n if (e.pos && e.pos.y < groupAreaHeight) {\n e.items.push({\n title: self.attributes.showRemoveAllGroupColumns,\n click: function (ev) {\n ev.preventDefault();\n self.groupedColumns = [];\n self.refresh();\n },\n });\n e.items.push({\n title: self.attributes.showExpandAllGroupColumns,\n click: function (ev) {\n ev.preventDefault();\n setCollapseStateForAllGroups(self.groupedColumns, false);\n },\n });\n e.items.push({\n title: self.attributes.showCollapseAllGroupColumns,\n click: function (ev) {\n ev.preventDefault();\n setCollapseStateForAllGroups(self.groupedColumns, true);\n },\n });\n }\n if (e.pos && e.pos.x < groupAreaWidth) {\n e.items.push({\n title: self.attributes.showRemoveAllGroupRows,\n click: function (ev) {\n ev.preventDefault();\n self.groupedRows = [];\n self.refresh();\n },\n });\n e.items.push({\n title: self.attributes.showExpandAllGroupRows,\n click: function (ev) {\n ev.preventDefault();\n setCollapseStateForAllGroups(self.groupedRows, false);\n },\n });\n e.items.push({\n title: self.attributes.showCollapseAllGroupRows,\n click: function (ev) {\n ev.preventDefault();\n setCollapseStateForAllGroups(self.groupedRows, true);\n },\n });\n }\n\n const canGroupByColumns =\n self.attributes.allowGroupingColumns &&\n e.cell.isColumnHeader &&\n e.cell.header &&\n e.cell.header.index > 0;\n const canUngroupColumns =\n self.attributes.allowGroupingColumns && e.cell.isColumnHeader;\n const canGroupByRows =\n !isSorting &&\n self.attributes.allowGroupingRows &&\n e.cell.isRowHeader &&\n e.cell.header;\n const canUngroupRows =\n self.attributes.allowGroupingRows && e.cell.isRowHeader;\n\n if (canGroupByColumns) {\n /** @type {number[]} */\n const groupIndexes = [];\n /** @type {number} */\n const headerIndex = e.cell.header.index;\n let col = headerIndex;\n for (; col >= 0; col--) {\n if (!self.isColumnSelected(col)) break;\n groupIndexes[0] = col;\n }\n for (col = headerIndex; ; col++) {\n if (!self.isColumnSelected(col)) break;\n groupIndexes[1] = col;\n }\n if (\n col !== headerIndex &&\n groupIndexes.length === 2 &&\n groupIndexes[1] > groupIndexes[0] &&\n self.isNewGroupRangeValid(\n self.groupedColumns,\n groupIndexes[0],\n groupIndexes[1],\n )\n ) {\n const columns = getColumnsMap();\n const groupTitles = [];\n const groupNames = [];\n for (let i = 0; i < groupIndexes.length; i++) {\n const columnIndex = groupIndexes[i];\n const column = columns.get(columnIndex);\n if (column) {\n groupNames.push(column.name);\n groupTitles.push(column.title || column.name || column.index);\n }\n }\n if (groupNames[0] && groupNames[1]) {\n // show group options\n e.items.push({\n title: self.attributes.showGroupColumns.replace(\n '%s',\n groupTitles[0] + '-' + groupTitles[1],\n ),\n click: function (ev) {\n ev.preventDefault();\n self.groupColumns(groupNames[0], groupNames[1]);\n self.controlInput.focus();\n },\n });\n }\n }\n }\n if (canUngroupColumns) {\n const columnIndex = e.cell.columnIndex;\n const groups = self.getGroupsColumnBelongsTo(columnIndex);\n const columns = getColumnsMap();\n for (let i = 0; i < groups.length; i++) {\n const { from, to } = groups[i];\n const cell0 = columns.get(from);\n const cell1 = columns.get(to);\n if (cell0 && cell1) {\n const formatArgs =\n (cell0.title || cell0.name || cell0.index) +\n '-' +\n (cell1.title || cell1.name || cell1.index);\n e.items.push({\n title: self.attributes.showRemoveGroupColumns.replace(\n '%s',\n formatArgs,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.removeGroupColumns(cell0.name, cell1.name);\n self.controlInput.focus();\n },\n });\n } else {\n console.warn(`Cannot find column ${from} or column ${to}`);\n }\n }\n }\n if (canGroupByRows) {\n const range = getSelectedContiguousRows(false) || [];\n const rangeTitle = range\n .map((rowIndex) => {\n const index = self.getBoundRowIndexFromViewRowIndex(rowIndex);\n if (typeof index === 'number') return index + 1;\n return rowIndex + 1;\n })\n .join('-');\n if (\n range.length === 2 &&\n self.isNewGroupRangeValid(self.groupedRows, range[0], range[1])\n ) {\n e.items.push({\n title: self.attributes.showGroupRows.replace('%s', rangeTitle),\n click: function (ev) {\n ev.preventDefault();\n self.groupRows(range[0], range[1]);\n },\n });\n }\n }\n if (canUngroupRows) {\n const rowIndex = e.cell.rowIndex;\n const groups = self.getGroupsRowBelongsTo(rowIndex);\n for (let i = 0; i < groups.length; i++) {\n const { from, to } = groups[i];\n const rangeTitle = [from, to]\n .map((rowIndex) => {\n const index = self.getBoundRowIndexFromViewRowIndex(rowIndex);\n if (typeof index === 'number') return index + 1;\n return rowIndex + 1;\n })\n .join('-');\n e.items.push({\n title: self.attributes.showRemoveGroupRows.replace('%s', rangeTitle),\n click: function (ev) {\n ev.preventDefault();\n self.removeGroupRows(from, to);\n self.controlInput.focus();\n },\n });\n }\n }\n //#endregion group/ungroup columns\n }\n self.disposeAutocomplete = function () {\n if (autoCompleteContext) {\n autoCompleteContext.dispose();\n autoCompleteContext = undefined;\n }\n };\n self.disposeContextMenu = function (event) {\n document.removeEventListener('click', self.disposeContextMenu);\n zIndexTop = self.style.contextMenuZIndex;\n self.disposeAutocomplete();\n if (self.contextMenu) {\n self.contextMenu.dispose();\n }\n self.contextMenu = undefined;\n if (event) {\n self.canvas.focus();\n self.mousedown(event);\n self.mouseup(event);\n }\n };\n self.contextmenuEvent = function (e, overridePos) {\n if (!self.hasFocus && e.target !== self.canvas) {\n return;\n }\n // don't create context menu for parents if current position is located in child grid\n const children = Object.keys(self.childGrids);\n for (let i = 0; i < children.length; i++) {\n const childGrid = self.childGrids[children[i]];\n const parentNode = childGrid && childGrid.parentNode;\n if (!parentNode) continue;\n const { offsetLeft, offsetWidth, offsetTop, offsetHeight } = parentNode;\n if ((e.x >= offsetLeft && e.x <= offsetLeft + offsetWidth) === false)\n continue;\n if ((e.y >= offsetTop && e.y <= offsetTop + offsetHeight) === false)\n continue;\n return; // in child grid\n }\n // don't create context menu for child if current position is located in parent grid\n if (self.isChildGrid && self.parentNode) {\n //#region check is current child grid closed\n const childGridsOfParent = self.parentGrid && self.parentGrid.childGrids;\n if (!childGridsOfParent || !Array.isArray(childGridsOfParent)) return;\n const matchedMe = childGridsOfParent.find((grid) => {\n const nodeA = grid.parentNode;\n const nodeB = self.parentNode;\n return (\n nodeA.offsetTop == nodeB.offsetTop &&\n nodeA.offsetLeft === nodeB.offsetLeft\n );\n });\n if (!matchedMe) return;\n //#endregion\n\n let x0 = self.parentNode.offsetLeft;\n let x1 = self.parentNode.offsetLeft + self.parentNode.offsetWidth;\n let y0 = self.parentNode.offsetTop;\n let y1 = self.parentNode.offsetTop + self.parentNode.offsetHeight;\n let node = self.parentNode.parentNode;\n while (node) {\n const { offsetLeft, offsetWidth, offsetTop, offsetHeight } = node;\n if (offsetLeft > x0) x0 = offsetLeft;\n if (offsetTop > y0) y0 = offsetTop;\n const newX1 = offsetLeft + offsetWidth;\n const newY1 = offsetTop + offsetHeight;\n if (newX1 < x1) x1 = newX1;\n if (newY1 < y1) y1 = newY1;\n if (node.nodeType !== 'canvas-datagrid-tree') break;\n node = node.parentNode;\n }\n if ((e.x >= x0 && e.x <= x1 && e.y >= y0 && e.y <= y1) === false) return;\n }\n function createDisposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('click', self.disposeContextMenu);\n 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","'use strict';\n\n/**\n * Merge a new hidden row range into existed ranges array\n * @param {any[]} hiddenRowRanges tuples: Array<[bgeinRowIndex, endRowIndex]>\n * @param {number[]} newRange tuple: [beginRowIndex, endRowIndex]\n * @returns {boolean}\n */\nconst mergeHiddenRowRanges = function (hiddenRowRanges, newRange) {\n const [beginRowIndex, endRowIndex] = newRange;\n if (endRowIndex < beginRowIndex) return false;\n let inserted = false;\n for (let i = 0; i < hiddenRowRanges.length; i++) {\n const range = hiddenRowRanges[i];\n if (beginRowIndex > range[1] + 1) continue;\n if (beginRowIndex <= range[0] && endRowIndex >= range[0]) {\n hiddenRowRanges[i] = [beginRowIndex, Math.max(endRowIndex, range[1])];\n inserted = true;\n break;\n }\n if (beginRowIndex >= range[0]) {\n hiddenRowRanges[i] = [range[0], Math.max(endRowIndex, range[1])];\n inserted = true;\n break;\n }\n }\n if (!inserted) hiddenRowRanges.push([beginRowIndex, endRowIndex]);\n // merge intersections after sorting ranges\n hiddenRowRanges.sort((a, b) => a[0] - b[0]);\n for (let i = 0; i < hiddenRowRanges.length - 1; i++) {\n const range = hiddenRowRanges[i];\n const nextRange = hiddenRowRanges[i + 1];\n if (nextRange[0] <= range[1] + 1) {\n hiddenRowRanges[i] = [range[0], Math.max(range[1], nextRange[1])];\n hiddenRowRanges.splice(i + 1, 1);\n i--;\n }\n }\n return true;\n};\n\nexport { mergeHiddenRowRanges };\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport { mergeHiddenRowRanges } from './groups/util';\n\nexport default function (self) {\n /**\n * Converts a integer into a letter A - ZZZZZ...\n * @memberof canvasDatagrid\n * @name integerToAlpha\n * @method\n * @param {column} n The number to convert.\n */\n self.integerToAlpha = function (n) {\n var ordA = 'a'.charCodeAt(0),\n ordZ = 'z'.charCodeAt(0),\n len = ordZ - ordA + 1,\n s = '';\n while (n >= 0) {\n s = String.fromCharCode((n % len) + ordA) + s;\n n = Math.floor(n / len) - 1;\n }\n return s;\n };\n /**\n * Inserts a new column before the specified index into the schema.\n * @tutorial schema\n * @memberof canvasDatagrid\n * @name insertColumn\n * @method\n * @param {column} c The column to insert into the schema.\n * @param {number} index The index of the column to insert before.\n */\n self.insertColumn = function (c, index) {\n var s = self.getSchema();\n if (s.length < index) {\n throw new Error('Index is beyond the length of the schema.');\n }\n self.validateColumn(c, s);\n s.splice(index, 0, c);\n\n self.originalData.forEach(function (row, rowIndex) {\n self.applyDefaultValue(row, c, rowIndex);\n });\n self.intf.schema = s;\n\n self.refresh();\n };\n /**\n * Deletes a column from the schema at the specified index.\n * @memberof canvasDatagrid\n * @name deleteColumn\n * @tutorial schema\n * @method\n * @param {number} index The index of the column to delete.\n */\n self.deleteColumn = function (index) {\n var schema = self.getSchema();\n\n // remove data matching this column name from data\n self.originalData.forEach(function (row) {\n delete row[schema[index].name];\n });\n\n schema.splice(index, 1);\n self.intf.schema = schema;\n\n self.refresh();\n };\n /**\n * Adds a new column into the schema.\n * @tutorial schema\n * @memberof canvasDatagrid\n * @name addColumn\n * @method\n * @param {column} c The column to add to the schema.\n */\n self.addColumn = function (c) {\n var s = self.getSchema();\n self.validateColumn(c, s);\n s.push(c);\n self.originalData.forEach(function (row, rowIndex) {\n self.applyDefaultValue(row, c, rowIndex);\n });\n self.intf.schema = s;\n\n self.refresh();\n };\n /**\n * Deletes a row from the dataset at the specified index.\n * @memberof canvasDatagrid\n * @name deleteRow\n * @method\n * @param {number} index The index of the row to delete.\n */\n self.deleteRow = function (index) {\n self.originalData.splice(index, 1);\n self.setFilter();\n self.resize(true);\n };\n /**\n * Inserts a new row into the dataset before the specified index.\n * @memberof canvasDatagrid\n * @name insertRow\n * @method\n * @param {object} d data.\n * @param {number} index The index of the row to insert before.\n */\n self.insertRow = function (d, index) {\n if (self.originalData.length < index) {\n throw new Error('Index is beyond the length of the dataset.');\n }\n self.originalData.splice(index, 0, d);\n self.getSchema().forEach(function (c) {\n if (d[c.name] === undefined) {\n self.applyDefaultValue(self.originalData[index], c, index);\n }\n });\n\n // setFilter calls .refresh(), so we need not call it again:\n self.setFilter();\n\n self.resize(true);\n };\n /**\n * Adds a new row into the dataset.\n * @memberof canvasDatagrid\n * @name addRow\n * @method\n * @param {object} d data.\n */\n self.addRow = function (d) {\n self.originalData.push(d);\n self.getSchema().forEach(function (c) {\n if (d[c.name] === undefined) {\n self.applyDefaultValue(\n self.originalData[self.originalData.length - 1],\n c,\n self.originalData.length - 1,\n );\n }\n });\n\n // setFilter calls .refresh(), so we need not call it again:\n self.setFilter();\n\n self.resize(true);\n };\n /**\n * Sets the height of a given row by index number.\n * @memberof canvasDatagrid\n * @name setRowHeight\n * @method\n * @param {number} rowIndex The index of the row to set.\n * @param {number} height Height to set the row to.\n */\n self.setRowHeight = function (rowIndex, height) {\n self.sizes.rows[rowIndex] = height;\n self.draw(true);\n };\n /**\n * Sets the width of a given column by index number.\n * @memberof canvasDatagrid\n * @name setColumnWidth\n * @method\n * @param {number} colIndex The index of the column to set.\n * @param {number} width Width to set the column to.\n */\n self.setColumnWidth = function (colIndex, width) {\n self.sizes.columns[colIndex] = width;\n self.draw(true);\n };\n /**\n * Removes any changes to the width of the columns due to user or api interaction, setting them back to the schema or style default.\n * @memberof canvasDatagrid\n * @name resetColumnWidths\n * @tutorial schema\n * @method\n */\n self.resetColumnWidths = function () {\n self.sizes.columns = {};\n self.draw(true);\n };\n /**\n * Removes any changes to the height of the rows due to user or api interaction, setting them back to the schema or style default.\n * @memberof canvasDatagrid\n * @name resetRowHeights\n * @tutorial schema\n * @method\n */\n self.resetRowHeights = function () {\n self.sizes.rows = {};\n self.draw(true);\n };\n /**\n * Sets the value of the filter.\n * @memberof canvasDatagrid\n * @name setFilter\n * @method\n * @param {string} column Name of the column to filter.\n * @param {string} value The value to filter for.\n */\n self.setFilter = function (column, value) {\n if (column === undefined && value === undefined) {\n self.columnFilters = {};\n } else if (column && (value === '' || value === undefined)) {\n delete self.columnFilters[column];\n } else {\n self.columnFilters[column] = value;\n if (self.attributes.showFilterInCell) {\n self.filterable.rows.push(0);\n self.orders.columns.forEach(function (value, index) {\n self.filterable.columns.push(index);\n });\n }\n }\n if (!Object.keys(self.columnFilters).length) {\n self.filterable = {\n rows: [],\n columns: [],\n };\n }\n self.refresh();\n };\n /**\n * Returns the number of pixels to scroll down to line up with row rowIndex.\n * @memberof canvasDatagrid\n * @name findRowScrollTop\n * @method\n * @param {number} rowIndex The row index of the row to scroll find.\n */\n self.findRowScrollTop = function (rowIndex) {\n if (self.scrollCache.y[rowIndex] === undefined) {\n throw new RangeError(\n `Row index ${rowIndex} out of range: ${self.scrollCache.y.length}.`,\n );\n }\n return self.scrollCache.y[rowIndex];\n };\n /**\n * Returns the number of pixels to scroll to the left to line up with column columnIndex.\n * @memberof canvasDatagrid\n * @name findColumnScrollLeft\n * @method\n * @param {number} columnIndex The column index of the column to find.\n */\n self.findColumnScrollLeft = function (columnIndex) {\n var i = Math.max(columnIndex - 1, 0);\n if (self.scrollCache.x[i] === undefined) {\n throw new Error('Column index out of range.');\n }\n return (\n self.scrollCache.x[i] -\n self.getColumnWidth(self.orders.columns[columnIndex])\n );\n };\n /**\n * Scrolls to the cell at columnIndex x, and rowIndex y. If you define both rowIndex and columnIndex additional calculations can be made to center the cell using the target cell's height and width. Defining only one rowIndex or only columnIndex will result in simpler calculations.\n * @memberof canvasDatagrid\n * @name gotoCell\n * @method\n * @param {number} x The column index of the cell to scroll to.\n * @param {number} y The row index of the cell to scroll to.\n * @param {number} [offsetX=0] Percentage offset the cell should be from the left edge (not including headers). The default is 0, meaning the cell will appear at the left edge. Valid values are 0 through 1. 1 = Left, 0 = Right, 0.5 = Center.\n * @param {number} [offsetY=0] Percentage offset the cell should be from the top edge (not including headers). The default is 0, meaning the cell will appear at the top edge. Valid values are 0 through 1. 1 = Bottom, 0 = Top, 0.5 = Center.\n */\n self.gotoCell = function (x, y, offsetX, offsetY) {\n var targetX = x === undefined ? undefined : self.findColumnScrollLeft(x),\n targetY = y === undefined ? undefined : self.findRowScrollTop(y),\n cell,\n sbw =\n self.scrollBox.width -\n (self.scrollBox.verticalBarVisible ? self.style.scrollBarWidth : 0),\n sbh =\n self.scrollBox.height -\n (self.scrollBox.horizontalBarVisible ? self.style.scrollBarWidth : 0);\n offsetX = offsetX === undefined ? 0 : offsetX;\n offsetY = offsetY === undefined ? 0 : offsetY;\n targetX -= sbw * offsetX;\n targetY -= sbh * offsetY;\n if (x !== undefined && y !== undefined) {\n self.scrollBox.scrollTo(targetX, targetY);\n requestAnimationFrame(function () {\n cell = self.getVisibleCellByIndex(x, y);\n // HACK: just don't offset if the target cell cannot be seen\n // TODO: offset does not work on very small grids, not sure why\n if (!cell) {\n return;\n }\n targetX += cell.width * offsetX;\n targetY += cell.height * offsetY;\n self.scrollBox.scrollTo(targetX, targetY);\n });\n } else if (x !== undefined) {\n self.scrollBox.scrollLeft = targetX;\n } else if (y !== undefined) {\n self.scrollBox.scrollTop = targetY;\n }\n };\n /**\n * Scrolls the row y.\n * @memberof canvasDatagrid\n * @name gotoRow\n * @method\n * @param {number} y The row index of the cell to scroll to.\n */\n self.gotoRow = function (y) {\n self.gotoCell(0, y);\n };\n /**\n * Add a button into the cell.\n * @memberof canvasDatagrid\n * @name addButton\n * @method\n * @param {number} columnIndex The column index of the cell to to add a button.\n * @param {number} rowIndex The row index of the cell to to add a button.\n * @param {object} offset Offset how far go away from cell.\n * @param {object} items a list of items to add into button menu.\n * @param {string} imgSrc icon path to add into button.\n */\n self.addButton = function (columnIndex, rowIndex, offset, items, imgSrc) {\n var cells = self.visibleCells.filter(function (c) {\n return c.sortColumnIndex === columnIndex && c.sortRowIndex === rowIndex;\n });\n\n self.attachButton(\n {\n top: cells[0].y + cells[0].height + offset.y,\n left: cells[0].x + cells[0].width + offset.x,\n },\n items,\n imgSrc,\n );\n };\n\n /**\n * Expand/Collapse CellTree.\n * @memberof canvasDatagrid\n * @name toggleCellCollapseTree\n * @method\n * @param {array} treeData The array of cellTree to expand or collapse.\n */\n\n self.toggleCellCollapseTree = function (treeData) {\n for (let type in treeData) {\n for (let t of treeData[type])\n if (t.length > 0) self.toggleCollapseTree(t[0], t[1], type);\n }\n self.draw();\n };\n\n /**\n * Expand/Collapse CellTree.\n * @memberof canvasDatagrid\n * @name expandCollapseCellTree\n * @method\n * @param {array} treeData The array of cellTree to expand or collapse.\n */\n\n self.expandCollapseCellTree = function (treeData) {\n for (let type in treeData) {\n for (let t of treeData[type])\n if (t.length > 0) self.cellTreeExpandCollapse(t[0], t[1], type);\n }\n self.draw();\n };\n\n /**\n * Scrolls the cell at cell x, row y into view if it is not already.\n * @memberof canvasDatagrid\n * @name scrollIntoView\n * @method\n * @param {number} x The column index of the cell to scroll into view.\n * @param {number} y The row index of the cell to scroll into view.\n * @param {number} [offsetX=0] Percentage offset the cell should be from the left edge (not including headers). The default is 0, meaning the cell will appear at the left edge. Valid values are 0 through 1. 1 = Left, 0 = Right, 0.5 = Center.\n * @param {number} [offsetY=0] Percentage offset the cell should be from the top edge (not including headers). The default is 0, meaning the cell will appear at the top edge. Valid values are 0 through 1. 1 = Bottom, 0 = Top, 0.5 = Center.\n */\n self.scrollIntoView = function (x, y, offsetX, offsetY) {\n const matched = self.visibleCells.filter(function (cell) {\n return (\n (cell.rowIndex === y || y === undefined) &&\n (cell.columnIndex === x || x === undefined) &&\n cell.x > 0 &&\n cell.y > 0 &&\n cell.x + cell.width < self.width &&\n cell.y + cell.height < self.height\n );\n });\n if (matched.length === 1 && x !== undefined && y !== undefined) {\n // goto specific cell and its part be hidden by header\n if (\n matched[0].x < self.getRowHeaderCellWidth() ||\n matched[0].y < self.getColumnHeaderCellHeight()\n )\n matched.length = 0;\n }\n if (matched.length === 0) {\n self.gotoCell(x, y, offsetX, offsetY);\n }\n };\n /**\n * Sets the active cell. Requires redrawing.\n * @memberof canvasDatagrid\n * @name setActiveCell\n * @method\n * @param {number} x The column index of the cell to set active.\n * @param {number} y The row index of the cell to set active.\n */\n self.setActiveCell = function (x, y) {\n if (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 * Hide column/columns\n * @memberof canvasDatagrid\n * @name hideColumns\n * @param {number} beginColumnOrderIndex\n * @param {number} [endColumnOrderIndex]\n */\n self.hideColumns = function (beginColumnOrderIndex, endColumnOrderIndex) {\n const schema = self.getSchema();\n const orders = self.orders.columns;\n let count = 0;\n if (typeof endColumnOrderIndex !== 'number')\n endColumnOrderIndex = beginColumnOrderIndex;\n for (\n let orderIndex = beginColumnOrderIndex;\n orderIndex <= endColumnOrderIndex;\n orderIndex++\n ) {\n const columnIndex = orders[orderIndex];\n if (columnIndex >= 0 && !schema[columnIndex].hidden) {\n count++;\n schema[columnIndex].hidden = true;\n }\n }\n if (count > 0) {\n self.setStorageData();\n setTimeout(function () {\n self.resize(true);\n }, 10);\n }\n };\n /**\n * Hide rows\n * @memberof canvasDatagrid\n * @name hideRows\n * @param {number} beginRowIndex\n * @param {number} endRowIndex\n */\n self.hideRows = function (beginRowIndex, endRowIndex) {\n if (\n mergeHiddenRowRanges(self.hiddenRowRanges, [beginRowIndex, endRowIndex])\n )\n self.refresh();\n };\n /**\n * Unhide rows\n * @memberof canvasDatagrid\n * @name unhideRows\n * @param {number} beginRowIndex\n * @param {number} endRowIndex\n */\n self.unhideRows = function (beginRowIndex, endRowIndex) {\n self.hiddenRowRanges = self.hiddenRowRanges.filter(\n (range) => range[0] !== beginRowIndex || range[1] !== endRowIndex,\n );\n self.refresh();\n };\n /**\n * Resizes a column to fit the longest value in the column. Call without a value to resize all columns.\n * Warning, can be slow on very large record sets (1m records ~3-5 seconds on an i7).\n * @memberof canvasDatagrid\n * @name fitColumnToValues\n * @method\n * @param {string} name The name of the column to resize.\n */\n self.fitColumnToValues = function (name, internal) {\n if (!self.canvas) {\n return;\n }\n\n const columnIndex =\n name === 'cornerCell' ? -1 : self.getHeaderByName(name).index;\n\n const newSize = Math.max(\n self.findColumnMaxTextLength(name),\n self.style.minColumnWidth,\n );\n\n self.sizes.columns[columnIndex] = newSize;\n\n self.dispatchEvent('resizecolumn', {\n x: newSize,\n y: self.resizingStartingHeight,\n draggingItem: self.currentCell,\n });\n\n if (!internal) {\n self.resize();\n self.draw(true);\n }\n };\n /**\n * Checks if a cell is currently visible.\n * @memberof canvasDatagrid\n * @name isCellVisible\n * @overload\n * @method\n * @returns {boolean} when true, the cell is visible, when false the cell is not currently drawn.\n * @param {number} columnIndex The column index of the cell to check.\n * @param {number} rowIndex The row index of the cell to check.\n */\n self.isCellVisible = function (cell, rowIndex) {\n // overload\n if (rowIndex !== undefined) {\n return (\n self.visibleCells.filter(function (c) {\n return c.columnIndex === cell && c.rowIndex === rowIndex;\n }).length > 0\n );\n }\n var x,\n l = self.visibleCells.length;\n for (x = 0; x < l; x += 1) {\n if (\n cell.x === self.visibleCells[x].x &&\n cell.y === self.visibleCells[x].y\n ) {\n return true;\n }\n }\n return false;\n };\n /**\n * Sets the order of the data.\n * @memberof canvasDatagrid\n * @name order\n * @method\n * @param {number} columnName Name of the column to be sorted.\n * @param {string} direction `asc` for ascending or `desc` for descending.\n * @param {function} [sortFunction] When defined, override the default sorting method defined in the column's schema and use this one.\n * @param {bool} [dontSetStorageData] Don't store this setting for future use.\n */\n self.order = function (\n columnName,\n direction,\n sortFunction,\n dontSetStorageData,\n ) {\n 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 an unhide indicator at grid pixel coordinate x and y.\n * @memberof canvasDatagrid\n * @name getUnhideIndicator\n * @method\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getUnhideIndicator = function (x, y) {\n const indicators = self.visibleUnhideIndicators;\n if (indicators.length <= 0) return;\n for (let i = 0; i < indicators.length; i++) {\n const indicator = indicators[i];\n if (\n x >= indicator.x &&\n y >= indicator.y &&\n x <= indicator.x2 &&\n y <= indicator.y2\n )\n return indicator;\n }\n };\n /**\n * Get a column group at grid pixel coordinate x and y.\n * @memberof canvasDatagrid\n * @name getColumnGroupAt\n * @method\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getColumnGroupAt = function (x, y) {\n const groups = self.groupedColumns.length;\n if (groups <= 0) return;\n const yZero = self.getColumnGroupAreaHeight();\n if (y >= yZero) return;\n for (let i = 0; i < self.visibleGroups.length; i++) {\n const g = self.visibleGroups[i];\n if (g.type !== 'c') continue;\n if (x >= g.x && y >= g.y && x <= g.x2 && y <= g.y2) return g;\n }\n };\n /**\n * Get a row group at grid pixel coordinate x and y.\n * @memberof canvasDatagrid\n * @name getRowGroupAt\n * @method\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getRowGroupAt = function (x, y) {\n const groups = self.groupedRows.length;\n if (groups <= 0) return;\n const xZero = self.getRowGroupAreaWidth();\n if (x >= xZero) return;\n for (let i = 0; i < self.visibleGroups.length; i++) {\n const g = self.visibleGroups[i];\n if (g.type !== 'r') continue;\n if (x >= g.x && y >= g.y && x <= g.x2 && y <= g.y2) return g;\n }\n };\n /**\n * Gets the cell at grid pixel coordinate x and y. Author's note. This function ties drawing and events together. This is a very complex function and is core to the component.\n * @memberof canvasDatagrid\n * @name getCellAt\n * @method\n * @returns {cell} cell at the selected location.\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getCellAt = function (x, y, useTouchScrollZones) {\n function getBorder(entitiy) {\n if (\n entitiy.x + entitiy.width - self.attributes.borderResizeZone * 0.4 <\n x &&\n entitiy.x + entitiy.width + self.attributes.borderResizeZone * 0.6 > x\n ) {\n return 'r';\n }\n if (\n entitiy.x - self.attributes.borderResizeZone * 0.4 < x &&\n entitiy.x + self.attributes.borderResizeZone * 0.6 > x\n ) {\n return 'l';\n }\n if (\n entitiy.y + entitiy.height - self.attributes.borderResizeZone * 0.4 <\n y &&\n entitiy.y + entitiy.height + self.attributes.borderResizeZone * 0.6 > y\n ) {\n return 'b';\n }\n if (\n entitiy.y - self.attributes.borderResizeZone * 0.4 < y &&\n entitiy.y + self.attributes.borderResizeZone * 0.6 > y\n ) {\n return 't';\n }\n }\n if (!self.visibleCells) {\n return;\n }\n x -= self.getRowGroupAreaWidth();\n y -= self.getColumnGroupAreaHeight();\n 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.columnHeaderCellPaddingRight +\n self.style.columnHeaderCellPaddingLeft +\n self.style.cellAutoResizePadding;\n m = t > m ? t : m;\n formatter = self.formatters[col.type];\n });\n self.viewData.forEach(function (row) {\n var text = row[name];\n if (formatter) {\n text = formatter({ cell: { value: text } });\n }\n self.ctx.font = self.style.cellFont;\n var t =\n self.ctx.measureText(text).width +\n self.style.cellPaddingRight +\n self.style.cellPaddingLeft +\n self.style.cellAutoResizePadding;\n m = t > m ? t : m;\n });\n return m;\n };\n /**\n * Gets the total width of all header columns.\n * @memberof canvasDatagrid\n * @name getHeaderWidth\n * @method\n */\n self.getHeaderWidth = function () {\n return self.getVisibleSchema().reduce(function (total, header) {\n return total + parseInt(header.width || self.style.cellWidth, 10);\n }, 0);\n };\n /**\n * Gets the height of a row by index.\n * @memberof canvasDatagrid\n * @name getRowHeight\n * @method\n * @param {number} rowIndex The row index to lookup.\n */\n self.getRowHeight = function (rowIndex) {\n return (self.sizes.rows[rowIndex] || self.style.cellHeight) * self.scale;\n };\n /**\n * Gets the width of a column by index.\n * @memberof canvasDatagrid\n * @name getColumnWidth\n * @method\n * @param {number} columnIndex The column index to lookup.\n */\n self.getColumnWidth = function (columnIndex) {\n return (\n (self.sizes.columns[columnIndex] ||\n self.getSchema()[columnIndex].width ||\n self.style.cellWidth) * self.scale\n );\n };\n self.formatters.string = function cellFormatterString(e) {\n return e.cell.value !== undefined ? e.cell.value : '';\n };\n self.formatters.rowHeaderCell = self.formatters.string;\n self.formatters.headerCell = self.formatters.string;\n self.formatters.number = self.formatters.string;\n self.formatters.int = self.formatters.string;\n self.formatters.html = self.formatters.string;\n self.sorters.string = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n const aValue = a[columnName] || '';\n const bValue = b[columnName] || '';\n if (asc) {\n if (!aValue.localeCompare) {\n return 1;\n }\n return aValue.localeCompare(bValue);\n }\n if (!bValue.localeCompare) {\n return 1;\n }\n return bValue.localeCompare(aValue);\n };\n };\n self.sorters.number = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n if (asc) {\n return a[columnName] - b[columnName];\n }\n return b[columnName] - a[columnName];\n };\n };\n self.sorters.date = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n if (asc) {\n return (\n new Date(a[columnName]).getTime() - new Date(b[columnName]).getTime()\n );\n }\n return (\n new Date(b[columnName]).getTime() - new Date(a[columnName]).getTime()\n );\n };\n };\n}\n","/*jslint browser: true, unparam: true, todo: true, evil: true*/\n/*globals Reflect: false, HTMLElement: true, define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport component from './component';\nimport defaults from './defaults';\nimport draw from './draw';\nimport events from './events';\nimport touch from './touch';\nimport intf from './intf';\nimport 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","drawLines","coords","fill","beginPath","moveTo","lineTo","stroke","drawGroupHandle","collapsed","fillRect","strokeRect","cx","cy","drawUnhideIndicator","size","dir","active","x0","y0","borderCoords","minPadding","maxPadding","longEdge","median","halfLongEdge","strokeStyle","unhideIndicatorBorderColor","lineWidth","fillStyle","unhideIndicatorBackgroundColor","offset","unhideIndicatorColor","drawCellTreeIcon","tree","rowTree","parentCount","iconSize","cellTreeIconWidth","scale","marginTop","cellTreeIconMarginTop","marginRight","cellTreeIconMarginRight","marginLeft","cellTreeIconMarginLeft","paddingLeft","icon","oldFillStyle","oldStrokeStyle","hovered","hovers","onCellTreeIcon","cellTreeIconHoverFillColor","cellTreeIconFillColor","cellTreeIconBorderColor","rect","expand","cellTreeIconLineWidth","cellTreeIconLineColor","radiusRect","w","h","radius","r","b","quadraticCurveTo","fillText","text","clipFrozenArea","mode","lastFrozenColumnPixel","lastFrozenRowPixel","clip","fillHandle","selectionHandleType","arc","PI","fillCircle","strokeHandle","strokeCircle","addBorderLine","c","pos","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","currentRowIndexOffset","rowIndexOffsetByHiddenRows","hiddenRowRanges","map","range","plus","sort","a","performance","now","visibleRowHeights","orders","rows","createRowOrders","save","visibleRows","visibleCells","visibleGroups","visibleUnhideIndicators","offsetTop","offsetLeft","firstRowIndexOffset","shift","initDraw","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","toFixed","perfDelta","htmlImages","startScale","scaleDelta","zoomDeltaStart","touchLength","touches","touchPosition","touchPosition1","scrollIndex","scrollPixel","canvasOffset","touchDelta","touchAnimateTo","scrollAnimation","touchPPS","xPPS","yPPS","touchPPST","xPPST","yPPST","touchDuration","pointerLockPosition","mouse","touch","touchStart","hasFocus","dragContext","textAlign","debugBackgroundColor","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","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","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","beginRowIndex","endRowIndex","barHeight","rowHeaderCellRowNumberGapHeight","barColor","rowHeaderCellRowNumberGapColor","showUnhideColumnsIndicator","orderIndex0","orderIndex1","unhideIndicator","unhideIndicatorSize","cellX","isActive","orderIndex","isHiddenColumn","drawIndicator","iconsWidth","lineX0","lineX1","orderIndexPtr","prevColumnIndex","nextColumnIndex","showUnhideRowsIndicator","cellY","topIndicators","bottomIndicators","it","matched","indicatorY","treeHeight","rowSansTreeHeight","trees","scrollIndexRight","scrollPixelRight","module","exports","defineProperty","enumerable","get","Symbol","toStringTag","__esModule","create","bind","default","hasOwnProperty","concat","modifier","legacyModifier","navigation","editing","ui","device","imeCompositionKeys","koreanSpecific","japaneseSpecific","commonFunction","multimedia","multimediaNumpad","audio","speech","application","browser","mobilePhone","tv","mediaControls","isSupportedHtml","pasteValue","some","expression","IGNORE_NODETYPES","isHtmlTable","sanitizeElementData","element","elementData","innerText","String","trim","parseHtmlText","doc","DOMParser","parseFromString","querySelector","parseHtmlTable","childNodes","childNode","parseText","parseData","mimeType","htmlSafe","createTextString","selectedData","isNeat","values","join","createHTMLString","htmlString","wheeling","stopPropagation","fn","events","removeEventListener","sfn","defaultPrevented","preventDefault","getRatio","maxPixelRatio","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","refreshScrollCacheX","frozenWidth","isColumnCollapsed","accumulator","column","schemaIndex","columnWidth","drawAfterResize","dims","vb","nb","co","isScrollBoxCorner","sbw","ratio","bm","cellBorder","columnHeaderCellBorder","dataHeight","dataWidth","topGroupAreaHeight","leftGroupAreaWidth","ch","setCanvasSize","args","setScrollBoxSize","checkScrollBoxVisibility","widthBoxRatio","heightBoxRatio","scrollBarBoxMinSize","scrollBarBoxWidth","bar","box","page","pageUpDownOverlap","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","cursorGrab","indicator","getUnhideIndicator","cursor","dragItem","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","unhideColumns","unhideRows","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","onUnhideIndicator","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","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","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","ranges","countOfRows","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","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","hideColumns","hideRows","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","getSelectedContiguousRows","allowOnlyOneRow","prev","ok","addDefaultContextMenuItem","getColumnsMap","_col","isNormalCell","isBackground","isScrollBar","showFilter","showCopy","copyText","execCommand","showPaste","clipBoardData","pasteText","showColumnSelector","columnSelectorText","toggleColumnVisibility","columnSelectorHiddenText","columnSelectorVisibleText","contiguousColumns","memoKey","compare","currentOrderIndex","matchedRange","matchedSchema","thisSchema","getSelectedContiguousColumns","hideColumnText","showClearSettingsOption","clearSettingsOptionText","allowSorting","showOrderByOption","showOrderByOptionTextAsc","showOrderByOptionTextDesc","boundRowIndexes","showHideRow","showHideRows","groupAreaHeight","groupAreaWidth","setCollapseStateForAllGroups","showRemoveAllGroupColumns","showExpandAllGroupColumns","showCollapseAllGroupColumns","showRemoveAllGroupRows","showExpandAllGroupRows","showCollapseAllGroupRows","canGroupByColumns","canUngroupColumns","canGroupByRows","canUngroupRows","groupIndexes","groupTitles","groupNames","showGroupColumns","cell0","cell1","formatArgs","showRemoveGroupColumns","rangeTitle","showGroupRows","showRemoveGroupRows","childGrid","childGridsOfParent","nodeA","nodeB","x1","y1","node","newX1","newY1","contextPosition","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","mergeHiddenRowRanges","newRange","inserted","nextRange","addGroup","groupFor","removeGroup","ordA","charCodeAt","fromCharCode","showFilterInCell","offsetX","offsetY","targetX","targetY","sbh","treeData","multiColIsSelected","columnIndices","colIsSelected","supressEvent","addCol","st","de","dragObject","trArgs","treeGridHeight","beginColumnOrderIndex","endColumnOrderIndex","newSize","dontSetStorageData","sorter","firstColumnName","lastColumnName","firstOne","lastOne","error","rowIndexFrom","rowIndexTo","isInteger","dataLength","sel","xi","visibleSchema","selectionLength","maxRowLength","minXi","yi","lastSourceIndex","cidx","indicators","useTouchScrollZones","getBorder","entitiy","borderResizeZone","moveBorder","tsz","touchScrollZone","moveMode","borderDragBehavior","xBorderBehavior","yBorderBehavior","isVerticalScrollBar","isHorizontalScrollBar","allowColumnResize","allowColumnResizeFromCell","allowRowHeaderResize","allowRowResize","allowRowResizeFromCell","columnGrabZoneSize","rowGrabZoneSize","maxCol","minCol","rowHeaderCellFont","autosizePadding","autosizeHeaderCellPadding","rowHeaderCellPaddingRight","rowHeaderCellPaddingLeft","formatter","columnHeaderCellFont","columnHeaderCellPaddingRight","columnHeaderCellPaddingLeft","cellAutoResizePadding","cellFont","cellPaddingRight","total","headerCell","int","asc","aValue","bValue","localeCompare","date","Date","getTime","webComponent","modules","dom","publicMethods","Grid","eval","attachShadow","canvasDatagrid","tKeys","customElements","argKey","tKey","sKey","HTMLElement","observedAttributes","define","require"],"mappings":"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"}