@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,193 @@
|
|
|
1
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
3
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
4
|
+
/* eslint class-methods-use-this: "off" */
|
|
5
|
+
/* eslint no-unused-vars: "off" */
|
|
6
|
+
import MockGridModel from "./MockGridModel.js";
|
|
7
|
+
import memoizeClear from "./memoizeClear.js";
|
|
8
|
+
/**
|
|
9
|
+
* A class to mock a tree model so can test out tree models.
|
|
10
|
+
* Whenever a row is expanded, it creates a child model for that row, which can then make a child for those rows, etc.
|
|
11
|
+
*/
|
|
12
|
+
class MockTreeGridModel extends MockGridModel {
|
|
13
|
+
/** How many rows a child tree should have related to the parent. Eg. if parent has 10000 rows, child will have 100 */
|
|
14
|
+
|
|
15
|
+
constructor() {
|
|
16
|
+
var {
|
|
17
|
+
rowCount = MockTreeGridModel.DEFAULT_ROW_COUNT,
|
|
18
|
+
columnCount = MockTreeGridModel.DEFAULT_COLUMN_COUNT,
|
|
19
|
+
children: _children = new Map(),
|
|
20
|
+
childRowCount: _childRowCount = Math.ceil(Math.max(MockTreeGridModel.MIN_CHILD_ROW_COUNT, rowCount * MockTreeGridModel.DEFAULT_CHILD_ROW_COUNT_FACTOR)),
|
|
21
|
+
maxDepth: _maxDepth = MockTreeGridModel.MAX_DEPTH
|
|
22
|
+
} = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
23
|
+
super({
|
|
24
|
+
rowCount,
|
|
25
|
+
columnCount
|
|
26
|
+
});
|
|
27
|
+
_defineProperty(this, "children", void 0);
|
|
28
|
+
_defineProperty(this, "childRowCount", void 0);
|
|
29
|
+
_defineProperty(this, "maxDepth", void 0);
|
|
30
|
+
_defineProperty(this, "getCachedModelRowOffset", memoizeClear((children, row) => {
|
|
31
|
+
var key = null;
|
|
32
|
+
var offsetRow = row;
|
|
33
|
+
// Need to iterate through the map in order... sort it first
|
|
34
|
+
var sortedEntries = [...children].sort((a, b) => a[0] - b[0]);
|
|
35
|
+
for (var i = 0; i < sortedEntries.length; i += 1) {
|
|
36
|
+
var [childRow, childModel] = sortedEntries[i];
|
|
37
|
+
if (offsetRow <= childRow) {
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
var childRowCount = childModel.rowCount;
|
|
41
|
+
if (offsetRow <= childRow + childRowCount) {
|
|
42
|
+
key = childRow;
|
|
43
|
+
offsetRow = offsetRow - childRow - 1;
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
offsetRow -= childRowCount;
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
key,
|
|
50
|
+
offsetRow
|
|
51
|
+
};
|
|
52
|
+
}));
|
|
53
|
+
_defineProperty(this, "getCachedTextForRowHeader", memoizeClear((children, row) => {
|
|
54
|
+
var {
|
|
55
|
+
key,
|
|
56
|
+
offsetRow
|
|
57
|
+
} = this.getCachedModelRowOffset(children, row);
|
|
58
|
+
if (key != null) {
|
|
59
|
+
var model = children.get(key);
|
|
60
|
+
if (model !== undefined) {
|
|
61
|
+
return "".concat(key, ".").concat(model.textForRowHeader(offsetRow));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return "".concat(offsetRow);
|
|
65
|
+
}));
|
|
66
|
+
_defineProperty(this, "getCachedTextForCell", memoizeClear((children, column, row) => {
|
|
67
|
+
var {
|
|
68
|
+
key,
|
|
69
|
+
offsetRow
|
|
70
|
+
} = this.getCachedModelRowOffset(children, row);
|
|
71
|
+
if (key != null) {
|
|
72
|
+
var model = children.get(key);
|
|
73
|
+
if (model !== undefined) {
|
|
74
|
+
return "".concat(key, ".").concat(model.textForCell(column, offsetRow));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return "".concat(column, ",").concat(offsetRow);
|
|
78
|
+
}));
|
|
79
|
+
_defineProperty(this, "getCachedIsRowExpandable", memoizeClear((children, row, maxDepth) => {
|
|
80
|
+
var depth = this.getCachedDepthForRow(children, row);
|
|
81
|
+
return depth < maxDepth;
|
|
82
|
+
}));
|
|
83
|
+
_defineProperty(this, "getCachedIsRowExpanded", memoizeClear((children, row) => {
|
|
84
|
+
var {
|
|
85
|
+
key,
|
|
86
|
+
offsetRow
|
|
87
|
+
} = this.getCachedModelRowOffset(children, row);
|
|
88
|
+
if (key != null) {
|
|
89
|
+
var model = children.get(key);
|
|
90
|
+
if (model !== undefined) {
|
|
91
|
+
return model.isRowExpanded(offsetRow);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return children.has(offsetRow);
|
|
95
|
+
}));
|
|
96
|
+
_defineProperty(this, "getCachedDepthForRow", memoizeClear((children, row) => {
|
|
97
|
+
var {
|
|
98
|
+
key,
|
|
99
|
+
offsetRow
|
|
100
|
+
} = this.getCachedModelRowOffset(children, row);
|
|
101
|
+
if (key != null) {
|
|
102
|
+
var model = children.get(key);
|
|
103
|
+
if (model !== undefined) {
|
|
104
|
+
return model.depthForRow(offsetRow) + 1;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return 0;
|
|
108
|
+
}));
|
|
109
|
+
this.children = _children;
|
|
110
|
+
this.childRowCount = _childRowCount;
|
|
111
|
+
this.maxDepth = _maxDepth;
|
|
112
|
+
}
|
|
113
|
+
textForCell(column, row) {
|
|
114
|
+
return this.getCachedTextForCell(this.children, column, row);
|
|
115
|
+
}
|
|
116
|
+
textForRowHeader(row) {
|
|
117
|
+
return this.getCachedTextForRowHeader(this.children, row);
|
|
118
|
+
}
|
|
119
|
+
isRowMovable(row) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
get hasExpandableRows() {
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
get isExpandAllAvailable() {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
get floatingBottomRowCount() {
|
|
129
|
+
return 0;
|
|
130
|
+
}
|
|
131
|
+
isRowExpandable(row) {
|
|
132
|
+
return this.getCachedIsRowExpandable(this.children, row, this.maxDepth);
|
|
133
|
+
}
|
|
134
|
+
isRowExpanded(row) {
|
|
135
|
+
return this.getCachedIsRowExpanded(this.children, row);
|
|
136
|
+
}
|
|
137
|
+
setRowExpanded(row, isExpanded) {
|
|
138
|
+
var expandDescendants = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
139
|
+
var {
|
|
140
|
+
key,
|
|
141
|
+
offsetRow
|
|
142
|
+
} = this.getCachedModelRowOffset(this.children, row);
|
|
143
|
+
|
|
144
|
+
// We always set a new map so that our memoize functions work properly
|
|
145
|
+
var children = new Map(this.children);
|
|
146
|
+
if (key != null) {
|
|
147
|
+
var model = this.children.get(key);
|
|
148
|
+
if (model !== undefined) {
|
|
149
|
+
var {
|
|
150
|
+
rowCount: originalChildRowCount
|
|
151
|
+
} = model;
|
|
152
|
+
model.setRowExpanded(offsetRow, isExpanded, expandDescendants);
|
|
153
|
+
this.numRows += model.rowCount - originalChildRowCount;
|
|
154
|
+
}
|
|
155
|
+
} else if (!isExpanded) {
|
|
156
|
+
var childModel = children.get(offsetRow);
|
|
157
|
+
if (childModel !== undefined) {
|
|
158
|
+
this.numRows -= childModel.rowCount;
|
|
159
|
+
children.delete(offsetRow);
|
|
160
|
+
}
|
|
161
|
+
} else {
|
|
162
|
+
var child = new MockTreeGridModel({
|
|
163
|
+
rowCount: this.childRowCount,
|
|
164
|
+
columnCount: this.numColumns
|
|
165
|
+
});
|
|
166
|
+
children.set(offsetRow, child);
|
|
167
|
+
this.numRows += child.rowCount;
|
|
168
|
+
}
|
|
169
|
+
this.children = children;
|
|
170
|
+
}
|
|
171
|
+
expandAll() {
|
|
172
|
+
throw new Error('Expand all not implemented.');
|
|
173
|
+
}
|
|
174
|
+
collapseAll() {
|
|
175
|
+
throw new Error('Collapse all not implemented.');
|
|
176
|
+
}
|
|
177
|
+
depthForRow(row) {
|
|
178
|
+
return this.getCachedDepthForRow(this.children, row);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Returns the map key and the offsetRow given the provided children and row index.
|
|
183
|
+
* If the returned key is null, then this offset row is within this model.
|
|
184
|
+
* Only returning the key instead of the model so that memoize doesn't cache a bunch of the children models after they've been deleted (collapsed).
|
|
185
|
+
*/
|
|
186
|
+
}
|
|
187
|
+
_defineProperty(MockTreeGridModel, "DEFAULT_ROW_COUNT", 1000000000);
|
|
188
|
+
_defineProperty(MockTreeGridModel, "DEFAULT_COLUMN_COUNT", 100);
|
|
189
|
+
_defineProperty(MockTreeGridModel, "DEFAULT_CHILD_ROW_COUNT_FACTOR", 0.01);
|
|
190
|
+
_defineProperty(MockTreeGridModel, "MIN_CHILD_ROW_COUNT", 10);
|
|
191
|
+
_defineProperty(MockTreeGridModel, "MAX_DEPTH", 10);
|
|
192
|
+
export default MockTreeGridModel;
|
|
193
|
+
//# sourceMappingURL=MockTreeGridModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockTreeGridModel.js","names":["MockGridModel","memoizeClear","MockTreeGridModel","constructor","rowCount","DEFAULT_ROW_COUNT","columnCount","DEFAULT_COLUMN_COUNT","children","Map","childRowCount","Math","ceil","max","MIN_CHILD_ROW_COUNT","DEFAULT_CHILD_ROW_COUNT_FACTOR","maxDepth","MAX_DEPTH","row","key","offsetRow","sortedEntries","sort","a","b","i","length","childRow","childModel","getCachedModelRowOffset","model","get","undefined","textForRowHeader","column","textForCell","depth","getCachedDepthForRow","isRowExpanded","has","depthForRow","getCachedTextForCell","getCachedTextForRowHeader","isRowMovable","hasExpandableRows","isExpandAllAvailable","floatingBottomRowCount","isRowExpandable","getCachedIsRowExpandable","getCachedIsRowExpanded","setRowExpanded","isExpanded","expandDescendants","originalChildRowCount","numRows","delete","child","numColumns","set","expandAll","Error","collapseAll"],"sources":["../src/MockTreeGridModel.ts"],"sourcesContent":["/* eslint class-methods-use-this: \"off\" */\n/* eslint no-unused-vars: \"off\" */\nimport MockGridModel from './MockGridModel';\nimport memoizeClear from './memoizeClear';\nimport ExpandableGridModel from './ExpandableGridModel';\nimport { ModelIndex } from './GridMetrics';\n\ntype ChildrenTreeMap = Map<ModelIndex, MockTreeGridModel>;\n\n/**\n * A class to mock a tree model so can test out tree models.\n * Whenever a row is expanded, it creates a child model for that row, which can then make a child for those rows, etc.\n */\nclass MockTreeGridModel extends MockGridModel implements ExpandableGridModel {\n static DEFAULT_ROW_COUNT = 1000000000;\n\n static DEFAULT_COLUMN_COUNT = 100;\n\n /** How many rows a child tree should have related to the parent. Eg. if parent has 10000 rows, child will have 100 */\n static DEFAULT_CHILD_ROW_COUNT_FACTOR = 0.01;\n\n static MIN_CHILD_ROW_COUNT = 10;\n\n static MAX_DEPTH = 10;\n\n private children: ChildrenTreeMap;\n\n private childRowCount: number;\n\n private maxDepth: number;\n\n constructor({\n rowCount = MockTreeGridModel.DEFAULT_ROW_COUNT,\n columnCount = MockTreeGridModel.DEFAULT_COLUMN_COUNT,\n children = new Map(),\n childRowCount = Math.ceil(\n Math.max(\n MockTreeGridModel.MIN_CHILD_ROW_COUNT,\n rowCount * MockTreeGridModel.DEFAULT_CHILD_ROW_COUNT_FACTOR\n )\n ),\n maxDepth = MockTreeGridModel.MAX_DEPTH,\n }: {\n children?: ChildrenTreeMap;\n columnCount?: number;\n rowCount?: number;\n childRowCount?: number;\n maxDepth?: number;\n } = {}) {\n super({ rowCount, columnCount });\n\n this.children = children;\n this.childRowCount = childRowCount;\n this.maxDepth = maxDepth;\n }\n\n textForCell(column: ModelIndex, row: ModelIndex): string {\n return this.getCachedTextForCell(this.children, column, row);\n }\n\n textForRowHeader(row: ModelIndex): string {\n return this.getCachedTextForRowHeader(this.children, row);\n }\n\n isRowMovable(row: ModelIndex): boolean {\n return false;\n }\n\n get hasExpandableRows(): boolean {\n return true;\n }\n\n get isExpandAllAvailable(): boolean {\n return false;\n }\n\n get floatingBottomRowCount(): number {\n return 0;\n }\n\n isRowExpandable(row: ModelIndex): boolean {\n return this.getCachedIsRowExpandable(this.children, row, this.maxDepth);\n }\n\n isRowExpanded(row: ModelIndex): boolean {\n return this.getCachedIsRowExpanded(this.children, row);\n }\n\n setRowExpanded(\n row: ModelIndex,\n isExpanded: boolean,\n expandDescendants = false\n ): void {\n const { key, offsetRow } = this.getCachedModelRowOffset(this.children, row);\n\n // We always set a new map so that our memoize functions work properly\n const children = new Map(this.children);\n if (key != null) {\n const model = this.children.get(key);\n if (model !== undefined) {\n const { rowCount: originalChildRowCount } = model;\n model.setRowExpanded(offsetRow, isExpanded, expandDescendants);\n this.numRows += model.rowCount - originalChildRowCount;\n }\n } else if (!isExpanded) {\n const childModel = children.get(offsetRow);\n if (childModel !== undefined) {\n this.numRows -= childModel.rowCount;\n children.delete(offsetRow);\n }\n } else {\n const child = new MockTreeGridModel({\n rowCount: this.childRowCount,\n columnCount: this.numColumns,\n });\n children.set(offsetRow, child);\n this.numRows += child.rowCount;\n }\n\n this.children = children;\n }\n\n expandAll(): void {\n throw new Error('Expand all not implemented.');\n }\n\n collapseAll(): void {\n throw new Error('Collapse all not implemented.');\n }\n\n depthForRow(row: ModelIndex): number {\n return this.getCachedDepthForRow(this.children, row);\n }\n\n /**\n * Returns the map key and the offsetRow given the provided children and row index.\n * If the returned key is null, then this offset row is within this model.\n * Only returning the key instead of the model so that memoize doesn't cache a bunch of the children models after they've been deleted (collapsed).\n */\n getCachedModelRowOffset = memoizeClear(\n (\n children: ChildrenTreeMap,\n row: ModelIndex\n ): { key: ModelIndex | null; offsetRow: ModelIndex } => {\n let key = null;\n let offsetRow = row;\n // Need to iterate through the map in order... sort it first\n const sortedEntries = [...children].sort((a, b) => a[0] - b[0]);\n for (let i = 0; i < sortedEntries.length; i += 1) {\n const [childRow, childModel] = sortedEntries[i];\n if (offsetRow <= childRow) {\n break;\n }\n const childRowCount = childModel.rowCount;\n if (offsetRow <= childRow + childRowCount) {\n key = childRow;\n offsetRow = offsetRow - childRow - 1;\n break;\n }\n offsetRow -= childRowCount;\n }\n\n return { key, offsetRow };\n }\n );\n\n getCachedTextForRowHeader = memoizeClear(\n (children: ChildrenTreeMap, row: ModelIndex): string => {\n const { key, offsetRow } = this.getCachedModelRowOffset(children, row);\n\n if (key != null) {\n const model = children.get(key);\n if (model !== undefined) {\n return `${key}.${model.textForRowHeader(offsetRow)}`;\n }\n }\n\n return `${offsetRow}`;\n }\n );\n\n getCachedTextForCell = memoizeClear(\n (\n children: ChildrenTreeMap,\n column: ModelIndex,\n row: ModelIndex\n ): string => {\n const { key, offsetRow } = this.getCachedModelRowOffset(children, row);\n\n if (key != null) {\n const model = children.get(key);\n if (model !== undefined) {\n return `${key}.${model.textForCell(column, offsetRow)}`;\n }\n }\n\n return `${column},${offsetRow}`;\n }\n );\n\n getCachedIsRowExpandable = memoizeClear(\n (children: ChildrenTreeMap, row: ModelIndex, maxDepth: number): boolean => {\n const depth = this.getCachedDepthForRow(children, row);\n\n return depth < maxDepth;\n }\n );\n\n getCachedIsRowExpanded = memoizeClear(\n (children: ChildrenTreeMap, row: ModelIndex): boolean => {\n const { key, offsetRow } = this.getCachedModelRowOffset(children, row);\n\n if (key != null) {\n const model = children.get(key);\n if (model !== undefined) {\n return model.isRowExpanded(offsetRow);\n }\n }\n\n return children.has(offsetRow);\n }\n );\n\n getCachedDepthForRow = memoizeClear(\n (children: ChildrenTreeMap, row: ModelIndex): number => {\n const { key, offsetRow } = this.getCachedModelRowOffset(children, row);\n\n if (key != null) {\n const model = children.get(key);\n if (model !== undefined) {\n return model.depthForRow(offsetRow) + 1;\n }\n }\n\n return 0;\n }\n );\n}\n\nexport default MockTreeGridModel;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
3
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
4
|
+
import GridModel from "./GridModel.js";
|
|
5
|
+
/**
|
|
6
|
+
* A simple model that displays static data
|
|
7
|
+
*/
|
|
8
|
+
class StaticDataGridModel extends GridModel {
|
|
9
|
+
/**
|
|
10
|
+
* Create a model using the static data provided
|
|
11
|
+
* @param data Row data to display. First dimension is the number of rows, second dimension is the value for each column. Row/column count is derived from the data, and it is stringified for display.
|
|
12
|
+
* @param columnHeaders Optional names for the column headers
|
|
13
|
+
*/
|
|
14
|
+
constructor(data, columnHeaders) {
|
|
15
|
+
var _columnHeaders$length;
|
|
16
|
+
super();
|
|
17
|
+
_defineProperty(this, "data", void 0);
|
|
18
|
+
_defineProperty(this, "columnHeaders", void 0);
|
|
19
|
+
_defineProperty(this, "numberOfColumns", void 0);
|
|
20
|
+
this.data = data;
|
|
21
|
+
this.numberOfColumns = Math.max(...data.map(row => row.length), (_columnHeaders$length = columnHeaders === null || columnHeaders === void 0 ? void 0 : columnHeaders.length) !== null && _columnHeaders$length !== void 0 ? _columnHeaders$length : 0);
|
|
22
|
+
this.columnHeaders = columnHeaders;
|
|
23
|
+
}
|
|
24
|
+
get rowCount() {
|
|
25
|
+
return this.data.length;
|
|
26
|
+
}
|
|
27
|
+
get columnCount() {
|
|
28
|
+
return this.numberOfColumns;
|
|
29
|
+
}
|
|
30
|
+
textForCell(column, row) {
|
|
31
|
+
var _this$data$row;
|
|
32
|
+
return "".concat((_this$data$row = this.data[row]) === null || _this$data$row === void 0 ? void 0 : _this$data$row[column]);
|
|
33
|
+
}
|
|
34
|
+
textForColumnHeader(column) {
|
|
35
|
+
var _this$columnHeaders$c, _this$columnHeaders;
|
|
36
|
+
return (_this$columnHeaders$c = (_this$columnHeaders = this.columnHeaders) === null || _this$columnHeaders === void 0 ? void 0 : _this$columnHeaders[column]) !== null && _this$columnHeaders$c !== void 0 ? _this$columnHeaders$c : '';
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export default StaticDataGridModel;
|
|
40
|
+
//# sourceMappingURL=StaticDataGridModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StaticDataGridModel.js","names":["GridModel","StaticDataGridModel","constructor","data","columnHeaders","numberOfColumns","Math","max","map","row","length","rowCount","columnCount","textForCell","column","textForColumnHeader"],"sources":["../src/StaticDataGridModel.ts"],"sourcesContent":["import GridModel from './GridModel';\n\n/**\n * A simple model that displays static data\n */\nclass StaticDataGridModel extends GridModel {\n private data: unknown[][];\n\n private columnHeaders?: string[];\n\n private numberOfColumns: number;\n\n /**\n * Create a model using the static data provided\n * @param data Row data to display. First dimension is the number of rows, second dimension is the value for each column. Row/column count is derived from the data, and it is stringified for display.\n * @param columnHeaders Optional names for the column headers\n */\n constructor(data: unknown[][], columnHeaders?: string[]) {\n super();\n\n this.data = data;\n this.numberOfColumns = Math.max(\n ...data.map(row => row.length),\n columnHeaders?.length ?? 0\n );\n this.columnHeaders = columnHeaders;\n }\n\n get rowCount(): number {\n return this.data.length;\n }\n\n get columnCount(): number {\n return this.numberOfColumns;\n }\n\n textForCell(column: number, row: number): string {\n return `${this.data[row]?.[column]}`;\n }\n\n textForColumnHeader(column: number): string {\n return this.columnHeaders?.[column] ?? '';\n }\n}\n\nexport default StaticDataGridModel;\n"],"mappings":";;;OAAOA,SAAS;AAEhB;AACA;AACA;AACA,MAAMC,mBAAmB,SAASD,SAAS,CAAC;EAO1C;AACF;AACA;AACA;AACA;EACEE,WAAW,CAACC,IAAiB,EAAEC,aAAwB,EAAE;IAAA;IACvD,KAAK,EAAE;IAAC;IAAA;IAAA;IAER,IAAI,CAACD,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACE,eAAe,GAAGC,IAAI,CAACC,GAAG,CAC7B,GAAGJ,IAAI,CAACK,GAAG,CAACC,GAAG,IAAIA,GAAG,CAACC,MAAM,CAAC,2BAC9BN,aAAa,aAAbA,aAAa,uBAAbA,aAAa,CAAEM,MAAM,yEAAI,CAAC,CAC3B;IACD,IAAI,CAACN,aAAa,GAAGA,aAAa;EACpC;EAEA,IAAIO,QAAQ,GAAW;IACrB,OAAO,IAAI,CAACR,IAAI,CAACO,MAAM;EACzB;EAEA,IAAIE,WAAW,GAAW;IACxB,OAAO,IAAI,CAACP,eAAe;EAC7B;EAEAQ,WAAW,CAACC,MAAc,EAAEL,GAAW,EAAU;IAAA;IAC/C,mCAAU,IAAI,CAACN,IAAI,CAACM,GAAG,CAAC,mDAAd,eAAiBK,MAAM,CAAC;EACpC;EAEAC,mBAAmB,CAACD,MAAc,EAAU;IAAA;IAC1C,uDAAO,IAAI,CAACV,aAAa,wDAAlB,oBAAqBU,MAAM,CAAC,yEAAI,EAAE;EAC3C;AACF;AAEA,eAAeb,mBAAmB"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
3
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
4
|
+
/* eslint-disable class-methods-use-this */
|
|
5
|
+
import { EMPTY_ARRAY, getOrThrow } from '@deephaven/utils';
|
|
6
|
+
import CellRenderer from "./CellRenderer.js";
|
|
7
|
+
import { isExpandableGridModel } from "./ExpandableGridModel.js";
|
|
8
|
+
import { DEFAULT_FONT_WIDTH } from "./GridRendererTypes.js";
|
|
9
|
+
import GridUtils from "./GridUtils.js";
|
|
10
|
+
import memoizeClear from "./memoizeClear.js";
|
|
11
|
+
class TextCellRenderer extends CellRenderer {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
_defineProperty(this, "getCachedTokenBoxesForVisibleCell", memoizeClear((truncatedText, tokens, _font, _baseline, textHeight, context) => {
|
|
15
|
+
var top = 0;
|
|
16
|
+
var bottom = textHeight;
|
|
17
|
+
var tokenBoxes = [];
|
|
18
|
+
|
|
19
|
+
// The index where the last token ended
|
|
20
|
+
var lastTokenEnd = 0;
|
|
21
|
+
// The width of the text preceding the current token
|
|
22
|
+
var currentTextWidth = 0;
|
|
23
|
+
// Loop through array and push them to array
|
|
24
|
+
for (var i = 0; i < tokens.length; i += 1) {
|
|
25
|
+
var token = tokens[i];
|
|
26
|
+
var {
|
|
27
|
+
start,
|
|
28
|
+
end
|
|
29
|
+
} = token;
|
|
30
|
+
// The last token value is calculated based on the full text so the value needs to be truncated
|
|
31
|
+
var value = end > truncatedText.length ? truncatedText.substring(start) : token.value;
|
|
32
|
+
|
|
33
|
+
// Add the width of the text in between this token and the last token
|
|
34
|
+
currentTextWidth += context.measureText(truncatedText.substring(lastTokenEnd, start)).width;
|
|
35
|
+
var tokenWidth = context.measureText(value).width;
|
|
36
|
+
|
|
37
|
+
// Check if the x position is less than the grid x, then tokenWidth should be shifted by gridX - startX
|
|
38
|
+
|
|
39
|
+
var left = currentTextWidth;
|
|
40
|
+
var right = left + tokenWidth;
|
|
41
|
+
var newTokenBox = {
|
|
42
|
+
x1: left,
|
|
43
|
+
y1: top,
|
|
44
|
+
x2: right,
|
|
45
|
+
y2: bottom,
|
|
46
|
+
token
|
|
47
|
+
};
|
|
48
|
+
tokenBoxes.push(newTokenBox);
|
|
49
|
+
lastTokenEnd = end;
|
|
50
|
+
currentTextWidth += tokenWidth;
|
|
51
|
+
}
|
|
52
|
+
return tokenBoxes;
|
|
53
|
+
}, {
|
|
54
|
+
max: 10000
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
drawCellContent(context, state, column, row) {
|
|
58
|
+
var {
|
|
59
|
+
metrics,
|
|
60
|
+
model,
|
|
61
|
+
theme
|
|
62
|
+
} = state;
|
|
63
|
+
var {
|
|
64
|
+
fontWidths,
|
|
65
|
+
modelColumns,
|
|
66
|
+
modelRows,
|
|
67
|
+
allRowHeights,
|
|
68
|
+
firstColumn
|
|
69
|
+
} = metrics;
|
|
70
|
+
var isFirstColumn = column === firstColumn;
|
|
71
|
+
var {
|
|
72
|
+
textColor
|
|
73
|
+
} = theme;
|
|
74
|
+
var rowHeight = getOrThrow(allRowHeights, row);
|
|
75
|
+
var modelRow = getOrThrow(modelRows, row);
|
|
76
|
+
var modelColumn = getOrThrow(modelColumns, column);
|
|
77
|
+
var text = model.textForCell(modelColumn, modelRow);
|
|
78
|
+
var truncationChar = model.truncationCharForCell(modelColumn, modelRow);
|
|
79
|
+
if (text && rowHeight > 0) {
|
|
80
|
+
var _fontWidths$get;
|
|
81
|
+
var textAlign = model.textAlignForCell(modelColumn, modelRow) || 'left';
|
|
82
|
+
context.textAlign = textAlign;
|
|
83
|
+
var color = model.colorForCell(modelColumn, modelRow, theme) || textColor;
|
|
84
|
+
context.fillStyle = color;
|
|
85
|
+
context.save();
|
|
86
|
+
var {
|
|
87
|
+
width: textWidth,
|
|
88
|
+
x: textX,
|
|
89
|
+
y: textY
|
|
90
|
+
} = GridUtils.getTextRenderMetrics(state, column, row);
|
|
91
|
+
var fontWidth = (_fontWidths$get = fontWidths.get(context.font)) !== null && _fontWidths$get !== void 0 ? _fontWidths$get : DEFAULT_FONT_WIDTH;
|
|
92
|
+
var truncatedText = this.getCachedTruncatedString(context, text, textWidth, fontWidth, truncationChar);
|
|
93
|
+
var tokens = model.tokensForCell(modelColumn, modelRow, truncatedText.length);
|
|
94
|
+
if (truncatedText) {
|
|
95
|
+
var tokenIndex = 0;
|
|
96
|
+
var textStart = 0;
|
|
97
|
+
var left = textX;
|
|
98
|
+
var {
|
|
99
|
+
actualBoundingBoxDescent
|
|
100
|
+
} = context.measureText(truncatedText);
|
|
101
|
+
while (textStart < truncatedText.length) {
|
|
102
|
+
var _ref, _token$end;
|
|
103
|
+
var nextToken = tokens[tokenIndex];
|
|
104
|
+
var token = textStart === (nextToken === null || nextToken === void 0 ? void 0 : nextToken.start) ? nextToken : null;
|
|
105
|
+
var textEnd = (_ref = (_token$end = token === null || token === void 0 ? void 0 : token.end) !== null && _token$end !== void 0 ? _token$end : nextToken === null || nextToken === void 0 ? void 0 : nextToken.start) !== null && _ref !== void 0 ? _ref : truncatedText.length;
|
|
106
|
+
var value = truncatedText.substring(textStart, textEnd);
|
|
107
|
+
var {
|
|
108
|
+
width
|
|
109
|
+
} = context.measureText(value);
|
|
110
|
+
var widthOfUnderline = value.endsWith('…') ? context.measureText(value.substring(0, value.length - 1)).width : width;
|
|
111
|
+
|
|
112
|
+
// Set the styling based on the token, then draw the text
|
|
113
|
+
if (token != null) {
|
|
114
|
+
context.fillStyle = theme.hyperlinkColor;
|
|
115
|
+
context.fillText(value, left, textY);
|
|
116
|
+
context.fillRect(left, textY + actualBoundingBoxDescent, widthOfUnderline, 1);
|
|
117
|
+
} else {
|
|
118
|
+
context.fillStyle = color;
|
|
119
|
+
context.fillText(value, left, textY);
|
|
120
|
+
}
|
|
121
|
+
left += width;
|
|
122
|
+
textStart = textEnd;
|
|
123
|
+
if (token != null) tokenIndex += 1;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
context.restore();
|
|
127
|
+
}
|
|
128
|
+
if (isFirstColumn && isExpandableGridModel(model) && model.hasExpandableRows) {
|
|
129
|
+
this.drawCellRowTreeMarker(context, state, row);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Gets the token boxes that are visible in the cell
|
|
135
|
+
* @param column The visible column
|
|
136
|
+
* @param row The visible row
|
|
137
|
+
* @param state The GridRenderState
|
|
138
|
+
* @returns An array of TokenBox of visible tokens or empty array with coordinates relative to gridX and gridY
|
|
139
|
+
*/
|
|
140
|
+
getTokenBoxesForVisibleCell(column, row, state) {
|
|
141
|
+
var _fontWidths$get2;
|
|
142
|
+
var {
|
|
143
|
+
metrics,
|
|
144
|
+
context,
|
|
145
|
+
model,
|
|
146
|
+
theme
|
|
147
|
+
} = state;
|
|
148
|
+
if (context == null || metrics == null) {
|
|
149
|
+
return EMPTY_ARRAY;
|
|
150
|
+
}
|
|
151
|
+
var {
|
|
152
|
+
modelRows,
|
|
153
|
+
modelColumns
|
|
154
|
+
} = metrics;
|
|
155
|
+
var modelRow = getOrThrow(modelRows, row);
|
|
156
|
+
var modelColumn = getOrThrow(modelColumns, column);
|
|
157
|
+
var text = model.textForCell(modelColumn, modelRow);
|
|
158
|
+
var {
|
|
159
|
+
width: textWidth,
|
|
160
|
+
x: textX,
|
|
161
|
+
y: textY
|
|
162
|
+
} = GridUtils.getTextRenderMetrics(state, column, row);
|
|
163
|
+
var {
|
|
164
|
+
fontWidths
|
|
165
|
+
} = metrics;
|
|
166
|
+
|
|
167
|
+
// Set the font and baseline and change it back after
|
|
168
|
+
context.save();
|
|
169
|
+
this.configureContext(context, state);
|
|
170
|
+
var fontWidth = (_fontWidths$get2 = fontWidths === null || fontWidths === void 0 ? void 0 : fontWidths.get(context.font)) !== null && _fontWidths$get2 !== void 0 ? _fontWidths$get2 : DEFAULT_FONT_WIDTH;
|
|
171
|
+
var truncationChar = model.truncationCharForCell(modelColumn, modelRow);
|
|
172
|
+
var truncatedText = this.getCachedTruncatedString(context, text, textWidth, fontWidth, truncationChar);
|
|
173
|
+
var {
|
|
174
|
+
actualBoundingBoxAscent,
|
|
175
|
+
actualBoundingBoxDescent
|
|
176
|
+
} = context.measureText(truncatedText);
|
|
177
|
+
var textHeight = actualBoundingBoxAscent + actualBoundingBoxDescent;
|
|
178
|
+
var tokens = model.tokensForCell(modelColumn, modelRow, truncatedText.length);
|
|
179
|
+
|
|
180
|
+
// Check if the truncated text contains a link
|
|
181
|
+
if (tokens.length === 0) {
|
|
182
|
+
context.restore();
|
|
183
|
+
return EMPTY_ARRAY;
|
|
184
|
+
}
|
|
185
|
+
var cachedTokenBoxes = this.getCachedTokenBoxesForVisibleCell(truncatedText, tokens, theme.font, 'middle', textHeight, context).map(tokenBox => ({
|
|
186
|
+
x1: tokenBox.x1 + textX,
|
|
187
|
+
y1: tokenBox.y1 + (textY - actualBoundingBoxAscent),
|
|
188
|
+
x2: tokenBox.x2 + textX,
|
|
189
|
+
y2: tokenBox.y2 + (textY - actualBoundingBoxAscent),
|
|
190
|
+
token: tokenBox.token
|
|
191
|
+
}));
|
|
192
|
+
context.restore();
|
|
193
|
+
return cachedTokenBoxes;
|
|
194
|
+
}
|
|
195
|
+
configureContext(context, state) {
|
|
196
|
+
var {
|
|
197
|
+
theme
|
|
198
|
+
} = state;
|
|
199
|
+
context.font = theme.font;
|
|
200
|
+
context.textBaseline = 'middle';
|
|
201
|
+
context.lineCap = 'butt';
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Returns an array of token boxes with the coordinates relative to the top left corner of the text
|
|
206
|
+
*/
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export default TextCellRenderer;
|
|
210
|
+
//# sourceMappingURL=TextCellRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextCellRenderer.js","names":["EMPTY_ARRAY","getOrThrow","CellRenderer","isExpandableGridModel","DEFAULT_FONT_WIDTH","GridUtils","memoizeClear","TextCellRenderer","truncatedText","tokens","_font","_baseline","textHeight","context","top","bottom","tokenBoxes","lastTokenEnd","currentTextWidth","i","length","token","start","end","value","substring","measureText","width","tokenWidth","left","right","newTokenBox","x1","y1","x2","y2","push","max","drawCellContent","state","column","row","metrics","model","theme","fontWidths","modelColumns","modelRows","allRowHeights","firstColumn","isFirstColumn","textColor","rowHeight","modelRow","modelColumn","text","textForCell","truncationChar","truncationCharForCell","textAlign","textAlignForCell","color","colorForCell","fillStyle","save","textWidth","x","textX","y","textY","getTextRenderMetrics","fontWidth","get","font","getCachedTruncatedString","tokensForCell","tokenIndex","textStart","actualBoundingBoxDescent","nextToken","textEnd","widthOfUnderline","endsWith","hyperlinkColor","fillText","fillRect","restore","hasExpandableRows","drawCellRowTreeMarker","getTokenBoxesForVisibleCell","configureContext","actualBoundingBoxAscent","cachedTokenBoxes","getCachedTokenBoxesForVisibleCell","map","tokenBox","textBaseline","lineCap"],"sources":["../src/TextCellRenderer.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\nimport { EMPTY_ARRAY, getOrThrow } from '@deephaven/utils';\nimport CellRenderer from './CellRenderer';\nimport { isExpandableGridModel } from './ExpandableGridModel';\nimport { VisibleIndex } from './GridMetrics';\nimport { DEFAULT_FONT_WIDTH, GridRenderState } from './GridRendererTypes';\nimport GridUtils, { TokenBox, Token } from './GridUtils';\nimport memoizeClear from './memoizeClear';\nimport TokenBoxCellRenderer from './TokenBoxCellRenderer';\n\nclass TextCellRenderer extends CellRenderer implements TokenBoxCellRenderer {\n drawCellContent(\n context: CanvasRenderingContext2D,\n state: GridRenderState,\n column: VisibleIndex,\n row: VisibleIndex\n ): void {\n const { metrics, model, theme } = state;\n const {\n fontWidths,\n modelColumns,\n modelRows,\n allRowHeights,\n firstColumn,\n } = metrics;\n const isFirstColumn = column === firstColumn;\n const { textColor } = theme;\n const rowHeight = getOrThrow(allRowHeights, row);\n const modelRow = getOrThrow(modelRows, row);\n const modelColumn = getOrThrow(modelColumns, column);\n const text = model.textForCell(modelColumn, modelRow);\n const truncationChar = model.truncationCharForCell(modelColumn, modelRow);\n\n if (text && rowHeight > 0) {\n const textAlign = model.textAlignForCell(modelColumn, modelRow) || 'left';\n context.textAlign = textAlign;\n\n const color =\n model.colorForCell(modelColumn, modelRow, theme) || textColor;\n context.fillStyle = color;\n\n context.save();\n\n const {\n width: textWidth,\n x: textX,\n y: textY,\n } = GridUtils.getTextRenderMetrics(state, column, row);\n\n const fontWidth = fontWidths.get(context.font) ?? DEFAULT_FONT_WIDTH;\n const truncatedText = this.getCachedTruncatedString(\n context,\n text,\n textWidth,\n fontWidth,\n truncationChar\n );\n\n const tokens = model.tokensForCell(\n modelColumn,\n modelRow,\n truncatedText.length\n );\n\n if (truncatedText) {\n let tokenIndex = 0;\n let textStart = 0;\n let left = textX;\n const { actualBoundingBoxDescent } = context.measureText(truncatedText);\n\n while (textStart < truncatedText.length) {\n const nextToken = tokens[tokenIndex];\n const token = textStart === nextToken?.start ? nextToken : null;\n const textEnd =\n token?.end ?? nextToken?.start ?? truncatedText.length;\n const value = truncatedText.substring(textStart, textEnd);\n const { width } = context.measureText(value);\n const widthOfUnderline = value.endsWith('…')\n ? context.measureText(value.substring(0, value.length - 1)).width\n : width;\n\n // Set the styling based on the token, then draw the text\n if (token != null) {\n context.fillStyle = theme.hyperlinkColor;\n context.fillText(value, left, textY);\n context.fillRect(\n left,\n textY + actualBoundingBoxDescent,\n widthOfUnderline,\n 1\n );\n } else {\n context.fillStyle = color;\n context.fillText(value, left, textY);\n }\n\n left += width;\n textStart = textEnd;\n if (token != null) tokenIndex += 1;\n }\n }\n context.restore();\n }\n\n if (\n isFirstColumn &&\n isExpandableGridModel(model) &&\n model.hasExpandableRows\n ) {\n this.drawCellRowTreeMarker(context, state, row);\n }\n }\n\n /**\n * Gets the token boxes that are visible in the cell\n * @param column The visible column\n * @param row The visible row\n * @param state The GridRenderState\n * @returns An array of TokenBox of visible tokens or empty array with coordinates relative to gridX and gridY\n */\n getTokenBoxesForVisibleCell(\n column: VisibleIndex,\n row: VisibleIndex,\n state: GridRenderState\n ): TokenBox[] {\n const { metrics, context, model, theme } = state;\n\n if (context == null || metrics == null) {\n return (EMPTY_ARRAY as unknown) as TokenBox[];\n }\n\n const { modelRows, modelColumns } = metrics;\n const modelRow = getOrThrow(modelRows, row);\n const modelColumn = getOrThrow(modelColumns, column);\n\n const text = model.textForCell(modelColumn, modelRow);\n const {\n width: textWidth,\n x: textX,\n y: textY,\n } = GridUtils.getTextRenderMetrics(state, column, row);\n\n const { fontWidths } = metrics;\n\n // Set the font and baseline and change it back after\n context.save();\n this.configureContext(context, state);\n\n const fontWidth = fontWidths?.get(context.font) ?? DEFAULT_FONT_WIDTH;\n const truncationChar = model.truncationCharForCell(modelColumn, modelRow);\n const truncatedText = this.getCachedTruncatedString(\n context,\n text,\n textWidth,\n fontWidth,\n truncationChar\n );\n\n const {\n actualBoundingBoxAscent,\n actualBoundingBoxDescent,\n } = context.measureText(truncatedText);\n const textHeight = actualBoundingBoxAscent + actualBoundingBoxDescent;\n\n const tokens = model.tokensForCell(\n modelColumn,\n modelRow,\n truncatedText.length\n );\n\n // Check if the truncated text contains a link\n if (tokens.length === 0) {\n context.restore();\n return (EMPTY_ARRAY as unknown) as TokenBox[];\n }\n\n const cachedTokenBoxes = this.getCachedTokenBoxesForVisibleCell(\n truncatedText,\n tokens,\n theme.font,\n 'middle',\n textHeight,\n context\n ).map(tokenBox => ({\n x1: tokenBox.x1 + textX,\n y1: tokenBox.y1 + (textY - actualBoundingBoxAscent),\n x2: tokenBox.x2 + textX,\n y2: tokenBox.y2 + (textY - actualBoundingBoxAscent),\n token: tokenBox.token,\n }));\n\n context.restore();\n\n return cachedTokenBoxes;\n }\n\n configureContext(\n context: CanvasRenderingContext2D,\n state: GridRenderState\n ): void {\n const { theme } = state;\n context.font = theme.font;\n context.textBaseline = 'middle';\n context.lineCap = 'butt';\n }\n\n /**\n * Returns an array of token boxes with the coordinates relative to the top left corner of the text\n */\n getCachedTokenBoxesForVisibleCell = memoizeClear(\n (\n truncatedText: string,\n tokens: Token[],\n // _font and _baseline are passed in so value is re-calculated when they change\n // They should already be set on the `context`, so they are not used in this method\n _font: string,\n _baseline: CanvasTextBaseline,\n textHeight: number,\n context: CanvasRenderingContext2D\n ): TokenBox[] => {\n const top = 0;\n const bottom = textHeight;\n\n const tokenBoxes: TokenBox[] = [];\n\n // The index where the last token ended\n let lastTokenEnd = 0;\n // The width of the text preceding the current token\n let currentTextWidth = 0;\n // Loop through array and push them to array\n for (let i = 0; i < tokens.length; i += 1) {\n const token = tokens[i];\n const { start, end } = token;\n // The last token value is calculated based on the full text so the value needs to be truncated\n const value =\n end > truncatedText.length\n ? truncatedText.substring(start)\n : token.value;\n\n // Add the width of the text in between this token and the last token\n currentTextWidth += context.measureText(\n truncatedText.substring(lastTokenEnd, start)\n ).width;\n const tokenWidth = context.measureText(value).width;\n\n // Check if the x position is less than the grid x, then tokenWidth should be shifted by gridX - startX\n\n const left = currentTextWidth;\n const right = left + tokenWidth;\n\n const newTokenBox: TokenBox = {\n x1: left,\n y1: top,\n x2: right,\n y2: bottom,\n token,\n };\n\n tokenBoxes.push(newTokenBox);\n\n lastTokenEnd = end;\n currentTextWidth += tokenWidth;\n }\n\n return tokenBoxes;\n },\n { max: 10000 }\n );\n}\n\nexport default TextCellRenderer;\n"],"mappings":";;;AAAA;AACA,SAASA,WAAW,EAAEC,UAAU,QAAQ,kBAAkB;AAAC,OACpDC,YAAY;AAAA,SACVC,qBAAqB;AAAA,SAErBC,kBAAkB;AAAA,OACpBC,SAAS;AAAA,OACTC,YAAY;AAGnB,MAAMC,gBAAgB,SAASL,YAAY,CAAiC;EAAA;IAAA;IAAA,2DAuMtCI,YAAY,CAC9C,CACEE,aAAqB,EACrBC,MAAe,EAGfC,KAAa,EACbC,SAA6B,EAC7BC,UAAkB,EAClBC,OAAiC,KAClB;MACf,IAAMC,GAAG,GAAG,CAAC;MACb,IAAMC,MAAM,GAAGH,UAAU;MAEzB,IAAMI,UAAsB,GAAG,EAAE;;MAEjC;MACA,IAAIC,YAAY,GAAG,CAAC;MACpB;MACA,IAAIC,gBAAgB,GAAG,CAAC;MACxB;MACA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGV,MAAM,CAACW,MAAM,EAAED,CAAC,IAAI,CAAC,EAAE;QACzC,IAAME,KAAK,GAAGZ,MAAM,CAACU,CAAC,CAAC;QACvB,IAAM;UAAEG,KAAK;UAAEC;QAAI,CAAC,GAAGF,KAAK;QAC5B;QACA,IAAMG,KAAK,GACTD,GAAG,GAAGf,aAAa,CAACY,MAAM,GACtBZ,aAAa,CAACiB,SAAS,CAACH,KAAK,CAAC,GAC9BD,KAAK,CAACG,KAAK;;QAEjB;QACAN,gBAAgB,IAAIL,OAAO,CAACa,WAAW,CACrClB,aAAa,CAACiB,SAAS,CAACR,YAAY,EAAEK,KAAK,CAAC,CAC7C,CAACK,KAAK;QACP,IAAMC,UAAU,GAAGf,OAAO,CAACa,WAAW,CAACF,KAAK,CAAC,CAACG,KAAK;;QAEnD;;QAEA,IAAME,IAAI,GAAGX,gBAAgB;QAC7B,IAAMY,KAAK,GAAGD,IAAI,GAAGD,UAAU;QAE/B,IAAMG,WAAqB,GAAG;UAC5BC,EAAE,EAAEH,IAAI;UACRI,EAAE,EAAEnB,GAAG;UACPoB,EAAE,EAAEJ,KAAK;UACTK,EAAE,EAAEpB,MAAM;UACVM;QACF,CAAC;QAEDL,UAAU,CAACoB,IAAI,CAACL,WAAW,CAAC;QAE5Bd,YAAY,GAAGM,GAAG;QAClBL,gBAAgB,IAAIU,UAAU;MAChC;MAEA,OAAOZ,UAAU;IACnB,CAAC,EACD;MAAEqB,GAAG,EAAE;IAAM,CAAC,CACf;EAAA;EAhQDC,eAAe,CACbzB,OAAiC,EACjC0B,KAAsB,EACtBC,MAAoB,EACpBC,GAAiB,EACX;IACN,IAAM;MAAEC,OAAO;MAAEC,KAAK;MAAEC;IAAM,CAAC,GAAGL,KAAK;IACvC,IAAM;MACJM,UAAU;MACVC,YAAY;MACZC,SAAS;MACTC,aAAa;MACbC;IACF,CAAC,GAAGP,OAAO;IACX,IAAMQ,aAAa,GAAGV,MAAM,KAAKS,WAAW;IAC5C,IAAM;MAAEE;IAAU,CAAC,GAAGP,KAAK;IAC3B,IAAMQ,SAAS,GAAGnD,UAAU,CAAC+C,aAAa,EAAEP,GAAG,CAAC;IAChD,IAAMY,QAAQ,GAAGpD,UAAU,CAAC8C,SAAS,EAAEN,GAAG,CAAC;IAC3C,IAAMa,WAAW,GAAGrD,UAAU,CAAC6C,YAAY,EAAEN,MAAM,CAAC;IACpD,IAAMe,IAAI,GAAGZ,KAAK,CAACa,WAAW,CAACF,WAAW,EAAED,QAAQ,CAAC;IACrD,IAAMI,cAAc,GAAGd,KAAK,CAACe,qBAAqB,CAACJ,WAAW,EAAED,QAAQ,CAAC;IAEzE,IAAIE,IAAI,IAAIH,SAAS,GAAG,CAAC,EAAE;MAAA;MACzB,IAAMO,SAAS,GAAGhB,KAAK,CAACiB,gBAAgB,CAACN,WAAW,EAAED,QAAQ,CAAC,IAAI,MAAM;MACzExC,OAAO,CAAC8C,SAAS,GAAGA,SAAS;MAE7B,IAAME,KAAK,GACTlB,KAAK,CAACmB,YAAY,CAACR,WAAW,EAAED,QAAQ,EAAET,KAAK,CAAC,IAAIO,SAAS;MAC/DtC,OAAO,CAACkD,SAAS,GAAGF,KAAK;MAEzBhD,OAAO,CAACmD,IAAI,EAAE;MAEd,IAAM;QACJrC,KAAK,EAAEsC,SAAS;QAChBC,CAAC,EAAEC,KAAK;QACRC,CAAC,EAAEC;MACL,CAAC,GAAGhE,SAAS,CAACiE,oBAAoB,CAAC/B,KAAK,EAAEC,MAAM,EAAEC,GAAG,CAAC;MAEtD,IAAM8B,SAAS,sBAAG1B,UAAU,CAAC2B,GAAG,CAAC3D,OAAO,CAAC4D,IAAI,CAAC,6DAAIrE,kBAAkB;MACpE,IAAMI,aAAa,GAAG,IAAI,CAACkE,wBAAwB,CACjD7D,OAAO,EACP0C,IAAI,EACJU,SAAS,EACTM,SAAS,EACTd,cAAc,CACf;MAED,IAAMhD,MAAM,GAAGkC,KAAK,CAACgC,aAAa,CAChCrB,WAAW,EACXD,QAAQ,EACR7C,aAAa,CAACY,MAAM,CACrB;MAED,IAAIZ,aAAa,EAAE;QACjB,IAAIoE,UAAU,GAAG,CAAC;QAClB,IAAIC,SAAS,GAAG,CAAC;QACjB,IAAIhD,IAAI,GAAGsC,KAAK;QAChB,IAAM;UAAEW;QAAyB,CAAC,GAAGjE,OAAO,CAACa,WAAW,CAAClB,aAAa,CAAC;QAEvE,OAAOqE,SAAS,GAAGrE,aAAa,CAACY,MAAM,EAAE;UAAA;UACvC,IAAM2D,SAAS,GAAGtE,MAAM,CAACmE,UAAU,CAAC;UACpC,IAAMvD,KAAK,GAAGwD,SAAS,MAAKE,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAEzD,KAAK,IAAGyD,SAAS,GAAG,IAAI;UAC/D,IAAMC,OAAO,yBACX3D,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEE,GAAG,mDAAIwD,SAAS,aAATA,SAAS,uBAATA,SAAS,CAAEzD,KAAK,uCAAId,aAAa,CAACY,MAAM;UACxD,IAAMI,KAAK,GAAGhB,aAAa,CAACiB,SAAS,CAACoD,SAAS,EAAEG,OAAO,CAAC;UACzD,IAAM;YAAErD;UAAM,CAAC,GAAGd,OAAO,CAACa,WAAW,CAACF,KAAK,CAAC;UAC5C,IAAMyD,gBAAgB,GAAGzD,KAAK,CAAC0D,QAAQ,CAAC,GAAG,CAAC,GACxCrE,OAAO,CAACa,WAAW,CAACF,KAAK,CAACC,SAAS,CAAC,CAAC,EAAED,KAAK,CAACJ,MAAM,GAAG,CAAC,CAAC,CAAC,CAACO,KAAK,GAC/DA,KAAK;;UAET;UACA,IAAIN,KAAK,IAAI,IAAI,EAAE;YACjBR,OAAO,CAACkD,SAAS,GAAGnB,KAAK,CAACuC,cAAc;YACxCtE,OAAO,CAACuE,QAAQ,CAAC5D,KAAK,EAAEK,IAAI,EAAEwC,KAAK,CAAC;YACpCxD,OAAO,CAACwE,QAAQ,CACdxD,IAAI,EACJwC,KAAK,GAAGS,wBAAwB,EAChCG,gBAAgB,EAChB,CAAC,CACF;UACH,CAAC,MAAM;YACLpE,OAAO,CAACkD,SAAS,GAAGF,KAAK;YACzBhD,OAAO,CAACuE,QAAQ,CAAC5D,KAAK,EAAEK,IAAI,EAAEwC,KAAK,CAAC;UACtC;UAEAxC,IAAI,IAAIF,KAAK;UACbkD,SAAS,GAAGG,OAAO;UACnB,IAAI3D,KAAK,IAAI,IAAI,EAAEuD,UAAU,IAAI,CAAC;QACpC;MACF;MACA/D,OAAO,CAACyE,OAAO,EAAE;IACnB;IAEA,IACEpC,aAAa,IACb/C,qBAAqB,CAACwC,KAAK,CAAC,IAC5BA,KAAK,CAAC4C,iBAAiB,EACvB;MACA,IAAI,CAACC,qBAAqB,CAAC3E,OAAO,EAAE0B,KAAK,EAAEE,GAAG,CAAC;IACjD;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACEgD,2BAA2B,CACzBjD,MAAoB,EACpBC,GAAiB,EACjBF,KAAsB,EACV;IAAA;IACZ,IAAM;MAAEG,OAAO;MAAE7B,OAAO;MAAE8B,KAAK;MAAEC;IAAM,CAAC,GAAGL,KAAK;IAEhD,IAAI1B,OAAO,IAAI,IAAI,IAAI6B,OAAO,IAAI,IAAI,EAAE;MACtC,OAAQ1C,WAAW;IACrB;IAEA,IAAM;MAAE+C,SAAS;MAAED;IAAa,CAAC,GAAGJ,OAAO;IAC3C,IAAMW,QAAQ,GAAGpD,UAAU,CAAC8C,SAAS,EAAEN,GAAG,CAAC;IAC3C,IAAMa,WAAW,GAAGrD,UAAU,CAAC6C,YAAY,EAAEN,MAAM,CAAC;IAEpD,IAAMe,IAAI,GAAGZ,KAAK,CAACa,WAAW,CAACF,WAAW,EAAED,QAAQ,CAAC;IACrD,IAAM;MACJ1B,KAAK,EAAEsC,SAAS;MAChBC,CAAC,EAAEC,KAAK;MACRC,CAAC,EAAEC;IACL,CAAC,GAAGhE,SAAS,CAACiE,oBAAoB,CAAC/B,KAAK,EAAEC,MAAM,EAAEC,GAAG,CAAC;IAEtD,IAAM;MAAEI;IAAW,CAAC,GAAGH,OAAO;;IAE9B;IACA7B,OAAO,CAACmD,IAAI,EAAE;IACd,IAAI,CAAC0B,gBAAgB,CAAC7E,OAAO,EAAE0B,KAAK,CAAC;IAErC,IAAMgC,SAAS,uBAAG1B,UAAU,aAAVA,UAAU,uBAAVA,UAAU,CAAE2B,GAAG,CAAC3D,OAAO,CAAC4D,IAAI,CAAC,+DAAIrE,kBAAkB;IACrE,IAAMqD,cAAc,GAAGd,KAAK,CAACe,qBAAqB,CAACJ,WAAW,EAAED,QAAQ,CAAC;IACzE,IAAM7C,aAAa,GAAG,IAAI,CAACkE,wBAAwB,CACjD7D,OAAO,EACP0C,IAAI,EACJU,SAAS,EACTM,SAAS,EACTd,cAAc,CACf;IAED,IAAM;MACJkC,uBAAuB;MACvBb;IACF,CAAC,GAAGjE,OAAO,CAACa,WAAW,CAAClB,aAAa,CAAC;IACtC,IAAMI,UAAU,GAAG+E,uBAAuB,GAAGb,wBAAwB;IAErE,IAAMrE,MAAM,GAAGkC,KAAK,CAACgC,aAAa,CAChCrB,WAAW,EACXD,QAAQ,EACR7C,aAAa,CAACY,MAAM,CACrB;;IAED;IACA,IAAIX,MAAM,CAACW,MAAM,KAAK,CAAC,EAAE;MACvBP,OAAO,CAACyE,OAAO,EAAE;MACjB,OAAQtF,WAAW;IACrB;IAEA,IAAM4F,gBAAgB,GAAG,IAAI,CAACC,iCAAiC,CAC7DrF,aAAa,EACbC,MAAM,EACNmC,KAAK,CAAC6B,IAAI,EACV,QAAQ,EACR7D,UAAU,EACVC,OAAO,CACR,CAACiF,GAAG,CAACC,QAAQ,KAAK;MACjB/D,EAAE,EAAE+D,QAAQ,CAAC/D,EAAE,GAAGmC,KAAK;MACvBlC,EAAE,EAAE8D,QAAQ,CAAC9D,EAAE,IAAIoC,KAAK,GAAGsB,uBAAuB,CAAC;MACnDzD,EAAE,EAAE6D,QAAQ,CAAC7D,EAAE,GAAGiC,KAAK;MACvBhC,EAAE,EAAE4D,QAAQ,CAAC5D,EAAE,IAAIkC,KAAK,GAAGsB,uBAAuB,CAAC;MACnDtE,KAAK,EAAE0E,QAAQ,CAAC1E;IAClB,CAAC,CAAC,CAAC;IAEHR,OAAO,CAACyE,OAAO,EAAE;IAEjB,OAAOM,gBAAgB;EACzB;EAEAF,gBAAgB,CACd7E,OAAiC,EACjC0B,KAAsB,EAChB;IACN,IAAM;MAAEK;IAAM,CAAC,GAAGL,KAAK;IACvB1B,OAAO,CAAC4D,IAAI,GAAG7B,KAAK,CAAC6B,IAAI;IACzB5D,OAAO,CAACmF,YAAY,GAAG,QAAQ;IAC/BnF,OAAO,CAACoF,OAAO,GAAG,MAAM;EAC1B;;EAEA;AACF;AACA;AA4DA;;AAEA,eAAe1F,gBAAgB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemeContext.js","names":["React","ThemeContext","createContext"],"sources":["../src/ThemeContext.ts"],"sourcesContent":["import React from 'react';\nimport { GridTheme as GridThemeType } from './GridTheme';\n\nexport const ThemeContext: React.Context<\n Partial<GridThemeType>\n> = React.createContext({});\n\nexport default ThemeContext;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AAGzB,OAAO,IAAMC,YAEZ,gBAAGD,KAAK,CAACE,aAAa,CAAC,CAAC,CAAC,CAAC;AAE3B,eAAeD,YAAY"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenBoxCellRenderer.js","names":["isTokenBoxCellRenderer","cellRenderer","getTokenBoxesForVisibleCell","undefined"],"sources":["../src/TokenBoxCellRenderer.ts"],"sourcesContent":["import CellRenderer from './CellRenderer';\nimport { VisibleIndex } from './GridMetrics';\nimport { GridRenderState } from './GridRendererTypes';\nimport { TokenBox } from './GridUtils';\n\nexport function isTokenBoxCellRenderer(\n cellRenderer: CellRenderer\n): cellRenderer is TokenBoxCellRenderer {\n return (\n (cellRenderer as TokenBoxCellRenderer)?.getTokenBoxesForVisibleCell !==\n undefined\n );\n}\n\ninterface TokenBoxCellRenderer extends CellRenderer {\n getTokenBoxesForVisibleCell(\n column: VisibleIndex,\n row: VisibleIndex,\n state: GridRenderState\n ): TokenBox[];\n}\n\nexport default TokenBoxCellRenderer;\n"],"mappings":"AAKA,OAAO,SAASA,sBAAsB,CACpCC,YAA0B,EACY;EACtC,OACE,CAACA,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAA2BC,2BAA2B,MACnEC,SAAS;AAEb"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
3
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
4
|
+
/* eslint-disable class-methods-use-this */
|
|
5
|
+
import GridModel from "./GridModel.js";
|
|
6
|
+
/**
|
|
7
|
+
* A simple model that displays a viewport of data
|
|
8
|
+
*/
|
|
9
|
+
class ViewportDataGridModel extends GridModel {
|
|
10
|
+
/**
|
|
11
|
+
* Model for fetching data asynchonously. Set the viewported data when data is fetched.
|
|
12
|
+
* @param columnCount Number of columns
|
|
13
|
+
* @param rowCount Number of rows
|
|
14
|
+
*/
|
|
15
|
+
constructor(columnCount, rowCount) {
|
|
16
|
+
super();
|
|
17
|
+
_defineProperty(this, "numberOfColumns", void 0);
|
|
18
|
+
_defineProperty(this, "numberOfRows", void 0);
|
|
19
|
+
_defineProperty(this, "viewportData", void 0);
|
|
20
|
+
this.numberOfColumns = columnCount;
|
|
21
|
+
this.numberOfRows = rowCount;
|
|
22
|
+
}
|
|
23
|
+
get columnCount() {
|
|
24
|
+
return this.numberOfColumns;
|
|
25
|
+
}
|
|
26
|
+
get rowCount() {
|
|
27
|
+
return this.numberOfRows;
|
|
28
|
+
}
|
|
29
|
+
textForCell(column, row) {
|
|
30
|
+
var _this$viewportData$ro, _this$viewportData, _this$viewportData$co, _this$viewportData2, _this$viewportData$da, _this$viewportData3, _this$viewportData3$d;
|
|
31
|
+
var viewportRow = row - ((_this$viewportData$ro = (_this$viewportData = this.viewportData) === null || _this$viewportData === void 0 ? void 0 : _this$viewportData.rowOffset) !== null && _this$viewportData$ro !== void 0 ? _this$viewportData$ro : 0);
|
|
32
|
+
var viewportColumn = column - ((_this$viewportData$co = (_this$viewportData2 = this.viewportData) === null || _this$viewportData2 === void 0 ? void 0 : _this$viewportData2.columnOffset) !== null && _this$viewportData$co !== void 0 ? _this$viewportData$co : 0);
|
|
33
|
+
return "".concat((_this$viewportData$da = (_this$viewportData3 = this.viewportData) === null || _this$viewportData3 === void 0 ? void 0 : (_this$viewportData3$d = _this$viewportData3.data[viewportRow]) === null || _this$viewportData3$d === void 0 ? void 0 : _this$viewportData3$d[viewportColumn]) !== null && _this$viewportData$da !== void 0 ? _this$viewportData$da : '');
|
|
34
|
+
}
|
|
35
|
+
textForColumnHeader(column) {
|
|
36
|
+
return "".concat(column);
|
|
37
|
+
}
|
|
38
|
+
textForRowHeader(row) {
|
|
39
|
+
return "".concat(row);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export default ViewportDataGridModel;
|
|
43
|
+
//# sourceMappingURL=ViewportDataGridModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewportDataGridModel.js","names":["GridModel","ViewportDataGridModel","constructor","columnCount","rowCount","numberOfColumns","numberOfRows","textForCell","column","row","viewportRow","viewportData","rowOffset","viewportColumn","columnOffset","data","textForColumnHeader","textForRowHeader"],"sources":["../src/ViewportDataGridModel.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\nimport GridModel from './GridModel';\n\n/**\n * A simple model that displays a viewport of data\n */\nclass ViewportDataGridModel extends GridModel {\n private numberOfColumns: number;\n\n private numberOfRows: number;\n\n public viewportData?: {\n rowOffset: number;\n columnOffset: number;\n data: unknown[][];\n };\n\n /**\n * Model for fetching data asynchonously. Set the viewported data when data is fetched.\n * @param columnCount Number of columns\n * @param rowCount Number of rows\n */\n constructor(columnCount: number, rowCount: number) {\n super();\n\n this.numberOfColumns = columnCount;\n this.numberOfRows = rowCount;\n }\n\n get columnCount(): number {\n return this.numberOfColumns;\n }\n\n get rowCount(): number {\n return this.numberOfRows;\n }\n\n textForCell(column: number, row: number): string {\n const viewportRow = row - (this.viewportData?.rowOffset ?? 0);\n const viewportColumn = column - (this.viewportData?.columnOffset ?? 0);\n return `${this.viewportData?.data[viewportRow]?.[viewportColumn] ?? ''}`;\n }\n\n textForColumnHeader(column: number): string {\n return `${column}`;\n }\n\n textForRowHeader(row: number): string {\n return `${row}`;\n }\n}\n\nexport default ViewportDataGridModel;\n"],"mappings":";;;AAAA;AAAA,OACOA,SAAS;AAEhB;AACA;AACA;AACA,MAAMC,qBAAqB,SAASD,SAAS,CAAC;EAW5C;AACF;AACA;AACA;AACA;EACEE,WAAW,CAACC,WAAmB,EAAEC,QAAgB,EAAE;IACjD,KAAK,EAAE;IAAC;IAAA;IAAA;IAER,IAAI,CAACC,eAAe,GAAGF,WAAW;IAClC,IAAI,CAACG,YAAY,GAAGF,QAAQ;EAC9B;EAEA,IAAID,WAAW,GAAW;IACxB,OAAO,IAAI,CAACE,eAAe;EAC7B;EAEA,IAAID,QAAQ,GAAW;IACrB,OAAO,IAAI,CAACE,YAAY;EAC1B;EAEAC,WAAW,CAACC,MAAc,EAAEC,GAAW,EAAU;IAAA;IAC/C,IAAMC,WAAW,GAAGD,GAAG,mDAAI,IAAI,CAACE,YAAY,uDAAjB,mBAAmBC,SAAS,yEAAI,CAAC,CAAC;IAC7D,IAAMC,cAAc,GAAGL,MAAM,oDAAI,IAAI,CAACG,YAAY,wDAAjB,oBAAmBG,YAAY,yEAAI,CAAC,CAAC;IACtE,iEAAU,IAAI,CAACH,YAAY,iFAAjB,oBAAmBI,IAAI,CAACL,WAAW,CAAC,0DAApC,sBAAuCG,cAAc,CAAC,yEAAI,EAAE;EACxE;EAEAG,mBAAmB,CAACR,MAAc,EAAU;IAC1C,iBAAUA,MAAM;EAClB;EAEAS,gBAAgB,CAACR,GAAW,EAAU;IACpC,iBAAUA,GAAG;EACf;AACF;AAEA,eAAeR,qBAAqB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
3
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
4
|
+
export class AssertionError extends Error {
|
|
5
|
+
constructor() {
|
|
6
|
+
super(...arguments);
|
|
7
|
+
_defineProperty(this, "isAssertionFailed", true);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export default AssertionError;
|
|
11
|
+
//# sourceMappingURL=AssertionError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AssertionError.js","names":["AssertionError","Error"],"sources":["../../src/errors/AssertionError.ts"],"sourcesContent":["export class AssertionError extends Error {\n isAssertionFailed = true;\n}\n\nexport default AssertionError;\n"],"mappings":";;;AAAA,OAAO,MAAMA,cAAc,SAASC,KAAK,CAAC;EAAA;IAAA;IAAA,2CACpB,IAAI;EAAA;AAC1B;AAEA,eAAeD,cAAc"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
3
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
4
|
+
export class PasteError extends Error {
|
|
5
|
+
constructor() {
|
|
6
|
+
super(...arguments);
|
|
7
|
+
_defineProperty(this, "isPasteError", true);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export default PasteError;
|
|
11
|
+
//# sourceMappingURL=PasteError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PasteError.js","names":["PasteError","Error"],"sources":["../../src/errors/PasteError.ts"],"sourcesContent":["export class PasteError extends Error {\n isPasteError = true;\n}\n\nexport default PasteError;\n"],"mappings":";;;AAAA,OAAO,MAAMA,UAAU,SAASC,KAAK,CAAC;EAAA;IAAA;IAAA,sCACrB,IAAI;EAAA;AACrB;AAEA,eAAeD,UAAU"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import AssertionError from "./AssertionError.js";
|
|
2
|
+
export function assertIsDefined(val) {
|
|
3
|
+
if (val === undefined || val === null) {
|
|
4
|
+
throw new AssertionError("Expected 'val' to be defined, but received ".concat(val));
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export default assertIsDefined;
|
|
8
|
+
//# sourceMappingURL=assertIsDefined.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertIsDefined.js","names":["AssertionError","assertIsDefined","val","undefined"],"sources":["../../src/errors/assertIsDefined.ts"],"sourcesContent":["import AssertionError from './AssertionError';\n\nexport function assertIsDefined<T>(val: T): asserts val is NonNullable<T> {\n if (val === undefined || val === null) {\n throw new AssertionError(\n `Expected 'val' to be defined, but received ${val}`\n );\n }\n}\n\nexport default assertIsDefined;\n"],"mappings":"OAAOA,cAAc;AAErB,OAAO,SAASC,eAAe,CAAIC,GAAM,EAAiC;EACxE,IAAIA,GAAG,KAAKC,SAAS,IAAID,GAAG,KAAK,IAAI,EAAE;IACrC,MAAM,IAAIF,cAAc,sDACwBE,GAAG,EAClD;EACH;AACF;AAEA,eAAeD,eAAe"}
|