@deephaven/grid 0.22.3-beta.18 → 0.22.3-beta.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.
Files changed (82) hide show
  1. package/dist/CellInputField.d.ts +5 -5
  2. package/dist/CellInputField.d.ts.map +1 -1
  3. package/dist/CellInputField.js +6 -23
  4. package/dist/CellInputField.js.map +1 -1
  5. package/dist/EditableGridModel.js +1 -0
  6. package/dist/EditableGridModel.js.map +1 -1
  7. package/dist/ExpandableGridModel.js +1 -0
  8. package/dist/ExpandableGridModel.js.map +1 -1
  9. package/dist/Grid.js +77 -315
  10. package/dist/Grid.js.map +1 -1
  11. package/dist/GridAxisRange.js.map +1 -1
  12. package/dist/GridColorUtils.js +1 -2
  13. package/dist/GridColorUtils.js.map +1 -1
  14. package/dist/GridMetricCalculator.js +83 -240
  15. package/dist/GridMetricCalculator.js.map +1 -1
  16. package/dist/GridModel.js +13 -31
  17. package/dist/GridModel.js.map +1 -1
  18. package/dist/GridMouseHandler.js +2 -15
  19. package/dist/GridMouseHandler.js.map +1 -1
  20. package/dist/GridRange.js +46 -160
  21. package/dist/GridRange.js.map +1 -1
  22. package/dist/GridRenderer.js +126 -407
  23. package/dist/GridRenderer.js.map +1 -1
  24. package/dist/GridTestUtils.js +0 -5
  25. package/dist/GridTestUtils.js.map +1 -1
  26. package/dist/GridTheme.js.map +1 -1
  27. package/dist/GridUtils.js +68 -217
  28. package/dist/GridUtils.js.map +1 -1
  29. package/dist/KeyHandler.js +2 -8
  30. package/dist/KeyHandler.js.map +1 -1
  31. package/dist/MockGridData.js.map +1 -1
  32. package/dist/MockGridModel.js +0 -42
  33. package/dist/MockGridModel.js.map +1 -1
  34. package/dist/MockTreeGridModel.js +6 -55
  35. package/dist/MockTreeGridModel.js.map +1 -1
  36. package/dist/StaticDataGridModel.js +0 -15
  37. package/dist/StaticDataGridModel.js.map +1 -1
  38. package/dist/ThemeContext.js.map +1 -1
  39. package/dist/ViewportDataGridModel.js +0 -14
  40. package/dist/ViewportDataGridModel.js.map +1 -1
  41. package/dist/errors/AssertionError.js +0 -3
  42. package/dist/errors/AssertionError.js.map +1 -1
  43. package/dist/errors/PasteError.js +0 -3
  44. package/dist/errors/PasteError.js.map +1 -1
  45. package/dist/errors/assertIsDefined.js.map +1 -1
  46. package/dist/errors/index.js.map +1 -1
  47. package/dist/index.js.map +1 -1
  48. package/dist/key-handlers/EditKeyHandler.js +0 -12
  49. package/dist/key-handlers/EditKeyHandler.js.map +1 -1
  50. package/dist/key-handlers/PasteKeyHandler.js +15 -33
  51. package/dist/key-handlers/PasteKeyHandler.js.map +1 -1
  52. package/dist/key-handlers/SelectionKeyHandler.js +6 -53
  53. package/dist/key-handlers/SelectionKeyHandler.js.map +1 -1
  54. package/dist/key-handlers/TreeKeyHandler.js +0 -11
  55. package/dist/key-handlers/TreeKeyHandler.js.map +1 -1
  56. package/dist/key-handlers/index.js.map +1 -1
  57. package/dist/memoizeClear.js +1 -4
  58. package/dist/memoizeClear.js.map +1 -1
  59. package/dist/mouse-handlers/EditMouseHandler.js +0 -5
  60. package/dist/mouse-handlers/EditMouseHandler.js.map +1 -1
  61. package/dist/mouse-handlers/GridColumnMoveMouseHandler.js +35 -123
  62. package/dist/mouse-handlers/GridColumnMoveMouseHandler.js.map +1 -1
  63. package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.js +2 -27
  64. package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.js.map +1 -1
  65. package/dist/mouse-handlers/GridHorizontalScrollBarMouseHandler.js +0 -28
  66. package/dist/mouse-handlers/GridHorizontalScrollBarMouseHandler.js.map +1 -1
  67. package/dist/mouse-handlers/GridRowMoveMouseHandler.js +0 -27
  68. package/dist/mouse-handlers/GridRowMoveMouseHandler.js.map +1 -1
  69. package/dist/mouse-handlers/GridRowSeparatorMouseHandler.js +0 -23
  70. package/dist/mouse-handlers/GridRowSeparatorMouseHandler.js.map +1 -1
  71. package/dist/mouse-handlers/GridRowTreeMouseHandler.js +0 -10
  72. package/dist/mouse-handlers/GridRowTreeMouseHandler.js.map +1 -1
  73. package/dist/mouse-handlers/GridScrollBarCornerMouseHandler.js +0 -6
  74. package/dist/mouse-handlers/GridScrollBarCornerMouseHandler.js.map +1 -1
  75. package/dist/mouse-handlers/GridSelectionMouseHandler.js +8 -38
  76. package/dist/mouse-handlers/GridSelectionMouseHandler.js.map +1 -1
  77. package/dist/mouse-handlers/GridSeparatorMouseHandler.js +5 -54
  78. package/dist/mouse-handlers/GridSeparatorMouseHandler.js.map +1 -1
  79. package/dist/mouse-handlers/GridVerticalScrollBarMouseHandler.js +0 -28
  80. package/dist/mouse-handlers/GridVerticalScrollBarMouseHandler.js.map +1 -1
  81. package/dist/mouse-handlers/index.js.map +1 -1
  82. package/package.json +4 -4
