@deephaven/dashboard-core-plugins 0.22.3-beta.18 → 0.22.3-beta.21

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 (166) hide show
  1. package/dist/ChartBuilderPlugin.d.ts +1 -1
  2. package/dist/ChartBuilderPlugin.d.ts.map +1 -1
  3. package/dist/ChartBuilderPlugin.js +6 -8
  4. package/dist/ChartBuilderPlugin.js.map +1 -1
  5. package/dist/ChartPlugin.d.ts +1 -1
  6. package/dist/ChartPlugin.d.ts.map +1 -1
  7. package/dist/ChartPlugin.js +4 -8
  8. package/dist/ChartPlugin.js.map +1 -1
  9. package/dist/ConsolePlugin.d.ts +1 -1
  10. package/dist/ConsolePlugin.d.ts.map +1 -1
  11. package/dist/ConsolePlugin.js +16 -62
  12. package/dist/ConsolePlugin.js.map +1 -1
  13. package/dist/FilterPlugin.d.ts +1 -1
  14. package/dist/FilterPlugin.d.ts.map +1 -1
  15. package/dist/FilterPlugin.js +6 -13
  16. package/dist/FilterPlugin.js.map +1 -1
  17. package/dist/GridPlugin.d.ts +1 -1
  18. package/dist/GridPlugin.d.ts.map +1 -1
  19. package/dist/GridPlugin.js +4 -8
  20. package/dist/GridPlugin.js.map +1 -1
  21. package/dist/LinkerPlugin.d.ts +1 -1
  22. package/dist/LinkerPlugin.d.ts.map +1 -1
  23. package/dist/LinkerPlugin.js +2 -2
  24. package/dist/LinkerPlugin.js.map +1 -1
  25. package/dist/MarkdownPlugin.d.ts +1 -1
  26. package/dist/MarkdownPlugin.d.ts.map +1 -1
  27. package/dist/MarkdownPlugin.js +4 -8
  28. package/dist/MarkdownPlugin.js.map +1 -1
  29. package/dist/PandasPlugin.d.ts +1 -1
  30. package/dist/PandasPlugin.d.ts.map +1 -1
  31. package/dist/PandasPlugin.js +4 -8
  32. package/dist/PandasPlugin.js.map +1 -1
  33. package/dist/controls/ControlType.js +0 -6
  34. package/dist/controls/ControlType.js.map +1 -1
  35. package/dist/controls/dropdown-filter/DropdownFilter.js +7 -51
  36. package/dist/controls/dropdown-filter/DropdownFilter.js.map +1 -1
  37. package/dist/controls/input-filter/InputFilter.js +1 -31
  38. package/dist/controls/input-filter/InputFilter.js.map +1 -1
  39. package/dist/controls/markdown/MarkdownContainer.js +0 -3
  40. package/dist/controls/markdown/MarkdownContainer.js.map +1 -1
  41. package/dist/controls/markdown/MarkdownEditor.d.ts +0 -2
  42. package/dist/controls/markdown/MarkdownEditor.d.ts.map +1 -1
  43. package/dist/controls/markdown/MarkdownEditor.js +13 -20
  44. package/dist/controls/markdown/MarkdownEditor.js.map +1 -1
  45. package/dist/controls/markdown/MarkdownStartPage.js +0 -11
  46. package/dist/controls/markdown/MarkdownStartPage.js.map +1 -1
  47. package/dist/controls/markdown/MarkdownUtils.js +0 -7
  48. package/dist/controls/markdown/MarkdownUtils.js.map +1 -1
  49. package/dist/events/ChartEvent.js +0 -5
  50. package/dist/events/ChartEvent.js.map +1 -1
  51. package/dist/events/ConsoleEvent.js +0 -7
  52. package/dist/events/ConsoleEvent.js.map +1 -1
  53. package/dist/events/InputFilterEvent.js +0 -10
  54. package/dist/events/InputFilterEvent.js.map +1 -1
  55. package/dist/events/IrisGridEvent.js +0 -8
  56. package/dist/events/IrisGridEvent.js.map +1 -1
  57. package/dist/events/MarkdownEvent.js.map +1 -1
  58. package/dist/events/NotebookEvent.js +0 -10
  59. package/dist/events/NotebookEvent.js.map +1 -1
  60. package/dist/events/PQEvent.js +0 -5
  61. package/dist/events/PQEvent.js.map +1 -1
  62. package/dist/events/PandasEvent.js +0 -4
  63. package/dist/events/PandasEvent.js.map +1 -1
  64. package/dist/events/TabEvent.js +0 -8
  65. package/dist/events/TabEvent.js.map +1 -1
  66. package/dist/events/index.js.map +1 -1
  67. package/dist/index.js.map +1 -1
  68. package/dist/linker/Linker.d.ts +3 -0
  69. package/dist/linker/Linker.d.ts.map +1 -1
  70. package/dist/linker/Linker.js +70 -119
  71. package/dist/linker/Linker.js.map +1 -1
  72. package/dist/linker/LinkerLink.css +90 -25
  73. package/dist/linker/LinkerLink.css.map +1 -1
  74. package/dist/linker/LinkerLink.d.ts +20 -2
  75. package/dist/linker/LinkerLink.d.ts.map +1 -1
  76. package/dist/linker/LinkerLink.js +214 -23
  77. package/dist/linker/LinkerLink.js.map +1 -1
  78. package/dist/linker/LinkerOverlayContent.css +0 -4
  79. package/dist/linker/LinkerOverlayContent.css.map +1 -1
  80. package/dist/linker/LinkerOverlayContent.d.ts +11 -0
  81. package/dist/linker/LinkerOverlayContent.d.ts.map +1 -1
  82. package/dist/linker/LinkerOverlayContent.js +78 -33
  83. package/dist/linker/LinkerOverlayContent.js.map +1 -1
  84. package/dist/linker/LinkerUtils.d.ts +9 -2
  85. package/dist/linker/LinkerUtils.d.ts.map +1 -1
  86. package/dist/linker/LinkerUtils.js +9 -25
  87. package/dist/linker/LinkerUtils.js.map +1 -1
  88. package/dist/linker/ToolType.js.map +1 -1
  89. package/dist/panels/ChartColumnSelectorOverlay.d.ts +5 -5
  90. package/dist/panels/ChartColumnSelectorOverlay.d.ts.map +1 -1
  91. package/dist/panels/ChartColumnSelectorOverlay.js +4 -7
  92. package/dist/panels/ChartColumnSelectorOverlay.js.map +1 -1
  93. package/dist/panels/ChartFilterOverlay.d.ts +4 -4
  94. package/dist/panels/ChartFilterOverlay.d.ts.map +1 -1
  95. package/dist/panels/ChartFilterOverlay.js +2 -7
  96. package/dist/panels/ChartFilterOverlay.js.map +1 -1
  97. package/dist/panels/ChartPanel.d.ts.map +1 -1
  98. package/dist/panels/ChartPanel.js +11 -150
  99. package/dist/panels/ChartPanel.js.map +1 -1
  100. package/dist/panels/CommandHistoryPanel.d.ts.map +1 -1
  101. package/dist/panels/CommandHistoryPanel.js +1 -26
  102. package/dist/panels/CommandHistoryPanel.js.map +1 -1
  103. package/dist/panels/ConsolePanel.d.ts.map +1 -1
  104. package/dist/panels/ConsolePanel.js +12 -57
  105. package/dist/panels/ConsolePanel.js.map +1 -1
  106. package/dist/panels/DropdownFilterPanel.d.ts.map +1 -1
  107. package/dist/panels/DropdownFilterPanel.js +16 -122
  108. package/dist/panels/DropdownFilterPanel.js.map +1 -1
  109. package/dist/panels/FileExplorerPanel.js +4 -33
  110. package/dist/panels/FileExplorerPanel.js.map +1 -1
  111. package/dist/panels/FilterSetManager.d.ts.map +1 -1
  112. package/dist/panels/FilterSetManager.js +13 -86
  113. package/dist/panels/FilterSetManager.js.map +1 -1
  114. package/dist/panels/FilterSetManagerPanel.js +10 -64
  115. package/dist/panels/FilterSetManagerPanel.js.map +1 -1
  116. package/dist/panels/InputFilterPanel.d.ts.map +1 -1
  117. package/dist/panels/InputFilterPanel.js +8 -38
  118. package/dist/panels/InputFilterPanel.js.map +1 -1
  119. package/dist/panels/IrisGridPanel.d.ts.map +1 -1
  120. package/dist/panels/IrisGridPanel.js +24 -133
  121. package/dist/panels/IrisGridPanel.js.map +1 -1
  122. package/dist/panels/IrisGridPanelTooltip.d.ts +5 -5
  123. package/dist/panels/IrisGridPanelTooltip.d.ts.map +1 -1
  124. package/dist/panels/IrisGridPanelTooltip.js +2 -5
  125. package/dist/panels/IrisGridPanelTooltip.js.map +1 -1
  126. package/dist/panels/LogPanel.js +4 -22
  127. package/dist/panels/LogPanel.js.map +1 -1
  128. package/dist/panels/MarkdownNotebook.js +3 -30
  129. package/dist/panels/MarkdownNotebook.js.map +1 -1
  130. package/dist/panels/MarkdownPanel.js +2 -30
  131. package/dist/panels/MarkdownPanel.js.map +1 -1
  132. package/dist/panels/MockFileStorage.js +1 -14
  133. package/dist/panels/MockFileStorage.js.map +1 -1
  134. package/dist/panels/MockFileStorageTable.js +11 -30
  135. package/dist/panels/MockFileStorageTable.js.map +1 -1
  136. package/dist/panels/NotebookPanel.js +24 -182
  137. package/dist/panels/NotebookPanel.js.map +1 -1
  138. package/dist/panels/PandasPanel.js +1 -20
  139. package/dist/panels/PandasPanel.js.map +1 -1
  140. package/dist/panels/Panel.js +2 -38
  141. package/dist/panels/Panel.js.map +1 -1
  142. package/dist/panels/PanelContextMenu.js +7 -29
  143. package/dist/panels/PanelContextMenu.js.map +1 -1
  144. package/dist/panels/RenameDialog.js +2 -17
  145. package/dist/panels/RenameDialog.js.map +1 -1
  146. package/dist/panels/WidgetPanel.js +2 -20
  147. package/dist/panels/WidgetPanel.js.map +1 -1
  148. package/dist/panels/WidgetPanelTooltip.d.ts +5 -5
  149. package/dist/panels/WidgetPanelTooltip.d.ts.map +1 -1
  150. package/dist/panels/WidgetPanelTooltip.js +2 -4
  151. package/dist/panels/WidgetPanelTooltip.js.map +1 -1
  152. package/dist/panels/index.js.map +1 -1
  153. package/dist/prop-types/CommonPropTypes.js +0 -3
  154. package/dist/prop-types/CommonPropTypes.js.map +1 -1
  155. package/dist/prop-types/UIPropTypes.js.map +1 -1
  156. package/dist/prop-types/index.js.map +1 -1
  157. package/dist/redux/actionTypes.js.map +1 -1
  158. package/dist/redux/actions.js +8 -9
  159. package/dist/redux/actions.js.map +1 -1
  160. package/dist/redux/index.js.map +1 -1
  161. package/dist/redux/reducers/connection.js.map +1 -1
  162. package/dist/redux/reducers/index.js.map +1 -1
  163. package/dist/redux/reducers/sessionWrapper.js.map +1 -1
  164. package/dist/redux/selectors.js +10 -15
  165. package/dist/redux/selectors.js.map +1 -1
  166. package/package.json +21 -20
