@colisweb/rescript-toolkit 4.11.0 → 4.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -13,7 +13,8 @@ module String = {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
16
|
+
*Normalize NFD*: replace by re remove split by commponents the accent letters
|
|
17
|
+
and deletes the accent component only, leaving the un-accented letter
|
|
17
18
|
*/
|
|
18
19
|
let normalizeForSearch = str => {
|
|
19
20
|
str
|
|
@@ -35,6 +35,54 @@ module Footer = {
|
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
module Options = {
|
|
39
|
+
@react.component
|
|
40
|
+
let make = (~options, ~deferredSearch, ~itemClassName, ~setSelectedOptions, ~selectedOptions) => {
|
|
41
|
+
options
|
|
42
|
+
->Array.keep(({label}) =>
|
|
43
|
+
deferredSearch == "" ||
|
|
44
|
+
label->Toolkit__Primitives.String.normalizeForSearch->Js.String2.includes(deferredSearch)
|
|
45
|
+
)
|
|
46
|
+
->Array.mapWithIndex((i, item) => {
|
|
47
|
+
let {label, value} = item
|
|
48
|
+
|
|
49
|
+
<div
|
|
50
|
+
key={`multiselectoption-${label}-${value}-${i->Int.toString}`}
|
|
51
|
+
className={cx([
|
|
52
|
+
"group flex flex-row items-center gap-2 pt-3 text-left relative",
|
|
53
|
+
i > 0 ? "mt-3" : "",
|
|
54
|
+
itemClassName,
|
|
55
|
+
])}>
|
|
56
|
+
<Toolkit__Ui_Checkbox
|
|
57
|
+
value
|
|
58
|
+
className="w-full flex-shrink-0 relative"
|
|
59
|
+
checked={selectedOptions->Array.some(item => item.label == label && item.value == value)}
|
|
60
|
+
onChange={(checked, _value) => {
|
|
61
|
+
if checked {
|
|
62
|
+
setSelectedOptions(selectedOptions => {
|
|
63
|
+
let value = selectedOptions->Array.concat([item])
|
|
64
|
+
|
|
65
|
+
value
|
|
66
|
+
})
|
|
67
|
+
} else {
|
|
68
|
+
setSelectedOptions(selectedOptions => {
|
|
69
|
+
let value =
|
|
70
|
+
selectedOptions->Array.keep(
|
|
71
|
+
selectedItem => selectedItem.value != value && selectedItem.label != label,
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
value
|
|
75
|
+
})
|
|
76
|
+
}
|
|
77
|
+
}}>
|
|
78
|
+
{item.itemLabel->Option.getWithDefault(label->React.string)}
|
|
79
|
+
</Toolkit__Ui_Checkbox>
|
|
80
|
+
</div>
|
|
81
|
+
})
|
|
82
|
+
->React.array
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
38
86
|
@react.component
|
|
39
87
|
let make = (
|
|
40
88
|
~options: options,
|
|
@@ -52,6 +100,7 @@ let make = (
|
|
|
52
100
|
let (selectedOptions, setSelectedOptions) = React.useState(() => defaultValue)
|
|
53
101
|
let previousDefaultValue = Toolkit__Hooks.usePrevious(defaultValue)
|
|
54
102
|
let (search, setSearch) = React.useState(() => "")
|
|
103
|
+
let deferredSearch = React.useDeferredValue(search)
|
|
55
104
|
let allowFilter = options->Array.length > 5 && allowFilter
|
|
56
105
|
|
|
57
106
|
React.useEffect2(() => {
|
|
@@ -123,66 +172,13 @@ let make = (
|
|
|
123
172
|
value={search}
|
|
124
173
|
onChange={event => {
|
|
125
174
|
let target = event->ReactEvent.Form.currentTarget
|
|
126
|
-
|
|
127
|
-
setSearch(_ =>
|
|
128
|
-
target["value"]
|
|
129
|
-
->Js.String2.toLowerCase
|
|
130
|
-
->Js.String2.normalizeByForm("NFD")
|
|
131
|
-
->Js.String2.replaceByRe(%re("/[\u0300-\u036f]/g"), "")
|
|
132
|
-
)
|
|
175
|
+
|
|
176
|
+
setSearch(_ => target["value"]->Toolkit__Primitives.String.normalizeForSearch)
|
|
133
177
|
}}
|
|
134
178
|
/>
|
|
135
179
|
</div>
|
|
136
180
|
: React.null}
|
|
137
|
-
|
|
138
|
-
->Array.keep(({label}) =>
|
|
139
|
-
// normalize nfd -> replace by re remove split by commponents the accent letters and deletes the accent component only, leaving the un-accented letter
|
|
140
|
-
search == "" ||
|
|
141
|
-
label
|
|
142
|
-
->Js.String2.toLowerCase
|
|
143
|
-
->Js.String2.normalizeByForm("NFD")
|
|
144
|
-
->Js.String2.replaceByRe(%re("/[\u0300-\u036f]/g"), "")
|
|
145
|
-
->Js.String2.includes(search)
|
|
146
|
-
)
|
|
147
|
-
->Array.mapWithIndex((i, item) => {
|
|
148
|
-
let {label, value} = item
|
|
149
|
-
|
|
150
|
-
<div
|
|
151
|
-
key={`multiselectoption-${label}-${value}-${i->Int.toString}`}
|
|
152
|
-
className={cx([
|
|
153
|
-
"group flex flex-row items-center gap-2 pt-3 text-left relative",
|
|
154
|
-
i > 0 ? "mt-3" : "",
|
|
155
|
-
itemClassName,
|
|
156
|
-
])}>
|
|
157
|
-
<Toolkit__Ui_Checkbox
|
|
158
|
-
value
|
|
159
|
-
className="w-full flex-shrink-0 relative"
|
|
160
|
-
checked={selectedOptions->Array.some(item =>
|
|
161
|
-
item.label == label && item.value == value
|
|
162
|
-
)}
|
|
163
|
-
onChange={(checked, _value) => {
|
|
164
|
-
if checked {
|
|
165
|
-
setSelectedOptions(selectedOptions => {
|
|
166
|
-
let value = selectedOptions->Array.concat([item])
|
|
167
|
-
|
|
168
|
-
value
|
|
169
|
-
})
|
|
170
|
-
} else {
|
|
171
|
-
setSelectedOptions(selectedOptions => {
|
|
172
|
-
let value =
|
|
173
|
-
selectedOptions->Array.keep(
|
|
174
|
-
selectedItem => selectedItem.value != value && selectedItem.label != label,
|
|
175
|
-
)
|
|
176
|
-
|
|
177
|
-
value
|
|
178
|
-
})
|
|
179
|
-
}
|
|
180
|
-
}}>
|
|
181
|
-
{item.itemLabel->Option.getWithDefault(label->React.string)}
|
|
182
|
-
</Toolkit__Ui_Checkbox>
|
|
183
|
-
</div>
|
|
184
|
-
})
|
|
185
|
-
->React.array}
|
|
181
|
+
<Options deferredSearch options setSelectedOptions selectedOptions itemClassName />
|
|
186
182
|
</div>
|
|
187
183
|
<Footer
|
|
188
184
|
onCancel={() => {
|