@deephaven/jsapi-components 0.73.1-beta.0 → 0.74.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.
@@ -1 +1 @@
1
- {"version":3,"file":"TableDropdown.d.ts","sourceRoot":"","sources":["../src/TableDropdown.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAoBtD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,gGAAgG;IAChG,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC;IAErB,0GAA0G;IAC1G,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC;IAEvB,wDAAwD;IACxD,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAEnC,mCAAmC;IACnC,MAAM,CAAC,EAAE,SAAS,MAAM,CAAC,eAAe,EAAE,CAAC;IAE3C,mCAAmC;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,wDAAwD;IACxD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IAEzC,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,KAAK,EACL,MAAoB,EACpB,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,SAAS,EACT,WAAgC,EAChC,OAAc,GACf,EAAE,kBAAkB,GAAG,GAAG,CAAC,OAAO,CAuElC;AAED,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"TableDropdown.d.ts","sourceRoot":"","sources":["../src/TableDropdown.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAoBtD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,gGAAgG;IAChG,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC;IAErB,0GAA0G;IAC1G,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC;IAEvB,wDAAwD;IACxD,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAEnC,mCAAmC;IACnC,MAAM,CAAC,EAAE,SAAS,MAAM,CAAC,eAAe,EAAE,CAAC;IAE3C,mCAAmC;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,wDAAwD;IACxD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IAEzC,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,KAAK,EACL,MAAoB,EACpB,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,SAAS,EACT,WAAgC,EAChC,OAAc,GACf,EAAE,kBAAkB,GAAG,GAAG,CAAC,OAAO,CA0ElC;AAED,eAAe,aAAa,CAAC"}
@@ -39,7 +39,13 @@ export function TableDropdown(_ref) {
39
39
  var {
40
40
  detail
41
41
  } = event;
42
- var newValues = detail.rows.map(row => row.get(tableColumn));
42
+ // Core JSAPI returns undefined for null table values,
43
+ // coalesce with null to differentiate null from no selection in the dropdown
44
+ // https://github.com/deephaven/deephaven-core/issues/5400
45
+ var newValues = detail.rows.map(row => {
46
+ var _row$get;
47
+ return (_row$get = row.get(tableColumn)) !== null && _row$get !== void 0 ? _row$get : null;
48
+ });
43
49
  setValues(newValues);
44
50
  });
45
51
  return () => {
@@ -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","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 { 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: CustomEvent<DhType.ViewportData>) => {\n const { detail } = event;\n const newValues = detail.rows.map(row => row.get(tableColumn));\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":"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,IAVN;IAC5BC,MAAM;IACNC,KAAK;IACLC,MAAM,GAAGZ,WAAW;IACpBa,QAAQ;IACRC,aAAa;IACbC,QAAQ;IACRC,SAAS;IACTC,WAAW,GAAGX,kBAAkB;IAChCY,OAAO,GAAG;EACQ,CAAC,GAAAT,IAAA;EACnB,IAAMU,EAAE,GAAGpB,MAAM,CAAC,CAAC;EACnB,IAAM,CAACqB,MAAM,EAAEC,SAAS,CAAC,GAAGzB,QAAQ,CAAY,EAAE,CAAC;EAEnDF,SAAS,CAAC,MAAM;IACd,IAAIiB,KAAK,IAAI,IAAI,EAAE;MACjBU,SAAS,CAAC,EAAE,CAAC;MACb,OAAOC,SAAS;IAClB;IAEA,IAAMC,WAAW,GAAGb,MAAM,aAANA,MAAM,cAANA,MAAM,GAAIC,KAAK,CAACa,OAAO,CAAC,CAAC,CAAC;IAC9C;IACAb,KAAK,CAACc,WAAW,CAACb,MAAkC,CAAC;IACrD,IAAMc,YAAY,GAAGf,KAAK,CAACgB,WAAW,CAAC,CAAC,EAAET,OAAO,EAAE,CAACK,WAAW,CAAC,CAAC;IAEjEG,YAAY,CAACE,gBAAgB,CAC3BT,EAAE,CAACU,KAAK,CAACC,aAAa,EACrBC,KAAuC,IAAK;MAC3C,IAAM;QAAEC;MAAO,CAAC,GAAGD,KAAK;MACxB,IAAME,SAAS,GAAGD,MAAM,CAACE,IAAI,CAACC,GAAG,CAACC,GAAG,IAAIA,GAAG,CAACC,GAAG,CAACd,WAAW,CAAC,CAAC;MAC9DF,SAAS,CAACY,SAAS,CAAC;IACtB,CACF,CAAC;IAED,OAAO,MAAM;MACXP,YAAY,CAACY,KAAK,CAAC,CAAC;IACtB,CAAC;EACH,CAAC,EAAE,CAAC5B,MAAM,EAAES,EAAE,EAAEP,MAAM,EAAEM,OAAO,EAAEP,KAAK,CAAC,CAAC;;EAExC;EACA,IAAM4B,SAAS,GAAG5C,OAAO,CAAC,MAAM;IAC9B,IAAImB,aAAa,KAAKQ,SAAS,EAAE;MAC/B,OAAO,CAACA,SAAS,EAAE,GAAGF,MAAM,CAAC;IAC/B;IACA,OAAOA,MAAM;EACf,CAAC,EAAE,CAACN,aAAa,EAAEM,MAAM,CAAC,CAAC;;EAE3B;EACA,IAAMoB,aAAa,GAAG7C,OAAO;EAC3B;EACA,MACE4C,SAAS,CAACE,SAAS,CACjBrC,KAAK,IACHA,KAAK,KAAKU,aAAa,IACtBX,YAAY,CAACC,KAAK,CAAC,IAAIA,KAAK,CAACC,MAAM,CAACS,aAAa,CACtD,CAAC,EACH,CAACA,aAAa,EAAEyB,SAAS,CAC3B,CAAC;EAED,IAAMG,YAAY,GAAGjD,WAAW,CAC9BkD,gBAAgB,IAAI;IAClB9B,QAAQ,CAAC0B,SAAS,CAACI,gBAAgB,CAAC,CAAC;EACvC,CAAC,EACD,CAAC9B,QAAQ,EAAE0B,SAAS,CACtB,CAAC;EAED,oBACErC,IAAA,CAACJ,MAAM;IACLkB,SAAS,EAAEA,SAAU;IACrBZ,KAAK,EAAEoC,aAAc;IACrB3B,QAAQ,EAAE6B,YAAa;IACvB3B,QAAQ,EAAEA,QAAS;IAAA6B,QAAA,EAElBL,SAAS,CAACJ,GAAG,CAAC,CAAC/B,KAAK,EAAEyC,CAAC;IAAA;IACtB;IACA3C,IAAA,CAACL,MAAM;MAAcO,KAAK,EAAEyC,CAAE;MAAAD,QAAA,EAC3B3B,WAAW,CAACb,KAAK;IAAC,MAAAG,MAAA,CADLsC,CAAC,CAET,CACT;EAAC,CACI,CAAC;AAEb;AAEA,eAAerC,aAAa"}
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 { 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: CustomEvent<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,13 +1,13 @@
1
1
  /// <reference types="react" />
2
- import { PickerProps as PickerPropsBase } from '@deephaven/components';
2
+ import { PickerProps as PickerBaseProps } from '@deephaven/components';
3
3
  import { dh as DhType } from '@deephaven/jsapi-types';
4
4
  import { Settings } from '@deephaven/jsapi-utils';
5
- export interface PickerProps extends Omit<PickerPropsBase, 'children'> {
5
+ export interface PickerProps extends Omit<PickerBaseProps, 'children'> {
6
6
  table: DhType.Table;
7
7
  keyColumn?: string;
8
8
  labelColumn?: string;
9
9
  settings?: Settings;
10
10
  }
11
- export declare function Picker({ table, keyColumn: keyColumnName, labelColumn: labelColumnName, selectedKey, settings, ...props }: PickerProps): JSX.Element;
11
+ export declare function Picker({ table, keyColumn: keyColumnName, labelColumn: labelColumnName, settings, onChange, onSelectionChange, ...props }: PickerProps): JSX.Element;
12
12
  export default Picker;
13
13
  //# sourceMappingURL=Picker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Picker.d.ts","sourceRoot":"","sources":["../../src/spectrum/Picker.tsx"],"names":[],"mappings":";AAAA,OAAO,EAGL,WAAW,IAAI,eAAe,EAC/B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAYlD,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC;IACpE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;IAEpB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,WAAW,CAAC,EAAE,MAAM,CAAC;IAIrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,wBAAgB,MAAM,CAAC,EACrB,KAAK,EACL,SAAS,EAAE,aAAa,EACxB,WAAW,EAAE,eAAe,EAC5B,WAAW,EACX,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,WAAW,GAAG,GAAG,CAAC,OAAO,CA6E3B;AAED,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"Picker.d.ts","sourceRoot":"","sources":["../../src/spectrum/Picker.tsx"],"names":[],"mappings":";AACA,OAAO,EAOL,WAAW,IAAI,eAAe,EAE/B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAWlD,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC;IACpE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;IAEpB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,WAAW,CAAC,EAAE,MAAM,CAAC;IAIrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,wBAAgB,MAAM,CAAC,EACrB,KAAK,EACL,SAAS,EAAE,aAAa,EACxB,WAAW,EAAE,eAAe,EAC5B,QAAQ,EACR,QAAQ,EACR,iBAAiB,EACjB,GAAG,KAAK,EACT,EAAE,WAAW,GAAG,GAAG,CAAC,OAAO,CAwG3B;AAED,eAAe,MAAM,CAAC"}
@@ -1,4 +1,4 @@
1
- var _excluded = ["table", "keyColumn", "labelColumn", "selectedKey", "settings"];
1
+ var _excluded = ["table", "keyColumn", "labelColumn", "settings", "onChange", "onSelectionChange"];
2
2
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
3
3
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
4
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
@@ -8,10 +8,10 @@ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try
8
8
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
9
9
  function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
10
10
  function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
11
- import { Picker as PickerBase } from '@deephaven/components';
11
+ import { useCallback, useEffect, useMemo, useState } from 'react';
12
+ import { PickerNormalized, useSpectrumThemeProvider } from '@deephaven/components';
12
13
  import Log from '@deephaven/log';
13
- import { PICKER_ITEM_HEIGHT, PICKER_TOP_OFFSET } from '@deephaven/utils';
14
- import { useCallback, useEffect, useMemo } from 'react';
14
+ import { PICKER_ITEM_HEIGHTS, PICKER_TOP_OFFSET } from '@deephaven/utils';
15
15
  import useFormatter from "../useFormatter.js";
16
16
  import useGetItemIndexByValue from "../useGetItemIndexByValue.js";
17
17
  import { useViewportData } from "../useViewportData.js";
@@ -24,13 +24,23 @@ export function Picker(_ref) {
24
24
  table,
25
25
  keyColumn: keyColumnName,
26
26
  labelColumn: labelColumnName,
27
- selectedKey,
28
- settings
27
+ settings,
28
+ onChange,
29
+ onSelectionChange
29
30
  } = _ref,
30
31
  props = _objectWithoutProperties(_ref, _excluded);
32
+ var {
33
+ scale
34
+ } = useSpectrumThemeProvider();
35
+ var itemHeight = PICKER_ITEM_HEIGHTS[scale];
31
36
  var {
32
37
  getFormattedString: formatValue
33
38
  } = useFormatter(settings);
39
+
40
+ // `null` is a valid value for `selectedKey` in controlled mode, so we check
41
+ // for explicit `undefined` to identify uncontrolled mode.
42
+ var isUncontrolled = props.selectedKey === undefined;
43
+ var [uncontrolledSelectedKey, setUncontrolledSelectedKey] = useState(props.defaultSelectedKey);
34
44
  var keyColumn = useMemo(() => getItemKeyColumn(table, keyColumnName), [keyColumnName, table]);
35
45
  var deserializeRow = useItemRowDeserializer({
36
46
  table,
@@ -41,15 +51,15 @@ export function Picker(_ref) {
41
51
  var getItemIndexByValue = useGetItemIndexByValue({
42
52
  table,
43
53
  columnName: keyColumn.name,
44
- value: selectedKey
54
+ value: isUncontrolled ? uncontrolledSelectedKey : props.selectedKey
45
55
  });
46
56
  var getInitialScrollPosition = useCallback( /*#__PURE__*/_asyncToGenerator(function* () {
47
57
  var index = yield getItemIndexByValue();
48
58
  if (index == null) {
49
59
  return null;
50
60
  }
51
- return index * PICKER_ITEM_HEIGHT + PICKER_TOP_OFFSET;
52
- }), [getItemIndexByValue]);
61
+ return index * itemHeight + PICKER_TOP_OFFSET;
62
+ }), [getItemIndexByValue, itemHeight]);
53
63
  var {
54
64
  viewportData,
55
65
  onScroll,
@@ -57,9 +67,10 @@ export function Picker(_ref) {
57
67
  } = useViewportData({
58
68
  reuseItemsOnTableResize: true,
59
69
  table,
60
- itemHeight: PICKER_ITEM_HEIGHT,
70
+ itemHeight,
61
71
  deserializeRow
62
72
  });
73
+ var normalizedItems = viewportData.items;
63
74
  useEffect(
64
75
  // Set viewport to include the selected item so that its data will load and
65
76
  // the real `key` will be available to show the selection in the UI.
@@ -77,13 +88,22 @@ export function Picker(_ref) {
77
88
  isCanceled = true;
78
89
  };
79
90
  }, [getItemIndexByValue, settings, setViewport]);
80
- return /*#__PURE__*/_jsx(PickerBase
91
+ var onSelectionChangeInternal = useCallback(key => {
92
+ var _ref3;
93
+ // If our component is uncontrolled, track the selected key internally
94
+ // so that we can scroll to the selected item if the user re-opens
95
+ if (isUncontrolled) {
96
+ setUncontrolledSelectedKey(key);
97
+ }
98
+ (_ref3 = onChange !== null && onChange !== void 0 ? onChange : onSelectionChange) === null || _ref3 === void 0 ? void 0 : _ref3(key);
99
+ }, [isUncontrolled, onChange, onSelectionChange]);
100
+ return /*#__PURE__*/_jsx(PickerNormalized
81
101
  // eslint-disable-next-line react/jsx-props-no-spreading
82
102
  , _objectSpread(_objectSpread({}, props), {}, {
103
+ normalizedItems: normalizedItems,
83
104
  getInitialScrollPosition: getInitialScrollPosition,
84
- selectedKey: selectedKey,
85
- onScroll: onScroll,
86
- children: viewportData.items
105
+ onChange: onSelectionChangeInternal,
106
+ onScroll: onScroll
87
107
  }));
88
108
  }
89
109
  export default Picker;
@@ -1 +1 @@
1
- {"version":3,"file":"Picker.js","names":["Picker","PickerBase","Log","PICKER_ITEM_HEIGHT","PICKER_TOP_OFFSET","useCallback","useEffect","useMemo","useFormatter","useGetItemIndexByValue","useViewportData","getItemKeyColumn","useItemRowDeserializer","jsx","_jsx","log","module","_ref","table","keyColumn","keyColumnName","labelColumn","labelColumnName","selectedKey","settings","props","_objectWithoutProperties","_excluded","getFormattedString","formatValue","deserializeRow","getItemIndexByValue","columnName","name","value","getInitialScrollPosition","_asyncToGenerator","index","viewportData","onScroll","setViewport","reuseItemsOnTableResize","itemHeight","setViewportFromSelectedKey","isCanceled","then","catch","err","error","_objectSpread","children","items"],"sources":["../../src/spectrum/Picker.tsx"],"sourcesContent":["import {\n NormalizedItemData,\n Picker as PickerBase,\n PickerProps as PickerPropsBase,\n} from '@deephaven/components';\nimport { dh as DhType } from '@deephaven/jsapi-types';\nimport { Settings } from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport { PICKER_ITEM_HEIGHT, PICKER_TOP_OFFSET } from '@deephaven/utils';\nimport { useCallback, useEffect, useMemo } from 'react';\nimport useFormatter from '../useFormatter';\nimport useGetItemIndexByValue from '../useGetItemIndexByValue';\nimport { useViewportData } from '../useViewportData';\nimport { getItemKeyColumn } from './utils/itemUtils';\nimport { useItemRowDeserializer } from './utils/useItemRowDeserializer';\n\nconst log = Log.module('jsapi-components.Picker');\n\nexport interface PickerProps extends Omit<PickerPropsBase, 'children'> {\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 // TODO #1890 : descriptionColumn, iconColumn\n\n settings?: Settings;\n}\n\nexport function Picker({\n table,\n keyColumn: keyColumnName,\n labelColumn: labelColumnName,\n selectedKey,\n settings,\n ...props\n}: PickerProps): JSX.Element {\n const { getFormattedString: formatValue } = useFormatter(settings);\n\n const keyColumn = useMemo(\n () => getItemKeyColumn(table, keyColumnName),\n [keyColumnName, table]\n );\n\n const deserializeRow = useItemRowDeserializer({\n table,\n keyColumnName,\n labelColumnName,\n formatValue,\n });\n\n const getItemIndexByValue = useGetItemIndexByValue({\n table,\n columnName: keyColumn.name,\n value: 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 * PICKER_ITEM_HEIGHT + PICKER_TOP_OFFSET;\n }, [getItemIndexByValue]);\n\n const { viewportData, onScroll, setViewport } = useViewportData<\n NormalizedItemData,\n DhType.Table\n >({\n reuseItemsOnTableResize: true,\n table,\n itemHeight: PICKER_ITEM_HEIGHT,\n deserializeRow,\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 return (\n <PickerBase\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...props}\n getInitialScrollPosition={getInitialScrollPosition}\n selectedKey={selectedKey}\n onScroll={onScroll}\n >\n {viewportData.items}\n </PickerBase>\n );\n}\n\nexport default Picker;\n"],"mappings":";;;;;;;;;;AAAA,SAEEA,MAAM,IAAIC,UAAU,QAEf,uBAAuB;AAG9B,OAAOC,GAAG,MAAM,gBAAgB;AAChC,SAASC,kBAAkB,EAAEC,iBAAiB,QAAQ,kBAAkB;AACxE,SAASC,WAAW,EAAEC,SAAS,EAAEC,OAAO,QAAQ,OAAO;AAAC,OACjDC,YAAY;AAAA,OACZC,sBAAsB;AAAA,SACpBC,eAAe;AAAA,SACfC,gBAAgB;AAAA,SAChBC,sBAAsB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAE/B,IAAMC,GAAG,GAAGb,GAAG,CAACc,MAAM,CAAC,yBAAyB,CAAC;AAcjD,OAAO,SAAShB,MAAMA,CAAAiB,IAAA,EAOO;EAAA,IAPN;MACrBC,KAAK;MACLC,SAAS,EAAEC,aAAa;MACxBC,WAAW,EAAEC,eAAe;MAC5BC,WAAW;MACXC;IAEW,CAAC,GAAAP,IAAA;IADTQ,KAAK,GAAAC,wBAAA,CAAAT,IAAA,EAAAU,SAAA;EAER,IAAM;IAAEC,kBAAkB,EAAEC;EAAY,CAAC,GAAGrB,YAAY,CAACgB,QAAQ,CAAC;EAElE,IAAML,SAAS,GAAGZ,OAAO,CACvB,MAAMI,gBAAgB,CAACO,KAAK,EAAEE,aAAa,CAAC,EAC5C,CAACA,aAAa,EAAEF,KAAK,CACvB,CAAC;EAED,IAAMY,cAAc,GAAGlB,sBAAsB,CAAC;IAC5CM,KAAK;IACLE,aAAa;IACbE,eAAe;IACfO;EACF,CAAC,CAAC;EAEF,IAAME,mBAAmB,GAAGtB,sBAAsB,CAAC;IACjDS,KAAK;IACLc,UAAU,EAAEb,SAAS,CAACc,IAAI;IAC1BC,KAAK,EAAEX;EACT,CAAC,CAAC;EAEF,IAAMY,wBAAwB,GAAG9B,WAAW,eAAA+B,iBAAA,CAAC,aAAY;IACvD,IAAMC,KAAK,SAASN,mBAAmB,CAAC,CAAC;IAEzC,IAAIM,KAAK,IAAI,IAAI,EAAE;MACjB,OAAO,IAAI;IACb;IAEA,OAAOA,KAAK,GAAGlC,kBAAkB,GAAGC,iBAAiB;EACvD,CAAC,GAAE,CAAC2B,mBAAmB,CAAC,CAAC;EAEzB,IAAM;IAAEO,YAAY;IAAEC,QAAQ;IAAEC;EAAY,CAAC,GAAG9B,eAAe,CAG7D;IACA+B,uBAAuB,EAAE,IAAI;IAC7BvB,KAAK;IACLwB,UAAU,EAAEvC,kBAAkB;IAC9B2B;EACF,CAAC,CAAC;EAEFxB,SAAS;EACP;EACA;EACA,SAASqC,0BAA0BA,CAAA,EAAG;IACpC,IAAIC,UAAU,GAAG,KAAK;IAEtBb,mBAAmB,CAAC,CAAC,CAClBc,IAAI,CAACR,KAAK,IAAI;MACb,IAAIA,KAAK,IAAI,IAAI,IAAIO,UAAU,EAAE;QAC/B;MACF;MAEAJ,WAAW,CAACH,KAAK,CAAC;IACpB,CAAC,CAAC,CACDS,KAAK,CAACC,GAAG,IAAI;MACZhC,GAAG,CAACiC,KAAK,CAAC,0CAA0C,EAAED,GAAG,CAAC;IAC5D,CAAC,CAAC;IAEJ,OAAO,MAAM;MACXH,UAAU,GAAG,IAAI;IACnB,CAAC;EACH,CAAC,EACD,CAACb,mBAAmB,EAAEP,QAAQ,EAAEgB,WAAW,CAC7C,CAAC;EAED,oBACE1B,IAAA,CAACb;EACC;EAAA,EAAAgD,aAAA,CAAAA,aAAA,KACIxB,KAAK;IACTU,wBAAwB,EAAEA,wBAAyB;IACnDZ,WAAW,EAAEA,WAAY;IACzBgB,QAAQ,EAAEA,QAAS;IAAAW,QAAA,EAElBZ,YAAY,CAACa;EAAK,EACT,CAAC;AAEjB;AAEA,eAAenD,MAAM"}
1
+ {"version":3,"file":"Picker.js","names":["useCallback","useEffect","useMemo","useState","PickerNormalized","useSpectrumThemeProvider","Log","PICKER_ITEM_HEIGHTS","PICKER_TOP_OFFSET","useFormatter","useGetItemIndexByValue","useViewportData","getItemKeyColumn","useItemRowDeserializer","jsx","_jsx","log","module","Picker","_ref","table","keyColumn","keyColumnName","labelColumn","labelColumnName","settings","onChange","onSelectionChange","props","_objectWithoutProperties","_excluded","scale","itemHeight","getFormattedString","formatValue","isUncontrolled","selectedKey","undefined","uncontrolledSelectedKey","setUncontrolledSelectedKey","defaultSelectedKey","deserializeRow","getItemIndexByValue","columnName","name","value","getInitialScrollPosition","_asyncToGenerator","index","viewportData","onScroll","setViewport","reuseItemsOnTableResize","normalizedItems","items","setViewportFromSelectedKey","isCanceled","then","catch","err","error","onSelectionChangeInternal","key","_ref3","_objectSpread"],"sources":["../../src/spectrum/Picker.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n ItemKey,\n NormalizedItem,\n NormalizedItemData,\n NormalizedSection,\n NormalizedSectionData,\n PickerNormalized,\n PickerProps as PickerBaseProps,\n useSpectrumThemeProvider,\n} from '@deephaven/components';\nimport { dh as DhType } from '@deephaven/jsapi-types';\nimport { Settings } from '@deephaven/jsapi-utils';\nimport Log from '@deephaven/log';\nimport { PICKER_ITEM_HEIGHTS, PICKER_TOP_OFFSET } from '@deephaven/utils';\nimport useFormatter from '../useFormatter';\nimport useGetItemIndexByValue from '../useGetItemIndexByValue';\nimport { useViewportData } from '../useViewportData';\nimport { getItemKeyColumn } from './utils/itemUtils';\nimport { useItemRowDeserializer } from './utils/useItemRowDeserializer';\n\nconst log = Log.module('jsapi-components.Picker');\n\nexport interface PickerProps extends Omit<PickerBaseProps, 'children'> {\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 // TODO #1890 : descriptionColumn, iconColumn\n\n settings?: Settings;\n}\n\nexport function Picker({\n table,\n keyColumn: keyColumnName,\n labelColumn: labelColumnName,\n settings,\n onChange,\n onSelectionChange,\n ...props\n}: PickerProps): JSX.Element {\n const { scale } = useSpectrumThemeProvider();\n const itemHeight = PICKER_ITEM_HEIGHTS[scale];\n\n const { getFormattedString: formatValue } = useFormatter(settings);\n\n // `null` is a valid value for `selectedKey` in controlled mode, so we check\n // for explicit `undefined` to identify uncontrolled mode.\n const isUncontrolled = props.selectedKey === undefined;\n const [uncontrolledSelectedKey, setUncontrolledSelectedKey] = useState(\n props.defaultSelectedKey\n );\n\n const keyColumn = useMemo(\n () => getItemKeyColumn(table, keyColumnName),\n [keyColumnName, table]\n );\n\n const deserializeRow = useItemRowDeserializer({\n table,\n keyColumnName,\n labelColumnName,\n formatValue,\n });\n\n const getItemIndexByValue = useGetItemIndexByValue({\n table,\n columnName: keyColumn.name,\n value: isUncontrolled ? uncontrolledSelectedKey : props.selectedKey,\n });\n\n const getInitialScrollPosition = useCallback(async () => {\n const index = await getItemIndexByValue();\n\n if (index == null) {\n return null;\n }\n\n return index * itemHeight + PICKER_TOP_OFFSET;\n }, [getItemIndexByValue, itemHeight]);\n\n const { viewportData, onScroll, setViewport } = useViewportData<\n NormalizedItemData | NormalizedSectionData,\n DhType.Table\n >({\n reuseItemsOnTableResize: true,\n table,\n itemHeight,\n deserializeRow,\n });\n\n const normalizedItems = viewportData.items as (\n | NormalizedItem\n | NormalizedSection\n )[];\n\n useEffect(\n // Set viewport to include the selected item so that its data will load and\n // the real `key` will be available to show the selection in the UI.\n function setViewportFromSelectedKey() {\n let isCanceled = false;\n\n getItemIndexByValue()\n .then(index => {\n if (index == null || isCanceled) {\n return;\n }\n\n setViewport(index);\n })\n .catch(err => {\n log.error('Error setting viewport from selected key', err);\n });\n\n return () => {\n isCanceled = true;\n };\n },\n [getItemIndexByValue, settings, setViewport]\n );\n\n const onSelectionChangeInternal = useCallback(\n (key: ItemKey): 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 <PickerNormalized\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...props}\n normalizedItems={normalizedItems}\n getInitialScrollPosition={getInitialScrollPosition}\n onChange={onSelectionChangeInternal}\n onScroll={onScroll}\n />\n );\n}\n\nexport default Picker;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useItemRowDeserializer.d.ts","sourceRoot":"","sources":["../../../src/spectrum/utils/useItemRowDeserializer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAmB5C;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,KAAK,EACL,aAAa,EACb,eAAe,EACf,WAAgC,GACjC,EAAE;IACD,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9D,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,kBAAkB,CAyBtC;AAED,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"useItemRowDeserializer.d.ts","sourceRoot":"","sources":["../../../src/spectrum/utils/useItemRowDeserializer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAmB5C;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,KAAK,EACL,aAAa,EACb,eAAe,EACf,WAAgC,GACjC,EAAE;IACD,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9D,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,kBAAkB,CA0BtC;AAED,eAAe,sBAAsB,CAAC"}
@@ -32,7 +32,8 @@ export function useItemRowDeserializer(_ref) {
32
32
  var content = formatValue(row.get(labelColumn), labelColumn.type);
33
33
  return {
34
34
  key,
35
- content
35
+ content,
36
+ textValue: content
36
37
  };
37
38
  }, [formatValue, keyColumn, labelColumn]);
38
39
  return deserializeRow;
@@ -1 +1 @@
1
- {"version":3,"file":"useItemRowDeserializer.js","names":["useCallback","useMemo","getItemKeyColumn","getItemLabelColumn","defaultFormatKey","value","String","defaultFormatValue","_columnType","useItemRowDeserializer","_ref","table","keyColumnName","labelColumnName","formatValue","keyColumn","labelColumn","deserializeRow","row","key","get","content","type"],"sources":["../../../src/spectrum/utils/useItemRowDeserializer.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport { NormalizedItemData } from '@deephaven/components';\nimport { dh } from '@deephaven/jsapi-types';\nimport { getItemKeyColumn, getItemLabelColumn } from './itemUtils';\n\nfunction defaultFormatKey(value: unknown): string | number | boolean {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return value;\n }\n\n return String(value);\n}\n\nfunction defaultFormatValue(value: unknown, _columnType: string): string {\n return String(value);\n}\n\n/**\n * Returns a function that deserializes a row into a normalized item data object.\n * @param table The table to get the key and label columns from\n * @param 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 keyColumnName,\n labelColumnName,\n formatValue = defaultFormatValue,\n}: {\n table: dh.Table;\n keyColumnName?: string;\n labelColumnName?: string;\n formatValue?: (value: unknown, columnType: string) => string;\n}): (row: dh.Row) => NormalizedItemData {\n const keyColumn = useMemo(\n () => getItemKeyColumn(table, keyColumnName),\n [keyColumnName, table]\n );\n\n const labelColumn = useMemo(\n () => getItemLabelColumn(table, keyColumn, labelColumnName),\n [keyColumn, labelColumnName, table]\n );\n\n const deserializeRow = useCallback(\n (row: dh.Row): NormalizedItemData => {\n const key = defaultFormatKey(row.get(keyColumn));\n const content = formatValue(row.get(labelColumn), labelColumn.type);\n\n return {\n key,\n content,\n };\n },\n [formatValue, keyColumn, labelColumn]\n );\n\n return deserializeRow;\n}\n\nexport default useItemRowDeserializer;\n"],"mappings":"AAAA,SAASA,WAAW,EAAEC,OAAO,QAAQ,OAAO;AAAC,SAGpCC,gBAAgB,EAAEC,kBAAkB;AAE7C,SAASC,gBAAgBA,CAACC,KAAc,EAA6B;EACnE,IACE,OAAOA,KAAK,KAAK,QAAQ,IACzB,OAAOA,KAAK,KAAK,QAAQ,IACzB,OAAOA,KAAK,KAAK,SAAS,EAC1B;IACA,OAAOA,KAAK;EACd;EAEA,OAAOC,MAAM,CAACD,KAAK,CAAC;AACtB;AAEA,SAASE,kBAAkBA,CAACF,KAAc,EAAEG,WAAmB,EAAU;EACvE,OAAOF,MAAM,CAACD,KAAK,CAAC;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASI,sBAAsBA,CAAAC,IAAA,EAUE;EAAA,IAVD;IACrCC,KAAK;IACLC,aAAa;IACbC,eAAe;IACfC,WAAW,GAAGP;EAMhB,CAAC,GAAAG,IAAA;EACC,IAAMK,SAAS,GAAGd,OAAO,CACvB,MAAMC,gBAAgB,CAACS,KAAK,EAAEC,aAAa,CAAC,EAC5C,CAACA,aAAa,EAAED,KAAK,CACvB,CAAC;EAED,IAAMK,WAAW,GAAGf,OAAO,CACzB,MAAME,kBAAkB,CAACQ,KAAK,EAAEI,SAAS,EAAEF,eAAe,CAAC,EAC3D,CAACE,SAAS,EAAEF,eAAe,EAAEF,KAAK,CACpC,CAAC;EAED,IAAMM,cAAc,GAAGjB,WAAW,CAC/BkB,GAAW,IAAyB;IACnC,IAAMC,GAAG,GAAGf,gBAAgB,CAACc,GAAG,CAACE,GAAG,CAACL,SAAS,CAAC,CAAC;IAChD,IAAMM,OAAO,GAAGP,WAAW,CAACI,GAAG,CAACE,GAAG,CAACJ,WAAW,CAAC,EAAEA,WAAW,CAACM,IAAI,CAAC;IAEnE,OAAO;MACLH,GAAG;MACHE;IACF,CAAC;EACH,CAAC,EACD,CAACP,WAAW,EAAEC,SAAS,EAAEC,WAAW,CACtC,CAAC;EAED,OAAOC,cAAc;AACvB;AAEA,eAAeR,sBAAsB"}
1
+ {"version":3,"file":"useItemRowDeserializer.js","names":["useCallback","useMemo","getItemKeyColumn","getItemLabelColumn","defaultFormatKey","value","String","defaultFormatValue","_columnType","useItemRowDeserializer","_ref","table","keyColumnName","labelColumnName","formatValue","keyColumn","labelColumn","deserializeRow","row","key","get","content","type","textValue"],"sources":["../../../src/spectrum/utils/useItemRowDeserializer.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport { NormalizedItemData } from '@deephaven/components';\nimport { dh } from '@deephaven/jsapi-types';\nimport { getItemKeyColumn, getItemLabelColumn } from './itemUtils';\n\nfunction defaultFormatKey(value: unknown): string | number | boolean {\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return value;\n }\n\n return String(value);\n}\n\nfunction defaultFormatValue(value: unknown, _columnType: string): string {\n return String(value);\n}\n\n/**\n * Returns a function that deserializes a row into a normalized item data object.\n * @param table The table to get the key and label columns from\n * @param 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 keyColumnName,\n labelColumnName,\n formatValue = defaultFormatValue,\n}: {\n table: dh.Table;\n keyColumnName?: string;\n labelColumnName?: string;\n formatValue?: (value: unknown, columnType: string) => string;\n}): (row: dh.Row) => NormalizedItemData {\n const keyColumn = useMemo(\n () => getItemKeyColumn(table, keyColumnName),\n [keyColumnName, table]\n );\n\n const labelColumn = useMemo(\n () => getItemLabelColumn(table, keyColumn, labelColumnName),\n [keyColumn, labelColumnName, table]\n );\n\n const deserializeRow = useCallback(\n (row: dh.Row): NormalizedItemData => {\n const key = defaultFormatKey(row.get(keyColumn));\n const content = formatValue(row.get(labelColumn), labelColumn.type);\n\n return {\n key,\n content,\n textValue: content,\n };\n },\n [formatValue, keyColumn, labelColumn]\n );\n\n return deserializeRow;\n}\n\nexport default useItemRowDeserializer;\n"],"mappings":"AAAA,SAASA,WAAW,EAAEC,OAAO,QAAQ,OAAO;AAAC,SAGpCC,gBAAgB,EAAEC,kBAAkB;AAE7C,SAASC,gBAAgBA,CAACC,KAAc,EAA6B;EACnE,IACE,OAAOA,KAAK,KAAK,QAAQ,IACzB,OAAOA,KAAK,KAAK,QAAQ,IACzB,OAAOA,KAAK,KAAK,SAAS,EAC1B;IACA,OAAOA,KAAK;EACd;EAEA,OAAOC,MAAM,CAACD,KAAK,CAAC;AACtB;AAEA,SAASE,kBAAkBA,CAACF,KAAc,EAAEG,WAAmB,EAAU;EACvE,OAAOF,MAAM,CAACD,KAAK,CAAC;AACtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASI,sBAAsBA,CAAAC,IAAA,EAUE;EAAA,IAVD;IACrCC,KAAK;IACLC,aAAa;IACbC,eAAe;IACfC,WAAW,GAAGP;EAMhB,CAAC,GAAAG,IAAA;EACC,IAAMK,SAAS,GAAGd,OAAO,CACvB,MAAMC,gBAAgB,CAACS,KAAK,EAAEC,aAAa,CAAC,EAC5C,CAACA,aAAa,EAAED,KAAK,CACvB,CAAC;EAED,IAAMK,WAAW,GAAGf,OAAO,CACzB,MAAME,kBAAkB,CAACQ,KAAK,EAAEI,SAAS,EAAEF,eAAe,CAAC,EAC3D,CAACE,SAAS,EAAEF,eAAe,EAAEF,KAAK,CACpC,CAAC;EAED,IAAMM,cAAc,GAAGjB,WAAW,CAC/BkB,GAAW,IAAyB;IACnC,IAAMC,GAAG,GAAGf,gBAAgB,CAACc,GAAG,CAACE,GAAG,CAACL,SAAS,CAAC,CAAC;IAChD,IAAMM,OAAO,GAAGP,WAAW,CAACI,GAAG,CAACE,GAAG,CAACJ,WAAW,CAAC,EAAEA,WAAW,CAACM,IAAI,CAAC;IAEnE,OAAO;MACLH,GAAG;MACHE,OAAO;MACPE,SAAS,EAAEF;IACb,CAAC;EACH,CAAC,EACD,CAACP,WAAW,EAAEC,SAAS,EAAEC,WAAW,CACtC,CAAC;EAED,OAAOC,cAAc;AACvB;AAEA,eAAeR,sBAAsB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deephaven/jsapi-components",
3
- "version": "0.73.1-beta.0+111ea64c",
3
+ "version": "0.74.1-beta.1+5f497611",
4
4
  "description": "Deephaven JSAPI Components",
5
5
  "author": "Deephaven Data Labs LLC",
6
6
  "license": "Apache-2.0",
@@ -22,13 +22,13 @@
22
22
  "build:sass": "sass --embed-sources --load-path=../../node_modules ./src:./dist"
23
23
  },
24
24
  "dependencies": {
25
- "@deephaven/components": "^0.73.1-beta.0+111ea64c",
26
- "@deephaven/jsapi-bootstrap": "^0.73.1-beta.0+111ea64c",
25
+ "@deephaven/components": "^0.74.1-beta.1+5f497611",
26
+ "@deephaven/jsapi-bootstrap": "^0.74.1-beta.1+5f497611",
27
27
  "@deephaven/jsapi-types": "1.0.0-dev0.33.1",
28
- "@deephaven/jsapi-utils": "^0.73.1-beta.0+111ea64c",
29
- "@deephaven/log": "^0.73.1-beta.0+111ea64c",
30
- "@deephaven/react-hooks": "^0.73.1-beta.0+111ea64c",
31
- "@deephaven/utils": "^0.73.1-beta.0+111ea64c",
28
+ "@deephaven/jsapi-utils": "^0.74.1-beta.1+5f497611",
29
+ "@deephaven/log": "^0.74.1-beta.1+5f497611",
30
+ "@deephaven/react-hooks": "^0.74.1-beta.1+5f497611",
31
+ "@deephaven/utils": "^0.74.1-beta.1+5f497611",
32
32
  "@types/js-cookie": "^3.0.3",
33
33
  "classnames": "^2.3.2",
34
34
  "js-cookie": "^3.0.5",
@@ -36,7 +36,7 @@
36
36
  "prop-types": "^15.8.1"
37
37
  },
38
38
  "devDependencies": {
39
- "@deephaven/jsapi-shim": "^0.73.1-beta.0+111ea64c",
39
+ "@deephaven/jsapi-shim": "^0.74.1-beta.1+5f497611",
40
40
  "react-test-renderer": "^17.0.2"
41
41
  },
42
42
  "peerDependencies": {
@@ -51,5 +51,5 @@
51
51
  "publishConfig": {
52
52
  "access": "public"
53
53
  },
54
- "gitHead": "111ea64c675190995f85789ce57ea055b8b7fd2b"
54
+ "gitHead": "5f4976115bfc016e6d9cbe9fd77413c3fd8f8353"
55
55
  }