@@ -1 +1 @@
1
- {"version":3,"file":"FilterSetManager.js","names":["React","Component","memoizeOne","shortid","FontAwesomeIcon","vsEdit","vsGear","vsSave","vsCircleSlash","vsTrash","vsDeviceCamera","dhRefresh","dhNewCircleLargeFilled","vsCircleLargeFilled","vsArrowSmallUp","Log","Button","CardFlip","RadioGroup","RadioItem","log","module","NAME_INPUT_PLACEHOLDER","EMPTY_LIST_PLACEHOLDER","FilterSetManager","animateScreenFlash","overlay","document","createElement","classList","add","addEventListener","remove","querySelector","appendChild","constructor","props","createRef","filterSets","renameSet","undefined","some","id","handleSettingsCancel","bind","handleSettingsClick","handleSettingsSave","handleBackgroundClick","handleEditDropdownChange","handleFilterChange","handleFilterApply","handleCaptureNewSet","handleNameInputChange","handleNameInputKeyPress","handleRenameConfirm","handleRenameCancel","handleRestoreFullStateChange","handleSetDelete","handleSetEdit","handleSetUpdate","state","editId","nameInputValue","nameInputError","modifiedFilterSets","restoreFullState","componentDidMount","isValueShown","updateSelectedId","initSettingsScreen","componentDidUpdate","prevProps","prevState","isNameInputScreen","focusRenameInput","length","onChange","selectedId","debug","setState","isEmptyList","event","value","target","applyFilterSet","onUpdateSets","getFilterState","panels","title","getNameError","trimmedName","trim","error","namedFilterSet","selectedIndex","findIndex","updatedModifiedFilterSets","push","prevFilterSets","filter","newSelectedIndex","Math","max","min","newSelectedId","selectedSetIndex","selectedSet","find","stopPropagation","dropdownRef","current","focusInput","key","preventDefault","onApply","filterSet","focus","renameInputRef","render","isRenamingExistingSet","isEmptyEditList","isInitialScreen","isEditListScreen","captureSetIcon","updateSetIcon","editDropdownRef","map"],"sources":["../../src/panels/FilterSetManager.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 ReactNode,\n KeyboardEvent,\n MouseEvent,\n} from 'react';\nimport memoizeOne from 'memoize-one';\nimport shortid from 'shortid';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n vsEdit,\n vsGear,\n vsSave,\n vsCircleSlash,\n vsTrash,\n vsDeviceCamera,\n dhRefresh,\n dhNewCircleLargeFilled,\n vsCircleLargeFilled,\n vsArrowSmallUp,\n} from '@deephaven/icons';\nimport Log from '@deephaven/log';\nimport { Button, CardFlip, RadioGroup, RadioItem } from '@deephaven/components';\n\nimport './FilterSetManager.scss';\n\nconst log = Log.module('FilterSetManager');\n\nexport interface FilterSetPanel {\n panelId?: string | string[] | null;\n type: string;\n id?: string;\n state: unknown;\n}\n\nexport interface FilterSet {\n id: string;\n title: string;\n panels: FilterSetPanel[];\n restoreFullState?: boolean;\n}\n\nexport interface ChangeHandlerArgs {\n isValueShown: boolean;\n selectedId?: string;\n}\n\ninterface FilterSetManagerProps {\n isValueShown: boolean;\n selectedId?: string;\n filterSets: FilterSet[];\n getFilterState(): FilterSetPanel[];\n onChange(args: ChangeHandlerArgs): void;\n onApply(filterSet: FilterSet): void;\n onUpdateSets(filterSets: FilterSet[], editId?: string): void;\n}\n\ninterface FilterSetManagerState {\n nameInputValue: string;\n nameInputError?: string;\n editId?: string;\n renameSet?: FilterSet;\n // Unsaved set changes on the settings screen\n modifiedFilterSets: FilterSet[];\n restoreFullState: boolean;\n}\n\nconst NAME_INPUT_PLACEHOLDER = 'Enter name...';\n\nconst EMPTY_LIST_PLACEHOLDER = 'No Available Filter Sets';\n\nclass FilterSetManager extends Component<\n FilterSetManagerProps,\n FilterSetManagerState\n> {\n static animateScreenFlash(): void {\n const overlay = document.createElement('div');\n overlay.classList.add('screen-flash-overlay');\n overlay.addEventListener('animationend', () => {\n // Removing the element removes its event listeners\n overlay.remove();\n });\n document.querySelector('body')?.appendChild(overlay);\n }\n\n constructor(props: FilterSetManagerProps) {\n super(props);\n\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.handleEditDropdownChange = this.handleEditDropdownChange.bind(this);\n this.handleFilterChange = this.handleFilterChange.bind(this);\n this.handleFilterApply = this.handleFilterApply.bind(this);\n this.handleCaptureNewSet = this.handleCaptureNewSet.bind(this);\n this.handleNameInputChange = this.handleNameInputChange.bind(this);\n this.handleNameInputKeyPress = this.handleNameInputKeyPress.bind(this);\n this.handleRenameConfirm = this.handleRenameConfirm.bind(this);\n this.handleRenameCancel = this.handleRenameCancel.bind(this);\n this.handleRestoreFullStateChange = this.handleRestoreFullStateChange.bind(\n this\n );\n\n this.handleSetDelete = this.handleSetDelete.bind(this);\n this.handleSetEdit = this.handleSetEdit.bind(this);\n this.handleSetUpdate = this.handleSetUpdate.bind(this);\n\n this.state = {\n editId: undefined,\n renameSet: undefined,\n nameInputValue: '',\n nameInputError: undefined,\n modifiedFilterSets: [],\n restoreFullState: false,\n };\n }\n\n componentDidMount(): void {\n const { isValueShown } = this.props;\n if (isValueShown) {\n this.updateSelectedId();\n } else {\n this.initSettingsScreen();\n }\n }\n\n componentDidUpdate(\n prevProps: FilterSetManagerProps,\n prevState: FilterSetManagerState\n ): void {\n const { isValueShown, filterSets } = this.props;\n const { modifiedFilterSets } = this.state;\n\n if (prevProps.isValueShown && !isValueShown) {\n this.initSettingsScreen();\n }\n\n if (this.isNameInputScreen() && !this.isNameInputScreen(prevState)) {\n this.focusRenameInput();\n }\n\n if (filterSets !== prevProps.filterSets) {\n if (\n !isValueShown &&\n filterSets.length > 0 &&\n prevProps.filterSets.length === 0 &&\n modifiedFilterSets.length === 0\n ) {\n // Filter set added from another panel, flip from the settings side/initial screen to the value side\n const { onChange } = this.props;\n onChange({ isValueShown: true, selectedId: filterSets[0].id });\n } else {\n this.updateSelectedId();\n }\n }\n }\n\n private renameInputRef = React.createRef<HTMLInputElement>();\n\n private dropdownRef = React.createRef<HTMLSelectElement>();\n\n private editDropdownRef = React.createRef<HTMLSelectElement>();\n\n initSettingsScreen(): void {\n const { filterSets, selectedId } = this.props;\n log.debug('initSettingsScreen', filterSets, selectedId);\n this.setState({\n modifiedFilterSets: [...filterSets],\n editId: selectedId,\n });\n }\n\n // Update selected id without applying the new set on filterSets change\n updateSelectedId(): void {\n const { isValueShown, filterSets, selectedId, onChange } = this.props;\n log.debug('updateSelectedId', filterSets, selectedId);\n if (!isValueShown) {\n return;\n }\n if (!filterSets.some(({ id }) => id === selectedId)) {\n // Update the selection if selectedId doesn't exist in the list\n // Flip to the settings side for empty list to show the initial screen\n const isEmptyList = filterSets.length === 0;\n onChange({\n isValueShown: !isEmptyList,\n selectedId: isEmptyList ? undefined : filterSets[0].id,\n });\n }\n }\n\n handleEditDropdownChange(event: ChangeEvent<HTMLSelectElement>): void {\n const { value: editId } = event.target;\n this.setState({ editId });\n }\n\n handleFilterChange(event: ChangeEvent<HTMLSelectElement>): void {\n const { value: selectedId } = event.target;\n const { isValueShown, onChange } = this.props;\n this.applyFilterSet(selectedId);\n onChange({ isValueShown, selectedId });\n }\n\n handleFilterApply(): void {\n const { selectedId } = this.props;\n this.applyFilterSet(selectedId);\n }\n\n handleSettingsCancel(): void {\n const { onChange, selectedId, filterSets } = this.props;\n this.setState({ modifiedFilterSets: [] });\n // Flip the card to the filter set selection screen if the sets list isn't empty\n // Otherwise show the initial screen\n if (filterSets.length > 0) {\n onChange({ isValueShown: true, selectedId });\n }\n }\n\n handleSettingsSave(): void {\n const { onChange, onUpdateSets } = this.props;\n const { modifiedFilterSets, editId } = this.state;\n this.setState({ modifiedFilterSets: [] });\n log.debug('Update sets', modifiedFilterSets, editId);\n onUpdateSets(modifiedFilterSets);\n // Don't flip the card to the filter set selection screen if the updated sets list is empty\n if (modifiedFilterSets.length > 0) {\n onChange({ isValueShown: true, selectedId: editId });\n }\n }\n\n handleCaptureNewSet(): void {\n const { getFilterState } = this.props;\n FilterSetManager.animateScreenFlash();\n const id = shortid();\n const panels = getFilterState();\n const renameSet = {\n id,\n title: '',\n panels,\n };\n log.debug('handleSetCreate', renameSet);\n this.setState({ nameInputValue: '', nameInputError: undefined, renameSet });\n }\n\n handleRenameCancel(): void {\n this.setState({ renameSet: undefined });\n }\n\n handleRestoreFullStateChange(event: ChangeEvent<HTMLInputElement>): void {\n this.setState({\n restoreFullState: event.target.value === 'true',\n });\n }\n\n getNameError(nameInputValue: string): string | undefined {\n const { renameSet, modifiedFilterSets } = this.state;\n const trimmedName = nameInputValue?.trim() ?? '';\n if (trimmedName.length === 0) {\n log.debug('Name cannot be empty', trimmedName);\n return 'Name cannot be empty';\n }\n\n if (\n renameSet !== undefined &&\n modifiedFilterSets.some(\n ({ title, id }) => title === trimmedName && id !== renameSet.id\n )\n ) {\n log.debug('Set with this name already exists', trimmedName);\n return 'Set with this name already exists';\n }\n\n return undefined;\n }\n\n handleRenameConfirm(): void {\n const {\n nameInputValue,\n renameSet,\n modifiedFilterSets,\n restoreFullState,\n } = this.state;\n if (renameSet === undefined) {\n log.error('Renamed set undefined.');\n return;\n }\n const nameInputError = this.getNameError(nameInputValue);\n log.debug('handleRenameConfirm', nameInputValue, nameInputError);\n if (nameInputError !== undefined) {\n this.setState({ nameInputError });\n return;\n }\n const trimmedName = nameInputValue?.trim() ?? '';\n const namedFilterSet = {\n ...renameSet,\n title: trimmedName,\n restoreFullState,\n };\n const selectedIndex = modifiedFilterSets.findIndex(\n ({ id }) => id === renameSet.id\n );\n const updatedModifiedFilterSets = [...modifiedFilterSets];\n\n if (selectedIndex >= 0) {\n updatedModifiedFilterSets[selectedIndex] = namedFilterSet;\n log.debug('Renamed existing set', updatedModifiedFilterSets);\n } else {\n updatedModifiedFilterSets.push(namedFilterSet);\n log.debug('Added new set to modified sets', updatedModifiedFilterSets);\n }\n\n this.setState({\n editId: namedFilterSet.id,\n modifiedFilterSets: updatedModifiedFilterSets,\n renameSet: undefined,\n });\n }\n\n handleSetDelete(): void {\n this.setState(state => {\n const { editId, modifiedFilterSets: prevFilterSets } = state;\n const selectedIndex = prevFilterSets.findIndex(({ id }) => id === editId);\n if (selectedIndex < 0) {\n log.error(\n 'Unable to find selected filterSet index',\n prevFilterSets,\n editId\n );\n return null;\n }\n const modifiedFilterSets = prevFilterSets.filter(\n ({ id }) => id !== editId\n );\n const newSelectedIndex = Math.max(\n 0,\n Math.min(modifiedFilterSets.length - 1, selectedIndex - 1)\n );\n const newSelectedId =\n modifiedFilterSets.length > 0\n ? modifiedFilterSets[newSelectedIndex].id\n : undefined;\n log.debug(\n 'Deleted selected set',\n editId,\n prevFilterSets,\n modifiedFilterSets\n );\n log.debug('New selection', newSelectedIndex, newSelectedId);\n return {\n modifiedFilterSets,\n editId: newSelectedId,\n };\n });\n }\n\n handleSetUpdate(): void {\n const { getFilterState } = this.props;\n FilterSetManager.animateScreenFlash();\n const panels = getFilterState();\n this.setState(({ modifiedFilterSets: prevFilterSets, editId }) => {\n if (editId === undefined) {\n log.error('Filter for update not selected.');\n return null;\n }\n const modifiedFilterSets = [...prevFilterSets];\n const selectedSetIndex = modifiedFilterSets.findIndex(\n ({ id }) => id === editId\n );\n if (selectedSetIndex < 0) {\n log.error('Selected set for update not found.');\n return null;\n }\n // Clone selected set to avoid mutation of the props\n modifiedFilterSets[selectedSetIndex] = {\n ...modifiedFilterSets[selectedSetIndex],\n panels,\n };\n\n log.debug('Update set', modifiedFilterSets, panels);\n return {\n modifiedFilterSets,\n };\n });\n }\n\n handleSetEdit(): void {\n this.setState(({ editId, modifiedFilterSets }) => {\n const selectedSet = modifiedFilterSets.find(({ id }) => id === editId);\n if (selectedSet === undefined) {\n log.error('Could not find selected set', editId, modifiedFilterSets);\n return null;\n }\n const { title, restoreFullState = false } = selectedSet;\n return {\n nameInputValue: title,\n nameInputError: undefined,\n renameSet: selectedSet,\n restoreFullState,\n };\n });\n }\n\n handleSettingsClick(event: MouseEvent): void {\n event.stopPropagation();\n const { onChange, selectedId } = this.props;\n onChange({ isValueShown: false, selectedId });\n }\n\n handleBackgroundClick(event: MouseEvent): void {\n log.debug('handleBackgroundClick');\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 handleNameInputChange(event: ChangeEvent<HTMLInputElement>): void {\n const { value: nameInputValue } = event.target;\n const nameInputError = this.getNameError(nameInputValue);\n this.setState({ nameInputValue, nameInputError });\n }\n\n handleNameInputKeyPress(event: KeyboardEvent): void {\n const { key } = event;\n if (key === 'Enter') {\n event.preventDefault();\n this.handleRenameConfirm();\n }\n }\n\n isNameInputScreen(state = this.state): boolean {\n const { renameSet } = state;\n return renameSet !== undefined;\n }\n\n isRenamingExistingSet = memoizeOne(\n (filterSets: FilterSet[], renameSet?: FilterSet): boolean =>\n renameSet !== undefined &&\n filterSets.some(({ id }) => id === renameSet.id)\n );\n\n applyFilterSet(selectedId?: string): void {\n const { onApply, filterSets } = this.props;\n if (selectedId === undefined) {\n log.debug('No filter selected');\n return;\n }\n const filterSet = filterSets.find(({ id }) => id === selectedId);\n if (filterSet === undefined) {\n log.debug('Selected id not found in filterSets', selectedId, filterSets);\n return;\n }\n log.debug('Apply filterSet', filterSet);\n onApply(filterSet);\n }\n\n focusInput(): void {\n this.dropdownRef.current?.focus();\n }\n\n focusRenameInput(): void {\n this.renameInputRef.current?.focus();\n }\n\n render(): ReactNode {\n const {\n nameInputValue,\n nameInputError,\n editId,\n renameSet,\n modifiedFilterSets,\n restoreFullState,\n } = this.state;\n const { isValueShown, filterSets, selectedId } = this.props;\n const isNameInputScreen = this.isNameInputScreen();\n const isRenamingExistingSet = this.isRenamingExistingSet(\n modifiedFilterSets,\n renameSet\n );\n const isEmptyEditList = modifiedFilterSets.length === 0;\n const isInitialScreen =\n !isNameInputScreen && isEmptyEditList && filterSets.length === 0;\n const isEditListScreen = !isNameInputScreen && !isInitialScreen;\n const captureSetIcon = (\n <div className=\"fa-layers mr-3\">\n <FontAwesomeIcon\n icon={vsCircleLargeFilled}\n mask={vsDeviceCamera}\n transform=\"shrink-1 down-5 right-7\"\n />\n <FontAwesomeIcon\n icon={dhNewCircleLargeFilled}\n className=\"text-primary\"\n transform=\"shrink-6 down-5 right-7\"\n />\n </div>\n );\n const updateSetIcon = (\n <div className=\"fa-layers\">\n <FontAwesomeIcon\n icon={vsCircleLargeFilled}\n mask={vsDeviceCamera}\n transform=\"shrink-1 down-5 right-7\"\n />\n <FontAwesomeIcon\n icon={vsArrowSmallUp}\n transform=\"shrink-1 down-5 right-7\"\n />\n </div>\n );\n return (\n <div className=\"filter-set-manager fill-parent-absolute\">\n <CardFlip className=\"w-100 h-100\" isFlipped={isValueShown}>\n <div\n className=\"filter-set-manager-settings-card fill-parent-absolute\"\n key=\"front\"\n >\n <div className=\"filter-set-manager-card-content\">\n {isInitialScreen && (\n <div>\n <Button\n kind=\"ghost\"\n className=\"btn btn-link no-underline\"\n onClick={this.handleCaptureNewSet}\n icon={captureSetIcon}\n >\n Capture filter set\n </Button>\n <div className=\"py-3 text-muted small\">\n Takes a snapshot of the currently applied filters on all\n panels, allowing you to restore saved filter sets later.\n </div>\n </div>\n )}\n\n {isNameInputScreen && (\n <div\n className=\"d-flex flex-column justify-content-center\"\n data-testid=\"edit-filter-set-container\"\n >\n <div className=\"form-group\">\n <label>\n {isRenamingExistingSet ? 'Edit set' : 'Name captured set'}\n </label>\n <div className=\"name-input-container\">\n <input\n type=\"text\"\n className=\"input-set-name form-control\"\n placeholder={NAME_INPUT_PLACEHOLDER}\n value={nameInputValue}\n ref={this.renameInputRef}\n onChange={this.handleNameInputChange}\n onKeyPress={this.handleNameInputKeyPress}\n spellCheck=\"false\"\n />\n <Button\n data-testid=\"rename-confirm-button\"\n kind=\"ghost\"\n className=\"btn btn-link no-underline pt-2 pb-2\"\n onClick={this.handleRenameConfirm}\n tooltip=\"Save\"\n test-id=\"button-save\"\n icon={vsSave}\n />\n\n <Button\n data-testid=\"rename-cancel-button\"\n kind=\"ghost\"\n className=\"btn btn-link no-underline pt-2 pb-2\"\n onClick={this.handleRenameCancel}\n tooltip=\"Cancel\"\n icon={vsCircleSlash}\n />\n </div>\n {nameInputError !== undefined && (\n <div className=\"error-message\">{nameInputError}</div>\n )}\n </div>\n <div className=\"form-group\">\n <RadioGroup\n onChange={this.handleRestoreFullStateChange}\n value={`${restoreFullState}`}\n >\n <RadioItem value=\"false\">Restore only filters</RadioItem>\n <RadioItem value=\"true\">\n Restore full table state\n </RadioItem>\n </RadioGroup>\n </div>\n </div>\n )}\n\n {isEditListScreen && (\n <div className=\"filter-set-manager-settings-grid-1\">\n <div className=\"form-group\">\n <label>Edit filter sets</label>\n <div className=\"filter-select-container\">\n <select\n data-testid=\"settings-card-filter-select\"\n ref={this.editDropdownRef}\n value={editId ?? '-1'}\n className=\"custom-select filter-value-select\"\n onChange={this.handleEditDropdownChange}\n disabled={isEmptyEditList}\n >\n {isEmptyEditList && (\n <option value=\"-1\" disabled>\n {EMPTY_LIST_PLACEHOLDER}\n </option>\n )}\n {modifiedFilterSets.map(({ id, title }) => (\n <option key={id} value={id}>\n {title}\n </option>\n ))}\n </select>\n\n <Button\n kind=\"ghost\"\n onClick={this.handleSetUpdate}\n disabled={isEmptyEditList}\n icon={updateSetIcon}\n tooltip=\"Update\"\n />\n\n <Button\n kind=\"ghost\"\n onClick={this.handleSetEdit}\n disabled={isEmptyEditList}\n icon={vsEdit}\n tooltip=\"Edit\"\n />\n\n <Button\n kind=\"ghost\"\n onClick={this.handleSetDelete}\n disabled={isEmptyEditList}\n icon={vsTrash}\n tooltip=\"Delete\"\n />\n </div>\n </div>\n\n <div>\n <Button\n kind=\"ghost\"\n className=\"btn btn-link no-underline\"\n onClick={this.handleCaptureNewSet}\n icon={captureSetIcon}\n >\n Capture new filter set\n </Button>\n </div>\n\n <div className=\"py-3 text-right\">\n <Button\n kind=\"secondary\"\n onClick={this.handleSettingsCancel}\n >\n Cancel\n </Button>\n &nbsp;\n <Button kind=\"primary\" onClick={this.handleSettingsSave}>\n Save\n </Button>\n </div>\n </div>\n )}\n </div>\n </div>\n <div\n className=\"filter-set-manager-value-card fill-parent-absolute\"\n key=\"back\"\n onClick={this.handleBackgroundClick}\n >\n <>\n <div className=\"filter-set-manager-column\">\n <div className=\"filter-set-manager-column-title\">\n Filter sets\n </div>\n </div>\n <div className=\"filter-set-manager-card-content\">\n <div className=\"filter-set-manager-value-input\">\n <div className=\"filter-select-container\">\n <select\n data-testid=\"value-card-filter-select\"\n ref={this.dropdownRef}\n value={selectedId}\n className=\"custom-select filter-value-select\"\n onChange={this.handleFilterChange}\n >\n {filterSets.length === 0 && (\n <option value=\"-1\" disabled>\n {EMPTY_LIST_PLACEHOLDER}\n </option>\n )}\n {filterSets.map(({ id, title }) => (\n <option key={id} value={id}>\n {title}\n </option>\n ))}\n </select>\n <Button\n data-testid=\"filter-apply-button\"\n kind=\"ghost\"\n onClick={this.handleFilterApply}\n icon={dhRefresh}\n tooltip=\"Apply Filter Set\"\n />\n </div>\n </div>\n </div>\n <div className=\"filter-set-manager-menu\">\n <Button\n kind=\"ghost\"\n className=\"btn btn-link btn-link-icon m-2 px-2\"\n onClick={this.handleSettingsClick}\n tooltip=\"Settings\"\n icon={<FontAwesomeIcon icon={vsGear} transform=\"grow-4\" />}\n />\n </div>\n </>\n </div>\n </CardFlip>\n </div>\n );\n }\n}\n\nexport default FilterSetManager;\n"],"mappings":"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"}
1
+ {"version":3,"file":"FilterSetManager.js","names":["React","Component","memoizeOne","shortid","FontAwesomeIcon","vsEdit","vsGear","vsSave","vsCircleSlash","vsTrash","vsDeviceCamera","dhRefresh","dhNewCircleLargeFilled","vsCircleLargeFilled","vsArrowSmallUp","Log","Button","CardFlip","RadioGroup","RadioItem","log","module","NAME_INPUT_PLACEHOLDER","EMPTY_LIST_PLACEHOLDER","FilterSetManager","animateScreenFlash","overlay","document","createElement","classList","add","addEventListener","remove","querySelector","appendChild","constructor","props","createRef","filterSets","renameSet","undefined","some","id","handleSettingsCancel","bind","handleSettingsClick","handleSettingsSave","handleBackgroundClick","handleEditDropdownChange","handleFilterChange","handleFilterApply","handleCaptureNewSet","handleNameInputChange","handleNameInputKeyPress","handleRenameConfirm","handleRenameCancel","handleRestoreFullStateChange","handleSetDelete","handleSetEdit","handleSetUpdate","state","editId","nameInputValue","nameInputError","modifiedFilterSets","restoreFullState","componentDidMount","isValueShown","updateSelectedId","initSettingsScreen","componentDidUpdate","prevProps","prevState","isNameInputScreen","focusRenameInput","length","onChange","selectedId","debug","setState","isEmptyList","event","value","target","applyFilterSet","onUpdateSets","getFilterState","panels","title","getNameError","trimmedName","trim","error","namedFilterSet","selectedIndex","findIndex","updatedModifiedFilterSets","push","prevFilterSets","filter","newSelectedIndex","Math","max","min","newSelectedId","selectedSetIndex","selectedSet","find","stopPropagation","dropdownRef","current","focusInput","key","preventDefault","onApply","filterSet","focus","renameInputRef","render","isRenamingExistingSet","isEmptyEditList","isInitialScreen","isEditListScreen","captureSetIcon","updateSetIcon","editDropdownRef","map"],"sources":["../../src/panels/FilterSetManager.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 ReactNode,\n KeyboardEvent,\n MouseEvent,\n} from 'react';\nimport memoizeOne from 'memoize-one';\nimport shortid from 'shortid';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n vsEdit,\n vsGear,\n vsSave,\n vsCircleSlash,\n vsTrash,\n vsDeviceCamera,\n dhRefresh,\n dhNewCircleLargeFilled,\n vsCircleLargeFilled,\n vsArrowSmallUp,\n} from '@deephaven/icons';\nimport Log from '@deephaven/log';\nimport { Button, CardFlip, RadioGroup, RadioItem } from '@deephaven/components';\n\nimport './FilterSetManager.scss';\n\nconst log = Log.module('FilterSetManager');\n\nexport interface FilterSetPanel {\n panelId?: string | string[] | null;\n type: string;\n id?: string;\n state: unknown;\n}\n\nexport interface FilterSet {\n id: string;\n title: string;\n panels: FilterSetPanel[];\n restoreFullState?: boolean;\n}\n\nexport interface ChangeHandlerArgs {\n isValueShown: boolean;\n selectedId?: string;\n}\n\ninterface FilterSetManagerProps {\n isValueShown: boolean;\n selectedId?: string;\n filterSets: FilterSet[];\n getFilterState(): FilterSetPanel[];\n onChange(args: ChangeHandlerArgs): void;\n onApply(filterSet: FilterSet): void;\n onUpdateSets(filterSets: FilterSet[], editId?: string): void;\n}\n\ninterface FilterSetManagerState {\n nameInputValue: string;\n nameInputError?: string;\n editId?: string;\n renameSet?: FilterSet;\n // Unsaved set changes on the settings screen\n modifiedFilterSets: FilterSet[];\n restoreFullState: boolean;\n}\n\nconst NAME_INPUT_PLACEHOLDER = 'Enter name...';\n\nconst EMPTY_LIST_PLACEHOLDER = 'No Available Filter Sets';\n\nclass FilterSetManager extends Component<\n FilterSetManagerProps,\n FilterSetManagerState\n> {\n static animateScreenFlash(): void {\n const overlay = document.createElement('div');\n overlay.classList.add('screen-flash-overlay');\n overlay.addEventListener('animationend', () => {\n // Removing the element removes its event listeners\n overlay.remove();\n });\n document.querySelector('body')?.appendChild(overlay);\n }\n\n constructor(props: FilterSetManagerProps) {\n super(props);\n\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.handleEditDropdownChange = this.handleEditDropdownChange.bind(this);\n this.handleFilterChange = this.handleFilterChange.bind(this);\n this.handleFilterApply = this.handleFilterApply.bind(this);\n this.handleCaptureNewSet = this.handleCaptureNewSet.bind(this);\n this.handleNameInputChange = this.handleNameInputChange.bind(this);\n this.handleNameInputKeyPress = this.handleNameInputKeyPress.bind(this);\n this.handleRenameConfirm = this.handleRenameConfirm.bind(this);\n this.handleRenameCancel = this.handleRenameCancel.bind(this);\n this.handleRestoreFullStateChange = this.handleRestoreFullStateChange.bind(\n this\n );\n\n this.handleSetDelete = this.handleSetDelete.bind(this);\n this.handleSetEdit = this.handleSetEdit.bind(this);\n this.handleSetUpdate = this.handleSetUpdate.bind(this);\n\n this.state = {\n editId: undefined,\n renameSet: undefined,\n nameInputValue: '',\n nameInputError: undefined,\n modifiedFilterSets: [],\n restoreFullState: false,\n };\n }\n\n componentDidMount(): void {\n const { isValueShown } = this.props;\n if (isValueShown) {\n this.updateSelectedId();\n } else {\n this.initSettingsScreen();\n }\n }\n\n componentDidUpdate(\n prevProps: FilterSetManagerProps,\n prevState: FilterSetManagerState\n ): void {\n const { isValueShown, filterSets } = this.props;\n const { modifiedFilterSets } = this.state;\n\n if (prevProps.isValueShown && !isValueShown) {\n this.initSettingsScreen();\n }\n\n if (this.isNameInputScreen() && !this.isNameInputScreen(prevState)) {\n this.focusRenameInput();\n }\n\n if (filterSets !== prevProps.filterSets) {\n if (\n !isValueShown &&\n filterSets.length > 0 &&\n prevProps.filterSets.length === 0 &&\n modifiedFilterSets.length === 0\n ) {\n // Filter set added from another panel, flip from the settings side/initial screen to the value side\n const { onChange } = this.props;\n onChange({ isValueShown: true, selectedId: filterSets[0].id });\n } else {\n this.updateSelectedId();\n }\n }\n }\n\n private renameInputRef = React.createRef<HTMLInputElement>();\n\n private dropdownRef = React.createRef<HTMLSelectElement>();\n\n private editDropdownRef = React.createRef<HTMLSelectElement>();\n\n initSettingsScreen(): void {\n const { filterSets, selectedId } = this.props;\n log.debug('initSettingsScreen', filterSets, selectedId);\n this.setState({\n modifiedFilterSets: [...filterSets],\n editId: selectedId,\n });\n }\n\n // Update selected id without applying the new set on filterSets change\n updateSelectedId(): void {\n const { isValueShown, filterSets, selectedId, onChange } = this.props;\n log.debug('updateSelectedId', filterSets, selectedId);\n if (!isValueShown) {\n return;\n }\n if (!filterSets.some(({ id }) => id === selectedId)) {\n // Update the selection if selectedId doesn't exist in the list\n // Flip to the settings side for empty list to show the initial screen\n const isEmptyList = filterSets.length === 0;\n onChange({\n isValueShown: !isEmptyList,\n selectedId: isEmptyList ? undefined : filterSets[0].id,\n });\n }\n }\n\n handleEditDropdownChange(event: ChangeEvent<HTMLSelectElement>): void {\n const { value: editId } = event.target;\n this.setState({ editId });\n }\n\n handleFilterChange(event: ChangeEvent<HTMLSelectElement>): void {\n const { value: selectedId } = event.target;\n const { isValueShown, onChange } = this.props;\n this.applyFilterSet(selectedId);\n onChange({ isValueShown, selectedId });\n }\n\n handleFilterApply(): void {\n const { selectedId } = this.props;\n this.applyFilterSet(selectedId);\n }\n\n handleSettingsCancel(): void {\n const { onChange, selectedId, filterSets } = this.props;\n this.setState({ modifiedFilterSets: [] });\n // Flip the card to the filter set selection screen if the sets list isn't empty\n // Otherwise show the initial screen\n if (filterSets.length > 0) {\n onChange({ isValueShown: true, selectedId });\n }\n }\n\n handleSettingsSave(): void {\n const { onChange, onUpdateSets } = this.props;\n const { modifiedFilterSets, editId } = this.state;\n this.setState({ modifiedFilterSets: [] });\n log.debug('Update sets', modifiedFilterSets, editId);\n onUpdateSets(modifiedFilterSets);\n // Don't flip the card to the filter set selection screen if the updated sets list is empty\n if (modifiedFilterSets.length > 0) {\n onChange({ isValueShown: true, selectedId: editId });\n }\n }\n\n handleCaptureNewSet(): void {\n const { getFilterState } = this.props;\n FilterSetManager.animateScreenFlash();\n const id = shortid();\n const panels = getFilterState();\n const renameSet = {\n id,\n title: '',\n panels,\n };\n log.debug('handleSetCreate', renameSet);\n this.setState({ nameInputValue: '', nameInputError: undefined, renameSet });\n }\n\n handleRenameCancel(): void {\n this.setState({ renameSet: undefined });\n }\n\n handleRestoreFullStateChange(event: ChangeEvent<HTMLInputElement>): void {\n this.setState({\n restoreFullState: event.target.value === 'true',\n });\n }\n\n getNameError(nameInputValue: string): string | undefined {\n const { renameSet, modifiedFilterSets } = this.state;\n const trimmedName = nameInputValue?.trim() ?? '';\n if (trimmedName.length === 0) {\n log.debug('Name cannot be empty', trimmedName);\n return 'Name cannot be empty';\n }\n\n if (\n renameSet !== undefined &&\n modifiedFilterSets.some(\n ({ title, id }) => title === trimmedName && id !== renameSet.id\n )\n ) {\n log.debug('Set with this name already exists', trimmedName);\n return 'Set with this name already exists';\n }\n\n return undefined;\n }\n\n handleRenameConfirm(): void {\n const {\n nameInputValue,\n renameSet,\n modifiedFilterSets,\n restoreFullState,\n } = this.state;\n if (renameSet === undefined) {\n log.error('Renamed set undefined.');\n return;\n }\n const nameInputError = this.getNameError(nameInputValue);\n log.debug('handleRenameConfirm', nameInputValue, nameInputError);\n if (nameInputError !== undefined) {\n this.setState({ nameInputError });\n return;\n }\n const trimmedName = nameInputValue?.trim() ?? '';\n const namedFilterSet = {\n ...renameSet,\n title: trimmedName,\n restoreFullState,\n };\n const selectedIndex = modifiedFilterSets.findIndex(\n ({ id }) => id === renameSet.id\n );\n const updatedModifiedFilterSets = [...modifiedFilterSets];\n\n if (selectedIndex >= 0) {\n updatedModifiedFilterSets[selectedIndex] = namedFilterSet;\n log.debug('Renamed existing set', updatedModifiedFilterSets);\n } else {\n updatedModifiedFilterSets.push(namedFilterSet);\n log.debug('Added new set to modified sets', updatedModifiedFilterSets);\n }\n\n this.setState({\n editId: namedFilterSet.id,\n modifiedFilterSets: updatedModifiedFilterSets,\n renameSet: undefined,\n });\n }\n\n handleSetDelete(): void {\n this.setState(state => {\n const { editId, modifiedFilterSets: prevFilterSets } = state;\n const selectedIndex = prevFilterSets.findIndex(({ id }) => id === editId);\n if (selectedIndex < 0) {\n log.error(\n 'Unable to find selected filterSet index',\n prevFilterSets,\n editId\n );\n return null;\n }\n const modifiedFilterSets = prevFilterSets.filter(\n ({ id }) => id !== editId\n );\n const newSelectedIndex = Math.max(\n 0,\n Math.min(modifiedFilterSets.length - 1, selectedIndex - 1)\n );\n const newSelectedId =\n modifiedFilterSets.length > 0\n ? modifiedFilterSets[newSelectedIndex].id\n : undefined;\n log.debug(\n 'Deleted selected set',\n editId,\n prevFilterSets,\n modifiedFilterSets\n );\n log.debug('New selection', newSelectedIndex, newSelectedId);\n return {\n modifiedFilterSets,\n editId: newSelectedId,\n };\n });\n }\n\n handleSetUpdate(): void {\n const { getFilterState } = this.props;\n FilterSetManager.animateScreenFlash();\n const panels = getFilterState();\n this.setState(({ modifiedFilterSets: prevFilterSets, editId }) => {\n if (editId === undefined) {\n log.error('Filter for update not selected.');\n return null;\n }\n const modifiedFilterSets = [...prevFilterSets];\n const selectedSetIndex = modifiedFilterSets.findIndex(\n ({ id }) => id === editId\n );\n if (selectedSetIndex < 0) {\n log.error('Selected set for update not found.');\n return null;\n }\n // Clone selected set to avoid mutation of the props\n modifiedFilterSets[selectedSetIndex] = {\n ...modifiedFilterSets[selectedSetIndex],\n panels,\n };\n\n log.debug('Update set', modifiedFilterSets, panels);\n return {\n modifiedFilterSets,\n };\n });\n }\n\n handleSetEdit(): void {\n this.setState(({ editId, modifiedFilterSets }) => {\n const selectedSet = modifiedFilterSets.find(({ id }) => id === editId);\n if (selectedSet === undefined) {\n log.error('Could not find selected set', editId, modifiedFilterSets);\n return null;\n }\n const { title, restoreFullState = false } = selectedSet;\n return {\n nameInputValue: title,\n nameInputError: undefined,\n renameSet: selectedSet,\n restoreFullState,\n };\n });\n }\n\n handleSettingsClick(event: MouseEvent): void {\n event.stopPropagation();\n const { onChange, selectedId } = this.props;\n onChange({ isValueShown: false, selectedId });\n }\n\n handleBackgroundClick(event: MouseEvent): void {\n log.debug('handleBackgroundClick');\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 handleNameInputChange(event: ChangeEvent<HTMLInputElement>): void {\n const { value: nameInputValue } = event.target;\n const nameInputError = this.getNameError(nameInputValue);\n this.setState({ nameInputValue, nameInputError });\n }\n\n handleNameInputKeyPress(event: KeyboardEvent): void {\n const { key } = event;\n if (key === 'Enter') {\n event.preventDefault();\n this.handleRenameConfirm();\n }\n }\n\n isNameInputScreen(state = this.state): boolean {\n const { renameSet } = state;\n return renameSet !== undefined;\n }\n\n isRenamingExistingSet = memoizeOne(\n (filterSets: FilterSet[], renameSet?: FilterSet): boolean =>\n renameSet !== undefined &&\n filterSets.some(({ id }) => id === renameSet.id)\n );\n\n applyFilterSet(selectedId?: string): void {\n const { onApply, filterSets } = this.props;\n if (selectedId === undefined) {\n log.debug('No filter selected');\n return;\n }\n const filterSet = filterSets.find(({ id }) => id === selectedId);\n if (filterSet === undefined) {\n log.debug('Selected id not found in filterSets', selectedId, filterSets);\n return;\n }\n log.debug('Apply filterSet', filterSet);\n onApply(filterSet);\n }\n\n focusInput(): void {\n this.dropdownRef.current?.focus();\n }\n\n focusRenameInput(): void {\n this.renameInputRef.current?.focus();\n }\n\n render(): ReactNode {\n const {\n nameInputValue,\n nameInputError,\n editId,\n renameSet,\n modifiedFilterSets,\n restoreFullState,\n } = this.state;\n const { isValueShown, filterSets, selectedId } = this.props;\n const isNameInputScreen = this.isNameInputScreen();\n const isRenamingExistingSet = this.isRenamingExistingSet(\n modifiedFilterSets,\n renameSet\n );\n const isEmptyEditList = modifiedFilterSets.length === 0;\n const isInitialScreen =\n !isNameInputScreen && isEmptyEditList && filterSets.length === 0;\n const isEditListScreen = !isNameInputScreen && !isInitialScreen;\n const captureSetIcon = (\n <div className=\"fa-layers mr-3\">\n <FontAwesomeIcon\n icon={vsCircleLargeFilled}\n mask={vsDeviceCamera}\n transform=\"shrink-1 down-5 right-7\"\n />\n <FontAwesomeIcon\n icon={dhNewCircleLargeFilled}\n className=\"text-primary\"\n transform=\"shrink-6 down-5 right-7\"\n />\n </div>\n );\n const updateSetIcon = (\n <div className=\"fa-layers\">\n <FontAwesomeIcon\n icon={vsCircleLargeFilled}\n mask={vsDeviceCamera}\n transform=\"shrink-1 down-5 right-7\"\n />\n <FontAwesomeIcon\n icon={vsArrowSmallUp}\n transform=\"shrink-1 down-5 right-7\"\n />\n </div>\n );\n return (\n <div className=\"filter-set-manager fill-parent-absolute\">\n <CardFlip className=\"w-100 h-100\" isFlipped={isValueShown}>\n <div\n className=\"filter-set-manager-settings-card fill-parent-absolute\"\n key=\"front\"\n >\n <div className=\"filter-set-manager-card-content\">\n {isInitialScreen && (\n <div>\n <Button\n kind=\"ghost\"\n className=\"btn btn-link no-underline\"\n onClick={this.handleCaptureNewSet}\n icon={captureSetIcon}\n >\n Capture filter set\n </Button>\n <div className=\"py-3 text-muted small\">\n Takes a snapshot of the currently applied filters on all\n panels, allowing you to restore saved filter sets later.\n </div>\n </div>\n )}\n\n {isNameInputScreen && (\n <div\n className=\"d-flex flex-column justify-content-center\"\n data-testid=\"edit-filter-set-container\"\n >\n <div className=\"form-group\">\n <label>\n {isRenamingExistingSet ? 'Edit set' : 'Name captured set'}\n </label>\n <div className=\"name-input-container\">\n <input\n type=\"text\"\n className=\"input-set-name form-control\"\n placeholder={NAME_INPUT_PLACEHOLDER}\n value={nameInputValue}\n ref={this.renameInputRef}\n onChange={this.handleNameInputChange}\n onKeyPress={this.handleNameInputKeyPress}\n spellCheck=\"false\"\n />\n <Button\n data-testid=\"rename-confirm-button\"\n kind=\"ghost\"\n className=\"btn btn-link no-underline pt-2 pb-2\"\n onClick={this.handleRenameConfirm}\n tooltip=\"Save\"\n test-id=\"button-save\"\n icon={vsSave}\n />\n\n <Button\n data-testid=\"rename-cancel-button\"\n kind=\"ghost\"\n className=\"btn btn-link no-underline pt-2 pb-2\"\n onClick={this.handleRenameCancel}\n tooltip=\"Cancel\"\n icon={vsCircleSlash}\n />\n </div>\n {nameInputError !== undefined && (\n <div className=\"error-message\">{nameInputError}</div>\n )}\n </div>\n <div className=\"form-group\">\n <RadioGroup\n onChange={this.handleRestoreFullStateChange}\n value={`${restoreFullState}`}\n >\n <RadioItem value=\"false\">Restore only filters</RadioItem>\n <RadioItem value=\"true\">\n Restore full table state\n </RadioItem>\n </RadioGroup>\n </div>\n </div>\n )}\n\n {isEditListScreen && (\n <div className=\"filter-set-manager-settings-grid-1\">\n <div className=\"form-group\">\n <label>Edit filter sets</label>\n <div className=\"filter-select-container\">\n <select\n data-testid=\"settings-card-filter-select\"\n ref={this.editDropdownRef}\n value={editId ?? '-1'}\n className=\"custom-select filter-value-select\"\n onChange={this.handleEditDropdownChange}\n disabled={isEmptyEditList}\n >\n {isEmptyEditList && (\n <option value=\"-1\" disabled>\n {EMPTY_LIST_PLACEHOLDER}\n </option>\n )}\n {modifiedFilterSets.map(({ id, title }) => (\n <option key={id} value={id}>\n {title}\n </option>\n ))}\n </select>\n\n <Button\n kind=\"ghost\"\n onClick={this.handleSetUpdate}\n disabled={isEmptyEditList}\n icon={updateSetIcon}\n tooltip=\"Update\"\n />\n\n <Button\n kind=\"ghost\"\n onClick={this.handleSetEdit}\n disabled={isEmptyEditList}\n icon={vsEdit}\n tooltip=\"Edit\"\n />\n\n <Button\n kind=\"ghost\"\n onClick={this.handleSetDelete}\n disabled={isEmptyEditList}\n icon={vsTrash}\n tooltip=\"Delete\"\n />\n </div>\n </div>\n\n <div>\n <Button\n kind=\"ghost\"\n className=\"btn btn-link no-underline\"\n onClick={this.handleCaptureNewSet}\n icon={captureSetIcon}\n >\n Capture new filter set\n </Button>\n </div>\n\n <div className=\"py-3 text-right\">\n <Button\n kind=\"secondary\"\n onClick={this.handleSettingsCancel}\n >\n Cancel\n </Button>\n &nbsp;\n <Button kind=\"primary\" onClick={this.handleSettingsSave}>\n Save\n </Button>\n </div>\n </div>\n )}\n </div>\n </div>\n <div\n className=\"filter-set-manager-value-card fill-parent-absolute\"\n key=\"back\"\n onClick={this.handleBackgroundClick}\n >\n <div className=\"filter-set-manager-column\">\n <div className=\"filter-set-manager-column-title\">Filter sets</div>\n </div>\n <div className=\"filter-set-manager-card-content\">\n <div className=\"filter-set-manager-value-input\">\n <div className=\"filter-select-container\">\n <select\n data-testid=\"value-card-filter-select\"\n ref={this.dropdownRef}\n value={selectedId}\n className=\"custom-select filter-value-select\"\n onChange={this.handleFilterChange}\n >\n {filterSets.length === 0 && (\n <option value=\"-1\" disabled>\n {EMPTY_LIST_PLACEHOLDER}\n </option>\n )}\n {filterSets.map(({ id, title }) => (\n <option key={id} value={id}>\n {title}\n </option>\n ))}\n </select>\n <Button\n data-testid=\"filter-apply-button\"\n kind=\"ghost\"\n onClick={this.handleFilterApply}\n icon={dhRefresh}\n tooltip=\"Apply Filter Set\"\n />\n </div>\n </div>\n </div>\n <div className=\"filter-set-manager-menu\">\n <Button\n kind=\"ghost\"\n className=\"btn btn-link btn-link-icon m-2 px-2\"\n onClick={this.handleSettingsClick}\n tooltip=\"Settings\"\n icon={<FontAwesomeIcon icon={vsGear} transform=\"grow-4\" />}\n />\n </div>\n </div>\n </CardFlip>\n </div>\n );\n }\n}\n\nexport default FilterSetManager;\n"],"mappings":"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"}
@@ -1,9 +1,6 @@
1
1
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
-
3
2
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
-
5
3
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
-
7
4
  import React, { Component } from 'react';
