@deephaven/dashboard-core-plugins 0.9.1-embed-grid.10 → 0.9.2-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/GridPlugin.d.ts +3 -1
- package/dist/GridPlugin.d.ts.map +1 -1
- package/dist/GridPlugin.js +5 -3
- package/dist/GridPlugin.js.map +1 -1
- package/dist/PandasPlugin.d.ts +1 -1
- package/dist/PandasPlugin.d.ts.map +1 -1
- package/dist/PandasPlugin.js +43 -2
- package/dist/PandasPlugin.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,106 @@
|
|
|
1
|
+
.markdown-notebook {
|
|
2
|
+
width: 100%;
|
|
3
|
+
height: 100%;
|
|
4
|
+
display: flex;
|
|
5
|
+
flex-direction: column;
|
|
6
|
+
}
|
|
7
|
+
.markdown-notebook .markdown-notebook-toolbar {
|
|
8
|
+
display: flex;
|
|
9
|
+
align-items: center;
|
|
10
|
+
padding: 0.25rem;
|
|
11
|
+
width: 100%;
|
|
12
|
+
flex: 0 0 36px;
|
|
13
|
+
border-bottom: 2px solid #1a171a;
|
|
14
|
+
}
|
|
15
|
+
.markdown-notebook .markdown-notebook-toolbar .btn-play-selected-cell {
|
|
16
|
+
color: #9edc6f;
|
|
17
|
+
min-height: 34px;
|
|
18
|
+
}
|
|
19
|
+
.markdown-notebook .markdown-notebook-content {
|
|
20
|
+
flex-grow: 1;
|
|
21
|
+
width: 100%;
|
|
22
|
+
padding: 0 15px;
|
|
23
|
+
overflow: auto;
|
|
24
|
+
position: relative;
|
|
25
|
+
scroll-behavior: smooth;
|
|
26
|
+
}
|
|
27
|
+
.markdown-notebook .markdown-notebook-content h1,
|
|
28
|
+
.markdown-notebook .markdown-notebook-content h2,
|
|
29
|
+
.markdown-notebook .markdown-notebook-content h3 {
|
|
30
|
+
margin-top: 3rem;
|
|
31
|
+
}
|
|
32
|
+
.markdown-notebook blockquote {
|
|
33
|
+
border-left: 0.25em solid #929192;
|
|
34
|
+
padding: 0 1em;
|
|
35
|
+
color: #f0f0ee;
|
|
36
|
+
}
|
|
37
|
+
.markdown-notebook pre {
|
|
38
|
+
overflow: hidden;
|
|
39
|
+
}
|
|
40
|
+
.markdown-notebook pre > code {
|
|
41
|
+
display: block;
|
|
42
|
+
padding: 0.5rem;
|
|
43
|
+
}
|
|
44
|
+
.markdown-notebook a {
|
|
45
|
+
color: #4878ea;
|
|
46
|
+
}
|
|
47
|
+
.markdown-notebook a:visited {
|
|
48
|
+
color: #aa9af4;
|
|
49
|
+
}
|
|
50
|
+
.markdown-notebook .markdown-notebook-code-block {
|
|
51
|
+
position: relative;
|
|
52
|
+
border-radius: 0 4px 4px 0;
|
|
53
|
+
}
|
|
54
|
+
.markdown-notebook .markdown-notebook-code-block .btn-play-block {
|
|
55
|
+
color: #9edc6f;
|
|
56
|
+
opacity: 0;
|
|
57
|
+
position: absolute;
|
|
58
|
+
top: 0;
|
|
59
|
+
right: 0;
|
|
60
|
+
margin: 3px;
|
|
61
|
+
transition: opacity 0.15s ease-out;
|
|
62
|
+
}
|
|
63
|
+
.markdown-notebook .markdown-notebook-code-block code {
|
|
64
|
+
color: #f0f0ee;
|
|
65
|
+
background: #403e41;
|
|
66
|
+
padding: 0.5rem;
|
|
67
|
+
border-radius: 4px;
|
|
68
|
+
border: 1px solid #1a171a;
|
|
69
|
+
overflow: auto;
|
|
70
|
+
display: block;
|
|
71
|
+
}
|
|
72
|
+
.markdown-notebook .markdown-notebook-code-block.is-selected::after {
|
|
73
|
+
position: absolute;
|
|
74
|
+
top: 0;
|
|
75
|
+
left: 0;
|
|
76
|
+
bottom: 0;
|
|
77
|
+
width: 5px;
|
|
78
|
+
margin: 1px 0 1px 0;
|
|
79
|
+
background: #4878ea;
|
|
80
|
+
content: "";
|
|
81
|
+
pointer-events: none;
|
|
82
|
+
border-radius: 4px 0 0 4px;
|
|
83
|
+
}
|
|
84
|
+
.markdown-notebook .markdown-notebook-code-block.is-selected .btn-play-block, .markdown-notebook .markdown-notebook-code-block:hover .btn-play-block {
|
|
85
|
+
opacity: 1;
|
|
86
|
+
}
|
|
87
|
+
.markdown-notebook .flashing {
|
|
88
|
+
animation-duration: 1s;
|
|
89
|
+
animation-name: flash;
|
|
90
|
+
animation-timing-function: ease-in-out;
|
|
91
|
+
animation-iteration-count: infinite;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
@keyframes flash {
|
|
95
|
+
0% {
|
|
96
|
+
text-shadow: 0 0 5px #2d2a2e, 0 0 20px #2d2a2e;
|
|
97
|
+
}
|
|
98
|
+
50% {
|
|
99
|
+
text-shadow: 0 0 2px rgba(255, 255, 255, 0.5), 0 0 10px #9edc6f;
|
|
100
|
+
}
|
|
101
|
+
100% {
|
|
102
|
+
text-shadow: 0 0 5px #2d2a2e, 0 0 20px #2d2a2e;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/*# sourceMappingURL=MarkdownNotebook.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../../src/panels/MarkdownNotebook.scss","../../../components/scss/new_variables.scss","../../../components/scss/bootstrap_overrides.scss"],"names":[],"mappings":"AAIA;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA,SCXO;EDYP;EACA;EACA;;AACA;EACE,OEZE;EFaF;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;AAAA;EAGE;;AAIJ;EACE;EACA;EACA,OE5Ba;;AF+Bf;EACE;;AAGF;EACE;EACA,SC/CO;;ADkDT;EACE,OE1CY;;AF4CZ;EACE,OEjDG;;AFqDP;EACE;EACA;;AAEA;EACE,OE5DE;EF6DF;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE,OE/DW;EFgEX,YErDK;EFsDL,SC3EK;ED4EL,eE0CU;EFzCV;EACA;EACA;;AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA,YEjFQ;EFkFR;EACA;EACA;;AAMF;EACE;;AAKN;EACE;EACA;EACA;EACA;;;AAIJ;EACE;IACE;;EAGF;IACE;;EAGF;IACE","file":"MarkdownNotebook.css"}
|
|
@@ -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"}
|