@deephaven/console 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.
Files changed (144) hide show
  1. package/dist/Console.css +44 -0
  2. package/dist/Console.css.map +1 -0
  3. package/dist/Console.js +875 -0
  4. package/dist/Console.js.map +1 -0
  5. package/dist/ConsoleInput.css +42 -0
  6. package/dist/ConsoleInput.css.map +1 -0
  7. package/dist/ConsoleInput.js +442 -0
  8. package/dist/ConsoleInput.js.map +1 -0
  9. package/dist/ConsoleMenu.css +25 -0
  10. package/dist/ConsoleMenu.css.map +1 -0
  11. package/dist/ConsoleMenu.js +192 -0
  12. package/dist/ConsoleMenu.js.map +1 -0
  13. package/dist/ConsolePropTypes.js +10 -0
  14. package/dist/ConsolePropTypes.js.map +1 -0
  15. package/dist/ConsoleShortcuts.js +85 -0
  16. package/dist/ConsoleShortcuts.js.map +1 -0
  17. package/dist/ConsoleStatusBar.css +52 -0
  18. package/dist/ConsoleStatusBar.css.map +1 -0
  19. package/dist/ConsoleStatusBar.js +105 -0
  20. package/dist/ConsoleStatusBar.js.map +1 -0
  21. package/dist/HeapUsage.css +61 -0
  22. package/dist/HeapUsage.css.map +1 -0
  23. package/dist/HeapUsage.js +168 -0
  24. package/dist/HeapUsage.js.map +1 -0
  25. package/dist/StoragePropTypes.js +16 -0
  26. package/dist/StoragePropTypes.js.map +1 -0
  27. package/dist/command-history/CommandHistory.css +41 -0
  28. package/dist/command-history/CommandHistory.css.map +1 -0
  29. package/dist/command-history/CommandHistory.js +381 -0
  30. package/dist/command-history/CommandHistory.js.map +1 -0
  31. package/dist/command-history/CommandHistoryActions.css +10 -0
  32. package/dist/command-history/CommandHistoryActions.css.map +1 -0
  33. package/dist/command-history/CommandHistoryActions.js +47 -0
  34. package/dist/command-history/CommandHistoryActions.js.map +1 -0
  35. package/dist/command-history/CommandHistoryItem.css +61 -0
  36. package/dist/command-history/CommandHistoryItem.css.map +1 -0
  37. package/dist/command-history/CommandHistoryItem.js +50 -0
  38. package/dist/command-history/CommandHistoryItem.js.map +1 -0
  39. package/dist/command-history/CommandHistoryItemTooltip.css +37 -0
  40. package/dist/command-history/CommandHistoryItemTooltip.css.map +1 -0
  41. package/dist/command-history/CommandHistoryItemTooltip.js +159 -0
  42. package/dist/command-history/CommandHistoryItemTooltip.js.map +1 -0
  43. package/dist/command-history/CommandHistoryStorage.js +2 -0
  44. package/dist/command-history/CommandHistoryStorage.js.map +1 -0
  45. package/dist/command-history/CommandHistoryTypes.js +2 -0
  46. package/dist/command-history/CommandHistoryTypes.js.map +1 -0
  47. package/dist/command-history/CommandHistoryViewportUpdater.js +57 -0
  48. package/dist/command-history/CommandHistoryViewportUpdater.js.map +1 -0
  49. package/dist/command-history/index.js +7 -0
  50. package/dist/command-history/index.js.map +1 -0
  51. package/dist/common/Code.js +45 -0
  52. package/dist/common/Code.js.map +1 -0
  53. package/dist/common/ConsoleConstants.js +10 -0
  54. package/dist/common/ConsoleConstants.js.map +1 -0
  55. package/dist/common/ConsoleUtils.js +62 -0
  56. package/dist/common/ConsoleUtils.js.map +1 -0
  57. package/dist/common/ObjectIcon.js +33 -0
  58. package/dist/common/ObjectIcon.js.map +1 -0
  59. package/dist/common/index.js +5 -0
  60. package/dist/common/index.js.map +1 -0
  61. package/dist/console-history/ConsoleHistory.css +42 -0
  62. package/dist/console-history/ConsoleHistory.css.map +1 -0
  63. package/dist/console-history/ConsoleHistory.js +42 -0
  64. package/dist/console-history/ConsoleHistory.js.map +1 -0
  65. package/dist/console-history/ConsoleHistoryItem.css +87 -0
  66. package/dist/console-history/ConsoleHistoryItem.css.map +1 -0
  67. package/dist/console-history/ConsoleHistoryItem.js +139 -0
  68. package/dist/console-history/ConsoleHistoryItem.js.map +1 -0
  69. package/dist/console-history/ConsoleHistoryItemResult.js +22 -0
  70. package/dist/console-history/ConsoleHistoryItemResult.js.map +1 -0
  71. package/dist/console-history/ConsoleHistoryResultErrorMessage.js +142 -0
  72. package/dist/console-history/ConsoleHistoryResultErrorMessage.js.map +1 -0
  73. package/dist/console-history/ConsoleHistoryResultInProgress.css +27 -0
  74. package/dist/console-history/ConsoleHistoryResultInProgress.css.map +1 -0
  75. package/dist/console-history/ConsoleHistoryResultInProgress.js +66 -0
  76. package/dist/console-history/ConsoleHistoryResultInProgress.js.map +1 -0
  77. package/dist/console-history/ConsoleHistoryTypes.js +2 -0
  78. package/dist/console-history/ConsoleHistoryTypes.js.map +1 -0
  79. package/dist/console-history/index.js +6 -0
  80. package/dist/console-history/index.js.map +1 -0
  81. package/dist/csv/CsvFormats.js +134 -0
  82. package/dist/csv/CsvFormats.js.map +1 -0
  83. package/dist/csv/CsvInputBar.css +36 -0
  84. package/dist/csv/CsvInputBar.css.map +1 -0
  85. package/dist/csv/CsvInputBar.js +342 -0
  86. package/dist/csv/CsvInputBar.js.map +1 -0
  87. package/dist/csv/CsvOverlay.css +57 -0
  88. package/dist/csv/CsvOverlay.css.map +1 -0
  89. package/dist/csv/CsvOverlay.js +244 -0
  90. package/dist/csv/CsvOverlay.js.map +1 -0
  91. package/dist/csv/CsvParser.js +268 -0
  92. package/dist/csv/CsvParser.js.map +1 -0
  93. package/dist/csv/CsvTypeParser.js +235 -0
  94. package/dist/csv/CsvTypeParser.js.map +1 -0
  95. package/dist/csv/NewTableColumnTypes.js +16 -0
  96. package/dist/csv/NewTableColumnTypes.js.map +1 -0
  97. package/dist/declaration.d.js +2 -0
  98. package/dist/declaration.d.js.map +1 -0
  99. package/dist/index.js +18 -0
  100. package/dist/index.js.map +1 -0
  101. package/dist/log/LogLevel.js +11 -0
  102. package/dist/log/LogLevel.js.map +1 -0
  103. package/dist/log/LogLevelMenuItem.css +38 -0
  104. package/dist/log/LogLevelMenuItem.css.map +1 -0
  105. package/dist/log/LogLevelMenuItem.js +32 -0
  106. package/dist/log/LogLevelMenuItem.js.map +1 -0
  107. package/dist/log/LogView.css +65 -0
  108. package/dist/log/LogView.css.map +1 -0
  109. package/dist/log/LogView.js +487 -0
  110. package/dist/log/LogView.js.map +1 -0
  111. package/dist/monaco/MonacoProviders.js +314 -0
  112. package/dist/monaco/MonacoProviders.js.map +1 -0
  113. package/dist/monaco/MonacoTheme.module.css +54 -0
  114. package/dist/monaco/MonacoTheme.module.css.map +1 -0
  115. package/dist/monaco/MonacoUtils.js +423 -0
  116. package/dist/monaco/MonacoUtils.js.map +1 -0
  117. package/dist/monaco/index.js +4 -0
  118. package/dist/monaco/index.js.map +1 -0
  119. package/dist/monaco/lang/Language.js +2 -0
  120. package/dist/monaco/lang/Language.js.map +1 -0
  121. package/dist/monaco/lang/db.js +152 -0
  122. package/dist/monaco/lang/db.js.map +1 -0
  123. package/dist/monaco/lang/groovy.js +229 -0
  124. package/dist/monaco/lang/groovy.js.map +1 -0
  125. package/dist/monaco/lang/log.js +64 -0
  126. package/dist/monaco/lang/log.js.map +1 -0
  127. package/dist/monaco/lang/python.js +234 -0
  128. package/dist/monaco/lang/python.js.map +1 -0
  129. package/dist/monaco/lang/scala.js +264 -0
  130. package/dist/monaco/lang/scala.js.map +1 -0
  131. package/dist/notebook/Editor.css +6 -0
  132. package/dist/notebook/Editor.css.map +1 -0
  133. package/dist/notebook/Editor.js +130 -0
  134. package/dist/notebook/Editor.js.map +1 -0
  135. package/dist/notebook/ScriptEditor.css +8 -0
  136. package/dist/notebook/ScriptEditor.css.map +1 -0
  137. package/dist/notebook/ScriptEditor.d.ts.map +1 -1
  138. package/dist/notebook/ScriptEditor.js +311 -0
  139. package/dist/notebook/ScriptEditor.js.map +1 -0
  140. package/dist/notebook/ScriptEditorUtils.d.ts +7 -0
  141. package/dist/notebook/ScriptEditorUtils.d.ts.map +1 -1
  142. package/dist/notebook/ScriptEditorUtils.js +52 -0
  143. package/dist/notebook/ScriptEditorUtils.js.map +1 -0
  144. package/package.json +12 -12
