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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/dist/ChartBuilderPlugin.d.ts +1 -1
  2. package/dist/ChartBuilderPlugin.d.ts.map +1 -1
  3. package/dist/ChartBuilderPlugin.js +6 -8
  4. package/dist/ChartBuilderPlugin.js.map +1 -1
  5. package/dist/ChartPlugin.d.ts +1 -1
  6. package/dist/ChartPlugin.d.ts.map +1 -1
  7. package/dist/ChartPlugin.js +4 -8
  8. package/dist/ChartPlugin.js.map +1 -1
  9. package/dist/ConsolePlugin.d.ts +1 -1
  10. package/dist/ConsolePlugin.d.ts.map +1 -1
  11. package/dist/ConsolePlugin.js +16 -62
  12. package/dist/ConsolePlugin.js.map +1 -1
  13. package/dist/FilterPlugin.d.ts +1 -1
  14. package/dist/FilterPlugin.d.ts.map +1 -1
  15. package/dist/FilterPlugin.js +6 -13
  16. package/dist/FilterPlugin.js.map +1 -1
  17. package/dist/GridPlugin.d.ts +1 -1
  18. package/dist/GridPlugin.d.ts.map +1 -1
  19. package/dist/GridPlugin.js +4 -8
  20. package/dist/GridPlugin.js.map +1 -1
  21. package/dist/LinkerPlugin.d.ts +1 -1
  22. package/dist/LinkerPlugin.d.ts.map +1 -1
  23. package/dist/LinkerPlugin.js +2 -2
  24. package/dist/LinkerPlugin.js.map +1 -1
  25. package/dist/MarkdownPlugin.d.ts +1 -1
  26. package/dist/MarkdownPlugin.d.ts.map +1 -1
  27. package/dist/MarkdownPlugin.js +4 -8
  28. package/dist/MarkdownPlugin.js.map +1 -1
  29. package/dist/PandasPlugin.d.ts +1 -1
  30. package/dist/PandasPlugin.d.ts.map +1 -1
  31. package/dist/PandasPlugin.js +4 -8
  32. package/dist/PandasPlugin.js.map +1 -1
  33. package/dist/controls/ControlType.js +0 -6
  34. package/dist/controls/ControlType.js.map +1 -1
  35. package/dist/controls/dropdown-filter/DropdownFilter.js +7 -51
  36. package/dist/controls/dropdown-filter/DropdownFilter.js.map +1 -1
  37. package/dist/controls/input-filter/InputFilter.js +1 -31
  38. package/dist/controls/input-filter/InputFilter.js.map +1 -1
  39. package/dist/controls/markdown/MarkdownContainer.js +0 -3
  40. package/dist/controls/markdown/MarkdownContainer.js.map +1 -1
  41. package/dist/controls/markdown/MarkdownEditor.d.ts +0 -2
  42. package/dist/controls/markdown/MarkdownEditor.d.ts.map +1 -1
  43. package/dist/controls/markdown/MarkdownEditor.js +13 -20
  44. package/dist/controls/markdown/MarkdownEditor.js.map +1 -1
  45. package/dist/controls/markdown/MarkdownStartPage.js +0 -11
  46. package/dist/controls/markdown/MarkdownStartPage.js.map +1 -1
  47. package/dist/controls/markdown/MarkdownUtils.js +0 -7
  48. package/dist/controls/markdown/MarkdownUtils.js.map +1 -1
  49. package/dist/events/ChartEvent.js +0 -5
  50. package/dist/events/ChartEvent.js.map +1 -1
  51. package/dist/events/ConsoleEvent.js +0 -7
  52. package/dist/events/ConsoleEvent.js.map +1 -1
  53. package/dist/events/InputFilterEvent.js +0 -10
  54. package/dist/events/InputFilterEvent.js.map +1 -1
  55. package/dist/events/IrisGridEvent.js +0 -8
  56. package/dist/events/IrisGridEvent.js.map +1 -1
  57. package/dist/events/MarkdownEvent.js.map +1 -1
  58. package/dist/events/NotebookEvent.js +0 -10
  59. package/dist/events/NotebookEvent.js.map +1 -1
  60. package/dist/events/PQEvent.js +0 -5
  61. package/dist/events/PQEvent.js.map +1 -1
  62. package/dist/events/PandasEvent.js +0 -4
  63. package/dist/events/PandasEvent.js.map +1 -1
  64. package/dist/events/TabEvent.js +0 -8
  65. package/dist/events/TabEvent.js.map +1 -1
  66. package/dist/events/index.js.map +1 -1
  67. package/dist/index.js.map +1 -1
  68. package/dist/linker/Linker.d.ts +3 -0
  69. package/dist/linker/Linker.d.ts.map +1 -1
  70. package/dist/linker/Linker.js +70 -119
  71. package/dist/linker/Linker.js.map +1 -1
  72. package/dist/linker/LinkerLink.css +90 -25
  73. package/dist/linker/LinkerLink.css.map +1 -1
  74. package/dist/linker/LinkerLink.d.ts +20 -2
  75. package/dist/linker/LinkerLink.d.ts.map +1 -1
  76. package/dist/linker/LinkerLink.js +214 -23
  77. package/dist/linker/LinkerLink.js.map +1 -1
  78. package/dist/linker/LinkerOverlayContent.css +0 -4
  79. package/dist/linker/LinkerOverlayContent.css.map +1 -1
  80. package/dist/linker/LinkerOverlayContent.d.ts +11 -0
  81. package/dist/linker/LinkerOverlayContent.d.ts.map +1 -1
  82. package/dist/linker/LinkerOverlayContent.js +78 -33
  83. package/dist/linker/LinkerOverlayContent.js.map +1 -1
  84. package/dist/linker/LinkerUtils.d.ts +9 -2
  85. package/dist/linker/LinkerUtils.d.ts.map +1 -1
  86. package/dist/linker/LinkerUtils.js +9 -25
  87. package/dist/linker/LinkerUtils.js.map +1 -1
  88. package/dist/linker/ToolType.js.map +1 -1
  89. package/dist/panels/ChartColumnSelectorOverlay.d.ts +5 -5
  90. package/dist/panels/ChartColumnSelectorOverlay.d.ts.map +1 -1
  91. package/dist/panels/ChartColumnSelectorOverlay.js +4 -7
  92. package/dist/panels/ChartColumnSelectorOverlay.js.map +1 -1
  93. package/dist/panels/ChartFilterOverlay.d.ts +4 -4
  94. package/dist/panels/ChartFilterOverlay.d.ts.map +1 -1
  95. package/dist/panels/ChartFilterOverlay.js +2 -7
  96. package/dist/panels/ChartFilterOverlay.js.map +1 -1
  97. package/dist/panels/ChartPanel.d.ts.map +1 -1
  98. package/dist/panels/ChartPanel.js +11 -150
  99. package/dist/panels/ChartPanel.js.map +1 -1
  100. package/dist/panels/CommandHistoryPanel.d.ts.map +1 -1
  101. package/dist/panels/CommandHistoryPanel.js +1 -26
  102. package/dist/panels/CommandHistoryPanel.js.map +1 -1
  103. package/dist/panels/ConsolePanel.d.ts.map +1 -1
  104. package/dist/panels/ConsolePanel.js +12 -57
  105. package/dist/panels/ConsolePanel.js.map +1 -1
  106. package/dist/panels/DropdownFilterPanel.d.ts.map +1 -1
  107. package/dist/panels/DropdownFilterPanel.js +16 -122
  108. package/dist/panels/DropdownFilterPanel.js.map +1 -1
  109. package/dist/panels/FileExplorerPanel.js +4 -33
  110. package/dist/panels/FileExplorerPanel.js.map +1 -1
  111. package/dist/panels/FilterSetManager.d.ts.map +1 -1
  112. package/dist/panels/FilterSetManager.js +13 -86
  113. package/dist/panels/FilterSetManager.js.map +1 -1
  114. package/dist/panels/FilterSetManagerPanel.js +10 -64
  115. package/dist/panels/FilterSetManagerPanel.js.map +1 -1
  116. package/dist/panels/InputFilterPanel.d.ts.map +1 -1
  117. package/dist/panels/InputFilterPanel.js +8 -38
  118. package/dist/panels/InputFilterPanel.js.map +1 -1
  119. package/dist/panels/IrisGridPanel.d.ts.map +1 -1
  120. package/dist/panels/IrisGridPanel.js +24 -133
  121. package/dist/panels/IrisGridPanel.js.map +1 -1
  122. package/dist/panels/IrisGridPanelTooltip.d.ts +5 -5
  123. package/dist/panels/IrisGridPanelTooltip.d.ts.map +1 -1
  124. package/dist/panels/IrisGridPanelTooltip.js +2 -5
  125. package/dist/panels/IrisGridPanelTooltip.js.map +1 -1
  126. package/dist/panels/LogPanel.js +4 -22
  127. package/dist/panels/LogPanel.js.map +1 -1
  128. package/dist/panels/MarkdownNotebook.js +3 -30
  129. package/dist/panels/MarkdownNotebook.js.map +1 -1
  130. package/dist/panels/MarkdownPanel.js +2 -30
  131. package/dist/panels/MarkdownPanel.js.map +1 -1
  132. package/dist/panels/MockFileStorage.js +1 -14
  133. package/dist/panels/MockFileStorage.js.map +1 -1
  134. package/dist/panels/MockFileStorageTable.js +11 -30
  135. package/dist/panels/MockFileStorageTable.js.map +1 -1
  136. package/dist/panels/NotebookPanel.js +24 -182
  137. package/dist/panels/NotebookPanel.js.map +1 -1
  138. package/dist/panels/PandasPanel.js +1 -20
  139. package/dist/panels/PandasPanel.js.map +1 -1
  140. package/dist/panels/Panel.js +2 -38
  141. package/dist/panels/Panel.js.map +1 -1
  142. package/dist/panels/PanelContextMenu.js +7 -29
  143. package/dist/panels/PanelContextMenu.js.map +1 -1
  144. package/dist/panels/RenameDialog.js +2 -17
  145. package/dist/panels/RenameDialog.js.map +1 -1
  146. package/dist/panels/WidgetPanel.js +2 -20
  147. package/dist/panels/WidgetPanel.js.map +1 -1
  148. package/dist/panels/WidgetPanelTooltip.d.ts +5 -5
  149. package/dist/panels/WidgetPanelTooltip.d.ts.map +1 -1
  150. package/dist/panels/WidgetPanelTooltip.js +2 -4
  151. package/dist/panels/WidgetPanelTooltip.js.map +1 -1
  152. package/dist/panels/index.js.map +1 -1
  153. package/dist/prop-types/CommonPropTypes.js +0 -3
  154. package/dist/prop-types/CommonPropTypes.js.map +1 -1
  155. package/dist/prop-types/UIPropTypes.js.map +1 -1
  156. package/dist/prop-types/index.js.map +1 -1
  157. package/dist/redux/actionTypes.js.map +1 -1
  158. package/dist/redux/actions.js +8 -9
  159. package/dist/redux/actions.js.map +1 -1
  160. package/dist/redux/index.js.map +1 -1
  161. package/dist/redux/reducers/connection.js.map +1 -1
  162. package/dist/redux/reducers/index.js.map +1 -1
  163. package/dist/redux/reducers/sessionWrapper.js.map +1 -1
  164. package/dist/redux/selectors.js +10 -15
  165. package/dist/redux/selectors.js.map +1 -1
  166. package/package.json +21 -20
