select.js
2.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import React, {useEffect, useRef} from 'react';
import '@wpmudev/shared-ui/js/select2.full';
const {__} = wp.i18n;
export function Select(props) {
let multiple = props.multiple !== undefined ? props.multiple : false;
const selectElement = useRef(null);
useEffect(() => {
let $el = selectElement.current;
if ($el !== null) {
jQuery(`#${selectElement.current.id}`).SUIselect2(
suiSelectArgs()
).on('change', function (e) {
handleChange(e);
});
jQuery(`#${selectElement.current.id}`).val(props.selected).trigger('change');
}
}, []);
const suiSelectArgs = () => {
let params = {
dropdownCssClass: 'sui-select-dropdown',
},
search = props.search !== undefined && props.search;
if (!search) {
params['minimumResultsForSearch'] = 'Infinity';
}
return params;
}
const handleChange = (e) => {
if (props.multiple) {
let selectedOptions = [];
for (var option of e.currentTarget.options) {
if (option.selected) {
selectedOptions.push(option.value);
}
}
if (props.callback) {
props.callback(selectedOptions);
}
} else {
if (props.callback) {
props.callback(e.currentTarget.value)
}
}
}
return (
<div className="sui-form-field">
{props.label && <label className="sui-label">{props.label}</label>}
<select
id={props.id}
className={`sui-select ${props.classes}`}
ref={selectElement}
multiple={multiple}
data-theme={props.theme}
>
{props.children}
</select>
{props.description &&
<div className="sui-description" dangerouslySetInnerHTML={{__html: props.description}}/>}
</div>
)
}