@deephaven/dashboard-core-plugins 0.6.1-beta.0 → 0.6.1-demo.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ConsolePlugin.d.ts.map +1 -1
- package/dist/ConsolePlugin.js +11 -5
- package/dist/ConsolePlugin.js.map +1 -1
- package/dist/controls/ControlType.d.ts +1 -0
- package/dist/controls/ControlType.d.ts.map +1 -1
- package/dist/controls/ControlType.js +2 -0
- package/dist/controls/ControlType.js.map +1 -1
- package/dist/panels/MarkdownNotebookContainer.d.ts +21 -0
- package/dist/panels/MarkdownNotebookContainer.d.ts.map +1 -0
- package/dist/panels/MarkdownNotebookContainer.js +35 -0
- package/dist/panels/MarkdownNotebookContainer.js.map +1 -0
- package/dist/panels/MarkdownNotebookEditor.d.ts +46 -0
- package/dist/panels/MarkdownNotebookEditor.d.ts.map +1 -0
- package/dist/panels/MarkdownNotebookEditor.js +257 -0
- package/dist/panels/MarkdownNotebookEditor.js.map +1 -0
- package/dist/panels/MarkdownNotebookPanel.css +127 -0
- package/dist/panels/MarkdownNotebookPanel.css.map +1 -0
- package/dist/panels/MarkdownNotebookPanel.d.ts +91 -0
- package/dist/panels/MarkdownNotebookPanel.d.ts.map +1 -0
- package/dist/panels/MarkdownNotebookPanel.js +446 -0
- package/dist/panels/MarkdownNotebookPanel.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +26 -54
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConsolePlugin.d.ts","sourceRoot":"","sources":["../src/ConsolePlugin.tsx"],"names":[],"mappings":";AACA,OAAO,EACL,6BAA6B,EAI9B,MAAM,sBAAsB,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"}
|
package/dist/ConsolePlugin.js
CHANGED
|
@@ -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
|
|
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"}
|
|
@@ -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;
|
|
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;;
|
|
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
|