@deephaven/jsapi-components 0.82.1-alpha-combobox.11 → 0.82.1-alpha-combobox.25

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.
@@ -1,8 +1,7 @@
1
1
  /// <reference types="react" />
2
- import { dh as DhType } from '@deephaven/jsapi-types';
3
- export interface ComboBoxProps {
4
- table: DhType.Table;
5
- }
2
+ import { NormalizedItem, SpectrumComboBoxProps } from '@deephaven/components';
3
+ import { PickerWithTableProps } from './PickerProps';
4
+ export type ComboBoxProps = PickerWithTableProps<SpectrumComboBoxProps<NormalizedItem>>;
6
5
  export declare function ComboBox(props: ComboBoxProps): JSX.Element;
7
6
  export default ComboBox;
8
7
  //# sourceMappingURL=ComboBox.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ComboBox.d.ts","sourceRoot":"","sources":["../../src/spectrum/ComboBox.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGtD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;CACrB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,GAAG,CAAC,OAAO,CAQ1D;AAED,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"ComboBox.d.ts","sourceRoot":"","sources":["../../src/spectrum/ComboBox.tsx"],"names":[],"mappings":";AAAA,OAAO,EAEL,cAAc,EACd,qBAAqB,EACtB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGrD,MAAM,MAAM,aAAa,GAAG,oBAAoB,CAC9C,qBAAqB,CAAC,cAAc,CAAC,CACtC,CAAC;AAEF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,GAAG,CAAC,OAAO,CAsB1D;AAED,eAAe,QAAQ,CAAC"}
@@ -1,16 +1,31 @@
1
+ var _excluded = ["onInputChange", "onSearchTextChange"];
1
2
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
3
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
3
4
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
4
5
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
5
6
  function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
7
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
8
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
6
9
  import { ComboBoxNormalized } from '@deephaven/components';
10
+ import { useCallback } from 'react';
7
11
  import { usePickerProps } from "./utils/index.js";
8
12
  import { jsx as _jsx } from "react/jsx-runtime";
9
13
  export function ComboBox(props) {
10
- var pickerProps = usePickerProps(props);
14
+ var _usePickerProps = usePickerProps(props),
15
+ {
16
+ onInputChange: onInputChangeInternal,
17
+ onSearchTextChange
18
+ } = _usePickerProps,
19
+ pickerProps = _objectWithoutProperties(_usePickerProps, _excluded);
20
+ var onInputChange = useCallback(value => {
21
+ onInputChangeInternal === null || onInputChangeInternal === void 0 ? void 0 : onInputChangeInternal(value);
22
+ onSearchTextChange(value);
23
+ }, [onInputChangeInternal, onSearchTextChange]);
11
24
  return /*#__PURE__*/_jsx(ComboBoxNormalized
12
25
  // eslint-disable-next-line react/jsx-props-no-spreading
13
- , _objectSpread({}, pickerProps));
26
+ , _objectSpread(_objectSpread({}, pickerProps), {}, {
27
+ onInputChange: onInputChange
28
+ }));
14
29
  }
15
30
  export default ComboBox;
16
31
  //# sourceMappingURL=ComboBox.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ComboBox.js","names":["ComboBoxNormalized","usePickerProps","jsx","_jsx","ComboBox","props","pickerProps","_objectSpread"],"sources":["../../src/spectrum/ComboBox.tsx"],"sourcesContent":["import { ComboBoxNormalized } from '@deephaven/components';\nimport { dh as DhType } from '@deephaven/jsapi-types';\nimport { usePickerProps } from './utils';\n\nexport interface ComboBoxProps {\n table: DhType.Table;\n}\n\nexport function ComboBox(props: ComboBoxProps): JSX.Element {\n const pickerProps = usePickerProps(props);\n return (\n <ComboBoxNormalized\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...pickerProps}\n />\n );\n}\n\nexport default ComboBox;\n"],"mappings":";;;;;AAAA,SAASA,kBAAkB,QAAQ,uBAAuB;AAAC,SAElDC,cAAc;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAMvB,OAAO,SAASC,QAAQA,CAACC,KAAoB,EAAe;EAC1D,IAAMC,WAAW,GAAGL,cAAc,CAACI,KAAK,CAAC;EACzC,oBACEF,IAAA,CAACH;EACC;EAAA,EAAAO,aAAA,KACID,WAAW,CAChB,CAAC;AAEN;AAEA,eAAeF,QAAQ"}
1
+ {"version":3,"file":"ComboBox.js","names":["ComboBoxNormalized","useCallback","usePickerProps","jsx","_jsx","ComboBox","props","_usePickerProps","onInputChange","onInputChangeInternal","onSearchTextChange","pickerProps","_objectWithoutProperties","_excluded","value","_objectSpread"],"sources":["../../src/spectrum/ComboBox.tsx"],"sourcesContent":["import {\n ComboBoxNormalized,\n NormalizedItem,\n SpectrumComboBoxProps,\n} from '@deephaven/components';\nimport { useCallback } from 'react';\nimport { PickerWithTableProps } from './PickerProps';\nimport { usePickerProps } from './utils';\n\nexport type ComboBoxProps = PickerWithTableProps<\n SpectrumComboBoxProps<NormalizedItem>\n>;\n\nexport function ComboBox(props: ComboBoxProps): JSX.Element {\n const {\n onInputChange: onInputChangeInternal,\n onSearchTextChange,\n ...pickerProps\n } = usePickerProps<ComboBoxProps>(props);\n\n const onInputChange = useCallback(\n (value: string) => {\n onInputChangeInternal?.(value);\n onSearchTextChange(value);\n },\n [onInputChangeInternal, onSearchTextChange]\n );\n\n return (\n <ComboBoxNormalized\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...pickerProps}\n onInputChange={onInputChange}\n />\n );\n}\n\nexport default ComboBox;\n"],"mappings":";;;;;;;;AAAA,SACEA,kBAAkB,QAGb,uBAAuB;AAC9B,SAASC,WAAW,QAAQ,OAAO;AAAC,SAE3BC,cAAc;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAMvB,OAAO,SAASC,QAAQA,CAACC,KAAoB,EAAe;EAC1D,IAAAC,eAAA,GAIIL,cAAc,CAAgBI,KAAK,CAAC;IAJlC;MACJE,aAAa,EAAEC,qBAAqB;MACpCC;IAEF,CAAC,GAAAH,eAAA;IADII,WAAW,GAAAC,wBAAA,CAAAL,eAAA,EAAAM,SAAA;EAGhB,IAAML,aAAa,GAAGP,WAAW,CAC9Ba,KAAa,IAAK;IACjBL,qBAAqB,aAArBA,qBAAqB,uBAArBA,qBAAqB,CAAGK,KAAK,CAAC;IAC9BJ,kBAAkB,CAACI,KAAK,CAAC;EAC3B,CAAC,EACD,CAACL,qBAAqB,EAAEC,kBAAkB,CAC5C,CAAC;EAED,oBACEN,IAAA,CAACJ;EACC;EAAA,EAAAe,aAAA,CAAAA,aAAA,KACIJ,WAAW;IACfH,aAAa,EAAEA;EAAc,EAC9B,CAAC;AAEN;AAEA,eAAeH,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"Picker.js","names":["PickerNormalized","usePickerProps","jsx","_jsx","Picker","props","pickerProps","_objectSpread"],"sources":["../../src/spectrum/Picker.tsx"],"sourcesContent":["import { PickerNormalized } from '@deephaven/components';\nimport { PickerProps } from './PickerProps';\nimport { usePickerProps } from './utils';\n\nexport function Picker(props: PickerProps): JSX.Element {\n const pickerProps = usePickerProps(props);\n\n return (\n <PickerNormalized\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...pickerProps}\n />\n );\n}\n\nexport default Picker;\n"],"mappings":";;;;;AAAA,SAASA,gBAAgB,QAAQ,uBAAuB;AAAC,SAEhDC,cAAc;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAEvB,OAAO,SAASC,MAAMA,CAACC,KAAkB,EAAe;EACtD,IAAMC,WAAW,GAAGL,cAAc,CAACI,KAAK,CAAC;EAEzC,oBACEF,IAAA,CAACH;EACC;EAAA,EAAAO,aAAA,KACID,WAAW,CAChB,CAAC;AAEN;AAEA,eAAeF,MAAM"}
1
+ {"version":3,"file":"Picker.js","names":["PickerNormalized","usePickerProps","jsx","_jsx","Picker","props","pickerProps","_objectSpread"],"sources":["../../src/spectrum/Picker.tsx"],"sourcesContent":["import { PickerNormalized } from '@deephaven/components';\nimport { PickerProps } from './PickerProps';\nimport { usePickerProps } from './utils';\n\nexport function Picker(props: PickerProps): JSX.Element {\n const pickerProps = usePickerProps<PickerProps>(props);\n\n return (\n <PickerNormalized\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...pickerProps}\n />\n );\n}\n\nexport default Picker;\n"],"mappings":";;;;;AAAA,SAASA,gBAAgB,QAAQ,uBAAuB;AAAC,SAEhDC,cAAc;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAEvB,OAAO,SAASC,MAAMA,CAACC,KAAkB,EAAe;EACtD,IAAMC,WAAW,GAAGL,cAAc,CAAcI,KAAK,CAAC;EAEtD,oBACEF,IAAA,CAACH;EACC;EAAA,EAAAO,aAAA,KACID,WAAW,CAChB,CAAC;AAEN;AAEA,eAAeF,MAAM"}
@@ -11,7 +11,7 @@ import { dh } from '@deephaven/jsapi-types';
11
11
  * @returns A function that deserializes a row into a normalized item data object
12
12
  */
