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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/ConsolePlugin.d.ts +4 -0
  2. package/dist/ConsolePlugin.d.ts.map +1 -1
  3. package/dist/ConsolePlugin.js +12 -12
  4. package/dist/ConsolePlugin.js.map +1 -1
  5. package/dist/MarkdownPlugin.d.ts.map +1 -1
  6. package/dist/MarkdownPlugin.js +3 -3
  7. package/dist/MarkdownPlugin.js.map +1 -1
  8. package/dist/controls/dropdown-filter/DropdownFilter.js +1 -1
  9. package/dist/controls/dropdown-filter/DropdownFilter.js.map +1 -1
  10. package/dist/controls/input-filter/InputFilter.d.ts.map +1 -1
  11. package/dist/controls/input-filter/InputFilter.js +1 -1
  12. package/dist/controls/input-filter/InputFilter.js.map +1 -1
  13. package/dist/controls/markdown/MarkdownContainer.js +1 -1
  14. package/dist/controls/markdown/MarkdownContainer.js.map +1 -1
  15. package/dist/controls/markdown/MarkdownEditor.d.ts.map +1 -1
  16. package/dist/controls/markdown/MarkdownEditor.js +1 -1
  17. package/dist/controls/markdown/MarkdownEditor.js.map +1 -1
  18. package/dist/linker/Linker.d.ts +1 -1
  19. package/dist/linker/Linker.d.ts.map +1 -1
  20. package/dist/linker/Linker.js +6 -6
  21. package/dist/linker/Linker.js.map +1 -1
  22. package/dist/linker/LinkerOverlayContent.js +1 -1
  23. package/dist/linker/LinkerOverlayContent.js.map +1 -1
  24. package/dist/linker/LinkerUtils.js +1 -1
  25. package/dist/linker/LinkerUtils.js.map +1 -1
  26. package/dist/panels/ChartFilterOverlay.d.ts.map +1 -1
  27. package/dist/panels/ChartFilterOverlay.js +2 -2
  28. package/dist/panels/ChartFilterOverlay.js.map +1 -1
  29. package/dist/panels/ChartPanel.d.ts.map +1 -1
  30. package/dist/panels/ChartPanel.js +6 -6
  31. package/dist/panels/ChartPanel.js.map +1 -1
  32. package/dist/panels/ConsolePanel.d.ts.map +1 -1
  33. package/dist/panels/ConsolePanel.js +6 -8
  34. package/dist/panels/ConsolePanel.js.map +1 -1
  35. package/dist/panels/DropdownFilterPanel.js +2 -2
  36. package/dist/panels/DropdownFilterPanel.js.map +1 -1
  37. package/dist/panels/FileExplorerPanel.js +1 -1
  38. package/dist/panels/FileExplorerPanel.js.map +1 -1
  39. package/dist/panels/FilterSetManager.js +1 -1
  40. package/dist/panels/FilterSetManager.js.map +1 -1
  41. package/dist/panels/InputFilterPanel.js +1 -1
  42. package/dist/panels/InputFilterPanel.js.map +1 -1
  43. package/dist/panels/IrisGridPanel.d.ts +1 -1
  44. package/dist/panels/IrisGridPanel.d.ts.map +1 -1
  45. package/dist/panels/IrisGridPanel.js +9 -11
  46. package/dist/panels/IrisGridPanel.js.map +1 -1
  47. package/dist/panels/LogPanel.js +2 -2
  48. package/dist/panels/LogPanel.js.map +1 -1
  49. package/dist/panels/MarkdownNotebook.d.ts +1 -1
  50. package/dist/panels/MarkdownNotebook.d.ts.map +1 -1
  51. package/dist/panels/MarkdownNotebook.js +3 -3
  52. package/dist/panels/MarkdownNotebook.js.map +1 -1
  53. package/dist/panels/MarkdownPanel.d.ts.map +1 -1
  54. package/dist/panels/MarkdownPanel.js +4 -4
  55. package/dist/panels/MarkdownPanel.js.map +1 -1
  56. package/dist/panels/NotebookPanel.d.ts.map +1 -1
  57. package/dist/panels/NotebookPanel.js +8 -10
  58. package/dist/panels/NotebookPanel.js.map +1 -1
  59. package/dist/panels/Panel.d.ts +1 -1
  60. package/dist/panels/Panel.d.ts.map +1 -1
  61. package/dist/panels/Panel.js +3 -3
  62. package/dist/panels/Panel.js.map +1 -1
  63. package/dist/panels/PanelContextMenu.d.ts.map +1 -1
  64. package/dist/panels/PanelContextMenu.js +8 -3
  65. package/dist/panels/PanelContextMenu.js.map +1 -1
  66. package/dist/panels/RenameDialog.d.ts.map +1 -1
  67. package/dist/panels/RenameDialog.js +2 -4
  68. package/dist/panels/RenameDialog.js.map +1 -1
  69. package/package.json +19 -19
@@ -5,6 +5,10 @@ export declare type ConsolePluginProps = DashboardPluginComponentProps & {
5
5
  notebooksUrl: string;
6
6
  };
7
7
  export declare function assertIsConsolePluginProps(props: Partial<ConsolePluginProps>): asserts props is ConsolePluginProps;
8
+ export interface FileMetadata {
9
+ id: string | null;
10
+ itemName: string;
11
+ }
8
12
  export declare const ConsolePlugin: (props: Partial<ConsolePluginProps>) => JSX.Element;
9
13
  export default ConsolePlugin;
10
14
  //# sourceMappingURL=ConsolePlugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConsolePlugin.d.ts","sourceRoot":"","sources":["../src/ConsolePlugin.tsx"],"names":[],"mappings":";AACA,OAAO,EAGL,6BAA6B,EAI7B,oBAAoB,EAGrB,MAAM,sBAAsB,CAAC;AA6B9B,oBAAY,kBAAkB,GAAG,6BAA6B,GAAG;IAC/D,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,CAAC,kBAAkB,CAAC,GACjC,OAAO,CAAC,KAAK,IAAI,kBAAkB,CAErC;AAED,eAAO,MAAM,aAAa,UACjB,QAAQ,kBAAkB,CAAC,KACjC,WAycF,CAAC;AAEF,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"ConsolePlugin.d.ts","sourceRoot":"","sources":["../src/ConsolePlugin.tsx"],"names":[],"mappings":";AACA,OAAO,EAGL,6BAA6B,EAI7B,oBAAoB,EAGrB,MAAM,sBAAsB,CAAC;AA6B9B,oBAAY,kBAAkB,GAAG,6BAA6B,GAAG;IAC/D,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,CAAC,kBAAkB,CAAC,GACjC,OAAO,CAAC,KAAK,IAAI,kBAAkB,CAErC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,aAAa,UACjB,QAAQ,kBAAkB,CAAC,KACjC,WAqdF,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -67,7 +67,7 @@ export var ConsolePlugin = props => {
67
67
  var extension = language === 'python' ? 'py' : language;
68
68
  var title = null;
69
69
 
