@vuu-ui/vuu-ui-controls 0.8.94 → 0.8.96

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/cjs/index.js +3 -2
  2. package/cjs/index.js.map +1 -1
  3. package/cjs/instrument-picker/TablePicker.css.js +6 -0
  4. package/cjs/instrument-picker/TablePicker.css.js.map +1 -0
  5. package/cjs/instrument-picker/TablePicker.js +121 -0
  6. package/cjs/instrument-picker/TablePicker.js.map +1 -0
  7. package/cjs/instrument-picker/useTablePicker.js +150 -0
  8. package/cjs/instrument-picker/useTablePicker.js.map +1 -0
  9. package/cjs/measured-container/useMeasuredContainer.js +21 -11
  10. package/cjs/measured-container/useMeasuredContainer.js.map +1 -1
  11. package/cjs/vuu-typeahead-input/useVuuTypeahead.js +3 -1
  12. package/cjs/vuu-typeahead-input/useVuuTypeahead.js.map +1 -1
  13. package/esm/index.js +2 -2
  14. package/esm/instrument-picker/TablePicker.css.js +4 -0
  15. package/esm/instrument-picker/TablePicker.css.js.map +1 -0
  16. package/esm/instrument-picker/TablePicker.js +119 -0
  17. package/esm/instrument-picker/TablePicker.js.map +1 -0
  18. package/esm/instrument-picker/useTablePicker.js +148 -0
  19. package/esm/instrument-picker/useTablePicker.js.map +1 -0
  20. package/esm/measured-container/useMeasuredContainer.js +21 -12
  21. package/esm/measured-container/useMeasuredContainer.js.map +1 -1
  22. package/esm/vuu-typeahead-input/useVuuTypeahead.js +3 -1
  23. package/esm/vuu-typeahead-input/useVuuTypeahead.js.map +1 -1
  24. package/package.json +7 -7
  25. package/types/instrument-picker/TablePicker.d.ts +10 -0
  26. package/types/instrument-picker/index.d.ts +1 -1
  27. package/types/instrument-picker/useTablePicker.d.ts +54 -0
  28. package/types/measured-container/useMeasuredContainer.d.ts +1 -0
  29. package/cjs/instrument-picker/InstrumentPicker.css.js +0 -6
  30. package/cjs/instrument-picker/InstrumentPicker.css.js.map +0 -1
  31. package/cjs/instrument-picker/InstrumentPicker.js +0 -111
  32. package/cjs/instrument-picker/InstrumentPicker.js.map +0 -1
  33. package/cjs/instrument-picker/SearchCell.css.js +0 -6
  34. package/cjs/instrument-picker/SearchCell.css.js.map +0 -1
  35. package/cjs/instrument-picker/SearchCell.js +0 -33
  36. package/cjs/instrument-picker/SearchCell.js.map +0 -1
  37. package/cjs/instrument-picker/useInstrumentPicker.js +0 -87
  38. package/cjs/instrument-picker/useInstrumentPicker.js.map +0 -1
  39. package/esm/instrument-picker/InstrumentPicker.css.js +0 -4
  40. package/esm/instrument-picker/InstrumentPicker.css.js.map +0 -1
  41. package/esm/instrument-picker/InstrumentPicker.js +0 -109
  42. package/esm/instrument-picker/InstrumentPicker.js.map +0 -1
  43. package/esm/instrument-picker/SearchCell.css.js +0 -4
  44. package/esm/instrument-picker/SearchCell.css.js.map +0 -1
  45. package/esm/instrument-picker/SearchCell.js +0 -31
  46. package/esm/instrument-picker/SearchCell.js.map +0 -1
  47. package/esm/instrument-picker/useInstrumentPicker.js +0 -85
  48. package/esm/instrument-picker/useInstrumentPicker.js.map +0 -1
  49. package/types/instrument-picker/InstrumentPicker.d.ts +0 -24
  50. package/types/instrument-picker/useInstrumentPicker.d.ts +0 -28
package/cjs/index.js CHANGED
@@ -30,7 +30,7 @@ var EditableLabel = require('./editable-label/EditableLabel.js');
30
30
  var ExpandoInput = require('./expando-input/ExpandoInput.js');
31
31
  var Icon = require('./icon-button/Icon.js');
32
32
  var IconButton = require('./icon-button/IconButton.js');
33
- var InstrumentPicker = require('./instrument-picker/InstrumentPicker.js');
33
+ var TablePicker = require('./instrument-picker/TablePicker.js');
34
34
  var InstrumentSearch = require('./instrument-search/InstrumentSearch.js');
35
35
  var keyUtils = require('./list/common-hooks/keyUtils.js');
36
36
  var useCollapsibleGroups = require('./list/common-hooks/useCollapsibleGroups.js');
@@ -136,7 +136,7 @@ exports.NullEditAPI = EditableLabel.NullEditAPI;
136
136
  exports.ExpandoInput = ExpandoInput.ExpandoInput;
137
137
  exports.Icon = Icon.Icon;
138
138
  exports.IconButton = IconButton.IconButton;
139
- exports.InstrumentPicker = InstrumentPicker.InstrumentPicker;
139
+ exports.TablePicker = TablePicker.TablePicker;
140
140
  exports.InstrumentSearch = InstrumentSearch.InstrumentSearch;
141
141
  exports.ArrowDown = keyUtils.ArrowDown;
142
142
  exports.ArrowLeft = keyUtils.ArrowLeft;
@@ -193,6 +193,7 @@ exports.ListItemGroup = ListItemGroup.ListItemGroup;
193
193
  exports.useList = useList.useList;
194
194
  exports.RadioIcon = RadioIcon.RadioIcon;
195
195
  exports.MeasuredContainer = MeasuredContainer.MeasuredContainer;
196
+ exports.reduceSizeHeight = useMeasuredContainer.reduceSizeHeight;
196
197
  exports.useMeasuredContainer = useMeasuredContainer.useMeasuredContainer;
197
198
  exports.OverflowContainer = OverflowContainer.OverflowContainer;
198
199
  exports.NO_WRAPPED_ITEMS = overflowUtils.NO_WRAPPED_ITEMS;