@@ -0,0 +1,311 @@
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
+ /**
5
+ * Script editor for large blocks of code
6
+ */
7
+ import React, { Component } from 'react';
8
+ import { LoadingOverlay, ShortcutRegistry } from '@deephaven/components';
9
+ import Log from '@deephaven/log';
10
+ import { assertNotNull } from '@deephaven/utils';
11
+ import { editor } from 'monaco-editor';
12
+ import Editor from "./Editor.js";
13
+ import { MonacoProviders, MonacoUtils } from "../monaco/index.js";
14
+ import "./ScriptEditor.css";
15
+ import SHORTCUTS from "../ConsoleShortcuts.js";
16
+ import ScriptEditorUtils from "./ScriptEditorUtils.js";
17
+ var log = Log.module('ScriptEditor');
18
+ class ScriptEditor extends Component {
19
+ constructor(props) {
20
+ super(props);
21
+ _defineProperty(this, "contextActionCleanups", void 0);
22
+ _defineProperty(this, "completionCleanup", void 0);
23
+ _defineProperty(this, "editor", void 0);
24
+ _defineProperty(this, "editorComponent", void 0);
25
+ this.handleEditorInitialized = this.handleEditorInitialized.bind(this);
26
+ this.handleEditorWillDestroy = this.handleEditorWillDestroy.bind(this);
27
+ this.handleRun = this.handleRun.bind(this);
28
+ this.handleRunSelected = this.handleRunSelected.bind(this);
29
+ this.updateShortcuts = this.updateShortcuts.bind(this);
30
+ this.contextActionCleanups = [];
31
+ this.editorComponent = /*#__PURE__*/React.createRef();
32
+ this.state = {
33
+ model: null
34
+ };
35
+ }
36
+ componentDidMount() {
37
+ ShortcutRegistry.addEventListener('onUpdate', this.updateShortcuts);
38
+ }
39
+ componentDidUpdate(prevProps) {
40
+ var _prevProps$settings, _prevProps$settings2;
41
+ var {
42
+ sessionLanguage,
43
+ settings
44
+ } = this.props;
45
+ var language = settings === null || settings === void 0 ? void 0 : settings.language;
46
+ var languageChanged = language !== ((_prevProps$settings = prevProps.settings) === null || _prevProps$settings === void 0 ? void 0 : _prevProps$settings.language);
47
+ if (languageChanged) {
48
+ log.debug('Set language', language);
49
+ this.setLanguage(language);
50
+ }
51
+ var sessionDisconnected = sessionLanguage == null && prevProps.sessionLanguage != null;
52
+ var languageMatch = language === sessionLanguage;
53
+ var prevLanguageMatch = ((_prevProps$settings2 = prevProps.settings) === null || _prevProps$settings2 === void 0 ? void 0 : _prevProps$settings2.language) === prevProps.sessionLanguage;
54
+ if (sessionDisconnected || sessionLanguage !== undefined && prevLanguageMatch && !languageMatch) {
55
+ // Session disconnected or language changed from matching the session language to non-matching
56
+ log.debug('De-init completion and context actions');
57
+ this.deInitContextActions();
58
+ this.deInitCodeCompletion();
59
+ }
60
+ var sessionConnected = sessionLanguage != null && prevProps.sessionLanguage == null;
61
+ if (sessionConnected && languageMatch || sessionLanguage !== undefined && !prevLanguageMatch && languageMatch) {
62
+ // Session connected with a matching language or notebook language changed to matching
63
+ log.debug('Init completion and context actions');
64
+ this.initContextActions();
65
+ this.initCodeCompletion();
66
+ }
67
+ }
68
+ componentWillUnmount() {
69
+ ShortcutRegistry.removeEventListener('onUpdate', this.updateShortcuts);
70
+ }
71
+ getValue() {
72
+ if (this.editor) {
73
+ return this.editor.getValue();
74
+ }
75
+ log.error('Editor not initialized');
76
+ return null;
77
+ }
78
+ getSelectedCommand() {
79
+ var _this$editor, _this$editor2;
80
+ var range = (_this$editor = this.editor) === null || _this$editor === void 0 ? void 0 : _this$editor.getSelection();
81
+ assertNotNull(range);
82
+ var model = (_this$editor2 = this.editor) === null || _this$editor2 === void 0 ? void 0 : _this$editor2.getModel();
83
+ assertNotNull(model);
84
+ var {
85
+ startLineNumber,
86
+ endColumn
87
+ } = range;
88
+ var {
89
+ endLineNumber
90
+ } = range;
91
+ if (endColumn === 1 && endLineNumber > startLineNumber) {
92
+ endLineNumber -= 1;
93
+ }
94
+ var startLineMinColumn = model.getLineMinColumn(startLineNumber);
95
+ var endLineMaxColumn = model.getLineMaxColumn(endLineNumber);
96
+ var wholeLineRange = range.setStartPosition(startLineNumber, startLineMinColumn).setEndPosition(endLineNumber, endLineMaxColumn);
97
+ return ScriptEditorUtils.outdentCode(model.getValueInRange(wholeLineRange));
98
+ }
99
+ handleEditorInitialized(innerEditor) {
100
+ var {
101
+ focusOnMount,
102
+ onChange,
103
+ onEditorInitialized,
104
+ settings,
105
+ session,
106
+ sessionLanguage
107
+ } = this.props;
108
+ log.debug('handleEditorInitialized', sessionLanguage, session, settings);
109
+ this.editor = innerEditor;
110
+ this.setState({
111
+ model: this.editor.getModel()
112
+ });
113
+ MonacoUtils.setEOL(innerEditor);
114
+ MonacoUtils.registerPasteHandler(innerEditor);
115
+ if (session != null && settings && sessionLanguage === settings.language) {
116
+ this.initContextActions();
117
+ this.initCodeCompletion();
118
+ }
119
+ innerEditor.onDidChangeModelContent(onChange);
120
+ if (focusOnMount != null && focusOnMount) {
121
+ innerEditor.focus();
122
+ }
123
+ onEditorInitialized(this.editor);
124
+ }
125
+ handleEditorWillDestroy(innerEditor) {
126
+ log.debug('handleEditorWillDestroy');
127
+ var {
128
+ onEditorWillDestroy
129
+ } = this.props;
130
+ onEditorWillDestroy(innerEditor);
131
+ this.deInitContextActions();
132
+ this.deInitCodeCompletion();
133
+ this.setState({
134
+ model: null
135
+ });
136
+ this.editor = undefined;
137
+ }
138
+ handleRun() {
139
+ var {
140
+ onRunCommand
141
+ } = this.props;
142
+ var command = this.getValue();
143
+ if (command != null) {
144
+ onRunCommand(command);
145
+ }
146
+ }
147
+ handleRunSelected() {
148
+ var {
149
+ onRunCommand
150
+ } = this.props;
151
+ var command = this.getSelectedCommand();
152
+ onRunCommand(command);
153
+ }
154
+ initContextActions() {
155
+ if (this.contextActionCleanups.length > 0) {
156
+ log.error('Context actions already initialized.');
157
+ return;
158
+ }
159
+ if (!this.editor) {
160
+ return;
161
+ }
162
+ var cleanups = [];
163
+ cleanups.push(this.editor.addAction({
164
+ id: 'run-code',
165
+ label: 'Run',
166
+ keybindings: [MonacoUtils.getMonacoKeyCodeFromShortcut(SHORTCUTS.NOTEBOOK.RUN)],
167
+ contextMenuGroupId: 'navigation',
168
+ contextMenuOrder: 1.5,
169
+ run: () => {
170
+ this.handleRun();
171
+ }
172
+ }));
173
+ cleanups.push(this.editor.addAction({
174
+ id: 'run-selected-code',
175
+ label: 'Run Selected',
176
+ keybindings: [MonacoUtils.getMonacoKeyCodeFromShortcut(SHORTCUTS.NOTEBOOK.RUN_SELECTED)],
177
+ contextMenuGroupId: 'navigation',
178
+ contextMenuOrder: 1.5,
179
+ run: () => {
180
+ this.handleRunSelected();
181
+ }
182
+ }));
183
+ this.contextActionCleanups = cleanups;
184
+ }
185
+ deInitContextActions() {
186
+ if (this.contextActionCleanups.length > 0) {
187
+ this.contextActionCleanups.forEach(cleanup => cleanup.dispose());
188
+ this.contextActionCleanups = [];
189
+ }
190
+ }
191
+ updateShortcuts() {
192
+ this.deInitContextActions();
193
+ this.initContextActions();
194
+ }
195
+ initCodeCompletion() {
196
+ if (this.completionCleanup != null) {
197
+ log.error('Code completion already initialized.');
198
+ return;
199
+ }
200
+ var {
201
+ session
202
+ } = this.props;
203
+ log.debug('initCodeCompletion', this.editor, session);
204
+ if (this.editor && session != null) {
205
+ this.completionCleanup = MonacoUtils.openDocument(this.editor, session);
206
+ }
207
+ }
208
+ deInitCodeCompletion() {
209
+ var {
210
+ session
211
+ } = this.props;
212
+ log.debug('deInitCodeCompletion', this.editor, session);
213
+ if (this.completionCleanup) {
214
+ this.completionCleanup.dispose();
215
+ this.completionCleanup = undefined;
216
+ if (this.editor && session != null) {
217
+ MonacoUtils.closeDocument(this.editor, session);
218
+ }
219
+ }
220
+ }
221
+ append(text) {
222
+ var focus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
223
+ assertNotNull(this.editor);
224
+ var model = this.editor.getModel();
225
+ assertNotNull(model);
226
+ var currentText = model.getValue();
227
+ if (currentText) {
228
+ model.setValue("".concat(currentText, "\n").concat(text));
229
+ } else {
230
+ model.setValue("".concat(text));
231
+ }
232
+ var lastLine = model.getLineCount();
233
+ var column = model.getLineLength(lastLine) + 1;
234
+ this.editor.setPosition({
235
+ lineNumber: lastLine,
236
+ column
237
+ });
238
+ if (focus) {
239
+ this.editor.focus();
240
+ }
241
+ }
242
+ updateDimensions() {
243
+ log.debug('updateDimensions');
244
+ if (this.editor) {
245
+ this.editor.layout();
246
+ }
247
+ }
248
+ focus() {
249
+ log.debug('focus');
250
+ if (this.editor) {
251
+ this.editor.focus();
252
+ }
253
+ }
254
+ toggleFind() {
255
+ if (this.editorComponent.current) {
256
+ this.editorComponent.current.toggleFind();
257
+ }
258
+ }
259
+ setLanguage(language) {
260
+ if (this.editorComponent.current && language !== undefined) {
261
+ this.editorComponent.current.setLanguage(language);
262
+ }
263
+ }
264
+ render() {
265
+ var _settings$language;
266
+ var {
267
+ error,
268
+ isLoaded,
269
+ isLoading,
270
+ session,
271
+ sessionLanguage,
272
+ settings
273
+ } = this.props;
274
+ var {
275
+ model
276
+ } = this.state;
277
+ var errorMessage = error ? "Unable to open document. ".concat(error) : null;
278
+ var editorLanguage = settings ? (_settings$language = settings.language) !== null && _settings$language !== void 0 ? _settings$language : null : null;
279
+ var completionProviderEnabled = model && session && editorLanguage === sessionLanguage;
280
+ return /*#__PURE__*/React.createElement(React.Fragment, null, (error || isLoading) && /*#__PURE__*/React.createElement("div", {
281
+ className: "h-100 w-100 position-relative"
282
+ }, /*#__PURE__*/React.createElement(LoadingOverlay, {
283
+ errorMessage: errorMessage,
284
+ isLoading: isLoading,
285
+ isLoaded: isLoaded
286
+ })), isLoaded && /*#__PURE__*/React.createElement("div", {
287
+ className: "h-100 w-100 script-editor"
288
+ }, settings && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Editor, {
289
+ ref: this.editorComponent,
290
+ settings: settings,
291
+ onEditorInitialized: this.handleEditorInitialized,
292
+ onEditorWillDestroy: this.handleEditorWillDestroy
293
+ }), completionProviderEnabled != null && completionProviderEnabled && /*#__PURE__*/React.createElement(MonacoProviders, {
294
+ model: model,
295
+ language: editorLanguage,
296
+ session: session
297
+ }))));
298
+ }
299
+ }
300
+ _defineProperty(ScriptEditor, "defaultProps", {
301
+ error: null,
302
+ isLoading: false,
303
+ isLoaded: false,
304
+ focusOnMount: true,
305
+ onChange: () => undefined,
306
+ onEditorInitialized: () => undefined,
307
+ onEditorWillDestroy: () => undefined,
308
+ session: null
309
+ });
310
+ export default ScriptEditor;
311
+ //# sourceMappingURL=ScriptEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScriptEditor.js","names":["React","Component","LoadingOverlay","ShortcutRegistry","Log","assertNotNull","editor","Editor","MonacoProviders","MonacoUtils","SHORTCUTS","ScriptEditorUtils","log","module","ScriptEditor","constructor","props","handleEditorInitialized","bind","handleEditorWillDestroy","handleRun","handleRunSelected","updateShortcuts","contextActionCleanups","editorComponent","createRef","state","model","componentDidMount","addEventListener","componentDidUpdate","prevProps","sessionLanguage","settings","language","languageChanged","debug","setLanguage","sessionDisconnected","languageMatch","prevLanguageMatch","undefined","deInitContextActions","deInitCodeCompletion","sessionConnected","initContextActions","initCodeCompletion","componentWillUnmount","removeEventListener","getValue","error","getSelectedCommand","range","getSelection","getModel","startLineNumber","endColumn","endLineNumber","startLineMinColumn","getLineMinColumn","endLineMaxColumn","getLineMaxColumn","wholeLineRange","setStartPosition","setEndPosition","outdentCode","getValueInRange","innerEditor","focusOnMount","onChange","onEditorInitialized","session","setState","setEOL","registerPasteHandler","onDidChangeModelContent","focus","onEditorWillDestroy","onRunCommand","command","length","cleanups","push","addAction","id","label","keybindings","getMonacoKeyCodeFromShortcut","NOTEBOOK","RUN","contextMenuGroupId","contextMenuOrder","run","RUN_SELECTED","forEach","cleanup","dispose","completionCleanup","openDocument","closeDocument","append","text","currentText","setValue","lastLine","getLineCount","column","getLineLength","setPosition","lineNumber","updateDimensions","layout","toggleFind","current","render","isLoaded","isLoading","errorMessage","editorLanguage","completionProviderEnabled"],"sources":["../../src/notebook/ScriptEditor.tsx"],"sourcesContent":["/**\n * Script editor for large blocks of code\n */\nimport React, { Component, ReactElement, RefObject } from 'react';\nimport { LoadingOverlay, ShortcutRegistry } from '@deephaven/components';\nimport Log from '@deephaven/log';\nimport type { IdeSession } from '@deephaven/jsapi-types';\nimport { assertNotNull } from '@deephaven/utils';\nimport { editor, IDisposable } from 'monaco-editor';\nimport Editor from './Editor';\nimport { MonacoProviders, MonacoUtils } from '../monaco';\nimport './ScriptEditor.scss';\nimport SHORTCUTS from '../ConsoleShortcuts';\nimport ScriptEditorUtils from './ScriptEditorUtils';\n\nconst log = Log.module('ScriptEditor');\n\ninterface ScriptEditorProps {\n error?: { message?: string };\n isLoading: boolean;\n isLoaded: boolean;\n focusOnMount?: boolean;\n onChange: (e: editor.IModelContentChangedEvent) => void;\n onRunCommand: (command: string) => void;\n onEditorInitialized: (editor: editor.IStandaloneCodeEditor) => void;\n onEditorWillDestroy: (editor: editor.IStandaloneCodeEditor) => void;\n session: IdeSession | null;\n sessionLanguage?: string;\n settings?: editor.IStandaloneEditorConstructionOptions;\n}\n\ninterface ScriptEditorState {\n model: editor.ITextModel | null;\n}\n\nclass ScriptEditor extends Component<ScriptEditorProps, ScriptEditorState> {\n static defaultProps = {\n error: null,\n isLoading: false,\n isLoaded: false,\n focusOnMount: true,\n onChange: (): void => undefined,\n onEditorInitialized: (): void => undefined,\n onEditorWillDestroy: (): void => undefined,\n session: null,\n };\n\n constructor(props: ScriptEditorProps) {\n super(props);\n this.handleEditorInitialized = this.handleEditorInitialized.bind(this);\n this.handleEditorWillDestroy = this.handleEditorWillDestroy.bind(this);\n this.handleRun = this.handleRun.bind(this);\n this.handleRunSelected = this.handleRunSelected.bind(this);\n this.updateShortcuts = this.updateShortcuts.bind(this);\n\n this.contextActionCleanups = [];\n this.editorComponent = React.createRef();\n\n this.state = {\n model: null,\n };\n }\n\n componentDidMount(): void {\n ShortcutRegistry.addEventListener('onUpdate', this.updateShortcuts);\n }\n\n componentDidUpdate(prevProps: ScriptEditorProps): void {\n const { sessionLanguage, settings } = this.props;\n\n const language = settings?.language;\n\n const languageChanged = language !== prevProps.settings?.language;\n if (languageChanged) {\n log.debug('Set language', language);\n this.setLanguage(language);\n }\n\n const sessionDisconnected =\n sessionLanguage == null && prevProps.sessionLanguage != null;\n const languageMatch = language === sessionLanguage;\n const prevLanguageMatch =\n prevProps.settings?.language === prevProps.sessionLanguage;\n if (\n sessionDisconnected ||\n (sessionLanguage !== undefined && prevLanguageMatch && !languageMatch)\n ) {\n // Session disconnected or language changed from matching the session language to non-matching\n log.debug('De-init completion and context actions');\n this.deInitContextActions();\n this.deInitCodeCompletion();\n }\n\n const sessionConnected =\n sessionLanguage != null && prevProps.sessionLanguage == null;\n if (\n (sessionConnected && languageMatch) ||\n (sessionLanguage !== undefined && !prevLanguageMatch && languageMatch)\n ) {\n // Session connected with a matching language or notebook language changed to matching\n log.debug('Init completion and context actions');\n this.initContextActions();\n this.initCodeCompletion();\n }\n }\n\n componentWillUnmount(): void {\n ShortcutRegistry.removeEventListener('onUpdate', this.updateShortcuts);\n }\n\n contextActionCleanups: IDisposable[];\n\n completionCleanup?: IDisposable;\n\n editor?: editor.IStandaloneCodeEditor;\n\n editorComponent: RefObject<Editor>;\n\n getValue(): string | null {\n if (this.editor) {\n return this.editor.getValue();\n }\n log.error('Editor not initialized');\n return null;\n }\n\n getSelectedCommand(): string {\n const range = this.editor?.getSelection();\n assertNotNull(range);\n const model = this.editor?.getModel();\n assertNotNull(model);\n const { startLineNumber, endColumn } = range;\n let { endLineNumber } = range;\n if (endColumn === 1 && endLineNumber > startLineNumber) {\n endLineNumber -= 1;\n }\n const startLineMinColumn = model.getLineMinColumn(startLineNumber);\n const endLineMaxColumn = model.getLineMaxColumn(endLineNumber);\n const wholeLineRange = range\n .setStartPosition(startLineNumber, startLineMinColumn)\n .setEndPosition(endLineNumber, endLineMaxColumn);\n\n return ScriptEditorUtils.outdentCode(model.getValueInRange(wholeLineRange));\n }\n\n handleEditorInitialized(innerEditor: editor.IStandaloneCodeEditor): void {\n const {\n focusOnMount,\n onChange,\n onEditorInitialized,\n settings,\n session,\n sessionLanguage,\n } = this.props;\n\n log.debug('handleEditorInitialized', sessionLanguage, session, settings);\n\n this.editor = innerEditor;\n this.setState({ model: this.editor.getModel() });\n\n MonacoUtils.setEOL(innerEditor);\n MonacoUtils.registerPasteHandler(innerEditor);\n\n if (session != null && settings && sessionLanguage === settings.language) {\n this.initContextActions();\n this.initCodeCompletion();\n }\n\n innerEditor.onDidChangeModelContent(onChange);\n if (focusOnMount != null && focusOnMount) {\n innerEditor.focus();\n }\n\n onEditorInitialized(this.editor);\n }\n\n handleEditorWillDestroy(innerEditor: editor.IStandaloneCodeEditor): void {\n log.debug('handleEditorWillDestroy');\n const { onEditorWillDestroy } = this.props;\n onEditorWillDestroy(innerEditor);\n this.deInitContextActions();\n this.deInitCodeCompletion();\n this.setState({ model: null });\n this.editor = undefined;\n }\n\n handleRun(): void {\n const { onRunCommand } = this.props;\n const command = this.getValue();\n if (command != null) {\n onRunCommand(command);\n }\n }\n\n handleRunSelected(): void {\n const { onRunCommand } = this.props;\n const command = this.getSelectedCommand();\n onRunCommand(command);\n }\n\n initContextActions(): void {\n if (this.contextActionCleanups.length > 0) {\n log.error('Context actions already initialized.');\n return;\n }\n\n if (!this.editor) {\n return;\n }\n\n const cleanups = [];\n cleanups.push(\n this.editor.addAction({\n id: 'run-code',\n label: 'Run',\n keybindings: [\n MonacoUtils.getMonacoKeyCodeFromShortcut(SHORTCUTS.NOTEBOOK.RUN),\n ],\n contextMenuGroupId: 'navigation',\n contextMenuOrder: 1.5,\n\n run: () => {\n this.handleRun();\n },\n })\n );\n\n cleanups.push(\n this.editor.addAction({\n id: 'run-selected-code',\n label: 'Run Selected',\n keybindings: [\n MonacoUtils.getMonacoKeyCodeFromShortcut(\n SHORTCUTS.NOTEBOOK.RUN_SELECTED\n ),\n ],\n contextMenuGroupId: 'navigation',\n contextMenuOrder: 1.5,\n\n run: () => {\n this.handleRunSelected();\n },\n })\n );\n\n this.contextActionCleanups = cleanups;\n }\n\n deInitContextActions(): void {\n if (this.contextActionCleanups.length > 0) {\n this.contextActionCleanups.forEach(cleanup => cleanup.dispose());\n this.contextActionCleanups = [];\n }\n }\n\n updateShortcuts(): void {\n this.deInitContextActions();\n this.initContextActions();\n }\n\n initCodeCompletion(): void {\n if (this.completionCleanup != null) {\n log.error('Code completion already initialized.');\n return;\n }\n const { session } = this.props;\n log.debug('initCodeCompletion', this.editor, session);\n if (this.editor && session != null) {\n this.completionCleanup = MonacoUtils.openDocument(this.editor, session);\n }\n }\n\n deInitCodeCompletion(): void {\n const { session } = this.props;\n log.debug('deInitCodeCompletion', this.editor, session);\n if (this.completionCleanup) {\n this.completionCleanup.dispose();\n this.completionCleanup = undefined;\n if (this.editor && session != null) {\n MonacoUtils.closeDocument(this.editor, session);\n }\n }\n }\n\n append(text: string, focus = true): void {\n assertNotNull(this.editor);\n const model = this.editor.getModel();\n assertNotNull(model);\n const currentText = model.getValue();\n if (currentText) {\n model.setValue(`${currentText}\\n${text}`);\n } else {\n model.setValue(`${text}`);\n }\n\n const lastLine = model.getLineCount();\n const column = model.getLineLength(lastLine) + 1;\n\n this.editor.setPosition({ lineNumber: lastLine, column });\n\n if (focus) {\n this.editor.focus();\n }\n }\n\n updateDimensions(): void {\n log.debug('updateDimensions');\n if (this.editor) {\n this.editor.layout();\n }\n }\n\n focus(): void {\n log.debug('focus');\n if (this.editor) {\n this.editor.focus();\n }\n }\n\n toggleFind(): void {\n if (this.editorComponent.current) {\n this.editorComponent.current.toggleFind();\n }\n }\n\n setLanguage(language?: string): void {\n if (this.editorComponent.current && language !== undefined) {\n this.editorComponent.current.setLanguage(language);\n }\n }\n\n render(): ReactElement {\n const {\n error,\n isLoaded,\n isLoading,\n session,\n sessionLanguage,\n settings,\n } = this.props;\n const { model } = this.state;\n const errorMessage = error ? `Unable to open document. ${error}` : null;\n const editorLanguage = settings ? settings.language ?? null : null;\n const completionProviderEnabled =\n model && session && editorLanguage === sessionLanguage;\n\n return (\n <>\n {(error || isLoading) && (\n <div className=\"h-100 w-100 position-relative\">\n <LoadingOverlay\n errorMessage={errorMessage}\n isLoading={isLoading}\n isLoaded={isLoaded}\n />\n </div>\n )}\n\n {isLoaded && (\n <div className=\"h-100 w-100 script-editor\">\n {settings && (\n <>\n <Editor\n ref={this.editorComponent}\n settings={settings}\n onEditorInitialized={this.handleEditorInitialized}\n onEditorWillDestroy={this.handleEditorWillDestroy}\n />\n {completionProviderEnabled != null &&\n completionProviderEnabled && (\n <MonacoProviders\n model={model}\n language={editorLanguage}\n session={session}\n />\n )}\n </>\n )}\n </div>\n )}\n </>\n );\n }\n}\n\nexport default ScriptEditor;\n"],"mappings":"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"}
@@ -18,6 +18,13 @@ declare class ScriptEditorUtils {
18
18
  * @returns Tooltip message or `null` if the session is connected and language is matching
19
19
  */
20
20
  static getDisabledRunTooltip(isSessionConnected: boolean, isLanguageMatching: boolean, scriptLanguageLabel: string, buttonLabel: string): string | null;
21
+ /**
22
+ * Outdent (opposite of indent) a string so the lowest indent level is 0
23
+ * Assumes each line is indented with the same characters (i.e. no mixed tabs/spaces)
24
+ * @param code The code to outdent
25
+ * @returns A code block where the minimum indent level of a line is 0
26
+ */
27
+ static outdentCode(code: string): string;
21
28
  }