@@ -1 +1 @@
1
- {"version":3,"file":"Linker.js","names":["React","Component","connect","shortid","memoize","CSSTransition","ThemeExport","LayoutUtils","PanelEvent","DateTimeColumnFormatter","DateUtils","TableUtils","Log","getActiveTool","getTimeZone","setActiveTool","setActiveToolAction","getIsolatedLinkerPanelIdForDashboard","getLinksForDashboard","setDashboardLinks","setDashboardLinksAction","addDashboardLinks","addDashboardLinksAction","deleteDashboardLinks","deleteDashboardLinksAction","setDashboardIsolatedLinkerPanelId","setDashboardIsolatedLinkerPanelIdAction","setDashboardColumnSelectionValidator","setDashboardColumnSelectionValidatorAction","ToolType","ChartEvent","IrisGridEvent","InputFilterEvent","LinkerOverlayContent","LinkerUtils","isLinkablePanel","log","module","mapState","state","ownProps","activeTool","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","handleChartColumnSelect","handleGridColumnSelect","handleUpdateValues","handleStateChange","handleExited","isColumnSelectionValid","componentDidMount","layout","startListening","updateSelectionValidators","componentDidUpdate","prevProps","stopListening","componentDidCatch","error","info","componentWillUnmount","on","eventHub","COLUMN_SELECTED","DATA_SELECTED","STATE_CHANGED","CLONED","COLUMNS_CHANGED","CLOSED","off","DEFAULT","setState","panel","column","columnSelected","debug","isOverlayShown","getIdFromPanel","panelLinks","LINKER","length","columns","linksToDelete","findColumn","deleteLinks","isAlwaysEndPoint","overrideIsolatedLinkerPanelId","panelComponent","getComponentNameFromPanel","name","columnName","type","columnType","newLink","id","generate","isReversed","getLinkType","existingLinkPanelId","panelLinkEnd","addLinks","unsetFilterValueForLink","panelManager","endPanel","getOpenedPanelById","unsetFilterValue","setPanelFilterMap","filterMap","setFilterMap","clearAll","forEach","map","isolatedLinks","linkId","find","l","dataMap","panelFilterMap","Map","i","endPanelId","has","get","isExpandable","isGrouped","value","text","isDateType","dateFilterFormatter","showTimeZone","showTSeparator","defaultDateTimeFormatString","FULL_DATE_FORMAT","format","set","cloneConfig","cloneId","linksToAdd","cloneLinksForPanel","deleteLinksForPanelId","forceUpdate","updateLinkInProgressType","tableColumn","render","isLinkOverlayShown","disabled","linkerOverlayMessage","transitionMs","getCachedLinks"],"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 Log from '@deephaven/log';\nimport {\n getActiveTool,\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} from './LinkerUtils';\n\nconst log = Log.module('Linker');\n\ninterface StateProps {\n activeTool: string;\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 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: setDashboardColumnSelectionValidatorAction,\n});\n\nexport type LinkerProps = OwnProps &\n StateProps &\n ConnectedProps<typeof connector>;\n\nexport type LinkerState = {\n linkInProgress?: Link;\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.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.isColumnSelectionValid = this.isColumnSelectionValid.bind(this);\n\n this.state = { linkInProgress: undefined };\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 }\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.CLOSED, this.handlePanelClosed);\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.CLOSED, this.handlePanelClosed);\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 this.setState({ linkInProgress: undefined });\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 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 { 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 { links } = this.props;\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 'tableLink':\n // No-op\n break;\n }\n\n // Create a completed link from link in progress\n const newLink = {\n start: isReversed !== undefined && isReversed ? end : start,\n end: isReversed !== undefined && isReversed ? start : end,\n id,\n type,\n };\n log.info('creating link', newLink);\n\n this.setState({ linkInProgress: undefined }, () => {\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 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.setState({ linkInProgress: undefined });\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 { 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 } = 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 { isExpandable, isGrouped } = 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({\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 filterMap.set(columnName, {\n columnType,\n text,\n value,\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 handlePanelClosed(panelId: string): void {\n // Delete links on 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 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(\n linkInProgress: Link,\n type: LinkType = 'invalid'\n ): void {\n this.setState({\n linkInProgress: {\n ...linkInProgress,\n type,\n },\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 // Link not started yet - no need to update type\n if (linkInProgress?.start == null) {\n return true;\n }\n\n if (tableColumn == null) {\n // Link started, end point is not a valid target\n this.updateLinkInProgressType(linkInProgress);\n return false;\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(linkInProgress, type);\n\n return type !== 'invalid';\n }\n\n render(): JSX.Element {\n const { links, isolatedLinkerPanelId, panelManager } = this.props;\n const { linkInProgress } = 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. Remove a filter link by clicking again to erase. Click done when finished.'\n : 'Create a link between the source column button and a table column by clicking on one, then the other. Remove the link by clicking it directly. Click done when finished.';\n return (\n <>\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 messageText={linkerOverlayMessage}\n onLinkDeleted={this.handleLinkDeleted}\n onAllLinksDeleted={this.handleAllLinksDeleted}\n onDone={this.handleDone}\n onCancel={this.handleCancel}\n />\n </CSSTransition>\n </>\n );\n }\n}\n\nexport default connector(Linker);\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","getTimeZone","setActiveTool","setActiveToolAction","getIsolatedLinkerPanelIdForDashboard","getLinksForDashboard","setDashboardLinks","setDashboardLinksAction","addDashboardLinks","addDashboardLinksAction","deleteDashboardLinks","deleteDashboardLinksAction","setDashboardIsolatedLinkerPanelId","setDashboardIsolatedLinkerPanelIdAction","setDashboardColumnSelectionValidator","setDashboardColumnSelectionValidatorAction","ToolType","ChartEvent","IrisGridEvent","InputFilterEvent","LinkerOverlayContent","LinkerUtils","isLinkablePanel","log","module","mapState","state","ownProps","activeTool","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","isColumnSelectionValid","selectedIds","Set","componentDidMount","layout","startListening","updateSelectionValidators","componentDidUpdate","prevProps","stopListening","componentDidCatch","error","info","componentWillUnmount","on","eventHub","COLUMN_SELECTED","DATA_SELECTED","STATE_CHANGED","CLONED","COLUMNS_CHANGED","CLOSED","off","DEFAULT","setState","panel","column","columnSelected","debug","isOverlayShown","getIdFromPanel","panelLinks","LINKER","length","columns","linksToDelete","findColumn","deleteLinks","isAlwaysEndPoint","overrideIsolatedLinkerPanelId","panelComponent","getComponentNameFromPanel","name","columnName","type","columnType","newLink","id","generate","isReversed","getLinkType","existingLinkPanelId","panelLinkEnd","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","deleteLinksForPanelId","newLinks","forceUpdate","updateLinkInProgressType","tableColumn","render","isLinkOverlayShown","disabled","linkerOverlayMessage","transitionMs","getCachedLinks"],"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 Log from '@deephaven/log';\nimport { Type as FilterType } from '@deephaven/filters';\nimport {\n getActiveTool,\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} from './LinkerUtils';\n\nconst log = Log.module('Linker');\n\ninterface StateProps {\n activeTool: string;\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 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: 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};\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.isColumnSelectionValid = this.isColumnSelectionValid.bind(this);\n\n this.state = { linkInProgress: undefined, selectedIds: new Set<string>() };\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 }\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.CLOSED, this.handlePanelClosed);\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.CLOSED, this.handlePanelClosed);\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 this.setState({\n linkInProgress: undefined,\n selectedIds: new Set<string>(),\n });\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 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 '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.setState({ linkInProgress: undefined });\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 { 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({\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 handlePanelClosed(panelId: string): void {\n // Delete links on 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(\n linkInProgress: Link,\n type: LinkType = 'invalid'\n ): void {\n this.setState({\n linkInProgress: {\n ...linkInProgress,\n type,\n },\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 // Link not started yet - no need to update type\n if (linkInProgress?.start == null) {\n return true;\n }\n\n if (tableColumn == null) {\n // Link started, end point is not a valid target\n this.updateLinkInProgressType(linkInProgress);\n return false;\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(linkInProgress, type);\n\n return type !== 'invalid';\n }\n\n render(): JSX.Element {\n const { links, isolatedLinkerPanelId, panelManager } = this.props;\n const { linkInProgress, selectedIds } = 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. Remove a filter link by clicking again to erase. Click done when finished.'\n : 'Create a link between the source column button and a table column by clicking on one, then the other. Remove the link by clicking it directly. Click done when finished.';\n\n return (\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 );\n }\n}\n\nexport default connector(Linker);\n"],"mappings":"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"}
@@ -1,72 +1,137 @@
1
1
  /* stylelint-disable scss/at-import-no-partial-leading-underscore */