package/cjs/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ var tablePickerCss = ".vuuTablePicker {\n border-radius: 6px;\n height: var(--salt-size-base);\n padding: 1px;\n box-sizing: content-box;\n}\n\n.vuuTablePicker-floating-table {\n border: solid 1px var(--salt-container-secondary-borderColor);\n border-radius: 4px;\n overflow: auto;\n padding: var(--salt-spacing-100) 0;\n z-index: var(--salt-zIndex-popout);\n}\n";
4
+
5
+ module.exports = tablePickerCss;
6
+ //# sourceMappingURL=TablePicker.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TablePicker.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,121 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var vuuTable = require('@vuu-ui/vuu-table');
5
+ var core = require('@salt-ds/core');
6
+ var styles = require('@salt-ds/styles');
7
+ var window = require('@salt-ds/window');
8
+ var cx = require('clsx');
9
+ var React = require('react');
10
+ var IconButton = require('../icon-button/IconButton.js');
11
+ var TablePicker$1 = require('./TablePicker.css.js');
12
+ var useTablePicker = require('./useTablePicker.js');
13
+
14
+ const classBase = "vuuTablePicker";
15
+ const FloatingTable = React.forwardRef(
16
+ function FloatingTable2({ children, className, collapsed, open, ...props }, forwardedRef) {
17
+ const { Component: FloatingComponent } = core.useFloatingComponent();
18
+ return /* @__PURE__ */ jsxRuntime.jsx(
19
+ FloatingComponent,
20
+ {
21
+ className: cx(
22
+ `${classBase}-floating-table`,
23
+ {
24
+ [`${classBase}-collapsed`]: collapsed
25
+ },
26
+ className
27
+ ),
28
+ role: "listbox",
29
+ open,
30
+ ...props,
31
+ ref: forwardedRef,
32
+ children
33
+ }
34
+ );
35
+ }
36
+ );
37
+ const TablePicker = ({
38
+ TableProps,
39
+ onSelect,
40
+ rowToString,
41
+ schema,
42
+ searchColumns,
43
+ ...htmlAttributes
44
+ }) => {
45
+ const targetWindow = window.useWindow();
46
+ styles.useComponentCssInjection({
47
+ testId: "vuu-table-picker",
48
+ css: TablePicker$1,
49
+ window: targetWindow
50
+ });
51
+ const tableId = core.useIdMemo();
52
+ const {
53
+ containerRef,
54
+ dataSource,
55
+ highlightedIndex,
56
+ floatingUIProps: { x, y, strategy, floating, reference },
57
+ inputProps,
58
+ interactionPropGetters: { getFloatingProps, getReferenceProps },
59
+ onKeyDown,
60
+ open,
61
+ tableConfig,
62
+ tableHandlers,
63
+ tableRef,
64
+ value,
65
+ width
66
+ } = useTablePicker.useTablePicker({
67
+ TableProps,
68
+ rowToString,
69
+ onSelect,
70
+ schema,
71
+ searchColumns
72
+ });
73
+ const endAdornment = React.useMemo(
74
+ () => /* @__PURE__ */ jsxRuntime.jsx(
75
+ IconButton.IconButton,
76
+ {
77
+ ...getReferenceProps(),
78
+ "data-embedded": true,
79
+ ref: reference,
80
+ icon: "chevron-down",
81
+ onKeyDown,
82
+ variant: "secondary"
83
+ }
84
+ ),
85
+ [getReferenceProps, onKeyDown, reference]
86
+ );
87
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ...htmlAttributes, className: classBase, ref: containerRef, children: [
88
+ /* @__PURE__ */ jsxRuntime.jsx(core.Input, { ...inputProps, endAdornment, value }),
89
+ /* @__PURE__ */ jsxRuntime.jsx(
90
+ FloatingTable,
91
+ {
92
+ ...getFloatingProps(),
93
+ collapsed: !open,
94
+ id: tableId,
95
+ open,
96
+ left: x + 3,
97
+ position: strategy,
98
+ ref: floating,
99
+ top: y + 3,
100
+ children: /* @__PURE__ */ jsxRuntime.jsx(
101
+ vuuTable.Table,
102
+ {
103
+ ...tableHandlers,
104
+ config: tableConfig,
105
+ dataSource,
106
+ highlightedIndex,
107
+ maxViewportRowLimit: 10,
108
+ navigationStyle: "row",
109
+ ref: tableRef,
110
+ selectionModel: "single",
111
+ showColumnHeaders: false,
112
+ width: width - 3
113
+ }
114
+ )
115
+ }
116
+ )
117
+ ] });
118
+ };
119
+
120
+ exports.TablePicker = TablePicker;
121
+ //# sourceMappingURL=TablePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TablePicker.js","sources":["../../src/instrument-picker/TablePicker.tsx"],"sourcesContent":["import type { DataSourceRowObject, TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport { Table, type TableProps } from \"@vuu-ui/vuu-table\";\nimport {\n Input,\n useFloatingComponent,\n useIdMemo,\n type FloatingComponentProps,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { forwardRef, useMemo, type HTMLAttributes } from \"react\";\nimport { IconButton } from \"../icon-button\";\nimport tablePickerCss from \"./TablePicker.css\";\nimport { useTablePicker } from \"./useTablePicker\";\n\nconst classBase = \"vuuTablePicker\";\n\ninterface FloatingTableProps extends FloatingComponentProps {\n collapsed?: boolean;\n}\n\nexport interface TablePickerProps\n extends Omit<HTMLAttributes<HTMLElement>, \"onSelect\">,\n Pick<TableProps, \"onSelect\"> {\n TableProps?: Pick<TableProps, \"config\">;\n rowToString?: (row: DataSourceRowObject) => string;\n schema: TableSchema;\n searchColumns?: string[];\n}\n\nconst FloatingTable = forwardRef<HTMLDivElement, FloatingTableProps>(\n function FloatingTable(\n { children, className, collapsed, open, ...props },\n forwardedRef,\n ) {\n const { Component: FloatingComponent } = useFloatingComponent();\n return (\n <FloatingComponent\n className={cx(\n `${classBase}-floating-table`,\n {\n [`${classBase}-collapsed`]: collapsed,\n },\n className,\n )}\n role=\"listbox\"\n open={open}\n {...props}\n ref={forwardedRef}\n >\n {children}\n </FloatingComponent>\n );\n },\n);\n\nexport const TablePicker = ({\n TableProps,\n onSelect,\n rowToString,\n schema,\n searchColumns,\n ...htmlAttributes\n}: TablePickerProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-table-picker\",\n css: tablePickerCss,\n window: targetWindow,\n });\n\n const tableId = useIdMemo();\n\n const {\n containerRef,\n dataSource,\n highlightedIndex,\n floatingUIProps: { x, y, strategy, floating, reference },\n inputProps,\n interactionPropGetters: { getFloatingProps, getReferenceProps },\n onKeyDown,\n open,\n tableConfig,\n tableHandlers,\n tableRef,\n value,\n width,\n } = useTablePicker({\n TableProps,\n rowToString,\n onSelect,\n schema,\n searchColumns,\n });\n\n const endAdornment = useMemo(\n () => (\n <IconButton\n {...getReferenceProps()}\n data-embedded\n ref={reference}\n icon=\"chevron-down\"\n onKeyDown={onKeyDown}\n variant=\"secondary\"\n />\n ),\n [getReferenceProps, onKeyDown, reference],\n );\n\n return (\n <div {...htmlAttributes} className={classBase} ref={containerRef}>\n <Input {...inputProps} endAdornment={endAdornment} value={value} />\n <FloatingTable\n {...getFloatingProps()}\n collapsed={!open}\n id={tableId}\n open={open}\n left={x + 3}\n position={strategy}\n ref={floating}\n top={y + 3}\n >\n <Table\n {...tableHandlers}\n config={tableConfig}\n dataSource={dataSource}\n highlightedIndex={highlightedIndex}\n maxViewportRowLimit={10}\n navigationStyle=\"row\"\n ref={tableRef}\n selectionModel=\"single\"\n showColumnHeaders={false}\n width={width - 3}\n />\n </FloatingTable>\n </div>\n );\n};\n"],"names":["forwardRef","FloatingTable","useFloatingComponent","jsx","useWindow","useComponentCssInjection","tablePickerCss","useIdMemo","useTablePicker","useMemo","IconButton","Input","Table"],"mappings":"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"}
@@ -0,0 +1,150 @@
1
+ 'use strict';
2
+
3
+ var react = require('@floating-ui/react');
4
+ var core = require('@salt-ds/core');
5
+ var React = require('react');
6
+ var vuuUtils = require('@vuu-ui/vuu-utils');
7
+ var vuuTable = require('@vuu-ui/vuu-table');
8
+
9
+ const defaultRowToString = (row) => Object.values(row.data).join(" ");
10
+ const useTablePicker = ({
11
+ TableProps,
12
+ onSelect,
13
+ rowToString = defaultRowToString,
14
+ schema,
15
+ searchColumns = schema.columns.filter(vuuUtils.isStringColumn).map(vuuUtils.toColumnName)
16
+ }) => {
17
+ const { VuuDataSource } = vuuUtils.useDataSource();
18
+ const [value, setValue] = React.useState("");
19
+ const [open, setOpen] = React.useState(false);
20
+ const widthRef = React.useRef(-1);
21
+ const tableColumns = TableProps?.config.columns;
22
+ const containerRef = React.useCallback((el) => {
23
+ widthRef.current = el?.clientWidth ?? -1;
24
+ }, []);
25
+ const dataSource = React.useMemo(() => {
26
+ const columns = tableColumns ?? schema.columns;
27
+ return new VuuDataSource({
28
+ columns: columns.map((c) => c.name),
29
+ table: schema.table
30
+ });
31
+ }, [tableColumns, VuuDataSource, schema]);
32
+ const navigation = vuuTable.useControlledTableNavigation(-1, dataSource.size);
33
+ const baseFilterPattern = React.useMemo(
34
+ // TODO make this contains once server supports it
35
+ () => searchColumns.map((col) => `${col} starts "__VALUE__"`).join(" or "),
36
+ [searchColumns]
37
+ );
38
+ const { context, elements, ...floatingUIProps } = core.useFloatingUI({
39
+ open,
40
+ onOpenChange: setOpen,
41
+ placement: "bottom-end",
42
+ strategy: "fixed",
43
+ middleware: [
44
+ react.size({
45
+ apply({ rects, elements: elements2, availableHeight }) {
46
+ Object.assign(elements2.floating.style, {
47
+ minWidth: `${rects.reference.width}px`,
48
+ maxHeight: `max(calc(${availableHeight}px - var(--salt-spacing-100)), calc((var(--salt-size-base) + var(--salt-spacing-100)) * 5))`
49
+ });
50
+ }
51
+ }),
52
+ react.flip({ fallbackStrategy: "initialPlacement" })
53
+ ]
54
+ });
55
+ const interactionPropGetters = react.useInteractions([
56
+ react.useDismiss(context),
57
+ react.useClick(context, { keyboardHandlers: false, toggle: false })
58
+ ]);
59
+ const handleInputChange = React.useCallback(
60
+ (evt) => {
61
+ const { value: value2 } = evt.target;
62
+ setValue(value2);
63
+ console.log(`input changed ${value2}`);
64
+ if (value2 && value2.trim().length) {
65
+ const filter = baseFilterPattern.replaceAll("__VALUE__", value2);
66
+ dataSource.filter = {
67
+ filter
68
+ };
69
+ } else {
70
+ dataSource.filter = {
71
+ filter: ""
72
+ };
73
+ }
74
+ },
75
+ [baseFilterPattern, dataSource]
76
+ );
77
+ const handleSelectRow = React.useCallback(
78
+ (row) => {
79
+ const value2 = row === null ? "" : rowToString(row);
80
+ setValue(value2);
81
+ onSelect?.(row);
82
+ requestAnimationFrame(() => {
83
+ setOpen(false);
84
+ });
85
+ },
86
+ [onSelect, rowToString]
87
+ );
88
+ const handleKeyDown = React.useCallback(
89
+ (evt) => {
90
+ if (open) {
91
+ if (vuuTable.isNavigationKey(evt.key, "row") || vuuTable.isRowSelectionKey(evt.key)) {
92
+ navigation.onKeyDown(evt);
93
+ }
94
+ } else {
95
+ if (evt.key === "ArrowDown" || evt.key === "Enter") {
96
+ setOpen(true);
97
+ }
98
+ }
99
+ },
100
+ [navigation, open]
101
+ );
102
+ const inputProps = {
103
+ inputProps: {
104
+ autoComplete: "off",
105
+ onKeyDown: handleKeyDown
106
+ },
107
+ onChange: handleInputChange
108
+ };
109
+ const tableHandlers = {
110
+ onSelect: handleSelectRow
111
+ };
112
+ const tableConfig = React.useMemo(() => {
113
+ const config = TableProps?.config;
114
+ if (config) {
115
+ const {
116
+ columns = schema.columns,
117
+ columnLayout = "fit",
118
+ ...rest
119
+ } = config;
120
+ return {
121
+ columns,
122
+ columnLayout,
123
+ ...rest
124
+ };
125
+ } else {
126
+ return {
127
+ columnLayout: "fit",
128
+ columns: schema.columns
129
+ };
130
+ }
131
+ }, [TableProps, schema]);
132
+ return {
133
+ containerRef,
134
+ dataSource,
135
+ highlightedIndex: navigation.highlightedIndexRef.current,
136
+ floatingUIProps,
137
+ inputProps,
138
+ interactionPropGetters,
139
+ onKeyDown: handleKeyDown,
140
+ open,
141
+ tableConfig,
142
+ tableHandlers,
143
+ tableRef: navigation.tableRef,
144
+ value,
145
+ width: widthRef.current
146
+ };
147
+ };
148
+
149
+ exports.useTablePicker = useTablePicker;
150
+ //# sourceMappingURL=useTablePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTablePicker.js","sources":["../../src/instrument-picker/useTablePicker.ts"],"sourcesContent":["import {\n flip,\n size,\n useClick,\n useDismiss,\n useInteractions,\n} from \"@floating-ui/react\";\nimport { useFloatingUI } from \"@salt-ds/core\";\nimport {\n ChangeEvent,\n KeyboardEventHandler,\n RefCallback,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport type { DataSourceRowObject } from \"@vuu-ui/vuu-data-types\";\nimport type {\n TableConfig,\n TableRowSelectHandler,\n} from \"@vuu-ui/vuu-table-types\";\nimport { isStringColumn, toColumnName, useDataSource } from \"@vuu-ui/vuu-utils\";\nimport type { TablePickerProps } from \"./TablePicker\";\nimport {\n isNavigationKey,\n isRowSelectionKey,\n useControlledTableNavigation,\n} from \"@vuu-ui/vuu-table\";\n\nexport interface TablePickerHookProps\n extends Pick<\n TablePickerProps,\n \"TableProps\" | \"onSelect\" | \"rowToString\" | \"schema\" | \"searchColumns\"\n > {\n defaultIsOpen?: boolean;\n isOpen?: boolean;\n}\n\nconst defaultRowToString = (row: DataSourceRowObject) =>\n Object.values(row.data).join(\" \");\n\nexport const useTablePicker = ({\n TableProps,\n onSelect,\n rowToString = defaultRowToString,\n schema,\n searchColumns = schema.columns.filter(isStringColumn).map(toColumnName),\n}: TablePickerHookProps) => {\n const { VuuDataSource } = useDataSource();\n const [value, setValue] = useState(\"\");\n const [open, setOpen] = useState(false);\n\n const widthRef = useRef(-1);\n\n const tableColumns = TableProps?.config.columns;\n\n const containerRef = useCallback<RefCallback<HTMLDivElement>>((el) => {\n widthRef.current = el?.clientWidth ?? -1;\n }, []);\n\n const dataSource = useMemo(() => {\n const columns = tableColumns ?? schema.columns;\n\n return new VuuDataSource({\n columns: columns.map((c) => c.name),\n table: schema.table,\n });\n }, [tableColumns, VuuDataSource, schema]);\n\n const navigation = useControlledTableNavigation(-1, dataSource.size);\n\n const baseFilterPattern = useMemo(\n // TODO make this contains once server supports it\n () => searchColumns.map((col) => `${col} starts \"__VALUE__\"`).join(\" or \"),\n [searchColumns],\n );\n\n // const handleOpenChange = useCallback<OpenChangeHandler>(\n // (open, closeReason) => {\n // setIsOpen(open);\n // onOpenChange?.(open, closeReason);\n // },\n // [onOpenChange, setIsOpen],\n // );\n\n const { context, elements, ...floatingUIProps } = useFloatingUI({\n open,\n onOpenChange: setOpen,\n placement: \"bottom-end\",\n strategy: \"fixed\",\n middleware: [\n size({\n apply({ rects, elements, availableHeight }) {\n Object.assign(elements.floating.style, {\n minWidth: `${rects.reference.width}px`,\n maxHeight: `max(calc(${availableHeight}px - var(--salt-spacing-100)), calc((var(--salt-size-base) + var(--salt-spacing-100)) * 5))`,\n });\n },\n }),\n flip({ fallbackStrategy: \"initialPlacement\" }),\n ],\n });\n\n const interactionPropGetters = useInteractions([\n useDismiss(context),\n useClick(context, { keyboardHandlers: false, toggle: false }),\n ]);\n\n const handleInputChange = useCallback(\n (evt: ChangeEvent<HTMLInputElement>) => {\n const { value } = evt.target;\n setValue(value);\n\n console.log(`input changed ${value}`);\n\n if (value && value.trim().length) {\n const filter = baseFilterPattern.replaceAll(\"__VALUE__\", value);\n dataSource.filter = {\n filter,\n };\n } else {\n dataSource.filter = {\n filter: \"\",\n };\n }\n },\n [baseFilterPattern, dataSource],\n );\n\n const handleSelectRow = useCallback<TableRowSelectHandler>(\n (row) => {\n const value = row === null ? \"\" : rowToString(row);\n setValue(value);\n onSelect?.(row);\n // TODO do we need to include a reason ?\n requestAnimationFrame(() => {\n setOpen(false);\n });\n },\n [onSelect, rowToString],\n );\n\n const handleKeyDown = useCallback<KeyboardEventHandler<HTMLElement>>(\n (evt) => {\n if (open) {\n if (isNavigationKey(evt.key, \"row\") || isRowSelectionKey(evt.key)) {\n navigation.onKeyDown(evt);\n }\n } else {\n if (evt.key === \"ArrowDown\" || evt.key === \"Enter\") {\n setOpen(true);\n }\n }\n },\n [navigation, open],\n );\n\n const inputProps = {\n inputProps: {\n autoComplete: \"off\",\n onKeyDown: handleKeyDown,\n },\n onChange: handleInputChange,\n };\n const tableHandlers = {\n onSelect: handleSelectRow,\n };\n\n const tableConfig = useMemo<TableConfig>(() => {\n const config = TableProps?.config;\n if (config) {\n const {\n columns = schema.columns,\n columnLayout = \"fit\",\n ...rest\n } = config;\n return {\n columns,\n columnLayout,\n ...rest,\n };\n } else {\n return {\n columnLayout: \"fit\",\n columns: schema.columns,\n };\n }\n }, [TableProps, schema]);\n\n return {\n containerRef,\n dataSource,\n highlightedIndex: navigation.highlightedIndexRef.current,\n floatingUIProps,\n inputProps,\n interactionPropGetters,\n onKeyDown: handleKeyDown,\n open,\n tableConfig,\n tableHandlers,\n tableRef: navigation.tableRef,\n value,\n width: widthRef.current,\n };\n};\n"],"names":["isStringColumn","toColumnName","useDataSource","useState","useRef","useCallback","useMemo","useControlledTableNavigation","useFloatingUI","size","elements","flip","useInteractions","useDismiss","useClick","value","isNavigationKey","isRowSelectionKey"],"mappings":"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"}
@@ -9,22 +9,31 @@ const WidthOnly = ["clientWidth"];
9
9
  const HeightOnly = ["clientHeight"];