13
13
  export declare function useItemRowDeserializer({ table, descriptionColumnName, iconColumnName, keyColumnName, labelColumnName, formatValue, }: {
14
- table: dh.Table;
14
+ table?: dh.Table | null;
15
15
  descriptionColumnName?: string;
16
16
  iconColumnName?: string;
17
17
  keyColumnName?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"useItemRowDeserializer.d.ts","sourceRoot":"","sources":["../../../src/spectrum/utils/useItemRowDeserializer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAmB5C;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,KAAK,EACL,qBAAqB,EACrB,cAAc,EACd,aAAa,EACb,eAAe,EACf,WAAgC,GACjC,EAAE;IACD,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC;IAChB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9D,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,kBAAkB,CAgDtC;AAED,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"useItemRowDeserializer.d.ts","sourceRoot":"","sources":["../../../src/spectrum/utils/useItemRowDeserializer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAoB5C;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,KAAK,EACL,qBAAqB,EACrB,cAAc,EACd,aAAa,EACb,eAAe,EACf,WAAgC,GACjC,EAAE;IACD,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9D,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,kBAAkB,CA8DtC;AAED,eAAe,sBAAsB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { useCallback, useMemo } from 'react';
2
+ import { assertNotNull } from '@deephaven/utils';
2
3
  import { getItemKeyColumn, getItemLabelColumn } from "./itemUtils.js";
3
4
  function defaultFormatKey(value) {
4
5
  if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
@@ -29,11 +30,18 @@ export function useItemRowDeserializer(_ref) {
29
30
  labelColumnName,
30
31
  formatValue = defaultFormatValue
31
32
  } = _ref;
32
- var keyColumn = useMemo(() => getItemKeyColumn(table, keyColumnName), [keyColumnName, table]);
33
- var labelColumn = useMemo(() => getItemLabelColumn(table, keyColumn, labelColumnName), [keyColumn, labelColumnName, table]);
34
- var descriptionColumn = useMemo(() => descriptionColumnName == null ? null : table.findColumn(descriptionColumnName), [descriptionColumnName, table]);
35
- var iconColumn = useMemo(() => iconColumnName == null ? null : table.findColumn(iconColumnName), [iconColumnName, table]);
33
+ var keyColumn = useMemo(() => table == null ? null : getItemKeyColumn(table, keyColumnName), [keyColumnName, table]);
34
+ var labelColumn = useMemo(() => table == null || keyColumn == null ? null : getItemLabelColumn(table, keyColumn, labelColumnName), [keyColumn, labelColumnName, table]);
35
+ var descriptionColumn = useMemo(() => table == null || descriptionColumnName == null ? null : table.findColumn(descriptionColumnName), [descriptionColumnName, table]);
36
+ var iconColumn = useMemo(() => table == null || iconColumnName == null ? null : table.findColumn(iconColumnName), [iconColumnName, table]);
36
37
  var deserializeRow = useCallback(row => {
38
+ // `deserializeRow` can be created on a null `table` which results in null
39
+ // `keyColumn` + `labelColumn`, but it should never actually be called.
40
+ // The assumption is that the `table` will eventually be non-null,
41
+ // `deserializeRow` will be recreated, and then applied to the non-null
42
+ // table.
43
+ assertNotNull(keyColumn, 'keyColumn cannot be null.');
44
+ assertNotNull(labelColumn, 'labelColumn cannot be null.');
37
45
  var key = defaultFormatKey(row.get(keyColumn));
38
46
  var content = formatValue(row.get(labelColumn), labelColumn.type);
39
47
  var description = descriptionColumn == null ? undefined : formatValue(row.get(descriptionColumn), descriptionColumn.type);
@@ -1 +1 @@
1
- {"version":3,"file":"useItemRowDeserializer.js","names":["useCallback","useMemo","getItemKeyColumn","getItemLabelColumn","defaultFormatKey","value","String","defaultFormatValue","_columnType","useItemRowDeserializer","_ref","table","descriptionColumnName","iconColumnName","keyColumnName","labelColumnName","formatValue","keyColumn","labelColumn","descriptionColumn","findColumn","iconColumn","deserializeRow","row","key","get","content","type","description","undefined","icon","textValue"],"sources":["../../../src/spectrum/utils/useItemRowDeserializer.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport { NormalizedItemData } from '@deephaven/components';\nimport { dh } from '@deephaven/jsapi-types';\nimport { getItemKeyColumn, getItemLabelColumn } from './itemUtils';\n\nfunction defaultFormatKey(value: unknown): string | number | boolean {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return value;\n }\n\n return String(value);\n}\n\nfunction defaultFormatValue(value: unknown, _columnType: string): string {\n return String(value);\n}\n\n/**\n * Returns a function that deserializes a row into a normalized item data object.\n * @param table The table to get the key and label columns from\n * @param descriptionColumnName The name of the column to use for description data\n * @param iconColumnName The name of the column to use for icon data\n * @param keyColumnName The name of the column to use for key data\n * @param labelColumnName The name of the column to use for label data\n * @param formatValue Optional function to format the label value\n * @returns A function that deserializes a row into a normalized item data object\n */\nexport function useItemRowDeserializer({\n table,\n descriptionColumnName,\n iconColumnName,\n keyColumnName,\n labelColumnName,\n formatValue = defaultFormatValue,\n}: {\n table: dh.Table;\n descriptionColumnName?: string;\n iconColumnName?: string;\n keyColumnName?: string;\n labelColumnName?: string;\n formatValue?: (value: unknown, columnType: string) => string;\n}): (row: dh.Row) => NormalizedItemData {\n const keyColumn = useMemo(\n () => getItemKeyColumn(table, keyColumnName),\n [keyColumnName, table]\n );\n\n const labelColumn = useMemo(\n () => getItemLabelColumn(table, keyColumn, labelColumnName),\n [keyColumn, labelColumnName, table]\n );\n\n const descriptionColumn = useMemo(\n () =>\n descriptionColumnName == null\n ? null\n : table.findColumn(descriptionColumnName),\n [descriptionColumnName, table]\n );\n\n const iconColumn = useMemo(\n () => (iconColumnName == null ? null : table.findColumn(iconColumnName)),\n [iconColumnName, table]\n );\n\n const deserializeRow = useCallback(\n (row: dh.Row): NormalizedItemData => {\n const key = defaultFormatKey(row.get(keyColumn));\n const content = formatValue(row.get(labelColumn), labelColumn.type);\n\n const description =\n descriptionColumn == null\n ? undefined\n : formatValue(row.get(descriptionColumn), descriptionColumn.type);\n\n const icon = iconColumn == null ? undefined : row.get(iconColumn);\n\n return {\n key,\n content,\n textValue: content,\n description,\n icon,\n };\n },\n [descriptionColumn, formatValue, iconColumn, keyColumn, labelColumn]\n );\n\n return deserializeRow;\n}\n\nexport default useItemRowDeserializer;\n"],"mappings":"AAAA,SAASA,WAAW,EAAEC,OAAO,QAAQ,OAAO;AAAC,SAGpCC,gBAAgB,EAAEC,kBAAkB;AAE7C,SAASC,gBAAgBA,CAACC,KAAc,EAA6B;EACnE,IACE,OAAOA,KAAK,KAAK,QAAQ,IACzB,OAAOA,KAAK,KAAK,QAAQ,IACzB,OAAOA,KAAK,KAAK,SAAS,EAC1B;IACA,OAAOA,KAAK;EACd;EAEA,OAAOC,MAAM,CAACD,KAAK,CAAC;AACtB;AAEA,SAASE,kBAAkBA,CAACF,KAAc,EAAEG,WAAmB,EAAU;EACvE,OAAOF,MAAM,CAACD,KAAK,CAAC;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASI,sBAAsBA,CAAAC,IAAA,EAcE;EAAA,IAdD;IACrCC,KAAK;IACLC,qBAAqB;IACrBC,cAAc;IACdC,aAAa;IACbC,eAAe;IACfC,WAAW,GAAGT;EAQhB,CAAC,GAAAG,IAAA;EACC,IAAMO,SAAS,GAAGhB,OAAO,CACvB,MAAMC,gBAAgB,CAACS,KAAK,EAAEG,aAAa,CAAC,EAC5C,CAACA,aAAa,EAAEH,KAAK,CACvB,CAAC;EAED,IAAMO,WAAW,GAAGjB,OAAO,CACzB,MAAME,kBAAkB,CAACQ,KAAK,EAAEM,SAAS,EAAEF,eAAe,CAAC,EAC3D,CAACE,SAAS,EAAEF,eAAe,EAAEJ,KAAK,CACpC,CAAC;EAED,IAAMQ,iBAAiB,GAAGlB,OAAO,CAC/B,MACEW,qBAAqB,IAAI,IAAI,GACzB,IAAI,GACJD,KAAK,CAACS,UAAU,CAACR,qBAAqB,CAAC,EAC7C,CAACA,qBAAqB,EAAED,KAAK,CAC/B,CAAC;EAED,IAAMU,UAAU,GAAGpB,OAAO,CACxB,MAAOY,cAAc,IAAI,IAAI,GAAG,IAAI,GAAGF,KAAK,CAACS,UAAU,CAACP,cAAc,CAAE,EACxE,CAACA,cAAc,EAAEF,KAAK,CACxB,CAAC;EAED,IAAMW,cAAc,GAAGtB,WAAW,CAC/BuB,GAAW,IAAyB;IACnC,IAAMC,GAAG,GAAGpB,gBAAgB,CAACmB,GAAG,CAACE,GAAG,CAACR,SAAS,CAAC,CAAC;IAChD,IAAMS,OAAO,GAAGV,WAAW,CAACO,GAAG,CAACE,GAAG,CAACP,WAAW,CAAC,EAAEA,WAAW,CAACS,IAAI,CAAC;IAEnE,IAAMC,WAAW,GACfT,iBAAiB,IAAI,IAAI,GACrBU,SAAS,GACTb,WAAW,CAACO,GAAG,CAACE,GAAG,CAACN,iBAAiB,CAAC,EAAEA,iBAAiB,CAACQ,IAAI,CAAC;IAErE,IAAMG,IAAI,GAAGT,UAAU,IAAI,IAAI,GAAGQ,SAAS,GAAGN,GAAG,CAACE,GAAG,CAACJ,UAAU,CAAC;IAEjE,OAAO;MACLG,GAAG;MACHE,OAAO;MACPK,SAAS,EAAEL,OAAO;MAClBE,WAAW;MACXE;IACF,CAAC;EACH,CAAC,EACD,CAACX,iBAAiB,EAAEH,WAAW,EAAEK,UAAU,EAAEJ,SAAS,EAAEC,WAAW,CACrE,CAAC;EAED,OAAOI,cAAc;AACvB;AAEA,eAAeb,sBAAsB"}
1
+ {"version":3,"file":"useItemRowDeserializer.js","names":["useCallback","useMemo","assertNotNull","getItemKeyColumn","getItemLabelColumn","defaultFormatKey","value","String","defaultFormatValue","_columnType","useItemRowDeserializer","_ref","table","descriptionColumnName","iconColumnName","keyColumnName","labelColumnName","formatValue","keyColumn","labelColumn","descriptionColumn","findColumn","iconColumn","deserializeRow","row","key","get","content","type","description","undefined","icon","textValue"],"sources":["../../../src/spectrum/utils/useItemRowDeserializer.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport { NormalizedItemData } from '@deephaven/components';\nimport { dh } from '@deephaven/jsapi-types';\nimport { assertNotNull } from '@deephaven/utils';\nimport { getItemKeyColumn, getItemLabelColumn } from './itemUtils';\n\nfunction defaultFormatKey(value: unknown): string | number | boolean {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return value;\n }\n\n return String(value);\n}\n\nfunction defaultFormatValue(value: unknown, _columnType: string): string {\n return String(value);\n}\n\n/**\n * Returns a function that deserializes a row into a normalized item data object.\n * @param table The table to get the key and label columns from\n * @param descriptionColumnName The name of the column to use for description data\n * @param iconColumnName The name of the column to use for icon data\n * @param keyColumnName The name of the column to use for key data\n * @param labelColumnName The name of the column to use for label data\n * @param formatValue Optional function to format the label value\n * @returns A function that deserializes a row into a normalized item data object\n */\nexport function useItemRowDeserializer({\n table,\n descriptionColumnName,\n iconColumnName,\n keyColumnName,\n labelColumnName,\n formatValue = defaultFormatValue,\n}: {\n table?: dh.Table | null;\n descriptionColumnName?: string;\n iconColumnName?: string;\n keyColumnName?: string;\n labelColumnName?: string;\n formatValue?: (value: unknown, columnType: string) => string;\n}): (row: dh.Row) => NormalizedItemData {\n const keyColumn = useMemo(\n () => (table == null ? null : getItemKeyColumn(table, keyColumnName)),\n [keyColumnName, table]\n );\n\n const labelColumn = useMemo(\n () =>\n table == null || keyColumn == null\n ? null\n : getItemLabelColumn(table, keyColumn, labelColumnName),\n [keyColumn, labelColumnName, table]\n );\n\n const descriptionColumn = useMemo(\n () =>\n table == null || descriptionColumnName == null\n ? null\n : table.findColumn(descriptionColumnName),\n [descriptionColumnName, table]\n );\n\n const iconColumn = useMemo(\n () =>\n table == null || iconColumnName == null\n ? null\n : table.findColumn(iconColumnName),\n [iconColumnName, table]\n );\n\n const deserializeRow = useCallback(\n (row: dh.Row): NormalizedItemData => {\n // `deserializeRow` can be created on a null `table` which results in null\n // `keyColumn` + `labelColumn`, but it should never actually be called.\n // The assumption is that the `table` will eventually be non-null,\n // `deserializeRow` will be recreated, and then applied to the non-null\n // table.\n assertNotNull(keyColumn, 'keyColumn cannot be null.');\n assertNotNull(labelColumn, 'labelColumn cannot be null.');\n\n const key = defaultFormatKey(row.get(keyColumn));\n const content = formatValue(row.get(labelColumn), labelColumn.type);\n\n const description =\n descriptionColumn == null\n ? undefined\n : formatValue(row.get(descriptionColumn), descriptionColumn.type);\n\n const icon = iconColumn == null ? undefined : row.get(iconColumn);\n\n return {\n key,\n content,\n textValue: content,\n description,\n icon,\n };\n },\n [descriptionColumn, formatValue, iconColumn, keyColumn, labelColumn]\n );\n\n return deserializeRow;\n}\n\nexport default useItemRowDeserializer;\n"],"mappings":"AAAA,SAASA,WAAW,EAAEC,OAAO,QAAQ,OAAO;AAG5C,SAASC,aAAa,QAAQ,kBAAkB;AAAC,SACxCC,gBAAgB,EAAEC,kBAAkB;AAE7C,SAASC,gBAAgBA,CAACC,KAAc,EAA6B;EACnE,IACE,OAAOA,KAAK,KAAK,QAAQ,IACzB,OAAOA,KAAK,KAAK,QAAQ,IACzB,OAAOA,KAAK,KAAK,SAAS,EAC1B;IACA,OAAOA,KAAK;EACd;EAEA,OAAOC,MAAM,CAACD,KAAK,CAAC;AACtB;AAEA,SAASE,kBAAkBA,CAACF,KAAc,EAAEG,WAAmB,EAAU;EACvE,OAAOF,MAAM,CAACD,KAAK,CAAC;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASI,sBAAsBA,CAAAC,IAAA,EAcE;EAAA,IAdD;IACrCC,KAAK;IACLC,qBAAqB;IACrBC,cAAc;IACdC,aAAa;IACbC,eAAe;IACfC,WAAW,GAAGT;EAQhB,CAAC,GAAAG,IAAA;EACC,IAAMO,SAAS,GAAGjB,OAAO,CACvB,MAAOW,KAAK,IAAI,IAAI,GAAG,IAAI,GAAGT,gBAAgB,CAACS,KAAK,EAAEG,aAAa,CAAE,EACrE,CAACA,aAAa,EAAEH,KAAK,CACvB,CAAC;EAED,IAAMO,WAAW,GAAGlB,OAAO,CACzB,MACEW,KAAK,IAAI,IAAI,IAAIM,SAAS,IAAI,IAAI,GAC9B,IAAI,GACJd,kBAAkB,CAACQ,KAAK,EAAEM,SAAS,EAAEF,eAAe,CAAC,EAC3D,CAACE,SAAS,EAAEF,eAAe,EAAEJ,KAAK,CACpC,CAAC;EAED,IAAMQ,iBAAiB,GAAGnB,OAAO,CAC/B,MACEW,KAAK,IAAI,IAAI,IAAIC,qBAAqB,IAAI,IAAI,GAC1C,IAAI,GACJD,KAAK,CAACS,UAAU,CAACR,qBAAqB,CAAC,EAC7C,CAACA,qBAAqB,EAAED,KAAK,CAC/B,CAAC;EAED,IAAMU,UAAU,GAAGrB,OAAO,CACxB,MACEW,KAAK,IAAI,IAAI,IAAIE,cAAc,IAAI,IAAI,GACnC,IAAI,GACJF,KAAK,CAACS,UAAU,CAACP,cAAc,CAAC,EACtC,CAACA,cAAc,EAAEF,KAAK,CACxB,CAAC;EAED,IAAMW,cAAc,GAAGvB,WAAW,CAC/BwB,GAAW,IAAyB;IACnC;IACA;IACA;IACA;IACA;IACAtB,aAAa,CAACgB,SAAS,EAAE,2BAA2B,CAAC;IACrDhB,aAAa,CAACiB,WAAW,EAAE,6BAA6B,CAAC;IAEzD,IAAMM,GAAG,GAAGpB,gBAAgB,CAACmB,GAAG,CAACE,GAAG,CAACR,SAAS,CAAC,CAAC;IAChD,IAAMS,OAAO,GAAGV,WAAW,CAACO,GAAG,CAACE,GAAG,CAACP,WAAW,CAAC,EAAEA,WAAW,CAACS,IAAI,CAAC;IAEnE,IAAMC,WAAW,GACfT,iBAAiB,IAAI,IAAI,GACrBU,SAAS,GACTb,WAAW,CAACO,GAAG,CAACE,GAAG,CAACN,iBAAiB,CAAC,EAAEA,iBAAiB,CAACQ,IAAI,CAAC;IAErE,IAAMG,IAAI,GAAGT,UAAU,IAAI,IAAI,GAAGQ,SAAS,GAAGN,GAAG,CAACE,GAAG,CAACJ,UAAU,CAAC;IAEjE,OAAO;MACLG,GAAG;MACHE,OAAO;MACPK,SAAS,EAAEL,OAAO;MAClBE,WAAW;MACXE;IACF,CAAC;EACH,CAAC,EACD,CAACX,iBAAiB,EAAEH,WAAW,EAAEK,UAAU,EAAEJ,SAAS,EAAEC,WAAW,CACrE,CAAC;EAED,OAAOI,cAAc;AACvB;AAEA,eAAeb,sBAAsB"}
@@ -7,6 +7,7 @@ export type UsePickerDerivedProps = {
7
7
  getInitialScrollPosition: () => Promise<number | null>;
8
8
  onChange: (key: ItemKey | null) => void;
9
9
  onScroll: (event: Event) => void;
10
+ onSearchTextChange: (searchText: string) => void;
10
11
  };
11
12
  /**
12
13
  * Props that are passed through untouched. (should exclude all of the
@@ -16,6 +17,6 @@ export type UsePickerDerivedProps = {
16
17
  export type UsePickerPassthroughProps<TProps> = Omit<PickerWithTableProps<TProps>, 'table' | 'keyColumn' | 'labelColumn' | 'iconColumn' | 'settings' | 'onChange' | 'onSelectionChange'>;
17
18
  /** Props returned by `usePickerProps` hook. */
18
19
  export type UsePickerProps<TProps> = UsePickerDerivedProps & UsePickerPassthroughProps<TProps>;
19
- export declare function usePickerProps<TProps>({ table, keyColumn: keyColumnName, labelColumn: labelColumnName, iconColumn: iconColumnName, settings, onChange, onSelectionChange, ...props }: PickerWithTableProps<TProps>): UsePickerProps<TProps>;
20
+ export declare function usePickerProps<TProps>({ table: tableSource, keyColumn: keyColumnName, labelColumn: labelColumnName, iconColumn: iconColumnName, settings, onChange, onSelectionChange, ...props }: PickerWithTableProps<TProps>): UsePickerProps<TProps>;
20
21
  export default usePickerProps;
21
22
  //# sourceMappingURL=usePickerProps.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"usePickerProps.d.ts","sourceRoot":"","sources":["../../../src/spectrum/utils/usePickerProps.ts"],"names":[],"mappings":"AACA,OAAO,EACL,OAAO,EACP,cAAc,EAEd,iBAAiB,EAGlB,MAAM,uBAAuB,CAAC;AAK/B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAQ3D,kDAAkD;AAClD,MAAM,MAAM,qBAAqB,GAAG;IAClC,eAAe,EAAE,CAAC,cAAc,GAAG,iBAAiB,CAAC,EAAE,CAAC;IACxD,aAAa,EAAE,OAAO,CAAC;IACvB,wBAAwB,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACvD,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;IACxC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC,CAAC;AAEF;;;;IAII;AACJ,MAAM,MAAM,yBAAyB,CAAC,MAAM,IAAI,IAAI,CAClD,oBAAoB,CAAC,MAAM,CAAC,EAC1B,OAAO,GACP,WAAW,GACX,aAAa,GACb,YAAY,GACZ,UAAU,GACV,UAAU,GACV,mBAAmB,CACtB,CAAC;AAEF,+CAA+C;AAC/C,MAAM,MAAM,cAAc,CAAC,MAAM,IAAI,qBAAqB,GACxD,yBAAyB,CAAC,MAAM,CAAC,CAAC;AAEpC,wBAAgB,cAAc,CAAC,MAAM,EAAE,EACrC,KAAK,EACL,SAAS,EAAE,aAAa,EACxB,WAAW,EAAE,eAAe,EAC5B,UAAU,EAAE,cAAc,EAC1B,QAAQ,EACR,QAAQ,EACR,iBAAiB,EACjB,GAAG,KAAK,EACT,EAAE,oBAAoB,CAAC,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAsGvD;AAED,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"usePickerProps.d.ts","sourceRoot":"","sources":["../../../src/spectrum/utils/usePickerProps.ts"],"names":[],"mappings":"AACA,OAAO,EACL,OAAO,EACP,cAAc,EACd,iBAAiB,EAElB,MAAM,uBAAuB,CAAC;AAM/B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAQ3D,kDAAkD;AAClD,MAAM,MAAM,qBAAqB,GAAG;IAClC,eAAe,EAAE,CAAC,cAAc,GAAG,iBAAiB,CAAC,EAAE,CAAC;IACxD,aAAa,EAAE,OAAO,CAAC;IACvB,wBAAwB,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACvD,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;IACxC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,kBAAkB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CAClD,CAAC;AAEF;;;;IAII;AACJ,MAAM,MAAM,yBAAyB,CAAC,MAAM,IAAI,IAAI,CAClD,oBAAoB,CAAC,MAAM,CAAC,EAC1B,OAAO,GACP,WAAW,GACX,aAAa,GACb,YAAY,GACZ,UAAU,GACV,UAAU,GACV,mBAAmB,CACtB,CAAC;AAEF,+CAA+C;AAC/C,MAAM,MAAM,cAAc,CAAC,MAAM,IAAI,qBAAqB,GACxD,yBAAyB,CAAC,MAAM,CAAC,CAAC;AAEpC,wBAAgB,cAAc,CAAC,MAAM,EAAE,EACrC,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,aAAa,EACxB,WAAW,EAAE,eAAe,EAC5B,UAAU,EAAE,cAAc,EAC1B,QAAQ,EACR,QAAQ,EACR,iBAAiB,EACjB,GAAG,KAAK,EACT,EAAE,oBAAoB,CAAC,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CA6HvD;AAED,eAAe,cAAc,CAAC"}
@@ -10,13 +10,15 @@ function _objectWithoutProperties(source, excluded) { if (source == null) return
10
10
  function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
11
11
  import { useCallback, useEffect, useMemo, useState } from 'react';
12
12
  import { usePickerItemScale } from '@deephaven/components';
13
+ import { TableUtils } from '@deephaven/jsapi-utils';
13
14
  import Log from '@deephaven/log';
15
+ import { usePromiseFactory } from '@deephaven/react-hooks';
14
16
  import { PICKER_TOP_OFFSET } from '@deephaven/utils';
15
17
  import useFormatter from "../../useFormatter.js";
16
- import { getItemKeyColumn } from "./itemUtils.js";
17
- import useItemRowDeserializer from "./useItemRowDeserializer.js";
18
- import useGetItemIndexByValue from "../../useGetItemIndexByValue.js";
19
- import useViewportData from "../../useViewportData.js";
18
+ import { getItemKeyColumn, getItemLabelColumn } from "./itemUtils.js";
19
+ import { useItemRowDeserializer } from "./useItemRowDeserializer.js";
20
+ import { useGetItemIndexByValue } from "../../useGetItemIndexByValue.js";
21
+ import useSearchableViewportData from "../../useSearchableViewportData.js";
20
22
  var log = Log.module('jsapi-components.usePickerProps');
21
23
 
22
24
  /** Props that are derived by `usePickerProps`. */
@@ -30,8 +32,9 @@ var log = Log.module('jsapi-components.usePickerProps');
30
32
  /** Props returned by `usePickerProps` hook. */
31
33
 
32
34
  export function usePickerProps(_ref) {
35
+ var _keyColumn$name;
33
36
  var {
34
- table,
37
+ table: tableSource,
35
38
  keyColumn: keyColumnName,
36
39
  labelColumn: labelColumnName,
37
40
  iconColumn: iconColumnName,
@@ -44,24 +47,34 @@ export function usePickerProps(_ref) {
44
47
  itemHeight
45
48
  } = usePickerItemScale();
46
49
  var {
47
- getFormattedString: formatValue
50
+ getFormattedString: formatValue,
51
+ timeZone
48
52
  } = useFormatter(settings);
49
53
 
50
54
  // `null` is a valid value for `selectedKey` in controlled mode, so we check
51
55
  // for explicit `undefined` to identify uncontrolled mode.
52
56
  var isUncontrolled = props.selectedKey === undefined;
53
57
  var [uncontrolledSelectedKey, setUncontrolledSelectedKey] = useState(props.defaultSelectedKey);
54
- var keyColumn = useMemo(() => getItemKeyColumn(table, keyColumnName), [keyColumnName, table]);
58
+
59
+ // Copy table so we can apply filters without affecting the original table.
60
+ // (Note that this call is not actually applying any filters. Filter will be
61
+ // applied in `useSearchableViewportData`.)
62
+ var {
63
+ data: tableCopy
64
+ } = usePromiseFactory(TableUtils.copyTableAndApplyFilters, [tableSource]);
65
+ var keyColumn = useMemo(() => tableCopy == null ? null : getItemKeyColumn(tableCopy, keyColumnName), [keyColumnName, tableCopy]);
66
+ var labelColumn = useMemo(() => tableCopy == null || keyColumn == null ? null : getItemLabelColumn(tableCopy, keyColumn, labelColumnName), [keyColumn, labelColumnName, tableCopy]);
67
+ var searchColumnNames = useMemo(() => labelColumn == null ? [] : [labelColumn.name], [labelColumn]);
55
68
  var deserializeRow = useItemRowDeserializer({
56
- table,
69
+ table: tableCopy,
57
70
  iconColumnName,
58
71
  keyColumnName,
59
72
  labelColumnName,
60
73
  formatValue
61
74
  });
62
75
  var getItemIndexByValue = useGetItemIndexByValue({
63
- table,
64
- columnName: keyColumn.name,
76
+ table: tableCopy,
77
+ columnName: (_keyColumn$name = keyColumn === null || keyColumn === void 0 ? void 0 : keyColumn.name) !== null && _keyColumn$name !== void 0 ? _keyColumn$name : null,
65
78
  value: isUncontrolled ? uncontrolledSelectedKey : props.selectedKey
66
79
  });
67
80
  var getInitialScrollPosition = useCallback( /*#__PURE__*/_asyncToGenerator(function* () {
@@ -72,14 +85,17 @@ export function usePickerProps(_ref) {
72
85
  return index * itemHeight + PICKER_TOP_OFFSET;
73
86
  }), [getItemIndexByValue, itemHeight]);
74
87
  var {
75
- viewportData,
76
88
  onScroll,
77
- setViewport
78
- } = useViewportData({
89
+ onSearchTextChange,
90
+ setViewport,
91
+ viewportData
92
+ } = useSearchableViewportData({
79
93
  reuseItemsOnTableResize: true,
80
- table,
94
+ table: tableCopy,
81
95
  itemHeight,
82
- deserializeRow
96
+ deserializeRow,
97
+ searchColumnNames,
98
+ timeZone
83
99
  });
84
100
  var normalizedItems = viewportData.items;
85
101
  useEffect(
@@ -113,7 +129,8 @@ export function usePickerProps(_ref) {
113
129
  showItemIcons: iconColumnName != null,
114
130
  getInitialScrollPosition,
115
131
  onChange: onSelectionChangeInternal,
116
- onScroll
132
+ onScroll,
133
+ onSearchTextChange
117
134
  });
118
135
  }
119
136
  export default usePickerProps;
@@ -1 +1 @@
1
- {"version":3,"file":"usePickerProps.js","names":["useCallback","useEffect","useMemo","useState","usePickerItemScale","Log","PICKER_TOP_OFFSET","useFormatter","getItemKeyColumn","useItemRowDeserializer","useGetItemIndexByValue","useViewportData","log","module","usePickerProps","_ref","table","keyColumn","keyColumnName","labelColumn","labelColumnName","iconColumn","iconColumnName","settings","onChange","onSelectionChange","props","_objectWithoutProperties","_excluded","itemHeight","getFormattedString","formatValue","isUncontrolled","selectedKey","undefined","uncontrolledSelectedKey","setUncontrolledSelectedKey","defaultSelectedKey","deserializeRow","getItemIndexByValue","columnName","name","value","getInitialScrollPosition","_asyncToGenerator","index","viewportData","onScroll","setViewport","reuseItemsOnTableResize","normalizedItems","items","setViewportFromSelectedKey","isCanceled","then","catch","err","error","onSelectionChangeInternal","key","_ref3","_objectSpread","showItemIcons"],"sources":["../../../src/spectrum/utils/usePickerProps.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n ItemKey,\n NormalizedItem,\n NormalizedItemData,\n NormalizedSection,\n NormalizedSectionData,\n usePickerItemScale,\n} from '@deephaven/components';\nimport { dh as DhType } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport { PICKER_TOP_OFFSET } from '@deephaven/utils';\nimport useFormatter from '../../useFormatter';\nimport type { PickerWithTableProps } from '../PickerProps';\nimport { getItemKeyColumn } from './itemUtils';\nimport useItemRowDeserializer from './useItemRowDeserializer';\nimport useGetItemIndexByValue from '../../useGetItemIndexByValue';\nimport useViewportData from '../../useViewportData';\n\nconst log = Log.module('jsapi-components.usePickerProps');\n\n/** Props that are derived by `usePickerProps`. */\nexport type UsePickerDerivedProps = {\n normalizedItems: (NormalizedItem | NormalizedSection)[];\n showItemIcons: boolean;\n getInitialScrollPosition: () => Promise<number | null>;\n onChange: (key: ItemKey | null) => void;\n onScroll: (event: Event) => void;\n};\n\n/** \n * Props that are passed through untouched. (should exclude all of the\n * destructured props passed into `usePickerProps` that are not in the spread\n * ...props)\n) */\nexport type UsePickerPassthroughProps<TProps> = Omit<\n PickerWithTableProps<TProps>,\n | 'table'\n | 'keyColumn'\n | 'labelColumn'\n | 'iconColumn'\n | 'settings'\n | 'onChange'\n | 'onSelectionChange'\n>;\n\n/** Props returned by `usePickerProps` hook. */\nexport type UsePickerProps<TProps> = UsePickerDerivedProps &\n UsePickerPassthroughProps<TProps>;\n\nexport function usePickerProps<TProps>({\n table,\n keyColumn: keyColumnName,\n labelColumn: labelColumnName,\n iconColumn: iconColumnName,\n settings,\n onChange,\n onSelectionChange,\n ...props\n}: PickerWithTableProps<TProps>): UsePickerProps<TProps> {\n const { itemHeight } = usePickerItemScale();\n\n const { getFormattedString: formatValue } = useFormatter(settings);\n\n // `null` is a valid value for `selectedKey` in controlled mode, so we check\n // for explicit `undefined` to identify uncontrolled mode.\n const isUncontrolled = props.selectedKey === undefined;\n const [uncontrolledSelectedKey, setUncontrolledSelectedKey] = useState<\n ItemKey | null | undefined\n >(props.defaultSelectedKey);\n\n const keyColumn = useMemo(\n () => getItemKeyColumn(table, keyColumnName),\n [keyColumnName, table]\n );\n\n const deserializeRow = useItemRowDeserializer({\n table,\n iconColumnName,\n keyColumnName,\n labelColumnName,\n formatValue,\n });\n\n const getItemIndexByValue = useGetItemIndexByValue({\n table,\n columnName: keyColumn.name,\n value: isUncontrolled ? uncontrolledSelectedKey : props.selectedKey,\n });\n\n const getInitialScrollPosition = useCallback(async () => {\n const index = await getItemIndexByValue();\n\n if (index == null) {\n return null;\n }\n\n return index * itemHeight + PICKER_TOP_OFFSET;\n }, [getItemIndexByValue, itemHeight]);\n\n const { viewportData, onScroll, setViewport } = useViewportData<\n NormalizedItemData | NormalizedSectionData,\n DhType.Table\n >({\n reuseItemsOnTableResize: true,\n table,\n itemHeight,\n deserializeRow,\n });\n\n const normalizedItems = viewportData.items as (\n | NormalizedItem\n | NormalizedSection\n )[];\n\n useEffect(\n // Set viewport to include the selected item so that its data will load and\n // the real `key` will be available to show the selection in the UI.\n function setViewportFromSelectedKey() {\n let isCanceled = false;\n\n getItemIndexByValue()\n .then(index => {\n if (index == null || isCanceled) {\n return;\n }\n\n setViewport(index);\n })\n .catch(err => {\n log.error('Error setting viewport from selected key', err);\n });\n\n return () => {\n isCanceled = true;\n };\n },\n [getItemIndexByValue, settings, setViewport]\n );\n\n const onSelectionChangeInternal = useCallback(\n (key: ItemKey | null): void => {\n // If our component is uncontrolled, track the selected key internally\n // so that we can scroll to the selected item if the user re-opens\n if (isUncontrolled) {\n setUncontrolledSelectedKey(key);\n }\n\n (onChange ?? onSelectionChange)?.(key);\n },\n [isUncontrolled, onChange, onSelectionChange]\n );\n\n return {\n ...props,\n normalizedItems,\n showItemIcons: iconColumnName != null,\n getInitialScrollPosition,\n onChange: onSelectionChangeInternal,\n onScroll,\n };\n}\n\nexport default usePickerProps;\n"],"mappings":"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"}
1
+ {"version":3,"file":"usePickerProps.js","names":["useCallback","useEffect","useMemo","useState","usePickerItemScale","TableUtils","Log","usePromiseFactory","PICKER_TOP_OFFSET","useFormatter","getItemKeyColumn","getItemLabelColumn","useItemRowDeserializer","useGetItemIndexByValue","useSearchableViewportData","log","module","usePickerProps","_ref","_keyColumn$name","table","tableSource","keyColumn","keyColumnName","labelColumn","labelColumnName","iconColumn","iconColumnName","settings","onChange","onSelectionChange","props","_objectWithoutProperties","_excluded","itemHeight","getFormattedString","formatValue","timeZone","isUncontrolled","selectedKey","undefined","uncontrolledSelectedKey","setUncontrolledSelectedKey","defaultSelectedKey","data","tableCopy","copyTableAndApplyFilters","searchColumnNames","name","deserializeRow","getItemIndexByValue","columnName","value","getInitialScrollPosition","_asyncToGenerator","index","onScroll","onSearchTextChange","setViewport","viewportData","reuseItemsOnTableResize","normalizedItems","items","setViewportFromSelectedKey","isCanceled","then","catch","err","error","onSelectionChangeInternal","key","_ref3","_objectSpread","showItemIcons"],"sources":["../../../src/spectrum/utils/usePickerProps.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n ItemKey,\n NormalizedItem,\n NormalizedSection,\n usePickerItemScale,\n} from '@deephaven/components';\nimport { TableUtils } from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport { usePromiseFactory } from '@deephaven/react-hooks';\nimport { PICKER_TOP_OFFSET } from '@deephaven/utils';\nimport useFormatter from '../../useFormatter';\nimport type { PickerWithTableProps } from '../PickerProps';\nimport { getItemKeyColumn, getItemLabelColumn } from './itemUtils';\nimport { useItemRowDeserializer } from './useItemRowDeserializer';\nimport { useGetItemIndexByValue } from '../../useGetItemIndexByValue';\nimport useSearchableViewportData from '../../useSearchableViewportData';\n\nconst log = Log.module('jsapi-components.usePickerProps');\n\n/** Props that are derived by `usePickerProps`. */\nexport type UsePickerDerivedProps = {\n normalizedItems: (NormalizedItem | NormalizedSection)[];\n showItemIcons: boolean;\n getInitialScrollPosition: () => Promise<number | null>;\n onChange: (key: ItemKey | null) => void;\n onScroll: (event: Event) => void;\n onSearchTextChange: (searchText: string) => void;\n};\n\n/** \n * Props that are passed through untouched. (should exclude all of the\n * destructured props passed into `usePickerProps` that are not in the spread\n * ...props)\n) */\nexport type UsePickerPassthroughProps<TProps> = Omit<\n PickerWithTableProps<TProps>,\n | 'table'\n | 'keyColumn'\n | 'labelColumn'\n | 'iconColumn'\n | 'settings'\n | 'onChange'\n | 'onSelectionChange'\n>;\n\n/** Props returned by `usePickerProps` hook. */\nexport type UsePickerProps<TProps> = UsePickerDerivedProps &\n UsePickerPassthroughProps<TProps>;\n\nexport function usePickerProps<TProps>({\n table: tableSource,\n keyColumn: keyColumnName,\n labelColumn: labelColumnName,\n iconColumn: iconColumnName,\n settings,\n onChange,\n onSelectionChange,\n ...props\n}: PickerWithTableProps<TProps>): UsePickerProps<TProps> {\n const { itemHeight } = usePickerItemScale();\n\n const { getFormattedString: formatValue, timeZone } = useFormatter(settings);\n\n // `null` is a valid value for `selectedKey` in controlled mode, so we check\n // for explicit `undefined` to identify uncontrolled mode.\n const isUncontrolled = props.selectedKey === undefined;\n const [uncontrolledSelectedKey, setUncontrolledSelectedKey] = useState<\n ItemKey | null | undefined\n >(props.defaultSelectedKey);\n\n // Copy table so we can apply filters without affecting the original table.\n // (Note that this call is not actually applying any filters. Filter will be\n // applied in `useSearchableViewportData`.)\n const { data: tableCopy } = usePromiseFactory(\n TableUtils.copyTableAndApplyFilters,\n [tableSource]\n );\n\n const keyColumn = useMemo(\n () =>\n tableCopy == null ? null : getItemKeyColumn(tableCopy, keyColumnName),\n [keyColumnName, tableCopy]\n );\n\n const labelColumn = useMemo(\n () =>\n tableCopy == null || keyColumn == null\n ? null\n : getItemLabelColumn(tableCopy, keyColumn, labelColumnName),\n [keyColumn, labelColumnName, tableCopy]\n );\n\n const searchColumnNames = useMemo(\n () => (labelColumn == null ? [] : [labelColumn.name]),\n [labelColumn]\n );\n\n const deserializeRow = useItemRowDeserializer({\n table: tableCopy,\n iconColumnName,\n keyColumnName,\n labelColumnName,\n formatValue,\n });\n\n const getItemIndexByValue = useGetItemIndexByValue({\n table: tableCopy,\n columnName: keyColumn?.name ?? null,\n value: isUncontrolled ? uncontrolledSelectedKey : props.selectedKey,\n });\n\n const getInitialScrollPosition = useCallback(async () => {\n const index = await getItemIndexByValue();\n\n if (index == null) {\n return null;\n }\n\n return index * itemHeight + PICKER_TOP_OFFSET;\n }, [getItemIndexByValue, itemHeight]);\n\n const { onScroll, onSearchTextChange, setViewport, viewportData } =\n useSearchableViewportData({\n reuseItemsOnTableResize: true,\n table: tableCopy,\n itemHeight,\n deserializeRow,\n searchColumnNames,\n timeZone,\n });\n\n const normalizedItems = viewportData.items as (\n | NormalizedItem\n | NormalizedSection\n )[];\n\n useEffect(\n // Set viewport to include the selected item so that its data will load and\n // the real `key` will be available to show the selection in the UI.\n function setViewportFromSelectedKey() {\n let isCanceled = false;\n\n getItemIndexByValue()\n .then(index => {\n if (index == null || isCanceled) {\n return;\n }\n\n setViewport(index);\n })\n .catch(err => {\n log.error('Error setting viewport from selected key', err);\n });\n\n return () => {\n isCanceled = true;\n };\n },\n [getItemIndexByValue, settings, setViewport]\n );\n\n const onSelectionChangeInternal = useCallback(\n (key: ItemKey | null): void => {\n // If our component is uncontrolled, track the selected key internally\n // so that we can scroll to the selected item if the user re-opens\n if (isUncontrolled) {\n setUncontrolledSelectedKey(key);\n }\n\n (onChange ?? onSelectionChange)?.(key);\n },\n [isUncontrolled, onChange, onSelectionChange]\n );\n\n return {\n ...props,\n normalizedItems,\n showItemIcons: iconColumnName != null,\n getInitialScrollPosition,\n onChange: onSelectionChangeInternal,\n onScroll,\n onSearchTextChange,\n };\n}\n\nexport default usePickerProps;\n"],"mappings":"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"}
@@ -9,7 +9,7 @@ import { dh } from '@deephaven/jsapi-types';
9
9
  * matching value, or `null` if no match is found
10
10
  */
11
11
  export declare function useGetItemIndexByValue<TValue>({ columnName, value, table, }: {
12
- columnName: string;
12
+ columnName: string | null;
13
13
  table: dh.Table | null;
14
14
  value: TValue | null | undefined;
15
15
  }): () => Promise<number | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"useGetItemIndexByValue.d.ts","sourceRoot":"","sources":["../src/useGetItemIndexByValue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAG5C;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,EAC7C,UAAU,EACV,KAAK,EACL,KAAK,GACN,EAAE;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CAClC,GAAG,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAc/B;AAED,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"useGetItemIndexByValue.d.ts","sourceRoot":"","sources":["../src/useGetItemIndexByValue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAG5C;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,EAC7C,UAAU,EACV,KAAK,EACL,KAAK,GACN,EAAE;IACD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CAClC,GAAG,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAc/B;AAED,eAAe,sBAAsB,CAAC"}
@@ -19,7 +19,7 @@ export function useGetItemIndexByValue(_ref) {
19
19
  } = _ref;
20
20
  var tableUtils = useTableUtils();
21
21
  return useCallback( /*#__PURE__*/_asyncToGenerator(function* () {
22
- if (table == null || value == null) {
22
+ if (table == null || value == null || columnName == null) {
23
23
  return null;
24
24
  }
25
25
  var column = table.findColumn(columnName);
@@ -1 +1 @@
1
- {"version":3,"file":"useGetItemIndexByValue.js","names":["useCallback","useTableUtils","useGetItemIndexByValue","_ref","columnName","value","table","tableUtils","_asyncToGenerator","column","findColumn","columnValueType","getValueType","type","index","seekRow"],"sources":["../src/useGetItemIndexByValue.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { dh } from '@deephaven/jsapi-types';\nimport { useTableUtils } from './useTableUtils';\n\n/**\n * Returns a function that gets the index of the first row containing a column\n * value.\n * @param columnName The name of the column to search\n * @param value The value to search for\n * @param table The table to search in\n * @returns A function that returns the index of the first row containing the\n * matching value, or `null` if no match is found\n */\nexport function useGetItemIndexByValue<TValue>({\n columnName,\n value,\n table,\n}: {\n columnName: string;\n table: dh.Table | null;\n value: TValue | null | undefined;\n}): () => Promise<number | null> {\n const tableUtils = useTableUtils();\n\n return useCallback(async () => {\n if (table == null || value == null) {\n return null;\n }\n\n const column = table.findColumn(columnName);\n const columnValueType = tableUtils.getValueType(column.type);\n\n const index = await table.seekRow(0, column, columnValueType, value);\n return index === -1 ? null : index;\n }, [columnName, table, tableUtils, value]);\n}\n\nexport default useGetItemIndexByValue;\n"],"mappings":";;AAAA,SAASA,WAAW,QAAQ,OAAO;AAAC,SAE3BC,aAAa;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,sBAAsBA,CAAAC,IAAA,EAQL;EAAA,IARc;IAC7CC,UAAU;IACVC,KAAK;IACLC;EAKF,CAAC,GAAAH,IAAA;EACC,IAAMI,UAAU,GAAGN,aAAa,CAAC,CAAC;EAElC,OAAOD,WAAW,eAAAQ,iBAAA,CAAC,aAAY;IAC7B,IAAIF,KAAK,IAAI,IAAI,IAAID,KAAK,IAAI,IAAI,EAAE;MAClC,OAAO,IAAI;IACb;IAEA,IAAMI,MAAM,GAAGH,KAAK,CAACI,UAAU,CAACN,UAAU,CAAC;IAC3C,IAAMO,eAAe,GAAGJ,UAAU,CAACK,YAAY,CAACH,MAAM,CAACI,IAAI,CAAC;IAE5D,IAAMC,KAAK,SAASR,KAAK,CAACS,OAAO,CAAC,CAAC,EAAEN,MAAM,EAAEE,eAAe,EAAEN,KAAK,CAAC;IACpE,OAAOS,KAAK,KAAK,CAAC,CAAC,GAAG,IAAI,GAAGA,KAAK;EACpC,CAAC,GAAE,CAACV,UAAU,EAAEE,KAAK,EAAEC,UAAU,EAAEF,KAAK,CAAC,CAAC;AAC5C;AAEA,eAAeH,sBAAsB"}
1
+ {"version":3,"file":"useGetItemIndexByValue.js","names":["useCallback","useTableUtils","useGetItemIndexByValue","_ref","columnName","value","table","tableUtils","_asyncToGenerator","column","findColumn","columnValueType","getValueType","type","index","seekRow"],"sources":["../src/useGetItemIndexByValue.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { dh } from '@deephaven/jsapi-types';\nimport { useTableUtils } from './useTableUtils';\n\n/**\n * Returns a function that gets the index of the first row containing a column\n * value.\n * @param columnName The name of the column to search\n * @param value The value to search for\n * @param table The table to search in\n * @returns A function that returns the index of the first row containing the\n * matching value, or `null` if no match is found\n */\nexport function useGetItemIndexByValue<TValue>({\n columnName,\n value,\n table,\n}: {\n columnName: string | null;\n table: dh.Table | null;\n value: TValue | null | undefined;\n}): () => Promise<number | null> {\n const tableUtils = useTableUtils();\n\n return useCallback(async () => {\n if (table == null || value == null || columnName == null) {\n return null;\n }\n\n const column = table.findColumn(columnName);\n const columnValueType = tableUtils.getValueType(column.type);\n\n const index = await table.seekRow(0, column, columnValueType, value);\n return index === -1 ? null : index;\n }, [columnName, table, tableUtils, value]);\n}\n\nexport default useGetItemIndexByValue;\n"],"mappings":";;AAAA,SAASA,WAAW,QAAQ,OAAO;AAAC,SAE3BC,aAAa;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,sBAAsBA,CAAAC,IAAA,EAQL;EAAA,IARc;IAC7CC,UAAU;IACVC,KAAK;IACLC;EAKF,CAAC,GAAAH,IAAA;EACC,IAAMI,UAAU,GAAGN,aAAa,CAAC,CAAC;EAElC,OAAOD,WAAW,eAAAQ,iBAAA,CAAC,aAAY;IAC7B,IAAIF,KAAK,IAAI,IAAI,IAAID,KAAK,IAAI,IAAI,IAAID,UAAU,IAAI,IAAI,EAAE;MACxD,OAAO,IAAI;IACb;IAEA,IAAMK,MAAM,GAAGH,KAAK,CAACI,UAAU,CAACN,UAAU,CAAC;IAC3C,IAAMO,eAAe,GAAGJ,UAAU,CAACK,YAAY,CAACH,MAAM,CAACI,IAAI,CAAC;IAE5D,IAAMC,KAAK,SAASR,KAAK,CAACS,OAAO,CAAC,CAAC,EAAEN,MAAM,EAAEE,eAAe,EAAEN,KAAK,CAAC;IACpE,OAAOS,KAAK,KAAK,CAAC,CAAC,GAAG,IAAI,GAAGA,KAAK;EACpC,CAAC,GAAE,CAACV,UAAU,EAAEE,KAAK,EAAEC,UAAU,EAAEF,KAAK,CAAC,CAAC;AAC5C;AAEA,eAAeH,sBAAsB"}
@@ -28,13 +28,15 @@ export interface UsePickerWithSelectedValuesResult<TItem, TValue> {
28
28
  * @param mapItemToValue A function to map an item to a value
29
29
  * @param filterConditionFactories Optional filter condition factories to apply to the list
30
30
  * @param trimSearchText Whether to trim the search text before filtering. Defaults to false
31
+ * @param timeZone The timezone to use for date parsing
31
32
  */
32
- export declare function usePickerWithSelectedValues<TItem, TValue>({ maybeTable, columnName, mapItemToValue, filterConditionFactories, trimSearchText, }: {
33
+ export declare function usePickerWithSelectedValues<TItem, TValue>({ maybeTable, columnName, mapItemToValue, filterConditionFactories, trimSearchText, timeZone, }: {
33
34
  maybeTable: dh.Table | null;
34
35
  columnName: string;
35
36
  mapItemToValue: (item: KeyedItem<TItem>) => TValue;
36
37
  filterConditionFactories?: FilterConditionFactory[];
37
38
  trimSearchText?: boolean;
39
+ timeZone: string;
38
40
  }): UsePickerWithSelectedValuesResult<TItem, TValue>;
39
41
  export default usePickerWithSelectedValues;
40
42
  //# sourceMappingURL=usePickerWithSelectedValues.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"usePickerWithSelectedValues.d.ts","sourceRoot":"","sources":["../src/usePickerWithSelectedValues.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAkC,MAAM,OAAO,CAAC;AAC5D,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAGL,sBAAsB,EACvB,MAAM,wBAAwB,CAAC;AAOhC,OAAO,EACL,SAAS,EAET,UAAU,EAGX,MAAM,kBAAkB,CAAC;AAE1B,OAAwB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAK3E,MAAM,WAAW,iCAAiC,CAAC,KAAK,EAAE,MAAM;IAC9D,IAAI,EAAE,qBAAqB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAC7C,4BAA4B,EAAE,OAAO,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,4BAA4B,EAAE,OAAO,CAAC;IACtC,WAAW,EAAE,GAAG,GAAG,IAAI,CAAC;IACxB,gBAAgB,EAAE,WAAW,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,kBAAkB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,KAAK,IAAI,CAAC;IACvC,WAAW,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IACnD,cAAc,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;CACtD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,EACzD,UAAU,EACV,UAAU,EACV,cAAc,EACd,wBAA6B,EAC7B,cAAsB,GACvB,EAAE;IACD,UAAU,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC;IACnD,wBAAwB,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACpD,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,iCAAiC,CAAC,KAAK,EAAE,MAAM,CAAC,CA0NnD;AAED,eAAe,2BAA2B,CAAC"}
1
+ {"version":3,"file":"usePickerWithSelectedValues.d.ts","sourceRoot":"","sources":["../src/usePickerWithSelectedValues.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAkC,MAAM,OAAO,CAAC;AAC5D,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAGL,sBAAsB,EACvB,MAAM,wBAAwB,CAAC;AAOhC,OAAO,EACL,SAAS,EAET,UAAU,EAGX,MAAM,kBAAkB,CAAC;AAE1B,OAAwB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAK3E,MAAM,WAAW,iCAAiC,CAAC,KAAK,EAAE,MAAM;IAC9D,IAAI,EAAE,qBAAqB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAC7C,4BAA4B,EAAE,OAAO,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,4BAA4B,EAAE,OAAO,CAAC;IACtC,WAAW,EAAE,GAAG,GAAG,IAAI,CAAC;IACxB,gBAAgB,EAAE,WAAW,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,kBAAkB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,KAAK,IAAI,CAAC;IACvC,WAAW,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IACnD,cAAc,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;CACtD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,EACzD,UAAU,EACV,UAAU,EACV,cAAc,EACd,wBAA6B,EAC7B,cAAsB,EACtB,QAAQ,GACT,EAAE;IACD,UAAU,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC;IACnD,wBAAwB,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACpD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,iCAAiC,CAAC,KAAK,EAAE,MAAM,CAAC,CAgOnD;AAED,eAAe,2BAA2B,CAAC"}
@@ -18,6 +18,7 @@ import useTableClose from "./useTableClose.js";
18
18
  * @param mapItemToValue A function to map an item to a value
19
19
  * @param filterConditionFactories Optional filter condition factories to apply to the list
20
20
  * @param trimSearchText Whether to trim the search text before filtering. Defaults to false
21
+ * @param timeZone The timezone to use for date parsing
21
22
  */
22
23
  export function usePickerWithSelectedValues(_ref) {
23
24
  var {
@@ -25,7 +26,8 @@ export function usePickerWithSelectedValues(_ref) {
25
26
  columnName,
26
27
  mapItemToValue,
27
28
  filterConditionFactories = [],
28
- trimSearchText = false
29
+ trimSearchText = false,
30
+ timeZone
29
31
  } = _ref;
30
32
  var {
31
33
  itemHeight
@@ -64,7 +66,7 @@ export function usePickerWithSelectedValues(_ref) {
64
66
  // If value exists check is still loading or if debounce hasn't completed, set
65
67
  // `searchTextExists` to null since it is indeterminate.
66
68
  var searchTextExists = isApplyingFilter || valueExistsIsLoading ? null : valueExists;
67
- var searchTextFilter = useMemo(() => createSearchTextFilter(tableUtils, columnName, appliedSearchText), [appliedSearchText, columnName, tableUtils]);
69
+ var searchTextFilter = useMemo(() => createSearchTextFilter(tableUtils, columnName, appliedSearchText, timeZone), [appliedSearchText, columnName, tableUtils, timeZone]);
68
70
 
69
71
  // Filter out selected values from the picker
70
72
  var excludeSelectedValuesFilter = useMemo(() => createSelectedValuesFilter(tableUtils, columnName, new Set(selectedValueMap.keys()), false, true), [columnName, selectedValueMap, tableUtils]);
@@ -1 +1 @@
1
- {"version":3,"file":"usePickerWithSelectedValues.js","names":["useCallback","useMemo","useState","createSearchTextFilter","createSelectedValuesFilter","useDebouncedCallback","useDebouncedValue","usePromiseFactory","usePickerItemScale","SEARCH_DEBOUNCE_MS","VIEWPORT_PADDING","VIEWPORT_SIZE","useFilterConditionFactories","useViewportData","useViewportFilter","useTableUtils","useTableClose","usePickerWithSelectedValues","_ref","maybeTable","columnName","mapItemToValue","filterConditionFactories","trimSearchText","itemHeight","tableUtils","searchText","setSearchText","appliedSearchText","setAppliedSearchText","applySearchText","text","trim","searchTextMaybeTrimmed","selectedKey","setSelectedKey","selectedValueMap","setSelectedValueMap","Map","data","valueExists","isLoading","valueExistsIsLoading","doesColumnValueExist","isDebouncing","isApplyingFilter","searchTextExists","searchTextFilter","excludeSelectedValuesFilter","Set","keys","listTable","createDistinctSortedColumnTable","list","table","viewportSize","viewportPadding","hasSearchTextWithZeroResults","length","size","searchTextIsInSelectedValues","has","onDebouncedSearchTextChange","onSearchTextChange","setSelectedKeyOnNextFrame","onSelectKey","key","item","viewportData","findItem","value","prev","next","set","onAddValues","values","onRemoveValues","delete","filter"],"sources":["../src/usePickerWithSelectedValues.ts"],"sourcesContent":["import { Key, useCallback, useMemo, useState } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport {\n createSearchTextFilter,\n createSelectedValuesFilter,\n FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport {\n useDebouncedCallback,\n useDebouncedValue,\n usePromiseFactory,\n} from '@deephaven/react-hooks';\nimport { usePickerItemScale } from '@deephaven/components';\nimport {\n KeyedItem,\n SEARCH_DEBOUNCE_MS,\n SelectionT,\n VIEWPORT_PADDING,\n VIEWPORT_SIZE,\n} from '@deephaven/utils';\nimport useFilterConditionFactories from './useFilterConditionFactories';\nimport useViewportData, { UseViewportDataResult } from './useViewportData';\nimport useViewportFilter from './useViewportFilter';\nimport useTableUtils from './useTableUtils';\nimport useTableClose from './useTableClose';\n\nexport interface UsePickerWithSelectedValuesResult<TItem, TValue> {\n list: UseViewportDataResult<TItem, dh.Table>;\n hasSearchTextWithZeroResults: boolean;\n searchText: string;\n searchTextExists: boolean | null;\n searchTextIsInSelectedValues: boolean;\n selectedKey: Key | null;\n selectedValueMap: ReadonlyMap<TValue, { value: TValue }>;\n onSearchTextChange: (searchText: string) => void;\n onSelectKey: (key: Key | null) => void;\n onAddValues: (values: ReadonlySet<TValue>) => void;\n onRemoveValues: (values: SelectionT<TValue>) => void;\n}\n\n/**\n * Manages a list of available items that can be searched and selected. Selected\n * items are removed from the list and managed in a selectedValueMap data\n * structure. Useful for components that contain a picker but show selected\n * values in a separate component.\n * @param maybeTable The table to get the list of items from\n * @param columnName The column name to get the list of items from\n * @param mapItemToValue A function to map an item to a value\n * @param filterConditionFactories Optional filter condition factories to apply to the list\n * @param trimSearchText Whether to trim the search text before filtering. Defaults to false\n */\nexport function usePickerWithSelectedValues<TItem, TValue>({\n maybeTable,\n columnName,\n mapItemToValue,\n filterConditionFactories = [],\n trimSearchText = false,\n}: {\n maybeTable: dh.Table | null;\n columnName: string;\n mapItemToValue: (item: KeyedItem<TItem>) => TValue;\n filterConditionFactories?: FilterConditionFactory[];\n trimSearchText?: boolean;\n}): UsePickerWithSelectedValuesResult<TItem, TValue> {\n const { itemHeight } = usePickerItemScale();\n\n const tableUtils = useTableUtils();\n\n // `searchText` should always be up to date for controlled search input.\n // `appliedSearchText` will get updated after a delay to avoid updating\n // filters on every key stroke. It will also be trimmed of leading / trailing\n // spaces if `trimSearchText` is true.\n const [searchText, setSearchText] = useState('');\n const [appliedSearchText, setAppliedSearchText] = useState('');\n\n const applySearchText = useCallback(\n (text: string) => {\n setAppliedSearchText(trimSearchText ? text.trim() : text);\n },\n [trimSearchText]\n );\n\n const searchTextMaybeTrimmed = useMemo(\n () => (trimSearchText ? searchText.trim() : searchText),\n [searchText, trimSearchText]\n );\n\n const [selectedKey, setSelectedKey] = useState<Key | null>(null);\n const [selectedValueMap, setSelectedValueMap] = useState<\n Map<TValue, { value: TValue }>\n >(() => new Map());\n\n const { data: valueExists, isLoading: valueExistsIsLoading } =\n usePromiseFactory(tableUtils.doesColumnValueExist, [\n maybeTable,\n columnName,\n appliedSearchText,\n false /* isCaseSensitive */,\n ]);\n\n // The `searchTextFilter` starts getting applied to the list whenever\n // `appliedSearchText` changes, after which there is a small delay before the\n // items are in sync. Use a debounce timer to allow a little extra time\n // before calculating `searchTextExists` below. Note that there are 2 debounce\n // timers at play here:\n // 1. `onDebouncedSearchTextChange` applies the search text after user stops typing\n // 2. `useDebouncedValue` debounces whenever the result of the first debounce\n // changes, and `isApplyingFilter` will be true while this 2nd timer is active.\n const { isDebouncing: isApplyingFilter } = useDebouncedValue(\n appliedSearchText,\n SEARCH_DEBOUNCE_MS\n );\n\n // If value exists check is still loading or if debounce hasn't completed, set\n // `searchTextExists` to null since it is indeterminate.\n const searchTextExists =\n isApplyingFilter || valueExistsIsLoading ? null : valueExists;\n\n const searchTextFilter = useMemo(\n () => createSearchTextFilter(tableUtils, columnName, appliedSearchText),\n [appliedSearchText, columnName, tableUtils]\n );\n\n // Filter out selected values from the picker\n const excludeSelectedValuesFilter = useMemo(\n () =>\n createSelectedValuesFilter(\n tableUtils,\n columnName,\n new Set(selectedValueMap.keys()),\n false,\n true\n ),\n [columnName, selectedValueMap, tableUtils]\n );\n\n const { data: listTable } = usePromiseFactory(\n tableUtils.createDistinctSortedColumnTable,\n [maybeTable, columnName, 'asc', ...filterConditionFactories]\n );\n\n useTableClose(listTable);\n\n const list = useViewportData<TItem, dh.Table>({\n table: listTable,\n itemHeight,\n viewportSize: VIEWPORT_SIZE,\n viewportPadding: VIEWPORT_PADDING,\n });\n\n const hasSearchTextWithZeroResults =\n searchTextMaybeTrimmed.length > 0 && list.size === 0;\n const searchTextIsInSelectedValues = selectedValueMap.has(\n searchTextMaybeTrimmed as TValue\n );\n\n const onDebouncedSearchTextChange = useDebouncedCallback(\n applySearchText,\n SEARCH_DEBOUNCE_MS\n );\n\n const onSearchTextChange = useCallback(\n (text: string) => {\n setSearchText(text);\n onDebouncedSearchTextChange(text);\n },\n [onDebouncedSearchTextChange]\n );\n\n const setSelectedKeyOnNextFrame = useDebouncedCallback(setSelectedKey, 0);\n\n const onSelectKey = useCallback(\n (key: Key | null) => {\n setSearchText('');\n applySearchText('');\n\n // Set the selection temporarily to avoid the picker staying open\n setSelectedKey(key);\n\n // Clear the selection on next frame since selected items get removed from\n // the list and added to `selectedValues` Map\n setSelectedKeyOnNextFrame(null);\n\n // key will be null in scenarios where search text doesn't match an item\n // and user clicks outside of picker\n if (key == null) {\n return;\n }\n\n const item = list.viewportData.findItem(key);\n\n if (item == null) {\n return;\n }\n\n const value = mapItemToValue(item);\n\n setSelectedValueMap(prev => {\n const next = new Map(prev);\n next.set(value, { value });\n return next;\n });\n },\n [\n applySearchText,\n setSelectedKeyOnNextFrame,\n list.viewportData,\n mapItemToValue,\n ]\n );\n\n const onAddValues = useCallback((values: ReadonlySet<TValue>) => {\n setSelectedValueMap(prev => {\n if (values.size === 0) {\n return prev;\n }\n\n const next = new Map(prev);\n\n // eslint-disable-next-line no-restricted-syntax\n for (const value of values) {\n next.set(value, { value });\n }\n\n return next;\n });\n }, []);\n\n const onRemoveValues = useCallback((values: SelectionT<TValue>) => {\n setSelectedValueMap(prev => {\n if (values === 'all') {\n return new Map();\n }\n\n const next = new Map(prev);\n\n // eslint-disable-next-line no-restricted-syntax\n for (const value of values) {\n next.delete(value);\n }\n\n return next;\n });\n }, []);\n\n const filter = useFilterConditionFactories(\n list.table,\n searchTextFilter,\n excludeSelectedValuesFilter\n );\n\n useViewportFilter(list, filter);\n\n return useMemo(\n () => ({\n list,\n hasSearchTextWithZeroResults,\n searchText,\n searchTextExists,\n searchTextIsInSelectedValues,\n selectedKey,\n selectedValueMap,\n onSearchTextChange,\n onSelectKey,\n onAddValues,\n onRemoveValues,\n }),\n [\n hasSearchTextWithZeroResults,\n list,\n onAddValues,\n onRemoveValues,\n onSearchTextChange,\n onSelectKey,\n searchText,\n searchTextExists,\n searchTextIsInSelectedValues,\n selectedKey,\n selectedValueMap,\n ]\n );\n}\n\nexport default usePickerWithSelectedValues;\n"],"mappings":"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"}
1
+ {"version":3,"file":"usePickerWithSelectedValues.js","names":["useCallback","useMemo","useState","createSearchTextFilter","createSelectedValuesFilter","useDebouncedCallback","useDebouncedValue","usePromiseFactory","usePickerItemScale","SEARCH_DEBOUNCE_MS","VIEWPORT_PADDING","VIEWPORT_SIZE","useFilterConditionFactories","useViewportData","useViewportFilter","useTableUtils","useTableClose","usePickerWithSelectedValues","_ref","maybeTable","columnName","mapItemToValue","filterConditionFactories","trimSearchText","timeZone","itemHeight","tableUtils","searchText","setSearchText","appliedSearchText","setAppliedSearchText","applySearchText","text","trim","searchTextMaybeTrimmed","selectedKey","setSelectedKey","selectedValueMap","setSelectedValueMap","Map","data","valueExists","isLoading","valueExistsIsLoading","doesColumnValueExist","isDebouncing","isApplyingFilter","searchTextExists","searchTextFilter","excludeSelectedValuesFilter","Set","keys","listTable","createDistinctSortedColumnTable","list","table","viewportSize","viewportPadding","hasSearchTextWithZeroResults","length","size","searchTextIsInSelectedValues","has","onDebouncedSearchTextChange","onSearchTextChange","setSelectedKeyOnNextFrame","onSelectKey","key","item","viewportData","findItem","value","prev","next","set","onAddValues","values","onRemoveValues","delete","filter"],"sources":["../src/usePickerWithSelectedValues.ts"],"sourcesContent":["import { Key, useCallback, useMemo, useState } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport {\n createSearchTextFilter,\n createSelectedValuesFilter,\n FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport {\n useDebouncedCallback,\n useDebouncedValue,\n usePromiseFactory,\n} from '@deephaven/react-hooks';\nimport { usePickerItemScale } from '@deephaven/components';\nimport {\n KeyedItem,\n SEARCH_DEBOUNCE_MS,\n SelectionT,\n VIEWPORT_PADDING,\n VIEWPORT_SIZE,\n} from '@deephaven/utils';\nimport useFilterConditionFactories from './useFilterConditionFactories';\nimport useViewportData, { UseViewportDataResult } from './useViewportData';\nimport useViewportFilter from './useViewportFilter';\nimport useTableUtils from './useTableUtils';\nimport useTableClose from './useTableClose';\n\nexport interface UsePickerWithSelectedValuesResult<TItem, TValue> {\n list: UseViewportDataResult<TItem, dh.Table>;\n hasSearchTextWithZeroResults: boolean;\n searchText: string;\n searchTextExists: boolean | null;\n searchTextIsInSelectedValues: boolean;\n selectedKey: Key | null;\n selectedValueMap: ReadonlyMap<TValue, { value: TValue }>;\n onSearchTextChange: (searchText: string) => void;\n onSelectKey: (key: Key | null) => void;\n onAddValues: (values: ReadonlySet<TValue>) => void;\n onRemoveValues: (values: SelectionT<TValue>) => void;\n}\n\n/**\n * Manages a list of available items that can be searched and selected. Selected\n * items are removed from the list and managed in a selectedValueMap data\n * structure. Useful for components that contain a picker but show selected\n * values in a separate component.\n * @param maybeTable The table to get the list of items from\n * @param columnName The column name to get the list of items from\n * @param mapItemToValue A function to map an item to a value\n * @param filterConditionFactories Optional filter condition factories to apply to the list\n * @param trimSearchText Whether to trim the search text before filtering. Defaults to false\n * @param timeZone The timezone to use for date parsing\n */\nexport function usePickerWithSelectedValues<TItem, TValue>({\n maybeTable,\n columnName,\n mapItemToValue,\n filterConditionFactories = [],\n trimSearchText = false,\n timeZone,\n}: {\n maybeTable: dh.Table | null;\n columnName: string;\n mapItemToValue: (item: KeyedItem<TItem>) => TValue;\n filterConditionFactories?: FilterConditionFactory[];\n trimSearchText?: boolean;\n timeZone: string;\n}): UsePickerWithSelectedValuesResult<TItem, TValue> {\n const { itemHeight } = usePickerItemScale();\n\n const tableUtils = useTableUtils();\n\n // `searchText` should always be up to date for controlled search input.\n // `appliedSearchText` will get updated after a delay to avoid updating\n // filters on every key stroke. It will also be trimmed of leading / trailing\n // spaces if `trimSearchText` is true.\n const [searchText, setSearchText] = useState('');\n const [appliedSearchText, setAppliedSearchText] = useState('');\n\n const applySearchText = useCallback(\n (text: string) => {\n setAppliedSearchText(trimSearchText ? text.trim() : text);\n },\n [trimSearchText]\n );\n\n const searchTextMaybeTrimmed = useMemo(\n () => (trimSearchText ? searchText.trim() : searchText),\n [searchText, trimSearchText]\n );\n\n const [selectedKey, setSelectedKey] = useState<Key | null>(null);\n const [selectedValueMap, setSelectedValueMap] = useState<\n Map<TValue, { value: TValue }>\n >(() => new Map());\n\n const { data: valueExists, isLoading: valueExistsIsLoading } =\n usePromiseFactory(tableUtils.doesColumnValueExist, [\n maybeTable,\n columnName,\n appliedSearchText,\n false /* isCaseSensitive */,\n ]);\n\n // The `searchTextFilter` starts getting applied to the list whenever\n // `appliedSearchText` changes, after which there is a small delay before the\n // items are in sync. Use a debounce timer to allow a little extra time\n // before calculating `searchTextExists` below. Note that there are 2 debounce\n // timers at play here:\n // 1. `onDebouncedSearchTextChange` applies the search text after user stops typing\n // 2. `useDebouncedValue` debounces whenever the result of the first debounce\n // changes, and `isApplyingFilter` will be true while this 2nd timer is active.\n const { isDebouncing: isApplyingFilter } = useDebouncedValue(\n appliedSearchText,\n SEARCH_DEBOUNCE_MS\n );\n\n // If value exists check is still loading or if debounce hasn't completed, set\n // `searchTextExists` to null since it is indeterminate.\n const searchTextExists =\n isApplyingFilter || valueExistsIsLoading ? null : valueExists;\n\n const searchTextFilter = useMemo(\n () =>\n createSearchTextFilter(\n tableUtils,\n columnName,\n appliedSearchText,\n timeZone\n ),\n [appliedSearchText, columnName, tableUtils, timeZone]\n );\n\n // Filter out selected values from the picker\n const excludeSelectedValuesFilter = useMemo(\n () =>\n createSelectedValuesFilter(\n tableUtils,\n columnName,\n new Set(selectedValueMap.keys()),\n false,\n true\n ),\n [columnName, selectedValueMap, tableUtils]\n );\n\n const { data: listTable } = usePromiseFactory(\n tableUtils.createDistinctSortedColumnTable,\n [maybeTable, columnName, 'asc', ...filterConditionFactories]\n );\n\n useTableClose(listTable);\n\n const list = useViewportData<TItem, dh.Table>({\n table: listTable,\n itemHeight,\n viewportSize: VIEWPORT_SIZE,\n viewportPadding: VIEWPORT_PADDING,\n });\n\n const hasSearchTextWithZeroResults =\n searchTextMaybeTrimmed.length > 0 && list.size === 0;\n const searchTextIsInSelectedValues = selectedValueMap.has(\n searchTextMaybeTrimmed as TValue\n );\n\n const onDebouncedSearchTextChange = useDebouncedCallback(\n applySearchText,\n SEARCH_DEBOUNCE_MS\n );\n\n const onSearchTextChange = useCallback(\n (text: string) => {\n setSearchText(text);\n onDebouncedSearchTextChange(text);\n },\n [onDebouncedSearchTextChange]\n );\n\n const setSelectedKeyOnNextFrame = useDebouncedCallback(setSelectedKey, 0);\n\n const onSelectKey = useCallback(\n (key: Key | null) => {\n setSearchText('');\n applySearchText('');\n\n // Set the selection temporarily to avoid the picker staying open\n setSelectedKey(key);\n\n // Clear the selection on next frame since selected items get removed from\n // the list and added to `selectedValues` Map\n setSelectedKeyOnNextFrame(null);\n\n // key will be null in scenarios where search text doesn't match an item\n // and user clicks outside of picker\n if (key == null) {\n return;\n }\n\n const item = list.viewportData.findItem(key);\n\n if (item == null) {\n return;\n }\n\n const value = mapItemToValue(item);\n\n setSelectedValueMap(prev => {\n const next = new Map(prev);\n next.set(value, { value });\n return next;\n });\n },\n [\n applySearchText,\n setSelectedKeyOnNextFrame,\n list.viewportData,\n mapItemToValue,\n ]\n );\n\n const onAddValues = useCallback((values: ReadonlySet<TValue>) => {\n setSelectedValueMap(prev => {\n if (values.size === 0) {\n return prev;\n }\n\n const next = new Map(prev);\n\n // eslint-disable-next-line no-restricted-syntax\n for (const value of values) {\n next.set(value, { value });\n }\n\n return next;\n });\n }, []);\n\n const onRemoveValues = useCallback((values: SelectionT<TValue>) => {\n setSelectedValueMap(prev => {\n if (values === 'all') {\n return new Map();\n }\n\n const next = new Map(prev);\n\n // eslint-disable-next-line no-restricted-syntax\n for (const value of values) {\n next.delete(value);\n }\n\n return next;\n });\n }, []);\n\n const filter = useFilterConditionFactories(\n list.table,\n searchTextFilter,\n excludeSelectedValuesFilter\n );\n\n useViewportFilter(list, filter);\n\n return useMemo(\n () => ({\n list,\n hasSearchTextWithZeroResults,\n searchText,\n searchTextExists,\n searchTextIsInSelectedValues,\n selectedKey,\n selectedValueMap,\n onSearchTextChange,\n onSelectKey,\n onAddValues,\n onRemoveValues,\n }),\n [\n hasSearchTextWithZeroResults,\n list,\n onAddValues,\n onRemoveValues,\n onSearchTextChange,\n onSelectKey,\n searchText,\n searchTextExists,\n searchTextIsInSelectedValues,\n selectedKey,\n selectedValueMap,\n ]\n );\n}\n\nexport default usePickerWithSelectedValues;\n"],"mappings":"AAAA,SAAcA,WAAW,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAE3D,SACEC,sBAAsB,EACtBC,0BAA0B,QAErB,wBAAwB;AAC/B,SACEC,oBAAoB,EACpBC,iBAAiB,EACjBC,iBAAiB,QACZ,wBAAwB;AAC/B,SAASC,kBAAkB,QAAQ,uBAAuB;AAC1D,SAEEC,kBAAkB,EAElBC,gBAAgB,EAChBC,aAAa,QACR,kBAAkB;AAAC,OACnBC,2BAA2B;AAAA,OAC3BC,eAAe;AAAA,OACfC,iBAAiB;AAAA,OACjBC,aAAa;AAAA,OACbC,aAAa;AAgBpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,2BAA2BA,CAAAC,IAAA,EAcU;EAAA,IAdM;IACzDC,UAAU;IACVC,UAAU;IACVC,cAAc;IACdC,wBAAwB,GAAG,EAAE;IAC7BC,cAAc,GAAG,KAAK;IACtBC;EAQF,CAAC,GAAAN,IAAA;EACC,IAAM;IAAEO;EAAW,CAAC,GAAGjB,kBAAkB,CAAC,CAAC;EAE3C,IAAMkB,UAAU,GAAGX,aAAa,CAAC,CAAC;;EAElC;EACA;EACA;EACA;EACA,IAAM,CAACY,UAAU,EAAEC,aAAa,CAAC,GAAG1B,QAAQ,CAAC,EAAE,CAAC;EAChD,IAAM,CAAC2B,iBAAiB,EAAEC,oBAAoB,CAAC,GAAG5B,QAAQ,CAAC,EAAE,CAAC;EAE9D,IAAM6B,eAAe,GAAG/B,WAAW,CAChCgC,IAAY,IAAK;IAChBF,oBAAoB,CAACP,cAAc,GAAGS,IAAI,CAACC,IAAI,CAAC,CAAC,GAAGD,IAAI,CAAC;EAC3D,CAAC,EACD,CAACT,cAAc,CACjB,CAAC;EAED,IAAMW,sBAAsB,GAAGjC,OAAO,CACpC,MAAOsB,cAAc,GAAGI,UAAU,CAACM,IAAI,CAAC,CAAC,GAAGN,UAAW,EACvD,CAACA,UAAU,EAAEJ,cAAc,CAC7B,CAAC;EAED,IAAM,CAACY,WAAW,EAAEC,cAAc,CAAC,GAAGlC,QAAQ,CAAa,IAAI,CAAC;EAChE,IAAM,CAACmC,gBAAgB,EAAEC,mBAAmB,CAAC,GAAGpC,QAAQ,CAEtD,MAAM,IAAIqC,GAAG,CAAC,CAAC,CAAC;EAElB,IAAM;IAAEC,IAAI,EAAEC,WAAW;IAAEC,SAAS,EAAEC;EAAqB,CAAC,GAC1DpC,iBAAiB,CAACmB,UAAU,CAACkB,oBAAoB,EAAE,CACjDzB,UAAU,EACVC,UAAU,EACVS,iBAAiB,EACjB,KAAK,CAAC,sBACP,CAAC;;EAEJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,IAAM;IAAEgB,YAAY,EAAEC;EAAiB,CAAC,GAAGxC,iBAAiB,CAC1DuB,iBAAiB,EACjBpB,kBACF,CAAC;;EAED;EACA;EACA,IAAMsC,gBAAgB,GACpBD,gBAAgB,IAAIH,oBAAoB,GAAG,IAAI,GAAGF,WAAW;EAE/D,IAAMO,gBAAgB,GAAG/C,OAAO,CAC9B,MACEE,sBAAsB,CACpBuB,UAAU,EACVN,UAAU,EACVS,iBAAiB,EACjBL,QACF,CAAC,EACH,CAACK,iBAAiB,EAAET,UAAU,EAAEM,UAAU,EAAEF,QAAQ,CACtD,CAAC;;EAED;EACA,IAAMyB,2BAA2B,GAAGhD,OAAO,CACzC,MACEG,0BAA0B,CACxBsB,UAAU,EACVN,UAAU,EACV,IAAI8B,GAAG,CAACb,gBAAgB,CAACc,IAAI,CAAC,CAAC,CAAC,EAChC,KAAK,EACL,IACF,CAAC,EACH,CAAC/B,UAAU,EAAEiB,gBAAgB,EAAEX,UAAU,CAC3C,CAAC;EAED,IAAM;IAAEc,IAAI,EAAEY;EAAU,CAAC,GAAG7C,iBAAiB,CAC3CmB,UAAU,CAAC2B,+BAA+B,EAC1C,CAAClC,UAAU,EAAEC,UAAU,EAAE,KAAK,EAAE,GAAGE,wBAAwB,CAC7D,CAAC;EAEDN,aAAa,CAACoC,SAAS,CAAC;EAExB,IAAME,IAAI,GAAGzC,eAAe,CAAkB;IAC5C0C,KAAK,EAAEH,SAAS;IAChB3B,UAAU;IACV+B,YAAY,EAAE7C,aAAa;IAC3B8C,eAAe,EAAE/C;EACnB,CAAC,CAAC;EAEF,IAAMgD,4BAA4B,GAChCxB,sBAAsB,CAACyB,MAAM,GAAG,CAAC,IAAIL,IAAI,CAACM,IAAI,KAAK,CAAC;EACtD,IAAMC,4BAA4B,GAAGxB,gBAAgB,CAACyB,GAAG,CACvD5B,sBACF,CAAC;EAED,IAAM6B,2BAA2B,GAAG1D,oBAAoB,CACtD0B,eAAe,EACftB,kBACF,CAAC;EAED,IAAMuD,kBAAkB,GAAGhE,WAAW,CACnCgC,IAAY,IAAK;IAChBJ,aAAa,CAACI,IAAI,CAAC;IACnB+B,2BAA2B,CAAC/B,IAAI,CAAC;EACnC,CAAC,EACD,CAAC+B,2BAA2B,CAC9B,CAAC;EAED,IAAME,yBAAyB,GAAG5D,oBAAoB,CAAC+B,cAAc,EAAE,CAAC,CAAC;EAEzE,IAAM8B,WAAW,GAAGlE,WAAW,CAC5BmE,GAAe,IAAK;IACnBvC,aAAa,CAAC,EAAE,CAAC;IACjBG,eAAe,CAAC,EAAE,CAAC;;IAEnB;IACAK,cAAc,CAAC+B,GAAG,CAAC;;IAEnB;IACA;IACAF,yBAAyB,CAAC,IAAI,CAAC;;IAE/B;IACA;IACA,IAAIE,GAAG,IAAI,IAAI,EAAE;MACf;IACF;IAEA,IAAMC,IAAI,GAAGd,IAAI,CAACe,YAAY,CAACC,QAAQ,CAACH,GAAG,CAAC;IAE5C,IAAIC,IAAI,IAAI,IAAI,EAAE;MAChB;IACF;IAEA,IAAMG,KAAK,GAAGlD,cAAc,CAAC+C,IAAI,CAAC;IAElC9B,mBAAmB,CAACkC,IAAI,IAAI;MAC1B,IAAMC,IAAI,GAAG,IAAIlC,GAAG,CAACiC,IAAI,CAAC;MAC1BC,IAAI,CAACC,GAAG,CAACH,KAAK,EAAE;QAAEA;MAAM,CAAC,CAAC;MAC1B,OAAOE,IAAI;IACb,CAAC,CAAC;EACJ,CAAC,EACD,CACE1C,eAAe,EACfkC,yBAAyB,EACzBX,IAAI,CAACe,YAAY,EACjBhD,cAAc,CAElB,CAAC;EAED,IAAMsD,WAAW,GAAG3E,WAAW,CAAE4E,MAA2B,IAAK;IAC/DtC,mBAAmB,CAACkC,IAAI,IAAI;MAC1B,IAAII,MAAM,CAAChB,IAAI,KAAK,CAAC,EAAE;QACrB,OAAOY,IAAI;MACb;MAEA,IAAMC,IAAI,GAAG,IAAIlC,GAAG,CAACiC,IAAI,CAAC;;MAE1B;MACA,KAAK,IAAMD,KAAK,IAAIK,MAAM,EAAE;QAC1BH,IAAI,CAACC,GAAG,CAACH,KAAK,EAAE;UAAEA;QAAM,CAAC,CAAC;MAC5B;MAEA,OAAOE,IAAI;IACb,CAAC,CAAC;EACJ,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMI,cAAc,GAAG7E,WAAW,CAAE4E,MAA0B,IAAK;IACjEtC,mBAAmB,CAACkC,IAAI,IAAI;MAC1B,IAAII,MAAM,KAAK,KAAK,EAAE;QACpB,OAAO,IAAIrC,GAAG,CAAC,CAAC;MAClB;MAEA,IAAMkC,IAAI,GAAG,IAAIlC,GAAG,CAACiC,IAAI,CAAC;;MAE1B;MACA,KAAK,IAAMD,KAAK,IAAIK,MAAM,EAAE;QAC1BH,IAAI,CAACK,MAAM,CAACP,KAAK,CAAC;MACpB;MAEA,OAAOE,IAAI;IACb,CAAC,CAAC;EACJ,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMM,MAAM,GAAGnE,2BAA2B,CACxC0C,IAAI,CAACC,KAAK,EACVP,gBAAgB,EAChBC,2BACF,CAAC;EAEDnC,iBAAiB,CAACwC,IAAI,EAAEyB,MAAM,CAAC;EAE/B,OAAO9E,OAAO,CACZ,OAAO;IACLqD,IAAI;IACJI,4BAA4B;IAC5B/B,UAAU;IACVoB,gBAAgB;IAChBc,4BAA4B;IAC5B1B,WAAW;IACXE,gBAAgB;IAChB2B,kBAAkB;IAClBE,WAAW;IACXS,WAAW;IACXE;EACF,CAAC,CAAC,EACF,CACEnB,4BAA4B,EAC5BJ,IAAI,EACJqB,WAAW,EACXE,cAAc,EACdb,kBAAkB,EAClBE,WAAW,EACXvC,UAAU,EACVoB,gBAAgB,EAChBc,4BAA4B,EAC5B1B,WAAW,EACXE,gBAAgB,CAEpB,CAAC;AACH;AAEA,eAAepB,2BAA2B"}
@@ -1,16 +1,26 @@
1
1
  import type { dh } from '@deephaven/jsapi-types';
2
2
  import { FilterConditionFactory } from '@deephaven/jsapi-utils';
3
- import { UseViewportDataResult } from './useViewportData';
4
- export interface SearchableViewportData<TData> {
5
- list: UseViewportDataResult<TData, dh.Table>;
3
+ import { UseViewportDataProps, UseViewportDataResult } from './useViewportData';
4
+ export interface UseSearchableViewportDataProps<TData> extends UseViewportDataProps<TData, dh.Table> {
5
+ additionalFilterConditionFactories?: FilterConditionFactory[];
6
+ searchColumnNames: string | string[];
7
+ timeZone: string;
8
+ }
9
+ export interface SearchableViewportData<TData> extends UseViewportDataResult<TData, dh.Table> {
6
10
  onSearchTextChange: (searchText: string) => void;
7
11
  }
8
12
  /**
9
13
  * Use a viewport data list with a search text filter. Supports additional filters.
10
- * @param maybeTable The table to use
14
+ * @param table The table to use
15
+ * @param itemHeight The height of each item
16
+ * @param scrollDebounce The debounce time for scroll events
17
+ * @param viewportSize The size of the viewport
18
+ * @param viewportPadding The padding around the viewport
19
+ * @param deserializeRow The row deserializer
11
20
  * @param searchColumnNames The column names to search
21
+ * @param timeZone Timezone to use for date parsing
12
22
  * @param additionalFilterConditionFactories Additional filter condition factories
13
23
  */
14
- export declare function useSearchableViewportData<TData>(maybeTable: dh.Table | null, searchColumnNames: string | string[], ...additionalFilterConditionFactories: FilterConditionFactory[]): SearchableViewportData<TData>;
24
+ export declare function useSearchableViewportData<TData>({ additionalFilterConditionFactories, searchColumnNames, timeZone, ...props }: UseSearchableViewportDataProps<TData>): SearchableViewportData<TData>;
15
25
  export default useSearchableViewportData;
16
26
  //# sourceMappingURL=useSearchableViewportData.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSearchableViewportData.d.ts","sourceRoot":"","sources":["../src/useSearchableViewportData.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAEL,sBAAsB,EACvB,MAAM,wBAAwB,CAAC;AAShC,OAAwB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAI3E,MAAM,WAAW,sBAAsB,CAAC,KAAK;IAC3C,IAAI,EAAE,qBAAqB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAC7C,kBAAkB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CAClD;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAC7C,UAAU,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,EAC3B,iBAAiB,EAAE,MAAM,GAAG,MAAM,EAAE,EACpC,GAAG,kCAAkC,EAAE,sBAAsB,EAAE,GAC9D,sBAAsB,CAAC,KAAK,CAAC,CAkC/B;AAED,eAAe,yBAAyB,CAAC"}
1
+ {"version":3,"file":"useSearchableViewportData.d.ts","sourceRoot":"","sources":["../src/useSearchableViewportData.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAEL,sBAAsB,EACvB,MAAM,wBAAwB,CAAC;AAShC,OAAwB,EACtB,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,mBAAmB,CAAC;AAI3B,MAAM,WAAW,8BAA8B,CAAC,KAAK,CACnD,SAAQ,oBAAoB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC;IAC7C,kCAAkC,CAAC,EAAE,sBAAsB,EAAE,CAAC;IAC9D,iBAAiB,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB,CAAC,KAAK,CAC3C,SAAQ,qBAAqB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC;IAC9C,kBAAkB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CAClD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,EAC/C,kCAAuC,EACvC,iBAAiB,EACjB,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,8BAA8B,CAAC,KAAK,CAAC,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAwCvE;AAED,eAAe,yBAAyB,CAAC"}
@@ -1,3 +1,11 @@
1
+ var _excluded = ["additionalFilterConditionFactories", "searchColumnNames", "timeZone"];
2
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
3
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
5
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
6
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
7
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
8
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
1
9
  import { useMemo, useState } from 'react';
2
10
  import { createSearchTextFilter } from '@deephaven/jsapi-utils';
3
11
  import { SEARCH_DEBOUNCE_MS, TABLE_ROW_HEIGHT, VIEWPORT_PADDING, VIEWPORT_SIZE } from '@deephaven/utils';
@@ -8,30 +16,37 @@ import useFilterConditionFactories from "./useFilterConditionFactories.js";
8
16
  import useViewportFilter from "./useViewportFilter.js";
9
17
  /**
10
18
  * Use a viewport data list with a search text filter. Supports additional filters.
11
- * @param maybeTable The table to use
19
+ * @param table The table to use
20
+ * @param itemHeight The height of each item
21
+ * @param scrollDebounce The debounce time for scroll events
22
+ * @param viewportSize The size of the viewport
23
+ * @param viewportPadding The padding around the viewport
24
+ * @param deserializeRow The row deserializer
12
25
  * @param searchColumnNames The column names to search
26
+ * @param timeZone Timezone to use for date parsing
13
27
  * @param additionalFilterConditionFactories Additional filter condition factories
14
28
  */
15
- export function useSearchableViewportData(maybeTable, searchColumnNames) {
29
+ export function useSearchableViewportData(_ref) {
30
+ var {
31
+ additionalFilterConditionFactories = [],
32
+ searchColumnNames,
33
+ timeZone
34
+ } = _ref,
35
+ props = _objectWithoutProperties(_ref, _excluded);
16
36
  var tableUtils = useTableUtils();
17
37
  var [searchText, setSearchText] = useState('');
18
- var searchTextFilter = useMemo(() => createSearchTextFilter(tableUtils, searchColumnNames, searchText), [searchColumnNames, searchText, tableUtils]);
38
+ var searchTextFilter = useMemo(() => createSearchTextFilter(tableUtils, searchColumnNames, searchText, timeZone), [searchColumnNames, searchText, tableUtils, timeZone]);
19
39
  var onSearchTextChange = useDebouncedCallback(setSearchText, SEARCH_DEBOUNCE_MS);
20
- var list = useViewportData({
21
- table: maybeTable,
40
+ var list = useViewportData(_objectSpread({
22
41
  itemHeight: TABLE_ROW_HEIGHT,
23
42
  viewportSize: VIEWPORT_SIZE,
24
43
  viewportPadding: VIEWPORT_PADDING
25
- });
26
- for (var _len = arguments.length, additionalFilterConditionFactories = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
27
- additionalFilterConditionFactories[_key - 2] = arguments[_key];
28
- }
44
+ }, props));
29
45
  var filter = useFilterConditionFactories(list.table, searchTextFilter, ...additionalFilterConditionFactories);
30
46
  useViewportFilter(list, filter);
31
- return {
32
- list,
47
+ return _objectSpread(_objectSpread({}, list), {}, {
33
48
  onSearchTextChange
34
- };
49
+ });
35
50
  }
36
51
  export default useSearchableViewportData;
37
52
  //# sourceMappingURL=useSearchableViewportData.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSearchableViewportData.js","names":["useMemo","useState","createSearchTextFilter","SEARCH_DEBOUNCE_MS","TABLE_ROW_HEIGHT","VIEWPORT_PADDING","VIEWPORT_SIZE","useDebouncedCallback","useTableUtils","useViewportData","useFilterConditionFactories","useViewportFilter","useSearchableViewportData","maybeTable","searchColumnNames","tableUtils","searchText","setSearchText","searchTextFilter","onSearchTextChange","list","table","itemHeight","viewportSize","viewportPadding","_len","arguments","length","additionalFilterConditionFactories","Array","_key","filter"],"sources":["../src/useSearchableViewportData.ts"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport {\n createSearchTextFilter,\n FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport {\n SEARCH_DEBOUNCE_MS,\n TABLE_ROW_HEIGHT,\n VIEWPORT_PADDING,\n VIEWPORT_SIZE,\n} from '@deephaven/utils';\nimport { useDebouncedCallback } from '@deephaven/react-hooks';\nimport { useTableUtils } from './useTableUtils';\nimport useViewportData, { UseViewportDataResult } from './useViewportData';\nimport useFilterConditionFactories from './useFilterConditionFactories';\nimport useViewportFilter from './useViewportFilter';\n\nexport interface SearchableViewportData<TData> {\n list: UseViewportDataResult<TData, dh.Table>;\n onSearchTextChange: (searchText: string) => void;\n}\n\n/**\n * Use a viewport data list with a search text filter. Supports additional filters.\n * @param maybeTable The table to use\n * @param searchColumnNames The column names to search\n * @param additionalFilterConditionFactories Additional filter condition factories\n */\nexport function useSearchableViewportData<TData>(\n maybeTable: dh.Table | null,\n searchColumnNames: string | string[],\n ...additionalFilterConditionFactories: FilterConditionFactory[]\n): SearchableViewportData<TData> {\n const tableUtils = useTableUtils();\n\n const [searchText, setSearchText] = useState<string>('');\n\n const searchTextFilter = useMemo(\n () => createSearchTextFilter(tableUtils, searchColumnNames, searchText),\n [searchColumnNames, searchText, tableUtils]\n );\n\n const onSearchTextChange = useDebouncedCallback(\n setSearchText,\n SEARCH_DEBOUNCE_MS\n );\n\n const list = useViewportData<TData, dh.Table>({\n table: maybeTable,\n itemHeight: TABLE_ROW_HEIGHT,\n viewportSize: VIEWPORT_SIZE,\n viewportPadding: VIEWPORT_PADDING,\n });\n\n const filter = useFilterConditionFactories(\n list.table,\n searchTextFilter,\n ...additionalFilterConditionFactories\n );\n\n useViewportFilter(list, filter);\n\n return {\n list,\n onSearchTextChange,\n };\n}\n\nexport default useSearchableViewportData;\n"],"mappings":"AAAA,SAASA,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAEzC,SACEC,sBAAsB,QAEjB,wBAAwB;AAC/B,SACEC,kBAAkB,EAClBC,gBAAgB,EAChBC,gBAAgB,EAChBC,aAAa,QACR,kBAAkB;AACzB,SAASC,oBAAoB,QAAQ,wBAAwB;AAAC,SACrDC,aAAa;AAAA,OACfC,eAAe;AAAA,OACfC,2BAA2B;AAAA,OAC3BC,iBAAiB;AAOxB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,yBAAyBA,CACvCC,UAA2B,EAC3BC,iBAAoC,EAEL;EAC/B,IAAMC,UAAU,GAAGP,aAAa,CAAC,CAAC;EAElC,IAAM,CAACQ,UAAU,EAAEC,aAAa,CAAC,GAAGhB,QAAQ,CAAS,EAAE,CAAC;EAExD,IAAMiB,gBAAgB,GAAGlB,OAAO,CAC9B,MAAME,sBAAsB,CAACa,UAAU,EAAED,iBAAiB,EAAEE,UAAU,CAAC,EACvE,CAACF,iBAAiB,EAAEE,UAAU,EAAED,UAAU,CAC5C,CAAC;EAED,IAAMI,kBAAkB,GAAGZ,oBAAoB,CAC7CU,aAAa,EACbd,kBACF,CAAC;EAED,IAAMiB,IAAI,GAAGX,eAAe,CAAkB;IAC5CY,KAAK,EAAER,UAAU;IACjBS,UAAU,EAAElB,gBAAgB;IAC5BmB,YAAY,EAAEjB,aAAa;IAC3BkB,eAAe,EAAEnB;EACnB,CAAC,CAAC;EAAC,SAAAoB,IAAA,GAAAC,SAAA,CAAAC,MAAA,EArBAC,kCAAkC,OAAAC,KAAA,CAAAJ,IAAA,OAAAA,IAAA,WAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;IAAlCF,kCAAkC,CAAAE,IAAA,QAAAJ,SAAA,CAAAI,IAAA;EAAA;EAuBrC,IAAMC,MAAM,GAAGrB,2BAA2B,CACxCU,IAAI,CAACC,KAAK,EACVH,gBAAgB,EAChB,GAAGU,kCACL,CAAC;EAEDjB,iBAAiB,CAACS,IAAI,EAAEW,MAAM,CAAC;EAE/B,OAAO;IACLX,IAAI;IACJD;EACF,CAAC;AACH;AAEA,eAAeP,yBAAyB"}
1
+ {"version":3,"file":"useSearchableViewportData.js","names":["useMemo","useState","createSearchTextFilter","SEARCH_DEBOUNCE_MS","TABLE_ROW_HEIGHT","VIEWPORT_PADDING","VIEWPORT_SIZE","useDebouncedCallback","useTableUtils","useViewportData","useFilterConditionFactories","useViewportFilter","useSearchableViewportData","_ref","additionalFilterConditionFactories","searchColumnNames","timeZone","props","_objectWithoutProperties","_excluded","tableUtils","searchText","setSearchText","searchTextFilter","onSearchTextChange","list","_objectSpread","itemHeight","viewportSize","viewportPadding","filter","table"],"sources":["../src/useSearchableViewportData.ts"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport {\n createSearchTextFilter,\n FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport {\n SEARCH_DEBOUNCE_MS,\n TABLE_ROW_HEIGHT,\n VIEWPORT_PADDING,\n VIEWPORT_SIZE,\n} from '@deephaven/utils';\nimport { useDebouncedCallback } from '@deephaven/react-hooks';\nimport { useTableUtils } from './useTableUtils';\nimport useViewportData, {\n UseViewportDataProps,\n UseViewportDataResult,\n} from './useViewportData';\nimport useFilterConditionFactories from './useFilterConditionFactories';\nimport useViewportFilter from './useViewportFilter';\n\nexport interface UseSearchableViewportDataProps<TData>\n extends UseViewportDataProps<TData, dh.Table> {\n additionalFilterConditionFactories?: FilterConditionFactory[];\n searchColumnNames: string | string[];\n timeZone: string;\n}\n\nexport interface SearchableViewportData<TData>\n extends UseViewportDataResult<TData, dh.Table> {\n onSearchTextChange: (searchText: string) => void;\n}\n\n/**\n * Use a viewport data list with a search text filter. Supports additional filters.\n * @param table The table to use\n * @param itemHeight The height of each item\n * @param scrollDebounce The debounce time for scroll events\n * @param viewportSize The size of the viewport\n * @param viewportPadding The padding around the viewport\n * @param deserializeRow The row deserializer\n * @param searchColumnNames The column names to search\n * @param timeZone Timezone to use for date parsing\n * @param additionalFilterConditionFactories Additional filter condition factories\n */\nexport function useSearchableViewportData<TData>({\n additionalFilterConditionFactories = [],\n searchColumnNames,\n timeZone,\n ...props\n}: UseSearchableViewportDataProps<TData>): SearchableViewportData<TData> {\n const tableUtils = useTableUtils();\n\n const [searchText, setSearchText] = useState<string>('');\n\n const searchTextFilter = useMemo(\n () =>\n createSearchTextFilter(\n tableUtils,\n searchColumnNames,\n searchText,\n timeZone\n ),\n [searchColumnNames, searchText, tableUtils, timeZone]\n );\n\n const onSearchTextChange = useDebouncedCallback(\n setSearchText,\n SEARCH_DEBOUNCE_MS\n );\n\n const list = useViewportData<TData, dh.Table>({\n itemHeight: TABLE_ROW_HEIGHT,\n viewportSize: VIEWPORT_SIZE,\n viewportPadding: VIEWPORT_PADDING,\n ...props,\n });\n\n const filter = useFilterConditionFactories(\n list.table,\n searchTextFilter,\n ...additionalFilterConditionFactories\n );\n\n useViewportFilter(list, filter);\n\n return {\n ...list,\n onSearchTextChange,\n };\n}\n\nexport default useSearchableViewportData;\n"],"mappings":";;;;;;;;AAAA,SAASA,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAEzC,SACEC,sBAAsB,QAEjB,wBAAwB;AAC/B,SACEC,kBAAkB,EAClBC,gBAAgB,EAChBC,gBAAgB,EAChBC,aAAa,QACR,kBAAkB;AACzB,SAASC,oBAAoB,QAAQ,wBAAwB;AAAC,SACrDC,aAAa;AAAA,OACfC,eAAe;AAAA,OAIfC,2BAA2B;AAAA,OAC3BC,iBAAiB;AAcxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,yBAAyBA,CAAAC,IAAA,EAKgC;EAAA,IALxB;MAC/CC,kCAAkC,GAAG,EAAE;MACvCC,iBAAiB;MACjBC;IAEqC,CAAC,GAAAH,IAAA;IADnCI,KAAK,GAAAC,wBAAA,CAAAL,IAAA,EAAAM,SAAA;EAER,IAAMC,UAAU,GAAGZ,aAAa,CAAC,CAAC;EAElC,IAAM,CAACa,UAAU,EAAEC,aAAa,CAAC,GAAGrB,QAAQ,CAAS,EAAE,CAAC;EAExD,IAAMsB,gBAAgB,GAAGvB,OAAO,CAC9B,MACEE,sBAAsB,CACpBkB,UAAU,EACVL,iBAAiB,EACjBM,UAAU,EACVL,QACF,CAAC,EACH,CAACD,iBAAiB,EAAEM,UAAU,EAAED,UAAU,EAAEJ,QAAQ,CACtD,CAAC;EAED,IAAMQ,kBAAkB,GAAGjB,oBAAoB,CAC7Ce,aAAa,EACbnB,kBACF,CAAC;EAED,IAAMsB,IAAI,GAAGhB,eAAe,CAAAiB,aAAA;IAC1BC,UAAU,EAAEvB,gBAAgB;IAC5BwB,YAAY,EAAEtB,aAAa;IAC3BuB,eAAe,EAAExB;EAAgB,GAC9BY,KAAK,CACT,CAAC;EAEF,IAAMa,MAAM,GAAGpB,2BAA2B,CACxCe,IAAI,CAACM,KAAK,EACVR,gBAAgB,EAChB,GAAGT,kCACL,CAAC;EAEDH,iBAAiB,CAACc,IAAI,EAAEK,MAAM,CAAC;EAE/B,OAAAJ,aAAA,CAAAA,aAAA,KACKD,IAAI;IACPD;EAAkB;AAEtB;AAEA,eAAeZ,yBAAyB"}
@@ -7,8 +7,8 @@ export interface UseViewportDataProps<TItem, TTable extends dh.Table | dh.TreeTa
7
7
  table: TTable | null;
8
8
  itemHeight?: number;
9
9
  scrollDebounce?: number;
10
- viewportSize?: number;
11
10
  viewportPadding?: number;
11
+ viewportSize?: number;
12
12
  deserializeRow?: RowDeserializer<TItem>;
13
13
  }
14
14
  export interface UseViewportDataResult<TItem, TTable extends dh.Table | dh.TreeTable> {
@@ -1 +1 @@
1
- {"version":3,"file":"useViewportData.d.ts","sourceRoot":"","sources":["../src/useViewportData.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EACL,eAAe,EAKhB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAEL,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,SAAS,EAAsB,MAAM,kBAAkB,CAAC;AAQjE,MAAM,WAAW,oBAAoB,CACnC,KAAK,EACL,MAAM,SAAS,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS;IAEtC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,qBAAqB,CACpC,KAAK,EACL,MAAM,SAAS,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS;IAEtC,gEAAgE;IAChE,YAAY,EAAE,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACjD,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IAEb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,0CAA0C;IAC1C,sBAAsB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,eAAe,EAAE,KAAK,IAAI,CAAC;IAChE,oCAAoC;IACpC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,mDAAmD;IACnD,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,SAAS,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,EAAE,EAC7E,KAAK,EACL,UAAc,EACd,cAAmC,EACnC,YAAiB,EACjB,eAAoB,EACpB,cAAuC,EACvC,uBAA+B,GAChC,EAAE,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,CAwF5E;AAED,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"useViewportData.d.ts","sourceRoot":"","sources":["../src/useViewportData.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EACL,eAAe,EAKhB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAEL,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,SAAS,EAAsB,MAAM,kBAAkB,CAAC;AAQjE,MAAM,WAAW,oBAAoB,CACnC,KAAK,EACL,MAAM,SAAS,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS;IAEtC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,qBAAqB,CACpC,KAAK,EACL,MAAM,SAAS,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS;IAEtC,gEAAgE;IAChE,YAAY,EAAE,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACjD,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IAEb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,0CAA0C;IAC1C,sBAAsB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,eAAe,EAAE,KAAK,IAAI,CAAC;IAChE,oCAAoC;IACpC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,mDAAmD;IACnD,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,SAAS,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,EAAE,EAC7E,KAAK,EACL,UAAc,EACd,cAAmC,EACnC,YAAiB,EACjB,eAAoB,EACpB,cAAuC,EACvC,uBAA+B,GAChC,EAAE,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,CAwF5E;AAED,eAAe,eAAe,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useViewportData.js","names":["useCallback","useEffect","useMemo","useRef","defaultRowDeserializer","isClosed","createOnTableUpdatedHandler","Log","useApi","useOnScrollOffsetChangeCallback","SCROLL_DEBOUNCE_MS","useInitializeViewportData","useSetPaddedViewportCallback","useTableSize","useTableListener","log","module","useViewportData","_ref","table","itemHeight","scrollDebounce","viewportSize","viewportPadding","deserializeRow","reuseItemsOnTableResize","currentViewportFirstRowRef","viewportData","setPaddedViewport","setViewport","firstRow","current","debug","applyFiltersAndRefresh","filters","applyFilter","dh","onTableUpdatedRef","onTableUpdated","event","_onTableUpdatedRef$cu","call","Table","EVENT_UPDATED","size","onScroll"],"sources":["../src/useViewportData.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport {\n RowDeserializer,\n defaultRowDeserializer,\n isClosed,\n createOnTableUpdatedHandler,\n OnTableUpdatedEvent,\n} from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport {\n useOnScrollOffsetChangeCallback,\n WindowedListData,\n} from '@deephaven/react-hooks';\nimport { KeyedItem, SCROLL_DEBOUNCE_MS } from '@deephaven/utils';\nimport useInitializeViewportData from './useInitializeViewportData';\nimport useSetPaddedViewportCallback from './useSetPaddedViewportCallback';\nimport useTableSize from './useTableSize';\nimport useTableListener from './useTableListener';\n\nconst log = Log.module('useViewportData');\n\nexport interface UseViewportDataProps<\n TItem,\n TTable extends dh.Table | dh.TreeTable,\n> {\n reuseItemsOnTableResize?: boolean;\n table: TTable | null;\n itemHeight?: number;\n scrollDebounce?: number;\n viewportSize?: number;\n viewportPadding?: number;\n deserializeRow?: RowDeserializer<TItem>;\n}\n\nexport interface UseViewportDataResult<\n TItem,\n TTable extends dh.Table | dh.TreeTable,\n> {\n /** Manages deserialized row items associated with a DH Table */\n viewportData: WindowedListData<KeyedItem<TItem>>;\n /** Size of the underlying Table */\n size: number;\n\n table: TTable | null;\n /** Apply filters and refresh viewport. */\n applyFiltersAndRefresh: (filters: dh.FilterCondition[]) => void;\n /** Set the viewport of the Table */\n setViewport: (firstRow: number) => void;\n /** Handler for scroll events to update viewport */\n onScroll: (event: Event) => void;\n}\n\n/**\n * Sets up state management for windowed Table viewports. Returns a ListData\n * instance for managing items associated with the Table + a `setViewport`\n * callback for changing the current viewport.\n *\n * IMPORTANT: this will create an empty KeyedItem object for every row in the\n * source table. This is intended for \"human\" sized tables such as those used in\n * admin panels. This is not suitable for \"machine\" scale with millions+ rows.\n * @param table The Table to viewport.\n * @param itemHeight The height of each item in the viewport.\n * @param scrollDebounce The number of milliseconds to debounce scroll events.\n * @param viewportSize The number of items to display in the viewport.\n * @param viewportPadding The number of items to fetch at start and end of the viewport.\n * @param deserializeRow A function to deserialize a row from the Table.\n * @param reuseItemsOnTableResize If true, existing items will be re-used when\n * the table size changes.\n * @returns An object for managing Table viewport state.\n */\nexport function useViewportData<TItem, TTable extends dh.Table | dh.TreeTable>({\n table,\n itemHeight = 1,\n scrollDebounce = SCROLL_DEBOUNCE_MS,\n viewportSize = 10,\n viewportPadding = 50,\n deserializeRow = defaultRowDeserializer,\n reuseItemsOnTableResize = false,\n}: UseViewportDataProps<TItem, TTable>): UseViewportDataResult<TItem, TTable> {\n const currentViewportFirstRowRef = useRef<number>(0);\n\n const viewportData = useInitializeViewportData<TItem>(\n table,\n reuseItemsOnTableResize\n );\n\n const setPaddedViewport = useSetPaddedViewportCallback(\n table,\n viewportSize,\n viewportPadding\n );\n\n const setViewport = useCallback(\n (firstRow: number) => {\n currentViewportFirstRowRef.current = firstRow;\n\n if (table && !isClosed(table)) {\n setPaddedViewport(firstRow);\n } else {\n log.debug('setViewport called on closed table.', table);\n }\n },\n [table, setPaddedViewport]\n );\n\n const applyFiltersAndRefresh = useCallback(\n (filters: dh.FilterCondition[]) => {\n if (table && !isClosed(table)) {\n table.applyFilter(filters);\n setViewport(0);\n } else {\n log.debug('applyFiltersAndRefresh called on closed table.', table);\n }\n },\n [setViewport, table]\n );\n\n const dh = useApi();\n\n // Store the memoized callback in a ref so that changes to `viewportData`\n // don't invalidate the memoization of `onTableUpdated`. This prevents\n // `useTableListener` from unnecessarily re-subscribing to the same event over\n // and over.\n const onTableUpdatedRef = useRef<(event: OnTableUpdatedEvent) => void>();\n onTableUpdatedRef.current = useMemo(\n () => createOnTableUpdatedHandler(viewportData, deserializeRow),\n [deserializeRow, viewportData]\n );\n\n const onTableUpdated = useCallback((event: OnTableUpdatedEvent) => {\n onTableUpdatedRef.current?.(event);\n }, []);\n\n useTableListener(table, dh.Table.EVENT_UPDATED, onTableUpdated);\n\n const size = useTableSize(table);\n\n useEffect(() => {\n log.debug('Initializing viewport');\n\n // Hydrate the viewport with real data. This will fetch data from index\n // 0 to the end of the viewport + padding.\n setViewport(0);\n }, [table, setViewport]);\n\n useEffect(() => {\n setViewport(currentViewportFirstRowRef.current);\n }, [setViewport, size]);\n\n const onScroll = useOnScrollOffsetChangeCallback(\n itemHeight,\n setViewport,\n scrollDebounce\n );\n\n return useMemo(\n () => ({\n viewportData,\n size,\n table,\n applyFiltersAndRefresh,\n setViewport,\n onScroll,\n }),\n [applyFiltersAndRefresh, onScroll, setViewport, size, table, viewportData]\n );\n}\n\nexport default useViewportData;\n"],"mappings":"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"}
1
+ {"version":3,"file":"useViewportData.js","names":["useCallback","useEffect","useMemo","useRef","defaultRowDeserializer","isClosed","createOnTableUpdatedHandler","Log","useApi","useOnScrollOffsetChangeCallback","SCROLL_DEBOUNCE_MS","useInitializeViewportData","useSetPaddedViewportCallback","useTableSize","useTableListener","log","module","useViewportData","_ref","table","itemHeight","scrollDebounce","viewportSize","viewportPadding","deserializeRow","reuseItemsOnTableResize","currentViewportFirstRowRef","viewportData","setPaddedViewport","setViewport","firstRow","current","debug","applyFiltersAndRefresh","filters","applyFilter","dh","onTableUpdatedRef","onTableUpdated","event","_onTableUpdatedRef$cu","call","Table","EVENT_UPDATED","size","onScroll"],"sources":["../src/useViewportData.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport {\n RowDeserializer,\n defaultRowDeserializer,\n isClosed,\n createOnTableUpdatedHandler,\n OnTableUpdatedEvent,\n} from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport {\n useOnScrollOffsetChangeCallback,\n WindowedListData,\n} from '@deephaven/react-hooks';\nimport { KeyedItem, SCROLL_DEBOUNCE_MS } from '@deephaven/utils';\nimport useInitializeViewportData from './useInitializeViewportData';\nimport useSetPaddedViewportCallback from './useSetPaddedViewportCallback';\nimport useTableSize from './useTableSize';\nimport useTableListener from './useTableListener';\n\nconst log = Log.module('useViewportData');\n\nexport interface UseViewportDataProps<\n TItem,\n TTable extends dh.Table | dh.TreeTable,\n> {\n reuseItemsOnTableResize?: boolean;\n table: TTable | null;\n itemHeight?: number;\n scrollDebounce?: number;\n viewportPadding?: number;\n viewportSize?: number;\n deserializeRow?: RowDeserializer<TItem>;\n}\n\nexport interface UseViewportDataResult<\n TItem,\n TTable extends dh.Table | dh.TreeTable,\n> {\n /** Manages deserialized row items associated with a DH Table */\n viewportData: WindowedListData<KeyedItem<TItem>>;\n /** Size of the underlying Table */\n size: number;\n\n table: TTable | null;\n /** Apply filters and refresh viewport. */\n applyFiltersAndRefresh: (filters: dh.FilterCondition[]) => void;\n /** Set the viewport of the Table */\n setViewport: (firstRow: number) => void;\n /** Handler for scroll events to update viewport */\n onScroll: (event: Event) => void;\n}\n\n/**\n * Sets up state management for windowed Table viewports. Returns a ListData\n * instance for managing items associated with the Table + a `setViewport`\n * callback for changing the current viewport.\n *\n * IMPORTANT: this will create an empty KeyedItem object for every row in the\n * source table. This is intended for \"human\" sized tables such as those used in\n * admin panels. This is not suitable for \"machine\" scale with millions+ rows.\n * @param table The Table to viewport.\n * @param itemHeight The height of each item in the viewport.\n * @param scrollDebounce The number of milliseconds to debounce scroll events.\n * @param viewportSize The number of items to display in the viewport.\n * @param viewportPadding The number of items to fetch at start and end of the viewport.\n * @param deserializeRow A function to deserialize a row from the Table.\n * @param reuseItemsOnTableResize If true, existing items will be re-used when\n * the table size changes.\n * @returns An object for managing Table viewport state.\n */\nexport function useViewportData<TItem, TTable extends dh.Table | dh.TreeTable>({\n table,\n itemHeight = 1,\n scrollDebounce = SCROLL_DEBOUNCE_MS,\n viewportSize = 10,\n viewportPadding = 50,\n deserializeRow = defaultRowDeserializer,\n reuseItemsOnTableResize = false,\n}: UseViewportDataProps<TItem, TTable>): UseViewportDataResult<TItem, TTable> {\n const currentViewportFirstRowRef = useRef<number>(0);\n\n const viewportData = useInitializeViewportData<TItem>(\n table,\n reuseItemsOnTableResize\n );\n\n const setPaddedViewport = useSetPaddedViewportCallback(\n table,\n viewportSize,\n viewportPadding\n );\n\n const setViewport = useCallback(\n (firstRow: number) => {\n currentViewportFirstRowRef.current = firstRow;\n\n if (table && !isClosed(table)) {\n setPaddedViewport(firstRow);\n } else {\n log.debug('setViewport called on closed table.', table);\n }\n },\n [table, setPaddedViewport]\n );\n\n const applyFiltersAndRefresh = useCallback(\n (filters: dh.FilterCondition[]) => {\n if (table && !isClosed(table)) {\n table.applyFilter(filters);\n setViewport(0);\n } else {\n log.debug('applyFiltersAndRefresh called on closed table.', table);\n }\n },\n [setViewport, table]\n );\n\n const dh = useApi();\n\n // Store the memoized callback in a ref so that changes to `viewportData`\n // don't invalidate the memoization of `onTableUpdated`. This prevents\n // `useTableListener` from unnecessarily re-subscribing to the same event over\n // and over.\n const onTableUpdatedRef = useRef<(event: OnTableUpdatedEvent) => void>();\n onTableUpdatedRef.current = useMemo(\n () => createOnTableUpdatedHandler(viewportData, deserializeRow),\n [deserializeRow, viewportData]\n );\n\n const onTableUpdated = useCallback((event: OnTableUpdatedEvent) => {\n onTableUpdatedRef.current?.(event);\n }, []);\n\n useTableListener(table, dh.Table.EVENT_UPDATED, onTableUpdated);\n\n const size = useTableSize(table);\n\n useEffect(() => {\n log.debug('Initializing viewport');\n\n // Hydrate the viewport with real data. This will fetch data from index\n // 0 to the end of the viewport + padding.\n setViewport(0);\n }, [table, setViewport]);\n\n useEffect(() => {\n setViewport(currentViewportFirstRowRef.current);\n }, [setViewport, size]);\n\n const onScroll = useOnScrollOffsetChangeCallback(\n itemHeight,\n setViewport,\n scrollDebounce\n );\n\n return useMemo(\n () => ({\n viewportData,\n size,\n table,\n applyFiltersAndRefresh,\n setViewport,\n onScroll,\n }),\n [applyFiltersAndRefresh, onScroll, setViewport, size, table, viewportData]\n );\n}\n\nexport default useViewportData;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/jsapi-components",
3
- "version": "0.82.1-alpha-combobox.11+03a2fabd",
3
+ "version": "0.82.1-alpha-combobox.25+e396bd7b",
4
4
  "description": "Deephaven JSAPI Components",
5
5
  "author": "Deephaven Data Labs LLC",
6
6
  "license": "Apache-2.0",
@@ -22,13 +22,13 @@
22
22
  "build:sass": "sass --embed-sources --load-path=../../node_modules ./src:./dist"
23
23
  },
24
24
  "dependencies": {
25
- "@deephaven/components": "^0.82.1-alpha-combobox.11+03a2fabd",
26
- "@deephaven/jsapi-bootstrap": "^0.82.1-alpha-combobox.11+03a2fabd",
25
+ "@deephaven/components": "^0.82.1-alpha-combobox.25+e396bd7b",
26
+ "@deephaven/jsapi-bootstrap": "^0.82.1-alpha-combobox.25+e396bd7b",
27
27
  "@deephaven/jsapi-types": "1.0.0-dev0.34.0",
28
- "@deephaven/jsapi-utils": "^0.82.1-alpha-combobox.11+03a2fabd",
29
- "@deephaven/log": "^0.82.1-alpha-combobox.11+03a2fabd",
30
- "@deephaven/react-hooks": "^0.82.1-alpha-combobox.11+03a2fabd",
31
- "@deephaven/utils": "^0.82.1-alpha-combobox.11+03a2fabd",
28
+ "@deephaven/jsapi-utils": "^0.82.1-alpha-combobox.25+e396bd7b",
29
+ "@deephaven/log": "^0.82.1-alpha-combobox.25+e396bd7b",
30
+ "@deephaven/react-hooks": "^0.82.1-alpha-combobox.25+e396bd7b",
31
+ "@deephaven/utils": "^0.82.1-alpha-combobox.25+e396bd7b",
32
32
  "@types/js-cookie": "^3.0.3",
33
33
  "classnames": "^2.3.2",
34
34
  "js-cookie": "^3.0.5",
@@ -36,7 +36,7 @@
36
36
  "prop-types": "^15.8.1"
37
37
  },
38
38
  "devDependencies": {
39
- "@deephaven/jsapi-shim": "^0.82.1-alpha-combobox.11+03a2fabd",
39
+ "@deephaven/jsapi-shim": "^0.82.1-alpha-combobox.25+e396bd7b",
40
40
  "react-test-renderer": "^17.0.2"
41
41
  },
42
42
  "peerDependencies": {
@@ -51,5 +51,5 @@
51
51
  "publishConfig": {
52
52
  "access": "public"
53
53
  },
54
- "gitHead": "03a2fabd0922d26d53612fb49c26ae05de268624"
54
+ "gitHead": "e396bd7b6f59f2e19bf45addd990eb3a6d2057d0"
55
55
  }