Add MinMaxDisplay and MinMaxInput components for enhanced min/max value input and display functionality. Implement formatting and precision handling for better user experience in data entry and visualization.
This commit is contained in:
parent
aa1446b502
commit
bde1d5b896
66
src/components/Dashboard/common/MinMaxDisplay.jsx
Normal file
66
src/components/Dashboard/common/MinMaxDisplay.jsx
Normal file
@ -0,0 +1,66 @@
|
||||
import { Flex, Typography, Tag, Space } from 'antd'
|
||||
import PropTypes from 'prop-types'
|
||||
|
||||
const { Text } = Typography
|
||||
|
||||
const getPrecision = (step) => {
|
||||
if (step == null) return null
|
||||
const stepStr = String(step)
|
||||
const dotIndex = stepStr.indexOf('.')
|
||||
return dotIndex === -1 ? 0 : stepStr.length - dotIndex - 1
|
||||
}
|
||||
|
||||
const formatValue = (value, step) => {
|
||||
if (value == null || value === '') return null
|
||||
const parsed = parseFloat(value)
|
||||
if (Number.isNaN(parsed)) return null
|
||||
|
||||
const precision = getPrecision(step)
|
||||
return precision == null ? parsed.toString() : parsed.toFixed(precision)
|
||||
}
|
||||
|
||||
const MinMaxDisplay = ({ value, prefix = '', suffix = '', step }) => {
|
||||
const min = formatValue(value?.min, step)
|
||||
const max = formatValue(value?.max, step)
|
||||
|
||||
return (
|
||||
<Flex gap={'middle'} align='center' style={{ height: '100%' }}>
|
||||
<Flex wrap>
|
||||
<Text style={{ marginRight: 4 }}>
|
||||
{min != null ? (
|
||||
prefix + min + suffix
|
||||
) : (
|
||||
<Text type='secondary'>n/a</Text>
|
||||
)}
|
||||
</Text>
|
||||
<Space>
|
||||
<Tag>Min</Tag>
|
||||
</Space>
|
||||
</Flex>
|
||||
<Flex wrap>
|
||||
<Text style={{ marginRight: 4 }}>
|
||||
{max != null ? (
|
||||
prefix + max + suffix
|
||||
) : (
|
||||
<Text type='secondary'>n/a</Text>
|
||||
)}
|
||||
</Text>
|
||||
<Space>
|
||||
<Tag>Max</Tag>
|
||||
</Space>
|
||||
</Flex>
|
||||
</Flex>
|
||||
)
|
||||
}
|
||||
|
||||
MinMaxDisplay.propTypes = {
|
||||
value: PropTypes.shape({
|
||||
min: PropTypes.number,
|
||||
max: PropTypes.number
|
||||
}),
|
||||
prefix: PropTypes.string,
|
||||
suffix: PropTypes.string,
|
||||
step: PropTypes.number
|
||||
}
|
||||
|
||||
export default MinMaxDisplay
|
||||
65
src/components/Dashboard/common/MinMaxInput.jsx
Normal file
65
src/components/Dashboard/common/MinMaxInput.jsx
Normal file
@ -0,0 +1,65 @@
|
||||
import { Flex, InputNumber, Typography } from 'antd'
|
||||
import PropTypes from 'prop-types'
|
||||
|
||||
const { Text } = Typography
|
||||
|
||||
const MinMaxInput = ({
|
||||
value = {},
|
||||
onChange,
|
||||
prefix = '',
|
||||
suffix = '',
|
||||
min,
|
||||
max,
|
||||
step,
|
||||
disabled = false
|
||||
}) => {
|
||||
const handleChange = (field, val) => {
|
||||
if (!onChange) return
|
||||
onChange({ ...value, [field]: val })
|
||||
}
|
||||
|
||||
return (
|
||||
<Flex gap={'middle'} align='center' style={{ width: '100%' }}>
|
||||
<InputNumber
|
||||
addonBefore={<Text type='secondary'>Min:</Text>}
|
||||
value={value?.min}
|
||||
onChange={(val) => handleChange('min', val)}
|
||||
prefix={prefix}
|
||||
suffix={suffix}
|
||||
min={min}
|
||||
max={max}
|
||||
step={step}
|
||||
disabled={disabled}
|
||||
style={{ minWidth: 120, flex: 1 }}
|
||||
/>
|
||||
<InputNumber
|
||||
addonBefore={<Text type='secondary'>Max:</Text>}
|
||||
value={value?.max}
|
||||
onChange={(val) => handleChange('max', val)}
|
||||
prefix={prefix}
|
||||
suffix={suffix}
|
||||
min={min}
|
||||
max={max}
|
||||
step={step}
|
||||
disabled={disabled}
|
||||
style={{ minWidth: 120, flex: 1 }}
|
||||
/>
|
||||
</Flex>
|
||||
)
|
||||
}
|
||||
|
||||
MinMaxInput.propTypes = {
|
||||
value: PropTypes.shape({
|
||||
min: PropTypes.number,
|
||||
max: PropTypes.number
|
||||
}),
|
||||
onChange: PropTypes.func,
|
||||
prefix: PropTypes.string,
|
||||
suffix: PropTypes.string,
|
||||
min: PropTypes.number,
|
||||
max: PropTypes.number,
|
||||
step: PropTypes.number,
|
||||
disabled: PropTypes.bool
|
||||
}
|
||||
|
||||
export default MinMaxInput
|
||||
Loading…
x
Reference in New Issue
Block a user