2
- .linker-overlay svg .link-dot,
3
- .linker-overlay svg .link-triangle {
4
- fill: #4878ea;
2
+ .linker-overlay .linker-link {
3
+ position: absolute;
4
+ width: 100%;
5
+ height: 100%;
6
+ }
7
+ .linker-overlay .linker-link .link-dot,
8
+ .linker-overlay .linker-link .link-triangle {
9
+ fill: #76d9e4;
5
10
  }
6
- .linker-overlay svg path {
11
+ .linker-overlay .linker-link path {
7
12
  stroke-width: 3;
8
13
  fill: transparent;
9
- stroke: #184ece;
14
+ stroke: #3f565c;
10
15
  pointer-events: none;
11
16
  transition: stroke 0.15s ease-out;
12
17
  }
13
- .linker-overlay svg path.link-foreground {
14
- stroke: #4878ea;
18
+ .linker-overlay .linker-link path.link-foreground {
19
+ stroke: #76d9e4;
15
20
  stroke-dasharray: 10;
16
21
  animation: dash-forward 1.5s linear infinite;
17
22
  }
18
- .linker-overlay svg path.link-select {
23
+ .linker-overlay .linker-link path.link-select {
19
24
  stroke-width: 20;
20
25
  fill: transparent;
21
26
  stroke: transparent;
22
27
  pointer-events: stroke;
23
28
  cursor: pointer;
24
29
  }
25
- .linker-overlay svg .link-filter-source .link-dot,
26
- .linker-overlay svg .link-filter-source .link-triangle {
30
+ .linker-overlay .linker-link.link-is-selected {
31
+ z-index: 20;
32
+ }
33
+ .linker-overlay .linker-link.link-is-selected .link-dot,
34
+ .linker-overlay .linker-link.link-is-selected .link-triangle {
35
+ fill: #4878ea;
36
+ }
37
+ .linker-overlay .linker-link.link-is-selected path {
38
+ stroke-width: 3;
39
+ stroke: #184ece;
40
+ }
41
+ .linker-overlay .linker-link.link-is-selected path.link-select {
42
+ stroke-width: 20;
43
+ stroke: transparent;
44
+ }
45
+ .linker-overlay .linker-link.link-is-selected path.link-foreground {
46
+ stroke: #4878ea;
47
+ }
48
+ .linker-overlay .linker-link.link-filter-source .link-dot,
49
+ .linker-overlay .linker-link.link-filter-source .link-triangle {
27
50
  fill: #aa9af4;
28
51
  }
29
- .linker-overlay svg .link-filter-source path {
52
+ .linker-overlay .linker-link.link-filter-source path {
30
53
  stroke-width: 3;
31
54
  stroke: #4c4660;
32
55
  }
33
- .linker-overlay svg .link-filter-source path.link-select {
56
+ .linker-overlay .linker-link.link-filter-source path.link-select {
34
57
  stroke-width: 20;
35
58
  stroke: transparent;
36
59
  }
37
- .linker-overlay svg .link-filter-source path.link-foreground {
60
+ .linker-overlay .linker-link.link-filter-source path.link-foreground {
38
61
  stroke: #aa9af4;
39
62
  }
40
- .linker-overlay svg .link-invalid .link-dot,
41
- .linker-overlay svg .link-invalid .link-triangle {
63
+ .linker-overlay .linker-link.link-invalid .link-dot,
64
+ .linker-overlay .linker-link.link-invalid .link-triangle {
42
65
  fill: #c0bfbf;
43
66
  }
44
- .linker-overlay svg .link-invalid path {
67
+ .linker-overlay .linker-link.link-invalid path {
45
68
  stroke-width: 3;
46
69
  stroke: #403e41;
47
70
  }
48
- .linker-overlay svg .link-invalid path.link-select {
71
+ .linker-overlay .linker-link.link-invalid path.link-select {
49
72
  stroke-width: 20;
50
73
  stroke: transparent;
51
74
  }
52
- .linker-overlay svg .link-invalid path.link-foreground {
75
+ .linker-overlay .linker-link.link-invalid path.link-foreground {
53
76
  stroke: #c0bfbf;
54
77
  }
55
- .linker-overlay svg .disabled path.link-select {
78
+ .linker-overlay .linker-link.disabled path.link-select {
56
79
  pointer-events: none;
57
80
  }
58
- .linker-overlay svg path.link-select:hover ~ path.link-background {
81
+ .linker-overlay .linker-link.hovering {
82
+ z-index: 10;
83
+ }
84
+ .linker-overlay .linker-link path.link-select:hover ~ path.link-background {
85
+ stroke: #235de6;
86
+ }
87
+ .linker-overlay .linker-link path.link-select:hover ~ path.link-foreground,
88
+ .linker-overlay .linker-link path.link-select:hover ~ .link-dot,
89
+ .linker-overlay .linker-link path.link-select:hover ~ .link-triangle {
90
+ stroke: #4878ea;
91
+ }
92
+ .linker-overlay .linker-link path.link-select:hover ~ .link-dot,
93
+ .linker-overlay .linker-link path.link-select:hover ~ .link-triangle {
94
+ fill: #4878ea;
95
+ }
96
+ .linker-overlay .linker-link.danger-delete path.link-select:hover ~ path.link-background {
59
97
  stroke: #603744;
60
98
  }
61
- .linker-overlay svg path.link-select:hover ~ path.link-foreground,
62
- .linker-overlay svg path.link-select:hover ~ .link-dot,
63
- .linker-overlay svg path.link-select:hover ~ .link-triangle {
99
+ .linker-overlay .linker-link.danger-delete path.link-select:hover ~ path.link-foreground,
100
+ .linker-overlay .linker-link.danger-delete path.link-select:hover ~ .link-dot,
101
+ .linker-overlay .linker-link.danger-delete path.link-select:hover ~ .link-triangle {
64
102
  stroke: #f95d84;
65
103
  }
66
- .linker-overlay svg path.link-select:hover ~ .link-dot,
67
- .linker-overlay svg path.link-select:hover ~ .link-triangle {
104
+ .linker-overlay .linker-link.danger-delete path.link-select:hover ~ .link-dot,
105
+ .linker-overlay .linker-link.danger-delete path.link-select:hover ~ .link-triangle {
68
106
  fill: #f95d84;
69
107
  }
108
+ .linker-overlay .btn-fab {
109
+ position: absolute;
110
+ display: flex;
111
+ justify-content: center;
112
+ align-items: center;
113
+ pointer-events: all;
114
+ min-width: calc(1.5em + 0.75rem + 2px);
115
+ min-height: calc(1.5em + 0.75rem + 2px);
116
+ height: calc(1.5em + 0.75rem + 2px);
117
+ width: calc(1.5em + 0.75rem + 2px);
118
+ line-height: 1.25rem;
119
+ padding: 0;
120
+ margin: 0;
121
+ z-index: 30;
122
+ box-shadow: 0 0.1rem 1rem rgba(26, 23, 26, 0.45);
123
+ }
124
+ .linker-overlay .btn-fab .fa-layers {
125
+ display: inline-flex;
126
+ justify-content: center;
127
+ }
128
+ .linker-overlay .btn-fab .fa-layers b {
129
+ font-size: 1.25rem;
130
+ }
131
+ .linker-overlay .btn-fab.btn-delete:hover {
132
+ background-color: #f95d84;
133
+ border-color: #f95d84;
134
+ }
70
135
 
71
136
  @keyframes dash-forward {
72
137
  to {
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../../../../node_modules/@deephaven/components/scss/custom.scss","../../src/linker/LinkerLink.scss","../../../../node_modules/@deephaven/components/scss/bootstrap_overrides.scss"],"names":[],"mappings":"AAAA;ACeE;AAAA;EAEE,MCLY;;ADQd;EACE,cAnBS;EAoBT;EACA,QCkCY;EDjCZ;EACA;;AAGF;EACE,QCjBY;EDkBZ,kBAlBQ;EAmBR;;AAGF;EACE,cAhCe;EAiCf;EACA;EACA;EACA;;AAIA;AAAA;EAEE,MCrCG;;ADuCL;EACE,cA9CO;EA+CP,QA1CuB;;AA2CvB;EACE,cAhDW;EAiDX;;AAIJ;EACE,QCjDG;;ADsDL;AAAA;EAEE,MC5CK;;AD8CP;EACE,cAjEO;EAkEP,QC5CK;;AD6CL;EACE,cAnEW;EAoEX;;AAIJ;EACE,QCxDK;;AD4DT;EACE;;AAGF;EACE,QA1EkB;;AA6EpB;AAAA;AAAA;EAGE,QCxFE;;AD2FJ;AAAA;EAEE,MC7FE;;;ADiGN;EACE;IACE","file":"LinkerLink.css","sourcesContent":["/* stylelint-disable scss/at-import-no-partial-leading-underscore */\n// Consumers should be able to resolve bootstrap/ to node_modules/bootstrap\n\n//Make bootstrap functions available for use in overrides\n@import 'bootstrap/scss/_functions.scss';\n@import './bootstrap_overrides.scss';\n\n//_variable imports come after bootstrap default overrides,\n// makes all other variables and mixins from bootstrap available\n/// with just importing customer.scss\n@import 'bootstrap/scss/_variables.scss';\n@import 'bootstrap/scss/_mixins.scss';\n\n//New variables come after imports\n@import './new_variables.scss';\n","@import '@deephaven/components/scss/custom.scss';\n\n$link-width: 3;\n$selectable-width: 20;\n$dash-color-1: $primary;\n$dash-color-2: $primary-light;\n$filter-source-dash-color-1: $purple;\n$filter-source-dash-color-2: mix($purple, $content-bg, 25%);\n$invalid-dash-color-1: $gray-300;\n$invalid-dash-color-2: $gray-700;\n$dash-delete-color-1: $danger;\n$dash-delete-color-2: mix($danger, $content-bg, 25%);\n$dash-size: 10;\n\n.linker-overlay svg {\n .link-dot,\n .link-triangle {\n fill: $dash-color-1;\n }\n\n path {\n stroke-width: $link-width;\n fill: transparent;\n stroke: $dash-color-2;\n pointer-events: none;\n transition: stroke $transition ease-out;\n }\n\n path.link-foreground {\n stroke: $dash-color-1;\n stroke-dasharray: $dash-size;\n animation: dash-forward 1.5s linear infinite;\n }\n\n path.link-select {\n stroke-width: $selectable-width;\n fill: transparent;\n stroke: transparent;\n pointer-events: stroke;\n cursor: pointer;\n }\n\n .link-filter-source {\n .link-dot,\n .link-triangle {\n fill: $filter-source-dash-color-1;\n }\n path {\n stroke-width: $link-width;\n stroke: $filter-source-dash-color-2;\n &.link-select {\n stroke-width: $selectable-width;\n stroke: transparent;\n }\n }\n\n path.link-foreground {\n stroke: $filter-source-dash-color-1;\n }\n }\n\n .link-invalid {\n .link-dot,\n .link-triangle {\n fill: $invalid-dash-color-1;\n }\n path {\n stroke-width: $link-width;\n stroke: $invalid-dash-color-2;\n &.link-select {\n stroke-width: $selectable-width;\n stroke: transparent;\n }\n }\n\n path.link-foreground {\n stroke: $invalid-dash-color-1;\n }\n }\n\n .disabled path.link-select {\n pointer-events: none;\n }\n\n path.link-select:hover ~ path.link-background {\n stroke: $dash-delete-color-2;\n }\n\n path.link-select:hover ~ path.link-foreground,\n path.link-select:hover ~ .link-dot,\n path.link-select:hover ~ .link-triangle {\n stroke: $dash-delete-color-1;\n }\n\n path.link-select:hover ~ .link-dot,\n path.link-select:hover ~ .link-triangle {\n fill: $dash-delete-color-1;\n }\n}\n\n@keyframes dash-forward {\n to {\n stroke-dashoffset: $dash-size * -2;\n }\n}\n","// Styling overrides for bootstrap\n\n// Override / set color variables\n$red: #f95d84;\n$orange: #f37e3f;\n$yellow: #fcd65b;\n$green: #9edc6f;\n$blue: #76d9e4;\n$purple: #aa9af4;\n\n//Define some UI colors\n$interfacegray: #2d2a2e;\n$interfaceblue: #4878ea;\n$interfacewhite: #f0f0ee; //same as gray-200\n$interfaceblack: #1a171a;\n\n//Define our Gray scale\n$white: $interfacewhite;\n$gray-100: #fcfcfa;\n$gray-200: $interfacewhite;\n$gray-300: #c0bfbf;\n$gray-400: #929192;\n$gray-500: #5b5a5c;\n$gray-600: #555356;\n$gray-700: #403e41;\n$gray-800: #373438;\n$gray-850: #322f33;\n$gray-900: #211f22;\n$black: $interfaceblack;\n$content-bg: $interfacegray;\n$background: $interfaceblack;\n$foreground: $interfacewhite;\n\n//Load colors into map\n$colors: ();\n$colors: map-merge(\n (\n 'red': $red,\n 'orange': $orange,\n 'yellow': $yellow,\n 'green': $green,\n 'blue': $blue,\n 'purple': $purple,\n 'white': $white,\n 'black': $black,\n ),\n $colors\n);\n\n//Set default colors\n$body-bg: $black;\n$body-color: $interfacewhite;\n\n// Set brand colors\n$primary: $interfaceblue;\n$primary-hover: darken($primary, 8%);\n$primary-dark: mix($primary, $content-bg, 25%);\n$primary-light: scale-color($primary, $lightness: -25%);\n$secondary: $gray-500;\n$secondary-hover: darken($secondary, 8%);\n$success: $green;\n$info: $yellow;\n$warning: $orange;\n$danger: $red;\n$danger-hover: darken($danger, 8%);\n$light: $gray-100;\n$mid: $gray-400; //Added a mid color, useful for input styling\n$dark: $gray-800;\n$green-dark: scale-color($green, $lightness: -45%, $saturation: -10%);\n\n$theme-colors: () !default;\n$theme-colors: map-merge(\n (\n 'primary': $primary,\n 'primary-hover': $primary-hover,\n 'primary-light': $primary-light,\n 'primary-dark': $primary-dark,\n 'secondary': $secondary,\n 'success': $success,\n 'info': $info,\n 'warning': $warning,\n 'danger': $danger,\n 'light': $light,\n 'dark': $dark,\n 'mid': $mid,\n 'content-bg': $interfacegray,\n 'background': $interfaceblack,\n 'foreground': $interfacewhite,\n ),\n $theme-colors\n);\n\n$component-active-bg: $primary;\n$theme-color-interval: 9%;\n$yiq-contrasted-threshold: 180;\n\n// Override fonts\n$font-family-sans-serif: 'Fira Sans', -apple-system, blinkmacsystemfont,\n 'Segoe UI', 'Roboto', 'Helvetica Neue', arial, sans-serif; //fira sans then native system ui fallbacks\n$font-family-monospace: 'Fira Mono', menlo, monaco, consolas, 'Liberation Mono',\n 'Courier New', monospace;\n$font-family-base: $font-family-sans-serif;\n\n$headings-font-weight: 400;\n\n//Text overides\n$text-muted: $gray-400;\n\n//Style Selection highlight color\n//so browsers add alpha to your color by default, ignoring opacity 1\n//by setting rgba with 0.99 it tricks browser into thinking there is alpha applied\n$text-select-color: $primary-hover;\n$text-select-color-editor: lighten(\n $gray-700,\n 15%\n); //we lighten it abit to account for that 0.01 loss, and because it needs some anyways.\n\n//Grid variables, same value as default just making easily accessible\n$grid-gutter-width: 30px;\n\n//Visual Overrides\n$border-radius: 4px;\n$box-shadow: 0 0.1rem 1rem rgba($black, 45%); //because our UI is so dark, we need darker default shadows\n$box-shadow-900: 0 0.1rem 1rem rgba(0, 0, 0, 45%); //darkest shadow for $black popups over $black UI\n\n//Override Btn\n$btn-border-radius: 4rem;\n$btn-padding-x: 1.5rem;\n$btn-transition: color 0.12s ease-in-out, background-color 0.12s ease-in-out,\n border-color 0.12s ease-in-out, box-shadow 0.12s ease-in-out; //default 0.15 is too long\n$btn-border-width: 2px;\n\n//Override Inputs\n$input-bg: $gray-600;\n$input-disabled-bg: $gray-800;\n$input-color: $foreground;\n$input-border-color: $gray-400;\n$input-placeholder-color: $gray-400;\n$input-focus-border-color: rgba($primary, 85%);\n\n$input-btn-focus-width: 0.2rem;\n$input-btn-focus-color: rgba($component-active-bg, 35%);\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color;\n\n//checkbox\n$custom-control-indicator-bg: $gray-600;\n$custom-control-indicator-bg-size: 75% 75%;\n$custom-control-indicator-disabled-bg: $gray-800;\n$custom-control-indicator-checked-disabled-bg: $gray-800;\n$custom-control-label-disabled-color: $gray-400;\n\n//Custom Select\n$custom-select-indicator-color: $gray-400;\n$custom-select-bg-size: 16px 16px;\n//dhSort icon encoded\n$custom-select-indicator: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M4 7l-.4-.8 4-3.7h.8l4 3.7-.4.8H4zm0 2l-.4.8 4 3.7h.8l4-3.7L12 9H4z'/%3E%3C/svg%3E\"),\n '#',\n '%23'\n);\n$custom-select-focus-box-shadow: $input-btn-focus-box-shadow;\n$custom-select-disabled-color: darken($gray-400, 5%);\n$custom-select-disabled-bg: $gray-800;\n\n//modal\n$modal-content-bg: $gray-200;\n$modal-content-border-width: 0;\n$modal-md: 550px;\n\n// Toast notification\n$toast-bg: $primary-dark;\n$toast-color: $foreground;\n$toast-error-bg: mix($danger, $content-bg, 15%);\n$toast-error-color: $foreground;\n\n//tooltips\n$tooltip-bg: $gray-700;\n$tooltip-color: $foreground;\n$tooltip-box-shadow: 0 0.1rem 1.5rem 0.1rem rgba($black, 80%);\n\n//drowdowns\n$dropdown-bg: $gray-600;\n$dropdown-link-color: $foreground;\n$dropdown-link-hover-color: $foreground;\n$dropdown-link-hover-bg: $primary;\n$dropdown-divider-bg: $gray-700;\n\n//context menus\n$contextmenu-bg: $gray-600;\n$contextmenu-color: $foreground;\n$contextmenu-disabled-color: $text-muted;\n$contextmenu-keyboard-selected-bg: rgba($primary, 50%);\n$contextmenu-selected-bg: $primary;\n$contextmenu-selected-color: $foreground;\n\n//links\n$link-color: $gray-400;\n$link-hover-color: $foreground;\n\n//progress-bar\n$progress-bg: $gray-600;\n$progress-border-radius: 1rem;\n\n// Set global options\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-print-styles: false; //I don't think anyone should expect to \"print\" this app.\n\n// Transition times\n$transition: 0.15s;\n$transition-mid: 0.2s;\n$transition-long: 0.3s;\n$transition-slow: 0.6s;\n\n//form-validation icon, uses vsWarning icon encoded here as svg\n$form-feedback-icon-invalid-color: theme-color('danger');\n$form-feedback-icon-invalid: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cg fill='none'%3E%3Cg fill='#{$form-feedback-icon-invalid-color}'%3E%3Cpath d='M7.56 1h.88l6.54 12.26-.44.74H1.44L1 13.26 7.56 1zM8 2.28 2.28 13H13.7L8 2.28zM8.625 12v-1h-1.25v1h1.25zm-1.25-2V6h1.25v4h-1.25z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E \"),\n '#',\n '%23'\n);\n"]}
1
+ {"version":3,"sourceRoot":"","sources":["../../../../node_modules/@deephaven/components/scss/custom.scss","../../src/linker/LinkerLink.scss","../../../../node_modules/@deephaven/components/scss/bootstrap_overrides.scss","../../../../node_modules/bootstrap/scss/_variables.scss"],"names":[],"mappings":"AAAA;ACeE;EACE;EACA;EACA;;AAEA;AAAA;EAEE,MCfC;;ADkBH;EACE,cAxBO;EAyBP;EACA,QAvBS;EAwBT;EACA;;AAGF;EACE,QC3BC;ED4BD,kBAvBM;EAwBN;;AAGF;EACE,cArCa;EAsCb;EACA;EACA;EACA;;AAGF;EACE;;AAEA;AAAA;EAEE,MCxCQ;;AD0CV;EACE,cArDK;EAsDL,QCCQ;;ADAR;EACE,cAvDS;EAwDT;;AAIJ;EACE,QCpDQ;;ADyDV;AAAA;EAEE,MC/DC;;ADiEH;EACE,cAxEK;EAyEL,QApEqB;;AAqErB;EACE,cA1ES;EA2ET;;AAIJ;EACE,QC3EC;;ADgFH;AAAA;EAEE,MCtEG;;ADwEL;EACE,cA3FK;EA4FL,QCtEG;;ADuEH;EACE,cA7FS;EA8FT;;AAIJ;EACE,QClFG;;ADsFP;EACE;;AAGF;EACE;;AAGF;EACE,QC5DU;;AD+DZ;AAAA;AAAA;EAGE,QC7GU;;ADgHZ;AAAA;EAEE,MClHU;;ADsHV;EACE,QAxHc;;AA2HhB;AAAA;AAAA;EAGE,QCtIF;;ADyIA;AAAA;EAEE,MC3IF;;ADgJJ;EACE;EACA;EACA;EACA;EACA;EACA,WE2VoC;EF1VpC,YE0VoC;EFzVpC,QEyVoC;EFxVpC,OEwVoC;EFvVpC,aE8H0B;EF7H1B;EACA;EACA;EACA,YCvCS;;ADwCT;EACE;EACA;;AACA;EAEE,WEoHsB;;AF/G5B;EACE,kBC1KE;ED2KF,cC3KE;;;AD+KN;EACE;IACE","file":"LinkerLink.css","sourcesContent":["/* stylelint-disable scss/at-import-no-partial-leading-underscore */\n// Consumers should be able to resolve bootstrap/ to node_modules/bootstrap\n\n//Make bootstrap functions available for use in overrides\n@import 'bootstrap/scss/_functions.scss';\n@import './bootstrap_overrides.scss';\n\n//_variable imports come after bootstrap default overrides,\n// makes all other variables and mixins from bootstrap available\n/// with just importing customer.scss\n@import 'bootstrap/scss/_variables.scss';\n@import 'bootstrap/scss/_mixins.scss';\n\n//New variables come after imports\n@import './new_variables.scss';\n","@import '@deephaven/components/scss/custom.scss';\n\n$link-width: 3;\n$selectable-width: 20;\n$dash-color-1: $blue;\n$dash-color-2: mix($blue, $content-bg, 25%);\n$filter-source-dash-color-1: $purple;\n$filter-source-dash-color-2: mix($purple, $content-bg, 25%);\n$invalid-dash-color-1: $gray-300;\n$invalid-dash-color-2: $gray-700;\n$dash-delete-color-1: $danger;\n$dash-delete-color-2: mix($danger, $content-bg, 25%);\n$dash-size: 10;\n\n.linker-overlay {\n .linker-link {\n position: absolute;\n width: 100%;\n height: 100%;\n\n .link-dot,\n .link-triangle {\n fill: $dash-color-1;\n }\n\n path {\n stroke-width: $link-width;\n fill: transparent;\n stroke: $dash-color-2;\n pointer-events: none;\n transition: stroke $transition ease-out;\n }\n\n path.link-foreground {\n stroke: $dash-color-1;\n stroke-dasharray: $dash-size;\n animation: dash-forward 1.5s linear infinite;\n }\n\n path.link-select {\n stroke-width: $selectable-width;\n fill: transparent;\n stroke: transparent;\n pointer-events: stroke;\n cursor: pointer;\n }\n\n &.link-is-selected {\n z-index: 20;\n\n .link-dot,\n .link-triangle {\n fill: $primary;\n }\n path {\n stroke-width: $link-width;\n stroke: $primary-light;\n &.link-select {\n stroke-width: $selectable-width;\n stroke: transparent;\n }\n }\n\n path.link-foreground {\n stroke: $primary;\n }\n }\n\n &.link-filter-source {\n .link-dot,\n .link-triangle {\n fill: $filter-source-dash-color-1;\n }\n path {\n stroke-width: $link-width;\n stroke: $filter-source-dash-color-2;\n &.link-select {\n stroke-width: $selectable-width;\n stroke: transparent;\n }\n }\n\n path.link-foreground {\n stroke: $filter-source-dash-color-1;\n }\n }\n\n &.link-invalid {\n .link-dot,\n .link-triangle {\n fill: $invalid-dash-color-1;\n }\n path {\n stroke-width: $link-width;\n stroke: $invalid-dash-color-2;\n &.link-select {\n stroke-width: $selectable-width;\n stroke: transparent;\n }\n }\n\n path.link-foreground {\n stroke: $invalid-dash-color-1;\n }\n }\n\n &.disabled path.link-select {\n pointer-events: none;\n }\n\n &.hovering {\n z-index: 10;\n }\n\n path.link-select:hover ~ path.link-background {\n stroke: $primary-hover;\n }\n\n path.link-select:hover ~ path.link-foreground,\n path.link-select:hover ~ .link-dot,\n path.link-select:hover ~ .link-triangle {\n stroke: $primary;\n }\n\n path.link-select:hover ~ .link-dot,\n path.link-select:hover ~ .link-triangle {\n fill: $primary;\n }\n\n &.danger-delete {\n path.link-select:hover ~ path.link-background {\n stroke: $dash-delete-color-2;\n }\n\n path.link-select:hover ~ path.link-foreground,\n path.link-select:hover ~ .link-dot,\n path.link-select:hover ~ .link-triangle {\n stroke: $dash-delete-color-1;\n }\n\n path.link-select:hover ~ .link-dot,\n path.link-select:hover ~ .link-triangle {\n fill: $dash-delete-color-1;\n }\n }\n }\n\n .btn-fab {\n position: absolute;\n display: flex;\n justify-content: center;\n align-items: center;\n pointer-events: all;\n min-width: $input-height;\n min-height: $input-height;\n height: $input-height;\n width: $input-height;\n line-height: $font-size-lg; // vertical centering for text inside fa-layer\n padding: 0;\n margin: 0;\n z-index: 30;\n box-shadow: $box-shadow;\n .fa-layers {\n display: inline-flex;\n justify-content: center;\n b {\n // comparison operator\n font-size: $font-size-lg;\n }\n }\n }\n\n .btn-fab.btn-delete:hover {\n background-color: $dash-delete-color-1;\n border-color: $dash-delete-color-1;\n }\n}\n\n@keyframes dash-forward {\n to {\n stroke-dashoffset: $dash-size * -2;\n }\n}\n","// Styling overrides for bootstrap\n\n// Override / set color variables\n$red: #f95d84;\n$orange: #f37e3f;\n$yellow: #fcd65b;\n$green: #9edc6f;\n$blue: #76d9e4;\n$purple: #aa9af4;\n\n//Define some UI colors\n$interfacegray: #2d2a2e;\n$interfaceblue: #4878ea;\n$interfacewhite: #f0f0ee; //same as gray-200\n$interfaceblack: #1a171a;\n\n//Define our Gray scale\n$white: $interfacewhite;\n$gray-100: #fcfcfa;\n$gray-200: $interfacewhite;\n$gray-300: #c0bfbf;\n$gray-400: #929192;\n$gray-500: #5b5a5c;\n$gray-600: #555356;\n$gray-700: #403e41;\n$gray-800: #373438;\n$gray-850: #322f33;\n$gray-900: #211f22;\n$black: $interfaceblack;\n$content-bg: $interfacegray;\n$background: $interfaceblack;\n$foreground: $interfacewhite;\n\n//Load colors into map\n$colors: ();\n$colors: map-merge(\n (\n 'red': $red,\n 'orange': $orange,\n 'yellow': $yellow,\n 'green': $green,\n 'blue': $blue,\n 'purple': $purple,\n 'white': $white,\n 'black': $black,\n ),\n $colors\n);\n\n//Set default colors\n$body-bg: $black;\n$body-color: $interfacewhite;\n\n// Set brand colors\n$primary: $interfaceblue;\n$primary-hover: darken($primary, 8%);\n$primary-dark: mix($primary, $content-bg, 25%);\n$primary-light: scale-color($primary, $lightness: -25%);\n$secondary: $gray-500;\n$secondary-hover: darken($secondary, 8%);\n$success: $green;\n$info: $yellow;\n$warning: $orange;\n$danger: $red;\n$danger-hover: darken($danger, 8%);\n$light: $gray-100;\n$mid: $gray-400; //Added a mid color, useful for input styling\n$dark: $gray-800;\n$green-dark: scale-color($green, $lightness: -45%, $saturation: -10%);\n\n$theme-colors: () !default;\n$theme-colors: map-merge(\n (\n 'primary': $primary,\n 'primary-hover': $primary-hover,\n 'primary-light': $primary-light,\n 'primary-dark': $primary-dark,\n 'secondary': $secondary,\n 'success': $success,\n 'info': $info,\n 'warning': $warning,\n 'danger': $danger,\n 'light': $light,\n 'dark': $dark,\n 'mid': $mid,\n 'content-bg': $interfacegray,\n 'background': $interfaceblack,\n 'foreground': $interfacewhite,\n ),\n $theme-colors\n);\n\n$component-active-bg: $primary;\n$theme-color-interval: 9%;\n$yiq-contrasted-threshold: 180;\n\n// Override fonts\n$font-family-sans-serif: 'Fira Sans', -apple-system, blinkmacsystemfont,\n 'Segoe UI', 'Roboto', 'Helvetica Neue', arial, sans-serif; //fira sans then native system ui fallbacks\n$font-family-monospace: 'Fira Mono', menlo, monaco, consolas, 'Liberation Mono',\n 'Courier New', monospace;\n$font-family-base: $font-family-sans-serif;\n\n$headings-font-weight: 400;\n\n//Text overides\n$text-muted: $gray-400;\n\n//Style Selection highlight color\n//so browsers add alpha to your color by default, ignoring opacity 1\n//by setting rgba with 0.99 it tricks browser into thinking there is alpha applied\n$text-select-color: $primary-hover;\n$text-select-color-editor: lighten(\n $gray-700,\n 15%\n); //we lighten it abit to account for that 0.01 loss, and because it needs some anyways.\n\n//Grid variables, same value as default just making easily accessible\n$grid-gutter-width: 30px;\n\n//Visual Overrides\n$border-radius: 4px;\n$box-shadow: 0 0.1rem 1rem rgba($black, 45%); //because our UI is so dark, we need darker default shadows\n$box-shadow-900: 0 0.1rem 1rem rgba(0, 0, 0, 45%); //darkest shadow for $black popups over $black UI\n\n//Override Btn\n$btn-border-radius: 4rem;\n$btn-padding-x: 1.5rem;\n$btn-transition: color 0.12s ease-in-out, background-color 0.12s ease-in-out,\n border-color 0.12s ease-in-out, box-shadow 0.12s ease-in-out; //default 0.15 is too long\n$btn-border-width: 2px;\n\n//Override Inputs\n$input-bg: $gray-600;\n$input-disabled-bg: $gray-800;\n$input-color: $foreground;\n$input-border-color: $gray-400;\n$input-placeholder-color: $gray-400;\n$input-focus-border-color: rgba($primary, 85%);\n\n$input-btn-focus-width: 0.2rem;\n$input-btn-focus-color: rgba($component-active-bg, 35%);\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color;\n\n//checkbox\n$custom-control-indicator-bg: $gray-600;\n$custom-control-indicator-bg-size: 75% 75%;\n$custom-control-indicator-disabled-bg: $gray-800;\n$custom-control-indicator-checked-disabled-bg: $gray-800;\n$custom-control-label-disabled-color: $gray-400;\n\n//Custom Select\n$custom-select-indicator-color: $gray-400;\n$custom-select-bg-size: 16px 16px;\n//dhSort icon encoded\n$custom-select-indicator: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M4 7l-.4-.8 4-3.7h.8l4 3.7-.4.8H4zm0 2l-.4.8 4 3.7h.8l4-3.7L12 9H4z'/%3E%3C/svg%3E\"),\n '#',\n '%23'\n);\n$custom-select-focus-box-shadow: $input-btn-focus-box-shadow;\n$custom-select-disabled-color: darken($gray-400, 5%);\n$custom-select-disabled-bg: $gray-800;\n\n//modal\n$modal-content-bg: $gray-200;\n$modal-content-border-width: 0;\n$modal-md: 550px;\n\n// Toast notification\n$toast-bg: $primary-dark;\n$toast-color: $foreground;\n$toast-error-bg: mix($danger, $content-bg, 15%);\n$toast-error-color: $foreground;\n\n//tooltips\n$tooltip-bg: $gray-700;\n$tooltip-color: $foreground;\n$tooltip-box-shadow: 0 0.1rem 1.5rem 0.1rem rgba($black, 80%);\n\n//drowdowns\n$dropdown-bg: $gray-600;\n$dropdown-link-color: $foreground;\n$dropdown-link-hover-color: $foreground;\n$dropdown-link-hover-bg: $primary;\n$dropdown-divider-bg: $gray-700;\n\n//context menus\n$contextmenu-bg: $gray-600;\n$contextmenu-color: $foreground;\n$contextmenu-disabled-color: $text-muted;\n$contextmenu-keyboard-selected-bg: rgba($primary, 50%);\n$contextmenu-selected-bg: $primary;\n$contextmenu-selected-color: $foreground;\n\n//links\n$link-color: $gray-400;\n$link-hover-color: $foreground;\n\n//progress-bar\n$progress-bg: $gray-600;\n$progress-border-radius: 1rem;\n\n// Set global options\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-print-styles: false; //I don't think anyone should expect to \"print\" this app.\n\n// Transition times\n$transition: 0.15s;\n$transition-mid: 0.2s;\n$transition-long: 0.3s;\n$transition-slow: 0.6s;\n\n//form-validation icon, uses vsWarning icon encoded here as svg\n$form-feedback-icon-invalid-color: theme-color('danger');\n$form-feedback-icon-invalid: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cg fill='none'%3E%3Cg fill='#{$form-feedback-icon-invalid-color}'%3E%3Cpath d='M7.56 1h.88l6.54 12.26-.44.74H1.44L1 13.26 7.56 1zM8 2.28 2.28 13H13.7L8 2.28zM8.625 12v-1h-1.25v1h1.25zm-1.25-2V6h1.25v4h-1.25z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E \"),\n '#',\n '%23'\n);\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n\n$grays: () !default;\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n$blue: #007bff !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #e83e8c !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #28a745 !default;\n$teal: #20c997 !default;\n$cyan: #17a2b8 !default;\n\n$colors: () !default;\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-800 !default;\n\n$theme-colors: () !default;\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 150 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $gray-900 !default;\n$yiq-text-light: $white !default;\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-prefers-reduced-motion-media-query: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-pointer-cursor-for-buttons: true !default;\n$enable-print-styles: true !default;\n$enable-responsive-font-sizes: false !default;\n$enable-validation-icons: true !default;\n$enable-deprecation-messages: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1rem !default;\n$spacers: () !default;\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n\n// Body\n//\n// Settings for the `<body>` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"primary\") !default;\n$link-decoration: none !default;\n$link-hover-color: darken($link-color, 15%) !default;\n$link-hover-decoration: underline !default;\n// Darken percentage for links with `.text-*` class (e.g. `.text-success`)\n$emphasized-link-hover-darken-percentage: 15% !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px\n) !default;\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px\n) !default;\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 30px !default;\n$grid-row-columns: 6 !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: 1.5 !default;\n$line-height-sm: 1.5 !default;\n\n$border-width: 1px !default;\n$border-color: $gray-300 !default;\n\n$border-radius: .25rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$rounded-pill: 50rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"primary\") !default;\n\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n$transition-collapse-width: width .35s ease !default;\n\n$embed-responsive-aspect-ratios: () !default;\n$embed-responsive-aspect-ratios: join(\n (\n (21 9),\n (16 9),\n (4 3),\n (1 1),\n ),\n $embed-responsive-aspect-ratios\n);\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: $font-size-base * 1.25 !default;\n$font-size-sm: $font-size-base * .875 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.5 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: null !default;\n\n$display1-size: 6rem !default;\n$display2-size: 5.5rem !default;\n$display3-size: 4.5rem !default;\n$display4-size: 3.5rem !default;\n\n$display1-weight: 300 !default;\n$display2-weight: 300 !default;\n$display3-weight: 300 !default;\n$display4-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$text-muted: $gray-600 !default;\n\n$blockquote-small-color: $gray-600 !default;\n$blockquote-small-font-size: $small-font-size !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n\n$hr-border-color: rgba($black, .1) !default;\n$hr-border-width: $border-width !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: inset 0 -.1rem 0 rgba($black, .25) !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-bg: #fcf8e3 !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .75rem !default;\n$table-cell-padding-sm: .3rem !default;\n\n$table-color: $body-color !default;\n$table-bg: null !default;\n$table-accent-bg: rgba($black, .05) !default;\n$table-hover-color: $table-color !default;\n$table-hover-bg: rgba($black, .075) !default;\n$table-active-bg: $table-hover-bg !default;\n\n$table-border-width: $border-width !default;\n$table-border-color: $border-color !default;\n\n$table-head-bg: $gray-200 !default;\n$table-head-color: $gray-700 !default;\n$table-th-font-weight: null !default;\n\n$table-dark-color: $white !default;\n$table-dark-bg: $gray-800 !default;\n$table-dark-accent-bg: rgba($white, .05) !default;\n$table-dark-hover-color: $table-dark-color !default;\n$table-dark-hover-bg: rgba($white, .075) !default;\n$table-dark-border-color: lighten($table-dark-bg, 7.5%) !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n$table-bg-level: -9 !default;\n$table-border-level: -6 !default;\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .2rem !default;\n$input-btn-focus-color: rgba($component-active-bg, .25) !default;\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n$input-btn-line-height-sm: $line-height-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n$input-btn-line-height-lg: $line-height-lg !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-disabled-color: $gray-600 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .5rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: $white !default;\n$input-disabled-bg: $gray-200 !default;\n\n$input-color: $gray-700 !default;\n$input-border-color: $gray-400 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: inset 0 1px 1px rgba($black, .075) !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: lighten($component-active-bg, 25%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-600 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height-sm * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height-lg * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: .25rem !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-grid-gutter-width: 10px !default;\n$form-group-margin-bottom: 1rem !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: .5rem !default;\n$custom-control-spacer-x: 1rem !default;\n$custom-control-cursor: null !default;\n\n$custom-control-indicator-size: 1rem !default;\n$custom-control-indicator-bg: $input-bg !default;\n\n$custom-control-indicator-bg-size: 50% 50% !default;\n$custom-control-indicator-box-shadow: $input-box-shadow !default;\n$custom-control-indicator-border-color: $gray-500 !default;\n$custom-control-indicator-border-width: $input-border-width !default;\n\n$custom-control-label-color: null !default;\n\n$custom-control-indicator-disabled-bg: $input-disabled-bg !default;\n$custom-control-label-disabled-color: $gray-600 !default;\n\n$custom-control-indicator-checked-color: $component-active-color !default;\n$custom-control-indicator-checked-bg: $component-active-bg !default;\n$custom-control-indicator-checked-disabled-bg: rgba(theme-color(\"primary\"), .5) !default;\n$custom-control-indicator-checked-box-shadow: null !default;\n$custom-control-indicator-checked-border-color: $custom-control-indicator-checked-bg !default;\n\n$custom-control-indicator-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-control-indicator-focus-border-color: $input-focus-border-color !default;\n\n$custom-control-indicator-active-color: $component-active-color !default;\n$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-control-indicator-active-box-shadow: null !default;\n$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n$custom-checkbox-indicator-icon-checked: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'><path fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/></svg>\") !default;\n\n$custom-checkbox-indicator-indeterminate-bg: $component-active-bg !default;\n$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n$custom-checkbox-indicator-icon-indeterminate: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'><path stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/></svg>\") !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: null !default;\n$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n$custom-radio-indicator-icon-checked: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'><circle r='3' fill='#{$custom-control-indicator-checked-color}'/></svg>\") !default;\n\n$custom-switch-width: $custom-control-indicator-size * 1.75 !default;\n$custom-switch-indicator-border-radius: $custom-control-indicator-size * .5 !default;\n$custom-switch-indicator-size: subtract($custom-control-indicator-size, $custom-control-indicator-border-width * 4) !default;\n\n$custom-select-padding-y: $input-padding-y !default;\n$custom-select-padding-x: $input-padding-x !default;\n$custom-select-font-family: $input-font-family !default;\n$custom-select-font-size: $input-font-size !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-font-weight: $input-font-weight !default;\n$custom-select-line-height: $input-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $input-bg !default;\n$custom-select-disabled-bg: $gray-200 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n$custom-select-indicator-color: $gray-800 !default;\n$custom-select-indicator: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'><path fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/></svg>\") !default;\n$custom-select-background: escape-svg($custom-select-indicator) right $custom-select-padding-x center / $custom-select-bg-size no-repeat !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)\n\n$custom-select-feedback-icon-padding-right: add(1em * .75, (2 * $custom-select-padding-y * .75) + $custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;\n$custom-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$custom-select-border-width: $input-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: inset 0 1px 2px rgba($black, .075) !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n$custom-select-focus-width: $input-focus-width !default;\n$custom-select-focus-box-shadow: 0 0 0 $custom-select-focus-width $input-btn-focus-color !default;\n\n$custom-select-padding-y-sm: $input-padding-y-sm !default;\n$custom-select-padding-x-sm: $input-padding-x-sm !default;\n$custom-select-font-size-sm: $input-font-size-sm !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-padding-y-lg: $input-padding-y-lg !default;\n$custom-select-padding-x-lg: $input-padding-x-lg !default;\n$custom-select-font-size-lg: $input-font-size-lg !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-300 !default;\n$custom-range-track-border-radius: 1rem !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 1rem !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-range-thumb-disabled-bg: $gray-500 !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-padding-y !default;\n$custom-file-padding-x: $input-padding-x !default;\n$custom-file-line-height: $input-line-height !default;\n$custom-file-font-family: $input-font-family !default;\n$custom-file-font-weight: $input-font-weight !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'><path fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/></svg>\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='#{$form-feedback-icon-invalid-color}' viewBox='0 0 12 12'><circle cx='6' cy='6' r='4.5'/><path stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/><circle cx='6' cy='8.2' r='.6' fill='#{$form-feedback-icon-invalid-color}' stroke='none'/></svg>\") !default;\n\n$form-validation-states: () !default;\n$form-validation-states: map-merge(\n (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n ),\n ),\n $form-validation-states\n);\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n\n// Navs\n\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: $gray-300 !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: $spacer * .5 !default;\n\n\n// Navbar\n\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: $spacer !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n\n$navbar-nav-scroll-max-height: 75vh !default;\n\n$navbar-dark-color: rgba($white, .5) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'><path stroke='#{$navbar-dark-color}' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg>\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n\n$navbar-light-color: rgba($black, .5) !default;\n$navbar-light-hover-color: rgba($black, .7) !default;\n$navbar-light-active-color: rgba($black, .9) !default;\n$navbar-light-disabled-color: rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'><path stroke='#{$navbar-light-color}' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg>\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: rgba($black, .15) !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: subtract($dropdown-border-radius, $dropdown-border-width) !default;\n$dropdown-divider-bg: $gray-200 !default;\n$dropdown-divider-margin-y: $nav-divider-margin-y !default;\n$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: darken($gray-900, 5%) !default;\n$dropdown-link-hover-bg: $gray-200 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-500 !default;\n\n$dropdown-item-padding-y: .25rem !default;\n$dropdown-item-padding-x: 1.5rem !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding: $dropdown-padding-y $dropdown-item-padding-x !default;\n\n\n// Pagination\n\n$pagination-padding-y: .5rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n$pagination-line-height: 1.25 !default;\n\n$pagination-color: $link-color !default;\n$pagination-bg: $white !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: $gray-300 !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: $gray-300 !default;\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $pagination-active-bg !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-300 !default;\n\n$pagination-border-radius-sm: $border-radius-sm !default;\n$pagination-border-radius-lg: $border-radius-lg !default;\n\n\n// Jumbotron\n\n$jumbotron-padding: 2rem !default;\n$jumbotron-color: null !default;\n$jumbotron-bg: $gray-200 !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: rgba($black, .125) !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: $grid-gutter-width * .5 !default;\n$card-deck-margin: $card-group-margin !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $card-spacer-y !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: .25rem !default;\n$tooltip-padding-x: .5rem !default;\n$tooltip-margin: 0 !default;\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n// Form tooltips must come after regular tooltips\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: $line-height-base !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: rgba($black, .2) !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-inner-border-radius: subtract($popover-border-radius, $popover-border-width) !default;\n$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default;\n\n$popover-header-bg: darken($popover-bg, 3%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: .75rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;\n\n\n// Toasts\n\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .25rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: 1px !default;\n$toast-border-color: rgba(0, 0, 0, .1) !default;\n$toast-border-radius: .25rem !default;\n$toast-box-shadow: 0 .25rem .75rem rgba($black, .1) !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba(0, 0, 0, .05) !default;\n\n\n// Badges\n\n$badge-font-size: 75% !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .25em !default;\n$badge-padding-x: .4em !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-transition: $btn-transition !default;\n$badge-focus-width: $input-btn-focus-width !default;\n\n$badge-pill-padding-x: .6em !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: 10rem !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: 1rem !default;\n\n// Margin between elements in footer, must be lower than or equal to 2 * $modal-inner-padding\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: rgba($black, .2) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;\n$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: $border-color !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding-y: 1rem !default;\n$modal-header-padding-x: 1rem !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-xl: 1140px !default;\n$modal-lg: 800px !default;\n$modal-md: 500px !default;\n$modal-sm: 300px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .75rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n\n$alert-bg-level: -10 !default;\n$alert-border-level: -9 !default;\n$alert-color-level: 6 !default;\n\n\n// Progress bars\n\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: inset 0 .1rem .1rem rgba($black, .1) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n\n// List group\n\n$list-group-color: null !default;\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black, .125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .75rem !default;\n$list-group-item-padding-x: 1.25rem !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: $gray-300 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: 0 1px 2px rgba($black, .075) !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-600 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-font-size: null !default;\n\n$breadcrumb-padding-y: .75rem !default;\n$breadcrumb-padding-x: 1rem !default;\n$breadcrumb-item-padding: .5rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: $gray-200 !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: quote(\"/\") !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' width='8' height='8' viewBox='0 0 8 8'><path d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/></svg>\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' width='8' height='8' viewBox='0 0 8 8'><path d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/></svg>\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Spinners\n\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .2rem !default;\n$kbd-padding-x: .4rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: $white !default;\n$kbd-bg: $gray-900 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Utilities\n\n$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;\n$overflows: auto, hidden !default;\n$positions: static, relative, absolute, fixed, sticky !default;\n$user-selects: all, auto, none !default;\n\n\n// Printing\n\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n"]}
@@ -1,4 +1,6 @@
1
- import { MouseEvent, PureComponent } from 'react';
1
+ import { Component, MouseEvent } from 'react';
2
+ import { DropdownAction } from '@deephaven/components';
3
+ import { TypeValue as FilterTypeValue } from '@deephaven/filters';
2
4
  import './LinkerLink.scss';
3
5
  export declare type LinkerLinkProps = {
4
6
  x1: number;
@@ -7,12 +9,22 @@ export declare type LinkerLinkProps = {
7
9
  y2: number;
8
10
  id: string;
9
11
  className: string;
12
+ operator: FilterTypeValue;
13
+ isSelected: boolean;
14
+ startColumnType: string | null;
10
15
  onClick: (id: string) => void;
16
+ onDelete: (id: string) => void;
17
+ onOperatorChanged: (id: string, type: FilterTypeValue) => void;
11
18
  };
12
- export declare class LinkerLink extends PureComponent<LinkerLinkProps> {
19
+ export declare type LinkerLinkState = {
20
+ isHovering?: boolean;
21
+ };
22
+ export declare class LinkerLink extends Component<LinkerLinkProps, LinkerLinkState> {
13
23
  static defaultProps: {
14
24
  className: string;
25
+ isSelected: boolean;
15
26
  onClick(): void;
27
+ onDelete(): void;
16
28
  };
17
29
  /**
18
30
  * Make an SVG path for a circle at the specified coordinates.
@@ -22,8 +34,14 @@ export declare class LinkerLink extends PureComponent<LinkerLinkProps> {
22
34
  * @returns The SVG string path
23
35
  */
24
36
  static makeCirclePath(x: number, y: number, r: number): string;
37
+ static getLabelForLinkFilter(columnType: string, filterType: FilterTypeValue): string;
25
38
  constructor(props: LinkerLinkProps);
39
+ getOperators: (linkId: string, columnType: string) => DropdownAction[];
26
40
  handleClick(event: MouseEvent<SVGPathElement>): void;
41
+ handleMouseEnter(): void;
42
+ handleMouseLeave(): void;
43
+ handleDelete(): void;
44
+ getDropdownActions(): DropdownAction[];
27
45
  render(): JSX.Element;
28
46
  }
29
47
  export default LinkerLink;
@@ -1 +1 @@
1
- {"version":3,"file":"LinkerLink.d.ts","sourceRoot":"","sources":["../../src/linker/LinkerLink.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,mBAAmB,CAAC;AAc3B,oBAAY,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B,CAAC;AAEF,qBAAa,UAAW,SAAQ,aAAa,CAAC,eAAe,CAAC;IAC5D,MAAM,CAAC,YAAY;;mBAEN,IAAI;MAGf;IAEF;;;;;;OAMG;IACH,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;gBAMlD,KAAK,EAAE,eAAe;IAMlC,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,cAAc,CAAC,GAAG,IAAI;IAQpD,MAAM,IAAI,GAAG,CAAC,OAAO;CAiEtB;AAED,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"LinkerLink.d.ts","sourceRoot":"","sources":["../../src/linker/LinkerLink.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAGrD,OAAO,EAAU,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAG7E,OAAO,EAEL,SAAS,IAAI,eAAe,EAI7B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,mBAAmB,CAAC;AAiB3B,oBAAY,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,iBAAiB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;CAChE,CAAC;AAEF,oBAAY,eAAe,GAAG;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,qBAAa,UAAW,SAAQ,SAAS,CAAC,eAAe,EAAE,eAAe,CAAC;IACzE,MAAM,CAAC,YAAY;;;mBAGN,IAAI;oBAGH,IAAI;MAGhB;IAEF;;;;;;OAMG;IACH,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAM9D,MAAM,CAAC,qBAAqB,CAC1B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,eAAe,GAC1B,MAAM;gBA6BG,KAAK,EAAE,eAAe;IAclC,YAAY,WACD,MAAM,cAAc,MAAM,KAAG,cAAc,EAAE,CA+BtD;IAEF,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,cAAc,CAAC,GAAG,IAAI;IAYpD,gBAAgB,IAAI,IAAI;IAMxB,gBAAgB,IAAI,IAAI;IAMxB,YAAY,IAAI,IAAI;IAKpB,kBAAkB,IAAI,cAAc,EAAE;IAQtC,MAAM,IAAI,GAAG,CAAC,OAAO;CA6KtB;AAED,eAAe,UAAU,CAAC"}