@deephaven/jsapi-components 1.2.1-3-revert-plotly.1 → 1.2.1-beta.1

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 (43) hide show
  1. package/dist/ColumnNameError.js.map +1 -1
  2. package/dist/Constants.js.map +1 -1
  3. package/dist/HookTestUtils.js.map +1 -1
  4. package/dist/TableDisconnectError.js.map +1 -1
  5. package/dist/TableDropdown.js.map +1 -1
  6. package/dist/TableInput.js.map +1 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/spectrum/ComboBox.js.map +1 -1
  9. package/dist/spectrum/ListView.js.map +1 -1
  10. package/dist/spectrum/Picker.js.map +1 -1
  11. package/dist/spectrum/PickerProps.js.map +1 -1
  12. package/dist/spectrum/index.js.map +1 -1
  13. package/dist/spectrum/utils/index.js.map +1 -1
  14. package/dist/spectrum/utils/itemUtils.js.map +1 -1
  15. package/dist/spectrum/utils/useItemRowDeserializer.js.map +1 -1
  16. package/dist/spectrum/utils/usePickerProps.js.map +1 -1
  17. package/dist/useBroadcastChannel.js.map +1 -1
  18. package/dist/useBroadcastLoginListener.js.map +1 -1
  19. package/dist/useCheckIfExistsValue.js.map +1 -1
  20. package/dist/useDebouncedViewportSearch.js.map +1 -1
  21. package/dist/useDebouncedViewportSelectionFilter.js.map +1 -1
  22. package/dist/useFilterConditionFactories.js.map +1 -1
  23. package/dist/useFilteredItemsWithDefaultValue.js.map +1 -1
  24. package/dist/useFormatter.js.map +1 -1
  25. package/dist/useGetItemIndexByValue.js.map +1 -1
  26. package/dist/useGetItemPosition.js.map +1 -1
  27. package/dist/useInitializeViewportData.js.map +1 -1
  28. package/dist/useNotNullOrEmptyFilter.js.map +1 -1
  29. package/dist/usePickerWithSelectedValues.js.map +1 -1
  30. package/dist/useSearchableViewportData.js.map +1 -1
  31. package/dist/useSelectDistinctTable.js.map +1 -1
  32. package/dist/useSetPaddedViewportCallback.js.map +1 -1
  33. package/dist/useShowOnlyEmptyFilter.js.map +1 -1
  34. package/dist/useTable.js.map +1 -1
  35. package/dist/useTableClose.js.map +1 -1
  36. package/dist/useTableColumn.js.map +1 -1
  37. package/dist/useTableListener.js.map +1 -1
  38. package/dist/useTableSize.js.map +1 -1
  39. package/dist/useTableUtils.js.map +1 -1
  40. package/dist/useValueFilter.js.map +1 -1
  41. package/dist/useViewportData.js.map +1 -1
  42. package/dist/useViewportFilter.js.map +1 -1
  43. package/package.json +10 -10
