diff --git a/src/components/DistBuilder.re b/src/components/DistBuilder.re index fc5d891d..3ccedc35 100644 --- a/src/components/DistBuilder.re +++ b/src/components/DistBuilder.re @@ -1,18 +1,23 @@ open BsReform; +open Antd.Grid; module FormConfig = [%lenses type state = { guesstimatorString: string, // domainType: string, // Complete, LeftLimited(...), RightLimited(...), LeftAndRightLimited(..., ...) - xPoint: string, - xPoint2: string, - excludingProbabilityMass: string, - excludingProbabilityMass2: string, + xPoint: float, + xPoint2: float, + excludingProbabilityMass: float, + excludingProbabilityMass2: float, // unitType: string, // UnspecifiedDistribution, TimeDistribution(zero, unit) zero: MomentRe.Moment.t, unit: string, + // + sampleCount: int, + outputXYPoints: int, + truncateTo: int, } ]; @@ -38,24 +43,19 @@ module FieldString = { }; }; -module Styles = { - open Css; - let row = - style([display(`flex), selector("div > div", [flex(`num(1.))])]); - let form = style([backgroundColor(hex("eee")), padding(em(1.))]); - let spacer = style([marginTop(em(3.))]); -}; - -module FieldFloat = { +module FieldNumber = { [@react.component] let make = (~field, ~label) => { E.ste}> - { + e |> handleChange; + (); + }} onBlur={_ => validate()} /> @@ -64,8 +64,100 @@ module FieldFloat = { }; }; +module FieldFloat = { + [@react.component] + let make = (~field, ~label, ~className=Css.style([])) => { + + E.ste}> + { + e |> handleChange; + (); + }} + onBlur={_ => validate()} + className + /> + + } + />; + }; +}; + +module Styles = { + open Css; + let rows = + style([ + selector( + ">.ant-col:first-child", + [paddingLeft(em(0.25)), paddingRight(em(0.125))], + ), + selector( + ">.ant-col:last-child", + [paddingLeft(em(0.125)), paddingRight(em(0.25))], + ), + selector( + ">.ant-col:not(:first-child):not(:last-child)", + [paddingLeft(em(0.125)), paddingRight(em(0.125))], + ), + ]); + let parent = + style([ + selector(".ant-input-number", [width(`percent(100.))]), + selector(".anticon", [verticalAlign(`zero)]), + ]); + let form = style([backgroundColor(hex("eee")), padding(em(1.))]); + let dist = style([padding(em(1.))]); + let spacer = style([marginTop(em(1.))]); + let groupA = + style([ + selector( + ".ant-input-number-input", + [backgroundColor(hex("fff7db"))], + ), + ]); + let groupB = + style([ + selector( + ".ant-input-number-input", + [backgroundColor(hex("eaf4ff"))], + ), + ]); +}; + +module DemoDist = { + [@react.component] + let make = + ( + ~guesstimatorString, + ~domain, + ~unit, + ~sampleCount, + ~outputXYPoints, + ~truncateTo, + ) => { + E.ste}> +
+
+
+ {DistPlusIngredients.make(~guesstimatorString, ~domain, ~unit, ()) + |> DistPlusIngredients.toDistPlus( + ~sampleCount, + ~outputXYPoints, + ~truncateTo, + ) + |> E.O.React.fmapOrNull(distPlus => )} +
+
+ ; + }; +}; + [@react.component] let make = () => { + let (reloader, setRealoader) = React.useState(() => 1); let reform = Form.use( ~validationStrategy=OnDemand, @@ -73,14 +165,17 @@ let make = () => { ~onSubmit=({state}) => {None}, ~initialState={ guesstimatorString: "mm(5 to 20, floor(normal(20,2)), [.5, .5])", - domainType: "Complete", - xPoint: "50.0", - xPoint2: "60.0", - excludingProbabilityMass2: "0.5", - excludingProbabilityMass: "0.3", + domainType: "LeftLimited", + xPoint: 50.0, + xPoint2: 60.0, + excludingProbabilityMass2: 0.5, + excludingProbabilityMass: 0.3, unitType: "UnspecifiedDistribution", zero: MomentRe.momentNow(), unit: "days", + sampleCount: 10000, + outputXYPoints: 2000, + truncateTo: 1000, }, (), ); @@ -95,27 +190,26 @@ let make = () => { | "Complete" => DistTypes.Complete | "LeftLimited" => LeftLimited({ - xPoint: reform.state.values.xPoint |> float_of_string, - excludingProbabilityMass: - reform.state.values.excludingProbabilityMass |> float_of_string, + xPoint: reform.state.values.xPoint, + excludingProbabilityMass: reform.state.values.excludingProbabilityMass, }) | "RightLimited" => RightLimited({ - xPoint: reform.state.values.xPoint |> float_of_string, + xPoint: reform.state.values.xPoint2, excludingProbabilityMass: - reform.state.values.excludingProbabilityMass |> float_of_string, + reform.state.values.excludingProbabilityMass2, }) | "LeftAndRightLimited" => LeftAndRightLimited( { - xPoint: reform.state.values.xPoint |> float_of_string, + xPoint: reform.state.values.xPoint, excludingProbabilityMass: - reform.state.values.excludingProbabilityMass |> float_of_string, + reform.state.values.excludingProbabilityMass, }, { - xPoint: reform.state.values.xPoint2 |> float_of_string, + xPoint: reform.state.values.xPoint2, excludingProbabilityMass: - reform.state.values.excludingProbabilityMass2 |> float_of_string, + reform.state.values.excludingProbabilityMass2, }, ) | _ => Js.Exn.raiseError("domain is unknown") @@ -133,30 +227,69 @@ let make = () => { }; let guesstimatorString = reform.state.values.guesstimatorString; + let sampleCount = reform.state.values.sampleCount; + let outputXYPoints = reform.state.values.outputXYPoints; + let truncateTo = reform.state.values.truncateTo |> E.O.some; -
+ let demoDist = + React.useMemo1( + () => { + + }, + [| + reform.state.values.guesstimatorString, + reform.state.values.domainType, + reform.state.values.xPoint |> string_of_float, + reform.state.values.xPoint2 |> string_of_float, + reform.state.values.xPoint2 |> string_of_float, + reform.state.values.excludingProbabilityMass |> string_of_float, + reform.state.values.excludingProbabilityMass2 |> string_of_float, + reform.state.values.unitType, + reform.state.values.zero |> E.M.format(E.M.format_standard), + reform.state.values.unit, + reform.state.values.sampleCount |> string_of_int, + reform.state.values.outputXYPoints |> string_of_int, + reform.state.values.truncateTo |> string_of_int, + reloader |> string_of_int, + |], + ); + + let onRealod = _ => { + setRealoader(_ => reloader + 1); + }; + +
-
-
- {DistPlusIngredients.make(~guesstimatorString, ~domain, ~unit, ()) - |> DistPlusIngredients.toDistPlus( - ~sampleCount=10000, - ~outputXYPoints=2000, - ~truncateTo=Some(1000), - ) - |> E.O.React.fmapOrNull(distPlus => )} -
-
+ demoDist
-
+ E.ste} + extra={ + + }> - -
-
+ + + + + + + @@ -178,32 +311,58 @@ let make = () => { } /> -
-
- -
-
- -
-
- -
-
- -
-
-
-
+ + {<> + + + + + + + + |> E.showIf( + E.L.contains( + reform.state.values.domainType, + ["LeftLimited", "LeftAndRightLimited"], + ), + )} + {<> + + + + + + + + |> E.showIf( + E.L.contains( + reform.state.values.domainType, + ["RightLimited", "LeftAndRightLimited"], + ), + )} + + + - E.ste}> + E.ste}> e |> handleChange}> {"Unspecified Distribution" |> E.ste} @@ -215,12 +374,12 @@ let make = () => { } /> -
-
+ + - E.ste}> + E.ste}> { @@ -231,48 +390,67 @@ let make = () => { } /> -
-
+ + E.ste}> e |> handleChange}> - {"days" |> E.ste} + {"Days" |> E.ste} - {"hours" |> E.ste} + {"Hours" |> E.ste} - {"milliseconds" |> E.ste} + {"Milliseconds" |> E.ste} - {"minutes" |> E.ste} + {"Minutes" |> E.ste} - {"months" |> E.ste} + {"Months" |> E.ste} - {"quarters" |> E.ste} + {"Quarters" |> E.ste} - {"seconds" |> E.ste} + {"Seconds" |> E.ste} - {"weeks" |> E.ste} + {"Weeks" |> E.ste} - {"years" |> E.ste} + {"Years" |> E.ste} } /> -
-
+ + + + + + + + + + + + + + + {"Update Distribution" |> E.ste} +
-
+ +
; }; diff --git a/src/utility/E.re b/src/utility/E.re index 9be83a65..2e0ba052 100644 --- a/src/utility/E.re +++ b/src/utility/E.re @@ -299,3 +299,4 @@ module JsArray = { }; let ste = React.string; +let showIf = (cond, comp) => cond ? comp : ReasonReact.null;