@deephaven/dashboard-core-plugins 0.9.1-embed-grid.14 → 0.9.2-beta.7

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 (54) hide show
  1. package/dist/ChartPlugin.d.ts +2 -2
  2. package/dist/ChartPlugin.d.ts.map +1 -1
  3. package/dist/ChartPlugin.js +5 -4
  4. package/dist/ChartPlugin.js.map +1 -1
  5. package/dist/ConsolePlugin.d.ts +2 -1
  6. package/dist/ConsolePlugin.d.ts.map +1 -1
  7. package/dist/ConsolePlugin.js +8 -7
  8. package/dist/ConsolePlugin.js.map +1 -1
  9. package/dist/FilterPlugin.d.ts +2 -1
  10. package/dist/FilterPlugin.d.ts.map +1 -1
  11. package/dist/FilterPlugin.js +10 -9
  12. package/dist/FilterPlugin.js.map +1 -1
  13. package/dist/GridPlugin.d.ts +4 -2
  14. package/dist/GridPlugin.d.ts.map +1 -1
  15. package/dist/GridPlugin.js +9 -6
  16. package/dist/GridPlugin.js.map +1 -1
  17. package/dist/LinkerPlugin.d.ts +2 -1
  18. package/dist/LinkerPlugin.d.ts.map +1 -1
  19. package/dist/LinkerPlugin.js +4 -2
  20. package/dist/LinkerPlugin.js.map +1 -1
  21. package/dist/MarkdownPlugin.d.ts +7 -1
  22. package/dist/MarkdownPlugin.d.ts.map +1 -1
  23. package/dist/MarkdownPlugin.js +6 -5
  24. package/dist/MarkdownPlugin.js.map +1 -1
  25. package/dist/PandasPlugin.d.ts +2 -2
  26. package/dist/PandasPlugin.d.ts.map +1 -1
  27. package/dist/PandasPlugin.js +47 -5
  28. package/dist/PandasPlugin.js.map +1 -1
  29. package/dist/controls/dropdown-filter/DropdownFilter.css.map +1 -1
  30. package/dist/controls/input-filter/InputFilter.css.map +1 -1
  31. package/dist/linker/LinkerOverlayContent.css.map +1 -1
  32. package/dist/panels/FilterSetManager.css.map +1 -1
  33. package/dist/panels/FilterSetManager.js +3 -4
  34. package/dist/panels/FilterSetManager.js.map +1 -1
  35. package/dist/panels/FilterSetManagerPanel.css.map +1 -1
  36. package/dist/panels/FilterSetManagerPanel.d.ts +1 -1
  37. package/dist/panels/FilterSetManagerPanel.d.ts.map +1 -1
  38. package/dist/panels/FilterSetManagerPanel.js +3 -20
  39. package/dist/panels/FilterSetManagerPanel.js.map +1 -1
  40. package/dist/panels/IrisGridPanel.d.ts +3 -0
  41. package/dist/panels/IrisGridPanel.d.ts.map +1 -1
  42. package/dist/panels/IrisGridPanel.js +8 -4
  43. package/dist/panels/IrisGridPanel.js.map +1 -1
  44. package/dist/panels/MarkdownNotebook.css +106 -0
  45. package/dist/panels/MarkdownNotebook.css.map +1 -0
  46. package/dist/panels/MarkdownNotebook.d.ts +41 -0
  47. package/dist/panels/MarkdownNotebook.d.ts.map +1 -0
  48. package/dist/panels/MarkdownNotebook.js +254 -0
  49. package/dist/panels/MarkdownNotebook.js.map +1 -0
  50. package/dist/panels/NotebookPanel.d.ts +14 -0
  51. package/dist/panels/NotebookPanel.d.ts.map +1 -1
  52. package/dist/panels/NotebookPanel.js +124 -32
  53. package/dist/panels/NotebookPanel.js.map +1 -1
  54. package/package.json +19 -23