@@ -1 +1 @@
1
- {"version":3,"file":"ColumnNameError.js","names":["ColumnNameError","Error","constructor","arguments","_defineProperty"],"sources":["../src/ColumnNameError.ts"],"sourcesContent":["class ColumnNameError extends Error {\n isColumnNameError = true;\n}\n\nexport default ColumnNameError;\n"],"mappings":";;;AAAA,MAAMA,eAAe,SAASC,KAAK,CAAC;EAAAC,YAAA;IAAA,SAAAC,SAAA;IAAAC,eAAA,4BACd,IAAI;EAAA;AAC1B;AAEA,eAAeJ,eAAe"}
1
+ {"version":3,"file":"ColumnNameError.js","names":["ColumnNameError","Error","constructor","arguments","_defineProperty"],"sources":["../src/ColumnNameError.ts"],"sourcesContent":["class ColumnNameError extends Error {\n isColumnNameError = true;\n}\n\nexport default ColumnNameError;\n"],"mappings":";;;AAAA,MAAMA,eAAe,SAASC,KAAK,CAAC;EAAAC,YAAA;IAAA,SAAAC,SAAA;IAAAC,eAAA,4BACd,IAAI;EAAA;AAC1B;AAEA,eAAeJ,eAAe","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"Constants.js","names":["SCROLL_DEBOUNCE_MS","SEARCH_DEBOUNCE_MS","VIEWPORT_PADDING","VIEWPORT_SIZE"],"sources":["../src/Constants.ts"],"sourcesContent":["export const SCROLL_DEBOUNCE_MS = 150;\nexport const SEARCH_DEBOUNCE_MS = 200;\nexport const VIEWPORT_PADDING = 250;\nexport const VIEWPORT_SIZE = 500;\n"],"mappings":"AAAA,OAAO,IAAMA,kBAAkB,GAAG,GAAG;AACrC,OAAO,IAAMC,kBAAkB,GAAG,GAAG;AACrC,OAAO,IAAMC,gBAAgB,GAAG,GAAG;AACnC,OAAO,IAAMC,aAAa,GAAG,GAAG"}
1
+ {"version":3,"file":"Constants.js","names":["SCROLL_DEBOUNCE_MS","SEARCH_DEBOUNCE_MS","VIEWPORT_PADDING","VIEWPORT_SIZE"],"sources":["../src/Constants.ts"],"sourcesContent":["export const SCROLL_DEBOUNCE_MS = 150;\nexport const SEARCH_DEBOUNCE_MS = 200;\nexport const VIEWPORT_PADDING = 250;\nexport const VIEWPORT_SIZE = 500;\n"],"mappings":"AAAA,OAAO,IAAMA,kBAAkB,GAAG,GAAG;AACrC,OAAO,IAAMC,kBAAkB,GAAG,GAAG;AACrC,OAAO,IAAMC,gBAAgB,GAAG,GAAG;AACnC,OAAO,IAAMC,aAAa,GAAG,GAAG","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"HookTestUtils.js","names":["React","ApiContext","jsx","_jsx","makeApiContextWrapper","dh","ApiContextWrapper","_ref","children","Provider","value"],"sources":["../src/HookTestUtils.tsx"],"sourcesContent":["import React, { type ReactNode } from 'react';\nimport { ApiContext } from '@deephaven/jsapi-bootstrap';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\n\nexport function makeApiContextWrapper(dh: typeof DhType) {\n return function ApiContextWrapper({\n children,\n }: {\n children?: ReactNode;\n }): JSX.Element {\n return <ApiContext.Provider value={dh}>{children}</ApiContext.Provider>;\n };\n}\n\nexport default {\n makeApiContextWrapper,\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAA0B,OAAO;AAC7C,SAASC,UAAU,QAAQ,4BAA4B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAGxD,OAAO,SAASC,qBAAqBA,CAACC,EAAiB,EAAE;EACvD,OAAO,SAASC,iBAAiBA,CAAAC,IAAA,EAIjB;IAAA,IAJkB;MAChCC;IAGF,CAAC,GAAAD,IAAA;IACC,oBAAOJ,IAAA,CAACF,UAAU,CAACQ,QAAQ;MAACC,KAAK,EAAEL,EAAG;MAAAG,QAAA,EAAEA;IAAQ,CAAsB,CAAC;EACzE,CAAC;AACH;AAEA,eAAe;EACbJ;AACF,CAAC"}
1
+ {"version":3,"file":"HookTestUtils.js","names":["React","ApiContext","jsx","_jsx","makeApiContextWrapper","dh","ApiContextWrapper","_ref","children","Provider","value"],"sources":["../src/HookTestUtils.tsx"],"sourcesContent":["import React, { type ReactNode } from 'react';\nimport { ApiContext } from '@deephaven/jsapi-bootstrap';\nimport type { dh as DhType } from '@deephaven/jsapi-types';\n\nexport function makeApiContextWrapper(dh: typeof DhType) {\n return function ApiContextWrapper({\n children,\n }: {\n children?: ReactNode;\n }): JSX.Element {\n return <ApiContext.Provider value={dh}>{children}</ApiContext.Provider>;\n };\n}\n\nexport default {\n makeApiContextWrapper,\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAA0B,OAAO;AAC7C,SAASC,UAAU,QAAQ,4BAA4B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAGxD,OAAO,SAASC,qBAAqBA,CAACC,EAAiB,EAAE;EACvD,OAAO,SAASC,iBAAiBA,CAAAC,IAAA,EAIjB;IAAA,IAJkB;MAChCC;IAGF,CAAC,GAAAD,IAAA;IACC,oBAAOJ,IAAA,CAACF,UAAU,CAACQ,QAAQ;MAACC,KAAK,EAAEL,EAAG;MAAAG,QAAA,EAAEA;IAAQ,CAAsB,CAAC;EACzE,CAAC;AACH;AAEA,eAAe;EACbJ;AACF,CAAC","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"TableDisconnectError.js","names":["TableDisconnectError","Error","constructor","arguments","_defineProperty"],"sources":["../src/TableDisconnectError.ts"],"sourcesContent":["class TableDisconnectError extends Error {\n isTableDisconnectError = true;\n}\n\nexport default TableDisconnectError;\n"],"mappings":";;;AAAA,MAAMA,oBAAoB,SAASC,KAAK,CAAC;EAAAC,YAAA;IAAA,SAAAC,SAAA;IAAAC,eAAA,iCACd,IAAI;EAAA;AAC/B;AAEA,eAAeJ,oBAAoB"}
1
+ {"version":3,"file":"TableDisconnectError.js","names":["TableDisconnectError","Error","constructor","arguments","_defineProperty"],"sources":["../src/TableDisconnectError.ts"],"sourcesContent":["class TableDisconnectError extends Error {\n isTableDisconnectError = true;\n}\n\nexport default TableDisconnectError;\n"],"mappings":";;;AAAA,MAAMA,oBAAoB,SAASC,KAAK,CAAC;EAAAC,YAAA;IAAA,SAAAC,SAAA;IAAAC,eAAA,iCACd,IAAI;EAAA;AAC/B;AAEA,eAAeJ,oBAAoB","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"TableDropdown.js","names":["React","useCallback","useEffect","useMemo","useState","Option","Select","useApi","EMPTY_ARRAY","jsx","_jsx","isJavaObject","value","equals","defaultFormatValue","concat","TableDropdown","_ref","column","table","filter","onChange","selectedValue","disabled","className","formatValue","maxSize","dh","values","setValues","undefined","tableColumn","columns","applyFilter","subscription","setViewport","addEventListener","Table","EVENT_UPDATED","event","detail","newValues","rows","map","row","_row$get","get","close","allValues","selectedIndex","findIndex","handleChange","newSelectedIndex","children","i"],"sources":["../src/TableDropdown.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Option, Select } from '@deephaven/components';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport { type dh as DhType } from '@deephaven/jsapi-types';\nimport { EMPTY_ARRAY } from '@deephaven/utils';\n\ntype JavaObject = {\n equals: (other: unknown) => boolean;\n};\n\nfunction isJavaObject(value: unknown): value is JavaObject {\n return (\n typeof value === 'object' &&\n value != null &&\n 'equals' in value &&\n typeof value.equals === 'function'\n );\n}\n\nfunction defaultFormatValue(value: unknown): string {\n return `${value}`;\n}\n\nexport type TableDropdownProps = {\n /** Table to use as the source of data. Does not own the table, does not close it on unmount. */\n table?: DhType.Table;\n\n /** Column to read data from the table. Defaults to the first column in the table if it's not provided. */\n column?: DhType.Column;\n\n /** Triggered when the dropdown selection has changed */\n onChange: (value: unknown) => void;\n\n /** Filter to apply on the table */\n filter?: readonly DhType.FilterCondition[];\n\n /** The currently selected value */\n selectedValue?: unknown;\n\n /** Whether the control is disabled */\n disabled?: boolean;\n\n /** Class to apply to the select element */\n className?: string;\n\n /** Optional function to format the value for display */\n formatValue?: (value: unknown) => string;\n\n /** Maximum number of elements to load */\n maxSize?: number;\n};\n\n/**\n * Dropdown that displays the values of a column in a table.\n */\nexport function TableDropdown({\n column,\n table,\n filter = EMPTY_ARRAY,\n onChange,\n selectedValue,\n disabled,\n className,\n formatValue = defaultFormatValue,\n maxSize = 1000,\n}: TableDropdownProps): JSX.Element {\n const dh = useApi();\n const [values, setValues] = useState<unknown[]>([]);\n\n useEffect(() => {\n if (table == null) {\n setValues([]);\n return undefined;\n }\n\n const tableColumn = column ?? table.columns[0];\n // Need to set a viewport on the table and start listening to get the values to populate the dropdown\n table.applyFilter(filter as DhType.FilterCondition[]);\n const subscription = table.setViewport(0, maxSize, [tableColumn]);\n\n subscription.addEventListener(\n dh.Table.EVENT_UPDATED,\n (event: DhType.Event<DhType.ViewportData>) => {\n const { detail } = event;\n // Core JSAPI returns undefined for null table values,\n // coalesce with null to differentiate null from no selection in the dropdown\n // https://github.com/deephaven/deephaven-core/issues/5400\n const newValues = detail.rows.map(row => row.get(tableColumn) ?? null);\n setValues(newValues);\n }\n );\n\n return () => {\n subscription.close();\n };\n }, [column, dh, filter, maxSize, table]);\n\n // If the selected value is undefined, add a placeholder item\n const allValues = useMemo(() => {\n if (selectedValue === undefined) {\n return [undefined, ...values];\n }\n return values;\n }, [selectedValue, values]);\n\n // Since values could be anything, not just strings, track the selected index based on the current data\n const selectedIndex = useMemo(\n // eslint-disable-next-line eqeqeq\n () =>\n allValues.findIndex(\n value =>\n value === selectedValue ||\n (isJavaObject(value) && value.equals(selectedValue))\n ),\n [selectedValue, allValues]\n );\n\n const handleChange = useCallback(\n newSelectedIndex => {\n onChange(allValues[newSelectedIndex]);\n },\n [onChange, allValues]\n );\n\n return (\n <Select\n className={className}\n value={selectedIndex}\n onChange={handleChange}\n disabled={disabled}\n >\n {allValues.map((value, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <Option key={`${i}`} value={i}>\n {formatValue(value)}\n </Option>\n ))}\n </Select>\n );\n}\n\nexport default TableDropdown;\n"],"mappings":"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"}
1
+ {"version":3,"file":"TableDropdown.js","names":["React","useCallback","useEffect","useMemo","useState","Option","Select","useApi","EMPTY_ARRAY","jsx","_jsx","isJavaObject","value","equals","defaultFormatValue","concat","TableDropdown","_ref","column","table","filter","onChange","selectedValue","disabled","className","formatValue","maxSize","dh","values","setValues","undefined","tableColumn","columns","applyFilter","subscription","setViewport","addEventListener","Table","EVENT_UPDATED","event","detail","newValues","rows","map","row","_row$get","get","close","allValues","selectedIndex","findIndex","handleChange","newSelectedIndex","children","i"],"sources":["../src/TableDropdown.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Option, Select } from '@deephaven/components';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport { type dh as DhType } from '@deephaven/jsapi-types';\nimport { EMPTY_ARRAY } from '@deephaven/utils';\n\ntype JavaObject = {\n equals: (other: unknown) => boolean;\n};\n\nfunction isJavaObject(value: unknown): value is JavaObject {\n return (\n typeof value === 'object' &&\n value != null &&\n 'equals' in value &&\n typeof value.equals === 'function'\n );\n}\n\nfunction defaultFormatValue(value: unknown): string {\n return `${value}`;\n}\n\nexport type TableDropdownProps = {\n /** Table to use as the source of data. Does not own the table, does not close it on unmount. */\n table?: DhType.Table;\n\n /** Column to read data from the table. Defaults to the first column in the table if it's not provided. */\n column?: DhType.Column;\n\n /** Triggered when the dropdown selection has changed */\n onChange: (value: unknown) => void;\n\n /** Filter to apply on the table */\n filter?: readonly DhType.FilterCondition[];\n\n /** The currently selected value */\n selectedValue?: unknown;\n\n /** Whether the control is disabled */\n disabled?: boolean;\n\n /** Class to apply to the select element */\n className?: string;\n\n /** Optional function to format the value for display */\n formatValue?: (value: unknown) => string;\n\n /** Maximum number of elements to load */\n maxSize?: number;\n};\n\n/**\n * Dropdown that displays the values of a column in a table.\n */\nexport function TableDropdown({\n column,\n table,\n filter = EMPTY_ARRAY,\n onChange,\n selectedValue,\n disabled,\n className,\n formatValue = defaultFormatValue,\n maxSize = 1000,\n}: TableDropdownProps): JSX.Element {\n const dh = useApi();\n const [values, setValues] = useState<unknown[]>([]);\n\n useEffect(() => {\n if (table == null) {\n setValues([]);\n return undefined;\n }\n\n const tableColumn = column ?? table.columns[0];\n // Need to set a viewport on the table and start listening to get the values to populate the dropdown\n table.applyFilter(filter as DhType.FilterCondition[]);\n const subscription = table.setViewport(0, maxSize, [tableColumn]);\n\n subscription.addEventListener(\n dh.Table.EVENT_UPDATED,\n (event: DhType.Event<DhType.ViewportData>) => {\n const { detail } = event;\n // Core JSAPI returns undefined for null table values,\n // coalesce with null to differentiate null from no selection in the dropdown\n // https://github.com/deephaven/deephaven-core/issues/5400\n const newValues = detail.rows.map(row => row.get(tableColumn) ?? null);\n setValues(newValues);\n }\n );\n\n return () => {\n subscription.close();\n };\n }, [column, dh, filter, maxSize, table]);\n\n // If the selected value is undefined, add a placeholder item\n const allValues = useMemo(() => {\n if (selectedValue === undefined) {\n return [undefined, ...values];\n }\n return values;\n }, [selectedValue, values]);\n\n // Since values could be anything, not just strings, track the selected index based on the current data\n const selectedIndex = useMemo(\n // eslint-disable-next-line eqeqeq\n () =>\n allValues.findIndex(\n value =>\n value === selectedValue ||\n (isJavaObject(value) && value.equals(selectedValue))\n ),\n [selectedValue, allValues]\n );\n\n const handleChange = useCallback(\n newSelectedIndex => {\n onChange(allValues[newSelectedIndex]);\n },\n [onChange, allValues]\n );\n\n return (\n <Select\n className={className}\n value={selectedIndex}\n onChange={handleChange}\n disabled={disabled}\n >\n {allValues.map((value, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <Option key={`${i}`} value={i}>\n {formatValue(value)}\n </Option>\n ))}\n </Select>\n );\n}\n\nexport default TableDropdown;\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"TableInput.js","names":["React","useCallback","useState","useRef","useEffect","useMemo","classNames","LoadingOverlay","SearchInput","SelectValueList","PromiseUtils","Log","Formatter","FormatterUtils","useApi","useTableColumn","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","log","module","SIZE_LIMIT","TableInput","props","_table$size","_error$message","className","undefined","columnName","settings","defaultValue","isInvalid","onChange","onBlur","table","tablePromise","parentRef","dh","formatter","columnFormats","getColumnFormats","dateTimeFormatterOptions","getDateTimeFormatterOptions","defaultDecimalFormatOptions","defaultIntegerFormatOptions","searchValue","setSearchValue","selection","setSelection","Set","setTable","listRef","itemCount","Math","min","size","column","data","error","formatValue","value","getFormattedString","type","name","concat","items","updatedSelection","removedItems","result","forEach","v","isSelected","has","delete","push","displayValue","debug2","newSelection","Array","from","initTable","_ref","_asyncToGenerator","promise","resolved","debug","e","isCanceled","_x","apply","arguments","cancelablePromise","makeCancelable","cancel","handleSearchChange","target","index","findIndex","item","includes","_listRef$current","current","scrollIntoView","handleSelect","length","selectedValue","add","handleSelectAll","values","map","handleClearSelection","handleViewportChange","handleChildBlur","_parentRef$current","relatedTarget","HTMLElement","contains","isEmpty","ref","children","disabled","placeholder","offset","onSelect","onViewportChange","onClick","isLoaded","isLoading","errorMessage","message","displayName","defaultProps"],"sources":["../src/TableInput.tsx"],"sourcesContent":["import React, {\n useCallback,\n useState,\n useRef,\n useEffect,\n useMemo,\n} from 'react';\nimport classNames from 'classnames';\nimport {\n LoadingOverlay,\n SearchInput,\n SelectValueList,\n} from '@deephaven/components';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { PromiseUtils } from '@deephaven/utils';\nimport Log from '@deephaven/log';\nimport {\n Formatter,\n FormatterUtils,\n type Settings,\n} from '@deephaven/jsapi-utils';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport useTableColumn from './useTableColumn';\n\nimport './TableInput.scss';\n\nconst log = Log.module('TableInput');\n\ntype Value = dh.LongWrapper | string;\n\ninterface SelectValueItem {\n displayValue: string;\n value: Value;\n isSelected: boolean;\n}\n\ninterface TableInputProps {\n className?: string;\n columnName: string;\n settings: Settings;\n defaultValue: Value[];\n isInvalid?: boolean;\n table: Promise<dh.Table>;\n onChange: (items: Value[]) => void;\n onBlur?: () => void;\n}\n\nconst SIZE_LIMIT = 250;\n\nfunction TableInput(props: TableInputProps): JSX.Element {\n const {\n className = undefined,\n columnName,\n settings,\n defaultValue = [],\n isInvalid = false,\n onChange = () => false,\n onBlur = () => false,\n table: tablePromise,\n } = props;\n const parentRef = useRef<HTMLDivElement>(null);\n const dh = useApi();\n const formatter = useMemo(() => {\n const columnFormats = FormatterUtils.getColumnFormats(settings);\n const dateTimeFormatterOptions =\n FormatterUtils.getDateTimeFormatterOptions(settings);\n const {\n defaultDecimalFormatOptions = {},\n defaultIntegerFormatOptions = {},\n } = settings;\n return new Formatter(\n dh,\n columnFormats,\n dateTimeFormatterOptions,\n defaultDecimalFormatOptions,\n defaultIntegerFormatOptions\n );\n }, [dh, settings]);\n const [searchValue, setSearchValue] = useState('');\n const [selection, setSelection] = useState(new Set(defaultValue));\n const [table, setTable] = useState<dh.Table | undefined>();\n const listRef = useRef<SelectValueList<Value>>(null);\n\n const itemCount = Math.min(table?.size ?? 0, SIZE_LIMIT);\n\n const { column, data, error } = useTableColumn(\n table,\n 0,\n SIZE_LIMIT - 1,\n columnName\n );\n\n const formatValue = useCallback(\n value =>\n column\n ? formatter.getFormattedString(value, column.type, column.name)\n : `${value}`,\n [column, formatter]\n );\n\n const [items, updatedSelection] = useMemo(() => {\n const removedItems = new Set(selection);\n const result: SelectValueItem[] = [];\n if (data == null) {\n // Viewport not initialized\n return [result, null];\n }\n (data as Value[]).forEach(v => {\n const value = `${v}`;\n const isSelected = selection.has(value);\n if (isSelected) {\n removedItems.delete(value);\n }\n result.push({\n value,\n displayValue: formatValue(v),\n isSelected,\n });\n });\n\n if (removedItems.size > 0) {\n log.debug2('Selection has items that are missing from the viewport');\n const newSelection = new Set(selection);\n Array.from(removedItems).forEach(value => {\n newSelection.delete(value);\n });\n return [result, newSelection];\n }\n return [result, null];\n }, [data, selection, formatValue]);\n\n useEffect(() => {\n if (updatedSelection !== null) {\n setSelection(updatedSelection);\n onChange(Array.from(updatedSelection));\n }\n }, [onChange, updatedSelection]);\n\n const initTable = useCallback(async promise => {\n try {\n const resolved = await promise;\n log.debug('Table resolved', resolved);\n setTable(resolved);\n } catch (e) {\n if (PromiseUtils.isCanceled(e)) {\n return;\n }\n log.error(e);\n }\n }, []);\n\n useEffect(() => {\n const cancelablePromise = PromiseUtils.makeCancelable(tablePromise);\n initTable(cancelablePromise);\n return () => {\n log.debug2('Cancel table promise');\n cancelablePromise.cancel();\n };\n }, [tablePromise, initTable]);\n\n // Scroll the item matching the input into view\n const handleSearchChange = useCallback(\n e => {\n const { value } = e.target;\n setSearchValue(value);\n const index = items.findIndex(item => item.displayValue.includes(value));\n if (index > -1) {\n log.debug2(`Found ${value} at index ${index}`);\n listRef.current?.scrollIntoView(index);\n } else {\n log.debug2(`${value} not found`);\n }\n },\n [items, listRef]\n );\n\n const handleSelect = useCallback(\n index => {\n log.debug('handleSelect', index);\n if (index >= items.length) {\n log.error('Invalid index', index);\n return;\n }\n const selectedValue = items[index].value;\n const newSelection = new Set(selection);\n if (items[index].isSelected) {\n newSelection.delete(selectedValue);\n } else {\n newSelection.add(selectedValue);\n }\n setSelection(newSelection);\n onChange(Array.from(newSelection));\n },\n [onChange, items, selection]\n );\n\n const handleSelectAll = useCallback(() => {\n const values = items.map(item => item.value);\n const newSelection = new Set(values);\n setSelection(newSelection);\n onChange(values);\n }, [items, onChange]);\n\n const handleClearSelection = useCallback(() => {\n setSelection(new Set());\n onChange([]);\n }, [onChange]);\n\n const handleViewportChange = useCallback(() => {\n // no-op\n }, []);\n\n const handleChildBlur = useCallback(\n (e: React.FocusEvent<Element>) => {\n const { relatedTarget } = e;\n log.debug(\n 'handleChildBlur',\n relatedTarget,\n relatedTarget instanceof HTMLElement,\n parentRef.current,\n parentRef.current?.contains(relatedTarget)\n );\n if (\n !relatedTarget ||\n (parentRef.current &&\n relatedTarget instanceof HTMLElement &&\n !parentRef.current.contains(relatedTarget))\n ) {\n onBlur();\n }\n },\n [onBlur]\n );\n\n const isEmpty = items.length === 0;\n\n return (\n <div\n ref={parentRef}\n className={classNames(\n 'table-input-container d-flex flex-column position-relative',\n className\n )}\n >\n <SearchInput\n disabled={!!error || isEmpty}\n value={searchValue}\n placeholder=\"Search\"\n onChange={handleSearchChange}\n className=\"mb-2 d-flex\"\n onBlur={handleChildBlur}\n />\n <SelectValueList\n className=\"table-input-list\"\n disabled={table === undefined || isEmpty}\n isInvalid={isInvalid}\n items={isEmpty ? [{ value: 'Empty', isSelected: false }] : items}\n itemCount={itemCount}\n offset={0}\n onSelect={handleSelect}\n onViewportChange={handleViewportChange}\n ref={listRef}\n onBlur={handleChildBlur}\n />\n\n {table && (\n <div className=\"meta-row\">\n <div className=\"d-flex align-items-center text-muted small\">\n {table != null && table.size > itemCount && (\n <>Table is too large, showing the first {SIZE_LIMIT} items.</>\n )}\n </div>\n <div>\n <button\n type=\"button\"\n className=\"btn btn-link\"\n onBlur={handleChildBlur}\n onClick={handleSelectAll}\n >\n Select All\n </button>\n <button\n type=\"button\"\n className=\"btn btn-link mr-a\"\n onBlur={handleChildBlur}\n onClick={handleClearSelection}\n >\n Clear\n </button>\n </div>\n </div>\n )}\n\n {table == null ||\n (error && (\n <div className=\"h-100 w-100 position-absolute\">\n <LoadingOverlay\n isLoaded={table != null}\n isLoading={table == null && error == null}\n errorMessage={error?.message ?? null}\n />\n </div>\n ))}\n </div>\n );\n}\n\nTableInput.displayName = 'TableInput';\n\nTableInput.defaultProps = {\n isInvalid: false,\n className: undefined,\n};\n\nexport default TableInput;\n"],"mappings":"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"}
1
+ {"version":3,"file":"TableInput.js","names":["React","useCallback","useState","useRef","useEffect","useMemo","classNames","LoadingOverlay","SearchInput","SelectValueList","PromiseUtils","Log","Formatter","FormatterUtils","useApi","useTableColumn","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","log","module","SIZE_LIMIT","TableInput","props","_table$size","_error$message","className","undefined","columnName","settings","defaultValue","isInvalid","onChange","onBlur","table","tablePromise","parentRef","dh","formatter","columnFormats","getColumnFormats","dateTimeFormatterOptions","getDateTimeFormatterOptions","defaultDecimalFormatOptions","defaultIntegerFormatOptions","searchValue","setSearchValue","selection","setSelection","Set","setTable","listRef","itemCount","Math","min","size","column","data","error","formatValue","value","getFormattedString","type","name","concat","items","updatedSelection","removedItems","result","forEach","v","isSelected","has","delete","push","displayValue","debug2","newSelection","Array","from","initTable","_ref","_asyncToGenerator","promise","resolved","debug","e","isCanceled","_x","apply","arguments","cancelablePromise","makeCancelable","cancel","handleSearchChange","target","index","findIndex","item","includes","_listRef$current","current","scrollIntoView","handleSelect","length","selectedValue","add","handleSelectAll","values","map","handleClearSelection","handleViewportChange","handleChildBlur","_parentRef$current","relatedTarget","HTMLElement","contains","isEmpty","ref","children","disabled","placeholder","offset","onSelect","onViewportChange","onClick","isLoaded","isLoading","errorMessage","message","displayName","defaultProps"],"sources":["../src/TableInput.tsx"],"sourcesContent":["import React, {\n useCallback,\n useState,\n useRef,\n useEffect,\n useMemo,\n} from 'react';\nimport classNames from 'classnames';\nimport {\n LoadingOverlay,\n SearchInput,\n SelectValueList,\n} from '@deephaven/components';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { PromiseUtils } from '@deephaven/utils';\nimport Log from '@deephaven/log';\nimport {\n Formatter,\n FormatterUtils,\n type Settings,\n} from '@deephaven/jsapi-utils';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport useTableColumn from './useTableColumn';\n\nimport './TableInput.scss';\n\nconst log = Log.module('TableInput');\n\ntype Value = dh.LongWrapper | string;\n\ninterface SelectValueItem {\n displayValue: string;\n value: Value;\n isSelected: boolean;\n}\n\ninterface TableInputProps {\n className?: string;\n columnName: string;\n settings: Settings;\n defaultValue: Value[];\n isInvalid?: boolean;\n table: Promise<dh.Table>;\n onChange: (items: Value[]) => void;\n onBlur?: () => void;\n}\n\nconst SIZE_LIMIT = 250;\n\nfunction TableInput(props: TableInputProps): JSX.Element {\n const {\n className = undefined,\n columnName,\n settings,\n defaultValue = [],\n isInvalid = false,\n onChange = () => false,\n onBlur = () => false,\n table: tablePromise,\n } = props;\n const parentRef = useRef<HTMLDivElement>(null);\n const dh = useApi();\n const formatter = useMemo(() => {\n const columnFormats = FormatterUtils.getColumnFormats(settings);\n const dateTimeFormatterOptions =\n FormatterUtils.getDateTimeFormatterOptions(settings);\n const {\n defaultDecimalFormatOptions = {},\n defaultIntegerFormatOptions = {},\n } = settings;\n return new Formatter(\n dh,\n columnFormats,\n dateTimeFormatterOptions,\n defaultDecimalFormatOptions,\n defaultIntegerFormatOptions\n );\n }, [dh, settings]);\n const [searchValue, setSearchValue] = useState('');\n const [selection, setSelection] = useState(new Set(defaultValue));\n const [table, setTable] = useState<dh.Table | undefined>();\n const listRef = useRef<SelectValueList<Value>>(null);\n\n const itemCount = Math.min(table?.size ?? 0, SIZE_LIMIT);\n\n const { column, data, error } = useTableColumn(\n table,\n 0,\n SIZE_LIMIT - 1,\n columnName\n );\n\n const formatValue = useCallback(\n value =>\n column\n ? formatter.getFormattedString(value, column.type, column.name)\n : `${value}`,\n [column, formatter]\n );\n\n const [items, updatedSelection] = useMemo(() => {\n const removedItems = new Set(selection);\n const result: SelectValueItem[] = [];\n if (data == null) {\n // Viewport not initialized\n return [result, null];\n }\n (data as Value[]).forEach(v => {\n const value = `${v}`;\n const isSelected = selection.has(value);\n if (isSelected) {\n removedItems.delete(value);\n }\n result.push({\n value,\n displayValue: formatValue(v),\n isSelected,\n });\n });\n\n if (removedItems.size > 0) {\n log.debug2('Selection has items that are missing from the viewport');\n const newSelection = new Set(selection);\n Array.from(removedItems).forEach(value => {\n newSelection.delete(value);\n });\n return [result, newSelection];\n }\n return [result, null];\n }, [data, selection, formatValue]);\n\n useEffect(() => {\n if (updatedSelection !== null) {\n setSelection(updatedSelection);\n onChange(Array.from(updatedSelection));\n }\n }, [onChange, updatedSelection]);\n\n const initTable = useCallback(async promise => {\n try {\n const resolved = await promise;\n log.debug('Table resolved', resolved);\n setTable(resolved);\n } catch (e) {\n if (PromiseUtils.isCanceled(e)) {\n return;\n }\n log.error(e);\n }\n }, []);\n\n useEffect(() => {\n const cancelablePromise = PromiseUtils.makeCancelable(tablePromise);\n initTable(cancelablePromise);\n return () => {\n log.debug2('Cancel table promise');\n cancelablePromise.cancel();\n };\n }, [tablePromise, initTable]);\n\n // Scroll the item matching the input into view\n const handleSearchChange = useCallback(\n e => {\n const { value } = e.target;\n setSearchValue(value);\n const index = items.findIndex(item => item.displayValue.includes(value));\n if (index > -1) {\n log.debug2(`Found ${value} at index ${index}`);\n listRef.current?.scrollIntoView(index);\n } else {\n log.debug2(`${value} not found`);\n }\n },\n [items, listRef]\n );\n\n const handleSelect = useCallback(\n index => {\n log.debug('handleSelect', index);\n if (index >= items.length) {\n log.error('Invalid index', index);\n return;\n }\n const selectedValue = items[index].value;\n const newSelection = new Set(selection);\n if (items[index].isSelected) {\n newSelection.delete(selectedValue);\n } else {\n newSelection.add(selectedValue);\n }\n setSelection(newSelection);\n onChange(Array.from(newSelection));\n },\n [onChange, items, selection]\n );\n\n const handleSelectAll = useCallback(() => {\n const values = items.map(item => item.value);\n const newSelection = new Set(values);\n setSelection(newSelection);\n onChange(values);\n }, [items, onChange]);\n\n const handleClearSelection = useCallback(() => {\n setSelection(new Set());\n onChange([]);\n }, [onChange]);\n\n const handleViewportChange = useCallback(() => {\n // no-op\n }, []);\n\n const handleChildBlur = useCallback(\n (e: React.FocusEvent<Element>) => {\n const { relatedTarget } = e;\n log.debug(\n 'handleChildBlur',\n relatedTarget,\n relatedTarget instanceof HTMLElement,\n parentRef.current,\n parentRef.current?.contains(relatedTarget)\n );\n if (\n !relatedTarget ||\n (parentRef.current &&\n relatedTarget instanceof HTMLElement &&\n !parentRef.current.contains(relatedTarget))\n ) {\n onBlur();\n }\n },\n [onBlur]\n );\n\n const isEmpty = items.length === 0;\n\n return (\n <div\n ref={parentRef}\n className={classNames(\n 'table-input-container d-flex flex-column position-relative',\n className\n )}\n >\n <SearchInput\n disabled={!!error || isEmpty}\n value={searchValue}\n placeholder=\"Search\"\n onChange={handleSearchChange}\n className=\"mb-2 d-flex\"\n onBlur={handleChildBlur}\n />\n <SelectValueList\n className=\"table-input-list\"\n disabled={table === undefined || isEmpty}\n isInvalid={isInvalid}\n items={isEmpty ? [{ value: 'Empty', isSelected: false }] : items}\n itemCount={itemCount}\n offset={0}\n onSelect={handleSelect}\n onViewportChange={handleViewportChange}\n ref={listRef}\n onBlur={handleChildBlur}\n />\n\n {table && (\n <div className=\"meta-row\">\n <div className=\"d-flex align-items-center text-muted small\">\n {table != null && table.size > itemCount && (\n <>Table is too large, showing the first {SIZE_LIMIT} items.</>\n )}\n </div>\n <div>\n <button\n type=\"button\"\n className=\"btn btn-link\"\n onBlur={handleChildBlur}\n onClick={handleSelectAll}\n >\n Select All\n </button>\n <button\n type=\"button\"\n className=\"btn btn-link mr-a\"\n onBlur={handleChildBlur}\n onClick={handleClearSelection}\n >\n Clear\n </button>\n </div>\n </div>\n )}\n\n {table == null ||\n (error && (\n <div className=\"h-100 w-100 position-absolute\">\n <LoadingOverlay\n isLoaded={table != null}\n isLoading={table == null && error == null}\n errorMessage={error?.message ?? null}\n />\n </div>\n ))}\n </div>\n );\n}\n\nTableInput.displayName = 'TableInput';\n\nTableInput.defaultProps = {\n isInvalid: false,\n className: undefined,\n};\n\nexport default TableInput;\n"],"mappings":"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","ignoreList":[]}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["default","TableInput","useBroadcastChannel","useBroadcastLoginListener","useDebouncedViewportSearch","useInitializeViewportData","useSelectDistinctTable","useSetPaddedViewportCallback","useTable","useTableColumn","useTableListener","useTableClose","useTableSize","useTableUtils","useViewportData"],"sources":["../src/index.ts"],"sourcesContent":["export * from './HookTestUtils';\nexport { default as TableInput } from './TableInput';\nexport * from './spectrum';\nexport * from './TableDropdown';\nexport { default as useBroadcastChannel } from './useBroadcastChannel';\nexport { default as useBroadcastLoginListener } from './useBroadcastLoginListener';\nexport * from './useCheckIfExistsValue';\nexport { default as useDebouncedViewportSearch } from './useDebouncedViewportSearch';\nexport * from './useDebouncedViewportSelectionFilter';\nexport * from './useFilterConditionFactories';\nexport * from './useFilteredItemsWithDefaultValue';\nexport * from './useFormatter';\nexport * from './useGetItemIndexByValue';\nexport * from './useGetItemPosition';\nexport { default as useInitializeViewportData } from './useInitializeViewportData';\nexport * from './useSearchableViewportData';\nexport * from './useNotNullOrEmptyFilter';\nexport * from './usePickerWithSelectedValues';\nexport { default as useSelectDistinctTable } from './useSelectDistinctTable';\nexport { default as useSetPaddedViewportCallback } from './useSetPaddedViewportCallback';\nexport * from './useShowOnlyEmptyFilter';\nexport { default as useTable } from './useTable';\nexport { default as useTableColumn } from './useTableColumn';\nexport { default as useTableListener } from './useTableListener';\nexport { default as useTableClose } from './useTableClose';\nexport { default as useTableSize } from './useTableSize';\nexport { default as useTableUtils } from './useTableUtils';\nexport * from './useValueFilter';\nexport { default as useViewportData } from './useViewportData';\nexport type { UseSelectDistinctTableResult } from './useSelectDistinctTable';\nexport type { UseViewportDataResult } from './useViewportData';\nexport * from './useViewportFilter';\n"],"mappings":";SACSA,OAAO,IAAIC,UAAU;AAAA;AAAA;AAAA,SAGrBD,OAAO,IAAIE,mBAAmB;AAAA,SAC9BF,OAAO,IAAIG,yBAAyB;AAAA;AAAA,SAEpCH,OAAO,IAAII,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAOrCJ,OAAO,IAAIK,yBAAyB;AAAA;AAAA;AAAA;AAAA,SAIpCL,OAAO,IAAIM,sBAAsB;AAAA,SACjCN,OAAO,IAAIO,4BAA4B;AAAA;AAAA,SAEvCP,OAAO,IAAIQ,QAAQ;AAAA,SACnBR,OAAO,IAAIS,cAAc;AAAA,SACzBT,OAAO,IAAIU,gBAAgB;AAAA,SAC3BV,OAAO,IAAIW,aAAa;AAAA,SACxBX,OAAO,IAAIY,YAAY;AAAA,SACvBZ,OAAO,IAAIa,aAAa;AAAA;AAAA,SAExBb,OAAO,IAAIc,eAAe;AAAA"}
1
+ {"version":3,"file":"index.js","names":["default","TableInput","useBroadcastChannel","useBroadcastLoginListener","useDebouncedViewportSearch","useInitializeViewportData","useSelectDistinctTable","useSetPaddedViewportCallback","useTable","useTableColumn","useTableListener","useTableClose","useTableSize","useTableUtils","useViewportData"],"sources":["../src/index.ts"],"sourcesContent":["export * from './HookTestUtils';\nexport { default as TableInput } from './TableInput';\nexport * from './spectrum';\nexport * from './TableDropdown';\nexport { default as useBroadcastChannel } from './useBroadcastChannel';\nexport { default as useBroadcastLoginListener } from './useBroadcastLoginListener';\nexport * from './useCheckIfExistsValue';\nexport { default as useDebouncedViewportSearch } from './useDebouncedViewportSearch';\nexport * from './useDebouncedViewportSelectionFilter';\nexport * from './useFilterConditionFactories';\nexport * from './useFilteredItemsWithDefaultValue';\nexport * from './useFormatter';\nexport * from './useGetItemIndexByValue';\nexport * from './useGetItemPosition';\nexport { default as useInitializeViewportData } from './useInitializeViewportData';\nexport * from './useSearchableViewportData';\nexport * from './useNotNullOrEmptyFilter';\nexport * from './usePickerWithSelectedValues';\nexport { default as useSelectDistinctTable } from './useSelectDistinctTable';\nexport { default as useSetPaddedViewportCallback } from './useSetPaddedViewportCallback';\nexport * from './useShowOnlyEmptyFilter';\nexport { default as useTable } from './useTable';\nexport { default as useTableColumn } from './useTableColumn';\nexport { default as useTableListener } from './useTableListener';\nexport { default as useTableClose } from './useTableClose';\nexport { default as useTableSize } from './useTableSize';\nexport { default as useTableUtils } from './useTableUtils';\nexport * from './useValueFilter';\nexport { default as useViewportData } from './useViewportData';\nexport type { UseSelectDistinctTableResult } from './useSelectDistinctTable';\nexport type { UseViewportDataResult } from './useViewportData';\nexport * from './useViewportFilter';\n"],"mappings":";SACSA,OAAO,IAAIC,UAAU;AAAA;AAAA;AAAA,SAGrBD,OAAO,IAAIE,mBAAmB;AAAA,SAC9BF,OAAO,IAAIG,yBAAyB;AAAA;AAAA,SAEpCH,OAAO,IAAII,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAOrCJ,OAAO,IAAIK,yBAAyB;AAAA;AAAA;AAAA;AAAA,SAIpCL,OAAO,IAAIM,sBAAsB;AAAA,SACjCN,OAAO,IAAIO,4BAA4B;AAAA;AAAA,SAEvCP,OAAO,IAAIQ,QAAQ;AAAA,SACnBR,OAAO,IAAIS,cAAc;AAAA,SACzBT,OAAO,IAAIU,gBAAgB;AAAA,SAC3BV,OAAO,IAAIW,aAAa;AAAA,SACxBX,OAAO,IAAIY,YAAY;AAAA,SACvBZ,OAAO,IAAIa,aAAa;AAAA;AAAA,SAExBb,OAAO,IAAIc,eAAe;AAAA","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"ComboBox.js","names":["ComboBoxNormalized","useCallback","useRef","usePickerProps","jsx","_jsx","ComboBox","props","_usePickerProps","onInputChange","onInputChangeInternal","onSearchTextChange","pickerProps","_objectWithoutProperties","_excluded","isOpenRef","inputValueRef","value","current","onOpenChange","isOpen","menuTrigger","_pickerProps$onOpenCh","call","_objectSpread"],"sources":["../../src/spectrum/ComboBox.tsx"],"sourcesContent":["import {\n ComboBoxNormalized,\n type MenuTriggerAction,\n type NormalizedItem,\n type SpectrumComboBoxProps,\n} from '@deephaven/components';\nimport { useCallback, useRef } from 'react';\nimport { type PickerWithTableProps } from './PickerProps';\nimport { usePickerProps } from './utils';\n\nexport type ComboBoxProps = PickerWithTableProps<\n SpectrumComboBoxProps<NormalizedItem>\n>;\n\nexport function ComboBox(props: ComboBoxProps): JSX.Element {\n const {\n onInputChange: onInputChangeInternal,\n onSearchTextChange,\n ...pickerProps\n } = usePickerProps<ComboBoxProps>(props);\n\n const isOpenRef = useRef(false);\n const inputValueRef = useRef('');\n\n const onInputChange = useCallback(\n (value: string) => {\n onInputChangeInternal?.(value);\n\n // Only apply search text if ComboBox is open.\n if (isOpenRef.current) {\n onSearchTextChange(value);\n }\n // When the ComboBox is closed, `onInputChange` may have been called as a\n // result of user search input, ComboBox selection, or by selected key\n // prop changes. We can't determine the source here, so we clear the search\n // text and store the search value so that the list is unfiltered the next\n // time the ComboBox is opened. We also store the search value so we can\n // re-apply it in `onOpenChange` if the ComboBox is opened by user search\n // input.\n else {\n onSearchTextChange('');\n inputValueRef.current = value;\n }\n },\n [onInputChangeInternal, onSearchTextChange]\n );\n\n const onOpenChange = useCallback(\n (isOpen: boolean, menuTrigger?: MenuTriggerAction) => {\n pickerProps.onOpenChange?.(isOpen);\n\n // Reset the search text when the ComboBox is closed.\n if (!isOpen) {\n onSearchTextChange('');\n }\n // Restore search text when ComboBox has been opened by user input.\n else if (menuTrigger === 'input') {\n onSearchTextChange(inputValueRef.current);\n }\n\n // Store the open state so that `onInputChange` has access to it.\n isOpenRef.current = isOpen;\n },\n [onSearchTextChange, pickerProps]\n );\n\n return (\n <ComboBoxNormalized\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...pickerProps}\n onInputChange={onInputChange}\n onOpenChange={onOpenChange}\n />\n );\n}\n\nexport default ComboBox;\n"],"mappings":";;;;;;;;AAAA,SACEA,kBAAkB,QAIb,uBAAuB;AAC9B,SAASC,WAAW,EAAEC,MAAM,QAAQ,OAAO;AAAC,SAEnCC,cAAc;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAMvB,OAAO,SAASC,QAAQA,CAACC,KAAoB,EAAe;EAC1D,IAAAC,eAAA,GAIIL,cAAc,CAAgBI,KAAK,CAAC;IAJlC;MACJE,aAAa,EAAEC,qBAAqB;MACpCC;IAEF,CAAC,GAAAH,eAAA;IADII,WAAW,GAAAC,wBAAA,CAAAL,eAAA,EAAAM,SAAA;EAGhB,IAAMC,SAAS,GAAGb,MAAM,CAAC,KAAK,CAAC;EAC/B,IAAMc,aAAa,GAAGd,MAAM,CAAC,EAAE,CAAC;EAEhC,IAAMO,aAAa,GAAGR,WAAW,CAC9BgB,KAAa,IAAK;IACjBP,qBAAqB,aAArBA,qBAAqB,uBAArBA,qBAAqB,CAAGO,KAAK,CAAC;;IAE9B;IACA,IAAIF,SAAS,CAACG,OAAO,EAAE;MACrBP,kBAAkB,CAACM,KAAK,CAAC;IAC3B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAAA,KACK;MACHN,kBAAkB,CAAC,EAAE,CAAC;MACtBK,aAAa,CAACE,OAAO,GAAGD,KAAK;IAC/B;EACF,CAAC,EACD,CAACP,qBAAqB,EAAEC,kBAAkB,CAC5C,CAAC;EAED,IAAMQ,YAAY,GAAGlB,WAAW,CAC9B,CAACmB,MAAe,EAAEC,WAA+B,KAAK;IAAA,IAAAC,qBAAA;IACpD,CAAAA,qBAAA,GAAAV,WAAW,CAACO,YAAY,cAAAG,qBAAA,uBAAxBA,qBAAA,CAAAC,IAAA,CAAAX,WAAW,EAAgBQ,MAAM,CAAC;;IAElC;IACA,IAAI,CAACA,MAAM,EAAE;MACXT,kBAAkB,CAAC,EAAE,CAAC;IACxB;IACA;IAAA,KACK,IAAIU,WAAW,KAAK,OAAO,EAAE;MAChCV,kBAAkB,CAACK,aAAa,CAACE,OAAO,CAAC;IAC3C;;IAEA;IACAH,SAAS,CAACG,OAAO,GAAGE,MAAM;EAC5B,CAAC,EACD,CAACT,kBAAkB,EAAEC,WAAW,CAClC,CAAC;EAED,oBACEP,IAAA,CAACL;EACC;EAAA,EAAAwB,aAAA,CAAAA,aAAA,KACIZ,WAAW;IACfH,aAAa,EAAEA,aAAc;IAC7BU,YAAY,EAAEA;EAAa,EAC5B,CAAC;AAEN;AAEA,eAAeb,QAAQ"}
1
+ {"version":3,"file":"ComboBox.js","names":["ComboBoxNormalized","useCallback","useRef","usePickerProps","jsx","_jsx","ComboBox","props","_usePickerProps","onInputChange","onInputChangeInternal","onSearchTextChange","pickerProps","_objectWithoutProperties","_excluded","isOpenRef","inputValueRef","value","current","onOpenChange","isOpen","menuTrigger","_pickerProps$onOpenCh","call","_objectSpread"],"sources":["../../src/spectrum/ComboBox.tsx"],"sourcesContent":["import {\n ComboBoxNormalized,\n type MenuTriggerAction,\n type NormalizedItem,\n type SpectrumComboBoxProps,\n} from '@deephaven/components';\nimport { useCallback, useRef } from 'react';\nimport { type PickerWithTableProps } from './PickerProps';\nimport { usePickerProps } from './utils';\n\nexport type ComboBoxProps = PickerWithTableProps<\n SpectrumComboBoxProps<NormalizedItem>\n>;\n\nexport function ComboBox(props: ComboBoxProps): JSX.Element {\n const {\n onInputChange: onInputChangeInternal,\n onSearchTextChange,\n ...pickerProps\n } = usePickerProps<ComboBoxProps>(props);\n\n const isOpenRef = useRef(false);\n const inputValueRef = useRef('');\n\n const onInputChange = useCallback(\n (value: string) => {\n onInputChangeInternal?.(value);\n\n // Only apply search text if ComboBox is open.\n if (isOpenRef.current) {\n onSearchTextChange(value);\n }\n // When the ComboBox is closed, `onInputChange` may have been called as a\n // result of user search input, ComboBox selection, or by selected key\n // prop changes. We can't determine the source here, so we clear the search\n // text and store the search value so that the list is unfiltered the next\n // time the ComboBox is opened. We also store the search value so we can\n // re-apply it in `onOpenChange` if the ComboBox is opened by user search\n // input.\n else {\n onSearchTextChange('');\n inputValueRef.current = value;\n }\n },\n [onInputChangeInternal, onSearchTextChange]\n );\n\n const onOpenChange = useCallback(\n (isOpen: boolean, menuTrigger?: MenuTriggerAction) => {\n pickerProps.onOpenChange?.(isOpen);\n\n // Reset the search text when the ComboBox is closed.\n if (!isOpen) {\n onSearchTextChange('');\n }\n // Restore search text when ComboBox has been opened by user input.\n else if (menuTrigger === 'input') {\n onSearchTextChange(inputValueRef.current);\n }\n\n // Store the open state so that `onInputChange` has access to it.\n isOpenRef.current = isOpen;\n },\n [onSearchTextChange, pickerProps]\n );\n\n return (\n <ComboBoxNormalized\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...pickerProps}\n onInputChange={onInputChange}\n onOpenChange={onOpenChange}\n />\n );\n}\n\nexport default ComboBox;\n"],"mappings":";;;;;;;;AAAA,SACEA,kBAAkB,QAIb,uBAAuB;AAC9B,SAASC,WAAW,EAAEC,MAAM,QAAQ,OAAO;AAAC,SAEnCC,cAAc;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAMvB,OAAO,SAASC,QAAQA,CAACC,KAAoB,EAAe;EAC1D,IAAAC,eAAA,GAIIL,cAAc,CAAgBI,KAAK,CAAC;IAJlC;MACJE,aAAa,EAAEC,qBAAqB;MACpCC;IAEF,CAAC,GAAAH,eAAA;IADII,WAAW,GAAAC,wBAAA,CAAAL,eAAA,EAAAM,SAAA;EAGhB,IAAMC,SAAS,GAAGb,MAAM,CAAC,KAAK,CAAC;EAC/B,IAAMc,aAAa,GAAGd,MAAM,CAAC,EAAE,CAAC;EAEhC,IAAMO,aAAa,GAAGR,WAAW,CAC9BgB,KAAa,IAAK;IACjBP,qBAAqB,aAArBA,qBAAqB,uBAArBA,qBAAqB,CAAGO,KAAK,CAAC;;IAE9B;IACA,IAAIF,SAAS,CAACG,OAAO,EAAE;MACrBP,kBAAkB,CAACM,KAAK,CAAC;IAC3B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAAA,KACK;MACHN,kBAAkB,CAAC,EAAE,CAAC;MACtBK,aAAa,CAACE,OAAO,GAAGD,KAAK;IAC/B;EACF,CAAC,EACD,CAACP,qBAAqB,EAAEC,kBAAkB,CAC5C,CAAC;EAED,IAAMQ,YAAY,GAAGlB,WAAW,CAC9B,CAACmB,MAAe,EAAEC,WAA+B,KAAK;IAAA,IAAAC,qBAAA;IACpD,CAAAA,qBAAA,GAAAV,WAAW,CAACO,YAAY,cAAAG,qBAAA,uBAAxBA,qBAAA,CAAAC,IAAA,CAAAX,WAAW,EAAgBQ,MAAM,CAAC;;IAElC;IACA,IAAI,CAACA,MAAM,EAAE;MACXT,kBAAkB,CAAC,EAAE,CAAC;IACxB;IACA;IAAA,KACK,IAAIU,WAAW,KAAK,OAAO,EAAE;MAChCV,kBAAkB,CAACK,aAAa,CAACE,OAAO,CAAC;IAC3C;;IAEA;IACAH,SAAS,CAACG,OAAO,GAAGE,MAAM;EAC5B,CAAC,EACD,CAACT,kBAAkB,EAAEC,WAAW,CAClC,CAAC;EAED,oBACEP,IAAA,CAACL;EACC;EAAA,EAAAwB,aAAA,CAAAA,aAAA,KACIZ,WAAW;IACfH,aAAa,EAAEA,aAAc;IAC7BU,YAAY,EAAEA;EAAa,EAC5B,CAAC;AAEN;AAEA,eAAeb,QAAQ","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"ListView.js","names":["LIST_VIEW_ROW_HEIGHTS","ListViewNormalized","useSpectrumThemeProvider","useFormatter","useViewportData","useItemRowDeserializer","jsx","_jsx","ListView","_ref","_props$density","table","keyColumn","keyColumnName","labelColumn","labelColumnName","iconColumn","iconColumnName","settings","props","_objectWithoutProperties","_excluded","scale","itemHeight","density","getFormattedString","formatValue","deserializeRow","viewportData","onScroll","reuseItemsOnTableResize","_objectSpread","normalizedItems","items","showItemIcons"],"sources":["../../src/spectrum/ListView.tsx"],"sourcesContent":["import {\n LIST_VIEW_ROW_HEIGHTS,\n ListViewNormalized,\n type ListViewNormalizedProps,\n type NormalizedItemData,\n useSpectrumThemeProvider,\n} from '@deephaven/components';\nimport { type dh as DhType } from '@deephaven/jsapi-types';\nimport { type Settings } from '@deephaven/jsapi-utils';\nimport useFormatter from '../useFormatter';\nimport useViewportData from '../useViewportData';\nimport { useItemRowDeserializer } from './utils';\n\nexport interface ListViewProps\n extends Omit<ListViewNormalizedProps, 'normalizedItems' | 'showItemIcons'> {\n table: DhType.Table;\n /* The column of values to use as item keys. Defaults to the first column. */\n keyColumn?: string;\n /* The column of values to display as primary text. Defaults to the `keyColumn` value. */\n labelColumn?: string;\n\n /* The column of values to map to icons. */\n iconColumn?: string;\n\n settings?: Settings;\n}\n\nexport function ListView({\n table,\n keyColumn: keyColumnName,\n labelColumn: labelColumnName,\n iconColumn: iconColumnName,\n settings,\n ...props\n}: ListViewProps): JSX.Element {\n const { scale } = useSpectrumThemeProvider();\n const itemHeight = LIST_VIEW_ROW_HEIGHTS[props.density ?? 'regular'][scale];\n\n const { getFormattedString: formatValue } = useFormatter(settings);\n\n const deserializeRow = useItemRowDeserializer({\n table,\n iconColumnName,\n keyColumnName,\n labelColumnName,\n formatValue,\n });\n\n const { viewportData, onScroll } = useViewportData<\n NormalizedItemData,\n DhType.Table\n >({\n reuseItemsOnTableResize: true,\n table,\n itemHeight,\n deserializeRow,\n });\n\n return (\n <ListViewNormalized\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...props}\n normalizedItems={viewportData.items}\n showItemIcons={iconColumnName != null}\n onScroll={onScroll}\n />\n );\n}\n\nexport default ListView;\n"],"mappings":";;;;;;;;AAAA,SACEA,qBAAqB,EACrBC,kBAAkB,EAGlBC,wBAAwB,QACnB,uBAAuB;AAAC,OAGxBC,YAAY;AAAA,OACZC,eAAe;AAAA,SACbC,sBAAsB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAgB/B,OAAO,SAASC,QAAQA,CAAAC,IAAA,EAOO;EAAA,IAAAC,cAAA;EAAA,IAPN;MACvBC,KAAK;MACLC,SAAS,EAAEC,aAAa;MACxBC,WAAW,EAAEC,eAAe;MAC5BC,UAAU,EAAEC,cAAc;MAC1BC;IAEa,CAAC,GAAAT,IAAA;IADXU,KAAK,GAAAC,wBAAA,CAAAX,IAAA,EAAAY,SAAA;EAER,IAAM;IAAEC;EAAM,CAAC,GAAGpB,wBAAwB,CAAC,CAAC;EAC5C,IAAMqB,UAAU,GAAGvB,qBAAqB,EAAAU,cAAA,GAACS,KAAK,CAACK,OAAO,cAAAd,cAAA,cAAAA,cAAA,GAAI,SAAS,CAAC,CAACY,KAAK,CAAC;EAE3E,IAAM;IAAEG,kBAAkB,EAAEC;EAAY,CAAC,GAAGvB,YAAY,CAACe,QAAQ,CAAC;EAElE,IAAMS,cAAc,GAAGtB,sBAAsB,CAAC;IAC5CM,KAAK;IACLM,cAAc;IACdJ,aAAa;IACbE,eAAe;IACfW;EACF,CAAC,CAAC;EAEF,IAAM;IAAEE,YAAY;IAAEC;EAAS,CAAC,GAAGzB,eAAe,CAGhD;IACA0B,uBAAuB,EAAE,IAAI;IAC7BnB,KAAK;IACLY,UAAU;IACVI;EACF,CAAC,CAAC;EAEF,oBACEpB,IAAA,CAACN;EACC;EAAA,EAAA8B,aAAA,CAAAA,aAAA,KACIZ,KAAK;IACTa,eAAe,EAAEJ,YAAY,CAACK,KAAM;IACpCC,aAAa,EAAEjB,cAAc,IAAI,IAAK;IACtCY,QAAQ,EAAEA;EAAS,EACpB,CAAC;AAEN;AAEA,eAAerB,QAAQ"}
1
+ {"version":3,"file":"ListView.js","names":["LIST_VIEW_ROW_HEIGHTS","ListViewNormalized","useSpectrumThemeProvider","useFormatter","useViewportData","useItemRowDeserializer","jsx","_jsx","ListView","_ref","_props$density","table","keyColumn","keyColumnName","labelColumn","labelColumnName","iconColumn","iconColumnName","settings","props","_objectWithoutProperties","_excluded","scale","itemHeight","density","getFormattedString","formatValue","deserializeRow","viewportData","onScroll","reuseItemsOnTableResize","_objectSpread","normalizedItems","items","showItemIcons"],"sources":["../../src/spectrum/ListView.tsx"],"sourcesContent":["import {\n LIST_VIEW_ROW_HEIGHTS,\n ListViewNormalized,\n type ListViewNormalizedProps,\n type NormalizedItemData,\n useSpectrumThemeProvider,\n} from '@deephaven/components';\nimport { type dh as DhType } from '@deephaven/jsapi-types';\nimport { type Settings } from '@deephaven/jsapi-utils';\nimport useFormatter from '../useFormatter';\nimport useViewportData from '../useViewportData';\nimport { useItemRowDeserializer } from './utils';\n\nexport interface ListViewProps\n extends Omit<ListViewNormalizedProps, 'normalizedItems' | 'showItemIcons'> {\n table: DhType.Table;\n /* The column of values to use as item keys. Defaults to the first column. */\n keyColumn?: string;\n /* The column of values to display as primary text. Defaults to the `keyColumn` value. */\n labelColumn?: string;\n\n /* The column of values to map to icons. */\n iconColumn?: string;\n\n settings?: Settings;\n}\n\nexport function ListView({\n table,\n keyColumn: keyColumnName,\n labelColumn: labelColumnName,\n iconColumn: iconColumnName,\n settings,\n ...props\n}: ListViewProps): JSX.Element {\n const { scale } = useSpectrumThemeProvider();\n const itemHeight = LIST_VIEW_ROW_HEIGHTS[props.density ?? 'regular'][scale];\n\n const { getFormattedString: formatValue } = useFormatter(settings);\n\n const deserializeRow = useItemRowDeserializer({\n table,\n iconColumnName,\n keyColumnName,\n labelColumnName,\n formatValue,\n });\n\n const { viewportData, onScroll } = useViewportData<\n NormalizedItemData,\n DhType.Table\n >({\n reuseItemsOnTableResize: true,\n table,\n itemHeight,\n deserializeRow,\n });\n\n return (\n <ListViewNormalized\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...props}\n normalizedItems={viewportData.items}\n showItemIcons={iconColumnName != null}\n onScroll={onScroll}\n />\n );\n}\n\nexport default ListView;\n"],"mappings":";;;;;;;;AAAA,SACEA,qBAAqB,EACrBC,kBAAkB,EAGlBC,wBAAwB,QACnB,uBAAuB;AAAC,OAGxBC,YAAY;AAAA,OACZC,eAAe;AAAA,SACbC,sBAAsB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAgB/B,OAAO,SAASC,QAAQA,CAAAC,IAAA,EAOO;EAAA,IAAAC,cAAA;EAAA,IAPN;MACvBC,KAAK;MACLC,SAAS,EAAEC,aAAa;MACxBC,WAAW,EAAEC,eAAe;MAC5BC,UAAU,EAAEC,cAAc;MAC1BC;IAEa,CAAC,GAAAT,IAAA;IADXU,KAAK,GAAAC,wBAAA,CAAAX,IAAA,EAAAY,SAAA;EAER,IAAM;IAAEC;EAAM,CAAC,GAAGpB,wBAAwB,CAAC,CAAC;EAC5C,IAAMqB,UAAU,GAAGvB,qBAAqB,EAAAU,cAAA,GAACS,KAAK,CAACK,OAAO,cAAAd,cAAA,cAAAA,cAAA,GAAI,SAAS,CAAC,CAACY,KAAK,CAAC;EAE3E,IAAM;IAAEG,kBAAkB,EAAEC;EAAY,CAAC,GAAGvB,YAAY,CAACe,QAAQ,CAAC;EAElE,IAAMS,cAAc,GAAGtB,sBAAsB,CAAC;IAC5CM,KAAK;IACLM,cAAc;IACdJ,aAAa;IACbE,eAAe;IACfW;EACF,CAAC,CAAC;EAEF,IAAM;IAAEE,YAAY;IAAEC;EAAS,CAAC,GAAGzB,eAAe,CAGhD;IACA0B,uBAAuB,EAAE,IAAI;IAC7BnB,KAAK;IACLY,UAAU;IACVI;EACF,CAAC,CAAC;EAEF,oBACEpB,IAAA,CAACN;EACC;EAAA,EAAA8B,aAAA,CAAAA,aAAA,KACIZ,KAAK;IACTa,eAAe,EAAEJ,YAAY,CAACK,KAAM;IACpCC,aAAa,EAAEjB,cAAc,IAAI,IAAK;IACtCY,QAAQ,EAAEA;EAAS,EACpB,CAAC;AAEN;AAEA,eAAerB,QAAQ","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"Picker.js","names":["PickerNormalized","usePickerProps","jsx","_jsx","Picker","props","pickerProps","_objectSpread"],"sources":["../../src/spectrum/Picker.tsx"],"sourcesContent":["import { PickerNormalized } from '@deephaven/components';\nimport { type PickerProps } from './PickerProps';\nimport { usePickerProps } from './utils';\n\nexport function Picker(props: PickerProps): JSX.Element {\n const pickerProps = usePickerProps<PickerProps>(props);\n\n return (\n <PickerNormalized\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...pickerProps}\n />\n );\n}\n\nexport default Picker;\n"],"mappings":";;;;;AAAA,SAASA,gBAAgB,QAAQ,uBAAuB;AAAC,SAEhDC,cAAc;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAEvB,OAAO,SAASC,MAAMA,CAACC,KAAkB,EAAe;EACtD,IAAMC,WAAW,GAAGL,cAAc,CAAcI,KAAK,CAAC;EAEtD,oBACEF,IAAA,CAACH;EACC;EAAA,EAAAO,aAAA,KACID,WAAW,CAChB,CAAC;AAEN;AAEA,eAAeF,MAAM"}
1
+ {"version":3,"file":"Picker.js","names":["PickerNormalized","usePickerProps","jsx","_jsx","Picker","props","pickerProps","_objectSpread"],"sources":["../../src/spectrum/Picker.tsx"],"sourcesContent":["import { PickerNormalized } from '@deephaven/components';\nimport { type PickerProps } from './PickerProps';\nimport { usePickerProps } from './utils';\n\nexport function Picker(props: PickerProps): JSX.Element {\n const pickerProps = usePickerProps<PickerProps>(props);\n\n return (\n <PickerNormalized\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...pickerProps}\n />\n );\n}\n\nexport default Picker;\n"],"mappings":";;;;;AAAA,SAASA,gBAAgB,QAAQ,uBAAuB;AAAC,SAEhDC,cAAc;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAEvB,OAAO,SAASC,MAAMA,CAACC,KAAkB,EAAe;EACtD,IAAMC,WAAW,GAAGL,cAAc,CAAcI,KAAK,CAAC;EAEtD,oBACEF,IAAA,CAACH;EACC;EAAA,EAAAO,aAAA,KACID,WAAW,CAChB,CAAC;AAEN;AAEA,eAAeF,MAAM","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"PickerProps.js","names":[],"sources":["../../src/spectrum/PickerProps.ts"],"sourcesContent":["import {\n type NormalizedItem,\n type PickerPropsT,\n type SpectrumPickerProps,\n} from '@deephaven/components';\nimport { type dh as DhType } from '@deephaven/jsapi-types';\nimport { type Settings } from '@deephaven/jsapi-utils';\n\nexport type PickerWithTableProps<TProps> = Omit<\n PickerPropsT<TProps>,\n 'children'\n> & {\n table: DhType.Table;\n /* The column of values to use as item keys. Defaults to the first column. */\n keyColumn?: string;\n /* The column of values to display as primary text. Defaults to the `keyColumn` value. */\n labelColumn?: string;\n\n /* The column of values to map to icons. */\n iconColumn?: string;\n\n settings?: Settings;\n};\n\nexport type PickerProps = PickerWithTableProps<\n SpectrumPickerProps<NormalizedItem>\n>;\n"],"mappings":""}
1
+ {"version":3,"file":"PickerProps.js","names":[],"sources":["../../src/spectrum/PickerProps.ts"],"sourcesContent":["import {\n type NormalizedItem,\n type PickerPropsT,\n type SpectrumPickerProps,\n} from '@deephaven/components';\nimport { type dh as DhType } from '@deephaven/jsapi-types';\nimport { type Settings } from '@deephaven/jsapi-utils';\n\nexport type PickerWithTableProps<TProps> = Omit<\n PickerPropsT<TProps>,\n 'children'\n> & {\n table: DhType.Table;\n /* The column of values to use as item keys. Defaults to the first column. */\n keyColumn?: string;\n /* The column of values to display as primary text. Defaults to the `keyColumn` value. */\n labelColumn?: string;\n\n /* The column of values to map to icons. */\n iconColumn?: string;\n\n settings?: Settings;\n};\n\nexport type PickerProps = PickerWithTableProps<\n SpectrumPickerProps<NormalizedItem>\n>;\n"],"mappings":"","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/spectrum/index.ts"],"sourcesContent":["export * from './ComboBox';\nexport * from './ListView';\nexport * from './Picker';\nexport * from './PickerProps';\n"],"mappings":""}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/spectrum/index.ts"],"sourcesContent":["export * from './ComboBox';\nexport * from './ListView';\nexport * from './Picker';\nexport * from './PickerProps';\n"],"mappings":"","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/spectrum/utils/index.ts"],"sourcesContent":["export * from './itemUtils';\nexport * from './useItemRowDeserializer';\nexport * from './usePickerProps';\n"],"mappings":""}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/spectrum/utils/index.ts"],"sourcesContent":["export * from './itemUtils';\nexport * from './useItemRowDeserializer';\nexport * from './usePickerProps';\n"],"mappings":"","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"itemUtils.js","names":["getItemKeyColumn","table","keyColumnName","columns","findColumn","getItemLabelColumn","keyColumn","labelColumnName"],"sources":["../../../src/spectrum/utils/itemUtils.ts"],"sourcesContent":["import { type dh } from '@deephaven/jsapi-types';\n\n/**\n * Get the key column if column name is provided, otherwise use the first column.\n * @param table The table to get the key column from\n * @param keyColumnName The name of the column to use for key data\n * @returns DH Column containing the key values\n */\nexport function getItemKeyColumn(\n table: dh.Table,\n keyColumnName?: string\n): dh.Column {\n return keyColumnName == null\n ? table.columns[0]\n : table.findColumn(keyColumnName);\n}\n\n/**\n * Get the label column if column name is provided, otherwise use the key column.\n * @param table The table to get the label column from\n * @param keyColumn The key column to fallback to if the label column name is not provided\n * @param labelColumnName The name of the column to use for label data\n * @returns DH Column containing the label values\n */\nexport function getItemLabelColumn(\n table: dh.Table,\n keyColumn: dh.Column,\n labelColumnName?: string\n): dh.Column {\n return labelColumnName == null\n ? keyColumn\n : table.findColumn(labelColumnName);\n}\n"],"mappings":"AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,gBAAgBA,CAC9BC,KAAe,EACfC,aAAsB,EACX;EACX,OAAOA,aAAa,IAAI,IAAI,GACxBD,KAAK,CAACE,OAAO,CAAC,CAAC,CAAC,GAChBF,KAAK,CAACG,UAAU,CAACF,aAAa,CAAC;AACrC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASG,kBAAkBA,CAChCJ,KAAe,EACfK,SAAoB,EACpBC,eAAwB,EACb;EACX,OAAOA,eAAe,IAAI,IAAI,GAC1BD,SAAS,GACTL,KAAK,CAACG,UAAU,CAACG,eAAe,CAAC;AACvC"}
1
+ {"version":3,"file":"itemUtils.js","names":["getItemKeyColumn","table","keyColumnName","columns","findColumn","getItemLabelColumn","keyColumn","labelColumnName"],"sources":["../../../src/spectrum/utils/itemUtils.ts"],"sourcesContent":["import { type dh } from '@deephaven/jsapi-types';\n\n/**\n * Get the key column if column name is provided, otherwise use the first column.\n * @param table The table to get the key column from\n * @param keyColumnName The name of the column to use for key data\n * @returns DH Column containing the key values\n */\nexport function getItemKeyColumn(\n table: dh.Table,\n keyColumnName?: string\n): dh.Column {\n return keyColumnName == null\n ? table.columns[0]\n : table.findColumn(keyColumnName);\n}\n\n/**\n * Get the label column if column name is provided, otherwise use the key column.\n * @param table The table to get the label column from\n * @param keyColumn The key column to fallback to if the label column name is not provided\n * @param labelColumnName The name of the column to use for label data\n * @returns DH Column containing the label values\n */\nexport function getItemLabelColumn(\n table: dh.Table,\n keyColumn: dh.Column,\n labelColumnName?: string\n): dh.Column {\n return labelColumnName == null\n ? keyColumn\n : table.findColumn(labelColumnName);\n}\n"],"mappings":"AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,gBAAgBA,CAC9BC,KAAe,EACfC,aAAsB,EACX;EACX,OAAOA,aAAa,IAAI,IAAI,GACxBD,KAAK,CAACE,OAAO,CAAC,CAAC,CAAC,GAChBF,KAAK,CAACG,UAAU,CAACF,aAAa,CAAC;AACrC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASG,kBAAkBA,CAChCJ,KAAe,EACfK,SAAoB,EACpBC,eAAwB,EACb;EACX,OAAOA,eAAe,IAAI,IAAI,GAC1BD,SAAS,GACTL,KAAK,CAACG,UAAU,CAACG,eAAe,CAAC;AACvC","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useItemRowDeserializer.js","names":["useCallback","useMemo","assertNotNull","getItemKeyColumn","getItemLabelColumn","defaultFormatKey","value","String","defaultFormatValue","_columnType","useItemRowDeserializer","_ref","table","descriptionColumnName","iconColumnName","keyColumnName","labelColumnName","formatValue","keyColumn","labelColumn","descriptionColumn","findColumn","iconColumn","deserializeRow","row","key","get","content","type","description","undefined","icon","textValue"],"sources":["../../../src/spectrum/utils/useItemRowDeserializer.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport { type NormalizedItemData } from '@deephaven/components';\nimport { type dh } from '@deephaven/jsapi-types';\nimport { assertNotNull } from '@deephaven/utils';\nimport { getItemKeyColumn, getItemLabelColumn } from './itemUtils';\n\nfunction defaultFormatKey(value: unknown): string | number | boolean {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return value;\n }\n\n return String(value);\n}\n\nfunction defaultFormatValue(value: unknown, _columnType: string): string {\n return String(value);\n}\n\n/**\n * Returns a function that deserializes a row into a normalized item data object.\n * @param table The table to get the key and label columns from\n * @param descriptionColumnName The name of the column to use for description data\n * @param iconColumnName The name of the column to use for icon data\n * @param keyColumnName The name of the column to use for key data\n * @param labelColumnName The name of the column to use for label data\n * @param formatValue Optional function to format the label value\n * @returns A function that deserializes a row into a normalized item data object\n */\nexport function useItemRowDeserializer({\n table,\n descriptionColumnName,\n iconColumnName,\n keyColumnName,\n labelColumnName,\n formatValue = defaultFormatValue,\n}: {\n table?: dh.Table | null;\n descriptionColumnName?: string;\n iconColumnName?: string;\n keyColumnName?: string;\n labelColumnName?: string;\n formatValue?: (value: unknown, columnType: string) => string;\n}): (row: dh.Row) => NormalizedItemData {\n const keyColumn = useMemo(\n () => (table == null ? null : getItemKeyColumn(table, keyColumnName)),\n [keyColumnName, table]\n );\n\n const labelColumn = useMemo(\n () =>\n table == null || keyColumn == null\n ? null\n : getItemLabelColumn(table, keyColumn, labelColumnName),\n [keyColumn, labelColumnName, table]\n );\n\n const descriptionColumn = useMemo(\n () =>\n table == null || descriptionColumnName == null\n ? null\n : table.findColumn(descriptionColumnName),\n [descriptionColumnName, table]\n );\n\n const iconColumn = useMemo(\n () =>\n table == null || iconColumnName == null\n ? null\n : table.findColumn(iconColumnName),\n [iconColumnName, table]\n );\n\n const deserializeRow = useCallback(\n (row: dh.Row): NormalizedItemData => {\n // `deserializeRow` can be created on a null `table` which results in null\n // `keyColumn` + `labelColumn`, but it should never actually be called.\n // The assumption is that the `table` will eventually be non-null,\n // `deserializeRow` will be recreated, and then applied to the non-null\n // table.\n assertNotNull(keyColumn, 'keyColumn cannot be null.');\n assertNotNull(labelColumn, 'labelColumn cannot be null.');\n\n const key = defaultFormatKey(row.get(keyColumn));\n const content = formatValue(row.get(labelColumn), labelColumn.type);\n\n const description =\n descriptionColumn == null\n ? undefined\n : formatValue(row.get(descriptionColumn), descriptionColumn.type);\n\n const icon = iconColumn == null ? undefined : row.get(iconColumn);\n\n return {\n key,\n content,\n textValue: content,\n description,\n icon,\n };\n },\n [descriptionColumn, formatValue, iconColumn, keyColumn, labelColumn]\n );\n\n return deserializeRow;\n}\n\nexport default useItemRowDeserializer;\n"],"mappings":"AAAA,SAASA,WAAW,EAAEC,OAAO,QAAQ,OAAO;AAG5C,SAASC,aAAa,QAAQ,kBAAkB;AAAC,SACxCC,gBAAgB,EAAEC,kBAAkB;AAE7C,SAASC,gBAAgBA,CAACC,KAAc,EAA6B;EACnE,IACE,OAAOA,KAAK,KAAK,QAAQ,IACzB,OAAOA,KAAK,KAAK,QAAQ,IACzB,OAAOA,KAAK,KAAK,SAAS,EAC1B;IACA,OAAOA,KAAK;EACd;EAEA,OAAOC,MAAM,CAACD,KAAK,CAAC;AACtB;AAEA,SAASE,kBAAkBA,CAACF,KAAc,EAAEG,WAAmB,EAAU;EACvE,OAAOF,MAAM,CAACD,KAAK,CAAC;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASI,sBAAsBA,CAAAC,IAAA,EAcE;EAAA,IAdD;IACrCC,KAAK;IACLC,qBAAqB;IACrBC,cAAc;IACdC,aAAa;IACbC,eAAe;IACfC,WAAW,GAAGT;EAQhB,CAAC,GAAAG,IAAA;EACC,IAAMO,SAAS,GAAGjB,OAAO,CACvB,MAAOW,KAAK,IAAI,IAAI,GAAG,IAAI,GAAGT,gBAAgB,CAACS,KAAK,EAAEG,aAAa,CAAE,EACrE,CAACA,aAAa,EAAEH,KAAK,CACvB,CAAC;EAED,IAAMO,WAAW,GAAGlB,OAAO,CACzB,MACEW,KAAK,IAAI,IAAI,IAAIM,SAAS,IAAI,IAAI,GAC9B,IAAI,GACJd,kBAAkB,CAACQ,KAAK,EAAEM,SAAS,EAAEF,eAAe,CAAC,EAC3D,CAACE,SAAS,EAAEF,eAAe,EAAEJ,KAAK,CACpC,CAAC;EAED,IAAMQ,iBAAiB,GAAGnB,OAAO,CAC/B,MACEW,KAAK,IAAI,IAAI,IAAIC,qBAAqB,IAAI,IAAI,GAC1C,IAAI,GACJD,KAAK,CAACS,UAAU,CAACR,qBAAqB,CAAC,EAC7C,CAACA,qBAAqB,EAAED,KAAK,CAC/B,CAAC;EAED,IAAMU,UAAU,GAAGrB,OAAO,CACxB,MACEW,KAAK,IAAI,IAAI,IAAIE,cAAc,IAAI,IAAI,GACnC,IAAI,GACJF,KAAK,CAACS,UAAU,CAACP,cAAc,CAAC,EACtC,CAACA,cAAc,EAAEF,KAAK,CACxB,CAAC;EAED,IAAMW,cAAc,GAAGvB,WAAW,CAC/BwB,GAAW,IAAyB;IACnC;IACA;IACA;IACA;IACA;IACAtB,aAAa,CAACgB,SAAS,EAAE,2BAA2B,CAAC;IACrDhB,aAAa,CAACiB,WAAW,EAAE,6BAA6B,CAAC;IAEzD,IAAMM,GAAG,GAAGpB,gBAAgB,CAACmB,GAAG,CAACE,GAAG,CAACR,SAAS,CAAC,CAAC;IAChD,IAAMS,OAAO,GAAGV,WAAW,CAACO,GAAG,CAACE,GAAG,CAACP,WAAW,CAAC,EAAEA,WAAW,CAACS,IAAI,CAAC;IAEnE,IAAMC,WAAW,GACfT,iBAAiB,IAAI,IAAI,GACrBU,SAAS,GACTb,WAAW,CAACO,GAAG,CAACE,GAAG,CAACN,iBAAiB,CAAC,EAAEA,iBAAiB,CAACQ,IAAI,CAAC;IAErE,IAAMG,IAAI,GAAGT,UAAU,IAAI,IAAI,GAAGQ,SAAS,GAAGN,GAAG,CAACE,GAAG,CAACJ,UAAU,CAAC;IAEjE,OAAO;MACLG,GAAG;MACHE,OAAO;MACPK,SAAS,EAAEL,OAAO;MAClBE,WAAW;MACXE;IACF,CAAC;EACH,CAAC,EACD,CAACX,iBAAiB,EAAEH,WAAW,EAAEK,UAAU,EAAEJ,SAAS,EAAEC,WAAW,CACrE,CAAC;EAED,OAAOI,cAAc;AACvB;AAEA,eAAeb,sBAAsB"}
1
+ {"version":3,"file":"useItemRowDeserializer.js","names":["useCallback","useMemo","assertNotNull","getItemKeyColumn","getItemLabelColumn","defaultFormatKey","value","String","defaultFormatValue","_columnType","useItemRowDeserializer","_ref","table","descriptionColumnName","iconColumnName","keyColumnName","labelColumnName","formatValue","keyColumn","labelColumn","descriptionColumn","findColumn","iconColumn","deserializeRow","row","key","get","content","type","description","undefined","icon","textValue"],"sources":["../../../src/spectrum/utils/useItemRowDeserializer.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport { type NormalizedItemData } from '@deephaven/components';\nimport { type dh } from '@deephaven/jsapi-types';\nimport { assertNotNull } from '@deephaven/utils';\nimport { getItemKeyColumn, getItemLabelColumn } from './itemUtils';\n\nfunction defaultFormatKey(value: unknown): string | number | boolean {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return value;\n }\n\n return String(value);\n}\n\nfunction defaultFormatValue(value: unknown, _columnType: string): string {\n return String(value);\n}\n\n/**\n * Returns a function that deserializes a row into a normalized item data object.\n * @param table The table to get the key and label columns from\n * @param descriptionColumnName The name of the column to use for description data\n * @param iconColumnName The name of the column to use for icon data\n * @param keyColumnName The name of the column to use for key data\n * @param labelColumnName The name of the column to use for label data\n * @param formatValue Optional function to format the label value\n * @returns A function that deserializes a row into a normalized item data object\n */\nexport function useItemRowDeserializer({\n table,\n descriptionColumnName,\n iconColumnName,\n keyColumnName,\n labelColumnName,\n formatValue = defaultFormatValue,\n}: {\n table?: dh.Table | null;\n descriptionColumnName?: string;\n iconColumnName?: string;\n keyColumnName?: string;\n labelColumnName?: string;\n formatValue?: (value: unknown, columnType: string) => string;\n}): (row: dh.Row) => NormalizedItemData {\n const keyColumn = useMemo(\n () => (table == null ? null : getItemKeyColumn(table, keyColumnName)),\n [keyColumnName, table]\n );\n\n const labelColumn = useMemo(\n () =>\n table == null || keyColumn == null\n ? null\n : getItemLabelColumn(table, keyColumn, labelColumnName),\n [keyColumn, labelColumnName, table]\n );\n\n const descriptionColumn = useMemo(\n () =>\n table == null || descriptionColumnName == null\n ? null\n : table.findColumn(descriptionColumnName),\n [descriptionColumnName, table]\n );\n\n const iconColumn = useMemo(\n () =>\n table == null || iconColumnName == null\n ? null\n : table.findColumn(iconColumnName),\n [iconColumnName, table]\n );\n\n const deserializeRow = useCallback(\n (row: dh.Row): NormalizedItemData => {\n // `deserializeRow` can be created on a null `table` which results in null\n // `keyColumn` + `labelColumn`, but it should never actually be called.\n // The assumption is that the `table` will eventually be non-null,\n // `deserializeRow` will be recreated, and then applied to the non-null\n // table.\n assertNotNull(keyColumn, 'keyColumn cannot be null.');\n assertNotNull(labelColumn, 'labelColumn cannot be null.');\n\n const key = defaultFormatKey(row.get(keyColumn));\n const content = formatValue(row.get(labelColumn), labelColumn.type);\n\n const description =\n descriptionColumn == null\n ? undefined\n : formatValue(row.get(descriptionColumn), descriptionColumn.type);\n\n const icon = iconColumn == null ? undefined : row.get(iconColumn);\n\n return {\n key,\n content,\n textValue: content,\n description,\n icon,\n };\n },\n [descriptionColumn, formatValue, iconColumn, keyColumn, labelColumn]\n );\n\n return deserializeRow;\n}\n\nexport default useItemRowDeserializer;\n"],"mappings":"AAAA,SAASA,WAAW,EAAEC,OAAO,QAAQ,OAAO;AAG5C,SAASC,aAAa,QAAQ,kBAAkB;AAAC,SACxCC,gBAAgB,EAAEC,kBAAkB;AAE7C,SAASC,gBAAgBA,CAACC,KAAc,EAA6B;EACnE,IACE,OAAOA,KAAK,KAAK,QAAQ,IACzB,OAAOA,KAAK,KAAK,QAAQ,IACzB,OAAOA,KAAK,KAAK,SAAS,EAC1B;IACA,OAAOA,KAAK;EACd;EAEA,OAAOC,MAAM,CAACD,KAAK,CAAC;AACtB;AAEA,SAASE,kBAAkBA,CAACF,KAAc,EAAEG,WAAmB,EAAU;EACvE,OAAOF,MAAM,CAACD,KAAK,CAAC;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASI,sBAAsBA,CAAAC,IAAA,EAcE;EAAA,IAdD;IACrCC,KAAK;IACLC,qBAAqB;IACrBC,cAAc;IACdC,aAAa;IACbC,eAAe;IACfC,WAAW,GAAGT;EAQhB,CAAC,GAAAG,IAAA;EACC,IAAMO,SAAS,GAAGjB,OAAO,CACvB,MAAOW,KAAK,IAAI,IAAI,GAAG,IAAI,GAAGT,gBAAgB,CAACS,KAAK,EAAEG,aAAa,CAAE,EACrE,CAACA,aAAa,EAAEH,KAAK,CACvB,CAAC;EAED,IAAMO,WAAW,GAAGlB,OAAO,CACzB,MACEW,KAAK,IAAI,IAAI,IAAIM,SAAS,IAAI,IAAI,GAC9B,IAAI,GACJd,kBAAkB,CAACQ,KAAK,EAAEM,SAAS,EAAEF,eAAe,CAAC,EAC3D,CAACE,SAAS,EAAEF,eAAe,EAAEJ,KAAK,CACpC,CAAC;EAED,IAAMQ,iBAAiB,GAAGnB,OAAO,CAC/B,MACEW,KAAK,IAAI,IAAI,IAAIC,qBAAqB,IAAI,IAAI,GAC1C,IAAI,GACJD,KAAK,CAACS,UAAU,CAACR,qBAAqB,CAAC,EAC7C,CAACA,qBAAqB,EAAED,KAAK,CAC/B,CAAC;EAED,IAAMU,UAAU,GAAGrB,OAAO,CACxB,MACEW,KAAK,IAAI,IAAI,IAAIE,cAAc,IAAI,IAAI,GACnC,IAAI,GACJF,KAAK,CAACS,UAAU,CAACP,cAAc,CAAC,EACtC,CAACA,cAAc,EAAEF,KAAK,CACxB,CAAC;EAED,IAAMW,cAAc,GAAGvB,WAAW,CAC/BwB,GAAW,IAAyB;IACnC;IACA;IACA;IACA;IACA;IACAtB,aAAa,CAACgB,SAAS,EAAE,2BAA2B,CAAC;IACrDhB,aAAa,CAACiB,WAAW,EAAE,6BAA6B,CAAC;IAEzD,IAAMM,GAAG,GAAGpB,gBAAgB,CAACmB,GAAG,CAACE,GAAG,CAACR,SAAS,CAAC,CAAC;IAChD,IAAMS,OAAO,GAAGV,WAAW,CAACO,GAAG,CAACE,GAAG,CAACP,WAAW,CAAC,EAAEA,WAAW,CAACS,IAAI,CAAC;IAEnE,IAAMC,WAAW,GACfT,iBAAiB,IAAI,IAAI,GACrBU,SAAS,GACTb,WAAW,CAACO,GAAG,CAACE,GAAG,CAACN,iBAAiB,CAAC,EAAEA,iBAAiB,CAACQ,IAAI,CAAC;IAErE,IAAMG,IAAI,GAAGT,UAAU,IAAI,IAAI,GAAGQ,SAAS,GAAGN,GAAG,CAACE,GAAG,CAACJ,UAAU,CAAC;IAEjE,OAAO;MACLG,GAAG;MACHE,OAAO;MACPK,SAAS,EAAEL,OAAO;MAClBE,WAAW;MACXE;IACF,CAAC;EACH,CAAC,EACD,CAACX,iBAAiB,EAAEH,WAAW,EAAEK,UAAU,EAAEJ,SAAS,EAAEC,WAAW,CACrE,CAAC;EAED,OAAOI,cAAc;AACvB;AAEA,eAAeb,sBAAsB","ignoreList":[]}
@@ -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","useTableClose","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 useTableClose from '../../useTableClose';\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 useTableClose(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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"}
1
+ {"version":3,"file":"usePickerProps.js","names":["useCallback","useEffect","useMemo","useState","PICKER_TOP_OFFSET","usePickerItemScale","TableUtils","Log","usePromiseFactory","useFormatter","getItemKeyColumn","getItemLabelColumn","useItemRowDeserializer","useGetItemIndexByValue","useSearchableViewportData","useTableClose","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 useTableClose from '../../useTableClose';\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 useTableClose(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 +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"}
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 +1 @@
1
- {"version":3,"file":"useBroadcastLoginListener.js","names":["isBroadcastLoginMessage","isBroadcastLogoutMessage","useCallback","useBroadcastChannel","useBroadcastLoginListener","onLogin","onLogout","onMessage","event","data"],"sources":["../src/useBroadcastLoginListener.ts"],"sourcesContent":["import {\n type BroadcastLoginMessage,\n type BroadcastLogoutMessage,\n isBroadcastLoginMessage,\n isBroadcastLogoutMessage,\n} from '@deephaven/jsapi-utils';\nimport type { PostMessage } from '@deephaven/utils';\nimport { useCallback } from 'react';\nimport useBroadcastChannel from './useBroadcastChannel';\n\nexport function useBroadcastLoginListener(\n onLogin?: (message: BroadcastLoginMessage) => void,\n onLogout?: (message: BroadcastLogoutMessage) => void\n): void {\n const onMessage = useCallback(\n (event: MessageEvent<PostMessage<unknown>>) => {\n if (isBroadcastLoginMessage(event.data)) {\n onLogin?.(event.data);\n } else if (isBroadcastLogoutMessage(event.data)) {\n onLogout?.(event.data);\n }\n },\n [onLogin, onLogout]\n );\n\n useBroadcastChannel(onMessage);\n}\n\nexport default useBroadcastLoginListener;\n"],"mappings":"AAAA,SAGEA,uBAAuB,EACvBC,wBAAwB,QACnB,wBAAwB;AAE/B,SAASC,WAAW,QAAQ,OAAO;AAAC,OAC7BC,mBAAmB;AAE1B,OAAO,SAASC,yBAAyBA,CACvCC,OAAkD,EAClDC,QAAoD,EAC9C;EACN,IAAMC,SAAS,GAAGL,WAAW,CAC1BM,KAAyC,IAAK;IAC7C,IAAIR,uBAAuB,CAACQ,KAAK,CAACC,IAAI,CAAC,EAAE;MACvCJ,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAGG,KAAK,CAACC,IAAI,CAAC;IACvB,CAAC,MAAM,IAAIR,wBAAwB,CAACO,KAAK,CAACC,IAAI,CAAC,EAAE;MAC/CH,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAGE,KAAK,CAACC,IAAI,CAAC;IACxB;EACF,CAAC,EACD,CAACJ,OAAO,EAAEC,QAAQ,CACpB,CAAC;EAEDH,mBAAmB,CAACI,SAAS,CAAC;AAChC;AAEA,eAAeH,yBAAyB"}
1
+ {"version":3,"file":"useBroadcastLoginListener.js","names":["isBroadcastLoginMessage","isBroadcastLogoutMessage","useCallback","useBroadcastChannel","useBroadcastLoginListener","onLogin","onLogout","onMessage","event","data"],"sources":["../src/useBroadcastLoginListener.ts"],"sourcesContent":["import {\n type BroadcastLoginMessage,\n type BroadcastLogoutMessage,\n isBroadcastLoginMessage,\n isBroadcastLogoutMessage,\n} from '@deephaven/jsapi-utils';\nimport type { PostMessage } from '@deephaven/utils';\nimport { useCallback } from 'react';\nimport useBroadcastChannel from './useBroadcastChannel';\n\nexport function useBroadcastLoginListener(\n onLogin?: (message: BroadcastLoginMessage) => void,\n onLogout?: (message: BroadcastLogoutMessage) => void\n): void {\n const onMessage = useCallback(\n (event: MessageEvent<PostMessage<unknown>>) => {\n if (isBroadcastLoginMessage(event.data)) {\n onLogin?.(event.data);\n } else if (isBroadcastLogoutMessage(event.data)) {\n onLogout?.(event.data);\n }\n },\n [onLogin, onLogout]\n );\n\n useBroadcastChannel(onMessage);\n}\n\nexport default useBroadcastLoginListener;\n"],"mappings":"AAAA,SAGEA,uBAAuB,EACvBC,wBAAwB,QACnB,wBAAwB;AAE/B,SAASC,WAAW,QAAQ,OAAO;AAAC,OAC7BC,mBAAmB;AAE1B,OAAO,SAASC,yBAAyBA,CACvCC,OAAkD,EAClDC,QAAoD,EAC9C;EACN,IAAMC,SAAS,GAAGL,WAAW,CAC1BM,KAAyC,IAAK;IAC7C,IAAIR,uBAAuB,CAACQ,KAAK,CAACC,IAAI,CAAC,EAAE;MACvCJ,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAGG,KAAK,CAACC,IAAI,CAAC;IACvB,CAAC,MAAM,IAAIR,wBAAwB,CAACO,KAAK,CAACC,IAAI,CAAC,EAAE;MAC/CH,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAGE,KAAK,CAACC,IAAI,CAAC;IACxB;EACF,CAAC,EACD,CAACJ,OAAO,EAAEC,QAAQ,CACpB,CAAC;EAEDH,mBAAmB,CAACI,SAAS,CAAC;AAChC;AAEA,eAAeH,yBAAyB","ignoreList":[]}
@@ -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"}
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 +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"}
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 +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"}
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 +1 @@
1
- {"version":3,"file":"useFilterConditionFactories.js","names":["useMemo","removeNullAndUndefined","useFilterConditionFactories","maybeTable","_len","arguments","length","filterConditionFactories","Array","_key","map","f"],"sources":["../src/useFilterConditionFactories.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport type { FilterConditionFactory } from '@deephaven/jsapi-utils';\nimport { removeNullAndUndefined } from '@deephaven/utils';\n\nexport function useFilterConditionFactories(\n maybeTable: dh.Table | dh.TreeTable | null | undefined,\n ...filterConditionFactories: FilterConditionFactory[]\n): dh.FilterCondition[] {\n return useMemo(\n () =>\n removeNullAndUndefined(\n ...filterConditionFactories.map(f => f(maybeTable))\n ),\n // Intentionally disabling hooks check so we can spread\n // the array items as dependencies.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [maybeTable, ...filterConditionFactories]\n );\n}\n\nexport default useFilterConditionFactories;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAG/B,SAASC,sBAAsB,QAAQ,kBAAkB;AAEzD,OAAO,SAASC,2BAA2BA,CACzCC,UAAsD,EAEhC;EAAA,SAAAC,IAAA,GAAAC,SAAA,CAAAC,MAAA,EADnBC,wBAAwB,OAAAC,KAAA,CAAAJ,IAAA,OAAAA,IAAA,WAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;IAAxBF,wBAAwB,CAAAE,IAAA,QAAAJ,SAAA,CAAAI,IAAA;EAAA;EAE3B,OAAOT,OAAO,CACZ,MACEC,sBAAsB,CACpB,GAAGM,wBAAwB,CAACG,GAAG,CAACC,CAAC,IAAIA,CAAC,CAACR,UAAU,CAAC,CACpD,CAAC;EACH;EACA;EACA;EACA,CAACA,UAAU,EAAE,GAAGI,wBAAwB,CAC1C,CAAC;AACH;AAEA,eAAeL,2BAA2B"}
1
+ {"version":3,"file":"useFilterConditionFactories.js","names":["useMemo","removeNullAndUndefined","useFilterConditionFactories","maybeTable","_len","arguments","length","filterConditionFactories","Array","_key","map","f"],"sources":["../src/useFilterConditionFactories.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport type { FilterConditionFactory } from '@deephaven/jsapi-utils';\nimport { removeNullAndUndefined } from '@deephaven/utils';\n\nexport function useFilterConditionFactories(\n maybeTable: dh.Table | dh.TreeTable | null | undefined,\n ...filterConditionFactories: FilterConditionFactory[]\n): dh.FilterCondition[] {\n return useMemo(\n () =>\n removeNullAndUndefined(\n ...filterConditionFactories.map(f => f(maybeTable))\n ),\n // Intentionally disabling hooks check so we can spread\n // the array items as dependencies.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [maybeTable, ...filterConditionFactories]\n );\n}\n\nexport default useFilterConditionFactories;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAG/B,SAASC,sBAAsB,QAAQ,kBAAkB;AAEzD,OAAO,SAASC,2BAA2BA,CACzCC,UAAsD,EAEhC;EAAA,SAAAC,IAAA,GAAAC,SAAA,CAAAC,MAAA,EADnBC,wBAAwB,OAAAC,KAAA,CAAAJ,IAAA,OAAAA,IAAA,WAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;IAAxBF,wBAAwB,CAAAE,IAAA,QAAAJ,SAAA,CAAAI,IAAA;EAAA;EAE3B,OAAOT,OAAO,CACZ,MACEC,sBAAsB,CACpB,GAAGM,wBAAwB,CAACG,GAAG,CAACC,CAAC,IAAIA,CAAC,CAACR,UAAU,CAAC,CACpD,CAAC;EACH;EACA;EACA;EACA,CAACA,UAAU,EAAE,GAAGI,wBAAwB,CAC1C,CAAC;AACH;AAEA,eAAeL,2BAA2B","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useFilteredItemsWithDefaultValue.js","names":["useMemo","useRef","useFilteredItemsWithDefaultValue","items","displayProp","searchText","defaultDisplayValue","searchTextRef","current","isLoading","length","item","toLowerCase","includes","key"],"sources":["../src/useFilteredItemsWithDefaultValue.ts"],"sourcesContent":["import { useMemo, useRef } from 'react';\nimport { type KeyedItem } from '@deephaven/utils';\n\n/**\n * Takes an array of items and adds a default item to the top of the list if:\n * 1. defaultDisplayValue is provided\n * 2. The `searchText` is empty or\n * The `searchText` is contained (case insensitive) in the default item display text.\n * @param items List of items filtered on `searchText`\n * @param displayProp The item prop containing display text\n * @param searchText The current search text that is filtering the items\n * @param defaultDisplayValue The display text to set as the default item `displayProp` value\n */\nexport function useFilteredItemsWithDefaultValue<\n TItem,\n TProp extends keyof TItem,\n>(\n items: KeyedItem<TItem>[],\n displayProp: TProp,\n searchText: string,\n defaultDisplayValue?: string | null\n): KeyedItem<TItem>[] {\n // Exclude search text from updating the memo. This ensures that adding /\n // removing of the default item stays in sync with data loading. Otherwise,\n // the item can move while data is still loading.\n const searchTextRef = useRef('');\n searchTextRef.current = searchText;\n\n return useMemo(() => {\n // If the list is still loading, items will exist, but their item prop will be undefined\n const isLoading = items.length > 0 && items[0].item == null;\n\n if (\n !isLoading &&\n defaultDisplayValue != null &&\n (searchTextRef.current === '' ||\n defaultDisplayValue\n .toLowerCase()\n .includes(searchTextRef.current.toLowerCase()))\n ) {\n return [\n {\n key: defaultDisplayValue,\n item: { [displayProp]: defaultDisplayValue } as TItem,\n },\n ...items,\n ];\n }\n\n return items;\n }, [defaultDisplayValue, displayProp, items]);\n}\n\nexport default useFilteredItemsWithDefaultValue;\n"],"mappings":"AAAA,SAASA,OAAO,EAAEC,MAAM,QAAQ,OAAO;AAGvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,gCAAgCA,CAI9CC,KAAyB,EACzBC,WAAkB,EAClBC,UAAkB,EAClBC,mBAAmC,EACf;EACpB;EACA;EACA;EACA,IAAMC,aAAa,GAAGN,MAAM,CAAC,EAAE,CAAC;EAChCM,aAAa,CAACC,OAAO,GAAGH,UAAU;EAElC,OAAOL,OAAO,CAAC,MAAM;IACnB;IACA,IAAMS,SAAS,GAAGN,KAAK,CAACO,MAAM,GAAG,CAAC,IAAIP,KAAK,CAAC,CAAC,CAAC,CAACQ,IAAI,IAAI,IAAI;IAE3D,IACE,CAACF,SAAS,IACVH,mBAAmB,IAAI,IAAI,KAC1BC,aAAa,CAACC,OAAO,KAAK,EAAE,IAC3BF,mBAAmB,CAChBM,WAAW,CAAC,CAAC,CACbC,QAAQ,CAACN,aAAa,CAACC,OAAO,CAACI,WAAW,CAAC,CAAC,CAAC,CAAC,EACnD;MACA,OAAO,CACL;QACEE,GAAG,EAAER,mBAAmB;QACxBK,IAAI,EAAE;UAAE,CAACP,WAAW,GAAGE;QAAoB;MAC7C,CAAC,EACD,GAAGH,KAAK,CACT;IACH;IAEA,OAAOA,KAAK;EACd,CAAC,EAAE,CAACG,mBAAmB,EAAEF,WAAW,EAAED,KAAK,CAAC,CAAC;AAC/C;AAEA,eAAeD,gCAAgC"}
1
+ {"version":3,"file":"useFilteredItemsWithDefaultValue.js","names":["useMemo","useRef","useFilteredItemsWithDefaultValue","items","displayProp","searchText","defaultDisplayValue","searchTextRef","current","isLoading","length","item","toLowerCase","includes","key"],"sources":["../src/useFilteredItemsWithDefaultValue.ts"],"sourcesContent":["import { useMemo, useRef } from 'react';\nimport { type KeyedItem } from '@deephaven/utils';\n\n/**\n * Takes an array of items and adds a default item to the top of the list if:\n * 1. defaultDisplayValue is provided\n * 2. The `searchText` is empty or\n * The `searchText` is contained (case insensitive) in the default item display text.\n * @param items List of items filtered on `searchText`\n * @param displayProp The item prop containing display text\n * @param searchText The current search text that is filtering the items\n * @param defaultDisplayValue The display text to set as the default item `displayProp` value\n */\nexport function useFilteredItemsWithDefaultValue<\n TItem,\n TProp extends keyof TItem,\n>(\n items: KeyedItem<TItem>[],\n displayProp: TProp,\n searchText: string,\n defaultDisplayValue?: string | null\n): KeyedItem<TItem>[] {\n // Exclude search text from updating the memo. This ensures that adding /\n // removing of the default item stays in sync with data loading. Otherwise,\n // the item can move while data is still loading.\n const searchTextRef = useRef('');\n searchTextRef.current = searchText;\n\n return useMemo(() => {\n // If the list is still loading, items will exist, but their item prop will be undefined\n const isLoading = items.length > 0 && items[0].item == null;\n\n if (\n !isLoading &&\n defaultDisplayValue != null &&\n (searchTextRef.current === '' ||\n defaultDisplayValue\n .toLowerCase()\n .includes(searchTextRef.current.toLowerCase()))\n ) {\n return [\n {\n key: defaultDisplayValue,\n item: { [displayProp]: defaultDisplayValue } as TItem,\n },\n ...items,\n ];\n }\n\n return items;\n }, [defaultDisplayValue, displayProp, items]);\n}\n\nexport default useFilteredItemsWithDefaultValue;\n"],"mappings":"AAAA,SAASA,OAAO,EAAEC,MAAM,QAAQ,OAAO;AAGvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,gCAAgCA,CAI9CC,KAAyB,EACzBC,WAAkB,EAClBC,UAAkB,EAClBC,mBAAmC,EACf;EACpB;EACA;EACA;EACA,IAAMC,aAAa,GAAGN,MAAM,CAAC,EAAE,CAAC;EAChCM,aAAa,CAACC,OAAO,GAAGH,UAAU;EAElC,OAAOL,OAAO,CAAC,MAAM;IACnB;IACA,IAAMS,SAAS,GAAGN,KAAK,CAACO,MAAM,GAAG,CAAC,IAAIP,KAAK,CAAC,CAAC,CAAC,CAACQ,IAAI,IAAI,IAAI;IAE3D,IACE,CAACF,SAAS,IACVH,mBAAmB,IAAI,IAAI,KAC1BC,aAAa,CAACC,OAAO,KAAK,EAAE,IAC3BF,mBAAmB,CAChBM,WAAW,CAAC,CAAC,CACbC,QAAQ,CAACN,aAAa,CAACC,OAAO,CAACI,WAAW,CAAC,CAAC,CAAC,CAAC,EACnD;MACA,OAAO,CACL;QACEE,GAAG,EAAER,mBAAmB;QACxBK,IAAI,EAAE;UAAE,CAACP,WAAW,GAAGE;QAAoB;MAC7C,CAAC,EACD,GAAGH,KAAK,CACT;IACH;IAEA,OAAOA,KAAK;EACd,CAAC,EAAE,CAACG,mBAAmB,EAAEF,WAAW,EAAED,KAAK,CAAC,CAAC;AAC/C;AAEA,eAAeD,gCAAgC","ignoreList":[]}
@@ -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"}
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 +1 @@
1
- {"version":3,"file":"useGetItemIndexByValue.js","names":["useCallback","useTableUtils","useGetItemIndexByValue","_ref","columnName","value","table","tableUtils","_asyncToGenerator","column","findColumn","columnValueType","getValueType","type","index","seekRow"],"sources":["../src/useGetItemIndexByValue.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { type dh } from '@deephaven/jsapi-types';\nimport { useTableUtils } from './useTableUtils';\n\n/**\n * Returns a function that gets the index of the first row containing a column\n * value.\n * @param columnName The name of the column to search\n * @param value The value to search for\n * @param table The table to search in\n * @returns A function that returns the index of the first row containing the\n * matching value, or `null` if no match is found\n */\nexport function useGetItemIndexByValue<TValue>({\n columnName,\n value,\n table,\n}: {\n columnName: string | null;\n table: dh.Table | null;\n value: TValue | null | undefined;\n}): () => Promise<number | null> {\n const tableUtils = useTableUtils();\n\n return useCallback(async () => {\n if (table == null || value == null || columnName == null) {\n return null;\n }\n\n const column = table.findColumn(columnName);\n const columnValueType = tableUtils.getValueType(column.type);\n\n const index = await table.seekRow(0, column, columnValueType, value);\n return index === -1 ? null : index;\n }, [columnName, table, tableUtils, value]);\n}\n\nexport default useGetItemIndexByValue;\n"],"mappings":";;AAAA,SAASA,WAAW,QAAQ,OAAO;AAAC,SAE3BC,aAAa;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,sBAAsBA,CAAAC,IAAA,EAQL;EAAA,IARc;IAC7CC,UAAU;IACVC,KAAK;IACLC;EAKF,CAAC,GAAAH,IAAA;EACC,IAAMI,UAAU,GAAGN,aAAa,CAAC,CAAC;EAElC,OAAOD,WAAW,eAAAQ,iBAAA,CAAC,aAAY;IAC7B,IAAIF,KAAK,IAAI,IAAI,IAAID,KAAK,IAAI,IAAI,IAAID,UAAU,IAAI,IAAI,EAAE;MACxD,OAAO,IAAI;IACb;IAEA,IAAMK,MAAM,GAAGH,KAAK,CAACI,UAAU,CAACN,UAAU,CAAC;IAC3C,IAAMO,eAAe,GAAGJ,UAAU,CAACK,YAAY,CAACH,MAAM,CAACI,IAAI,CAAC;IAE5D,IAAMC,KAAK,SAASR,KAAK,CAACS,OAAO,CAAC,CAAC,EAAEN,MAAM,EAAEE,eAAe,EAAEN,KAAK,CAAC;IACpE,OAAOS,KAAK,KAAK,CAAC,CAAC,GAAG,IAAI,GAAGA,KAAK;EACpC,CAAC,GAAE,CAACV,UAAU,EAAEE,KAAK,EAAEC,UAAU,EAAEF,KAAK,CAAC,CAAC;AAC5C;AAEA,eAAeH,sBAAsB"}
1
+ {"version":3,"file":"useGetItemIndexByValue.js","names":["useCallback","useTableUtils","useGetItemIndexByValue","_ref","columnName","value","table","tableUtils","_asyncToGenerator","column","findColumn","columnValueType","getValueType","type","index","seekRow"],"sources":["../src/useGetItemIndexByValue.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { type dh } from '@deephaven/jsapi-types';\nimport { useTableUtils } from './useTableUtils';\n\n/**\n * Returns a function that gets the index of the first row containing a column\n * value.\n * @param columnName The name of the column to search\n * @param value The value to search for\n * @param table The table to search in\n * @returns A function that returns the index of the first row containing the\n * matching value, or `null` if no match is found\n */\nexport function useGetItemIndexByValue<TValue>({\n columnName,\n value,\n table,\n}: {\n columnName: string | null;\n table: dh.Table | null;\n value: TValue | null | undefined;\n}): () => Promise<number | null> {\n const tableUtils = useTableUtils();\n\n return useCallback(async () => {\n if (table == null || value == null || columnName == null) {\n return null;\n }\n\n const column = table.findColumn(columnName);\n const columnValueType = tableUtils.getValueType(column.type);\n\n const index = await table.seekRow(0, column, columnValueType, value);\n return index === -1 ? null : index;\n }, [columnName, table, tableUtils, value]);\n}\n\nexport default useGetItemIndexByValue;\n"],"mappings":";;AAAA,SAASA,WAAW,QAAQ,OAAO;AAAC,SAE3BC,aAAa;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,sBAAsBA,CAAAC,IAAA,EAQL;EAAA,IARc;IAC7CC,UAAU;IACVC,KAAK;IACLC;EAKF,CAAC,GAAAH,IAAA;EACC,IAAMI,UAAU,GAAGN,aAAa,CAAC,CAAC;EAElC,OAAOD,WAAW,eAAAQ,iBAAA,CAAC,aAAY;IAC7B,IAAIF,KAAK,IAAI,IAAI,IAAID,KAAK,IAAI,IAAI,IAAID,UAAU,IAAI,IAAI,EAAE;MACxD,OAAO,IAAI;IACb;IAEA,IAAMK,MAAM,GAAGH,KAAK,CAACI,UAAU,CAACN,UAAU,CAAC;IAC3C,IAAMO,eAAe,GAAGJ,UAAU,CAACK,YAAY,CAACH,MAAM,CAACI,IAAI,CAAC;IAE5D,IAAMC,KAAK,SAASR,KAAK,CAACS,OAAO,CAAC,CAAC,EAAEN,MAAM,EAAEE,eAAe,EAAEN,KAAK,CAAC;IACpE,OAAOS,KAAK,KAAK,CAAC,CAAC,GAAG,IAAI,GAAGA,KAAK;EACpC,CAAC,GAAE,CAACV,UAAU,EAAEE,KAAK,EAAEC,UAAU,EAAEF,KAAK,CAAC,CAAC;AAC5C;AAEA,eAAeH,sBAAsB","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useGetItemPosition.js","names":["useCallback","useGetItemPosition","_ref","table","columnName","defaultValue","itemHeight","topOffset","value","_asyncToGenerator","column","findColumn","rowIndex","seekRow","defaultItemOffset"],"sources":["../src/useGetItemPosition.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\n\nexport interface UseGetItemPositionOptions {\n table?: dh.Table | null;\n columnName: string;\n defaultValue?: string | null;\n itemHeight: number;\n topOffset?: number;\n value: string;\n}\n\n/**\n * Gets an item's position in a list of items based on its row index in a table.\n * @param table Table to search for the item in\n * @param columnName Column name to search for the item in\n * @param defaultValue Optional default value. This would be the first item in\n * the list and not expected to be in the Table.\n * @param itemHeight Height of each item in the list\n * @param topOffset Optional pixel offset from the top of the list\n * @param value Value to search for in the column\n */\nexport function useGetItemPosition({\n table,\n columnName,\n defaultValue,\n itemHeight,\n topOffset = 0,\n value,\n}: UseGetItemPositionOptions): () => Promise<number> {\n return useCallback(async () => {\n if (table == null || value === '' || value === defaultValue) {\n return topOffset;\n }\n\n const column = table.findColumn(columnName);\n const rowIndex = await table.seekRow(0, column, 'String', value);\n\n // If a default item exists at the top of the list, offset the item index by 1\n const defaultItemOffset = defaultValue == null ? 0 : 1;\n\n return (rowIndex + defaultItemOffset) * itemHeight + topOffset;\n }, [columnName, defaultValue, itemHeight, table, topOffset, value]);\n}\n\nexport default useGetItemPosition;\n"],"mappings":";;AAAA,SAASA,WAAW,QAAQ,OAAO;AAYnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAAAC,IAAA,EAOmB;EAAA,IAPlB;IACjCC,KAAK;IACLC,UAAU;IACVC,YAAY;IACZC,UAAU;IACVC,SAAS,GAAG,CAAC;IACbC;EACyB,CAAC,GAAAN,IAAA;EAC1B,OAAOF,WAAW,eAAAS,iBAAA,CAAC,aAAY;IAC7B,IAAIN,KAAK,IAAI,IAAI,IAAIK,KAAK,KAAK,EAAE,IAAIA,KAAK,KAAKH,YAAY,EAAE;MAC3D,OAAOE,SAAS;IAClB;IAEA,IAAMG,MAAM,GAAGP,KAAK,CAACQ,UAAU,CAACP,UAAU,CAAC;IAC3C,IAAMQ,QAAQ,SAAST,KAAK,CAACU,OAAO,CAAC,CAAC,EAAEH,MAAM,EAAE,QAAQ,EAAEF,KAAK,CAAC;;IAEhE;IACA,IAAMM,iBAAiB,GAAGT,YAAY,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC;IAEtD,OAAO,CAACO,QAAQ,GAAGE,iBAAiB,IAAIR,UAAU,GAAGC,SAAS;EAChE,CAAC,GAAE,CAACH,UAAU,EAAEC,YAAY,EAAEC,UAAU,EAAEH,KAAK,EAAEI,SAAS,EAAEC,KAAK,CAAC,CAAC;AACrE;AAEA,eAAeP,kBAAkB"}
1
+ {"version":3,"file":"useGetItemPosition.js","names":["useCallback","useGetItemPosition","_ref","table","columnName","defaultValue","itemHeight","topOffset","value","_asyncToGenerator","column","findColumn","rowIndex","seekRow","defaultItemOffset"],"sources":["../src/useGetItemPosition.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\n\nexport interface UseGetItemPositionOptions {\n table?: dh.Table | null;\n columnName: string;\n defaultValue?: string | null;\n itemHeight: number;\n topOffset?: number;\n value: string;\n}\n\n/**\n * Gets an item's position in a list of items based on its row index in a table.\n * @param table Table to search for the item in\n * @param columnName Column name to search for the item in\n * @param defaultValue Optional default value. This would be the first item in\n * the list and not expected to be in the Table.\n * @param itemHeight Height of each item in the list\n * @param topOffset Optional pixel offset from the top of the list\n * @param value Value to search for in the column\n */\nexport function useGetItemPosition({\n table,\n columnName,\n defaultValue,\n itemHeight,\n topOffset = 0,\n value,\n}: UseGetItemPositionOptions): () => Promise<number> {\n return useCallback(async () => {\n if (table == null || value === '' || value === defaultValue) {\n return topOffset;\n }\n\n const column = table.findColumn(columnName);\n const rowIndex = await table.seekRow(0, column, 'String', value);\n\n // If a default item exists at the top of the list, offset the item index by 1\n const defaultItemOffset = defaultValue == null ? 0 : 1;\n\n return (rowIndex + defaultItemOffset) * itemHeight + topOffset;\n }, [columnName, defaultValue, itemHeight, table, topOffset, value]);\n}\n\nexport default useGetItemPosition;\n"],"mappings":";;AAAA,SAASA,WAAW,QAAQ,OAAO;AAYnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,kBAAkBA,CAAAC,IAAA,EAOmB;EAAA,IAPlB;IACjCC,KAAK;IACLC,UAAU;IACVC,YAAY;IACZC,UAAU;IACVC,SAAS,GAAG,CAAC;IACbC;EACyB,CAAC,GAAAN,IAAA;EAC1B,OAAOF,WAAW,eAAAS,iBAAA,CAAC,aAAY;IAC7B,IAAIN,KAAK,IAAI,IAAI,IAAIK,KAAK,KAAK,EAAE,IAAIA,KAAK,KAAKH,YAAY,EAAE;MAC3D,OAAOE,SAAS;IAClB;IAEA,IAAMG,MAAM,GAAGP,KAAK,CAACQ,UAAU,CAACP,UAAU,CAAC;IAC3C,IAAMQ,QAAQ,SAAST,KAAK,CAACU,OAAO,CAAC,CAAC,EAAEH,MAAM,EAAE,QAAQ,EAAEF,KAAK,CAAC;;IAEhE;IACA,IAAMM,iBAAiB,GAAGT,YAAY,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC;IAEtD,OAAO,CAACO,QAAQ,GAAGE,iBAAiB,IAAIR,UAAU,GAAGC,SAAS;EAChE,CAAC,GAAE,CAACH,UAAU,EAAEC,YAAY,EAAEC,UAAU,EAAEH,KAAK,EAAEI,SAAS,EAAEC,KAAK,CAAC,CAAC;AACrE;AAEA,eAAeP,kBAAkB","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useInitializeViewportData.js","names":["useEffect","generateEmptyKeyedItems","useWindowedListData","Log","useTableSize","log","module","resizeItemsArray","_ref","items","targetSize","reuseExistingItems","currentSize","length","debug","Array","from","slice","useInitializeViewportData","table","reuseItemsOnTableResize","arguments","undefined","viewportData","Math","max","setItems"],"sources":["../src/useInitializeViewportData.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { generateEmptyKeyedItems } from '@deephaven/jsapi-utils';\nimport {\n useWindowedListData,\n type WindowedListData,\n} from '@deephaven/react-hooks';\nimport { type KeyedItem } from '@deephaven/utils';\nimport Log from '@deephaven/log';\nimport useTableSize from './useTableSize';\n\nconst log = Log.module('useInitializeViewportData');\n\n/**\n * Given an array of items, returns a new array containing the target number of\n * items. If reuseExistingItems is true, existing items will be re-used. If\n * false, all items will be replaced with new, empty items.\n * @param items The array of items to resize.\n * @param targetSize The desired size of the array.\n * @param reuseExistingItems If true, existing items will be re-used. If false,\n * all items will be replaced with new, empty items.\n * @returns The resized array of items.\n */\nfunction resizeItemsArray<T>({\n items,\n targetSize,\n reuseExistingItems,\n}: {\n items: KeyedItem<T, string>[];\n reuseExistingItems: boolean;\n targetSize: number;\n}): KeyedItem<T, string>[] {\n const currentSize = items.length;\n\n // If size isn't changing, do nothing\n if (currentSize === targetSize) {\n return items;\n }\n\n log.debug('size changed:', { currentSize, targetSize });\n\n // Re-create entire array with empty items\n if (!reuseExistingItems) {\n return Array.from(generateEmptyKeyedItems<T>(0, targetSize - 1));\n }\n\n // Drop extra items\n if (currentSize > targetSize) {\n return items.slice(0, targetSize);\n }\n\n // Add missing items\n return [...items, ...generateEmptyKeyedItems<T>(currentSize, targetSize - 1)];\n}\n\n/**\n * Initializes a ListData instance that can be used for windowed views of a\n * Table. The list must always contain a KeyedItem for every record in the table,\n * so it is pre-populated with empty items that can be updated with real data as\n * the window changes.\n *\n * IMPORTANT: this will create an empty KeyedItem object for every row in the\n * source table. This is intended for \"human\" sized tables such as those used in\n * admin panels. This is not suitable for \"machine\" scale with millions+ rows.\n * @param table The table that will be used to determine the list size.\n * @param reuseItemsOnTableResize Whether to reuse existing items when the table\n * size changes (defaults to false).\n * - If true, existing items will be reused when the table resizes. This is\n * recommended for ticking tables where the data is frequently updated in order\n * to avoid UI flicker.\n * - If false, all of the items will be replaced when the table resizes. This is\n * recommnded for tables that don't change size frequently but may change size\n * due to a user interaction. e.g. Filter via a search input. This avoids a\n * different kind of flicker, where the item values will shift around as the\n * user types. It is less jarring for the items to all reset to empty and then\n * show the new results all at once.\n * @returns a WindowedListData object.\n */\nexport function useInitializeViewportData<T>(\n table: dh.Table | dh.TreeTable | null,\n reuseItemsOnTableResize = false\n): WindowedListData<KeyedItem<T>> {\n const viewportData = useWindowedListData<KeyedItem<T>>({});\n\n // If the table changes size, we need to re-initialize it.\n const targetSize = Math.max(0, useTableSize(table));\n\n // Whenever the table reference or size changes, resize the list.\n useEffect(() => {\n viewportData.setItems(\n resizeItemsArray({\n items: viewportData.items,\n targetSize,\n reuseExistingItems: reuseItemsOnTableResize,\n })\n );\n\n // Intentionally excluding viewportData since it changes on every render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [targetSize, table]);\n\n return viewportData;\n}\n\nexport default useInitializeViewportData;\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AAEjC,SAASC,uBAAuB,QAAQ,wBAAwB;AAChE,SACEC,mBAAmB,QAEd,wBAAwB;AAE/B,OAAOC,GAAG,MAAM,gBAAgB;AAAC,OAC1BC,YAAY;AAEnB,IAAMC,GAAG,GAAGF,GAAG,CAACG,MAAM,CAAC,2BAA2B,CAAC;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,gBAAgBA,CAAAC,IAAA,EAQE;EAAA,IARE;IAC3BC,KAAK;IACLC,UAAU;IACVC;EAKF,CAAC,GAAAH,IAAA;EACC,IAAMI,WAAW,GAAGH,KAAK,CAACI,MAAM;;EAEhC;EACA,IAAID,WAAW,KAAKF,UAAU,EAAE;IAC9B,OAAOD,KAAK;EACd;EAEAJ,GAAG,CAACS,KAAK,CAAC,eAAe,EAAE;IAAEF,WAAW;IAAEF;EAAW,CAAC,CAAC;;EAEvD;EACA,IAAI,CAACC,kBAAkB,EAAE;IACvB,OAAOI,KAAK,CAACC,IAAI,CAACf,uBAAuB,CAAI,CAAC,EAAES,UAAU,GAAG,CAAC,CAAC,CAAC;EAClE;;EAEA;EACA,IAAIE,WAAW,GAAGF,UAAU,EAAE;IAC5B,OAAOD,KAAK,CAACQ,KAAK,CAAC,CAAC,EAAEP,UAAU,CAAC;EACnC;;EAEA;EACA,OAAO,CAAC,GAAGD,KAAK,EAAE,GAAGR,uBAAuB,CAAIW,WAAW,EAAEF,UAAU,GAAG,CAAC,CAAC,CAAC;AAC/E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASQ,yBAAyBA,CACvCC,KAAqC,EAEL;EAAA,IADhCC,uBAAuB,GAAAC,SAAA,CAAAR,MAAA,QAAAQ,SAAA,QAAAC,SAAA,GAAAD,SAAA,MAAG,KAAK;EAE/B,IAAME,YAAY,GAAGrB,mBAAmB,CAAe,CAAC,CAAC,CAAC;;EAE1D;EACA,IAAMQ,UAAU,GAAGc,IAAI,CAACC,GAAG,CAAC,CAAC,EAAErB,YAAY,CAACe,KAAK,CAAC,CAAC;;EAEnD;EACAnB,SAAS,CAAC,MAAM;IACduB,YAAY,CAACG,QAAQ,CACnBnB,gBAAgB,CAAC;MACfE,KAAK,EAAEc,YAAY,CAACd,KAAK;MACzBC,UAAU;MACVC,kBAAkB,EAAES;IACtB,CAAC,CACH,CAAC;;IAED;IACA;EACF,CAAC,EAAE,CAACV,UAAU,EAAES,KAAK,CAAC,CAAC;EAEvB,OAAOI,YAAY;AACrB;AAEA,eAAeL,yBAAyB"}
1
+ {"version":3,"file":"useInitializeViewportData.js","names":["useEffect","generateEmptyKeyedItems","useWindowedListData","Log","useTableSize","log","module","resizeItemsArray","_ref","items","targetSize","reuseExistingItems","currentSize","length","debug","Array","from","slice","useInitializeViewportData","table","reuseItemsOnTableResize","arguments","undefined","viewportData","Math","max","setItems"],"sources":["../src/useInitializeViewportData.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { generateEmptyKeyedItems } from '@deephaven/jsapi-utils';\nimport {\n useWindowedListData,\n type WindowedListData,\n} from '@deephaven/react-hooks';\nimport { type KeyedItem } from '@deephaven/utils';\nimport Log from '@deephaven/log';\nimport useTableSize from './useTableSize';\n\nconst log = Log.module('useInitializeViewportData');\n\n/**\n * Given an array of items, returns a new array containing the target number of\n * items. If reuseExistingItems is true, existing items will be re-used. If\n * false, all items will be replaced with new, empty items.\n * @param items The array of items to resize.\n * @param targetSize The desired size of the array.\n * @param reuseExistingItems If true, existing items will be re-used. If false,\n * all items will be replaced with new, empty items.\n * @returns The resized array of items.\n */\nfunction resizeItemsArray<T>({\n items,\n targetSize,\n reuseExistingItems,\n}: {\n items: KeyedItem<T, string>[];\n reuseExistingItems: boolean;\n targetSize: number;\n}): KeyedItem<T, string>[] {\n const currentSize = items.length;\n\n // If size isn't changing, do nothing\n if (currentSize === targetSize) {\n return items;\n }\n\n log.debug('size changed:', { currentSize, targetSize });\n\n // Re-create entire array with empty items\n if (!reuseExistingItems) {\n return Array.from(generateEmptyKeyedItems<T>(0, targetSize - 1));\n }\n\n // Drop extra items\n if (currentSize > targetSize) {\n return items.slice(0, targetSize);\n }\n\n // Add missing items\n return [...items, ...generateEmptyKeyedItems<T>(currentSize, targetSize - 1)];\n}\n\n/**\n * Initializes a ListData instance that can be used for windowed views of a\n * Table. The list must always contain a KeyedItem for every record in the table,\n * so it is pre-populated with empty items that can be updated with real data as\n * the window changes.\n *\n * IMPORTANT: this will create an empty KeyedItem object for every row in the\n * source table. This is intended for \"human\" sized tables such as those used in\n * admin panels. This is not suitable for \"machine\" scale with millions+ rows.\n * @param table The table that will be used to determine the list size.\n * @param reuseItemsOnTableResize Whether to reuse existing items when the table\n * size changes (defaults to false).\n * - If true, existing items will be reused when the table resizes. This is\n * recommended for ticking tables where the data is frequently updated in order\n * to avoid UI flicker.\n * - If false, all of the items will be replaced when the table resizes. This is\n * recommnded for tables that don't change size frequently but may change size\n * due to a user interaction. e.g. Filter via a search input. This avoids a\n * different kind of flicker, where the item values will shift around as the\n * user types. It is less jarring for the items to all reset to empty and then\n * show the new results all at once.\n * @returns a WindowedListData object.\n */\nexport function useInitializeViewportData<T>(\n table: dh.Table | dh.TreeTable | null,\n reuseItemsOnTableResize = false\n): WindowedListData<KeyedItem<T>> {\n const viewportData = useWindowedListData<KeyedItem<T>>({});\n\n // If the table changes size, we need to re-initialize it.\n const targetSize = Math.max(0, useTableSize(table));\n\n // Whenever the table reference or size changes, resize the list.\n useEffect(() => {\n viewportData.setItems(\n resizeItemsArray({\n items: viewportData.items,\n targetSize,\n reuseExistingItems: reuseItemsOnTableResize,\n })\n );\n\n // Intentionally excluding viewportData since it changes on every render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [targetSize, table]);\n\n return viewportData;\n}\n\nexport default useInitializeViewportData;\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AAEjC,SAASC,uBAAuB,QAAQ,wBAAwB;AAChE,SACEC,mBAAmB,QAEd,wBAAwB;AAE/B,OAAOC,GAAG,MAAM,gBAAgB;AAAC,OAC1BC,YAAY;AAEnB,IAAMC,GAAG,GAAGF,GAAG,CAACG,MAAM,CAAC,2BAA2B,CAAC;;AAEnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,gBAAgBA,CAAAC,IAAA,EAQE;EAAA,IARE;IAC3BC,KAAK;IACLC,UAAU;IACVC;EAKF,CAAC,GAAAH,IAAA;EACC,IAAMI,WAAW,GAAGH,KAAK,CAACI,MAAM;;EAEhC;EACA,IAAID,WAAW,KAAKF,UAAU,EAAE;IAC9B,OAAOD,KAAK;EACd;EAEAJ,GAAG,CAACS,KAAK,CAAC,eAAe,EAAE;IAAEF,WAAW;IAAEF;EAAW,CAAC,CAAC;;EAEvD;EACA,IAAI,CAACC,kBAAkB,EAAE;IACvB,OAAOI,KAAK,CAACC,IAAI,CAACf,uBAAuB,CAAI,CAAC,EAAES,UAAU,GAAG,CAAC,CAAC,CAAC;EAClE;;EAEA;EACA,IAAIE,WAAW,GAAGF,UAAU,EAAE;IAC5B,OAAOD,KAAK,CAACQ,KAAK,CAAC,CAAC,EAAEP,UAAU,CAAC;EACnC;;EAEA;EACA,OAAO,CAAC,GAAGD,KAAK,EAAE,GAAGR,uBAAuB,CAAIW,WAAW,EAAEF,UAAU,GAAG,CAAC,CAAC,CAAC;AAC/E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASQ,yBAAyBA,CACvCC,KAAqC,EAEL;EAAA,IADhCC,uBAAuB,GAAAC,SAAA,CAAAR,MAAA,QAAAQ,SAAA,QAAAC,SAAA,GAAAD,SAAA,MAAG,KAAK;EAE/B,IAAME,YAAY,GAAGrB,mBAAmB,CAAe,CAAC,CAAC,CAAC;;EAE1D;EACA,IAAMQ,UAAU,GAAGc,IAAI,CAACC,GAAG,CAAC,CAAC,EAAErB,YAAY,CAACe,KAAK,CAAC,CAAC;;EAEnD;EACAnB,SAAS,CAAC,MAAM;IACduB,YAAY,CAACG,QAAQ,CACnBnB,gBAAgB,CAAC;MACfE,KAAK,EAAEc,YAAY,CAACd,KAAK;MACzBC,UAAU;MACVC,kBAAkB,EAAES;IACtB,CAAC,CACH,CAAC;;IAED;IACA;EACF,CAAC,EAAE,CAACV,UAAU,EAAES,KAAK,CAAC,CAAC;EAEvB,OAAOI,YAAY;AACrB;AAEA,eAAeL,yBAAyB","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useNotNullOrEmptyFilter.js","names":["useMemo","createFilterConditionFactory","createNotNullOrEmptyFilterCondition","useTableUtils","useNotNullOrEmptyFilter","columnNames","conditionOperator","arguments","length","undefined","tableUtils","notNullOrEmptyFilterCondition"],"sources":["../src/useNotNullOrEmptyFilter.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n createFilterConditionFactory,\n createNotNullOrEmptyFilterCondition,\n type FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport useTableUtils from './useTableUtils';\n\nexport function useNotNullOrEmptyFilter(\n columnNames: string | string[],\n conditionOperator: 'and' | 'or' = 'or'\n): FilterConditionFactory {\n const tableUtils = useTableUtils();\n\n const notNullOrEmptyFilterCondition = useMemo(\n () => createNotNullOrEmptyFilterCondition(tableUtils),\n [tableUtils]\n );\n\n return useMemo(\n () =>\n createFilterConditionFactory(\n columnNames,\n notNullOrEmptyFilterCondition,\n conditionOperator\n ),\n [columnNames, conditionOperator, notNullOrEmptyFilterCondition]\n );\n}\n\nexport default useNotNullOrEmptyFilter;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SACEC,4BAA4B,EAC5BC,mCAAmC,QAE9B,wBAAwB;AAAC,OACzBC,aAAa;AAEpB,OAAO,SAASC,uBAAuBA,CACrCC,WAA8B,EAEN;EAAA,IADxBC,iBAA+B,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,IAAI;EAEtC,IAAMG,UAAU,GAAGP,aAAa,CAAC,CAAC;EAElC,IAAMQ,6BAA6B,GAAGX,OAAO,CAC3C,MAAME,mCAAmC,CAACQ,UAAU,CAAC,EACrD,CAACA,UAAU,CACb,CAAC;EAED,OAAOV,OAAO,CACZ,MACEC,4BAA4B,CAC1BI,WAAW,EACXM,6BAA6B,EAC7BL,iBACF,CAAC,EACH,CAACD,WAAW,EAAEC,iBAAiB,EAAEK,6BAA6B,CAChE,CAAC;AACH;AAEA,eAAeP,uBAAuB"}
1
+ {"version":3,"file":"useNotNullOrEmptyFilter.js","names":["useMemo","createFilterConditionFactory","createNotNullOrEmptyFilterCondition","useTableUtils","useNotNullOrEmptyFilter","columnNames","conditionOperator","arguments","length","undefined","tableUtils","notNullOrEmptyFilterCondition"],"sources":["../src/useNotNullOrEmptyFilter.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n createFilterConditionFactory,\n createNotNullOrEmptyFilterCondition,\n type FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport useTableUtils from './useTableUtils';\n\nexport function useNotNullOrEmptyFilter(\n columnNames: string | string[],\n conditionOperator: 'and' | 'or' = 'or'\n): FilterConditionFactory {\n const tableUtils = useTableUtils();\n\n const notNullOrEmptyFilterCondition = useMemo(\n () => createNotNullOrEmptyFilterCondition(tableUtils),\n [tableUtils]\n );\n\n return useMemo(\n () =>\n createFilterConditionFactory(\n columnNames,\n notNullOrEmptyFilterCondition,\n conditionOperator\n ),\n [columnNames, conditionOperator, notNullOrEmptyFilterCondition]\n );\n}\n\nexport default useNotNullOrEmptyFilter;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SACEC,4BAA4B,EAC5BC,mCAAmC,QAE9B,wBAAwB;AAAC,OACzBC,aAAa;AAEpB,OAAO,SAASC,uBAAuBA,CACrCC,WAA8B,EAEN;EAAA,IADxBC,iBAA+B,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,IAAI;EAEtC,IAAMG,UAAU,GAAGP,aAAa,CAAC,CAAC;EAElC,IAAMQ,6BAA6B,GAAGX,OAAO,CAC3C,MAAME,mCAAmC,CAACQ,UAAU,CAAC,EACrD,CAACA,UAAU,CACb,CAAC;EAED,OAAOV,OAAO,CACZ,MACEC,4BAA4B,CAC1BI,WAAW,EACXM,6BAA6B,EAC7BL,iBACF,CAAC,EACH,CAACD,WAAW,EAAEC,iBAAiB,EAAEK,6BAA6B,CAChE,CAAC;AACH;AAEA,eAAeP,uBAAuB","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"usePickerWithSelectedValues.js","names":["useCallback","useMemo","useState","createSearchTextFilter","createSelectedValuesFilter","useDebouncedCallback","useDebouncedValue","usePromiseFactory","usePickerItemScale","useFilterConditionFactories","useViewportData","useViewportFilter","useTableUtils","useTableClose","SEARCH_DEBOUNCE_MS","VIEWPORT_PADDING","VIEWPORT_SIZE","usePickerWithSelectedValues","_ref","maybeTable","columnName","mapItemToValue","filterConditionFactories","trimSearchText","timeZone","itemHeight","tableUtils","searchText","setSearchText","appliedSearchText","setAppliedSearchText","applySearchText","text","trim","searchTextMaybeTrimmed","selectedKey","setSelectedKey","selectedValueMap","setSelectedValueMap","Map","data","valueExists","isLoading","valueExistsIsLoading","doesColumnValueExist","isDebouncing","isApplyingFilter","searchTextExists","searchTextFilter","excludeSelectedValuesFilter","Set","keys","listTable","createDistinctSortedColumnTable","list","table","viewportSize","viewportPadding","hasSearchTextWithZeroResults","length","size","searchTextIsInSelectedValues","has","onDebouncedSearchTextChange","onSearchTextChange","setSelectedKeyOnNextFrame","onSelectKey","key","item","viewportData","findItem","value","prev","next","set","onAddValues","values","onRemoveValues","delete","filter"],"sources":["../src/usePickerWithSelectedValues.ts"],"sourcesContent":["import { type Key, useCallback, useMemo, useState } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport {\n createSearchTextFilter,\n createSelectedValuesFilter,\n type FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport {\n useDebouncedCallback,\n useDebouncedValue,\n usePromiseFactory,\n} from '@deephaven/react-hooks';\nimport { usePickerItemScale } from '@deephaven/components';\nimport { type KeyedItem, type SelectionT } from '@deephaven/utils';\nimport useFilterConditionFactories from './useFilterConditionFactories';\nimport useViewportData, { type UseViewportDataResult } from './useViewportData';\nimport useViewportFilter from './useViewportFilter';\nimport useTableUtils from './useTableUtils';\nimport useTableClose from './useTableClose';\nimport {\n SEARCH_DEBOUNCE_MS,\n VIEWPORT_PADDING,\n VIEWPORT_SIZE,\n} from './Constants';\n\nexport interface UsePickerWithSelectedValuesResult<TItem, TValue> {\n list: UseViewportDataResult<TItem, dh.Table>;\n hasSearchTextWithZeroResults: boolean;\n searchText: string;\n searchTextExists: boolean | null;\n searchTextIsInSelectedValues: boolean;\n selectedKey: Key | null;\n selectedValueMap: ReadonlyMap<TValue, { value: TValue }>;\n onSearchTextChange: (searchText: string) => void;\n onSelectKey: (key: Key | null) => void;\n onAddValues: (values: ReadonlySet<TValue>) => void;\n onRemoveValues: (values: SelectionT<TValue>) => void;\n}\n\n/**\n * Manages a list of available items that can be searched and selected. Selected\n * items are removed from the list and managed in a selectedValueMap data\n * structure. Useful for components that contain a picker but show selected\n * values in a separate component.\n * @param maybeTable The table to get the list of items from\n * @param columnName The column name to get the list of items from\n * @param mapItemToValue A function to map an item to a value\n * @param filterConditionFactories Optional filter condition factories to apply to the list\n * @param trimSearchText Whether to trim the search text before filtering. Defaults to false\n * @param timeZone The timezone to use for date parsing\n */\nexport function usePickerWithSelectedValues<TItem, TValue>({\n maybeTable,\n columnName,\n mapItemToValue,\n filterConditionFactories = [],\n trimSearchText = false,\n timeZone,\n}: {\n maybeTable: dh.Table | null;\n columnName: string;\n mapItemToValue: (item: KeyedItem<TItem>) => TValue;\n filterConditionFactories?: FilterConditionFactory[];\n trimSearchText?: boolean;\n timeZone: string;\n}): UsePickerWithSelectedValuesResult<TItem, TValue> {\n const { itemHeight } = usePickerItemScale();\n\n const tableUtils = useTableUtils();\n\n // `searchText` should always be up to date for controlled search input.\n // `appliedSearchText` will get updated after a delay to avoid updating\n // filters on every key stroke. It will also be trimmed of leading / trailing\n // spaces if `trimSearchText` is true.\n const [searchText, setSearchText] = useState('');\n const [appliedSearchText, setAppliedSearchText] = useState('');\n\n const applySearchText = useCallback(\n (text: string) => {\n setAppliedSearchText(trimSearchText ? text.trim() : text);\n },\n [trimSearchText]\n );\n\n const searchTextMaybeTrimmed = useMemo(\n () => (trimSearchText ? searchText.trim() : searchText),\n [searchText, trimSearchText]\n );\n\n const [selectedKey, setSelectedKey] = useState<Key | null>(null);\n const [selectedValueMap, setSelectedValueMap] = useState<\n Map<TValue, { value: TValue }>\n >(() => new Map());\n\n const { data: valueExists, isLoading: valueExistsIsLoading } =\n usePromiseFactory(tableUtils.doesColumnValueExist, [\n maybeTable,\n columnName,\n appliedSearchText,\n false /* isCaseSensitive */,\n ]);\n\n // The `searchTextFilter` starts getting applied to the list whenever\n // `appliedSearchText` changes, after which there is a small delay before the\n // items are in sync. Use a debounce timer to allow a little extra time\n // before calculating `searchTextExists` below. Note that there are 2 debounce\n // timers at play here:\n // 1. `onDebouncedSearchTextChange` applies the search text after user stops typing\n // 2. `useDebouncedValue` debounces whenever the result of the first debounce\n // changes, and `isApplyingFilter` will be true while this 2nd timer is active.\n const { isDebouncing: isApplyingFilter } = useDebouncedValue(\n appliedSearchText,\n SEARCH_DEBOUNCE_MS\n );\n\n // If value exists check is still loading or if debounce hasn't completed, set\n // `searchTextExists` to null since it is indeterminate.\n const searchTextExists =\n isApplyingFilter || valueExistsIsLoading ? null : valueExists;\n\n const searchTextFilter = useMemo(\n () =>\n createSearchTextFilter(\n tableUtils,\n columnName,\n appliedSearchText,\n timeZone\n ),\n [appliedSearchText, columnName, tableUtils, timeZone]\n );\n\n // Filter out selected values from the picker\n const excludeSelectedValuesFilter = useMemo(\n () =>\n createSelectedValuesFilter(\n tableUtils,\n columnName,\n new Set(selectedValueMap.keys()),\n false,\n true\n ),\n [columnName, selectedValueMap, tableUtils]\n );\n\n const { data: listTable } = usePromiseFactory(\n tableUtils.createDistinctSortedColumnTable,\n [maybeTable, columnName, 'asc', ...filterConditionFactories]\n );\n\n useTableClose(listTable);\n\n const list = useViewportData<TItem, dh.Table>({\n table: listTable,\n itemHeight,\n viewportSize: VIEWPORT_SIZE,\n viewportPadding: VIEWPORT_PADDING,\n });\n\n const hasSearchTextWithZeroResults =\n searchTextMaybeTrimmed.length > 0 && list.size === 0;\n const searchTextIsInSelectedValues = selectedValueMap.has(\n searchTextMaybeTrimmed as TValue\n );\n\n const onDebouncedSearchTextChange = useDebouncedCallback(\n applySearchText,\n SEARCH_DEBOUNCE_MS\n );\n\n const onSearchTextChange = useCallback(\n (text: string) => {\n setSearchText(text);\n onDebouncedSearchTextChange(text);\n },\n [onDebouncedSearchTextChange]\n );\n\n const setSelectedKeyOnNextFrame = useDebouncedCallback(setSelectedKey, 0);\n\n const onSelectKey = useCallback(\n (key: Key | null) => {\n setSearchText('');\n applySearchText('');\n\n // Set the selection temporarily to avoid the picker staying open\n setSelectedKey(key);\n\n // Clear the selection on next frame since selected items get removed from\n // the list and added to `selectedValues` Map\n setSelectedKeyOnNextFrame(null);\n\n // key will be null in scenarios where search text doesn't match an item\n // and user clicks outside of picker\n if (key == null) {\n return;\n }\n\n const item = list.viewportData.findItem(key);\n\n if (item == null) {\n return;\n }\n\n const value = mapItemToValue(item);\n\n setSelectedValueMap(prev => {\n const next = new Map(prev);\n next.set(value, { value });\n return next;\n });\n },\n [\n applySearchText,\n setSelectedKeyOnNextFrame,\n list.viewportData,\n mapItemToValue,\n ]\n );\n\n const onAddValues = useCallback((values: ReadonlySet<TValue>) => {\n setSelectedValueMap(prev => {\n if (values.size === 0) {\n return prev;\n }\n\n const next = new Map(prev);\n\n // eslint-disable-next-line no-restricted-syntax\n for (const value of values) {\n next.set(value, { value });\n }\n\n return next;\n });\n }, []);\n\n const onRemoveValues = useCallback((values: SelectionT<TValue>) => {\n setSelectedValueMap(prev => {\n if (values === 'all') {\n return new Map();\n }\n\n const next = new Map(prev);\n\n // eslint-disable-next-line no-restricted-syntax\n for (const value of values) {\n next.delete(value);\n }\n\n return next;\n });\n }, []);\n\n const filter = useFilterConditionFactories(\n list.table,\n searchTextFilter,\n excludeSelectedValuesFilter\n );\n\n useViewportFilter(list, filter);\n\n return useMemo(\n () => ({\n list,\n hasSearchTextWithZeroResults,\n searchText,\n searchTextExists,\n searchTextIsInSelectedValues,\n selectedKey,\n selectedValueMap,\n onSearchTextChange,\n onSelectKey,\n onAddValues,\n onRemoveValues,\n }),\n [\n hasSearchTextWithZeroResults,\n list,\n onAddValues,\n onRemoveValues,\n onSearchTextChange,\n onSelectKey,\n searchText,\n searchTextExists,\n searchTextIsInSelectedValues,\n selectedKey,\n selectedValueMap,\n ]\n );\n}\n\nexport default usePickerWithSelectedValues;\n"],"mappings":"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"}
1
+ {"version":3,"file":"usePickerWithSelectedValues.js","names":["useCallback","useMemo","useState","createSearchTextFilter","createSelectedValuesFilter","useDebouncedCallback","useDebouncedValue","usePromiseFactory","usePickerItemScale","useFilterConditionFactories","useViewportData","useViewportFilter","useTableUtils","useTableClose","SEARCH_DEBOUNCE_MS","VIEWPORT_PADDING","VIEWPORT_SIZE","usePickerWithSelectedValues","_ref","maybeTable","columnName","mapItemToValue","filterConditionFactories","trimSearchText","timeZone","itemHeight","tableUtils","searchText","setSearchText","appliedSearchText","setAppliedSearchText","applySearchText","text","trim","searchTextMaybeTrimmed","selectedKey","setSelectedKey","selectedValueMap","setSelectedValueMap","Map","data","valueExists","isLoading","valueExistsIsLoading","doesColumnValueExist","isDebouncing","isApplyingFilter","searchTextExists","searchTextFilter","excludeSelectedValuesFilter","Set","keys","listTable","createDistinctSortedColumnTable","list","table","viewportSize","viewportPadding","hasSearchTextWithZeroResults","length","size","searchTextIsInSelectedValues","has","onDebouncedSearchTextChange","onSearchTextChange","setSelectedKeyOnNextFrame","onSelectKey","key","item","viewportData","findItem","value","prev","next","set","onAddValues","values","onRemoveValues","delete","filter"],"sources":["../src/usePickerWithSelectedValues.ts"],"sourcesContent":["import { type Key, useCallback, useMemo, useState } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport {\n createSearchTextFilter,\n createSelectedValuesFilter,\n type FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport {\n useDebouncedCallback,\n useDebouncedValue,\n usePromiseFactory,\n} from '@deephaven/react-hooks';\nimport { usePickerItemScale } from '@deephaven/components';\nimport { type KeyedItem, type SelectionT } from '@deephaven/utils';\nimport useFilterConditionFactories from './useFilterConditionFactories';\nimport useViewportData, { type UseViewportDataResult } from './useViewportData';\nimport useViewportFilter from './useViewportFilter';\nimport useTableUtils from './useTableUtils';\nimport useTableClose from './useTableClose';\nimport {\n SEARCH_DEBOUNCE_MS,\n VIEWPORT_PADDING,\n VIEWPORT_SIZE,\n} from './Constants';\n\nexport interface UsePickerWithSelectedValuesResult<TItem, TValue> {\n list: UseViewportDataResult<TItem, dh.Table>;\n hasSearchTextWithZeroResults: boolean;\n searchText: string;\n searchTextExists: boolean | null;\n searchTextIsInSelectedValues: boolean;\n selectedKey: Key | null;\n selectedValueMap: ReadonlyMap<TValue, { value: TValue }>;\n onSearchTextChange: (searchText: string) => void;\n onSelectKey: (key: Key | null) => void;\n onAddValues: (values: ReadonlySet<TValue>) => void;\n onRemoveValues: (values: SelectionT<TValue>) => void;\n}\n\n/**\n * Manages a list of available items that can be searched and selected. Selected\n * items are removed from the list and managed in a selectedValueMap data\n * structure. Useful for components that contain a picker but show selected\n * values in a separate component.\n * @param maybeTable The table to get the list of items from\n * @param columnName The column name to get the list of items from\n * @param mapItemToValue A function to map an item to a value\n * @param filterConditionFactories Optional filter condition factories to apply to the list\n * @param trimSearchText Whether to trim the search text before filtering. Defaults to false\n * @param timeZone The timezone to use for date parsing\n */\nexport function usePickerWithSelectedValues<TItem, TValue>({\n maybeTable,\n columnName,\n mapItemToValue,\n filterConditionFactories = [],\n trimSearchText = false,\n timeZone,\n}: {\n maybeTable: dh.Table | null;\n columnName: string;\n mapItemToValue: (item: KeyedItem<TItem>) => TValue;\n filterConditionFactories?: FilterConditionFactory[];\n trimSearchText?: boolean;\n timeZone: string;\n}): UsePickerWithSelectedValuesResult<TItem, TValue> {\n const { itemHeight } = usePickerItemScale();\n\n const tableUtils = useTableUtils();\n\n // `searchText` should always be up to date for controlled search input.\n // `appliedSearchText` will get updated after a delay to avoid updating\n // filters on every key stroke. It will also be trimmed of leading / trailing\n // spaces if `trimSearchText` is true.\n const [searchText, setSearchText] = useState('');\n const [appliedSearchText, setAppliedSearchText] = useState('');\n\n const applySearchText = useCallback(\n (text: string) => {\n setAppliedSearchText(trimSearchText ? text.trim() : text);\n },\n [trimSearchText]\n );\n\n const searchTextMaybeTrimmed = useMemo(\n () => (trimSearchText ? searchText.trim() : searchText),\n [searchText, trimSearchText]\n );\n\n const [selectedKey, setSelectedKey] = useState<Key | null>(null);\n const [selectedValueMap, setSelectedValueMap] = useState<\n Map<TValue, { value: TValue }>\n >(() => new Map());\n\n const { data: valueExists, isLoading: valueExistsIsLoading } =\n usePromiseFactory(tableUtils.doesColumnValueExist, [\n maybeTable,\n columnName,\n appliedSearchText,\n false /* isCaseSensitive */,\n ]);\n\n // The `searchTextFilter` starts getting applied to the list whenever\n // `appliedSearchText` changes, after which there is a small delay before the\n // items are in sync. Use a debounce timer to allow a little extra time\n // before calculating `searchTextExists` below. Note that there are 2 debounce\n // timers at play here:\n // 1. `onDebouncedSearchTextChange` applies the search text after user stops typing\n // 2. `useDebouncedValue` debounces whenever the result of the first debounce\n // changes, and `isApplyingFilter` will be true while this 2nd timer is active.\n const { isDebouncing: isApplyingFilter } = useDebouncedValue(\n appliedSearchText,\n SEARCH_DEBOUNCE_MS\n );\n\n // If value exists check is still loading or if debounce hasn't completed, set\n // `searchTextExists` to null since it is indeterminate.\n const searchTextExists =\n isApplyingFilter || valueExistsIsLoading ? null : valueExists;\n\n const searchTextFilter = useMemo(\n () =>\n createSearchTextFilter(\n tableUtils,\n columnName,\n appliedSearchText,\n timeZone\n ),\n [appliedSearchText, columnName, tableUtils, timeZone]\n );\n\n // Filter out selected values from the picker\n const excludeSelectedValuesFilter = useMemo(\n () =>\n createSelectedValuesFilter(\n tableUtils,\n columnName,\n new Set(selectedValueMap.keys()),\n false,\n true\n ),\n [columnName, selectedValueMap, tableUtils]\n );\n\n const { data: listTable } = usePromiseFactory(\n tableUtils.createDistinctSortedColumnTable,\n [maybeTable, columnName, 'asc', ...filterConditionFactories]\n );\n\n useTableClose(listTable);\n\n const list = useViewportData<TItem, dh.Table>({\n table: listTable,\n itemHeight,\n viewportSize: VIEWPORT_SIZE,\n viewportPadding: VIEWPORT_PADDING,\n });\n\n const hasSearchTextWithZeroResults =\n searchTextMaybeTrimmed.length > 0 && list.size === 0;\n const searchTextIsInSelectedValues = selectedValueMap.has(\n searchTextMaybeTrimmed as TValue\n );\n\n const onDebouncedSearchTextChange = useDebouncedCallback(\n applySearchText,\n SEARCH_DEBOUNCE_MS\n );\n\n const onSearchTextChange = useCallback(\n (text: string) => {\n setSearchText(text);\n onDebouncedSearchTextChange(text);\n },\n [onDebouncedSearchTextChange]\n );\n\n const setSelectedKeyOnNextFrame = useDebouncedCallback(setSelectedKey, 0);\n\n const onSelectKey = useCallback(\n (key: Key | null) => {\n setSearchText('');\n applySearchText('');\n\n // Set the selection temporarily to avoid the picker staying open\n setSelectedKey(key);\n\n // Clear the selection on next frame since selected items get removed from\n // the list and added to `selectedValues` Map\n setSelectedKeyOnNextFrame(null);\n\n // key will be null in scenarios where search text doesn't match an item\n // and user clicks outside of picker\n if (key == null) {\n return;\n }\n\n const item = list.viewportData.findItem(key);\n\n if (item == null) {\n return;\n }\n\n const value = mapItemToValue(item);\n\n setSelectedValueMap(prev => {\n const next = new Map(prev);\n next.set(value, { value });\n return next;\n });\n },\n [\n applySearchText,\n setSelectedKeyOnNextFrame,\n list.viewportData,\n mapItemToValue,\n ]\n );\n\n const onAddValues = useCallback((values: ReadonlySet<TValue>) => {\n setSelectedValueMap(prev => {\n if (values.size === 0) {\n return prev;\n }\n\n const next = new Map(prev);\n\n // eslint-disable-next-line no-restricted-syntax\n for (const value of values) {\n next.set(value, { value });\n }\n\n return next;\n });\n }, []);\n\n const onRemoveValues = useCallback((values: SelectionT<TValue>) => {\n setSelectedValueMap(prev => {\n if (values === 'all') {\n return new Map();\n }\n\n const next = new Map(prev);\n\n // eslint-disable-next-line no-restricted-syntax\n for (const value of values) {\n next.delete(value);\n }\n\n return next;\n });\n }, []);\n\n const filter = useFilterConditionFactories(\n list.table,\n searchTextFilter,\n excludeSelectedValuesFilter\n );\n\n useViewportFilter(list, filter);\n\n return useMemo(\n () => ({\n list,\n hasSearchTextWithZeroResults,\n searchText,\n searchTextExists,\n searchTextIsInSelectedValues,\n selectedKey,\n selectedValueMap,\n onSearchTextChange,\n onSelectKey,\n onAddValues,\n onRemoveValues,\n }),\n [\n hasSearchTextWithZeroResults,\n list,\n onAddValues,\n onRemoveValues,\n onSearchTextChange,\n onSelectKey,\n searchText,\n searchTextExists,\n searchTextIsInSelectedValues,\n selectedKey,\n selectedValueMap,\n ]\n );\n}\n\nexport default usePickerWithSelectedValues;\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useSearchableViewportData.js","names":["useMemo","useState","TABLE_ROW_HEIGHT","createSearchTextFilter","useDebouncedCallback","useTableUtils","useViewportData","useFilterConditionFactories","useViewportFilter","SEARCH_DEBOUNCE_MS","VIEWPORT_PADDING","VIEWPORT_SIZE","useSearchableViewportData","_ref","additionalFilterConditionFactories","searchColumnNames","timeZone","props","_objectWithoutProperties","_excluded","tableUtils","searchText","setSearchText","searchTextFilter","onSearchTextChange","list","_objectSpread","itemHeight","viewportSize","viewportPadding","filter","table"],"sources":["../src/useSearchableViewportData.ts"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { TABLE_ROW_HEIGHT } from '@deephaven/components';\nimport type { dh } from '@deephaven/jsapi-types';\nimport {\n createSearchTextFilter,\n type FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport { useDebouncedCallback } from '@deephaven/react-hooks';\nimport { useTableUtils } from './useTableUtils';\nimport useViewportData, {\n type UseViewportDataProps,\n type UseViewportDataResult,\n} from './useViewportData';\nimport useFilterConditionFactories from './useFilterConditionFactories';\nimport useViewportFilter from './useViewportFilter';\nimport {\n SEARCH_DEBOUNCE_MS,\n VIEWPORT_PADDING,\n VIEWPORT_SIZE,\n} from './Constants';\n\nexport interface UseSearchableViewportDataProps<TData>\n extends UseViewportDataProps<TData, dh.Table> {\n additionalFilterConditionFactories?: FilterConditionFactory[];\n searchColumnNames: string | string[];\n timeZone: string;\n}\n\nexport interface SearchableViewportData<TData>\n extends UseViewportDataResult<TData, dh.Table> {\n onSearchTextChange: (searchText: string) => void;\n}\n\n/**\n * Use a viewport data list with a search text filter. Supports additional filters.\n * @param table The table to use\n * @param itemHeight The height of each item\n * @param scrollDebounce The debounce time for scroll events\n * @param viewportSize The size of the viewport\n * @param viewportPadding The padding around the viewport\n * @param deserializeRow The row deserializer\n * @param searchColumnNames The column names to search\n * @param timeZone Timezone to use for date parsing\n * @param additionalFilterConditionFactories Additional filter condition factories\n */\nexport function useSearchableViewportData<TData>({\n additionalFilterConditionFactories = [],\n searchColumnNames,\n timeZone,\n ...props\n}: UseSearchableViewportDataProps<TData>): SearchableViewportData<TData> {\n const tableUtils = useTableUtils();\n\n const [searchText, setSearchText] = useState<string>('');\n\n const searchTextFilter = useMemo(\n () =>\n createSearchTextFilter(\n tableUtils,\n searchColumnNames,\n searchText,\n timeZone\n ),\n [searchColumnNames, searchText, tableUtils, timeZone]\n );\n\n const onSearchTextChange = useDebouncedCallback(\n setSearchText,\n SEARCH_DEBOUNCE_MS\n );\n\n const list = useViewportData<TData, dh.Table>({\n itemHeight: TABLE_ROW_HEIGHT,\n viewportSize: VIEWPORT_SIZE,\n viewportPadding: VIEWPORT_PADDING,\n ...props,\n });\n\n const filter = useFilterConditionFactories(\n list.table,\n searchTextFilter,\n ...additionalFilterConditionFactories\n );\n\n useViewportFilter(list, filter);\n\n return {\n ...list,\n onSearchTextChange,\n };\n}\n\nexport default useSearchableViewportData;\n"],"mappings":";;;;;;;;AAAA,SAASA,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AACzC,SAASC,gBAAgB,QAAQ,uBAAuB;AAExD,SACEC,sBAAsB,QAEjB,wBAAwB;AAC/B,SAASC,oBAAoB,QAAQ,wBAAwB;AAAC,SACrDC,aAAa;AAAA,OACfC,eAAe;AAAA,OAIfC,2BAA2B;AAAA,OAC3BC,iBAAiB;AAAA,SAEtBC,kBAAkB,EAClBC,gBAAgB,EAChBC,aAAa;AAef;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,yBAAyBA,CAAAC,IAAA,EAKgC;EAAA,IALxB;MAC/CC,kCAAkC,GAAG,EAAE;MACvCC,iBAAiB;MACjBC;IAEqC,CAAC,GAAAH,IAAA;IADnCI,KAAK,GAAAC,wBAAA,CAAAL,IAAA,EAAAM,SAAA;EAER,IAAMC,UAAU,GAAGf,aAAa,CAAC,CAAC;EAElC,IAAM,CAACgB,UAAU,EAAEC,aAAa,CAAC,GAAGrB,QAAQ,CAAS,EAAE,CAAC;EAExD,IAAMsB,gBAAgB,GAAGvB,OAAO,CAC9B,MACEG,sBAAsB,CACpBiB,UAAU,EACVL,iBAAiB,EACjBM,UAAU,EACVL,QACF,CAAC,EACH,CAACD,iBAAiB,EAAEM,UAAU,EAAED,UAAU,EAAEJ,QAAQ,CACtD,CAAC;EAED,IAAMQ,kBAAkB,GAAGpB,oBAAoB,CAC7CkB,aAAa,EACbb,kBACF,CAAC;EAED,IAAMgB,IAAI,GAAGnB,eAAe,CAAAoB,aAAA;IAC1BC,UAAU,EAAEzB,gBAAgB;IAC5B0B,YAAY,EAAEjB,aAAa;IAC3BkB,eAAe,EAAEnB;EAAgB,GAC9BO,KAAK,CACT,CAAC;EAEF,IAAMa,MAAM,GAAGvB,2BAA2B,CACxCkB,IAAI,CAACM,KAAK,EACVR,gBAAgB,EAChB,GAAGT,kCACL,CAAC;EAEDN,iBAAiB,CAACiB,IAAI,EAAEK,MAAM,CAAC;EAE/B,OAAAJ,aAAA,CAAAA,aAAA,KACKD,IAAI;IACPD;EAAkB;AAEtB;AAEA,eAAeZ,yBAAyB"}
1
+ {"version":3,"file":"useSearchableViewportData.js","names":["useMemo","useState","TABLE_ROW_HEIGHT","createSearchTextFilter","useDebouncedCallback","useTableUtils","useViewportData","useFilterConditionFactories","useViewportFilter","SEARCH_DEBOUNCE_MS","VIEWPORT_PADDING","VIEWPORT_SIZE","useSearchableViewportData","_ref","additionalFilterConditionFactories","searchColumnNames","timeZone","props","_objectWithoutProperties","_excluded","tableUtils","searchText","setSearchText","searchTextFilter","onSearchTextChange","list","_objectSpread","itemHeight","viewportSize","viewportPadding","filter","table"],"sources":["../src/useSearchableViewportData.ts"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { TABLE_ROW_HEIGHT } from '@deephaven/components';\nimport type { dh } from '@deephaven/jsapi-types';\nimport {\n createSearchTextFilter,\n type FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport { useDebouncedCallback } from '@deephaven/react-hooks';\nimport { useTableUtils } from './useTableUtils';\nimport useViewportData, {\n type UseViewportDataProps,\n type UseViewportDataResult,\n} from './useViewportData';\nimport useFilterConditionFactories from './useFilterConditionFactories';\nimport useViewportFilter from './useViewportFilter';\nimport {\n SEARCH_DEBOUNCE_MS,\n VIEWPORT_PADDING,\n VIEWPORT_SIZE,\n} from './Constants';\n\nexport interface UseSearchableViewportDataProps<TData>\n extends UseViewportDataProps<TData, dh.Table> {\n additionalFilterConditionFactories?: FilterConditionFactory[];\n searchColumnNames: string | string[];\n timeZone: string;\n}\n\nexport interface SearchableViewportData<TData>\n extends UseViewportDataResult<TData, dh.Table> {\n onSearchTextChange: (searchText: string) => void;\n}\n\n/**\n * Use a viewport data list with a search text filter. Supports additional filters.\n * @param table The table to use\n * @param itemHeight The height of each item\n * @param scrollDebounce The debounce time for scroll events\n * @param viewportSize The size of the viewport\n * @param viewportPadding The padding around the viewport\n * @param deserializeRow The row deserializer\n * @param searchColumnNames The column names to search\n * @param timeZone Timezone to use for date parsing\n * @param additionalFilterConditionFactories Additional filter condition factories\n */\nexport function useSearchableViewportData<TData>({\n additionalFilterConditionFactories = [],\n searchColumnNames,\n timeZone,\n ...props\n}: UseSearchableViewportDataProps<TData>): SearchableViewportData<TData> {\n const tableUtils = useTableUtils();\n\n const [searchText, setSearchText] = useState<string>('');\n\n const searchTextFilter = useMemo(\n () =>\n createSearchTextFilter(\n tableUtils,\n searchColumnNames,\n searchText,\n timeZone\n ),\n [searchColumnNames, searchText, tableUtils, timeZone]\n );\n\n const onSearchTextChange = useDebouncedCallback(\n setSearchText,\n SEARCH_DEBOUNCE_MS\n );\n\n const list = useViewportData<TData, dh.Table>({\n itemHeight: TABLE_ROW_HEIGHT,\n viewportSize: VIEWPORT_SIZE,\n viewportPadding: VIEWPORT_PADDING,\n ...props,\n });\n\n const filter = useFilterConditionFactories(\n list.table,\n searchTextFilter,\n ...additionalFilterConditionFactories\n );\n\n useViewportFilter(list, filter);\n\n return {\n ...list,\n onSearchTextChange,\n };\n}\n\nexport default useSearchableViewportData;\n"],"mappings":";;;;;;;;AAAA,SAASA,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AACzC,SAASC,gBAAgB,QAAQ,uBAAuB;AAExD,SACEC,sBAAsB,QAEjB,wBAAwB;AAC/B,SAASC,oBAAoB,QAAQ,wBAAwB;AAAC,SACrDC,aAAa;AAAA,OACfC,eAAe;AAAA,OAIfC,2BAA2B;AAAA,OAC3BC,iBAAiB;AAAA,SAEtBC,kBAAkB,EAClBC,gBAAgB,EAChBC,aAAa;AAef;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,yBAAyBA,CAAAC,IAAA,EAKgC;EAAA,IALxB;MAC/CC,kCAAkC,GAAG,EAAE;MACvCC,iBAAiB;MACjBC;IAEqC,CAAC,GAAAH,IAAA;IADnCI,KAAK,GAAAC,wBAAA,CAAAL,IAAA,EAAAM,SAAA;EAER,IAAMC,UAAU,GAAGf,aAAa,CAAC,CAAC;EAElC,IAAM,CAACgB,UAAU,EAAEC,aAAa,CAAC,GAAGrB,QAAQ,CAAS,EAAE,CAAC;EAExD,IAAMsB,gBAAgB,GAAGvB,OAAO,CAC9B,MACEG,sBAAsB,CACpBiB,UAAU,EACVL,iBAAiB,EACjBM,UAAU,EACVL,QACF,CAAC,EACH,CAACD,iBAAiB,EAAEM,UAAU,EAAED,UAAU,EAAEJ,QAAQ,CACtD,CAAC;EAED,IAAMQ,kBAAkB,GAAGpB,oBAAoB,CAC7CkB,aAAa,EACbb,kBACF,CAAC;EAED,IAAMgB,IAAI,GAAGnB,eAAe,CAAAoB,aAAA;IAC1BC,UAAU,EAAEzB,gBAAgB;IAC5B0B,YAAY,EAAEjB,aAAa;IAC3BkB,eAAe,EAAEnB;EAAgB,GAC9BO,KAAK,CACT,CAAC;EAEF,IAAMa,MAAM,GAAGvB,2BAA2B,CACxCkB,IAAI,CAACM,KAAK,EACVR,gBAAgB,EAChB,GAAGT,kCACL,CAAC;EAEDN,iBAAiB,CAACiB,IAAI,EAAEK,MAAM,CAAC;EAE/B,OAAAJ,aAAA,CAAAA,aAAA,KACKD,IAAI;IACPD;EAAkB;AAEtB;AAEA,eAAeZ,yBAAyB","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useSelectDistinctTable.js","names":["useCallback","useEffect","usePromiseFactory","useSelectDistinctTable","table","_len","arguments","length","columnNames","Array","_key","selectDistinct","_asyncToGenerator","_table$selectDistinct","findColumns","data","distinctTable","error","isError","isLoading","close"],"sources":["../src/useSelectDistinctTable.ts"],"sourcesContent":["import { useCallback, useEffect } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { usePromiseFactory } from '@deephaven/react-hooks';\n\n/**\n * Return type of `useSelectDistinctTable` hook.\n */\nexport interface UseSelectDistinctTableResult {\n distinctTable: dh.Table | null;\n error: string | Error | null;\n isError: boolean;\n isLoading: boolean;\n}\n\n/**\n * Creates and subscribes to a `selectDistinct` derived table and unsubscribes\n * on unmount.\n * @param table The table to call `selectDistinct` on.\n * @param columnNames The list of column names to pass to `selectDistinct`.\n */\nexport default function useSelectDistinctTable(\n table: dh.Table | dh.TreeTable | null,\n ...columnNames: string[]\n): UseSelectDistinctTableResult {\n const selectDistinct = useCallback(\n async () => table?.selectDistinct(table.findColumns(columnNames)) ?? null,\n // Disabling the exhaustive checks due to the spreading of `columnNames`\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [table, ...columnNames]\n );\n\n const {\n data: distinctTable,\n error,\n isError,\n isLoading,\n } = usePromiseFactory(selectDistinct, []);\n\n useEffect(\n () => () => {\n distinctTable?.close();\n },\n [distinctTable]\n );\n\n return { distinctTable, error, isError, isLoading };\n}\n"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,SAAS,QAAQ,OAAO;AAE9C,SAASC,iBAAiB,QAAQ,wBAAwB;;AAE1D;AACA;AACA;;AAQA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,sBAAsBA,CAC5CC,KAAqC,EAEP;EAAA,SAAAC,IAAA,GAAAC,SAAA,CAAAC,MAAA,EAD3BC,WAAW,OAAAC,KAAA,CAAAJ,IAAA,OAAAA,IAAA,WAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;IAAXF,WAAW,CAAAE,IAAA,QAAAJ,SAAA,CAAAI,IAAA;EAAA;EAEd,IAAMC,cAAc,GAAGX,WAAW,eAAAY,iBAAA,CAChC;IAAA,IAAAC,qBAAA;IAAA,QAAAA,qBAAA,GAAYT,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEO,cAAc,CAACP,KAAK,CAACU,WAAW,CAACN,WAAW,CAAC,CAAC,cAAAK,qBAAA,cAAAA,qBAAA,GAAI,IAAI;EAAA;EACzE;EACA;EACA,CAACT,KAAK,EAAE,GAAGI,WAAW,CACxB,CAAC;EAED,IAAM;IACJO,IAAI,EAAEC,aAAa;IACnBC,KAAK;IACLC,OAAO;IACPC;EACF,CAAC,GAAGjB,iBAAiB,CAACS,cAAc,EAAE,EAAE,CAAC;EAEzCV,SAAS,CACP,MAAM,MAAM;IACVe,aAAa,aAAbA,aAAa,uBAAbA,aAAa,CAAEI,KAAK,CAAC,CAAC;EACxB,CAAC,EACD,CAACJ,aAAa,CAChB,CAAC;EAED,OAAO;IAAEA,aAAa;IAAEC,KAAK;IAAEC,OAAO;IAAEC;EAAU,CAAC;AACrD"}
1
+ {"version":3,"file":"useSelectDistinctTable.js","names":["useCallback","useEffect","usePromiseFactory","useSelectDistinctTable","table","_len","arguments","length","columnNames","Array","_key","selectDistinct","_asyncToGenerator","_table$selectDistinct","findColumns","data","distinctTable","error","isError","isLoading","close"],"sources":["../src/useSelectDistinctTable.ts"],"sourcesContent":["import { useCallback, useEffect } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { usePromiseFactory } from '@deephaven/react-hooks';\n\n/**\n * Return type of `useSelectDistinctTable` hook.\n */\nexport interface UseSelectDistinctTableResult {\n distinctTable: dh.Table | null;\n error: string | Error | null;\n isError: boolean;\n isLoading: boolean;\n}\n\n/**\n * Creates and subscribes to a `selectDistinct` derived table and unsubscribes\n * on unmount.\n * @param table The table to call `selectDistinct` on.\n * @param columnNames The list of column names to pass to `selectDistinct`.\n */\nexport default function useSelectDistinctTable(\n table: dh.Table | dh.TreeTable | null,\n ...columnNames: string[]\n): UseSelectDistinctTableResult {\n const selectDistinct = useCallback(\n async () => table?.selectDistinct(table.findColumns(columnNames)) ?? null,\n // Disabling the exhaustive checks due to the spreading of `columnNames`\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [table, ...columnNames]\n );\n\n const {\n data: distinctTable,\n error,\n isError,\n isLoading,\n } = usePromiseFactory(selectDistinct, []);\n\n useEffect(\n () => () => {\n distinctTable?.close();\n },\n [distinctTable]\n );\n\n return { distinctTable, error, isError, isLoading };\n}\n"],"mappings":";;AAAA,SAASA,WAAW,EAAEC,SAAS,QAAQ,OAAO;AAE9C,SAASC,iBAAiB,QAAQ,wBAAwB;;AAE1D;AACA;AACA;;AAQA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,sBAAsBA,CAC5CC,KAAqC,EAEP;EAAA,SAAAC,IAAA,GAAAC,SAAA,CAAAC,MAAA,EAD3BC,WAAW,OAAAC,KAAA,CAAAJ,IAAA,OAAAA,IAAA,WAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;IAAXF,WAAW,CAAAE,IAAA,QAAAJ,SAAA,CAAAI,IAAA;EAAA;EAEd,IAAMC,cAAc,GAAGX,WAAW,eAAAY,iBAAA,CAChC;IAAA,IAAAC,qBAAA;IAAA,QAAAA,qBAAA,GAAYT,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEO,cAAc,CAACP,KAAK,CAACU,WAAW,CAACN,WAAW,CAAC,CAAC,cAAAK,qBAAA,cAAAA,qBAAA,GAAI,IAAI;EAAA;EACzE;EACA;EACA,CAACT,KAAK,EAAE,GAAGI,WAAW,CACxB,CAAC;EAED,IAAM;IACJO,IAAI,EAAEC,aAAa;IACnBC,KAAK;IACLC,OAAO;IACPC;EACF,CAAC,GAAGjB,iBAAiB,CAACS,cAAc,EAAE,EAAE,CAAC;EAEzCV,SAAS,CACP,MAAM,MAAM;IACVe,aAAa,aAAbA,aAAa,uBAAbA,aAAa,CAAEI,KAAK,CAAC,CAAC;EACxB,CAAC,EACD,CAACJ,aAAa,CAChB,CAAC;EAED,OAAO;IAAEA,aAAa;IAAEC,KAAK;IAAEC,OAAO;IAAEC;EAAU,CAAC;AACrD","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useSetPaddedViewportCallback.js","names":["useCallback","getSize","padFirstAndLastRow","useSetPaddedViewportCallback","table","viewportSize","viewportPadding","setPaddedViewport","firstRow","first","last","setViewport"],"sources":["../src/useSetPaddedViewportCallback.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { getSize, padFirstAndLastRow } from '@deephaven/jsapi-utils';\n\n/**\n * Creates a callback function that will set a Table viewport. The callback has\n * a closure over the Table, a desired viewport size, and additional padding.\n * These will be combined with a first row index passed to the callback to\n * calculate the final viewport.\n * @param table Table to call `setViewport` on.\n * @param viewportSize The desired viewport size.\n * @param viewportPadding Padding to add before and after the viewport.\n * @returns A callback function for setting the viewport.\n */\nexport function useSetPaddedViewportCallback(\n table: dh.Table | dh.TreeTable | null,\n viewportSize: number,\n viewportPadding: number\n): (firstRow: number) => void {\n return useCallback(\n function setPaddedViewport(firstRow: number) {\n const [first, last] = padFirstAndLastRow(\n firstRow,\n viewportSize,\n viewportPadding,\n getSize(table)\n );\n\n table?.setViewport(first, last);\n },\n [table, viewportPadding, viewportSize]\n );\n}\n\nexport default useSetPaddedViewportCallback;\n"],"mappings":"AAAA,SAASA,WAAW,QAAQ,OAAO;AAEnC,SAASC,OAAO,EAAEC,kBAAkB,QAAQ,wBAAwB;;AAEpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,4BAA4BA,CAC1CC,KAAqC,EACrCC,YAAoB,EACpBC,eAAuB,EACK;EAC5B,OAAON,WAAW,CAChB,SAASO,iBAAiBA,CAACC,QAAgB,EAAE;IAC3C,IAAM,CAACC,KAAK,EAAEC,IAAI,CAAC,GAAGR,kBAAkB,CACtCM,QAAQ,EACRH,YAAY,EACZC,eAAe,EACfL,OAAO,CAACG,KAAK,CACf,CAAC;IAEDA,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEO,WAAW,CAACF,KAAK,EAAEC,IAAI,CAAC;EACjC,CAAC,EACD,CAACN,KAAK,EAAEE,eAAe,EAAED,YAAY,CACvC,CAAC;AACH;AAEA,eAAeF,4BAA4B"}
1
+ {"version":3,"file":"useSetPaddedViewportCallback.js","names":["useCallback","getSize","padFirstAndLastRow","useSetPaddedViewportCallback","table","viewportSize","viewportPadding","setPaddedViewport","firstRow","first","last","setViewport"],"sources":["../src/useSetPaddedViewportCallback.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { getSize, padFirstAndLastRow } from '@deephaven/jsapi-utils';\n\n/**\n * Creates a callback function that will set a Table viewport. The callback has\n * a closure over the Table, a desired viewport size, and additional padding.\n * These will be combined with a first row index passed to the callback to\n * calculate the final viewport.\n * @param table Table to call `setViewport` on.\n * @param viewportSize The desired viewport size.\n * @param viewportPadding Padding to add before and after the viewport.\n * @returns A callback function for setting the viewport.\n */\nexport function useSetPaddedViewportCallback(\n table: dh.Table | dh.TreeTable | null,\n viewportSize: number,\n viewportPadding: number\n): (firstRow: number) => void {\n return useCallback(\n function setPaddedViewport(firstRow: number) {\n const [first, last] = padFirstAndLastRow(\n firstRow,\n viewportSize,\n viewportPadding,\n getSize(table)\n );\n\n table?.setViewport(first, last);\n },\n [table, viewportPadding, viewportSize]\n );\n}\n\nexport default useSetPaddedViewportCallback;\n"],"mappings":"AAAA,SAASA,WAAW,QAAQ,OAAO;AAEnC,SAASC,OAAO,EAAEC,kBAAkB,QAAQ,wBAAwB;;AAEpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,4BAA4BA,CAC1CC,KAAqC,EACrCC,YAAoB,EACpBC,eAAuB,EACK;EAC5B,OAAON,WAAW,CAChB,SAASO,iBAAiBA,CAACC,QAAgB,EAAE;IAC3C,IAAM,CAACC,KAAK,EAAEC,IAAI,CAAC,GAAGR,kBAAkB,CACtCM,QAAQ,EACRH,YAAY,EACZC,eAAe,EACfL,OAAO,CAACG,KAAK,CACf,CAAC;IAEDA,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEO,WAAW,CAACF,KAAK,EAAEC,IAAI,CAAC;EACjC,CAAC,EACD,CAACN,KAAK,EAAEE,eAAe,EAAED,YAAY,CACvC,CAAC;AACH;AAEA,eAAeF,4BAA4B","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useShowOnlyEmptyFilter.js","names":["useMemo","createFilterConditionFactory","createShowOnlyEmptyFilterCondition","useTableUtils","useShowOnlyEmptyFilter","isOn","columnNames","tableUtils","createColumnCondition"],"sources":["../src/useShowOnlyEmptyFilter.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n createFilterConditionFactory,\n createShowOnlyEmptyFilterCondition,\n type FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport useTableUtils from './useTableUtils';\n\n/**\n * Creates a filter condition factory that can be toggle on or off. If on, the\n * filter will match only values that are null or empty strings. If off, the\n * filter will match all values.\n * @param isOn Whether the filter is on or off\n * @param columnNames Column names to filter\n */\nexport function useShowOnlyEmptyFilter(\n isOn: boolean,\n columnNames: string | string[]\n): FilterConditionFactory {\n const tableUtils = useTableUtils();\n\n const createColumnCondition = useMemo(\n () => createShowOnlyEmptyFilterCondition(tableUtils, isOn),\n [isOn, tableUtils]\n );\n\n return useMemo(\n () => createFilterConditionFactory(columnNames, createColumnCondition),\n [columnNames, createColumnCondition]\n );\n}\n\nexport default useShowOnlyEmptyFilter;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SACEC,4BAA4B,EAC5BC,kCAAkC,QAE7B,wBAAwB;AAAC,OACzBC,aAAa;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,sBAAsBA,CACpCC,IAAa,EACbC,WAA8B,EACN;EACxB,IAAMC,UAAU,GAAGJ,aAAa,CAAC,CAAC;EAElC,IAAMK,qBAAqB,GAAGR,OAAO,CACnC,MAAME,kCAAkC,CAACK,UAAU,EAAEF,IAAI,CAAC,EAC1D,CAACA,IAAI,EAAEE,UAAU,CACnB,CAAC;EAED,OAAOP,OAAO,CACZ,MAAMC,4BAA4B,CAACK,WAAW,EAAEE,qBAAqB,CAAC,EACtE,CAACF,WAAW,EAAEE,qBAAqB,CACrC,CAAC;AACH;AAEA,eAAeJ,sBAAsB"}
1
+ {"version":3,"file":"useShowOnlyEmptyFilter.js","names":["useMemo","createFilterConditionFactory","createShowOnlyEmptyFilterCondition","useTableUtils","useShowOnlyEmptyFilter","isOn","columnNames","tableUtils","createColumnCondition"],"sources":["../src/useShowOnlyEmptyFilter.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n createFilterConditionFactory,\n createShowOnlyEmptyFilterCondition,\n type FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport useTableUtils from './useTableUtils';\n\n/**\n * Creates a filter condition factory that can be toggle on or off. If on, the\n * filter will match only values that are null or empty strings. If off, the\n * filter will match all values.\n * @param isOn Whether the filter is on or off\n * @param columnNames Column names to filter\n */\nexport function useShowOnlyEmptyFilter(\n isOn: boolean,\n columnNames: string | string[]\n): FilterConditionFactory {\n const tableUtils = useTableUtils();\n\n const createColumnCondition = useMemo(\n () => createShowOnlyEmptyFilterCondition(tableUtils, isOn),\n [isOn, tableUtils]\n );\n\n return useMemo(\n () => createFilterConditionFactory(columnNames, createColumnCondition),\n [columnNames, createColumnCondition]\n );\n}\n\nexport default useShowOnlyEmptyFilter;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SACEC,4BAA4B,EAC5BC,kCAAkC,QAE7B,wBAAwB;AAAC,OACzBC,aAAa;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,sBAAsBA,CACpCC,IAAa,EACbC,WAA8B,EACN;EACxB,IAAMC,UAAU,GAAGJ,aAAa,CAAC,CAAC;EAElC,IAAMK,qBAAqB,GAAGR,OAAO,CACnC,MAAME,kCAAkC,CAACK,UAAU,EAAEF,IAAI,CAAC,EAC1D,CAACA,IAAI,EAAEE,UAAU,CACnB,CAAC;EAED,OAAOP,OAAO,CACZ,MAAMC,4BAA4B,CAACK,WAAW,EAAEE,qBAAqB,CAAC,EACtE,CAACF,WAAW,EAAEE,qBAAqB,CACrC,CAAC;AACH;AAEA,eAAeJ,sBAAsB","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useTable.js","names":["useCallback","useEffect","useState","useApi","Log","useTableListener","ColumnNameError","TableDisconnectError","log","module","useTable","table","firstRow","lastRow","columnNames","dh","columns","setColumns","undefined","data","setData","columnError","setColumnError","tableError","setTableError","findColumns","e","error","debug2","setViewport","handleUpdate","_ref","detail","viewportData","map","column","rows","r","get","handleDisconnect","handleReconnect","Table","EVENT_UPDATED","EVENT_DISCONNECT","EVENT_RECONNECT"],"sources":["../src/useTable.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport type { dh } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport useTableListener from './useTableListener';\nimport ColumnNameError from './ColumnNameError';\nimport TableDisconnectError from './TableDisconnectError';\n\nconst log = Log.module('useTable');\n\nconst useTable = (\n table: dh.Table | undefined,\n firstRow: number,\n lastRow: number,\n columnNames?: string[]\n): {\n columns: dh.Column[] | undefined;\n data: unknown[][];\n error: Error | null;\n} => {\n const dh = useApi();\n const [columns, setColumns] = useState<dh.Column[] | undefined>(undefined);\n const [data, setData] = useState<unknown[][]>([]);\n const [columnError, setColumnError] = useState<Error | null>(null);\n const [tableError, setTableError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (columnNames === undefined) {\n setColumns(table?.columns);\n setColumnError(null);\n return;\n }\n try {\n setColumns(table?.findColumns(columnNames));\n setColumnError(null);\n } catch (e) {\n log.error(`Column not found`, e, columnNames);\n setColumnError(new ColumnNameError('Invalid columnNames argument'));\n }\n }, [table, columnNames]);\n\n useEffect(() => {\n if (!columns || !table) {\n log.debug2('Table or column not initialized, skip viewport update.');\n return;\n }\n log.debug2('Setting viewport', firstRow, lastRow);\n table.setViewport(firstRow, lastRow, columns);\n }, [columns, table, firstRow, lastRow]);\n\n const handleUpdate = useCallback(\n ({ detail }) => {\n if (!columns) {\n log.error('Columns not initialized.');\n return;\n }\n const viewportData = columns.map(column =>\n (detail.rows as dh.Row[]).map(r => r.get(column))\n );\n setData(viewportData);\n },\n [columns]\n );\n\n const handleDisconnect = useCallback(() => {\n setTableError(new TableDisconnectError('Table disconnected'));\n }, []);\n\n const handleReconnect = useCallback(() => {\n setTableError(null);\n }, []);\n\n useTableListener(table, dh.Table.EVENT_UPDATED, handleUpdate);\n useTableListener(table, dh.Table.EVENT_DISCONNECT, handleDisconnect);\n useTableListener(table, dh.Table.EVENT_RECONNECT, handleReconnect);\n\n return { columns, data, error: tableError ?? columnError };\n};\n\nexport default useTable;\n"],"mappings":"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"}
1
+ {"version":3,"file":"useTable.js","names":["useCallback","useEffect","useState","useApi","Log","useTableListener","ColumnNameError","TableDisconnectError","log","module","useTable","table","firstRow","lastRow","columnNames","dh","columns","setColumns","undefined","data","setData","columnError","setColumnError","tableError","setTableError","findColumns","e","error","debug2","setViewport","handleUpdate","_ref","detail","viewportData","map","column","rows","r","get","handleDisconnect","handleReconnect","Table","EVENT_UPDATED","EVENT_DISCONNECT","EVENT_RECONNECT"],"sources":["../src/useTable.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport type { dh } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport useTableListener from './useTableListener';\nimport ColumnNameError from './ColumnNameError';\nimport TableDisconnectError from './TableDisconnectError';\n\nconst log = Log.module('useTable');\n\nconst useTable = (\n table: dh.Table | undefined,\n firstRow: number,\n lastRow: number,\n columnNames?: string[]\n): {\n columns: dh.Column[] | undefined;\n data: unknown[][];\n error: Error | null;\n} => {\n const dh = useApi();\n const [columns, setColumns] = useState<dh.Column[] | undefined>(undefined);\n const [data, setData] = useState<unknown[][]>([]);\n const [columnError, setColumnError] = useState<Error | null>(null);\n const [tableError, setTableError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (columnNames === undefined) {\n setColumns(table?.columns);\n setColumnError(null);\n return;\n }\n try {\n setColumns(table?.findColumns(columnNames));\n setColumnError(null);\n } catch (e) {\n log.error(`Column not found`, e, columnNames);\n setColumnError(new ColumnNameError('Invalid columnNames argument'));\n }\n }, [table, columnNames]);\n\n useEffect(() => {\n if (!columns || !table) {\n log.debug2('Table or column not initialized, skip viewport update.');\n return;\n }\n log.debug2('Setting viewport', firstRow, lastRow);\n table.setViewport(firstRow, lastRow, columns);\n }, [columns, table, firstRow, lastRow]);\n\n const handleUpdate = useCallback(\n ({ detail }) => {\n if (!columns) {\n log.error('Columns not initialized.');\n return;\n }\n const viewportData = columns.map(column =>\n (detail.rows as dh.Row[]).map(r => r.get(column))\n );\n setData(viewportData);\n },\n [columns]\n );\n\n const handleDisconnect = useCallback(() => {\n setTableError(new TableDisconnectError('Table disconnected'));\n }, []);\n\n const handleReconnect = useCallback(() => {\n setTableError(null);\n }, []);\n\n useTableListener(table, dh.Table.EVENT_UPDATED, handleUpdate);\n useTableListener(table, dh.Table.EVENT_DISCONNECT, handleDisconnect);\n useTableListener(table, dh.Table.EVENT_RECONNECT, handleReconnect);\n\n return { columns, data, error: tableError ?? columnError };\n};\n\nexport default useTable;\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useTableClose.js","names":["useEffect","isClosed","useTableClose","table","close"],"sources":["../src/useTableClose.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { isClosed } from '@deephaven/jsapi-utils';\n\n/**\n * React hook that closes a given table when the reference changes or when the\n * component unmounts.\n * @param table\n */\nexport default function useTableClose(\n table: dh.Table | dh.TreeTable | null | undefined\n): void {\n useEffect(\n () => () => {\n if (table == null) {\n return;\n }\n\n if (!isClosed(table)) {\n table.close();\n }\n },\n [table]\n );\n}\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AAEjC,SAASC,QAAQ,QAAQ,wBAAwB;;AAEjD;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,aAAaA,CACnCC,KAAiD,EAC3C;EACNH,SAAS,CACP,MAAM,MAAM;IACV,IAAIG,KAAK,IAAI,IAAI,EAAE;MACjB;IACF;IAEA,IAAI,CAACF,QAAQ,CAACE,KAAK,CAAC,EAAE;MACpBA,KAAK,CAACC,KAAK,CAAC,CAAC;IACf;EACF,CAAC,EACD,CAACD,KAAK,CACR,CAAC;AACH"}
1
+ {"version":3,"file":"useTableClose.js","names":["useEffect","isClosed","useTableClose","table","close"],"sources":["../src/useTableClose.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { isClosed } from '@deephaven/jsapi-utils';\n\n/**\n * React hook that closes a given table when the reference changes or when the\n * component unmounts.\n * @param table\n */\nexport default function useTableClose(\n table: dh.Table | dh.TreeTable | null | undefined\n): void {\n useEffect(\n () => () => {\n if (table == null) {\n return;\n }\n\n if (!isClosed(table)) {\n table.close();\n }\n },\n [table]\n );\n}\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AAEjC,SAASC,QAAQ,QAAQ,wBAAwB;;AAEjD;AACA;AACA;AACA;AACA;AACA,eAAe,SAASC,aAAaA,CACnCC,KAAiD,EAC3C;EACNH,SAAS,CACP,MAAM,MAAM;IACV,IAAIG,KAAK,IAAI,IAAI,EAAE;MACjB;IACF;IAEA,IAAI,CAACF,QAAQ,CAACE,KAAK,CAAC,EAAE;MACpBA,KAAK,CAACC,KAAK,CAAC,CAAC;IACf;EACF,CAAC,EACD,CAACD,KAAK,CACR,CAAC;AACH","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useTableColumn.js","names":["useMemo","useTable","useTableColumn","table","firstRow","lastRow","columnName","columnNames","columns","data","error","column"],"sources":["../src/useTableColumn.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport useTable from './useTable';\n\n/**\n * Subscribe to viewport updates on a single table column\n * @param table Table to get the data from\n * @param firstRow First viewport row\n * @param lastRow Last viewport row\n * @param columnName Column to get the data from\n * @returns Column object, data array for the column, error, setViewport method\n */\nconst useTableColumn = (\n table: dh.Table | undefined,\n firstRow: number,\n lastRow: number,\n columnName: string\n): {\n column: dh.Column | undefined;\n data: unknown[];\n error: Error | null;\n} => {\n const columnNames = useMemo(() => [columnName], [columnName]);\n const {\n columns = [],\n data = [],\n error,\n } = useTable(table, firstRow, lastRow, columnNames);\n return {\n column: columns[0],\n data: data[0],\n error,\n };\n};\n\nexport default useTableColumn;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAAC,OAEzBC,QAAQ;AAEf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAMC,cAAc,GAAGA,CACrBC,KAA2B,EAC3BC,QAAgB,EAChBC,OAAe,EACfC,UAAkB,KAKf;EACH,IAAMC,WAAW,GAAGP,OAAO,CAAC,MAAM,CAACM,UAAU,CAAC,EAAE,CAACA,UAAU,CAAC,CAAC;EAC7D,IAAM;IACJE,OAAO,GAAG,EAAE;IACZC,IAAI,GAAG,EAAE;IACTC;EACF,CAAC,GAAGT,QAAQ,CAACE,KAAK,EAAEC,QAAQ,EAAEC,OAAO,EAAEE,WAAW,CAAC;EACnD,OAAO;IACLI,MAAM,EAAEH,OAAO,CAAC,CAAC,CAAC;IAClBC,IAAI,EAAEA,IAAI,CAAC,CAAC,CAAC;IACbC;EACF,CAAC;AACH,CAAC;AAED,eAAeR,cAAc"}
1
+ {"version":3,"file":"useTableColumn.js","names":["useMemo","useTable","useTableColumn","table","firstRow","lastRow","columnName","columnNames","columns","data","error","column"],"sources":["../src/useTableColumn.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport useTable from './useTable';\n\n/**\n * Subscribe to viewport updates on a single table column\n * @param table Table to get the data from\n * @param firstRow First viewport row\n * @param lastRow Last viewport row\n * @param columnName Column to get the data from\n * @returns Column object, data array for the column, error, setViewport method\n */\nconst useTableColumn = (\n table: dh.Table | undefined,\n firstRow: number,\n lastRow: number,\n columnName: string\n): {\n column: dh.Column | undefined;\n data: unknown[];\n error: Error | null;\n} => {\n const columnNames = useMemo(() => [columnName], [columnName]);\n const {\n columns = [],\n data = [],\n error,\n } = useTable(table, firstRow, lastRow, columnNames);\n return {\n column: columns[0],\n data: data[0],\n error,\n };\n};\n\nexport default useTableColumn;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAAC,OAEzBC,QAAQ;AAEf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAMC,cAAc,GAAGA,CACrBC,KAA2B,EAC3BC,QAAgB,EAChBC,OAAe,EACfC,UAAkB,KAKf;EACH,IAAMC,WAAW,GAAGP,OAAO,CAAC,MAAM,CAACM,UAAU,CAAC,EAAE,CAACA,UAAU,CAAC,CAAC;EAC7D,IAAM;IACJE,OAAO,GAAG,EAAE;IACZC,IAAI,GAAG,EAAE;IACTC;EACF,CAAC,GAAGT,QAAQ,CAACE,KAAK,EAAEC,QAAQ,EAAEC,OAAO,EAAEE,WAAW,CAAC;EACnD,OAAO;IACLI,MAAM,EAAEH,OAAO,CAAC,CAAC,CAAC;IAClBC,IAAI,EAAEA,IAAI,CAAC,CAAC,CAAC;IACbC;EACF,CAAC;AACH,CAAC;AAED,eAAeR,cAAc","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useTableListener.js","names":["useEffect","Log","log","module","useTableListener","eventEmitter","eventName","callback","initEventEmitter","debug2","addEventListener"],"sources":["../src/useTableListener.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\n\nconst log = Log.module('useTableListener');\n\nexport const useTableListener = <T = unknown>(\n eventEmitter: dh.HasEventHandling | undefined | null,\n eventName: string,\n callback: (event: dh.Event<T>) => void\n): void =>\n useEffect(\n function initEventEmitter() {\n if (eventEmitter == null) {\n log.debug2('Emitter undefined, skipping addEventListener', eventName);\n return;\n }\n log.debug2('Adding listener', eventName);\n return eventEmitter.addEventListener(eventName, callback);\n },\n [eventEmitter, eventName, callback]\n );\n\nexport default useTableListener;\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AAEjC,OAAOC,GAAG,MAAM,gBAAgB;AAEhC,IAAMC,GAAG,GAAGD,GAAG,CAACE,MAAM,CAAC,kBAAkB,CAAC;AAE1C,OAAO,IAAMC,gBAAgB,GAAGA,CAC9BC,YAAoD,EACpDC,SAAiB,EACjBC,QAAsC,KAEtCP,SAAS,CACP,SAASQ,gBAAgBA,CAAA,EAAG;EAC1B,IAAIH,YAAY,IAAI,IAAI,EAAE;IACxBH,GAAG,CAACO,MAAM,CAAC,8CAA8C,EAAEH,SAAS,CAAC;IACrE;EACF;EACAJ,GAAG,CAACO,MAAM,CAAC,iBAAiB,EAAEH,SAAS,CAAC;EACxC,OAAOD,YAAY,CAACK,gBAAgB,CAACJ,SAAS,EAAEC,QAAQ,CAAC;AAC3D,CAAC,EACD,CAACF,YAAY,EAAEC,SAAS,EAAEC,QAAQ,CACpC,CAAC;AAEH,eAAeH,gBAAgB"}
1
+ {"version":3,"file":"useTableListener.js","names":["useEffect","Log","log","module","useTableListener","eventEmitter","eventName","callback","initEventEmitter","debug2","addEventListener"],"sources":["../src/useTableListener.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\n\nconst log = Log.module('useTableListener');\n\nexport const useTableListener = <T = unknown>(\n eventEmitter: dh.HasEventHandling | undefined | null,\n eventName: string,\n callback: (event: dh.Event<T>) => void\n): void =>\n useEffect(\n function initEventEmitter() {\n if (eventEmitter == null) {\n log.debug2('Emitter undefined, skipping addEventListener', eventName);\n return;\n }\n log.debug2('Adding listener', eventName);\n return eventEmitter.addEventListener(eventName, callback);\n },\n [eventEmitter, eventName, callback]\n );\n\nexport default useTableListener;\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AAEjC,OAAOC,GAAG,MAAM,gBAAgB;AAEhC,IAAMC,GAAG,GAAGD,GAAG,CAACE,MAAM,CAAC,kBAAkB,CAAC;AAE1C,OAAO,IAAMC,gBAAgB,GAAGA,CAC9BC,YAAoD,EACpDC,SAAiB,EACjBC,QAAsC,KAEtCP,SAAS,CACP,SAASQ,gBAAgBA,CAAA,EAAG;EAC1B,IAAIH,YAAY,IAAI,IAAI,EAAE;IACxBH,GAAG,CAACO,MAAM,CAAC,8CAA8C,EAAEH,SAAS,CAAC;IACrE;EACF;EACAJ,GAAG,CAACO,MAAM,CAAC,iBAAiB,EAAEH,SAAS,CAAC;EACxC,OAAOD,YAAY,CAACK,gBAAgB,CAACJ,SAAS,EAAEC,QAAQ,CAAC;AAC3D,CAAC,EACD,CAACF,YAAY,EAAEC,SAAS,EAAEC,QAAQ,CACpC,CAAC;AAEH,eAAeH,gBAAgB","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useTableSize.js","names":["useCallback","useState","useApi","getSize","useTableListener","useTableSize","table","forceRerender","dh","onSizeChanged","i","Table","EVENT_SIZECHANGED"],"sources":["../src/useTableSize.ts"],"sourcesContent":["import { useCallback, useState } from 'react';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { getSize } from '@deephaven/jsapi-utils';\nimport useTableListener from './useTableListener';\n\n/**\n * React hook that returns the size of a given table or zero if table is null or\n * undefined. The hook subscribes to the dh.Table.EVENT_SIZECHANGED event and\n * triggers a re-render if any events are received to ensure we have the current\n * size.\n * @param table The table to check the size on.\n */\nexport function useTableSize(\n table: dh.Table | dh.TreeTable | null | undefined\n): number {\n const [, forceRerender] = useState(0);\n\n const dh = useApi();\n\n const onSizeChanged = useCallback(() => {\n forceRerender(i => i + 1);\n }, []);\n\n useTableListener(table, dh.Table.EVENT_SIZECHANGED, onSizeChanged);\n\n return getSize(table);\n}\n\nexport default useTableSize;\n"],"mappings":"AAAA,SAASA,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AAC7C,SAASC,MAAM,QAAQ,4BAA4B;AAEnD,SAASC,OAAO,QAAQ,wBAAwB;AAAC,OAC1CC,gBAAgB;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAC1BC,KAAiD,EACzC;EACR,IAAM,GAAGC,aAAa,CAAC,GAAGN,QAAQ,CAAC,CAAC,CAAC;EAErC,IAAMO,EAAE,GAAGN,MAAM,CAAC,CAAC;EAEnB,IAAMO,aAAa,GAAGT,WAAW,CAAC,MAAM;IACtCO,aAAa,CAACG,CAAC,IAAIA,CAAC,GAAG,CAAC,CAAC;EAC3B,CAAC,EAAE,EAAE,CAAC;EAENN,gBAAgB,CAACE,KAAK,EAAEE,EAAE,CAACG,KAAK,CAACC,iBAAiB,EAAEH,aAAa,CAAC;EAElE,OAAON,OAAO,CAACG,KAAK,CAAC;AACvB;AAEA,eAAeD,YAAY"}
1
+ {"version":3,"file":"useTableSize.js","names":["useCallback","useState","useApi","getSize","useTableListener","useTableSize","table","forceRerender","dh","onSizeChanged","i","Table","EVENT_SIZECHANGED"],"sources":["../src/useTableSize.ts"],"sourcesContent":["import { useCallback, useState } from 'react';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { getSize } from '@deephaven/jsapi-utils';\nimport useTableListener from './useTableListener';\n\n/**\n * React hook that returns the size of a given table or zero if table is null or\n * undefined. The hook subscribes to the dh.Table.EVENT_SIZECHANGED event and\n * triggers a re-render if any events are received to ensure we have the current\n * size.\n * @param table The table to check the size on.\n */\nexport function useTableSize(\n table: dh.Table | dh.TreeTable | null | undefined\n): number {\n const [, forceRerender] = useState(0);\n\n const dh = useApi();\n\n const onSizeChanged = useCallback(() => {\n forceRerender(i => i + 1);\n }, []);\n\n useTableListener(table, dh.Table.EVENT_SIZECHANGED, onSizeChanged);\n\n return getSize(table);\n}\n\nexport default useTableSize;\n"],"mappings":"AAAA,SAASA,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AAC7C,SAASC,MAAM,QAAQ,4BAA4B;AAEnD,SAASC,OAAO,QAAQ,wBAAwB;AAAC,OAC1CC,gBAAgB;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAC1BC,KAAiD,EACzC;EACR,IAAM,GAAGC,aAAa,CAAC,GAAGN,QAAQ,CAAC,CAAC,CAAC;EAErC,IAAMO,EAAE,GAAGN,MAAM,CAAC,CAAC;EAEnB,IAAMO,aAAa,GAAGT,WAAW,CAAC,MAAM;IACtCO,aAAa,CAACG,CAAC,IAAIA,CAAC,GAAG,CAAC,CAAC;EAC3B,CAAC,EAAE,EAAE,CAAC;EAENN,gBAAgB,CAACE,KAAK,EAAEE,EAAE,CAACG,KAAK,CAACC,iBAAiB,EAAEH,aAAa,CAAC;EAElE,OAAON,OAAO,CAACG,KAAK,CAAC;AACvB;AAEA,eAAeD,YAAY","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useTableUtils.js","names":["useMemo","useApi","TableUtils","useTableUtils","dh"],"sources":["../src/useTableUtils.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport { TableUtils } from '@deephaven/jsapi-utils';\n\n/**\n * Get a `TableUtils` instance using `dh` api from the current context.\n */\nexport function useTableUtils(): TableUtils {\n const dh = useApi();\n return useMemo(() => new TableUtils(dh), [dh]);\n}\n\nexport default useTableUtils;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SAASC,MAAM,QAAQ,4BAA4B;AACnD,SAASC,UAAU,QAAQ,wBAAwB;;AAEnD;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAAA,EAAe;EAC1C,IAAMC,EAAE,GAAGH,MAAM,CAAC,CAAC;EACnB,OAAOD,OAAO,CAAC,MAAM,IAAIE,UAAU,CAACE,EAAE,CAAC,EAAE,CAACA,EAAE,CAAC,CAAC;AAChD;AAEA,eAAeD,aAAa"}
1
+ {"version":3,"file":"useTableUtils.js","names":["useMemo","useApi","TableUtils","useTableUtils","dh"],"sources":["../src/useTableUtils.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport { TableUtils } from '@deephaven/jsapi-utils';\n\n/**\n * Get a `TableUtils` instance using `dh` api from the current context.\n */\nexport function useTableUtils(): TableUtils {\n const dh = useApi();\n return useMemo(() => new TableUtils(dh), [dh]);\n}\n\nexport default useTableUtils;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SAASC,MAAM,QAAQ,4BAA4B;AACnD,SAASC,UAAU,QAAQ,wBAAwB;;AAEnD;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAAA,EAAe;EAC1C,IAAMC,EAAE,GAAGH,MAAM,CAAC,CAAC;EACnB,OAAOD,OAAO,CAAC,MAAM,IAAIE,UAAU,CAACE,EAAE,CAAC,EAAE,CAACA,EAAE,CAAC,CAAC;AAChD;AAEA,eAAeD,aAAa","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useValueFilter.js","names":["useMemo","createValueFilter","useTableUtils","useValueFilter","columnNames","value","operator","tableUtils"],"sources":["../src/useValueFilter.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n createValueFilter,\n type FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport useTableUtils from './useTableUtils';\n\n/**\n * Create a filter condition factory for a filter operator that matches the given value.\n * @param columnNames Column names to compare value to\n * @param value Value to match\n * @param operator Operator to use for matching\n */\nexport function useValueFilter(\n columnNames: string | string[],\n value: string,\n operator: 'contains' | 'eq' | 'notEq'\n): FilterConditionFactory {\n const tableUtils = useTableUtils();\n\n return useMemo(\n () => createValueFilter(tableUtils, columnNames, value, operator),\n [columnNames, operator, tableUtils, value]\n );\n}\n\nexport default useValueFilter;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SACEC,iBAAiB,QAEZ,wBAAwB;AAAC,OACzBC,aAAa;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAC5BC,WAA8B,EAC9BC,KAAa,EACbC,QAAqC,EACb;EACxB,IAAMC,UAAU,GAAGL,aAAa,CAAC,CAAC;EAElC,OAAOF,OAAO,CACZ,MAAMC,iBAAiB,CAACM,UAAU,EAAEH,WAAW,EAAEC,KAAK,EAAEC,QAAQ,CAAC,EACjE,CAACF,WAAW,EAAEE,QAAQ,EAAEC,UAAU,EAAEF,KAAK,CAC3C,CAAC;AACH;AAEA,eAAeF,cAAc"}
1
+ {"version":3,"file":"useValueFilter.js","names":["useMemo","createValueFilter","useTableUtils","useValueFilter","columnNames","value","operator","tableUtils"],"sources":["../src/useValueFilter.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n createValueFilter,\n type FilterConditionFactory,\n} from '@deephaven/jsapi-utils';\nimport useTableUtils from './useTableUtils';\n\n/**\n * Create a filter condition factory for a filter operator that matches the given value.\n * @param columnNames Column names to compare value to\n * @param value Value to match\n * @param operator Operator to use for matching\n */\nexport function useValueFilter(\n columnNames: string | string[],\n value: string,\n operator: 'contains' | 'eq' | 'notEq'\n): FilterConditionFactory {\n const tableUtils = useTableUtils();\n\n return useMemo(\n () => createValueFilter(tableUtils, columnNames, value, operator),\n [columnNames, operator, tableUtils, value]\n );\n}\n\nexport default useValueFilter;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SACEC,iBAAiB,QAEZ,wBAAwB;AAAC,OACzBC,aAAa;AAEpB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAC5BC,WAA8B,EAC9BC,KAAa,EACbC,QAAqC,EACb;EACxB,IAAMC,UAAU,GAAGL,aAAa,CAAC,CAAC;EAElC,OAAOF,OAAO,CACZ,MAAMC,iBAAiB,CAACM,UAAU,EAAEH,WAAW,EAAEC,KAAK,EAAEC,QAAQ,CAAC,EACjE,CAACF,WAAW,EAAEE,QAAQ,EAAEC,UAAU,EAAEF,KAAK,CAC3C,CAAC;AACH;AAEA,eAAeF,cAAc","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useViewportData.js","names":["useCallback","useEffect","useMemo","useRef","defaultRowDeserializer","isClosed","createOnTableUpdatedHandler","Log","useApi","useOnScrollOffsetChangeCallback","useInitializeViewportData","useSetPaddedViewportCallback","useTableSize","useTableListener","SCROLL_DEBOUNCE_MS","log","module","useViewportData","_ref","table","itemHeight","scrollDebounce","viewportSize","viewportPadding","deserializeRow","reuseItemsOnTableResize","currentViewportFirstRowRef","viewportData","setPaddedViewport","setViewport","firstRow","current","debug","applyFiltersAndRefresh","filters","applyFilter","dh","onTableUpdatedRef","onTableUpdated","event","_onTableUpdatedRef$cu","call","Table","EVENT_UPDATED","size","onScroll"],"sources":["../src/useViewportData.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport {\n type RowDeserializer,\n defaultRowDeserializer,\n isClosed,\n createOnTableUpdatedHandler,\n type OnTableUpdatedEvent,\n} from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport {\n useOnScrollOffsetChangeCallback,\n type WindowedListData,\n} from '@deephaven/react-hooks';\nimport { type KeyedItem } from '@deephaven/utils';\nimport useInitializeViewportData from './useInitializeViewportData';\nimport useSetPaddedViewportCallback from './useSetPaddedViewportCallback';\nimport useTableSize from './useTableSize';\nimport useTableListener from './useTableListener';\nimport { SCROLL_DEBOUNCE_MS } from './Constants';\n\nconst log = Log.module('useViewportData');\n\nexport interface UseViewportDataProps<\n TItem,\n TTable extends dh.Table | dh.TreeTable,\n> {\n reuseItemsOnTableResize?: boolean;\n table: TTable | null;\n itemHeight?: number;\n scrollDebounce?: number;\n viewportPadding?: number;\n viewportSize?: number;\n deserializeRow?: RowDeserializer<TItem>;\n}\n\nexport interface UseViewportDataResult<\n TItem,\n TTable extends dh.Table | dh.TreeTable,\n> {\n /** Manages deserialized row items associated with a DH Table */\n viewportData: WindowedListData<KeyedItem<TItem>>;\n /** Size of the underlying Table */\n size: number;\n\n table: TTable | null;\n /** Apply filters and refresh viewport. */\n applyFiltersAndRefresh: (filters: dh.FilterCondition[]) => void;\n /** Set the viewport of the Table */\n setViewport: (firstRow: number) => void;\n /** Handler for scroll events to update viewport */\n onScroll: (event: Event) => void;\n}\n\n/**\n * Sets up state management for windowed Table viewports. Returns a ListData\n * instance for managing items associated with the Table + a `setViewport`\n * callback for changing the current viewport.\n *\n * IMPORTANT: this will create an empty KeyedItem object for every row in the\n * source table. This is intended for \"human\" sized tables such as those used in\n * admin panels. This is not suitable for \"machine\" scale with millions+ rows.\n * @param table The Table to viewport.\n * @param itemHeight The height of each item in the viewport.\n * @param scrollDebounce The number of milliseconds to debounce scroll events.\n * @param viewportSize The number of items to display in the viewport.\n * @param viewportPadding The number of items to fetch at start and end of the viewport.\n * @param deserializeRow A function to deserialize a row from the Table.\n * @param reuseItemsOnTableResize If true, existing items will be re-used when\n * the table size changes.\n * @returns An object for managing Table viewport state.\n */\nexport function useViewportData<TItem, TTable extends dh.Table | dh.TreeTable>({\n table,\n itemHeight = 1,\n scrollDebounce = SCROLL_DEBOUNCE_MS,\n viewportSize = 10,\n viewportPadding = 50,\n deserializeRow = defaultRowDeserializer,\n reuseItemsOnTableResize = false,\n}: UseViewportDataProps<TItem, TTable>): UseViewportDataResult<TItem, TTable> {\n const currentViewportFirstRowRef = useRef<number>(0);\n\n const viewportData = useInitializeViewportData<TItem>(\n table,\n reuseItemsOnTableResize\n );\n\n const setPaddedViewport = useSetPaddedViewportCallback(\n table,\n viewportSize,\n viewportPadding\n );\n\n const setViewport = useCallback(\n (firstRow: number) => {\n currentViewportFirstRowRef.current = firstRow;\n\n if (table && !isClosed(table)) {\n setPaddedViewport(firstRow);\n } else {\n log.debug('setViewport called on closed table.', table);\n }\n },\n [table, setPaddedViewport]\n );\n\n const applyFiltersAndRefresh = useCallback(\n (filters: dh.FilterCondition[]) => {\n if (table && !isClosed(table)) {\n table.applyFilter(filters);\n setViewport(0);\n } else {\n log.debug('applyFiltersAndRefresh called on closed table.', table);\n }\n },\n [setViewport, table]\n );\n\n const dh = useApi();\n\n // Store the memoized callback in a ref so that changes to `viewportData`\n // don't invalidate the memoization of `onTableUpdated`. This prevents\n // `useTableListener` from unnecessarily re-subscribing to the same event over\n // and over.\n const onTableUpdatedRef = useRef<(event: OnTableUpdatedEvent) => void>();\n onTableUpdatedRef.current = useMemo(\n () => createOnTableUpdatedHandler(viewportData, deserializeRow),\n [deserializeRow, viewportData]\n );\n\n const onTableUpdated = useCallback((event: OnTableUpdatedEvent) => {\n onTableUpdatedRef.current?.(event);\n }, []);\n\n useTableListener(table, dh.Table.EVENT_UPDATED, onTableUpdated);\n\n const size = useTableSize(table);\n\n useEffect(() => {\n log.debug('Initializing viewport');\n\n // Hydrate the viewport with real data. This will fetch data from index\n // 0 to the end of the viewport + padding.\n setViewport(0);\n }, [table, setViewport]);\n\n useEffect(() => {\n setViewport(currentViewportFirstRowRef.current);\n }, [setViewport, size]);\n\n const onScroll = useOnScrollOffsetChangeCallback(\n itemHeight,\n setViewport,\n scrollDebounce\n );\n\n return useMemo(\n () => ({\n viewportData,\n size,\n table,\n applyFiltersAndRefresh,\n setViewport,\n onScroll,\n }),\n [applyFiltersAndRefresh, onScroll, setViewport, size, table, viewportData]\n );\n}\n\nexport default useViewportData;\n"],"mappings":"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"}
1
+ {"version":3,"file":"useViewportData.js","names":["useCallback","useEffect","useMemo","useRef","defaultRowDeserializer","isClosed","createOnTableUpdatedHandler","Log","useApi","useOnScrollOffsetChangeCallback","useInitializeViewportData","useSetPaddedViewportCallback","useTableSize","useTableListener","SCROLL_DEBOUNCE_MS","log","module","useViewportData","_ref","table","itemHeight","scrollDebounce","viewportSize","viewportPadding","deserializeRow","reuseItemsOnTableResize","currentViewportFirstRowRef","viewportData","setPaddedViewport","setViewport","firstRow","current","debug","applyFiltersAndRefresh","filters","applyFilter","dh","onTableUpdatedRef","onTableUpdated","event","_onTableUpdatedRef$cu","call","Table","EVENT_UPDATED","size","onScroll"],"sources":["../src/useViewportData.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport {\n type RowDeserializer,\n defaultRowDeserializer,\n isClosed,\n createOnTableUpdatedHandler,\n type OnTableUpdatedEvent,\n} from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport { useApi } from '@deephaven/jsapi-bootstrap';\nimport {\n useOnScrollOffsetChangeCallback,\n type WindowedListData,\n} from '@deephaven/react-hooks';\nimport { type KeyedItem } from '@deephaven/utils';\nimport useInitializeViewportData from './useInitializeViewportData';\nimport useSetPaddedViewportCallback from './useSetPaddedViewportCallback';\nimport useTableSize from './useTableSize';\nimport useTableListener from './useTableListener';\nimport { SCROLL_DEBOUNCE_MS } from './Constants';\n\nconst log = Log.module('useViewportData');\n\nexport interface UseViewportDataProps<\n TItem,\n TTable extends dh.Table | dh.TreeTable,\n> {\n reuseItemsOnTableResize?: boolean;\n table: TTable | null;\n itemHeight?: number;\n scrollDebounce?: number;\n viewportPadding?: number;\n viewportSize?: number;\n deserializeRow?: RowDeserializer<TItem>;\n}\n\nexport interface UseViewportDataResult<\n TItem,\n TTable extends dh.Table | dh.TreeTable,\n> {\n /** Manages deserialized row items associated with a DH Table */\n viewportData: WindowedListData<KeyedItem<TItem>>;\n /** Size of the underlying Table */\n size: number;\n\n table: TTable | null;\n /** Apply filters and refresh viewport. */\n applyFiltersAndRefresh: (filters: dh.FilterCondition[]) => void;\n /** Set the viewport of the Table */\n setViewport: (firstRow: number) => void;\n /** Handler for scroll events to update viewport */\n onScroll: (event: Event) => void;\n}\n\n/**\n * Sets up state management for windowed Table viewports. Returns a ListData\n * instance for managing items associated with the Table + a `setViewport`\n * callback for changing the current viewport.\n *\n * IMPORTANT: this will create an empty KeyedItem object for every row in the\n * source table. This is intended for \"human\" sized tables such as those used in\n * admin panels. This is not suitable for \"machine\" scale with millions+ rows.\n * @param table The Table to viewport.\n * @param itemHeight The height of each item in the viewport.\n * @param scrollDebounce The number of milliseconds to debounce scroll events.\n * @param viewportSize The number of items to display in the viewport.\n * @param viewportPadding The number of items to fetch at start and end of the viewport.\n * @param deserializeRow A function to deserialize a row from the Table.\n * @param reuseItemsOnTableResize If true, existing items will be re-used when\n * the table size changes.\n * @returns An object for managing Table viewport state.\n */\nexport function useViewportData<TItem, TTable extends dh.Table | dh.TreeTable>({\n table,\n itemHeight = 1,\n scrollDebounce = SCROLL_DEBOUNCE_MS,\n viewportSize = 10,\n viewportPadding = 50,\n deserializeRow = defaultRowDeserializer,\n reuseItemsOnTableResize = false,\n}: UseViewportDataProps<TItem, TTable>): UseViewportDataResult<TItem, TTable> {\n const currentViewportFirstRowRef = useRef<number>(0);\n\n const viewportData = useInitializeViewportData<TItem>(\n table,\n reuseItemsOnTableResize\n );\n\n const setPaddedViewport = useSetPaddedViewportCallback(\n table,\n viewportSize,\n viewportPadding\n );\n\n const setViewport = useCallback(\n (firstRow: number) => {\n currentViewportFirstRowRef.current = firstRow;\n\n if (table && !isClosed(table)) {\n setPaddedViewport(firstRow);\n } else {\n log.debug('setViewport called on closed table.', table);\n }\n },\n [table, setPaddedViewport]\n );\n\n const applyFiltersAndRefresh = useCallback(\n (filters: dh.FilterCondition[]) => {\n if (table && !isClosed(table)) {\n table.applyFilter(filters);\n setViewport(0);\n } else {\n log.debug('applyFiltersAndRefresh called on closed table.', table);\n }\n },\n [setViewport, table]\n );\n\n const dh = useApi();\n\n // Store the memoized callback in a ref so that changes to `viewportData`\n // don't invalidate the memoization of `onTableUpdated`. This prevents\n // `useTableListener` from unnecessarily re-subscribing to the same event over\n // and over.\n const onTableUpdatedRef = useRef<(event: OnTableUpdatedEvent) => void>();\n onTableUpdatedRef.current = useMemo(\n () => createOnTableUpdatedHandler(viewportData, deserializeRow),\n [deserializeRow, viewportData]\n );\n\n const onTableUpdated = useCallback((event: OnTableUpdatedEvent) => {\n onTableUpdatedRef.current?.(event);\n }, []);\n\n useTableListener(table, dh.Table.EVENT_UPDATED, onTableUpdated);\n\n const size = useTableSize(table);\n\n useEffect(() => {\n log.debug('Initializing viewport');\n\n // Hydrate the viewport with real data. This will fetch data from index\n // 0 to the end of the viewport + padding.\n setViewport(0);\n }, [table, setViewport]);\n\n useEffect(() => {\n setViewport(currentViewportFirstRowRef.current);\n }, [setViewport, size]);\n\n const onScroll = useOnScrollOffsetChangeCallback(\n itemHeight,\n setViewport,\n scrollDebounce\n );\n\n return useMemo(\n () => ({\n viewportData,\n size,\n table,\n applyFiltersAndRefresh,\n setViewport,\n onScroll,\n }),\n [applyFiltersAndRefresh, onScroll, setViewport, size, table, viewportData]\n );\n}\n\nexport default useViewportData;\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useViewportFilter.js","names":["useEffect","useViewportFilter","viewportData","filter","applyFiltersAndRefresh"],"sources":["../src/useViewportFilter.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { type UseViewportDataResult } from './useViewportData';\n\n/**\n * Applies a filter to a viewport.\n * @param viewportData Viewport to filter\n * @param filter Filter to apply\n */\nexport function useViewportFilter<TItem>(\n viewportData: UseViewportDataResult<TItem, dh.Table>,\n filter: dh.FilterCondition[]\n): void {\n const { applyFiltersAndRefresh } = viewportData;\n\n useEffect(() => {\n applyFiltersAndRefresh(filter);\n }, [applyFiltersAndRefresh, filter]);\n}\n\nexport default useViewportFilter;\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AAIjC;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAC/BC,YAAoD,EACpDC,MAA4B,EACtB;EACN,IAAM;IAAEC;EAAuB,CAAC,GAAGF,YAAY;EAE/CF,SAAS,CAAC,MAAM;IACdI,sBAAsB,CAACD,MAAM,CAAC;EAChC,CAAC,EAAE,CAACC,sBAAsB,EAAED,MAAM,CAAC,CAAC;AACtC;AAEA,eAAeF,iBAAiB"}
1
+ {"version":3,"file":"useViewportFilter.js","names":["useEffect","useViewportFilter","viewportData","filter","applyFiltersAndRefresh"],"sources":["../src/useViewportFilter.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { type UseViewportDataResult } from './useViewportData';\n\n/**\n * Applies a filter to a viewport.\n * @param viewportData Viewport to filter\n * @param filter Filter to apply\n */\nexport function useViewportFilter<TItem>(\n viewportData: UseViewportDataResult<TItem, dh.Table>,\n filter: dh.FilterCondition[]\n): void {\n const { applyFiltersAndRefresh } = viewportData;\n\n useEffect(() => {\n applyFiltersAndRefresh(filter);\n }, [applyFiltersAndRefresh, filter]);\n}\n\nexport default useViewportFilter;\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AAIjC;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAC/BC,YAAoD,EACpDC,MAA4B,EACtB;EACN,IAAM;IAAEC;EAAuB,CAAC,GAAGF,YAAY;EAE/CF,SAAS,CAAC,MAAM;IACdI,sBAAsB,CAACD,MAAM,CAAC;EAChC,CAAC,EAAE,CAACC,sBAAsB,EAAED,MAAM,CAAC,CAAC;AACtC;AAEA,eAAeF,iBAAiB","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/jsapi-components",
3
- "version": "1.2.1-3-revert-plotly.1+323399ae",
3
+ "version": "1.2.1-beta.1+8c8edd5d",
4
4
  "description": "Deephaven JSAPI Components",
5
5
  "author": "Deephaven Data Labs LLC",
6
6
  "license": "Apache-2.0",
@@ -22,13 +22,13 @@
22
22
  "build:sass": "sass --embed-sources --load-path=../../node_modules ./src:./dist"
23
23
  },
24
24
  "dependencies": {
25
- "@deephaven/components": "^1.2.1-3-revert-plotly.1+323399ae",
26
- "@deephaven/jsapi-bootstrap": "^1.2.1-3-revert-plotly.1+323399ae",
25
+ "@deephaven/components": "^1.2.1-beta.1+8c8edd5d",
26
+ "@deephaven/jsapi-bootstrap": "^1.2.1-beta.1+8c8edd5d",
27
27
  "@deephaven/jsapi-types": "^1.0.0-dev0.39.4",
28
- "@deephaven/jsapi-utils": "^1.2.1-3-revert-plotly.1+323399ae",
29
- "@deephaven/log": "^1.2.1-3-revert-plotly.1+323399ae",
30
- "@deephaven/react-hooks": "^1.2.1-3-revert-plotly.1+323399ae",
31
- "@deephaven/utils": "^1.2.1-3-revert-plotly.1+323399ae",
28
+ "@deephaven/jsapi-utils": "^1.2.1-beta.1+8c8edd5d",
29
+ "@deephaven/log": "^1.2.1-beta.1+8c8edd5d",
30
+ "@deephaven/react-hooks": "^1.2.1-beta.1+8c8edd5d",
31
+ "@deephaven/utils": "^1.2.1-beta.1+8c8edd5d",
32
32
  "@types/js-cookie": "^3.0.3",
33
33
  "classnames": "^2.3.2",
34
34
  "js-cookie": "^3.0.5",
@@ -36,8 +36,8 @@
36
36
  "prop-types": "^15.8.1"
37
37
  },
38
38
  "devDependencies": {
39
- "@deephaven/jsapi-shim": "^1.2.1-3-revert-plotly.1+323399ae",
40
- "@deephaven/test-utils": "^1.2.1-3-revert-plotly.1+323399ae",
39
+ "@deephaven/jsapi-shim": "^1.2.1-beta.1+8c8edd5d",
40
+ "@deephaven/test-utils": "^1.2.1-beta.1+8c8edd5d",
41
41
  "react-test-renderer": "^17.0.2"
42
42
  },
43
43
  "peerDependencies": {
@@ -52,5 +52,5 @@
52
52
  "publishConfig": {
53
53
  "access": "public"
54
54
  },
55
- "gitHead": "323399ae3e863f97dea95bc0f2b8234a088fd2da"
55
+ "gitHead": "8c8edd5ddca3bd94443180fb9a1b5dba4dbcce3b"
56
56
  }