@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.
- package/dist/ChartBuilderPlugin.d.ts +1 -1
- package/dist/ChartBuilderPlugin.d.ts.map +1 -1
- package/dist/ChartBuilderPlugin.js +6 -8
- package/dist/ChartBuilderPlugin.js.map +1 -1
- package/dist/ChartPlugin.d.ts +1 -1
- package/dist/ChartPlugin.d.ts.map +1 -1
- package/dist/ChartPlugin.js +4 -8
- package/dist/ChartPlugin.js.map +1 -1
- package/dist/ConsolePlugin.d.ts +1 -1
- package/dist/ConsolePlugin.d.ts.map +1 -1
- package/dist/ConsolePlugin.js +16 -62
- package/dist/ConsolePlugin.js.map +1 -1
- package/dist/FilterPlugin.d.ts +1 -1
- package/dist/FilterPlugin.d.ts.map +1 -1
- package/dist/FilterPlugin.js +6 -13
- package/dist/FilterPlugin.js.map +1 -1
- package/dist/GridPlugin.d.ts +1 -1
- package/dist/GridPlugin.d.ts.map +1 -1
- package/dist/GridPlugin.js +4 -8
- package/dist/GridPlugin.js.map +1 -1
- package/dist/LinkerPlugin.d.ts +1 -1
- package/dist/LinkerPlugin.d.ts.map +1 -1
- package/dist/LinkerPlugin.js +2 -2
- package/dist/LinkerPlugin.js.map +1 -1
- package/dist/MarkdownPlugin.d.ts +1 -1
- package/dist/MarkdownPlugin.d.ts.map +1 -1
- package/dist/MarkdownPlugin.js +4 -8
- package/dist/MarkdownPlugin.js.map +1 -1
- package/dist/PandasPlugin.d.ts +1 -1
- package/dist/PandasPlugin.d.ts.map +1 -1
- package/dist/PandasPlugin.js +4 -8
- package/dist/PandasPlugin.js.map +1 -1
- package/dist/controls/ControlType.js +0 -6
- package/dist/controls/ControlType.js.map +1 -1
- package/dist/controls/dropdown-filter/DropdownFilter.js +7 -51
- package/dist/controls/dropdown-filter/DropdownFilter.js.map +1 -1
- package/dist/controls/input-filter/InputFilter.js +1 -31
- package/dist/controls/input-filter/InputFilter.js.map +1 -1
- package/dist/controls/markdown/MarkdownContainer.js +0 -3
- package/dist/controls/markdown/MarkdownContainer.js.map +1 -1
- package/dist/controls/markdown/MarkdownEditor.d.ts +0 -2
- package/dist/controls/markdown/MarkdownEditor.d.ts.map +1 -1
- package/dist/controls/markdown/MarkdownEditor.js +13 -20
- package/dist/controls/markdown/MarkdownEditor.js.map +1 -1
- package/dist/controls/markdown/MarkdownStartPage.js +0 -11
- package/dist/controls/markdown/MarkdownStartPage.js.map +1 -1
- package/dist/controls/markdown/MarkdownUtils.js +0 -7
- package/dist/controls/markdown/MarkdownUtils.js.map +1 -1
- package/dist/events/ChartEvent.js +0 -5
- package/dist/events/ChartEvent.js.map +1 -1
- package/dist/events/ConsoleEvent.js +0 -7
- package/dist/events/ConsoleEvent.js.map +1 -1
- package/dist/events/InputFilterEvent.js +0 -10
- package/dist/events/InputFilterEvent.js.map +1 -1
- package/dist/events/IrisGridEvent.js +0 -8
- package/dist/events/IrisGridEvent.js.map +1 -1
- package/dist/events/MarkdownEvent.js.map +1 -1
- package/dist/events/NotebookEvent.js +0 -10
- package/dist/events/NotebookEvent.js.map +1 -1
- package/dist/events/PQEvent.js +0 -5
- package/dist/events/PQEvent.js.map +1 -1
- package/dist/events/PandasEvent.js +0 -4
- package/dist/events/PandasEvent.js.map +1 -1
- package/dist/events/TabEvent.js +0 -8
- package/dist/events/TabEvent.js.map +1 -1
- package/dist/events/index.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/linker/Linker.d.ts +3 -0
- package/dist/linker/Linker.d.ts.map +1 -1
- package/dist/linker/Linker.js +70 -119
- package/dist/linker/Linker.js.map +1 -1
- package/dist/linker/LinkerLink.css +90 -25
- package/dist/linker/LinkerLink.css.map +1 -1
- package/dist/linker/LinkerLink.d.ts +20 -2
- package/dist/linker/LinkerLink.d.ts.map +1 -1
- package/dist/linker/LinkerLink.js +214 -23
- package/dist/linker/LinkerLink.js.map +1 -1
- package/dist/linker/LinkerOverlayContent.css +0 -4
- package/dist/linker/LinkerOverlayContent.css.map +1 -1
- package/dist/linker/LinkerOverlayContent.d.ts +11 -0
- package/dist/linker/LinkerOverlayContent.d.ts.map +1 -1
- package/dist/linker/LinkerOverlayContent.js +78 -33
- package/dist/linker/LinkerOverlayContent.js.map +1 -1
- package/dist/linker/LinkerUtils.d.ts +9 -2
- package/dist/linker/LinkerUtils.d.ts.map +1 -1
- package/dist/linker/LinkerUtils.js +9 -25
- package/dist/linker/LinkerUtils.js.map +1 -1
- package/dist/linker/ToolType.js.map +1 -1
- package/dist/panels/ChartColumnSelectorOverlay.d.ts +5 -5
- package/dist/panels/ChartColumnSelectorOverlay.d.ts.map +1 -1
- package/dist/panels/ChartColumnSelectorOverlay.js +4 -7
- package/dist/panels/ChartColumnSelectorOverlay.js.map +1 -1
- package/dist/panels/ChartFilterOverlay.d.ts +4 -4
- package/dist/panels/ChartFilterOverlay.d.ts.map +1 -1
- package/dist/panels/ChartFilterOverlay.js +2 -7
- package/dist/panels/ChartFilterOverlay.js.map +1 -1
- package/dist/panels/ChartPanel.d.ts.map +1 -1
- package/dist/panels/ChartPanel.js +11 -150
- package/dist/panels/ChartPanel.js.map +1 -1
- package/dist/panels/CommandHistoryPanel.d.ts.map +1 -1
- package/dist/panels/CommandHistoryPanel.js +1 -26
- package/dist/panels/CommandHistoryPanel.js.map +1 -1
- package/dist/panels/ConsolePanel.d.ts.map +1 -1
- package/dist/panels/ConsolePanel.js +12 -57
- package/dist/panels/ConsolePanel.js.map +1 -1
- package/dist/panels/DropdownFilterPanel.d.ts.map +1 -1
- package/dist/panels/DropdownFilterPanel.js +16 -122
- package/dist/panels/DropdownFilterPanel.js.map +1 -1
- package/dist/panels/FileExplorerPanel.js +4 -33
- package/dist/panels/FileExplorerPanel.js.map +1 -1
- package/dist/panels/FilterSetManager.d.ts.map +1 -1
- package/dist/panels/FilterSetManager.js +13 -86
- package/dist/panels/FilterSetManager.js.map +1 -1
- package/dist/panels/FilterSetManagerPanel.js +10 -64
- package/dist/panels/FilterSetManagerPanel.js.map +1 -1
- package/dist/panels/InputFilterPanel.d.ts.map +1 -1
- package/dist/panels/InputFilterPanel.js +8 -38
- package/dist/panels/InputFilterPanel.js.map +1 -1
- package/dist/panels/IrisGridPanel.d.ts.map +1 -1
- package/dist/panels/IrisGridPanel.js +24 -133
- package/dist/panels/IrisGridPanel.js.map +1 -1
- package/dist/panels/IrisGridPanelTooltip.d.ts +5 -5
- package/dist/panels/IrisGridPanelTooltip.d.ts.map +1 -1
- package/dist/panels/IrisGridPanelTooltip.js +2 -5
- package/dist/panels/IrisGridPanelTooltip.js.map +1 -1
- package/dist/panels/LogPanel.js +4 -22
- package/dist/panels/LogPanel.js.map +1 -1
- package/dist/panels/MarkdownNotebook.js +3 -30
- package/dist/panels/MarkdownNotebook.js.map +1 -1
- package/dist/panels/MarkdownPanel.js +2 -30
- package/dist/panels/MarkdownPanel.js.map +1 -1
- package/dist/panels/MockFileStorage.js +1 -14
- package/dist/panels/MockFileStorage.js.map +1 -1
- package/dist/panels/MockFileStorageTable.js +11 -30
- package/dist/panels/MockFileStorageTable.js.map +1 -1
- package/dist/panels/NotebookPanel.js +24 -182
- package/dist/panels/NotebookPanel.js.map +1 -1
- package/dist/panels/PandasPanel.js +1 -20
- package/dist/panels/PandasPanel.js.map +1 -1
- package/dist/panels/Panel.js +2 -38
- package/dist/panels/Panel.js.map +1 -1
- package/dist/panels/PanelContextMenu.js +7 -29
- package/dist/panels/PanelContextMenu.js.map +1 -1
- package/dist/panels/RenameDialog.js +2 -17
- package/dist/panels/RenameDialog.js.map +1 -1
- package/dist/panels/WidgetPanel.js +2 -20
- package/dist/panels/WidgetPanel.js.map +1 -1
- package/dist/panels/WidgetPanelTooltip.d.ts +5 -5
- package/dist/panels/WidgetPanelTooltip.d.ts.map +1 -1
- package/dist/panels/WidgetPanelTooltip.js +2 -4
- package/dist/panels/WidgetPanelTooltip.js.map +1 -1
- package/dist/panels/index.js.map +1 -1
- package/dist/prop-types/CommonPropTypes.js +0 -3
- package/dist/prop-types/CommonPropTypes.js.map +1 -1
- package/dist/prop-types/UIPropTypes.js.map +1 -1
- package/dist/prop-types/index.js.map +1 -1
- package/dist/redux/actionTypes.js.map +1 -1
- package/dist/redux/actions.js +8 -9
- package/dist/redux/actions.js.map +1 -1
- package/dist/redux/index.js.map +1 -1
- package/dist/redux/reducers/connection.js.map +1 -1
- package/dist/redux/reducers/index.js.map +1 -1
- package/dist/redux/reducers/sessionWrapper.js.map +1 -1
- package/dist/redux/selectors.js +10 -15
- package/dist/redux/selectors.js.map +1 -1
- 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 \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 \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
|
-
}
|
|
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
|
-
}
|
|
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);
|
|
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
|
-
}
|
|
327
|
-
|
|
280
|
+
}
|
|
328
281
|
|
|
282
|
+
// eslint-disable-next-line class-methods-use-this
|
|
329
283
|
restoreInputFilterState(panel, state) {
|
|
330
|
-
var inputFilterState = _objectSpread({}, state);
|
|
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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"}
|