@@ -2,12 +2,12 @@ import React from 'react';
2
2
import useMultiselectContext , {
3
3
MultiselectContextProvider
4
4
} from './multiselect-context' ;
5
- import ValidationMessage from '~/components/validation-message/validation-message' ;
5
+ import ValidationMessage , { ElementWithValidationMessage }
6
+ from '~/components/validation-message/validation-message' ;
6
7
import './multiselect.scss' ;
7
8
8
- type ElementRef = React . MutableRefObject <
9
- HTMLInputElement | HTMLSelectElement | null
10
- > ;
9
+ type ValidatableElementRef = React . MutableRefObject < ElementWithValidationMessage & HTMLInputElement > ;
10
+ type SelectRef = React . MutableRefObject < HTMLSelectElement > ;
11
11
12
12
function HiddenSelect ( {
13
13
name,
@@ -16,7 +16,7 @@ function HiddenSelect({
16
16
} : {
17
17
name : string ;
18
18
required ?: boolean ;
19
- elementRef : ElementRef ;
19
+ elementRef : SelectRef ;
20
20
} ) {
21
21
const { selectedItems} = useMultiselectContext ( ) ;
22
22
@@ -25,7 +25,7 @@ function HiddenSelect({
25
25
multiple
26
26
name = { name }
27
27
required = { required }
28
- ref = { elementRef as React . MutableRefObject < HTMLSelectElement > }
28
+ ref = { elementRef }
29
29
hidden
30
30
>
31
31
{ selectedItems . map ( ( i ) => (
@@ -42,7 +42,7 @@ function HiddenSingleField({
42
42
} : {
43
43
name : string ;
44
44
required ?: boolean ;
45
- elementRef : ElementRef ;
45
+ elementRef : ValidatableElementRef ;
46
46
} ) {
47
47
const { selectedItems} = useMultiselectContext ( ) ;
48
48
const value = selectedItems . map ( ( i ) => i . value ) . join ( ';' ) ;
@@ -53,13 +53,13 @@ function HiddenSingleField({
53
53
className = "hidden-input"
54
54
name = { name }
55
55
required = { required }
56
- ref = { elementRef as React . MutableRefObject < HTMLInputElement > }
56
+ ref = { elementRef }
57
57
value = { value }
58
58
/>
59
59
) ;
60
60
}
61
61
62
- function MSValidationMessage ( { elementRef} : { elementRef : ElementRef } ) {
62
+ function MSValidationMessage ( { elementRef} : { elementRef : ValidatableElementRef } ) {
63
63
const { selectedItems} = useMultiselectContext ( ) ;
64
64
65
65
return (
@@ -81,6 +81,17 @@ function useOnChangeHandler(onChange?: (items: unknown[]) => void) {
81
81
// Exporting here for convenience
82
82
export { MultiselectContextProvider , useMultiselectContext } ;
83
83
84
+ function HiddenField ( { oneField, name, required, elementRef} : {
85
+ oneField ?: boolean ;
86
+ name : string ;
87
+ required ?: boolean ;
88
+ elementRef : React . MutableRefObject < HTMLElement | null >
89
+ } ) {
90
+ return oneField ?
91
+ < HiddenSingleField { ...{ name, required} } elementRef = { elementRef as ValidatableElementRef } /> :
92
+ < HiddenSelect name = { name } required = { required } elementRef = { elementRef as SelectRef } /> ;
93
+ }
94
+
84
95
export default function Multiselect ( {
85
96
name,
86
97
required,
@@ -93,17 +104,16 @@ export default function Multiselect({
93
104
oneField ?: boolean ;
94
105
onChange ?: Parameters < typeof useOnChangeHandler > [ 0 ] ;
95
106
} > ) {
96
- const elementRef = React . useRef < HTMLInputElement | HTMLSelectElement > ( null ) ;
97
- const HiddenField = oneField ? HiddenSingleField : HiddenSelect ;
107
+ const elementRef = React . useRef < ElementWithValidationMessage | HTMLSelectElement > ( null ) ;
98
108
99
109
useOnChangeHandler ( onChange ) ;
100
110
return (
101
111
< React . Fragment >
102
112
< div className = "multiselect" >
103
- { name && < HiddenField { ...{ name, required, elementRef} } /> }
113
+ { name && < HiddenField { ...{ oneField , name, required, elementRef} } /> }
104
114
{ children }
105
115
</ div >
106
- < MSValidationMessage elementRef = { elementRef } />
116
+ < MSValidationMessage elementRef = { elementRef as ValidatableElementRef } />
107
117
</ React . Fragment >
108
118
) ;
109
119
}
0 commit comments