@deephaven/dashboard-core-plugins 0.6.1-markdownnotebooks.7 → 0.6.3-bard.1

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 (44) hide show
  1. package/dist/ConsolePlugin.d.ts.map +1 -1
  2. package/dist/ConsolePlugin.js +5 -11
  3. package/dist/ConsolePlugin.js.map +1 -1
  4. package/dist/controls/ControlType.d.ts +0 -1
  5. package/dist/controls/ControlType.d.ts.map +1 -1
  6. package/dist/controls/ControlType.js +0 -2
  7. package/dist/controls/ControlType.js.map +1 -1
  8. package/dist/events/index.d.ts +0 -1
  9. package/dist/events/index.js +0 -1
  10. package/dist/events/index.js.map +1 -1
  11. package/dist/linker/Linker.d.ts +13 -13
  12. package/dist/linker/Linker.d.ts.map +1 -1
  13. package/dist/linker/Linker.js +5 -6
  14. package/dist/linker/Linker.js.map +1 -1
  15. package/dist/panels/ConsolePanel.d.ts.map +1 -1
  16. package/dist/panels/ConsolePanel.js +3 -3
  17. package/dist/panels/ConsolePanel.js.map +1 -1
  18. package/dist/panels/DropdownFilterPanel.d.ts +1 -1
  19. package/dist/panels/FileExplorerPanel.js.map +1 -1
  20. package/dist/panels/IrisGridPanel.d.ts +9 -3
  21. package/dist/panels/IrisGridPanel.d.ts.map +1 -1
  22. package/dist/panels/IrisGridPanel.js +40 -11
  23. package/dist/panels/IrisGridPanel.js.map +1 -1
  24. package/dist/redux/reducers/sessionWrapper.d.ts +1 -1
  25. package/dist/tsconfig.tsbuildinfo +1 -1
  26. package/package.json +17 -17
  27. package/dist/events/ControlEvent.d.ts +0 -5
  28. package/dist/events/ControlEvent.d.ts.map +0 -1
  29. package/dist/events/ControlEvent.js +0 -8
  30. package/dist/events/ControlEvent.js.map +0 -1
  31. package/dist/panels/MarkdownNotebookContainer.d.ts +0 -21
  32. package/dist/panels/MarkdownNotebookContainer.d.ts.map +0 -1
  33. package/dist/panels/MarkdownNotebookContainer.js +0 -35
  34. package/dist/panels/MarkdownNotebookContainer.js.map +0 -1
  35. package/dist/panels/MarkdownNotebookEditor.d.ts +0 -46
  36. package/dist/panels/MarkdownNotebookEditor.d.ts.map +0 -1
  37. package/dist/panels/MarkdownNotebookEditor.js +0 -257
  38. package/dist/panels/MarkdownNotebookEditor.js.map +0 -1
  39. package/dist/panels/MarkdownNotebookPanel.css +0 -127
  40. package/dist/panels/MarkdownNotebookPanel.css.map +0 -1
  41. package/dist/panels/MarkdownNotebookPanel.d.ts +0 -91
  42. package/dist/panels/MarkdownNotebookPanel.d.ts.map +0 -1
  43. package/dist/panels/MarkdownNotebookPanel.js +0 -446
  44. package/dist/panels/MarkdownNotebookPanel.js.map +0 -1
