@@ -16,6 +16,7 @@ import { CaretDown, CaretUp, MagnifyingGlass, XCircle } from '@phosphor-icons/re
16
16
interface Option {
17
17
label : string ;
18
18
value : string ;
19
+ disabled ?: boolean ;
19
20
}
20
21
21
22
interface BoemlySelectProps {
@@ -73,33 +74,43 @@ export const BoemlySelect: React.FC<BoemlySelectProps> = ({
73
74
} , [ isDisabled ] ) ;
74
75
75
76
// Handle selecting an option
76
- const handleOptionSelect = ( optionValue : string ) => {
77
+ const handleOptionSelect = ( optionValue : string , isOptionDisabled : boolean ) => {
78
+ if ( isOptionDisabled ) return ;
77
79
if ( isMultiple ) {
78
80
const isAlreadySelected = selectedOptions . includes ( optionValue ) ;
79
81
const newSelectedOptions = isAlreadySelected
80
82
? selectedOptions . filter ( ( val ) => val !== optionValue )
81
83
: [ ...selectedOptions , optionValue ] ;
82
84
83
85
setSelectedOptions ( newSelectedOptions ) ;
84
- onChange ?.( newSelectedOptions ) ;
86
+ if ( onChange ) {
87
+ onChange ( newSelectedOptions ) ;
88
+ }
85
89
} else {
86
90
setSelectedOptions ( [ optionValue ] ) ;
87
- onChange ?.( optionValue ) ;
91
+ if ( onChange ) {
92
+ onChange ( optionValue ) ;
93
+ }
88
94
setIsOpen ( false ) ;
89
95
}
90
96
setSearchTerm ( '' ) ;
91
97
} ;
92
98
93
- const allOptionValues = useMemo ( ( ) => options . map ( ( option ) => option . value ) , [ options ] ) ;
94
-
95
99
const onSelectAll = useCallback ( ( ) => {
96
- setSelectedOptions ( allOptionValues ) ;
97
- onChange ?.( allOptionValues ) ;
98
- } , [ allOptionValues , onChange ] ) ;
100
+ const enabledOptions = options
101
+ . filter ( ( option ) => ! option . disabled )
102
+ . map ( ( option ) => option . value ) ;
103
+ setSelectedOptions ( enabledOptions ) ;
104
+ if ( onChange ) {
105
+ onChange ( enabledOptions ) ;
106
+ }
107
+ } , [ options , onChange ] ) ;
99
108
100
109
const onClearAll = useCallback ( ( ) => {
101
110
setSelectedOptions ( [ ] ) ;
102
- onChange ?.( [ ] ) ;
111
+ if ( onChange ) {
112
+ onChange ( [ ] ) ;
113
+ }
103
114
} , [ onChange ] ) ;
104
115
105
116
return (
@@ -179,26 +190,28 @@ export const BoemlySelect: React.FC<BoemlySelectProps> = ({
179
190
overflowY = "auto"
180
191
>
181
192
{ filteredOptions . length > 0 ? (
182
- filteredOptions . map ( ( option ) => (
193
+ filteredOptions . map ( ( { value , label , disabled = false } ) => (
183
194
< Flex
184
- key = { option . value }
195
+ key = { value }
185
196
width = "100%"
186
197
p = "2"
187
198
align = "center"
188
199
justify = "space-between"
189
- onClick = { ( ) => handleOptionSelect ( option . value ) }
190
- cursor = "pointer"
191
- _hover = { { bg : 'gray.100' } }
200
+ onClick = { ( ) => handleOptionSelect ( value , disabled ) }
201
+ cursor = { disabled ? 'not-allowed' : 'pointer' }
202
+ _hover = { disabled ? { } : { bg : 'gray.100' } }
203
+ opacity = { disabled ? 0.5 : 1 }
192
204
>
193
- < Text > { option . label } </ Text >
205
+ < Text > { label } </ Text >
194
206
{ isMultiple ? (
195
207
< Checkbox
196
- isChecked = { selectedOptions . includes ( option . value ) }
208
+ isChecked = { selectedOptions . includes ( value ) }
197
209
pointerEvents = "none"
198
210
iconColor = "black"
211
+ isDisabled = { disabled }
199
212
/>
200
213
) : (
201
- selectedOptions . includes ( option . value ) && < XCircle size = { 16 } />
214
+ selectedOptions . includes ( value ) && < XCircle size = { 16 } />
202
215
) }
203
216
</ Flex >
204
217
) )
0 commit comments