@deephaven/dashboard-core-plugins 0.46.1-beta.2 → 0.46.1-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/LinkerPlugin.js +2 -1
- package/dist/LinkerPlugin.js.map +1 -1
- package/dist/controls/dropdown-filter/DropdownFilter.js +120 -93
- package/dist/controls/dropdown-filter/DropdownFilter.js.map +1 -1
- package/dist/controls/input-filter/InputFilter.js +85 -65
- package/dist/controls/input-filter/InputFilter.js.map +1 -1
- package/dist/controls/markdown/MarkdownContainer.js +15 -9
- package/dist/controls/markdown/MarkdownContainer.js.map +1 -1
- package/dist/controls/markdown/MarkdownEditor.js +24 -16
- package/dist/controls/markdown/MarkdownEditor.js.map +1 -1
- package/dist/controls/markdown/MarkdownStartPage.js +67 -46
- package/dist/controls/markdown/MarkdownStartPage.js.map +1 -1
- package/dist/linker/Linker.js +17 -15
- package/dist/linker/Linker.js.map +1 -1
- package/dist/linker/LinkerLink.js +80 -65
- package/dist/linker/LinkerLink.js.map +1 -1
- package/dist/linker/LinkerOverlayContent.js +75 -65
- package/dist/linker/LinkerOverlayContent.js.map +1 -1
- package/dist/panels/ChartColumnSelectorOverlay.js +25 -19
- package/dist/panels/ChartColumnSelectorOverlay.js.map +1 -1
- package/dist/panels/ChartFilterOverlay.js +50 -33
- package/dist/panels/ChartFilterOverlay.js.map +1 -1
- package/dist/panels/ChartPanel.js +51 -44
- package/dist/panels/ChartPanel.js.map +1 -1
- package/dist/panels/CommandHistoryPanel.js +21 -14
- package/dist/panels/CommandHistoryPanel.js.map +1 -1
- package/dist/panels/ConsolePanel.js +50 -24
- package/dist/panels/ConsolePanel.js.map +1 -1
- package/dist/panels/DropdownFilterPanel.js +25 -22
- package/dist/panels/DropdownFilterPanel.js.map +1 -1
- package/dist/panels/FileExplorerPanel.js +24 -21
- package/dist/panels/FileExplorerPanel.js.map +1 -1
- package/dist/panels/FilterSetManager.js +227 -185
- package/dist/panels/FilterSetManager.js.map +1 -1
- package/dist/panels/FilterSetManagerPanel.js +16 -13
- package/dist/panels/FilterSetManagerPanel.js.map +1 -1
- package/dist/panels/InputFilterPanel.js +12 -10
- package/dist/panels/InputFilterPanel.js.map +1 -1
- package/dist/panels/IrisGridPanel.js +76 -72
- package/dist/panels/IrisGridPanel.js.map +1 -1
- package/dist/panels/IrisGridPanelTooltip.js +18 -9
- package/dist/panels/IrisGridPanelTooltip.js.map +1 -1
- package/dist/panels/LogPanel.js +14 -10
- package/dist/panels/LogPanel.js.map +1 -1
- package/dist/panels/MarkdownNotebook.js +64 -51
- package/dist/panels/MarkdownNotebook.js.map +1 -1
- package/dist/panels/MarkdownPanel.js +21 -18
- package/dist/panels/MarkdownPanel.js.map +1 -1
- package/dist/panels/NotebookPanel.js +126 -108
- package/dist/panels/NotebookPanel.js.map +1 -1
- package/dist/panels/PandasPanel.js +21 -12
- package/dist/panels/PandasPanel.js.map +1 -1
- package/dist/panels/Panel.js +30 -23
- package/dist/panels/Panel.js.map +1 -1
- package/dist/panels/PanelContextMenu.js +2 -1
- package/dist/panels/PanelContextMenu.js.map +1 -1
- package/dist/panels/RenameDialog.js +42 -31
- package/dist/panels/RenameDialog.js.map +1 -1
- package/dist/panels/WidgetPanel.js +9 -6
- package/dist/panels/WidgetPanel.js.map +1 -1
- package/dist/panels/WidgetPanelTooltip.js +31 -19
- package/dist/panels/WidgetPanelTooltip.js.map +1 -1
- package/package.json +22 -22
package/dist/LinkerPlugin.js
CHANGED
|
@@ -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__*/
|
|
12
|
+
return /*#__PURE__*/_jsx(Linker, {
|
|
12
13
|
layout: layout,
|
|
13
14
|
localDashboardId: id,
|
|
14
15
|
panelManager: panelManager
|
package/dist/LinkerPlugin.js.map
CHANGED
|
@@ -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,
|
|
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__*/
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}, "
|
|
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__*/
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
},
|
|
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__*/
|
|
53
|
+
_defineProperty(this, "getValueOptions", memoize(values => [/*#__PURE__*/_jsx("option", {
|
|
51
54
|
value: "-1",
|
|
52
|
-
|
|
53
|
-
},
|
|
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
|
-
|
|
58
|
-
},
|
|
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__*/
|
|
319
|
+
return /*#__PURE__*/_jsxs(CardFlip, {
|
|
317
320
|
className: "dropdown-filter fill-parent-absolute",
|
|
318
|
-
isFlipped: isFlipped
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
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":";;;AAAA;AACA;AACA;;AAEA,OAAOA,KAAK,IAEVC,SAAS,QAKJ,OAAO;AACd,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,MAAM,EAAEC,QAAQ,EAAEC,cAAc,QAAQ,uBAAuB;AACxE,SAASC,MAAM,QAAQ,kBAAkB;AAEzC,SAASC,UAAU,QAAQ,wBAAwB;AACnD,OAAOC,QAAQ,MAAM,UAAU;AAC/B,OAAOC,OAAO,MAAM,aAAa;AACjC,OAAOC,QAAQ,MAAM,iBAAiB;AACtC,OAAOC,OAAO,MAAM,SAAS;AAC7B,OAAOC,GAAG,MAAM,gBAAgB;AAAC;AAAA;AAAA;AAAA;AAIjC,IAAMC,GAAG,GAAGD,GAAG,CAACE,MAAM,CAAC,gBAAgB,CAAC;AACxC,IAAMC,eAAe,GAAG,GAAG;AAqC3B,OAAO,MAAMC,cAAc,SAASf,SAAS,CAG3C;EAuBAgB,WAAW,CAACC,KAA0B,EAAE;IACtC,KAAK,CAACA,KAAK,CAAC;IAAC;IAAA,8CAkEQT,OAAO,CAC5B,CAACU,MAAiB,EAAEC,OAA+B,KACjDD,MAAM,IAAI,IAAI,GACVC,OAAO,CAACC,MAAM,CACZ;MAAA,IAAC;QAAEC;MAAK,CAAC;MAAA,OACPA,IAAI,KAAKC,SAAS,IAClBhB,UAAU,CAACiB,gBAAgB,CAACF,IAAI,EAAEH,MAAM,CAACM,UAAU,CAAC;IAAA,EACvD,GACD,EAAE,CACT;IAAA,0CAEkBhB,OAAO,CACxB,CACEW,OAA+B,EAC/BM,cAA2C,KACf;MAC5B,IAAIC,aAAa,GAAG,CAAC,CAAC;MACtB,IAAMC,OAAO,GAAG,EAAE;MAClBA,OAAO,CAACC,IAAI,eACV;QAA0B,KAAK,EAAC,IAAI;QAAA,UAAC;MAErC,GAFY,aAAa,CAEhB,CACV;MACDT,OAAO,CAACU,OAAO,CAAC,CAACC,UAAU,EAAEC,KAAK,KAAK;QACrCJ,OAAO,CAACC,IAAI,eACV;UAAsD,KAAK,EAAEG,KAAM;UAAA,UAChE,IAAI,CAACC,YAAY,CAACb,OAAO,EAAEY,KAAK;QAAC,aADpBD,UAAU,CAACG,IAAI,cAAIH,UAAU,CAACT,IAAI,EAEzC,CACV;QACD,IACEI,cAAc,KAAK,IAAI,IACvBK,UAAU,CAACG,IAAI,KAAKR,cAAc,CAACQ,IAAI,IACvCH,UAAU,CAACT,IAAI,KAAKI,cAAc,CAACJ,IAAI,EACvC;UACAK,aAAa,GAAGK,KAAK;QACvB;MACF,CAAC,CAAC;MACF,OAAO,CAACJ,OAAO,EAAED,aAAa,CAAC;IACjC,CAAC,CACF;IAAA,gDAEwBlB,OAAO,CAC9B,CAAC0B,MAAyB,EAAEC,KAAoB,KAAKD,MAAM,CAACE,OAAO,CAACD,KAAK,CAAC,CAC3E;IAAA,yCAEiB3B,OAAO,CAAE0B,MAAyB,IAAK,cACvD;MAAQ,KAAK,EAAC,IAAI;MAAA,UACfnB,cAAc,CAACsB;IAAW,GADN,IAAI,CAElB,EACT,GAAGH,MAAM,CAACI,GAAG,CAAC,CAACC,GAAG,EAAER,KAAK,kBACvB;MACE,KAAK,EAAEA;MACP;MAAA;MAAA,UAGCQ,GAAG,aAAHA,GAAG,cAAHA,GAAG,GAAI;IAAQ,aAFRR,KAAK,cAAIQ,GAAG,EAIvB,CAAC,CACH,CAAC;IAAA,sCAEahC,QAAQ,CAAC,CAACY,OAA+B,EAAEY,KAAa,KAAK;MAC1E,IAAM;QAAEE,IAAI;QAAEZ;MAAK,CAAC,GAAGF,OAAO,CAACY,KAAK,CAAC;MAErC,IACGA,KAAK,GAAG,CAAC,IAAIZ,OAAO,CAACY,KAAK,GAAG,CAAC,CAAC,CAACE,IAAI,KAAKA,IAAI,IAC7CF,KAAK,GAAGZ,OAAO,CAACqB,MAAM,GAAG,CAAC,IAAIrB,OAAO,CAACY,KAAK,GAAG,CAAC,CAAC,CAACE,IAAI,KAAKA,IAAK,EAChE;QACA,IAAMQ,SAAS,GAAGpB,IAAI,CAACqB,SAAS,CAACrB,IAAI,CAACsB,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3D,iBAAUV,IAAI,eAAKQ,SAAS;MAC9B;MAEA,OAAOR,IAAI;IACb,CAAC,CAAC;IAAA,oCA4HWxB,QAAQ,CAAC,MAAM;MAC1B,IAAM;QAAEmC;MAAS,CAAC,GAAG,IAAI,CAAC3B,KAAK;MAC/B,IAAM;QAAE4B,MAAM;QAAEV,KAAK;QAAEW;MAAa,CAAC,GAAG,IAAI,CAACC,KAAK;MAClDH,QAAQ,CAAC;QAAEC,MAAM;QAAEC,YAAY;QAAEX,KAAK,EAAEA,KAAK,aAALA,KAAK,cAALA,KAAK,GAAIb;MAAU,CAAC,CAAC;IAC/D,CAAC,EAAER,eAAe,CAAC;IAxQjB,IAAI,CAACkC,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAACC,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAACC,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAACD,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAACE,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAACF,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAACG,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAACH,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAACI,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAACJ,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAACK,sBAAsB,GAAG,IAAI,CAACA,sBAAsB,CAACL,IAAI,CAAC,IAAI,CAAC;IACpE,IAAI,CAACM,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACN,IAAI,CAAC,IAAI,CAAC;IAE1D,IAAI,CAACO,WAAW,gBAAGzD,KAAK,CAAC0D,SAAS,EAAE;IAEpC,IAAM;MAAEZ,MAAM,EAANA,OAAM;MAAEC,YAAY,EAAZA,aAAY;MAAEX,KAAK,EAALA;IAAM,CAAC,GAAGlB,KAAK;IAC7C,IAAI,CAAC8B,KAAK,GAAG;MACXF,MAAM,EAANA,OAAM;MACNa,EAAE,EAAEhD,OAAO,EAAE;MACbe,cAAc,EAAEoB,OAAM;MACtBc,aAAa,EAAE,CAACb,aAAY;MAC5BA,YAAY,EAAZA,aAAY;MACZX,KAAK,EAALA;IACF,CAAC;EACH;EAEAyB,kBAAkB,CAChBC,SAA8B,EAC9BC,SAA8B,EACxB;IACN,IAAM;MAAE5C,MAAM;MAAEgB,MAAM;MAAE6B;IAAS,CAAC,GAAG,IAAI,CAAC9C,KAAK;IAC/C,IAAM;MAAE4B,MAAM;MAAEV,KAAK;MAAEW;IAAa,CAAC,GAAG,IAAI,CAACC,KAAK;IAElD,IAAIgB,QAAQ,EAAE;MACZ,IAAI7C,MAAM,KAAK2C,SAAS,CAAC3C,MAAM,EAAE;QAC/B,IAAI,CAAC8C,aAAa,EAAE;MACtB;MAEA,IACE9B,MAAM,KAAK2B,SAAS,CAAC3B,MAAM,IAC3BC,KAAK,KAAK,EAAE,IACZ,CAACD,MAAM,CAAC+B,QAAQ,CAAC9B,KAAK,CAAC,EACvB;QACA;QACA,IAAI,CAAC+B,UAAU,EAAE;MACnB;MAEA,IAAIpB,YAAY,KAAKgB,SAAS,CAAChB,YAAY,EAAE;QAC3C,IAAIA,YAAY,EAAE;UAChB,IAAI,CAACqB,UAAU,EAAE;QACnB;MACF;MAEA,IACEtB,MAAM,KAAKiB,SAAS,CAACjB,MAAM,IAC3BV,KAAK,KAAK2B,SAAS,CAAC3B,KAAK,IACzBW,YAAY,KAAKgB,SAAS,CAAChB,YAAY,EACvC;QACA,IAAI,CAACsB,UAAU,EAAE;MACnB;IACF;EACF;EAEAC,oBAAoB,GAAS;IAC3B,IAAI,CAACD,UAAU,CAACE,KAAK,EAAE;EACzB;EA8EAtB,kBAAkB,CAACuB,KAAqC,EAAQ;IAC9D,IAAM;MAAEpC;IAAM,CAAC,GAAGoC,KAAK,CAACC,MAAM;IAC9B5D,GAAG,CAAC6D,MAAM,CAAC,oBAAoB,EAAEtC,KAAK,CAAC;IACvC,IAAIA,KAAK,IAAI,IAAI,IAAIuC,QAAQ,CAACvC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE;MAC5C,IAAI,CAACwC,QAAQ,CAAC;QACZlD,cAAc,EAAE;MAClB,CAAC,CAAC;MACF;IACF;IACA,IAAM;MAAEN,OAAO,EAAEyD,UAAU;MAAE1D;IAAO,CAAC,GAAG,IAAI,CAACD,KAAK;IAClD,IAAME,OAAO,GAAG,IAAI,CAAC0D,oBAAoB,CAAC3D,MAAM,EAAE0D,UAAU,CAAC;IAC7D,IAAI,CAACD,QAAQ,CAAC;MACZlD,cAAc,EAAEN,OAAO,CAACuD,QAAQ,CAACvC,KAAK,EAAE,EAAE,CAAC;IAC7C,CAAC,CAAC;EACJ;EAEAmB,sBAAsB,CAACiB,KAAuC,EAAQ;IACpE,IAAIA,KAAK,CAACO,GAAG,KAAK,OAAO,EAAE;MACzBP,KAAK,CAACQ,cAAc,EAAE;MACtBR,KAAK,CAACS,eAAe,EAAE;MAEvBpE,GAAG,CAAC6D,MAAM,CAAC,wBAAwB,CAAC;MAEpC,IAAI,CAACL,UAAU,EAAE;MACjB,IAAI,CAACA,UAAU,CAACE,KAAK,EAAE;IACzB;EACF;EAEAf,iBAAiB,CAACgB,KAAqC,EAAQ;IAC7D,IAAM;MAAEpC,KAAK,EAAE8C;IAAW,CAAC,GAAGV,KAAK,CAACC,MAAM;IAC1C,IAAMzC,KAAK,GAAG2C,QAAQ,CAACO,UAAU,EAAE,EAAE,CAAC;IACtC;IACA,IAAI9C,KAAoB,GAAG,EAAE;IAC7B,IAAM;MAAED;IAAO,CAAC,GAAG,IAAI,CAACjB,KAAK;IAC7B,IAAIc,KAAK,IAAI,CAAC,IAAIA,KAAK,GAAGG,MAAM,CAACM,MAAM,EAAE;MACvCL,KAAK,GAAGD,MAAM,CAACH,KAAK,CAAC;IACvB,CAAC,MAAM;MACLnB,GAAG,CAAC6D,MAAM,CAAC,uBAAuB,CAAC;IACrC;IAEA7D,GAAG,CAAC6D,MAAM,CAAC,mBAAmB,EAAEtC,KAAK,CAAC;IAEtC,IAAI,CAACwC,QAAQ,CAAC;MAAExC;IAAM,CAAC,CAAC;EAC1B;EAEAe,oBAAoB,GAAS;IAC3B,IAAI,CAACyB,QAAQ,CAAC;MAAA,IAAC;QAAE9B;MAAO,CAAC;MAAA,OAAM;QAC7BpB,cAAc,EAAEoB,MAAM;QACtBC,YAAY,EAAE;MAChB,CAAC;IAAA,CAAC,CAAC;EACL;EAEAM,kBAAkB,GAAS;IACzB,IAAI,CAACuB,QAAQ,CAAC;MAAA,IAAC;QAAE9B,MAAM;QAAEpB,cAAc;QAAEU;MAAM,CAAC;MAAA,OAAM;QACpDU,MAAM,EAAEpB,cAAc;QACtB;QACAU,KAAK,EAAEU,MAAM,KAAKpB,cAAc,GAAGU,KAAK,GAAG,EAAE;QAC7CW,YAAY,EAAE,IAAI;QAClBa,aAAa,EAAE;MACjB,CAAC;IAAA,CAAC,CAAC;EACL;EAEAR,mBAAmB,CAACoB,KAAoC,EAAQ;IAC9DA,KAAK,CAACS,eAAe,EAAE;IACvB,IAAI,CAACE,YAAY,EAAE;EACrB;EAEA7B,qBAAqB,CAACkB,KAAiC,EAAQ;IAC7D;IACA,IAAIA,KAAK,CAACC,MAAM,KAAK,IAAI,CAAChB,WAAW,CAAC2B,OAAO,EAAE;MAC7C,IAAI,CAAChB,UAAU,EAAE;IACnB;EACF;EAEAH,aAAa,GAAS;IACpB,IAAI,CAACW,QAAQ,CAAC;MACZ9B,MAAM,EAAE,IAAI;MACZpB,cAAc,EAAE,IAAI;MACpBqB,YAAY,EAAE,KAAK;MACnBa,aAAa,EAAE,IAAI;MACnBxB,KAAK,EAAE;IACT,CAAC,CAAC;EACJ;EAEA+C,YAAY,GAAS;IACnB,IAAM;MAAErC;IAAO,CAAC,GAAG,IAAI,CAACE,KAAK;IAC7B,IAAI,CAAC4B,QAAQ,CAAC;MAAElD,cAAc,EAAEoB,MAAM;MAAEC,YAAY,EAAE;IAAM,CAAC,CAAC;EAChE;EAEAqB,UAAU,GAAS;IAAA;IACjB,6BAAI,CAACX,WAAW,CAAC2B,OAAO,0DAAxB,sBAA0BC,KAAK,EAAE;EACnC;EAEAlB,UAAU,GAAS;IACjB,IAAI,CAACS,QAAQ,CAAC;MAAExC,KAAK,EAAE;IAAG,CAAC,CAAC;EAC9B;;EAEA;EACAkD,WAAW,GAAS;IAClB,IAAI,CAACnB,UAAU,EAAE;EACnB;;EAEA;EACAoB,cAAc,QAUL;IAAA,IAVM;MACbrD,IAAI;MACJZ,IAAI;MACJc,KAAK;MACLW;IAMF,CAAC;IACC,IAAMD,MAAM,GAAGZ,IAAI,IAAI,IAAI,IAAIZ,IAAI,IAAI,IAAI,GAAG;MAAEY,IAAI;MAAEZ;IAAK,CAAC,GAAG,IAAI;IACnE,IAAI,CAACsD,QAAQ,CAAC;MAAA,IAAC;QAAExC,KAAK,EAAEoD,QAAQ;QAAEzC,YAAY,EAAE0C;MAAgB,CAAC;MAAA,OAAM;QACrE3C,MAAM;QACNV,KAAK,EAAEA,KAAK,aAALA,KAAK,cAALA,KAAK,GAAIoD,QAAQ;QACxBzC,YAAY,EAAEA,YAAY,aAAZA,YAAY,cAAZA,YAAY,GAAI0C;MAChC,CAAC;IAAA,CAAC,CAAC;EACL;EAQAC,MAAM,GAAiB;IAAA;IACrB,IAAM;MACJtE,OAAO,EAAEyD,UAAU;MACnBc,cAAc;MACdC,cAAc;MACd5B,QAAQ;MACR7C,MAAM;MACN0E,gBAAgB;MAChBC,kBAAkB;MAClBC,kBAAkB;MAClB5D,MAAM;MACN6D;IACF,CAAC,GAAG,IAAI,CAAC9E,KAAK;IACd,IAAM;MAAE4B,MAAM;MAAEc,aAAa;MAAED,EAAE;MAAEZ,YAAY;MAAErB,cAAc;MAAEU;IAAM,CAAC,GACtE,IAAI,CAACY,KAAK;IACZ,IAAMiD,uBAAuB,GAAG9E,MAAM,KAAK,IAAI;IAC/C,IAAMC,OAAO,GAAG,IAAI,CAAC0D,oBAAoB,CAAC3D,MAAM,EAAE0D,UAAU,CAAC;IAC7D,IAAMqB,QAAQ,GAAG/E,MAAM,IAAI,IAAI;IAC/B,IAAMgF,iBAAiB,yBACrBhF,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEiF,UAAU,mEAAIpF,cAAc,CAACqF,yBAAyB;IAChE,IAAMC,WAAW,GAAGxD,MAAM,IAAI,IAAI,aAAMA,MAAM,CAACZ,IAAI,eAAY,IAAI;IACnE,IAAM,CAACqE,aAAa,EAAE5E,aAAa,CAAC,GAAG,IAAI,CAAC6E,gBAAgB,CAC1DpF,OAAO,EACPM,cAAc,CACf;IACD,IAAM+E,YAAY,GAAG,IAAI,CAACC,eAAe,CAACvE,MAAM,CAAC;IACjD,IAAMwE,cAAc,GAAG,IAAI,CAACC,sBAAsB,CAACzE,MAAM,EAAEC,KAAK,CAAC;IACjE,IAAMyE,WAAW,GAAG,CAACX,QAAQ,IAAIxE,cAAc,IAAI,IAAI;IAEvD,IAAMoF,SAAS,GAAG/D,YAAY,IAAI,CAAC6C,cAAc;IAEjD,IAAMmB,cAAc,+BAAwBpD,EAAE,CAAE;IAChD,IAAMqD,cAAc,kCAA2BrD,EAAE,CAAE;IAEnD,oBACE,MAAC,QAAQ;MACP,SAAS,EAAC,sCAAsC;MAChD,SAAS,EAAEmD,SAAU;MAAA,wBAErB;QAAK,SAAS,EAAC,+BAA+B;QAAA,uBAC5C;UAAK,SAAS,EAAC,8BAA8B;UAAA,wBAC3C;YAAK,SAAS,EAAC,+BAA+B;YAAA,wBAC5C;cAAO,OAAO,EAAEC,cAAe;cAAA,UAAC;YAAa,EAAQ,eACrD,KAAC,cAAc;cACb,EAAE,EAAEA,cAAe;cACnB,QAAQ,EAAEb,QAAS;cACnB,OAAO,EAAEL,gBAAiB;cAC1B,YAAY,EAAEC,kBAAmB;cACjC,YAAY,EAAEC,kBAAmB;cACjC,SAAS,EAAE/E,cAAc,CAACiG,wBAAyB;cACnD,QAAQ,EAAEtB,cAAe;cAAA,UAExBQ;YAAiB,EACH,eAEjB;cAAK,SAAS,EAAC,kBAAkB;cAAA,UAAC;YAElC,EAAM,eAEN;cAAO,OAAO,EAAEa,cAAe;cAAA,UAAC;YAAa,EAAQ,eACrD;cACE,EAAE,EAAEA,cAAe;cACnB,KAAK,EAAErF,aAAc;cACrB,SAAS,EAAC,eAAe;cACzB,QAAQ,EAAE,IAAI,CAACsB,kBAAmB;cAClC,QAAQ,EAAEgD,uBAAwB;cAAA,UAEjCM;YAAa,EACP,eACT;cAAK,SAAS,EAAC,kBAAkB;cAAA,UAAC;YAGlC,EAAM;UAAA,EACF,EACLP,aAAa,iBACZ;YAAK,SAAS,EAAC,2BAA2B;YAAA,UAAEA;UAAa,EAC1D,EACAE,QAAQ,iBACP;YAAK,SAAS,EAAC,kCAAkC;YAAA,wBAC/C,KAAC,MAAM;cACL,IAAI,EAAC,WAAW;cAChB,IAAI,EAAC,QAAQ;cACb,OAAO,EAAE,IAAI,CAAC/C,oBAAqB;cACnC,QAAQ,EAAES,aAAa,IAAIb,YAAY,IAAI6C,cAAe;cAC1D,OAAO,EACLA,cAAc,GACV,mCAAmC,GACnCrE,SACL;cAAA,UACF;YAED,EAAS,eACT,KAAC,MAAM;cACL,IAAI,EAAC,SAAS;cACd,IAAI,EAAC,QAAQ;cACb,SAAS,EAAC,MAAM;cAChB,OAAO,EAAE,IAAI,CAAC8B,kBAAmB;cACjC,QAAQ,EAAEwD,WAAW,IAAI9D,YAAY,IAAI6C,cAAe;cACxD,OAAO,EACLA,cAAc,GACV,iCAAiC,GACjCrE,SACL;cAAA,UACF;YAED,EAAS;UAAA,EAEZ;QAAA;MACG,EACF,eAEN;QACE,SAAS,EAAC,4BAA4B;QACtC,OAAO,EAAE,IAAI,CAAC+B,qBAAsB;QACpC,eAAY,kCAAkC;QAAA,UAE7CU,QAAQ,iBACP;UAAA,wBACE;YAAK,SAAS,EAAC,wBAAwB;YAAA,uBACrC;cAAK,SAAS,EAAC,8BAA8B;cAAA,UAC1CsC;YAAW;UACR,EACF,eACN;YAAK,SAAS,EAAC,8BAA8B;YAAA,wBAC3C;cAAK,SAAS,EAAC,uEAAuE;cAAA,uBACpF;gBACE,SAAS,EAAC,eAAe;gBACzB,KAAK,EAAEK,cAAe;gBACtB,GAAG,EAAE,IAAI,CAAClD,WAAY;gBACtB,QAAQ,EAAE,IAAI,CAACD,iBAAkB;gBACjC,UAAU,EAAE,IAAI,CAACD,sBAAuB;gBACxC,KAAK,EAAC,cAAc;gBAAA,UAEnBkD;cAAY;YACN,EACL,EACLT,aAAa,iBACZ;cAAK,SAAS,EAAC,gCAAgC;cAAA,UAC5CA;YAAa,EAEjB;UAAA,EACG,eACN;YAAK,SAAS,EAAC,sBAAsB;YAAA,uBACnC,KAAC,MAAM;cACL,IAAI,EAAC,OAAO;cACZ,SAAS,EAAC,UAAU;cACpB,OAAO,EAAE,IAAI,CAAC5C,mBAAoB;cAClC,IAAI,eAAE,KAAC,eAAe;gBAAC,IAAI,EAAE9C,MAAO;gBAAC,SAAS,EAAC;cAAQ,EAAI;cAC3D,OAAO,EAAC;YAA0B;UAClC,EACE;QAAA;MAET,EACG;IAAA,EACG;EAEf;AACF;AAAC,gBApcYU,cAAc,kBAIH;EACpB8B,MAAM,EAAE,IAAI;EACZ6C,cAAc,EAAE,KAAK;EACrBC,cAAc,EAAE,KAAK;EACrB5B,QAAQ,EAAE,KAAK;EACfjB,YAAY,EAAE,KAAK;EAEnBiD,aAAa,EAAE,IAAI;EACnB7E,MAAM,EAAE,IAAI;EACZiB,KAAK,EAAE,EAAE;EACTD,MAAM,EAAE,EAAE;EACV0D,gBAAgB,EAAE,MAAYtE,SAAS;EACvCuE,kBAAkB,EAAE,MAAYvE,SAAS;EACzCwE,kBAAkB,EAAE,MAAYxE;AAClC,CAAC;AAAA,gBAlBUP,cAAc,iBAoBJ,mBAAmB;AAAA,gBApB7BA,cAAc,8BAsBS,8BAA8B;AAAA,gBAtBrDA,cAAc,+BAwBU,iBAAiB;AA8atD,eAAeA,cAAc"}
|
|
@@ -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__*/
|
|
218
|
+
return /*#__PURE__*/_jsxs(CardFlip, {
|
|
217
219
|
className: "input-filter fill-parent-absolute",
|
|
218
|
-
isFlipped: isValueShown !== null && isValueShown !== void 0 ? isValueShown : false
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
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...');
|