22
29
  export default ScriptEditorUtils;
23
30
  //# sourceMappingURL=ScriptEditorUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ScriptEditorUtils.d.ts","sourceRoot":"","sources":["../../src/notebook/ScriptEditorUtils.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,SAAS;;;;CAIL,CAAC;AAEX,cAAM,iBAAiB;IACrB;;;OAGG;IACH,MAAM,CAAC,uBAAuB,CAAC,QAAQ,EAAE,MAAM,OAAO,SAAS,GAAG,MAAM;IAIxE;;;;;;;OAOG;IACH,MAAM,CAAC,qBAAqB,CAC1B,kBAAkB,EAAE,OAAO,EAC3B,kBAAkB,EAAE,OAAO,EAC3B,mBAAmB,EAAE,MAAM,EAC3B,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI;CASjB;AAED,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"ScriptEditorUtils.d.ts","sourceRoot":"","sources":["../../src/notebook/ScriptEditorUtils.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,SAAS;;;;CAIL,CAAC;AAEX,cAAM,iBAAiB;IACrB;;;OAGG;IACH,MAAM,CAAC,uBAAuB,CAAC,QAAQ,EAAE,MAAM,OAAO,SAAS,GAAG,MAAM;IAIxE;;;;;;;OAOG;IACH,MAAM,CAAC,qBAAqB,CAC1B,kBAAkB,EAAE,OAAO,EAC3B,kBAAkB,EAAE,OAAO,EAC3B,mBAAmB,EAAE,MAAM,EAC3B,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI;IAUhB;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM;CAWhC;AAED,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,52 @@
