@deephaven/dashboard-core-plugins 0.6.1-beta.0 → 0.6.1-demo.10

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ConsolePlugin.d.ts","sourceRoot":"","sources":["../src/ConsolePlugin.tsx"],"names":[],"mappings":";AACA,OAAO,EACL,6BAA6B,EAI9B,MAAM,sBAAsB,CAAC;AAmC9B,eAAO,MAAM,aAAa,qDAKvB,6BAA6B,KAAG,WA2blC,CAAC;AAEF,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"ConsolePlugin.d.ts","sourceRoot":"","sources":["../src/ConsolePlugin.tsx"],"names":[],"mappings":";AACA,OAAO,EACL,6BAA6B,EAI9B,MAAM,sBAAsB,CAAC;AAoC9B,eAAO,MAAM,aAAa,qDAKvB,6BAA6B,KAAG,WAqclC,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -6,6 +6,7 @@ import { useDispatch } from 'react-redux';
6
6
  import shortid from 'shortid';
7
7
  import { ConsoleEvent, NotebookEvent } from "./events/index.js";
8
8
  import { ConsolePanel, CommandHistoryPanel, FileExplorerPanel, LogPanel, NotebookPanel } from "./panels/index.js";
9
+ import MarkdownNotebookPanel from "./panels/MarkdownNotebookPanel.js";
9
10
  import { setDashboardConsoleSettings } from "./redux/index.js";
10
11
  var log = Log.module('ConsolePlugin');
11
12
 
@@ -258,6 +259,8 @@ export var ConsolePlugin = (_ref) => {
258
259
  }
259
260
  }, [panelManager]);
