@deephaven/dashboard-core-plugins 0.50.1-beta.4 → 0.51.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ChartBuilderPlugin.js.map +1 -1
- package/dist/ChartPlugin.js +1 -1
- package/dist/ChartPlugin.js.map +1 -1
- package/dist/ConsolePlugin.js.map +1 -1
- package/dist/FilterPlugin.js.map +1 -1
- package/dist/GridPlugin.js.map +1 -1
- package/dist/LinkerPlugin.js.map +1 -1
- package/dist/MarkdownPlugin.js.map +1 -1
- package/dist/PandasPlugin.js.map +1 -1
- package/dist/WidgetLoaderPlugin.d.ts.map +1 -1
- package/dist/WidgetLoaderPlugin.js +1 -2
- package/dist/WidgetLoaderPlugin.js.map +1 -1
- package/dist/controls/ControlType.js.map +1 -1
- package/dist/controls/dropdown-filter/DropdownFilter.js.map +1 -1
- package/dist/controls/input-filter/InputFilter.js.map +1 -1
- package/dist/controls/markdown/MarkdownContainer.js.map +1 -1
- package/dist/controls/markdown/MarkdownEditor.js.map +1 -1
- package/dist/controls/markdown/MarkdownStartPage.js.map +1 -1
- package/dist/controls/markdown/MarkdownUtils.js.map +1 -1
- package/dist/events/ChartEvent.js.map +1 -1
- package/dist/events/ConsoleEvent.js.map +1 -1
- package/dist/events/InputFilterEvent.js.map +1 -1
- package/dist/events/IrisGridEvent.js.map +1 -1
- package/dist/events/NotebookEvent.js.map +1 -1
- package/dist/events/PQEvent.js.map +1 -1
- package/dist/events/PandasEvent.js.map +1 -1
- package/dist/events/TabEvent.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/linker/Linker.js.map +1 -1
- package/dist/linker/LinkerLink.js.map +1 -1
- package/dist/linker/LinkerOverlayContent.js.map +1 -1
- package/dist/linker/LinkerUtils.js +1 -1
- package/dist/linker/LinkerUtils.js.map +1 -1
- package/dist/panels/ChartColumnSelectorOverlay.js.map +1 -1
- package/dist/panels/ChartFilterOverlay.js.map +1 -1
- package/dist/panels/ChartPanel.js +3 -0
- package/dist/panels/ChartPanel.js.map +1 -1
- package/dist/panels/ChartPanelUtils.js.map +1 -1
- package/dist/panels/CommandHistoryPanel.js.map +1 -1
- package/dist/panels/ConsolePanel.d.ts +2 -2
- package/dist/panels/ConsolePanel.d.ts.map +1 -1
- package/dist/panels/ConsolePanel.js.map +1 -1
- package/dist/panels/DropdownFilterPanel.js.map +1 -1
- package/dist/panels/FileExplorerPanel.js.map +1 -1
- package/dist/panels/FilterSetManager.js.map +1 -1
- package/dist/panels/FilterSetManagerPanel.js.map +1 -1
- package/dist/panels/InputFilterPanel.js +0 -1
- package/dist/panels/InputFilterPanel.js.map +1 -1
- package/dist/panels/IrisGridPanel.js +4 -0
- package/dist/panels/IrisGridPanel.js.map +1 -1
- package/dist/panels/IrisGridPanelTooltip.js.map +1 -1
- package/dist/panels/IrisGridPanelTypes.js.map +1 -1
- package/dist/panels/LogPanel.js.map +1 -1
- package/dist/panels/MarkdownNotebook.js.map +1 -1
- package/dist/panels/MarkdownPanel.js.map +1 -1
- package/dist/panels/MockFileStorage.js.map +1 -1
- package/dist/panels/MockFileStorageTable.js.map +1 -1
- package/dist/panels/NotebookPanel.js.map +1 -1
- package/dist/panels/PandasPanel.js.map +1 -1
- package/dist/panels/Panel.js.map +1 -1
- package/dist/panels/PanelContextMenu.js.map +1 -1
- package/dist/panels/RenameDialog.js.map +1 -1
- package/dist/panels/WidgetPanel.js.map +1 -1
- package/dist/panels/WidgetPanelTooltip.js.map +1 -1
- package/dist/prop-types/CommonPropTypes.js.map +1 -1
- package/dist/redux/actions.js.map +1 -1
- package/dist/redux/selectors.js.map +1 -1
- package/dist/useHydrateGrid.d.ts.map +1 -1
- package/dist/useHydrateGrid.js +2 -1
- package/dist/useHydrateGrid.js.map +1 -1
- package/dist/useLoadTablePlugin.d.ts +8 -0
- package/dist/useLoadTablePlugin.d.ts.map +1 -0
- package/dist/useLoadTablePlugin.js +30 -0
- package/dist/useLoadTablePlugin.js.map +1 -0
- package/package.json +24 -24
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Linker.js","names":["React","Component","connect","shortid","memoize","CSSTransition","ThemeExport","LayoutUtils","PanelEvent","DateTimeColumnFormatter","DateUtils","TableUtils","Log","Type","FilterType","getActiveTool","getApi","getTimeZone","setActiveTool","setActiveToolAction","getIsolatedLinkerPanelIdForDashboard","getLinksForDashboard","setDashboardLinks","setDashboardLinksAction","addDashboardLinks","addDashboardLinksAction","deleteDashboardLinks","deleteDashboardLinksAction","setDashboardIsolatedLinkerPanelId","setDashboardIsolatedLinkerPanelIdAction","setDashboardColumnSelectionValidator","setDashboardColumnSelectionValidatorAction","ToolType","ChartEvent","IrisGridEvent","InputFilterEvent","LinkerOverlayContent","LinkerUtils","isLinkablePanel","isLinkableColumn","log","module","mapState","state","ownProps","activeTool","dh","isolatedLinkerPanelId","localDashboardId","links","timeZone","connector","Linker","constructor","props","linkInProgress","isolateForPanelId","combinedLinks","start","push","undefined","filter","link","panelId","end","handleCancel","bind","handleDone","handlePanelCloned","handleFilterColumnSelect","handleColumnsChanged","handlePanelClosed","handleLayoutStateChanged","handleAllLinksDeleted","handleLinkDeleted","handleLinksUpdated","handleChartColumnSelect","handleGridColumnSelect","handleUpdateValues","handleStateChange","handleExited","handleLinkSelected","handlePanelDragging","handlePanelDropped","isColumnSelectionValid","selectedIds","Set","isDraggingPanel","componentDidMount","layout","startListening","updateSelectionValidators","componentDidUpdate","prevProps","stopListening","DEFAULT","reset","componentDidCatch","error","info","componentWillUnmount","on","eventHub","COLUMN_SELECTED","DATA_SELECTED","STATE_CHANGED","CLONED","COLUMNS_CHANGED","CLOSE","CLOSED","DRAGGING","DROPPED","off","setState","panel","column","columnSelected","debug","isOverlayShown","getIdFromPanel","panelLinks","LINKER","length","columns","linksToDelete","findColumn","deleteLinks","debug2","isAlwaysEndPoint","overrideIsolatedLinkerPanelId","panelComponent","getComponentNameFromPanel","name","columnName","type","columnType","newLink","id","generate","isReversed","getLinkType","existingLinkPanelId","panelLinkEnd","existingLinkEnd","existingLinkStart","panelLinkStart","operator","eq","addLinks","unsetFilterValueForLink","panelManager","endPanel","getOpenedPanelById","unsetFilterValue","setPanelFilterMap","filterMap","setFilterMap","clearAll","forEach","map","isolatedLinks","linkId","find","l","dataMap","panelFilterMap","Map","i","endPanelId","has","get","filterList","visibleIndex","startColumnIndex","isExpandable","isGrouped","value","text","isDateType","dateFilterFormatter","showTimeZone","showTSeparator","defaultDateTimeFormatString","FULL_DATE_FORMAT","format","set","cloneConfig","cloneId","linksToAdd","cloneLinksForPanel","componentId","deleteLinksForPanelId","newLinks","forceUpdate","updateLinkInProgressType","tableColumn","description","render","isLinkOverlayShown","disabled","linkerOverlayMessage","transitionMs","getCachedLinks","ConnectedLinker"],"sources":["../../src/linker/Linker.tsx"],"sourcesContent":["import React, { Component, ErrorInfo } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\nimport shortid from 'shortid';\nimport memoize from 'memoize-one';\nimport { CSSTransition } from 'react-transition-group';\nimport { ThemeExport } from '@deephaven/components';\nimport {\n LayoutUtils,\n PanelComponent,\n PanelEvent,\n PanelManager,\n} from '@deephaven/dashboard';\nimport type GoldenLayout from '@deephaven/golden-layout';\nimport {\n DateTimeColumnFormatter,\n DateUtils,\n RowDataMap,\n TableUtils,\n} from '@deephaven/jsapi-utils';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport { Type as FilterType } from '@deephaven/filters';\nimport {\n getActiveTool,\n getApi,\n getTimeZone,\n setActiveTool as setActiveToolAction,\n RootState,\n} from '@deephaven/redux';\nimport {\n getIsolatedLinkerPanelIdForDashboard,\n getLinksForDashboard,\n setDashboardLinks as setDashboardLinksAction,\n addDashboardLinks as addDashboardLinksAction,\n deleteDashboardLinks as deleteDashboardLinksAction,\n setDashboardIsolatedLinkerPanelId as setDashboardIsolatedLinkerPanelIdAction,\n setDashboardColumnSelectionValidator as setDashboardColumnSelectionValidatorAction,\n} from '../redux';\nimport ToolType from './ToolType';\nimport { ChartEvent, IrisGridEvent, InputFilterEvent } from '../events';\nimport LinkerOverlayContent from './LinkerOverlayContent';\nimport LinkerUtils, {\n isLinkablePanel,\n Link,\n LinkColumn,\n LinkFilterMap,\n LinkType,\n isLinkableColumn,\n} from './LinkerUtils';\n\nconst log = Log.module('Linker');\n\ninterface StateProps {\n activeTool: string;\n dh: DhType;\n isolatedLinkerPanelId?: string;\n links: Link[];\n timeZone: string;\n}\n\ninterface OwnProps {\n layout: GoldenLayout;\n panelManager: PanelManager;\n localDashboardId: string;\n}\n\nconst mapState = (state: RootState, ownProps: OwnProps): StateProps => ({\n activeTool: getActiveTool(state),\n dh: getApi(state),\n isolatedLinkerPanelId: getIsolatedLinkerPanelIdForDashboard(\n state,\n ownProps.localDashboardId\n ),\n links: getLinksForDashboard(state, ownProps.localDashboardId),\n timeZone: getTimeZone(state),\n});\n\nconst connector = connect(mapState, {\n setActiveTool: setActiveToolAction,\n setDashboardLinks: setDashboardLinksAction,\n addDashboardLinks: addDashboardLinksAction,\n deleteDashboardLinks: deleteDashboardLinksAction,\n setDashboardIsolatedLinkerPanelId: setDashboardIsolatedLinkerPanelIdAction,\n setDashboardColumnSelectionValidator:\n setDashboardColumnSelectionValidatorAction,\n});\n\nexport type LinkerProps = OwnProps &\n StateProps &\n ConnectedProps<typeof connector>;\n\nexport type LinkerState = {\n linkInProgress?: Link;\n selectedIds: Set<string>;\n isDraggingPanel: boolean;\n};\n\nexport class Linker extends Component<LinkerProps, LinkerState> {\n constructor(props: LinkerProps) {\n super(props);\n\n this.handleCancel = this.handleCancel.bind(this);\n this.handleDone = this.handleDone.bind(this);\n this.handlePanelCloned = this.handlePanelCloned.bind(this);\n this.handleFilterColumnSelect = this.handleFilterColumnSelect.bind(this);\n this.handleColumnsChanged = this.handleColumnsChanged.bind(this);\n this.handlePanelClosed = this.handlePanelClosed.bind(this);\n this.handleLayoutStateChanged = this.handleLayoutStateChanged.bind(this);\n this.handleAllLinksDeleted = this.handleAllLinksDeleted.bind(this);\n this.handleLinkDeleted = this.handleLinkDeleted.bind(this);\n this.handleLinksUpdated = this.handleLinksUpdated.bind(this);\n this.handleChartColumnSelect = this.handleChartColumnSelect.bind(this);\n this.handleGridColumnSelect = this.handleGridColumnSelect.bind(this);\n this.handleUpdateValues = this.handleUpdateValues.bind(this);\n this.handleStateChange = this.handleStateChange.bind(this);\n this.handleExited = this.handleExited.bind(this);\n this.handleLinkSelected = this.handleLinkSelected.bind(this);\n this.handlePanelDragging = this.handlePanelDragging.bind(this);\n this.handlePanelDropped = this.handlePanelDropped.bind(this);\n this.isColumnSelectionValid = this.isColumnSelectionValid.bind(this);\n\n this.state = {\n linkInProgress: undefined,\n selectedIds: new Set<string>(),\n isDraggingPanel: false,\n };\n }\n\n componentDidMount(): void {\n const { layout } = this.props;\n this.startListening(layout);\n this.updateSelectionValidators();\n }\n\n componentDidUpdate(prevProps: LinkerProps): void {\n const { activeTool, layout } = this.props;\n if (layout !== prevProps.layout) {\n this.stopListening(prevProps.layout);\n this.startListening(layout);\n }\n if (activeTool !== prevProps.activeTool) {\n this.updateSelectionValidators();\n if (activeTool === ToolType.DEFAULT) {\n this.reset();\n }\n }\n }\n\n componentDidCatch(error: Error, info: ErrorInfo): void {\n log.error('componentDidCatch', error, info);\n }\n\n componentWillUnmount(): void {\n const { layout } = this.props;\n this.stopListening(layout);\n }\n\n startListening(layout: GoldenLayout): void {\n layout.on('stateChanged', this.handleLayoutStateChanged);\n\n const { eventHub } = layout;\n eventHub.on(IrisGridEvent.COLUMN_SELECTED, this.handleGridColumnSelect);\n eventHub.on(IrisGridEvent.DATA_SELECTED, this.handleUpdateValues);\n eventHub.on(IrisGridEvent.STATE_CHANGED, this.handleStateChange);\n eventHub.on(ChartEvent.COLUMN_SELECTED, this.handleChartColumnSelect);\n eventHub.on(PanelEvent.CLONED, this.handlePanelCloned);\n eventHub.on(\n InputFilterEvent.COLUMN_SELECTED,\n this.handleFilterColumnSelect\n );\n eventHub.on(InputFilterEvent.COLUMNS_CHANGED, this.handleColumnsChanged);\n eventHub.on(PanelEvent.CLOSE, this.handlePanelClosed);\n eventHub.on(PanelEvent.CLOSED, this.handlePanelClosed);\n eventHub.on(PanelEvent.DRAGGING, this.handlePanelDragging);\n eventHub.on(PanelEvent.DROPPED, this.handlePanelDropped);\n }\n\n stopListening(layout: GoldenLayout): void {\n layout.off('stateChanged', this.handleLayoutStateChanged);\n\n const { eventHub } = layout;\n eventHub.off(IrisGridEvent.COLUMN_SELECTED, this.handleGridColumnSelect);\n eventHub.off(IrisGridEvent.DATA_SELECTED, this.handleUpdateValues);\n eventHub.off(IrisGridEvent.STATE_CHANGED, this.handleStateChange);\n eventHub.off(ChartEvent.COLUMN_SELECTED, this.handleChartColumnSelect);\n eventHub.off(PanelEvent.CLONED, this.handlePanelCloned);\n eventHub.off(\n InputFilterEvent.COLUMN_SELECTED,\n this.handleFilterColumnSelect\n );\n eventHub.off(InputFilterEvent.COLUMNS_CHANGED, this.handleColumnsChanged);\n eventHub.off(PanelEvent.CLOSE, this.handlePanelClosed);\n eventHub.off(PanelEvent.CLOSED, this.handlePanelClosed);\n eventHub.off(PanelEvent.DRAGGING, this.handlePanelDragging);\n eventHub.off(PanelEvent.DROPPED, this.handlePanelDropped);\n }\n\n reset(): void {\n this.setState({\n linkInProgress: undefined,\n selectedIds: new Set<string>(),\n });\n }\n\n handleCancel(): void {\n const { linkInProgress } = this.state;\n if (linkInProgress == null) {\n const { setActiveTool } = this.props;\n setActiveTool(ToolType.DEFAULT);\n }\n this.setState({ linkInProgress: undefined });\n }\n\n handleDone(): void {\n const { setActiveTool } = this.props;\n setActiveTool(ToolType.DEFAULT);\n }\n\n handleChartColumnSelect(panel: PanelComponent, column: LinkColumn): void {\n this.columnSelected(panel, column, true);\n }\n\n handleFilterColumnSelect(panel: PanelComponent, column: LinkColumn): void {\n log.debug('handleFilterColumnSelect', this.isOverlayShown());\n const {\n links,\n localDashboardId,\n setActiveTool,\n setDashboardIsolatedLinkerPanelId,\n } = this.props;\n\n const panelId = LayoutUtils.getIdFromPanel(panel);\n const panelLinks = links.filter(\n link => link.start?.panelId === panelId || link.end?.panelId === panelId\n );\n\n if (!this.isOverlayShown() && panelId != null) {\n // Initial click on the filter source button with linker inactive\n // Show linker in isolated mode for panel\n setActiveTool(ToolType.LINKER);\n setDashboardIsolatedLinkerPanelId(localDashboardId, panelId);\n\n if (panelLinks.length === 0) {\n // Source not linked - start new link in isolated linker mode\n // Need to pass panelId for overrideIsolatedLinkerPanelId\n // as redux prop update at this point not yet propagated\n this.columnSelected(panel, column, true, panelId);\n }\n return;\n }\n\n // Filter source clicked with linker active\n this.columnSelected(panel, column, true);\n }\n\n handleColumnsChanged(panel: PanelComponent, columns: LinkColumn[]): void {\n log.debug('handleColumnsChanged', panel, columns);\n const { links } = this.props;\n const panelId = LayoutUtils.getIdFromPanel(panel);\n if (panelId == null) {\n log.error('Invalid panelId', panel);\n return;\n }\n // Delete links that start or end on non-existent column in the updated panel\n const linksToDelete = links.filter(\n ({ start, end }) =>\n (start.panelId === panelId &&\n LinkerUtils.findColumn(columns, start) == null) ||\n (end != null &&\n end.panelId === panelId &&\n LinkerUtils.findColumn(columns, end) == null)\n );\n this.deleteLinks(linksToDelete);\n }\n\n handleGridColumnSelect(panel: PanelComponent, column: LinkColumn): void {\n if (!isLinkableColumn(column)) {\n log.debug2('Column is not filterable');\n return;\n }\n this.columnSelected(panel, column);\n }\n\n /**\n * Track a column selection and build the link from it.\n * @param panel The panel component that is the source for the column selection\n * @param column The column that was selected\n * @param isAlwaysEndPoint True if the selection is always the end point, even if it's the first column selected. Defaults to false.\n * @param overrideIsolatedLinkerPanelId isolatedLinkerPanelId to use when method is called before prop changes propagate\n */\n columnSelected(\n panel: PanelComponent,\n column: LinkColumn,\n isAlwaysEndPoint = false,\n overrideIsolatedLinkerPanelId?: string | string[]\n ): void {\n if (overrideIsolatedLinkerPanelId === undefined && !this.isOverlayShown()) {\n return;\n }\n const { isolatedLinkerPanelId } = this.props;\n const { linkInProgress } = this.state;\n const panelId = LayoutUtils.getIdFromPanel(panel);\n if (panelId == null) {\n return;\n }\n const panelComponent = LayoutUtils.getComponentNameFromPanel(panel);\n const { name: columnName, type: columnType } = column;\n if (linkInProgress == null || linkInProgress.start == null) {\n const newLink: Link = {\n id: shortid.generate(),\n start: {\n panelId,\n panelComponent,\n columnName,\n columnType,\n },\n // Link starts with type Invalid as linking a source to itself is not allowed\n type: 'invalid',\n isReversed: isAlwaysEndPoint,\n };\n\n log.debug('starting link', newLink);\n\n this.setState({ linkInProgress: newLink });\n } else {\n const { links } = this.props;\n const { start, id, isReversed } = linkInProgress;\n const end = {\n panelId,\n panelComponent,\n columnName,\n columnType,\n };\n\n const type = LinkerUtils.getLinkType(\n isReversed !== undefined && isReversed ? end : start,\n isReversed !== undefined && isReversed ? start : end,\n overrideIsolatedLinkerPanelId ?? isolatedLinkerPanelId\n );\n\n switch (type) {\n case 'invalid':\n log.debug('Ignore invalid link connection', linkInProgress, end);\n return;\n case 'filterSource': {\n // filterSource links have a limit of 1 link per target\n // New link validation passed, delete existing links before adding the new one\n const existingLinkPanelId =\n isReversed !== undefined && isReversed\n ? start.panelId\n : end.panelId;\n // In cases with multiple targets per panel (i.e. chart filters)\n // links would have to be filtered by panelId and columnName and columnType\n const linksToDelete = links.filter(\n ({ end: panelLinkEnd }) =>\n panelLinkEnd?.panelId === existingLinkPanelId\n );\n this.deleteLinks(linksToDelete);\n break;\n }\n case 'chartLink': {\n const existingLinkEnd = isReversed === true ? start : end;\n const existingLinkStart = isReversed === true ? end : start;\n log.debug('creating chartlink', { existingLinkEnd, start, end });\n // Don't allow linking more than one column per source to each chart column\n const linksToDelete = links.filter(\n ({ end: panelLinkEnd, start: panelLinkStart }) =>\n panelLinkStart?.panelId === existingLinkStart.panelId &&\n panelLinkEnd?.panelId === existingLinkEnd.panelId &&\n panelLinkEnd?.columnName === existingLinkEnd.columnName &&\n panelLinkEnd?.columnType === existingLinkEnd.columnType\n );\n this.deleteLinks(linksToDelete);\n break;\n }\n case 'tableLink':\n // No-op\n break;\n }\n\n // Create a completed link from link in progress\n const newLink: Link = {\n start: isReversed !== undefined && isReversed ? end : start,\n end: isReversed !== undefined && isReversed ? start : end,\n id,\n type,\n operator: FilterType.eq,\n };\n log.info('creating link', newLink);\n\n this.setState(\n { linkInProgress: undefined, selectedIds: new Set<string>([id]) },\n () => {\n // Adding link after updating state\n // otherwise both new link and linkInProgress could be rendered at the same time\n // resulting in \"multiple children with same key\" error\n this.addLinks([newLink]);\n }\n );\n }\n }\n\n unsetFilterValueForLink(link: Link): void {\n const { panelManager } = this.props;\n if (link.end) {\n const { end } = link;\n const { panelId, columnName, columnType } = end;\n const endPanel = panelManager.getOpenedPanelById(panelId);\n if (!endPanel) {\n log.debug(\n 'endPanel no longer exists, ignoring unsetFilterValue',\n panelId\n );\n } else if (isLinkablePanel(endPanel)) {\n endPanel.unsetFilterValue(columnName, columnType);\n } else {\n log.debug('endPanel.unsetFilterValue not implemented', endPanel);\n }\n }\n }\n\n /**\n * Set filters for a given panel ID\n * @param panelId ID of panel to set filters on\n * @param filterMap Map of column name to column type, text, and value\n */\n setPanelFilterMap(panelId: string, filterMap: LinkFilterMap): void {\n log.debug('Set filter data for panel:', panelId, filterMap);\n const { panelManager } = this.props;\n const panel = panelManager.getOpenedPanelById(panelId);\n if (!panel) {\n log.debug('panel no longer exists, ignoring setFilterMap', panelId);\n } else if (isLinkablePanel(panel)) {\n panel.setFilterMap(filterMap);\n } else {\n log.debug('panel.setFilterMap not implemented', panelId, panel);\n }\n }\n\n addLinks(links: Link[]): void {\n const { addDashboardLinks, localDashboardId } = this.props;\n addDashboardLinks(localDashboardId, links);\n }\n\n deleteLinks(links: Link[], clearAll = false): void {\n const { localDashboardId } = this.props;\n links.forEach(link => this.unsetFilterValueForLink(link));\n if (clearAll) {\n const { setDashboardLinks } = this.props;\n setDashboardLinks(localDashboardId, []);\n } else if (links.length > 0) {\n const { deleteDashboardLinks } = this.props;\n deleteDashboardLinks(\n localDashboardId,\n links.map(({ id }) => id)\n );\n }\n }\n\n handleAllLinksDeleted(): void {\n const { links, isolatedLinkerPanelId } = this.props;\n if (isolatedLinkerPanelId === undefined) {\n this.deleteLinks(links, true);\n } else {\n const isolatedLinks = links.filter(\n link =>\n link?.start?.panelId === isolatedLinkerPanelId ||\n link?.end?.panelId === isolatedLinkerPanelId\n );\n this.deleteLinks(isolatedLinks);\n }\n this.reset();\n }\n\n handleLinkDeleted(linkId: string): void {\n const { links } = this.props;\n const link = links.find(l => l.id === linkId);\n if (link) {\n this.deleteLinks([link]);\n } else {\n log.error('Unable to find link to delete', linkId);\n }\n }\n\n handleUpdateValues(panel: PanelComponent, dataMap: RowDataMap): void {\n const panelId = LayoutUtils.getIdFromPanel(panel);\n const { dh, links, timeZone } = this.props;\n // Map of panel ID to filterMap\n const panelFilterMap = new Map();\n // Instead of setting filters one by one for each link,\n // combine them so they could be set in a single call per target panel\n for (let i = 0; i < links.length; i += 1) {\n const { start, end, operator } = links[i];\n if (start.panelId === panelId && end != null) {\n const { panelId: endPanelId, columnName, columnType } = end;\n // Map of column name to column type and filter value\n const filterMap = panelFilterMap.has(endPanelId)\n ? panelFilterMap.get(endPanelId)\n : new Map();\n const filterList =\n filterMap.has(columnName) === true\n ? filterMap.get(columnName).filterList\n : [];\n const {\n visibleIndex: startColumnIndex,\n isExpandable,\n isGrouped,\n } = dataMap[start.columnName];\n let { value } = dataMap[start.columnName];\n let text = `${value}`;\n if (value === null && isExpandable && isGrouped) {\n // Clear filter on empty rollup grouping columns\n value = undefined;\n }\n if (columnType != null && TableUtils.isDateType(columnType)) {\n const dateFilterFormatter = new DateTimeColumnFormatter(dh, {\n timeZone,\n showTimeZone: false,\n showTSeparator: true,\n defaultDateTimeFormatString: DateUtils.FULL_DATE_FORMAT,\n });\n // The values are Dates for dateType values, not string like everything else\n text = dateFilterFormatter.format(value as Date);\n }\n const filter = { operator, text, value, startColumnIndex };\n filterList.push(filter);\n filterMap.set(columnName, {\n columnType,\n filterList,\n });\n panelFilterMap.set(endPanelId, filterMap);\n }\n }\n\n // Apply combined filters to all target panels\n panelFilterMap.forEach((filterMap, endPanelId) => {\n this.setPanelFilterMap(endPanelId, filterMap);\n });\n }\n\n handlePanelCloned(panel: PanelComponent, cloneConfig: { id: string }): void {\n const { links } = this.props;\n const panelId = LayoutUtils.getIdFromPanel(panel);\n const cloneId = cloneConfig.id;\n if (panelId != null) {\n const linksToAdd = LinkerUtils.cloneLinksForPanel(\n links,\n panelId,\n cloneId\n );\n this.addLinks(linksToAdd);\n }\n }\n\n handlePanelDragging(componentId: string): void {\n const { links } = this.props;\n for (let i = 0; i < links.length; i += 1) {\n const link = links[i];\n const { start, end } = link;\n if (start.panelId === componentId || end?.panelId === componentId) {\n this.setState({ isDraggingPanel: true });\n return;\n }\n }\n }\n\n handlePanelDropped(): void {\n this.setState({ isDraggingPanel: false });\n }\n\n handlePanelClosed(panelId: string): void {\n // Delete links on PanelEvent.CLOSE and PanelEvent.CLOSED instead of UNMOUNT\n // because the panels can get unmounted on errors and we want to keep the links if that happens\n log.debug(`Panel ${panelId} closed, deleting links.`);\n this.deleteLinksForPanelId(panelId);\n }\n\n handleLinkSelected(linkId: string): void {\n this.setState({ selectedIds: new Set<string>([linkId]) });\n }\n\n handleLinksUpdated(newLinks: Link[]): void {\n const { localDashboardId, setDashboardLinks } = this.props;\n setDashboardLinks(localDashboardId, newLinks);\n }\n\n handleLayoutStateChanged(): void {\n this.forceUpdate();\n }\n\n handleStateChange(): void {\n this.forceUpdate();\n }\n\n handleExited(): void {\n // Has to be done after linker exit animation to avoid flashing non-isolated links\n const { localDashboardId, setDashboardIsolatedLinkerPanelId } = this.props;\n setDashboardIsolatedLinkerPanelId(localDashboardId, undefined);\n }\n\n /**\n * Delete all links for a provided panel ID. Needs to be done whenever a panel is closed or unmounted.\n * @param panelId The panel ID to delete links for\n */\n deleteLinksForPanelId(panelId: string): void {\n const { links } = this.props;\n for (let i = 0; i < links.length; i += 1) {\n const link = links[i];\n const { start, end, id } = link;\n if (start.panelId === panelId || end?.panelId === panelId) {\n this.handleLinkDeleted(id);\n }\n }\n }\n\n getCachedLinks = memoize(\n (\n links: Link[],\n linkInProgress: Link | undefined,\n isolateForPanelId: string | undefined\n ) => {\n const combinedLinks = [...links];\n\n if (linkInProgress != null && linkInProgress.start != null) {\n combinedLinks.push(linkInProgress);\n }\n\n if (isolateForPanelId !== undefined) {\n return combinedLinks.filter(\n link =>\n link?.start?.panelId === isolateForPanelId ||\n link?.end?.panelId === isolateForPanelId ||\n link?.end == null\n );\n }\n // Show all links in regular linker mode -- both isolated and not\n return combinedLinks;\n }\n );\n\n isOverlayShown(): boolean {\n const { activeTool } = this.props;\n return activeTool === ToolType.LINKER;\n }\n\n updateSelectionValidators(): void {\n const {\n activeTool,\n setDashboardColumnSelectionValidator,\n localDashboardId,\n } = this.props;\n switch (activeTool) {\n case ToolType.LINKER:\n setDashboardColumnSelectionValidator(\n localDashboardId,\n this.isColumnSelectionValid\n );\n break;\n default:\n setDashboardColumnSelectionValidator(localDashboardId, undefined);\n break;\n }\n }\n\n updateLinkInProgressType(type: LinkType = 'invalid'): void {\n this.setState(({ linkInProgress }) => {\n if (linkInProgress !== undefined) {\n return {\n linkInProgress: {\n ...linkInProgress,\n type,\n },\n };\n }\n return null;\n });\n }\n\n isColumnSelectionValid(\n panel: PanelComponent,\n tableColumn?: LinkColumn\n ): boolean {\n const { linkInProgress } = this.state;\n const { isolatedLinkerPanelId } = this.props;\n\n if (tableColumn == null) {\n if (linkInProgress?.start != null) {\n // Link started, end point is not a valid target\n this.updateLinkInProgressType();\n }\n return false;\n }\n\n // TODO: Use preview/original type property when core/#3358 is completed\n if (!isLinkableColumn(tableColumn)) {\n log.debug2('Column is not filterable', tableColumn.description);\n if (linkInProgress?.start != null) {\n this.updateLinkInProgressType('invalid');\n }\n return false;\n }\n\n // Link not started yet - no need to update type\n if (linkInProgress?.start == null) {\n return true;\n }\n\n const { isReversed, start } = linkInProgress;\n const panelId = LayoutUtils.getIdFromPanel(panel);\n if (panelId == null) {\n return false;\n }\n\n const end = {\n panelId,\n panelComponent: LayoutUtils.getComponentNameFromPanel(panel),\n columnName: tableColumn.name,\n columnType: tableColumn.type,\n };\n\n const type =\n isReversed !== undefined && isReversed\n ? LinkerUtils.getLinkType(end, start, isolatedLinkerPanelId)\n : LinkerUtils.getLinkType(start, end, isolatedLinkerPanelId);\n\n this.updateLinkInProgressType(type);\n\n return type !== 'invalid';\n }\n\n render(): JSX.Element | null {\n const { links, isolatedLinkerPanelId, panelManager } = this.props;\n const { linkInProgress, selectedIds, isDraggingPanel } = this.state;\n\n const isLinkOverlayShown = this.isOverlayShown();\n const disabled = linkInProgress != null && linkInProgress.start != null;\n const linkerOverlayMessage =\n isolatedLinkerPanelId === undefined\n ? 'Click a column source, then click a column target to create a filter link. The filter comparison operator used by a selected link can be changed. Delete a filter link by clicking the delete button or with alt+click. Click done when finished.'\n : 'Create a link between the source column button and a table column by clicking on one, then the other. Delete a filter link by clicking the delete button or with alt+click. Click done when finished.';\n\n return !isDraggingPanel ? (\n <CSSTransition\n in={isLinkOverlayShown}\n timeout={ThemeExport.transitionMs}\n classNames=\"fade\"\n mountOnEnter\n unmountOnExit\n onExited={this.handleExited}\n >\n <LinkerOverlayContent\n disabled={disabled}\n panelManager={panelManager}\n links={this.getCachedLinks(\n links,\n linkInProgress,\n isolatedLinkerPanelId\n )}\n selectedIds={selectedIds}\n messageText={linkerOverlayMessage}\n onLinkSelected={this.handleLinkSelected}\n onLinkDeleted={this.handleLinkDeleted}\n onAllLinksDeleted={this.handleAllLinksDeleted}\n onLinksUpdated={this.handleLinksUpdated}\n onDone={this.handleDone}\n onCancel={this.handleCancel}\n />\n </CSSTransition>\n ) : null;\n }\n}\n\nconst ConnectedLinker = connector(Linker);\n\nexport default ConnectedLinker;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Linker.js","names":["React","Component","connect","shortid","memoize","CSSTransition","ThemeExport","LayoutUtils","PanelEvent","DateTimeColumnFormatter","DateUtils","TableUtils","Log","Type","FilterType","getActiveTool","getApi","getTimeZone","setActiveTool","setActiveToolAction","getIsolatedLinkerPanelIdForDashboard","getLinksForDashboard","setDashboardLinks","setDashboardLinksAction","addDashboardLinks","addDashboardLinksAction","deleteDashboardLinks","deleteDashboardLinksAction","setDashboardIsolatedLinkerPanelId","setDashboardIsolatedLinkerPanelIdAction","setDashboardColumnSelectionValidator","setDashboardColumnSelectionValidatorAction","ToolType","ChartEvent","IrisGridEvent","InputFilterEvent","LinkerOverlayContent","LinkerUtils","isLinkablePanel","isLinkableColumn","jsx","_jsx","log","module","mapState","state","ownProps","activeTool","dh","isolatedLinkerPanelId","localDashboardId","links","timeZone","connector","Linker","constructor","props","_defineProperty","linkInProgress","isolateForPanelId","combinedLinks","start","push","undefined","filter","link","_link$start","_link$end","panelId","end","handleCancel","bind","handleDone","handlePanelCloned","handleFilterColumnSelect","handleColumnsChanged","handlePanelClosed","handleLayoutStateChanged","handleAllLinksDeleted","handleLinkDeleted","handleLinksUpdated","handleChartColumnSelect","handleGridColumnSelect","handleUpdateValues","handleStateChange","handleExited","handleLinkSelected","handlePanelDragging","handlePanelDropped","isColumnSelectionValid","selectedIds","Set","isDraggingPanel","componentDidMount","layout","startListening","updateSelectionValidators","componentDidUpdate","prevProps","stopListening","DEFAULT","reset","componentDidCatch","error","info","componentWillUnmount","on","eventHub","COLUMN_SELECTED","DATA_SELECTED","STATE_CHANGED","CLONED","COLUMNS_CHANGED","CLOSE","CLOSED","DRAGGING","DROPPED","off","setState","panel","column","columnSelected","debug","isOverlayShown","getIdFromPanel","panelLinks","_link$start2","_link$end2","LINKER","length","columns","linksToDelete","_ref","findColumn","deleteLinks","debug2","isAlwaysEndPoint","arguments","overrideIsolatedLinkerPanelId","panelComponent","getComponentNameFromPanel","name","columnName","type","columnType","newLink","id","generate","isReversed","getLinkType","existingLinkPanelId","_ref2","panelLinkEnd","existingLinkEnd","existingLinkStart","_ref3","panelLinkStart","operator","eq","addLinks","unsetFilterValueForLink","panelManager","endPanel","getOpenedPanelById","unsetFilterValue","setPanelFilterMap","filterMap","setFilterMap","clearAll","forEach","map","_ref4","isolatedLinks","_link$start3","_link$end3","linkId","find","l","dataMap","panelFilterMap","Map","i","endPanelId","has","get","filterList","visibleIndex","startColumnIndex","isExpandable","isGrouped","value","text","concat","isDateType","dateFilterFormatter","showTimeZone","showTSeparator","defaultDateTimeFormatString","FULL_DATE_FORMAT","format","set","cloneConfig","cloneId","linksToAdd","cloneLinksForPanel","componentId","deleteLinksForPanelId","newLinks","forceUpdate","updateLinkInProgressType","_ref5","_objectSpread","tableColumn","description","render","isLinkOverlayShown","disabled","linkerOverlayMessage","in","timeout","transitionMs","classNames","mountOnEnter","unmountOnExit","onExited","children","getCachedLinks","messageText","onLinkSelected","onLinkDeleted","onAllLinksDeleted","onLinksUpdated","onDone","onCancel","ConnectedLinker"],"sources":["../../src/linker/Linker.tsx"],"sourcesContent":["import React, { Component, ErrorInfo } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\nimport shortid from 'shortid';\nimport memoize from 'memoize-one';\nimport { CSSTransition } from 'react-transition-group';\nimport { ThemeExport } from '@deephaven/components';\nimport {\n LayoutUtils,\n PanelComponent,\n PanelEvent,\n PanelManager,\n} from '@deephaven/dashboard';\nimport type GoldenLayout from '@deephaven/golden-layout';\nimport {\n DateTimeColumnFormatter,\n DateUtils,\n RowDataMap,\n TableUtils,\n} from '@deephaven/jsapi-utils';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport { Type as FilterType } from '@deephaven/filters';\nimport {\n getActiveTool,\n getApi,\n getTimeZone,\n setActiveTool as setActiveToolAction,\n RootState,\n} from '@deephaven/redux';\nimport {\n getIsolatedLinkerPanelIdForDashboard,\n getLinksForDashboard,\n setDashboardLinks as setDashboardLinksAction,\n addDashboardLinks as addDashboardLinksAction,\n deleteDashboardLinks as deleteDashboardLinksAction,\n setDashboardIsolatedLinkerPanelId as setDashboardIsolatedLinkerPanelIdAction,\n setDashboardColumnSelectionValidator as setDashboardColumnSelectionValidatorAction,\n} from '../redux';\nimport ToolType from './ToolType';\nimport { ChartEvent, IrisGridEvent, InputFilterEvent } from '../events';\nimport LinkerOverlayContent from './LinkerOverlayContent';\nimport LinkerUtils, {\n isLinkablePanel,\n Link,\n LinkColumn,\n LinkFilterMap,\n LinkType,\n isLinkableColumn,\n} from './LinkerUtils';\n\nconst log = Log.module('Linker');\n\ninterface StateProps {\n activeTool: string;\n dh: DhType;\n isolatedLinkerPanelId?: string;\n links: Link[];\n timeZone: string;\n}\n\ninterface OwnProps {\n layout: GoldenLayout;\n panelManager: PanelManager;\n localDashboardId: string;\n}\n\nconst mapState = (state: RootState, ownProps: OwnProps): StateProps => ({\n activeTool: getActiveTool(state),\n dh: getApi(state),\n isolatedLinkerPanelId: getIsolatedLinkerPanelIdForDashboard(\n state,\n ownProps.localDashboardId\n ),\n links: getLinksForDashboard(state, ownProps.localDashboardId),\n timeZone: getTimeZone(state),\n});\n\nconst connector = connect(mapState, {\n setActiveTool: setActiveToolAction,\n setDashboardLinks: setDashboardLinksAction,\n addDashboardLinks: addDashboardLinksAction,\n deleteDashboardLinks: deleteDashboardLinksAction,\n setDashboardIsolatedLinkerPanelId: setDashboardIsolatedLinkerPanelIdAction,\n setDashboardColumnSelectionValidator:\n setDashboardColumnSelectionValidatorAction,\n});\n\nexport type LinkerProps = OwnProps &\n StateProps &\n ConnectedProps<typeof connector>;\n\nexport type LinkerState = {\n linkInProgress?: Link;\n selectedIds: Set<string>;\n isDraggingPanel: boolean;\n};\n\nexport class Linker extends Component<LinkerProps, LinkerState> {\n constructor(props: LinkerProps) {\n super(props);\n\n this.handleCancel = this.handleCancel.bind(this);\n this.handleDone = this.handleDone.bind(this);\n this.handlePanelCloned = this.handlePanelCloned.bind(this);\n this.handleFilterColumnSelect = this.handleFilterColumnSelect.bind(this);\n this.handleColumnsChanged = this.handleColumnsChanged.bind(this);\n this.handlePanelClosed = this.handlePanelClosed.bind(this);\n this.handleLayoutStateChanged = this.handleLayoutStateChanged.bind(this);\n this.handleAllLinksDeleted = this.handleAllLinksDeleted.bind(this);\n this.handleLinkDeleted = this.handleLinkDeleted.bind(this);\n this.handleLinksUpdated = this.handleLinksUpdated.bind(this);\n this.handleChartColumnSelect = this.handleChartColumnSelect.bind(this);\n this.handleGridColumnSelect = this.handleGridColumnSelect.bind(this);\n this.handleUpdateValues = this.handleUpdateValues.bind(this);\n this.handleStateChange = this.handleStateChange.bind(this);\n this.handleExited = this.handleExited.bind(this);\n this.handleLinkSelected = this.handleLinkSelected.bind(this);\n this.handlePanelDragging = this.handlePanelDragging.bind(this);\n this.handlePanelDropped = this.handlePanelDropped.bind(this);\n this.isColumnSelectionValid = this.isColumnSelectionValid.bind(this);\n\n this.state = {\n linkInProgress: undefined,\n selectedIds: new Set<string>(),\n isDraggingPanel: false,\n };\n }\n\n componentDidMount(): void {\n const { layout } = this.props;\n this.startListening(layout);\n this.updateSelectionValidators();\n }\n\n componentDidUpdate(prevProps: LinkerProps): void {\n const { activeTool, layout } = this.props;\n if (layout !== prevProps.layout) {\n this.stopListening(prevProps.layout);\n this.startListening(layout);\n }\n if (activeTool !== prevProps.activeTool) {\n this.updateSelectionValidators();\n if (activeTool === ToolType.DEFAULT) {\n this.reset();\n }\n }\n }\n\n componentDidCatch(error: Error, info: ErrorInfo): void {\n log.error('componentDidCatch', error, info);\n }\n\n componentWillUnmount(): void {\n const { layout } = this.props;\n this.stopListening(layout);\n }\n\n startListening(layout: GoldenLayout): void {\n layout.on('stateChanged', this.handleLayoutStateChanged);\n\n const { eventHub } = layout;\n eventHub.on(IrisGridEvent.COLUMN_SELECTED, this.handleGridColumnSelect);\n eventHub.on(IrisGridEvent.DATA_SELECTED, this.handleUpdateValues);\n eventHub.on(IrisGridEvent.STATE_CHANGED, this.handleStateChange);\n eventHub.on(ChartEvent.COLUMN_SELECTED, this.handleChartColumnSelect);\n eventHub.on(PanelEvent.CLONED, this.handlePanelCloned);\n eventHub.on(\n InputFilterEvent.COLUMN_SELECTED,\n this.handleFilterColumnSelect\n );\n eventHub.on(InputFilterEvent.COLUMNS_CHANGED, this.handleColumnsChanged);\n eventHub.on(PanelEvent.CLOSE, this.handlePanelClosed);\n eventHub.on(PanelEvent.CLOSED, this.handlePanelClosed);\n eventHub.on(PanelEvent.DRAGGING, this.handlePanelDragging);\n eventHub.on(PanelEvent.DROPPED, this.handlePanelDropped);\n }\n\n stopListening(layout: GoldenLayout): void {\n layout.off('stateChanged', this.handleLayoutStateChanged);\n\n const { eventHub } = layout;\n eventHub.off(IrisGridEvent.COLUMN_SELECTED, this.handleGridColumnSelect);\n eventHub.off(IrisGridEvent.DATA_SELECTED, this.handleUpdateValues);\n eventHub.off(IrisGridEvent.STATE_CHANGED, this.handleStateChange);\n eventHub.off(ChartEvent.COLUMN_SELECTED, this.handleChartColumnSelect);\n eventHub.off(PanelEvent.CLONED, this.handlePanelCloned);\n eventHub.off(\n InputFilterEvent.COLUMN_SELECTED,\n this.handleFilterColumnSelect\n );\n eventHub.off(InputFilterEvent.COLUMNS_CHANGED, this.handleColumnsChanged);\n eventHub.off(PanelEvent.CLOSE, this.handlePanelClosed);\n eventHub.off(PanelEvent.CLOSED, this.handlePanelClosed);\n eventHub.off(PanelEvent.DRAGGING, this.handlePanelDragging);\n eventHub.off(PanelEvent.DROPPED, this.handlePanelDropped);\n }\n\n reset(): void {\n this.setState({\n linkInProgress: undefined,\n selectedIds: new Set<string>(),\n });\n }\n\n handleCancel(): void {\n const { linkInProgress } = this.state;\n if (linkInProgress == null) {\n const { setActiveTool } = this.props;\n setActiveTool(ToolType.DEFAULT);\n }\n this.setState({ linkInProgress: undefined });\n }\n\n handleDone(): void {\n const { setActiveTool } = this.props;\n setActiveTool(ToolType.DEFAULT);\n }\n\n handleChartColumnSelect(panel: PanelComponent, column: LinkColumn): void {\n this.columnSelected(panel, column, true);\n }\n\n handleFilterColumnSelect(panel: PanelComponent, column: LinkColumn): void {\n log.debug('handleFilterColumnSelect', this.isOverlayShown());\n const {\n links,\n localDashboardId,\n setActiveTool,\n setDashboardIsolatedLinkerPanelId,\n } = this.props;\n\n const panelId = LayoutUtils.getIdFromPanel(panel);\n const panelLinks = links.filter(\n link => link.start?.panelId === panelId || link.end?.panelId === panelId\n );\n\n if (!this.isOverlayShown() && panelId != null) {\n // Initial click on the filter source button with linker inactive\n // Show linker in isolated mode for panel\n setActiveTool(ToolType.LINKER);\n setDashboardIsolatedLinkerPanelId(localDashboardId, panelId);\n\n if (panelLinks.length === 0) {\n // Source not linked - start new link in isolated linker mode\n // Need to pass panelId for overrideIsolatedLinkerPanelId\n // as redux prop update at this point not yet propagated\n this.columnSelected(panel, column, true, panelId);\n }\n return;\n }\n\n // Filter source clicked with linker active\n this.columnSelected(panel, column, true);\n }\n\n handleColumnsChanged(panel: PanelComponent, columns: LinkColumn[]): void {\n log.debug('handleColumnsChanged', panel, columns);\n const { links } = this.props;\n const panelId = LayoutUtils.getIdFromPanel(panel);\n if (panelId == null) {\n log.error('Invalid panelId', panel);\n return;\n }\n // Delete links that start or end on non-existent column in the updated panel\n const linksToDelete = links.filter(\n ({ start, end }) =>\n (start.panelId === panelId &&\n LinkerUtils.findColumn(columns, start) == null) ||\n (end != null &&\n end.panelId === panelId &&\n LinkerUtils.findColumn(columns, end) == null)\n );\n this.deleteLinks(linksToDelete);\n }\n\n handleGridColumnSelect(panel: PanelComponent, column: LinkColumn): void {\n if (!isLinkableColumn(column)) {\n log.debug2('Column is not filterable');\n return;\n }\n this.columnSelected(panel, column);\n }\n\n /**\n * Track a column selection and build the link from it.\n * @param panel The panel component that is the source for the column selection\n * @param column The column that was selected\n * @param isAlwaysEndPoint True if the selection is always the end point, even if it's the first column selected. Defaults to false.\n * @param overrideIsolatedLinkerPanelId isolatedLinkerPanelId to use when method is called before prop changes propagate\n */\n columnSelected(\n panel: PanelComponent,\n column: LinkColumn,\n isAlwaysEndPoint = false,\n overrideIsolatedLinkerPanelId?: string | string[]\n ): void {\n if (overrideIsolatedLinkerPanelId === undefined && !this.isOverlayShown()) {\n return;\n }\n const { isolatedLinkerPanelId } = this.props;\n const { linkInProgress } = this.state;\n const panelId = LayoutUtils.getIdFromPanel(panel);\n if (panelId == null) {\n return;\n }\n const panelComponent = LayoutUtils.getComponentNameFromPanel(panel);\n const { name: columnName, type: columnType } = column;\n if (linkInProgress == null || linkInProgress.start == null) {\n const newLink: Link = {\n id: shortid.generate(),\n start: {\n panelId,\n panelComponent,\n columnName,\n columnType,\n },\n // Link starts with type Invalid as linking a source to itself is not allowed\n type: 'invalid',\n isReversed: isAlwaysEndPoint,\n };\n\n log.debug('starting link', newLink);\n\n this.setState({ linkInProgress: newLink });\n } else {\n const { links } = this.props;\n const { start, id, isReversed } = linkInProgress;\n const end = {\n panelId,\n panelComponent,\n columnName,\n columnType,\n };\n\n const type = LinkerUtils.getLinkType(\n isReversed !== undefined && isReversed ? end : start,\n isReversed !== undefined && isReversed ? start : end,\n overrideIsolatedLinkerPanelId ?? isolatedLinkerPanelId\n );\n\n switch (type) {\n case 'invalid':\n log.debug('Ignore invalid link connection', linkInProgress, end);\n return;\n case 'filterSource': {\n // filterSource links have a limit of 1 link per target\n // New link validation passed, delete existing links before adding the new one\n const existingLinkPanelId =\n isReversed !== undefined && isReversed\n ? start.panelId\n : end.panelId;\n // In cases with multiple targets per panel (i.e. chart filters)\n // links would have to be filtered by panelId and columnName and columnType\n const linksToDelete = links.filter(\n ({ end: panelLinkEnd }) =>\n panelLinkEnd?.panelId === existingLinkPanelId\n );\n this.deleteLinks(linksToDelete);\n break;\n }\n case 'chartLink': {\n const existingLinkEnd = isReversed === true ? start : end;\n const existingLinkStart = isReversed === true ? end : start;\n log.debug('creating chartlink', { existingLinkEnd, start, end });\n // Don't allow linking more than one column per source to each chart column\n const linksToDelete = links.filter(\n ({ end: panelLinkEnd, start: panelLinkStart }) =>\n panelLinkStart?.panelId === existingLinkStart.panelId &&\n panelLinkEnd?.panelId === existingLinkEnd.panelId &&\n panelLinkEnd?.columnName === existingLinkEnd.columnName &&\n panelLinkEnd?.columnType === existingLinkEnd.columnType\n );\n this.deleteLinks(linksToDelete);\n break;\n }\n case 'tableLink':\n // No-op\n break;\n }\n\n // Create a completed link from link in progress\n const newLink: Link = {\n start: isReversed !== undefined && isReversed ? end : start,\n end: isReversed !== undefined && isReversed ? start : end,\n id,\n type,\n operator: FilterType.eq,\n };\n log.info('creating link', newLink);\n\n this.setState(\n { linkInProgress: undefined, selectedIds: new Set<string>([id]) },\n () => {\n // Adding link after updating state\n // otherwise both new link and linkInProgress could be rendered at the same time\n // resulting in \"multiple children with same key\" error\n this.addLinks([newLink]);\n }\n );\n }\n }\n\n unsetFilterValueForLink(link: Link): void {\n const { panelManager } = this.props;\n if (link.end) {\n const { end } = link;\n const { panelId, columnName, columnType } = end;\n const endPanel = panelManager.getOpenedPanelById(panelId);\n if (!endPanel) {\n log.debug(\n 'endPanel no longer exists, ignoring unsetFilterValue',\n panelId\n );\n } else if (isLinkablePanel(endPanel)) {\n endPanel.unsetFilterValue(columnName, columnType);\n } else {\n log.debug('endPanel.unsetFilterValue not implemented', endPanel);\n }\n }\n }\n\n /**\n * Set filters for a given panel ID\n * @param panelId ID of panel to set filters on\n * @param filterMap Map of column name to column type, text, and value\n */\n setPanelFilterMap(panelId: string, filterMap: LinkFilterMap): void {\n log.debug('Set filter data for panel:', panelId, filterMap);\n const { panelManager } = this.props;\n const panel = panelManager.getOpenedPanelById(panelId);\n if (!panel) {\n log.debug('panel no longer exists, ignoring setFilterMap', panelId);\n } else if (isLinkablePanel(panel)) {\n panel.setFilterMap(filterMap);\n } else {\n log.debug('panel.setFilterMap not implemented', panelId, panel);\n }\n }\n\n addLinks(links: Link[]): void {\n const { addDashboardLinks, localDashboardId } = this.props;\n addDashboardLinks(localDashboardId, links);\n }\n\n deleteLinks(links: Link[], clearAll = false): void {\n const { localDashboardId } = this.props;\n links.forEach(link => this.unsetFilterValueForLink(link));\n if (clearAll) {\n const { setDashboardLinks } = this.props;\n setDashboardLinks(localDashboardId, []);\n } else if (links.length > 0) {\n const { deleteDashboardLinks } = this.props;\n deleteDashboardLinks(\n localDashboardId,\n links.map(({ id }) => id)\n );\n }\n }\n\n handleAllLinksDeleted(): void {\n const { links, isolatedLinkerPanelId } = this.props;\n if (isolatedLinkerPanelId === undefined) {\n this.deleteLinks(links, true);\n } else {\n const isolatedLinks = links.filter(\n link =>\n link?.start?.panelId === isolatedLinkerPanelId ||\n link?.end?.panelId === isolatedLinkerPanelId\n );\n this.deleteLinks(isolatedLinks);\n }\n this.reset();\n }\n\n handleLinkDeleted(linkId: string): void {\n const { links } = this.props;\n const link = links.find(l => l.id === linkId);\n if (link) {\n this.deleteLinks([link]);\n } else {\n log.error('Unable to find link to delete', linkId);\n }\n }\n\n handleUpdateValues(panel: PanelComponent, dataMap: RowDataMap): void {\n const panelId = LayoutUtils.getIdFromPanel(panel);\n const { dh, links, timeZone } = this.props;\n // Map of panel ID to filterMap\n const panelFilterMap = new Map();\n // Instead of setting filters one by one for each link,\n // combine them so they could be set in a single call per target panel\n for (let i = 0; i < links.length; i += 1) {\n const { start, end, operator } = links[i];\n if (start.panelId === panelId && end != null) {\n const { panelId: endPanelId, columnName, columnType } = end;\n // Map of column name to column type and filter value\n const filterMap = panelFilterMap.has(endPanelId)\n ? panelFilterMap.get(endPanelId)\n : new Map();\n const filterList =\n filterMap.has(columnName) === true\n ? filterMap.get(columnName).filterList\n : [];\n const {\n visibleIndex: startColumnIndex,\n isExpandable,\n isGrouped,\n } = dataMap[start.columnName];\n let { value } = dataMap[start.columnName];\n let text = `${value}`;\n if (value === null && isExpandable && isGrouped) {\n // Clear filter on empty rollup grouping columns\n value = undefined;\n }\n if (columnType != null && TableUtils.isDateType(columnType)) {\n const dateFilterFormatter = new DateTimeColumnFormatter(dh, {\n timeZone,\n showTimeZone: false,\n showTSeparator: true,\n defaultDateTimeFormatString: DateUtils.FULL_DATE_FORMAT,\n });\n // The values are Dates for dateType values, not string like everything else\n text = dateFilterFormatter.format(value as Date);\n }\n const filter = { operator, text, value, startColumnIndex };\n filterList.push(filter);\n filterMap.set(columnName, {\n columnType,\n filterList,\n });\n panelFilterMap.set(endPanelId, filterMap);\n }\n }\n\n // Apply combined filters to all target panels\n panelFilterMap.forEach((filterMap, endPanelId) => {\n this.setPanelFilterMap(endPanelId, filterMap);\n });\n }\n\n handlePanelCloned(panel: PanelComponent, cloneConfig: { id: string }): void {\n const { links } = this.props;\n const panelId = LayoutUtils.getIdFromPanel(panel);\n const cloneId = cloneConfig.id;\n if (panelId != null) {\n const linksToAdd = LinkerUtils.cloneLinksForPanel(\n links,\n panelId,\n cloneId\n );\n this.addLinks(linksToAdd);\n }\n }\n\n handlePanelDragging(componentId: string): void {\n const { links } = this.props;\n for (let i = 0; i < links.length; i += 1) {\n const link = links[i];\n const { start, end } = link;\n if (start.panelId === componentId || end?.panelId === componentId) {\n this.setState({ isDraggingPanel: true });\n return;\n }\n }\n }\n\n handlePanelDropped(): void {\n this.setState({ isDraggingPanel: false });\n }\n\n handlePanelClosed(panelId: string): void {\n // Delete links on PanelEvent.CLOSE and PanelEvent.CLOSED instead of UNMOUNT\n // because the panels can get unmounted on errors and we want to keep the links if that happens\n log.debug(`Panel ${panelId} closed, deleting links.`);\n this.deleteLinksForPanelId(panelId);\n }\n\n handleLinkSelected(linkId: string): void {\n this.setState({ selectedIds: new Set<string>([linkId]) });\n }\n\n handleLinksUpdated(newLinks: Link[]): void {\n const { localDashboardId, setDashboardLinks } = this.props;\n setDashboardLinks(localDashboardId, newLinks);\n }\n\n handleLayoutStateChanged(): void {\n this.forceUpdate();\n }\n\n handleStateChange(): void {\n this.forceUpdate();\n }\n\n handleExited(): void {\n // Has to be done after linker exit animation to avoid flashing non-isolated links\n const { localDashboardId, setDashboardIsolatedLinkerPanelId } = this.props;\n setDashboardIsolatedLinkerPanelId(localDashboardId, undefined);\n }\n\n /**\n * Delete all links for a provided panel ID. Needs to be done whenever a panel is closed or unmounted.\n * @param panelId The panel ID to delete links for\n */\n deleteLinksForPanelId(panelId: string): void {\n const { links } = this.props;\n for (let i = 0; i < links.length; i += 1) {\n const link = links[i];\n const { start, end, id } = link;\n if (start.panelId === panelId || end?.panelId === panelId) {\n this.handleLinkDeleted(id);\n }\n }\n }\n\n getCachedLinks = memoize(\n (\n links: Link[],\n linkInProgress: Link | undefined,\n isolateForPanelId: string | undefined\n ) => {\n const combinedLinks = [...links];\n\n if (linkInProgress != null && linkInProgress.start != null) {\n combinedLinks.push(linkInProgress);\n }\n\n if (isolateForPanelId !== undefined) {\n return combinedLinks.filter(\n link =>\n link?.start?.panelId === isolateForPanelId ||\n link?.end?.panelId === isolateForPanelId ||\n link?.end == null\n );\n }\n // Show all links in regular linker mode -- both isolated and not\n return combinedLinks;\n }\n );\n\n isOverlayShown(): boolean {\n const { activeTool } = this.props;\n return activeTool === ToolType.LINKER;\n }\n\n updateSelectionValidators(): void {\n const {\n activeTool,\n setDashboardColumnSelectionValidator,\n localDashboardId,\n } = this.props;\n switch (activeTool) {\n case ToolType.LINKER:\n setDashboardColumnSelectionValidator(\n localDashboardId,\n this.isColumnSelectionValid\n );\n break;\n default:\n setDashboardColumnSelectionValidator(localDashboardId, undefined);\n break;\n }\n }\n\n updateLinkInProgressType(type: LinkType = 'invalid'): void {\n this.setState(({ linkInProgress }) => {\n if (linkInProgress !== undefined) {\n return {\n linkInProgress: {\n ...linkInProgress,\n type,\n },\n };\n }\n return null;\n });\n }\n\n isColumnSelectionValid(\n panel: PanelComponent,\n tableColumn?: LinkColumn\n ): boolean {\n const { linkInProgress } = this.state;\n const { isolatedLinkerPanelId } = this.props;\n\n if (tableColumn == null) {\n if (linkInProgress?.start != null) {\n // Link started, end point is not a valid target\n this.updateLinkInProgressType();\n }\n return false;\n }\n\n // TODO: Use preview/original type property when core/#3358 is completed\n if (!isLinkableColumn(tableColumn)) {\n log.debug2('Column is not filterable', tableColumn.description);\n if (linkInProgress?.start != null) {\n this.updateLinkInProgressType('invalid');\n }\n return false;\n }\n\n // Link not started yet - no need to update type\n if (linkInProgress?.start == null) {\n return true;\n }\n\n const { isReversed, start } = linkInProgress;\n const panelId = LayoutUtils.getIdFromPanel(panel);\n if (panelId == null) {\n return false;\n }\n\n const end = {\n panelId,\n panelComponent: LayoutUtils.getComponentNameFromPanel(panel),\n columnName: tableColumn.name,\n columnType: tableColumn.type,\n };\n\n const type =\n isReversed !== undefined && isReversed\n ? LinkerUtils.getLinkType(end, start, isolatedLinkerPanelId)\n : LinkerUtils.getLinkType(start, end, isolatedLinkerPanelId);\n\n this.updateLinkInProgressType(type);\n\n return type !== 'invalid';\n }\n\n render(): JSX.Element | null {\n const { links, isolatedLinkerPanelId, panelManager } = this.props;\n const { linkInProgress, selectedIds, isDraggingPanel } = this.state;\n\n const isLinkOverlayShown = this.isOverlayShown();\n const disabled = linkInProgress != null && linkInProgress.start != null;\n const linkerOverlayMessage =\n isolatedLinkerPanelId === undefined\n ? 'Click a column source, then click a column target to create a filter link. The filter comparison operator used by a selected link can be changed. Delete a filter link by clicking the delete button or with alt+click. Click done when finished.'\n : 'Create a link between the source column button and a table column by clicking on one, then the other. Delete a filter link by clicking the delete button or with alt+click. Click done when finished.';\n\n return !isDraggingPanel ? (\n <CSSTransition\n in={isLinkOverlayShown}\n timeout={ThemeExport.transitionMs}\n classNames=\"fade\"\n mountOnEnter\n unmountOnExit\n onExited={this.handleExited}\n >\n <LinkerOverlayContent\n disabled={disabled}\n panelManager={panelManager}\n links={this.getCachedLinks(\n links,\n linkInProgress,\n isolatedLinkerPanelId\n )}\n selectedIds={selectedIds}\n messageText={linkerOverlayMessage}\n onLinkSelected={this.handleLinkSelected}\n onLinkDeleted={this.handleLinkDeleted}\n onAllLinksDeleted={this.handleAllLinksDeleted}\n onLinksUpdated={this.handleLinksUpdated}\n onDone={this.handleDone}\n onCancel={this.handleCancel}\n />\n </CSSTransition>\n ) : null;\n }\n}\n\nconst ConnectedLinker = connector(Linker);\n\nexport default ConnectedLinker;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinkerLink.js","names":["React","Component","memoize","classNames","Button","DropdownMenu","vsTrash","vsTriangleDown","FontAwesomeIcon","Type","FilterType","getLabelForNumberFilter","getLabelForTextFilter","getLabelForDateFilter","Log","TableUtils","log","module","DROOP","DROOP_EXPONENT","TRIANGLE_HEIGHT","TRIANGLE_BASE","TRIANGLE_TIP","TRIANGLE_HYPOTENUSE","Math","sqrt","TRIANGLE_THETA","asin","CLIP_RADIUS","HALF_PI","PI","LinkerLink","makeCirclePath","x","y","r","getLabelForLinkFilter","columnType","filterType","isNumberType","isCharType","isTextType","isDateType","isBooleanType","eq","notEq","Error","e","warn","constructor","props","linkId","onOperatorChanged","filterTypes","getFilterTypes","flatMap","type","index","symbol","getFilterOperatorString","title","icon","action","order","handleClick","bind","handleMouseEnter","handleMouseLeave","handleDelete","getDropdownActions","state","isHovering","undefined","event","stopPropagation","preventDefault","id","onClick","onDelete","altKey","setState","startColumnType","getOperators","render","className","operator","isSelected","x1","y1","x2","y2","len","theta","atan2","xMult","sin","yMult","cos","maxX","window","innerWidth","maxY","innerHeight","minX","minY","qx","max","min","qy","path","selectClipPath","clipPathId","endTheta","t2theta","t3theta","tx1","ty1","tx2","ty2","tx3","ty3","points","midX","midY","dMidX","dMidY","slopeAtMid","DISTANCE_FROM_MID","topOffsetX","topOffsetY","bottomOffsetX","bottomOffsetY","Number","isFinite","abs","showOperator","hovering","top","left","placement"],"sources":["../../src/linker/LinkerLink.tsx"],"sourcesContent":["import React, { Component, MouseEvent } from 'react';\nimport memoize from 'memoize-one';\nimport classNames from 'classnames';\nimport { Button, DropdownAction, DropdownMenu } from '@deephaven/components';\nimport { vsTrash, vsTriangleDown } from '@deephaven/icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n Type as FilterType,\n TypeValue as FilterTypeValue,\n getLabelForNumberFilter,\n getLabelForTextFilter,\n getLabelForDateFilter,\n} from '@deephaven/filters';\nimport Log from '@deephaven/log';\nimport { TableUtils } from '@deephaven/jsapi-utils';\nimport './LinkerLink.scss';\nimport { LinkType } from './LinkerUtils';\n\nconst log = Log.module('LinkerLink');\n\n/** The constant for how droopy the links are. Increase for more droopiness. */\nconst DROOP = 0.015;\nconst DROOP_EXPONENT = 1.5;\nconst TRIANGLE_HEIGHT = 12;\nconst TRIANGLE_BASE = 12;\nconst TRIANGLE_TIP = 2;\nconst TRIANGLE_HYPOTENUSE = Math.sqrt(\n (TRIANGLE_BASE * 0.5) ** 2 + TRIANGLE_HEIGHT ** 2\n);\nconst TRIANGLE_THETA = Math.asin((TRIANGLE_BASE * 0.5) / TRIANGLE_HEIGHT);\nconst CLIP_RADIUS = 15;\nconst HALF_PI = Math.PI * 0.5;\n\nexport type LinkerLinkProps = {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n id: string;\n className: string;\n type: LinkType;\n operator: FilterTypeValue;\n isSelected: boolean;\n startColumnType: string | null;\n onClick: (id: string) => void;\n onDelete: (id: string) => void;\n onOperatorChanged: (id: string, type: FilterTypeValue) => void;\n};\n\nexport type LinkerLinkState = {\n isHovering?: boolean;\n};\n\nexport class LinkerLink extends Component<LinkerLinkProps, LinkerLinkState> {\n static defaultProps = {\n className: '',\n isSelected: false,\n onClick(): void {\n // no-op\n },\n onDelete(): void {\n // no-op\n },\n };\n\n /**\n * Make an SVG path for a circle at the specified coordinates.\n * @param x The x coordinate for the centre of the circle\n * @param y The y coordinate for the centre of the circle\n * @param r Radius of the circle\n * @returns The SVG string path\n */\n static makeCirclePath(x: number, y: number, r: number): string {\n return `M ${x} ${y} m -${r},0 a ${r},${r} 0 1,0 ${\n r * 2\n },0 a ${r},${r} 0 1,0 -${r * 2},0 z`;\n }\n\n static getLabelForLinkFilter(\n columnType: string,\n filterType: FilterTypeValue\n ): string {\n try {\n if (\n TableUtils.isNumberType(columnType) ||\n TableUtils.isCharType(columnType)\n ) {\n return getLabelForNumberFilter(filterType);\n }\n if (TableUtils.isTextType(columnType)) {\n return getLabelForTextFilter(filterType);\n }\n if (TableUtils.isDateType(columnType)) {\n return getLabelForDateFilter(filterType);\n }\n if (TableUtils.isBooleanType(columnType)) {\n if (filterType === FilterType.eq) {\n return 'is equal to';\n }\n if (filterType === FilterType.notEq) {\n return 'is not equal to';\n }\n }\n throw new Error(`Unrecognized column type: ${columnType}`);\n } catch (e) {\n log.warn(e);\n return '';\n }\n }\n\n constructor(props: LinkerLinkProps) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n this.handleMouseEnter = this.handleMouseEnter.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n this.handleDelete = this.handleDelete.bind(this);\n this.getDropdownActions = this.getDropdownActions.bind(this);\n\n this.state = {\n isHovering: undefined,\n };\n }\n\n getOperators = memoize(\n (linkId: string, columnType: string): DropdownAction[] => {\n const { onOperatorChanged } = this.props;\n let filterTypes = TableUtils.getFilterTypes(columnType);\n if (TableUtils.isBooleanType(columnType)) {\n filterTypes = [FilterType.eq, FilterType.notEq];\n }\n return filterTypes.flatMap((type, index) => {\n // Remove case-insensitive string comparisons\n if (type === 'eqIgnoreCase' || type === `notEqIgnoreCase`) {\n return [];\n }\n let symbol = '';\n\n if (type === 'startsWith') {\n symbol = 'a*';\n } else if (type === 'endsWith') {\n symbol = '*z';\n } else {\n symbol = TableUtils.getFilterOperatorString(type);\n }\n\n return [\n {\n title: LinkerLink.getLabelForLinkFilter(columnType, type),\n icon: <b>{symbol}</b>,\n action: () => onOperatorChanged(linkId, type),\n order: index,\n },\n ];\n });\n }\n );\n\n handleClick(event: MouseEvent<SVGPathElement>): void {\n event.stopPropagation();\n event.preventDefault();\n\n const { id, onClick, onDelete } = this.props;\n if (event.altKey) {\n onDelete(id);\n } else {\n onClick(id);\n }\n }\n\n handleMouseEnter(): void {\n this.setState({\n isHovering: true,\n });\n }\n\n handleMouseLeave(): void {\n this.setState({\n isHovering: false,\n });\n }\n\n handleDelete(): void {\n const { id, onDelete } = this.props;\n onDelete(id);\n }\n\n getDropdownActions(): DropdownAction[] {\n const { id, startColumnType } = this.props;\n if (startColumnType != null) {\n return this.getOperators(id, startColumnType);\n }\n return [];\n }\n\n render(): JSX.Element {\n const {\n className,\n operator,\n isSelected,\n x1,\n y1,\n x2,\n y2,\n id,\n startColumnType,\n type,\n } = this.props;\n const { isHovering } = this.state;\n\n // Path between the two points\n const len = Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2);\n const theta = Math.atan2(y2 - y1, x2 - x1);\n const xMult = Math.sin(theta);\n const yMult = Math.cos(theta) + 2;\n const maxX = window.innerWidth;\n const maxY = window.innerHeight;\n const minX = 0;\n const minY = 0;\n const qx = Math.max(\n minX,\n Math.min(\n x1 + (x2 - x1) / 2 + xMult * (len * DROOP) ** DROOP_EXPONENT,\n maxX\n )\n );\n const qy = Math.max(\n minY,\n Math.min(\n y1 + (y2 - y1) / 2 + yMult * (len * DROOP) ** DROOP_EXPONENT,\n maxY\n )\n );\n const path = `M ${x1} ${y1} Q ${qx} ${qy} ${x2} ${y2}`;\n\n // path for a 100%, 100% rect, then two paths for circles at point\n const selectClipPath = `M ${minX} ${minY} L ${minX} ${maxY} L ${maxX} ${maxY} L ${maxX} ${minY} z\n ${LinkerLink.makeCirclePath(x1, y1, CLIP_RADIUS)}\n ${LinkerLink.makeCirclePath(x2, y2, CLIP_RADIUS)}`;\n const clipPathId = `link-select-clip-${id}`;\n\n // Calculate location of the end triangle\n // We draw it instead of using markers to allow for transitions in the style\n const endTheta = Math.atan2(y2 - qy, x2 - qx);\n const t2theta = endTheta - TRIANGLE_THETA + Math.PI;\n const t3theta = endTheta + TRIANGLE_THETA + Math.PI;\n const tx1 = x2 + Math.cos(endTheta) * TRIANGLE_TIP;\n const ty1 = y2 + Math.sin(endTheta) * TRIANGLE_TIP;\n const tx2 = tx1 + Math.cos(t2theta) * TRIANGLE_HYPOTENUSE;\n const ty2 = ty1 + Math.sin(t2theta) * TRIANGLE_HYPOTENUSE;\n const tx3 = tx1 + Math.cos(t3theta) * TRIANGLE_HYPOTENUSE;\n const ty3 = ty1 + Math.sin(t3theta) * TRIANGLE_HYPOTENUSE;\n const points = `${tx1},${ty1} ${tx2},${ty2} ${tx3},${ty3}`;\n\n // Button offset calculations\n const midX = 0.25 * x1 + 0.5 * qx + 0.25 * x2;\n const midY = 0.25 * y1 + 0.5 * qy + 0.25 * y2;\n const dMidX = qx - x1 + (x2 - qx);\n const dMidY = qy - y1 + (y2 - qy);\n const slopeAtMid = dMidY / dMidX;\n const DISTANCE_FROM_MID = 20;\n let topOffsetX = DISTANCE_FROM_MID / Math.sqrt(1 + slopeAtMid ** 2);\n let topOffsetY = topOffsetX * slopeAtMid;\n let bottomOffsetX = topOffsetX * -1;\n let bottomOffsetY = topOffsetY * -1;\n if (!Number.isFinite(slopeAtMid)) {\n bottomOffsetX = 10;\n bottomOffsetY = 5;\n topOffsetX = 10;\n topOffsetY = -35;\n } else if (slopeAtMid > 0) {\n topOffsetX *= -1;\n topOffsetY *= -1;\n bottomOffsetX *= -1;\n bottomOffsetY *= -1;\n bottomOffsetX -= 50 - 10 * (Math.abs(theta) % HALF_PI);\n bottomOffsetY += 10 * (Math.abs(theta) % HALF_PI);\n topOffsetX -= 50 - 10 * (Math.abs(theta) % HALF_PI);\n topOffsetY += 10 * (Math.abs(theta) % HALF_PI);\n } else if (slopeAtMid < 0) {\n bottomOffsetX += 10 * (Math.abs(theta) % HALF_PI);\n bottomOffsetY += 10 * (Math.abs(theta) % HALF_PI);\n topOffsetX += 10 * (Math.abs(theta) % HALF_PI);\n topOffsetY += 10 * (Math.abs(theta) % HALF_PI);\n } else {\n bottomOffsetX = 15;\n bottomOffsetY = 10;\n topOffsetX = -25;\n topOffsetY = 10;\n }\n\n let symbol = '';\n if (operator !== undefined) {\n if (operator === 'startsWith') {\n symbol = 'a*';\n } else if (operator === 'endsWith') {\n symbol = '*z';\n } else {\n symbol = TableUtils.getFilterOperatorString(operator);\n }\n }\n\n const showOperator = type !== 'chartLink' && type !== 'filterSource';\n\n return (\n <>\n <svg\n className={classNames(className, {\n hovering: isHovering,\n })}\n >\n <clipPath id={clipPathId}>\n <path d={selectClipPath} clipRule=\"evenodd\" />\n </clipPath>\n <path\n className=\"link-select\"\n d={path}\n onClick={this.handleClick}\n onMouseEnter={this.handleMouseEnter}\n onMouseLeave={this.handleMouseLeave}\n clipPath={`url(#${clipPathId})`}\n data-testid=\"link-select\"\n />\n <path className=\"link-background\" d={path} />\n <path className=\"link-foreground\" d={path} />\n <circle className=\"link-dot\" cx={x1} cy={y1} r=\"5\" />\n <polygon className=\"link-triangle\" points={points} />\n </svg>\n {startColumnType != null && isSelected && (\n <>\n {showOperator && (\n <Button\n kind=\"primary\"\n className=\"btn-fab btn-operator\"\n style={{\n top: midY + (slopeAtMid >= 0 ? topOffsetY : bottomOffsetY),\n left: midX + (slopeAtMid >= 0 ? topOffsetX : bottomOffsetX),\n }}\n onClick={() => {\n // no-op: click is handled in `DropdownMenu'\n }}\n icon={\n <div className=\"fa-md fa-layers\">\n <b>{symbol}</b>\n <FontAwesomeIcon\n icon={vsTriangleDown}\n transform=\"right-8 down-9 shrink-5\"\n />\n </div>\n }\n tooltip=\"Change comparison operator\"\n >\n <DropdownMenu\n actions={this.getDropdownActions}\n popperOptions={{ placement: 'bottom-start' }}\n />\n </Button>\n )}\n <Button\n kind=\"primary\"\n className=\"btn-fab btn-delete\"\n style={{\n top: midY + (slopeAtMid < 0 ? topOffsetY : bottomOffsetY),\n left: midX + (slopeAtMid < 0 ? topOffsetX : bottomOffsetX),\n }}\n onClick={this.handleDelete}\n icon={vsTrash}\n tooltip=\"Delete\"\n />\n </>\n )}\n </>\n );\n }\n}\n\nexport default LinkerLink;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LinkerLink.js","names":["React","Component","memoize","classNames","Button","DropdownMenu","vsTrash","vsTriangleDown","FontAwesomeIcon","Type","FilterType","getLabelForNumberFilter","getLabelForTextFilter","getLabelForDateFilter","Log","TableUtils","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","log","module","DROOP","DROOP_EXPONENT","TRIANGLE_HEIGHT","TRIANGLE_BASE","TRIANGLE_TIP","TRIANGLE_HYPOTENUSE","Math","sqrt","TRIANGLE_THETA","asin","CLIP_RADIUS","HALF_PI","PI","LinkerLink","makeCirclePath","x","y","r","concat","getLabelForLinkFilter","columnType","filterType","isNumberType","isCharType","isTextType","isDateType","isBooleanType","eq","notEq","Error","e","warn","constructor","props","_defineProperty","linkId","onOperatorChanged","filterTypes","getFilterTypes","flatMap","type","index","symbol","getFilterOperatorString","title","icon","children","action","order","handleClick","bind","handleMouseEnter","handleMouseLeave","handleDelete","getDropdownActions","state","isHovering","undefined","event","stopPropagation","preventDefault","id","onClick","onDelete","altKey","setState","startColumnType","getOperators","render","className","operator","isSelected","x1","y1","x2","y2","len","theta","atan2","xMult","sin","yMult","cos","maxX","window","innerWidth","maxY","innerHeight","minX","minY","qx","max","min","qy","path","selectClipPath","clipPathId","endTheta","t2theta","t3theta","tx1","ty1","tx2","ty2","tx3","ty3","points","midX","midY","dMidX","dMidY","slopeAtMid","DISTANCE_FROM_MID","topOffsetX","topOffsetY","bottomOffsetX","bottomOffsetY","Number","isFinite","abs","showOperator","hovering","d","clipRule","onMouseEnter","onMouseLeave","clipPath","cx","cy","kind","style","top","left","transform","tooltip","actions","popperOptions","placement"],"sources":["../../src/linker/LinkerLink.tsx"],"sourcesContent":["import React, { Component, MouseEvent } from 'react';\nimport memoize from 'memoize-one';\nimport classNames from 'classnames';\nimport { Button, DropdownAction, DropdownMenu } from '@deephaven/components';\nimport { vsTrash, vsTriangleDown } from '@deephaven/icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n Type as FilterType,\n TypeValue as FilterTypeValue,\n getLabelForNumberFilter,\n getLabelForTextFilter,\n getLabelForDateFilter,\n} from '@deephaven/filters';\nimport Log from '@deephaven/log';\nimport { TableUtils } from '@deephaven/jsapi-utils';\nimport './LinkerLink.scss';\nimport { LinkType } from './LinkerUtils';\n\nconst log = Log.module('LinkerLink');\n\n/** The constant for how droopy the links are. Increase for more droopiness. */\nconst DROOP = 0.015;\nconst DROOP_EXPONENT = 1.5;\nconst TRIANGLE_HEIGHT = 12;\nconst TRIANGLE_BASE = 12;\nconst TRIANGLE_TIP = 2;\nconst TRIANGLE_HYPOTENUSE = Math.sqrt(\n (TRIANGLE_BASE * 0.5) ** 2 + TRIANGLE_HEIGHT ** 2\n);\nconst TRIANGLE_THETA = Math.asin((TRIANGLE_BASE * 0.5) / TRIANGLE_HEIGHT);\nconst CLIP_RADIUS = 15;\nconst HALF_PI = Math.PI * 0.5;\n\nexport type LinkerLinkProps = {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n id: string;\n className: string;\n type: LinkType;\n operator: FilterTypeValue;\n isSelected: boolean;\n startColumnType: string | null;\n onClick: (id: string) => void;\n onDelete: (id: string) => void;\n onOperatorChanged: (id: string, type: FilterTypeValue) => void;\n};\n\nexport type LinkerLinkState = {\n isHovering?: boolean;\n};\n\nexport class LinkerLink extends Component<LinkerLinkProps, LinkerLinkState> {\n static defaultProps = {\n className: '',\n isSelected: false,\n onClick(): void {\n // no-op\n },\n onDelete(): void {\n // no-op\n },\n };\n\n /**\n * Make an SVG path for a circle at the specified coordinates.\n * @param x The x coordinate for the centre of the circle\n * @param y The y coordinate for the centre of the circle\n * @param r Radius of the circle\n * @returns The SVG string path\n */\n static makeCirclePath(x: number, y: number, r: number): string {\n return `M ${x} ${y} m -${r},0 a ${r},${r} 0 1,0 ${\n r * 2\n },0 a ${r},${r} 0 1,0 -${r * 2},0 z`;\n }\n\n static getLabelForLinkFilter(\n columnType: string,\n filterType: FilterTypeValue\n ): string {\n try {\n if (\n TableUtils.isNumberType(columnType) ||\n TableUtils.isCharType(columnType)\n ) {\n return getLabelForNumberFilter(filterType);\n }\n if (TableUtils.isTextType(columnType)) {\n return getLabelForTextFilter(filterType);\n }\n if (TableUtils.isDateType(columnType)) {\n return getLabelForDateFilter(filterType);\n }\n if (TableUtils.isBooleanType(columnType)) {\n if (filterType === FilterType.eq) {\n return 'is equal to';\n }\n if (filterType === FilterType.notEq) {\n return 'is not equal to';\n }\n }\n throw new Error(`Unrecognized column type: ${columnType}`);\n } catch (e) {\n log.warn(e);\n return '';\n }\n }\n\n constructor(props: LinkerLinkProps) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n this.handleMouseEnter = this.handleMouseEnter.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n this.handleDelete = this.handleDelete.bind(this);\n this.getDropdownActions = this.getDropdownActions.bind(this);\n\n this.state = {\n isHovering: undefined,\n };\n }\n\n getOperators = memoize(\n (linkId: string, columnType: string): DropdownAction[] => {\n const { onOperatorChanged } = this.props;\n let filterTypes = TableUtils.getFilterTypes(columnType);\n if (TableUtils.isBooleanType(columnType)) {\n filterTypes = [FilterType.eq, FilterType.notEq];\n }\n return filterTypes.flatMap((type, index) => {\n // Remove case-insensitive string comparisons\n if (type === 'eqIgnoreCase' || type === `notEqIgnoreCase`) {\n return [];\n }\n let symbol = '';\n\n if (type === 'startsWith') {\n symbol = 'a*';\n } else if (type === 'endsWith') {\n symbol = '*z';\n } else {\n symbol = TableUtils.getFilterOperatorString(type);\n }\n\n return [\n {\n title: LinkerLink.getLabelForLinkFilter(columnType, type),\n icon: <b>{symbol}</b>,\n action: () => onOperatorChanged(linkId, type),\n order: index,\n },\n ];\n });\n }\n );\n\n handleClick(event: MouseEvent<SVGPathElement>): void {\n event.stopPropagation();\n event.preventDefault();\n\n const { id, onClick, onDelete } = this.props;\n if (event.altKey) {\n onDelete(id);\n } else {\n onClick(id);\n }\n }\n\n handleMouseEnter(): void {\n this.setState({\n isHovering: true,\n });\n }\n\n handleMouseLeave(): void {\n this.setState({\n isHovering: false,\n });\n }\n\n handleDelete(): void {\n const { id, onDelete } = this.props;\n onDelete(id);\n }\n\n getDropdownActions(): DropdownAction[] {\n const { id, startColumnType } = this.props;\n if (startColumnType != null) {\n return this.getOperators(id, startColumnType);\n }\n return [];\n }\n\n render(): JSX.Element {\n const {\n className,\n operator,\n isSelected,\n x1,\n y1,\n x2,\n y2,\n id,\n startColumnType,\n type,\n } = this.props;\n const { isHovering } = this.state;\n\n // Path between the two points\n const len = Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2);\n const theta = Math.atan2(y2 - y1, x2 - x1);\n const xMult = Math.sin(theta);\n const yMult = Math.cos(theta) + 2;\n const maxX = window.innerWidth;\n const maxY = window.innerHeight;\n const minX = 0;\n const minY = 0;\n const qx = Math.max(\n minX,\n Math.min(\n x1 + (x2 - x1) / 2 + xMult * (len * DROOP) ** DROOP_EXPONENT,\n maxX\n )\n );\n const qy = Math.max(\n minY,\n Math.min(\n y1 + (y2 - y1) / 2 + yMult * (len * DROOP) ** DROOP_EXPONENT,\n maxY\n )\n );\n const path = `M ${x1} ${y1} Q ${qx} ${qy} ${x2} ${y2}`;\n\n // path for a 100%, 100% rect, then two paths for circles at point\n const selectClipPath = `M ${minX} ${minY} L ${minX} ${maxY} L ${maxX} ${maxY} L ${maxX} ${minY} z\n ${LinkerLink.makeCirclePath(x1, y1, CLIP_RADIUS)}\n ${LinkerLink.makeCirclePath(x2, y2, CLIP_RADIUS)}`;\n const clipPathId = `link-select-clip-${id}`;\n\n // Calculate location of the end triangle\n // We draw it instead of using markers to allow for transitions in the style\n const endTheta = Math.atan2(y2 - qy, x2 - qx);\n const t2theta = endTheta - TRIANGLE_THETA + Math.PI;\n const t3theta = endTheta + TRIANGLE_THETA + Math.PI;\n const tx1 = x2 + Math.cos(endTheta) * TRIANGLE_TIP;\n const ty1 = y2 + Math.sin(endTheta) * TRIANGLE_TIP;\n const tx2 = tx1 + Math.cos(t2theta) * TRIANGLE_HYPOTENUSE;\n const ty2 = ty1 + Math.sin(t2theta) * TRIANGLE_HYPOTENUSE;\n const tx3 = tx1 + Math.cos(t3theta) * TRIANGLE_HYPOTENUSE;\n const ty3 = ty1 + Math.sin(t3theta) * TRIANGLE_HYPOTENUSE;\n const points = `${tx1},${ty1} ${tx2},${ty2} ${tx3},${ty3}`;\n\n // Button offset calculations\n const midX = 0.25 * x1 + 0.5 * qx + 0.25 * x2;\n const midY = 0.25 * y1 + 0.5 * qy + 0.25 * y2;\n const dMidX = qx - x1 + (x2 - qx);\n const dMidY = qy - y1 + (y2 - qy);\n const slopeAtMid = dMidY / dMidX;\n const DISTANCE_FROM_MID = 20;\n let topOffsetX = DISTANCE_FROM_MID / Math.sqrt(1 + slopeAtMid ** 2);\n let topOffsetY = topOffsetX * slopeAtMid;\n let bottomOffsetX = topOffsetX * -1;\n let bottomOffsetY = topOffsetY * -1;\n if (!Number.isFinite(slopeAtMid)) {\n bottomOffsetX = 10;\n bottomOffsetY = 5;\n topOffsetX = 10;\n topOffsetY = -35;\n } else if (slopeAtMid > 0) {\n topOffsetX *= -1;\n topOffsetY *= -1;\n bottomOffsetX *= -1;\n bottomOffsetY *= -1;\n bottomOffsetX -= 50 - 10 * (Math.abs(theta) % HALF_PI);\n bottomOffsetY += 10 * (Math.abs(theta) % HALF_PI);\n topOffsetX -= 50 - 10 * (Math.abs(theta) % HALF_PI);\n topOffsetY += 10 * (Math.abs(theta) % HALF_PI);\n } else if (slopeAtMid < 0) {\n bottomOffsetX += 10 * (Math.abs(theta) % HALF_PI);\n bottomOffsetY += 10 * (Math.abs(theta) % HALF_PI);\n topOffsetX += 10 * (Math.abs(theta) % HALF_PI);\n topOffsetY += 10 * (Math.abs(theta) % HALF_PI);\n } else {\n bottomOffsetX = 15;\n bottomOffsetY = 10;\n topOffsetX = -25;\n topOffsetY = 10;\n }\n\n let symbol = '';\n if (operator !== undefined) {\n if (operator === 'startsWith') {\n symbol = 'a*';\n } else if (operator === 'endsWith') {\n symbol = '*z';\n } else {\n symbol = TableUtils.getFilterOperatorString(operator);\n }\n }\n\n const showOperator = type !== 'chartLink' && type !== 'filterSource';\n\n return (\n <>\n <svg\n className={classNames(className, {\n hovering: isHovering,\n })}\n >\n <clipPath id={clipPathId}>\n <path d={selectClipPath} clipRule=\"evenodd\" />\n </clipPath>\n <path\n className=\"link-select\"\n d={path}\n onClick={this.handleClick}\n onMouseEnter={this.handleMouseEnter}\n onMouseLeave={this.handleMouseLeave}\n clipPath={`url(#${clipPathId})`}\n data-testid=\"link-select\"\n />\n <path className=\"link-background\" d={path} />\n <path className=\"link-foreground\" d={path} />\n <circle className=\"link-dot\" cx={x1} cy={y1} r=\"5\" />\n <polygon className=\"link-triangle\" points={points} />\n </svg>\n {startColumnType != null && isSelected && (\n <>\n {showOperator && (\n <Button\n kind=\"primary\"\n className=\"btn-fab btn-operator\"\n style={{\n top: midY + (slopeAtMid >= 0 ? topOffsetY : bottomOffsetY),\n left: midX + (slopeAtMid >= 0 ? topOffsetX : bottomOffsetX),\n }}\n onClick={() => {\n // no-op: click is handled in `DropdownMenu'\n }}\n icon={\n <div className=\"fa-md fa-layers\">\n <b>{symbol}</b>\n <FontAwesomeIcon\n icon={vsTriangleDown}\n transform=\"right-8 down-9 shrink-5\"\n />\n </div>\n }\n tooltip=\"Change comparison operator\"\n >\n <DropdownMenu\n actions={this.getDropdownActions}\n popperOptions={{ placement: 'bottom-start' }}\n />\n </Button>\n )}\n <Button\n kind=\"primary\"\n className=\"btn-fab btn-delete\"\n style={{\n top: midY + (slopeAtMid < 0 ? topOffsetY : bottomOffsetY),\n left: midX + (slopeAtMid < 0 ? topOffsetX : bottomOffsetX),\n }}\n onClick={this.handleDelete}\n icon={vsTrash}\n tooltip=\"Delete\"\n />\n </>\n )}\n </>\n );\n }\n}\n\nexport default LinkerLink;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinkerOverlayContent.js","names":["React","Component","classNames","Button","ContextActions","GLOBAL_SHORTCUTS","Tooltip","LayoutUtils","Log","vsGripper","clamp","isLinkableFromPanel","LinkerLink","log","module","LinkerOverlayContent","constructor","props","handleBlur","bind","handleResize","handleMouseMove","handleMouseDown","handleMouseUp","handleKeyDown","handleKeyUp","handleEscapePressed","handleOperatorChanged","dialogRef","createRef","state","mouse","undefined","dialog","offset","x","y","isDragging","mode","componentDidMount","window","addEventListener","componentDidCatch","error","info","componentWillUnmount","removeEventListener","getPointFromLinkPoint","linkPoint","panelManager","panelId","columnName","panel","getOpenedPanelById","Error","coordinate","getCoordinateForColumn","e","glContainer","getContainerByPanelId","getTabPoint","linkId","type","links","onLinksUpdated","newLinks","map","link","id","operator","setState","current","rect","getBoundingClientRect","dialogX","innerWidth","width","dialogY","innerHeight","height","event","clientX","clientY","right","bottom","key","preventDefault","selectedIds","onLinkDeleted","forEach","onCancel","render","disabled","messageText","onLinkSelected","onAllLinksDeleted","onDone","visibleLinks","isReversed","start","end","startColumnType","columnType","x1","y1","x2","y2","tmpX","tmpY","className","interactive","has","warn","filter","item","dragging","action","shortcut","LINKER_CLOSE","isGlobal"],"sources":["../../src/linker/LinkerOverlayContent.tsx"],"sourcesContent":["import React, { Component, ErrorInfo } from 'react';\nimport classNames from 'classnames';\nimport {\n Button,\n ContextActions,\n GLOBAL_SHORTCUTS,\n Tooltip,\n} from '@deephaven/components';\nimport { LayoutUtils, PanelManager } from '@deephaven/dashboard';\nimport Log from '@deephaven/log';\nimport type { Container } from '@deephaven/golden-layout';\nimport { vsGripper } from '@deephaven/icons';\nimport { TypeValue as FilterTypeValue } from '@deephaven/filters';\nimport clamp from 'lodash.clamp';\nimport {\n isLinkableFromPanel,\n Link,\n LinkerCoordinate,\n LinkPoint,\n LinkType,\n} from './LinkerUtils';\nimport LinkerLink from './LinkerLink';\nimport './LinkerOverlayContent.scss';\n\nconst log = Log.module('LinkerOverlayContent');\n\nexport type VisibleLink = {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n id: string;\n className: string;\n type: LinkType;\n operator: FilterTypeValue;\n startColumnType: string | null;\n};\n\nexport type LinkerOverlayContentProps = {\n disabled?: boolean;\n links: Link[];\n selectedIds: Set<string>;\n messageText: string;\n onLinkSelected: (linkId: string) => void;\n onLinkDeleted: (linkId: string) => void;\n onAllLinksDeleted: () => void;\n onLinksUpdated: (newLinks: Link[]) => void;\n onCancel: () => void;\n onDone: () => void;\n panelManager: PanelManager;\n};\n\ntype Point = { x: number; y: number };\n\nexport type LinkerOverlayContentState = {\n mouse?: Point;\n dialog?: Point;\n offset: Point;\n isDragging: boolean;\n mode: 'select' | 'delete';\n};\n\nexport class LinkerOverlayContent extends Component<\n LinkerOverlayContentProps,\n LinkerOverlayContentState\n> {\n static defaultProps = {\n disabled: 'false',\n };\n\n constructor(props: LinkerOverlayContentProps) {\n super(props);\n\n this.handleBlur = this.handleBlur.bind(this);\n this.handleResize = this.handleResize.bind(this);\n this.handleMouseMove = this.handleMouseMove.bind(this);\n this.handleMouseDown = this.handleMouseDown.bind(this);\n this.handleMouseUp = this.handleMouseUp.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleKeyUp = this.handleKeyUp.bind(this);\n this.handleEscapePressed = this.handleEscapePressed.bind(this);\n this.handleOperatorChanged = this.handleOperatorChanged.bind(this);\n\n this.dialogRef = React.createRef();\n\n this.state = {\n mouse: undefined,\n dialog: undefined,\n offset: { x: 0, y: 0 },\n isDragging: false,\n mode: 'select',\n };\n }\n\n componentDidMount(): void {\n window.addEventListener('blur', this.handleBlur, true);\n window.addEventListener('mousemove', this.handleMouseMove, true);\n window.addEventListener('mouseup', this.handleMouseUp, true);\n window.addEventListener('keydown', this.handleKeyDown, true);\n window.addEventListener('keyup', this.handleKeyUp, true);\n window.addEventListener('resize', this.handleResize, true);\n }\n\n // eslint-disable-next-line react/sort-comp\n componentDidCatch(error: Error, info: ErrorInfo): void {\n log.error('componentDidCatch', error, info);\n }\n\n componentWillUnmount(): void {\n window.removeEventListener('blur', this.handleBlur, true);\n window.removeEventListener('mousemove', this.handleMouseMove, true);\n window.removeEventListener('mouseup', this.handleMouseUp, true);\n window.removeEventListener('keydown', this.handleKeyDown, true);\n window.removeEventListener('keyup', this.handleKeyUp, true);\n window.removeEventListener('resize', this.handleResize, true);\n }\n\n dialogRef: React.RefObject<HTMLInputElement>;\n\n /** Gets the on screen points for a link start or end spec */\n getPointFromLinkPoint(linkPoint: LinkPoint): LinkerCoordinate {\n const { panelManager } = this.props;\n const { panelId, columnName } = linkPoint;\n const panel = panelManager.getOpenedPanelById(panelId);\n if (panel != null) {\n if (!isLinkableFromPanel(panel)) {\n throw new Error(\n `Panel does not have getCoordinateForColumn method: ${panelId}`\n );\n }\n try {\n // TODO: remove try/catch when IDS-7371 is fixed.\n // getCoordinateForColumn throws an exception when accessing\n // columns on a model while it reconnects\n const coordinate = panel.getCoordinateForColumn(columnName);\n if (coordinate != null) {\n return coordinate;\n }\n } catch (e) {\n log.error('Could not get coordinate for column', columnName, panel);\n }\n }\n // Fallback to panel container if the panel itself\n // crashed, unmounted, and removed from openedPanelMap.\n const glContainer = panelManager.getContainerByPanelId(panelId);\n if (glContainer == null) {\n throw new Error(`Unable to find panel container for id: ${panelId}`);\n }\n return LayoutUtils.getTabPoint(glContainer as unknown as Container);\n }\n\n handleOperatorChanged(linkId: string, type: FilterTypeValue): void {\n const { links, onLinksUpdated } = this.props;\n const newLinks: Link[] = links.map(link =>\n link.id === linkId ? { ...link, operator: type } : link\n );\n onLinksUpdated(newLinks);\n }\n\n handleBlur(): void {\n this.setState({ mode: 'select' });\n }\n\n handleResize(): void {\n const { dialog } = this.state;\n if (dialog && this.dialogRef.current) {\n const rect = this.dialogRef.current.getBoundingClientRect();\n const dialogX = clamp(dialog.x, 0, window.innerWidth - rect.width);\n const dialogY = clamp(dialog.y, 0, window.innerHeight - rect.height);\n this.setState({\n dialog: { x: dialogX, y: dialogY },\n });\n }\n }\n\n handleMouseMove(event: MouseEvent): void {\n const { offset, isDragging } = this.state;\n this.setState({\n mouse: { x: event.clientX, y: event.clientY },\n });\n\n if (isDragging && this.dialogRef.current) {\n const rect = this.dialogRef.current.getBoundingClientRect();\n const dialogX = clamp(\n window.innerWidth - (event.clientX + rect.width + offset.x),\n 0,\n window.innerWidth - rect.width\n );\n\n const dialogY = clamp(\n window.innerHeight - (event.clientY + rect.height + offset.y),\n 0,\n window.innerHeight - rect.height\n );\n\n this.setState({\n dialog: { x: dialogX, y: dialogY },\n });\n }\n }\n\n handleMouseDown(event: React.MouseEvent): void {\n const offset: Point = { x: 0, y: 0 };\n if (this.dialogRef.current) {\n const rect = this.dialogRef.current.getBoundingClientRect();\n offset.x = rect.right - (rect.width + event.clientX);\n offset.y = rect.bottom - (rect.height + event.clientY);\n }\n this.setState({\n isDragging: true,\n offset,\n });\n }\n\n handleMouseUp(): void {\n this.setState({\n isDragging: false,\n });\n }\n\n handleKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Alt') {\n event.preventDefault();\n this.setState({\n mode: 'delete',\n });\n } else if (event.key === 'Delete' || event.key === 'Backspace') {\n const { selectedIds, onLinkDeleted } = this.props;\n event.preventDefault();\n selectedIds.forEach(id => onLinkDeleted(id));\n }\n }\n\n handleKeyUp(event: KeyboardEvent): void {\n if (event.key === 'Alt') {\n event.preventDefault();\n this.setState({\n mode: 'select',\n });\n }\n }\n\n handleEscapePressed(): void {\n const { onCancel } = this.props;\n onCancel();\n }\n\n render(): JSX.Element {\n const {\n disabled,\n links,\n selectedIds,\n messageText,\n onLinkSelected,\n onLinkDeleted,\n onAllLinksDeleted,\n onDone,\n } = this.props;\n\n const { mouse, dialog, isDragging, mode } = this.state;\n const visibleLinks = links\n .map(link => {\n try {\n const { id, type, isReversed, start, end, operator } = link;\n const startColumnType = start.columnType;\n let [x1, y1] = this.getPointFromLinkPoint(start);\n let x2 = mouse?.x ?? x1;\n let y2 = mouse?.y ?? y1;\n if (end != null) {\n [x2, y2] = this.getPointFromLinkPoint(end);\n }\n if (isReversed != null && isReversed) {\n const [tmpX, tmpY] = [x1, y1];\n [x1, y1] = [x2, y2];\n [x2, y2] = [tmpX, tmpY];\n }\n const className = classNames(\n 'linker-link',\n { disabled },\n { 'link-filter-source': type === 'filterSource' },\n { 'link-invalid': type === 'invalid' },\n { interactive: link.end == null },\n { 'link-is-selected': selectedIds.has(id) },\n { 'danger-delete': mode === 'delete' }\n );\n return {\n x1,\n y1,\n x2,\n y2,\n id,\n className,\n operator,\n startColumnType,\n type,\n };\n } catch (error) {\n log.warn('Unable to get point for link', link, error);\n return null;\n }\n })\n .filter(item => item != null) as VisibleLink[];\n\n return (\n <div\n className={classNames('linker-overlay', {\n 'danger-delete': mode === 'delete',\n })}\n >\n {visibleLinks.map(\n ({\n x1,\n y1,\n x2,\n y2,\n id,\n className,\n operator,\n startColumnType,\n type,\n }) => (\n <LinkerLink\n className={className}\n id={id}\n x1={x1}\n y1={y1}\n x2={x2}\n y2={y2}\n key={id}\n onClick={onLinkSelected}\n onDelete={onLinkDeleted}\n isSelected={selectedIds.has(id)}\n operator={operator}\n startColumnType={startColumnType}\n type={type}\n onOperatorChanged={this.handleOperatorChanged}\n />\n )\n )}\n <div\n className={classNames('linker-toast-dialog', {\n dragging: isDragging,\n })}\n ref={this.dialogRef}\n style={{ bottom: dialog?.y, right: dialog?.x }}\n data-testid=\"linker-toast-dialog\"\n >\n <Button\n draggable\n kind=\"inline\"\n className=\"btn-drag-handle\"\n icon={vsGripper}\n onClick={() => {\n // no-op\n }}\n onMouseDown={this.handleMouseDown}\n >\n {!isDragging && <Tooltip>Drag to reposition</Tooltip>}\n </Button>\n <div className=\"toast-body\">{messageText}</div>\n <div className=\"toast-footer\">\n <Button kind=\"secondary\" onClick={onAllLinksDeleted}>\n Clear All\n </Button>\n <Button kind=\"primary\" onClick={onDone}>\n Done\n </Button>\n </div>\n </div>\n <ContextActions\n actions={[\n {\n action: this.handleEscapePressed,\n shortcut: GLOBAL_SHORTCUTS.LINKER_CLOSE,\n isGlobal: true,\n },\n ]}\n />\n </div>\n );\n }\n}\n\nexport default LinkerOverlayContent;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LinkerOverlayContent.js","names":["React","Component","classNames","Button","ContextActions","GLOBAL_SHORTCUTS","Tooltip","LayoutUtils","Log","vsGripper","clamp","isLinkableFromPanel","LinkerLink","jsx","_jsx","jsxs","_jsxs","log","module","LinkerOverlayContent","constructor","props","_defineProperty","handleBlur","bind","handleResize","handleMouseMove","handleMouseDown","handleMouseUp","handleKeyDown","handleKeyUp","handleEscapePressed","handleOperatorChanged","dialogRef","createRef","state","mouse","undefined","dialog","offset","x","y","isDragging","mode","componentDidMount","window","addEventListener","componentDidCatch","error","info","componentWillUnmount","removeEventListener","getPointFromLinkPoint","linkPoint","panelManager","panelId","columnName","panel","getOpenedPanelById","Error","concat","coordinate","getCoordinateForColumn","e","glContainer","getContainerByPanelId","getTabPoint","linkId","type","links","onLinksUpdated","newLinks","map","link","id","_objectSpread","operator","setState","current","rect","getBoundingClientRect","dialogX","innerWidth","width","dialogY","innerHeight","height","event","clientX","clientY","right","bottom","key","preventDefault","selectedIds","onLinkDeleted","forEach","onCancel","render","disabled","messageText","onLinkSelected","onAllLinksDeleted","onDone","visibleLinks","_mouse$x","_mouse$y","isReversed","start","end","startColumnType","columnType","x1","y1","x2","y2","tmpX","tmpY","className","interactive","has","warn","filter","item","children","_ref","onClick","onDelete","isSelected","onOperatorChanged","dragging","ref","style","draggable","kind","icon","onMouseDown","actions","action","shortcut","LINKER_CLOSE","isGlobal"],"sources":["../../src/linker/LinkerOverlayContent.tsx"],"sourcesContent":["import React, { Component, ErrorInfo } from 'react';\nimport classNames from 'classnames';\nimport {\n Button,\n ContextActions,\n GLOBAL_SHORTCUTS,\n Tooltip,\n} from '@deephaven/components';\nimport { LayoutUtils, PanelManager } from '@deephaven/dashboard';\nimport Log from '@deephaven/log';\nimport type { Container } from '@deephaven/golden-layout';\nimport { vsGripper } from '@deephaven/icons';\nimport { TypeValue as FilterTypeValue } from '@deephaven/filters';\nimport clamp from 'lodash.clamp';\nimport {\n isLinkableFromPanel,\n Link,\n LinkerCoordinate,\n LinkPoint,\n LinkType,\n} from './LinkerUtils';\nimport LinkerLink from './LinkerLink';\nimport './LinkerOverlayContent.scss';\n\nconst log = Log.module('LinkerOverlayContent');\n\nexport type VisibleLink = {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n id: string;\n className: string;\n type: LinkType;\n operator: FilterTypeValue;\n startColumnType: string | null;\n};\n\nexport type LinkerOverlayContentProps = {\n disabled?: boolean;\n links: Link[];\n selectedIds: Set<string>;\n messageText: string;\n onLinkSelected: (linkId: string) => void;\n onLinkDeleted: (linkId: string) => void;\n onAllLinksDeleted: () => void;\n onLinksUpdated: (newLinks: Link[]) => void;\n onCancel: () => void;\n onDone: () => void;\n panelManager: PanelManager;\n};\n\ntype Point = { x: number; y: number };\n\nexport type LinkerOverlayContentState = {\n mouse?: Point;\n dialog?: Point;\n offset: Point;\n isDragging: boolean;\n mode: 'select' | 'delete';\n};\n\nexport class LinkerOverlayContent extends Component<\n LinkerOverlayContentProps,\n LinkerOverlayContentState\n> {\n static defaultProps = {\n disabled: 'false',\n };\n\n constructor(props: LinkerOverlayContentProps) {\n super(props);\n\n this.handleBlur = this.handleBlur.bind(this);\n this.handleResize = this.handleResize.bind(this);\n this.handleMouseMove = this.handleMouseMove.bind(this);\n this.handleMouseDown = this.handleMouseDown.bind(this);\n this.handleMouseUp = this.handleMouseUp.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleKeyUp = this.handleKeyUp.bind(this);\n this.handleEscapePressed = this.handleEscapePressed.bind(this);\n this.handleOperatorChanged = this.handleOperatorChanged.bind(this);\n\n this.dialogRef = React.createRef();\n\n this.state = {\n mouse: undefined,\n dialog: undefined,\n offset: { x: 0, y: 0 },\n isDragging: false,\n mode: 'select',\n };\n }\n\n componentDidMount(): void {\n window.addEventListener('blur', this.handleBlur, true);\n window.addEventListener('mousemove', this.handleMouseMove, true);\n window.addEventListener('mouseup', this.handleMouseUp, true);\n window.addEventListener('keydown', this.handleKeyDown, true);\n window.addEventListener('keyup', this.handleKeyUp, true);\n window.addEventListener('resize', this.handleResize, true);\n }\n\n // eslint-disable-next-line react/sort-comp\n componentDidCatch(error: Error, info: ErrorInfo): void {\n log.error('componentDidCatch', error, info);\n }\n\n componentWillUnmount(): void {\n window.removeEventListener('blur', this.handleBlur, true);\n window.removeEventListener('mousemove', this.handleMouseMove, true);\n window.removeEventListener('mouseup', this.handleMouseUp, true);\n window.removeEventListener('keydown', this.handleKeyDown, true);\n window.removeEventListener('keyup', this.handleKeyUp, true);\n window.removeEventListener('resize', this.handleResize, true);\n }\n\n dialogRef: React.RefObject<HTMLInputElement>;\n\n /** Gets the on screen points for a link start or end spec */\n getPointFromLinkPoint(linkPoint: LinkPoint): LinkerCoordinate {\n const { panelManager } = this.props;\n const { panelId, columnName } = linkPoint;\n const panel = panelManager.getOpenedPanelById(panelId);\n if (panel != null) {\n if (!isLinkableFromPanel(panel)) {\n throw new Error(\n `Panel does not have getCoordinateForColumn method: ${panelId}`\n );\n }\n try {\n // TODO: remove try/catch when IDS-7371 is fixed.\n // getCoordinateForColumn throws an exception when accessing\n // columns on a model while it reconnects\n const coordinate = panel.getCoordinateForColumn(columnName);\n if (coordinate != null) {\n return coordinate;\n }\n } catch (e) {\n log.error('Could not get coordinate for column', columnName, panel);\n }\n }\n // Fallback to panel container if the panel itself\n // crashed, unmounted, and removed from openedPanelMap.\n const glContainer = panelManager.getContainerByPanelId(panelId);\n if (glContainer == null) {\n throw new Error(`Unable to find panel container for id: ${panelId}`);\n }\n return LayoutUtils.getTabPoint(glContainer as unknown as Container);\n }\n\n handleOperatorChanged(linkId: string, type: FilterTypeValue): void {\n const { links, onLinksUpdated } = this.props;\n const newLinks: Link[] = links.map(link =>\n link.id === linkId ? { ...link, operator: type } : link\n );\n onLinksUpdated(newLinks);\n }\n\n handleBlur(): void {\n this.setState({ mode: 'select' });\n }\n\n handleResize(): void {\n const { dialog } = this.state;\n if (dialog && this.dialogRef.current) {\n const rect = this.dialogRef.current.getBoundingClientRect();\n const dialogX = clamp(dialog.x, 0, window.innerWidth - rect.width);\n const dialogY = clamp(dialog.y, 0, window.innerHeight - rect.height);\n this.setState({\n dialog: { x: dialogX, y: dialogY },\n });\n }\n }\n\n handleMouseMove(event: MouseEvent): void {\n const { offset, isDragging } = this.state;\n this.setState({\n mouse: { x: event.clientX, y: event.clientY },\n });\n\n if (isDragging && this.dialogRef.current) {\n const rect = this.dialogRef.current.getBoundingClientRect();\n const dialogX = clamp(\n window.innerWidth - (event.clientX + rect.width + offset.x),\n 0,\n window.innerWidth - rect.width\n );\n\n const dialogY = clamp(\n window.innerHeight - (event.clientY + rect.height + offset.y),\n 0,\n window.innerHeight - rect.height\n );\n\n this.setState({\n dialog: { x: dialogX, y: dialogY },\n });\n }\n }\n\n handleMouseDown(event: React.MouseEvent): void {\n const offset: Point = { x: 0, y: 0 };\n if (this.dialogRef.current) {\n const rect = this.dialogRef.current.getBoundingClientRect();\n offset.x = rect.right - (rect.width + event.clientX);\n offset.y = rect.bottom - (rect.height + event.clientY);\n }\n this.setState({\n isDragging: true,\n offset,\n });\n }\n\n handleMouseUp(): void {\n this.setState({\n isDragging: false,\n });\n }\n\n handleKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Alt') {\n event.preventDefault();\n this.setState({\n mode: 'delete',\n });\n } else if (event.key === 'Delete' || event.key === 'Backspace') {\n const { selectedIds, onLinkDeleted } = this.props;\n event.preventDefault();\n selectedIds.forEach(id => onLinkDeleted(id));\n }\n }\n\n handleKeyUp(event: KeyboardEvent): void {\n if (event.key === 'Alt') {\n event.preventDefault();\n this.setState({\n mode: 'select',\n });\n }\n }\n\n handleEscapePressed(): void {\n const { onCancel } = this.props;\n onCancel();\n }\n\n render(): JSX.Element {\n const {\n disabled,\n links,\n selectedIds,\n messageText,\n onLinkSelected,\n onLinkDeleted,\n onAllLinksDeleted,\n onDone,\n } = this.props;\n\n const { mouse, dialog, isDragging, mode } = this.state;\n const visibleLinks = links\n .map(link => {\n try {\n const { id, type, isReversed, start, end, operator } = link;\n const startColumnType = start.columnType;\n let [x1, y1] = this.getPointFromLinkPoint(start);\n let x2 = mouse?.x ?? x1;\n let y2 = mouse?.y ?? y1;\n if (end != null) {\n [x2, y2] = this.getPointFromLinkPoint(end);\n }\n if (isReversed != null && isReversed) {\n const [tmpX, tmpY] = [x1, y1];\n [x1, y1] = [x2, y2];\n [x2, y2] = [tmpX, tmpY];\n }\n const className = classNames(\n 'linker-link',\n { disabled },\n { 'link-filter-source': type === 'filterSource' },\n { 'link-invalid': type === 'invalid' },\n { interactive: link.end == null },\n { 'link-is-selected': selectedIds.has(id) },\n { 'danger-delete': mode === 'delete' }\n );\n return {\n x1,\n y1,\n x2,\n y2,\n id,\n className,\n operator,\n startColumnType,\n type,\n };\n } catch (error) {\n log.warn('Unable to get point for link', link, error);\n return null;\n }\n })\n .filter(item => item != null) as VisibleLink[];\n\n return (\n <div\n className={classNames('linker-overlay', {\n 'danger-delete': mode === 'delete',\n })}\n >\n {visibleLinks.map(\n ({\n x1,\n y1,\n x2,\n y2,\n id,\n className,\n operator,\n startColumnType,\n type,\n }) => (\n <LinkerLink\n className={className}\n id={id}\n x1={x1}\n y1={y1}\n x2={x2}\n y2={y2}\n key={id}\n onClick={onLinkSelected}\n onDelete={onLinkDeleted}\n isSelected={selectedIds.has(id)}\n operator={operator}\n startColumnType={startColumnType}\n type={type}\n onOperatorChanged={this.handleOperatorChanged}\n />\n )\n )}\n <div\n className={classNames('linker-toast-dialog', {\n dragging: isDragging,\n })}\n ref={this.dialogRef}\n style={{ bottom: dialog?.y, right: dialog?.x }}\n data-testid=\"linker-toast-dialog\"\n >\n <Button\n draggable\n kind=\"inline\"\n className=\"btn-drag-handle\"\n icon={vsGripper}\n onClick={() => {\n // no-op\n }}\n onMouseDown={this.handleMouseDown}\n >\n {!isDragging && <Tooltip>Drag to reposition</Tooltip>}\n </Button>\n <div className=\"toast-body\">{messageText}</div>\n <div className=\"toast-footer\">\n <Button kind=\"secondary\" onClick={onAllLinksDeleted}>\n Clear All\n </Button>\n <Button kind=\"primary\" onClick={onDone}>\n Done\n </Button>\n </div>\n </div>\n <ContextActions\n actions={[\n {\n action: this.handleEscapePressed,\n shortcut: GLOBAL_SHORTCUTS.LINKER_CLOSE,\n isGlobal: true,\n },\n ]}\n />\n </div>\n );\n }\n}\n\nexport default LinkerOverlayContent;\n"],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import shortid from 'shortid';
|
|
|
7
7
|
import { LayoutUtils } from '@deephaven/dashboard';
|
|
8
8
|
import { TableUtils } from '@deephaven/jsapi-utils';
|
|
9
9
|
import Log from '@deephaven/log';
|
|
10
|
-
import { ChartPanel, IrisGridPanel, DropdownFilterPanel } from "../panels/index.js";
|
|
10
|
+
import { ChartPanel, IrisGridPanel, DropdownFilterPanel } from "../panels/index.js"; // [x,y] screen coordinates used by the Linker
|
|
11
11
|
export function isLinkableFromPanel(panel) {
|
|
12
12
|
var p = panel;
|
|
13
13
|
return typeof p.getCoordinateForColumn === 'function';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinkerUtils.js","names":["shortid","LayoutUtils","TableUtils","Log","ChartPanel","IrisGridPanel","DropdownFilterPanel","isLinkableFromPanel","panel","p","getCoordinateForColumn","isLinkablePanel","setFilterMap","unsetFilterValue","isLinkableColumn","column","description","undefined","startsWith","log","module","LinkerUtils","getLinkType","start","end","isolatedLinkerPanelId","panelId","debug2","panelComponent","error","isCompatibleComponent","ALLOWED_LINKS","get","includes","columnType","startColumnType","endColumnType","isCompatibleType","getComponentName","findColumn","columns","columnName","find","name","type","cloneLinksForPanel","links","cloneId","clonedLinks","forEach","link","push","id","generate","Map"],"sources":["../../src/linker/LinkerUtils.ts"],"sourcesContent":["import shortid from 'shortid';\nimport { LayoutUtils, PanelComponent } from '@deephaven/dashboard';\nimport { TableUtils } from '@deephaven/jsapi-utils';\nimport { TypeValue as FilterTypeValue } from '@deephaven/filters';\nimport Log from '@deephaven/log';\nimport { ChartPanel, IrisGridPanel, DropdownFilterPanel } from '../panels';\n\nexport type LinkType = 'invalid' | 'filterSource' | 'tableLink' | 'chartLink';\n\nexport type LinkPoint = {\n panelId: string | string[];\n panelComponent?: string | null;\n columnName: string;\n columnType: string | null;\n};\n\nexport type Link = {\n start: LinkPoint;\n end?: LinkPoint;\n id: string;\n isReversed?: boolean;\n type: LinkType;\n operator?: FilterTypeValue;\n};\n\nexport type LinkColumn = {\n name: string;\n type: string | null;\n description?: string;\n};\n\nexport type LinkDataValue<T = unknown> = {\n operator: FilterTypeValue;\n text: string;\n value: T;\n startColumnIndex: number;\n};\n\nexport type LinkFilterMapValue<T = unknown> = {\n columnType: string;\n filterList: LinkDataValue<T>[];\n};\n\nexport type LinkFilterMap<T = unknown> = Map<string, LinkFilterMapValue<T>>;\n\n// [x,y] screen coordinates used by the Linker\nexport type LinkerCoordinate = [number, number];\n\nexport type LinkableFromPanel = PanelComponent & {\n getCoordinateForColumn: (name: string) => LinkerCoordinate;\n};\n\nexport type LinkablePanel = LinkableFromPanel & {\n setFilterMap: (filterMap: LinkFilterMap) => void;\n unsetFilterValue: (name: string, type: string | null) => void;\n};\n\nexport function isLinkableFromPanel(\n panel: PanelComponent\n): panel is LinkableFromPanel {\n const p = panel as LinkableFromPanel;\n return typeof p.getCoordinateForColumn === 'function';\n}\n\nexport function isLinkablePanel(panel: PanelComponent): panel is LinkablePanel {\n const p = panel as LinkablePanel;\n return (\n isLinkableFromPanel(panel) &&\n typeof p.setFilterMap === 'function' &&\n typeof p.unsetFilterValue === 'function'\n );\n}\n\nexport function isLinkableColumn(column: LinkColumn): boolean {\n // TODO: core/#3358 Use preview/original type property instead of checking description\n return (\n column.description === undefined ||\n !column.description?.startsWith('Preview of type: ')\n );\n}\n\nconst log = Log.module('LinkerUtils');\n\n/**\n * Collection of utility functions for use with the Linker\n */\nclass LinkerUtils {\n static ALLOWED_LINKS = new Map([\n [\n LayoutUtils.getComponentName(IrisGridPanel),\n [\n LayoutUtils.getComponentName(IrisGridPanel),\n LayoutUtils.getComponentName(ChartPanel),\n LayoutUtils.getComponentName(DropdownFilterPanel),\n ],\n ],\n ]);\n\n /**\n * Retrieve the type of link given parameters.\n * @param start The link start\n * @param end The link end\n * @param isolatedLinkerPanelId Whether there's an isolated linker\n * @returns The type of link, or invalid if there's an error\n */\n static getLinkType(\n start?: LinkPoint,\n end?: LinkPoint,\n isolatedLinkerPanelId?: string | string[]\n ): LinkType {\n // Panel compatibility checks:\n // Link ends should point to different non-null panelIds\n // For isolated linker one of the panels should match isolated panel id\n if (\n start?.panelId == null ||\n end?.panelId == null ||\n start.panelId === end.panelId ||\n (isolatedLinkerPanelId != null &&\n isolatedLinkerPanelId !== start.panelId &&\n isolatedLinkerPanelId !== end.panelId)\n ) {\n log.debug2('Incompatible panel ids', start, end, isolatedLinkerPanelId);\n return 'invalid';\n }\n\n if (start.panelComponent == null || end.panelComponent == null) {\n log.error('PanelComponent should not be null', start, end);\n return 'invalid';\n }\n\n const isCompatibleComponent = LinkerUtils.ALLOWED_LINKS.get(\n start.panelComponent\n )?.includes(end.panelComponent);\n\n if (isCompatibleComponent === undefined || !isCompatibleComponent) {\n log.debug2('Incompatible panel components', start, end);\n return 'invalid';\n }\n\n // Check column type compatibility\n const { columnType: startColumnType } = start;\n const { columnType: endColumnType } = end;\n\n // Null columnType in ending link point allows linking to any type\n const isCompatibleType =\n endColumnType === null ||\n TableUtils.isCompatibleType(startColumnType, endColumnType);\n\n if (!isCompatibleType) {\n log.debug2('Incompatible type', startColumnType, endColumnType);\n return 'invalid';\n }\n\n // If all checks pass, link type is determined by the target panel component\n switch (end.panelComponent) {\n case LayoutUtils.getComponentName(ChartPanel):\n return 'chartLink';\n case LayoutUtils.getComponentName(IrisGridPanel):\n return 'tableLink';\n case LayoutUtils.getComponentName(DropdownFilterPanel):\n return 'filterSource';\n default:\n }\n\n log.debug2('Incompatible target panel component', end.panelComponent);\n return 'invalid';\n }\n\n /**\n * Find column matching the link point\n * @param columns Columns to search in\n * @param linkPoint Link point to find column for\n * @param linkPoint.columnName Column name to find\n * @param linkPoint.columnType Column type to find\n * @returns Column matching the link point, undefined if not found\n */\n static findColumn(\n columns: LinkColumn[],\n { columnName, columnType }: LinkPoint\n ): LinkColumn | undefined {\n return columns.find(\n ({ name, type }) => name === columnName && type === columnType\n );\n }\n\n /**\n * Clone links for a given panel id\n * @param links Original links array\n * @param panelId Original panel id\n * @param cloneId Cloned panel id\n * @returns Cloned links array or empty array if no new links added\n */\n static cloneLinksForPanel(\n links: Link[],\n panelId: string | string[],\n cloneId: string\n ): Link[] {\n const clonedLinks: Link[] = [];\n links.forEach(link => {\n if (link.start.panelId === panelId && link.type !== 'filterSource') {\n clonedLinks.push({\n ...link,\n id: shortid.generate(),\n start: { ...link.start, panelId: cloneId },\n });\n } else if (link.end?.panelId === panelId) {\n clonedLinks.push({\n ...link,\n id: shortid.generate(),\n end: { ...link.end, panelId: cloneId },\n });\n }\n });\n return clonedLinks;\n }\n}\n\nexport default LinkerUtils;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LinkerUtils.js","names":["shortid","LayoutUtils","TableUtils","Log","ChartPanel","IrisGridPanel","DropdownFilterPanel","isLinkableFromPanel","panel","p","getCoordinateForColumn","isLinkablePanel","setFilterMap","unsetFilterValue","isLinkableColumn","column","_column$description","description","undefined","startsWith","log","module","LinkerUtils","getLinkType","start","end","isolatedLinkerPanelId","_LinkerUtils$ALLOWED_","panelId","debug2","panelComponent","error","isCompatibleComponent","ALLOWED_LINKS","get","includes","columnType","startColumnType","endColumnType","isCompatibleType","getComponentName","findColumn","columns","_ref","columnName","find","_ref2","name","type","cloneLinksForPanel","links","cloneId","clonedLinks","forEach","link","_link$end","push","_objectSpread","id","generate","_defineProperty","Map"],"sources":["../../src/linker/LinkerUtils.ts"],"sourcesContent":["import shortid from 'shortid';\nimport { LayoutUtils, PanelComponent } from '@deephaven/dashboard';\nimport { TableUtils } from '@deephaven/jsapi-utils';\nimport { TypeValue as FilterTypeValue } from '@deephaven/filters';\nimport Log from '@deephaven/log';\nimport { ChartPanel, IrisGridPanel, DropdownFilterPanel } from '../panels';\n\nexport type LinkType = 'invalid' | 'filterSource' | 'tableLink' | 'chartLink';\n\nexport type LinkPoint = {\n panelId: string | string[];\n panelComponent?: string | null;\n columnName: string;\n columnType: string | null;\n};\n\nexport type Link = {\n start: LinkPoint;\n end?: LinkPoint;\n id: string;\n isReversed?: boolean;\n type: LinkType;\n operator?: FilterTypeValue;\n};\n\nexport type LinkColumn = {\n name: string;\n type: string | null;\n description?: string;\n};\n\nexport type LinkDataValue<T = unknown> = {\n operator: FilterTypeValue;\n text: string;\n value: T;\n startColumnIndex: number;\n};\n\nexport type LinkFilterMapValue<T = unknown> = {\n columnType: string;\n filterList: LinkDataValue<T>[];\n};\n\nexport type LinkFilterMap<T = unknown> = Map<string, LinkFilterMapValue<T>>;\n\n// [x,y] screen coordinates used by the Linker\nexport type LinkerCoordinate = [number, number];\n\nexport type LinkableFromPanel = PanelComponent & {\n getCoordinateForColumn: (name: string) => LinkerCoordinate;\n};\n\nexport type LinkablePanel = LinkableFromPanel & {\n setFilterMap: (filterMap: LinkFilterMap) => void;\n unsetFilterValue: (name: string, type: string | null) => void;\n};\n\nexport function isLinkableFromPanel(\n panel: PanelComponent\n): panel is LinkableFromPanel {\n const p = panel as LinkableFromPanel;\n return typeof p.getCoordinateForColumn === 'function';\n}\n\nexport function isLinkablePanel(panel: PanelComponent): panel is LinkablePanel {\n const p = panel as LinkablePanel;\n return (\n isLinkableFromPanel(panel) &&\n typeof p.setFilterMap === 'function' &&\n typeof p.unsetFilterValue === 'function'\n );\n}\n\nexport function isLinkableColumn(column: LinkColumn): boolean {\n // TODO: core/#3358 Use preview/original type property instead of checking description\n return (\n column.description === undefined ||\n !column.description?.startsWith('Preview of type: ')\n );\n}\n\nconst log = Log.module('LinkerUtils');\n\n/**\n * Collection of utility functions for use with the Linker\n */\nclass LinkerUtils {\n static ALLOWED_LINKS = new Map([\n [\n LayoutUtils.getComponentName(IrisGridPanel),\n [\n LayoutUtils.getComponentName(IrisGridPanel),\n LayoutUtils.getComponentName(ChartPanel),\n LayoutUtils.getComponentName(DropdownFilterPanel),\n ],\n ],\n ]);\n\n /**\n * Retrieve the type of link given parameters.\n * @param start The link start\n * @param end The link end\n * @param isolatedLinkerPanelId Whether there's an isolated linker\n * @returns The type of link, or invalid if there's an error\n */\n static getLinkType(\n start?: LinkPoint,\n end?: LinkPoint,\n isolatedLinkerPanelId?: string | string[]\n ): LinkType {\n // Panel compatibility checks:\n // Link ends should point to different non-null panelIds\n // For isolated linker one of the panels should match isolated panel id\n if (\n start?.panelId == null ||\n end?.panelId == null ||\n start.panelId === end.panelId ||\n (isolatedLinkerPanelId != null &&\n isolatedLinkerPanelId !== start.panelId &&\n isolatedLinkerPanelId !== end.panelId)\n ) {\n log.debug2('Incompatible panel ids', start, end, isolatedLinkerPanelId);\n return 'invalid';\n }\n\n if (start.panelComponent == null || end.panelComponent == null) {\n log.error('PanelComponent should not be null', start, end);\n return 'invalid';\n }\n\n const isCompatibleComponent = LinkerUtils.ALLOWED_LINKS.get(\n start.panelComponent\n )?.includes(end.panelComponent);\n\n if (isCompatibleComponent === undefined || !isCompatibleComponent) {\n log.debug2('Incompatible panel components', start, end);\n return 'invalid';\n }\n\n // Check column type compatibility\n const { columnType: startColumnType } = start;\n const { columnType: endColumnType } = end;\n\n // Null columnType in ending link point allows linking to any type\n const isCompatibleType =\n endColumnType === null ||\n TableUtils.isCompatibleType(startColumnType, endColumnType);\n\n if (!isCompatibleType) {\n log.debug2('Incompatible type', startColumnType, endColumnType);\n return 'invalid';\n }\n\n // If all checks pass, link type is determined by the target panel component\n switch (end.panelComponent) {\n case LayoutUtils.getComponentName(ChartPanel):\n return 'chartLink';\n case LayoutUtils.getComponentName(IrisGridPanel):\n return 'tableLink';\n case LayoutUtils.getComponentName(DropdownFilterPanel):\n return 'filterSource';\n default:\n }\n\n log.debug2('Incompatible target panel component', end.panelComponent);\n return 'invalid';\n }\n\n /**\n * Find column matching the link point\n * @param columns Columns to search in\n * @param linkPoint Link point to find column for\n * @param linkPoint.columnName Column name to find\n * @param linkPoint.columnType Column type to find\n * @returns Column matching the link point, undefined if not found\n */\n static findColumn(\n columns: LinkColumn[],\n { columnName, columnType }: LinkPoint\n ): LinkColumn | undefined {\n return columns.find(\n ({ name, type }) => name === columnName && type === columnType\n );\n }\n\n /**\n * Clone links for a given panel id\n * @param links Original links array\n * @param panelId Original panel id\n * @param cloneId Cloned panel id\n * @returns Cloned links array or empty array if no new links added\n */\n static cloneLinksForPanel(\n links: Link[],\n panelId: string | string[],\n cloneId: string\n ): Link[] {\n const clonedLinks: Link[] = [];\n links.forEach(link => {\n if (link.start.panelId === panelId && link.type !== 'filterSource') {\n clonedLinks.push({\n ...link,\n id: shortid.generate(),\n start: { ...link.start, panelId: cloneId },\n });\n } else if (link.end?.panelId === panelId) {\n clonedLinks.push({\n ...link,\n id: shortid.generate(),\n end: { ...link.end, panelId: cloneId },\n });\n }\n });\n return clonedLinks;\n }\n}\n\nexport default LinkerUtils;\n"],"mappings":"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"}
|