@deephaven/dashboard-core-plugins 0.15.5-beta.0 → 0.15.5-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/dist/ChartBuilderPlugin.d.ts.map +1 -1
  2. package/dist/ChartBuilderPlugin.js +2 -1
  3. package/dist/ChartBuilderPlugin.js.map +1 -1
  4. package/dist/ConsolePlugin.d.ts +1 -0
  5. package/dist/ConsolePlugin.d.ts.map +1 -1
  6. package/dist/ConsolePlugin.js +5 -3
  7. package/dist/ConsolePlugin.js.map +1 -1
  8. package/dist/FilterPlugin.js +1 -1
  9. package/dist/FilterPlugin.js.map +1 -1
  10. package/dist/controls/ControlType.d.ts +1 -1
  11. package/dist/controls/ControlType.d.ts.map +1 -1
  12. package/dist/controls/ControlType.js.map +1 -1
  13. package/dist/controls/dropdown-filter/DropdownFilter.d.ts +73 -81
  14. package/dist/controls/dropdown-filter/DropdownFilter.d.ts.map +1 -1
  15. package/dist/controls/dropdown-filter/DropdownFilter.js +41 -58
  16. package/dist/controls/dropdown-filter/DropdownFilter.js.map +1 -1
  17. package/dist/controls/input-filter/InputFilter.d.ts +46 -46
  18. package/dist/controls/input-filter/InputFilter.d.ts.map +1 -1
  19. package/dist/controls/input-filter/InputFilter.js +32 -39
  20. package/dist/controls/input-filter/InputFilter.js.map +1 -1
  21. package/dist/controls/markdown/MarkdownContainer.d.ts +11 -16
  22. package/dist/controls/markdown/MarkdownContainer.d.ts.map +1 -1
  23. package/dist/controls/markdown/MarkdownContainer.js +5 -8
  24. package/dist/controls/markdown/MarkdownContainer.js.map +1 -1
  25. package/dist/controls/markdown/MarkdownEditor.d.ts +17 -19
  26. package/dist/controls/markdown/MarkdownEditor.d.ts.map +1 -1
  27. package/dist/controls/markdown/MarkdownEditor.js +5 -8
  28. package/dist/controls/markdown/MarkdownEditor.js.map +1 -1
  29. package/dist/controls/markdown/MarkdownStartPage.d.ts +24 -28
  30. package/dist/controls/markdown/MarkdownStartPage.d.ts.map +1 -1
  31. package/dist/controls/markdown/MarkdownStartPage.js +19 -23
  32. package/dist/controls/markdown/MarkdownStartPage.js.map +1 -1
  33. package/dist/controls/markdown/MarkdownUtils.d.ts +4 -4
  34. package/dist/controls/markdown/MarkdownUtils.d.ts.map +1 -1
  35. package/dist/controls/markdown/MarkdownUtils.js +2 -2
  36. package/dist/controls/markdown/MarkdownUtils.js.map +1 -1
  37. package/dist/events/ChartEvent.d.ts +1 -1
  38. package/dist/events/ChartEvent.d.ts.map +1 -1
  39. package/dist/events/ChartEvent.js.map +1 -1
  40. package/dist/events/ConsoleEvent.d.ts +1 -1
  41. package/dist/events/ConsoleEvent.d.ts.map +1 -1
  42. package/dist/events/ConsoleEvent.js.map +1 -1
  43. package/dist/events/InputFilterEvent.d.ts +1 -1
  44. package/dist/events/InputFilterEvent.d.ts.map +1 -1
  45. package/dist/events/InputFilterEvent.js.map +1 -1
  46. package/dist/events/IrisGridEvent.d.ts +1 -1
  47. package/dist/events/IrisGridEvent.d.ts.map +1 -1
  48. package/dist/events/IrisGridEvent.js.map +1 -1
  49. package/dist/events/NotebookEvent.d.ts +1 -1
  50. package/dist/events/NotebookEvent.d.ts.map +1 -1
  51. package/dist/events/NotebookEvent.js.map +1 -1
  52. package/dist/events/PQEvent.d.ts +1 -1
  53. package/dist/events/PQEvent.d.ts.map +1 -1
  54. package/dist/events/PQEvent.js.map +1 -1
  55. package/dist/events/PandasEvent.d.ts +1 -1
  56. package/dist/events/PandasEvent.d.ts.map +1 -1
  57. package/dist/events/PandasEvent.js.map +1 -1
  58. package/dist/events/TabEvent.d.ts +1 -1
  59. package/dist/events/TabEvent.d.ts.map +1 -1
  60. package/dist/events/TabEvent.js.map +1 -1
  61. package/dist/events/index.d.ts +8 -8
  62. package/dist/events/index.d.ts.map +1 -1
  63. package/dist/events/index.js.map +1 -1
  64. package/dist/linker/ColumnSelectionValidator.d.ts +4 -0
  65. package/dist/linker/ColumnSelectionValidator.d.ts.map +1 -0
  66. package/dist/linker/ColumnSelectionValidator.js +2 -0
  67. package/dist/linker/ColumnSelectionValidator.js.map +1 -0
  68. package/dist/linker/Linker.d.ts +11 -11
  69. package/dist/linker/Linker.js +1 -1
  70. package/dist/linker/Linker.js.map +1 -1
  71. package/dist/linker/LinkerUtils.d.ts +3 -3
  72. package/dist/linker/LinkerUtils.d.ts.map +1 -1
  73. package/dist/linker/LinkerUtils.js.map +1 -1
  74. package/dist/linker/ToolType.d.ts +1 -1
  75. package/dist/linker/ToolType.d.ts.map +1 -1
  76. package/dist/linker/ToolType.js.map +1 -1
  77. package/dist/panels/ChartColumnSelectorOverlay.d.ts +22 -26
  78. package/dist/panels/ChartColumnSelectorOverlay.d.ts.map +1 -1
  79. package/dist/panels/ChartColumnSelectorOverlay.js +5 -14
  80. package/dist/panels/ChartColumnSelectorOverlay.js.map +1 -1
  81. package/dist/panels/ChartFilterOverlay.d.ts +27 -21
  82. package/dist/panels/ChartFilterOverlay.d.ts.map +1 -1
  83. package/dist/panels/ChartFilterOverlay.js.map +1 -1
  84. package/dist/panels/ChartPanel.d.ts +149 -152
  85. package/dist/panels/ChartPanel.d.ts.map +1 -1
  86. package/dist/panels/ChartPanel.js +65 -73
  87. package/dist/panels/ChartPanel.js.map +1 -1
  88. package/dist/panels/CommandHistoryPanel.d.ts +41 -56
  89. package/dist/panels/CommandHistoryPanel.d.ts.map +1 -1
  90. package/dist/panels/CommandHistoryPanel.js +13 -35
  91. package/dist/panels/CommandHistoryPanel.js.map +1 -1
  92. package/dist/panels/ConsolePanel.d.ts +63 -73
  93. package/dist/panels/ConsolePanel.d.ts.map +1 -1
  94. package/dist/panels/ConsolePanel.js +67 -83
  95. package/dist/panels/ConsolePanel.js.map +1 -1
  96. package/dist/panels/DropdownFilterPanel.d.ts +110 -106
  97. package/dist/panels/DropdownFilterPanel.d.ts.map +1 -1
  98. package/dist/panels/DropdownFilterPanel.js +60 -62
  99. package/dist/panels/DropdownFilterPanel.js.map +1 -1
  100. package/dist/panels/FileExplorerPanel.d.ts +5 -7
  101. package/dist/panels/FileExplorerPanel.d.ts.map +1 -1
  102. package/dist/panels/FileExplorerPanel.js.map +1 -1
  103. package/dist/panels/FilterSetManager.d.ts +3 -1
  104. package/dist/panels/FilterSetManager.d.ts.map +1 -1
  105. package/dist/panels/FilterSetManager.js.map +1 -1
  106. package/dist/panels/FilterSetManagerPanel.d.ts +83 -62
  107. package/dist/panels/FilterSetManagerPanel.d.ts.map +1 -1
  108. package/dist/panels/FilterSetManagerPanel.js +58 -36
  109. package/dist/panels/FilterSetManagerPanel.js.map +1 -1
  110. package/dist/panels/InputFilterPanel.d.ts +50 -51
  111. package/dist/panels/InputFilterPanel.d.ts.map +1 -1
  112. package/dist/panels/InputFilterPanel.js +35 -34
  113. package/dist/panels/InputFilterPanel.js.map +1 -1
  114. package/dist/panels/IrisGridPanel.d.ts +191 -178
  115. package/dist/panels/IrisGridPanel.d.ts.map +1 -1
  116. package/dist/panels/IrisGridPanel.js +150 -179
  117. package/dist/panels/IrisGridPanel.js.map +1 -1
  118. package/dist/panels/LogPanel.d.ts +29 -45
  119. package/dist/panels/LogPanel.d.ts.map +1 -1
  120. package/dist/panels/LogPanel.js +9 -11
  121. package/dist/panels/LogPanel.js.map +1 -1
  122. package/dist/panels/MarkdownNotebook.d.ts +34 -34
  123. package/dist/panels/MarkdownNotebook.d.ts.map +1 -1
  124. package/dist/panels/MarkdownNotebook.js +21 -18
  125. package/dist/panels/MarkdownNotebook.js.map +1 -1
  126. package/dist/panels/MarkdownPanel.d.ts +41 -47
  127. package/dist/panels/MarkdownPanel.d.ts.map +1 -1
  128. package/dist/panels/MarkdownPanel.js +17 -19
  129. package/dist/panels/MarkdownPanel.js.map +1 -1
  130. package/dist/panels/NotebookPanel.d.ts +137 -117
  131. package/dist/panels/NotebookPanel.d.ts.map +1 -1
  132. package/dist/panels/NotebookPanel.js +94 -68
  133. package/dist/panels/NotebookPanel.js.map +1 -1
  134. package/dist/panels/PandasPanel.d.ts +20 -17
  135. package/dist/panels/PandasPanel.d.ts.map +1 -1
  136. package/dist/panels/PandasPanel.js +17 -13
  137. package/dist/panels/PandasPanel.js.map +1 -1
  138. package/dist/panels/Panel.d.ts +87 -123
  139. package/dist/panels/Panel.d.ts.map +1 -1
  140. package/dist/panels/Panel.js +29 -54
  141. package/dist/panels/Panel.js.map +1 -1
  142. package/dist/panels/PanelContextMenu.d.ts +16 -31
  143. package/dist/panels/PanelContextMenu.d.ts.map +1 -1
  144. package/dist/panels/PanelContextMenu.js +12 -15
  145. package/dist/panels/PanelContextMenu.js.map +1 -1
  146. package/dist/panels/RenameDialog.d.ts +26 -28
  147. package/dist/panels/RenameDialog.d.ts.map +1 -1
  148. package/dist/panels/RenameDialog.js +15 -19
  149. package/dist/panels/RenameDialog.js.map +1 -1
  150. package/dist/panels/WidgetPanel.d.ts +72 -106
  151. package/dist/panels/WidgetPanel.d.ts.map +1 -1
  152. package/dist/panels/WidgetPanel.js +17 -47
  153. package/dist/panels/WidgetPanel.js.map +1 -1
  154. package/dist/panels/WidgetPanelTooltip.d.ts +29 -22
  155. package/dist/panels/WidgetPanelTooltip.d.ts.map +1 -1
  156. package/dist/panels/WidgetPanelTooltip.js +1 -1
  157. package/dist/panels/WidgetPanelTooltip.js.map +1 -1
  158. package/dist/prop-types/CommonPropTypes.d.ts +4 -4
  159. package/dist/prop-types/CommonPropTypes.d.ts.map +1 -1
  160. package/dist/prop-types/CommonPropTypes.js +1 -1
  161. package/dist/prop-types/CommonPropTypes.js.map +1 -1
  162. package/dist/prop-types/UIPropTypes.d.ts +2 -7
  163. package/dist/prop-types/UIPropTypes.d.ts.map +1 -1
  164. package/dist/prop-types/UIPropTypes.js +0 -7
  165. package/dist/prop-types/UIPropTypes.js.map +1 -1
  166. package/dist/prop-types/index.d.ts +2 -2
  167. package/dist/prop-types/index.d.ts.map +1 -1
  168. package/dist/prop-types/index.js.map +1 -1
  169. package/dist/redux/actionTypes.d.ts +1 -1
  170. package/dist/redux/actionTypes.d.ts.map +1 -1
  171. package/dist/redux/actionTypes.js.map +1 -1
  172. package/dist/redux/actions.d.ts +63 -8
  173. package/dist/redux/actions.d.ts.map +1 -1
  174. package/dist/redux/actions.js +17 -17
  175. package/dist/redux/actions.js.map +1 -1
  176. package/dist/redux/reducers/index.d.ts +3 -4
  177. package/dist/redux/reducers/index.d.ts.map +1 -1
  178. package/dist/redux/reducers/index.js.map +1 -1
  179. package/dist/redux/reducers/sessionWrapper.d.ts +1 -1
  180. package/dist/redux/reducers/sessionWrapper.d.ts.map +1 -1
  181. package/dist/redux/reducers/sessionWrapper.js.map +1 -1
  182. package/dist/redux/selectors.d.ts +63 -9
  183. package/dist/redux/selectors.d.ts.map +1 -1
  184. package/dist/redux/selectors.js +24 -24
  185. package/dist/redux/selectors.js.map +1 -1
  186. package/package.json +20 -17
