@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.
Files changed (74) hide show
  1. package/dist/AdvancedFilterCreator.d.ts +1 -1
  2. package/dist/AdvancedFilterCreator.d.ts.map +1 -1
  3. package/dist/IrisGrid.css +3 -0
  4. package/dist/IrisGrid.css.map +1 -1
  5. package/dist/IrisGrid.d.ts +2 -0
  6. package/dist/IrisGrid.d.ts.map +1 -1
  7. package/dist/IrisGrid.js +53 -7
  8. package/dist/IrisGrid.js.map +1 -1
  9. package/dist/IrisGridCellOverflowModal.css +16 -0
  10. package/dist/IrisGridCellOverflowModal.css.map +1 -0
  11. package/dist/IrisGridCellOverflowModal.d.ts +10 -0
  12. package/dist/IrisGridCellOverflowModal.d.ts.map +1 -0
  13. package/dist/IrisGridCellOverflowModal.js +167 -0
  14. package/dist/IrisGridCellOverflowModal.js.map +1 -0
  15. package/dist/IrisGridRenderer.d.ts +19 -1
  16. package/dist/IrisGridRenderer.d.ts.map +1 -1
  17. package/dist/IrisGridRenderer.js +172 -9
  18. package/dist/IrisGridRenderer.js.map +1 -1
  19. package/dist/IrisGridTableModel.js +2 -2
  20. package/dist/IrisGridTheme.d.ts.map +1 -1
  21. package/dist/IrisGridTheme.js +5 -2
  22. package/dist/IrisGridTheme.js.map +1 -1
  23. package/dist/IrisGridTheme.module.css +3 -0
  24. package/dist/IrisGridTheme.module.css.map +1 -1
  25. package/dist/IrisGridTreeTableModel.js +2 -2
  26. package/dist/IrisGridUtils.js +2 -2
  27. package/dist/PendingDataBottomBar.d.ts +1 -0
  28. package/dist/PendingDataBottomBar.d.ts.map +1 -1
  29. package/dist/TableUtils.d.ts +1 -0
  30. package/dist/TableUtils.d.ts.map +1 -1
  31. package/dist/TableUtils.js +5 -3
  32. package/dist/TableUtils.js.map +1 -1
  33. package/dist/filters/FilterOperator.d.ts +2 -6
  34. package/dist/filters/FilterOperator.d.ts.map +1 -1
  35. package/dist/filters/FilterOperator.js +1 -9
  36. package/dist/filters/FilterOperator.js.map +1 -1
  37. package/dist/filters/FilterType.d.ts +2 -25
  38. package/dist/filters/FilterType.d.ts.map +1 -1
  39. package/dist/filters/FilterType.js +1 -46
  40. package/dist/filters/FilterType.js.map +1 -1
  41. package/dist/mousehandlers/IrisGridCellOverflowMouseHandler.d.ts +21 -0
  42. package/dist/mousehandlers/IrisGridCellOverflowMouseHandler.d.ts.map +1 -0
  43. package/dist/mousehandlers/IrisGridCellOverflowMouseHandler.js +199 -0
  44. package/dist/mousehandlers/IrisGridCellOverflowMouseHandler.js.map +1 -0
  45. package/dist/mousehandlers/IrisGridContextMenuHandler.js +2 -2
  46. package/dist/mousehandlers/index.d.ts +1 -0
  47. package/dist/mousehandlers/index.d.ts.map +1 -1
  48. package/dist/mousehandlers/index.js +1 -0
  49. package/dist/mousehandlers/index.js.map +1 -1
  50. package/dist/sidebar/AdvancedSettingsMenu.d.ts +1 -0
  51. package/dist/sidebar/AdvancedSettingsMenu.d.ts.map +1 -1
  52. package/dist/sidebar/CustomColumnBuilder.js +2 -2
  53. package/dist/sidebar/InputEditor.js +2 -2
  54. package/dist/sidebar/aggregations/AggregationEdit.d.ts +1 -0
  55. package/dist/sidebar/aggregations/AggregationEdit.d.ts.map +1 -1
  56. package/dist/sidebar/aggregations/AggregationEdit.js +2 -2
  57. package/dist/sidebar/aggregations/Aggregations.d.ts +1 -0
  58. package/dist/sidebar/aggregations/Aggregations.d.ts.map +1 -1
  59. package/dist/sidebar/aggregations/Aggregations.js +2 -2
  60. package/dist/sidebar/conditional-formatting/ColumnFormatEditor.d.ts +1 -0
  61. package/dist/sidebar/conditional-formatting/ColumnFormatEditor.d.ts.map +1 -1
  62. package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js +2 -2
  63. package/dist/sidebar/conditional-formatting/ConditionEditor.d.ts +1 -0
  64. package/dist/sidebar/conditional-formatting/ConditionEditor.d.ts.map +1 -1
  65. package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.d.ts +1 -0
  66. package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.d.ts.map +1 -1
  67. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.d.ts +1 -0
  68. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.d.ts.map +1 -1
  69. package/dist/sidebar/conditional-formatting/RowFormatEditor.d.ts +1 -0
  70. package/dist/sidebar/conditional-formatting/RowFormatEditor.d.ts.map +1 -1
  71. package/dist/sidebar/conditional-formatting/RowFormatEditor.js +2 -2
  72. package/dist/sidebar/conditional-formatting/StyleEditor.d.ts +1 -0
  73. package/dist/sidebar/conditional-formatting/StyleEditor.d.ts.map +1 -1
  74. 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":"AAAA,OAAOA,KAAP,IAAgBC,SAAhB,EAA2BC,MAA3B,EAAmCC,QAAnC,QAAmD,OAAnD;AACA,SAASC,MAAT,QAAuB,oBAAvB;AACA,SAASC,KAAT,EAAgBC,SAAhB,EAA2BC,WAA3B,QAA8C,YAA9C;AAEA,SAASC,MAAT,QAAuB,uBAAvB;AACA,SAASC,MAAT,EAAiBC,aAAjB,QAAsC,kBAAtC;;AASA,eAAe,SAASC,yBAAT,OAIqC;AAAA,MAJF;AAChDC,IAAAA,IADgD;AAEhDC,IAAAA,MAFgD;AAGhDC,IAAAA;AAHgD,GAIE;AAClD,MAAM,CAACC,QAAD,EAAWC,WAAX,IAA0Bb,QAAQ,CAAC,KAAD,CAAxC;AACA,MAAM,CAACc,MAAD,EAASC,SAAT,IAAsBf,QAAQ,CAAC,CAAD,CAApC;AACA,MAAM,CAACgB,eAAD,EAAkBC,kBAAlB,IAAwCjB,QAAQ,CAAC,KAAD,CAAtD;AACA,MAAM,CAACkB,WAAD,EAAcC,cAAd,IAAgCnB,QAAQ,CAAC,KAAD,CAA9C;AACA,MAAM,CAACoB,SAAD,EAAYC,YAAZ,IAA4BrB,QAAQ,CAAC,KAAD,CAA1C;AACA,MAAMsB,SAAS,GAAGvB,MAAM,EAAxB,CANkD,CAQlD;;AACAD,EAAAA,SAAS,CAAC,MAAM;AACd,QAAI,CAACY,MAAL,EAAa;AACX;AACD;;AAED,QAAI;AACFa,MAAAA,IAAI,CAACC,KAAL,CAAWf,IAAX;AACAY,MAAAA,YAAY,CAAC,IAAD,CAAZ;AACD,KAHD,CAGE,gBAAM;AACNA,MAAAA,YAAY,CAAC,KAAD,CAAZ;AACD;;AACDF,IAAAA,cAAc,CAAC,KAAD,CAAd;AACD,GAZQ,EAYN,CAACT,MAAD,EAASD,IAAT,CAZM,CAAT,CATkD,CAuBlD;;AACAX,EAAAA,SAAS,CAAC,MAAM;AACd,QAAIwB,SAAS,CAACG,OAAd,EAAuB;AACrBH,MAAAA,SAAS,CAACG,OAAV,CAAkBC,MAAlB;AACD;AACF,GAJQ,EAIN,CAACZ,MAAD,CAJM,CAAT,CAxBkD,CA8BlD;;AACAhB,EAAAA,SAAS,CAAC,MAAM;AACd,QAAIwB,SAAS,CAACG,OAAd,EAAuB;AACrBH,MAAAA,SAAS,CAACG,OAAV,CAAkBE,aAAlB,CAAgC;AAC9BC,QAAAA,WAAW,EAAEZ,eAAe,GAAG,IAAH,GAAU;AADR,OAAhC;AAGD;AACF,GANQ,EAMN,CAACA,eAAD,CANM,CAAT;;AAQA,WAASa,iBAAT,GAA6B;AAC3BZ,IAAAA,kBAAkB,CAAC,CAACD,eAAF,CAAlB;AACD;;AAED,WAASc,YAAT,GAAwB;AAAA;;AACtB,QAAMC,KAAK,yBAAGT,SAAS,CAACG,OAAb,uDAAG,mBAAmBO,QAAnB,EAAd;;AACA,QAAI,CAACZ,SAAD,IAAc,CAACW,KAAnB,EAA0B;AACxB;AACD;;AAED,QAAI,CAACb,WAAL,EAAkB;AAChBa,MAAAA,KAAK,CAACE,QAAN,CAAeV,IAAI,CAACW,SAAL,CAAeX,IAAI,CAACC,KAAL,CAAWf,IAAX,CAAf,EAAiC0B,SAAjC,EAA4C,CAA5C,CAAf;AACAhB,MAAAA,cAAc,CAAC,IAAD,CAAd;AACD,KAHD,MAGO;AACLY,MAAAA,KAAK,CAACE,QAAN,CAAexB,IAAf;AACAU,MAAAA,cAAc,CAAC,KAAD,CAAd;AACD;;AACDiB,IAAAA,kBAAkB;AACnB;;AAED,WAASA,kBAAT,GAA8B;AAAA;;AAC5B,QAAMC,MAAM,GAAGf,SAAS,CAACG,OAAzB;;AACA,QAAI,CAACY,MAAL,EAAa;AACX;AACD;;AAEDpB,IAAAA,kBAAkB,CAAC,8CAACoB,MAAM,CAACL,QAAP,EAAD,qDAAC,iBAAmBM,YAAnB,EAAD,yEAAsC,CAAtC,IAA2C,CAA5C,CAAlB;AACD;;AAED,WAASC,YAAT,GAAwB;AACtB,QAAI3B,QAAJ,EAAc;AACZU,MAAAA,SAAS,CAACG,OAAV,GAAoBU,SAApB;AACAxB,MAAAA,OAAO;AACR;AACF;;AAED,WAAS6B,mBAAT,CAA6BH,MAA7B,EAA0E;AACxEf,IAAAA,SAAS,CAACG,OAAV,GAAoBY,MAApB;AACAA,IAAAA,MAAM,CAACI,sBAAP,CAA8B;AAAA,UAAC;AAAEC,QAAAA;AAAF,OAAD;AAAA,aAC5B3B,SAAS,CAAC2B,aAAD,CADmB;AAAA,KAA9B;AAGAN,IAAAA,kBAAkB;AACnB;;AAED,MAAI,CAAC1B,MAAD,IAAW,CAACE,QAAhB,EAA0B;AACxB,WAAO,IAAP;AACD;;AAED,sBACE,oBAAC,KAAD;AACE,IAAA,MAAM,EAAEF,MADV;AAEE,IAAA,QAAQ,MAFV;AAGE,IAAA,QAAQ,MAHV;AAIE,IAAA,MAAM,EAAE6B,YAJV;AAKE,IAAA,QAAQ,EAAE,MAAM1B,WAAW,CAAC,IAAD,CAL7B;AAME,IAAA,QAAQ,EAAE,MAAM;AACdA,MAAAA,WAAW,CAAC,KAAD,CAAX;AACAE,MAAAA,SAAS,CAAC,CAAD,CAAT;AACD,KATH;AAUE,IAAA,IAAI,EAAC,IAVP;AAWE,IAAA,SAAS,EAAC;AAXZ,kBAaE,oBAAC,WAAD;AAAa,IAAA,GAAG,EAAC,KAAjB;AAAuB,IAAA,MAAM,EAAEJ;AAA/B,kBACE;AAAI,IAAA,SAAS,EAAC;AAAd,qBADF,eAEE,oBAAC,MAAD;AACE,IAAA,IAAI,EAAC,QADP;AAEE,IAAA,MAAM,EAAEK,eAFV;AAGE,IAAA,IAAI,EAAET,aAHR;AAIE,IAAA,OAAO,EAAC,qBAJV;AAKE,IAAA,OAAO,EAAEsB;AALX,IAFF,EASGT,SAAS,iBACR,oBAAC,MAAD;AACE,IAAA,IAAI,EAAC,QADP;AAEE,IAAA,IAAI,EAAEd,MAFR;AAGE,IAAA,MAAM,EAAEY,WAHV;AAIE,IAAA,OAAO,EAAC,gBAJV;AAKE,IAAA,OAAO,EAAEY;AALX,IAVJ,CAbF,eAgCE,oBAAC,SAAD;AAAW,IAAA,KAAK,EAAE;AAAEhB,MAAAA;AAAF;AAAlB,kBACE,oBAAC,MAAD;AACE,IAAA,mBAAmB,EAAE0B,mBADvB;AAEE,IAAA,QAAQ,EAAE;AACRG,MAAAA,KAAK,EAAElC,IADC;AAERmC,MAAAA,QAAQ,EAAE,IAFF;AAGRC,MAAAA,QAAQ,EAAE,IAHF;AAIR;AACAC,MAAAA,QAAQ,EAAE1B,SAAS,GAAG,YAAH,GAAkB,WAL7B;AAMR2B,MAAAA,OAAO,EAAE3B,SAND;AAOR4B,MAAAA,OAAO,EAAE;AAAEC,QAAAA,MAAM,EAAE;AAAV,OAPD;AAQRrB,MAAAA,WAAW,EAAEZ,eAAe,GAAG,IAAH,GAAU,KAR9B;AASRkC,MAAAA,kBAAkB,EAAE,CATZ;AAURC,MAAAA,mBAAmB,EAAE,MAVb;;AAWR;AACZ;AACA;AACA;AACA;AACYC,MAAAA,IAAI,EAAE;AAAEC,QAAAA,6BAA6B,EAAE;AAAjC;AAhBE;AAFZ,IADF,CAhCF,CADF;AA0DD","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): Path2D | null;
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":";AAqBA;;KAEK;AACL;IACE,qEAMC;IAQD,kBAOC;IANC,sBAAe;IAQjB,sCAEC;IAED,wBAEC;IAED,sCAWC;IAmCD,sDA0BC;IAED,mDAyBC;IAwBD,4BA8BC;IAgDD,8FAwBC;IAiDD,kDAWC;IAED,0DAsEC;IAED,sGAuFC;IAED,2DAiCC;IAED,uGAwCC;CA2GF"}
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"}
@@ -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 ICON_SCALE = 0.03;
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
- this.icons[name] = new Path2D(faIcon.icon[4]);
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 new Path2D(this.getIcon(ICON_NAMES.SORT_UP));
64
+ return this.getIcon(ICON_NAMES.SORT_UP);
55
65
  }
56
66
 
57
67
  if (sort.direction === TableUtils.sortDirection.descending) {
58
- return new Path2D(this.getIcon(ICON_NAMES.SORT_DOWN));
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
  }