@@ -1,91 +0,0 @@
1
- export class MarkdownNotebookPanel extends React.Component<any, any, any> {
2
- static COMPONENT: string;
3
- constructor(props: any);
4
- handleContainerDoubleClick(event: any): void;
5
- handleEditorInitialized(editor: any): void;
6
- handleEditorBlur(event: any): void;
7
- handleEditorResize(): void;
8
- /**
9
- * @param {MouseEvent} event The click event from clicking on the link
10
- */
11
- handleLinkClick(event: MouseEvent): void;
12
- handleTab(tab: any): void;
13
- handleRunCommand(command: any): void;
14
- /**
15
- * Transform the link URI to load from where the notebook is if it's relative
16
- * @param {String} src The link to transform
17
- * @returns String the transformed link
18
- */
19
- transformLinkUri(src: string): string;
20
- pending: Pending;
21
- markdownEditor: MarkdownNotebookEditor | null;
22
- editor: any;
23
- initNotebookContent(): void;
24
- initTab(tab: any): void;
25
- tabTitleElement: any;
26
- setPreviewStatus(): void;
27
- registerFileMetadata(fileMetadata: any, isPreview: any): void;
28
- setEditorPosition(clickPositionY: any): void;
29
- }
30
- export namespace MarkdownNotebookPanel {
31
- namespace propTypes {
32
- const id: PropTypes.Validator<string>;
33
- const fileStorage: PropTypes.Validator<PropTypes.InferProps<{
34
- deleteFile: PropTypes.Validator<(...args: any[]) => any>;
35
- loadFile: PropTypes.Validator<(...args: any[]) => any>;
36
- saveFile: PropTypes.Validator<(...args: any[]) => any>;
37
- }>>;
38
- const glContainer: PropTypes.Validator<PropTypes.InferProps<{
39
- on: PropTypes.Requireable<(...args: any[]) => any>;
40
- off: PropTypes.Requireable<(...args: any[]) => any>;
41
- isHidden: PropTypes.Requireable<boolean>;
42
- tab: PropTypes.Requireable<PropTypes.InferProps<{
43
- header: PropTypes.Requireable<PropTypes.InferProps<{
44
- tabs: PropTypes.Requireable<(PropTypes.InferProps<{
45
- contentItem: PropTypes.Requireable<PropTypes.InferProps<{}>>;
46
- }> | null | undefined)[]>;
47
- }>>;
48
- }>>;
49
- title: PropTypes.Requireable<string>;
50
- setTitle: PropTypes.Requireable<(...args: any[]) => any>;
51
- close: PropTypes.Requireable<(...args: any[]) => any>;
52
- }>>;
53
- const glEventHub: PropTypes.Validator<PropTypes.InferProps<{
54
- on: PropTypes.Requireable<(...args: any[]) => any>;
55
- off: PropTypes.Requireable<(...args: any[]) => any>;
56
- emit: PropTypes.Requireable<(...args: any[]) => any>;
57
- }>>;
58
- const metadata: PropTypes.Requireable<PropTypes.InferProps<{
59
- id: PropTypes.Requireable<string>;
60
- }>>;
61
- const panelState: PropTypes.Requireable<PropTypes.InferProps<{
62
- content: PropTypes.Requireable<string>;
63
- isPreview: PropTypes.Requireable<boolean>;
64
- fileMetadata: PropTypes.Requireable<PropTypes.InferProps<{
65
- id: PropTypes.Requireable<string>;
66
- itemName: PropTypes.Requireable<string>;
67
- }>>;
68
- }>>;
69
- const isPreview: PropTypes.Requireable<boolean>;
70
- const notebooksUrl: PropTypes.Requireable<string>;
71
- const session: PropTypes.Validator<PropTypes.InferProps<{}>>;
72
- const sessionLanguage: PropTypes.Validator<string>;
73
- }
74
- namespace defaultProps {
75
- const isPreview_1: boolean;
76
- export { isPreview_1 as isPreview };
77
- const metadata_1: null;
78
- export { metadata_1 as metadata };
79
- const panelState_1: null;
80
- export { panelState_1 as panelState };
81
- const notebooksUrl_1: string;
82
- export { notebooksUrl_1 as notebooksUrl };
83
- }
84
- }
85
- declare var _default: import("react-redux").ConnectedComponent<typeof MarkdownNotebookPanel, any>;
86
- export default _default;
87
- import React from "react";
88
- import { Pending } from "@deephaven/utils";
89
- import MarkdownNotebookEditor from "./MarkdownNotebookEditor";
90
- import PropTypes from "prop-types";
91
- //# sourceMappingURL=MarkdownNotebookPanel.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MarkdownNotebookPanel.d.ts","sourceRoot":"","sources":["../../src/panels/MarkdownNotebookPanel.jsx"],"names":[],"mappings":"AAiBA;IACE,yBAA2C;IAE3C,wBAiCC;IAqHD,6CASC;IAED,2CAGC;IAED,mCAkBC;IAED,2BAKC;IAED;;OAEG;IACH,uBAFW,UAAU,QA+BpB;IAED,0BAGC;IAED,qCAyBC;IAED;;;;OAIG;IACH,sCAeC;IAzQC,iBAA4B;IAiB5B,8CAA0B;IAC1B,YAAkB;IA0BpB,4BAiCC;IAED,wBAMC;IAHC,qBAAmC;IAKrC,yBAWC;IAED,8DAQC;IAED,6CAwBC;CA4KF"}
@@ -1,446 +0,0 @@
1
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
2
-
3
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
4
-
5
- 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
- import React, { Component } from 'react';
8
- import PropTypes from 'prop-types';
9
- import { connect } from 'react-redux';
10
- import { LoadingOverlay } from '@deephaven/components';
11
- import { GLPropTypes } from '@deephaven/dashboard';
12
- import { Pending } from '@deephaven/utils';
13
- import { getFileStorage } from '@deephaven/redux';
14
- import Log from '@deephaven/log';
15
- import Panel from "./Panel.js";
16
- import { getDashboardSessionWrapper } from "../redux/index.js";
17
- import { ConsoleEvent, NotebookEvent } from "../events/index.js";
18
- import "./MarkdownNotebookPanel.css";
19
- import MarkdownNotebookContainer from "./MarkdownNotebookContainer.js";
20
- import MarkdownNotebookEditor from "./MarkdownNotebookEditor.js";
21
- var log = Log.module('MarkdownNotebookPanel');
22
- export class MarkdownNotebookPanel extends Component {
23
- constructor(props) {
24
- super(props);
25
- this.handleContainerDoubleClick = this.handleContainerDoubleClick.bind(this);
26
- this.handleEditorInitialized = this.handleEditorInitialized.bind(this);
27
- this.handleEditorBlur = this.handleEditorBlur.bind(this);
28
- this.handleEditorResize = this.handleEditorResize.bind(this);
29
- this.handleLinkClick = this.handleLinkClick.bind(this);
30
- this.handleTab = this.handleTab.bind(this);
31
- this.handleRunCommand = this.handleRunCommand.bind(this);
32
- this.transformLinkUri = this.transformLinkUri.bind(this);
33
- this.pending = new Pending();
34
- var {
35
- panelState
36
- } = props;
37
- var {
38
- isPreview
39
- } = props;
40
-
41
- if (panelState && panelState.isPreview != null) {
42
- isPreview = panelState.isPreview;
43
- }
44
-
45
- this.state = {
46
- isEditing: false,
47
- isLoading: true,
48
- isPreview,
49
- content: null,
50
- // eslint-disable-next-line react/no-unused-state
51
- panelState
52
- };
53
- this.markdownEditor = null;
54
- this.editor = null;
55
- }
56
-
57
- componentDidMount() {
58
- var {
59
- glContainer: {
60
- tab
61
- }
62
- } = this.props;
63
- if (tab) this.initTab(tab);
64
- this.initNotebookContent();
65
- }
66
-
67
- componentWillUnmount() {
68
- this.pending.cancel();
69
- var {
70
- glEventHub,
71
- panelState
72
- } = this.props;
73
- var {
74
- isPreview
75
- } = this.state;
76
-
77
- if (panelState.fileMetadata) {
78
- glEventHub.emit(NotebookEvent.UNREGISTER_FILE, panelState.fileMetadata, isPreview);
79
- }
80
- }
81
-
82
- initNotebookContent() {
83
- var {
84
- panelState
85
- } = this.props;
86
-
87
- if (panelState && panelState.content) {
88
- // If we're passed the content directly, just use that
89
- log.debug('Using content passed directly');
90
- this.setState({
91
- content: panelState.content,
92
- isLoading: false
93
- });
94
- } else if (panelState && panelState.fileMetadata) {
95
- var {
96
- fileMetadata
97
- } = panelState;
98
- log.debug('Loading content from file');
99
- var {
100
- isPreview
101
- } = this.state;
102
- this.registerFileMetadata(fileMetadata, isPreview);
103
- var {
104
- id: fileId
105
- } = fileMetadata;
106
- var {
107
- fileStorage
108
- } = this.props;
109
- this.pending.add(fileStorage.loadFile(fileId)).then(loadedFile => {
110
- log.debug('Loaded file', loadedFile);
111
- var {
112
- content
113
- } = loadedFile;
114
- this.setState({
115
- content,
116
- isLoading: false,
117
- panelState
118
- });
119
- }).catch(err => {
120
- log.error('Unable to load file', err);
121
- this.setState({
122
- content: '',
123
- isLoading: false
124
- });
125
- });
126
- } else {
127
- log.debug('Starting with an empty file');
128
- this.setState({
129
- content: '',
130
- isLoading: false
131
- });
132
- }
133
- }
134
-
135
- initTab(tab) {
136
- var tabElement = tab.element.get(0);
137
- var titleElement = tabElement.querySelector('.lm_title');
138
- this.tabTitleElement = titleElement;
139
- titleElement.classList.add('markdown-notebook-title');
140
- this.setPreviewStatus();
141
- }
142
-
143
- setPreviewStatus() {
144
- if (!this.tabTitleElement) {
145
- return;
146
- }
147
-
148
- var {
149
- isPreview
150
- } = this.state;
151
- log.debug('setPreviewStatus', this.tabTitleElement, isPreview);
152
-
153
- if (isPreview) {
154
- this.tabTitleElement.classList.add('is-preview');
155
- } else {
156
- this.tabTitleElement.classList.remove('is-preview');
157
- }
158
- }
159
-
160
- registerFileMetadata(fileMetadata, isPreview) {
161
- var {
162
- glEventHub,
163
- id: tabId
164
- } = this.props;
165
- glEventHub.emit(NotebookEvent.REGISTER_FILE, tabId, fileMetadata, isPreview);
166
- }
167
-
168
- setEditorPosition(clickPositionY) {
169
- var {
170
- container: markdownEditorContainer
171
- } = this.markdownEditor;
172
-
173
- if (this.editor && markdownEditorContainer) {
174
- var contentTop = markdownEditorContainer.getBoundingClientRect().top;
175
- var contentScrollTop = markdownEditorContainer.scrollTop;
176
- var contentScrollHeight = markdownEditorContainer.scrollHeight;
177
- var totalLines = this.editor.getModel().getLineCount();
178
- var lineToFocus = Math.round((contentScrollTop + clickPositionY - contentTop) / contentScrollHeight * totalLines);
179
-
180
- if (lineToFocus > totalLines) {
181
- lineToFocus = totalLines;
182
- }
183
-
184
- this.editor.revealLine(lineToFocus);
185
- this.editor.setPosition({
186
- lineNumber: lineToFocus,
187
- column: 1
188
- });
189
- this.editor.focus();
190
- }
191
- }
192
-
193
- handleContainerDoubleClick(event) {
194
- var {
195
- isEditing
196
- } = this.state;
197
- var dbClickPositionY = event.clientY;
198
-
199
- if (!isEditing) {
200
- this.setState({
201
- isEditing: true
202
- }, () => {
203
- this.setEditorPosition(dbClickPositionY);
204
- });
205
- }
206
- }
207
-
208
- handleEditorInitialized(editor) {
209
- log.debug('Markdown Editor Initialized...');
210
- this.editor = editor;
211
- }
212
-
213
- handleEditorBlur(event) {
214
- var _this$markdownEditor, _this$markdownEditor$;
215
-
216
- log.debug("markdown content changed, saving...");
217
- var {
218
- isEditing
219
- } = this.state; // if not in edit mode, or in edit mode but blur went to an internal monaco field (like search)
220
-
221
- if (!isEditing || (_this$markdownEditor = this.markdownEditor) !== null && _this$markdownEditor !== void 0 && (_this$markdownEditor$ = _this$markdownEditor.container) !== null && _this$markdownEditor$ !== void 0 && _this$markdownEditor$.contains(event.relatedTarget)) {
222
- return;
223
- }
224
-
225
- var content = this.editor.getValue();
226
- this.setState({
227
- content,
228
- isEditing: false
229
- });
230
- }
231
-
232
- handleEditorResize() {
233
- var {
234
- isEditing
235
- } = this.state;
236
-
237
- if (isEditing && this.editor) {
238
- this.editor.layout();
239
- }
240
- }
241
- /**
242
- * @param {MouseEvent} event The click event from clicking on the link
243
- */
244
-
245
-
246
- handleLinkClick(event) {
247
- var {
248
- notebooksUrl,
249
- session,
250
- sessionLanguage
251
- } = this.props;
252
- var {
253
- href
254
- } = event.target;
255
-
256
- if (!href || !href.startsWith(notebooksUrl)) {
257
- return;
258
- }
259
-
260
- event.stopPropagation();
261
- event.preventDefault();
262
- var notebookPath = "/".concat(href.substring(notebooksUrl.length)).replace(/%20/g, ' ');
263
- log.debug('Notebook link clicked, opening', notebookPath);
264
- var {
265
- glEventHub
266
- } = this.props;
267
- var notebookSettings = {
268
- value: null,
269
- language: sessionLanguage
270
- };
271
- var fileMetadata = {
272
- id: notebookPath,
273
- itemName: notebookPath
274
- };
275
- glEventHub.emit(NotebookEvent.SELECT_NOTEBOOK, session, sessionLanguage, notebookSettings, fileMetadata);
276
- }
277
-
278
- handleTab(tab) {
279
- log.debug('MarkdownNotebookPanel tab event', tab);
280
- this.initTab(tab);
281
- }
282
-
283
- handleRunCommand(command) {
284
- if (!command) {
285
- log.debug('Ignoring empty command.');
286
- return;
287
- }
288
-
289
- this.setState((_ref) => {
290
- var {
291
- isPreview,
292
- panelState = {}
293
- } = _ref;
294
-
295
- if (isPreview) {
296
- var _propsPanelState$file;
297
-
298
- var {
299
- metadata,
300
- panelState: propsPanelState
301
- } = this.props;
302
- this.registerFileMetadata((_propsPanelState$file = propsPanelState === null || propsPanelState === void 0 ? void 0 : propsPanelState.fileMetadata) !== null && _propsPanelState$file !== void 0 ? _propsPanelState$file : metadata, false);
303
- return {
304
- isPreview: false,
305
- panelState: _objectSpread(_objectSpread({}, panelState), {}, {
306
- isPreview
307
- })
308
- };
309
- }
310
-
311
- return null;
312
- }, () => {
313
- this.setPreviewStatus();
314
- });
315
- var {
316
- glEventHub
317
- } = this.props;
318
- glEventHub.emit(ConsoleEvent.SEND_COMMAND, command, false, true);
319
- }
320
- /**
321
- * Transform the link URI to load from where the notebook is if it's relative
322
- * @param {String} src The link to transform
323
- * @returns String the transformed link
324
- */
325
-
326
-
327
- transformLinkUri(src) {
328
- var _panelState$fileMetad;
329
-
330
- var {
331
- notebooksUrl,
332
- panelState
333
- } = this.props;
334
- var itemName = panelState === null || panelState === void 0 ? void 0 : (_panelState$fileMetad = panelState.fileMetadata) === null || _panelState$fileMetad === void 0 ? void 0 : _panelState$fileMetad.itemName;
335
-
336
- if (!itemName) {
337
- return src;
338
- }
339
-
340
- if (itemName.charAt(0) === '/') {
341
- itemName = itemName.substring(1);
342
- }
343
-
344
- var itemUri = new URL(itemName, notebooksUrl);
345
-
346
- if (src.charAt(0) === '/') {
347
- return "".concat(notebooksUrl).concat(src);
348
- }
349
-
350
- return new URL(src, itemUri).href;
351
- }
352
-
353
- render() {
354
- var {
355
- glContainer,
356
- glEventHub
357
- } = this.props;
358
- var {
359
- isEditing,
360
- isLoading,
361
- content
362
- } = this.state;
363
- return /*#__PURE__*/React.createElement(Panel, {
364
- glContainer: glContainer,
365
- glEventHub: glEventHub,
366
- className: "markdown-notebook-panel",
367
- componentPanel: this,
368
- onResize: this.handleEditorResize,
369
- onBlur: this.handleEditorBlur,
370
- onTab: this.handleTab,
371
- isClonable: true,
372
- isRenamable: true
373
- }, !isLoading && /*#__PURE__*/React.createElement(MarkdownNotebookContainer, {
374
- isEditing: isEditing // onDoubleClick={this.handleContainerDoubleClick}
375
-
376
- }, /*#__PURE__*/React.createElement(MarkdownNotebookEditor, {
377
- ref: markdownEditor => {
378
- this.markdownEditor = markdownEditor;
379
- },
380
- isEditing: isEditing,
381
- content: content,
382
- onLinkClick: this.handleLinkClick,
383
- onRunCode: this.handleRunCommand,
384
- onEditorInitialized: this.handleEditorInitialized,
385
- transformImageUri: this.transformLinkUri,
386
- transformLinkUri: this.transformLinkUri
387
- })), isLoading && /*#__PURE__*/React.createElement(LoadingOverlay, null));
388
- }
389
-
390
- }
391
-
392
- _defineProperty(MarkdownNotebookPanel, "COMPONENT", 'MarkdownNotebookPanel');
393
-
394
- MarkdownNotebookPanel.propTypes = {
395
- id: PropTypes.string.isRequired,
396
- fileStorage: PropTypes.shape({
397
- deleteFile: PropTypes.func.isRequired,
398
- loadFile: PropTypes.func.isRequired,
399
- saveFile: PropTypes.func.isRequired
400
- }).isRequired,
401
- glContainer: GLPropTypes.Container.isRequired,
402
- glEventHub: GLPropTypes.EventHub.isRequired,
403
- metadata: PropTypes.shape({
404
- id: PropTypes.string
405
- }),
406
- panelState: PropTypes.shape({
407
- content: PropTypes.string,
408
- isPreview: PropTypes.bool,
409
- fileMetadata: PropTypes.shape({
410
- id: PropTypes.string,
411
- itemName: PropTypes.string
412
- })
413
- }),
414
- isPreview: PropTypes.bool,
415
- notebooksUrl: PropTypes.string,
416
- session: PropTypes.shape({}).isRequired,
417
- sessionLanguage: PropTypes.string.isRequired
418
- };
419
- MarkdownNotebookPanel.defaultProps = {
420
- isPreview: false,
421
- metadata: null,
422
- panelState: null,
423
- notebooksUrl: new URL("".concat(process.env.REACT_APP_NOTEBOOKS_URL, "/"), window.location).href
424
- };
425
-
426
- var mapStateToProps = (state, ownProps) => {
427
- var fileStorage = getFileStorage(state);
428
- var sessionWrapper = getDashboardSessionWrapper(state, ownProps.localDashboardId);
429
- var {
430
- session,
431
- config: sessionConfig
432
- } = sessionWrapper;
433
- var {
434
- type: sessionLanguage
435
- } = sessionConfig;
436
- return {
437
- fileStorage,
438
- session,
439
- sessionLanguage
440
- };
441
- };
442
-
443
- export default connect(mapStateToProps, null, null, {
444
- forwardRef: true
445
- })(MarkdownNotebookPanel);
446
- //# sourceMappingURL=MarkdownNotebookPanel.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/panels/MarkdownNotebookPanel.jsx"],"names":["React","Component","PropTypes","connect","LoadingOverlay","GLPropTypes","Pending","getFileStorage","Log","Panel","getDashboardSessionWrapper","ConsoleEvent","NotebookEvent","MarkdownNotebookContainer","MarkdownNotebookEditor","log","module","MarkdownNotebookPanel","constructor","props","handleContainerDoubleClick","bind","handleEditorInitialized","handleEditorBlur","handleEditorResize","handleLinkClick","handleTab","handleRunCommand","transformLinkUri","pending","panelState","isPreview","state","isEditing","isLoading","content","markdownEditor","editor","componentDidMount","glContainer","tab","initTab","initNotebookContent","componentWillUnmount","cancel","glEventHub","fileMetadata","emit","UNREGISTER_FILE","debug","setState","registerFileMetadata","id","fileId","fileStorage","add","loadFile","then","loadedFile","catch","err","error","tabElement","element","get","titleElement","querySelector","tabTitleElement","classList","setPreviewStatus","remove","tabId","REGISTER_FILE","setEditorPosition","clickPositionY","container","markdownEditorContainer","contentTop","getBoundingClientRect","top","contentScrollTop","scrollTop","contentScrollHeight","scrollHeight","totalLines","getModel","getLineCount","lineToFocus","Math","round","revealLine","setPosition","lineNumber","column","focus","event","dbClickPositionY","clientY","contains","relatedTarget","getValue","layout","notebooksUrl","session","sessionLanguage","href","target","startsWith","stopPropagation","preventDefault","notebookPath","substring","length","replace","notebookSettings","value","language","itemName","SELECT_NOTEBOOK","command","metadata","propsPanelState","SEND_COMMAND","src","charAt","itemUri","URL","render","propTypes","string","isRequired","shape","deleteFile","func","saveFile","Container","EventHub","bool","defaultProps","process","env","REACT_APP_NOTEBOOKS_URL","window","location","mapStateToProps","ownProps","sessionWrapper","localDashboardId","config","sessionConfig","type","forwardRef"],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { LoadingOverlay } from '@deephaven/components';\nimport { GLPropTypes } from '@deephaven/dashboard';\nimport { Pending } from '@deephaven/utils';\nimport { getFileStorage } from '@deephaven/redux';\nimport Log from '@deephaven/log';\nimport Panel from './Panel';\nimport { getDashboardSessionWrapper } from '../redux';\nimport { ConsoleEvent, NotebookEvent } from '../events';\nimport './MarkdownNotebookPanel.scss';\nimport MarkdownNotebookContainer from './MarkdownNotebookContainer';\nimport MarkdownNotebookEditor from './MarkdownNotebookEditor';\n\nconst log = Log.module('MarkdownNotebookPanel');\n\nexport class MarkdownNotebookPanel extends Component {\n static COMPONENT = 'MarkdownNotebookPanel';\n\n constructor(props) {\n super(props);\n\n this.handleContainerDoubleClick = this.handleContainerDoubleClick.bind(\n this\n );\n this.handleEditorInitialized = this.handleEditorInitialized.bind(this);\n this.handleEditorBlur = this.handleEditorBlur.bind(this);\n this.handleEditorResize = this.handleEditorResize.bind(this);\n this.handleLinkClick = this.handleLinkClick.bind(this);\n this.handleTab = this.handleTab.bind(this);\n this.handleRunCommand = this.handleRunCommand.bind(this);\n this.transformLinkUri = this.transformLinkUri.bind(this);\n\n this.pending = new Pending();\n\n const { panelState } = props;\n let { isPreview } = props;\n if (panelState && panelState.isPreview != null) {\n isPreview = panelState.isPreview;\n }\n this.state = {\n isEditing: false,\n isLoading: true,\n isPreview,\n content: null,\n\n // eslint-disable-next-line react/no-unused-state\n panelState,\n };\n\n this.markdownEditor = null;\n this.editor = null;\n }\n\n componentDidMount() {\n const {\n glContainer: { tab },\n } = this.props;\n if (tab) this.initTab(tab);\n\n this.initNotebookContent();\n }\n\n componentWillUnmount() {\n this.pending.cancel();\n\n const { glEventHub, panelState } = this.props;\n const { isPreview } = this.state;\n if (panelState.fileMetadata) {\n glEventHub.emit(\n NotebookEvent.UNREGISTER_FILE,\n panelState.fileMetadata,\n isPreview\n );\n }\n }\n\n initNotebookContent() {\n const { panelState } = this.props;\n if (panelState && panelState.content) {\n // If we're passed the content directly, just use that\n log.debug('Using content passed directly');\n this.setState({ content: panelState.content, isLoading: false });\n } else if (panelState && panelState.fileMetadata) {\n const { fileMetadata } = panelState;\n log.debug('Loading content from file');\n const { isPreview } = this.state;\n this.registerFileMetadata(fileMetadata, isPreview);\n const { id: fileId } = fileMetadata;\n const { fileStorage } = this.props;\n this.pending\n .add(fileStorage.loadFile(fileId))\n .then(loadedFile => {\n log.debug('Loaded file', loadedFile);\n const { content } = loadedFile;\n this.setState({\n content,\n isLoading: false,\n\n panelState,\n });\n })\n .catch(err => {\n log.error('Unable to load file', err);\n this.setState({ content: '', isLoading: false });\n });\n } else {\n log.debug('Starting with an empty file');\n this.setState({ content: '', isLoading: false });\n }\n }\n\n initTab(tab) {\n const tabElement = tab.element.get(0);\n const titleElement = tabElement.querySelector('.lm_title');\n this.tabTitleElement = titleElement;\n titleElement.classList.add('markdown-notebook-title');\n this.setPreviewStatus();\n }\n\n setPreviewStatus() {\n if (!this.tabTitleElement) {\n return;\n }\n const { isPreview } = this.state;\n log.debug('setPreviewStatus', this.tabTitleElement, isPreview);\n if (isPreview) {\n this.tabTitleElement.classList.add('is-preview');\n } else {\n this.tabTitleElement.classList.remove('is-preview');\n }\n }\n\n registerFileMetadata(fileMetadata, isPreview) {\n const { glEventHub, id: tabId } = this.props;\n glEventHub.emit(\n NotebookEvent.REGISTER_FILE,\n tabId,\n fileMetadata,\n isPreview\n );\n }\n\n setEditorPosition(clickPositionY) {\n const { container: markdownEditorContainer } = this.markdownEditor;\n if (this.editor && markdownEditorContainer) {\n const contentTop = markdownEditorContainer.getBoundingClientRect().top;\n const contentScrollTop = markdownEditorContainer.scrollTop;\n const contentScrollHeight = markdownEditorContainer.scrollHeight;\n const totalLines = this.editor.getModel().getLineCount();\n\n let lineToFocus = Math.round(\n ((contentScrollTop + clickPositionY - contentTop) /\n contentScrollHeight) *\n totalLines\n );\n if (lineToFocus > totalLines) {\n lineToFocus = totalLines;\n }\n\n this.editor.revealLine(lineToFocus);\n this.editor.setPosition({\n lineNumber: lineToFocus,\n column: 1,\n });\n this.editor.focus();\n }\n }\n\n handleContainerDoubleClick(event) {\n const { isEditing } = this.state;\n const dbClickPositionY = event.clientY;\n\n if (!isEditing) {\n this.setState({ isEditing: true }, () => {\n this.setEditorPosition(dbClickPositionY);\n });\n }\n }\n\n handleEditorInitialized(editor) {\n log.debug('Markdown Editor Initialized...');\n this.editor = editor;\n }\n\n handleEditorBlur(event) {\n log.debug(`markdown content changed, saving...`);\n const { isEditing } = this.state;\n\n // if not in edit mode, or in edit mode but blur went to an internal monaco field (like search)\n if (\n !isEditing ||\n this.markdownEditor?.container?.contains(event.relatedTarget)\n ) {\n return;\n }\n\n const content = this.editor.getValue();\n\n this.setState({\n content,\n isEditing: false,\n });\n }\n\n handleEditorResize() {\n const { isEditing } = this.state;\n if (isEditing && this.editor) {\n this.editor.layout();\n }\n }\n\n /**\n * @param {MouseEvent} event The click event from clicking on the link\n */\n handleLinkClick(event) {\n const { notebooksUrl, session, sessionLanguage } = this.props;\n const { href } = event.target;\n if (!href || !href.startsWith(notebooksUrl)) {\n return;\n }\n\n event.stopPropagation();\n event.preventDefault();\n\n const notebookPath = `/${href.substring(notebooksUrl.length)}`.replace(\n /%20/g,\n ' '\n );\n log.debug('Notebook link clicked, opening', notebookPath);\n\n const { glEventHub } = this.props;\n const notebookSettings = {\n value: null,\n language: sessionLanguage,\n };\n const fileMetadata = { id: notebookPath, itemName: notebookPath };\n glEventHub.emit(\n NotebookEvent.SELECT_NOTEBOOK,\n session,\n sessionLanguage,\n notebookSettings,\n fileMetadata\n );\n }\n\n handleTab(tab) {\n log.debug('MarkdownNotebookPanel tab event', tab);\n this.initTab(tab);\n }\n\n handleRunCommand(command) {\n if (!command) {\n log.debug('Ignoring empty command.');\n return;\n }\n\n this.setState(\n ({ isPreview, panelState = {} }) => {\n if (isPreview) {\n const { metadata, panelState: propsPanelState } = this.props;\n this.registerFileMetadata(\n propsPanelState?.fileMetadata ?? metadata,\n false\n );\n return { isPreview: false, panelState: { ...panelState, isPreview } };\n }\n return null;\n },\n () => {\n this.setPreviewStatus();\n }\n );\n\n const { glEventHub } = this.props;\n glEventHub.emit(ConsoleEvent.SEND_COMMAND, command, false, true);\n }\n\n /**\n * Transform the link URI to load from where the notebook is if it's relative\n * @param {String} src The link to transform\n * @returns String the transformed link\n */\n transformLinkUri(src) {\n const { notebooksUrl, panelState } = this.props;\n let itemName = panelState?.fileMetadata?.itemName;\n if (!itemName) {\n return src;\n }\n if (itemName.charAt(0) === '/') {\n itemName = itemName.substring(1);\n }\n\n const itemUri = new URL(itemName, notebooksUrl);\n if (src.charAt(0) === '/') {\n return `${notebooksUrl}${src}`;\n }\n return new URL(src, itemUri).href;\n }\n\n render() {\n const { glContainer, glEventHub } = this.props;\n const { isEditing, isLoading, content } = this.state;\n\n return (\n <Panel\n glContainer={glContainer}\n glEventHub={glEventHub}\n className=\"markdown-notebook-panel\"\n componentPanel={this}\n onResize={this.handleEditorResize}\n onBlur={this.handleEditorBlur}\n onTab={this.handleTab}\n isClonable\n isRenamable\n >\n {!isLoading && (\n <MarkdownNotebookContainer\n isEditing={isEditing}\n // onDoubleClick={this.handleContainerDoubleClick}\n >\n <MarkdownNotebookEditor\n ref={markdownEditor => {\n this.markdownEditor = markdownEditor;\n }}\n isEditing={isEditing}\n content={content}\n onLinkClick={this.handleLinkClick}\n onRunCode={this.handleRunCommand}\n onEditorInitialized={this.handleEditorInitialized}\n transformImageUri={this.transformLinkUri}\n transformLinkUri={this.transformLinkUri}\n />\n </MarkdownNotebookContainer>\n )}\n {isLoading && <LoadingOverlay />}\n </Panel>\n );\n }\n}\n\nMarkdownNotebookPanel.propTypes = {\n id: PropTypes.string.isRequired,\n fileStorage: PropTypes.shape({\n deleteFile: PropTypes.func.isRequired,\n loadFile: PropTypes.func.isRequired,\n saveFile: PropTypes.func.isRequired,\n }).isRequired,\n glContainer: GLPropTypes.Container.isRequired,\n glEventHub: GLPropTypes.EventHub.isRequired,\n metadata: PropTypes.shape({\n id: PropTypes.string,\n }),\n panelState: PropTypes.shape({\n content: PropTypes.string,\n isPreview: PropTypes.bool,\n fileMetadata: PropTypes.shape({\n id: PropTypes.string,\n itemName: PropTypes.string,\n }),\n }),\n isPreview: PropTypes.bool,\n notebooksUrl: PropTypes.string,\n session: PropTypes.shape({}).isRequired,\n sessionLanguage: PropTypes.string.isRequired,\n};\n\nMarkdownNotebookPanel.defaultProps = {\n isPreview: false,\n metadata: null,\n panelState: null,\n notebooksUrl: new URL(\n `${process.env.REACT_APP_NOTEBOOKS_URL}/`,\n window.location\n ).href,\n};\n\nconst mapStateToProps = (state, ownProps) => {\n const fileStorage = getFileStorage(state);\n const sessionWrapper = getDashboardSessionWrapper(\n state,\n ownProps.localDashboardId\n );\n const { session, config: sessionConfig } = sessionWrapper;\n const { type: sessionLanguage } = sessionConfig;\n return { fileStorage, session, sessionLanguage };\n};\n\nexport default connect(mapStateToProps, null, null, { forwardRef: true })(\n MarkdownNotebookPanel\n);\n"],"file":"MarkdownNotebookPanel.js"}