2024-04-11 00:11:38 +00:00
|
|
|
import { AutomationTestingProps } from '@/types';
|
|
|
|
|
2024-03-27 07:56:00 +00:00
|
|
|
import { InputLabeled } from '@@/form-components/Input/InputLabeled';
|
|
|
|
import { Checkbox } from '@@/form-components/Checkbox';
|
|
|
|
|
|
|
|
import { Range, isRange } from './types';
|
|
|
|
|
|
|
|
export function RangeOrNumberField({
|
|
|
|
value,
|
|
|
|
onChange,
|
|
|
|
disabled,
|
|
|
|
readOnly,
|
|
|
|
id,
|
|
|
|
label,
|
2024-04-11 00:11:38 +00:00
|
|
|
'data-cy': dataCy,
|
2024-03-27 07:56:00 +00:00
|
|
|
}: {
|
|
|
|
value: Range | number | undefined;
|
|
|
|
onChange: (value: Range | number | undefined) => void;
|
|
|
|
disabled?: boolean;
|
|
|
|
readOnly?: boolean;
|
|
|
|
id: string;
|
|
|
|
label: string;
|
2024-04-11 00:11:38 +00:00
|
|
|
} & AutomationTestingProps) {
|
2024-03-27 07:56:00 +00:00
|
|
|
return (
|
|
|
|
<div className="flex gap-2 items-center">
|
2024-04-11 00:11:38 +00:00
|
|
|
<RangeCheckbox value={value} onChange={onChange} data-cy={dataCy} />
|
2024-03-27 07:56:00 +00:00
|
|
|
{isRange(value) ? (
|
|
|
|
<RangeInput
|
|
|
|
value={value}
|
|
|
|
onChange={onChange}
|
|
|
|
label={label}
|
|
|
|
disabled={disabled}
|
|
|
|
readOnly={readOnly}
|
|
|
|
id={id}
|
2024-04-11 00:11:38 +00:00
|
|
|
data-cy={dataCy}
|
2024-03-27 07:56:00 +00:00
|
|
|
/>
|
|
|
|
) : (
|
|
|
|
<InputLabeled
|
|
|
|
size="small"
|
|
|
|
placeholder="e.g. 80"
|
|
|
|
className="w-1/2"
|
|
|
|
label={label}
|
|
|
|
disabled={disabled}
|
|
|
|
readOnly={readOnly}
|
|
|
|
id={id}
|
|
|
|
value={value || ''}
|
|
|
|
type="number"
|
|
|
|
onChange={(e) => onChange(getNumber(e.target.valueAsNumber))}
|
2024-04-11 00:11:38 +00:00
|
|
|
data-cy={dataCy}
|
2024-03-27 07:56:00 +00:00
|
|
|
/>
|
|
|
|
)}
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function RangeInput({
|
|
|
|
value,
|
|
|
|
onChange,
|
|
|
|
disabled,
|
|
|
|
readOnly,
|
|
|
|
id,
|
|
|
|
label,
|
2024-04-11 00:11:38 +00:00
|
|
|
'data-cy': dataCy,
|
2024-03-27 07:56:00 +00:00
|
|
|
}: {
|
|
|
|
value: Range;
|
|
|
|
onChange: (value: Range) => void;
|
|
|
|
disabled?: boolean;
|
|
|
|
readOnly?: boolean;
|
|
|
|
id: string;
|
|
|
|
label: string;
|
2024-04-11 00:11:38 +00:00
|
|
|
} & AutomationTestingProps) {
|
2024-03-27 07:56:00 +00:00
|
|
|
return (
|
|
|
|
<div className="flex items-center gap-2">
|
|
|
|
<label className="font-normal m-0">{label}</label>
|
|
|
|
<InputLabeled
|
|
|
|
label="from"
|
|
|
|
size="small"
|
|
|
|
value={value.start || ''}
|
|
|
|
onChange={(e) =>
|
|
|
|
handleChange({ start: getNumber(e.target.valueAsNumber) })
|
|
|
|
}
|
|
|
|
disabled={disabled}
|
|
|
|
readOnly={readOnly}
|
|
|
|
id={id}
|
|
|
|
type="number"
|
2024-04-11 00:11:38 +00:00
|
|
|
data-cy={`${dataCy}-start`}
|
2024-03-27 07:56:00 +00:00
|
|
|
/>
|
|
|
|
|
|
|
|
<InputLabeled
|
|
|
|
label="to"
|
|
|
|
size="small"
|
|
|
|
value={value.end || ''}
|
|
|
|
onChange={(e) =>
|
|
|
|
handleChange({ end: getNumber(e.target.valueAsNumber) })
|
|
|
|
}
|
|
|
|
disabled={disabled}
|
|
|
|
readOnly={readOnly}
|
|
|
|
id={id}
|
|
|
|
type="number"
|
2024-04-11 00:11:38 +00:00
|
|
|
data-cy={`${dataCy}-end`}
|
2024-03-27 07:56:00 +00:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
|
|
|
|
function handleChange(range: Partial<Range>) {
|
|
|
|
onChange({ ...value, ...range });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function getNumber(value: number) {
|
|
|
|
return Number.isNaN(value) ? 0 : value;
|
|
|
|
}
|
|
|
|
|
|
|
|
function RangeCheckbox({
|
|
|
|
value,
|
|
|
|
onChange,
|
2024-04-11 00:11:38 +00:00
|
|
|
'data-cy': dataCy,
|
2024-03-27 07:56:00 +00:00
|
|
|
}: {
|
|
|
|
value: Range | number | undefined;
|
|
|
|
onChange: (value: Range | number | undefined) => void;
|
2024-04-11 00:11:38 +00:00
|
|
|
} & AutomationTestingProps) {
|
2024-03-27 07:56:00 +00:00
|
|
|
const isValueRange = isRange(value);
|
|
|
|
return (
|
|
|
|
<Checkbox
|
|
|
|
label="range"
|
|
|
|
checked={isValueRange}
|
|
|
|
onChange={() => {
|
|
|
|
if (!isValueRange) {
|
|
|
|
onChange({ start: value || 0, end: value || 0 });
|
|
|
|
} else {
|
|
|
|
onChange(value.start);
|
|
|
|
}
|
|
|
|
}}
|
2024-04-11 00:11:38 +00:00
|
|
|
data-cy={`${dataCy}-range-checkbox`}
|
2024-03-27 07:56:00 +00:00
|
|
|
/>
|
|
|
|
);
|
|
|
|
}
|