@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.
- package/cjs/index.js +3 -2
- package/cjs/index.js.map +1 -1
- package/cjs/instrument-picker/TablePicker.css.js +6 -0
- package/cjs/instrument-picker/TablePicker.css.js.map +1 -0
- package/cjs/instrument-picker/TablePicker.js +121 -0
- package/cjs/instrument-picker/TablePicker.js.map +1 -0
- package/cjs/instrument-picker/useTablePicker.js +150 -0
- package/cjs/instrument-picker/useTablePicker.js.map +1 -0
- package/cjs/measured-container/useMeasuredContainer.js +21 -11
- package/cjs/measured-container/useMeasuredContainer.js.map +1 -1
- package/cjs/vuu-typeahead-input/useVuuTypeahead.js +3 -1
- package/cjs/vuu-typeahead-input/useVuuTypeahead.js.map +1 -1
- package/esm/index.js +2 -2
- package/esm/instrument-picker/TablePicker.css.js +4 -0
- package/esm/instrument-picker/TablePicker.css.js.map +1 -0
- package/esm/instrument-picker/TablePicker.js +119 -0
- package/esm/instrument-picker/TablePicker.js.map +1 -0
- package/esm/instrument-picker/useTablePicker.js +148 -0
- package/esm/instrument-picker/useTablePicker.js.map +1 -0
- package/esm/measured-container/useMeasuredContainer.js +21 -12
- package/esm/measured-container/useMeasuredContainer.js.map +1 -1
- package/esm/vuu-typeahead-input/useVuuTypeahead.js +3 -1
- package/esm/vuu-typeahead-input/useVuuTypeahead.js.map +1 -1
- package/package.json +7 -7
- package/types/instrument-picker/TablePicker.d.ts +10 -0
- package/types/instrument-picker/index.d.ts +1 -1
- package/types/instrument-picker/useTablePicker.d.ts +54 -0
- package/types/measured-container/useMeasuredContainer.d.ts +1 -0
- package/cjs/instrument-picker/InstrumentPicker.css.js +0 -6
- package/cjs/instrument-picker/InstrumentPicker.css.js.map +0 -1
- package/cjs/instrument-picker/InstrumentPicker.js +0 -111
- package/cjs/instrument-picker/InstrumentPicker.js.map +0 -1
- package/cjs/instrument-picker/SearchCell.css.js +0 -6
- package/cjs/instrument-picker/SearchCell.css.js.map +0 -1
- package/cjs/instrument-picker/SearchCell.js +0 -33
- package/cjs/instrument-picker/SearchCell.js.map +0 -1
- package/cjs/instrument-picker/useInstrumentPicker.js +0 -87
- package/cjs/instrument-picker/useInstrumentPicker.js.map +0 -1
- package/esm/instrument-picker/InstrumentPicker.css.js +0 -4
- package/esm/instrument-picker/InstrumentPicker.css.js.map +0 -1
- package/esm/instrument-picker/InstrumentPicker.js +0 -109
- package/esm/instrument-picker/InstrumentPicker.js.map +0 -1
- package/esm/instrument-picker/SearchCell.css.js +0 -4
- package/esm/instrument-picker/SearchCell.css.js.map +0 -1
- package/esm/instrument-picker/SearchCell.js +0 -31
- package/esm/instrument-picker/SearchCell.js.map +0 -1
- package/esm/instrument-picker/useInstrumentPicker.js +0 -85
- package/esm/instrument-picker/useInstrumentPicker.js.map +0 -1
- package/types/instrument-picker/InstrumentPicker.d.ts +0 -24
- 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
|
|
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.
|
|
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
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
|
22
|
-
width: width
|
|
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
|
|
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":"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"}
|
|
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
|
|
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,
|
|
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 {
|
|
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
|