canvas-datagrid 0.3.13 → 0.3.14

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/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 ['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 ['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 ['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 ['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.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 + 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 }\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 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 en.horizontalBox.x =\n rowHeaderCellWidth +\n self.style.scrollBarBoxMargin +\n (en.horizontalBar.width - self.scrollBox.scrollBoxWidth) *\n (self.scrollBox.scrollLeft / self.scrollBox.scrollWidth);\n en.verticalBox.y =\n columnHeaderCellHeight +\n self.style.scrollBarBoxMargin +\n (en.verticalBar.height - self.scrollBox.scrollBoxHeight) *\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 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 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 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 // 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.\n if (\n isRowHeader &&\n self.attributes.showRowNumbers &&\n self.attributes.showRowNumberGaps\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 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 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 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\nexport {\n isSupportedHtml,\n sanitizeElementData,\n parseData,\n parseHtmlTable,\n parseHtmlText,\n parseText,\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 self.scrollBox.widthBoxRatio = self.scrollBox.width / dataWidth;\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 - columnHeaderCellHeight) / 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;\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.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 };\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 (!self.dragAddToSelection && cell.rowIndex !== undefined) {\n if (\n self.selections[cell.rowIndex] &&\n self.selections[cell.rowIndex].indexOf(cell.columnIndex) !== -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) === -1\n ) {\n self.selections[cell.rowIndex].push(cell.columnIndex);\n const 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 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 self.selections = [];\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 if (dragBounds.top !== -1) {\n self.selectArea(sBounds, 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 self.setActiveCell(i.columnIndex, i.rowIndex);\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 if (self.attributes.columnHeaderClickBehavior === 'select') {\n self.selectColumn(i.header.index, ctrl, e.shiftKey);\n self.draw();\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 () {\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 (\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 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 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 cr[self.dragMode].splice(oIndex, 1);\n cr[self.dragMode].splice(tIndex, 0, self.reorderObject[i]);\n if (self.dragMode === 'column-reorder') {\n self.orders.columns = cr[self.dragMode];\n } else {\n self.orders.rows = cr[self.dragMode];\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 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 }\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 }\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 self.selections = [];\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 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 (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 self.fitColumnToValues(self.currentCell.header.name);\n } else if (\n self.currentCell.context === 'ew-resize' &&\n self.currentCell.style === 'cornerCell'\n ) {\n self.autosize();\n } else if (['cell', 'activeCell'].indexOf(self.currentCell.style) !== -1) {\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 (e) {\n self.copy(e);\n self.forEachSelectedCell(function (data, index, colName) {\n data[index][colName] = '';\n });\n };\n self.copy = function (e) {\n if (self.dispatchEvent('copy', { NativeEvent: e })) {\n return;\n }\n if (!self.hasFocus || !e.clipboardData) {\n return;\n }\n var t = '',\n d = '',\n textRows = [],\n sData = self.getSelectedData(),\n s = self.getSchema(),\n sSorted = [],\n firstRowKeys,\n isNeat = true; // Selected like [[0, 1], [0, 1]] of [[0, 3]] is neat; Selected like [[0, 1], [1, 2]] is untidy\n function htmlSafe(v) {\n return v.replace(/</g, '&lt;').replace(/>/g, '&gt;');\n }\n s.forEach(function (column, columnIndex) {\n sSorted.push(s[self.orders.columns[columnIndex]]);\n });\n if (sData.length > 0) {\n sData.forEach((row) => {\n if (!row) return;\n var rowKeys = Object.keys(row);\n var textRow = [];\n if (!firstRowKeys) firstRowKeys = Object.keys(row);\n if (isNeat && rowKeys.length !== firstRowKeys.length) isNeat = false;\n sSorted.forEach(function (column, columnIndex) {\n if (rowKeys.indexOf(column.name) < 0) {\n if (firstRowKeys.indexOf(column.name) < 0) {\n return;\n } else if (isNeat) {\n isNeat = false;\n }\n }\n textRow.push(row[column.name] || '');\n });\n textRows.push(textRow);\n });\n if (isNeat) {\n t = textRows.map((row) => row.join('\\t')).join('\\n');\n /**\n * The html content copied by Excel has not header\n */\n d += '<table>';\n d += textRows\n .map(\n (row) =>\n '<tr>' +\n row.map((value) => '<td>' + htmlSafe(value) + '</td>').join('') +\n '</tr>',\n )\n .join('');\n d += '</table>';\n } else {\n t = textRows.map((row) => row.join('')).join('');\n d = t;\n }\n if (t) {\n e.clipboardData.setData('text/html', d);\n e.clipboardData.setData('text/plain', t);\n e.clipboardData.setData('text/csv', t);\n e.clipboardData.setData('application/json', JSON.stringify(sData));\n }\n e.preventDefault();\n }\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\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.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 'attributechanged',\n 'beforebeginedit',\n 'beforecreatecellgrid',\n 'beforedraw',\n 'beforeendedit',\n 'beforerendercell',\n 'beforerendercellgrid',\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.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.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 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.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.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.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 }\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 }\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 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.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 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 if (el.parentNode) {\n el.parentNode.removeChild(el);\n }\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 () {\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 };\n self.contextmenuEvent = function (e, overridePos) {\n if (!self.hasFocus && e.target !== self.canvas) {\n return;\n }\n function createDiposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('click', self.disposeContextMenu);\n document.removeEventListener('mouseup', createDiposeEvent);\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 (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 self.contextMenu = createContextMenu(ev, contextPosition, items);\n document.addEventListener('mouseup', createDiposeEvent);\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*/\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 while (e.offsetParent && e.nodeName !== 'CANVAS-DATAGRID') {\n x += e.offsetLeft;\n y += e.offsetTop;\n h = e.offsetHeight;\n w = e.offsetWidth;\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-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 }\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 * 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 if (\n 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 }).length === 0\n ) {\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 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(self.orders.columns[columnIndex]) ===\n -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 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 self.sizes.columns[\n name === 'cornerCell' ? -1 : self.getHeaderByName(name).index\n ] = Math.max(self.findColumnMaxTextLength(name), self.style.minColumnWidth);\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 * 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 if (a[columnName] === undefined || a[columnName] === null) {\n return 1;\n }\n if (b[columnName] === undefined || b[columnName] === null) {\n return 0;\n }\n if (asc) {\n if (!a[columnName].localeCompare) {\n return 1;\n }\n return a[columnName].localeCompare(b[columnName]);\n }\n if (!b[columnName].localeCompare) {\n return 1;\n }\n return b[columnName].localeCompare(a[columnName]);\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 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 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","reorderMarkerIndexBorderWidth","reorderMarkerIndexBorderColor","reorderTarget","sortRowIndex","sortColumnIndex","drawReorderMarkers","movingSelection","moveOverlayBorderWidth","moveOverlayBorderColor","setLineDash","moveOverlayBorderSegments","gridBorderWidth","gridBorderColor","dsb","selectionOverlayBorderWidth","selectionOverlayBorderColor","drawSelectionBorders","entities","scrollBarBoxMargin","scrollBarBorderColor","scrollBarBorderWidth","horizontalBox","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","getColumnWidth","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","selections","indexOf","isHeader","cellGridAttributes","cellStyle","isCorner","isColumnHeader","wrap","cellWhiteSpace","selected","hovered","hovers","hoverMode","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","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","includes","col","parseText","parseData","mimeType","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","scrollCache","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","dragAddToSelection","event","selectedData","getSelectedData","selectedCells","getSelectedCells","selectionBounds","selectRow","selectArea","autoScrollOnMousemove","movedVertically","autoScrollMargin","movedHorizontally","autoScrollZone","click","startingBounds","endEdit","setActiveCell","selectAll","checkSelectionChange","columnHeaderClickBehavior","selectColumn","treeArrowClickRadius","toggleTree","sb","dragResizeColumn","resizingStartingWidth","resizingStartingHeight","minColumnWidth","minRowHeight","resizeScrollZone","resizeChildGrids","globalRowResize","stopDragResize","body","setStorageData","scrollGrid","scrollPointerLock","scrollStartMode","movementX","movementY","scrollMode","scrollStart","scrollModes","setTimeout","scrollRepeatRate","selectionScrollIncrement","stopScrollGrid","exitPointerLock","dragReorder","columReorder","rowReorder","allowColumnReordering","allowRowReordering","source","reorderDeadZone","stopDragReorder","oIndex","tIndex","cr","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","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","join","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","copy","firstRowKeys","textRows","sData","sSorted","isNeat","rowKeys","textRow","setData","touchMoving","touchScrollTimeout","animationFrames","getTouchPos","touchIndex","rect","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","contextmenuEvent","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","orderings","add","sortFunction","sort","filters","sorters","parsers","schemaHashes","changes","componentL1Events","eventNames","expandToRow","viewDataLength","orderedIndex","entries","has","visibility","localStorage","setItem","tempSchema","createColumnOrders","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","getVisibleCellByIndex","clearChangeLog","gotoCell","gotoRow","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","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","position","contextMenuArrowColor","zIndex","inputDropdown","maxHeight","innerHeight","autocompleteBottomMargin","minWidth","contextMenuArrowUpHTML","contextMenuArrowDownHTML","contextMenuWindowMargin","innerWidth","clickIndex","Event","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","createDiposeEvent","ele","boundingRect","eleRect","clipRect","parentRect","Infinity","scrollingElement","editCell","borderWidth","mobileEditInputHeight","cellPaddingLeft","ignoreScrollOffset","abort","newValue","oldValue","aborted","inEnterMode","enumItems","enu","option","valueInEnum","multiLine","editCellZIndex","fontSize","editCellFontSize","cellValueIsEmpty","shouldClearCellValue","nx","ny","altKey","nextRowIndex","className","css","verticalAlign","marginLeft","padding","border","contextFilterInputBorder","borderRadius","contextFilterInputBorderRadius","fontWeight","fontFamily","contextFilterInputFontFamily","contextFilterInputFontSize","contextMenuBackground","contextMenuColor","contextFilterButtonBorder","contextFilterButtonBorderRadius","contextMenuFilterButtonFontFamily","contextMenuFilterButtonFontSize","cssFloat","childContextMenuArrowColor","contextMenuChildArrowFontSize","contextMenuFontFamily","contextMenuFontSize","contextMenuBorder","contextMenuPadding","contextMenuBorderRadius","opacity","contextMenuOpacity","overflow","contextMenuHoverBackground","contextMenuHoverColor","display","boxSizing","outline","margin","mobileEditFontFamily","mobileEditFontSize","editCellBorder","editCellColor","editCellBackgroundColor","appearance","webkitAppearance","mozAppearance","editCellPaddingLeft","editCellFontFamily","boxShadow","editCellBoxShadow","contextMenuItemMargin","contextMenuItemBorderRadius","contextMenuLabelMargin","contextMenuLabelDisplay","contextMenuLabelMinWidth","maxWidth","contextMenuLabelMaxWidth","contextMenuCursor","contextMenuFilterInvalidExpresion","onblur","parentIsCanvas","getContext","textBaseline","ordA","charCodeAt","fromCharCode","offsetX","offsetY","targetX","targetY","sbh","isColumnSelected","colIsSelected","supressEvent","addCol","st","de","ri","dragObject","childGrid","trArgs","treeGridHeight","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","getRowHeight","headerCell","int","asc","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/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 ['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 ['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 ['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 ['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.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 + 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 }\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 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 en.horizontalBox.x =\n rowHeaderCellWidth +\n self.style.scrollBarBoxMargin +\n (en.horizontalBar.width - self.scrollBox.scrollBoxWidth) *\n (self.scrollBox.scrollLeft / self.scrollBox.scrollWidth);\n en.verticalBox.y =\n columnHeaderCellHeight +\n self.style.scrollBarBoxMargin +\n (en.verticalBar.height - self.scrollBox.scrollBoxHeight) *\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 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 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 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 // 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.\n if (\n isRowHeader &&\n self.attributes.showRowNumbers &&\n self.attributes.showRowNumberGaps\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 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 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 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\nexport {\n isSupportedHtml,\n sanitizeElementData,\n parseData,\n parseHtmlTable,\n parseHtmlText,\n parseText,\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 self.scrollBox.widthBoxRatio = self.scrollBox.width / dataWidth;\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 - columnHeaderCellHeight) / 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;\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.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 };\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 (!self.dragAddToSelection && cell.rowIndex !== undefined) {\n if (\n self.selections[cell.rowIndex] &&\n self.selections[cell.rowIndex].indexOf(cell.columnIndex) !== -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) === -1\n ) {\n self.selections[cell.rowIndex].push(cell.columnIndex);\n const 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 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 self.selections = [];\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 if (dragBounds.top !== -1) {\n self.selectArea(sBounds, 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 self.setActiveCell(i.columnIndex, i.rowIndex);\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 if (self.attributes.columnHeaderClickBehavior === 'select') {\n self.selectColumn(i.header.index, ctrl, e.shiftKey);\n self.draw();\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 () {\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 (\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 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 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 cr[self.dragMode].splice(oIndex, 1);\n cr[self.dragMode].splice(tIndex, 0, self.reorderObject[i]);\n if (self.dragMode === 'column-reorder') {\n self.orders.columns = cr[self.dragMode];\n } else {\n self.orders.rows = cr[self.dragMode];\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 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 }\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 }\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 self.selections = [];\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 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 (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 self.fitColumnToValues(self.currentCell.header.name);\n } else if (\n self.currentCell.context === 'ew-resize' &&\n self.currentCell.style === 'cornerCell'\n ) {\n self.autosize();\n } else if (['cell', 'activeCell'].indexOf(self.currentCell.style) !== -1) {\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 (e) {\n self.copy(e);\n const schema = self.getSchema();\n\n var affectedCells = [];\n for (const [rowIndex, row] of self.selections.entries()) {\n if (!row) continue;\n\n const boundRowIndex = self.getBoundRowIndexFromViewRowIndex(rowIndex);\n\n for (const columnIndex of row) {\n const boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(\n columnIndex,\n );\n const colName = schema[boundColumnIndex].name;\n\n self.viewData[rowIndex][colName] = '';\n\n affectedCells.push([\n rowIndex,\n columnIndex,\n boundRowIndex,\n boundColumnIndex,\n ]);\n }\n }\n\n if (self.dispatchEvent('cut', { NativeEvent: e, cells: affectedCells })) {\n return;\n }\n };\n self.copy = function (e) {\n if (self.dispatchEvent('copy', { NativeEvent: e })) {\n return;\n }\n if (!self.hasFocus || !e.clipboardData) {\n return;\n }\n var t = '',\n d = '',\n textRows = [],\n sData = self.getSelectedData(),\n s = self.getSchema(),\n sSorted = [],\n firstRowKeys,\n isNeat = true; // Selected like [[0, 1], [0, 1]] of [[0, 3]] is neat; Selected like [[0, 1], [1, 2]] is untidy\n function htmlSafe(v) {\n return v.replace(/</g, '&lt;').replace(/>/g, '&gt;');\n }\n s.forEach(function (column, columnIndex) {\n sSorted.push(s[self.orders.columns[columnIndex]]);\n });\n if (sData.length > 0) {\n sData.forEach((row) => {\n if (!row) return;\n var rowKeys = Object.keys(row);\n var textRow = [];\n if (!firstRowKeys) firstRowKeys = Object.keys(row);\n if (isNeat && rowKeys.length !== firstRowKeys.length) isNeat = false;\n sSorted.forEach(function (column, columnIndex) {\n if (rowKeys.indexOf(column.name) < 0) {\n if (firstRowKeys.indexOf(column.name) < 0) {\n return;\n } else if (isNeat) {\n isNeat = false;\n }\n }\n textRow.push(row[column.name] || '');\n });\n textRows.push(textRow);\n });\n if (isNeat) {\n t = textRows.map((row) => row.join('\\t')).join('\\n');\n /**\n * The html content copied by Excel has not header\n */\n d += '<table>';\n d += textRows\n .map(\n (row) =>\n '<tr>' +\n row.map((value) => '<td>' + htmlSafe(value) + '</td>').join('') +\n '</tr>',\n )\n .join('');\n d += '</table>';\n } else {\n t = textRows.map((row) => row.join('')).join('');\n d = t;\n }\n if (t) {\n e.clipboardData.setData('text/html', d);\n e.clipboardData.setData('text/plain', t);\n e.clipboardData.setData('text/csv', t);\n e.clipboardData.setData('application/json', JSON.stringify(sData));\n }\n e.preventDefault();\n }\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\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.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 'attributechanged',\n 'beforebeginedit',\n 'beforecreatecellgrid',\n 'beforedraw',\n 'beforeendedit',\n 'beforerendercell',\n 'beforerendercellgrid',\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.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.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 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.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.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 }\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 }\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 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.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 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 if (el.parentNode) {\n el.parentNode.removeChild(el);\n }\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 () {\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 };\n self.contextmenuEvent = function (e, overridePos) {\n if (!self.hasFocus && e.target !== self.canvas) {\n return;\n }\n function createDiposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('click', self.disposeContextMenu);\n document.removeEventListener('mouseup', createDiposeEvent);\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 (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 self.contextMenu = createContextMenu(ev, contextPosition, items);\n document.addEventListener('mouseup', createDiposeEvent);\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*/\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 while (e.offsetParent && e.nodeName !== 'CANVAS-DATAGRID') {\n x += e.offsetLeft;\n y += e.offsetTop;\n h = e.offsetHeight;\n w = e.offsetWidth;\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-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 }\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 * 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 if (\n 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 }).length === 0\n ) {\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 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(self.orders.columns[columnIndex]) ===\n -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 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 self.sizes.columns[\n name === 'cornerCell' ? -1 : self.getHeaderByName(name).index\n ] = Math.max(self.findColumnMaxTextLength(name), self.style.minColumnWidth);\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 * 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 if (a[columnName] === undefined || a[columnName] === null) {\n return 1;\n }\n if (b[columnName] === undefined || b[columnName] === null) {\n return 0;\n }\n if (asc) {\n if (!a[columnName].localeCompare) {\n return 1;\n }\n return a[columnName].localeCompare(b[columnName]);\n }\n if (!b[columnName].localeCompare) {\n return 1;\n }\n return b[columnName].localeCompare(a[columnName]);\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 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 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","reorderMarkerIndexBorderWidth","reorderMarkerIndexBorderColor","reorderTarget","sortRowIndex","sortColumnIndex","drawReorderMarkers","movingSelection","moveOverlayBorderWidth","moveOverlayBorderColor","setLineDash","moveOverlayBorderSegments","gridBorderWidth","gridBorderColor","dsb","selectionOverlayBorderWidth","selectionOverlayBorderColor","drawSelectionBorders","entities","scrollBarBoxMargin","scrollBarBorderColor","scrollBarBorderWidth","horizontalBox","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","getColumnWidth","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","selections","indexOf","isHeader","cellGridAttributes","cellStyle","isCorner","isColumnHeader","wrap","cellWhiteSpace","selected","hovered","hovers","hoverMode","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","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","includes","col","parseText","parseData","mimeType","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","scrollCache","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","dragAddToSelection","event","selectedData","getSelectedData","selectedCells","getSelectedCells","selectionBounds","selectRow","selectArea","autoScrollOnMousemove","movedVertically","autoScrollMargin","movedHorizontally","autoScrollZone","click","startingBounds","endEdit","setActiveCell","selectAll","checkSelectionChange","columnHeaderClickBehavior","selectColumn","treeArrowClickRadius","toggleTree","sb","dragResizeColumn","resizingStartingWidth","resizingStartingHeight","minColumnWidth","minRowHeight","resizeScrollZone","resizeChildGrids","globalRowResize","stopDragResize","body","setStorageData","scrollGrid","scrollPointerLock","scrollStartMode","movementX","movementY","scrollMode","scrollStart","scrollModes","setTimeout","scrollRepeatRate","selectionScrollIncrement","stopScrollGrid","exitPointerLock","dragReorder","columReorder","rowReorder","allowColumnReordering","allowRowReordering","source","reorderDeadZone","stopDragReorder","oIndex","tIndex","cr","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","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","join","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","copy","entries","firstRowKeys","textRows","sData","sSorted","isNeat","rowKeys","textRow","setData","touchMoving","touchScrollTimeout","animationFrames","getTouchPos","touchIndex","rect","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","contextmenuEvent","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","orderings","add","sortFunction","sort","filters","sorters","parsers","schemaHashes","changes","componentL1Events","eventNames","expandToRow","viewDataLength","orderedIndex","has","visibility","localStorage","setItem","tempSchema","createColumnOrders","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","getVisibleCellByIndex","clearChangeLog","gotoCell","gotoRow","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","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","position","contextMenuArrowColor","zIndex","inputDropdown","maxHeight","innerHeight","autocompleteBottomMargin","minWidth","contextMenuArrowUpHTML","contextMenuArrowDownHTML","contextMenuWindowMargin","innerWidth","clickIndex","Event","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","createDiposeEvent","ele","boundingRect","eleRect","clipRect","parentRect","Infinity","scrollingElement","editCell","borderWidth","mobileEditInputHeight","cellPaddingLeft","ignoreScrollOffset","abort","newValue","oldValue","aborted","inEnterMode","enumItems","enu","option","valueInEnum","multiLine","editCellZIndex","fontSize","editCellFontSize","cellValueIsEmpty","shouldClearCellValue","nx","ny","altKey","nextRowIndex","className","css","verticalAlign","marginLeft","padding","border","contextFilterInputBorder","borderRadius","contextFilterInputBorderRadius","fontWeight","fontFamily","contextFilterInputFontFamily","contextFilterInputFontSize","contextMenuBackground","contextMenuColor","contextFilterButtonBorder","contextFilterButtonBorderRadius","contextMenuFilterButtonFontFamily","contextMenuFilterButtonFontSize","cssFloat","childContextMenuArrowColor","contextMenuChildArrowFontSize","contextMenuFontFamily","contextMenuFontSize","contextMenuBorder","contextMenuPadding","contextMenuBorderRadius","opacity","contextMenuOpacity","overflow","contextMenuHoverBackground","contextMenuHoverColor","display","boxSizing","outline","margin","mobileEditFontFamily","mobileEditFontSize","editCellBorder","editCellColor","editCellBackgroundColor","appearance","webkitAppearance","mozAppearance","editCellPaddingLeft","editCellFontFamily","boxShadow","editCellBoxShadow","contextMenuItemMargin","contextMenuItemBorderRadius","contextMenuLabelMargin","contextMenuLabelDisplay","contextMenuLabelMinWidth","maxWidth","contextMenuLabelMaxWidth","contextMenuCursor","contextMenuFilterInvalidExpresion","onblur","parentIsCanvas","getContext","textBaseline","ordA","charCodeAt","fromCharCode","offsetX","offsetY","targetX","targetY","sbh","isColumnSelected","colIsSelected","supressEvent","addCol","st","de","ri","dragObject","childGrid","trArgs","treeGridHeight","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","getRowHeight","headerCell","int","asc","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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"}