@deephaven/jsapi-components 1.22.1 → 1.22.2-alpha-pivot-builder.0730ba6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/HookTestUtils.js +1 -3
  2. package/dist/HookTestUtils.js.map +1 -1
  3. package/dist/TableDropdown.js +23 -15
  4. package/dist/TableDropdown.js.map +1 -1
  5. package/dist/TableInput.js +71 -55
  6. package/dist/TableInput.js.map +1 -1
  7. package/dist/spectrum/ComboBox.js +2 -4
  8. package/dist/spectrum/ComboBox.js.map +1 -1
  9. package/dist/spectrum/ListView.js +17 -22
  10. package/dist/spectrum/ListView.js.map +1 -1
  11. package/dist/spectrum/MultiSelect.js +3 -5
  12. package/dist/spectrum/MultiSelect.js.map +1 -1
  13. package/dist/spectrum/utils/useItemRowDeserializer.js +7 -8
  14. package/dist/spectrum/utils/useItemRowDeserializer.js.map +1 -1
  15. package/dist/spectrum/utils/useMultiPickerProps.js +39 -33
  16. package/dist/spectrum/utils/useMultiPickerProps.js.map +1 -1
  17. package/dist/spectrum/utils/usePickerProps.js +36 -33
  18. package/dist/spectrum/utils/usePickerProps.js.map +1 -1
  19. package/dist/useBroadcastChannel.js +1 -3
  20. package/dist/useBroadcastChannel.js.map +1 -1
  21. package/dist/useCheckIfExistsValue.js +15 -8
  22. package/dist/useCheckIfExistsValue.js.map +1 -1
  23. package/dist/useDebouncedViewportSearch.js +2 -4
  24. package/dist/useDebouncedViewportSearch.js.map +1 -1
  25. package/dist/useDebouncedViewportSelectionFilter.js +6 -9
  26. package/dist/useDebouncedViewportSelectionFilter.js.map +1 -1
  27. package/dist/useFormatter.js +4 -6
  28. package/dist/useFormatter.js.map +1 -1
  29. package/dist/useGetItemIndexByValue.js +3 -5
  30. package/dist/useGetItemIndexByValue.js.map +1 -1
  31. package/dist/useGetItemPosition.js +7 -8
  32. package/dist/useGetItemPosition.js.map +1 -1
  33. package/dist/useInitializeViewportData.js +3 -5
  34. package/dist/useInitializeViewportData.js.map +1 -1
  35. package/dist/usePickerWithSelectedValues.js +39 -25
  36. package/dist/usePickerWithSelectedValues.js.map +1 -1
  37. package/dist/useSearchableViewportData.js +14 -6
  38. package/dist/useSearchableViewportData.js.map +1 -1
  39. package/dist/useSelectDistinctTable.js +5 -6
  40. package/dist/useSelectDistinctTable.js.map +1 -1
  41. package/dist/useSetPaddedViewportCallback.js +10 -1
  42. package/dist/useSetPaddedViewportCallback.js.map +1 -1
  43. package/dist/useTable.js +23 -7
  44. package/dist/useTable.js.map +1 -1
  45. package/dist/useTableColumn.js +6 -5
  46. package/dist/useTableColumn.js.map +1 -1
  47. package/dist/useTableSize.js +9 -1
  48. package/dist/useTableSize.js.map +1 -1
  49. package/dist/useViewportData.js +15 -10
  50. package/dist/useViewportData.js.map +1 -1
  51. package/dist/useViewportFilter.js +1 -3
  52. package/dist/useViewportFilter.js.map +1 -1
  53. package/package.json +10 -10
@@ -6,6 +6,12 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
6
6
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
7
  function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
8
8
  function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
9
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
10
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
11
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
12
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
13
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
14
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
9
15
  function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
10
16
  function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
11
17
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
@@ -34,28 +40,23 @@ var log = Log.module('jsapi-components.useMultiPickerProps');
34
40
 
35
41
  export function useMultiPickerProps(_ref) {
36
42
  var _props$selectedKeys;
37
- var {
38
- table: tableSource,
39
- keyColumn: keyColumnName,
40
- labelColumn: labelColumnName,
41
- iconColumn: iconColumnName,
42
- settings,
43
- onChange,
44
- onSelectionChange
45
- } = _ref,
43
+ var tableSource = _ref.table,
44
+ keyColumnName = _ref.keyColumn,
45
+ labelColumnName = _ref.labelColumn,
46
+ iconColumnName = _ref.iconColumn,
47
+ settings = _ref.settings,
48
+ onChange = _ref.onChange,
49
+ onSelectionChange = _ref.onSelectionChange,
46
50
  props = _objectWithoutProperties(_ref, _excluded);
47
- var {
48
- itemHeight
49
- } = usePickerItemScale();
50
- var {
51
- getFormattedString: formatValue,
52
- timeZone
53
- } = useFormatter(settings);
51
+ var _usePickerItemScale = usePickerItemScale(),
52
+ itemHeight = _usePickerItemScale.itemHeight;
53
+ var _useFormatter = useFormatter(settings),
54
+ formatValue = _useFormatter.getFormattedString,
55
+ timeZone = _useFormatter.timeZone;
54
56
 
55
57
  // Copy table so we can apply filters without affecting the original table.
56
- var {
57
- data: tableCopy
58
- } = usePromiseFactory(TableUtils.copyTableAndApplyFilters, [tableSource]);
58
+ var _usePromiseFactory = usePromiseFactory(TableUtils.copyTableAndApplyFilters, [tableSource]),
59
+ tableCopy = _usePromiseFactory.data;
59
60
  useWidgetClose(tableCopy);
60
61
  var keyColumn = useMemo(() => tableCopy == null ? null : getItemKeyColumn(tableCopy, keyColumnName), [keyColumnName, tableCopy]);
61
62
  var labelColumn = useMemo(() => tableCopy == null || keyColumn == null ? null : getItemLabelColumn(tableCopy, keyColumn, labelColumnName), [keyColumn, labelColumnName, tableCopy]);
@@ -67,18 +68,17 @@ export function useMultiPickerProps(_ref) {
67
68
  labelColumnName,
68
69
  formatValue
69
70
  });
70
- var {
71
- onScroll,
72
- onSearchTextChange,
73
- viewportData
74
- } = useSearchableViewportData({
75
- reuseItemsOnTableResize: true,
76
- table: tableCopy,
77
- itemHeight,
78
- deserializeRow,
79
- searchColumnNames,
80
- timeZone
81
- });
71
+ var _useSearchableViewpor = useSearchableViewportData({
72
+ reuseItemsOnTableResize: true,
73
+ table: tableCopy,
74
+ itemHeight,
75
+ deserializeRow,
76
+ searchColumnNames,
77
+ timeZone
78
+ }),
79
+ onScroll = _useSearchableViewpor.onScroll,
80
+ onSearchTextChange = _useSearchableViewpor.onSearchTextChange,
81
+ viewportData = _useSearchableViewpor.viewportData;
82
82
  var dh = useApi();
83
83
  var tableUtils = useTableUtils();
84
84
 
