mirror of
https://github.com/getredash/redash.git
synced 2026-03-23 22:00:10 -04:00
* created util to estimate reasonable width for dropdown
* removed unused import
* improved calculation of item percentile
* added getItemOfPercentileLength to relevant spots
* added getItemOfPercentileLength to relevant spots
* Added missing import
* created custom select element
* added check for property path
* removed uses of percentile util
* gave up on getting element reference
* finished testing Select component
* removed unused imports
* removed older uses of Option component
* added canvas calculation
* removed minWidth from Select
* improved calculation
* added fallbacks
* added estimated offset
* removed leftovers 😅
* replaced to percentiles to max value
* switched to memo and renamed component
* proper useMemo syntax
* Update client/app/components/Select.tsx
Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
* created custom restrictive types
* added quick const
* fixed style
* fixed generics
* added pos absolute to fix percy
* removed custom select from ParameterMappingInput
* applied prettier
* Revert "added pos absolute to fix percy"
This reverts commit 4daf1d4bef.
* Pin Percy version to 0.24.3
* Update client/app/components/ParameterMappingInput.jsx
Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
* renamed Select.jsx to SelectWithVirtualScroll
Co-authored-by: Gabriel Dutra <nesk.frz@gmail.com>
39 lines
1.1 KiB
TypeScript
39 lines
1.1 KiB
TypeScript
import React, { useMemo } from "react";
|
|
import { maxBy } from "lodash";
|
|
import AntdSelect, { SelectProps, LabeledValue } from "antd/lib/select";
|
|
import { calculateTextWidth } from "@/lib/calculateTextWidth";
|
|
|
|
const MIN_LEN_FOR_VIRTUAL_SCROLL = 400;
|
|
|
|
interface VirtualScrollLabeledValue extends LabeledValue {
|
|
label: string;
|
|
}
|
|
|
|
interface VirtualScrollSelectProps extends SelectProps<string> {
|
|
options: Array<VirtualScrollLabeledValue>;
|
|
}
|
|
function SelectWithVirtualScroll({ options, ...props }: VirtualScrollSelectProps): JSX.Element {
|
|
const dropdownMatchSelectWidth = useMemo<number | boolean>(() => {
|
|
if (options && options.length > MIN_LEN_FOR_VIRTUAL_SCROLL) {
|
|
const largestOpt = maxBy(options, "label.length");
|
|
|
|
if (largestOpt) {
|
|
const offset = 40;
|
|
const optionText = largestOpt.label;
|
|
const width = calculateTextWidth(optionText);
|
|
if (width) {
|
|
return width + offset;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}, [options]);
|
|
|
|
return <AntdSelect<string> dropdownMatchSelectWidth={dropdownMatchSelectWidth} options={options} {...props} />;
|
|
}
|
|
|
|
export default SelectWithVirtualScroll;
|