@colisweb/rescript-toolkit 2.8.0 → 2.8.4
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 +1 -1
- package/src/decoders/Toolkit__Decoders.res +90 -14
- package/src/request/Toolkit__Request.res +12 -7
- package/src/tailwind/tailwind.config.js +2 -3
- package/src/ui/Toolkit__Ui_Alert.res +4 -4
- package/src/utils/Toolkit__Utils_UnitMeasure.res +51 -0
- package/src/vendors/BsDateFns.res +2 -0
package/package.json
CHANGED
|
@@ -169,14 +169,18 @@ module UnitMeasure = {
|
|
|
169
169
|
let decoder: Decco.decoder<Toolkit__Utils_UnitMeasure.Dimension.t> = json =>
|
|
170
170
|
switch Decco.stringFromJson(json) {
|
|
171
171
|
| Belt.Result.Ok(v) =>
|
|
172
|
-
let valueUnitArray = v
|
|
173
|
-
switch
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
| Some("
|
|
178
|
-
|
|
|
179
|
-
|
|
|
172
|
+
let valueUnitArray = v->Js.String2.split(" ")
|
|
173
|
+
switch (
|
|
174
|
+
valueUnitArray[0]->Belt.Option.flatMap(Belt.Float.fromString),
|
|
175
|
+
valueUnitArray[1],
|
|
176
|
+
) {
|
|
177
|
+
| (Some(v), Some("mm")) => #mm(v)->Ok
|
|
178
|
+
| (Some(v), Some("cm")) => #cm(v)->Ok
|
|
179
|
+
| (Some(v), Some("dm")) => #dm(v)->Ok
|
|
180
|
+
| (Some(v), Some("km")) => #km(v)->Ok
|
|
181
|
+
| (None, _) => Decco.error("unhandled no value", json)
|
|
182
|
+
| (_, None) => Decco.error("unhandled no unit", json)
|
|
183
|
+
| (_, Some(_)) => Decco.error("unhandled dimension unit", json)
|
|
180
184
|
}
|
|
181
185
|
| Belt.Result.Error(_) as err => err
|
|
182
186
|
}
|
|
@@ -233,12 +237,16 @@ module UnitMeasure = {
|
|
|
233
237
|
let decoder: Decco.decoder<Toolkit__Utils_UnitMeasure.Weight.t> = json =>
|
|
234
238
|
switch Decco.stringFromJson(json) {
|
|
235
239
|
| Ok(v) =>
|
|
236
|
-
let valueUnitArray = v
|
|
237
|
-
switch
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
|
240
|
+
let valueUnitArray = v->Js.String2.split(" ")
|
|
241
|
+
switch (
|
|
242
|
+
valueUnitArray[0]->Belt.Option.flatMap(Belt.Float.fromString),
|
|
243
|
+
valueUnitArray[1],
|
|
244
|
+
) {
|
|
245
|
+
| (Some(v), Some("g")) => #g(v)->Ok
|
|
246
|
+
| (Some(v), Some("kg")) => #kg(v)->Ok
|
|
247
|
+
| (None, _) => Decco.error("unhandled no value", json)
|
|
248
|
+
| (_, None) => Decco.error("unhandled no unit", json)
|
|
249
|
+
| (_, Some(_)) => Decco.error("unhandled weight unit", json)
|
|
242
250
|
}
|
|
243
251
|
|
|
244
252
|
| Error(_) as err => err
|
|
@@ -282,6 +290,74 @@ module UnitMeasure = {
|
|
|
282
290
|
let convert = Toolkit__Utils_UnitMeasure.Weight.makeKg
|
|
283
291
|
})
|
|
284
292
|
}
|
|
293
|
+
|
|
294
|
+
module Time = {
|
|
295
|
+
module WithUnit = {
|
|
296
|
+
let encoder: Decco.encoder<Toolkit__Utils_UnitMeasure.Time.t> = value =>
|
|
297
|
+
switch value {
|
|
298
|
+
| #min(v) => Js.Json.string(v->Js.Float.toString ++ " min")
|
|
299
|
+
| #h(v) => Js.Json.string(v->Js.Float.toString ++ " h")
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
let decoder: Decco.decoder<Toolkit__Utils_UnitMeasure.Time.t> = json =>
|
|
303
|
+
switch Decco.stringFromJson(json) {
|
|
304
|
+
| Ok(v) =>
|
|
305
|
+
let valueUnitArray = v->Js.String2.split(" ")
|
|
306
|
+
switch (
|
|
307
|
+
valueUnitArray[0]->Belt.Option.flatMap(Belt.Float.fromString),
|
|
308
|
+
valueUnitArray[1],
|
|
309
|
+
) {
|
|
310
|
+
| (Some(v), Some("min")) => #min(v)->Ok
|
|
311
|
+
| (Some(v), Some("h")) => #h(v)->Ok
|
|
312
|
+
| (None, _) => Decco.error("unhandled no value", json)
|
|
313
|
+
| (_, None) => Decco.error("unhandled no unit", json)
|
|
314
|
+
| (_, Some(_)) => Decco.error("unhandled time unit", json)
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
| Error(_) as err => err
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
let codec: Decco.codec<Toolkit__Utils_UnitMeasure.Time.t> = (encoder, decoder)
|
|
321
|
+
|
|
322
|
+
@decco
|
|
323
|
+
type t = @decco.codec(codec) Toolkit__Utils_UnitMeasure.Time.t
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
module type TimeConfig = {
|
|
327
|
+
let convert: float => Toolkit__Utils_UnitMeasure.Time.t
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
module Make = (C: TimeConfig) => {
|
|
331
|
+
type time = Toolkit__Utils_UnitMeasure.Time.t
|
|
332
|
+
|
|
333
|
+
let encoder: Decco.encoder<Toolkit__Utils_UnitMeasure.Time.t> = value =>
|
|
334
|
+
switch value {
|
|
335
|
+
| #min(v) => Js.Json.string(v->Js.Float.toString ++ " min")
|
|
336
|
+
| #h(v) => Js.Json.string(v->Js.Float.toString ++ " h")
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
let decoder: Decco.decoder<Toolkit__Utils_UnitMeasure.Time.t> = json =>
|
|
340
|
+
switch Decco.floatFromJson(json) {
|
|
341
|
+
| Ok(v) => v->C.convert->Ok
|
|
342
|
+
| Error(_) as err => err
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
let codec: Decco.codec<time> = (encoder, decoder)
|
|
346
|
+
|
|
347
|
+
let toValue = Toolkit__Utils_UnitMeasure.Time.toValue
|
|
348
|
+
let display = Toolkit__Utils_UnitMeasure.Time.display
|
|
349
|
+
|
|
350
|
+
@decco
|
|
351
|
+
type t = @decco.codec(codec) Toolkit__Utils_UnitMeasure.Time.t
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
module Min = Make({
|
|
355
|
+
let convert = Toolkit__Utils_UnitMeasure.Time.makeMin
|
|
356
|
+
})
|
|
357
|
+
module H = Make({
|
|
358
|
+
let convert = Toolkit__Utils_UnitMeasure.Time.makeH
|
|
359
|
+
})
|
|
360
|
+
}
|
|
285
361
|
}
|
|
286
362
|
|
|
287
363
|
// StringArray
|
|
@@ -54,13 +54,18 @@ let toResult = (
|
|
|
54
54
|
| Ok(response) =>
|
|
55
55
|
switch response["data"]->mapData {
|
|
56
56
|
| Ok(_) as ok => ok
|
|
57
|
-
| Error(error) =>
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
57
|
+
| Error(error) => {
|
|
58
|
+
%log.error(
|
|
59
|
+
"Decoder failure"
|
|
60
|
+
("err", error)
|
|
61
|
+
)
|
|
62
|
+
Error(
|
|
63
|
+
#invalidResponseData(
|
|
64
|
+
response->castToUndecodedResponse,
|
|
65
|
+
"\"" ++ (error.path ++ ("\" " ++ error.message)),
|
|
66
|
+
),
|
|
67
|
+
)
|
|
68
|
+
}
|
|
64
69
|
}
|
|
65
70
|
| Error(error) =>
|
|
66
71
|
if (error->castToJs)["response"] {
|
|
@@ -11,8 +11,7 @@ module.exports = {
|
|
|
11
11
|
},
|
|
12
12
|
boxShadow: {
|
|
13
13
|
sidenav: "inset 0 0 1px 2px rgba(0, 0, 0, 0.2)",
|
|
14
|
-
sm:
|
|
15
|
-
"0px 2px 1px -1px rgba(0,0,0,0.1), 0px 1px 1px 0px rgba(0,0,0,0.1), 0px 1px 3px 0px rgba(0,0,0,0.1)",
|
|
14
|
+
sm: "0px 2px 1px -1px rgba(0,0,0,0.1), 0px 1px 1px 0px rgba(0,0,0,0.1), 0px 1px 3px 0px rgba(0,0,0,0.1)",
|
|
16
15
|
},
|
|
17
16
|
borderColor: {
|
|
18
17
|
currentColor: "currentColor",
|
|
@@ -142,7 +141,7 @@ module.exports = {
|
|
|
142
141
|
purple: {
|
|
143
142
|
50: "#F8F1FF",
|
|
144
143
|
100: "#DDC8F0",
|
|
145
|
-
300: "#
|
|
144
|
+
300: "#B787E0",
|
|
146
145
|
400: "#9151C9",
|
|
147
146
|
500: "#6C1CB2",
|
|
148
147
|
600: "#55158B",
|
|
@@ -14,10 +14,10 @@ let make = (~title, ~description=?, ~status, ~className=?) =>
|
|
|
14
14
|
className->Option.getWithDefault(""),
|
|
15
15
|
])}>
|
|
16
16
|
{switch status {
|
|
17
|
-
| #success => <BsReactIcons.MdCheckCircle size=28 className="text-success-500" />
|
|
18
|
-
| #error => <BsReactIcons.MdWarning size=28 className="text-danger-600" />
|
|
19
|
-
| #warning => <BsReactIcons.MdWarning size=28 className="text-warning-500" />
|
|
20
|
-
| #info => <BsReactIcons.MdInfoOutline size=28 className="text-info-500" />
|
|
17
|
+
| #success => <BsReactIcons.MdCheckCircle size=28 className="text-success-500 flex-shrink-0" />
|
|
18
|
+
| #error => <BsReactIcons.MdWarning size=28 className="text-danger-600 flex-shrink-0" />
|
|
19
|
+
| #warning => <BsReactIcons.MdWarning size=28 className="text-warning-500 flex-shrink-0" />
|
|
20
|
+
| #info => <BsReactIcons.MdInfoOutline size=28 className="text-info-500 flex-shrink-0" />
|
|
21
21
|
}}
|
|
22
22
|
<div className="mx-3">
|
|
23
23
|
<div className={description->Option.isSome ? "font-bold" : ""}> title </div>
|
|
@@ -17,6 +17,57 @@ module Weight = {
|
|
|
17
17
|
let makeKg = (value: float) => #kg(value)
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
+
module Time = {
|
|
21
|
+
type t = [#min(float) | #h(float)]
|
|
22
|
+
|
|
23
|
+
let toValue = value =>
|
|
24
|
+
switch value {
|
|
25
|
+
| #min(v)
|
|
26
|
+
| #h(v) => v
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
type separator = [#units | #colon]
|
|
30
|
+
let display = (value, ~separator=#units, ()) => {
|
|
31
|
+
let _initialDate = Js.Date.make()
|
|
32
|
+
let duration = switch value {
|
|
33
|
+
| #min(v) =>
|
|
34
|
+
BsDateFns.intervalToDuration(
|
|
35
|
+
~interval={
|
|
36
|
+
start: _initialDate,
|
|
37
|
+
end_: _initialDate->BsDateFns.addMinutes(v),
|
|
38
|
+
},
|
|
39
|
+
)
|
|
40
|
+
| #h(v) =>
|
|
41
|
+
BsDateFns.intervalToDuration(
|
|
42
|
+
~interval={start: _initialDate, end_: _initialDate->BsDateFns.addHours(v)},
|
|
43
|
+
)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
let mainSeparator = {
|
|
47
|
+
switch separator {
|
|
48
|
+
| #units => " h "
|
|
49
|
+
| #colon => ":"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
let secondarySeparator = {
|
|
53
|
+
switch separator {
|
|
54
|
+
| #units => " min"
|
|
55
|
+
| #colon => ""
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
switch (duration.hours, duration.minutes) {
|
|
60
|
+
| (Some(h), Some(min)) =>
|
|
61
|
+
`${h->Int.toString}${mainSeparator}${min->Int.toString}${secondarySeparator}`
|
|
62
|
+
| (Some(h), _) => `${h->Int.toString} h`
|
|
63
|
+
| (_, Some(min)) => `${min->Int.toString} min`
|
|
64
|
+
| _ => ""
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
let makeMin = (value: float) => #min(value)
|
|
68
|
+
let makeH = (value: float) => #h(value)
|
|
69
|
+
}
|
|
70
|
+
|
|
20
71
|
module Dimension = {
|
|
21
72
|
type t = [
|
|
22
73
|
| #mm(float)
|
|
@@ -60,6 +60,8 @@ external setSeconds: (Js.Date.t, float) => Js.Date.t = "setSeconds"
|
|
|
60
60
|
@module("date-fns")
|
|
61
61
|
external setMinutes: (Js.Date.t, float) => Js.Date.t = "setMinutes"
|
|
62
62
|
@module("date-fns")
|
|
63
|
+
external addMinutes: (Js.Date.t, float) => Js.Date.t = "addMinutes"
|
|
64
|
+
@module("date-fns")
|
|
63
65
|
external setHours: (Js.Date.t, float) => Js.Date.t = "setHours"
|
|
64
66
|
@module("date-fns")
|
|
65
67
|
external addHours: (Js.Date.t, float) => Js.Date.t = "addHours"
|