@@ -107,7 +107,10 @@ export function useMultiPickerProps(_ref) {
107
107
  // selected items display correct labels.
108
108
  var selectedKeysForSnapshot = (_props$selectedKeys = props.selectedKeys) !== null && _props$selectedKeys !== void 0 ? _props$selectedKeys : props.defaultSelectedKeys;
109
109
  var snapshottedKeysRef = useRef(new Set());
110
- var [snapshotItemsByIndex, setSnapshotItemsByIndex] = useState(new Map());
110
+ var _useState = useState(new Map()),
111
+ _useState2 = _slicedToArray(_useState, 2),
112
+ snapshotItemsByIndex = _useState2[0],
113
+ setSnapshotItemsByIndex = _useState2[1];
111
114
 
112
115
  // Reset when table changes so we re-snapshot.
113
116
  useEffect(() => {
@@ -192,7 +195,10 @@ export function useMultiPickerProps(_ref) {
192
195
  // NOTE: This is passed using a separate `selectedItemLabels` prop so it only affects tag
193
196
  // rendering.
194
197
  var labelCacheRef = useRef(new Map());
195
- var [selectedItemLabels, setSelectedItemLabels] = useState(new Map());
198
+ var _useState3 = useState(new Map()),
199
+ _useState4 = _slicedToArray(_useState3, 2),
200
+ selectedItemLabels = _useState4[0],
201
+ setSelectedItemLabels = _useState4[1];
196
202
 
197
203
  // Merge snapshot data into viewport items (needed for initial load of labels, otherwise they
198
204
  // display key values).
@@ -1 +1 @@
1
- {"version":3,"file":"useMultiPickerProps.js","names":["useCallback","useEffect","useMemo","useRef","useState","usePickerItemScale","createKeyedItemKey","TableUtils","useApi","Log","usePromiseFactory","useFormatter","useTableUtils","getItemKeyColumn","getItemLabelColumn","useItemRowDeserializer","useSearchableViewportData","useWidgetClose","log","module","useMultiPickerProps","_ref","_props$selectedKeys","table","tableSource","keyColumn","keyColumnName","labelColumn","labelColumnName","iconColumn","iconColumnName","settings","onChange","onSelectionChange","props","_objectWithoutProperties","_excluded","itemHeight","getFormattedString","formatValue","timeZone","data","tableCopy","copyTableAndApplyFilters","searchColumnNames","name","deserializeRow","onScroll","onSearchTextChange","viewportData","reuseItemsOnTableResize","dh","tableUtils","snapshotColumns","cols","push","iconCol","findColumn","_unused","selectedKeysForSnapshot","selectedKeys","defaultSelectedKeys","snapshottedKeysRef","Set","snapshotItemsByIndex","setSnapshotItemsByIndex","Map","current","snapshotSelectedKeyLabels","keysToSnapshot","filter","key","has","String","length","isCanceled","column","columnValueType","getValueType","type","_asyncToGenerator","rowIndices","Promise","all","map","_ref3","index","seekRow","_x","apply","arguments","sort","a","b","rangeSet","RangeSet","ofItems","tableData","createSnapshot","rows","columns","itemMap","forEach","row","i","rowIndex","item","set","add","prev","merged","value","err","error","labelCacheRef","selectedItemLabels","setSelectedItemLabels","normalizedItems","size","items","snapshotItem","get","updateLabelCache","_props$selectedKeys2","currentSelectedKeys","selectedKeySet","Array","cacheUpdated","label","textValue","onSelectionChangeInternal","keys","_ref4","_objectSpread","showItemIcons"],"sources":["../../../src/spectrum/utils/useMultiPickerProps.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n type ItemSelection,\n type NormalizedItem,\n type NormalizedItemData,\n type NormalizedSection,\n usePickerItemScale,\n} from '@deephaven/components';\nimport { createKeyedItemKey, TableUtils } from '@deephaven/jsapi-utils';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport Log from '@deephaven/log';\nimport { usePromiseFactory } from '@deephaven/react-hooks';\nimport { type KeyedItem } from '@deephaven/utils';\nimport useFormatter from '../../useFormatter';\nimport useTableUtils from '../../useTableUtils';\nimport type { MultiPickerWithTableProps } from '../MultiPickerProps';\nimport { getItemKeyColumn, getItemLabelColumn } from './itemUtils';\nimport { useItemRowDeserializer } from './useItemRowDeserializer';\nimport useSearchableViewportData from '../../useSearchableViewportData';\nimport useWidgetClose from '../../useWidgetClose';\n\nconst log = Log.module('jsapi-components.useMultiPickerProps');\n\n/** Props that are derived by `useMultiPickerProps`. */\nexport type UseMultiPickerDerivedProps = {\n normalizedItems: (NormalizedItem | NormalizedSection)[];\n showItemIcons: boolean;\n selectedItemLabels: Map<string, string>;\n onChange: (keys: ItemSelection) => 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 `useMultiPickerProps` that are not in the\n * spread ...props)\n */\nexport type UseMultiPickerPassthroughProps = Omit<\n MultiPickerWithTableProps,\n | 'table'\n | 'keyColumn'\n | 'labelColumn'\n | 'iconColumn'\n | 'settings'\n | 'onChange'\n | 'onSelectionChange'\n>;\n\n/** Props returned by `useMultiPickerProps` hook. */\nexport type UseMultiPickerProps = UseMultiPickerDerivedProps &\n UseMultiPickerPassthroughProps;\n\nexport function useMultiPickerProps({\n table: tableSource,\n keyColumn: keyColumnName,\n labelColumn: labelColumnName,\n iconColumn: iconColumnName,\n settings,\n onChange,\n onSelectionChange,\n ...props\n}: MultiPickerWithTableProps): UseMultiPickerProps {\n const { itemHeight } = usePickerItemScale();\n\n const { getFormattedString: formatValue, timeZone } = useFormatter(settings);\n\n // Copy table so we can apply filters without affecting the original table.\n const { data: tableCopy } = usePromiseFactory(\n TableUtils.copyTableAndApplyFilters,\n [tableSource]\n );\n\n useWidgetClose(tableCopy);\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 { onScroll, onSearchTextChange, viewportData } =\n useSearchableViewportData({\n reuseItemsOnTableResize: true,\n table: tableCopy,\n itemHeight,\n deserializeRow,\n searchColumnNames,\n timeZone,\n });\n\n const dh = useApi();\n const tableUtils = useTableUtils();\n\n // Only request columns needed by `deserializeRow` (key, label, and optionally icon).\n const snapshotColumns = useMemo(() => {\n if (tableCopy == null || keyColumn == null) {\n return [];\n }\n const cols = [keyColumn];\n if (labelColumn != null && labelColumn !== keyColumn) {\n cols.push(labelColumn);\n }\n if (iconColumnName != null) {\n try {\n const iconCol = tableCopy.findColumn(iconColumnName);\n cols.push(iconCol);\n } catch {\n // icon column not found, skip\n }\n }\n return cols;\n }, [tableCopy, keyColumn, labelColumn, iconColumnName]);\n\n // When selected keys point to rows outside the initial viewport, we take a table snapshot of\n // just those rows to load their real label data. This avoids moving the viewport and ensures all\n // selected items display correct labels.\n const selectedKeysForSnapshot =\n props.selectedKeys ?? props.defaultSelectedKeys;\n const snapshottedKeysRef = useRef<Set<string>>(new Set());\n const [snapshotItemsByIndex, setSnapshotItemsByIndex] = useState<\n Map<number, KeyedItem<NormalizedItemData>>\n >(new Map());\n\n // Reset when table changes so we re-snapshot.\n useEffect(() => {\n snapshottedKeysRef.current = new Set();\n setSnapshotItemsByIndex(new Map());\n }, [tableCopy]);\n\n useEffect(\n function snapshotSelectedKeyLabels() {\n if (\n tableCopy == null ||\n keyColumn == null ||\n selectedKeysForSnapshot == null ||\n selectedKeysForSnapshot === 'all'\n ) {\n return;\n }\n\n // Determine which keys still need snapshotting.\n const keysToSnapshot = [...selectedKeysForSnapshot].filter(\n key => !snapshottedKeysRef.current.has(String(key))\n );\n\n if (keysToSnapshot.length === 0) {\n return;\n }\n\n let isCanceled = false;\n\n const column = tableCopy.findColumn(keyColumn.name);\n const columnValueType = tableUtils.getValueType(column.type);\n\n (async () => {\n try {\n // Seek row indices for all selected keys\n const rowIndices: number[] = [];\n await Promise.all(\n keysToSnapshot.map(async key => {\n if (isCanceled) {\n return;\n }\n const index = await tableCopy.seekRow(\n 0,\n column,\n columnValueType,\n key\n );\n if (index !== -1) {\n rowIndices.push(index);\n }\n })\n );\n\n rowIndices.sort((a, b) => a - b);\n\n if (isCanceled || rowIndices.length === 0) {\n return;\n }\n\n // Take a snapshot of just those rows\n const rangeSet = dh.RangeSet.ofItems(rowIndices);\n const tableData = await tableCopy.createSnapshot({\n rows: rangeSet,\n columns: snapshotColumns,\n });\n\n if (isCanceled) {\n return;\n }\n\n const itemMap = new Map<number, KeyedItem<NormalizedItemData>>();\n tableData.rows.forEach((row, i) => {\n const rowIndex = rowIndices[i];\n const item = deserializeRow(row);\n itemMap.set(rowIndex, {\n key: createKeyedItemKey(rowIndex),\n item,\n });\n });\n\n if (!isCanceled) {\n // Mark keys as successfully snapshotted so they are not re-fetched.\n keysToSnapshot.forEach(key =>\n snapshottedKeysRef.current.add(String(key))\n );\n setSnapshotItemsByIndex(prev => {\n const merged = new Map(prev);\n itemMap.forEach((value, key) => merged.set(key, value));\n return merged;\n });\n }\n } catch (err) {\n log.error('Error loading labels for selected keys', err);\n }\n })();\n\n return () => {\n isCanceled = true;\n };\n },\n [\n selectedKeysForSnapshot,\n tableCopy,\n keyColumn,\n tableUtils,\n dh,\n deserializeRow,\n snapshotColumns,\n ]\n );\n\n // Label cache for every selected item resolved (from viewport or snapshot). This ensures that\n // when search filtering narrows the table, tags for selected items that are no longer in the\n // filtered results still display their correct labels.\n // NOTE: This is passed using a separate `selectedItemLabels` prop so it only affects tag\n // rendering.\n const labelCacheRef = useRef<Map<string, string>>(new Map());\n const [selectedItemLabels, setSelectedItemLabels] = useState<\n Map<string, string>\n >(new Map());\n\n // Merge snapshot data into viewport items (needed for initial load of labels, otherwise they\n // display key values).\n const normalizedItems = useMemo(() => {\n if (snapshotItemsByIndex.size === 0) {\n return viewportData.items;\n }\n\n return viewportData.items.map((item, index) => {\n if (item.item == null) {\n const snapshotItem = snapshotItemsByIndex.get(index);\n if (snapshotItem != null) {\n return snapshotItem;\n }\n }\n return item;\n });\n }, [viewportData.items, snapshotItemsByIndex]);\n\n // Update the label cache whenever normalizedItems or selected keys change.\n useEffect(\n function updateLabelCache() {\n const currentSelectedKeys =\n props.selectedKeys ?? props.defaultSelectedKeys;\n\n let selectedKeySet: Set<string> | null;\n if (currentSelectedKeys instanceof Array) {\n selectedKeySet = new Set(currentSelectedKeys.map(String));\n } else if (currentSelectedKeys === 'all') {\n selectedKeySet = null;\n } else {\n selectedKeySet = new Set<string>();\n }\n\n let cacheUpdated = false;\n\n // Cache labels from all resolved items that are currently selected. The normalizedItems\n // merge already includes snapshot data, so this single pass should cover both viewport\n // and snapshot sources.\n normalizedItems.forEach(item => {\n if (item.item != null) {\n const key = String(item.item.key);\n const label = item.item.textValue;\n if (\n label != null &&\n (selectedKeySet == null || selectedKeySet.has(key)) &&\n labelCacheRef.current.get(key) !== label\n ) {\n labelCacheRef.current.set(key, label);\n cacheUpdated = true;\n }\n }\n });\n\n if (cacheUpdated) {\n setSelectedItemLabels(new Map(labelCacheRef.current));\n }\n },\n [normalizedItems, props.selectedKeys, props.defaultSelectedKeys]\n );\n\n const onSelectionChangeInternal = useCallback(\n (keys: ItemSelection): void => {\n (onChange ?? onSelectionChange)?.(keys);\n },\n [onChange, onSelectionChange]\n );\n\n return {\n ...props,\n normalizedItems,\n selectedItemLabels,\n showItemIcons: iconColumnName != null,\n onChange: onSelectionChangeInternal,\n onScroll,\n onSearchTextChange,\n };\n}\n\nexport default useMultiPickerProps;\n"],"mappings":";;;;;;;;;;AAAA,SAASA,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,OAAO;AACzE,SAKEC,kBAAkB,QACb,uBAAuB;AAC9B,SAASC,kBAAkB,EAAEC,UAAU,QAAQ,wBAAwB;AACvE,SAASC,MAAM,QAAQ,4BAA4B;AACnD,OAAOC,GAAG,MAAM,gBAAgB;AAChC,SAASC,iBAAiB,QAAQ,wBAAwB;AAAC,OAEpDC,YAAY;AAAA,OACZC,aAAa;AAAA,SAEXC,gBAAgB,EAAEC,kBAAkB;AAAA,SACpCC,sBAAsB;AAAA,OACxBC,yBAAyB;AAAA,OACzBC,cAAc;AAErB,IAAMC,GAAG,GAAGT,GAAG,CAACU,MAAM,CAAC,sCAAsC,CAAC;;AAE9D;;AAUA;AACA;AACA;AACA;AACA;;AAYA;;AAIA,OAAO,SAASC,mBAAmBA,CAAAC,IAAA,EASgB;EAAA,IAAAC,mBAAA;EAAA,IATf;MAClCC,KAAK,EAAEC,WAAW;MAClBC,SAAS,EAAEC,aAAa;MACxBC,WAAW,EAAEC,eAAe;MAC5BC,UAAU,EAAEC,cAAc;MAC1BC,QAAQ;MACRC,QAAQ;MACRC;IAEyB,CAAC,GAAAZ,IAAA;IADvBa,KAAK,GAAAC,wBAAA,CAAAd,IAAA,EAAAe,SAAA;EAER,IAAM;IAAEC;EAAW,CAAC,GAAGhC,kBAAkB,CAAC,CAAC;EAE3C,IAAM;IAAEiC,kBAAkB,EAAEC,WAAW;IAAEC;EAAS,CAAC,GAAG7B,YAAY,CAACoB,QAAQ,CAAC;;EAE5E;EACA,IAAM;IAAEU,IAAI,EAAEC;EAAU,CAAC,GAAGhC,iBAAiB,CAC3CH,UAAU,CAACoC,wBAAwB,EACnC,CAACnB,WAAW,CACd,CAAC;EAEDP,cAAc,CAACyB,SAAS,CAAC;EAEzB,IAAMjB,SAAS,GAAGvB,OAAO,CACvB,MACEwC,SAAS,IAAI,IAAI,GAAG,IAAI,GAAG7B,gBAAgB,CAAC6B,SAAS,EAAEhB,aAAa,CAAC,EACvE,CAACA,aAAa,EAAEgB,SAAS,CAC3B,CAAC;EAED,IAAMf,WAAW,GAAGzB,OAAO,CACzB,MACEwC,SAAS,IAAI,IAAI,IAAIjB,SAAS,IAAI,IAAI,GAClC,IAAI,GACJX,kBAAkB,CAAC4B,SAAS,EAAEjB,SAAS,EAAEG,eAAe,CAAC,EAC/D,CAACH,SAAS,EAAEG,eAAe,EAAEc,SAAS,CACxC,CAAC;EAED,IAAME,iBAAiB,GAAG1C,OAAO,CAC/B,MAAOyB,WAAW,IAAI,IAAI,GAAG,EAAE,GAAG,CAACA,WAAW,CAACkB,IAAI,CAAE,EACrD,CAAClB,WAAW,CACd,CAAC;EAED,IAAMmB,cAAc,GAAG/B,sBAAsB,CAAC;IAC5CQ,KAAK,EAAEmB,SAAS;IAChBZ,cAAc;IACdJ,aAAa;IACbE,eAAe;IACfW;EACF,CAAC,CAAC;EAEF,IAAM;IAAEQ,QAAQ;IAAEC,kBAAkB;IAAEC;EAAa,CAAC,GAClDjC,yBAAyB,CAAC;IACxBkC,uBAAuB,EAAE,IAAI;IAC7B3B,KAAK,EAAEmB,SAAS;IAChBL,UAAU;IACVS,cAAc;IACdF,iBAAiB;IACjBJ;EACF,CAAC,CAAC;EAEJ,IAAMW,EAAE,GAAG3C,MAAM,CAAC,CAAC;EACnB,IAAM4C,UAAU,GAAGxC,aAAa,CAAC,CAAC;;EAElC;EACA,IAAMyC,eAAe,GAAGnD,OAAO,CAAC,MAAM;IACpC,IAAIwC,SAAS,IAAI,IAAI,IAAIjB,SAAS,IAAI,IAAI,EAAE;MAC1C,OAAO,EAAE;IACX;IACA,IAAM6B,IAAI,GAAG,CAAC7B,SAAS,CAAC;IACxB,IAAIE,WAAW,IAAI,IAAI,IAAIA,WAAW,KAAKF,SAAS,EAAE;MACpD6B,IAAI,CAACC,IAAI,CAAC5B,WAAW,CAAC;IACxB;IACA,IAAIG,cAAc,IAAI,IAAI,EAAE;MAC1B,IAAI;QACF,IAAM0B,OAAO,GAAGd,SAAS,CAACe,UAAU,CAAC3B,cAAc,CAAC;QACpDwB,IAAI,CAACC,IAAI,CAACC,OAAO,CAAC;MACpB,CAAC,CAAC,OAAAE,OAAA,EAAM;QACN;MAAA;IAEJ;IACA,OAAOJ,IAAI;EACb,CAAC,EAAE,CAACZ,SAAS,EAAEjB,SAAS,EAAEE,WAAW,EAAEG,cAAc,CAAC,CAAC;;EAEvD;EACA;EACA;EACA,IAAM6B,uBAAuB,IAAArC,mBAAA,GAC3BY,KAAK,CAAC0B,YAAY,cAAAtC,mBAAA,cAAAA,mBAAA,GAAIY,KAAK,CAAC2B,mBAAmB;EACjD,IAAMC,kBAAkB,GAAG3D,MAAM,CAAc,IAAI4D,GAAG,CAAC,CAAC,CAAC;EACzD,IAAM,CAACC,oBAAoB,EAAEC,uBAAuB,CAAC,GAAG7D,QAAQ,CAE9D,IAAI8D,GAAG,CAAC,CAAC,CAAC;;EAEZ;EACAjE,SAAS,CAAC,MAAM;IACd6D,kBAAkB,CAACK,OAAO,GAAG,IAAIJ,GAAG,CAAC,CAAC;IACtCE,uBAAuB,CAAC,IAAIC,GAAG,CAAC,CAAC,CAAC;EACpC,CAAC,EAAE,CAACxB,SAAS,CAAC,CAAC;EAEfzC,SAAS,CACP,SAASmE,yBAAyBA,CAAA,EAAG;IACnC,IACE1B,SAAS,IAAI,IAAI,IACjBjB,SAAS,IAAI,IAAI,IACjBkC,uBAAuB,IAAI,IAAI,IAC/BA,uBAAuB,KAAK,KAAK,EACjC;MACA;IACF;;IAEA;IACA,IAAMU,cAAc,GAAG,CAAC,GAAGV,uBAAuB,CAAC,CAACW,MAAM,CACxDC,GAAG,IAAI,CAACT,kBAAkB,CAACK,OAAO,CAACK,GAAG,CAACC,MAAM,CAACF,GAAG,CAAC,CACpD,CAAC;IAED,IAAIF,cAAc,CAACK,MAAM,KAAK,CAAC,EAAE;MAC/B;IACF;IAEA,IAAIC,UAAU,GAAG,KAAK;IAEtB,IAAMC,MAAM,GAAGlC,SAAS,CAACe,UAAU,CAAChC,SAAS,CAACoB,IAAI,CAAC;IACnD,IAAMgC,eAAe,GAAGzB,UAAU,CAAC0B,YAAY,CAACF,MAAM,CAACG,IAAI,CAAC;IAE5DC,iBAAA,CAAC,aAAY;MACX,IAAI;QACF;QACA,IAAMC,UAAoB,GAAG,EAAE;QAC/B,MAAMC,OAAO,CAACC,GAAG,CACfd,cAAc,CAACe,GAAG;UAAA,IAAAC,KAAA,GAAAL,iBAAA,CAAC,WAAMT,GAAG,EAAI;YAC9B,IAAII,UAAU,EAAE;cACd;YACF;YACA,IAAMW,KAAK,SAAS5C,SAAS,CAAC6C,OAAO,CACnC,CAAC,EACDX,MAAM,EACNC,eAAe,EACfN,GACF,CAAC;YACD,IAAIe,KAAK,KAAK,CAAC,CAAC,EAAE;cAChBL,UAAU,CAAC1B,IAAI,CAAC+B,KAAK,CAAC;YACxB;UACF,CAAC;UAAA,iBAAAE,EAAA;YAAA,OAAAH,KAAA,CAAAI,KAAA,OAAAC,SAAA;UAAA;QAAA,IACH,CAAC;QAEDT,UAAU,CAACU,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,GAAGC,CAAC,CAAC;QAEhC,IAAIlB,UAAU,IAAIM,UAAU,CAACP,MAAM,KAAK,CAAC,EAAE;UACzC;QACF;;QAEA;QACA,IAAMoB,QAAQ,GAAG3C,EAAE,CAAC4C,QAAQ,CAACC,OAAO,CAACf,UAAU,CAAC;QAChD,IAAMgB,SAAS,SAASvD,SAAS,CAACwD,cAAc,CAAC;UAC/CC,IAAI,EAAEL,QAAQ;UACdM,OAAO,EAAE/C;QACX,CAAC,CAAC;QAEF,IAAIsB,UAAU,EAAE;UACd;QACF;QAEA,IAAM0B,OAAO,GAAG,IAAInC,GAAG,CAAwC,CAAC;QAChE+B,SAAS,CAACE,IAAI,CAACG,OAAO,CAAC,CAACC,GAAG,EAAEC,CAAC,KAAK;UACjC,IAAMC,QAAQ,GAAGxB,UAAU,CAACuB,CAAC,CAAC;UAC9B,IAAME,IAAI,GAAG5D,cAAc,CAACyD,GAAG,CAAC;UAChCF,OAAO,CAACM,GAAG,CAACF,QAAQ,EAAE;YACpBlC,GAAG,EAAEjE,kBAAkB,CAACmG,QAAQ,CAAC;YACjCC;UACF,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,IAAI,CAAC/B,UAAU,EAAE;UACf;UACAN,cAAc,CAACiC,OAAO,CAAC/B,GAAG,IACxBT,kBAAkB,CAACK,OAAO,CAACyC,GAAG,CAACnC,MAAM,CAACF,GAAG,CAAC,CAC5C,CAAC;UACDN,uBAAuB,CAAC4C,IAAI,IAAI;YAC9B,IAAMC,MAAM,GAAG,IAAI5C,GAAG,CAAC2C,IAAI,CAAC;YAC5BR,OAAO,CAACC,OAAO,CAAC,CAACS,KAAK,EAAExC,GAAG,KAAKuC,MAAM,CAACH,GAAG,CAACpC,GAAG,EAAEwC,KAAK,CAAC,CAAC;YACvD,OAAOD,MAAM;UACf,CAAC,CAAC;QACJ;MACF,CAAC,CAAC,OAAOE,GAAG,EAAE;QACZ9F,GAAG,CAAC+F,KAAK,CAAC,wCAAwC,EAAED,GAAG,CAAC;MAC1D;IACF,CAAC,EAAE,CAAC;IAEJ,OAAO,MAAM;MACXrC,UAAU,GAAG,IAAI;IACnB,CAAC;EACH,CAAC,EACD,CACEhB,uBAAuB,EACvBjB,SAAS,EACTjB,SAAS,EACT2B,UAAU,EACVD,EAAE,EACFL,cAAc,EACdO,eAAe,CAEnB,CAAC;;EAED;EACA;EACA;EACA;EACA;EACA,IAAM6D,aAAa,GAAG/G,MAAM,CAAsB,IAAI+D,GAAG,CAAC,CAAC,CAAC;EAC5D,IAAM,CAACiD,kBAAkB,EAAEC,qBAAqB,CAAC,GAAGhH,QAAQ,CAE1D,IAAI8D,GAAG,CAAC,CAAC,CAAC;;EAEZ;EACA;EACA,IAAMmD,eAAe,GAAGnH,OAAO,CAAC,MAAM;IACpC,IAAI8D,oBAAoB,CAACsD,IAAI,KAAK,CAAC,EAAE;MACnC,OAAOrE,YAAY,CAACsE,KAAK;IAC3B;IAEA,OAAOtE,YAAY,CAACsE,KAAK,CAACnC,GAAG,CAAC,CAACsB,IAAI,EAAEpB,KAAK,KAAK;MAC7C,IAAIoB,IAAI,CAACA,IAAI,IAAI,IAAI,EAAE;QACrB,IAAMc,YAAY,GAAGxD,oBAAoB,CAACyD,GAAG,CAACnC,KAAK,CAAC;QACpD,IAAIkC,YAAY,IAAI,IAAI,EAAE;UACxB,OAAOA,YAAY;QACrB;MACF;MACA,OAAOd,IAAI;IACb,CAAC,CAAC;EACJ,CAAC,EAAE,CAACzD,YAAY,CAACsE,KAAK,EAAEvD,oBAAoB,CAAC,CAAC;;EAE9C;EACA/D,SAAS,CACP,SAASyH,gBAAgBA,CAAA,EAAG;IAAA,IAAAC,oBAAA;IAC1B,IAAMC,mBAAmB,IAAAD,oBAAA,GACvBzF,KAAK,CAAC0B,YAAY,cAAA+D,oBAAA,cAAAA,oBAAA,GAAIzF,KAAK,CAAC2B,mBAAmB;IAEjD,IAAIgE,cAAkC;IACtC,IAAID,mBAAmB,YAAYE,KAAK,EAAE;MACxCD,cAAc,GAAG,IAAI9D,GAAG,CAAC6D,mBAAmB,CAACxC,GAAG,CAACX,MAAM,CAAC,CAAC;IAC3D,CAAC,MAAM,IAAImD,mBAAmB,KAAK,KAAK,EAAE;MACxCC,cAAc,GAAG,IAAI;IACvB,CAAC,MAAM;MACLA,cAAc,GAAG,IAAI9D,GAAG,CAAS,CAAC;IACpC;IAEA,IAAIgE,YAAY,GAAG,KAAK;;IAExB;IACA;IACA;IACAV,eAAe,CAACf,OAAO,CAACI,IAAI,IAAI;MAC9B,IAAIA,IAAI,CAACA,IAAI,IAAI,IAAI,EAAE;QACrB,IAAMnC,GAAG,GAAGE,MAAM,CAACiC,IAAI,CAACA,IAAI,CAACnC,GAAG,CAAC;QACjC,IAAMyD,KAAK,GAAGtB,IAAI,CAACA,IAAI,CAACuB,SAAS;QACjC,IACED,KAAK,IAAI,IAAI,KACZH,cAAc,IAAI,IAAI,IAAIA,cAAc,CAACrD,GAAG,CAACD,GAAG,CAAC,CAAC,IACnD2C,aAAa,CAAC/C,OAAO,CAACsD,GAAG,CAAClD,GAAG,CAAC,KAAKyD,KAAK,EACxC;UACAd,aAAa,CAAC/C,OAAO,CAACwC,GAAG,CAACpC,GAAG,EAAEyD,KAAK,CAAC;UACrCD,YAAY,GAAG,IAAI;QACrB;MACF;IACF,CAAC,CAAC;IAEF,IAAIA,YAAY,EAAE;MAChBX,qBAAqB,CAAC,IAAIlD,GAAG,CAACgD,aAAa,CAAC/C,OAAO,CAAC,CAAC;IACvD;EACF,CAAC,EACD,CAACkD,eAAe,EAAEnF,KAAK,CAAC0B,YAAY,EAAE1B,KAAK,CAAC2B,mBAAmB,CACjE,CAAC;EAED,IAAMqE,yBAAyB,GAAGlI,WAAW,CAC1CmI,IAAmB,IAAW;IAAA,IAAAC,KAAA;IAC7B,CAAAA,KAAA,GAACpG,QAAQ,aAARA,QAAQ,cAARA,QAAQ,GAAIC,iBAAiB,cAAAmG,KAAA,eAA9BA,KAAA,CAAkCD,IAAI,CAAC;EACzC,CAAC,EACD,CAACnG,QAAQ,EAAEC,iBAAiB,CAC9B,CAAC;EAED,OAAAoG,aAAA,CAAAA,aAAA,KACKnG,KAAK;IACRmF,eAAe;IACfF,kBAAkB;IAClBmB,aAAa,EAAExG,cAAc,IAAI,IAAI;IACrCE,QAAQ,EAAEkG,yBAAyB;IACnCnF,QAAQ;IACRC;EAAkB;AAEtB;AAEA,eAAe5B,mBAAmB","ignoreList":[]}
1
+ {"version":3,"file":"useMultiPickerProps.js","names":["useCallback","useEffect","useMemo","useRef","useState","usePickerItemScale","createKeyedItemKey","TableUtils","useApi","Log","usePromiseFactory","useFormatter","useTableUtils","getItemKeyColumn","getItemLabelColumn","useItemRowDeserializer","useSearchableViewportData","useWidgetClose","log","module","useMultiPickerProps","_ref","_props$selectedKeys","tableSource","table","keyColumnName","keyColumn","labelColumnName","labelColumn","iconColumnName","iconColumn","settings","onChange","onSelectionChange","props","_objectWithoutProperties","_excluded","_usePickerItemScale","itemHeight","_useFormatter","formatValue","getFormattedString","timeZone","_usePromiseFactory","copyTableAndApplyFilters","tableCopy","data","searchColumnNames","name","deserializeRow","_useSearchableViewpor","reuseItemsOnTableResize","onScroll","onSearchTextChange","viewportData","dh","tableUtils","snapshotColumns","cols","push","iconCol","findColumn","_unused","selectedKeysForSnapshot","selectedKeys","defaultSelectedKeys","snapshottedKeysRef","Set","_useState","Map","_useState2","_slicedToArray","snapshotItemsByIndex","setSnapshotItemsByIndex","current","snapshotSelectedKeyLabels","keysToSnapshot","filter","key","has","String","length","isCanceled","column","columnValueType","getValueType","type","_asyncToGenerator","rowIndices","Promise","all","map","_ref3","index","seekRow","_x","apply","arguments","sort","a","b","rangeSet","RangeSet","ofItems","tableData","createSnapshot","rows","columns","itemMap","forEach","row","i","rowIndex","item","set","add","prev","merged","value","err","error","labelCacheRef","_useState3","_useState4","selectedItemLabels","setSelectedItemLabels","normalizedItems","size","items","snapshotItem","get","updateLabelCache","_props$selectedKeys2","currentSelectedKeys","selectedKeySet","Array","cacheUpdated","label","textValue","onSelectionChangeInternal","keys","_ref4","_objectSpread","showItemIcons"],"sources":["../../../src/spectrum/utils/useMultiPickerProps.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n type ItemSelection,\n type NormalizedItem,\n type NormalizedItemData,\n type NormalizedSection,\n usePickerItemScale,\n} from '@deephaven/components';\nimport { createKeyedItemKey, TableUtils } from '@deephaven/jsapi-utils';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport Log from '@deephaven/log';\nimport { usePromiseFactory } from '@deephaven/react-hooks';\nimport { type KeyedItem } from '@deephaven/utils';\nimport useFormatter from '../../useFormatter';\nimport useTableUtils from '../../useTableUtils';\nimport type { MultiPickerWithTableProps } from '../MultiPickerProps';\nimport { getItemKeyColumn, getItemLabelColumn } from './itemUtils';\nimport { useItemRowDeserializer } from './useItemRowDeserializer';\nimport useSearchableViewportData from '../../useSearchableViewportData';\nimport useWidgetClose from '../../useWidgetClose';\n\nconst log = Log.module('jsapi-components.useMultiPickerProps');\n\n/** Props that are derived by `useMultiPickerProps`. */\nexport type UseMultiPickerDerivedProps = {\n normalizedItems: (NormalizedItem | NormalizedSection)[];\n showItemIcons: boolean;\n selectedItemLabels: Map<string, string>;\n onChange: (keys: ItemSelection) => 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 `useMultiPickerProps` that are not in the\n * spread ...props)\n */\nexport type UseMultiPickerPassthroughProps = Omit<\n MultiPickerWithTableProps,\n | 'table'\n | 'keyColumn'\n | 'labelColumn'\n | 'iconColumn'\n | 'settings'\n | 'onChange'\n | 'onSelectionChange'\n>;\n\n/** Props returned by `useMultiPickerProps` hook. */\nexport type UseMultiPickerProps = UseMultiPickerDerivedProps &\n UseMultiPickerPassthroughProps;\n\nexport function useMultiPickerProps({\n table: tableSource,\n keyColumn: keyColumnName,\n labelColumn: labelColumnName,\n iconColumn: iconColumnName,\n settings,\n onChange,\n onSelectionChange,\n ...props\n}: MultiPickerWithTableProps): UseMultiPickerProps {\n const { itemHeight } = usePickerItemScale();\n\n const { getFormattedString: formatValue, timeZone } = useFormatter(settings);\n\n // Copy table so we can apply filters without affecting the original table.\n const { data: tableCopy } = usePromiseFactory(\n TableUtils.copyTableAndApplyFilters,\n [tableSource]\n );\n\n useWidgetClose(tableCopy);\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 { onScroll, onSearchTextChange, viewportData } =\n useSearchableViewportData({\n reuseItemsOnTableResize: true,\n table: tableCopy,\n itemHeight,\n deserializeRow,\n searchColumnNames,\n timeZone,\n });\n\n const dh = useApi();\n const tableUtils = useTableUtils();\n\n // Only request columns needed by `deserializeRow` (key, label, and optionally icon).\n const snapshotColumns = useMemo(() => {\n if (tableCopy == null || keyColumn == null) {\n return [];\n }\n const cols = [keyColumn];\n if (labelColumn != null && labelColumn !== keyColumn) {\n cols.push(labelColumn);\n }\n if (iconColumnName != null) {\n try {\n const iconCol = tableCopy.findColumn(iconColumnName);\n cols.push(iconCol);\n } catch {\n // icon column not found, skip\n }\n }\n return cols;\n }, [tableCopy, keyColumn, labelColumn, iconColumnName]);\n\n // When selected keys point to rows outside the initial viewport, we take a table snapshot of\n // just those rows to load their real label data. This avoids moving the viewport and ensures all\n // selected items display correct labels.\n const selectedKeysForSnapshot =\n props.selectedKeys ?? props.defaultSelectedKeys;\n const snapshottedKeysRef = useRef<Set<string>>(new Set());\n const [snapshotItemsByIndex, setSnapshotItemsByIndex] = useState<\n Map<number, KeyedItem<NormalizedItemData>>\n >(new Map());\n\n // Reset when table changes so we re-snapshot.\n useEffect(() => {\n snapshottedKeysRef.current = new Set();\n setSnapshotItemsByIndex(new Map());\n }, [tableCopy]);\n\n useEffect(\n function snapshotSelectedKeyLabels() {\n if (\n tableCopy == null ||\n keyColumn == null ||\n selectedKeysForSnapshot == null ||\n selectedKeysForSnapshot === 'all'\n ) {\n return;\n }\n\n // Determine which keys still need snapshotting.\n const keysToSnapshot = [...selectedKeysForSnapshot].filter(\n key => !snapshottedKeysRef.current.has(String(key))\n );\n\n if (keysToSnapshot.length === 0) {\n return;\n }\n\n let isCanceled = false;\n\n const column = tableCopy.findColumn(keyColumn.name);\n const columnValueType = tableUtils.getValueType(column.type);\n\n (async () => {\n try {\n // Seek row indices for all selected keys\n const rowIndices: number[] = [];\n await Promise.all(\n keysToSnapshot.map(async key => {\n if (isCanceled) {\n return;\n }\n const index = await tableCopy.seekRow(\n 0,\n column,\n columnValueType,\n key\n );\n if (index !== -1) {\n rowIndices.push(index);\n }\n })\n );\n\n rowIndices.sort((a, b) => a - b);\n\n if (isCanceled || rowIndices.length === 0) {\n return;\n }\n\n // Take a snapshot of just those rows\n const rangeSet = dh.RangeSet.ofItems(rowIndices);\n const tableData = await tableCopy.createSnapshot({\n rows: rangeSet,\n columns: snapshotColumns,\n });\n\n if (isCanceled) {\n return;\n }\n\n const itemMap = new Map<number, KeyedItem<NormalizedItemData>>();\n tableData.rows.forEach((row, i) => {\n const rowIndex = rowIndices[i];\n const item = deserializeRow(row);\n itemMap.set(rowIndex, {\n key: createKeyedItemKey(rowIndex),\n item,\n });\n });\n\n if (!isCanceled) {\n // Mark keys as successfully snapshotted so they are not re-fetched.\n keysToSnapshot.forEach(key =>\n snapshottedKeysRef.current.add(String(key))\n );\n setSnapshotItemsByIndex(prev => {\n const merged = new Map(prev);\n itemMap.forEach((value, key) => merged.set(key, value));\n return merged;\n });\n }\n } catch (err) {\n log.error('Error loading labels for selected keys', err);\n }\n })();\n\n return () => {\n isCanceled = true;\n };\n },\n [\n selectedKeysForSnapshot,\n tableCopy,\n keyColumn,\n tableUtils,\n dh,\n deserializeRow,\n snapshotColumns,\n ]\n );\n\n // Label cache for every selected item resolved (from viewport or snapshot). This ensures that\n // when search filtering narrows the table, tags for selected items that are no longer in the\n // filtered results still display their correct labels.\n // NOTE: This is passed using a separate `selectedItemLabels` prop so it only affects tag\n // rendering.\n const labelCacheRef = useRef<Map<string, string>>(new Map());\n const [selectedItemLabels, setSelectedItemLabels] = useState<\n Map<string, string>\n >(new Map());\n\n // Merge snapshot data into viewport items (needed for initial load of labels, otherwise they\n // display key values).\n const normalizedItems = useMemo(() => {\n if (snapshotItemsByIndex.size === 0) {\n return viewportData.items;\n }\n\n return viewportData.items.map((item, index) => {\n if (item.item == null) {\n const snapshotItem = snapshotItemsByIndex.get(index);\n if (snapshotItem != null) {\n return snapshotItem;\n }\n }\n return item;\n });\n }, [viewportData.items, snapshotItemsByIndex]);\n\n // Update the label cache whenever normalizedItems or selected keys change.\n useEffect(\n function updateLabelCache() {\n const currentSelectedKeys =\n props.selectedKeys ?? props.defaultSelectedKeys;\n\n let selectedKeySet: Set<string> | null;\n if (currentSelectedKeys instanceof Array) {\n selectedKeySet = new Set(currentSelectedKeys.map(String));\n } else if (currentSelectedKeys === 'all') {\n selectedKeySet = null;\n } else {\n selectedKeySet = new Set<string>();\n }\n\n let cacheUpdated = false;\n\n // Cache labels from all resolved items that are currently selected. The normalizedItems\n // merge already includes snapshot data, so this single pass should cover both viewport\n // and snapshot sources.\n normalizedItems.forEach(item => {\n if (item.item != null) {\n const key = String(item.item.key);\n const label = item.item.textValue;\n if (\n label != null &&\n (selectedKeySet == null || selectedKeySet.has(key)) &&\n labelCacheRef.current.get(key) !== label\n ) {\n labelCacheRef.current.set(key, label);\n cacheUpdated = true;\n }\n }\n });\n\n if (cacheUpdated) {\n setSelectedItemLabels(new Map(labelCacheRef.current));\n }\n },\n [normalizedItems, props.selectedKeys, props.defaultSelectedKeys]\n );\n\n const onSelectionChangeInternal = useCallback(\n (keys: ItemSelection): void => {\n (onChange ?? onSelectionChange)?.(keys);\n },\n [onChange, onSelectionChange]\n );\n\n return {\n ...props,\n normalizedItems,\n selectedItemLabels,\n showItemIcons: iconColumnName != null,\n onChange: onSelectionChangeInternal,\n onScroll,\n onSearchTextChange,\n };\n}\n\nexport default useMultiPickerProps;\n"],"mappings":"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","ignoreList":[]}
@@ -6,6 +6,12 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
6
6
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
7
  function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
8
8
  function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
9
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
10
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
11
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
12
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
13
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
14
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
9
15
  function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
10
16
  function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
11
17
  import { useCallback, useEffect, useMemo, useState } from 'react';
@@ -33,35 +39,33 @@ var log = Log.module('jsapi-components.usePickerProps');
33
39
 
34
40
  export function usePickerProps(_ref) {
35
41
  var _keyColumn$name;
36
- var {
37
- table: tableSource,
38
- keyColumn: keyColumnName,
39
- labelColumn: labelColumnName,
40
- iconColumn: iconColumnName,
41
- settings,
42
- onChange,
43
- onSelectionChange
44
- } = _ref,
42
+ var tableSource = _ref.table,
43
+ keyColumnName = _ref.keyColumn,
44
+ labelColumnName = _ref.labelColumn,
45
+ iconColumnName = _ref.iconColumn,
46
+ settings = _ref.settings,
47
+ onChange = _ref.onChange,
48
+ onSelectionChange = _ref.onSelectionChange,
45
49
  props = _objectWithoutProperties(_ref, _excluded);
46
- var {
47
- itemHeight
48
- } = usePickerItemScale();
49
- var {
50
- getFormattedString: formatValue,
51
- timeZone
52
- } = useFormatter(settings);
50
+ var _usePickerItemScale = usePickerItemScale(),
51
+ itemHeight = _usePickerItemScale.itemHeight;
52
+ var _useFormatter = useFormatter(settings),
53
+ formatValue = _useFormatter.getFormattedString,
54
+ timeZone = _useFormatter.timeZone;
53
55
 
54
56
  // `null` is a valid value for `selectedKey` in controlled mode, so we check
55
57
  // for explicit `undefined` to identify uncontrolled mode.
56
58
  var isUncontrolled = props.selectedKey === undefined;
57
- var [uncontrolledSelectedKey, setUncontrolledSelectedKey] = useState(props.defaultSelectedKey);
59
+ var _useState = useState(props.defaultSelectedKey),
60
+ _useState2 = _slicedToArray(_useState, 2),
61
+ uncontrolledSelectedKey = _useState2[0],
62
+ setUncontrolledSelectedKey = _useState2[1];
58
63
 
59
64
  // Copy table so we can apply filters without affecting the original table.
60
65
  // (Note that this call is not actually applying any filters. Filter will be
61
66
  // applied in `useSearchableViewportData`.)
62
- var {
63
- data: tableCopy
64
- } = usePromiseFactory(TableUtils.copyTableAndApplyFilters, [tableSource]);
67
+ var _usePromiseFactory = usePromiseFactory(TableUtils.copyTableAndApplyFilters, [tableSource]),
68
+ tableCopy = _usePromiseFactory.data;
65
69
  useWidgetClose(tableCopy);
66
70
  var keyColumn = useMemo(() => tableCopy == null ? null : getItemKeyColumn(tableCopy, keyColumnName), [keyColumnName, tableCopy]);
67
71
  var labelColumn = useMemo(() => tableCopy == null || keyColumn == null ? null : getItemLabelColumn(tableCopy, keyColumn, labelColumnName), [keyColumn, labelColumnName, tableCopy]);
@@ -85,19 +89,18 @@ export function usePickerProps(_ref) {
85
89
  }
86
90
  return index * itemHeight + PICKER_TOP_OFFSET;
87
91
  }), [getItemIndexByValue, itemHeight]);
88
- var {
89
- onScroll,
90
- onSearchTextChange,
91
- setViewport,
92
- viewportData
93
- } = useSearchableViewportData({
94
- reuseItemsOnTableResize: true,
95
- table: tableCopy,
96
- itemHeight,
97
- deserializeRow,
98
- searchColumnNames,
99
- timeZone
100
- });
92
+ var _useSearchableViewpor = useSearchableViewportData({
93
+ reuseItemsOnTableResize: true,
94
+ table: tableCopy,
95
+ itemHeight,
96
+ deserializeRow,
97
+ searchColumnNames,
98
+ timeZone
99
+ }),
100
+ onScroll = _useSearchableViewpor.onScroll,
101
+ onSearchTextChange = _useSearchableViewpor.onSearchTextChange,
102
+ setViewport = _useSearchableViewpor.setViewport,
103
+ viewportData = _useSearchableViewpor.viewportData;
101
104
  useEffect(
102
105
  // Set viewport to include the selected item so that its data will load and
103
106
  // the real `key` will be available to show the selection in the UI.
@@ -1 +1 @@
1
- {"version":3,"file":"usePickerProps.js","names":["useCallback","useEffect","useMemo","useState","PICKER_TOP_OFFSET","usePickerItemScale","TableUtils","Log","usePromiseFactory","useFormatter","getItemKeyColumn","getItemLabelColumn","useItemRowDeserializer","useGetItemIndexByValue","useSearchableViewportData","useWidgetClose","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","setViewportFromSelectedKey","isCanceled","then","catch","err","error","onSelectionChangeInternal","key","_ref3","_objectSpread","normalizedItems","items","showItemIcons"],"sources":["../../../src/spectrum/utils/usePickerProps.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n type ItemKey,\n type NormalizedItem,\n type NormalizedSection,\n PICKER_TOP_OFFSET,\n usePickerItemScale,\n} from '@deephaven/components';\nimport { TableUtils } from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport { usePromiseFactory } from '@deephaven/react-hooks';\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';\nimport useWidgetClose from '../../useWidgetClose';\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 useWidgetClose(tableCopy);\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 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: viewportData.items,\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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","ignoreList":[]}
1
+ {"version":3,"file":"usePickerProps.js","names":["useCallback","useEffect","useMemo","useState","PICKER_TOP_OFFSET","usePickerItemScale","TableUtils","Log","usePromiseFactory","useFormatter","getItemKeyColumn","getItemLabelColumn","useItemRowDeserializer","useGetItemIndexByValue","useSearchableViewportData","useWidgetClose","log","module","usePickerProps","_ref","_keyColumn$name","tableSource","table","keyColumnName","keyColumn","labelColumnName","labelColumn","iconColumnName","iconColumn","settings","onChange","onSelectionChange","props","_objectWithoutProperties","_excluded","_usePickerItemScale","itemHeight","_useFormatter","formatValue","getFormattedString","timeZone","isUncontrolled","selectedKey","undefined","_useState","defaultSelectedKey","_useState2","_slicedToArray","uncontrolledSelectedKey","setUncontrolledSelectedKey","_usePromiseFactory","copyTableAndApplyFilters","tableCopy","data","searchColumnNames","name","deserializeRow","getItemIndexByValue","columnName","value","getInitialScrollPosition","_asyncToGenerator","index","_useSearchableViewpor","reuseItemsOnTableResize","onScroll","onSearchTextChange","setViewport","viewportData","setViewportFromSelectedKey","isCanceled","then","catch","err","error","onSelectionChangeInternal","key","_ref3","_objectSpread","normalizedItems","items","showItemIcons"],"sources":["../../../src/spectrum/utils/usePickerProps.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n type ItemKey,\n type NormalizedItem,\n type NormalizedSection,\n PICKER_TOP_OFFSET,\n usePickerItemScale,\n} from '@deephaven/components';\nimport { TableUtils } from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport { usePromiseFactory } from '@deephaven/react-hooks';\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';\nimport useWidgetClose from '../../useWidgetClose';\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 useWidgetClose(tableCopy);\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 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: viewportData.items,\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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","ignoreList":[]}
@@ -12,9 +12,7 @@ export function useBroadcastChannel() {
12
12
  }, [channel]);
13
13
  useEffect(() => {
14
14
  function handleEvent(event) {
15
- var {
16
- data
17
- } = event;
15
+ var data = event.data;
18
16
  if (!isMessage(data)) {
19
17
  log.debug('Ignoring non-deephaven message', data);
20
18
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"useBroadcastChannel.js","names":["BROADCAST_CHANNEL_NAME","Log","EMPTY_FUNCTION","isMessage","useEffect","useMemo","log","module","useBroadcastChannel","onEvent","arguments","length","undefined","name","channel","BroadcastChannel","close","handleEvent","event","data","debug","addEventListener","removeEventListener"],"sources":["../src/useBroadcastChannel.ts"],"sourcesContent":["import { BROADCAST_CHANNEL_NAME } from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport { EMPTY_FUNCTION, isMessage, type PostMessage } from '@deephaven/utils';\nimport { useEffect, useMemo } from 'react';\n\nconst log = Log.module('useBroadcastChannel');\n\nexport function useBroadcastChannel(\n onEvent: (event: MessageEvent<PostMessage<unknown>>) => void = EMPTY_FUNCTION,\n name = BROADCAST_CHANNEL_NAME\n): BroadcastChannel {\n const channel = useMemo(() => new BroadcastChannel(name), [name]);\n useEffect(\n () => () => {\n channel.close();\n },\n [channel]\n );\n\n useEffect(() => {\n function handleEvent(event: MessageEvent): void {\n const { data } = event;\n if (!isMessage(data)) {\n log.debug('Ignoring non-deephaven message', data);\n return;\n }\n log.debug('event received', data);\n onEvent(event);\n }\n channel.addEventListener('message', handleEvent);\n return () => {\n channel.removeEventListener('message', handleEvent);\n };\n }, [channel, onEvent]);\n\n return channel;\n}\n\nexport default useBroadcastChannel;\n"],"mappings":"AAAA,SAASA,sBAAsB,QAAQ,wBAAwB;AAC/D,OAAOC,GAAG,MAAM,gBAAgB;AAChC,SAASC,cAAc,EAAEC,SAAS,QAA0B,kBAAkB;AAC9E,SAASC,SAAS,EAAEC,OAAO,QAAQ,OAAO;AAE1C,IAAMC,GAAG,GAAGL,GAAG,CAACM,MAAM,CAAC,qBAAqB,CAAC;AAE7C,OAAO,SAASC,mBAAmBA,CAAA,EAGf;EAAA,IAFlBC,OAA4D,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAGR,cAAc;EAAA,IAC7EW,IAAI,GAAAH,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAGV,sBAAsB;EAE7B,IAAMc,OAAO,GAAGT,OAAO,CAAC,MAAM,IAAIU,gBAAgB,CAACF,IAAI,CAAC,EAAE,CAACA,IAAI,CAAC,CAAC;EACjET,SAAS,CACP,MAAM,MAAM;IACVU,OAAO,CAACE,KAAK,CAAC,CAAC;EACjB,CAAC,EACD,CAACF,OAAO,CACV,CAAC;EAEDV,SAAS,CAAC,MAAM;IACd,SAASa,WAAWA,CAACC,KAAmB,EAAQ;MAC9C,IAAM;QAAEC;MAAK,CAAC,GAAGD,KAAK;MACtB,IAAI,CAACf,SAAS,CAACgB,IAAI,CAAC,EAAE;QACpBb,GAAG,CAACc,KAAK,CAAC,gCAAgC,EAAED,IAAI,CAAC;QACjD;MACF;MACAb,GAAG,CAACc,KAAK,CAAC,gBAAgB,EAAED,IAAI,CAAC;MACjCV,OAAO,CAACS,KAAK,CAAC;IAChB;IACAJ,OAAO,CAACO,gBAAgB,CAAC,SAAS,EAAEJ,WAAW,CAAC;IAChD,OAAO,MAAM;MACXH,OAAO,CAACQ,mBAAmB,CAAC,SAAS,EAAEL,WAAW,CAAC;IACrD,CAAC;EACH,CAAC,EAAE,CAACH,OAAO,EAAEL,OAAO,CAAC,CAAC;EAEtB,OAAOK,OAAO;AAChB;AAEA,eAAeN,mBAAmB","ignoreList":[]}
1
+ {"version":3,"file":"useBroadcastChannel.js","names":["BROADCAST_CHANNEL_NAME","Log","EMPTY_FUNCTION","isMessage","useEffect","useMemo","log","module","useBroadcastChannel","onEvent","arguments","length","undefined","name","channel","BroadcastChannel","close","handleEvent","event","data","debug","addEventListener","removeEventListener"],"sources":["../src/useBroadcastChannel.ts"],"sourcesContent":["import { BROADCAST_CHANNEL_NAME } from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport { EMPTY_FUNCTION, isMessage, type PostMessage } from '@deephaven/utils';\nimport { useEffect, useMemo } from 'react';\n\nconst log = Log.module('useBroadcastChannel');\n\nexport function useBroadcastChannel(\n onEvent: (event: MessageEvent<PostMessage<unknown>>) => void = EMPTY_FUNCTION,\n name = BROADCAST_CHANNEL_NAME\n): BroadcastChannel {\n const channel = useMemo(() => new BroadcastChannel(name), [name]);\n useEffect(\n () => () => {\n channel.close();\n },\n [channel]\n );\n\n useEffect(() => {\n function handleEvent(event: MessageEvent): void {\n const { data } = event;\n if (!isMessage(data)) {\n log.debug('Ignoring non-deephaven message', data);\n return;\n }\n log.debug('event received', data);\n onEvent(event);\n }\n channel.addEventListener('message', handleEvent);\n return () => {\n channel.removeEventListener('message', handleEvent);\n };\n }, [channel, onEvent]);\n\n return channel;\n}\n\nexport default useBroadcastChannel;\n"],"mappings":"AAAA,SAASA,sBAAsB,QAAQ,wBAAwB;AAC/D,OAAOC,GAAG,MAAM,gBAAgB;AAChC,SAASC,cAAc,EAAEC,SAAS,QAA0B,kBAAkB;AAC9E,SAASC,SAAS,EAAEC,OAAO,QAAQ,OAAO;AAE1C,IAAMC,GAAG,GAAGL,GAAG,CAACM,MAAM,CAAC,qBAAqB,CAAC;AAE7C,OAAO,SAASC,mBAAmBA,CAAA,EAGf;EAAA,IAFlBC,OAA4D,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAGR,cAAc;EAAA,IAC7EW,IAAI,GAAAH,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAGV,sBAAsB;EAE7B,IAAMc,OAAO,GAAGT,OAAO,CAAC,MAAM,IAAIU,gBAAgB,CAACF,IAAI,CAAC,EAAE,CAACA,IAAI,CAAC,CAAC;EACjET,SAAS,CACP,MAAM,MAAM;IACVU,OAAO,CAACE,KAAK,CAAC,CAAC;EACjB,CAAC,EACD,CAACF,OAAO,CACV,CAAC;EAEDV,SAAS,CAAC,MAAM;IACd,SAASa,WAAWA,CAACC,KAAmB,EAAQ;MAC9C,IAAQC,IAAI,GAAKD,KAAK,CAAdC,IAAI;MACZ,IAAI,CAAChB,SAAS,CAACgB,IAAI,CAAC,EAAE;QACpBb,GAAG,CAACc,KAAK,CAAC,gCAAgC,EAAED,IAAI,CAAC;QACjD;MACF;MACAb,GAAG,CAACc,KAAK,CAAC,gBAAgB,EAAED,IAAI,CAAC;MACjCV,OAAO,CAACS,KAAK,CAAC;IAChB;IACAJ,OAAO,CAACO,gBAAgB,CAAC,SAAS,EAAEJ,WAAW,CAAC;IAChD,OAAO,MAAM;MACXH,OAAO,CAACQ,mBAAmB,CAAC,SAAS,EAAEL,WAAW,CAAC;IACrD,CAAC;EACH,CAAC,EAAE,CAACH,OAAO,EAAEL,OAAO,CAAC,CAAC;EAEtB,OAAOK,OAAO;AAChB;AAEA,eAAeN,mBAAmB","ignoreList":[]}
@@ -1,3 +1,9 @@
1
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
1
7
  import { useCallback, useState } from 'react';
2
8
  import { useDebouncedValue, usePromiseFactory } from '@deephaven/react-hooks';
3
9
  import useTableUtils from "./useTableUtils.js";
@@ -10,17 +16,18 @@ import useTableUtils from "./useTableUtils.js";
10
16
  */
11
17
  export function useCheckIfExistsValue(table, columnNames, debounceMs, isCaseSensitive) {
12
18
  var tableUtils = useTableUtils();
13
- var [valueTrimmed, setValueTrimmed] = useState('');
14
- var {
15
- value: valueTrimmedDebounced
16
- } = useDebouncedValue(valueTrimmed, debounceMs);
19
+ var _useState = useState(''),
20
+ _useState2 = _slicedToArray(_useState, 2),
21
+ valueTrimmed = _useState2[0],
22
+ setValueTrimmed = _useState2[1];
23
+ var _useDebouncedValue = useDebouncedValue(valueTrimmed, debounceMs),
24
+ valueTrimmedDebounced = _useDebouncedValue.value;
17
25
  var trimAndUpdateValue = useCallback(text => {
18
26
  setValueTrimmed(text.trim());
19
27
  }, []);
20
- var {
21
- data: valueExistsData,
22
- isLoading: valueExistsIsLoading
23
- } = usePromiseFactory(tableUtils.doesColumnValueExist, [table, columnNames, valueTrimmedDebounced, isCaseSensitive]);
28
+ var _usePromiseFactory = usePromiseFactory(tableUtils.doesColumnValueExist, [table, columnNames, valueTrimmedDebounced, isCaseSensitive]),
29
+ valueExistsData = _usePromiseFactory.data,
30
+ valueExistsIsLoading = _usePromiseFactory.isLoading;
24
31
 
25
32
  // If value check is loading or if debounce hasn't settled, set
26
33
  // `matchesExistingValue` to null since it is indeterminate
@@ -1 +1 @@
1
- {"version":3,"file":"useCheckIfExistsValue.js","names":["useCallback","useState","useDebouncedValue","usePromiseFactory","useTableUtils","useCheckIfExistsValue","table","columnNames","debounceMs","isCaseSensitive","tableUtils","valueTrimmed","setValueTrimmed","value","valueTrimmedDebounced","trimAndUpdateValue","text","trim","data","valueExistsData","isLoading","valueExistsIsLoading","doesColumnValueExist","valueExists"],"sources":["../src/useCheckIfExistsValue.ts"],"sourcesContent":["import { useCallback, useState } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { useDebouncedValue, usePromiseFactory } from '@deephaven/react-hooks';\nimport useTableUtils from './useTableUtils';\n\nexport interface CheckIfExistsValue {\n /** Current trimmed value */\n valueTrimmed: string;\n\n /** Debounced trimmed value */\n valueTrimmedDebounced: string;\n\n /**\n * Whether the value exists in the given table columns. Will be null whenever\n * the value changes until the next check is complete.\n */\n valueExists: boolean | null;\n\n /** Trims and updates the value */\n trimAndUpdateValue: (value: string) => void;\n}\n\n/**\n * Manage a trimmed text value and check if it exists in a list of table columns.\n * @param table The table to check for the value\n * @param columnNames The column names to check\n * @param debounceMs Debounce timer for re-checking the value\n * @param isCaseSensitive Whether the value check is case sensitive\n */\nexport function useCheckIfExistsValue(\n table: dh.Table | null | undefined,\n columnNames: string | string[],\n debounceMs: number,\n isCaseSensitive: boolean\n): CheckIfExistsValue {\n const tableUtils = useTableUtils();\n\n const [valueTrimmed, setValueTrimmed] = useState('');\n const { value: valueTrimmedDebounced } = useDebouncedValue(\n valueTrimmed,\n debounceMs\n );\n\n const trimAndUpdateValue = useCallback((text: string) => {\n setValueTrimmed(text.trim());\n }, []);\n\n const { data: valueExistsData, isLoading: valueExistsIsLoading } =\n usePromiseFactory(tableUtils.doesColumnValueExist, [\n table,\n columnNames,\n valueTrimmedDebounced,\n isCaseSensitive,\n ]);\n\n // If value check is loading or if debounce hasn't settled, set\n // `matchesExistingValue` to null since it is indeterminate\n const valueExists =\n valueExistsIsLoading || valueTrimmed !== valueTrimmedDebounced\n ? null\n : valueExistsData;\n\n return {\n valueTrimmed,\n valueTrimmedDebounced,\n valueExists,\n trimAndUpdateValue,\n };\n}\n\nexport default useCheckIfExistsValue;\n"],"mappings":"AAAA,SAASA,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AAE7C,SAASC,iBAAiB,EAAEC,iBAAiB,QAAQ,wBAAwB;AAAC,OACvEC,aAAa;AAmBpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,qBAAqBA,CACnCC,KAAkC,EAClCC,WAA8B,EAC9BC,UAAkB,EAClBC,eAAwB,EACJ;EACpB,IAAMC,UAAU,GAAGN,aAAa,CAAC,CAAC;EAElC,IAAM,CAACO,YAAY,EAAEC,eAAe,CAAC,GAAGX,QAAQ,CAAC,EAAE,CAAC;EACpD,IAAM;IAAEY,KAAK,EAAEC;EAAsB,CAAC,GAAGZ,iBAAiB,CACxDS,YAAY,EACZH,UACF,CAAC;EAED,IAAMO,kBAAkB,GAAGf,WAAW,CAAEgB,IAAY,IAAK;IACvDJ,eAAe,CAACI,IAAI,CAACC,IAAI,CAAC,CAAC,CAAC;EAC9B,CAAC,EAAE,EAAE,CAAC;EAEN,IAAM;IAAEC,IAAI,EAAEC,eAAe;IAAEC,SAAS,EAAEC;EAAqB,CAAC,GAC9DlB,iBAAiB,CAACO,UAAU,CAACY,oBAAoB,EAAE,CACjDhB,KAAK,EACLC,WAAW,EACXO,qBAAqB,EACrBL,eAAe,CAChB,CAAC;;EAEJ;EACA;EACA,IAAMc,WAAW,GACfF,oBAAoB,IAAIV,YAAY,KAAKG,qBAAqB,GAC1D,IAAI,GACJK,eAAe;EAErB,OAAO;IACLR,YAAY;IACZG,qBAAqB;IACrBS,WAAW;IACXR;EACF,CAAC;AACH;AAEA,eAAeV,qBAAqB","ignoreList":[]}
1
+ {"version":3,"file":"useCheckIfExistsValue.js","names":["useCallback","useState","useDebouncedValue","usePromiseFactory","useTableUtils","useCheckIfExistsValue","table","columnNames","debounceMs","isCaseSensitive","tableUtils","_useState","_useState2","_slicedToArray","valueTrimmed","setValueTrimmed","_useDebouncedValue","valueTrimmedDebounced","value","trimAndUpdateValue","text","trim","_usePromiseFactory","doesColumnValueExist","valueExistsData","data","valueExistsIsLoading","isLoading","valueExists"],"sources":["../src/useCheckIfExistsValue.ts"],"sourcesContent":["import { useCallback, useState } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { useDebouncedValue, usePromiseFactory } from '@deephaven/react-hooks';\nimport useTableUtils from './useTableUtils';\n\nexport interface CheckIfExistsValue {\n /** Current trimmed value */\n valueTrimmed: string;\n\n /** Debounced trimmed value */\n valueTrimmedDebounced: string;\n\n /**\n * Whether the value exists in the given table columns. Will be null whenever\n * the value changes until the next check is complete.\n */\n valueExists: boolean | null;\n\n /** Trims and updates the value */\n trimAndUpdateValue: (value: string) => void;\n}\n\n/**\n * Manage a trimmed text value and check if it exists in a list of table columns.\n * @param table The table to check for the value\n * @param columnNames The column names to check\n * @param debounceMs Debounce timer for re-checking the value\n * @param isCaseSensitive Whether the value check is case sensitive\n */\nexport function useCheckIfExistsValue(\n table: dh.Table | null | undefined,\n columnNames: string | string[],\n debounceMs: number,\n isCaseSensitive: boolean\n): CheckIfExistsValue {\n const tableUtils = useTableUtils();\n\n const [valueTrimmed, setValueTrimmed] = useState('');\n const { value: valueTrimmedDebounced } = useDebouncedValue(\n valueTrimmed,\n debounceMs\n );\n\n const trimAndUpdateValue = useCallback((text: string) => {\n setValueTrimmed(text.trim());\n }, []);\n\n const { data: valueExistsData, isLoading: valueExistsIsLoading } =\n usePromiseFactory(tableUtils.doesColumnValueExist, [\n table,\n columnNames,\n valueTrimmedDebounced,\n isCaseSensitive,\n ]);\n\n // If value check is loading or if debounce hasn't settled, set\n // `matchesExistingValue` to null since it is indeterminate\n const valueExists =\n valueExistsIsLoading || valueTrimmed !== valueTrimmedDebounced\n ? null\n : valueExistsData;\n\n return {\n valueTrimmed,\n valueTrimmedDebounced,\n valueExists,\n trimAndUpdateValue,\n };\n}\n\nexport default useCheckIfExistsValue;\n"],"mappings":";;;;;;AAAA,SAASA,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AAE7C,SAASC,iBAAiB,EAAEC,iBAAiB,QAAQ,wBAAwB;AAAC,OACvEC,aAAa;AAmBpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,qBAAqBA,CACnCC,KAAkC,EAClCC,WAA8B,EAC9BC,UAAkB,EAClBC,eAAwB,EACJ;EACpB,IAAMC,UAAU,GAAGN,aAAa,CAAC,CAAC;EAElC,IAAAO,SAAA,GAAwCV,QAAQ,CAAC,EAAE,CAAC;IAAAW,UAAA,GAAAC,cAAA,CAAAF,SAAA;IAA7CG,YAAY,GAAAF,UAAA;IAAEG,eAAe,GAAAH,UAAA;EACpC,IAAAI,kBAAA,GAAyCd,iBAAiB,CACxDY,YAAY,EACZN,UACF,CAAC;IAHcS,qBAAqB,GAAAD,kBAAA,CAA5BE,KAAK;EAKb,IAAMC,kBAAkB,GAAGnB,WAAW,CAAEoB,IAAY,IAAK;IACvDL,eAAe,CAACK,IAAI,CAACC,IAAI,CAAC,CAAC,CAAC;EAC9B,CAAC,EAAE,EAAE,CAAC;EAEN,IAAAC,kBAAA,GACEnB,iBAAiB,CAACO,UAAU,CAACa,oBAAoB,EAAE,CACjDjB,KAAK,EACLC,WAAW,EACXU,qBAAqB,EACrBR,eAAe,CAChB,CAAC;IANUe,eAAe,GAAAF,kBAAA,CAArBG,IAAI;IAA8BC,oBAAoB,GAAAJ,kBAAA,CAA/BK,SAAS;;EAQxC;EACA;EACA,IAAMC,WAAW,GACfF,oBAAoB,IAAIZ,YAAY,KAAKG,qBAAqB,GAC1D,IAAI,GACJO,eAAe;EAErB,OAAO;IACLV,YAAY;IACZG,qBAAqB;IACrBW,WAAW;IACXT;EACF,CAAC;AACH;AAEA,eAAed,qBAAqB","ignoreList":[]}
@@ -16,10 +16,8 @@ export var DEBOUNCE_VIEWPORT_SEARCH_MS = 200;
16
16
  export function useDebouncedViewportSearch(viewportData, columnName) {
17
17
  var debounceMs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : DEBOUNCE_VIEWPORT_SEARCH_MS;
18
18
  var tableUtils = useTableUtils();
19
- var {
20
- table,
21
- applyFiltersAndRefresh
22
- } = viewportData;
19
+ var table = viewportData.table,
20
+ applyFiltersAndRefresh = viewportData.applyFiltersAndRefresh;
23
21
  var debouncedSearch = useMemo(() => debounce(searchText => {
24
22
  log.debug("Applying debounced searchText '".concat(searchText, "'"));
25
23
  if (table == null) {
@@ -1 +1 @@
1
- {"version":3,"file":"useDebouncedViewportSearch.js","names":["debounce","Log","useEffect","useMemo","useTableUtils","log","module","DEBOUNCE_VIEWPORT_SEARCH_MS","useDebouncedViewportSearch","viewportData","columnName","debounceMs","arguments","length","undefined","tableUtils","table","applyFiltersAndRefresh","debouncedSearch","searchText","debug","concat","searchTextTrimmed","trim","column","findColumn","value","makeFilterValue","type","filter","contains","cancel"],"sources":["../src/useDebouncedViewportSearch.ts"],"sourcesContent":["import debounce from 'lodash.debounce';\nimport type { dh } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport { useEffect, useMemo } from 'react';\nimport { type UseViewportDataResult } from './useViewportData';\nimport useTableUtils from './useTableUtils';\n\nconst log = Log.module('useDebouncedViewportSearch');\n\nexport const DEBOUNCE_VIEWPORT_SEARCH_MS = 200;\n\n/**\n * React hook that returns a debounced search callback for filtering a table\n * viewport.\n * @param viewportData Table viewport to filter\n * @param columnName Column name to filter by\n * @param debounceMs Millisecond value to debounce\n * @returns A debounced search function\n */\nexport function useDebouncedViewportSearch<\n I,\n T extends dh.Table | dh.TreeTable,\n>(\n viewportData: UseViewportDataResult<I, T>,\n columnName: string,\n debounceMs = DEBOUNCE_VIEWPORT_SEARCH_MS\n): (searchText: string) => void {\n const tableUtils = useTableUtils();\n const { table, applyFiltersAndRefresh } = viewportData;\n\n const debouncedSearch = useMemo(\n () =>\n debounce((searchText: string) => {\n log.debug(`Applying debounced searchText '${searchText}'`);\n\n if (table == null) {\n return;\n }\n\n const searchTextTrimmed = searchText.trim();\n\n if (searchTextTrimmed === '') {\n applyFiltersAndRefresh([]);\n return;\n }\n\n const column = table.findColumn(columnName);\n const value = tableUtils.makeFilterValue(\n column.type,\n searchTextTrimmed\n );\n const filter = [column.filter().contains(value)];\n\n applyFiltersAndRefresh(filter);\n }, debounceMs),\n [applyFiltersAndRefresh, columnName, debounceMs, table, tableUtils]\n );\n\n useEffect(\n () => () => {\n log.debug('Cancelling debounced search function');\n debouncedSearch.cancel();\n },\n [debouncedSearch]\n );\n\n return debouncedSearch;\n}\n\nexport default useDebouncedViewportSearch;\n"],"mappings":"AAAA,OAAOA,QAAQ,MAAM,iBAAiB;AAEtC,OAAOC,GAAG,MAAM,gBAAgB;AAChC,SAASC,SAAS,EAAEC,OAAO,QAAQ,OAAO;AAAC,OAEpCC,aAAa;AAEpB,IAAMC,GAAG,GAAGJ,GAAG,CAACK,MAAM,CAAC,4BAA4B,CAAC;AAEpD,OAAO,IAAMC,2BAA2B,GAAG,GAAG;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,0BAA0BA,CAIxCC,YAAyC,EACzCC,UAAkB,EAEY;EAAA,IAD9BC,UAAU,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAGL,2BAA2B;EAExC,IAAMQ,UAAU,GAAGX,aAAa,CAAC,CAAC;EAClC,IAAM;IAAEY,KAAK;IAAEC;EAAuB,CAAC,GAAGR,YAAY;EAEtD,IAAMS,eAAe,GAAGf,OAAO,CAC7B,MACEH,QAAQ,CAAEmB,UAAkB,IAAK;IAC/Bd,GAAG,CAACe,KAAK,mCAAAC,MAAA,CAAmCF,UAAU,MAAG,CAAC;IAE1D,IAAIH,KAAK,IAAI,IAAI,EAAE;MACjB;IACF;IAEA,IAAMM,iBAAiB,GAAGH,UAAU,CAACI,IAAI,CAAC,CAAC;IAE3C,IAAID,iBAAiB,KAAK,EAAE,EAAE;MAC5BL,sBAAsB,CAAC,EAAE,CAAC;MAC1B;IACF;IAEA,IAAMO,MAAM,GAAGR,KAAK,CAACS,UAAU,CAACf,UAAU,CAAC;IAC3C,IAAMgB,KAAK,GAAGX,UAAU,CAACY,eAAe,CACtCH,MAAM,CAACI,IAAI,EACXN,iBACF,CAAC;IACD,IAAMO,MAAM,GAAG,CAACL,MAAM,CAACK,MAAM,CAAC,CAAC,CAACC,QAAQ,CAACJ,KAAK,CAAC,CAAC;IAEhDT,sBAAsB,CAACY,MAAM,CAAC;EAChC,CAAC,EAAElB,UAAU,CAAC,EAChB,CAACM,sBAAsB,EAAEP,UAAU,EAAEC,UAAU,EAAEK,KAAK,EAAED,UAAU,CACpE,CAAC;EAEDb,SAAS,CACP,MAAM,MAAM;IACVG,GAAG,CAACe,KAAK,CAAC,sCAAsC,CAAC;IACjDF,eAAe,CAACa,MAAM,CAAC,CAAC;EAC1B,CAAC,EACD,CAACb,eAAe,CAClB,CAAC;EAED,OAAOA,eAAe;AACxB;AAEA,eAAeV,0BAA0B","ignoreList":[]}
1
+ {"version":3,"file":"useDebouncedViewportSearch.js","names":["debounce","Log","useEffect","useMemo","useTableUtils","log","module","DEBOUNCE_VIEWPORT_SEARCH_MS","useDebouncedViewportSearch","viewportData","columnName","debounceMs","arguments","length","undefined","tableUtils","table","applyFiltersAndRefresh","debouncedSearch","searchText","debug","concat","searchTextTrimmed","trim","column","findColumn","value","makeFilterValue","type","filter","contains","cancel"],"sources":["../src/useDebouncedViewportSearch.ts"],"sourcesContent":["import debounce from 'lodash.debounce';\nimport type { dh } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport { useEffect, useMemo } from 'react';\nimport { type UseViewportDataResult } from './useViewportData';\nimport useTableUtils from './useTableUtils';\n\nconst log = Log.module('useDebouncedViewportSearch');\n\nexport const DEBOUNCE_VIEWPORT_SEARCH_MS = 200;\n\n/**\n * React hook that returns a debounced search callback for filtering a table\n * viewport.\n * @param viewportData Table viewport to filter\n * @param columnName Column name to filter by\n * @param debounceMs Millisecond value to debounce\n * @returns A debounced search function\n */\nexport function useDebouncedViewportSearch<\n I,\n T extends dh.Table | dh.TreeTable,\n>(\n viewportData: UseViewportDataResult<I, T>,\n columnName: string,\n debounceMs = DEBOUNCE_VIEWPORT_SEARCH_MS\n): (searchText: string) => void {\n const tableUtils = useTableUtils();\n const { table, applyFiltersAndRefresh } = viewportData;\n\n const debouncedSearch = useMemo(\n () =>\n debounce((searchText: string) => {\n log.debug(`Applying debounced searchText '${searchText}'`);\n\n if (table == null) {\n return;\n }\n\n const searchTextTrimmed = searchText.trim();\n\n if (searchTextTrimmed === '') {\n applyFiltersAndRefresh([]);\n return;\n }\n\n const column = table.findColumn(columnName);\n const value = tableUtils.makeFilterValue(\n column.type,\n searchTextTrimmed\n );\n const filter = [column.filter().contains(value)];\n\n applyFiltersAndRefresh(filter);\n }, debounceMs),\n [applyFiltersAndRefresh, columnName, debounceMs, table, tableUtils]\n );\n\n useEffect(\n () => () => {\n log.debug('Cancelling debounced search function');\n debouncedSearch.cancel();\n },\n [debouncedSearch]\n );\n\n return debouncedSearch;\n}\n\nexport default useDebouncedViewportSearch;\n"],"mappings":"AAAA,OAAOA,QAAQ,MAAM,iBAAiB;AAEtC,OAAOC,GAAG,MAAM,gBAAgB;AAChC,SAASC,SAAS,EAAEC,OAAO,QAAQ,OAAO;AAAC,OAEpCC,aAAa;AAEpB,IAAMC,GAAG,GAAGJ,GAAG,CAACK,MAAM,CAAC,4BAA4B,CAAC;AAEpD,OAAO,IAAMC,2BAA2B,GAAG,GAAG;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,0BAA0BA,CAIxCC,YAAyC,EACzCC,UAAkB,EAEY;EAAA,IAD9BC,UAAU,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAGL,2BAA2B;EAExC,IAAMQ,UAAU,GAAGX,aAAa,CAAC,CAAC;EAClC,IAAQY,KAAK,GAA6BP,YAAY,CAA9CO,KAAK;IAAEC,sBAAsB,GAAKR,YAAY,CAAvCQ,sBAAsB;EAErC,IAAMC,eAAe,GAAGf,OAAO,CAC7B,MACEH,QAAQ,CAAEmB,UAAkB,IAAK;IAC/Bd,GAAG,CAACe,KAAK,mCAAAC,MAAA,CAAmCF,UAAU,MAAG,CAAC;IAE1D,IAAIH,KAAK,IAAI,IAAI,EAAE;MACjB;IACF;IAEA,IAAMM,iBAAiB,GAAGH,UAAU,CAACI,IAAI,CAAC,CAAC;IAE3C,IAAID,iBAAiB,KAAK,EAAE,EAAE;MAC5BL,sBAAsB,CAAC,EAAE,CAAC;MAC1B;IACF;IAEA,IAAMO,MAAM,GAAGR,KAAK,CAACS,UAAU,CAACf,UAAU,CAAC;IAC3C,IAAMgB,KAAK,GAAGX,UAAU,CAACY,eAAe,CACtCH,MAAM,CAACI,IAAI,EACXN,iBACF,CAAC;IACD,IAAMO,MAAM,GAAG,CAACL,MAAM,CAACK,MAAM,CAAC,CAAC,CAACC,QAAQ,CAACJ,KAAK,CAAC,CAAC;IAEhDT,sBAAsB,CAACY,MAAM,CAAC;EAChC,CAAC,EAAElB,UAAU,CAAC,EAChB,CAACM,sBAAsB,EAAEP,UAAU,EAAEC,UAAU,EAAEK,KAAK,EAAED,UAAU,CACpE,CAAC;EAEDb,SAAS,CACP,MAAM,MAAM;IACVG,GAAG,CAACe,KAAK,CAAC,sCAAsC,CAAC;IACjDF,eAAe,CAACa,MAAM,CAAC,CAAC;EAC1B,CAAC,EACD,CAACb,eAAe,CAClB,CAAC;EAED,OAAOA,eAAe;AACxB;AAEA,eAAeV,0BAA0B","ignoreList":[]}
@@ -10,12 +10,10 @@ export var DEBOUNCE_MS = 300;
10
10
  * a user rapidly changes selections, e.g. in a checkbox list.
11
11
  */
12
12
  export function useDebouncedViewportSelectionFilter(_ref) {
13
- var {
14
- viewportData,
15
- columnName,
16
- shouldSelectAllOnNoSelection,
17
- mapItemToValue
18
- } = _ref;
13
+ var viewportData = _ref.viewportData,
14
+ columnName = _ref.columnName,
15
+ shouldSelectAllOnNoSelection = _ref.shouldSelectAllOnNoSelection,
16
+ mapItemToValue = _ref.mapItemToValue;
19
17
  var tableUtils = useTableUtils();
20
18
 
21
19
  // Map selection to values contained in the column to filter
@@ -23,9 +21,8 @@ export function useDebouncedViewportSelectionFilter(_ref) {
23
21
 
24
22
  // Debounce so user can rapidly select multiple items in a row without the
25
23
  // cost of updating the table on each change
26
- var {
27
- value: debouncedValuesSelection
28
- } = useDebouncedValue(valuesSelection, DEBOUNCE_MS);
24
+ var _useDebouncedValue = useDebouncedValue(valuesSelection, DEBOUNCE_MS),
25
+ debouncedValuesSelection = _useDebouncedValue.value;
29
26
 
30
27
  // In cases where a user rapidly selects then deselects the selection
31
28
  // reference will change, but the state it represents will remain unchanged.
@@ -1 +1 @@
1
- {"version":3,"file":"useDebouncedViewportSelectionFilter.js","names":["createKeyedItemKey","createSelectedValuesFilter","isSelectionMaybeInvertedEqual","useDebouncedValue","useIsEqualMemo","useMappedSelection","useMemo","useTableUtils","DEBOUNCE_MS","useDebouncedViewportSelectionFilter","_ref","viewportData","columnName","shouldSelectAllOnNoSelection","mapItemToValue","tableUtils","valuesSelection","value","debouncedValuesSelection","memoValuesSelection","selection","isInverted"],"sources":["../src/useDebouncedViewportSelectionFilter.ts"],"sourcesContent":["import {\n createKeyedItemKey,\n createSelectedValuesFilter,\n type FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport {\n isSelectionMaybeInvertedEqual,\n useDebouncedValue,\n useIsEqualMemo,\n useMappedSelection,\n type WindowedListData,\n} from '@deephaven/react-hooks';\nimport { type KeyedItem } from '@deephaven/utils';\nimport { useMemo } from 'react';\nimport useTableUtils from './useTableUtils';\n\nexport const DEBOUNCE_MS = 300;\n\nexport interface UseDebouncedViewportSelectionFilterOptions<TItem, TValue> {\n viewportData: WindowedListData<KeyedItem<TItem>>;\n columnName: string;\n shouldSelectAllOnNoSelection: boolean;\n mapItemToValue: (item: KeyedItem<TItem>) => TValue;\n}\n\n/**\n * Creates a filter factory for the current selected keys of a viewport. The\n * selected keys will be mapped to values to match in a given column name. The\n * resulting filter factory is debounced to allow some cushion for cases where\n * a user rapidly changes selections, e.g. in a checkbox list.\n */\nexport function useDebouncedViewportSelectionFilter<TItem, TValue>({\n viewportData,\n columnName,\n shouldSelectAllOnNoSelection,\n mapItemToValue,\n}: UseDebouncedViewportSelectionFilterOptions<\n TItem,\n TValue\n>): FilterConditionFactory {\n const tableUtils = useTableUtils();\n\n // Map selection to values contained in the column to filter\n const valuesSelection = useMappedSelection(\n viewportData,\n mapItemToValue,\n createKeyedItemKey\n );\n\n // Debounce so user can rapidly select multiple items in a row without the\n // cost of updating the table on each change\n const { value: debouncedValuesSelection } = useDebouncedValue(\n valuesSelection,\n DEBOUNCE_MS\n );\n\n // In cases where a user rapidly selects then deselects the selection\n // reference will change, but the state it represents will remain unchanged.\n // Memoize based on the selection value to avoid unnecessarily re-applying\n // table filters.\n const memoValuesSelection = useIsEqualMemo(\n debouncedValuesSelection,\n isSelectionMaybeInvertedEqual\n );\n\n return useMemo(\n () =>\n createSelectedValuesFilter(\n tableUtils,\n columnName,\n memoValuesSelection.selection,\n shouldSelectAllOnNoSelection,\n memoValuesSelection.isInverted\n ),\n [columnName, memoValuesSelection, shouldSelectAllOnNoSelection, tableUtils]\n );\n}\n\nexport default useDebouncedViewportSelectionFilter;\n"],"mappings":"AAAA,SACEA,kBAAkB,EAClBC,0BAA0B,QAErB,wBAAwB;AAC/B,SACEC,6BAA6B,EAC7BC,iBAAiB,EACjBC,cAAc,EACdC,kBAAkB,QAEb,wBAAwB;AAE/B,SAASC,OAAO,QAAQ,OAAO;AAAC,OACzBC,aAAa;AAEpB,OAAO,IAAMC,WAAW,GAAG,GAAG;AAS9B;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,mCAAmCA,CAAAC,IAAA,EAQxB;EAAA,IARwC;IACjEC,YAAY;IACZC,UAAU;IACVC,4BAA4B;IAC5BC;EAIF,CAAC,GAAAJ,IAAA;EACC,IAAMK,UAAU,GAAGR,aAAa,CAAC,CAAC;;EAElC;EACA,IAAMS,eAAe,GAAGX,kBAAkB,CACxCM,YAAY,EACZG,cAAc,EACdd,kBACF,CAAC;;EAED;EACA;EACA,IAAM;IAAEiB,KAAK,EAAEC;EAAyB,CAAC,GAAGf,iBAAiB,CAC3Da,eAAe,EACfR,WACF,CAAC;;EAED;EACA;EACA;EACA;EACA,IAAMW,mBAAmB,GAAGf,cAAc,CACxCc,wBAAwB,EACxBhB,6BACF,CAAC;EAED,OAAOI,OAAO,CACZ,MACEL,0BAA0B,CACxBc,UAAU,EACVH,UAAU,EACVO,mBAAmB,CAACC,SAAS,EAC7BP,4BAA4B,EAC5BM,mBAAmB,CAACE,UACtB,CAAC,EACH,CAACT,UAAU,EAAEO,mBAAmB,EAAEN,4BAA4B,EAAEE,UAAU,CAC5E,CAAC;AACH;AAEA,eAAeN,mCAAmC","ignoreList":[]}
1
+ {"version":3,"file":"useDebouncedViewportSelectionFilter.js","names":["createKeyedItemKey","createSelectedValuesFilter","isSelectionMaybeInvertedEqual","useDebouncedValue","useIsEqualMemo","useMappedSelection","useMemo","useTableUtils","DEBOUNCE_MS","useDebouncedViewportSelectionFilter","_ref","viewportData","columnName","shouldSelectAllOnNoSelection","mapItemToValue","tableUtils","valuesSelection","_useDebouncedValue","debouncedValuesSelection","value","memoValuesSelection","selection","isInverted"],"sources":["../src/useDebouncedViewportSelectionFilter.ts"],"sourcesContent":["import {\n createKeyedItemKey,\n createSelectedValuesFilter,\n type FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport {\n isSelectionMaybeInvertedEqual,\n useDebouncedValue,\n useIsEqualMemo,\n useMappedSelection,\n type WindowedListData,\n} from '@deephaven/react-hooks';\nimport { type KeyedItem } from '@deephaven/utils';\nimport { useMemo } from 'react';\nimport useTableUtils from './useTableUtils';\n\nexport const DEBOUNCE_MS = 300;\n\nexport interface UseDebouncedViewportSelectionFilterOptions<TItem, TValue> {\n viewportData: WindowedListData<KeyedItem<TItem>>;\n columnName: string;\n shouldSelectAllOnNoSelection: boolean;\n mapItemToValue: (item: KeyedItem<TItem>) => TValue;\n}\n\n/**\n * Creates a filter factory for the current selected keys of a viewport. The\n * selected keys will be mapped to values to match in a given column name. The\n * resulting filter factory is debounced to allow some cushion for cases where\n * a user rapidly changes selections, e.g. in a checkbox list.\n */\nexport function useDebouncedViewportSelectionFilter<TItem, TValue>({\n viewportData,\n columnName,\n shouldSelectAllOnNoSelection,\n mapItemToValue,\n}: UseDebouncedViewportSelectionFilterOptions<\n TItem,\n TValue\n>): FilterConditionFactory {\n const tableUtils = useTableUtils();\n\n // Map selection to values contained in the column to filter\n const valuesSelection = useMappedSelection(\n viewportData,\n mapItemToValue,\n createKeyedItemKey\n );\n\n // Debounce so user can rapidly select multiple items in a row without the\n // cost of updating the table on each change\n const { value: debouncedValuesSelection } = useDebouncedValue(\n valuesSelection,\n DEBOUNCE_MS\n );\n\n // In cases where a user rapidly selects then deselects the selection\n // reference will change, but the state it represents will remain unchanged.\n // Memoize based on the selection value to avoid unnecessarily re-applying\n // table filters.\n const memoValuesSelection = useIsEqualMemo(\n debouncedValuesSelection,\n isSelectionMaybeInvertedEqual\n );\n\n return useMemo(\n () =>\n createSelectedValuesFilter(\n tableUtils,\n columnName,\n memoValuesSelection.selection,\n shouldSelectAllOnNoSelection,\n memoValuesSelection.isInverted\n ),\n [columnName, memoValuesSelection, shouldSelectAllOnNoSelection, tableUtils]\n );\n}\n\nexport default useDebouncedViewportSelectionFilter;\n"],"mappings":"AAAA,SACEA,kBAAkB,EAClBC,0BAA0B,QAErB,wBAAwB;AAC/B,SACEC,6BAA6B,EAC7BC,iBAAiB,EACjBC,cAAc,EACdC,kBAAkB,QAEb,wBAAwB;AAE/B,SAASC,OAAO,QAAQ,OAAO;AAAC,OACzBC,aAAa;AAEpB,OAAO,IAAMC,WAAW,GAAG,GAAG;AAS9B;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,mCAAmCA,CAAAC,IAAA,EAQxB;EAAA,IAPzBC,YAAY,GAAAD,IAAA,CAAZC,YAAY;IACZC,UAAU,GAAAF,IAAA,CAAVE,UAAU;IACVC,4BAA4B,GAAAH,IAAA,CAA5BG,4BAA4B;IAC5BC,cAAc,GAAAJ,IAAA,CAAdI,cAAc;EAKd,IAAMC,UAAU,GAAGR,aAAa,CAAC,CAAC;;EAElC;EACA,IAAMS,eAAe,GAAGX,kBAAkB,CACxCM,YAAY,EACZG,cAAc,EACdd,kBACF,CAAC;;EAED;EACA;EACA,IAAAiB,kBAAA,GAA4Cd,iBAAiB,CAC3Da,eAAe,EACfR,WACF,CAAC;IAHcU,wBAAwB,GAAAD,kBAAA,CAA/BE,KAAK;;EAKb;EACA;EACA;EACA;EACA,IAAMC,mBAAmB,GAAGhB,cAAc,CACxCc,wBAAwB,EACxBhB,6BACF,CAAC;EAED,OAAOI,OAAO,CACZ,MACEL,0BAA0B,CACxBc,UAAU,EACVH,UAAU,EACVQ,mBAAmB,CAACC,SAAS,EAC7BR,4BAA4B,EAC5BO,mBAAmB,CAACE,UACtB,CAAC,EACH,CAACV,UAAU,EAAEQ,mBAAmB,EAAEP,4BAA4B,EAAEE,UAAU,CAC5E,CAAC;AACH;AAEA,eAAeN,mCAAmC","ignoreList":[]}
@@ -19,12 +19,10 @@ export function useFormatter(settings) {
19
19
  bindAllMethods(instance);
20
20
  return instance;
21
21
  }, [dh, settings]);
22
- var {
23
- getColumnFormat,
24
- getColumnFormatMapForType,
25
- getColumnTypeFormatter,
26
- getFormattedString
27
- } = formatter;
22
+ var getColumnFormat = formatter.getColumnFormat,
23
+ getColumnFormatMapForType = formatter.getColumnFormatMapForType,
24
+ getColumnTypeFormatter = formatter.getColumnTypeFormatter,
25
+ getFormattedString = formatter.getFormattedString;
28
26
  return {
29
27
  getColumnFormat,
30
28
  getColumnFormatMapForType,
@@ -1 +1 @@
1
- {"version":3,"file":"useFormatter.js","names":["useApi","createFormatterFromSettings","bindAllMethods","useMemo","useFormatter","settings","dh","formatter","instance","getColumnFormat","getColumnFormatMapForType","getColumnTypeFormatter","getFormattedString","timeZone"],"sources":["../src/useFormatter.ts"],"sourcesContent":["import { useApi } from '@deephaven/jsapi-bootstrap';\nimport {\n createFormatterFromSettings,\n type Formatter,\n type Settings,\n} from '@deephaven/jsapi-utils';\nimport { bindAllMethods } from '@deephaven/utils';\nimport { useMemo } from 'react';\n\nexport type UseFormatterResult = Pick<\n Formatter,\n | 'getColumnFormat'\n | 'getColumnFormatMapForType'\n | 'getColumnTypeFormatter'\n | 'getFormattedString'\n | 'timeZone'\n>;\n\n/**\n * Returns a subset of members of a `Formatter` instance. The `Formatter` will be\n * constructed based on the given options or fallback to the configuration found\n * in the current `FormatSettingsContext`. Members that are functions are bound\n * to the `Formatter` instance, so they are safe to destructure. Static methods\n * can still be accessed statically from the `Formatter` class.\n * @param settings Optional settings to use when constructing the `Formatter`\n */\nexport function useFormatter(settings?: Settings): UseFormatterResult {\n const dh = useApi();\n\n const formatter = useMemo(() => {\n const instance = createFormatterFromSettings(dh, settings);\n\n // Bind all methods so we can destructure them\n bindAllMethods(instance);\n\n return instance;\n }, [dh, settings]);\n\n const {\n getColumnFormat,\n getColumnFormatMapForType,\n getColumnTypeFormatter,\n getFormattedString,\n } = formatter;\n\n return {\n getColumnFormat,\n getColumnFormatMapForType,\n getColumnTypeFormatter,\n getFormattedString,\n timeZone: formatter.timeZone,\n };\n}\n\nexport default useFormatter;\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,4BAA4B;AACnD,SACEC,2BAA2B,QAGtB,wBAAwB;AAC/B,SAASC,cAAc,QAAQ,kBAAkB;AACjD,SAASC,OAAO,QAAQ,OAAO;AAW/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAACC,QAAmB,EAAsB;EACpE,IAAMC,EAAE,GAAGN,MAAM,CAAC,CAAC;EAEnB,IAAMO,SAAS,GAAGJ,OAAO,CAAC,MAAM;IAC9B,IAAMK,QAAQ,GAAGP,2BAA2B,CAACK,EAAE,EAAED,QAAQ,CAAC;;IAE1D;IACAH,cAAc,CAACM,QAAQ,CAAC;IAExB,OAAOA,QAAQ;EACjB,CAAC,EAAE,CAACF,EAAE,EAAED,QAAQ,CAAC,CAAC;EAElB,IAAM;IACJI,eAAe;IACfC,yBAAyB;IACzBC,sBAAsB;IACtBC;EACF,CAAC,GAAGL,SAAS;EAEb,OAAO;IACLE,eAAe;IACfC,yBAAyB;IACzBC,sBAAsB;IACtBC,kBAAkB;IAClBC,QAAQ,EAAEN,SAAS,CAACM;EACtB,CAAC;AACH;AAEA,eAAeT,YAAY","ignoreList":[]}
1
+ {"version":3,"file":"useFormatter.js","names":["useApi","createFormatterFromSettings","bindAllMethods","useMemo","useFormatter","settings","dh","formatter","instance","getColumnFormat","getColumnFormatMapForType","getColumnTypeFormatter","getFormattedString","timeZone"],"sources":["../src/useFormatter.ts"],"sourcesContent":["import { useApi } from '@deephaven/jsapi-bootstrap';\nimport {\n createFormatterFromSettings,\n type Formatter,\n type Settings,\n} from '@deephaven/jsapi-utils';\nimport { bindAllMethods } from '@deephaven/utils';\nimport { useMemo } from 'react';\n\nexport type UseFormatterResult = Pick<\n Formatter,\n | 'getColumnFormat'\n | 'getColumnFormatMapForType'\n | 'getColumnTypeFormatter'\n | 'getFormattedString'\n | 'timeZone'\n>;\n\n/**\n * Returns a subset of members of a `Formatter` instance. The `Formatter` will be\n * constructed based on the given options or fallback to the configuration found\n * in the current `FormatSettingsContext`. Members that are functions are bound\n * to the `Formatter` instance, so they are safe to destructure. Static methods\n * can still be accessed statically from the `Formatter` class.\n * @param settings Optional settings to use when constructing the `Formatter`\n */\nexport function useFormatter(settings?: Settings): UseFormatterResult {\n const dh = useApi();\n\n const formatter = useMemo(() => {\n const instance = createFormatterFromSettings(dh, settings);\n\n // Bind all methods so we can destructure them\n bindAllMethods(instance);\n\n return instance;\n }, [dh, settings]);\n\n const {\n getColumnFormat,\n getColumnFormatMapForType,\n getColumnTypeFormatter,\n getFormattedString,\n } = formatter;\n\n return {\n getColumnFormat,\n getColumnFormatMapForType,\n getColumnTypeFormatter,\n getFormattedString,\n timeZone: formatter.timeZone,\n };\n}\n\nexport default useFormatter;\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,4BAA4B;AACnD,SACEC,2BAA2B,QAGtB,wBAAwB;AAC/B,SAASC,cAAc,QAAQ,kBAAkB;AACjD,SAASC,OAAO,QAAQ,OAAO;AAW/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAACC,QAAmB,EAAsB;EACpE,IAAMC,EAAE,GAAGN,MAAM,CAAC,CAAC;EAEnB,IAAMO,SAAS,GAAGJ,OAAO,CAAC,MAAM;IAC9B,IAAMK,QAAQ,GAAGP,2BAA2B,CAACK,EAAE,EAAED,QAAQ,CAAC;;IAE1D;IACAH,cAAc,CAACM,QAAQ,CAAC;IAExB,OAAOA,QAAQ;EACjB,CAAC,EAAE,CAACF,EAAE,EAAED,QAAQ,CAAC,CAAC;EAElB,IACEI,eAAe,GAIbF,SAAS,CAJXE,eAAe;IACfC,yBAAyB,GAGvBH,SAAS,CAHXG,yBAAyB;IACzBC,sBAAsB,GAEpBJ,SAAS,CAFXI,sBAAsB;IACtBC,kBAAkB,GAChBL,SAAS,CADXK,kBAAkB;EAGpB,OAAO;IACLH,eAAe;IACfC,yBAAyB;IACzBC,sBAAsB;IACtBC,kBAAkB;IAClBC,QAAQ,EAAEN,SAAS,CAACM;EACtB,CAAC;AACH;AAEA,eAAeT,YAAY","ignoreList":[]}