70
- if (!extension) {
70
+ if (extension == null) {
71
71
  log.debug('No extension for language', language);
72
72
  title = "Untitled-".concat(notebookIndex.current);
73
73
  } else {
@@ -83,11 +83,11 @@ export var ConsolePlugin = props => {
83
83
  id: fileId
84
84
  } = fileMetadata;
85
85
 
86
- if (fileId && openFileMap.has(fileId)) {
86
+ if (fileId != null && openFileMap.has(fileId)) {
87
87
  return openFileMap.get(fileId);
88
88
  }
89
89
 
90
- if (fileId && previewFileMap.has(fileId)) {
90
+ if (fileId != null && previewFileMap.has(fileId)) {
91
91
  return previewFileMap.get(fileId);
92
92
  }
93
93
 
@@ -124,7 +124,7 @@ export var ConsolePlugin = props => {
124
124
  }
125
125
  }
126
126
 
127
- if (!panelId) {
127
+ if (panelId === undefined) {
128
128
  log.debug2("File ".concat(oldName, " isn't open, no need to rename the tab"));
129
129
  return;
130
130
  }
@@ -151,7 +151,7 @@ export var ConsolePlugin = props => {
151
151
  var registerFilePanel = useCallback((panelId, fileMetadata, isPreview) => {
152
152
  log.debug('registerFilePanel', panelId, fileMetadata, isPreview);
153
153
 
154
- if (!fileMetadata || !fileMetadata.id) {
154
+ if (fileMetadata == null || fileMetadata.id == null) {
155
155
  log.debug('Ignore empty file id', fileMetadata);
156
156
  return;
157
157
  }
@@ -195,7 +195,7 @@ export var ConsolePlugin = props => {
195
195
  // to make it switch from preview to edit mode without re-mounting and re-registering
196
196
  log.debug('unregisterFileTab', fileMetadata, isPreview);
197
197
 
198
- if (!fileMetadata || !fileMetadata.id) {
198
+ if (fileMetadata == null || fileMetadata.id == null) {
199
199
  log.debug('Ignore empty file id', fileMetadata);
200
200
  return;
201
201
  }
@@ -245,21 +245,21 @@ export var ConsolePlugin = props => {
245
245
  id: fileId
246
246
  } = fileMetadata;
247
247
  log.debug('fileIsOpen', fileMetadata, fileId, openFileMap);
248
- return fileId && openFileMap.has(fileId);
248
+ return fileId != null && openFileMap.has(fileId);
249
249
  }, [openFileMap]);
250
250
  var fileIsOpenAsPreview = useCallback(fileMetadata => {
251
251
  var {
252
252
  id: fileId
253
253
  } = fileMetadata;
254
254
  log.debug('fileIsOpenAsPreview', fileMetadata, fileId, previewFileMap);
255
- return fileId && previewFileMap.has(fileId);
255
+ return fileId != null && previewFileMap.has(fileId);
256
256
  }, [previewFileMap]);
257
- /**
257
+ /*
258
258
  * Attempts to focus the panel with the provided panelId
259
259
  */
260
260
 
261
261
  var focusPanelById = useCallback(panelId => {
262
- if (!panelId) {
262
+ if (panelId == null) {
263
263
  return;
264
264
  }
265
265
 
@@ -309,7 +309,7 @@ export var ConsolePlugin = props => {
309
309
  };
310
310
  var panelId = getPanelIdForFileMetadata(fileMetadata);
311
311
 
312
- if (fileIsOpen(fileMetadata) && panelId) {
312
+ if (fileIsOpen(fileMetadata) && panelId != null) {
313
313
  log.debug('File is already open, focus panel');
314
314
  showFilePanel(fileMetadata);
315
315
  focusPanelById(panelId);
@@ -392,7 +392,7 @@ export var ConsolePlugin = props => {
392
392
  var notebookPanel = panelManager.getLastUsedPanelOfType(NotebookPanel);
393
393
 
394
394
  if (notebookPanel && isNotebookPanel(notebookPanel)) {
395
- if (settings && settings.value && notebookPanel.notebook) {
395
+ if (settings != null && settings.value != null && notebookPanel.notebook != null) {
396
396
  notebookPanel.notebook.append(settings.value);
397
397
  }
398
398
  } else if (createIfNecessary) {
@@ -1 +1 @@
1
- {"version":3,"file":"ConsolePlugin.js","names":["assertIsDashboardPluginProps","DashboardUtils","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","assertIsConsolePluginProps","props","ConsolePlugin","id","hydrateConsole","layout","panelManager","registerComponent","notebooksUrl","notebookIndex","openFileMap","Map","previewFileMap","dispatch","getConsolePanel","getLastUsedPanelOfType","handleSendCommand","command","focus","execute","trimmedCommand","trim","info","consolePanel","WrappedComponent","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","localDashboardId","metadata","createNotebook","stack","getStackForComponentTypes","config","openComponentInStack","selectNotebook","shouldFocus","isFileOpen","isFileOpenAsPreview","previewTabId","Array","from","values","getStackForConfig","sendToNotebook","notebookPanel","value","append","hydrateNotebook","panelProps","panelDashboardId","hydrate","registerComponentsAndReturnCleanup","cleanups","forEach","cleanup","eventHub","SEND_COMMAND","SETTINGS_CHANGED","CLOSE_FILE","CREATE_NOTEBOOK","SELECT_NOTEBOOK","RENAME","RENAME_FILE","SEND_TO_NOTEBOOK","REGISTER_FILE","UNREGISTER_FILE"],"sources":["../src/ConsolePlugin.tsx"],"sourcesContent":["import { ScriptEditor } from '@deephaven/console';\nimport {\n assertIsDashboardPluginProps,\n DashboardPanelProps,\n DashboardPluginComponentProps,\n DashboardUtils,\n LayoutUtils,\n PanelComponent,\n PanelHydrateFunction,\n PanelProps,\n useListener,\n} from '@deephaven/dashboard';\nimport { FileUtils } from '@deephaven/file-explorer';\nimport Log from '@deephaven/log';\nimport React, { useCallback, useEffect, useRef, useState } 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 type ConsolePluginProps = DashboardPluginComponentProps & {\n hydrateConsole?: PanelHydrateFunction;\n notebooksUrl: string;\n};\n\nexport function assertIsConsolePluginProps(\n props: Partial<ConsolePluginProps>\n): asserts props is ConsolePluginProps {\n assertIsDashboardPluginProps(props);\n}\n\nexport const ConsolePlugin = (\n props: Partial<ConsolePluginProps>\n): JSX.Element => {\n assertIsConsolePluginProps(props);\n const {\n id,\n hydrateConsole,\n layout,\n panelManager,\n registerComponent,\n notebooksUrl,\n } = props;\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),\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 notebooksUrl,\n },\n title,\n id: panelId,\n };\n },\n [getNotebookTitle, id, notebooksUrl]\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 const hydrateNotebook = useCallback(\n (panelProps: PanelProps, panelDashboardId: string): DashboardPanelProps =>\n DashboardUtils.hydrate(\n {\n ...panelProps,\n notebooksUrl,\n },\n panelDashboardId\n ),\n [notebooksUrl]\n );\n\n useEffect(\n function registerComponentsAndReturnCleanup() {\n const cleanups = [\n registerComponent(ConsolePanel.COMPONENT, ConsolePanel, hydrateConsole),\n registerComponent(CommandHistoryPanel.COMPONENT, CommandHistoryPanel),\n registerComponent(FileExplorerPanel.COMPONENT, FileExplorerPanel),\n registerComponent(LogPanel.COMPONENT, LogPanel),\n registerComponent(\n NotebookPanel.COMPONENT,\n NotebookPanel,\n hydrateNotebook\n ),\n ];\n\n return () => {\n cleanups.forEach(cleanup => cleanup());\n };\n },\n [registerComponent, hydrateConsole, hydrateNotebook]\n );\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"],"mappings":"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"}
1
+ {"version":3,"file":"ConsolePlugin.js","names":["assertIsDashboardPluginProps","DashboardUtils","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","assertIsConsolePluginProps","props","ConsolePlugin","id","hydrateConsole","layout","panelManager","registerComponent","notebooksUrl","notebookIndex","openFileMap","Map","previewFileMap","dispatch","getConsolePanel","getLastUsedPanelOfType","handleSendCommand","command","focus","execute","trimmedCommand","trim","info","consolePanel","WrappedComponent","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","localDashboardId","metadata","createNotebook","stack","getStackForComponentTypes","config","openComponentInStack","selectNotebook","shouldFocus","isFileOpen","isFileOpenAsPreview","previewTabId","Array","from","values","getStackForConfig","sendToNotebook","notebookPanel","value","append","hydrateNotebook","panelProps","panelDashboardId","hydrate","registerComponentsAndReturnCleanup","cleanups","forEach","cleanup","eventHub","SEND_COMMAND","SETTINGS_CHANGED","CLOSE_FILE","CREATE_NOTEBOOK","SELECT_NOTEBOOK","RENAME","RENAME_FILE","SEND_TO_NOTEBOOK","REGISTER_FILE","UNREGISTER_FILE"],"sources":["../src/ConsolePlugin.tsx"],"sourcesContent":["import { ScriptEditor } from '@deephaven/console';\nimport {\n assertIsDashboardPluginProps,\n DashboardPanelProps,\n DashboardPluginComponentProps,\n DashboardUtils,\n LayoutUtils,\n PanelComponent,\n PanelHydrateFunction,\n PanelProps,\n useListener,\n} from '@deephaven/dashboard';\nimport { FileUtils } from '@deephaven/file-explorer';\nimport Log from '@deephaven/log';\nimport React, { useCallback, useEffect, useRef, useState } 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 type ConsolePluginProps = DashboardPluginComponentProps & {\n hydrateConsole?: PanelHydrateFunction;\n notebooksUrl: string;\n};\n\nexport function assertIsConsolePluginProps(\n props: Partial<ConsolePluginProps>\n): asserts props is ConsolePluginProps {\n assertIsDashboardPluginProps(props);\n}\n\nexport interface FileMetadata {\n id: string | null;\n itemName: string;\n}\n\nexport const ConsolePlugin = (\n props: Partial<ConsolePluginProps>\n): JSX.Element => {\n assertIsConsolePluginProps(props);\n const {\n id,\n hydrateConsole,\n layout,\n panelManager,\n registerComponent,\n notebooksUrl,\n } = props;\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),\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 == null) {\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: FileMetadata, createIfNecessary = true) => {\n const { id: fileId } = fileMetadata;\n if (fileId != null && openFileMap.has(fileId)) {\n return openFileMap.get(fileId);\n }\n if (fileId != null && previewFileMap.has(fileId)) {\n return previewFileMap.get(fileId);\n }\n if (createIfNecessary as boolean) {\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 === undefined) {\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: FileMetadata, isPreview: boolean) => {\n log.debug('registerFilePanel', panelId, fileMetadata, isPreview);\n if (fileMetadata == null || fileMetadata.id == null) {\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: FileMetadata, isPreview: boolean) => {\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 == null || fileMetadata.id == null) {\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: FileMetadata) => {\n const { id: fileId } = fileMetadata;\n log.debug('fileIsOpen', fileMetadata, fileId, openFileMap);\n return fileId != null && 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 != null && 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 == null) {\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 notebooksUrl,\n },\n title,\n id: panelId,\n };\n },\n [getNotebookTitle, id, notebooksUrl]\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 != null) {\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 (\n session,\n sessionLanguage,\n settings,\n fileMetadata,\n // linter recognizes shouldFocus as any if I don't specify boolean here\n // eslint-disable-next-line @typescript-eslint/no-inferrable-types\n shouldFocus: boolean = false\n ) => {\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 (\n settings != null &&\n settings.value != null &&\n notebookPanel.notebook != null\n ) {\n notebookPanel.notebook.append(settings.value);\n }\n } else if (createIfNecessary as boolean) {\n createNotebook(session, sessionLanguage, settings);\n }\n },\n [createNotebook, panelManager]\n );\n\n const hydrateNotebook = useCallback(\n (panelProps: PanelProps, panelDashboardId: string): DashboardPanelProps =>\n DashboardUtils.hydrate(\n {\n ...panelProps,\n notebooksUrl,\n },\n panelDashboardId\n ),\n [notebooksUrl]\n );\n\n useEffect(\n function registerComponentsAndReturnCleanup() {\n const cleanups = [\n registerComponent(ConsolePanel.COMPONENT, ConsolePanel, hydrateConsole),\n registerComponent(CommandHistoryPanel.COMPONENT, CommandHistoryPanel),\n registerComponent(FileExplorerPanel.COMPONENT, FileExplorerPanel),\n registerComponent(LogPanel.COMPONENT, LogPanel),\n registerComponent(\n NotebookPanel.COMPONENT,\n NotebookPanel,\n hydrateNotebook\n ),\n ];\n\n return () => {\n cleanups.forEach(cleanup => cleanup());\n };\n },\n [registerComponent, hydrateConsole, hydrateNotebook]\n );\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"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownPlugin.d.ts","sourceRoot":"","sources":["../src/MarkdownPlugin.tsx"],"names":[],"mappings":";AAEA,OAAO,EAEL,6BAA6B,EAK9B,MAAM,sBAAsB,CAAC;AAK9B,oBAAY,mBAAmB,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;AAEzE,oBAAY,sBAAsB,GAAG;IACnC,UAAU,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACzC,CAAC;AAEF,eAAO,MAAM,cAAc,UAAW,mBAAmB,KAAG,WAuF3D,CAAC;AAEF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"MarkdownPlugin.d.ts","sourceRoot":"","sources":["../src/MarkdownPlugin.tsx"],"names":[],"mappings":";AAEA,OAAO,EAEL,6BAA6B,EAK9B,MAAM,sBAAsB,CAAC;AAK9B,oBAAY,mBAAmB,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAC;AAEzE,oBAAY,sBAAsB,GAAG;IACnC,UAAU,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACzC,CAAC;AAEF,eAAO,MAAM,cAAc,UAAW,mBAAmB,KAAG,WA0F3D,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -22,13 +22,13 @@ export var MarkdownPlugin = props => {
22
22
  panelState = null
23
23
  } = configProps;
24
24
 
25
- if (componentState) {
25
+ if (componentState != null) {
26
26
  ({
27
27
  panelState = null
28
28
  } = componentState);
29
29
  }
30
30
 
31
- if (!title || !panelState || !panelState.content || panelState.content.length === 0 || panelState.content === MarkdownUtils.DEFAULT_CONTENT) {
31
+ if (title == null || panelState == null || panelState.content == null || panelState.content.length === 0 || panelState.content === MarkdownUtils.DEFAULT_CONTENT) {
32
32
  // We don't want to save it if there's no content
33
33
  return null;
34
34
  }
@@ -51,7 +51,7 @@ export var MarkdownPlugin = props => {
51
51
 
52
52
  return (_markdown$title = markdown.title) !== null && _markdown$title !== void 0 ? _markdown$title : '';
53
53
  });
54
- var panelTitle = title || MarkdownUtils.getNewMarkdownTitle(usedTitles);
54
+ var panelTitle = title != null && title !== '' ? title : MarkdownUtils.getNewMarkdownTitle(usedTitles);
55
55
  var content = closedMarkdowns.length > 0 ? null : MarkdownUtils.DEFAULT_CONTENT;
56
56
  var config = {
57
57
  type: 'react-component',
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownPlugin.js","names":["React","useCallback","useEffect","shortid","assertIsDashboardPluginProps","dehydrate","hydrate","LayoutUtils","useListener","MarkdownPanel","MarkdownUtils","MarkdownEvent","MarkdownPlugin","props","id","layout","panelManager","registerComponent","dehydrateMarkdown","config","title","componentState","configProps","panelState","content","length","DEFAULT_CONTENT","handleOpen","metadata","panelId","generate","focusElement","DEFAULT_FOCUS_SELECTOR","createNewStack","dragEvent","openedMarkdowns","getOpenedPanelConfigsOfType","COMPONENT","closedMarkdowns","getClosedPanelConfigsOfType","usedTitles","map","markdown","panelTitle","getNewMarkdownTitle","type","component","localDashboardId","root","openComponent","registerComponentsAndReturnCleanup","cleanups","forEach","cleanup","eventHub","OPEN"],"sources":["../src/MarkdownPlugin.tsx"],"sourcesContent":["import React, { useCallback, useEffect } from 'react';\nimport shortid from 'shortid';\nimport {\n assertIsDashboardPluginProps,\n DashboardPluginComponentProps,\n dehydrate,\n hydrate,\n LayoutUtils,\n useListener,\n} from '@deephaven/dashboard';\nimport { MarkdownPanel } from './panels';\nimport MarkdownUtils from './controls/markdown/MarkdownUtils';\nimport MarkdownEvent from './events/MarkdownEvent';\n\nexport type MarkdownPluginProps = Partial<DashboardPluginComponentProps>;\n\nexport type MarkdownComponentState = {\n panelState?: { content: string } | null;\n};\n\nexport const MarkdownPlugin = (props: MarkdownPluginProps): JSX.Element => {\n assertIsDashboardPluginProps(props);\n const { id, layout, panelManager, registerComponent } = props;\n const dehydrateMarkdown = useCallback(config => {\n const { title, componentState, props: configProps } = config;\n let { panelState = null }: MarkdownComponentState = configProps;\n if (componentState) {\n ({ panelState = null } = componentState as MarkdownComponentState);\n }\n if (\n !title ||\n !panelState ||\n !panelState.content ||\n panelState.content.length === 0 ||\n panelState.content === MarkdownUtils.DEFAULT_CONTENT\n ) {\n // We don't want to save it if there's no content\n return null;\n }\n return dehydrate(config);\n }, []);\n\n const handleOpen = useCallback(\n ({\n title = '',\n metadata = {},\n id: panelId = shortid.generate(),\n focusElement = LayoutUtils.DEFAULT_FOCUS_SELECTOR,\n createNewStack = false,\n dragEvent = null,\n } = {}) => {\n const openedMarkdowns = panelManager.getOpenedPanelConfigsOfType(\n MarkdownPanel.COMPONENT\n );\n const closedMarkdowns = panelManager.getClosedPanelConfigsOfType(\n MarkdownPanel.COMPONENT\n );\n const usedTitles = openedMarkdowns.map(markdown => markdown.title ?? '');\n const panelTitle = title || MarkdownUtils.getNewMarkdownTitle(usedTitles);\n const content =\n closedMarkdowns.length > 0 ? null : MarkdownUtils.DEFAULT_CONTENT;\n const config = {\n type: 'react-component',\n component: MarkdownPanel.COMPONENT,\n props: {\n id: panelId,\n metadata,\n panelState: { content },\n localDashboardId: id,\n },\n title: panelTitle,\n id: panelId,\n };\n\n const { root } = layout;\n LayoutUtils.openComponent({\n root,\n config,\n focusElement,\n createNewStack,\n dragEvent,\n });\n },\n [id, layout, panelManager]\n );\n\n useEffect(\n function registerComponentsAndReturnCleanup() {\n const cleanups = [\n registerComponent(\n MarkdownPanel.COMPONENT,\n MarkdownPanel,\n hydrate,\n dehydrateMarkdown\n ),\n ];\n\n return () => {\n cleanups.forEach(cleanup => cleanup());\n };\n },\n [dehydrateMarkdown, registerComponent]\n );\n\n useListener(layout.eventHub, MarkdownEvent.OPEN, handleOpen);\n\n return <></>;\n};\n\nexport default MarkdownPlugin;\n"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,WAAhB,EAA6BC,SAA7B,QAA8C,OAA9C;AACA,OAAOC,OAAP,MAAoB,SAApB;AACA,SACEC,4BADF,EAGEC,SAHF,EAIEC,OAJF,EAKEC,WALF,EAMEC,WANF,QAOO,sBAPP;SAQSC,a;OACFC,a;OACAC,a;AAQP,OAAO,IAAMC,cAAc,GAAIC,KAAD,IAA6C;EACzET,4BAA4B,CAACS,KAAD,CAA5B;EACA,IAAM;IAAEC,EAAF;IAAMC,MAAN;IAAcC,YAAd;IAA4BC;EAA5B,IAAkDJ,KAAxD;EACA,IAAMK,iBAAiB,GAAGjB,WAAW,CAACkB,MAAM,IAAI;IAC9C,IAAM;MAAEC,KAAF;MAASC,cAAT;MAAyBR,KAAK,EAAES;IAAhC,IAAgDH,MAAtD;IACA,IAAI;MAAEI,UAAU,GAAG;IAAf,IAAgDD,WAApD;;IACA,IAAID,cAAJ,EAAoB;MAClB,CAAC;QAAEE,UAAU,GAAG;MAAf,IAAwBF,cAAzB;IACD;;IACD,IACE,CAACD,KAAD,IACA,CAACG,UADD,IAEA,CAACA,UAAU,CAACC,OAFZ,IAGAD,UAAU,CAACC,OAAX,CAAmBC,MAAnB,KAA8B,CAH9B,IAIAF,UAAU,CAACC,OAAX,KAAuBd,aAAa,CAACgB,eALvC,EAME;MACA;MACA,OAAO,IAAP;IACD;;IACD,OAAOrB,SAAS,CAACc,MAAD,CAAhB;EACD,CAjBoC,EAiBlC,EAjBkC,CAArC;EAmBA,IAAMQ,UAAU,GAAG1B,WAAW,CAC5B,YAOW;IAAA,IAPV;MACCmB,KAAK,GAAG,EADT;MAECQ,QAAQ,GAAG,EAFZ;MAGCd,EAAE,EAAEe,OAAO,GAAG1B,OAAO,CAAC2B,QAAR,EAHf;MAICC,YAAY,GAAGxB,WAAW,CAACyB,sBAJ5B;MAKCC,cAAc,GAAG,KALlB;MAMCC,SAAS,GAAG;IANb,CAOU,uEAAP,EAAO;IACT,IAAMC,eAAe,GAAGnB,YAAY,CAACoB,2BAAb,CACtB3B,aAAa,CAAC4B,SADQ,CAAxB;IAGA,IAAMC,eAAe,GAAGtB,YAAY,CAACuB,2BAAb,CACtB9B,aAAa,CAAC4B,SADQ,CAAxB;IAGA,IAAMG,UAAU,GAAGL,eAAe,CAACM,GAAhB,CAAoBC,QAAQ;MAAA;;MAAA,0BAAIA,QAAQ,CAACtB,KAAb,6DAAsB,EAAtB;IAAA,CAA5B,CAAnB;IACA,IAAMuB,UAAU,GAAGvB,KAAK,IAAIV,aAAa,CAACkC,mBAAd,CAAkCJ,UAAlC,CAA5B;IACA,IAAMhB,OAAO,GACXc,eAAe,CAACb,MAAhB,GAAyB,CAAzB,GAA6B,IAA7B,GAAoCf,aAAa,CAACgB,eADpD;IAEA,IAAMP,MAAM,GAAG;MACb0B,IAAI,EAAE,iBADO;MAEbC,SAAS,EAAErC,aAAa,CAAC4B,SAFZ;MAGbxB,KAAK,EAAE;QACLC,EAAE,EAAEe,OADC;QAELD,QAFK;QAGLL,UAAU,EAAE;UAAEC;QAAF,CAHP;QAILuB,gBAAgB,EAAEjC;MAJb,CAHM;MASbM,KAAK,EAAEuB,UATM;MAUb7B,EAAE,EAAEe;IAVS,CAAf;IAaA,IAAM;MAAEmB;IAAF,IAAWjC,MAAjB;IACAR,WAAW,CAAC0C,aAAZ,CAA0B;MACxBD,IADwB;MAExB7B,MAFwB;MAGxBY,YAHwB;MAIxBE,cAJwB;MAKxBC;IALwB,CAA1B;EAOD,CAxC2B,EAyC5B,CAACpB,EAAD,EAAKC,MAAL,EAAaC,YAAb,CAzC4B,CAA9B;EA4CAd,SAAS,CACP,SAASgD,kCAAT,GAA8C;IAC5C,IAAMC,QAAQ,GAAG,CACflC,iBAAiB,CACfR,aAAa,CAAC4B,SADC,EAEf5B,aAFe,EAGfH,OAHe,EAIfY,iBAJe,CADF,CAAjB;IASA,OAAO,MAAM;MACXiC,QAAQ,CAACC,OAAT,CAAiBC,OAAO,IAAIA,OAAO,EAAnC;IACD,CAFD;EAGD,CAdM,EAeP,CAACnC,iBAAD,EAAoBD,iBAApB,CAfO,CAAT;EAkBAT,WAAW,CAACO,MAAM,CAACuC,QAAR,EAAkB3C,aAAa,CAAC4C,IAAhC,EAAsC5B,UAAtC,CAAX;EAEA,oBAAO,yCAAP;AACD,CAvFM;AAyFP,eAAef,cAAf"}
1
+ {"version":3,"file":"MarkdownPlugin.js","names":["React","useCallback","useEffect","shortid","assertIsDashboardPluginProps","dehydrate","hydrate","LayoutUtils","useListener","MarkdownPanel","MarkdownUtils","MarkdownEvent","MarkdownPlugin","props","id","layout","panelManager","registerComponent","dehydrateMarkdown","config","title","componentState","configProps","panelState","content","length","DEFAULT_CONTENT","handleOpen","metadata","panelId","generate","focusElement","DEFAULT_FOCUS_SELECTOR","createNewStack","dragEvent","openedMarkdowns","getOpenedPanelConfigsOfType","COMPONENT","closedMarkdowns","getClosedPanelConfigsOfType","usedTitles","map","markdown","panelTitle","getNewMarkdownTitle","type","component","localDashboardId","root","openComponent","registerComponentsAndReturnCleanup","cleanups","forEach","cleanup","eventHub","OPEN"],"sources":["../src/MarkdownPlugin.tsx"],"sourcesContent":["import React, { useCallback, useEffect } from 'react';\nimport shortid from 'shortid';\nimport {\n assertIsDashboardPluginProps,\n DashboardPluginComponentProps,\n dehydrate,\n hydrate,\n LayoutUtils,\n useListener,\n} from '@deephaven/dashboard';\nimport { MarkdownPanel } from './panels';\nimport MarkdownUtils from './controls/markdown/MarkdownUtils';\nimport MarkdownEvent from './events/MarkdownEvent';\n\nexport type MarkdownPluginProps = Partial<DashboardPluginComponentProps>;\n\nexport type MarkdownComponentState = {\n panelState?: { content: string } | null;\n};\n\nexport const MarkdownPlugin = (props: MarkdownPluginProps): JSX.Element => {\n assertIsDashboardPluginProps(props);\n const { id, layout, panelManager, registerComponent } = props;\n const dehydrateMarkdown = useCallback(config => {\n const { title, componentState, props: configProps } = config;\n let { panelState = null }: MarkdownComponentState = configProps;\n if (componentState != null) {\n ({ panelState = null } = componentState as MarkdownComponentState);\n }\n if (\n title == null ||\n panelState == null ||\n panelState.content == null ||\n panelState.content.length === 0 ||\n panelState.content === MarkdownUtils.DEFAULT_CONTENT\n ) {\n // We don't want to save it if there's no content\n return null;\n }\n return dehydrate(config);\n }, []);\n\n const handleOpen = useCallback(\n ({\n title = '',\n metadata = {},\n id: panelId = shortid.generate(),\n focusElement = LayoutUtils.DEFAULT_FOCUS_SELECTOR,\n createNewStack = false,\n dragEvent = null,\n } = {}) => {\n const openedMarkdowns = panelManager.getOpenedPanelConfigsOfType(\n MarkdownPanel.COMPONENT\n );\n const closedMarkdowns = panelManager.getClosedPanelConfigsOfType(\n MarkdownPanel.COMPONENT\n );\n const usedTitles = openedMarkdowns.map(markdown => markdown.title ?? '');\n const panelTitle =\n title != null && title !== ''\n ? title\n : MarkdownUtils.getNewMarkdownTitle(usedTitles);\n const content =\n closedMarkdowns.length > 0 ? null : MarkdownUtils.DEFAULT_CONTENT;\n const config = {\n type: 'react-component',\n component: MarkdownPanel.COMPONENT,\n props: {\n id: panelId,\n metadata,\n panelState: { content },\n localDashboardId: id,\n },\n title: panelTitle,\n id: panelId,\n };\n\n const { root } = layout;\n LayoutUtils.openComponent({\n root,\n config,\n focusElement,\n createNewStack,\n dragEvent,\n });\n },\n [id, layout, panelManager]\n );\n\n useEffect(\n function registerComponentsAndReturnCleanup() {\n const cleanups = [\n registerComponent(\n MarkdownPanel.COMPONENT,\n MarkdownPanel,\n hydrate,\n dehydrateMarkdown\n ),\n ];\n\n return () => {\n cleanups.forEach(cleanup => cleanup());\n };\n },\n [dehydrateMarkdown, registerComponent]\n );\n\n useListener(layout.eventHub, MarkdownEvent.OPEN, handleOpen);\n\n return <></>;\n};\n\nexport default MarkdownPlugin;\n"],"mappings":"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"}
@@ -23,7 +23,7 @@ class DropdownFilter extends Component {
23
23
 
24
24
  _defineProperty(this, "dropdownRef", void 0);
25
25
 
26
- _defineProperty(this, "getCompatibleColumns", memoize((source, columns) => source ? columns.filter(_ref => {
26
+ _defineProperty(this, "getCompatibleColumns", memoize((source, columns) => source != null ? columns.filter(_ref => {
27
27
  var {
28
28
  type
29
29
  } = _ref;
@@ -1 +1 @@
1
- {"version":3,"file":"DropdownFilter.js","names":["React","Component","FontAwesomeIcon","Button","CardFlip","SocketedButton","vsGear","TableUtils","memoizee","memoize","debounce","Log","log","module","UPDATE_DEBOUNCE","DropdownFilter","constructor","props","source","columns","filter","type","undefined","isCompatibleType","columnType","selectedColumn","selectedIndex","options","push","forEach","columnItem","index","name","getItemLabel","values","value","indexOf","PLACEHOLDER","map","val","length","shortType","substring","lastIndexOf","onChange","column","isValueShown","state","handleColumnChange","bind","handleSettingsCancel","handleSettingsClick","handleSettingsSave","handleBackgroundClick","handleDropdownKeyPress","handleValueChange","dropdownRef","createRef","disableCancel","componentDidUpdate","prevProps","prevState","isLoaded","sourceUpdated","includes","resetValue","focusInput","sendUpdate","componentWillUnmount","flush","event","target","debug2","parseInt","setState","allColumns","getCompatibleColumns","key","preventDefault","stopPropagation","valueIndex","error","showSettings","current","handleMouseEnter","onSourceMouseEnter","handleMouseLeave","onSourceMouseLeave","focus","clearFilter","setFilterState","render","disableLinking","isLinkerActive","onColumnSelected","settingsError","columnSelectionDisabled","isLinked","sourceButtonLabel","columnName","SOURCE_BUTTON_PLACEHOLDER","filterTitle","columnOptions","getColumnOptions","valueOptions","getValueOptions","selectedOption","getSelectedOptionIndex","disableSave","isFlipped","SOURCE_BUTTON_CLASS_NAME"],"sources":["../../../src/controls/dropdown-filter/DropdownFilter.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/click-events-have-key-events */\n/* eslint-disable jsx-a11y/no-static-element-interactions */\n// background click is just a convenience method, not an actual a11y issue\n\nimport React, {\n ChangeEvent,\n Component,\n KeyboardEvent,\n MouseEvent,\n ReactElement,\n RefObject,\n} from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Button, CardFlip, SocketedButton } from '@deephaven/components';\nimport { vsGear } from '@deephaven/icons';\nimport { Column } from '@deephaven/jsapi-shim';\nimport { TableUtils } from '@deephaven/jsapi-utils';\nimport memoizee from 'memoizee';\nimport memoize from 'memoize-one';\nimport debounce from 'lodash.debounce';\nimport Log from '@deephaven/log';\nimport './DropdownFilter.scss';\nimport { LinkPoint } from '../../linker/LinkerUtils';\n\nconst log = Log.module('DropdownFilter');\nconst UPDATE_DEBOUNCE = 150;\n\nexport interface DropdownFilterColumn {\n name: string;\n type?: string;\n}\ninterface DropdownFilterProps {\n column: DropdownFilterColumn;\n columns: DropdownFilterColumn[];\n onSourceMouseEnter: () => void;\n onSourceMouseLeave: () => void;\n disableLinking: boolean;\n isLinkerActive: boolean;\n isLoaded: boolean;\n isValueShown: boolean;\n settingsError: string;\n source: LinkPoint;\n value: string;\n values: (string | null)[];\n onChange: (change: {\n column: Partial<Column> | null;\n isValueShown?: boolean;\n value?: string;\n }) => void;\n onColumnSelected: () => void;\n}\n\ninterface DropdownFilterState {\n column: DropdownFilterColumn | null;\n selectedColumn: DropdownFilterColumn | null;\n disableCancel: boolean;\n isValueShown: boolean;\n value: string | null;\n}\n\nclass DropdownFilter extends Component<\n DropdownFilterProps,\n DropdownFilterState\n> {\n static defaultProps = {\n column: null,\n disableLinking: false,\n isLinkerActive: false,\n isLoaded: false,\n isValueShown: false,\n\n settingsError: null,\n source: null,\n value: '',\n values: [],\n onColumnSelected: (): void => undefined,\n onSourceMouseEnter: (): void => undefined,\n onSourceMouseLeave: (): void => undefined,\n };\n\n static PLACEHOLDER = 'Select a value...';\n\n static SOURCE_BUTTON_CLASS_NAME = 'btn-dropdown-filter-selector';\n\n static SOURCE_BUTTON_PLACEHOLDER = 'Select a column';\n\n constructor(props: DropdownFilterProps) {\n super(props);\n\n this.handleColumnChange = this.handleColumnChange.bind(this);\n this.handleSettingsCancel = this.handleSettingsCancel.bind(this);\n this.handleSettingsClick = this.handleSettingsClick.bind(this);\n this.handleSettingsSave = this.handleSettingsSave.bind(this);\n this.handleBackgroundClick = this.handleBackgroundClick.bind(this);\n this.handleDropdownKeyPress = this.handleDropdownKeyPress.bind(this);\n this.handleValueChange = this.handleValueChange.bind(this);\n\n this.dropdownRef = React.createRef();\n\n const { column, isValueShown, value } = props;\n this.state = {\n column,\n selectedColumn: column,\n disableCancel: !isValueShown,\n isValueShown,\n value,\n };\n }\n\n componentDidUpdate(\n prevProps: DropdownFilterProps,\n prevState: DropdownFilterState\n ): void {\n const { source, values, isLoaded } = this.props;\n const { column, value, isValueShown } = this.state;\n\n if (isLoaded) {\n if (source !== prevProps.source) {\n this.sourceUpdated();\n }\n\n if (\n values !== prevProps.values &&\n value !== '' &&\n !values.includes(value)\n ) {\n // Value list loaded, but doesn't contain the current value\n this.resetValue();\n }\n\n if (isValueShown !== prevState.isValueShown) {\n if (isValueShown) {\n this.focusInput();\n }\n }\n\n if (\n column !== prevState.column ||\n value !== prevState.value ||\n isValueShown !== prevState.isValueShown\n ) {\n this.sendUpdate();\n }\n }\n }\n\n componentWillUnmount(): void {\n this.sendUpdate.flush();\n }\n\n dropdownRef: RefObject<HTMLSelectElement>;\n\n getCompatibleColumns = memoize(\n (source: LinkPoint, columns: DropdownFilterColumn[]) =>\n source\n ? columns.filter(\n ({ type }) =>\n type !== undefined &&\n TableUtils.isCompatibleType(type, source.columnType)\n )\n : []\n );\n\n getColumnOptions = memoize(\n (\n columns: DropdownFilterColumn[],\n selectedColumn: DropdownFilterColumn | null\n ): [JSX.Element[], number] => {\n let selectedIndex = -1;\n const options = [];\n options.push(\n <option key=\"placeholder\" value=\"-1\">\n Select a column\n </option>\n );\n columns.forEach((columnItem, index) => {\n options.push(\n <option key={`${columnItem.name}/${columnItem.type}`} value={index}>\n {this.getItemLabel(columns, index)}\n </option>\n );\n if (\n selectedColumn !== null &&\n columnItem.name === selectedColumn.name &&\n columnItem.type === selectedColumn.type\n ) {\n selectedIndex = index;\n }\n });\n return [options, selectedIndex];\n }\n );\n\n getSelectedOptionIndex = memoize(\n (values: (string | null)[], value: string | null) => values.indexOf(value)\n );\n\n getValueOptions = memoize((values: (string | null)[]) => [\n <option value=\"-1\" key=\"-1\">\n {DropdownFilter.PLACEHOLDER}\n </option>,\n ...values.map((val, index) => (\n <option\n value={index}\n // eslint-disable-next-line react/no-array-index-key\n key={`${index}/${val}`}\n >\n {val}\n </option>\n )),\n ]);\n\n getItemLabel = memoizee((columns, index) => {\n const { name, type } = columns[index];\n\n if (\n (index > 0 && columns[index - 1].name === name) ||\n (index < columns.length - 1 && columns[index + 1].name === name)\n ) {\n const shortType = type.substring(type.lastIndexOf('.') + 1);\n return `${name} (${shortType})`;\n }\n\n return name;\n });\n\n handleColumnChange(event: ChangeEvent<HTMLSelectElement>): void {\n const { value } = event.target;\n log.debug2('handleColumnChange', value);\n if (value != null && parseInt(value, 10) < 0) {\n this.setState({\n selectedColumn: null,\n });\n return;\n }\n const { columns: allColumns, source } = this.props;\n const columns = this.getCompatibleColumns(source, allColumns);\n this.setState({\n selectedColumn: columns[parseInt(value, 10)],\n });\n }\n\n handleDropdownKeyPress(event: KeyboardEvent<HTMLSelectElement>): void {\n if (event.key === 'Enter') {\n event.preventDefault();\n event.stopPropagation();\n\n log.debug2('handleDropdownKeyPress');\n\n this.sendUpdate();\n this.sendUpdate.flush();\n }\n }\n\n handleValueChange(event: ChangeEvent<HTMLSelectElement>): void {\n const { value: valueIndex } = event.target;\n const index = parseInt(valueIndex, 10);\n // Default empty string value for 'clear filter'\n let value: string | null = '';\n const { values } = this.props;\n if (index === -1) {\n log.debug2('Selected default item');\n } else if (index >= 0 && index < values.length) {\n value = values[index];\n } else {\n log.error('Invalid index', index, values);\n return;\n }\n\n log.debug2('handleValueChange', value);\n\n this.setState({ value });\n }\n\n handleSettingsCancel(): void {\n this.setState(({ column }) => ({\n selectedColumn: column,\n isValueShown: true,\n }));\n }\n\n handleSettingsSave(): void {\n this.setState(({ column, selectedColumn, value }) => ({\n column: selectedColumn,\n // Reset value if column changed\n value: column === selectedColumn ? value : '',\n isValueShown: true,\n disableCancel: false,\n }));\n }\n\n handleSettingsClick(event: MouseEvent<HTMLButtonElement>): void {\n event.stopPropagation();\n this.showSettings();\n }\n\n handleBackgroundClick(event: MouseEvent<HTMLDivElement>): void {\n // allow clicking anywhere in the background to select and focus the input\n if (event.target !== this.dropdownRef.current) {\n this.focusInput();\n }\n }\n\n handleMouseEnter(): void {\n const { onSourceMouseEnter } = this.props;\n onSourceMouseEnter();\n }\n\n handleMouseLeave(): void {\n const { onSourceMouseLeave } = this.props;\n onSourceMouseLeave();\n }\n\n sourceUpdated(): void {\n this.setState({\n column: null,\n selectedColumn: null,\n isValueShown: false,\n disableCancel: true,\n value: '',\n });\n }\n\n showSettings(): void {\n const { column } = this.state;\n this.setState({ selectedColumn: column, isValueShown: false });\n }\n\n focusInput(): void {\n if (this.dropdownRef.current !== null) {\n this.dropdownRef.current.focus();\n }\n }\n\n resetValue(): void {\n this.setState({ value: '' });\n }\n\n // Called by the parent component via ref\n clearFilter(): void {\n this.resetValue();\n }\n\n setFilterState({\n name,\n type,\n value,\n isValueShown,\n }: {\n name: string;\n type: string;\n value: string;\n isValueShown: boolean;\n }): void {\n const column = name != null && type != null ? { name, type } : null;\n this.setState({ column, value, isValueShown });\n }\n\n sendUpdate = debounce(() => {\n const { onChange } = this.props;\n const { column, value, isValueShown } = this.state;\n onChange({ column, isValueShown, value: value ?? undefined });\n }, UPDATE_DEBOUNCE);\n\n render(): ReactElement {\n const {\n columns: allColumns,\n disableLinking,\n isLinkerActive,\n isLoaded,\n source,\n onColumnSelected,\n onSourceMouseEnter,\n onSourceMouseLeave,\n values,\n settingsError,\n } = this.props;\n const {\n column,\n disableCancel,\n isValueShown,\n selectedColumn,\n value,\n } = this.state;\n const columnSelectionDisabled = source === null;\n const columns = this.getCompatibleColumns(source, allColumns);\n const isLinked = source != null;\n const sourceButtonLabel =\n source?.columnName ?? DropdownFilter.SOURCE_BUTTON_PLACEHOLDER;\n const filterTitle = column != null ? `${column.name} Filter` : null;\n const [columnOptions, selectedIndex] = this.getColumnOptions(\n columns,\n selectedColumn\n );\n const valueOptions = this.getValueOptions(values);\n const selectedOption = this.getSelectedOptionIndex(values, value);\n const disableSave = !isLinked || selectedColumn == null;\n\n const isFlipped = isValueShown && !isLinkerActive;\n\n return (\n <CardFlip\n className=\"dropdown-filter fill-parent-absolute\"\n isFlipped={isFlipped}\n >\n <div className=\"dropdown-filter-settings-card\">\n <div className=\"dropdown-filter-card-content\">\n <div className=\"dropdown-filter-settings-grid\">\n <label>Source Column</label>\n <SocketedButton\n isLinked={isLinked}\n onClick={onColumnSelected}\n onMouseEnter={onSourceMouseEnter}\n onMouseLeave={onSourceMouseLeave}\n className={DropdownFilter.SOURCE_BUTTON_CLASS_NAME}\n disabled={disableLinking}\n >\n {sourceButtonLabel}\n </SocketedButton>\n\n <div className=\"text-muted small\">\n Select a source column for the list by linking to a table.\n </div>\n\n <label>Filter Column</label>\n <select\n value={selectedIndex}\n className=\"custom-select\"\n onChange={this.handleColumnChange}\n disabled={columnSelectionDisabled}\n >\n {columnOptions}\n </select>\n <div className=\"text-muted small\">\n Dropdown filter control will apply its filter to all columns\n matching this name in this dashboard.\n </div>\n </div>\n {settingsError && (\n <div className=\"error-message text-center\">{settingsError}</div>\n )}\n {isLinked && (\n <div className=\"dropdown-filter-settings-buttons\">\n <Button\n kind=\"secondary\"\n type=\"button\"\n onClick={this.handleSettingsCancel}\n disabled={disableCancel || isValueShown || isLinkerActive}\n tooltip={\n isLinkerActive\n ? 'Cancel disabled while linker open'\n : undefined\n }\n >\n Cancel\n </Button>\n <Button\n kind=\"primary\"\n type=\"button\"\n className=\"ml-2\"\n onClick={this.handleSettingsSave}\n disabled={disableSave || isValueShown || isLinkerActive}\n tooltip={\n isLinkerActive\n ? 'Save disabled while linker open'\n : undefined\n }\n >\n Save\n </Button>\n </div>\n )}\n </div>\n </div>\n\n <div\n className=\"dropdown-filter-value-card\"\n onClick={this.handleBackgroundClick}\n >\n {isLoaded && (\n <>\n <div className=\"dropdown-filter-column\">\n <div className=\"dropdown-filter-column-title\">\n {filterTitle}\n </div>\n </div>\n <div className=\"dropdown-filter-card-content\">\n <div className=\"dropdown-filter-value-input d-flex flex-column justify-content-center\">\n <select\n className=\"custom-select\"\n value={selectedOption}\n ref={this.dropdownRef}\n onChange={this.handleValueChange}\n onKeyPress={this.handleDropdownKeyPress}\n >\n {valueOptions}\n </select>\n </div>\n {settingsError && (\n <div className=\"error-message mt-3 text-center\">\n {settingsError}\n </div>\n )}\n </div>\n <div className=\"dropdown-filter-menu\">\n <button\n type=\"button\"\n className=\"btn btn-link btn-link-icon m-2 px-2\"\n onClick={this.handleSettingsClick}\n >\n <FontAwesomeIcon icon={vsGear} transform=\"grow-4\" />\n </button>\n </div>\n </>\n )}\n </div>\n </CardFlip>\n );\n }\n}\n\nexport default DropdownFilter;\n"],"mappings":"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"}
1
+ {"version":3,"file":"DropdownFilter.js","names":["React","Component","FontAwesomeIcon","Button","CardFlip","SocketedButton","vsGear","TableUtils","memoizee","memoize","debounce","Log","log","module","UPDATE_DEBOUNCE","DropdownFilter","constructor","props","source","columns","filter","type","undefined","isCompatibleType","columnType","selectedColumn","selectedIndex","options","push","forEach","columnItem","index","name","getItemLabel","values","value","indexOf","PLACEHOLDER","map","val","length","shortType","substring","lastIndexOf","onChange","column","isValueShown","state","handleColumnChange","bind","handleSettingsCancel","handleSettingsClick","handleSettingsSave","handleBackgroundClick","handleDropdownKeyPress","handleValueChange","dropdownRef","createRef","disableCancel","componentDidUpdate","prevProps","prevState","isLoaded","sourceUpdated","includes","resetValue","focusInput","sendUpdate","componentWillUnmount","flush","event","target","debug2","parseInt","setState","allColumns","getCompatibleColumns","key","preventDefault","stopPropagation","valueIndex","error","showSettings","current","handleMouseEnter","onSourceMouseEnter","handleMouseLeave","onSourceMouseLeave","focus","clearFilter","setFilterState","render","disableLinking","isLinkerActive","onColumnSelected","settingsError","columnSelectionDisabled","isLinked","sourceButtonLabel","columnName","SOURCE_BUTTON_PLACEHOLDER","filterTitle","columnOptions","getColumnOptions","valueOptions","getValueOptions","selectedOption","getSelectedOptionIndex","disableSave","isFlipped","SOURCE_BUTTON_CLASS_NAME"],"sources":["../../../src/controls/dropdown-filter/DropdownFilter.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/click-events-have-key-events */\n/* eslint-disable jsx-a11y/no-static-element-interactions */\n// background click is just a convenience method, not an actual a11y issue\n\nimport React, {\n ChangeEvent,\n Component,\n KeyboardEvent,\n MouseEvent,\n ReactElement,\n RefObject,\n} from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Button, CardFlip, SocketedButton } from '@deephaven/components';\nimport { vsGear } from '@deephaven/icons';\nimport { Column } from '@deephaven/jsapi-shim';\nimport { TableUtils } from '@deephaven/jsapi-utils';\nimport memoizee from 'memoizee';\nimport memoize from 'memoize-one';\nimport debounce from 'lodash.debounce';\nimport Log from '@deephaven/log';\nimport './DropdownFilter.scss';\nimport { LinkPoint } from '../../linker/LinkerUtils';\n\nconst log = Log.module('DropdownFilter');\nconst UPDATE_DEBOUNCE = 150;\n\nexport interface DropdownFilterColumn {\n name: string;\n type?: string;\n}\ninterface DropdownFilterProps {\n column: DropdownFilterColumn;\n columns: DropdownFilterColumn[];\n onSourceMouseEnter: () => void;\n onSourceMouseLeave: () => void;\n disableLinking: boolean;\n isLinkerActive: boolean;\n isLoaded: boolean;\n isValueShown: boolean;\n settingsError: string;\n source: LinkPoint;\n value: string;\n values: (string | null)[];\n onChange: (change: {\n column: Partial<Column> | null;\n isValueShown?: boolean;\n value?: string;\n }) => void;\n onColumnSelected: () => void;\n}\n\ninterface DropdownFilterState {\n column: DropdownFilterColumn | null;\n selectedColumn: DropdownFilterColumn | null;\n disableCancel: boolean;\n isValueShown: boolean;\n value: string | null;\n}\n\nclass DropdownFilter extends Component<\n DropdownFilterProps,\n DropdownFilterState\n> {\n static defaultProps = {\n column: null,\n disableLinking: false,\n isLinkerActive: false,\n isLoaded: false,\n isValueShown: false,\n\n settingsError: null,\n source: null,\n value: '',\n values: [],\n onColumnSelected: (): void => undefined,\n onSourceMouseEnter: (): void => undefined,\n onSourceMouseLeave: (): void => undefined,\n };\n\n static PLACEHOLDER = 'Select a value...';\n\n static SOURCE_BUTTON_CLASS_NAME = 'btn-dropdown-filter-selector';\n\n static SOURCE_BUTTON_PLACEHOLDER = 'Select a column';\n\n constructor(props: DropdownFilterProps) {\n super(props);\n\n this.handleColumnChange = this.handleColumnChange.bind(this);\n this.handleSettingsCancel = this.handleSettingsCancel.bind(this);\n this.handleSettingsClick = this.handleSettingsClick.bind(this);\n this.handleSettingsSave = this.handleSettingsSave.bind(this);\n this.handleBackgroundClick = this.handleBackgroundClick.bind(this);\n this.handleDropdownKeyPress = this.handleDropdownKeyPress.bind(this);\n this.handleValueChange = this.handleValueChange.bind(this);\n\n this.dropdownRef = React.createRef();\n\n const { column, isValueShown, value } = props;\n this.state = {\n column,\n selectedColumn: column,\n disableCancel: !isValueShown,\n isValueShown,\n value,\n };\n }\n\n componentDidUpdate(\n prevProps: DropdownFilterProps,\n prevState: DropdownFilterState\n ): void {\n const { source, values, isLoaded } = this.props;\n const { column, value, isValueShown } = this.state;\n\n if (isLoaded) {\n if (source !== prevProps.source) {\n this.sourceUpdated();\n }\n\n if (\n values !== prevProps.values &&\n value !== '' &&\n !values.includes(value)\n ) {\n // Value list loaded, but doesn't contain the current value\n this.resetValue();\n }\n\n if (isValueShown !== prevState.isValueShown) {\n if (isValueShown) {\n this.focusInput();\n }\n }\n\n if (\n column !== prevState.column ||\n value !== prevState.value ||\n isValueShown !== prevState.isValueShown\n ) {\n this.sendUpdate();\n }\n }\n }\n\n componentWillUnmount(): void {\n this.sendUpdate.flush();\n }\n\n dropdownRef: RefObject<HTMLSelectElement>;\n\n getCompatibleColumns = memoize(\n (source: LinkPoint, columns: DropdownFilterColumn[]) =>\n source != null\n ? columns.filter(\n ({ type }) =>\n type !== undefined &&\n TableUtils.isCompatibleType(type, source.columnType)\n )\n : []\n );\n\n getColumnOptions = memoize(\n (\n columns: DropdownFilterColumn[],\n selectedColumn: DropdownFilterColumn | null\n ): [JSX.Element[], number] => {\n let selectedIndex = -1;\n const options = [];\n options.push(\n <option key=\"placeholder\" value=\"-1\">\n Select a column\n </option>\n );\n columns.forEach((columnItem, index) => {\n options.push(\n <option key={`${columnItem.name}/${columnItem.type}`} value={index}>\n {this.getItemLabel(columns, index)}\n </option>\n );\n if (\n selectedColumn !== null &&\n columnItem.name === selectedColumn.name &&\n columnItem.type === selectedColumn.type\n ) {\n selectedIndex = index;\n }\n });\n return [options, selectedIndex];\n }\n );\n\n getSelectedOptionIndex = memoize(\n (values: (string | null)[], value: string | null) => values.indexOf(value)\n );\n\n getValueOptions = memoize((values: (string | null)[]) => [\n <option value=\"-1\" key=\"-1\">\n {DropdownFilter.PLACEHOLDER}\n </option>,\n ...values.map((val, index) => (\n <option\n value={index}\n // eslint-disable-next-line react/no-array-index-key\n key={`${index}/${val}`}\n >\n {val}\n </option>\n )),\n ]);\n\n getItemLabel = memoizee((columns, index) => {\n const { name, type } = columns[index];\n\n if (\n (index > 0 && columns[index - 1].name === name) ||\n (index < columns.length - 1 && columns[index + 1].name === name)\n ) {\n const shortType = type.substring(type.lastIndexOf('.') + 1);\n return `${name} (${shortType})`;\n }\n\n return name;\n });\n\n handleColumnChange(event: ChangeEvent<HTMLSelectElement>): void {\n const { value } = event.target;\n log.debug2('handleColumnChange', value);\n if (value != null && parseInt(value, 10) < 0) {\n this.setState({\n selectedColumn: null,\n });\n return;\n }\n const { columns: allColumns, source } = this.props;\n const columns = this.getCompatibleColumns(source, allColumns);\n this.setState({\n selectedColumn: columns[parseInt(value, 10)],\n });\n }\n\n handleDropdownKeyPress(event: KeyboardEvent<HTMLSelectElement>): void {\n if (event.key === 'Enter') {\n event.preventDefault();\n event.stopPropagation();\n\n log.debug2('handleDropdownKeyPress');\n\n this.sendUpdate();\n this.sendUpdate.flush();\n }\n }\n\n handleValueChange(event: ChangeEvent<HTMLSelectElement>): void {\n const { value: valueIndex } = event.target;\n const index = parseInt(valueIndex, 10);\n // Default empty string value for 'clear filter'\n let value: string | null = '';\n const { values } = this.props;\n if (index === -1) {\n log.debug2('Selected default item');\n } else if (index >= 0 && index < values.length) {\n value = values[index];\n } else {\n log.error('Invalid index', index, values);\n return;\n }\n\n log.debug2('handleValueChange', value);\n\n this.setState({ value });\n }\n\n handleSettingsCancel(): void {\n this.setState(({ column }) => ({\n selectedColumn: column,\n isValueShown: true,\n }));\n }\n\n handleSettingsSave(): void {\n this.setState(({ column, selectedColumn, value }) => ({\n column: selectedColumn,\n // Reset value if column changed\n value: column === selectedColumn ? value : '',\n isValueShown: true,\n disableCancel: false,\n }));\n }\n\n handleSettingsClick(event: MouseEvent<HTMLButtonElement>): void {\n event.stopPropagation();\n this.showSettings();\n }\n\n handleBackgroundClick(event: MouseEvent<HTMLDivElement>): void {\n // allow clicking anywhere in the background to select and focus the input\n if (event.target !== this.dropdownRef.current) {\n this.focusInput();\n }\n }\n\n handleMouseEnter(): void {\n const { onSourceMouseEnter } = this.props;\n onSourceMouseEnter();\n }\n\n handleMouseLeave(): void {\n const { onSourceMouseLeave } = this.props;\n onSourceMouseLeave();\n }\n\n sourceUpdated(): void {\n this.setState({\n column: null,\n selectedColumn: null,\n isValueShown: false,\n disableCancel: true,\n value: '',\n });\n }\n\n showSettings(): void {\n const { column } = this.state;\n this.setState({ selectedColumn: column, isValueShown: false });\n }\n\n focusInput(): void {\n if (this.dropdownRef.current !== null) {\n this.dropdownRef.current.focus();\n }\n }\n\n resetValue(): void {\n this.setState({ value: '' });\n }\n\n // Called by the parent component via ref\n clearFilter(): void {\n this.resetValue();\n }\n\n setFilterState({\n name,\n type,\n value,\n isValueShown,\n }: {\n name: string;\n type: string;\n value: string;\n isValueShown: boolean;\n }): void {\n const column = name != null && type != null ? { name, type } : null;\n this.setState({ column, value, isValueShown });\n }\n\n sendUpdate = debounce(() => {\n const { onChange } = this.props;\n const { column, value, isValueShown } = this.state;\n onChange({ column, isValueShown, value: value ?? undefined });\n }, UPDATE_DEBOUNCE);\n\n render(): ReactElement {\n const {\n columns: allColumns,\n disableLinking,\n isLinkerActive,\n isLoaded,\n source,\n onColumnSelected,\n onSourceMouseEnter,\n onSourceMouseLeave,\n values,\n settingsError,\n } = this.props;\n const {\n column,\n disableCancel,\n isValueShown,\n selectedColumn,\n value,\n } = this.state;\n const columnSelectionDisabled = source === null;\n const columns = this.getCompatibleColumns(source, allColumns);\n const isLinked = source != null;\n const sourceButtonLabel =\n source?.columnName ?? DropdownFilter.SOURCE_BUTTON_PLACEHOLDER;\n const filterTitle = column != null ? `${column.name} Filter` : null;\n const [columnOptions, selectedIndex] = this.getColumnOptions(\n columns,\n selectedColumn\n );\n const valueOptions = this.getValueOptions(values);\n const selectedOption = this.getSelectedOptionIndex(values, value);\n const disableSave = !isLinked || selectedColumn == null;\n\n const isFlipped = isValueShown && !isLinkerActive;\n\n return (\n <CardFlip\n className=\"dropdown-filter fill-parent-absolute\"\n isFlipped={isFlipped}\n >\n <div className=\"dropdown-filter-settings-card\">\n <div className=\"dropdown-filter-card-content\">\n <div className=\"dropdown-filter-settings-grid\">\n <label>Source Column</label>\n <SocketedButton\n isLinked={isLinked}\n onClick={onColumnSelected}\n onMouseEnter={onSourceMouseEnter}\n onMouseLeave={onSourceMouseLeave}\n className={DropdownFilter.SOURCE_BUTTON_CLASS_NAME}\n disabled={disableLinking}\n >\n {sourceButtonLabel}\n </SocketedButton>\n\n <div className=\"text-muted small\">\n Select a source column for the list by linking to a table.\n </div>\n\n <label>Filter Column</label>\n <select\n value={selectedIndex}\n className=\"custom-select\"\n onChange={this.handleColumnChange}\n disabled={columnSelectionDisabled}\n >\n {columnOptions}\n </select>\n <div className=\"text-muted small\">\n Dropdown filter control will apply its filter to all columns\n matching this name in this dashboard.\n </div>\n </div>\n {settingsError && (\n <div className=\"error-message text-center\">{settingsError}</div>\n )}\n {isLinked && (\n <div className=\"dropdown-filter-settings-buttons\">\n <Button\n kind=\"secondary\"\n type=\"button\"\n onClick={this.handleSettingsCancel}\n disabled={disableCancel || isValueShown || isLinkerActive}\n tooltip={\n isLinkerActive\n ? 'Cancel disabled while linker open'\n : undefined\n }\n >\n Cancel\n </Button>\n <Button\n kind=\"primary\"\n type=\"button\"\n className=\"ml-2\"\n onClick={this.handleSettingsSave}\n disabled={disableSave || isValueShown || isLinkerActive}\n tooltip={\n isLinkerActive\n ? 'Save disabled while linker open'\n : undefined\n }\n >\n Save\n </Button>\n </div>\n )}\n </div>\n </div>\n\n <div\n className=\"dropdown-filter-value-card\"\n onClick={this.handleBackgroundClick}\n >\n {isLoaded && (\n <>\n <div className=\"dropdown-filter-column\">\n <div className=\"dropdown-filter-column-title\">\n {filterTitle}\n </div>\n </div>\n <div className=\"dropdown-filter-card-content\">\n <div className=\"dropdown-filter-value-input d-flex flex-column justify-content-center\">\n <select\n className=\"custom-select\"\n value={selectedOption}\n ref={this.dropdownRef}\n onChange={this.handleValueChange}\n onKeyPress={this.handleDropdownKeyPress}\n >\n {valueOptions}\n </select>\n </div>\n {settingsError && (\n <div className=\"error-message mt-3 text-center\">\n {settingsError}\n </div>\n )}\n </div>\n <div className=\"dropdown-filter-menu\">\n <button\n type=\"button\"\n className=\"btn btn-link btn-link-icon m-2 px-2\"\n onClick={this.handleSettingsClick}\n >\n <FontAwesomeIcon icon={vsGear} transform=\"grow-4\" />\n </button>\n </div>\n </>\n )}\n </div>\n </CardFlip>\n );\n }\n}\n\nexport default DropdownFilter;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"InputFilter.d.ts","sourceRoot":"","sources":["../../../src/controls/input-filter/InputFilter.tsx"],"names":[],"mappings":"AAIA,OAAc,EACZ,WAAW,EACX,SAAS,EACT,SAAS,EACT,UAAU,EACV,aAAa,EACb,YAAY,EACb,MAAM,OAAO,CAAC;AAIf,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,QAAQ,MAAM,UAAU,CAAC;AAGhC,OAAO,oBAAoB,CAAC;AAK5B,oBAAY,iBAAiB,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;AAE9D,UAAU,gBAAgB;IACxB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE;QACjB,MAAM,CAAC,EAAE,iBAAiB,CAAC;QAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,KAAK,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,cAAc,CAAC,EAAE,iBAAiB,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,cAAM,WAAY,SAAQ,SAAS,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IACrE,MAAM,CAAC,WAAW,SAAoB;IAEtC,MAAM,CAAC,YAAY;;;;MAIjB;gBAEU,KAAK,EAAE,gBAAgB;IAsBnC,kBAAkB,CAChB,SAAS,EAAE,gBAAgB,EAC3B,SAAS,EAAE,gBAAgB,GAC1B,IAAI;IAsBP,oBAAoB,IAAI,IAAI;IAI5B,QAAQ,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAEtC,YAAY,6FAYT;IAEH,kBAAkB,CAAC,KAAK,EAAE,WAAW,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAU/D,mBAAmB,CAAC,KAAK,EAAE,aAAa,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAcjE,iBAAiB,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAQ7D,oBAAoB,IAAI,IAAI;IAK5B,kBAAkB,IAAI,IAAI;IAK1B,mBAAmB,CAAC,KAAK,EAAE,UAAU,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAM/D,qBAAqB,CAAC,KAAK,EAAE,UAAU,CAAC,cAAc,CAAC,GAAG,IAAI;IAO9D,UAAU,IAAI,IAAI;IAOlB,WAAW,IAAI,IAAI;IAInB,cAAc,CAAC,EACb,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,YAAY,GACb,EAAE;QACD,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,GAAG,IAAI;IASR,UAAU,6CAIU;IAEpB,MAAM,IAAI,YAAY;CA8GvB;AAED,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"InputFilter.d.ts","sourceRoot":"","sources":["../../../src/controls/input-filter/InputFilter.tsx"],"names":[],"mappings":"AAIA,OAAc,EACZ,WAAW,EACX,SAAS,EACT,SAAS,EACT,UAAU,EACV,aAAa,EACb,YAAY,EACb,MAAM,OAAO,CAAC;AAIf,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,QAAQ,MAAM,UAAU,CAAC;AAGhC,OAAO,oBAAoB,CAAC;AAK5B,oBAAY,iBAAiB,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;AAE9D,UAAU,gBAAgB;IACxB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE;QACjB,MAAM,CAAC,EAAE,iBAAiB,CAAC;QAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,KAAK,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,cAAc,CAAC,EAAE,iBAAiB,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,cAAM,WAAY,SAAQ,SAAS,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IACrE,MAAM,CAAC,WAAW,SAAoB;IAEtC,MAAM,CAAC,YAAY;;;;MAIjB;gBAEU,KAAK,EAAE,gBAAgB;IAsBnC,kBAAkB,CAChB,SAAS,EAAE,gBAAgB,EAC3B,SAAS,EAAE,gBAAgB,GAC1B,IAAI;IA0BP,oBAAoB,IAAI,IAAI;IAI5B,QAAQ,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAEtC,YAAY,6FAYT;IAEH,kBAAkB,CAAC,KAAK,EAAE,WAAW,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAU/D,mBAAmB,CAAC,KAAK,EAAE,aAAa,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAcjE,iBAAiB,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAQ7D,oBAAoB,IAAI,IAAI;IAK5B,kBAAkB,IAAI,IAAI;IAK1B,mBAAmB,CAAC,KAAK,EAAE,UAAU,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAM/D,qBAAqB,CAAC,KAAK,EAAE,UAAU,CAAC,cAAc,CAAC,GAAG,IAAI;IAO9D,UAAU,IAAI,IAAI;IAOlB,WAAW,IAAI,IAAI;IAInB,cAAc,CAAC,EACb,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,YAAY,GACb,EAAE;QACD,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,GAAG,IAAI;IASR,UAAU,6CAIU;IAEpB,MAAM,IAAI,YAAY;CA8GvB;AAED,eAAe,WAAW,CAAC"}
@@ -90,7 +90,7 @@ class InputFilter extends Component {
90
90
  });
91
91
  }
92
92
 
93
- if (isValueShown && isValueShown !== prevState.isValueShown) {
93
+ if (isValueShown !== undefined && isValueShown && isValueShown !== prevState.isValueShown) {
94
94
  this.focusInput();
95
95
  }
96
96
 
@@ -1 +1 @@
1
- {"version":3,"file":"InputFilter.js","names":["React","Component","CardFlip","FontAwesomeIcon","vsGear","memoizee","debounce","Log","log","module","UPDATE_DEBOUNCE","InputFilter","constructor","props","columns","index","name","type","length","shortType","substring","lastIndexOf","onChange","column","value","isValueShown","state","handleColumnChange","bind","handleInputKeyPress","handleValueChange","handleSettingsCancel","handleSettingsClick","handleSettingsSave","handleBackgroundClick","inputRef","createRef","selectedColumn","componentDidUpdate","prevProps","prevState","propColumn","setState","focusInput","sendUpdate","componentWillUnmount","flush","event","target","parseInt","debug2","undefined","key","preventDefault","stopPropagation","current","select","focus","clearFilter","setFilterState","update","render","inputLength","PLACEHOLDER","titleLabel","columnIndex","findIndex","item","getItemLabel","map","columnItem","width"],"sources":["../../../src/controls/input-filter/InputFilter.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/click-events-have-key-events */\n/* eslint-disable jsx-a11y/no-static-element-interactions */\n// background click is just a convience method, not an actual a11y issue\n\nimport React, {\n ChangeEvent,\n Component,\n RefObject,\n MouseEvent,\n KeyboardEvent,\n ReactElement,\n} from 'react';\nimport { CardFlip } from '@deephaven/components';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsGear } from '@deephaven/icons';\nimport { Column } from '@deephaven/jsapi-shim';\nimport memoizee from 'memoizee';\nimport debounce from 'lodash.debounce';\nimport Log from '@deephaven/log';\nimport './InputFilter.scss';\n\nconst log = Log.module('InputFilter');\nconst UPDATE_DEBOUNCE = 150;\n\nexport type InputFilterColumn = Pick<Column, 'type' | 'name'>;\n\ninterface InputFilterProps {\n columns: InputFilterColumn[];\n column: InputFilterColumn;\n isValueShown: boolean;\n value: string;\n onChange: (change: {\n column?: InputFilterColumn;\n isValueShown?: boolean;\n value?: string;\n }) => void;\n}\n\nexport interface InputFilterState {\n column?: InputFilterColumn;\n selectedColumn?: InputFilterColumn;\n value?: string;\n isValueShown?: boolean;\n}\n\nclass InputFilter extends Component<InputFilterProps, InputFilterState> {\n static PLACEHOLDER = 'Enter value...';\n\n static defaultProps = {\n column: null,\n isValueShown: false,\n value: null,\n };\n\n constructor(props: InputFilterProps) {\n super(props);\n\n this.handleColumnChange = this.handleColumnChange.bind(this);\n this.handleInputKeyPress = this.handleInputKeyPress.bind(this);\n this.handleValueChange = this.handleValueChange.bind(this);\n this.handleSettingsCancel = this.handleSettingsCancel.bind(this);\n this.handleSettingsClick = this.handleSettingsClick.bind(this);\n this.handleSettingsSave = this.handleSettingsSave.bind(this);\n this.handleBackgroundClick = this.handleBackgroundClick.bind(this);\n\n this.inputRef = React.createRef();\n\n const { column, isValueShown, value } = props;\n this.state = {\n column,\n selectedColumn: column,\n value,\n isValueShown,\n };\n }\n\n componentDidUpdate(\n prevProps: InputFilterProps,\n prevState: InputFilterState\n ): void {\n const { column: propColumn } = this.props;\n const { column, value, isValueShown } = this.state;\n\n if (propColumn !== prevProps.column) {\n // eslint-disable-next-line react/no-did-update-set-state\n this.setState({ column: propColumn, selectedColumn: propColumn });\n }\n\n if (isValueShown && isValueShown !== prevState.isValueShown) {\n this.focusInput();\n }\n\n if (\n column !== prevState.column ||\n value !== prevState.value ||\n isValueShown !== prevState.isValueShown\n ) {\n this.sendUpdate();\n }\n }\n\n componentWillUnmount(): void {\n this.sendUpdate.flush();\n }\n\n inputRef: RefObject<HTMLInputElement>;\n\n getItemLabel = memoizee((columns, index) => {\n const { name, type } = columns[index];\n\n if (\n (index > 0 && columns[index - 1].name === name) ||\n (index < columns.length - 1 && columns[index + 1].name === name)\n ) {\n const shortType = type.substring(type.lastIndexOf('.') + 1);\n return `${name} (${shortType})`;\n }\n\n return name;\n });\n\n handleColumnChange(event: ChangeEvent<HTMLSelectElement>): void {\n const { columns } = this.props;\n const { value } = event.target;\n const selectedColumn = columns[parseInt(value, 10)];\n\n log.debug2('handleColumnChange', selectedColumn);\n\n this.setState({ selectedColumn, value: undefined });\n }\n\n handleInputKeyPress(event: KeyboardEvent<HTMLInputElement>): void {\n if (event.key === 'Enter') {\n event.preventDefault();\n event.stopPropagation();\n this.setState(\n ({ value }) => (value == null ? { value: '' } : null),\n () => {\n this.sendUpdate();\n this.sendUpdate.flush();\n }\n );\n }\n }\n\n handleValueChange(event: ChangeEvent<HTMLInputElement>): void {\n const { value } = event.target;\n\n log.debug2('handleValueChange', value);\n\n this.setState({ value });\n }\n\n handleSettingsCancel(): void {\n const { column } = this.state;\n this.setState({ selectedColumn: column, isValueShown: true });\n }\n\n handleSettingsSave(): void {\n const { selectedColumn } = this.state;\n this.setState({ column: selectedColumn, isValueShown: true });\n }\n\n handleSettingsClick(event: MouseEvent<HTMLButtonElement>): void {\n const { column } = this.state;\n this.setState({ selectedColumn: column, isValueShown: false });\n event.stopPropagation();\n }\n\n handleBackgroundClick(event: MouseEvent<HTMLDivElement>): void {\n // allow clicking anywhere in the background to select and focus the input\n if (event.target !== this.inputRef.current) {\n this.focusInput();\n }\n }\n\n focusInput(): void {\n if (this.inputRef.current !== null) {\n this.inputRef.current.select();\n this.inputRef.current.focus();\n }\n }\n\n clearFilter(): void {\n this.setState({ value: '' });\n }\n\n setFilterState({\n name,\n type,\n value,\n isValueShown,\n }: {\n name?: string;\n type?: string;\n value?: string;\n isValueShown?: boolean;\n }): void {\n const column = name != null && type != null ? { name, type } : undefined;\n const update =\n isValueShown === undefined\n ? { column, value }\n : { column, value, isValueShown };\n this.setState(update);\n }\n\n sendUpdate = debounce(() => {\n const { onChange } = this.props;\n const { column, value, isValueShown } = this.state;\n onChange({ column, isValueShown, value });\n }, UPDATE_DEBOUNCE);\n\n render(): ReactElement {\n const { columns } = this.props;\n const { column, isValueShown, selectedColumn, value } = this.state;\n const inputLength =\n value == null || value.length === 0\n ? InputFilter.PLACEHOLDER.length\n : value.length;\n let titleLabel = null;\n if (column != null) {\n const columnIndex = columns.findIndex(\n item => item.name === column.name && item.type === column.type\n );\n titleLabel =\n columnIndex >= 0\n ? this.getItemLabel(columns, columnIndex)\n : column.name;\n }\n\n return (\n <CardFlip\n className=\"input-filter fill-parent-absolute\"\n isFlipped={isValueShown ?? false}\n >\n <div className=\"input-filter-settings-card\">\n <div className=\"input-filter-settings-content\">\n <div className=\"input-filter-settings-grid\">\n <label>Filter Column</label>\n <select\n value={columns.findIndex(\n item =>\n item.name === selectedColumn?.name &&\n item.type === selectedColumn?.type\n )}\n className=\"custom-select\"\n onChange={this.handleColumnChange}\n >\n {columns.map((columnItem, index) => (\n <option\n key={`${columnItem.name}/${columnItem.type}`}\n value={index}\n >\n {this.getItemLabel(columns, index)}\n </option>\n ))}\n {columns.length === 0 && (\n <option value=\"-1\" disabled>\n No Available Columns\n </option>\n )}\n </select>\n <div className=\"text-muted small\">\n Input filter control will apply its filter to all columns\n matching this name in this dashboard.\n </div>\n </div>\n <div className=\"input-filter-settings-buttons\">\n <button\n type=\"button\"\n className=\"btn btn-outline-primary\"\n onClick={this.handleSettingsCancel}\n disabled={column == null}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"btn btn-primary ml-2\"\n onClick={this.handleSettingsSave}\n disabled={selectedColumn == null}\n >\n Save\n </button>\n </div>\n </div>\n </div>\n\n <div\n className=\"input-filter-value-card\"\n onClick={this.handleBackgroundClick}\n >\n <div className=\"input-filter-column\">\n <div className=\"input-filter-column-title\">{titleLabel} Filter</div>\n </div>\n <div className=\"d-flex justify-content-center align-items-center h-100 w-100\">\n <div className=\"input-filter-value-input d-flex flex-column justify-content-center\">\n <input\n type=\"text\"\n ref={this.inputRef}\n placeholder={InputFilter.PLACEHOLDER}\n value={value ?? ''}\n onChange={this.handleValueChange}\n onKeyPress={this.handleInputKeyPress}\n style={{ width: `${inputLength + 3}ch` }}\n spellCheck=\"false\"\n />\n </div>\n </div>\n <div className=\"input-filter-menu\">\n <button\n type=\"button\"\n className=\"btn btn-link btn-link-icon m-2 px-2\"\n onClick={this.handleSettingsClick}\n >\n <FontAwesomeIcon icon={vsGear} transform=\"grow-4\" />\n </button>\n </div>\n </div>\n </CardFlip>\n );\n }\n}\n\nexport default InputFilter;\n"],"mappings":"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"}
1
+ {"version":3,"file":"InputFilter.js","names":["React","Component","CardFlip","FontAwesomeIcon","vsGear","memoizee","debounce","Log","log","module","UPDATE_DEBOUNCE","InputFilter","constructor","props","columns","index","name","type","length","shortType","substring","lastIndexOf","onChange","column","value","isValueShown","state","handleColumnChange","bind","handleInputKeyPress","handleValueChange","handleSettingsCancel","handleSettingsClick","handleSettingsSave","handleBackgroundClick","inputRef","createRef","selectedColumn","componentDidUpdate","prevProps","prevState","propColumn","setState","undefined","focusInput","sendUpdate","componentWillUnmount","flush","event","target","parseInt","debug2","key","preventDefault","stopPropagation","current","select","focus","clearFilter","setFilterState","update","render","inputLength","PLACEHOLDER","titleLabel","columnIndex","findIndex","item","getItemLabel","map","columnItem","width"],"sources":["../../../src/controls/input-filter/InputFilter.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/click-events-have-key-events */\n/* eslint-disable jsx-a11y/no-static-element-interactions */\n// background click is just a convience method, not an actual a11y issue\n\nimport React, {\n ChangeEvent,\n Component,\n RefObject,\n MouseEvent,\n KeyboardEvent,\n ReactElement,\n} from 'react';\nimport { CardFlip } from '@deephaven/components';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsGear } from '@deephaven/icons';\nimport { Column } from '@deephaven/jsapi-shim';\nimport memoizee from 'memoizee';\nimport debounce from 'lodash.debounce';\nimport Log from '@deephaven/log';\nimport './InputFilter.scss';\n\nconst log = Log.module('InputFilter');\nconst UPDATE_DEBOUNCE = 150;\n\nexport type InputFilterColumn = Pick<Column, 'type' | 'name'>;\n\ninterface InputFilterProps {\n columns: InputFilterColumn[];\n column: InputFilterColumn;\n isValueShown: boolean;\n value: string;\n onChange: (change: {\n column?: InputFilterColumn;\n isValueShown?: boolean;\n value?: string;\n }) => void;\n}\n\nexport interface InputFilterState {\n column?: InputFilterColumn;\n selectedColumn?: InputFilterColumn;\n value?: string;\n isValueShown?: boolean;\n}\n\nclass InputFilter extends Component<InputFilterProps, InputFilterState> {\n static PLACEHOLDER = 'Enter value...';\n\n static defaultProps = {\n column: null,\n isValueShown: false,\n value: null,\n };\n\n constructor(props: InputFilterProps) {\n super(props);\n\n this.handleColumnChange = this.handleColumnChange.bind(this);\n this.handleInputKeyPress = this.handleInputKeyPress.bind(this);\n this.handleValueChange = this.handleValueChange.bind(this);\n this.handleSettingsCancel = this.handleSettingsCancel.bind(this);\n this.handleSettingsClick = this.handleSettingsClick.bind(this);\n this.handleSettingsSave = this.handleSettingsSave.bind(this);\n this.handleBackgroundClick = this.handleBackgroundClick.bind(this);\n\n this.inputRef = React.createRef();\n\n const { column, isValueShown, value } = props;\n this.state = {\n column,\n selectedColumn: column,\n value,\n isValueShown,\n };\n }\n\n componentDidUpdate(\n prevProps: InputFilterProps,\n prevState: InputFilterState\n ): void {\n const { column: propColumn } = this.props;\n const { column, value, isValueShown } = this.state;\n\n if (propColumn !== prevProps.column) {\n // eslint-disable-next-line react/no-did-update-set-state\n this.setState({ column: propColumn, selectedColumn: propColumn });\n }\n\n if (\n isValueShown !== undefined &&\n isValueShown &&\n isValueShown !== prevState.isValueShown\n ) {\n this.focusInput();\n }\n\n if (\n column !== prevState.column ||\n value !== prevState.value ||\n isValueShown !== prevState.isValueShown\n ) {\n this.sendUpdate();\n }\n }\n\n componentWillUnmount(): void {\n this.sendUpdate.flush();\n }\n\n inputRef: RefObject<HTMLInputElement>;\n\n getItemLabel = memoizee((columns, index) => {\n const { name, type } = columns[index];\n\n if (\n (index > 0 && columns[index - 1].name === name) ||\n (index < columns.length - 1 && columns[index + 1].name === name)\n ) {\n const shortType = type.substring(type.lastIndexOf('.') + 1);\n return `${name} (${shortType})`;\n }\n\n return name;\n });\n\n handleColumnChange(event: ChangeEvent<HTMLSelectElement>): void {\n const { columns } = this.props;\n const { value } = event.target;\n const selectedColumn = columns[parseInt(value, 10)];\n\n log.debug2('handleColumnChange', selectedColumn);\n\n this.setState({ selectedColumn, value: undefined });\n }\n\n handleInputKeyPress(event: KeyboardEvent<HTMLInputElement>): void {\n if (event.key === 'Enter') {\n event.preventDefault();\n event.stopPropagation();\n this.setState(\n ({ value }) => (value == null ? { value: '' } : null),\n () => {\n this.sendUpdate();\n this.sendUpdate.flush();\n }\n );\n }\n }\n\n handleValueChange(event: ChangeEvent<HTMLInputElement>): void {\n const { value } = event.target;\n\n log.debug2('handleValueChange', value);\n\n this.setState({ value });\n }\n\n handleSettingsCancel(): void {\n const { column } = this.state;\n this.setState({ selectedColumn: column, isValueShown: true });\n }\n\n handleSettingsSave(): void {\n const { selectedColumn } = this.state;\n this.setState({ column: selectedColumn, isValueShown: true });\n }\n\n handleSettingsClick(event: MouseEvent<HTMLButtonElement>): void {\n const { column } = this.state;\n this.setState({ selectedColumn: column, isValueShown: false });\n event.stopPropagation();\n }\n\n handleBackgroundClick(event: MouseEvent<HTMLDivElement>): void {\n // allow clicking anywhere in the background to select and focus the input\n if (event.target !== this.inputRef.current) {\n this.focusInput();\n }\n }\n\n focusInput(): void {\n if (this.inputRef.current !== null) {\n this.inputRef.current.select();\n this.inputRef.current.focus();\n }\n }\n\n clearFilter(): void {\n this.setState({ value: '' });\n }\n\n setFilterState({\n name,\n type,\n value,\n isValueShown,\n }: {\n name?: string;\n type?: string;\n value?: string;\n isValueShown?: boolean;\n }): void {\n const column = name != null && type != null ? { name, type } : undefined;\n const update =\n isValueShown === undefined\n ? { column, value }\n : { column, value, isValueShown };\n this.setState(update);\n }\n\n sendUpdate = debounce(() => {\n const { onChange } = this.props;\n const { column, value, isValueShown } = this.state;\n onChange({ column, isValueShown, value });\n }, UPDATE_DEBOUNCE);\n\n render(): ReactElement {\n const { columns } = this.props;\n const { column, isValueShown, selectedColumn, value } = this.state;\n const inputLength =\n value == null || value.length === 0\n ? InputFilter.PLACEHOLDER.length\n : value.length;\n let titleLabel = null;\n if (column != null) {\n const columnIndex = columns.findIndex(\n item => item.name === column.name && item.type === column.type\n );\n titleLabel =\n columnIndex >= 0\n ? this.getItemLabel(columns, columnIndex)\n : column.name;\n }\n\n return (\n <CardFlip\n className=\"input-filter fill-parent-absolute\"\n isFlipped={isValueShown ?? false}\n >\n <div className=\"input-filter-settings-card\">\n <div className=\"input-filter-settings-content\">\n <div className=\"input-filter-settings-grid\">\n <label>Filter Column</label>\n <select\n value={columns.findIndex(\n item =>\n item.name === selectedColumn?.name &&\n item.type === selectedColumn?.type\n )}\n className=\"custom-select\"\n onChange={this.handleColumnChange}\n >\n {columns.map((columnItem, index) => (\n <option\n key={`${columnItem.name}/${columnItem.type}`}\n value={index}\n >\n {this.getItemLabel(columns, index)}\n </option>\n ))}\n {columns.length === 0 && (\n <option value=\"-1\" disabled>\n No Available Columns\n </option>\n )}\n </select>\n <div className=\"text-muted small\">\n Input filter control will apply its filter to all columns\n matching this name in this dashboard.\n </div>\n </div>\n <div className=\"input-filter-settings-buttons\">\n <button\n type=\"button\"\n className=\"btn btn-outline-primary\"\n onClick={this.handleSettingsCancel}\n disabled={column == null}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"btn btn-primary ml-2\"\n onClick={this.handleSettingsSave}\n disabled={selectedColumn == null}\n >\n Save\n </button>\n </div>\n </div>\n </div>\n\n <div\n className=\"input-filter-value-card\"\n onClick={this.handleBackgroundClick}\n >\n <div className=\"input-filter-column\">\n <div className=\"input-filter-column-title\">{titleLabel} Filter</div>\n </div>\n <div className=\"d-flex justify-content-center align-items-center h-100 w-100\">\n <div className=\"input-filter-value-input d-flex flex-column justify-content-center\">\n <input\n type=\"text\"\n ref={this.inputRef}\n placeholder={InputFilter.PLACEHOLDER}\n value={value ?? ''}\n onChange={this.handleValueChange}\n onKeyPress={this.handleInputKeyPress}\n style={{ width: `${inputLength + 3}ch` }}\n spellCheck=\"false\"\n />\n </div>\n </div>\n <div className=\"input-filter-menu\">\n <button\n type=\"button\"\n className=\"btn btn-link btn-link-icon m-2 px-2\"\n onClick={this.handleSettingsClick}\n >\n <FontAwesomeIcon icon={vsGear} transform=\"grow-4\" />\n </button>\n </div>\n </div>\n </CardFlip>\n );\n }\n}\n\nexport default InputFilter;\n"],"mappings":"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"}