canvas-datagrid 0.3.12 → 0.3.16

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.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 ['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: columnOrderIndex,\n\n sortColumnIndex: headerIndex,\n sortRowIndex: rowIndex,\n\n isGrid: isGrid,\n isNormal: !isGrid && !isCorner && !isHeader,\n gridId: (self.attributes.name || '') + rowIndex + ':' + headerIndex,\n parentGrid: self.intf,\n innerHTML: '',\n activeHeader: activeHeader,\n value:\n isHeader && !isRowHeader ? header.title || header.name : rawValue,\n };\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;","/*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';\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\n const event = {\n selections: self.selections,\n selectedData: self.getSelectedData(),\n selectionBounds: self.getSelectionBounds(),\n };\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 if (startingBounds === JSON.stringify(sb)) {\n return;\n }\n ev = {\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\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.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 };\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\n self.pasteData = function (\n pasteValue,\n mimeType,\n startRowIndex,\n startColIndex,\n ) {\n var schema = self.getSchema();\n const isSupportedHtmlTable = (htmlString) =>\n /(?:^(<meta[^>]+>)?<table.*?>)|(?:<!--StartFragment-->\\s*<table.*?>)/.test(\n htmlString,\n );\n\n // TODO: support pasting tables from Excel\n if (\n mimeType === 'text/html' &&\n isSupportedHtmlTable(pasteValue) === false\n ) {\n console.warn(\n 'Unrecognized HTML format. HTML must be a simple table, e.g.: <table><tr><td>data</td></tr></table>.',\n );\n console.warn(\n 'Data with the mime type text/html not in this format will not be imported as row data.',\n );\n\n return;\n }\n\n function parseData(data, mimeType) {\n // TODO: use DOMParser\n if (mimeType === 'text/html') {\n const doc = new DOMParser().parseFromString(data, 'text/html');\n const trs = doc.querySelectorAll('table tr');\n const rows = [];\n trs.forEach((tr) => {\n const row = [];\n tr.childNodes.forEach((td) => {\n if (td.nodeName === '#text') return;\n const col = {\n // style: {}, // keep style if need\n value: [],\n };\n td.childNodes.forEach((ele) => {\n col.value.push({\n // style: {}, // keep style if need\n value: ele.nodeType === 1 ? ele.innerText : ele.data,\n });\n });\n row.push(col);\n });\n rows.push(row);\n });\n return rows;\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 data\n .split('\\n')\n .map((item) =>\n item.split('\\t').map((value) => ({ value: [{ value }] })),\n );\n }\n\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) {\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.getVisibleCellByIndex(columnIndex, rowIndex),\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.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.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 });\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 });\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 });\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 };\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","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","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","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","isPrintableKeyEvent","beginEditAt","selectNone","Number","isArrowKey","includes","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","pasteValue","mimeType","startRowIndex","startColIndex","isSupportedHtmlTable","htmlString","trs","DOMParser","parseFromString","childNodes","td","col","ele","innerText","parseData","cellData","join","forEachSelectedCell","colName","realRowIndex","cells","existingRowData","newRowData","assign","colIndex","columnName","boundRowIndexMap","affectedCells","getVisibleCellByIndex","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","has","visibility","localStorage","setItem","tempSchema","createColumnOrders","applyDefaultValue","defaultValue","createNewRowData","getSchemaNameHash","getFilteredAndSortedViewData","newViewData","originalRowIndex","headerName","filterText","getHeaderByName","currentFilterFunction","filterFrozenRows","entries","sortFn","rowA","rowB","rowIndexB","sortFrozenRows","refresh","getBestGuessDataType","drawChildGrids","gridKey","setTimer","validateColumn","setDefaults","obj1","obj2","setAttributes","setStyle","findColumnMaxTextLength","dispose","removeChild","eventParent","contextmenu","disconnect","tryLoadStoredSettings","reloadStoredValues","storedSettings","_typeof","getDomRoot","shadowRoot","host","getFontName","fontStyle","getFontHeight","parseFloat","parseStyleValue","initProp","propName","getStyleProperty","styleKeys","supressDrawAndEvent","isDim","getItem","message","init","initialized","publicStyleKeyIntf","initScrollBox","setDom","ie","navigator","userAgent","edge","webKit","moz","blankValues","cursorGrab","cursorGrabing","cursorGrabbing","appendTo","clearChangeLog","gotoCell","gotoRow","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","String","trim","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","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.lineTo(x, y + ah);\n self.ctx.lineTo(x + aw, y + ah);\n self.ctx.lineTo(x + aw * 0.5, y);\n self.ctx.lineTo(x, y + ah);\n } else {\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n }\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw + mr;\n }\n function drawTreeArrow(cell, x, y) {\n var mt = self.style.treeArrowMarginTop * self.scale,\n mr = self.style.treeArrowMarginRight * self.scale,\n ml = self.style.treeArrowMarginLeft * self.scale,\n aw = self.style.treeArrowWidth * self.scale,\n ah = self.style.treeArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.treeArrowColor;\n self.ctx.strokeStyle = self.style.treeArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n if (self.openChildren[cell.rowIndex]) {\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n } else {\n self.ctx.lineTo(x, y);\n self.ctx.lineTo(x + ah, y + aw * 0.5);\n self.ctx.lineTo(x, y + aw);\n self.ctx.lineTo(x, y);\n }\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw + mr;\n }\n function 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 odata,\n cr = {\n 'row-reorder': self.orders.rows,\n 'column-reorder': self.orders.columns,\n },\n i = {\n 'row-reorder': 'rowIndex',\n 'column-reorder': 'sortColumnIndex',\n }[self.dragMode];\n document.body.removeEventListener('mousemove', self.dragReorder, false);\n document.body.removeEventListener('mouseup', self.stopDragReorder, false);\n if (\n self.reorderObject &&\n self.reorderTarget &&\n ((self.dragMode === 'column-reorder' &&\n self.reorderTarget.sortColumnIndex > -1 &&\n self.reorderTarget.sortColumnIndex < self.getSchema().length) ||\n (self.dragMode === 'row-reorder' &&\n self.reorderTarget.rowIndex > -1 &&\n self.reorderTarget.rowIndex < self.viewData.length)) &&\n self.reorderObject[i] !== self.reorderTarget[i] &&\n !self.dispatchEvent('reorder', {\n NativeEvent: e,\n source: self.reorderObject,\n target: self.reorderTarget,\n dragMode: self.dragMode,\n })\n ) {\n self.ignoreNextClick = true;\n oIndex = cr[self.dragMode].indexOf(self.reorderObject[i]);\n tIndex = cr[self.dragMode].indexOf(self.reorderTarget[i]);\n if (self.dragMode === 'column-reorder') {\n cr[self.dragMode].splice(oIndex, 1);\n cr[self.dragMode].splice(tIndex, 0, self.reorderObject[i]);\n self.orders.columns = cr[self.dragMode];\n } else {\n // self.orders.rows = cr[self.dragMode];\n odata = self.viewData[oIndex];\n self.viewData[oIndex] = self.viewData[tIndex];\n self.viewData[tIndex] = odata;\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 if (\n self.dragMode === 'column-reorder' &&\n self.attributes.columnHeaderClickBehavior === 'select'\n ) {\n self.selectColumn(self.currentCell.header.index, ctrl, e.shiftKey);\n self.draw();\n }\n document.body.addEventListener('mousemove', self.dragReorder, false);\n document.body.addEventListener('mouseup', self.stopDragReorder, false);\n return;\n }\n };\n self.mouseup = function (e) {\n clearTimeout(self.scrollTimer);\n var ctrl = e.ctrlKey || e.metaKey;\n self.cellBoundaryCrossed = true;\n self.rowBoundaryCrossed = true;\n self.columnBoundaryCrossed = true;\n if (self.draggingItem) {\n self.selectColumn(self.currentCell.header.index, ctrl, e.shiftKey);\n self.draw();\n }\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 const aValue = a[columnName] || '';\n const bValue = b[columnName] || '';\n if (asc) {\n if (!aValue.localeCompare) {\n return 1;\n }\n return aValue.localeCompare(bValue);\n }\n if (!bValue.localeCompare) {\n return 1;\n }\n return bValue.localeCompare(aValue);\n };\n };\n self.sorters.number = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n if (asc) {\n return a[columnName] - b[columnName];\n }\n return b[columnName] - a[columnName];\n };\n };\n self.sorters.date = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n if (asc) {\n return (\n new Date(a[columnName]).getTime() - new Date(b[columnName]).getTime()\n );\n }\n return (\n new Date(b[columnName]).getTime() - new Date(a[columnName]).getTime()\n );\n };\n };\n}\n","/*jslint browser: true, unparam: true, todo: true, evil: true*/\n/*globals Reflect: false, HTMLElement: true, define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport component from './component';\nimport defaults from './defaults';\nimport draw from './draw';\nimport events from './events';\nimport touch from './touch';\nimport intf from './intf';\nimport contextMenu from './contextMenu';\nimport 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","odata","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","aValue","bValue","localeCompare","date","Date","getTime","webComponent","modules","dom","publicMethods","Grid","eval","attachShadow","canvasDatagrid","tKeys","customElements","argKey","tKey","sKey","HTMLElement","observedAttributes","define","require"],"mappings":"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"}