@deephaven/dashboard-core-plugins 0.44.2-provenance.4 → 0.45.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/controls/dropdown-filter/DropdownFilter.d.ts.map +1 -1
- package/dist/controls/dropdown-filter/DropdownFilter.js.map +1 -1
- package/dist/linker/Linker.d.ts.map +1 -1
- package/dist/linker/Linker.js.map +1 -1
- package/dist/linker/LinkerOverlayContent.js.map +1 -1
- package/dist/panels/ChartPanel.d.ts.map +1 -1
- package/dist/panels/ChartPanel.js.map +1 -1
- package/dist/panels/DropdownFilterPanel.d.ts.map +1 -1
- package/dist/panels/DropdownFilterPanel.js.map +1 -1
- package/dist/panels/FileExplorerPanel.d.ts.map +1 -1
- package/dist/panels/FileExplorerPanel.js.map +1 -1
- package/dist/panels/FilterSetManager.d.ts.map +1 -1
- package/dist/panels/FilterSetManager.js.map +1 -1
- package/dist/panels/FilterSetManagerPanel.js.map +1 -1
- package/dist/panels/InputFilterPanel.d.ts.map +1 -1
- package/dist/panels/InputFilterPanel.js.map +1 -1
- package/dist/panels/IrisGridPanel.css.map +1 -1
- package/dist/panels/IrisGridPanel.d.ts.map +1 -1
- package/dist/panels/IrisGridPanel.js.map +1 -1
- package/dist/panels/MarkdownNotebook.css.map +1 -1
- package/dist/panels/MarkdownPanel.d.ts.map +1 -1
- package/dist/panels/MarkdownPanel.js.map +1 -1
- package/dist/panels/NotebookPanel.d.ts.map +1 -1
- package/dist/panels/NotebookPanel.js.map +1 -1
- package/dist/panels/PanelContextMenu.js.map +1 -1
- package/dist/panels/WidgetPanel.d.ts.map +1 -1
- package/dist/panels/WidgetPanel.js.map +1 -1
- package/dist/redux/actions.d.ts.map +1 -1
- package/dist/redux/actions.js.map +1 -1
- package/package.json +22 -22
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileExplorerPanel.d.ts","sourceRoot":"","sources":["../../src/panels/FileExplorerPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAqB,EAEnB,WAAW,EACX,eAAe,EAGhB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAW,cAAc,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,0BAA0B,CAAC;AAKlC,KAAK,UAAU,GAAG;IAChB,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB,CAAC;AAEF,KAAK,QAAQ,GAAG,mBAAmB,CAAC;AAkBpC,QAAA,MAAM,SAAS,4JAA6D,CAAC;AAE7E,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAC3C,UAAU,GACV,cAAc,CAAC,OAAO,SAAS,CAAC,CAAC;AAEnC,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAOF;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK,CAAC,SAAS,CACpD,sBAAsB,EACtB,sBAAsB,CACvB;IACC,MAAM,CAAC,SAAS,SAAuB;IAEvC,MAAM,CAAC,KAAK,SAAmB;IAE/B,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAItC;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,GAAG,OAAO;gBAU7C,KAAK,EAAE,sBAAsB;
|
|
1
|
+
{"version":3,"file":"FileExplorerPanel.d.ts","sourceRoot":"","sources":["../../src/panels/FileExplorerPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAqB,EAEnB,WAAW,EACX,eAAe,EAGhB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAW,cAAc,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,0BAA0B,CAAC;AAKlC,KAAK,UAAU,GAAG;IAChB,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB,CAAC;AAEF,KAAK,QAAQ,GAAG,mBAAmB,CAAC;AAkBpC,QAAA,MAAM,SAAS,4JAA6D,CAAC;AAE7E,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAC3C,UAAU,GACV,cAAc,CAAC,OAAO,SAAS,CAAC,CAAC;AAEnC,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAOF;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK,CAAC,SAAS,CACpD,sBAAsB,EACtB,sBAAsB,CACvB;IACC,MAAM,CAAC,SAAS,SAAuB;IAEvC,MAAM,CAAC,KAAK,SAAmB;IAE/B,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAItC;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,GAAG,OAAO;gBAU7C,KAAK,EAAE,sBAAsB;IA2BzC,iBAAiB,IAAI,IAAI;IAMzB,gBAAgB,IAAI,IAAI;IAgBxB,qBAAqB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAI1C,2BAA2B,IAAI,IAAI;IAOnC,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAO/C,YAAY,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,IAAI;IAU5C,qBAAqB,CAAC,aAAa,EAAE,eAAe,EAAE,GAAG,IAAI;IAY7D,gBAAgB,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,cAAc,GAAG,IAAI;IAwB1E,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAMpD,mBAAmB,CACjB,OAAO,EAAE,UAAU,EACnB,EAAE,QAAQ,EAAE,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GACjC,IAAI;IAOP,mBAAmB,IAAI,IAAI;IAO3B,UAAU,IAAI,IAAI;IAIlB,QAAQ,IAAI,OAAO;IAMnB,MAAM,IAAI,SAAS;CAuCpB;AAED,QAAA,MAAM,0BAA0B;;;;;;EAA+B,CAAC;AAEhE,eAAe,0BAA0B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileExplorerPanel.js","names":["Log","getFileStorage","FileExplorer","FileExplorerToolbar","FileUtils","NewItemModal","React","connect","Panel","NotebookEvent","getDashboardSessionWrapper","log","module","mapStateToProps","state","ownProps","fileStorage","sessionWrapper","localDashboardId","session","config","sessionConfig","language","type","connector","forwardRef","isMouseEvent","e","mouseEvent","button","FileExplorerPanel","Component","handleError","error","isFocusEvent","event","detail","constructor","props","handleFileSelect","bind","handleCreateFile","handleCreateDirectory","handleCreateDirectoryCancel","handleCreateDirectorySubmit","handleDelete","handleRename","handleSessionOpened","handleSessionClosed","handleShow","handleSelectionChange","isShown","showCreateFolder","focusedFilePath","componentDidMount","isHidden","setState","glEventHub","notebookSettings","value","debug","emit","CREATE_NOTEBOOK","path","createDirectory","catch","files","forEach","file","CLOSE_FILE","id","filename","itemName","selectedItems","length","makePath","getPath","shouldFocus","fileMetadata","SELECT_NOTEBOOK","oldName","newName","RENAME_FILE","undefined","glContainer","render","ConnectedFileExplorerPanel"],"sources":["../../src/panels/FileExplorerPanel.tsx"],"sourcesContent":["import { DashboardPanelProps } from '@deephaven/dashboard';\nimport Log from '@deephaven/log';\nimport { getFileStorage, RootState } from '@deephaven/redux';\nimport FileExplorer, {\n FileExplorerToolbar,\n FileStorage,\n FileStorageItem,\n FileUtils,\n NewItemModal,\n} from '@deephaven/file-explorer';\nimport React, { ReactNode } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\nimport type { IdeSession } from '@deephaven/jsapi-types';\nimport Panel from './Panel';\nimport { NotebookEvent } from '../events';\nimport './FileExplorerPanel.scss';\nimport { getDashboardSessionWrapper } from '../redux';\n\nconst log = Log.module('FileExplorerPanel');\n\ntype StateProps = {\n fileStorage: FileStorage;\n language: string;\n session?: IdeSession;\n};\n\ntype OwnProps = DashboardPanelProps;\n\nconst mapStateToProps = (state: RootState, ownProps: OwnProps): StateProps => {\n const fileStorage = getFileStorage(state);\n const sessionWrapper = getDashboardSessionWrapper(\n state,\n ownProps.localDashboardId\n );\n const { session, config: sessionConfig } = sessionWrapper ?? {};\n const language = sessionConfig?.type;\n\n return {\n fileStorage,\n language,\n session,\n };\n};\n\nconst connector = connect(mapStateToProps, null, null, { forwardRef: true });\n\nexport type FileExplorerPanelProps = OwnProps &\n StateProps &\n ConnectedProps<typeof connector>;\n\nexport type FileExplorerPanelState = {\n isShown: boolean;\n language?: string;\n session?: IdeSession;\n showCreateFolder: boolean;\n focusedFilePath: string;\n};\n\nfunction isMouseEvent<T>(e: React.SyntheticEvent<T>): e is React.MouseEvent<T> {\n const mouseEvent = e as React.MouseEvent<T>;\n return mouseEvent != null && typeof mouseEvent.button === 'number';\n}\n\n/**\n * Panel for showing a FileExplorer in a Dashboard.\n */\nexport class FileExplorerPanel extends React.Component<\n FileExplorerPanelProps,\n FileExplorerPanelState\n> {\n static COMPONENT = 'FileExplorerPanel';\n\n static TITLE = 'File Explorer';\n\n static handleError(error: Error): void {\n log.error(error);\n }\n\n /**\n * Return true if the event should open a file and focus it, otherwise false\n * @param event The event to check\n */\n static isFocusEvent(event: React.SyntheticEvent): boolean {\n if (isMouseEvent(event)) {\n // If it's not a double click, then it's a preview event\n return event.detail >= 2;\n }\n\n // Keyboard event should always open with focus\n return true;\n }\n\n constructor(props: FileExplorerPanelProps) {\n super(props);\n\n this.handleFileSelect = this.handleFileSelect.bind(this);\n this.handleCreateFile = this.handleCreateFile.bind(this);\n this.handleCreateDirectory = this.handleCreateDirectory.bind(this);\n this.handleCreateDirectoryCancel = this.handleCreateDirectoryCancel.bind(\n this\n );\n this.handleCreateDirectorySubmit = this.handleCreateDirectorySubmit.bind(\n this\n );\n this.handleDelete = this.handleDelete.bind(this);\n this.handleRename = this.handleRename.bind(this);\n this.handleSessionOpened = this.handleSessionOpened.bind(this);\n this.handleSessionClosed = this.handleSessionClosed.bind(this);\n this.handleShow = this.handleShow.bind(this);\n this.handleSelectionChange = this.handleSelectionChange.bind(this);\n\n const { session, language } = props;\n this.state = {\n isShown: false,\n language,\n session,\n showCreateFolder: false,\n focusedFilePath: '/',\n };\n }\n\n componentDidMount(): void {\n if (!this.isHidden()) {\n this.setState({ isShown: true });\n }\n }\n\n handleCreateFile(): void {\n const { glEventHub } = this.props;\n const { session, language } = this.state;\n const notebookSettings = {\n language,\n value: '',\n };\n log.debug('handleCreateFile', session, language, notebookSettings);\n glEventHub.emit(\n NotebookEvent.CREATE_NOTEBOOK,\n session,\n language,\n notebookSettings\n );\n }\n\n handleCreateDirectory(path?: string): void {\n this.setState({ showCreateFolder: true });\n }\n\n handleCreateDirectoryCancel(): void {\n log.debug('handleCreateDirectoryCancel');\n this.setState({\n showCreateFolder: false,\n });\n }\n\n handleCreateDirectorySubmit(path: string): void {\n log.debug('handleCreateDirectorySubmit', path);\n this.setState({ showCreateFolder: false });\n const { fileStorage } = this.props;\n fileStorage.createDirectory(path).catch(FileExplorerPanel.handleError);\n }\n\n handleDelete(files: FileStorageItem[]): void {\n const { glEventHub } = this.props;\n files.forEach(file => {\n glEventHub.emit(NotebookEvent.CLOSE_FILE, {\n id: file.filename,\n itemName: file.filename,\n });\n });\n }\n\n handleSelectionChange(selectedItems: FileStorageItem[]): void {\n let path = '/';\n if (selectedItems.length === 1) {\n if (selectedItems[0].type === 'directory') {\n path = FileUtils.makePath(selectedItems[0].filename);\n } else {\n path = FileUtils.getPath(selectedItems[0].filename);\n }\n }\n this.setState({ focusedFilePath: path });\n }\n\n handleFileSelect(file: FileStorageItem, event: React.SyntheticEvent): void {\n log.debug('fileSelect', file);\n if (file.type === 'directory') {\n return;\n }\n\n const shouldFocus = FileExplorerPanel.isFocusEvent(event);\n const fileMetadata = { id: file.filename, itemName: file.filename };\n const { glEventHub } = this.props;\n const { session, language } = this.state;\n const notebookSettings = {\n value: null,\n language,\n };\n glEventHub.emit(\n NotebookEvent.SELECT_NOTEBOOK,\n session,\n language,\n notebookSettings,\n fileMetadata,\n shouldFocus\n );\n }\n\n handleRename(oldName: string, newName: string): void {\n const { glEventHub } = this.props;\n log.debug('handleRename', oldName, newName);\n glEventHub.emit(NotebookEvent.RENAME_FILE, oldName, newName);\n }\n\n handleSessionOpened(\n session: IdeSession,\n { language }: { language: string }\n ): void {\n this.setState({\n session,\n language,\n });\n }\n\n handleSessionClosed(): void {\n this.setState({\n session: undefined,\n language: undefined,\n });\n }\n\n handleShow(): void {\n this.setState({ isShown: true });\n }\n\n isHidden(): boolean {\n const { glContainer } = this.props;\n const { isHidden } = glContainer;\n return isHidden;\n }\n\n render(): ReactNode {\n const { fileStorage, glContainer, glEventHub } = this.props;\n const { isShown, showCreateFolder, focusedFilePath } = this.state;\n return (\n <Panel\n className=\"file-explorer-panel\"\n componentPanel={this}\n glContainer={glContainer}\n glEventHub={glEventHub}\n onSessionOpen={this.handleSessionOpened}\n onSessionClose={this.handleSessionClosed}\n onShow={this.handleShow}\n >\n <FileExplorerToolbar\n createFile={this.handleCreateFile}\n createFolder={this.handleCreateDirectory}\n />\n {isShown && (\n <FileExplorer\n isMultiSelect\n storage={fileStorage}\n onDelete={this.handleDelete}\n onRename={this.handleRename}\n onSelect={this.handleFileSelect}\n onSelectionChange={this.handleSelectionChange}\n />\n )}\n <NewItemModal\n isOpen={showCreateFolder}\n type=\"directory\"\n title=\"Create New Folder\"\n storage={fileStorage}\n onSubmit={this.handleCreateDirectorySubmit}\n onCancel={this.handleCreateDirectoryCancel}\n defaultValue={focusedFilePath}\n />\n </Panel>\n );\n }\n}\n\nconst ConnectedFileExplorerPanel = connector(FileExplorerPanel);\n\nexport default ConnectedFileExplorerPanel;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FileExplorerPanel.js","names":["Log","getFileStorage","FileExplorer","FileExplorerToolbar","FileUtils","NewItemModal","React","connect","Panel","NotebookEvent","getDashboardSessionWrapper","log","module","mapStateToProps","state","ownProps","fileStorage","sessionWrapper","localDashboardId","session","config","sessionConfig","language","type","connector","forwardRef","isMouseEvent","e","mouseEvent","button","FileExplorerPanel","Component","handleError","error","isFocusEvent","event","detail","constructor","props","handleFileSelect","bind","handleCreateFile","handleCreateDirectory","handleCreateDirectoryCancel","handleCreateDirectorySubmit","handleDelete","handleRename","handleSessionOpened","handleSessionClosed","handleShow","handleSelectionChange","isShown","showCreateFolder","focusedFilePath","componentDidMount","isHidden","setState","glEventHub","notebookSettings","value","debug","emit","CREATE_NOTEBOOK","path","createDirectory","catch","files","forEach","file","CLOSE_FILE","id","filename","itemName","selectedItems","length","makePath","getPath","shouldFocus","fileMetadata","SELECT_NOTEBOOK","oldName","newName","RENAME_FILE","undefined","glContainer","render","ConnectedFileExplorerPanel"],"sources":["../../src/panels/FileExplorerPanel.tsx"],"sourcesContent":["import { DashboardPanelProps } from '@deephaven/dashboard';\nimport Log from '@deephaven/log';\nimport { getFileStorage, RootState } from '@deephaven/redux';\nimport FileExplorer, {\n FileExplorerToolbar,\n FileStorage,\n FileStorageItem,\n FileUtils,\n NewItemModal,\n} from '@deephaven/file-explorer';\nimport React, { ReactNode } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\nimport type { IdeSession } from '@deephaven/jsapi-types';\nimport Panel from './Panel';\nimport { NotebookEvent } from '../events';\nimport './FileExplorerPanel.scss';\nimport { getDashboardSessionWrapper } from '../redux';\n\nconst log = Log.module('FileExplorerPanel');\n\ntype StateProps = {\n fileStorage: FileStorage;\n language: string;\n session?: IdeSession;\n};\n\ntype OwnProps = DashboardPanelProps;\n\nconst mapStateToProps = (state: RootState, ownProps: OwnProps): StateProps => {\n const fileStorage = getFileStorage(state);\n const sessionWrapper = getDashboardSessionWrapper(\n state,\n ownProps.localDashboardId\n );\n const { session, config: sessionConfig } = sessionWrapper ?? {};\n const language = sessionConfig?.type;\n\n return {\n fileStorage,\n language,\n session,\n };\n};\n\nconst connector = connect(mapStateToProps, null, null, { forwardRef: true });\n\nexport type FileExplorerPanelProps = OwnProps &\n StateProps &\n ConnectedProps<typeof connector>;\n\nexport type FileExplorerPanelState = {\n isShown: boolean;\n language?: string;\n session?: IdeSession;\n showCreateFolder: boolean;\n focusedFilePath: string;\n};\n\nfunction isMouseEvent<T>(e: React.SyntheticEvent<T>): e is React.MouseEvent<T> {\n const mouseEvent = e as React.MouseEvent<T>;\n return mouseEvent != null && typeof mouseEvent.button === 'number';\n}\n\n/**\n * Panel for showing a FileExplorer in a Dashboard.\n */\nexport class FileExplorerPanel extends React.Component<\n FileExplorerPanelProps,\n FileExplorerPanelState\n> {\n static COMPONENT = 'FileExplorerPanel';\n\n static TITLE = 'File Explorer';\n\n static handleError(error: Error): void {\n log.error(error);\n }\n\n /**\n * Return true if the event should open a file and focus it, otherwise false\n * @param event The event to check\n */\n static isFocusEvent(event: React.SyntheticEvent): boolean {\n if (isMouseEvent(event)) {\n // If it's not a double click, then it's a preview event\n return event.detail >= 2;\n }\n\n // Keyboard event should always open with focus\n return true;\n }\n\n constructor(props: FileExplorerPanelProps) {\n super(props);\n\n this.handleFileSelect = this.handleFileSelect.bind(this);\n this.handleCreateFile = this.handleCreateFile.bind(this);\n this.handleCreateDirectory = this.handleCreateDirectory.bind(this);\n this.handleCreateDirectoryCancel =\n this.handleCreateDirectoryCancel.bind(this);\n this.handleCreateDirectorySubmit =\n this.handleCreateDirectorySubmit.bind(this);\n this.handleDelete = this.handleDelete.bind(this);\n this.handleRename = this.handleRename.bind(this);\n this.handleSessionOpened = this.handleSessionOpened.bind(this);\n this.handleSessionClosed = this.handleSessionClosed.bind(this);\n this.handleShow = this.handleShow.bind(this);\n this.handleSelectionChange = this.handleSelectionChange.bind(this);\n\n const { session, language } = props;\n this.state = {\n isShown: false,\n language,\n session,\n showCreateFolder: false,\n focusedFilePath: '/',\n };\n }\n\n componentDidMount(): void {\n if (!this.isHidden()) {\n this.setState({ isShown: true });\n }\n }\n\n handleCreateFile(): void {\n const { glEventHub } = this.props;\n const { session, language } = this.state;\n const notebookSettings = {\n language,\n value: '',\n };\n log.debug('handleCreateFile', session, language, notebookSettings);\n glEventHub.emit(\n NotebookEvent.CREATE_NOTEBOOK,\n session,\n language,\n notebookSettings\n );\n }\n\n handleCreateDirectory(path?: string): void {\n this.setState({ showCreateFolder: true });\n }\n\n handleCreateDirectoryCancel(): void {\n log.debug('handleCreateDirectoryCancel');\n this.setState({\n showCreateFolder: false,\n });\n }\n\n handleCreateDirectorySubmit(path: string): void {\n log.debug('handleCreateDirectorySubmit', path);\n this.setState({ showCreateFolder: false });\n const { fileStorage } = this.props;\n fileStorage.createDirectory(path).catch(FileExplorerPanel.handleError);\n }\n\n handleDelete(files: FileStorageItem[]): void {\n const { glEventHub } = this.props;\n files.forEach(file => {\n glEventHub.emit(NotebookEvent.CLOSE_FILE, {\n id: file.filename,\n itemName: file.filename,\n });\n });\n }\n\n handleSelectionChange(selectedItems: FileStorageItem[]): void {\n let path = '/';\n if (selectedItems.length === 1) {\n if (selectedItems[0].type === 'directory') {\n path = FileUtils.makePath(selectedItems[0].filename);\n } else {\n path = FileUtils.getPath(selectedItems[0].filename);\n }\n }\n this.setState({ focusedFilePath: path });\n }\n\n handleFileSelect(file: FileStorageItem, event: React.SyntheticEvent): void {\n log.debug('fileSelect', file);\n if (file.type === 'directory') {\n return;\n }\n\n const shouldFocus = FileExplorerPanel.isFocusEvent(event);\n const fileMetadata = { id: file.filename, itemName: file.filename };\n const { glEventHub } = this.props;\n const { session, language } = this.state;\n const notebookSettings = {\n value: null,\n language,\n };\n glEventHub.emit(\n NotebookEvent.SELECT_NOTEBOOK,\n session,\n language,\n notebookSettings,\n fileMetadata,\n shouldFocus\n );\n }\n\n handleRename(oldName: string, newName: string): void {\n const { glEventHub } = this.props;\n log.debug('handleRename', oldName, newName);\n glEventHub.emit(NotebookEvent.RENAME_FILE, oldName, newName);\n }\n\n handleSessionOpened(\n session: IdeSession,\n { language }: { language: string }\n ): void {\n this.setState({\n session,\n language,\n });\n }\n\n handleSessionClosed(): void {\n this.setState({\n session: undefined,\n language: undefined,\n });\n }\n\n handleShow(): void {\n this.setState({ isShown: true });\n }\n\n isHidden(): boolean {\n const { glContainer } = this.props;\n const { isHidden } = glContainer;\n return isHidden;\n }\n\n render(): ReactNode {\n const { fileStorage, glContainer, glEventHub } = this.props;\n const { isShown, showCreateFolder, focusedFilePath } = this.state;\n return (\n <Panel\n className=\"file-explorer-panel\"\n componentPanel={this}\n glContainer={glContainer}\n glEventHub={glEventHub}\n onSessionOpen={this.handleSessionOpened}\n onSessionClose={this.handleSessionClosed}\n onShow={this.handleShow}\n >\n <FileExplorerToolbar\n createFile={this.handleCreateFile}\n createFolder={this.handleCreateDirectory}\n />\n {isShown && (\n <FileExplorer\n isMultiSelect\n storage={fileStorage}\n onDelete={this.handleDelete}\n onRename={this.handleRename}\n onSelect={this.handleFileSelect}\n onSelectionChange={this.handleSelectionChange}\n />\n )}\n <NewItemModal\n isOpen={showCreateFolder}\n type=\"directory\"\n title=\"Create New Folder\"\n storage={fileStorage}\n onSubmit={this.handleCreateDirectorySubmit}\n onCancel={this.handleCreateDirectoryCancel}\n defaultValue={focusedFilePath}\n />\n </Panel>\n );\n }\n}\n\nconst ConnectedFileExplorerPanel = connector(FileExplorerPanel);\n\nexport default ConnectedFileExplorerPanel;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterSetManager.d.ts","sourceRoot":"","sources":["../../src/panels/FilterSetManager.tsx"],"names":[],"mappings":"AAIA,OAAc,EACZ,WAAW,EACX,SAAS,EACT,SAAS,EACT,aAAa,EACb,UAAU,EACX,MAAM,OAAO,CAAC;AAmBf,OAAO,yBAAyB,CAAC;AAIjC,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,qBAAqB;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,cAAc,IAAI,cAAc,EAAE,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACxC,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IACpC,YAAY,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9D;AAED,UAAU,qBAAqB;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB,kBAAkB,EAAE,SAAS,EAAE,CAAC;IAChC,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAMD,cAAM,gBAAiB,SAAQ,SAAS,CACtC,qBAAqB,EACrB,qBAAqB,CACtB;IACC,MAAM,CAAC,kBAAkB,IAAI,IAAI;gBAUrB,KAAK,EAAE,qBAAqB;
|
|
1
|
+
{"version":3,"file":"FilterSetManager.d.ts","sourceRoot":"","sources":["../../src/panels/FilterSetManager.tsx"],"names":[],"mappings":"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"}
|
|
@@ -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 <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
|
+
{"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 =\n this.handleRestoreFullStateChange.bind(this);\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 { nameInputValue, renameSet, modifiedFilterSets, 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 +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","ConnectedFilterSetManagerPanel","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 type { TableTemplate } from '@deephaven/jsapi-types';\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\nconst ConnectedFilterSetManagerPanel = connect(\n mapStateToProps,\n {\n setDashboardFilterSets: setDashboardFilterSetsAction,\n },\n null,\n { forwardRef: true }\n)(FilterSetManagerPanel);\n\nexport default ConnectedFilterSetManagerPanel;\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","ConnectedFilterSetManagerPanel","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 type { TableTemplate } from '@deephaven/jsapi-types';\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(panel: PanelComponent): panel is PanelComponent & {\n setPanelState: (state: InputFilterPanelState) => void;\n} {\n return (\n (\n panel as PanelComponent & {\n setPanelState: (state: InputFilterPanelState) => void;\n }\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\nconst ConnectedFilterSetManagerPanel = connect(\n mapStateToProps,\n {\n setDashboardFilterSets: setDashboardFilterSetsAction,\n },\n null,\n { forwardRef: true }\n)(FilterSetManagerPanel);\n\nexport default ConnectedFilterSetManagerPanel;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputFilterPanel.d.ts","sourceRoot":"","sources":["../../src/panels/InputFilterPanel.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGpD,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxE,OAAO,WAAW,EAAE,EAClB,iBAAiB,EAClB,MAAM,sCAAsC,CAAC;AAM9C,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,qBAAqB;IAC7B,WAAW,EAAE,SAAS,CAAC;IACvB,UAAU,EAAE,YAAY,CAAC;IACzB,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC9B;AAED,UAAU,qBAAqB;IAC7B,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IAEpB,UAAU,EAAE,UAAU,CAAC;CACxB;AACD,cAAM,gBAAiB,SAAQ,SAAS,CACtC,qBAAqB,EACrB,qBAAqB,CACtB;IACC,MAAM,CAAC,YAAY;;MAEjB;IAEF,MAAM,CAAC,SAAS,SAAsB;IAItC,MAAM,CAAC,WAAW,SAAsB;gBAE5B,KAAK,EAAE,qBAAqB;
|
|
1
|
+
{"version":3,"file":"InputFilterPanel.d.ts","sourceRoot":"","sources":["../../src/panels/InputFilterPanel.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGpD,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxE,OAAO,WAAW,EAAE,EAClB,iBAAiB,EAClB,MAAM,sCAAsC,CAAC;AAM9C,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,qBAAqB;IAC7B,WAAW,EAAE,SAAS,CAAC;IACvB,UAAU,EAAE,YAAY,CAAC;IACzB,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC9B;AAED,UAAU,qBAAqB;IAC7B,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IAEpB,UAAU,EAAE,UAAU,CAAC;CACxB;AACD,cAAM,gBAAiB,SAAQ,SAAS,CACtC,qBAAqB,EACrB,qBAAqB,CACtB;IACC,MAAM,CAAC,YAAY;;MAEjB;IAEF,MAAM,CAAC,SAAS,SAAsB;IAItC,MAAM,CAAC,WAAW,SAAsB;gBAE5B,KAAK,EAAE,qBAAqB;IAkCxC,iBAAiB;IAUjB,kBAAkB,CAAC,SAAS,EAAE,qBAAqB;IAOnD,cAAc,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IAEvC,YAAY,CAAC,EACX,MAAM,EACN,YAAoB,EACpB,KAAK,GACN,EAAE;QACD,MAAM,CAAC,EAAE,iBAAiB,CAAC;QAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB;IA6CD,qBAAqB,IAAI,IAAI;IAI7B,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAU3E;;;;OAIG;IACH,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,UAAQ;IASnD,aAAa;IA6Bb,MAAM;CAwBP;AAaD,QAAA,MAAM,yBAAyB;;;sBATC,MAAM;EAWlB,CAAC;AAErB,eAAe,yBAAyB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputFilterPanel.js","names":["React","Component","connect","debounce","Panel","InputFilter","InputFilterEvent","getColumnsForDashboard","INPUT_FILTER_DEBOUNCE","InputFilterPanel","constructor","props","handleChange","bind","handleClearAllFilters","inputFilterRef","createRef","panelState","value","isValueShown","name","type","timestamp","state","columns","column","undefined","wasFlipped","skipUpdate","componentDidMount","updateColumns","sendUpdate","componentDidUpdate","prevProps","Date","now","setState","prevTimestamp","isFlip","current","clearFilter","glEventHub","emit","FILTERS_CHANGED","setPanelState","setFilterState","length","find","render","glContainer","mapStateToProps","ownProps","localDashboardId","ConnectedInputFilterPanel","forwardRef"],"sources":["../../src/panels/InputFilterPanel.tsx"],"sourcesContent":["import React, { Component, RefObject } from 'react';\nimport { connect } from 'react-redux';\nimport debounce from 'lodash.debounce';\nimport type { Container, EventEmitter } from '@deephaven/golden-layout';\nimport { RootState } from '@deephaven/redux';\nimport Panel from './Panel';\nimport InputFilter, {\n InputFilterColumn,\n} from '../controls/input-filter/InputFilter';\nimport { InputFilterEvent } from '../events';\nimport { getColumnsForDashboard } from '../redux';\n\nconst INPUT_FILTER_DEBOUNCE = 250;\n\nexport interface PanelState {\n name?: string;\n type?: string;\n value?: string;\n isValueShown?: boolean;\n timestamp?: number;\n}\n\ninterface InputFilterPanelProps {\n glContainer: Container;\n glEventHub: EventEmitter;\n panelState: PanelState;\n columns: InputFilterColumn[];\n}\n\ninterface InputFilterPanelState {\n columns: InputFilterColumn[];\n column?: InputFilterColumn;\n value?: string;\n timestamp?: number;\n isValueShown: boolean;\n wasFlipped: boolean;\n skipUpdate: boolean;\n // eslint-disable-next-line react/no-unused-state\n panelState: PanelState; // Dehydrated panel state that can load this panel}\n}\nclass InputFilterPanel extends Component<\n InputFilterPanelProps,\n InputFilterPanelState\n> {\n static defaultProps = {\n panelState: null,\n };\n\n static COMPONENT = 'InputFilterPanel';\n\n // Have to explicitly specify displayName\n // otherwise it gets minified and breaks LayoutUtils.getComponentName\n static displayName = 'InputFilterPanel';\n\n constructor(props: InputFilterPanelProps) {\n super(props);\n\n this.handleChange = debounce(\n this.handleChange.bind(this),\n INPUT_FILTER_DEBOUNCE\n );\n this.handleClearAllFilters = this.handleClearAllFilters.bind(this);\n\n this.inputFilterRef = React.createRef();\n\n const { panelState } = props;\n // if panelstate is null, use destructured defaults\n const { value, isValueShown = false, name, type, timestamp } =\n panelState ?? {};\n\n this.state = {\n columns: [],\n column: name != null && type != null ? { name, type } : undefined,\n value,\n timestamp,\n isValueShown,\n wasFlipped: false,\n skipUpdate: false,\n // eslint-disable-next-line react/no-unused-state\n panelState, // Dehydrated panel state that can load this panel\n };\n }\n\n componentDidMount() {\n this.updateColumns();\n\n const { column, value, timestamp } = this.state;\n if (column != null) {\n const { name, type } = column;\n this.sendUpdate(name, type, value, timestamp);\n }\n }\n\n componentDidUpdate(prevProps: InputFilterPanelProps) {\n const { columns } = this.props;\n if (columns !== prevProps.columns) {\n this.updateColumns();\n }\n }\n\n inputFilterRef: RefObject<InputFilter>;\n\n handleChange({\n column,\n isValueShown = false,\n value,\n }: {\n column?: InputFilterColumn;\n isValueShown?: boolean;\n value?: string;\n }) {\n let name: string | undefined;\n let type: string | undefined;\n if (column != null) {\n ({ name, type } = column);\n }\n let sendUpdate = true;\n let timestamp: number | undefined = Date.now();\n this.setState(\n ({ panelState, timestamp: prevTimestamp, wasFlipped, skipUpdate }) => {\n // If the user had a value set, and they flip the card over and flip it back without changing any settings, ignore it\n const isFlip =\n panelState != null &&\n isValueShown !== panelState.isValueShown &&\n name === panelState.name &&\n type === panelState.type &&\n value === panelState.value;\n sendUpdate =\n (!skipUpdate && isValueShown && (!isFlip || !wasFlipped)) ?? false;\n\n if (!sendUpdate) {\n timestamp = prevTimestamp;\n }\n\n return {\n panelState: {\n isValueShown,\n name,\n type,\n value,\n timestamp,\n },\n timestamp,\n wasFlipped: isFlip,\n skipUpdate: false,\n };\n },\n () => {\n if (sendUpdate) {\n this.sendUpdate(name, type, value, timestamp);\n }\n }\n );\n }\n\n handleClearAllFilters(): void {\n this.inputFilterRef.current?.clearFilter();\n }\n\n sendUpdate(name?: string, type?: string, value?: string, timestamp?: number) {\n const { glEventHub } = this.props;\n glEventHub.emit(InputFilterEvent.FILTERS_CHANGED, this, {\n name,\n type,\n value,\n timestamp,\n });\n }\n\n /**\n * Set the filter value, card side, selected column\n * @param state Filter state to set\n * @param sendUpdate Emit filters changed event if true\n */\n setPanelState(state: PanelState, sendUpdate = false) {\n // Set the skipUpdate flag so the next onChange handler call doesn't emit the FILTERS_CHANGED event\n this.setState({ skipUpdate: !sendUpdate });\n\n // Changing the inputFilter state via props doesn't quite work because of the delays on manual input changes\n // Setting the ref state directly triggers the onChange handler and updates the panelState\n this.inputFilterRef.current?.setFilterState(state);\n }\n\n updateColumns() {\n const { columns } = this.props;\n if (columns == null) {\n return;\n }\n\n this.setState(state => {\n const { column } = state;\n\n if (column == null && columns.length > 0) {\n return {\n columns: [...columns],\n column: columns[0],\n };\n }\n\n if (\n column != null &&\n !columns.find(\n ({ name, type }) => column.name === name && column.type === type\n )\n ) {\n return { columns: [...columns, column] };\n }\n\n return { columns: [...columns] };\n });\n }\n\n render() {\n const { glContainer, glEventHub } = this.props;\n const { column, columns, isValueShown, value } = this.state;\n return (\n <Panel\n className=\"iris-input-filter-panel\"\n componentPanel={this}\n glContainer={glContainer}\n glEventHub={glEventHub}\n onClearAllFilters={this.handleClearAllFilters}\n isClonable\n isRenamable\n >\n <InputFilter\n ref={this.inputFilterRef}\n column={column}\n columns={columns}\n onChange={this.handleChange}\n isValueShown={isValueShown}\n value={value}\n />\n </Panel>\n );\n }\n}\n\nconst mapStateToProps = (\n state: RootState,\n ownProps: { localDashboardId: string }\n) => {\n const { localDashboardId } = ownProps;\n\n return {\n columns: getColumnsForDashboard(state, localDashboardId),\n };\n};\n\nconst ConnectedInputFilterPanel = connect(mapStateToProps, null, null, {\n forwardRef: true,\n})(InputFilterPanel);\n\nexport default ConnectedInputFilterPanel;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"InputFilterPanel.js","names":["React","Component","connect","debounce","Panel","InputFilter","InputFilterEvent","getColumnsForDashboard","INPUT_FILTER_DEBOUNCE","InputFilterPanel","constructor","props","handleChange","bind","handleClearAllFilters","inputFilterRef","createRef","panelState","value","isValueShown","name","type","timestamp","state","columns","column","undefined","wasFlipped","skipUpdate","componentDidMount","updateColumns","sendUpdate","componentDidUpdate","prevProps","Date","now","setState","prevTimestamp","isFlip","current","clearFilter","glEventHub","emit","FILTERS_CHANGED","setPanelState","setFilterState","length","find","render","glContainer","mapStateToProps","ownProps","localDashboardId","ConnectedInputFilterPanel","forwardRef"],"sources":["../../src/panels/InputFilterPanel.tsx"],"sourcesContent":["import React, { Component, RefObject } from 'react';\nimport { connect } from 'react-redux';\nimport debounce from 'lodash.debounce';\nimport type { Container, EventEmitter } from '@deephaven/golden-layout';\nimport { RootState } from '@deephaven/redux';\nimport Panel from './Panel';\nimport InputFilter, {\n InputFilterColumn,\n} from '../controls/input-filter/InputFilter';\nimport { InputFilterEvent } from '../events';\nimport { getColumnsForDashboard } from '../redux';\n\nconst INPUT_FILTER_DEBOUNCE = 250;\n\nexport interface PanelState {\n name?: string;\n type?: string;\n value?: string;\n isValueShown?: boolean;\n timestamp?: number;\n}\n\ninterface InputFilterPanelProps {\n glContainer: Container;\n glEventHub: EventEmitter;\n panelState: PanelState;\n columns: InputFilterColumn[];\n}\n\ninterface InputFilterPanelState {\n columns: InputFilterColumn[];\n column?: InputFilterColumn;\n value?: string;\n timestamp?: number;\n isValueShown: boolean;\n wasFlipped: boolean;\n skipUpdate: boolean;\n // eslint-disable-next-line react/no-unused-state\n panelState: PanelState; // Dehydrated panel state that can load this panel}\n}\nclass InputFilterPanel extends Component<\n InputFilterPanelProps,\n InputFilterPanelState\n> {\n static defaultProps = {\n panelState: null,\n };\n\n static COMPONENT = 'InputFilterPanel';\n\n // Have to explicitly specify displayName\n // otherwise it gets minified and breaks LayoutUtils.getComponentName\n static displayName = 'InputFilterPanel';\n\n constructor(props: InputFilterPanelProps) {\n super(props);\n\n this.handleChange = debounce(\n this.handleChange.bind(this),\n INPUT_FILTER_DEBOUNCE\n );\n this.handleClearAllFilters = this.handleClearAllFilters.bind(this);\n\n this.inputFilterRef = React.createRef();\n\n const { panelState } = props;\n // if panelstate is null, use destructured defaults\n const {\n value,\n isValueShown = false,\n name,\n type,\n timestamp,\n } = panelState ?? {};\n\n this.state = {\n columns: [],\n column: name != null && type != null ? { name, type } : undefined,\n value,\n timestamp,\n isValueShown,\n wasFlipped: false,\n skipUpdate: false,\n // eslint-disable-next-line react/no-unused-state\n panelState, // Dehydrated panel state that can load this panel\n };\n }\n\n componentDidMount() {\n this.updateColumns();\n\n const { column, value, timestamp } = this.state;\n if (column != null) {\n const { name, type } = column;\n this.sendUpdate(name, type, value, timestamp);\n }\n }\n\n componentDidUpdate(prevProps: InputFilterPanelProps) {\n const { columns } = this.props;\n if (columns !== prevProps.columns) {\n this.updateColumns();\n }\n }\n\n inputFilterRef: RefObject<InputFilter>;\n\n handleChange({\n column,\n isValueShown = false,\n value,\n }: {\n column?: InputFilterColumn;\n isValueShown?: boolean;\n value?: string;\n }) {\n let name: string | undefined;\n let type: string | undefined;\n if (column != null) {\n ({ name, type } = column);\n }\n let sendUpdate = true;\n let timestamp: number | undefined = Date.now();\n this.setState(\n ({ panelState, timestamp: prevTimestamp, wasFlipped, skipUpdate }) => {\n // If the user had a value set, and they flip the card over and flip it back without changing any settings, ignore it\n const isFlip =\n panelState != null &&\n isValueShown !== panelState.isValueShown &&\n name === panelState.name &&\n type === panelState.type &&\n value === panelState.value;\n sendUpdate =\n (!skipUpdate && isValueShown && (!isFlip || !wasFlipped)) ?? false;\n\n if (!sendUpdate) {\n timestamp = prevTimestamp;\n }\n\n return {\n panelState: {\n isValueShown,\n name,\n type,\n value,\n timestamp,\n },\n timestamp,\n wasFlipped: isFlip,\n skipUpdate: false,\n };\n },\n () => {\n if (sendUpdate) {\n this.sendUpdate(name, type, value, timestamp);\n }\n }\n );\n }\n\n handleClearAllFilters(): void {\n this.inputFilterRef.current?.clearFilter();\n }\n\n sendUpdate(name?: string, type?: string, value?: string, timestamp?: number) {\n const { glEventHub } = this.props;\n glEventHub.emit(InputFilterEvent.FILTERS_CHANGED, this, {\n name,\n type,\n value,\n timestamp,\n });\n }\n\n /**\n * Set the filter value, card side, selected column\n * @param state Filter state to set\n * @param sendUpdate Emit filters changed event if true\n */\n setPanelState(state: PanelState, sendUpdate = false) {\n // Set the skipUpdate flag so the next onChange handler call doesn't emit the FILTERS_CHANGED event\n this.setState({ skipUpdate: !sendUpdate });\n\n // Changing the inputFilter state via props doesn't quite work because of the delays on manual input changes\n // Setting the ref state directly triggers the onChange handler and updates the panelState\n this.inputFilterRef.current?.setFilterState(state);\n }\n\n updateColumns() {\n const { columns } = this.props;\n if (columns == null) {\n return;\n }\n\n this.setState(state => {\n const { column } = state;\n\n if (column == null && columns.length > 0) {\n return {\n columns: [...columns],\n column: columns[0],\n };\n }\n\n if (\n column != null &&\n !columns.find(\n ({ name, type }) => column.name === name && column.type === type\n )\n ) {\n return { columns: [...columns, column] };\n }\n\n return { columns: [...columns] };\n });\n }\n\n render() {\n const { glContainer, glEventHub } = this.props;\n const { column, columns, isValueShown, value } = this.state;\n return (\n <Panel\n className=\"iris-input-filter-panel\"\n componentPanel={this}\n glContainer={glContainer}\n glEventHub={glEventHub}\n onClearAllFilters={this.handleClearAllFilters}\n isClonable\n isRenamable\n >\n <InputFilter\n ref={this.inputFilterRef}\n column={column}\n columns={columns}\n onChange={this.handleChange}\n isValueShown={isValueShown}\n value={value}\n />\n </Panel>\n );\n }\n}\n\nconst mapStateToProps = (\n state: RootState,\n ownProps: { localDashboardId: string }\n) => {\n const { localDashboardId } = ownProps;\n\n return {\n columns: getColumnsForDashboard(state, localDashboardId),\n };\n};\n\nconst ConnectedInputFilterPanel = connect(mapStateToProps, null, null, {\n forwardRef: true,\n})(InputFilterPanel);\n\nexport default ConnectedInputFilterPanel;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sourceRoot":"","sources":["../../../../node_modules/@deephaven/components/scss/custom.scss","../../src/panels/IrisGridPanel.scss","../../../../node_modules/@deephaven/components/scss/new_variables.scss","../../../../node_modules/@deephaven/components/scss/bootstrap_overrides.scss"],"names":[],"mappings":"AAAA;ACKE;EACE;EACA;;;AAKF;EACE;;;AAKF;EACE,aAjBwB;;;AAsB1B;EACE,SCvBO;EDwBP,OEvBE;;;AF2BN;EACE","file":"IrisGridPanel.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$panel-message-overlay-top: 30px;\n\n.iris-grid-panel.disconnected {\n .iris-grid {\n filter: grayscale(100%);\n opacity: 0.18;\n }\n}\n\n.iris-grid-panel.inactive {\n .iris-grid {\n filter: grayscale(100%);\n }\n}\n\n.iris-grid-panel {\n .iris-panel-message-overlay {\n padding-top: $panel-message-overlay-top;\n }\n}\n\n.iris-grid-plugin {\n .error-message {\n padding: $spacer-1;\n color: $danger;\n }\n}\n\n.grid-cursor-linker {\n cursor: crosshair;\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","// Styling overrides for bootstrap\n\n// Override / set color variables\n$red: #f95d84;\n$orange: #f37e3f;\n$yellow: #fcd65b;\n$green: #9edc6f;\n$blue: #76d9e4;\n$purple: #aa9af4;\n\n//Define some UI colors\n$interfacegray: #2d2a2e;\n$interfaceblue: #4878ea;\n$interfacewhite: #f0f0ee; //same as gray-200\n$interfaceblack: #1a171a;\n\n//Define our Gray scale\n$white: $interfacewhite;\n$gray-100: #fcfcfa;\n$gray-200: $interfacewhite;\n$gray-300: #c0bfbf;\n$gray-400: #929192;\n$gray-500: #5b5a5c;\n$gray-600: #555356;\n$gray-700: #403e41;\n$gray-800: #373438;\n$gray-850: #322f33;\n$gray-900: #211f22;\n$black: $interfaceblack;\n$content-bg: $interfacegray;\n$background: $interfaceblack;\n$foreground: $interfacewhite;\n\n//Load colors into map\n$colors: ();\n$colors: map-merge(\n (\n 'red': $red,\n 'orange': $orange,\n 'yellow': $yellow,\n 'green': $green,\n 'blue': $blue,\n 'purple': $purple,\n 'white': $white,\n 'black': $black,\n ),\n $colors\n);\n\n//Set default colors\n$body-bg: $black;\n$body-color: $interfacewhite;\n\n// Set brand colors\n$primary: $interfaceblue;\n$primary-hover: darken($primary, 8%);\n$primary-dark: mix($primary, $content-bg, 25%);\n$primary-light: scale-color($primary, $lightness: -25%);\n$secondary: $gray-500;\n$secondary-hover: darken($secondary, 8%);\n$success: $green;\n$info: $yellow;\n$warning: $orange;\n$danger: $red;\n$danger-hover: darken($danger, 8%);\n$light: $gray-100;\n$mid: $gray-400; //Added a mid color, useful for input styling\n$dark: $gray-800;\n$green-dark: scale-color($green, $lightness: -45%, $saturation: -10%);\n\n$theme-colors: () !default;\n$theme-colors: map-merge(\n (\n 'primary': $primary,\n 'primary-hover': $primary-hover,\n 'primary-light': $primary-light,\n 'primary-dark': $primary-dark,\n 'secondary': $secondary,\n 'success': $success,\n 'info': $info,\n 'warning': $warning,\n 'danger': $danger,\n 'light': $light,\n 'dark': $dark,\n 'mid': $mid,\n 'content-bg': $interfacegray,\n 'background': $interfaceblack,\n 'foreground': $interfacewhite,\n ),\n $theme-colors\n);\n\n$component-active-bg: $primary;\n$theme-color-interval: 9%;\n$yiq-contrasted-threshold: 180;\n\n// Override fonts\n$font-family-sans-serif: 'Fira Sans', -apple-system, blinkmacsystemfont,\n 'Segoe UI', 'Roboto', 'Helvetica Neue', arial, sans-serif; //fira sans then native system ui fallbacks\n$font-family-monospace: 'Fira Mono', menlo, monaco, consolas, 'Liberation Mono',\n 'Courier New', monospace;\n$font-family-base: $font-family-sans-serif;\n\n$headings-font-weight: 400;\n\n//Text overides\n$text-muted: $gray-400;\n\n//Style Selection highlight color\n//so browsers add alpha to your color by default, ignoring opacity 1\n//by setting rgba with 0.99 it tricks browser into thinking there is alpha applied\n$text-select-color: $primary-hover;\n$text-select-color-editor: lighten(\n $gray-700,\n 15%\n); //we lighten it abit to account for that 0.01 loss, and because it needs some anyways.\n\n//Grid variables, same value as default just making easily accessible\n$grid-gutter-width: 30px;\n\n//Visual Overrides\n$border-radius: 4px;\n$box-shadow: 0 0.1rem 1rem rgba($black, 45%); //because our UI is so dark, we need darker default shadows\n$box-shadow-900: 0 0.1rem 1rem rgba(0, 0, 0, 45%); //darkest shadow for $black popups over $black UI\n\n//Override Btn\n$btn-border-radius: 4rem;\n$btn-padding-x: 1.5rem;\n$btn-transition: color 0.12s ease-in-out, background-color 0.12s ease-in-out,\n border-color 0.12s ease-in-out, box-shadow 0.12s ease-in-out; //default 0.15 is too long\n$btn-border-width: 2px;\n\n//Override Inputs\n$input-bg: $gray-600;\n$input-disabled-bg: $gray-800;\n$input-color: $foreground;\n$input-border-color: $gray-400;\n$input-placeholder-color: $gray-400;\n$input-focus-border-color: rgba($primary, 85%);\n\n$input-btn-focus-width: 0.2rem;\n$input-btn-focus-color: rgba($component-active-bg, 35%);\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color;\n\n//checkbox\n$custom-control-indicator-bg: $gray-600;\n$custom-control-indicator-bg-size: 75% 75%;\n$custom-control-indicator-disabled-bg: $gray-800;\n$custom-control-indicator-checked-disabled-bg: $gray-800;\n$custom-control-label-disabled-color: $gray-400;\n\n//Custom Select\n$custom-select-indicator-color: $gray-400;\n$custom-select-bg-size: 16px 16px;\n//dhSort icon encoded\n$custom-select-indicator: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M4 7l-.4-.8 4-3.7h.8l4 3.7-.4.8H4zm0 2l-.4.8 4 3.7h.8l4-3.7L12 9H4z'/%3E%3C/svg%3E\"),\n '#',\n '%23'\n);\n$custom-select-focus-box-shadow: $input-btn-focus-box-shadow;\n$custom-select-disabled-color: darken($gray-400, 5%);\n$custom-select-disabled-bg: $gray-800;\n\n//modal\n$modal-content-bg: $gray-200;\n$modal-content-border-width: 0;\n$modal-md: 550px;\n\n// Toast notification\n$toast-bg: $primary-dark;\n$toast-color: $foreground;\n$toast-error-bg: mix($danger, $content-bg, 15%);\n$toast-error-color: $foreground;\n\n//tooltips\n$tooltip-bg: $gray-700;\n$tooltip-color: $foreground;\n$tooltip-box-shadow: 0 0.1rem 1.5rem 0.1rem rgba($black, 80%);\n\n//drowdowns\n$dropdown-bg: $gray-600;\n$dropdown-link-color: $foreground;\n$dropdown-link-hover-color: $foreground;\n$dropdown-link-hover-bg: $primary;\n$dropdown-divider-bg: $gray-700;\n\n//context menus\n$contextmenu-bg: $gray-600;\n$contextmenu-color: $foreground;\n$contextmenu-disabled-color: $text-muted;\n$contextmenu-keyboard-selected-bg: rgba($primary, 50%);\n$contextmenu-selected-bg: $primary;\n$contextmenu-selected-color: $foreground;\n\n//links\n$link-color: $gray-400;\n$link-hover-color: $foreground;\n\n//progress-bar\n$progress-bg: $gray-600;\n$progress-border-radius: 1rem;\n\n// Set global options\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-print-styles: false; //I don't think anyone should expect to \"print\" this app.\n\n// Transition times\n$transition: 0.15s;\n$transition-mid: 0.2s;\n$transition-long: 0.3s;\n$transition-slow: 0.6s;\n\n//form-validation icon, uses vsWarning icon encoded here as svg\n$form-feedback-icon-invalid-color: theme-color('danger');\n$form-feedback-icon-invalid: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cg fill='none'%3E%3Cg fill='#{$form-feedback-icon-invalid-color}'%3E%3Cpath d='M7.56 1h.88l6.54 12.26-.44.74H1.44L1 13.26 7.56 1zM8 2.28 2.28 13H13.7L8 2.28zM8.625 12v-1h-1.25v1h1.25zm-1.25-2V6h1.25v4h-1.25z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E \"),\n '#',\n '%23'\n);\n"]}
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../../../../node_modules/@deephaven/components/scss/custom.scss","../../src/panels/IrisGridPanel.scss","../../../../node_modules/@deephaven/components/scss/new_variables.scss","../../../../node_modules/@deephaven/components/scss/bootstrap_overrides.scss"],"names":[],"mappings":"AAAA;ACKE;EACE;EACA;;;AAKF;EACE;;;AAKF;EACE,aAjBwB;;;AAsB1B;EACE,SCvBO;EDwBP,OEvBE;;;AF2BN;EACE","file":"IrisGridPanel.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$panel-message-overlay-top: 30px;\n\n.iris-grid-panel.disconnected {\n .iris-grid {\n filter: grayscale(100%);\n opacity: 0.18;\n }\n}\n\n.iris-grid-panel.inactive {\n .iris-grid {\n filter: grayscale(100%);\n }\n}\n\n.iris-grid-panel {\n .iris-panel-message-overlay {\n padding-top: $panel-message-overlay-top;\n }\n}\n\n.iris-grid-plugin {\n .error-message {\n padding: $spacer-1;\n color: $danger;\n }\n}\n\n.grid-cursor-linker {\n cursor: crosshair;\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","// Styling overrides for bootstrap\n\n// Override / set color variables\n$red: #f95d84;\n$orange: #f37e3f;\n$yellow: #fcd65b;\n$green: #9edc6f;\n$blue: #76d9e4;\n$purple: #aa9af4;\n\n//Define some UI colors\n$interfacegray: #2d2a2e;\n$interfaceblue: #4878ea;\n$interfacewhite: #f0f0ee; //same as gray-200\n$interfaceblack: #1a171a;\n\n//Define our Gray scale\n$white: $interfacewhite;\n$gray-100: #fcfcfa;\n$gray-200: $interfacewhite;\n$gray-300: #c0bfbf;\n$gray-400: #929192;\n$gray-500: #5b5a5c;\n$gray-600: #555356;\n$gray-700: #403e41;\n$gray-800: #373438;\n$gray-850: #322f33;\n$gray-900: #211f22;\n$black: $interfaceblack;\n$content-bg: $interfacegray;\n$background: $interfaceblack;\n$foreground: $interfacewhite;\n\n//Load colors into map\n$colors: ();\n$colors: map-merge(\n (\n 'red': $red,\n 'orange': $orange,\n 'yellow': $yellow,\n 'green': $green,\n 'blue': $blue,\n 'purple': $purple,\n 'white': $white,\n 'black': $black,\n ),\n $colors\n);\n\n//Set default colors\n$body-bg: $black;\n$body-color: $interfacewhite;\n\n// Set brand colors\n$primary: $interfaceblue;\n$primary-hover: darken($primary, 8%);\n$primary-dark: mix($primary, $content-bg, 25%);\n$primary-light: scale-color($primary, $lightness: -25%);\n$secondary: $gray-500;\n$secondary-hover: darken($secondary, 8%);\n$success: $green;\n$info: $yellow;\n$warning: $orange;\n$danger: $red;\n$danger-hover: darken($danger, 8%);\n$light: $gray-100;\n$mid: $gray-400; //Added a mid color, useful for input styling\n$dark: $gray-800;\n$green-dark: scale-color($green, $lightness: -45%, $saturation: -10%);\n\n$theme-colors: () !default;\n$theme-colors: map-merge(\n (\n 'primary': $primary,\n 'primary-hover': $primary-hover,\n 'primary-light': $primary-light,\n 'primary-dark': $primary-dark,\n 'secondary': $secondary,\n 'success': $success,\n 'info': $info,\n 'warning': $warning,\n 'danger': $danger,\n 'light': $light,\n 'dark': $dark,\n 'mid': $mid,\n 'content-bg': $interfacegray,\n 'background': $interfaceblack,\n 'foreground': $interfacewhite,\n ),\n $theme-colors\n);\n\n$component-active-bg: $primary;\n$theme-color-interval: 9%;\n$yiq-contrasted-threshold: 180;\n\n// Override fonts\n$font-family-sans-serif: 'Fira Sans', -apple-system, blinkmacsystemfont,\n 'Segoe UI', 'Roboto', 'Helvetica Neue', arial, sans-serif; //fira sans then native system ui fallbacks\n$font-family-monospace: 'Fira Mono', menlo, monaco, consolas, 'Liberation Mono',\n 'Courier New', monospace;\n$font-family-base: $font-family-sans-serif;\n\n$headings-font-weight: 400;\n\n//Text overides\n$text-muted: $gray-400;\n\n//Style Selection highlight color\n//so browsers add alpha to your color by default, ignoring opacity 1\n//by setting rgba with 0.99 it tricks browser into thinking there is alpha applied\n$text-select-color: $primary-hover;\n$text-select-color-editor: lighten(\n $gray-700,\n 15%\n); //we lighten it abit to account for that 0.01 loss, and because it needs some anyways.\n\n//Grid variables, same value as default just making easily accessible\n$grid-gutter-width: 30px;\n\n//Visual Overrides\n$border-radius: 4px;\n$box-shadow: 0 0.1rem 1rem rgba($black, 45%); //because our UI is so dark, we need darker default shadows\n$box-shadow-900: 0 0.1rem 1rem rgba(0, 0, 0, 45%); //darkest shadow for $black popups over $black UI\n\n//Override Btn\n$btn-border-radius: 4rem;\n$btn-padding-x: 1.5rem;\n$btn-transition: color 0.12s ease-in-out, background-color 0.12s ease-in-out,\n border-color 0.12s ease-in-out, box-shadow 0.12s ease-in-out; //default 0.15 is too long\n$btn-border-width: 2px;\n\n//Override Inputs\n$input-bg: $gray-600;\n$input-disabled-bg: $gray-800;\n$input-color: $foreground;\n$input-border-color: $gray-400;\n$input-placeholder-color: $gray-400;\n$input-focus-border-color: rgba($primary, 85%);\n\n$input-btn-focus-width: 0.2rem;\n$input-btn-focus-color: rgba($component-active-bg, 35%);\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color;\n\n//checkbox\n$custom-control-indicator-bg: $gray-600;\n$custom-control-indicator-bg-size: 75% 75%;\n$custom-control-indicator-disabled-bg: $gray-800;\n$custom-control-indicator-checked-disabled-bg: $gray-800;\n$custom-control-label-disabled-color: $gray-400;\n\n//Custom Select\n$custom-select-indicator-color: $gray-400;\n$custom-select-bg-size: 16px 16px;\n//dhSort icon encoded\n$custom-select-indicator: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M4 7l-.4-.8 4-3.7h.8l4 3.7-.4.8H4zm0 2l-.4.8 4 3.7h.8l4-3.7L12 9H4z'/%3E%3C/svg%3E\"),\n '#',\n '%23'\n);\n$custom-select-focus-box-shadow: $input-btn-focus-box-shadow;\n$custom-select-disabled-color: darken($gray-400, 5%);\n$custom-select-disabled-bg: $gray-800;\n\n//modal\n$modal-content-bg: $gray-200;\n$modal-content-border-width: 0;\n$modal-md: 550px;\n\n// Toast notification\n$toast-bg: $primary-dark;\n$toast-color: $foreground;\n$toast-error-bg: mix($danger, $content-bg, 15%);\n$toast-error-color: $foreground;\n\n//tooltips\n$tooltip-bg: $gray-700;\n$tooltip-color: $foreground;\n$tooltip-box-shadow: 0 0.1rem 1.5rem 0.1rem rgba($black, 80%);\n\n//drowdowns\n$dropdown-bg: $gray-600;\n$dropdown-link-color: $foreground;\n$dropdown-link-hover-color: $foreground;\n$dropdown-link-hover-bg: $primary;\n$dropdown-divider-bg: $gray-700;\n\n//context menus\n$contextmenu-bg: $gray-600;\n$contextmenu-color: $foreground;\n$contextmenu-disabled-color: $text-muted;\n$contextmenu-keyboard-selected-bg: rgba($primary, 50%);\n$contextmenu-selected-bg: $primary;\n$contextmenu-selected-color: $foreground;\n\n//links\n$link-color: $gray-400;\n$link-hover-color: $foreground;\n\n//progress-bar\n$progress-bg: $gray-600;\n$progress-border-radius: 1rem;\n\n// Set global options\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-print-styles: false; //I don't think anyone should expect to \"print\" this app.\n\n// Transition times\n$transition: 0.15s;\n$transition-mid: 0.2s;\n$transition-long: 0.3s;\n$transition-slow: 0.6s;\n\n//form-validation icon, uses vsWarning icon encoded here as svg\n$form-feedback-icon-invalid-color: theme-color('danger');\n$form-feedback-icon-invalid: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cg fill='none'%3E%3Cg fill='#{$form-feedback-icon-invalid-color}'%3E%3Cpath d='M7.56 1h.88l6.54 12.26-.44.74H1.44L1 13.26 7.56 1zM8 2.28 2.28 13H13.7L8 2.28zM8.625 12v-1h-1.25v1h1.25zm-1.25-2V6h1.25v4h-1.25z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E \"),\n '#',\n '%23'\n);\n"]}
|