@@ -0,0 +1,41 @@
1
+ export class MarkdownNotebook extends React.PureComponent<any, any, any> {
2
+ constructor(props: any);
3
+ handleRunSelected(event: any): void;
4
+ renderCodeBlock(props: any): JSX.Element;
5
+ renderLink(props: any): JSX.Element;
6
+ commands: Map<any, any>;
7
+ codeElements: Map<any, any>;
8
+ editorScrollView: React.RefObject<any>;
9
+ updateHasCode(): void;
10
+ /**
11
+ * @param {number|null} line The line of the code block to start from
12
+ * @returns {number} The next line of the code block to start from
13
+ */
14
+ getNextStartLine(line: number | null): number;
15
+ runCode(command: any): void;
16
+ }
17
+ export namespace MarkdownNotebook {
18
+ namespace propTypes {
19
+ const onRunCode: PropTypes.Requireable<(...args: any[]) => any>;
20
+ const content: PropTypes.Requireable<string>;
21
+ const onLinkClick: PropTypes.Requireable<(...args: any[]) => any>;
22
+ const transformImageUri: PropTypes.Requireable<(...args: any[]) => any>;
23
+ const transformLinkUri: PropTypes.Requireable<(...args: any[]) => any>;
24
+ }
25
+ namespace defaultProps {
26
+ const content_1: string;
27
+ export { content_1 as content };
28
+ const onLinkClick_1: undefined;
29
+ export { onLinkClick_1 as onLinkClick };
30
+ export function onRunCode_1(): void;
31
+ export { onRunCode_1 as onRunCode };
32
+ const transformImageUri_1: undefined;
33
+ export { transformImageUri_1 as transformImageUri };
34
+ const transformLinkUri_1: undefined;
35
+ export { transformLinkUri_1 as transformLinkUri };
36
+ }
37
+ }
38
+ export default MarkdownNotebook;
39
+ import React from "react";
40
+ import PropTypes from "prop-types";
41
+ //# sourceMappingURL=MarkdownNotebook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarkdownNotebook.d.ts","sourceRoot":"","sources":["../../src/panels/MarkdownNotebook.jsx"],"names":[],"mappings":"AAUA;IACE,wBAqBC;IAkCD,oCA4BC;IASD,yCAwDC;IAED,oCAQC;IAtJC,wBAAyB;IACzB,4BAA6B;IAC7B,uCAAyC;IAqB3C,sBAOC;IAED;;;OAGG;IACH,uBAHW,MAAM,GAAC,IAAI,GACT,MAAM,CAWlB;IAgCD,4BAKC;CAwGF;;;;;;;;;;;;;;QAaY,oCAAQ"}
@@ -0,0 +1,254 @@
1
+ import React, { PureComponent } from 'react';
2
+ import classNames from 'classnames';
3
+ import PropTypes from 'prop-types';
4
+ import Markdown from 'react-markdown';
5
+ import remarkGfm from 'remark-gfm';
6
+ import { Button } from '@deephaven/components';
7
+ import { Code } from '@deephaven/console';
8
+ import { vsPlay } from '@deephaven/icons';
9
+ import "./MarkdownNotebook.css";
10
+ export class MarkdownNotebook extends PureComponent {
11
+ constructor(props) {
12
+ super(props);
13
+ this.handleRunSelected = this.handleRunSelected.bind(this);
14
+ this.renderCodeBlock = this.renderCodeBlock.bind(this);
15
+ this.renderLink = this.renderLink.bind(this); // Map of each code block from it's starting line number to the code within that block
16
+
17
+ this.commands = new Map();
18
+ this.codeElements = new Map();
19
+ this.editorScrollView = /*#__PURE__*/React.createRef();
20
+ this.state = {
21
+ hasCode: false,
22
+ // Keep track if any code has been executed yet. If not, make the run button flash
23
+ hasRunCode: false,
24
+ // Line of the next block to execute. Null to start at the first block
25
+ nextStartLine: null
26
+ };
27
+ }
28
+
29
+ componentDidMount() {
30
+ this.updateHasCode();
31
+ }
32
+
33
+ componentDidUpdate() {
34
+ this.updateHasCode();
35
+ }
36
+
37
+ updateHasCode() {
38
+ var {
39
+ hasCode
40
+ } = this.state;
41
+
42
+ if (this.commands.size === 0 && hasCode) {
43
+ this.setState({
44
+ hasCode: false
45
+ });
46
+ } else if (this.commands.size > 0 && !hasCode) {
47
+ this.setState({
48
+ hasCode: true
49
+ });
50
+ }
51
+ }
52
+ /**
53
+ * @param {number|null} line The line of the code block to start from
54
+ * @returns {number} The next line of the code block to start from
55
+ */
56
+
57
+
58
+ getNextStartLine(line) {
59
+ var keys = [...this.commands.keys()];
60
+ var nextIndex = keys.findIndex(key => key === line) + 1;
61
+
62
+ if (nextIndex >= keys.length) {
63
+ // We got to the last block, disable
64
+ return null;
65
+ }
66
+
67
+ return keys[nextIndex];
68
+ }
69
+
70
+ handleRunSelected(event) {
71
+ var _this$codeElements$ge, _element$parentElemen;
72
+
73
+ event.preventDefault();
74
+ event.stopPropagation();
75
+ var {
76
+ nextStartLine
77
+ } = this.state;
78
+ var keys = [...this.commands.keys()];
79
+ var keyIndex = keys.findIndex(key => key === nextStartLine || nextStartLine == null);
80
+
81
+ if (keyIndex < 0) {
82
+ return;
83
+ }
84
+
85
+ var startLine = keys[keyIndex];
86
+ var command = this.commands.get(startLine);
87
+ var newNextStartLine = this.getNextStartLine(startLine);
88
+ var element = (_this$codeElements$ge = this.codeElements.get(startLine)) === null || _this$codeElements$ge === void 0 ? void 0 : _this$codeElements$ge.current;
89
+ var nextElement = element === null || element === void 0 ? void 0 : (_element$parentElemen = element.parentElement) === null || _element$parentElemen === void 0 ? void 0 : _element$parentElemen.nextElementSibling;
90
+
91
+ if (nextElement) {
92
+ var {
93
+ offsetTop
94
+ } = nextElement;
95
+ var top = offsetTop;
96
+ this.editorScrollView.current.scroll({
97
+ top,
98
+ left: 0
99
+ });
100
+ }
101
+
102
+ this.runCode(command);
103
+ this.setState({
104
+ nextStartLine: newNextStartLine
105
+ });
106
+ }
107
+
108
+ runCode(command) {
109
+ var {
110
+ onRunCode
111
+ } = this.props;
112
+ onRunCode(command);
113
+ this.setState({
114
+ hasRunCode: true
115
+ });
116
+ }
117
+
118
+ renderCodeBlock(props) {
119
+ var {
120
+ children,
121
+ className,
122
+ inline,
123
+ node
124
+ } = props;
125
+ var {
126
+ hasRunCode,
127
+ nextStartLine
128
+ } = this.state;
129
+ var {
130
+ children: nodeChildren,
131
+ position
132
+ } = node;
133
+ var {
134
+ start
135
+ } = position;
136
+ var {
137
+ line
138
+ } = start;
139
+ var command = nodeChildren[0].value;
140
+ var ref = /*#__PURE__*/React.createRef();
141
+ var isFirstBlock = this.commands.size === 0;
142
+ var isSelected = nextStartLine === line || isFirstBlock && nextStartLine == null && !hasRunCode;
143
+ var language = className !== null && className !== void 0 && className.startsWith('language-') ? className.substring(9) : 'plaintext';
144
+
145
+ if (inline) {
146
+ return /*#__PURE__*/React.createElement("code", {
147
+ className: className
148
+ }, children);
149
+ }
150
+
151
+ this.commands.set(line, command);
152
+ this.codeElements.set(line, ref);
153
+ return /*#__PURE__*/React.createElement("div", {
154
+ className: classNames('markdown-notebook-code-block', {
155
+ 'is-selected': isSelected
156
+ }),
157
+ ref: ref,
158
+ onClick: () => {
159
+ this.setState({
160
+ nextStartLine: line
161
+ });
162
+ },
163
+ role: "presentation"
164
+ }, /*#__PURE__*/React.createElement(Button, {
165
+ kind: "ghost",
166
+ icon: vsPlay,
167
+ className: "btn-play-block",
168
+ onClick: event => {
169
+ event.stopPropagation();
170
+ event.preventDefault();
171
+ this.runCode(command);
172
+ this.setState({
173
+ nextStartLine: line
174
+ });
175
+ },
176
+ tooltip: "Run code"
177
+ }), /*#__PURE__*/React.createElement("code", null, /*#__PURE__*/React.createElement(Code, {
178
+ language: language
179
+ }, React.Children.map(children, child => typeof child === 'string' ? child.trim() : child))));
180
+ }
181
+
182
+ renderLink(props) {
183
+ var {
184
+ onLinkClick
185
+ } = this.props;
186
+ var {
187
+ href,
188
+ children,
189
+ target
190
+ } = props;
191
+ return /*#__PURE__*/React.createElement("a", {
192
+ href: href,
193
+ onClick: onLinkClick,
194
+ target: target
195
+ }, children);
196
+ }
197
+
198
+ render() {
199
+ var {
200
+ content,
201
+ transformImageUri,
202
+ transformLinkUri
203
+ } = this.props;
204
+ var {
205
+ hasCode,
206
+ hasRunCode,
207
+ nextStartLine
208
+ } = this.state;
209
+ return /*#__PURE__*/React.createElement("div", {
210
+ className: "markdown-notebook"
211
+ }, /*#__PURE__*/React.createElement("div", {
212
+ className: "markdown-notebook-toolbar"
213
+ }, /*#__PURE__*/React.createElement(Button, {
214
+ className: classNames('btn-play-selected-cell', {
215
+ flashing: hasCode && !hasRunCode
216
+ }),
217
+ kind: "ghost",
218
+ icon: vsPlay,
219
+ onClick: this.handleRunSelected,
220
+ tooltip: "Run code and select next",
221
+ disabled: hasRunCode && nextStartLine == null || !hasCode
222
+ }, "Run Selected Code")), /*#__PURE__*/React.createElement("div", {
223
+ className: "markdown-notebook-content",
224
+ ref: this.editorScrollView
225
+ }, /*#__PURE__*/React.createElement(Markdown, {
226
+ components: {
227
+ code: this.renderCodeBlock,
228
+ a: this.renderLink
229
+ },
230
+ linkTarget: "_blank",
231
+ remarkPlugins: [remarkGfm],
232
+ transformLinkUri: transformLinkUri,
233
+ transformImageUri: transformImageUri,
234
+ includeElementIndex: true
235
+ }, content)));
236
+ }
237
+
238
+ }
239
+ MarkdownNotebook.propTypes = {
240
+ onRunCode: PropTypes.func,
241
+ content: PropTypes.string,
242
+ onLinkClick: PropTypes.func,
243
+ transformImageUri: PropTypes.func,
244
+ transformLinkUri: PropTypes.func
245
+ };
246
+ MarkdownNotebook.defaultProps = {
247
+ content: '',
248
+ onLinkClick: undefined,
249
+ onRunCode: () => {},
250
+ transformImageUri: undefined,
251
+ transformLinkUri: undefined
252
+ };
253
+ export default MarkdownNotebook;
254
+ //# sourceMappingURL=MarkdownNotebook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/panels/MarkdownNotebook.jsx"],"names":["React","PureComponent","classNames","PropTypes","Markdown","remarkGfm","Button","Code","vsPlay","MarkdownNotebook","constructor","props","handleRunSelected","bind","renderCodeBlock","renderLink","commands","Map","codeElements","editorScrollView","createRef","state","hasCode","hasRunCode","nextStartLine","componentDidMount","updateHasCode","componentDidUpdate","size","setState","getNextStartLine","line","keys","nextIndex","findIndex","key","length","event","preventDefault","stopPropagation","keyIndex","startLine","command","get","newNextStartLine","element","current","nextElement","parentElement","nextElementSibling","offsetTop","top","scroll","left","runCode","onRunCode","children","className","inline","node","nodeChildren","position","start","value","ref","isFirstBlock","isSelected","language","startsWith","substring","set","Children","map","child","trim","onLinkClick","href","target","render","content","transformImageUri","transformLinkUri","flashing","code","a","propTypes","func","string","defaultProps","undefined"],"mappings":"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","sourcesContent":["import React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport PropTypes from 'prop-types';\nimport Markdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport { Button } from '@deephaven/components';\nimport { Code } from '@deephaven/console';\nimport { vsPlay } from '@deephaven/icons';\nimport './MarkdownNotebook.scss';\n\nexport class MarkdownNotebook extends PureComponent {\n constructor(props) {\n super(props);\n\n this.handleRunSelected = this.handleRunSelected.bind(this);\n this.renderCodeBlock = this.renderCodeBlock.bind(this);\n this.renderLink = this.renderLink.bind(this);\n\n // Map of each code block from it's starting line number to the code within that block\n this.commands = new Map();\n this.codeElements = new Map();\n this.editorScrollView = React.createRef();\n\n this.state = {\n hasCode: false,\n\n // Keep track if any code has been executed yet. If not, make the run button flash\n hasRunCode: false,\n\n // Line of the next block to execute. Null to start at the first block\n nextStartLine: null,\n };\n }\n\n componentDidMount() {\n this.updateHasCode();\n }\n\n componentDidUpdate() {\n this.updateHasCode();\n }\n\n updateHasCode() {\n const { hasCode } = this.state;\n if (this.commands.size === 0 && hasCode) {\n this.setState({ hasCode: false });\n } else if (this.commands.size > 0 && !hasCode) {\n this.setState({ hasCode: true });\n }\n }\n\n /**\n * @param {number|null} line The line of the code block to start from\n * @returns {number} The next line of the code block to start from\n */\n getNextStartLine(line) {\n const keys = [...this.commands.keys()];\n const nextIndex = keys.findIndex(key => key === line) + 1;\n if (nextIndex >= keys.length) {\n // We got to the last block, disable\n return null;\n }\n\n return keys[nextIndex];\n }\n\n handleRunSelected(event) {\n event.preventDefault();\n event.stopPropagation();\n\n const { nextStartLine } = this.state;\n const keys = [...this.commands.keys()];\n const keyIndex = keys.findIndex(\n key => key === nextStartLine || nextStartLine == null\n );\n if (keyIndex < 0) {\n return;\n }\n const startLine = keys[keyIndex];\n const command = this.commands.get(startLine);\n const newNextStartLine = this.getNextStartLine(startLine);\n const element = this.codeElements.get(startLine)?.current;\n const nextElement = element?.parentElement?.nextElementSibling;\n if (nextElement) {\n const { offsetTop } = nextElement;\n const top = offsetTop;\n this.editorScrollView.current.scroll({\n top,\n left: 0,\n });\n }\n\n this.runCode(command);\n this.setState({ nextStartLine: newNextStartLine });\n }\n\n runCode(command) {\n const { onRunCode } = this.props;\n onRunCode(command);\n\n this.setState({ hasRunCode: true });\n }\n\n renderCodeBlock(props) {\n const { children, className, inline, node } = props;\n const { hasRunCode, nextStartLine } = this.state;\n const { children: nodeChildren, position } = node;\n const { start } = position;\n const { line } = start;\n const command = nodeChildren[0].value;\n const ref = React.createRef();\n const isFirstBlock = this.commands.size === 0;\n const isSelected =\n nextStartLine === line ||\n (isFirstBlock && nextStartLine == null && !hasRunCode);\n const language = className?.startsWith('language-')\n ? className.substring(9)\n : 'plaintext';\n\n if (inline) {\n return <code className={className}>{children}</code>;\n }\n\n this.commands.set(line, command);\n this.codeElements.set(line, ref);\n\n return (\n <div\n className={classNames('markdown-notebook-code-block', {\n 'is-selected': isSelected,\n })}\n ref={ref}\n onClick={() => {\n this.setState({ nextStartLine: line });\n }}\n role=\"presentation\"\n >\n <Button\n kind=\"ghost\"\n icon={vsPlay}\n className=\"btn-play-block\"\n onClick={event => {\n event.stopPropagation();\n event.preventDefault();\n\n this.runCode(command);\n this.setState({ nextStartLine: line });\n }}\n tooltip=\"Run code\"\n />\n <code>\n <Code language={language}>\n {React.Children.map(children, child =>\n typeof child === 'string' ? child.trim() : child\n )}\n </Code>\n </code>\n </div>\n );\n }\n\n renderLink(props) {\n const { onLinkClick } = this.props;\n const { href, children, target } = props;\n return (\n <a href={href} onClick={onLinkClick} target={target}>\n {children}\n </a>\n );\n }\n\n render() {\n const { content, transformImageUri, transformLinkUri } = this.props;\n const { hasCode, hasRunCode, nextStartLine } = this.state;\n return (\n <div className=\"markdown-notebook\">\n <div className=\"markdown-notebook-toolbar\">\n <Button\n className={classNames('btn-play-selected-cell', {\n flashing: hasCode && !hasRunCode,\n })}\n kind=\"ghost\"\n icon={vsPlay}\n onClick={this.handleRunSelected}\n tooltip=\"Run code and select next\"\n disabled={(hasRunCode && nextStartLine == null) || !hasCode}\n >\n Run Selected Code\n </Button>\n </div>\n <div className=\"markdown-notebook-content\" ref={this.editorScrollView}>\n <Markdown\n components={{ code: this.renderCodeBlock, a: this.renderLink }}\n linkTarget=\"_blank\"\n remarkPlugins={[remarkGfm]}\n transformLinkUri={transformLinkUri}\n transformImageUri={transformImageUri}\n includeElementIndex\n >\n {content}\n </Markdown>\n </div>\n </div>\n );\n }\n}\n\nMarkdownNotebook.propTypes = {\n onRunCode: PropTypes.func,\n content: PropTypes.string,\n onLinkClick: PropTypes.func,\n transformImageUri: PropTypes.func,\n transformLinkUri: PropTypes.func,\n};\n\nMarkdownNotebook.defaultProps = {\n content: '',\n onLinkClick: undefined,\n onRunCode: () => {},\n transformImageUri: undefined,\n transformLinkUri: undefined,\n};\n\nexport default MarkdownNotebook;\n"],"file":"MarkdownNotebook.js"}
@@ -17,6 +17,10 @@ declare class NotebookPanel extends React.Component<any, any, any> {
17
17
  handleEditorChange(e: any): void;
18
18
  handleFind(): void;
19
19
  handleFocus(): void;
20
+ /**
21
+ * @param {MouseEvent} event The click event from clicking on the link
22
+ */
23
+ handleLinkClick(event: MouseEvent): void;
20
24
  handleLoadSuccess(): void;
21
25
  handleLoadError(errorParam: any): void;
22
26
  handlePanelTabClick(): void;
@@ -39,6 +43,12 @@ declare class NotebookPanel extends React.Component<any, any, any> {
39
43
  handleTab(tab: any): void;
40
44
  handleTabFocus(...args: any[]): void;
41
45
  handleTabBlur(): void;
46
+ /**
47
+ * Transform the link URI to load from where the notebook is if it's relative
48
+ * @param {String} src The link to transform
49
+ * @returns String the transformed link
50
+ */
51
+ handleTransformLinkUri(src: string): string;
42
52
  pending: Pending;
43
53
  debouncedSavePanelState: import("lodash").DebouncedFunc<() => void>;
44
54
  debouncedLoad: import("lodash").DebouncedFunc<() => void>;
@@ -81,6 +91,7 @@ declare class NotebookPanel extends React.Component<any, any, any> {
81
91
  focus(): void;
82
92
  createNotebook(itemName: any, language: any, content: any): void;
83
93
  runCommand(command: any): void;
94
+ removePreviewStatus(): void;
84
95
  }
85
96
  declare namespace NotebookPanel {
86
97
  namespace propTypes {
@@ -120,6 +131,7 @@ declare namespace NotebookPanel {
120
131
  settings: PropTypes.Requireable<PropTypes.InferProps<{}>>;
121
132
  fileMetadata: PropTypes.Requireable<PropTypes.InferProps<{}>>;
122
133
  }>>;
134
+ const notebooksUrl: PropTypes.Requireable<string>;
123
135
  }
124
136
  namespace defaultProps {
125
137
  const isDashboardActive_1: boolean;
@@ -130,6 +142,8 @@ declare namespace NotebookPanel {
130
142
  export { session_1 as session };
131
143
  const sessionLanguage_1: null;
132
144
  export { sessionLanguage_1 as sessionLanguage };
145
+ const notebooksUrl_1: string;
146
+ export { notebooksUrl_1 as notebooksUrl };
133
147
  }
134
148
  }
135
149
  import React from "react";
@@ -1 +1 @@
1
- {"version":3,"file":"NotebookPanel.d.ts","sourceRoot":"","sources":["../../src/panels/NotebookPanel.jsx"],"names":[],"mappings":";;AAsCA;IACE,yBAAmC;IAEnC;;MAAoD;IAEpD,4BAAiC;IAEjC,qCAKC;IAED,iFAaC;IAED,wBA0GC;IAoTD,mBAGC;IAvDD,0BAGC;IAnBD,2BAKC;IAED,wBAOC;IAOD,mBAQC;IAED,iCA6BC;IAED,mBAIC;IAOD,oBAGC;IAED,0BAMC;IAED,uCAUC;IAyJD,4BAGC;IAtFD,mDAMC;IAED,qBAIC;IAED,qCAEC;IAED,qBAMC;IAED,0BAMC;IApGD,mBAGC;IA2CD,2BAEC;IAED,oCAgBC;IA/BD,kCASC;IAvCD,mCA4BC;IAqED;;aAKC;IAED,4BAKC;IAED,mBAMC;IAED,yBAEC;IAED,0BAGC;IAED,qCASC;IAED,sBAKC;IAjjBC,iBAA4B;IAE5B,oEAGC;IAED,0DAGC;IAED,8BAAoB;IAEpB,qBAA2B;IAC3B,sBAA4B;IAC5B,qBAAwB;IACxB,2BAA6B;IAyF/B,wBAMC;IAGD,6BAWC;IAED,+BAMC;IAED,wBAQC;IAED,4BAiBC;IAED,gCAGC;IAID,8DASC;IAED,qCAGC;IAED,aA8BC;IAED;;;OAGG;IACH,QAFa,OAAO,CAYnB;IAED;;;;OAIG;IACH,sBAHW,MAAM,WACN,MAAM,QAUhB;IAED,+BAEC;IAED,yBAWC;IAED;;;;;;;QASG;IAEH,uBAiCC;IAgQD,cAMC;IAED,iEA0BC;IAED,+BAOC;CAkMF"}
1
+ {"version":3,"file":"NotebookPanel.d.ts","sourceRoot":"","sources":["../../src/panels/NotebookPanel.jsx"],"names":[],"mappings":";;AAuCA;IACE,yBAAmC;IAEnC;;MAAoD;IAEpD,4BAAiC;IAEjC,qCAKC;IAED,iFAaC;IAED,wBA4GC;IA6SD,mBAGC;IAhDD,0BAGC;IAnBD,2BAKC;IAED,wBAOC;IAOD,mBAQC;IAED,iCAsBC;IAED,mBAIC;IAOD,oBAGC;IAED;;OAEG;IACH,uBAFW,UAAU,QAoCpB;IAED,0BAMC;IAED,uCAUC;IAoJD,4BAGC;IAjFD,mDAMC;IAED,qBAEC;IAED,qCAEC;IAED,qBAMC;IAED,0BAMC;IAlGD,mBAGC;IA2CD,2BAEC;IAED,oCAgBC;IA/BD,kCASC;IAvCD,mCA4BC;IAmED;;aAKC;IAED,4BAKC;IAED,mBAGC;IAED,yBAEC;IAED,0BAGC;IAED,qCASC;IAED,sBAKC;IAOD;;;;OAIG;IACH,4CAsBC;IA9mBC,iBAA4B;IAE5B,oEAGC;IAED,0DAGC;IAED,8BAAoB;IAEpB,qBAA2B;IAC3B,sBAA4B;IAC5B,qBAAwB;IACxB,2BAA6B;IAyF/B,wBAMC;IAGD,6BAWC;IAED,+BAMC;IAED,wBAQC;IAED,4BAiBC;IAED,gCAGC;IAID,8DASC;IAED,qCAGC;IAED,aA8BC;IAED;;;OAGG;IACH,QAFa,OAAO,CAYnB;IAED;;;;OAIG;IACH,sBAHW,MAAM,WACN,MAAM,QAUhB;IAED,+BAEC;IAED,yBAWC;IAED;;;;;;;QASG;IAEH,uBAiCC;IAwTD,cAMC;IAED,iEA0BC;IAED,+BAUC;IAED,4BASC;CAkNF"}
@@ -24,6 +24,7 @@ import { Pending, PromiseUtils } from '@deephaven/utils';
24
24
  import { ConsoleEvent, NotebookEvent } from "../events/index.js";
25
25
  import { getDashboardSessionWrapper } from "../redux/index.js";
26
26
  import Panel from "./Panel.js";
27
+ import MarkdownNotebook from "./MarkdownNotebook.js";
27
28
  import "./NotebookPanel.css";
28
29
  var log = Log.module('NotebookPanel');
29
30
  var DEBOUNCE_PANEL_STATE_UPDATE = 400;
@@ -76,6 +77,7 @@ class NotebookPanel extends Component {
76
77
  this.handleEditorChange = this.handleEditorChange.bind(this);
77
78
  this.handleFind = this.handleFind.bind(this);
78
79
  this.handleFocus = this.handleFocus.bind(this);
80
+ this.handleLinkClick = this.handleLinkClick.bind(this);
79
81
  this.handleLoadSuccess = this.handleLoadSuccess.bind(this);
80
82
  this.handleLoadError = this.handleLoadError.bind(this);
81
83
  this.handlePanelTabClick = this.handlePanelTabClick.bind(this);
@@ -96,6 +98,7 @@ class NotebookPanel extends Component {
96
98
  this.handleTab = this.handleTab.bind(this);
97
99
  this.handleTabFocus = this.handleTabFocus.bind(this);
98
100
  this.handleTabBlur = this.handleTabBlur.bind(this);
101
+ this.handleTransformLinkUri = this.handleTransformLinkUri.bind(this);
99
102
  this.pending = new Pending();
100
103
  this.debouncedSavePanelState = debounce(this.savePanelState.bind(this), DEBOUNCE_PANEL_STATE_UPDATE);
101
104
  this.debouncedLoad = debounce(this.load.bind(this), DEBOUNCE_PANEL_STATE_UPDATE);
@@ -517,28 +520,12 @@ class NotebookPanel extends Component {
517
520
 
518
521
  handleEditorChange(e) {
519
522
  log.debug2('handleEditorChanged', e);
523
+ this.removePreviewStatus();
520
524
  this.setState(_ref2 => {
521
- var {
522
- isPreview
523
- } = _ref2;
524
-
525
- if (isPreview) {
526
- var {
527
- fileMetadata
528
- } = this.state;
529
- this.registerFileMetadata(fileMetadata, false);
530
- return {
531
- isPreview: false
532
- };
533
- }
534
-
535
- return null;
536
- });
537
- this.setState(_ref3 => {
538
525
  var {
539
526
  changeCount,
540
527
  savedChangeCount
541
- } = _ref3;
528
+ } = _ref2;
542
529
  var {
543
530
  isUndoing,
544
531
  isRedoing
@@ -587,6 +574,48 @@ class NotebookPanel extends Component {
587
574
  isFocused: true
588
575
  });
589
576
  }
577
+ /**
578
+ * @param {MouseEvent} event The click event from clicking on the link
579
+ */
580
+
581
+
582
+ handleLinkClick(event) {
583
+ var {
584
+ notebooksUrl,
585
+ session,
586
+ sessionLanguage
587
+ } = this.props;
588
+ var {
589
+ href
590
+ } = event.target;
591
+
592
+ if (!href || !href.startsWith(notebooksUrl)) {
593
+ return;
594
+ }
595
+
596
+ event.stopPropagation();
597
+ event.preventDefault();
598
+ var notebookPath = "/".concat(href.substring(notebooksUrl.length)).replace(/%20/g, ' ');
599
+
600
+ if (notebookPath === '/') {
601
+ log.debug('Ignoring invalid notebook link', notebookPath);
602
+ return;
603
+ }
604
+
605
+ log.debug('Notebook link clicked, opening', notebookPath);
606
+ var {
607
+ glEventHub
608
+ } = this.props;
609
+ var notebookSettings = {
610
+ value: null,
611
+ language: sessionLanguage
612
+ };
613
+ var fileMetadata = {
614
+ id: notebookPath,
615
+ itemName: notebookPath
616
+ };
617
+ glEventHub.emit(NotebookEvent.SELECT_NOTEBOOK, session, sessionLanguage, notebookSettings, fileMetadata);
618
+ }
590
619
 
591
620
  handleLoadSuccess() {
592
621
  this.setState({
@@ -717,9 +746,9 @@ class NotebookPanel extends Component {
717
746
  }
718
747
 
719
748
  handleResize() {
720
- if (this.notebook) {
721
- this.notebook.updateDimensions();
722
- }
749
+ var _this$notebook;
750
+
751
+ (_this$notebook = this.notebook) === null || _this$notebook === void 0 ? void 0 : _this$notebook.updateDimensions();
723
752
  }
724
753
 
725
754
  handleRunCommand(command) {
@@ -744,10 +773,10 @@ class NotebookPanel extends Component {
744
773
  this.runCommand(this.notebook.getSelectedCommand());
745
774
  }
746
775
 
747
- handleSessionOpened(session, _ref4) {
776
+ handleSessionOpened(session, _ref3) {
748
777
  var {
749
778
  language
750
- } = _ref4;
779
+ } = _ref3;
751
780
  this.setState({
752
781
  session,
753
782
  sessionLanguage: language
@@ -762,13 +791,10 @@ class NotebookPanel extends Component {
762
791
  }
763
792
 
764
793
  handleShow() {
765
- log.debug('handleShow');
766
-
767
- if (!this.notebook) {
768
- return;
769
- }
794
+ var _this$notebook2;
770
795
 
771
- this.notebook.updateDimensions();
796
+ log.debug('handleShow');
797
+ (_this$notebook2 = this.notebook) === null || _this$notebook2 === void 0 ? void 0 : _this$notebook2.updateDimensions();
772
798
  }
773
799
 
774
800
  handleShowRename() {
@@ -811,6 +837,42 @@ class NotebookPanel extends Component {
811
837
  log.debug('handlePanelTabClick');
812
838
  this.focus();
813
839
  }
840
+ /**
841
+ * Transform the link URI to load from where the notebook is if it's relative
842
+ * @param {String} src The link to transform
843
+ * @returns String the transformed link
844
+ */
845
+
846
+
847
+ handleTransformLinkUri(src) {
848
+ var {
849
+ notebooksUrl
850
+ } = this.props;
851
+ var {
852
+ fileMetadata
853
+ } = this.state;
854
+
855
+ if (src.endsWith('/')) {
856
+ return src;
857
+ }
858
+
859
+ if (src.startsWith('/')) {
860
+ return "".concat(notebooksUrl).concat(src.substring(1));
861
+ }
862
+
863
+ var itemName = fileMetadata === null || fileMetadata === void 0 ? void 0 : fileMetadata.itemName;
864
+
865
+ if (!itemName) {
866
+ return src;
867
+ }
868
+
869
+ if (itemName.charAt(0) === '/') {
870
+ itemName = itemName.substring(1);
871
+ }
872
+
873
+ var itemUri = new URL(itemName, notebooksUrl);
874
+ return new URL(src, itemUri).href;
875
+ }
814
876
 
815
877
  focus() {
816
878
  requestAnimationFrame(() => {
@@ -849,12 +911,33 @@ class NotebookPanel extends Component {
849
911
  return;
850
912
  }
851
913
 
914
+ this.removePreviewStatus();
852
915
  var {
853
916
  glEventHub
854
917
  } = this.props;
855
918
  glEventHub.emit(ConsoleEvent.SEND_COMMAND, command, false, true);
856
919
  }
857
920
 
921
+ removePreviewStatus() {
922
+ this.setState(_ref4 => {
923
+ var {
924
+ isPreview
925
+ } = _ref4;
926
+
927
+ if (isPreview) {
928
+ var {
929
+ fileMetadata
930
+ } = this.state;
931
+ this.registerFileMetadata(fileMetadata, false);
932
+ return {
933
+ isPreview: false
934
+ };
935
+ }
936
+
937
+ return null;
938
+ });
939
+ }
940
+
858
941
  render() {
859
942
  var _fileMetadata$itemNam;
860
943
 
@@ -884,6 +967,7 @@ class NotebookPanel extends Component {
884
967
 
885
968
  var focusOnMount = isDashboardActive && !glContainer.isHidden && !isPreview;
886
969
  var itemName = (_fileMetadata$itemNam = fileMetadata === null || fileMetadata === void 0 ? void 0 : fileMetadata.itemName) !== null && _fileMetadata$itemNam !== void 0 ? _fileMetadata$itemNam : NotebookPanel.DEFAULT_NAME;
970
+ var isMarkdown = itemName.endsWith('.md');
887
971
  var isExistingItem = (fileMetadata === null || fileMetadata === void 0 ? void 0 : fileMetadata.id) != null;
888
972
  var overflowActions = this.getOverflowActions();
889
973
 
@@ -931,7 +1015,7 @@ class NotebookPanel extends Component {
931
1015
  onBlur: this.handleBlur,
932
1016
  additionalActions: additionalActions,
933
1017
  renderTabTooltip: () => itemName
934
- }, /*#__PURE__*/React.createElement("div", {
1018
+ }, !isMarkdown && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
935
1019
  className: "notebook-toolbar"
936
1020
  }, /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement("button", {
937
1021
  type: "button",
@@ -978,6 +1062,12 @@ class NotebookPanel extends Component {
978
1062
  ref: notebook => {
979
1063
  this.notebook = notebook;
980
1064
  }
1065
+ })), isMarkdown && /*#__PURE__*/React.createElement(MarkdownNotebook, {
1066
+ content: settings.value,
1067
+ onLinkClick: this.handleLinkClick,
1068
+ onRunCode: this.handleRunCommand,
1069
+ transformImageUri: this.handleTransformLinkUri,
1070
+ transformLinkUri: this.handleTransformLinkUri
981
1071
  }), /*#__PURE__*/React.createElement(NewItemModal, {
982
1072
  isOpen: showSaveAsModal,
983
1073
  type: "file",
@@ -1029,13 +1119,15 @@ NotebookPanel.propTypes = {
1029
1119
  panelState: PropTypes.shape({
1030
1120
  settings: PropTypes.shape({}),
1031
1121
  fileMetadata: PropTypes.shape({})
1032
- }).isRequired
1122
+ }).isRequired,
1123
+ notebooksUrl: PropTypes.string
1033
1124
  };
1034
1125
  NotebookPanel.defaultProps = {
1035
1126
  isDashboardActive: true,
1036
1127
  isPreview: false,
1037
1128
  session: null,
1038
- sessionLanguage: null
1129
+ sessionLanguage: null,
1130
+ notebooksUrl: new URL("".concat(process.env.REACT_APP_NOTEBOOKS_URL, "/"), window.location).href
1039
1131
  };
1040
1132
 
1041
1133
  var mapStateToProps = (state, ownProps) => {