260
261
  var makeConfig = useCallback((_ref3) => {
262
+ var _fileMetadata$itemNam;
263
+
261
264
  var {
262
265
  id: panelId,
263
266
  settings,
@@ -269,13 +272,16 @@ export var ConsolePlugin = (_ref) => {
269
272
  var panelState = {
270
273
  settings,
271
274
  fileMetadata
272
- };
275
+ }; // KLUDGE: show a different component type for markdown notebooks
276
+
277
+ var component = fileMetadata !== null && fileMetadata !== void 0 && (_fileMetadata$itemNam = fileMetadata.itemName) !== null && _fileMetadata$itemNam !== void 0 && _fileMetadata$itemNam.endsWith('.md') ? MarkdownNotebookPanel.COMPONENT : NotebookPanel.COMPONENT;
273
278
  var title = getNotebookTitle(fileMetadata);
274
279
  return {
275
280
  type: 'react-component',
276
- component: NotebookPanel.COMPONENT,
281
+ component,
277
282
  isFocusOnShow: false,
278
283
  props: {
284
+ id: panelId,
279
285
  localDashboardId: id,
280
286
  metadata: {
281
287
  id: panelId
@@ -346,14 +352,14 @@ export var ConsolePlugin = (_ref) => {
346
352
  if (previewTabId != null) {
347
353
  panelId = previewTabId;
348
354
  stack = LayoutUtils.getStackForConfig(layout.root, {
349
- component: NotebookPanel.COMPONENT,
355
+ // component: NotebookPanel.COMPONENT,
350
356
  id: panelId
351
357
  });
352
358
  }
353
359
 
354
360
  if (stack == null) {
355
361
  panelId = getPanelIdForFileMetadata(fileMetadata);
356
- stack = LayoutUtils.getStackForComponentTypes(layout.root, [NotebookPanel.COMPONENT]);
362
+ stack = LayoutUtils.getStackForComponentTypes(layout.root, [NotebookPanel.COMPONENT, MarkdownNotebookPanel.COMPONENT]);
357
363
  }
358
364
 
359
365
  var config = makeConfig({
@@ -387,7 +393,7 @@ export var ConsolePlugin = (_ref) => {
387
393
  }
388
394
  }, [createNotebook, panelManager]);
389
395
  useEffect(() => {
390
- var cleanups = [registerComponent(ConsolePanel.COMPONENT, ConsolePanel), registerComponent(CommandHistoryPanel.COMPONENT, CommandHistoryPanel), registerComponent(FileExplorerPanel.COMPONENT, FileExplorerPanel), registerComponent(LogPanel.COMPONENT, LogPanel), registerComponent(NotebookPanel.COMPONENT, NotebookPanel)];
396
+ var cleanups = [registerComponent(ConsolePanel.COMPONENT, ConsolePanel), registerComponent(CommandHistoryPanel.COMPONENT, CommandHistoryPanel), registerComponent(FileExplorerPanel.COMPONENT, FileExplorerPanel), registerComponent(LogPanel.COMPONENT, LogPanel), registerComponent(NotebookPanel.COMPONENT, NotebookPanel), registerComponent('MarkdownNotebookPanel', MarkdownNotebookPanel)];
391
397
  return () => {
392
398
  cleanups.forEach(cleanup => cleanup());
393
399
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ConsolePlugin.tsx"],"names":["LayoutUtils","useListener","FileUtils","Log","React","useCallback","useEffect","useRef","useState","useDispatch","shortid","ConsoleEvent","NotebookEvent","ConsolePanel","CommandHistoryPanel","FileExplorerPanel","LogPanel","NotebookPanel","setDashboardConsoleSettings","log","module","isNotebookPanel","panel","notebook","undefined","ConsolePlugin","id","layout","panelManager","registerComponent","notebookIndex","openFileMap","Map","previewFileMap","dispatch","getConsolePanel","getLastUsedPanelOfType","WrappedComponent","handleSendCommand","command","focus","execute","trimmedCommand","trim","info","consolePanel","error","debug","addCommand","handleSettingsChanged","consoleSettings","getNotebookFileName","language","extension","title","current","getPanelIdForFileMetadata","fileMetadata","createIfNecessary","fileId","has","get","generate","renamePanel","panelId","newTitle","renameComponent","root","renameFilePanel","oldName","newName","delete","set","debug2","getBaseName","showFilePanel","activateTab","registerFilePanel","isPreview","existingPanelId","itemName","unregisterFilePanel","closeFilePanel","closeComponent","getNotebookTitle","fileIsOpen","fileIsOpenAsPreview","focusPanelById","getOpenedPanelById","makeConfig","settings","session","sessionLanguage","panelState","type","component","COMPONENT","isFocusOnShow","props","localDashboardId","metadata","createNotebook","stack","getStackForComponentTypes","config","openComponentInStack","selectNotebook","shouldFocus","isFileOpen","isFileOpenAsPreview","previewTabId","Array","from","values","getStackForConfig","sendToNotebook","notebookPanel","value","append","cleanups","forEach","cleanup","eventHub","SEND_COMMAND","SETTINGS_CHANGED","CLOSE_FILE","CREATE_NOTEBOOK","SELECT_NOTEBOOK","RENAME","RENAME_FILE","SEND_TO_NOTEBOOK","REGISTER_FILE","UNREGISTER_FILE"],"mappings":"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","sourcesContent":["import { ScriptEditor } from '@deephaven/console';\nimport {\n DashboardPluginComponentProps,\n LayoutUtils,\n PanelComponent,\n useListener,\n} from '@deephaven/dashboard';\nimport { FileUtils } from '@deephaven/file-explorer';\nimport Log from '@deephaven/log';\nimport React, {\n ComponentType,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { useDispatch } from 'react-redux';\nimport shortid from 'shortid';\nimport { ConsoleEvent, NotebookEvent } from './events';\nimport {\n ConsolePanel,\n CommandHistoryPanel,\n FileExplorerPanel,\n LogPanel,\n NotebookPanel,\n} from './panels';\nimport { setDashboardConsoleSettings } from './redux';\n\nconst log = Log.module('ConsolePlugin');\n\ntype NotebookPanelComponent = PanelComponent & {\n notebook: ScriptEditor;\n focus: () => void;\n};\n\nfunction isNotebookPanel(\n panel: PanelComponent\n): panel is NotebookPanelComponent {\n return (panel as NotebookPanelComponent).notebook !== undefined;\n}\n\nexport const ConsolePlugin = ({\n id,\n layout,\n panelManager,\n registerComponent,\n}: DashboardPluginComponentProps): JSX.Element => {\n const notebookIndex = useRef(0);\n // Map from file ID to panel ID\n const [openFileMap] = useState(new Map<string, string>());\n const [previewFileMap] = useState(new Map<string, string>());\n\n const dispatch = useDispatch();\n\n const getConsolePanel = useCallback(\n () => panelManager.getLastUsedPanelOfType(ConsolePanel.WrappedComponent),\n [panelManager]\n );\n\n const handleSendCommand = useCallback(\n (command: string, focus = true, execute = true) => {\n const trimmedCommand = command && command.trim();\n if (!trimmedCommand) {\n log.info('Ignoring empty code');\n } else {\n const consolePanel = getConsolePanel();\n if (\n !consolePanel ||\n !(consolePanel instanceof ConsolePanel.WrappedComponent)\n ) {\n log.error('Console panel not found');\n return;\n }\n log.debug('Send command: ', command, focus, execute);\n consolePanel.addCommand(command, focus, execute);\n }\n },\n [getConsolePanel]\n );\n\n const handleSettingsChanged = useCallback(\n consoleSettings => {\n dispatch(setDashboardConsoleSettings(id, consoleSettings));\n },\n [dispatch, id]\n );\n\n const getNotebookFileName = useCallback(({ language }) => {\n const extension = language === 'python' ? 'py' : language;\n let title = null;\n if (!extension) {\n log.debug('No extension for language', language);\n title = `Untitled-${notebookIndex.current}`;\n } else {\n title = `Untitled-${notebookIndex.current}.${extension}`;\n }\n notebookIndex.current += 1;\n return title;\n }, []);\n\n const getPanelIdForFileMetadata = useCallback(\n (fileMetadata, createIfNecessary = true) => {\n const { id: fileId } = fileMetadata;\n if (fileId && openFileMap.has(fileId)) {\n return openFileMap.get(fileId);\n }\n if (fileId && previewFileMap.has(fileId)) {\n return previewFileMap.get(fileId);\n }\n if (createIfNecessary) {\n return shortid.generate();\n }\n return null;\n },\n [openFileMap, previewFileMap]\n );\n\n const renamePanel = useCallback(\n (panelId, newTitle) => {\n LayoutUtils.renameComponent(layout.root, { id: panelId }, newTitle);\n },\n [layout.root]\n );\n\n const renameFilePanel = useCallback(\n (oldName, newName) => {\n log.debug('Rename file panel', oldName, newName);\n let panelId;\n if (openFileMap.has(oldName)) {\n panelId = openFileMap.get(oldName);\n openFileMap.delete(oldName);\n if (panelId != null) {\n openFileMap.set(newName, panelId);\n }\n }\n if (previewFileMap.has(oldName)) {\n panelId = previewFileMap.get(oldName);\n previewFileMap.delete(oldName);\n if (panelId != null) {\n previewFileMap.set(newName, panelId);\n }\n }\n\n if (!panelId) {\n log.debug2(`File ${oldName} isn't open, no need to rename the tab`);\n return;\n }\n\n renamePanel(panelId, FileUtils.getBaseName(newName));\n },\n [openFileMap, previewFileMap, renamePanel]\n );\n\n /**\n * Show the panel for the given file metadata.\n * If the panel is not already open, then it just logs an error and does nothing.\n */\n const showFilePanel = useCallback(\n fileMetadata => {\n const panelId = getPanelIdForFileMetadata(fileMetadata, false);\n if (panelId == null) {\n log.error('Could not find panel id for file metadata', fileMetadata);\n return;\n }\n LayoutUtils.activateTab(layout.root, { id: panelId });\n },\n [getPanelIdForFileMetadata, layout.root]\n );\n\n const registerFilePanel = useCallback(\n (panelId, fileMetadata, isPreview) => {\n log.debug('registerFilePanel', panelId, fileMetadata, isPreview);\n if (!fileMetadata || !fileMetadata.id) {\n log.debug('Ignore empty file id', fileMetadata);\n return;\n }\n const { id: fileId } = fileMetadata;\n if (isPreview) {\n previewFileMap.set(fileId, panelId);\n return;\n }\n if (openFileMap.has(fileId)) {\n const existingPanelId = openFileMap.get(fileId);\n if (panelId === existingPanelId) {\n log.debug(`Update tab title for file ${fileId}`);\n const { itemName } = fileMetadata;\n renameFilePanel(fileId, FileUtils.getBaseName(itemName));\n } else {\n log.error(\n `File ${fileId} already associated with a different tab ${existingPanelId}`\n );\n }\n return;\n }\n\n openFileMap.set(fileId, panelId);\n\n // De-register preview tab\n if (previewFileMap.has(fileId)) {\n previewFileMap.delete(fileId);\n }\n },\n [openFileMap, previewFileMap, renameFilePanel]\n );\n\n const unregisterFilePanel = useCallback(\n (fileMetadata, isPreview) => {\n // Note: unregister event is triggered AFTER new register when switching from preview to edit mode\n // due to the LayoutUtils implementation (new tab added before deleting the old one)\n // This doesn't cause any issues because previews and editable files are stored in different maps,\n // but this situation could be completely avoided by sending an event to the tab\n // to make it switch from preview to edit mode without re-mounting and re-registering\n log.debug('unregisterFileTab', fileMetadata, isPreview);\n if (!fileMetadata || !fileMetadata.id) {\n log.debug('Ignore empty file id', fileMetadata);\n return;\n }\n const { id: fileId } = fileMetadata;\n if (isPreview) {\n previewFileMap.delete(fileId);\n return;\n }\n openFileMap.delete(fileId);\n },\n [openFileMap, previewFileMap]\n );\n\n const closeFilePanel = useCallback(\n fileMetadata => {\n log.debug('closeFilePanel', fileMetadata);\n const { id: fileId } = fileMetadata;\n let panelId = null;\n let isPreview = false;\n if (openFileMap.has(fileId)) {\n panelId = openFileMap.get(fileId);\n } else if (previewFileMap.has(fileId)) {\n panelId = previewFileMap.get(fileId);\n isPreview = true;\n } else {\n log.debug(`File ${fileId} isn't open, ignore close event`);\n return;\n }\n unregisterFilePanel(fileMetadata, isPreview);\n LayoutUtils.closeComponent(layout.root, { id: panelId });\n },\n [layout.root, openFileMap, previewFileMap, unregisterFilePanel]\n );\n\n const getNotebookTitle = useCallback(fileMetadata => {\n const { itemName } = fileMetadata;\n return FileUtils.getBaseName(itemName);\n }, []);\n\n const fileIsOpen = useCallback(\n fileMetadata => {\n const { id: fileId } = fileMetadata;\n log.debug('fileIsOpen', fileMetadata, fileId, openFileMap);\n return fileId && openFileMap.has(fileId);\n },\n [openFileMap]\n );\n\n const fileIsOpenAsPreview = useCallback(\n fileMetadata => {\n const { id: fileId } = fileMetadata;\n log.debug('fileIsOpenAsPreview', fileMetadata, fileId, previewFileMap);\n return fileId && previewFileMap.has(fileId);\n },\n [previewFileMap]\n );\n\n /**\n * Attempts to focus the panel with the provided panelId\n */\n const focusPanelById = useCallback(\n panelId => {\n if (!panelId) {\n return;\n }\n\n const panel = panelManager.getOpenedPanelById(panelId);\n if (panel && isNotebookPanel(panel)) {\n panel.focus();\n }\n },\n [panelManager]\n );\n\n const makeConfig = useCallback(\n ({\n id: panelId,\n settings,\n fileMetadata,\n session,\n sessionLanguage,\n isPreview = false,\n }) => {\n const panelState = {\n settings,\n fileMetadata,\n };\n const title = getNotebookTitle(fileMetadata);\n return {\n type: 'react-component',\n component: NotebookPanel.COMPONENT,\n isFocusOnShow: false,\n props: {\n localDashboardId: id,\n metadata: { id: panelId },\n session,\n sessionLanguage,\n panelState,\n isPreview,\n },\n title,\n id: panelId,\n };\n },\n [getNotebookTitle, id]\n );\n\n const createNotebook = useCallback(\n (\n session,\n sessionLanguage,\n settings,\n fileMetadata = { id: null, itemName: getNotebookFileName(settings) }\n ) => {\n const panelId = getPanelIdForFileMetadata(fileMetadata);\n if (fileIsOpen(fileMetadata) && panelId) {\n log.debug('File is already open, focus panel');\n showFilePanel(fileMetadata);\n focusPanelById(panelId);\n return;\n }\n const stack = LayoutUtils.getStackForComponentTypes(layout.root, [\n NotebookPanel.COMPONENT,\n ]);\n const config = makeConfig({\n id: panelId,\n settings,\n fileMetadata,\n session,\n sessionLanguage,\n });\n log.debug('createNotebook', config, openFileMap);\n LayoutUtils.openComponentInStack(stack, config);\n },\n [\n fileIsOpen,\n focusPanelById,\n getNotebookFileName,\n getPanelIdForFileMetadata,\n layout.root,\n makeConfig,\n openFileMap,\n showFilePanel,\n ]\n );\n\n const selectNotebook = useCallback(\n (session, sessionLanguage, settings, fileMetadata, shouldFocus = false) => {\n log.debug('selectNotebook', fileMetadata, shouldFocus);\n const isFileOpen = fileIsOpen(fileMetadata);\n const isFileOpenAsPreview = fileIsOpenAsPreview(fileMetadata);\n\n // If the file is already open, just show and focus it if necessary\n if (isFileOpen) {\n showFilePanel(fileMetadata);\n if (shouldFocus) {\n const panelId = getPanelIdForFileMetadata(fileMetadata);\n focusPanelById(panelId);\n }\n return;\n }\n\n // If the file is already open as a preview and we're not focusing it, just show it\n // If we're focusing it, that means we need to replace the panel anyway with a non-preview panel, so just fall into the logic below\n if (isFileOpenAsPreview && !shouldFocus) {\n showFilePanel(fileMetadata);\n return;\n }\n\n const [previewTabId] = Array.from(previewFileMap.values());\n let panelId = null;\n let stack = null;\n if (previewTabId != null) {\n panelId = previewTabId;\n stack = LayoutUtils.getStackForConfig(layout.root, {\n component: NotebookPanel.COMPONENT,\n id: panelId,\n });\n }\n if (stack == null) {\n panelId = getPanelIdForFileMetadata(fileMetadata);\n stack = LayoutUtils.getStackForComponentTypes(layout.root, [\n NotebookPanel.COMPONENT,\n ]);\n }\n const config = makeConfig({\n id: panelId,\n settings,\n fileMetadata,\n session,\n sessionLanguage,\n isPreview: !shouldFocus,\n });\n LayoutUtils.openComponentInStack(stack, config);\n if (shouldFocus) {\n // Focus the tab we just opened if we're supposed to\n focusPanelById(panelId);\n }\n },\n [\n showFilePanel,\n fileIsOpen,\n fileIsOpenAsPreview,\n focusPanelById,\n getPanelIdForFileMetadata,\n layout.root,\n makeConfig,\n previewFileMap,\n ]\n );\n\n /** Attempts to send the text to a notebook matching the passed in settings */\n const sendToNotebook = useCallback(\n (session, sessionLanguage, settings = {}, createIfNecessary = true) => {\n const notebookPanel = panelManager.getLastUsedPanelOfType(NotebookPanel);\n if (notebookPanel && isNotebookPanel(notebookPanel)) {\n if (settings && settings.value && notebookPanel.notebook) {\n notebookPanel.notebook.append(settings.value);\n }\n } else if (createIfNecessary) {\n createNotebook(session, sessionLanguage, settings);\n }\n },\n [createNotebook, panelManager]\n );\n\n useEffect(() => {\n const cleanups = [\n registerComponent(\n ConsolePanel.COMPONENT,\n (ConsolePanel as unknown) as ComponentType\n ),\n registerComponent(\n CommandHistoryPanel.COMPONENT,\n (CommandHistoryPanel as unknown) as ComponentType\n ),\n registerComponent(\n FileExplorerPanel.COMPONENT,\n (FileExplorerPanel as unknown) as ComponentType\n ),\n registerComponent(\n LogPanel.COMPONENT,\n (LogPanel as unknown) as ComponentType\n ),\n registerComponent(\n NotebookPanel.COMPONENT,\n (NotebookPanel as unknown) as ComponentType\n ),\n ];\n\n return () => {\n cleanups.forEach(cleanup => cleanup());\n };\n }, [registerComponent]);\n\n useListener(layout.eventHub, ConsoleEvent.SEND_COMMAND, handleSendCommand);\n useListener(\n layout.eventHub,\n ConsoleEvent.SETTINGS_CHANGED,\n handleSettingsChanged\n );\n useListener(layout.eventHub, NotebookEvent.CLOSE_FILE, closeFilePanel);\n useListener(layout.eventHub, NotebookEvent.CREATE_NOTEBOOK, createNotebook);\n useListener(layout.eventHub, NotebookEvent.SELECT_NOTEBOOK, selectNotebook);\n useListener(layout.eventHub, NotebookEvent.RENAME, renamePanel);\n useListener(layout.eventHub, NotebookEvent.RENAME_FILE, renameFilePanel);\n useListener(layout.eventHub, NotebookEvent.SEND_TO_NOTEBOOK, sendToNotebook);\n useListener(layout.eventHub, NotebookEvent.REGISTER_FILE, registerFilePanel);\n useListener(\n layout.eventHub,\n NotebookEvent.UNREGISTER_FILE,\n unregisterFilePanel\n );\n\n return <></>;\n};\n\nexport default ConsolePlugin;\n"],"file":"ConsolePlugin.js"}
1
+ {"version":3,"sources":["../src/ConsolePlugin.tsx"],"names":["LayoutUtils","useListener","FileUtils","Log","React","useCallback","useEffect","useRef","useState","useDispatch","shortid","ConsoleEvent","NotebookEvent","ConsolePanel","CommandHistoryPanel","FileExplorerPanel","LogPanel","NotebookPanel","MarkdownNotebookPanel","setDashboardConsoleSettings","log","module","isNotebookPanel","panel","notebook","undefined","ConsolePlugin","id","layout","panelManager","registerComponent","notebookIndex","openFileMap","Map","previewFileMap","dispatch","getConsolePanel","getLastUsedPanelOfType","WrappedComponent","handleSendCommand","command","focus","execute","trimmedCommand","trim","info","consolePanel","error","debug","addCommand","handleSettingsChanged","consoleSettings","getNotebookFileName","language","extension","title","current","getPanelIdForFileMetadata","fileMetadata","createIfNecessary","fileId","has","get","generate","renamePanel","panelId","newTitle","renameComponent","root","renameFilePanel","oldName","newName","delete","set","debug2","getBaseName","showFilePanel","activateTab","registerFilePanel","isPreview","existingPanelId","itemName","unregisterFilePanel","closeFilePanel","closeComponent","getNotebookTitle","fileIsOpen","fileIsOpenAsPreview","focusPanelById","getOpenedPanelById","makeConfig","settings","session","sessionLanguage","panelState","component","endsWith","COMPONENT","type","isFocusOnShow","props","localDashboardId","metadata","createNotebook","stack","getStackForComponentTypes","config","openComponentInStack","selectNotebook","shouldFocus","isFileOpen","isFileOpenAsPreview","previewTabId","Array","from","values","getStackForConfig","sendToNotebook","notebookPanel","value","append","cleanups","forEach","cleanup","eventHub","SEND_COMMAND","SETTINGS_CHANGED","CLOSE_FILE","CREATE_NOTEBOOK","SELECT_NOTEBOOK","RENAME","RENAME_FILE","SEND_TO_NOTEBOOK","REGISTER_FILE","UNREGISTER_FILE"],"mappings":"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","sourcesContent":["import { ScriptEditor } from '@deephaven/console';\nimport {\n DashboardPluginComponentProps,\n LayoutUtils,\n PanelComponent,\n useListener,\n} from '@deephaven/dashboard';\nimport { FileUtils } from '@deephaven/file-explorer';\nimport Log from '@deephaven/log';\nimport React, {\n ComponentType,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { useDispatch } from 'react-redux';\nimport shortid from 'shortid';\nimport { ConsoleEvent, NotebookEvent } from './events';\nimport {\n ConsolePanel,\n CommandHistoryPanel,\n FileExplorerPanel,\n LogPanel,\n NotebookPanel,\n} from './panels';\nimport MarkdownNotebookPanel from './panels/MarkdownNotebookPanel';\nimport { setDashboardConsoleSettings } from './redux';\n\nconst log = Log.module('ConsolePlugin');\n\ntype NotebookPanelComponent = PanelComponent & {\n notebook: ScriptEditor;\n focus: () => void;\n};\n\nfunction isNotebookPanel(\n panel: PanelComponent\n): panel is NotebookPanelComponent {\n return (panel as NotebookPanelComponent).notebook !== undefined;\n}\n\nexport const ConsolePlugin = ({\n id,\n layout,\n panelManager,\n registerComponent,\n}: DashboardPluginComponentProps): JSX.Element => {\n const notebookIndex = useRef(0);\n // Map from file ID to panel ID\n const [openFileMap] = useState(new Map<string, string>());\n const [previewFileMap] = useState(new Map<string, string>());\n\n const dispatch = useDispatch();\n\n const getConsolePanel = useCallback(\n () => panelManager.getLastUsedPanelOfType(ConsolePanel.WrappedComponent),\n [panelManager]\n );\n\n const handleSendCommand = useCallback(\n (command: string, focus = true, execute = true) => {\n const trimmedCommand = command && command.trim();\n if (!trimmedCommand) {\n log.info('Ignoring empty code');\n } else {\n const consolePanel = getConsolePanel();\n if (\n !consolePanel ||\n !(consolePanel instanceof ConsolePanel.WrappedComponent)\n ) {\n log.error('Console panel not found');\n return;\n }\n log.debug('Send command: ', command, focus, execute);\n consolePanel.addCommand(command, focus, execute);\n }\n },\n [getConsolePanel]\n );\n\n const handleSettingsChanged = useCallback(\n consoleSettings => {\n dispatch(setDashboardConsoleSettings(id, consoleSettings));\n },\n [dispatch, id]\n );\n\n const getNotebookFileName = useCallback(({ language }) => {\n const extension = language === 'python' ? 'py' : language;\n let title = null;\n if (!extension) {\n log.debug('No extension for language', language);\n title = `Untitled-${notebookIndex.current}`;\n } else {\n title = `Untitled-${notebookIndex.current}.${extension}`;\n }\n notebookIndex.current += 1;\n return title;\n }, []);\n\n const getPanelIdForFileMetadata = useCallback(\n (fileMetadata, createIfNecessary = true) => {\n const { id: fileId } = fileMetadata;\n if (fileId && openFileMap.has(fileId)) {\n return openFileMap.get(fileId);\n }\n if (fileId && previewFileMap.has(fileId)) {\n return previewFileMap.get(fileId);\n }\n if (createIfNecessary) {\n return shortid.generate();\n }\n return null;\n },\n [openFileMap, previewFileMap]\n );\n\n const renamePanel = useCallback(\n (panelId, newTitle) => {\n LayoutUtils.renameComponent(layout.root, { id: panelId }, newTitle);\n },\n [layout.root]\n );\n\n const renameFilePanel = useCallback(\n (oldName, newName) => {\n log.debug('Rename file panel', oldName, newName);\n let panelId;\n if (openFileMap.has(oldName)) {\n panelId = openFileMap.get(oldName);\n openFileMap.delete(oldName);\n if (panelId != null) {\n openFileMap.set(newName, panelId);\n }\n }\n if (previewFileMap.has(oldName)) {\n panelId = previewFileMap.get(oldName);\n previewFileMap.delete(oldName);\n if (panelId != null) {\n previewFileMap.set(newName, panelId);\n }\n }\n\n if (!panelId) {\n log.debug2(`File ${oldName} isn't open, no need to rename the tab`);\n return;\n }\n\n renamePanel(panelId, FileUtils.getBaseName(newName));\n },\n [openFileMap, previewFileMap, renamePanel]\n );\n\n /**\n * Show the panel for the given file metadata.\n * If the panel is not already open, then it just logs an error and does nothing.\n */\n const showFilePanel = useCallback(\n fileMetadata => {\n const panelId = getPanelIdForFileMetadata(fileMetadata, false);\n if (panelId == null) {\n log.error('Could not find panel id for file metadata', fileMetadata);\n return;\n }\n LayoutUtils.activateTab(layout.root, { id: panelId });\n },\n [getPanelIdForFileMetadata, layout.root]\n );\n\n const registerFilePanel = useCallback(\n (panelId, fileMetadata, isPreview) => {\n log.debug('registerFilePanel', panelId, fileMetadata, isPreview);\n if (!fileMetadata || !fileMetadata.id) {\n log.debug('Ignore empty file id', fileMetadata);\n return;\n }\n const { id: fileId } = fileMetadata;\n if (isPreview) {\n previewFileMap.set(fileId, panelId);\n return;\n }\n if (openFileMap.has(fileId)) {\n const existingPanelId = openFileMap.get(fileId);\n if (panelId === existingPanelId) {\n log.debug(`Update tab title for file ${fileId}`);\n const { itemName } = fileMetadata;\n renameFilePanel(fileId, FileUtils.getBaseName(itemName));\n } else {\n log.error(\n `File ${fileId} already associated with a different tab ${existingPanelId}`\n );\n }\n return;\n }\n\n openFileMap.set(fileId, panelId);\n\n // De-register preview tab\n if (previewFileMap.has(fileId)) {\n previewFileMap.delete(fileId);\n }\n },\n [openFileMap, previewFileMap, renameFilePanel]\n );\n\n const unregisterFilePanel = useCallback(\n (fileMetadata, isPreview) => {\n // Note: unregister event is triggered AFTER new register when switching from preview to edit mode\n // due to the LayoutUtils implementation (new tab added before deleting the old one)\n // This doesn't cause any issues because previews and editable files are stored in different maps,\n // but this situation could be completely avoided by sending an event to the tab\n // to make it switch from preview to edit mode without re-mounting and re-registering\n log.debug('unregisterFileTab', fileMetadata, isPreview);\n if (!fileMetadata || !fileMetadata.id) {\n log.debug('Ignore empty file id', fileMetadata);\n return;\n }\n const { id: fileId } = fileMetadata;\n if (isPreview) {\n previewFileMap.delete(fileId);\n return;\n }\n openFileMap.delete(fileId);\n },\n [openFileMap, previewFileMap]\n );\n\n const closeFilePanel = useCallback(\n fileMetadata => {\n log.debug('closeFilePanel', fileMetadata);\n const { id: fileId } = fileMetadata;\n let panelId = null;\n let isPreview = false;\n if (openFileMap.has(fileId)) {\n panelId = openFileMap.get(fileId);\n } else if (previewFileMap.has(fileId)) {\n panelId = previewFileMap.get(fileId);\n isPreview = true;\n } else {\n log.debug(`File ${fileId} isn't open, ignore close event`);\n return;\n }\n unregisterFilePanel(fileMetadata, isPreview);\n LayoutUtils.closeComponent(layout.root, { id: panelId });\n },\n [layout.root, openFileMap, previewFileMap, unregisterFilePanel]\n );\n\n const getNotebookTitle = useCallback(fileMetadata => {\n const { itemName } = fileMetadata;\n return FileUtils.getBaseName(itemName);\n }, []);\n\n const fileIsOpen = useCallback(\n fileMetadata => {\n const { id: fileId } = fileMetadata;\n log.debug('fileIsOpen', fileMetadata, fileId, openFileMap);\n return fileId && openFileMap.has(fileId);\n },\n [openFileMap]\n );\n\n const fileIsOpenAsPreview = useCallback(\n fileMetadata => {\n const { id: fileId } = fileMetadata;\n log.debug('fileIsOpenAsPreview', fileMetadata, fileId, previewFileMap);\n return fileId && previewFileMap.has(fileId);\n },\n [previewFileMap]\n );\n\n /**\n * Attempts to focus the panel with the provided panelId\n */\n const focusPanelById = useCallback(\n panelId => {\n if (!panelId) {\n return;\n }\n\n const panel = panelManager.getOpenedPanelById(panelId);\n if (panel && isNotebookPanel(panel)) {\n panel.focus();\n }\n },\n [panelManager]\n );\n\n const makeConfig = useCallback(\n ({\n id: panelId,\n settings,\n fileMetadata,\n session,\n sessionLanguage,\n isPreview = false,\n }) => {\n const panelState = {\n settings,\n fileMetadata,\n };\n // KLUDGE: show a different component type for markdown notebooks\n const component = fileMetadata?.itemName?.endsWith('.md')\n ? MarkdownNotebookPanel.COMPONENT\n : NotebookPanel.COMPONENT;\n const title = getNotebookTitle(fileMetadata);\n return {\n type: 'react-component',\n component,\n isFocusOnShow: false,\n props: {\n id: panelId,\n localDashboardId: id,\n metadata: { id: panelId },\n session,\n sessionLanguage,\n panelState,\n isPreview,\n },\n title,\n id: panelId,\n };\n },\n [getNotebookTitle, id]\n );\n\n const createNotebook = useCallback(\n (\n session,\n sessionLanguage,\n settings,\n fileMetadata = { id: null, itemName: getNotebookFileName(settings) }\n ) => {\n const panelId = getPanelIdForFileMetadata(fileMetadata);\n if (fileIsOpen(fileMetadata) && panelId) {\n log.debug('File is already open, focus panel');\n showFilePanel(fileMetadata);\n focusPanelById(panelId);\n return;\n }\n const stack = LayoutUtils.getStackForComponentTypes(layout.root, [\n NotebookPanel.COMPONENT,\n ]);\n const config = makeConfig({\n id: panelId,\n settings,\n fileMetadata,\n session,\n sessionLanguage,\n });\n log.debug('createNotebook', config, openFileMap);\n LayoutUtils.openComponentInStack(stack, config);\n },\n [\n fileIsOpen,\n focusPanelById,\n getNotebookFileName,\n getPanelIdForFileMetadata,\n layout.root,\n makeConfig,\n openFileMap,\n showFilePanel,\n ]\n );\n\n const selectNotebook = useCallback(\n (session, sessionLanguage, settings, fileMetadata, shouldFocus = false) => {\n log.debug('selectNotebook', fileMetadata, shouldFocus);\n const isFileOpen = fileIsOpen(fileMetadata);\n const isFileOpenAsPreview = fileIsOpenAsPreview(fileMetadata);\n\n // If the file is already open, just show and focus it if necessary\n if (isFileOpen) {\n showFilePanel(fileMetadata);\n if (shouldFocus) {\n const panelId = getPanelIdForFileMetadata(fileMetadata);\n focusPanelById(panelId);\n }\n return;\n }\n\n // If the file is already open as a preview and we're not focusing it, just show it\n // If we're focusing it, that means we need to replace the panel anyway with a non-preview panel, so just fall into the logic below\n if (isFileOpenAsPreview && !shouldFocus) {\n showFilePanel(fileMetadata);\n return;\n }\n\n const [previewTabId] = Array.from(previewFileMap.values());\n let panelId = null;\n let stack = null;\n if (previewTabId != null) {\n panelId = previewTabId;\n stack = LayoutUtils.getStackForConfig(layout.root, {\n // component: NotebookPanel.COMPONENT,\n id: panelId,\n });\n }\n if (stack == null) {\n panelId = getPanelIdForFileMetadata(fileMetadata);\n stack = LayoutUtils.getStackForComponentTypes(layout.root, [\n NotebookPanel.COMPONENT,\n MarkdownNotebookPanel.COMPONENT,\n ]);\n }\n const config = makeConfig({\n id: panelId,\n settings,\n fileMetadata,\n session,\n sessionLanguage,\n isPreview: !shouldFocus,\n });\n LayoutUtils.openComponentInStack(stack, config);\n if (shouldFocus) {\n // Focus the tab we just opened if we're supposed to\n focusPanelById(panelId);\n }\n },\n [\n showFilePanel,\n fileIsOpen,\n fileIsOpenAsPreview,\n focusPanelById,\n getPanelIdForFileMetadata,\n layout.root,\n makeConfig,\n previewFileMap,\n ]\n );\n\n /** Attempts to send the text to a notebook matching the passed in settings */\n const sendToNotebook = useCallback(\n (session, sessionLanguage, settings = {}, createIfNecessary = true) => {\n const notebookPanel = panelManager.getLastUsedPanelOfType(NotebookPanel);\n if (notebookPanel && isNotebookPanel(notebookPanel)) {\n if (settings && settings.value && notebookPanel.notebook) {\n notebookPanel.notebook.append(settings.value);\n }\n } else if (createIfNecessary) {\n createNotebook(session, sessionLanguage, settings);\n }\n },\n [createNotebook, panelManager]\n );\n\n useEffect(() => {\n const cleanups = [\n registerComponent(\n ConsolePanel.COMPONENT,\n (ConsolePanel as unknown) as ComponentType\n ),\n registerComponent(\n CommandHistoryPanel.COMPONENT,\n (CommandHistoryPanel as unknown) as ComponentType\n ),\n registerComponent(\n FileExplorerPanel.COMPONENT,\n (FileExplorerPanel as unknown) as ComponentType\n ),\n registerComponent(\n LogPanel.COMPONENT,\n (LogPanel as unknown) as ComponentType\n ),\n registerComponent(\n NotebookPanel.COMPONENT,\n (NotebookPanel as unknown) as ComponentType\n ),\n registerComponent(\n 'MarkdownNotebookPanel',\n (MarkdownNotebookPanel as unknown) as ComponentType\n ),\n ];\n\n return () => {\n cleanups.forEach(cleanup => cleanup());\n };\n }, [registerComponent]);\n\n useListener(layout.eventHub, ConsoleEvent.SEND_COMMAND, handleSendCommand);\n useListener(\n layout.eventHub,\n ConsoleEvent.SETTINGS_CHANGED,\n handleSettingsChanged\n );\n useListener(layout.eventHub, NotebookEvent.CLOSE_FILE, closeFilePanel);\n useListener(layout.eventHub, NotebookEvent.CREATE_NOTEBOOK, createNotebook);\n useListener(layout.eventHub, NotebookEvent.SELECT_NOTEBOOK, selectNotebook);\n useListener(layout.eventHub, NotebookEvent.RENAME, renamePanel);\n useListener(layout.eventHub, NotebookEvent.RENAME_FILE, renameFilePanel);\n useListener(layout.eventHub, NotebookEvent.SEND_TO_NOTEBOOK, sendToNotebook);\n useListener(layout.eventHub, NotebookEvent.REGISTER_FILE, registerFilePanel);\n useListener(\n layout.eventHub,\n NotebookEvent.UNREGISTER_FILE,\n unregisterFilePanel\n );\n\n return <></>;\n};\n\nexport default ConsolePlugin;\n"],"file":"ConsolePlugin.js"}
@@ -4,5 +4,6 @@ declare class ControlType {
4
4
  static INPUT_FILTER: string;
5
5
  static MARKDOWN: string;
6
6
  static FILTER_SET_MANAGER: string;
7
+ static MARKDOWN_NOTEBOOK: string;
7
8
  }
8
9
  //# sourceMappingURL=ControlType.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ControlType.d.ts","sourceRoot":"","sources":["../../src/controls/ControlType.js"],"names":[],"mappings":";AAAA;IACE,+BAAuD;IAEvD,4BAAiD;IAEjD,wBAAyC;IAEzC,kCAA6D;CAC9D"}
1
+ {"version":3,"file":"ControlType.d.ts","sourceRoot":"","sources":["../../src/controls/ControlType.js"],"names":[],"mappings":";AAAA;IACE,+BAAuD;IAEvD,4BAAiD;IAEjD,wBAAyC;IAEzC,kCAA6D;IAE7D,iCAA2D;CAC5D"}
@@ -10,5 +10,7 @@ _defineProperty(ControlType, "MARKDOWN", 'ControlType.MARKDOWN');
10
10
 
11
11
  _defineProperty(ControlType, "FILTER_SET_MANAGER", 'ControlType.FILTER_SET_MANAGER');
12
12
 
13
+ _defineProperty(ControlType, "MARKDOWN_NOTEBOOK", 'ControlType.MARKDOWN_NOTEBOOK');
14
+
13
15
  export default ControlType;
14
16
  //# sourceMappingURL=ControlType.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/controls/ControlType.js"],"names":["ControlType"],"mappings":";;AAAA,MAAMA,WAAN,CAAkB;;gBAAZA,W,qBACqB,6B;;gBADrBA,W,kBAGkB,0B;;gBAHlBA,W,cAKc,sB;;gBALdA,W,wBAOwB,gC;;AAG9B,eAAeA,WAAf","sourcesContent":["class ControlType {\n static DROPDOWN_FILTER = 'ControlType.DROPDOWN_FILTER';\n\n static INPUT_FILTER = 'ControlType.INPUT_FILTER';\n\n static MARKDOWN = 'ControlType.MARKDOWN';\n\n static FILTER_SET_MANAGER = 'ControlType.FILTER_SET_MANAGER';\n}\n\nexport default ControlType;\n"],"file":"ControlType.js"}
1
+ {"version":3,"sources":["../../src/controls/ControlType.js"],"names":["ControlType"],"mappings":";;AAAA,MAAMA,WAAN,CAAkB;;gBAAZA,W,qBACqB,6B;;gBADrBA,W,kBAGkB,0B;;gBAHlBA,W,cAKc,sB;;gBALdA,W,wBAOwB,gC;;gBAPxBA,W,uBASuB,+B;;AAG7B,eAAeA,WAAf","sourcesContent":["class ControlType {\n static DROPDOWN_FILTER = 'ControlType.DROPDOWN_FILTER';\n\n static INPUT_FILTER = 'ControlType.INPUT_FILTER';\n\n static MARKDOWN = 'ControlType.MARKDOWN';\n\n static FILTER_SET_MANAGER = 'ControlType.FILTER_SET_MANAGER';\n\n static MARKDOWN_NOTEBOOK = 'ControlType.MARKDOWN_NOTEBOOK';\n}\n\nexport default ControlType;\n"],"file":"ControlType.js"}
@@ -0,0 +1,21 @@
1
+ declare class MarkdownNotebookContainer extends React.PureComponent<any, any, any> {
2
+ constructor(props: any);
3
+ constructor(props: any, context: any);
4
+ }
5
+ declare namespace MarkdownNotebookContainer {
6
+ namespace propTypes {
7
+ const onDoubleClick: PropTypes.Requireable<(...args: any[]) => any>;
8
+ const children: PropTypes.Validator<string | number | boolean | {} | PropTypes.ReactElementLike | PropTypes.ReactNodeArray>;
9
+ const isEditing: PropTypes.Requireable<boolean>;
10
+ }
11
+ namespace defaultProps {
12
+ const isEditing_1: boolean;
13
+ export { isEditing_1 as isEditing };
14
+ const onDoubleClick_1: null;
15
+ export { onDoubleClick_1 as onDoubleClick };
16
+ }
17
+ }
18
+ export default MarkdownNotebookContainer;
19
+ import React from "react";
20
+ import PropTypes from "prop-types";
21
+ //# sourceMappingURL=MarkdownNotebookContainer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarkdownNotebookContainer.d.ts","sourceRoot":"","sources":["../../src/panels/MarkdownNotebookContainer.jsx"],"names":[],"mappings":"AAMA;IAoCi4kB,wBAA8C;IAAA,sCAAyJ;CAZvklB"}
@@ -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