@@ -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 Grid from '../Grid';\nimport GridRange from '../GridRange';\nimport KeyHandler, { GridKeyboardEvent } from '../KeyHandler';\nimport { isEditableGridModel } from '../EditableGridModel';\nimport { 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;OACOA,S;OAEAC,S;OACAC,U;SACEC,mB;;AAGT,MAAMC,cAAN,SAA6BF,UAA7B,CAAwC;EACtCG,MAAM,CAACC,KAAD,EAA2BC,IAA3B,EAA2D;IAC/D,IAAIP,SAAS,CAACQ,iBAAV,CAA4BF,KAA5B,CAAJ,EAAwC;MACtC,OAAO,KAAP;IACD;;IAED,IAAM;MAAEG;IAAF,IAAYF,IAAI,CAACG,KAAvB;IACA,IAAM;MAAEC,YAAF;MAAgBC;IAAhB,IAA8BL,IAAI,CAACM,KAAzC;;IACA,IACEF,YAAY,IAAI,IAAhB,IACAC,SAAS,IAAI,IADb,IAEA,CAACT,mBAAmB,CAACM,KAAD,CAFpB,IAGA,CAACA,KAAK,CAACK,eAAN,CAAsBb,SAAS,CAACc,QAAV,CAAmBJ,YAAnB,EAAiCC,SAAjC,CAAtB,CAJH,EAKE;MACA,OAAO,KAAP;IACD;;IACD,IAAMI,MAAqB,GAAGL,YAA9B;IACA,IAAMM,GAAkB,GAAGL,SAA3B;;IACA,IAAII,MAAM,IAAI,IAAV,IAAkBC,GAAG,IAAI,IAA7B,EAAmC;MACjC,OAAO,KAAP;IACD;;IAED,IAAIX,KAAK,CAACY,GAAN,CAAUC,MAAV,KAAqB,CAAzB,EAA4B;MAC1BZ,IAAI,CAACa,YAAL,CAAkBJ,MAAlB,EAA0BC,GAA1B,EAA+B,IAA/B,EAAqC,CAAC,CAAD,EAAI,CAAJ,CAArC,EAA6CX,KAAK,CAACY,GAAnD;MACA,OAAO,IAAP;IACD;;IAED,IAAIZ,KAAK,CAACY,GAAN,KAAc,IAAlB,EAAwB;MACtBX,IAAI,CAACa,YAAL,CAAkBJ,MAAlB,EAA0BC,GAA1B;MACA,OAAO,IAAP;IACD;;IAED,IAAIX,KAAK,CAACY,GAAN,KAAc,WAAlB,EAA+B;MAC7BX,IAAI,CAACa,YAAL,CAAkBJ,MAAlB,EAA0BC,GAA1B,EAA+B,IAA/B,EAAqCI,SAArC,EAAgD,EAAhD;MACA,OAAO,IAAP;IACD;;IAED,IAAIf,KAAK,CAACY,GAAN,KAAc,QAAlB,EAA4B;MAC1BX,IAAI,CAACe,eAAL,CAAqBN,MAArB,EAA6BC,GAA7B,EAAkC,EAAlC;MACA,OAAO,IAAP;IACD;;IACD,OAAO,KAAP;EACD;;AA1CqC;;AA6CxC,eAAeb,cAAf"}
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 Grid from '../Grid';\nimport GridRange from '../GridRange';\nimport KeyHandler, { GridKeyboardEvent } from '../KeyHandler';\nimport { isEditableGridModel } from '../EditableGridModel';\nimport { 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,MAAM,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"}
@@ -6,42 +6,34 @@ import KeyHandler from "../KeyHandler.js";
6
6
  * @param table HTML Table
7
7
  * @returns A two dimensional array with the data found in the table
8
8
  */
9
-
10
9
  export function parseValueFromTable(table) {
11
10
  var data = [];
12
11
  var rows = table.querySelectorAll('tr');
13
-
14
12
  for (var r = 0; r < rows.length; r += 1) {
15
13
  var row = rows[r];
16
14
  var cells = row.querySelectorAll('td');
17
15
  var rowData = [];
18
-
19
16
  for (var c = 0; c < cells.length; c += 1) {
20
17
  var _cell$textContent$tri, _cell$textContent;
21
-
22
18
  var cell = cells[c];
23
19
  rowData.push((_cell$textContent$tri = (_cell$textContent = cell.textContent) === null || _cell$textContent === void 0 ? void 0 : _cell$textContent.trim()) !== null && _cell$textContent$tri !== void 0 ? _cell$textContent$tri : '');
24
20
  }
25
-
26
21
  data.push(rowData);
27
22
  }
28
-
29
23
  return data;
30
24
  }
25
+
31
26
  /**
32
27
  * Parses out a table of data from HTML elements. Treats each element as one rows.
33
28
  * Filters out blank rows.
34
29
  * @param rows The elements to parse out
35
30
  * @returns A string table of data
36
31
  */
37
-
38
32
  export function parseValueFromNodes(nodes) {
39
33
  var result = [];
40
34
  nodes.forEach(node => {
41
35
  var _node$textContent;
42
-
43
36
  var text = (_node$textContent = node.textContent) !== null && _node$textContent !== void 0 ? _node$textContent : '';
44
-
45
37
  if (text.length > 0) {
46
38
  // When Chrome pastes a table from text, it preserves the tab characters
47
39
  // In Firefox, it breaks it into a combination of non-breaking spaces and spaces
@@ -52,17 +44,14 @@ export function parseValueFromNodes(nodes) {
52
44
  }
53
45
  export function parseValueFromElement(element) {
54
46
  var _element$textContent$, _element$textContent;
55
-
56
47
  // Check first if there's an HTML table element that we can use
57
48
  var table = element.querySelector('table');
58
-
59
49
  if (table != null) {
60
50
  return parseValueFromTable(table);
61
- } // Otherwise check if there's any text content at all
62
-
51
+ }
63
52
 
53
+ // Otherwise check if there's any text content at all
64
54
  var text = (_element$textContent$ = (_element$textContent = element.textContent) === null || _element$textContent === void 0 ? void 0 : _element$textContent.trim()) !== null && _element$textContent$ !== void 0 ? _element$textContent$ : '';
65
-
66
55
  if (text.length > 0) {
67
56
  // If there's text content, try and parse out a table from the child nodes. Each node is a row.
68
57
  // If there's only one row and it doesn't contain a tab, then just treat it as a regular value
@@ -71,28 +60,24 @@ export function parseValueFromElement(element) {
71
60
  } = element;
72
61
  var hasTabChar = text.includes('\t');
73
62
  var hasFirefoxTab = text.includes('\u00a0\u00a0 \u00a0');
74
-
75
63
  if (hasTabChar && childNodes.length !== 0 && (childNodes.length === 1 || childNodes.length > 1 && (childNodes[0].textContent == null || !childNodes[0].textContent.includes('\t')))) {
76
64
  // When Chrome pastes a single row, it gets split into multiple child nodes
77
65
  // If we check the first child node and it doesn't have a tab character, but the full element text content does, then
78
66
  // just parse the text out separated by the tab chars
79
67
  return text.split('\n').map(row => row.split('\t'));
80
68
  }
81
-
82
69
  if (childNodes.length > 1 || hasFirefoxTab) {
83
70
  return parseValueFromNodes(element.childNodes);
84
- } // If there's no tabs or no multiple rows, than just treat it as one value
85
-
86
-
71
+ }
72
+ // If there's no tabs or no multiple rows, than just treat it as one value
87
73
  return text;
88
74
  }
89
-
90
75
  return null;
91
76
  }
77
+
92
78
  /**
93
79
  * Handles the paste key combination
94
80
  */
95
-
96
81
  class PasteKeyHandler extends KeyHandler {
97
82
  onDown(event, grid) {
98
83
  switch (event.key) {
@@ -102,41 +87,38 @@ class PasteKeyHandler extends KeyHandler {
102
87
  // Instead, we capture the ctrl+v keydown, then do this to capture the input
103
88
  var dummyInput = document.createElement('div');
104
89
  document.body.appendChild(dummyInput);
105
- dummyInput.setAttribute('contenteditable', 'true'); // Give it invisible styling
90
+ dummyInput.setAttribute('contenteditable', 'true');
106
91
 
92
+ // Give it invisible styling
107
93
  dummyInput.setAttribute('style', 'clip-path: "inset(50%)"; height: 1px; width: 1px; margin: -1px; overflow: hidden; padding 0; position: absolute;');
108
-
109
94
  var listener = () => {
110
95
  dummyInput.removeEventListener('input', listener);
111
96
  dummyInput.remove();
112
97
  grid.focus();
113
98
  var value = parseValueFromElement(dummyInput);
114
-
115
99
  if (value != null) {
116
100
  grid.pasteValue(value);
117
101
  }
118
- }; // Listen for the `input` event, when there's a change to the HTML
102
+ };
103
+
104
+ // Listen for the `input` event, when there's a change to the HTML
119
105
  // We could also listen to the `paste` event to get the clipboard data, but that's just text data
120
106
  // By listening to `input`, we can get a table that's already parsed in HTML, which is easier to consume
107
+ dummyInput.addEventListener('input', listener);
121
108
 
109
+ // Focus the element so it receives the paste event
110
+ dummyInput.focus();
122
111
 
123
- dummyInput.addEventListener('input', listener); // Focus the element so it receives the paste event
124
-
125
- dummyInput.focus(); // Don't block the paste event from updating our dummy input
126
-
112
+ // Don't block the paste event from updating our dummy input
127
113
  return {
128
114
  preventDefault: false,
129
115
  stopPropagation: true
130
116
  };
131
117
  }
132
-
133
118
  break;
134
119
  }
135
-
136
120
  return false;
137
121
  }
138
-
139
122
  }
140
-
141
123
  export default PasteKeyHandler;
142
124
  //# sourceMappingURL=PasteKeyHandler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PasteKeyHandler.js","names":["GridUtils","KeyHandler","parseValueFromTable","table","data","rows","querySelectorAll","r","length","row","cells","rowData","c","cell","push","textContent","trim","parseValueFromNodes","nodes","result","forEach","node","text","split","parseValueFromElement","element","querySelector","childNodes","hasTabChar","includes","hasFirefoxTab","map","PasteKeyHandler","onDown","event","grid","key","isModifierKeyDown","dummyInput","document","createElement","body","appendChild","setAttribute","listener","removeEventListener","remove","focus","value","pasteValue","addEventListener","preventDefault","stopPropagation"],"sources":["../../src/key-handlers/PasteKeyHandler.ts"],"sourcesContent":["/* eslint class-methods-use-this: \"off\" */\nimport { EventHandlerResult } from '../EventHandlerResult';\nimport Grid from '../Grid';\nimport GridUtils from '../GridUtils';\nimport KeyHandler, { 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\n return result;\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 listener = () => {\n dummyInput.removeEventListener('input', listener);\n dummyInput.remove();\n\n grid.focus();\n const value = parseValueFromElement(dummyInput);\n if (value != null) {\n grid.pasteValue(value);\n }\n };\n\n // Listen for the `input` event, when there's a change to the HTML\n // We could also listen to the `paste` event to get the clipboard data, but that's just text data\n // By listening to `input`, we can get a table that's already parsed in HTML, which is easier to consume\n dummyInput.addEventListener('input', listener);\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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"}
1
+ {"version":3,"file":"PasteKeyHandler.js","names":["GridUtils","KeyHandler","parseValueFromTable","table","data","rows","querySelectorAll","r","length","row","cells","rowData","c","cell","push","textContent","trim","parseValueFromNodes","nodes","result","forEach","node","text","split","parseValueFromElement","element","querySelector","childNodes","hasTabChar","includes","hasFirefoxTab","map","PasteKeyHandler","onDown","event","grid","key","isModifierKeyDown","dummyInput","document","createElement","body","appendChild","setAttribute","listener","removeEventListener","remove","focus","value","pasteValue","addEventListener","preventDefault","stopPropagation"],"sources":["../../src/key-handlers/PasteKeyHandler.ts"],"sourcesContent":["/* eslint class-methods-use-this: \"off\" */\nimport { EventHandlerResult } from '../EventHandlerResult';\nimport Grid from '../Grid';\nimport GridUtils from '../GridUtils';\nimport KeyHandler, { 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\n return result;\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 listener = () => {\n dummyInput.removeEventListener('input', listener);\n dummyInput.remove();\n\n grid.focus();\n const value = parseValueFromElement(dummyInput);\n if (value != null) {\n grid.pasteValue(value);\n }\n };\n\n // Listen for the `input` event, when there's a change to the HTML\n // We could also listen to the `paste` event to get the clipboard data, but that's just text data\n // By listening to `input`, we can get a table that's already parsed in HTML, which is easier to consume\n dummyInput.addEventListener('input', listener);\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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"}
@@ -3,7 +3,6 @@ import clamp from 'lodash.clamp';
3
3
  import GridRange from "../GridRange.js";
4
4
  import GridUtils from "../GridUtils.js";
5
5
  import KeyHandler from "../KeyHandler.js";
6
-
7
6
  class SelectionKeyHandler extends KeyHandler {
8
7
  onDown(event, grid) {
9
8
  switch (event.key) {
@@ -12,49 +11,37 @@ class SelectionKeyHandler extends KeyHandler {
12
11
  grid.selectAll();
13
12
  return true;
14
13
  }
15
-
16
14
  break;
17
-
18
15
  case 'ArrowUp':
19
16
  return this.handleArrowMove(0, -1, event, grid);
20
-
21
17
  case 'ArrowDown':
22
18
  return this.handleArrowMove(0, 1, event, grid);
23
-
24
19
  case 'ArrowRight':
25
20
  return this.handleArrowMove(1, 0, event, grid);
26
-
27
21
  case 'ArrowLeft':
28
22
  return this.handleArrowMove(-1, 0, event, grid);
29
-
30
23
  /**
31
24
  * h/j/k/l keys are grouped together for quick navigation by power users.
32
25
  * Bender added these as shortcuts in the original commit of keyboard shortcuts.
33
26
  * We have no idea why, or what might have inspired them (not excel, not swing, vim?).
34
27
  * Maybe lack of page up keys on a laptop at the time?
35
28
  */
36
-
37
29
  case 'k':
38
30
  case 'K':
39
31
  if (GridUtils.isModifierKeyDown(event)) return false;
40
32
  return this.handlePageUp(event, grid);
41
-
42
33
  case 'j':
43
34
  case 'J':
44
35
  if (GridUtils.isModifierKeyDown(event)) return false;
45
36
  return this.handlePageDown(event, grid);
46
-
47
37
  case 'h':
48
38
  case 'H':
49
39
  if (GridUtils.isModifierKeyDown(event)) return false;
50
-
51
40
  if (!event.shiftKey) {
52
41
  grid.clearSelectedRanges();
53
42
  }
54
-
55
43
  grid.moveCursorToPosition(0, grid.state.cursorRow, event.shiftKey);
56
44
  return true;
57
-
58
45
  case 'l':
59
46
  case 'L':
60
47
  {
@@ -65,29 +52,22 @@ class SelectionKeyHandler extends KeyHandler {
65
52
  var {
66
53
  columnCount
67
54
  } = model;
68
-
69
55
  if (!event.shiftKey) {
70
56
  grid.clearSelectedRanges();
71
57
  }
72
-
73
58
  grid.moveCursorToPosition(columnCount - 1, grid.state.cursorRow, event.shiftKey);
74
59
  return true;
75
60
  }
76
-
77
61
  case 'PageDown':
78
62
  return this.handlePageDown(event, grid);
79
-
80
63
  case 'PageUp':
81
64
  return this.handlePageUp(event, grid);
82
-
83
65
  case 'Home':
84
66
  if (!event.shiftKey) {
85
67
  grid.clearSelectedRanges();
86
68
  }
87
-
88
69
  grid.moveCursorToPosition(GridUtils.isModifierKeyDown(event) ? grid.state.cursorColumn : 0, GridUtils.isModifierKeyDown(event) ? 0 : grid.state.cursorRow, event.shiftKey, true, true);
89
70
  return true;
90
-
91
71
  case 'End':
92
72
  {
93
73
  var {
@@ -97,57 +77,45 @@ class SelectionKeyHandler extends KeyHandler {
97
77
  columnCount: _columnCount,
98
78
  rowCount
99
79
  } = _model;
100
-
101
80
  if (!event.shiftKey) {
102
81
  grid.clearSelectedRanges();
103
82
  }
104
-
105
83
  grid.moveCursorToPosition(GridUtils.isModifierKeyDown(event) ? grid.state.cursorColumn : _columnCount - 1, GridUtils.isModifierKeyDown(event) ? rowCount - 1 : grid.state.cursorRow, event.shiftKey, true, true);
106
84
  return true;
107
85
  }
108
-
109
86
  case 'Escape':
110
- grid.clearSelectedRanges(); // Event consumed, but propagation not stopped
87
+ grid.clearSelectedRanges();
88
+ // Event consumed, but propagation not stopped
111
89
  // so the shortcut could be handled by the global handler
112
-
113
90
  return {
114
91
  preventDefault: false,
115
92
  stopPropagation: false
116
93
  };
117
-
118
94
  case 'Enter':
119
95
  if (grid.state.selectedRanges.length > 0) {
120
96
  grid.moveCursorInDirection(event.shiftKey ? GridRange.SELECTION_DIRECTION.UP : GridRange.SELECTION_DIRECTION.DOWN);
121
97
  return true;
122
98
  }
123
-
124
99
  break;
125
-
126
100
  case 'Tab':
127
101
  if (grid.state.selectedRanges.length > 0) {
128
102
  grid.moveCursorInDirection(event.shiftKey ? GridRange.SELECTION_DIRECTION.LEFT : GridRange.SELECTION_DIRECTION.RIGHT);
129
103
  return true;
130
104
  }
131
-
132
105
  break;
133
-
134
106
  default:
135
107
  break;
136
108
  }
137
-
138
109
  return false;
139
110
  }
140
-
141
111
  handleArrowMove(deltaColumn, deltaRow, event, grid) {
142
112
  var isShiftKey = event.shiftKey;
143
113
  var isModifierKey = GridUtils.isModifierKeyDown(event);
144
-
145
114
  if (isShiftKey) {
146
115
  grid.trimSelectedRanges();
147
116
  } else {
148
117
  grid.clearSelectedRanges();
149
118
  }
150
-
151
119
  var {
152
120
  cursorRow,
153
121
  cursorColumn,
@@ -156,7 +124,6 @@ class SelectionKeyHandler extends KeyHandler {
156
124
  } = grid.state;
157
125
  var column = isShiftKey ? selectionEndColumn : cursorColumn;
158
126
  var row = isShiftKey ? selectionEndRow : cursorRow;
159
-
160
127
  if (isModifierKey) {
161
128
  var {
162
129
  model
@@ -168,7 +135,6 @@ class SelectionKeyHandler extends KeyHandler {
168
135
  var maximizePreviousRange = isModifierKey && isShiftKey;
169
136
  var moveToColumn = null;
170
137
  var moveToRow = null;
171
-
172
138
  if (deltaColumn < 0) {
173
139
  moveToColumn = 0;
174
140
  moveToRow = row;
@@ -182,7 +148,6 @@ class SelectionKeyHandler extends KeyHandler {
182
148
  moveToColumn = column;
183
149
  moveToRow = rowCount - 1;
184
150
  }
185
-
186
151
  if (moveToColumn != null && moveToRow != null) {
187
152
  grid.moveCursorToPosition(moveToColumn, moveToRow, isShiftKey, true, maximizePreviousRange);
188
153
  }
@@ -195,7 +160,6 @@ class SelectionKeyHandler extends KeyHandler {
195
160
  autoSelectRow = false,
196
161
  autoSelectColumn = false
197
162
  } = theme;
198
-
199
163
  if (autoSelectRow && deltaColumn !== 0) {
200
164
  var {
201
165
  lastLeft
@@ -224,30 +188,24 @@ class SelectionKeyHandler extends KeyHandler {
224
188
  grid.moveCursor(deltaColumn, deltaRow, isShiftKey);
225
189
  }
226
190
  }
227
-
228
191
  return true;
229
192
  }
230
-
231
193
  handlePageUp(e, grid) {
232
194
  var isShiftKey = e.shiftKey;
233
-
234
195
  if (isShiftKey) {
235
196
  grid.trimSelectedRanges();
236
197
  } else {
237
198
  grid.clearSelectedRanges();
238
199
  }
239
-
240
200
  var {
241
201
  cursorColumn,
242
202
  selectionEndRow
243
203
  } = grid.state;
244
204
  var row = selectionEndRow;
245
205
  var column = cursorColumn;
246
-
247
206
  if (row == null) {
248
207
  return false;
249
208
  }
250
-
251
209
  var metricState = grid.getMetricState();
252
210
  var {
253
211
  metricCalculator
@@ -258,8 +216,9 @@ class SelectionKeyHandler extends KeyHandler {
258
216
  hasHorizontalBar
259
217
  } = metricCalculator.getMetrics(metricState);
260
218
  var selectRangeEndPosition = row - (bottomVisible - topVisible);
261
- selectRangeEndPosition -= hasHorizontalBar ? 0 : 1; // Don't move beyond the top table row.
219
+ selectRangeEndPosition -= hasHorizontalBar ? 0 : 1;
262
220
 
221
+ // Don't move beyond the top table row.
263
222
  selectRangeEndPosition = Math.max(selectRangeEndPosition, 0);
264
223
  var viewportPosition = Math.max(selectRangeEndPosition - (row - topVisible), 0);
265
224
  grid.moveCursorToPosition(column, selectRangeEndPosition, isShiftKey, false);
@@ -268,27 +227,22 @@ class SelectionKeyHandler extends KeyHandler {
268
227
  });
269
228
  return true;
270
229
  }
271
-
272
230
  handlePageDown(e, grid) {
273
231
  var isShiftKey = e.shiftKey;
274
-
275
232
  if (isShiftKey) {
276
233
  grid.trimSelectedRanges();
277
234
  } else {
278
235
  grid.clearSelectedRanges();
279
236
  }
280
-
281
237
  var {
282
238
  selectionEndRow,
283
239
  cursorColumn
284
240
  } = grid.state;
285
241
  var row = selectionEndRow;
286
242
  var column = cursorColumn;
287
-
288
243
  if (row === null) {
289
244
  return false;
290
245
  }
291
-
292
246
  var metricState = grid.getMetricState();
293
247
  var {
294
248
  metricCalculator
@@ -302,8 +256,9 @@ class SelectionKeyHandler extends KeyHandler {
302
256
  } = metricCalculator.getMetrics(metricState);
303
257
  var lastRowIndex = rowCount - 1;
304
258
  var selectRangeEndPosition = bottomVisible - topVisible + row;
305
- selectRangeEndPosition += hasHorizontalBar ? 0 : 1; // Don't move beyond the bottom table row.
259
+ selectRangeEndPosition += hasHorizontalBar ? 0 : 1;
306
260
 
261
+ // Don't move beyond the bottom table row.
307
262
  selectRangeEndPosition = Math.min(selectRangeEndPosition, lastRowIndex);
308
263
  var viewportPosition = Math.min(lastTop, selectRangeEndPosition - (row - topVisible));
309
264
  grid.moveCursorToPosition(column, selectRangeEndPosition, isShiftKey, false);
@@ -312,8 +267,6 @@ class SelectionKeyHandler extends KeyHandler {
312
267
  });
313
268
  return true;
314
269
  }
315
-
316
270
  }
317
-
318
271
  export default SelectionKeyHandler;
319
272
  //# sourceMappingURL=SelectionKeyHandler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SelectionKeyHandler.js","names":["clamp","GridRange","GridUtils","KeyHandler","SelectionKeyHandler","onDown","event","grid","key","isModifierKeyDown","selectAll","handleArrowMove","handlePageUp","handlePageDown","shiftKey","clearSelectedRanges","moveCursorToPosition","state","cursorRow","model","props","columnCount","cursorColumn","rowCount","preventDefault","stopPropagation","selectedRanges","length","moveCursorInDirection","SELECTION_DIRECTION","UP","DOWN","LEFT","RIGHT","deltaColumn","deltaRow","isShiftKey","isModifierKey","trimSelectedRanges","selectionEndColumn","selectionEndRow","column","row","maximizePreviousRange","moveToColumn","moveToRow","metrics","Error","theme","autoSelectRow","autoSelectColumn","lastLeft","left","setViewState","lastTop","top","moveCursor","e","metricState","getMetricState","metricCalculator","bottomVisible","topVisible","hasHorizontalBar","getMetrics","selectRangeEndPosition","Math","max","viewportPosition","lastRowIndex","min"],"sources":["../../src/key-handlers/SelectionKeyHandler.ts"],"sourcesContent":["/* eslint class-methods-use-this: \"off\" */\nimport clamp from 'lodash.clamp';\nimport { EventHandlerResult } from '../EventHandlerResult';\nimport Grid from '../Grid';\nimport GridRange from '../GridRange';\nimport GridUtils from '../GridUtils';\nimport KeyHandler, { GridKeyboardEvent } from '../KeyHandler';\n\nclass SelectionKeyHandler extends KeyHandler {\n onDown(event: GridKeyboardEvent, grid: Grid): EventHandlerResult {\n switch (event.key) {\n case 'a':\n if (GridUtils.isModifierKeyDown(event)) {\n grid.selectAll();\n return true;\n }\n break;\n case 'ArrowUp':\n return this.handleArrowMove(0, -1, event, grid);\n case 'ArrowDown':\n return this.handleArrowMove(0, 1, event, grid);\n case 'ArrowRight':\n return this.handleArrowMove(1, 0, event, grid);\n case 'ArrowLeft':\n return this.handleArrowMove(-1, 0, event, grid);\n /**\n * h/j/k/l keys are grouped together for quick navigation by power users.\n * Bender added these as shortcuts in the original commit of keyboard shortcuts.\n * We have no idea why, or what might have inspired them (not excel, not swing, vim?).\n * Maybe lack of page up keys on a laptop at the time?\n */\n case 'k':\n case 'K':\n if (GridUtils.isModifierKeyDown(event)) return false;\n return this.handlePageUp(event, grid);\n case 'j':\n case 'J':\n if (GridUtils.isModifierKeyDown(event)) return false;\n return this.handlePageDown(event, grid);\n case 'h':\n case 'H':\n if (GridUtils.isModifierKeyDown(event)) return false;\n if (!event.shiftKey) {\n grid.clearSelectedRanges();\n }\n grid.moveCursorToPosition(0, grid.state.cursorRow, event.shiftKey);\n return true;\n case 'l':\n case 'L': {\n if (GridUtils.isModifierKeyDown(event)) return false;\n const { model } = grid.props;\n const { columnCount } = model;\n if (!event.shiftKey) {\n grid.clearSelectedRanges();\n }\n grid.moveCursorToPosition(\n columnCount - 1,\n grid.state.cursorRow,\n event.shiftKey\n );\n return true;\n }\n case 'PageDown':\n return this.handlePageDown(event, grid);\n case 'PageUp':\n return this.handlePageUp(event, grid);\n case 'Home':\n if (!event.shiftKey) {\n grid.clearSelectedRanges();\n }\n grid.moveCursorToPosition(\n GridUtils.isModifierKeyDown(event) ? grid.state.cursorColumn : 0,\n GridUtils.isModifierKeyDown(event) ? 0 : grid.state.cursorRow,\n event.shiftKey,\n true,\n true\n );\n return true;\n case 'End': {\n const { model } = grid.props;\n const { columnCount, rowCount } = model;\n if (!event.shiftKey) {\n grid.clearSelectedRanges();\n }\n grid.moveCursorToPosition(\n GridUtils.isModifierKeyDown(event)\n ? grid.state.cursorColumn\n : columnCount - 1,\n GridUtils.isModifierKeyDown(event)\n ? rowCount - 1\n : grid.state.cursorRow,\n event.shiftKey,\n true,\n true\n );\n return true;\n }\n case 'Escape':\n grid.clearSelectedRanges();\n // Event consumed, but propagation not stopped\n // so the shortcut could be handled by the global handler\n return { preventDefault: false, stopPropagation: false };\n case 'Enter':\n if (grid.state.selectedRanges.length > 0) {\n grid.moveCursorInDirection(\n event.shiftKey\n ? GridRange.SELECTION_DIRECTION.UP\n : GridRange.SELECTION_DIRECTION.DOWN\n );\n return true;\n }\n break;\n case 'Tab':\n if (grid.state.selectedRanges.length > 0) {\n grid.moveCursorInDirection(\n event.shiftKey\n ? GridRange.SELECTION_DIRECTION.LEFT\n : GridRange.SELECTION_DIRECTION.RIGHT\n );\n return true;\n }\n break;\n default:\n break;\n }\n return false;\n }\n\n handleArrowMove(\n deltaColumn: number,\n deltaRow: number,\n event: GridKeyboardEvent,\n grid: Grid\n ): boolean {\n const isShiftKey = event.shiftKey;\n const isModifierKey = GridUtils.isModifierKeyDown(event);\n if (isShiftKey) {\n grid.trimSelectedRanges();\n } else {\n grid.clearSelectedRanges();\n }\n\n const {\n cursorRow,\n cursorColumn,\n selectionEndColumn,\n selectionEndRow,\n } = grid.state;\n const column = isShiftKey ? selectionEndColumn : cursorColumn;\n const row = isShiftKey ? selectionEndRow : cursorRow;\n if (isModifierKey) {\n const { model } = grid.props;\n const { columnCount, rowCount } = model;\n const maximizePreviousRange = isModifierKey && isShiftKey;\n let moveToColumn = null;\n let moveToRow = null;\n if (deltaColumn < 0) {\n moveToColumn = 0;\n moveToRow = row;\n } else if (deltaColumn > 0) {\n moveToColumn = columnCount - 1;\n moveToRow = row;\n } else if (deltaRow < 0) {\n moveToColumn = column;\n moveToRow = 0;\n } else if (deltaRow > 0) {\n moveToColumn = column;\n moveToRow = rowCount - 1;\n }\n if (moveToColumn != null && moveToRow != null) {\n grid.moveCursorToPosition(\n moveToColumn,\n moveToRow,\n isShiftKey,\n true,\n maximizePreviousRange\n );\n }\n } else {\n if (!grid.metrics) throw new Error('grid.metrics are not set');\n\n const { theme } = grid.props;\n const { autoSelectRow = false, autoSelectColumn = false } = theme;\n if (autoSelectRow && deltaColumn !== 0) {\n const { lastLeft } = grid.metrics;\n let { left } = grid.state;\n\n left = clamp(left + deltaColumn, 0, lastLeft);\n\n grid.moveCursorToPosition(left, cursorRow, isShiftKey, false);\n\n grid.setViewState({ left });\n } else if (autoSelectColumn && deltaRow !== 0) {\n const { lastTop } = grid.metrics;\n let { top } = grid.state;\n\n top = clamp(top + deltaRow, 0, lastTop);\n\n grid.moveCursorToPosition(top, cursorColumn, isShiftKey, false);\n\n grid.setViewState({ top });\n } else {\n grid.moveCursor(deltaColumn, deltaRow, isShiftKey);\n }\n }\n return true;\n }\n\n handlePageUp(e: GridKeyboardEvent, grid: Grid): boolean {\n const isShiftKey = e.shiftKey;\n\n if (isShiftKey) {\n grid.trimSelectedRanges();\n } else {\n grid.clearSelectedRanges();\n }\n\n const { cursorColumn, selectionEndRow } = grid.state;\n const row: number | null = selectionEndRow;\n const column: number | null = cursorColumn;\n if (row == null) {\n return false;\n }\n const metricState = grid.getMetricState();\n const { metricCalculator } = grid;\n const {\n bottomVisible,\n topVisible,\n hasHorizontalBar,\n } = metricCalculator.getMetrics(metricState);\n\n let selectRangeEndPosition = row - (bottomVisible - topVisible);\n selectRangeEndPosition -= hasHorizontalBar ? 0 : 1;\n\n // Don't move beyond the top table row.\n selectRangeEndPosition = Math.max(selectRangeEndPosition, 0);\n const viewportPosition = Math.max(\n selectRangeEndPosition - (row - topVisible),\n 0\n );\n\n grid.moveCursorToPosition(\n column,\n selectRangeEndPosition,\n isShiftKey,\n false\n );\n grid.setViewState({ top: viewportPosition });\n return true;\n }\n\n handlePageDown(e: GridKeyboardEvent, grid: Grid): boolean {\n const isShiftKey = e.shiftKey;\n\n if (isShiftKey) {\n grid.trimSelectedRanges();\n } else {\n grid.clearSelectedRanges();\n }\n\n const { selectionEndRow, cursorColumn } = grid.state;\n const row: number | null = selectionEndRow;\n const column: number | null = cursorColumn;\n if (row === null) {\n return false;\n }\n const metricState = grid.getMetricState();\n const { metricCalculator } = grid;\n const {\n bottomVisible,\n topVisible,\n hasHorizontalBar,\n rowCount,\n lastTop,\n } = metricCalculator.getMetrics(metricState);\n const lastRowIndex = rowCount - 1;\n\n let selectRangeEndPosition = bottomVisible - topVisible + row;\n selectRangeEndPosition += hasHorizontalBar ? 0 : 1;\n\n // Don't move beyond the bottom table row.\n selectRangeEndPosition = Math.min(selectRangeEndPosition, lastRowIndex);\n\n const viewportPosition = Math.min(\n lastTop,\n selectRangeEndPosition - (row - topVisible)\n );\n grid.moveCursorToPosition(\n column,\n selectRangeEndPosition,\n isShiftKey,\n false\n );\n grid.setViewState({ top: viewportPosition });\n\n return true;\n }\n}\n\nexport default SelectionKeyHandler;\n"],"mappings":"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"}
1
+ {"version":3,"file":"SelectionKeyHandler.js","names":["clamp","GridRange","GridUtils","KeyHandler","SelectionKeyHandler","onDown","event","grid","key","isModifierKeyDown","selectAll","handleArrowMove","handlePageUp","handlePageDown","shiftKey","clearSelectedRanges","moveCursorToPosition","state","cursorRow","model","props","columnCount","cursorColumn","rowCount","preventDefault","stopPropagation","selectedRanges","length","moveCursorInDirection","SELECTION_DIRECTION","UP","DOWN","LEFT","RIGHT","deltaColumn","deltaRow","isShiftKey","isModifierKey","trimSelectedRanges","selectionEndColumn","selectionEndRow","column","row","maximizePreviousRange","moveToColumn","moveToRow","metrics","Error","theme","autoSelectRow","autoSelectColumn","lastLeft","left","setViewState","lastTop","top","moveCursor","e","metricState","getMetricState","metricCalculator","bottomVisible","topVisible","hasHorizontalBar","getMetrics","selectRangeEndPosition","Math","max","viewportPosition","lastRowIndex","min"],"sources":["../../src/key-handlers/SelectionKeyHandler.ts"],"sourcesContent":["/* eslint class-methods-use-this: \"off\" */\nimport clamp from 'lodash.clamp';\nimport { EventHandlerResult } from '../EventHandlerResult';\nimport Grid from '../Grid';\nimport GridRange from '../GridRange';\nimport GridUtils from '../GridUtils';\nimport KeyHandler, { GridKeyboardEvent } from '../KeyHandler';\n\nclass SelectionKeyHandler extends KeyHandler {\n onDown(event: GridKeyboardEvent, grid: Grid): EventHandlerResult {\n switch (event.key) {\n case 'a':\n if (GridUtils.isModifierKeyDown(event)) {\n grid.selectAll();\n return true;\n }\n break;\n case 'ArrowUp':\n return this.handleArrowMove(0, -1, event, grid);\n case 'ArrowDown':\n return this.handleArrowMove(0, 1, event, grid);\n case 'ArrowRight':\n return this.handleArrowMove(1, 0, event, grid);\n case 'ArrowLeft':\n return this.handleArrowMove(-1, 0, event, grid);\n /**\n * h/j/k/l keys are grouped together for quick navigation by power users.\n * Bender added these as shortcuts in the original commit of keyboard shortcuts.\n * We have no idea why, or what might have inspired them (not excel, not swing, vim?).\n * Maybe lack of page up keys on a laptop at the time?\n */\n case 'k':\n case 'K':\n if (GridUtils.isModifierKeyDown(event)) return false;\n return this.handlePageUp(event, grid);\n case 'j':\n case 'J':\n if (GridUtils.isModifierKeyDown(event)) return false;\n return this.handlePageDown(event, grid);\n case 'h':\n case 'H':\n if (GridUtils.isModifierKeyDown(event)) return false;\n if (!event.shiftKey) {\n grid.clearSelectedRanges();\n }\n grid.moveCursorToPosition(0, grid.state.cursorRow, event.shiftKey);\n return true;\n case 'l':\n case 'L': {\n if (GridUtils.isModifierKeyDown(event)) return false;\n const { model } = grid.props;\n const { columnCount } = model;\n if (!event.shiftKey) {\n grid.clearSelectedRanges();\n }\n grid.moveCursorToPosition(\n columnCount - 1,\n grid.state.cursorRow,\n event.shiftKey\n );\n return true;\n }\n case 'PageDown':\n return this.handlePageDown(event, grid);\n case 'PageUp':\n return this.handlePageUp(event, grid);\n case 'Home':\n if (!event.shiftKey) {\n grid.clearSelectedRanges();\n }\n grid.moveCursorToPosition(\n GridUtils.isModifierKeyDown(event) ? grid.state.cursorColumn : 0,\n GridUtils.isModifierKeyDown(event) ? 0 : grid.state.cursorRow,\n event.shiftKey,\n true,\n true\n );\n return true;\n case 'End': {\n const { model } = grid.props;\n const { columnCount, rowCount } = model;\n if (!event.shiftKey) {\n grid.clearSelectedRanges();\n }\n grid.moveCursorToPosition(\n GridUtils.isModifierKeyDown(event)\n ? grid.state.cursorColumn\n : columnCount - 1,\n GridUtils.isModifierKeyDown(event)\n ? rowCount - 1\n : grid.state.cursorRow,\n event.shiftKey,\n true,\n true\n );\n return true;\n }\n case 'Escape':\n grid.clearSelectedRanges();\n // Event consumed, but propagation not stopped\n // so the shortcut could be handled by the global handler\n return { preventDefault: false, stopPropagation: false };\n case 'Enter':\n if (grid.state.selectedRanges.length > 0) {\n grid.moveCursorInDirection(\n event.shiftKey\n ? GridRange.SELECTION_DIRECTION.UP\n : GridRange.SELECTION_DIRECTION.DOWN\n );\n return true;\n }\n break;\n case 'Tab':\n if (grid.state.selectedRanges.length > 0) {\n grid.moveCursorInDirection(\n event.shiftKey\n ? GridRange.SELECTION_DIRECTION.LEFT\n : GridRange.SELECTION_DIRECTION.RIGHT\n );\n return true;\n }\n break;\n default:\n break;\n }\n return false;\n }\n\n handleArrowMove(\n deltaColumn: number,\n deltaRow: number,\n event: GridKeyboardEvent,\n grid: Grid\n ): boolean {\n const isShiftKey = event.shiftKey;\n const isModifierKey = GridUtils.isModifierKeyDown(event);\n if (isShiftKey) {\n grid.trimSelectedRanges();\n } else {\n grid.clearSelectedRanges();\n }\n\n const {\n cursorRow,\n cursorColumn,\n selectionEndColumn,\n selectionEndRow,\n } = grid.state;\n const column = isShiftKey ? selectionEndColumn : cursorColumn;\n const row = isShiftKey ? selectionEndRow : cursorRow;\n if (isModifierKey) {\n const { model } = grid.props;\n const { columnCount, rowCount } = model;\n const maximizePreviousRange = isModifierKey && isShiftKey;\n let moveToColumn = null;\n let moveToRow = null;\n if (deltaColumn < 0) {\n moveToColumn = 0;\n moveToRow = row;\n } else if (deltaColumn > 0) {\n moveToColumn = columnCount - 1;\n moveToRow = row;\n } else if (deltaRow < 0) {\n moveToColumn = column;\n moveToRow = 0;\n } else if (deltaRow > 0) {\n moveToColumn = column;\n moveToRow = rowCount - 1;\n }\n if (moveToColumn != null && moveToRow != null) {\n grid.moveCursorToPosition(\n moveToColumn,\n moveToRow,\n isShiftKey,\n true,\n maximizePreviousRange\n );\n }\n } else {\n if (!grid.metrics) throw new Error('grid.metrics are not set');\n\n const { theme } = grid.props;\n const { autoSelectRow = false, autoSelectColumn = false } = theme;\n if (autoSelectRow && deltaColumn !== 0) {\n const { lastLeft } = grid.metrics;\n let { left } = grid.state;\n\n left = clamp(left + deltaColumn, 0, lastLeft);\n\n grid.moveCursorToPosition(left, cursorRow, isShiftKey, false);\n\n grid.setViewState({ left });\n } else if (autoSelectColumn && deltaRow !== 0) {\n const { lastTop } = grid.metrics;\n let { top } = grid.state;\n\n top = clamp(top + deltaRow, 0, lastTop);\n\n grid.moveCursorToPosition(top, cursorColumn, isShiftKey, false);\n\n grid.setViewState({ top });\n } else {\n grid.moveCursor(deltaColumn, deltaRow, isShiftKey);\n }\n }\n return true;\n }\n\n handlePageUp(e: GridKeyboardEvent, grid: Grid): boolean {\n const isShiftKey = e.shiftKey;\n\n if (isShiftKey) {\n grid.trimSelectedRanges();\n } else {\n grid.clearSelectedRanges();\n }\n\n const { cursorColumn, selectionEndRow } = grid.state;\n const row: number | null = selectionEndRow;\n const column: number | null = cursorColumn;\n if (row == null) {\n return false;\n }\n const metricState = grid.getMetricState();\n const { metricCalculator } = grid;\n const {\n bottomVisible,\n topVisible,\n hasHorizontalBar,\n } = metricCalculator.getMetrics(metricState);\n\n let selectRangeEndPosition = row - (bottomVisible - topVisible);\n selectRangeEndPosition -= hasHorizontalBar ? 0 : 1;\n\n // Don't move beyond the top table row.\n selectRangeEndPosition = Math.max(selectRangeEndPosition, 0);\n const viewportPosition = Math.max(\n selectRangeEndPosition - (row - topVisible),\n 0\n );\n\n grid.moveCursorToPosition(\n column,\n selectRangeEndPosition,\n isShiftKey,\n false\n );\n grid.setViewState({ top: viewportPosition });\n return true;\n }\n\n handlePageDown(e: GridKeyboardEvent, grid: Grid): boolean {\n const isShiftKey = e.shiftKey;\n\n if (isShiftKey) {\n grid.trimSelectedRanges();\n } else {\n grid.clearSelectedRanges();\n }\n\n const { selectionEndRow, cursorColumn } = grid.state;\n const row: number | null = selectionEndRow;\n const column: number | null = cursorColumn;\n if (row === null) {\n return false;\n }\n const metricState = grid.getMetricState();\n const { metricCalculator } = grid;\n const {\n bottomVisible,\n topVisible,\n hasHorizontalBar,\n rowCount,\n lastTop,\n } = metricCalculator.getMetrics(metricState);\n const lastRowIndex = rowCount - 1;\n\n let selectRangeEndPosition = bottomVisible - topVisible + row;\n selectRangeEndPosition += hasHorizontalBar ? 0 : 1;\n\n // Don't move beyond the bottom table row.\n selectRangeEndPosition = Math.min(selectRangeEndPosition, lastRowIndex);\n\n const viewportPosition = Math.min(\n lastTop,\n selectRangeEndPosition - (row - topVisible)\n );\n grid.moveCursorToPosition(\n column,\n selectRangeEndPosition,\n isShiftKey,\n false\n );\n grid.setViewState({ top: viewportPosition });\n\n return true;\n }\n}\n\nexport default SelectionKeyHandler;\n"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  /* eslint class-methods-use-this: "off" */
2
2
  import { isExpandableGridModel } from "../ExpandableGridModel.js";
3
3
  import KeyHandler from "../KeyHandler.js";
4
-
5
4
  class TreeKeyHandler extends KeyHandler {
6
5
  onDown(event, grid) {
7
6
  switch (event.key) {
@@ -10,22 +9,17 @@ class TreeKeyHandler extends KeyHandler {
10
9
  {
11
10
  return this.handleExpandKey(event, grid);
12
11
  }
13
-
14
12
  default:
15
13
  break;
16
14
  }
17
-
18
15
  return false;
19
16
  }
20
-
21
17
  handleExpandKey(event, grid) {
22
18
  var {
23
19
  selectedRanges
24
20
  } = grid.state;
25
-
26
21
  if (selectedRanges.length === 1) {
27
22
  var range = selectedRanges[0];
28
-
29
23
  if (range.startRow === range.endRow && range.startColumn === range.endColumn) {
30
24
  if (!grid.metrics) throw new Error('grid.metrics not set');
31
25
  var {
@@ -35,10 +29,8 @@ class TreeKeyHandler extends KeyHandler {
35
29
  startRow: row,
36
30
  startColumn: column
37
31
  } = range;
38
-
39
32
  if (row != null) {
40
33
  var modelRow = grid.getModelRow(row);
41
-
42
34
  if ((column === 0 || column == null) && isExpandableGridModel(model) && model.isRowExpandable(modelRow)) {
43
35
  grid.toggleRowExpanded(row);
44
36
  return true;
@@ -46,11 +38,8 @@ class TreeKeyHandler extends KeyHandler {
46
38
  }
47
39
  }
48
40
  }
49
-
50
41
  return false;
51
42
  }
52
-
53
43
  }
54
-
55
44
  export default TreeKeyHandler;
56
45
  //# sourceMappingURL=TreeKeyHandler.js.map