canvas-datagrid 0.3.20 → 0.3.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/canvas-datagrid.debug.js +92 -8
- package/dist/canvas-datagrid.debug.map +1 -1
- package/dist/canvas-datagrid.js +1 -1
- package/dist/canvas-datagrid.module.js +1 -1
- package/dist/canvas-datagrid.module.js.map +1 -1
- package/dist/types.d.ts +5 -0
- package/lib/button.js +1 -0
- package/lib/docs.js +9 -1
- package/lib/events/index.js +16 -4
- package/lib/intf.js +34 -0
- package/lib/publicMethods.js +37 -3
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvas-datagrid.module.js","sources":["../lib/defaults.js","../lib/component.js","../lib/draw.js","../node_modules/is-printable-key-event/dist/index.js","../lib/events/util.js","../lib/events/index.js","../lib/touch.js","../lib/intf.js","../lib/contextMenu.js","../lib/button.js","../lib/dom.js","../lib/publicMethods.js","../lib/main.js"],"sourcesContent":["/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n\n'use strict';\nexport default function (self) {\n self.defaults = {\n attributes: [\n ['allowColumnReordering', true],\n ['allowColumnResize', true],\n ['allowColumnResizeFromCell', false],\n ['allowFreezingRows', false],\n ['allowFreezingColumns', false],\n ['allowMovingSelection', true],\n ['allowRowHeaderResize', true],\n ['allowRowReordering', false],\n ['allowRowResize', true],\n ['allowRowResizeFromCell', false],\n ['allowSorting', true],\n ['animationDurationShowContextMenu', 50],\n ['animationDurationHideContextMenu', 50],\n ['autoGenerateSchema', false],\n ['autoResizeColumns', false],\n ['autoResizeRows', false],\n ['autoScrollOnMousemove', false],\n ['autoScrollMargin', 5],\n ['blanksText', '(Blanks)'],\n ['borderDragBehavior', 'none'],\n ['borderResizeZone', 10],\n ['clearSettingsOptionText', 'Clear saved settings'],\n ['columnHeaderClickBehavior', 'sort'],\n ['columnSelectorHiddenText', ' '],\n ['columnSelectorText', 'Add/Remove columns'],\n ['columnSelectorVisibleText', '\\u2713'],\n ['contextHoverScrollAmount', 2],\n ['contextHoverScrollRateMs', 5],\n ['copyHeadersOnSelectAll', true],\n ['copyText', 'Copy'],\n ['debug', false],\n ['editable', true],\n ['ellipsisText', '...'],\n ['filterOptionText', 'Filter %s'],\n ['filterTextPrefix', '(filtered) '],\n ['filterFrozenRows', true],\n ['globalRowResize', false],\n ['hideColumnText', 'Hide %s'],\n ['hoverMode', 'cell'],\n ['keepFocusOnMouseOut', false],\n ['maxAutoCompleteItems', 200],\n ['multiLine', false],\n ['name', ''],\n ['pageUpDownOverlap', 1],\n ['pasteText', 'Paste'],\n ['persistantSelectionMode', false],\n ['removeFilterOptionText', 'Remove filter on %s'],\n ['reorderDeadZone', 3],\n ['resizeScrollZone', 20],\n ['rowGrabZoneSize', 5],\n ['saveAppearance', true],\n ['scrollAnimationPPSThreshold', 0.75],\n ['scrollPointerLock', false],\n ['scrollRepeatRate', 75],\n ['selectionFollowsActiveCell', false],\n ['selectionHandleBehavior', 'none'],\n ['selectionMode', 'cell'],\n ['selectionScrollIncrement', 20],\n ['selectionScrollZone', 20],\n ['showClearSettingsOption', true],\n ['showColumnHeaders', true],\n ['showColumnSelector', true],\n ['showCopy', false],\n ['showFilter', true],\n ['showFilterInCell', false],\n ['showNewRow', false],\n ['showOrderByOption', true],\n ['showOrderByOptionTextAsc', 'Order by %s ascending'],\n ['showOrderByOptionTextDesc', 'Order by %s descending'],\n ['showPaste', false],\n ['showPerformance', false],\n ['showRowHeaders', true],\n ['showRowNumbers', true],\n ['showRowNumberGaps', true],\n ['singleSelectionMode', false],\n ['snapToRow', false],\n ['sortFrozenRows', true],\n ['touchContextMenuTimeMs', 800],\n ['touchDeadZone', 3],\n ['touchEasingMethod', 'easeOutQuad'],\n ['touchReleaseAcceleration', 1000],\n ['touchReleaseAnimationDurationMs', 2000],\n ['touchScrollZone', 20],\n ['touchSelectHandleZone', 20],\n ['touchZoomSensitivity', 0.005],\n ['touchZoomMin', 0.5],\n ['touchZoomMax', 1.75],\n ['maxPixelRatio', 2],\n ['tree', false],\n ['treeHorizontalScroll', false],\n ],\n styles: [\n ['activeCellBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['activeCellBorderColor', 'rgba(110, 168, 255, 1)'],\n ['activeCellBorderWidth', 1],\n ['activeCellColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellFont', '16px sans-serif'],\n ['activeCellHoverBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['activeCellHorizontalAlignment', 'left'],\n ['activeCellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['activeCellOverlayBorderWidth', 1],\n ['activeCellPaddingBottom', 5],\n ['activeCellPaddingLeft', 5],\n ['activeCellPaddingRight', 5],\n ['activeCellPaddingTop', 5],\n ['activeCellSelectedBackgroundColor', 'rgba(236, 243, 255, 1)'],\n ['activeCellSelectedColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellVerticalAlignment', 'center'],\n ['activeColumnHeaderCellBackgroundColor', 'rgba(225, 225, 225, 1)'],\n ['activeColumnHeaderCellColor', 'rgba(0, 0, 0, 1)'],\n ['activeRowHeaderCellBackgroundColor', 'rgba(225, 225, 225, 1)'],\n ['activeRowHeaderCellColor', 'rgba(0, 0, 0, 1)'],\n ['autocompleteBottomMargin', 60],\n ['autosizeHeaderCellPadding', 8],\n ['autosizePadding', 5],\n ['buttonActiveBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['buttonActiveBorderColor', 'rgba(110, 168, 255, 1)'],\n ['buttonArrowColor', 'rgba(50, 50, 50, 1)'],\n ['buttonArrowDownHTML', '▼'],\n ['buttonZIndex', 10000],\n ['buttonBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['buttonBorderColor', 'rgba(172, 172, 172, 1)'],\n ['buttonHoverBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['buttonMenuWindowMargin', 30],\n ['buttonPadding', '3px'],\n ['cellAutoResizePadding', 13],\n ['cellBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['cellBorderColor', 'rgba(195, 199, 202, 1)'],\n ['cellBorderWidth', 1],\n ['cellColor', 'rgba(0, 0, 0, 1)'],\n ['cellFont', '16px sans-serif'],\n ['cellGridHeight', 250],\n ['cellHeight', 24],\n ['cellHeightWithChildGrid', 150],\n ['cellHorizontalAlignment', 'left'],\n ['cellHoverBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['cellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['cellPaddingBottom', 5],\n ['cellPaddingLeft', 5],\n ['cellPaddingRight', 5],\n ['cellPaddingTop', 5],\n ['cellSelectedBackgroundColor', 'rgba(236, 243, 255, 1)'],\n ['cellSelectedColor', 'rgba(0, 0, 0, 1)'],\n ['cellVerticalAlignment', 'center'],\n ['cellWidth', 250],\n ['cellWidthWithChildGrid', 250],\n ['cellWhiteSpace', 'nowrap'],\n ['cellLineHeight', 1],\n ['cellLineSpacing', 3],\n ['childContextMenuArrowColor', 'rgba(43, 48, 43, 1)'],\n ['childContextMenuArrowHTML', '►'],\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', '▼'],\n ['contextFilterInputBackground', 'rgba(255,255,255,1)'],\n ['contextFilterInputBorder', 'solid 1px rgba(158, 163, 169, 1)'],\n ['contextFilterInputBorderRadius', '0'],\n ['contextFilterInputColor', 'rgba(0,0,0,1)'],\n ['contextFilterInputFontFamily', 'sans-serif'],\n ['contextFilterInputFontSize', '14px'],\n ['contextFilterInvalidRegExpBackground', 'rgba(180, 6, 1, 1)'],\n ['contextFilterInvalidRegExpColor', 'rgba(255, 255, 255, 1)'],\n ['contextMenuArrowColor', 'rgba(43, 48, 43, 1)'],\n ['contextMenuArrowDownHTML', '▼'],\n ['contextMenuArrowUpHTML', '▲'],\n ['contextMenuBackground', 'rgba(240, 240, 240, 1)'],\n ['contextMenuBorder', 'solid 1px rgba(158, 163, 169, 1)'],\n ['contextMenuBorderRadius', '3px'],\n ['contextMenuChildArrowFontSize', '12px'],\n ['contextMenuColor', 'rgba(43, 48, 43, 1)'],\n ['contextMenuCursor', 'default'],\n ['contextMenuFilterButtonFontFamily', 'sans-serif'],\n ['contextMenuFilterButtonFontSize', '10px'],\n ['contextMenuFilterInvalidExpresion', 'rgba(237, 155, 156, 1)'],\n ['contextMenuFontFamily', 'sans-serif'],\n ['contextMenuFontSize', '16px'],\n ['contextMenuHoverBackground', 'rgba(182, 205, 250, 1)'],\n ['contextMenuHoverColor', 'rgba(43, 48, 153, 1)'],\n ['contextMenuItemBorderRadius', '3px'],\n ['contextMenuItemMargin', '2px'],\n ['contextMenuLabelDisplay', 'inline-block'],\n ['contextMenuLabelMargin', '0 3px 0 0'],\n ['contextMenuLabelMaxWidth', '700px'],\n ['contextMenuLabelMinWidth', '75px'],\n ['contextMenuMarginLeft', 3],\n ['contextMenuMarginTop', -3],\n ['contextMenuOpacity', '0.98'],\n ['contextMenuPadding', '2px'],\n ['contextMenuWindowMargin', 30],\n ['contextMenuZIndex', 10000],\n ['cornerCellBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['cornerCellBorderColor', 'rgba(202, 202, 202, 1)'],\n ['debugBackgroundColor', 'rgba(0, 0, 0, .0)'],\n ['debugColor', 'rgba(255, 15, 24, 1)'],\n ['debugEntitiesColor', 'rgba(76, 231, 239, 1.00)'],\n ['debugFont', '11px sans-serif'],\n ['debugPerfChartBackground', 'rgba(29, 25, 26, 1.00)'],\n ['debugPerfChartTextColor', 'rgba(255, 255, 255, 0.8)'],\n ['debugPerformanceColor', 'rgba(252, 255, 37, 1.00)'],\n ['debugScrollHeightColor', 'rgba(248, 33, 103, 1.00)'],\n ['debugScrollWidthColor', 'rgba(66, 255, 27, 1.00)'],\n ['debugTouchPPSXColor', 'rgba(246, 102, 24, 1.00)'],\n ['debugTouchPPSYColor', 'rgba(186, 0, 255, 1.00)'],\n ['display', 'inline-block'],\n ['editCellBackgroundColor', 'white'],\n ['editCellBorder', 'solid 1px rgba(110, 168, 255, 1)'],\n ['editCellBoxShadow', '0 2px 5px rgba(0,0,0,0.4)'],\n ['editCellColor', 'black'],\n ['editCellFontFamily', 'sans-serif'],\n ['editCellFontSize', '16px'],\n ['editCellPaddingLeft', 4],\n ['editCellZIndex', 10000],\n ['filterButtonActiveBackgroundColor', 'rgba(225, 225, 225, 1)'],\n ['filterButtonArrowBorderColor', 'rgba(195, 199, 202, 1)'],\n ['filterButtonArrowBorderWidth', 1],\n ['filterButtonArrowClickRadius', 5],\n ['filterButtonArrowColor', 'rgba(50, 50, 50, 1)'],\n ['filterButtonArrowHeight', 5],\n ['filterButtonArrowWidth', 8],\n ['filterButtonBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['filterButtonBorderColor', 'rgba(172, 172, 172, 1)'],\n ['filterButtonBorderRadius', 3],\n ['filterButtonHeight', 20],\n ['filterButtonHoverBackgroundColor', 'rgba(235, 235, 235, 1)'],\n ['filterButtonMenuOffsetTop', 10],\n ['filterButtonWidth', 20],\n ['frozenMarkerHoverColor', 'rgba(236, 243, 255, 1)'],\n ['frozenMarkerHoverBorderColor', 'rgba(110, 168, 255, 1)'],\n ['frozenMarkerActiveColor', 'rgba(236, 243, 255, 1)'],\n ['frozenMarkerActiveBorderColor', 'rgba(110, 168, 255, 1)'],\n ['frozenMarkerColor', 'rgba(222, 222, 222, 1)'],\n ['frozenMarkerBorderColor', 'rgba(168, 168, 168, 1)'],\n ['frozenMarkerBorderWidth', 1],\n ['frozenMarkerWidth', 2],\n ['gridBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['gridBorderCollapse', 'collapse'],\n ['gridBorderColor', 'rgba(202, 202, 202, 1)'],\n ['gridBorderWidth', 1],\n ['height', 'auto'],\n ['maxHeight', 'inherit'],\n ['maxWidth', 'inherit'],\n ['minColumnWidth', 45],\n ['minHeight', 'inherit'],\n ['minRowHeight', 24],\n ['minWidth', 'inherit'],\n ['mobileContextMenuMargin', 10],\n ['mobileEditInputHeight', 30],\n ['mobileEditFontFamily', 'sans-serif'],\n ['mobileEditFontSize', '16px'],\n ['moveOverlayBorderWidth', 1],\n ['moveOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['moveOverlayBorderSegments', '12, 7'],\n ['name', 'default'],\n ['overflowY', 'auto'],\n ['overflowX', 'auto'],\n ['reorderMarkerBackgroundColor', 'rgba(0, 0, 0, 0.1)'],\n ['reorderMarkerBorderColor', 'rgba(0, 0, 0, 0.2)'],\n ['reorderMarkerBorderWidth', 1.25],\n ['reorderMarkerIndexBorderColor', 'rgba(66, 133, 244, 1)'],\n ['reorderMarkerIndexBorderWidth', 2.75],\n ['rowHeaderCellBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['rowHeaderCellBorderColor', 'rgba(200, 200, 200, 1)'],\n ['rowHeaderCellBorderWidth', 1],\n ['rowHeaderCellColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellFont', '16px sans-serif'],\n ['rowHeaderCellHeight', 25],\n ['rowHeaderCellHorizontalAlignment', 'left'],\n ['rowHeaderCellHoverBackgroundColor', 'rgba(235, 235, 235, 1)'],\n ['rowHeaderCellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['rowHeaderCellPaddingBottom', 5],\n ['rowHeaderCellPaddingLeft', 5],\n ['rowHeaderCellPaddingRight', 5],\n ['rowHeaderCellPaddingTop', 5],\n ['rowHeaderCellRowNumberGapHeight', 5],\n ['rowHeaderCellRowNumberGapColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellSelectedBackgroundColor', 'rgba(217, 217, 217, 1)'],\n ['rowHeaderCellSelectedColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellVerticalAlignment', 'center'],\n ['rowHeaderCellWidth', 57],\n ['scrollBarActiveColor', 'rgba(125, 125, 125, 1)'],\n ['scrollBarBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['scrollBarBorderColor', 'rgba(202, 202, 202, 1)'],\n ['scrollBarBorderWidth', 0.5],\n ['scrollBarBoxBorderRadius', 4.125],\n ['scrollBarBoxColor', 'rgba(192, 192, 192, 1)'],\n ['scrollBarBoxMargin', 2],\n ['scrollBarBoxMinSize', 15],\n ['scrollBarBoxWidth', 8],\n ['scrollBarCornerBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['scrollBarCornerBorderColor', 'rgba(202, 202, 202, 1)'],\n ['scrollBarWidth', 11],\n ['selectionHandleBorderColor', 'rgba(255, 255, 255, 1)'],\n ['selectionHandleBorderWidth', 1.5],\n ['selectionHandleColor', 'rgba(66, 133, 244, 1)'],\n ['selectionHandleSize', 8],\n ['selectionHandleType', 'square'],\n ['selectionOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['selectionOverlayBorderWidth', 1],\n ['treeArrowBorderColor', 'rgba(195, 199, 202, 1)'],\n ['treeArrowBorderWidth', 1],\n ['treeArrowClickRadius', 5],\n ['treeArrowColor', 'rgba(155, 155, 155, 1)'],\n ['treeArrowHeight', 8],\n ['treeArrowMarginLeft', 0],\n ['treeArrowMarginRight', 5],\n ['treeArrowMarginTop', 6],\n ['treeArrowWidth', 13],\n ['treeGridHeight', 250],\n ['width', 'auto'],\n ],\n };\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport defaults from './defaults';\n\nexport default function () {\n var typeMap,\n component = {};\n component.dehyphenateProperty = function hyphenateProperty(prop) {\n prop = prop.replace('--cdg-', '');\n var p = '',\n nextLetterCap;\n Array.prototype.forEach.call(prop, function (char) {\n if (nextLetterCap) {\n nextLetterCap = false;\n p += char.toUpperCase();\n return;\n }\n if (char === '-') {\n nextLetterCap = true;\n return;\n }\n p += char;\n });\n return p;\n };\n component.hyphenateProperty = function hyphenateProperty(prop, cust) {\n var p = '';\n Array.prototype.forEach.call(prop, function (char) {\n if (char === char.toUpperCase()) {\n p += '-' + char.toLowerCase();\n return;\n }\n p += char;\n });\n return (cust ? '--cdg-' : '') + p;\n };\n function getDefaultItem(base, item) {\n var i = {},\n r;\n defaults(i);\n r = i.defaults[base].filter(function (i) {\n return (\n i[0].toLowerCase() === item.toLowerCase() ||\n component.hyphenateProperty(i[0]) === item.toLowerCase() ||\n component.hyphenateProperty(i[0], true) === item.toLowerCase()\n );\n })[0];\n return r;\n }\n component.applyComponentStyle = function (supressChangeAndDrawEvents, intf) {\n if (!intf.isComponent) {\n return;\n }\n var cStyle = window.getComputedStyle(\n intf.tagName === 'CANVAS-DATAGRID' ? intf : intf.canvas,\n null,\n ),\n defs = {};\n intf.computedStyle = cStyle;\n defaults(defs);\n defs = defs.defaults.styles;\n defs.forEach(function (def) {\n var val;\n val = cStyle.getPropertyValue(component.hyphenateProperty(def[0], true));\n if (val === '') {\n val = cStyle.getPropertyValue(\n component.hyphenateProperty(def[0], false),\n );\n }\n if (val !== '' && typeof val === 'string') {\n intf.setStyleProperty(\n def[0],\n typeMap[typeof def[1]](\n val.replace(/^\\s+/, '').replace(/\\s+$/, ''),\n def[1],\n ),\n true,\n );\n }\n });\n if (!supressChangeAndDrawEvents && intf.dispatchEvent) {\n requestAnimationFrame(function () {\n intf.resize(true);\n });\n intf.dispatchEvent('stylechanged', intf.style);\n }\n };\n typeMap = {\n data: function (strData) {\n try {\n return JSON.parse(strData);\n } catch (e) {\n throw new Error('Cannot read JSON data in canvas-datagrid data.');\n }\n },\n schema: function (strSchema) {\n try {\n return JSON.parse(strSchema);\n } catch (e) {\n throw new Error(\n 'Cannot read JSON data in canvas-datagrid schema attribute.',\n );\n }\n },\n number: function (strNum, def) {\n var n = parseInt(strNum, 10);\n return isNaN(n) ? def : n;\n },\n boolean: function (strBool) {\n return /true/i.test(strBool);\n },\n string: function (str) {\n return str;\n },\n };\n component.getObservableAttributes = function () {\n var i = {},\n attrs = ['data', 'schema', 'style', 'className', 'name'];\n defaults(i);\n i.defaults.attributes.forEach(function (attr) {\n attrs.push(attr[0].toLowerCase());\n });\n return attrs;\n };\n component.disconnectedCallback = function () {\n this.connected = false;\n };\n component.connectedCallback = function () {\n var intf = this;\n intf.parentDOMNode.innerHTML = '';\n intf.parentDOMNode.appendChild(intf.canvas);\n intf.connected = true;\n component.observe(intf);\n component.applyComponentStyle(true, intf);\n intf.resize(true);\n };\n component.adoptedCallback = function () {\n this.resize();\n };\n component.attributeChangedCallback = function (attrName, oldVal, newVal) {\n var tfn,\n intf = this,\n def;\n if (attrName === 'style') {\n component.applyComponentStyle(false, intf);\n return;\n }\n if (attrName === 'data') {\n if (intf.dataType === 'application/x-canvas-datagrid') {\n intf.dataType = 'application/json+x-canvas-datagrid';\n }\n intf.data = newVal;\n return;\n }\n if (attrName === 'schema') {\n intf.schema = typeMap.schema(newVal);\n return;\n }\n if (attrName === 'name') {\n intf.name = newVal;\n return;\n }\n if (attrName === 'class' || attrName === 'className') {\n return;\n }\n def = getDefaultItem('attributes', attrName);\n if (def) {\n tfn = typeMap[typeof def[1]];\n intf.attributes[def[0]] = tfn(newVal);\n return;\n }\n if (/^on/.test(attrName)) {\n intf.addEventListener('on' + attrName, Function('e', newVal));\n }\n return;\n };\n component.observe = function (intf) {\n var observer;\n if (!window.MutationObserver) {\n return;\n }\n intf.applyComponentStyle = function () {\n component.applyComponentStyle(false, intf);\n intf.resize();\n };\n /**\n * Applies the computed css styles to the grid. In some browsers, changing directives in attached style sheets does not automatically update the styles in this component. It is necessary to call this method to update in these cases.\n * @memberof canvasDatagrid\n * @name applyComponentStyle\n * @method\n */\n observer = new window.MutationObserver(function (mutations) {\n var checkInnerHTML, checkStyle;\n Array.prototype.forEach.call(mutations, function (mutation) {\n if (\n mutation.attributeName === 'class' ||\n mutation.attributeName === 'style'\n ) {\n checkStyle = true;\n return;\n }\n if (mutation.target.nodeName === 'STYLE') {\n checkStyle = true;\n return;\n }\n if (\n mutation.target.parentNode &&\n mutation.target.parentNode.nodeName === 'STYLE'\n ) {\n checkStyle = true;\n return;\n }\n if (\n mutation.target === intf &&\n (mutation.addedNodes.length > 0 || mutation.type === 'characterData')\n ) {\n checkInnerHTML = true;\n }\n });\n if (checkStyle) {\n intf.applyComponentStyle(false, intf);\n }\n if (checkInnerHTML) {\n if (intf.dataType === 'application/x-canvas-datagrid') {\n intf.dataType = 'application/json+x-canvas-datagrid';\n }\n intf.data = intf.innerHTML;\n }\n });\n observer.observe(intf, {\n characterData: true,\n childList: true,\n attributes: true,\n subtree: true,\n });\n Array.prototype.forEach.call(\n document.querySelectorAll('style'),\n function (el) {\n observer.observe(el, {\n characterData: true,\n childList: true,\n attributes: true,\n subtree: true,\n });\n },\n );\n };\n return component;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals XMLSerializer: false, define: true, Blob: false, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n var perfCounters = [],\n cachedImagesDrawn = false,\n drawCount = 0,\n perfWindowSize = 300,\n entityCount = [],\n hiddenFrozenColumnCount = 0,\n scrollDebugCounters = [],\n touchPPSCounters = [];\n self.htmlImageCache = {};\n // more heavyweight version than fillArray defined in intf.js\n function fillArray(low, high, step, def) {\n step = step || 1;\n var i = [],\n x;\n for (x = low; x <= high; x += step) {\n i[x] = def === undefined ? x : typeof def === 'function' ? def(x) : def;\n }\n return i;\n }\n function drawPerfLine(w, h, x, y, perfArr, arrIndex, max, color, useAbs) {\n var i = w / perfArr.length,\n r = h / max;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.moveTo(x, y + h);\n perfArr.forEach(function (n) {\n var val = arrIndex === undefined ? n : n[arrIndex],\n cx,\n cy;\n if (useAbs) {\n val = Math.abs(val);\n }\n cx = x + i;\n cy = y + h - val * r;\n self.ctx.lineTo(cx, cy);\n x += i;\n });\n self.ctx.moveTo(x + w, y + h);\n self.ctx.strokeStyle = color;\n self.ctx.stroke();\n }\n function drawOnAllImagesLoaded() {\n var loaded = true;\n Object.keys(self.htmlImageCache).forEach(function (html) {\n if (!self.htmlImageCache[html].img.complete) {\n loaded = false;\n }\n });\n if (loaded && !cachedImagesDrawn) {\n cachedImagesDrawn = true;\n self.draw();\n }\n }\n function drawHtml(cell) {\n var img,\n v = cell.innerHTML || cell.formattedValue,\n cacheKey =\n v.toString() + cell.rowIndex.toString() + cell.columnIndex.toString(),\n x = Math.round(cell.x + self.canvasOffsetLeft),\n y = Math.round(cell.y + self.canvasOffsetTop);\n if (self.htmlImageCache[cacheKey]) {\n img = self.htmlImageCache[cacheKey].img;\n if (\n self.htmlImageCache[cacheKey].height !== cell.height ||\n self.htmlImageCache[cacheKey].width !== cell.width\n ) {\n // height and width of the cell has changed, invalidate cache\n self.htmlImageCache[cacheKey] = undefined;\n } else {\n if (!img.complete) {\n return;\n }\n return self.ctx.drawImage(img, x, y);\n }\n } else {\n cachedImagesDrawn = false;\n }\n img = new Image(cell.width, cell.height);\n self.htmlImageCache[cacheKey] = {\n img,\n width: cell.width,\n height: cell.height,\n };\n img.onload = function () {\n self.ctx.drawImage(img, x, y);\n drawOnAllImagesLoaded();\n };\n img.src =\n 'data:image/svg+xml;base64,' +\n btoa(\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"' +\n cell.width +\n '\" height=\"' +\n cell.height +\n '\">\\n' +\n '<foreignObject class=\"node\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\">\\n' +\n '<body xmlns=\"http://www.w3.org/1999/xhtml\" style=\"margin:0;padding:0;\">\\n' +\n v +\n '\\n' +\n '</body>' +\n '</foreignObject>\\n' +\n '</svg>\\n',\n );\n }\n function drawOrderByArrow(x, y) {\n var mt = self.style.columnHeaderOrderByArrowMarginTop * self.scale,\n ml = self.style.columnHeaderOrderByArrowMarginLeft * self.scale,\n mr = self.style.columnHeaderOrderByArrowMarginRight * self.scale,\n aw = self.style.columnHeaderOrderByArrowWidth * self.scale,\n ah = self.style.columnHeaderOrderByArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.columnHeaderOrderByArrowColor;\n self.ctx.strokeStyle = self.style.columnHeaderOrderByArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n if (self.orderDirection === 'asc') {\n self.ctx.lineTo(x, y + ah);\n self.ctx.lineTo(x + aw, y + ah);\n self.ctx.lineTo(x + aw * 0.5, y);\n self.ctx.lineTo(x, y + ah);\n } else {\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n }\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw + mr;\n }\n function drawTreeArrow(cell, x, y) {\n var mt = self.style.treeArrowMarginTop * self.scale,\n mr = self.style.treeArrowMarginRight * self.scale,\n ml = self.style.treeArrowMarginLeft * self.scale,\n aw = self.style.treeArrowWidth * self.scale,\n ah = self.style.treeArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.treeArrowColor;\n self.ctx.strokeStyle = self.style.treeArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n if (self.openChildren[cell.rowIndex]) {\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n } else {\n self.ctx.lineTo(x, y);\n self.ctx.lineTo(x + ah, y + aw * 0.5);\n self.ctx.lineTo(x, y + aw);\n self.ctx.lineTo(x, y);\n }\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw + mr;\n }\n function drawFilterButtonArrow(x, y) {\n var mt =\n ((self.style.filterButtonHeight - self.style.filterButtonArrowHeight) /\n 2) *\n self.scale,\n ml =\n ((self.style.filterButtonWidth - self.style.filterButtonArrowWidth) /\n 2) *\n self.scale,\n aw = self.style.filterButtonArrowWidth * self.scale,\n ah = self.style.filterButtonArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.filterButtonArrowColor;\n self.ctx.strokeStyle = self.style.filterButtonArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw;\n }\n function radiusRect(x, y, w, h, radius) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n var r = x + w,\n b = y + h;\n self.ctx.beginPath();\n self.ctx.moveTo(x + radius, y);\n self.ctx.lineTo(r - radius, y);\n self.ctx.quadraticCurveTo(r, y, r, y + radius);\n self.ctx.lineTo(r, y + h - radius);\n self.ctx.quadraticCurveTo(r, b, r - radius, b);\n self.ctx.lineTo(x + radius, b);\n self.ctx.quadraticCurveTo(x, b, x, b - radius);\n self.ctx.lineTo(x, y + radius);\n self.ctx.quadraticCurveTo(x, y, x + radius, y);\n }\n function fillRect(x, y, w, h) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillRect(x, y, w, h);\n }\n function strokeRect(x, y, w, h) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.strokeRect(x, y, w, h);\n }\n function fillText(text, x, y) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillText(text, x, y);\n }\n function fillCircle(x, y, r) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.arc(x, y, r, 0, 2 * Math.PI);\n self.ctx.fill();\n }\n function strokeCircle(x, y, r) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.arc(x, y, r, 0, 2 * Math.PI);\n self.ctx.stroke();\n }\n function clipFrozenArea(mode) {\n // 0 both, 1 rows, 2 cols\n // self.lastFrozenColumnPixel;\n // self.lastFrozenRowPixel;\n self.ctx.beginPath();\n if (mode === 0) {\n self.ctx.moveTo(self.lastFrozenColumnPixel, self.lastFrozenRowPixel);\n self.ctx.lineTo(self.lastFrozenColumnPixel, self.height);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.width, self.lastFrozenRowPixel);\n }\n if (mode === 1) {\n self.ctx.moveTo(0, self.lastFrozenRowPixel);\n self.ctx.lineTo(0, self.height);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.width, self.lastFrozenRowPixel);\n }\n if (mode === 2) {\n self.ctx.moveTo(self.lastFrozenColumnPixel, 0);\n self.ctx.lineTo(self.width, 0);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.lastFrozenColumnPixel, self.height);\n }\n self.ctx.clip();\n }\n function fillHandle(x, y, r) {\n if (self.style.selectionHandleType === 'circle') {\n return fillCircle(x, y, r * 0.5);\n }\n fillRect(x - r * 0.5, y - r * 0.5, r, r);\n }\n function strokeHandle(x, y, r) {\n if (self.style.selectionHandleType === 'circle') {\n return strokeCircle(x, y, r * 0.5);\n }\n strokeRect(x - r * 0.5, y - r * 0.5, r, r);\n }\n function addselectionHandle(c, pos) {\n var hw = self.style.selectionHandleSize,\n p = {\n tr: function () {\n fillHandle(c.x + c.width, c.y, hw);\n strokeHandle(c.x + c.width, c.y, hw);\n },\n br: function () {\n fillHandle(c.x + c.width, c.y + c.height, hw);\n strokeHandle(c.x + c.width, c.y + c.height, hw);\n },\n tl: function () {\n fillHandle(c.x, c.y, hw);\n strokeHandle(c.x, c.y, hw);\n },\n bl: function () {\n fillHandle(c.x, c.y + c.height, hw);\n strokeHandle(c.x, c.y + c.height, hw);\n },\n };\n p[pos]();\n }\n function addBorderLine(c, pos) {\n self.ctx.beginPath();\n var p = {\n t: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop,\n );\n },\n r: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n b: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop + c.height,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n l: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n };\n p[pos]();\n self.ctx.stroke();\n }\n function addEllipsis(text, width) {\n var c,\n w = 0;\n if (self.ellipsisCache[text] && self.ellipsisCache[text][width]) {\n return self.ellipsisCache[text][width];\n }\n //TODO Add ellipsis back when there is a fast way to do it\n w = self.ctx.measureText(text).width;\n self.ellipsisCache[text] = self.ellipsisCache[text] || {};\n c = { value: text, width: w };\n self.ellipsisCache[text][width] = c;\n return c;\n }\n function wrapText(cell, splitChar) {\n if (!cell.formattedValue) {\n return {\n lines: [{ width: 0, value: '' }],\n width: 0,\n height: cell.calculatedLineHeight,\n };\n }\n var max = 0,\n n = '\\n',\n x,\n word,\n words = cell.formattedValue.split(splitChar),\n textHeight = cell.calculatedLineHeight,\n lines = [],\n out = [],\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n autoResize = self.attributes.autoResizeRows && wrap,\n elWidth,\n et = self.attributes.ellipsisText,\n elClipLength,\n plWidth,\n clippedVal,\n ogWordWidth,\n previousLine,\n line = {\n width: 0,\n value: '',\n },\n cHeight = wrap ? cell.paddedHeight : cell.calculatedLineHeight;\n lines.push(line);\n elWidth = self.ctx.measureText(' ' + et).width;\n for (x = 0; x < words.length; x += 1) {\n word = words[x];\n var curSplitChar = word[word.length - 1] === '-' ? '' : splitChar;\n var measure = self.ctx.measureText(word + curSplitChar);\n if (line.width + measure.width + elWidth < cell.paddedWidth) {\n line.value += word + curSplitChar;\n line.width += measure.width;\n continue;\n }\n // if there is a hyphenated word that is too long\n // split it and add the split set to the array\n // then back up and re-read new split set\n // this behavior seems right, it might not be\n if (/\\w-\\w/.test(word) && cell.paddedWidth < measure.width) {\n var arr = word.split('-');\n arr = arr.map((item, index) => {\n return index === arr.length - 1 ? item : item + '-';\n });\n words.splice(x, 1, ...arr);\n x -= 1;\n continue;\n }\n line = {\n width: measure.width,\n value: word + curSplitChar,\n };\n if (x === 0) {\n lines = [];\n lines.push(line);\n }\n textHeight += cell.calculatedLineHeight;\n if (textHeight > cHeight && !autoResize) {\n if (lines.length === 0) {\n break;\n }\n elClipLength = 1;\n previousLine = lines[lines.length - 1];\n if (previousLine.width < cell.paddedWidth && words.length === 1) {\n break;\n }\n clippedVal = previousLine.value + word;\n plWidth = self.ctx.measureText(clippedVal + et).width;\n var originText = clippedVal;\n if (plWidth > cell.paddedWidth) {\n var stepLength = parseInt(clippedVal.length / 2);\n var direction = -1;\n while (stepLength > 0) {\n clippedVal = originText.substr(\n 0,\n stepLength * direction + clippedVal.length,\n );\n plWidth = self.ctx.measureText(clippedVal + et).width;\n direction = plWidth > cell.paddedWidth ? -1 : 1;\n stepLength = parseInt(stepLength / 2);\n }\n }\n clippedVal =\n clippedVal + (originText.length != clippedVal.length ? et : '');\n previousLine.value = clippedVal;\n previousLine.width = plWidth;\n break;\n }\n if (x > 0) {\n lines.push(line);\n }\n }\n return {\n lines: lines,\n width: max,\n height: cell.calculatedLineHeight * lines.length,\n };\n }\n function drawText(cell) {\n var ll = cell.text.lines.length,\n h = cell.fontHeight * cell.lineHeight,\n x,\n line,\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n textHeight = 0;\n for (x = 0; x < cell.text.lines.length; x += 1) {\n line = cell.text.lines[x];\n var vPos =\n Math.max(\n (cell.height -\n (wrap ? cell.text.height : cell.calculatedLineHeight)) *\n 0.5,\n 0,\n ) + h,\n hPos = cell.paddingLeft + cell.treeArrowWidth + cell.orderByArrowWidth;\n if (cell.horizontalAlignment === 'right') {\n hPos = cell.paddingLeft + cell.paddedWidth - line.width;\n } else if (cell.horizontalAlignment === 'center') {\n hPos =\n cell.paddingLeft +\n (cell.paddedWidth + cell.paddingRight) / 2 -\n line.width / 2;\n }\n if (cell.verticalAlignment === 'top') {\n vPos = cell.calculatedLineHeight;\n } else if (cell.verticalAlignment === 'bottom') {\n vPos = cell.height - cell.paddingBottom - cell.text.height;\n }\n line.height = h + cell.lineSpacing;\n line.offsetLeft = hPos;\n line.offsetTop = vPos;\n line.x = cell.x + hPos;\n line.y = cell.y + textHeight + vPos;\n textHeight += line.height;\n fillText(line.value, line.x, line.y);\n }\n if (self.attributes.debug && cell.active) {\n requestAnimationFrame(function () {\n self.ctx.font = self.style.debugFont;\n self.ctx.fillStyle = self.style.debugColor;\n fillText(\n JSON.stringify(\n {\n x: cell.x,\n y: cell.y,\n h: cell.height,\n w: cell.width,\n pw: cell.paddedWidth,\n idx: cell.columnIndex,\n idx_ord: cell.sortColumnIndex,\n },\n null,\n '\\t',\n ),\n cell.x + 14,\n cell.y + 14,\n );\n fillText(\n JSON.stringify(\n cell.text.lines.map(function (l) {\n return { w: l.width, v: l.value.length };\n }),\n null,\n '\\t',\n ),\n cell.x + 14,\n cell.y + 30,\n );\n });\n }\n }\n function getFrozenColumnsWidth() {\n var w = 0,\n s = self.getSchema(),\n x = 0,\n n = Math.min(self.frozenColumn, s.length),\n column;\n hiddenFrozenColumnCount = 0;\n while (x < n) {\n column = s[x];\n if (column.hidden) {\n hiddenFrozenColumnCount += 1;\n } else {\n w += self.getColumnWidth(x);\n }\n x += 1;\n }\n return w;\n }\n /**\n * Redraws the grid. No matter what the change, this is the only method required to refresh everything.\n * @memberof canvasDatagrid\n * @name draw\n * @method\n */\n // r = literal row index\n // rd = row data array\n // i = user order index\n // o = literal data index\n // y = y drawing cursor\n // x = x drawing cursor\n // s = visible schema array\n // cx = current x drawing cursor sub calculation var\n // cy = current y drawing cursor sub calculation var\n // a = static cell (like corner cell)\n // p = perf counter\n // l = data length\n // u = current cell\n // h = current height\n // w = current width\n self.draw = function (internal) {\n if (self.dispatchEvent('beforedraw', {})) {\n return;\n }\n if (!self.isChildGrid && (!self.height || !self.width)) {\n return;\n }\n if (self.isChildGrid && internal) {\n requestAnimationFrame(self.parentGrid.draw);\n return;\n }\n if (self.intf.visible === false) {\n return;\n }\n // initial values\n var checkScrollHeight,\n rowHeaderCell,\n p,\n cx,\n cy,\n treeGrid,\n rowOpen,\n rowHeight,\n cornerCell,\n y,\n x,\n c,\n h,\n w,\n schema,\n rowIndex,\n rowData,\n aCell,\n viewData = self.viewData || [],\n bc = self.style.gridBorderCollapse === 'collapse',\n selectionBorders = [],\n moveBorders = [],\n selectionHandles = [],\n rowHeaders = [],\n l = viewData.length,\n u = self.currentCell || {},\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n cellHeight = self.style.cellHeight;\n drawCount += 1;\n p = performance.now();\n self.visibleRowHeights = [];\n // if data length has changed, there is no way to know\n if (viewData.length > self.orders.rows.length) {\n self.createRowOrders();\n }\n function drawScrollBars() {\n var drawCorner,\n en = self.scrollBox.entities,\n m = self.style.scrollBarBoxMargin * 2;\n self.ctx.strokeStyle = self.style.scrollBarBorderColor;\n self.ctx.lineWidth = self.style.scrollBarBorderWidth;\n if (self.frozenColumn > 0) {\n en.horizontalBox.x =\n rowHeaderCellWidth +\n self.style.scrollBarBoxMargin +\n self.scrollCache.x[self.frozenColumn - 1] +\n (en.horizontalBar.width -\n self.scrollCache.x[self.frozenColumn - 1] -\n self.scrollBox.scrollBoxWidth) *\n (self.scrollBox.scrollLeft / self.scrollBox.scrollWidth);\n } else {\n en.horizontalBox.x =\n rowHeaderCellWidth +\n self.style.scrollBarBoxMargin +\n (en.horizontalBar.width - self.scrollBox.scrollBoxWidth) *\n (self.scrollBox.scrollLeft / self.scrollBox.scrollWidth);\n }\n en.verticalBox.y =\n columnHeaderCellHeight +\n self.style.scrollBarBoxMargin +\n self.scrollCache.y[self.frozenRow] +\n (en.verticalBar.height -\n self.scrollBox.scrollBoxHeight -\n self.scrollCache.y[self.frozenRow]) *\n (self.scrollBox.scrollTop / self.scrollBox.scrollHeight);\n if (self.scrollBox.horizontalBarVisible) {\n self.ctx.fillStyle = self.style.scrollBarBackgroundColor;\n fillRect(\n en.horizontalBar.x,\n en.horizontalBar.y,\n en.horizontalBar.width + m,\n en.horizontalBar.height,\n );\n strokeRect(\n en.horizontalBar.x,\n en.horizontalBar.y,\n en.horizontalBar.width + m,\n en.horizontalBar.height,\n );\n self.ctx.fillStyle = self.style.scrollBarBoxColor;\n if (self.scrollBox.horizontalBoxVisible) {\n if (/horizontal/.test(u.context)) {\n self.ctx.fillStyle = self.style.scrollBarActiveColor;\n }\n radiusRect(\n en.horizontalBox.x,\n en.horizontalBox.y,\n en.horizontalBox.width,\n en.horizontalBox.height,\n self.style.scrollBarBoxBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n }\n drawCorner = true;\n self.visibleCells.unshift(en.horizontalBar);\n self.visibleCells.unshift(en.horizontalBox);\n }\n if (self.scrollBox.verticalBarVisible) {\n self.ctx.fillStyle = self.style.scrollBarBackgroundColor;\n fillRect(\n en.verticalBar.x,\n en.verticalBar.y,\n en.verticalBar.width,\n en.verticalBar.height + m,\n );\n strokeRect(\n en.verticalBar.x,\n en.verticalBar.y,\n en.verticalBar.width,\n en.verticalBar.height + m,\n );\n if (self.scrollBox.verticalBoxVisible) {\n self.ctx.fillStyle = self.style.scrollBarBoxColor;\n if (/vertical/.test(u.context)) {\n self.ctx.fillStyle = self.style.scrollBarActiveColor;\n }\n radiusRect(\n en.verticalBox.x,\n en.verticalBox.y,\n en.verticalBox.width,\n en.verticalBox.height,\n self.style.scrollBarBoxBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n }\n drawCorner = true;\n self.visibleCells.unshift(en.verticalBar);\n self.visibleCells.unshift(en.verticalBox);\n }\n if (drawCorner) {\n //corner\n self.ctx.strokeStyle = self.style.scrollBarCornerBorderColor;\n self.ctx.fillStyle = self.style.scrollBarCornerBackgroundColor;\n radiusRect(\n en.corner.x,\n en.corner.y,\n en.corner.width,\n en.corner.height,\n 0,\n );\n self.ctx.stroke();\n self.ctx.fill();\n self.visibleCells.unshift(en.corner);\n }\n }\n function createHandlesOverlayArray(cell) {\n if (self.attributes.allowMovingSelection || self.mobile) {\n if (\n cell.selectionBorderTop &&\n cell.selectionBorderRight &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'tr']);\n cell.selectionHandle = 'tr';\n }\n if (\n cell.selectionBorderTop &&\n cell.selectionBorderLeft &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'tl']);\n cell.selectionHandle = 'tl';\n }\n if (\n cell.selectionBorderBottom &&\n cell.selectionBorderLeft &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'bl']);\n cell.selectionHandle = 'bl';\n }\n if (\n cell.selectionBorderBottom &&\n cell.selectionBorderRight &&\n (self.attributes.selectionHandleBehavior !== 'none' || self.mobile)\n ) {\n selectionHandles.push([cell, 'br']);\n cell.selectionHandle = 'br';\n }\n }\n }\n function createBorderOverlayArray(\n cell,\n drawArray,\n propPrefix,\n offsetPoint,\n ) {\n offsetPoint = offsetPoint || { x: 0, y: 0 };\n cell.selectionBorder = '';\n if (\n !cell.isRowHeader &&\n self.selections[cell.rowIndex + -offsetPoint.y] &&\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) !== -1\n ) {\n if (\n (!self.selections[cell.rowIndex - 1 + -offsetPoint.y] ||\n self.selections[cell.rowIndex - 1 + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) === -1 ||\n cell.rowIndex === 0) &&\n !cell.isHeader\n ) {\n drawArray.push([cell, 't']);\n cell[propPrefix + 'BorderTop'] = true;\n cell[propPrefix + 'Border'] += 't';\n }\n if (\n !self.selections[cell.rowIndex + 1 + -offsetPoint.y] ||\n self.selections[cell.rowIndex + 1 + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) === -1\n ) {\n drawArray.push([cell, 'b']);\n cell[propPrefix + 'BorderBottom'] = true;\n cell[propPrefix + 'Border'] += 'b';\n }\n if (\n !self.selections[cell.rowIndex + -offsetPoint.y] ||\n cell.columnIndex === 0 ||\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex - 1 + -offsetPoint.x,\n ) === -1\n ) {\n drawArray.push([cell, 'l']);\n cell[propPrefix + 'BorderLeft'] = true;\n cell[propPrefix + 'Border'] += 'l';\n }\n if (\n !self.selections[cell.rowIndex + -offsetPoint.y] ||\n cell.columnIndex === schema.length ||\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex + 1 + -offsetPoint.x,\n ) === -1\n ) {\n drawArray.push([cell, 'r']);\n cell[propPrefix + 'BorderRight'] = true;\n cell[propPrefix + 'Border'] += 'r';\n }\n }\n }\n function drawCell(rowData, rowOrderIndex, rowIndex) {\n return function drawEach(header, headerIndex, columnOrderIndex) {\n if (header.hidden) {\n return 0;\n }\n var cellStyle = header.style || 'cell',\n cellGridAttributes,\n cell,\n isHeader = /HeaderCell/.test(cellStyle),\n isCorner = /cornerCell/.test(cellStyle),\n isRowHeader = 'rowHeaderCell' === cellStyle,\n isColumnHeader = 'columnHeaderCell' === cellStyle,\n isFilterable =\n self.filterable.rows.includes(rowIndex) &&\n self.filterable.columns.includes(headerIndex),\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n selected =\n self.selections[rowOrderIndex] &&\n self.selections[rowOrderIndex].indexOf(columnOrderIndex) !== -1,\n hovered =\n self.hovers.rowIndex === rowOrderIndex &&\n (self.attributes.hoverMode === 'row' ||\n self.hovers.columnIndex === columnOrderIndex),\n openedFilter =\n self.selectedFilterButton.rowIndex == rowIndex &&\n self.selectedFilterButton.columnIndex == headerIndex,\n active =\n self.activeCell.rowIndex === rowOrderIndex &&\n self.activeCell.columnIndex === columnOrderIndex,\n isColumnHeaderCellCap = cellStyle === 'columnHeaderCellCap',\n rawValue = rowData ? rowData[header.name] : undefined,\n isGrid = header.type === 'canvas-datagrid',\n activeHeader =\n (self.orders.rows[self.activeCell.rowIndex] === rowOrderIndex ||\n self.orders.columns[self.activeCell.columnIndex] ===\n headerIndex) &&\n (columnOrderIndex === -1 || rowOrderIndex === -1)\n ? isRowHeader\n ? 'activeRowHeaderCell'\n : 'activeColumnHeaderCell'\n : false,\n val,\n f = self.formatters[header.type || 'string'],\n orderByArrowSize = 0,\n treeArrowSize = 0,\n cellWidth = self.sizes.columns[headerIndex] || header.width,\n ev = {\n value: rawValue,\n row: rowData,\n header: header,\n };\n if (isColumnHeaderCellCap) {\n cellWidth = w - x;\n }\n // if no data or schema are defined, a width is provided to the stub column\n if (cellWidth === undefined) {\n cellWidth = self.style.cellWidth;\n }\n cellWidth = cellWidth * self.scale;\n if (x + cellWidth + self.style.cellBorderWidth < 0) {\n x += cellWidth + self.style.cellBorderWidth;\n }\n if (active && cellStyle !== 'cornerCell') {\n cellStyle = 'activeCell';\n }\n if (self.visibleRows.indexOf(rowIndex) === -1 && !isHeader) {\n self.visibleRows.push(rowIndex);\n }\n val = self.dispatchEvent('formatcellvalue', ev);\n cx = x;\n cy = y;\n if (cellStyle === 'cornerCell') {\n cx = 0;\n cy = 0;\n } else if (isRowHeader) {\n cx = 0;\n } else if (isHeader) {\n cy = 0;\n }\n cell = {\n type: isGrid ? 'canvas-datagrid-cell' : header.type,\n style: cellStyle,\n nodeType: 'canvas-datagrid-cell',\n x: cx,\n y: cy,\n fontHeight: (self.style[cellStyle + 'FontHeight'] || 0) * self.scale,\n horizontalAlignment: self.style[cellStyle + 'HorizontalAlignment'],\n verticalAlignment: self.style[cellStyle + 'VerticalAlignment'],\n paddingLeft:\n (self.style[cellStyle + 'PaddingLeft'] || 0) * self.scale,\n paddingTop: (self.style[cellStyle + 'PaddingTop'] || 0) * self.scale,\n paddingRight:\n (self.style[cellStyle + 'PaddingRight'] || 0) * self.scale,\n paddingBottom:\n (self.style[cellStyle + 'PaddingBottom'] || 0) * self.scale,\n whiteSpace: self.style.cellWhiteSpace,\n lineHeight: self.style.cellLineHeight,\n lineSpacing: self.style.cellLineSpacing,\n offsetTop: self.canvasOffsetTop + cy,\n offsetLeft: self.canvasOffsetLeft + cx,\n scrollTop: self.scrollBox.scrollTop,\n scrollLeft: self.scrollBox.scrollLeft,\n active: active || activeHeader,\n hovered: hovered,\n selected: selected,\n width: cellWidth,\n height: cellHeight,\n offsetWidth: cellWidth,\n offsetHeight: cellHeight,\n parentNode: self.intf.parentNode,\n offsetParent: self.intf.parentNode,\n data: rowData,\n isCorner: isCorner,\n isHeader: isHeader,\n isColumnHeader: isColumnHeader,\n isColumnHeaderCellCap: isColumnHeaderCellCap,\n isRowHeader: isRowHeader,\n isFilterable: isFilterable,\n openedFilter: openedFilter,\n rowOpen: rowOpen,\n header: header,\n\n columnIndex: columnOrderIndex,\n rowIndex: rowOrderIndex,\n\n viewRowIndex: rowOrderIndex,\n viewColumnIndex: columnOrderIndex,\n\n boundRowIndex: self.getBoundRowIndexFromViewRowIndex(rowOrderIndex),\n boundColumnIndex: self.getBoundColumnIndexFromViewColumnIndex(\n columnOrderIndex,\n ),\n\n sortColumnIndex: headerIndex,\n sortRowIndex: rowIndex,\n\n isGrid: isGrid,\n isNormal: !isGrid && !isCorner && !isHeader,\n gridId: (self.attributes.name || '') + rowIndex + ':' + headerIndex,\n parentGrid: self.intf,\n innerHTML: '',\n activeHeader: activeHeader,\n value:\n isHeader && !isRowHeader ? header.title || header.name : rawValue,\n };\n cell.calculatedLineHeight =\n cell.fontHeight * cell.lineHeight + cell.lineSpacing;\n cell.paddedWidth = cell.width - cell.paddingRight - cell.paddingLeft;\n cell.paddedHeight = cell.height - cell.paddingTop - cell.paddingBottom;\n ev.cell = cell;\n cell.userHeight = cell.isHeader ? self.sizes.rows[-1] : rowHeight;\n cell.userWidth = cell.isHeader\n ? self.sizes.columns.cornerCell\n : self.sizes.columns[headerIndex];\n self.visibleCells.unshift(cell);\n if (self.dispatchEvent('beforerendercell', ev)) {\n return;\n }\n self.ctx.fillStyle = self.style[cellStyle + 'BackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'BorderColor'];\n self.ctx.lineWidth = self.style[cellStyle + 'BorderWidth'];\n if (hovered) {\n self.ctx.fillStyle = self.style[cellStyle + 'HoverBackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'HoverBorderColor'];\n }\n if (selected) {\n self.ctx.fillStyle =\n self.style[cellStyle + 'SelectedBackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'SelectedBorderColor'];\n }\n if (activeHeader) {\n self.ctx.fillStyle = self.style[activeHeader + 'BackgroundColor'];\n }\n self.dispatchEvent('rendercell', ev);\n if (cell.isGrid) {\n if (cell.height !== rowHeight) {\n cell.height = rowHeight || self.style.cellHeightWithChildGrid;\n checkScrollHeight = true;\n }\n cell.width =\n self.sizes.columns[headerIndex] ||\n self.style.cellWidthWithChildGrid;\n }\n if (rowOpen && !cell.isRowHeader) {\n cell.height = self.sizes.rows[rowIndex] || self.style.cellHeight;\n }\n if (!cell.isGrid) {\n fillRect(cx, cy, cell.width, cell.height);\n strokeRect(cx, cy, cell.width, cell.height);\n }\n self.ctx.save();\n radiusRect(cell.x, cell.y, cell.width, cell.height, 0);\n self.ctx.clip();\n self.dispatchEvent('afterrendercell', ev);\n if (cell.height !== cellHeight && !(rowOpen && !cell.isRowHeader)) {\n self.sizes.rows[isHeader ? -1 : rowIndex] = cell.height;\n checkScrollHeight = true;\n }\n if (cell.width !== cellWidth) {\n self.sizes.columns[headerIndex] = cell.width;\n checkScrollHeight = true;\n }\n if (isRowHeader && self.attributes.tree) {\n if (!self.dispatchEvent('rendertreearrow', ev)) {\n treeArrowSize = drawTreeArrow(\n cell,\n self.style[cellStyle + 'PaddingLeft'],\n cy,\n 0,\n );\n }\n }\n if ((self.attributes.showRowNumbers && isRowHeader) || !isRowHeader) {\n if (cell.isGrid && !self.dispatchEvent('beforerendercellgrid', ev)) {\n if (!self.childGrids[cell.gridId]) {\n // HACK: this only allows setting of the child grids styles if data is set _after_\n // this is less than desirable. An interface needs to be made to effect the\n // style of all cell grids. One for individual grids already exists.\n cellGridAttributes = self.cellGridAttributes;\n cellGridAttributes.name = self.attributes.saveAppearance\n ? cell.gridId\n : undefined;\n cellGridAttributes.component = false;\n cellGridAttributes.parentNode = cell;\n cellGridAttributes.data = rawValue;\n ev.cellGridAttributes = cellGridAttributes;\n if (self.dispatchEvent('beforecreatecellgrid', ev)) {\n return;\n }\n self.childGrids[cell.gridId] = self.createGrid(\n cellGridAttributes,\n );\n self.sizes.rows[rowIndex] =\n self.sizes.rows[rowIndex] || self.style.cellGridHeight;\n checkScrollHeight = true;\n }\n cell.grid = self.childGrids[cell.gridId];\n cell.grid.parentNode = cell;\n cell.grid.visible = true;\n cell.grid.draw();\n self.dispatchEvent('rendercellgrid', ev);\n } else if (!cell.isGrid) {\n if (self.childGrids[cell.gridId]) {\n self.childGrids[cell.gridId].parentNode.offsetHeight = 0;\n }\n if (isHeader && self.orderBy === header.name) {\n if (!self.dispatchEvent('renderorderbyarrow', ev)) {\n orderByArrowSize = drawOrderByArrow(\n cx + self.style[cellStyle + 'PaddingLeft'],\n 0,\n );\n }\n }\n self.ctx.fillStyle = self.style[cellStyle + 'Color'];\n if (hovered) {\n self.ctx.fillStyle = self.style[cellStyle + 'HoverColor'];\n }\n if (selected) {\n self.ctx.fillStyle = self.style[cellStyle + 'SelectedColor'];\n }\n if (activeHeader) {\n self.ctx.fillStyle = self.style[activeHeader + 'Color'];\n }\n cell.treeArrowWidth = treeArrowSize;\n cell.orderByArrowWidth = orderByArrowSize;\n // create text ref to see if height needs to expand\n val = val !== undefined ? val : f ? f(ev) : '';\n if (val === undefined && !f) {\n val = '';\n console.warn(\n 'canvas-datagrid: Unknown format ' +\n header.type +\n ' add a cellFormater',\n );\n }\n cell.formattedValue = (val !== undefined && val !== null\n ? val\n : ''\n ).toString();\n if (\n self.columnFilters &&\n self.columnFilters[val] !== undefined &&\n isHeader\n ) {\n cell.formattedValue = self.attributes.filterTextPrefix + val;\n }\n self.ctx.font =\n self.style[cellStyle + 'FontHeight'] * self.scale +\n 'px ' +\n self.style[cellStyle + 'FontName'];\n if (!self.dispatchEvent('formattext', ev)) {\n cell.text = wrapText(cell, ' ');\n }\n if (!self.dispatchEvent('rendertext', ev)) {\n if (cell.innerHTML || header.type === 'html') {\n drawHtml(cell);\n } else {\n drawText(cell);\n }\n\n if (wrap && cell.text && cell.text.height > rowHeight) {\n self.sizes.rows[isHeader ? -1 : rowIndex] = cell.text.height;\n checkScrollHeight = true;\n }\n }\n }\n }\n if (active) {\n aCell = cell;\n }\n createBorderOverlayArray(cell, selectionBorders, 'selection');\n // createBorderOverlayArray calculates data for createHandlesOverlayArray so it must go 2nd\n createHandlesOverlayArray(cell);\n if (self.movingSelection) {\n createBorderOverlayArray(cell, moveBorders, 'move', self.moveOffset);\n }\n self.ctx.restore();\n\n if (isFilterable) {\n drawFilterButton(cell);\n }\n\n // Gaps may occur in row numbers between consecutively rendered rows\n // when we are filtering. We draw attention to this by drawing a thick\n // border overlapping the two consecutive row headers. If sorting, visible\n // row numbers stay the same (i.e. they don't correspond to the underlying\n // data's row number), so we do not show row gaps in that case.\n const isSorting =\n self.orderings.columns && self.orderings.columns.length > 0;\n\n if (\n isRowHeader &&\n self.attributes.showRowNumbers &&\n self.attributes.showRowNumberGaps &&\n isSorting === false\n ) {\n const previousRowNumber = self.getBoundRowIndexFromViewRowIndex(\n rowOrderIndex - 1,\n );\n const hasRowGap =\n previousRowNumber !== undefined &&\n cell.boundRowIndex > 0 &&\n cell.boundRowIndex - previousRowNumber > 1;\n\n if (hasRowGap) {\n const barHeight = self.style.rowHeaderCellRowNumberGapHeight;\n const barColor = self.style.rowHeaderCellRowNumberGapColor;\n\n self.ctx.save();\n\n self.ctx.fillStyle = barColor;\n\n fillRect(cell.x, cell.y - barHeight / 2, cell.width, barHeight);\n\n self.ctx.restore();\n }\n }\n\n x += cell.width + (bc ? 0 : self.style.cellBorderWidth);\n return cell.width;\n };\n }\n function drawFilterButton(cell, ev) {\n var posX = cell.x + cell.width - self.style.filterButtonWidth - 1;\n var posY = cell.y + cell.height - self.style.filterButtonHeight - 2;\n if (self.dispatchEvent('beforerenderfilterbutton', ev)) {\n return;\n }\n self.ctx.save();\n self.ctx.strokeStyle = self.style.filterButtonBorderColor;\n self.ctx.fillStyle = self.style.filterButtonBackgroundColor;\n if (cell.openedFilter) {\n self.ctx.fillStyle = self.style.filterButtonActiveBackgroundColor;\n } else if (cell.hovered && self.hovers.onFilterButton) {\n self.ctx.fillStyle = self.style.filterButtonHoverBackgroundColor;\n }\n radiusRect(\n posX,\n posY,\n self.style.filterButtonWidth,\n self.style.filterButtonHeight,\n self.style.filterButtonBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n drawFilterButtonArrow(posX, posY);\n self.ctx.clip();\n self.dispatchEvent('afterrenderfilterbutton', ev);\n self.ctx.restore();\n }\n function drawRowHeader(rowData, rowIndex, rowOrderIndex) {\n if (self.attributes.showRowHeaders) {\n x = 0;\n\n // When filtering we'd like to display the actual row numbers,\n // as it is in the unfiltered data, instead of simply the viewed\n // row index + 1. If rowIndex > viewData.length, it's a new row\n // added to the end, and we want to render that new row's number\n const filteredRowNumber =\n self.viewData && rowIndex < self.viewData.length\n ? self.getBoundRowIndexFromViewRowIndex(rowIndex) + 1\n : self.originalData\n ? self.originalData.length + 1\n : rowOrderIndex + 1;\n\n const rowHeaderValue = self.hasActiveFilters()\n ? filteredRowNumber\n : rowIndex + 1;\n\n const rowHeaderCell = { rowHeaderCell: rowHeaderValue };\n const headerDescription = {\n name: 'rowHeaderCell',\n width: self.sizes.columns[-1] || self.style.rowHeaderCellWidth,\n style: 'rowHeaderCell',\n type: 'string',\n data: rowHeaderValue,\n index: -1,\n };\n rowOpen = self.openChildren[rowIndex];\n drawCell(rowHeaderCell, rowOrderIndex, rowIndex)(\n headerDescription,\n -1,\n -1,\n );\n }\n }\n function drawHeaders() {\n var d,\n g = schema.length,\n i,\n o,\n columnHeaderCell,\n header,\n nonFrozenHeaderWidth;\n function drawHeaderColumnRange(start, end) {\n end = Math.min(end, g);\n for (o = start; o < end; o += 1) {\n i = self.orders.columns[o];\n header = schema[i];\n if (!header.hidden) {\n d = {\n title: header.title,\n name: header.name,\n width: header.width || self.style.cellWidth,\n style: 'columnHeaderCell',\n type: 'string',\n index: o,\n order: i,\n };\n columnHeaderCell = {\n columnHeaderCell: header.title || header.name,\n };\n x += drawCell(columnHeaderCell, -1, -1)(d, i, o);\n if (x > self.width + self.scrollBox.scrollLeft) {\n break;\n }\n }\n }\n }\n rowHeaders.forEach(function (rArgs, rhIndex) {\n y = rArgs[3];\n cellHeight = rArgs[4];\n if (rhIndex === self.frozenRow) {\n self.ctx.save();\n radiusRect(\n 0,\n self.lastFrozenRowPixel,\n self.width,\n self.height - self.lastFrozenRowPixel,\n 0,\n );\n self.ctx.clip();\n }\n drawRowHeader(rArgs[0], rArgs[1], rArgs[2]);\n });\n self.ctx.restore();\n if (self.attributes.showColumnHeaders) {\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.columnHeaderCellBorderWidth;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n y = 0;\n // cell height might have changed during drawing\n cellHeight = self.getColumnHeaderCellHeight();\n drawHeaderColumnRange(self.scrollIndexLeft, g);\n nonFrozenHeaderWidth = x;\n x = self.style.columnHeaderCellBorderWidth;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n drawHeaderColumnRange(0, self.frozenColumn);\n // fill in the space right of the headers\n x = nonFrozenHeaderWidth;\n if (x < w) {\n c = {\n name: '',\n width: self.style.scrollBarWidth,\n style: 'columnHeaderCellCap',\n isColumnHeaderCell: true,\n isColumnHeaderCellCap: true,\n type: 'string',\n index: schema.length,\n };\n drawCell({ endCap: '' }, -1, -1)(c, -1, -1);\n }\n // fill in the space right of the headers\n if (self.attributes.showRowHeaders) {\n cornerCell = { cornerCell: '' };\n x = 0;\n c = {\n name: 'cornerCell',\n width: self.style.rowHeaderCellWidth,\n style: 'cornerCell',\n type: 'string',\n index: -1,\n };\n drawCell(cornerCell, -1, -1)(c, -1, -1);\n }\n }\n }\n function drawRow(rowOrderIndex, rowIndex) {\n var headerIndex,\n treeHeight,\n rowSansTreeHeight,\n columnOrderIndex,\n g = schema.length;\n if (y - cellHeight * 2 > h) {\n return false;\n }\n rowData = viewData[rowOrderIndex];\n rowOpen = self.openChildren[rowOrderIndex];\n rowSansTreeHeight =\n (self.sizes.rows[rowOrderIndex] || self.style.cellHeight) * self.scale;\n treeHeight = (rowOpen ? self.sizes.trees[rowOrderIndex] : 0) * self.scale;\n rowHeight = rowSansTreeHeight + treeHeight;\n if (y < -rowHeight) {\n return false;\n }\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n cellHeight = rowHeight;\n //draw normal columns\n for (\n columnOrderIndex = self.scrollIndexLeft;\n columnOrderIndex < g;\n columnOrderIndex += 1\n ) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(rowData, rowOrderIndex, rowIndex)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n if (x > self.width) {\n self.scrollIndexRight = columnOrderIndex;\n self.scrollPixelRight = x;\n break;\n }\n }\n //draw frozen columns\n x = 0;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n for (\n columnOrderIndex = 0;\n columnOrderIndex < self.frozenColumn;\n columnOrderIndex += 1\n ) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(rowData, rowOrderIndex, rowIndex)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n if (x > self.width) {\n break;\n }\n }\n self.lastFrozenColumnPixel = x;\n // cell height might have changed during drawing\n cellHeight = rowHeight;\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n // don't draw a tree for the new row\n treeGrid = self.childGrids[rowOrderIndex];\n if (rowOrderIndex !== viewData.length && rowOpen) {\n treeGrid.visible = true;\n treeGrid.parentNode = {\n offsetTop: y + rowSansTreeHeight + self.canvasOffsetTop,\n offsetLeft: rowHeaderCellWidth - 1 + self.canvasOffsetLeft,\n offsetHeight: treeHeight,\n offsetWidth:\n self.width - rowHeaderCellWidth - self.style.scrollBarWidth - 1,\n offsetParent: self.intf.parentNode,\n parentNode: self.intf.parentNode,\n style: self.style,\n nodeType: 'canvas-datagrid-tree',\n scrollTop: self.scrollBox.scrollTop,\n scrollLeft: self.scrollBox.scrollLeft,\n rowIndex: rowOrderIndex,\n };\n self.visibleCells.unshift({\n rowIndex: rowOrderIndex,\n columnIndex: 0,\n y: treeGrid.parentNode.offsetTop,\n x: treeGrid.parentNode.offsetLeft,\n height: treeGrid.height,\n width: treeGrid.width,\n style: 'tree-grid',\n type: treeGrid.parentNode.nodeType,\n });\n treeGrid.draw();\n } else if (treeGrid) {\n treeGrid.parentNode.offsetHeight = 0;\n delete self.sizes.trees[rowOrderIndex];\n }\n rowHeaders.push([rowData, rowOrderIndex, rowIndex, y, rowHeight]);\n self.visibleRowHeights[rowOrderIndex] = rowHeight;\n y += cellHeight + (bc ? 0 : self.style.cellBorderWidth);\n return true;\n }\n function initDraw() {\n self.visibleRows = [];\n schema = self.getSchema();\n self.visibleCells = [];\n self.canvasOffsetTop = self.isChildGrid ? self.parentNode.offsetTop : 0.5;\n self.canvasOffsetLeft = self.isChildGrid\n ? self.parentNode.offsetLeft\n : -0.5;\n h = self.height;\n w = self.width;\n }\n function drawBackground() {\n radiusRect(0, 0, w, h, 0);\n self.ctx.clip();\n self.ctx.fillStyle = self.style.gridBackgroundColor;\n fillRect(0, 0, w, h);\n }\n function drawFrozenRows() {\n var rowOrderIndex,\n ln = Math.min(viewData.length, self.frozenRow);\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n y = columnHeaderCellHeight;\n for (rowIndex = 0; rowIndex < ln; rowIndex += 1) {\n rowOrderIndex = self.orders.rows[rowIndex];\n if (!drawRow(rowOrderIndex, rowIndex)) {\n break;\n }\n }\n if (self.attributes.allowFreezingRows) {\n // HACK great, another stupid magic number.\n // Background will appear as a 0.5px artifact behind the row freeze bar without this hack\n y +=\n self.style.frozenMarkerBorderWidth +\n self.style.frozenMarkerWidth -\n 0.4999999999;\n }\n self.lastFrozenRowPixel = y;\n }\n function drawRows() {\n self.ctx.save();\n if (self.frozenRow > 0) {\n radiusRect(\n 0,\n self.lastFrozenRowPixel,\n self.width,\n self.height - self.lastFrozenRowPixel,\n 0,\n );\n self.ctx.clip();\n }\n var columnOrderIndex,\n rowOrderIndex,\n headerIndex,\n g = schema.length;\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n if (!self.attributes.snapToRow) {\n y +=\n -self.scrollBox.scrollTop +\n self.scrollPixelTop +\n self.style.cellBorderWidth;\n }\n for (\n rowIndex = self.frozenRow + self.scrollIndexTop;\n rowIndex < l;\n rowIndex += 1\n ) {\n rowOrderIndex = self.orders.rows[rowIndex];\n self.scrollIndexBottom = rowIndex;\n self.scrollPixelBottom = y;\n if (!drawRow(rowOrderIndex, rowIndex)) {\n break;\n }\n }\n if (self.attributes.showNewRow) {\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n rowHeight = cellHeight = self.style.cellHeight;\n rowOpen = false;\n for (\n columnOrderIndex = self.scrollIndexLeft;\n columnOrderIndex < g;\n columnOrderIndex += 1\n ) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(self.newRow, viewData.length, viewData.length)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n if (x > self.width + self.scrollBox.scrollLeft) {\n break;\n }\n }\n rowHeaders.push([\n self.newRow,\n viewData.length,\n viewData.length,\n y,\n rowHeight,\n ]);\n }\n self.ctx.restore();\n }\n function drawMoveMarkers() {\n if (!self.movingSelection) {\n return;\n }\n self.ctx.lineWidth = self.style.moveOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.moveOverlayBorderColor;\n self.ctx.setLineDash(self.style.moveOverlayBorderSegments);\n moveBorders.forEach(function (c) {\n addBorderLine(c[0], c[1]);\n });\n self.ctx.setLineDash([]);\n }\n function drawReorderMarkers() {\n if (!self.reorderObject) {\n return;\n }\n var b = {\n height: self.reorderObject.height,\n width: self.reorderObject.width,\n x: self.reorderObject.x + self.reorderObject.dragOffset.x,\n y: self.reorderObject.y + self.reorderObject.dragOffset.y,\n },\n m = {\n width: w,\n height: h,\n x: 0,\n y: 0,\n };\n self.ctx.fillStyle = self.style.reorderMarkerBackgroundColor;\n self.ctx.lineWidth = self.style.reorderMarkerBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerBorderColor;\n if (self.dragMode === 'row-reorder') {\n for (var k = 0; k < self.selections.length; k++) {\n if (!self.selections[k] || k == self.reorderObject.rowIndex) continue;\n b.height += self.getRowHeight(k);\n }\n b.width = w;\n b.x = 0;\n m.width = w;\n m.height = self.currentCell.height;\n m.y = self.currentCell.y;\n fillRect(b.x, b.y, b.width, b.height);\n strokeRect(b.x, b.y, b.width, b.height);\n self.ctx.lineWidth = self.style.reorderMarkerIndexBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerIndexBorderColor;\n if (\n self.currentCell.rowIndex !== self.reorderObject.rowIndex &&\n self.currentCell.rowIndex > -1 &&\n self.currentCell.rowIndex < l\n ) {\n addBorderLine(\n m,\n self.reorderTarget.sortRowIndex > self.reorderObject.sortRowIndex\n ? 'b'\n : 't',\n );\n }\n } else if (self.dragMode === 'column-reorder' && self.reorderObject) {\n var selectedColumns = self.selections[0];\n for (var k = 1; k < selectedColumns.length; k++) {\n b.width += self.getColumnWidth(\n self.orders.columns[selectedColumns[k]],\n );\n }\n b.height = h;\n b.y = 0;\n m.height = h;\n m.width = self.currentCell.width;\n m.y = 0;\n m.x = self.currentCell.x;\n fillRect(b.x, b.y, b.width, b.height);\n strokeRect(b.x, b.y, b.width, b.height);\n self.ctx.lineWidth = self.style.reorderMarkerIndexBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerIndexBorderColor;\n if (\n self.currentCell.sortColumnIndex !==\n self.reorderObject.sortColumnIndex &&\n self.currentCell.sortColumnIndex > -1 &&\n self.currentCell.sortColumnIndex < schema.length\n ) {\n addBorderLine(\n m,\n self.reorderTarget.columnIndex > self.reorderObject.columnIndex\n ? 'r'\n : 'l',\n );\n }\n }\n }\n function drawBorder() {\n self.ctx.lineWidth = self.style.gridBorderWidth;\n self.ctx.strokeStyle = self.style.gridBorderColor;\n strokeRect(0, 0, self.width, self.height);\n }\n function drawSelectionBorders() {\n self.ctx.lineWidth = self.style.selectionOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.selectionOverlayBorderColor;\n function dsb(c) {\n addBorderLine(c[0], c[1]);\n }\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex < self.frozenRow &&\n c[0].columnIndex < self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.save();\n clipFrozenArea(0);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex >= self.frozenRow &&\n c[0].columnIndex >= self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n self.ctx.save();\n clipFrozenArea(1);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex >= self.frozenRow &&\n c[0].columnIndex < self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n self.ctx.save();\n clipFrozenArea(2);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex < self.frozenRow &&\n c[0].columnIndex >= self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n }\n function drawSelectionHandles() {\n if (self.mobile || self.attributes.allowMovingSelection) {\n self.ctx.lineWidth = self.style.selectionHandleBorderWidth;\n self.ctx.strokeStyle = self.style.selectionHandleBorderColor;\n self.ctx.fillStyle = self.style.selectionHandleColor;\n selectionHandles.forEach(function (c) {\n addselectionHandle(c[0], c[1]);\n var az = self.attributes.touchSelectHandleZone / 2,\n ax =\n c[0].x + (c[1] === 'tl' || c[1] === 'bl' ? 0 : c[0].width) - az,\n ay =\n c[0].y + (c[1] === 'bl' || c[1] === 'br' ? c[0].height : 0) - az;\n self.visibleCells.unshift({\n x: ax,\n y: ay,\n height: self.style.selectionHandleSize + az,\n width: self.style.selectionHandleSize + az,\n style: 'selection-handle-' + c[1],\n });\n });\n }\n }\n function drawActiveCell() {\n if (!aCell) {\n return;\n }\n self.ctx.save();\n var cl =\n self.activeCell.columnIndex + 1 > self.frozenColumn ||\n self.activeCell.rowIndex + 1 > self.frozenRow,\n acx = cl ? self.lastFrozenColumnPixel : 0,\n acy = cl ? self.lastFrozenRowPixel : 0,\n acw = cl ? self.width - self.lastFrozenColumnPixel : self.width,\n ach = cl ? self.height - self.lastFrozenRowPixel : self.height;\n radiusRect(acx, acy, acw, ach, 0);\n self.ctx.clip();\n if (self.attributes.selectionMode === 'row') {\n if (self.activeCell && self.activeCell.rowIndex === aCell.rowIndex) {\n self.ctx.lineWidth = self.style.activeCellOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.activeCellOverlayBorderColor;\n strokeRect(\n 1,\n aCell.y,\n self.getHeaderWidth() + rowHeaderCellWidth,\n self.visibleRowHeights[aCell.rowIndex],\n );\n }\n } else {\n self.ctx.lineWidth = self.style.activeCellOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.activeCellOverlayBorderColor;\n strokeRect(aCell.x, aCell.y, aCell.width, aCell.height);\n }\n self.ctx.restore();\n }\n function drawFrozenMarkers() {\n var my = self.lastFrozenRowPixel - self.style.frozenMarkerWidth,\n mx = self.lastFrozenColumnPixel - self.style.frozenMarkerBorderWidth,\n xHover =\n self.currentCell && self.currentCell.style === 'frozen-row-marker',\n yHover =\n self.currentCell && self.currentCell.style === 'frozen-column-marker';\n self.ctx.lineWidth = self.style.frozenMarkerBorderWidth;\n if (self.attributes.allowFreezingColumns) {\n self.ctx.fillStyle = yHover\n ? self.style.frozenMarkerHoverColor\n : self.style.frozenMarkerColor;\n self.ctx.strokeStyle = yHover\n ? self.style.frozenMarkerHoverBorderColor\n : self.style.frozenMarkerBorderColor;\n fillRect(mx, 0, self.style.frozenMarkerWidth, self.height);\n strokeRect(mx, 0, self.style.frozenMarkerWidth, self.height);\n self.visibleCells.unshift({\n x: mx,\n y: 0,\n height: self.height,\n width:\n self.style.frozenMarkerWidth + self.style.frozenMarkerBorderWidth,\n style: 'frozen-column-marker',\n });\n }\n if (self.attributes.allowFreezingRows) {\n self.ctx.fillStyle = xHover\n ? self.style.frozenMarkerHoverColor\n : self.style.frozenMarkerColor;\n self.ctx.strokeStyle = xHover\n ? self.style.frozenMarkerHoverBorderColor\n : self.style.frozenMarkerBorderColor;\n fillRect(0, my, self.width, self.style.frozenMarkerWidth);\n strokeRect(0, my, self.width, self.style.frozenMarkerWidth);\n self.visibleCells.unshift({\n x: 0,\n y: my,\n height:\n self.style.frozenMarkerWidth + self.style.frozenMarkerBorderWidth,\n width: self.width,\n style: 'frozen-row-marker',\n });\n }\n if (self.freezeMarkerPosition) {\n self.ctx.fillStyle = self.style.frozenMarkerActiveColor;\n self.ctx.strokeStyle = self.style.frozenMarkerActiveBorderColor;\n if (self.dragMode === 'frozen-column-marker') {\n fillRect(\n self.freezeMarkerPosition.x,\n 0,\n self.style.frozenMarkerWidth,\n self.height,\n );\n strokeRect(\n self.freezeMarkerPosition.x,\n 0,\n self.style.frozenMarkerWidth,\n self.height,\n );\n } else {\n fillRect(\n 0,\n self.freezeMarkerPosition.y,\n self.width,\n self.style.frozenMarkerWidth,\n );\n strokeRect(\n 0,\n self.freezeMarkerPosition.y,\n self.width,\n self.style.frozenMarkerWidth,\n );\n }\n }\n }\n function drawPerfLines() {\n if (!self.attributes.showPerformance) {\n return;\n }\n var pw = 250,\n px =\n self.width -\n pw -\n self.style.scrollBarWidth -\n self.style.scrollBarBorderWidth * 2,\n py = columnHeaderCellHeight,\n ph = 100;\n if (scrollDebugCounters.length === 0) {\n scrollDebugCounters = fillArray(0, perfWindowSize, 1, function () {\n return [0, 0];\n });\n }\n if (touchPPSCounters.length === 0) {\n touchPPSCounters = fillArray(0, perfWindowSize, 1, function () {\n return [0, 0];\n });\n }\n if (entityCount.length === 0) {\n entityCount = fillArray(0, perfWindowSize, 1, 0);\n }\n self.ctx.lineWidth = 0.5;\n function dpl(name, perfArr, arrIndex, max, color, useAbs, rowIndex) {\n var v;\n drawPerfLine(pw, ph, px, py, perfArr, arrIndex, max, color, useAbs);\n self.ctx.fillStyle = color;\n fillRect(3 + px, py + 9 + rowIndex * 11, 8, 8);\n self.ctx.fillStyle = self.style.debugPerfChartTextColor;\n v = arrIndex !== undefined ? perfArr[0][arrIndex] : perfArr[0];\n fillText(\n name + ' ' + (isNaN(v) ? 0 : v).toFixed(3),\n 14 + px,\n py + 16 + rowIndex * 11,\n );\n }\n self.ctx.textAlign = 'left';\n self.ctx.font = self.style.debugFont;\n self.ctx.fillStyle = self.style.debugPerfChartBackground;\n fillRect(px, py, pw, ph);\n [\n [\n 'Scroll Height',\n scrollDebugCounters,\n 0,\n self.scrollBox.scrollHeight,\n self.style.debugScrollHeightColor,\n false,\n ],\n [\n 'Scroll Width',\n scrollDebugCounters,\n 1,\n self.scrollBox.scrollWidth,\n self.style.debugScrollWidthColor,\n false,\n ],\n [\n 'Performance',\n perfCounters,\n undefined,\n 200,\n self.style.debugPerformanceColor,\n false,\n ],\n [\n 'Entities',\n entityCount,\n undefined,\n 1500,\n self.style.debugEntitiesColor,\n false,\n ],\n [\n 'TouchPPSX',\n touchPPSCounters,\n 0,\n 1000,\n self.style.debugTouchPPSXColor,\n true,\n ],\n [\n 'TouchPPSY',\n touchPPSCounters,\n 1,\n 1000,\n self.style.debugTouchPPSYColor,\n true,\n ],\n ].forEach(function (i, index) {\n i.push(index);\n dpl.apply(null, i);\n });\n self.ctx.fillStyle = self.style.debugPerfChartBackground;\n entityCount.pop();\n entityCount.unshift(self.visibleCells.length);\n scrollDebugCounters.pop();\n scrollDebugCounters.unshift([\n self.scrollBox.scrollTop,\n self.scrollBox.scrollLeft,\n ]);\n touchPPSCounters.pop();\n touchPPSCounters.unshift([self.yPPS, self.xPPS]);\n }\n function drawDebug() {\n self.ctx.save();\n var d;\n if (self.attributes.showPerformance || self.attributes.debug) {\n if (perfCounters.length === 0) {\n perfCounters = fillArray(0, perfWindowSize, 1, 0);\n }\n perfCounters.pop();\n perfCounters.unshift(performance.now() - p);\n }\n if (!self.attributes.debug) {\n self.ctx.restore();\n return;\n }\n self.ctx.font = self.style.debugFont;\n d = {};\n d.perf = (\n perfCounters.reduce(function (a, b) {\n return a + b;\n }, 0) / Math.min(drawCount, perfCounters.length)\n ).toFixed(1);\n d.perfDelta = perfCounters[0].toFixed(1);\n d.frozenColumnsWidth = getFrozenColumnsWidth();\n d.htmlImages = Object.keys(self.htmlImageCache).length;\n d.reorderObject =\n 'x: ' +\n (self.reorderObject || { columnIndex: 0 }).columnIndex +\n ', y: ' +\n (self.reorderObject || { rowIndex: 0 }).rowIndex;\n d.reorderTarget =\n 'x: ' +\n (self.reorderTarget || { columnIndex: 0 }).columnIndex +\n ', y: ' +\n (self.reorderTarget || { rowIndex: 0 }).rowIndex;\n d.scale = self.scale;\n d.startScale = self.startScale;\n d.scaleDelta = self.scaleDelta;\n d.zoomDeltaStart = self.zoomDeltaStart;\n d.touchLength = self.touchLength;\n d.touches =\n 'y0: ' +\n (self.touchPosition || { y: 0 }).y +\n ' y1: ' +\n (self.touchPosition1 || { y: 0 }).y;\n d.scrollBox = self.scrollBox.toString();\n d.scrollIndex =\n 'x: ' + self.scrollIndexLeft + ', y: ' + self.scrollIndexTop;\n d.scrollPixel =\n 'x: ' + self.scrollPixelLeft + ', y: ' + self.scrollPixelTop;\n d.canvasOffset =\n 'x: ' + self.canvasOffsetLeft + ', y: ' + self.canvasOffsetTop;\n d.touchDelta = 'x: ' + self.touchDelta.x + ', y: ' + self.touchDelta.y;\n d.touchAnimateTo =\n 'x: ' + self.touchAnimateTo.x + ', y: ' + self.touchAnimateTo.y;\n d.scrollAnimation =\n 'x: ' + self.scrollAnimation.x + ', y: ' + self.scrollAnimation.y;\n d.touchPPS = 'x: ' + self.xPPS + ', y: ' + self.yPPS;\n d.touchPPST = 'x: ' + self.xPPST + ', y: ' + self.yPPST;\n d.touchDuration = self.touchDuration;\n d.pointerLockPosition = self.pointerLockPosition\n ? self.pointerLockPosition.x + ', ' + self.pointerLockPosition.y\n : '';\n d.size = 'w: ' + self.width + ', h: ' + self.height;\n d.mouse = 'x: ' + self.mouse.x + ', y: ' + self.mouse.y;\n d.touch = !self.touchStart\n ? ''\n : 'x: ' + self.touchStart.x + ', y: ' + self.touchStart.y;\n d.entities = self.visibleCells.length;\n d.hasFocus = self.hasFocus;\n d.dragMode = self.dragMode;\n if (self.currentCell) {\n d.columnIndex = self.currentCell.columnIndex;\n d.rowIndex = self.currentCell.rowIndex;\n d.sortColumnIndex = self.currentCell.sortColumnIndex;\n d.sortRowIndex = self.currentCell.sortRowIndex;\n d.context = self.currentCell.context;\n d.dragContext = self.currentCell.dragContext;\n d.style = self.currentCell.style;\n d.type = self.currentCell.type;\n }\n self.ctx.textAlign = 'right';\n self.ctx.fillStyle = self.style.debugBackgroundColor;\n fillRect(0, 0, self.width, self.height);\n Object.keys(d).forEach(function (key, index) {\n var m = key + ': ' + d[key],\n lh = 14;\n self.ctx.fillStyle = self.style.debugColor;\n fillText(\n m,\n w - 20,\n (self.attributes.showPerformance ? 140 : 24) + index * lh,\n );\n });\n self.ctx.restore();\n }\n self.ctx.save();\n initDraw();\n drawBackground();\n drawFrozenRows();\n drawRows();\n drawActiveCell();\n drawHeaders();\n drawFrozenMarkers();\n drawSelectionHandles();\n drawReorderMarkers();\n drawMoveMarkers();\n drawBorder();\n drawSelectionBorders();\n drawScrollBars();\n if (checkScrollHeight) {\n self.resize(true);\n }\n drawDebug();\n drawPerfLines();\n if (self.dispatchEvent('afterdraw', {})) {\n return;\n }\n self.ctx.restore();\n };\n}\n","module.exports=function(e){var o={};function a(t){if(o[t])return o[t].exports;var r=o[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,a),r.l=!0,r.exports}return a.m=e,a.c=o,a.d=function(e,o,t){a.o(e,o)||Object.defineProperty(e,o,{enumerable:!0,get:t})},a.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},a.t=function(e,o){if(1&o&&(e=a(e)),8&o)return e;if(4&o&&\"object\"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(a.r(t),Object.defineProperty(t,\"default\",{enumerable:!0,value:e}),2&o&&\"string\"!=typeof e)for(var r in e)a.d(t,r,function(o){return e[o]}.bind(null,r));return t},a.n=function(e){var o=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(o,\"a\",o),o},a.o=function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},a.p=\"\",a(a.s=0)}([function(e,o,a){\"use strict\";Object.defineProperty(o,\"__esModule\",{value:!0});var t=a(1),r=Object.keys(t.default).reduce((function(e,o){return e.concat(t.default[o])}),[]);o.default=function(e){return-1===r.indexOf(e.key)}},function(e,o,a){\"use strict\";Object.defineProperty(o,\"__esModule\",{value:!0});o.default={modifier:[\"Alt\",\"AltGraph\",\"CapsLock\",\"Control\",\"Fn\",\"FnLock\",\"Meta\",\"NumLock\",\"ScrollLock\",\"Shift\",\"Symbol\",\"SymbolLock\"],legacyModifier:[\"Hyper\",\"Super\"],whiteSpace:[\"Enter\",\"Tab\"],navigation:[\"ArrowDown\",\"ArrowLeft\",\"ArrowRight\",\"ArrowUp\",\"End\",\"Home\",\"PageDown\",\"PageUp\"],editing:[\"Backspace\",\"Clear\",\"Copy\",\"CrSel\",\"Cut\",\"Delete\",\"EraseEof\",\"ExSel\",\"Insert\",\"Paste\",\"Redo\",\"Undo\"],ui:[\"Accept\",\"Again\",\"Attn\",\"Cancel\",\"ContextMenu\",\"Escape\",\"Execute\",\"Find\",\"Help\",\"Pause\",\"Play\",\"Props\",\"Select\",\"ZoomIn\",\"ZoomOut\"],device:[\"BrightnessDown\",\"BrightnessUp\",\"Eject\",\"LogOff\",\"Power\",\"PowerOff\",\"PrintScreen\",\"Hibernate\",\"Standby\",\"WakeUp\"],imeCompositionKeys:[\"AllCandidates\",\"Alphanumeric\",\"CodeInput\",\"Compose\",\"Convert\",\"Dead\",\"FinalMode\",\"GroupFirst\",\"GroupLast\",\"GroupNext\",\"GroupPrevious\",\"ModeChange\",\"NextCandidate\",\"NonConvert\",\"PreviousCandidate\",\"Process\",\"SingleCandidate\"],koreanSpecific:[\"HangulMode\",\"HanjaMode\",\"JunjaMode\"],japaneseSpecific:[\"Eisu\",\"Hankaku\",\"Hiragana\",\"HiraganaKatakana\",\"KanaMode\",\"KanjiMode\",\"Katakana\",\"Romaji\",\"Zenkaku\",\"ZenkakuHankaku\"],commonFunction:[\"F1\",\"F2\",\"F3\",\"F4\",\"F5\",\"F6\",\"F7\",\"F8\",\"F9\",\"F10\",\"F11\",\"F12\",\"Soft1\",\"Soft2\",\"Soft3\",\"Soft4\"],multimedia:[\"ChannelDown\",\"ChannelUp\",\"Close\",\"MailForward\",\"MailReply\",\"MailSend\",\"MediaClose\",\"MediaFastForward\",\"MediaPause\",\"MediaPlay\",\"MediaPlayPause\",\"MediaRecord\",\"MediaRewind\",\"MediaStop\",\"MediaTrackNext\",\"MediaTrackPrevious\",\"New\",\"Open\",\"Print\",\"Save\",\"SpellCheck\"],multimediaNumpad:[\"Key11\",\"Key12\"],audio:[\"AudioBalanceLeft\",\"AudioBalanceRight\",\"AudioBassBoostDown\",\"AudioBassBoostToggle\",\"AudioBassBoostUp\",\"AudioFaderFront\",\"AudioFaderRear\",\"AudioSurroundModeNext\",\"AudioTrebleDown\",\"AudioTrebleUp\",\"AudioVolumeDown\",\"AudioVolumeUp\",\"AudioVolumeMute\",\"MicrophoneToggle\",\"MicrophoneVolumeDown\",\"MicrophoneVolumeUp\",\"MicrophoneVolumeMute\"],speech:[\"SpeechCorrectionList\",\"SpeechInputToggle\"],application:[\"LaunchApplication1\",\"LaunchApplication2\",\"LaunchCalendar\",\"LaunchContacts\",\"LaunchMail\",\"LaunchMediaPlayer\",\"LaunchMusicPlayer\",\"LaunchPhone\",\"LaunchScreenSaver\",\"LaunchSpreadsheet\",\"LaunchWebBrowser\",\"LaunchWebCam\",\"LaunchWordProcessor\"],browser:[\"BrowserBack\",\"BrowserFavorites\",\"BrowserForward\",\"BrowserHome\",\"BrowserRefresh\",\"BrowserSearch\",\"BrowserStop\"],mobilePhone:[\"AppSwitch\",\"Call\",\"Camera\",\"CameraFocus\",\"EndCall\",\"GoBack\",\"GoHome\",\"HeadsetHook\",\"LastNumberRedial\",\"Notification\",\"MannerMode\",\"VoiceDial\"],tv:[\"TV\",\"TV3DMode\",\"TVAntennaCable\",\"TVAudioDescription\",\"TVAudioDescriptionMixDown\",\"TVAudioDescriptionMixUp\",\"TVContentsMenu\",\"TVDataService\",\"TVInput\",\"TVInputComponent1\",\"TVInputComponent2\",\"TVInputComposite1\",\"TVInputComposite2\",\"TVInputHDMI1\",\"TVInputHDMI2\",\"TVInputHDMI3\",\"TVInputHDMI4\",\"TVInputVGA1\",\"TVMediaContext\",\"TVNetwork\",\"TVNumberEntry\",\"TVPower\",\"TVRadioService\",\"TVSatellite\",\"TVSatelliteBS\",\"TVSatelliteCS\",\"TVSatelliteToggle\",\"TVTerrestrialAnalog\",\"TVTerrestrialDigital\",\"TVTimer\"],mediaControls:[\"AVRInput\",\"AVRPower\",\"ColorF0Red\",\"ColorF1Green\",\"ColorF2Yellow\",\"ColorF3Blue\",\"ColorF4Grey\",\"ColorF5Brown\",\"ClosedCaptionToggle\",\"Dimmer\",\"DisplaySwap\",\"DVR\",\"Exit\",\"FavoriteClear0\",\"FavoriteClear1\",\"FavoriteClear2\",\"FavoriteClear3\",\"FavoriteRecall0\",\"FavoriteRecall1\",\"FavoriteRecall2\",\"FavoriteRecall3\",\"FavoriteStore0\",\"FavoriteStore1\",\"FavoriteStore2\",\"FavoriteStore3\",\"Guide\",\"GuideNextDay\",\"GuidePreviousDay\",\"Info\",\"InstantReplay\",\"Link\",\"ListProgram\",\"LiveContent\",\"Lock\",\"MediaApps\",\"MediaAudioTrack\",\"MediaLast\",\"MediaSkipBackward\",\"MediaSkipForward\",\"MediaStepBackward\",\"MediaStepForward\",\"MediaTopMenu\",\"NavigateIn\",\"NavigateNext\",\"NavigateOut\",\"NavigatePrevious\",\"NextFavoriteChannel\",\"NextUserProfile\",\"OnDemand\",\"Pairing\",\"PinPDown\",\"PinPMove\",\"PinPToggle\",\"PinPUp\",\"PlaySpeedDown\",\"PlaySpeedReset\",\"PlaySpeedUp\",\"RandomToggle\",\"RcLowBattery\",\"RecordSpeedNext\",\"RfBypass\",\"ScanChannelsToggle\",\"ScreenModeNext\",\"Settings\",\"SplitScreenToggle\",\"STBInput\",\"STBPower\",\"Subtitle\",\"Teletext\",\"VideoModeNext\",\"Wink\",\"ZoomToggle\"]}}]).default;","'use strict';\n\nconst isSupportedHtml = function (pasteValue) {\n // We need to match new lines in the HTML, .* won't match new line characters.\n // `s` regex modifier can't be used with `ecmaVersion === 2017`.\n // As a workaround using [\\s\\S]*. Fix when we upgrade `ecmaVersion`.\n const genericDiv = /(?:^(<meta[^>]*>)?[\\s\\S]*<div[^>]*>)/;\n const genericSpan = /(?:^(<meta[^>]*>)?[\\s\\S]*<span[^>]*>)/;\n const genericTable = /(?:^(<meta[^>]*>)?[\\s\\S]*<table[^>]*>)/; // Matches Google Sheets format clipboard data format too.\n const excelTable = /(?:<!--StartFragment-->[\\s\\S]*<tr[^>]*>)/;\n const excelTableRow = /(?:<!--StartFragment-->[\\s\\S]*<td[^>]*>)/;\n\n return [\n genericDiv,\n genericTable,\n genericSpan,\n excelTable,\n excelTableRow,\n ].some((expression) => expression.test(pasteValue));\n};\n\n// Explanation of nodeType here: https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst IGNORE_NODETYPES = [8, 3]; // '#text' and '#comment'\n\nconst isHtmlTable = function (pasteValue) {\n return /(?:<table[^>]*>)|(?:<tr[^]*>)/.test(pasteValue);\n};\n\nconst sanitizeElementData = function (element) {\n // It is not entirely clear if this check on nodeType is required.\n let elementData = element.nodeType === 1 ? element.innerText : element.data;\n\n return String(elementData).replace(/\\s+/g, ' ').trim();\n};\n\nconst parseHtmlText = function (data) {\n const doc = new DOMParser().parseFromString(data, 'text/html');\n const element = doc.querySelector('div') || doc.querySelector('span');\n const elementData = sanitizeElementData(element);\n\n return elementData\n .split('\\n')\n .map((item) => item.split('\\t').map((value) => ({ value: [{ value }] })));\n};\n\nconst parseHtmlTable = function (data) {\n const doc = new DOMParser().parseFromString(data, 'text/html');\n const trs = doc.querySelectorAll('table tr');\n const rows = [];\n\n for (const tr of trs) {\n const row = [];\n\n for (const childNode of tr.childNodes) {\n if (IGNORE_NODETYPES.includes(childNode.nodeType)) continue;\n\n const col = { value: [] };\n const value = sanitizeElementData(childNode);\n\n if (value) col.value.push({ value });\n\n row.push(col);\n }\n\n rows.push(row);\n }\n\n return rows;\n};\n\nconst parseText = function (data) {\n return data\n .split('\\n')\n .map((item) => item.split('\\t').map((value) => ({ value: [{ value }] })));\n};\n\nconst parseData = function (data, mimeType) {\n if (mimeType === 'text/html' && isHtmlTable(data)) {\n return parseHtmlTable(data);\n } else if (mimeType === 'text/html') {\n return parseHtmlText(data);\n }\n\n // Default data format is string, so split on new line,\n // and then enclose in an array (a row with one cell):\n return parseText(data);\n};\n\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 if (self.frozenColumn > 0) {\n self.scrollBox.widthBoxRatio =\n (self.scrollBox.width - self.scrollCache.x[self.frozenColumn - 1]) /\n dataWidth;\n } else {\n self.scrollBox.widthBoxRatio = self.scrollBox.width / dataWidth;\n }\n self.scrollBox.scrollBoxWidth =\n self.scrollBox.width * self.scrollBox.widthBoxRatio -\n self.style.scrollBarWidth -\n b -\n d;\n // TODO: This heightBoxRatio number is terribly wrong.\n // They should be a result of the size of the grid/canvas?\n // it being off causes the scroll bar to \"slide\" under\n // the dragged mouse.\n // https://github.com/TonyGermaneri/canvas-datagrid/issues/97\n self.scrollBox.heightBoxRatio =\n (self.scrollBox.height -\n columnHeaderCellHeight -\n self.scrollCache.y[self.frozenRow]) /\n dataHeight;\n self.scrollBox.scrollBoxHeight =\n self.scrollBox.height * self.scrollBox.heightBoxRatio -\n self.style.scrollBarWidth -\n b -\n d;\n self.scrollBox.scrollBoxWidth = Math.max(\n self.scrollBox.scrollBoxWidth,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.scrollBoxHeight = Math.max(\n self.scrollBox.scrollBoxHeight,\n self.style.scrollBarBoxMinSize,\n );\n // horizontal\n n.x += rowHeaderCellWidth;\n n.y += self.height - self.style.scrollBarWidth - d;\n n.width =\n self.width - self.style.scrollBarWidth - rowHeaderCellWidth - d - m;\n n.height = self.style.scrollBarWidth + self.style.scrollBarBorderWidth + d;\n // horizontal box\n nb.y = n.y + self.style.scrollBarBoxMargin;\n nb.width = self.scrollBox.scrollBoxWidth;\n nb.height = self.style.scrollBarBoxWidth;\n // vertical\n v.x +=\n self.width -\n self.style.scrollBarWidth -\n self.style.scrollBarBorderWidth -\n d;\n v.y += columnHeaderCellHeight + self.scrollCache.y[self.frozenRow];\n v.width = self.style.scrollBarWidth + self.style.scrollBarBorderWidth + d;\n v.height =\n self.height - columnHeaderCellHeight - self.style.scrollBarWidth - d - m;\n // vertical box\n vb.x = v.x + self.style.scrollBarBoxMargin;\n vb.y += self.scrollCache.y[self.frozenRow];\n vb.width = self.style.scrollBarBoxWidth;\n vb.height = self.scrollBox.scrollBoxHeight;\n // corner\n co.x = n.x + n.width + m;\n co.y = v.y + v.height + m;\n co.width = self.style.scrollBarWidth + self.style.scrollBarBorderWidth;\n co.height = self.style.scrollBarWidth + self.style.scrollBarBorderWidth;\n self.scrollBox.entities = {\n horizontalBar: n,\n horizontalBox: nb,\n verticalBar: v,\n verticalBox: vb,\n corner: co,\n };\n self.scrollBox.bar = {\n v: v,\n h: n,\n };\n self.scrollBox.box = {\n v: vb,\n h: nb,\n };\n /// calculate page and dom elements\n self.page = Math.max(\n 1,\n self.visibleRows.length - 3 - self.attributes.pageUpDownOverlap,\n );\n // set canvas drawing related items\n if (!self.isChildGrid) {\n self.canvas.width = self.width * ratio;\n self.canvas.height = self.height * ratio;\n self.ctx.scale(ratio, ratio);\n }\n // resize any open dom elements (input/textarea)\n self.resizeEditInput();\n self.scroll(true);\n if (drawAfterResize) {\n self.draw(true);\n }\n self.dispatchEvent('resize', {});\n return true;\n };\n self.scroll = function (dontDraw) {\n var s = self.getSchema(),\n l = (self.viewData || []).length,\n ch = self.style.cellHeight;\n // go too far in leaps, then get focused\n self.scrollIndexTop = Math.floor(\n l * (self.scrollBox.scrollTop / self.scrollBox.scrollHeight) - 100,\n );\n self.scrollIndexTop = Math.max(self.scrollIndexTop, 0);\n self.scrollPixelTop = self.scrollCache.y[self.scrollIndexTop];\n // sometimes the grid is rendered but the height is zero\n if (self.scrollBox.scrollHeight === 0) {\n self.scrollIndexTop = 0;\n }\n self.scrollPixelTop = 0;\n self.scrollIndexLeft = self.frozenColumn;\n self.scrollPixelLeft = 0;\n while (\n self.scrollPixelTop < self.scrollBox.scrollTop &&\n self.scrollIndexTop < self.viewData.length\n ) {\n // start on index +1 since index 0 was used in \"go too far\" section above\n self.scrollIndexTop += 1;\n self.scrollPixelTop = self.scrollCache.y[self.scrollIndexTop];\n }\n while (\n self.scrollPixelLeft < self.scrollBox.scrollLeft + 1 &&\n self.scrollIndexLeft < s.length\n ) {\n self.scrollPixelLeft = self.scrollCache.x[self.scrollIndexLeft];\n self.scrollIndexLeft += 1;\n }\n if (s.length > 0) {\n self.scrollIndexLeft = Math.max(self.scrollIndexLeft - 1, 0);\n self.scrollPixelLeft -= self.getColumnWidth(\n self.orders.columns[self.scrollIndexLeft],\n );\n }\n if ((self.viewData || []).length > 0) {\n self.scrollIndexTop = Math.max(self.scrollIndexTop - 1, 0);\n self.scrollPixelTop = Math.max(\n self.scrollPixelTop -\n (self.viewData[self.scrollIndexTop]\n ? (self.sizes.rows[self.scrollIndexTop] || ch) +\n (self.sizes.trees[self.scrollIndexTop] || 0)\n : ch) *\n self.scale,\n 0,\n );\n }\n self.ellipsisCache = {};\n if (!dontDraw) {\n self.draw(true);\n }\n //TODO: figure out why this has to be delayed for child grids\n //BUG: wheeling event on 3rd level hierarchy fails to move input box\n requestAnimationFrame(self.resizeEditInput);\n self.dispatchEvent('scroll', {\n top: self.scrollBox.scrollTop,\n left: self.scrollBox.scrollLeft,\n });\n };\n self.mousemove = function (e, overridePos) {\n if (self.contextMenu || self.input) {\n return;\n }\n self.mouse = overridePos || self.getLayerPos(e);\n var ctrl =\n (e.ctrlKey || e.metaKey || self.attributes.persistantSelectionMode) &&\n !self.attributes.singleSelectionMode,\n i,\n s = self.getSchema(),\n dragBounds,\n sBounds,\n x = self.mouse.x,\n y = self.mouse.y,\n cell = self.getCellAt(x, y),\n delta,\n ev = { NativeEvent: e, cell: cell, x: x, y: y },\n previousCell = self.currentCell;\n clearTimeout(self.scrollTimer);\n if (!self.isInGrid({ x: x, y: y })) {\n self.hasFocus = false;\n }\n if (self.dispatchEvent('mousemove', ev)) {\n return;\n }\n if (cell && self.currentCell) {\n self.rowBoundaryCrossed = self.currentCell.rowIndex !== cell.rowIndex;\n self.columnBoundaryCrossed =\n self.currentCell.columnIndex !== cell.columnIndex;\n self.cellBoundaryCrossed =\n self.rowBoundaryCrossed || self.columnBoundaryCrossed;\n ['row', 'column', 'cell'].forEach(function (prefix) {\n if (self[prefix + 'BoundaryCrossed']) {\n ev.cell = previousCell;\n self.dispatchEvent(prefix + 'mouseout', ev);\n ev.cell = cell;\n self.dispatchEvent(prefix + 'mouseover', ev);\n }\n });\n }\n self.currentCell = cell;\n\n self.hovers = {};\n if (!self.draggingItem && cell) {\n self.dragItem = cell;\n self.dragMode = cell.dragContext;\n self.cursor = cell.context;\n if (cell.context === 'cell') {\n self.cursor = 'default';\n self.hovers = {\n rowIndex: cell.rowIndex,\n columnIndex: cell.columnIndex,\n onFilterButton: false,\n };\n if (\n cell.isFilterable &&\n x > cell.x + cell.width - self.style.filterButtonWidth &&\n x < cell.x + cell.width &&\n y > cell.y + cell.height - self.style.filterButtonHeight &&\n y < cell.y + cell.height\n ) {\n self.hovers.onFilterButton = true;\n self.draw();\n }\n }\n if (self.selecting || self.reorderObject) {\n delta = {\n x: Math.abs(self.dragStart.x - x),\n y: Math.abs(self.dragStart.y - y),\n };\n if (self.dragStartObject.columnIndex !== -1 && e.shiftKey) {\n self.dragStartObject = {\n rowIndex: self.activeCell.rowIndex,\n columnIndex: self.activeCell.columnIndex,\n };\n }\n dragBounds = {\n top: Math.min(self.dragStartObject.rowIndex, cell.rowIndex),\n left: Math.min(self.dragStartObject.columnIndex, cell.columnIndex),\n bottom: Math.max(self.dragStartObject.rowIndex, cell.rowIndex),\n right: Math.max(self.dragStartObject.columnIndex, cell.columnIndex),\n };\n if (self.dragStartObject.columnIndex === -1) {\n sBounds = self.getSelectionBounds();\n dragBounds.left = -1;\n dragBounds.right = s.length - 1;\n dragBounds.top = Math.min(sBounds.top, cell.rowIndex);\n dragBounds.bottom = Math.max(sBounds.bottom, cell.rowIndex);\n }\n if (\n self.dragStartObject.rowIndex !== cell.rowIndex ||\n self.dragStartObject.columnIndex !== cell.columnIndex\n ) {\n self.ignoreNextClick = true;\n }\n if (\n self.cellBoundaryCrossed ||\n (delta.x === 0 && delta.y === 0) ||\n self.attributes.selectionMode === 'row'\n ) {\n if (\n (self.attributes.selectionMode === 'row' ||\n self.dragStartObject.columnIndex === -1) &&\n self.rowBoundaryCrossed\n ) {\n self.selectRow(cell.rowIndex, ctrl, null, true);\n } else if (self.attributes.selectionMode !== 'row') {\n if (cell.hovered && self.hovers.onFilterButton) {\n if (cell.openedFilter) {\n cell.openedFilter = false;\n self.selectedFilterButton = {\n columnIndex: -1,\n rowIndex: -1,\n };\n } else {\n self.selectedFilterButton.rowIndex = cell.rowIndex;\n self.selectedFilterButton.columnIndex = cell.columnIndex;\n self.contextmenuEvent(e, {\n x: cell.x + cell.width - self.style.filterButtonWidth,\n y: cell.y + cell.height,\n rect: { left: 0, top: 0 },\n });\n }\n self.draw();\n return;\n } else {\n self.selectedFilterButton = {\n columnIndex: -1,\n rowIndex: -1,\n };\n if (self.hovers.onFilterButton) return;\n if (!self.dragAddToSelection && cell.rowIndex !== undefined) {\n if (\n self.selections[cell.rowIndex] &&\n self.selections[cell.rowIndex].indexOf(cell.columnIndex) !==\n -1\n ) {\n self.selections[cell.rowIndex].splice(\n self.selections[cell.rowIndex].indexOf(cell.columnIndex),\n 1,\n );\n }\n } else {\n self.selections[cell.rowIndex] =\n self.selections[cell.rowIndex] || [];\n if (\n self.selections[cell.rowIndex].indexOf(cell.columnIndex) ===\n -1\n ) {\n self.selections[cell.rowIndex].push(cell.columnIndex);\n var event = {\n selections: self.selections,\n selectedData: self.getSelectedData(),\n selectedCells: self.getSelectedCells(),\n selectionBounds: self.getSelectionBounds(),\n };\n self.dispatchEvent('selectionchanged', event);\n }\n }\n }\n }\n }\n if (\n (!self.selectionBounds ||\n dragBounds.top !== self.selectionBounds.top ||\n dragBounds.left !== self.selectionBounds.left ||\n dragBounds.bottom !== self.selectionBounds.bottom ||\n dragBounds.right !== self.selectionBounds.right) &&\n !ctrl\n ) {\n if (!(cell.hovered && self.hovers.onFilterButton)) {\n self.selections = [];\n }\n if (dragBounds.top === -1) {\n dragBounds.top = 0;\n }\n sBounds = dragBounds;\n if (self.attributes.selectionMode === 'row') {\n for (i = sBounds.top; i <= sBounds.bottom; i += 1) {\n self.selectRow(i, true, null, true);\n }\n } else {\n self.selectArea(sBounds, true);\n if (sBounds.left == -1 && sBounds.top !== sBounds.bottom)\n self.isMultiRowsSelected = true;\n }\n }\n\n if (self.attributes.autoScrollOnMousemove) {\n var movedVertically = delta.y > self.attributes.autoScrollMargin;\n var movedHorizontally = delta.x > self.attributes.autoScrollMargin;\n\n if (movedVertically && !movedHorizontally)\n self.autoScrollZone(e, -1, y, ctrl);\n else if (movedHorizontally && !movedVertically)\n self.autoScrollZone(e, x, -1, ctrl);\n else if (movedHorizontally && movedVertically)\n self.autoScrollZone(e, x, y, ctrl);\n } else {\n self.autoScrollZone(e, x, y, ctrl);\n }\n }\n }\n self.cellBoundaryCrossed = false;\n self.rowBoundaryCrossed = false;\n self.columnBoundaryCrossed = false;\n self.draw(true);\n };\n self.click = function (e, overridePos) {\n var i,\n startingBounds = JSON.stringify(self.getSelectionBounds()),\n ctrl =\n (e.ctrlKey || e.metaKey || self.attributes.persistantSelectionMode) &&\n !self.attributes.singleSelectionMode,\n pos = overridePos || self.getLayerPos(e);\n self.currentCell = self.getCellAt(pos.x, pos.y);\n if (self.currentCell.grid !== undefined) {\n return;\n }\n function checkSelectionChange() {\n var ev,\n sb = self.getSelectionBounds();\n\n if (startingBounds === JSON.stringify(sb)) {\n return;\n }\n ev = {\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\n };\n Object.defineProperty(ev, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n self.dispatchEvent('selectionchanged', ev);\n }\n if (self.input) {\n self.endEdit();\n }\n if (self.ignoreNextClick) {\n self.ignoreNextClick = false;\n return;\n }\n i = self.currentCell;\n if (\n self.dispatchEvent('click', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n if (\n ['rowHeaderCell', 'columnHeaderCell'].indexOf(self.currentCell.style) ===\n -1 &&\n !ctrl\n ) {\n if (!self.hovers.onFilterButton) {\n self.setActiveCell(i.columnIndex, i.rowIndex);\n }\n }\n if (self.currentCell.context === 'cell') {\n if (self.currentCell.style === 'cornerCell') {\n self.selectAll();\n self.draw();\n checkSelectionChange();\n return;\n }\n if (self.currentCell.style === 'columnHeaderCell') {\n if (self.attributes.columnHeaderClickBehavior === 'sort') {\n if (self.orderBy === i.header.name) {\n self.orderDirection =\n self.orderDirection === 'asc' ? 'desc' : 'asc';\n } else {\n self.orderDirection = 'asc';\n }\n self.order(i.header.name, self.orderDirection);\n checkSelectionChange();\n return;\n }\n }\n self.selections[i.rowIndex] = self.selections[i.rowIndex] || [];\n if (\n self.attributes.selectionMode === 'row' ||\n self.currentCell.style === 'rowHeaderCell'\n ) {\n if (\n self.currentCell.style === 'rowHeaderCell' &&\n self.attributes.tree &&\n pos.x > 0 &&\n pos.x - self.currentCell.x <\n self.style.treeArrowWidth +\n self.style.treeArrowMarginLeft +\n self.style.treeArrowMarginRight +\n self.style.treeArrowClickRadius &&\n pos.y - self.currentCell.y <\n self.style.treeArrowHeight +\n self.style.treeArrowMarginTop +\n self.style.treeArrowClickRadius &&\n pos.y > 0\n ) {\n self.toggleTree(i.rowIndex);\n return;\n }\n }\n if (e.shiftKey && !ctrl) {\n self.selectionBounds = self.getSelectionBounds();\n self.selectArea(undefined, false);\n }\n }\n checkSelectionChange();\n self.draw(true);\n };\n self.dragResizeColumn = function (e) {\n var pos, x, y;\n pos = self.getLayerPos(e);\n x = self.resizingStartingWidth + pos.x - self.dragStart.x;\n y = self.resizingStartingHeight + pos.y - self.dragStart.y;\n if (x < self.style.minColumnWidth) {\n x = self.style.minColumnWidth;\n }\n if (y < self.style.minRowHeight) {\n y = self.style.minRowHeight;\n }\n if (\n self.dispatchEvent('resizecolumn', {\n x: x,\n y: y,\n draggingItem: self.draggingItem,\n })\n ) {\n return false;\n }\n if (\n self.scrollBox.scrollLeft >\n self.scrollBox.scrollWidth - self.attributes.resizeScrollZone &&\n self.dragMode === 'ew-resize'\n ) {\n self.resize(true);\n self.scrollBox.scrollLeft += x;\n }\n if (self.dragMode === 'ew-resize') {\n self.sizes.columns[\n self.draggingItem.header.style === 'rowHeaderCell'\n ? 'cornerCell'\n : self.draggingItem.sortColumnIndex\n ] = x;\n if (\n ['rowHeaderCell', 'cornerCell'].indexOf(\n self.draggingItem.header.style,\n ) !== -1\n ) {\n self.resize(true);\n }\n self.resizeChildGrids();\n return;\n }\n if (self.dragMode === 'ns-resize') {\n if (self.draggingItem.rowOpen) {\n self.sizes.trees[self.draggingItem.rowIndex] = y;\n } else if (self.attributes.globalRowResize) {\n self.style.cellHeight = y;\n } else {\n self.sizes.rows[self.draggingItem.rowIndex] = y;\n }\n self.dispatchEvent('resizerow', { row: y });\n self.resizeChildGrids();\n return;\n }\n self.ellipsisCache = {};\n };\n self.stopDragResize = function () {\n self.resize();\n document.body.removeEventListener(\n 'mousemove',\n self.dragResizeColumn,\n false,\n );\n document.body.removeEventListener('mouseup', self.stopDragResize, false);\n self.setStorageData();\n self.draw(true);\n self.ignoreNextClick = true;\n };\n self.scrollGrid = function (e) {\n var pos = self.getLayerPos(e);\n if (\n self.attributes.scrollPointerLock &&\n self.pointerLockPosition &&\n ['horizontal-scroll-box', 'vertical-scroll-box'].indexOf(\n self.scrollStartMode,\n ) !== -1\n ) {\n self.pointerLockPosition.x += e.movementX;\n self.pointerLockPosition.y += e.movementY;\n self.pointerLockPosition.x = Math.min(\n self.width - self.style.scrollBarWidth,\n Math.max(0, self.pointerLockPosition.x),\n );\n self.pointerLockPosition.y = Math.min(\n self.height - self.style.scrollBarWidth,\n Math.max(0, self.pointerLockPosition.y),\n );\n pos = self.pointerLockPosition;\n }\n self.scrollMode = self.getCellAt(pos.x, pos.y).context;\n if (\n self.scrollMode === 'horizontal-scroll-box' &&\n self.scrollStartMode !== 'horizontal-scroll-box'\n ) {\n self.scrollStartMode = 'horizontal-scroll-box';\n self.dragStart = pos;\n self.scrollStart.left = self.scrollBox.scrollLeft;\n clearTimeout(self.scrollTimer);\n return;\n }\n if (\n self.scrollMode === 'vertical-scroll-box' &&\n self.scrollStartMode !== 'vertical-scroll-box'\n ) {\n self.scrollStartMode = 'vertical-scroll-box';\n self.dragStart = pos;\n self.scrollStart.top = self.scrollBox.scrollTop;\n clearTimeout(self.scrollTimer);\n return;\n }\n if (\n self.scrollStartMode === 'vertical-scroll-box' &&\n self.scrollMode !== 'vertical-scroll-box'\n ) {\n self.scrollMode = 'vertical-scroll-box';\n }\n if (\n self.scrollStartMode === 'horizontal-scroll-box' &&\n self.scrollMode !== 'horizontal-scroll-box'\n ) {\n self.scrollMode = 'horizontal-scroll-box';\n }\n clearTimeout(self.scrollTimer);\n if (self.scrollModes.indexOf(self.scrollMode) === -1) {\n return;\n }\n if (self.scrollMode === 'vertical-scroll-box') {\n self.scrollBox.scrollTop =\n self.scrollStart.top +\n (pos.y - self.dragStart.y) / self.scrollBox.heightBoxRatio;\n } else if (self.scrollMode === 'vertical-scroll-top') {\n self.scrollBox.scrollTop -= self.page * self.style.cellHeight;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n } else if (self.scrollMode === 'vertical-scroll-bottom') {\n self.scrollBox.scrollTop += self.page * self.style.cellHeight;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n if (self.scrollMode === 'horizontal-scroll-box') {\n self.scrollBox.scrollLeft =\n self.scrollStart.left +\n (pos.x - self.dragStart.x) / self.scrollBox.widthBoxRatio;\n } else if (self.scrollMode === 'horizontal-scroll-right') {\n self.scrollBox.scrollLeft += self.attributes.selectionScrollIncrement;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n } else if (self.scrollMode === 'horizontal-scroll-left') {\n self.scrollBox.scrollLeft -= self.attributes.selectionScrollIncrement;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n };\n self.stopScrollGrid = function () {\n clearTimeout(self.scrollTimer);\n if (document.exitPointerLock) {\n document.exitPointerLock();\n }\n document.removeEventListener('mousemove', self.scrollGrid, false);\n };\n self.dragReorder = function (e) {\n var pos,\n x,\n y,\n columReorder = self.dragMode === 'column-reorder',\n rowReorder = self.dragMode === 'row-reorder';\n pos = self.getLayerPos(e);\n x = pos.x - self.dragStart.x;\n y = pos.y - self.dragStart.y;\n if (!self.attributes.allowColumnReordering && columReorder) {\n return;\n }\n if (!self.attributes.allowRowReordering && rowReorder) {\n return;\n }\n if ((e.ctrlKey || e.metaKey || e.shiftKey) && self.reorderObject) {\n if (\n self.dragMode === 'column-reorder' &&\n !self.isMultiColumnsSelected(self.draggingItem.header.index)\n ) {\n self.selectColumn(self.draggingItem.header.index, false, false);\n }\n }\n if (\n self.dispatchEvent('reordering', {\n NativeEvent: e,\n source: self.dragStartObject,\n target: self.currentCell,\n dragMode: self.dragMode,\n })\n ) {\n return;\n }\n if (\n Math.abs(x) > self.attributes.reorderDeadZone ||\n Math.abs(y) > self.attributes.reorderDeadZone\n ) {\n self.reorderObject = self.draggingItem;\n if (self.isMultiRowsSelected)\n self.reorderObject = self.getVisibleCellByIndex(\n -1,\n self.activeCell.rowIndex,\n );\n self.reorderTarget = self.currentCell;\n self.reorderObject.dragOffset = {\n x: x,\n y: y,\n };\n self.autoScrollZone(\n e,\n columReorder ? pos.x : -1,\n rowReorder ? pos.y : -1,\n false,\n );\n }\n };\n self.stopDragReorder = function (e) {\n var oIndex,\n tIndex,\n odata = [],\n cr = {\n 'row-reorder': self.orders.rows,\n 'column-reorder': self.orders.columns,\n },\n i = {\n 'row-reorder': 'rowIndex',\n 'column-reorder': 'sortColumnIndex',\n }[self.dragMode];\n document.body.removeEventListener('mousemove', self.dragReorder, false);\n document.body.removeEventListener('mouseup', self.stopDragReorder, false);\n if (\n self.reorderObject &&\n self.reorderTarget &&\n ((self.dragMode === 'column-reorder' &&\n self.reorderTarget.sortColumnIndex > -1 &&\n self.reorderTarget.sortColumnIndex < self.getSchema().length) ||\n (self.dragMode === 'row-reorder' &&\n self.reorderTarget.rowIndex > -1 &&\n self.reorderTarget.rowIndex < self.viewData.length)) &&\n self.reorderObject[i] !== self.reorderTarget[i] &&\n !self.dispatchEvent('reorder', {\n NativeEvent: e,\n source: self.reorderObject,\n target: self.reorderTarget,\n dragMode: self.dragMode,\n })\n ) {\n self.ignoreNextClick = true;\n oIndex = cr[self.dragMode].indexOf(self.reorderObject[i]);\n tIndex = cr[self.dragMode].indexOf(self.reorderTarget[i]);\n if (self.dragMode === 'column-reorder') {\n var sortColumnIndices = [];\n var seletedColumnIndices = [];\n if (self.selections[0]) {\n self.selections[0].forEach(function (value) {\n sortColumnIndices.push(self.orders.columns[value]);\n });\n }\n var deleteCount = sortColumnIndices.length;\n cr[self.dragMode].splice(oIndex, deleteCount);\n if (tIndex > oIndex) tIndex = tIndex - (deleteCount - 1);\n for (var i = 0; i < sortColumnIndices.length; i++) {\n seletedColumnIndices.push(tIndex + i);\n cr[self.dragMode].splice(tIndex + i, 0, sortColumnIndices[i]);\n }\n self.orders.columns = cr[self.dragMode];\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = seletedColumnIndices;\n });\n } else {\n var selectedRows = [];\n self.selections.forEach(function (row, rowIndex) {\n if (row) {\n selectedRows.push(row);\n odata.push(self.viewData[rowIndex]);\n }\n });\n self.viewData.splice(oIndex, odata.length);\n self.selections = [];\n if (tIndex > oIndex) tIndex = tIndex - (odata.length - 1);\n self.activeCell.rowIndex = tIndex;\n for (var i = 0; i < odata.length; i++) {\n self.viewData.splice(tIndex + i, 0, odata[i]);\n self.selections[tIndex + i] = selectedRows[i];\n }\n }\n self.resize();\n self.setStorageData();\n }\n self.reorderObject = undefined;\n self.reorderTarget = undefined;\n self.draw(true);\n };\n self.dragMove = function (e) {\n if (\n self.dispatchEvent('moving', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n var pos = self.getLayerPos(e);\n self.moveOffset = {\n x: self.currentCell.columnIndex - self.dragStartObject.columnIndex,\n y: self.currentCell.rowIndex - self.dragStartObject.rowIndex,\n };\n if (\n Math.abs(pos.x) > self.attributes.reorderDeadZone ||\n Math.abs(pos.y) > self.attributes.reorderDeadZone\n ) {\n setTimeout(function () {\n self.autoScrollZone(e, pos.x, pos.y, false);\n }, 1);\n }\n };\n self.stopDragMove = function (e) {\n document.body.removeEventListener('mousemove', self.dragMove, false);\n document.body.removeEventListener('mouseup', self.stopDragMove, false);\n var b = self.getSelectionBounds();\n if (\n self.dispatchEvent('endmove', { NativeEvent: e, cell: self.currentCell })\n ) {\n self.movingSelection = undefined;\n self.moveOffset = undefined;\n self.draw(true);\n return;\n }\n if (self.moveOffset) {\n self.moveTo(\n self.movingSelection,\n b.left + self.moveOffset.x,\n b.top + self.moveOffset.y,\n );\n self.moveSelection(self.moveOffset.x, self.moveOffset.y);\n }\n self.movingSelection = undefined;\n self.moveOffset = undefined;\n self.draw(true);\n };\n self.freezeMove = function (e) {\n if (\n self.dispatchEvent('freezemoving', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n var pos = self.getLayerPos(e),\n bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n columnHeaderCellBorder = self.style.columnHeaderCellBorderWidth * bm,\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth();\n\n self.ignoreNextClick = true;\n self.freezeMarkerPosition = pos;\n if (\n self.currentCell &&\n self.currentCell.rowIndex !== undefined &&\n self.dragMode === 'frozen-row-marker'\n ) {\n self.scrollBox.scrollTop = 0;\n self.frozenRow = self.currentCell.rowIndex + 1;\n self.scrollBox.bar.v.y =\n columnHeaderCellHeight +\n columnHeaderCellBorder +\n self.scrollCache.y[self.frozenRow];\n self.scrollBox.box.v.y =\n columnHeaderCellHeight +\n columnHeaderCellBorder +\n self.scrollCache.y[self.frozenRow];\n var dataHeight = self.scrollCache.y[self.scrollCache.y.length - 1];\n self.scrollBox.heightBoxRatio =\n (self.scrollBox.height -\n columnHeaderCellHeight -\n self.scrollCache.y[self.frozenRow]) /\n dataHeight;\n self.scrollBox.scrollBoxHeight =\n self.scrollBox.height * self.scrollBox.heightBoxRatio -\n self.style.scrollBarWidth;\n self.scrollBox.scrollBoxHeight = Math.max(\n self.scrollBox.scrollBoxHeight,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.box.v.height = self.scrollBox.scrollBoxHeight;\n }\n if (\n self.currentCell &&\n self.currentCell.columnIndex !== undefined &&\n self.dragMode === 'frozen-column-marker'\n ) {\n self.scrollBox.scrollLeft = 0;\n self.frozenColumn = self.currentCell.columnIndex + 1;\n self.scrollBox.bar.h.x =\n rowHeaderCellWidth + self.scrollCache.x[self.frozenColumn - 1];\n self.scrollBox.box.h.x =\n rowHeaderCellWidth + self.scrollCache.x[self.frozenColumn - 1];\n var dataWidth = self.scrollCache.x[self.scrollCache.x.length - 1];\n self.scrollBox.widthBoxRatio =\n (self.scrollBox.width - self.scrollCache.x[self.frozenColumn - 1]) /\n dataWidth;\n self.scrollBox.scrollBoxWidth =\n self.scrollBox.width * self.scrollBox.widthBoxRatio -\n self.style.scrollBarWidth;\n self.scrollBox.scrollBoxWidth = Math.max(\n self.scrollBox.scrollBoxWidth,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.box.h.width = self.scrollBox.scrollBoxWidth;\n }\n if (\n Math.abs(pos.x) > self.attributes.reorderDeadZone ||\n Math.abs(pos.y) > self.attributes.reorderDeadZone\n ) {\n setTimeout(function () {\n self.autoScrollZone(e, pos.x, pos.y, false);\n }, 1);\n }\n };\n self.stopFreezeMove = function (e) {\n document.body.removeEventListener('mousemove', self.freezeMove, false);\n document.body.removeEventListener('mouseup', self.stopFreezeMove, false);\n self.freezeMarkerPosition = undefined;\n if (\n self.dispatchEvent('endfreezemove', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n self.frozenRow = self.startFreezeMove.x;\n self.frozenColumn = self.startFreezeMove.y;\n self.draw(true);\n return;\n }\n self.draw(true);\n };\n self.mousedown = function (e, overridePos) {\n self.lastMouseDownTarget = e.target;\n if (\n self.dispatchEvent('mousedown', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n if (e.button === 2 || self.input) {\n return;\n }\n var ctrl = e.ctrlKey || e.metaKey,\n move = /-move/.test(self.dragMode),\n freeze = /frozen-row-marker|frozen-column-marker/.test(self.dragMode),\n resize = /-resize/.test(self.dragMode);\n self.dragStart = overridePos || self.getLayerPos(e);\n self.scrollStart = {\n left: self.scrollBox.scrollLeft,\n top: self.scrollBox.scrollTop,\n };\n self.dragStartObject = self.getCellAt(self.dragStart.x, self.dragStart.y);\n self.dragAddToSelection = !self.dragStartObject.selected;\n if (\n !ctrl &&\n !e.shiftKey &&\n !/(vertical|horizontal)-scroll-(bar|box)/.test(\n self.dragStartObject.context,\n ) &&\n self.currentCell &&\n !self.currentCell.isColumnHeader &&\n !move &&\n !freeze &&\n !resize\n ) {\n if (\n !(self.dragMode == 'row-reorder' && self.isMultiRowsSelected) &&\n !(self.currentCell.hovered && self.hovers.onFilterButton)\n ) {\n self.selections = [];\n }\n }\n if (self.dragStartObject.isGrid) {\n return;\n }\n if (self.scrollModes.indexOf(self.dragStartObject.context) !== -1) {\n self.scrollMode = self.dragStartObject.context;\n self.scrollStartMode = self.dragStartObject.context;\n self.scrollGrid(e);\n if (\n self.attributes.scrollPointerLock &&\n ['horizontal-scroll-box', 'vertical-scroll-box'].indexOf(\n self.scrollStartMode,\n ) !== -1\n ) {\n self.pointerLockPosition = {\n x: self.dragStart.x,\n y: self.dragStart.y,\n };\n self.canvas.requestPointerLock();\n }\n document.addEventListener('mousemove', self.scrollGrid, false);\n document.addEventListener('mouseup', self.stopScrollGrid, false);\n self.ignoreNextClick = true;\n return;\n }\n if (self.dragMode === 'cell') {\n self.selecting = true;\n if (\n (self.attributes.selectionMode === 'row' ||\n self.dragStartObject.columnIndex === -1) &&\n self.dragStartObject.rowIndex > -1\n ) {\n self.selectRow(self.dragStartObject.rowIndex, ctrl, null);\n } else if (self.attributes.selectionMode !== 'row') {\n self.mousemove(e);\n }\n return;\n }\n if (move) {\n self.draggingItem = self.dragItem;\n self.movingSelection = self.selections.concat([]);\n self.dragging = self.dragStartObject;\n if (\n self.dispatchEvent('beginmove', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n document.body.addEventListener('mousemove', self.dragMove, false);\n document.body.addEventListener('mouseup', self.stopDragMove, false);\n return self.mousemove(e);\n }\n if (freeze) {\n self.draggingItem = self.dragItem;\n self.startFreezeMove = {\n x: self.frozenRow,\n y: self.frozenColumn,\n };\n if (self.dispatchEvent('beginfreezemove', { NativeEvent: e })) {\n return;\n }\n document.body.addEventListener('mousemove', self.freezeMove, false);\n document.body.addEventListener('mouseup', self.stopFreezeMove, false);\n return self.mousemove(e);\n }\n if (resize) {\n self.draggingItem = self.dragItem;\n if (self.draggingItem.rowOpen) {\n self.resizingStartingHeight =\n self.sizes.trees[self.draggingItem.rowIndex];\n } else {\n self.resizingStartingHeight =\n self.sizes.rows[self.draggingItem.rowIndex] || self.style.cellHeight;\n }\n self.resizingStartingWidth =\n self.sizes.columns[\n self.draggingItem.header.style === 'rowHeaderCell'\n ? 'cornerCell'\n : self.draggingItem.sortColumnIndex\n ] || self.draggingItem.width;\n document.body.addEventListener('mousemove', self.dragResizeColumn, false);\n document.body.addEventListener('mouseup', self.stopDragResize, false);\n return;\n }\n if (['row-reorder', 'column-reorder'].indexOf(self.dragMode) !== -1) {\n self.draggingItem = self.dragStartObject;\n if (\n self.dragMode === 'column-reorder' &&\n !self.isMultiColumnsSelected(self.currentCell.header.index)\n ) {\n self.selectColumn(self.currentCell.header.index, ctrl, e.shiftKey);\n } else if (self.dragMode === 'row-reorder' && !self.isMultiRowsSelected) {\n self.selectRow(self.dragStartObject.rowIndex, ctrl, null);\n }\n document.body.addEventListener('mousemove', self.dragReorder, false);\n document.body.addEventListener('mouseup', self.stopDragReorder, false);\n return;\n }\n };\n self.mouseup = function (e) {\n clearTimeout(self.scrollTimer);\n self.cellBoundaryCrossed = true;\n self.rowBoundaryCrossed = true;\n self.columnBoundaryCrossed = true;\n self.selecting = undefined;\n self.draggingItem = undefined;\n self.dragStartObject = undefined;\n if (\n self.dispatchEvent('mouseup', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus && e.target !== self.canvas) {\n return;\n }\n if (self.currentCell && self.currentCell.grid !== undefined) {\n return;\n }\n if (self.contextMenu || self.input) {\n return;\n }\n if (self.dragStart && self.isInGrid(self.dragStart)) {\n self.controlInput.focus();\n }\n e.preventDefault();\n };\n // gets the horizontal adjacent cells as well as first/last based on column visibility\n self.getAdjacentCells = function () {\n var x,\n i,\n s = self.getSchema(),\n o = {};\n for (x = 0; x < s.length; x += 1) {\n i = self.orders.columns[x];\n if (!s[i].hidden) {\n if (o.first === undefined) {\n o.first = x;\n o.left = x;\n }\n o.last = x;\n if (x > self.activeCell.columnIndex && o.right === undefined) {\n o.right = x;\n }\n if (x < self.activeCell.columnIndex) {\n o.left = x;\n }\n }\n }\n if (o.right === undefined) {\n o.right = o.last;\n }\n return o;\n };\n self.keydown = function (e) {\n var i,\n ev,\n adjacentCells = self.getAdjacentCells(),\n x = Math.max(self.activeCell.columnIndex, 0),\n y = Math.max(self.activeCell.rowIndex, 0),\n ctrl = e.ctrlKey || e.metaKey,\n last = self.viewData.length - 1,\n s = self.getSchema(),\n cols = s.length - 1;\n\n var defaultPrevented = self.dispatchEvent('keydown', {\n NativeEvent: e,\n cell: self.currentCell,\n });\n\n if (defaultPrevented) {\n return;\n }\n\n if (!self.attributes.keepFocusOnMouseOut && !self.hasFocus) {\n return;\n }\n\n // If a user starts typing content, switch to \"Enter\" mode\n if (isPrintableKeyEvent(e) && !ctrl) {\n return self.beginEditAt(x, y, e, true);\n }\n\n if (self.attributes.showNewRow) {\n last += 1;\n }\n\n if (e.key === 'Tab') {\n e.preventDefault();\n }\n\n if (e.key === 'Escape') {\n self.selectNone();\n } else if (ctrl && e.key === 'a') {\n self.selectAll();\n } else if (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 (\n ['cell', 'activeCell'].includes(self.currentCell.style) &&\n !self.hovers.onFilterButton\n ) {\n self.beginEditAt(self.currentCell.columnIndex, self.currentCell.rowIndex);\n }\n };\n self.scrollWheel = function (e) {\n var l,\n t,\n ev = e,\n deltaX = e.deltaX === undefined ? e.NativeEvent.deltaX : e.deltaX,\n deltaY = e.deltaY === undefined ? e.NativeEvent.deltaY : e.deltaY,\n deltaMode =\n e.deltaMode === undefined ? e.NativeEvent.deltaMode : e.deltaMode;\n var e = e.NativeEvent || e;\n if (wheeling) {\n ev.preventDefault(e);\n return;\n }\n if (self.dispatchEvent('wheel', { NativeEvent: e })) {\n return;\n }\n self.touchHaltAnimation = true;\n l = self.scrollBox.scrollLeft;\n t = self.scrollBox.scrollTop;\n if (self.hasFocus) {\n //BUG Issue 42: https://github.com/TonyGermaneri/canvas-datagrid/issues/42\n //https://stackoverflow.com/questions/20110224/what-is-the-height-of-a-line-in-a-wheel-event-deltamode-dom-delta-line\n if (deltaMode === 1) {\n // line mode = 17 pixels per line\n deltaY = deltaY * 17;\n }\n if (\n (self.scrollBox.scrollTop < self.scrollBox.scrollHeight &&\n deltaY > 0) ||\n (self.scrollBox.scrollLeft < self.scrollBox.scrollWidth &&\n deltaX > 0) ||\n (self.scrollBox.scrollTop > 0 && deltaY < 0) ||\n (self.scrollBox.scrollLeft > 0 && deltaX < 0)\n ) {\n ev.preventDefault(e);\n }\n wheeling = setTimeout(function () {\n wheeling = undefined;\n self.scrollBox.scrollTo(deltaX + l, deltaY + t);\n }, 1);\n }\n };\n self.pasteData = function (\n pasteValue,\n mimeType,\n startRowIndex,\n startColIndex,\n ) {\n if (mimeType === 'text/html' && !isSupportedHtml(pasteValue)) {\n console.warn(\n 'Unrecognized HTML format. HTML must be a simple table, e.g.: <table><tr><td>data</td></tr></table>.',\n );\n console.warn(\n 'Data with the mime type text/html not in this format will not be imported as row data.',\n );\n\n return;\n }\n var schema = self.getSchema();\n var rows = parseData(pasteValue, mimeType);\n\n // selected cell. This mimics Excel's paste functionality, and works\n // as a poor-man's fill-down.\n if (rows.length === 1 && rows[0].length === 1) {\n var cellData = rows[0][0].value.map((item) => item.value).join();\n\n self.forEachSelectedCell(function (data, rowIndex, colName) {\n data[rowIndex][colName] = cellData;\n });\n } else {\n var selections = [];\n for (var rowIndex = 0; rowIndex < rows.length; rowIndex++) {\n // Rows may have been moved by user, so get the actual row index\n // (instead of the row index at which the row is rendered):\n var realRowIndex = self.orders.rows[startRowIndex + rowIndex];\n var cells = rows[rowIndex];\n\n var existingRowData = self.viewData[realRowIndex];\n var newRowData = Object.assign({}, existingRowData);\n\n selections[realRowIndex] = [];\n\n for (var colIndex = 0; colIndex < cells.length; colIndex++) {\n var column = schema[startColIndex + colIndex];\n\n if (!column) {\n console.warn('Paste data exceeded grid bounds. Skipping.');\n continue;\n }\n\n var columnName = column.name;\n var cellData = cells[colIndex].value\n .map((item) => item.value)\n .join('');\n\n if (cellData === undefined || cellData === null) {\n newRowData[columnName] = existingRowData[columnName];\n continue;\n }\n\n selections[realRowIndex].push(startColIndex + colIndex);\n\n newRowData[columnName] = cellData;\n }\n\n self.originalData[self.boundRowIndexMap.get(realRowIndex)] = newRowData;\n // Update view date here to avoid a full refresh of `viewData`.\n // To stay in line with Excel and Google Sheet behaviour,\n // don't perform a full refresh (and filter/sort results)\n // as this would make any pasted values disappear and/or suddenly change position.\n self.viewData[realRowIndex] = newRowData;\n }\n self.selections = selections;\n }\n\n // selections is a sparse array, so we condense:\n var affectedCells = [];\n\n self.selections.forEach(function (row, rowIndex) {\n if (rowIndex === undefined) return;\n\n row.forEach(function (columnIndex) {\n affectedCells.push([\n rowIndex,\n columnIndex,\n self.getBoundRowIndexFromViewRowIndex(rowIndex),\n self.getBoundColumnIndexFromViewColumnIndex(columnIndex),\n ]);\n });\n });\n\n self.dispatchEvent('afterpaste', {\n cells: affectedCells,\n });\n\n return rows.length;\n };\n self.getNextVisibleColumnIndex = function (visibleColumnIndex) {\n var x,\n s = self.getVisibleSchema();\n for (x = 0; x < s.length; x += 1) {\n if (s[x].columnIndex === visibleColumnIndex) {\n return s[x + 1].columnIndex;\n }\n }\n return -1;\n };\n self.getVisibleColumnIndexOf = function (columnIndex) {\n var x,\n s = self.getVisibleSchema();\n for (x = 0; x < s.length; x += 1) {\n if (s[x].columnIndex === columnIndex) {\n return x;\n }\n }\n return -1;\n };\n self.paste = function (event) {\n if (!self.attributes.editable) {\n return;\n }\n\n var defaultPrevented = self.dispatchEvent('beforepaste', {\n NativeEvent: event,\n });\n\n if (defaultPrevented) {\n return;\n }\n\n var clipboardItems = new Map(\n Array.from(event.clipboardData.items).map((item) => [item.type, item]),\n );\n\n // Supported MIME types, in order of preference:\n var supportedMimeTypes = ['text/html', 'text/csv', 'text/plain'];\n\n // The clipboard will often contain the same data in multiple formats,\n // which can be used depending on the context in which it's pasted. Here\n // we'll prefere more structured (HTML/CSV) over less structured, when\n // available, so we try to find those first:\n var pasteableItems = supportedMimeTypes\n .map((mimeType) => clipboardItems.get(mimeType))\n .filter((item) => !!item); // filter out not-found MIME types (= undefined)\n\n if (pasteableItems.length === 0) {\n console.warn(\n 'Cannot find supported clipboard data type. Supported types are:',\n supportedMimeTypes.join(', '),\n );\n return;\n }\n\n var itemToPaste = pasteableItems[0];\n\n let startCell = [];\n for (\n let rowIndex = 0, len = self.selections.length;\n rowIndex < len;\n rowIndex++\n ) {\n const row = self.selections[rowIndex];\n if (row) {\n if (row[0] === undefined) return;\n startCell = [rowIndex, row[0] < 0 ? row[1] : row[0]];\n break;\n }\n }\n\n // itemToPaste is cleared once accessed (getData or getAsString),\n // so we need to store the type here, before reading its value:\n var pasteType = itemToPaste.type;\n\n itemToPaste.getAsString(function (pasteValue) {\n self.pasteData(pasteValue, pasteType, startCell[0], startCell[1]);\n\n self.draw();\n });\n };\n self.cut = function (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 if (typeof v === 'number') return v;\n return v.replace(/</g, '<').replace(/>/g, '>');\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(String(column.name)) < 0) {\n if (firstRowKeys.indexOf(String(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.filterable = {\n rows: [],\n columns: [],\n };\n self.selectedFilterButton = {\n columnIndex: -1,\n rowIndex: -1,\n };\n self.hovers = {};\n self.attributes = {};\n self.style = {};\n self.formatters = {};\n self.sorters = {};\n self.parsers = {};\n self.schemaHashes = {};\n self.events = {};\n self.changes = [];\n self.scrollIndexTop = 0;\n self.scrollPixelTop = 0;\n self.scrollIndexLeft = 0;\n self.scrollPixelLeft = 0;\n self.childGrids = {};\n self.openChildren = {};\n self.scrollModes = [\n 'vertical-scroll-box',\n 'vertical-scroll-top',\n 'vertical-scroll-bottom',\n 'horizontal-scroll-box',\n 'horizontal-scroll-right',\n 'horizontal-scroll-left',\n ];\n self.componentL1Events = {};\n self.eventNames = [\n 'afterdraw',\n 'afterrendercell',\n 'afterrenderfilterbutton',\n 'attributechanged',\n 'beforebeginedit',\n 'beforecreatecellgrid',\n 'beforedraw',\n 'beforeendedit',\n 'beforerendercell',\n 'beforerendercellgrid',\n 'beforerenderfilterbutton',\n 'beginedit',\n 'cellmouseout',\n 'cellmouseover',\n 'click',\n 'collapsetree',\n 'contextmenu',\n 'copy',\n 'datachanged',\n 'dblclick',\n 'endedit',\n 'expandtree',\n 'formatcellvalue',\n 'keydown',\n 'keypress',\n 'keyup',\n 'mousedown',\n 'mousemove',\n 'mouseup',\n 'newrow',\n 'ordercolumn',\n 'rendercell',\n 'rendercellgrid',\n 'renderorderbyarrow',\n 'rendertext',\n 'rendertreearrow',\n 'reorder',\n 'reordering',\n 'resize',\n 'resizecolumn',\n 'resizerow',\n 'schemachanged',\n 'scroll',\n 'selectionchanged',\n 'stylechanged',\n 'touchcancel',\n 'touchend',\n 'touchmove',\n 'touchstart',\n 'wheel',\n ];\n self.mouse = { x: 0, y: 0 };\n self.getSelectedData = function (expandToRow) {\n const selectedData = [];\n const schema = self.getSchema();\n const viewDataLength = self.viewData.length;\n\n if (viewDataLength === 0) {\n return [];\n }\n\n // self.selections is a sparse array, so `viewRowIndex` here\n // will equal the row index as where it's rendered,\n // not as where it is in the original data array.\n self.selections.forEach(function (row, viewRowIndex) {\n if (!row) {\n return;\n }\n\n if (viewRowIndex === viewDataLength) {\n return;\n }\n\n if (row.length === 0) {\n selectedData[viewRowIndex] = null;\n return;\n }\n\n selectedData[viewRowIndex] = {};\n\n row.forEach(function (col) {\n if (col === -1 || !schema[col]) {\n return;\n }\n\n const orderedIndex = self.orders.columns[col];\n\n if (!expandToRow && schema[orderedIndex].hidden) {\n return;\n }\n\n if (self.viewData[viewRowIndex]) {\n selectedData[viewRowIndex][schema[orderedIndex].name] =\n self.viewData[viewRowIndex][schema[orderedIndex].name];\n }\n });\n });\n\n return selectedData;\n };\n self.getSelectedCells = function (expandToRow) {\n const selectedCells = [];\n const schema = self.getSchema();\n const viewDataLength = self.viewData.length;\n\n if (viewDataLength === 0) {\n return [];\n }\n\n for (const [viewRowIndex, row] of self.selections.entries()) {\n if (!row || row.length === 0) continue;\n\n for (const [, viewColumnIndex] of row.entries()) {\n if (viewColumnIndex === -1 || !schema[viewColumnIndex]) {\n continue;\n }\n\n const boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(\n viewColumnIndex,\n );\n\n if (!expandToRow && schema[boundColumnIndex].hidden) {\n continue;\n }\n\n if (self.viewData[viewRowIndex]) {\n const header = schema[boundColumnIndex];\n const value = self.viewData[viewRowIndex][header.name];\n const boundRowIndex = self.getBoundRowIndexFromViewRowIndex(\n viewRowIndex,\n );\n\n const cell = {\n value,\n header,\n boundRowIndex,\n boundColumnIndex,\n viewRowIndex,\n viewColumnIndex,\n };\n\n selectedCells.push(cell);\n }\n }\n }\n\n return selectedCells;\n };\n self.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.addButton = self.addButton;\n self.intf.getHeaderByName = self.getHeaderByName;\n self.intf.findColumnScrollLeft = self.findColumnScrollLeft;\n self.intf.findRowScrollTop = self.findRowScrollTop;\n self.intf.fitColumnToValues = self.fitColumnToValues;\n self.intf.findColumnMaxTextLength = self.findColumnMaxTextLength;\n self.intf.disposeContextMenu = self.disposeContextMenu;\n self.intf.getCellAt = self.getCellAt;\n self.intf.isCellVisible = self.isCellVisible;\n self.intf.isRowVisible = self.isRowVisible;\n self.intf.isColumnVisible = self.isColumnVisible;\n self.intf.order = self.order;\n self.intf.draw = self.draw;\n self.intf.refresh = self.refresh;\n self.intf.isComponent = self.isComponent;\n self.intf.selectArea = self.selectArea;\n self.intf.clipElement = self.clipElement;\n self.intf.getSchemaFromData = self.getSchemaFromData;\n self.intf.setFilter = self.setFilter;\n self.intf.selectRow = self.selectRow;\n self.intf.parentGrid = self.parentGrid;\n self.intf.toggleTree = self.toggleTree;\n self.intf.expandTree = self.expandTree;\n self.intf.collapseTree = self.collapseTree;\n self.intf.canvas = self.canvas;\n self.intf.context = self.ctx;\n self.intf.insertRow = self.insertRow;\n self.intf.deleteRow = self.deleteRow;\n self.intf.addRow = self.addRow;\n self.intf.insertColumn = self.insertColumn;\n self.intf.deleteColumn = self.deleteColumn;\n self.intf.addColumn = self.addColumn;\n self.intf.getClippingRect = self.getClippingRect;\n self.intf.setRowHeight = self.setRowHeight;\n self.intf.setColumnWidth = self.setColumnWidth;\n self.intf.resetColumnWidths = self.resetColumnWidths;\n self.intf.resetRowHeights = self.resetRowHeights;\n self.intf.resize = self.resize;\n self.intf.selectColumn = self.selectColumn;\n self.intf.selectRow = self.selectRow;\n self.intf.selectAll = self.selectAll;\n self.intf.selectNone = self.selectNone;\n self.intf.drawChildGrids = self.drawChildGrids;\n self.intf.assertPxColor = self.assertPxColor;\n self.intf.clearPxColorAssertions = self.clearPxColorAssertions;\n self.intf.integerToAlpha = self.integerToAlpha;\n self.intf.copy = self.copy;\n self.intf.cut = self.cut;\n self.intf.paste = self.paste;\n self.intf.setStyleProperty = self.setStyleProperty;\n Object.defineProperty(self.intf, 'defaults', {\n get: function () {\n return {\n styles: self.defaults.styles.reduce(function (a, i) {\n a[i[0]] = i[1];\n return a;\n }, {}),\n attributes: self.defaults.attributes.reduce(function (a, i) {\n a[i[0]] = i[1];\n return a;\n }, {}),\n };\n },\n });\n self.styleKeys = Object.keys(self.intf.defaults.styles);\n self.styleKeys\n .map(function (i) {\n return self.hyphenateProperty(i, false);\n })\n .forEach(addStyleKeyIfNoneExists);\n self.styleKeys\n .map(function (i) {\n return self.hyphenateProperty(i, true);\n })\n .forEach(addStyleKeyIfNoneExists);\n self.DOMStyles = window.getComputedStyle(document.body, null);\n self.styleKeys.concat(Object.keys(self.DOMStyles)).forEach(function (key) {\n // unless this line is here, Object.keys() will not work on <instance>.style\n publicStyleKeyIntf[key] = undefined;\n Object.defineProperty(publicStyleKeyIntf, key, {\n get: function () {\n return self.getStyleProperty(key);\n },\n set: function (value) {\n if (self.initialized) {\n self.appliedInlineStyles[key] = value;\n }\n self.setStyleProperty(key, value);\n },\n });\n });\n Object.defineProperty(self.intf, 'shadowRoot', {\n get: function () {\n return self.shadowRoot;\n },\n });\n Object.defineProperty(self.intf, 'activeCell', {\n get: function () {\n return self.activeCell;\n },\n });\n Object.defineProperty(self.intf, 'hasFocus', {\n get: function () {\n return self.hasFocus;\n },\n });\n Object.defineProperty(self.intf, 'hasActiveFilters', {\n get: function () {\n return self.hasActiveFilters();\n },\n });\n Object.defineProperty(self.intf, 'style', {\n get: function () {\n return publicStyleKeyIntf;\n },\n set: function (valueObject) {\n Object.keys(valueObject).forEach(function (key) {\n self.setStyleProperty(key, valueObject[key], true);\n });\n self.draw(true);\n self.dispatchEvent('stylechanged', {\n name: 'style',\n value: valueObject,\n });\n },\n });\n Object.defineProperty(self.intf, 'attributes', { value: {} });\n Object.keys(self.attributes).forEach(function (key) {\n Object.defineProperty(self.intf.attributes, key, {\n get: function () {\n return self.attributes[key];\n },\n set: function (value) {\n self.attributes[key] = value;\n if (key === 'name') {\n self.tryLoadStoredSettings();\n }\n self.draw(true);\n self.dispatchEvent('attributechanged', {\n name: key,\n value: value[key],\n });\n },\n });\n });\n self.filters.string = function (value, filterFor) {\n if (filterFor === self.attributes.blanksText) {\n return self.blankValues.includes(\n value == null ? value : String(value).trim(),\n );\n }\n\n value = String(value);\n var filterRegExp,\n regEnd = /\\/(i|g|m)*$/,\n pattern = regEnd.exec(filterFor),\n flags = pattern ? pattern[0].substring(1) : '',\n flagLength = flags.length;\n self.invalidFilterRegEx = undefined;\n if (filterFor.substring(0, 1) === '/' && pattern) {\n try {\n filterRegExp = new RegExp(\n filterFor.substring(1, filterFor.length - (flagLength + 1)),\n flags,\n );\n } catch (e) {\n self.invalidFilterRegEx = e;\n return;\n }\n return filterRegExp.test(value);\n }\n return value.toString\n ? value\n .toString()\n .toLocaleUpperCase()\n .indexOf(filterFor.toLocaleUpperCase()) !== -1\n : false;\n };\n self.filters.number = function (value, filterFor) {\n if (filterFor === self.attributes.blanksText) {\n return self.blankValues.includes(\n value == null ? value : String(value).trim(),\n );\n }\n\n if (!filterFor) {\n return true;\n }\n return value === filterFor;\n };\n ['formatters', 'filters', 'sorters'].forEach(self.initProp);\n self.applyComponentStyle(false, self.intf);\n self.reloadStoredValues();\n if (self.args.data) {\n self.intf.data = self.args.data;\n }\n if (self.intf.innerText || self.intf.textContent) {\n if (self.intf.dataType === 'application/x-canvas-datagrid') {\n self.intf.dataType = 'application/json+x-canvas-datagrid';\n }\n self.intf.data = self.intf.innerText || self.intf.textContent;\n }\n if (self.args.schema) {\n self.intf.schema = self.args.schema;\n }\n if (self.isChildGrid || !self.isComponent) {\n requestAnimationFrame(function () {\n self.resize(true);\n });\n } else {\n self.resize(true);\n }\n self.initialized = true;\n return self;\n };\n /**\n * Removes focus from the grid.\n * @memberof canvasDatagrid\n * @name blur\n * @method\n */\n self.intf.blur = function (e) {\n self.hasFocus = false;\n };\n /**\n * Focuses on the grid.\n * @memberof canvasDatagrid\n * @name focus\n * @method\n */\n self.intf.focus = function () {\n self.hasFocus = true;\n self.controlInput.focus();\n };\n if (self.shadowRoot || self.isChildGrid) {\n Object.defineProperty(self.intf, 'height', {\n get: function () {\n if (self.shadowRoot) {\n return self.shadowRoot.height;\n }\n return self.parentNode.height;\n },\n set: function (value) {\n if (self.shadowRoot) {\n self.shadowRoot.height = value;\n } else {\n self.parentNode.height = value;\n }\n self.resize(true);\n },\n });\n Object.defineProperty(self.intf, 'width', {\n get: function () {\n if (self.shadowRoot) {\n return self.shadowRoot.width;\n }\n return self.parentNode.width;\n },\n set: function (value) {\n if (self.shadowRoot) {\n self.shadowRoot.width = value;\n } else {\n self.parentNode.width = value;\n }\n self.resize(true);\n },\n });\n Object.defineProperty(self.intf, 'parentNode', {\n get: function () {\n return self.parentNode;\n },\n set: function (value) {\n if (!self.isChildGrid) {\n throw new TypeError(\n 'Cannot set property parentNode which has only a getter',\n );\n }\n self.parentNode = value;\n },\n });\n }\n Object.defineProperty(self.intf, 'visibleRowHeights', {\n get: function () {\n return self.visibleRowHeights;\n },\n });\n Object.defineProperty(self.intf, 'openChildren', {\n get: function () {\n return self.openChildren;\n },\n });\n Object.defineProperty(self.intf, 'childGrids', {\n get: function () {\n return Object.keys(self.childGrids).map(function (gridId) {\n return self.childGrids[gridId];\n });\n },\n });\n Object.defineProperty(self.intf, 'isChildGrid', {\n get: function () {\n return self.isChildGrid;\n },\n });\n Object.defineProperty(self, 'cursor', {\n get: function () {\n return self.parentNodeStyle.cursor;\n },\n set: function (value) {\n if (value === 'cell') {\n value = 'default';\n }\n if (self.currentCursor !== value) {\n self.parentNodeStyle.cursor = value;\n self.currentCursor = value;\n }\n },\n });\n Object.defineProperty(self.intf, 'orderDirection', {\n get: function () {\n return self.orderDirection;\n },\n set: function (value) {\n if (value !== 'desc') {\n value = 'asc';\n }\n self.orderDirection = value;\n self.order(self.orderBy, self.orderDirection);\n },\n });\n Object.defineProperty(self.intf, 'orderBy', {\n get: function () {\n return self.orderBy;\n },\n set: function (value) {\n if (\n self.getSchema().find(function (col) {\n return col.name === value;\n }) === undefined\n ) {\n throw new Error('Cannot sort by unknown column name.');\n }\n self.orderBy = value;\n self.order(self.orderBy, self.orderDirection);\n },\n });\n if (self.isComponent) {\n Object.defineProperty(self.intf, 'offsetHeight', {\n get: function () {\n return self.canvas.offsetHeight;\n },\n });\n Object.defineProperty(self.intf, 'offsetWidth', {\n get: function () {\n return self.canvas.offsetWidth;\n },\n });\n }\n Object.defineProperty(self.intf, 'scrollHeight', {\n get: function () {\n return self.scrollBox.scrollHeight;\n },\n });\n Object.defineProperty(self.intf, 'scrollWidth', {\n get: function () {\n return self.scrollBox.scrollWidth;\n },\n });\n Object.defineProperty(self.intf, 'scrollTop', {\n get: function () {\n return self.scrollBox.scrollTop;\n },\n set: function (value) {\n self.scrollBox.scrollTop = value;\n },\n });\n Object.defineProperty(self.intf, 'scrollLeft', {\n get: function () {\n return self.scrollBox.scrollLeft;\n },\n set: function (value) {\n self.scrollBox.scrollLeft = value;\n },\n });\n Object.defineProperty(self.intf, 'sizes', {\n get: function () {\n return self.sizes;\n },\n });\n Object.defineProperty(self.intf, 'parentDOMNode', {\n get: function () {\n return self.parentDOMNode;\n },\n });\n Object.defineProperty(self.intf, 'input', {\n get: function () {\n return self.input;\n },\n });\n Object.defineProperty(self.intf, 'controlInput', {\n get: function () {\n return self.controlInput;\n },\n });\n Object.defineProperty(self.intf, 'currentCell', {\n get: function () {\n return self.currentCell;\n },\n });\n Object.defineProperty(self.intf, 'visibleCells', {\n get: function () {\n return self.visibleCells;\n },\n });\n Object.defineProperty(self.intf, 'visibleRows', {\n get: function () {\n return self.visibleRows;\n },\n });\n Object.defineProperty(self.intf, 'selections', {\n get: function () {\n return self.selections;\n },\n });\n Object.defineProperty(self.intf, 'dragMode', {\n get: function () {\n return self.dragMode;\n },\n });\n Object.defineProperty(self.intf, 'changes', {\n get: function () {\n return self.changes;\n },\n });\n self.intf.formatters = self.formatters;\n Object.defineProperty(self.intf, 'dataType', {\n get: function () {\n return self.dataType;\n },\n set: function (value) {\n if (!self.parsers[value]) {\n throw new Error('No parser for MIME type ' + value);\n }\n self.dataType = value;\n },\n });\n self.eventNames.forEach(function (eventName) {\n Object.defineProperty(self.intf, 'on' + eventName, {\n get: function () {\n return self.componentL1Events[eventName];\n },\n set: function (value) {\n self.events[eventName] = [];\n self.componentL1Events[eventName] = value;\n if (!value) {\n return;\n }\n self.addEventListener(eventName, value);\n },\n });\n });\n Object.defineProperty(self.intf, 'frozenRow', {\n get: function () {\n return self.frozenRow;\n },\n set: function (val) {\n if (isNaN(val)) {\n throw new TypeError('Expected value for frozenRow to be a number.');\n }\n if (self.visibleRows.length < val) {\n throw new RangeError(\n 'Cannot set a value larger than the number of visible rows.',\n );\n }\n self.frozenRow = val;\n },\n });\n Object.defineProperty(self.intf, 'frozenColumn', {\n get: function () {\n return self.frozenColumn;\n },\n set: function (val) {\n if (isNaN(val)) {\n throw new TypeError('Expected value for frozenRow to be a number.');\n }\n if (self.getVisibleSchema().length < val) {\n throw new RangeError(\n 'Cannot set a value larger than the number of visible columns.',\n );\n }\n self.frozenColumn = val;\n },\n });\n Object.defineProperty(self.intf, 'scrollIndexRect', {\n get: function () {\n return {\n top: self.scrollIndexTop,\n right: self.scrollIndexRight,\n bottom: self.scrollIndexBottom,\n left: self.scrollIndexLeft,\n };\n },\n });\n Object.defineProperty(self.intf, 'scrollPixelRect', {\n get: function () {\n return {\n top: self.scrollPixelTop,\n right: self.scrollPixelRight,\n bottom: self.scrollPixelBottom,\n left: self.scrollPixelLeft,\n };\n },\n });\n Object.defineProperty(self.intf, 'rowOrder', {\n get: function () {\n return self.orders.rows;\n },\n set: function (val) {\n if (!Array.isArray(val)) {\n throw new TypeError('Value must be an array.');\n }\n if (!self.originalData || val.length < self.originalData.length) {\n throw new RangeError(\n 'Array length must be equal to or greater than number of rows.',\n );\n }\n self.orders.rows = val;\n },\n });\n Object.defineProperty(self.intf, 'columnOrder', {\n get: function () {\n return self.orders.columns;\n },\n set: function (val) {\n if (!Array.isArray(val)) {\n throw new TypeError('Value must be an array.');\n }\n if (val.length < self.getSchema().length) {\n throw new RangeError(\n 'Array length must be equal to or greater than number of columns.',\n );\n }\n self.orders.columns = val;\n },\n });\n Object.defineProperty(self.intf, 'selectionBounds', {\n get: function () {\n return self.getSelectionBounds();\n },\n });\n Object.defineProperty(self.intf, 'selectedRows', {\n get: function () {\n return self.getSelectedData(true);\n },\n });\n Object.defineProperty(self.intf, 'selectedCells', {\n get: function () {\n return self.getSelectedData();\n },\n });\n Object.defineProperty(self.intf, 'visibleSchema', {\n get: function () {\n return self.getVisibleSchema().map(function eachDataRow(col) {\n return col;\n });\n },\n });\n Object.defineProperty(self.intf, 'treeGridAttributes', {\n get: function () {\n return self.treeGridAttributes;\n },\n set: function setTreeGridAttributes(value) {\n self.treeGridAttributes = value;\n },\n });\n Object.defineProperty(self.intf, 'cellGridAttributes', {\n get: function () {\n return self.cellGridAttributes;\n },\n set: function setCellGridAttributes(value) {\n self.cellGridAttributes = value;\n },\n });\n Object.defineProperty(self.intf, 'ctx', {\n get: function () {\n return self.ctx;\n },\n });\n Object.defineProperty(self.intf, 'schema', {\n get: function schemaGetter() {\n return self.getSchema();\n },\n set: function schemaSetter(value) {\n if (value === undefined) {\n // Issue #89 - allow schema to be set to initialized state\n self.schema = undefined;\n self.tempSchema = undefined;\n self.dispatchEvent('schemachanged', { schema: undefined });\n return;\n }\n if (!Array.isArray(value) || typeof value[0] !== 'object') {\n throw new Error('Schema must be an array of objects.');\n }\n if (value[0].name === undefined) {\n throw new Error(\n 'Expected schema to contain an object with at least a name property.',\n );\n }\n self.schema = value.map(function eachSchemaColumn(column, index) {\n column.width = column.width || self.style.cellWidth;\n column.filter = column.filter || self.filter(column.type);\n column.type = column.type || 'string';\n column.index = index;\n column.columnIndex = index;\n column.rowIndex = -1;\n return column;\n });\n self.tempSchema = undefined;\n self.createNewRowData();\n self.createColumnOrders();\n self.tryLoadStoredSettings();\n if (\n self.storedSettings &&\n typeof self.storedSettings.visibility === 'object'\n ) {\n self.schema.forEach(function hideEachSchemaColumn(column, index) {\n if (\n self.storedSettings &&\n self.storedSettings.visibility[column.name] !== undefined\n ) {\n column.hidden = !self.storedSettings.visibility[column.name];\n }\n });\n }\n self.resize(true);\n self.dispatchEvent('schemachanged', { schema: self.schema });\n },\n });\n /**\n * Gets an array of currently registered MIME types.\n * @memberof canvasDatagrid\n * @name getDataTypes\n * @method\n */\n self.intf.getTypes = function () {\n return Object.keys(self.parsers);\n };\n self.parseInnerHtml = function (data) {\n if (!data || /^ +$/.test(data)) {\n return [];\n }\n try {\n data = JSON.parse(data);\n } catch (e) {\n console.warn(\n Error(\n 'Cannot parse application/json+x-canvas-datagrid formated data. ' +\n e.message +\n ' \\nNote: canvas-datagrid.innerHTML is for string data only. ' +\n 'Use the canvas-datagrid.data property to set object data.',\n ),\n );\n }\n return data;\n };\n self.parsers['application/json+x-canvas-datagrid'] = function (\n data,\n callback,\n ) {\n self.parsers['application/x-canvas-datagrid'](\n self.parseInnerHtml(data),\n function (data, schema) {\n return callback(data, schema);\n },\n );\n };\n self.parsers['application/x-canvas-datagrid'] = function (data, callback) {\n return callback(data);\n };\n self.intf.parsers = self.parsers;\n // send to dataType ETL function to extract from input data\n // and transform into native [{}, {}] format\n self.etl = function (data, callback) {\n if (!self.intf.parsers[self.dataType]) {\n throw new Error('Unsupported data type.');\n }\n self.intf.parsers[self.dataType](data, function (data, schema) {\n // set the unfiltered/sorted data array\n self.originalData = data;\n self.viewData = Array.from(self.originalData);\n\n if (Array.isArray(schema)) {\n self.schema = schema;\n }\n // Issue #89 - allow schema to be auto-created every time data is set\n if (self.attributes.autoGenerateSchema) {\n self.schema = self.getSchemaFromData(data);\n }\n if (!self.schema) {\n self.tempSchema = self.getSchemaFromData(data);\n }\n if (self.getSchema()) {\n self.createColumnOrders();\n }\n // apply filter, sort, etc to incoming dataset, set viewData:\n self.refresh();\n // empty data was set\n if (!self.schema && (self.originalData || []).length === 0) {\n self.tempSchema = [{ name: '' }];\n }\n self.fitColumnToValues('cornerCell', true);\n if (\n (self.tempSchema && !self.schema) ||\n self.attributes.autoGenerateSchema\n ) {\n self.createColumnOrders();\n self.dispatchEvent('schemachanged', { schema: self.tempSchema });\n }\n callback();\n });\n };\n Object.defineProperty(self.intf, 'viewData', {\n get: function () {\n return self.viewData;\n },\n });\n Object.defineProperty(self.intf, 'boundData', {\n get: function () {\n return self.originalData;\n },\n });\n Object.defineProperty(self.intf, 'data', {\n get: function dataGetter() {\n return self.originalData;\n },\n set: function dataSetter(value) {\n self.etl(value, function () {\n self.changes = [];\n self.createNewRowData();\n if (\n self.attributes.autoResizeColumns &&\n self.originalData.length > 0 &&\n self.storedSettings === undefined\n ) {\n self.autosize();\n }\n // set the header column to fit the numbers in it\n self.fitColumnToValues('cornerCell', true);\n self.createRowOrders();\n self.tryLoadStoredSettings();\n self.dispatchEvent('datachanged', { data: self.originalData });\n self.resize(true);\n });\n },\n });\n self.initScrollBox = function () {\n var sHeight = 0,\n sWidth = 0,\n scrollTop = 0,\n scrollLeft = 0,\n scrollHeight = 0,\n scrollWidth = 0,\n scrollBoxHeight = 20,\n scrollBoxWidth = 20;\n function setScrollTop(value, preventScrollEvent) {\n if (isNaN(value)) {\n throw new Error('ScrollTop value must be a number');\n }\n if (value < 0) {\n value = 0;\n }\n if (value > scrollHeight) {\n value = scrollHeight;\n }\n if (scrollHeight < 0) {\n value = 0;\n }\n scrollTop = value;\n if (!preventScrollEvent) {\n self.scroll();\n }\n if (self.button) {\n self.moveButtonPos();\n }\n }\n function setScrollLeft(value, preventScrollEvent) {\n if (isNaN(value)) {\n throw new Error('ScrollLeft value must be a number');\n }\n if (value < 0) {\n value = 0;\n }\n if (value > scrollWidth) {\n value = scrollWidth;\n }\n if (scrollWidth < 0) {\n value = 0;\n }\n scrollLeft = value;\n if (!preventScrollEvent) {\n self.scroll();\n }\n if (self.button) {\n self.moveButtonPos();\n }\n }\n self.scrollBox.toString = function () {\n return (\n '{\"width\": ' +\n scrollWidth.toFixed(2) +\n ', \"height\": ' +\n scrollHeight.toFixed(2) +\n ', \"left\": ' +\n scrollLeft.toFixed(2) +\n ', \"top\": ' +\n scrollTop.toFixed(2) +\n ', \"widthRatio\": ' +\n self.scrollBox.widthBoxRatio.toFixed(5) +\n ', \"heightRatio\": ' +\n self.scrollBox.heightBoxRatio.toFixed(5) +\n '}'\n );\n };\n self.scrollBox.scrollTo = function (x, y, supressDrawEvent) {\n setScrollLeft(x, true);\n setScrollTop(y, supressDrawEvent);\n };\n Object.defineProperty(self.scrollBox, 'scrollBoxHeight', {\n get: function () {\n return scrollBoxHeight;\n },\n set: function (value) {\n scrollBoxHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollBoxWidth', {\n get: function () {\n return scrollBoxWidth;\n },\n set: function (value) {\n scrollBoxWidth = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'height', {\n get: function () {\n return sHeight;\n },\n set: function (value) {\n sHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'width', {\n get: function () {\n return sWidth;\n },\n set: function (value) {\n sWidth = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollTop', {\n get: function () {\n return scrollTop;\n },\n set: setScrollTop,\n });\n Object.defineProperty(self.scrollBox, 'scrollLeft', {\n get: function () {\n return scrollLeft;\n },\n set: setScrollLeft,\n });\n Object.defineProperty(self.scrollBox, 'scrollHeight', {\n get: function () {\n return scrollHeight;\n },\n set: function (value) {\n if (scrollTop > value) {\n scrollTop = Math.max(value, 0);\n }\n scrollHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollWidth', {\n get: function () {\n return scrollWidth;\n },\n set: function (value) {\n if (scrollLeft > value) {\n scrollLeft = Math.max(value, 0);\n }\n scrollWidth = value;\n },\n });\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false, Event: false*/\n'use strict';\n\nexport default function (self) {\n var zIndexTop, hoverScrollTimeout, autoCompleteContext;\n function applyContextItemStyle(contextItemContainer) {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item' + (self.mobile ? '-mobile' : ''),\n );\n contextItemContainer.addEventListener('mouseover', function () {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item:hover',\n );\n });\n contextItemContainer.addEventListener('mouseout', function () {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item',\n );\n });\n }\n function createContextMenu(ev, pos, items, parentContextMenu) {\n var container = document.createElement('div'),\n upArrow = document.createElement('div'),\n downArrow = document.createElement('div'),\n children = [],\n selectedIndex = -1,\n intf = {},\n rect;\n if (!Array.isArray(items)) {\n throw new Error('createContextMenu expects an array.');\n }\n function createItems() {\n items.forEach(function (item) {\n var contextItemContainer = document.createElement('div'),\n childMenuArrow;\n function removeChildContext(e) {\n if (\n e.relatedTarget === container ||\n item.contextMenu.container === e.relatedTarget ||\n childMenuArrow === e.relatedTarget ||\n contextItemContainer === e.relatedTarget ||\n item.contextMenu.container.contains(e.relatedTarget)\n ) {\n return;\n }\n item.contextMenu.dispose();\n children.splice(children.indexOf(item.contextMenu), 1);\n item.contextMenu = undefined;\n contextItemContainer.removeEventListener(\n 'mouseout',\n removeChildContext,\n );\n container.removeEventListener('mouseout', removeChildContext);\n contextItemContainer.setAttribute('contextOpen', '0');\n contextItemContainer.setAttribute('opening', '0');\n }\n function contextAddCallback(items) {\n // check yet again if the user hasn't moved off\n if (\n contextItemContainer.getAttribute('opening') !== '1' ||\n contextItemContainer.getAttribute('contextOpen') === '1'\n ) {\n return;\n }\n var cPos = contextItemContainer.getBoundingClientRect();\n cPos = {\n left:\n cPos.left +\n self.style.childContextMenuMarginLeft +\n container.offsetWidth,\n top: cPos.top + self.style.childContextMenuMarginTop,\n bottom: cPos.bottom,\n right: cPos.right,\n };\n item.contextMenu = createContextMenu(ev, cPos, items, intf);\n contextItemContainer.setAttribute('contextOpen', '1');\n contextItemContainer.addEventListener('mouseout', removeChildContext);\n container.addEventListener('mouseout', removeChildContext);\n children.push(item.contextMenu);\n }\n function createChildContext() {\n var i;\n if (contextItemContainer.getAttribute('contextOpen') === '1') {\n return;\n }\n contextItemContainer.setAttribute('opening', '1');\n if (typeof item.items === 'function') {\n i = item.items.apply(intf, [\n function (items) {\n contextAddCallback(items);\n },\n ]);\n if (i !== undefined && Array.isArray(i)) {\n contextAddCallback(i);\n }\n return;\n }\n contextAddCallback(item.items);\n }\n function addItem(item) {\n function addContent(content) {\n if (content === null) {\n return;\n }\n if (typeof content === 'function') {\n return addContent(content(ev));\n }\n if (typeof content === 'object') {\n contextItemContainer.appendChild(content);\n return;\n }\n applyContextItemStyle(contextItemContainer);\n contextItemContainer.innerHTML = content;\n return;\n }\n addContent(item.title);\n item.contextItemContainer = contextItemContainer;\n if (\n (item.items && item.items.length > 0) ||\n typeof item.items === 'function'\n ) {\n childMenuArrow = document.createElement('div');\n self.createInlineStyle(\n childMenuArrow,\n 'canvas-datagrid-context-child-arrow',\n );\n childMenuArrow.innerHTML = self.style.childContextMenuArrowHTML;\n contextItemContainer.appendChild(childMenuArrow);\n contextItemContainer.addEventListener(\n 'mouseover',\n createChildContext,\n );\n contextItemContainer.addEventListener('mouseout', function () {\n contextItemContainer.setAttribute('opening', '0');\n });\n }\n if (item.click) {\n contextItemContainer.addEventListener('click', function (ev) {\n item.click.apply(self, [ev]);\n });\n }\n }\n addItem(item);\n container.appendChild(contextItemContainer);\n });\n }\n function clickIndex(idx) {\n items[idx].contextItemContainer.dispatchEvent(new Event('click'));\n }\n function checkArrowVisibility() {\n if (container.scrollTop > 0) {\n self.parentDOMNode.appendChild(upArrow);\n } else if (upArrow.parentNode) {\n upArrow.parentNode.removeChild(upArrow);\n }\n if (\n container.scrollTop >=\n container.scrollHeight - container.offsetHeight &&\n downArrow.parentNode\n ) {\n downArrow.parentNode.removeChild(downArrow);\n } else if (\n container.scrollHeight - container.offsetHeight > 0 &&\n !(\n container.scrollTop >=\n container.scrollHeight - container.offsetHeight\n )\n ) {\n self.parentDOMNode.appendChild(downArrow);\n }\n }\n function fade(element) {\n var opacity = 1;\n var timer = setInterval(function () {\n if (opacity <= 0.1) {\n clearInterval(timer);\n element.style.display = 'none';\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n }\n }\n element.style.opacity = opacity;\n element.style.filter = 'alpha(opacity=' + opacity * 100 + ')';\n opacity -= opacity * 0.1;\n }, self.attributes.animationDurationHideContextMenu * 0.1);\n }\n function unfade(element) {\n var opacity = 0.1;\n element.style.display = 'block';\n var timer = setInterval(function () {\n if (opacity >= 1) {\n clearInterval(timer);\n }\n element.style.opacity = opacity;\n element.style.filter = 'alpha(opacity=' + opacity * 100 + ')';\n opacity += opacity * 0.1;\n }, self.attributes.animationDurationShowContextMenu * 0.1);\n }\n function startHoverScroll(type) {\n return function t() {\n var a = self.attributes.contextHoverScrollAmount;\n if (type === 'up' && container.scrollTop === 0) {\n return;\n }\n if (type === 'down' && container.scrollTop === container.scrollHeight) {\n return;\n }\n container.scrollTop += type === 'up' ? -a : a;\n hoverScrollTimeout = setTimeout(\n t,\n self.attributes.contextHoverScrollRateMs,\n type,\n );\n };\n }\n function endHoverScroll(type) {\n return function () {\n clearTimeout(hoverScrollTimeout);\n };\n }\n function init() {\n var loc = {},\n s = self.scrollOffset(self.canvas);\n if (zIndexTop === undefined) {\n zIndexTop = self.style.contextMenuZIndex;\n }\n createItems();\n self.createInlineStyle(\n container,\n 'canvas-datagrid-context-menu' + (self.mobile ? '-mobile' : ''),\n );\n loc.x = pos.left - s.left;\n loc.y = pos.top - s.top;\n loc.height = 0;\n zIndexTop += 1;\n container.style.opacity = 0;\n container.style.position = 'absolute';\n upArrow.style.color = self.style.contextMenuArrowColor;\n downArrow.style.color = self.style.contextMenuArrowColor;\n [upArrow, downArrow].forEach(function (el) {\n el.style.textAlign = 'center';\n el.style.position = 'absolute';\n el.style.zIndex = zIndexTop + 1;\n });\n container.style.zIndex = zIndexTop;\n if (parentContextMenu && parentContextMenu.inputDropdown) {\n container.style.maxHeight =\n window.innerHeight -\n loc.y -\n self.style.autocompleteBottomMargin +\n 'px';\n container.style.minWidth = pos.width + 'px';\n loc.y += pos.height;\n }\n if (self.mobile) {\n container.style.width = pos.width + 'px';\n }\n container.style.left = loc.x + 'px';\n container.style.top = loc.y + 'px';\n container.addEventListener('scroll', checkArrowVisibility);\n container.addEventListener('wheel', function (e) {\n if (self.hasFocus) {\n container.scrollTop += e.deltaY;\n container.scrollLeft += e.deltaX;\n }\n checkArrowVisibility();\n });\n upArrow.innerHTML = self.style.contextMenuArrowUpHTML;\n downArrow.innerHTML = self.style.contextMenuArrowDownHTML;\n container.appendChild(upArrow);\n document.body.appendChild(downArrow);\n document.body.appendChild(container);\n unfade(container);\n rect = container.getBoundingClientRect();\n // TODO: fix !(parentContextMenu && parentContextMenu.inputDropdown) state (autocomplete)\n if (rect.bottom > window.innerHeight) {\n if (!(parentContextMenu && parentContextMenu.inputDropdown)) {\n loc.y -=\n rect.bottom +\n self.style.contextMenuWindowMargin -\n window.innerHeight;\n }\n if (loc.y < 0) {\n loc.y = self.style.contextMenuWindowMargin;\n }\n if (\n container.offsetHeight >\n window.innerHeight - self.style.contextMenuWindowMargin\n ) {\n container.style.height =\n window.innerHeight - self.style.contextMenuWindowMargin * 2 + 'px';\n }\n }\n if (rect.right > window.innerWidth) {\n loc.x -=\n rect.right - window.innerWidth + self.style.contextMenuWindowMargin;\n }\n if (loc.x < 0) {\n loc.x = self.style.contextMenuWindowMargin;\n }\n if (loc.y < 0) {\n loc.y = self.style.contextMenuWindowMargin;\n }\n container.style.left = loc.x + 'px';\n container.style.top = loc.y + 'px';\n rect = container.getBoundingClientRect();\n upArrow.style.top = rect.top + 'px';\n downArrow.style.top =\n rect.top + rect.height - downArrow.offsetHeight + 'px';\n upArrow.style.left = rect.left + 'px';\n downArrow.style.left = rect.left + 'px';\n downArrow.style.width = container.offsetWidth + 'px';\n upArrow.style.width = container.offsetWidth + 'px';\n downArrow.addEventListener('mouseover', startHoverScroll('down'));\n downArrow.addEventListener('mouseout', endHoverScroll('down'));\n upArrow.addEventListener('mouseover', startHoverScroll('up'));\n upArrow.addEventListener('mouseout', endHoverScroll('up'));\n checkArrowVisibility();\n }\n intf.parentGrid = self.intf;\n intf.parentContextMenu = parentContextMenu;\n intf.container = container;\n init();\n intf.clickIndex = clickIndex;\n intf.rect = rect;\n intf.items = items;\n intf.upArrow = upArrow;\n intf.downArrow = downArrow;\n intf.dispose = function () {\n clearTimeout(hoverScrollTimeout);\n children.forEach(function (c) {\n c.dispose();\n });\n [downArrow, upArrow, container].forEach(function (el) {\n fade(el);\n });\n };\n Object.defineProperty(intf, 'selectedIndex', {\n get: function () {\n return selectedIndex;\n },\n set: function (value) {\n if (typeof value !== 'number' || isNaN(value || !isFinite(value))) {\n throw new Error('Context menu selected index must be a sane number.');\n }\n selectedIndex = value;\n if (selectedIndex > items.length - 1) {\n selectedIndex = items.length - 1;\n }\n if (selectedIndex < 0) {\n selectedIndex = 0;\n }\n items.forEach(function (item, index) {\n if (index === selectedIndex) {\n return self.createInlineStyle(\n item.contextItemContainer,\n 'canvas-datagrid-context-menu-item:hover',\n );\n }\n self.createInlineStyle(\n item.contextItemContainer,\n 'canvas-datagrid-context-menu-item',\n );\n });\n },\n });\n return intf;\n }\n function createFilterContextMenuItems(e) {\n var filterContainer = document.createElement('div'),\n filterLabel = document.createElement('div'),\n filterAutoCompleteButton = document.createElement('button'),\n filterInput = document.createElement('input'),\n n =\n e.cell && e.cell.header\n ? e.cell.header.title || e.cell.header.name\n : '',\n iRect;\n function checkRegExpErrorState() {\n filterInput.style.background = self.style.contextFilterInputBackground;\n filterInput.style.color = self.style.contextFilterInputColor;\n if (self.invalidFilterRegEx) {\n filterInput.style.background =\n self.style.contextFilterInvalidRegExpBackground;\n filterInput.style.color = self.style.contextFilterInvalidRegExpColor;\n }\n }\n function fillAutoComplete() {\n var count = 0;\n var items = {};\n var blanksItem = [];\n\n self.viewData.forEach(function (row) {\n var cellValue =\n row[e.cell.header.name] == null\n ? row[e.cell.header.name]\n : String(row[e.cell.header.name]).trim();\n var value = self.blankValues.includes(cellValue)\n ? self.attributes.blanksText\n : cellValue;\n\n if (items[value] || count > self.attributes.maxAutoCompleteItems) {\n return;\n }\n count += 1;\n items[value] = {\n title: self.formatters[e.cell.header.type || 'string']({\n cell: { value: value },\n }),\n click: function (e) {\n filterInput.value = value;\n e.stopPropagation();\n filterInput.dispatchEvent(new Event('keyup'));\n self.disposeAutocomplete();\n return;\n },\n };\n });\n\n if (Object.keys(items).indexOf(self.attributes.blanksText) !== -1) {\n blanksItem.push(items[self.attributes.blanksText]);\n delete items[self.attributes.blanksText];\n }\n\n return blanksItem.concat(\n Object.keys(items).map(function (key) {\n return items[key];\n }),\n );\n }\n\n function createAutoCompleteContext(ev) {\n if (ev && ['ArrowDown', 'ArrowUp', 'Enter', 'Tab'].includes(ev.key)) {\n return;\n }\n\n var autoCompleteItems = fillAutoComplete();\n\n iRect = filterInput.getBoundingClientRect();\n if (autoCompleteContext) {\n autoCompleteContext.dispose();\n autoCompleteContext = undefined;\n }\n autoCompleteContext = createContextMenu(\n e,\n {\n left: iRect.left,\n top: iRect.top,\n right: iRect.right,\n bottom: iRect.bottom,\n height: iRect.height,\n width: iRect.width,\n },\n autoCompleteItems,\n { inputDropdown: true },\n );\n autoCompleteContext.selectedIndex = 0;\n }\n self.createInlineStyle(filterLabel, 'canvas-datagrid-context-menu-label');\n self.createInlineStyle(\n filterAutoCompleteButton,\n 'canvas-datagrid-context-menu-filter-button',\n );\n self.createInlineStyle(\n filterInput,\n 'canvas-datagrid-context-menu-filter-input',\n );\n checkRegExpErrorState();\n filterInput.onclick = self.disposeAutocomplete;\n filterInput.addEventListener('keydown', function (e) {\n if (e.key === 'ArrowDown') {\n autoCompleteContext.selectedIndex += 1;\n }\n\n if (e.key === 'ArrowUp') {\n autoCompleteContext.selectedIndex -= 1;\n }\n\n if (e.key === 'Enter') {\n autoCompleteContext.clickIndex(autoCompleteContext.selectedIndex);\n self.disposeContextMenu();\n }\n\n if (e.key === 'Tab') {\n autoCompleteContext.clickIndex(autoCompleteContext.selectedIndex);\n e.preventDefault();\n }\n\n if (e.key === 'Escape') {\n self.disposeContextMenu();\n }\n });\n filterInput.addEventListener('keyup', function () {\n self.setFilter(e.cell.header.name, filterInput.value);\n });\n filterInput.addEventListener('keyup', createAutoCompleteContext);\n ['focus', 'blur', 'keydown', 'keyup', 'change'].forEach(function (en) {\n filterInput.addEventListener(en, checkRegExpErrorState);\n });\n filterInput.value = e.cell.header\n ? self.columnFilters[e.cell.header.name] || ''\n : '';\n filterLabel.innerHTML = self.attributes.filterOptionText.replace(/%s/g, n);\n filterAutoCompleteButton.onclick = function () {\n if (autoCompleteContext) {\n return self.disposeAutocomplete();\n }\n createAutoCompleteContext();\n };\n filterAutoCompleteButton.innerHTML = self.style.contextFilterButtonHTML;\n filterContainer.addEventListener('click', function (e) {\n return e.stopPropagation();\n });\n filterContainer.appendChild(filterLabel);\n filterContainer.appendChild(filterInput);\n filterContainer.appendChild(filterAutoCompleteButton);\n e.items.push({\n title: filterContainer,\n });\n if (Object.keys(self.columnFilters).length) {\n Object.keys(self.columnFilters).forEach(function (cf) {\n var h = self.getHeaderByName(cf);\n e.items.push({\n title: self.attributes.removeFilterOptionText.replace(\n /%s/g,\n h.title || h.name,\n ),\n click: function removeFilterClick(e) {\n e.preventDefault();\n self.setFilter(cf, '');\n self.controlInput.focus();\n },\n });\n });\n }\n }\n function addDefaultContextMenuItem(e) {\n var isNormalCell =\n !(\n e.cell.isBackground ||\n e.cell.isColumnHeaderCellCap ||\n e.cell.isScrollBar ||\n e.cell.isCorner ||\n e.cell.isRowHeader\n ) && e.cell.header;\n if (self.attributes.showFilter && isNormalCell) {\n createFilterContextMenuItems(e);\n }\n if (\n self.attributes.showCopy &&\n self.selections.reduce(function (p, r) {\n return p + r.length;\n }, 0) > 0\n ) {\n e.items.push({\n title: self.attributes.copyText,\n click: function () {\n document.execCommand('copy');\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n if (self.attributes.showPaste && self.clipBoardData) {\n e.items.push({\n title: self.attributes.pasteText,\n click: function () {\n self.paste(self.clipBoardData, e.cell.columnIndex, e.cell.rowIndex);\n self.draw();\n },\n });\n }\n if (self.attributes.showColumnSelector) {\n e.items.push({\n title: self.attributes.columnSelectorText,\n items: function () {\n var d = [];\n self.getSchema().forEach(function (column) {\n function toggleColumnVisibility(e) {\n column.hidden = !column.hidden;\n self.dispatchEvent('togglecolumn', {\n column: column,\n hidden: column.hidden,\n });\n e.preventDefault();\n self.stopPropagation(e);\n self.disposeContextMenu();\n self.resize(true);\n self.setStorageData();\n }\n var el = document.createElement('div');\n applyContextItemStyle(el);\n el.addEventListener('touchstart', toggleColumnVisibility);\n el.addEventListener('click', toggleColumnVisibility);\n el.innerHTML =\n (column.hidden\n ? self.attributes.columnSelectorHiddenText\n : self.attributes.columnSelectorVisibleText) +\n (column.title || column.name);\n d.push({\n title: el,\n });\n });\n return d;\n },\n });\n if (e.cell && e.cell.header && e.cell.columnIndex > -1) {\n e.items.push({\n title: self.attributes.hideColumnText.replace(\n /%s/gi,\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n self.getSchema()[e.cell.columnIndex].hidden = true;\n ev.preventDefault();\n self.stopPropagation(ev);\n self.disposeContextMenu();\n self.setStorageData();\n setTimeout(function () {\n self.resize(true);\n }, 10);\n },\n });\n }\n }\n if (\n self.attributes.saveAppearance &&\n self.attributes.showClearSettingsOption &&\n (Object.keys(self.sizes.rows).length > 0 ||\n Object.keys(self.sizes.columns).length > 0)\n ) {\n e.items.push({\n title: self.attributes.clearSettingsOptionText,\n click: function (e) {\n e.preventDefault();\n self.sizes.rows = {};\n self.sizes.columns = {};\n self.createRowOrders();\n self.createColumnOrders();\n self.storedSettings = undefined;\n self.dispatchEvent('resizecolumn', {\n columnWidth: self.style.cellWidth,\n });\n self.dispatchEvent('resizerow', {\n cellHeight: self.style.cellHeight,\n });\n self.setStorageData();\n self.resize(true);\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n if (\n self.attributes.allowSorting &&\n self.attributes.showOrderByOption &&\n isNormalCell\n ) {\n e.items.push({\n title: self.attributes.showOrderByOptionTextAsc.replace(\n '%s',\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.order(e.cell.header.name, 'asc');\n self.controlInput.focus();\n },\n });\n e.items.push({\n title: self.attributes.showOrderByOptionTextDesc.replace(\n '%s',\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.order(e.cell.header.name, 'desc');\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n }\n self.disposeAutocomplete = function () {\n if (autoCompleteContext) {\n autoCompleteContext.dispose();\n autoCompleteContext = undefined;\n }\n };\n self.disposeContextMenu = function (event) {\n document.removeEventListener('click', self.disposeContextMenu);\n zIndexTop = self.style.contextMenuZIndex;\n self.disposeAutocomplete();\n if (self.contextMenu) {\n self.contextMenu.dispose();\n }\n self.contextMenu = undefined;\n if (event) {\n self.canvas.focus();\n self.mousedown(event);\n self.mouseup(event);\n }\n };\n self.contextmenuEvent = function (e, overridePos) {\n if (!self.hasFocus && e.target !== self.canvas) {\n return;\n }\n function createDisposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('click', self.disposeContextMenu);\n document.removeEventListener('mouseup', createDisposeEvent);\n });\n }\n var contextPosition,\n items = [],\n pos = overridePos || self.getLayerPos(e),\n ev = {\n NativeEvent: e,\n cell: self.getCellAt(pos.x, pos.y),\n items: items,\n };\n if (!ev.cell.isGrid) {\n addDefaultContextMenuItem(ev);\n }\n if (e.type !== 'mousedown' && self.dispatchEvent('contextmenu', ev)) {\n return;\n }\n if (!ev.cell.isGrid) {\n if (self.contextMenu) {\n self.disposeContextMenu();\n }\n contextPosition = {\n left:\n pos.x +\n pos.rect.left +\n self.style.contextMenuMarginLeft +\n self.canvasOffsetLeft,\n top:\n pos.y +\n pos.rect.top +\n self.style.contextMenuMarginTop +\n self.canvasOffsetTop,\n right: ev.cell.width + ev.cell.x + pos.rect.left,\n bottom: ev.cell.height + ev.cell.y + pos.rect.top,\n height: ev.cell.height,\n width: ev.cell.width,\n };\n if (self.mobile) {\n contextPosition.left = self.style.mobileContextMenuMargin + 'px';\n contextPosition.width =\n self.width - self.style.mobileContextMenuMargin * 2 + 'px';\n }\n if (e.type == 'mousedown') {\n contextPosition.top += self.style.filterButtonMenuOffsetTop;\n }\n self.contextMenu = createContextMenu(ev, contextPosition, items);\n if (e.type == 'mousedown') {\n document.addEventListener('mouseup', createDisposeEvent);\n } else {\n createDisposeEvent();\n }\n e.preventDefault();\n }\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false, Event: false*/\n'use strict';\n\nexport default function (self) {\n let zIndexTop;\n\n function applyButtonMenuItemStyle(buttonMenuItemContainer) {\n self.createInlineStyle(\n buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item' + (self.mobile ? '-mobile' : ''),\n );\n buttonMenuItemContainer.addEventListener('mouseover', function () {\n self.createInlineStyle(\n buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item:hover',\n );\n });\n buttonMenuItemContainer.addEventListener('mouseout', function () {\n self.createInlineStyle(\n buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item',\n );\n });\n }\n\n function applyButtonStyle(button) {\n self.createInlineStyle(button, 'canvas-datagrid-button-wrapper');\n button.addEventListener('mouseover', function () {\n if (!self.buttonMenu) {\n self.createInlineStyle(button, 'canvas-datagrid-button-wrapper:hover');\n }\n });\n button.addEventListener('mouseout', function () {\n if (!self.buttonMenu) {\n self.createInlineStyle(button, 'canvas-datagrid-button-wrapper');\n }\n });\n }\n\n function createButton(pos, items, imgSrc) {\n var wrapper = document.createElement('div'),\n buttonArrow = document.createElement('div'),\n buttonIcon = document.createElement('div'),\n intf = {};\n\n if (!Array.isArray(items)) {\n throw new Error('createButton expects an array.');\n }\n\n function init() {\n var loc = {},\n s = self.scrollOffset(self.canvas);\n\n if (zIndexTop === undefined) {\n zIndexTop = self.style.buttonZIndex;\n }\n\n applyButtonStyle(wrapper);\n self.createInlineStyle(buttonIcon, 'canvas-datagrid-button-icon');\n self.createInlineStyle(buttonArrow, 'canvas-datagrid-button-arrow');\n\n loc.x = pos.left - s.left;\n loc.y = pos.top - s.top;\n loc.height = 0;\n zIndexTop += 1;\n wrapper.style.position = 'absolute';\n wrapper.style.zIndex = zIndexTop;\n wrapper.style.left = loc.x + 'px';\n wrapper.style.top = loc.y + 'px';\n wrapper.left = pos.left + self.scrollBox.scrollLeft;\n wrapper.top = pos.top + self.scrollBox.scrollTop;\n buttonArrow.innerHTML = self.style.buttonArrowDownHTML;\n if (imgSrc) {\n let img = document.createElement('img');\n img.setAttribute('src', imgSrc);\n img.style.maxWidth = '100%';\n img.style.height = '100%';\n buttonIcon.appendChild(img);\n }\n wrapper.appendChild(buttonIcon);\n wrapper.appendChild(buttonArrow);\n document.body.appendChild(wrapper);\n wrapper.addEventListener('click', toggleButtonMenu);\n }\n\n intf.wrapper = wrapper;\n intf.items = items;\n init();\n\n intf.dispose = function () {\n if (wrapper.parentNode) {\n wrapper.parentNode.removeChild(wrapper);\n }\n };\n return intf;\n }\n\n function toggleButtonMenu() {\n function createDisposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('click', self.disposeButtonMenu);\n });\n }\n if (self.buttonMenu) {\n self.disposeButtonMenu();\n } else {\n let pos = {\n left: self.button.wrapper.left - self.scrollBox.scrollLeft,\n top:\n self.button.wrapper.top +\n self.button.wrapper.offsetHeight -\n self.scrollBox.scrollTop,\n };\n self.buttonMenu = createButtonMenu(pos, self.button.items);\n self.createInlineStyle(\n self.button.wrapper,\n 'canvas-datagrid-button-wrapper:active',\n );\n createDisposeEvent();\n }\n }\n\n function createButtonMenu(pos, items) {\n var buttonMenu = document.createElement('div'),\n selectedIndex = -1,\n intf = {},\n rect;\n\n function createItems() {\n function addItem(item, menuItemContainer) {\n function addContent(content) {\n if (content === null) {\n return;\n }\n\n if (typeof content === 'object') {\n menuItemContainer.appendChild(content);\n return;\n }\n\n applyButtonMenuItemStyle(menuItemContainer);\n menuItemContainer.innerHTML = content;\n return;\n }\n\n addContent(item.title);\n item.buttonMenuItemContainer = menuItemContainer;\n\n if (item.click) {\n menuItemContainer.addEventListener('click', function (ev) {\n item.click.apply(self, [ev]);\n });\n }\n }\n\n for (let item of items) {\n var buttonMenuItemContainer = document.createElement('div');\n addItem(item, buttonMenuItemContainer);\n buttonMenu.appendChild(buttonMenuItemContainer);\n }\n }\n\n function clickIndex(idx) {\n items[idx].buttonMenuItemContainer.dispatchEvent(new Event('click'));\n }\n\n function init() {\n var loc = {},\n s = self.scrollOffset(self.canvas);\n\n if (zIndexTop === undefined) {\n zIndexTop = self.style.buttonZIndex;\n }\n\n createItems();\n self.createInlineStyle(\n buttonMenu,\n 'canvas-datagrid-button-menu' + (self.mobile ? '-mobile' : ''),\n );\n\n loc.x = pos.left - s.left;\n loc.y = pos.top - s.top;\n loc.height = 0;\n zIndexTop += 1;\n buttonMenu.style.position = 'absolute';\n buttonMenu.style.zIndex = zIndexTop;\n buttonMenu.style.left = loc.x + 'px';\n buttonMenu.style.top = loc.y + 'px';\n document.body.appendChild(buttonMenu);\n rect = buttonMenu.getBoundingClientRect();\n\n if (rect.bottom > window.innerHeight) {\n loc.y =\n self.button.wrapper.top -\n buttonMenu.offsetHeight -\n self.scrollBox.scrollTop;\n if (loc.y < 0) {\n loc.y = self.style.buttonMenuWindowMargin;\n }\n\n if (\n buttonMenu.offsetHeight >\n window.innerHeight - self.style.buttonMenuWindowMargin\n ) {\n buttonMenu.style.height =\n window.innerHeight - self.style.buttonMenuWindowMargin * 2 + 'px';\n }\n }\n\n if (rect.right > window.innerWidth) {\n loc.x -=\n rect.right - window.innerWidth + self.style.buttonMenuWindowMargin;\n }\n\n if (loc.x < 0) {\n loc.x = self.style.buttonMenuWindowMargin;\n }\n\n if (loc.y < 0) {\n loc.y = self.style.buttonMenuWindowMargin;\n }\n\n buttonMenu.style.left = loc.x + 'px';\n buttonMenu.style.top = loc.y + 'px';\n }\n\n intf.buttonMenu = buttonMenu;\n init();\n intf.clickIndex = clickIndex;\n intf.rect = rect;\n intf.items = items;\n\n intf.dispose = function () {\n if (buttonMenu.parentNode) {\n buttonMenu.parentNode.removeChild(buttonMenu);\n }\n };\n\n Object.defineProperty(intf, 'selectedIndex', {\n get: function get() {\n return selectedIndex;\n },\n set: function set(value) {\n if (typeof value !== 'number' || isNaN(value) || !isFinite(value)) {\n throw new Error('Button menu selected index must be a sane number.');\n }\n\n selectedIndex = value;\n\n if (selectedIndex > items.length - 1) {\n selectedIndex = items.length - 1;\n }\n\n if (selectedIndex < 0) {\n selectedIndex = 0;\n }\n\n items.forEach(function (item, index) {\n if (index === selectedIndex) {\n return self.createInlineStyle(\n item.buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item:hover',\n );\n }\n\n self.createInlineStyle(\n item.buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item',\n );\n });\n },\n });\n return intf;\n }\n\n self.disposeButtonMenu = function () {\n if (self.buttonMenu) {\n document.removeEventListener('click', self.disposeButtonMenu);\n self.buttonMenu.dispose();\n self.buttonMenu = undefined;\n self.createInlineStyle(\n self.button.wrapper,\n 'canvas-datagrid-button-wrapper:hover',\n );\n }\n };\n\n self.disposeButton = function (e) {\n if (e && e.keyCode !== 27) return;\n document.removeEventListener('keydown', self.disposeButton);\n zIndexTop = self.style.buttonZIndex;\n self.disposeButtonMenu();\n\n if (self.button) {\n self.button.dispose();\n }\n\n self.button = undefined;\n };\n\n self.moveButtonPos = function () {\n self.button.wrapper.style.left =\n self.button.wrapper.left - self.scrollBox.scrollLeft + 'px';\n self.button.wrapper.style.top =\n self.button.wrapper.top - self.scrollBox.scrollTop + 'px';\n self.disposeButtonMenu();\n };\n\n self.attachButton = function (pos, items, imgSrc) {\n function createDisposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('keydown', self.disposeButton);\n });\n }\n\n if (self.button) {\n self.disposeButton();\n }\n\n self.button = createButton(pos, items, imgSrc);\n createDisposeEvent();\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n self.getClippingRect = function (ele) {\n var boundingRect = self.position(self.parentNode),\n eleRect = self.position(ele),\n s = self.scrollOffset(self.canvas),\n clipRect = {\n x: 0,\n y: 0,\n h: 0,\n w: 0,\n },\n parentRect = {\n x: -Infinity,\n y: -Infinity,\n h: Infinity,\n w: Infinity,\n },\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth();\n boundingRect.top -= s.top;\n boundingRect.left -= s.left;\n eleRect.top -= s.top;\n eleRect.left -= s.left;\n clipRect.h =\n boundingRect.top +\n boundingRect.height -\n ele.offsetTop -\n self.style.scrollBarWidth;\n clipRect.w =\n boundingRect.left +\n boundingRect.width -\n ele.offsetLeft -\n self.style.scrollBarWidth;\n clipRect.x = boundingRect.left + eleRect.left * -1 + rowHeaderCellWidth;\n clipRect.y = boundingRect.top + eleRect.top * -1 + columnHeaderCellHeight;\n return {\n x: clipRect.x > parentRect.x ? clipRect.x : parentRect.x,\n y: clipRect.y > parentRect.y ? clipRect.y : parentRect.y,\n h: clipRect.h < parentRect.h ? clipRect.h : parentRect.h,\n w: clipRect.w < parentRect.w ? clipRect.w : parentRect.w,\n };\n };\n self.clipElement = function (ele) {\n var clipRect = self.getClippingRect(ele);\n if (clipRect.w < 0) {\n clipRect.w = 0;\n }\n if (clipRect.h < 0) {\n clipRect.h = 0;\n }\n ele.style.clip =\n 'rect(' +\n clipRect.y +\n 'px,' +\n clipRect.w +\n 'px,' +\n clipRect.h +\n 'px,' +\n clipRect.x +\n 'px' +\n ')';\n // INFO https://developer.mozilla.org/en-US/docs/Web/CSS/clip\n // clip has been \"deprecated\" for clipPath. Of course nothing but chrome\n // supports clip path, so we'll keep using clip until someday clipPath becomes\n // more widely support. The code below works correctly, but setting clipPath and clip\n // at the same time has undesirable results.\n // ele.style.clipPath = 'polygon('\n // + clipRect.x + 'px ' + clipRect.y + 'px,'\n // + clipRect.x + 'px ' + clipRect.h + 'px,'\n // + clipRect.w + 'px ' + clipRect.h + 'px,'\n // + clipRect.w + 'px ' + clipRect.y + 'px'\n // + ')';\n };\n self.scrollOffset = function (e) {\n var x = 0,\n y = 0,\n scrollingElement = document.scrollingElement || {\n scrollLeft: 0,\n scrollTop: 0,\n };\n while (\n e.parentNode &&\n e.nodeName !== 'CANVAS-DATAGRID' &&\n e !== self.intf\n ) {\n if (\n e.nodeType !== 'canvas-datagrid-tree' &&\n e.nodeType !== 'canvas-datagrid-cell'\n ) {\n x -= e.scrollLeft;\n y -= e.scrollTop;\n }\n e = e.parentNode;\n }\n return {\n left: x - scrollingElement.scrollLeft,\n top: y - scrollingElement.scrollTop,\n };\n };\n self.resizeEditInput = function () {\n if (self.input && self.input.editCell) {\n var pos = self.canvas.getBoundingClientRect(),\n s = self.scrollOffset(self.intf),\n bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n borderWidth = self.style.cellBorderWidth * bm,\n cell = self.getVisibleCellByIndex(\n self.input.editCell.columnIndex,\n self.input.editCell.rowIndex,\n ) || { x: -100, y: -100, height: 0, width: 0 };\n if (self.mobile) {\n self.input.style.left = '0';\n self.input.style.top =\n self.height -\n self.style.mobileEditInputHeight -\n borderWidth -\n 1 +\n 'px';\n self.input.style.height = self.style.mobileEditInputHeight + 'px';\n self.input.style.width = self.width - borderWidth - 1 + 'px';\n return;\n }\n self.input.style.left =\n pos.left + cell.x + self.canvasOffsetLeft - s.left + 'px';\n self.input.style.top =\n pos.top +\n cell.y -\n self.style.cellBorderWidth +\n self.canvasOffsetTop -\n s.top +\n 'px';\n self.input.style.height = cell.height - borderWidth + 'px';\n self.input.style.width = cell.width - self.style.cellPaddingLeft + 'px';\n self.clipElement(self.input);\n }\n };\n self.position = function (e, ignoreScrollOffset) {\n var x = 0,\n y = 0,\n s = e,\n h,\n w;\n 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-button-wrapper': {\n display: 'inline-block',\n padding: self.style.buttonPadding,\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: self.style.buttonBorderColor,\n cursor: 'pointer',\n background: self.style.buttonBackgroundColor,\n userSelect: 'none',\n },\n 'canvas-datagrid-button-wrapper:hover': {\n borderColor: self.style.buttonBorderColor,\n background: self.style.buttonHoverBackgroundColor,\n },\n 'canvas-datagrid-button-wrapper:active': {\n borderColor: self.style.buttonActiveBorderColor,\n background: self.style.buttonActiveBackgroundColor,\n },\n 'canvas-datagrid-button-icon': {\n width: '18px',\n height: '18px',\n display: 'inline-block',\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-button-arrow': {\n display: 'inline-block',\n color: self.style.buttonArrowColor,\n fontSize: '9px',\n },\n 'canvas-datagrid-button-menu-item-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-button-menu-item': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-button-menu-item:hover': {\n background: self.style.contextMenuHoverBackground,\n color: self.style.contextMenuHoverColor,\n },\n 'canvas-datagrid-button-menu-label': {\n margin: self.style.contextMenuLabelMargin,\n display: self.style.contextMenuLabelDisplay,\n minWidth: self.style.contextMenuLabelMinWidth,\n maxWidth: self.style.contextMenuLabelMaxWidth,\n },\n 'canvas-datagrid-button-menu-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n },\n 'canvas-datagrid-button-menu': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n cursor: self.style.contextMenuCursor,\n },\n 'canvas-datagrid-context-menu-filter-input': {\n height: '19px',\n verticalAlign: 'bottom',\n marginLeft: '2px',\n padding: '0',\n background: self.style.contextFilterInputBackground,\n color: self.style.contextFilterInputColor,\n border: self.style.contextFilterInputBorder,\n borderRadius: self.style.contextFilterInputBorderRadius,\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextFilterInputFontFamily,\n fontSize: self.style.contextFilterInputFontSize,\n },\n 'canvas-datagrid-context-menu-filter-button': {\n height: '19px',\n verticalAlign: 'bottom',\n marginLeft: '2px',\n padding: '0',\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextFilterButtonBorder,\n borderRadius: self.style.contextFilterButtonBorderRadius,\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFilterButtonFontFamily,\n fontSize: self.style.contextMenuFilterButtonFontSize,\n },\n 'canvas-datagrid-context-child-arrow': {\n cssFloat: 'right',\n color: self.style.childContextMenuArrowColor,\n fontSize: self.style.contextMenuChildArrowFontSize,\n fontFamily: self.style.contextMenuFontFamily,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-autocomplete': {\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n position: 'absolute',\n zIndex: 9999,\n overflow: 'hidden',\n },\n 'canvas-datagrid-autocomplete-item': {\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n },\n 'canvas-datagrid-autocomplete-item:hover': {\n background: self.style.contextMenuHoverBackground,\n color: self.style.contextMenuHoverColor,\n },\n 'canvas-datagrid-canvas': {\n position: 'absolute',\n zIndex: '-1',\n },\n 'canvas-datagrid': {\n display: 'block',\n },\n 'canvas-datagrid-control-input': {\n position: 'fixed',\n top: '-5px',\n left: '-5px',\n border: 'none',\n opacity: '0',\n cursor: 'pointer',\n width: '1px',\n height: '1px',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n },\n 'canvas-datagrid-edit-mobile-input': {\n boxSizing: 'content-box',\n outline: 'none',\n margin: '0',\n padding: '0 0 0 0',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.mobileEditFontFamily,\n fontSize: self.style.mobileEditFontSize,\n border: self.style.editCellBorder,\n color: self.style.editCellColor,\n background: self.style.editCellBackgroundColor,\n appearance: 'none',\n webkitAppearance: 'none',\n mozAppearance: 'none',\n borderRadius: '0',\n },\n 'canvas-datagrid-edit-input': {\n boxSizing: 'content-box',\n outline: 'none',\n margin: '0',\n padding: '0 0 0 ' + self.style.editCellPaddingLeft + 'px',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.editCellFontFamily,\n fontSize: self.style.editCellFontSize,\n boxShadow: self.style.editCellBoxShadow,\n border: self.style.editCellBorder,\n color: self.style.editCellColor,\n background: self.style.editCellBackgroundColor,\n appearance: 'none',\n webkitAppearance: 'none',\n mozAppearance: 'none',\n borderRadius: '0',\n },\n 'canvas-datagrid-context-menu-item-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-context-menu-item': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-context-menu-item:hover': {\n background: self.style.contextMenuHoverBackground,\n color: self.style.contextMenuHoverColor,\n },\n 'canvas-datagrid-context-menu-label': {\n margin: self.style.contextMenuLabelMargin,\n display: self.style.contextMenuLabelDisplay,\n minWidth: self.style.contextMenuLabelMinWidth,\n maxWidth: self.style.contextMenuLabelMaxWidth,\n },\n 'canvas-datagrid-context-menu-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n },\n 'canvas-datagrid-context-menu': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n cursor: self.style.contextMenuCursor,\n },\n 'canvas-datagrid-invalid-search-regExp': {\n background: self.style.contextMenuFilterInvalidExpresion,\n },\n };\n if (css[className]) {\n Object.keys(css[className]).map(function (prop) {\n el.style[prop] = css[className][prop];\n });\n }\n return;\n };\n self.appendTo = function (e) {\n self.parentNode = e;\n self.setDom();\n };\n self.setDom = function () {\n if (self.isChildGrid) {\n self.parentGrid = self.parentNode.parentGrid;\n self.ctx = self.parentGrid.context;\n self.canvas = self.parentGrid.canvas;\n self.controlInput = self.parentGrid.controlInput;\n self.eventParent = self.canvas;\n } else {\n self.controlInput = self.controlInput || document.createElement('input');\n self.controlInput.onblur = self.intf.blur;\n self.createInlineStyle(\n self.controlInput,\n 'canvas-datagrid-control-input',\n );\n self.isChildGrid = false;\n self.parentDOMNode = self.parentNode;\n self.parentIsCanvas = /^canvas$/i.test(self.parentDOMNode.tagName);\n if (self.parentIsCanvas) {\n self.canvas = self.parentDOMNode;\n } else {\n self.canvas = document.createElement('canvas');\n self.parentDOMNode.appendChild(self.canvas);\n }\n document.body.appendChild(self.controlInput);\n self.createInlineStyle(self.canvas, 'canvas-datagrid');\n self.ctx = self.canvas.getContext('2d');\n self.ctx.textBaseline = 'alphabetic';\n self.eventParent = self.canvas;\n }\n self.parentNodeStyle = self.canvas.style;\n self.controlInput.setAttribute('readonly', true);\n self.controlInput.addEventListener('blur', function (e) {\n if (e.target !== self.canvas) {\n self.hasFocus = false;\n }\n });\n self.eventParent.addEventListener('scroll', self.resize, false);\n self.eventParent.addEventListener('touchstart', self.touchstart, false);\n self.eventParent.addEventListener('mouseup', self.mouseup, false);\n self.eventParent.addEventListener('mousedown', self.mousedown, false);\n self.eventParent.addEventListener('dblclick', self.dblclick, false);\n self.eventParent.addEventListener('click', self.click, false);\n document.body.addEventListener('mousemove', self.mousemove);\n self[self.isChildGrid ? 'parentGrid' : 'eventParent'].addEventListener(\n 'wheel',\n self.scrollWheel,\n false,\n );\n self.canvas.addEventListener('contextmenu', self.contextmenuEvent, false);\n self.controlInput.addEventListener('copy', self.copy);\n self.controlInput.addEventListener('cut', self.cut);\n self.controlInput.addEventListener('paste', self.paste);\n self.controlInput.addEventListener('keypress', self.keypress, false);\n self.controlInput.addEventListener('keyup', self.keyup, false);\n self.controlInput.addEventListener('keydown', self.keydown, false);\n window.addEventListener('resize', self.resize);\n };\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n /**\n * Converts a integer into a letter A - ZZZZZ...\n * @memberof canvasDatagrid\n * @name integerToAlpha\n * @method\n * @param {column} n The number to convert.\n */\n self.integerToAlpha = function (n) {\n var ordA = 'a'.charCodeAt(0),\n ordZ = 'z'.charCodeAt(0),\n len = ordZ - ordA + 1,\n s = '';\n while (n >= 0) {\n s = String.fromCharCode((n % len) + ordA) + s;\n n = Math.floor(n / len) - 1;\n }\n return s;\n };\n /**\n * Inserts a new column before the specified index into the schema.\n * @tutorial schema\n * @memberof canvasDatagrid\n * @name insertColumn\n * @method\n * @param {column} c The column to insert into the schema.\n * @param {number} index The index of the column to insert before.\n */\n self.insertColumn = function (c, index) {\n var s = self.getSchema();\n if (s.length < index) {\n throw new Error('Index is beyond the length of the schema.');\n }\n self.validateColumn(c, s);\n s.splice(index, 0, c);\n\n self.originalData.forEach(function (row, rowIndex) {\n self.applyDefaultValue(row, c, rowIndex);\n });\n self.intf.schema = s;\n\n self.refresh();\n };\n /**\n * Deletes a column from the schema at the specified index.\n * @memberof canvasDatagrid\n * @name deleteColumn\n * @tutorial schema\n * @method\n * @param {number} index The index of the column to delete.\n */\n self.deleteColumn = function (index) {\n var schema = self.getSchema();\n\n // remove data matching this column name from data\n self.originalData.forEach(function (row) {\n delete row[schema[index].name];\n });\n\n schema.splice(index, 1);\n self.intf.schema = schema;\n\n self.refresh();\n };\n /**\n * Adds a new column into the schema.\n * @tutorial schema\n * @memberof canvasDatagrid\n * @name addColumn\n * @method\n * @param {column} c The column to add to the schema.\n */\n self.addColumn = function (c) {\n var s = self.getSchema();\n self.validateColumn(c, s);\n s.push(c);\n self.originalData.forEach(function (row, rowIndex) {\n self.applyDefaultValue(row, c, rowIndex);\n });\n self.intf.schema = s;\n\n self.refresh();\n };\n /**\n * Deletes a row from the dataset at the specified index.\n * @memberof canvasDatagrid\n * @name deleteRow\n * @method\n * @param {number} index The index of the row to delete.\n */\n self.deleteRow = function (index) {\n self.originalData.splice(index, 1);\n self.setFilter();\n self.resize(true);\n };\n /**\n * Inserts a new row into the dataset before the specified index.\n * @memberof canvasDatagrid\n * @name insertRow\n * @method\n * @param {object} d data.\n * @param {number} index The index of the row to insert before.\n */\n self.insertRow = function (d, index) {\n if (self.originalData.length < index) {\n throw new Error('Index is beyond the length of the dataset.');\n }\n self.originalData.splice(index, 0, d);\n self.getSchema().forEach(function (c) {\n if (d[c.name] === undefined) {\n self.applyDefaultValue(self.originalData[index], c, index);\n }\n });\n\n // setFilter calls .refresh(), so we need not call it again:\n self.setFilter();\n\n self.resize(true);\n };\n /**\n * Adds a new row into the dataset.\n * @memberof canvasDatagrid\n * @name addRow\n * @method\n * @param {object} d data.\n */\n self.addRow = function (d) {\n self.originalData.push(d);\n self.getSchema().forEach(function (c) {\n if (d[c.name] === undefined) {\n self.applyDefaultValue(\n self.originalData[self.originalData.length - 1],\n c,\n self.originalData.length - 1,\n );\n }\n });\n\n // setFilter calls .refresh(), so we need not call it again:\n self.setFilter();\n\n self.resize(true);\n };\n /**\n * Sets the height of a given row by index number.\n * @memberof canvasDatagrid\n * @name setRowHeight\n * @method\n * @param {number} rowIndex The index of the row to set.\n * @param {number} height Height to set the row to.\n */\n self.setRowHeight = function (rowIndex, height) {\n self.sizes.rows[rowIndex] = height;\n self.draw(true);\n };\n /**\n * Sets the width of a given column by index number.\n * @memberof canvasDatagrid\n * @name setColumnWidth\n * @method\n * @param {number} colIndex The index of the column to set.\n * @param {number} width Width to set the column to.\n */\n self.setColumnWidth = function (colIndex, width) {\n self.sizes.columns[colIndex] = width;\n self.draw(true);\n };\n /**\n * Removes any changes to the width of the columns due to user or api interaction, setting them back to the schema or style default.\n * @memberof canvasDatagrid\n * @name resetColumnWidths\n * @tutorial schema\n * @method\n */\n self.resetColumnWidths = function () {\n self.sizes.columns = {};\n self.draw(true);\n };\n /**\n * Removes any changes to the height of the rows due to user or api interaction, setting them back to the schema or style default.\n * @memberof canvasDatagrid\n * @name resetRowHeights\n * @tutorial schema\n * @method\n */\n self.resetRowHeights = function () {\n self.sizes.rows = {};\n self.draw(true);\n };\n /**\n * Sets the value of the filter.\n * @memberof canvasDatagrid\n * @name setFilter\n * @method\n * @param {string} column Name of the column to filter.\n * @param {string} value The value to filter for.\n */\n self.setFilter = function (column, value) {\n if (column === undefined && value === undefined) {\n self.columnFilters = {};\n } else if (column && (value === '' || value === undefined)) {\n delete self.columnFilters[column];\n } else {\n self.columnFilters[column] = value;\n if (self.attributes.showFilterInCell) {\n self.filterable.rows.push(0);\n self.orders.columns.forEach(function (value, index) {\n self.filterable.columns.push(index);\n });\n }\n }\n if (!Object.keys(self.columnFilters).length) {\n self.filterable = {\n rows: [],\n columns: [],\n };\n }\n self.refresh();\n };\n /**\n * Returns the number of pixels to scroll down to line up with row rowIndex.\n * @memberof canvasDatagrid\n * @name findRowScrollTop\n * @method\n * @param {number} rowIndex The row index of the row to scroll find.\n */\n self.findRowScrollTop = function (rowIndex) {\n if (self.scrollCache.y[rowIndex] === undefined) {\n throw new RangeError(\n `Row index ${rowIndex} out of range: ${self.scrollCache.y.length}.`,\n );\n }\n return self.scrollCache.y[rowIndex];\n };\n /**\n * Returns the number of pixels to scroll to the left to line up with column columnIndex.\n * @memberof canvasDatagrid\n * @name findColumnScrollLeft\n * @method\n * @param {number} columnIndex The column index of the column to find.\n */\n self.findColumnScrollLeft = function (columnIndex) {\n var i = Math.max(columnIndex - 1, 0);\n if (self.scrollCache.x[i] === undefined) {\n throw new Error('Column index out of range.');\n }\n return (\n self.scrollCache.x[i] -\n self.getColumnWidth(self.orders.columns[columnIndex])\n );\n };\n /**\n * Scrolls to the cell at columnIndex x, and rowIndex y. If you define both rowIndex and columnIndex additional calculations can be made to center the cell using the target cell's height and width. Defining only one rowIndex or only columnIndex will result in simpler calculations.\n * @memberof canvasDatagrid\n * @name gotoCell\n * @method\n * @param {number} x The column index of the cell to scroll to.\n * @param {number} y The row index of the cell to scroll to.\n * @param {number} [offsetX=0] Percentage offset the cell should be from the left edge (not including headers). The default is 0, meaning the cell will appear at the left edge. Valid values are 0 through 1. 1 = Left, 0 = Right, 0.5 = Center.\n * @param {number} [offsetY=0] Percentage offset the cell should be from the top edge (not including headers). The default is 0, meaning the cell will appear at the top edge. Valid values are 0 through 1. 1 = Bottom, 0 = Top, 0.5 = Center.\n */\n self.gotoCell = function (x, y, offsetX, offsetY) {\n var targetX = x === undefined ? undefined : self.findColumnScrollLeft(x),\n targetY = y === undefined ? undefined : self.findRowScrollTop(y),\n cell,\n sbw =\n self.scrollBox.width -\n (self.scrollBox.verticalBarVisible ? self.style.scrollBarWidth : 0),\n sbh =\n self.scrollBox.height -\n (self.scrollBox.horizontalBarVisible ? self.style.scrollBarWidth : 0);\n offsetX = offsetX === undefined ? 0 : offsetX;\n offsetY = offsetY === undefined ? 0 : offsetY;\n targetX -= sbw * offsetX;\n targetY -= sbh * offsetY;\n if (x !== undefined && y !== undefined) {\n self.scrollBox.scrollTo(targetX, targetY);\n requestAnimationFrame(function () {\n cell = self.getVisibleCellByIndex(x, y);\n // HACK: just don't offset if the target cell cannot be seen\n // TODO: offset does not work on very small grids, not sure why\n if (!cell) {\n return;\n }\n targetX += cell.width * offsetX;\n targetY += cell.height * offsetY;\n self.scrollBox.scrollTo(targetX, targetY);\n });\n } else if (x !== undefined) {\n self.scrollBox.scrollLeft = targetX;\n } else if (y !== undefined) {\n self.scrollBox.scrollTop = targetY;\n }\n };\n /**\n * Scrolls the row y.\n * @memberof canvasDatagrid\n * @name gotoRow\n * @method\n * @param {number} y The row index of the cell to scroll to.\n */\n self.gotoRow = function (y) {\n self.gotoCell(0, y);\n };\n /**\n * Add a button into the cell.\n * @memberof canvasDatagrid\n * @name addButton\n * @method\n * @param {number} columnIndex The column index of the cell to to add a button.\n * @param {number} rowIndex The row index of the cell to to add a button.\n * @param {object} offset Offset how far go away from cell.\n * @param {object} items a list of items to add into button menu.\n * @param {string} imgSrc icon path to add into button.\n */\n self.addButton = function (columnIndex, rowIndex, offset, items, imgSrc) {\n var cells = self.visibleCells.filter(function (c) {\n return c.sortColumnIndex === columnIndex && c.sortRowIndex === rowIndex;\n });\n\n self.attachButton(\n {\n top: cells[0].y + cells[0].height + offset.y,\n left: cells[0].x + cells[0].width + offset.x,\n },\n items,\n imgSrc,\n );\n };\n /**\n * Scrolls the cell at cell x, row y into view if it is not already.\n * @memberof canvasDatagrid\n * @name scrollIntoView\n * @method\n * @param {number} x The column index of the cell to scroll into view.\n * @param {number} y The row index of the cell to scroll into view.\n * @param {number} [offsetX=0] Percentage offset the cell should be from the left edge (not including headers). The default is 0, meaning the cell will appear at the left edge. Valid values are 0 through 1. 1 = Left, 0 = Right, 0.5 = Center.\n * @param {number} [offsetY=0] Percentage offset the cell should be from the top edge (not including headers). The default is 0, meaning the cell will appear at the top edge. Valid values are 0 through 1. 1 = Bottom, 0 = Top, 0.5 = Center.\n */\n self.scrollIntoView = function (x, y, offsetX, offsetY) {\n 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 indices of columns next to the selected columnIndex is selected on every row.\n * @memberof canvasDatagrid\n * @name isMultiColumnsSelected\n * @method\n * @param {number} columnIndex The column index to check.\n */\n self.isMultiColumnsSelected = function (columnIndex) {\n var multiColIsSelected = true;\n self.viewData.forEach(function (row, rowIndex) {\n var columnIndices = self.selections[rowIndex];\n if (\n !columnIndices ||\n columnIndices.length <= 1 ||\n columnIndices.indexOf(columnIndex) === -1\n ) {\n multiColIsSelected = false;\n } else if (columnIndices.length > 1) {\n if (columnIndices[0] != columnIndex) multiColIsSelected = false;\n else {\n for (var i = 0; i < columnIndices.length - 1; i++) {\n if (columnIndices[i] + 1 != columnIndices[i + 1]) {\n multiColIsSelected = false;\n break;\n }\n }\n }\n }\n });\n return multiColIsSelected;\n };\n /**\n * Returns true if the selected columnIndex is selected on every row.\n * @memberof canvasDatagrid\n * @name isColumnSelected\n * @method\n * @param {number} columnIndex The column index to check.\n */\n self.isColumnSelected = function (columnIndex) {\n var colIsSelected = true;\n self.viewData.forEach(function (row, rowIndex) {\n if (\n !self.selections[rowIndex] ||\n self.selections[rowIndex].indexOf(columnIndex) === -1\n ) {\n colIsSelected = false;\n }\n });\n return colIsSelected;\n };\n /**\n * Runs the defined method on each selected cell.\n * @memberof canvasDatagrid\n * @name forEachSelectedCell\n * @method\n * @param {number} fn The function to execute. The signature of the function is: (data, rowIndex, columnName).\n * @param {number} expandToRow When true the data in the array is expanded to the entire row.\n */\n self.forEachSelectedCell = function (fn, expandToRow) {\n var d = [],\n s = expandToRow ? self.getSchema() : self.getVisibleSchema(),\n l = self.viewData.length;\n self.selections.forEach(function (row, index) {\n if (index === l) {\n return;\n }\n if (row.length === 0) {\n d[index] = null;\n return;\n }\n d[index] = {};\n row.forEach(function (col) {\n if (col === -1 || !s[col]) {\n return;\n }\n fn(self.viewData, index, s[col].name);\n });\n });\n };\n /**\n * Selects a column.\n * @memberof canvasDatagrid\n * @name selectColumn\n * @method\n * @param {number} columnIndex The column index to select.\n * @param {boolean} toggleSelectMode When true, behaves as if you were holding control/command when you clicked the column.\n * @param {boolean} shift When true, behaves as if you were holding shift when you clicked the column.\n * @param {boolean} supressSelectionchangedEvent When true, prevents the selectionchanged event from firing.\n */\n self.selectColumn = function (columnIndex, ctrl, shift, supressEvent) {\n var s, e, x;\n function addCol(i) {\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = self.selections[rowIndex] || [];\n if (self.selections[rowIndex].indexOf(i) === -1) {\n self.selections[rowIndex].push(i);\n }\n });\n }\n function removeCol(i) {\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = self.selections[rowIndex] || [];\n if (self.selections[rowIndex].indexOf(i) !== -1) {\n self.selections[rowIndex].splice(\n self.selections[rowIndex].indexOf(i),\n 1,\n );\n }\n });\n }\n if (shift) {\n if (!self.activeCell) {\n return;\n }\n s = Math.min(self.activeCell.columnIndex, columnIndex);\n e = Math.max(self.activeCell.columnIndex, columnIndex);\n for (x = s; e > x; x += 1) {\n addCol(x);\n }\n }\n if (!ctrl && !shift) {\n self.selections = [];\n self.activeCell.columnIndex = columnIndex;\n self.activeCell.rowIndex = self.scrollIndexTop;\n }\n if (ctrl && self.isColumnSelected(columnIndex)) {\n removeCol(columnIndex);\n } else {\n addCol(columnIndex);\n }\n if (supressEvent) {\n return;\n }\n self.dispatchEvent('selectionchanged', {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\n });\n };\n /**\n * Selects a row.\n * @memberof canvasDatagrid\n * @name selectRow\n * @method\n * @param {number} rowIndex The row index to select.\n * @param {boolean} ctrl When true, behaves as if you were holding control/command when you clicked the row.\n * @param {boolean} shift When true, behaves as if you were holding shift when you clicked the row.\n * @param {boolean} supressSelectionchangedEvent When true, prevents the selectionchanged event from firing.\n */\n self.selectRow = function (rowIndex, ctrl, shift, supressEvent) {\n var x,\n st,\n en,\n s = self.getVisibleSchema();\n self.isMultiRowsSelected = false;\n function de() {\n if (supressEvent) {\n return;\n }\n self.dispatchEvent('selectionchanged', {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.selectionBounds,\n selectedCells: self.getSelectedCells(),\n });\n }\n function addRow(ri) {\n self.selections[ri] = [];\n self.selections[ri].push(-1);\n s.forEach(function (col, index) {\n self.selections[ri].push(self.orders.columns.indexOf(col.index));\n });\n }\n if (self.dragAddToSelection === false || self.dragObject === undefined) {\n if (\n self.selections[rowIndex] &&\n self.selections[rowIndex].length - 1 === s.length\n ) {\n if (ctrl) {\n self.selections[rowIndex] = [];\n de();\n return;\n }\n }\n }\n if (self.dragAddToSelection === true || self.dragObject === undefined) {\n if (shift && self.dragObject === undefined) {\n if (!self.activeCell) {\n return;\n }\n st = Math.min(self.activeCell.rowIndex, rowIndex);\n en = Math.max(self.activeCell.rowIndex, rowIndex);\n for (x = st; en >= x; x += 1) {\n addRow(x);\n }\n } else {\n addRow(rowIndex);\n }\n }\n de();\n };\n /**\n * Collapse a tree grid by row index.\n * @memberof canvasDatagrid\n * @name collapseTree\n * @method\n * @param {number} index The index of the row to collapse.\n */\n self.collapseTree = function (rowIndex) {\n self.dispatchEvent('collapsetree', {\n childGrid: self.childGrids[rowIndex],\n data: self.viewData[rowIndex],\n rowIndex: rowIndex,\n });\n self.openChildren[rowIndex].blur();\n self.openChildren[rowIndex].dispose();\n delete self.openChildren[rowIndex];\n delete self.sizes.trees[rowIndex];\n delete self.childGrids[rowIndex];\n self.dispatchEvent('resizerow', {\n cellHeight: self.style.cellHeight,\n });\n self.resize(true);\n self.draw(true);\n };\n /**\n * Expands a tree grid by row index.\n * @memberof canvasDatagrid\n * @name expandTree\n * @method\n * @param {number} index The index of the row to expand.\n */\n self.expandTree = function (rowIndex) {\n var trArgs = self.args.treeGridAttributes || {},\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth =\n self.sizes.columns.cornerCell || self.style.rowHeaderCellWidth,\n h = self.sizes.trees[rowIndex] || self.style.treeGridHeight,\n treeGrid;\n if (!self.childGrids[rowIndex]) {\n trArgs.debug = self.attributes.debug;\n trArgs.name = self.attributes.saveAppearance\n ? self.attributes.name + 'tree' + rowIndex\n : undefined;\n trArgs.style = trArgs.style || self.style;\n trArgs.parentNode = {\n parentGrid: self.intf,\n nodeType: 'canvas-datagrid-tree',\n offsetHeight: h,\n offsetWidth: self.width - rowHeaderCellWidth,\n header: { width: self.width - rowHeaderCellWidth },\n offsetLeft: rowHeaderCellWidth,\n offsetTop: columnHeaderCellHeight,\n offsetParent: self.intf.parentNode,\n parentNode: self.intf.parentNode,\n style: 'tree',\n data: self.viewData[rowIndex],\n };\n treeGrid = self.createGrid(trArgs);\n self.childGrids[rowIndex] = treeGrid;\n }\n treeGrid = self.childGrids[rowIndex];\n treeGrid.visible = true;\n self.dispatchEvent('expandtree', {\n treeGrid: treeGrid,\n data: self.viewData[rowIndex],\n rowIndex: rowIndex,\n });\n self.openChildren[rowIndex] = treeGrid;\n self.sizes.trees[rowIndex] = h;\n self.dispatchEvent('resizerow', { height: self.style.cellHeight });\n self.resize(true);\n };\n /**\n * Toggles tree grid open and close by row index.\n * @memberof canvasDatagrid\n * @name toggleTree\n * @method\n * @param {number} index The index of the row to toggle.\n */\n self.toggleTree = function (rowIndex) {\n var i = self.openChildren[rowIndex];\n if (i) {\n return self.collapseTree(rowIndex);\n }\n self.expandTree(rowIndex);\n };\n /**\n * Returns a header from the schema by name.\n * @memberof canvasDatagrid\n * @name getHeaderByName\n * @tutorial schema\n * @method\n * @returns {header} header with the selected name, or undefined.\n * @param {string} name The name of the column to resize.\n */\n self.getHeaderByName = function (name) {\n var x,\n i = self.getSchema();\n for (x = 0; x < i.length; x += 1) {\n if (i[x].name === name) {\n return i[x];\n }\n }\n };\n /**\n * Resizes a column to fit the longest value in the column. Call without a value to resize all columns.\n * Warning, can be slow on very large record sets (1m records ~3-5 seconds on an i7).\n * @memberof canvasDatagrid\n * @name fitColumnToValues\n * @method\n * @param {string} name The name of the column to resize.\n */\n self.fitColumnToValues = function (name, internal) {\n if (!self.canvas) {\n return;\n }\n 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 button from './button';\nimport dom from './dom';\nimport publicMethods from './publicMethods';\n\nvar webComponent = component();\n\nvar modules = [\n defaults,\n draw,\n events,\n touch,\n intf,\n contextMenu,\n button,\n dom,\n publicMethods,\n];\n\nfunction Grid(args) {\n args = args || {};\n var self = {};\n self.isComponent = args.component === undefined;\n self.isChildGrid =\n args.parentNode &&\n /canvas-datagrid-(cell|tree)/.test(args.parentNode.nodeType);\n if (self.isChildGrid) {\n self.intf = {};\n } else {\n self.intf = self.isComponent\n ? eval('Reflect.construct(HTMLElement, [], new.target)')\n : document.createElement('canvas');\n }\n self.args = args;\n self.intf.args = args;\n self.applyComponentStyle = webComponent.applyComponentStyle;\n self.hyphenateProperty = webComponent.hyphenateProperty;\n self.dehyphenateProperty = webComponent.dehyphenateProperty;\n self.createGrid = function grid(args) {\n args.component = false;\n return new Grid(args);\n };\n\n modules.forEach(function (module) {\n module(self);\n });\n\n if (self.isChildGrid) {\n self.shadowRoot = args.parentNode.shadowRoot;\n self.parentNode = args.parentNode;\n } else {\n self.shadowRoot = self.intf.attachShadow({ mode: 'open' });\n self.parentNode = self.shadowRoot;\n }\n self.init();\n return self.intf;\n}\nif (window.HTMLElement) {\n Grid.prototype = Object.create(window.HTMLElement.prototype);\n}\n// export web component\nif (window.customElements) {\n Grid.observedAttributes = webComponent.getObservableAttributes();\n Grid.prototype.disconnectedCallback = webComponent.disconnectedCallback;\n Grid.prototype.attributeChangedCallback =\n webComponent.attributeChangedCallback;\n Grid.prototype.connectedCallback = webComponent.connectedCallback;\n Grid.prototype.adoptedCallback = webComponent.adoptedCallback;\n window.customElements.define('canvas-datagrid', Grid);\n}\n\n// export global\nif (\n window &&\n !window.canvasDatagrid &&\n !window.require &&\n // Present to exclude global declarations from ES Module bundles\n !window.EXCLUDE_GLOBAL\n) {\n window.canvasDatagrid = function (args) {\n return new Grid(args);\n };\n}\n\n// export amd loader\nexport default function canvasDatagrid(args) {\n args = args || {};\n var i,\n tKeys = [\n 'style',\n 'formatters',\n 'sorters',\n 'filters',\n 'treeGridAttributes',\n 'cellGridAttributes',\n 'data',\n 'schema',\n ];\n if (window.customElements) {\n i = document.createElement('canvas-datagrid');\n Object.keys(args).forEach(function (argKey) {\n // set data and parentNode after everything else\n if (argKey === 'data') {\n return;\n }\n if (argKey === 'parentNode') {\n return;\n }\n // top level keys in args\n if (tKeys.indexOf(argKey) !== -1) {\n tKeys.forEach(function (tKey) {\n if (args[tKey] === undefined || tKey !== argKey) {\n return;\n }\n if (['formatters', 'sorters', 'filters'].indexOf(argKey) !== -1) {\n if (typeof args[tKey] === 'object' && args[tKey] !== null) {\n Object.keys(args[tKey]).forEach(function (sKey) {\n i[tKey][sKey] = args[tKey][sKey];\n });\n }\n } else {\n i[tKey] = args[tKey];\n }\n });\n return;\n }\n // all others are attribute level keys\n i.attributes[argKey] = args[argKey];\n });\n if (args.data) {\n i.data = args.data;\n }\n // add to the dom very last to avoid redraws\n if (args.parentNode) {\n args.parentNode.appendChild(i);\n }\n return i;\n }\n args.component = false;\n i = new Grid(args);\n if (args.parentNode && args.parentNode.appendChild) {\n args.parentNode.appendChild(i);\n }\n return i;\n}\n"],"names":["self","defaults","attributes","styles","typeMap","component","dehyphenateProperty","prop","replace","nextLetterCap","p","Array","prototype","forEach","call","char","toUpperCase","hyphenateProperty","cust","toLowerCase","applyComponentStyle","supressChangeAndDrawEvents","intf","isComponent","cStyle","window","getComputedStyle","tagName","canvas","defs","computedStyle","def","val","getPropertyValue","setStyleProperty","dispatchEvent","requestAnimationFrame","resize","style","data","strData","JSON","parse","e","Error","schema","strSchema","number","strNum","n","parseInt","isNaN","boolean","strBool","test","string","str","getObservableAttributes","i","attrs","attr","push","disconnectedCallback","connected","connectedCallback","this","parentDOMNode","innerHTML","appendChild","observe","adoptedCallback","attributeChangedCallback","attrName","oldVal","newVal","tfn","dataType","base","item","filter","addEventListener","Function","name","observer","MutationObserver","mutations","checkInnerHTML","checkStyle","mutation","attributeName","target","nodeName","parentNode","addedNodes","length","type","characterData","childList","subtree","document","querySelectorAll","el","perfCounters","cachedImagesDrawn","drawCount","perfWindowSize","entityCount","scrollDebugCounters","touchPPSCounters","fillArray","low","high","step","x","undefined","drawHtml","cell","img","v","formattedValue","cacheKey","toString","rowIndex","columnIndex","Math","round","canvasOffsetLeft","y","canvasOffsetTop","htmlImageCache","height","width","complete","ctx","drawImage","Image","onload","loaded","Object","keys","html","draw","src","btoa","radiusRect","w","h","radius","r","b","beginPath","moveTo","lineTo","quadraticCurveTo","fillRect","strokeRect","fillText","text","clipFrozenArea","mode","lastFrozenColumnPixel","lastFrozenRowPixel","clip","fillHandle","selectionHandleType","arc","PI","fill","fillCircle","strokeHandle","stroke","strokeCircle","addBorderLine","c","pos","t","l","internal","isChildGrid","parentGrid","visible","checkScrollHeight","cx","cy","treeGrid","rowOpen","rowHeight","cornerCell","rowData","aCell","my","mx","xHover","yHover","drawCorner","en","m","d","viewData","bc","gridBorderCollapse","selectionBorders","moveBorders","selectionHandles","rowHeaders","u","currentCell","columnHeaderCellHeight","getColumnHeaderCellHeight","rowHeaderCellWidth","getRowHeaderCellWidth","cellHeight","performance","now","visibleRowHeights","orders","rows","createRowOrders","save","visibleRows","getSchema","visibleCells","offsetTop","offsetLeft","fillStyle","gridBackgroundColor","ln","min","frozenRow","scrollBox","scrollLeft","scrollPixelLeft","cellBorderWidth","drawRow","allowFreezingRows","frozenMarkerBorderWidth","frozenMarkerWidth","drawFrozenRows","columnOrderIndex","rowOrderIndex","headerIndex","g","snapToRow","scrollTop","scrollPixelTop","scrollIndexTop","scrollIndexBottom","scrollPixelBottom","showNewRow","showRowHeaders","scrollIndexLeft","columns","drawCell","newRow","restore","drawRows","cl","activeCell","frozenColumn","selectionMode","lineWidth","activeCellOverlayBorderWidth","strokeStyle","activeCellOverlayBorderColor","getHeaderWidth","drawActiveCell","o","columnHeaderCell","header","nonFrozenHeaderWidth","drawHeaderColumnRange","start","end","hidden","title","cellWidth","index","order","rArgs","rhIndex","filteredRowNumber","getBoundRowIndexFromViewRowIndex","originalData","rowHeaderValue","hasActiveFilters","rowHeaderCell","headerDescription","sizes","openChildren","drawRowHeader","showColumnHeaders","columnHeaderCellBorderWidth","scrollBarWidth","isColumnHeaderCell","isColumnHeaderCellCap","endCap","drawHeaders","allowFreezingColumns","frozenMarkerHoverColor","frozenMarkerColor","frozenMarkerHoverBorderColor","frozenMarkerBorderColor","unshift","freezeMarkerPosition","frozenMarkerActiveColor","frozenMarkerActiveBorderColor","dragMode","mobile","allowMovingSelection","selectionHandleBorderWidth","selectionHandleBorderColor","selectionHandleColor","hw","selectionHandleSize","tr","br","tl","bl","addselectionHandle","az","touchSelectHandleZone","ax","ay","reorderObject","dragOffset","reorderMarkerBackgroundColor","reorderMarkerBorderWidth","reorderMarkerBorderColor","k","selections","getRowHeight","reorderMarkerIndexBorderWidth","reorderMarkerIndexBorderColor","reorderTarget","sortRowIndex","selectedColumns","getColumnWidth","sortColumnIndex","drawReorderMarkers","movingSelection","moveOverlayBorderWidth","moveOverlayBorderColor","setLineDash","moveOverlayBorderSegments","gridBorderWidth","gridBorderColor","dsb","selectionOverlayBorderWidth","selectionOverlayBorderColor","drawSelectionBorders","entities","scrollBarBoxMargin","scrollBarBorderColor","scrollBarBorderWidth","horizontalBox","scrollCache","horizontalBar","scrollBoxWidth","scrollWidth","verticalBox","verticalBar","scrollBoxHeight","scrollHeight","horizontalBarVisible","scrollBarBackgroundColor","scrollBarBoxColor","horizontalBoxVisible","context","scrollBarActiveColor","scrollBarBoxBorderRadius","verticalBarVisible","verticalBoxVisible","scrollBarCornerBorderColor","scrollBarCornerBackgroundColor","corner","showPerformance","debug","pop","font","debugFont","perf","reduce","a","toFixed","perfDelta","frozenColumnsWidth","s","getFrozenColumnsWidth","htmlImages","scale","startScale","scaleDelta","zoomDeltaStart","touchLength","touches","touchPosition","touchPosition1","scrollIndex","scrollPixel","canvasOffset","touchDelta","touchAnimateTo","scrollAnimation","touchPPS","xPPS","yPPS","touchPPST","xPPST","yPPST","touchDuration","pointerLockPosition","size","mouse","touch","touchStart","hasFocus","dragContext","textAlign","debugBackgroundColor","key","debugColor","px","py","debugPerfChartBackground","debugScrollHeightColor","debugScrollWidthColor","debugPerformanceColor","debugEntitiesColor","debugTouchPPSXColor","debugTouchPPSYColor","dpl","apply","perfArr","arrIndex","max","color","useAbs","abs","drawPerfLine","debugPerfChartTextColor","drawPerfLines","createBorderOverlayArray","drawArray","propPrefix","offsetPoint","selectionBorder","isRowHeader","indexOf","isHeader","cellGridAttributes","cellStyle","isCorner","isColumnHeader","isFilterable","filterable","includes","wrap","cellWhiteSpace","selected","hovered","hovers","hoverMode","openedFilter","selectedFilterButton","active","rawValue","isGrid","activeHeader","f","formatters","orderByArrowSize","treeArrowSize","ev","value","row","nodeType","fontHeight","horizontalAlignment","verticalAlignment","paddingLeft","paddingTop","paddingRight","paddingBottom","whiteSpace","lineHeight","cellLineHeight","lineSpacing","cellLineSpacing","offsetWidth","offsetHeight","offsetParent","viewRowIndex","viewColumnIndex","boundRowIndex","boundColumnIndex","getBoundColumnIndexFromViewColumnIndex","isNormal","gridId","calculatedLineHeight","paddedWidth","paddedHeight","userHeight","userWidth","cellHeightWithChildGrid","cellWidthWithChildGrid","tree","mt","treeArrowMarginTop","mr","treeArrowMarginRight","ml","treeArrowMarginLeft","aw","treeArrowWidth","ah","treeArrowHeight","treeArrowColor","treeArrowBorderColor","drawTreeArrow","showRowNumbers","childGrids","saveAppearance","createGrid","cellGridHeight","grid","orderBy","columnHeaderOrderByArrowMarginTop","columnHeaderOrderByArrowMarginLeft","columnHeaderOrderByArrowMarginRight","columnHeaderOrderByArrowWidth","columnHeaderOrderByArrowHeight","columnHeaderOrderByArrowColor","columnHeaderOrderByArrowBorderColor","orderDirection","drawOrderByArrow","orderByArrowWidth","console","warn","columnFilters","filterTextPrefix","splitChar","lines","word","elWidth","plWidth","clippedVal","previousLine","words","split","textHeight","autoResize","autoResizeRows","et","ellipsisText","line","cHeight","measureText","curSplitChar","measure","arr","map","splice","originText","stepLength","direction","substr","wrapText","vPos","hPos","stringify","pw","idx","idx_ord","drawText","selectionBorderTop","selectionBorderRight","selectionHandle","selectionBorderLeft","selectionBorderBottom","selectionHandleBehavior","createHandlesOverlayArray","moveOffset","posX","filterButtonWidth","posY","filterButtonHeight","filterButtonBorderColor","filterButtonBackgroundColor","filterButtonActiveBackgroundColor","onFilterButton","filterButtonHoverBackgroundColor","filterButtonBorderRadius","filterButtonArrowHeight","filterButtonArrowWidth","filterButtonArrowColor","filterButtonArrowBorderColor","drawFilterButtonArrow","drawFilterButton","isSorting","orderings","showRowNumberGaps","previousRowNumber","barHeight","rowHeaderCellRowNumberGapHeight","barColor","rowHeaderCellRowNumberGapColor","treeHeight","rowSansTreeHeight","trees","scrollIndexRight","scrollPixelRight","module","exports","defineProperty","enumerable","get","Symbol","toStringTag","__esModule","create","bind","default","hasOwnProperty","concat","modifier","legacyModifier","navigation","editing","ui","device","imeCompositionKeys","koreanSpecific","japaneseSpecific","commonFunction","multimedia","multimediaNumpad","audio","speech","application","browser","mobilePhone","tv","mediaControls","isSupportedHtml","pasteValue","some","expression","IGNORE_NODETYPES","isHtmlTable","sanitizeElementData","element","elementData","innerText","String","trim","parseHtmlText","doc","DOMParser","parseFromString","querySelector","parseHtmlTable","childNodes","childNode","col","parseText","parseData","mimeType","wheeling","stopPropagation","fn","events","removeEventListener","sfn","defaultPrevented","preventDefault","getRatio","maxPixelRatio","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","drawAfterResize","dims","vb","nb","co","isScrollBoxCorner","sbw","ratio","bm","cellBorder","columnHeaderCellBorder","dataHeight","dataWidth","ch","accumulator","column","va","setCanvasSize","args","top","left","setScrollBoxSize","checkScrollBoxVisibility","widthBoxRatio","heightBoxRatio","scrollBarBoxMinSize","scrollBarBoxWidth","bar","box","page","pageUpDownOverlap","resizeEditInput","scroll","overflowX","overflowY","dim","appliedInlineStyles","parentNodeStyle","dontDraw","floor","ellipsisCache","mousemove","overridePos","contextMenu","input","getLayerPos","dragBounds","sBounds","delta","ctrl","ctrlKey","metaKey","persistantSelectionMode","singleSelectionMode","getCellAt","NativeEvent","previousCell","clearTimeout","scrollTimer","isInGrid","rowBoundaryCrossed","columnBoundaryCrossed","cellBoundaryCrossed","prefix","draggingItem","dragItem","cursor","selecting","dragStart","dragStartObject","shiftKey","bottom","right","getSelectionBounds","ignoreNextClick","contextmenuEvent","rect","dragAddToSelection","event","selectedData","getSelectedData","selectedCells","getSelectedCells","selectionBounds","selectRow","selectArea","isMultiRowsSelected","autoScrollOnMousemove","movedVertically","autoScrollMargin","movedHorizontally","autoScrollZone","click","startingBounds","endEdit","setActiveCell","selectAll","checkSelectionChange","columnHeaderClickBehavior","treeArrowClickRadius","toggleTree","sb","dragResizeColumn","resizingStartingWidth","resizingStartingHeight","minColumnWidth","minRowHeight","resizeScrollZone","resizeChildGrids","globalRowResize","stopDragResize","body","setStorageData","scrollGrid","scrollPointerLock","scrollStartMode","movementX","movementY","scrollMode","scrollStart","scrollModes","setTimeout","scrollRepeatRate","selectionScrollIncrement","stopScrollGrid","exitPointerLock","dragReorder","columReorder","rowReorder","allowColumnReordering","allowRowReordering","isMultiColumnsSelected","selectColumn","source","reorderDeadZone","getVisibleCellByIndex","stopDragReorder","oIndex","tIndex","odata","cr","sortColumnIndices","seletedColumnIndices","deleteCount","selectedRows","dragMove","stopDragMove","moveSelection","freezeMove","stopFreezeMove","startFreezeMove","mousedown","lastMouseDownTarget","button","move","freeze","requestPointerLock","dragging","mouseup","controlInput","focus","getAdjacentCells","first","last","keydown","adjacentCells","cols","keepFocusOnMouseOut","isPrintableKeyEvent","beginEditAt","selectNone","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","getBoundingClientRect","clientX","clientY","easingFunctions","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easing","touchEasingMethod","calculatePPSTimed","touchSigmaTimed","calculatePPS","touchSigma","touchEndAnimation","touchReleaseAnimationDurationMs","stopAnimation","touchEditCell","touchstart","changedTouches","startingCell","disposeContextMenu","clearInterval","calculatePPSTimer","touchContextTimeout","touchStartEvent","zoomAltered","touchStart1","touchScrollStart","touchContextMenuTimeMs","setInterval","touchEndEvents","touchmove","passive","touchend","touchcancel","touchSelect","handleType","touchSelecting","bounds","rw","rScrollZone","lScrollZone","bScrollZone","tScrollZone","t1","t2","touchDeadZone","touchZoomSensitivity","touchZoomMin","touchZoomMax","selectionScrollZone","touchScroll","touchMove","dz","touchReleaseAcceleration","scrollAnimationPPSThreshold","ctor","treeGridAttributes","storageName","invalidSearchExpClass","localStyleLibraryStorageKey","add","sortFunction","sort","filters","sorters","parsers","schemaHashes","changes","componentL1Events","eventNames","expandToRow","viewDataLength","orderedIndex","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","clearChangeLog","gotoCell","gotoRow","addButton","findColumnScrollLeft","findRowScrollTop","isCellVisible","isRowVisible","isColumnVisible","clipElement","getSchemaFromData","setFilter","expandTree","collapseTree","insertRow","deleteRow","addRow","insertColumn","deleteColumn","addColumn","getClippingRect","setRowHeight","setColumnWidth","resetColumnWidths","resetRowHeights","assertPxColor","clearPxColorAssertions","integerToAlpha","addStyleKeyIfNoneExists","DOMStyles","set","valueObject","filterFor","blanksText","filterRegExp","pattern","exec","flags","substring","flagLength","invalidFilterRegEx","RegExp","toLocaleUpperCase","textContent","blur","TypeError","currentCursor","find","eventName","RangeError","isArray","getTypes","parseInnerHtml","callback","etl","autoGenerateSchema","autoResizeColumns","sHeight","sWidth","setScrollTop","preventScrollEvent","moveButtonPos","setScrollLeft","supressDrawEvent","zIndexTop","hoverScrollTimeout","autoCompleteContext","applyContextItemStyle","contextItemContainer","createInlineStyle","createContextMenu","parentContextMenu","loc","container","createElement","upArrow","downArrow","children","selectedIndex","checkArrowVisibility","startHoverScroll","contextHoverScrollAmount","contextHoverScrollRateMs","endHoverScroll","scrollOffset","contextMenuZIndex","childMenuArrow","removeChildContext","relatedTarget","contains","setAttribute","contextAddCallback","getAttribute","cPos","childContextMenuMarginLeft","childContextMenuMarginTop","createChildContext","addContent","content","childContextMenuArrowHTML","addItem","opacity","position","contextMenuArrowColor","zIndex","inputDropdown","maxHeight","innerHeight","autocompleteBottomMargin","minWidth","contextMenuArrowUpHTML","contextMenuArrowDownHTML","display","timer","animationDurationShowContextMenu","unfade","contextMenuWindowMargin","innerWidth","clickIndex","Event","animationDurationHideContextMenu","isFinite","createFilterContextMenuItems","iRect","filterContainer","filterLabel","filterAutoCompleteButton","filterInput","checkRegExpErrorState","background","contextFilterInputBackground","contextFilterInputColor","contextFilterInvalidRegExpBackground","contextFilterInvalidRegExpColor","createAutoCompleteContext","count","blanksItem","autoCompleteItems","cellValue","maxAutoCompleteItems","disposeAutocomplete","onclick","filterOptionText","contextFilterButtonHTML","cf","removeFilterOptionText","contextPosition","isNormalCell","isBackground","isScrollBar","showFilter","showCopy","copyText","execCommand","showPaste","clipBoardData","pasteText","showColumnSelector","columnSelectorText","toggleColumnVisibility","columnSelectorHiddenText","columnSelectorVisibleText","hideColumnText","showClearSettingsOption","clearSettingsOptionText","columnWidth","allowSorting","showOrderByOption","showOrderByOptionTextAsc","showOrderByOptionTextDesc","addDefaultContextMenuItem","contextMenuMarginLeft","contextMenuMarginTop","mobileContextMenuMargin","filterButtonMenuOffsetTop","createDisposeEvent","createButton","imgSrc","wrapper","buttonArrow","buttonIcon","buttonZIndex","buttonMenu","applyButtonStyle","buttonArrowDownHTML","maxWidth","toggleButtonMenu","disposeButtonMenu","createItems","menuItemContainer","buttonMenuItemContainer","applyButtonMenuItemStyle","buttonMenuWindowMargin","createButtonMenu","disposeButton","keyCode","attachButton","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","padding","buttonPadding","borderStyle","borderColor","buttonBorderColor","buttonBackgroundColor","userSelect","buttonHoverBackgroundColor","buttonActiveBorderColor","buttonActiveBackgroundColor","verticalAlign","buttonArrowColor","fontWeight","fontFamily","contextMenuFontFamily","contextMenuFontSize","margin","contextMenuItemMargin","borderRadius","contextMenuItemBorderRadius","contextMenuHoverBackground","contextMenuHoverColor","contextMenuLabelMargin","contextMenuLabelDisplay","contextMenuLabelMinWidth","contextMenuLabelMaxWidth","contextMenuBackground","contextMenuColor","border","contextMenuBorder","contextMenuPadding","contextMenuBorderRadius","contextMenuOpacity","overflow","contextMenuCursor","marginLeft","contextFilterInputBorder","contextFilterInputBorderRadius","contextFilterInputFontFamily","contextFilterInputFontSize","contextFilterButtonBorder","contextFilterButtonBorderRadius","contextMenuFilterButtonFontFamily","contextMenuFilterButtonFontSize","cssFloat","childContextMenuArrowColor","contextMenuChildArrowFontSize","boxSizing","outline","mobileEditFontFamily","mobileEditFontSize","editCellBorder","editCellColor","editCellBackgroundColor","appearance","webkitAppearance","mozAppearance","editCellPaddingLeft","editCellFontFamily","boxShadow","editCellBoxShadow","contextMenuFilterInvalidExpresion","onblur","parentIsCanvas","getContext","textBaseline","ordA","charCodeAt","fromCharCode","showFilterInCell","offsetX","offsetY","targetX","targetY","sbh","offset","multiColIsSelected","columnIndices","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","headerCell","int","asc","aValue","bValue","localeCompare","date","Date","getTime","webComponent","modules","dom","publicMethods","Grid","eval","attachShadow","canvasDatagrid","tKeys","customElements","argKey","tKey","sKey","HTMLElement","observedAttributes","define","require"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"canvas-datagrid.module.js","sources":["../lib/defaults.js","../lib/component.js","../lib/draw.js","../node_modules/is-printable-key-event/dist/index.js","../lib/events/util.js","../lib/events/index.js","../lib/touch.js","../lib/intf.js","../lib/contextMenu.js","../lib/button.js","../lib/dom.js","../lib/publicMethods.js","../lib/main.js"],"sourcesContent":["/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n\n'use strict';\nexport default function (self) {\n self.defaults = {\n attributes: [\n ['allowColumnReordering', true],\n ['allowColumnResize', true],\n ['allowColumnResizeFromCell', false],\n ['allowFreezingRows', false],\n ['allowFreezingColumns', false],\n ['allowMovingSelection', true],\n ['allowRowHeaderResize', true],\n ['allowRowReordering', false],\n ['allowRowResize', true],\n ['allowRowResizeFromCell', false],\n ['allowSorting', true],\n ['animationDurationShowContextMenu', 50],\n ['animationDurationHideContextMenu', 50],\n ['autoGenerateSchema', false],\n ['autoResizeColumns', false],\n ['autoResizeRows', false],\n ['autoScrollOnMousemove', false],\n ['autoScrollMargin', 5],\n ['blanksText', '(Blanks)'],\n ['borderDragBehavior', 'none'],\n ['borderResizeZone', 10],\n ['clearSettingsOptionText', 'Clear saved settings'],\n ['columnHeaderClickBehavior', 'sort'],\n ['columnSelectorHiddenText', ' '],\n ['columnSelectorText', 'Add/Remove columns'],\n ['columnSelectorVisibleText', '\\u2713'],\n ['contextHoverScrollAmount', 2],\n ['contextHoverScrollRateMs', 5],\n ['copyHeadersOnSelectAll', true],\n ['copyText', 'Copy'],\n ['debug', false],\n ['editable', true],\n ['ellipsisText', '...'],\n ['filterOptionText', 'Filter %s'],\n ['filterTextPrefix', '(filtered) '],\n ['filterFrozenRows', true],\n ['globalRowResize', false],\n ['hideColumnText', 'Hide %s'],\n ['hoverMode', 'cell'],\n ['keepFocusOnMouseOut', false],\n ['maxAutoCompleteItems', 200],\n ['multiLine', false],\n ['name', ''],\n ['pageUpDownOverlap', 1],\n ['pasteText', 'Paste'],\n ['persistantSelectionMode', false],\n ['removeFilterOptionText', 'Remove filter on %s'],\n ['reorderDeadZone', 3],\n ['resizeScrollZone', 20],\n ['rowGrabZoneSize', 5],\n ['saveAppearance', true],\n ['scrollAnimationPPSThreshold', 0.75],\n ['scrollPointerLock', false],\n ['scrollRepeatRate', 75],\n ['selectionFollowsActiveCell', false],\n ['selectionHandleBehavior', 'none'],\n ['selectionMode', 'cell'],\n ['selectionScrollIncrement', 20],\n ['selectionScrollZone', 20],\n ['showClearSettingsOption', true],\n ['showColumnHeaders', true],\n ['showColumnSelector', true],\n ['showCopy', false],\n ['showFilter', true],\n ['showFilterInCell', false],\n ['showNewRow', false],\n ['showOrderByOption', true],\n ['showOrderByOptionTextAsc', 'Order by %s ascending'],\n ['showOrderByOptionTextDesc', 'Order by %s descending'],\n ['showPaste', false],\n ['showPerformance', false],\n ['showRowHeaders', true],\n ['showRowNumbers', true],\n ['showRowNumberGaps', true],\n ['singleSelectionMode', false],\n ['snapToRow', false],\n ['sortFrozenRows', true],\n ['touchContextMenuTimeMs', 800],\n ['touchDeadZone', 3],\n ['touchEasingMethod', 'easeOutQuad'],\n ['touchReleaseAcceleration', 1000],\n ['touchReleaseAnimationDurationMs', 2000],\n ['touchScrollZone', 20],\n ['touchSelectHandleZone', 20],\n ['touchZoomSensitivity', 0.005],\n ['touchZoomMin', 0.5],\n ['touchZoomMax', 1.75],\n ['maxPixelRatio', 2],\n ['tree', false],\n ['treeHorizontalScroll', false],\n ],\n styles: [\n ['activeCellBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['activeCellBorderColor', 'rgba(110, 168, 255, 1)'],\n ['activeCellBorderWidth', 1],\n ['activeCellColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellFont', '16px sans-serif'],\n ['activeCellHoverBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['activeCellHorizontalAlignment', 'left'],\n ['activeCellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['activeCellOverlayBorderWidth', 1],\n ['activeCellPaddingBottom', 5],\n ['activeCellPaddingLeft', 5],\n ['activeCellPaddingRight', 5],\n ['activeCellPaddingTop', 5],\n ['activeCellSelectedBackgroundColor', 'rgba(236, 243, 255, 1)'],\n ['activeCellSelectedColor', 'rgba(0, 0, 0, 1)'],\n ['activeCellVerticalAlignment', 'center'],\n ['activeColumnHeaderCellBackgroundColor', 'rgba(225, 225, 225, 1)'],\n ['activeColumnHeaderCellColor', 'rgba(0, 0, 0, 1)'],\n ['activeRowHeaderCellBackgroundColor', 'rgba(225, 225, 225, 1)'],\n ['activeRowHeaderCellColor', 'rgba(0, 0, 0, 1)'],\n ['autocompleteBottomMargin', 60],\n ['autosizeHeaderCellPadding', 8],\n ['autosizePadding', 5],\n ['buttonActiveBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['buttonActiveBorderColor', 'rgba(110, 168, 255, 1)'],\n ['buttonArrowColor', 'rgba(50, 50, 50, 1)'],\n ['buttonArrowDownHTML', '▼'],\n ['buttonZIndex', 10000],\n ['buttonBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['buttonBorderColor', 'rgba(172, 172, 172, 1)'],\n ['buttonHoverBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['buttonMenuWindowMargin', 30],\n ['buttonPadding', '3px'],\n ['cellAutoResizePadding', 13],\n ['cellBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['cellBorderColor', 'rgba(195, 199, 202, 1)'],\n ['cellBorderWidth', 1],\n ['cellColor', 'rgba(0, 0, 0, 1)'],\n ['cellFont', '16px sans-serif'],\n ['cellGridHeight', 250],\n ['cellHeight', 24],\n ['cellHeightWithChildGrid', 150],\n ['cellHorizontalAlignment', 'left'],\n ['cellHoverBackgroundColor', 'rgba(255, 255, 255, 1)'],\n ['cellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['cellPaddingBottom', 5],\n ['cellPaddingLeft', 5],\n ['cellPaddingRight', 5],\n ['cellPaddingTop', 5],\n ['cellSelectedBackgroundColor', 'rgba(236, 243, 255, 1)'],\n ['cellSelectedColor', 'rgba(0, 0, 0, 1)'],\n ['cellVerticalAlignment', 'center'],\n ['cellWidth', 250],\n ['cellWidthWithChildGrid', 250],\n ['cellWhiteSpace', 'nowrap'],\n ['cellLineHeight', 1],\n ['cellLineSpacing', 3],\n ['childContextMenuArrowColor', 'rgba(43, 48, 43, 1)'],\n ['childContextMenuArrowHTML', '►'],\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', '▼'],\n ['contextFilterInputBackground', 'rgba(255,255,255,1)'],\n ['contextFilterInputBorder', 'solid 1px rgba(158, 163, 169, 1)'],\n ['contextFilterInputBorderRadius', '0'],\n ['contextFilterInputColor', 'rgba(0,0,0,1)'],\n ['contextFilterInputFontFamily', 'sans-serif'],\n ['contextFilterInputFontSize', '14px'],\n ['contextFilterInvalidRegExpBackground', 'rgba(180, 6, 1, 1)'],\n ['contextFilterInvalidRegExpColor', 'rgba(255, 255, 255, 1)'],\n ['contextMenuArrowColor', 'rgba(43, 48, 43, 1)'],\n ['contextMenuArrowDownHTML', '▼'],\n ['contextMenuArrowUpHTML', '▲'],\n ['contextMenuBackground', 'rgba(240, 240, 240, 1)'],\n ['contextMenuBorder', 'solid 1px rgba(158, 163, 169, 1)'],\n ['contextMenuBorderRadius', '3px'],\n ['contextMenuChildArrowFontSize', '12px'],\n ['contextMenuColor', 'rgba(43, 48, 43, 1)'],\n ['contextMenuCursor', 'default'],\n ['contextMenuFilterButtonFontFamily', 'sans-serif'],\n ['contextMenuFilterButtonFontSize', '10px'],\n ['contextMenuFilterInvalidExpresion', 'rgba(237, 155, 156, 1)'],\n ['contextMenuFontFamily', 'sans-serif'],\n ['contextMenuFontSize', '16px'],\n ['contextMenuHoverBackground', 'rgba(182, 205, 250, 1)'],\n ['contextMenuHoverColor', 'rgba(43, 48, 153, 1)'],\n ['contextMenuItemBorderRadius', '3px'],\n ['contextMenuItemMargin', '2px'],\n ['contextMenuLabelDisplay', 'inline-block'],\n ['contextMenuLabelMargin', '0 3px 0 0'],\n ['contextMenuLabelMaxWidth', '700px'],\n ['contextMenuLabelMinWidth', '75px'],\n ['contextMenuMarginLeft', 3],\n ['contextMenuMarginTop', -3],\n ['contextMenuOpacity', '0.98'],\n ['contextMenuPadding', '2px'],\n ['contextMenuWindowMargin', 30],\n ['contextMenuZIndex', 10000],\n ['cornerCellBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['cornerCellBorderColor', 'rgba(202, 202, 202, 1)'],\n ['debugBackgroundColor', 'rgba(0, 0, 0, .0)'],\n ['debugColor', 'rgba(255, 15, 24, 1)'],\n ['debugEntitiesColor', 'rgba(76, 231, 239, 1.00)'],\n ['debugFont', '11px sans-serif'],\n ['debugPerfChartBackground', 'rgba(29, 25, 26, 1.00)'],\n ['debugPerfChartTextColor', 'rgba(255, 255, 255, 0.8)'],\n ['debugPerformanceColor', 'rgba(252, 255, 37, 1.00)'],\n ['debugScrollHeightColor', 'rgba(248, 33, 103, 1.00)'],\n ['debugScrollWidthColor', 'rgba(66, 255, 27, 1.00)'],\n ['debugTouchPPSXColor', 'rgba(246, 102, 24, 1.00)'],\n ['debugTouchPPSYColor', 'rgba(186, 0, 255, 1.00)'],\n ['display', 'inline-block'],\n ['editCellBackgroundColor', 'white'],\n ['editCellBorder', 'solid 1px rgba(110, 168, 255, 1)'],\n ['editCellBoxShadow', '0 2px 5px rgba(0,0,0,0.4)'],\n ['editCellColor', 'black'],\n ['editCellFontFamily', 'sans-serif'],\n ['editCellFontSize', '16px'],\n ['editCellPaddingLeft', 4],\n ['editCellZIndex', 10000],\n ['filterButtonActiveBackgroundColor', 'rgba(225, 225, 225, 1)'],\n ['filterButtonArrowBorderColor', 'rgba(195, 199, 202, 1)'],\n ['filterButtonArrowBorderWidth', 1],\n ['filterButtonArrowClickRadius', 5],\n ['filterButtonArrowColor', 'rgba(50, 50, 50, 1)'],\n ['filterButtonArrowHeight', 5],\n ['filterButtonArrowWidth', 8],\n ['filterButtonBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['filterButtonBorderColor', 'rgba(172, 172, 172, 1)'],\n ['filterButtonBorderRadius', 3],\n ['filterButtonHeight', 20],\n ['filterButtonHoverBackgroundColor', 'rgba(235, 235, 235, 1)'],\n ['filterButtonMenuOffsetTop', 10],\n ['filterButtonWidth', 20],\n ['frozenMarkerHoverColor', 'rgba(236, 243, 255, 1)'],\n ['frozenMarkerHoverBorderColor', 'rgba(110, 168, 255, 1)'],\n ['frozenMarkerActiveColor', 'rgba(236, 243, 255, 1)'],\n ['frozenMarkerActiveBorderColor', 'rgba(110, 168, 255, 1)'],\n ['frozenMarkerColor', 'rgba(222, 222, 222, 1)'],\n ['frozenMarkerBorderColor', 'rgba(168, 168, 168, 1)'],\n ['frozenMarkerBorderWidth', 1],\n ['frozenMarkerWidth', 2],\n ['gridBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['gridBorderCollapse', 'collapse'],\n ['gridBorderColor', 'rgba(202, 202, 202, 1)'],\n ['gridBorderWidth', 1],\n ['height', 'auto'],\n ['maxHeight', 'inherit'],\n ['maxWidth', 'inherit'],\n ['minColumnWidth', 45],\n ['minHeight', 'inherit'],\n ['minRowHeight', 24],\n ['minWidth', 'inherit'],\n ['mobileContextMenuMargin', 10],\n ['mobileEditInputHeight', 30],\n ['mobileEditFontFamily', 'sans-serif'],\n ['mobileEditFontSize', '16px'],\n ['moveOverlayBorderWidth', 1],\n ['moveOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['moveOverlayBorderSegments', '12, 7'],\n ['name', 'default'],\n ['overflowY', 'auto'],\n ['overflowX', 'auto'],\n ['reorderMarkerBackgroundColor', 'rgba(0, 0, 0, 0.1)'],\n ['reorderMarkerBorderColor', 'rgba(0, 0, 0, 0.2)'],\n ['reorderMarkerBorderWidth', 1.25],\n ['reorderMarkerIndexBorderColor', 'rgba(66, 133, 244, 1)'],\n ['reorderMarkerIndexBorderWidth', 2.75],\n ['rowHeaderCellBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['rowHeaderCellBorderColor', 'rgba(200, 200, 200, 1)'],\n ['rowHeaderCellBorderWidth', 1],\n ['rowHeaderCellColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellFont', '16px sans-serif'],\n ['rowHeaderCellHeight', 25],\n ['rowHeaderCellHorizontalAlignment', 'left'],\n ['rowHeaderCellHoverBackgroundColor', 'rgba(235, 235, 235, 1)'],\n ['rowHeaderCellHoverColor', 'rgba(0, 0, 0, 1)'],\n ['rowHeaderCellPaddingBottom', 5],\n ['rowHeaderCellPaddingLeft', 5],\n ['rowHeaderCellPaddingRight', 5],\n ['rowHeaderCellPaddingTop', 5],\n ['rowHeaderCellRowNumberGapHeight', 5],\n ['rowHeaderCellRowNumberGapColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellSelectedBackgroundColor', 'rgba(217, 217, 217, 1)'],\n ['rowHeaderCellSelectedColor', 'rgba(50, 50, 50, 1)'],\n ['rowHeaderCellVerticalAlignment', 'center'],\n ['rowHeaderCellWidth', 57],\n ['scrollBarActiveColor', 'rgba(125, 125, 125, 1)'],\n ['scrollBarBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['scrollBarBorderColor', 'rgba(202, 202, 202, 1)'],\n ['scrollBarBorderWidth', 0.5],\n ['scrollBarBoxBorderRadius', 4.125],\n ['scrollBarBoxColor', 'rgba(192, 192, 192, 1)'],\n ['scrollBarBoxMargin', 2],\n ['scrollBarBoxMinSize', 15],\n ['scrollBarBoxWidth', 8],\n ['scrollBarCornerBackgroundColor', 'rgba(240, 240, 240, 1)'],\n ['scrollBarCornerBorderColor', 'rgba(202, 202, 202, 1)'],\n ['scrollBarWidth', 11],\n ['selectionHandleBorderColor', 'rgba(255, 255, 255, 1)'],\n ['selectionHandleBorderWidth', 1.5],\n ['selectionHandleColor', 'rgba(66, 133, 244, 1)'],\n ['selectionHandleSize', 8],\n ['selectionHandleType', 'square'],\n ['selectionOverlayBorderColor', 'rgba(66, 133, 244, 1)'],\n ['selectionOverlayBorderWidth', 1],\n ['treeArrowBorderColor', 'rgba(195, 199, 202, 1)'],\n ['treeArrowBorderWidth', 1],\n ['treeArrowClickRadius', 5],\n ['treeArrowColor', 'rgba(155, 155, 155, 1)'],\n ['treeArrowHeight', 8],\n ['treeArrowMarginLeft', 0],\n ['treeArrowMarginRight', 5],\n ['treeArrowMarginTop', 6],\n ['treeArrowWidth', 13],\n ['treeGridHeight', 250],\n ['width', 'auto'],\n ],\n };\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport defaults from './defaults';\n\nexport default function () {\n var typeMap,\n component = {};\n component.dehyphenateProperty = function hyphenateProperty(prop) {\n prop = prop.replace('--cdg-', '');\n var p = '',\n nextLetterCap;\n Array.prototype.forEach.call(prop, function (char) {\n if (nextLetterCap) {\n nextLetterCap = false;\n p += char.toUpperCase();\n return;\n }\n if (char === '-') {\n nextLetterCap = true;\n return;\n }\n p += char;\n });\n return p;\n };\n component.hyphenateProperty = function hyphenateProperty(prop, cust) {\n var p = '';\n Array.prototype.forEach.call(prop, function (char) {\n if (char === char.toUpperCase()) {\n p += '-' + char.toLowerCase();\n return;\n }\n p += char;\n });\n return (cust ? '--cdg-' : '') + p;\n };\n function getDefaultItem(base, item) {\n var i = {},\n r;\n defaults(i);\n r = i.defaults[base].filter(function (i) {\n return (\n i[0].toLowerCase() === item.toLowerCase() ||\n component.hyphenateProperty(i[0]) === item.toLowerCase() ||\n component.hyphenateProperty(i[0], true) === item.toLowerCase()\n );\n })[0];\n return r;\n }\n component.applyComponentStyle = function (supressChangeAndDrawEvents, intf) {\n if (!intf.isComponent) {\n return;\n }\n var cStyle = window.getComputedStyle(\n intf.tagName === 'CANVAS-DATAGRID' ? intf : intf.canvas,\n null,\n ),\n defs = {};\n intf.computedStyle = cStyle;\n defaults(defs);\n defs = defs.defaults.styles;\n defs.forEach(function (def) {\n var val;\n val = cStyle.getPropertyValue(component.hyphenateProperty(def[0], true));\n if (val === '') {\n val = cStyle.getPropertyValue(\n component.hyphenateProperty(def[0], false),\n );\n }\n if (val !== '' && typeof val === 'string') {\n intf.setStyleProperty(\n def[0],\n typeMap[typeof def[1]](\n val.replace(/^\\s+/, '').replace(/\\s+$/, ''),\n def[1],\n ),\n true,\n );\n }\n });\n if (!supressChangeAndDrawEvents && intf.dispatchEvent) {\n requestAnimationFrame(function () {\n intf.resize(true);\n });\n intf.dispatchEvent('stylechanged', intf.style);\n }\n };\n typeMap = {\n data: function (strData) {\n try {\n return JSON.parse(strData);\n } catch (e) {\n throw new Error('Cannot read JSON data in canvas-datagrid data.');\n }\n },\n schema: function (strSchema) {\n try {\n return JSON.parse(strSchema);\n } catch (e) {\n throw new Error(\n 'Cannot read JSON data in canvas-datagrid schema attribute.',\n );\n }\n },\n number: function (strNum, def) {\n var n = parseInt(strNum, 10);\n return isNaN(n) ? def : n;\n },\n boolean: function (strBool) {\n return /true/i.test(strBool);\n },\n string: function (str) {\n return str;\n },\n };\n component.getObservableAttributes = function () {\n var i = {},\n attrs = ['data', 'schema', 'style', 'className', 'name'];\n defaults(i);\n i.defaults.attributes.forEach(function (attr) {\n attrs.push(attr[0].toLowerCase());\n });\n return attrs;\n };\n component.disconnectedCallback = function () {\n this.connected = false;\n };\n component.connectedCallback = function () {\n var intf = this;\n intf.parentDOMNode.innerHTML = '';\n intf.parentDOMNode.appendChild(intf.canvas);\n intf.connected = true;\n component.observe(intf);\n component.applyComponentStyle(true, intf);\n intf.resize(true);\n };\n component.adoptedCallback = function () {\n this.resize();\n };\n component.attributeChangedCallback = function (attrName, oldVal, newVal) {\n var tfn,\n intf = this,\n def;\n if (attrName === 'style') {\n component.applyComponentStyle(false, intf);\n return;\n }\n if (attrName === 'data') {\n if (intf.dataType === 'application/x-canvas-datagrid') {\n intf.dataType = 'application/json+x-canvas-datagrid';\n }\n intf.data = newVal;\n return;\n }\n if (attrName === 'schema') {\n intf.schema = typeMap.schema(newVal);\n return;\n }\n if (attrName === 'name') {\n intf.name = newVal;\n return;\n }\n if (attrName === 'class' || attrName === 'className') {\n return;\n }\n def = getDefaultItem('attributes', attrName);\n if (def) {\n tfn = typeMap[typeof def[1]];\n intf.attributes[def[0]] = tfn(newVal);\n return;\n }\n if (/^on/.test(attrName)) {\n intf.addEventListener('on' + attrName, Function('e', newVal));\n }\n return;\n };\n component.observe = function (intf) {\n var observer;\n if (!window.MutationObserver) {\n return;\n }\n intf.applyComponentStyle = function () {\n component.applyComponentStyle(false, intf);\n intf.resize();\n };\n /**\n * Applies the computed css styles to the grid. In some browsers, changing directives in attached style sheets does not automatically update the styles in this component. It is necessary to call this method to update in these cases.\n * @memberof canvasDatagrid\n * @name applyComponentStyle\n * @method\n */\n observer = new window.MutationObserver(function (mutations) {\n var checkInnerHTML, checkStyle;\n Array.prototype.forEach.call(mutations, function (mutation) {\n if (\n mutation.attributeName === 'class' ||\n mutation.attributeName === 'style'\n ) {\n checkStyle = true;\n return;\n }\n if (mutation.target.nodeName === 'STYLE') {\n checkStyle = true;\n return;\n }\n if (\n mutation.target.parentNode &&\n mutation.target.parentNode.nodeName === 'STYLE'\n ) {\n checkStyle = true;\n return;\n }\n if (\n mutation.target === intf &&\n (mutation.addedNodes.length > 0 || mutation.type === 'characterData')\n ) {\n checkInnerHTML = true;\n }\n });\n if (checkStyle) {\n intf.applyComponentStyle(false, intf);\n }\n if (checkInnerHTML) {\n if (intf.dataType === 'application/x-canvas-datagrid') {\n intf.dataType = 'application/json+x-canvas-datagrid';\n }\n intf.data = intf.innerHTML;\n }\n });\n observer.observe(intf, {\n characterData: true,\n childList: true,\n attributes: true,\n subtree: true,\n });\n Array.prototype.forEach.call(\n document.querySelectorAll('style'),\n function (el) {\n observer.observe(el, {\n characterData: true,\n childList: true,\n attributes: true,\n subtree: true,\n });\n },\n );\n };\n return component;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals XMLSerializer: false, define: true, Blob: false, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n var perfCounters = [],\n cachedImagesDrawn = false,\n drawCount = 0,\n perfWindowSize = 300,\n entityCount = [],\n hiddenFrozenColumnCount = 0,\n scrollDebugCounters = [],\n touchPPSCounters = [];\n self.htmlImageCache = {};\n // more heavyweight version than fillArray defined in intf.js\n function fillArray(low, high, step, def) {\n step = step || 1;\n var i = [],\n x;\n for (x = low; x <= high; x += step) {\n i[x] = def === undefined ? x : typeof def === 'function' ? def(x) : def;\n }\n return i;\n }\n function drawPerfLine(w, h, x, y, perfArr, arrIndex, max, color, useAbs) {\n var i = w / perfArr.length,\n r = h / max;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.moveTo(x, y + h);\n perfArr.forEach(function (n) {\n var val = arrIndex === undefined ? n : n[arrIndex],\n cx,\n cy;\n if (useAbs) {\n val = Math.abs(val);\n }\n cx = x + i;\n cy = y + h - val * r;\n self.ctx.lineTo(cx, cy);\n x += i;\n });\n self.ctx.moveTo(x + w, y + h);\n self.ctx.strokeStyle = color;\n self.ctx.stroke();\n }\n function drawOnAllImagesLoaded() {\n var loaded = true;\n Object.keys(self.htmlImageCache).forEach(function (html) {\n if (!self.htmlImageCache[html].img.complete) {\n loaded = false;\n }\n });\n if (loaded && !cachedImagesDrawn) {\n cachedImagesDrawn = true;\n self.draw();\n }\n }\n function drawHtml(cell) {\n var img,\n v = cell.innerHTML || cell.formattedValue,\n cacheKey =\n v.toString() + cell.rowIndex.toString() + cell.columnIndex.toString(),\n x = Math.round(cell.x + self.canvasOffsetLeft),\n y = Math.round(cell.y + self.canvasOffsetTop);\n if (self.htmlImageCache[cacheKey]) {\n img = self.htmlImageCache[cacheKey].img;\n if (\n self.htmlImageCache[cacheKey].height !== cell.height ||\n self.htmlImageCache[cacheKey].width !== cell.width\n ) {\n // height and width of the cell has changed, invalidate cache\n self.htmlImageCache[cacheKey] = undefined;\n } else {\n if (!img.complete) {\n return;\n }\n return self.ctx.drawImage(img, x, y);\n }\n } else {\n cachedImagesDrawn = false;\n }\n img = new Image(cell.width, cell.height);\n self.htmlImageCache[cacheKey] = {\n img,\n width: cell.width,\n height: cell.height,\n };\n img.onload = function () {\n self.ctx.drawImage(img, x, y);\n drawOnAllImagesLoaded();\n };\n img.src =\n 'data:image/svg+xml;base64,' +\n btoa(\n '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"' +\n cell.width +\n '\" height=\"' +\n cell.height +\n '\">\\n' +\n '<foreignObject class=\"node\" x=\"0\" y=\"0\" width=\"100%\" height=\"100%\">\\n' +\n '<body xmlns=\"http://www.w3.org/1999/xhtml\" style=\"margin:0;padding:0;\">\\n' +\n v +\n '\\n' +\n '</body>' +\n '</foreignObject>\\n' +\n '</svg>\\n',\n );\n }\n function drawOrderByArrow(x, y) {\n var mt = self.style.columnHeaderOrderByArrowMarginTop * self.scale,\n ml = self.style.columnHeaderOrderByArrowMarginLeft * self.scale,\n mr = self.style.columnHeaderOrderByArrowMarginRight * self.scale,\n aw = self.style.columnHeaderOrderByArrowWidth * self.scale,\n ah = self.style.columnHeaderOrderByArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.columnHeaderOrderByArrowColor;\n self.ctx.strokeStyle = self.style.columnHeaderOrderByArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n if (self.orderDirection === 'asc') {\n self.ctx.lineTo(x, y + ah);\n self.ctx.lineTo(x + aw, y + ah);\n self.ctx.lineTo(x + aw * 0.5, y);\n self.ctx.lineTo(x, y + ah);\n } else {\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n }\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw + mr;\n }\n function drawTreeArrow(cell, x, y) {\n var mt = self.style.treeArrowMarginTop * self.scale,\n mr = self.style.treeArrowMarginRight * self.scale,\n ml = self.style.treeArrowMarginLeft * self.scale,\n aw = self.style.treeArrowWidth * self.scale,\n ah = self.style.treeArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.treeArrowColor;\n self.ctx.strokeStyle = self.style.treeArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n if (self.openChildren[cell.rowIndex]) {\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n } else {\n self.ctx.lineTo(x, y);\n self.ctx.lineTo(x + ah, y + aw * 0.5);\n self.ctx.lineTo(x, y + aw);\n self.ctx.lineTo(x, y);\n }\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw + mr;\n }\n function drawFilterButtonArrow(x, y) {\n var mt =\n ((self.style.filterButtonHeight - self.style.filterButtonArrowHeight) /\n 2) *\n self.scale,\n ml =\n ((self.style.filterButtonWidth - self.style.filterButtonArrowWidth) /\n 2) *\n self.scale,\n aw = self.style.filterButtonArrowWidth * self.scale,\n ah = self.style.filterButtonArrowHeight * self.scale;\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillStyle = self.style.filterButtonArrowColor;\n self.ctx.strokeStyle = self.style.filterButtonArrowBorderColor;\n self.ctx.beginPath();\n x = x + ml;\n y = y + mt;\n\n self.ctx.moveTo(x, y);\n self.ctx.lineTo(x + aw, y);\n self.ctx.lineTo(x + aw * 0.5, y + ah);\n self.ctx.moveTo(x, y);\n\n self.ctx.stroke();\n self.ctx.fill();\n return ml + aw;\n }\n function radiusRect(x, y, w, h, radius) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n var r = x + w,\n b = y + h;\n self.ctx.beginPath();\n self.ctx.moveTo(x + radius, y);\n self.ctx.lineTo(r - radius, y);\n self.ctx.quadraticCurveTo(r, y, r, y + radius);\n self.ctx.lineTo(r, y + h - radius);\n self.ctx.quadraticCurveTo(r, b, r - radius, b);\n self.ctx.lineTo(x + radius, b);\n self.ctx.quadraticCurveTo(x, b, x, b - radius);\n self.ctx.lineTo(x, y + radius);\n self.ctx.quadraticCurveTo(x, y, x + radius, y);\n }\n function fillRect(x, y, w, h) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillRect(x, y, w, h);\n }\n function strokeRect(x, y, w, h) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.strokeRect(x, y, w, h);\n }\n function fillText(text, x, y) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.fillText(text, x, y);\n }\n function fillCircle(x, y, r) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.arc(x, y, r, 0, 2 * Math.PI);\n self.ctx.fill();\n }\n function strokeCircle(x, y, r) {\n x += self.canvasOffsetLeft;\n y += self.canvasOffsetTop;\n self.ctx.beginPath();\n self.ctx.arc(x, y, r, 0, 2 * Math.PI);\n self.ctx.stroke();\n }\n function clipFrozenArea(mode) {\n // 0 both, 1 rows, 2 cols\n // self.lastFrozenColumnPixel;\n // self.lastFrozenRowPixel;\n self.ctx.beginPath();\n if (mode === 0) {\n self.ctx.moveTo(self.lastFrozenColumnPixel, self.lastFrozenRowPixel);\n self.ctx.lineTo(self.lastFrozenColumnPixel, self.height);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.width, self.lastFrozenRowPixel);\n }\n if (mode === 1) {\n self.ctx.moveTo(0, self.lastFrozenRowPixel);\n self.ctx.lineTo(0, self.height);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.width, self.lastFrozenRowPixel);\n }\n if (mode === 2) {\n self.ctx.moveTo(self.lastFrozenColumnPixel, 0);\n self.ctx.lineTo(self.width, 0);\n self.ctx.lineTo(self.width, self.height);\n self.ctx.lineTo(self.lastFrozenColumnPixel, self.height);\n }\n self.ctx.clip();\n }\n function fillHandle(x, y, r) {\n if (self.style.selectionHandleType === 'circle') {\n return fillCircle(x, y, r * 0.5);\n }\n fillRect(x - r * 0.5, y - r * 0.5, r, r);\n }\n function strokeHandle(x, y, r) {\n if (self.style.selectionHandleType === 'circle') {\n return strokeCircle(x, y, r * 0.5);\n }\n strokeRect(x - r * 0.5, y - r * 0.5, r, r);\n }\n function addselectionHandle(c, pos) {\n var hw = self.style.selectionHandleSize,\n p = {\n tr: function () {\n fillHandle(c.x + c.width, c.y, hw);\n strokeHandle(c.x + c.width, c.y, hw);\n },\n br: function () {\n fillHandle(c.x + c.width, c.y + c.height, hw);\n strokeHandle(c.x + c.width, c.y + c.height, hw);\n },\n tl: function () {\n fillHandle(c.x, c.y, hw);\n strokeHandle(c.x, c.y, hw);\n },\n bl: function () {\n fillHandle(c.x, c.y + c.height, hw);\n strokeHandle(c.x, c.y + c.height, hw);\n },\n };\n p[pos]();\n }\n function addBorderLine(c, pos) {\n self.ctx.beginPath();\n var p = {\n t: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop,\n );\n },\n r: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n b: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop + c.height,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft + c.width,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n l: function () {\n self.ctx.moveTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop,\n );\n self.ctx.lineTo(\n c.x + self.canvasOffsetLeft,\n c.y + self.canvasOffsetTop + c.height,\n );\n },\n };\n p[pos]();\n self.ctx.stroke();\n }\n function addEllipsis(text, width) {\n var c,\n w = 0;\n if (self.ellipsisCache[text] && self.ellipsisCache[text][width]) {\n return self.ellipsisCache[text][width];\n }\n //TODO Add ellipsis back when there is a fast way to do it\n w = self.ctx.measureText(text).width;\n self.ellipsisCache[text] = self.ellipsisCache[text] || {};\n c = { value: text, width: w };\n self.ellipsisCache[text][width] = c;\n return c;\n }\n function wrapText(cell, splitChar) {\n if (!cell.formattedValue) {\n return {\n lines: [{ width: 0, value: '' }],\n width: 0,\n height: cell.calculatedLineHeight,\n };\n }\n var max = 0,\n n = '\\n',\n x,\n word,\n words = cell.formattedValue.split(splitChar),\n textHeight = cell.calculatedLineHeight,\n lines = [],\n out = [],\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n autoResize = self.attributes.autoResizeRows && wrap,\n elWidth,\n et = self.attributes.ellipsisText,\n elClipLength,\n plWidth,\n clippedVal,\n ogWordWidth,\n previousLine,\n line = {\n width: 0,\n value: '',\n },\n cHeight = wrap ? cell.paddedHeight : cell.calculatedLineHeight;\n lines.push(line);\n elWidth = self.ctx.measureText(' ' + et).width;\n for (x = 0; x < words.length; x += 1) {\n word = words[x];\n var curSplitChar = word[word.length - 1] === '-' ? '' : splitChar;\n var measure = self.ctx.measureText(word + curSplitChar);\n if (line.width + measure.width + elWidth < cell.paddedWidth) {\n line.value += word + curSplitChar;\n line.width += measure.width;\n continue;\n }\n // if there is a hyphenated word that is too long\n // split it and add the split set to the array\n // then back up and re-read new split set\n // this behavior seems right, it might not be\n if (/\\w-\\w/.test(word) && cell.paddedWidth < measure.width) {\n var arr = word.split('-');\n arr = arr.map((item, index) => {\n return index === arr.length - 1 ? item : item + '-';\n });\n words.splice(x, 1, ...arr);\n x -= 1;\n continue;\n }\n line = {\n width: measure.width,\n value: word + curSplitChar,\n };\n if (x === 0) {\n lines = [];\n lines.push(line);\n }\n textHeight += cell.calculatedLineHeight;\n if (textHeight > cHeight && !autoResize) {\n if (lines.length === 0) {\n break;\n }\n elClipLength = 1;\n previousLine = lines[lines.length - 1];\n if (previousLine.width < cell.paddedWidth && words.length === 1) {\n break;\n }\n clippedVal = previousLine.value + word;\n plWidth = self.ctx.measureText(clippedVal + et).width;\n var originText = clippedVal;\n if (plWidth > cell.paddedWidth) {\n var stepLength = parseInt(clippedVal.length / 2);\n var direction = -1;\n while (stepLength > 0) {\n clippedVal = originText.substr(\n 0,\n stepLength * direction + clippedVal.length,\n );\n plWidth = self.ctx.measureText(clippedVal + et).width;\n direction = plWidth > cell.paddedWidth ? -1 : 1;\n stepLength = parseInt(stepLength / 2);\n }\n }\n clippedVal =\n clippedVal + (originText.length != clippedVal.length ? et : '');\n previousLine.value = clippedVal;\n previousLine.width = plWidth;\n break;\n }\n if (x > 0) {\n lines.push(line);\n }\n }\n return {\n lines: lines,\n width: max,\n height: cell.calculatedLineHeight * lines.length,\n };\n }\n function drawText(cell) {\n var ll = cell.text.lines.length,\n h = cell.fontHeight * cell.lineHeight,\n x,\n line,\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n textHeight = 0;\n for (x = 0; x < cell.text.lines.length; x += 1) {\n line = cell.text.lines[x];\n var vPos =\n Math.max(\n (cell.height -\n (wrap ? cell.text.height : cell.calculatedLineHeight)) *\n 0.5,\n 0,\n ) + h,\n hPos = cell.paddingLeft + cell.treeArrowWidth + cell.orderByArrowWidth;\n if (cell.horizontalAlignment === 'right') {\n hPos = cell.paddingLeft + cell.paddedWidth - line.width;\n } else if (cell.horizontalAlignment === 'center') {\n hPos =\n cell.paddingLeft +\n (cell.paddedWidth + cell.paddingRight) / 2 -\n line.width / 2;\n }\n if (cell.verticalAlignment === 'top') {\n vPos = cell.calculatedLineHeight;\n } else if (cell.verticalAlignment === 'bottom') {\n vPos = cell.height - cell.paddingBottom - cell.text.height;\n }\n line.height = h + cell.lineSpacing;\n line.offsetLeft = hPos;\n line.offsetTop = vPos;\n line.x = cell.x + hPos;\n line.y = cell.y + textHeight + vPos;\n textHeight += line.height;\n fillText(line.value, line.x, line.y);\n }\n if (self.attributes.debug && cell.active) {\n requestAnimationFrame(function () {\n self.ctx.font = self.style.debugFont;\n self.ctx.fillStyle = self.style.debugColor;\n fillText(\n JSON.stringify(\n {\n x: cell.x,\n y: cell.y,\n h: cell.height,\n w: cell.width,\n pw: cell.paddedWidth,\n idx: cell.columnIndex,\n idx_ord: cell.sortColumnIndex,\n },\n null,\n '\\t',\n ),\n cell.x + 14,\n cell.y + 14,\n );\n fillText(\n JSON.stringify(\n cell.text.lines.map(function (l) {\n return { w: l.width, v: l.value.length };\n }),\n null,\n '\\t',\n ),\n cell.x + 14,\n cell.y + 30,\n );\n });\n }\n }\n function getFrozenColumnsWidth() {\n var w = 0,\n s = self.getSchema(),\n x = 0,\n n = Math.min(self.frozenColumn, s.length),\n column;\n hiddenFrozenColumnCount = 0;\n while (x < n) {\n column = s[x];\n if (column.hidden) {\n hiddenFrozenColumnCount += 1;\n } else {\n w += self.getColumnWidth(x);\n }\n x += 1;\n }\n return w;\n }\n /**\n * Redraws the grid. No matter what the change, this is the only method required to refresh everything.\n * @memberof canvasDatagrid\n * @name draw\n * @method\n */\n // r = literal row index\n // rd = row data array\n // i = user order index\n // o = literal data index\n // y = y drawing cursor\n // x = x drawing cursor\n // s = visible schema array\n // cx = current x drawing cursor sub calculation var\n // cy = current y drawing cursor sub calculation var\n // a = static cell (like corner cell)\n // p = perf counter\n // l = data length\n // u = current cell\n // h = current height\n // w = current width\n self.draw = function (internal) {\n if (self.dispatchEvent('beforedraw', {})) {\n return;\n }\n if (!self.isChildGrid && (!self.height || !self.width)) {\n return;\n }\n if (self.isChildGrid && internal) {\n requestAnimationFrame(self.parentGrid.draw);\n return;\n }\n if (self.intf.visible === false) {\n return;\n }\n // initial values\n var checkScrollHeight,\n rowHeaderCell,\n p,\n cx,\n cy,\n treeGrid,\n rowOpen,\n rowHeight,\n cornerCell,\n y,\n x,\n c,\n h,\n w,\n schema,\n rowIndex,\n rowData,\n aCell,\n viewData = self.viewData || [],\n bc = self.style.gridBorderCollapse === 'collapse',\n selectionBorders = [],\n moveBorders = [],\n selectionHandles = [],\n rowHeaders = [],\n l = viewData.length,\n u = self.currentCell || {},\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n cellHeight = self.style.cellHeight;\n drawCount += 1;\n p = performance.now();\n self.visibleRowHeights = [];\n // if data length has changed, there is no way to know\n if (viewData.length > self.orders.rows.length) {\n self.createRowOrders();\n }\n function drawScrollBars() {\n var drawCorner,\n en = self.scrollBox.entities,\n m = self.style.scrollBarBoxMargin * 2;\n self.ctx.strokeStyle = self.style.scrollBarBorderColor;\n self.ctx.lineWidth = self.style.scrollBarBorderWidth;\n if (self.frozenColumn > 0) {\n en.horizontalBox.x =\n rowHeaderCellWidth +\n self.style.scrollBarBoxMargin +\n self.scrollCache.x[self.frozenColumn - 1] +\n (en.horizontalBar.width -\n self.scrollCache.x[self.frozenColumn - 1] -\n self.scrollBox.scrollBoxWidth) *\n (self.scrollBox.scrollLeft / self.scrollBox.scrollWidth);\n } else {\n en.horizontalBox.x =\n rowHeaderCellWidth +\n self.style.scrollBarBoxMargin +\n (en.horizontalBar.width - self.scrollBox.scrollBoxWidth) *\n (self.scrollBox.scrollLeft / self.scrollBox.scrollWidth);\n }\n en.verticalBox.y =\n columnHeaderCellHeight +\n self.style.scrollBarBoxMargin +\n self.scrollCache.y[self.frozenRow] +\n (en.verticalBar.height -\n self.scrollBox.scrollBoxHeight -\n self.scrollCache.y[self.frozenRow]) *\n (self.scrollBox.scrollTop / self.scrollBox.scrollHeight);\n if (self.scrollBox.horizontalBarVisible) {\n self.ctx.fillStyle = self.style.scrollBarBackgroundColor;\n fillRect(\n en.horizontalBar.x,\n en.horizontalBar.y,\n en.horizontalBar.width + m,\n en.horizontalBar.height,\n );\n strokeRect(\n en.horizontalBar.x,\n en.horizontalBar.y,\n en.horizontalBar.width + m,\n en.horizontalBar.height,\n );\n self.ctx.fillStyle = self.style.scrollBarBoxColor;\n if (self.scrollBox.horizontalBoxVisible) {\n if (/horizontal/.test(u.context)) {\n self.ctx.fillStyle = self.style.scrollBarActiveColor;\n }\n radiusRect(\n en.horizontalBox.x,\n en.horizontalBox.y,\n en.horizontalBox.width,\n en.horizontalBox.height,\n self.style.scrollBarBoxBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n }\n drawCorner = true;\n self.visibleCells.unshift(en.horizontalBar);\n self.visibleCells.unshift(en.horizontalBox);\n }\n if (self.scrollBox.verticalBarVisible) {\n self.ctx.fillStyle = self.style.scrollBarBackgroundColor;\n fillRect(\n en.verticalBar.x,\n en.verticalBar.y,\n en.verticalBar.width,\n en.verticalBar.height + m,\n );\n strokeRect(\n en.verticalBar.x,\n en.verticalBar.y,\n en.verticalBar.width,\n en.verticalBar.height + m,\n );\n if (self.scrollBox.verticalBoxVisible) {\n self.ctx.fillStyle = self.style.scrollBarBoxColor;\n if (/vertical/.test(u.context)) {\n self.ctx.fillStyle = self.style.scrollBarActiveColor;\n }\n radiusRect(\n en.verticalBox.x,\n en.verticalBox.y,\n en.verticalBox.width,\n en.verticalBox.height,\n self.style.scrollBarBoxBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n }\n drawCorner = true;\n self.visibleCells.unshift(en.verticalBar);\n self.visibleCells.unshift(en.verticalBox);\n }\n if (drawCorner) {\n //corner\n self.ctx.strokeStyle = self.style.scrollBarCornerBorderColor;\n self.ctx.fillStyle = self.style.scrollBarCornerBackgroundColor;\n radiusRect(\n en.corner.x,\n en.corner.y,\n en.corner.width,\n en.corner.height,\n 0,\n );\n self.ctx.stroke();\n self.ctx.fill();\n self.visibleCells.unshift(en.corner);\n }\n }\n function createHandlesOverlayArray(cell) {\n if (self.attributes.allowMovingSelection || self.mobile) {\n if (\n cell.selectionBorderTop &&\n cell.selectionBorderRight &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'tr']);\n cell.selectionHandle = 'tr';\n }\n if (\n cell.selectionBorderTop &&\n cell.selectionBorderLeft &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'tl']);\n cell.selectionHandle = 'tl';\n }\n if (\n cell.selectionBorderBottom &&\n cell.selectionBorderLeft &&\n self.mobile\n ) {\n selectionHandles.push([cell, 'bl']);\n cell.selectionHandle = 'bl';\n }\n if (\n cell.selectionBorderBottom &&\n cell.selectionBorderRight &&\n (self.attributes.selectionHandleBehavior !== 'none' || self.mobile)\n ) {\n selectionHandles.push([cell, 'br']);\n cell.selectionHandle = 'br';\n }\n }\n }\n function createBorderOverlayArray(\n cell,\n drawArray,\n propPrefix,\n offsetPoint,\n ) {\n offsetPoint = offsetPoint || { x: 0, y: 0 };\n cell.selectionBorder = '';\n if (\n !cell.isRowHeader &&\n self.selections[cell.rowIndex + -offsetPoint.y] &&\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) !== -1\n ) {\n if (\n (!self.selections[cell.rowIndex - 1 + -offsetPoint.y] ||\n self.selections[cell.rowIndex - 1 + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) === -1 ||\n cell.rowIndex === 0) &&\n !cell.isHeader\n ) {\n drawArray.push([cell, 't']);\n cell[propPrefix + 'BorderTop'] = true;\n cell[propPrefix + 'Border'] += 't';\n }\n if (\n !self.selections[cell.rowIndex + 1 + -offsetPoint.y] ||\n self.selections[cell.rowIndex + 1 + -offsetPoint.y].indexOf(\n cell.columnIndex + -offsetPoint.x,\n ) === -1\n ) {\n drawArray.push([cell, 'b']);\n cell[propPrefix + 'BorderBottom'] = true;\n cell[propPrefix + 'Border'] += 'b';\n }\n if (\n !self.selections[cell.rowIndex + -offsetPoint.y] ||\n cell.columnIndex === 0 ||\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex - 1 + -offsetPoint.x,\n ) === -1\n ) {\n drawArray.push([cell, 'l']);\n cell[propPrefix + 'BorderLeft'] = true;\n cell[propPrefix + 'Border'] += 'l';\n }\n if (\n !self.selections[cell.rowIndex + -offsetPoint.y] ||\n cell.columnIndex === schema.length ||\n self.selections[cell.rowIndex + -offsetPoint.y].indexOf(\n cell.columnIndex + 1 + -offsetPoint.x,\n ) === -1\n ) {\n drawArray.push([cell, 'r']);\n cell[propPrefix + 'BorderRight'] = true;\n cell[propPrefix + 'Border'] += 'r';\n }\n }\n }\n function drawCell(rowData, rowOrderIndex, rowIndex) {\n return function drawEach(header, headerIndex, columnOrderIndex) {\n if (header.hidden) {\n return 0;\n }\n var cellStyle = header.style || 'cell',\n cellGridAttributes,\n cell,\n isHeader = /HeaderCell/.test(cellStyle),\n isCorner = /cornerCell/.test(cellStyle),\n isRowHeader = 'rowHeaderCell' === cellStyle,\n isColumnHeader = 'columnHeaderCell' === cellStyle,\n isFilterable =\n self.filterable.rows.includes(rowIndex) &&\n self.filterable.columns.includes(headerIndex),\n wrap = self.style.cellWhiteSpace !== 'nowrap',\n selected =\n self.selections[rowOrderIndex] &&\n self.selections[rowOrderIndex].indexOf(columnOrderIndex) !== -1,\n hovered =\n self.hovers.rowIndex === rowOrderIndex &&\n (self.attributes.hoverMode === 'row' ||\n self.hovers.columnIndex === columnOrderIndex),\n openedFilter =\n self.selectedFilterButton.rowIndex == rowIndex &&\n self.selectedFilterButton.columnIndex == headerIndex,\n active =\n self.activeCell.rowIndex === rowOrderIndex &&\n self.activeCell.columnIndex === columnOrderIndex,\n isColumnHeaderCellCap = cellStyle === 'columnHeaderCellCap',\n rawValue = rowData ? rowData[header.name] : undefined,\n isGrid = header.type === 'canvas-datagrid',\n activeHeader =\n (self.orders.rows[self.activeCell.rowIndex] === rowOrderIndex ||\n self.orders.columns[self.activeCell.columnIndex] ===\n headerIndex) &&\n (columnOrderIndex === -1 || rowOrderIndex === -1)\n ? isRowHeader\n ? 'activeRowHeaderCell'\n : 'activeColumnHeaderCell'\n : false,\n val,\n f = self.formatters[header.type || 'string'],\n orderByArrowSize = 0,\n treeArrowSize = 0,\n cellWidth = self.sizes.columns[headerIndex] || header.width,\n ev = {\n value: rawValue,\n row: rowData,\n header: header,\n };\n if (isColumnHeaderCellCap) {\n cellWidth = w - x;\n }\n // if no data or schema are defined, a width is provided to the stub column\n if (cellWidth === undefined) {\n cellWidth = self.style.cellWidth;\n }\n cellWidth = cellWidth * self.scale;\n if (x + cellWidth + self.style.cellBorderWidth < 0) {\n x += cellWidth + self.style.cellBorderWidth;\n }\n if (active && cellStyle !== 'cornerCell') {\n cellStyle = 'activeCell';\n }\n if (self.visibleRows.indexOf(rowIndex) === -1 && !isHeader) {\n self.visibleRows.push(rowIndex);\n }\n val = self.dispatchEvent('formatcellvalue', ev);\n cx = x;\n cy = y;\n if (cellStyle === 'cornerCell') {\n cx = 0;\n cy = 0;\n } else if (isRowHeader) {\n cx = 0;\n } else if (isHeader) {\n cy = 0;\n }\n cell = {\n type: isGrid ? 'canvas-datagrid-cell' : header.type,\n style: cellStyle,\n nodeType: 'canvas-datagrid-cell',\n x: cx,\n y: cy,\n fontHeight: (self.style[cellStyle + 'FontHeight'] || 0) * self.scale,\n horizontalAlignment: self.style[cellStyle + 'HorizontalAlignment'],\n verticalAlignment: self.style[cellStyle + 'VerticalAlignment'],\n paddingLeft:\n (self.style[cellStyle + 'PaddingLeft'] || 0) * self.scale,\n paddingTop: (self.style[cellStyle + 'PaddingTop'] || 0) * self.scale,\n paddingRight:\n (self.style[cellStyle + 'PaddingRight'] || 0) * self.scale,\n paddingBottom:\n (self.style[cellStyle + 'PaddingBottom'] || 0) * self.scale,\n whiteSpace: self.style.cellWhiteSpace,\n lineHeight: self.style.cellLineHeight,\n lineSpacing: self.style.cellLineSpacing,\n offsetTop: self.canvasOffsetTop + cy,\n offsetLeft: self.canvasOffsetLeft + cx,\n scrollTop: self.scrollBox.scrollTop,\n scrollLeft: self.scrollBox.scrollLeft,\n active: active || activeHeader,\n hovered: hovered,\n selected: selected,\n width: cellWidth,\n height: cellHeight,\n offsetWidth: cellWidth,\n offsetHeight: cellHeight,\n parentNode: self.intf.parentNode,\n offsetParent: self.intf.parentNode,\n data: rowData,\n isCorner: isCorner,\n isHeader: isHeader,\n isColumnHeader: isColumnHeader,\n isColumnHeaderCellCap: isColumnHeaderCellCap,\n isRowHeader: isRowHeader,\n isFilterable: isFilterable,\n openedFilter: openedFilter,\n rowOpen: rowOpen,\n header: header,\n\n columnIndex: columnOrderIndex,\n rowIndex: rowOrderIndex,\n\n viewRowIndex: rowOrderIndex,\n viewColumnIndex: columnOrderIndex,\n\n boundRowIndex: self.getBoundRowIndexFromViewRowIndex(rowOrderIndex),\n boundColumnIndex: self.getBoundColumnIndexFromViewColumnIndex(\n columnOrderIndex,\n ),\n\n sortColumnIndex: headerIndex,\n sortRowIndex: rowIndex,\n\n isGrid: isGrid,\n isNormal: !isGrid && !isCorner && !isHeader,\n gridId: (self.attributes.name || '') + rowIndex + ':' + headerIndex,\n parentGrid: self.intf,\n innerHTML: '',\n activeHeader: activeHeader,\n value:\n isHeader && !isRowHeader ? header.title || header.name : rawValue,\n };\n cell.calculatedLineHeight =\n cell.fontHeight * cell.lineHeight + cell.lineSpacing;\n cell.paddedWidth = cell.width - cell.paddingRight - cell.paddingLeft;\n cell.paddedHeight = cell.height - cell.paddingTop - cell.paddingBottom;\n ev.cell = cell;\n cell.userHeight = cell.isHeader ? self.sizes.rows[-1] : rowHeight;\n cell.userWidth = cell.isHeader\n ? self.sizes.columns.cornerCell\n : self.sizes.columns[headerIndex];\n self.visibleCells.unshift(cell);\n if (self.dispatchEvent('beforerendercell', ev)) {\n return;\n }\n self.ctx.fillStyle = self.style[cellStyle + 'BackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'BorderColor'];\n self.ctx.lineWidth = self.style[cellStyle + 'BorderWidth'];\n if (hovered) {\n self.ctx.fillStyle = self.style[cellStyle + 'HoverBackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'HoverBorderColor'];\n }\n if (selected) {\n self.ctx.fillStyle =\n self.style[cellStyle + 'SelectedBackgroundColor'];\n self.ctx.strokeStyle = self.style[cellStyle + 'SelectedBorderColor'];\n }\n if (activeHeader) {\n self.ctx.fillStyle = self.style[activeHeader + 'BackgroundColor'];\n }\n self.dispatchEvent('rendercell', ev);\n if (cell.isGrid) {\n if (cell.height !== rowHeight) {\n cell.height = rowHeight || self.style.cellHeightWithChildGrid;\n checkScrollHeight = true;\n }\n cell.width =\n self.sizes.columns[headerIndex] ||\n self.style.cellWidthWithChildGrid;\n }\n if (rowOpen && !cell.isRowHeader) {\n cell.height = self.sizes.rows[rowIndex] || self.style.cellHeight;\n }\n if (!cell.isGrid) {\n fillRect(cx, cy, cell.width, cell.height);\n strokeRect(cx, cy, cell.width, cell.height);\n }\n self.ctx.save();\n radiusRect(cell.x, cell.y, cell.width, cell.height, 0);\n self.ctx.clip();\n self.dispatchEvent('afterrendercell', ev);\n if (cell.height !== cellHeight && !(rowOpen && !cell.isRowHeader)) {\n self.sizes.rows[isHeader ? -1 : rowIndex] = cell.height;\n checkScrollHeight = true;\n }\n if (cell.width !== cellWidth) {\n self.sizes.columns[headerIndex] = cell.width;\n checkScrollHeight = true;\n }\n if (isRowHeader && self.attributes.tree) {\n if (!self.dispatchEvent('rendertreearrow', ev)) {\n treeArrowSize = drawTreeArrow(\n cell,\n self.style[cellStyle + 'PaddingLeft'],\n cy,\n 0,\n );\n }\n }\n if ((self.attributes.showRowNumbers && isRowHeader) || !isRowHeader) {\n if (cell.isGrid && !self.dispatchEvent('beforerendercellgrid', ev)) {\n if (!self.childGrids[cell.gridId]) {\n // HACK: this only allows setting of the child grids styles if data is set _after_\n // this is less than desirable. An interface needs to be made to effect the\n // style of all cell grids. One for individual grids already exists.\n cellGridAttributes = self.cellGridAttributes;\n cellGridAttributes.name = self.attributes.saveAppearance\n ? cell.gridId\n : undefined;\n cellGridAttributes.component = false;\n cellGridAttributes.parentNode = cell;\n cellGridAttributes.data = rawValue;\n ev.cellGridAttributes = cellGridAttributes;\n if (self.dispatchEvent('beforecreatecellgrid', ev)) {\n return;\n }\n self.childGrids[cell.gridId] = self.createGrid(\n cellGridAttributes,\n );\n self.sizes.rows[rowIndex] =\n self.sizes.rows[rowIndex] || self.style.cellGridHeight;\n checkScrollHeight = true;\n }\n cell.grid = self.childGrids[cell.gridId];\n cell.grid.parentNode = cell;\n cell.grid.visible = true;\n cell.grid.draw();\n self.dispatchEvent('rendercellgrid', ev);\n } else if (!cell.isGrid) {\n if (self.childGrids[cell.gridId]) {\n self.childGrids[cell.gridId].parentNode.offsetHeight = 0;\n }\n if (isHeader && self.orderBy === header.name) {\n if (!self.dispatchEvent('renderorderbyarrow', ev)) {\n orderByArrowSize = drawOrderByArrow(\n cx + self.style[cellStyle + 'PaddingLeft'],\n 0,\n );\n }\n }\n self.ctx.fillStyle = self.style[cellStyle + 'Color'];\n if (hovered) {\n self.ctx.fillStyle = self.style[cellStyle + 'HoverColor'];\n }\n if (selected) {\n self.ctx.fillStyle = self.style[cellStyle + 'SelectedColor'];\n }\n if (activeHeader) {\n self.ctx.fillStyle = self.style[activeHeader + 'Color'];\n }\n cell.treeArrowWidth = treeArrowSize;\n cell.orderByArrowWidth = orderByArrowSize;\n // create text ref to see if height needs to expand\n val = val !== undefined ? val : f ? f(ev) : '';\n if (val === undefined && !f) {\n val = '';\n console.warn(\n 'canvas-datagrid: Unknown format ' +\n header.type +\n ' add a cellFormater',\n );\n }\n cell.formattedValue = (val !== undefined && val !== null\n ? val\n : ''\n ).toString();\n if (\n self.columnFilters &&\n self.columnFilters[val] !== undefined &&\n isHeader\n ) {\n cell.formattedValue = self.attributes.filterTextPrefix + val;\n }\n self.ctx.font =\n self.style[cellStyle + 'FontHeight'] * self.scale +\n 'px ' +\n self.style[cellStyle + 'FontName'];\n if (!self.dispatchEvent('formattext', ev)) {\n cell.text = wrapText(cell, ' ');\n }\n if (!self.dispatchEvent('rendertext', ev)) {\n if (cell.innerHTML || header.type === 'html') {\n drawHtml(cell);\n } else {\n drawText(cell);\n }\n\n if (wrap && cell.text && cell.text.height > rowHeight) {\n self.sizes.rows[isHeader ? -1 : rowIndex] = cell.text.height;\n checkScrollHeight = true;\n }\n }\n }\n }\n if (active) {\n aCell = cell;\n }\n createBorderOverlayArray(cell, selectionBorders, 'selection');\n // createBorderOverlayArray calculates data for createHandlesOverlayArray so it must go 2nd\n createHandlesOverlayArray(cell);\n if (self.movingSelection) {\n createBorderOverlayArray(cell, moveBorders, 'move', self.moveOffset);\n }\n self.ctx.restore();\n\n if (isFilterable) {\n drawFilterButton(cell);\n }\n\n // Gaps may occur in row numbers between consecutively rendered rows\n // when we are filtering. We draw attention to this by drawing a thick\n // border overlapping the two consecutive row headers. If sorting, visible\n // row numbers stay the same (i.e. they don't correspond to the underlying\n // data's row number), so we do not show row gaps in that case.\n const isSorting =\n self.orderings.columns && self.orderings.columns.length > 0;\n\n if (\n isRowHeader &&\n self.attributes.showRowNumbers &&\n self.attributes.showRowNumberGaps &&\n isSorting === false\n ) {\n const previousRowNumber = self.getBoundRowIndexFromViewRowIndex(\n rowOrderIndex - 1,\n );\n const hasRowGap =\n previousRowNumber !== undefined &&\n cell.boundRowIndex > 0 &&\n cell.boundRowIndex - previousRowNumber > 1;\n\n if (hasRowGap) {\n const barHeight = self.style.rowHeaderCellRowNumberGapHeight;\n const barColor = self.style.rowHeaderCellRowNumberGapColor;\n\n self.ctx.save();\n\n self.ctx.fillStyle = barColor;\n\n fillRect(cell.x, cell.y - barHeight / 2, cell.width, barHeight);\n\n self.ctx.restore();\n }\n }\n\n x += cell.width + (bc ? 0 : self.style.cellBorderWidth);\n return cell.width;\n };\n }\n function drawFilterButton(cell, ev) {\n var posX = cell.x + cell.width - self.style.filterButtonWidth - 1;\n var posY = cell.y + cell.height - self.style.filterButtonHeight - 2;\n if (self.dispatchEvent('beforerenderfilterbutton', ev)) {\n return;\n }\n self.ctx.save();\n self.ctx.strokeStyle = self.style.filterButtonBorderColor;\n self.ctx.fillStyle = self.style.filterButtonBackgroundColor;\n if (cell.openedFilter) {\n self.ctx.fillStyle = self.style.filterButtonActiveBackgroundColor;\n } else if (cell.hovered && self.hovers.onFilterButton) {\n self.ctx.fillStyle = self.style.filterButtonHoverBackgroundColor;\n }\n radiusRect(\n posX,\n posY,\n self.style.filterButtonWidth,\n self.style.filterButtonHeight,\n self.style.filterButtonBorderRadius,\n );\n self.ctx.stroke();\n self.ctx.fill();\n drawFilterButtonArrow(posX, posY);\n self.ctx.clip();\n self.dispatchEvent('afterrenderfilterbutton', ev);\n self.ctx.restore();\n }\n function drawRowHeader(rowData, rowIndex, rowOrderIndex) {\n if (self.attributes.showRowHeaders) {\n x = 0;\n\n // When filtering we'd like to display the actual row numbers,\n // as it is in the unfiltered data, instead of simply the viewed\n // row index + 1. If rowIndex > viewData.length, it's a new row\n // added to the end, and we want to render that new row's number\n const filteredRowNumber =\n self.viewData && rowIndex < self.viewData.length\n ? self.getBoundRowIndexFromViewRowIndex(rowIndex) + 1\n : self.originalData\n ? self.originalData.length + 1\n : rowOrderIndex + 1;\n\n const rowHeaderValue = self.hasActiveFilters()\n ? filteredRowNumber\n : rowIndex + 1;\n\n const rowHeaderCell = { rowHeaderCell: rowHeaderValue };\n const headerDescription = {\n name: 'rowHeaderCell',\n width: self.sizes.columns[-1] || self.style.rowHeaderCellWidth,\n style: 'rowHeaderCell',\n type: 'string',\n data: rowHeaderValue,\n index: -1,\n };\n rowOpen = self.openChildren[rowIndex];\n drawCell(rowHeaderCell, rowOrderIndex, rowIndex)(\n headerDescription,\n -1,\n -1,\n );\n }\n }\n function drawHeaders() {\n var d,\n g = schema.length,\n i,\n o,\n columnHeaderCell,\n header,\n nonFrozenHeaderWidth;\n function drawHeaderColumnRange(start, end) {\n end = Math.min(end, g);\n for (o = start; o < end; o += 1) {\n i = self.orders.columns[o];\n header = schema[i];\n if (!header.hidden) {\n d = {\n title: header.title,\n name: header.name,\n width: header.width || self.style.cellWidth,\n style: 'columnHeaderCell',\n type: 'string',\n index: o,\n order: i,\n };\n columnHeaderCell = {\n columnHeaderCell: header.title || header.name,\n };\n x += drawCell(columnHeaderCell, -1, -1)(d, i, o);\n if (x > self.width + self.scrollBox.scrollLeft) {\n break;\n }\n }\n }\n }\n rowHeaders.forEach(function (rArgs, rhIndex) {\n y = rArgs[3];\n cellHeight = rArgs[4];\n if (rhIndex === self.frozenRow) {\n self.ctx.save();\n radiusRect(\n 0,\n self.lastFrozenRowPixel,\n self.width,\n self.height - self.lastFrozenRowPixel,\n 0,\n );\n self.ctx.clip();\n }\n drawRowHeader(rArgs[0], rArgs[1], rArgs[2]);\n });\n self.ctx.restore();\n if (self.attributes.showColumnHeaders) {\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.columnHeaderCellBorderWidth;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n y = 0;\n // cell height might have changed during drawing\n cellHeight = self.getColumnHeaderCellHeight();\n drawHeaderColumnRange(self.scrollIndexLeft, g);\n nonFrozenHeaderWidth = x;\n x = self.style.columnHeaderCellBorderWidth;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n drawHeaderColumnRange(0, self.frozenColumn);\n // fill in the space right of the headers\n x = nonFrozenHeaderWidth;\n if (x < w) {\n c = {\n name: '',\n width: self.style.scrollBarWidth,\n style: 'columnHeaderCellCap',\n isColumnHeaderCell: true,\n isColumnHeaderCellCap: true,\n type: 'string',\n index: schema.length,\n };\n drawCell({ endCap: '' }, -1, -1)(c, -1, -1);\n }\n // fill in the space right of the headers\n if (self.attributes.showRowHeaders) {\n cornerCell = { cornerCell: '' };\n x = 0;\n c = {\n name: 'cornerCell',\n width: self.style.rowHeaderCellWidth,\n style: 'cornerCell',\n type: 'string',\n index: -1,\n };\n drawCell(cornerCell, -1, -1)(c, -1, -1);\n }\n }\n }\n function drawRow(rowOrderIndex, rowIndex) {\n var headerIndex,\n treeHeight,\n rowSansTreeHeight,\n columnOrderIndex,\n g = schema.length;\n if (y - cellHeight * 2 > h) {\n return false;\n }\n rowData = viewData[rowOrderIndex];\n rowOpen = self.openChildren[rowOrderIndex];\n rowSansTreeHeight =\n (self.sizes.rows[rowOrderIndex] || self.style.cellHeight) * self.scale;\n treeHeight = (rowOpen ? self.sizes.trees[rowOrderIndex] : 0) * self.scale;\n rowHeight = rowSansTreeHeight + treeHeight;\n if (y < -rowHeight) {\n return false;\n }\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n cellHeight = rowHeight;\n //draw normal columns\n for (\n columnOrderIndex = self.scrollIndexLeft;\n columnOrderIndex < g;\n columnOrderIndex += 1\n ) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(rowData, rowOrderIndex, rowIndex)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n if (x > self.width) {\n self.scrollIndexRight = columnOrderIndex;\n self.scrollPixelRight = x;\n break;\n }\n }\n //draw frozen columns\n x = 0;\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n for (\n columnOrderIndex = 0;\n columnOrderIndex < self.frozenColumn;\n columnOrderIndex += 1\n ) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(rowData, rowOrderIndex, rowIndex)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n if (x > self.width) {\n break;\n }\n }\n self.lastFrozenColumnPixel = x;\n // cell height might have changed during drawing\n cellHeight = rowHeight;\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n // don't draw a tree for the new row\n treeGrid = self.childGrids[rowOrderIndex];\n if (rowOrderIndex !== viewData.length && rowOpen) {\n treeGrid.visible = true;\n treeGrid.parentNode = {\n offsetTop: y + rowSansTreeHeight + self.canvasOffsetTop,\n offsetLeft: rowHeaderCellWidth - 1 + self.canvasOffsetLeft,\n offsetHeight: treeHeight,\n offsetWidth:\n self.width - rowHeaderCellWidth - self.style.scrollBarWidth - 1,\n offsetParent: self.intf.parentNode,\n parentNode: self.intf.parentNode,\n style: self.style,\n nodeType: 'canvas-datagrid-tree',\n scrollTop: self.scrollBox.scrollTop,\n scrollLeft: self.scrollBox.scrollLeft,\n rowIndex: rowOrderIndex,\n };\n self.visibleCells.unshift({\n rowIndex: rowOrderIndex,\n columnIndex: 0,\n y: treeGrid.parentNode.offsetTop,\n x: treeGrid.parentNode.offsetLeft,\n height: treeGrid.height,\n width: treeGrid.width,\n style: 'tree-grid',\n type: treeGrid.parentNode.nodeType,\n });\n treeGrid.draw();\n } else if (treeGrid) {\n treeGrid.parentNode.offsetHeight = 0;\n delete self.sizes.trees[rowOrderIndex];\n }\n rowHeaders.push([rowData, rowOrderIndex, rowIndex, y, rowHeight]);\n self.visibleRowHeights[rowOrderIndex] = rowHeight;\n y += cellHeight + (bc ? 0 : self.style.cellBorderWidth);\n return true;\n }\n function initDraw() {\n self.visibleRows = [];\n schema = self.getSchema();\n self.visibleCells = [];\n self.canvasOffsetTop = self.isChildGrid ? self.parentNode.offsetTop : 0.5;\n self.canvasOffsetLeft = self.isChildGrid\n ? self.parentNode.offsetLeft\n : -0.5;\n h = self.height;\n w = self.width;\n }\n function drawBackground() {\n radiusRect(0, 0, w, h, 0);\n self.ctx.clip();\n self.ctx.fillStyle = self.style.gridBackgroundColor;\n fillRect(0, 0, w, h);\n }\n function drawFrozenRows() {\n var rowOrderIndex,\n ln = Math.min(viewData.length, self.frozenRow);\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n y = columnHeaderCellHeight;\n for (rowIndex = 0; rowIndex < ln; rowIndex += 1) {\n rowOrderIndex = self.orders.rows[rowIndex];\n if (!drawRow(rowOrderIndex, rowIndex)) {\n break;\n }\n }\n if (self.attributes.allowFreezingRows) {\n // HACK great, another stupid magic number.\n // Background will appear as a 0.5px artifact behind the row freeze bar without this hack\n y +=\n self.style.frozenMarkerBorderWidth +\n self.style.frozenMarkerWidth -\n 0.4999999999;\n }\n self.lastFrozenRowPixel = y;\n }\n function drawRows() {\n self.ctx.save();\n if (self.frozenRow > 0) {\n radiusRect(\n 0,\n self.lastFrozenRowPixel,\n self.width,\n self.height - self.lastFrozenRowPixel,\n 0,\n );\n self.ctx.clip();\n }\n var columnOrderIndex,\n rowOrderIndex,\n headerIndex,\n g = schema.length;\n x =\n -self.scrollBox.scrollLeft +\n self.scrollPixelLeft +\n self.style.cellBorderWidth;\n if (!self.attributes.snapToRow) {\n y +=\n -self.scrollBox.scrollTop +\n self.scrollPixelTop +\n self.style.cellBorderWidth;\n }\n for (\n rowIndex = self.frozenRow + self.scrollIndexTop;\n rowIndex < l;\n rowIndex += 1\n ) {\n rowOrderIndex = self.orders.rows[rowIndex];\n self.scrollIndexBottom = rowIndex;\n self.scrollPixelBottom = y;\n if (!drawRow(rowOrderIndex, rowIndex)) {\n break;\n }\n }\n if (self.attributes.showNewRow) {\n if (self.attributes.showRowHeaders) {\n x += rowHeaderCellWidth;\n }\n rowHeight = cellHeight = self.style.cellHeight;\n rowOpen = false;\n for (\n columnOrderIndex = self.scrollIndexLeft;\n columnOrderIndex < g;\n columnOrderIndex += 1\n ) {\n headerIndex = self.orders.columns[columnOrderIndex];\n x += drawCell(self.newRow, viewData.length, viewData.length)(\n schema[headerIndex],\n headerIndex,\n columnOrderIndex,\n );\n if (x > self.width + self.scrollBox.scrollLeft) {\n break;\n }\n }\n rowHeaders.push([\n self.newRow,\n viewData.length,\n viewData.length,\n y,\n rowHeight,\n ]);\n }\n self.ctx.restore();\n }\n function drawMoveMarkers() {\n if (!self.movingSelection) {\n return;\n }\n self.ctx.lineWidth = self.style.moveOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.moveOverlayBorderColor;\n self.ctx.setLineDash(self.style.moveOverlayBorderSegments);\n moveBorders.forEach(function (c) {\n addBorderLine(c[0], c[1]);\n });\n self.ctx.setLineDash([]);\n }\n function drawReorderMarkers() {\n if (!self.reorderObject) {\n return;\n }\n var b = {\n height: self.reorderObject.height,\n width: self.reorderObject.width,\n x: self.reorderObject.x + self.reorderObject.dragOffset.x,\n y: self.reorderObject.y + self.reorderObject.dragOffset.y,\n },\n m = {\n width: w,\n height: h,\n x: 0,\n y: 0,\n };\n self.ctx.fillStyle = self.style.reorderMarkerBackgroundColor;\n self.ctx.lineWidth = self.style.reorderMarkerBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerBorderColor;\n if (self.dragMode === 'row-reorder') {\n for (var k = 0; k < self.selections.length; k++) {\n if (!self.selections[k] || k == self.reorderObject.rowIndex) continue;\n b.height += self.getRowHeight(k);\n }\n b.width = w;\n b.x = 0;\n m.width = w;\n m.height = self.currentCell.height;\n m.y = self.currentCell.y;\n fillRect(b.x, b.y, b.width, b.height);\n strokeRect(b.x, b.y, b.width, b.height);\n self.ctx.lineWidth = self.style.reorderMarkerIndexBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerIndexBorderColor;\n if (\n self.currentCell.rowIndex !== self.reorderObject.rowIndex &&\n self.currentCell.rowIndex > -1 &&\n self.currentCell.rowIndex < l\n ) {\n addBorderLine(\n m,\n self.reorderTarget.sortRowIndex > self.reorderObject.sortRowIndex\n ? 'b'\n : 't',\n );\n }\n } else if (self.dragMode === 'column-reorder' && self.reorderObject) {\n var selectedColumns = self.selections[0];\n for (var k = 1; k < selectedColumns.length; k++) {\n b.width += self.getColumnWidth(\n self.orders.columns[selectedColumns[k]],\n );\n }\n b.height = h;\n b.y = 0;\n m.height = h;\n m.width = self.currentCell.width;\n m.y = 0;\n m.x = self.currentCell.x;\n fillRect(b.x, b.y, b.width, b.height);\n strokeRect(b.x, b.y, b.width, b.height);\n self.ctx.lineWidth = self.style.reorderMarkerIndexBorderWidth;\n self.ctx.strokeStyle = self.style.reorderMarkerIndexBorderColor;\n if (\n self.currentCell.sortColumnIndex !==\n self.reorderObject.sortColumnIndex &&\n self.currentCell.sortColumnIndex > -1 &&\n self.currentCell.sortColumnIndex < schema.length\n ) {\n addBorderLine(\n m,\n self.reorderTarget.columnIndex > self.reorderObject.columnIndex\n ? 'r'\n : 'l',\n );\n }\n }\n }\n function drawBorder() {\n self.ctx.lineWidth = self.style.gridBorderWidth;\n self.ctx.strokeStyle = self.style.gridBorderColor;\n strokeRect(0, 0, self.width, self.height);\n }\n function drawSelectionBorders() {\n self.ctx.lineWidth = self.style.selectionOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.selectionOverlayBorderColor;\n function dsb(c) {\n addBorderLine(c[0], c[1]);\n }\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex < self.frozenRow &&\n c[0].columnIndex < self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.save();\n clipFrozenArea(0);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex >= self.frozenRow &&\n c[0].columnIndex >= self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n self.ctx.save();\n clipFrozenArea(1);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex >= self.frozenRow &&\n c[0].columnIndex < self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n self.ctx.save();\n clipFrozenArea(2);\n selectionBorders\n .filter(function (c) {\n return (\n c[0].rowIndex < self.frozenRow &&\n c[0].columnIndex >= self.frozenColumn\n );\n })\n .forEach(dsb);\n self.ctx.restore();\n }\n function drawSelectionHandles() {\n if (self.mobile || self.attributes.allowMovingSelection) {\n self.ctx.lineWidth = self.style.selectionHandleBorderWidth;\n self.ctx.strokeStyle = self.style.selectionHandleBorderColor;\n self.ctx.fillStyle = self.style.selectionHandleColor;\n selectionHandles.forEach(function (c) {\n addselectionHandle(c[0], c[1]);\n var az = self.attributes.touchSelectHandleZone / 2,\n ax =\n c[0].x + (c[1] === 'tl' || c[1] === 'bl' ? 0 : c[0].width) - az,\n ay =\n c[0].y + (c[1] === 'bl' || c[1] === 'br' ? c[0].height : 0) - az;\n self.visibleCells.unshift({\n x: ax,\n y: ay,\n height: self.style.selectionHandleSize + az,\n width: self.style.selectionHandleSize + az,\n style: 'selection-handle-' + c[1],\n });\n });\n }\n }\n function drawActiveCell() {\n if (!aCell) {\n return;\n }\n self.ctx.save();\n var cl =\n self.activeCell.columnIndex + 1 > self.frozenColumn ||\n self.activeCell.rowIndex + 1 > self.frozenRow,\n acx = cl ? self.lastFrozenColumnPixel : 0,\n acy = cl ? self.lastFrozenRowPixel : 0,\n acw = cl ? self.width - self.lastFrozenColumnPixel : self.width,\n ach = cl ? self.height - self.lastFrozenRowPixel : self.height;\n radiusRect(acx, acy, acw, ach, 0);\n self.ctx.clip();\n if (self.attributes.selectionMode === 'row') {\n if (self.activeCell && self.activeCell.rowIndex === aCell.rowIndex) {\n self.ctx.lineWidth = self.style.activeCellOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.activeCellOverlayBorderColor;\n strokeRect(\n 1,\n aCell.y,\n self.getHeaderWidth() + rowHeaderCellWidth,\n self.visibleRowHeights[aCell.rowIndex],\n );\n }\n } else {\n self.ctx.lineWidth = self.style.activeCellOverlayBorderWidth;\n self.ctx.strokeStyle = self.style.activeCellOverlayBorderColor;\n strokeRect(aCell.x, aCell.y, aCell.width, aCell.height);\n }\n self.ctx.restore();\n }\n function drawFrozenMarkers() {\n var my = self.lastFrozenRowPixel - self.style.frozenMarkerWidth,\n mx = self.lastFrozenColumnPixel - self.style.frozenMarkerBorderWidth,\n xHover =\n self.currentCell && self.currentCell.style === 'frozen-row-marker',\n yHover =\n self.currentCell && self.currentCell.style === 'frozen-column-marker';\n self.ctx.lineWidth = self.style.frozenMarkerBorderWidth;\n if (self.attributes.allowFreezingColumns) {\n self.ctx.fillStyle = yHover\n ? self.style.frozenMarkerHoverColor\n : self.style.frozenMarkerColor;\n self.ctx.strokeStyle = yHover\n ? self.style.frozenMarkerHoverBorderColor\n : self.style.frozenMarkerBorderColor;\n fillRect(mx, 0, self.style.frozenMarkerWidth, self.height);\n strokeRect(mx, 0, self.style.frozenMarkerWidth, self.height);\n self.visibleCells.unshift({\n x: mx,\n y: 0,\n height: self.height,\n width:\n self.style.frozenMarkerWidth + self.style.frozenMarkerBorderWidth,\n style: 'frozen-column-marker',\n });\n }\n if (self.attributes.allowFreezingRows) {\n self.ctx.fillStyle = xHover\n ? self.style.frozenMarkerHoverColor\n : self.style.frozenMarkerColor;\n self.ctx.strokeStyle = xHover\n ? self.style.frozenMarkerHoverBorderColor\n : self.style.frozenMarkerBorderColor;\n fillRect(0, my, self.width, self.style.frozenMarkerWidth);\n strokeRect(0, my, self.width, self.style.frozenMarkerWidth);\n self.visibleCells.unshift({\n x: 0,\n y: my,\n height:\n self.style.frozenMarkerWidth + self.style.frozenMarkerBorderWidth,\n width: self.width,\n style: 'frozen-row-marker',\n });\n }\n if (self.freezeMarkerPosition) {\n self.ctx.fillStyle = self.style.frozenMarkerActiveColor;\n self.ctx.strokeStyle = self.style.frozenMarkerActiveBorderColor;\n if (self.dragMode === 'frozen-column-marker') {\n fillRect(\n self.freezeMarkerPosition.x,\n 0,\n self.style.frozenMarkerWidth,\n self.height,\n );\n strokeRect(\n self.freezeMarkerPosition.x,\n 0,\n self.style.frozenMarkerWidth,\n self.height,\n );\n } else {\n fillRect(\n 0,\n self.freezeMarkerPosition.y,\n self.width,\n self.style.frozenMarkerWidth,\n );\n strokeRect(\n 0,\n self.freezeMarkerPosition.y,\n self.width,\n self.style.frozenMarkerWidth,\n );\n }\n }\n }\n function drawPerfLines() {\n if (!self.attributes.showPerformance) {\n return;\n }\n var pw = 250,\n px =\n self.width -\n pw -\n self.style.scrollBarWidth -\n self.style.scrollBarBorderWidth * 2,\n py = columnHeaderCellHeight,\n ph = 100;\n if (scrollDebugCounters.length === 0) {\n scrollDebugCounters = fillArray(0, perfWindowSize, 1, function () {\n return [0, 0];\n });\n }\n if (touchPPSCounters.length === 0) {\n touchPPSCounters = fillArray(0, perfWindowSize, 1, function () {\n return [0, 0];\n });\n }\n if (entityCount.length === 0) {\n entityCount = fillArray(0, perfWindowSize, 1, 0);\n }\n self.ctx.lineWidth = 0.5;\n function dpl(name, perfArr, arrIndex, max, color, useAbs, rowIndex) {\n var v;\n drawPerfLine(pw, ph, px, py, perfArr, arrIndex, max, color, useAbs);\n self.ctx.fillStyle = color;\n fillRect(3 + px, py + 9 + rowIndex * 11, 8, 8);\n self.ctx.fillStyle = self.style.debugPerfChartTextColor;\n v = arrIndex !== undefined ? perfArr[0][arrIndex] : perfArr[0];\n fillText(\n name + ' ' + (isNaN(v) ? 0 : v).toFixed(3),\n 14 + px,\n py + 16 + rowIndex * 11,\n );\n }\n self.ctx.textAlign = 'left';\n self.ctx.font = self.style.debugFont;\n self.ctx.fillStyle = self.style.debugPerfChartBackground;\n fillRect(px, py, pw, ph);\n [\n [\n 'Scroll Height',\n scrollDebugCounters,\n 0,\n self.scrollBox.scrollHeight,\n self.style.debugScrollHeightColor,\n false,\n ],\n [\n 'Scroll Width',\n scrollDebugCounters,\n 1,\n self.scrollBox.scrollWidth,\n self.style.debugScrollWidthColor,\n false,\n ],\n [\n 'Performance',\n perfCounters,\n undefined,\n 200,\n self.style.debugPerformanceColor,\n false,\n ],\n [\n 'Entities',\n entityCount,\n undefined,\n 1500,\n self.style.debugEntitiesColor,\n false,\n ],\n [\n 'TouchPPSX',\n touchPPSCounters,\n 0,\n 1000,\n self.style.debugTouchPPSXColor,\n true,\n ],\n [\n 'TouchPPSY',\n touchPPSCounters,\n 1,\n 1000,\n self.style.debugTouchPPSYColor,\n true,\n ],\n ].forEach(function (i, index) {\n i.push(index);\n dpl.apply(null, i);\n });\n self.ctx.fillStyle = self.style.debugPerfChartBackground;\n entityCount.pop();\n entityCount.unshift(self.visibleCells.length);\n scrollDebugCounters.pop();\n scrollDebugCounters.unshift([\n self.scrollBox.scrollTop,\n self.scrollBox.scrollLeft,\n ]);\n touchPPSCounters.pop();\n touchPPSCounters.unshift([self.yPPS, self.xPPS]);\n }\n function drawDebug() {\n self.ctx.save();\n var d;\n if (self.attributes.showPerformance || self.attributes.debug) {\n if (perfCounters.length === 0) {\n perfCounters = fillArray(0, perfWindowSize, 1, 0);\n }\n perfCounters.pop();\n perfCounters.unshift(performance.now() - p);\n }\n if (!self.attributes.debug) {\n self.ctx.restore();\n return;\n }\n self.ctx.font = self.style.debugFont;\n d = {};\n d.perf = (\n perfCounters.reduce(function (a, b) {\n return a + b;\n }, 0) / Math.min(drawCount, perfCounters.length)\n ).toFixed(1);\n d.perfDelta = perfCounters[0].toFixed(1);\n d.frozenColumnsWidth = getFrozenColumnsWidth();\n d.htmlImages = Object.keys(self.htmlImageCache).length;\n d.reorderObject =\n 'x: ' +\n (self.reorderObject || { columnIndex: 0 }).columnIndex +\n ', y: ' +\n (self.reorderObject || { rowIndex: 0 }).rowIndex;\n d.reorderTarget =\n 'x: ' +\n (self.reorderTarget || { columnIndex: 0 }).columnIndex +\n ', y: ' +\n (self.reorderTarget || { rowIndex: 0 }).rowIndex;\n d.scale = self.scale;\n d.startScale = self.startScale;\n d.scaleDelta = self.scaleDelta;\n d.zoomDeltaStart = self.zoomDeltaStart;\n d.touchLength = self.touchLength;\n d.touches =\n 'y0: ' +\n (self.touchPosition || { y: 0 }).y +\n ' y1: ' +\n (self.touchPosition1 || { y: 0 }).y;\n d.scrollBox = self.scrollBox.toString();\n d.scrollIndex =\n 'x: ' + self.scrollIndexLeft + ', y: ' + self.scrollIndexTop;\n d.scrollPixel =\n 'x: ' + self.scrollPixelLeft + ', y: ' + self.scrollPixelTop;\n d.canvasOffset =\n 'x: ' + self.canvasOffsetLeft + ', y: ' + self.canvasOffsetTop;\n d.touchDelta = 'x: ' + self.touchDelta.x + ', y: ' + self.touchDelta.y;\n d.touchAnimateTo =\n 'x: ' + self.touchAnimateTo.x + ', y: ' + self.touchAnimateTo.y;\n d.scrollAnimation =\n 'x: ' + self.scrollAnimation.x + ', y: ' + self.scrollAnimation.y;\n d.touchPPS = 'x: ' + self.xPPS + ', y: ' + self.yPPS;\n d.touchPPST = 'x: ' + self.xPPST + ', y: ' + self.yPPST;\n d.touchDuration = self.touchDuration;\n d.pointerLockPosition = self.pointerLockPosition\n ? self.pointerLockPosition.x + ', ' + self.pointerLockPosition.y\n : '';\n d.size = 'w: ' + self.width + ', h: ' + self.height;\n d.mouse = 'x: ' + self.mouse.x + ', y: ' + self.mouse.y;\n d.touch = !self.touchStart\n ? ''\n : 'x: ' + self.touchStart.x + ', y: ' + self.touchStart.y;\n d.entities = self.visibleCells.length;\n d.hasFocus = self.hasFocus;\n d.dragMode = self.dragMode;\n if (self.currentCell) {\n d.columnIndex = self.currentCell.columnIndex;\n d.rowIndex = self.currentCell.rowIndex;\n d.sortColumnIndex = self.currentCell.sortColumnIndex;\n d.sortRowIndex = self.currentCell.sortRowIndex;\n d.context = self.currentCell.context;\n d.dragContext = self.currentCell.dragContext;\n d.style = self.currentCell.style;\n d.type = self.currentCell.type;\n }\n self.ctx.textAlign = 'right';\n self.ctx.fillStyle = self.style.debugBackgroundColor;\n fillRect(0, 0, self.width, self.height);\n Object.keys(d).forEach(function (key, index) {\n var m = key + ': ' + d[key],\n lh = 14;\n self.ctx.fillStyle = self.style.debugColor;\n fillText(\n m,\n w - 20,\n (self.attributes.showPerformance ? 140 : 24) + index * lh,\n );\n });\n self.ctx.restore();\n }\n self.ctx.save();\n initDraw();\n drawBackground();\n drawFrozenRows();\n drawRows();\n drawActiveCell();\n drawHeaders();\n drawFrozenMarkers();\n drawSelectionHandles();\n drawReorderMarkers();\n drawMoveMarkers();\n drawBorder();\n drawSelectionBorders();\n drawScrollBars();\n if (checkScrollHeight) {\n self.resize(true);\n }\n drawDebug();\n drawPerfLines();\n if (self.dispatchEvent('afterdraw', {})) {\n return;\n }\n self.ctx.restore();\n };\n}\n","module.exports=function(e){var o={};function a(t){if(o[t])return o[t].exports;var r=o[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,a),r.l=!0,r.exports}return a.m=e,a.c=o,a.d=function(e,o,t){a.o(e,o)||Object.defineProperty(e,o,{enumerable:!0,get:t})},a.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},a.t=function(e,o){if(1&o&&(e=a(e)),8&o)return e;if(4&o&&\"object\"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(a.r(t),Object.defineProperty(t,\"default\",{enumerable:!0,value:e}),2&o&&\"string\"!=typeof e)for(var r in e)a.d(t,r,function(o){return e[o]}.bind(null,r));return t},a.n=function(e){var o=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(o,\"a\",o),o},a.o=function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},a.p=\"\",a(a.s=0)}([function(e,o,a){\"use strict\";Object.defineProperty(o,\"__esModule\",{value:!0});var t=a(1),r=Object.keys(t.default).reduce((function(e,o){return e.concat(t.default[o])}),[]);o.default=function(e){return-1===r.indexOf(e.key)}},function(e,o,a){\"use strict\";Object.defineProperty(o,\"__esModule\",{value:!0});o.default={modifier:[\"Alt\",\"AltGraph\",\"CapsLock\",\"Control\",\"Fn\",\"FnLock\",\"Meta\",\"NumLock\",\"ScrollLock\",\"Shift\",\"Symbol\",\"SymbolLock\"],legacyModifier:[\"Hyper\",\"Super\"],whiteSpace:[\"Enter\",\"Tab\"],navigation:[\"ArrowDown\",\"ArrowLeft\",\"ArrowRight\",\"ArrowUp\",\"End\",\"Home\",\"PageDown\",\"PageUp\"],editing:[\"Backspace\",\"Clear\",\"Copy\",\"CrSel\",\"Cut\",\"Delete\",\"EraseEof\",\"ExSel\",\"Insert\",\"Paste\",\"Redo\",\"Undo\"],ui:[\"Accept\",\"Again\",\"Attn\",\"Cancel\",\"ContextMenu\",\"Escape\",\"Execute\",\"Find\",\"Help\",\"Pause\",\"Play\",\"Props\",\"Select\",\"ZoomIn\",\"ZoomOut\"],device:[\"BrightnessDown\",\"BrightnessUp\",\"Eject\",\"LogOff\",\"Power\",\"PowerOff\",\"PrintScreen\",\"Hibernate\",\"Standby\",\"WakeUp\"],imeCompositionKeys:[\"AllCandidates\",\"Alphanumeric\",\"CodeInput\",\"Compose\",\"Convert\",\"Dead\",\"FinalMode\",\"GroupFirst\",\"GroupLast\",\"GroupNext\",\"GroupPrevious\",\"ModeChange\",\"NextCandidate\",\"NonConvert\",\"PreviousCandidate\",\"Process\",\"SingleCandidate\"],koreanSpecific:[\"HangulMode\",\"HanjaMode\",\"JunjaMode\"],japaneseSpecific:[\"Eisu\",\"Hankaku\",\"Hiragana\",\"HiraganaKatakana\",\"KanaMode\",\"KanjiMode\",\"Katakana\",\"Romaji\",\"Zenkaku\",\"ZenkakuHankaku\"],commonFunction:[\"F1\",\"F2\",\"F3\",\"F4\",\"F5\",\"F6\",\"F7\",\"F8\",\"F9\",\"F10\",\"F11\",\"F12\",\"Soft1\",\"Soft2\",\"Soft3\",\"Soft4\"],multimedia:[\"ChannelDown\",\"ChannelUp\",\"Close\",\"MailForward\",\"MailReply\",\"MailSend\",\"MediaClose\",\"MediaFastForward\",\"MediaPause\",\"MediaPlay\",\"MediaPlayPause\",\"MediaRecord\",\"MediaRewind\",\"MediaStop\",\"MediaTrackNext\",\"MediaTrackPrevious\",\"New\",\"Open\",\"Print\",\"Save\",\"SpellCheck\"],multimediaNumpad:[\"Key11\",\"Key12\"],audio:[\"AudioBalanceLeft\",\"AudioBalanceRight\",\"AudioBassBoostDown\",\"AudioBassBoostToggle\",\"AudioBassBoostUp\",\"AudioFaderFront\",\"AudioFaderRear\",\"AudioSurroundModeNext\",\"AudioTrebleDown\",\"AudioTrebleUp\",\"AudioVolumeDown\",\"AudioVolumeUp\",\"AudioVolumeMute\",\"MicrophoneToggle\",\"MicrophoneVolumeDown\",\"MicrophoneVolumeUp\",\"MicrophoneVolumeMute\"],speech:[\"SpeechCorrectionList\",\"SpeechInputToggle\"],application:[\"LaunchApplication1\",\"LaunchApplication2\",\"LaunchCalendar\",\"LaunchContacts\",\"LaunchMail\",\"LaunchMediaPlayer\",\"LaunchMusicPlayer\",\"LaunchPhone\",\"LaunchScreenSaver\",\"LaunchSpreadsheet\",\"LaunchWebBrowser\",\"LaunchWebCam\",\"LaunchWordProcessor\"],browser:[\"BrowserBack\",\"BrowserFavorites\",\"BrowserForward\",\"BrowserHome\",\"BrowserRefresh\",\"BrowserSearch\",\"BrowserStop\"],mobilePhone:[\"AppSwitch\",\"Call\",\"Camera\",\"CameraFocus\",\"EndCall\",\"GoBack\",\"GoHome\",\"HeadsetHook\",\"LastNumberRedial\",\"Notification\",\"MannerMode\",\"VoiceDial\"],tv:[\"TV\",\"TV3DMode\",\"TVAntennaCable\",\"TVAudioDescription\",\"TVAudioDescriptionMixDown\",\"TVAudioDescriptionMixUp\",\"TVContentsMenu\",\"TVDataService\",\"TVInput\",\"TVInputComponent1\",\"TVInputComponent2\",\"TVInputComposite1\",\"TVInputComposite2\",\"TVInputHDMI1\",\"TVInputHDMI2\",\"TVInputHDMI3\",\"TVInputHDMI4\",\"TVInputVGA1\",\"TVMediaContext\",\"TVNetwork\",\"TVNumberEntry\",\"TVPower\",\"TVRadioService\",\"TVSatellite\",\"TVSatelliteBS\",\"TVSatelliteCS\",\"TVSatelliteToggle\",\"TVTerrestrialAnalog\",\"TVTerrestrialDigital\",\"TVTimer\"],mediaControls:[\"AVRInput\",\"AVRPower\",\"ColorF0Red\",\"ColorF1Green\",\"ColorF2Yellow\",\"ColorF3Blue\",\"ColorF4Grey\",\"ColorF5Brown\",\"ClosedCaptionToggle\",\"Dimmer\",\"DisplaySwap\",\"DVR\",\"Exit\",\"FavoriteClear0\",\"FavoriteClear1\",\"FavoriteClear2\",\"FavoriteClear3\",\"FavoriteRecall0\",\"FavoriteRecall1\",\"FavoriteRecall2\",\"FavoriteRecall3\",\"FavoriteStore0\",\"FavoriteStore1\",\"FavoriteStore2\",\"FavoriteStore3\",\"Guide\",\"GuideNextDay\",\"GuidePreviousDay\",\"Info\",\"InstantReplay\",\"Link\",\"ListProgram\",\"LiveContent\",\"Lock\",\"MediaApps\",\"MediaAudioTrack\",\"MediaLast\",\"MediaSkipBackward\",\"MediaSkipForward\",\"MediaStepBackward\",\"MediaStepForward\",\"MediaTopMenu\",\"NavigateIn\",\"NavigateNext\",\"NavigateOut\",\"NavigatePrevious\",\"NextFavoriteChannel\",\"NextUserProfile\",\"OnDemand\",\"Pairing\",\"PinPDown\",\"PinPMove\",\"PinPToggle\",\"PinPUp\",\"PlaySpeedDown\",\"PlaySpeedReset\",\"PlaySpeedUp\",\"RandomToggle\",\"RcLowBattery\",\"RecordSpeedNext\",\"RfBypass\",\"ScanChannelsToggle\",\"ScreenModeNext\",\"Settings\",\"SplitScreenToggle\",\"STBInput\",\"STBPower\",\"Subtitle\",\"Teletext\",\"VideoModeNext\",\"Wink\",\"ZoomToggle\"]}}]).default;","'use strict';\n\nconst isSupportedHtml = function (pasteValue) {\n // We need to match new lines in the HTML, .* won't match new line characters.\n // `s` regex modifier can't be used with `ecmaVersion === 2017`.\n // As a workaround using [\\s\\S]*. Fix when we upgrade `ecmaVersion`.\n const genericDiv = /(?:^(<meta[^>]*>)?[\\s\\S]*<div[^>]*>)/;\n const genericSpan = /(?:^(<meta[^>]*>)?[\\s\\S]*<span[^>]*>)/;\n const genericTable = /(?:^(<meta[^>]*>)?[\\s\\S]*<table[^>]*>)/; // Matches Google Sheets format clipboard data format too.\n const excelTable = /(?:<!--StartFragment-->[\\s\\S]*<tr[^>]*>)/;\n const excelTableRow = /(?:<!--StartFragment-->[\\s\\S]*<td[^>]*>)/;\n\n return [\n genericDiv,\n genericTable,\n genericSpan,\n excelTable,\n excelTableRow,\n ].some((expression) => expression.test(pasteValue));\n};\n\n// Explanation of nodeType here: https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst IGNORE_NODETYPES = [8, 3]; // '#text' and '#comment'\n\nconst isHtmlTable = function (pasteValue) {\n return /(?:<table[^>]*>)|(?:<tr[^]*>)/.test(pasteValue);\n};\n\nconst sanitizeElementData = function (element) {\n // It is not entirely clear if this check on nodeType is required.\n let elementData = element.nodeType === 1 ? element.innerText : element.data;\n\n return String(elementData).replace(/\\s+/g, ' ').trim();\n};\n\nconst parseHtmlText = function (data) {\n const doc = new DOMParser().parseFromString(data, 'text/html');\n const element = doc.querySelector('div') || doc.querySelector('span');\n const elementData = sanitizeElementData(element);\n\n return elementData\n .split('\\n')\n .map((item) => item.split('\\t').map((value) => ({ value: [{ value }] })));\n};\n\nconst parseHtmlTable = function (data) {\n const doc = new DOMParser().parseFromString(data, 'text/html');\n const trs = doc.querySelectorAll('table tr');\n const rows = [];\n\n for (const tr of trs) {\n const row = [];\n\n for (const childNode of tr.childNodes) {\n if (IGNORE_NODETYPES.includes(childNode.nodeType)) continue;\n\n const col = { value: [] };\n const value = sanitizeElementData(childNode);\n\n if (value) col.value.push({ value });\n\n row.push(col);\n }\n\n rows.push(row);\n }\n\n return rows;\n};\n\nconst parseText = function (data) {\n return data\n .split('\\n')\n .map((item) => item.split('\\t').map((value) => ({ value: [{ value }] })));\n};\n\nconst parseData = function (data, mimeType) {\n if (mimeType === 'text/html' && isHtmlTable(data)) {\n return parseHtmlTable(data);\n } else if (mimeType === 'text/html') {\n return parseHtmlText(data);\n }\n\n // Default data format is string, so split on new line,\n // and then enclose in an array (a row with one cell):\n return parseText(data);\n};\n\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 if (self.frozenColumn > 0) {\n self.scrollBox.widthBoxRatio =\n (self.scrollBox.width - self.scrollCache.x[self.frozenColumn - 1]) /\n dataWidth;\n } else {\n self.scrollBox.widthBoxRatio = self.scrollBox.width / dataWidth;\n }\n self.scrollBox.scrollBoxWidth =\n self.scrollBox.width * self.scrollBox.widthBoxRatio -\n self.style.scrollBarWidth -\n b -\n d;\n // TODO: This heightBoxRatio number is terribly wrong.\n // They should be a result of the size of the grid/canvas?\n // it being off causes the scroll bar to \"slide\" under\n // the dragged mouse.\n // https://github.com/TonyGermaneri/canvas-datagrid/issues/97\n self.scrollBox.heightBoxRatio =\n (self.scrollBox.height -\n columnHeaderCellHeight -\n self.scrollCache.y[self.frozenRow]) /\n dataHeight;\n self.scrollBox.scrollBoxHeight =\n self.scrollBox.height * self.scrollBox.heightBoxRatio -\n self.style.scrollBarWidth -\n b -\n d;\n self.scrollBox.scrollBoxWidth = Math.max(\n self.scrollBox.scrollBoxWidth,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.scrollBoxHeight = Math.max(\n self.scrollBox.scrollBoxHeight,\n self.style.scrollBarBoxMinSize,\n );\n // horizontal\n n.x += rowHeaderCellWidth;\n n.y += self.height - self.style.scrollBarWidth - d;\n n.width =\n self.width - self.style.scrollBarWidth - rowHeaderCellWidth - d - m;\n n.height = self.style.scrollBarWidth + self.style.scrollBarBorderWidth + d;\n // horizontal box\n nb.y = n.y + self.style.scrollBarBoxMargin;\n nb.width = self.scrollBox.scrollBoxWidth;\n nb.height = self.style.scrollBarBoxWidth;\n // vertical\n v.x +=\n self.width -\n self.style.scrollBarWidth -\n self.style.scrollBarBorderWidth -\n d;\n v.y += columnHeaderCellHeight + self.scrollCache.y[self.frozenRow];\n v.width = self.style.scrollBarWidth + self.style.scrollBarBorderWidth + d;\n v.height =\n self.height - columnHeaderCellHeight - self.style.scrollBarWidth - d - m;\n // vertical box\n vb.x = v.x + self.style.scrollBarBoxMargin;\n vb.y += self.scrollCache.y[self.frozenRow];\n vb.width = self.style.scrollBarBoxWidth;\n vb.height = self.scrollBox.scrollBoxHeight;\n // corner\n co.x = n.x + n.width + m;\n co.y = v.y + v.height + m;\n co.width = self.style.scrollBarWidth + self.style.scrollBarBorderWidth;\n co.height = self.style.scrollBarWidth + self.style.scrollBarBorderWidth;\n self.scrollBox.entities = {\n horizontalBar: n,\n horizontalBox: nb,\n verticalBar: v,\n verticalBox: vb,\n corner: co,\n };\n self.scrollBox.bar = {\n v: v,\n h: n,\n };\n self.scrollBox.box = {\n v: vb,\n h: nb,\n };\n /// calculate page and dom elements\n self.page = Math.max(\n 1,\n self.visibleRows.length - 3 - self.attributes.pageUpDownOverlap,\n );\n // set canvas drawing related items\n if (!self.isChildGrid) {\n self.canvas.width = self.width * ratio;\n self.canvas.height = self.height * ratio;\n self.ctx.scale(ratio, ratio);\n }\n // resize any open dom elements (input/textarea)\n self.resizeEditInput();\n self.scroll(true);\n if (drawAfterResize) {\n self.draw(true);\n }\n self.dispatchEvent('resize', {});\n return true;\n };\n self.scroll = function (dontDraw) {\n var s = self.getSchema(),\n l = (self.viewData || []).length,\n ch = self.style.cellHeight;\n // go too far in leaps, then get focused\n self.scrollIndexTop = Math.floor(\n l * (self.scrollBox.scrollTop / self.scrollBox.scrollHeight) - 100,\n );\n self.scrollIndexTop = Math.max(self.scrollIndexTop, 0);\n self.scrollPixelTop = self.scrollCache.y[self.scrollIndexTop];\n // sometimes the grid is rendered but the height is zero\n if (self.scrollBox.scrollHeight === 0) {\n self.scrollIndexTop = 0;\n }\n self.scrollPixelTop = 0;\n self.scrollIndexLeft = self.frozenColumn;\n self.scrollPixelLeft = 0;\n while (\n self.scrollPixelTop < self.scrollBox.scrollTop &&\n self.scrollIndexTop < self.viewData.length\n ) {\n // start on index +1 since index 0 was used in \"go too far\" section above\n self.scrollIndexTop += 1;\n self.scrollPixelTop = self.scrollCache.y[self.scrollIndexTop];\n }\n while (\n self.scrollPixelLeft < self.scrollBox.scrollLeft + 1 &&\n self.scrollIndexLeft < s.length\n ) {\n self.scrollPixelLeft = self.scrollCache.x[self.scrollIndexLeft];\n self.scrollIndexLeft += 1;\n }\n if (s.length > 0) {\n self.scrollIndexLeft = Math.max(self.scrollIndexLeft - 1, 0);\n self.scrollPixelLeft -= self.getColumnWidth(\n self.orders.columns[self.scrollIndexLeft],\n );\n }\n if ((self.viewData || []).length > 0) {\n self.scrollIndexTop = Math.max(self.scrollIndexTop - 1, 0);\n self.scrollPixelTop = Math.max(\n self.scrollPixelTop -\n (self.viewData[self.scrollIndexTop]\n ? (self.sizes.rows[self.scrollIndexTop] || ch) +\n (self.sizes.trees[self.scrollIndexTop] || 0)\n : ch) *\n self.scale,\n 0,\n );\n }\n self.ellipsisCache = {};\n if (!dontDraw) {\n self.draw(true);\n }\n //TODO: figure out why this has to be delayed for child grids\n //BUG: wheeling event on 3rd level hierarchy fails to move input box\n requestAnimationFrame(self.resizeEditInput);\n self.dispatchEvent('scroll', {\n top: self.scrollBox.scrollTop,\n left: self.scrollBox.scrollLeft,\n });\n };\n self.mousemove = function (e, overridePos) {\n if (self.contextMenu || self.input) {\n return;\n }\n self.mouse = overridePos || self.getLayerPos(e);\n var ctrl =\n (e.ctrlKey || e.metaKey || self.attributes.persistantSelectionMode) &&\n !self.attributes.singleSelectionMode,\n i,\n s = self.getSchema(),\n dragBounds,\n sBounds,\n x = self.mouse.x,\n y = self.mouse.y,\n cell = self.getCellAt(x, y),\n delta,\n ev = { NativeEvent: e, cell: cell, x: x, y: y },\n previousCell = self.currentCell;\n clearTimeout(self.scrollTimer);\n if (!self.isInGrid({ x: x, y: y })) {\n self.hasFocus = false;\n }\n if (self.dispatchEvent('mousemove', ev)) {\n return;\n }\n if (cell && self.currentCell) {\n self.rowBoundaryCrossed = self.currentCell.rowIndex !== cell.rowIndex;\n self.columnBoundaryCrossed =\n self.currentCell.columnIndex !== cell.columnIndex;\n self.cellBoundaryCrossed =\n self.rowBoundaryCrossed || self.columnBoundaryCrossed;\n ['row', 'column', 'cell'].forEach(function (prefix) {\n if (self[prefix + 'BoundaryCrossed']) {\n ev.cell = previousCell;\n self.dispatchEvent(prefix + 'mouseout', ev);\n ev.cell = cell;\n self.dispatchEvent(prefix + 'mouseover', ev);\n }\n });\n }\n self.currentCell = cell;\n\n self.hovers = {};\n if (!self.draggingItem && cell) {\n self.dragItem = cell;\n self.dragMode = cell.dragContext;\n self.cursor = cell.context;\n if (cell.context === 'cell') {\n self.cursor = 'default';\n self.hovers = {\n rowIndex: cell.rowIndex,\n columnIndex: cell.columnIndex,\n onFilterButton: false,\n };\n if (\n cell.isFilterable &&\n x >\n cell.x +\n cell.width +\n self.canvasOffsetLeft -\n self.style.filterButtonWidth &&\n x < cell.x + cell.width + self.canvasOffsetLeft &&\n y >\n cell.y +\n cell.height +\n self.canvasOffsetTop -\n self.style.filterButtonHeight &&\n y < cell.y + cell.height + self.canvasOffsetTop\n ) {\n self.hovers.onFilterButton = true;\n self.draw();\n }\n }\n if (self.selecting || self.reorderObject) {\n delta = {\n x: Math.abs(self.dragStart.x - x),\n y: Math.abs(self.dragStart.y - y),\n };\n if (self.dragStartObject.columnIndex !== -1 && e.shiftKey) {\n self.dragStartObject = {\n rowIndex: self.activeCell.rowIndex,\n columnIndex: self.activeCell.columnIndex,\n };\n }\n dragBounds = {\n top: Math.min(self.dragStartObject.rowIndex, cell.rowIndex),\n left: Math.min(self.dragStartObject.columnIndex, cell.columnIndex),\n bottom: Math.max(self.dragStartObject.rowIndex, cell.rowIndex),\n right: Math.max(self.dragStartObject.columnIndex, cell.columnIndex),\n };\n if (self.dragStartObject.columnIndex === -1) {\n sBounds = self.getSelectionBounds();\n dragBounds.left = -1;\n dragBounds.right = s.length - 1;\n dragBounds.top = Math.min(sBounds.top, cell.rowIndex);\n dragBounds.bottom = Math.max(sBounds.bottom, cell.rowIndex);\n }\n if (\n self.dragStartObject.rowIndex !== cell.rowIndex ||\n self.dragStartObject.columnIndex !== cell.columnIndex\n ) {\n self.ignoreNextClick = true;\n }\n if (\n self.cellBoundaryCrossed ||\n (delta.x === 0 && delta.y === 0) ||\n self.attributes.selectionMode === 'row'\n ) {\n if (\n (self.attributes.selectionMode === 'row' ||\n self.dragStartObject.columnIndex === -1) &&\n self.rowBoundaryCrossed\n ) {\n self.selectRow(cell.rowIndex, ctrl, null, true);\n } else if (self.attributes.selectionMode !== 'row') {\n if (cell.hovered && self.hovers.onFilterButton) {\n if (cell.openedFilter) {\n cell.openedFilter = false;\n self.selectedFilterButton = {\n columnIndex: -1,\n rowIndex: -1,\n };\n } else {\n self.selectedFilterButton.rowIndex = cell.rowIndex;\n self.selectedFilterButton.columnIndex = cell.columnIndex;\n self.contextmenuEvent(e, {\n x: cell.x + cell.width - self.style.filterButtonWidth,\n y: cell.y + cell.height,\n rect: { left: 0, top: 0 },\n });\n }\n self.draw();\n return;\n } else {\n self.selectedFilterButton = {\n columnIndex: -1,\n rowIndex: -1,\n };\n if (self.hovers.onFilterButton) return;\n if (!self.dragAddToSelection && cell.rowIndex !== undefined) {\n if (\n self.selections[cell.rowIndex] &&\n self.selections[cell.rowIndex].indexOf(cell.columnIndex) !==\n -1\n ) {\n self.selections[cell.rowIndex].splice(\n self.selections[cell.rowIndex].indexOf(cell.columnIndex),\n 1,\n );\n }\n } else {\n self.selections[cell.rowIndex] =\n self.selections[cell.rowIndex] || [];\n if (\n self.selections[cell.rowIndex].indexOf(cell.columnIndex) ===\n -1\n ) {\n self.selections[cell.rowIndex].push(cell.columnIndex);\n var event = {\n selections: self.selections,\n selectedData: self.getSelectedData(),\n selectedCells: self.getSelectedCells(),\n selectionBounds: self.getSelectionBounds(),\n };\n self.dispatchEvent('selectionchanged', event);\n }\n }\n }\n }\n }\n if (\n (!self.selectionBounds ||\n dragBounds.top !== self.selectionBounds.top ||\n dragBounds.left !== self.selectionBounds.left ||\n dragBounds.bottom !== self.selectionBounds.bottom ||\n dragBounds.right !== self.selectionBounds.right) &&\n !ctrl\n ) {\n if (!(cell.hovered && self.hovers.onFilterButton)) {\n self.selections = [];\n }\n if (dragBounds.top === -1) {\n dragBounds.top = 0;\n }\n sBounds = dragBounds;\n if (self.attributes.selectionMode === 'row') {\n for (i = sBounds.top; i <= sBounds.bottom; i += 1) {\n self.selectRow(i, true, null, true);\n }\n } else {\n self.selectArea(sBounds, true);\n if (sBounds.left == -1 && sBounds.top !== sBounds.bottom)\n self.isMultiRowsSelected = true;\n }\n }\n\n if (self.attributes.autoScrollOnMousemove) {\n var movedVertically = delta.y > self.attributes.autoScrollMargin;\n var movedHorizontally = delta.x > self.attributes.autoScrollMargin;\n\n if (movedVertically && !movedHorizontally)\n self.autoScrollZone(e, -1, y, ctrl);\n else if (movedHorizontally && !movedVertically)\n self.autoScrollZone(e, x, -1, ctrl);\n else if (movedHorizontally && movedVertically)\n self.autoScrollZone(e, x, y, ctrl);\n } else {\n self.autoScrollZone(e, x, y, ctrl);\n }\n }\n }\n self.cellBoundaryCrossed = false;\n self.rowBoundaryCrossed = false;\n self.columnBoundaryCrossed = false;\n self.draw(true);\n };\n self.click = function (e, overridePos) {\n var i,\n startingBounds = JSON.stringify(self.getSelectionBounds()),\n ctrl =\n (e.ctrlKey || e.metaKey || self.attributes.persistantSelectionMode) &&\n !self.attributes.singleSelectionMode,\n pos = overridePos || self.getLayerPos(e);\n self.currentCell = self.getCellAt(pos.x, pos.y);\n if (self.currentCell.grid !== undefined) {\n return;\n }\n function checkSelectionChange() {\n var ev,\n sb = self.getSelectionBounds();\n\n if (startingBounds === JSON.stringify(sb)) {\n return;\n }\n ev = {\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\n };\n Object.defineProperty(ev, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n self.dispatchEvent('selectionchanged', ev);\n }\n if (self.input) {\n self.endEdit();\n }\n if (self.ignoreNextClick) {\n self.ignoreNextClick = false;\n return;\n }\n i = self.currentCell;\n if (\n self.dispatchEvent('click', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n if (\n ['rowHeaderCell', 'columnHeaderCell'].indexOf(self.currentCell.style) ===\n -1 &&\n !ctrl\n ) {\n if (!self.hovers.onFilterButton) {\n self.setActiveCell(i.columnIndex, i.rowIndex);\n }\n }\n if (self.currentCell.context === 'cell') {\n if (self.currentCell.style === 'cornerCell') {\n self.selectAll();\n self.draw();\n checkSelectionChange();\n return;\n }\n if (self.currentCell.style === 'columnHeaderCell') {\n if (self.attributes.columnHeaderClickBehavior === 'sort') {\n if (self.orderBy === i.header.name) {\n self.orderDirection =\n self.orderDirection === 'asc' ? 'desc' : 'asc';\n } else {\n self.orderDirection = 'asc';\n }\n self.order(i.header.name, self.orderDirection);\n checkSelectionChange();\n return;\n }\n }\n self.selections[i.rowIndex] = self.selections[i.rowIndex] || [];\n if (\n self.attributes.selectionMode === 'row' ||\n self.currentCell.style === 'rowHeaderCell'\n ) {\n if (\n self.currentCell.style === 'rowHeaderCell' &&\n self.attributes.tree &&\n pos.x > 0 &&\n pos.x - self.currentCell.x <\n self.style.treeArrowWidth +\n self.style.treeArrowMarginLeft +\n self.style.treeArrowMarginRight +\n self.style.treeArrowClickRadius &&\n pos.y - self.currentCell.y <\n self.style.treeArrowHeight +\n self.style.treeArrowMarginTop +\n self.style.treeArrowClickRadius &&\n pos.y > 0\n ) {\n self.toggleTree(i.rowIndex);\n return;\n }\n }\n if (e.shiftKey && !ctrl) {\n self.selectionBounds = self.getSelectionBounds();\n self.selectArea(undefined, false);\n }\n }\n checkSelectionChange();\n self.draw(true);\n };\n self.dragResizeColumn = function (e) {\n var pos, x, y;\n pos = self.getLayerPos(e);\n x = self.resizingStartingWidth + pos.x - self.dragStart.x;\n y = self.resizingStartingHeight + pos.y - self.dragStart.y;\n if (x < self.style.minColumnWidth) {\n x = self.style.minColumnWidth;\n }\n if (y < self.style.minRowHeight) {\n y = self.style.minRowHeight;\n }\n if (\n self.dispatchEvent('resizecolumn', {\n x: x,\n y: y,\n draggingItem: self.draggingItem,\n })\n ) {\n return false;\n }\n if (\n self.scrollBox.scrollLeft >\n self.scrollBox.scrollWidth - self.attributes.resizeScrollZone &&\n self.dragMode === 'ew-resize'\n ) {\n self.resize(true);\n self.scrollBox.scrollLeft += x;\n }\n if (self.dragMode === 'ew-resize') {\n self.sizes.columns[\n self.draggingItem.header.style === 'rowHeaderCell'\n ? 'cornerCell'\n : self.draggingItem.sortColumnIndex\n ] = x;\n if (\n ['rowHeaderCell', 'cornerCell'].indexOf(\n self.draggingItem.header.style,\n ) !== -1\n ) {\n self.resize(true);\n }\n self.resizeChildGrids();\n return;\n }\n if (self.dragMode === 'ns-resize') {\n if (self.draggingItem.rowOpen) {\n self.sizes.trees[self.draggingItem.rowIndex] = y;\n } else if (self.attributes.globalRowResize) {\n self.style.cellHeight = y;\n } else {\n self.sizes.rows[self.draggingItem.rowIndex] = y;\n }\n self.dispatchEvent('resizerow', { row: y });\n self.resizeChildGrids();\n return;\n }\n self.ellipsisCache = {};\n };\n self.stopDragResize = function () {\n self.resize();\n document.body.removeEventListener(\n 'mousemove',\n self.dragResizeColumn,\n false,\n );\n document.body.removeEventListener('mouseup', self.stopDragResize, false);\n self.setStorageData();\n self.draw(true);\n self.ignoreNextClick = true;\n };\n self.scrollGrid = function (e) {\n var pos = self.getLayerPos(e);\n if (\n self.attributes.scrollPointerLock &&\n self.pointerLockPosition &&\n ['horizontal-scroll-box', 'vertical-scroll-box'].indexOf(\n self.scrollStartMode,\n ) !== -1\n ) {\n self.pointerLockPosition.x += e.movementX;\n self.pointerLockPosition.y += e.movementY;\n self.pointerLockPosition.x = Math.min(\n self.width - self.style.scrollBarWidth,\n Math.max(0, self.pointerLockPosition.x),\n );\n self.pointerLockPosition.y = Math.min(\n self.height - self.style.scrollBarWidth,\n Math.max(0, self.pointerLockPosition.y),\n );\n pos = self.pointerLockPosition;\n }\n self.scrollMode = self.getCellAt(pos.x, pos.y).context;\n if (\n self.scrollMode === 'horizontal-scroll-box' &&\n self.scrollStartMode !== 'horizontal-scroll-box'\n ) {\n self.scrollStartMode = 'horizontal-scroll-box';\n self.dragStart = pos;\n self.scrollStart.left = self.scrollBox.scrollLeft;\n clearTimeout(self.scrollTimer);\n return;\n }\n if (\n self.scrollMode === 'vertical-scroll-box' &&\n self.scrollStartMode !== 'vertical-scroll-box'\n ) {\n self.scrollStartMode = 'vertical-scroll-box';\n self.dragStart = pos;\n self.scrollStart.top = self.scrollBox.scrollTop;\n clearTimeout(self.scrollTimer);\n return;\n }\n if (\n self.scrollStartMode === 'vertical-scroll-box' &&\n self.scrollMode !== 'vertical-scroll-box'\n ) {\n self.scrollMode = 'vertical-scroll-box';\n }\n if (\n self.scrollStartMode === 'horizontal-scroll-box' &&\n self.scrollMode !== 'horizontal-scroll-box'\n ) {\n self.scrollMode = 'horizontal-scroll-box';\n }\n clearTimeout(self.scrollTimer);\n if (self.scrollModes.indexOf(self.scrollMode) === -1) {\n return;\n }\n if (self.scrollMode === 'vertical-scroll-box') {\n self.scrollBox.scrollTop =\n self.scrollStart.top +\n (pos.y - self.dragStart.y) / self.scrollBox.heightBoxRatio;\n } else if (self.scrollMode === 'vertical-scroll-top') {\n self.scrollBox.scrollTop -= self.page * self.style.cellHeight;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n } else if (self.scrollMode === 'vertical-scroll-bottom') {\n self.scrollBox.scrollTop += self.page * self.style.cellHeight;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n if (self.scrollMode === 'horizontal-scroll-box') {\n self.scrollBox.scrollLeft =\n self.scrollStart.left +\n (pos.x - self.dragStart.x) / self.scrollBox.widthBoxRatio;\n } else if (self.scrollMode === 'horizontal-scroll-right') {\n self.scrollBox.scrollLeft += self.attributes.selectionScrollIncrement;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n } else if (self.scrollMode === 'horizontal-scroll-left') {\n self.scrollBox.scrollLeft -= self.attributes.selectionScrollIncrement;\n self.scrollTimer = setTimeout(\n self.scrollGrid,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n };\n self.stopScrollGrid = function () {\n clearTimeout(self.scrollTimer);\n if (document.exitPointerLock) {\n document.exitPointerLock();\n }\n document.removeEventListener('mousemove', self.scrollGrid, false);\n };\n self.dragReorder = function (e) {\n var pos,\n x,\n y,\n columReorder = self.dragMode === 'column-reorder',\n rowReorder = self.dragMode === 'row-reorder';\n pos = self.getLayerPos(e);\n x = pos.x - self.dragStart.x;\n y = pos.y - self.dragStart.y;\n if (!self.attributes.allowColumnReordering && columReorder) {\n return;\n }\n if (!self.attributes.allowRowReordering && rowReorder) {\n return;\n }\n if ((e.ctrlKey || e.metaKey || e.shiftKey) && self.reorderObject) {\n if (\n self.dragMode === 'column-reorder' &&\n !self.isMultiColumnsSelected(self.draggingItem.header.index)\n ) {\n self.selectColumn(self.draggingItem.header.index, false, false);\n }\n }\n if (\n self.dispatchEvent('reordering', {\n NativeEvent: e,\n source: self.dragStartObject,\n target: self.currentCell,\n dragMode: self.dragMode,\n })\n ) {\n return;\n }\n if (\n Math.abs(x) > self.attributes.reorderDeadZone ||\n Math.abs(y) > self.attributes.reorderDeadZone\n ) {\n self.reorderObject = self.draggingItem;\n if (self.isMultiRowsSelected)\n self.reorderObject = self.getVisibleCellByIndex(\n -1,\n self.activeCell.rowIndex,\n );\n self.reorderTarget = self.currentCell;\n self.reorderObject.dragOffset = {\n x: x,\n y: y,\n };\n self.autoScrollZone(\n e,\n columReorder ? pos.x : -1,\n rowReorder ? pos.y : -1,\n false,\n );\n }\n };\n self.stopDragReorder = function (e) {\n var oIndex,\n tIndex,\n odata = [],\n cr = {\n 'row-reorder': self.orders.rows,\n 'column-reorder': self.orders.columns,\n },\n i = {\n 'row-reorder': 'rowIndex',\n 'column-reorder': 'sortColumnIndex',\n }[self.dragMode];\n document.body.removeEventListener('mousemove', self.dragReorder, false);\n document.body.removeEventListener('mouseup', self.stopDragReorder, false);\n if (\n self.reorderObject &&\n self.reorderTarget &&\n ((self.dragMode === 'column-reorder' &&\n self.reorderTarget.sortColumnIndex > -1 &&\n self.reorderTarget.sortColumnIndex < self.getSchema().length) ||\n (self.dragMode === 'row-reorder' &&\n self.reorderTarget.rowIndex > -1 &&\n self.reorderTarget.rowIndex < self.viewData.length)) &&\n self.reorderObject[i] !== self.reorderTarget[i] &&\n !self.dispatchEvent('reorder', {\n NativeEvent: e,\n source: self.reorderObject,\n target: self.reorderTarget,\n dragMode: self.dragMode,\n })\n ) {\n self.ignoreNextClick = true;\n oIndex = cr[self.dragMode].indexOf(self.reorderObject[i]);\n tIndex = cr[self.dragMode].indexOf(self.reorderTarget[i]);\n if (self.dragMode === 'column-reorder') {\n var sortColumnIndices = [];\n var seletedColumnIndices = [];\n if (self.selections[0]) {\n self.selections[0].forEach(function (value) {\n sortColumnIndices.push(self.orders.columns[value]);\n });\n }\n var deleteCount = sortColumnIndices.length;\n cr[self.dragMode].splice(oIndex, deleteCount);\n if (tIndex > oIndex) tIndex = tIndex - (deleteCount - 1);\n for (var i = 0; i < sortColumnIndices.length; i++) {\n seletedColumnIndices.push(tIndex + i);\n cr[self.dragMode].splice(tIndex + i, 0, sortColumnIndices[i]);\n }\n self.orders.columns = cr[self.dragMode];\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = seletedColumnIndices;\n });\n } else {\n var selectedRows = [];\n self.selections.forEach(function (row, rowIndex) {\n if (row) {\n selectedRows.push(row);\n odata.push(self.viewData[rowIndex]);\n }\n });\n self.viewData.splice(oIndex, odata.length);\n self.selections = [];\n if (tIndex > oIndex) tIndex = tIndex - (odata.length - 1);\n self.activeCell.rowIndex = tIndex;\n for (var i = 0; i < odata.length; i++) {\n self.viewData.splice(tIndex + i, 0, odata[i]);\n self.selections[tIndex + i] = selectedRows[i];\n }\n }\n self.resize();\n self.setStorageData();\n }\n self.reorderObject = undefined;\n self.reorderTarget = undefined;\n self.draw(true);\n };\n self.dragMove = function (e) {\n if (\n self.dispatchEvent('moving', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n var pos = self.getLayerPos(e);\n self.moveOffset = {\n x: self.currentCell.columnIndex - self.dragStartObject.columnIndex,\n y: self.currentCell.rowIndex - self.dragStartObject.rowIndex,\n };\n if (\n Math.abs(pos.x) > self.attributes.reorderDeadZone ||\n Math.abs(pos.y) > self.attributes.reorderDeadZone\n ) {\n setTimeout(function () {\n self.autoScrollZone(e, pos.x, pos.y, false);\n }, 1);\n }\n };\n self.stopDragMove = function (e) {\n document.body.removeEventListener('mousemove', self.dragMove, false);\n document.body.removeEventListener('mouseup', self.stopDragMove, false);\n var b = self.getSelectionBounds();\n if (\n self.dispatchEvent('endmove', { NativeEvent: e, cell: self.currentCell })\n ) {\n self.movingSelection = undefined;\n self.moveOffset = undefined;\n self.draw(true);\n return;\n }\n if (self.moveOffset) {\n self.moveTo(\n self.movingSelection,\n b.left + self.moveOffset.x,\n b.top + self.moveOffset.y,\n );\n self.moveSelection(self.moveOffset.x, self.moveOffset.y);\n }\n self.movingSelection = undefined;\n self.moveOffset = undefined;\n self.draw(true);\n };\n self.freezeMove = function (e) {\n if (\n self.dispatchEvent('freezemoving', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n var pos = self.getLayerPos(e),\n bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n columnHeaderCellBorder = self.style.columnHeaderCellBorderWidth * bm,\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth();\n\n self.ignoreNextClick = true;\n self.freezeMarkerPosition = pos;\n if (\n self.currentCell &&\n self.currentCell.rowIndex !== undefined &&\n self.dragMode === 'frozen-row-marker'\n ) {\n self.scrollBox.scrollTop = 0;\n self.frozenRow = self.currentCell.rowIndex + 1;\n self.scrollBox.bar.v.y =\n columnHeaderCellHeight +\n columnHeaderCellBorder +\n self.scrollCache.y[self.frozenRow];\n self.scrollBox.box.v.y =\n columnHeaderCellHeight +\n columnHeaderCellBorder +\n self.scrollCache.y[self.frozenRow];\n var dataHeight = self.scrollCache.y[self.scrollCache.y.length - 1];\n self.scrollBox.heightBoxRatio =\n (self.scrollBox.height -\n columnHeaderCellHeight -\n self.scrollCache.y[self.frozenRow]) /\n dataHeight;\n self.scrollBox.scrollBoxHeight =\n self.scrollBox.height * self.scrollBox.heightBoxRatio -\n self.style.scrollBarWidth;\n self.scrollBox.scrollBoxHeight = Math.max(\n self.scrollBox.scrollBoxHeight,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.box.v.height = self.scrollBox.scrollBoxHeight;\n }\n if (\n self.currentCell &&\n self.currentCell.columnIndex !== undefined &&\n self.dragMode === 'frozen-column-marker'\n ) {\n self.scrollBox.scrollLeft = 0;\n self.frozenColumn = self.currentCell.columnIndex + 1;\n self.scrollBox.bar.h.x =\n rowHeaderCellWidth + self.scrollCache.x[self.frozenColumn - 1];\n self.scrollBox.box.h.x =\n rowHeaderCellWidth + self.scrollCache.x[self.frozenColumn - 1];\n var dataWidth = self.scrollCache.x[self.scrollCache.x.length - 1];\n self.scrollBox.widthBoxRatio =\n (self.scrollBox.width - self.scrollCache.x[self.frozenColumn - 1]) /\n dataWidth;\n self.scrollBox.scrollBoxWidth =\n self.scrollBox.width * self.scrollBox.widthBoxRatio -\n self.style.scrollBarWidth;\n self.scrollBox.scrollBoxWidth = Math.max(\n self.scrollBox.scrollBoxWidth,\n self.style.scrollBarBoxMinSize,\n );\n self.scrollBox.box.h.width = self.scrollBox.scrollBoxWidth;\n }\n if (\n Math.abs(pos.x) > self.attributes.reorderDeadZone ||\n Math.abs(pos.y) > self.attributes.reorderDeadZone\n ) {\n setTimeout(function () {\n self.autoScrollZone(e, pos.x, pos.y, false);\n }, 1);\n }\n };\n self.stopFreezeMove = function (e) {\n document.body.removeEventListener('mousemove', self.freezeMove, false);\n document.body.removeEventListener('mouseup', self.stopFreezeMove, false);\n self.freezeMarkerPosition = undefined;\n if (\n self.dispatchEvent('endfreezemove', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n self.frozenRow = self.startFreezeMove.x;\n self.frozenColumn = self.startFreezeMove.y;\n self.draw(true);\n return;\n }\n self.draw(true);\n };\n self.mousedown = function (e, overridePos) {\n self.lastMouseDownTarget = e.target;\n if (\n self.dispatchEvent('mousedown', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n if (e.button === 2 || self.input) {\n return;\n }\n var ctrl = e.ctrlKey || e.metaKey,\n move = /-move/.test(self.dragMode),\n freeze = /frozen-row-marker|frozen-column-marker/.test(self.dragMode),\n resize = /-resize/.test(self.dragMode);\n self.dragStart = overridePos || self.getLayerPos(e);\n self.scrollStart = {\n left: self.scrollBox.scrollLeft,\n top: self.scrollBox.scrollTop,\n };\n self.dragStartObject = self.getCellAt(self.dragStart.x, self.dragStart.y);\n self.dragAddToSelection = !self.dragStartObject.selected;\n if (\n !ctrl &&\n !e.shiftKey &&\n !/(vertical|horizontal)-scroll-(bar|box)/.test(\n self.dragStartObject.context,\n ) &&\n self.currentCell &&\n !self.currentCell.isColumnHeader &&\n !move &&\n !freeze &&\n !resize\n ) {\n if (\n !(self.dragMode == 'row-reorder' && self.isMultiRowsSelected) &&\n !(self.currentCell.hovered && self.hovers.onFilterButton)\n ) {\n self.selections = [];\n }\n }\n if (self.dragStartObject.isGrid) {\n return;\n }\n if (self.scrollModes.indexOf(self.dragStartObject.context) !== -1) {\n self.scrollMode = self.dragStartObject.context;\n self.scrollStartMode = self.dragStartObject.context;\n self.scrollGrid(e);\n if (\n self.attributes.scrollPointerLock &&\n ['horizontal-scroll-box', 'vertical-scroll-box'].indexOf(\n self.scrollStartMode,\n ) !== -1\n ) {\n self.pointerLockPosition = {\n x: self.dragStart.x,\n y: self.dragStart.y,\n };\n self.canvas.requestPointerLock();\n }\n document.addEventListener('mousemove', self.scrollGrid, false);\n document.addEventListener('mouseup', self.stopScrollGrid, false);\n self.ignoreNextClick = true;\n return;\n }\n if (self.dragMode === 'cell') {\n self.selecting = true;\n if (\n (self.attributes.selectionMode === 'row' ||\n self.dragStartObject.columnIndex === -1) &&\n self.dragStartObject.rowIndex > -1\n ) {\n self.selectRow(self.dragStartObject.rowIndex, ctrl, null);\n } else if (self.attributes.selectionMode !== 'row') {\n self.mousemove(e);\n }\n return;\n }\n if (move) {\n self.draggingItem = self.dragItem;\n self.movingSelection = self.selections.concat([]);\n self.dragging = self.dragStartObject;\n if (\n self.dispatchEvent('beginmove', {\n NativeEvent: e,\n cell: self.currentCell,\n })\n ) {\n return;\n }\n document.body.addEventListener('mousemove', self.dragMove, false);\n document.body.addEventListener('mouseup', self.stopDragMove, false);\n return self.mousemove(e);\n }\n if (freeze) {\n self.draggingItem = self.dragItem;\n self.startFreezeMove = {\n x: self.frozenRow,\n y: self.frozenColumn,\n };\n if (self.dispatchEvent('beginfreezemove', { NativeEvent: e })) {\n return;\n }\n document.body.addEventListener('mousemove', self.freezeMove, false);\n document.body.addEventListener('mouseup', self.stopFreezeMove, false);\n return self.mousemove(e);\n }\n if (resize) {\n self.draggingItem = self.dragItem;\n if (self.draggingItem.rowOpen) {\n self.resizingStartingHeight =\n self.sizes.trees[self.draggingItem.rowIndex];\n } else {\n self.resizingStartingHeight =\n self.sizes.rows[self.draggingItem.rowIndex] || self.style.cellHeight;\n }\n self.resizingStartingWidth =\n self.sizes.columns[\n self.draggingItem.header.style === 'rowHeaderCell'\n ? 'cornerCell'\n : self.draggingItem.sortColumnIndex\n ] || self.draggingItem.width;\n document.body.addEventListener('mousemove', self.dragResizeColumn, false);\n document.body.addEventListener('mouseup', self.stopDragResize, false);\n return;\n }\n if (['row-reorder', 'column-reorder'].indexOf(self.dragMode) !== -1) {\n self.draggingItem = self.dragStartObject;\n if (\n self.dragMode === 'column-reorder' &&\n !self.isMultiColumnsSelected(self.currentCell.header.index)\n ) {\n self.selectColumn(self.currentCell.header.index, ctrl, e.shiftKey);\n } else if (self.dragMode === 'row-reorder' && !self.isMultiRowsSelected) {\n self.selectRow(self.dragStartObject.rowIndex, ctrl, null);\n }\n document.body.addEventListener('mousemove', self.dragReorder, false);\n document.body.addEventListener('mouseup', self.stopDragReorder, false);\n return;\n }\n };\n self.mouseup = function (e) {\n clearTimeout(self.scrollTimer);\n self.cellBoundaryCrossed = true;\n self.rowBoundaryCrossed = true;\n self.columnBoundaryCrossed = true;\n self.selecting = undefined;\n self.draggingItem = undefined;\n self.dragStartObject = undefined;\n if (\n self.dispatchEvent('mouseup', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus && e.target !== self.canvas) {\n return;\n }\n if (self.currentCell && self.currentCell.grid !== undefined) {\n return;\n }\n if (self.contextMenu || self.input) {\n return;\n }\n if (self.dragStart && self.isInGrid(self.dragStart)) {\n self.controlInput.focus();\n }\n e.preventDefault();\n };\n // gets the horizontal adjacent cells as well as first/last based on column visibility\n self.getAdjacentCells = function () {\n var x,\n i,\n s = self.getSchema(),\n o = {};\n for (x = 0; x < s.length; x += 1) {\n i = self.orders.columns[x];\n if (!s[i].hidden) {\n if (o.first === undefined) {\n o.first = x;\n o.left = x;\n }\n o.last = x;\n if (x > self.activeCell.columnIndex && o.right === undefined) {\n o.right = x;\n }\n if (x < self.activeCell.columnIndex) {\n o.left = x;\n }\n }\n }\n if (o.right === undefined) {\n o.right = o.last;\n }\n return o;\n };\n self.keydown = function (e) {\n var i,\n ev,\n adjacentCells = self.getAdjacentCells(),\n x = Math.max(self.activeCell.columnIndex, 0),\n y = Math.max(self.activeCell.rowIndex, 0),\n ctrl = e.ctrlKey || e.metaKey,\n last = self.viewData.length - 1,\n s = self.getSchema(),\n cols = s.length - 1;\n\n var defaultPrevented = self.dispatchEvent('keydown', {\n NativeEvent: e,\n cell: self.currentCell,\n });\n\n if (defaultPrevented) {\n return;\n }\n\n if (!self.attributes.keepFocusOnMouseOut && !self.hasFocus) {\n return;\n }\n\n // If a user starts typing content, switch to \"Enter\" mode\n if (isPrintableKeyEvent(e) && !ctrl) {\n return self.beginEditAt(x, y, e, true);\n }\n\n if (self.attributes.showNewRow) {\n last += 1;\n }\n\n if (e.key === 'Tab') {\n e.preventDefault();\n }\n\n if (e.key === 'Escape') {\n self.selectNone();\n } else if (ctrl && e.key === 'a') {\n self.selectAll();\n } else if (['Backspace', 'Delete'].includes(e.key)) {\n self.deleteSelectedData();\n } else if (e.key === 'ArrowDown') {\n y += 1;\n } else if (e.key === 'ArrowUp') {\n y -= 1;\n } else if (\n (e.key === 'ArrowLeft' && !ctrl) ||\n (e.shiftKey && e.key === 'Tab')\n ) {\n x = adjacentCells.left;\n } else if (\n (e.key === 'ArrowRight' && !ctrl) ||\n (!e.shiftKey && e.key === 'Tab')\n ) {\n x = adjacentCells.right;\n } else if (e.key === 'PageUp') {\n y -= self.page;\n e.preventDefault();\n } else if (e.key === 'PageDown') {\n y += self.page;\n e.preventDefault();\n } else if (e.key === 'Home' || (ctrl && e.key === 'ArrowUp')) {\n y = 0;\n } else if (e.key === 'End' || (ctrl && e.key === 'ArrowDown')) {\n y = self.viewData.length - 1;\n } else if (ctrl && e.key === 'ArrowRight') {\n x = adjacentCells.last;\n } else if (ctrl && e.key === 'ArrowLeft') {\n x = adjacentCells.first;\n }\n\n if (e.key === 'Enter') {\n e.preventDefault();\n return self.beginEditAt(x, y, e);\n }\n if (x < 0 || Number.isNaN(x)) {\n x = adjacentCells.first;\n }\n if (y > last) {\n y = last;\n }\n if (y < 0 || Number.isNaN(y)) {\n y = 0;\n }\n if (x > cols) {\n x = adjacentCells.last;\n }\n\n // TODO - most likely some column order related bugs in key based selection\n // Arrows\n var isArrowKey = [\n 'ArrowLeft',\n 'ArrowUp',\n 'ArrowRight',\n 'ArrowDown',\n ].includes(e.key);\n\n // Shrinking and expanding selection using shift and arrow keys\n if (e.shiftKey && isArrowKey) {\n const firstSelectedRowIndex = self.selections.findIndex((el) => !!el);\n const firstSelectedRow = self.selections[firstSelectedRowIndex];\n const firstSelectedColumnIndex = firstSelectedRow[0];\n const lastSelectedColumn = firstSelectedRow[firstSelectedRow.length - 1];\n const yAtTop = y === 0;\n const yAtBottom = y === last;\n const xAtLeft = x === 0;\n const xAtRight = x === cols;\n\n if (e.key === 'ArrowUp') {\n if (y + 1 > firstSelectedRowIndex && !yAtTop) {\n self.selections.pop();\n } else if (y < firstSelectedRowIndex) {\n self.selections[y] = self.selections[y] || [];\n self.selections[y].push(x);\n } else if (yAtTop && self.activeCell.rowIndex !== 0) {\n self.selections.pop();\n }\n }\n\n if (e.key === 'ArrowDown') {\n if (y > firstSelectedRowIndex && y === self.selections.length) {\n self.selections[y] = self.selections[y] || [];\n self.selections[y].push(x);\n } else if (y >= firstSelectedRowIndex && !yAtBottom) {\n delete self.selections[y - 1];\n } else if (yAtBottom && self.activeCell.rowIndex !== last) {\n delete self.selections[y - 1];\n }\n }\n\n for (const selection of self.selections) {\n if (e.key === 'ArrowRight' && selection) {\n if (x > lastSelectedColumn) {\n selection.push(x);\n } else if (x <= lastSelectedColumn && !xAtRight) {\n selection.shift();\n } else if (xAtRight && self.activeCell.columnIndex !== cols) {\n selection.shift();\n }\n }\n\n if (e.key === 'ArrowLeft' && selection) {\n if (x < firstSelectedColumnIndex) {\n selection.unshift(x);\n } else if (x >= firstSelectedColumnIndex && !xAtLeft) {\n selection.pop();\n } else if (xAtLeft && self.activeCell.columnIndex !== 0) {\n selection.pop();\n }\n }\n }\n\n self.selectionBounds = self.getSelectionBounds();\n self.selectArea(undefined, ctrl);\n\n self.draw(true);\n }\n\n if (x !== self.activeCell.columnIndex || y !== self.activeCell.rowIndex) {\n self.scrollIntoView(\n x !== self.activeCell.columnIndex ? x : undefined,\n y !== self.activeCell.rowIndex && !Number.isNaN(y) ? y : undefined,\n );\n\n self.setActiveCell(x, y);\n if (!e.shiftKey && self.attributes.selectionFollowsActiveCell) {\n if (!ctrl) {\n self.selections = [];\n }\n self.selections[y] = self.selections[y] || [];\n self.selections[y].push(x);\n ev = {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\n };\n Object.defineProperty(ev, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n self.dispatchEvent('selectionchanged', ev);\n }\n self.draw(true);\n }\n };\n self.keyup = function (e) {\n if (\n self.dispatchEvent('keyup', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n };\n self.keypress = function (e) {\n if (!self.hasFocus) {\n return;\n }\n if (\n self.dispatchEvent('keypress', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n };\n self.dblclick = function (e) {\n if (\n self.dispatchEvent('dblclick', { NativeEvent: e, cell: self.currentCell })\n ) {\n return;\n }\n if (!self.hasFocus) {\n return;\n }\n if (\n self.currentCell.context === 'ew-resize' &&\n self.currentCell.style === 'columnHeaderCell'\n ) {\n 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 (\n ['cell', 'activeCell'].includes(self.currentCell.style) &&\n !self.hovers.onFilterButton\n ) {\n self.beginEditAt(self.currentCell.columnIndex, self.currentCell.rowIndex);\n }\n };\n self.scrollWheel = function (e) {\n var l,\n t,\n ev = e,\n deltaX = e.deltaX === undefined ? e.NativeEvent.deltaX : e.deltaX,\n deltaY = e.deltaY === undefined ? e.NativeEvent.deltaY : e.deltaY,\n deltaMode =\n e.deltaMode === undefined ? e.NativeEvent.deltaMode : e.deltaMode;\n var e = e.NativeEvent || e;\n if (wheeling) {\n ev.preventDefault(e);\n return;\n }\n if (self.dispatchEvent('wheel', { NativeEvent: e })) {\n return;\n }\n self.touchHaltAnimation = true;\n l = self.scrollBox.scrollLeft;\n t = self.scrollBox.scrollTop;\n if (self.hasFocus) {\n //BUG Issue 42: https://github.com/TonyGermaneri/canvas-datagrid/issues/42\n //https://stackoverflow.com/questions/20110224/what-is-the-height-of-a-line-in-a-wheel-event-deltamode-dom-delta-line\n if (deltaMode === 1) {\n // line mode = 17 pixels per line\n deltaY = deltaY * 17;\n }\n if (\n (self.scrollBox.scrollTop < self.scrollBox.scrollHeight &&\n deltaY > 0) ||\n (self.scrollBox.scrollLeft < self.scrollBox.scrollWidth &&\n deltaX > 0) ||\n (self.scrollBox.scrollTop > 0 && deltaY < 0) ||\n (self.scrollBox.scrollLeft > 0 && deltaX < 0)\n ) {\n ev.preventDefault(e);\n }\n wheeling = setTimeout(function () {\n wheeling = undefined;\n self.scrollBox.scrollTo(deltaX + l, deltaY + t);\n }, 1);\n }\n };\n self.pasteData = function (\n pasteValue,\n mimeType,\n startRowIndex,\n startColIndex,\n ) {\n if (mimeType === 'text/html' && !isSupportedHtml(pasteValue)) {\n console.warn(\n 'Unrecognized HTML format. HTML must be a simple table, e.g.: <table><tr><td>data</td></tr></table>.',\n );\n console.warn(\n 'Data with the mime type text/html not in this format will not be imported as row data.',\n );\n\n return;\n }\n var schema = self.getSchema();\n var rows = parseData(pasteValue, mimeType);\n\n // selected cell. This mimics Excel's paste functionality, and works\n // as a poor-man's fill-down.\n if (rows.length === 1 && rows[0].length === 1) {\n var cellData = rows[0][0].value.map((item) => item.value).join();\n\n self.forEachSelectedCell(function (data, rowIndex, colName) {\n data[rowIndex][colName] = cellData;\n });\n } else {\n var selections = [];\n for (var rowIndex = 0; rowIndex < rows.length; rowIndex++) {\n // Rows may have been moved by user, so get the actual row index\n // (instead of the row index at which the row is rendered):\n var realRowIndex = self.orders.rows[startRowIndex + rowIndex];\n var cells = rows[rowIndex];\n\n var existingRowData = self.viewData[realRowIndex];\n var newRowData = Object.assign({}, existingRowData);\n\n selections[realRowIndex] = [];\n\n for (var colIndex = 0; colIndex < cells.length; colIndex++) {\n var column = schema[startColIndex + colIndex];\n\n if (!column) {\n console.warn('Paste data exceeded grid bounds. Skipping.');\n continue;\n }\n\n var columnName = column.name;\n var cellData = cells[colIndex].value\n .map((item) => item.value)\n .join('');\n\n if (cellData === undefined || cellData === null) {\n newRowData[columnName] = existingRowData[columnName];\n continue;\n }\n\n selections[realRowIndex].push(startColIndex + colIndex);\n\n newRowData[columnName] = cellData;\n }\n\n self.originalData[self.boundRowIndexMap.get(realRowIndex)] = newRowData;\n // Update view date here to avoid a full refresh of `viewData`.\n // To stay in line with Excel and Google Sheet behaviour,\n // don't perform a full refresh (and filter/sort results)\n // as this would make any pasted values disappear and/or suddenly change position.\n self.viewData[realRowIndex] = newRowData;\n }\n self.selections = selections;\n }\n\n // selections is a sparse array, so we condense:\n var affectedCells = [];\n\n self.selections.forEach(function (row, rowIndex) {\n if (rowIndex === undefined) return;\n\n row.forEach(function (columnIndex) {\n affectedCells.push([\n rowIndex,\n columnIndex,\n self.getBoundRowIndexFromViewRowIndex(rowIndex),\n self.getBoundColumnIndexFromViewColumnIndex(columnIndex),\n ]);\n });\n });\n\n self.dispatchEvent('afterpaste', {\n cells: affectedCells,\n });\n\n return rows.length;\n };\n self.getNextVisibleColumnIndex = function (visibleColumnIndex) {\n var x,\n s = self.getVisibleSchema();\n for (x = 0; x < s.length; x += 1) {\n if (s[x].columnIndex === visibleColumnIndex) {\n return s[x + 1].columnIndex;\n }\n }\n return -1;\n };\n self.getVisibleColumnIndexOf = function (columnIndex) {\n var x,\n s = self.getVisibleSchema();\n for (x = 0; x < s.length; x += 1) {\n if (s[x].columnIndex === columnIndex) {\n return x;\n }\n }\n return -1;\n };\n self.paste = function (event) {\n if (!self.attributes.editable) {\n return;\n }\n\n var defaultPrevented = self.dispatchEvent('beforepaste', {\n NativeEvent: event,\n });\n\n if (defaultPrevented) {\n return;\n }\n\n var clipboardItems = new Map(\n Array.from(event.clipboardData.items).map((item) => [item.type, item]),\n );\n\n // Supported MIME types, in order of preference:\n var supportedMimeTypes = ['text/html', 'text/csv', 'text/plain'];\n\n // The clipboard will often contain the same data in multiple formats,\n // which can be used depending on the context in which it's pasted. Here\n // we'll prefere more structured (HTML/CSV) over less structured, when\n // available, so we try to find those first:\n var pasteableItems = supportedMimeTypes\n .map((mimeType) => clipboardItems.get(mimeType))\n .filter((item) => !!item); // filter out not-found MIME types (= undefined)\n\n if (pasteableItems.length === 0) {\n console.warn(\n 'Cannot find supported clipboard data type. Supported types are:',\n supportedMimeTypes.join(', '),\n );\n return;\n }\n\n var itemToPaste = pasteableItems[0];\n\n let startCell = [];\n for (\n let rowIndex = 0, len = self.selections.length;\n rowIndex < len;\n rowIndex++\n ) {\n const row = self.selections[rowIndex];\n if (row) {\n if (row[0] === undefined) return;\n startCell = [rowIndex, row[0] < 0 ? row[1] : row[0]];\n break;\n }\n }\n\n // itemToPaste is cleared once accessed (getData or getAsString),\n // so we need to store the type here, before reading its value:\n var pasteType = itemToPaste.type;\n\n itemToPaste.getAsString(function (pasteValue) {\n self.pasteData(pasteValue, pasteType, startCell[0], startCell[1]);\n\n self.draw();\n });\n };\n self.cut = function (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 requestAnimationFrame(() => self.draw());\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 if (typeof v === 'number') return v;\n return v.replace(/</g, '<').replace(/>/g, '>');\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(String(column.name)) < 0) {\n if (firstRowKeys.indexOf(String(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.filterable = {\n rows: [],\n columns: [],\n };\n self.selectedFilterButton = {\n columnIndex: -1,\n rowIndex: -1,\n };\n self.hovers = {};\n self.attributes = {};\n self.style = {};\n self.formatters = {};\n self.sorters = {};\n self.parsers = {};\n self.schemaHashes = {};\n self.events = {};\n self.changes = [];\n self.scrollIndexTop = 0;\n self.scrollPixelTop = 0;\n self.scrollIndexLeft = 0;\n self.scrollPixelLeft = 0;\n self.childGrids = {};\n self.openChildren = {};\n self.scrollModes = [\n 'vertical-scroll-box',\n 'vertical-scroll-top',\n 'vertical-scroll-bottom',\n 'horizontal-scroll-box',\n 'horizontal-scroll-right',\n 'horizontal-scroll-left',\n ];\n self.componentL1Events = {};\n self.eventNames = [\n 'afterdraw',\n 'afterrendercell',\n 'afterrenderfilterbutton',\n 'attributechanged',\n 'beforebeginedit',\n 'beforecreatecellgrid',\n 'beforedraw',\n 'beforeendedit',\n 'beforerendercell',\n 'beforerendercellgrid',\n 'beforerenderfilterbutton',\n 'beginedit',\n 'cellmouseout',\n 'cellmouseover',\n 'click',\n 'collapsetree',\n 'contextmenu',\n 'copy',\n 'datachanged',\n 'dblclick',\n 'endedit',\n 'expandtree',\n 'formatcellvalue',\n 'keydown',\n 'keypress',\n 'keyup',\n 'mousedown',\n 'mousemove',\n 'mouseup',\n 'newrow',\n 'ordercolumn',\n 'rendercell',\n 'rendercellgrid',\n 'renderorderbyarrow',\n 'rendertext',\n 'rendertreearrow',\n 'reorder',\n 'reordering',\n 'resize',\n 'resizecolumn',\n 'resizerow',\n 'schemachanged',\n 'scroll',\n 'selectionchanged',\n 'stylechanged',\n 'touchcancel',\n 'touchend',\n 'touchmove',\n 'touchstart',\n 'wheel',\n ];\n self.mouse = { x: 0, y: 0 };\n self.getSelectedData = function (expandToRow) {\n const selectedData = [];\n const schema = self.getSchema();\n const viewDataLength = self.viewData.length;\n\n if (viewDataLength === 0) {\n return [];\n }\n\n // self.selections is a sparse array, so `viewRowIndex` here\n // will equal the row index as where it's rendered,\n // not as where it is in the original data array.\n self.selections.forEach(function (row, viewRowIndex) {\n if (!row) {\n return;\n }\n\n if (viewRowIndex === viewDataLength) {\n return;\n }\n\n if (row.length === 0) {\n selectedData[viewRowIndex] = null;\n return;\n }\n\n selectedData[viewRowIndex] = {};\n\n row.forEach(function (col) {\n if (col === -1 || !schema[col]) {\n return;\n }\n\n const orderedIndex = self.orders.columns[col];\n\n if (!expandToRow && schema[orderedIndex].hidden) {\n return;\n }\n\n if (self.viewData[viewRowIndex]) {\n selectedData[viewRowIndex][schema[orderedIndex].name] =\n self.viewData[viewRowIndex][schema[orderedIndex].name];\n }\n });\n });\n\n return selectedData;\n };\n self.getSelectedCells = function (expandToRow) {\n const selectedCells = [];\n const schema = self.getSchema();\n const viewDataLength = self.viewData.length;\n\n if (viewDataLength === 0) {\n return [];\n }\n\n for (const [viewRowIndex, row] of self.selections.entries()) {\n if (!row || row.length === 0) continue;\n\n for (const [, viewColumnIndex] of row.entries()) {\n if (viewColumnIndex === -1 || !schema[viewColumnIndex]) {\n continue;\n }\n\n const boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(\n viewColumnIndex,\n );\n\n if (!expandToRow && schema[boundColumnIndex].hidden) {\n continue;\n }\n\n if (self.viewData[viewRowIndex]) {\n const header = schema[boundColumnIndex];\n const value = self.viewData[viewRowIndex][header.name];\n const boundRowIndex = self.getBoundRowIndexFromViewRowIndex(\n viewRowIndex,\n );\n\n const cell = {\n value,\n header,\n boundRowIndex,\n boundColumnIndex,\n viewRowIndex,\n viewColumnIndex,\n };\n\n selectedCells.push(cell);\n }\n }\n }\n\n return selectedCells;\n };\n self.clearSelectedCells = function () {\n const schema = self.getSchema();\n const affectedCells = [];\n\n for (const [rowIndex, row] of self.selections.entries()) {\n // If no cells are selected for a particular rowIndex the selections array will contain an empty element for that rowIndex.\n if (!row) continue;\n\n const boundRowIndex = self.getBoundRowIndexFromViewRowIndex(rowIndex);\n\n for (let columnIndex of row) {\n // If the whole row is selected the columnIndex for the rowHeader is -1.\n if (columnIndex < 0) continue;\n\n const boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(\n columnIndex,\n );\n const columnName = schema[boundColumnIndex].name;\n\n self.viewData[boundRowIndex][columnName] = null;\n\n affectedCells.push([\n rowIndex,\n columnIndex,\n boundRowIndex,\n boundColumnIndex,\n ]);\n }\n }\n\n return affectedCells;\n };\n self.getBoundRowIndexFromViewRowIndex = function (viewRowIndex) {\n if (self.boundRowIndexMap && self.boundRowIndexMap.has(viewRowIndex)) {\n return self.boundRowIndexMap.get(viewRowIndex);\n }\n\n return undefined;\n };\n self.getBoundColumnIndexFromViewColumnIndex = function (viewColumnIndex) {\n return self.orders.columns[viewColumnIndex];\n };\n self.getColumnHeaderCellHeight = function () {\n if (!self.attributes.showColumnHeaders) {\n return 0;\n }\n return (\n (self.sizes.rows[-1] || self.style.columnHeaderCellHeight) * self.scale\n );\n };\n self.getRowHeaderCellWidth = function () {\n if (!self.attributes.showRowHeaders) {\n return 0;\n }\n return (\n (self.sizes.columns[-1] || self.style.rowHeaderCellWidth) * self.scale\n );\n };\n self.setStorageData = function () {\n if (!self.attributes.saveAppearance || !self.attributes.name) {\n return;\n }\n var visibility = {};\n self.getSchema().forEach(function (column) {\n visibility[column.name] = !column.hidden;\n });\n localStorage.setItem(\n self.storageName + '-' + self.attributes.name,\n JSON.stringify({\n sizes: {\n rows: self.sizes.rows,\n columns: self.sizes.columns,\n },\n orders: {\n rows: self.orders.rows,\n columns: self.orders.columns,\n },\n orderBy: self.orderBy,\n orderDirection: self.orderDirection,\n visibility: visibility,\n }),\n );\n };\n self.getSchema = function () {\n return self.schema || self.tempSchema || [];\n };\n function fillArray(low, high) {\n var i = [],\n x;\n for (x = low; x <= high; x += 1) {\n i[x] = x;\n }\n return i;\n }\n self.createColumnOrders = function () {\n var s = self.getSchema();\n self.orders.columns = fillArray(0, s.length - 1);\n };\n self.createRowOrders = function () {\n self.orders.rows = fillArray(0, self.originalData.length - 1);\n };\n self.getVisibleSchema = function () {\n return self.getSchema().filter(function (col) {\n return !col.hidden;\n });\n };\n self.applyDefaultValue = function (row, header, rowIndex) {\n var d = header.defaultValue || '';\n if (typeof d === 'function') {\n d = d.apply(self.intf, [header, rowIndex]);\n }\n row[header.name] = d;\n };\n self.createNewRowData = function () {\n self.newRow = {};\n\n // The third argument of applyDefaultValue is the row index\n // of the row for which to apply the default value. In this\n // case, we're creating a new row but not yet appending it\n // to self.originalData, so no row index exists\n const newRowIndex = undefined;\n\n self.getSchema().forEach(function forEachHeader(header) {\n self.applyDefaultValue(self.newRow, header, newRowIndex);\n });\n };\n self.getSchemaNameHash = function (key) {\n var n = 0;\n while (self.schemaHashes[key]) {\n n += 1;\n key = key + n;\n }\n return key;\n };\n self.filter = function (type) {\n var f = self.filters[type];\n if (!f && type !== undefined) {\n console.warn(\n 'Cannot find filter for type %s, falling back to substring match.',\n type,\n );\n f = self.filters.string;\n }\n return f;\n };\n self.hasActiveFilters = function () {\n return self.columnFilters && Object.keys(self.columnFilters).length > 0;\n };\n self.getFilteredAndSortedViewData = function (originalData) {\n // We make a copy of originalData here in order be able to\n // filter and sort rows without modifying the original array.\n // Each row is turned into a (row, rowIndex) tuple\n // so that when we apply filters, we can refer back to the\n // row's original row number in originalData. This becomes\n // useful when emitting cell events.\n let newViewData = originalData.map((row, originalRowIndex) => [\n row,\n originalRowIndex,\n ]);\n\n // Apply filtering\n for (const [headerName, filterText] of Object.entries(self.columnFilters)) {\n const header = self.getHeaderByName(headerName);\n\n if (!header) {\n continue;\n }\n\n const currentFilterFunction =\n header.filter || self.filter(header.type || 'string');\n\n newViewData = newViewData.filter(function ([row, originalRowIndex]) {\n if (\n self.attributes.allowFreezingRows &&\n !self.attributes.filterFrozenRows &&\n originalRowIndex < self.frozenRow\n )\n return true;\n\n return currentFilterFunction(row[headerName], filterText);\n });\n }\n\n // Apply sorting\n for (const column of self.orderings.columns) {\n const sortFn = column.sortFunction(column.orderBy, column.orderDirection);\n\n newViewData.sort(([rowA], [rowB, rowIndexB]) => {\n if (\n self.attributes.allowFreezingRows &&\n !self.attributes.sortFrozenRows &&\n rowIndexB < self.frozenRow\n )\n return 0;\n return sortFn(rowA, rowB);\n });\n }\n\n return {\n viewData: newViewData.map(([row]) => row),\n boundRowIndexMap: new Map(\n newViewData.map(([_row, originalRowIndex], viewRowIndex) => [\n viewRowIndex,\n originalRowIndex,\n ]),\n ),\n };\n };\n self.refresh = function () {\n const { viewData, boundRowIndexMap } = self.getFilteredAndSortedViewData(\n self.originalData,\n );\n\n self.viewData = viewData;\n self.boundRowIndexMap = boundRowIndexMap;\n\n self.resize();\n self.draw(true);\n };\n self.getBestGuessDataType = function (columnName, data) {\n var t,\n x,\n l = data.length;\n for (x = 0; x < l; x += 1) {\n if (\n data[x] !== undefined &&\n data[x] !== null &&\n [null, undefined].indexOf(data[x][columnName]) !== -1\n ) {\n t = typeof data[x];\n return t === 'object' ? 'string' : t;\n }\n }\n return 'string';\n };\n self.drawChildGrids = function () {\n Object.keys(self.childGrids).forEach(function (gridKey) {\n self.childGrids[gridKey].draw();\n });\n };\n self.resizeChildGrids = function () {\n Object.keys(self.childGrids).forEach(function (gridKey) {\n self.childGrids[gridKey].resize();\n });\n };\n self.autoScrollZone = function (e, x, y, ctrl) {\n var setTimer,\n rowHeaderCellWidth = self.getRowHeaderCellWidth(),\n columnHeaderCellHeight = self.getColumnHeaderCellHeight();\n if (x !== -1) {\n if (x > self.width - self.attributes.selectionScrollZone) {\n self.scrollBox.scrollLeft += self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n if (x - self.attributes.selectionScrollZone - rowHeaderCellWidth < 0) {\n self.scrollBox.scrollLeft -= self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n }\n if (y !== -1) {\n if (y > self.height - self.attributes.selectionScrollZone) {\n self.scrollBox.scrollTop += self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n if (\n y - self.attributes.selectionScrollZone - columnHeaderCellHeight <\n 0\n ) {\n self.scrollBox.scrollTop -= self.attributes.selectionScrollIncrement;\n setTimer = true;\n }\n }\n if (\n setTimer &&\n !ctrl &&\n self.currentCell &&\n self.currentCell.columnIndex !== -1\n ) {\n self.scrollTimer = setTimeout(\n self.mousemove,\n self.attributes.scrollRepeatRate,\n e,\n );\n }\n };\n self.validateColumn = function (c, s) {\n if (!c.name) {\n throw new Error('A column must contain at least a name.');\n }\n if (\n s.filter(function (i) {\n return i.name === c.name;\n }).length > 0\n ) {\n throw new Error(\n 'A column with the name ' +\n c.name +\n ' already exists and cannot be added again.',\n );\n }\n return true;\n };\n self.setDefaults = function (obj1, obj2, key, def) {\n obj1[key] = obj2[key] === undefined ? def : obj2[key];\n };\n self.setAttributes = function () {\n self.defaults.attributes.forEach(function eachAttribute(i) {\n self.setDefaults(self.attributes, self.args, i[0], i[1]);\n });\n };\n self.setStyle = function () {\n self.defaults.styles.forEach(function eachStyle(i) {\n self.setDefaults(self.style, self.args.style || {}, i[0], i[1]);\n });\n };\n self.autosize = function (colName) {\n self.getVisibleSchema().forEach(function (col, colIndex) {\n if (col.name === colName || colName === undefined) {\n self.sizes.columns[colIndex] = Math.max(\n self.findColumnMaxTextLength(col.name),\n self.style.minColumnWidth,\n );\n }\n });\n self.sizes.columns[-1] = self.findColumnMaxTextLength('cornerCell');\n };\n self.dispose = function () {\n if (!self.isChildGrid && self.canvas && self.canvas.parentNode) {\n self.canvas.parentNode.removeChild(self.canvas);\n }\n if (!self.isChildGrid) {\n document.body.removeChild(self.controlInput);\n }\n self.eventParent.removeEventListener('mouseup', self.mouseup, false);\n self.eventParent.removeEventListener('mousedown', self.mousedown, false);\n self.eventParent.removeEventListener('dblclick', self.dblclick, false);\n self.eventParent.removeEventListener('click', self.click, false);\n self.eventParent.removeEventListener('mousemove', self.mousemove);\n self.eventParent.removeEventListener('wheel', self.scrollWheel, false);\n self.canvas.removeEventListener('contextmenu', self.contextmenu, false);\n self.canvas.removeEventListener('copy', self.copy);\n self.controlInput.removeEventListener('copy', self.copy);\n self.controlInput.removeEventListener('cut', self.cut);\n self.controlInput.removeEventListener('paste', self.paste);\n self.controlInput.removeEventListener('keypress', self.keypress, false);\n self.controlInput.removeEventListener('keyup', self.keyup, false);\n self.controlInput.removeEventListener('keydown', self.keydown, false);\n document.body.removeEventListener('mousemove', self.mousemove);\n window.removeEventListener('resize', self.resize);\n if (self.observer && self.observer.disconnect) {\n self.observer.disconnect();\n }\n };\n self.tryLoadStoredSettings = function () {\n var s;\n self.reloadStoredValues();\n if (\n self.storedSettings &&\n typeof self.storedSettings.orders === 'object' &&\n self.storedSettings.orders !== null\n ) {\n if (\n self.storedSettings.orders.rows.length >= (self.viewData || []).length\n ) {\n self.orders.rows = self.storedSettings.orders.rows;\n }\n s = self.getSchema();\n if (self.storedSettings.orders.columns.length === s.length) {\n self.orders.columns = self.storedSettings.orders.columns;\n }\n self.orderBy =\n self.storedSettings.orderBy === undefined\n ? s[0].name\n : self.storedSettings.orderBy;\n self.orderDirection =\n self.storedSettings.orderDirection === undefined\n ? 'asc'\n : self.storedSettings.orderDirection;\n if (\n self.storedSettings.orderBy !== undefined &&\n self.getHeaderByName(self.orderBy) &&\n self.orderDirection\n ) {\n self.order(self.orderBy, self.orderDirection);\n }\n }\n };\n self.getDomRoot = function () {\n return self.shadowRoot ? self.shadowRoot.host : self.parentNode;\n };\n self.getFontName = function (fontStyle) {\n return fontStyle.replace(/\\d+\\.?\\d*px/, '');\n };\n self.getFontHeight = function (fontStyle) {\n return parseFloat(fontStyle, 10);\n };\n self.parseStyleValue = function (key) {\n if (/Font/.test(key)) {\n self.style[key + 'Height'] = self.getFontHeight(self.style[key]);\n self.style[key + 'Name'] = self.getFontName(self.style[key]);\n return;\n }\n // when inheriting styles from already instantiated grids, don't parse already parsed values.\n if (\n key === 'moveOverlayBorderSegments' &&\n typeof self.style[key] === 'string'\n ) {\n self.style[key] = self.style[key].split(',').map(function (i) {\n return parseInt(i, 10);\n });\n }\n };\n self.initProp = function (propName) {\n if (!self.args[propName]) {\n return;\n }\n Object.keys(self.args[propName]).forEach(function (key) {\n self[propName][key] = self.args[propName][key];\n });\n };\n self.getStyleProperty = function (key) {\n if (self.styleKeys.indexOf(key) === -1) {\n return self.parentNodeStyle[key];\n }\n return self.style[key];\n };\n self.setStyleProperty = function (key, value, supressDrawAndEvent) {\n var isDim =\n [\n 'height',\n 'width',\n 'minHeight',\n 'minWidth',\n 'maxHeight',\n 'maxWidth',\n ].indexOf(key) !== -1;\n if (self.styleKeys.indexOf(key) === -1) {\n self.parentNodeStyle[key] = value;\n } else {\n if (/-/.test(key)) {\n key = self.dehyphenateProperty(key);\n }\n self.style[key] = value;\n self.parseStyleValue(key);\n }\n if (isDim) {\n self.resize();\n }\n if (!supressDrawAndEvent) {\n self.draw(true);\n self.dispatchEvent('stylechanged', { name: 'style', value: value });\n }\n };\n self.reloadStoredValues = function () {\n if (self.attributes.name && self.attributes.saveAppearance) {\n try {\n self.storedSettings = localStorage.getItem(\n self.storageName + '-' + self.attributes.name,\n );\n } catch (e) {\n console.warn('Error loading stored values. ' + e.message);\n self.storedSettings = undefined;\n }\n if (self.storedSettings) {\n try {\n self.storedSettings = JSON.parse(self.storedSettings);\n } catch (e) {\n console.warn('could not read settings from localStore', e);\n self.storedSettings = undefined;\n }\n }\n if (self.storedSettings) {\n if (\n typeof self.storedSettings.sizes === 'object' &&\n self.storedSettings.sizes !== null\n ) {\n self.sizes.rows = self.storedSettings.sizes.rows;\n self.sizes.columns = self.storedSettings.sizes.columns;\n ['trees', 'columns', 'rows'].forEach(function (i) {\n if (!self.sizes[i]) {\n self.sizes[i] = {};\n }\n });\n }\n if (typeof self.storedSettings.visibility === 'object') {\n self.getSchema().forEach(function (column) {\n if (\n self.storedSettings.visibility &&\n self.storedSettings.visibility[column.name] !== undefined\n ) {\n column.hidden = !self.storedSettings.visibility[column.name];\n }\n });\n }\n }\n }\n };\n self.init = function () {\n if (self.initialized) {\n return;\n }\n function addStyleKeyIfNoneExists(key) {\n if (self.styleKeys.indexOf(key) === -1) {\n self.styleKeys.push(key);\n }\n }\n var publicStyleKeyIntf = {};\n self.setAttributes();\n self.setStyle();\n self.initScrollBox();\n self.setDom();\n self.nodeType = 'canvas-datagrid';\n self.ie = /Trident/.test(window.navigator.userAgent);\n self.edge = /Edge/.test(window.navigator.userAgent);\n self.webKit = /WebKit/.test(window.navigator.userAgent);\n self.moz = /Gecko/.test(window.navigator.userAgent);\n self.mobile = /Mobile/i.test(window.navigator.userAgent);\n self.blankValues = [undefined, null, ''];\n self.cursorGrab = 'grab';\n self.cursorGrabing = 'grabbing';\n self.cursorGrab = self.webKit ? '-webkit-grab' : self.cursorGrab;\n self.cursorGrabing = self.moz ? '-webkit-grabbing' : self.cursorGrabbing;\n self.pointerLockPosition = { x: 0, y: 0 };\n Object.keys(self.style).forEach(self.parseStyleValue);\n self.intf.moveSelection = self.moveSelection;\n self.intf.deleteSelectedData = self.deleteSelectedData;\n self.intf.moveTo = self.moveTo;\n self.intf.addEventListener = self.addEventListener;\n self.intf.removeEventListener = self.removeEventListener;\n self.intf.dispatchEvent = self.dispatchEvent;\n /**\n * Releases grid resources and removes grid elements.\n * @memberof canvasDatagrid\n * @name dispose\n * @method\n */\n self.intf.dispose = self.dispose;\n /**\n * Appends the grid to another element later. Not implemented.\n * @memberof canvasDatagrid\n * @name appendTo\n * @method\n * @param {number} el The element to append the grid to.\n */\n self.intf.appendTo = self.appendTo;\n self.intf.getVisibleCellByIndex = self.getVisibleCellByIndex;\n self.intf.filters = self.filters;\n self.intf.sorters = self.sorters;\n self.intf.autosize = self.autosize;\n self.intf.beginEditAt = self.beginEditAt;\n self.intf.endEdit = self.endEdit;\n self.intf.setActiveCell = self.setActiveCell;\n self.intf.forEachSelectedCell = self.forEachSelectedCell;\n self.intf.scrollIntoView = self.scrollIntoView;\n self.intf.clearChangeLog = self.clearChangeLog;\n self.intf.gotoCell = self.gotoCell;\n self.intf.gotoRow = self.gotoRow;\n self.intf.addButton = self.addButton;\n self.intf.getHeaderByName = self.getHeaderByName;\n self.intf.findColumnScrollLeft = self.findColumnScrollLeft;\n self.intf.findRowScrollTop = self.findRowScrollTop;\n self.intf.fitColumnToValues = self.fitColumnToValues;\n self.intf.findColumnMaxTextLength = self.findColumnMaxTextLength;\n self.intf.disposeContextMenu = self.disposeContextMenu;\n self.intf.getCellAt = self.getCellAt;\n self.intf.isCellVisible = self.isCellVisible;\n self.intf.isRowVisible = self.isRowVisible;\n self.intf.isColumnVisible = self.isColumnVisible;\n self.intf.order = self.order;\n self.intf.draw = self.draw;\n self.intf.refresh = self.refresh;\n self.intf.isComponent = self.isComponent;\n self.intf.selectArea = self.selectArea;\n self.intf.clipElement = self.clipElement;\n self.intf.getSchemaFromData = self.getSchemaFromData;\n self.intf.setFilter = self.setFilter;\n self.intf.selectRow = self.selectRow;\n self.intf.parentGrid = self.parentGrid;\n self.intf.toggleTree = self.toggleTree;\n self.intf.expandTree = self.expandTree;\n self.intf.collapseTree = self.collapseTree;\n self.intf.canvas = self.canvas;\n self.intf.context = self.ctx;\n self.intf.insertRow = self.insertRow;\n self.intf.deleteRow = self.deleteRow;\n self.intf.addRow = self.addRow;\n self.intf.insertColumn = self.insertColumn;\n self.intf.deleteColumn = self.deleteColumn;\n self.intf.addColumn = self.addColumn;\n self.intf.getClippingRect = self.getClippingRect;\n self.intf.setRowHeight = self.setRowHeight;\n self.intf.setColumnWidth = self.setColumnWidth;\n self.intf.resetColumnWidths = self.resetColumnWidths;\n self.intf.resetRowHeights = self.resetRowHeights;\n self.intf.resize = self.resize;\n self.intf.selectColumn = self.selectColumn;\n self.intf.selectRow = self.selectRow;\n self.intf.selectAll = self.selectAll;\n self.intf.selectNone = self.selectNone;\n self.intf.drawChildGrids = self.drawChildGrids;\n self.intf.assertPxColor = self.assertPxColor;\n self.intf.clearPxColorAssertions = self.clearPxColorAssertions;\n self.intf.integerToAlpha = self.integerToAlpha;\n self.intf.copy = self.copy;\n self.intf.cut = self.cut;\n self.intf.paste = self.paste;\n self.intf.setStyleProperty = self.setStyleProperty;\n Object.defineProperty(self.intf, 'defaults', {\n get: function () {\n return {\n styles: self.defaults.styles.reduce(function (a, i) {\n a[i[0]] = i[1];\n return a;\n }, {}),\n attributes: self.defaults.attributes.reduce(function (a, i) {\n a[i[0]] = i[1];\n return a;\n }, {}),\n };\n },\n });\n self.styleKeys = Object.keys(self.intf.defaults.styles);\n self.styleKeys\n .map(function (i) {\n return self.hyphenateProperty(i, false);\n })\n .forEach(addStyleKeyIfNoneExists);\n self.styleKeys\n .map(function (i) {\n return self.hyphenateProperty(i, true);\n })\n .forEach(addStyleKeyIfNoneExists);\n self.DOMStyles = window.getComputedStyle(document.body, null);\n self.styleKeys.concat(Object.keys(self.DOMStyles)).forEach(function (key) {\n // unless this line is here, Object.keys() will not work on <instance>.style\n publicStyleKeyIntf[key] = undefined;\n Object.defineProperty(publicStyleKeyIntf, key, {\n get: function () {\n return self.getStyleProperty(key);\n },\n set: function (value) {\n if (self.initialized) {\n self.appliedInlineStyles[key] = value;\n }\n self.setStyleProperty(key, value);\n },\n });\n });\n Object.defineProperty(self.intf, 'shadowRoot', {\n get: function () {\n return self.shadowRoot;\n },\n });\n Object.defineProperty(self.intf, 'activeCell', {\n get: function () {\n return self.activeCell;\n },\n });\n Object.defineProperty(self.intf, 'hasFocus', {\n get: function () {\n return self.hasFocus;\n },\n });\n Object.defineProperty(self.intf, 'hasActiveFilters', {\n get: function () {\n return self.hasActiveFilters();\n },\n });\n Object.defineProperty(self.intf, 'style', {\n get: function () {\n return publicStyleKeyIntf;\n },\n set: function (valueObject) {\n Object.keys(valueObject).forEach(function (key) {\n self.setStyleProperty(key, valueObject[key], true);\n });\n self.draw(true);\n self.dispatchEvent('stylechanged', {\n name: 'style',\n value: valueObject,\n });\n },\n });\n Object.defineProperty(self.intf, 'attributes', { value: {} });\n Object.keys(self.attributes).forEach(function (key) {\n Object.defineProperty(self.intf.attributes, key, {\n get: function () {\n return self.attributes[key];\n },\n set: function (value) {\n self.attributes[key] = value;\n if (key === 'name') {\n self.tryLoadStoredSettings();\n }\n self.draw(true);\n self.dispatchEvent('attributechanged', {\n name: key,\n value: value[key],\n });\n },\n });\n });\n self.filters.string = function (value, filterFor) {\n if (filterFor === self.attributes.blanksText) {\n return self.blankValues.includes(\n value == null ? value : String(value).trim(),\n );\n }\n\n value = String(value);\n var filterRegExp,\n regEnd = /\\/(i|g|m)*$/,\n pattern = regEnd.exec(filterFor),\n flags = pattern ? pattern[0].substring(1) : '',\n flagLength = flags.length;\n self.invalidFilterRegEx = undefined;\n if (filterFor.substring(0, 1) === '/' && pattern) {\n try {\n filterRegExp = new RegExp(\n filterFor.substring(1, filterFor.length - (flagLength + 1)),\n flags,\n );\n } catch (e) {\n self.invalidFilterRegEx = e;\n return;\n }\n return filterRegExp.test(value);\n }\n return value.toString\n ? value\n .toString()\n .toLocaleUpperCase()\n .indexOf(filterFor.toLocaleUpperCase()) !== -1\n : false;\n };\n self.filters.number = function (value, filterFor) {\n if (filterFor === self.attributes.blanksText) {\n return self.blankValues.includes(\n value == null ? value : String(value).trim(),\n );\n }\n\n if (!filterFor) {\n return true;\n }\n return value === filterFor;\n };\n ['formatters', 'filters', 'sorters'].forEach(self.initProp);\n self.applyComponentStyle(false, self.intf);\n self.reloadStoredValues();\n if (self.args.data) {\n self.intf.data = self.args.data;\n }\n if (self.intf.innerText || self.intf.textContent) {\n if (self.intf.dataType === 'application/x-canvas-datagrid') {\n self.intf.dataType = 'application/json+x-canvas-datagrid';\n }\n self.intf.data = self.intf.innerText || self.intf.textContent;\n }\n if (self.args.schema) {\n self.intf.schema = self.args.schema;\n }\n if (self.isChildGrid || !self.isComponent) {\n requestAnimationFrame(function () {\n self.resize(true);\n });\n } else {\n self.resize(true);\n }\n self.initialized = true;\n return self;\n };\n /**\n * Removes focus from the grid.\n * @memberof canvasDatagrid\n * @name blur\n * @method\n */\n self.intf.blur = function (e) {\n self.hasFocus = false;\n };\n /**\n * Focuses on the grid.\n * @memberof canvasDatagrid\n * @name focus\n * @method\n */\n self.intf.focus = function () {\n self.hasFocus = true;\n self.controlInput.focus();\n };\n if (self.shadowRoot || self.isChildGrid) {\n Object.defineProperty(self.intf, 'height', {\n get: function () {\n if (self.shadowRoot) {\n return self.shadowRoot.height;\n }\n return self.parentNode.height;\n },\n set: function (value) {\n if (self.shadowRoot) {\n self.shadowRoot.height = value;\n } else {\n self.parentNode.height = value;\n }\n self.resize(true);\n },\n });\n Object.defineProperty(self.intf, 'width', {\n get: function () {\n if (self.shadowRoot) {\n return self.shadowRoot.width;\n }\n return self.parentNode.width;\n },\n set: function (value) {\n if (self.shadowRoot) {\n self.shadowRoot.width = value;\n } else {\n self.parentNode.width = value;\n }\n self.resize(true);\n },\n });\n Object.defineProperty(self.intf, 'parentNode', {\n get: function () {\n return self.parentNode;\n },\n set: function (value) {\n if (!self.isChildGrid) {\n throw new TypeError(\n 'Cannot set property parentNode which has only a getter',\n );\n }\n self.parentNode = value;\n },\n });\n }\n Object.defineProperty(self.intf, 'visibleRowHeights', {\n get: function () {\n return self.visibleRowHeights;\n },\n });\n Object.defineProperty(self.intf, 'openChildren', {\n get: function () {\n return self.openChildren;\n },\n });\n Object.defineProperty(self.intf, 'childGrids', {\n get: function () {\n return Object.keys(self.childGrids).map(function (gridId) {\n return self.childGrids[gridId];\n });\n },\n });\n Object.defineProperty(self.intf, 'isChildGrid', {\n get: function () {\n return self.isChildGrid;\n },\n });\n Object.defineProperty(self, 'cursor', {\n get: function () {\n return self.parentNodeStyle.cursor;\n },\n set: function (value) {\n if (value === 'cell') {\n value = 'default';\n }\n if (self.currentCursor !== value) {\n self.parentNodeStyle.cursor = value;\n self.currentCursor = value;\n }\n },\n });\n Object.defineProperty(self.intf, 'orderDirection', {\n get: function () {\n return self.orderDirection;\n },\n set: function (value) {\n if (value !== 'desc') {\n value = 'asc';\n }\n self.orderDirection = value;\n self.order(self.orderBy, self.orderDirection);\n },\n });\n Object.defineProperty(self.intf, 'orderBy', {\n get: function () {\n return self.orderBy;\n },\n set: function (value) {\n if (\n self.getSchema().find(function (col) {\n return col.name === value;\n }) === undefined\n ) {\n throw new Error('Cannot sort by unknown column name.');\n }\n self.orderBy = value;\n self.order(self.orderBy, self.orderDirection);\n },\n });\n if (self.isComponent) {\n Object.defineProperty(self.intf, 'offsetHeight', {\n get: function () {\n return self.canvas.offsetHeight;\n },\n });\n Object.defineProperty(self.intf, 'offsetWidth', {\n get: function () {\n return self.canvas.offsetWidth;\n },\n });\n }\n Object.defineProperty(self.intf, 'scrollHeight', {\n get: function () {\n return self.scrollBox.scrollHeight;\n },\n });\n Object.defineProperty(self.intf, 'scrollWidth', {\n get: function () {\n return self.scrollBox.scrollWidth;\n },\n });\n Object.defineProperty(self.intf, 'scrollTop', {\n get: function () {\n return self.scrollBox.scrollTop;\n },\n set: function (value) {\n self.scrollBox.scrollTop = value;\n },\n });\n Object.defineProperty(self.intf, 'scrollLeft', {\n get: function () {\n return self.scrollBox.scrollLeft;\n },\n set: function (value) {\n self.scrollBox.scrollLeft = value;\n },\n });\n Object.defineProperty(self.intf, 'sizes', {\n get: function () {\n return self.sizes;\n },\n });\n Object.defineProperty(self.intf, 'parentDOMNode', {\n get: function () {\n return self.parentDOMNode;\n },\n });\n Object.defineProperty(self.intf, 'input', {\n get: function () {\n return self.input;\n },\n });\n Object.defineProperty(self.intf, 'controlInput', {\n get: function () {\n return self.controlInput;\n },\n });\n Object.defineProperty(self.intf, 'currentCell', {\n get: function () {\n return self.currentCell;\n },\n });\n Object.defineProperty(self.intf, 'visibleCells', {\n get: function () {\n return self.visibleCells;\n },\n });\n Object.defineProperty(self.intf, 'visibleRows', {\n get: function () {\n return self.visibleRows;\n },\n });\n Object.defineProperty(self.intf, 'selections', {\n get: function () {\n return self.selections;\n },\n });\n Object.defineProperty(self.intf, 'dragMode', {\n get: function () {\n return self.dragMode;\n },\n });\n Object.defineProperty(self.intf, 'changes', {\n get: function () {\n return self.changes;\n },\n });\n self.intf.formatters = self.formatters;\n Object.defineProperty(self.intf, 'dataType', {\n get: function () {\n return self.dataType;\n },\n set: function (value) {\n if (!self.parsers[value]) {\n throw new Error('No parser for MIME type ' + value);\n }\n self.dataType = value;\n },\n });\n self.eventNames.forEach(function (eventName) {\n Object.defineProperty(self.intf, 'on' + eventName, {\n get: function () {\n return self.componentL1Events[eventName];\n },\n set: function (value) {\n self.events[eventName] = [];\n self.componentL1Events[eventName] = value;\n if (!value) {\n return;\n }\n self.addEventListener(eventName, value);\n },\n });\n });\n Object.defineProperty(self.intf, 'frozenRow', {\n get: function () {\n return self.frozenRow;\n },\n set: function (val) {\n if (isNaN(val)) {\n throw new TypeError('Expected value for frozenRow to be a number.');\n }\n if (self.visibleRows.length < val) {\n throw new RangeError(\n 'Cannot set a value larger than the number of visible rows.',\n );\n }\n self.frozenRow = val;\n },\n });\n Object.defineProperty(self.intf, 'frozenColumn', {\n get: function () {\n return self.frozenColumn;\n },\n set: function (val) {\n if (isNaN(val)) {\n throw new TypeError('Expected value for frozenRow to be a number.');\n }\n if (self.getVisibleSchema().length < val) {\n throw new RangeError(\n 'Cannot set a value larger than the number of visible columns.',\n );\n }\n self.frozenColumn = val;\n },\n });\n Object.defineProperty(self.intf, 'scrollIndexRect', {\n get: function () {\n return {\n top: self.scrollIndexTop,\n right: self.scrollIndexRight,\n bottom: self.scrollIndexBottom,\n left: self.scrollIndexLeft,\n };\n },\n });\n Object.defineProperty(self.intf, 'scrollPixelRect', {\n get: function () {\n return {\n top: self.scrollPixelTop,\n right: self.scrollPixelRight,\n bottom: self.scrollPixelBottom,\n left: self.scrollPixelLeft,\n };\n },\n });\n Object.defineProperty(self.intf, 'rowOrder', {\n get: function () {\n return self.orders.rows;\n },\n set: function (val) {\n if (!Array.isArray(val)) {\n throw new TypeError('Value must be an array.');\n }\n if (!self.originalData || val.length < self.originalData.length) {\n throw new RangeError(\n 'Array length must be equal to or greater than number of rows.',\n );\n }\n self.orders.rows = val;\n },\n });\n Object.defineProperty(self.intf, 'columnOrder', {\n get: function () {\n return self.orders.columns;\n },\n set: function (val) {\n if (!Array.isArray(val)) {\n throw new TypeError('Value must be an array.');\n }\n if (val.length < self.getSchema().length) {\n throw new RangeError(\n 'Array length must be equal to or greater than number of columns.',\n );\n }\n self.orders.columns = val;\n },\n });\n Object.defineProperty(self.intf, 'selectionBounds', {\n get: function () {\n return self.getSelectionBounds();\n },\n });\n Object.defineProperty(self.intf, 'selectedRows', {\n get: function () {\n return self.getSelectedData(true);\n },\n });\n Object.defineProperty(self.intf, 'selectedCells', {\n get: function () {\n return self.getSelectedData();\n },\n });\n Object.defineProperty(self.intf, 'visibleSchema', {\n get: function () {\n return self.getVisibleSchema().map(function eachDataRow(col) {\n return col;\n });\n },\n });\n Object.defineProperty(self.intf, 'treeGridAttributes', {\n get: function () {\n return self.treeGridAttributes;\n },\n set: function setTreeGridAttributes(value) {\n self.treeGridAttributes = value;\n },\n });\n Object.defineProperty(self.intf, 'cellGridAttributes', {\n get: function () {\n return self.cellGridAttributes;\n },\n set: function setCellGridAttributes(value) {\n self.cellGridAttributes = value;\n },\n });\n Object.defineProperty(self.intf, 'ctx', {\n get: function () {\n return self.ctx;\n },\n });\n Object.defineProperty(self.intf, 'schema', {\n get: function schemaGetter() {\n return self.getSchema();\n },\n set: function schemaSetter(value) {\n if (value === undefined) {\n // Issue #89 - allow schema to be set to initialized state\n self.schema = undefined;\n self.tempSchema = undefined;\n self.dispatchEvent('schemachanged', { schema: undefined });\n return;\n }\n if (!Array.isArray(value) || typeof value[0] !== 'object') {\n throw new Error('Schema must be an array of objects.');\n }\n if (value[0].name === undefined) {\n throw new Error(\n 'Expected schema to contain an object with at least a name property.',\n );\n }\n self.schema = value.map(function eachSchemaColumn(column, index) {\n column.width = column.width || self.style.cellWidth;\n column.filter = column.filter || self.filter(column.type);\n column.type = column.type || 'string';\n column.index = index;\n column.columnIndex = index;\n column.rowIndex = -1;\n return column;\n });\n self.tempSchema = undefined;\n self.createNewRowData();\n self.createColumnOrders();\n self.tryLoadStoredSettings();\n if (\n self.storedSettings &&\n typeof self.storedSettings.visibility === 'object'\n ) {\n self.schema.forEach(function hideEachSchemaColumn(column, index) {\n if (\n self.storedSettings &&\n self.storedSettings.visibility[column.name] !== undefined\n ) {\n column.hidden = !self.storedSettings.visibility[column.name];\n }\n });\n }\n self.resize(true);\n self.dispatchEvent('schemachanged', { schema: self.schema });\n },\n });\n /**\n * Gets an array of currently registered MIME types.\n * @memberof canvasDatagrid\n * @name getDataTypes\n * @method\n */\n self.intf.getTypes = function () {\n return Object.keys(self.parsers);\n };\n self.parseInnerHtml = function (data) {\n if (!data || /^ +$/.test(data)) {\n return [];\n }\n try {\n data = JSON.parse(data);\n } catch (e) {\n console.warn(\n Error(\n 'Cannot parse application/json+x-canvas-datagrid formated data. ' +\n e.message +\n ' \\nNote: canvas-datagrid.innerHTML is for string data only. ' +\n 'Use the canvas-datagrid.data property to set object data.',\n ),\n );\n }\n return data;\n };\n self.parsers['application/json+x-canvas-datagrid'] = function (\n data,\n callback,\n ) {\n self.parsers['application/x-canvas-datagrid'](\n self.parseInnerHtml(data),\n function (data, schema) {\n return callback(data, schema);\n },\n );\n };\n self.parsers['application/x-canvas-datagrid'] = function (data, callback) {\n return callback(data);\n };\n self.intf.parsers = self.parsers;\n // send to dataType ETL function to extract from input data\n // and transform into native [{}, {}] format\n self.etl = function (data, callback) {\n if (!self.intf.parsers[self.dataType]) {\n throw new Error('Unsupported data type.');\n }\n self.intf.parsers[self.dataType](data, function (data, schema) {\n // set the unfiltered/sorted data array\n self.originalData = data;\n self.viewData = Array.from(self.originalData);\n\n if (Array.isArray(schema)) {\n self.schema = schema;\n }\n // Issue #89 - allow schema to be auto-created every time data is set\n if (self.attributes.autoGenerateSchema) {\n self.schema = self.getSchemaFromData(data);\n }\n if (!self.schema) {\n self.tempSchema = self.getSchemaFromData(data);\n }\n if (self.getSchema()) {\n self.createColumnOrders();\n }\n // apply filter, sort, etc to incoming dataset, set viewData:\n self.refresh();\n // empty data was set\n if (!self.schema && (self.originalData || []).length === 0) {\n self.tempSchema = [{ name: '' }];\n }\n self.fitColumnToValues('cornerCell', true);\n if (\n (self.tempSchema && !self.schema) ||\n self.attributes.autoGenerateSchema\n ) {\n self.createColumnOrders();\n self.dispatchEvent('schemachanged', { schema: self.tempSchema });\n }\n callback();\n });\n };\n Object.defineProperty(self.intf, 'viewData', {\n get: function () {\n return self.viewData;\n },\n });\n Object.defineProperty(self.intf, 'boundData', {\n get: function () {\n return self.originalData;\n },\n });\n Object.defineProperty(self.intf, 'data', {\n get: function dataGetter() {\n return self.originalData;\n },\n set: function dataSetter(value) {\n self.etl(value, function () {\n self.changes = [];\n self.createNewRowData();\n if (\n self.attributes.autoResizeColumns &&\n self.originalData.length > 0 &&\n self.storedSettings === undefined\n ) {\n self.autosize();\n }\n // set the header column to fit the numbers in it\n self.fitColumnToValues('cornerCell', true);\n self.createRowOrders();\n self.tryLoadStoredSettings();\n self.dispatchEvent('datachanged', { data: self.originalData });\n self.resize(true);\n });\n },\n });\n self.initScrollBox = function () {\n var sHeight = 0,\n sWidth = 0,\n scrollTop = 0,\n scrollLeft = 0,\n scrollHeight = 0,\n scrollWidth = 0,\n scrollBoxHeight = 20,\n scrollBoxWidth = 20;\n function setScrollTop(value, preventScrollEvent) {\n if (isNaN(value)) {\n throw new Error('ScrollTop value must be a number');\n }\n if (value < 0) {\n value = 0;\n }\n if (value > scrollHeight) {\n value = scrollHeight;\n }\n if (scrollHeight < 0) {\n value = 0;\n }\n scrollTop = value;\n if (!preventScrollEvent) {\n self.scroll();\n }\n if (self.button) {\n self.moveButtonPos();\n }\n }\n function setScrollLeft(value, preventScrollEvent) {\n if (isNaN(value)) {\n throw new Error('ScrollLeft value must be a number');\n }\n if (value < 0) {\n value = 0;\n }\n if (value > scrollWidth) {\n value = scrollWidth;\n }\n if (scrollWidth < 0) {\n value = 0;\n }\n scrollLeft = value;\n if (!preventScrollEvent) {\n self.scroll();\n }\n if (self.button) {\n self.moveButtonPos();\n }\n }\n self.scrollBox.toString = function () {\n return (\n '{\"width\": ' +\n scrollWidth.toFixed(2) +\n ', \"height\": ' +\n scrollHeight.toFixed(2) +\n ', \"left\": ' +\n scrollLeft.toFixed(2) +\n ', \"top\": ' +\n scrollTop.toFixed(2) +\n ', \"widthRatio\": ' +\n self.scrollBox.widthBoxRatio.toFixed(5) +\n ', \"heightRatio\": ' +\n self.scrollBox.heightBoxRatio.toFixed(5) +\n '}'\n );\n };\n self.scrollBox.scrollTo = function (x, y, supressDrawEvent) {\n setScrollLeft(x, true);\n setScrollTop(y, supressDrawEvent);\n };\n Object.defineProperty(self.scrollBox, 'scrollBoxHeight', {\n get: function () {\n return scrollBoxHeight;\n },\n set: function (value) {\n scrollBoxHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollBoxWidth', {\n get: function () {\n return scrollBoxWidth;\n },\n set: function (value) {\n scrollBoxWidth = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'height', {\n get: function () {\n return sHeight;\n },\n set: function (value) {\n sHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'width', {\n get: function () {\n return sWidth;\n },\n set: function (value) {\n sWidth = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollTop', {\n get: function () {\n return scrollTop;\n },\n set: setScrollTop,\n });\n Object.defineProperty(self.scrollBox, 'scrollLeft', {\n get: function () {\n return scrollLeft;\n },\n set: setScrollLeft,\n });\n Object.defineProperty(self.scrollBox, 'scrollHeight', {\n get: function () {\n return scrollHeight;\n },\n set: function (value) {\n if (scrollTop > value) {\n scrollTop = Math.max(value, 0);\n }\n scrollHeight = value;\n },\n });\n Object.defineProperty(self.scrollBox, 'scrollWidth', {\n get: function () {\n return scrollWidth;\n },\n set: function (value) {\n if (scrollLeft > value) {\n scrollLeft = Math.max(value, 0);\n }\n scrollWidth = value;\n },\n });\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false, Event: false*/\n'use strict';\n\nexport default function (self) {\n var zIndexTop, hoverScrollTimeout, autoCompleteContext;\n function applyContextItemStyle(contextItemContainer) {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item' + (self.mobile ? '-mobile' : ''),\n );\n contextItemContainer.addEventListener('mouseover', function () {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item:hover',\n );\n });\n contextItemContainer.addEventListener('mouseout', function () {\n self.createInlineStyle(\n contextItemContainer,\n 'canvas-datagrid-context-menu-item',\n );\n });\n }\n function createContextMenu(ev, pos, items, parentContextMenu) {\n var container = document.createElement('div'),\n upArrow = document.createElement('div'),\n downArrow = document.createElement('div'),\n children = [],\n selectedIndex = -1,\n intf = {},\n rect;\n if (!Array.isArray(items)) {\n throw new Error('createContextMenu expects an array.');\n }\n function createItems() {\n items.forEach(function (item) {\n var contextItemContainer = document.createElement('div'),\n childMenuArrow;\n function removeChildContext(e) {\n if (\n e.relatedTarget === container ||\n item.contextMenu.container === e.relatedTarget ||\n childMenuArrow === e.relatedTarget ||\n contextItemContainer === e.relatedTarget ||\n item.contextMenu.container.contains(e.relatedTarget)\n ) {\n return;\n }\n item.contextMenu.dispose();\n children.splice(children.indexOf(item.contextMenu), 1);\n item.contextMenu = undefined;\n contextItemContainer.removeEventListener(\n 'mouseout',\n removeChildContext,\n );\n container.removeEventListener('mouseout', removeChildContext);\n contextItemContainer.setAttribute('contextOpen', '0');\n contextItemContainer.setAttribute('opening', '0');\n }\n function contextAddCallback(items) {\n // check yet again if the user hasn't moved off\n if (\n contextItemContainer.getAttribute('opening') !== '1' ||\n contextItemContainer.getAttribute('contextOpen') === '1'\n ) {\n return;\n }\n var cPos = contextItemContainer.getBoundingClientRect();\n cPos = {\n left:\n cPos.left +\n self.style.childContextMenuMarginLeft +\n container.offsetWidth,\n top: cPos.top + self.style.childContextMenuMarginTop,\n bottom: cPos.bottom,\n right: cPos.right,\n };\n item.contextMenu = createContextMenu(ev, cPos, items, intf);\n contextItemContainer.setAttribute('contextOpen', '1');\n contextItemContainer.addEventListener('mouseout', removeChildContext);\n container.addEventListener('mouseout', removeChildContext);\n children.push(item.contextMenu);\n }\n function createChildContext() {\n var i;\n if (contextItemContainer.getAttribute('contextOpen') === '1') {\n return;\n }\n contextItemContainer.setAttribute('opening', '1');\n if (typeof item.items === 'function') {\n i = item.items.apply(intf, [\n function (items) {\n contextAddCallback(items);\n },\n ]);\n if (i !== undefined && Array.isArray(i)) {\n contextAddCallback(i);\n }\n return;\n }\n contextAddCallback(item.items);\n }\n function addItem(item) {\n function addContent(content) {\n if (content === null) {\n return;\n }\n if (typeof content === 'function') {\n return addContent(content(ev));\n }\n if (typeof content === 'object') {\n contextItemContainer.appendChild(content);\n return;\n }\n applyContextItemStyle(contextItemContainer);\n contextItemContainer.innerHTML = content;\n return;\n }\n addContent(item.title);\n item.contextItemContainer = contextItemContainer;\n if (\n (item.items && item.items.length > 0) ||\n typeof item.items === 'function'\n ) {\n childMenuArrow = document.createElement('div');\n self.createInlineStyle(\n childMenuArrow,\n 'canvas-datagrid-context-child-arrow',\n );\n childMenuArrow.innerHTML = self.style.childContextMenuArrowHTML;\n contextItemContainer.appendChild(childMenuArrow);\n contextItemContainer.addEventListener(\n 'mouseover',\n createChildContext,\n );\n contextItemContainer.addEventListener('mouseout', function () {\n contextItemContainer.setAttribute('opening', '0');\n });\n }\n if (item.click) {\n contextItemContainer.addEventListener('click', function (ev) {\n item.click.apply(self, [ev]);\n });\n }\n }\n addItem(item);\n container.appendChild(contextItemContainer);\n });\n }\n function clickIndex(idx) {\n items[idx].contextItemContainer.dispatchEvent(new Event('click'));\n }\n function checkArrowVisibility() {\n if (container.scrollTop > 0) {\n self.parentDOMNode.appendChild(upArrow);\n } else if (upArrow.parentNode) {\n upArrow.parentNode.removeChild(upArrow);\n }\n if (\n container.scrollTop >=\n container.scrollHeight - container.offsetHeight &&\n downArrow.parentNode\n ) {\n downArrow.parentNode.removeChild(downArrow);\n } else if (\n container.scrollHeight - container.offsetHeight > 0 &&\n !(\n container.scrollTop >=\n container.scrollHeight - container.offsetHeight\n )\n ) {\n self.parentDOMNode.appendChild(downArrow);\n }\n }\n function fade(element) {\n var opacity = 1;\n var timer = setInterval(function () {\n if (opacity <= 0.1) {\n clearInterval(timer);\n element.style.display = 'none';\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n }\n }\n element.style.opacity = opacity;\n element.style.filter = 'alpha(opacity=' + opacity * 100 + ')';\n opacity -= opacity * 0.1;\n }, self.attributes.animationDurationHideContextMenu * 0.1);\n }\n function unfade(element) {\n var opacity = 0.1;\n element.style.display = 'block';\n var timer = setInterval(function () {\n if (opacity >= 1) {\n clearInterval(timer);\n }\n element.style.opacity = opacity;\n element.style.filter = 'alpha(opacity=' + opacity * 100 + ')';\n opacity += opacity * 0.1;\n }, self.attributes.animationDurationShowContextMenu * 0.1);\n }\n function startHoverScroll(type) {\n return function t() {\n var a = self.attributes.contextHoverScrollAmount;\n if (type === 'up' && container.scrollTop === 0) {\n return;\n }\n if (type === 'down' && container.scrollTop === container.scrollHeight) {\n return;\n }\n container.scrollTop += type === 'up' ? -a : a;\n hoverScrollTimeout = setTimeout(\n t,\n self.attributes.contextHoverScrollRateMs,\n type,\n );\n };\n }\n function endHoverScroll(type) {\n return function () {\n clearTimeout(hoverScrollTimeout);\n };\n }\n function init() {\n var loc = {},\n s = self.scrollOffset(self.canvas);\n if (zIndexTop === undefined) {\n zIndexTop = self.style.contextMenuZIndex;\n }\n createItems();\n self.createInlineStyle(\n container,\n 'canvas-datagrid-context-menu' + (self.mobile ? '-mobile' : ''),\n );\n loc.x = pos.left - s.left;\n loc.y = pos.top - s.top;\n loc.height = 0;\n zIndexTop += 1;\n container.style.opacity = 0;\n container.style.position = 'absolute';\n upArrow.style.color = self.style.contextMenuArrowColor;\n downArrow.style.color = self.style.contextMenuArrowColor;\n [upArrow, downArrow].forEach(function (el) {\n el.style.textAlign = 'center';\n el.style.position = 'absolute';\n el.style.zIndex = zIndexTop + 1;\n });\n container.style.zIndex = zIndexTop;\n if (parentContextMenu && parentContextMenu.inputDropdown) {\n container.style.maxHeight =\n window.innerHeight -\n loc.y -\n self.style.autocompleteBottomMargin +\n 'px';\n container.style.minWidth = pos.width + 'px';\n loc.y += pos.height;\n }\n if (self.mobile) {\n container.style.width = pos.width + 'px';\n }\n container.style.left = loc.x + 'px';\n container.style.top = loc.y + 'px';\n container.addEventListener('scroll', checkArrowVisibility);\n container.addEventListener('wheel', function (e) {\n if (self.hasFocus) {\n container.scrollTop += e.deltaY;\n container.scrollLeft += e.deltaX;\n }\n checkArrowVisibility();\n });\n upArrow.innerHTML = self.style.contextMenuArrowUpHTML;\n downArrow.innerHTML = self.style.contextMenuArrowDownHTML;\n container.appendChild(upArrow);\n document.body.appendChild(downArrow);\n document.body.appendChild(container);\n unfade(container);\n rect = container.getBoundingClientRect();\n // TODO: fix !(parentContextMenu && parentContextMenu.inputDropdown) state (autocomplete)\n if (rect.bottom > window.innerHeight) {\n if (!(parentContextMenu && parentContextMenu.inputDropdown)) {\n loc.y -=\n rect.bottom +\n self.style.contextMenuWindowMargin -\n window.innerHeight;\n }\n if (loc.y < 0) {\n loc.y = self.style.contextMenuWindowMargin;\n }\n if (\n container.offsetHeight >\n window.innerHeight - self.style.contextMenuWindowMargin\n ) {\n container.style.height =\n window.innerHeight - self.style.contextMenuWindowMargin * 2 + 'px';\n }\n }\n if (rect.right > window.innerWidth) {\n loc.x -=\n rect.right - window.innerWidth + self.style.contextMenuWindowMargin;\n }\n if (loc.x < 0) {\n loc.x = self.style.contextMenuWindowMargin;\n }\n if (loc.y < 0) {\n loc.y = self.style.contextMenuWindowMargin;\n }\n container.style.left = loc.x + 'px';\n container.style.top = loc.y + 'px';\n rect = container.getBoundingClientRect();\n upArrow.style.top = rect.top + 'px';\n downArrow.style.top =\n rect.top + rect.height - downArrow.offsetHeight + 'px';\n upArrow.style.left = rect.left + 'px';\n downArrow.style.left = rect.left + 'px';\n downArrow.style.width = container.offsetWidth + 'px';\n upArrow.style.width = container.offsetWidth + 'px';\n downArrow.addEventListener('mouseover', startHoverScroll('down'));\n downArrow.addEventListener('mouseout', endHoverScroll('down'));\n upArrow.addEventListener('mouseover', startHoverScroll('up'));\n upArrow.addEventListener('mouseout', endHoverScroll('up'));\n checkArrowVisibility();\n }\n intf.parentGrid = self.intf;\n intf.parentContextMenu = parentContextMenu;\n intf.container = container;\n init();\n intf.clickIndex = clickIndex;\n intf.rect = rect;\n intf.items = items;\n intf.upArrow = upArrow;\n intf.downArrow = downArrow;\n intf.dispose = function () {\n clearTimeout(hoverScrollTimeout);\n children.forEach(function (c) {\n c.dispose();\n });\n [downArrow, upArrow, container].forEach(function (el) {\n fade(el);\n });\n };\n Object.defineProperty(intf, 'selectedIndex', {\n get: function () {\n return selectedIndex;\n },\n set: function (value) {\n if (typeof value !== 'number' || isNaN(value || !isFinite(value))) {\n throw new Error('Context menu selected index must be a sane number.');\n }\n selectedIndex = value;\n if (selectedIndex > items.length - 1) {\n selectedIndex = items.length - 1;\n }\n if (selectedIndex < 0) {\n selectedIndex = 0;\n }\n items.forEach(function (item, index) {\n if (index === selectedIndex) {\n return self.createInlineStyle(\n item.contextItemContainer,\n 'canvas-datagrid-context-menu-item:hover',\n );\n }\n self.createInlineStyle(\n item.contextItemContainer,\n 'canvas-datagrid-context-menu-item',\n );\n });\n },\n });\n return intf;\n }\n function createFilterContextMenuItems(e) {\n var filterContainer = document.createElement('div'),\n filterLabel = document.createElement('div'),\n filterAutoCompleteButton = document.createElement('button'),\n filterInput = document.createElement('input'),\n n =\n e.cell && e.cell.header\n ? e.cell.header.title || e.cell.header.name\n : '',\n iRect;\n function checkRegExpErrorState() {\n filterInput.style.background = self.style.contextFilterInputBackground;\n filterInput.style.color = self.style.contextFilterInputColor;\n if (self.invalidFilterRegEx) {\n filterInput.style.background =\n self.style.contextFilterInvalidRegExpBackground;\n filterInput.style.color = self.style.contextFilterInvalidRegExpColor;\n }\n }\n function fillAutoComplete() {\n var count = 0;\n var items = {};\n var blanksItem = [];\n\n self.viewData.forEach(function (row) {\n var cellValue =\n row[e.cell.header.name] == null\n ? row[e.cell.header.name]\n : String(row[e.cell.header.name]).trim();\n var value = self.blankValues.includes(cellValue)\n ? self.attributes.blanksText\n : cellValue;\n\n if (items[value] || count > self.attributes.maxAutoCompleteItems) {\n return;\n }\n count += 1;\n items[value] = {\n title: self.formatters[e.cell.header.type || 'string']({\n cell: { value: value },\n }),\n click: function (e) {\n filterInput.value = value;\n e.stopPropagation();\n filterInput.dispatchEvent(new Event('keyup'));\n self.disposeAutocomplete();\n return;\n },\n };\n });\n\n if (Object.keys(items).indexOf(self.attributes.blanksText) !== -1) {\n blanksItem.push(items[self.attributes.blanksText]);\n delete items[self.attributes.blanksText];\n }\n\n return blanksItem.concat(\n Object.keys(items).map(function (key) {\n return items[key];\n }),\n );\n }\n\n function createAutoCompleteContext(ev) {\n if (ev && ['ArrowDown', 'ArrowUp', 'Enter', 'Tab'].includes(ev.key)) {\n return;\n }\n\n var autoCompleteItems = fillAutoComplete();\n\n iRect = filterInput.getBoundingClientRect();\n if (autoCompleteContext) {\n autoCompleteContext.dispose();\n autoCompleteContext = undefined;\n }\n autoCompleteContext = createContextMenu(\n e,\n {\n left: iRect.left,\n top: iRect.top,\n right: iRect.right,\n bottom: iRect.bottom,\n height: iRect.height,\n width: iRect.width,\n },\n autoCompleteItems,\n { inputDropdown: true },\n );\n autoCompleteContext.selectedIndex = 0;\n }\n self.createInlineStyle(filterLabel, 'canvas-datagrid-context-menu-label');\n self.createInlineStyle(\n filterAutoCompleteButton,\n 'canvas-datagrid-context-menu-filter-button',\n );\n self.createInlineStyle(\n filterInput,\n 'canvas-datagrid-context-menu-filter-input',\n );\n checkRegExpErrorState();\n filterInput.onclick = self.disposeAutocomplete;\n filterInput.addEventListener('keydown', function (e) {\n if (e.key === 'ArrowDown') {\n autoCompleteContext.selectedIndex += 1;\n }\n\n if (e.key === 'ArrowUp') {\n autoCompleteContext.selectedIndex -= 1;\n }\n\n if (e.key === 'Enter') {\n autoCompleteContext.clickIndex(autoCompleteContext.selectedIndex);\n self.disposeContextMenu();\n }\n\n if (e.key === 'Tab') {\n autoCompleteContext.clickIndex(autoCompleteContext.selectedIndex);\n e.preventDefault();\n }\n\n if (e.key === 'Escape') {\n self.disposeContextMenu();\n }\n });\n filterInput.addEventListener('keyup', function () {\n self.setFilter(e.cell.header.name, filterInput.value);\n });\n filterInput.addEventListener('keyup', createAutoCompleteContext);\n ['focus', 'blur', 'keydown', 'keyup', 'change'].forEach(function (en) {\n filterInput.addEventListener(en, checkRegExpErrorState);\n });\n filterInput.value = e.cell.header\n ? self.columnFilters[e.cell.header.name] || ''\n : '';\n filterLabel.innerHTML = self.attributes.filterOptionText.replace(/%s/g, n);\n filterAutoCompleteButton.onclick = function () {\n if (autoCompleteContext) {\n return self.disposeAutocomplete();\n }\n createAutoCompleteContext();\n };\n filterAutoCompleteButton.innerHTML = self.style.contextFilterButtonHTML;\n filterContainer.addEventListener('click', function (e) {\n return e.stopPropagation();\n });\n filterContainer.appendChild(filterLabel);\n filterContainer.appendChild(filterInput);\n filterContainer.appendChild(filterAutoCompleteButton);\n e.items.push({\n title: filterContainer,\n });\n if (Object.keys(self.columnFilters).length) {\n Object.keys(self.columnFilters).forEach(function (cf) {\n var h = self.getHeaderByName(cf);\n e.items.push({\n title: self.attributes.removeFilterOptionText.replace(\n /%s/g,\n h.title || h.name,\n ),\n click: function removeFilterClick(e) {\n e.preventDefault();\n self.setFilter(cf, '');\n self.controlInput.focus();\n },\n });\n });\n }\n }\n function addDefaultContextMenuItem(e) {\n var isNormalCell =\n !(\n e.cell.isBackground ||\n e.cell.isColumnHeaderCellCap ||\n e.cell.isScrollBar ||\n e.cell.isCorner ||\n e.cell.isRowHeader\n ) && e.cell.header;\n if (self.attributes.showFilter && isNormalCell) {\n createFilterContextMenuItems(e);\n }\n if (\n self.attributes.showCopy &&\n self.selections.reduce(function (p, r) {\n return p + r.length;\n }, 0) > 0\n ) {\n e.items.push({\n title: self.attributes.copyText,\n click: function () {\n document.execCommand('copy');\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n if (self.attributes.showPaste && self.clipBoardData) {\n e.items.push({\n title: self.attributes.pasteText,\n click: function () {\n self.paste(self.clipBoardData, e.cell.columnIndex, e.cell.rowIndex);\n self.draw();\n },\n });\n }\n if (self.attributes.showColumnSelector) {\n e.items.push({\n title: self.attributes.columnSelectorText,\n items: function () {\n var d = [];\n self.getSchema().forEach(function (column) {\n function toggleColumnVisibility(e) {\n column.hidden = !column.hidden;\n self.dispatchEvent('togglecolumn', {\n column: column,\n hidden: column.hidden,\n });\n e.preventDefault();\n self.stopPropagation(e);\n self.disposeContextMenu();\n self.resize(true);\n self.setStorageData();\n }\n var el = document.createElement('div');\n applyContextItemStyle(el);\n el.addEventListener('touchstart', toggleColumnVisibility);\n el.addEventListener('click', toggleColumnVisibility);\n el.innerHTML =\n (column.hidden\n ? self.attributes.columnSelectorHiddenText\n : self.attributes.columnSelectorVisibleText) +\n (column.title || column.name);\n d.push({\n title: el,\n });\n });\n return d;\n },\n });\n if (e.cell && e.cell.header && e.cell.columnIndex > -1) {\n e.items.push({\n title: self.attributes.hideColumnText.replace(\n /%s/gi,\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n self.getSchema()[e.cell.columnIndex].hidden = true;\n ev.preventDefault();\n self.stopPropagation(ev);\n self.disposeContextMenu();\n self.setStorageData();\n setTimeout(function () {\n self.resize(true);\n }, 10);\n },\n });\n }\n }\n if (\n self.attributes.saveAppearance &&\n self.attributes.showClearSettingsOption &&\n (Object.keys(self.sizes.rows).length > 0 ||\n Object.keys(self.sizes.columns).length > 0)\n ) {\n e.items.push({\n title: self.attributes.clearSettingsOptionText,\n click: function (e) {\n e.preventDefault();\n self.sizes.rows = {};\n self.sizes.columns = {};\n self.createRowOrders();\n self.createColumnOrders();\n self.storedSettings = undefined;\n self.dispatchEvent('resizecolumn', {\n columnWidth: self.style.cellWidth,\n });\n self.dispatchEvent('resizerow', {\n cellHeight: self.style.cellHeight,\n });\n self.setStorageData();\n self.resize(true);\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n if (\n self.attributes.allowSorting &&\n self.attributes.showOrderByOption &&\n isNormalCell\n ) {\n e.items.push({\n title: self.attributes.showOrderByOptionTextAsc.replace(\n '%s',\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.order(e.cell.header.name, 'asc');\n self.controlInput.focus();\n },\n });\n e.items.push({\n title: self.attributes.showOrderByOptionTextDesc.replace(\n '%s',\n e.cell.header.title || e.cell.header.name,\n ),\n click: function (ev) {\n ev.preventDefault();\n self.order(e.cell.header.name, 'desc');\n self.disposeContextMenu();\n self.controlInput.focus();\n },\n });\n }\n }\n self.disposeAutocomplete = function () {\n if (autoCompleteContext) {\n autoCompleteContext.dispose();\n autoCompleteContext = undefined;\n }\n };\n self.disposeContextMenu = function (event) {\n document.removeEventListener('click', self.disposeContextMenu);\n zIndexTop = self.style.contextMenuZIndex;\n self.disposeAutocomplete();\n if (self.contextMenu) {\n self.contextMenu.dispose();\n }\n self.contextMenu = undefined;\n if (event) {\n self.canvas.focus();\n self.mousedown(event);\n self.mouseup(event);\n }\n };\n self.contextmenuEvent = function (e, overridePos) {\n if (!self.hasFocus && e.target !== self.canvas) {\n return;\n }\n function createDisposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('click', self.disposeContextMenu);\n document.removeEventListener('mouseup', createDisposeEvent);\n });\n }\n var contextPosition,\n items = [],\n pos = overridePos || self.getLayerPos(e),\n ev = {\n NativeEvent: e,\n cell: self.getCellAt(pos.x, pos.y),\n items: items,\n };\n if (!ev.cell.isGrid) {\n addDefaultContextMenuItem(ev);\n }\n if (e.type !== 'mousedown' && self.dispatchEvent('contextmenu', ev)) {\n return;\n }\n if (!ev.cell.isGrid) {\n if (self.contextMenu) {\n self.disposeContextMenu();\n }\n contextPosition = {\n left:\n pos.x +\n pos.rect.left +\n self.style.contextMenuMarginLeft +\n self.canvasOffsetLeft,\n top:\n pos.y +\n pos.rect.top +\n self.style.contextMenuMarginTop +\n self.canvasOffsetTop,\n right: ev.cell.width + ev.cell.x + pos.rect.left,\n bottom: ev.cell.height + ev.cell.y + pos.rect.top,\n height: ev.cell.height,\n width: ev.cell.width,\n };\n if (self.mobile) {\n contextPosition.left = self.style.mobileContextMenuMargin + 'px';\n contextPosition.width =\n self.width - self.style.mobileContextMenuMargin * 2 + 'px';\n }\n if (e.type == 'mousedown') {\n contextPosition.top += self.style.filterButtonMenuOffsetTop;\n }\n self.contextMenu = createContextMenu(ev, contextPosition, items);\n if (e.type == 'mousedown') {\n document.addEventListener('mouseup', createDisposeEvent);\n } else {\n createDisposeEvent();\n }\n e.preventDefault();\n }\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false, Event: false*/\n'use strict';\n\nexport default function (self) {\n let zIndexTop;\n\n function applyButtonMenuItemStyle(buttonMenuItemContainer) {\n self.createInlineStyle(\n buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item' + (self.mobile ? '-mobile' : ''),\n );\n buttonMenuItemContainer.addEventListener('mouseover', function () {\n self.createInlineStyle(\n buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item:hover',\n );\n });\n buttonMenuItemContainer.addEventListener('mouseout', function () {\n self.createInlineStyle(\n buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item',\n );\n });\n }\n\n function applyButtonStyle(button) {\n self.createInlineStyle(button, 'canvas-datagrid-button-wrapper');\n button.addEventListener('mouseover', function () {\n if (!self.buttonMenu) {\n self.createInlineStyle(button, 'canvas-datagrid-button-wrapper:hover');\n }\n });\n button.addEventListener('mouseout', function () {\n if (!self.buttonMenu) {\n self.createInlineStyle(button, 'canvas-datagrid-button-wrapper');\n }\n });\n }\n\n function createButton(pos, items, imgSrc) {\n var wrapper = document.createElement('div'),\n buttonArrow = document.createElement('div'),\n buttonIcon = document.createElement('div'),\n intf = {};\n\n if (!Array.isArray(items)) {\n throw new Error('createButton expects an array.');\n }\n\n function init() {\n var loc = {},\n s = self.scrollOffset(self.canvas);\n\n if (zIndexTop === undefined) {\n zIndexTop = self.style.buttonZIndex;\n }\n\n applyButtonStyle(wrapper);\n self.createInlineStyle(buttonIcon, 'canvas-datagrid-button-icon');\n self.createInlineStyle(buttonArrow, 'canvas-datagrid-button-arrow');\n\n loc.x = pos.left - s.left;\n loc.y = pos.top - s.top;\n loc.height = 0;\n zIndexTop += 1;\n wrapper.style.position = 'absolute';\n wrapper.style.zIndex = zIndexTop;\n wrapper.style.left = loc.x + 'px';\n wrapper.style.top = loc.y + 'px';\n wrapper.left = pos.left + self.scrollBox.scrollLeft;\n wrapper.top = pos.top + self.scrollBox.scrollTop;\n buttonArrow.innerHTML = self.style.buttonArrowDownHTML;\n if (imgSrc) {\n let img = document.createElement('img');\n img.setAttribute('src', imgSrc);\n img.style.maxWidth = '100%';\n img.style.height = '100%';\n buttonIcon.appendChild(img);\n }\n wrapper.appendChild(buttonIcon);\n wrapper.appendChild(buttonArrow);\n document.body.appendChild(wrapper);\n wrapper.addEventListener('click', toggleButtonMenu);\n }\n\n intf.wrapper = wrapper;\n intf.items = items;\n init();\n\n intf.dispose = function () {\n if (wrapper.parentNode) {\n wrapper.parentNode.removeChild(wrapper);\n }\n };\n return intf;\n }\n\n function toggleButtonMenu() {\n function createDisposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('click', self.disposeButtonMenu);\n });\n }\n if (self.buttonMenu) {\n self.disposeButtonMenu();\n } else {\n let pos = {\n left: self.button.wrapper.left - self.scrollBox.scrollLeft,\n top:\n self.button.wrapper.top +\n self.button.wrapper.offsetHeight -\n self.scrollBox.scrollTop,\n };\n self.buttonMenu = createButtonMenu(pos, self.button.items);\n self.createInlineStyle(\n self.button.wrapper,\n 'canvas-datagrid-button-wrapper:active',\n );\n createDisposeEvent();\n }\n }\n\n function createButtonMenu(pos, items) {\n var buttonMenu = document.createElement('div'),\n selectedIndex = -1,\n intf = {},\n rect;\n\n function createItems() {\n function addItem(item, menuItemContainer) {\n function addContent(content) {\n if (content === null) {\n return;\n }\n\n if (typeof content === 'object') {\n menuItemContainer.appendChild(content);\n return;\n }\n\n applyButtonMenuItemStyle(menuItemContainer);\n menuItemContainer.innerHTML = content;\n return;\n }\n\n addContent(item.title);\n item.buttonMenuItemContainer = menuItemContainer;\n\n if (item.click) {\n menuItemContainer.addEventListener('click', function (ev) {\n item.click.apply(self, [ev]);\n self.disposeButton();\n });\n }\n }\n\n for (let item of items) {\n var buttonMenuItemContainer = document.createElement('div');\n addItem(item, buttonMenuItemContainer);\n buttonMenu.appendChild(buttonMenuItemContainer);\n }\n }\n\n function clickIndex(idx) {\n items[idx].buttonMenuItemContainer.dispatchEvent(new Event('click'));\n }\n\n function init() {\n var loc = {},\n s = self.scrollOffset(self.canvas);\n\n if (zIndexTop === undefined) {\n zIndexTop = self.style.buttonZIndex;\n }\n\n createItems();\n self.createInlineStyle(\n buttonMenu,\n 'canvas-datagrid-button-menu' + (self.mobile ? '-mobile' : ''),\n );\n\n loc.x = pos.left - s.left;\n loc.y = pos.top - s.top;\n loc.height = 0;\n zIndexTop += 1;\n buttonMenu.style.position = 'absolute';\n buttonMenu.style.zIndex = zIndexTop;\n buttonMenu.style.left = loc.x + 'px';\n buttonMenu.style.top = loc.y + 'px';\n document.body.appendChild(buttonMenu);\n rect = buttonMenu.getBoundingClientRect();\n\n if (rect.bottom > window.innerHeight) {\n loc.y =\n self.button.wrapper.top -\n buttonMenu.offsetHeight -\n self.scrollBox.scrollTop;\n if (loc.y < 0) {\n loc.y = self.style.buttonMenuWindowMargin;\n }\n\n if (\n buttonMenu.offsetHeight >\n window.innerHeight - self.style.buttonMenuWindowMargin\n ) {\n buttonMenu.style.height =\n window.innerHeight - self.style.buttonMenuWindowMargin * 2 + 'px';\n }\n }\n\n if (rect.right > window.innerWidth) {\n loc.x -=\n rect.right - window.innerWidth + self.style.buttonMenuWindowMargin;\n }\n\n if (loc.x < 0) {\n loc.x = self.style.buttonMenuWindowMargin;\n }\n\n if (loc.y < 0) {\n loc.y = self.style.buttonMenuWindowMargin;\n }\n\n buttonMenu.style.left = loc.x + 'px';\n buttonMenu.style.top = loc.y + 'px';\n }\n\n intf.buttonMenu = buttonMenu;\n init();\n intf.clickIndex = clickIndex;\n intf.rect = rect;\n intf.items = items;\n\n intf.dispose = function () {\n if (buttonMenu.parentNode) {\n buttonMenu.parentNode.removeChild(buttonMenu);\n }\n };\n\n Object.defineProperty(intf, 'selectedIndex', {\n get: function get() {\n return selectedIndex;\n },\n set: function set(value) {\n if (typeof value !== 'number' || isNaN(value) || !isFinite(value)) {\n throw new Error('Button menu selected index must be a sane number.');\n }\n\n selectedIndex = value;\n\n if (selectedIndex > items.length - 1) {\n selectedIndex = items.length - 1;\n }\n\n if (selectedIndex < 0) {\n selectedIndex = 0;\n }\n\n items.forEach(function (item, index) {\n if (index === selectedIndex) {\n return self.createInlineStyle(\n item.buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item:hover',\n );\n }\n\n self.createInlineStyle(\n item.buttonMenuItemContainer,\n 'canvas-datagrid-button-menu-item',\n );\n });\n },\n });\n return intf;\n }\n\n self.disposeButtonMenu = function () {\n if (self.buttonMenu) {\n document.removeEventListener('click', self.disposeButtonMenu);\n self.buttonMenu.dispose();\n self.buttonMenu = undefined;\n self.createInlineStyle(\n self.button.wrapper,\n 'canvas-datagrid-button-wrapper:hover',\n );\n }\n };\n\n self.disposeButton = function (e) {\n if (e && e.keyCode !== 27) return;\n document.removeEventListener('keydown', self.disposeButton);\n zIndexTop = self.style.buttonZIndex;\n self.disposeButtonMenu();\n\n if (self.button) {\n self.button.dispose();\n }\n\n self.button = undefined;\n };\n\n self.moveButtonPos = function () {\n self.button.wrapper.style.left =\n self.button.wrapper.left - self.scrollBox.scrollLeft + 'px';\n self.button.wrapper.style.top =\n self.button.wrapper.top - self.scrollBox.scrollTop + 'px';\n self.disposeButtonMenu();\n };\n\n self.attachButton = function (pos, items, imgSrc) {\n function createDisposeEvent() {\n requestAnimationFrame(function () {\n document.addEventListener('keydown', self.disposeButton);\n });\n }\n\n if (self.button) {\n self.disposeButton();\n }\n\n self.button = createButton(pos, items, imgSrc);\n createDisposeEvent();\n };\n return;\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n self.getClippingRect = function (ele) {\n var boundingRect = self.position(self.parentNode),\n eleRect = self.position(ele),\n s = self.scrollOffset(self.canvas),\n clipRect = {\n x: 0,\n y: 0,\n h: 0,\n w: 0,\n },\n parentRect = {\n x: -Infinity,\n y: -Infinity,\n h: Infinity,\n w: Infinity,\n },\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth = self.getRowHeaderCellWidth();\n boundingRect.top -= s.top;\n boundingRect.left -= s.left;\n eleRect.top -= s.top;\n eleRect.left -= s.left;\n clipRect.h =\n boundingRect.top +\n boundingRect.height -\n ele.offsetTop -\n self.style.scrollBarWidth;\n clipRect.w =\n boundingRect.left +\n boundingRect.width -\n ele.offsetLeft -\n self.style.scrollBarWidth;\n clipRect.x = boundingRect.left + eleRect.left * -1 + rowHeaderCellWidth;\n clipRect.y = boundingRect.top + eleRect.top * -1 + columnHeaderCellHeight;\n return {\n x: clipRect.x > parentRect.x ? clipRect.x : parentRect.x,\n y: clipRect.y > parentRect.y ? clipRect.y : parentRect.y,\n h: clipRect.h < parentRect.h ? clipRect.h : parentRect.h,\n w: clipRect.w < parentRect.w ? clipRect.w : parentRect.w,\n };\n };\n self.clipElement = function (ele) {\n var clipRect = self.getClippingRect(ele);\n if (clipRect.w < 0) {\n clipRect.w = 0;\n }\n if (clipRect.h < 0) {\n clipRect.h = 0;\n }\n ele.style.clip =\n 'rect(' +\n clipRect.y +\n 'px,' +\n clipRect.w +\n 'px,' +\n clipRect.h +\n 'px,' +\n clipRect.x +\n 'px' +\n ')';\n // INFO https://developer.mozilla.org/en-US/docs/Web/CSS/clip\n // clip has been \"deprecated\" for clipPath. Of course nothing but chrome\n // supports clip path, so we'll keep using clip until someday clipPath becomes\n // more widely support. The code below works correctly, but setting clipPath and clip\n // at the same time has undesirable results.\n // ele.style.clipPath = 'polygon('\n // + clipRect.x + 'px ' + clipRect.y + 'px,'\n // + clipRect.x + 'px ' + clipRect.h + 'px,'\n // + clipRect.w + 'px ' + clipRect.h + 'px,'\n // + clipRect.w + 'px ' + clipRect.y + 'px'\n // + ')';\n };\n self.scrollOffset = function (e) {\n var x = 0,\n y = 0,\n scrollingElement = document.scrollingElement || {\n scrollLeft: 0,\n scrollTop: 0,\n };\n while (\n e.parentNode &&\n e.nodeName !== 'CANVAS-DATAGRID' &&\n e !== self.intf\n ) {\n if (\n e.nodeType !== 'canvas-datagrid-tree' &&\n e.nodeType !== 'canvas-datagrid-cell'\n ) {\n x -= e.scrollLeft;\n y -= e.scrollTop;\n }\n e = e.parentNode;\n }\n return {\n left: x - scrollingElement.scrollLeft,\n top: y - scrollingElement.scrollTop,\n };\n };\n self.resizeEditInput = function () {\n if (self.input && self.input.editCell) {\n var pos = self.canvas.getBoundingClientRect(),\n s = self.scrollOffset(self.intf),\n bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,\n borderWidth = self.style.cellBorderWidth * bm,\n cell = self.getVisibleCellByIndex(\n self.input.editCell.columnIndex,\n self.input.editCell.rowIndex,\n ) || { x: -100, y: -100, height: 0, width: 0 };\n if (self.mobile) {\n self.input.style.left = '0';\n self.input.style.top =\n self.height -\n self.style.mobileEditInputHeight -\n borderWidth -\n 1 +\n 'px';\n self.input.style.height = self.style.mobileEditInputHeight + 'px';\n self.input.style.width = self.width - borderWidth - 1 + 'px';\n return;\n }\n self.input.style.left =\n pos.left + cell.x + self.canvasOffsetLeft - s.left + 'px';\n self.input.style.top =\n pos.top +\n cell.y -\n self.style.cellBorderWidth +\n self.canvasOffsetTop -\n s.top +\n 'px';\n self.input.style.height = cell.height - borderWidth + 'px';\n self.input.style.width = cell.width - self.style.cellPaddingLeft + 'px';\n self.clipElement(self.input);\n }\n };\n self.position = function (e, ignoreScrollOffset) {\n var x = 0,\n y = 0,\n s = e,\n h,\n w;\n 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-button-wrapper': {\n display: 'inline-block',\n padding: self.style.buttonPadding,\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor: self.style.buttonBorderColor,\n cursor: 'pointer',\n background: self.style.buttonBackgroundColor,\n userSelect: 'none',\n },\n 'canvas-datagrid-button-wrapper:hover': {\n borderColor: self.style.buttonBorderColor,\n background: self.style.buttonHoverBackgroundColor,\n },\n 'canvas-datagrid-button-wrapper:active': {\n borderColor: self.style.buttonActiveBorderColor,\n background: self.style.buttonActiveBackgroundColor,\n },\n 'canvas-datagrid-button-icon': {\n width: '18px',\n height: '18px',\n display: 'inline-block',\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-button-arrow': {\n display: 'inline-block',\n color: self.style.buttonArrowColor,\n fontSize: '9px',\n },\n 'canvas-datagrid-button-menu-item-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-button-menu-item': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-button-menu-item:hover': {\n background: self.style.contextMenuHoverBackground,\n color: self.style.contextMenuHoverColor,\n },\n 'canvas-datagrid-button-menu-label': {\n margin: self.style.contextMenuLabelMargin,\n display: self.style.contextMenuLabelDisplay,\n minWidth: self.style.contextMenuLabelMinWidth,\n maxWidth: self.style.contextMenuLabelMaxWidth,\n },\n 'canvas-datagrid-button-menu-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n },\n 'canvas-datagrid-button-menu': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n cursor: self.style.contextMenuCursor,\n },\n 'canvas-datagrid-context-menu-filter-input': {\n height: '19px',\n verticalAlign: 'bottom',\n marginLeft: '2px',\n padding: '0',\n background: self.style.contextFilterInputBackground,\n color: self.style.contextFilterInputColor,\n border: self.style.contextFilterInputBorder,\n borderRadius: self.style.contextFilterInputBorderRadius,\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextFilterInputFontFamily,\n fontSize: self.style.contextFilterInputFontSize,\n },\n 'canvas-datagrid-context-menu-filter-button': {\n height: '19px',\n verticalAlign: 'bottom',\n marginLeft: '2px',\n padding: '0',\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextFilterButtonBorder,\n borderRadius: self.style.contextFilterButtonBorderRadius,\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFilterButtonFontFamily,\n fontSize: self.style.contextMenuFilterButtonFontSize,\n },\n 'canvas-datagrid-context-child-arrow': {\n cssFloat: 'right',\n color: self.style.childContextMenuArrowColor,\n fontSize: self.style.contextMenuChildArrowFontSize,\n fontFamily: self.style.contextMenuFontFamily,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-autocomplete': {\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n position: 'absolute',\n zIndex: 9999,\n overflow: 'hidden',\n },\n 'canvas-datagrid-autocomplete-item': {\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n },\n 'canvas-datagrid-autocomplete-item:hover': {\n background: self.style.contextMenuHoverBackground,\n color: self.style.contextMenuHoverColor,\n },\n 'canvas-datagrid-canvas': {\n position: 'absolute',\n zIndex: '-1',\n },\n 'canvas-datagrid': {\n display: 'block',\n },\n 'canvas-datagrid-control-input': {\n position: 'fixed',\n top: '-5px',\n left: '-5px',\n border: 'none',\n opacity: '0',\n cursor: 'pointer',\n width: '1px',\n height: '1px',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n },\n 'canvas-datagrid-edit-mobile-input': {\n boxSizing: 'content-box',\n outline: 'none',\n margin: '0',\n padding: '0 0 0 0',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.mobileEditFontFamily,\n fontSize: self.style.mobileEditFontSize,\n border: self.style.editCellBorder,\n color: self.style.editCellColor,\n background: self.style.editCellBackgroundColor,\n appearance: 'none',\n webkitAppearance: 'none',\n mozAppearance: 'none',\n borderRadius: '0',\n },\n 'canvas-datagrid-edit-input': {\n boxSizing: 'content-box',\n outline: 'none',\n margin: '0',\n padding: '0 0 0 ' + self.style.editCellPaddingLeft + 'px',\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.editCellFontFamily,\n fontSize: self.style.editCellFontSize,\n boxShadow: self.style.editCellBoxShadow,\n border: self.style.editCellBorder,\n color: self.style.editCellColor,\n background: self.style.editCellBackgroundColor,\n appearance: 'none',\n webkitAppearance: 'none',\n mozAppearance: 'none',\n borderRadius: '0',\n },\n 'canvas-datagrid-context-menu-item-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-context-menu-item': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n color: 'inherit',\n background: 'inherit',\n margin: self.style.contextMenuItemMargin,\n borderRadius: self.style.contextMenuItemBorderRadius,\n verticalAlign: 'middle',\n },\n 'canvas-datagrid-context-menu-item:hover': {\n background: self.style.contextMenuHoverBackground,\n color: self.style.contextMenuHoverColor,\n },\n 'canvas-datagrid-context-menu-label': {\n margin: self.style.contextMenuLabelMargin,\n display: self.style.contextMenuLabelDisplay,\n minWidth: self.style.contextMenuLabelMinWidth,\n maxWidth: self.style.contextMenuLabelMaxWidth,\n },\n 'canvas-datagrid-context-menu-mobile': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n },\n 'canvas-datagrid-context-menu': {\n lineHeight: 'normal',\n fontWeight: 'normal',\n fontFamily: self.style.contextMenuFontFamily,\n fontSize: self.style.contextMenuFontSize,\n background: self.style.contextMenuBackground,\n color: self.style.contextMenuColor,\n border: self.style.contextMenuBorder,\n padding: self.style.contextMenuPadding,\n borderRadius: self.style.contextMenuBorderRadius,\n opacity: self.style.contextMenuOpacity,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n cursor: self.style.contextMenuCursor,\n },\n 'canvas-datagrid-invalid-search-regExp': {\n background: self.style.contextMenuFilterInvalidExpresion,\n },\n };\n if (css[className]) {\n Object.keys(css[className]).map(function (prop) {\n el.style[prop] = css[className][prop];\n });\n }\n return;\n };\n self.appendTo = function (e) {\n self.parentNode = e;\n self.setDom();\n };\n self.setDom = function () {\n if (self.isChildGrid) {\n self.parentGrid = self.parentNode.parentGrid;\n self.ctx = self.parentGrid.context;\n self.canvas = self.parentGrid.canvas;\n self.controlInput = self.parentGrid.controlInput;\n self.eventParent = self.canvas;\n } else {\n self.controlInput = self.controlInput || document.createElement('input');\n self.controlInput.onblur = self.intf.blur;\n self.createInlineStyle(\n self.controlInput,\n 'canvas-datagrid-control-input',\n );\n self.isChildGrid = false;\n self.parentDOMNode = self.parentNode;\n self.parentIsCanvas = /^canvas$/i.test(self.parentDOMNode.tagName);\n if (self.parentIsCanvas) {\n self.canvas = self.parentDOMNode;\n } else {\n self.canvas = document.createElement('canvas');\n self.parentDOMNode.appendChild(self.canvas);\n }\n document.body.appendChild(self.controlInput);\n self.createInlineStyle(self.canvas, 'canvas-datagrid');\n self.ctx = self.canvas.getContext('2d');\n self.ctx.textBaseline = 'alphabetic';\n self.eventParent = self.canvas;\n }\n self.parentNodeStyle = self.canvas.style;\n self.controlInput.setAttribute('readonly', true);\n self.controlInput.addEventListener('blur', function (e) {\n if (e.target !== self.canvas) {\n self.hasFocus = false;\n }\n });\n self.eventParent.addEventListener('scroll', self.resize, false);\n self.eventParent.addEventListener('touchstart', self.touchstart, false);\n self.eventParent.addEventListener('mouseup', self.mouseup, false);\n self.eventParent.addEventListener('mousedown', self.mousedown, false);\n self.eventParent.addEventListener('dblclick', self.dblclick, false);\n self.eventParent.addEventListener('click', self.click, false);\n document.body.addEventListener('mousemove', self.mousemove);\n self[self.isChildGrid ? 'parentGrid' : 'eventParent'].addEventListener(\n 'wheel',\n self.scrollWheel,\n false,\n );\n self.canvas.addEventListener('contextmenu', self.contextmenuEvent, false);\n self.controlInput.addEventListener('copy', self.copy);\n self.controlInput.addEventListener('cut', self.cut);\n self.controlInput.addEventListener('paste', self.paste);\n self.controlInput.addEventListener('keypress', self.keypress, false);\n self.controlInput.addEventListener('keyup', self.keyup, false);\n self.controlInput.addEventListener('keydown', self.keydown, false);\n window.addEventListener('resize', self.resize);\n };\n}\n","/*jslint browser: true, unparam: true, todo: true*/\n/*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nexport default function (self) {\n /**\n * Converts a integer into a letter A - ZZZZZ...\n * @memberof canvasDatagrid\n * @name integerToAlpha\n * @method\n * @param {column} n The number to convert.\n */\n self.integerToAlpha = function (n) {\n var ordA = 'a'.charCodeAt(0),\n ordZ = 'z'.charCodeAt(0),\n len = ordZ - ordA + 1,\n s = '';\n while (n >= 0) {\n s = String.fromCharCode((n % len) + ordA) + s;\n n = Math.floor(n / len) - 1;\n }\n return s;\n };\n /**\n * Inserts a new column before the specified index into the schema.\n * @tutorial schema\n * @memberof canvasDatagrid\n * @name insertColumn\n * @method\n * @param {column} c The column to insert into the schema.\n * @param {number} index The index of the column to insert before.\n */\n self.insertColumn = function (c, index) {\n var s = self.getSchema();\n if (s.length < index) {\n throw new Error('Index is beyond the length of the schema.');\n }\n self.validateColumn(c, s);\n s.splice(index, 0, c);\n\n self.originalData.forEach(function (row, rowIndex) {\n self.applyDefaultValue(row, c, rowIndex);\n });\n self.intf.schema = s;\n\n self.refresh();\n };\n /**\n * Deletes a column from the schema at the specified index.\n * @memberof canvasDatagrid\n * @name deleteColumn\n * @tutorial schema\n * @method\n * @param {number} index The index of the column to delete.\n */\n self.deleteColumn = function (index) {\n var schema = self.getSchema();\n\n // remove data matching this column name from data\n self.originalData.forEach(function (row) {\n delete row[schema[index].name];\n });\n\n schema.splice(index, 1);\n self.intf.schema = schema;\n\n self.refresh();\n };\n /**\n * Adds a new column into the schema.\n * @tutorial schema\n * @memberof canvasDatagrid\n * @name addColumn\n * @method\n * @param {column} c The column to add to the schema.\n */\n self.addColumn = function (c) {\n var s = self.getSchema();\n self.validateColumn(c, s);\n s.push(c);\n self.originalData.forEach(function (row, rowIndex) {\n self.applyDefaultValue(row, c, rowIndex);\n });\n self.intf.schema = s;\n\n self.refresh();\n };\n /**\n * Deletes a row from the dataset at the specified index.\n * @memberof canvasDatagrid\n * @name deleteRow\n * @method\n * @param {number} index The index of the row to delete.\n */\n self.deleteRow = function (index) {\n self.originalData.splice(index, 1);\n self.setFilter();\n self.resize(true);\n };\n /**\n * Inserts a new row into the dataset before the specified index.\n * @memberof canvasDatagrid\n * @name insertRow\n * @method\n * @param {object} d data.\n * @param {number} index The index of the row to insert before.\n */\n self.insertRow = function (d, index) {\n if (self.originalData.length < index) {\n throw new Error('Index is beyond the length of the dataset.');\n }\n self.originalData.splice(index, 0, d);\n self.getSchema().forEach(function (c) {\n if (d[c.name] === undefined) {\n self.applyDefaultValue(self.originalData[index], c, index);\n }\n });\n\n // setFilter calls .refresh(), so we need not call it again:\n self.setFilter();\n\n self.resize(true);\n };\n /**\n * Adds a new row into the dataset.\n * @memberof canvasDatagrid\n * @name addRow\n * @method\n * @param {object} d data.\n */\n self.addRow = function (d) {\n self.originalData.push(d);\n self.getSchema().forEach(function (c) {\n if (d[c.name] === undefined) {\n self.applyDefaultValue(\n self.originalData[self.originalData.length - 1],\n c,\n self.originalData.length - 1,\n );\n }\n });\n\n // setFilter calls .refresh(), so we need not call it again:\n self.setFilter();\n\n self.resize(true);\n };\n /**\n * Sets the height of a given row by index number.\n * @memberof canvasDatagrid\n * @name setRowHeight\n * @method\n * @param {number} rowIndex The index of the row to set.\n * @param {number} height Height to set the row to.\n */\n self.setRowHeight = function (rowIndex, height) {\n self.sizes.rows[rowIndex] = height;\n self.draw(true);\n };\n /**\n * Sets the width of a given column by index number.\n * @memberof canvasDatagrid\n * @name setColumnWidth\n * @method\n * @param {number} colIndex The index of the column to set.\n * @param {number} width Width to set the column to.\n */\n self.setColumnWidth = function (colIndex, width) {\n self.sizes.columns[colIndex] = width;\n self.draw(true);\n };\n /**\n * Removes any changes to the width of the columns due to user or api interaction, setting them back to the schema or style default.\n * @memberof canvasDatagrid\n * @name resetColumnWidths\n * @tutorial schema\n * @method\n */\n self.resetColumnWidths = function () {\n self.sizes.columns = {};\n self.draw(true);\n };\n /**\n * Removes any changes to the height of the rows due to user or api interaction, setting them back to the schema or style default.\n * @memberof canvasDatagrid\n * @name resetRowHeights\n * @tutorial schema\n * @method\n */\n self.resetRowHeights = function () {\n self.sizes.rows = {};\n self.draw(true);\n };\n /**\n * Sets the value of the filter.\n * @memberof canvasDatagrid\n * @name setFilter\n * @method\n * @param {string} column Name of the column to filter.\n * @param {string} value The value to filter for.\n */\n self.setFilter = function (column, value) {\n if (column === undefined && value === undefined) {\n self.columnFilters = {};\n } else if (column && (value === '' || value === undefined)) {\n delete self.columnFilters[column];\n } else {\n self.columnFilters[column] = value;\n if (self.attributes.showFilterInCell) {\n self.filterable.rows.push(0);\n self.orders.columns.forEach(function (value, index) {\n self.filterable.columns.push(index);\n });\n }\n }\n if (!Object.keys(self.columnFilters).length) {\n self.filterable = {\n rows: [],\n columns: [],\n };\n }\n self.refresh();\n };\n /**\n * Returns the number of pixels to scroll down to line up with row rowIndex.\n * @memberof canvasDatagrid\n * @name findRowScrollTop\n * @method\n * @param {number} rowIndex The row index of the row to scroll find.\n */\n self.findRowScrollTop = function (rowIndex) {\n if (self.scrollCache.y[rowIndex] === undefined) {\n throw new RangeError(\n `Row index ${rowIndex} out of range: ${self.scrollCache.y.length}.`,\n );\n }\n return self.scrollCache.y[rowIndex];\n };\n /**\n * Returns the number of pixels to scroll to the left to line up with column columnIndex.\n * @memberof canvasDatagrid\n * @name findColumnScrollLeft\n * @method\n * @param {number} columnIndex The column index of the column to find.\n */\n self.findColumnScrollLeft = function (columnIndex) {\n var i = Math.max(columnIndex - 1, 0);\n if (self.scrollCache.x[i] === undefined) {\n throw new Error('Column index out of range.');\n }\n return (\n self.scrollCache.x[i] -\n self.getColumnWidth(self.orders.columns[columnIndex])\n );\n };\n /**\n * Scrolls to the cell at columnIndex x, and rowIndex y. If you define both rowIndex and columnIndex additional calculations can be made to center the cell using the target cell's height and width. Defining only one rowIndex or only columnIndex will result in simpler calculations.\n * @memberof canvasDatagrid\n * @name gotoCell\n * @method\n * @param {number} x The column index of the cell to scroll to.\n * @param {number} y The row index of the cell to scroll to.\n * @param {number} [offsetX=0] Percentage offset the cell should be from the left edge (not including headers). The default is 0, meaning the cell will appear at the left edge. Valid values are 0 through 1. 1 = Left, 0 = Right, 0.5 = Center.\n * @param {number} [offsetY=0] Percentage offset the cell should be from the top edge (not including headers). The default is 0, meaning the cell will appear at the top edge. Valid values are 0 through 1. 1 = Bottom, 0 = Top, 0.5 = Center.\n */\n self.gotoCell = function (x, y, offsetX, offsetY) {\n var targetX = x === undefined ? undefined : self.findColumnScrollLeft(x),\n targetY = y === undefined ? undefined : self.findRowScrollTop(y),\n cell,\n sbw =\n self.scrollBox.width -\n (self.scrollBox.verticalBarVisible ? self.style.scrollBarWidth : 0),\n sbh =\n self.scrollBox.height -\n (self.scrollBox.horizontalBarVisible ? self.style.scrollBarWidth : 0);\n offsetX = offsetX === undefined ? 0 : offsetX;\n offsetY = offsetY === undefined ? 0 : offsetY;\n targetX -= sbw * offsetX;\n targetY -= sbh * offsetY;\n if (x !== undefined && y !== undefined) {\n self.scrollBox.scrollTo(targetX, targetY);\n requestAnimationFrame(function () {\n cell = self.getVisibleCellByIndex(x, y);\n // HACK: just don't offset if the target cell cannot be seen\n // TODO: offset does not work on very small grids, not sure why\n if (!cell) {\n return;\n }\n targetX += cell.width * offsetX;\n targetY += cell.height * offsetY;\n self.scrollBox.scrollTo(targetX, targetY);\n });\n } else if (x !== undefined) {\n self.scrollBox.scrollLeft = targetX;\n } else if (y !== undefined) {\n self.scrollBox.scrollTop = targetY;\n }\n };\n /**\n * Scrolls the row y.\n * @memberof canvasDatagrid\n * @name gotoRow\n * @method\n * @param {number} y The row index of the cell to scroll to.\n */\n self.gotoRow = function (y) {\n self.gotoCell(0, y);\n };\n /**\n * Add a button into the cell.\n * @memberof canvasDatagrid\n * @name addButton\n * @method\n * @param {number} columnIndex The column index of the cell to to add a button.\n * @param {number} rowIndex The row index of the cell to to add a button.\n * @param {object} offset Offset how far go away from cell.\n * @param {object} items a list of items to add into button menu.\n * @param {string} imgSrc icon path to add into button.\n */\n self.addButton = function (columnIndex, rowIndex, offset, items, imgSrc) {\n var cells = self.visibleCells.filter(function (c) {\n return c.sortColumnIndex === columnIndex && c.sortRowIndex === rowIndex;\n });\n\n self.attachButton(\n {\n top: cells[0].y + cells[0].height + offset.y,\n left: cells[0].x + cells[0].width + offset.x,\n },\n items,\n imgSrc,\n );\n };\n /**\n * Scrolls the cell at cell x, row y into view if it is not already.\n * @memberof canvasDatagrid\n * @name scrollIntoView\n * @method\n * @param {number} x The column index of the cell to scroll into view.\n * @param {number} y The row index of the cell to scroll into view.\n * @param {number} [offsetX=0] Percentage offset the cell should be from the left edge (not including headers). The default is 0, meaning the cell will appear at the left edge. Valid values are 0 through 1. 1 = Left, 0 = Right, 0.5 = Center.\n * @param {number} [offsetY=0] Percentage offset the cell should be from the top edge (not including headers). The default is 0, meaning the cell will appear at the top edge. Valid values are 0 through 1. 1 = Bottom, 0 = Top, 0.5 = Center.\n */\n self.scrollIntoView = function (x, y, offsetX, offsetY) {\n 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 indices of columns next to the selected columnIndex is selected on every row.\n * @memberof canvasDatagrid\n * @name isMultiColumnsSelected\n * @method\n * @param {number} columnIndex The column index to check.\n */\n self.isMultiColumnsSelected = function (columnIndex) {\n var multiColIsSelected = true;\n self.viewData.forEach(function (row, rowIndex) {\n var columnIndices = self.selections[rowIndex];\n if (\n !columnIndices ||\n columnIndices.length <= 1 ||\n columnIndices.indexOf(columnIndex) === -1\n ) {\n multiColIsSelected = false;\n } else if (columnIndices.length > 1) {\n if (columnIndices[0] != columnIndex) multiColIsSelected = false;\n else {\n for (var i = 0; i < columnIndices.length - 1; i++) {\n if (columnIndices[i] + 1 != columnIndices[i + 1]) {\n multiColIsSelected = false;\n break;\n }\n }\n }\n }\n });\n return multiColIsSelected;\n };\n /**\n * Returns true if the selected columnIndex is selected on every row.\n * @memberof canvasDatagrid\n * @name isColumnSelected\n * @method\n * @param {number} columnIndex The column index to check.\n */\n self.isColumnSelected = function (columnIndex) {\n var colIsSelected = true;\n self.viewData.forEach(function (row, rowIndex) {\n if (\n !self.selections[rowIndex] ||\n self.selections[rowIndex].indexOf(columnIndex) === -1\n ) {\n colIsSelected = false;\n }\n });\n return colIsSelected;\n };\n /**\n * Runs the defined method on each selected cell.\n * @memberof canvasDatagrid\n * @name forEachSelectedCell\n * @method\n * @param {number} fn The function to execute. The signature of the function is: (data, rowIndex, columnName).\n * @param {number} expandToRow When true the data in the array is expanded to the entire row.\n */\n self.forEachSelectedCell = function (fn, expandToRow) {\n var d = [],\n s = expandToRow ? self.getSchema() : self.getVisibleSchema(),\n l = self.viewData.length;\n self.selections.forEach(function (row, index) {\n if (index === l) {\n return;\n }\n if (row.length === 0) {\n d[index] = null;\n return;\n }\n d[index] = {};\n row.forEach(function (col) {\n if (col === -1 || !s[col]) {\n return;\n }\n fn(self.viewData, index, s[col].name);\n });\n });\n };\n /**\n * Selects a column.\n * @memberof canvasDatagrid\n * @name selectColumn\n * @method\n * @param {number} columnIndex The column index to select.\n * @param {boolean} toggleSelectMode When true, behaves as if you were holding control/command when you clicked the column.\n * @param {boolean} shift When true, behaves as if you were holding shift when you clicked the column.\n * @param {boolean} supressSelectionchangedEvent When true, prevents the selectionchanged event from firing.\n */\n self.selectColumn = function (columnIndex, ctrl, shift, supressEvent) {\n var s, e, x;\n function addCol(i) {\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = self.selections[rowIndex] || [];\n if (self.selections[rowIndex].indexOf(i) === -1) {\n self.selections[rowIndex].push(i);\n }\n });\n }\n function removeCol(i) {\n self.viewData.forEach(function (row, rowIndex) {\n self.selections[rowIndex] = self.selections[rowIndex] || [];\n if (self.selections[rowIndex].indexOf(i) !== -1) {\n self.selections[rowIndex].splice(\n self.selections[rowIndex].indexOf(i),\n 1,\n );\n }\n });\n }\n if (shift) {\n if (!self.activeCell) {\n return;\n }\n s = Math.min(self.activeCell.columnIndex, columnIndex);\n e = Math.max(self.activeCell.columnIndex, columnIndex);\n for (x = s; e > x; x += 1) {\n addCol(x);\n }\n }\n if (!ctrl && !shift) {\n self.selections = [];\n self.activeCell.columnIndex = columnIndex;\n self.activeCell.rowIndex = self.scrollIndexTop;\n }\n if (ctrl && self.isColumnSelected(columnIndex)) {\n removeCol(columnIndex);\n } else {\n addCol(columnIndex);\n }\n if (supressEvent) {\n return;\n }\n self.dispatchEvent('selectionchanged', {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.getSelectionBounds(),\n selectedCells: self.getSelectedCells(),\n });\n };\n /**\n * Selects a row.\n * @memberof canvasDatagrid\n * @name selectRow\n * @method\n * @param {number} rowIndex The row index to select.\n * @param {boolean} ctrl When true, behaves as if you were holding control/command when you clicked the row.\n * @param {boolean} shift When true, behaves as if you were holding shift when you clicked the row.\n * @param {boolean} supressSelectionchangedEvent When true, prevents the selectionchanged event from firing.\n */\n self.selectRow = function (rowIndex, ctrl, shift, supressEvent) {\n var x,\n st,\n en,\n s = self.getVisibleSchema();\n self.isMultiRowsSelected = false;\n function de() {\n if (supressEvent) {\n return;\n }\n self.dispatchEvent('selectionchanged', {\n selectedData: self.getSelectedData(),\n selections: self.selections,\n selectionBounds: self.selectionBounds,\n selectedCells: self.getSelectedCells(),\n });\n }\n function addRow(ri) {\n self.selections[ri] = [];\n self.selections[ri].push(-1);\n s.forEach(function (col, index) {\n self.selections[ri].push(self.orders.columns.indexOf(col.index));\n });\n }\n if (self.dragAddToSelection === false || self.dragObject === undefined) {\n if (\n self.selections[rowIndex] &&\n self.selections[rowIndex].length - 1 === s.length\n ) {\n if (ctrl) {\n self.selections[rowIndex] = [];\n de();\n return;\n }\n }\n }\n if (self.dragAddToSelection === true || self.dragObject === undefined) {\n if (shift && self.dragObject === undefined) {\n if (!self.activeCell) {\n return;\n }\n st = Math.min(self.activeCell.rowIndex, rowIndex);\n en = Math.max(self.activeCell.rowIndex, rowIndex);\n for (x = st; en >= x; x += 1) {\n addRow(x);\n }\n } else {\n addRow(rowIndex);\n }\n }\n de();\n };\n /**\n * Collapse a tree grid by row index.\n * @memberof canvasDatagrid\n * @name collapseTree\n * @method\n * @param {number} index The index of the row to collapse.\n */\n self.collapseTree = function (rowIndex) {\n self.dispatchEvent('collapsetree', {\n childGrid: self.childGrids[rowIndex],\n data: self.viewData[rowIndex],\n rowIndex: rowIndex,\n });\n self.openChildren[rowIndex].blur();\n self.openChildren[rowIndex].dispose();\n delete self.openChildren[rowIndex];\n delete self.sizes.trees[rowIndex];\n delete self.childGrids[rowIndex];\n self.dispatchEvent('resizerow', {\n cellHeight: self.style.cellHeight,\n });\n self.resize(true);\n self.draw(true);\n };\n /**\n * Expands a tree grid by row index.\n * @memberof canvasDatagrid\n * @name expandTree\n * @method\n * @param {number} index The index of the row to expand.\n */\n self.expandTree = function (rowIndex) {\n var trArgs = self.args.treeGridAttributes || {},\n columnHeaderCellHeight = self.getColumnHeaderCellHeight(),\n rowHeaderCellWidth =\n self.sizes.columns.cornerCell || self.style.rowHeaderCellWidth,\n h = self.sizes.trees[rowIndex] || self.style.treeGridHeight,\n treeGrid;\n if (!self.childGrids[rowIndex]) {\n trArgs.debug = self.attributes.debug;\n trArgs.name = self.attributes.saveAppearance\n ? self.attributes.name + 'tree' + rowIndex\n : undefined;\n trArgs.style = trArgs.style || self.style;\n trArgs.parentNode = {\n parentGrid: self.intf,\n nodeType: 'canvas-datagrid-tree',\n offsetHeight: h,\n offsetWidth: self.width - rowHeaderCellWidth,\n header: { width: self.width - rowHeaderCellWidth },\n offsetLeft: rowHeaderCellWidth,\n offsetTop: columnHeaderCellHeight,\n offsetParent: self.intf.parentNode,\n parentNode: self.intf.parentNode,\n style: 'tree',\n data: self.viewData[rowIndex],\n };\n treeGrid = self.createGrid(trArgs);\n self.childGrids[rowIndex] = treeGrid;\n }\n treeGrid = self.childGrids[rowIndex];\n treeGrid.visible = true;\n self.dispatchEvent('expandtree', {\n treeGrid: treeGrid,\n data: self.viewData[rowIndex],\n rowIndex: rowIndex,\n });\n self.openChildren[rowIndex] = treeGrid;\n self.sizes.trees[rowIndex] = h;\n self.dispatchEvent('resizerow', { height: self.style.cellHeight });\n self.resize(true);\n };\n /**\n * Toggles tree grid open and close by row index.\n * @memberof canvasDatagrid\n * @name toggleTree\n * @method\n * @param {number} index The index of the row to toggle.\n */\n self.toggleTree = function (rowIndex) {\n var i = self.openChildren[rowIndex];\n if (i) {\n return self.collapseTree(rowIndex);\n }\n self.expandTree(rowIndex);\n };\n /**\n * Returns a header from the schema by name.\n * @memberof canvasDatagrid\n * @name getHeaderByName\n * @tutorial schema\n * @method\n * @returns {header} header with the selected name, or undefined.\n * @param {string} name The name of the column to resize.\n */\n self.getHeaderByName = function (name) {\n var x,\n i = self.getSchema();\n for (x = 0; x < i.length; x += 1) {\n if (i[x].name === name) {\n return i[x];\n }\n }\n };\n /**\n * Resizes a column to fit the longest value in the column. Call without a value to resize all columns.\n * Warning, can be slow on very large record sets (1m records ~3-5 seconds on an i7).\n * @memberof canvasDatagrid\n * @name fitColumnToValues\n * @method\n * @param {string} name The name of the column to resize.\n */\n self.fitColumnToValues = function (name, internal) {\n if (!self.canvas) {\n return;\n }\n\n const columnIndex =\n name === 'cornerCell' ? -1 : self.getHeaderByName(name).index;\n\n const newSize = Math.max(\n self.findColumnMaxTextLength(name),\n self.style.minColumnWidth,\n );\n\n self.sizes.columns[columnIndex] = newSize;\n\n self.dispatchEvent('resizecolumn', {\n x: newSize,\n y: self.resizingStartingHeight,\n draggingItem: self.currentCell,\n });\n\n if (!internal) {\n self.resize();\n self.draw(true);\n }\n };\n /**\n * Checks if a cell is currently visible.\n * @memberof canvasDatagrid\n * @name isCellVisible\n * @overload\n * @method\n * @returns {boolean} when true, the cell is visible, when false the cell is not currently drawn.\n * @param {number} columnIndex The column index of the cell to check.\n * @param {number} rowIndex The row index of the cell to check.\n */\n self.isCellVisible = function (cell, rowIndex) {\n // overload\n if (rowIndex !== undefined) {\n return (\n self.visibleCells.filter(function (c) {\n return c.columnIndex === cell && c.rowIndex === rowIndex;\n }).length > 0\n );\n }\n var x,\n l = self.visibleCells.length;\n for (x = 0; x < l; x += 1) {\n if (\n cell.x === self.visibleCells[x].x &&\n cell.y === self.visibleCells[x].y\n ) {\n return true;\n }\n }\n return false;\n };\n /**\n * Sets the order of the data.\n * @memberof canvasDatagrid\n * @name order\n * @method\n * @param {number} columnName Name of the column to be sorted.\n * @param {string} direction `asc` for ascending or `desc` for descending.\n * @param {function} [sortFunction] When defined, override the default sorting method defined in the column's schema and use this one.\n * @param {bool} [dontSetStorageData] Don't store this setting for future use.\n */\n self.order = function (\n columnName,\n direction,\n sortFunction,\n dontSetStorageData,\n ) {\n var f,\n c = self.getSchema().filter(function (col) {\n return col.name === columnName;\n });\n if (\n self.dispatchEvent('beforesortcolumn', {\n name: columnName,\n direction: direction,\n })\n ) {\n return;\n }\n self.orderBy = columnName;\n self.orderDirection = direction;\n if (!self.viewData || self.viewData.length === 0) {\n return;\n }\n if (c.length === 0) {\n throw new Error('Cannot sort. No such column name');\n }\n f = sortFunction || c[0].sorter || self.sorters[c[0].type];\n if (!f && c[0].type !== undefined) {\n console.warn(\n 'Cannot sort type \"%s\" falling back to string sort.',\n c[0].type,\n );\n }\n self.orderings.add(\n columnName,\n direction,\n typeof f === 'function' ? f : self.sorters.string,\n );\n self.refresh();\n self.dispatchEvent('sortcolumn', {\n name: columnName,\n direction: direction,\n });\n\n if (dontSetStorageData) {\n return;\n }\n self.setStorageData();\n };\n self.isInGrid = function (e) {\n if (e.x < 0 || e.x > self.width || e.y < 0 || e.y > self.height) {\n return false;\n }\n return true;\n };\n /**\n * Moves the current selection relative to the its current position. Note: this method does not move the selected data, just the selection itself.\n * @memberof canvasDatagrid\n * @name moveSelection\n * @method\n * @param {number} offsetX The number of columns to offset the selection.\n * @param {number} offsetY The number of rows to offset the selection.\n */\n self.moveSelection = function (offsetX, offsetY) {\n var sel = [];\n self.selections.forEach(function (row, rowIndex) {\n sel[rowIndex + offsetY] = [];\n row.forEach(function (colIndex) {\n sel[rowIndex + offsetY].push(colIndex + offsetX);\n });\n });\n self.selections = sel;\n };\n /**\n * Deletes currently selected data.\n * @memberof canvasDatagrid\n * @name deleteSelectedData\n * @method\n * @param {boolean} dontDraw Suppress the draw method after the selection change.\n */\n self.deleteSelectedData = function (dontDraw) {\n const affectedCells = self.clearSelectedCells();\n\n self.dispatchEvent('afterdelete', {\n cells: affectedCells,\n });\n\n if (dontDraw) {\n return;\n }\n\n requestAnimationFrame(() => self.draw());\n };\n /**\n * Moves data in the provided selection to another position in the grid. Moving data off the edge of the schema (columns/x) will truncate data.\n * @memberof canvasDatagrid\n * @name moveTo\n * @method\n * @param {array} sel 2D array representing selected rows and columns. `canvasDatagrid.selections` is in this format and can be used here.\n * @param {number} x The column index to start inserting the selection at.\n * @param {number} y The row index to start inserting the selection at.\n */\n self.moveTo = function (sel, x, y) {\n var selectedData = self.getSelectedData(),\n visibleSchema = self.getVisibleSchema(),\n selectionLength = sel.length,\n xi,\n maxRowLength = -Infinity,\n minXi = Infinity,\n yi = y - 1;\n\n sel.forEach(function (row, rowIndex) {\n if (rowIndex === selectionLength) {\n return;\n }\n if (row.length === 0) {\n return;\n }\n minXi = Math.min(self.getVisibleColumnIndexOf(x), minXi);\n maxRowLength = Math.max(maxRowLength, row.length);\n row.forEach(function (colIndex) {\n // intentional redef of colIndex\n colIndex = self.getVisibleColumnIndexOf(colIndex);\n if (!visibleSchema[colIndex]) {\n return;\n }\n // TODO:\n if (!self.data[rowIndex]) {\n self.data[rowIndex] = {};\n }\n // TODO:\n self.data[rowIndex][visibleSchema[colIndex].name] = null;\n });\n });\n\n sel.forEach(function (row, index) {\n var lastSourceIndex;\n yi += 1;\n xi = self.getVisibleColumnIndexOf(x);\n row.forEach(function (colIndex, cidx) {\n colIndex = self.getVisibleColumnIndexOf(colIndex);\n if (cidx > 0) {\n // this confusing bit of nonsense figures out\n // if the selection has skipped cells\n xi += colIndex - lastSourceIndex;\n }\n lastSourceIndex = colIndex;\n if (\n colIndex === -1 ||\n !visibleSchema[xi] ||\n !visibleSchema[colIndex] ||\n // TODO:\n self.data.length - 1 < yi ||\n yi < 0\n ) {\n return;\n }\n // TODO:\n if (!self.data[yi]) {\n self.data[yi] = {};\n }\n // TODO:\n self.data[yi][visibleSchema[xi].name] =\n selectedData[index][visibleSchema[colIndex].name];\n });\n });\n };\n /**\n * Checks if a given column is visible.\n * @memberof canvasDatagrid\n * @name isColumnVisible\n * @method\n * @returns {boolean} When true, the column is visible.\n * @param {number} columnIndex Column index.\n */\n self.isColumnVisible = function (columnIndex) {\n return (\n self.visibleCells.filter(function (c) {\n return c.columnIndex === columnIndex;\n }).length > 0\n );\n };\n /**\n * Checks if a given row is visible.\n * @memberof canvasDatagrid\n * @name isRowVisible\n * @method\n * @returns {boolean} When true, the row is visible.\n * @param {number} rowIndex Row index.\n */\n self.isRowVisible = function (rowIndex) {\n return (\n self.visibleCells.filter(function (c) {\n return c.rowIndex === rowIndex;\n }).length > 0\n );\n };\n /**\n * Gets the cell at columnIndex and rowIndex.\n * @memberof canvasDatagrid\n * @name getVisibleCellByIndex\n * @method\n * @returns {cell} cell at the selected location.\n * @param {number} x Column index.\n * @param {number} y Row index.\n */\n self.getVisibleCellByIndex = function (x, y) {\n return self.visibleCells.filter(function (c) {\n return c.columnIndex === x && c.rowIndex === y;\n })[0];\n };\n /**\n * Gets the cell at grid pixel coordinate x and y. Author's note. This function ties drawing and events together. This is a very complex function and is core to the component.\n * @memberof canvasDatagrid\n * @name getCellAt\n * @method\n * @returns {cell} cell at the selected location.\n * @param {number} x Number of pixels from the left.\n * @param {number} y Number of pixels from the top.\n */\n self.getCellAt = function (x, y, useTouchScrollZones) {\n function getBorder(entitiy) {\n if (\n entitiy.x + entitiy.width - self.attributes.borderResizeZone * 0.4 <\n x &&\n entitiy.x + entitiy.width + self.attributes.borderResizeZone * 0.6 > x\n ) {\n return 'r';\n }\n if (\n entitiy.x - self.attributes.borderResizeZone * 0.4 < x &&\n entitiy.x + self.attributes.borderResizeZone * 0.6 > x\n ) {\n return 'l';\n }\n if (\n entitiy.y + entitiy.height - self.attributes.borderResizeZone * 0.4 <\n y &&\n entitiy.y + entitiy.height + self.attributes.borderResizeZone * 0.6 > y\n ) {\n return 'b';\n }\n if (\n entitiy.y - self.attributes.borderResizeZone * 0.4 < y &&\n entitiy.y + self.attributes.borderResizeZone * 0.6 > y\n ) {\n return 't';\n }\n }\n if (!self.visibleCells) {\n return;\n }\n var border,\n tsz = useTouchScrollZones ? self.attributes.touchScrollZone : 0,\n moveMode = self.attributes.borderDragBehavior === 'move',\n i,\n l = self.visibleCells.length,\n moveBorder,\n xBorderBehavior = moveMode ? self.cursorGrab : 'ew-resize',\n yBorderBehavior = moveMode ? self.cursorGrab : 'ns-resize',\n cell,\n entitiy;\n if (!self.visibleCells || !self.visibleCells.length) {\n return;\n }\n self.hasFocus = true;\n if (!(y < self.height && y > 0 && x < self.width && x > 0)) {\n self.hasFocus = false;\n return {\n dragContext: 'inherit',\n context: 'inherit',\n };\n }\n for (i = 0; i < l; i += 1) {\n cell = self.visibleCells[i];\n // interactive dimensions of the cell. used for touch \"over size\" zones\n entitiy = {\n x: cell.x,\n y: cell.y,\n height: cell.height,\n width: cell.width,\n };\n if (\n useTouchScrollZones &&\n /(vertical|horizontal)-scroll-/.test(cell.style)\n ) {\n entitiy.x -= tsz;\n entitiy.y -= tsz;\n entitiy.height += tsz;\n entitiy.width += tsz;\n }\n if (\n entitiy.x - self.style.cellBorderWidth < x &&\n entitiy.x + entitiy.width + self.style.cellBorderWidth > x &&\n entitiy.y - self.style.cellBorderWidth < y &&\n entitiy.y + entitiy.height + self.style.cellBorderWidth > y\n ) {\n if (/frozen-row-marker/.test(cell.style)) {\n cell.dragContext = cell.style;\n cell.context = 'row-resize';\n return cell;\n }\n if (/frozen-column-marker/.test(cell.style)) {\n cell.dragContext = cell.style;\n cell.context = 'col-resize';\n return cell;\n }\n if (/selection-handle-/.test(cell.style)) {\n cell.dragContext = cell.style;\n cell.context = 'crosshair';\n return cell;\n }\n if (/vertical-scroll-(bar|box)/.test(cell.style)) {\n cell.dragContext = 'vertical-scroll-box';\n cell.context = 'vertical-scroll-box';\n cell.isScrollBar = true;\n cell.isVerticalScrollBar = true;\n if (y > self.scrollBox.box.v.y + self.scrollBox.scrollBoxHeight) {\n cell.dragContext = 'vertical-scroll-bottom';\n cell.context = 'vertical-scroll-bottom';\n } else if (y < self.scrollBox.box.v.y) {\n cell.dragContext = 'vertical-scroll-top';\n cell.context = 'vertical-scroll-top';\n }\n self.cursor = 'default';\n return cell;\n }\n if (/horizontal-scroll-(bar|box)/.test(cell.style)) {\n cell.dragContext = 'horizontal-scroll-box';\n cell.context = 'horizontal-scroll-box';\n cell.isScrollBar = true;\n cell.isHorizontalScrollBar = true;\n if (x > self.scrollBox.box.h.x + self.scrollBox.scrollBoxWidth) {\n cell.dragContext = 'horizontal-scroll-right';\n cell.context = 'horizontal-scroll-right';\n } else if (x < self.scrollBox.box.h.x) {\n cell.dragContext = 'horizontal-scroll-left';\n cell.context = 'horizontal-scroll-left';\n }\n self.cursor = 'default';\n return cell;\n }\n border = getBorder(entitiy);\n // check if the border of this cell is the border of the selection and if so show move cursor in move mode\n moveBorder =\n moveMode &&\n cell.selectionBorder &&\n cell.selectionBorder.indexOf(border) !== -1;\n if (\n ['l', 'r'].indexOf(border) !== -1 &&\n (self.attributes.allowColumnResize || moveBorder) &&\n ((self.attributes.allowColumnResizeFromCell && cell.isNormal) ||\n !cell.isNormal ||\n moveBorder) &&\n ((self.attributes.allowRowHeaderResize &&\n (cell.isRowHeader || cell.isCorner)) ||\n !(cell.isRowHeader && cell.isCorner))\n ) {\n if (\n (cell.isColumnHeader ||\n cell.isCorner ||\n (self.attributes.allowColumnResizeFromCell && cell.isNormal)) &&\n border === 'r'\n ) {\n cell.context = 'ew-resize';\n cell.dragContext = 'ew-resize';\n return cell;\n }\n if (!(cell.isColumnHeader || cell.isCorner) && moveBorder) {\n cell.context = xBorderBehavior;\n cell.dragContext = border + '-move';\n return cell;\n }\n }\n if (\n ['t', 'b'].indexOf(border) !== -1 &&\n cell.rowIndex > -1 &&\n (self.attributes.allowRowResize || moveBorder) &&\n ((self.attributes.allowRowResizeFromCell && cell.isNormal) ||\n !cell.isNormal ||\n moveBorder) &&\n !cell.isColumnHeader\n ) {\n if (\n (cell.isRowHeader ||\n cell.isCorner ||\n (self.attributes.allowRowResizeFromCell && cell.isNormal)) &&\n border === 'b'\n ) {\n cell.context = 'ns-resize';\n cell.dragContext = 'ns-resize';\n return cell;\n }\n if (!(cell.isRowHeader || cell.isCorner) && moveBorder) {\n cell.context = yBorderBehavior;\n cell.dragContext = border + '-move';\n return cell;\n }\n }\n if (cell.style === 'columnHeaderCell') {\n cell.context = 'cell';\n cell.dragContext = 'column-reorder';\n return cell;\n }\n if (cell.style === 'rowHeaderCell') {\n if (\n self.attributes.rowGrabZoneSize +\n (cell.y - self.style.cellBorderWidth) <\n y ||\n !self.attributes.allowRowReordering\n ) {\n cell.dragContext = 'cell';\n cell.context = 'cell';\n } else {\n cell.context = self.cursorGrab;\n cell.dragContext = 'row-reorder';\n }\n return cell;\n }\n if (cell.isGrid) {\n self.hasFocus = false;\n cell.dragContext = 'cell-grid';\n cell.context = 'cell-grid';\n return cell;\n }\n if (cell.style === 'tree-grid') {\n self.hasFocus = false;\n cell.dragContext = 'tree';\n cell.context = 'tree';\n return cell;\n }\n cell.dragContext = 'cell';\n cell.context = 'cell';\n return cell;\n }\n }\n self.hasFocus = true;\n self.cursor = 'default';\n return {\n dragContext: 'background',\n context: 'background',\n style: 'background',\n isBackground: true,\n };\n };\n /**\n * Gets the bounds of current selection.\n * @returns {rect} selection.\n * @memberof canvasDatagrid\n * @name getSelectionBounds\n * @method\n */\n self.getSelectionBounds = function () {\n var low = { x: Infinity, y: Infinity },\n high = { x: -Infinity, y: -Infinity };\n self.selections.forEach(function (row, rowIndex) {\n var maxCol, minCol;\n low.y = rowIndex < low.y ? rowIndex : low.y;\n high.y = rowIndex > high.y ? rowIndex : high.y;\n maxCol = Math.max.apply(null, row);\n minCol = Math.min.apply(null, row);\n low.x = minCol < low.x ? minCol : low.x;\n high.x = maxCol > high.x ? maxCol : high.x;\n });\n return {\n top: low.y,\n left: low.x,\n bottom: high.y,\n right: high.x,\n };\n };\n /**\n * Returns an auto generated schema based on data structure.\n * @memberof canvasDatagrid\n * @name getSchemaFromData\n * @method\n * @tutorial schema\n * @returns {schema} schema A schema based on the first item in the data array.\n */\n self.getSchemaFromData = function (d) {\n d = d || self.originalData;\n return Object.keys(d[0] || { ' ': '' }).map(function mapEachSchemaColumn(\n key,\n index,\n ) {\n var type = self.getBestGuessDataType(key, d),\n i = {\n name: key,\n title: isNaN(parseInt(key, 10))\n ? key\n : self.integerToAlpha(key).toUpperCase(),\n index: index,\n columnIndex: index,\n type: type,\n filter: self.filter(type),\n };\n if (\n self.storedSettings &&\n self.storedSettings.visibility &&\n self.storedSettings.visibility[i.name] !== undefined\n ) {\n i.hidden = !self.storedSettings.visibility[i.name];\n }\n return i;\n });\n };\n /**\n * Clears the change log grid.changes that keeps track of changes to the data set.\n * This does not undo changes or alter data it is simply a convince array to keep\n * track of changes made to the data since last this method was called.\n * @memberof canvasDatagrid\n * @name clearChangeLog\n * @method\n */\n self.clearChangeLog = function () {\n self.changes = [];\n };\n /**\n * Selects an area of the grid.\n * @memberof canvasDatagrid\n * @name selectArea\n * @method\n * @param {rect} bounds A rect object representing the selected values.\n */\n self.selectArea = function (bounds, ctrl) {\n self.selectionBounds = bounds || self.selectionBounds;\n var ev,\n x,\n y,\n s = self.getSchema();\n if (!ctrl) {\n self.selections = [];\n }\n if (\n self.selectionBounds.top < -1 ||\n self.selectionBounds.bottom > self.viewData.length ||\n self.selectionBounds.left < -1 ||\n self.selectionBounds.right > s.length\n ) {\n throw new Error('Impossible selection area');\n }\n for (\n x = self.selectionBounds.top;\n x <= self.selectionBounds.bottom;\n x += 1\n ) {\n self.selections[x] = [];\n for (\n y = self.selectionBounds.left;\n y <= self.selectionBounds.right;\n y += 1\n ) {\n if (self.selections[x].indexOf(y) === -1) {\n self.selections[x].push(y);\n }\n }\n }\n ev = {\n selections: self.selections,\n selectionBounds: self.selectionBounds,\n selectedCells: self.getSelectedCells(),\n };\n Object.defineProperty(ev, 'selectedData', {\n get: function () {\n return self.getSelectedData();\n },\n });\n self.dispatchEvent('selectionchanged', ev);\n };\n /**\n * Returns the maximum text width for a given column by column name.\n * @memberof canvasDatagrid\n * @name findColumnMaxTextLength\n * @method\n * @returns {number} The number of pixels wide the maximum width value in the selected column.\n * @param {string} name The name of the column to calculate the value's width of.\n */\n self.findColumnMaxTextLength = function (name) {\n var m = -Infinity;\n if (name === 'cornerCell') {\n self.ctx.font = self.style.rowHeaderCellFont;\n return (\n self.ctx.measureText(\n (\n self.viewData.length + (self.attributes.showNewRow ? 1 : 0)\n ).toString(),\n ).width +\n self.style.autosizePadding +\n self.style.autosizeHeaderCellPadding +\n self.style.rowHeaderCellPaddingRight +\n self.style.rowHeaderCellPaddingLeft +\n (self.attributes.tree\n ? self.style.treeArrowWidth +\n self.style.treeArrowMarginLeft +\n self.style.treeArrowMarginRight\n : 0)\n );\n }\n var formatter = null;\n self.getSchema().forEach(function (col) {\n if (col.name !== name) {\n return;\n }\n self.ctx.font = self.style.columnHeaderCellFont;\n var t =\n self.ctx.measureText(col.title || col.name).width +\n self.style.headerCellPaddingRight +\n self.style.headerCellPaddingLeft;\n m = t > m ? t : m;\n formatter = self.formatters[col.type];\n });\n self.viewData.forEach(function (row) {\n var text = row[name];\n if (formatter) {\n text = formatter({ cell: { value: text } });\n }\n self.ctx.font = self.style.cellFont;\n var t =\n self.ctx.measureText(text).width +\n self.style.cellPaddingRight +\n self.style.cellPaddingLeft +\n self.style.cellAutoResizePadding;\n m = t > m ? t : m;\n });\n return m;\n };\n /**\n * Gets the total width of all header columns.\n * @memberof canvasDatagrid\n * @name getHeaderWidth\n * @method\n */\n self.getHeaderWidth = function () {\n return self.getVisibleSchema().reduce(function (total, header) {\n return total + parseInt(header.width || self.style.cellWidth, 10);\n }, 0);\n };\n /**\n * Gets the height of a row by index.\n * @memberof canvasDatagrid\n * @name getRowHeight\n * @method\n * @param {number} rowIndex The row index to lookup.\n */\n self.getRowHeight = function (rowIndex) {\n return (self.sizes.rows[rowIndex] || self.style.cellHeight) * self.scale;\n };\n /**\n * Gets the width of a column by index.\n * @memberof canvasDatagrid\n * @name getColumnWidth\n * @method\n * @param {number} columnIndex The column index to lookup.\n */\n self.getColumnWidth = function (columnIndex) {\n return (\n (self.sizes.columns[columnIndex] ||\n self.getSchema()[columnIndex].width ||\n self.style.cellWidth) * self.scale\n );\n };\n self.formatters.string = function cellFormatterString(e) {\n return e.cell.value !== undefined ? e.cell.value : '';\n };\n self.formatters.rowHeaderCell = self.formatters.string;\n self.formatters.headerCell = self.formatters.string;\n self.formatters.number = self.formatters.string;\n self.formatters.int = self.formatters.string;\n self.formatters.html = self.formatters.string;\n self.sorters.string = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n const aValue = a[columnName] || '';\n const bValue = b[columnName] || '';\n if (asc) {\n if (!aValue.localeCompare) {\n return 1;\n }\n return aValue.localeCompare(bValue);\n }\n if (!bValue.localeCompare) {\n return 1;\n }\n return bValue.localeCompare(aValue);\n };\n };\n self.sorters.number = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n if (asc) {\n return a[columnName] - b[columnName];\n }\n return b[columnName] - a[columnName];\n };\n };\n self.sorters.date = function (columnName, direction) {\n var asc = direction === 'asc';\n return function (a, b) {\n if (asc) {\n return (\n new Date(a[columnName]).getTime() - new Date(b[columnName]).getTime()\n );\n }\n return (\n new Date(b[columnName]).getTime() - new Date(a[columnName]).getTime()\n );\n };\n };\n}\n","/*jslint browser: true, unparam: true, todo: true, evil: true*/\n/*globals Reflect: false, HTMLElement: true, define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/\n'use strict';\n\nimport component from './component';\nimport defaults from './defaults';\nimport draw from './draw';\nimport events from './events';\nimport touch from './touch';\nimport intf from './intf';\nimport contextMenu from './contextMenu';\nimport button from './button';\nimport dom from './dom';\nimport publicMethods from './publicMethods';\n\nvar webComponent = component();\n\nvar modules = [\n defaults,\n draw,\n events,\n touch,\n intf,\n contextMenu,\n button,\n dom,\n publicMethods,\n];\n\nfunction Grid(args) {\n args = args || {};\n var self = {};\n self.isComponent = args.component === undefined;\n self.isChildGrid =\n args.parentNode &&\n /canvas-datagrid-(cell|tree)/.test(args.parentNode.nodeType);\n if (self.isChildGrid) {\n self.intf = {};\n } else {\n self.intf = self.isComponent\n ? eval('Reflect.construct(HTMLElement, [], new.target)')\n : document.createElement('canvas');\n }\n self.args = args;\n self.intf.args = args;\n self.applyComponentStyle = webComponent.applyComponentStyle;\n self.hyphenateProperty = webComponent.hyphenateProperty;\n self.dehyphenateProperty = webComponent.dehyphenateProperty;\n self.createGrid = function grid(args) {\n args.component = false;\n return new Grid(args);\n };\n\n modules.forEach(function (module) {\n module(self);\n });\n\n if (self.isChildGrid) {\n self.shadowRoot = args.parentNode.shadowRoot;\n self.parentNode = args.parentNode;\n } else {\n self.shadowRoot = self.intf.attachShadow({ mode: 'open' });\n self.parentNode = self.shadowRoot;\n }\n self.init();\n return self.intf;\n}\nif (window.HTMLElement) {\n Grid.prototype = Object.create(window.HTMLElement.prototype);\n}\n// export web component\nif (window.customElements) {\n Grid.observedAttributes = webComponent.getObservableAttributes();\n Grid.prototype.disconnectedCallback = webComponent.disconnectedCallback;\n Grid.prototype.attributeChangedCallback =\n webComponent.attributeChangedCallback;\n Grid.prototype.connectedCallback = webComponent.connectedCallback;\n Grid.prototype.adoptedCallback = webComponent.adoptedCallback;\n window.customElements.define('canvas-datagrid', Grid);\n}\n\n// export global\nif (\n window &&\n !window.canvasDatagrid &&\n !window.require &&\n // Present to exclude global declarations from ES Module bundles\n !window.EXCLUDE_GLOBAL\n) {\n window.canvasDatagrid = function (args) {\n return new Grid(args);\n };\n}\n\n// export amd loader\nexport default function canvasDatagrid(args) {\n args = args || {};\n var i,\n tKeys = [\n 'style',\n 'formatters',\n 'sorters',\n 'filters',\n 'treeGridAttributes',\n 'cellGridAttributes',\n 'data',\n 'schema',\n ];\n if (window.customElements) {\n i = document.createElement('canvas-datagrid');\n Object.keys(args).forEach(function (argKey) {\n // set data and parentNode after everything else\n if (argKey === 'data') {\n return;\n }\n if (argKey === 'parentNode') {\n return;\n }\n // top level keys in args\n if (tKeys.indexOf(argKey) !== -1) {\n tKeys.forEach(function (tKey) {\n if (args[tKey] === undefined || tKey !== argKey) {\n return;\n }\n if (['formatters', 'sorters', 'filters'].indexOf(argKey) !== -1) {\n if (typeof args[tKey] === 'object' && args[tKey] !== null) {\n Object.keys(args[tKey]).forEach(function (sKey) {\n i[tKey][sKey] = args[tKey][sKey];\n });\n }\n } else {\n i[tKey] = args[tKey];\n }\n });\n return;\n }\n // all others are attribute level keys\n i.attributes[argKey] = args[argKey];\n });\n if (args.data) {\n i.data = args.data;\n }\n // add to the dom very last to avoid redraws\n if (args.parentNode) {\n args.parentNode.appendChild(i);\n }\n return i;\n }\n args.component = false;\n i = new Grid(args);\n if (args.parentNode && args.parentNode.appendChild) {\n args.parentNode.appendChild(i);\n }\n return i;\n}\n"],"names":["self","defaults","attributes","styles","typeMap","component","dehyphenateProperty","prop","replace","nextLetterCap","p","Array","prototype","forEach","call","char","toUpperCase","hyphenateProperty","cust","toLowerCase","applyComponentStyle","supressChangeAndDrawEvents","intf","isComponent","cStyle","window","getComputedStyle","tagName","canvas","defs","computedStyle","def","val","getPropertyValue","setStyleProperty","dispatchEvent","requestAnimationFrame","resize","style","data","strData","JSON","parse","e","Error","schema","strSchema","number","strNum","n","parseInt","isNaN","boolean","strBool","test","string","str","getObservableAttributes","i","attrs","attr","push","disconnectedCallback","connected","connectedCallback","this","parentDOMNode","innerHTML","appendChild","observe","adoptedCallback","attributeChangedCallback","attrName","oldVal","newVal","tfn","dataType","base","item","filter","addEventListener","Function","name","observer","MutationObserver","mutations","checkInnerHTML","checkStyle","mutation","attributeName","target","nodeName","parentNode","addedNodes","length","type","characterData","childList","subtree","document","querySelectorAll","el","perfCounters","cachedImagesDrawn","drawCount","perfWindowSize","entityCount","scrollDebugCounters","touchPPSCounters","fillArray","low","high","step","x","undefined","drawHtml","cell","img","v","formattedValue","cacheKey","toString","rowIndex","columnIndex","Math","round","canvasOffsetLeft","y","canvasOffsetTop","htmlImageCache","height","width","complete","ctx","drawImage","Image","onload","loaded","Object","keys","html","draw","src","btoa","radiusRect","w","h","radius","r","b","beginPath","moveTo","lineTo","quadraticCurveTo","fillRect","strokeRect","fillText","text","clipFrozenArea","mode","lastFrozenColumnPixel","lastFrozenRowPixel","clip","fillHandle","selectionHandleType","arc","PI","fill","fillCircle","strokeHandle","stroke","strokeCircle","addBorderLine","c","pos","t","l","internal","isChildGrid","parentGrid","visible","checkScrollHeight","cx","cy","treeGrid","rowOpen","rowHeight","cornerCell","rowData","aCell","my","mx","xHover","yHover","drawCorner","en","m","d","viewData","bc","gridBorderCollapse","selectionBorders","moveBorders","selectionHandles","rowHeaders","u","currentCell","columnHeaderCellHeight","getColumnHeaderCellHeight","rowHeaderCellWidth","getRowHeaderCellWidth","cellHeight","performance","now","visibleRowHeights","orders","rows","createRowOrders","save","visibleRows","getSchema","visibleCells","offsetTop","offsetLeft","fillStyle","gridBackgroundColor","ln","min","frozenRow","scrollBox","scrollLeft","scrollPixelLeft","cellBorderWidth","drawRow","allowFreezingRows","frozenMarkerBorderWidth","frozenMarkerWidth","drawFrozenRows","columnOrderIndex","rowOrderIndex","headerIndex","g","snapToRow","scrollTop","scrollPixelTop","scrollIndexTop","scrollIndexBottom","scrollPixelBottom","showNewRow","showRowHeaders","scrollIndexLeft","columns","drawCell","newRow","restore","drawRows","cl","activeCell","frozenColumn","selectionMode","lineWidth","activeCellOverlayBorderWidth","strokeStyle","activeCellOverlayBorderColor","getHeaderWidth","drawActiveCell","o","columnHeaderCell","header","nonFrozenHeaderWidth","drawHeaderColumnRange","start","end","hidden","title","cellWidth","index","order","rArgs","rhIndex","filteredRowNumber","getBoundRowIndexFromViewRowIndex","originalData","rowHeaderValue","hasActiveFilters","rowHeaderCell","headerDescription","sizes","openChildren","drawRowHeader","showColumnHeaders","columnHeaderCellBorderWidth","scrollBarWidth","isColumnHeaderCell","isColumnHeaderCellCap","endCap","drawHeaders","allowFreezingColumns","frozenMarkerHoverColor","frozenMarkerColor","frozenMarkerHoverBorderColor","frozenMarkerBorderColor","unshift","freezeMarkerPosition","frozenMarkerActiveColor","frozenMarkerActiveBorderColor","dragMode","mobile","allowMovingSelection","selectionHandleBorderWidth","selectionHandleBorderColor","selectionHandleColor","hw","selectionHandleSize","tr","br","tl","bl","addselectionHandle","az","touchSelectHandleZone","ax","ay","reorderObject","dragOffset","reorderMarkerBackgroundColor","reorderMarkerBorderWidth","reorderMarkerBorderColor","k","selections","getRowHeight","reorderMarkerIndexBorderWidth","reorderMarkerIndexBorderColor","reorderTarget","sortRowIndex","selectedColumns","getColumnWidth","sortColumnIndex","drawReorderMarkers","movingSelection","moveOverlayBorderWidth","moveOverlayBorderColor","setLineDash","moveOverlayBorderSegments","gridBorderWidth","gridBorderColor","dsb","selectionOverlayBorderWidth","selectionOverlayBorderColor","drawSelectionBorders","entities","scrollBarBoxMargin","scrollBarBorderColor","scrollBarBorderWidth","horizontalBox","scrollCache","horizontalBar","scrollBoxWidth","scrollWidth","verticalBox","verticalBar","scrollBoxHeight","scrollHeight","horizontalBarVisible","scrollBarBackgroundColor","scrollBarBoxColor","horizontalBoxVisible","context","scrollBarActiveColor","scrollBarBoxBorderRadius","verticalBarVisible","verticalBoxVisible","scrollBarCornerBorderColor","scrollBarCornerBackgroundColor","corner","showPerformance","debug","pop","font","debugFont","perf","reduce","a","toFixed","perfDelta","frozenColumnsWidth","s","getFrozenColumnsWidth","htmlImages","scale","startScale","scaleDelta","zoomDeltaStart","touchLength","touches","touchPosition","touchPosition1","scrollIndex","scrollPixel","canvasOffset","touchDelta","touchAnimateTo","scrollAnimation","touchPPS","xPPS","yPPS","touchPPST","xPPST","yPPST","touchDuration","pointerLockPosition","size","mouse","touch","touchStart","hasFocus","dragContext","textAlign","debugBackgroundColor","key","debugColor","px","py","debugPerfChartBackground","debugScrollHeightColor","debugScrollWidthColor","debugPerformanceColor","debugEntitiesColor","debugTouchPPSXColor","debugTouchPPSYColor","dpl","apply","perfArr","arrIndex","max","color","useAbs","abs","drawPerfLine","debugPerfChartTextColor","drawPerfLines","createBorderOverlayArray","drawArray","propPrefix","offsetPoint","selectionBorder","isRowHeader","indexOf","isHeader","cellGridAttributes","cellStyle","isCorner","isColumnHeader","isFilterable","filterable","includes","wrap","cellWhiteSpace","selected","hovered","hovers","hoverMode","openedFilter","selectedFilterButton","active","rawValue","isGrid","activeHeader","f","formatters","orderByArrowSize","treeArrowSize","ev","value","row","nodeType","fontHeight","horizontalAlignment","verticalAlignment","paddingLeft","paddingTop","paddingRight","paddingBottom","whiteSpace","lineHeight","cellLineHeight","lineSpacing","cellLineSpacing","offsetWidth","offsetHeight","offsetParent","viewRowIndex","viewColumnIndex","boundRowIndex","boundColumnIndex","getBoundColumnIndexFromViewColumnIndex","isNormal","gridId","calculatedLineHeight","paddedWidth","paddedHeight","userHeight","userWidth","cellHeightWithChildGrid","cellWidthWithChildGrid","tree","mt","treeArrowMarginTop","mr","treeArrowMarginRight","ml","treeArrowMarginLeft","aw","treeArrowWidth","ah","treeArrowHeight","treeArrowColor","treeArrowBorderColor","drawTreeArrow","showRowNumbers","childGrids","saveAppearance","createGrid","cellGridHeight","grid","orderBy","columnHeaderOrderByArrowMarginTop","columnHeaderOrderByArrowMarginLeft","columnHeaderOrderByArrowMarginRight","columnHeaderOrderByArrowWidth","columnHeaderOrderByArrowHeight","columnHeaderOrderByArrowColor","columnHeaderOrderByArrowBorderColor","orderDirection","drawOrderByArrow","orderByArrowWidth","console","warn","columnFilters","filterTextPrefix","splitChar","lines","word","elWidth","plWidth","clippedVal","previousLine","words","split","textHeight","autoResize","autoResizeRows","et","ellipsisText","line","cHeight","measureText","curSplitChar","measure","arr","map","splice","originText","stepLength","direction","substr","wrapText","vPos","hPos","stringify","pw","idx","idx_ord","drawText","selectionBorderTop","selectionBorderRight","selectionHandle","selectionBorderLeft","selectionBorderBottom","selectionHandleBehavior","createHandlesOverlayArray","moveOffset","posX","filterButtonWidth","posY","filterButtonHeight","filterButtonBorderColor","filterButtonBackgroundColor","filterButtonActiveBackgroundColor","onFilterButton","filterButtonHoverBackgroundColor","filterButtonBorderRadius","filterButtonArrowHeight","filterButtonArrowWidth","filterButtonArrowColor","filterButtonArrowBorderColor","drawFilterButtonArrow","drawFilterButton","isSorting","orderings","showRowNumberGaps","previousRowNumber","barHeight","rowHeaderCellRowNumberGapHeight","barColor","rowHeaderCellRowNumberGapColor","treeHeight","rowSansTreeHeight","trees","scrollIndexRight","scrollPixelRight","module","exports","defineProperty","enumerable","get","Symbol","toStringTag","__esModule","create","bind","default","hasOwnProperty","concat","modifier","legacyModifier","navigation","editing","ui","device","imeCompositionKeys","koreanSpecific","japaneseSpecific","commonFunction","multimedia","multimediaNumpad","audio","speech","application","browser","mobilePhone","tv","mediaControls","isSupportedHtml","pasteValue","some","expression","IGNORE_NODETYPES","isHtmlTable","sanitizeElementData","element","elementData","innerText","String","trim","parseHtmlText","doc","DOMParser","parseFromString","querySelector","parseHtmlTable","childNodes","childNode","col","parseText","parseData","mimeType","wheeling","stopPropagation","fn","events","removeEventListener","sfn","defaultPrevented","preventDefault","getRatio","maxPixelRatio","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","drawAfterResize","dims","vb","nb","co","isScrollBoxCorner","sbw","ratio","bm","cellBorder","columnHeaderCellBorder","dataHeight","dataWidth","ch","accumulator","column","va","setCanvasSize","args","top","left","setScrollBoxSize","checkScrollBoxVisibility","widthBoxRatio","heightBoxRatio","scrollBarBoxMinSize","scrollBarBoxWidth","bar","box","page","pageUpDownOverlap","resizeEditInput","scroll","overflowX","overflowY","dim","appliedInlineStyles","parentNodeStyle","dontDraw","floor","ellipsisCache","mousemove","overridePos","contextMenu","input","getLayerPos","dragBounds","sBounds","delta","ctrl","ctrlKey","metaKey","persistantSelectionMode","singleSelectionMode","getCellAt","NativeEvent","previousCell","clearTimeout","scrollTimer","isInGrid","rowBoundaryCrossed","columnBoundaryCrossed","cellBoundaryCrossed","prefix","draggingItem","dragItem","cursor","selecting","dragStart","dragStartObject","shiftKey","bottom","right","getSelectionBounds","ignoreNextClick","contextmenuEvent","rect","dragAddToSelection","event","selectedData","getSelectedData","selectedCells","getSelectedCells","selectionBounds","selectRow","selectArea","isMultiRowsSelected","autoScrollOnMousemove","movedVertically","autoScrollMargin","movedHorizontally","autoScrollZone","click","startingBounds","endEdit","setActiveCell","selectAll","checkSelectionChange","columnHeaderClickBehavior","treeArrowClickRadius","toggleTree","sb","dragResizeColumn","resizingStartingWidth","resizingStartingHeight","minColumnWidth","minRowHeight","resizeScrollZone","resizeChildGrids","globalRowResize","stopDragResize","body","setStorageData","scrollGrid","scrollPointerLock","scrollStartMode","movementX","movementY","scrollMode","scrollStart","scrollModes","setTimeout","scrollRepeatRate","selectionScrollIncrement","stopScrollGrid","exitPointerLock","dragReorder","columReorder","rowReorder","allowColumnReordering","allowRowReordering","isMultiColumnsSelected","selectColumn","source","reorderDeadZone","getVisibleCellByIndex","stopDragReorder","oIndex","tIndex","odata","cr","sortColumnIndices","seletedColumnIndices","deleteCount","selectedRows","dragMove","stopDragMove","moveSelection","freezeMove","stopFreezeMove","startFreezeMove","mousedown","lastMouseDownTarget","button","move","freeze","requestPointerLock","dragging","mouseup","controlInput","focus","getAdjacentCells","first","last","keydown","adjacentCells","cols","keepFocusOnMouseOut","isPrintableKeyEvent","beginEditAt","selectNone","deleteSelectedData","Number","isArrowKey","firstSelectedRowIndex","findIndex","firstSelectedRow","firstSelectedColumnIndex","lastSelectedColumn","yAtTop","yAtBottom","xAtLeft","xAtRight","selection","shift","scrollIntoView","selectionFollowsActiveCell","keyup","keypress","dblclick","fitColumnToValues","autosize","scrollWheel","deltaX","deltaY","deltaMode","touchHaltAnimation","scrollTo","pasteData","startRowIndex","startColIndex","cellData","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","getBoundingClientRect","clientX","clientY","easingFunctions","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easing","touchEasingMethod","calculatePPSTimed","touchSigmaTimed","calculatePPS","touchSigma","touchEndAnimation","touchReleaseAnimationDurationMs","stopAnimation","touchEditCell","touchstart","changedTouches","startingCell","disposeContextMenu","clearInterval","calculatePPSTimer","touchContextTimeout","touchStartEvent","zoomAltered","touchStart1","touchScrollStart","touchContextMenuTimeMs","setInterval","touchEndEvents","touchmove","passive","touchend","touchcancel","touchSelect","handleType","touchSelecting","bounds","rw","rScrollZone","lScrollZone","bScrollZone","tScrollZone","t1","t2","touchDeadZone","touchZoomSensitivity","touchZoomMin","touchZoomMax","selectionScrollZone","touchScroll","touchMove","dz","touchReleaseAcceleration","scrollAnimationPPSThreshold","ctor","treeGridAttributes","storageName","invalidSearchExpClass","localStyleLibraryStorageKey","add","sortFunction","sort","filters","sorters","parsers","schemaHashes","changes","componentL1Events","eventNames","expandToRow","viewDataLength","orderedIndex","clearSelectedCells","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","clearChangeLog","gotoCell","gotoRow","addButton","findColumnScrollLeft","findRowScrollTop","isCellVisible","isRowVisible","isColumnVisible","clipElement","getSchemaFromData","setFilter","expandTree","collapseTree","insertRow","deleteRow","addRow","insertColumn","deleteColumn","addColumn","getClippingRect","setRowHeight","setColumnWidth","resetColumnWidths","resetRowHeights","assertPxColor","clearPxColorAssertions","integerToAlpha","addStyleKeyIfNoneExists","DOMStyles","set","valueObject","filterFor","blanksText","filterRegExp","pattern","exec","flags","substring","flagLength","invalidFilterRegEx","RegExp","toLocaleUpperCase","textContent","blur","TypeError","currentCursor","find","eventName","RangeError","isArray","getTypes","parseInnerHtml","callback","etl","autoGenerateSchema","autoResizeColumns","sHeight","sWidth","setScrollTop","preventScrollEvent","moveButtonPos","setScrollLeft","supressDrawEvent","zIndexTop","hoverScrollTimeout","autoCompleteContext","applyContextItemStyle","contextItemContainer","createInlineStyle","createContextMenu","parentContextMenu","loc","container","createElement","upArrow","downArrow","children","selectedIndex","checkArrowVisibility","startHoverScroll","contextHoverScrollAmount","contextHoverScrollRateMs","endHoverScroll","scrollOffset","contextMenuZIndex","childMenuArrow","removeChildContext","relatedTarget","contains","setAttribute","contextAddCallback","getAttribute","cPos","childContextMenuMarginLeft","childContextMenuMarginTop","createChildContext","addContent","content","childContextMenuArrowHTML","addItem","opacity","position","contextMenuArrowColor","zIndex","inputDropdown","maxHeight","innerHeight","autocompleteBottomMargin","minWidth","contextMenuArrowUpHTML","contextMenuArrowDownHTML","display","timer","animationDurationShowContextMenu","unfade","contextMenuWindowMargin","innerWidth","clickIndex","Event","animationDurationHideContextMenu","isFinite","createFilterContextMenuItems","iRect","filterContainer","filterLabel","filterAutoCompleteButton","filterInput","checkRegExpErrorState","background","contextFilterInputBackground","contextFilterInputColor","contextFilterInvalidRegExpBackground","contextFilterInvalidRegExpColor","createAutoCompleteContext","count","blanksItem","autoCompleteItems","cellValue","maxAutoCompleteItems","disposeAutocomplete","onclick","filterOptionText","contextFilterButtonHTML","cf","removeFilterOptionText","contextPosition","isNormalCell","isBackground","isScrollBar","showFilter","showCopy","copyText","execCommand","showPaste","clipBoardData","pasteText","showColumnSelector","columnSelectorText","toggleColumnVisibility","columnSelectorHiddenText","columnSelectorVisibleText","hideColumnText","showClearSettingsOption","clearSettingsOptionText","columnWidth","allowSorting","showOrderByOption","showOrderByOptionTextAsc","showOrderByOptionTextDesc","addDefaultContextMenuItem","contextMenuMarginLeft","contextMenuMarginTop","mobileContextMenuMargin","filterButtonMenuOffsetTop","createDisposeEvent","createButton","imgSrc","wrapper","buttonArrow","buttonIcon","buttonZIndex","buttonMenu","applyButtonStyle","buttonArrowDownHTML","maxWidth","toggleButtonMenu","disposeButtonMenu","createItems","menuItemContainer","buttonMenuItemContainer","applyButtonMenuItemStyle","disposeButton","buttonMenuWindowMargin","createButtonMenu","keyCode","attachButton","ele","boundingRect","eleRect","clipRect","parentRect","Infinity","scrollingElement","editCell","borderWidth","mobileEditInputHeight","cellPaddingLeft","ignoreScrollOffset","abort","newValue","oldValue","aborted","inEnterMode","enumItems","enu","option","valueInEnum","multiLine","editCellZIndex","fontSize","editCellFontSize","cellValueIsEmpty","shouldClearCellValue","nx","ny","altKey","nextRowIndex","className","css","padding","buttonPadding","borderStyle","borderColor","buttonBorderColor","buttonBackgroundColor","userSelect","buttonHoverBackgroundColor","buttonActiveBorderColor","buttonActiveBackgroundColor","verticalAlign","buttonArrowColor","fontWeight","fontFamily","contextMenuFontFamily","contextMenuFontSize","margin","contextMenuItemMargin","borderRadius","contextMenuItemBorderRadius","contextMenuHoverBackground","contextMenuHoverColor","contextMenuLabelMargin","contextMenuLabelDisplay","contextMenuLabelMinWidth","contextMenuLabelMaxWidth","contextMenuBackground","contextMenuColor","border","contextMenuBorder","contextMenuPadding","contextMenuBorderRadius","contextMenuOpacity","overflow","contextMenuCursor","marginLeft","contextFilterInputBorder","contextFilterInputBorderRadius","contextFilterInputFontFamily","contextFilterInputFontSize","contextFilterButtonBorder","contextFilterButtonBorderRadius","contextMenuFilterButtonFontFamily","contextMenuFilterButtonFontSize","cssFloat","childContextMenuArrowColor","contextMenuChildArrowFontSize","boxSizing","outline","mobileEditFontFamily","mobileEditFontSize","editCellBorder","editCellColor","editCellBackgroundColor","appearance","webkitAppearance","mozAppearance","editCellPaddingLeft","editCellFontFamily","boxShadow","editCellBoxShadow","contextMenuFilterInvalidExpresion","onblur","parentIsCanvas","getContext","textBaseline","ordA","charCodeAt","fromCharCode","showFilterInCell","offsetX","offsetY","targetX","targetY","sbh","offset","multiColIsSelected","columnIndices","isColumnSelected","colIsSelected","supressEvent","addCol","st","de","ri","dragObject","childGrid","trArgs","treeGridHeight","newSize","dontSetStorageData","sorter","sel","xi","visibleSchema","selectionLength","maxRowLength","minXi","yi","lastSourceIndex","cidx","useTouchScrollZones","getBorder","entitiy","borderResizeZone","moveBorder","tsz","touchScrollZone","moveMode","borderDragBehavior","xBorderBehavior","yBorderBehavior","isVerticalScrollBar","isHorizontalScrollBar","allowColumnResize","allowColumnResizeFromCell","allowRowHeaderResize","allowRowResize","allowRowResizeFromCell","rowGrabZoneSize","maxCol","minCol","rowHeaderCellFont","autosizePadding","autosizeHeaderCellPadding","rowHeaderCellPaddingRight","rowHeaderCellPaddingLeft","formatter","columnHeaderCellFont","headerCellPaddingRight","headerCellPaddingLeft","cellFont","cellPaddingRight","cellAutoResizePadding","total","headerCell","int","asc","aValue","bValue","localeCompare","date","Date","getTime","webComponent","modules","dom","publicMethods","Grid","eval","attachShadow","canvasDatagrid","tKeys","customElements","argKey","tKey","sKey","HTMLElement","observedAttributes","define","require"],"mappings":"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"}
|