@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.
@@ -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":";;AAsCA;IACE,yBAAmC;IAEnC;;MAAoD;IAEpD,4BAAiC;IAEjC,qCAKC;IAED,iFAaC;IAED,wBA0GC;IAoTD,mBAGC;IAvDD,0BAGC;IAnBD,2BAKC;IAED,wBAOC;IAOD,mBAQC;IAED,iCA6BC;IAED,mBAIC;IAOD,oBAGC;IAED,0BAMC;IAED,uCAUC;IAyJD,4BAGC;IAtFD,mDAMC;IAED,qBAIC;IAED,qCAEC;IAED,qBAMC;IAED,0BAMC;IApGD,mBAGC;IA2CD,2BAEC;IAED,oCAgBC;IA/BD,kCASC;IAvCD,mCA4BC;IAqED;;aAKC;IAED,4BAKC;IAED,mBAMC;IAED,yBAEC;IAED,0BAGC;IAED,qCASC;IAED,sBAKC;IAjjBC,iBAA4B;IAE5B,oEAGC;IAED,0DAGC;IAED,8BAAoB;IAEpB,qBAA2B;IAC3B,sBAA4B;IAC5B,qBAAwB;IACxB,2BAA6B;IAyF/B,wBAMC;IAGD,6BAWC;IAED,+BAMC;IAED,wBAQC;IAED,4BAiBC;IAED,gCAGC;IAID,8DASC;IAED,qCAGC;IAED,aA8BC;IAED;;;OAGG;IACH,QAFa,OAAO,CAYnB;IAED;;;;OAIG;IACH,sBAHW,MAAM,WACN,MAAM,QAUhB;IAED,+BAEC;IAED,yBAWC;IAED;;;;;;;QASG;IAEH,uBAiCC;IAgQD,cAMC;IAED,iEA0BC;IAED,+BAOC;CAkMF"}
1
+ {"version":3,"file":"NotebookPanel.d.ts","sourceRoot":"","sources":["../../src/panels/NotebookPanel.jsx"],"names":[],"mappings":";;AAuCA;IACE,yBAAmC;IAEnC;;MAAoD;IAEpD,4BAAiC;IAEjC,qCAKC;IAED,iFAaC;IAED,wBA4GC;IA6SD,mBAGC;IAhDD,0BAGC;IAnBD,2BAKC;IAED,wBAOC;IAOD,mBAQC;IAED,iCAsBC;IAED,mBAIC;IAOD,oBAGC;IAED;;OAEG;IACH,uBAFW,UAAU,QAoCpB;IAED,0BAMC;IAED,uCAUC;IAoJD,4BAGC;IAjFD,mDAMC;IAED,qBAEC;IAED,qCAEC;IAED,qBAMC;IAED,0BAMC;IAlGD,mBAGC;IA2CD,2BAEC;IAED,oCAgBC;IA/BD,kCASC;IAvCD,mCA4BC;IAmED;;aAKC;IAED,4BAKC;IAED,mBAGC;IAED,yBAEC;IAED,0BAGC;IAED,qCASC;IAED,sBAKC;IAOD;;;;OAIG;IACH,4CAsBC;IA9mBC,iBAA4B;IAE5B,oEAGC;IAED,0DAGC;IAED,8BAAoB;IAEpB,qBAA2B;IAC3B,sBAA4B;IAC5B,qBAAwB;IACxB,2BAA6B;IAyF/B,wBAMC;IAGD,6BAWC;IAED,+BAMC;IAED,wBAQC;IAED,4BAiBC;IAED,gCAGC;IAID,8DASC;IAED,qCAGC;IAED,aA8BC;IAED;;;OAGG;IACH,QAFa,OAAO,CAYnB;IAED;;;;OAIG;IACH,sBAHW,MAAM,WACN,MAAM,QAUhB;IAED,+BAEC;IAED,yBAWC;IAED;;;;;;;QASG;IAEH,uBAiCC;IAwTD,cAMC;IAED,iEA0BC;IAED,+BAUC;IAED,4BASC;CAkNF"}