@deephaven/dashboard-core-plugins 0.43.0 → 0.44.1-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ChartBuilderPlugin.js +54 -0
- package/dist/ChartBuilderPlugin.js.map +1 -0
- package/dist/ChartPlugin.js +66 -0
- package/dist/ChartPlugin.js.map +1 -0
- package/dist/ConsolePlugin.js +396 -0
- package/dist/ConsolePlugin.js.map +1 -0
- package/dist/FilterPlugin.js +205 -0
- package/dist/FilterPlugin.js.map +1 -0
- package/dist/GridPlugin.js +74 -0
- package/dist/GridPlugin.js.map +1 -0
- package/dist/LinkerPlugin.js +18 -0
- package/dist/LinkerPlugin.js.map +1 -0
- package/dist/MarkdownPlugin.js +87 -0
- package/dist/MarkdownPlugin.js.map +1 -0
- package/dist/PandasPlugin.js +66 -0
- package/dist/PandasPlugin.js.map +1 -0
- package/dist/controls/ControlType.js +10 -0
- package/dist/controls/ControlType.js.map +1 -0
- package/dist/controls/dropdown-filter/DropdownFilter.css +86 -0
- package/dist/controls/dropdown-filter/DropdownFilter.css.map +1 -0
- package/dist/controls/dropdown-filter/DropdownFilter.js +417 -0
- package/dist/controls/dropdown-filter/DropdownFilter.js.map +1 -0
- package/dist/controls/input-filter/InputFilter.css +75 -0
- package/dist/controls/input-filter/InputFilter.css.map +1 -0
- package/dist/controls/input-filter/InputFilter.js +291 -0
- package/dist/controls/input-filter/InputFilter.js.map +1 -0
- package/dist/controls/markdown/MarkdownContainer.js +30 -0
- package/dist/controls/markdown/MarkdownContainer.js.map +1 -0
- package/dist/controls/markdown/MarkdownEditor.js +52 -0
- package/dist/controls/markdown/MarkdownEditor.js.map +1 -0
- package/dist/controls/markdown/MarkdownStartPage.js +109 -0
- package/dist/controls/markdown/MarkdownStartPage.js.map +1 -0
- package/dist/controls/markdown/MarkdownUtils.js +23 -0
- package/dist/controls/markdown/MarkdownUtils.js.map +1 -0
- package/dist/events/ChartEvent.js +9 -0
- package/dist/events/ChartEvent.js.map +1 -0
- package/dist/events/ConsoleEvent.js +11 -0
- package/dist/events/ConsoleEvent.js.map +1 -0
- package/dist/events/InputFilterEvent.js +14 -0
- package/dist/events/InputFilterEvent.js.map +1 -0
- package/dist/events/IrisGridEvent.js +12 -0
- package/dist/events/IrisGridEvent.js.map +1 -0
- package/dist/events/MarkdownEvent.js +4 -0
- package/dist/events/MarkdownEvent.js.map +1 -0
- package/dist/events/NotebookEvent.js +15 -0
- package/dist/events/NotebookEvent.js.map +1 -0
- package/dist/events/PQEvent.js +9 -0
- package/dist/events/PQEvent.js.map +1 -0
- package/dist/events/PandasEvent.js +8 -0
- package/dist/events/PandasEvent.js.map +1 -0
- package/dist/events/TabEvent.js +12 -0
- package/dist/events/TabEvent.js.map +1 -0
- package/dist/events/index.js +9 -0
- package/dist/events/index.js.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/linker/ColumnSelectionValidator.js +2 -0
- package/dist/linker/ColumnSelectionValidator.js.map +1 -0
- package/dist/linker/Linker.js +736 -0
- package/dist/linker/Linker.js.map +1 -0
- package/dist/linker/LinkerLink.css +142 -0
- package/dist/linker/LinkerLink.css.map +1 -0
- package/dist/linker/LinkerLink.js +314 -0
- package/dist/linker/LinkerLink.js.map +1 -0
- package/dist/linker/LinkerOverlayContent.css +63 -0
- package/dist/linker/LinkerOverlayContent.css.map +1 -0
- package/dist/linker/LinkerOverlayContent.js +343 -0
- package/dist/linker/LinkerOverlayContent.js.map +1 -0
- package/dist/linker/LinkerUtils.js +139 -0
- package/dist/linker/LinkerUtils.js.map +1 -0
- package/dist/linker/ToolType.js +5 -0
- package/dist/linker/ToolType.js.map +1 -0
- package/dist/linker/index.js +2 -0
- package/dist/linker/index.js.map +1 -0
- package/dist/panels/ChartColumnSelectorOverlay.css +11 -0
- package/dist/panels/ChartColumnSelectorOverlay.css.map +1 -0
- package/dist/panels/ChartColumnSelectorOverlay.js +38 -0
- package/dist/panels/ChartColumnSelectorOverlay.js.map +1 -0
- package/dist/panels/ChartFilterOverlay.css +22 -0
- package/dist/panels/ChartFilterOverlay.css.map +1 -0
- package/dist/panels/ChartFilterOverlay.js +90 -0
- package/dist/panels/ChartFilterOverlay.js.map +1 -0
- package/dist/panels/ChartPanel.css +38 -0
- package/dist/panels/ChartPanel.css.map +1 -0
- package/dist/panels/ChartPanel.js +971 -0
- package/dist/panels/ChartPanel.js.map +1 -0
- package/dist/panels/ChartPanelUtils.js +5 -0
- package/dist/panels/ChartPanelUtils.js.map +1 -0
- package/dist/panels/CommandHistoryPanel.css +19 -0
- package/dist/panels/CommandHistoryPanel.css.map +1 -0
- package/dist/panels/CommandHistoryPanel.js +195 -0
- package/dist/panels/CommandHistoryPanel.js.map +1 -0
- package/dist/panels/ConsolePanel.css +19 -0
- package/dist/panels/ConsolePanel.css.map +1 -0
- package/dist/panels/ConsolePanel.js +365 -0
- package/dist/panels/ConsolePanel.js.map +1 -0
- package/dist/panels/DropdownFilterPanel.css +6 -0
- package/dist/panels/DropdownFilterPanel.css.map +1 -0
- package/dist/panels/DropdownFilterPanel.js +685 -0
- package/dist/panels/DropdownFilterPanel.js.map +1 -0
- package/dist/panels/FileExplorerPanel.css +6 -0
- package/dist/panels/FileExplorerPanel.css.map +1 -0
- package/dist/panels/FileExplorerPanel.js +252 -0
- package/dist/panels/FileExplorerPanel.js.map +1 -0
- package/dist/panels/FilterSetManager.css +112 -0
- package/dist/panels/FilterSetManager.css.map +1 -0
- package/dist/panels/FilterSetManager.js +689 -0
- package/dist/panels/FilterSetManager.js.map +1 -0
- package/dist/panels/FilterSetManagerPanel.css +34 -0
- package/dist/panels/FilterSetManagerPanel.css.map +1 -0
- package/dist/panels/FilterSetManagerPanel.js +345 -0
- package/dist/panels/FilterSetManagerPanel.js.map +1 -0
- package/dist/panels/InputFilterPanel.js +232 -0
- package/dist/panels/InputFilterPanel.js.map +1 -0
- package/dist/panels/IrisGridPanel.css +24 -0
- package/dist/panels/IrisGridPanel.css.map +1 -0
- package/dist/panels/IrisGridPanel.js +1018 -0
- package/dist/panels/IrisGridPanel.js.map +1 -0
- package/dist/panels/IrisGridPanelTooltip.js +39 -0
- package/dist/panels/IrisGridPanelTooltip.js.map +1 -0
- package/dist/panels/LogPanel.css +15 -0
- package/dist/panels/LogPanel.css.map +1 -0
- package/dist/panels/LogPanel.js +110 -0
- package/dist/panels/LogPanel.js.map +1 -0
- package/dist/panels/MarkdownNotebook.css +107 -0
- package/dist/panels/MarkdownNotebook.css.map +1 -0
- package/dist/panels/MarkdownNotebook.js +232 -0
- package/dist/panels/MarkdownNotebook.js.map +1 -0
- package/dist/panels/MarkdownPanel.css +90 -0
- package/dist/panels/MarkdownPanel.css.map +1 -0
- package/dist/panels/MarkdownPanel.js +202 -0
- package/dist/panels/MarkdownPanel.js.map +1 -0
- package/dist/panels/MockFileStorage.js +70 -0
- package/dist/panels/MockFileStorage.js.map +1 -0
- package/dist/panels/MockFileStorageTable.js +80 -0
- package/dist/panels/MockFileStorageTable.js.map +1 -0
- package/dist/panels/NotebookPanel.css +44 -0
- package/dist/panels/NotebookPanel.css.map +1 -0
- package/dist/panels/NotebookPanel.js +1224 -0
- package/dist/panels/NotebookPanel.js.map +1 -0
- package/dist/panels/PandasPanel.css +15 -0
- package/dist/panels/PandasPanel.css.map +1 -0
- package/dist/panels/PandasPanel.js +86 -0
- package/dist/panels/PandasPanel.js.map +1 -0
- package/dist/panels/Panel.js +314 -0
- package/dist/panels/Panel.js.map +1 -0
- package/dist/panels/PanelContextMenu.js +126 -0
- package/dist/panels/PanelContextMenu.js.map +1 -0
- package/dist/panels/RenameDialog.js +156 -0
- package/dist/panels/RenameDialog.js.map +1 -0
- package/dist/panels/WidgetPanel.css +17 -0
- package/dist/panels/WidgetPanel.css.map +1 -0
- package/dist/panels/WidgetPanel.js +189 -0
- package/dist/panels/WidgetPanel.js.map +1 -0
- package/dist/panels/WidgetPanelTooltip.css +40 -0
- package/dist/panels/WidgetPanelTooltip.css.map +1 -0
- package/dist/panels/WidgetPanelTooltip.js +49 -0
- package/dist/panels/WidgetPanelTooltip.js.map +1 -0
- package/dist/panels/index.js +22 -0
- package/dist/panels/index.js.map +1 -0
- package/dist/prop-types/CommonPropTypes.js +9 -0
- package/dist/prop-types/CommonPropTypes.js.map +1 -0
- package/dist/prop-types/UIPropTypes.js +42 -0
- package/dist/prop-types/UIPropTypes.js.map +1 -0
- package/dist/prop-types/index.js +3 -0
- package/dist/prop-types/index.js.map +1 -0
- package/dist/redux/actionTypes.js +3 -0
- package/dist/redux/actionTypes.js.map +1 -0
- package/dist/redux/actions.js +88 -0
- package/dist/redux/actions.js.map +1 -0
- package/dist/redux/index.js +10 -0
- package/dist/redux/index.js.map +1 -0
- package/dist/redux/reducers/connection.js +7 -0
- package/dist/redux/reducers/connection.js.map +1 -0
- package/dist/redux/reducers/index.js +5 -0
- package/dist/redux/reducers/index.js.map +1 -0
- package/dist/redux/reducers/sessionWrapper.js +7 -0
- package/dist/redux/reducers/sessionWrapper.js.map +1 -0
- package/dist/redux/selectors.js +92 -0
- package/dist/redux/selectors.js.map +1 -0
- package/package.json +22 -22
|
@@ -0,0 +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 <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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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/* stylelint-disable scss/at-import-no-partial-leading-underscore */
|
|
2
|
+
.filter-set-manager-panel {
|
|
3
|
+
padding-top: 1rem;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
.screen-flash-overlay {
|
|
7
|
+
z-index: 1070;
|
|
8
|
+
position: absolute;
|
|
9
|
+
top: 0;
|
|
10
|
+
left: 0;
|
|
11
|
+
width: 100%;
|
|
12
|
+
height: 100%;
|
|
13
|
+
background: #fff;
|
|
14
|
+
opacity: 0;
|
|
15
|
+
mix-blend-mode: color-dodge;
|
|
16
|
+
pointer-events: none;
|
|
17
|
+
animation-duration: 0.4s;
|
|
18
|
+
animation-name: flash;
|
|
19
|
+
animation-timing-function: ease-out;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
@keyframes flash {
|
|
23
|
+
0% {
|
|
24
|
+
opacity: 0;
|
|
25
|
+
}
|
|
26
|
+
10% {
|
|
27
|
+
opacity: 1;
|
|
28
|
+
}
|
|
29
|
+
100% {
|
|
30
|
+
opacity: 0;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/*# sourceMappingURL=FilterSetManagerPanel.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../../../../node_modules/@deephaven/components/scss/custom.scss","../../src/panels/FilterSetManagerPanel.scss","../../../../node_modules/@deephaven/components/scss/new_variables.scss","../../../../node_modules/bootstrap/scss/_variables.scss"],"names":[],"mappings":"AAAA;ACEA;EACE,aCCS;;;ADEX;EACE,SE4qBkC;EF3qBlC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;IACE;;EAGF;IACE;;EAGF;IACE","file":"FilterSetManagerPanel.css","sourcesContent":["/* stylelint-disable scss/at-import-no-partial-leading-underscore */\n// Consumers should be able to resolve bootstrap/ to node_modules/bootstrap\n\n//Make bootstrap functions available for use in overrides\n@import 'bootstrap/scss/_functions.scss';\n@import './bootstrap_overrides.scss';\n\n//_variable imports come after bootstrap default overrides,\n// makes all other variables and mixins from bootstrap available\n/// with just importing customer.scss\n@import 'bootstrap/scss/_variables.scss';\n@import 'bootstrap/scss/_mixins.scss';\n\n//New variables come after imports\n@import './new_variables.scss';\n","@import '@deephaven/components/scss/custom.scss';\n\n.filter-set-manager-panel {\n padding-top: $spacer-3;\n}\n\n.screen-flash-overlay {\n z-index: $zindex-tooltip;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: #fff;\n opacity: 0;\n mix-blend-mode: color-dodge;\n pointer-events: none;\n animation-duration: 0.4s;\n animation-name: flash;\n animation-timing-function: ease-out;\n}\n\n@keyframes flash {\n 0% {\n opacity: 0;\n }\n\n 10% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n }\n}\n","//Set of spacer variables from the spacer map\n$spacer-0: map-get($spacers, 0); //0\n$spacer-1: map-get($spacers, 1);\n$spacer-2: map-get($spacers, 2);\n$spacer-3: map-get($spacers, 3);\n$spacer-4: map-get($spacers, 4);\n$spacer-5: map-get($spacers, 5);\n\n//Marching Ants for golden layout dropzone and drag and drop\n//top bottom, left right.\n//create 4 background images that are 50% color 1, 50% color 2 using graidents, two veritical, two horizontal\n//size them to ant-size and thickness\n//position those images along the egdes and make top/bottom repeat-x and left/right repeat-y\n//then offest each of those background positions by ant-size in animation to make them march.\n$ant-size: 8px;\n$ant-thickness: 1px;\n\n@mixin ants-base($color-1: black, $color-2: white) {\n background-image: linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%);\n background-size: $ant-size $ant-thickness, $ant-size $ant-thickness,\n $ant-thickness $ant-size, $ant-thickness $ant-size;\n background-position: 0 top, 0 bottom, left 0, right 0;\n background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;\n animation: march 0.5s;\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n}\n\n@mixin drag-stack($pseudo-element) {\n &::#{$pseudo-element} {\n content: ' ';\n background: $primary;\n box-shadow: $box-shadow;\n border-radius: $border-radius;\n position: absolute;\n height: 100%;\n width: 100%;\n @content;\n }\n}\n\n$focus-bg-transparency: 0.12;\n$hover-bg-transparency: 0.14;\n$active-bg-transparency: 0.28;\n$exception-transparency: 0.13;\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n\n$grays: () !default;\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n$blue: #007bff !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #e83e8c !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #28a745 !default;\n$teal: #20c997 !default;\n$cyan: #17a2b8 !default;\n\n$colors: () !default;\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-800 !default;\n\n$theme-colors: () !default;\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 150 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $gray-900 !default;\n$yiq-text-light: $white !default;\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1rem !default;\n$spacers: () !default;\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n\n// Body\n//\n// Settings for the `<body>` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"primary\") !default;\n$link-decoration: none !default;\n$link-hover-color: darken($link-color, 15%) !default;\n$link-hover-decoration: underline !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px\n) !default;\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px\n) !default;\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 30px !default;\n$grid-row-columns: 6 !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: 1.5 !default;\n$line-height-sm: 1.5 !default;\n\n$border-width: 1px !default;\n$border-color: $gray-300 !default;\n\n$border-radius: .25rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$rounded-pill: 50rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"primary\") !default;\n\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n$transition-collapse-width: width .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n$embed-responsive-aspect-ratios: join(\n (\n (21 9),\n (16 9),\n (4 3),\n (1 1),\n ),\n $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: $font-size-base * 1.25 !default;\n$font-size-sm: $font-size-base * .875 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.5 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: null !default;\n\n$display1-size: 6rem !default;\n$display2-size: 5.5rem !default;\n$display3-size: 4.5rem !default;\n$display4-size: 3.5rem !default;\n\n$display1-weight: 300 !default;\n$display2-weight: 300 !default;\n$display3-weight: 300 !default;\n$display4-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$text-muted: $gray-600 !default;\n\n$blockquote-small-color: $gray-600 !default;\n$blockquote-small-font-size: $small-font-size !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n\n$hr-border-color: rgba($black, .1) !default;\n$hr-border-width: $border-width !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: inset 0 -.1rem 0 rgba($black, .25) !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-bg: #fcf8e3 !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .75rem !default;\n$table-cell-padding-sm: .3rem !default;\n\n$table-color: $body-color !default;\n$table-bg: null !default;\n$table-accent-bg: rgba($black, .05) !default;\n$table-hover-color: $table-color !default;\n$table-hover-bg: rgba($black, .075) !default;\n$table-active-bg: $table-hover-bg !default;\n\n$table-border-width: $border-width !default;\n$table-border-color: $border-color !default;\n\n$table-head-bg: $gray-200 !default;\n$table-head-color: $gray-700 !default;\n$table-th-font-weight: null !default;\n\n$table-dark-color: $white !default;\n$table-dark-bg: $gray-800 !default;\n$table-dark-accent-bg: rgba($white, .05) !default;\n$table-dark-hover-color: $table-dark-color !default;\n$table-dark-hover-bg: rgba($white, .075) !default;\n$table-dark-border-color: lighten($table-dark-bg, 7.5%) !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n$table-bg-level: -9 !default;\n$table-border-level: -6 !default;\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .2rem !default;\n$input-btn-focus-color: rgba($component-active-bg, .25) !default;\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n$input-btn-line-height-sm: $line-height-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n$input-btn-line-height-lg: $line-height-lg !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-disabled-color: $gray-600 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .5rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: $white !default;\n$input-disabled-bg: $gray-200 !default;\n\n$input-color: $gray-700 !default;\n$input-border-color: $gray-400 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: inset 0 1px 1px rgba($black, .075) !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: lighten($component-active-bg, 25%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-600 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height-sm * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height-lg * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: .25rem !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-grid-gutter-width: 10px !default;\n$form-group-margin-bottom: 1rem !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: .5rem !default;\n$custom-control-spacer-x: 1rem !default;\n$custom-control-cursor: null !default;\n\n$custom-control-indicator-size: 1rem !default;\n$custom-control-indicator-bg: $input-bg !default;\n\n$custom-control-indicator-bg-size: 50% 50% !default;\n$custom-control-indicator-box-shadow: $input-box-shadow !default;\n$custom-control-indicator-border-color: $gray-500 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-label-color: null !default;\n\n$custom-control-indicator-disabled-bg: $input-disabled-bg !default;\n$custom-control-label-disabled-color: $gray-600 !default;\n\n$custom-control-indicator-checked-color: $component-active-color !default;\n$custom-control-indicator-checked-bg: $component-active-bg !default;\n$custom-control-indicator-checked-disabled-bg: rgba(theme-color(\"primary\"), .5) !default;\n$custom-control-indicator-checked-box-shadow: null !default;\n$custom-control-indicator-checked-border-color: $custom-control-indicator-checked-bg !default;\n\n$custom-control-indicator-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-control-indicator-focus-border-color: $input-focus-border-color !default;\n\n$custom-control-indicator-active-color: $component-active-color !default;\n$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-control-indicator-active-box-shadow: null !default;\n$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n$custom-checkbox-indicator-icon-checked: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'><path fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/></svg>\") !default;\n\n$custom-checkbox-indicator-indeterminate-bg: $component-active-bg !default;\n$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n$custom-checkbox-indicator-icon-indeterminate: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'><path stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/></svg>\") !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: null !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n$custom-radio-indicator-icon-checked: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'><circle r='3' fill='#{$custom-control-indicator-checked-color}'/></svg>\") !default;\n\n$custom-switch-width: $custom-control-indicator-size * 1.75 !default;\n$custom-switch-indicator-border-radius: $custom-control-indicator-size * .5 !default;\n$custom-switch-indicator-size: subtract($custom-control-indicator-size, $custom-control-indicator-border-width * 4) !default;\n\n$custom-select-padding-y: $input-padding-y !default;\n$custom-select-padding-x: $input-padding-x !default;\n$custom-select-font-family: $input-font-family !default;\n$custom-select-font-size: $input-font-size !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight: $input-font-weight !default;\n$custom-select-line-height: $input-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $input-bg !default;\n$custom-select-disabled-bg: $gray-200 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n$custom-select-indicator-color: $gray-800 !default;\n$custom-select-indicator: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'><path fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/></svg>\") !default;\n$custom-select-background: escape-svg($custom-select-indicator) right $custom-select-padding-x center / $custom-select-bg-size no-repeat !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: add(1em * .75, (2 * $custom-select-padding-y * .75) + $custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$custom-select-border-width: $input-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: inset 0 1px 2px rgba($black, .075) !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n$custom-select-focus-width: $input-focus-width !default;\n$custom-select-focus-box-shadow: 0 0 0 $custom-select-focus-width $input-btn-focus-color !default;\n\n$custom-select-padding-y-sm: $input-padding-y-sm !default;\n$custom-select-padding-x-sm: $input-padding-x-sm !default;\n$custom-select-font-size-sm: $input-font-size-sm !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-padding-y-lg: $input-padding-y-lg !default;\n$custom-select-padding-x-lg: $input-padding-x-lg !default;\n$custom-select-font-size-lg: $input-font-size-lg !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-300 !default;\n$custom-range-track-border-radius: 1rem !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 1rem !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-range-thumb-disabled-bg: $gray-500 !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-padding-y !default;\n$custom-file-padding-x: $input-padding-x !default;\n$custom-file-line-height: $input-line-height !default;\n$custom-file-font-family: $input-font-family !default;\n$custom-file-font-weight: $input-font-weight !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'><path fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/></svg>\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='#{$form-feedback-icon-invalid-color}' viewBox='0 0 12 12'><circle cx='6' cy='6' r='4.5'/><path stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/><circle cx='6' cy='8.2' r='.6' fill='#{$form-feedback-icon-invalid-color}' stroke='none'/></svg>\") !default;\n\n$form-validation-states: () !default;\n$form-validation-states: map-merge(\n (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n ),\n ),\n $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n\n// Navs\n\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: $gray-300 !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: $spacer * .5 !default;\n\n\n// Navbar\n\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: $spacer !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n\n$navbar-nav-scroll-max-height: 75vh !default;\n\n$navbar-dark-color: rgba($white, .5) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'><path stroke='#{$navbar-dark-color}' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg>\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n\n$navbar-light-color: rgba($black, .5) !default;\n$navbar-light-hover-color: rgba($black, .7) !default;\n$navbar-light-active-color: rgba($black, .9) !default;\n$navbar-light-disabled-color: rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'><path stroke='#{$navbar-light-color}' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg>\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: rgba($black, .15) !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: subtract($dropdown-border-radius, $dropdown-border-width) !default;\n$dropdown-divider-bg: $gray-200 !default;\n$dropdown-divider-margin-y: $nav-divider-margin-y !default;\n$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: darken($gray-900, 5%) !default;\n$dropdown-link-hover-bg: $gray-200 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-500 !default;\n\n$dropdown-item-padding-y: .25rem !default;\n$dropdown-item-padding-x: 1.5rem !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding: $dropdown-padding-y $dropdown-item-padding-x !default;\n\n\n// Pagination\n\n$pagination-padding-y: .5rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n$pagination-line-height: 1.25 !default;\n\n$pagination-color: $link-color !default;\n$pagination-bg: $white !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: $gray-300 !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: $gray-300 !default;\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $pagination-active-bg !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-300 !default;\n\n$pagination-border-radius-sm: $border-radius-sm !default;\n$pagination-border-radius-lg: $border-radius-lg !default;\n\n\n// Jumbotron\n\n$jumbotron-padding: 2rem !default;\n$jumbotron-color: null !default;\n$jumbotron-bg: $gray-200 !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: rgba($black, .125) !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: $grid-gutter-width * .5 !default;\n$card-deck-margin: $card-group-margin !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $card-spacer-y !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: .25rem !default;\n$tooltip-padding-x: .5rem !default;\n$tooltip-margin: 0 !default;\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: $line-height-base !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: rgba($black, .2) !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-inner-border-radius: subtract($popover-border-radius, $popover-border-width) !default;\n$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default;\n\n$popover-header-bg: darken($popover-bg, 3%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: .75rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;\n\n\n// Toasts\n\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .25rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: .25rem !default;\n$toast-box-shadow: 0 .25rem .75rem rgba($black, .1) !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size: 75% !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .25em !default;\n$badge-padding-x: .4em !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-transition: $btn-transition !default;\n$badge-focus-width: $input-btn-focus-width !default;\n\n$badge-pill-padding-x: .6em !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: 10rem !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: 1rem !default;\n\n// Margin between elements in footer, must be lower than or equal to 2 * $modal-inner-padding\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: rgba($black, .2) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;\n$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: $border-color !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: 1rem !default;\n$modal-header-padding-x: 1rem !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl: 1140px !default;\n$modal-lg: 800px !default;\n$modal-md: 500px !default;\n$modal-sm: 300px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .75rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n\n$alert-bg-level: -10 !default;\n$alert-border-level: -9 !default;\n$alert-color-level: 6 !default;\n\n\n// Progress bars\n\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: inset 0 .1rem .1rem rgba($black, .1) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n\n// List group\n\n$list-group-color: null !default;\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black, .125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .75rem !default;\n$list-group-item-padding-x: 1.25rem !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: $gray-300 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: 0 1px 2px rgba($black, .075) !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-600 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-font-size: null !default;\n\n$breadcrumb-padding-y: .75rem !default;\n$breadcrumb-padding-x: 1rem !default;\n$breadcrumb-item-padding: .5rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: $gray-200 !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: quote(\"/\") !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' width='8' height='8' viewBox='0 0 8 8'><path d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/></svg>\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' width='8' height='8' viewBox='0 0 8 8'><path d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/></svg>\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .2rem !default;\n$kbd-padding-x: .4rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: $white !default;\n$kbd-bg: $gray-900 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n$user-selects: all, auto, none !default;\n\n\n// Printing\n\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n"]}
|
|
@@ -0,0 +1,345 @@
|
|
|
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
|
+
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; }
|
|
3
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
4
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
5
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
6
|
+
import React, { Component } from 'react';
|
|
7
|
+
import { connect } from 'react-redux';
|
|
8
|
+
import { getOpenedPanelMapForDashboard, LayoutUtils } from '@deephaven/dashboard';
|
|
9
|
+
import Log from '@deephaven/log';
|
|
10
|
+
import { getFilterSetsForDashboard, getInputFiltersForDashboard, getTableMapForDashboard, setDashboardFilterSets as setDashboardFilterSetsAction } from "../redux/index.js";
|
|
11
|
+
import Panel from "./Panel.js";
|
|
12
|
+
import FilterSetManager from "./FilterSetManager.js";
|
|
13
|
+
import { IrisGridPanel } from "./IrisGridPanel.js";
|
|
14
|
+
import DropdownFilterPanel from "./DropdownFilterPanel.js";
|
|
15
|
+
import InputFilterPanel from "./InputFilterPanel.js";
|
|
16
|
+
import "./FilterSetManagerPanel.css";
|
|
17
|
+
var log = Log.module('FilterSetManagerPanel');
|
|
18
|
+
function hasSetPanelState(panel) {
|
|
19
|
+
return panel.setPanelState != null;
|
|
20
|
+
}
|
|
21
|
+
export class FilterSetManagerPanel extends Component {
|
|
22
|
+
static changeFilterIndexesToColumnNames(table, configs) {
|
|
23
|
+
return configs.map(_ref => {
|
|
24
|
+
var [index, filter] = _ref;
|
|
25
|
+
if (index >= table.columns.length) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
var {
|
|
29
|
+
name
|
|
30
|
+
} = table.columns[index];
|
|
31
|
+
return {
|
|
32
|
+
name,
|
|
33
|
+
filter
|
|
34
|
+
};
|
|
35
|
+
}).filter(config => config != null);
|
|
36
|
+
}
|
|
37
|
+
constructor(props) {
|
|
38
|
+
super(props);
|
|
39
|
+
this.handleChange = this.handleChange.bind(this);
|
|
40
|
+
this.handleFilterApply = this.handleFilterApply.bind(this);
|
|
41
|
+
this.handleSetsUpdate = this.handleSetsUpdate.bind(this);
|
|
42
|
+
this.handleGetFilterState = this.handleGetFilterState.bind(this);
|
|
43
|
+
var {
|
|
44
|
+
panelState,
|
|
45
|
+
filterSets
|
|
46
|
+
} = props;
|
|
47
|
+
var {
|
|
48
|
+
selectedId = filterSets.length > 0 ? filterSets[0].id : undefined,
|
|
49
|
+
isValueShown = false
|
|
50
|
+
} = panelState !== null && panelState !== void 0 ? panelState : {};
|
|
51
|
+
this.state = {
|
|
52
|
+
selectedId,
|
|
53
|
+
isValueShown,
|
|
54
|
+
// eslint-disable-next-line react/no-unused-state
|
|
55
|
+
panelState // Dehydrated panel state that can load this panel
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Collect all filter values for each dashboard panel
|
|
60
|
+
getFilterState() {
|
|
61
|
+
var {
|
|
62
|
+
dashboardOpenedPanelMap
|
|
63
|
+
} = this.props;
|
|
64
|
+
var panels = [];
|
|
65
|
+
[...dashboardOpenedPanelMap.keys()].forEach(key => {
|
|
66
|
+
var panel = dashboardOpenedPanelMap.get(key);
|
|
67
|
+
if (panel === undefined) {
|
|
68
|
+
log.error('Could not get panel', panel);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
var componentName = LayoutUtils.getComponentNameFromPanel(panel);
|
|
72
|
+
var panelId = LayoutUtils.getIdFromPanel(panel);
|
|
73
|
+
log.debug('Panel:', panel, componentName);
|
|
74
|
+
var {
|
|
75
|
+
glContainer = null
|
|
76
|
+
} = panel.props;
|
|
77
|
+
if (glContainer == null) {
|
|
78
|
+
log.error('Could not get panel container', panel);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
var config = LayoutUtils.getComponentConfigFromContainer(glContainer);
|
|
82
|
+
if (config == null) {
|
|
83
|
+
log.error('Could not get component config from container', glContainer);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
var panelState = LayoutUtils.getPanelComponentState(config);
|
|
87
|
+
if (panelState == null) {
|
|
88
|
+
log.debug("Panel state is null ".concat(panelId));
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
switch (componentName) {
|
|
92
|
+
case LayoutUtils.getComponentName(IrisGridPanel):
|
|
93
|
+
{
|
|
94
|
+
var _state;
|
|
95
|
+
if (panelId != null) {
|
|
96
|
+
_state = this.getIrisGridPanelFilters(panelId, panelState);
|
|
97
|
+
}
|
|
98
|
+
if (_state != null) {
|
|
99
|
+
panels.push({
|
|
100
|
+
panelId,
|
|
101
|
+
type: componentName,
|
|
102
|
+
state: _state
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
case LayoutUtils.getComponentName(InputFilterPanel):
|
|
108
|
+
case LayoutUtils.getComponentName(DropdownFilterPanel):
|
|
109
|
+
{
|
|
110
|
+
var {
|
|
111
|
+
isValueShown,
|
|
112
|
+
name,
|
|
113
|
+
type,
|
|
114
|
+
value
|
|
115
|
+
} = panelState;
|
|
116
|
+
panels.push({
|
|
117
|
+
panelId,
|
|
118
|
+
type: componentName,
|
|
119
|
+
state: {
|
|
120
|
+
isValueShown,
|
|
121
|
+
name,
|
|
122
|
+
type,
|
|
123
|
+
value
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
default:
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
return panels;
|
|
132
|
+
}
|
|
133
|
+
getIrisGridPanelFilters(panelId, panelState) {
|
|
134
|
+
var {
|
|
135
|
+
panelTableMap
|
|
136
|
+
} = this.props;
|
|
137
|
+
var table = panelTableMap.get(panelId);
|
|
138
|
+
if (table == null) {
|
|
139
|
+
log.error("Unable to get table for panel ".concat(panelId, "."));
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
// IrisGridUtils.hydrate uses numeric indexes for columns
|
|
143
|
+
// Change indexes to column names to make it work for proxy models
|
|
144
|
+
var {
|
|
145
|
+
irisGridState = {
|
|
146
|
+
advancedFilters: undefined,
|
|
147
|
+
quickFilters: undefined
|
|
148
|
+
},
|
|
149
|
+
gridState = {}
|
|
150
|
+
} = panelState;
|
|
151
|
+
var {
|
|
152
|
+
advancedFilters: indexedAdvancedFilters,
|
|
153
|
+
quickFilters: indexedQuickFilters
|
|
154
|
+
} = irisGridState;
|
|
155
|
+
var advancedFilters;
|
|
156
|
+
if (indexedAdvancedFilters) {
|
|
157
|
+
advancedFilters = FilterSetManagerPanel.changeFilterIndexesToColumnNames(table, indexedAdvancedFilters);
|
|
158
|
+
}
|
|
159
|
+
var quickFilters;
|
|
160
|
+
if (indexedQuickFilters) {
|
|
161
|
+
quickFilters = FilterSetManagerPanel.changeFilterIndexesToColumnNames(table, indexedQuickFilters);
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
irisGridState: _objectSpread(_objectSpread({}, irisGridState), {}, {
|
|
165
|
+
advancedFilters,
|
|
166
|
+
quickFilters
|
|
167
|
+
}),
|
|
168
|
+
gridState: _objectSpread({}, gridState)
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
handleGetFilterState() {
|
|
172
|
+
return this.getFilterState();
|
|
173
|
+
}
|
|
174
|
+
handleChange(_ref2) {
|
|
175
|
+
var {
|
|
176
|
+
isValueShown,
|
|
177
|
+
selectedId
|
|
178
|
+
} = _ref2;
|
|
179
|
+
log.debug('handleChange', isValueShown, selectedId);
|
|
180
|
+
this.setState({
|
|
181
|
+
isValueShown,
|
|
182
|
+
selectedId
|
|
183
|
+
});
|
|
184
|
+
this.updatePanelState();
|
|
185
|
+
}
|
|
186
|
+
handleFilterApply(filterSet) {
|
|
187
|
+
var {
|
|
188
|
+
dashboardOpenedPanelMap
|
|
189
|
+
} = this.props;
|
|
190
|
+
var {
|
|
191
|
+
panels,
|
|
192
|
+
restoreFullState = false
|
|
193
|
+
} = filterSet;
|
|
194
|
+
log.debug("Apply filters from filter set", filterSet);
|
|
195
|
+
panels.forEach(_ref3 => {
|
|
196
|
+
var {
|
|
197
|
+
panelId,
|
|
198
|
+
type,
|
|
199
|
+
state
|
|
200
|
+
} = _ref3;
|
|
201
|
+
if (panelId == null) {
|
|
202
|
+
log.debug('panel is null', panelId);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (!dashboardOpenedPanelMap.has(panelId)) {
|
|
206
|
+
log.debug('Ignore closed panel', panelId);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
log.debug('Apply panel filters', panelId, type, state);
|
|
210
|
+
var panel = dashboardOpenedPanelMap.get(panelId);
|
|
211
|
+
switch (type) {
|
|
212
|
+
case LayoutUtils.getComponentName(IrisGridPanel):
|
|
213
|
+
this.restoreIrisGridFilters(panel, state, restoreFullState);
|
|
214
|
+
break;
|
|
215
|
+
case LayoutUtils.getComponentName(InputFilterPanel):
|
|
216
|
+
case LayoutUtils.getComponentName(DropdownFilterPanel):
|
|
217
|
+
this.restoreInputFilterState(panel, state);
|
|
218
|
+
break;
|
|
219
|
+
default:
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
handleSetsUpdate(modifiedFilterSets) {
|
|
224
|
+
var {
|
|
225
|
+
setDashboardFilterSets,
|
|
226
|
+
localDashboardId
|
|
227
|
+
} = this.props;
|
|
228
|
+
log.debug('Saving updated sets', modifiedFilterSets);
|
|
229
|
+
// Filter sets are stored in dashboard data instead of the panelState
|
|
230
|
+
// because they need to be shared between the filter view manager panels
|
|
231
|
+
setDashboardFilterSets(localDashboardId, [...modifiedFilterSets]);
|
|
232
|
+
}
|
|
233
|
+
updatePanelState() {
|
|
234
|
+
this.setState(_ref4 => {
|
|
235
|
+
var {
|
|
236
|
+
selectedId,
|
|
237
|
+
isValueShown
|
|
238
|
+
} = _ref4;
|
|
239
|
+
return {
|
|
240
|
+
// eslint-disable-next-line react/no-unused-state
|
|
241
|
+
panelState: {
|
|
242
|
+
selectedId,
|
|
243
|
+
isValueShown
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
restoreIrisGridFilters(panel, state, restoreFullState) {
|
|
249
|
+
// Fall back to state.advancedFilters and state.quickFilters
|
|
250
|
+
// for backward compatibility with filter sets that only contain filters
|
|
251
|
+
var {
|
|
252
|
+
irisGridState = {},
|
|
253
|
+
advancedFilters: prevAdvancedFilters = [],
|
|
254
|
+
quickFilters: prevQuickFilters = []
|
|
255
|
+
} = state;
|
|
256
|
+
var {
|
|
257
|
+
advancedFilters = prevAdvancedFilters,
|
|
258
|
+
quickFilters = prevQuickFilters
|
|
259
|
+
} = irisGridState;
|
|
260
|
+
var {
|
|
261
|
+
panelTableMap
|
|
262
|
+
} = this.props;
|
|
263
|
+
var panelId = LayoutUtils.getIdFromPanel(panel);
|
|
264
|
+
if (panelId == null) {
|
|
265
|
+
log.error("Panel Id is null.");
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
var table = panelTableMap.get(panelId);
|
|
269
|
+
if (table == null) {
|
|
270
|
+
log.error("Unable to get table for panel ".concat(panelId, "."));
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
log.debug('restoreIrisGridFilters', panelId, state, restoreFullState);
|
|
274
|
+
if (restoreFullState) {
|
|
275
|
+
panel.setStateOverrides(state);
|
|
276
|
+
} else {
|
|
277
|
+
panel.setFilters({
|
|
278
|
+
quickFilters: quickFilters,
|
|
279
|
+
advancedFilters: advancedFilters
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// eslint-disable-next-line class-methods-use-this
|
|
285
|
+
restoreInputFilterState(panel, state) {
|
|
286
|
+
var inputFilterState = _objectSpread({}, state);
|
|
287
|
+
// Restore state but don't flip the card
|
|
288
|
+
delete inputFilterState.isValueShown;
|
|
289
|
+
log.debug('restoreInputFilterState', panel, inputFilterState);
|
|
290
|
+
if (panel && hasSetPanelState(panel)) {
|
|
291
|
+
panel.setPanelState(inputFilterState);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
render() {
|
|
295
|
+
var {
|
|
296
|
+
glContainer,
|
|
297
|
+
glEventHub,
|
|
298
|
+
filterSets
|
|
299
|
+
} = this.props;
|
|
300
|
+
var {
|
|
301
|
+
isValueShown,
|
|
302
|
+
selectedId
|
|
303
|
+
} = this.state;
|
|
304
|
+
return /*#__PURE__*/React.createElement(Panel, {
|
|
305
|
+
className: "filter-set-manager-panel",
|
|
306
|
+
componentPanel: this,
|
|
307
|
+
glContainer: glContainer,
|
|
308
|
+
glEventHub: glEventHub,
|
|
309
|
+
isClonable: true,
|
|
310
|
+
isRenamable: true
|
|
311
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
312
|
+
className: "input-filter-container h-100 w-100 container"
|
|
313
|
+
}, /*#__PURE__*/React.createElement(FilterSetManager, {
|
|
314
|
+
onChange: this.handleChange,
|
|
315
|
+
onApply: this.handleFilterApply,
|
|
316
|
+
onUpdateSets: this.handleSetsUpdate,
|
|
317
|
+
isValueShown: isValueShown,
|
|
318
|
+
filterSets: filterSets,
|
|
319
|
+
selectedId: selectedId,
|
|
320
|
+
getFilterState: this.handleGetFilterState
|
|
321
|
+
})));
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
_defineProperty(FilterSetManagerPanel, "defaultProps", {
|
|
325
|
+
panelState: null
|
|
326
|
+
});
|
|
327
|
+
_defineProperty(FilterSetManagerPanel, "COMPONENT", 'FilterSetManagerPanel');
|
|
328
|
+
var mapStateToProps = (state, ownProps) => {
|
|
329
|
+
var {
|
|
330
|
+
localDashboardId
|
|
331
|
+
} = ownProps;
|
|
332
|
+
return {
|
|
333
|
+
filterSets: getFilterSetsForDashboard(state, localDashboardId),
|
|
334
|
+
dashboardOpenedPanelMap: getOpenedPanelMapForDashboard(state, localDashboardId),
|
|
335
|
+
dashboardInputFilters: getInputFiltersForDashboard(state, localDashboardId),
|
|
336
|
+
panelTableMap: getTableMapForDashboard(state, localDashboardId)
|
|
337
|
+
};
|
|
338
|
+
};
|
|
339
|
+
var ConnectedFilterSetManagerPanel = connect(mapStateToProps, {
|
|
340
|
+
setDashboardFilterSets: setDashboardFilterSetsAction
|
|
341
|
+
}, null, {
|
|
342
|
+
forwardRef: true
|
|
343
|
+
})(FilterSetManagerPanel);
|
|
344
|
+
export default ConnectedFilterSetManagerPanel;
|
|
345
|
+
//# sourceMappingURL=FilterSetManagerPanel.js.map
|