@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.
- package/dist/ChartPlugin.d.ts +2 -2
- package/dist/ChartPlugin.d.ts.map +1 -1
- package/dist/ChartPlugin.js +5 -4
- package/dist/ChartPlugin.js.map +1 -1
- package/dist/ConsolePlugin.d.ts +2 -1
- package/dist/ConsolePlugin.d.ts.map +1 -1
- package/dist/ConsolePlugin.js +8 -7
- package/dist/ConsolePlugin.js.map +1 -1
- package/dist/FilterPlugin.d.ts +2 -1
- package/dist/FilterPlugin.d.ts.map +1 -1
- package/dist/FilterPlugin.js +10 -9
- package/dist/FilterPlugin.js.map +1 -1
- package/dist/GridPlugin.d.ts +4 -2
- package/dist/GridPlugin.d.ts.map +1 -1
- package/dist/GridPlugin.js +9 -6
- package/dist/GridPlugin.js.map +1 -1
- package/dist/LinkerPlugin.d.ts +2 -1
- package/dist/LinkerPlugin.d.ts.map +1 -1
- package/dist/LinkerPlugin.js +4 -2
- package/dist/LinkerPlugin.js.map +1 -1
- package/dist/MarkdownPlugin.d.ts +7 -1
- package/dist/MarkdownPlugin.d.ts.map +1 -1
- package/dist/MarkdownPlugin.js +6 -5
- package/dist/MarkdownPlugin.js.map +1 -1
- package/dist/PandasPlugin.d.ts +2 -2
- package/dist/PandasPlugin.d.ts.map +1 -1
- package/dist/PandasPlugin.js +47 -5
- package/dist/PandasPlugin.js.map +1 -1
- package/dist/controls/dropdown-filter/DropdownFilter.css.map +1 -1
- package/dist/controls/input-filter/InputFilter.css.map +1 -1
- package/dist/linker/LinkerOverlayContent.css.map +1 -1
- package/dist/panels/FilterSetManager.css.map +1 -1
- package/dist/panels/FilterSetManager.js +3 -4
- package/dist/panels/FilterSetManager.js.map +1 -1
- package/dist/panels/FilterSetManagerPanel.css.map +1 -1
- package/dist/panels/FilterSetManagerPanel.d.ts +1 -1
- package/dist/panels/FilterSetManagerPanel.d.ts.map +1 -1
- package/dist/panels/FilterSetManagerPanel.js +3 -20
- package/dist/panels/FilterSetManagerPanel.js.map +1 -1
- package/dist/panels/IrisGridPanel.d.ts +3 -0
- package/dist/panels/IrisGridPanel.d.ts.map +1 -1
- package/dist/panels/IrisGridPanel.js +8 -4
- package/dist/panels/IrisGridPanel.js.map +1 -1
- package/dist/panels/MarkdownNotebook.css +106 -0
- package/dist/panels/MarkdownNotebook.css.map +1 -0
- package/dist/panels/MarkdownNotebook.d.ts +41 -0
- package/dist/panels/MarkdownNotebook.d.ts.map +1 -0
- package/dist/panels/MarkdownNotebook.js +254 -0
- package/dist/panels/MarkdownNotebook.js.map +1 -0
- package/dist/panels/NotebookPanel.d.ts +14 -0
- package/dist/panels/NotebookPanel.d.ts.map +1 -1
- package/dist/panels/NotebookPanel.js +124 -32
- package/dist/panels/NotebookPanel.js.map +1 -1
- 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":";;
|
|
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
|
-
} =
|
|
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
|
-
|
|
721
|
-
|
|
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,
|
|
776
|
+
handleSessionOpened(session, _ref3) {
|
|
748
777
|
var {
|
|
749
778
|
language
|
|
750
|
-
} =
|
|
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
|
-
|
|
766
|
-
|
|
767
|
-
if (!this.notebook) {
|
|
768
|
-
return;
|
|
769
|
-
}
|
|
794
|
+
var _this$notebook2;
|
|
770
795
|
|
|
771
|
-
|
|
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) => {
|