@deephaven/grid 0.43.0 → 0.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CellInputField.css +23 -0
- package/dist/CellInputField.css.map +1 -0
- package/dist/CellInputField.js +174 -0
- package/dist/CellInputField.js.map +1 -0
- package/dist/CellRenderer.js +64 -0
- package/dist/CellRenderer.js.map +1 -0
- package/dist/ColumnHeaderGroup.js +2 -0
- package/dist/ColumnHeaderGroup.js.map +1 -0
- package/dist/DataBarCellRenderer.js +404 -0
- package/dist/DataBarCellRenderer.js.map +1 -0
- package/dist/DataBarGridModel.js +27 -0
- package/dist/DataBarGridModel.js.map +1 -0
- package/dist/EditableGridModel.js +14 -0
- package/dist/EditableGridModel.js.map +1 -0
- package/dist/EventHandlerResult.js +2 -0
- package/dist/EventHandlerResult.js.map +1 -0
- package/dist/ExpandableGridModel.js +8 -0
- package/dist/ExpandableGridModel.js.map +1 -0
- package/dist/Grid.css +45 -0
- package/dist/Grid.css.map +1 -0
- package/dist/Grid.js +1947 -0
- package/dist/Grid.js.map +1 -0
- package/dist/GridAxisRange.js +17 -0
- package/dist/GridAxisRange.js.map +1 -0
- package/dist/GridColorUtils.js +146 -0
- package/dist/GridColorUtils.js.map +1 -0
- package/dist/GridMetricCalculator.js +1500 -0
- package/dist/GridMetricCalculator.js.map +1 -0
- package/dist/GridMetrics.js +2 -0
- package/dist/GridMetrics.js.map +1 -0
- package/dist/GridModel.js +193 -0
- package/dist/GridModel.js.map +1 -0
- package/dist/GridMouseHandler.js +57 -0
- package/dist/GridMouseHandler.js.map +1 -0
- package/dist/GridRange.js +684 -0
- package/dist/GridRange.js.map +1 -0
- package/dist/GridRenderer.js +2038 -0
- package/dist/GridRenderer.js.map +1 -0
- package/dist/GridRendererTypes.js +3 -0
- package/dist/GridRendererTypes.js.map +1 -0
- package/dist/GridTestUtils.js +16 -0
- package/dist/GridTestUtils.js.map +1 -0
- package/dist/GridTheme.js +100 -0
- package/dist/GridTheme.js.map +1 -0
- package/dist/GridUtils.js +1198 -0
- package/dist/GridUtils.js.map +1 -0
- package/dist/KeyHandler.js +36 -0
- package/dist/KeyHandler.js.map +1 -0
- package/dist/MockDataBarGridModel.js +119 -0
- package/dist/MockDataBarGridModel.js.map +1 -0
- package/dist/MockGridData.js +5 -0
- package/dist/MockGridData.js.map +1 -0
- package/dist/MockGridModel.js +122 -0
- package/dist/MockGridModel.js.map +1 -0
- package/dist/MockTreeGridModel.js +193 -0
- package/dist/MockTreeGridModel.js.map +1 -0
- package/dist/StaticDataGridModel.js +40 -0
- package/dist/StaticDataGridModel.js.map +1 -0
- package/dist/TextCellRenderer.js +210 -0
- package/dist/TextCellRenderer.js.map +1 -0
- package/dist/ThemeContext.js +4 -0
- package/dist/ThemeContext.js.map +1 -0
- package/dist/TokenBoxCellRenderer.js +4 -0
- package/dist/TokenBoxCellRenderer.js.map +1 -0
- package/dist/ViewportDataGridModel.js +43 -0
- package/dist/ViewportDataGridModel.js.map +1 -0
- package/dist/errors/AssertionError.js +11 -0
- package/dist/errors/AssertionError.js.map +1 -0
- package/dist/errors/PasteError.js +11 -0
- package/dist/errors/PasteError.js.map +1 -0
- package/dist/errors/assertIsDefined.js +8 -0
- package/dist/errors/assertIsDefined.js.map +1 -0
- package/dist/errors/index.js +4 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/key-handlers/EditKeyHandler.js +46 -0
- package/dist/key-handlers/EditKeyHandler.js.map +1 -0
- package/dist/key-handlers/PasteKeyHandler.js +124 -0
- package/dist/key-handlers/PasteKeyHandler.js.map +1 -0
- package/dist/key-handlers/SelectionKeyHandler.js +272 -0
- package/dist/key-handlers/SelectionKeyHandler.js.map +1 -0
- package/dist/key-handlers/TreeKeyHandler.js +45 -0
- package/dist/key-handlers/TreeKeyHandler.js.map +1 -0
- package/dist/key-handlers/index.js +5 -0
- package/dist/key-handlers/index.js.map +1 -0
- package/dist/memoizeClear.js +33 -0
- package/dist/memoizeClear.js.map +1 -0
- package/dist/mouse-handlers/EditMouseHandler.js +25 -0
- package/dist/mouse-handlers/EditMouseHandler.js.map +1 -0
- package/dist/mouse-handlers/GridColumnMoveMouseHandler.js +504 -0
- package/dist/mouse-handlers/GridColumnMoveMouseHandler.js.map +1 -0
- package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.js +67 -0
- package/dist/mouse-handlers/GridColumnSeparatorMouseHandler.js.map +1 -0
- package/dist/mouse-handlers/GridHorizontalScrollBarMouseHandler.js +164 -0
- package/dist/mouse-handlers/GridHorizontalScrollBarMouseHandler.js.map +1 -0
- package/dist/mouse-handlers/GridRowMoveMouseHandler.js +139 -0
- package/dist/mouse-handlers/GridRowMoveMouseHandler.js.map +1 -0
- package/dist/mouse-handlers/GridRowSeparatorMouseHandler.js +54 -0
- package/dist/mouse-handlers/GridRowSeparatorMouseHandler.js.map +1 -0
- package/dist/mouse-handlers/GridRowTreeMouseHandler.js +58 -0
- package/dist/mouse-handlers/GridRowTreeMouseHandler.js.map +1 -0
- package/dist/mouse-handlers/GridScrollBarCornerMouseHandler.js +39 -0
- package/dist/mouse-handlers/GridScrollBarCornerMouseHandler.js.map +1 -0
- package/dist/mouse-handlers/GridSelectionMouseHandler.js +223 -0
- package/dist/mouse-handlers/GridSelectionMouseHandler.js.map +1 -0
- package/dist/mouse-handlers/GridSeparatorMouseHandler.js +213 -0
- package/dist/mouse-handlers/GridSeparatorMouseHandler.js.map +1 -0
- package/dist/mouse-handlers/GridTokenMouseHandler.js +161 -0
- package/dist/mouse-handlers/GridTokenMouseHandler.js.map +1 -0
- package/dist/mouse-handlers/GridVerticalScrollBarMouseHandler.js +165 -0
- package/dist/mouse-handlers/GridVerticalScrollBarMouseHandler.js.map +1 -0
- package/dist/mouse-handlers/index.js +13 -0
- package/dist/mouse-handlers/index.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["default","assertIsDefined","AssertionError","PasteError"],"sources":["../../src/errors/index.ts"],"sourcesContent":["export { default as assertIsDefined } from './assertIsDefined';\nexport { default as AssertionError } from './AssertionError';\nexport { default as PasteError } from './PasteError';\n"],"mappings":"SAASA,OAAO,IAAIC,eAAe;AAAA,SAC1BD,OAAO,IAAIE,cAAc;AAAA,SACzBF,OAAO,IAAIG,UAAU"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export * from "./ColumnHeaderGroup.js";
|
|
2
|
+
export * from "./EditableGridModel.js";
|
|
3
|
+
export * from "./ExpandableGridModel.js";
|
|
4
|
+
export { default as Grid } from "./Grid.js";
|
|
5
|
+
export * from "./Grid.js";
|
|
6
|
+
export * from "./GridMetricCalculator.js";
|
|
7
|
+
export * from "./GridMetrics.js";
|
|
8
|
+
export { default as GridModel } from "./GridModel.js";
|
|
9
|
+
export * from "./GridMouseHandler.js";
|
|
10
|
+
export * from "./GridRange.js";
|
|
11
|
+
export * from "./GridAxisRange.js";
|
|
12
|
+
export * from "./GridRenderer.js";
|
|
13
|
+
export { default as GridTestUtils } from "./GridTestUtils.js";
|
|
14
|
+
export { default as GridTheme } from "./GridTheme.js";
|
|
15
|
+
export * from "./GridUtils.js";
|
|
16
|
+
export { default as KeyHandler } from "./KeyHandler.js";
|
|
17
|
+
export { default as MockGridModel } from "./MockGridModel.js";
|
|
18
|
+
export { default as MockTreeGridModel } from "./MockTreeGridModel.js";
|
|
19
|
+
export { default as memoizeClear } from "./memoizeClear.js";
|
|
20
|
+
export { default as StaticDataGridModel } from "./StaticDataGridModel.js";
|
|
21
|
+
export { default as ViewportDataGridModel } from "./ViewportDataGridModel.js";
|
|
22
|
+
export { default as MockDataBarGridModel } from "./MockDataBarGridModel.js";
|
|
23
|
+
export * from "./key-handlers/index.js";
|
|
24
|
+
export * from "./mouse-handlers/index.js";
|
|
25
|
+
export * from "./errors/index.js";
|
|
26
|
+
export * from "./EventHandlerResult.js";
|
|
27
|
+
export { default as ThemeContext } from "./ThemeContext.js";
|
|
28
|
+
export { default as TextCellRenderer } from "./TextCellRenderer.js";
|
|
29
|
+
export { default as DataBarCellRenderer } from "./DataBarCellRenderer.js";
|
|
30
|
+
export * from "./TokenBoxCellRenderer.js";
|
|
31
|
+
export * from "./GridRendererTypes.js";
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["default","Grid","GridModel","GridTestUtils","GridTheme","KeyHandler","MockGridModel","MockTreeGridModel","memoizeClear","StaticDataGridModel","ViewportDataGridModel","MockDataBarGridModel","ThemeContext","TextCellRenderer","DataBarCellRenderer"],"sources":["../src/index.ts"],"sourcesContent":["export * from './ColumnHeaderGroup';\nexport * from './EditableGridModel';\nexport * from './ExpandableGridModel';\nexport { default as Grid } from './Grid';\nexport * from './Grid';\nexport * from './GridMetricCalculator';\nexport * from './GridMetrics';\nexport { default as GridModel } from './GridModel';\nexport * from './GridMouseHandler';\nexport * from './GridRange';\nexport * from './GridAxisRange';\nexport * from './GridRenderer';\nexport { default as GridTestUtils } from './GridTestUtils';\nexport { default as GridTheme } from './GridTheme';\nexport type { GridTheme as GridThemeType } from './GridTheme';\nexport * from './GridUtils';\nexport { default as KeyHandler } from './KeyHandler';\nexport { default as MockGridModel } from './MockGridModel';\nexport { default as MockTreeGridModel } from './MockTreeGridModel';\nexport { default as memoizeClear } from './memoizeClear';\nexport { default as StaticDataGridModel } from './StaticDataGridModel';\nexport { default as ViewportDataGridModel } from './ViewportDataGridModel';\nexport { default as MockDataBarGridModel } from './MockDataBarGridModel';\nexport * from './key-handlers';\nexport * from './mouse-handlers';\nexport * from './errors';\nexport * from './EventHandlerResult';\nexport { default as ThemeContext } from './ThemeContext';\nexport type { default as CellRenderer, CellRenderType } from './CellRenderer';\nexport { default as TextCellRenderer } from './TextCellRenderer';\nexport { default as DataBarCellRenderer } from './DataBarCellRenderer';\nexport * from './TokenBoxCellRenderer';\nexport * from './GridRendererTypes';\n"],"mappings":";;;SAGSA,OAAO,IAAIC,IAAI;AAAA;AAAA;AAAA;AAAA,SAIfD,OAAO,IAAIE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,SAKpBF,OAAO,IAAIG,aAAa;AAAA,SACxBH,OAAO,IAAII,SAAS;AAAA;AAAA,SAGpBJ,OAAO,IAAIK,UAAU;AAAA,SACrBL,OAAO,IAAIM,aAAa;AAAA,SACxBN,OAAO,IAAIO,iBAAiB;AAAA,SAC5BP,OAAO,IAAIQ,YAAY;AAAA,SACvBR,OAAO,IAAIS,mBAAmB;AAAA,SAC9BT,OAAO,IAAIU,qBAAqB;AAAA,SAChCV,OAAO,IAAIW,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,SAK/BX,OAAO,IAAIY,YAAY;AAAA,SAEvBZ,OAAO,IAAIa,gBAAgB;AAAA,SAC3Bb,OAAO,IAAIc,mBAAmB;AAAA;AAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/* eslint class-methods-use-this: "off" */
|
|
2
|
+
import GridUtils from "../GridUtils.js";
|
|
3
|
+
import GridRange from "../GridRange.js";
|
|
4
|
+
import KeyHandler from "../KeyHandler.js";
|
|
5
|
+
import { isEditableGridModel } from "../EditableGridModel.js";
|
|
6
|
+
class EditKeyHandler extends KeyHandler {
|
|
7
|
+
onDown(event, grid) {
|
|
8
|
+
if (GridUtils.isModifierKeyDown(event)) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
var {
|
|
12
|
+
model
|
|
13
|
+
} = grid.props;
|
|
14
|
+
var {
|
|
15
|
+
cursorColumn,
|
|
16
|
+
cursorRow
|
|
17
|
+
} = grid.state;
|
|
18
|
+
if (cursorColumn == null || cursorRow == null || !isEditableGridModel(model) || !model.isEditableRange(GridRange.makeCell(cursorColumn, cursorRow))) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
var column = cursorColumn;
|
|
22
|
+
var row = cursorRow;
|
|
23
|
+
if (column == null || row == null) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
if (event.key.length === 1) {
|
|
27
|
+
grid.startEditing(column, row, true, [1, 1], event.key);
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
if (event.key === 'F2') {
|
|
31
|
+
grid.startEditing(column, row);
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
if (event.key === 'Backspace') {
|
|
35
|
+
grid.startEditing(column, row, true, undefined, '');
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
if (event.key === 'Delete') {
|
|
39
|
+
grid.setValueForCell(column, row, '');
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export default EditKeyHandler;
|
|
46
|
+
//# sourceMappingURL=EditKeyHandler.js.map
|
|
@@ -0,0 +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;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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/* eslint class-methods-use-this: "off" */
|
|
2
|
+
import GridUtils from "../GridUtils.js";
|
|
3
|
+
import KeyHandler from "../KeyHandler.js";
|
|
4
|
+
/**
|
|
5
|
+
* Parse out data from an HTML table. Currently does not support colspan/rowspan
|
|
6
|
+
* @param table HTML Table
|
|
7
|
+
* @returns A two dimensional array with the data found in the table
|
|
8
|
+
*/
|
|
9
|
+
export function parseValueFromTable(table) {
|
|
10
|
+
var data = [];
|
|
11
|
+
var rows = table.querySelectorAll('tr');
|
|
12
|
+
for (var r = 0; r < rows.length; r += 1) {
|
|
13
|
+
var row = rows[r];
|
|
14
|
+
var cells = row.querySelectorAll('td');
|
|
15
|
+
var rowData = [];
|
|
16
|
+
for (var c = 0; c < cells.length; c += 1) {
|
|
17
|
+
var _cell$textContent$tri, _cell$textContent;
|
|
18
|
+
var cell = cells[c];
|
|
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 : '');
|
|
20
|
+
}
|
|
21
|
+
data.push(rowData);
|
|
22
|
+
}
|
|
23
|
+
return data;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Parses out a table of data from HTML elements. Treats each element as one rows.
|
|
28
|
+
* Filters out blank rows.
|
|
29
|
+
* @param rows The elements to parse out
|
|
30
|
+
* @returns A string table of data
|
|
31
|
+
*/
|
|
32
|
+
export function parseValueFromNodes(nodes) {
|
|
33
|
+
var result = [];
|
|
34
|
+
nodes.forEach(node => {
|
|
35
|
+
var _node$textContent;
|
|
36
|
+
var text = (_node$textContent = node.textContent) !== null && _node$textContent !== void 0 ? _node$textContent : '';
|
|
37
|
+
if (text.length > 0) {
|
|
38
|
+
// When Chrome pastes a table from text, it preserves the tab characters
|
|
39
|
+
// In Firefox, it breaks it into a combination of non-breaking spaces and spaces
|
|
40
|
+
result.push(text.split(/\t|\u00a0\u00a0 \u00a0/));
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
export function parseValueFromElement(element) {
|
|
46
|
+
var _element$textContent$, _element$textContent;
|
|
47
|
+
// Check first if there's an HTML table element that we can use
|
|
48
|
+
var table = element.querySelector('table');
|
|
49
|
+
if (table != null) {
|
|
50
|
+
return parseValueFromTable(table);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Otherwise check if there's any text content at all
|
|
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$ : '';
|
|
55
|
+
if (text.length > 0) {
|
|
56
|
+
// If there's text content, try and parse out a table from the child nodes. Each node is a row.
|
|
57
|
+
// If there's only one row and it doesn't contain a tab, then just treat it as a regular value
|
|
58
|
+
var {
|
|
59
|
+
childNodes
|
|
60
|
+
} = element;
|
|
61
|
+
var hasTabChar = text.includes('\t');
|
|
62
|
+
var hasFirefoxTab = text.includes('\u00a0\u00a0 \u00a0');
|
|
63
|
+
if (hasTabChar && childNodes.length !== 0 && (childNodes.length === 1 || childNodes.length > 1 && (childNodes[0].textContent == null || !childNodes[0].textContent.includes('\t')))) {
|
|
64
|
+
// When Chrome pastes a single row, it gets split into multiple child nodes
|
|
65
|
+
// If we check the first child node and it doesn't have a tab character, but the full element text content does, then
|
|
66
|
+
// just parse the text out separated by the tab chars
|
|
67
|
+
return text.split('\n').map(row => row.split('\t'));
|
|
68
|
+
}
|
|
69
|
+
if (childNodes.length > 1 || hasFirefoxTab) {
|
|
70
|
+
return parseValueFromNodes(element.childNodes);
|
|
71
|
+
}
|
|
72
|
+
// If there's no tabs or no multiple rows, than just treat it as one value
|
|
73
|
+
return text;
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Handles the paste key combination
|
|
80
|
+
*/
|
|
81
|
+
class PasteKeyHandler extends KeyHandler {
|
|
82
|
+
onDown(event, grid) {
|
|
83
|
+
switch (event.key) {
|
|
84
|
+
case 'v':
|
|
85
|
+
if (GridUtils.isModifierKeyDown(event)) {
|
|
86
|
+
// Chrome doesn't allow the paste event on canvas elements
|
|
87
|
+
// Instead, we capture the ctrl+v keydown, then do this to capture the input
|
|
88
|
+
var dummyInput = document.createElement('div');
|
|
89
|
+
document.body.appendChild(dummyInput);
|
|
90
|
+
dummyInput.setAttribute('contenteditable', 'true');
|
|
91
|
+
|
|
92
|
+
// Give it invisible styling
|
|
93
|
+
dummyInput.setAttribute('style', 'clip-path: "inset(50%)"; height: 1px; width: 1px; margin: -1px; overflow: hidden; padding 0; position: absolute;');
|
|
94
|
+
var listener = () => {
|
|
95
|
+
dummyInput.removeEventListener('input', listener);
|
|
96
|
+
dummyInput.remove();
|
|
97
|
+
grid.focus();
|
|
98
|
+
var value = parseValueFromElement(dummyInput);
|
|
99
|
+
if (value != null) {
|
|
100
|
+
grid.pasteValue(value);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
// Listen for the `input` event, when there's a change to the HTML
|
|
105
|
+
// We could also listen to the `paste` event to get the clipboard data, but that's just text data
|
|
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);
|
|
108
|
+
|
|
109
|
+
// Focus the element so it receives the paste event
|
|
110
|
+
dummyInput.focus();
|
|
111
|
+
|
|
112
|
+
// Don't block the paste event from updating our dummy input
|
|
113
|
+
return {
|
|
114
|
+
preventDefault: false,
|
|
115
|
+
stopPropagation: true
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
export default PasteKeyHandler;
|
|
124
|
+
//# sourceMappingURL=PasteKeyHandler.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/* eslint class-methods-use-this: "off" */
|
|
2
|
+
import clamp from 'lodash.clamp';
|
|
3
|
+
import GridRange from "../GridRange.js";
|
|
4
|
+
import GridUtils from "../GridUtils.js";
|
|
5
|
+
import KeyHandler from "../KeyHandler.js";
|
|
6
|
+
class SelectionKeyHandler extends KeyHandler {
|
|
7
|
+
onDown(event, grid) {
|
|
8
|
+
switch (event.key) {
|
|
9
|
+
case 'a':
|
|
10
|
+
if (GridUtils.isModifierKeyDown(event)) {
|
|
11
|
+
grid.selectAll();
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
break;
|
|
15
|
+
case 'ArrowUp':
|
|
16
|
+
return this.handleArrowMove(0, -1, event, grid);
|
|
17
|
+
case 'ArrowDown':
|
|
18
|
+
return this.handleArrowMove(0, 1, event, grid);
|
|
19
|
+
case 'ArrowRight':
|
|
20
|
+
return this.handleArrowMove(1, 0, event, grid);
|
|
21
|
+
case 'ArrowLeft':
|
|
22
|
+
return this.handleArrowMove(-1, 0, event, grid);
|
|
23
|
+
/**
|
|
24
|
+
* h/j/k/l keys are grouped together for quick navigation by power users.
|
|
25
|
+
* Bender added these as shortcuts in the original commit of keyboard shortcuts.
|
|
26
|
+
* We have no idea why, or what might have inspired them (not excel, not swing, vim?).
|
|
27
|
+
* Maybe lack of page up keys on a laptop at the time?
|
|
28
|
+
*/
|
|
29
|
+
case 'k':
|
|
30
|
+
case 'K':
|
|
31
|
+
if (GridUtils.isModifierKeyDown(event)) return false;
|
|
32
|
+
return this.handlePageUp(event, grid);
|
|
33
|
+
case 'j':
|
|
34
|
+
case 'J':
|
|
35
|
+
if (GridUtils.isModifierKeyDown(event)) return false;
|
|
36
|
+
return this.handlePageDown(event, grid);
|
|
37
|
+
case 'h':
|
|
38
|
+
case 'H':
|
|
39
|
+
if (GridUtils.isModifierKeyDown(event)) return false;
|
|
40
|
+
if (!event.shiftKey) {
|
|
41
|
+
grid.clearSelectedRanges();
|
|
42
|
+
}
|
|
43
|
+
grid.moveCursorToPosition(0, grid.state.cursorRow, event.shiftKey);
|
|
44
|
+
return true;
|
|
45
|
+
case 'l':
|
|
46
|
+
case 'L':
|
|
47
|
+
{
|
|
48
|
+
if (GridUtils.isModifierKeyDown(event)) return false;
|
|
49
|
+
var {
|
|
50
|
+
model
|
|
51
|
+
} = grid.props;
|
|
52
|
+
var {
|
|
53
|
+
columnCount
|
|
54
|
+
} = model;
|
|
55
|
+
if (!event.shiftKey) {
|
|
56
|
+
grid.clearSelectedRanges();
|
|
57
|
+
}
|
|
58
|
+
grid.moveCursorToPosition(columnCount - 1, grid.state.cursorRow, event.shiftKey);
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
case 'PageDown':
|
|
62
|
+
return this.handlePageDown(event, grid);
|
|
63
|
+
case 'PageUp':
|
|
64
|
+
return this.handlePageUp(event, grid);
|
|
65
|
+
case 'Home':
|
|
66
|
+
if (!event.shiftKey) {
|
|
67
|
+
grid.clearSelectedRanges();
|
|
68
|
+
}
|
|
69
|
+
grid.moveCursorToPosition(GridUtils.isModifierKeyDown(event) ? grid.state.cursorColumn : 0, GridUtils.isModifierKeyDown(event) ? 0 : grid.state.cursorRow, event.shiftKey, true, true);
|
|
70
|
+
return true;
|
|
71
|
+
case 'End':
|
|
72
|
+
{
|
|
73
|
+
var {
|
|
74
|
+
model: _model
|
|
75
|
+
} = grid.props;
|
|
76
|
+
var {
|
|
77
|
+
columnCount: _columnCount,
|
|
78
|
+
rowCount
|
|
79
|
+
} = _model;
|
|
80
|
+
if (!event.shiftKey) {
|
|
81
|
+
grid.clearSelectedRanges();
|
|
82
|
+
}
|
|
83
|
+
grid.moveCursorToPosition(GridUtils.isModifierKeyDown(event) ? grid.state.cursorColumn : _columnCount - 1, GridUtils.isModifierKeyDown(event) ? rowCount - 1 : grid.state.cursorRow, event.shiftKey, true, true);
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
case 'Escape':
|
|
87
|
+
grid.clearSelectedRanges();
|
|
88
|
+
// Event consumed, but propagation not stopped
|
|
89
|
+
// so the shortcut could be handled by the global handler
|
|
90
|
+
return {
|
|
91
|
+
preventDefault: false,
|
|
92
|
+
stopPropagation: false
|
|
93
|
+
};
|
|
94
|
+
case 'Enter':
|
|
95
|
+
if (grid.state.selectedRanges.length > 0) {
|
|
96
|
+
grid.moveCursorInDirection(event.shiftKey ? GridRange.SELECTION_DIRECTION.UP : GridRange.SELECTION_DIRECTION.DOWN);
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
break;
|
|
100
|
+
case 'Tab':
|
|
101
|
+
if (grid.state.selectedRanges.length > 0) {
|
|
102
|
+
grid.moveCursorInDirection(event.shiftKey ? GridRange.SELECTION_DIRECTION.LEFT : GridRange.SELECTION_DIRECTION.RIGHT);
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
break;
|
|
106
|
+
default:
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
handleArrowMove(deltaColumn, deltaRow, event, grid) {
|
|
112
|
+
var isShiftKey = event.shiftKey;
|
|
113
|
+
var isModifierKey = GridUtils.isModifierKeyDown(event);
|
|
114
|
+
if (isShiftKey) {
|
|
115
|
+
grid.trimSelectedRanges();
|
|
116
|
+
} else {
|
|
117
|
+
grid.clearSelectedRanges();
|
|
118
|
+
}
|
|
119
|
+
var {
|
|
120
|
+
cursorRow,
|
|
121
|
+
cursorColumn,
|
|
122
|
+
selectionEndColumn,
|
|
123
|
+
selectionEndRow
|
|
124
|
+
} = grid.state;
|
|
125
|
+
var column = isShiftKey ? selectionEndColumn : cursorColumn;
|
|
126
|
+
var row = isShiftKey ? selectionEndRow : cursorRow;
|
|
127
|
+
if (isModifierKey) {
|
|
128
|
+
var {
|
|
129
|
+
model
|
|
130
|
+
} = grid.props;
|
|
131
|
+
var {
|
|
132
|
+
columnCount,
|
|
133
|
+
rowCount
|
|
134
|
+
} = model;
|
|
135
|
+
var maximizePreviousRange = isModifierKey && isShiftKey;
|
|
136
|
+
var moveToColumn = null;
|
|
137
|
+
var moveToRow = null;
|
|
138
|
+
if (deltaColumn < 0) {
|
|
139
|
+
moveToColumn = 0;
|
|
140
|
+
moveToRow = row;
|
|
141
|
+
} else if (deltaColumn > 0) {
|
|
142
|
+
moveToColumn = columnCount - 1;
|
|
143
|
+
moveToRow = row;
|
|
144
|
+
} else if (deltaRow < 0) {
|
|
145
|
+
moveToColumn = column;
|
|
146
|
+
moveToRow = 0;
|
|
147
|
+
} else if (deltaRow > 0) {
|
|
148
|
+
moveToColumn = column;
|
|
149
|
+
moveToRow = rowCount - 1;
|
|
150
|
+
}
|
|
151
|
+
if (moveToColumn != null && moveToRow != null) {
|
|
152
|
+
grid.moveCursorToPosition(moveToColumn, moveToRow, isShiftKey, true, maximizePreviousRange);
|
|
153
|
+
}
|
|
154
|
+
} else {
|
|
155
|
+
if (!grid.metrics) throw new Error('grid.metrics are not set');
|
|
156
|
+
var {
|
|
157
|
+
theme
|
|
158
|
+
} = grid.props;
|
|
159
|
+
var {
|
|
160
|
+
autoSelectRow = false,
|
|
161
|
+
autoSelectColumn = false
|
|
162
|
+
} = theme;
|
|
163
|
+
if (autoSelectRow && deltaColumn !== 0) {
|
|
164
|
+
var {
|
|
165
|
+
lastLeft
|
|
166
|
+
} = grid.metrics;
|
|
167
|
+
var {
|
|
168
|
+
left
|
|
169
|
+
} = grid.state;
|
|
170
|
+
left = clamp(left + deltaColumn, 0, lastLeft);
|
|
171
|
+
grid.moveCursorToPosition(left, cursorRow, isShiftKey, false);
|
|
172
|
+
grid.setViewState({
|
|
173
|
+
left
|
|
174
|
+
});
|
|
175
|
+
} else if (autoSelectColumn && deltaRow !== 0) {
|
|
176
|
+
var {
|
|
177
|
+
lastTop
|
|
178
|
+
} = grid.metrics;
|
|
179
|
+
var {
|
|
180
|
+
top
|
|
181
|
+
} = grid.state;
|
|
182
|
+
top = clamp(top + deltaRow, 0, lastTop);
|
|
183
|
+
grid.moveCursorToPosition(top, cursorColumn, isShiftKey, false);
|
|
184
|
+
grid.setViewState({
|
|
185
|
+
top
|
|
186
|
+
});
|
|
187
|
+
} else {
|
|
188
|
+
grid.moveCursor(deltaColumn, deltaRow, isShiftKey);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
handlePageUp(e, grid) {
|
|
194
|
+
var isShiftKey = e.shiftKey;
|
|
195
|
+
if (isShiftKey) {
|
|
196
|
+
grid.trimSelectedRanges();
|
|
197
|
+
} else {
|
|
198
|
+
grid.clearSelectedRanges();
|
|
199
|
+
}
|
|
200
|
+
var {
|
|
201
|
+
cursorColumn,
|
|
202
|
+
selectionEndRow
|
|
203
|
+
} = grid.state;
|
|
204
|
+
var row = selectionEndRow;
|
|
205
|
+
var column = cursorColumn;
|
|
206
|
+
if (row == null) {
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
var metricState = grid.getMetricState();
|
|
210
|
+
var {
|
|
211
|
+
metricCalculator
|
|
212
|
+
} = grid;
|
|
213
|
+
var {
|
|
214
|
+
bottomVisible,
|
|
215
|
+
topVisible,
|
|
216
|
+
hasHorizontalBar
|
|
217
|
+
} = metricCalculator.getMetrics(metricState);
|
|
218
|
+
var selectRangeEndPosition = row - (bottomVisible - topVisible);
|
|
219
|
+
selectRangeEndPosition -= hasHorizontalBar ? 0 : 1;
|
|
220
|
+
|
|
221
|
+
// Don't move beyond the top table row.
|
|
222
|
+
selectRangeEndPosition = Math.max(selectRangeEndPosition, 0);
|
|
223
|
+
var viewportPosition = Math.max(selectRangeEndPosition - (row - topVisible), 0);
|
|
224
|
+
grid.moveCursorToPosition(column, selectRangeEndPosition, isShiftKey, false);
|
|
225
|
+
grid.setViewState({
|
|
226
|
+
top: viewportPosition
|
|
227
|
+
});
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
handlePageDown(e, grid) {
|
|
231
|
+
var isShiftKey = e.shiftKey;
|
|
232
|
+
if (isShiftKey) {
|
|
233
|
+
grid.trimSelectedRanges();
|
|
234
|
+
} else {
|
|
235
|
+
grid.clearSelectedRanges();
|
|
236
|
+
}
|
|
237
|
+
var {
|
|
238
|
+
selectionEndRow,
|
|
239
|
+
cursorColumn
|
|
240
|
+
} = grid.state;
|
|
241
|
+
var row = selectionEndRow;
|
|
242
|
+
var column = cursorColumn;
|
|
243
|
+
if (row === null) {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
var metricState = grid.getMetricState();
|
|
247
|
+
var {
|
|
248
|
+
metricCalculator
|
|
249
|
+
} = grid;
|
|
250
|
+
var {
|
|
251
|
+
bottomVisible,
|
|
252
|
+
topVisible,
|
|
253
|
+
hasHorizontalBar,
|
|
254
|
+
rowCount,
|
|
255
|
+
lastTop
|
|
256
|
+
} = metricCalculator.getMetrics(metricState);
|
|
257
|
+
var lastRowIndex = rowCount - 1;
|
|
258
|
+
var selectRangeEndPosition = bottomVisible - topVisible + row;
|
|
259
|
+
selectRangeEndPosition += hasHorizontalBar ? 0 : 1;
|
|
260
|
+
|
|
261
|
+
// Don't move beyond the bottom table row.
|
|
262
|
+
selectRangeEndPosition = Math.min(selectRangeEndPosition, lastRowIndex);
|
|
263
|
+
var viewportPosition = Math.min(lastTop, selectRangeEndPosition - (row - topVisible));
|
|
264
|
+
grid.moveCursorToPosition(column, selectRangeEndPosition, isShiftKey, false);
|
|
265
|
+
grid.setViewState({
|
|
266
|
+
top: viewportPosition
|
|
267
|
+
});
|
|
268
|
+
return true;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
export default SelectionKeyHandler;
|
|
272
|
+
//# sourceMappingURL=SelectionKeyHandler.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/* eslint class-methods-use-this: "off" */
|
|
2
|
+
import { isExpandableGridModel } from "../ExpandableGridModel.js";
|
|
3
|
+
import KeyHandler from "../KeyHandler.js";
|
|
4
|
+
class TreeKeyHandler extends KeyHandler {
|
|
5
|
+
onDown(event, grid) {
|
|
6
|
+
switch (event.key) {
|
|
7
|
+
case 'Enter':
|
|
8
|
+
case ' ':
|
|
9
|
+
{
|
|
10
|
+
return this.handleExpandKey(event, grid);
|
|
11
|
+
}
|
|
12
|
+
default:
|
|
13
|
+
break;
|
|
14
|
+
}
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
handleExpandKey(event, grid) {
|
|
18
|
+
var {
|
|
19
|
+
selectedRanges
|
|
20
|
+
} = grid.state;
|
|
21
|
+
if (selectedRanges.length === 1) {
|
|
22
|
+
var range = selectedRanges[0];
|
|
23
|
+
if (range.startRow === range.endRow && range.startColumn === range.endColumn) {
|
|
24
|
+
if (!grid.metrics) throw new Error('grid.metrics not set');
|
|
25
|
+
var {
|
|
26
|
+
model
|
|
27
|
+
} = grid.props;
|
|
28
|
+
var {
|
|
29
|
+
startRow: row,
|
|
30
|
+
startColumn: column
|
|
31
|
+
} = range;
|
|
32
|
+
if (row != null) {
|
|
33
|
+
var modelRow = grid.getModelRow(row);
|
|
34
|
+
if ((column === 0 || column == null) && isExpandableGridModel(model) && model.isRowExpandable(modelRow)) {
|
|
35
|
+
grid.toggleRowExpanded(row);
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export default TreeKeyHandler;
|
|
45
|
+
//# sourceMappingURL=TreeKeyHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TreeKeyHandler.js","names":["isExpandableGridModel","KeyHandler","TreeKeyHandler","onDown","event","grid","key","handleExpandKey","selectedRanges","state","length","range","startRow","endRow","startColumn","endColumn","metrics","Error","model","props","row","column","modelRow","getModelRow","isRowExpandable","toggleRowExpanded"],"sources":["../../src/key-handlers/TreeKeyHandler.ts"],"sourcesContent":["/* eslint class-methods-use-this: \"off\" */\nimport { isExpandableGridModel } from '../ExpandableGridModel';\nimport Grid from '../Grid';\nimport GridRange from '../GridRange';\nimport KeyHandler from '../KeyHandler';\n\nclass TreeKeyHandler extends KeyHandler {\n onDown(event: KeyboardEvent, grid: Grid): boolean {\n switch (event.key) {\n case 'Enter':\n case ' ': {\n return this.handleExpandKey(event, grid);\n }\n default:\n break;\n }\n return false;\n }\n\n handleExpandKey(event: KeyboardEvent, grid: Grid): boolean {\n const { selectedRanges } = grid.state;\n if (selectedRanges.length === 1) {\n const range = selectedRanges[0] as GridRange;\n if (\n range.startRow === range.endRow &&\n range.startColumn === range.endColumn\n ) {\n if (!grid.metrics) throw new Error('grid.metrics not set');\n\n const { model } = grid.props;\n const { startRow: row, startColumn: column } = range;\n if (row != null) {\n const modelRow = grid.getModelRow(row);\n if (\n (column === 0 || column == null) &&\n isExpandableGridModel(model) &&\n model.isRowExpandable(modelRow)\n ) {\n grid.toggleRowExpanded(row);\n return true;\n }\n }\n }\n }\n return false;\n }\n}\n\nexport default TreeKeyHandler;\n"],"mappings":"AAAA;AAAA,SACSA,qBAAqB;AAAA,OAGvBC,UAAU;AAEjB,MAAMC,cAAc,SAASD,UAAU,CAAC;EACtCE,MAAM,CAACC,KAAoB,EAAEC,IAAU,EAAW;IAChD,QAAQD,KAAK,CAACE,GAAG;MACf,KAAK,OAAO;MACZ,KAAK,GAAG;QAAE;UACR,OAAO,IAAI,CAACC,eAAe,CAACH,KAAK,EAAEC,IAAI,CAAC;QAC1C;MACA;QACE;IAAM;IAEV,OAAO,KAAK;EACd;EAEAE,eAAe,CAACH,KAAoB,EAAEC,IAAU,EAAW;IACzD,IAAM;MAAEG;IAAe,CAAC,GAAGH,IAAI,CAACI,KAAK;IACrC,IAAID,cAAc,CAACE,MAAM,KAAK,CAAC,EAAE;MAC/B,IAAMC,KAAK,GAAGH,cAAc,CAAC,CAAC,CAAc;MAC5C,IACEG,KAAK,CAACC,QAAQ,KAAKD,KAAK,CAACE,MAAM,IAC/BF,KAAK,CAACG,WAAW,KAAKH,KAAK,CAACI,SAAS,EACrC;QACA,IAAI,CAACV,IAAI,CAACW,OAAO,EAAE,MAAM,IAAIC,KAAK,CAAC,sBAAsB,CAAC;QAE1D,IAAM;UAAEC;QAAM,CAAC,GAAGb,IAAI,CAACc,KAAK;QAC5B,IAAM;UAAEP,QAAQ,EAAEQ,GAAG;UAAEN,WAAW,EAAEO;QAAO,CAAC,GAAGV,KAAK;QACpD,IAAIS,GAAG,IAAI,IAAI,EAAE;UACf,IAAME,QAAQ,GAAGjB,IAAI,CAACkB,WAAW,CAACH,GAAG,CAAC;UACtC,IACE,CAACC,MAAM,KAAK,CAAC,IAAIA,MAAM,IAAI,IAAI,KAC/BrB,qBAAqB,CAACkB,KAAK,CAAC,IAC5BA,KAAK,CAACM,eAAe,CAACF,QAAQ,CAAC,EAC/B;YACAjB,IAAI,CAACoB,iBAAiB,CAACL,GAAG,CAAC;YAC3B,OAAO,IAAI;UACb;QACF;MACF;IACF;IACA,OAAO,KAAK;EACd;AACF;AAEA,eAAelB,cAAc"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { default as SelectionKeyHandler } from "./SelectionKeyHandler.js";
|
|
2
|
+
export { default as TreeKeyHandler } from "./TreeKeyHandler.js";
|
|
3
|
+
export { default as EditKeyHandler } from "./EditKeyHandler.js";
|
|
4
|
+
export { default as PasteKeyHandler } from "./PasteKeyHandler.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["default","SelectionKeyHandler","TreeKeyHandler","EditKeyHandler","PasteKeyHandler"],"sources":["../../src/key-handlers/index.ts"],"sourcesContent":["export { default as SelectionKeyHandler } from './SelectionKeyHandler';\nexport { default as TreeKeyHandler } from './TreeKeyHandler';\nexport { default as EditKeyHandler } from './EditKeyHandler';\nexport { default as PasteKeyHandler } from './PasteKeyHandler';\n"],"mappings":"SAASA,OAAO,IAAIC,mBAAmB;AAAA,SAC9BD,OAAO,IAAIE,cAAc;AAAA,SACzBF,OAAO,IAAIG,cAAc;AAAA,SACzBH,OAAO,IAAII,eAAe"}
|