8
5
  import { connect } from 'react-redux';
9
6
  import { getOpenedPanelMapForDashboard, LayoutUtils } from '@deephaven/dashboard';
@@ -16,20 +13,16 @@ import DropdownFilterPanel from "./DropdownFilterPanel.js";
16
13
  import InputFilterPanel from "./InputFilterPanel.js";
17
14
  import "./FilterSetManagerPanel.css";
18
15
  var log = Log.module('FilterSetManagerPanel');
19
-
20
16
  function hasSetPanelState(panel) {
21
17
  return panel.setPanelState != null;
22
18
  }
23
-
24
19
  export class FilterSetManagerPanel extends Component {
25
20
  static changeFilterIndexesToColumnNames(table, configs) {
26
21
  return configs.map(_ref => {
27
22
  var [index, filter] = _ref;
28
-
29
23
  if (index >= table.columns.length) {
30
24
  return null;
31
25
  }
32
-
33
26
  var {
34
27
  name
35
28
  } = table.columns[index];
@@ -39,7 +32,6 @@ export class FilterSetManagerPanel extends Component {
39
32
  };
40
33
  }).filter(config => config != null);
41
34
  }
42
-
43
35
  constructor(props) {
44
36
  super(props);
45
37
  this.handleChange = this.handleChange.bind(this);
@@ -59,11 +51,10 @@ export class FilterSetManagerPanel extends Component {
59
51
  isValueShown,
60
52
  // eslint-disable-next-line react/no-unused-state
61
53
  panelState // Dehydrated panel state that can load this panel
62
-
63
54
  };
64
- } // Collect all filter values for each dashboard panel
65
-
55
+ }
66
56
 