1
+ var LANGUAGES = {
2
+ groovy: 'Groovy',
3
+ python: 'Python',
4
+ scala: 'Scala'
5
+ };
6
+ class ScriptEditorUtils {
7
+ /** Get PQ script language from Monaco language
8
+ * @paramlanguage Monaco language
9
+ * @returns PQ script language
10
+ */
11
+ static normalizeScriptLanguage(language) {
12
+ return LANGUAGES[language] || null;
13
+ }
14
+
15
+ /**
16
+ * Get a tooltip for disabled button based on the session status and language
17
+ * @param isSessionConnected True if console session connected
18
+ * @param isLanguageMatching True if the script language is matching the session language
19
+ * @param scriptLanguageLabel Language label to use in the tooltip message
20
+ * @param buttonLabel Button label to use in the tooltip message
21
+ * @returns Tooltip message or `null` if the session is connected and language is matching
22
+ */
23
+ static getDisabledRunTooltip(isSessionConnected, isLanguageMatching, scriptLanguageLabel, buttonLabel) {
24
+ if (!isSessionConnected) {
25
+ return "Console session not connected \u2013 ".concat(buttonLabel, " disabled");
26
+ }
27
+ if (!isLanguageMatching) {
28
+ return "".concat(scriptLanguageLabel, " doesn't match the session language \u2013 ").concat(buttonLabel, " disabled");
29
+ }
30
+ return null;
31
+ }
32
+
33
+ /**
34
+ * Outdent (opposite of indent) a string so the lowest indent level is 0
35
+ * Assumes each line is indented with the same characters (i.e. no mixed tabs/spaces)
36
+ * @param code The code to outdent
37
+ * @returns A code block where the minimum indent level of a line is 0
38
+ */
39
+ static outdentCode(code) {
40
+ var lines = code.split('\n');
41
+ var minIndent = lines.reduce((min, line) => {
42
+ var indentLength = line.length - line.trimStart().length;
43
+ if (indentLength === line.length) {
44
+ return min;
45
+ }
46
+ return indentLength < min ? indentLength : min;
47
+ }, Number.MAX_SAFE_INTEGER);
48
+ return lines.map(line => line.slice(minIndent)).join('\n');
49
+ }
50
+ }
51
+ export default ScriptEditorUtils;
52
+ //# sourceMappingURL=ScriptEditorUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScriptEditorUtils.js","names":["LANGUAGES","groovy","python","scala","ScriptEditorUtils","normalizeScriptLanguage","language","getDisabledRunTooltip","isSessionConnected","isLanguageMatching","scriptLanguageLabel","buttonLabel","outdentCode","code","lines","split","minIndent","reduce","min","line","indentLength","length","trimStart","Number","MAX_SAFE_INTEGER","map","slice","join"],"sources":["../../src/notebook/ScriptEditorUtils.ts"],"sourcesContent":["const LANGUAGES = {\n groovy: 'Groovy',\n python: 'Python',\n scala: 'Scala',\n} as const;\n\nclass ScriptEditorUtils {\n /** Get PQ script language from Monaco language\n * @paramlanguage Monaco language\n * @returns PQ script language\n */\n static normalizeScriptLanguage(language: keyof typeof LANGUAGES): string {\n return LANGUAGES[language] || null;\n }\n\n /**\n * Get a tooltip for disabled button based on the session status and language\n * @param isSessionConnected True if console session connected\n * @param isLanguageMatching True if the script language is matching the session language\n * @param scriptLanguageLabel Language label to use in the tooltip message\n * @param buttonLabel Button label to use in the tooltip message\n * @returns Tooltip message or `null` if the session is connected and language is matching\n */\n static getDisabledRunTooltip(\n isSessionConnected: boolean,\n isLanguageMatching: boolean,\n scriptLanguageLabel: string,\n buttonLabel: string\n ): string | null {\n if (!isSessionConnected) {\n return `Console session not connected – ${buttonLabel} disabled`;\n }\n if (!isLanguageMatching) {\n return `${scriptLanguageLabel} doesn't match the session language – ${buttonLabel} disabled`;\n }\n return null;\n }\n\n /**\n * Outdent (opposite of indent) a string so the lowest indent level is 0\n * Assumes each line is indented with the same characters (i.e. no mixed tabs/spaces)\n * @param code The code to outdent\n * @returns A code block where the minimum indent level of a line is 0\n */\n static outdentCode(code: string) {\n const lines = code.split('\\n');\n const minIndent = lines.reduce((min, line) => {\n const indentLength = line.length - line.trimStart().length;\n if (indentLength === line.length) {\n return min;\n }\n return indentLength < min ? indentLength : min;\n }, Number.MAX_SAFE_INTEGER);\n return lines.map(line => line.slice(minIndent)).join('\\n');\n }\n}\n\nexport default ScriptEditorUtils;\n"],"mappings":"AAAA,IAAMA,SAAS,GAAG;EAChBC,MAAM,EAAE,QAAQ;EAChBC,MAAM,EAAE,QAAQ;EAChBC,KAAK,EAAE;AACT,CAAU;AAEV,MAAMC,iBAAiB,CAAC;EACtB;AACF;AACA;AACA;EACE,OAAOC,uBAAuB,CAACC,QAAgC,EAAU;IACvE,OAAON,SAAS,CAACM,QAAQ,CAAC,IAAI,IAAI;EACpC;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAOC,qBAAqB,CAC1BC,kBAA2B,EAC3BC,kBAA2B,EAC3BC,mBAA2B,EAC3BC,WAAmB,EACJ;IACf,IAAI,CAACH,kBAAkB,EAAE;MACvB,sDAA0CG,WAAW;IACvD;IACA,IAAI,CAACF,kBAAkB,EAAE;MACvB,iBAAUC,mBAAmB,wDAAyCC,WAAW;IACnF;IACA,OAAO,IAAI;EACb;;EAEA;AACF;AACA;AACA;AACA;AACA;EACE,OAAOC,WAAW,CAACC,IAAY,EAAE;IAC/B,IAAMC,KAAK,GAAGD,IAAI,CAACE,KAAK,CAAC,IAAI,CAAC;IAC9B,IAAMC,SAAS,GAAGF,KAAK,CAACG,MAAM,CAAC,CAACC,GAAG,EAAEC,IAAI,KAAK;MAC5C,IAAMC,YAAY,GAAGD,IAAI,CAACE,MAAM,GAAGF,IAAI,CAACG,SAAS,EAAE,CAACD,MAAM;MAC1D,IAAID,YAAY,KAAKD,IAAI,CAACE,MAAM,EAAE;QAChC,OAAOH,GAAG;MACZ;MACA,OAAOE,YAAY,GAAGF,GAAG,GAAGE,YAAY,GAAGF,GAAG;IAChD,CAAC,EAAEK,MAAM,CAACC,gBAAgB,CAAC;IAC3B,OAAOV,KAAK,CAACW,GAAG,CAACN,IAAI,IAAIA,IAAI,CAACO,KAAK,CAACV,SAAS,CAAC,CAAC,CAACW,IAAI,CAAC,IAAI,CAAC;EAC5D;AACF;AAEA,eAAevB,iBAAiB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/console",
3
- "version": "0.43.0",
3
+ "version": "0.44.0",
4
4
  "description": "Deephaven Console",
