@deephaven/console 0.22.3-beta.15 → 0.22.3-beta.21

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 (108) hide show
  1. package/dist/Console.d.ts +3 -3
  2. package/dist/Console.d.ts.map +1 -1
  3. package/dist/Console.js +9 -114
  4. package/dist/Console.js.map +1 -1
  5. package/dist/ConsoleInput.js +14 -90
  6. package/dist/ConsoleInput.js.map +1 -1
  7. package/dist/ConsoleMenu.js +6 -25
  8. package/dist/ConsoleMenu.js.map +1 -1
  9. package/dist/ConsolePropTypes.js.map +1 -1
  10. package/dist/ConsoleShortcuts.js +1 -1
  11. package/dist/ConsoleShortcuts.js.map +1 -1
  12. package/dist/ConsoleStatusBar.js +0 -16
  13. package/dist/ConsoleStatusBar.js.map +1 -1
  14. package/dist/HeapUsage.d.ts +1 -1
  15. package/dist/HeapUsage.d.ts.map +1 -1
  16. package/dist/HeapUsage.js +2 -18
  17. package/dist/HeapUsage.js.map +1 -1
  18. package/dist/StoragePropTypes.js.map +1 -1
  19. package/dist/command-history/CommandHistory.js +1 -49
  20. package/dist/command-history/CommandHistory.js.map +1 -1
  21. package/dist/command-history/CommandHistoryActions.js +0 -6
  22. package/dist/command-history/CommandHistoryActions.js.map +1 -1
  23. package/dist/command-history/CommandHistoryItem.d.ts +4 -4
  24. package/dist/command-history/CommandHistoryItem.d.ts.map +1 -1
  25. package/dist/command-history/CommandHistoryItem.js +3 -6
  26. package/dist/command-history/CommandHistoryItem.js.map +1 -1
  27. package/dist/command-history/CommandHistoryItemTooltip.d.ts +1 -1
  28. package/dist/command-history/CommandHistoryItemTooltip.d.ts.map +1 -1
  29. package/dist/command-history/CommandHistoryItemTooltip.js +3 -28
  30. package/dist/command-history/CommandHistoryItemTooltip.js.map +1 -1
  31. package/dist/command-history/CommandHistoryViewportUpdater.js +0 -3
  32. package/dist/command-history/CommandHistoryViewportUpdater.js.map +1 -1
  33. package/dist/command-history/index.js.map +1 -1
  34. package/dist/common/Code.js +2 -11
  35. package/dist/common/Code.js.map +1 -1
  36. package/dist/common/ConsoleConstants.js +0 -2
  37. package/dist/common/ConsoleConstants.js.map +1 -1
  38. package/dist/common/ConsoleUtils.js +4 -19
  39. package/dist/common/ConsoleUtils.js.map +1 -1
  40. package/dist/common/ObjectIcon.d.ts +1 -1
  41. package/dist/common/ObjectIcon.d.ts.map +1 -1
  42. package/dist/common/ObjectIcon.js +2 -8
  43. package/dist/common/ObjectIcon.js.map +1 -1
  44. package/dist/common/index.js.map +1 -1
  45. package/dist/console-history/ConsoleHistory.js +0 -8
  46. package/dist/console-history/ConsoleHistory.js.map +1 -1
  47. package/dist/console-history/ConsoleHistoryItem.js +2 -25
  48. package/dist/console-history/ConsoleHistoryItem.js.map +1 -1
  49. package/dist/console-history/ConsoleHistoryItemResult.d.ts +6 -6
  50. package/dist/console-history/ConsoleHistoryItemResult.d.ts.map +1 -1
  51. package/dist/console-history/ConsoleHistoryItemResult.js +2 -4
  52. package/dist/console-history/ConsoleHistoryItemResult.js.map +1 -1
  53. package/dist/console-history/ConsoleHistoryResultErrorMessage.js +0 -22
  54. package/dist/console-history/ConsoleHistoryResultErrorMessage.js.map +1 -1
  55. package/dist/console-history/ConsoleHistoryResultInProgress.js +0 -13
  56. package/dist/console-history/ConsoleHistoryResultInProgress.js.map +1 -1
  57. package/dist/console-history/index.js.map +1 -1
  58. package/dist/csv/CsvFormats.js +0 -9
  59. package/dist/csv/CsvFormats.js.map +1 -1
  60. package/dist/csv/CsvInputBar.js +18 -51
  61. package/dist/csv/CsvInputBar.js.map +1 -1
  62. package/dist/csv/CsvOverlay.d.ts +2 -2
  63. package/dist/csv/CsvOverlay.d.ts.map +1 -1
  64. package/dist/csv/CsvOverlay.js +1 -41
  65. package/dist/csv/CsvOverlay.js.map +1 -1
  66. package/dist/csv/CsvParser.js +10 -73
  67. package/dist/csv/CsvParser.js.map +1 -1
  68. package/dist/csv/CsvTypeParser.js +15 -85
  69. package/dist/csv/CsvTypeParser.js.map +1 -1
  70. package/dist/csv/NewTableColumnTypes.js +0 -9
  71. package/dist/csv/NewTableColumnTypes.js.map +1 -1
  72. package/dist/index.d.ts +3 -2
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +3 -2
  75. package/dist/index.js.map +1 -1
  76. package/dist/log/LogLevel.js.map +1 -1
  77. package/dist/log/LogLevelMenuItem.js +0 -5
  78. package/dist/log/LogLevelMenuItem.js.map +1 -1
  79. package/dist/log/LogView.js +16 -106
  80. package/dist/log/LogView.js.map +1 -1
  81. package/dist/monaco/MonacoCompletionProvider.js +2 -14
  82. package/dist/monaco/MonacoCompletionProvider.js.map +1 -1
  83. package/dist/monaco/MonacoUtils.d.ts.map +1 -1
  84. package/dist/monaco/MonacoUtils.js +21 -49
  85. package/dist/monaco/MonacoUtils.js.map +1 -1
  86. package/dist/monaco/index.js.map +1 -1
  87. package/dist/monaco/lang/db.d.ts.map +1 -1
  88. package/dist/monaco/lang/db.js +22 -13
  89. package/dist/monaco/lang/db.js.map +1 -1
  90. package/dist/monaco/lang/groovy.d.ts.map +1 -1
  91. package/dist/monaco/lang/groovy.js +28 -15
  92. package/dist/monaco/lang/groovy.js.map +1 -1
  93. package/dist/monaco/lang/log.js +1 -0
  94. package/dist/monaco/lang/log.js.map +1 -1
  95. package/dist/monaco/lang/python.d.ts.map +1 -1
  96. package/dist/monaco/lang/python.js +30 -16
  97. package/dist/monaco/lang/python.js.map +1 -1
  98. package/dist/monaco/lang/scala.js +26 -13
  99. package/dist/monaco/lang/scala.js.map +1 -1
  100. package/dist/notebook/Editor.js +2 -21
  101. package/dist/notebook/Editor.js.map +1 -1
  102. package/dist/notebook/ScriptEditor.d.ts +1 -1
  103. package/dist/notebook/ScriptEditor.d.ts.map +1 -1
  104. package/dist/notebook/ScriptEditor.js +0 -57
  105. package/dist/notebook/ScriptEditor.js.map +1 -1
  106. package/dist/notebook/ScriptEditorUtils.js +1 -7
  107. package/dist/notebook/ScriptEditorUtils.js.map +1 -1
  108. package/package.json +11 -11
@@ -1,9 +1,6 @@
1
1
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
-
3
2
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
-
5
3
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
-
7
4
  import React, { PureComponent } from 'react';
8
5
  import { Button, DropdownMenu } from '@deephaven/components';
9
6
  import { vsGear, dhTrashUndo } from '@deephaven/icons';
