@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.
- package/dist/CellInputField.d.ts +5 -5
- package/dist/CellInputField.d.ts.map +1 -1
- package/dist/CellInputField.js +6 -23
- package/dist/CellInputField.js.map +1 -1
- package/dist/EditableGridModel.js +1 -0
- package/dist/EditableGridModel.js.map +1 -1
- package/dist/ExpandableGridModel.js +1 -0
- package/dist/ExpandableGridModel.js.map +1 -1
- package/dist/Grid.js +77 -315
- package/dist/Grid.js.map +1 -1
- package/dist/GridAxisRange.js.map +1 -1
- package/dist/GridColorUtils.js +1 -2
- package/dist/GridColorUtils.js.map +1 -1
- package/dist/GridMetricCalculator.js +83 -240
- package/dist/GridMetricCalculator.js.map +1 -1
- package/dist/GridModel.js +13 -31
- package/dist/GridModel.js.map +1 -1
- package/dist/GridMouseHandler.js +2 -15
- package/dist/GridMouseHandler.js.map +1 -1
- package/dist/GridRange.js +46 -160
- package/dist/GridRange.js.map +1 -1
- package/dist/GridRenderer.js +126 -407
- package/dist/GridRenderer.js.map +1 -1
- package/dist/GridTestUtils.js +0 -5
- package/dist/GridTestUtils.js.map +1 -1
- package/dist/GridTheme.js.map +1 -1
- package/dist/GridUtils.js +68 -217
- package/dist/GridUtils.js.map +1 -1
- package/dist/KeyHandler.js +2 -8
- package/dist/KeyHandler.js.map +1 -1
- package/dist/MockGridData.js.map +1 -1
- package/dist/MockGridModel.js +0 -42
- package/dist/MockGridModel.js.map +1 -1
- package/dist/MockTreeGridModel.js +6 -55
- package/dist/MockTreeGridModel.js.map +1 -1
- package/dist/StaticDataGridModel.js +0 -15
- package/dist/StaticDataGridModel.js.map +1 -1
- package/dist/ThemeContext.js.map +1 -1
- package/dist/ViewportDataGridModel.js +0 -14
- package/dist/ViewportDataGridModel.js.map +1 -1
- package/dist/errors/AssertionError.js +0 -3
- package/dist/errors/AssertionError.js.map +1 -1
- package/dist/errors/PasteError.js +0 -3
- package/dist/errors/PasteError.js.map +1 -1
- package/dist/errors/assertIsDefined.js.map +1 -1
- package/dist/errors/index.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/key-handlers/EditKeyHandler.js +0 -12
- package/dist/key-handlers/EditKeyHandler.js.map +1 -1
- package/dist/key-handlers/PasteKeyHandler.js +15 -33
- package/dist/key-handlers/PasteKeyHandler.js.map +1 -1
- package/dist/key-handlers/SelectionKeyHandler.js +6 -53
- package/dist/key-handlers/SelectionKeyHandler.js.map +1 -1
- package/dist/key-handlers/TreeKeyHandler.js +0 -11
- package/dist/key-handlers/TreeKeyHandler.js.map +1 -1
- package/dist/key-handlers/index.js.map +1 -1
- package/dist/memoizeClear.js +1 -4
- package/dist/memoizeClear.js.map +1 -1
- package/dist/mouse-handlers/EditMouseHandler.js +0 -5
- package/dist/mouse-handlers/EditMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridColumnMoveMouseHandler.js +35 -123
- package/dist/mouse-handlers/GridColumnMoveMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.js +2 -27
- package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridHorizontalScrollBarMouseHandler.js +0 -28
- package/dist/mouse-handlers/GridHorizontalScrollBarMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridRowMoveMouseHandler.js +0 -27
- package/dist/mouse-handlers/GridRowMoveMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridRowSeparatorMouseHandler.js +0 -23
- package/dist/mouse-handlers/GridRowSeparatorMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridRowTreeMouseHandler.js +0 -10
- package/dist/mouse-handlers/GridRowTreeMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridScrollBarCornerMouseHandler.js +0 -6
- package/dist/mouse-handlers/GridScrollBarCornerMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridSelectionMouseHandler.js +8 -38
- package/dist/mouse-handlers/GridSelectionMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridSeparatorMouseHandler.js +5 -54
- package/dist/mouse-handlers/GridSeparatorMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/GridVerticalScrollBarMouseHandler.js +0 -28
- package/dist/mouse-handlers/GridVerticalScrollBarMouseHandler.js.map +1 -1
- package/dist/mouse-handlers/index.js.map +1 -1
- 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,
|
|
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
|
-
}
|
|
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
|
-
}
|
|
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');
|
|
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
|
-
};
|
|
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
|
-
|
|
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":"AAAA;OAGOA,
|
|
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();
|
|
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;
|
|
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;
|
|
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
|