@deephaven/iris-grid 0.11.2 → 0.11.3-beta.3
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/AdvancedFilterCreator.d.ts +1 -1
- package/dist/AdvancedFilterCreator.d.ts.map +1 -1
- package/dist/IrisGrid.css +3 -0
- package/dist/IrisGrid.css.map +1 -1
- package/dist/IrisGrid.d.ts +2 -0
- package/dist/IrisGrid.d.ts.map +1 -1
- package/dist/IrisGrid.js +53 -7
- package/dist/IrisGrid.js.map +1 -1
- package/dist/IrisGridCellOverflowModal.css +16 -0
- package/dist/IrisGridCellOverflowModal.css.map +1 -0
- package/dist/IrisGridCellOverflowModal.d.ts +10 -0
- package/dist/IrisGridCellOverflowModal.d.ts.map +1 -0
- package/dist/IrisGridCellOverflowModal.js +167 -0
- package/dist/IrisGridCellOverflowModal.js.map +1 -0
- package/dist/IrisGridRenderer.d.ts +19 -1
- package/dist/IrisGridRenderer.d.ts.map +1 -1
- package/dist/IrisGridRenderer.js +172 -9
- package/dist/IrisGridRenderer.js.map +1 -1
- package/dist/IrisGridTableModel.js +2 -2
- package/dist/IrisGridTheme.d.ts.map +1 -1
- package/dist/IrisGridTheme.js +5 -2
- package/dist/IrisGridTheme.js.map +1 -1
- package/dist/IrisGridTheme.module.css +3 -0
- package/dist/IrisGridTheme.module.css.map +1 -1
- package/dist/IrisGridTreeTableModel.js +2 -2
- package/dist/IrisGridUtils.js +2 -2
- package/dist/PendingDataBottomBar.d.ts +1 -0
- package/dist/PendingDataBottomBar.d.ts.map +1 -1
- package/dist/TableUtils.d.ts +1 -0
- package/dist/TableUtils.d.ts.map +1 -1
- package/dist/TableUtils.js +5 -3
- package/dist/TableUtils.js.map +1 -1
- package/dist/filters/FilterOperator.d.ts +2 -6
- package/dist/filters/FilterOperator.d.ts.map +1 -1
- package/dist/filters/FilterOperator.js +1 -9
- package/dist/filters/FilterOperator.js.map +1 -1
- package/dist/filters/FilterType.d.ts +2 -25
- package/dist/filters/FilterType.d.ts.map +1 -1
- package/dist/filters/FilterType.js +1 -46
- package/dist/filters/FilterType.js.map +1 -1
- package/dist/mousehandlers/IrisGridCellOverflowMouseHandler.d.ts +21 -0
- package/dist/mousehandlers/IrisGridCellOverflowMouseHandler.d.ts.map +1 -0
- package/dist/mousehandlers/IrisGridCellOverflowMouseHandler.js +199 -0
- package/dist/mousehandlers/IrisGridCellOverflowMouseHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridContextMenuHandler.js +2 -2
- package/dist/mousehandlers/index.d.ts +1 -0
- package/dist/mousehandlers/index.d.ts.map +1 -1
- package/dist/mousehandlers/index.js +1 -0
- package/dist/mousehandlers/index.js.map +1 -1
- package/dist/sidebar/AdvancedSettingsMenu.d.ts +1 -0
- package/dist/sidebar/AdvancedSettingsMenu.d.ts.map +1 -1
- package/dist/sidebar/CustomColumnBuilder.js +2 -2
- package/dist/sidebar/InputEditor.js +2 -2
- package/dist/sidebar/aggregations/AggregationEdit.d.ts +1 -0
- package/dist/sidebar/aggregations/AggregationEdit.d.ts.map +1 -1
- package/dist/sidebar/aggregations/AggregationEdit.js +2 -2
- package/dist/sidebar/aggregations/Aggregations.d.ts +1 -0
- package/dist/sidebar/aggregations/Aggregations.d.ts.map +1 -1
- package/dist/sidebar/aggregations/Aggregations.js +2 -2
- package/dist/sidebar/conditional-formatting/ColumnFormatEditor.d.ts +1 -0
- package/dist/sidebar/conditional-formatting/ColumnFormatEditor.d.ts.map +1 -1
- package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js +2 -2
- package/dist/sidebar/conditional-formatting/ConditionEditor.d.ts +1 -0
- package/dist/sidebar/conditional-formatting/ConditionEditor.d.ts.map +1 -1
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.d.ts +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.d.ts.map +1 -1
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.d.ts +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.d.ts.map +1 -1
- package/dist/sidebar/conditional-formatting/RowFormatEditor.d.ts +1 -0
- package/dist/sidebar/conditional-formatting/RowFormatEditor.d.ts.map +1 -1
- package/dist/sidebar/conditional-formatting/RowFormatEditor.js +2 -2
- package/dist/sidebar/conditional-formatting/StyleEditor.d.ts +1 -0
- package/dist/sidebar/conditional-formatting/StyleEditor.d.ts.map +1 -1
- package/package.json +21 -18
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
.cell-overflow-modal .modal-title {
|
|
2
|
+
width: 100%;
|
|
3
|
+
display: flex;
|
|
4
|
+
align-items: center;
|
|
5
|
+
gap: 0.5rem;
|
|
6
|
+
}
|
|
7
|
+
.cell-overflow-modal .modal-title .overflow-modal-title {
|
|
8
|
+
margin: 0;
|
|
9
|
+
flex-grow: 1;
|
|
10
|
+
}
|
|
11
|
+
.cell-overflow-modal .modal-body {
|
|
12
|
+
max-height: 80vh;
|
|
13
|
+
flex-shrink: 1;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/*# sourceMappingURL=IrisGridCellOverflowModal.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../src/IrisGridCellOverflowModal.scss"],"names":[],"mappings":"AAGE;EAEE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAIJ;EACE;EACA","file":"IrisGridCellOverflowModal.css"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import './IrisGridCellOverflowModal.scss';
|
|
3
|
+
interface IrisGridCellOverflowModalProps {
|
|
4
|
+
text: string;
|
|
5
|
+
isOpen: boolean;
|
|
6
|
+
onClose: () => void;
|
|
7
|
+
}
|
|
8
|
+
export default function IrisGridCellOverflowModal({ text, isOpen, onClose, }: IrisGridCellOverflowModalProps): React.ReactNode;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=IrisGridCellOverflowModal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IrisGridCellOverflowModal.d.ts","sourceRoot":"","sources":["../src/IrisGridCellOverflowModal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAM3D,OAAO,kCAAkC,CAAC;AAE1C,UAAU,8BAA8B;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAAC,EAChD,IAAI,EACJ,MAAM,EACN,OAAO,GACR,EAAE,8BAA8B,GAAG,KAAK,CAAC,SAAS,CAiJlD"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import React, { useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { Editor } from '@deephaven/console';
|
|
3
|
+
import { Modal, ModalBody, ModalHeader } from 'reactstrap';
|
|
4
|
+
import { Button } from '@deephaven/components';
|
|
5
|
+
import { vsJson, vsListOrdered } from '@deephaven/icons';
|
|
6
|
+
import "./IrisGridCellOverflowModal.css";
|
|
7
|
+
export default function IrisGridCellOverflowModal(_ref) {
|
|
8
|
+
var {
|
|
9
|
+
text,
|
|
10
|
+
isOpen,
|
|
11
|
+
onClose
|
|
12
|
+
} = _ref;
|
|
13
|
+
var [isOpened, setIsOpened] = useState(false);
|
|
14
|
+
var [height, setHeight] = useState(0);
|
|
15
|
+
var [showLineNumbers, setShowLineNumbers] = useState(false);
|
|
16
|
+
var [isFormatted, setIsFormatted] = useState(false);
|
|
17
|
+
var [canFormat, setCanFormat] = useState(false);
|
|
18
|
+
var editorRef = useRef(); // Update format button on open
|
|
19
|
+
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (!isOpen) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
JSON.parse(text);
|
|
27
|
+
setCanFormat(true);
|
|
28
|
+
} catch (_unused) {
|
|
29
|
+
setCanFormat(false);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
setIsFormatted(false);
|
|
33
|
+
}, [isOpen, text]); // Re-layout editor on height change
|
|
34
|
+
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
if (editorRef.current) {
|
|
37
|
+
editorRef.current.layout();
|
|
38
|
+
}
|
|
39
|
+
}, [height]); // Update editor options on line number toggle
|
|
40
|
+
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
if (editorRef.current) {
|
|
43
|
+
editorRef.current.updateOptions({
|
|
44
|
+
lineNumbers: showLineNumbers ? 'on' : 'off'
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}, [showLineNumbers]);
|
|
48
|
+
|
|
49
|
+
function toggleLineNumbers() {
|
|
50
|
+
setShowLineNumbers(!showLineNumbers);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function formatAsJSON() {
|
|
54
|
+
var _editorRef$current;
|
|
55
|
+
|
|
56
|
+
var model = (_editorRef$current = editorRef.current) === null || _editorRef$current === void 0 ? void 0 : _editorRef$current.getModel();
|
|
57
|
+
|
|
58
|
+
if (!canFormat || !model) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (!isFormatted) {
|
|
63
|
+
model.setValue(JSON.stringify(JSON.parse(text), undefined, 2));
|
|
64
|
+
setIsFormatted(true);
|
|
65
|
+
} else {
|
|
66
|
+
model.setValue(text);
|
|
67
|
+
setIsFormatted(false);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
autoSetLineNumbers();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function autoSetLineNumbers() {
|
|
74
|
+
var _editor$getModel$getL, _editor$getModel;
|
|
75
|
+
|
|
76
|
+
var editor = editorRef.current;
|
|
77
|
+
|
|
78
|
+
if (!editor) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
setShowLineNumbers(((_editor$getModel$getL = (_editor$getModel = editor.getModel()) === null || _editor$getModel === void 0 ? void 0 : _editor$getModel.getLineCount()) !== null && _editor$getModel$getL !== void 0 ? _editor$getModel$getL : 0) > 1);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function handleToggle() {
|
|
86
|
+
if (isOpened) {
|
|
87
|
+
editorRef.current = undefined;
|
|
88
|
+
onClose();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function onEditorInitialized(editor) {
|
|
93
|
+
editorRef.current = editor;
|
|
94
|
+
editor.onDidContentSizeChange(_ref2 => {
|
|
95
|
+
var {
|
|
96
|
+
contentHeight
|
|
97
|
+
} = _ref2;
|
|
98
|
+
return setHeight(contentHeight);
|
|
99
|
+
});
|
|
100
|
+
autoSetLineNumbers();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (!isOpen && !isOpened) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return /*#__PURE__*/React.createElement(Modal, {
|
|
108
|
+
isOpen: isOpen,
|
|
109
|
+
centered: true,
|
|
110
|
+
keyboard: true,
|
|
111
|
+
toggle: handleToggle,
|
|
112
|
+
onOpened: () => setIsOpened(true),
|
|
113
|
+
onClosed: () => {
|
|
114
|
+
setIsOpened(false);
|
|
115
|
+
setHeight(0);
|
|
116
|
+
},
|
|
117
|
+
size: "xl",
|
|
118
|
+
className: "theme-bg-dark cell-overflow-modal"
|
|
119
|
+
}, /*#__PURE__*/React.createElement(ModalHeader, {
|
|
120
|
+
tag: "div",
|
|
121
|
+
toggle: onClose
|
|
122
|
+
}, /*#__PURE__*/React.createElement("h5", {
|
|
123
|
+
className: "overflow-modal-title"
|
|
124
|
+
}, "Cell Contents"), /*#__PURE__*/React.createElement(Button, {
|
|
125
|
+
kind: "inline",
|
|
126
|
+
active: showLineNumbers,
|
|
127
|
+
icon: vsListOrdered,
|
|
128
|
+
tooltip: "Toggle line numbers",
|
|
129
|
+
onClick: toggleLineNumbers
|
|
130
|
+
}), canFormat && /*#__PURE__*/React.createElement(Button, {
|
|
131
|
+
kind: "inline",
|
|
132
|
+
icon: vsJson,
|
|
133
|
+
active: isFormatted,
|
|
134
|
+
tooltip: "Format as JSON",
|
|
135
|
+
onClick: formatAsJSON
|
|
136
|
+
})), /*#__PURE__*/React.createElement(ModalBody, {
|
|
137
|
+
style: {
|
|
138
|
+
height
|
|
139
|
+
}
|
|
140
|
+
}, /*#__PURE__*/React.createElement(Editor, {
|
|
141
|
+
onEditorInitialized: onEditorInitialized,
|
|
142
|
+
settings: {
|
|
143
|
+
value: text,
|
|
144
|
+
readOnly: true,
|
|
145
|
+
wordWrap: 'on',
|
|
146
|
+
// Loading json language w/o the monaco workers causes UI freezes and monaco errors. TS colorizes the same
|
|
147
|
+
language: canFormat ? 'typescript' : 'plaintext',
|
|
148
|
+
folding: canFormat,
|
|
149
|
+
padding: {
|
|
150
|
+
bottom: 16
|
|
151
|
+
},
|
|
152
|
+
lineNumbers: showLineNumbers ? 'on' : 'off',
|
|
153
|
+
overviewRulerLanes: 0,
|
|
154
|
+
renderLineHighlight: 'none',
|
|
155
|
+
|
|
156
|
+
/*
|
|
157
|
+
The entire string may be 1 giant line
|
|
158
|
+
Monaco by default seeds find w/ that line
|
|
159
|
+
On very long strings this hangs the browser, so never seed the search
|
|
160
|
+
*/
|
|
161
|
+
find: {
|
|
162
|
+
seedSearchStringFromSelection: 'never'
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
})));
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=IrisGridCellOverflowModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/IrisGridCellOverflowModal.tsx"],"names":["React","useEffect","useRef","useState","Editor","Modal","ModalBody","ModalHeader","Button","vsJson","vsListOrdered","IrisGridCellOverflowModal","text","isOpen","onClose","isOpened","setIsOpened","height","setHeight","showLineNumbers","setShowLineNumbers","isFormatted","setIsFormatted","canFormat","setCanFormat","editorRef","JSON","parse","current","layout","updateOptions","lineNumbers","toggleLineNumbers","formatAsJSON","model","getModel","setValue","stringify","undefined","autoSetLineNumbers","editor","getLineCount","handleToggle","onEditorInitialized","onDidContentSizeChange","contentHeight","value","readOnly","wordWrap","language","folding","padding","bottom","overviewRulerLanes","renderLineHighlight","find","seedSearchStringFromSelection"],"mappings":"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","sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport { Editor } from '@deephaven/console';\nimport { Modal, ModalBody, ModalHeader } from 'reactstrap';\nimport * as monaco from 'monaco-editor';\nimport { Button } from '@deephaven/components';\nimport { vsJson, vsListOrdered } from '@deephaven/icons';\nimport './IrisGridCellOverflowModal.scss';\n\ninterface IrisGridCellOverflowModalProps {\n text: string;\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport default function IrisGridCellOverflowModal({\n text,\n isOpen,\n onClose,\n}: IrisGridCellOverflowModalProps): React.ReactNode {\n const [isOpened, setIsOpened] = useState(false);\n const [height, setHeight] = useState(0);\n const [showLineNumbers, setShowLineNumbers] = useState(false);\n const [isFormatted, setIsFormatted] = useState(false);\n const [canFormat, setCanFormat] = useState(false);\n const editorRef = useRef<monaco.editor.IStandaloneCodeEditor>();\n\n // Update format button on open\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n try {\n JSON.parse(text);\n setCanFormat(true);\n } catch {\n setCanFormat(false);\n }\n setIsFormatted(false);\n }, [isOpen, text]);\n\n // Re-layout editor on height change\n useEffect(() => {\n if (editorRef.current) {\n editorRef.current.layout();\n }\n }, [height]);\n\n // Update editor options on line number toggle\n useEffect(() => {\n if (editorRef.current) {\n editorRef.current.updateOptions({\n lineNumbers: showLineNumbers ? 'on' : 'off',\n });\n }\n }, [showLineNumbers]);\n\n function toggleLineNumbers() {\n setShowLineNumbers(!showLineNumbers);\n }\n\n function formatAsJSON() {\n const model = editorRef.current?.getModel();\n if (!canFormat || !model) {\n return;\n }\n\n if (!isFormatted) {\n model.setValue(JSON.stringify(JSON.parse(text), undefined, 2));\n setIsFormatted(true);\n } else {\n model.setValue(text);\n setIsFormatted(false);\n }\n autoSetLineNumbers();\n }\n\n function autoSetLineNumbers() {\n const editor = editorRef.current;\n if (!editor) {\n return;\n }\n\n setShowLineNumbers((editor.getModel()?.getLineCount() ?? 0) > 1);\n }\n\n function handleToggle() {\n if (isOpened) {\n editorRef.current = undefined;\n onClose();\n }\n }\n\n function onEditorInitialized(editor: monaco.editor.IStandaloneCodeEditor) {\n editorRef.current = editor;\n editor.onDidContentSizeChange(({ contentHeight }) =>\n setHeight(contentHeight)\n );\n autoSetLineNumbers();\n }\n\n if (!isOpen && !isOpened) {\n return null;\n }\n\n return (\n <Modal\n isOpen={isOpen}\n centered\n keyboard\n toggle={handleToggle}\n onOpened={() => setIsOpened(true)}\n onClosed={() => {\n setIsOpened(false);\n setHeight(0);\n }}\n size=\"xl\"\n className=\"theme-bg-dark cell-overflow-modal\"\n >\n <ModalHeader tag=\"div\" toggle={onClose}>\n <h5 className=\"overflow-modal-title\">Cell Contents</h5>\n <Button\n kind=\"inline\"\n active={showLineNumbers}\n icon={vsListOrdered}\n tooltip=\"Toggle line numbers\"\n onClick={toggleLineNumbers}\n />\n {canFormat && (\n <Button\n kind=\"inline\"\n icon={vsJson}\n active={isFormatted}\n tooltip=\"Format as JSON\"\n onClick={formatAsJSON}\n />\n )}\n </ModalHeader>\n <ModalBody style={{ height }}>\n <Editor\n onEditorInitialized={onEditorInitialized}\n settings={{\n value: text,\n readOnly: true,\n wordWrap: 'on',\n // Loading json language w/o the monaco workers causes UI freezes and monaco errors. TS colorizes the same\n language: canFormat ? 'typescript' : 'plaintext',\n folding: canFormat,\n padding: { bottom: 16 },\n lineNumbers: showLineNumbers ? 'on' : 'off',\n overviewRulerLanes: 0,\n renderLineHighlight: 'none',\n /*\n The entire string may be 1 giant line\n Monaco by default seeds find w/ that line\n On very long strings this hangs the browser, so never seed the search\n */\n find: { seedSearchStringFromSelection: 'never' },\n }}\n />\n </ModalBody>\n </Modal>\n );\n}\n"],"file":"IrisGridCellOverflowModal.js"}
|
|
@@ -8,7 +8,7 @@ declare class IrisGridRenderer extends GridRenderer {
|
|
|
8
8
|
icons: {} | undefined;
|
|
9
9
|
setIcon(name: any, faIcon: any): void;
|
|
10
10
|
getIcon(name: any): any;
|
|
11
|
-
getSortIcon(sort: any):
|
|
11
|
+
getSortIcon(sort: any): any;
|
|
12
12
|
drawGroupedColumnLine(context: any, state: any): void;
|
|
13
13
|
drawPendingRowLine(context: any, state: any): void;
|
|
14
14
|
drawScrim(state: any): void;
|
|
@@ -18,6 +18,24 @@ declare class IrisGridRenderer extends GridRenderer {
|
|
|
18
18
|
drawExpandedFilterHeader(context: any, state: any, column: any, columnX: any, columnWidth: any): void;
|
|
19
19
|
drawCollapsedFilterHeaders(context: any, state: any): void;
|
|
20
20
|
drawCollapsedFilterHeader(context: any, state: any, column: any, columnX: any, columnWidth: any): void;
|
|
21
|
+
shouldRenderOverflowButton(state: any): boolean;
|
|
22
|
+
getCellOverflowButtonPosition({ mouseX, mouseY, metrics, theme }: {
|
|
23
|
+
mouseX: any;
|
|
24
|
+
mouseY: any;
|
|
25
|
+
metrics: any;
|
|
26
|
+
theme: any;
|
|
27
|
+
}): {
|
|
28
|
+
left: null;
|
|
29
|
+
top: null;
|
|
30
|
+
width: null;
|
|
31
|
+
height: null;
|
|
32
|
+
} | {
|
|
33
|
+
left: number;
|
|
34
|
+
top: any;
|
|
35
|
+
width: number;
|
|
36
|
+
height: number | null;
|
|
37
|
+
};
|
|
38
|
+
drawCellOverflowButton(state: any): void;
|
|
21
39
|
}
|
|
22
40
|
import { GridRenderer } from "packages/grid/src/GridRenderer";
|
|
23
41
|
//# sourceMappingURL=IrisGridRenderer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IrisGridRenderer.d.ts","sourceRoot":"","sources":["../src/IrisGridRenderer.js"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"IrisGridRenderer.d.ts","sourceRoot":"","sources":["../src/IrisGridRenderer.js"],"names":[],"mappings":";AAuBA;;KAEK;AACL;IACE,qEAMC;IAQD,kBAQC;IAPC,sBAAe;IAUjB,sCASC;IAED,wBAEC;IAED,4BAWC;IAoCD,sDA0BC;IAED,mDAyBC;IAwBD,4BA8BC;IAgDD,8FAwBC;IAgDD,kDAWC;IAED,0DAsEC;IAED,sGAuFC;IAED,2DAiCC;IAED,uGAwCC;IAqID,gDA4CC;IAED;;;;;;;;;;;;;;;MAyBC;IAED,yCAqCC;CACF"}
|
package/dist/IrisGridRenderer.js
CHANGED
|
@@ -3,16 +3,17 @@
|
|
|
3
3
|
/* eslint class-methods-use-this: "off" */
|
|
4
4
|
|
|
5
5
|
/* eslint no-param-reassign: "off" */
|
|
6
|
-
import { dhSortDown, dhSortUp, vsTriangleDown, vsTriangleRight } from '@deephaven/icons';
|
|
6
|
+
import { dhSortDown, dhSortUp, vsTriangleDown, vsTriangleRight, vsLinkExternal } from '@deephaven/icons';
|
|
7
7
|
import { GridRenderer, GridUtils } from '@deephaven/grid';
|
|
8
8
|
import TableUtils from "./TableUtils.js";
|
|
9
9
|
var ICON_NAMES = Object.freeze({
|
|
10
10
|
SORT_UP: 'sortUp',
|
|
11
11
|
SORT_DOWN: 'sortDown',
|
|
12
12
|
CARET_DOWN: 'caretDown',
|
|
13
|
-
CARET_RIGHT: 'caretRight'
|
|
13
|
+
CARET_RIGHT: 'caretRight',
|
|
14
|
+
CELL_OVERFLOW: 'cellOverflow'
|
|
14
15
|
});
|
|
15
|
-
var
|
|
16
|
+
var ICON_SIZE = 16;
|
|
16
17
|
/**
|
|
17
18
|
* Handles rendering some of the Iris specific features, such as sorting icons, sort bar display
|
|
18
19
|
* */
|
|
@@ -35,10 +36,19 @@ class IrisGridRenderer extends GridRenderer {
|
|
|
35
36
|
this.setIcon(ICON_NAMES.SORT_DOWN, dhSortDown);
|
|
36
37
|
this.setIcon(ICON_NAMES.CARET_DOWN, vsTriangleDown);
|
|
37
38
|
this.setIcon(ICON_NAMES.CARET_RIGHT, vsTriangleRight);
|
|
38
|
-
|
|
39
|
+
this.setIcon(ICON_NAMES.CELL_OVERFLOW, vsLinkExternal);
|
|
40
|
+
} // Scales the icon to be square and match the global ICON_SIZE
|
|
41
|
+
|
|
39
42
|
|
|
40
43
|
setIcon(name, faIcon) {
|
|
41
|
-
|
|
44
|
+
var icon = new Path2D(faIcon.icon[4]);
|
|
45
|
+
var scaledIcon = new Path2D();
|
|
46
|
+
var scaleMatrix = {
|
|
47
|
+
a: ICON_SIZE / faIcon.icon[0],
|
|
48
|
+
d: ICON_SIZE / faIcon.icon[1]
|
|
49
|
+
};
|
|
50
|
+
scaledIcon.addPath(icon, scaleMatrix);
|
|
51
|
+
this.icons[name] = scaledIcon;
|
|
42
52
|
}
|
|
43
53
|
|
|
44
54
|
getIcon(name) {
|
|
@@ -51,11 +61,11 @@ class IrisGridRenderer extends GridRenderer {
|
|
|
51
61
|
}
|
|
52
62
|
|
|
53
63
|
if (sort.direction === TableUtils.sortDirection.ascending) {
|
|
54
|
-
return
|
|
64
|
+
return this.getIcon(ICON_NAMES.SORT_UP);
|
|
55
65
|
}
|
|
56
66
|
|
|
57
67
|
if (sort.direction === TableUtils.sortDirection.descending) {
|
|
58
|
-
return
|
|
68
|
+
return this.getIcon(ICON_NAMES.SORT_DOWN);
|
|
59
69
|
}
|
|
60
70
|
|
|
61
71
|
return null;
|
|
@@ -63,6 +73,7 @@ class IrisGridRenderer extends GridRenderer {
|
|
|
63
73
|
|
|
64
74
|
drawCanvas(state) {
|
|
65
75
|
super.drawCanvas(state);
|
|
76
|
+
this.drawCellOverflowButton(state);
|
|
66
77
|
this.drawScrim(state);
|
|
67
78
|
}
|
|
68
79
|
|
|
@@ -340,7 +351,6 @@ class IrisGridRenderer extends GridRenderer {
|
|
|
340
351
|
context.fillRect(gradientX, 0, gradientWidth, columnHeaderHeight);
|
|
341
352
|
context.fillStyle = theme.headerSortBarColor;
|
|
342
353
|
context.translate(x, y);
|
|
343
|
-
context.scale(ICON_SCALE, ICON_SCALE);
|
|
344
354
|
context.fill(icon);
|
|
345
355
|
context.restore();
|
|
346
356
|
}
|
|
@@ -639,7 +649,6 @@ class IrisGridRenderer extends GridRenderer {
|
|
|
639
649
|
context.fillStyle = color;
|
|
640
650
|
context.textAlign = 'center';
|
|
641
651
|
context.translate(iconX, iconY);
|
|
642
|
-
context.scale(ICON_SCALE, ICON_SCALE);
|
|
643
652
|
context.fill(markerIcon);
|
|
644
653
|
context.restore();
|
|
645
654
|
}
|
|
@@ -735,6 +744,160 @@ class IrisGridRenderer extends GridRenderer {
|
|
|
735
744
|
}
|
|
736
745
|
|
|
737
746
|
context.translate(-gridX, -gridY);
|
|
747
|
+
} // This will shrink the size the text may take when the overflow button is rendered
|
|
748
|
+
// The text will truncate to a smaller width and won't overlap the button
|
|
749
|
+
|
|
750
|
+
|
|
751
|
+
getTextRenderMetrics(context, state, column, row) {
|
|
752
|
+
var textMetrics = super.getTextRenderMetrics(context, state, column, row);
|
|
753
|
+
var {
|
|
754
|
+
mouseX,
|
|
755
|
+
mouseY,
|
|
756
|
+
metrics
|
|
757
|
+
} = state;
|
|
758
|
+
|
|
759
|
+
if (mouseX == null || mouseY == null) {
|
|
760
|
+
return textMetrics;
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
var {
|
|
764
|
+
column: mouseColumn,
|
|
765
|
+
row: mouseRow
|
|
766
|
+
} = GridUtils.getGridPointFromXY(mouseX, mouseY, metrics);
|
|
767
|
+
|
|
768
|
+
if (column === mouseColumn && row === mouseRow) {
|
|
769
|
+
var {
|
|
770
|
+
left
|
|
771
|
+
} = this.getCellOverflowButtonPosition(state);
|
|
772
|
+
|
|
773
|
+
if (this.shouldRenderOverflowButton(state)) {
|
|
774
|
+
textMetrics.width = left - textMetrics.x;
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
return textMetrics;
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
shouldRenderOverflowButton(state) {
|
|
782
|
+
var _model$textForCell, _metrics$fontWidths$g;
|
|
783
|
+
|
|
784
|
+
var {
|
|
785
|
+
context,
|
|
786
|
+
mouseX,
|
|
787
|
+
mouseY,
|
|
788
|
+
metrics,
|
|
789
|
+
model,
|
|
790
|
+
theme
|
|
791
|
+
} = state;
|
|
792
|
+
|
|
793
|
+
if (mouseX == null || mouseY == null) {
|
|
794
|
+
return false;
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
var {
|
|
798
|
+
row,
|
|
799
|
+
column,
|
|
800
|
+
modelRow,
|
|
801
|
+
modelColumn
|
|
802
|
+
} = GridUtils.getCellInfoFromXY(mouseX, mouseY, metrics);
|
|
803
|
+
|
|
804
|
+
if (row == null || column == null || modelRow == null || modelColumn == null || !TableUtils.isStringType(model.columns[modelColumn].type)) {
|
|
805
|
+
return false;
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
var text = (_model$textForCell = model.textForCell(modelColumn, modelRow)) !== null && _model$textForCell !== void 0 ? _model$textForCell : '';
|
|
809
|
+
var {
|
|
810
|
+
width: textWidth
|
|
811
|
+
} = super.getTextRenderMetrics(context, state, column, row);
|
|
812
|
+
var fontWidth = (_metrics$fontWidths$g = metrics.fontWidths.get(theme.font)) !== null && _metrics$fontWidths$g !== void 0 ? _metrics$fontWidths$g : IrisGridRenderer.DEFAULT_FONT_WIDTH;
|
|
813
|
+
context.save();
|
|
814
|
+
context.font = theme.font;
|
|
815
|
+
var truncatedText = this.getCachedTruncatedString(context, text, textWidth, fontWidth);
|
|
816
|
+
context.restore();
|
|
817
|
+
return text !== '' && truncatedText !== text;
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
getCellOverflowButtonPosition(_ref) {
|
|
821
|
+
var {
|
|
822
|
+
mouseX,
|
|
823
|
+
mouseY,
|
|
824
|
+
metrics,
|
|
825
|
+
theme
|
|
826
|
+
} = _ref;
|
|
827
|
+
var NULL_POSITION = {
|
|
828
|
+
left: null,
|
|
829
|
+
top: null,
|
|
830
|
+
width: null,
|
|
831
|
+
height: null
|
|
832
|
+
};
|
|
833
|
+
|
|
834
|
+
if (mouseX == null || mouseY == null) {
|
|
835
|
+
return NULL_POSITION;
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
var {
|
|
839
|
+
rowHeight,
|
|
840
|
+
columnWidth,
|
|
841
|
+
left,
|
|
842
|
+
top
|
|
843
|
+
} = GridUtils.getCellInfoFromXY(mouseX, mouseY, metrics);
|
|
844
|
+
var {
|
|
845
|
+
width: gridWidth,
|
|
846
|
+
verticalBarWidth
|
|
847
|
+
} = metrics;
|
|
848
|
+
var {
|
|
849
|
+
cellHorizontalPadding
|
|
850
|
+
} = theme;
|
|
851
|
+
var width = ICON_SIZE + 2 * cellHorizontalPadding;
|
|
852
|
+
var height = rowHeight; // Right edge of column or of visible grid, whichever is smaller
|
|
853
|
+
|
|
854
|
+
var right = Math.min(metrics.gridX + left + columnWidth, gridWidth - verticalBarWidth);
|
|
855
|
+
var buttonLeft = right - width;
|
|
856
|
+
var buttonTop = metrics.gridY + top;
|
|
857
|
+
return {
|
|
858
|
+
left: buttonLeft,
|
|
859
|
+
top: buttonTop,
|
|
860
|
+
width,
|
|
861
|
+
height
|
|
862
|
+
};
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
drawCellOverflowButton(state) {
|
|
866
|
+
var {
|
|
867
|
+
context,
|
|
868
|
+
mouseX,
|
|
869
|
+
mouseY,
|
|
870
|
+
theme
|
|
871
|
+
} = state;
|
|
872
|
+
if (mouseX == null || mouseY == null) return;
|
|
873
|
+
|
|
874
|
+
if (!this.shouldRenderOverflowButton(state)) {
|
|
875
|
+
return;
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
var {
|
|
879
|
+
left: buttonLeft,
|
|
880
|
+
top: buttonTop,
|
|
881
|
+
width: buttonWidth,
|
|
882
|
+
height: buttonHeight
|
|
883
|
+
} = this.getCellOverflowButtonPosition(state);
|
|
884
|
+
var {
|
|
885
|
+
cellHorizontalPadding,
|
|
886
|
+
overflowButtonColor,
|
|
887
|
+
overflowButtonHoverColor
|
|
888
|
+
} = theme;
|
|
889
|
+
context.save();
|
|
890
|
+
|
|
891
|
+
if (mouseX >= buttonLeft && mouseX <= buttonLeft + buttonWidth && mouseY >= buttonTop && mouseY <= buttonTop + buttonHeight) {
|
|
892
|
+
context.fillStyle = overflowButtonHoverColor;
|
|
893
|
+
} else {
|
|
894
|
+
context.fillStyle = overflowButtonColor;
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
var icon = this.getIcon(ICON_NAMES.CELL_OVERFLOW);
|
|
898
|
+
context.translate(buttonLeft + cellHorizontalPadding, buttonTop + 2);
|
|
899
|
+
context.fill(icon);
|
|
900
|
+
context.restore();
|
|
738
901
|
}
|
|
739
902
|
|
|
740
903
|
}
|