@deephaven/grid 1.22.1-alpha-pivot-builder.0 → 1.22.2-alpha-pivot-builder.0

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.
Files changed (60) hide show
  1. package/dist/CellInputField.js +41 -22
  2. package/dist/CellInputField.js.map +1 -1
  3. package/dist/CellRenderer.js +19 -27
  4. package/dist/CellRenderer.js.map +1 -1
  5. package/dist/DataBarCellRenderer.js +61 -87
  6. package/dist/DataBarCellRenderer.js.map +1 -1
  7. package/dist/Grid.js +281 -455
  8. package/dist/Grid.js.map +1 -1
  9. package/dist/GridColorUtils.js +23 -21
  10. package/dist/GridColorUtils.js.map +1 -1
  11. package/dist/GridMetricCalculator.js +192 -303
  12. package/dist/GridMetricCalculator.js.map +1 -1
  13. package/dist/GridRange.js +18 -28
  14. package/dist/GridRange.js.map +1 -1
  15. package/dist/GridRenderer.d.ts.map +1 -1
  16. package/dist/GridRenderer.js +432 -604
  17. package/dist/GridRenderer.js.map +1 -1
  18. package/dist/GridUtils.d.ts +33 -16
  19. package/dist/GridUtils.d.ts.map +1 -1
  20. package/dist/GridUtils.js +183 -213
  21. package/dist/GridUtils.js.map +1 -1
  22. package/dist/MockGridModel.js +17 -10
  23. package/dist/MockGridModel.js.map +1 -1
  24. package/dist/MockTreeGridModel.js +36 -31
  25. package/dist/MockTreeGridModel.js.map +1 -1
  26. package/dist/TextCellRenderer.js +36 -57
  27. package/dist/TextCellRenderer.js.map +1 -1
  28. package/dist/key-handlers/EditKeyHandler.js +4 -7
  29. package/dist/key-handlers/EditKeyHandler.js.map +1 -1
  30. package/dist/key-handlers/PasteKeyHandler.js +1 -3
  31. package/dist/key-handlers/PasteKeyHandler.js.map +1 -1
  32. package/dist/key-handlers/SelectionKeyHandler.js +40 -71
  33. package/dist/key-handlers/SelectionKeyHandler.js.map +1 -1
  34. package/dist/key-handlers/TreeKeyHandler.js +4 -10
  35. package/dist/key-handlers/TreeKeyHandler.js.map +1 -1
  36. package/dist/mouse-handlers/EditMouseHandler.js +3 -7
  37. package/dist/mouse-handlers/EditMouseHandler.js.map +1 -1
  38. package/dist/mouse-handlers/GridColumnMoveMouseHandler.js +54 -82
  39. package/dist/mouse-handlers/GridColumnMoveMouseHandler.js.map +1 -1
  40. package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.js +4 -8
  41. package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.js.map +1 -1
  42. package/dist/mouse-handlers/GridHorizontalScrollBarMouseHandler.js +31 -55
  43. package/dist/mouse-handlers/GridHorizontalScrollBarMouseHandler.js.map +1 -1
  44. package/dist/mouse-handlers/GridRowMoveMouseHandler.js +26 -46
  45. package/dist/mouse-handlers/GridRowMoveMouseHandler.js.map +1 -1
  46. package/dist/mouse-handlers/GridRowSeparatorMouseHandler.js +2 -4
  47. package/dist/mouse-handlers/GridRowSeparatorMouseHandler.js.map +1 -1
  48. package/dist/mouse-handlers/GridRowTreeMouseHandler.js +14 -22
  49. package/dist/mouse-handlers/GridRowTreeMouseHandler.js.map +1 -1
  50. package/dist/mouse-handlers/GridScrollBarCornerMouseHandler.js +8 -16
  51. package/dist/mouse-handlers/GridScrollBarCornerMouseHandler.js.map +1 -1
  52. package/dist/mouse-handlers/GridSelectionMouseHandler.js +47 -75
  53. package/dist/mouse-handlers/GridSelectionMouseHandler.js.map +1 -1
  54. package/dist/mouse-handlers/GridSeparatorMouseHandler.js +9 -23
  55. package/dist/mouse-handlers/GridSeparatorMouseHandler.js.map +1 -1
  56. package/dist/mouse-handlers/GridTokenMouseHandler.js +24 -39
  57. package/dist/mouse-handlers/GridTokenMouseHandler.js.map +1 -1
  58. package/dist/mouse-handlers/GridVerticalScrollBarMouseHandler.js +31 -55
  59. package/dist/mouse-handlers/GridVerticalScrollBarMouseHandler.js.map +1 -1
  60. package/package.json +3 -3
@@ -1,3 +1,9 @@
1
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
1
7
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
2
8
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
3
9
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
@@ -11,13 +17,17 @@ import memoizeClear from "./memoizeClear.js";
11
17
  */
