Merge branch 'fix/dashboard' into 'development'

[FIX/FE] Fixing Select Input Component UI

See merge request mbugroup/lti-web-client!231
This commit is contained in:
Rivaldi A N S
2026-01-21 09:21:28 +00:00
3 changed files with 131 additions and 70 deletions
+6
View File
@@ -312,6 +312,12 @@ const SelectInput = <T extends OptionType>(props: SelectInputProps<T>) => {
} }
styles={{ styles={{
menuPortal: (base) => ({ ...base, zIndex: 9999 }), menuPortal: (base) => ({ ...base, zIndex: 9999 }),
multiValue(base) {
return {
...base,
borderRadius: '8px',
};
},
}} }}
onMenuScrollToBottom={onMenuScrollToBottom} onMenuScrollToBottom={onMenuScrollToBottom}
/> />
+1 -1
View File
@@ -40,7 +40,7 @@ const CheckboxOption = <
type='checkbox' type='checkbox'
checked={isSelected} checked={isSelected}
onChange={() => null} onChange={() => null}
className='checkbox checkbox-sm checkbox-primary pointer-events-none' className='checkbox checkbox-sm rounded checkbox-primary pointer-events-none'
/> />
<label className='cursor-pointer flex-1 select-none'>{label}</label> <label className='cursor-pointer flex-1 select-none'>{label}</label>
</div> </div>
@@ -38,6 +38,8 @@ import Dropdown from '@/components/Dropdown';
import Menu from '@/components/menu/Menu'; import Menu from '@/components/menu/Menu';
import MenuItem from '@/components/menu/MenuItem'; import MenuItem from '@/components/menu/MenuItem';
import { useDashboardStore } from '@/stores/dashboard'; import { useDashboardStore } from '@/stores/dashboard';
import SelectInputRadio from '@/components/input/SelectInputRadio';
import SelectInputCheckbox from '@/components/input/SelectInputCheckbox';
// Helper function to normalize values to array // Helper function to normalize values to array
const normalizeToArray = ( const normalizeToArray = (
@@ -413,7 +415,7 @@ const DashboardProduction = () => {
{formik.values.analysisMode === 'COMPARISON' && ( {formik.values.analysisMode === 'COMPARISON' && (
<div className='px-4'> <div className='px-4'>
<SelectInput <SelectInputRadio
label='Compared By' label='Compared By'
value={comparisonTypeOptions.find( value={comparisonTypeOptions.find(
(option) => option.value === formik.values.comparisonType (option) => option.value === formik.values.comparisonType
@@ -437,7 +439,10 @@ const DashboardProduction = () => {
{/* Location */} {/* Location */}
<div className='px-4'> <div className='px-4'>
<SelectInput {comparisonTypeOptions.find(
(option) => option.value === formik.values.comparisonType
)?.value === 'FARM' ? (
<SelectInputCheckbox
label='Farm' label='Farm'
value={formik.values.location} value={formik.values.location}
onInputChange={setInputValueLocation} onInputChange={setInputValueLocation}
@@ -453,16 +458,34 @@ const DashboardProduction = () => {
errorMessage={formik.errors.location as string} errorMessage={formik.errors.location as string}
options={locationOptions} options={locationOptions}
isLoading={isLoadingLocationOptions} isLoading={isLoadingLocationOptions}
isMulti={
comparisonTypeOptions.find(
(option) => option.value === formik.values.comparisonType
)?.value === 'FARM'
}
isError={ isError={
Boolean(formik.errors.location) && Boolean(formik.errors.location) &&
Boolean(formik.touched.location) Boolean(formik.touched.location)
} }
/> />
) : (
<SelectInputRadio
label='Farm'
value={formik.values.location as OptionType}
onInputChange={setInputValueLocation}
onMenuScrollToBottom={loadMoreLocation}
onChange={(selected) => {
formik.setFieldValue('location', selected);
// Update selectedLocationIds for kandang filter
setSelectedLocationIds(normalizeToArray(selected));
// Reset dependent fields when location changes
formik.setFieldValue('flock', []);
formik.setFieldValue('kandang', []);
}}
errorMessage={formik.errors.location as string}
options={locationOptions}
isLoading={isLoadingLocationOptions}
isError={
Boolean(formik.errors.location) &&
Boolean(formik.touched.location)
}
/>
)}
</div> </div>
{/* Flock */} {/* Flock */}
@@ -474,9 +497,12 @@ const DashboardProduction = () => {
) )
) && ( ) && (
<div className='px-4'> <div className='px-4'>
<SelectInput {comparisonTypeOptions.find(
(option) => option.value === formik.values.comparisonType
)?.value === 'FLOCK' ? (
<SelectInputCheckbox
label='Flock' label='Flock'
value={formik.values.flock} value={formik.values.flock as OptionType[]}
onChange={(selected) => onChange={(selected) =>
formik.setFieldValue('flock', selected) formik.setFieldValue('flock', selected)
} }
@@ -485,16 +511,29 @@ const DashboardProduction = () => {
onMenuScrollToBottom={loadMoreFlock} onMenuScrollToBottom={loadMoreFlock}
options={flockOptions} options={flockOptions}
isLoading={isLoadingFlockOptions} isLoading={isLoadingFlockOptions}
isMulti={
comparisonTypeOptions.find(
(option) => option.value === formik.values.comparisonType
)?.value === 'FLOCK'
}
isError={ isError={
Boolean(formik.errors.flock) && Boolean(formik.errors.flock) &&
Boolean(formik.touched.flock) Boolean(formik.touched.flock)
} }
/> />
) : (
<SelectInputRadio
label='Flock'
value={formik.values.flock as OptionType}
onChange={(selected) =>
formik.setFieldValue('flock', selected)
}
errorMessage={formik.errors.flock as string}
onInputChange={setInputValueFlock}
onMenuScrollToBottom={loadMoreFlock}
options={flockOptions}
isLoading={isLoadingFlockOptions}
isError={
Boolean(formik.errors.flock) &&
Boolean(formik.touched.flock)
}
/>
)}
</div> </div>
)} )}
@@ -504,9 +543,12 @@ const DashboardProduction = () => {
!(formik.values.comparisonType === 'KANDANG') !(formik.values.comparisonType === 'KANDANG')
) && ( ) && (
<div className='px-4'> <div className='px-4'>
<SelectInput {comparisonTypeOptions.find(
(option) => option.value === formik.values.comparisonType
)?.value === 'KANDANG' ? (
<SelectInputCheckbox
label='Kandang' label='Kandang'
value={formik.values.kandang} value={formik.values.kandang as OptionType[]}
onChange={(selected) => onChange={(selected) =>
formik.setFieldValue('kandang', selected) formik.setFieldValue('kandang', selected)
} }
@@ -515,16 +557,29 @@ const DashboardProduction = () => {
onMenuScrollToBottom={loadMoreKandang} onMenuScrollToBottom={loadMoreKandang}
options={kandangOptions} options={kandangOptions}
isLoading={isLoadingKandangOptions} isLoading={isLoadingKandangOptions}
isMulti={
comparisonTypeOptions.find(
(option) => option.value === formik.values.comparisonType
)?.value === 'KANDANG'
}
isError={ isError={
Boolean(formik.errors.kandang) && Boolean(formik.errors.kandang) &&
Boolean(formik.touched.kandang) Boolean(formik.touched.kandang)
} }
/> />
) : (
<SelectInputRadio
label='Kandang'
value={formik.values.kandang as OptionType}
onChange={(selected) =>
formik.setFieldValue('kandang', selected)
}
errorMessage={formik.errors.kandang as string}
onInputChange={setInputValueKandang}
onMenuScrollToBottom={loadMoreKandang}
options={kandangOptions}
isLoading={isLoadingKandangOptions}
isError={
Boolean(formik.errors.kandang) &&
Boolean(formik.touched.kandang)
}
/>
)}
</div> </div>
)} )}