@@ -13,7 +10,6 @@ import ConsoleUtils from "../common/ConsoleUtils.js";
13
10
  import LogLevel from "./LogLevel.js";
14
11
  import "./LogView.css";
15
12
  import LogLevelMenuItem from "./LogLevelMenuItem.js";
16
-
17
13
  /**
18
14
  * Log view contents. Uses a monaco editor to display/search the contents of the log.
19
15
  */
@@ -21,29 +17,21 @@ class LogView extends PureComponent {
21
17
  /** ms to buffer log messages before processing them */
22
18
 
23
19
  /** Maximum number of messages to store in the log */
20
+
24
21
  static getLogText(logItem) {
25
22
  var date = new Date(logItem.micros / 1000);
26
23
  var timestamp = ConsoleUtils.formatTimestamp(date);
27
24
  return "".concat(timestamp, " ").concat(logItem.logLevel, " ").concat(logItem.message);
28
25
  }
29
-
30
26
  constructor(props) {
31
27
  super(props);
32
-
33
28
  _defineProperty(this, "cancelListener", void 0);
34
-
35
29
  _defineProperty(this, "editor", void 0);
36
-
37
30
  _defineProperty(this, "editorContainer", void 0);
38
-
39
31
  _defineProperty(this, "logLevelMenuItems", void 0);
40
-
41
32
  _defineProperty(this, "flushTimer", void 0);
42
-
43
33
  _defineProperty(this, "bufferedMessages", void 0);
44
-
45
34
  _defineProperty(this, "messages", void 0);
46
-
47
35
  this.handleClearClick = this.handleClearClick.bind(this);
48
36
  this.handleFlushTimeout = this.handleFlushTimeout.bind(this);
49
37
  this.handleLogMessage = this.handleLogMessage.bind(this);
@@ -59,46 +47,38 @@ class LogView extends PureComponent {
59
47
  shownLogLevels: {}
60
48
  };
61
49
  }
62
-
63
50
  componentDidMount() {
64
51
  this.resetLogLevels();
65
52
  this.initMonaco();
66
53
  this.startListening();
67
54
  window.addEventListener('resize', this.handleResize);
68
55
  }
69
-
70
56
  componentDidUpdate(prevProps, prevState) {
71
57
  this.updateDimensions();
72
58
  var {
73
59
  shownLogLevels
74
60
  } = this.state;
75
-
76
61
  if (prevState.shownLogLevels !== shownLogLevels) {
77
62
  this.refreshLogText();
78
63
  }
79
-
80
64
  var {
81
65
  session
82
66
  } = this.props;
83
-
84
67
  if (prevProps.session !== session) {
85
68
  this.stopListening();
86
- this.startListening(); // clear logs when starting a new console
87
-
69
+ this.startListening();
70
+ // clear logs when starting a new console
88
71
  this.clearLogs();
89
72
  }
90
73
  }
91
-
92
74
  componentWillUnmount() {
93
75
  this.stopFlushTimer();
94
76
  this.stopListening();
95
77
  this.destroyMonaco();
96
78
  window.removeEventListener('resize', this.handleResize);
97
79
  }
98
-
99
80
  getMenuActions(shownLogLevels) {
100
81
  var _this = this;
101
-
102
82
  var actions = [];
103
83
  actions.push({
104
84
  menuElement: /*#__PURE__*/React.createElement("div", {
@@ -107,7 +87,6 @@ class LogView extends PureComponent {
107
87
  group: 1,
108
88
  order: 10
109
89
  });
110
-
111
90
  var _loop = function _loop(i) {
112
91
  var logLevel = LogView.AllLogLevels[i];
113
92
  var on = shownLogLevels[logLevel] != null ? shownLogLevels[logLevel] : false;
@@ -127,11 +106,9 @@ class LogView extends PureComponent {
127
106
  })
128
107
  });
129
108
  };
130
-
131
109
  for (var i = 0; i < LogView.AllLogLevels.length; i += 1) {
132
110
  _loop(i);
133
111
  }
134
-
135
112
  actions.push({
136
113
  group: 1,
137
114
  order: 1000,
@@ -148,35 +125,29 @@ class LogView extends PureComponent {
148
125
  });
149
126
  return actions;
150
127
  }
151
-
152
128
  resetLogLevels() {
153
129
  var shownLogLevels = {};
154
-
155
130
  for (var i = 0; i < LogView.AllLogLevels.length; i += 1) {
156
131
  var logLevel = LogView.AllLogLevels[i];
157
132
  var isEnabled = LogView.DefaultLogLevels.indexOf(logLevel) >= 0;
158
133
  shownLogLevels[logLevel] = isEnabled;
159
134
  }
160
-
161
135
  this.setState({
162
136
  shownLogLevels
163
137
  });
164
138
  }
165
-
166
139
  startListening() {
167
140
  var {
168
141
  session
169
142
  } = this.props;
170
143
  this.cancelListener = session.onLogMessage(this.handleLogMessage);
171
144
  }
172
-
173
145
  stopListening() {
174
146
  if (this.cancelListener != null) {
175
147
  this.cancelListener();
176
148
  this.cancelListener = undefined;
177
149
  }
178
150
  }
179
-
180
151
  initMonaco() {
181
152
  assertNotNull(this.editorContainer);
182
153
  this.editor = monaco.editor.create(this.editorContainer, {
@@ -197,80 +168,72 @@ class LogView extends PureComponent {
197
168
  scrollBeyondLastLine: false,
198
169
  value: '',
199
170
  wordWrap: 'on'
200
- }); // When find widget is open, escape key closes it.
201
- // Instead, capture it and do nothing. Same for shift-escape.
171
+ });
202
172
 
173
+ // When find widget is open, escape key closes it.
174
+ // Instead, capture it and do nothing. Same for shift-escape.
203
175
  this.editor.addCommand(monaco.KeyCode.Escape, () => undefined);
204
- this.editor.addCommand( // eslint-disable-next-line no-bitwise
205
- monaco.KeyMod.Shift | monaco.KeyCode.Escape, () => undefined); // Restore regular escape to clear selection, when editorText has focus.
176
+ this.editor.addCommand(
177
+ // eslint-disable-next-line no-bitwise
178
+ monaco.KeyMod.Shift | monaco.KeyCode.Escape, () => undefined);
206
179
 
180
+ // Restore regular escape to clear selection, when editorText has focus.
207
181
  this.editor.addCommand(monaco.KeyCode.Escape, () => {
208
182
  var _this$editor, _this$editor2;
209
-
210
183
  var position = (_this$editor = this.editor) === null || _this$editor === void 0 ? void 0 : _this$editor.getPosition();
211
184
  assertNotNull(position);
212
185
  (_this$editor2 = this.editor) === null || _this$editor2 === void 0 ? void 0 : _this$editor2.setPosition(position);
213
186
  }, 'findWidgetVisible && editorTextFocus');
214
- this.editor.addCommand( // eslint-disable-next-line no-bitwise
187
+ this.editor.addCommand(
188
+ // eslint-disable-next-line no-bitwise
215
189
  monaco.KeyMod.Shift | monaco.KeyCode.Escape, () => {
216
190
  var _this$editor3, _this$editor4;
217
-
218
191
  var position = (_this$editor3 = this.editor) === null || _this$editor3 === void 0 ? void 0 : _this$editor3.getPosition();
219
192
  assertNotNull(position);
220
193
  (_this$editor4 = this.editor) === null || _this$editor4 === void 0 ? void 0 : _this$editor4.setPosition(position);
221
194
  }, 'findWidgetVisible && editorTextFocus');
222
195
  }
223
-
224
196
  destroyMonaco() {
225
197
  if (this.editor) {
226
198
  this.editor.dispose();
227
199
  this.editor = undefined;
228
200
  }
229
201
  }
230
-
231
202
  triggerFindWidget() {
232
203
  var _this$editor5, _this$editor6;
233
-
234
204
  // The actions.find action can no longer be triggered when the editor is not in focus, with monaco 0.22.x.
235
205
  // As a workaround, just focus the editor before triggering the action
236
206
  // https://github.com/microsoft/monaco-editor/issues/2355
237
207
  (_this$editor5 = this.editor) === null || _this$editor5 === void 0 ? void 0 : _this$editor5.focus();
238
208
  (_this$editor6 = this.editor) === null || _this$editor6 === void 0 ? void 0 : _this$editor6.trigger('keyboard', 'actions.find', undefined);
239
209
  }
240
-
241
210
  toggleAll() {
242
211
  var {
243
212
  shownLogLevels
244
213
  } = this.state;
245
214
  var isAllEnabled = true;
246
-
247
215
  for (var i = 0; i < LogView.AllLogLevels.length; i += 1) {
248
216
  var logLevel = LogView.AllLogLevels[i];
249
-
250
217
  if (!shownLogLevels[logLevel]) {
251
218
  isAllEnabled = false;
252
219
  break;
253
220
  }
254
221
  }
255
-
256
222
  if (isAllEnabled) {
257
223
  this.setState({
258
224
  shownLogLevels: {}
259
225
  });
260
226
  } else {
261
227
  var updatedLogLevels = {};
262
-
263
228
  for (var _i = 0; _i < LogView.AllLogLevels.length; _i += 1) {
264
229
  var _logLevel = LogView.AllLogLevels[_i];
265
230
  updatedLogLevels[_logLevel] = true;
266
231
  }
267
-
268
232
  this.setState({
269
233
  shownLogLevels: updatedLogLevels
270
234
  });
271
235
  }
272
236
  }
273
-
274
237
  toggleLogLevel(logLevel) {
275
238
  var {
276
239
  shownLogLevels
@@ -280,7 +243,6 @@ class LogView extends PureComponent {
280
243
  updatedLogLevels[logLevel] = !isEnabled;
281
244
  this.updateLogLevels(updatedLogLevels);
282
245
  }
283
-
284
246
  updateLogLevels(updatedLogLevels) {
285
247
  var {
286
248
  shownLogLevels
@@ -290,12 +252,10 @@ class LogView extends PureComponent {
290
252
  shownLogLevels
291
253
  });
292
254
  }
293
-
294
255
  appendLogText(text) {
295
256
  if (!this.editor) {
296
257
  return;
297
258
  }
298
-
299
259
  var model = this.editor.getModel();
300
260
  var line = model === null || model === void 0 ? void 0 : model.getLineCount();
301
261
  assertNotNull(line);
@@ -303,7 +263,6 @@ class LogView extends PureComponent {
303
263
  assertNotNull(column);
304
264
  var isBottomVisible = this.isBottomVisible();
305
265
  var edits = [];
306
-
307
266
  if (column > 0) {
308
267
  edits.push({
309
268
  range: {
@@ -318,7 +277,6 @@ class LogView extends PureComponent {
318
277
  line += 1;
319
278
  column = 0;
320
279
  }
321
-
322
280
  edits.push({
323
281
  range: {
324
282
  startLineNumber: line,
@@ -330,195 +288,153 @@ class LogView extends PureComponent {
330
288
  forceMoveMarkers: true
331
289
  });
332
290
  model === null || model === void 0 ? void 0 : model.applyEdits(edits);
333
-
334
291
  if (isBottomVisible) {
335
292
  var lineCount = model === null || model === void 0 ? void 0 : model.getLineCount();
336
293
  assertNotNull(lineCount);
337
294
  this.editor.revealLine(lineCount, 1);
338
295
  }
339
296
  }
297
+
340
298
  /**
341
299
  * Refresh the contents of the log component with the updated filter text
342
300
  */
343
-
344
-
345
301
  refreshLogText() {
346
302
  if (!this.editor) {
347
303
  return;
348
304
  }
349
-
350
305
  this.truncateLogIfNecessary();
351
306
  var {
352
307
  shownLogLevels
353
308
  } = this.state;
354
309
  var isBottomVisible = this.isBottomVisible();
355
310
  var text = '';
356
-
357
311
  for (var i = 0; i < this.messages.length; i += 1) {
358
312
  var message = this.messages[i];
359
-
360
313
  if (shownLogLevels[message.logLevel]) {
361
314
  var logText = LogView.getLogText(message);
362
-
363
315
  if (logText.length > 0) {
364
316
  text += logText;
365
-
366
317
  if (logText.charAt(logText.length - 1) !== '\n') {
367
318
  text += '\n';
368
319
  }
369
320
  }
370
321
  }
371
322
  }
372
-
373
323
  text = text.trimRight();
374
324
  this.editor.setValue(text);
375
-
376
325
  if (isBottomVisible) {
377
326
  var _this$editor$getModel;
378
-
379
327
  var line = (_this$editor$getModel = this.editor.getModel()) === null || _this$editor$getModel === void 0 ? void 0 : _this$editor$getModel.getLineCount();
380
328
  assertNotNull(line);
381
329
  this.editor.revealLine(line, 1);
382
330
  }
383
-
384
331
  this.stopFlushTimer();
385
332
  this.bufferedMessages = [];
386
333
  }
387
-
388
334
  truncateLogIfNecessary() {
389
335
  if (this.messages.length > LogView.maxLogSize) {
390
336
  this.messages = this.messages.splice(this.messages.length - LogView.truncateSize);
391
337
  }
392
338
  }
393
-
394
339
  scrollToBottom() {
395
340
  var _this$editor7, _this$editor7$getMode, _this$editor7$getMode2;
396
-
397
341
  if (!this.editor) {
398
342
  return;
399
343
  }
400
-
401
344
  var line = (_this$editor7 = this.editor) === null || _this$editor7 === void 0 ? void 0 : (_this$editor7$getMode = _this$editor7.getModel) === null || _this$editor7$getMode === void 0 ? void 0 : (_this$editor7$getMode2 = _this$editor7$getMode.call(_this$editor7)) === null || _this$editor7$getMode2 === void 0 ? void 0 : _this$editor7$getMode2.getLineCount();
402
345
  assertNotNull(line);
403
346
  this.editor.revealLine(line, 1);
404
347
  }
405
-
406
348
  isBottomVisible() {
407
349
  if (!this.editor) {
408
350
  return true;
409
351
  }
410
-
411
352
  var model = this.editor.getModel();
412
353
  var line = model === null || model === void 0 ? void 0 : model.getLineCount();
413
354
  assertNotNull(line);
414
355
  return this.isLineVisible(line);
415
356
  }
416
-
417
357
  isLineVisible(line) {
418
358
  var _this$editor8;
419
-
420
359
  var visibleRanges = (_this$editor8 = this.editor) === null || _this$editor8 === void 0 ? void 0 : _this$editor8.getVisibleRanges();
421
-
422
360
  if (visibleRanges == null || visibleRanges.length === 0) {
423
361
  return false;
424
362
  }
425
-
426
363
  for (var i = 0; i < visibleRanges.length; i += 1) {
427
364
  var range = visibleRanges[i];
428
-
429
365
  if (range.startLineNumber <= line && line <= range.endLineNumber) {
430
366
  return true;
431
367
  }
432
368
  }
433
-
434
369
  return false;
435
370
  }
436
- /** Checks if the given log message is visible with the current filters */
437
-
438
371
 
372
+ /** Checks if the given log message is visible with the current filters */
439
373
  isLogItemVisible(message) {
440
374
  var {
441
375
  shownLogLevels
442
376
  } = this.state;
443
377
  return shownLogLevels[message.logLevel];
444
378
  }
445
-
446
379
  flush() {
447
380
  var text = '';
448
-
449
381
  for (var i = 0; i < this.bufferedMessages.length; i += 1) {
450
382
  var message = this.bufferedMessages[i];
451
383
  var logText = LogView.getLogText(message);
452
384
  text += logText;
453
-
454
385
  if (logText.charAt(logText.length - 1) !== '\n') {
455
386
  text += '\n';
456
387
  }
457
388
  }
458
-
459
389
  this.bufferedMessages = [];
460
390
  this.appendLogText(text);
461
391
  }
462
-
463
392
  queue(message) {
464
393
  this.bufferedMessages.push(message);
465
-
466
394
  if (this.bufferedMessages.length === 1) {
467
395
  this.flushTimer = setTimeout(this.handleFlushTimeout, LogView.bufferTimeout);
468
396
  }
469
397
  }
470
-
471
398
  stopFlushTimer() {
472
399
  if (this.flushTimer) {
473
400
  clearTimeout(this.flushTimer);
474
401
  this.flushTimer = undefined;
475
402
  }
476
403
  }
477
-
478
404
  updateDimensions() {
479
405
  if (this.editor) {
480
406
  this.editor.layout();
481
407
  }
482
408
  }
483
-
484
409
  handleClearClick() {
485
410
  this.clearLogs();
486
411
  }
487
-
488
412
  clearLogs() {
489
413
  this.messages = [];
490
414
  this.refreshLogText();
491
415
  }
492
-
493
416
  handleFlushTimeout() {
494
417
  this.stopFlushTimer();
495
418
  this.flush();
496
419
  }
497
-
498
420
  handleLogMessage(message) {
499
421
  this.messages.push(message);
500
-
501
422
  if (this.editor && this.isLogItemVisible(message)) {
502
423
  this.queue(message);
503
424
  }
504
425
  }
505
-
506
426
  handleMenuItemClick(logLevel) {
507
427
  this.toggleLogLevel(logLevel);
508
428
  }
509
-
510
429
  handleResetClick() {
511
430
  this.resetLogLevels();
512
431
  }
513
-
514
432
  handleResize() {
515
433
  this.updateDimensions();
516
434
  }
517
-
518
435
  handleToggleAllClick() {
519
436
  this.toggleAll();
520
437
  }
521
-
522
438
  render() {
523
439
  var popperOptions = {
524
440
  placement: 'bottom-end'
@@ -542,7 +458,8 @@ class LogView extends PureComponent {
542
458
  className: "btn-link-icon btn-overflow",
543
459
  icon: vsGear,
544
460
  tooltip: "Log Settings",
545
- onClick: () => {// no-op: click is handled in `DropdownMenu'
461
+ onClick: () => {
462
+ // no-op: click is handled in `DropdownMenu'
546
463
  }
547
464
  }, /*#__PURE__*/React.createElement(DropdownMenu, {
548
465
  actions: actions,
@@ -555,18 +472,11 @@ class LogView extends PureComponent {
555
472
  }
556
473
  }));
557
474
  }
558
-
559
475
  }
560
-
561
476
  _defineProperty(LogView, "DefaultLogLevels", [LogLevel.STDOUT, LogLevel.ERROR, LogLevel.FATAL, LogLevel.STDERR, LogLevel.WARN]);
562
-
563
477
  _defineProperty(LogView, "AllLogLevels", [LogLevel.INFO, LogLevel.STDOUT, LogLevel.ERROR, LogLevel.FATAL, LogLevel.STDERR, LogLevel.WARN, LogLevel.DEBUG, LogLevel.TRACE]);
564
-
565
478
  _defineProperty(LogView, "bufferTimeout", 16);
566
-
567
479
  _defineProperty(LogView, "maxLogSize", 131072);
568
-
569
480
  _defineProperty(LogView, "truncateSize", 65536);
570
-
571
481
  export default LogView;
572
482
  //# sourceMappingURL=LogView.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LogView.js","names":["React","PureComponent","Button","DropdownMenu","vsGear","dhTrashUndo","assertNotNull","monaco","ConsoleUtils","LogLevel","LogLevelMenuItem","LogView","getLogText","logItem","date","Date","micros","timestamp","formatTimestamp","logLevel","message","constructor","props","handleClearClick","bind","handleFlushTimeout","handleLogMessage","handleMenuItemClick","handleResetClick","handleResize","handleToggleAllClick","logLevelMenuItems","editorContainer","bufferedMessages","messages","state","shownLogLevels","componentDidMount","resetLogLevels","initMonaco","startListening","window","addEventListener","componentDidUpdate","prevProps","prevState","updateDimensions","refreshLogText","session","stopListening","clearLogs","componentWillUnmount","stopFlushTimer","destroyMonaco","removeEventListener","getMenuActions","actions","push","menuElement","group","order","i","AllLogLevels","on","title","element","length","isEnabled","DefaultLogLevels","indexOf","setState","cancelListener","onLogMessage","undefined","editor","create","copyWithSyntaxHighlighting","fixedOverflowWidgets","folding","fontFamily","glyphMargin","language","lineDecorationsWidth","lineNumbers","lineNumbersMinChars","minimap","enabled","readOnly","renderLineHighlight","scrollBeyondLastLine","value","wordWrap","addCommand","KeyCode","Escape","KeyMod","Shift","position","getPosition","setPosition","dispose","triggerFindWidget","focus","trigger","toggleAll","isAllEnabled","updatedLogLevels","toggleLogLevel","updateLogLevels","appendLogText","text","model","getModel","line","getLineCount","column","getLineLength","isBottomVisible","edits","range","startLineNumber","startColumn","endLineNumber","endColumn","forceMoveMarkers","applyEdits","lineCount","revealLine","truncateLogIfNecessary","logText","charAt","trimRight","setValue","maxLogSize","splice","truncateSize","scrollToBottom","isLineVisible","visibleRanges","getVisibleRanges","isLogItemVisible","flush","queue","flushTimer","setTimeout","bufferTimeout","clearTimeout","layout","render","popperOptions","placement","STDOUT","ERROR","FATAL","STDERR","WARN","INFO","DEBUG","TRACE"],"sources":["../../src/log/LogView.tsx"],"sourcesContent":["import React, { PureComponent, ReactElement } from 'react';\nimport { Button, DropdownActions, DropdownMenu } from '@deephaven/components';\nimport { vsGear, dhTrashUndo } from '@deephaven/icons';\nimport { assertNotNull } from '@deephaven/utils';\nimport { IdeSession, LogItem } from '@deephaven/jsapi-shim';\nimport { Placement } from 'popper.js';\nimport * as monaco from 'monaco-editor';\nimport ConsoleUtils from '../common/ConsoleUtils';\nimport LogLevel from './LogLevel';\nimport './LogView.scss';\nimport LogLevelMenuItem from './LogLevelMenuItem';\n\ninterface LogViewProps {\n session: IdeSession;\n}\n\ninterface LogViewState {\n shownLogLevels: Record<string, boolean>;\n}\n/**\n * Log view contents. Uses a monaco editor to display/search the contents of the log.\n */\nclass LogView extends PureComponent<LogViewProps, LogViewState> {\n static DefaultLogLevels = [\n LogLevel.STDOUT,\n LogLevel.ERROR,\n LogLevel.FATAL,\n LogLevel.STDERR,\n LogLevel.WARN,\n ];\n\n static AllLogLevels = [\n LogLevel.INFO,\n LogLevel.STDOUT,\n LogLevel.ERROR,\n LogLevel.FATAL,\n LogLevel.STDERR,\n LogLevel.WARN,\n LogLevel.DEBUG,\n LogLevel.TRACE,\n ];\n\n /** ms to buffer log messages before processing them */\n static bufferTimeout = 16;\n\n /** Maximum number of messages to store in the log */\n static maxLogSize = 131072;\n\n static truncateSize = 65536;\n\n static getLogText(logItem: LogItem): string {\n const date = new Date(logItem.micros / 1000);\n const timestamp = ConsoleUtils.formatTimestamp(date);\n return `${timestamp} ${logItem.logLevel} ${logItem.message}`;\n }\n\n constructor(props: LogViewProps) {\n super(props);\n\n this.handleClearClick = this.handleClearClick.bind(this);\n this.handleFlushTimeout = this.handleFlushTimeout.bind(this);\n this.handleLogMessage = this.handleLogMessage.bind(this);\n this.handleMenuItemClick = this.handleMenuItemClick.bind(this);\n this.handleResetClick = this.handleResetClick.bind(this);\n this.handleResize = this.handleResize.bind(this);\n this.handleToggleAllClick = this.handleToggleAllClick.bind(this);\n\n this.logLevelMenuItems = {};\n\n this.editorContainer = null;\n\n this.bufferedMessages = [];\n this.messages = [];\n\n this.state = {\n shownLogLevels: {},\n };\n }\n\n componentDidMount(): void {\n this.resetLogLevels();\n this.initMonaco();\n this.startListening();\n\n window.addEventListener('resize', this.handleResize);\n }\n\n componentDidUpdate(prevProps: LogViewProps, prevState: LogViewState): void {\n this.updateDimensions();\n\n const { shownLogLevels } = this.state;\n if (prevState.shownLogLevels !== shownLogLevels) {\n this.refreshLogText();\n }\n\n const { session } = this.props;\n if (prevProps.session !== session) {\n this.stopListening();\n this.startListening();\n // clear logs when starting a new console\n this.clearLogs();\n }\n }\n\n componentWillUnmount(): void {\n this.stopFlushTimer();\n this.stopListening();\n this.destroyMonaco();\n\n window.removeEventListener('resize', this.handleResize);\n }\n\n cancelListener?: () => void | null;\n\n editor?: monaco.editor.IStandaloneCodeEditor;\n\n editorContainer: HTMLDivElement | null;\n\n logLevelMenuItems: Record<string, LogLevelMenuItem>;\n\n flushTimer?: ReturnType<typeof setTimeout>;\n\n bufferedMessages: LogItem[];\n\n messages: LogItem[];\n\n getMenuActions(shownLogLevels: Record<string, boolean>): DropdownActions {\n const actions = [];\n\n actions.push({\n menuElement: (\n <div className=\"log-level-menu-title\">Display Log Levels</div>\n ),\n group: 1,\n order: 10,\n });\n\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n const on =\n shownLogLevels[logLevel] != null ? shownLogLevels[logLevel] : false;\n actions.push({\n title: logLevel,\n group: 1,\n order: i + 100,\n\n menuElement: (\n <LogLevelMenuItem\n logLevel={logLevel}\n on={on}\n onClick={this.handleMenuItemClick}\n ref={element => {\n if (element != null) {\n this.logLevelMenuItems[logLevel] = element;\n }\n }}\n />\n ),\n });\n }\n\n actions.push({\n group: 1,\n order: 1000,\n menuElement: (\n <div className=\"log-level-menu-controls\">\n <Button\n kind=\"ghost\"\n className=\"log-level-toggle-all\"\n onClick={this.handleToggleAllClick}\n >\n Toggle All\n </Button>\n <Button kind=\"ghost\" onClick={this.handleResetClick}>\n Reset\n </Button>\n </div>\n ),\n });\n\n return actions;\n }\n\n resetLogLevels(): void {\n const shownLogLevels: Record<string, boolean> = {};\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n const isEnabled = LogView.DefaultLogLevels.indexOf(logLevel) >= 0;\n shownLogLevels[logLevel] = isEnabled;\n }\n\n this.setState({ shownLogLevels });\n }\n\n startListening(): void {\n const { session } = this.props;\n this.cancelListener = session.onLogMessage(this.handleLogMessage);\n }\n\n stopListening(): void {\n if (this.cancelListener != null) {\n this.cancelListener();\n this.cancelListener = undefined;\n }\n }\n\n initMonaco(): void {\n assertNotNull(this.editorContainer);\n this.editor = monaco.editor.create(this.editorContainer, {\n copyWithSyntaxHighlighting: false,\n fixedOverflowWidgets: true,\n folding: false,\n fontFamily: 'Fira Mono',\n glyphMargin: false,\n language: 'log',\n lineDecorationsWidth: 0,\n lineNumbers: 'off',\n lineNumbersMinChars: 0,\n minimap: { enabled: false },\n readOnly: true,\n renderLineHighlight: 'none',\n scrollBeyondLastLine: false,\n value: '',\n wordWrap: 'on',\n });\n\n // When find widget is open, escape key closes it.\n // Instead, capture it and do nothing. Same for shift-escape.\n this.editor.addCommand(monaco.KeyCode.Escape, () => undefined);\n this.editor.addCommand(\n // eslint-disable-next-line no-bitwise\n monaco.KeyMod.Shift | monaco.KeyCode.Escape,\n () => undefined\n );\n\n // Restore regular escape to clear selection, when editorText has focus.\n this.editor.addCommand(\n monaco.KeyCode.Escape,\n () => {\n const position = this.editor?.getPosition();\n assertNotNull(position);\n this.editor?.setPosition(position);\n },\n 'findWidgetVisible && editorTextFocus'\n );\n\n this.editor.addCommand(\n // eslint-disable-next-line no-bitwise\n monaco.KeyMod.Shift | monaco.KeyCode.Escape,\n () => {\n const position = this.editor?.getPosition();\n assertNotNull(position);\n this.editor?.setPosition(position);\n },\n 'findWidgetVisible && editorTextFocus'\n );\n }\n\n destroyMonaco(): void {\n if (this.editor) {\n this.editor.dispose();\n this.editor = undefined;\n }\n }\n\n triggerFindWidget(): void {\n // The actions.find action can no longer be triggered when the editor is not in focus, with monaco 0.22.x.\n // As a workaround, just focus the editor before triggering the action\n // https://github.com/microsoft/monaco-editor/issues/2355\n this.editor?.focus();\n this.editor?.trigger('keyboard', 'actions.find', undefined);\n }\n\n toggleAll(): void {\n const { shownLogLevels } = this.state;\n let isAllEnabled = true;\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n if (!shownLogLevels[logLevel]) {\n isAllEnabled = false;\n break;\n }\n }\n\n if (isAllEnabled) {\n this.setState({ shownLogLevels: {} });\n } else {\n const updatedLogLevels: Record<string, boolean> = {};\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n updatedLogLevels[logLevel] = true;\n }\n this.setState({ shownLogLevels: updatedLogLevels });\n }\n }\n\n toggleLogLevel(logLevel: string): void {\n const { shownLogLevels } = this.state;\n const isEnabled = shownLogLevels[logLevel];\n const updatedLogLevels: Record<string, boolean> = {};\n updatedLogLevels[logLevel] = !isEnabled;\n this.updateLogLevels(updatedLogLevels);\n }\n\n updateLogLevels(updatedLogLevels: Record<string, boolean>): void {\n let { shownLogLevels } = this.state;\n shownLogLevels = { ...shownLogLevels, ...updatedLogLevels };\n this.setState({ shownLogLevels });\n }\n\n appendLogText(text: string): void {\n if (!this.editor) {\n return;\n }\n\n const model = this.editor.getModel();\n let line = model?.getLineCount();\n assertNotNull(line);\n let column = model?.getLineLength(line);\n assertNotNull(column);\n const isBottomVisible = this.isBottomVisible();\n\n const edits = [];\n if (column > 0) {\n edits.push({\n range: {\n startLineNumber: line,\n startColumn: column + 1,\n endLineNumber: line,\n endColumn: column + 1,\n },\n text: '\\n',\n forceMoveMarkers: true,\n });\n line += 1;\n column = 0;\n }\n\n edits.push({\n range: {\n startLineNumber: line,\n startColumn: column,\n endLineNumber: line,\n endColumn: column,\n },\n text,\n forceMoveMarkers: true,\n });\n\n model?.applyEdits(edits);\n\n if (isBottomVisible) {\n const lineCount = model?.getLineCount();\n assertNotNull(lineCount);\n this.editor.revealLine(lineCount, 1);\n }\n }\n\n /**\n * Refresh the contents of the log component with the updated filter text\n */\n refreshLogText(): void {\n if (!this.editor) {\n return;\n }\n\n this.truncateLogIfNecessary();\n\n const { shownLogLevels } = this.state;\n const isBottomVisible = this.isBottomVisible();\n\n let text = '';\n for (let i = 0; i < this.messages.length; i += 1) {\n const message = this.messages[i];\n if (shownLogLevels[message.logLevel]) {\n const logText = LogView.getLogText(message);\n if (logText.length > 0) {\n text += logText;\n if (logText.charAt(logText.length - 1) !== '\\n') {\n text += '\\n';\n }\n }\n }\n }\n text = text.trimRight();\n\n this.editor.setValue(text);\n\n if (isBottomVisible) {\n const line = this.editor.getModel()?.getLineCount();\n assertNotNull(line);\n this.editor.revealLine(line, 1);\n }\n\n this.stopFlushTimer();\n this.bufferedMessages = [];\n }\n\n truncateLogIfNecessary(): void {\n if (this.messages.length > LogView.maxLogSize) {\n this.messages = this.messages.splice(\n this.messages.length - LogView.truncateSize\n );\n }\n }\n\n scrollToBottom(): void {\n if (!this.editor) {\n return;\n }\n\n const line = this.editor?.getModel?.()?.getLineCount();\n assertNotNull(line);\n this.editor.revealLine(line, 1);\n }\n\n isBottomVisible(): boolean {\n if (!this.editor) {\n return true;\n }\n\n const model = this.editor.getModel();\n const line = model?.getLineCount();\n\n assertNotNull(line);\n return this.isLineVisible(line);\n }\n\n isLineVisible(line: number): boolean {\n const visibleRanges = this.editor?.getVisibleRanges();\n if (visibleRanges == null || visibleRanges.length === 0) {\n return false;\n }\n\n for (let i = 0; i < visibleRanges.length; i += 1) {\n const range = visibleRanges[i];\n if (range.startLineNumber <= line && line <= range.endLineNumber) {\n return true;\n }\n }\n\n return false;\n }\n\n /** Checks if the given log message is visible with the current filters */\n isLogItemVisible(message: LogItem): boolean {\n const { shownLogLevels } = this.state;\n return shownLogLevels[message.logLevel];\n }\n\n flush(): void {\n let text = '';\n for (let i = 0; i < this.bufferedMessages.length; i += 1) {\n const message = this.bufferedMessages[i];\n const logText = LogView.getLogText(message);\n text += logText;\n if (logText.charAt(logText.length - 1) !== '\\n') {\n text += '\\n';\n }\n }\n\n this.bufferedMessages = [];\n\n this.appendLogText(text);\n }\n\n queue(message: LogItem): void {\n this.bufferedMessages.push(message);\n if (this.bufferedMessages.length === 1) {\n this.flushTimer = setTimeout(\n this.handleFlushTimeout,\n LogView.bufferTimeout\n );\n }\n }\n\n stopFlushTimer(): void {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = undefined;\n }\n }\n\n updateDimensions(): void {\n if (this.editor) {\n this.editor.layout();\n }\n }\n\n handleClearClick(): void {\n this.clearLogs();\n }\n\n clearLogs(): void {\n this.messages = [];\n this.refreshLogText();\n }\n\n handleFlushTimeout(): void {\n this.stopFlushTimer();\n this.flush();\n }\n\n handleLogMessage(message: LogItem): void {\n this.messages.push(message);\n\n if (this.editor && this.isLogItemVisible(message)) {\n this.queue(message);\n }\n }\n\n handleMenuItemClick(logLevel: string): void {\n this.toggleLogLevel(logLevel);\n }\n\n handleResetClick(): void {\n this.resetLogLevels();\n }\n\n handleResize(): void {\n this.updateDimensions();\n }\n\n handleToggleAllClick(): void {\n this.toggleAll();\n }\n\n render(): ReactElement {\n const popperOptions = { placement: 'bottom-end' as Placement };\n const { shownLogLevels } = this.state;\n const actions = this.getMenuActions(shownLogLevels);\n return (\n <div className=\"log-pane h-100 w-100\">\n <div className=\"log-pane-menu\">\n <Button\n kind=\"ghost\"\n className=\"btn-clear-logs\"\n onClick={this.handleClearClick}\n icon={dhTrashUndo}\n tooltip=\"Clear log\"\n />\n <Button\n kind=\"ghost\"\n className=\"btn-link-icon btn-overflow\"\n icon={vsGear}\n tooltip=\"Log Settings\"\n onClick={() => {\n // no-op: click is handled in `DropdownMenu'\n }}\n >\n <DropdownMenu\n actions={actions}\n popperClassName=\"log-level-menu-popper\"\n popperOptions={popperOptions}\n />\n </Button>\n </div>\n <div\n className=\"log-pane-editor h-100 w-100\"\n ref={editorContainer => {\n this.editorContainer = editorContainer;\n }}\n />\n </div>\n );\n }\n}\n\nexport default LogView;\n"],"mappings":"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"}
1
+ {"version":3,"file":"LogView.js","names":["React","PureComponent","Button","DropdownMenu","vsGear","dhTrashUndo","assertNotNull","monaco","ConsoleUtils","LogLevel","LogLevelMenuItem","LogView","getLogText","logItem","date","Date","micros","timestamp","formatTimestamp","logLevel","message","constructor","props","handleClearClick","bind","handleFlushTimeout","handleLogMessage","handleMenuItemClick","handleResetClick","handleResize","handleToggleAllClick","logLevelMenuItems","editorContainer","bufferedMessages","messages","state","shownLogLevels","componentDidMount","resetLogLevels","initMonaco","startListening","window","addEventListener","componentDidUpdate","prevProps","prevState","updateDimensions","refreshLogText","session","stopListening","clearLogs","componentWillUnmount","stopFlushTimer","destroyMonaco","removeEventListener","getMenuActions","actions","push","menuElement","group","order","i","AllLogLevels","on","title","element","length","isEnabled","DefaultLogLevels","indexOf","setState","cancelListener","onLogMessage","undefined","editor","create","copyWithSyntaxHighlighting","fixedOverflowWidgets","folding","fontFamily","glyphMargin","language","lineDecorationsWidth","lineNumbers","lineNumbersMinChars","minimap","enabled","readOnly","renderLineHighlight","scrollBeyondLastLine","value","wordWrap","addCommand","KeyCode","Escape","KeyMod","Shift","position","getPosition","setPosition","dispose","triggerFindWidget","focus","trigger","toggleAll","isAllEnabled","updatedLogLevels","toggleLogLevel","updateLogLevels","appendLogText","text","model","getModel","line","getLineCount","column","getLineLength","isBottomVisible","edits","range","startLineNumber","startColumn","endLineNumber","endColumn","forceMoveMarkers","applyEdits","lineCount","revealLine","truncateLogIfNecessary","logText","charAt","trimRight","setValue","maxLogSize","splice","truncateSize","scrollToBottom","isLineVisible","visibleRanges","getVisibleRanges","isLogItemVisible","flush","queue","flushTimer","setTimeout","bufferTimeout","clearTimeout","layout","render","popperOptions","placement","STDOUT","ERROR","FATAL","STDERR","WARN","INFO","DEBUG","TRACE"],"sources":["../../src/log/LogView.tsx"],"sourcesContent":["import React, { PureComponent, ReactElement } from 'react';\nimport { Button, DropdownActions, DropdownMenu } from '@deephaven/components';\nimport { vsGear, dhTrashUndo } from '@deephaven/icons';\nimport { assertNotNull } from '@deephaven/utils';\nimport { IdeSession, LogItem } from '@deephaven/jsapi-shim';\nimport { Placement } from 'popper.js';\nimport * as monaco from 'monaco-editor';\nimport ConsoleUtils from '../common/ConsoleUtils';\nimport LogLevel from './LogLevel';\nimport './LogView.scss';\nimport LogLevelMenuItem from './LogLevelMenuItem';\n\ninterface LogViewProps {\n session: IdeSession;\n}\n\ninterface LogViewState {\n shownLogLevels: Record<string, boolean>;\n}\n/**\n * Log view contents. Uses a monaco editor to display/search the contents of the log.\n */\nclass LogView extends PureComponent<LogViewProps, LogViewState> {\n static DefaultLogLevels = [\n LogLevel.STDOUT,\n LogLevel.ERROR,\n LogLevel.FATAL,\n LogLevel.STDERR,\n LogLevel.WARN,\n ];\n\n static AllLogLevels = [\n LogLevel.INFO,\n LogLevel.STDOUT,\n LogLevel.ERROR,\n LogLevel.FATAL,\n LogLevel.STDERR,\n LogLevel.WARN,\n LogLevel.DEBUG,\n LogLevel.TRACE,\n ];\n\n /** ms to buffer log messages before processing them */\n static bufferTimeout = 16;\n\n /** Maximum number of messages to store in the log */\n static maxLogSize = 131072;\n\n static truncateSize = 65536;\n\n static getLogText(logItem: LogItem): string {\n const date = new Date(logItem.micros / 1000);\n const timestamp = ConsoleUtils.formatTimestamp(date);\n return `${timestamp} ${logItem.logLevel} ${logItem.message}`;\n }\n\n constructor(props: LogViewProps) {\n super(props);\n\n this.handleClearClick = this.handleClearClick.bind(this);\n this.handleFlushTimeout = this.handleFlushTimeout.bind(this);\n this.handleLogMessage = this.handleLogMessage.bind(this);\n this.handleMenuItemClick = this.handleMenuItemClick.bind(this);\n this.handleResetClick = this.handleResetClick.bind(this);\n this.handleResize = this.handleResize.bind(this);\n this.handleToggleAllClick = this.handleToggleAllClick.bind(this);\n\n this.logLevelMenuItems = {};\n\n this.editorContainer = null;\n\n this.bufferedMessages = [];\n this.messages = [];\n\n this.state = {\n shownLogLevels: {},\n };\n }\n\n componentDidMount(): void {\n this.resetLogLevels();\n this.initMonaco();\n this.startListening();\n\n window.addEventListener('resize', this.handleResize);\n }\n\n componentDidUpdate(prevProps: LogViewProps, prevState: LogViewState): void {\n this.updateDimensions();\n\n const { shownLogLevels } = this.state;\n if (prevState.shownLogLevels !== shownLogLevels) {\n this.refreshLogText();\n }\n\n const { session } = this.props;\n if (prevProps.session !== session) {\n this.stopListening();\n this.startListening();\n // clear logs when starting a new console\n this.clearLogs();\n }\n }\n\n componentWillUnmount(): void {\n this.stopFlushTimer();\n this.stopListening();\n this.destroyMonaco();\n\n window.removeEventListener('resize', this.handleResize);\n }\n\n cancelListener?: () => void | null;\n\n editor?: monaco.editor.IStandaloneCodeEditor;\n\n editorContainer: HTMLDivElement | null;\n\n logLevelMenuItems: Record<string, LogLevelMenuItem>;\n\n flushTimer?: ReturnType<typeof setTimeout>;\n\n bufferedMessages: LogItem[];\n\n messages: LogItem[];\n\n getMenuActions(shownLogLevels: Record<string, boolean>): DropdownActions {\n const actions = [];\n\n actions.push({\n menuElement: (\n <div className=\"log-level-menu-title\">Display Log Levels</div>\n ),\n group: 1,\n order: 10,\n });\n\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n const on =\n shownLogLevels[logLevel] != null ? shownLogLevels[logLevel] : false;\n actions.push({\n title: logLevel,\n group: 1,\n order: i + 100,\n\n menuElement: (\n <LogLevelMenuItem\n logLevel={logLevel}\n on={on}\n onClick={this.handleMenuItemClick}\n ref={element => {\n if (element != null) {\n this.logLevelMenuItems[logLevel] = element;\n }\n }}\n />\n ),\n });\n }\n\n actions.push({\n group: 1,\n order: 1000,\n menuElement: (\n <div className=\"log-level-menu-controls\">\n <Button\n kind=\"ghost\"\n className=\"log-level-toggle-all\"\n onClick={this.handleToggleAllClick}\n >\n Toggle All\n </Button>\n <Button kind=\"ghost\" onClick={this.handleResetClick}>\n Reset\n </Button>\n </div>\n ),\n });\n\n return actions;\n }\n\n resetLogLevels(): void {\n const shownLogLevels: Record<string, boolean> = {};\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n const isEnabled = LogView.DefaultLogLevels.indexOf(logLevel) >= 0;\n shownLogLevels[logLevel] = isEnabled;\n }\n\n this.setState({ shownLogLevels });\n }\n\n startListening(): void {\n const { session } = this.props;\n this.cancelListener = session.onLogMessage(this.handleLogMessage);\n }\n\n stopListening(): void {\n if (this.cancelListener != null) {\n this.cancelListener();\n this.cancelListener = undefined;\n }\n }\n\n initMonaco(): void {\n assertNotNull(this.editorContainer);\n this.editor = monaco.editor.create(this.editorContainer, {\n copyWithSyntaxHighlighting: false,\n fixedOverflowWidgets: true,\n folding: false,\n fontFamily: 'Fira Mono',\n glyphMargin: false,\n language: 'log',\n lineDecorationsWidth: 0,\n lineNumbers: 'off',\n lineNumbersMinChars: 0,\n minimap: { enabled: false },\n readOnly: true,\n renderLineHighlight: 'none',\n scrollBeyondLastLine: false,\n value: '',\n wordWrap: 'on',\n });\n\n // When find widget is open, escape key closes it.\n // Instead, capture it and do nothing. Same for shift-escape.\n this.editor.addCommand(monaco.KeyCode.Escape, () => undefined);\n this.editor.addCommand(\n // eslint-disable-next-line no-bitwise\n monaco.KeyMod.Shift | monaco.KeyCode.Escape,\n () => undefined\n );\n\n // Restore regular escape to clear selection, when editorText has focus.\n this.editor.addCommand(\n monaco.KeyCode.Escape,\n () => {\n const position = this.editor?.getPosition();\n assertNotNull(position);\n this.editor?.setPosition(position);\n },\n 'findWidgetVisible && editorTextFocus'\n );\n\n this.editor.addCommand(\n // eslint-disable-next-line no-bitwise\n monaco.KeyMod.Shift | monaco.KeyCode.Escape,\n () => {\n const position = this.editor?.getPosition();\n assertNotNull(position);\n this.editor?.setPosition(position);\n },\n 'findWidgetVisible && editorTextFocus'\n );\n }\n\n destroyMonaco(): void {\n if (this.editor) {\n this.editor.dispose();\n this.editor = undefined;\n }\n }\n\n triggerFindWidget(): void {\n // The actions.find action can no longer be triggered when the editor is not in focus, with monaco 0.22.x.\n // As a workaround, just focus the editor before triggering the action\n // https://github.com/microsoft/monaco-editor/issues/2355\n this.editor?.focus();\n this.editor?.trigger('keyboard', 'actions.find', undefined);\n }\n\n toggleAll(): void {\n const { shownLogLevels } = this.state;\n let isAllEnabled = true;\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n if (!shownLogLevels[logLevel]) {\n isAllEnabled = false;\n break;\n }\n }\n\n if (isAllEnabled) {\n this.setState({ shownLogLevels: {} });\n } else {\n const updatedLogLevels: Record<string, boolean> = {};\n for (let i = 0; i < LogView.AllLogLevels.length; i += 1) {\n const logLevel = LogView.AllLogLevels[i];\n updatedLogLevels[logLevel] = true;\n }\n this.setState({ shownLogLevels: updatedLogLevels });\n }\n }\n\n toggleLogLevel(logLevel: string): void {\n const { shownLogLevels } = this.state;\n const isEnabled = shownLogLevels[logLevel];\n const updatedLogLevels: Record<string, boolean> = {};\n updatedLogLevels[logLevel] = !isEnabled;\n this.updateLogLevels(updatedLogLevels);\n }\n\n updateLogLevels(updatedLogLevels: Record<string, boolean>): void {\n let { shownLogLevels } = this.state;\n shownLogLevels = { ...shownLogLevels, ...updatedLogLevels };\n this.setState({ shownLogLevels });\n }\n\n appendLogText(text: string): void {\n if (!this.editor) {\n return;\n }\n\n const model = this.editor.getModel();\n let line = model?.getLineCount();\n assertNotNull(line);\n let column = model?.getLineLength(line);\n assertNotNull(column);\n const isBottomVisible = this.isBottomVisible();\n\n const edits = [];\n if (column > 0) {\n edits.push({\n range: {\n startLineNumber: line,\n startColumn: column + 1,\n endLineNumber: line,\n endColumn: column + 1,\n },\n text: '\\n',\n forceMoveMarkers: true,\n });\n line += 1;\n column = 0;\n }\n\n edits.push({\n range: {\n startLineNumber: line,\n startColumn: column,\n endLineNumber: line,\n endColumn: column,\n },\n text,\n forceMoveMarkers: true,\n });\n\n model?.applyEdits(edits);\n\n if (isBottomVisible) {\n const lineCount = model?.getLineCount();\n assertNotNull(lineCount);\n this.editor.revealLine(lineCount, 1);\n }\n }\n\n /**\n * Refresh the contents of the log component with the updated filter text\n */\n refreshLogText(): void {\n if (!this.editor) {\n return;\n }\n\n this.truncateLogIfNecessary();\n\n const { shownLogLevels } = this.state;\n const isBottomVisible = this.isBottomVisible();\n\n let text = '';\n for (let i = 0; i < this.messages.length; i += 1) {\n const message = this.messages[i];\n if (shownLogLevels[message.logLevel]) {\n const logText = LogView.getLogText(message);\n if (logText.length > 0) {\n text += logText;\n if (logText.charAt(logText.length - 1) !== '\\n') {\n text += '\\n';\n }\n }\n }\n }\n text = text.trimRight();\n\n this.editor.setValue(text);\n\n if (isBottomVisible) {\n const line = this.editor.getModel()?.getLineCount();\n assertNotNull(line);\n this.editor.revealLine(line, 1);\n }\n\n this.stopFlushTimer();\n this.bufferedMessages = [];\n }\n\n truncateLogIfNecessary(): void {\n if (this.messages.length > LogView.maxLogSize) {\n this.messages = this.messages.splice(\n this.messages.length - LogView.truncateSize\n );\n }\n }\n\n scrollToBottom(): void {\n if (!this.editor) {\n return;\n }\n\n const line = this.editor?.getModel?.()?.getLineCount();\n assertNotNull(line);\n this.editor.revealLine(line, 1);\n }\n\n isBottomVisible(): boolean {\n if (!this.editor) {\n return true;\n }\n\n const model = this.editor.getModel();\n const line = model?.getLineCount();\n\n assertNotNull(line);\n return this.isLineVisible(line);\n }\n\n isLineVisible(line: number): boolean {\n const visibleRanges = this.editor?.getVisibleRanges();\n if (visibleRanges == null || visibleRanges.length === 0) {\n return false;\n }\n\n for (let i = 0; i < visibleRanges.length; i += 1) {\n const range = visibleRanges[i];\n if (range.startLineNumber <= line && line <= range.endLineNumber) {\n return true;\n }\n }\n\n return false;\n }\n\n /** Checks if the given log message is visible with the current filters */\n isLogItemVisible(message: LogItem): boolean {\n const { shownLogLevels } = this.state;\n return shownLogLevels[message.logLevel];\n }\n\n flush(): void {\n let text = '';\n for (let i = 0; i < this.bufferedMessages.length; i += 1) {\n const message = this.bufferedMessages[i];\n const logText = LogView.getLogText(message);\n text += logText;\n if (logText.charAt(logText.length - 1) !== '\\n') {\n text += '\\n';\n }\n }\n\n this.bufferedMessages = [];\n\n this.appendLogText(text);\n }\n\n queue(message: LogItem): void {\n this.bufferedMessages.push(message);\n if (this.bufferedMessages.length === 1) {\n this.flushTimer = setTimeout(\n this.handleFlushTimeout,\n LogView.bufferTimeout\n );\n }\n }\n\n stopFlushTimer(): void {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = undefined;\n }\n }\n\n updateDimensions(): void {\n if (this.editor) {\n this.editor.layout();\n }\n }\n\n handleClearClick(): void {\n this.clearLogs();\n }\n\n clearLogs(): void {\n this.messages = [];\n this.refreshLogText();\n }\n\n handleFlushTimeout(): void {\n this.stopFlushTimer();\n this.flush();\n }\n\n handleLogMessage(message: LogItem): void {\n this.messages.push(message);\n\n if (this.editor && this.isLogItemVisible(message)) {\n this.queue(message);\n }\n }\n\n handleMenuItemClick(logLevel: string): void {\n this.toggleLogLevel(logLevel);\n }\n\n handleResetClick(): void {\n this.resetLogLevels();\n }\n\n handleResize(): void {\n this.updateDimensions();\n }\n\n handleToggleAllClick(): void {\n this.toggleAll();\n }\n\n render(): ReactElement {\n const popperOptions = { placement: 'bottom-end' as Placement };\n const { shownLogLevels } = this.state;\n const actions = this.getMenuActions(shownLogLevels);\n return (\n <div className=\"log-pane h-100 w-100\">\n <div className=\"log-pane-menu\">\n <Button\n kind=\"ghost\"\n className=\"btn-clear-logs\"\n onClick={this.handleClearClick}\n icon={dhTrashUndo}\n tooltip=\"Clear log\"\n />\n <Button\n kind=\"ghost\"\n className=\"btn-link-icon btn-overflow\"\n icon={vsGear}\n tooltip=\"Log Settings\"\n onClick={() => {\n // no-op: click is handled in `DropdownMenu'\n }}\n >\n <DropdownMenu\n actions={actions}\n popperClassName=\"log-level-menu-popper\"\n popperOptions={popperOptions}\n />\n </Button>\n </div>\n <div\n className=\"log-pane-editor h-100 w-100\"\n ref={editorContainer => {\n this.editorContainer = editorContainer;\n }}\n />\n </div>\n );\n }\n}\n\nexport default LogView;\n"],"mappings":"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"}