@deephaven/dashboard-core-plugins 0.43.0 → 0.44.1-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/dist/ChartBuilderPlugin.js +54 -0
  2. package/dist/ChartBuilderPlugin.js.map +1 -0
  3. package/dist/ChartPlugin.js +66 -0
  4. package/dist/ChartPlugin.js.map +1 -0
  5. package/dist/ConsolePlugin.js +396 -0
  6. package/dist/ConsolePlugin.js.map +1 -0
  7. package/dist/FilterPlugin.js +205 -0
  8. package/dist/FilterPlugin.js.map +1 -0
  9. package/dist/GridPlugin.js +74 -0
  10. package/dist/GridPlugin.js.map +1 -0
  11. package/dist/LinkerPlugin.js +18 -0
  12. package/dist/LinkerPlugin.js.map +1 -0
  13. package/dist/MarkdownPlugin.js +87 -0
  14. package/dist/MarkdownPlugin.js.map +1 -0
  15. package/dist/PandasPlugin.js +66 -0
  16. package/dist/PandasPlugin.js.map +1 -0
  17. package/dist/controls/ControlType.js +10 -0
  18. package/dist/controls/ControlType.js.map +1 -0
  19. package/dist/controls/dropdown-filter/DropdownFilter.css +86 -0
  20. package/dist/controls/dropdown-filter/DropdownFilter.css.map +1 -0
  21. package/dist/controls/dropdown-filter/DropdownFilter.js +417 -0
  22. package/dist/controls/dropdown-filter/DropdownFilter.js.map +1 -0
  23. package/dist/controls/input-filter/InputFilter.css +75 -0
  24. package/dist/controls/input-filter/InputFilter.css.map +1 -0
  25. package/dist/controls/input-filter/InputFilter.js +291 -0
  26. package/dist/controls/input-filter/InputFilter.js.map +1 -0
  27. package/dist/controls/markdown/MarkdownContainer.js +30 -0
  28. package/dist/controls/markdown/MarkdownContainer.js.map +1 -0
  29. package/dist/controls/markdown/MarkdownEditor.js +52 -0
  30. package/dist/controls/markdown/MarkdownEditor.js.map +1 -0
  31. package/dist/controls/markdown/MarkdownStartPage.js +109 -0
  32. package/dist/controls/markdown/MarkdownStartPage.js.map +1 -0
  33. package/dist/controls/markdown/MarkdownUtils.js +23 -0
  34. package/dist/controls/markdown/MarkdownUtils.js.map +1 -0
  35. package/dist/events/ChartEvent.js +9 -0
  36. package/dist/events/ChartEvent.js.map +1 -0
  37. package/dist/events/ConsoleEvent.js +11 -0
  38. package/dist/events/ConsoleEvent.js.map +1 -0
  39. package/dist/events/InputFilterEvent.js +14 -0
  40. package/dist/events/InputFilterEvent.js.map +1 -0
  41. package/dist/events/IrisGridEvent.js +12 -0
  42. package/dist/events/IrisGridEvent.js.map +1 -0
  43. package/dist/events/MarkdownEvent.js +4 -0
  44. package/dist/events/MarkdownEvent.js.map +1 -0
  45. package/dist/events/NotebookEvent.js +15 -0
  46. package/dist/events/NotebookEvent.js.map +1 -0
  47. package/dist/events/PQEvent.js +9 -0
  48. package/dist/events/PQEvent.js.map +1 -0
  49. package/dist/events/PandasEvent.js +8 -0
  50. package/dist/events/PandasEvent.js.map +1 -0
  51. package/dist/events/TabEvent.js +12 -0
  52. package/dist/events/TabEvent.js.map +1 -0
  53. package/dist/events/index.js +9 -0
  54. package/dist/events/index.js.map +1 -0
  55. package/dist/index.js +17 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/linker/ColumnSelectionValidator.js +2 -0
  58. package/dist/linker/ColumnSelectionValidator.js.map +1 -0
  59. package/dist/linker/Linker.js +736 -0
  60. package/dist/linker/Linker.js.map +1 -0
  61. package/dist/linker/LinkerLink.css +142 -0
  62. package/dist/linker/LinkerLink.css.map +1 -0
  63. package/dist/linker/LinkerLink.js +314 -0
  64. package/dist/linker/LinkerLink.js.map +1 -0
  65. package/dist/linker/LinkerOverlayContent.css +63 -0
  66. package/dist/linker/LinkerOverlayContent.css.map +1 -0
  67. package/dist/linker/LinkerOverlayContent.js +343 -0
  68. package/dist/linker/LinkerOverlayContent.js.map +1 -0
  69. package/dist/linker/LinkerUtils.js +139 -0
  70. package/dist/linker/LinkerUtils.js.map +1 -0
  71. package/dist/linker/ToolType.js +5 -0
  72. package/dist/linker/ToolType.js.map +1 -0
  73. package/dist/linker/index.js +2 -0
  74. package/dist/linker/index.js.map +1 -0
  75. package/dist/panels/ChartColumnSelectorOverlay.css +11 -0
  76. package/dist/panels/ChartColumnSelectorOverlay.css.map +1 -0
  77. package/dist/panels/ChartColumnSelectorOverlay.js +38 -0
  78. package/dist/panels/ChartColumnSelectorOverlay.js.map +1 -0
  79. package/dist/panels/ChartFilterOverlay.css +22 -0
  80. package/dist/panels/ChartFilterOverlay.css.map +1 -0
  81. package/dist/panels/ChartFilterOverlay.js +90 -0
  82. package/dist/panels/ChartFilterOverlay.js.map +1 -0
  83. package/dist/panels/ChartPanel.css +38 -0
  84. package/dist/panels/ChartPanel.css.map +1 -0
  85. package/dist/panels/ChartPanel.js +971 -0
  86. package/dist/panels/ChartPanel.js.map +1 -0
  87. package/dist/panels/ChartPanelUtils.js +5 -0
  88. package/dist/panels/ChartPanelUtils.js.map +1 -0
  89. package/dist/panels/CommandHistoryPanel.css +19 -0
  90. package/dist/panels/CommandHistoryPanel.css.map +1 -0
  91. package/dist/panels/CommandHistoryPanel.js +195 -0
  92. package/dist/panels/CommandHistoryPanel.js.map +1 -0
  93. package/dist/panels/ConsolePanel.css +19 -0
  94. package/dist/panels/ConsolePanel.css.map +1 -0
  95. package/dist/panels/ConsolePanel.js +365 -0
  96. package/dist/panels/ConsolePanel.js.map +1 -0
  97. package/dist/panels/DropdownFilterPanel.css +6 -0
  98. package/dist/panels/DropdownFilterPanel.css.map +1 -0
  99. package/dist/panels/DropdownFilterPanel.js +685 -0
  100. package/dist/panels/DropdownFilterPanel.js.map +1 -0
  101. package/dist/panels/FileExplorerPanel.css +6 -0
  102. package/dist/panels/FileExplorerPanel.css.map +1 -0
  103. package/dist/panels/FileExplorerPanel.js +252 -0
  104. package/dist/panels/FileExplorerPanel.js.map +1 -0
  105. package/dist/panels/FilterSetManager.css +112 -0
  106. package/dist/panels/FilterSetManager.css.map +1 -0
  107. package/dist/panels/FilterSetManager.js +689 -0
  108. package/dist/panels/FilterSetManager.js.map +1 -0
  109. package/dist/panels/FilterSetManagerPanel.css +34 -0
  110. package/dist/panels/FilterSetManagerPanel.css.map +1 -0
  111. package/dist/panels/FilterSetManagerPanel.js +345 -0
  112. package/dist/panels/FilterSetManagerPanel.js.map +1 -0
  113. package/dist/panels/InputFilterPanel.js +232 -0
  114. package/dist/panels/InputFilterPanel.js.map +1 -0
  115. package/dist/panels/IrisGridPanel.css +24 -0
  116. package/dist/panels/IrisGridPanel.css.map +1 -0
  117. package/dist/panels/IrisGridPanel.js +1018 -0
  118. package/dist/panels/IrisGridPanel.js.map +1 -0
  119. package/dist/panels/IrisGridPanelTooltip.js +39 -0
  120. package/dist/panels/IrisGridPanelTooltip.js.map +1 -0
  121. package/dist/panels/LogPanel.css +15 -0
  122. package/dist/panels/LogPanel.css.map +1 -0
  123. package/dist/panels/LogPanel.js +110 -0
  124. package/dist/panels/LogPanel.js.map +1 -0
  125. package/dist/panels/MarkdownNotebook.css +107 -0
  126. package/dist/panels/MarkdownNotebook.css.map +1 -0
  127. package/dist/panels/MarkdownNotebook.js +232 -0
  128. package/dist/panels/MarkdownNotebook.js.map +1 -0
  129. package/dist/panels/MarkdownPanel.css +90 -0
  130. package/dist/panels/MarkdownPanel.css.map +1 -0
  131. package/dist/panels/MarkdownPanel.js +202 -0
  132. package/dist/panels/MarkdownPanel.js.map +1 -0
  133. package/dist/panels/MockFileStorage.js +70 -0
  134. package/dist/panels/MockFileStorage.js.map +1 -0
  135. package/dist/panels/MockFileStorageTable.js +80 -0
  136. package/dist/panels/MockFileStorageTable.js.map +1 -0
  137. package/dist/panels/NotebookPanel.css +44 -0
  138. package/dist/panels/NotebookPanel.css.map +1 -0
  139. package/dist/panels/NotebookPanel.js +1224 -0
  140. package/dist/panels/NotebookPanel.js.map +1 -0
  141. package/dist/panels/PandasPanel.css +15 -0
  142. package/dist/panels/PandasPanel.css.map +1 -0
  143. package/dist/panels/PandasPanel.js +86 -0
  144. package/dist/panels/PandasPanel.js.map +1 -0
  145. package/dist/panels/Panel.js +314 -0
  146. package/dist/panels/Panel.js.map +1 -0
  147. package/dist/panels/PanelContextMenu.js +126 -0
  148. package/dist/panels/PanelContextMenu.js.map +1 -0
  149. package/dist/panels/RenameDialog.js +156 -0
  150. package/dist/panels/RenameDialog.js.map +1 -0
  151. package/dist/panels/WidgetPanel.css +17 -0
  152. package/dist/panels/WidgetPanel.css.map +1 -0
  153. package/dist/panels/WidgetPanel.js +189 -0
  154. package/dist/panels/WidgetPanel.js.map +1 -0
  155. package/dist/panels/WidgetPanelTooltip.css +40 -0
  156. package/dist/panels/WidgetPanelTooltip.css.map +1 -0
  157. package/dist/panels/WidgetPanelTooltip.js +49 -0
  158. package/dist/panels/WidgetPanelTooltip.js.map +1 -0
  159. package/dist/panels/index.js +22 -0
  160. package/dist/panels/index.js.map +1 -0
  161. package/dist/prop-types/CommonPropTypes.js +9 -0
  162. package/dist/prop-types/CommonPropTypes.js.map +1 -0
  163. package/dist/prop-types/UIPropTypes.js +42 -0
  164. package/dist/prop-types/UIPropTypes.js.map +1 -0
  165. package/dist/prop-types/index.js +3 -0
  166. package/dist/prop-types/index.js.map +1 -0
  167. package/dist/redux/actionTypes.js +3 -0
  168. package/dist/redux/actionTypes.js.map +1 -0
  169. package/dist/redux/actions.js +88 -0
  170. package/dist/redux/actions.js.map +1 -0
  171. package/dist/redux/index.js +10 -0
  172. package/dist/redux/index.js.map +1 -0
  173. package/dist/redux/reducers/connection.js +7 -0
  174. package/dist/redux/reducers/connection.js.map +1 -0
  175. package/dist/redux/reducers/index.js +5 -0
  176. package/dist/redux/reducers/index.js.map +1 -0
  177. package/dist/redux/reducers/sessionWrapper.js +7 -0
  178. package/dist/redux/reducers/sessionWrapper.js.map +1 -0
  179. package/dist/redux/selectors.js +92 -0
  180. package/dist/redux/selectors.js.map +1 -0
  181. package/package.json +22 -22
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotebookPanel.js","names":["React","Component","ReactDOM","memoize","connect","FontAwesomeIcon","BasicModal","ContextActions","DropdownMenu","Tooltip","GLOBAL_SHORTCUTS","Button","ScriptEditor","ScriptEditorUtils","SHORTCUTS","FileUtils","NewItemModal","vsSave","vsKebabVertical","dhFileSearch","vsPlay","dhRunSelection","vsCheck","getFileStorage","saveSettings","saveSettingsAction","getSettings","getDefaultNotebookSettings","classNames","debounce","Log","assertNotNull","Pending","PromiseUtils","PanelEvent","ConsoleEvent","NotebookEvent","getDashboardSessionWrapper","Panel","MarkdownNotebook","log","module","DEBOUNCE_PANEL_STATE_UPDATE","NotebookPanel","handleError","error","isCanceled","languageFromFileName","fileName","extension","getExtension","toLowerCase","constructor","props","initialSettings","isMinimapEnabled","minimap","enabled","isWordWrapEnabled","title","icon","action","handleFind","group","groups","high","shortcut","NOTEBOOK","FIND","order","undefined","handleMinimapChange","medium","MINIMAP","handleWordWrapChange","WORDWRAP","handleBlur","bind","handleCloseCancel","handleCloseDiscard","handleCloseSave","handleCopy","handleEditorInitialized","handleEditorWillDestroy","handleEditorChange","handleFocus","handleLinkClick","handleLoadSuccess","handleLoadError","handlePanelDropped","handleRenameFile","handleResize","handleRunCommand","handleRunAll","handleRunSelected","handleSave","handleSaveAsCancel","handleSaveAsSubmit","handleSaveError","handleSaveSuccess","handleSessionOpened","handleSessionClosed","handleShow","handleShowRename","handleTab","handleTabBlur","handleTabClick","handleTabFocus","handleTransformLinkUri","handleOverwrite","handlePreviewPromotion","getDropdownOverflowActions","pending","debouncedSavePanelState","savePanelState","debouncedLoad","load","notebook","tabTitleElement","tabInitOnce","isDashboardActive","session","sessionLanguage","panelState","settings","value","language","wordWrap","fileMetadata","isPreview","hasFileId","hasPath","itemName","isUnsaved","length","changeCount","state","isFocused","isLoading","isLoaded","savedChangeCount","showCloseModal","showSaveAsModal","scriptCode","debug","componentDidMount","glContainer","glEventHub","tab","initTab","initNotebookContent","on","RENAME_FILE","DROPPED","PROMOTE_FROM_PREVIEW","componentDidUpdate","prevProps","prevState","defaultNotebookSettings","setPreviewStatus","updateEditorWordWrap","updateEditorMinimap","componentWillUnmount","flush","cancel","off","emit","UNREGISTER_FILE","initTabCloseOverride","initTabClasses","beforeClose","options","force","setState","tabElement","element","get","titleElement","querySelector","classList","add","getNotebookValue","notebookValue","getValue","id","registerFileMetadata","Error","closeFileTabById","CLOSE_FILE","metadata","tabId","REGISTER_FILE","renameTab","RENAME","fileStorage","loadFile","then","loadedFile","filename","prevItemName","getBaseName","updatedSettings","content","catch","save","saveContent","updateSavedChangeCount","saveFile","basename","remove","removePreviewStatus","dehydratedValue","dehydratedSettings","close","focus","copyName","getCopyFileName","createNotebook","innerEditor","editor","e","debug2","isUndoing","isRedoing","toggleFind","updateOptions","newSettings","event","notebooksUrl","href","currentTarget","startsWith","stopPropagation","preventDefault","notebookPath","substring","replace","notebookSettings","SELECT_NOTEBOOK","errorParam","isTimedOut","file","oldMetadata","deleteFile","name","isOverwrite","oldName","newName","curPanelState","JSON","stringify","updateDimensions","command","runCommand","getSelectedCommand","droppedId","forceUpdate","args","isHidden","detail","src","endsWith","charAt","itemUri","URL","requestAnimationFrame","CREATE_NOTEBOOK","SEND_COMMAND","getOverflowActions","render","focusOnMount","DEFAULT_NAME","isMarkdown","isExistingItem","isSessionConnected","isLanguageMatching","runButtonsDisabled","toolbarDisabled","contextActions","SAVE","disabledRunButtonTooltip","getDisabledRunTooltip","disabledRunSelectedButtonTooltip","additionalActions","portal","find","createPortal","RUN","getDisplayText","RUN_SELECTED","POPPER_OPTIONS","placement","mapStateToProps","ownProps","sessionWrapper","localDashboardId","config","sessionConfig","type","ConnectedNotebookPanel","forwardRef"],"sources":["../../src/panels/NotebookPanel.tsx"],"sourcesContent":["// Wrapper for the Notebook for use in a golden layout container\nimport React, { Component, ReactElement } from 'react';\nimport ReactDOM from 'react-dom';\nimport memoize from 'memoize-one';\nimport { connect } from 'react-redux';\nimport type { editor } from 'monaco-editor';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n BasicModal,\n ContextActions,\n DropdownMenu,\n Tooltip,\n GLOBAL_SHORTCUTS,\n Button,\n DropdownAction,\n} from '@deephaven/components';\nimport { ScriptEditor, ScriptEditorUtils, SHORTCUTS } from '@deephaven/console';\nimport {\n FileStorage,\n FileUtils,\n NewItemModal,\n File,\n} from '@deephaven/file-explorer';\nimport {\n vsSave,\n vsKebabVertical,\n dhFileSearch,\n vsPlay,\n dhRunSelection,\n vsCheck,\n} from '@deephaven/icons';\nimport {\n getFileStorage,\n saveSettings as saveSettingsAction,\n RootState,\n getSettings,\n WorkspaceSettings,\n getDefaultNotebookSettings,\n} from '@deephaven/redux';\nimport classNames from 'classnames';\nimport debounce from 'lodash.debounce';\nimport Log from '@deephaven/log';\nimport { assertNotNull, Pending, PromiseUtils } from '@deephaven/utils';\nimport type {\n Container,\n EventEmitter,\n Tab,\n CloseOptions,\n} from '@deephaven/golden-layout';\nimport type { IdeSession } from '@deephaven/jsapi-types';\nimport { PanelEvent } from '@deephaven/dashboard';\nimport { ConsoleEvent, NotebookEvent } from '../events';\nimport { getDashboardSessionWrapper } from '../redux';\nimport Panel from './Panel';\nimport MarkdownNotebook from './MarkdownNotebook';\nimport './NotebookPanel.scss';\n\nconst log = Log.module('NotebookPanel');\n\nconst DEBOUNCE_PANEL_STATE_UPDATE = 400;\n\ninterface Metadata {\n id: string;\n}\ninterface NotebookSetting {\n isMinimapEnabled: boolean;\n}\n\ninterface FileMetadata {\n itemName: string;\n id: string;\n}\n\ninterface PanelState {\n isPreview?: boolean;\n settings: editor.IStandaloneEditorConstructionOptions;\n fileMetadata: FileMetadata | null;\n}\n\ninterface NotebookPanelProps {\n fileStorage: FileStorage;\n glContainer: Container;\n glEventHub: EventEmitter;\n isDashboardActive: boolean;\n isPreview: boolean;\n metadata: Metadata;\n session: IdeSession;\n sessionLanguage: string;\n panelState: PanelState;\n notebooksUrl: string;\n defaultNotebookSettings: NotebookSetting;\n settings: WorkspaceSettings;\n saveSettings: (settings: WorkspaceSettings) => void;\n}\n\ninterface NotebookPanelState {\n error?: {\n message?: string | undefined;\n };\n isDashboardActive: boolean;\n isFocused: boolean;\n isLoading: boolean;\n isLoaded: boolean;\n isPreview: boolean;\n\n savedChangeCount: number;\n changeCount: number;\n fileMetadata: FileMetadata | null;\n settings: editor.IStandaloneEditorConstructionOptions;\n\n session?: IdeSession;\n sessionLanguage?: string;\n\n // eslint-disable-next-line react/no-unused-state\n panelState: PanelState;\n\n showCloseModal: boolean;\n showSaveAsModal: boolean;\n\n scriptCode: string;\n\n itemName?: string;\n}\n\nclass NotebookPanel extends Component<NotebookPanelProps, NotebookPanelState> {\n static COMPONENT = 'NotebookPanel';\n\n static POPPER_OPTIONS = { placement: 'bottom-end' } as const;\n\n static DEFAULT_NAME = 'Untitled';\n\n static handleError(error: unknown): void {\n if (PromiseUtils.isCanceled(error)) {\n return;\n }\n log.error(error);\n }\n\n static defaultProps = {\n isDashboardActive: true,\n isPreview: false,\n session: null,\n sessionLanguage: null,\n defaultNotebookSettings: null,\n };\n\n static languageFromFileName(fileName: string): string | null {\n const extension = FileUtils.getExtension(fileName).toLowerCase();\n switch (extension) {\n case 'py':\n case 'python':\n return 'python';\n case 'groovy':\n return 'groovy';\n case 'scala':\n return 'scala';\n default:\n return null;\n }\n }\n\n constructor(props: NotebookPanelProps) {\n super(props);\n\n this.handleBlur = this.handleBlur.bind(this);\n this.handleCloseCancel = this.handleCloseCancel.bind(this);\n this.handleCloseDiscard = this.handleCloseDiscard.bind(this);\n this.handleCloseSave = this.handleCloseSave.bind(this);\n this.handleCopy = this.handleCopy.bind(this);\n this.handleEditorInitialized = this.handleEditorInitialized.bind(this);\n this.handleEditorWillDestroy = this.handleEditorWillDestroy.bind(this);\n this.handleEditorChange = this.handleEditorChange.bind(this);\n this.handleFind = this.handleFind.bind(this);\n this.handleMinimapChange = this.handleMinimapChange.bind(this);\n this.handleWordWrapChange = this.handleWordWrapChange.bind(this);\n this.handleFocus = this.handleFocus.bind(this);\n this.handleLinkClick = this.handleLinkClick.bind(this);\n this.handleLoadSuccess = this.handleLoadSuccess.bind(this);\n this.handleLoadError = this.handleLoadError.bind(this);\n this.handlePanelDropped = this.handlePanelDropped.bind(this);\n this.handleRenameFile = this.handleRenameFile.bind(this);\n this.handleResize = this.handleResize.bind(this);\n this.handleRunCommand = this.handleRunCommand.bind(this);\n this.handleRunAll = this.handleRunAll.bind(this);\n this.handleRunSelected = this.handleRunSelected.bind(this);\n this.handleSave = this.handleSave.bind(this);\n this.handleSaveAsCancel = this.handleSaveAsCancel.bind(this);\n this.handleSaveAsSubmit = this.handleSaveAsSubmit.bind(this);\n this.handleSaveError = this.handleSaveError.bind(this);\n this.handleSaveSuccess = this.handleSaveSuccess.bind(this);\n this.handleSessionOpened = this.handleSessionOpened.bind(this);\n this.handleSessionClosed = this.handleSessionClosed.bind(this);\n this.handleShow = this.handleShow.bind(this);\n this.handleShowRename = this.handleShowRename.bind(this);\n this.handleTab = this.handleTab.bind(this);\n this.handleTabBlur = this.handleTabBlur.bind(this);\n this.handleTabClick = this.handleTabClick.bind(this);\n this.handleTabFocus = this.handleTabFocus.bind(this);\n this.handleTransformLinkUri = this.handleTransformLinkUri.bind(this);\n this.handleOverwrite = this.handleOverwrite.bind(this);\n this.handlePreviewPromotion = this.handlePreviewPromotion.bind(this);\n this.getDropdownOverflowActions = this.getDropdownOverflowActions.bind(\n this\n );\n this.pending = new Pending();\n\n this.debouncedSavePanelState = debounce(\n this.savePanelState.bind(this),\n DEBOUNCE_PANEL_STATE_UPDATE\n );\n\n this.debouncedLoad = debounce(\n this.load.bind(this),\n DEBOUNCE_PANEL_STATE_UPDATE\n );\n\n this.notebook = null;\n\n this.tabTitleElement = null;\n\n this.tabInitOnce = false;\n\n const { isDashboardActive, session, sessionLanguage, panelState } = props;\n\n let settings: editor.IStandaloneEditorConstructionOptions = {\n value: '',\n language: '',\n wordWrap: 'off',\n };\n let fileMetadata = null;\n let { isPreview } = props;\n if (panelState != null) {\n ({\n fileMetadata = fileMetadata,\n isPreview = isPreview,\n settings = settings,\n } = panelState);\n }\n\n // Not showing the unsaved indicator for null file id and editor content === '',\n // may need to implement some other indication that this notebook has never been saved\n const hasFileId =\n fileMetadata != null && FileUtils.hasPath(fileMetadata.itemName);\n\n // Unsaved if file id != null and content != null\n // OR file id is null AND content is not null or ''\n const isUnsaved =\n (hasFileId === true && settings.value != null) ||\n (!hasFileId && settings.value != null && settings.value.length > 0);\n const changeCount = isUnsaved ? 1 : 0;\n\n this.state = {\n error: undefined,\n isDashboardActive,\n isFocused: false,\n isLoading: true,\n isLoaded: false,\n isPreview,\n\n savedChangeCount: 0,\n changeCount,\n fileMetadata,\n settings,\n\n session,\n sessionLanguage,\n\n // eslint-disable-next-line react/no-unused-state\n panelState: {\n fileMetadata,\n settings,\n },\n\n showCloseModal: false,\n showSaveAsModal: false,\n\n scriptCode: '',\n };\n\n log.debug('constructor', props, this.state);\n }\n\n componentDidMount() {\n const { glContainer, glEventHub } = this.props;\n const { tab } = glContainer;\n if (tab != null) this.initTab(tab);\n this.initNotebookContent();\n glEventHub.on(NotebookEvent.RENAME_FILE, this.handleRenameFile);\n glEventHub.on(PanelEvent.DROPPED, this.handlePanelDropped);\n glContainer.on(\n NotebookEvent.PROMOTE_FROM_PREVIEW,\n this.handlePreviewPromotion\n );\n }\n\n componentDidUpdate(\n prevProps: NotebookPanelProps,\n prevState: NotebookPanelState\n ): void {\n const { isPreview, settings } = this.state;\n const { wordWrap } = settings;\n const { defaultNotebookSettings } = this.props;\n if (isPreview !== prevState.isPreview) {\n this.setPreviewStatus();\n }\n if (wordWrap !== prevState.settings.wordWrap) {\n this.updateEditorWordWrap();\n this.debouncedSavePanelState();\n }\n if (\n defaultNotebookSettings.isMinimapEnabled !==\n prevProps.defaultNotebookSettings.isMinimapEnabled\n ) {\n this.updateEditorMinimap();\n }\n }\n\n componentWillUnmount(): void {\n this.debouncedSavePanelState.flush();\n this.pending.cancel();\n\n const { glEventHub, glContainer } = this.props;\n\n const { fileMetadata, isPreview } = this.state;\n glEventHub.off(NotebookEvent.RENAME_FILE, this.handleRenameFile);\n glEventHub.off(PanelEvent.DROPPED, this.handlePanelDropped);\n glContainer.off(\n NotebookEvent.PROMOTE_FROM_PREVIEW,\n this.handlePreviewPromotion\n );\n glEventHub.emit(NotebookEvent.UNREGISTER_FILE, fileMetadata, isPreview);\n }\n\n pending: Pending;\n\n debouncedSavePanelState;\n\n debouncedLoad;\n\n notebook: ScriptEditor | null;\n\n tabTitleElement: Element | null;\n\n tabInitOnce: boolean;\n\n editor?: editor.IStandaloneCodeEditor;\n\n // Called by TabEvent. Happens once when created, but also each time its moved.\n // when moved, need to re-init the unsaved indicators on title elements\n initTab(tab: Tab): void {\n if (!this.tabInitOnce) {\n this.tabInitOnce = true;\n this.initTabCloseOverride();\n }\n this.initTabClasses(tab);\n }\n\n /**\n * Adds a beforeClose handler to check if a notebook needs to be saved\n * Call panel close with force if the check can be skipped\n *\n * Note that firing a close event manually may trigger before state update occurs\n * In those instances, use force\n */\n initTabCloseOverride() {\n const { glContainer } = this.props;\n glContainer.beforeClose((options?: CloseOptions) => {\n if (options?.force === true) {\n return true;\n }\n\n const { changeCount, savedChangeCount } = this.state;\n if (changeCount !== savedChangeCount) {\n this.setState({ showCloseModal: true });\n return false;\n }\n\n return true;\n });\n }\n\n initTabClasses(tab: Tab) {\n const tabElement = tab.element.get(0);\n assertNotNull(tabElement);\n const titleElement = tabElement.querySelector('.lm_title');\n this.tabTitleElement = titleElement;\n titleElement?.classList.add('notebook-title');\n this.setPreviewStatus();\n }\n\n getNotebookValue(): string | undefined {\n const { changeCount, savedChangeCount, settings } = this.state;\n const { value } = settings;\n if (changeCount !== savedChangeCount && this.notebook) {\n const notebookValue = this.notebook.getValue();\n return notebookValue != null ? notebookValue : value;\n }\n return value;\n }\n\n initNotebookContent(): void {\n // Init from file,\n // fallback to content from settings for unsaved notebook\n const { fileMetadata, settings, isPreview } = this.state;\n if (fileMetadata && fileMetadata.id) {\n log.debug('Init content from file');\n this.registerFileMetadata(fileMetadata, isPreview);\n this.load();\n return;\n }\n if (settings.value != null) {\n log.debug('Use content passed in the settings prop');\n this.handleLoadSuccess();\n return;\n }\n // No settings, no metadata\n this.handleLoadError(new Error('Missing file metadata'));\n }\n\n closeFileTabById(id: string): void {\n const { glEventHub } = this.props;\n glEventHub.emit(NotebookEvent.CLOSE_FILE, { id });\n }\n\n // Associate file id with the current tab\n // so the next time the file is opened this tab can be focused instead of opening a new tab\n registerFileMetadata(fileMetadata: FileMetadata, isPreview: boolean): void {\n const { glEventHub, metadata } = this.props;\n const { id: tabId } = metadata;\n glEventHub.emit(\n NotebookEvent.REGISTER_FILE,\n tabId,\n fileMetadata,\n isPreview\n );\n }\n\n renameTab(id: string, title: string): void {\n const { glEventHub } = this.props;\n glEventHub.emit(NotebookEvent.RENAME, id, title);\n }\n\n load() {\n const { fileMetadata, settings } = this.state;\n assertNotNull(fileMetadata);\n const { id } = fileMetadata;\n const { fileStorage } = this.props;\n this.pending\n .add(fileStorage.loadFile(id))\n .then(loadedFile => {\n log.debug('Loaded file', loadedFile);\n const { filename: itemName } = loadedFile;\n const { itemName: prevItemName } = this.state;\n if (itemName !== prevItemName) {\n const { metadata } = this.props;\n const { id: tabId } = metadata;\n this.renameTab(tabId, FileUtils.getBaseName(itemName));\n }\n const updatedSettings = {\n ...settings,\n language: NotebookPanel.languageFromFileName(itemName) ?? '',\n };\n if (settings.value == null) {\n updatedSettings.value = loadedFile.content;\n }\n if (settings.wordWrap === undefined) {\n settings.wordWrap = 'off';\n }\n this.setState({\n fileMetadata: { id: itemName, itemName },\n settings: updatedSettings,\n });\n this.debouncedSavePanelState();\n })\n .then(this.handleLoadSuccess)\n .catch(this.handleLoadError);\n }\n\n /**\n * Attempts to save the notebook.\n * @returns Returns true if save has begun, false if user needed to be prompted\n */\n save(): boolean {\n const { fileMetadata } = this.state;\n if (fileMetadata && FileUtils.hasPath(fileMetadata.itemName)) {\n const content = this.getNotebookValue();\n if (content !== undefined) {\n this.saveContent(fileMetadata.itemName, content);\n return true;\n }\n return false;\n }\n\n this.setState({ showSaveAsModal: true });\n return false;\n }\n\n /**\n * Update existing file content\n * @param filename The name of the file\n * @param content New file content\n */\n saveContent(filename: string, content: string): void {\n log.debug('saveContent', filename, content);\n this.updateSavedChangeCount();\n const { fileStorage } = this.props;\n this.pending\n .add(fileStorage.saveFile({ filename, content, basename: filename }))\n .then(this.handleSaveSuccess)\n .catch(this.handleSaveError);\n }\n\n updateSavedChangeCount() {\n this.setState(({ changeCount }) => ({ savedChangeCount: changeCount }));\n }\n\n setPreviewStatus() {\n if (!this.tabTitleElement) {\n return;\n }\n const { isPreview } = this.state;\n log.debug('setPreviewStatus', this.tabTitleElement, isPreview);\n if (isPreview) {\n this.tabTitleElement.classList.add('is-preview');\n } else {\n this.tabTitleElement.classList.remove('is-preview');\n }\n }\n\n handlePreviewPromotion() {\n this.removePreviewStatus();\n }\n\n getSettings = memoize(\n (\n initialSettings: editor.IStandaloneEditorConstructionOptions,\n isMinimapEnabled: boolean\n ): editor.IStandaloneEditorConstructionOptions => ({\n ...initialSettings,\n minimap: { enabled: isMinimapEnabled },\n })\n );\n\n getOverflowActions = memoize(\n (isMinimapEnabled: boolean, isWordWrapEnabled: boolean) => [\n {\n title: 'Find',\n icon: dhFileSearch,\n action: this.handleFind,\n group: ContextActions.groups.high,\n shortcut: SHORTCUTS.NOTEBOOK.FIND,\n order: 10,\n },\n {\n title: 'Show Minimap',\n icon: isMinimapEnabled ? vsCheck : undefined,\n action: this.handleMinimapChange,\n group: ContextActions.groups.medium,\n shortcut: SHORTCUTS.NOTEBOOK.MINIMAP,\n order: 20,\n },\n {\n title: 'Word Wrap',\n icon: isWordWrapEnabled ? vsCheck : undefined,\n action: this.handleWordWrapChange,\n group: ContextActions.groups.medium,\n shortcut: SHORTCUTS.NOTEBOOK.WORDWRAP,\n order: 30,\n },\n ]\n );\n\n savePanelState() {\n this.setState(state => {\n const {\n changeCount,\n savedChangeCount,\n fileMetadata,\n isPreview,\n settings: initialSettings,\n } = state;\n const value = this.getNotebookValue();\n // notebooks with no unsaved changes have value === null in dehydrated state\n // content will be loaded from file when hydrating\n const dehydratedValue =\n changeCount !== savedChangeCount ? value : undefined;\n const settings = {\n ...initialSettings,\n value,\n };\n const dehydratedSettings = {\n ...initialSettings,\n value: dehydratedValue,\n };\n const panelState = {\n settings: dehydratedSettings,\n fileMetadata,\n isPreview,\n };\n log.debug('Saving panel state', panelState);\n return {\n settings,\n // eslint-disable-next-line react/no-unused-state\n panelState,\n };\n });\n }\n\n handleCloseDiscard(): void {\n this.setState({ showCloseModal: false });\n const { glContainer } = this.props;\n glContainer.close({ force: true });\n }\n\n handleCloseSave(): void {\n this.setState({ showCloseModal: false });\n if (this.save()) {\n const { glContainer } = this.props;\n glContainer.close({ force: true });\n }\n }\n\n handleCloseCancel(): void {\n this.setState({ showCloseModal: false });\n }\n\n /**\n * Closes overwritten tabs\n * @param fileName The name of the file to be overwritten\n */\n handleOverwrite(fileName: string): void {\n const { glEventHub } = this.props;\n\n glEventHub.emit(\n NotebookEvent.CLOSE_FILE,\n {\n id: fileName,\n itemName: fileName,\n },\n { force: true }\n );\n\n this.focus();\n }\n\n handleCopy(): void {\n const { fileMetadata, settings } = this.state;\n assertNotNull(fileMetadata);\n const content = this.getNotebookValue();\n const { language } = settings;\n const { itemName } = fileMetadata;\n const copyName = FileUtils.getCopyFileName(itemName);\n log.debug('handleCopy', fileMetadata, itemName, copyName);\n this.createNotebook(copyName, language, content);\n }\n\n handleEditorInitialized(innerEditor: editor.IStandaloneCodeEditor): void {\n this.editor = innerEditor;\n }\n\n handleEditorWillDestroy(): void {\n this.editor = undefined;\n }\n\n handleEditorChange(e: editor.IModelContentChangedEvent): void {\n log.debug2('handleEditorChanged', e);\n\n this.removePreviewStatus();\n\n this.setState(state => {\n const { changeCount, savedChangeCount } = state;\n const { isUndoing, isRedoing } = e;\n if (isUndoing) {\n // Note that it's possible to undo past where the user last saved, if they save and then undo for example\n return { changeCount: changeCount - 1, savedChangeCount };\n }\n\n if (!isRedoing && changeCount < savedChangeCount) {\n // We made another change after undoing some changes from the previous save\n // Just reset the saved counter to zero and increase the unchanged saves\n // It'll be set correctly on the next save\n return { changeCount: changeCount + 1, savedChangeCount: 0 };\n }\n\n return { changeCount: changeCount + 1, savedChangeCount };\n });\n this.debouncedSavePanelState();\n }\n\n handleFind() {\n if (this.notebook) {\n this.notebook.toggleFind();\n }\n }\n\n updateEditorMinimap() {\n if (this.editor) {\n const { defaultNotebookSettings } = this.props;\n this.editor.updateOptions({\n minimap: { enabled: defaultNotebookSettings.isMinimapEnabled },\n });\n }\n }\n\n handleMinimapChange() {\n const { settings, defaultNotebookSettings, saveSettings } = this.props;\n const newSettings: WorkspaceSettings = {\n ...settings,\n defaultNotebookSettings: {\n isMinimapEnabled: !defaultNotebookSettings.isMinimapEnabled,\n },\n };\n saveSettings(newSettings);\n }\n\n updateEditorWordWrap() {\n if (this.editor) {\n const { settings } = this.state;\n const { wordWrap } = settings;\n this.editor.updateOptions({\n wordWrap,\n });\n }\n }\n\n handleWordWrapChange() {\n if (this.editor) {\n this.setState(prevState => {\n const { settings } = prevState;\n const wordWrap = settings.wordWrap === 'on' ? 'off' : 'on';\n return {\n settings: {\n ...settings,\n wordWrap,\n },\n };\n });\n }\n }\n\n handleBlur(): void {\n log.debug('handleBlur');\n this.setState({ isFocused: false });\n }\n\n handleFocus(): void {\n log.debug('handleFocus');\n this.setState({ isFocused: true });\n }\n\n /**\n * @param event The click event from clicking on the link\n */\n handleLinkClick(event: React.MouseEvent<HTMLAnchorElement>) {\n const { notebooksUrl, session, sessionLanguage } = this.props;\n const { href } = event.currentTarget;\n if (!href || !href.startsWith(notebooksUrl)) {\n return;\n }\n\n event.stopPropagation();\n event.preventDefault();\n\n const notebookPath = `/${href.substring(notebooksUrl.length)}`.replace(\n /%20/g,\n ' '\n );\n if (notebookPath === '/') {\n log.debug('Ignoring invalid notebook link', notebookPath);\n return;\n }\n\n log.debug('Notebook link clicked, opening', notebookPath);\n\n const { glEventHub } = this.props;\n const notebookSettings = {\n value: null,\n language: sessionLanguage,\n };\n const fileMetadata = { id: notebookPath, itemName: notebookPath };\n glEventHub.emit(\n NotebookEvent.SELECT_NOTEBOOK,\n session,\n sessionLanguage,\n notebookSettings,\n fileMetadata\n );\n }\n\n handleLoadSuccess() {\n this.setState({\n error: undefined,\n isLoaded: true,\n isLoading: false,\n });\n }\n\n handleLoadError(errorParam: { message?: string | undefined }) {\n let error = errorParam;\n if (PromiseUtils.isCanceled(error)) {\n return;\n }\n if (PromiseUtils.isTimedOut(error)) {\n error = new Error('File not found.');\n }\n log.error(error);\n this.setState({ error, isLoading: false });\n }\n\n handleSave() {\n log.debug('handleSave');\n this.save();\n }\n\n handleSaveSuccess(file: File) {\n const { fileStorage } = this.props;\n const fileMetadata = { id: file.filename, itemName: file.filename };\n const language = NotebookPanel.languageFromFileName(file.filename) ?? '';\n this.setState(state => {\n const { fileMetadata: oldMetadata } = state;\n const settings = {\n ...state.settings,\n language,\n };\n log.debug('handleSaveSuccess', fileMetadata, oldMetadata, settings);\n if (\n oldMetadata &&\n FileUtils.hasPath(oldMetadata.itemName) &&\n oldMetadata.itemName !== fileMetadata.itemName\n ) {\n log.debug('handleSaveSuccess deleting old file', oldMetadata.itemName);\n fileStorage\n .deleteFile(oldMetadata.itemName)\n .catch(NotebookPanel.handleError);\n }\n return {\n fileMetadata,\n settings,\n isPreview: false,\n };\n });\n this.debouncedSavePanelState();\n this.registerFileMetadata(fileMetadata, false);\n }\n\n handleSaveError(error: unknown) {\n if (PromiseUtils.isCanceled(error)) {\n return;\n }\n // There was an error saving, just reset the savedChangeCount\n // It's possible if they undo changes they'll be back at the spot where it was last saved successfully,\n // But we may as well continue showing the error until they actually save again\n this.setState({ savedChangeCount: 0 });\n log.error(error);\n }\n\n handleSaveAsCancel() {\n this.setState({ showSaveAsModal: false });\n }\n\n handleSaveAsSubmit(name: string, isOverwrite = false): void {\n if (isOverwrite) {\n this.handleOverwrite(name);\n }\n\n log.debug('handleSaveAsSubmit', name);\n const { fileMetadata } = this.state;\n if (!fileMetadata) {\n return;\n }\n const { itemName: prevItemName } = fileMetadata;\n const content = this.getNotebookValue() ?? '';\n this.setState({\n showSaveAsModal: false,\n });\n\n if (FileUtils.getBaseName(prevItemName) !== FileUtils.getBaseName(name)) {\n const { metadata } = this.props;\n const { id: tabId } = metadata;\n this.renameTab(tabId, FileUtils.getBaseName(name));\n }\n\n this.saveContent(name, content);\n }\n\n handleRenameFile(oldName: string, newName: string, panelState?: PanelState) {\n const { fileMetadata, panelState: curPanelState } = this.state;\n const { glContainer } = this.props;\n\n if (\n fileMetadata?.itemName === `/${newName}` &&\n panelState &&\n JSON.stringify(curPanelState) !== JSON.stringify(panelState)\n ) {\n glContainer.close();\n return;\n }\n\n if (fileMetadata && fileMetadata.id === oldName) {\n this.setState({ fileMetadata: { id: newName, itemName: newName } });\n this.debouncedSavePanelState();\n }\n }\n\n handleResize(): void {\n this.notebook?.updateDimensions();\n }\n\n handleRunCommand(command?: string): void {\n this.runCommand(command);\n }\n\n handleRunAll(): void {\n if (!this.notebook) {\n log.error('Editor is not initialized.');\n return;\n }\n this.runCommand(this.notebook.getValue() ?? undefined);\n }\n\n handleRunSelected(): void {\n if (!this.notebook) {\n log.error('Editor is not initialized.');\n return;\n }\n this.runCommand(this.notebook.getSelectedCommand());\n }\n\n handleSessionOpened(\n session: IdeSession,\n { language }: { language: string }\n ): void {\n this.setState({\n session,\n sessionLanguage: language,\n });\n }\n\n handleSessionClosed(): void {\n this.setState({\n session: undefined,\n sessionLanguage: undefined,\n });\n }\n\n handleShow(): void {\n log.debug('handleShow');\n this.notebook?.updateDimensions();\n }\n\n handlePanelDropped(droppedId: string): void {\n const {\n metadata: { id },\n } = this.props;\n // re-render necessary for portal after being dropped\n if (droppedId === id) this.forceUpdate();\n }\n\n handleShowRename(): void {\n this.setState({ showSaveAsModal: true });\n }\n\n handleTab(tab: Tab): void {\n log.debug('NotebookPanel tab event', tab);\n this.initTab(tab);\n }\n\n handleTabFocus(...args: unknown[]): void {\n log.debug('handleTabFocus', ...args);\n const { glContainer } = this.props;\n this.setState({\n isDashboardActive: true,\n });\n if (this.notebook && !glContainer.isHidden) {\n this.notebook.updateDimensions();\n }\n }\n\n handleTabBlur(): void {\n log.debug('handleTabBlur');\n this.setState({\n isDashboardActive: false,\n });\n }\n\n handleTabClick(e: MouseEvent): void {\n log.debug('handle NotebookPanel tab click');\n this.focus();\n if (e.detail === 2) {\n this.removePreviewStatus();\n }\n }\n\n /**\n * Transform the link URI to load from where the notebook is if it's relative\n * @param src The link to transform\n * @returns String the transformed link\n */\n handleTransformLinkUri(src: string): string {\n const { notebooksUrl } = this.props;\n const { fileMetadata } = this.state;\n\n if (src.endsWith('/')) {\n return src;\n }\n\n if (src.startsWith('/')) {\n return `${notebooksUrl}${src.substring(1)}`;\n }\n\n let itemName = fileMetadata?.itemName;\n if (itemName === undefined) {\n return src;\n }\n if (itemName.charAt(0) === '/') {\n itemName = itemName.substring(1);\n }\n\n const itemUri = new URL(itemName, notebooksUrl);\n return new URL(src, itemUri).href;\n }\n\n focus(): void {\n requestAnimationFrame(() => {\n if (this.notebook) {\n this.notebook.focus();\n }\n });\n }\n\n createNotebook(\n itemName: string,\n language: string | undefined,\n content = ''\n ): void {\n const { glEventHub } = this.props;\n const { session, sessionLanguage, settings } = this.state;\n const notebookSettings = {\n ...settings,\n language,\n value: content,\n };\n const fileMetadata = {\n id: null,\n itemName,\n };\n log.debug(\n 'handleCreateNotebook',\n session,\n sessionLanguage,\n notebookSettings,\n fileMetadata\n );\n glEventHub.emit(\n NotebookEvent.CREATE_NOTEBOOK,\n session,\n sessionLanguage,\n notebookSettings,\n fileMetadata\n );\n }\n\n runCommand(command?: string): void {\n if (command === undefined || command === '') {\n log.debug('Ignoring empty command.');\n return;\n }\n\n this.removePreviewStatus();\n\n const { glEventHub } = this.props;\n glEventHub.emit(ConsoleEvent.SEND_COMMAND, command, false, true);\n }\n\n removePreviewStatus(): void {\n this.setState(({ isPreview }) => {\n if (isPreview) {\n const { fileMetadata } = this.state;\n if (fileMetadata) {\n this.registerFileMetadata(fileMetadata, false);\n }\n return { isPreview: false };\n }\n return null;\n });\n }\n\n getDropdownOverflowActions(): DropdownAction[] {\n const { defaultNotebookSettings } = this.props;\n const { settings: initialSettings } = this.state;\n return this.getOverflowActions(\n defaultNotebookSettings.isMinimapEnabled,\n this.getSettings(\n initialSettings,\n defaultNotebookSettings.isMinimapEnabled\n ).wordWrap === 'on'\n );\n }\n\n render(): ReactElement {\n const {\n fileStorage,\n glContainer,\n glContainer: { tab },\n glEventHub,\n defaultNotebookSettings,\n } = this.props;\n const {\n changeCount,\n savedChangeCount,\n error,\n isDashboardActive,\n isLoaded,\n isLoading,\n isPreview,\n fileMetadata,\n session,\n sessionLanguage,\n settings: initialSettings,\n showCloseModal,\n showSaveAsModal,\n } = this.state;\n // We don't want to steal focus if this isn't shown or it's just a preview\n const focusOnMount =\n isDashboardActive && !glContainer.isHidden && !isPreview;\n const itemName = fileMetadata?.itemName ?? NotebookPanel.DEFAULT_NAME;\n const isMarkdown = itemName.endsWith('.md');\n const isExistingItem = fileMetadata?.id != null;\n const settings = this.getSettings(\n initialSettings,\n defaultNotebookSettings.isMinimapEnabled\n );\n const isSessionConnected = session != null;\n const isLanguageMatching = sessionLanguage === settings.language;\n const runButtonsDisabled =\n !isLoaded || !isSessionConnected || !isLanguageMatching;\n const toolbarDisabled = !isLoaded;\n const contextActions = [\n {\n action: this.handleSave,\n shortcut: GLOBAL_SHORTCUTS.SAVE,\n },\n {\n action: this.handleMinimapChange,\n shortcut: SHORTCUTS.NOTEBOOK.MINIMAP,\n },\n {\n action: this.handleWordWrapChange,\n shortcut: SHORTCUTS.NOTEBOOK.WORDWRAP,\n },\n ];\n const disabledRunButtonTooltip = ScriptEditorUtils.getDisabledRunTooltip(\n isSessionConnected,\n isLanguageMatching,\n 'Notebook extension',\n 'Run'\n );\n const disabledRunSelectedButtonTooltip = ScriptEditorUtils.getDisabledRunTooltip(\n isSessionConnected,\n isLanguageMatching,\n 'Notebook extension',\n 'Run Selected'\n );\n\n const additionalActions = [\n {\n title: isExistingItem ? 'Rename' : 'Save As…',\n order: 10,\n group: ContextActions.groups.high,\n action: this.handleShowRename,\n },\n {\n title: 'Copy File',\n action: this.handleCopy,\n group: ContextActions.groups.high,\n order: 20,\n },\n ];\n\n const portal = tab?.element.find('.lm_title_before').get(0);\n\n return (\n <>\n {portal &&\n ReactDOM.createPortal(\n <span\n className={classNames('editor-unsaved-indicator', {\n 'is-unsaved': changeCount !== savedChangeCount,\n })}\n />,\n portal // tab.element is jquery element, we want a dom element\n )}\n\n <Panel\n className=\"notebook-container\"\n componentPanel={this}\n glContainer={glContainer}\n glEventHub={glEventHub}\n onTab={this.handleTab}\n onResize={this.handleResize}\n onShow={this.handleShow}\n onTabClicked={this.handleTabClick}\n onTabFocus={this.handleTabFocus}\n onTabBlur={this.handleTabBlur}\n onSessionOpen={this.handleSessionOpened}\n onSessionClose={this.handleSessionClosed}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n additionalActions={additionalActions}\n renderTabTooltip={() => itemName}\n >\n {!isMarkdown && (\n <>\n <div className=\"notebook-toolbar\">\n <span>\n <Button\n kind=\"ghost\"\n className=\"btn-play\"\n onClick={this.handleRunAll}\n disabled={runButtonsDisabled}\n icon={<FontAwesomeIcon icon={vsPlay} transform=\"grow-4\" />}\n tooltip={`Run ${SHORTCUTS.NOTEBOOK.RUN.getDisplayText()}`}\n aria-label=\"Run\"\n />\n {disabledRunButtonTooltip != null && (\n <Tooltip>{disabledRunButtonTooltip}</Tooltip>\n )}\n </span>\n <span>\n <Button\n kind=\"ghost\"\n className=\"btn-play\"\n onClick={this.handleRunSelected}\n disabled={runButtonsDisabled}\n icon={\n <FontAwesomeIcon\n icon={dhRunSelection}\n transform=\"grow-4\"\n />\n }\n tooltip={`Run Selected ${SHORTCUTS.NOTEBOOK.RUN_SELECTED.getDisplayText()}`}\n aria-label=\"Run Selected\"\n />\n {disabledRunSelectedButtonTooltip != null && (\n <Tooltip>{disabledRunSelectedButtonTooltip}</Tooltip>\n )}\n </span>\n <Button\n kind=\"ghost\"\n className=\"mr-auto\"\n disabled={toolbarDisabled}\n onClick={this.handleSave}\n icon={vsSave}\n tooltip={`Save ${GLOBAL_SHORTCUTS.SAVE.getDisplayText()}`}\n aria-label=\"Save\"\n />\n <Button\n kind=\"ghost\"\n className=\"btn-overflow btn-link-icon\"\n disabled={toolbarDisabled}\n icon={vsKebabVertical}\n tooltip=\"More Actions...\"\n onClick={() => {\n // no-op: click is handled in `DropdownMenu`\n }}\n >\n <DropdownMenu\n actions={this.getDropdownOverflowActions}\n popperOptions={NotebookPanel.POPPER_OPTIONS}\n />\n </Button>\n </div>\n <ScriptEditor\n isLoaded={isLoaded}\n isLoading={isLoading}\n error={error}\n onChange={this.handleEditorChange}\n onRunCommand={this.handleRunCommand}\n session={session}\n sessionLanguage={sessionLanguage}\n onEditorInitialized={this.handleEditorInitialized}\n onEditorWillDestroy={this.handleEditorWillDestroy}\n settings={settings}\n focusOnMount={focusOnMount}\n ref={notebook => {\n this.notebook = notebook;\n }}\n />\n </>\n )}\n {isMarkdown && (\n <MarkdownNotebook\n content={settings.value ?? ''}\n onLinkClick={this.handleLinkClick}\n onRunCode={this.handleRunCommand}\n transformImageUri={this.handleTransformLinkUri}\n transformLinkUri={this.handleTransformLinkUri}\n />\n )}\n <NewItemModal\n isOpen={showSaveAsModal}\n type=\"file\"\n defaultValue={itemName}\n title={isExistingItem ? 'Rename' : 'Save file as'}\n onSubmit={this.handleSaveAsSubmit}\n onCancel={this.handleSaveAsCancel}\n notifyOnExtensionChange\n storage={fileStorage}\n />\n <BasicModal\n isOpen={showCloseModal}\n headerText={`Do you want to save the changes you made to ${itemName}?`}\n bodyText=\"Your changes will be lost if you don't save them.\"\n onCancel={this.handleCloseCancel}\n onDiscard={this.handleCloseDiscard}\n onConfirm={this.handleCloseSave}\n discardButtonText=\"Discard Changes\"\n confirmButtonText=\"Save\"\n />\n <ContextActions actions={contextActions} />\n </Panel>\n </>\n );\n }\n}\n\nconst mapStateToProps = (\n state: RootState,\n ownProps: { localDashboardId: string }\n) => {\n const fileStorage = getFileStorage(state);\n const settings = getSettings(state);\n const defaultNotebookSettings = getDefaultNotebookSettings(state);\n const sessionWrapper = getDashboardSessionWrapper(\n state,\n ownProps.localDashboardId\n );\n\n const { session, config: sessionConfig } = sessionWrapper ?? {};\n const { type: sessionLanguage } = sessionConfig ?? {};\n return {\n fileStorage,\n settings,\n defaultNotebookSettings,\n session,\n sessionLanguage,\n };\n};\n\nconst ConnectedNotebookPanel = connect(\n mapStateToProps,\n { saveSettings: saveSettingsAction },\n null,\n { forwardRef: true }\n)(NotebookPanel);\n\nexport default ConnectedNotebookPanel;\n"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /* stylelint-disable scss/at-import-no-partial-leading-underscore */
2
+ .btn-pandas {
3
+ width: 100%;
4
+ display: flex;
5
+ flex-direction: row;
6
+ flex-wrap: wrap;
7
+ justify-content: space-between;
8
+ align-content: center;
9
+ padding: 0.25rem 0.5rem;
10
+ background-color: #343e5d;
11
+ border: none;
12
+ border-radius: 0;
13
+ }
14
+
15
+ /*# sourceMappingURL=PandasPanel.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sourceRoot":"","sources":["../../../../node_modules/@deephaven/components/scss/custom.scss","../../src/panels/PandasPanel.scss","../../../../node_modules/@deephaven/components/scss/bootstrap_overrides.scss"],"names":[],"mappings":"AAAA;ACEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA,kBC8Ca;ED7Cb;EACA","file":"PandasPanel.css","sourcesContent":["/* stylelint-disable scss/at-import-no-partial-leading-underscore */\n// Consumers should be able to resolve bootstrap/ to node_modules/bootstrap\n\n//Make bootstrap functions available for use in overrides\n@import 'bootstrap/scss/_functions.scss';\n@import './bootstrap_overrides.scss';\n\n//_variable imports come after bootstrap default overrides,\n// makes all other variables and mixins from bootstrap available\n/// with just importing customer.scss\n@import 'bootstrap/scss/_variables.scss';\n@import 'bootstrap/scss/_mixins.scss';\n\n//New variables come after imports\n@import './new_variables.scss';\n","@import '@deephaven/components/scss/custom.scss';\n\n.btn-pandas {\n width: 100%;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: space-between;\n align-content: center;\n padding: $spacer-1 $spacer-2;\n background-color: $primary-dark;\n border: none;\n border-radius: 0;\n}\n","// Styling overrides for bootstrap\n\n// Override / set color variables\n$red: #f95d84;\n$orange: #f37e3f;\n$yellow: #fcd65b;\n$green: #9edc6f;\n$blue: #76d9e4;\n$purple: #aa9af4;\n\n//Define some UI colors\n$interfacegray: #2d2a2e;\n$interfaceblue: #4878ea;\n$interfacewhite: #f0f0ee; //same as gray-200\n$interfaceblack: #1a171a;\n\n//Define our Gray scale\n$white: $interfacewhite;\n$gray-100: #fcfcfa;\n$gray-200: $interfacewhite;\n$gray-300: #c0bfbf;\n$gray-400: #929192;\n$gray-500: #5b5a5c;\n$gray-600: #555356;\n$gray-700: #403e41;\n$gray-800: #373438;\n$gray-850: #322f33;\n$gray-900: #211f22;\n$black: $interfaceblack;\n$content-bg: $interfacegray;\n$background: $interfaceblack;\n$foreground: $interfacewhite;\n\n//Load colors into map\n$colors: ();\n$colors: map-merge(\n (\n 'red': $red,\n 'orange': $orange,\n 'yellow': $yellow,\n 'green': $green,\n 'blue': $blue,\n 'purple': $purple,\n 'white': $white,\n 'black': $black,\n ),\n $colors\n);\n\n//Set default colors\n$body-bg: $black;\n$body-color: $interfacewhite;\n\n// Set brand colors\n$primary: $interfaceblue;\n$primary-hover: darken($primary, 8%);\n$primary-dark: mix($primary, $content-bg, 25%);\n$primary-light: scale-color($primary, $lightness: -25%);\n$secondary: $gray-500;\n$secondary-hover: darken($secondary, 8%);\n$success: $green;\n$info: $yellow;\n$warning: $orange;\n$danger: $red;\n$danger-hover: darken($danger, 8%);\n$light: $gray-100;\n$mid: $gray-400; //Added a mid color, useful for input styling\n$dark: $gray-800;\n$green-dark: scale-color($green, $lightness: -45%, $saturation: -10%);\n\n$theme-colors: () !default;\n$theme-colors: map-merge(\n (\n 'primary': $primary,\n 'primary-hover': $primary-hover,\n 'primary-light': $primary-light,\n 'primary-dark': $primary-dark,\n 'secondary': $secondary,\n 'success': $success,\n 'info': $info,\n 'warning': $warning,\n 'danger': $danger,\n 'light': $light,\n 'dark': $dark,\n 'mid': $mid,\n 'content-bg': $interfacegray,\n 'background': $interfaceblack,\n 'foreground': $interfacewhite,\n ),\n $theme-colors\n);\n\n$component-active-bg: $primary;\n$theme-color-interval: 9%;\n$yiq-contrasted-threshold: 180;\n\n// Override fonts\n$font-family-sans-serif: 'Fira Sans', -apple-system, blinkmacsystemfont,\n 'Segoe UI', 'Roboto', 'Helvetica Neue', arial, sans-serif; //fira sans then native system ui fallbacks\n$font-family-monospace: 'Fira Mono', menlo, monaco, consolas, 'Liberation Mono',\n 'Courier New', monospace;\n$font-family-base: $font-family-sans-serif;\n\n$headings-font-weight: 400;\n\n//Text overides\n$text-muted: $gray-400;\n\n//Style Selection highlight color\n//so browsers add alpha to your color by default, ignoring opacity 1\n//by setting rgba with 0.99 it tricks browser into thinking there is alpha applied\n$text-select-color: $primary-hover;\n$text-select-color-editor: lighten(\n $gray-700,\n 15%\n); //we lighten it abit to account for that 0.01 loss, and because it needs some anyways.\n\n//Grid variables, same value as default just making easily accessible\n$grid-gutter-width: 30px;\n\n//Visual Overrides\n$border-radius: 4px;\n$box-shadow: 0 0.1rem 1rem rgba($black, 45%); //because our UI is so dark, we need darker default shadows\n$box-shadow-900: 0 0.1rem 1rem rgba(0, 0, 0, 45%); //darkest shadow for $black popups over $black UI\n\n//Override Btn\n$btn-border-radius: 4rem;\n$btn-padding-x: 1.5rem;\n$btn-transition: color 0.12s ease-in-out, background-color 0.12s ease-in-out,\n border-color 0.12s ease-in-out, box-shadow 0.12s ease-in-out; //default 0.15 is too long\n$btn-border-width: 2px;\n\n//Override Inputs\n$input-bg: $gray-600;\n$input-disabled-bg: $gray-800;\n$input-color: $foreground;\n$input-border-color: $gray-400;\n$input-placeholder-color: $gray-400;\n$input-focus-border-color: rgba($primary, 85%);\n\n$input-btn-focus-width: 0.2rem;\n$input-btn-focus-color: rgba($component-active-bg, 35%);\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color;\n\n//checkbox\n$custom-control-indicator-bg: $gray-600;\n$custom-control-indicator-bg-size: 75% 75%;\n$custom-control-indicator-disabled-bg: $gray-800;\n$custom-control-indicator-checked-disabled-bg: $gray-800;\n$custom-control-label-disabled-color: $gray-400;\n\n//Custom Select\n$custom-select-indicator-color: $gray-400;\n$custom-select-bg-size: 16px 16px;\n//dhSort icon encoded\n$custom-select-indicator: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M4 7l-.4-.8 4-3.7h.8l4 3.7-.4.8H4zm0 2l-.4.8 4 3.7h.8l4-3.7L12 9H4z'/%3E%3C/svg%3E\"),\n '#',\n '%23'\n);\n$custom-select-focus-box-shadow: $input-btn-focus-box-shadow;\n$custom-select-disabled-color: darken($gray-400, 5%);\n$custom-select-disabled-bg: $gray-800;\n\n//modal\n$modal-content-bg: $gray-200;\n$modal-content-border-width: 0;\n$modal-md: 550px;\n\n// Toast notification\n$toast-bg: $primary-dark;\n$toast-color: $foreground;\n$toast-error-bg: mix($danger, $content-bg, 15%);\n$toast-error-color: $foreground;\n\n//tooltips\n$tooltip-bg: $gray-700;\n$tooltip-color: $foreground;\n$tooltip-box-shadow: 0 0.1rem 1.5rem 0.1rem rgba($black, 80%);\n\n//drowdowns\n$dropdown-bg: $gray-600;\n$dropdown-link-color: $foreground;\n$dropdown-link-hover-color: $foreground;\n$dropdown-link-hover-bg: $primary;\n$dropdown-divider-bg: $gray-700;\n\n//context menus\n$contextmenu-bg: $gray-600;\n$contextmenu-color: $foreground;\n$contextmenu-disabled-color: $text-muted;\n$contextmenu-keyboard-selected-bg: rgba($primary, 50%);\n$contextmenu-selected-bg: $primary;\n$contextmenu-selected-color: $foreground;\n\n//links\n$link-color: $gray-400;\n$link-hover-color: $foreground;\n\n//progress-bar\n$progress-bg: $gray-600;\n$progress-border-radius: 1rem;\n\n// Set global options\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-print-styles: false; //I don't think anyone should expect to \"print\" this app.\n\n// Transition times\n$transition: 0.15s;\n$transition-mid: 0.2s;\n$transition-long: 0.3s;\n$transition-slow: 0.6s;\n\n//form-validation icon, uses vsWarning icon encoded here as svg\n$form-feedback-icon-invalid-color: theme-color('danger');\n$form-feedback-icon-invalid: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cg fill='none'%3E%3Cg fill='#{$form-feedback-icon-invalid-color}'%3E%3Cpath d='M7.56 1h.88l6.54 12.26-.44.74H1.44L1 13.26 7.56 1zM8 2.28 2.28 13H13.7L8 2.28zM8.625 12v-1h-1.25v1h1.25zm-1.25-2V6h1.25v4h-1.25z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E \"),\n '#',\n '%23'\n);\n"]}
@@ -0,0 +1,86 @@
1
+ function _objectDestructuringEmpty(obj) { if (obj == null) throw new TypeError("Cannot destructure " + obj); }
2
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : 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); }
3
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
4
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
5
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
6
+ /* eslint-disable react/jsx-props-no-spreading */
7
+ /* eslint-disable react/no-unused-state */
8
+ import React, { Component } from 'react';
9
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
10
+ import { dhRefresh } from '@deephaven/icons';
11
+ import { Button } from '@deephaven/components';
12
+ import ConnectedIrisGridPanel from "./IrisGridPanel.js";
13
+ import "./PandasPanel.css";
14
+ /**
15
+ * Wraps and IrisGridPanel to add a refresh button for Pandas.
16
+ */
17
+ class PandasPanel extends Component {
18
+ constructor(props) {
19
+ super(props);
20
+ _defineProperty(this, "buttonRef", void 0);
21
+ _defineProperty(this, "irisGridRef", void 0);
22
+ this.irisGridRef = /*#__PURE__*/React.createRef();
23
+ this.buttonRef = /*#__PURE__*/React.createRef();
24
+ this.handleReload = this.handleReload.bind(this);
25
+ this.handleGridStateChange = this.handleGridStateChange.bind(this);
26
+ this.handlePanelStateUpdate = this.handlePanelStateUpdate.bind(this);
27
+ var {
28
+ panelState
29
+ } = props;
30
+ this.state = {
31
+ shouldFocusGrid: false,
32
+ panelState // Dehydrated panel state that can load this panel
33
+ };
34
+ }
35
+
36
+ handleReload() {
37
+ var _this$irisGridRef$cur, _this$buttonRef$curre;
38
+ (_this$irisGridRef$cur = this.irisGridRef.current) === null || _this$irisGridRef$cur === void 0 ? void 0 : _this$irisGridRef$cur.initModel();
39
+ (_this$buttonRef$curre = this.buttonRef.current) === null || _this$buttonRef$curre === void 0 ? void 0 : _this$buttonRef$curre.blur();
40
+ this.setState({
41
+ shouldFocusGrid: true
42
+ });
43
+ }
44
+ handleGridStateChange() {
45
+ var _this$irisGridRef$cur2, _this$irisGridRef$cur3, _this$irisGridRef$cur4;
46
+ var {
47
+ shouldFocusGrid
48
+ } = this.state;
49
+ if (shouldFocusGrid && (_this$irisGridRef$cur2 = this.irisGridRef.current) !== null && _this$irisGridRef$cur2 !== void 0 && (_this$irisGridRef$cur3 = _this$irisGridRef$cur2.irisGrid) !== null && _this$irisGridRef$cur3 !== void 0 && (_this$irisGridRef$cur4 = _this$irisGridRef$cur3.current) !== null && _this$irisGridRef$cur4 !== void 0 && _this$irisGridRef$cur4.grid) {
50
+ this.irisGridRef.current.irisGrid.current.grid.focus();
51
+ this.setState({
52
+ shouldFocusGrid: false
53
+ });
54
+ }
55
+ }
56
+ handlePanelStateUpdate(panelState) {
57
+ this.setState({
58
+ panelState
59
+ });
60
+ }
61
+ render() {
62
+ var _this$props = this.props,
63
+ props = _extends({}, (_objectDestructuringEmpty(_this$props), _this$props));
64
+ return /*#__PURE__*/React.createElement(ConnectedIrisGridPanel, _extends({
65
+ ref: this.irisGridRef,
66
+ onStateChange: this.handleGridStateChange,
67
+ onPanelStateUpdate: this.handlePanelStateUpdate
68
+ }, props), /*#__PURE__*/React.createElement(Button, {
69
+ ref: this.buttonRef,
70
+ kind: "primary",
71
+ className: "btn-pandas",
72
+ onClick: this.handleReload,
73
+ tooltip: "Click to refresh pandas dataframe, updates do not occur automatically."
74
+ }, "pandas dataframe", /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
75
+ icon: dhRefresh,
76
+ transform: "shrink-1",
77
+ className: "mr-1"
78
+ }), "Reload")));
79
+ }
80
+ }
81
+ _defineProperty(PandasPanel, "defaultProps", {
82
+ panelState: null
83
+ });
84
+ _defineProperty(PandasPanel, "COMPONENT", 'PandasPanel');
85
+ export default PandasPanel;
86
+ //# sourceMappingURL=PandasPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PandasPanel.js","names":["React","Component","FontAwesomeIcon","dhRefresh","Button","ConnectedIrisGridPanel","PandasPanel","constructor","props","irisGridRef","createRef","buttonRef","handleReload","bind","handleGridStateChange","handlePanelStateUpdate","panelState","state","shouldFocusGrid","current","initModel","blur","setState","irisGrid","grid","focus","render"],"sources":["../../src/panels/PandasPanel.tsx"],"sourcesContent":["/* eslint-disable react/jsx-props-no-spreading */\n/* eslint-disable react/no-unused-state */\nimport React, { Component, ReactElement, RefObject } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { dhRefresh } from '@deephaven/icons';\nimport { Button } from '@deephaven/components';\nimport ConnectedIrisGridPanel, {\n IrisGridPanel,\n IrisGridPanelProps,\n PanelState,\n} from './IrisGridPanel';\nimport './PandasPanel.scss';\n\nexport interface PandasPanelProps extends IrisGridPanelProps {\n panelState: PanelState | null;\n}\n\ninterface PandasPanelState {\n shouldFocusGrid: boolean;\n panelState: PanelState | null;\n}\n\n/**\n * Wraps and IrisGridPanel to add a refresh button for Pandas.\n */\nclass PandasPanel extends Component<PandasPanelProps, PandasPanelState> {\n static defaultProps = {\n panelState: null,\n };\n\n static COMPONENT = 'PandasPanel';\n\n constructor(props: PandasPanelProps) {\n super(props);\n\n this.irisGridRef = React.createRef();\n this.buttonRef = React.createRef();\n\n this.handleReload = this.handleReload.bind(this);\n this.handleGridStateChange = this.handleGridStateChange.bind(this);\n this.handlePanelStateUpdate = this.handlePanelStateUpdate.bind(this);\n\n const { panelState } = props;\n this.state = {\n shouldFocusGrid: false,\n panelState, // Dehydrated panel state that can load this panel\n };\n }\n\n buttonRef: RefObject<HTMLButtonElement>;\n\n irisGridRef: RefObject<IrisGridPanel>;\n\n handleReload(): void {\n this.irisGridRef.current?.initModel();\n this.buttonRef.current?.blur();\n this.setState({\n shouldFocusGrid: true,\n });\n }\n\n handleGridStateChange(): void {\n const { shouldFocusGrid } = this.state;\n if (shouldFocusGrid && this.irisGridRef.current?.irisGrid?.current?.grid) {\n this.irisGridRef.current.irisGrid.current.grid.focus();\n this.setState({\n shouldFocusGrid: false,\n });\n }\n }\n\n handlePanelStateUpdate(panelState: PanelState): void {\n this.setState({\n panelState,\n });\n }\n\n render(): ReactElement {\n const { ...props } = this.props;\n\n return (\n <ConnectedIrisGridPanel\n ref={this.irisGridRef}\n onStateChange={this.handleGridStateChange}\n onPanelStateUpdate={this.handlePanelStateUpdate}\n {...props}\n >\n <Button\n ref={this.buttonRef}\n kind=\"primary\"\n className=\"btn-pandas\"\n onClick={this.handleReload}\n tooltip=\"Click to refresh pandas dataframe, updates do not occur automatically.\"\n >\n pandas dataframe\n <span>\n <FontAwesomeIcon\n icon={dhRefresh}\n transform=\"shrink-1\"\n className=\"mr-1\"\n />\n Reload\n </span>\n </Button>\n </ConnectedIrisGridPanel>\n );\n }\n}\n\nexport default PandasPanel;\n"],"mappings":";;;;;AAAA;AACA;AACA,OAAOA,KAAK,IAAIC,SAAS,QAAiC,OAAO;AACjE,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,SAAS,QAAQ,kBAAkB;AAC5C,SAASC,MAAM,QAAQ,uBAAuB;AAAC,OACxCC,sBAAsB;AAAA;AAgB7B;AACA;AACA;AACA,MAAMC,WAAW,SAASL,SAAS,CAAqC;EAOtEM,WAAW,CAACC,KAAuB,EAAE;IACnC,KAAK,CAACA,KAAK,CAAC;IAAC;IAAA;IAEb,IAAI,CAACC,WAAW,gBAAGT,KAAK,CAACU,SAAS,EAAE;IACpC,IAAI,CAACC,SAAS,gBAAGX,KAAK,CAACU,SAAS,EAAE;IAElC,IAAI,CAACE,YAAY,GAAG,IAAI,CAACA,YAAY,CAACC,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAACC,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAACD,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAACE,sBAAsB,GAAG,IAAI,CAACA,sBAAsB,CAACF,IAAI,CAAC,IAAI,CAAC;IAEpE,IAAM;MAAEG;IAAW,CAAC,GAAGR,KAAK;IAC5B,IAAI,CAACS,KAAK,GAAG;MACXC,eAAe,EAAE,KAAK;MACtBF,UAAU,CAAE;IACd,CAAC;EACH;;EAMAJ,YAAY,GAAS;IAAA;IACnB,6BAAI,CAACH,WAAW,CAACU,OAAO,0DAAxB,sBAA0BC,SAAS,EAAE;IACrC,6BAAI,CAACT,SAAS,CAACQ,OAAO,0DAAtB,sBAAwBE,IAAI,EAAE;IAC9B,IAAI,CAACC,QAAQ,CAAC;MACZJ,eAAe,EAAE;IACnB,CAAC,CAAC;EACJ;EAEAJ,qBAAqB,GAAS;IAAA;IAC5B,IAAM;MAAEI;IAAgB,CAAC,GAAG,IAAI,CAACD,KAAK;IACtC,IAAIC,eAAe,8BAAI,IAAI,CAACT,WAAW,CAACU,OAAO,6EAAxB,uBAA0BI,QAAQ,6EAAlC,uBAAoCJ,OAAO,mDAA3C,uBAA6CK,IAAI,EAAE;MACxE,IAAI,CAACf,WAAW,CAACU,OAAO,CAACI,QAAQ,CAACJ,OAAO,CAACK,IAAI,CAACC,KAAK,EAAE;MACtD,IAAI,CAACH,QAAQ,CAAC;QACZJ,eAAe,EAAE;MACnB,CAAC,CAAC;IACJ;EACF;EAEAH,sBAAsB,CAACC,UAAsB,EAAQ;IACnD,IAAI,CAACM,QAAQ,CAAC;MACZN;IACF,CAAC,CAAC;EACJ;EAEAU,MAAM,GAAiB;IACrB,kBAAqB,IAAI,CAAClB,KAAK;MAApBA,KAAK;IAEhB,oBACE,oBAAC,sBAAsB;MACrB,GAAG,EAAE,IAAI,CAACC,WAAY;MACtB,aAAa,EAAE,IAAI,CAACK,qBAAsB;MAC1C,kBAAkB,EAAE,IAAI,CAACC;IAAuB,GAC5CP,KAAK,gBAET,oBAAC,MAAM;MACL,GAAG,EAAE,IAAI,CAACG,SAAU;MACpB,IAAI,EAAC,SAAS;MACd,SAAS,EAAC,YAAY;MACtB,OAAO,EAAE,IAAI,CAACC,YAAa;MAC3B,OAAO,EAAC;IAAwE,GACjF,kBAEC,8DACE,oBAAC,eAAe;MACd,IAAI,EAAET,SAAU;MAChB,SAAS,EAAC,UAAU;MACpB,SAAS,EAAC;IAAM,EAChB,UAEJ,CAAO,CACA,CACc;EAE7B;AACF;AAAC,gBAlFKG,WAAW,kBACO;EACpBU,UAAU,EAAE;AACd,CAAC;AAAA,gBAHGV,WAAW,eAKI,aAAa;AA+ElC,eAAeA,WAAW"}
@@ -0,0 +1,314 @@
1
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
3
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
4
+ import React, { PureComponent } from 'react';
5
+ import ReactDOM from 'react-dom';
6
+ import classNames from 'classnames';
7
+ import memoize from 'memoize-one';
8
+ import { ContextActions, LoadingOverlay, Tooltip } from '@deephaven/components';
9
+ import { LayoutUtils, PanelEvent } from '@deephaven/dashboard';
10
+ import { assertNotNull } from '@deephaven/utils';
11
+ import Log from '@deephaven/log';
12
+ import { ConsoleEvent, InputFilterEvent, TabEvent } from "../events/index.js";
13
+ import PanelContextMenu from "./PanelContextMenu.js";
14
+ import RenameDialog from "./RenameDialog.js";
15
+ var log = Log.module('Panel');
16
+ /**
17
+ * Generic panel component that emits mount/unmount/focus events.
18
+ * Also wires up some triggers for common events:
19
+ * Focus, Resize, Show, Session open/close, client disconnect/reconnect.
20
+ */
21
+ class Panel extends PureComponent {
22
+ constructor(props) {
23
+ super(props);
24
+ _defineProperty(this, "getAdditionActions", memoize((actions, isClonable, isRenamable) => {
25
+ var additionalActions = [];
26
+ if (isClonable) {
27
+ additionalActions.push(this.getCloneAction());
28
+ }
29
+ if (isRenamable) {
30
+ additionalActions.push(this.getRenameAction());
31
+ }
32
+ return [...additionalActions, ...actions];
33
+ }));
34
+ this.handleClearAllFilters = this.handleClearAllFilters.bind(this);
35
+ this.handleCopyPanel = this.handleCopyPanel.bind(this);
36
+ this.handleFocus = this.handleFocus.bind(this);
37
+ this.handleBlur = this.handleBlur.bind(this);
38
+ this.handleHide = this.handleHide.bind(this);
39
+ this.handleResize = this.handleResize.bind(this);
40
+ this.handleSessionClosed = this.handleSessionClosed.bind(this);
41
+ this.handleSessionOpened = this.handleSessionOpened.bind(this);
42
+ this.handleBeforeShow = this.handleBeforeShow.bind(this);
43
+ this.handleShow = this.handleShow.bind(this);
44
+ this.handleTabBlur = this.handleTabBlur.bind(this);
45
+ this.handleTabFocus = this.handleTabFocus.bind(this);
46
+ this.handleRenameCancel = this.handleRenameCancel.bind(this);
47
+ this.handleRenameSubmit = this.handleRenameSubmit.bind(this);
48
+ this.handleShowRenameDialog = this.handleShowRenameDialog.bind(this);
49
+ this.handleTabClicked = this.handleTabClicked.bind(this);
50
+ this.handleTab = this.handleTab.bind(this);
51
+ var {
52
+ glContainer
53
+ } = this.props;
54
+ this.state = {
55
+ title: LayoutUtils.getTitleFromContainer(glContainer),
56
+ showRenameDialog: false
57
+ };
58
+ }
59
+ componentDidMount() {
60
+ var {
61
+ componentPanel,
62
+ glContainer,
63
+ glEventHub
64
+ } = this.props;
65
+ glContainer.on('resize', this.handleResize);
66
+ glContainer.on('show', this.handleBeforeShow);
67
+ glContainer.on('shown', this.handleShow);
68
+ glContainer.on('hide', this.handleHide);
69
+ glContainer.on('tab', this.handleTab);
70
+ glContainer.on('tabClicked', this.handleTabClicked);
71
+ glEventHub.on(ConsoleEvent.SESSION_CLOSED, this.handleSessionClosed);
72
+ glEventHub.on(ConsoleEvent.SESSION_OPENED, this.handleSessionOpened);
73
+ glEventHub.on(TabEvent.focus, this.handleTabFocus);
74
+ glEventHub.on(TabEvent.blur, this.handleTabBlur);
75
+ glEventHub.on(InputFilterEvent.CLEAR_ALL_FILTERS, this.handleClearAllFilters);
76
+ glEventHub.emit(PanelEvent.MOUNT, componentPanel);
77
+ }
78
+ componentWillUnmount() {
79
+ var {
80
+ componentPanel,
81
+ glContainer,
82
+ glEventHub
83
+ } = this.props;
84
+ glContainer.off('resize', this.handleResize);
85
+ glContainer.off('show', this.handleBeforeShow);
86
+ glContainer.off('shown', this.handleShow);
87
+ glContainer.off('hide', this.handleHide);
88
+ glContainer.off('tab', this.handleTab);
89
+ glContainer.off('tabClicked', this.handleTabClicked);
90
+ glEventHub.off(ConsoleEvent.SESSION_CLOSED, this.handleSessionClosed);
91
+ glEventHub.off(ConsoleEvent.SESSION_OPENED, this.handleSessionOpened);
92
+ glEventHub.off(TabEvent.focus, this.handleTabFocus);
93
+ glEventHub.off(TabEvent.blur, this.handleTabBlur);
94
+ glEventHub.off(InputFilterEvent.CLEAR_ALL_FILTERS, this.handleClearAllFilters);
95
+ glEventHub.emit(PanelEvent.UNMOUNT, componentPanel);
96
+ }
97
+ handleTab(tab) {
98
+ if (tab != null) {
99
+ this.setState({
100
+ title: LayoutUtils.getTitleFromTab(tab)
101
+ });
102
+ }
103
+ // render after move can happen before tab event, glTab could be null
104
+ // when tab event is emitted, force a render update
105
+ this.forceUpdate();
106
+ var {
107
+ onTab
108
+ } = this.props;
109
+ onTab(tab);
110
+ }
111
+ handleTabClicked(e) {
112
+ var {
113
+ onTabClicked
114
+ } = this.props;
115
+ onTabClicked(e);
116
+ }
117
+ handleClearAllFilters() {
118
+ var {
119
+ onClearAllFilters
120
+ } = this.props;
121
+ onClearAllFilters(...arguments);
122
+ }
123
+ handleFocus(event) {
124
+ var {
125
+ componentPanel,
126
+ glEventHub
127
+ } = this.props;
128
+ glEventHub.emit(PanelEvent.FOCUS, componentPanel);
129
+ var {
130
+ onFocus
131
+ } = this.props;
132
+ onFocus(event);
133
+ }
134
+ handleBlur(event) {
135
+ var {
136
+ onBlur
137
+ } = this.props;
138
+ onBlur(event);
139
+ }
140
+ handleHide() {
141
+ var {
142
+ onHide
143
+ } = this.props;
144
+ onHide(...arguments);
145
+ }
146
+ handleResize() {
147
+ var {
148
+ onResize
149
+ } = this.props;
150
+ onResize(...arguments);
151
+ }
152
+ handleSessionClosed(session) {
153
+ var {
154
+ onSessionClose
155
+ } = this.props;
156
+ onSessionClose(session);
157
+ }
158
+ handleSessionOpened(session, params) {
159
+ var {
160
+ onSessionOpen
161
+ } = this.props;
162
+ onSessionOpen(session, params);
163
+ }
164
+ handleBeforeShow() {
165
+ var {
166
+ onBeforeShow
167
+ } = this.props;
168
+ onBeforeShow(...arguments);
169
+ }
170
+ handleShow() {
171
+ var {
172
+ onShow
173
+ } = this.props;
174
+ onShow(...arguments);
175
+ }
176
+ handleTabBlur() {
177
+ var {
178
+ onTabBlur
179
+ } = this.props;
180
+ onTabBlur(...arguments);
181
+ }
182
+ handleTabFocus() {
183
+ var {
184
+ onTabFocus
185
+ } = this.props;
186
+ onTabFocus(...arguments);
187
+ }
188
+ handleRenameCancel() {
189
+ this.setState({
190
+ showRenameDialog: false
191
+ });
192
+ }
193
+ handleShowRenameDialog() {
194
+ this.setState({
195
+ showRenameDialog: true
196
+ });
197
+ }
198
+ handleRenameSubmit(newTitle) {
199
+ var {
200
+ glContainer
201
+ } = this.props;
202
+ this.setState({
203
+ showRenameDialog: false,
204
+ title: newTitle
205
+ });
206
+ var root = LayoutUtils.getRootFromContainer(glContainer);
207
+ var config = LayoutUtils.getComponentConfigFromContainer(glContainer);
208
+ assertNotNull(config);
209
+ LayoutUtils.renameComponent(root, config, newTitle);
210
+ }
211
+ handleCopyPanel() {
212
+ var {
213
+ glContainer,
214
+ glEventHub
215
+ } = this.props;
216
+ var root = LayoutUtils.getRootFromContainer(glContainer);
217
+ var config = LayoutUtils.getComponentConfigFromContainer(glContainer);
218
+ if (config == null) {
219
+ log.error('Could not get component config from container', glContainer);
220
+ return;
221
+ }
222
+ var cloneConfig = LayoutUtils.cloneComponent(root, config);
223
+ if (cloneConfig !== null) {
224
+ glEventHub.emit(PanelEvent.CLONED, this, cloneConfig);
225
+ }
226
+ }
227
+ getCloneAction() {
228
+ return {
229
+ title: 'Copy Panel',
230
+ order: 10,
231
+ group: ContextActions.groups.high,
232
+ action: this.handleCopyPanel
233
+ };
234
+ }
235
+ getRenameAction() {
236
+ return {
237
+ title: 'Rename',
238
+ order: 10,
239
+ group: ContextActions.groups.medium,
240
+ action: this.handleShowRenameDialog
241
+ };
242
+ }
243
+ render() {
244
+ var {
245
+ children,
246
+ className,
247
+ renderTabTooltip,
248
+ glContainer,
249
+ additionalActions,
250
+ errorMessage,
251
+ isLoaded,
252
+ isLoading,
253
+ isClonable,
254
+ isRenamable
255
+ } = this.props;
256
+ var {
257
+ tab: glTab
258
+ } = glContainer;
259
+ var {
260
+ showRenameDialog,
261
+ title
262
+ } = this.state;
263
+ return /*#__PURE__*/React.createElement("div", {
264
+ className: classNames('h-100 w-100 iris-panel', className),
265
+ onFocusCapture: this.handleFocus,
266
+ onBlurCapture: this.handleBlur
267
+ }, children, /*#__PURE__*/React.createElement(LoadingOverlay, {
268
+ errorMessage: errorMessage,
269
+ isLoaded: isLoaded,
270
+ isLoading: isLoading
271
+ }), glTab != null && /*#__PURE__*/ReactDOM.createPortal( /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(PanelContextMenu, {
272
+ glContainer: glContainer,
273
+ additionalActions: this.getAdditionActions(additionalActions, isClonable, isRenamable)
274
+ }), isRenamable && /*#__PURE__*/React.createElement(RenameDialog, {
275
+ isShown: showRenameDialog,
276
+ value: title,
277
+ itemType: "Panel",
278
+ onCancel: this.handleRenameCancel,
279
+ onSubmit: this.handleRenameSubmit
280
+ }), renderTabTooltip != null && /*#__PURE__*/React.createElement(Tooltip, {
281
+ interactive: true,
282
+ options: {
283
+ placement: 'bottom'
284
+ },
285
+ popperClassName: "panel-tab-popper"
286
+ }, renderTabTooltip())), glTab.element[0] // tab.element is jquery element, we want a dom element
287
+ ));
288
+ }
289
+ }
290
+ _defineProperty(Panel, "defaultProps", {
291
+ className: '',
292
+ onTab: () => undefined,
293
+ onTabClicked: () => undefined,
294
+ onClearAllFilters: () => undefined,
295
+ onFocus: () => undefined,
296
+ onBlur: () => undefined,
297
+ onHide: () => undefined,
298
+ onResize: () => undefined,
299
+ onSessionClose: () => undefined,
300
+ onSessionOpen: () => undefined,
301
+ onBeforeShow: () => undefined,
302
+ onShow: () => undefined,
303
+ onTabBlur: () => undefined,
304
+ onTabFocus: () => undefined,
305
+ renderTabTooltip: null,
306
+ additionalActions: [],
307
+ errorMessage: null,
308
+ isLoading: false,
309
+ isLoaded: true,
310
+ isClonable: false,
311
+ isRenamable: false
312
+ });
313
+ export default Panel;
314
+ //# sourceMappingURL=Panel.js.map