12
18
  class MockTreeGridModel extends MockGridModel {
13
19
  constructor() {
14
- var {
15
- rowCount = MockTreeGridModel.DEFAULT_ROW_COUNT,
16
- columnCount = MockTreeGridModel.DEFAULT_COLUMN_COUNT,
17
- children: _children = new Map(),
18
- childRowCount: _childRowCount = Math.ceil(Math.max(MockTreeGridModel.MIN_CHILD_ROW_COUNT, rowCount * MockTreeGridModel.DEFAULT_CHILD_ROW_COUNT_FACTOR)),
19
- maxDepth: _maxDepth = MockTreeGridModel.MAX_DEPTH
20
- } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
20
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
21
+ _ref$rowCount = _ref.rowCount,
22
+ rowCount = _ref$rowCount === void 0 ? MockTreeGridModel.DEFAULT_ROW_COUNT : _ref$rowCount,
23
+ _ref$columnCount = _ref.columnCount,
24
+ columnCount = _ref$columnCount === void 0 ? MockTreeGridModel.DEFAULT_COLUMN_COUNT : _ref$columnCount,
25
+ _ref$children = _ref.children,
26
+ _children = _ref$children === void 0 ? new Map() : _ref$children,
27
+ _ref$childRowCount = _ref.childRowCount,
28
+ _childRowCount = _ref$childRowCount === void 0 ? Math.ceil(Math.max(MockTreeGridModel.MIN_CHILD_ROW_COUNT, rowCount * MockTreeGridModel.DEFAULT_CHILD_ROW_COUNT_FACTOR)) : _ref$childRowCount,
29
+ _ref$maxDepth = _ref.maxDepth,
30
+ _maxDepth = _ref$maxDepth === void 0 ? MockTreeGridModel.MAX_DEPTH : _ref$maxDepth;
21
31
  super({
22
32
  rowCount,
23
33
  columnCount
@@ -36,7 +46,9 @@ class MockTreeGridModel extends MockGridModel {
36
46
  // Need to iterate through the map in order... sort it first
37
47
  var sortedEntries = [...children].sort((a, b) => a[0] - b[0]);
38
48
  for (var i = 0; i < sortedEntries.length; i += 1) {
39
- var [childRow, childModel] = sortedEntries[i];
49
+ var _sortedEntries$i = _slicedToArray(sortedEntries[i], 2),
50
+ childRow = _sortedEntries$i[0],
51
+ childModel = _sortedEntries$i[1];
40
52
  if (offsetRow <= childRow) {
41
53
  break;
42
54
  }
@@ -56,10 +68,9 @@ class MockTreeGridModel extends MockGridModel {
56
68
  max: 10000
57
69
  }));
58
70
  _defineProperty(this, "getCachedTextForRowHeader", memoizeClear((children, row) => {
59
- var {
60
- key,
61
- offsetRow
62
- } = this.getCachedModelRowOffset(children, row);
71
+ var _this$getCachedModelR = this.getCachedModelRowOffset(children, row),
72
+ key = _this$getCachedModelR.key,
73
+ offsetRow = _this$getCachedModelR.offsetRow;
63
74
  if (key != null) {
64
75
  var model = children.get(key);
65
76
  if (model !== undefined) {
@@ -71,10 +82,9 @@ class MockTreeGridModel extends MockGridModel {
71
82
  max: 10000
72
83
  }));
73
84
  _defineProperty(this, "getCachedTextForCell", memoizeClear((children, column, row) => {
74
- var {
75
- key,
76
- offsetRow
77
- } = this.getCachedModelRowOffset(children, row);
85
+ var _this$getCachedModelR2 = this.getCachedModelRowOffset(children, row),
86
+ key = _this$getCachedModelR2.key,
87
+ offsetRow = _this$getCachedModelR2.offsetRow;
78
88
  if (key != null) {
79
89
  var model = children.get(key);
80
90
  if (model !== undefined) {
@@ -92,10 +102,9 @@ class MockTreeGridModel extends MockGridModel {
92
102
  max: 10000
93
103
  }));
94
104
  _defineProperty(this, "getCachedIsRowExpanded", memoizeClear((children, row) => {
95
- var {
96
- key,
97
- offsetRow
98
- } = this.getCachedModelRowOffset(children, row);
105
+ var _this$getCachedModelR3 = this.getCachedModelRowOffset(children, row),
106
+ key = _this$getCachedModelR3.key,
107
+ offsetRow = _this$getCachedModelR3.offsetRow;
99
108
  if (key != null) {
100
109
  var model = children.get(key);
101
110
  if (model !== undefined) {
@@ -107,10 +116,9 @@ class MockTreeGridModel extends MockGridModel {
107
116
  max: 10000
108
117
  }));
109
118
  _defineProperty(this, "getCachedDepthForRow", memoizeClear((children, row) => {
110
- var {
111
- key,
112
- offsetRow
113
- } = this.getCachedModelRowOffset(children, row);
119
+ var _this$getCachedModelR4 = this.getCachedModelRowOffset(children, row),
120
+ key = _this$getCachedModelR4.key,
121
+ offsetRow = _this$getCachedModelR4.offsetRow;
114
122
  if (key != null) {
115
123
  var model = children.get(key);
116
124
  if (model !== undefined) {
@@ -151,19 +159,16 @@ class MockTreeGridModel extends MockGridModel {
151
159
  }
152
160
  setRowExpanded(row, isExpanded) {
153
161
  var expandDescendants = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
154
- var {
155
- key,
156
- offsetRow
157
- } = this.getCachedModelRowOffset(this.children, row);
162
+ var _this$getCachedModelR5 = this.getCachedModelRowOffset(this.children, row),
163
+ key = _this$getCachedModelR5.key,
164
+ offsetRow = _this$getCachedModelR5.offsetRow;
158
165
 
159
166
  // We always set a new map so that our memoize functions work properly
160
167
  var children = new Map(this.children);
161
168
  if (key != null) {
162
169
  var model = this.children.get(key);
163
170
  if (model !== undefined) {
164
- var {
165
- rowCount: originalChildRowCount
166
- } = model;
171
+ var originalChildRowCount = model.rowCount;
167
172
  model.setRowExpanded(offsetRow, isExpanded, expandDescendants);
168
173
  this.numRows += model.rowCount - originalChildRowCount;
169
174
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MockTreeGridModel.js","names":["MockGridModel","memoizeClear","MockTreeGridModel","constructor","rowCount","DEFAULT_ROW_COUNT","columnCount","DEFAULT_COLUMN_COUNT","children","Map","childRowCount","Math","ceil","max","MIN_CHILD_ROW_COUNT","DEFAULT_CHILD_ROW_COUNT_FACTOR","maxDepth","MAX_DEPTH","arguments","length","undefined","_defineProperty","row","key","offsetRow","sortedEntries","sort","a","b","i","childRow","childModel","getCachedModelRowOffset","model","get","concat","textForRowHeader","column","textForCell","depth","getCachedDepthForRow","isRowExpanded","has","depthForRow","getCachedTextForCell","getCachedTextForRowHeader","isRowMovable","hasExpandableRows","isExpandAllAvailable","floatingBottomRowCount","isRowExpandable","getCachedIsRowExpandable","getCachedIsRowExpanded","setRowExpanded","isExpanded","expandDescendants","originalChildRowCount","numRows","delete","child","numColumns","set","expandAll","Error","collapseAll"],"sources":["../src/MockTreeGridModel.ts"],"sourcesContent":["/* eslint class-methods-use-this: \"off\" */\n/* eslint no-unused-vars: \"off\" */\nimport MockGridModel from './MockGridModel';\nimport memoizeClear from './memoizeClear';\nimport type ExpandableGridModel from './ExpandableGridModel';\nimport { type ModelIndex } from './GridMetrics';\n\ntype ChildrenTreeMap = Map<ModelIndex, MockTreeGridModel>;\n\n/**\n * A class to mock a tree model so can test out tree models.\n * Whenever a row is expanded, it creates a child model for that row, which can then make a child for those rows, etc.\n */\nclass MockTreeGridModel extends MockGridModel implements ExpandableGridModel {\n static DEFAULT_ROW_COUNT = 1000000000;\n\n static DEFAULT_COLUMN_COUNT = 100;\n\n /** How many rows a child tree should have related to the parent. Eg. if parent has 10000 rows, child will have 100 */\n static DEFAULT_CHILD_ROW_COUNT_FACTOR = 0.01;\n\n static MIN_CHILD_ROW_COUNT = 10;\n\n static MAX_DEPTH = 10;\n\n private children: ChildrenTreeMap;\n\n private childRowCount: number;\n\n private maxDepth: number;\n\n constructor({\n rowCount = MockTreeGridModel.DEFAULT_ROW_COUNT,\n columnCount = MockTreeGridModel.DEFAULT_COLUMN_COUNT,\n children = new Map(),\n childRowCount = Math.ceil(\n Math.max(\n MockTreeGridModel.MIN_CHILD_ROW_COUNT,\n rowCount * MockTreeGridModel.DEFAULT_CHILD_ROW_COUNT_FACTOR\n )\n ),\n maxDepth = MockTreeGridModel.MAX_DEPTH,\n }: {\n children?: ChildrenTreeMap;\n columnCount?: number;\n rowCount?: number;\n childRowCount?: number;\n maxDepth?: number;\n } = {}) {\n super({ rowCount, columnCount });\n\n this.children = children;\n this.childRowCount = childRowCount;\n this.maxDepth = maxDepth;\n }\n\n textForCell(column: ModelIndex, row: ModelIndex): string {\n return this.getCachedTextForCell(this.children, column, row);\n }\n\n textForRowHeader(row: ModelIndex): string {\n return this.getCachedTextForRowHeader(this.children, row);\n }\n\n isRowMovable(row: ModelIndex): boolean {\n return false;\n }\n\n get hasExpandableRows(): boolean {\n return true;\n }\n\n get isExpandAllAvailable(): boolean {\n return false;\n }\n\n get floatingBottomRowCount(): number {\n return 0;\n }\n\n isRowExpandable(row: ModelIndex): boolean {\n return this.getCachedIsRowExpandable(this.children, row, this.maxDepth);\n }\n\n isRowExpanded(row: ModelIndex): boolean {\n return this.getCachedIsRowExpanded(this.children, row);\n }\n\n setRowExpanded(\n row: ModelIndex,\n isExpanded: boolean,\n expandDescendants = false\n ): void {\n const { key, offsetRow } = this.getCachedModelRowOffset(this.children, row);\n\n // We always set a new map so that our memoize functions work properly\n const children = new Map(this.children);\n if (key != null) {\n const model = this.children.get(key);\n if (model !== undefined) {\n const { rowCount: originalChildRowCount } = model;\n model.setRowExpanded(offsetRow, isExpanded, expandDescendants);\n this.numRows += model.rowCount - originalChildRowCount;\n }\n } else if (!isExpanded) {\n const childModel = children.get(offsetRow);\n if (childModel !== undefined) {\n this.numRows -= childModel.rowCount;\n children.delete(offsetRow);\n }\n } else {\n const child = new MockTreeGridModel({\n rowCount: this.childRowCount,\n columnCount: this.numColumns,\n });\n children.set(offsetRow, child);\n this.numRows += child.rowCount;\n }\n\n this.children = children;\n }\n\n expandAll(): void {\n throw new Error('Expand all not implemented.');\n }\n\n collapseAll(): void {\n throw new Error('Collapse all not implemented.');\n }\n\n depthForRow(row: ModelIndex): number {\n return this.getCachedDepthForRow(this.children, row);\n }\n\n /**\n * Returns the map key and the offsetRow given the provided children and row index.\n * If the returned key is null, then this offset row is within this model.\n * Only returning the key instead of the model so that memoize doesn't cache a bunch of the children models after they've been deleted (collapsed).\n */\n getCachedModelRowOffset = memoizeClear(\n (\n children: ChildrenTreeMap,\n row: ModelIndex\n ): { key: ModelIndex | null; offsetRow: ModelIndex } => {\n let key = null;\n let offsetRow = row;\n // Need to iterate through the map in order... sort it first\n const sortedEntries = [...children].sort((a, b) => a[0] - b[0]);\n for (let i = 0; i < sortedEntries.length; i += 1) {\n const [childRow, childModel] = sortedEntries[i];\n if (offsetRow <= childRow) {\n break;\n }\n const childRowCount = childModel.rowCount;\n if (offsetRow <= childRow + childRowCount) {\n key = childRow;\n offsetRow = offsetRow - childRow - 1;\n break;\n }\n offsetRow -= childRowCount;\n }\n\n return { key, offsetRow };\n },\n { max: 10000 }\n );\n\n getCachedTextForRowHeader = memoizeClear(\n (children: ChildrenTreeMap, row: ModelIndex): string => {\n const { key, offsetRow } = this.getCachedModelRowOffset(children, row);\n\n if (key != null) {\n const model = children.get(key);\n if (model !== undefined) {\n return `${key}.${model.textForRowHeader(offsetRow)}`;\n }\n }\n\n return `${offsetRow}`;\n },\n { max: 10000 }\n );\n\n getCachedTextForCell = memoizeClear(\n (\n children: ChildrenTreeMap,\n column: ModelIndex,\n row: ModelIndex\n ): string => {\n const { key, offsetRow } = this.getCachedModelRowOffset(children, row);\n\n if (key != null) {\n const model = children.get(key);\n if (model !== undefined) {\n return `${key}.${model.textForCell(column, offsetRow)}`;\n }\n }\n\n return `${column},${offsetRow}`;\n },\n { max: 10000 }\n );\n\n getCachedIsRowExpandable = memoizeClear(\n (children: ChildrenTreeMap, row: ModelIndex, maxDepth: number): boolean => {\n const depth = this.getCachedDepthForRow(children, row);\n\n return depth < maxDepth;\n },\n { max: 10000 }\n );\n\n getCachedIsRowExpanded = memoizeClear(\n (children: ChildrenTreeMap, row: ModelIndex): boolean => {\n const { key, offsetRow } = this.getCachedModelRowOffset(children, row);\n\n if (key != null) {\n const model = children.get(key);\n if (model !== undefined) {\n return model.isRowExpanded(offsetRow);\n }\n }\n\n return children.has(offsetRow);\n },\n { max: 10000 }\n );\n\n getCachedDepthForRow = memoizeClear(\n (children: ChildrenTreeMap, row: ModelIndex): number => {\n const { key, offsetRow } = this.getCachedModelRowOffset(children, row);\n\n if (key != null) {\n const model = children.get(key);\n if (model !== undefined) {\n return model.depthForRow(offsetRow) + 1;\n }\n }\n\n return 0;\n },\n { max: 10000 }\n );\n}\n\nexport default MockTreeGridModel;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"MockTreeGridModel.js","names":["MockGridModel","memoizeClear","MockTreeGridModel","constructor","_ref","arguments","length","undefined","_ref$rowCount","rowCount","DEFAULT_ROW_COUNT","_ref$columnCount","columnCount","DEFAULT_COLUMN_COUNT","_ref$children","children","Map","_ref$childRowCount","childRowCount","Math","ceil","max","MIN_CHILD_ROW_COUNT","DEFAULT_CHILD_ROW_COUNT_FACTOR","_ref$maxDepth","maxDepth","MAX_DEPTH","_defineProperty","row","key","offsetRow","sortedEntries","sort","a","b","i","_sortedEntries$i","_slicedToArray","childRow","childModel","_this$getCachedModelR","getCachedModelRowOffset","model","get","concat","textForRowHeader","column","_this$getCachedModelR2","textForCell","depth","getCachedDepthForRow","_this$getCachedModelR3","isRowExpanded","has","_this$getCachedModelR4","depthForRow","getCachedTextForCell","getCachedTextForRowHeader","isRowMovable","hasExpandableRows","isExpandAllAvailable","floatingBottomRowCount","isRowExpandable","getCachedIsRowExpandable","getCachedIsRowExpanded","setRowExpanded","isExpanded","expandDescendants","_this$getCachedModelR5","originalChildRowCount","numRows","delete","child","numColumns","set","expandAll","Error","collapseAll"],"sources":["../src/MockTreeGridModel.ts"],"sourcesContent":["/* eslint class-methods-use-this: \"off\" */\n/* eslint no-unused-vars: \"off\" */\nimport MockGridModel from './MockGridModel';\nimport memoizeClear from './memoizeClear';\nimport type ExpandableGridModel from './ExpandableGridModel';\nimport { type ModelIndex } from './GridMetrics';\n\ntype ChildrenTreeMap = Map<ModelIndex, MockTreeGridModel>;\n\n/**\n * A class to mock a tree model so can test out tree models.\n * Whenever a row is expanded, it creates a child model for that row, which can then make a child for those rows, etc.\n */\nclass MockTreeGridModel extends MockGridModel implements ExpandableGridModel {\n static DEFAULT_ROW_COUNT = 1000000000;\n\n static DEFAULT_COLUMN_COUNT = 100;\n\n /** How many rows a child tree should have related to the parent. Eg. if parent has 10000 rows, child will have 100 */\n static DEFAULT_CHILD_ROW_COUNT_FACTOR = 0.01;\n\n static MIN_CHILD_ROW_COUNT = 10;\n\n static MAX_DEPTH = 10;\n\n private children: ChildrenTreeMap;\n\n private childRowCount: number;\n\n private maxDepth: number;\n\n constructor({\n rowCount = MockTreeGridModel.DEFAULT_ROW_COUNT,\n columnCount = MockTreeGridModel.DEFAULT_COLUMN_COUNT,\n children = new Map(),\n childRowCount = Math.ceil(\n Math.max(\n MockTreeGridModel.MIN_CHILD_ROW_COUNT,\n rowCount * MockTreeGridModel.DEFAULT_CHILD_ROW_COUNT_FACTOR\n )\n ),\n maxDepth = MockTreeGridModel.MAX_DEPTH,\n }: {\n children?: ChildrenTreeMap;\n columnCount?: number;\n rowCount?: number;\n childRowCount?: number;\n maxDepth?: number;\n } = {}) {\n super({ rowCount, columnCount });\n\n this.children = children;\n this.childRowCount = childRowCount;\n this.maxDepth = maxDepth;\n }\n\n textForCell(column: ModelIndex, row: ModelIndex): string {\n return this.getCachedTextForCell(this.children, column, row);\n }\n\n textForRowHeader(row: ModelIndex): string {\n return this.getCachedTextForRowHeader(this.children, row);\n }\n\n isRowMovable(row: ModelIndex): boolean {\n return false;\n }\n\n get hasExpandableRows(): boolean {\n return true;\n }\n\n get isExpandAllAvailable(): boolean {\n return false;\n }\n\n get floatingBottomRowCount(): number {\n return 0;\n }\n\n isRowExpandable(row: ModelIndex): boolean {\n return this.getCachedIsRowExpandable(this.children, row, this.maxDepth);\n }\n\n isRowExpanded(row: ModelIndex): boolean {\n return this.getCachedIsRowExpanded(this.children, row);\n }\n\n setRowExpanded(\n row: ModelIndex,\n isExpanded: boolean,\n expandDescendants = false\n ): void {\n const { key, offsetRow } = this.getCachedModelRowOffset(this.children, row);\n\n // We always set a new map so that our memoize functions work properly\n const children = new Map(this.children);\n if (key != null) {\n const model = this.children.get(key);\n if (model !== undefined) {\n const { rowCount: originalChildRowCount } = model;\n model.setRowExpanded(offsetRow, isExpanded, expandDescendants);\n this.numRows += model.rowCount - originalChildRowCount;\n }\n } else if (!isExpanded) {\n const childModel = children.get(offsetRow);\n if (childModel !== undefined) {\n this.numRows -= childModel.rowCount;\n children.delete(offsetRow);\n }\n } else {\n const child = new MockTreeGridModel({\n rowCount: this.childRowCount,\n columnCount: this.numColumns,\n });\n children.set(offsetRow, child);\n this.numRows += child.rowCount;\n }\n\n this.children = children;\n }\n\n expandAll(): void {\n throw new Error('Expand all not implemented.');\n }\n\n collapseAll(): void {\n throw new Error('Collapse all not implemented.');\n }\n\n depthForRow(row: ModelIndex): number {\n return this.getCachedDepthForRow(this.children, row);\n }\n\n /**\n * Returns the map key and the offsetRow given the provided children and row index.\n * If the returned key is null, then this offset row is within this model.\n * Only returning the key instead of the model so that memoize doesn't cache a bunch of the children models after they've been deleted (collapsed).\n */\n getCachedModelRowOffset = memoizeClear(\n (\n children: ChildrenTreeMap,\n row: ModelIndex\n ): { key: ModelIndex | null; offsetRow: ModelIndex } => {\n let key = null;\n let offsetRow = row;\n // Need to iterate through the map in order... sort it first\n const sortedEntries = [...children].sort((a, b) => a[0] - b[0]);\n for (let i = 0; i < sortedEntries.length; i += 1) {\n const [childRow, childModel] = sortedEntries[i];\n if (offsetRow <= childRow) {\n break;\n }\n const childRowCount = childModel.rowCount;\n if (offsetRow <= childRow + childRowCount) {\n key = childRow;\n offsetRow = offsetRow - childRow - 1;\n break;\n }\n offsetRow -= childRowCount;\n }\n\n return { key, offsetRow };\n },\n { max: 10000 }\n );\n\n getCachedTextForRowHeader = memoizeClear(\n (children: ChildrenTreeMap, row: ModelIndex): string => {\n const { key, offsetRow } = this.getCachedModelRowOffset(children, row);\n\n if (key != null) {\n const model = children.get(key);\n if (model !== undefined) {\n return `${key}.${model.textForRowHeader(offsetRow)}`;\n }\n }\n\n return `${offsetRow}`;\n },\n { max: 10000 }\n );\n\n getCachedTextForCell = memoizeClear(\n (\n children: ChildrenTreeMap,\n column: ModelIndex,\n row: ModelIndex\n ): string => {\n const { key, offsetRow } = this.getCachedModelRowOffset(children, row);\n\n if (key != null) {\n const model = children.get(key);\n if (model !== undefined) {\n return `${key}.${model.textForCell(column, offsetRow)}`;\n }\n }\n\n return `${column},${offsetRow}`;\n },\n { max: 10000 }\n );\n\n getCachedIsRowExpandable = memoizeClear(\n (children: ChildrenTreeMap, row: ModelIndex, maxDepth: number): boolean => {\n const depth = this.getCachedDepthForRow(children, row);\n\n return depth < maxDepth;\n },\n { max: 10000 }\n );\n\n getCachedIsRowExpanded = memoizeClear(\n (children: ChildrenTreeMap, row: ModelIndex): boolean => {\n const { key, offsetRow } = this.getCachedModelRowOffset(children, row);\n\n if (key != null) {\n const model = children.get(key);\n if (model !== undefined) {\n return model.isRowExpanded(offsetRow);\n }\n }\n\n return children.has(offsetRow);\n },\n { max: 10000 }\n );\n\n getCachedDepthForRow = memoizeClear(\n (children: ChildrenTreeMap, row: ModelIndex): number => {\n const { key, offsetRow } = this.getCachedModelRowOffset(children, row);\n\n if (key != null) {\n const model = children.get(key);\n if (model !== undefined) {\n return model.depthForRow(offsetRow) + 1;\n }\n }\n\n return 0;\n },\n { max: 10000 }\n );\n}\n\nexport default MockTreeGridModel;\n"],"mappings":"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","ignoreList":[]}
@@ -25,10 +25,8 @@ class TextCellRenderer extends CellRenderer {
25
25
  // Loop through array and push them to array
26
26
  for (var i = 0; i < tokens.length; i += 1) {
27
27
  var token = tokens[i];
28
- var {
29
- start,
30
- end
31
- } = token;
28
+ var start = token.start,
29
+ end = token.end;
32
30
  // The last token value is calculated based on the full text so the value needs to be truncated
33
31
  var value = end > truncatedText.length ? truncatedText.substring(start) : token.value;
34
32
 
@@ -57,23 +55,17 @@ class TextCellRenderer extends CellRenderer {
57
55
  }));
58
56
  }
59
57
  drawCellContent(context, state, column, row) {
60
- var {
61
- metrics,
62
- model,
63
- theme
64
- } = state;
65
- var {
66
- fontWidthsLower,
67
- fontWidthsUpper,
68
- modelColumns,
69
- modelRows,
70
- allRowHeights,
71
- firstColumn
72
- } = metrics;
58
+ var metrics = state.metrics,
59
+ model = state.model,
60
+ theme = state.theme;
61
+ var fontWidthsLower = metrics.fontWidthsLower,
62
+ fontWidthsUpper = metrics.fontWidthsUpper,
63
+ modelColumns = metrics.modelColumns,
64
+ modelRows = metrics.modelRows,
65
+ allRowHeights = metrics.allRowHeights,
66
+ firstColumn = metrics.firstColumn;
73
67
  var isFirstColumn = column === firstColumn;
74
- var {
75
- textColor
76
- } = theme;
68
+ var textColor = theme.textColor;
77
69
  var rowHeight = getOrThrow(allRowHeights, row);
78
70
  var modelRow = getOrThrow(modelRows, row);
79
71
  var modelColumn = getOrThrow(modelColumns, column);
@@ -85,11 +77,10 @@ class TextCellRenderer extends CellRenderer {
85
77
  var color = model.colorForCell(modelColumn, modelRow, theme) || textColor;
86
78
  context.fillStyle = color;
87
79
  context.save();
88
- var {
89
- width: textWidth,
90
- x: textX,
91
- y: textY
92
- } = GridUtils.getTextRenderMetrics(state, column, row);
80
+ var _GridUtils$getTextRen = GridUtils.getTextRenderMetrics(state, column, row),
81
+ textWidth = _GridUtils$getTextRen.width,
82
+ textX = _GridUtils$getTextRen.x,
83
+ textY = _GridUtils$getTextRen.y;
93
84
  var fontWidthLower = fontWidthsLower.get(context.font);
94
85
  var fontWidthUpper = fontWidthsUpper.get(context.font);
95
86
  var truncatedText = this.getCachedTruncatedString(context, text, textWidth, fontWidthLower, fontWidthUpper, truncationChar);
@@ -98,18 +89,16 @@ class TextCellRenderer extends CellRenderer {
98
89
  var tokenIndex = 0;
99
90
  var textStart = 0;
100
91
  var left = textX;
101
- var {
102
- actualBoundingBoxDescent
103
- } = context.measureText(truncatedText);
92
+ var _context$measureText = context.measureText(truncatedText),
93
+ actualBoundingBoxDescent = _context$measureText.actualBoundingBoxDescent;
104
94
  while (textStart < truncatedText.length) {
105
95
  var _ref, _token$end;
106
96
  var nextToken = tokens[tokenIndex];
107
97
  var token = textStart === (nextToken === null || nextToken === void 0 ? void 0 : nextToken.start) ? nextToken : null;
108
98
  var textEnd = (_ref = (_token$end = token === null || token === void 0 ? void 0 : token.end) !== null && _token$end !== void 0 ? _token$end : nextToken === null || nextToken === void 0 ? void 0 : nextToken.start) !== null && _ref !== void 0 ? _ref : truncatedText.length;
109
99
  var value = truncatedText.substring(textStart, textEnd);
110
- var {
111
- width
112
- } = context.measureText(value);
100
+ var _context$measureText2 = context.measureText(value),
101
+ width = _context$measureText2.width;
113
102
  var widthOfUnderline = value.endsWith('…') ? width - context.measureText('…').width : width;
114
103
 
115
104
  // Set the styling based on the token, then draw the text
@@ -141,31 +130,24 @@ class TextCellRenderer extends CellRenderer {
141
130
  * @returns An array of TokenBox of visible tokens or empty array with coordinates relative to gridX and gridY
142
131
  */
143
132
  getTokenBoxesForVisibleCell(column, row, state) {
144
- var {
145
- metrics,
146
- context,
147
- model,
148
- theme
149
- } = state;
133
+ var metrics = state.metrics,
134
+ context = state.context,
135
+ model = state.model,
136
+ theme = state.theme;
150
137
  if (context == null || metrics == null) {
151
138
  return EMPTY_ARRAY;
152
139
  }
153
- var {
154
- modelRows,
155
- modelColumns
156
- } = metrics;
140
+ var modelRows = metrics.modelRows,
141
+ modelColumns = metrics.modelColumns;
157
142
  var modelRow = getOrThrow(modelRows, row);
158
143
  var modelColumn = getOrThrow(modelColumns, column);
159
144
  var text = model.textForCell(modelColumn, modelRow);
160
- var {
161
- width: textWidth,
162
- x: textX,
163
- y: textY
164
- } = GridUtils.getTextRenderMetrics(state, column, row);
165
- var {
166
- fontWidthsLower,
167
- fontWidthsUpper
168
- } = metrics;
145
+ var _GridUtils$getTextRen2 = GridUtils.getTextRenderMetrics(state, column, row),
146
+ textWidth = _GridUtils$getTextRen2.width,
147
+ textX = _GridUtils$getTextRen2.x,
148
+ textY = _GridUtils$getTextRen2.y;
149
+ var fontWidthsLower = metrics.fontWidthsLower,
150
+ fontWidthsUpper = metrics.fontWidthsUpper;
169
151
 
170
152
  // Set the font and baseline and change it back after
171
153
  context.save();
@@ -174,10 +156,9 @@ class TextCellRenderer extends CellRenderer {
174
156
  var fontWidthUpper = fontWidthsUpper.get(context.font);
175
157
  var truncationChar = model.truncationCharForCell(modelColumn, modelRow);
176
158
  var truncatedText = this.getCachedTruncatedString(context, text, textWidth, fontWidthLower, fontWidthUpper, truncationChar);
177
- var {
178
- actualBoundingBoxAscent,
179
- actualBoundingBoxDescent
180
- } = context.measureText(truncatedText);
159
+ var _context$measureText3 = context.measureText(truncatedText),
160
+ actualBoundingBoxAscent = _context$measureText3.actualBoundingBoxAscent,
161
+ actualBoundingBoxDescent = _context$measureText3.actualBoundingBoxDescent;
181
162
  var textHeight = actualBoundingBoxAscent + actualBoundingBoxDescent;
182
163
  var tokens = model.tokensForCell(modelColumn, modelRow, truncatedText.length);
183
164
 
@@ -197,9 +178,7 @@ class TextCellRenderer extends CellRenderer {
197
178
  return cachedTokenBoxes;
198
179
  }
199
180
  configureContext(context, state) {
200
- var {
201
- theme
202
- } = state;
181
+ var theme = state.theme;
203
182
  context.font = theme.font;
204
183
  context.textBaseline = 'middle';
205
184
  context.lineCap = 'butt';
@@ -1 +1 @@
1
- {"version":3,"file":"TextCellRenderer.js","names":["EMPTY_ARRAY","getOrThrow","CellRenderer","isExpandableGridModel","GridUtils","memoizeClear","TextCellRenderer","constructor","arguments","_defineProperty","truncatedText","tokens","_font","_baseline","textHeight","context","top","bottom","tokenBoxes","lastTokenEnd","currentTextWidth","i","length","token","start","end","value","substring","measureText","width","tokenWidth","left","right","newTokenBox","x1","y1","x2","y2","push","max","drawCellContent","state","column","row","metrics","model","theme","fontWidthsLower","fontWidthsUpper","modelColumns","modelRows","allRowHeights","firstColumn","isFirstColumn","textColor","rowHeight","modelRow","modelColumn","text","textForCell","truncationChar","truncationCharForCell","textAlign","textAlignForCell","color","colorForCell","fillStyle","save","textWidth","x","textX","y","textY","getTextRenderMetrics","fontWidthLower","get","font","fontWidthUpper","getCachedTruncatedString","tokensForCell","tokenIndex","textStart","actualBoundingBoxDescent","_ref","_token$end","nextToken","textEnd","widthOfUnderline","endsWith","hyperlinkColor","fillText","fillRect","restore","hasExpandableRows","drawCellRowTreeMarker","getTokenBoxesForVisibleCell","configureContext","actualBoundingBoxAscent","cachedTokenBoxes","getCachedTokenBoxesForVisibleCell","map","tokenBox","textBaseline","lineCap"],"sources":["../src/TextCellRenderer.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { EMPTY_ARRAY, getOrThrow } from '@deephaven/utils';\nimport CellRenderer from './CellRenderer';\nimport { isExpandableGridModel } from './ExpandableGridModel';\nimport { type VisibleIndex } from './GridMetrics';\nimport { type GridRenderState } from './GridRendererTypes';\nimport GridUtils, { type TokenBox, type Token } from './GridUtils';\nimport memoizeClear from './memoizeClear';\nimport type TokenBoxCellRenderer from './TokenBoxCellRenderer';\n\nclass TextCellRenderer extends CellRenderer implements TokenBoxCellRenderer {\n drawCellContent(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex\n ): void {\n const { metrics, model, theme } = state;\n const {\n fontWidthsLower,\n fontWidthsUpper,\n modelColumns,\n modelRows,\n allRowHeights,\n firstColumn,\n } = metrics;\n const isFirstColumn = column === firstColumn;\n const { textColor } = theme;\n const rowHeight = getOrThrow(allRowHeights, row);\n const modelRow = getOrThrow(modelRows, row);\n const modelColumn = getOrThrow(modelColumns, column);\n const text = model.textForCell(modelColumn, modelRow);\n const truncationChar = model.truncationCharForCell(modelColumn, modelRow);\n\n if (text && rowHeight > 0) {\n const textAlign = model.textAlignForCell(modelColumn, modelRow) || 'left';\n context.textAlign = textAlign;\n\n const color =\n model.colorForCell(modelColumn, modelRow, theme) || textColor;\n context.fillStyle = color;\n\n context.save();\n\n const {\n width: textWidth,\n x: textX,\n y: textY,\n } = GridUtils.getTextRenderMetrics(state, column, row);\n\n const fontWidthLower = fontWidthsLower.get(context.font);\n const fontWidthUpper = fontWidthsUpper.get(context.font);\n const truncatedText = this.getCachedTruncatedString(\n context,\n text,\n textWidth,\n fontWidthLower,\n fontWidthUpper,\n truncationChar\n );\n\n const tokens = model.tokensForCell(\n modelColumn,\n modelRow,\n truncatedText.length\n );\n\n if (truncatedText) {\n let tokenIndex = 0;\n let textStart = 0;\n let left = textX;\n const { actualBoundingBoxDescent } = context.measureText(truncatedText);\n\n while (textStart < truncatedText.length) {\n const nextToken = tokens[tokenIndex];\n const token = textStart === nextToken?.start ? nextToken : null;\n const textEnd =\n token?.end ?? nextToken?.start ?? truncatedText.length;\n const value = truncatedText.substring(textStart, textEnd);\n const { width } = context.measureText(value);\n const widthOfUnderline = value.endsWith('…')\n ? width - context.measureText('…').width\n : width;\n\n // Set the styling based on the token, then draw the text\n if (token != null) {\n context.fillStyle = theme.hyperlinkColor;\n context.fillText(value, left, textY);\n context.fillRect(\n left,\n textY + actualBoundingBoxDescent,\n widthOfUnderline,\n 1\n );\n } else {\n context.fillStyle = color;\n context.fillText(value, left, textY);\n }\n\n left += width;\n textStart = textEnd;\n if (token != null) tokenIndex += 1;\n }\n }\n context.restore();\n }\n\n if (\n isFirstColumn &&\n isExpandableGridModel(model) &&\n model.hasExpandableRows\n ) {\n this.drawCellRowTreeMarker(context, state, row);\n }\n }\n\n /**\n * Gets the token boxes that are visible in the cell\n * @param column The visible column\n * @param row The visible row\n * @param state The GridRenderState\n * @returns An array of TokenBox of visible tokens or empty array with coordinates relative to gridX and gridY\n */\n getTokenBoxesForVisibleCell(\n column: VisibleIndex,\n row: VisibleIndex,\n state: GridRenderState\n ): TokenBox[] {\n const { metrics, context, model, theme } = state;\n\n if (context == null || metrics == null) {\n return EMPTY_ARRAY as unknown as TokenBox[];\n }\n\n const { modelRows, modelColumns } = metrics;\n const modelRow = getOrThrow(modelRows, row);\n const modelColumn = getOrThrow(modelColumns, column);\n\n const text = model.textForCell(modelColumn, modelRow);\n const {\n width: textWidth,\n x: textX,\n y: textY,\n } = GridUtils.getTextRenderMetrics(state, column, row);\n\n const { fontWidthsLower, fontWidthsUpper } = metrics;\n\n // Set the font and baseline and change it back after\n context.save();\n this.configureContext(context, state);\n\n const fontWidthLower = fontWidthsLower.get(context.font);\n const fontWidthUpper = fontWidthsUpper.get(context.font);\n const truncationChar = model.truncationCharForCell(modelColumn, modelRow);\n const truncatedText = this.getCachedTruncatedString(\n context,\n text,\n textWidth,\n fontWidthLower,\n fontWidthUpper,\n truncationChar\n );\n\n const { actualBoundingBoxAscent, actualBoundingBoxDescent } =\n context.measureText(truncatedText);\n const textHeight = actualBoundingBoxAscent + actualBoundingBoxDescent;\n\n const tokens = model.tokensForCell(\n modelColumn,\n modelRow,\n truncatedText.length\n );\n\n // Check if the truncated text contains a link\n if (tokens.length === 0) {\n context.restore();\n return EMPTY_ARRAY as unknown as TokenBox[];\n }\n\n const cachedTokenBoxes = this.getCachedTokenBoxesForVisibleCell(\n truncatedText,\n tokens,\n theme.font,\n 'middle',\n textHeight,\n context\n ).map(tokenBox => ({\n x1: tokenBox.x1 + textX,\n y1: tokenBox.y1 + (textY - actualBoundingBoxAscent),\n x2: tokenBox.x2 + textX,\n y2: tokenBox.y2 + (textY - actualBoundingBoxAscent),\n token: tokenBox.token,\n }));\n\n context.restore();\n\n return cachedTokenBoxes;\n }\n\n configureContext(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { theme } = state;\n context.font = theme.font;\n context.textBaseline = 'middle';\n context.lineCap = 'butt';\n }\n\n /**\n * Returns an array of token boxes with the coordinates relative to the top left corner of the text\n */\n getCachedTokenBoxesForVisibleCell = memoizeClear(\n (\n truncatedText: string,\n tokens: Token[],\n // _font and _baseline are passed in so value is re-calculated when they change\n // They should already be set on the `context`, so they are not used in this method\n _font: string,\n _baseline: CanvasTextBaseline,\n textHeight: number,\n context: CanvasRenderingContext2D\n ): TokenBox[] => {\n const top = 0;\n const bottom = textHeight;\n\n const tokenBoxes: TokenBox[] = [];\n\n // The index where the last token ended\n let lastTokenEnd = 0;\n // The width of the text preceding the current token\n let currentTextWidth = 0;\n // Loop through array and push them to array\n for (let i = 0; i < tokens.length; i += 1) {\n const token = tokens[i];\n const { start, end } = token;\n // The last token value is calculated based on the full text so the value needs to be truncated\n const value =\n end > truncatedText.length\n ? truncatedText.substring(start)\n : token.value;\n\n // Add the width of the text in between this token and the last token\n currentTextWidth += context.measureText(\n truncatedText.substring(lastTokenEnd, start)\n ).width;\n const tokenWidth = context.measureText(value).width;\n\n // Check if the x position is less than the grid x, then tokenWidth should be shifted by gridX - startX\n\n const left = currentTextWidth;\n const right = left + tokenWidth;\n\n const newTokenBox: TokenBox = {\n x1: left,\n y1: top,\n x2: right,\n y2: bottom,\n token,\n };\n\n tokenBoxes.push(newTokenBox);\n\n lastTokenEnd = end;\n currentTextWidth += tokenWidth;\n }\n\n return tokenBoxes;\n },\n { max: 10000 }\n );\n}\n\nexport default TextCellRenderer;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"TextCellRenderer.js","names":["EMPTY_ARRAY","getOrThrow","CellRenderer","isExpandableGridModel","GridUtils","memoizeClear","TextCellRenderer","constructor","arguments","_defineProperty","truncatedText","tokens","_font","_baseline","textHeight","context","top","bottom","tokenBoxes","lastTokenEnd","currentTextWidth","i","length","token","start","end","value","substring","measureText","width","tokenWidth","left","right","newTokenBox","x1","y1","x2","y2","push","max","drawCellContent","state","column","row","metrics","model","theme","fontWidthsLower","fontWidthsUpper","modelColumns","modelRows","allRowHeights","firstColumn","isFirstColumn","textColor","rowHeight","modelRow","modelColumn","text","textForCell","truncationChar","truncationCharForCell","textAlign","textAlignForCell","color","colorForCell","fillStyle","save","_GridUtils$getTextRen","getTextRenderMetrics","textWidth","textX","x","textY","y","fontWidthLower","get","font","fontWidthUpper","getCachedTruncatedString","tokensForCell","tokenIndex","textStart","_context$measureText","actualBoundingBoxDescent","_ref","_token$end","nextToken","textEnd","_context$measureText2","widthOfUnderline","endsWith","hyperlinkColor","fillText","fillRect","restore","hasExpandableRows","drawCellRowTreeMarker","getTokenBoxesForVisibleCell","_GridUtils$getTextRen2","configureContext","_context$measureText3","actualBoundingBoxAscent","cachedTokenBoxes","getCachedTokenBoxesForVisibleCell","map","tokenBox","textBaseline","lineCap"],"sources":["../src/TextCellRenderer.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { EMPTY_ARRAY, getOrThrow } from '@deephaven/utils';\nimport CellRenderer from './CellRenderer';\nimport { isExpandableGridModel } from './ExpandableGridModel';\nimport { type VisibleIndex } from './GridMetrics';\nimport { type GridRenderState } from './GridRendererTypes';\nimport GridUtils, { type TokenBox, type Token } from './GridUtils';\nimport memoizeClear from './memoizeClear';\nimport type TokenBoxCellRenderer from './TokenBoxCellRenderer';\n\nclass TextCellRenderer extends CellRenderer implements TokenBoxCellRenderer {\n drawCellContent(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex\n ): void {\n const { metrics, model, theme } = state;\n const {\n fontWidthsLower,\n fontWidthsUpper,\n modelColumns,\n modelRows,\n allRowHeights,\n firstColumn,\n } = metrics;\n const isFirstColumn = column === firstColumn;\n const { textColor } = theme;\n const rowHeight = getOrThrow(allRowHeights, row);\n const modelRow = getOrThrow(modelRows, row);\n const modelColumn = getOrThrow(modelColumns, column);\n const text = model.textForCell(modelColumn, modelRow);\n const truncationChar = model.truncationCharForCell(modelColumn, modelRow);\n\n if (text && rowHeight > 0) {\n const textAlign = model.textAlignForCell(modelColumn, modelRow) || 'left';\n context.textAlign = textAlign;\n\n const color =\n model.colorForCell(modelColumn, modelRow, theme) || textColor;\n context.fillStyle = color;\n\n context.save();\n\n const {\n width: textWidth,\n x: textX,\n y: textY,\n } = GridUtils.getTextRenderMetrics(state, column, row);\n\n const fontWidthLower = fontWidthsLower.get(context.font);\n const fontWidthUpper = fontWidthsUpper.get(context.font);\n const truncatedText = this.getCachedTruncatedString(\n context,\n text,\n textWidth,\n fontWidthLower,\n fontWidthUpper,\n truncationChar\n );\n\n const tokens = model.tokensForCell(\n modelColumn,\n modelRow,\n truncatedText.length\n );\n\n if (truncatedText) {\n let tokenIndex = 0;\n let textStart = 0;\n let left = textX;\n const { actualBoundingBoxDescent } = context.measureText(truncatedText);\n\n while (textStart < truncatedText.length) {\n const nextToken = tokens[tokenIndex];\n const token = textStart === nextToken?.start ? nextToken : null;\n const textEnd =\n token?.end ?? nextToken?.start ?? truncatedText.length;\n const value = truncatedText.substring(textStart, textEnd);\n const { width } = context.measureText(value);\n const widthOfUnderline = value.endsWith('…')\n ? width - context.measureText('…').width\n : width;\n\n // Set the styling based on the token, then draw the text\n if (token != null) {\n context.fillStyle = theme.hyperlinkColor;\n context.fillText(value, left, textY);\n context.fillRect(\n left,\n textY + actualBoundingBoxDescent,\n widthOfUnderline,\n 1\n );\n } else {\n context.fillStyle = color;\n context.fillText(value, left, textY);\n }\n\n left += width;\n textStart = textEnd;\n if (token != null) tokenIndex += 1;\n }\n }\n context.restore();\n }\n\n if (\n isFirstColumn &&\n isExpandableGridModel(model) &&\n model.hasExpandableRows\n ) {\n this.drawCellRowTreeMarker(context, state, row);\n }\n }\n\n /**\n * Gets the token boxes that are visible in the cell\n * @param column The visible column\n * @param row The visible row\n * @param state The GridRenderState\n * @returns An array of TokenBox of visible tokens or empty array with coordinates relative to gridX and gridY\n */\n getTokenBoxesForVisibleCell(\n column: VisibleIndex,\n row: VisibleIndex,\n state: GridRenderState\n ): TokenBox[] {\n const { metrics, context, model, theme } = state;\n\n if (context == null || metrics == null) {\n return EMPTY_ARRAY as unknown as TokenBox[];\n }\n\n const { modelRows, modelColumns } = metrics;\n const modelRow = getOrThrow(modelRows, row);\n const modelColumn = getOrThrow(modelColumns, column);\n\n const text = model.textForCell(modelColumn, modelRow);\n const {\n width: textWidth,\n x: textX,\n y: textY,\n } = GridUtils.getTextRenderMetrics(state, column, row);\n\n const { fontWidthsLower, fontWidthsUpper } = metrics;\n\n // Set the font and baseline and change it back after\n context.save();\n this.configureContext(context, state);\n\n const fontWidthLower = fontWidthsLower.get(context.font);\n const fontWidthUpper = fontWidthsUpper.get(context.font);\n const truncationChar = model.truncationCharForCell(modelColumn, modelRow);\n const truncatedText = this.getCachedTruncatedString(\n context,\n text,\n textWidth,\n fontWidthLower,\n fontWidthUpper,\n truncationChar\n );\n\n const { actualBoundingBoxAscent, actualBoundingBoxDescent } =\n context.measureText(truncatedText);\n const textHeight = actualBoundingBoxAscent + actualBoundingBoxDescent;\n\n const tokens = model.tokensForCell(\n modelColumn,\n modelRow,\n truncatedText.length\n );\n\n // Check if the truncated text contains a link\n if (tokens.length === 0) {\n context.restore();\n return EMPTY_ARRAY as unknown as TokenBox[];\n }\n\n const cachedTokenBoxes = this.getCachedTokenBoxesForVisibleCell(\n truncatedText,\n tokens,\n theme.font,\n 'middle',\n textHeight,\n context\n ).map(tokenBox => ({\n x1: tokenBox.x1 + textX,\n y1: tokenBox.y1 + (textY - actualBoundingBoxAscent),\n x2: tokenBox.x2 + textX,\n y2: tokenBox.y2 + (textY - actualBoundingBoxAscent),\n token: tokenBox.token,\n }));\n\n context.restore();\n\n return cachedTokenBoxes;\n }\n\n configureContext(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { theme } = state;\n context.font = theme.font;\n context.textBaseline = 'middle';\n context.lineCap = 'butt';\n }\n\n /**\n * Returns an array of token boxes with the coordinates relative to the top left corner of the text\n */\n getCachedTokenBoxesForVisibleCell = memoizeClear(\n (\n truncatedText: string,\n tokens: Token[],\n // _font and _baseline are passed in so value is re-calculated when they change\n // They should already be set on the `context`, so they are not used in this method\n _font: string,\n _baseline: CanvasTextBaseline,\n textHeight: number,\n context: CanvasRenderingContext2D\n ): TokenBox[] => {\n const top = 0;\n const bottom = textHeight;\n\n const tokenBoxes: TokenBox[] = [];\n\n // The index where the last token ended\n let lastTokenEnd = 0;\n // The width of the text preceding the current token\n let currentTextWidth = 0;\n // Loop through array and push them to array\n for (let i = 0; i < tokens.length; i += 1) {\n const token = tokens[i];\n const { start, end } = token;\n // The last token value is calculated based on the full text so the value needs to be truncated\n const value =\n end > truncatedText.length\n ? truncatedText.substring(start)\n : token.value;\n\n // Add the width of the text in between this token and the last token\n currentTextWidth += context.measureText(\n truncatedText.substring(lastTokenEnd, start)\n ).width;\n const tokenWidth = context.measureText(value).width;\n\n // Check if the x position is less than the grid x, then tokenWidth should be shifted by gridX - startX\n\n const left = currentTextWidth;\n const right = left + tokenWidth;\n\n const newTokenBox: TokenBox = {\n x1: left,\n y1: top,\n x2: right,\n y2: bottom,\n token,\n };\n\n tokenBoxes.push(newTokenBox);\n\n lastTokenEnd = end;\n currentTextWidth += tokenWidth;\n }\n\n return tokenBoxes;\n },\n { max: 10000 }\n );\n}\n\nexport default TextCellRenderer;\n"],"mappings":"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","ignoreList":[]}
@@ -8,13 +8,10 @@ class EditKeyHandler extends KeyHandler {
8
8
  if (GridUtils.isModifierKeyDown(event)) {
9
9
  return false;
10
10
  }
11
- var {
12
- model
13
- } = grid.props;
14
- var {
15
- cursorColumn,
16
- cursorRow
17
- } = grid.state;
11
+ var model = grid.props.model;
12
+ var _grid$state = grid.state,
13
+ cursorColumn = _grid$state.cursorColumn,
14
+ cursorRow = _grid$state.cursorRow;
18
15
  if (cursorColumn == null || cursorRow == null || !isEditableGridModel(model) || !model.isEditableRange(GridRange.makeCell(cursorColumn, cursorRow))) {
19
16
  return false;
20
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EditKeyHandler.js","names":["GridUtils","GridRange","KeyHandler","isEditableGridModel","EditKeyHandler","onDown","event","grid","isModifierKeyDown","model","props","cursorColumn","cursorRow","state","isEditableRange","makeCell","column","row","key","length","startEditing","undefined","setValueForCell"],"sources":["../../src/key-handlers/EditKeyHandler.ts"],"sourcesContent":["/* eslint class-methods-use-this: \"off\" */\nimport GridUtils from '../GridUtils';\nimport type Grid from '../Grid';\nimport GridRange from '../GridRange';\nimport KeyHandler, { type GridKeyboardEvent } from '../KeyHandler';\nimport { isEditableGridModel } from '../EditableGridModel';\nimport { type EventHandlerResult } from '../EventHandlerResult';\n\nclass EditKeyHandler extends KeyHandler {\n onDown(event: GridKeyboardEvent, grid: Grid): EventHandlerResult {\n if (GridUtils.isModifierKeyDown(event)) {\n return false;\n }\n\n const { model } = grid.props;\n const { cursorColumn, cursorRow } = grid.state;\n if (\n cursorColumn == null ||\n cursorRow == null ||\n !isEditableGridModel(model) ||\n !model.isEditableRange(GridRange.makeCell(cursorColumn, cursorRow))\n ) {\n return false;\n }\n const column: number | null = cursorColumn;\n const row: number | null = cursorRow;\n if (column == null || row == null) {\n return false;\n }\n\n if (event.key.length === 1) {\n grid.startEditing(column, row, true, [1, 1], event.key);\n return true;\n }\n\n if (event.key === 'F2') {\n grid.startEditing(column, row);\n return true;\n }\n\n if (event.key === 'Backspace') {\n grid.startEditing(column, row, true, undefined, '');\n return true;\n }\n\n if (event.key === 'Delete') {\n grid.setValueForCell(column, row, '');\n return true;\n }\n return false;\n }\n}\n\nexport default EditKeyHandler;\n"],"mappings":"AAAA;AAAA,OACOA,SAAS;AAAA,OAETC,SAAS;AAAA,OACTC,UAAU;AAAA,SACRC,mBAAmB;AAG5B,MAAMC,cAAc,SAASF,UAAU,CAAC;EACtCG,MAAMA,CAACC,KAAwB,EAAEC,IAAU,EAAsB;IAC/D,IAAIP,SAAS,CAACQ,iBAAiB,CAACF,KAAK,CAAC,EAAE;MACtC,OAAO,KAAK;IACd;IAEA,IAAM;MAAEG;IAAM,CAAC,GAAGF,IAAI,CAACG,KAAK;IAC5B,IAAM;MAAEC,YAAY;MAAEC;IAAU,CAAC,GAAGL,IAAI,CAACM,KAAK;IAC9C,IACEF,YAAY,IAAI,IAAI,IACpBC,SAAS,IAAI,IAAI,IACjB,CAACT,mBAAmB,CAACM,KAAK,CAAC,IAC3B,CAACA,KAAK,CAACK,eAAe,CAACb,SAAS,CAACc,QAAQ,CAACJ,YAAY,EAAEC,SAAS,CAAC,CAAC,EACnE;MACA,OAAO,KAAK;IACd;IACA,IAAMI,MAAqB,GAAGL,YAAY;IAC1C,IAAMM,GAAkB,GAAGL,SAAS;IACpC,IAAII,MAAM,IAAI,IAAI,IAAIC,GAAG,IAAI,IAAI,EAAE;MACjC,OAAO,KAAK;IACd;IAEA,IAAIX,KAAK,CAACY,GAAG,CAACC,MAAM,KAAK,CAAC,EAAE;MAC1BZ,IAAI,CAACa,YAAY,CAACJ,MAAM,EAAEC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAEX,KAAK,CAACY,GAAG,CAAC;MACvD,OAAO,IAAI;IACb;IAEA,IAAIZ,KAAK,CAACY,GAAG,KAAK,IAAI,EAAE;MACtBX,IAAI,CAACa,YAAY,CAACJ,MAAM,EAAEC,GAAG,CAAC;MAC9B,OAAO,IAAI;IACb;IAEA,IAAIX,KAAK,CAACY,GAAG,KAAK,WAAW,EAAE;MAC7BX,IAAI,CAACa,YAAY,CAACJ,MAAM,EAAEC,GAAG,EAAE,IAAI,EAAEI,SAAS,EAAE,EAAE,CAAC;MACnD,OAAO,IAAI;IACb;IAEA,IAAIf,KAAK,CAACY,GAAG,KAAK,QAAQ,EAAE;MAC1BX,IAAI,CAACe,eAAe,CAACN,MAAM,EAAEC,GAAG,EAAE,EAAE,CAAC;MACrC,OAAO,IAAI;IACb;IACA,OAAO,KAAK;EACd;AACF;AAEA,eAAeb,cAAc","ignoreList":[]}
1
+ {"version":3,"file":"EditKeyHandler.js","names":["GridUtils","GridRange","KeyHandler","isEditableGridModel","EditKeyHandler","onDown","event","grid","isModifierKeyDown","model","props","_grid$state","state","cursorColumn","cursorRow","isEditableRange","makeCell","column","row","key","length","startEditing","undefined","setValueForCell"],"sources":["../../src/key-handlers/EditKeyHandler.ts"],"sourcesContent":["/* eslint class-methods-use-this: \"off\" */\nimport GridUtils from '../GridUtils';\nimport type Grid from '../Grid';\nimport GridRange from '../GridRange';\nimport KeyHandler, { type GridKeyboardEvent } from '../KeyHandler';\nimport { isEditableGridModel } from '../EditableGridModel';\nimport { type EventHandlerResult } from '../EventHandlerResult';\n\nclass EditKeyHandler extends KeyHandler {\n onDown(event: GridKeyboardEvent, grid: Grid): EventHandlerResult {\n if (GridUtils.isModifierKeyDown(event)) {\n return false;\n }\n\n const { model } = grid.props;\n const { cursorColumn, cursorRow } = grid.state;\n if (\n cursorColumn == null ||\n cursorRow == null ||\n !isEditableGridModel(model) ||\n !model.isEditableRange(GridRange.makeCell(cursorColumn, cursorRow))\n ) {\n return false;\n }\n const column: number | null = cursorColumn;\n const row: number | null = cursorRow;\n if (column == null || row == null) {\n return false;\n }\n\n if (event.key.length === 1) {\n grid.startEditing(column, row, true, [1, 1], event.key);\n return true;\n }\n\n if (event.key === 'F2') {\n grid.startEditing(column, row);\n return true;\n }\n\n if (event.key === 'Backspace') {\n grid.startEditing(column, row, true, undefined, '');\n return true;\n }\n\n if (event.key === 'Delete') {\n grid.setValueForCell(column, row, '');\n return true;\n }\n return false;\n }\n}\n\nexport default EditKeyHandler;\n"],"mappings":"AAAA;AAAA,OACOA,SAAS;AAAA,OAETC,SAAS;AAAA,OACTC,UAAU;AAAA,SACRC,mBAAmB;AAG5B,MAAMC,cAAc,SAASF,UAAU,CAAC;EACtCG,MAAMA,CAACC,KAAwB,EAAEC,IAAU,EAAsB;IAC/D,IAAIP,SAAS,CAACQ,iBAAiB,CAACF,KAAK,CAAC,EAAE;MACtC,OAAO,KAAK;IACd;IAEA,IAAQG,KAAK,GAAKF,IAAI,CAACG,KAAK,CAApBD,KAAK;IACb,IAAAE,WAAA,GAAoCJ,IAAI,CAACK,KAAK;MAAtCC,YAAY,GAAAF,WAAA,CAAZE,YAAY;MAAEC,SAAS,GAAAH,WAAA,CAATG,SAAS;IAC/B,IACED,YAAY,IAAI,IAAI,IACpBC,SAAS,IAAI,IAAI,IACjB,CAACX,mBAAmB,CAACM,KAAK,CAAC,IAC3B,CAACA,KAAK,CAACM,eAAe,CAACd,SAAS,CAACe,QAAQ,CAACH,YAAY,EAAEC,SAAS,CAAC,CAAC,EACnE;MACA,OAAO,KAAK;IACd;IACA,IAAMG,MAAqB,GAAGJ,YAAY;IAC1C,IAAMK,GAAkB,GAAGJ,SAAS;IACpC,IAAIG,MAAM,IAAI,IAAI,IAAIC,GAAG,IAAI,IAAI,EAAE;MACjC,OAAO,KAAK;IACd;IAEA,IAAIZ,KAAK,CAACa,GAAG,CAACC,MAAM,KAAK,CAAC,EAAE;MAC1Bb,IAAI,CAACc,YAAY,CAACJ,MAAM,EAAEC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAEZ,KAAK,CAACa,GAAG,CAAC;MACvD,OAAO,IAAI;IACb;IAEA,IAAIb,KAAK,CAACa,GAAG,KAAK,IAAI,EAAE;MACtBZ,IAAI,CAACc,YAAY,CAACJ,MAAM,EAAEC,GAAG,CAAC;MAC9B,OAAO,IAAI;IACb;IAEA,IAAIZ,KAAK,CAACa,GAAG,KAAK,WAAW,EAAE;MAC7BZ,IAAI,CAACc,YAAY,CAACJ,MAAM,EAAEC,GAAG,EAAE,IAAI,EAAEI,SAAS,EAAE,EAAE,CAAC;MACnD,OAAO,IAAI;IACb;IAEA,IAAIhB,KAAK,CAACa,GAAG,KAAK,QAAQ,EAAE;MAC1BZ,IAAI,CAACgB,eAAe,CAACN,MAAM,EAAEC,GAAG,EAAE,EAAE,CAAC;MACrC,OAAO,IAAI;IACb;IACA,OAAO,KAAK;EACd;AACF;AAEA,eAAed,cAAc","ignoreList":[]}
@@ -62,9 +62,7 @@ export function parseValueFromElement(element) {
62
62
  if (text.length > 0) {
63
63
  // If there's text content, try and parse out a table from the child nodes. Each node is a row.
64
64
  // If there's only one row and it doesn't contain a tab, then just treat it as a regular value
65
- var {
66
- childNodes
67
- } = element;
65
+ var childNodes = element.childNodes;
68
66
  var hasTabChar = text.includes('\t');
69
67
  var hasFirefoxTab = text.includes('\u00a0\u00a0\u00a0 ');
70
68
  if (hasTabChar && childNodes.length !== 0 && (childNodes.length === 1 || childNodes.length > 1 && (childNodes[0].textContent == null || !childNodes[0].textContent.includes('\t')))) {
@@ -1 +1 @@
1
- {"version":3,"file":"PasteKeyHandler.js","names":["GridUtils","KeyHandler","parseValueFromTable","table","data","rows","querySelectorAll","r","length","row","cells","rowData","c","_cell$textContent$tri","_cell$textContent","cell","push","textContent","trim","parseValueFromNodes","nodes","result","forEach","node","_node$textContent","text","split","parseValueFromText","map","parseValueFromElement","element","_element$textContent$","_element$textContent","querySelector","childNodes","hasTabChar","includes","hasFirefoxTab","PasteKeyHandler","onDown","event","grid","key","isModifierKeyDown","dummyInput","document","createElement","body","appendChild","setAttribute","cleanup","removeEventListener","pasteListener","inputListener","remove","focus","plainText","e","_clipboardEvent$clipb","_clipboardEvent$clipb2","clipboardEvent","clipboardData","getData","_ref","value","pasteValue","addEventListener","preventDefault","stopPropagation"],"sources":["../../src/key-handlers/PasteKeyHandler.ts"],"sourcesContent":["/* eslint class-methods-use-this: \"off\" */\nimport { type EventHandlerResult } from '../EventHandlerResult';\nimport type Grid from '../Grid';\nimport GridUtils from '../GridUtils';\nimport KeyHandler, { type GridKeyboardEvent } from '../KeyHandler';\n\n/**\n * Parse out data from an HTML table. Currently does not support colspan/rowspan\n * @param table HTML Table\n * @returns A two dimensional array with the data found in the table\n */\nexport function parseValueFromTable(table: HTMLTableElement): string[][] {\n const data = [];\n const rows = table.querySelectorAll('tr');\n for (let r = 0; r < rows.length; r += 1) {\n const row = rows[r];\n const cells = row.querySelectorAll('td');\n const rowData = [];\n for (let c = 0; c < cells.length; c += 1) {\n const cell = cells[c];\n rowData.push(cell.textContent?.trim() ?? '');\n }\n data.push(rowData);\n }\n\n return data;\n}\n\n/**\n * Parses out a table of data from HTML elements. Treats each element as one rows.\n * Filters out blank rows.\n * @param rows The elements to parse out\n * @returns A string table of data\n */\nexport function parseValueFromNodes(nodes: NodeListOf<ChildNode>): string[][] {\n const result = [] as string[][];\n nodes.forEach(node => {\n const text = node.textContent ?? '';\n if (text.length > 0) {\n // When Chrome pastes a table from text, it preserves the tab characters\n // In Firefox, it breaks it into a combination of non-breaking spaces and spaces\n result.push(text.split(/\\t|\\u00a0\\u00a0\\u00a0 /));\n }\n });\n return result;\n}\n\nexport function parseValueFromText(text: string): string | string[][] {\n const rows = text\n .trim()\n .split('\\n')\n .map(row => row.split('\\t'));\n if (rows.length === 1 && rows[0].length === 1) {\n return rows[0][0];\n }\n return rows;\n}\n\nexport function parseValueFromElement(\n element: HTMLElement\n): string | string[][] | null {\n // Check first if there's an HTML table element that we can use\n const table = element.querySelector('table');\n if (table != null) {\n return parseValueFromTable(table);\n }\n\n // Otherwise check if there's any text content at all\n const text = element.textContent?.trim() ?? '';\n if (text.length > 0) {\n // If there's text content, try and parse out a table from the child nodes. Each node is a row.\n // If there's only one row and it doesn't contain a tab, then just treat it as a regular value\n const { childNodes } = element;\n const hasTabChar = text.includes('\\t');\n const hasFirefoxTab = text.includes('\\u00a0\\u00a0\\u00a0 ');\n if (\n hasTabChar &&\n childNodes.length !== 0 &&\n (childNodes.length === 1 ||\n (childNodes.length > 1 &&\n (childNodes[0].textContent == null ||\n !childNodes[0].textContent.includes('\\t'))))\n ) {\n // When Chrome pastes a single row, it gets split into multiple child nodes\n // If we check the first child node and it doesn't have a tab character, but the full element text content does, then\n // just parse the text out separated by the tab chars\n return text.split('\\n').map(row => row.split('\\t'));\n }\n if (childNodes.length > 1 || hasFirefoxTab) {\n return parseValueFromNodes(element.childNodes);\n }\n // If there's no tabs or no multiple rows, than just treat it as one value\n return text;\n }\n return null;\n}\n\n/**\n * Handles the paste key combination\n */\nclass PasteKeyHandler extends KeyHandler {\n onDown(event: GridKeyboardEvent, grid: Grid): EventHandlerResult {\n switch (event.key) {\n case 'v':\n if (GridUtils.isModifierKeyDown(event)) {\n // Chrome doesn't allow the paste event on canvas elements\n // Instead, we capture the ctrl+v keydown, then do this to capture the input\n const dummyInput = document.createElement('div');\n document.body.appendChild(dummyInput);\n dummyInput.setAttribute('contenteditable', 'true');\n\n // Give it invisible styling\n dummyInput.setAttribute(\n 'style',\n 'clip-path: \"inset(50%)\"; height: 1px; width: 1px; margin: -1px; overflow: hidden; padding 0; position: absolute;'\n );\n\n const cleanup = (): void => {\n dummyInput.removeEventListener('paste', pasteListener);\n dummyInput.removeEventListener('input', inputListener);\n dummyInput.remove();\n grid.focus();\n };\n\n let plainText = '';\n\n // Capture text/plain from the clipboard during the paste event.\n // HTML element parsing is used as a fallback if text/plain is unavailable.\n const pasteListener = (e: Event): void => {\n const clipboardEvent = e as ClipboardEvent;\n plainText =\n clipboardEvent.clipboardData?.getData('text/plain') ?? '';\n };\n\n const inputListener = (): void => {\n cleanup();\n const value =\n (plainText.length > 0 ? parseValueFromText(plainText) : null) ??\n parseValueFromElement(dummyInput);\n if (value != null) {\n grid.pasteValue(value);\n }\n };\n\n dummyInput.addEventListener('paste', pasteListener);\n dummyInput.addEventListener('input', inputListener);\n\n // Focus the element so it receives the paste event\n dummyInput.focus();\n\n // Don't block the paste event from updating our dummy input\n return { preventDefault: false, stopPropagation: true };\n }\n break;\n }\n return false;\n }\n}\n\nexport default PasteKeyHandler;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"PasteKeyHandler.js","names":["GridUtils","KeyHandler","parseValueFromTable","table","data","rows","querySelectorAll","r","length","row","cells","rowData","c","_cell$textContent$tri","_cell$textContent","cell","push","textContent","trim","parseValueFromNodes","nodes","result","forEach","node","_node$textContent","text","split","parseValueFromText","map","parseValueFromElement","element","_element$textContent$","_element$textContent","querySelector","childNodes","hasTabChar","includes","hasFirefoxTab","PasteKeyHandler","onDown","event","grid","key","isModifierKeyDown","dummyInput","document","createElement","body","appendChild","setAttribute","cleanup","removeEventListener","pasteListener","inputListener","remove","focus","plainText","e","_clipboardEvent$clipb","_clipboardEvent$clipb2","clipboardEvent","clipboardData","getData","_ref","value","pasteValue","addEventListener","preventDefault","stopPropagation"],"sources":["../../src/key-handlers/PasteKeyHandler.ts"],"sourcesContent":["/* eslint class-methods-use-this: \"off\" */\nimport { type EventHandlerResult } from '../EventHandlerResult';\nimport type Grid from '../Grid';\nimport GridUtils from '../GridUtils';\nimport KeyHandler, { type GridKeyboardEvent } from '../KeyHandler';\n\n/**\n * Parse out data from an HTML table. Currently does not support colspan/rowspan\n * @param table HTML Table\n * @returns A two dimensional array with the data found in the table\n */\nexport function parseValueFromTable(table: HTMLTableElement): string[][] {\n const data = [];\n const rows = table.querySelectorAll('tr');\n for (let r = 0; r < rows.length; r += 1) {\n const row = rows[r];\n const cells = row.querySelectorAll('td');\n const rowData = [];\n for (let c = 0; c < cells.length; c += 1) {\n const cell = cells[c];\n rowData.push(cell.textContent?.trim() ?? '');\n }\n data.push(rowData);\n }\n\n return data;\n}\n\n/**\n * Parses out a table of data from HTML elements. Treats each element as one rows.\n * Filters out blank rows.\n * @param rows The elements to parse out\n * @returns A string table of data\n */\nexport function parseValueFromNodes(nodes: NodeListOf<ChildNode>): string[][] {\n const result = [] as string[][];\n nodes.forEach(node => {\n const text = node.textContent ?? '';\n if (text.length > 0) {\n // When Chrome pastes a table from text, it preserves the tab characters\n // In Firefox, it breaks it into a combination of non-breaking spaces and spaces\n result.push(text.split(/\\t|\\u00a0\\u00a0\\u00a0 /));\n }\n });\n return result;\n}\n\nexport function parseValueFromText(text: string): string | string[][] {\n const rows = text\n .trim()\n .split('\\n')\n .map(row => row.split('\\t'));\n if (rows.length === 1 && rows[0].length === 1) {\n return rows[0][0];\n }\n return rows;\n}\n\nexport function parseValueFromElement(\n element: HTMLElement\n): string | string[][] | null {\n // Check first if there's an HTML table element that we can use\n const table = element.querySelector('table');\n if (table != null) {\n return parseValueFromTable(table);\n }\n\n // Otherwise check if there's any text content at all\n const text = element.textContent?.trim() ?? '';\n if (text.length > 0) {\n // If there's text content, try and parse out a table from the child nodes. Each node is a row.\n // If there's only one row and it doesn't contain a tab, then just treat it as a regular value\n const { childNodes } = element;\n const hasTabChar = text.includes('\\t');\n const hasFirefoxTab = text.includes('\\u00a0\\u00a0\\u00a0 ');\n if (\n hasTabChar &&\n childNodes.length !== 0 &&\n (childNodes.length === 1 ||\n (childNodes.length > 1 &&\n (childNodes[0].textContent == null ||\n !childNodes[0].textContent.includes('\\t'))))\n ) {\n // When Chrome pastes a single row, it gets split into multiple child nodes\n // If we check the first child node and it doesn't have a tab character, but the full element text content does, then\n // just parse the text out separated by the tab chars\n return text.split('\\n').map(row => row.split('\\t'));\n }\n if (childNodes.length > 1 || hasFirefoxTab) {\n return parseValueFromNodes(element.childNodes);\n }\n // If there's no tabs or no multiple rows, than just treat it as one value\n return text;\n }\n return null;\n}\n\n/**\n * Handles the paste key combination\n */\nclass PasteKeyHandler extends KeyHandler {\n onDown(event: GridKeyboardEvent, grid: Grid): EventHandlerResult {\n switch (event.key) {\n case 'v':\n if (GridUtils.isModifierKeyDown(event)) {\n // Chrome doesn't allow the paste event on canvas elements\n // Instead, we capture the ctrl+v keydown, then do this to capture the input\n const dummyInput = document.createElement('div');\n document.body.appendChild(dummyInput);\n dummyInput.setAttribute('contenteditable', 'true');\n\n // Give it invisible styling\n dummyInput.setAttribute(\n 'style',\n 'clip-path: \"inset(50%)\"; height: 1px; width: 1px; margin: -1px; overflow: hidden; padding 0; position: absolute;'\n );\n\n const cleanup = (): void => {\n dummyInput.removeEventListener('paste', pasteListener);\n dummyInput.removeEventListener('input', inputListener);\n dummyInput.remove();\n grid.focus();\n };\n\n let plainText = '';\n\n // Capture text/plain from the clipboard during the paste event.\n // HTML element parsing is used as a fallback if text/plain is unavailable.\n const pasteListener = (e: Event): void => {\n const clipboardEvent = e as ClipboardEvent;\n plainText =\n clipboardEvent.clipboardData?.getData('text/plain') ?? '';\n };\n\n const inputListener = (): void => {\n cleanup();\n const value =\n (plainText.length > 0 ? parseValueFromText(plainText) : null) ??\n parseValueFromElement(dummyInput);\n if (value != null) {\n grid.pasteValue(value);\n }\n };\n\n dummyInput.addEventListener('paste', pasteListener);\n dummyInput.addEventListener('input', inputListener);\n\n // Focus the element so it receives the paste event\n dummyInput.focus();\n\n // Don't block the paste event from updating our dummy input\n return { preventDefault: false, stopPropagation: true };\n }\n break;\n }\n return false;\n }\n}\n\nexport default PasteKeyHandler;\n"],"mappings":"AAAA;AAAA,OAGOA,SAAS;AAAA,OACTC,UAAU;AAEjB;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,mBAAmBA,CAACC,KAAuB,EAAc;EACvE,IAAMC,IAAI,GAAG,EAAE;EACf,IAAMC,IAAI,GAAGF,KAAK,CAACG,gBAAgB,CAAC,IAAI,CAAC;EACzC,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,IAAI,CAACG,MAAM,EAAED,CAAC,IAAI,CAAC,EAAE;IACvC,IAAME,GAAG,GAAGJ,IAAI,CAACE,CAAC,CAAC;IACnB,IAAMG,KAAK,GAAGD,GAAG,CAACH,gBAAgB,CAAC,IAAI,CAAC;IACxC,IAAMK,OAAO,GAAG,EAAE;IAClB,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,KAAK,CAACF,MAAM,EAAEI,CAAC,IAAI,CAAC,EAAE;MAAA,IAAAC,qBAAA,EAAAC,iBAAA;MACxC,IAAMC,IAAI,GAAGL,KAAK,CAACE,CAAC,CAAC;MACrBD,OAAO,CAACK,IAAI,EAAAH,qBAAA,IAAAC,iBAAA,GAACC,IAAI,CAACE,WAAW,cAAAH,iBAAA,uBAAhBA,iBAAA,CAAkBI,IAAI,CAAC,CAAC,cAAAL,qBAAA,cAAAA,qBAAA,GAAI,EAAE,CAAC;IAC9C;IACAT,IAAI,CAACY,IAAI,CAACL,OAAO,CAAC;EACpB;EAEA,OAAOP,IAAI;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASe,mBAAmBA,CAACC,KAA4B,EAAc;EAC5E,IAAMC,MAAM,GAAG,EAAgB;EAC/BD,KAAK,CAACE,OAAO,CAACC,IAAI,IAAI;IAAA,IAAAC,iBAAA;IACpB,IAAMC,IAAI,IAAAD,iBAAA,GAAGD,IAAI,CAACN,WAAW,cAAAO,iBAAA,cAAAA,iBAAA,GAAI,EAAE;IACnC,IAAIC,IAAI,CAACjB,MAAM,GAAG,CAAC,EAAE;MACnB;MACA;MACAa,MAAM,CAACL,IAAI,CAACS,IAAI,CAACC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACnD;EACF,CAAC,CAAC;EACF,OAAOL,MAAM;AACf;AAEA,OAAO,SAASM,kBAAkBA,CAACF,IAAY,EAAuB;EACpE,IAAMpB,IAAI,GAAGoB,IAAI,CACdP,IAAI,CAAC,CAAC,CACNQ,KAAK,CAAC,IAAI,CAAC,CACXE,GAAG,CAACnB,GAAG,IAAIA,GAAG,CAACiB,KAAK,CAAC,IAAI,CAAC,CAAC;EAC9B,IAAIrB,IAAI,CAACG,MAAM,KAAK,CAAC,IAAIH,IAAI,CAAC,CAAC,CAAC,CAACG,MAAM,KAAK,CAAC,EAAE;IAC7C,OAAOH,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;EACnB;EACA,OAAOA,IAAI;AACb;AAEA,OAAO,SAASwB,qBAAqBA,CACnCC,OAAoB,EACQ;EAAA,IAAAC,qBAAA,EAAAC,oBAAA;EAC5B;EACA,IAAM7B,KAAK,GAAG2B,OAAO,CAACG,aAAa,CAAC,OAAO,CAAC;EAC5C,IAAI9B,KAAK,IAAI,IAAI,EAAE;IACjB,OAAOD,mBAAmB,CAACC,KAAK,CAAC;EACnC;;EAEA;EACA,IAAMsB,IAAI,IAAAM,qBAAA,IAAAC,oBAAA,GAAGF,OAAO,CAACb,WAAW,cAAAe,oBAAA,uBAAnBA,oBAAA,CAAqBd,IAAI,CAAC,CAAC,cAAAa,qBAAA,cAAAA,qBAAA,GAAI,EAAE;EAC9C,IAAIN,IAAI,CAACjB,MAAM,GAAG,CAAC,EAAE;IACnB;IACA;IACA,IAAQ0B,UAAU,GAAKJ,OAAO,CAAtBI,UAAU;IAClB,IAAMC,UAAU,GAAGV,IAAI,CAACW,QAAQ,CAAC,IAAI,CAAC;IACtC,IAAMC,aAAa,GAAGZ,IAAI,CAACW,QAAQ,CAAC,qBAAqB,CAAC;IAC1D,IACED,UAAU,IACVD,UAAU,CAAC1B,MAAM,KAAK,CAAC,KACtB0B,UAAU,CAAC1B,MAAM,KAAK,CAAC,IACrB0B,UAAU,CAAC1B,MAAM,GAAG,CAAC,KACnB0B,UAAU,CAAC,CAAC,CAAC,CAACjB,WAAW,IAAI,IAAI,IAChC,CAACiB,UAAU,CAAC,CAAC,CAAC,CAACjB,WAAW,CAACmB,QAAQ,CAAC,IAAI,CAAC,CAAE,CAAC,EAClD;MACA;MACA;MACA;MACA,OAAOX,IAAI,CAACC,KAAK,CAAC,IAAI,CAAC,CAACE,GAAG,CAACnB,GAAG,IAAIA,GAAG,CAACiB,KAAK,CAAC,IAAI,CAAC,CAAC;IACrD;IACA,IAAIQ,UAAU,CAAC1B,MAAM,GAAG,CAAC,IAAI6B,aAAa,EAAE;MAC1C,OAAOlB,mBAAmB,CAACW,OAAO,CAACI,UAAU,CAAC;IAChD;IACA;IACA,OAAOT,IAAI;EACb;EACA,OAAO,IAAI;AACb;;AAEA;AACA;AACA;AACA,MAAMa,eAAe,SAASrC,UAAU,CAAC;EACvCsC,MAAMA,CAACC,KAAwB,EAAEC,IAAU,EAAsB;IAC/D,QAAQD,KAAK,CAACE,GAAG;MACf,KAAK,GAAG;QACN,IAAI1C,SAAS,CAAC2C,iBAAiB,CAACH,KAAK,CAAC,EAAE;UACtC;UACA;UACA,IAAMI,UAAU,GAAGC,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;UAChDD,QAAQ,CAACE,IAAI,CAACC,WAAW,CAACJ,UAAU,CAAC;UACrCA,UAAU,CAACK,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC;;UAElD;UACAL,UAAU,CAACK,YAAY,CACrB,OAAO,EACP,kHACF,CAAC;UAED,IAAMC,OAAO,GAAGA,CAAA,KAAY;YAC1BN,UAAU,CAACO,mBAAmB,CAAC,OAAO,EAAEC,aAAa,CAAC;YACtDR,UAAU,CAACO,mBAAmB,CAAC,OAAO,EAAEE,aAAa,CAAC;YACtDT,UAAU,CAACU,MAAM,CAAC,CAAC;YACnBb,IAAI,CAACc,KAAK,CAAC,CAAC;UACd,CAAC;UAED,IAAIC,SAAS,GAAG,EAAE;;UAElB;UACA;UACA,IAAMJ,aAAa,GAAIK,CAAQ,IAAW;YAAA,IAAAC,qBAAA,EAAAC,sBAAA;YACxC,IAAMC,cAAc,GAAGH,CAAmB;YAC1CD,SAAS,IAAAE,qBAAA,IAAAC,sBAAA,GACPC,cAAc,CAACC,aAAa,cAAAF,sBAAA,uBAA5BA,sBAAA,CAA8BG,OAAO,CAAC,YAAY,CAAC,cAAAJ,qBAAA,cAAAA,qBAAA,GAAI,EAAE;UAC7D,CAAC;UAED,IAAML,aAAa,GAAGA,CAAA,KAAY;YAAA,IAAAU,IAAA;YAChCb,OAAO,CAAC,CAAC;YACT,IAAMc,KAAK,IAAAD,IAAA,GACRP,SAAS,CAAChD,MAAM,GAAG,CAAC,GAAGmB,kBAAkB,CAAC6B,SAAS,CAAC,GAAG,IAAI,cAAAO,IAAA,cAAAA,IAAA,GAC5DlC,qBAAqB,CAACe,UAAU,CAAC;YACnC,IAAIoB,KAAK,IAAI,IAAI,EAAE;cACjBvB,IAAI,CAACwB,UAAU,CAACD,KAAK,CAAC;YACxB;UACF,CAAC;UAEDpB,UAAU,CAACsB,gBAAgB,CAAC,OAAO,EAAEd,aAAa,CAAC;UACnDR,UAAU,CAACsB,gBAAgB,CAAC,OAAO,EAAEb,aAAa,CAAC;;UAEnD;UACAT,UAAU,CAACW,KAAK,CAAC,CAAC;;UAElB;UACA,OAAO;YAAEY,cAAc,EAAE,KAAK;YAAEC,eAAe,EAAE;UAAK,CAAC;QACzD;QACA;IACJ;IACA,OAAO,KAAK;EACd;AACF;AAEA,eAAe9B,eAAe","ignoreList":[]}