Enhance FilterSidebar with dynamic field select sizing
Some checks reported errors
farmcontrol/farmcontrol-ui/pipeline/head Something is wrong with the build of this commit
Some checks reported errors
farmcontrol/farmcontrol-ui/pipeline/head Something is wrong with the build of this commit
- Introduced a new FieldSelectLabel component to dynamically size select fields based on the longest label, improving layout consistency. - Updated FilterSidebar to utilize the FieldSelectLabel for better visual alignment of select options. - Adjusted CSS styles for the filter sidebar field selects to ensure proper width handling.
This commit is contained in:
parent
ca74cce3b9
commit
72c5ee1b91
@ -1131,3 +1131,11 @@ span.ant-skeleton-input.ant-skeleton-input-sm.text-skeleton {
|
|||||||
top: -16px !important;
|
top: -16px !important;
|
||||||
bottom: -24px !important;
|
bottom: -24px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Size FilterSidebar field selects to the longest label (via labelRender sizer). */
|
||||||
|
.filter-sidebar-field-select.ant-select {
|
||||||
|
width: max-content;
|
||||||
|
}
|
||||||
|
.filter-sidebar-field-select .ant-select-selector {
|
||||||
|
width: max-content !important;
|
||||||
|
}
|
||||||
|
|||||||
@ -11,6 +11,36 @@ import {
|
|||||||
import MissingPlaceholder from './MissingPlaceholder'
|
import MissingPlaceholder from './MissingPlaceholder'
|
||||||
import BinIcon from '../../Icons/BinIcon'
|
import BinIcon from '../../Icons/BinIcon'
|
||||||
|
|
||||||
|
const hiddenSizerStyle = {
|
||||||
|
gridArea: '1 / 1',
|
||||||
|
visibility: 'hidden',
|
||||||
|
whiteSpace: 'nowrap'
|
||||||
|
}
|
||||||
|
|
||||||
|
const FieldSelectLabel = ({ label, options }) => (
|
||||||
|
<span style={{ display: 'inline-grid' }}>
|
||||||
|
<span aria-hidden style={hiddenSizerStyle}>
|
||||||
|
Field
|
||||||
|
</span>
|
||||||
|
{options.map((option) => (
|
||||||
|
<span key={option.value} aria-hidden style={hiddenSizerStyle}>
|
||||||
|
{option.label}
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
<span style={{ gridArea: '1 / 1', whiteSpace: 'nowrap' }}>{label}</span>
|
||||||
|
</span>
|
||||||
|
)
|
||||||
|
|
||||||
|
FieldSelectLabel.propTypes = {
|
||||||
|
label: PropTypes.node,
|
||||||
|
options: PropTypes.arrayOf(
|
||||||
|
PropTypes.shape({
|
||||||
|
label: PropTypes.node,
|
||||||
|
value: PropTypes.string
|
||||||
|
})
|
||||||
|
).isRequired
|
||||||
|
}
|
||||||
|
|
||||||
const FilterSidebar = ({
|
const FilterSidebar = ({
|
||||||
type,
|
type,
|
||||||
filter = {},
|
filter = {},
|
||||||
@ -169,8 +199,12 @@ const FilterSidebar = ({
|
|||||||
value={row.field || undefined}
|
value={row.field || undefined}
|
||||||
onChange={(v) => changeField(row.field, v)}
|
onChange={(v) => changeField(row.field, v)}
|
||||||
options={availableOptions(row.field)}
|
options={availableOptions(row.field)}
|
||||||
style={{ minWidth: 80 }}
|
|
||||||
allowClear={false}
|
allowClear={false}
|
||||||
|
labelRender={({ label }) => (
|
||||||
|
<FieldSelectLabel label={label} options={fieldOptions} />
|
||||||
|
)}
|
||||||
|
style={{ flexShrink: 0 }}
|
||||||
|
classNames={{ root: 'filter-sidebar-field-select' }}
|
||||||
/>
|
/>
|
||||||
<FilterInput
|
<FilterInput
|
||||||
placeholder='Value'
|
placeholder='Value'
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user