5
5
  "author": "Deephaven Data Labs LLC",
6
6
  "license": "Apache-2.0",
@@ -23,14 +23,14 @@
23
23
  "build:sass": "sass --embed-sources --load-path=../../node_modules ./src:./dist"
24
24
  },
25
25
  "dependencies": {
26
- "@deephaven/chart": "^0.43.0",
27
- "@deephaven/components": "^0.43.0",
28
- "@deephaven/icons": "^0.43.0",
29
- "@deephaven/jsapi-bootstrap": "^0.43.0",
30
- "@deephaven/jsapi-types": "^0.43.0",
31
- "@deephaven/log": "^0.43.0",
32
- "@deephaven/storage": "^0.43.0",
33
- "@deephaven/utils": "^0.43.0",
26
+ "@deephaven/chart": "^0.44.0",
27
+ "@deephaven/components": "^0.44.0",
28
+ "@deephaven/icons": "^0.44.0",
29
+ "@deephaven/jsapi-bootstrap": "^0.44.0",
30
+ "@deephaven/jsapi-types": "^0.44.0",
31
+ "@deephaven/log": "^0.44.0",
32
+ "@deephaven/storage": "^0.44.0",
33
+ "@deephaven/utils": "^0.44.0",
34
34
  "@fortawesome/react-fontawesome": "^0.2.0",
35
35
  "classnames": "^2.3.1",
36
36
  "linkifyjs": "^4.1.0",
@@ -49,8 +49,8 @@
49
49
  "react-dom": "^17.x"
50
50
  },
51
51
  "devDependencies": {
52
- "@deephaven/jsapi-shim": "^0.43.0",
53
- "@deephaven/mocks": "^0.43.0"
52
+ "@deephaven/jsapi-shim": "^0.44.0",
53
+ "@deephaven/mocks": "^0.44.0"
54
54
  },
55
55
  "files": [
56
56
  "dist"
@@ -61,5 +61,5 @@
61
61
  "publishConfig": {
62
62
  "access": "public"
63
63
  },
64
- "gitHead": "b16776b5bdc15a02cd2897cd79d562ea38c60ed8"
64
+ "gitHead": "ba13c9139b3b7a5f5d64d79069f1de9d4727eeb6"
65
65
  }