in public/pages/CreateTransform/components/TransformOptions/Panels/PercentilePanel/PercentilePanel.tsx [17:83]
export default function PercentilePanel({ name, aggSelection, handleAggSelectionChange, closePopover }: PercentilePanelProps) {
const [percents, setPercents] = useState<{ label: string }[]>([]);
const [isInvalid, setInvalid] = useState(false);
const onChangePercents = (selectedPercent: { label: string }[]): void => {
setPercents(selectedPercent);
setInvalid(false);
};
const isValidPercent = (value: string) => {
// Only numbers between 0-100 including decimals. No spaces, numbers, or special characters.
const numericValue = parseFloat(value);
return numericValue >= 0.0 && numericValue <= 100.0;
};
const onCreateOption = (searchValue: string) => {
if (!isValidPercent(searchValue)) {
// Return false to explicitly reject the user's input.
return false;
}
const newOption = {
label: searchValue,
};
// Select the option.
setPercents([...percents, newOption]);
};
const onSearchChange = (searchValue: string) => {
if (!searchValue) {
setInvalid(false);
return;
}
setInvalid(!isValidPercent(searchValue));
};
return (
<EuiPanel>
<EuiFlexGroup gutterSize={"none"}>
<EuiFlexItem grow={false} style={{ width: 230 }}>
<EuiFormRow
fullWidth={true}
label="Percents"
helpText="Only numbers between 0-100 allowed."
isInvalid={isInvalid}
error={isInvalid ? "Invalid input" : undefined}
>
<EuiComboBox
fullWidth={true}
noSuggestions
selectedOptions={percents}
onChange={onChangePercents}
onCreateOption={onCreateOption}
isInvalid={isInvalid}
onSearchChange={onSearchChange}
/>
</EuiFormRow>
<EuiSpacer size="m" />
</EuiFlexItem>
<EuiFlexItem grow={false}></EuiFlexItem>
</EuiFlexGroup>
<EuiFlexGroup justifyContent={"flexEnd"} gutterSize={"m"}>
<EuiFlexItem grow={false}>
<EuiButton fullWidth={false} onClick={() => closePopover()} style={{ minWidth: 84 }}>