@deephaven/dashboard-core-plugins 0.46.1-beta.0 → 0.46.1-beta.4

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 (63) hide show
  1. package/dist/LinkerPlugin.js +2 -1
  2. package/dist/LinkerPlugin.js.map +1 -1
  3. package/dist/controls/dropdown-filter/DropdownFilter.js +120 -93
  4. package/dist/controls/dropdown-filter/DropdownFilter.js.map +1 -1
  5. package/dist/controls/input-filter/InputFilter.js +85 -65
  6. package/dist/controls/input-filter/InputFilter.js.map +1 -1
  7. package/dist/controls/markdown/MarkdownContainer.js +15 -9
  8. package/dist/controls/markdown/MarkdownContainer.js.map +1 -1
  9. package/dist/controls/markdown/MarkdownEditor.js +24 -16
  10. package/dist/controls/markdown/MarkdownEditor.js.map +1 -1
  11. package/dist/controls/markdown/MarkdownStartPage.js +67 -46
  12. package/dist/controls/markdown/MarkdownStartPage.js.map +1 -1
  13. package/dist/linker/Linker.js +17 -15
  14. package/dist/linker/Linker.js.map +1 -1
  15. package/dist/linker/LinkerLink.js +80 -65
  16. package/dist/linker/LinkerLink.js.map +1 -1
  17. package/dist/linker/LinkerOverlayContent.js +75 -65
  18. package/dist/linker/LinkerOverlayContent.js.map +1 -1
  19. package/dist/panels/ChartColumnSelectorOverlay.js +25 -19
  20. package/dist/panels/ChartColumnSelectorOverlay.js.map +1 -1
  21. package/dist/panels/ChartFilterOverlay.js +50 -33
  22. package/dist/panels/ChartFilterOverlay.js.map +1 -1
  23. package/dist/panels/ChartPanel.js +51 -44
  24. package/dist/panels/ChartPanel.js.map +1 -1
  25. package/dist/panels/CommandHistoryPanel.js +21 -14
  26. package/dist/panels/CommandHistoryPanel.js.map +1 -1
  27. package/dist/panels/ConsolePanel.js +50 -24
  28. package/dist/panels/ConsolePanel.js.map +1 -1
  29. package/dist/panels/DropdownFilterPanel.js +25 -22
  30. package/dist/panels/DropdownFilterPanel.js.map +1 -1
  31. package/dist/panels/FileExplorerPanel.js +24 -21
  32. package/dist/panels/FileExplorerPanel.js.map +1 -1
  33. package/dist/panels/FilterSetManager.js +227 -185
  34. package/dist/panels/FilterSetManager.js.map +1 -1
  35. package/dist/panels/FilterSetManagerPanel.js +16 -13
  36. package/dist/panels/FilterSetManagerPanel.js.map +1 -1
  37. package/dist/panels/InputFilterPanel.js +12 -10
  38. package/dist/panels/InputFilterPanel.js.map +1 -1
  39. package/dist/panels/IrisGridPanel.js +76 -72
  40. package/dist/panels/IrisGridPanel.js.map +1 -1
  41. package/dist/panels/IrisGridPanelTooltip.js +18 -9
  42. package/dist/panels/IrisGridPanelTooltip.js.map +1 -1
  43. package/dist/panels/LogPanel.js +14 -10
  44. package/dist/panels/LogPanel.js.map +1 -1
  45. package/dist/panels/MarkdownNotebook.js +64 -51
  46. package/dist/panels/MarkdownNotebook.js.map +1 -1
  47. package/dist/panels/MarkdownPanel.js +21 -18
  48. package/dist/panels/MarkdownPanel.js.map +1 -1
  49. package/dist/panels/NotebookPanel.js +126 -108
  50. package/dist/panels/NotebookPanel.js.map +1 -1
  51. package/dist/panels/PandasPanel.js +21 -12
  52. package/dist/panels/PandasPanel.js.map +1 -1
  53. package/dist/panels/Panel.js +30 -23
  54. package/dist/panels/Panel.js.map +1 -1
  55. package/dist/panels/PanelContextMenu.js +2 -1
  56. package/dist/panels/PanelContextMenu.js.map +1 -1
  57. package/dist/panels/RenameDialog.js +42 -31
  58. package/dist/panels/RenameDialog.js.map +1 -1
  59. package/dist/panels/WidgetPanel.js +9 -6
  60. package/dist/panels/WidgetPanel.js.map +1 -1
  61. package/dist/panels/WidgetPanelTooltip.js +31 -19
  62. package/dist/panels/WidgetPanelTooltip.js.map +1 -1
  63. package/package.json +22 -22
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import { assertIsDashboardPluginProps } from '@deephaven/dashboard';
3
3
  import Linker from "./linker/Linker.js";