10
10
  const NO_MEASUREMENT = [];
11
11
  const isNumber = (val) => Number.isFinite(val);
12
- const FULL_SIZE = { height: "100%", width: "auto" };
13
- const getInitialCssSize = (height, width) => {
14
- if (vuuUtils.isValidNumber(height) && vuuUtils.isValidNumber(width)) {
15
- return {
16
- height: `${height}px`,
17
- width: `${width}px`
18
- };
19
- } else if (typeof height === "string" || typeof width === "string") {
12
+ const reduceSizeHeight = (size, value) => {
13
+ if (value === 0) {
14
+ return size;
15
+ } else {
20
16
  return {
21
- height: height ?? "100%",
22
- width: width ?? "auto"
17
+ height: size.height - value,
18
+ width: size.width
23
19
  };
20
+ }
21
+ };
22
+ const getInitialValue = (value, defaultValue) => {
23
+ if (vuuUtils.isValidNumber(value)) {
24
+ return `${value}px`;
25
+ } else if (typeof value === "string") {
26
+ return value;
24
27
  } else {
25
- return FULL_SIZE;
28
+ return defaultValue;
26
29
  }
27
30
  };
31
+ const getInitialCssSize = (height, width) => {
32
+ return {
33
+ height: getInitialValue(height, "100%"),
34
+ width: getInitialValue(width, "auto")
35
+ };
36
+ };
28
37
  const getInitialInnerSize = (height, width) => {
29
38
  if (vuuUtils.isValidNumber(height) && vuuUtils.isValidNumber(width)) {
30
39
  return {
@@ -123,5 +132,6 @@ const useMeasuredContainer = ({
123
132
  };
124
133
  };
125
134
 
135
+ exports.reduceSizeHeight = reduceSizeHeight;
126
136
  exports.useMeasuredContainer = useMeasuredContainer;
127
137
  //# sourceMappingURL=useMeasuredContainer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useMeasuredContainer.js","sources":["../../src/measured-container/useMeasuredContainer.ts"],"sourcesContent":["import { isValidNumber } from \"@vuu-ui/vuu-utils\";\nimport {\n CSSProperties,\n RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { MeasuredContainerProps } from \"./MeasuredContainer\";\nimport { useResizeObserver, ResizeHandler } from \"./useResizeObserver\";\n\nconst ClientWidthHeight = [\"clientHeight\", \"clientWidth\"];\nconst WidthOnly = [\"clientWidth\"];\nconst HeightOnly = [\"clientHeight\"];\nconst NO_MEASUREMENT = [] as const;\n\nexport interface ClientSize {\n clientHeight: number;\n clientWidth: number;\n}\n\nexport interface MeasuredProps\n extends Pick<MeasuredContainerProps, \"height\" | \"onResize\" | \"width\"> {\n defaultHeight?: number;\n defaultWidth?: number;\n}\n\nexport type CssSize = Pick<CSSProperties, \"height\" | \"width\">;\n\nexport interface MeasuredSize {\n height: number;\n width: number;\n}\n\ninterface MeasuredState {\n css: CssSize;\n outer: CssSize;\n inner?: MeasuredSize;\n}\n\nconst isNumber = (val: unknown): val is number => Number.isFinite(val);\n\nconst FULL_SIZE: CssSize = { height: \"100%\", width: \"auto\" };\n\nexport interface MeasuredContainerHookResult {\n containerRef: RefObject<HTMLDivElement>;\n cssSize: CssSize;\n outerSize: CssSize;\n innerSize?: MeasuredSize;\n}\n\n// If (outer) height and width are known at initialisation (i.e. they\n// were passed as props), use as initial values for inner size. If there\n// is no border on Table, these values will not change. If there is a border,\n// inner values will be updated once measured.\nconst getInitialCssSize = (\n height?: number | string,\n width?: number | string,\n): CssSize => {\n if (isValidNumber(height) && isValidNumber(width)) {\n return {\n height: `${height}px`,\n width: `${width}px`,\n };\n } else if (typeof height === \"string\" || typeof width === \"string\") {\n return {\n height: height ?? \"100%\",\n width: width ?? \"auto\",\n };\n } else {\n return FULL_SIZE;\n }\n};\n\nconst getInitialInnerSize = (\n height: unknown,\n width: unknown,\n): MeasuredSize | undefined => {\n if (isValidNumber(height) && isValidNumber(width)) {\n return {\n height,\n width,\n };\n }\n};\n\nexport const useMeasuredContainer = ({\n defaultHeight = 0,\n defaultWidth = 0,\n height,\n onResize: onResizeProp,\n width,\n}: MeasuredProps): MeasuredContainerHookResult => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [size, setSize] = useState<MeasuredState>({\n css: getInitialCssSize(height, width),\n inner: getInitialInnerSize(height, width),\n outer: {\n height: height ?? \"100%\",\n width: width ?? \"auto\",\n },\n });\n const fixedHeight = typeof height === \"number\";\n const fixedWidth = typeof width === \"number\";\n\n const dimensions =\n fixedHeight && fixedWidth\n ? NO_MEASUREMENT\n : fixedHeight\n ? WidthOnly\n : fixedWidth\n ? HeightOnly\n : ClientWidthHeight;\n\n useMemo(() => {\n // TODO why call state from memo.\n // Why not calculate size first inline, then assign that to state\n // on first pass\n setSize((currentSize) => {\n const { inner, outer } = currentSize;\n if (isValidNumber(height) && isValidNumber(width) && inner && outer) {\n const { height: innerHeight, width: innerWidth } = inner;\n const { height: outerHeight, width: outerWidth } = outer;\n\n if (outerHeight !== height || outerWidth !== width) {\n const heightDiff = isValidNumber(outerHeight)\n ? outerHeight - innerHeight\n : 0;\n const widthDiff = isValidNumber(outerWidth)\n ? outerWidth - innerWidth\n : 0;\n return {\n ...currentSize,\n outer: { height, width },\n inner: { height: height - heightDiff, width: width - widthDiff },\n };\n }\n }\n return currentSize;\n });\n }, [height, width]);\n\n const onResize: ResizeHandler = useCallback(\n ({ clientWidth, clientHeight }: Partial<ClientSize>) => {\n const { css, inner, outer } = size;\n let newState: MeasuredState = size;\n\n if (\n fixedHeight &&\n isNumber(clientWidth) &&\n Math.floor(clientWidth) !== inner?.width\n ) {\n newState = {\n css,\n outer,\n inner: {\n width: Math.floor(clientWidth) || defaultWidth,\n height,\n },\n };\n } else if (\n fixedWidth &&\n isNumber(clientHeight) &&\n Math.floor(clientHeight) !== inner?.height\n ) {\n newState = {\n css,\n outer,\n inner: {\n height: Math.floor(clientHeight) || defaultHeight,\n width,\n },\n };\n } else if (\n isNumber(clientHeight) &&\n isNumber(clientWidth) &&\n (clientWidth !== inner?.width || clientHeight !== inner?.height)\n ) {\n newState = {\n css,\n outer,\n inner: {\n width: Math.floor(clientWidth) || defaultWidth,\n height: Math.floor(clientHeight) || defaultHeight,\n },\n };\n }\n\n if (newState !== size) {\n setSize(newState);\n }\n },\n [defaultHeight, defaultWidth, fixedHeight, fixedWidth, height, size, width],\n );\n\n useEffect(() => {\n if (size.inner) {\n onResizeProp?.(size.inner);\n }\n }, [onResizeProp, size.inner]);\n\n useResizeObserver(containerRef, dimensions, onResize, true);\n\n return {\n containerRef,\n cssSize: size.css,\n outerSize: size.outer,\n innerSize: size.inner,\n };\n};\n"],"names":["isValidNumber","useRef","useState","useMemo","useCallback","useEffect","useResizeObserver"],"mappings":";;;;;;AAaA,MAAM,iBAAA,GAAoB,CAAC,cAAA,EAAgB,aAAa,CAAA,CAAA;AACxD,MAAM,SAAA,GAAY,CAAC,aAAa,CAAA,CAAA;AAChC,MAAM,UAAA,GAAa,CAAC,cAAc,CAAA,CAAA;AAClC,MAAM,iBAAiB,EAAC,CAAA;AA0BxB,MAAM,QAAW,GAAA,CAAC,GAAgC,KAAA,MAAA,CAAO,SAAS,GAAG,CAAA,CAAA;AAErE,MAAM,SAAqB,GAAA,EAAE,MAAQ,EAAA,MAAA,EAAQ,OAAO,MAAO,EAAA,CAAA;AAa3D,MAAM,iBAAA,GAAoB,CACxB,MAAA,EACA,KACY,KAAA;AACZ,EAAA,IAAIA,sBAAc,CAAA,MAAM,CAAK,IAAAA,sBAAA,CAAc,KAAK,CAAG,EAAA;AACjD,IAAO,OAAA;AAAA,MACL,MAAA,EAAQ,GAAG,MAAM,CAAA,EAAA,CAAA;AAAA,MACjB,KAAA,EAAO,GAAG,KAAK,CAAA,EAAA,CAAA;AAAA,KACjB,CAAA;AAAA,aACS,OAAO,MAAA,KAAW,QAAY,IAAA,OAAO,UAAU,QAAU,EAAA;AAClE,IAAO,OAAA;AAAA,MACL,QAAQ,MAAU,IAAA,MAAA;AAAA,MAClB,OAAO,KAAS,IAAA,MAAA;AAAA,KAClB,CAAA;AAAA,GACK,MAAA;AACL,IAAO,OAAA,SAAA,CAAA;AAAA,GACT;AACF,CAAA,CAAA;AAEA,MAAM,mBAAA,GAAsB,CAC1B,MAAA,EACA,KAC6B,KAAA;AAC7B,EAAA,IAAIA,sBAAc,CAAA,MAAM,CAAK,IAAAA,sBAAA,CAAc,KAAK,CAAG,EAAA;AACjD,IAAO,OAAA;AAAA,MACL,MAAA;AAAA,MACA,KAAA;AAAA,KACF,CAAA;AAAA,GACF;AACF,CAAA,CAAA;AAEO,MAAM,uBAAuB,CAAC;AAAA,EACnC,aAAgB,GAAA,CAAA;AAAA,EAChB,YAAe,GAAA,CAAA;AAAA,EACf,MAAA;AAAA,EACA,QAAU,EAAA,YAAA;AAAA,EACV,KAAA;AACF,CAAkD,KAAA;AAChD,EAAM,MAAA,YAAA,GAAeC,aAAuB,IAAI,CAAA,CAAA;AAChD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIC,cAAwB,CAAA;AAAA,IAC9C,GAAA,EAAK,iBAAkB,CAAA,MAAA,EAAQ,KAAK,CAAA;AAAA,IACpC,KAAA,EAAO,mBAAoB,CAAA,MAAA,EAAQ,KAAK,CAAA;AAAA,IACxC,KAAO,EAAA;AAAA,MACL,QAAQ,MAAU,IAAA,MAAA;AAAA,MAClB,OAAO,KAAS,IAAA,MAAA;AAAA,KAClB;AAAA,GACD,CAAA,CAAA;AACD,EAAM,MAAA,WAAA,GAAc,OAAO,MAAW,KAAA,QAAA,CAAA;AACtC,EAAM,MAAA,UAAA,GAAa,OAAO,KAAU,KAAA,QAAA,CAAA;AAEpC,EAAA,MAAM,aACJ,WAAe,IAAA,UAAA,GACX,iBACA,WACE,GAAA,SAAA,GACA,aACE,UACA,GAAA,iBAAA,CAAA;AAEV,EAAAC,aAAA,CAAQ,MAAM;AAIZ,IAAA,OAAA,CAAQ,CAAC,WAAgB,KAAA;AACvB,MAAM,MAAA,EAAE,KAAO,EAAA,KAAA,EAAU,GAAA,WAAA,CAAA;AACzB,MAAA,IAAIH,uBAAc,MAAM,CAAA,IAAKA,uBAAc,KAAK,CAAA,IAAK,SAAS,KAAO,EAAA;AACnE,QAAA,MAAM,EAAE,MAAA,EAAQ,WAAa,EAAA,KAAA,EAAO,YAAe,GAAA,KAAA,CAAA;AACnD,QAAA,MAAM,EAAE,MAAA,EAAQ,WAAa,EAAA,KAAA,EAAO,YAAe,GAAA,KAAA,CAAA;AAEnD,QAAI,IAAA,WAAA,KAAgB,MAAU,IAAA,UAAA,KAAe,KAAO,EAAA;AAClD,UAAA,MAAM,UAAa,GAAAA,sBAAA,CAAc,WAAW,CAAA,GACxC,cAAc,WACd,GAAA,CAAA,CAAA;AACJ,UAAA,MAAM,SAAY,GAAAA,sBAAA,CAAc,UAAU,CAAA,GACtC,aAAa,UACb,GAAA,CAAA,CAAA;AACJ,UAAO,OAAA;AAAA,YACL,GAAG,WAAA;AAAA,YACH,KAAA,EAAO,EAAE,MAAA,EAAQ,KAAM,EAAA;AAAA,YACvB,OAAO,EAAE,MAAA,EAAQ,SAAS,UAAY,EAAA,KAAA,EAAO,QAAQ,SAAU,EAAA;AAAA,WACjE,CAAA;AAAA,SACF;AAAA,OACF;AACA,MAAO,OAAA,WAAA,CAAA;AAAA,KACR,CAAA,CAAA;AAAA,GACA,EAAA,CAAC,MAAQ,EAAA,KAAK,CAAC,CAAA,CAAA;AAElB,EAAA,MAAM,QAA0B,GAAAI,iBAAA;AAAA,IAC9B,CAAC,EAAE,WAAa,EAAA,YAAA,EAAwC,KAAA;AACtD,MAAA,MAAM,EAAE,GAAA,EAAK,KAAO,EAAA,KAAA,EAAU,GAAA,IAAA,CAAA;AAC9B,MAAA,IAAI,QAA0B,GAAA,IAAA,CAAA;AAE9B,MACE,IAAA,WAAA,IACA,SAAS,WAAW,CAAA,IACpB,KAAK,KAAM,CAAA,WAAW,CAAM,KAAA,KAAA,EAAO,KACnC,EAAA;AACA,QAAW,QAAA,GAAA;AAAA,UACT,GAAA;AAAA,UACA,KAAA;AAAA,UACA,KAAO,EAAA;AAAA,YACL,KAAO,EAAA,IAAA,CAAK,KAAM,CAAA,WAAW,CAAK,IAAA,YAAA;AAAA,YAClC,MAAA;AAAA,WACF;AAAA,SACF,CAAA;AAAA,OACF,MAAA,IACE,UACA,IAAA,QAAA,CAAS,YAAY,CAAA,IACrB,KAAK,KAAM,CAAA,YAAY,CAAM,KAAA,KAAA,EAAO,MACpC,EAAA;AACA,QAAW,QAAA,GAAA;AAAA,UACT,GAAA;AAAA,UACA,KAAA;AAAA,UACA,KAAO,EAAA;AAAA,YACL,MAAQ,EAAA,IAAA,CAAK,KAAM,CAAA,YAAY,CAAK,IAAA,aAAA;AAAA,YACpC,KAAA;AAAA,WACF;AAAA,SACF,CAAA;AAAA,OAEA,MAAA,IAAA,QAAA,CAAS,YAAY,CAAA,IACrB,QAAS,CAAA,WAAW,CACnB,KAAA,WAAA,KAAgB,KAAO,EAAA,KAAA,IAAS,YAAiB,KAAA,KAAA,EAAO,MACzD,CAAA,EAAA;AACA,QAAW,QAAA,GAAA;AAAA,UACT,GAAA;AAAA,UACA,KAAA;AAAA,UACA,KAAO,EAAA;AAAA,YACL,KAAO,EAAA,IAAA,CAAK,KAAM,CAAA,WAAW,CAAK,IAAA,YAAA;AAAA,YAClC,MAAQ,EAAA,IAAA,CAAK,KAAM,CAAA,YAAY,CAAK,IAAA,aAAA;AAAA,WACtC;AAAA,SACF,CAAA;AAAA,OACF;AAEA,MAAA,IAAI,aAAa,IAAM,EAAA;AACrB,QAAA,OAAA,CAAQ,QAAQ,CAAA,CAAA;AAAA,OAClB;AAAA,KACF;AAAA,IACA,CAAC,aAAe,EAAA,YAAA,EAAc,aAAa,UAAY,EAAA,MAAA,EAAQ,MAAM,KAAK,CAAA;AAAA,GAC5E,CAAA;AAEA,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,KAAK,KAAO,EAAA;AACd,MAAA,YAAA,GAAe,KAAK,KAAK,CAAA,CAAA;AAAA,KAC3B;AAAA,GACC,EAAA,CAAC,YAAc,EAAA,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA;AAE7B,EAAkBC,mCAAA,CAAA,YAAA,EAAc,UAAY,EAAA,QAAA,EAAU,IAAI,CAAA,CAAA;AAE1D,EAAO,OAAA;AAAA,IACL,YAAA;AAAA,IACA,SAAS,IAAK,CAAA,GAAA;AAAA,IACd,WAAW,IAAK,CAAA,KAAA;AAAA,IAChB,WAAW,IAAK,CAAA,KAAA;AAAA,GAClB,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"useMeasuredContainer.js","sources":["../../src/measured-container/useMeasuredContainer.ts"],"sourcesContent":["import { isValidNumber } from \"@vuu-ui/vuu-utils\";\nimport {\n CSSProperties,\n RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { MeasuredContainerProps } from \"./MeasuredContainer\";\nimport { useResizeObserver, ResizeHandler } from \"./useResizeObserver\";\n\nconst ClientWidthHeight = [\"clientHeight\", \"clientWidth\"];\nconst WidthOnly = [\"clientWidth\"];\nconst HeightOnly = [\"clientHeight\"];\nconst NO_MEASUREMENT = [] as const;\n\nexport interface ClientSize {\n clientHeight: number;\n clientWidth: number;\n}\n\nexport interface MeasuredProps\n extends Pick<MeasuredContainerProps, \"height\" | \"onResize\" | \"width\"> {\n defaultHeight?: number;\n defaultWidth?: number;\n}\n\nexport type CssSize = Pick<CSSProperties, \"height\" | \"width\">;\n\nexport interface MeasuredSize {\n height: number;\n width: number;\n}\n\ninterface MeasuredState {\n css: CssSize;\n outer: CssSize;\n inner?: MeasuredSize;\n}\n\nconst isNumber = (val: unknown): val is number => Number.isFinite(val);\n\nexport interface MeasuredContainerHookResult {\n containerRef: RefObject<HTMLDivElement>;\n cssSize: CssSize;\n outerSize: CssSize;\n innerSize?: MeasuredSize;\n}\n\nexport const reduceSizeHeight = (\n size: MeasuredSize,\n value: number,\n): MeasuredSize => {\n if (value === 0) {\n return size;\n } else {\n return {\n height: size.height - value,\n width: size.width,\n };\n }\n};\n\nconst getInitialValue = (\n value: number | string | undefined,\n defaultValue: \"auto\" | \"100%\",\n) => {\n if (isValidNumber(value)) {\n return `${value}px`;\n } else if (typeof value === \"string\") {\n return value;\n } else {\n return defaultValue;\n }\n};\n\n// If (outer) height and width are known at initialisation (i.e. they\n// were passed as props), use as initial values for inner size. If there\n// is no border on Table, these values will not change. If there is a border,\n// inner values will be updated once measured.\nconst getInitialCssSize = (\n height?: number | string,\n width?: number | string,\n): CssSize => {\n return {\n height: getInitialValue(height, \"100%\"),\n width: getInitialValue(width, \"auto\"),\n };\n};\n\nconst getInitialInnerSize = (\n height: unknown,\n width: unknown,\n): MeasuredSize | undefined => {\n if (isValidNumber(height) && isValidNumber(width)) {\n return {\n height,\n width,\n };\n }\n};\n\nexport const useMeasuredContainer = ({\n defaultHeight = 0,\n defaultWidth = 0,\n height,\n onResize: onResizeProp,\n width,\n}: MeasuredProps): MeasuredContainerHookResult => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [size, setSize] = useState<MeasuredState>({\n css: getInitialCssSize(height, width),\n inner: getInitialInnerSize(height, width),\n outer: {\n height: height ?? \"100%\",\n width: width ?? \"auto\",\n },\n });\n const fixedHeight = typeof height === \"number\";\n const fixedWidth = typeof width === \"number\";\n\n const dimensions =\n fixedHeight && fixedWidth\n ? NO_MEASUREMENT\n : fixedHeight\n ? WidthOnly\n : fixedWidth\n ? HeightOnly\n : ClientWidthHeight;\n\n useMemo(() => {\n // TODO why call state from memo.\n // Why not calculate size first inline, then assign that to state\n // on first pass\n setSize((currentSize) => {\n const { inner, outer } = currentSize;\n if (isValidNumber(height) && isValidNumber(width) && inner && outer) {\n const { height: innerHeight, width: innerWidth } = inner;\n const { height: outerHeight, width: outerWidth } = outer;\n\n if (outerHeight !== height || outerWidth !== width) {\n const heightDiff = isValidNumber(outerHeight)\n ? outerHeight - innerHeight\n : 0;\n const widthDiff = isValidNumber(outerWidth)\n ? outerWidth - innerWidth\n : 0;\n return {\n ...currentSize,\n outer: { height, width },\n inner: { height: height - heightDiff, width: width - widthDiff },\n };\n }\n }\n return currentSize;\n });\n }, [height, width]);\n\n const onResize: ResizeHandler = useCallback(\n ({ clientWidth, clientHeight }: Partial<ClientSize>) => {\n const { css, inner, outer } = size;\n let newState: MeasuredState = size;\n\n if (\n fixedHeight &&\n isNumber(clientWidth) &&\n Math.floor(clientWidth) !== inner?.width\n ) {\n newState = {\n css,\n outer,\n inner: {\n width: Math.floor(clientWidth) || defaultWidth,\n height,\n },\n };\n } else if (\n fixedWidth &&\n isNumber(clientHeight) &&\n Math.floor(clientHeight) !== inner?.height\n ) {\n newState = {\n css,\n outer,\n inner: {\n height: Math.floor(clientHeight) || defaultHeight,\n width,\n },\n };\n } else if (\n isNumber(clientHeight) &&\n isNumber(clientWidth) &&\n (clientWidth !== inner?.width || clientHeight !== inner?.height)\n ) {\n newState = {\n css,\n outer,\n inner: {\n width: Math.floor(clientWidth) || defaultWidth,\n height: Math.floor(clientHeight) || defaultHeight,\n },\n };\n }\n\n if (newState !== size) {\n setSize(newState);\n }\n },\n [defaultHeight, defaultWidth, fixedHeight, fixedWidth, height, size, width],\n );\n\n useEffect(() => {\n if (size.inner) {\n onResizeProp?.(size.inner);\n }\n }, [onResizeProp, size.inner]);\n\n useResizeObserver(containerRef, dimensions, onResize, true);\n\n return {\n containerRef,\n cssSize: size.css,\n outerSize: size.outer,\n innerSize: size.inner,\n };\n};\n"],"names":["isValidNumber","useRef","useState","useMemo","useCallback","useEffect","useResizeObserver"],"mappings":"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"}
@@ -24,7 +24,9 @@ const useVuuTypeaheadInput = ({
24
24
  if (value) {
25
25
  const params = value ? [vuuTable, column, value] : [vuuTable, column];
26
26
  getSuggestions(params).then((suggestions) => {
27
- if (suggestions.length === 0 && value) {
27
+ if (suggestions === false) {
28
+ setTypeaheadValues([]);
29
+ } else if (suggestions.length === 0 && value) {
28
30
  setTypeaheadValues(NO_DATA_MATCH);
29
31
  } else {
30
32
  setTypeaheadValues(suggestions);
@@ -1 +1 @@
1
- {"version":3,"file":"useVuuTypeahead.js","sources":["../../src/vuu-typeahead-input/useVuuTypeahead.ts"],"sourcesContent":["import { TypeaheadParams } from \"@vuu-ui/vuu-protocol-types\";\nimport { dispatchKeyboardEvent, getVuuTable } from \"@vuu-ui/vuu-utils\";\nimport {\n ChangeEventHandler,\n ComponentPropsWithoutRef,\n RefCallback,\n SyntheticEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { VuuTypeaheadInputProps } from \"./VuuTypeaheadInput\";\n\nconst NO_DATA_MATCH = [\"No matching data\"];\n\nexport type VuuTypeaheadInputHookProps = Pick<\n VuuTypeaheadInputProps,\n \"column\" | \"onCommit\" | \"suggestionProvider\" | \"table\"\n>;\n\nexport const useVuuTypeaheadInput = ({\n column,\n onCommit,\n suggestionProvider,\n table,\n}: VuuTypeaheadInputHookProps) => {\n const [value, setValue] = useState(\"\");\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement | null>(null);\n const [typeaheadValues, setTypeaheadValues] = useState<string[]>([]);\n const getSuggestions = suggestionProvider();\n\n const callbackRef = useCallback<RefCallback<HTMLDivElement>>((el) => {\n rootRef.current = el;\n }, []);\n\n useEffect(() => {\n if (table) {\n const vuuTable = getVuuTable(table);\n if (value) {\n const params: TypeaheadParams = value\n ? [vuuTable, column, value]\n : [vuuTable, column];\n getSuggestions(params)\n .then((suggestions) => {\n if (suggestions.length === 0 && value) {\n setTypeaheadValues(NO_DATA_MATCH);\n } else {\n setTypeaheadValues(suggestions);\n }\n })\n .catch((err) => {\n console.error(\"Error getting suggestions\", err);\n });\n } else {\n setTypeaheadValues([]);\n }\n }\n }, [table, column, getSuggestions, value]);\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (evt) => {\n const { value: newValue } = evt.target;\n\n if (value === \"\" && newValue) {\n setOpen(true);\n const input = rootRef.current?.querySelector(\"input\");\n if (input) {\n // This is a workaround for the fact that ComboBox does not automatically\n // highlight first list itemn when items have been populated dynamically.\n // This has been raised as a bug.\n setTimeout(() => {\n dispatchKeyboardEvent(input, \"keydown\", \"ArrowUp\");\n }, 150);\n }\n } else if (newValue === \"\" && value) {\n // treat clear value as a commit event\n onCommit(evt, \"\");\n }\n\n setValue(newValue);\n };\n\n const handleSelectionChange = (\n evt: SyntheticEvent,\n [newSelected]: string[],\n ) => {\n console.log(`useVuuTypeahead handleSelectionChange ${newSelected}`);\n setValue(newSelected);\n onCommit(evt as SyntheticEvent<HTMLInputElement>, newSelected);\n };\n\n const handleOpenChange = (newOpen: boolean) => {\n if (newOpen && value === \"\") {\n // ignore this, don't open dropdown unless user has typed at least one character\n } else {\n setOpen(newOpen);\n }\n };\n\n const inputProps: ComponentPropsWithoutRef<\"input\"> = {\n autoComplete: \"off\",\n };\n\n return {\n inputProps,\n onChange: handleChange,\n onOpenChange: handleOpenChange,\n onSelectionChange: handleSelectionChange,\n open,\n ref: callbackRef,\n typeaheadValues,\n value,\n };\n};\n"],"names":["useState","useRef","useCallback","useEffect","getVuuTable","dispatchKeyboardEvent"],"mappings":";;;;;AAcA,MAAM,aAAA,GAAgB,CAAC,kBAAkB,CAAA,CAAA;AAOlC,MAAM,uBAAuB,CAAC;AAAA,EACnC,MAAA;AAAA,EACA,QAAA;AAAA,EACA,kBAAA;AAAA,EACA,KAAA;AACF,CAAkC,KAAA;AAChC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,EAAE,CAAA,CAAA;AACrC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAS,KAAK,CAAA,CAAA;AACtC,EAAM,MAAA,OAAA,GAAUC,aAA8B,IAAI,CAAA,CAAA;AAClD,EAAA,MAAM,CAAC,eAAiB,EAAA,kBAAkB,CAAI,GAAAD,cAAA,CAAmB,EAAE,CAAA,CAAA;AACnE,EAAA,MAAM,iBAAiB,kBAAmB,EAAA,CAAA;AAE1C,EAAM,MAAA,WAAA,GAAcE,iBAAyC,CAAA,CAAC,EAAO,KAAA;AACnE,IAAA,OAAA,CAAQ,OAAU,GAAA,EAAA,CAAA;AAAA,GACpB,EAAG,EAAE,CAAA,CAAA;AAEL,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,KAAO,EAAA;AACT,MAAM,MAAA,QAAA,GAAWC,qBAAY,KAAK,CAAA,CAAA;AAClC,MAAA,IAAI,KAAO,EAAA;AACT,QAAM,MAAA,MAAA,GAA0B,QAC5B,CAAC,QAAA,EAAU,QAAQ,KAAK,CAAA,GACxB,CAAC,QAAA,EAAU,MAAM,CAAA,CAAA;AACrB,QAAA,cAAA,CAAe,MAAM,CAAA,CAClB,IAAK,CAAA,CAAC,WAAgB,KAAA;AACrB,UAAI,IAAA,WAAA,CAAY,MAAW,KAAA,CAAA,IAAK,KAAO,EAAA;AACrC,YAAA,kBAAA,CAAmB,aAAa,CAAA,CAAA;AAAA,WAC3B,MAAA;AACL,YAAA,kBAAA,CAAmB,WAAW,CAAA,CAAA;AAAA,WAChC;AAAA,SACD,CAAA,CACA,KAAM,CAAA,CAAC,GAAQ,KAAA;AACd,UAAQ,OAAA,CAAA,KAAA,CAAM,6BAA6B,GAAG,CAAA,CAAA;AAAA,SAC/C,CAAA,CAAA;AAAA,OACE,MAAA;AACL,QAAA,kBAAA,CAAmB,EAAE,CAAA,CAAA;AAAA,OACvB;AAAA,KACF;AAAA,KACC,CAAC,KAAA,EAAO,MAAQ,EAAA,cAAA,EAAgB,KAAK,CAAC,CAAA,CAAA;AAEzC,EAAM,MAAA,YAAA,GAAqD,CAAC,GAAQ,KAAA;AAClE,IAAA,MAAM,EAAE,KAAA,EAAO,QAAS,EAAA,GAAI,GAAI,CAAA,MAAA,CAAA;AAEhC,IAAI,IAAA,KAAA,KAAU,MAAM,QAAU,EAAA;AAC5B,MAAA,OAAA,CAAQ,IAAI,CAAA,CAAA;AACZ,MAAA,MAAM,KAAQ,GAAA,OAAA,CAAQ,OAAS,EAAA,aAAA,CAAc,OAAO,CAAA,CAAA;AACpD,MAAA,IAAI,KAAO,EAAA;AAIT,QAAA,UAAA,CAAW,MAAM;AACf,UAAsBC,8BAAA,CAAA,KAAA,EAAO,WAAW,SAAS,CAAA,CAAA;AAAA,WAChD,GAAG,CAAA,CAAA;AAAA,OACR;AAAA,KACF,MAAA,IAAW,QAAa,KAAA,EAAA,IAAM,KAAO,EAAA;AAEnC,MAAA,QAAA,CAAS,KAAK,EAAE,CAAA,CAAA;AAAA,KAClB;AAEA,IAAA,QAAA,CAAS,QAAQ,CAAA,CAAA;AAAA,GACnB,CAAA;AAEA,EAAA,MAAM,qBAAwB,GAAA,CAC5B,GACA,EAAA,CAAC,WAAW,CACT,KAAA;AACH,IAAQ,OAAA,CAAA,GAAA,CAAI,CAAyC,sCAAA,EAAA,WAAW,CAAE,CAAA,CAAA,CAAA;AAClE,IAAA,QAAA,CAAS,WAAW,CAAA,CAAA;AACpB,IAAA,QAAA,CAAS,KAAyC,WAAW,CAAA,CAAA;AAAA,GAC/D,CAAA;AAEA,EAAM,MAAA,gBAAA,GAAmB,CAAC,OAAqB,KAAA;AAC7C,IAAI,IAAA,OAAA,IAAW,UAAU,EAAI,EAAA,CAEtB,MAAA;AACL,MAAA,OAAA,CAAQ,OAAO,CAAA,CAAA;AAAA,KACjB;AAAA,GACF,CAAA;AAEA,EAAA,MAAM,UAAgD,GAAA;AAAA,IACpD,YAAc,EAAA,KAAA;AAAA,GAChB,CAAA;AAEA,EAAO,OAAA;AAAA,IACL,UAAA;AAAA,IACA,QAAU,EAAA,YAAA;AAAA,IACV,YAAc,EAAA,gBAAA;AAAA,IACd,iBAAmB,EAAA,qBAAA;AAAA,IACnB,IAAA;AAAA,IACA,GAAK,EAAA,WAAA;AAAA,IACL,eAAA;AAAA,IACA,KAAA;AAAA,GACF,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"useVuuTypeahead.js","sources":["../../src/vuu-typeahead-input/useVuuTypeahead.ts"],"sourcesContent":["import { TypeaheadParams } from \"@vuu-ui/vuu-protocol-types\";\nimport { dispatchKeyboardEvent, getVuuTable } from \"@vuu-ui/vuu-utils\";\nimport {\n ChangeEventHandler,\n ComponentPropsWithoutRef,\n RefCallback,\n SyntheticEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { VuuTypeaheadInputProps } from \"./VuuTypeaheadInput\";\n\nconst NO_DATA_MATCH = [\"No matching data\"];\n\nexport type VuuTypeaheadInputHookProps = Pick<\n VuuTypeaheadInputProps,\n \"column\" | \"onCommit\" | \"suggestionProvider\" | \"table\"\n>;\n\nexport const useVuuTypeaheadInput = ({\n column,\n onCommit,\n suggestionProvider,\n table,\n}: VuuTypeaheadInputHookProps) => {\n const [value, setValue] = useState(\"\");\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement | null>(null);\n const [typeaheadValues, setTypeaheadValues] = useState<string[]>([]);\n const getSuggestions = suggestionProvider();\n\n const callbackRef = useCallback<RefCallback<HTMLDivElement>>((el) => {\n rootRef.current = el;\n }, []);\n\n useEffect(() => {\n if (table) {\n const vuuTable = getVuuTable(table);\n if (value) {\n const params: TypeaheadParams = value\n ? [vuuTable, column, value]\n : [vuuTable, column];\n getSuggestions(params)\n .then((suggestions) => {\n if (suggestions === false) {\n // TODO is this right\n setTypeaheadValues([]);\n } else if (suggestions.length === 0 && value) {\n setTypeaheadValues(NO_DATA_MATCH);\n } else {\n setTypeaheadValues(suggestions);\n }\n })\n .catch((err) => {\n console.error(\"Error getting suggestions\", err);\n });\n } else {\n setTypeaheadValues([]);\n }\n }\n }, [table, column, getSuggestions, value]);\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (evt) => {\n const { value: newValue } = evt.target;\n\n if (value === \"\" && newValue) {\n setOpen(true);\n const input = rootRef.current?.querySelector(\"input\");\n if (input) {\n // This is a workaround for the fact that ComboBox does not automatically\n // highlight first list itemn when items have been populated dynamically.\n // This has been raised as a bug.\n setTimeout(() => {\n dispatchKeyboardEvent(input, \"keydown\", \"ArrowUp\");\n }, 150);\n }\n } else if (newValue === \"\" && value) {\n // treat clear value as a commit event\n onCommit(evt, \"\");\n }\n\n setValue(newValue);\n };\n\n const handleSelectionChange = (\n evt: SyntheticEvent,\n [newSelected]: string[],\n ) => {\n console.log(`useVuuTypeahead handleSelectionChange ${newSelected}`);\n setValue(newSelected);\n onCommit(evt as SyntheticEvent<HTMLInputElement>, newSelected);\n };\n\n const handleOpenChange = (newOpen: boolean) => {\n if (newOpen && value === \"\") {\n // ignore this, don't open dropdown unless user has typed at least one character\n } else {\n setOpen(newOpen);\n }\n };\n\n const inputProps: ComponentPropsWithoutRef<\"input\"> = {\n autoComplete: \"off\",\n };\n\n return {\n inputProps,\n onChange: handleChange,\n onOpenChange: handleOpenChange,\n onSelectionChange: handleSelectionChange,\n open,\n ref: callbackRef,\n typeaheadValues,\n value,\n };\n};\n"],"names":["useState","useRef","useCallback","useEffect","getVuuTable","dispatchKeyboardEvent"],"mappings":"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"}
package/esm/index.js CHANGED
@@ -28,7 +28,7 @@ export { EditableLabel, NullEditAPI } from './editable-label/EditableLabel.js';
28
28
  export { ExpandoInput } from './expando-input/ExpandoInput.js';
29
29
  export { Icon } from './icon-button/Icon.js';
30
30
  export { IconButton } from './icon-button/IconButton.js';
31
- export { InstrumentPicker } from './instrument-picker/InstrumentPicker.js';
31
+ export { TablePicker } from './instrument-picker/TablePicker.js';
32
32
  export { InstrumentSearch } from './instrument-search/InstrumentSearch.js';
33
33
  export { ArrowDown, ArrowLeft, ArrowRight, ArrowUp, End, Enter, Escape, Home, PageDown, PageUp, Space, isCharacterKey, isNavigationKey } from './list/common-hooks/keyUtils.js';
34
34
  export { useCollapsibleGroups } from './list/common-hooks/useCollapsibleGroups.js';
@@ -49,7 +49,7 @@ export { ListItemGroup } from './list/ListItemGroup.js';
49
49
  export { useList } from './list/useList.js';
50
50
  export { RadioIcon } from './list/RadioIcon.js';
51
51
  export { MeasuredContainer } from './measured-container/MeasuredContainer.js';
52
- export { useMeasuredContainer } from './measured-container/useMeasuredContainer.js';
52
+ export { reduceSizeHeight, useMeasuredContainer } from './measured-container/useMeasuredContainer.js';
53
53
  export { OverflowContainer } from './overflow-container/OverflowContainer.js';
54
54
  export { NO_WRAPPED_ITEMS, applyOverflowClassToWrappedItems, correctForWrappedHighPriorityItems, correctForWrappedOverflowIndicator, getElementsMarkedAsWrapped, getNonWrappedAndWrappedItems, highPriorityItemsHaveWrappedButShouldNotHave, markElementAsWrapped, overflowIndicatorHasWrappedButShouldNotHave, removeOverflowIndicatorIfNoLongerNeeded, sortByScreenOrder, switchWrappedItemIntoView, unmarkItemsWhichAreNoLongerWrapped } from './overflow-container/overflow-utils.js';
55
55
  export { PriceTicker } from './price-ticker/PriceTicker.js';
@@ -0,0 +1,4 @@
1
+ var tablePickerCss = ".vuuTablePicker {\n border-radius: 6px;\n height: var(--salt-size-base);\n padding: 1px;\n box-sizing: content-box;\n}\n\n.vuuTablePicker-floating-table {\n border: solid 1px var(--salt-container-secondary-borderColor);\n border-radius: 4px;\n overflow: auto;\n padding: var(--salt-spacing-100) 0;\n z-index: var(--salt-zIndex-popout);\n}\n";
2
+
3
+ export { tablePickerCss as default };
4
+ //# sourceMappingURL=TablePicker.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TablePicker.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,119 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { Table } from '@vuu-ui/vuu-table';
3
+ import { useFloatingComponent, useIdMemo, Input } from '@salt-ds/core';
4
+ import { useComponentCssInjection } from '@salt-ds/styles';
5
+ import { useWindow } from '@salt-ds/window';
6
+ import cx from 'clsx';
7
+ import { forwardRef, useMemo } from 'react';
8
+ import { IconButton } from '../icon-button/IconButton.js';
9
+ import tablePickerCss from './TablePicker.css.js';
10
+ import { useTablePicker } from './useTablePicker.js';
11
+
12
+ const classBase = "vuuTablePicker";
13
+ const FloatingTable = forwardRef(
14
+ function FloatingTable2({ children, className, collapsed, open, ...props }, forwardedRef) {
15
+ const { Component: FloatingComponent } = useFloatingComponent();
16
+ return /* @__PURE__ */ jsx(
17
+ FloatingComponent,
18
+ {
19
+ className: cx(
20
+ `${classBase}-floating-table`,
21
+ {
22
+ [`${classBase}-collapsed`]: collapsed
23
+ },
24
+ className
25
+ ),
26
+ role: "listbox",
27
+ open,
28
+ ...props,
29
+ ref: forwardedRef,
30
+ children
31
+ }
32
+ );
33
+ }
34
+ );
35
+ const TablePicker = ({
36
+ TableProps,
37
+ onSelect,
38
+ rowToString,
39
+ schema,
40
+ searchColumns,
41
+ ...htmlAttributes
42
+ }) => {
43
+ const targetWindow = useWindow();
44
+ useComponentCssInjection({
45
+ testId: "vuu-table-picker",
46
+ css: tablePickerCss,
47
+ window: targetWindow
48
+ });
49
+ const tableId = useIdMemo();
50
+ const {
51
+ containerRef,
52
+ dataSource,
53
+ highlightedIndex,
54
+ floatingUIProps: { x, y, strategy, floating, reference },
55
+ inputProps,
56
+ interactionPropGetters: { getFloatingProps, getReferenceProps },
57
+ onKeyDown,
58
+ open,
59
+ tableConfig,
60
+ tableHandlers,
61
+ tableRef,
62
+ value,
63
+ width
64
+ } = useTablePicker({
65
+ TableProps,
66
+ rowToString,
67
+ onSelect,
68
+ schema,
69
+ searchColumns
70
+ });
71
+ const endAdornment = useMemo(
72
+ () => /* @__PURE__ */ jsx(
73
+ IconButton,
74
+ {
75
+ ...getReferenceProps(),
76
+ "data-embedded": true,
77
+ ref: reference,
78
+ icon: "chevron-down",
79
+ onKeyDown,
80
+ variant: "secondary"
81
+ }
82
+ ),
83
+ [getReferenceProps, onKeyDown, reference]
84
+ );
85
+ return /* @__PURE__ */ jsxs("div", { ...htmlAttributes, className: classBase, ref: containerRef, children: [
86
+ /* @__PURE__ */ jsx(Input, { ...inputProps, endAdornment, value }),
87
+ /* @__PURE__ */ jsx(
88
+ FloatingTable,
89
+ {
90
+ ...getFloatingProps(),
91
+ collapsed: !open,
92
+ id: tableId,
93
+ open,
94
+ left: x + 3,
95
+ position: strategy,
96
+ ref: floating,
97
+ top: y + 3,
98
+ children: /* @__PURE__ */ jsx(
99
+ Table,
100
+ {
101
+ ...tableHandlers,
102
+ config: tableConfig,
103
+ dataSource,
104
+ highlightedIndex,
105
+ maxViewportRowLimit: 10,
106
+ navigationStyle: "row",
107
+ ref: tableRef,
108
+ selectionModel: "single",
109
+ showColumnHeaders: false,
110
+ width: width - 3
111
+ }
112
+ )
113
+ }
114
+ )
115
+ ] });
116
+ };
117
+
118
+ export { TablePicker };
119
+ //# sourceMappingURL=TablePicker.js.map