@colisweb/rescript-toolkit 2.32.0 → 2.33.2
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/bsconfig.json
CHANGED
|
@@ -34,7 +34,11 @@
|
|
|
34
34
|
"rescript-react-update",
|
|
35
35
|
"restorative"
|
|
36
36
|
],
|
|
37
|
-
"ppx-flags": [
|
|
37
|
+
"ppx-flags": [
|
|
38
|
+
"decco/ppx",
|
|
39
|
+
"lenses-ppx/ppx",
|
|
40
|
+
"res-react-intl/ppx"
|
|
41
|
+
],
|
|
38
42
|
"refmt": 3,
|
|
39
43
|
"warnings": {
|
|
40
44
|
"number": "-44-30-32",
|
|
@@ -46,4 +50,4 @@
|
|
|
46
50
|
"-open Belt",
|
|
47
51
|
"-open Cx"
|
|
48
52
|
]
|
|
49
|
-
}
|
|
53
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@colisweb/rescript-toolkit",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.33.2",
|
|
4
4
|
"scripts": {
|
|
5
5
|
"clean": "rescript clean",
|
|
6
6
|
"build": "rescript build",
|
|
@@ -87,6 +87,7 @@
|
|
|
87
87
|
"react": "17.0.2",
|
|
88
88
|
"react-dom": "17.0.2",
|
|
89
89
|
"react-intl": "5.24.7",
|
|
90
|
+
"res-react-intl": "3.1.2",
|
|
90
91
|
"react-is": "17.0.2",
|
|
91
92
|
"sass": "1.45.0"
|
|
92
93
|
}
|
package/src/Toolkit.res
CHANGED
|
@@ -9,5 +9,6 @@ module Router = Toolkit__Router
|
|
|
9
9
|
module Ui = Toolkit__Ui
|
|
10
10
|
module Utils = Toolkit__Utils
|
|
11
11
|
module Form = Toolkit__Form
|
|
12
|
+
module FormValidationFunctions = Toolkit__FormValidationFunctions
|
|
12
13
|
module BrowserLogger = Toolkit__BrowserLogger
|
|
13
14
|
module NativeLogger = Toolkit__NativeLogger
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
open ReactIntl
|
|
2
|
+
|
|
3
|
+
module Msg = {
|
|
4
|
+
@@intl.messages
|
|
5
|
+
let requiredValue = {defaultMessage: "required value"}
|
|
6
|
+
let requiredPosInt = {defaultMessage: "must be a positive integer"}
|
|
7
|
+
let requiredPosIntOrFloat = {defaultMessage: "must be a positive integer or float"}
|
|
8
|
+
let wrongFormat = {defaultMessage: "Wrong format (req: {exemple})"}
|
|
9
|
+
let maxNumberOfPackets = {defaultMessage: "Nb packets"}
|
|
10
|
+
let totalVolume = {defaultMessage: "Total volume"}
|
|
11
|
+
let binPacking = {defaultMessage: "Bin packing"}
|
|
12
|
+
let vehicleNameAlreadyUsed = {defaultMessage: "This name is already used in another flat rate"}
|
|
13
|
+
|
|
14
|
+
let requiredAlphanumericMax4 = {
|
|
15
|
+
defaultMessage: "required format : 4 characters or numbers (exemples: 'A1b2' 'abcd')",
|
|
16
|
+
}
|
|
17
|
+
let required14Digits = {
|
|
18
|
+
defaultMessage: "required format : 14 digits",
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
let toReSchemaResult = (opt: option<string>): ReSchema.fieldState =>
|
|
23
|
+
switch opt {
|
|
24
|
+
| Some(e) => Error(e)
|
|
25
|
+
| None => Valid
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
let requiredStringNonEmpty = (intl, value) => {
|
|
29
|
+
switch value {
|
|
30
|
+
| "" => Some(Intl.formatMessage(intl, Msg.requiredValue))
|
|
31
|
+
| _ => None
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
let requiredPosInt = (intl, value) => {
|
|
36
|
+
switch value {
|
|
37
|
+
| "" => Some(Intl.formatMessage(intl, Msg.requiredValue))
|
|
38
|
+
| value if !Toolkit__Utils_Regex.Test.isPositiveInt(value) =>
|
|
39
|
+
Some(Intl.formatMessage(intl, Msg.requiredPosInt))
|
|
40
|
+
| _ => None
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
let optionalPosInt = (intl, value) => {
|
|
45
|
+
switch value {
|
|
46
|
+
| "" => None
|
|
47
|
+
| value if !Toolkit__Utils_Regex.Test.isPositiveInt(value) =>
|
|
48
|
+
Some(Intl.formatMessage(intl, Msg.requiredPosInt))
|
|
49
|
+
| _ => None
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
let requiredPosFloat = (intl, value) => {
|
|
53
|
+
switch value {
|
|
54
|
+
| "" => Some(Intl.formatMessage(intl, Msg.requiredValue))
|
|
55
|
+
| value if !Toolkit__Utils_Regex.Test.isPositiveIntOrFloat(value) =>
|
|
56
|
+
Some(Intl.formatMessage(intl, Msg.requiredPosIntOrFloat))
|
|
57
|
+
| _ => None
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
let requiredFloat = (intl, value) => {
|
|
62
|
+
switch value->Js.String2.split("-") {
|
|
63
|
+
| _ if value === "" => Some(Intl.formatMessage(intl, Msg.requiredValue))
|
|
64
|
+
| ["", value]
|
|
65
|
+
| [value] if Toolkit__Utils_Regex.Test.isPositiveIntOrFloat(value) =>
|
|
66
|
+
None
|
|
67
|
+
| _ => Some(Intl.formatMessage(intl, Msg.requiredPosIntOrFloat))
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
let optionalFloat = (intl, value) => {
|
|
72
|
+
switch value->Js.String2.split("-") {
|
|
73
|
+
| _ if value === "" => None
|
|
74
|
+
| ["", value]
|
|
75
|
+
| [value] if Toolkit__Utils_Regex.Test.isPositiveIntOrFloat(value) =>
|
|
76
|
+
None
|
|
77
|
+
| _ => Some(Intl.formatMessage(intl, Msg.requiredPosIntOrFloat))
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
let requiredPosFloatCurrencyEur = (intl, value) => {
|
|
82
|
+
switch value {
|
|
83
|
+
| "" => Some(Intl.formatMessage(intl, Msg.requiredValue))
|
|
84
|
+
| v =>
|
|
85
|
+
switch v->Toolkit__Decoders.UnitMeasure.Currency.WithUnit.decodeFromString {
|
|
86
|
+
| Ok(#EUR(_)) => None
|
|
87
|
+
| _ =>
|
|
88
|
+
Some(Intl.formatMessageWithValues(intl, Msg.wrongFormat, {"exemple": "'10 EUR' '0.5 EUR'"}))
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
let requiredPosFloatTimeHour = (intl, value) => {
|
|
94
|
+
switch value {
|
|
95
|
+
| "" => Some(Intl.formatMessage(intl, Msg.requiredValue))
|
|
96
|
+
| v =>
|
|
97
|
+
switch v->Toolkit__Decoders.UnitMeasure.Time.WithUnit.decodeFromString {
|
|
98
|
+
| Ok(#h(_)) => None
|
|
99
|
+
| _ => Some(Intl.formatMessageWithValues(intl, Msg.wrongFormat, {"exemple": "'10 h' '0.5 h'"}))
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
let requiredPosFloatTimeMin = (intl, value) => {
|
|
105
|
+
switch value {
|
|
106
|
+
| "" => Some(Intl.formatMessage(intl, Msg.requiredValue))
|
|
107
|
+
| v =>
|
|
108
|
+
switch v->Toolkit__Decoders.UnitMeasure.Time.WithUnit.decodeFromString {
|
|
109
|
+
| Ok(#min(_)) => None
|
|
110
|
+
| _ =>
|
|
111
|
+
Some(Intl.formatMessageWithValues(intl, Msg.wrongFormat, {"exemple": "'10 min' '0.5 min'"}))
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
let requiredPosFloatTimeHour_Min = (intl, value) => {
|
|
117
|
+
switch value {
|
|
118
|
+
| "" => Some(Intl.formatMessage(intl, Msg.requiredValue))
|
|
119
|
+
| v =>
|
|
120
|
+
switch v->Toolkit__Decoders.UnitMeasure.Time.WithUnit.decodeFromString {
|
|
121
|
+
| Ok(#h(_)) => None
|
|
122
|
+
| Ok(#min(_)) => None
|
|
123
|
+
| _ =>
|
|
124
|
+
Some(Intl.formatMessageWithValues(intl, Msg.wrongFormat, {"exemple": "'10 min' '0.5 h'"}))
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
let optionalPosFloatTimeMin = (intl, value) => {
|
|
130
|
+
switch value {
|
|
131
|
+
| "" => None
|
|
132
|
+
| v =>
|
|
133
|
+
switch v->Toolkit__Decoders.UnitMeasure.Time.WithUnit.decodeFromString {
|
|
134
|
+
| Ok(#min(_)) => None
|
|
135
|
+
| _ =>
|
|
136
|
+
Some(Intl.formatMessageWithValues(intl, Msg.wrongFormat, {"exemple": "'10 min' '0.5 min'"}))
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
let requiredPosFloatPriceEurByHour = (intl, value) => {
|
|
142
|
+
switch value {
|
|
143
|
+
| "" => Some(Intl.formatMessage(intl, Msg.requiredValue))
|
|
144
|
+
| v =>
|
|
145
|
+
switch v->Toolkit__Decoders.UnitMeasure.CompositeUnits.CurrencyPerTime.WithUnit.decodeFromString {
|
|
146
|
+
| Ok(#EUR_h(_)) => None
|
|
147
|
+
| _ =>
|
|
148
|
+
Some(
|
|
149
|
+
Intl.formatMessageWithValues(intl, Msg.wrongFormat, {"exemple": "'10 EUR/h' '0.5 EUR/h'"}),
|
|
150
|
+
)
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
let requiredPosFloatPriceEurByKm = (intl, value) => {
|
|
155
|
+
switch value {
|
|
156
|
+
| "" => Some(Intl.formatMessage(intl, Msg.requiredValue))
|
|
157
|
+
| v =>
|
|
158
|
+
switch v->Toolkit__Decoders.UnitMeasure.CompositeUnits.CurrencyPerDistance.WithUnit.decodeFromString {
|
|
159
|
+
| Ok(#EUR_km(_)) => None
|
|
160
|
+
| _ =>
|
|
161
|
+
Some(
|
|
162
|
+
Intl.formatMessageWithValues(
|
|
163
|
+
intl,
|
|
164
|
+
Msg.wrongFormat,
|
|
165
|
+
{"exemple": "'10 EUR/km' '0.5 EUR/km'"},
|
|
166
|
+
),
|
|
167
|
+
)
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
let requiredPosFloatDistanceKm = (intl, value) => {
|
|
173
|
+
switch value {
|
|
174
|
+
| "" => Some(Intl.formatMessage(intl, Msg.requiredValue))
|
|
175
|
+
| v =>
|
|
176
|
+
switch v->Toolkit__Decoders.UnitMeasure.Dimension.WithUnit.decodeFromString {
|
|
177
|
+
| Ok(#km(_)) => None
|
|
178
|
+
| _ =>
|
|
179
|
+
Some(Intl.formatMessageWithValues(intl, Msg.wrongFormat, {"exemple": "'10 km' '0.5 km'"}))
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
let requiredPosFloatDistanceKm_M = (intl, value) => {
|
|
184
|
+
switch value {
|
|
185
|
+
| "" => Some(Intl.formatMessage(intl, Msg.requiredValue))
|
|
186
|
+
| v =>
|
|
187
|
+
switch v->Toolkit__Decoders.UnitMeasure.Dimension.WithUnit.decodeFromString {
|
|
188
|
+
| Ok(#km(_)) => None
|
|
189
|
+
| Ok(#m(_)) => None
|
|
190
|
+
| _ => Some(Intl.formatMessageWithValues(intl, Msg.wrongFormat, {"exemple": "'15 m' '0.5 km'"}))
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
let optionalPosFloatDistanceKm = (intl, value) => {
|
|
196
|
+
switch value {
|
|
197
|
+
| "" => None
|
|
198
|
+
| v =>
|
|
199
|
+
switch v->Toolkit__Decoders.UnitMeasure.Dimension.WithUnit.decodeFromString {
|
|
200
|
+
| Ok(#km(_)) => None
|
|
201
|
+
| _ =>
|
|
202
|
+
Some(Intl.formatMessageWithValues(intl, Msg.wrongFormat, {"exemple": "'10 km' '0.5 km'"}))
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
let requiredPosFloatVolumeM3 = (intl, value) => {
|
|
208
|
+
switch value {
|
|
209
|
+
| "" => Some(Intl.formatMessage(intl, Msg.requiredValue))
|
|
210
|
+
| v =>
|
|
211
|
+
switch v->Toolkit__Decoders.UnitMeasure.Volume.WithUnit.decodeFromString {
|
|
212
|
+
| Ok(#m3(_)) => None
|
|
213
|
+
| _ =>
|
|
214
|
+
Some(Intl.formatMessageWithValues(intl, Msg.wrongFormat, {"exemple": `'10 m³' '0.5 m³'`}))
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
let requiredPosFloatDimensionCm = (intl, value) => {
|
|
220
|
+
switch value {
|
|
221
|
+
| "" => Some(Intl.formatMessage(intl, Msg.requiredValue))
|
|
222
|
+
| v =>
|
|
223
|
+
switch v->Toolkit__Decoders.UnitMeasure.Dimension.WithUnit.decodeFromString {
|
|
224
|
+
| Ok(#cm(_)) => None
|
|
225
|
+
| _ =>
|
|
226
|
+
Some(Intl.formatMessageWithValues(intl, Msg.wrongFormat, {"exemple": "'10 cm' '0.5 cm'"}))
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
let requiredPosFloatDimensionCm_M = (intl, value) => {
|
|
231
|
+
switch value {
|
|
232
|
+
| "" => Some(Intl.formatMessage(intl, Msg.requiredValue))
|
|
233
|
+
| v =>
|
|
234
|
+
switch v->Toolkit__Decoders.UnitMeasure.Dimension.WithUnit.decodeFromString {
|
|
235
|
+
| Ok(#cm(_)) => None
|
|
236
|
+
| Ok(#m(_)) => None
|
|
237
|
+
| _ => Some(Intl.formatMessageWithValues(intl, Msg.wrongFormat, {"exemple": "'10 cm' '0.5 m'"}))
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
let requiredPosFloatWeightKg = (intl, value) => {
|
|
243
|
+
switch value {
|
|
244
|
+
| "" => Some(Intl.formatMessage(intl, Msg.requiredValue))
|
|
245
|
+
| v =>
|
|
246
|
+
switch v->Toolkit__Decoders.UnitMeasure.Weight.WithUnit.decodeFromString {
|
|
247
|
+
| Ok(#kg(_)) => None
|
|
248
|
+
| _ =>
|
|
249
|
+
Some(Intl.formatMessageWithValues(intl, Msg.wrongFormat, {"exemple": "'10 kg' '0.5 kg'"}))
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
let optionalPosFloatWeightKg = (intl, value) => {
|
|
254
|
+
switch value {
|
|
255
|
+
| "" => None
|
|
256
|
+
| v =>
|
|
257
|
+
switch v->Toolkit__Decoders.UnitMeasure.Weight.WithUnit.decodeFromString {
|
|
258
|
+
| Ok(#kg(_)) => None
|
|
259
|
+
| _ =>
|
|
260
|
+
Some(Intl.formatMessageWithValues(intl, Msg.wrongFormat, {"exemple": "'10 kg' '0.5 kg'"}))
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
let requiredPosFloatWeightG = (intl, value) => {
|
|
265
|
+
switch value {
|
|
266
|
+
| "" => Some(Intl.formatMessage(intl, Msg.requiredValue))
|
|
267
|
+
| v =>
|
|
268
|
+
switch v->Toolkit__Decoders.UnitMeasure.Weight.WithUnit.decodeFromString {
|
|
269
|
+
| Ok(#g(_)) => None
|
|
270
|
+
| _ =>
|
|
271
|
+
Some(Intl.formatMessageWithValues(intl, Msg.wrongFormat, {"exemple": "'10 kg' '0.5 kg'"}))
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
let requiredAlphanumericMax4 = (intl, value) => {
|
|
277
|
+
switch value {
|
|
278
|
+
| "" => Some(Intl.formatMessage(intl, Msg.requiredValue))
|
|
279
|
+
| v =>
|
|
280
|
+
switch Js.Re.test_(%re("/^[a-zA-Z0-9]{4}$/"), v) {
|
|
281
|
+
| true => None
|
|
282
|
+
| false => Some(Intl.formatMessage(intl, Msg.requiredAlphanumericMax4))
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
let required14Digits = (intl, value) => {
|
|
288
|
+
switch value {
|
|
289
|
+
| "" => Some(Intl.formatMessage(intl, Msg.requiredValue))
|
|
290
|
+
| v =>
|
|
291
|
+
switch Js.Re.test_(%re("/^[0-9]{14}$/"), v) {
|
|
292
|
+
| true => None
|
|
293
|
+
| false => Some(Intl.formatMessage(intl, Msg.required14Digits))
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
@@ -52,6 +52,8 @@ module Array = {
|
|
|
52
52
|
let tail = array => array->Array.get(array->Array.length - 1)
|
|
53
53
|
let tailExn = array => array->Array.getExn(array->Array.length - 1)
|
|
54
54
|
let isLastIndex = (array, index) => array->Array.length - 1 == index
|
|
55
|
+
|
|
56
|
+
let flatten = array => array->Array.reduce([], (acc, value) => acc->Array.concat(value))
|
|
55
57
|
}
|
|
56
58
|
|
|
57
59
|
module Result = {
|