@deephaven/jsapi-components 1.22.1-alpha-pivot-builder.0 → 1.22.2-alpha-pivot-builder.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/HookTestUtils.js +1 -3
- package/dist/HookTestUtils.js.map +1 -1
- package/dist/TableDropdown.js +23 -15
- package/dist/TableDropdown.js.map +1 -1
- package/dist/TableInput.js +71 -55
- package/dist/TableInput.js.map +1 -1
- package/dist/spectrum/ComboBox.js +2 -4
- package/dist/spectrum/ComboBox.js.map +1 -1
- package/dist/spectrum/ListView.js +17 -22
- package/dist/spectrum/ListView.js.map +1 -1
- package/dist/spectrum/MultiSelect.js +3 -5
- package/dist/spectrum/MultiSelect.js.map +1 -1
- package/dist/spectrum/utils/useItemRowDeserializer.js +7 -8
- package/dist/spectrum/utils/useItemRowDeserializer.js.map +1 -1
- package/dist/spectrum/utils/useMultiPickerProps.js +39 -33
- package/dist/spectrum/utils/useMultiPickerProps.js.map +1 -1
- package/dist/spectrum/utils/usePickerProps.js +36 -33
- package/dist/spectrum/utils/usePickerProps.js.map +1 -1
- package/dist/useBroadcastChannel.js +1 -3
- package/dist/useBroadcastChannel.js.map +1 -1
- package/dist/useCheckIfExistsValue.js +15 -8
- package/dist/useCheckIfExistsValue.js.map +1 -1
- package/dist/useDebouncedViewportSearch.js +2 -4
- package/dist/useDebouncedViewportSearch.js.map +1 -1
- package/dist/useDebouncedViewportSelectionFilter.js +6 -9
- package/dist/useDebouncedViewportSelectionFilter.js.map +1 -1
- package/dist/useFormatter.js +4 -6
- package/dist/useFormatter.js.map +1 -1
- package/dist/useGetItemIndexByValue.js +3 -5
- package/dist/useGetItemIndexByValue.js.map +1 -1
- package/dist/useGetItemPosition.js +7 -8
- package/dist/useGetItemPosition.js.map +1 -1
- package/dist/useInitializeViewportData.js +3 -5
- package/dist/useInitializeViewportData.js.map +1 -1
- package/dist/usePickerWithSelectedValues.js +39 -25
- package/dist/usePickerWithSelectedValues.js.map +1 -1
- package/dist/useSearchableViewportData.js +14 -6
- package/dist/useSearchableViewportData.js.map +1 -1
- package/dist/useSelectDistinctTable.js +5 -6
- package/dist/useSelectDistinctTable.js.map +1 -1
- package/dist/useSetPaddedViewportCallback.js +10 -1
- package/dist/useSetPaddedViewportCallback.js.map +1 -1
- package/dist/useTable.js +23 -7
- package/dist/useTable.js.map +1 -1
- package/dist/useTableColumn.js +6 -5
- package/dist/useTableColumn.js.map +1 -1
- package/dist/useTableSize.js +9 -1
- package/dist/useTableSize.js.map +1 -1
- package/dist/useViewportData.js +15 -10
- package/dist/useViewportData.js.map +1 -1
- package/dist/useViewportFilter.js +1 -3
- package/dist/useViewportFilter.js.map +1 -1
- package/package.json +10 -10
package/dist/HookTestUtils.js
CHANGED
|
@@ -3,9 +3,7 @@ import { ApiContext } from '@deephaven/jsapi-bootstrap';
|
|
|
3
3
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
4
4
|
export function makeApiContextWrapper(dh) {
|
|
5
5
|
return function ApiContextWrapper(_ref) {
|
|
6
|
-
var
|
|
7
|
-
children
|
|
8
|
-
} = _ref;
|
|
6
|
+
var children = _ref.children;
|
|
9
7
|
return /*#__PURE__*/_jsx(ApiContext.Provider, {
|
|
10
8
|
value: dh,
|
|
11
9
|
children: children
|
|
@@ -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,
|
|
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,IAHdC,QAAQ,GAAAD,IAAA,CAARC,QAAQ;IAIR,oBAAOL,IAAA,CAACF,UAAU,CAACQ,QAAQ;MAACC,KAAK,EAAEL,EAAG;MAAAG,QAAA,EAAEA;IAAQ,CAAsB,CAAC;EACzE,CAAC;AACH;AAEA,eAAe;EACbJ;AACF,CAAC","ignoreList":[]}
|
package/dist/TableDropdown.js
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
2
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
3
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
4
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
5
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
6
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
1
7
|
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
|
2
8
|
import { Option, Select } from '@deephaven/components';
|
|
3
9
|
import { useApi } from '@deephaven/jsapi-bootstrap';
|
|
@@ -13,19 +19,23 @@ function defaultFormatValue(value) {
|
|
|
13
19
|
* Dropdown that displays the values of a column in a table.
|
|
14
20
|
*/
|
|
15
21
|
export function TableDropdown(_ref) {
|
|
16
|
-
var
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
filter = EMPTY_ARRAY,
|
|
20
|
-
onChange,
|
|
21
|
-
selectedValue,
|
|
22
|
-
disabled,
|
|
23
|
-
className,
|
|
24
|
-
formatValue =
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
var column = _ref.column,
|
|
23
|
+
table = _ref.table,
|
|
24
|
+
_ref$filter = _ref.filter,
|
|
25
|
+
filter = _ref$filter === void 0 ? EMPTY_ARRAY : _ref$filter,
|
|
26
|
+
onChange = _ref.onChange,
|
|
27
|
+
selectedValue = _ref.selectedValue,
|
|
28
|
+
disabled = _ref.disabled,
|
|
29
|
+
className = _ref.className,
|
|
30
|
+
_ref$formatValue = _ref.formatValue,
|
|
31
|
+
formatValue = _ref$formatValue === void 0 ? defaultFormatValue : _ref$formatValue,
|
|
32
|
+
_ref$maxSize = _ref.maxSize,
|
|
33
|
+
maxSize = _ref$maxSize === void 0 ? 1000 : _ref$maxSize;
|
|
27
34
|
var dh = useApi();
|
|
28
|
-
var
|
|
35
|
+
var _useState = useState([]),
|
|
36
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
37
|
+
values = _useState2[0],
|
|
38
|
+
setValues = _useState2[1];
|
|
29
39
|
useEffect(() => {
|
|
30
40
|
if (table == null) {
|
|
31
41
|
setValues([]);
|
|
@@ -36,9 +46,7 @@ export function TableDropdown(_ref) {
|
|
|
36
46
|
table.applyFilter(filter);
|
|
37
47
|
var subscription = table.setViewport(0, maxSize, [tableColumn]);
|
|
38
48
|
subscription.addEventListener(dh.Table.EVENT_UPDATED, event => {
|
|
39
|
-
var
|
|
40
|
-
detail
|
|
41
|
-
} = event;
|
|
49
|
+
var detail = event.detail;
|
|
42
50
|
// Core JSAPI returns undefined for null table values,
|
|
43
51
|
// coalesce with null to differentiate null from no selection in the dropdown
|
|
44
52
|
// https://github.com/deephaven/deephaven-core/issues/5400
|
|
@@ -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","newSelectedValue","newSelectedIndex","parseInt","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 () =>\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 (newSelectedValue: string) => {\n const newSelectedIndex = parseInt(newSelectedValue, 10);\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":"AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AACxE,SAASC,MAAM,EAAEC,MAAM,QAAQ,uBAAuB;AACtD,SAASC,MAAM,QAAQ,4BAA4B;AAEnD,SAASC,WAAW,QAAQ,kBAAkB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAM/C,SAASC,YAAYA,CAACC,KAAc,EAAuB;EACzD,OACE,OAAOA,KAAK,KAAK,QAAQ,IACzBA,KAAK,IAAI,IAAI,IACb,QAAQ,IAAIA,KAAK,IACjB,OAAOA,KAAK,CAACC,MAAM,KAAK,UAAU;AAEtC;AAEA,SAASC,kBAAkBA,CAACF,KAAc,EAAU;EAClD,UAAAG,MAAA,CAAUH,KAAK;AACjB;AA+BA;AACA;AACA;AACA,OAAO,SAASI,aAAaA,CAAAC,IAAA,EAUO;EAAA,
|
|
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","_ref$filter","filter","onChange","selectedValue","disabled","className","_ref$formatValue","formatValue","_ref$maxSize","maxSize","dh","_useState","_useState2","_slicedToArray","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","newSelectedValue","newSelectedIndex","parseInt","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 () =>\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 (newSelectedValue: string) => {\n const newSelectedIndex = parseInt(newSelectedValue, 10);\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":[]}
|
package/dist/TableInput.js
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
|
|
2
2
|
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
|
|
3
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
4
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
5
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
6
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
7
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
8
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
3
9
|
import React, { useCallback, useState, useRef, useEffect, useMemo } from 'react';
|
|
4
10
|
import classNames from 'classnames';
|
|
5
11
|
import { LoadingOverlay, SearchInput, SelectValueList } from '@deephaven/components';
|
|
@@ -14,67 +20,81 @@ var log = Log.module('TableInput');
|
|
|
14
20
|
var SIZE_LIMIT = 250;
|
|
15
21
|
function TableInput(props) {
|
|
16
22
|
var _table$size, _error$message;
|
|
17
|
-
var
|
|
18
|
-
className = undefined,
|
|
19
|
-
columnName,
|
|
20
|
-
settings,
|
|
21
|
-
defaultValue =
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
var _props$className = props.className,
|
|
24
|
+
className = _props$className === void 0 ? undefined : _props$className,
|
|
25
|
+
columnName = props.columnName,
|
|
26
|
+
settings = props.settings,
|
|
27
|
+
_props$defaultValue = props.defaultValue,
|
|
28
|
+
defaultValue = _props$defaultValue === void 0 ? [] : _props$defaultValue,
|
|
29
|
+
_props$isInvalid = props.isInvalid,
|
|
30
|
+
isInvalid = _props$isInvalid === void 0 ? false : _props$isInvalid,
|
|
31
|
+
_props$onChange = props.onChange,
|
|
32
|
+
onChange = _props$onChange === void 0 ? EMPTY_FUNCTION : _props$onChange,
|
|
33
|
+
_props$onBlur = props.onBlur,
|
|
34
|
+
onBlur = _props$onBlur === void 0 ? EMPTY_FUNCTION : _props$onBlur,
|
|
35
|
+
tablePromise = props.table;
|
|
27
36
|
var parentRef = useRef(null);
|
|
28
37
|
var dh = useApi();
|
|
29
38
|
var formatter = useMemo(() => {
|
|
30
39
|
var columnFormats = FormatterUtils.getColumnFormats(settings);
|
|
31
40
|
var dateTimeFormatterOptions = FormatterUtils.getDateTimeFormatterOptions(settings);
|
|
32
|
-
var
|
|
33
|
-
defaultDecimalFormatOptions = {},
|
|
34
|
-
|
|
35
|
-
|
|
41
|
+
var _settings$defaultDeci = settings.defaultDecimalFormatOptions,
|
|
42
|
+
defaultDecimalFormatOptions = _settings$defaultDeci === void 0 ? {} : _settings$defaultDeci,
|
|
43
|
+
_settings$defaultInte = settings.defaultIntegerFormatOptions,
|
|
44
|
+
defaultIntegerFormatOptions = _settings$defaultInte === void 0 ? {} : _settings$defaultInte;
|
|
36
45
|
return new Formatter(dh, columnFormats, dateTimeFormatterOptions, defaultDecimalFormatOptions, defaultIntegerFormatOptions);
|
|
37
46
|
}, [dh, settings]);
|
|
38
|
-
var
|
|
39
|
-
|
|
40
|
-
|
|
47
|
+
var _useState = useState(''),
|
|
48
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
49
|
+
searchValue = _useState2[0],
|
|
50
|
+
setSearchValue = _useState2[1];
|
|
51
|
+
var _useState3 = useState(new Set(defaultValue)),
|
|
52
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
53
|
+
selection = _useState4[0],
|
|
54
|
+
setSelection = _useState4[1];
|
|
55
|
+
var _useState5 = useState(),
|
|
56
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
57
|
+
table = _useState6[0],
|
|
58
|
+
setTable = _useState6[1];
|
|
41
59
|
var listRef = useRef(null);
|
|
42
60
|
var itemCount = Math.min((_table$size = table === null || table === void 0 ? void 0 : table.size) !== null && _table$size !== void 0 ? _table$size : 0, SIZE_LIMIT);
|
|
43
|
-
var
|
|
44
|
-
column,
|
|
45
|
-
data,
|
|
46
|
-
error
|
|
47
|
-
} = useTableColumn(table, 0, SIZE_LIMIT - 1, columnName);
|
|
61
|
+
var _useTableColumn = useTableColumn(table, 0, SIZE_LIMIT - 1, columnName),
|
|
62
|
+
column = _useTableColumn.column,
|
|
63
|
+
data = _useTableColumn.data,
|
|
64
|
+
error = _useTableColumn.error;
|
|
48
65
|
var formatValue = useCallback(value => column ? formatter.getFormattedString(value, column.type, column.name) : "".concat(value), [column, formatter]);
|
|
49
|
-
var
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
data.forEach(v => {
|
|
57
|
-
var value = "".concat(v);
|
|
58
|
-
var isSelected = selection.has(value);
|
|
59
|
-
if (isSelected) {
|
|
60
|
-
removedItems.delete(value);
|
|
66
|
+
var _useMemo = useMemo(() => {
|
|
67
|
+
var removedItems = new Set(selection);
|
|
68
|
+
var result = [];
|
|
69
|
+
if (data == null) {
|
|
70
|
+
// Viewport not initialized
|
|
71
|
+
return [result, null];
|
|
61
72
|
}
|
|
62
|
-
|
|
63
|
-
value
|
|
64
|
-
|
|
65
|
-
isSelected
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
+
data.forEach(v => {
|
|
74
|
+
var value = "".concat(v);
|
|
75
|
+
var isSelected = selection.has(value);
|
|
76
|
+
if (isSelected) {
|
|
77
|
+
removedItems.delete(value);
|
|
78
|
+
}
|
|
79
|
+
result.push({
|
|
80
|
+
value,
|
|
81
|
+
displayValue: formatValue(v),
|
|
82
|
+
isSelected
|
|
83
|
+
});
|
|
73
84
|
});
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
85
|
+
if (removedItems.size > 0) {
|
|
86
|
+
log.debug2('Selection has items that are missing from the viewport');
|
|
87
|
+
var newSelection = new Set(selection);
|
|
88
|
+
Array.from(removedItems).forEach(value => {
|
|
89
|
+
newSelection.delete(value);
|
|
90
|
+
});
|
|
91
|
+
return [result, newSelection];
|
|
92
|
+
}
|
|
93
|
+
return [result, null];
|
|
94
|
+
}, [data, selection, formatValue]),
|
|
95
|
+
_useMemo2 = _slicedToArray(_useMemo, 2),
|
|
96
|
+
items = _useMemo2[0],
|
|
97
|
+
updatedSelection = _useMemo2[1];
|
|
78
98
|
useEffect(() => {
|
|
79
99
|
if (updatedSelection !== null) {
|
|
80
100
|
setSelection(updatedSelection);
|
|
@@ -109,9 +129,7 @@ function TableInput(props) {
|
|
|
109
129
|
|
|
110
130
|
// Scroll the item matching the input into view
|
|
111
131
|
var handleSearchChange = useCallback(e => {
|
|
112
|
-
var
|
|
113
|
-
value
|
|
114
|
-
} = e.target;
|
|
132
|
+
var value = e.target.value;
|
|
115
133
|
setSearchValue(value);
|
|
116
134
|
var index = items.findIndex(item => item.displayValue.includes(value));
|
|
117
135
|
if (index > -1) {
|
|
@@ -153,9 +171,7 @@ function TableInput(props) {
|
|
|
153
171
|
}, []);
|
|
154
172
|
var handleChildBlur = useCallback(e => {
|
|
155
173
|
var _parentRef$current;
|
|
156
|
-
var
|
|
157
|
-
relatedTarget
|
|
158
|
-
} = e;
|
|
174
|
+
var relatedTarget = e.relatedTarget;
|
|
159
175
|
log.debug('handleChildBlur', relatedTarget, relatedTarget instanceof HTMLElement, parentRef.current, (_parentRef$current = parentRef.current) === null || _parentRef$current === void 0 ? void 0 : _parentRef$current.contains(relatedTarget));
|
|
160
176
|
if (!relatedTarget || parentRef.current && relatedTarget instanceof HTMLElement && !parentRef.current.contains(relatedTarget)) {
|
|
161
177
|
onBlur();
|
package/dist/TableInput.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableInput.js","names":["React","useCallback","useState","useRef","useEffect","useMemo","classNames","LoadingOverlay","SearchInput","SelectValueList","EMPTY_FUNCTION","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"],"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 { EMPTY_FUNCTION, 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 = EMPTY_FUNCTION,\n onBlur = EMPTY_FUNCTION,\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: 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: Promise<dh.Table>) => {\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: React.ChangeEvent<HTMLInputElement>) => {\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: number) => {\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 data-testid=\"table-input-loading\"\n />\n </div>\n ))}\n </div>\n );\n}\n\nexport default TableInput;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"TableInput.js","names":["React","useCallback","useState","useRef","useEffect","useMemo","classNames","LoadingOverlay","SearchInput","SelectValueList","EMPTY_FUNCTION","PromiseUtils","Log","Formatter","FormatterUtils","useApi","useTableColumn","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","log","module","SIZE_LIMIT","TableInput","props","_table$size","_error$message","_props$className","className","undefined","columnName","settings","_props$defaultValue","defaultValue","_props$isInvalid","isInvalid","_props$onChange","onChange","_props$onBlur","onBlur","tablePromise","table","parentRef","dh","formatter","columnFormats","getColumnFormats","dateTimeFormatterOptions","getDateTimeFormatterOptions","_settings$defaultDeci","defaultDecimalFormatOptions","_settings$defaultInte","defaultIntegerFormatOptions","_useState","_useState2","_slicedToArray","searchValue","setSearchValue","_useState3","Set","_useState4","selection","setSelection","_useState5","_useState6","setTable","listRef","itemCount","Math","min","size","_useTableColumn","column","data","error","formatValue","value","getFormattedString","type","name","concat","_useMemo","removedItems","result","forEach","v","isSelected","has","delete","push","displayValue","debug2","newSelection","Array","from","_useMemo2","items","updatedSelection","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"],"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 { EMPTY_FUNCTION, 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 = EMPTY_FUNCTION,\n onBlur = EMPTY_FUNCTION,\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: 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: Promise<dh.Table>) => {\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: React.ChangeEvent<HTMLInputElement>) => {\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: number) => {\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 data-testid=\"table-input-loading\"\n />\n </div>\n ))}\n </div>\n );\n}\n\nexport default TableInput;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -12,10 +12,8 @@ import { usePickerProps } from "./utils/index.js";
|
|
|
12
12
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
13
|
export function ComboBox(props) {
|
|
14
14
|
var _usePickerProps = usePickerProps(props),
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
onSearchTextChange
|
|
18
|
-
} = _usePickerProps,
|
|
15
|
+
onInputChangeInternal = _usePickerProps.onInputChange,
|
|
16
|
+
onSearchTextChange = _usePickerProps.onSearchTextChange,
|
|
19
17
|
pickerProps = _objectWithoutProperties(_usePickerProps, _excluded);
|
|
20
18
|
var isOpenRef = useRef(false);
|
|
21
19
|
var inputValueRef = useRef('');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComboBox.js","names":["ComboBoxNormalized","useCallback","useRef","usePickerProps","jsx","_jsx","ComboBox","props","_usePickerProps","
|
|
1
|
+
{"version":3,"file":"ComboBox.js","names":["ComboBoxNormalized","useCallback","useRef","usePickerProps","jsx","_jsx","ComboBox","props","_usePickerProps","onInputChangeInternal","onInputChange","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;IAHvBE,qBAAqB,GAAAD,eAAA,CAApCE,aAAa;IACbC,kBAAkB,GAAAH,eAAA,CAAlBG,kBAAkB;IACfC,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,IAAMQ,aAAa,GAAGT,WAAW,CAC9BgB,KAAa,IAAK;IACjBR,qBAAqB,aAArBA,qBAAqB,eAArBA,qBAAqB,CAAGQ,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,CAACR,qBAAqB,EAAEE,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,eAAxBA,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;IACfF,aAAa,EAAEA,aAAc;IAC7BS,YAAY,EAAEA;EAAa,EAC5B,CAAC;AAEN;AAEA,eAAeb,QAAQ","ignoreList":[]}
|
|
@@ -13,21 +13,17 @@ import { useItemRowDeserializer } from "./utils/index.js";
|
|
|
13
13
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
14
14
|
export function ListView(_ref) {
|
|
15
15
|
var _props$density;
|
|
16
|
-
var
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
settings
|
|
22
|
-
} = _ref,
|
|
16
|
+
var table = _ref.table,
|
|
17
|
+
keyColumnName = _ref.keyColumn,
|
|
18
|
+
labelColumnName = _ref.labelColumn,
|
|
19
|
+
iconColumnName = _ref.iconColumn,
|
|
20
|
+
settings = _ref.settings,
|
|
23
21
|
props = _objectWithoutProperties(_ref, _excluded);
|
|
24
|
-
var
|
|
25
|
-
scale
|
|
26
|
-
} = useSpectrumThemeProvider();
|
|
22
|
+
var _useSpectrumThemeProv = useSpectrumThemeProvider(),
|
|
23
|
+
scale = _useSpectrumThemeProv.scale;
|
|
27
24
|
var itemHeight = LIST_VIEW_ROW_HEIGHTS[(_props$density = props.density) !== null && _props$density !== void 0 ? _props$density : 'regular'][scale];
|
|
28
|
-
var
|
|
29
|
-
getFormattedString
|
|
30
|
-
} = useFormatter(settings);
|
|
25
|
+
var _useFormatter = useFormatter(settings),
|
|
26
|
+
formatValue = _useFormatter.getFormattedString;
|
|
31
27
|
var deserializeRow = useItemRowDeserializer({
|
|
32
28
|
table,
|
|
33
29
|
iconColumnName,
|
|
@@ -35,15 +31,14 @@ export function ListView(_ref) {
|
|
|
35
31
|
labelColumnName,
|
|
36
32
|
formatValue
|
|
37
33
|
});
|
|
38
|
-
var {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
});
|
|
34
|
+
var _useViewportData = useViewportData({
|
|
35
|
+
reuseItemsOnTableResize: true,
|
|
36
|
+
table,
|
|
37
|
+
itemHeight,
|
|
38
|
+
deserializeRow
|
|
39
|
+
}),
|
|
40
|
+
viewportData = _useViewportData.viewportData,
|
|
41
|
+
onScroll = _useViewportData.onScroll;
|
|
47
42
|
return /*#__PURE__*/_jsx(ListViewNormalized
|
|
48
43
|
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
49
44
|
, _objectSpread(_objectSpread({}, props), {}, {
|
|
@@ -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","
|
|
1
|
+
{"version":3,"file":"ListView.js","names":["LIST_VIEW_ROW_HEIGHTS","ListViewNormalized","useSpectrumThemeProvider","useFormatter","useViewportData","useItemRowDeserializer","jsx","_jsx","ListView","_ref","_props$density","table","keyColumnName","keyColumn","labelColumnName","labelColumn","iconColumnName","iconColumn","settings","props","_objectWithoutProperties","_excluded","_useSpectrumThemeProv","scale","itemHeight","density","_useFormatter","formatValue","getFormattedString","deserializeRow","_useViewportData","reuseItemsOnTableResize","viewportData","onScroll","_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,IAN7BC,KAAK,GAAAF,IAAA,CAALE,KAAK;IACMC,aAAa,GAAAH,IAAA,CAAxBI,SAAS;IACIC,eAAe,GAAAL,IAAA,CAA5BM,WAAW;IACCC,cAAc,GAAAP,IAAA,CAA1BQ,UAAU;IACVC,QAAQ,GAAAT,IAAA,CAARS,QAAQ;IACLC,KAAK,GAAAC,wBAAA,CAAAX,IAAA,EAAAY,SAAA;EAER,IAAAC,qBAAA,GAAkBpB,wBAAwB,CAAC,CAAC;IAApCqB,KAAK,GAAAD,qBAAA,CAALC,KAAK;EACb,IAAMC,UAAU,GAAGxB,qBAAqB,EAAAU,cAAA,GAACS,KAAK,CAACM,OAAO,cAAAf,cAAA,cAAAA,cAAA,GAAI,SAAS,CAAC,CAACa,KAAK,CAAC;EAE3E,IAAAG,aAAA,GAA4CvB,YAAY,CAACe,QAAQ,CAAC;IAAtCS,WAAW,GAAAD,aAAA,CAA/BE,kBAAkB;EAE1B,IAAMC,cAAc,GAAGxB,sBAAsB,CAAC;IAC5CM,KAAK;IACLK,cAAc;IACdJ,aAAa;IACbE,eAAe;IACfa;EACF,CAAC,CAAC;EAEF,IAAAG,gBAAA,GAAmC1B,eAAe,CAGhD;MACA2B,uBAAuB,EAAE,IAAI;MAC7BpB,KAAK;MACLa,UAAU;MACVK;IACF,CAAC,CAAC;IARMG,YAAY,GAAAF,gBAAA,CAAZE,YAAY;IAAEC,QAAQ,GAAAH,gBAAA,CAARG,QAAQ;EAU9B,oBACE1B,IAAA,CAACN;EACC;EAAA,EAAAiC,aAAA,CAAAA,aAAA,KACIf,KAAK;IACTgB,eAAe,EAAEH,YAAY,CAACI,KAAM;IACpCC,aAAa,EAAErB,cAAc,IAAI,IAAK;IACtCiB,QAAQ,EAAEA;EAAS,EACpB,CAAC;AAEN;AAEA,eAAezB,QAAQ","ignoreList":[]}
|
|
@@ -12,11 +12,9 @@ import { useMultiPickerProps } from "./utils/index.js";
|
|
|
12
12
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
13
|
export function MultiSelect(props) {
|
|
14
14
|
var _useMultiPickerProps = useMultiPickerProps(props),
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
onSearchTextChange
|
|
19
|
-
} = _useMultiPickerProps,
|
|
15
|
+
onInputChangeInternal = _useMultiPickerProps.onInputChange,
|
|
16
|
+
onOpenChangeOriginal = _useMultiPickerProps.onOpenChange,
|
|
17
|
+
onSearchTextChange = _useMultiPickerProps.onSearchTextChange,
|
|
20
18
|
restPickerProps = _objectWithoutProperties(_useMultiPickerProps, _excluded);
|
|
21
19
|
var isOpenRef = useRef(false);
|
|
22
20
|
var inputValueRef = useRef('');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiSelect.js","names":["MultiSelectNormalized","useCallback","useRef","useMultiPickerProps","jsx","_jsx","MultiSelect","props","_useMultiPickerProps","
|
|
1
|
+
{"version":3,"file":"MultiSelect.js","names":["MultiSelectNormalized","useCallback","useRef","useMultiPickerProps","jsx","_jsx","MultiSelect","props","_useMultiPickerProps","onInputChangeInternal","onInputChange","onOpenChangeOriginal","onOpenChange","onSearchTextChange","restPickerProps","_objectWithoutProperties","_excluded","isOpenRef","inputValueRef","value","current","isOpen","_objectSpread"],"sources":["../../src/spectrum/MultiSelect.tsx"],"sourcesContent":["import { MultiSelectNormalized } from '@deephaven/components';\nimport { useCallback, useRef } from 'react';\nimport { type MultiPickerWithTableProps } from './MultiPickerProps';\nimport { useMultiPickerProps } from './utils';\n\nexport type MultiSelectProps = MultiPickerWithTableProps;\n\nexport function MultiSelect(props: MultiSelectProps): JSX.Element {\n const {\n onInputChange: onInputChangeInternal,\n onOpenChange: onOpenChangeOriginal,\n onSearchTextChange,\n ...restPickerProps\n } = useMultiPickerProps(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 MultiSelect is open.\n if (isOpenRef.current) {\n onSearchTextChange(value);\n }\n // When closed, clear the search text and store the value so we can\n // re-apply it in `onOpenChange` if opened by user input.\n else {\n onSearchTextChange('');\n inputValueRef.current = value;\n }\n },\n [onInputChangeInternal, onSearchTextChange]\n );\n\n const onOpenChange = useCallback(\n (isOpen: boolean) => {\n onOpenChangeOriginal?.(isOpen);\n\n // Reset the search text when closed.\n if (!isOpen) {\n onSearchTextChange('');\n }\n // Restore search text when opened by user input.\n else if (inputValueRef.current !== '') {\n onSearchTextChange(inputValueRef.current);\n }\n\n isOpenRef.current = isOpen;\n },\n [onSearchTextChange, onOpenChangeOriginal]\n );\n\n return (\n <MultiSelectNormalized\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...restPickerProps}\n onInputChange={onInputChange}\n onOpenChange={onOpenChange}\n />\n );\n}\n\nexport default MultiSelect;\n"],"mappings":";;;;;;;;AAAA,SAASA,qBAAqB,QAAQ,uBAAuB;AAC7D,SAASC,WAAW,EAAEC,MAAM,QAAQ,OAAO;AAAC,SAEnCC,mBAAmB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAI5B,OAAO,SAASC,WAAWA,CAACC,KAAuB,EAAe;EAChE,IAAAC,oBAAA,GAKIL,mBAAmB,CAACI,KAAK,CAAC;IAJbE,qBAAqB,GAAAD,oBAAA,CAApCE,aAAa;IACCC,oBAAoB,GAAAH,oBAAA,CAAlCI,YAAY;IACZC,kBAAkB,GAAAL,oBAAA,CAAlBK,kBAAkB;IACfC,eAAe,GAAAC,wBAAA,CAAAP,oBAAA,EAAAQ,SAAA;EAGpB,IAAMC,SAAS,GAAGf,MAAM,CAAC,KAAK,CAAC;EAC/B,IAAMgB,aAAa,GAAGhB,MAAM,CAAC,EAAE,CAAC;EAEhC,IAAMQ,aAAa,GAAGT,WAAW,CAC9BkB,KAAa,IAAK;IACjBV,qBAAqB,aAArBA,qBAAqB,eAArBA,qBAAqB,CAAGU,KAAK,CAAC;;IAE9B;IACA,IAAIF,SAAS,CAACG,OAAO,EAAE;MACrBP,kBAAkB,CAACM,KAAK,CAAC;IAC3B;IACA;IACA;IAAA,KACK;MACHN,kBAAkB,CAAC,EAAE,CAAC;MACtBK,aAAa,CAACE,OAAO,GAAGD,KAAK;IAC/B;EACF,CAAC,EACD,CAACV,qBAAqB,EAAEI,kBAAkB,CAC5C,CAAC;EAED,IAAMD,YAAY,GAAGX,WAAW,CAC7BoB,MAAe,IAAK;IACnBV,oBAAoB,aAApBA,oBAAoB,eAApBA,oBAAoB,CAAGU,MAAM,CAAC;;IAE9B;IACA,IAAI,CAACA,MAAM,EAAE;MACXR,kBAAkB,CAAC,EAAE,CAAC;IACxB;IACA;IAAA,KACK,IAAIK,aAAa,CAACE,OAAO,KAAK,EAAE,EAAE;MACrCP,kBAAkB,CAACK,aAAa,CAACE,OAAO,CAAC;IAC3C;IAEAH,SAAS,CAACG,OAAO,GAAGC,MAAM;EAC5B,CAAC,EACD,CAACR,kBAAkB,EAAEF,oBAAoB,CAC3C,CAAC;EAED,oBACEN,IAAA,CAACL;EACC;EAAA,EAAAsB,aAAA,CAAAA,aAAA,KACIR,eAAe;IACnBJ,aAAa,EAAEA,aAAc;IAC7BE,YAAY,EAAEA;EAAa,EAC5B,CAAC;AAEN;AAEA,eAAeN,WAAW","ignoreList":[]}
|
|
@@ -22,14 +22,13 @@ function defaultFormatValue(value, _columnType) {
|
|
|
22
22
|
* @returns A function that deserializes a row into a normalized item data object
|
|
23
23
|
*/
|
|
24
24
|
export function useItemRowDeserializer(_ref) {
|
|
25
|
-
var
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
formatValue = defaultFormatValue
|
|
32
|
-
} = _ref;
|
|
25
|
+
var table = _ref.table,
|
|
26
|
+
descriptionColumnName = _ref.descriptionColumnName,
|
|
27
|
+
iconColumnName = _ref.iconColumnName,
|
|
28
|
+
keyColumnName = _ref.keyColumnName,
|
|
29
|
+
labelColumnName = _ref.labelColumnName,
|
|
30
|
+
_ref$formatValue = _ref.formatValue,
|
|
31
|
+
formatValue = _ref$formatValue === void 0 ? defaultFormatValue : _ref$formatValue;
|
|
33
32
|
var keyColumn = useMemo(() => table == null ? null : getItemKeyColumn(table, keyColumnName), [keyColumnName, table]);
|
|
34
33
|
var labelColumn = useMemo(() => table == null || keyColumn == null ? null : getItemLabelColumn(table, keyColumn, labelColumnName), [keyColumn, labelColumnName, table]);
|
|
35
34
|
var descriptionColumn = useMemo(() => table == null || descriptionColumnName == null ? null : table.findColumn(descriptionColumnName), [descriptionColumnName, table]);
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"useItemRowDeserializer.js","names":["useCallback","useMemo","assertNotNull","getItemKeyColumn","getItemLabelColumn","defaultFormatKey","value","String","defaultFormatValue","_columnType","useItemRowDeserializer","_ref","table","descriptionColumnName","iconColumnName","keyColumnName","labelColumnName","_ref$formatValue","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":"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","ignoreList":[]}
|