@@ -1,15 +1,24 @@
1
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
+
1
3
  import React, { PureComponent } from 'react';
2
4
  import classNames from 'classnames';
3
- import PropTypes from 'prop-types';
4
5
  import Markdown from 'react-markdown';
5
6
  import remarkGfm from 'remark-gfm';
6
7
  import { Button } from '@deephaven/components';
7
8
  import { Code } from '@deephaven/console';
8
9
  import { vsPlay } from '@deephaven/icons';
9
10
  import "./MarkdownNotebook.css";
11
+ import { assertNotNull } from '@deephaven/utils';
10
12
  export class MarkdownNotebook extends PureComponent {
11
13
  constructor(props) {
12
14
  super(props);
15
+
16
+ _defineProperty(this, "commands", void 0);
17
+
18
+ _defineProperty(this, "codeElements", void 0);
19
+
20
+ _defineProperty(this, "editorScrollView", void 0);
21
+
13
22
  this.handleRunSelected = this.handleRunSelected.bind(this);
14
23
  this.renderCodeBlock = this.renderCodeBlock.bind(this);
15
24
  this.renderLink = this.renderLink.bind(this); // Map of each code block from it's starting line number to the code within that block
@@ -50,8 +59,8 @@ export class MarkdownNotebook extends PureComponent {
50
59
  }
51
60
  }
52
61
  /**
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
62
+ * @param line The line of the code block to start from
63
+ * @returns The next line of the code block to start from
55
64
  */
56
65
 
57
66
 
@@ -89,11 +98,13 @@ export class MarkdownNotebook extends PureComponent {
89
98
  var nextElement = element === null || element === void 0 ? void 0 : (_element$parentElemen = element.parentElement) === null || _element$parentElemen === void 0 ? void 0 : _element$parentElemen.nextElementSibling;
90
99
 
91
100
  if (nextElement) {
101
+ var _this$editorScrollVie;
102
+
92
103
  var {
93
104
  offsetTop
94
105
  } = nextElement;
95
106
  var top = offsetTop;
96
- this.editorScrollView.current.scroll({
107
+ (_this$editorScrollVie = this.editorScrollView.current) === null || _this$editorScrollVie === void 0 ? void 0 : _this$editorScrollVie.scroll({
97
108
  top,
98
109
  left: 0
99
110
  });
@@ -130,6 +141,7 @@ export class MarkdownNotebook extends PureComponent {
130
141
  children: nodeChildren,
131
142
  position
132
143
  } = node;
144
+ assertNotNull(position);
133
145
  var {
134
146
  start
135
147
  } = position;
@@ -236,19 +248,10 @@ export class MarkdownNotebook extends PureComponent {
236
248
  }
237
249
 
238
250
  }
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
- };
251
+
252
+ _defineProperty(MarkdownNotebook, "defaultProps", {
253
+ onRunCode: () => undefined
254
+ });
255
+
253
256
  export default MarkdownNotebook;
254
257
  //# sourceMappingURL=MarkdownNotebook.js.map
@@ -1 +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"}
1
+ {"version":3,"sources":["../../src/panels/MarkdownNotebook.tsx"],"names":["React","PureComponent","classNames","Markdown","remarkGfm","Button","Code","vsPlay","assertNotNull","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","undefined"],"mappings":"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","sourcesContent":["import React, {\n PureComponent,\n ReactElement,\n RefObject,\n MouseEvent,\n MouseEventHandler,\n} from 'react';\nimport classNames from 'classnames';\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';\nimport {\n ReactMarkdownProps,\n TransformImage,\n TransformLink,\n} from 'react-markdown/src/ast-to-react';\nimport { assertNotNull } from '@deephaven/utils';\n\ninterface MarkdownNotebookProps {\n onRunCode: (command?: string) => void;\n content: string;\n onLinkClick: MouseEventHandler<HTMLAnchorElement>;\n transformImageUri?: TransformImage;\n transformLinkUri?: false | TransformLink | null;\n}\n\ninterface MarkdownNotebookState {\n hasCode: boolean;\n\n // Keep track if any code has been executed yet. If not, make the run button flash\n hasRunCode: boolean;\n\n // Line of the next block to execute. Null to start at the first block\n nextStartLine: number | null;\n}\n\nexport class MarkdownNotebook extends PureComponent<\n MarkdownNotebookProps,\n MarkdownNotebookState\n> {\n static defaultProps = {\n onRunCode: (): void => undefined,\n };\n\n constructor(props: MarkdownNotebookProps) {\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(): void {\n this.updateHasCode();\n }\n\n componentDidUpdate(): void {\n this.updateHasCode();\n }\n\n commands: Map<number, string>;\n\n codeElements;\n\n editorScrollView: RefObject<HTMLDivElement>;\n\n updateHasCode(): void {\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 line The line of the code block to start from\n * @returns The next line of the code block to start from\n */\n getNextStartLine(line: number | null): number | null {\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: MouseEvent<HTMLButtonElement>): void {\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?: string): void {\n const { onRunCode } = this.props;\n onRunCode(command);\n\n this.setState({ hasRunCode: true });\n }\n\n renderCodeBlock(\n props: JSX.IntrinsicElements['code'] &\n ReactMarkdownProps & {\n inline?: boolean;\n }\n ): ReactElement {\n const { children, className, inline, node } = props;\n const { hasRunCode, nextStartLine } = this.state;\n const { children: nodeChildren, position } = node;\n assertNotNull(position);\n const { start } = position;\n const { line } = start;\n const command = (nodeChildren[0] as { value: string }).value;\n const ref = React.createRef<HTMLDivElement>();\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(\n props: React.ClassAttributes<HTMLAnchorElement> &\n React.AnchorHTMLAttributes<HTMLAnchorElement> &\n ReactMarkdownProps\n ): ReactElement {\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(): ReactElement {\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\nexport default MarkdownNotebook;\n"],"file":"MarkdownNotebook.js"}
@@ -1,53 +1,47 @@
1
- export class MarkdownPanel extends React.Component<any, any, any> {
1
+ import { Component, FocusEvent, MouseEvent, ReactElement } from 'react';
2
+ import { ClosedPanel, ClosedPanels } from '@deephaven/dashboard';
3
+ import { Container, EventEmitter, ReactComponentConfig } from '@deephaven/golden-layout';
4
+ import type * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js';
5
+ import MarkdownEditor from '../controls/markdown/MarkdownEditor';
6
+ import './MarkdownPanel.scss';
7
+ interface PanelState {
8
+ content?: string;
9
+ }
10
+ interface MarkdownPanelProps {
11
+ glContainer: Container;
12
+ glEventHub: EventEmitter;
13
+ panelState: PanelState;
14
+ closedPanels: ClosedPanel[];
15
+ }
16
+ interface MarkdownPanelState {
17
+ isStartPageShown: boolean;
18
+ isEditing: boolean;
19
+ content?: string | null;
20
+ panelState: PanelState;
21
+ }
22
+ export declare class MarkdownPanel extends Component<MarkdownPanelProps, MarkdownPanelState> {
23
+ static defaultProps: {
24
+ panelState: null;
25
+ };
2
26
  static COMPONENT: string;
3
- constructor(props: any);
4
- handleContainerDoubleClick(event: any): void;
27
+ constructor(props: MarkdownPanelProps);
28
+ markdownEditor: MarkdownEditor | null;
29
+ editor?: monaco.editor.IStandaloneCodeEditor;
30
+ setEditorPosition(clickPositionY: number): void;
31
+ getClosedMarkdowns: (closedPanels: ClosedPanels) => ReactComponentConfig[];
32
+ handleContainerDoubleClick(event: MouseEvent<Element>): void;
33
+ handleEditorInitialized(editor: monaco.editor.IStandaloneCodeEditor): void;
5
34
  handleCreateMarkdown(): void;
6
- handleDeleteMarkdown(markdown: any): void;
7
- handleOpenMarkdown(markdown: any): void;
8
- handleEditorInitialized(editor: any): void;
9
- handleEditorBlur(event: any): void;
35
+ handleOpenMarkdown(markdown: ReactComponentConfig): void;
36
+ handleDeleteMarkdown(markdown: ReactComponentConfig): void;
37
+ handleEditorBlur(event: FocusEvent<HTMLDivElement>): void;
10
38
  handleEditorResize(): void;
11
- markdownEditor: MarkdownEditor | null;
12
- editor: any;
13
- setEditorPosition(clickPositionY: any): void;
14
- getClosedMarkdowns: (this: any, closedPanels: any) => any;
15
- }
16
- export namespace MarkdownPanel {
17
- namespace propTypes {
18
- const glContainer: PropTypes.Validator<PropTypes.InferProps<{
19
- on: PropTypes.Requireable<(...args: any[]) => any>;
20
- off: PropTypes.Requireable<(...args: any[]) => any>;
21
- isHidden: PropTypes.Requireable<boolean>;
22
- tab: PropTypes.Requireable<PropTypes.InferProps<{
23
- header: PropTypes.Requireable<PropTypes.InferProps<{
24
- tabs: PropTypes.Requireable<(PropTypes.InferProps<{
25
- contentItem: PropTypes.Requireable<PropTypes.InferProps<{}>>;
26
- }> | null | undefined)[]>;
27
- }>>;
28
- }>>;
29
- title: PropTypes.Requireable<string>;
30
- setTitle: PropTypes.Requireable<(...args: any[]) => any>;
31
- close: PropTypes.Requireable<(...args: any[]) => any>;
32
- }>>;
33
- const glEventHub: PropTypes.Validator<PropTypes.InferProps<{
34
- on: PropTypes.Requireable<(...args: any[]) => any>;
35
- off: PropTypes.Requireable<(...args: any[]) => any>;
36
- emit: PropTypes.Requireable<(...args: any[]) => any>;
37
- }>>;
38
- const panelState: PropTypes.Requireable<PropTypes.InferProps<{
39
- content: PropTypes.Requireable<string>;
40
- }>>;
41
- const closedPanels: PropTypes.Validator<(object | null | undefined)[]>;
42
- }
43
- namespace defaultProps {
44
- const panelState_1: null;
45
- export { panelState_1 as panelState };
46
- }
39
+ render(): ReactElement;
47
40
  }
48
- declare var _default: import("react-redux").ConnectedComponent<typeof MarkdownPanel, any>;
41
+ declare const _default: import("react-redux").ConnectedComponent<typeof MarkdownPanel, import("react-redux").Omit<Pick<MarkdownPanelProps, "glContainer" | "glEventHub" | "closedPanels"> & Partial<Pick<MarkdownPanelProps, "panelState">> & Partial<Pick<{
42
+ panelState: null;
43
+ }, never>>, "closedPanels"> & {
44
+ localDashboardId: string;
45
+ }>;
49
46
  export default _default;
50
- import React from "react";
51
- import MarkdownEditor from "../controls/markdown/MarkdownEditor";
52
- import PropTypes from "prop-types";
53
47
  //# sourceMappingURL=MarkdownPanel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownPanel.d.ts","sourceRoot":"","sources":["../../src/panels/MarkdownPanel.jsx"],"names":[],"mappings":"AAmBA;IACE,yBAAmC;IAEnC,wBA8BC;IAgCD,6CASC;IAOD,6BAkBC;IAUD,0CAGC;IAXD,wCAMC;IA/BD,2CAGC;IAmCD,mCAqBC;IAED,2BAKC;IA/GC,sCAA0B;IAC1B,YAAkB;IAGpB,6CAwBC;IAED,0DAEE;CA0HH"}
1
+ {"version":3,"file":"MarkdownPanel.d.ts","sourceRoot":"","sources":["../../src/panels/MarkdownPanel.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG/E,OAAO,EACL,WAAW,EACX,YAAY,EAIb,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,SAAS,EACT,YAAY,EACZ,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,KAAK,MAAM,MAAM,2CAA2C,CAAC;AAMzE,OAAO,cAAc,MAAM,qCAAqC,CAAC;AACjE,OAAO,sBAAsB,CAAC;AAI9B,UAAU,UAAU;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,kBAAkB;IAC1B,WAAW,EAAE,SAAS,CAAC;IACvB,UAAU,EAAE,YAAY,CAAC;IACzB,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B;AAED,UAAU,kBAAkB;IAC1B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAGxB,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,qBAAa,aAAc,SAAQ,SAAS,CAC1C,kBAAkB,EAClB,kBAAkB,CACnB;IACC,MAAM,CAAC,YAAY;;MAEjB;IAEF,MAAM,CAAC,SAAS,SAAmB;gBAEvB,KAAK,EAAE,kBAAkB;IA+BrC,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IAEtC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC;IAE7C,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IA2B/C,kBAAkB,yDAEhB;IAEF,0BAA0B,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,IAAI;IAW5D,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,qBAAqB,GAAG,IAAI;IAK1E,oBAAoB,IAAI,IAAI;IAoB5B,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAQxD,oBAAoB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAK1D,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,cAAc,CAAC,GAAG,IAAI;IAuBzD,kBAAkB,IAAI,IAAI;IAO1B,MAAM,IAAI,YAAY;CAyCvB;;;;;;AAYD,wBAEE"}
@@ -1,11 +1,11 @@
1
1
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
2
 
3
3
  import React, { Component } from 'react';
4
- import PropTypes from 'prop-types';
5
4
  import memoize from 'memoize-one';
6
5
  import { connect } from 'react-redux';
7
- import { getClosedPanelsForDashboard, GLPropTypes, LayoutUtils, PanelEvent } from '@deephaven/dashboard';
6
+ import { getClosedPanelsForDashboard, LayoutUtils, PanelEvent } from '@deephaven/dashboard';
8
7
  import Log from '@deephaven/log';
8
+ import { assertNotNull } from '@deephaven/utils';
9
9
  import Panel from "./Panel.js";
10
10
  import MarkdownContainer from "../controls/markdown/MarkdownContainer.js";
11
11
  import MarkdownStartPage from "../controls/markdown/MarkdownStartPage.js";
@@ -16,6 +16,10 @@ export class MarkdownPanel extends Component {
16
16
  constructor(props) {
17
17
  super(props);
18
18
 
19
+ _defineProperty(this, "markdownEditor", void 0);
20
+
21
+ _defineProperty(this, "editor", void 0);
22
+
19
23
  _defineProperty(this, "getClosedMarkdowns", memoize(closedPanels => closedPanels.filter(panel => panel.component === 'MarkdownPanel').reverse()));
20
24
 
21
25
  this.handleContainerDoubleClick = this.handleContainerDoubleClick.bind(this);
@@ -44,19 +48,21 @@ export class MarkdownPanel extends Component {
44
48
  panelState
45
49
  };
46
50
  this.markdownEditor = null;
47
- this.editor = null;
48
51
  }
49
52
 
50
53
  setEditorPosition(clickPositionY) {
54
+ assertNotNull(this.markdownEditor);
51
55
  var {
52
56
  container: markdownEditorContainer
53
57
  } = this.markdownEditor;
54
58
 
55
59
  if (this.editor && markdownEditorContainer) {
60
+ var _this$editor$getModel, _this$editor$getModel2;
61
+
56
62
  var contentTop = markdownEditorContainer.getBoundingClientRect().top;
57
63
  var contentScrollTop = markdownEditorContainer.scrollTop;
58
64
  var contentScrollHeight = markdownEditorContainer.scrollHeight;
59
- var totalLines = this.editor.getModel().getLineCount();
65
+ var totalLines = (_this$editor$getModel = (_this$editor$getModel2 = this.editor.getModel()) === null || _this$editor$getModel2 === void 0 ? void 0 : _this$editor$getModel2.getLineCount()) !== null && _this$editor$getModel !== void 0 ? _this$editor$getModel : 0;
60
66
  var lineToFocus = Math.round((contentScrollTop + clickPositionY - contentTop) / contentScrollHeight * totalLines);
61
67
 
62
68
  if (lineToFocus > totalLines) {
@@ -127,7 +133,7 @@ export class MarkdownPanel extends Component {
127
133
  }
128
134
 
129
135
  handleEditorBlur(event) {
130
- var _this$markdownEditor, _this$markdownEditor$;
136
+ var _this$markdownEditor, _this$markdownEditor$, _this$editor;
131
137
 
132
138
  log.debug("markdown content changed, saving...");
133
139
  var {
@@ -138,7 +144,7 @@ export class MarkdownPanel extends Component {
138
144
  return;
139
145
  }
140
146
 
141
- var content = this.editor.getValue();
147
+ var content = (_this$editor = this.editor) === null || _this$editor === void 0 ? void 0 : _this$editor.getValue();
142
148
  this.setState({
143
149
  content,
144
150
  isEditing: false,
@@ -193,26 +199,18 @@ export class MarkdownPanel extends Component {
193
199
  this.markdownEditor = markdownEditor;
194
200
  },
195
201
  isEditing: isEditing,
196
- content: content,
202
+ content: content !== null && content !== void 0 ? content : undefined,
197
203
  onEditorInitialized: this.handleEditorInitialized
198
204
  })));
199
205
  }
200
206
 
201
207
  }
202
208
 
203
- _defineProperty(MarkdownPanel, "COMPONENT", 'MarkdownPanel');
204
-
205
- MarkdownPanel.propTypes = {
206
- glContainer: GLPropTypes.Container.isRequired,
207
- glEventHub: GLPropTypes.EventHub.isRequired,
208
- panelState: PropTypes.shape({
209
- content: PropTypes.string
210
- }),
211
- closedPanels: PropTypes.arrayOf(PropTypes.object).isRequired
212
- };
213
- MarkdownPanel.defaultProps = {
209
+ _defineProperty(MarkdownPanel, "defaultProps", {
214
210
  panelState: null
215
- };
211
+ });
212
+
213
+ _defineProperty(MarkdownPanel, "COMPONENT", 'MarkdownPanel');
216
214
 
217
215
  var mapStateToProps = (state, ownProps) => {
218
216
  var {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/panels/MarkdownPanel.jsx"],"names":["React","Component","PropTypes","memoize","connect","getClosedPanelsForDashboard","GLPropTypes","LayoutUtils","PanelEvent","Log","Panel","MarkdownContainer","MarkdownStartPage","MarkdownEditor","log","module","MarkdownPanel","constructor","props","closedPanels","filter","panel","component","reverse","handleContainerDoubleClick","bind","handleCreateMarkdown","handleDeleteMarkdown","handleOpenMarkdown","handleEditorInitialized","handleEditorBlur","handleEditorResize","panelState","content","state","isStartPageShown","isEditing","markdownEditor","editor","setEditorPosition","clickPositionY","container","markdownEditorContainer","contentTop","getBoundingClientRect","top","contentScrollTop","scrollTop","contentScrollHeight","scrollHeight","totalLines","getModel","getLineCount","lineToFocus","Math","round","revealLine","setPosition","lineNumber","column","focus","event","dbClickPositionY","clientY","setState","debug","markdown","glContainer","glEventHub","config","getComponentConfigFromContainer","emit","REOPEN","DELETE","contains","relatedTarget","getValue","layout","render","closedMarkdowns","getClosedMarkdowns","propTypes","Container","isRequired","EventHub","shape","string","arrayOf","object","defaultProps","mapStateToProps","ownProps","localDashboardId","forwardRef"],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport memoize from 'memoize-one';\nimport { connect } from 'react-redux';\nimport {\n getClosedPanelsForDashboard,\n GLPropTypes,\n LayoutUtils,\n PanelEvent,\n} from '@deephaven/dashboard';\nimport Log from '@deephaven/log';\nimport Panel from './Panel';\nimport MarkdownContainer from '../controls/markdown/MarkdownContainer';\nimport MarkdownStartPage from '../controls/markdown/MarkdownStartPage';\nimport MarkdownEditor from '../controls/markdown/MarkdownEditor';\nimport './MarkdownPanel.scss';\n\nconst log = Log.module('MarkdownPanel');\n\nexport class MarkdownPanel extends Component {\n static COMPONENT = 'MarkdownPanel';\n\n constructor(props) {\n super(props);\n\n this.handleContainerDoubleClick = this.handleContainerDoubleClick.bind(\n this\n );\n this.handleCreateMarkdown = this.handleCreateMarkdown.bind(this);\n this.handleDeleteMarkdown = this.handleDeleteMarkdown.bind(this);\n this.handleOpenMarkdown = this.handleOpenMarkdown.bind(this);\n this.handleEditorInitialized = this.handleEditorInitialized.bind(this);\n this.handleEditorBlur = this.handleEditorBlur.bind(this);\n this.handleEditorResize = this.handleEditorResize.bind(this);\n\n const { panelState } = props;\n let content = null;\n if (panelState && panelState.content) {\n ({ content } = panelState);\n }\n\n this.state = {\n isStartPageShown: content == null,\n isEditing: false,\n content,\n\n // eslint-disable-next-line react/no-unused-state\n panelState,\n };\n\n this.markdownEditor = null;\n this.editor = null;\n }\n\n setEditorPosition(clickPositionY) {\n const { container: markdownEditorContainer } = this.markdownEditor;\n if (this.editor && markdownEditorContainer) {\n const contentTop = markdownEditorContainer.getBoundingClientRect().top;\n const contentScrollTop = markdownEditorContainer.scrollTop;\n const contentScrollHeight = markdownEditorContainer.scrollHeight;\n const totalLines = this.editor.getModel().getLineCount();\n\n let lineToFocus = Math.round(\n ((contentScrollTop + clickPositionY - contentTop) /\n contentScrollHeight) *\n totalLines\n );\n if (lineToFocus > totalLines) {\n lineToFocus = totalLines;\n }\n\n this.editor.revealLine(lineToFocus);\n this.editor.setPosition({\n lineNumber: lineToFocus,\n column: 1,\n });\n this.editor.focus();\n }\n }\n\n getClosedMarkdowns = memoize(closedPanels =>\n closedPanels.filter(panel => panel.component === 'MarkdownPanel').reverse()\n );\n\n handleContainerDoubleClick(event) {\n const { isEditing } = this.state;\n const dbClickPositionY = event.clientY;\n\n if (!isEditing) {\n this.setState({ isEditing: true }, () => {\n this.setEditorPosition(dbClickPositionY);\n });\n }\n }\n\n handleEditorInitialized(editor) {\n log.debug('Markdown Editor Initialized...');\n this.editor = editor;\n }\n\n handleCreateMarkdown() {\n log.debug('create markdown...');\n\n this.setState(\n {\n isStartPageShown: false,\n content: '',\n isEditing: true,\n\n // eslint-disable-next-line react/no-unused-state\n panelState: { content: '' },\n },\n () => {\n if (this.editor && this.editor.focus) {\n this.editor.focus();\n }\n }\n );\n }\n\n handleOpenMarkdown(markdown) {\n log.debug('open markdown...', markdown);\n\n const { glContainer, glEventHub } = this.props;\n const config = LayoutUtils.getComponentConfigFromContainer(glContainer);\n glEventHub.emit(PanelEvent.REOPEN, markdown, config);\n }\n\n handleDeleteMarkdown(markdown) {\n const { glEventHub } = this.props;\n glEventHub.emit(PanelEvent.DELETE, markdown);\n }\n\n handleEditorBlur(event) {\n log.debug(`markdown content changed, saving...`);\n const { isEditing } = this.state;\n\n // if not in edit mode, or in edit mode but blur went to an internal monaco field (like search)\n if (\n !isEditing ||\n this.markdownEditor?.container?.contains(event.relatedTarget)\n ) {\n return;\n }\n\n const content = this.editor.getValue();\n\n this.setState({\n content,\n isEditing: false,\n\n // eslint-disable-next-line react/no-unused-state\n panelState: { content },\n });\n }\n\n handleEditorResize() {\n const { isEditing } = this.state;\n if (isEditing && this.editor) {\n this.editor.layout();\n }\n }\n\n render() {\n const { glContainer, glEventHub, closedPanels } = this.props;\n const { isEditing, isStartPageShown, content } = this.state;\n const closedMarkdowns = this.getClosedMarkdowns(closedPanels);\n\n return (\n <Panel\n glContainer={glContainer}\n glEventHub={glEventHub}\n className=\"markdown-panel\"\n componentPanel={this}\n onResize={this.handleEditorResize}\n onBlur={this.handleEditorBlur}\n isClonable\n isRenamable\n >\n {isStartPageShown ? (\n <MarkdownStartPage\n closedMarkdowns={closedMarkdowns}\n onCreate={this.handleCreateMarkdown}\n onOpen={this.handleOpenMarkdown}\n onDelete={this.handleDeleteMarkdown}\n />\n ) : (\n <MarkdownContainer\n isEditing={isEditing}\n onDoubleClick={this.handleContainerDoubleClick}\n >\n <MarkdownEditor\n ref={markdownEditor => {\n this.markdownEditor = markdownEditor;\n }}\n isEditing={isEditing}\n content={content}\n onEditorInitialized={this.handleEditorInitialized}\n />\n </MarkdownContainer>\n )}\n </Panel>\n );\n }\n}\n\nMarkdownPanel.propTypes = {\n glContainer: GLPropTypes.Container.isRequired,\n glEventHub: GLPropTypes.EventHub.isRequired,\n panelState: PropTypes.shape({\n content: PropTypes.string,\n }),\n closedPanels: PropTypes.arrayOf(PropTypes.object).isRequired,\n};\n\nMarkdownPanel.defaultProps = {\n panelState: null,\n};\n\nconst mapStateToProps = (state, ownProps) => {\n const { localDashboardId } = ownProps;\n return {\n closedPanels: getClosedPanelsForDashboard(state, localDashboardId),\n };\n};\n\nexport default connect(mapStateToProps, null, null, { forwardRef: true })(\n MarkdownPanel\n);\n"],"file":"MarkdownPanel.js"}
1
+ {"version":3,"sources":["../../src/panels/MarkdownPanel.tsx"],"names":["React","Component","memoize","connect","getClosedPanelsForDashboard","LayoutUtils","PanelEvent","Log","assertNotNull","Panel","MarkdownContainer","MarkdownStartPage","MarkdownEditor","log","module","MarkdownPanel","constructor","props","closedPanels","filter","panel","component","reverse","handleContainerDoubleClick","bind","handleCreateMarkdown","handleDeleteMarkdown","handleOpenMarkdown","handleEditorInitialized","handleEditorBlur","handleEditorResize","panelState","content","state","isStartPageShown","isEditing","markdownEditor","setEditorPosition","clickPositionY","container","markdownEditorContainer","editor","contentTop","getBoundingClientRect","top","contentScrollTop","scrollTop","contentScrollHeight","scrollHeight","totalLines","getModel","getLineCount","lineToFocus","Math","round","revealLine","setPosition","lineNumber","column","focus","event","dbClickPositionY","clientY","setState","debug","markdown","glContainer","glEventHub","config","getComponentConfigFromContainer","emit","REOPEN","DELETE","contains","relatedTarget","getValue","layout","render","closedMarkdowns","getClosedMarkdowns","undefined","mapStateToProps","ownProps","localDashboardId","forwardRef"],"mappings":";;AAAA,OAAOA,KAAP,IAAgBC,SAAhB,QAAuE,OAAvE;AACA,OAAOC,OAAP,MAAoB,aAApB;AACA,SAASC,OAAT,QAAwB,aAAxB;AACA,SAGEC,2BAHF,EAIEC,WAJF,EAKEC,UALF,QAMO,sBANP;AAOA,OAAOC,GAAP,MAAgB,gBAAhB;AAOA,SAASC,aAAT,QAA8B,kBAA9B;OAEOC,K;OACAC,iB;OACAC,iB;OACAC,c;;AAGP,IAAMC,GAAG,GAAGN,GAAG,CAACO,MAAJ,CAAW,eAAX,CAAZ;AAsBA,OAAO,MAAMC,aAAN,SAA4Bd,SAA5B,CAGL;AAOAe,EAAAA,WAAW,CAACC,KAAD,EAA4B;AACrC,UAAMA,KAAN;;AADqC;;AAAA;;AAAA,gDA8DlBf,OAAO,CAAEgB,YAAD,IAC3BA,YAAY,CAACC,MAAb,CAAoBC,KAAK,IAAIA,KAAK,CAACC,SAAN,KAAoB,eAAjD,EAAkEC,OAAlE,EAD0B,CA9DW;;AAGrC,SAAKC,0BAAL,GAAkC,KAAKA,0BAAL,CAAgCC,IAAhC,CAChC,IADgC,CAAlC;AAGA,SAAKC,oBAAL,GAA4B,KAAKA,oBAAL,CAA0BD,IAA1B,CAA+B,IAA/B,CAA5B;AACA,SAAKE,oBAAL,GAA4B,KAAKA,oBAAL,CAA0BF,IAA1B,CAA+B,IAA/B,CAA5B;AACA,SAAKG,kBAAL,GAA0B,KAAKA,kBAAL,CAAwBH,IAAxB,CAA6B,IAA7B,CAA1B;AACA,SAAKI,uBAAL,GAA+B,KAAKA,uBAAL,CAA6BJ,IAA7B,CAAkC,IAAlC,CAA/B;AACA,SAAKK,gBAAL,GAAwB,KAAKA,gBAAL,CAAsBL,IAAtB,CAA2B,IAA3B,CAAxB;AACA,SAAKM,kBAAL,GAA0B,KAAKA,kBAAL,CAAwBN,IAAxB,CAA6B,IAA7B,CAA1B;AAEA,QAAM;AAAEO,MAAAA;AAAF,QAAiBd,KAAvB;AACA,QAAIe,OAAO,GAAG,IAAd;;AACA,QAAID,UAAU,IAAIA,UAAU,CAACC,OAA7B,EAAsC;AACpC,OAAC;AAAEA,QAAAA;AAAF,UAAcD,UAAf;AACD;;AAED,SAAKE,KAAL,GAAa;AACXC,MAAAA,gBAAgB,EAAEF,OAAO,IAAI,IADlB;AAEXG,MAAAA,SAAS,EAAE,KAFA;AAGXH,MAAAA,OAHW;AAKX;AACAD,MAAAA;AANW,KAAb;AASA,SAAKK,cAAL,GAAsB,IAAtB;AACD;;AAMDC,EAAAA,iBAAiB,CAACC,cAAD,EAA+B;AAC9C9B,IAAAA,aAAa,CAAC,KAAK4B,cAAN,CAAb;AACA,QAAM;AAAEG,MAAAA,SAAS,EAAEC;AAAb,QAAyC,KAAKJ,cAApD;;AACA,QAAI,KAAKK,MAAL,IAAeD,uBAAnB,EAA4C;AAAA;;AAC1C,UAAME,UAAU,GAAGF,uBAAuB,CAACG,qBAAxB,GAAgDC,GAAnE;AACA,UAAMC,gBAAgB,GAAGL,uBAAuB,CAACM,SAAjD;AACA,UAAMC,mBAAmB,GAAGP,uBAAuB,CAACQ,YAApD;AACA,UAAMC,UAAU,sDAAG,KAAKR,MAAL,CAAYS,QAAZ,EAAH,2DAAG,uBAAwBC,YAAxB,EAAH,yEAA6C,CAA7D;AAEA,UAAIC,WAAW,GAAGC,IAAI,CAACC,KAAL,CACf,CAACT,gBAAgB,GAAGP,cAAnB,GAAoCI,UAArC,IACCK,mBADF,GAEEE,UAHc,CAAlB;;AAKA,UAAIG,WAAW,GAAGH,UAAlB,EAA8B;AAC5BG,QAAAA,WAAW,GAAGH,UAAd;AACD;;AAED,WAAKR,MAAL,CAAYc,UAAZ,CAAuBH,WAAvB;AACA,WAAKX,MAAL,CAAYe,WAAZ,CAAwB;AACtBC,QAAAA,UAAU,EAAEL,WADU;AAEtBM,QAAAA,MAAM,EAAE;AAFc,OAAxB;AAIA,WAAKjB,MAAL,CAAYkB,KAAZ;AACD;AACF;;AAMDpC,EAAAA,0BAA0B,CAACqC,KAAD,EAAmC;AAC3D,QAAM;AAAEzB,MAAAA;AAAF,QAAgB,KAAKF,KAA3B;AACA,QAAM4B,gBAAgB,GAAGD,KAAK,CAACE,OAA/B;;AAEA,QAAI,CAAC3B,SAAL,EAAgB;AACd,WAAK4B,QAAL,CAAc;AAAE5B,QAAAA,SAAS,EAAE;AAAb,OAAd,EAAmC,MAAM;AACvC,aAAKE,iBAAL,CAAuBwB,gBAAvB;AACD,OAFD;AAGD;AACF;;AAEDjC,EAAAA,uBAAuB,CAACa,MAAD,EAAoD;AACzE5B,IAAAA,GAAG,CAACmD,KAAJ,CAAU,gCAAV;AACA,SAAKvB,MAAL,GAAcA,MAAd;AACD;;AAEDhB,EAAAA,oBAAoB,GAAS;AAC3BZ,IAAAA,GAAG,CAACmD,KAAJ,CAAU,oBAAV;AAEA,SAAKD,QAAL,CACE;AACE7B,MAAAA,gBAAgB,EAAE,KADpB;AAEEF,MAAAA,OAAO,EAAE,EAFX;AAGEG,MAAAA,SAAS,EAAE,IAHb;AAKE;AACAJ,MAAAA,UAAU,EAAE;AAAEC,QAAAA,OAAO,EAAE;AAAX;AANd,KADF,EASE,MAAM;AACJ,UAAI,KAAKS,MAAL,IAAe,KAAKA,MAAL,CAAYkB,KAA/B,EAAsC;AACpC,aAAKlB,MAAL,CAAYkB,KAAZ;AACD;AACF,KAbH;AAeD;;AAEDhC,EAAAA,kBAAkB,CAACsC,QAAD,EAAuC;AACvDpD,IAAAA,GAAG,CAACmD,KAAJ,CAAU,kBAAV,EAA8BC,QAA9B;AAEA,QAAM;AAAEC,MAAAA,WAAF;AAAeC,MAAAA;AAAf,QAA8B,KAAKlD,KAAzC;AACA,QAAMmD,MAAM,GAAG/D,WAAW,CAACgE,+BAAZ,CAA4CH,WAA5C,CAAf;AACAC,IAAAA,UAAU,CAACG,IAAX,CAAgBhE,UAAU,CAACiE,MAA3B,EAAmCN,QAAnC,EAA6CG,MAA7C;AACD;;AAED1C,EAAAA,oBAAoB,CAACuC,QAAD,EAAuC;AACzD,QAAM;AAAEE,MAAAA;AAAF,QAAiB,KAAKlD,KAA5B;AACAkD,IAAAA,UAAU,CAACG,IAAX,CAAgBhE,UAAU,CAACkE,MAA3B,EAAmCP,QAAnC;AACD;;AAEDpC,EAAAA,gBAAgB,CAAC+B,KAAD,EAA0C;AAAA;;AACxD/C,IAAAA,GAAG,CAACmD,KAAJ;AACA,QAAM;AAAE7B,MAAAA;AAAF,QAAgB,KAAKF,KAA3B,CAFwD,CAIxD;;AACA,QACE,CAACE,SAAD,4BACA,KAAKC,cADL,0EACA,qBAAqBG,SADrB,kDACA,sBAAgCkC,QAAhC,CAAyCb,KAAK,CAACc,aAA/C,CAFF,EAGE;AACA;AACD;;AAED,QAAM1C,OAAO,mBAAG,KAAKS,MAAR,iDAAG,aAAakC,QAAb,EAAhB;AAEA,SAAKZ,QAAL,CAAc;AACZ/B,MAAAA,OADY;AAEZG,MAAAA,SAAS,EAAE,KAFC;AAIZ;AACAJ,MAAAA,UAAU,EAAE;AAAEC,QAAAA;AAAF;AALA,KAAd;AAOD;;AAEDF,EAAAA,kBAAkB,GAAS;AACzB,QAAM;AAAEK,MAAAA;AAAF,QAAgB,KAAKF,KAA3B;;AACA,QAAIE,SAAS,IAAI,KAAKM,MAAtB,EAA8B;AAC5B,WAAKA,MAAL,CAAYmC,MAAZ;AACD;AACF;;AAEDC,EAAAA,MAAM,GAAiB;AACrB,QAAM;AAAEX,MAAAA,WAAF;AAAeC,MAAAA,UAAf;AAA2BjD,MAAAA;AAA3B,QAA4C,KAAKD,KAAvD;AACA,QAAM;AAAEkB,MAAAA,SAAF;AAAaD,MAAAA,gBAAb;AAA+BF,MAAAA;AAA/B,QAA2C,KAAKC,KAAtD;AACA,QAAM6C,eAAe,GAAG,KAAKC,kBAAL,CAAwB7D,YAAxB,CAAxB;AAEA,wBACE,oBAAC,KAAD;AACE,MAAA,WAAW,EAAEgD,WADf;AAEE,MAAA,UAAU,EAAEC,UAFd;AAGE,MAAA,SAAS,EAAC,gBAHZ;AAIE,MAAA,cAAc,EAAE,IAJlB;AAKE,MAAA,QAAQ,EAAE,KAAKrC,kBALjB;AAME,MAAA,MAAM,EAAE,KAAKD,gBANf;AAOE,MAAA,UAAU,MAPZ;AAQE,MAAA,WAAW;AARb,OAUGK,gBAAgB,gBACf,oBAAC,iBAAD;AACE,MAAA,eAAe,EAAE4C,eADnB;AAEE,MAAA,QAAQ,EAAE,KAAKrD,oBAFjB;AAGE,MAAA,MAAM,EAAE,KAAKE,kBAHf;AAIE,MAAA,QAAQ,EAAE,KAAKD;AAJjB,MADe,gBAQf,oBAAC,iBAAD;AACE,MAAA,SAAS,EAAES,SADb;AAEE,MAAA,aAAa,EAAE,KAAKZ;AAFtB,oBAIE,oBAAC,cAAD;AACE,MAAA,GAAG,EAAEa,cAAc,IAAI;AACrB,aAAKA,cAAL,GAAsBA,cAAtB;AACD,OAHH;AAIE,MAAA,SAAS,EAAED,SAJb;AAKE,MAAA,OAAO,EAAEH,OAAF,aAAEA,OAAF,cAAEA,OAAF,GAAagD,SALtB;AAME,MAAA,mBAAmB,EAAE,KAAKpD;AAN5B,MAJF,CAlBJ,CADF;AAmCD;;AAhMD;;gBAHWb,a,kBAIW;AACpBgB,EAAAA,UAAU,EAAE;AADQ,C;;gBAJXhB,a,eAQQ,e;;AA8LrB,IAAMkE,eAAe,GAAG,CACtBhD,KADsB,EAEtBiD,QAFsB,KAGnB;AACH,MAAM;AAAEC,IAAAA;AAAF,MAAuBD,QAA7B;AACA,SAAO;AACLhE,IAAAA,YAAY,EAAEd,2BAA2B,CAAC6B,KAAD,EAAQkD,gBAAR;AADpC,GAAP;AAGD,CARD;;AAUA,eAAehF,OAAO,CAAC8E,eAAD,EAAkB,IAAlB,EAAwB,IAAxB,EAA8B;AAAEG,EAAAA,UAAU,EAAE;AAAd,CAA9B,CAAP,CACbrE,aADa,CAAf","sourcesContent":["import React, { Component, FocusEvent, MouseEvent, ReactElement } from 'react';\nimport memoize from 'memoize-one';\nimport { connect } from 'react-redux';\nimport {\n ClosedPanel,\n ClosedPanels,\n getClosedPanelsForDashboard,\n LayoutUtils,\n PanelEvent,\n} from '@deephaven/dashboard';\nimport Log from '@deephaven/log';\nimport {\n Container,\n EventEmitter,\n ReactComponentConfig,\n} from '@deephaven/golden-layout';\nimport type * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js';\nimport { assertNotNull } from '@deephaven/utils';\nimport { RootState } from '@deephaven/redux';\nimport Panel from './Panel';\nimport MarkdownContainer from '../controls/markdown/MarkdownContainer';\nimport MarkdownStartPage from '../controls/markdown/MarkdownStartPage';\nimport MarkdownEditor from '../controls/markdown/MarkdownEditor';\nimport './MarkdownPanel.scss';\n\nconst log = Log.module('MarkdownPanel');\n\ninterface PanelState {\n content?: string;\n}\n\ninterface MarkdownPanelProps {\n glContainer: Container;\n glEventHub: EventEmitter;\n panelState: PanelState;\n closedPanels: ClosedPanel[];\n}\n\ninterface MarkdownPanelState {\n isStartPageShown: boolean;\n isEditing: boolean;\n content?: string | null;\n\n // eslint-disable-next-line react/no-unused-state\n panelState: PanelState;\n}\n\nexport class MarkdownPanel extends Component<\n MarkdownPanelProps,\n MarkdownPanelState\n> {\n static defaultProps = {\n panelState: null,\n };\n\n static COMPONENT = 'MarkdownPanel';\n\n constructor(props: MarkdownPanelProps) {\n super(props);\n\n this.handleContainerDoubleClick = this.handleContainerDoubleClick.bind(\n this\n );\n this.handleCreateMarkdown = this.handleCreateMarkdown.bind(this);\n this.handleDeleteMarkdown = this.handleDeleteMarkdown.bind(this);\n this.handleOpenMarkdown = this.handleOpenMarkdown.bind(this);\n this.handleEditorInitialized = this.handleEditorInitialized.bind(this);\n this.handleEditorBlur = this.handleEditorBlur.bind(this);\n this.handleEditorResize = this.handleEditorResize.bind(this);\n\n const { panelState } = props;\n let content = null;\n if (panelState && panelState.content) {\n ({ content } = panelState);\n }\n\n this.state = {\n isStartPageShown: content == null,\n isEditing: false,\n content,\n\n // eslint-disable-next-line react/no-unused-state\n panelState,\n };\n\n this.markdownEditor = null;\n }\n\n markdownEditor: MarkdownEditor | null;\n\n editor?: monaco.editor.IStandaloneCodeEditor;\n\n setEditorPosition(clickPositionY: number): void {\n assertNotNull(this.markdownEditor);\n const { container: markdownEditorContainer } = this.markdownEditor;\n if (this.editor && markdownEditorContainer) {\n const contentTop = markdownEditorContainer.getBoundingClientRect().top;\n const contentScrollTop = markdownEditorContainer.scrollTop;\n const contentScrollHeight = markdownEditorContainer.scrollHeight;\n const totalLines = this.editor.getModel()?.getLineCount() ?? 0;\n\n let lineToFocus = Math.round(\n ((contentScrollTop + clickPositionY - contentTop) /\n contentScrollHeight) *\n totalLines\n );\n if (lineToFocus > totalLines) {\n lineToFocus = totalLines;\n }\n\n this.editor.revealLine(lineToFocus);\n this.editor.setPosition({\n lineNumber: lineToFocus,\n column: 1,\n });\n this.editor.focus();\n }\n }\n\n getClosedMarkdowns = memoize((closedPanels: ClosedPanels) =>\n closedPanels.filter(panel => panel.component === 'MarkdownPanel').reverse()\n );\n\n handleContainerDoubleClick(event: MouseEvent<Element>): void {\n const { isEditing } = this.state;\n const dbClickPositionY = event.clientY;\n\n if (!isEditing) {\n this.setState({ isEditing: true }, () => {\n this.setEditorPosition(dbClickPositionY);\n });\n }\n }\n\n handleEditorInitialized(editor: monaco.editor.IStandaloneCodeEditor): void {\n log.debug('Markdown Editor Initialized...');\n this.editor = editor;\n }\n\n handleCreateMarkdown(): void {\n log.debug('create markdown...');\n\n this.setState(\n {\n isStartPageShown: false,\n content: '',\n isEditing: true,\n\n // eslint-disable-next-line react/no-unused-state\n panelState: { content: '' },\n },\n () => {\n if (this.editor && this.editor.focus) {\n this.editor.focus();\n }\n }\n );\n }\n\n handleOpenMarkdown(markdown: ReactComponentConfig): void {\n log.debug('open markdown...', markdown);\n\n const { glContainer, glEventHub } = this.props;\n const config = LayoutUtils.getComponentConfigFromContainer(glContainer);\n glEventHub.emit(PanelEvent.REOPEN, markdown, config);\n }\n\n handleDeleteMarkdown(markdown: ReactComponentConfig): void {\n const { glEventHub } = this.props;\n glEventHub.emit(PanelEvent.DELETE, markdown);\n }\n\n handleEditorBlur(event: FocusEvent<HTMLDivElement>): void {\n log.debug(`markdown content changed, saving...`);\n const { isEditing } = this.state;\n\n // if not in edit mode, or in edit mode but blur went to an internal monaco field (like search)\n if (\n !isEditing ||\n this.markdownEditor?.container?.contains(event.relatedTarget)\n ) {\n return;\n }\n\n const content = this.editor?.getValue();\n\n this.setState({\n content,\n isEditing: false,\n\n // eslint-disable-next-line react/no-unused-state\n panelState: { content },\n });\n }\n\n handleEditorResize(): void {\n const { isEditing } = this.state;\n if (isEditing && this.editor) {\n this.editor.layout();\n }\n }\n\n render(): ReactElement {\n const { glContainer, glEventHub, closedPanels } = this.props;\n const { isEditing, isStartPageShown, content } = this.state;\n const closedMarkdowns = this.getClosedMarkdowns(closedPanels);\n\n return (\n <Panel\n glContainer={glContainer}\n glEventHub={glEventHub}\n className=\"markdown-panel\"\n componentPanel={this}\n onResize={this.handleEditorResize}\n onBlur={this.handleEditorBlur}\n isClonable\n isRenamable\n >\n {isStartPageShown ? (\n <MarkdownStartPage\n closedMarkdowns={closedMarkdowns}\n onCreate={this.handleCreateMarkdown}\n onOpen={this.handleOpenMarkdown}\n onDelete={this.handleDeleteMarkdown}\n />\n ) : (\n <MarkdownContainer\n isEditing={isEditing}\n onDoubleClick={this.handleContainerDoubleClick}\n >\n <MarkdownEditor\n ref={markdownEditor => {\n this.markdownEditor = markdownEditor;\n }}\n isEditing={isEditing}\n content={content ?? undefined}\n onEditorInitialized={this.handleEditorInitialized}\n />\n </MarkdownContainer>\n )}\n </Panel>\n );\n }\n}\n\nconst mapStateToProps = (\n state: RootState,\n ownProps: { localDashboardId: string }\n) => {\n const { localDashboardId } = ownProps;\n return {\n closedPanels: getClosedPanelsForDashboard(state, localDashboardId),\n };\n};\n\nexport default connect(mapStateToProps, null, null, { forwardRef: true })(\n MarkdownPanel\n);\n"],"file":"MarkdownPanel.js"}