@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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@colisweb/rescript-toolkit",
3
- "version": "4.11.0",
3
+ "version": "4.11.1",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "clean": "rescript clean",
@@ -13,7 +13,8 @@ module String = {
13
13
  }
14
14
 
15
15
  /**
16
- * normalize nfd -> replace by re remove split by commponents the accent letters and deletes the accent component only, leaving the un-accented letter
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
- // normalize nfd -> replace by re remove split by commponents the accent letters and deletes the accent component only, leaving the un-accented letter
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
- {options
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={() => {