57
+ // Collect all filter values for each dashboard panel
67
58
  getFilterState() {
68
59
  var {
69
60
  dashboardOpenedPanelMap
@@ -71,47 +62,37 @@ export class FilterSetManagerPanel extends Component {
71
62
  var panels = [];
72
63
  [...dashboardOpenedPanelMap.keys()].forEach(key => {
73
64
  var panel = dashboardOpenedPanelMap.get(key);
74
-
75
65
  if (panel === undefined) {
76
66
  log.error('Could not get panel', panel);
77
67
  return;
78
68
  }
79
-
80
69
  var componentName = LayoutUtils.getComponentNameFromPanel(panel);
81
70
  var panelId = LayoutUtils.getIdFromPanel(panel);
82
71
  log.debug('Panel:', panel, componentName);
83
72
  var {
84
73
  glContainer = null
85
74
  } = panel.props;
86
-
87
75
  if (glContainer == null) {
88
76
  log.error('Could not get panel container', panel);
89
77
  return;
90
78
  }
91
-
92
79
  var config = LayoutUtils.getComponentConfigFromContainer(glContainer);
93
-
94
80
  if (config == null) {
95
81
  log.error('Could not get component config from container', glContainer);
96
82
  return;
97
83
  }
98
-
99
84
  var panelState = LayoutUtils.getPanelComponentState(config);
100
-
101
85
  if (panelState == null) {
102
86
  log.debug("Panel state is null ".concat(panelId));
103
87
  return;
104
88
  }
105
-
106
89
  switch (componentName) {
107
90
  case LayoutUtils.getComponentName(IrisGridPanel):
108
91
  {
109
92
  var _state;
110
-
111
93
  if (panelId != null) {
112
94
  _state = this.getIrisGridPanelFilters(panelId, panelState);
113
95
  }
114
-
115
96
  if (_state != null) {
116
97
  panels.push({
117
98
  panelId,
@@ -119,10 +100,8 @@ export class FilterSetManagerPanel extends Component {
119
100
  state: _state
120
101
  });
121
102
  }
122
-
123
103
  break;
124
104
  }
125
-
126
105
  case LayoutUtils.getComponentName(InputFilterPanel):
127
106
  case LayoutUtils.getComponentName(DropdownFilterPanel):
128
107
  {
@@ -144,26 +123,22 @@ export class FilterSetManagerPanel extends Component {
144
123
  });
145
124
  break;
146
125
  }
147
-
148
126
  default:
149
127
  }
150
128
  });
151
129
  return panels;
152
130
  }
153
-
154
131
  getIrisGridPanelFilters(panelId, panelState) {
155
132
  var {
156
133
  panelTableMap
157
134
  } = this.props;
158
135
  var table = panelTableMap.get(panelId);
159
-
160
136
  if (table == null) {
161
137
  log.error("Unable to get table for panel ".concat(panelId, "."));
162
138
  return null;
163
- } // IrisGridUtils.hydrate uses numeric indexes for columns
139
+ }
140
+ // IrisGridUtils.hydrate uses numeric indexes for columns
164
141
  // Change indexes to column names to make it work for proxy models
165
-
166
-
167
142
  var {
168
143
  irisGridState = {
169
144
  advancedFilters: undefined,
@@ -176,17 +151,13 @@ export class FilterSetManagerPanel extends Component {
176
151
  quickFilters: indexedQuickFilters
177
152
  } = irisGridState;
178
153
  var advancedFilters;
179
-
180
154
  if (indexedAdvancedFilters) {
181
155
  advancedFilters = FilterSetManagerPanel.changeFilterIndexesToColumnNames(table, indexedAdvancedFilters);
182
156
  }
183
-
184
157
  var quickFilters;
185
-
186
158
  if (indexedQuickFilters) {
187
159
  quickFilters = FilterSetManagerPanel.changeFilterIndexesToColumnNames(table, indexedQuickFilters);
188
160
  }
189
-
190
161
  return {
191
162
  irisGridState: _objectSpread(_objectSpread({}, irisGridState), {}, {
192
163
  advancedFilters,
@@ -195,11 +166,9 @@ export class FilterSetManagerPanel extends Component {
195
166
  gridState: _objectSpread({}, gridState)
196
167
  };
197
168
  }
198
-
199
169
  handleGetFilterState() {
200
170
  return this.getFilterState();
201
171
  }
202
-
203
172
  handleChange(_ref2) {
204
173
  var {
205
174
  isValueShown,
@@ -212,7 +181,6 @@ export class FilterSetManagerPanel extends Component {
212
181
  });
213
182
  this.updatePanelState();
214
183
  }
215
-
216
184
  handleFilterApply(filterSet) {
217
185
  var {
218
186
  dashboardOpenedPanelMap
@@ -228,46 +196,38 @@ export class FilterSetManagerPanel extends Component {
228
196
  type,
229
197
  state
230
198
  } = _ref3;
231
-
232
199
  if (panelId == null) {
233
200
  log.debug('panel is null', panelId);
234
201
  return;
235
202
  }
236
-
237
203
  if (!dashboardOpenedPanelMap.has(panelId)) {
238
204
  log.debug('Ignore closed panel', panelId);
239
205
  return;
240
206
  }
241
-
242
207
  log.debug('Apply panel filters', panelId, type, state);
243
208
  var panel = dashboardOpenedPanelMap.get(panelId);
244
-
245
209
  switch (type) {
246
210
  case LayoutUtils.getComponentName(IrisGridPanel):
247
211
  this.restoreIrisGridFilters(panel, state, restoreFullState);
248
212
  break;
249
-
250
213
  case LayoutUtils.getComponentName(InputFilterPanel):
251
214
  case LayoutUtils.getComponentName(DropdownFilterPanel):
252
215
  this.restoreInputFilterState(panel, state);
253
216
  break;
254
-
255
217
  default:
256
218
  }
257
219
  });
258
220
  }
259
-
260
221
  handleSetsUpdate(modifiedFilterSets) {
261
222
  var {
262
223
  setDashboardFilterSets,
263
224
  localDashboardId
264
225
  } = this.props;
265
- log.debug('Saving updated sets', modifiedFilterSets); // Filter sets are stored in dashboard data instead of the panelState
226
+ log.debug('Saving updated sets', modifiedFilterSets);
227
+ // Filter sets are stored in dashboard data instead of the panelState
266
228
  // because they need to be shared between the filter view manager panels
267
-
268
229
  setDashboardFilterSets(localDashboardId, [...modifiedFilterSets]);
269
230
  }
270
-
271
231
  updatePanelState() {
272
232
  this.setState(_ref4 => {
273
233
  var {
@@ -283,7 +243,6 @@ export class FilterSetManagerPanel extends Component {
283
243
  };
284
244
  });
285
245
  }
286
-
287
246
  restoreIrisGridFilters(panel, state, restoreFullState) {
288
247
  // Fall back to state.advancedFilters and state.quickFilters
289
248
  // for backward compatibility with filter sets that only contain filters
@@ -300,21 +259,16 @@ export class FilterSetManagerPanel extends Component {
300
259
  panelTableMap
301
260
  } = this.props;
302
261
  var panelId = LayoutUtils.getIdFromPanel(panel);
303
-
304
262
  if (panelId == null) {
305
263
  log.error("Panel Id is null.");
306
264
  return;
307
265
  }
308
-
309
266
  var table = panelTableMap.get(panelId);
310
-
311
267
  if (table == null) {
312
268
  log.error("Unable to get table for panel ".concat(panelId, "."));
313
269
  return;
314
270
  }
315
-
316
271
  log.debug('restoreIrisGridFilters', panelId, state, restoreFullState);
317
-
318
272
  if (restoreFullState) {
319
273
  panel.setStateOverrides(state);
320
274
  } else {
@@ -323,21 +277,18 @@ export class FilterSetManagerPanel extends Component {
323
277
  advancedFilters: advancedFilters
324
278
  });
325
279
  }
326
- } // eslint-disable-next-line class-methods-use-this
327
-
280
+ }
328
281
 
282
+ // eslint-disable-next-line class-methods-use-this
329
283
  restoreInputFilterState(panel, state) {
330
- var inputFilterState = _objectSpread({}, state); // Restore state but don't flip the card
331
-
332
-
284
+ var inputFilterState = _objectSpread({}, state);
285
+ // Restore state but don't flip the card
333
286
  delete inputFilterState.isValueShown;
334
287
  log.debug('restoreInputFilterState', panel, inputFilterState);
335
-
336
288
  if (panel && hasSetPanelState(panel)) {
337
289
  panel.setPanelState(inputFilterState);
338
290
  }
339
291
  }
340
-
341
292
  render() {
342
293
  var {
343
294
  glContainer,
@@ -367,15 +318,11 @@ export class FilterSetManagerPanel extends Component {
367
318
  getFilterState: this.handleGetFilterState
368
319
  })));
369
320
  }
370
-
371
321
  }
372
-
373
322
  _defineProperty(FilterSetManagerPanel, "defaultProps", {
374
323
  panelState: null
375
324
  });
376
-
377
325
  _defineProperty(FilterSetManagerPanel, "COMPONENT", 'FilterSetManagerPanel');
378
-
379
326
  var mapStateToProps = (state, ownProps) => {
380
327
  var {
381
328
  localDashboardId
@@ -387,7 +334,6 @@ var mapStateToProps = (state, ownProps) => {
387
334
  panelTableMap: getTableMapForDashboard(state, localDashboardId)
388
335
  };
389
336
  };
390
-
391
337
  export default connect(mapStateToProps, {
392
338
  setDashboardFilterSets: setDashboardFilterSetsAction
393
339
  }, null, {
@@ -1 +1 @@
1
- {"version":3,"file":"FilterSetManagerPanel.js","names":["React","Component","connect","getOpenedPanelMapForDashboard","LayoutUtils","Log","getFilterSetsForDashboard","getInputFiltersForDashboard","getTableMapForDashboard","setDashboardFilterSets","setDashboardFilterSetsAction","Panel","FilterSetManager","IrisGridPanel","DropdownFilterPanel","InputFilterPanel","log","module","hasSetPanelState","panel","setPanelState","FilterSetManagerPanel","changeFilterIndexesToColumnNames","table","configs","map","index","filter","columns","length","name","config","constructor","props","handleChange","bind","handleFilterApply","handleSetsUpdate","handleGetFilterState","panelState","filterSets","selectedId","id","undefined","isValueShown","state","getFilterState","dashboardOpenedPanelMap","panels","keys","forEach","key","get","error","componentName","getComponentNameFromPanel","panelId","getIdFromPanel","debug","glContainer","getComponentConfigFromContainer","getPanelComponentState","getComponentName","getIrisGridPanelFilters","push","type","value","panelTableMap","irisGridState","advancedFilters","quickFilters","gridState","indexedAdvancedFilters","indexedQuickFilters","setState","updatePanelState","filterSet","restoreFullState","has","restoreIrisGridFilters","restoreInputFilterState","modifiedFilterSets","localDashboardId","prevAdvancedFilters","prevQuickFilters","setStateOverrides","setFilters","inputFilterState","render","glEventHub","mapStateToProps","ownProps","dashboardInputFilters","forwardRef"],"sources":["../../src/panels/FilterSetManagerPanel.tsx"],"sourcesContent":["import React, { Component, ReactElement } from 'react';\nimport { connect } from 'react-redux';\nimport {\n getOpenedPanelMapForDashboard,\n LayoutUtils,\n PanelComponent,\n} from '@deephaven/dashboard';\nimport Log from '@deephaven/log';\nimport type { Container, EventEmitter } from '@deephaven/golden-layout';\nimport { TableTemplate } from '@deephaven/jsapi-shim';\nimport { RootState } from '@deephaven/redux';\nimport {\n AdvancedFilter,\n ColumnName,\n DehydratedIrisGridState,\n QuickFilter,\n} from '@deephaven/iris-grid';\nimport { GridState } from '@deephaven/grid';\nimport {\n getFilterSetsForDashboard,\n getInputFiltersForDashboard,\n getTableMapForDashboard,\n setDashboardFilterSets as setDashboardFilterSetsAction,\n} from '../redux';\nimport Panel from './Panel';\nimport FilterSetManager, {\n ChangeHandlerArgs,\n FilterSet,\n FilterSetPanel,\n} from './FilterSetManager';\nimport { IrisGridPanel } from './IrisGridPanel';\nimport DropdownFilterPanel from './DropdownFilterPanel';\nimport InputFilterPanel, {\n PanelState as InputFilterPanelState,\n} from './InputFilterPanel';\nimport './FilterSetManagerPanel.scss';\n\nconst log = Log.module('FilterSetManagerPanel');\ninterface IrisGridState {\n advancedFilters: [number, AdvancedFilter][];\n quickFilters: [number, QuickFilter][];\n}\n\ninterface PanelState {\n irisGridState?: IrisGridState;\n gridState?: Partial<GridState>;\n selectedId?: string | string[];\n isValueShown?: boolean;\n name?: string;\n type?: string;\n value?: string;\n}\n\ninterface FilterSetManagerPanelProps {\n glContainer: Container;\n glEventHub: EventEmitter;\n panelState: PanelState;\n filterSets: FilterSet[];\n localDashboardId: string;\n dashboardOpenedPanelMap: Map<string | string[], PanelComponent>;\n setDashboardFilterSets: (\n dashboardId: string,\n filterSets: FilterSet[]\n ) => void;\n panelTableMap: Map<string | string[], TableTemplate>;\n}\n\ninterface FilterSetManagerPanelState {\n selectedId?: string | string[];\n isValueShown: boolean;\n // eslint-disable-next-line react/no-unused-state\n panelState: PanelState; // Dehydrated panel state that can load this panel\n}\n\nfunction hasSetPanelState(\n panel: PanelComponent\n): panel is PanelComponent & {\n setPanelState: (state: InputFilterPanelState) => void;\n} {\n return (\n (panel as PanelComponent & {\n setPanelState: (state: InputFilterPanelState) => void;\n }).setPanelState != null\n );\n}\nexport class FilterSetManagerPanel extends Component<\n FilterSetManagerPanelProps,\n FilterSetManagerPanelState\n> {\n static defaultProps = {\n panelState: null,\n };\n\n static COMPONENT = 'FilterSetManagerPanel';\n\n static changeFilterIndexesToColumnNames<T>(\n table: TableTemplate,\n configs: [number, T][]\n ): { name: string; filter: T }[] {\n return configs\n .map(([index, filter]) => {\n if (index >= table.columns.length) {\n return null;\n }\n const { name } = table.columns[index];\n return { name, filter };\n })\n .filter(config => config != null) as { name: string; filter: T }[];\n }\n\n constructor(props: FilterSetManagerPanelProps) {\n super(props);\n\n this.handleChange = this.handleChange.bind(this);\n this.handleFilterApply = this.handleFilterApply.bind(this);\n this.handleSetsUpdate = this.handleSetsUpdate.bind(this);\n this.handleGetFilterState = this.handleGetFilterState.bind(this);\n\n const { panelState, filterSets } = props;\n const {\n selectedId = filterSets.length > 0 ? filterSets[0].id : undefined,\n isValueShown = false,\n } = panelState ?? {};\n\n this.state = {\n selectedId,\n isValueShown,\n // eslint-disable-next-line react/no-unused-state\n panelState, // Dehydrated panel state that can load this panel\n };\n }\n\n // Collect all filter values for each dashboard panel\n getFilterState(): FilterSetPanel[] {\n const { dashboardOpenedPanelMap } = this.props;\n const panels: FilterSetPanel[] = [];\n [...dashboardOpenedPanelMap.keys()].forEach(key => {\n const panel = dashboardOpenedPanelMap.get(key);\n\n if (panel === undefined) {\n log.error('Could not get panel', panel);\n return;\n }\n\n const componentName = LayoutUtils.getComponentNameFromPanel(panel);\n const panelId = LayoutUtils.getIdFromPanel(panel);\n log.debug('Panel:', panel, componentName);\n\n const { glContainer = null } = panel.props;\n if (glContainer == null) {\n log.error('Could not get panel container', panel);\n return;\n }\n const config = LayoutUtils.getComponentConfigFromContainer(glContainer);\n if (config == null) {\n log.error('Could not get component config from container', glContainer);\n return;\n }\n const panelState = LayoutUtils.getPanelComponentState(\n config\n ) as PanelState;\n if (panelState == null) {\n log.debug(`Panel state is null ${panelId}`);\n return;\n }\n switch (componentName) {\n case LayoutUtils.getComponentName(IrisGridPanel): {\n let state;\n if (panelId != null) {\n state = this.getIrisGridPanelFilters(panelId, panelState);\n }\n if (state != null) {\n panels.push({\n panelId,\n type: componentName,\n state,\n });\n }\n break;\n }\n case LayoutUtils.getComponentName(InputFilterPanel):\n case LayoutUtils.getComponentName(DropdownFilterPanel): {\n const { isValueShown, name, type, value } = panelState;\n panels.push({\n panelId,\n type: componentName,\n state: { isValueShown, name, type, value },\n });\n break;\n }\n default:\n }\n });\n return panels;\n }\n\n getIrisGridPanelFilters(\n panelId: string | string[],\n panelState: PanelState\n ): {\n irisGridState: Omit<IrisGridState, 'advancedFilters' | 'quickFilters'> & {\n advancedFilters?: {\n name: string;\n filter: AdvancedFilter;\n }[];\n quickFilters?: {\n name: string;\n filter: QuickFilter;\n }[];\n };\n gridState: Partial<GridState>;\n } | null {\n const { panelTableMap } = this.props;\n const table = panelTableMap.get(panelId);\n if (table == null) {\n log.error(`Unable to get table for panel ${panelId}.`);\n return null;\n }\n // IrisGridUtils.hydrate uses numeric indexes for columns\n // Change indexes to column names to make it work for proxy models\n const {\n irisGridState = { advancedFilters: undefined, quickFilters: undefined },\n gridState = {},\n } = panelState;\n const {\n advancedFilters: indexedAdvancedFilters,\n quickFilters: indexedQuickFilters,\n } = irisGridState;\n let advancedFilters;\n if (indexedAdvancedFilters) {\n advancedFilters = FilterSetManagerPanel.changeFilterIndexesToColumnNames(\n table,\n indexedAdvancedFilters\n );\n }\n\n let quickFilters;\n if (indexedQuickFilters) {\n quickFilters = FilterSetManagerPanel.changeFilterIndexesToColumnNames(\n table,\n indexedQuickFilters\n );\n }\n return {\n irisGridState: {\n ...irisGridState,\n advancedFilters,\n quickFilters,\n },\n gridState: { ...gridState },\n };\n }\n\n handleGetFilterState(): FilterSetPanel[] {\n return this.getFilterState();\n }\n\n handleChange({ isValueShown, selectedId }: ChangeHandlerArgs): void {\n log.debug('handleChange', isValueShown, selectedId);\n this.setState({ isValueShown, selectedId });\n this.updatePanelState();\n }\n\n handleFilterApply(filterSet: FilterSet): void {\n const { dashboardOpenedPanelMap } = this.props;\n const { panels, restoreFullState = false } = filterSet;\n log.debug(`Apply filters from filter set`, filterSet);\n panels.forEach(({ panelId, type, state }) => {\n if (panelId == null) {\n log.debug('panel is null', panelId);\n return;\n }\n if (!dashboardOpenedPanelMap.has(panelId)) {\n log.debug('Ignore closed panel', panelId);\n return;\n }\n log.debug('Apply panel filters', panelId, type, state);\n const panel = dashboardOpenedPanelMap.get(panelId);\n switch (type) {\n case LayoutUtils.getComponentName(IrisGridPanel):\n this.restoreIrisGridFilters(\n panel as IrisGridPanel,\n state as {\n irisGridState: Partial<DehydratedIrisGridState>;\n gridState: Partial<GridState>;\n advancedFilters: { name: string; filter: AdvancedFilter }[];\n quickFilters: { name: string; filter: QuickFilter }[];\n },\n restoreFullState\n );\n break;\n case LayoutUtils.getComponentName(InputFilterPanel):\n case LayoutUtils.getComponentName(DropdownFilterPanel):\n this.restoreInputFilterState(panel, state as InputFilterPanelState);\n break;\n default:\n }\n });\n }\n\n handleSetsUpdate(modifiedFilterSets: FilterSet[]): void {\n const { setDashboardFilterSets, localDashboardId } = this.props;\n log.debug('Saving updated sets', modifiedFilterSets);\n // Filter sets are stored in dashboard data instead of the panelState\n // because they need to be shared between the filter view manager panels\n setDashboardFilterSets(localDashboardId, [...modifiedFilterSets]);\n }\n\n updatePanelState(): void {\n this.setState(({ selectedId, isValueShown }) => ({\n // eslint-disable-next-line react/no-unused-state\n panelState: {\n selectedId,\n isValueShown,\n },\n }));\n }\n\n restoreIrisGridFilters(\n panel: IrisGridPanel,\n state: {\n irisGridState: Partial<DehydratedIrisGridState>;\n gridState: Partial<GridState>;\n advancedFilters: { name: ColumnName; filter: AdvancedFilter }[];\n quickFilters: { name: ColumnName; filter: QuickFilter }[];\n },\n restoreFullState: boolean\n ): void {\n // Fall back to state.advancedFilters and state.quickFilters\n // for backward compatibility with filter sets that only contain filters\n const {\n irisGridState = {},\n advancedFilters: prevAdvancedFilters = [],\n quickFilters: prevQuickFilters = [],\n } = state;\n const {\n advancedFilters = prevAdvancedFilters,\n quickFilters = prevQuickFilters,\n } = irisGridState;\n const { panelTableMap } = this.props;\n const panelId = LayoutUtils.getIdFromPanel(panel);\n if (panelId == null) {\n log.error(`Panel Id is null.`);\n return;\n }\n const table = panelTableMap.get(panelId);\n if (table == null) {\n log.error(`Unable to get table for panel ${panelId}.`);\n return;\n }\n log.debug('restoreIrisGridFilters', panelId, state, restoreFullState);\n if (restoreFullState) {\n panel.setStateOverrides(state);\n } else {\n panel.setFilters({\n quickFilters: quickFilters as {\n name: string;\n filter: QuickFilter;\n }[],\n advancedFilters: advancedFilters as {\n name: string;\n filter: AdvancedFilter;\n }[],\n });\n }\n }\n\n // eslint-disable-next-line class-methods-use-this\n restoreInputFilterState(\n panel: PanelComponent | undefined,\n state: InputFilterPanelState\n ): void {\n const inputFilterState = { ...state };\n // Restore state but don't flip the card\n delete inputFilterState.isValueShown;\n log.debug('restoreInputFilterState', panel, inputFilterState);\n if (panel && hasSetPanelState(panel)) {\n panel.setPanelState(inputFilterState);\n }\n }\n\n render(): ReactElement {\n const { glContainer, glEventHub, filterSets } = this.props;\n const { isValueShown, selectedId } = this.state;\n return (\n <Panel\n className=\"filter-set-manager-panel\"\n componentPanel={this}\n glContainer={glContainer}\n glEventHub={glEventHub}\n isClonable\n isRenamable\n >\n <div className=\"input-filter-container h-100 w-100 container\">\n <FilterSetManager\n onChange={this.handleChange}\n onApply={this.handleFilterApply}\n onUpdateSets={this.handleSetsUpdate}\n isValueShown={isValueShown}\n filterSets={filterSets}\n selectedId={selectedId as string}\n getFilterState={this.handleGetFilterState}\n />\n </div>\n </Panel>\n );\n }\n}\n\nconst mapStateToProps = (\n state: RootState,\n ownProps: { localDashboardId: string }\n) => {\n const { localDashboardId } = ownProps;\n return {\n filterSets: getFilterSetsForDashboard(state, localDashboardId),\n dashboardOpenedPanelMap: getOpenedPanelMapForDashboard(\n state,\n localDashboardId\n ),\n dashboardInputFilters: getInputFiltersForDashboard(state, localDashboardId),\n panelTableMap: getTableMapForDashboard(state, localDashboardId),\n };\n};\n\nexport default connect(\n mapStateToProps,\n {\n setDashboardFilterSets: setDashboardFilterSetsAction,\n },\n null,\n { forwardRef: true }\n)(FilterSetManagerPanel);\n"],"mappings":"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"}
1
+ {"version":3,"file":"FilterSetManagerPanel.js","names":["React","Component","connect","getOpenedPanelMapForDashboard","LayoutUtils","Log","getFilterSetsForDashboard","getInputFiltersForDashboard","getTableMapForDashboard","setDashboardFilterSets","setDashboardFilterSetsAction","Panel","FilterSetManager","IrisGridPanel","DropdownFilterPanel","InputFilterPanel","log","module","hasSetPanelState","panel","setPanelState","FilterSetManagerPanel","changeFilterIndexesToColumnNames","table","configs","map","index","filter","columns","length","name","config","constructor","props","handleChange","bind","handleFilterApply","handleSetsUpdate","handleGetFilterState","panelState","filterSets","selectedId","id","undefined","isValueShown","state","getFilterState","dashboardOpenedPanelMap","panels","keys","forEach","key","get","error","componentName","getComponentNameFromPanel","panelId","getIdFromPanel","debug","glContainer","getComponentConfigFromContainer","getPanelComponentState","getComponentName","getIrisGridPanelFilters","push","type","value","panelTableMap","irisGridState","advancedFilters","quickFilters","gridState","indexedAdvancedFilters","indexedQuickFilters","setState","updatePanelState","filterSet","restoreFullState","has","restoreIrisGridFilters","restoreInputFilterState","modifiedFilterSets","localDashboardId","prevAdvancedFilters","prevQuickFilters","setStateOverrides","setFilters","inputFilterState","render","glEventHub","mapStateToProps","ownProps","dashboardInputFilters","forwardRef"],"sources":["../../src/panels/FilterSetManagerPanel.tsx"],"sourcesContent":["import React, { Component, ReactElement } from 'react';\nimport { connect } from 'react-redux';\nimport {\n getOpenedPanelMapForDashboard,\n LayoutUtils,\n PanelComponent,\n} from '@deephaven/dashboard';\nimport Log from '@deephaven/log';\nimport type { Container, EventEmitter } from '@deephaven/golden-layout';\nimport { TableTemplate } from '@deephaven/jsapi-shim';\nimport { RootState } from '@deephaven/redux';\nimport {\n AdvancedFilter,\n ColumnName,\n DehydratedIrisGridState,\n QuickFilter,\n} from '@deephaven/iris-grid';\nimport { GridState } from '@deephaven/grid';\nimport {\n getFilterSetsForDashboard,\n getInputFiltersForDashboard,\n getTableMapForDashboard,\n setDashboardFilterSets as setDashboardFilterSetsAction,\n} from '../redux';\nimport Panel from './Panel';\nimport FilterSetManager, {\n ChangeHandlerArgs,\n FilterSet,\n FilterSetPanel,\n} from './FilterSetManager';\nimport { IrisGridPanel } from './IrisGridPanel';\nimport DropdownFilterPanel from './DropdownFilterPanel';\nimport InputFilterPanel, {\n PanelState as InputFilterPanelState,\n} from './InputFilterPanel';\nimport './FilterSetManagerPanel.scss';\n\nconst log = Log.module('FilterSetManagerPanel');\ninterface IrisGridState {\n advancedFilters: [number, AdvancedFilter][];\n quickFilters: [number, QuickFilter][];\n}\n\ninterface PanelState {\n irisGridState?: IrisGridState;\n gridState?: Partial<GridState>;\n selectedId?: string | string[];\n isValueShown?: boolean;\n name?: string;\n type?: string;\n value?: string;\n}\n\ninterface FilterSetManagerPanelProps {\n glContainer: Container;\n glEventHub: EventEmitter;\n panelState: PanelState;\n filterSets: FilterSet[];\n localDashboardId: string;\n dashboardOpenedPanelMap: Map<string | string[], PanelComponent>;\n setDashboardFilterSets: (\n dashboardId: string,\n filterSets: FilterSet[]\n ) => void;\n panelTableMap: Map<string | string[], TableTemplate>;\n}\n\ninterface FilterSetManagerPanelState {\n selectedId?: string | string[];\n isValueShown: boolean;\n // eslint-disable-next-line react/no-unused-state\n panelState: PanelState; // Dehydrated panel state that can load this panel\n}\n\nfunction hasSetPanelState(\n panel: PanelComponent\n): panel is PanelComponent & {\n setPanelState: (state: InputFilterPanelState) => void;\n} {\n return (\n (panel as PanelComponent & {\n setPanelState: (state: InputFilterPanelState) => void;\n }).setPanelState != null\n );\n}\nexport class FilterSetManagerPanel extends Component<\n FilterSetManagerPanelProps,\n FilterSetManagerPanelState\n> {\n static defaultProps = {\n panelState: null,\n };\n\n static COMPONENT = 'FilterSetManagerPanel';\n\n static changeFilterIndexesToColumnNames<T>(\n table: TableTemplate,\n configs: [number, T][]\n ): { name: string; filter: T }[] {\n return configs\n .map(([index, filter]) => {\n if (index >= table.columns.length) {\n return null;\n }\n const { name } = table.columns[index];\n return { name, filter };\n })\n .filter(config => config != null) as { name: string; filter: T }[];\n }\n\n constructor(props: FilterSetManagerPanelProps) {\n super(props);\n\n this.handleChange = this.handleChange.bind(this);\n this.handleFilterApply = this.handleFilterApply.bind(this);\n this.handleSetsUpdate = this.handleSetsUpdate.bind(this);\n this.handleGetFilterState = this.handleGetFilterState.bind(this);\n\n const { panelState, filterSets } = props;\n const {\n selectedId = filterSets.length > 0 ? filterSets[0].id : undefined,\n isValueShown = false,\n } = panelState ?? {};\n\n this.state = {\n selectedId,\n isValueShown,\n // eslint-disable-next-line react/no-unused-state\n panelState, // Dehydrated panel state that can load this panel\n };\n }\n\n // Collect all filter values for each dashboard panel\n getFilterState(): FilterSetPanel[] {\n const { dashboardOpenedPanelMap } = this.props;\n const panels: FilterSetPanel[] = [];\n [...dashboardOpenedPanelMap.keys()].forEach(key => {\n const panel = dashboardOpenedPanelMap.get(key);\n\n if (panel === undefined) {\n log.error('Could not get panel', panel);\n return;\n }\n\n const componentName = LayoutUtils.getComponentNameFromPanel(panel);\n const panelId = LayoutUtils.getIdFromPanel(panel);\n log.debug('Panel:', panel, componentName);\n\n const { glContainer = null } = panel.props;\n if (glContainer == null) {\n log.error('Could not get panel container', panel);\n return;\n }\n const config = LayoutUtils.getComponentConfigFromContainer(glContainer);\n if (config == null) {\n log.error('Could not get component config from container', glContainer);\n return;\n }\n const panelState = LayoutUtils.getPanelComponentState(\n config\n ) as PanelState;\n if (panelState == null) {\n log.debug(`Panel state is null ${panelId}`);\n return;\n }\n switch (componentName) {\n case LayoutUtils.getComponentName(IrisGridPanel): {\n let state;\n if (panelId != null) {\n state = this.getIrisGridPanelFilters(panelId, panelState);\n }\n if (state != null) {\n panels.push({\n panelId,\n type: componentName,\n state,\n });\n }\n break;\n }\n case LayoutUtils.getComponentName(InputFilterPanel):\n case LayoutUtils.getComponentName(DropdownFilterPanel): {\n const { isValueShown, name, type, value } = panelState;\n panels.push({\n panelId,\n type: componentName,\n state: { isValueShown, name, type, value },\n });\n break;\n }\n default:\n }\n });\n return panels;\n }\n\n getIrisGridPanelFilters(\n panelId: string | string[],\n panelState: PanelState\n ): {\n irisGridState: Omit<IrisGridState, 'advancedFilters' | 'quickFilters'> & {\n advancedFilters?: {\n name: string;\n filter: AdvancedFilter;\n }[];\n quickFilters?: {\n name: string;\n filter: QuickFilter;\n }[];\n };\n gridState: Partial<GridState>;\n } | null {\n const { panelTableMap } = this.props;\n const table = panelTableMap.get(panelId);\n if (table == null) {\n log.error(`Unable to get table for panel ${panelId}.`);\n return null;\n }\n // IrisGridUtils.hydrate uses numeric indexes for columns\n // Change indexes to column names to make it work for proxy models\n const {\n irisGridState = { advancedFilters: undefined, quickFilters: undefined },\n gridState = {},\n } = panelState;\n const {\n advancedFilters: indexedAdvancedFilters,\n quickFilters: indexedQuickFilters,\n } = irisGridState;\n let advancedFilters;\n if (indexedAdvancedFilters) {\n advancedFilters = FilterSetManagerPanel.changeFilterIndexesToColumnNames(\n table,\n indexedAdvancedFilters\n );\n }\n\n let quickFilters;\n if (indexedQuickFilters) {\n quickFilters = FilterSetManagerPanel.changeFilterIndexesToColumnNames(\n table,\n indexedQuickFilters\n );\n }\n return {\n irisGridState: {\n ...irisGridState,\n advancedFilters,\n quickFilters,\n },\n gridState: { ...gridState },\n };\n }\n\n handleGetFilterState(): FilterSetPanel[] {\n return this.getFilterState();\n }\n\n handleChange({ isValueShown, selectedId }: ChangeHandlerArgs): void {\n log.debug('handleChange', isValueShown, selectedId);\n this.setState({ isValueShown, selectedId });\n this.updatePanelState();\n }\n\n handleFilterApply(filterSet: FilterSet): void {\n const { dashboardOpenedPanelMap } = this.props;\n const { panels, restoreFullState = false } = filterSet;\n log.debug(`Apply filters from filter set`, filterSet);\n panels.forEach(({ panelId, type, state }) => {\n if (panelId == null) {\n log.debug('panel is null', panelId);\n return;\n }\n if (!dashboardOpenedPanelMap.has(panelId)) {\n log.debug('Ignore closed panel', panelId);\n return;\n }\n log.debug('Apply panel filters', panelId, type, state);\n const panel = dashboardOpenedPanelMap.get(panelId);\n switch (type) {\n case LayoutUtils.getComponentName(IrisGridPanel):\n this.restoreIrisGridFilters(\n panel as IrisGridPanel,\n state as {\n irisGridState: Partial<DehydratedIrisGridState>;\n gridState: Partial<GridState>;\n advancedFilters: { name: string; filter: AdvancedFilter }[];\n quickFilters: { name: string; filter: QuickFilter }[];\n },\n restoreFullState\n );\n break;\n case LayoutUtils.getComponentName(InputFilterPanel):\n case LayoutUtils.getComponentName(DropdownFilterPanel):\n this.restoreInputFilterState(panel, state as InputFilterPanelState);\n break;\n default:\n }\n });\n }\n\n handleSetsUpdate(modifiedFilterSets: FilterSet[]): void {\n const { setDashboardFilterSets, localDashboardId } = this.props;\n log.debug('Saving updated sets', modifiedFilterSets);\n // Filter sets are stored in dashboard data instead of the panelState\n // because they need to be shared between the filter view manager panels\n setDashboardFilterSets(localDashboardId, [...modifiedFilterSets]);\n }\n\n updatePanelState(): void {\n this.setState(({ selectedId, isValueShown }) => ({\n // eslint-disable-next-line react/no-unused-state\n panelState: {\n selectedId,\n isValueShown,\n },\n }));\n }\n\n restoreIrisGridFilters(\n panel: IrisGridPanel,\n state: {\n irisGridState: Partial<DehydratedIrisGridState>;\n gridState: Partial<GridState>;\n advancedFilters: { name: ColumnName; filter: AdvancedFilter }[];\n quickFilters: { name: ColumnName; filter: QuickFilter }[];\n },\n restoreFullState: boolean\n ): void {\n // Fall back to state.advancedFilters and state.quickFilters\n // for backward compatibility with filter sets that only contain filters\n const {\n irisGridState = {},\n advancedFilters: prevAdvancedFilters = [],\n quickFilters: prevQuickFilters = [],\n } = state;\n const {\n advancedFilters = prevAdvancedFilters,\n quickFilters = prevQuickFilters,\n } = irisGridState;\n const { panelTableMap } = this.props;\n const panelId = LayoutUtils.getIdFromPanel(panel);\n if (panelId == null) {\n log.error(`Panel Id is null.`);\n return;\n }\n const table = panelTableMap.get(panelId);\n if (table == null) {\n log.error(`Unable to get table for panel ${panelId}.`);\n return;\n }\n log.debug('restoreIrisGridFilters', panelId, state, restoreFullState);\n if (restoreFullState) {\n panel.setStateOverrides(state);\n } else {\n panel.setFilters({\n quickFilters: quickFilters as {\n name: string;\n filter: QuickFilter;\n }[],\n advancedFilters: advancedFilters as {\n name: string;\n filter: AdvancedFilter;\n }[],\n });\n }\n }\n\n // eslint-disable-next-line class-methods-use-this\n restoreInputFilterState(\n panel: PanelComponent | undefined,\n state: InputFilterPanelState\n ): void {\n const inputFilterState = { ...state };\n // Restore state but don't flip the card\n delete inputFilterState.isValueShown;\n log.debug('restoreInputFilterState', panel, inputFilterState);\n if (panel && hasSetPanelState(panel)) {\n panel.setPanelState(inputFilterState);\n }\n }\n\n render(): ReactElement {\n const { glContainer, glEventHub, filterSets } = this.props;\n const { isValueShown, selectedId } = this.state;\n return (\n <Panel\n className=\"filter-set-manager-panel\"\n componentPanel={this}\n glContainer={glContainer}\n glEventHub={glEventHub}\n isClonable\n isRenamable\n >\n <div className=\"input-filter-container h-100 w-100 container\">\n <FilterSetManager\n onChange={this.handleChange}\n onApply={this.handleFilterApply}\n onUpdateSets={this.handleSetsUpdate}\n isValueShown={isValueShown}\n filterSets={filterSets}\n selectedId={selectedId as string}\n getFilterState={this.handleGetFilterState}\n />\n </div>\n </Panel>\n );\n }\n}\n\nconst mapStateToProps = (\n state: RootState,\n ownProps: { localDashboardId: string }\n) => {\n const { localDashboardId } = ownProps;\n return {\n filterSets: getFilterSetsForDashboard(state, localDashboardId),\n dashboardOpenedPanelMap: getOpenedPanelMapForDashboard(\n state,\n localDashboardId\n ),\n dashboardInputFilters: getInputFiltersForDashboard(state, localDashboardId),\n panelTableMap: getTableMapForDashboard(state, localDashboardId),\n };\n};\n\nexport default connect(\n mapStateToProps,\n {\n setDashboardFilterSets: setDashboardFilterSetsAction,\n },\n null,\n { forwardRef: true }\n)(FilterSetManagerPanel);\n"],"mappings":"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"}