4
+ import { jsx as _jsx } from "react/jsx-runtime";
4
5
  export function LinkerPlugin(props) {
5
6
  assertIsDashboardPluginProps(props);
6
7
  var {
@@ -8,7 +9,7 @@ export function LinkerPlugin(props) {
8
9
  layout,
9
10
  panelManager
10
11
  } = props;
11
- return /*#__PURE__*/React.createElement(Linker, {
12
+ return /*#__PURE__*/_jsx(Linker, {
12
13
  layout: layout,
13
14
  localDashboardId: id,
14
15
  panelManager: panelManager
@@ -1 +1 @@
1
- {"version":3,"file":"LinkerPlugin.js","names":["React","assertIsDashboardPluginProps","Linker","LinkerPlugin","props","id","layout","panelManager"],"sources":["../src/LinkerPlugin.tsx"],"sourcesContent":["import React from 'react';\nimport {\n assertIsDashboardPluginProps,\n DashboardPluginComponentProps,\n} from '@deephaven/dashboard';\nimport Linker from './linker/Linker';\n\nexport type LinkerPluginProps = Partial<DashboardPluginComponentProps>;\n\nexport function LinkerPlugin(props: LinkerPluginProps): JSX.Element {\n assertIsDashboardPluginProps(props);\n const { id, layout, panelManager } = props;\n return (\n <Linker layout={layout} localDashboardId={id} panelManager={panelManager} />\n );\n}\n\nexport default LinkerPlugin;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SACEC,4BAA4B,QAEvB,sBAAsB;AAAC,OACvBC,MAAM;AAIb,OAAO,SAASC,YAAY,CAACC,KAAwB,EAAe;EAClEH,4BAA4B,CAACG,KAAK,CAAC;EACnC,IAAM;IAAEC,EAAE;IAAEC,MAAM;IAAEC;EAAa,CAAC,GAAGH,KAAK;EAC1C,oBACE,oBAAC,MAAM;IAAC,MAAM,EAAEE,MAAO;IAAC,gBAAgB,EAAED,EAAG;IAAC,YAAY,EAAEE;EAAa,EAAG;AAEhF;AAEA,eAAeJ,YAAY"}
1
+ {"version":3,"file":"LinkerPlugin.js","names":["React","assertIsDashboardPluginProps","Linker","LinkerPlugin","props","id","layout","panelManager"],"sources":["../src/LinkerPlugin.tsx"],"sourcesContent":["import React from 'react';\nimport {\n assertIsDashboardPluginProps,\n DashboardPluginComponentProps,\n} from '@deephaven/dashboard';\nimport Linker from './linker/Linker';\n\nexport type LinkerPluginProps = Partial<DashboardPluginComponentProps>;\n\nexport function LinkerPlugin(props: LinkerPluginProps): JSX.Element {\n assertIsDashboardPluginProps(props);\n const { id, layout, panelManager } = props;\n return (\n <Linker layout={layout} localDashboardId={id} panelManager={panelManager} />\n );\n}\n\nexport default LinkerPlugin;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SACEC,4BAA4B,QAEvB,sBAAsB;AAAC,OACvBC,MAAM;AAAA;AAIb,OAAO,SAASC,YAAY,CAACC,KAAwB,EAAe;EAClEH,4BAA4B,CAACG,KAAK,CAAC;EACnC,IAAM;IAAEC,EAAE;IAAEC,MAAM;IAAEC;EAAa,CAAC,GAAGH,KAAK;EAC1C,oBACE,KAAC,MAAM;IAAC,MAAM,EAAEE,MAAO;IAAC,gBAAgB,EAAED,EAAG;IAAC,YAAY,EAAEE;EAAa,EAAG;AAEhF;AAEA,eAAeJ,YAAY"}
@@ -16,6 +16,9 @@ import debounce from 'lodash.debounce';
16
16
  import shortid from 'shortid';
17
17
  import Log from '@deephaven/log';
18
18
  import "./DropdownFilter.css";
19
+ import { jsx as _jsx } from "react/jsx-runtime";
20
+ import { jsxs as _jsxs } from "react/jsx-runtime";
21
+ import { Fragment as _Fragment } from "react/jsx-runtime";
19
22
  var log = Log.module('DropdownFilter');
20
23
  var UPDATE_DEBOUNCE = 150;
21
24
  export class DropdownFilter extends Component {
@@ -31,15 +34,15 @@ export class DropdownFilter extends Component {
31
34
  _defineProperty(this, "getColumnOptions", memoize((columns, selectedColumn) => {
32
35
  var selectedIndex = -1;
33
36
  var options = [];
34
- options.push( /*#__PURE__*/React.createElement("option", {
35
- key: "placeholder",
36
- value: "-1"
37
- }, "Select a column"));
37
+ options.push( /*#__PURE__*/_jsx("option", {
38
+ value: "-1",
39
+ children: "Select a column"
40
+ }, "placeholder"));
38
41
  columns.forEach((columnItem, index) => {
39
- options.push( /*#__PURE__*/React.createElement("option", {
40
- key: "".concat(columnItem.name, "/").concat(columnItem.type),
41
- value: index
42
- }, this.getItemLabel(columns, index)));
42
+ options.push( /*#__PURE__*/_jsx("option", {
43
+ value: index,
44
+ children: this.getItemLabel(columns, index)
45
+ }, "".concat(columnItem.name, "/").concat(columnItem.type)));
43
46
  if (selectedColumn !== null && columnItem.name === selectedColumn.name && columnItem.type === selectedColumn.type) {
44
47
  selectedIndex = index;
45
48
  }
@@ -47,15 +50,15 @@ export class DropdownFilter extends Component {
47
50
  return [options, selectedIndex];
48
51
  }));
49
52
  _defineProperty(this, "getSelectedOptionIndex", memoize((values, value) => values.indexOf(value)));
50
- _defineProperty(this, "getValueOptions", memoize(values => [/*#__PURE__*/React.createElement("option", {
53
+ _defineProperty(this, "getValueOptions", memoize(values => [/*#__PURE__*/_jsx("option", {
51
54
  value: "-1",
52
- key: "-1"
53
- }, DropdownFilter.PLACEHOLDER), ...values.map((val, index) => /*#__PURE__*/React.createElement("option", {
55
+ children: DropdownFilter.PLACEHOLDER
56
+ }, "-1"), ...values.map((val, index) => /*#__PURE__*/_jsx("option", {
54
57
  value: index
55
58
  // eslint-disable-next-line react/no-array-index-key
56
59
  ,
57
- key: "".concat(index, "/").concat(val)
58
- }, val !== null && val !== void 0 ? val : '(null)'))]));
60
+ children: val !== null && val !== void 0 ? val : '(null)'
61
+ }, "".concat(index, "/").concat(val)))]));
59
62
  _defineProperty(this, "getItemLabel", memoizee((columns, index) => {
60
63
  var {
61
64
  name,
@@ -313,87 +316,111 @@ export class DropdownFilter extends Component {
313
316
  var isFlipped = isValueShown && !isLinkerActive;
314
317
  var sourceColumnId = "source-column-btn-".concat(id);
315
318
  var filterColumnId = "filter-column-select-".concat(id);
316
- return /*#__PURE__*/React.createElement(CardFlip, {
319
+ return /*#__PURE__*/_jsxs(CardFlip, {
317
320
  className: "dropdown-filter fill-parent-absolute",
318
- isFlipped: isFlipped
319
- }, /*#__PURE__*/React.createElement("div", {
320
- className: "dropdown-filter-settings-card"
321
- }, /*#__PURE__*/React.createElement("div", {
322
- className: "dropdown-filter-card-content"
323
- }, /*#__PURE__*/React.createElement("div", {
324
- className: "dropdown-filter-settings-grid"
325
- }, /*#__PURE__*/React.createElement("label", {
326
- htmlFor: sourceColumnId
327
- }, "Source Column"), /*#__PURE__*/React.createElement(SocketedButton, {
328
- id: sourceColumnId,
329
- isLinked: isLinked,
330
- onClick: onColumnSelected,
331
- onMouseEnter: onSourceMouseEnter,
332
- onMouseLeave: onSourceMouseLeave,
333
- className: DropdownFilter.SOURCE_BUTTON_CLASS_NAME,
334
- disabled: disableLinking
335
- }, sourceButtonLabel), /*#__PURE__*/React.createElement("div", {
336
- className: "text-muted small"
337
- }, "Select a source column for the list by linking to a table."), /*#__PURE__*/React.createElement("label", {
338
- htmlFor: filterColumnId
339
- }, "Filter Column"), /*#__PURE__*/React.createElement("select", {
340
- id: filterColumnId,
341
- value: selectedIndex,
342
- className: "custom-select",
343
- onChange: this.handleColumnChange,
344
- disabled: columnSelectionDisabled
345
- }, columnOptions), /*#__PURE__*/React.createElement("div", {
346
- className: "text-muted small"
347
- }, "Dropdown filter control will apply its filter to all columns matching this name in this dashboard.")), settingsError && /*#__PURE__*/React.createElement("div", {
348
- className: "error-message text-center"
349
- }, settingsError), isLinked && /*#__PURE__*/React.createElement("div", {
350
- className: "dropdown-filter-settings-buttons"
351
- }, /*#__PURE__*/React.createElement(Button, {
352
- kind: "secondary",
353
- type: "button",
354
- onClick: this.handleSettingsCancel,
355
- disabled: disableCancel || isValueShown || isLinkerActive,
356
- tooltip: isLinkerActive ? 'Cancel disabled while linker open' : undefined
357
- }, "Cancel"), /*#__PURE__*/React.createElement(Button, {
358
- kind: "primary",
359
- type: "button",
360
- className: "ml-2",
361
- onClick: this.handleSettingsSave,
362
- disabled: disableSave || isValueShown || isLinkerActive,
363
- tooltip: isLinkerActive ? 'Save disabled while linker open' : undefined
364
- }, "Save")))), /*#__PURE__*/React.createElement("div", {
365
- className: "dropdown-filter-value-card",
366
- onClick: this.handleBackgroundClick,
367
- "data-testid": "dropdown-filter-value-background"
368
- }, isLoaded && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
369
- className: "dropdown-filter-column"
370
- }, /*#__PURE__*/React.createElement("div", {
371
- className: "dropdown-filter-column-title"
372
- }, filterTitle)), /*#__PURE__*/React.createElement("div", {
373
- className: "dropdown-filter-card-content"
374
- }, /*#__PURE__*/React.createElement("div", {
375
- className: "dropdown-filter-value-input d-flex flex-column justify-content-center"
376
- }, /*#__PURE__*/React.createElement("select", {
377
- className: "custom-select",
378
- value: selectedOption,
379
- ref: this.dropdownRef,
380
- onChange: this.handleValueChange,
381
- onKeyPress: this.handleDropdownKeyPress,
382
- title: "Select Value"
383
- }, valueOptions)), settingsError && /*#__PURE__*/React.createElement("div", {
384
- className: "error-message mt-3 text-center"
385
- }, settingsError)), /*#__PURE__*/React.createElement("div", {
386
- className: "dropdown-filter-menu"
387
- }, /*#__PURE__*/React.createElement(Button, {
388
- kind: "ghost",
389
- className: "m-2 px-2",
390
- onClick: this.handleSettingsClick,
391
- icon: /*#__PURE__*/React.createElement(FontAwesomeIcon, {
392
- icon: vsGear,
393
- transform: "grow-4"
394
- }),
395
- tooltip: "Dropdown Filter Settings"
396
- })))));
321
+ isFlipped: isFlipped,
322
+ children: [/*#__PURE__*/_jsx("div", {
323
+ className: "dropdown-filter-settings-card",
324
+ children: /*#__PURE__*/_jsxs("div", {
325
+ className: "dropdown-filter-card-content",
326
+ children: [/*#__PURE__*/_jsxs("div", {
327
+ className: "dropdown-filter-settings-grid",
328
+ children: [/*#__PURE__*/_jsx("label", {
329
+ htmlFor: sourceColumnId,
330
+ children: "Source Column"
331
+ }), /*#__PURE__*/_jsx(SocketedButton, {
332
+ id: sourceColumnId,
333
+ isLinked: isLinked,
334
+ onClick: onColumnSelected,
335
+ onMouseEnter: onSourceMouseEnter,
336
+ onMouseLeave: onSourceMouseLeave,
337
+ className: DropdownFilter.SOURCE_BUTTON_CLASS_NAME,
338
+ disabled: disableLinking,
339
+ children: sourceButtonLabel
340
+ }), /*#__PURE__*/_jsx("div", {
341
+ className: "text-muted small",
342
+ children: "Select a source column for the list by linking to a table."
343
+ }), /*#__PURE__*/_jsx("label", {
344
+ htmlFor: filterColumnId,
345
+ children: "Filter Column"
346
+ }), /*#__PURE__*/_jsx("select", {
347
+ id: filterColumnId,
348
+ value: selectedIndex,
349
+ className: "custom-select",
350
+ onChange: this.handleColumnChange,
351
+ disabled: columnSelectionDisabled,
352
+ children: columnOptions
353
+ }), /*#__PURE__*/_jsx("div", {
354
+ className: "text-muted small",
355
+ children: "Dropdown filter control will apply its filter to all columns matching this name in this dashboard."
356
+ })]
357
+ }), settingsError && /*#__PURE__*/_jsx("div", {
358
+ className: "error-message text-center",
359
+ children: settingsError
360
+ }), isLinked && /*#__PURE__*/_jsxs("div", {
361
+ className: "dropdown-filter-settings-buttons",
362
+ children: [/*#__PURE__*/_jsx(Button, {
363
+ kind: "secondary",
364
+ type: "button",
365
+ onClick: this.handleSettingsCancel,
366
+ disabled: disableCancel || isValueShown || isLinkerActive,
367
+ tooltip: isLinkerActive ? 'Cancel disabled while linker open' : undefined,
368
+ children: "Cancel"
369
+ }), /*#__PURE__*/_jsx(Button, {
370
+ kind: "primary",
371
+ type: "button",
372
+ className: "ml-2",
373
+ onClick: this.handleSettingsSave,
374
+ disabled: disableSave || isValueShown || isLinkerActive,
375
+ tooltip: isLinkerActive ? 'Save disabled while linker open' : undefined,
376
+ children: "Save"
377
+ })]
378
+ })]
379
+ })
380
+ }), /*#__PURE__*/_jsx("div", {
381
+ className: "dropdown-filter-value-card",
382
+ onClick: this.handleBackgroundClick,
383
+ "data-testid": "dropdown-filter-value-background",
384
+ children: isLoaded && /*#__PURE__*/_jsxs(_Fragment, {
385
+ children: [/*#__PURE__*/_jsx("div", {
386
+ className: "dropdown-filter-column",
387
+ children: /*#__PURE__*/_jsx("div", {
388
+ className: "dropdown-filter-column-title",
389
+ children: filterTitle
390
+ })
391
+ }), /*#__PURE__*/_jsxs("div", {
392
+ className: "dropdown-filter-card-content",
393
+ children: [/*#__PURE__*/_jsx("div", {
394
+ className: "dropdown-filter-value-input d-flex flex-column justify-content-center",
395
+ children: /*#__PURE__*/_jsx("select", {
396
+ className: "custom-select",
397
+ value: selectedOption,
398
+ ref: this.dropdownRef,
399
+ onChange: this.handleValueChange,
400
+ onKeyPress: this.handleDropdownKeyPress,
401
+ title: "Select Value",
402
+ children: valueOptions
403
+ })
404
+ }), settingsError && /*#__PURE__*/_jsx("div", {
405
+ className: "error-message mt-3 text-center",
406
+ children: settingsError
407
+ })]
408
+ }), /*#__PURE__*/_jsx("div", {
409
+ className: "dropdown-filter-menu",
410
+ children: /*#__PURE__*/_jsx(Button, {
411
+ kind: "ghost",
412
+ className: "m-2 px-2",
413
+ onClick: this.handleSettingsClick,
414
+ icon: /*#__PURE__*/_jsx(FontAwesomeIcon, {
415
+ icon: vsGear,
416
+ transform: "grow-4"
417
+ }),
418
+ tooltip: "Dropdown Filter Settings"
419
+ })
420
+ })]
421
+ })
422
+ })]
423
+ });
397
424
  }
398
425
  }
399
426
  _defineProperty(DropdownFilter, "defaultProps", {
@@ -1 +1 @@
1
- {"version":3,"file":"DropdownFilter.js","names":["React","Component","FontAwesomeIcon","Button","CardFlip","SocketedButton","vsGear","TableUtils","memoizee","memoize","debounce","shortid","Log","log","module","UPDATE_DEBOUNCE","DropdownFilter","constructor","props","source","columns","filter","type","undefined","isCompatibleType","columnType","selectedColumn","selectedIndex","options","push","forEach","columnItem","index","name","getItemLabel","values","value","indexOf","PLACEHOLDER","map","val","length","shortType","substring","lastIndexOf","onChange","column","isValueShown","state","handleColumnChange","bind","handleSettingsCancel","handleSettingsClick","handleSettingsSave","handleBackgroundClick","handleDropdownKeyPress","handleValueChange","dropdownRef","createRef","id","disableCancel","componentDidUpdate","prevProps","prevState","isLoaded","sourceUpdated","includes","resetValue","focusInput","sendUpdate","componentWillUnmount","flush","event","target","debug2","parseInt","setState","allColumns","getCompatibleColumns","key","preventDefault","stopPropagation","valueIndex","showSettings","current","focus","clearFilter","setFilterState","oldValue","oldIsValueShown","render","disableLinking","isLinkerActive","onColumnSelected","onSourceMouseEnter","onSourceMouseLeave","settingsError","columnSelectionDisabled","isLinked","sourceButtonLabel","columnName","SOURCE_BUTTON_PLACEHOLDER","filterTitle","columnOptions","getColumnOptions","valueOptions","getValueOptions","selectedOption","getSelectedOptionIndex","disableSave","isFlipped","sourceColumnId","filterColumnId","SOURCE_BUTTON_CLASS_NAME"],"sources":["../../../src/controls/dropdown-filter/DropdownFilter.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/click-events-have-key-events */\n/* eslint-disable jsx-a11y/no-static-element-interactions */\n// background click is just a convenience method, not an actual a11y issue\n\nimport React, {\n ChangeEvent,\n Component,\n KeyboardEvent,\n MouseEvent,\n ReactElement,\n RefObject,\n} from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Button, CardFlip, SocketedButton } from '@deephaven/components';\nimport { vsGear } from '@deephaven/icons';\nimport type { Column } from '@deephaven/jsapi-types';\nimport { TableUtils } from '@deephaven/jsapi-utils';\nimport memoizee from 'memoizee';\nimport memoize from 'memoize-one';\nimport debounce from 'lodash.debounce';\nimport shortid from 'shortid';\nimport Log from '@deephaven/log';\nimport './DropdownFilter.scss';\nimport { LinkPoint } from '../../linker/LinkerUtils';\n\nconst log = Log.module('DropdownFilter');\nconst UPDATE_DEBOUNCE = 150;\n\nexport interface DropdownFilterColumn {\n name: string;\n type: string;\n}\n\nexport interface DropdownFilterProps {\n column: DropdownFilterColumn;\n columns: DropdownFilterColumn[];\n onSourceMouseEnter: () => void;\n onSourceMouseLeave: () => void;\n disableLinking: boolean;\n isLinkerActive: boolean;\n isLoaded: boolean;\n isValueShown: boolean;\n settingsError: string;\n source: LinkPoint;\n value: string | null;\n values: (string | null)[];\n onChange: (change: {\n column: Partial<Column> | null;\n isValueShown?: boolean;\n value?: string;\n }) => void;\n onColumnSelected: () => void;\n}\n\ninterface DropdownFilterState {\n column: DropdownFilterColumn | null;\n selectedColumn: DropdownFilterColumn | null;\n disableCancel: boolean;\n isValueShown: boolean;\n value: string | null;\n id: string;\n}\n\nexport class DropdownFilter extends Component<\n DropdownFilterProps,\n DropdownFilterState\n> {\n static defaultProps = {\n column: null,\n disableLinking: false,\n isLinkerActive: false,\n isLoaded: false,\n isValueShown: false,\n\n settingsError: null,\n source: null,\n value: '',\n values: [],\n onColumnSelected: (): void => undefined,\n onSourceMouseEnter: (): void => undefined,\n onSourceMouseLeave: (): void => undefined,\n };\n\n static PLACEHOLDER = 'Select a value...';\n\n static SOURCE_BUTTON_CLASS_NAME = 'btn-dropdown-filter-selector';\n\n static SOURCE_BUTTON_PLACEHOLDER = 'Select a column';\n\n constructor(props: DropdownFilterProps) {\n super(props);\n\n this.handleColumnChange = this.handleColumnChange.bind(this);\n this.handleSettingsCancel = this.handleSettingsCancel.bind(this);\n this.handleSettingsClick = this.handleSettingsClick.bind(this);\n this.handleSettingsSave = this.handleSettingsSave.bind(this);\n this.handleBackgroundClick = this.handleBackgroundClick.bind(this);\n this.handleDropdownKeyPress = this.handleDropdownKeyPress.bind(this);\n this.handleValueChange = this.handleValueChange.bind(this);\n\n this.dropdownRef = React.createRef();\n\n const { column, isValueShown, value } = props;\n this.state = {\n column,\n id: shortid(),\n selectedColumn: column,\n disableCancel: !isValueShown,\n isValueShown,\n value,\n };\n }\n\n componentDidUpdate(\n prevProps: DropdownFilterProps,\n prevState: DropdownFilterState\n ): void {\n const { source, values, isLoaded } = this.props;\n const { column, value, isValueShown } = this.state;\n\n if (isLoaded) {\n if (source !== prevProps.source) {\n this.sourceUpdated();\n }\n\n if (\n values !== prevProps.values &&\n value !== '' &&\n !values.includes(value)\n ) {\n // Value list loaded, but doesn't contain the current value\n this.resetValue();\n }\n\n if (isValueShown !== prevState.isValueShown) {\n if (isValueShown) {\n this.focusInput();\n }\n }\n\n if (\n column !== prevState.column ||\n value !== prevState.value ||\n isValueShown !== prevState.isValueShown\n ) {\n this.sendUpdate();\n }\n }\n }\n\n componentWillUnmount(): void {\n this.sendUpdate.flush();\n }\n\n dropdownRef: RefObject<HTMLSelectElement>;\n\n getCompatibleColumns = memoize(\n (source: LinkPoint, columns: DropdownFilterColumn[]) =>\n source != null\n ? columns.filter(\n ({ type }) =>\n type !== undefined &&\n TableUtils.isCompatibleType(type, source.columnType)\n )\n : []\n );\n\n getColumnOptions = memoize(\n (\n columns: DropdownFilterColumn[],\n selectedColumn: DropdownFilterColumn | null\n ): [JSX.Element[], number] => {\n let selectedIndex = -1;\n const options = [];\n options.push(\n <option key=\"placeholder\" value=\"-1\">\n Select a column\n </option>\n );\n columns.forEach((columnItem, index) => {\n options.push(\n <option key={`${columnItem.name}/${columnItem.type}`} value={index}>\n {this.getItemLabel(columns, index)}\n </option>\n );\n if (\n selectedColumn !== null &&\n columnItem.name === selectedColumn.name &&\n columnItem.type === selectedColumn.type\n ) {\n selectedIndex = index;\n }\n });\n return [options, selectedIndex];\n }\n );\n\n getSelectedOptionIndex = memoize(\n (values: (string | null)[], value: string | null) => values.indexOf(value)\n );\n\n getValueOptions = memoize((values: (string | null)[]) => [\n <option value=\"-1\" key=\"-1\">\n {DropdownFilter.PLACEHOLDER}\n </option>,\n ...values.map((val, index) => (\n <option\n value={index}\n // eslint-disable-next-line react/no-array-index-key\n key={`${index}/${val}`}\n >\n {val ?? '(null)'}\n </option>\n )),\n ]);\n\n getItemLabel = memoizee((columns: DropdownFilterColumn[], index: number) => {\n const { name, type } = columns[index];\n\n if (\n (index > 0 && columns[index - 1].name === name) ||\n (index < columns.length - 1 && columns[index + 1].name === name)\n ) {\n const shortType = type.substring(type.lastIndexOf('.') + 1);\n return `${name} (${shortType})`;\n }\n\n return name;\n });\n\n handleColumnChange(event: ChangeEvent<HTMLSelectElement>): void {\n const { value } = event.target;\n log.debug2('handleColumnChange', value);\n if (value != null && parseInt(value, 10) < 0) {\n this.setState({\n selectedColumn: null,\n });\n return;\n }\n const { columns: allColumns, source } = this.props;\n const columns = this.getCompatibleColumns(source, allColumns);\n this.setState({\n selectedColumn: columns[parseInt(value, 10)],\n });\n }\n\n handleDropdownKeyPress(event: KeyboardEvent<HTMLSelectElement>): void {\n if (event.key === 'Enter') {\n event.preventDefault();\n event.stopPropagation();\n\n log.debug2('handleDropdownKeyPress');\n\n this.sendUpdate();\n this.sendUpdate.flush();\n }\n }\n\n handleValueChange(event: ChangeEvent<HTMLSelectElement>): void {\n const { value: valueIndex } = event.target;\n const index = parseInt(valueIndex, 10);\n // Default empty string value for 'clear filter'\n let value: string | null = '';\n const { values } = this.props;\n if (index >= 0 && index < values.length) {\n value = values[index];\n } else {\n log.debug2('Selected default item');\n }\n\n log.debug2('handleValueChange', value);\n\n this.setState({ value });\n }\n\n handleSettingsCancel(): void {\n this.setState(({ column }) => ({\n selectedColumn: column,\n isValueShown: true,\n }));\n }\n\n handleSettingsSave(): void {\n this.setState(({ column, selectedColumn, value }) => ({\n column: selectedColumn,\n // Reset value if column changed\n value: column === selectedColumn ? value : '',\n isValueShown: true,\n disableCancel: false,\n }));\n }\n\n handleSettingsClick(event: MouseEvent<HTMLButtonElement>): void {\n event.stopPropagation();\n this.showSettings();\n }\n\n handleBackgroundClick(event: MouseEvent<HTMLDivElement>): void {\n // allow clicking anywhere in the background to select and focus the input\n if (event.target !== this.dropdownRef.current) {\n this.focusInput();\n }\n }\n\n sourceUpdated(): void {\n this.setState({\n column: null,\n selectedColumn: null,\n isValueShown: false,\n disableCancel: true,\n value: '',\n });\n }\n\n showSettings(): void {\n const { column } = this.state;\n this.setState({ selectedColumn: column, isValueShown: false });\n }\n\n focusInput(): void {\n this.dropdownRef.current?.focus();\n }\n\n resetValue(): void {\n this.setState({ value: '' });\n }\n\n // Called by the parent component via ref\n clearFilter(): void {\n this.resetValue();\n }\n\n // Called by the parent component via ref\n setFilterState({\n name,\n type,\n value,\n isValueShown,\n }: {\n name?: string;\n type?: string;\n value?: string;\n isValueShown?: boolean;\n }): void {\n const column = name != null && type != null ? { name, type } : null;\n this.setState(({ value: oldValue, isValueShown: oldIsValueShown }) => ({\n column,\n value: value ?? oldValue,\n isValueShown: isValueShown ?? oldIsValueShown,\n }));\n }\n\n sendUpdate = debounce(() => {\n const { onChange } = this.props;\n const { column, value, isValueShown } = this.state;\n onChange({ column, isValueShown, value: value ?? undefined });\n }, UPDATE_DEBOUNCE);\n\n render(): ReactElement {\n const {\n columns: allColumns,\n disableLinking,\n isLinkerActive,\n isLoaded,\n source,\n onColumnSelected,\n onSourceMouseEnter,\n onSourceMouseLeave,\n values,\n settingsError,\n } = this.props;\n const { column, disableCancel, id, isValueShown, selectedColumn, value } =\n this.state;\n const columnSelectionDisabled = source === null;\n const columns = this.getCompatibleColumns(source, allColumns);\n const isLinked = source != null;\n const sourceButtonLabel =\n source?.columnName ?? DropdownFilter.SOURCE_BUTTON_PLACEHOLDER;\n const filterTitle = column != null ? `${column.name} Filter` : null;\n const [columnOptions, selectedIndex] = this.getColumnOptions(\n columns,\n selectedColumn\n );\n const valueOptions = this.getValueOptions(values);\n const selectedOption = this.getSelectedOptionIndex(values, value);\n const disableSave = !isLinked || selectedColumn == null;\n\n const isFlipped = isValueShown && !isLinkerActive;\n\n const sourceColumnId = `source-column-btn-${id}`;\n const filterColumnId = `filter-column-select-${id}`;\n\n return (\n <CardFlip\n className=\"dropdown-filter fill-parent-absolute\"\n isFlipped={isFlipped}\n >\n <div className=\"dropdown-filter-settings-card\">\n <div className=\"dropdown-filter-card-content\">\n <div className=\"dropdown-filter-settings-grid\">\n <label htmlFor={sourceColumnId}>Source Column</label>\n <SocketedButton\n id={sourceColumnId}\n isLinked={isLinked}\n onClick={onColumnSelected}\n onMouseEnter={onSourceMouseEnter}\n onMouseLeave={onSourceMouseLeave}\n className={DropdownFilter.SOURCE_BUTTON_CLASS_NAME}\n disabled={disableLinking}\n >\n {sourceButtonLabel}\n </SocketedButton>\n\n <div className=\"text-muted small\">\n Select a source column for the list by linking to a table.\n </div>\n\n <label htmlFor={filterColumnId}>Filter Column</label>\n <select\n id={filterColumnId}\n value={selectedIndex}\n className=\"custom-select\"\n onChange={this.handleColumnChange}\n disabled={columnSelectionDisabled}\n >\n {columnOptions}\n </select>\n <div className=\"text-muted small\">\n Dropdown filter control will apply its filter to all columns\n matching this name in this dashboard.\n </div>\n </div>\n {settingsError && (\n <div className=\"error-message text-center\">{settingsError}</div>\n )}\n {isLinked && (\n <div className=\"dropdown-filter-settings-buttons\">\n <Button\n kind=\"secondary\"\n type=\"button\"\n onClick={this.handleSettingsCancel}\n disabled={disableCancel || isValueShown || isLinkerActive}\n tooltip={\n isLinkerActive\n ? 'Cancel disabled while linker open'\n : undefined\n }\n >\n Cancel\n </Button>\n <Button\n kind=\"primary\"\n type=\"button\"\n className=\"ml-2\"\n onClick={this.handleSettingsSave}\n disabled={disableSave || isValueShown || isLinkerActive}\n tooltip={\n isLinkerActive\n ? 'Save disabled while linker open'\n : undefined\n }\n >\n Save\n </Button>\n </div>\n )}\n </div>\n </div>\n\n <div\n className=\"dropdown-filter-value-card\"\n onClick={this.handleBackgroundClick}\n data-testid=\"dropdown-filter-value-background\"\n >\n {isLoaded && (\n <>\n <div className=\"dropdown-filter-column\">\n <div className=\"dropdown-filter-column-title\">\n {filterTitle}\n </div>\n </div>\n <div className=\"dropdown-filter-card-content\">\n <div className=\"dropdown-filter-value-input d-flex flex-column justify-content-center\">\n <select\n className=\"custom-select\"\n value={selectedOption}\n ref={this.dropdownRef}\n onChange={this.handleValueChange}\n onKeyPress={this.handleDropdownKeyPress}\n title=\"Select Value\"\n >\n {valueOptions}\n </select>\n </div>\n {settingsError && (\n <div className=\"error-message mt-3 text-center\">\n {settingsError}\n </div>\n )}\n </div>\n <div className=\"dropdown-filter-menu\">\n <Button\n kind=\"ghost\"\n className=\"m-2 px-2\"\n onClick={this.handleSettingsClick}\n icon={<FontAwesomeIcon icon={vsGear} transform=\"grow-4\" />}\n tooltip=\"Dropdown Filter Settings\"\n />\n </div>\n </>\n )}\n </div>\n </CardFlip>\n );\n }\n}\n\nexport default DropdownFilter;\n"],"mappings":"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"}
1
+ {"version":3,"file":"DropdownFilter.js","names":["React","Component","FontAwesomeIcon","Button","CardFlip","SocketedButton","vsGear","TableUtils","memoizee","memoize","debounce","shortid","Log","log","module","UPDATE_DEBOUNCE","DropdownFilter","constructor","props","source","columns","filter","type","undefined","isCompatibleType","columnType","selectedColumn","selectedIndex","options","push","forEach","columnItem","index","getItemLabel","name","values","value","indexOf","PLACEHOLDER","map","val","length","shortType","substring","lastIndexOf","onChange","column","isValueShown","state","handleColumnChange","bind","handleSettingsCancel","handleSettingsClick","handleSettingsSave","handleBackgroundClick","handleDropdownKeyPress","handleValueChange","dropdownRef","createRef","id","disableCancel","componentDidUpdate","prevProps","prevState","isLoaded","sourceUpdated","includes","resetValue","focusInput","sendUpdate","componentWillUnmount","flush","event","target","debug2","parseInt","setState","allColumns","getCompatibleColumns","key","preventDefault","stopPropagation","valueIndex","showSettings","current","focus","clearFilter","setFilterState","oldValue","oldIsValueShown","render","disableLinking","isLinkerActive","onColumnSelected","onSourceMouseEnter","onSourceMouseLeave","settingsError","columnSelectionDisabled","isLinked","sourceButtonLabel","columnName","SOURCE_BUTTON_PLACEHOLDER","filterTitle","columnOptions","getColumnOptions","valueOptions","getValueOptions","selectedOption","getSelectedOptionIndex","disableSave","isFlipped","sourceColumnId","filterColumnId","SOURCE_BUTTON_CLASS_NAME"],"sources":["../../../src/controls/dropdown-filter/DropdownFilter.tsx"],"sourcesContent":["/* eslint-disable jsx-a11y/click-events-have-key-events */\n/* eslint-disable jsx-a11y/no-static-element-interactions */\n// background click is just a convenience method, not an actual a11y issue\n\nimport React, {\n ChangeEvent,\n Component,\n KeyboardEvent,\n MouseEvent,\n ReactElement,\n RefObject,\n} from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { Button, CardFlip, SocketedButton } from '@deephaven/components';\nimport { vsGear } from '@deephaven/icons';\nimport type { Column } from '@deephaven/jsapi-types';\nimport { TableUtils } from '@deephaven/jsapi-utils';\nimport memoizee from 'memoizee';\nimport memoize from 'memoize-one';\nimport debounce from 'lodash.debounce';\nimport shortid from 'shortid';\nimport Log from '@deephaven/log';\nimport './DropdownFilter.scss';\nimport { LinkPoint } from '../../linker/LinkerUtils';\n\nconst log = Log.module('DropdownFilter');\nconst UPDATE_DEBOUNCE = 150;\n\nexport interface DropdownFilterColumn {\n name: string;\n type: string;\n}\n\nexport interface DropdownFilterProps {\n column: DropdownFilterColumn;\n columns: DropdownFilterColumn[];\n onSourceMouseEnter: () => void;\n onSourceMouseLeave: () => void;\n disableLinking: boolean;\n isLinkerActive: boolean;\n isLoaded: boolean;\n isValueShown: boolean;\n settingsError: string;\n source: LinkPoint;\n value: string | null;\n values: (string | null)[];\n onChange: (change: {\n column: Partial<Column> | null;\n isValueShown?: boolean;\n value?: string;\n }) => void;\n onColumnSelected: () => void;\n}\n\ninterface DropdownFilterState {\n column: DropdownFilterColumn | null;\n selectedColumn: DropdownFilterColumn | null;\n disableCancel: boolean;\n isValueShown: boolean;\n value: string | null;\n id: string;\n}\n\nexport class DropdownFilter extends Component<\n DropdownFilterProps,\n DropdownFilterState\n> {\n static defaultProps = {\n column: null,\n disableLinking: false,\n isLinkerActive: false,\n isLoaded: false,\n isValueShown: false,\n\n settingsError: null,\n source: null,\n value: '',\n values: [],\n onColumnSelected: (): void => undefined,\n onSourceMouseEnter: (): void => undefined,\n onSourceMouseLeave: (): void => undefined,\n };\n\n static PLACEHOLDER = 'Select a value...';\n\n static SOURCE_BUTTON_CLASS_NAME = 'btn-dropdown-filter-selector';\n\n static SOURCE_BUTTON_PLACEHOLDER = 'Select a column';\n\n constructor(props: DropdownFilterProps) {\n super(props);\n\n this.handleColumnChange = this.handleColumnChange.bind(this);\n this.handleSettingsCancel = this.handleSettingsCancel.bind(this);\n this.handleSettingsClick = this.handleSettingsClick.bind(this);\n this.handleSettingsSave = this.handleSettingsSave.bind(this);\n this.handleBackgroundClick = this.handleBackgroundClick.bind(this);\n this.handleDropdownKeyPress = this.handleDropdownKeyPress.bind(this);\n this.handleValueChange = this.handleValueChange.bind(this);\n\n this.dropdownRef = React.createRef();\n\n const { column, isValueShown, value } = props;\n this.state = {\n column,\n id: shortid(),\n selectedColumn: column,\n disableCancel: !isValueShown,\n isValueShown,\n value,\n };\n }\n\n componentDidUpdate(\n prevProps: DropdownFilterProps,\n prevState: DropdownFilterState\n ): void {\n const { source, values, isLoaded } = this.props;\n const { column, value, isValueShown } = this.state;\n\n if (isLoaded) {\n if (source !== prevProps.source) {\n this.sourceUpdated();\n }\n\n if (\n values !== prevProps.values &&\n value !== '' &&\n !values.includes(value)\n ) {\n // Value list loaded, but doesn't contain the current value\n this.resetValue();\n }\n\n if (isValueShown !== prevState.isValueShown) {\n if (isValueShown) {\n this.focusInput();\n }\n }\n\n if (\n column !== prevState.column ||\n value !== prevState.value ||\n isValueShown !== prevState.isValueShown\n ) {\n this.sendUpdate();\n }\n }\n }\n\n componentWillUnmount(): void {\n this.sendUpdate.flush();\n }\n\n dropdownRef: RefObject<HTMLSelectElement>;\n\n getCompatibleColumns = memoize(\n (source: LinkPoint, columns: DropdownFilterColumn[]) =>\n source != null\n ? columns.filter(\n ({ type }) =>\n type !== undefined &&\n TableUtils.isCompatibleType(type, source.columnType)\n )\n : []\n );\n\n getColumnOptions = memoize(\n (\n columns: DropdownFilterColumn[],\n selectedColumn: DropdownFilterColumn | null\n ): [JSX.Element[], number] => {\n let selectedIndex = -1;\n const options = [];\n options.push(\n <option key=\"placeholder\" value=\"-1\">\n Select a column\n </option>\n );\n columns.forEach((columnItem, index) => {\n options.push(\n <option key={`${columnItem.name}/${columnItem.type}`} value={index}>\n {this.getItemLabel(columns, index)}\n </option>\n );\n if (\n selectedColumn !== null &&\n columnItem.name === selectedColumn.name &&\n columnItem.type === selectedColumn.type\n ) {\n selectedIndex = index;\n }\n });\n return [options, selectedIndex];\n }\n );\n\n getSelectedOptionIndex = memoize(\n (values: (string | null)[], value: string | null) => values.indexOf(value)\n );\n\n getValueOptions = memoize((values: (string | null)[]) => [\n <option value=\"-1\" key=\"-1\">\n {DropdownFilter.PLACEHOLDER}\n </option>,\n ...values.map((val, index) => (\n <option\n value={index}\n // eslint-disable-next-line react/no-array-index-key\n key={`${index}/${val}`}\n >\n {val ?? '(null)'}\n </option>\n )),\n ]);\n\n getItemLabel = memoizee((columns: DropdownFilterColumn[], index: number) => {\n const { name, type } = columns[index];\n\n if (\n (index > 0 && columns[index - 1].name === name) ||\n (index < columns.length - 1 && columns[index + 1].name === name)\n ) {\n const shortType = type.substring(type.lastIndexOf('.') + 1);\n return `${name} (${shortType})`;\n }\n\n return name;\n });\n\n handleColumnChange(event: ChangeEvent<HTMLSelectElement>): void {\n const { value } = event.target;\n log.debug2('handleColumnChange', value);\n if (value != null && parseInt(value, 10) < 0) {\n this.setState({\n selectedColumn: null,\n });\n return;\n }\n const { columns: allColumns, source } = this.props;\n const columns = this.getCompatibleColumns(source, allColumns);\n this.setState({\n selectedColumn: columns[parseInt(value, 10)],\n });\n }\n\n handleDropdownKeyPress(event: KeyboardEvent<HTMLSelectElement>): void {\n if (event.key === 'Enter') {\n event.preventDefault();\n event.stopPropagation();\n\n log.debug2('handleDropdownKeyPress');\n\n this.sendUpdate();\n this.sendUpdate.flush();\n }\n }\n\n handleValueChange(event: ChangeEvent<HTMLSelectElement>): void {\n const { value: valueIndex } = event.target;\n const index = parseInt(valueIndex, 10);\n // Default empty string value for 'clear filter'\n let value: string | null = '';\n const { values } = this.props;\n if (index >= 0 && index < values.length) {\n value = values[index];\n } else {\n log.debug2('Selected default item');\n }\n\n log.debug2('handleValueChange', value);\n\n this.setState({ value });\n }\n\n handleSettingsCancel(): void {\n this.setState(({ column }) => ({\n selectedColumn: column,\n isValueShown: true,\n }));\n }\n\n handleSettingsSave(): void {\n this.setState(({ column, selectedColumn, value }) => ({\n column: selectedColumn,\n // Reset value if column changed\n value: column === selectedColumn ? value : '',\n isValueShown: true,\n disableCancel: false,\n }));\n }\n\n handleSettingsClick(event: MouseEvent<HTMLButtonElement>): void {\n event.stopPropagation();\n this.showSettings();\n }\n\n handleBackgroundClick(event: MouseEvent<HTMLDivElement>): void {\n // allow clicking anywhere in the background to select and focus the input\n if (event.target !== this.dropdownRef.current) {\n this.focusInput();\n }\n }\n\n sourceUpdated(): void {\n this.setState({\n column: null,\n selectedColumn: null,\n isValueShown: false,\n disableCancel: true,\n value: '',\n });\n }\n\n showSettings(): void {\n const { column } = this.state;\n this.setState({ selectedColumn: column, isValueShown: false });\n }\n\n focusInput(): void {\n this.dropdownRef.current?.focus();\n }\n\n resetValue(): void {\n this.setState({ value: '' });\n }\n\n // Called by the parent component via ref\n clearFilter(): void {\n this.resetValue();\n }\n\n // Called by the parent component via ref\n setFilterState({\n name,\n type,\n value,\n isValueShown,\n }: {\n name?: string;\n type?: string;\n value?: string;\n isValueShown?: boolean;\n }): void {\n const column = name != null && type != null ? { name, type } : null;\n this.setState(({ value: oldValue, isValueShown: oldIsValueShown }) => ({\n column,\n value: value ?? oldValue,\n isValueShown: isValueShown ?? oldIsValueShown,\n }));\n }\n\n sendUpdate = debounce(() => {\n const { onChange } = this.props;\n const { column, value, isValueShown } = this.state;\n onChange({ column, isValueShown, value: value ?? undefined });\n }, UPDATE_DEBOUNCE);\n\n render(): ReactElement {\n const {\n columns: allColumns,\n disableLinking,\n isLinkerActive,\n isLoaded,\n source,\n onColumnSelected,\n onSourceMouseEnter,\n onSourceMouseLeave,\n values,\n settingsError,\n } = this.props;\n const { column, disableCancel, id, isValueShown, selectedColumn, value } =\n this.state;\n const columnSelectionDisabled = source === null;\n const columns = this.getCompatibleColumns(source, allColumns);\n const isLinked = source != null;\n const sourceButtonLabel =\n source?.columnName ?? DropdownFilter.SOURCE_BUTTON_PLACEHOLDER;\n const filterTitle = column != null ? `${column.name} Filter` : null;\n const [columnOptions, selectedIndex] = this.getColumnOptions(\n columns,\n selectedColumn\n );\n const valueOptions = this.getValueOptions(values);\n const selectedOption = this.getSelectedOptionIndex(values, value);\n const disableSave = !isLinked || selectedColumn == null;\n\n const isFlipped = isValueShown && !isLinkerActive;\n\n const sourceColumnId = `source-column-btn-${id}`;\n const filterColumnId = `filter-column-select-${id}`;\n\n return (\n <CardFlip\n className=\"dropdown-filter fill-parent-absolute\"\n isFlipped={isFlipped}\n >\n <div className=\"dropdown-filter-settings-card\">\n <div className=\"dropdown-filter-card-content\">\n <div className=\"dropdown-filter-settings-grid\">\n <label htmlFor={sourceColumnId}>Source Column</label>\n <SocketedButton\n id={sourceColumnId}\n isLinked={isLinked}\n onClick={onColumnSelected}\n onMouseEnter={onSourceMouseEnter}\n onMouseLeave={onSourceMouseLeave}\n className={DropdownFilter.SOURCE_BUTTON_CLASS_NAME}\n disabled={disableLinking}\n >\n {sourceButtonLabel}\n </SocketedButton>\n\n <div className=\"text-muted small\">\n Select a source column for the list by linking to a table.\n </div>\n\n <label htmlFor={filterColumnId}>Filter Column</label>\n <select\n id={filterColumnId}\n value={selectedIndex}\n className=\"custom-select\"\n onChange={this.handleColumnChange}\n disabled={columnSelectionDisabled}\n >\n {columnOptions}\n </select>\n <div className=\"text-muted small\">\n Dropdown filter control will apply its filter to all columns\n matching this name in this dashboard.\n </div>\n </div>\n {settingsError && (\n <div className=\"error-message text-center\">{settingsError}</div>\n )}\n {isLinked && (\n <div className=\"dropdown-filter-settings-buttons\">\n <Button\n kind=\"secondary\"\n type=\"button\"\n onClick={this.handleSettingsCancel}\n disabled={disableCancel || isValueShown || isLinkerActive}\n tooltip={\n isLinkerActive\n ? 'Cancel disabled while linker open'\n : undefined\n }\n >\n Cancel\n </Button>\n <Button\n kind=\"primary\"\n type=\"button\"\n className=\"ml-2\"\n onClick={this.handleSettingsSave}\n disabled={disableSave || isValueShown || isLinkerActive}\n tooltip={\n isLinkerActive\n ? 'Save disabled while linker open'\n : undefined\n }\n >\n Save\n </Button>\n </div>\n )}\n </div>\n </div>\n\n <div\n className=\"dropdown-filter-value-card\"\n onClick={this.handleBackgroundClick}\n data-testid=\"dropdown-filter-value-background\"\n >\n {isLoaded && (\n <>\n <div className=\"dropdown-filter-column\">\n <div className=\"dropdown-filter-column-title\">\n {filterTitle}\n </div>\n </div>\n <div className=\"dropdown-filter-card-content\">\n <div className=\"dropdown-filter-value-input d-flex flex-column justify-content-center\">\n <select\n className=\"custom-select\"\n value={selectedOption}\n ref={this.dropdownRef}\n onChange={this.handleValueChange}\n onKeyPress={this.handleDropdownKeyPress}\n title=\"Select Value\"\n >\n {valueOptions}\n </select>\n </div>\n {settingsError && (\n <div className=\"error-message mt-3 text-center\">\n {settingsError}\n </div>\n )}\n </div>\n <div className=\"dropdown-filter-menu\">\n <Button\n kind=\"ghost\"\n className=\"m-2 px-2\"\n onClick={this.handleSettingsClick}\n icon={<FontAwesomeIcon icon={vsGear} transform=\"grow-4\" />}\n tooltip=\"Dropdown Filter Settings\"\n />\n </div>\n </>\n )}\n </div>\n </CardFlip>\n );\n }\n}\n\nexport default DropdownFilter;\n"],"mappings":"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"}
@@ -13,6 +13,8 @@ import memoizee from 'memoizee';
13
13
  import debounce from 'lodash.debounce';
14
14
  import Log from '@deephaven/log';
15
15
  import "./InputFilter.css";
16
+ import { jsx as _jsx } from "react/jsx-runtime";
17
+ import { jsxs as _jsxs } from "react/jsx-runtime";
16
18
  var log = Log.module('InputFilter');
17
19
  var UPDATE_DEBOUNCE = 150;
18
20
  class InputFilter extends Component {
@@ -213,72 +215,90 @@ class InputFilter extends Component {
213
215
  var columnIndex = columns.findIndex(item => item.name === column.name && item.type === column.type);
214
216
  titleLabel = columnIndex >= 0 ? this.getItemLabel(columns, columnIndex) : column.name;
215
217
  }
216
- return /*#__PURE__*/React.createElement(CardFlip, {
218
+ return /*#__PURE__*/_jsxs(CardFlip, {
217
219
  className: "input-filter fill-parent-absolute",
218
- isFlipped: isValueShown !== null && isValueShown !== void 0 ? isValueShown : false
219
- }, /*#__PURE__*/React.createElement("div", {
220
- className: "input-filter-settings-card"
221
- }, /*#__PURE__*/React.createElement("div", {
222
- className: "input-filter-settings-content"
223
- }, /*#__PURE__*/React.createElement("div", {
224
- className: "input-filter-settings-grid"
225
- }, /*#__PURE__*/React.createElement("label", null, "Filter Column"), /*#__PURE__*/React.createElement("select", {
226
- value: columns.findIndex(item => item.name === (selectedColumn === null || selectedColumn === void 0 ? void 0 : selectedColumn.name) && item.type === (selectedColumn === null || selectedColumn === void 0 ? void 0 : selectedColumn.type)),
227
- className: "custom-select",
228
- onChange: this.handleColumnChange
229
- }, columns.map((columnItem, index) => /*#__PURE__*/React.createElement("option", {
230
- key: "".concat(columnItem.name, "/").concat(columnItem.type),
231
- value: index
232
- }, this.getItemLabel(columns, index))), columns.length === 0 && /*#__PURE__*/React.createElement("option", {
233
- value: "-1",
234
- disabled: true
235
- }, "No Available Columns")), /*#__PURE__*/React.createElement("div", {
236
- className: "text-muted small"
237
- }, "Input filter control will apply its filter to all columns matching this name in this dashboard.")), /*#__PURE__*/React.createElement("div", {
238
- className: "input-filter-settings-buttons"
239
- }, /*#__PURE__*/React.createElement(Button, {
240
- kind: "secondary",
241
- onClick: this.handleSettingsCancel,
242
- disabled: column == null
243
- }, "Cancel"), /*#__PURE__*/React.createElement(Button, {
244
- kind: "primary",
245
- className: "ml-2",
246
- onClick: this.handleSettingsSave,
247
- disabled: selectedColumn == null
248
- }, "Save")))), /*#__PURE__*/React.createElement("div", {
249
- className: "input-filter-value-card",
250
- onClick: this.handleBackgroundClick
251
- }, /*#__PURE__*/React.createElement("div", {
252
- className: "input-filter-column"
253
- }, /*#__PURE__*/React.createElement("div", {
254
- className: "input-filter-column-title"
255
- }, titleLabel, " Filter")), /*#__PURE__*/React.createElement("div", {
256
- className: "d-flex justify-content-center align-items-center h-100 w-100"
257
- }, /*#__PURE__*/React.createElement("div", {
258
- className: "input-filter-value-input d-flex flex-column justify-content-center"
259
- }, /*#__PURE__*/React.createElement("input", {
260
- type: "text",
261
- ref: this.inputRef,
262
- placeholder: InputFilter.PLACEHOLDER,
263
- value: value !== null && value !== void 0 ? value : '',
264
- onChange: this.handleValueChange,
265
- onKeyPress: this.handleInputKeyPress,
266
- style: {
267
- width: "".concat(inputLength + 3, "ch")
268
- },
269
- spellCheck: "false"
270
- }))), /*#__PURE__*/React.createElement("div", {
271
- className: "input-filter-menu"
272
- }, /*#__PURE__*/React.createElement(Button, {
273
- kind: "ghost",
274
- className: "m-2 px-2",
275
- onClick: this.handleSettingsClick,
276
- icon: /*#__PURE__*/React.createElement(FontAwesomeIcon, {
277
- icon: vsGear,
278
- transform: "grow-4"
279
- }),
280
- tooltip: "Input Filter Settings"
281
- }))));
220
+ isFlipped: isValueShown !== null && isValueShown !== void 0 ? isValueShown : false,
221
+ children: [/*#__PURE__*/_jsx("div", {
222
+ className: "input-filter-settings-card",
223
+ children: /*#__PURE__*/_jsxs("div", {
224
+ className: "input-filter-settings-content",
225
+ children: [/*#__PURE__*/_jsxs("div", {
226
+ className: "input-filter-settings-grid",
227
+ children: [/*#__PURE__*/_jsx("label", {
228
+ children: "Filter Column"
229
+ }), /*#__PURE__*/_jsxs("select", {
230
+ value: columns.findIndex(item => item.name === (selectedColumn === null || selectedColumn === void 0 ? void 0 : selectedColumn.name) && item.type === (selectedColumn === null || selectedColumn === void 0 ? void 0 : selectedColumn.type)),
231
+ className: "custom-select",
232
+ onChange: this.handleColumnChange,
233
+ children: [columns.map((columnItem, index) => /*#__PURE__*/_jsx("option", {
234
+ value: index,
235
+ children: this.getItemLabel(columns, index)
236
+ }, "".concat(columnItem.name, "/").concat(columnItem.type))), columns.length === 0 && /*#__PURE__*/_jsx("option", {
237
+ value: "-1",
238
+ disabled: true,
239
+ children: "No Available Columns"
240
+ })]
241
+ }), /*#__PURE__*/_jsx("div", {
242
+ className: "text-muted small",
243
+ children: "Input filter control will apply its filter to all columns matching this name in this dashboard."
244
+ })]
245
+ }), /*#__PURE__*/_jsxs("div", {
246
+ className: "input-filter-settings-buttons",
247
+ children: [/*#__PURE__*/_jsx(Button, {
248
+ kind: "secondary",
249
+ onClick: this.handleSettingsCancel,
250
+ disabled: column == null,
251
+ children: "Cancel"
252
+ }), /*#__PURE__*/_jsx(Button, {
253
+ kind: "primary",
254
+ className: "ml-2",
255
+ onClick: this.handleSettingsSave,
256
+ disabled: selectedColumn == null,
257
+ children: "Save"
258
+ })]
259
+ })]
260
+ })
261
+ }), /*#__PURE__*/_jsxs("div", {
262
+ className: "input-filter-value-card",
263
+ onClick: this.handleBackgroundClick,
264
+ children: [/*#__PURE__*/_jsx("div", {
265
+ className: "input-filter-column",
266
+ children: /*#__PURE__*/_jsxs("div", {
267
+ className: "input-filter-column-title",
268
+ children: [titleLabel, " Filter"]
269
+ })
270
+ }), /*#__PURE__*/_jsx("div", {
271
+ className: "d-flex justify-content-center align-items-center h-100 w-100",
272
+ children: /*#__PURE__*/_jsx("div", {
273
+ className: "input-filter-value-input d-flex flex-column justify-content-center",
274
+ children: /*#__PURE__*/_jsx("input", {
275
+ type: "text",
276
+ ref: this.inputRef,
277
+ placeholder: InputFilter.PLACEHOLDER,
278
+ value: value !== null && value !== void 0 ? value : '',
279
+ onChange: this.handleValueChange,
280
+ onKeyPress: this.handleInputKeyPress,
281
+ style: {
282
+ width: "".concat(inputLength + 3, "ch")
283
+ },
284
+ spellCheck: "false"
285
+ })
286
+ })
287
+ }), /*#__PURE__*/_jsx("div", {
288
+ className: "input-filter-menu",
289
+ children: /*#__PURE__*/_jsx(Button, {
290
+ kind: "ghost",
291
+ className: "m-2 px-2",
292
+ onClick: this.handleSettingsClick,
293
+ icon: /*#__PURE__*/_jsx(FontAwesomeIcon, {
294
+ icon: vsGear,
295
+ transform: "grow-4"
296
+ }),
297
+ tooltip: "Input Filter Settings"
298
+ })
299
+ })]
300
+ })]
301
+ });
282
302
  }
283
303
  }
284
304
  _defineProperty(InputFilter, "PLACEHOLDER", 'Enter value...');