@deephaven/dashboard-core-plugins 0.24.1-beta.0 → 0.24.1-beta.3

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.
@@ -7,7 +7,7 @@ export interface DropdownFilterColumn {
7
7
  name: string;
8
8
  type: string;
9
9
  }
10
- interface DropdownFilterProps {
10
+ export interface DropdownFilterProps {
11
11
  column: DropdownFilterColumn;
12
12
  columns: DropdownFilterColumn[];
13
13
  onSourceMouseEnter: () => void;
@@ -18,7 +18,7 @@ interface DropdownFilterProps {
18
18
  isValueShown: boolean;
19
19
  settingsError: string;
20
20
  source: LinkPoint;
21
- value: string;
21
+ value: string | null;
22
22
  values: (string | null)[];
23
23
  onChange: (change: {
24
24
  column: Partial<Column> | null;
@@ -33,8 +33,9 @@ interface DropdownFilterState {
33
33
  disableCancel: boolean;
34
34
  isValueShown: boolean;
35
35
  value: string | null;
36
+ id: string;
36
37
  }
37
- declare class DropdownFilter extends Component<DropdownFilterProps, DropdownFilterState> {
38
+ export declare class DropdownFilter extends Component<DropdownFilterProps, DropdownFilterState> {
38
39
  static defaultProps: {
39
40
  column: null;
40
41
  disableLinking: boolean;
@@ -68,18 +69,16 @@ declare class DropdownFilter extends Component<DropdownFilterProps, DropdownFilt
68
69
  handleSettingsSave(): void;
69
70
  handleSettingsClick(event: MouseEvent<HTMLButtonElement>): void;
70
71
  handleBackgroundClick(event: MouseEvent<HTMLDivElement>): void;
71
- handleMouseEnter(): void;
72
- handleMouseLeave(): void;
73
72
  sourceUpdated(): void;
74
73
  showSettings(): void;
75
74
  focusInput(): void;
76
75
  resetValue(): void;
77
76
  clearFilter(): void;
78
77
  setFilterState({ name, type, value, isValueShown, }: {
79
- name: string;
80
- type: string;
81
- value: string;
82
- isValueShown: boolean;
78
+ name?: string;
79
+ type?: string;
80
+ value?: string;
81
+ isValueShown?: boolean;
83
82
  }): void;
84
83
  sendUpdate: import("lodash").DebouncedFunc<() => void>;
85
84
  render(): ReactElement;
@@ -1 +1 @@
1
- {"version":3,"file":"DropdownFilter.d.ts","sourceRoot":"","sources":["../../../src/controls/dropdown-filter/DropdownFilter.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DropdownFilter.d.ts","sourceRoot":"","sources":["../../../src/controls/dropdown-filter/DropdownFilter.tsx"],"names":[],"mappings":"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"}
@@ -11,11 +11,12 @@ import { TableUtils } from '@deephaven/jsapi-utils';
11
11
  import memoizee from 'memoizee';
12
12
  import memoize from 'memoize-one';
13
13
  import debounce from 'lodash.debounce';
14
+ import shortid from 'shortid';
14
15
  import Log from '@deephaven/log';
15
16
  import "./DropdownFilter.css";
16
17
  var log = Log.module('DropdownFilter');
17
18
  var UPDATE_DEBOUNCE = 150;
18
- class DropdownFilter extends Component {
19
+ export class DropdownFilter extends Component {
19
20
  constructor(props) {
20
21
  super(props);
21
22
  _defineProperty(this, "dropdownRef", void 0);
@@ -52,7 +53,7 @@ class DropdownFilter extends Component {
52
53
  // eslint-disable-next-line react/no-array-index-key
53
54
  ,
54
55
  key: "".concat(index, "/").concat(val)
55
- }, val))]));
56
+ }, val !== null && val !== void 0 ? val : '(null)'))]));
56
57
  _defineProperty(this, "getItemLabel", memoizee((columns, index) => {
57
58
  var {
58
59
  name,
@@ -94,6 +95,7 @@ class DropdownFilter extends Component {
94
95
  } = props;
95
96
  this.state = {
96
97
  column: _column,
98
+ id: shortid(),
97
99
  selectedColumn: _column,
98
100
  disableCancel: !_isValueShown,
99
101
  isValueShown: _isValueShown,
@@ -171,13 +173,10 @@ class DropdownFilter extends Component {
171
173
  var {
172
174
  values
173
175
  } = this.props;
174
- if (index === -1) {
175
- log.debug2('Selected default item');
176
- } else if (index >= 0 && index < values.length) {
176
+ if (index >= 0 && index < values.length) {
177
177
  value = values[index];
178
178
  } else {
179
- log.error('Invalid index', index, values);
180
- return;
179
+ log.debug2('Selected default item');
181
180
  }
182
181
  log.debug2('handleValueChange', value);
183
182
  this.setState({
@@ -221,18 +220,6 @@ class DropdownFilter extends Component {
221
220
  this.focusInput();
222
221
  }
223
222
  }
224
- handleMouseEnter() {
225
- var {
226
- onSourceMouseEnter
227
- } = this.props;
228
- onSourceMouseEnter();
229
- }
230
- handleMouseLeave() {
231
- var {
232
- onSourceMouseLeave
233
- } = this.props;
234
- onSourceMouseLeave();
235
- }
236
223
  sourceUpdated() {
237
224
  this.setState({
238
225
  column: null,
@@ -252,9 +239,8 @@ class DropdownFilter extends Component {
252
239
  });
253
240
  }
254
241
  focusInput() {
255
- if (this.dropdownRef.current !== null) {
256
- this.dropdownRef.current.focus();
257
- }
242
+ var _this$dropdownRef$cur;
243
+ (_this$dropdownRef$cur = this.dropdownRef.current) === null || _this$dropdownRef$cur === void 0 ? void 0 : _this$dropdownRef$cur.focus();
258
244
  }
259
245
  resetValue() {
260
246
  this.setState({
@@ -266,6 +252,8 @@ class DropdownFilter extends Component {
266
252
  clearFilter() {
267
253
  this.resetValue();
268
254
  }
255
+
256
+ // Called by the parent component via ref
269
257
  setFilterState(_ref4) {
270
258
  var {
271
259
  name,
@@ -277,10 +265,16 @@ class DropdownFilter extends Component {
277
265
  name,
278
266
  type
279
267
  } : null;
280
- this.setState({
281
- column,
282
- value,
283
- isValueShown
268
+ this.setState(_ref5 => {
269
+ var {
270
+ value: oldValue,
271
+ isValueShown: oldIsValueShown
272
+ } = _ref5;
273
+ return {
274
+ column,
275
+ value: value !== null && value !== void 0 ? value : oldValue,
276
+ isValueShown: isValueShown !== null && isValueShown !== void 0 ? isValueShown : oldIsValueShown
277
+ };
284
278
  });
285
279
  }
286
280
  render() {
@@ -300,6 +294,7 @@ class DropdownFilter extends Component {
300
294
  var {
301
295
  column,
302
296
  disableCancel,
297
+ id,
303
298
  isValueShown,
304
299
  selectedColumn,
305
300
  value
@@ -314,6 +309,8 @@ class DropdownFilter extends Component {
314
309
  var selectedOption = this.getSelectedOptionIndex(values, value);
315
310
  var disableSave = !isLinked || selectedColumn == null;
316
311
  var isFlipped = isValueShown && !isLinkerActive;
312
+ var sourceColumnId = "source-column-btn-".concat(id);
313
+ var filterColumnId = "filter-column-select-".concat(id);
317
314
  return /*#__PURE__*/React.createElement(CardFlip, {
318
315
  className: "dropdown-filter fill-parent-absolute",
319
316
  isFlipped: isFlipped
@@ -323,7 +320,10 @@ class DropdownFilter extends Component {
323
320
  className: "dropdown-filter-card-content"
324
321
  }, /*#__PURE__*/React.createElement("div", {
325
322
  className: "dropdown-filter-settings-grid"
326
- }, /*#__PURE__*/React.createElement("label", null, "Source Column"), /*#__PURE__*/React.createElement(SocketedButton, {
323
+ }, /*#__PURE__*/React.createElement("label", {
324
+ htmlFor: sourceColumnId
325
+ }, "Source Column"), /*#__PURE__*/React.createElement(SocketedButton, {
326
+ id: sourceColumnId,
327
327
  isLinked: isLinked,
328
328
  onClick: onColumnSelected,
329
329
  onMouseEnter: onSourceMouseEnter,
@@ -332,7 +332,10 @@ class DropdownFilter extends Component {
332
332
  disabled: disableLinking
333
333
  }, sourceButtonLabel), /*#__PURE__*/React.createElement("div", {
334
334
  className: "text-muted small"
335
- }, "Select a source column for the list by linking to a table."), /*#__PURE__*/React.createElement("label", null, "Filter Column"), /*#__PURE__*/React.createElement("select", {
335
+ }, "Select a source column for the list by linking to a table."), /*#__PURE__*/React.createElement("label", {
336
+ htmlFor: filterColumnId
337
+ }, "Filter Column"), /*#__PURE__*/React.createElement("select", {
338
+ id: filterColumnId,
336
339
  value: selectedIndex,
337
340
  className: "custom-select",
338
341
  onChange: this.handleColumnChange,
@@ -358,7 +361,8 @@ class DropdownFilter extends Component {
358
361
  tooltip: isLinkerActive ? 'Save disabled while linker open' : undefined
359
362
  }, "Save")))), /*#__PURE__*/React.createElement("div", {
360
363
  className: "dropdown-filter-value-card",
361
- onClick: this.handleBackgroundClick
364
+ onClick: this.handleBackgroundClick,
365
+ "data-testid": "dropdown-filter-value-background"
362
366
  }, isLoaded && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
363
367
  className: "dropdown-filter-column"
364
368
  }, /*#__PURE__*/React.createElement("div", {
@@ -372,7 +376,8 @@ class DropdownFilter extends Component {
372
376
  value: selectedOption,
373
377
  ref: this.dropdownRef,
374
378
  onChange: this.handleValueChange,
375
- onKeyPress: this.handleDropdownKeyPress
379
+ onKeyPress: this.handleDropdownKeyPress,
380
+ title: "Select Value"
376
381
  }, valueOptions)), settingsError && /*#__PURE__*/React.createElement("div", {
377
382
  className: "error-message mt-3 text-center"
378
383
  }, settingsError)), /*#__PURE__*/React.createElement("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"DropdownFilter.js","names":["React","Component","FontAwesomeIcon","Button","CardFlip","SocketedButton","vsGear","TableUtils","memoizee","memoize","debounce","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","disableCancel","componentDidUpdate","prevProps","prevState","isLoaded","sourceUpdated","includes","resetValue","focusInput","sendUpdate","componentWillUnmount","flush","event","target","debug2","parseInt","setState","allColumns","getCompatibleColumns","key","preventDefault","stopPropagation","valueIndex","error","showSettings","current","handleMouseEnter","onSourceMouseEnter","handleMouseLeave","onSourceMouseLeave","focus","clearFilter","setFilterState","render","disableLinking","isLinkerActive","onColumnSelected","settingsError","columnSelectionDisabled","isLinked","sourceButtonLabel","columnName","SOURCE_BUTTON_PLACEHOLDER","filterTitle","columnOptions","getColumnOptions","valueOptions","getValueOptions","selectedOption","getSelectedOptionIndex","disableSave","isFlipped","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 { Column } from '@deephaven/jsapi-shim';\nimport { TableUtils } from '@deephaven/jsapi-utils';\nimport memoizee from 'memoizee';\nimport memoize from 'memoize-one';\nimport debounce from 'lodash.debounce';\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}\ninterface 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;\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}\n\nclass 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 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}\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 === -1) {\n log.debug2('Selected default item');\n } else if (index >= 0 && index < values.length) {\n value = values[index];\n } else {\n log.error('Invalid index', index, values);\n return;\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 handleMouseEnter(): void {\n const { onSourceMouseEnter } = this.props;\n onSourceMouseEnter();\n }\n\n handleMouseLeave(): void {\n const { onSourceMouseLeave } = this.props;\n onSourceMouseLeave();\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 if (this.dropdownRef.current !== null) {\n this.dropdownRef.current.focus();\n }\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 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({ column, value, isValueShown });\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 {\n column,\n disableCancel,\n isValueShown,\n selectedColumn,\n 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 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>Source Column</label>\n <SocketedButton\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>Filter Column</label>\n <select\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 >\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 >\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,GAAG,MAAM,gBAAgB;AAAC;AAIjC,IAAMC,GAAG,GAAGD,GAAG,CAACE,MAAM,CAAC,gBAAgB,CAAC;AACxC,IAAMC,eAAe,GAAG,GAAG;AAmC3B,MAAMC,cAAc,SAASd,SAAS,CAGpC;EAuBAe,WAAW,CAACC,KAA0B,EAAE;IACtC,KAAK,CAACA,KAAK,CAAC;IAAC;IAAA,8CAiEQR,OAAO,CAC5B,CAACS,MAAiB,EAAEC,OAA+B,KACjDD,MAAM,IAAI,IAAI,GACVC,OAAO,CAACC,MAAM,CACZ;MAAA,IAAC;QAAEC;MAAK,CAAC;MAAA,OACPA,IAAI,KAAKC,SAAS,IAClBf,UAAU,CAACgB,gBAAgB,CAACF,IAAI,EAAEH,MAAM,CAACM,UAAU,CAAC;IAAA,EACvD,GACD,EAAE,CACT;IAAA,0CAEkBf,OAAO,CACxB,CACEU,OAA+B,EAC/BM,cAA2C,KACf;MAC5B,IAAIC,aAAa,GAAG,CAAC,CAAC;MACtB,IAAMC,OAAO,GAAG,EAAE;MAClBA,OAAO,CAACC,IAAI,eACV;QAAQ,GAAG,EAAC,aAAa;QAAC,KAAK,EAAC;MAAI,qBAE3B,CACV;MACDT,OAAO,CAACU,OAAO,CAAC,CAACC,UAAU,EAAEC,KAAK,KAAK;QACrCJ,OAAO,CAACC,IAAI,eACV;UAAQ,GAAG,YAAKE,UAAU,CAACE,IAAI,cAAIF,UAAU,CAACT,IAAI,CAAG;UAAC,KAAK,EAAEU;QAAM,GAChE,IAAI,CAACE,YAAY,CAACd,OAAO,EAAEY,KAAK,CAAC,CAC3B,CACV;QACD,IACEN,cAAc,KAAK,IAAI,IACvBK,UAAU,CAACE,IAAI,KAAKP,cAAc,CAACO,IAAI,IACvCF,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,gDAEwBjB,OAAO,CAC9B,CAACyB,MAAyB,EAAEC,KAAoB,KAAKD,MAAM,CAACE,OAAO,CAACD,KAAK,CAAC,CAC3E;IAAA,yCAEiB1B,OAAO,CAAEyB,MAAyB,IAAK,cACvD;MAAQ,KAAK,EAAC,IAAI;MAAC,GAAG,EAAC;IAAI,GACxBnB,cAAc,CAACsB,WAAW,CACpB,EACT,GAAGH,MAAM,CAACI,GAAG,CAAC,CAACC,GAAG,EAAER,KAAK,kBACvB;MACE,KAAK,EAAEA;MACP;MAAA;MACA,GAAG,YAAKA,KAAK,cAAIQ,GAAG;IAAG,GAEtBA,GAAG,CAEP,CAAC,CACH,CAAC;IAAA,sCAEa/B,QAAQ,CAAC,CAACW,OAA+B,EAAEY,KAAa,KAAK;MAC1E,IAAM;QAAEC,IAAI;QAAEX;MAAK,CAAC,GAAGF,OAAO,CAACY,KAAK,CAAC;MAErC,IACGA,KAAK,GAAG,CAAC,IAAIZ,OAAO,CAACY,KAAK,GAAG,CAAC,CAAC,CAACC,IAAI,KAAKA,IAAI,IAC7CD,KAAK,GAAGZ,OAAO,CAACqB,MAAM,GAAG,CAAC,IAAIrB,OAAO,CAACY,KAAK,GAAG,CAAC,CAAC,CAACC,IAAI,KAAKA,IAAK,EAChE;QACA,IAAMS,SAAS,GAAGpB,IAAI,CAACqB,SAAS,CAACrB,IAAI,CAACsB,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3D,iBAAUX,IAAI,eAAKS,SAAS;MAC9B;MAEA,OAAOT,IAAI;IACb,CAAC,CAAC;IAAA,oCAsIWtB,QAAQ,CAAC,MAAM;MAC1B,IAAM;QAAEkC;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;IAjRjB,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,gBAAGxD,KAAK,CAACyD,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;MACNpB,cAAc,EAAEoB,OAAM;MACtBa,aAAa,EAAE,CAACZ,aAAY;MAC5BA,YAAY,EAAZA,aAAY;MACZX,KAAK,EAALA;IACF,CAAC;EACH;EAEAwB,kBAAkB,CAChBC,SAA8B,EAC9BC,SAA8B,EACxB;IACN,IAAM;MAAE3C,MAAM;MAAEgB,MAAM;MAAE4B;IAAS,CAAC,GAAG,IAAI,CAAC7C,KAAK;IAC/C,IAAM;MAAE4B,MAAM;MAAEV,KAAK;MAAEW;IAAa,CAAC,GAAG,IAAI,CAACC,KAAK;IAElD,IAAIe,QAAQ,EAAE;MACZ,IAAI5C,MAAM,KAAK0C,SAAS,CAAC1C,MAAM,EAAE;QAC/B,IAAI,CAAC6C,aAAa,EAAE;MACtB;MAEA,IACE7B,MAAM,KAAK0B,SAAS,CAAC1B,MAAM,IAC3BC,KAAK,KAAK,EAAE,IACZ,CAACD,MAAM,CAAC8B,QAAQ,CAAC7B,KAAK,CAAC,EACvB;QACA;QACA,IAAI,CAAC8B,UAAU,EAAE;MACnB;MAEA,IAAInB,YAAY,KAAKe,SAAS,CAACf,YAAY,EAAE;QAC3C,IAAIA,YAAY,EAAE;UAChB,IAAI,CAACoB,UAAU,EAAE;QACnB;MACF;MAEA,IACErB,MAAM,KAAKgB,SAAS,CAAChB,MAAM,IAC3BV,KAAK,KAAK0B,SAAS,CAAC1B,KAAK,IACzBW,YAAY,KAAKe,SAAS,CAACf,YAAY,EACvC;QACA,IAAI,CAACqB,UAAU,EAAE;MACnB;IACF;EACF;EAEAC,oBAAoB,GAAS;IAC3B,IAAI,CAACD,UAAU,CAACE,KAAK,EAAE;EACzB;EA8EArB,kBAAkB,CAACsB,KAAqC,EAAQ;IAC9D,IAAM;MAAEnC;IAAM,CAAC,GAAGmC,KAAK,CAACC,MAAM;IAC9B3D,GAAG,CAAC4D,MAAM,CAAC,oBAAoB,EAAErC,KAAK,CAAC;IACvC,IAAIA,KAAK,IAAI,IAAI,IAAIsC,QAAQ,CAACtC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE;MAC5C,IAAI,CAACuC,QAAQ,CAAC;QACZjD,cAAc,EAAE;MAClB,CAAC,CAAC;MACF;IACF;IACA,IAAM;MAAEN,OAAO,EAAEwD,UAAU;MAAEzD;IAAO,CAAC,GAAG,IAAI,CAACD,KAAK;IAClD,IAAME,OAAO,GAAG,IAAI,CAACyD,oBAAoB,CAAC1D,MAAM,EAAEyD,UAAU,CAAC;IAC7D,IAAI,CAACD,QAAQ,CAAC;MACZjD,cAAc,EAAEN,OAAO,CAACsD,QAAQ,CAACtC,KAAK,EAAE,EAAE,CAAC;IAC7C,CAAC,CAAC;EACJ;EAEAmB,sBAAsB,CAACgB,KAAuC,EAAQ;IACpE,IAAIA,KAAK,CAACO,GAAG,KAAK,OAAO,EAAE;MACzBP,KAAK,CAACQ,cAAc,EAAE;MACtBR,KAAK,CAACS,eAAe,EAAE;MAEvBnE,GAAG,CAAC4D,MAAM,CAAC,wBAAwB,CAAC;MAEpC,IAAI,CAACL,UAAU,EAAE;MACjB,IAAI,CAACA,UAAU,CAACE,KAAK,EAAE;IACzB;EACF;EAEAd,iBAAiB,CAACe,KAAqC,EAAQ;IAC7D,IAAM;MAAEnC,KAAK,EAAE6C;IAAW,CAAC,GAAGV,KAAK,CAACC,MAAM;IAC1C,IAAMxC,KAAK,GAAG0C,QAAQ,CAACO,UAAU,EAAE,EAAE,CAAC;IACtC;IACA,IAAI7C,KAAoB,GAAG,EAAE;IAC7B,IAAM;MAAED;IAAO,CAAC,GAAG,IAAI,CAACjB,KAAK;IAC7B,IAAIc,KAAK,KAAK,CAAC,CAAC,EAAE;MAChBnB,GAAG,CAAC4D,MAAM,CAAC,uBAAuB,CAAC;IACrC,CAAC,MAAM,IAAIzC,KAAK,IAAI,CAAC,IAAIA,KAAK,GAAGG,MAAM,CAACM,MAAM,EAAE;MAC9CL,KAAK,GAAGD,MAAM,CAACH,KAAK,CAAC;IACvB,CAAC,MAAM;MACLnB,GAAG,CAACqE,KAAK,CAAC,eAAe,EAAElD,KAAK,EAAEG,MAAM,CAAC;MACzC;IACF;IAEAtB,GAAG,CAAC4D,MAAM,CAAC,mBAAmB,EAAErC,KAAK,CAAC;IAEtC,IAAI,CAACuC,QAAQ,CAAC;MAAEvC;IAAM,CAAC,CAAC;EAC1B;EAEAe,oBAAoB,GAAS;IAC3B,IAAI,CAACwB,QAAQ,CAAC;MAAA,IAAC;QAAE7B;MAAO,CAAC;MAAA,OAAM;QAC7BpB,cAAc,EAAEoB,MAAM;QACtBC,YAAY,EAAE;MAChB,CAAC;IAAA,CAAC,CAAC;EACL;EAEAM,kBAAkB,GAAS;IACzB,IAAI,CAACsB,QAAQ,CAAC;MAAA,IAAC;QAAE7B,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;QAClBY,aAAa,EAAE;MACjB,CAAC;IAAA,CAAC,CAAC;EACL;EAEAP,mBAAmB,CAACmB,KAAoC,EAAQ;IAC9DA,KAAK,CAACS,eAAe,EAAE;IACvB,IAAI,CAACG,YAAY,EAAE;EACrB;EAEA7B,qBAAqB,CAACiB,KAAiC,EAAQ;IAC7D;IACA,IAAIA,KAAK,CAACC,MAAM,KAAK,IAAI,CAACf,WAAW,CAAC2B,OAAO,EAAE;MAC7C,IAAI,CAACjB,UAAU,EAAE;IACnB;EACF;EAEAkB,gBAAgB,GAAS;IACvB,IAAM;MAAEC;IAAmB,CAAC,GAAG,IAAI,CAACpE,KAAK;IACzCoE,kBAAkB,EAAE;EACtB;EAEAC,gBAAgB,GAAS;IACvB,IAAM;MAAEC;IAAmB,CAAC,GAAG,IAAI,CAACtE,KAAK;IACzCsE,kBAAkB,EAAE;EACtB;EAEAxB,aAAa,GAAS;IACpB,IAAI,CAACW,QAAQ,CAAC;MACZ7B,MAAM,EAAE,IAAI;MACZpB,cAAc,EAAE,IAAI;MACpBqB,YAAY,EAAE,KAAK;MACnBY,aAAa,EAAE,IAAI;MACnBvB,KAAK,EAAE;IACT,CAAC,CAAC;EACJ;EAEA+C,YAAY,GAAS;IACnB,IAAM;MAAErC;IAAO,CAAC,GAAG,IAAI,CAACE,KAAK;IAC7B,IAAI,CAAC2B,QAAQ,CAAC;MAAEjD,cAAc,EAAEoB,MAAM;MAAEC,YAAY,EAAE;IAAM,CAAC,CAAC;EAChE;EAEAoB,UAAU,GAAS;IACjB,IAAI,IAAI,CAACV,WAAW,CAAC2B,OAAO,KAAK,IAAI,EAAE;MACrC,IAAI,CAAC3B,WAAW,CAAC2B,OAAO,CAACK,KAAK,EAAE;IAClC;EACF;EAEAvB,UAAU,GAAS;IACjB,IAAI,CAACS,QAAQ,CAAC;MAAEvC,KAAK,EAAE;IAAG,CAAC,CAAC;EAC9B;;EAEA;EACAsD,WAAW,GAAS;IAClB,IAAI,CAACxB,UAAU,EAAE;EACnB;EAEAyB,cAAc,QAUL;IAAA,IAVM;MACb1D,IAAI;MACJX,IAAI;MACJc,KAAK;MACLW;IAMF,CAAC;IACC,IAAMD,MAAM,GAAGb,IAAI,IAAI,IAAI,IAAIX,IAAI,IAAI,IAAI,GAAG;MAAEW,IAAI;MAAEX;IAAK,CAAC,GAAG,IAAI;IACnE,IAAI,CAACqD,QAAQ,CAAC;MAAE7B,MAAM;MAAEV,KAAK;MAAEW;IAAa,CAAC,CAAC;EAChD;EAQA6C,MAAM,GAAiB;IAAA;IACrB,IAAM;MACJxE,OAAO,EAAEwD,UAAU;MACnBiB,cAAc;MACdC,cAAc;MACd/B,QAAQ;MACR5C,MAAM;MACN4E,gBAAgB;MAChBT,kBAAkB;MAClBE,kBAAkB;MAClBrD,MAAM;MACN6D;IACF,CAAC,GAAG,IAAI,CAAC9E,KAAK;IACd,IAAM;MACJ4B,MAAM;MACNa,aAAa;MACbZ,YAAY;MACZrB,cAAc;MACdU;IACF,CAAC,GAAG,IAAI,CAACY,KAAK;IACd,IAAMiD,uBAAuB,GAAG9E,MAAM,KAAK,IAAI;IAC/C,IAAMC,OAAO,GAAG,IAAI,CAACyD,oBAAoB,CAAC1D,MAAM,EAAEyD,UAAU,CAAC;IAC7D,IAAMsB,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,CAACb,IAAI,eAAY,IAAI;IACnE,IAAM,CAACsE,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,CAAC+C,cAAc;IAEjD,oBACE,oBAAC,QAAQ;MACP,SAAS,EAAC,sCAAsC;MAChD,SAAS,EAAEgB;IAAU,gBAErB;MAAK,SAAS,EAAC;IAA+B,gBAC5C;MAAK,SAAS,EAAC;IAA8B,gBAC3C;MAAK,SAAS,EAAC;IAA+B,gBAC5C,mDAA4B,eAC5B,oBAAC,cAAc;MACb,QAAQ,EAAEZ,QAAS;MACnB,OAAO,EAAEH,gBAAiB;MAC1B,YAAY,EAAET,kBAAmB;MACjC,YAAY,EAAEE,kBAAmB;MACjC,SAAS,EAAExE,cAAc,CAAC+F,wBAAyB;MACnD,QAAQ,EAAElB;IAAe,GAExBM,iBAAiB,CACH,eAEjB;MAAK,SAAS,EAAC;IAAkB,gEAE3B,eAEN,mDAA4B,eAC5B;MACE,KAAK,EAAExE,aAAc;MACrB,SAAS,EAAC,eAAe;MACzB,QAAQ,EAAE,IAAI,CAACsB,kBAAmB;MAClC,QAAQ,EAAEgD;IAAwB,GAEjCM,aAAa,CACP,eACT;MAAK,SAAS,EAAC;IAAkB,wGAG3B,CACF,EACLP,aAAa,iBACZ;MAAK,SAAS,EAAC;IAA2B,GAAEA,aAAa,CAC1D,EACAE,QAAQ,iBACP;MAAK,SAAS,EAAC;IAAkC,gBAC/C,oBAAC,MAAM;MACL,IAAI,EAAC,WAAW;MAChB,IAAI,EAAC,QAAQ;MACb,OAAO,EAAE,IAAI,CAAC/C,oBAAqB;MACnC,QAAQ,EAAEQ,aAAa,IAAIZ,YAAY,IAAI+C,cAAe;MAC1D,OAAO,EACLA,cAAc,GACV,mCAAmC,GACnCvE;IACL,YAGM,eACT,oBAAC,MAAM;MACL,IAAI,EAAC,SAAS;MACd,IAAI,EAAC,QAAQ;MACb,SAAS,EAAC,MAAM;MAChB,OAAO,EAAE,IAAI,CAAC8B,kBAAmB;MACjC,QAAQ,EAAEwD,WAAW,IAAI9D,YAAY,IAAI+C,cAAe;MACxD,OAAO,EACLA,cAAc,GACV,iCAAiC,GACjCvE;IACL,UAGM,CAEZ,CACG,CACF,eAEN;MACE,SAAS,EAAC,4BAA4B;MACtC,OAAO,EAAE,IAAI,CAAC+B;IAAsB,GAEnCS,QAAQ,iBACP,uDACE;MAAK,SAAS,EAAC;IAAwB,gBACrC;MAAK,SAAS,EAAC;IAA8B,GAC1CuC,WAAW,CACR,CACF,eACN;MAAK,SAAS,EAAC;IAA8B,gBAC3C;MAAK,SAAS,EAAC;IAAuE,gBACpF;MACE,SAAS,EAAC,eAAe;MACzB,KAAK,EAAEK,cAAe;MACtB,GAAG,EAAE,IAAI,CAAClD,WAAY;MACtB,QAAQ,EAAE,IAAI,CAACD,iBAAkB;MACjC,UAAU,EAAE,IAAI,CAACD;IAAuB,GAEvCkD,YAAY,CACN,CACL,EACLT,aAAa,iBACZ;MAAK,SAAS,EAAC;IAAgC,GAC5CA,aAAa,CAEjB,CACG,eACN;MAAK,SAAS,EAAC;IAAsB,gBACnC,oBAAC,MAAM;MACL,IAAI,EAAC,OAAO;MACZ,SAAS,EAAC,UAAU;MACpB,OAAO,EAAE,IAAI,CAAC5C,mBAAoB;MAClC,IAAI,eAAE,oBAAC,eAAe;QAAC,IAAI,EAAE7C,MAAO;QAAC,SAAS,EAAC;MAAQ,EAAI;MAC3D,OAAO,EAAC;IAA0B,EAClC,CACE,CAET,CACG,CACG;EAEf;AACF;AAAC,gBA3cKS,cAAc,kBAII;EACpB8B,MAAM,EAAE,IAAI;EACZ+C,cAAc,EAAE,KAAK;EACrBC,cAAc,EAAE,KAAK;EACrB/B,QAAQ,EAAE,KAAK;EACfhB,YAAY,EAAE,KAAK;EAEnBiD,aAAa,EAAE,IAAI;EACnB7E,MAAM,EAAE,IAAI;EACZiB,KAAK,EAAE,EAAE;EACTD,MAAM,EAAE,EAAE;EACV4D,gBAAgB,EAAE,MAAYxE,SAAS;EACvC+D,kBAAkB,EAAE,MAAY/D,SAAS;EACzCiE,kBAAkB,EAAE,MAAYjE;AAClC,CAAC;AAAA,gBAlBGP,cAAc,iBAoBG,mBAAmB;AAAA,gBApBpCA,cAAc,8BAsBgB,8BAA8B;AAAA,gBAtB5DA,cAAc,+BAwBiB,iBAAiB;AAqbtD,eAAeA,cAAc"}
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 { Column } from '@deephaven/jsapi-shim';\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 {\n column,\n disableCancel,\n id,\n isValueShown,\n selectedColumn,\n 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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"}
@@ -94,6 +94,6 @@ declare const _default: import("react-redux").ConnectedComponent<typeof Linker,
94
94
  deleteDashboardLinks: (id: string, linkIds: string[]) => unknown;
95
95
  setDashboardIsolatedLinkerPanelId: (id: string, isolatedLinkerPanelId: string | string[] | undefined) => unknown;
96
96
  setDashboardColumnSelectionValidator: (id: string, columnSelectionValidator: import("./ColumnSelectionValidator").ColumnSelectionValidator | undefined) => unknown;
97
- }, "activeTool" | "links" | "setActiveTool" | "setDashboardIsolatedLinkerPanelId" | "timeZone" | "isolatedLinkerPanelId" | "setDashboardLinks" | "addDashboardLinks" | "deleteDashboardLinks" | "setDashboardColumnSelectionValidator"> & OwnProps>;
97
+ }, "links" | "activeTool" | "setActiveTool" | "setDashboardIsolatedLinkerPanelId" | "timeZone" | "isolatedLinkerPanelId" | "setDashboardLinks" | "addDashboardLinks" | "deleteDashboardLinks" | "setDashboardColumnSelectionValidator"> & OwnProps>;
98
98
  export default _default;
99
99
  //# sourceMappingURL=Linker.d.ts.map
@@ -1,12 +1,15 @@
1
1
  import React, { Component, RefObject } from 'react';
2
+ import { ConnectedProps } from 'react-redux';
3
+ import memoize from 'memoizee';
4
+ import { DashboardPanelProps } from '@deephaven/dashboard';
2
5
  import type { Column, Row, Table, TableTemplate } from '@deephaven/jsapi-shim';
3
6
  import { DateTimeColumnFormatter, Formatter, FormattingRule } from '@deephaven/jsapi-utils';
4
7
  import { Pending } from '@deephaven/utils';
5
- import type { Container, EventEmitter } from '@deephaven/golden-layout';
6
8
  import DropdownFilter, { DropdownFilterColumn } from '../controls/dropdown-filter/DropdownFilter';
7
9
  import './DropdownFilterPanel.scss';
8
10
  import type { Link, LinkPoint } from '../linker/LinkerUtils';
9
11
  import { ColumnSelectionValidator } from '../linker/ColumnSelectionValidator';
12
+ import { PanelState as InputFilterPanelState } from './InputFilterPanel';
10
13
  interface PanelState {
11
14
  name?: string;
12
15
  type?: string;
@@ -14,20 +17,22 @@ interface PanelState {
14
17
  isValueShown?: boolean;
15
18
  timestamp?: number;
16
19
  }
17
- interface DropdownFilterPanelProps {
18
- glContainer: Container;
19
- glEventHub: EventEmitter;
20
- panelState?: PanelState;
21
- isLinkerActive: boolean;
20
+ type PanelTableMap = Map<string | string[], TableTemplate>;
21
+ type StateProps = {
22
22
  columns: Column[];
23
23
  columnSelectionValidator?: ColumnSelectionValidator;
24
+ dashboardLinks: Link[];
24
25
  disableLinking: boolean;
26
+ isLinkerActive: boolean;
27
+ panelTableMap: PanelTableMap;
28
+ panelState?: PanelState;
25
29
  settings: {
26
30
  formatter: FormattingRule[];
27
31
  };
28
- panelTableMap: Map<string | string[], TableTemplate>;
29
- dashboardLinks: Link[];
30
- }
32
+ };
33
+ type OwnProps = DashboardPanelProps;
34
+ declare const connector: import("react-redux").InferableComponentEnhancerWithProps<import("react-redux").DispatchProp<import("redux").AnyAction> & StateProps, DashboardPanelProps>;
35
+ export type DropdownFilterPanelProps = OwnProps & StateProps & ConnectedProps<typeof connector>;
31
36
  interface DropdownFilterPanelState {
32
37
  column?: DropdownFilterColumn;
33
38
  formatter: Formatter;
@@ -46,7 +51,7 @@ interface DropdownFilterPanelState {
46
51
  isLoaded: boolean;
47
52
  error: unknown | null;
48
53
  }
49
- declare class DropdownFilterPanel extends Component<DropdownFilterPanelProps, DropdownFilterPanelState> {
54
+ export declare class DropdownFilterPanel extends Component<DropdownFilterPanelProps, DropdownFilterPanelState> {
50
55
  static displayName: string;
51
56
  static COMPONENT: string;
52
57
  static MAX_TABLE_SIZE: number;
@@ -64,21 +69,17 @@ declare class DropdownFilterPanel extends Component<DropdownFilterPanelProps, Dr
64
69
  pending: Pending;
65
70
  cleanup?: () => void;
66
71
  columnFormats?: FormattingRule[];
67
- getCachedValues: (rawValues: unknown[], { type, name }: DropdownFilterColumn, formatter: Formatter) => (string | null)[];
72
+ getCachedValues: ((rawValues: unknown[], { type, name }: DropdownFilterColumn, formatter: Formatter) => (string | null)[]) & memoize.Memoized<(rawValues: unknown[], { type, name }: DropdownFilterColumn, formatter: Formatter) => (string | null)[]>;
68
73
  getCoordinateForColumn(): [number, number] | null;
69
74
  getSettingsErrorMessage(): string | undefined;
70
75
  getPanelErrorMessage(): string | undefined;
71
- getCachedPanelLinks: (dashboardLinks: Link[], panel: DropdownFilterPanel) => Link[];
72
- getCachedSource: (links: Link[]) => LinkPoint | undefined;
73
- getCachedSourceTable: (panelTableMap: Map<string | string[], TableTemplate<Table>>, source: LinkPoint | undefined) => TableTemplate<Table> | null;
74
- getCachedSourceColumn: (table: TableTemplate, source: LinkPoint | undefined) => Column | null;
75
- getSource(props?: Readonly<DropdownFilterPanelProps> & Readonly<{
76
- children?: React.ReactNode;
77
- }>): LinkPoint | undefined;
78
- getSourceTable(props?: Readonly<DropdownFilterPanelProps> & Readonly<{
79
- children?: React.ReactNode;
80
- }>): TableTemplate<Table> | null;
81
- getValuesColumn(valuesTable: TableTemplate): Column | null;
76
+ getCachedPanelLinks: ((dashboardLinks: Link[], panel: DropdownFilterPanel) => Link[]) & memoize.Memoized<(dashboardLinks: Link[], panel: DropdownFilterPanel) => Link[]>;
77
+ getCachedSource: ((links: Link[]) => LinkPoint | undefined) & memoize.Memoized<(links: Link[]) => LinkPoint | undefined>;
78
+ getCachedSourceTable: ((panelTableMap: Map<string | string[], TableTemplate<Table>>, source: LinkPoint | undefined) => TableTemplate<Table> | null) & memoize.Memoized<(panelTableMap: Map<string | string[], TableTemplate<Table>>, source: LinkPoint | undefined) => TableTemplate<Table> | null>;
79
+ getCachedSourceColumn: ((table: TableTemplate, source: LinkPoint | undefined) => Column | null) & memoize.Memoized<(table: TableTemplate, source: LinkPoint | undefined) => Column | null>;
80
+ getSource(links: Link[]): LinkPoint | undefined;
81
+ getSourceTable(panelTableMap: PanelTableMap, links: Link[]): TableTemplate | null;
82
+ getValuesColumn(valuesTable: TableTemplate, links: Link[]): Column | null;
82
83
  startListeningToSource(sourceTable: TableTemplate): void;
83
84
  stopListeningToSource(sourceTable: TableTemplate): void;
84
85
  handleChange({ column, isValueShown, value, }: {
@@ -100,12 +101,7 @@ declare class DropdownFilterPanel extends Component<DropdownFilterPanelProps, Dr
100
101
  * @param state Filter state to set
101
102
  * @param sendUpdate Emit filters changed event if true
102
103
  */
103
- setPanelState(state: {
104
- name: string;
105
- type: string;
106
- value: string;
107
- isValueShown: boolean;
108
- }, sendUpdate?: boolean): void;
104
+ setPanelState(state: InputFilterPanelState, sendUpdate?: boolean): void;
109
105
  sendUpdate(name: string | null, type: string | undefined, value: string | undefined, timestamp?: number): void;
110
106
  updateValuesTable(): void;
111
107
  applySourceSorts(): void;
@@ -122,11 +118,14 @@ declare class DropdownFilterPanel extends Component<DropdownFilterPanelProps, Dr
122
118
  }): void;
123
119
  handleSourceMouseEnter(): void;
124
120
  handleSourceMouseLeave(): void;
125
- render(): JSX.Element;
121
+ render(): React.ReactElement;
126
122
  }
127
- declare const _default: import("react-redux").ConnectedComponent<typeof DropdownFilterPanel, import("react-redux").Omit<React.ClassAttributes<DropdownFilterPanel> & DropdownFilterPanelProps, "columns" | "columnSelectionValidator" | "isLinkerActive" | "disableLinking" | "settings" | "panelTableMap" | "dashboardLinks"> & {
123
+ declare const _default: import("react-redux").ConnectedComponent<typeof DropdownFilterPanel, import("react-redux").Omit<React.ClassAttributes<DropdownFilterPanel> & import("@deephaven/dashboard").PanelProps & {
124
+ localDashboardId: string;
125
+ metadata?: Record<string, unknown> | undefined;
126
+ } & StateProps & import("react-redux").DispatchProp<import("redux").AnyAction>, "panelState" | "columns" | "dispatch" | "columnSelectionValidator" | "dashboardLinks" | "disableLinking" | "isLinkerActive" | "panelTableMap" | "settings"> & import("@deephaven/dashboard").PanelProps & {
128
127
  localDashboardId: string;
129
- glContainer: Container<import("@deephaven/golden-layout").ComponentConfig>;
128
+ metadata?: Record<string, unknown> | undefined;
130
129
  }>;
131
130
  export default _default;
132
131
  //# sourceMappingURL=DropdownFilterPanel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DropdownFilterPanel.d.ts","sourceRoot":"","sources":["../../src/panels/DropdownFilterPanel.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DropdownFilterPanel.d.ts","sourceRoot":"","sources":["../../src/panels/DropdownFilterPanel.tsx"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import React, { Component } from 'react';
3
3
  import { connect } from 'react-redux';
4
4
  import debounce from 'lodash.debounce';
5
5
  import deepEqual from 'deep-equal';
6
- import memoize from 'memoize-one';
6
+ import memoize from 'memoizee';
7
7
  import { LayoutUtils } from '@deephaven/dashboard';
8
8
  import dh from '@deephaven/jsapi-shim';
9
9
  import { DateTimeColumnFormatter, Formatter, FormatterUtils, TableUtils } from '@deephaven/jsapi-utils';
@@ -18,7 +18,34 @@ import ToolType from "../linker/ToolType.js";
18
18
  import WidgetPanel from "./WidgetPanel.js";
19
19
  var log = Log.module('DropdownFilterPanel');
20
20
  var DROPDOWN_FILTER_DEBOUNCE = 250;
21
- class DropdownFilterPanel extends Component {
21
+ var mapStateToProps = (state, ownProps) => {
22
+ var {
23
+ localDashboardId
24
+ } = ownProps;
25
+ var panelId = LayoutUtils.getIdFromPanel({
26
+ props: ownProps
27
+ });
28
+ var panelTableMap = getTableMapForDashboard(state, localDashboardId);
29
+ var dashboardLinks = getLinksForDashboard(state, localDashboardId);
30
+ var activeTool = getActiveTool(state);
31
+ var isolatedLinkerPanelId = getIsolatedLinkerPanelIdForDashboard(state, localDashboardId);
32
+ var isLinkerActive = activeTool === ToolType.LINKER && (isolatedLinkerPanelId === undefined || isolatedLinkerPanelId === panelId);
33
+ // Disable linking if linker is in isolated mode for a different panel
34
+ var disableLinking = activeTool === ToolType.LINKER && isolatedLinkerPanelId !== undefined && isolatedLinkerPanelId !== panelId;
35
+ return {
36
+ columns: getColumnsForDashboard(state, localDashboardId),
37
+ columnSelectionValidator: getColumnSelectionValidatorForDashboard(state, localDashboardId),
38
+ isLinkerActive,
39
+ disableLinking,
40
+ settings: getSettings(state),
41
+ panelTableMap,
42
+ dashboardLinks
43
+ };
44
+ };
45
+ var connector = connect(mapStateToProps, null, null, {
46
+ forwardRef: true
47
+ });
48
+ export class DropdownFilterPanel extends Component {
22
49
  // Filter dropdown needs to show and send full timestamp format with nanoseconds
23
50
 
24
51
  constructor(props) {
@@ -139,12 +166,16 @@ class DropdownFilterPanel extends Component {
139
166
  }
140
167
  componentDidMount() {
141
168
  this.updateValuesTable();
169
+ var {
170
+ dashboardLinks,
171
+ panelTableMap
172
+ } = this.props;
142
173
  var {
143
174
  column,
144
175
  value,
145
176
  timestamp
146
177
  } = this.state;
147
- var sourceTable = this.getSourceTable();
178
+ var sourceTable = this.getSourceTable(panelTableMap, dashboardLinks);
148
179
  if (sourceTable !== null) {
149
180
  this.startListeningToSource(sourceTable);
150
181
  }
@@ -158,15 +189,17 @@ class DropdownFilterPanel extends Component {
158
189
  }
159
190
  componentDidUpdate(prevProps, prevState) {
160
191
  var {
161
- valuesTable
162
- } = this.state;
163
- var {
192
+ dashboardLinks,
193
+ panelTableMap,
164
194
  settings
165
195
  } = this.props;
166
- var source = this.getSource();
167
- var sourceTable = this.getSourceTable();
168
- var prevSource = this.getSource(prevProps);
169
- var prevSourceTable = this.getSourceTable(prevProps);
196
+ var {
197
+ valuesTable
198
+ } = this.state;
199
+ var source = this.getSource(dashboardLinks);
200
+ var sourceTable = this.getSourceTable(panelTableMap, dashboardLinks);
201
+ var prevSource = this.getSource(prevProps.dashboardLinks);
202
+ var prevSourceTable = this.getSourceTable(prevProps.panelTableMap, prevProps.dashboardLinks);
170
203
  if (settings !== prevProps.settings && settings !== undefined) {
171
204
  this.updateFormatterSettings(settings);
172
205
  }
@@ -190,10 +223,14 @@ class DropdownFilterPanel extends Component {
190
223
  }
191
224
  }
192
225
  componentWillUnmount() {
226
+ var {
227
+ dashboardLinks,
228
+ panelTableMap
229
+ } = this.props;
193
230
  var {
194
231
  valuesTable
195
232
  } = this.state;
196
- var sourceTable = this.getSourceTable();
233
+ var sourceTable = this.getSourceTable(panelTableMap, dashboardLinks);
197
234
  this.pending.cancel();
198
235
  if (sourceTable !== null) {
199
236
  this.stopListeningToSource(sourceTable);
@@ -234,24 +271,16 @@ class DropdownFilterPanel extends Component {
234
271
  } = this.state;
235
272
  return error != null ? "".concat(error) : undefined;
236
273
  }
237
- getSource() {
238
- var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.props;
239
- var {
240
- dashboardLinks
241
- } = props;
242
- var panelLinks = this.getCachedPanelLinks(dashboardLinks, this);
274
+ getSource(links) {
275
+ var panelLinks = this.getCachedPanelLinks(links, this);
243
276
  return this.getCachedSource(panelLinks);
244
277
  }
245
- getSourceTable() {
246
- var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.props;
247
- var {
248
- panelTableMap
249
- } = props;
250
- var source = this.getSource(props);
278
+ getSourceTable(panelTableMap, links) {
279
+ var source = this.getSource(links);
251
280
  return this.getCachedSourceTable(panelTableMap, source);
252
281
  }
253
- getValuesColumn(valuesTable) {
254
- var source = this.getSource();
282
+ getValuesColumn(valuesTable, links) {
283
+ var source = this.getSource(links);
255
284
  return this.getCachedSourceColumn(valuesTable, source);
256
285
  }
257
286
  startListeningToSource(sourceTable) {
@@ -361,7 +390,10 @@ class DropdownFilterPanel extends Component {
361
390
  setPanelState(state) {
362
391
  var _this$dropdownFilterR3, _this$dropdownFilterR4;
363
392
  var sendUpdate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
364
- if (this.getSource() == null) {
393
+ var {
394
+ dashboardLinks
395
+ } = this.props;
396
+ if (this.getSource(dashboardLinks) == null) {
365
397
  log.debug('Ignore state update for unlinked filter', state);
366
398
  return;
367
399
  }
@@ -377,9 +409,10 @@ class DropdownFilterPanel extends Component {
377
409
  sendUpdate(name, type, value, timestamp) {
378
410
  var _this$getSource;
379
411
  var {
412
+ dashboardLinks,
380
413
  glEventHub
381
414
  } = this.props;
382
- var sourcePanelId = (_this$getSource = this.getSource()) === null || _this$getSource === void 0 ? void 0 : _this$getSource.panelId;
415
+ var sourcePanelId = (_this$getSource = this.getSource(dashboardLinks)) === null || _this$getSource === void 0 ? void 0 : _this$getSource.panelId;
383
416
  var excludePanelIds = sourcePanelId === null ? [] : [sourcePanelId];
384
417
  log.debug('sendUpdate', {
385
418
  name,
@@ -397,8 +430,12 @@ class DropdownFilterPanel extends Component {
397
430
  });
398
431
  }
399
432
  updateValuesTable() {
400
- var source = this.getSource();
401
- var sourceTable = this.getSourceTable();
433
+ var {
434
+ dashboardLinks,
435
+ panelTableMap
436
+ } = this.props;
437
+ var source = this.getSource(dashboardLinks);
438
+ var sourceTable = this.getSourceTable(panelTableMap, dashboardLinks);
402
439
  log.debug('updateValuesTable', source, sourceTable);
403
440
  this.setState({
404
441
  values: [],
@@ -443,10 +480,14 @@ class DropdownFilterPanel extends Component {
443
480
  });
444
481
  }
445
482
  applySourceSorts() {
483
+ var {
484
+ dashboardLinks,
485
+ panelTableMap
486
+ } = this.props;
446
487
  var {
447
488
  valuesTable
448
489
  } = this.state;
449
- var sourceTable = this.getSourceTable();
490
+ var sourceTable = this.getSourceTable(panelTableMap, dashboardLinks);
450
491
  log.debug('applySourceSorts', sourceTable === null || sourceTable === void 0 ? void 0 : sourceTable.sort);
451
492
  if (valuesTable == null || sourceTable == null) {
452
493
  log.debug('Table not initialized');
@@ -457,10 +498,14 @@ class DropdownFilterPanel extends Component {
457
498
  this.setViewport(valuesTable);
458
499
  }
459
500
  applySourceFilters() {
501
+ var {
502
+ dashboardLinks,
503
+ panelTableMap
504
+ } = this.props;
460
505
  var {
461
506
  valuesTable
462
507
  } = this.state;
463
- var sourceTable = this.getSourceTable();
508
+ var sourceTable = this.getSourceTable(panelTableMap, dashboardLinks);
464
509
  log.debug('applySourceFilters', sourceTable === null || sourceTable === void 0 ? void 0 : sourceTable.filter);
465
510
  if (valuesTable == null || sourceTable == null) {
466
511
  log.debug('Table not initialized');
@@ -483,7 +528,10 @@ class DropdownFilterPanel extends Component {
483
528
  this.setViewport(valuesTable);
484
529
  }
485
530
  setViewport(valuesTable) {
486
- var valuesColumn = this.getValuesColumn(valuesTable);
531
+ var {
532
+ dashboardLinks
533
+ } = this.props;
534
+ var valuesColumn = this.getValuesColumn(valuesTable, dashboardLinks);
487
535
  if (!valuesColumn) {
488
536
  log.error('values column is null');
489
537
  return;
@@ -506,6 +554,9 @@ class DropdownFilterPanel extends Component {
506
554
  var {
507
555
  rows
508
556
  } = detail;
557
+ var {
558
+ dashboardLinks
559
+ } = this.props;
509
560
  var {
510
561
  valuesTable
511
562
  } = this.state;
@@ -513,7 +564,7 @@ class DropdownFilterPanel extends Component {
513
564
  log.error('valuesTable is null');
514
565
  return;
515
566
  }
516
- var valuesColumn = this.getValuesColumn(valuesTable);
567
+ var valuesColumn = this.getValuesColumn(valuesTable, dashboardLinks);
517
568
  if (!valuesColumn) {
518
569
  log.error('Values column not found');
519
570
  return;
@@ -547,6 +598,7 @@ class DropdownFilterPanel extends Component {
547
598
  render() {
548
599
  var {
549
600
  columns,
601
+ dashboardLinks,
550
602
  disableLinking,
551
603
  glContainer,
552
604
  glEventHub,
@@ -563,7 +615,7 @@ class DropdownFilterPanel extends Component {
563
615
  isLoading,
564
616
  isLoaded
565
617
  } = this.state;
566
- var source = this.getSource();
618
+ var source = this.getSource(dashboardLinks);
567
619
  var settingsErrorMessage = this.getSettingsErrorMessage();
568
620
  var panelErrorMessage = this.getPanelErrorMessage();
569
621
  var formattedValues = isLoaded && valuesColumn != null ? this.getCachedValues(values, valuesColumn, formatter) : [];
@@ -613,31 +665,5 @@ _defineProperty(DropdownFilterPanel, "SOURCE_COLUMN", Object.freeze({
613
665
  name: 'FilterSource',
614
666
  type: null
615
667
  }));
616
- var mapStateToProps = (state, ownProps) => {
617
- var {
618
- localDashboardId
619
- } = ownProps;
620
- var panelId = LayoutUtils.getIdFromPanel({
621
- props: ownProps
622
- });
623
- var panelTableMap = getTableMapForDashboard(state, localDashboardId);
624
- var dashboardLinks = getLinksForDashboard(state, localDashboardId);
625
- var activeTool = getActiveTool(state);
626
- var isolatedLinkerPanelId = getIsolatedLinkerPanelIdForDashboard(state, localDashboardId);
627
- var isLinkerActive = activeTool === ToolType.LINKER && (isolatedLinkerPanelId === undefined || isolatedLinkerPanelId === panelId);
628
- // Disable linking if linker is in isolated mode for a different panel
629
- var disableLinking = activeTool === ToolType.LINKER && isolatedLinkerPanelId !== undefined && isolatedLinkerPanelId !== panelId;
630
- return {
631
- columns: getColumnsForDashboard(state, localDashboardId),
632
- columnSelectionValidator: getColumnSelectionValidatorForDashboard(state, localDashboardId),
633
- isLinkerActive,
634
- disableLinking,
635
- settings: getSettings(state),
636
- panelTableMap,
637
- dashboardLinks
638
- };
639
- };
640
- export default connect(mapStateToProps, null, null, {
641
- forwardRef: true
642
- })(DropdownFilterPanel);
668
+ export default connector(DropdownFilterPanel);
643
669
  //# sourceMappingURL=DropdownFilterPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DropdownFilterPanel.js","names":["React","Component","connect","debounce","deepEqual","memoize","LayoutUtils","dh","DateTimeColumnFormatter","Formatter","FormatterUtils","TableUtils","Log","getActiveTool","getSettings","Pending","PromiseUtils","DropdownFilter","InputFilterEvent","getColumnsForDashboard","getColumnSelectionValidatorForDashboard","getIsolatedLinkerPanelIdForDashboard","getLinksForDashboard","getTableMapForDashboard","ToolType","WidgetPanel","log","module","DROPDOWN_FILTER_DEBOUNCE","DropdownFilterPanel","constructor","props","rawValues","formatter","type","name","undefined","isDateType","map","value","DATETIME_FORMATTER","format","getFormattedString","dashboardLinks","panel","panelId","getIdFromPanel","debug","filter","link","end","links","source","length","start","error","panelTableMap","get","table","columns","find","columnName","columnType","handleChange","bind","handleClearAllFilters","handleDisconnect","handleReconnect","handleColumnSelected","handleSourceFilterChange","handleSourceSortChange","handleSourceSizeChange","handleSourceMouseEnter","handleSourceMouseLeave","handleValuesTableUpdate","dropdownFilterRef","createRef","panelContainer","pending","panelState","settings","columnFormats","getColumnFormats","isValueShown","timestamp","column","state","valuesTable","valuesColumn","sourceSize","values","wasFlipped","skipUpdate","isDisconnected","isLoading","isLoaded","componentDidMount","updateValuesTable","sourceTable","getSourceTable","startListeningToSource","sendUpdate","componentDidUpdate","prevProps","prevState","getSource","prevSource","prevSourceTable","updateFormatterSettings","close","stopListeningToSource","componentWillUnmount","cancel","cleanup","getCoordinateForColumn","current","element","querySelector","SOURCE_BUTTON_CLASS_NAME","rect","getBoundingClientRect","width","height","x","left","y","bottom","getSettingsErrorMessage","MAX_TABLE_SIZE","getPanelErrorMessage","panelLinks","getCachedPanelLinks","getCachedSource","getCachedSourceTable","getValuesColumn","getCachedSourceColumn","addEventListener","Table","EVENT_FILTERCHANGED","EVENT_SORTCHANGED","EVENT_SIZECHANGED","EVENT_DISCONNECT","EVENT_RECONNECT","removeEventListener","Date","now","setState","prevTimestamp","isFlip","Error","applySourceFilters","applySourceSorts","detail","glEventHub","emit","COLUMN_SELECTED","SOURCE_COLUMN","clearFilter","setPanelState","setFilterState","sourcePanelId","excludePanelIds","FILTERS_CHANGED","size","add","copy","resolved","then","updateViewportListener","catch","isCanceled","sort","sorts","applySort","setViewport","filters","applyFilter","EVENT_UPDATED","rows","row","columnSelectionValidator","render","disableLinking","glContainer","isLinkerActive","settingsErrorMessage","panelErrorMessage","formattedValues","getCachedValues","showTimeZone","showTSeparator","defaultDateTimeFormatString","Object","freeze","mapStateToProps","ownProps","localDashboardId","activeTool","isolatedLinkerPanelId","LINKER","forwardRef"],"sources":["../../src/panels/DropdownFilterPanel.tsx"],"sourcesContent":["import React, { Component, RefObject } from 'react';\nimport { connect } from 'react-redux';\nimport debounce from 'lodash.debounce';\nimport deepEqual from 'deep-equal';\nimport memoize from 'memoize-one';\nimport { LayoutUtils } from '@deephaven/dashboard';\nimport dh from '@deephaven/jsapi-shim';\nimport type { Column, Row, Table, TableTemplate } from '@deephaven/jsapi-shim';\nimport {\n DateTimeColumnFormatter,\n Formatter,\n FormatterUtils,\n FormattingRule,\n TableUtils,\n} from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport { getActiveTool, getSettings, RootState } from '@deephaven/redux';\nimport { Pending, PromiseUtils } from '@deephaven/utils';\nimport type { Container, EventEmitter } from '@deephaven/golden-layout';\nimport DropdownFilter, {\n DropdownFilterColumn,\n} from '../controls/dropdown-filter/DropdownFilter';\nimport { InputFilterEvent } from '../events';\nimport {\n getColumnsForDashboard,\n getColumnSelectionValidatorForDashboard,\n getIsolatedLinkerPanelIdForDashboard,\n getLinksForDashboard,\n getTableMapForDashboard,\n} from '../redux';\nimport './DropdownFilterPanel.scss';\nimport ToolType from '../linker/ToolType';\nimport WidgetPanel from './WidgetPanel';\nimport type { Link, LinkPoint } from '../linker/LinkerUtils';\nimport { ColumnSelectionValidator } from '../linker/ColumnSelectionValidator';\n\nconst log = Log.module('DropdownFilterPanel');\n\nconst DROPDOWN_FILTER_DEBOUNCE = 250;\n\ninterface PanelState {\n name?: string;\n type?: string;\n value?: string;\n isValueShown?: boolean;\n timestamp?: number;\n}\n\ninterface DropdownFilterPanelProps {\n glContainer: Container;\n glEventHub: EventEmitter;\n panelState?: PanelState;\n isLinkerActive: boolean;\n columns: Column[];\n columnSelectionValidator?: ColumnSelectionValidator;\n disableLinking: boolean;\n settings: {\n formatter: FormattingRule[];\n };\n // eslint-disable-next-line react/no-unused-prop-types\n panelTableMap: Map<string | string[], TableTemplate>;\n // eslint-disable-next-line react/no-unused-prop-types\n dashboardLinks: Link[];\n}\n\ninterface DropdownFilterPanelState {\n column?: DropdownFilterColumn;\n formatter: Formatter;\n valuesTable?: TableTemplate;\n valuesColumn?: Column;\n sourceSize: number;\n value: string;\n timestamp?: number;\n values: unknown[];\n isValueShown: boolean;\n wasFlipped: boolean;\n skipUpdate: boolean;\n\n panelState?: PanelState; // Dehydrated panel state that can load this panel\n\n isDisconnected: boolean;\n isLoading: boolean;\n isLoaded: boolean;\n error: unknown | null;\n}\n\nclass DropdownFilterPanel extends Component<\n DropdownFilterPanelProps,\n DropdownFilterPanelState\n> {\n static displayName = 'DropdownFilterPanel';\n\n static COMPONENT = 'DropdownFilterPanel';\n\n static MAX_TABLE_SIZE = 256;\n\n // Filter dropdown needs to show and send full timestamp format with nanoseconds\n static DATETIME_FORMATTER = new DateTimeColumnFormatter({\n showTimeZone: false,\n showTSeparator: true,\n defaultDateTimeFormatString: `yyyy-MM-dd HH:mm:ss.SSSSSSSSS`,\n });\n\n static SOURCE_COLUMN = Object.freeze({\n name: 'FilterSource',\n type: null,\n });\n\n constructor(props: DropdownFilterPanelProps) {\n super(props);\n\n this.handleChange = debounce(\n this.handleChange.bind(this),\n DROPDOWN_FILTER_DEBOUNCE\n );\n this.handleClearAllFilters = this.handleClearAllFilters.bind(this);\n this.handleDisconnect = this.handleDisconnect.bind(this);\n this.handleReconnect = this.handleReconnect.bind(this);\n this.handleColumnSelected = this.handleColumnSelected.bind(this);\n this.handleSourceFilterChange = this.handleSourceFilterChange.bind(this);\n this.handleSourceSortChange = this.handleSourceSortChange.bind(this);\n this.handleSourceSizeChange = this.handleSourceSizeChange.bind(this);\n this.handleSourceMouseEnter = this.handleSourceMouseEnter.bind(this);\n this.handleSourceMouseLeave = this.handleSourceMouseLeave.bind(this);\n this.handleValuesTableUpdate = this.handleValuesTableUpdate.bind(this);\n\n this.dropdownFilterRef = React.createRef();\n this.panelContainer = React.createRef();\n this.pending = new Pending();\n\n const { panelState, settings } = props;\n this.columnFormats = FormatterUtils.getColumnFormats(settings);\n const { value = '', isValueShown = false, name, type, timestamp } =\n panelState ?? {};\n const column = name != null && type != null ? { name, type } : undefined;\n this.state = {\n column,\n formatter: new Formatter(this.columnFormats),\n valuesTable: undefined,\n valuesColumn: undefined,\n sourceSize: 0,\n value,\n timestamp,\n values: [],\n isValueShown,\n wasFlipped: false,\n skipUpdate: false,\n\n // eslint-disable-next-line react/no-unused-state\n panelState, // Dehydrated panel state that can load this panel\n\n isDisconnected: false,\n isLoading: false,\n isLoaded: false,\n error: null,\n };\n }\n\n componentDidMount() {\n this.updateValuesTable();\n const { column, value, timestamp } = this.state;\n const sourceTable = this.getSourceTable();\n if (sourceTable !== null) {\n this.startListeningToSource(sourceTable);\n }\n if (column != null) {\n const { name, type } = column;\n this.sendUpdate(name, type, value, timestamp);\n }\n }\n\n componentDidUpdate(\n prevProps: DropdownFilterPanelProps,\n prevState: DropdownFilterPanelState\n ) {\n const { valuesTable } = this.state;\n const { settings } = this.props;\n const source = this.getSource();\n const sourceTable = this.getSourceTable();\n const prevSource = this.getSource(prevProps);\n const prevSourceTable = this.getSourceTable(prevProps);\n\n if (settings !== prevProps.settings && settings !== undefined) {\n this.updateFormatterSettings(settings);\n }\n\n if (\n valuesTable !== prevState.valuesTable &&\n prevState.valuesTable != null\n ) {\n log.debug('Table in state modified, closing the old table.');\n prevState.valuesTable.close();\n }\n\n // Checking source change in addition to table change\n // in case a different column is selected in the same table\n if (sourceTable !== prevSourceTable || source !== prevSource) {\n this.updateValuesTable();\n }\n\n if (sourceTable !== prevSourceTable) {\n if (prevSourceTable !== null) {\n this.stopListeningToSource(prevSourceTable);\n }\n if (sourceTable !== null) {\n this.startListeningToSource(sourceTable);\n }\n }\n }\n\n componentWillUnmount(): void {\n const { valuesTable } = this.state;\n const sourceTable = this.getSourceTable();\n this.pending.cancel();\n if (sourceTable !== null) {\n this.stopListeningToSource(sourceTable);\n }\n if (this.cleanup) {\n this.cleanup();\n }\n if (valuesTable != null) {\n valuesTable.close();\n }\n }\n\n dropdownFilterRef: RefObject<DropdownFilter>;\n\n panelContainer: RefObject<HTMLDivElement>;\n\n pending: Pending;\n\n cleanup?: () => void;\n\n columnFormats?: FormattingRule[];\n\n getCachedValues = memoize(\n (\n rawValues: unknown[],\n { type, name }: DropdownFilterColumn,\n formatter: Formatter\n ) => {\n if (type !== undefined && TableUtils.isDateType(type)) {\n return rawValues.map(value =>\n DropdownFilterPanel.DATETIME_FORMATTER.format(value as number)\n );\n }\n return rawValues.map(value =>\n // Skip formatting for nulls so they don't get converted to ''\n value != null && type != null\n ? formatter.getFormattedString(value, type, name)\n : null\n );\n }\n );\n\n getCoordinateForColumn(): [number, number] | null {\n if (this.panelContainer.current == null) {\n return null;\n }\n\n const element = this.panelContainer.current.querySelector(\n `.${DropdownFilter.SOURCE_BUTTON_CLASS_NAME}`\n );\n const rect = element?.getBoundingClientRect() ?? null;\n if (rect == null || rect.width <= 0 || rect.height <= 0) {\n return null;\n }\n const x = rect.left + rect.width / 2;\n const y = rect.bottom;\n return [x, y];\n }\n\n getSettingsErrorMessage(): string | undefined {\n const { sourceSize } = this.state;\n if (sourceSize > DropdownFilterPanel.MAX_TABLE_SIZE) {\n return `Table too large, must have fewer than ${DropdownFilterPanel.MAX_TABLE_SIZE} options.`;\n }\n return undefined;\n }\n\n getPanelErrorMessage(): string | undefined {\n const { error } = this.state;\n return error != null ? `${error}` : undefined;\n }\n\n getCachedPanelLinks = memoize(\n (dashboardLinks: Link[], panel: DropdownFilterPanel) => {\n const panelId = LayoutUtils.getIdFromPanel(panel);\n log.debug('getCachedPanelLinks', dashboardLinks, panelId);\n return dashboardLinks.filter(link => link.end?.panelId === panelId);\n }\n );\n\n getCachedSource = memoize((links: Link[]) => {\n log.debug('getCachedSource', links);\n let source: LinkPoint | undefined;\n if (links.length > 0) {\n const [link] = links;\n source = link.start;\n if (links.length > 1) {\n log.error('Filter has more that one link', links);\n }\n }\n return source;\n });\n\n getCachedSourceTable = memoize(\n (\n panelTableMap: Map<string | string[], TableTemplate<Table>>,\n source: LinkPoint | undefined\n ) => {\n log.debug('getCachedSourceTable', panelTableMap, source);\n if (source == null) {\n return null;\n }\n const { panelId } = source;\n return panelTableMap.get(panelId) ?? null;\n }\n );\n\n getCachedSourceColumn = memoize(\n (table: TableTemplate, source: LinkPoint | undefined) => {\n log.debug('getCachedSourceColumn', table, source);\n if (table == null || source == null) {\n return null;\n }\n return (\n table.columns.find(\n ({ name, type }) =>\n name === source.columnName && type === source.columnType\n ) ?? null\n );\n }\n );\n\n getSource(props = this.props) {\n const { dashboardLinks } = props;\n const panelLinks = this.getCachedPanelLinks(dashboardLinks, this);\n return this.getCachedSource(panelLinks);\n }\n\n getSourceTable(props = this.props) {\n const { panelTableMap } = props;\n const source = this.getSource(props);\n return this.getCachedSourceTable(panelTableMap, source);\n }\n\n getValuesColumn(valuesTable: TableTemplate): Column | null {\n const source = this.getSource();\n return this.getCachedSourceColumn(valuesTable, source);\n }\n\n startListeningToSource(sourceTable: TableTemplate): void {\n log.debug('startListeningToSource');\n sourceTable.addEventListener(\n dh.Table.EVENT_FILTERCHANGED,\n this.handleSourceFilterChange\n );\n sourceTable.addEventListener(\n dh.Table.EVENT_SORTCHANGED,\n this.handleSourceSortChange\n );\n sourceTable.addEventListener(\n dh.Table.EVENT_SIZECHANGED,\n this.handleSourceSizeChange\n );\n sourceTable.addEventListener(\n dh.Table.EVENT_DISCONNECT,\n this.handleDisconnect\n );\n sourceTable.addEventListener(\n dh.Table.EVENT_RECONNECT,\n this.handleReconnect\n );\n }\n\n stopListeningToSource(sourceTable: TableTemplate): void {\n log.debug('stopListeningToSource');\n sourceTable.removeEventListener(\n dh.Table.EVENT_FILTERCHANGED,\n this.handleSourceFilterChange\n );\n sourceTable.removeEventListener(\n dh.Table.EVENT_SORTCHANGED,\n this.handleSourceSortChange\n );\n sourceTable.removeEventListener(\n dh.Table.EVENT_SIZECHANGED,\n this.handleSourceSizeChange\n );\n sourceTable.removeEventListener(\n dh.Table.EVENT_DISCONNECT,\n this.handleDisconnect\n );\n sourceTable.removeEventListener(\n dh.Table.EVENT_RECONNECT,\n this.handleReconnect\n );\n }\n\n handleChange({\n column,\n isValueShown = false,\n value,\n }: {\n column: Partial<Column> | null;\n isValueShown?: boolean | undefined;\n value?: string | undefined;\n }) {\n const { name = undefined, type = undefined } = column ?? {};\n let sendUpdate = true;\n let timestamp: number | undefined = Date.now();\n this.setState(\n ({ panelState, timestamp: prevTimestamp, wasFlipped, skipUpdate }) => {\n // If the user had a value set, and they flip the card over and flip it back without changing any settings, ignore it\n const isFlip =\n panelState != null &&\n isValueShown !== panelState.isValueShown &&\n name === panelState.name &&\n type === panelState.type &&\n value === panelState.value;\n sendUpdate =\n (!skipUpdate && isValueShown && (!isFlip || !wasFlipped)) ?? false;\n\n if (!sendUpdate) {\n timestamp = prevTimestamp;\n }\n\n return {\n panelState: {\n isValueShown,\n name,\n type,\n value,\n timestamp: timestamp ?? undefined,\n },\n timestamp,\n wasFlipped: isFlip,\n skipUpdate: false,\n };\n },\n () => {\n if (sendUpdate) {\n this.sendUpdate(name ?? null, type, value, timestamp);\n }\n }\n );\n }\n\n handleDisconnect() {\n this.setState({\n error: new Error('Table disconnected'),\n isDisconnected: true,\n isLoading: false,\n });\n }\n\n handleReconnect() {\n this.setState({ isDisconnected: false, error: null });\n }\n\n handleSourceFilterChange() {\n this.applySourceFilters();\n }\n\n handleSourceSortChange() {\n this.applySourceSorts();\n }\n\n handleSourceSizeChange({ detail }: { detail: number }) {\n this.setState({ sourceSize: detail });\n }\n\n handleColumnSelected(): void {\n log.debug('handleColumnSelected');\n const { glEventHub } = this.props;\n glEventHub.emit(\n InputFilterEvent.COLUMN_SELECTED,\n this,\n DropdownFilterPanel.SOURCE_COLUMN\n );\n }\n\n handleClearAllFilters(): void {\n this.dropdownFilterRef?.current?.clearFilter();\n }\n\n /**\n * Set the filter value, card side, selected column\n * @param state Filter state to set\n * @param sendUpdate Emit filters changed event if true\n */\n setPanelState(\n state: {\n name: string;\n type: string;\n value: string;\n isValueShown: boolean;\n },\n sendUpdate = false\n ): void {\n if (this.getSource() == null) {\n log.debug('Ignore state update for unlinked filter', state);\n return;\n }\n // Set the skipUpdate flag so the next onChange handler call doesn't emit the FILTERS_CHANGED event\n this.setState({ skipUpdate: !sendUpdate });\n\n // Changing the inputFilter state via props doesn't quite work because of the delays on manual input changes\n // Setting the ref state directly triggers the onChange handler and updates the panelState\n this.dropdownFilterRef?.current?.setFilterState(state);\n }\n\n sendUpdate(\n name: string | null,\n type: string | undefined,\n value: string | undefined,\n timestamp?: number\n ): void {\n const { glEventHub } = this.props;\n const sourcePanelId = this.getSource()?.panelId;\n const excludePanelIds = sourcePanelId === null ? [] : [sourcePanelId];\n log.debug('sendUpdate', {\n name,\n type,\n value,\n timestamp,\n excludePanelIds,\n });\n\n glEventHub.emit(InputFilterEvent.FILTERS_CHANGED, this, {\n name,\n type,\n value: value != null ? value : '=null',\n timestamp,\n excludePanelIds,\n });\n }\n\n updateValuesTable(): void {\n const source = this.getSource();\n const sourceTable = this.getSourceTable();\n log.debug('updateValuesTable', source, sourceTable);\n\n this.setState({\n values: [],\n valuesTable: undefined,\n error: null,\n });\n\n if (source == null) {\n log.debug('Filter unlinked.');\n this.setState({\n isLoading: false,\n isLoaded: true,\n isValueShown: false,\n sourceSize: 0,\n });\n return;\n }\n\n this.setState({ isLoading: true });\n\n if (sourceTable == null) {\n return;\n }\n\n this.setState({ isLoaded: false, sourceSize: sourceTable.size });\n\n this.pending\n .add(sourceTable.copy(), resolved => resolved.close())\n .then(valuesTable => {\n // Loading/loaded will be set when values array is actually populated\n this.updateViewportListener(valuesTable);\n this.setState({ valuesTable });\n })\n .catch((error: unknown) => {\n if (PromiseUtils.isCanceled(error)) {\n return;\n }\n log.error(error);\n this.setState({ isLoading: false, error });\n });\n }\n\n applySourceSorts() {\n const { valuesTable } = this.state;\n const sourceTable = this.getSourceTable();\n log.debug('applySourceSorts', sourceTable?.sort);\n if (valuesTable == null || sourceTable == null) {\n log.debug('Table not initialized');\n return;\n }\n const sorts = [...sourceTable.sort];\n valuesTable.applySort(sorts);\n this.setViewport(valuesTable);\n }\n\n applySourceFilters(): void {\n const { valuesTable } = this.state;\n const sourceTable = this.getSourceTable();\n log.debug('applySourceFilters', sourceTable?.filter);\n if (valuesTable == null || sourceTable == null) {\n log.debug('Table not initialized');\n return;\n }\n const filters = [...sourceTable.filter];\n valuesTable.applyFilter(filters);\n this.setViewport(valuesTable);\n }\n\n updateViewportListener(valuesTable: TableTemplate): void {\n log.debug('updateViewportListener', valuesTable?.size);\n\n if (this.cleanup) {\n this.cleanup();\n }\n\n if (valuesTable == null) {\n this.cleanup = undefined;\n return;\n }\n\n this.cleanup = valuesTable.addEventListener(\n dh.Table.EVENT_UPDATED,\n this.handleValuesTableUpdate\n );\n\n this.setViewport(valuesTable);\n }\n\n setViewport(valuesTable: TableTemplate): void {\n const valuesColumn = this.getValuesColumn(valuesTable);\n if (!valuesColumn) {\n log.error('values column is null');\n return;\n }\n valuesTable.setViewport(0, DropdownFilterPanel.MAX_TABLE_SIZE - 1, [\n valuesColumn,\n ]);\n }\n\n updateFormatterSettings(settings: {\n formatter?: FormattingRule[] | undefined;\n }) {\n const columnFormats = FormatterUtils.getColumnFormats(settings);\n if (!deepEqual(this.columnFormats, columnFormats)) {\n this.columnFormats = columnFormats;\n this.setState({ formatter: new Formatter(columnFormats) });\n }\n }\n\n handleValuesTableUpdate({ detail }: { detail: { rows: Row[] } }) {\n const { rows } = detail;\n const { valuesTable } = this.state;\n if (!valuesTable) {\n log.error('valuesTable is null');\n return;\n }\n const valuesColumn = this.getValuesColumn(valuesTable);\n if (!valuesColumn) {\n log.error('Values column not found');\n return;\n }\n const values = rows.map(row => row.get(valuesColumn));\n this.setState({ values, isLoading: false, isLoaded: true, valuesColumn });\n }\n\n handleSourceMouseEnter() {\n const { columnSelectionValidator } = this.props;\n if (!columnSelectionValidator) {\n return;\n }\n columnSelectionValidator(this, DropdownFilterPanel.SOURCE_COLUMN);\n }\n\n handleSourceMouseLeave() {\n const { columnSelectionValidator } = this.props;\n if (!columnSelectionValidator) {\n return;\n }\n columnSelectionValidator(this, undefined);\n }\n\n render() {\n const {\n columns,\n disableLinking,\n glContainer,\n glEventHub,\n isLinkerActive,\n } = this.props;\n const {\n column,\n formatter,\n isDisconnected,\n isValueShown,\n value,\n values,\n valuesColumn,\n isLoading,\n isLoaded,\n } = this.state;\n\n const source = this.getSource();\n const settingsErrorMessage = this.getSettingsErrorMessage();\n const panelErrorMessage = this.getPanelErrorMessage();\n const formattedValues =\n isLoaded && valuesColumn != null\n ? this.getCachedValues(values, valuesColumn, formatter)\n : [];\n\n return (\n <WidgetPanel\n errorMessage={panelErrorMessage}\n isLoading={isLoading}\n isLoaded={isLoaded}\n isDisconnected={isDisconnected}\n className=\"iris-dropdown-filter-panel\"\n componentPanel={this}\n glContainer={glContainer}\n glEventHub={glEventHub}\n onClearAllFilters={this.handleClearAllFilters}\n widgetName=\"Dropdown Filter\"\n widgetType=\"DropdownFilter\"\n >\n <div\n ref={this.panelContainer}\n className=\"dropdown-filter-container h-100 w-100 container\"\n >\n <DropdownFilter\n ref={this.dropdownFilterRef}\n column={column}\n columns={columns}\n isValueShown={isValueShown}\n isLinkerActive={isLinkerActive}\n disableLinking={disableLinking}\n isLoaded={isLoaded}\n settingsError={settingsErrorMessage}\n source={source}\n value={value}\n values={formattedValues}\n onChange={this.handleChange}\n onColumnSelected={this.handleColumnSelected}\n onSourceMouseEnter={this.handleSourceMouseEnter}\n onSourceMouseLeave={this.handleSourceMouseLeave}\n />\n </div>\n </WidgetPanel>\n );\n }\n}\n\nconst mapStateToProps = (\n state: RootState,\n ownProps: { localDashboardId: string; glContainer: Container }\n) => {\n const { localDashboardId } = ownProps;\n const panelId = LayoutUtils.getIdFromPanel({ props: ownProps });\n const panelTableMap = getTableMapForDashboard(state, localDashboardId);\n const dashboardLinks = getLinksForDashboard(state, localDashboardId);\n const activeTool = getActiveTool(state);\n const isolatedLinkerPanelId = getIsolatedLinkerPanelIdForDashboard(\n state,\n localDashboardId\n );\n const isLinkerActive =\n activeTool === ToolType.LINKER &&\n (isolatedLinkerPanelId === undefined || isolatedLinkerPanelId === panelId);\n // Disable linking if linker is in isolated mode for a different panel\n const disableLinking =\n activeTool === ToolType.LINKER &&\n isolatedLinkerPanelId !== undefined &&\n isolatedLinkerPanelId !== panelId;\n\n return {\n columns: getColumnsForDashboard(state, localDashboardId),\n columnSelectionValidator: getColumnSelectionValidatorForDashboard(\n state,\n localDashboardId\n ),\n isLinkerActive,\n disableLinking,\n settings: getSettings(state),\n panelTableMap,\n dashboardLinks,\n };\n};\n\nexport default connect(mapStateToProps, null, null, { forwardRef: true })(\n DropdownFilterPanel\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"DropdownFilterPanel.js","names":["React","Component","connect","debounce","deepEqual","memoize","LayoutUtils","dh","DateTimeColumnFormatter","Formatter","FormatterUtils","TableUtils","Log","getActiveTool","getSettings","Pending","PromiseUtils","DropdownFilter","InputFilterEvent","getColumnsForDashboard","getColumnSelectionValidatorForDashboard","getIsolatedLinkerPanelIdForDashboard","getLinksForDashboard","getTableMapForDashboard","ToolType","WidgetPanel","log","module","DROPDOWN_FILTER_DEBOUNCE","mapStateToProps","state","ownProps","localDashboardId","panelId","getIdFromPanel","props","panelTableMap","dashboardLinks","activeTool","isolatedLinkerPanelId","isLinkerActive","LINKER","undefined","disableLinking","columns","columnSelectionValidator","settings","connector","forwardRef","DropdownFilterPanel","constructor","rawValues","formatter","type","name","isDateType","map","value","DATETIME_FORMATTER","format","getFormattedString","panel","debug","filter","link","end","links","source","length","start","error","get","table","find","columnName","columnType","handleChange","bind","handleClearAllFilters","handleDisconnect","handleReconnect","handleColumnSelected","handleSourceFilterChange","handleSourceSortChange","handleSourceSizeChange","handleSourceMouseEnter","handleSourceMouseLeave","handleValuesTableUpdate","dropdownFilterRef","createRef","panelContainer","pending","panelState","columnFormats","getColumnFormats","isValueShown","timestamp","column","valuesTable","valuesColumn","sourceSize","values","wasFlipped","skipUpdate","isDisconnected","isLoading","isLoaded","componentDidMount","updateValuesTable","sourceTable","getSourceTable","startListeningToSource","sendUpdate","componentDidUpdate","prevProps","prevState","getSource","prevSource","prevSourceTable","updateFormatterSettings","close","stopListeningToSource","componentWillUnmount","cancel","cleanup","getCoordinateForColumn","current","element","querySelector","SOURCE_BUTTON_CLASS_NAME","rect","getBoundingClientRect","width","height","x","left","y","bottom","getSettingsErrorMessage","MAX_TABLE_SIZE","getPanelErrorMessage","panelLinks","getCachedPanelLinks","getCachedSource","getCachedSourceTable","getValuesColumn","getCachedSourceColumn","addEventListener","Table","EVENT_FILTERCHANGED","EVENT_SORTCHANGED","EVENT_SIZECHANGED","EVENT_DISCONNECT","EVENT_RECONNECT","removeEventListener","Date","now","setState","prevTimestamp","isFlip","Error","applySourceFilters","applySourceSorts","detail","glEventHub","emit","COLUMN_SELECTED","SOURCE_COLUMN","clearFilter","setPanelState","setFilterState","sourcePanelId","excludePanelIds","FILTERS_CHANGED","size","add","copy","resolved","then","updateViewportListener","catch","isCanceled","sort","sorts","applySort","setViewport","filters","applyFilter","EVENT_UPDATED","rows","row","render","glContainer","settingsErrorMessage","panelErrorMessage","formattedValues","getCachedValues","showTimeZone","showTSeparator","defaultDateTimeFormatString","Object","freeze"],"sources":["../../src/panels/DropdownFilterPanel.tsx"],"sourcesContent":["import React, { Component, RefObject } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\nimport debounce from 'lodash.debounce';\nimport deepEqual from 'deep-equal';\nimport memoize from 'memoizee';\nimport { DashboardPanelProps, LayoutUtils } from '@deephaven/dashboard';\nimport dh from '@deephaven/jsapi-shim';\nimport type { Column, Row, Table, TableTemplate } from '@deephaven/jsapi-shim';\nimport {\n DateTimeColumnFormatter,\n Formatter,\n FormatterUtils,\n FormattingRule,\n TableUtils,\n} from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport { getActiveTool, getSettings, RootState } from '@deephaven/redux';\nimport { Pending, PromiseUtils } from '@deephaven/utils';\nimport DropdownFilter, {\n DropdownFilterColumn,\n} from '../controls/dropdown-filter/DropdownFilter';\nimport { InputFilterEvent } from '../events';\nimport {\n getColumnsForDashboard,\n getColumnSelectionValidatorForDashboard,\n getIsolatedLinkerPanelIdForDashboard,\n getLinksForDashboard,\n getTableMapForDashboard,\n} from '../redux';\nimport './DropdownFilterPanel.scss';\nimport ToolType from '../linker/ToolType';\nimport WidgetPanel from './WidgetPanel';\nimport type { Link, LinkPoint } from '../linker/LinkerUtils';\nimport { ColumnSelectionValidator } from '../linker/ColumnSelectionValidator';\nimport { PanelState as InputFilterPanelState } from './InputFilterPanel';\n\nconst log = Log.module('DropdownFilterPanel');\n\nconst DROPDOWN_FILTER_DEBOUNCE = 250;\n\ninterface PanelState {\n name?: string;\n type?: string;\n value?: string;\n isValueShown?: boolean;\n timestamp?: number;\n}\n\ntype PanelTableMap = Map<string | string[], TableTemplate>;\n\ntype StateProps = {\n columns: Column[];\n columnSelectionValidator?: ColumnSelectionValidator;\n dashboardLinks: Link[];\n disableLinking: boolean;\n isLinkerActive: boolean;\n panelTableMap: PanelTableMap;\n panelState?: PanelState;\n settings: { formatter: FormattingRule[] };\n};\n\ntype OwnProps = DashboardPanelProps;\n\nconst mapStateToProps = (state: RootState, ownProps: OwnProps): StateProps => {\n const { localDashboardId } = ownProps;\n const panelId = LayoutUtils.getIdFromPanel({ props: ownProps });\n const panelTableMap = getTableMapForDashboard(state, localDashboardId);\n const dashboardLinks = getLinksForDashboard(state, localDashboardId);\n const activeTool = getActiveTool(state);\n const isolatedLinkerPanelId = getIsolatedLinkerPanelIdForDashboard(\n state,\n localDashboardId\n );\n const isLinkerActive =\n activeTool === ToolType.LINKER &&\n (isolatedLinkerPanelId === undefined || isolatedLinkerPanelId === panelId);\n // Disable linking if linker is in isolated mode for a different panel\n const disableLinking =\n activeTool === ToolType.LINKER &&\n isolatedLinkerPanelId !== undefined &&\n isolatedLinkerPanelId !== panelId;\n\n return {\n columns: getColumnsForDashboard(state, localDashboardId),\n columnSelectionValidator: getColumnSelectionValidatorForDashboard(\n state,\n localDashboardId\n ),\n isLinkerActive,\n disableLinking,\n settings: getSettings(state),\n panelTableMap,\n dashboardLinks,\n };\n};\n\nconst connector = connect(mapStateToProps, null, null, { forwardRef: true });\n\nexport type DropdownFilterPanelProps = OwnProps &\n StateProps &\n ConnectedProps<typeof connector>;\n\ninterface DropdownFilterPanelState {\n column?: DropdownFilterColumn;\n formatter: Formatter;\n valuesTable?: TableTemplate;\n valuesColumn?: Column;\n sourceSize: number;\n value: string;\n timestamp?: number;\n values: unknown[];\n isValueShown: boolean;\n wasFlipped: boolean;\n skipUpdate: boolean;\n\n panelState?: PanelState; // Dehydrated panel state that can load this panel\n\n isDisconnected: boolean;\n isLoading: boolean;\n isLoaded: boolean;\n error: unknown | null;\n}\n\nexport class DropdownFilterPanel extends Component<\n DropdownFilterPanelProps,\n DropdownFilterPanelState\n> {\n static displayName = 'DropdownFilterPanel';\n\n static COMPONENT = 'DropdownFilterPanel';\n\n static MAX_TABLE_SIZE = 256;\n\n // Filter dropdown needs to show and send full timestamp format with nanoseconds\n static DATETIME_FORMATTER = new DateTimeColumnFormatter({\n showTimeZone: false,\n showTSeparator: true,\n defaultDateTimeFormatString: `yyyy-MM-dd HH:mm:ss.SSSSSSSSS`,\n });\n\n static SOURCE_COLUMN = Object.freeze({\n name: 'FilterSource',\n type: null,\n });\n\n constructor(props: DropdownFilterPanelProps) {\n super(props);\n\n this.handleChange = debounce(\n this.handleChange.bind(this),\n DROPDOWN_FILTER_DEBOUNCE\n );\n this.handleClearAllFilters = this.handleClearAllFilters.bind(this);\n this.handleDisconnect = this.handleDisconnect.bind(this);\n this.handleReconnect = this.handleReconnect.bind(this);\n this.handleColumnSelected = this.handleColumnSelected.bind(this);\n this.handleSourceFilterChange = this.handleSourceFilterChange.bind(this);\n this.handleSourceSortChange = this.handleSourceSortChange.bind(this);\n this.handleSourceSizeChange = this.handleSourceSizeChange.bind(this);\n this.handleSourceMouseEnter = this.handleSourceMouseEnter.bind(this);\n this.handleSourceMouseLeave = this.handleSourceMouseLeave.bind(this);\n this.handleValuesTableUpdate = this.handleValuesTableUpdate.bind(this);\n\n this.dropdownFilterRef = React.createRef();\n this.panelContainer = React.createRef();\n this.pending = new Pending();\n\n const { panelState, settings } = props;\n this.columnFormats = FormatterUtils.getColumnFormats(settings);\n const { value = '', isValueShown = false, name, type, timestamp } =\n panelState ?? {};\n const column = name != null && type != null ? { name, type } : undefined;\n this.state = {\n column,\n formatter: new Formatter(this.columnFormats),\n valuesTable: undefined,\n valuesColumn: undefined,\n sourceSize: 0,\n value,\n timestamp,\n values: [],\n isValueShown,\n wasFlipped: false,\n skipUpdate: false,\n\n // eslint-disable-next-line react/no-unused-state\n panelState, // Dehydrated panel state that can load this panel\n\n isDisconnected: false,\n isLoading: false,\n isLoaded: false,\n error: null,\n };\n }\n\n componentDidMount(): void {\n this.updateValuesTable();\n const { dashboardLinks, panelTableMap } = this.props;\n const { column, value, timestamp } = this.state;\n const sourceTable = this.getSourceTable(panelTableMap, dashboardLinks);\n if (sourceTable !== null) {\n this.startListeningToSource(sourceTable);\n }\n if (column != null) {\n const { name, type } = column;\n this.sendUpdate(name, type, value, timestamp);\n }\n }\n\n componentDidUpdate(\n prevProps: DropdownFilterPanelProps,\n prevState: DropdownFilterPanelState\n ): void {\n const { dashboardLinks, panelTableMap, settings } = this.props;\n const { valuesTable } = this.state;\n const source = this.getSource(dashboardLinks);\n const sourceTable = this.getSourceTable(panelTableMap, dashboardLinks);\n\n const prevSource = this.getSource(prevProps.dashboardLinks);\n const prevSourceTable = this.getSourceTable(\n prevProps.panelTableMap,\n prevProps.dashboardLinks\n );\n\n if (settings !== prevProps.settings && settings !== undefined) {\n this.updateFormatterSettings(settings);\n }\n\n if (\n valuesTable !== prevState.valuesTable &&\n prevState.valuesTable != null\n ) {\n log.debug('Table in state modified, closing the old table.');\n prevState.valuesTable.close();\n }\n\n // Checking source change in addition to table change\n // in case a different column is selected in the same table\n if (sourceTable !== prevSourceTable || source !== prevSource) {\n this.updateValuesTable();\n }\n\n if (sourceTable !== prevSourceTable) {\n if (prevSourceTable !== null) {\n this.stopListeningToSource(prevSourceTable);\n }\n if (sourceTable !== null) {\n this.startListeningToSource(sourceTable);\n }\n }\n }\n\n componentWillUnmount(): void {\n const { dashboardLinks, panelTableMap } = this.props;\n const { valuesTable } = this.state;\n const sourceTable = this.getSourceTable(panelTableMap, dashboardLinks);\n this.pending.cancel();\n if (sourceTable !== null) {\n this.stopListeningToSource(sourceTable);\n }\n if (this.cleanup) {\n this.cleanup();\n }\n if (valuesTable != null) {\n valuesTable.close();\n }\n }\n\n dropdownFilterRef: RefObject<DropdownFilter>;\n\n panelContainer: RefObject<HTMLDivElement>;\n\n pending: Pending;\n\n cleanup?: () => void;\n\n columnFormats?: FormattingRule[];\n\n getCachedValues = memoize(\n (\n rawValues: unknown[],\n { type, name }: DropdownFilterColumn,\n formatter: Formatter\n ) => {\n if (type !== undefined && TableUtils.isDateType(type)) {\n return rawValues.map(value =>\n DropdownFilterPanel.DATETIME_FORMATTER.format(value as number)\n );\n }\n return rawValues.map(value =>\n // Skip formatting for nulls so they don't get converted to ''\n value != null && type != null\n ? formatter.getFormattedString(value, type, name)\n : null\n );\n }\n );\n\n getCoordinateForColumn(): [number, number] | null {\n if (this.panelContainer.current == null) {\n return null;\n }\n\n const element = this.panelContainer.current.querySelector(\n `.${DropdownFilter.SOURCE_BUTTON_CLASS_NAME}`\n );\n const rect = element?.getBoundingClientRect() ?? null;\n if (rect == null || rect.width <= 0 || rect.height <= 0) {\n return null;\n }\n const x = rect.left + rect.width / 2;\n const y = rect.bottom;\n return [x, y];\n }\n\n getSettingsErrorMessage(): string | undefined {\n const { sourceSize } = this.state;\n if (sourceSize > DropdownFilterPanel.MAX_TABLE_SIZE) {\n return `Table too large, must have fewer than ${DropdownFilterPanel.MAX_TABLE_SIZE} options.`;\n }\n return undefined;\n }\n\n getPanelErrorMessage(): string | undefined {\n const { error } = this.state;\n return error != null ? `${error}` : undefined;\n }\n\n getCachedPanelLinks = memoize(\n (dashboardLinks: Link[], panel: DropdownFilterPanel) => {\n const panelId = LayoutUtils.getIdFromPanel(panel);\n log.debug('getCachedPanelLinks', dashboardLinks, panelId);\n return dashboardLinks.filter(link => link.end?.panelId === panelId);\n }\n );\n\n getCachedSource = memoize((links: Link[]) => {\n log.debug('getCachedSource', links);\n let source: LinkPoint | undefined;\n if (links.length > 0) {\n const [link] = links;\n source = link.start;\n if (links.length > 1) {\n log.error('Filter has more that one link', links);\n }\n }\n return source;\n });\n\n getCachedSourceTable = memoize(\n (\n panelTableMap: Map<string | string[], TableTemplate<Table>>,\n source: LinkPoint | undefined\n ) => {\n log.debug('getCachedSourceTable', panelTableMap, source);\n if (source == null) {\n return null;\n }\n const { panelId } = source;\n return panelTableMap.get(panelId) ?? null;\n }\n );\n\n getCachedSourceColumn = memoize(\n (table: TableTemplate, source: LinkPoint | undefined) => {\n log.debug('getCachedSourceColumn', table, source);\n if (table == null || source == null) {\n return null;\n }\n return (\n table.columns.find(\n ({ name, type }) =>\n name === source.columnName && type === source.columnType\n ) ?? null\n );\n }\n );\n\n getSource(links: Link[]): LinkPoint | undefined {\n const panelLinks = this.getCachedPanelLinks(links, this);\n return this.getCachedSource(panelLinks);\n }\n\n getSourceTable(\n panelTableMap: PanelTableMap,\n links: Link[]\n ): TableTemplate | null {\n const source = this.getSource(links);\n return this.getCachedSourceTable(panelTableMap, source);\n }\n\n getValuesColumn(valuesTable: TableTemplate, links: Link[]): Column | null {\n const source = this.getSource(links);\n return this.getCachedSourceColumn(valuesTable, source);\n }\n\n startListeningToSource(sourceTable: TableTemplate): void {\n log.debug('startListeningToSource');\n sourceTable.addEventListener(\n dh.Table.EVENT_FILTERCHANGED,\n this.handleSourceFilterChange\n );\n sourceTable.addEventListener(\n dh.Table.EVENT_SORTCHANGED,\n this.handleSourceSortChange\n );\n sourceTable.addEventListener(\n dh.Table.EVENT_SIZECHANGED,\n this.handleSourceSizeChange\n );\n sourceTable.addEventListener(\n dh.Table.EVENT_DISCONNECT,\n this.handleDisconnect\n );\n sourceTable.addEventListener(\n dh.Table.EVENT_RECONNECT,\n this.handleReconnect\n );\n }\n\n stopListeningToSource(sourceTable: TableTemplate): void {\n log.debug('stopListeningToSource');\n sourceTable.removeEventListener(\n dh.Table.EVENT_FILTERCHANGED,\n this.handleSourceFilterChange\n );\n sourceTable.removeEventListener(\n dh.Table.EVENT_SORTCHANGED,\n this.handleSourceSortChange\n );\n sourceTable.removeEventListener(\n dh.Table.EVENT_SIZECHANGED,\n this.handleSourceSizeChange\n );\n sourceTable.removeEventListener(\n dh.Table.EVENT_DISCONNECT,\n this.handleDisconnect\n );\n sourceTable.removeEventListener(\n dh.Table.EVENT_RECONNECT,\n this.handleReconnect\n );\n }\n\n handleChange({\n column,\n isValueShown = false,\n value,\n }: {\n column: Partial<Column> | null;\n isValueShown?: boolean | undefined;\n value?: string | undefined;\n }): void {\n const { name = undefined, type = undefined } = column ?? {};\n let sendUpdate = true;\n let timestamp: number | undefined = Date.now();\n this.setState(\n ({ panelState, timestamp: prevTimestamp, wasFlipped, skipUpdate }) => {\n // If the user had a value set, and they flip the card over and flip it back without changing any settings, ignore it\n const isFlip =\n panelState != null &&\n isValueShown !== panelState.isValueShown &&\n name === panelState.name &&\n type === panelState.type &&\n value === panelState.value;\n sendUpdate =\n (!skipUpdate && isValueShown && (!isFlip || !wasFlipped)) ?? false;\n\n if (!sendUpdate) {\n timestamp = prevTimestamp;\n }\n\n return {\n panelState: {\n isValueShown,\n name,\n type,\n value,\n timestamp: timestamp ?? undefined,\n },\n timestamp,\n wasFlipped: isFlip,\n skipUpdate: false,\n };\n },\n () => {\n if (sendUpdate) {\n this.sendUpdate(name ?? null, type, value, timestamp);\n }\n }\n );\n }\n\n handleDisconnect(): void {\n this.setState({\n error: new Error('Table disconnected'),\n isDisconnected: true,\n isLoading: false,\n });\n }\n\n handleReconnect(): void {\n this.setState({ isDisconnected: false, error: null });\n }\n\n handleSourceFilterChange(): void {\n this.applySourceFilters();\n }\n\n handleSourceSortChange(): void {\n this.applySourceSorts();\n }\n\n handleSourceSizeChange({ detail }: { detail: number }): void {\n this.setState({ sourceSize: detail });\n }\n\n handleColumnSelected(): void {\n log.debug('handleColumnSelected');\n const { glEventHub } = this.props;\n glEventHub.emit(\n InputFilterEvent.COLUMN_SELECTED,\n this,\n DropdownFilterPanel.SOURCE_COLUMN\n );\n }\n\n handleClearAllFilters(): void {\n this.dropdownFilterRef?.current?.clearFilter();\n }\n\n /**\n * Set the filter value, card side, selected column\n * @param state Filter state to set\n * @param sendUpdate Emit filters changed event if true\n */\n setPanelState(state: InputFilterPanelState, sendUpdate = false): void {\n const { dashboardLinks } = this.props;\n if (this.getSource(dashboardLinks) == null) {\n log.debug('Ignore state update for unlinked filter', state);\n return;\n }\n // Set the skipUpdate flag so the next onChange handler call doesn't emit the FILTERS_CHANGED event\n this.setState({ skipUpdate: !sendUpdate });\n\n // Changing the inputFilter state via props doesn't quite work because of the delays on manual input changes\n // Setting the ref state directly triggers the onChange handler and updates the panelState\n this.dropdownFilterRef?.current?.setFilterState(state);\n }\n\n sendUpdate(\n name: string | null,\n type: string | undefined,\n value: string | undefined,\n timestamp?: number\n ): void {\n const { dashboardLinks, glEventHub } = this.props;\n const sourcePanelId = this.getSource(dashboardLinks)?.panelId;\n const excludePanelIds = sourcePanelId === null ? [] : [sourcePanelId];\n log.debug('sendUpdate', {\n name,\n type,\n value,\n timestamp,\n excludePanelIds,\n });\n\n glEventHub.emit(InputFilterEvent.FILTERS_CHANGED, this, {\n name,\n type,\n value: value != null ? value : '=null',\n timestamp,\n excludePanelIds,\n });\n }\n\n updateValuesTable(): void {\n const { dashboardLinks, panelTableMap } = this.props;\n const source = this.getSource(dashboardLinks);\n const sourceTable = this.getSourceTable(panelTableMap, dashboardLinks);\n log.debug('updateValuesTable', source, sourceTable);\n\n this.setState({\n values: [],\n valuesTable: undefined,\n error: null,\n });\n\n if (source == null) {\n log.debug('Filter unlinked.');\n this.setState({\n isLoading: false,\n isLoaded: true,\n isValueShown: false,\n sourceSize: 0,\n });\n return;\n }\n\n this.setState({ isLoading: true });\n\n if (sourceTable == null) {\n return;\n }\n\n this.setState({ isLoaded: false, sourceSize: sourceTable.size });\n\n this.pending\n .add(sourceTable.copy(), resolved => resolved.close())\n .then(valuesTable => {\n // Loading/loaded will be set when values array is actually populated\n this.updateViewportListener(valuesTable);\n this.setState({ valuesTable });\n })\n .catch((error: unknown) => {\n if (PromiseUtils.isCanceled(error)) {\n return;\n }\n log.error(error);\n this.setState({ isLoading: false, error });\n });\n }\n\n applySourceSorts(): void {\n const { dashboardLinks, panelTableMap } = this.props;\n const { valuesTable } = this.state;\n const sourceTable = this.getSourceTable(panelTableMap, dashboardLinks);\n log.debug('applySourceSorts', sourceTable?.sort);\n if (valuesTable == null || sourceTable == null) {\n log.debug('Table not initialized');\n return;\n }\n const sorts = [...sourceTable.sort];\n valuesTable.applySort(sorts);\n this.setViewport(valuesTable);\n }\n\n applySourceFilters(): void {\n const { dashboardLinks, panelTableMap } = this.props;\n const { valuesTable } = this.state;\n const sourceTable = this.getSourceTable(panelTableMap, dashboardLinks);\n log.debug('applySourceFilters', sourceTable?.filter);\n if (valuesTable == null || sourceTable == null) {\n log.debug('Table not initialized');\n return;\n }\n const filters = [...sourceTable.filter];\n valuesTable.applyFilter(filters);\n this.setViewport(valuesTable);\n }\n\n updateViewportListener(valuesTable: TableTemplate): void {\n log.debug('updateViewportListener', valuesTable?.size);\n\n if (this.cleanup) {\n this.cleanup();\n }\n\n if (valuesTable == null) {\n this.cleanup = undefined;\n return;\n }\n\n this.cleanup = valuesTable.addEventListener(\n dh.Table.EVENT_UPDATED,\n this.handleValuesTableUpdate\n );\n\n this.setViewport(valuesTable);\n }\n\n setViewport(valuesTable: TableTemplate): void {\n const { dashboardLinks } = this.props;\n const valuesColumn = this.getValuesColumn(valuesTable, dashboardLinks);\n if (!valuesColumn) {\n log.error('values column is null');\n return;\n }\n valuesTable.setViewport(0, DropdownFilterPanel.MAX_TABLE_SIZE - 1, [\n valuesColumn,\n ]);\n }\n\n updateFormatterSettings(settings: {\n formatter?: FormattingRule[] | undefined;\n }): void {\n const columnFormats = FormatterUtils.getColumnFormats(settings);\n if (!deepEqual(this.columnFormats, columnFormats)) {\n this.columnFormats = columnFormats;\n this.setState({ formatter: new Formatter(columnFormats) });\n }\n }\n\n handleValuesTableUpdate({ detail }: { detail: { rows: Row[] } }): void {\n const { rows } = detail;\n const { dashboardLinks } = this.props;\n const { valuesTable } = this.state;\n if (!valuesTable) {\n log.error('valuesTable is null');\n return;\n }\n const valuesColumn = this.getValuesColumn(valuesTable, dashboardLinks);\n if (!valuesColumn) {\n log.error('Values column not found');\n return;\n }\n const values = rows.map(row => row.get(valuesColumn));\n this.setState({ values, isLoading: false, isLoaded: true, valuesColumn });\n }\n\n handleSourceMouseEnter(): void {\n const { columnSelectionValidator } = this.props;\n if (!columnSelectionValidator) {\n return;\n }\n columnSelectionValidator(this, DropdownFilterPanel.SOURCE_COLUMN);\n }\n\n handleSourceMouseLeave(): void {\n const { columnSelectionValidator } = this.props;\n if (!columnSelectionValidator) {\n return;\n }\n columnSelectionValidator(this, undefined);\n }\n\n render(): React.ReactElement {\n const {\n columns,\n dashboardLinks,\n disableLinking,\n glContainer,\n glEventHub,\n isLinkerActive,\n } = this.props;\n const {\n column,\n formatter,\n isDisconnected,\n isValueShown,\n value,\n values,\n valuesColumn,\n isLoading,\n isLoaded,\n } = this.state;\n const source = this.getSource(dashboardLinks);\n const settingsErrorMessage = this.getSettingsErrorMessage();\n const panelErrorMessage = this.getPanelErrorMessage();\n const formattedValues =\n isLoaded && valuesColumn != null\n ? this.getCachedValues(values, valuesColumn, formatter)\n : [];\n\n return (\n <WidgetPanel\n errorMessage={panelErrorMessage}\n isLoading={isLoading}\n isLoaded={isLoaded}\n isDisconnected={isDisconnected}\n className=\"iris-dropdown-filter-panel\"\n componentPanel={this}\n glContainer={glContainer}\n glEventHub={glEventHub}\n onClearAllFilters={this.handleClearAllFilters}\n widgetName=\"Dropdown Filter\"\n widgetType=\"DropdownFilter\"\n >\n <div\n ref={this.panelContainer}\n className=\"dropdown-filter-container h-100 w-100 container\"\n >\n <DropdownFilter\n ref={this.dropdownFilterRef}\n column={column}\n columns={columns}\n isValueShown={isValueShown}\n isLinkerActive={isLinkerActive}\n disableLinking={disableLinking}\n isLoaded={isLoaded}\n settingsError={settingsErrorMessage}\n source={source}\n value={value}\n values={formattedValues}\n onChange={this.handleChange}\n onColumnSelected={this.handleColumnSelected}\n onSourceMouseEnter={this.handleSourceMouseEnter}\n onSourceMouseLeave={this.handleSourceMouseLeave}\n />\n </div>\n </WidgetPanel>\n );\n }\n}\n\nexport default connector(DropdownFilterPanel);\n"],"mappings":";AAAA,OAAOA,KAAK,IAAIC,SAAS,QAAmB,OAAO;AACnD,SAASC,OAAO,QAAwB,aAAa;AACrD,OAAOC,QAAQ,MAAM,iBAAiB;AACtC,OAAOC,SAAS,MAAM,YAAY;AAClC,OAAOC,OAAO,MAAM,UAAU;AAC9B,SAA8BC,WAAW,QAAQ,sBAAsB;AACvE,OAAOC,EAAE,MAAM,uBAAuB;AAEtC,SACEC,uBAAuB,EACvBC,SAAS,EACTC,cAAc,EAEdC,UAAU,QACL,wBAAwB;AAC/B,OAAOC,GAAG,MAAM,gBAAgB;AAChC,SAASC,aAAa,EAAEC,WAAW,QAAmB,kBAAkB;AACxE,SAASC,OAAO,EAAEC,YAAY,QAAQ,kBAAkB;AAAC,OAClDC,cAAc;AAAA,SAGZC,gBAAgB;AAAA,SAEvBC,sBAAsB,EACtBC,uCAAuC,EACvCC,oCAAoC,EACpCC,oBAAoB,EACpBC,uBAAuB;AAAA;AAAA,OAGlBC,QAAQ;AAAA,OACRC,WAAW;AAKlB,IAAMC,GAAG,GAAGd,GAAG,CAACe,MAAM,CAAC,qBAAqB,CAAC;AAE7C,IAAMC,wBAAwB,GAAG,GAAG;AAyBpC,IAAMC,eAAe,GAAG,CAACC,KAAgB,EAAEC,QAAkB,KAAiB;EAC5E,IAAM;IAAEC;EAAiB,CAAC,GAAGD,QAAQ;EACrC,IAAME,OAAO,GAAG3B,WAAW,CAAC4B,cAAc,CAAC;IAAEC,KAAK,EAAEJ;EAAS,CAAC,CAAC;EAC/D,IAAMK,aAAa,GAAGb,uBAAuB,CAACO,KAAK,EAAEE,gBAAgB,CAAC;EACtE,IAAMK,cAAc,GAAGf,oBAAoB,CAACQ,KAAK,EAAEE,gBAAgB,CAAC;EACpE,IAAMM,UAAU,GAAGzB,aAAa,CAACiB,KAAK,CAAC;EACvC,IAAMS,qBAAqB,GAAGlB,oCAAoC,CAChES,KAAK,EACLE,gBAAgB,CACjB;EACD,IAAMQ,cAAc,GAClBF,UAAU,KAAKd,QAAQ,CAACiB,MAAM,KAC7BF,qBAAqB,KAAKG,SAAS,IAAIH,qBAAqB,KAAKN,OAAO,CAAC;EAC5E;EACA,IAAMU,cAAc,GAClBL,UAAU,KAAKd,QAAQ,CAACiB,MAAM,IAC9BF,qBAAqB,KAAKG,SAAS,IACnCH,qBAAqB,KAAKN,OAAO;EAEnC,OAAO;IACLW,OAAO,EAAEzB,sBAAsB,CAACW,KAAK,EAAEE,gBAAgB,CAAC;IACxDa,wBAAwB,EAAEzB,uCAAuC,CAC/DU,KAAK,EACLE,gBAAgB,CACjB;IACDQ,cAAc;IACdG,cAAc;IACdG,QAAQ,EAAEhC,WAAW,CAACgB,KAAK,CAAC;IAC5BM,aAAa;IACbC;EACF,CAAC;AACH,CAAC;AAED,IAAMU,SAAS,GAAG7C,OAAO,CAAC2B,eAAe,EAAE,IAAI,EAAE,IAAI,EAAE;EAAEmB,UAAU,EAAE;AAAK,CAAC,CAAC;AA2B5E,OAAO,MAAMC,mBAAmB,SAAShD,SAAS,CAGhD;EAOA;;EAYAiD,WAAW,CAACf,KAA+B,EAAE;IAC3C,KAAK,CAACA,KAAK,CAAC;IAAC;IAAA;IAAA;IAAA;IAAA;IAAA,yCAoIG9B,OAAO,CACvB,CACE8C,SAAoB,QAEpBC,SAAoB,KACjB;MAAA,IAFH;QAAEC,IAAI;QAAEC;MAA2B,CAAC;MAGpC,IAAID,IAAI,KAAKX,SAAS,IAAI/B,UAAU,CAAC4C,UAAU,CAACF,IAAI,CAAC,EAAE;QACrD,OAAOF,SAAS,CAACK,GAAG,CAACC,KAAK,IACxBR,mBAAmB,CAACS,kBAAkB,CAACC,MAAM,CAACF,KAAK,CAAW,CAC/D;MACH;MACA,OAAON,SAAS,CAACK,GAAG,CAACC,KAAK;MACxB;MACAA,KAAK,IAAI,IAAI,IAAIJ,IAAI,IAAI,IAAI,GACzBD,SAAS,CAACQ,kBAAkB,CAACH,KAAK,EAAEJ,IAAI,EAAEC,IAAI,CAAC,GAC/C,IAAI,CACT;IACH,CAAC,CACF;IAAA,6CAgCqBjD,OAAO,CAC3B,CAACgC,cAAsB,EAAEwB,KAA0B,KAAK;MACtD,IAAM5B,OAAO,GAAG3B,WAAW,CAAC4B,cAAc,CAAC2B,KAAK,CAAC;MACjDnC,GAAG,CAACoC,KAAK,CAAC,qBAAqB,EAAEzB,cAAc,EAAEJ,OAAO,CAAC;MACzD,OAAOI,cAAc,CAAC0B,MAAM,CAACC,IAAI;QAAA;QAAA,OAAI,cAAAA,IAAI,CAACC,GAAG,8CAAR,UAAUhC,OAAO,MAAKA,OAAO;MAAA,EAAC;IACrE,CAAC,CACF;IAAA,yCAEiB5B,OAAO,CAAE6D,KAAa,IAAK;MAC3CxC,GAAG,CAACoC,KAAK,CAAC,iBAAiB,EAAEI,KAAK,CAAC;MACnC,IAAIC,MAA6B;MACjC,IAAID,KAAK,CAACE,MAAM,GAAG,CAAC,EAAE;QACpB,IAAM,CAACJ,IAAI,CAAC,GAAGE,KAAK;QACpBC,MAAM,GAAGH,IAAI,CAACK,KAAK;QACnB,IAAIH,KAAK,CAACE,MAAM,GAAG,CAAC,EAAE;UACpB1C,GAAG,CAAC4C,KAAK,CAAC,+BAA+B,EAAEJ,KAAK,CAAC;QACnD;MACF;MACA,OAAOC,MAAM;IACf,CAAC,CAAC;IAAA,8CAEqB9D,OAAO,CAC5B,CACE+B,aAA2D,EAC3D+B,MAA6B,KAC1B;MAAA;MACHzC,GAAG,CAACoC,KAAK,CAAC,sBAAsB,EAAE1B,aAAa,EAAE+B,MAAM,CAAC;MACxD,IAAIA,MAAM,IAAI,IAAI,EAAE;QAClB,OAAO,IAAI;MACb;MACA,IAAM;QAAElC;MAAQ,CAAC,GAAGkC,MAAM;MAC1B,6BAAO/B,aAAa,CAACmC,GAAG,CAACtC,OAAO,CAAC,mEAAI,IAAI;IAC3C,CAAC,CACF;IAAA,+CAEuB5B,OAAO,CAC7B,CAACmE,KAAoB,EAAEL,MAA6B,KAAK;MAAA;MACvDzC,GAAG,CAACoC,KAAK,CAAC,uBAAuB,EAAEU,KAAK,EAAEL,MAAM,CAAC;MACjD,IAAIK,KAAK,IAAI,IAAI,IAAIL,MAAM,IAAI,IAAI,EAAE;QACnC,OAAO,IAAI;MACb;MACA,8BACEK,KAAK,CAAC5B,OAAO,CAAC6B,IAAI,CAChB;QAAA,IAAC;UAAEnB,IAAI;UAAED;QAAK,CAAC;QAAA,OACbC,IAAI,KAAKa,MAAM,CAACO,UAAU,IAAIrB,IAAI,KAAKc,MAAM,CAACQ,UAAU;MAAA,EAC3D,qEAAI,IAAI;IAEb,CAAC,CACF;IApOC,IAAI,CAACC,YAAY,GAAGzE,QAAQ,CAC1B,IAAI,CAACyE,YAAY,CAACC,IAAI,CAAC,IAAI,CAAC,EAC5BjD,wBAAwB,CACzB;IACD,IAAI,CAACkD,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAACD,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAACE,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAACF,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAACG,eAAe,GAAG,IAAI,CAACA,eAAe,CAACH,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAACI,oBAAoB,GAAG,IAAI,CAACA,oBAAoB,CAACJ,IAAI,CAAC,IAAI,CAAC;IAChE,IAAI,CAACK,wBAAwB,GAAG,IAAI,CAACA,wBAAwB,CAACL,IAAI,CAAC,IAAI,CAAC;IACxE,IAAI,CAACM,sBAAsB,GAAG,IAAI,CAACA,sBAAsB,CAACN,IAAI,CAAC,IAAI,CAAC;IACpE,IAAI,CAACO,sBAAsB,GAAG,IAAI,CAACA,sBAAsB,CAACP,IAAI,CAAC,IAAI,CAAC;IACpE,IAAI,CAACQ,sBAAsB,GAAG,IAAI,CAACA,sBAAsB,CAACR,IAAI,CAAC,IAAI,CAAC;IACpE,IAAI,CAACS,sBAAsB,GAAG,IAAI,CAACA,sBAAsB,CAACT,IAAI,CAAC,IAAI,CAAC;IACpE,IAAI,CAACU,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAACV,IAAI,CAAC,IAAI,CAAC;IAEtE,IAAI,CAACW,iBAAiB,gBAAGxF,KAAK,CAACyF,SAAS,EAAE;IAC1C,IAAI,CAACC,cAAc,gBAAG1F,KAAK,CAACyF,SAAS,EAAE;IACvC,IAAI,CAACE,OAAO,GAAG,IAAI5E,OAAO,EAAE;IAE5B,IAAM;MAAE6E,UAAU;MAAE9C;IAAS,CAAC,GAAGX,KAAK;IACtC,IAAI,CAAC0D,aAAa,GAAGnF,cAAc,CAACoF,gBAAgB,CAAChD,QAAQ,CAAC;IAC9D,IAAM;MAAEW,KAAK,EAALA,MAAK,GAAG,EAAE;MAAEsC,YAAY,GAAG,KAAK;MAAEzC,IAAI,EAAJA,KAAI;MAAED,IAAI,EAAJA,KAAI;MAAE2C;IAAU,CAAC,GAC/DJ,UAAU,aAAVA,UAAU,cAAVA,UAAU,GAAI,CAAC,CAAC;IAClB,IAAMK,MAAM,GAAG3C,KAAI,IAAI,IAAI,IAAID,KAAI,IAAI,IAAI,GAAG;MAAEC,IAAI,EAAJA,KAAI;MAAED,IAAI,EAAJA;IAAK,CAAC,GAAGX,SAAS;IACxE,IAAI,CAACZ,KAAK,GAAG;MACXmE,MAAM;MACN7C,SAAS,EAAE,IAAI3C,SAAS,CAAC,IAAI,CAACoF,aAAa,CAAC;MAC5CK,WAAW,EAAExD,SAAS;MACtByD,YAAY,EAAEzD,SAAS;MACvB0D,UAAU,EAAE,CAAC;MACb3C,KAAK,EAALA,MAAK;MACLuC,SAAS;MACTK,MAAM,EAAE,EAAE;MACVN,YAAY;MACZO,UAAU,EAAE,KAAK;MACjBC,UAAU,EAAE,KAAK;MAEjB;MACAX,UAAU;MAAE;;MAEZY,cAAc,EAAE,KAAK;MACrBC,SAAS,EAAE,KAAK;MAChBC,QAAQ,EAAE,KAAK;MACfpC,KAAK,EAAE;IACT,CAAC;EACH;EAEAqC,iBAAiB,GAAS;IACxB,IAAI,CAACC,iBAAiB,EAAE;IACxB,IAAM;MAAEvE,cAAc;MAAED;IAAc,CAAC,GAAG,IAAI,CAACD,KAAK;IACpD,IAAM;MAAE8D,MAAM;MAAExC,KAAK;MAAEuC;IAAU,CAAC,GAAG,IAAI,CAAClE,KAAK;IAC/C,IAAM+E,WAAW,GAAG,IAAI,CAACC,cAAc,CAAC1E,aAAa,EAAEC,cAAc,CAAC;IACtE,IAAIwE,WAAW,KAAK,IAAI,EAAE;MACxB,IAAI,CAACE,sBAAsB,CAACF,WAAW,CAAC;IAC1C;IACA,IAAIZ,MAAM,IAAI,IAAI,EAAE;MAClB,IAAM;QAAE3C,IAAI;QAAED;MAAK,CAAC,GAAG4C,MAAM;MAC7B,IAAI,CAACe,UAAU,CAAC1D,IAAI,EAAED,IAAI,EAAEI,KAAK,EAAEuC,SAAS,CAAC;IAC/C;EACF;EAEAiB,kBAAkB,CAChBC,SAAmC,EACnCC,SAAmC,EAC7B;IACN,IAAM;MAAE9E,cAAc;MAAED,aAAa;MAAEU;IAAS,CAAC,GAAG,IAAI,CAACX,KAAK;IAC9D,IAAM;MAAE+D;IAAY,CAAC,GAAG,IAAI,CAACpE,KAAK;IAClC,IAAMqC,MAAM,GAAG,IAAI,CAACiD,SAAS,CAAC/E,cAAc,CAAC;IAC7C,IAAMwE,WAAW,GAAG,IAAI,CAACC,cAAc,CAAC1E,aAAa,EAAEC,cAAc,CAAC;IAEtE,IAAMgF,UAAU,GAAG,IAAI,CAACD,SAAS,CAACF,SAAS,CAAC7E,cAAc,CAAC;IAC3D,IAAMiF,eAAe,GAAG,IAAI,CAACR,cAAc,CACzCI,SAAS,CAAC9E,aAAa,EACvB8E,SAAS,CAAC7E,cAAc,CACzB;IAED,IAAIS,QAAQ,KAAKoE,SAAS,CAACpE,QAAQ,IAAIA,QAAQ,KAAKJ,SAAS,EAAE;MAC7D,IAAI,CAAC6E,uBAAuB,CAACzE,QAAQ,CAAC;IACxC;IAEA,IACEoD,WAAW,KAAKiB,SAAS,CAACjB,WAAW,IACrCiB,SAAS,CAACjB,WAAW,IAAI,IAAI,EAC7B;MACAxE,GAAG,CAACoC,KAAK,CAAC,iDAAiD,CAAC;MAC5DqD,SAAS,CAACjB,WAAW,CAACsB,KAAK,EAAE;IAC/B;;IAEA;IACA;IACA,IAAIX,WAAW,KAAKS,eAAe,IAAInD,MAAM,KAAKkD,UAAU,EAAE;MAC5D,IAAI,CAACT,iBAAiB,EAAE;IAC1B;IAEA,IAAIC,WAAW,KAAKS,eAAe,EAAE;MACnC,IAAIA,eAAe,KAAK,IAAI,EAAE;QAC5B,IAAI,CAACG,qBAAqB,CAACH,eAAe,CAAC;MAC7C;MACA,IAAIT,WAAW,KAAK,IAAI,EAAE;QACxB,IAAI,CAACE,sBAAsB,CAACF,WAAW,CAAC;MAC1C;IACF;EACF;EAEAa,oBAAoB,GAAS;IAC3B,IAAM;MAAErF,cAAc;MAAED;IAAc,CAAC,GAAG,IAAI,CAACD,KAAK;IACpD,IAAM;MAAE+D;IAAY,CAAC,GAAG,IAAI,CAACpE,KAAK;IAClC,IAAM+E,WAAW,GAAG,IAAI,CAACC,cAAc,CAAC1E,aAAa,EAAEC,cAAc,CAAC;IACtE,IAAI,CAACsD,OAAO,CAACgC,MAAM,EAAE;IACrB,IAAId,WAAW,KAAK,IAAI,EAAE;MACxB,IAAI,CAACY,qBAAqB,CAACZ,WAAW,CAAC;IACzC;IACA,IAAI,IAAI,CAACe,OAAO,EAAE;MAChB,IAAI,CAACA,OAAO,EAAE;IAChB;IACA,IAAI1B,WAAW,IAAI,IAAI,EAAE;MACvBA,WAAW,CAACsB,KAAK,EAAE;IACrB;EACF;EAgCAK,sBAAsB,GAA4B;IAAA;IAChD,IAAI,IAAI,CAACnC,cAAc,CAACoC,OAAO,IAAI,IAAI,EAAE;MACvC,OAAO,IAAI;IACb;IAEA,IAAMC,OAAO,GAAG,IAAI,CAACrC,cAAc,CAACoC,OAAO,CAACE,aAAa,YACnD/G,cAAc,CAACgH,wBAAwB,EAC5C;IACD,IAAMC,IAAI,4BAAGH,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEI,qBAAqB,EAAE,yEAAI,IAAI;IACrD,IAAID,IAAI,IAAI,IAAI,IAAIA,IAAI,CAACE,KAAK,IAAI,CAAC,IAAIF,IAAI,CAACG,MAAM,IAAI,CAAC,EAAE;MACvD,OAAO,IAAI;IACb;IACA,IAAMC,CAAC,GAAGJ,IAAI,CAACK,IAAI,GAAGL,IAAI,CAACE,KAAK,GAAG,CAAC;IACpC,IAAMI,CAAC,GAAGN,IAAI,CAACO,MAAM;IACrB,OAAO,CAACH,CAAC,EAAEE,CAAC,CAAC;EACf;EAEAE,uBAAuB,GAAuB;IAC5C,IAAM;MAAEtC;IAAW,CAAC,GAAG,IAAI,CAACtE,KAAK;IACjC,IAAIsE,UAAU,GAAGnD,mBAAmB,CAAC0F,cAAc,EAAE;MACnD,uDAAgD1F,mBAAmB,CAAC0F,cAAc;IACpF;IACA,OAAOjG,SAAS;EAClB;EAEAkG,oBAAoB,GAAuB;IACzC,IAAM;MAAEtE;IAAM,CAAC,GAAG,IAAI,CAACxC,KAAK;IAC5B,OAAOwC,KAAK,IAAI,IAAI,aAAMA,KAAK,IAAK5B,SAAS;EAC/C;EAoDA0E,SAAS,CAAClD,KAAa,EAAyB;IAC9C,IAAM2E,UAAU,GAAG,IAAI,CAACC,mBAAmB,CAAC5E,KAAK,EAAE,IAAI,CAAC;IACxD,OAAO,IAAI,CAAC6E,eAAe,CAACF,UAAU,CAAC;EACzC;EAEA/B,cAAc,CACZ1E,aAA4B,EAC5B8B,KAAa,EACS;IACtB,IAAMC,MAAM,GAAG,IAAI,CAACiD,SAAS,CAAClD,KAAK,CAAC;IACpC,OAAO,IAAI,CAAC8E,oBAAoB,CAAC5G,aAAa,EAAE+B,MAAM,CAAC;EACzD;EAEA8E,eAAe,CAAC/C,WAA0B,EAAEhC,KAAa,EAAiB;IACxE,IAAMC,MAAM,GAAG,IAAI,CAACiD,SAAS,CAAClD,KAAK,CAAC;IACpC,OAAO,IAAI,CAACgF,qBAAqB,CAAChD,WAAW,EAAE/B,MAAM,CAAC;EACxD;EAEA4C,sBAAsB,CAACF,WAA0B,EAAQ;IACvDnF,GAAG,CAACoC,KAAK,CAAC,wBAAwB,CAAC;IACnC+C,WAAW,CAACsC,gBAAgB,CAC1B5I,EAAE,CAAC6I,KAAK,CAACC,mBAAmB,EAC5B,IAAI,CAACnE,wBAAwB,CAC9B;IACD2B,WAAW,CAACsC,gBAAgB,CAC1B5I,EAAE,CAAC6I,KAAK,CAACE,iBAAiB,EAC1B,IAAI,CAACnE,sBAAsB,CAC5B;IACD0B,WAAW,CAACsC,gBAAgB,CAC1B5I,EAAE,CAAC6I,KAAK,CAACG,iBAAiB,EAC1B,IAAI,CAACnE,sBAAsB,CAC5B;IACDyB,WAAW,CAACsC,gBAAgB,CAC1B5I,EAAE,CAAC6I,KAAK,CAACI,gBAAgB,EACzB,IAAI,CAACzE,gBAAgB,CACtB;IACD8B,WAAW,CAACsC,gBAAgB,CAC1B5I,EAAE,CAAC6I,KAAK,CAACK,eAAe,EACxB,IAAI,CAACzE,eAAe,CACrB;EACH;EAEAyC,qBAAqB,CAACZ,WAA0B,EAAQ;IACtDnF,GAAG,CAACoC,KAAK,CAAC,uBAAuB,CAAC;IAClC+C,WAAW,CAAC6C,mBAAmB,CAC7BnJ,EAAE,CAAC6I,KAAK,CAACC,mBAAmB,EAC5B,IAAI,CAACnE,wBAAwB,CAC9B;IACD2B,WAAW,CAAC6C,mBAAmB,CAC7BnJ,EAAE,CAAC6I,KAAK,CAACE,iBAAiB,EAC1B,IAAI,CAACnE,sBAAsB,CAC5B;IACD0B,WAAW,CAAC6C,mBAAmB,CAC7BnJ,EAAE,CAAC6I,KAAK,CAACG,iBAAiB,EAC1B,IAAI,CAACnE,sBAAsB,CAC5B;IACDyB,WAAW,CAAC6C,mBAAmB,CAC7BnJ,EAAE,CAAC6I,KAAK,CAACI,gBAAgB,EACzB,IAAI,CAACzE,gBAAgB,CACtB;IACD8B,WAAW,CAAC6C,mBAAmB,CAC7BnJ,EAAE,CAAC6I,KAAK,CAACK,eAAe,EACxB,IAAI,CAACzE,eAAe,CACrB;EACH;EAEAJ,YAAY,QAQH;IAAA,IARI;MACXqB,MAAM;MACNF,YAAY,GAAG,KAAK;MACpBtC;IAKF,CAAC;IACC,IAAM;MAAEH,IAAI,GAAGZ,SAAS;MAAEW,IAAI,GAAGX;IAAU,CAAC,GAAGuD,MAAM,aAANA,MAAM,cAANA,MAAM,GAAI,CAAC,CAAC;IAC3D,IAAIe,UAAU,GAAG,IAAI;IACrB,IAAIhB,SAA6B,GAAG2D,IAAI,CAACC,GAAG,EAAE;IAC9C,IAAI,CAACC,QAAQ,CACX,SAAsE;MAAA;MAAA,IAArE;QAAEjE,UAAU;QAAEI,SAAS,EAAE8D,aAAa;QAAExD,UAAU;QAAEC;MAAW,CAAC;MAC/D;MACA,IAAMwD,MAAM,GACVnE,UAAU,IAAI,IAAI,IAClBG,YAAY,KAAKH,UAAU,CAACG,YAAY,IACxCzC,IAAI,KAAKsC,UAAU,CAACtC,IAAI,IACxBD,IAAI,KAAKuC,UAAU,CAACvC,IAAI,IACxBI,KAAK,KAAKmC,UAAU,CAACnC,KAAK;MAC5BuD,UAAU,YACP,CAACT,UAAU,IAAIR,YAAY,KAAK,CAACgE,MAAM,IAAI,CAACzD,UAAU,CAAC,yCAAK,KAAK;MAEpE,IAAI,CAACU,UAAU,EAAE;QACfhB,SAAS,GAAG8D,aAAa;MAC3B;MAEA,OAAO;QACLlE,UAAU,EAAE;UACVG,YAAY;UACZzC,IAAI;UACJD,IAAI;UACJI,KAAK;UACLuC,SAAS,gBAAEA,SAAS,mDAAItD;QAC1B,CAAC;QACDsD,SAAS;QACTM,UAAU,EAAEyD,MAAM;QAClBxD,UAAU,EAAE;MACd,CAAC;IACH,CAAC,EACD,MAAM;MACJ,IAAIS,UAAU,EAAE;QACd,IAAI,CAACA,UAAU,CAAC1D,IAAI,aAAJA,IAAI,cAAJA,IAAI,GAAI,IAAI,EAAED,IAAI,EAAEI,KAAK,EAAEuC,SAAS,CAAC;MACvD;IACF,CAAC,CACF;EACH;EAEAjB,gBAAgB,GAAS;IACvB,IAAI,CAAC8E,QAAQ,CAAC;MACZvF,KAAK,EAAE,IAAI0F,KAAK,CAAC,oBAAoB,CAAC;MACtCxD,cAAc,EAAE,IAAI;MACpBC,SAAS,EAAE;IACb,CAAC,CAAC;EACJ;EAEAzB,eAAe,GAAS;IACtB,IAAI,CAAC6E,QAAQ,CAAC;MAAErD,cAAc,EAAE,KAAK;MAAElC,KAAK,EAAE;IAAK,CAAC,CAAC;EACvD;EAEAY,wBAAwB,GAAS;IAC/B,IAAI,CAAC+E,kBAAkB,EAAE;EAC3B;EAEA9E,sBAAsB,GAAS;IAC7B,IAAI,CAAC+E,gBAAgB,EAAE;EACzB;EAEA9E,sBAAsB,QAAuC;IAAA,IAAtC;MAAE+E;IAA2B,CAAC;IACnD,IAAI,CAACN,QAAQ,CAAC;MAAEzD,UAAU,EAAE+D;IAAO,CAAC,CAAC;EACvC;EAEAlF,oBAAoB,GAAS;IAC3BvD,GAAG,CAACoC,KAAK,CAAC,sBAAsB,CAAC;IACjC,IAAM;MAAEsG;IAAW,CAAC,GAAG,IAAI,CAACjI,KAAK;IACjCiI,UAAU,CAACC,IAAI,CACbnJ,gBAAgB,CAACoJ,eAAe,EAChC,IAAI,EACJrH,mBAAmB,CAACsH,aAAa,CAClC;EACH;EAEAzF,qBAAqB,GAAS;IAAA;IAC5B,6BAAI,CAACU,iBAAiB,oFAAtB,sBAAwBsC,OAAO,2DAA/B,uBAAiC0C,WAAW,EAAE;EAChD;;EAEA;AACF;AACA;AACA;AACA;EACEC,aAAa,CAAC3I,KAA4B,EAA4B;IAAA;IAAA,IAA1BkF,UAAU,uEAAG,KAAK;IAC5D,IAAM;MAAE3E;IAAe,CAAC,GAAG,IAAI,CAACF,KAAK;IACrC,IAAI,IAAI,CAACiF,SAAS,CAAC/E,cAAc,CAAC,IAAI,IAAI,EAAE;MAC1CX,GAAG,CAACoC,KAAK,CAAC,yCAAyC,EAAEhC,KAAK,CAAC;MAC3D;IACF;IACA;IACA,IAAI,CAAC+H,QAAQ,CAAC;MAAEtD,UAAU,EAAE,CAACS;IAAW,CAAC,CAAC;;IAE1C;IACA;IACA,8BAAI,CAACxB,iBAAiB,qFAAtB,uBAAwBsC,OAAO,2DAA/B,uBAAiC4C,cAAc,CAAC5I,KAAK,CAAC;EACxD;EAEAkF,UAAU,CACR1D,IAAmB,EACnBD,IAAwB,EACxBI,KAAyB,EACzBuC,SAAkB,EACZ;IAAA;IACN,IAAM;MAAE3D,cAAc;MAAE+H;IAAW,CAAC,GAAG,IAAI,CAACjI,KAAK;IACjD,IAAMwI,aAAa,sBAAG,IAAI,CAACvD,SAAS,CAAC/E,cAAc,CAAC,oDAA9B,gBAAgCJ,OAAO;IAC7D,IAAM2I,eAAe,GAAGD,aAAa,KAAK,IAAI,GAAG,EAAE,GAAG,CAACA,aAAa,CAAC;IACrEjJ,GAAG,CAACoC,KAAK,CAAC,YAAY,EAAE;MACtBR,IAAI;MACJD,IAAI;MACJI,KAAK;MACLuC,SAAS;MACT4E;IACF,CAAC,CAAC;IAEFR,UAAU,CAACC,IAAI,CAACnJ,gBAAgB,CAAC2J,eAAe,EAAE,IAAI,EAAE;MACtDvH,IAAI;MACJD,IAAI;MACJI,KAAK,EAAEA,KAAK,IAAI,IAAI,GAAGA,KAAK,GAAG,OAAO;MACtCuC,SAAS;MACT4E;IACF,CAAC,CAAC;EACJ;EAEAhE,iBAAiB,GAAS;IACxB,IAAM;MAAEvE,cAAc;MAAED;IAAc,CAAC,GAAG,IAAI,CAACD,KAAK;IACpD,IAAMgC,MAAM,GAAG,IAAI,CAACiD,SAAS,CAAC/E,cAAc,CAAC;IAC7C,IAAMwE,WAAW,GAAG,IAAI,CAACC,cAAc,CAAC1E,aAAa,EAAEC,cAAc,CAAC;IACtEX,GAAG,CAACoC,KAAK,CAAC,mBAAmB,EAAEK,MAAM,EAAE0C,WAAW,CAAC;IAEnD,IAAI,CAACgD,QAAQ,CAAC;MACZxD,MAAM,EAAE,EAAE;MACVH,WAAW,EAAExD,SAAS;MACtB4B,KAAK,EAAE;IACT,CAAC,CAAC;IAEF,IAAIH,MAAM,IAAI,IAAI,EAAE;MAClBzC,GAAG,CAACoC,KAAK,CAAC,kBAAkB,CAAC;MAC7B,IAAI,CAAC+F,QAAQ,CAAC;QACZpD,SAAS,EAAE,KAAK;QAChBC,QAAQ,EAAE,IAAI;QACdX,YAAY,EAAE,KAAK;QACnBK,UAAU,EAAE;MACd,CAAC,CAAC;MACF;IACF;IAEA,IAAI,CAACyD,QAAQ,CAAC;MAAEpD,SAAS,EAAE;IAAK,CAAC,CAAC;IAElC,IAAII,WAAW,IAAI,IAAI,EAAE;MACvB;IACF;IAEA,IAAI,CAACgD,QAAQ,CAAC;MAAEnD,QAAQ,EAAE,KAAK;MAAEN,UAAU,EAAES,WAAW,CAACiE;IAAK,CAAC,CAAC;IAEhE,IAAI,CAACnF,OAAO,CACToF,GAAG,CAAClE,WAAW,CAACmE,IAAI,EAAE,EAAEC,QAAQ,IAAIA,QAAQ,CAACzD,KAAK,EAAE,CAAC,CACrD0D,IAAI,CAAChF,WAAW,IAAI;MACnB;MACA,IAAI,CAACiF,sBAAsB,CAACjF,WAAW,CAAC;MACxC,IAAI,CAAC2D,QAAQ,CAAC;QAAE3D;MAAY,CAAC,CAAC;IAChC,CAAC,CAAC,CACDkF,KAAK,CAAE9G,KAAc,IAAK;MACzB,IAAItD,YAAY,CAACqK,UAAU,CAAC/G,KAAK,CAAC,EAAE;QAClC;MACF;MACA5C,GAAG,CAAC4C,KAAK,CAACA,KAAK,CAAC;MAChB,IAAI,CAACuF,QAAQ,CAAC;QAAEpD,SAAS,EAAE,KAAK;QAAEnC;MAAM,CAAC,CAAC;IAC5C,CAAC,CAAC;EACN;EAEA4F,gBAAgB,GAAS;IACvB,IAAM;MAAE7H,cAAc;MAAED;IAAc,CAAC,GAAG,IAAI,CAACD,KAAK;IACpD,IAAM;MAAE+D;IAAY,CAAC,GAAG,IAAI,CAACpE,KAAK;IAClC,IAAM+E,WAAW,GAAG,IAAI,CAACC,cAAc,CAAC1E,aAAa,EAAEC,cAAc,CAAC;IACtEX,GAAG,CAACoC,KAAK,CAAC,kBAAkB,EAAE+C,WAAW,aAAXA,WAAW,uBAAXA,WAAW,CAAEyE,IAAI,CAAC;IAChD,IAAIpF,WAAW,IAAI,IAAI,IAAIW,WAAW,IAAI,IAAI,EAAE;MAC9CnF,GAAG,CAACoC,KAAK,CAAC,uBAAuB,CAAC;MAClC;IACF;IACA,IAAMyH,KAAK,GAAG,CAAC,GAAG1E,WAAW,CAACyE,IAAI,CAAC;IACnCpF,WAAW,CAACsF,SAAS,CAACD,KAAK,CAAC;IAC5B,IAAI,CAACE,WAAW,CAACvF,WAAW,CAAC;EAC/B;EAEA+D,kBAAkB,GAAS;IACzB,IAAM;MAAE5H,cAAc;MAAED;IAAc,CAAC,GAAG,IAAI,CAACD,KAAK;IACpD,IAAM;MAAE+D;IAAY,CAAC,GAAG,IAAI,CAACpE,KAAK;IAClC,IAAM+E,WAAW,GAAG,IAAI,CAACC,cAAc,CAAC1E,aAAa,EAAEC,cAAc,CAAC;IACtEX,GAAG,CAACoC,KAAK,CAAC,oBAAoB,EAAE+C,WAAW,aAAXA,WAAW,uBAAXA,WAAW,CAAE9C,MAAM,CAAC;IACpD,IAAImC,WAAW,IAAI,IAAI,IAAIW,WAAW,IAAI,IAAI,EAAE;MAC9CnF,GAAG,CAACoC,KAAK,CAAC,uBAAuB,CAAC;MAClC;IACF;IACA,IAAM4H,OAAO,GAAG,CAAC,GAAG7E,WAAW,CAAC9C,MAAM,CAAC;IACvCmC,WAAW,CAACyF,WAAW,CAACD,OAAO,CAAC;IAChC,IAAI,CAACD,WAAW,CAACvF,WAAW,CAAC;EAC/B;EAEAiF,sBAAsB,CAACjF,WAA0B,EAAQ;IACvDxE,GAAG,CAACoC,KAAK,CAAC,wBAAwB,EAAEoC,WAAW,aAAXA,WAAW,uBAAXA,WAAW,CAAE4E,IAAI,CAAC;IAEtD,IAAI,IAAI,CAAClD,OAAO,EAAE;MAChB,IAAI,CAACA,OAAO,EAAE;IAChB;IAEA,IAAI1B,WAAW,IAAI,IAAI,EAAE;MACvB,IAAI,CAAC0B,OAAO,GAAGlF,SAAS;MACxB;IACF;IAEA,IAAI,CAACkF,OAAO,GAAG1B,WAAW,CAACiD,gBAAgB,CACzC5I,EAAE,CAAC6I,KAAK,CAACwC,aAAa,EACtB,IAAI,CAACrG,uBAAuB,CAC7B;IAED,IAAI,CAACkG,WAAW,CAACvF,WAAW,CAAC;EAC/B;EAEAuF,WAAW,CAACvF,WAA0B,EAAQ;IAC5C,IAAM;MAAE7D;IAAe,CAAC,GAAG,IAAI,CAACF,KAAK;IACrC,IAAMgE,YAAY,GAAG,IAAI,CAAC8C,eAAe,CAAC/C,WAAW,EAAE7D,cAAc,CAAC;IACtE,IAAI,CAAC8D,YAAY,EAAE;MACjBzE,GAAG,CAAC4C,KAAK,CAAC,uBAAuB,CAAC;MAClC;IACF;IACA4B,WAAW,CAACuF,WAAW,CAAC,CAAC,EAAExI,mBAAmB,CAAC0F,cAAc,GAAG,CAAC,EAAE,CACjExC,YAAY,CACb,CAAC;EACJ;EAEAoB,uBAAuB,CAACzE,QAEvB,EAAQ;IACP,IAAM+C,aAAa,GAAGnF,cAAc,CAACoF,gBAAgB,CAAChD,QAAQ,CAAC;IAC/D,IAAI,CAAC1C,SAAS,CAAC,IAAI,CAACyF,aAAa,EAAEA,aAAa,CAAC,EAAE;MACjD,IAAI,CAACA,aAAa,GAAGA,aAAa;MAClC,IAAI,CAACgE,QAAQ,CAAC;QAAEzG,SAAS,EAAE,IAAI3C,SAAS,CAACoF,aAAa;MAAE,CAAC,CAAC;IAC5D;EACF;EAEAN,uBAAuB,QAAgD;IAAA,IAA/C;MAAE4E;IAAoC,CAAC;IAC7D,IAAM;MAAE0B;IAAK,CAAC,GAAG1B,MAAM;IACvB,IAAM;MAAE9H;IAAe,CAAC,GAAG,IAAI,CAACF,KAAK;IACrC,IAAM;MAAE+D;IAAY,CAAC,GAAG,IAAI,CAACpE,KAAK;IAClC,IAAI,CAACoE,WAAW,EAAE;MAChBxE,GAAG,CAAC4C,KAAK,CAAC,qBAAqB,CAAC;MAChC;IACF;IACA,IAAM6B,YAAY,GAAG,IAAI,CAAC8C,eAAe,CAAC/C,WAAW,EAAE7D,cAAc,CAAC;IACtE,IAAI,CAAC8D,YAAY,EAAE;MACjBzE,GAAG,CAAC4C,KAAK,CAAC,yBAAyB,CAAC;MACpC;IACF;IACA,IAAM+B,MAAM,GAAGwF,IAAI,CAACrI,GAAG,CAACsI,GAAG,IAAIA,GAAG,CAACvH,GAAG,CAAC4B,YAAY,CAAC,CAAC;IACrD,IAAI,CAAC0D,QAAQ,CAAC;MAAExD,MAAM;MAAEI,SAAS,EAAE,KAAK;MAAEC,QAAQ,EAAE,IAAI;MAAEP;IAAa,CAAC,CAAC;EAC3E;EAEAd,sBAAsB,GAAS;IAC7B,IAAM;MAAExC;IAAyB,CAAC,GAAG,IAAI,CAACV,KAAK;IAC/C,IAAI,CAACU,wBAAwB,EAAE;MAC7B;IACF;IACAA,wBAAwB,CAAC,IAAI,EAAEI,mBAAmB,CAACsH,aAAa,CAAC;EACnE;EAEAjF,sBAAsB,GAAS;IAC7B,IAAM;MAAEzC;IAAyB,CAAC,GAAG,IAAI,CAACV,KAAK;IAC/C,IAAI,CAACU,wBAAwB,EAAE;MAC7B;IACF;IACAA,wBAAwB,CAAC,IAAI,EAAEH,SAAS,CAAC;EAC3C;EAEAqJ,MAAM,GAAuB;IAC3B,IAAM;MACJnJ,OAAO;MACPP,cAAc;MACdM,cAAc;MACdqJ,WAAW;MACX5B,UAAU;MACV5H;IACF,CAAC,GAAG,IAAI,CAACL,KAAK;IACd,IAAM;MACJ8D,MAAM;MACN7C,SAAS;MACToD,cAAc;MACdT,YAAY;MACZtC,KAAK;MACL4C,MAAM;MACNF,YAAY;MACZM,SAAS;MACTC;IACF,CAAC,GAAG,IAAI,CAAC5E,KAAK;IACd,IAAMqC,MAAM,GAAG,IAAI,CAACiD,SAAS,CAAC/E,cAAc,CAAC;IAC7C,IAAM4J,oBAAoB,GAAG,IAAI,CAACvD,uBAAuB,EAAE;IAC3D,IAAMwD,iBAAiB,GAAG,IAAI,CAACtD,oBAAoB,EAAE;IACrD,IAAMuD,eAAe,GACnBzF,QAAQ,IAAIP,YAAY,IAAI,IAAI,GAC5B,IAAI,CAACiG,eAAe,CAAC/F,MAAM,EAAEF,YAAY,EAAE/C,SAAS,CAAC,GACrD,EAAE;IAER,oBACE,oBAAC,WAAW;MACV,YAAY,EAAE8I,iBAAkB;MAChC,SAAS,EAAEzF,SAAU;MACrB,QAAQ,EAAEC,QAAS;MACnB,cAAc,EAAEF,cAAe;MAC/B,SAAS,EAAC,4BAA4B;MACtC,cAAc,EAAE,IAAK;MACrB,WAAW,EAAEwF,WAAY;MACzB,UAAU,EAAE5B,UAAW;MACvB,iBAAiB,EAAE,IAAI,CAACtF,qBAAsB;MAC9C,UAAU,EAAC,iBAAiB;MAC5B,UAAU,EAAC;IAAgB,gBAE3B;MACE,GAAG,EAAE,IAAI,CAACY,cAAe;MACzB,SAAS,EAAC;IAAiD,gBAE3D,oBAAC,cAAc;MACb,GAAG,EAAE,IAAI,CAACF,iBAAkB;MAC5B,MAAM,EAAES,MAAO;MACf,OAAO,EAAErD,OAAQ;MACjB,YAAY,EAAEmD,YAAa;MAC3B,cAAc,EAAEvD,cAAe;MAC/B,cAAc,EAAEG,cAAe;MAC/B,QAAQ,EAAE+D,QAAS;MACnB,aAAa,EAAEuF,oBAAqB;MACpC,MAAM,EAAE9H,MAAO;MACf,KAAK,EAAEV,KAAM;MACb,MAAM,EAAE0I,eAAgB;MACxB,QAAQ,EAAE,IAAI,CAACvH,YAAa;MAC5B,gBAAgB,EAAE,IAAI,CAACK,oBAAqB;MAC5C,kBAAkB,EAAE,IAAI,CAACI,sBAAuB;MAChD,kBAAkB,EAAE,IAAI,CAACC;IAAuB,EAChD,CACE,CACM;EAElB;AACF;AAAC,gBA9pBYrC,mBAAmB,iBAIT,qBAAqB;AAAA,gBAJ/BA,mBAAmB,eAMX,qBAAqB;AAAA,gBAN7BA,mBAAmB,oBAQN,GAAG;AAAA,gBARhBA,mBAAmB,wBAWF,IAAIzC,uBAAuB,CAAC;EACtD6L,YAAY,EAAE,KAAK;EACnBC,cAAc,EAAE,IAAI;EACpBC,2BAA2B;AAC7B,CAAC,CAAC;AAAA,gBAfStJ,mBAAmB,mBAiBPuJ,MAAM,CAACC,MAAM,CAAC;EACnCnJ,IAAI,EAAE,cAAc;EACpBD,IAAI,EAAE;AACR,CAAC,CAAC;AA4oBJ,eAAeN,SAAS,CAACE,mBAAmB,CAAC"}
@@ -80,7 +80,7 @@ export declare class FilterSetManagerPanel extends Component<FilterSetManagerPan
80
80
  restoreInputFilterState(panel: PanelComponent | undefined, state: InputFilterPanelState): void;
81
81
  render(): ReactElement;
82
82
  }
83
- declare const _default: import("react-redux").ConnectedComponent<typeof FilterSetManagerPanel, import("react-redux").Omit<Pick<FilterSetManagerPanelProps, "glContainer" | "glEventHub" | "localDashboardId" | "panelTableMap" | "setDashboardFilterSets" | "filterSets" | "dashboardOpenedPanelMap"> & Partial<Pick<FilterSetManagerPanelProps, "panelState">> & Partial<Pick<{
83
+ declare const _default: import("react-redux").ConnectedComponent<typeof FilterSetManagerPanel, import("react-redux").Omit<Pick<FilterSetManagerPanelProps, "glContainer" | "glEventHub" | "panelTableMap" | "localDashboardId" | "setDashboardFilterSets" | "filterSets" | "dashboardOpenedPanelMap"> & Partial<Pick<FilterSetManagerPanelProps, "panelState">> & Partial<Pick<{
84
84
  panelState: null;
85
85
  }, never>>, "panelTableMap" | "setDashboardFilterSets" | "filterSets" | "dashboardOpenedPanelMap"> & {
86
86
  localDashboardId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"RenameDialog.d.ts","sourceRoot":"","sources":["../../src/panels/RenameDialog.tsx"],"names":[],"mappings":"AAAA,OAAc,EACZ,WAAW,EACX,SAAS,EACT,aAAa,EACb,YAAY,EACZ,SAAS,EACV,MAAM,OAAO,CAAC;AAIf,UAAU,iBAAiB;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,UAAU,iBAAiB;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,aAAa,CACrD,iBAAiB,EACjB,iBAAiB,CAClB;IACC,MAAM,CAAC,YAAY;;;;;MAKjB;gBAEU,KAAK,EAAE,iBAAiB;IAkBpC,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IAYtD,cAAc,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAE5C,UAAU,IAAI,IAAI;IAKlB,wBAAwB,IAAI,IAAI;IAIhC,uBAAuB,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAInE,kBAAkB,IAAI,IAAI;IAK1B,kBAAkB,CAAC,KAAK,EAAE,SAAS,CAAC,eAAe,CAAC,GAAG,IAAI;IAa3D,kBAAkB,IAAI,YAAY;IAyDlC,MAAM,IAAI,YAAY;CAkBvB"}
1
+ {"version":3,"file":"RenameDialog.d.ts","sourceRoot":"","sources":["../../src/panels/RenameDialog.tsx"],"names":[],"mappings":"AAAA,OAAc,EACZ,WAAW,EACX,SAAS,EACT,aAAa,EACb,YAAY,EACZ,SAAS,EACV,MAAM,OAAO,CAAC;AAIf,UAAU,iBAAiB;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,UAAU,iBAAiB;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,aAAa,CACrD,iBAAiB,EACjB,iBAAiB,CAClB;IACC,MAAM,CAAC,YAAY;;;;;MAKjB;gBAEU,KAAK,EAAE,iBAAiB;IAkBpC,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IAYtD,cAAc,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAE5C,UAAU,IAAI,IAAI;IAKlB,wBAAwB,IAAI,IAAI;IAIhC,uBAAuB,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAInE,kBAAkB,IAAI,IAAI;IAK1B,kBAAkB,CAAC,KAAK,EAAE,SAAS,CAAC,eAAe,CAAC,GAAG,IAAI;IAa3D,kBAAkB,IAAI,YAAY;IAyDlC,MAAM,IAAI,YAAY;CAiBvB"}
@@ -138,12 +138,7 @@ export default class RenameDialog extends PureComponent {
138
138
  onEntered: this.handleRenameDialogOpened,
139
139
  onExited: onCancel,
140
140
  options: {
141
- placement: 'bottom',
142
- modifiers: {
143
- preventOverflow: {
144
- boundariesElement: 'viewport'
145
- }
146
- }
141
+ placement: 'bottom'
147
142
  },
148
143
  interactive: true,
149
144
  closeOnBlur: true
@@ -1 +1 @@
1
- {"version":3,"file":"RenameDialog.js","names":["React","PureComponent","classNames","Button","Popper","RenameDialog","constructor","props","handleRenameDialogOpened","bind","handleRenameInputChange","handleRenameCancel","handleRenameSubmit","renameInputRef","createRef","value","state","valueWasValidated","componentDidUpdate","prevProps","isShown","prevIsShown","resetState","setState","current","focus","event","target","onCancel","stopPropagation","preventDefault","newTitle","trim","undefined","onSubmit","renderRenameDialog","isShared","isOwner","itemType","render","placement","modifiers","preventOverflow","boundariesElement"],"sources":["../../src/panels/RenameDialog.tsx"],"sourcesContent":["import React, {\n ChangeEvent,\n FormEvent,\n PureComponent,\n ReactElement,\n RefObject,\n} from 'react';\nimport classNames from 'classnames';\nimport { Button, Popper } from '@deephaven/components';\n\ninterface RenameDialogProps {\n isShared: boolean;\n isOwner: boolean;\n isShown: boolean;\n itemType: string;\n onSubmit: (title: string) => void;\n onCancel: () => void;\n value?: string | null;\n}\n\ninterface RenameDialogState {\n value?: string | null;\n valueWasValidated: boolean;\n}\n\nexport default class RenameDialog extends PureComponent<\n RenameDialogProps,\n RenameDialogState\n> {\n static defaultProps = {\n isShared: false,\n isOwner: true,\n itemType: 'Item',\n value: '',\n };\n\n constructor(props: RenameDialogProps) {\n super(props);\n\n this.handleRenameDialogOpened = this.handleRenameDialogOpened.bind(this);\n this.handleRenameInputChange = this.handleRenameInputChange.bind(this);\n this.handleRenameCancel = this.handleRenameCancel.bind(this);\n this.handleRenameSubmit = this.handleRenameSubmit.bind(this);\n\n this.renameInputRef = React.createRef();\n\n const { value } = props;\n\n this.state = {\n value,\n valueWasValidated: false,\n };\n }\n\n componentDidUpdate(prevProps: RenameDialogProps): void {\n const { isShown: prevIsShown } = prevProps;\n const { isShown } = this.props;\n // Reset the state on dialog shown and not on the `value` prop change\n // so the input keeps the internal value while the dialog is open.\n // Useful in case the `value` prop update is triggered externally\n // i.e. by someone else renaming the same shared dashboard\n if (isShown && !prevIsShown) {\n this.resetState();\n }\n }\n\n renameInputRef: RefObject<HTMLInputElement>;\n\n resetState(): void {\n const { value } = this.props;\n this.setState({ value, valueWasValidated: false });\n }\n\n handleRenameDialogOpened(): void {\n this.renameInputRef?.current?.focus();\n }\n\n handleRenameInputChange(event: ChangeEvent<HTMLInputElement>): void {\n this.setState({ value: event.target.value });\n }\n\n handleRenameCancel(): void {\n const { onCancel } = this.props;\n onCancel();\n }\n\n handleRenameSubmit(event: FormEvent<HTMLFormElement>): void {\n event.stopPropagation();\n event.preventDefault();\n const { value } = this.state;\n const newTitle = value?.trim();\n if (newTitle !== undefined && newTitle !== '') {\n const { onSubmit } = this.props;\n onSubmit(newTitle);\n } else {\n this.setState({ value: newTitle, valueWasValidated: true });\n }\n }\n\n renderRenameDialog(): ReactElement {\n const { isShared, isOwner, itemType } = this.props;\n const { value, valueWasValidated } = this.state;\n\n return (\n <form\n className={classNames('p-3', { 'was-validated': valueWasValidated })}\n onSubmit={this.handleRenameSubmit}\n noValidate\n role=\"presentation\"\n onMouseDown={event => {\n // block events in the NewTabScreen ItemList\n event.stopPropagation();\n }}\n onMouseUp={event => {\n event.stopPropagation();\n }}\n >\n <div className=\"form-group\">\n <label htmlFor={`rename-dialog-${itemType}-input`}>\n Rename {itemType}\n </label>\n <input\n type=\"text\"\n className=\"form-control\"\n id={`rename-dialog-${itemType}-input`}\n value={value ?? undefined}\n ref={this.renameInputRef}\n onChange={this.handleRenameInputChange}\n required\n />\n <div className=\"invalid-feedback\">\n {itemType} name cannot be empty\n </div>\n {(isShared || !isOwner) && (\n <div className=\"pt-2\">\n Renaming this {itemType} will rename for all users.\n </div>\n )}\n </div>\n\n <div className=\"text-right\">\n <Button\n kind=\"secondary\"\n className=\"mr-2\"\n onClick={this.handleRenameCancel}\n >\n Cancel\n </Button>\n <Button kind=\"primary\" type=\"submit\">\n Rename\n </Button>\n </div>\n </form>\n );\n }\n\n render(): ReactElement {\n const { isShown, onCancel } = this.props;\n return (\n <Popper\n isShown={isShown}\n onEntered={this.handleRenameDialogOpened}\n onExited={onCancel}\n options={{\n placement: 'bottom',\n modifiers: { preventOverflow: { boundariesElement: 'viewport' } },\n }}\n interactive\n closeOnBlur\n >\n {this.renderRenameDialog()}\n </Popper>\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"RenameDialog.js","names":["React","PureComponent","classNames","Button","Popper","RenameDialog","constructor","props","handleRenameDialogOpened","bind","handleRenameInputChange","handleRenameCancel","handleRenameSubmit","renameInputRef","createRef","value","state","valueWasValidated","componentDidUpdate","prevProps","isShown","prevIsShown","resetState","setState","current","focus","event","target","onCancel","stopPropagation","preventDefault","newTitle","trim","undefined","onSubmit","renderRenameDialog","isShared","isOwner","itemType","render","placement"],"sources":["../../src/panels/RenameDialog.tsx"],"sourcesContent":["import React, {\n ChangeEvent,\n FormEvent,\n PureComponent,\n ReactElement,\n RefObject,\n} from 'react';\nimport classNames from 'classnames';\nimport { Button, Popper } from '@deephaven/components';\n\ninterface RenameDialogProps {\n isShared: boolean;\n isOwner: boolean;\n isShown: boolean;\n itemType: string;\n onSubmit: (title: string) => void;\n onCancel: () => void;\n value?: string | null;\n}\n\ninterface RenameDialogState {\n value?: string | null;\n valueWasValidated: boolean;\n}\n\nexport default class RenameDialog extends PureComponent<\n RenameDialogProps,\n RenameDialogState\n> {\n static defaultProps = {\n isShared: false,\n isOwner: true,\n itemType: 'Item',\n value: '',\n };\n\n constructor(props: RenameDialogProps) {\n super(props);\n\n this.handleRenameDialogOpened = this.handleRenameDialogOpened.bind(this);\n this.handleRenameInputChange = this.handleRenameInputChange.bind(this);\n this.handleRenameCancel = this.handleRenameCancel.bind(this);\n this.handleRenameSubmit = this.handleRenameSubmit.bind(this);\n\n this.renameInputRef = React.createRef();\n\n const { value } = props;\n\n this.state = {\n value,\n valueWasValidated: false,\n };\n }\n\n componentDidUpdate(prevProps: RenameDialogProps): void {\n const { isShown: prevIsShown } = prevProps;\n const { isShown } = this.props;\n // Reset the state on dialog shown and not on the `value` prop change\n // so the input keeps the internal value while the dialog is open.\n // Useful in case the `value` prop update is triggered externally\n // i.e. by someone else renaming the same shared dashboard\n if (isShown && !prevIsShown) {\n this.resetState();\n }\n }\n\n renameInputRef: RefObject<HTMLInputElement>;\n\n resetState(): void {\n const { value } = this.props;\n this.setState({ value, valueWasValidated: false });\n }\n\n handleRenameDialogOpened(): void {\n this.renameInputRef?.current?.focus();\n }\n\n handleRenameInputChange(event: ChangeEvent<HTMLInputElement>): void {\n this.setState({ value: event.target.value });\n }\n\n handleRenameCancel(): void {\n const { onCancel } = this.props;\n onCancel();\n }\n\n handleRenameSubmit(event: FormEvent<HTMLFormElement>): void {\n event.stopPropagation();\n event.preventDefault();\n const { value } = this.state;\n const newTitle = value?.trim();\n if (newTitle !== undefined && newTitle !== '') {\n const { onSubmit } = this.props;\n onSubmit(newTitle);\n } else {\n this.setState({ value: newTitle, valueWasValidated: true });\n }\n }\n\n renderRenameDialog(): ReactElement {\n const { isShared, isOwner, itemType } = this.props;\n const { value, valueWasValidated } = this.state;\n\n return (\n <form\n className={classNames('p-3', { 'was-validated': valueWasValidated })}\n onSubmit={this.handleRenameSubmit}\n noValidate\n role=\"presentation\"\n onMouseDown={event => {\n // block events in the NewTabScreen ItemList\n event.stopPropagation();\n }}\n onMouseUp={event => {\n event.stopPropagation();\n }}\n >\n <div className=\"form-group\">\n <label htmlFor={`rename-dialog-${itemType}-input`}>\n Rename {itemType}\n </label>\n <input\n type=\"text\"\n className=\"form-control\"\n id={`rename-dialog-${itemType}-input`}\n value={value ?? undefined}\n ref={this.renameInputRef}\n onChange={this.handleRenameInputChange}\n required\n />\n <div className=\"invalid-feedback\">\n {itemType} name cannot be empty\n </div>\n {(isShared || !isOwner) && (\n <div className=\"pt-2\">\n Renaming this {itemType} will rename for all users.\n </div>\n )}\n </div>\n\n <div className=\"text-right\">\n <Button\n kind=\"secondary\"\n className=\"mr-2\"\n onClick={this.handleRenameCancel}\n >\n Cancel\n </Button>\n <Button kind=\"primary\" type=\"submit\">\n Rename\n </Button>\n </div>\n </form>\n );\n }\n\n render(): ReactElement {\n const { isShown, onCancel } = this.props;\n return (\n <Popper\n isShown={isShown}\n onEntered={this.handleRenameDialogOpened}\n onExited={onCancel}\n options={{\n placement: 'bottom',\n }}\n interactive\n closeOnBlur\n >\n {this.renderRenameDialog()}\n </Popper>\n );\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/dashboard-core-plugins",
3
- "version": "0.24.1-beta.0+dcde307",
3
+ "version": "0.24.1-beta.3+c65f268",
4
4
  "description": "Deephaven Dashboard Core Plugins",
5
5
  "author": "Deephaven Data Labs LLC",
6
6
  "license": "Apache-2.0",
@@ -22,23 +22,23 @@
22
22
  "build:sass": "sass --embed-sources --load-path=../../node_modules ./src:./dist"
23
23
  },
24
24
  "dependencies": {
25
- "@deephaven/chart": "^0.24.1-beta.0+dcde307",
26
- "@deephaven/components": "^0.24.1-beta.0+dcde307",
27
- "@deephaven/console": "^0.24.1-beta.0+dcde307",
28
- "@deephaven/dashboard": "^0.24.1-beta.0+dcde307",
29
- "@deephaven/file-explorer": "^0.24.1-beta.0+dcde307",
30
- "@deephaven/filters": "^0.24.1-beta.0+dcde307",
31
- "@deephaven/golden-layout": "^0.24.1-beta.0+dcde307",
32
- "@deephaven/grid": "^0.24.1-beta.0+dcde307",
33
- "@deephaven/icons": "^0.24.1-beta.0+dcde307",
34
- "@deephaven/iris-grid": "^0.24.1-beta.0+dcde307",
35
- "@deephaven/jsapi-shim": "^0.24.1-beta.0+dcde307",
36
- "@deephaven/jsapi-utils": "^0.24.1-beta.0+dcde307",
37
- "@deephaven/log": "^0.24.1-beta.0+dcde307",
38
- "@deephaven/react-hooks": "^0.24.1-beta.0+dcde307",
39
- "@deephaven/redux": "^0.24.1-beta.0+dcde307",
40
- "@deephaven/storage": "^0.24.1-beta.0+dcde307",
41
- "@deephaven/utils": "^0.24.1-beta.0+dcde307",
25
+ "@deephaven/chart": "^0.24.1-beta.3+c65f268",
26
+ "@deephaven/components": "^0.24.1-beta.3+c65f268",
27
+ "@deephaven/console": "^0.24.1-beta.3+c65f268",
28
+ "@deephaven/dashboard": "^0.24.1-beta.3+c65f268",
29
+ "@deephaven/file-explorer": "^0.24.1-beta.3+c65f268",
30
+ "@deephaven/filters": "^0.24.1-beta.3+c65f268",
31
+ "@deephaven/golden-layout": "^0.24.1-beta.3+c65f268",
32
+ "@deephaven/grid": "^0.24.1-beta.3+c65f268",
33
+ "@deephaven/icons": "^0.24.1-beta.3+c65f268",
34
+ "@deephaven/iris-grid": "^0.24.1-beta.3+c65f268",
35
+ "@deephaven/jsapi-shim": "^0.24.1-beta.3+c65f268",
36
+ "@deephaven/jsapi-utils": "^0.24.1-beta.3+c65f268",
37
+ "@deephaven/log": "^0.24.1-beta.3+c65f268",
38
+ "@deephaven/react-hooks": "^0.24.1-beta.3+c65f268",
39
+ "@deephaven/redux": "^0.24.1-beta.3+c65f268",
40
+ "@deephaven/storage": "^0.24.1-beta.3+c65f268",
41
+ "@deephaven/utils": "^0.24.1-beta.3+c65f268",
42
42
  "@fortawesome/react-fontawesome": "^0.2.0",
43
43
  "classnames": "^2.3.1",
44
44
  "deep-equal": "^2.0.5",
@@ -61,8 +61,8 @@
61
61
  "react-redux": "^7.2.4"
62
62
  },
63
63
  "devDependencies": {
64
- "@deephaven/mocks": "^0.24.1-beta.0+dcde307",
65
- "@deephaven/tsconfig": "^0.24.1-beta.0+dcde307"
64
+ "@deephaven/mocks": "^0.24.1-beta.3+c65f268",
65
+ "@deephaven/tsconfig": "^0.24.1-beta.3+c65f268"
66
66
  },
67
67
  "files": [
68
68
  "dist"
@@ -70,5 +70,5 @@
70
70
  "publishConfig": {
71
71
  "access": "public"
72
72
  },
73
- "gitHead": "dcde3072e63dd6580b8018643b8a78366ecace08"
73
+ "gitHead": "c65f268e3b426948dc3569d1c393eb18c3b14cf4"
74
74
  }