@deephaven/dashboard-core-plugins 0.6.1-alpha.5 → 0.6.1-markdownnotebooks.5
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/ConsolePlugin.d.ts.map +1 -1
- package/dist/ConsolePlugin.js +11 -5
- package/dist/ConsolePlugin.js.map +1 -1
- package/dist/controls/ControlType.d.ts +1 -0
- package/dist/controls/ControlType.d.ts.map +1 -1
- package/dist/controls/ControlType.js +2 -0
- package/dist/controls/ControlType.js.map +1 -1
- package/dist/linker/Linker.d.ts +13 -13
- package/dist/linker/Linker.d.ts.map +1 -1
- package/dist/linker/Linker.js +6 -5
- package/dist/linker/Linker.js.map +1 -1
- package/dist/panels/FileExplorerPanel.js.map +1 -1
- package/dist/panels/IrisGridPanel.d.ts +3 -9
- package/dist/panels/IrisGridPanel.d.ts.map +1 -1
- package/dist/panels/IrisGridPanel.js +11 -40
- package/dist/panels/IrisGridPanel.js.map +1 -1
- package/dist/panels/MarkdownNotebookContainer.d.ts +21 -0
- package/dist/panels/MarkdownNotebookContainer.d.ts.map +1 -0
- package/dist/panels/MarkdownNotebookContainer.js +35 -0
- package/dist/panels/MarkdownNotebookContainer.js.map +1 -0
- package/dist/panels/MarkdownNotebookEditor.d.ts +46 -0
- package/dist/panels/MarkdownNotebookEditor.d.ts.map +1 -0
- package/dist/panels/MarkdownNotebookEditor.js +257 -0
- package/dist/panels/MarkdownNotebookEditor.js.map +1 -0
- package/dist/panels/MarkdownNotebookPanel.css +127 -0
- package/dist/panels/MarkdownNotebookPanel.css.map +1 -0
- package/dist/panels/MarkdownNotebookPanel.d.ts +91 -0
- package/dist/panels/MarkdownNotebookPanel.d.ts.map +1 -0
- package/dist/panels/MarkdownNotebookPanel.js +448 -0
- package/dist/panels/MarkdownNotebookPanel.js.map +1 -0
- package/dist/redux/reducers/sessionWrapper.d.ts +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +16 -16
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React, { PureComponent } from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import classNames from 'classnames';
|
|
4
|
+
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
5
|
+
import { vsEdit } from '@deephaven/icons';
|
|
6
|
+
export default class MarkdownNotebookContainer extends PureComponent {
|
|
7
|
+
render() {
|
|
8
|
+
var {
|
|
9
|
+
isEditing,
|
|
10
|
+
children,
|
|
11
|
+
onDoubleClick
|
|
12
|
+
} = this.props;
|
|
13
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
14
|
+
className: "markdown-notebook-container h-100 w-100",
|
|
15
|
+
onDoubleClick: onDoubleClick
|
|
16
|
+
}, onDoubleClick && /*#__PURE__*/React.createElement("div", {
|
|
17
|
+
className: classNames('text-muted', 'edit-hint', {
|
|
18
|
+
viewing: !isEditing
|
|
19
|
+
})
|
|
20
|
+
}, /*#__PURE__*/React.createElement("span", null, "double-click to edit ", /*#__PURE__*/React.createElement(FontAwesomeIcon, {
|
|
21
|
+
icon: vsEdit
|
|
22
|
+
}))), children);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
}
|
|
26
|
+
MarkdownNotebookContainer.propTypes = {
|
|
27
|
+
onDoubleClick: PropTypes.func,
|
|
28
|
+
children: PropTypes.node.isRequired,
|
|
29
|
+
isEditing: PropTypes.bool
|
|
30
|
+
};
|
|
31
|
+
MarkdownNotebookContainer.defaultProps = {
|
|
32
|
+
isEditing: false,
|
|
33
|
+
onDoubleClick: null
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=MarkdownNotebookContainer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/panels/MarkdownNotebookContainer.jsx"],"names":["React","PureComponent","PropTypes","classNames","FontAwesomeIcon","vsEdit","MarkdownNotebookContainer","render","isEditing","children","onDoubleClick","props","viewing","propTypes","func","node","isRequired","bool","defaultProps"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,aAAhB,QAAqC,OAArC;AACA,OAAOC,SAAP,MAAsB,YAAtB;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,SAASC,eAAT,QAAgC,gCAAhC;AACA,SAASC,MAAT,QAAuB,kBAAvB;AAEA,eAAe,MAAMC,yBAAN,SAAwCL,aAAxC,CAAsD;AACnEM,EAAAA,MAAM,GAAG;AACP,QAAM;AAAEC,MAAAA,SAAF;AAAaC,MAAAA,QAAb;AAAuBC,MAAAA;AAAvB,QAAyC,KAAKC,KAApD;AAEA,wBACE;AACE,MAAA,SAAS,EAAC,yCADZ;AAEE,MAAA,aAAa,EAAED;AAFjB,OAIGA,aAAa,iBACZ;AACE,MAAA,SAAS,EAAEP,UAAU,CAAC,YAAD,EAAe,WAAf,EAA4B;AAC/CS,QAAAA,OAAO,EAAE,CAACJ;AADqC,OAA5B;AADvB,oBAKE,wEACuB,oBAAC,eAAD;AAAiB,MAAA,IAAI,EAAEH;AAAvB,MADvB,CALF,CALJ,EAeGI,QAfH,CADF;AAmBD;;AAvBkE;AA0BrEH,yBAAyB,CAACO,SAA1B,GAAsC;AACpCH,EAAAA,aAAa,EAAER,SAAS,CAACY,IADW;AAEpCL,EAAAA,QAAQ,EAAEP,SAAS,CAACa,IAAV,CAAeC,UAFW;AAGpCR,EAAAA,SAAS,EAAEN,SAAS,CAACe;AAHe,CAAtC;AAMAX,yBAAyB,CAACY,YAA1B,GAAyC;AACvCV,EAAAA,SAAS,EAAE,KAD4B;AAEvCE,EAAAA,aAAa,EAAE;AAFwB,CAAzC","sourcesContent":["import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsEdit } from '@deephaven/icons';\n\nexport default class MarkdownNotebookContainer extends PureComponent {\n render() {\n const { isEditing, children, onDoubleClick } = this.props;\n\n return (\n <div\n className=\"markdown-notebook-container h-100 w-100\"\n onDoubleClick={onDoubleClick}\n >\n {onDoubleClick && (\n <div\n className={classNames('text-muted', 'edit-hint', {\n viewing: !isEditing,\n })}\n >\n <span>\n double-click to edit <FontAwesomeIcon icon={vsEdit} />\n </span>\n </div>\n )}\n {children}\n </div>\n );\n }\n}\n\nMarkdownNotebookContainer.propTypes = {\n onDoubleClick: PropTypes.func,\n children: PropTypes.node.isRequired,\n isEditing: PropTypes.bool,\n};\n\nMarkdownNotebookContainer.defaultProps = {\n isEditing: false,\n onDoubleClick: null,\n};\n"],"file":"MarkdownNotebookContainer.js"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
declare class MarkdownNotebookEditor 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
|
+
container: HTMLDivElement | null;
|
|
7
|
+
commands: Map<any, any>;
|
|
8
|
+
codeElements: Map<any, any>;
|
|
9
|
+
editorScrollView: React.RefObject<any>;
|
|
10
|
+
resetBlocks(): void;
|
|
11
|
+
/**
|
|
12
|
+
* @param {number|null} line The line of the code block to start from
|
|
13
|
+
* @returns {number} The next line of the code block to start from
|
|
14
|
+
*/
|
|
15
|
+
getNextStartLine(line: number | null): number;
|
|
16
|
+
runCode(command: any): void;
|
|
17
|
+
}
|
|
18
|
+
declare namespace MarkdownNotebookEditor {
|
|
19
|
+
namespace propTypes {
|
|
20
|
+
const isEditing: PropTypes.Requireable<boolean>;
|
|
21
|
+
const onRunCode: PropTypes.Requireable<(...args: any[]) => any>;
|
|
22
|
+
const content: PropTypes.Requireable<string>;
|
|
23
|
+
const onEditorInitialized: PropTypes.Validator<(...args: any[]) => any>;
|
|
24
|
+
const onLinkClick: PropTypes.Requireable<(...args: any[]) => any>;
|
|
25
|
+
const transformImageUri: PropTypes.Requireable<(...args: any[]) => any>;
|
|
26
|
+
const transformLinkUri: PropTypes.Requireable<(...args: any[]) => any>;
|
|
27
|
+
}
|
|
28
|
+
namespace defaultProps {
|
|
29
|
+
const isEditing_1: boolean;
|
|
30
|
+
export { isEditing_1 as isEditing };
|
|
31
|
+
const content_1: string;
|
|
32
|
+
export { content_1 as content };
|
|
33
|
+
const onLinkClick_1: undefined;
|
|
34
|
+
export { onLinkClick_1 as onLinkClick };
|
|
35
|
+
export function onRunCode_1(): void;
|
|
36
|
+
export { onRunCode_1 as onRunCode };
|
|
37
|
+
const transformImageUri_1: undefined;
|
|
38
|
+
export { transformImageUri_1 as transformImageUri };
|
|
39
|
+
const transformLinkUri_1: undefined;
|
|
40
|
+
export { transformLinkUri_1 as transformLinkUri };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export default MarkdownNotebookEditor;
|
|
44
|
+
import React from "react";
|
|
45
|
+
import PropTypes from "prop-types";
|
|
46
|
+
//# sourceMappingURL=MarkdownNotebookEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownNotebookEditor.d.ts","sourceRoot":"","sources":["../../src/panels/MarkdownNotebookEditor.jsx"],"names":[],"mappings":"AASA;IACE,wBAqBC;IA8BD,oCA4BC;IASD,yCAwDC;IAGD,oCAIC;IAhJC,iCAAqB;IAGrB,wBAAyB;IACzB,4BAA6B;IAC7B,uCAAyC;IAkB3C,oBAIC;IAED;;;OAGG;IACH,uBAHW,MAAM,GAAC,IAAI,GACT,MAAM,CAWlB;IAgCD,4BAKC;CA2HF;;;;;;;;;;;;;;;;;;QAgBY,oCAAQ"}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
2
|
+
|
|
3
|
+
import React, { PureComponent } from 'react';
|
|
4
|
+
import PropTypes from 'prop-types';
|
|
5
|
+
import Markdown from 'react-markdown';
|
|
6
|
+
import { Button } from '@deephaven/components';
|
|
7
|
+
import { Code, Editor } from '@deephaven/console';
|
|
8
|
+
import classNames from 'classnames';
|
|
9
|
+
import { vsPlay } from '@deephaven/icons';
|
|
10
|
+
import remarkGfm from 'remark-gfm';
|
|
11
|
+
export default class MarkdownNotebookEditor extends PureComponent {
|
|
12
|
+
constructor(props) {
|
|
13
|
+
super(props);
|
|
14
|
+
this.handleRunSelected = this.handleRunSelected.bind(this);
|
|
15
|
+
this.renderCodeBlock = this.renderCodeBlock.bind(this);
|
|
16
|
+
this.renderLink = this.renderLink.bind(this);
|
|
17
|
+
this.container = null; // Map of each code block from it's starting line number to the code within that block
|
|
18
|
+
|
|
19
|
+
this.commands = new Map();
|
|
20
|
+
this.codeElements = new Map();
|
|
21
|
+
this.editorScrollView = /*#__PURE__*/React.createRef();
|
|
22
|
+
this.state = {
|
|
23
|
+
// Keep track if any code has been executed yet. If not, make the run button flash
|
|
24
|
+
hasRunCode: false,
|
|
25
|
+
// Line of the next block to execute. Null to start at the first block
|
|
26
|
+
nextStartLine: null
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
componentDidUpdate(prevProps) {
|
|
31
|
+
var {
|
|
32
|
+
content
|
|
33
|
+
} = this.props;
|
|
34
|
+
|
|
35
|
+
if (prevProps.content !== content) {
|
|
36
|
+
this.resetBlocks();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
resetBlocks() {
|
|
41
|
+
this.codeElements.clear();
|
|
42
|
+
this.commands.clear();
|
|
43
|
+
this.setState({
|
|
44
|
+
nextStartLine: null
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* @param {number|null} line The line of the code block to start from
|
|
49
|
+
* @returns {number} The next line of the code block to start from
|
|
50
|
+
*/
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
getNextStartLine(line) {
|
|
54
|
+
var keys = [...this.commands.keys()];
|
|
55
|
+
var nextIndex = keys.findIndex(key => key === line) + 1;
|
|
56
|
+
|
|
57
|
+
if (nextIndex >= keys.length) {
|
|
58
|
+
// We got to the last block, disable
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return keys[nextIndex];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
handleRunSelected(event) {
|
|
66
|
+
var _this$codeElements$ge, _element$parentElemen;
|
|
67
|
+
|
|
68
|
+
event.preventDefault();
|
|
69
|
+
event.stopPropagation();
|
|
70
|
+
var {
|
|
71
|
+
nextStartLine
|
|
72
|
+
} = this.state;
|
|
73
|
+
var keys = [...this.commands.keys()];
|
|
74
|
+
var keyIndex = keys.findIndex(key => key === nextStartLine || nextStartLine == null);
|
|
75
|
+
|
|
76
|
+
if (keyIndex < 0) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
var startLine = keys[keyIndex];
|
|
81
|
+
var command = this.commands.get(startLine);
|
|
82
|
+
var newNextStartLine = this.getNextStartLine(startLine);
|
|
83
|
+
var element = (_this$codeElements$ge = this.codeElements.get(startLine)) === null || _this$codeElements$ge === void 0 ? void 0 : _this$codeElements$ge.current;
|
|
84
|
+
var nextElement = element === null || element === void 0 ? void 0 : (_element$parentElemen = element.parentElement) === null || _element$parentElemen === void 0 ? void 0 : _element$parentElemen.nextElementSibling;
|
|
85
|
+
|
|
86
|
+
if (nextElement) {
|
|
87
|
+
var {
|
|
88
|
+
offsetTop
|
|
89
|
+
} = nextElement;
|
|
90
|
+
var top = offsetTop;
|
|
91
|
+
this.editorScrollView.current.scroll({
|
|
92
|
+
top,
|
|
93
|
+
left: 0
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
this.runCode(command);
|
|
98
|
+
this.setState({
|
|
99
|
+
nextStartLine: newNextStartLine
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
runCode(command) {
|
|
104
|
+
var {
|
|
105
|
+
onRunCode
|
|
106
|
+
} = this.props;
|
|
107
|
+
onRunCode(command);
|
|
108
|
+
this.setState({
|
|
109
|
+
hasRunCode: true
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
renderCodeBlock(props) {
|
|
114
|
+
var {
|
|
115
|
+
children,
|
|
116
|
+
className,
|
|
117
|
+
inline,
|
|
118
|
+
node
|
|
119
|
+
} = props;
|
|
120
|
+
var {
|
|
121
|
+
hasRunCode,
|
|
122
|
+
nextStartLine
|
|
123
|
+
} = this.state;
|
|
124
|
+
var {
|
|
125
|
+
children: nodeChildren,
|
|
126
|
+
position
|
|
127
|
+
} = node;
|
|
128
|
+
var {
|
|
129
|
+
start
|
|
130
|
+
} = position;
|
|
131
|
+
var {
|
|
132
|
+
line
|
|
133
|
+
} = start;
|
|
134
|
+
var command = nodeChildren[0].value;
|
|
135
|
+
var ref = /*#__PURE__*/React.createRef();
|
|
136
|
+
var isFirstBlock = this.commands.size === 0;
|
|
137
|
+
var isSelected = nextStartLine === line || isFirstBlock && nextStartLine == null && !hasRunCode;
|
|
138
|
+
var language = className !== null && className !== void 0 && className.startsWith('language-') ? className.substring(9) : 'plaintext';
|
|
139
|
+
|
|
140
|
+
if (inline) {
|
|
141
|
+
return /*#__PURE__*/React.createElement("code", {
|
|
142
|
+
className: className
|
|
143
|
+
}, children);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
this.commands.set(line, command);
|
|
147
|
+
this.codeElements.set(line, ref);
|
|
148
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
149
|
+
className: classNames('markdown-notebook-editor-code-block', {
|
|
150
|
+
'is-selected': isSelected
|
|
151
|
+
}),
|
|
152
|
+
ref: ref,
|
|
153
|
+
onClick: () => {
|
|
154
|
+
this.setState({
|
|
155
|
+
nextStartLine: line
|
|
156
|
+
});
|
|
157
|
+
},
|
|
158
|
+
role: "presentation"
|
|
159
|
+
}, /*#__PURE__*/React.createElement(Button, {
|
|
160
|
+
kind: "ghost",
|
|
161
|
+
icon: vsPlay,
|
|
162
|
+
className: "btn-play-block",
|
|
163
|
+
onClick: event => {
|
|
164
|
+
event.stopPropagation();
|
|
165
|
+
event.preventDefault();
|
|
166
|
+
this.runCode(command);
|
|
167
|
+
this.setState({
|
|
168
|
+
nextStartLine: line
|
|
169
|
+
});
|
|
170
|
+
},
|
|
171
|
+
tooltip: "Run code"
|
|
172
|
+
}), /*#__PURE__*/React.createElement("code", null, /*#__PURE__*/React.createElement(Code, {
|
|
173
|
+
language: language
|
|
174
|
+
}, React.Children.map(children, child => typeof child === 'string' ? child.trim() : child))));
|
|
175
|
+
} // eslint-disable-next-line class-methods-use-this
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
renderLink(props) {
|
|
179
|
+
var {
|
|
180
|
+
onLinkClick
|
|
181
|
+
} = this.props; // eslint-disable-next-line react/jsx-props-no-spreading,jsx-a11y/anchor-has-content,jsx-a11y/no-static-element-interactions
|
|
182
|
+
|
|
183
|
+
return /*#__PURE__*/React.createElement("a", _extends({}, props, {
|
|
184
|
+
onClick: onLinkClick
|
|
185
|
+
}));
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
render() {
|
|
189
|
+
var {
|
|
190
|
+
isEditing,
|
|
191
|
+
content,
|
|
192
|
+
onEditorInitialized,
|
|
193
|
+
transformImageUri,
|
|
194
|
+
transformLinkUri
|
|
195
|
+
} = this.props;
|
|
196
|
+
var {
|
|
197
|
+
hasRunCode,
|
|
198
|
+
nextStartLine
|
|
199
|
+
} = this.state;
|
|
200
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
201
|
+
className: "markdown-notebook-editor-container",
|
|
202
|
+
ref: container => {
|
|
203
|
+
this.container = container;
|
|
204
|
+
}
|
|
205
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
206
|
+
className: "markdown-notebook-editor-toolbar"
|
|
207
|
+
}, /*#__PURE__*/React.createElement(Button, {
|
|
208
|
+
className: classNames('btn-play-selected-cell', {
|
|
209
|
+
flashing: !hasRunCode
|
|
210
|
+
}),
|
|
211
|
+
kind: "ghost",
|
|
212
|
+
icon: vsPlay,
|
|
213
|
+
onClick: this.handleRunSelected,
|
|
214
|
+
tooltip: "Run code and select next",
|
|
215
|
+
disabled: hasRunCode && nextStartLine == null
|
|
216
|
+
}, "Run Selected Code")), /*#__PURE__*/React.createElement("div", {
|
|
217
|
+
className: "markdown-notebook-editor",
|
|
218
|
+
ref: this.editorScrollView
|
|
219
|
+
}, isEditing ? /*#__PURE__*/React.createElement(Editor, {
|
|
220
|
+
settings: {
|
|
221
|
+
language: 'markdown',
|
|
222
|
+
value: content,
|
|
223
|
+
lineNumbers: 'off'
|
|
224
|
+
},
|
|
225
|
+
onEditorInitialized: onEditorInitialized
|
|
226
|
+
}) : /*#__PURE__*/React.createElement(Markdown, {
|
|
227
|
+
components: {
|
|
228
|
+
code: this.renderCodeBlock,
|
|
229
|
+
a: this.renderLink
|
|
230
|
+
},
|
|
231
|
+
linkTarget: "_blank",
|
|
232
|
+
remarkPlugins: [remarkGfm],
|
|
233
|
+
transformLinkUri: transformLinkUri,
|
|
234
|
+
transformImageUri: transformImageUri,
|
|
235
|
+
includeElementIndex: true
|
|
236
|
+
}, content)));
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
}
|
|
240
|
+
MarkdownNotebookEditor.propTypes = {
|
|
241
|
+
isEditing: PropTypes.bool,
|
|
242
|
+
onRunCode: PropTypes.func,
|
|
243
|
+
content: PropTypes.string,
|
|
244
|
+
onEditorInitialized: PropTypes.func.isRequired,
|
|
245
|
+
onLinkClick: PropTypes.func,
|
|
246
|
+
transformImageUri: PropTypes.func,
|
|
247
|
+
transformLinkUri: PropTypes.func
|
|
248
|
+
};
|
|
249
|
+
MarkdownNotebookEditor.defaultProps = {
|
|
250
|
+
isEditing: false,
|
|
251
|
+
content: '',
|
|
252
|
+
onLinkClick: undefined,
|
|
253
|
+
onRunCode: () => {},
|
|
254
|
+
transformImageUri: undefined,
|
|
255
|
+
transformLinkUri: undefined
|
|
256
|
+
};
|
|
257
|
+
//# sourceMappingURL=MarkdownNotebookEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/panels/MarkdownNotebookEditor.jsx"],"names":["React","PureComponent","PropTypes","Markdown","Button","Code","Editor","classNames","vsPlay","remarkGfm","MarkdownNotebookEditor","constructor","props","handleRunSelected","bind","renderCodeBlock","renderLink","container","commands","Map","codeElements","editorScrollView","createRef","state","hasRunCode","nextStartLine","componentDidUpdate","prevProps","content","resetBlocks","clear","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","size","isSelected","language","startsWith","substring","set","Children","map","child","trim","onLinkClick","render","isEditing","onEditorInitialized","transformImageUri","transformLinkUri","flashing","lineNumbers","code","a","propTypes","bool","func","string","isRequired","defaultProps","undefined"],"mappings":";;AAAA,OAAOA,KAAP,IAAgBC,aAAhB,QAAqC,OAArC;AACA,OAAOC,SAAP,MAAsB,YAAtB;AACA,OAAOC,QAAP,MAAqB,gBAArB;AACA,SAASC,MAAT,QAAuB,uBAAvB;AACA,SAASC,IAAT,EAAeC,MAAf,QAA6B,oBAA7B;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,SAASC,MAAT,QAAuB,kBAAvB;AACA,OAAOC,SAAP,MAAsB,YAAtB;AAEA,eAAe,MAAMC,sBAAN,SAAqCT,aAArC,CAAmD;AAChEU,EAAAA,WAAW,CAACC,KAAD,EAAQ;AACjB,UAAMA,KAAN;AAEA,SAAKC,iBAAL,GAAyB,KAAKA,iBAAL,CAAuBC,IAAvB,CAA4B,IAA5B,CAAzB;AACA,SAAKC,eAAL,GAAuB,KAAKA,eAAL,CAAqBD,IAArB,CAA0B,IAA1B,CAAvB;AACA,SAAKE,UAAL,GAAkB,KAAKA,UAAL,CAAgBF,IAAhB,CAAqB,IAArB,CAAlB;AAEA,SAAKG,SAAL,GAAiB,IAAjB,CAPiB,CASjB;;AACA,SAAKC,QAAL,GAAgB,IAAIC,GAAJ,EAAhB;AACA,SAAKC,YAAL,GAAoB,IAAID,GAAJ,EAApB;AACA,SAAKE,gBAAL,gBAAwBrB,KAAK,CAACsB,SAAN,EAAxB;AAEA,SAAKC,KAAL,GAAa;AACX;AACAC,MAAAA,UAAU,EAAE,KAFD;AAIX;AACAC,MAAAA,aAAa,EAAE;AALJ,KAAb;AAOD;;AAEDC,EAAAA,kBAAkB,CAACC,SAAD,EAAY;AAC5B,QAAM;AAAEC,MAAAA;AAAF,QAAc,KAAKhB,KAAzB;;AACA,QAAIe,SAAS,CAACC,OAAV,KAAsBA,OAA1B,EAAmC;AACjC,WAAKC,WAAL;AACD;AACF;;AAEDA,EAAAA,WAAW,GAAG;AACZ,SAAKT,YAAL,CAAkBU,KAAlB;AACA,SAAKZ,QAAL,CAAcY,KAAd;AACA,SAAKC,QAAL,CAAc;AAAEN,MAAAA,aAAa,EAAE;AAAjB,KAAd;AACD;AAED;AACF;AACA;AACA;;;AACEO,EAAAA,gBAAgB,CAACC,IAAD,EAAO;AACrB,QAAMC,IAAI,GAAG,CAAC,GAAG,KAAKhB,QAAL,CAAcgB,IAAd,EAAJ,CAAb;AACA,QAAMC,SAAS,GAAGD,IAAI,CAACE,SAAL,CAAeC,GAAG,IAAIA,GAAG,KAAKJ,IAA9B,IAAsC,CAAxD;;AACA,QAAIE,SAAS,IAAID,IAAI,CAACI,MAAtB,EAA8B;AAC5B;AACA,aAAO,IAAP;AACD;;AAED,WAAOJ,IAAI,CAACC,SAAD,CAAX;AACD;;AAEDtB,EAAAA,iBAAiB,CAAC0B,KAAD,EAAQ;AAAA;;AACvBA,IAAAA,KAAK,CAACC,cAAN;AACAD,IAAAA,KAAK,CAACE,eAAN;AAEA,QAAM;AAAEhB,MAAAA;AAAF,QAAoB,KAAKF,KAA/B;AACA,QAAMW,IAAI,GAAG,CAAC,GAAG,KAAKhB,QAAL,CAAcgB,IAAd,EAAJ,CAAb;AACA,QAAMQ,QAAQ,GAAGR,IAAI,CAACE,SAAL,CACfC,GAAG,IAAIA,GAAG,KAAKZ,aAAR,IAAyBA,aAAa,IAAI,IADlC,CAAjB;;AAGA,QAAIiB,QAAQ,GAAG,CAAf,EAAkB;AAChB;AACD;;AACD,QAAMC,SAAS,GAAGT,IAAI,CAACQ,QAAD,CAAtB;AACA,QAAME,OAAO,GAAG,KAAK1B,QAAL,CAAc2B,GAAd,CAAkBF,SAAlB,CAAhB;AACA,QAAMG,gBAAgB,GAAG,KAAKd,gBAAL,CAAsBW,SAAtB,CAAzB;AACA,QAAMI,OAAO,4BAAG,KAAK3B,YAAL,CAAkByB,GAAlB,CAAsBF,SAAtB,CAAH,0DAAG,sBAAkCK,OAAlD;AACA,QAAMC,WAAW,GAAGF,OAAH,aAAGA,OAAH,gDAAGA,OAAO,CAAEG,aAAZ,0DAAG,sBAAwBC,kBAA5C;;AACA,QAAIF,WAAJ,EAAiB;AACf,UAAM;AAAEG,QAAAA;AAAF,UAAgBH,WAAtB;AACA,UAAMI,GAAG,GAAGD,SAAZ;AACA,WAAK/B,gBAAL,CAAsB2B,OAAtB,CAA8BM,MAA9B,CAAqC;AACnCD,QAAAA,GADmC;AAEnCE,QAAAA,IAAI,EAAE;AAF6B,OAArC;AAID;;AAED,SAAKC,OAAL,CAAaZ,OAAb;AACA,SAAKb,QAAL,CAAc;AAAEN,MAAAA,aAAa,EAAEqB;AAAjB,KAAd;AACD;;AAEDU,EAAAA,OAAO,CAACZ,OAAD,EAAU;AACf,QAAM;AAAEa,MAAAA;AAAF,QAAgB,KAAK7C,KAA3B;AACA6C,IAAAA,SAAS,CAACb,OAAD,CAAT;AAEA,SAAKb,QAAL,CAAc;AAAEP,MAAAA,UAAU,EAAE;AAAd,KAAd;AACD;;AAEDT,EAAAA,eAAe,CAACH,KAAD,EAAQ;AACrB,QAAM;AAAE8C,MAAAA,QAAF;AAAYC,MAAAA,SAAZ;AAAuBC,MAAAA,MAAvB;AAA+BC,MAAAA;AAA/B,QAAwCjD,KAA9C;AACA,QAAM;AAAEY,MAAAA,UAAF;AAAcC,MAAAA;AAAd,QAAgC,KAAKF,KAA3C;AACA,QAAM;AAAEmC,MAAAA,QAAQ,EAAEI,YAAZ;AAA0BC,MAAAA;AAA1B,QAAuCF,IAA7C;AACA,QAAM;AAAEG,MAAAA;AAAF,QAAYD,QAAlB;AACA,QAAM;AAAE9B,MAAAA;AAAF,QAAW+B,KAAjB;AACA,QAAMpB,OAAO,GAAGkB,YAAY,CAAC,CAAD,CAAZ,CAAgBG,KAAhC;AACA,QAAMC,GAAG,gBAAGlE,KAAK,CAACsB,SAAN,EAAZ;AACA,QAAM6C,YAAY,GAAG,KAAKjD,QAAL,CAAckD,IAAd,KAAuB,CAA5C;AACA,QAAMC,UAAU,GACd5C,aAAa,KAAKQ,IAAlB,IACCkC,YAAY,IAAI1C,aAAa,IAAI,IAAjC,IAAyC,CAACD,UAF7C;AAGA,QAAM8C,QAAQ,GAAGX,SAAS,SAAT,IAAAA,SAAS,WAAT,IAAAA,SAAS,CAAEY,UAAX,CAAsB,WAAtB,IACbZ,SAAS,CAACa,SAAV,CAAoB,CAApB,CADa,GAEb,WAFJ;;AAIA,QAAIZ,MAAJ,EAAY;AACV,0BAAO;AAAM,QAAA,SAAS,EAAED;AAAjB,SAA6BD,QAA7B,CAAP;AACD;;AAED,SAAKxC,QAAL,CAAcuD,GAAd,CAAkBxC,IAAlB,EAAwBW,OAAxB;AACA,SAAKxB,YAAL,CAAkBqD,GAAlB,CAAsBxC,IAAtB,EAA4BiC,GAA5B;AAEA,wBACE;AACE,MAAA,SAAS,EAAE3D,UAAU,CAAC,qCAAD,EAAwC;AAC3D,uBAAe8D;AAD4C,OAAxC,CADvB;AAIE,MAAA,GAAG,EAAEH,GAJP;AAKE,MAAA,OAAO,EAAE,MAAM;AACb,aAAKnC,QAAL,CAAc;AAAEN,UAAAA,aAAa,EAAEQ;AAAjB,SAAd;AACD,OAPH;AAQE,MAAA,IAAI,EAAC;AARP,oBAUE,oBAAC,MAAD;AACE,MAAA,IAAI,EAAC,OADP;AAEE,MAAA,IAAI,EAAEzB,MAFR;AAGE,MAAA,SAAS,EAAC,gBAHZ;AAIE,MAAA,OAAO,EAAE+B,KAAK,IAAI;AAChBA,QAAAA,KAAK,CAACE,eAAN;AACAF,QAAAA,KAAK,CAACC,cAAN;AAEA,aAAKgB,OAAL,CAAaZ,OAAb;AACA,aAAKb,QAAL,CAAc;AAAEN,UAAAA,aAAa,EAAEQ;AAAjB,SAAd;AACD,OAVH;AAWE,MAAA,OAAO,EAAC;AAXV,MAVF,eAuBE,+CACE,oBAAC,IAAD;AAAM,MAAA,QAAQ,EAAEqC;AAAhB,OACGtE,KAAK,CAAC0E,QAAN,CAAeC,GAAf,CAAmBjB,QAAnB,EAA6BkB,KAAK,IACjC,OAAOA,KAAP,KAAiB,QAAjB,GAA4BA,KAAK,CAACC,IAAN,EAA5B,GAA2CD,KAD5C,CADH,CADF,CAvBF,CADF;AAiCD,GAjJ+D,CAmJhE;;;AACA5D,EAAAA,UAAU,CAACJ,KAAD,EAAQ;AAChB,QAAM;AAAEkE,MAAAA;AAAF,QAAkB,KAAKlE,KAA7B,CADgB,CAEhB;;AACA,wBAAO,sCAAOA,KAAP;AAAc,MAAA,OAAO,EAAEkE;AAAvB,OAAP;AACD;;AAEDC,EAAAA,MAAM,GAAG;AACP,QAAM;AACJC,MAAAA,SADI;AAEJpD,MAAAA,OAFI;AAGJqD,MAAAA,mBAHI;AAIJC,MAAAA,iBAJI;AAKJC,MAAAA;AALI,QAMF,KAAKvE,KANT;AAOA,QAAM;AAAEY,MAAAA,UAAF;AAAcC,MAAAA;AAAd,QAAgC,KAAKF,KAA3C;AACA,wBACE;AACE,MAAA,SAAS,EAAC,oCADZ;AAEE,MAAA,GAAG,EAAEN,SAAS,IAAI;AAChB,aAAKA,SAAL,GAAiBA,SAAjB;AACD;AAJH,oBAME;AAAK,MAAA,SAAS,EAAC;AAAf,oBACE,oBAAC,MAAD;AACE,MAAA,SAAS,EAAEV,UAAU,CAAC,wBAAD,EAA2B;AAC9C6E,QAAAA,QAAQ,EAAE,CAAC5D;AADmC,OAA3B,CADvB;AAIE,MAAA,IAAI,EAAC,OAJP;AAKE,MAAA,IAAI,EAAEhB,MALR;AAME,MAAA,OAAO,EAAE,KAAKK,iBANhB;AAOE,MAAA,OAAO,EAAC,0BAPV;AAQE,MAAA,QAAQ,EAAEW,UAAU,IAAIC,aAAa,IAAI;AAR3C,2BADF,CANF,eAoBE;AAAK,MAAA,SAAS,EAAC,0BAAf;AAA0C,MAAA,GAAG,EAAE,KAAKJ;AAApD,OACG2D,SAAS,gBACR,oBAAC,MAAD;AACE,MAAA,QAAQ,EAAE;AACRV,QAAAA,QAAQ,EAAE,UADF;AAERL,QAAAA,KAAK,EAAErC,OAFC;AAGRyD,QAAAA,WAAW,EAAE;AAHL,OADZ;AAME,MAAA,mBAAmB,EAAEJ;AANvB,MADQ,gBAUR,oBAAC,QAAD;AACE,MAAA,UAAU,EAAE;AAAEK,QAAAA,IAAI,EAAE,KAAKvE,eAAb;AAA8BwE,QAAAA,CAAC,EAAE,KAAKvE;AAAtC,OADd;AAEE,MAAA,UAAU,EAAC,QAFb;AAGE,MAAA,aAAa,EAAE,CAACP,SAAD,CAHjB;AAIE,MAAA,gBAAgB,EAAE0E,gBAJpB;AAKE,MAAA,iBAAiB,EAAED,iBALrB;AAME,MAAA,mBAAmB;AANrB,OAQGtD,OARH,CAXJ,CApBF,CADF;AA8CD;;AAjN+D;AAoNlElB,sBAAsB,CAAC8E,SAAvB,GAAmC;AACjCR,EAAAA,SAAS,EAAE9E,SAAS,CAACuF,IADY;AAEjChC,EAAAA,SAAS,EAAEvD,SAAS,CAACwF,IAFY;AAGjC9D,EAAAA,OAAO,EAAE1B,SAAS,CAACyF,MAHc;AAIjCV,EAAAA,mBAAmB,EAAE/E,SAAS,CAACwF,IAAV,CAAeE,UAJH;AAKjCd,EAAAA,WAAW,EAAE5E,SAAS,CAACwF,IALU;AAMjCR,EAAAA,iBAAiB,EAAEhF,SAAS,CAACwF,IANI;AAOjCP,EAAAA,gBAAgB,EAAEjF,SAAS,CAACwF;AAPK,CAAnC;AAUAhF,sBAAsB,CAACmF,YAAvB,GAAsC;AACpCb,EAAAA,SAAS,EAAE,KADyB;AAEpCpD,EAAAA,OAAO,EAAE,EAF2B;AAGpCkD,EAAAA,WAAW,EAAEgB,SAHuB;AAIpCrC,EAAAA,SAAS,EAAE,MAAM,CAAE,CAJiB;AAKpCyB,EAAAA,iBAAiB,EAAEY,SALiB;AAMpCX,EAAAA,gBAAgB,EAAEW;AANkB,CAAtC","sourcesContent":["import React, { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport Markdown from 'react-markdown';\nimport { Button } from '@deephaven/components';\nimport { Code, Editor } from '@deephaven/console';\nimport classNames from 'classnames';\nimport { vsPlay } from '@deephaven/icons';\nimport remarkGfm from 'remark-gfm';\n\nexport default class MarkdownNotebookEditor 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 this.container = null;\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 // 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 componentDidUpdate(prevProps) {\n const { content } = this.props;\n if (prevProps.content !== content) {\n this.resetBlocks();\n }\n }\n\n resetBlocks() {\n this.codeElements.clear();\n this.commands.clear();\n this.setState({ nextStartLine: null });\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-editor-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 // eslint-disable-next-line class-methods-use-this\n renderLink(props) {\n const { onLinkClick } = this.props;\n // eslint-disable-next-line react/jsx-props-no-spreading,jsx-a11y/anchor-has-content,jsx-a11y/no-static-element-interactions\n return <a {...props} onClick={onLinkClick} />;\n }\n\n render() {\n const {\n isEditing,\n content,\n onEditorInitialized,\n transformImageUri,\n transformLinkUri,\n } = this.props;\n const { hasRunCode, nextStartLine } = this.state;\n return (\n <div\n className=\"markdown-notebook-editor-container\"\n ref={container => {\n this.container = container;\n }}\n >\n <div className=\"markdown-notebook-editor-toolbar\">\n <Button\n className={classNames('btn-play-selected-cell', {\n flashing: !hasRunCode,\n })}\n kind=\"ghost\"\n icon={vsPlay}\n onClick={this.handleRunSelected}\n tooltip=\"Run code and select next\"\n disabled={hasRunCode && nextStartLine == null}\n >\n Run Selected Code\n </Button>\n </div>\n <div className=\"markdown-notebook-editor\" ref={this.editorScrollView}>\n {isEditing ? (\n <Editor\n settings={{\n language: 'markdown',\n value: content,\n lineNumbers: 'off',\n }}\n onEditorInitialized={onEditorInitialized}\n />\n ) : (\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 )}\n </div>\n </div>\n );\n }\n}\n\nMarkdownNotebookEditor.propTypes = {\n isEditing: PropTypes.bool,\n onRunCode: PropTypes.func,\n content: PropTypes.string,\n onEditorInitialized: PropTypes.func.isRequired,\n onLinkClick: PropTypes.func,\n transformImageUri: PropTypes.func,\n transformLinkUri: PropTypes.func,\n};\n\nMarkdownNotebookEditor.defaultProps = {\n isEditing: false,\n content: '',\n onLinkClick: undefined,\n onRunCode: () => {},\n transformImageUri: undefined,\n transformLinkUri: undefined,\n};\n"],"file":"MarkdownNotebookEditor.js"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
.markdown-notebook-title.is-preview {
|
|
2
|
+
font-style: italic;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
.markdown-notebook-container .markdown-notebook-editor-container {
|
|
6
|
+
width: 100%;
|
|
7
|
+
height: 100%;
|
|
8
|
+
display: flex;
|
|
9
|
+
flex-direction: column;
|
|
10
|
+
}
|
|
11
|
+
.markdown-notebook-container .markdown-notebook-editor-toolbar {
|
|
12
|
+
display: flex;
|
|
13
|
+
align-items: center;
|
|
14
|
+
padding: 0.25rem;
|
|
15
|
+
width: 100%;
|
|
16
|
+
flex: 0 0 36px;
|
|
17
|
+
border-bottom: 2px solid #1a171a;
|
|
18
|
+
}
|
|
19
|
+
.markdown-notebook-container .markdown-notebook-editor-toolbar .btn-play-selected-cell {
|
|
20
|
+
color: #9edc6f;
|
|
21
|
+
min-height: 34px;
|
|
22
|
+
}
|
|
23
|
+
.markdown-notebook-container .edit-hint {
|
|
24
|
+
position: absolute;
|
|
25
|
+
top: 0;
|
|
26
|
+
right: 0;
|
|
27
|
+
padding: 5px 20px;
|
|
28
|
+
text-align: right;
|
|
29
|
+
width: 100%;
|
|
30
|
+
min-height: 30px;
|
|
31
|
+
height: 30px;
|
|
32
|
+
opacity: 0;
|
|
33
|
+
user-select: none;
|
|
34
|
+
transition: opacity 0.15s ease-out;
|
|
35
|
+
pointer-events: none;
|
|
36
|
+
}
|
|
37
|
+
.markdown-notebook-container .markdown-notebook-editor {
|
|
38
|
+
flex-grow: 1;
|
|
39
|
+
width: 100%;
|
|
40
|
+
padding: 0 15px;
|
|
41
|
+
overflow: auto;
|
|
42
|
+
position: relative;
|
|
43
|
+
scroll-behavior: smooth;
|
|
44
|
+
}
|
|
45
|
+
.markdown-notebook-container .markdown-notebook-editor h1,
|
|
46
|
+
.markdown-notebook-container .markdown-notebook-editor h2,
|
|
47
|
+
.markdown-notebook-container .markdown-notebook-editor h3 {
|
|
48
|
+
margin-top: 3rem;
|
|
49
|
+
}
|
|
50
|
+
.markdown-notebook-container:hover .edit-hint.viewing {
|
|
51
|
+
opacity: 1;
|
|
52
|
+
}
|
|
53
|
+
.markdown-notebook-container blockquote {
|
|
54
|
+
border-left: 0.25em solid #929192;
|
|
55
|
+
padding: 0 1em;
|
|
56
|
+
color: #f0f0ee;
|
|
57
|
+
}
|
|
58
|
+
.markdown-notebook-container pre {
|
|
59
|
+
overflow: hidden;
|
|
60
|
+
}
|
|
61
|
+
.markdown-notebook-container pre > code {
|
|
62
|
+
display: block;
|
|
63
|
+
padding: 0.5rem;
|
|
64
|
+
}
|
|
65
|
+
.markdown-notebook-container a {
|
|
66
|
+
color: #4878ea;
|
|
67
|
+
}
|
|
68
|
+
.markdown-notebook-container a:visited {
|
|
69
|
+
color: #aa9af4;
|
|
70
|
+
}
|
|
71
|
+
.markdown-notebook-container .markdown-notebook-editor-code-block {
|
|
72
|
+
position: relative;
|
|
73
|
+
border-radius: 0 4px 4px 0;
|
|
74
|
+
}
|
|
75
|
+
.markdown-notebook-container .markdown-notebook-editor-code-block .btn-play-block {
|
|
76
|
+
color: #9edc6f;
|
|
77
|
+
opacity: 0;
|
|
78
|
+
position: absolute;
|
|
79
|
+
top: 0;
|
|
80
|
+
right: 0;
|
|
81
|
+
margin: 3px;
|
|
82
|
+
transition: opacity 0.15s ease-out;
|
|
83
|
+
}
|
|
84
|
+
.markdown-notebook-container .markdown-notebook-editor-code-block code {
|
|
85
|
+
color: #f0f0ee;
|
|
86
|
+
background: #403e41;
|
|
87
|
+
padding: 0.5rem;
|
|
88
|
+
border-radius: 4px;
|
|
89
|
+
border: 1px solid #1a171a;
|
|
90
|
+
overflow: auto;
|
|
91
|
+
display: block;
|
|
92
|
+
}
|
|
93
|
+
.markdown-notebook-container .markdown-notebook-editor-code-block.is-selected::after {
|
|
94
|
+
position: absolute;
|
|
95
|
+
top: 0;
|
|
96
|
+
left: 0;
|
|
97
|
+
bottom: 0;
|
|
98
|
+
width: 5px;
|
|
99
|
+
margin: 1px 0 1px 0;
|
|
100
|
+
background: #4878ea;
|
|
101
|
+
content: "";
|
|
102
|
+
pointer-events: none;
|
|
103
|
+
border-radius: 4px 0 0 4px;
|
|
104
|
+
}
|
|
105
|
+
.markdown-notebook-container .markdown-notebook-editor-code-block.is-selected .btn-play-block, .markdown-notebook-container .markdown-notebook-editor-code-block:hover .btn-play-block {
|
|
106
|
+
opacity: 1;
|
|
107
|
+
}
|
|
108
|
+
.markdown-notebook-container .flashing {
|
|
109
|
+
animation-duration: 1s;
|
|
110
|
+
animation-name: flash;
|
|
111
|
+
animation-timing-function: ease-in-out;
|
|
112
|
+
animation-iteration-count: infinite;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
@keyframes flash {
|
|
116
|
+
0% {
|
|
117
|
+
text-shadow: 0 0 5px #2d2a2e, 0 0 20px #2d2a2e;
|
|
118
|
+
}
|
|
119
|
+
50% {
|
|
120
|
+
text-shadow: 0 0 2px rgba(255, 255, 255, 0.5), 0 0 10px #9edc6f;
|
|
121
|
+
}
|
|
122
|
+
100% {
|
|
123
|
+
text-shadow: 0 0 5px #2d2a2e, 0 0 20px #2d2a2e;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/*# sourceMappingURL=MarkdownNotebookPanel.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../../src/panels/MarkdownNotebookPanel.scss","../../../components/scss/new_variables.scss","../../../components/scss/bootstrap_overrides.scss"],"names":[],"mappings":"AAME;EACE;;;AAKF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA,SCpBO;EDqBP;EACA;EACA;;AACA;EACE,OErBE;EFsBF;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA,YAtCe;EAuCf,QAvCe;EAwCf;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;AAAA;EAGE;;AAIJ;EACE;;AAGF;EACE;EACA;EACA,OExDa;;AF2Df;EACE;;AAGF;EACE;EACA,SC3EO;;AD8ET;EACE,OEtEY;;AFwEZ;EACE,OE7EG;;AFiFP;EACE;EACA;;AAEA;EACE,OExFE;EFyFF;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE,OE3FW;EF4FX,YEjFK;EFkFL,SCvGK;EDwGL,eEcU;EFbV;EACA;EACA;;AAIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA,YE7GQ;EF8GR;EACA;EACA;;AAMF;EACE;;AAKN;EACE;EACA;EACA;EACA;;;AAIJ;EACE;IACE;;EAGF;IACE;;EAGF;IACE","file":"MarkdownNotebookPanel.css"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
export class MarkdownNotebookPanel extends React.Component<any, any, any> {
|
|
2
|
+
static COMPONENT: string;
|
|
3
|
+
constructor(props: any);
|
|
4
|
+
handleContainerDoubleClick(event: any): void;
|
|
5
|
+
handleEditorInitialized(editor: any): void;
|
|
6
|
+
handleEditorBlur(event: any): void;
|
|
7
|
+
handleEditorResize(): void;
|
|
8
|
+
/**
|
|
9
|
+
* @param {MouseEvent} event The click event from clicking on the link
|
|
10
|
+
*/
|
|
11
|
+
handleLinkClick(event: MouseEvent): void;
|
|
12
|
+
handleTab(tab: any): void;
|
|
13
|
+
handleRunCommand(command: any): void;
|
|
14
|
+
/**
|
|
15
|
+
* Transform the link URI to load from where the notebook is if it's relative
|
|
16
|
+
* @param {String} src The link to transform
|
|
17
|
+
* @returns String the transformed link
|
|
18
|
+
*/
|
|
19
|
+
transformLinkUri(src: string): string;
|
|
20
|
+
pending: Pending;
|
|
21
|
+
markdownEditor: MarkdownNotebookEditor | null;
|
|
22
|
+
editor: any;
|
|
23
|
+
initNotebookContent(): void;
|
|
24
|
+
initTab(tab: any): void;
|
|
25
|
+
tabTitleElement: any;
|
|
26
|
+
setPreviewStatus(): void;
|
|
27
|
+
registerFileMetadata(fileMetadata: any, isPreview: any): void;
|
|
28
|
+
setEditorPosition(clickPositionY: any): void;
|
|
29
|
+
}
|
|
30
|
+
export namespace MarkdownNotebookPanel {
|
|
31
|
+
namespace propTypes {
|
|
32
|
+
const id: PropTypes.Validator<string>;
|
|
33
|
+
const fileStorage: PropTypes.Validator<PropTypes.InferProps<{
|
|
34
|
+
deleteFile: PropTypes.Validator<(...args: any[]) => any>;
|
|
35
|
+
loadFile: PropTypes.Validator<(...args: any[]) => any>;
|
|
36
|
+
saveFile: PropTypes.Validator<(...args: any[]) => any>;
|
|
37
|
+
}>>;
|
|
38
|
+
const glContainer: PropTypes.Validator<PropTypes.InferProps<{
|
|
39
|
+
on: PropTypes.Requireable<(...args: any[]) => any>;
|
|
40
|
+
off: PropTypes.Requireable<(...args: any[]) => any>;
|
|
41
|
+
isHidden: PropTypes.Requireable<boolean>;
|
|
42
|
+
tab: PropTypes.Requireable<PropTypes.InferProps<{
|
|
43
|
+
header: PropTypes.Requireable<PropTypes.InferProps<{
|
|
44
|
+
tabs: PropTypes.Requireable<(PropTypes.InferProps<{
|
|
45
|
+
contentItem: PropTypes.Requireable<PropTypes.InferProps<{}>>;
|
|
46
|
+
}> | null | undefined)[]>;
|
|
47
|
+
}>>;
|
|
48
|
+
}>>;
|
|
49
|
+
title: PropTypes.Requireable<string>;
|
|
50
|
+
setTitle: PropTypes.Requireable<(...args: any[]) => any>;
|
|
51
|
+
close: PropTypes.Requireable<(...args: any[]) => any>;
|
|
52
|
+
}>>;
|
|
53
|
+
const glEventHub: PropTypes.Validator<PropTypes.InferProps<{
|
|
54
|
+
on: PropTypes.Requireable<(...args: any[]) => any>;
|
|
55
|
+
off: PropTypes.Requireable<(...args: any[]) => any>;
|
|
56
|
+
emit: PropTypes.Requireable<(...args: any[]) => any>;
|
|
57
|
+
}>>;
|
|
58
|
+
const metadata: PropTypes.Requireable<PropTypes.InferProps<{
|
|
59
|
+
itemName: PropTypes.Requireable<string>;
|
|
60
|
+
}>>;
|
|
61
|
+
const panelState: PropTypes.Requireable<PropTypes.InferProps<{
|
|
62
|
+
content: PropTypes.Requireable<string>;
|
|
63
|
+
isPreview: PropTypes.Requireable<boolean>;
|
|
64
|
+
fileMetadata: PropTypes.Requireable<PropTypes.InferProps<{
|
|
65
|
+
id: PropTypes.Requireable<string>;
|
|
66
|
+
itemName: PropTypes.Requireable<string>;
|
|
67
|
+
}>>;
|
|
68
|
+
}>>;
|
|
69
|
+
const isPreview: PropTypes.Requireable<boolean>;
|
|
70
|
+
const notebooksUrl: PropTypes.Requireable<string>;
|
|
71
|
+
const session: PropTypes.Validator<PropTypes.InferProps<{}>>;
|
|
72
|
+
const sessionLanguage: PropTypes.Validator<string>;
|
|
73
|
+
}
|
|
74
|
+
namespace defaultProps {
|
|
75
|
+
const isPreview_1: boolean;
|
|
76
|
+
export { isPreview_1 as isPreview };
|
|
77
|
+
const metadata_1: null;
|
|
78
|
+
export { metadata_1 as metadata };
|
|
79
|
+
const panelState_1: null;
|
|
80
|
+
export { panelState_1 as panelState };
|
|
81
|
+
const notebooksUrl_1: string;
|
|
82
|
+
export { notebooksUrl_1 as notebooksUrl };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
declare var _default: import("react-redux").ConnectedComponent<typeof MarkdownNotebookPanel, any>;
|
|
86
|
+
export default _default;
|
|
87
|
+
import React from "react";
|
|
88
|
+
import { Pending } from "@deephaven/utils";
|
|
89
|
+
import MarkdownNotebookEditor from "./MarkdownNotebookEditor";
|
|
90
|
+
import PropTypes from "prop-types";
|
|
91
|
+
//# sourceMappingURL=MarkdownNotebookPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownNotebookPanel.d.ts","sourceRoot":"","sources":["../../src/panels/MarkdownNotebookPanel.jsx"],"names":[],"mappings":"AAiBA;IACE,yBAA2C;IAE3C,wBAiCC;IAsHD,6CASC;IAED,2CAGC;IAED,mCAqBC;IAED,2BAKC;IAED;;OAEG;IACH,uBAFW,UAAU,QA+BpB;IAED,0BAGC;IAED,qCAsBC;IAED;;;;OAIG;IACH,sCAeC;IA1QC,iBAA4B;IAiB5B,8CAA0B;IAC1B,YAAkB;IA0BpB,4BAkCC;IAED,wBAMC;IAHC,qBAAmC;IAKrC,yBAWC;IAED,8DAQC;IAED,6CAwBC;CA4KF"}
|