@@ -5,6 +5,7 @@ module Lumi.Components.Form
55 , build
66 , build'
77 , defaultRenderForm
8+ , defaultRenderForest
89 , useForm
910 , useForm'
1011 , formState
@@ -80,7 +81,7 @@ import Lumi.Components.Column (column)
8081import Lumi.Components.FetchCache as FetchCache
8182import Lumi.Components.Form.Defaults (formDefaults ) as Defaults
8283import Lumi.Components.Form.Internal (Forest , FormBuilder' (..), FormBuilder , SeqFormBuilder , Tree (..), formBuilder , formBuilder_ , invalidate , pruneTree , sequential )
83- import Lumi.Components.Form.Internal (Forest , FormBuilder' , FormBuilder , SeqFormBuilder' , SeqFormBuilder , formBuilder , formBuilder_ , invalidate , listen , parallel , revalidate , sequential ) as Internal
84+ import Lumi.Components.Form.Internal (Forest (..) , FormBuilder' , FormBuilder , SeqFormBuilder' , SeqFormBuilder , formBuilder , formBuilder_ , invalidate , listen , parallel , revalidate , sequential ) as Internal
8485import Lumi.Components.Form.Validation (setModified )
8586import Lumi.Components.Form.Validation (Validated (..), Validator , _Validated , fromValidated , mustBe , mustEqual , nonEmpty , nonEmptyArray , nonNull , validNumber , validInt , validDate , optional , setFresh , setModified , validated , warn ) as Validation
8687import Lumi.Components.Input (alignToInput )
@@ -166,42 +167,52 @@ defaultRenderForm
166167 }
167168 -> Forest
168169 -> JSX
169- defaultRenderForm { inlineTable, forceTopLabels } { readonly } forest =
170+ defaultRenderForm renderProps@ { inlineTable, forceTopLabels } { readonly } forest =
170171 element (R .unsafeCreateDOMComponent " lumi-form" )
171172 { class:
172173 String .joinWith " " $ fold
173174 [ guard inlineTable [" inline-table" ]
174175 , guard readonly [" readonly" ]
175176 ]
176177 , children:
177- surround fieldDivider (map toRow (Array .mapMaybe pruneTree forest))
178+ surround fieldDivider
179+ $ defaultRenderForest { forceTopLabels }
180+ $ Array .mapMaybe pruneTree
181+ $ forest
178182 }
179183 where
180184 fieldDivider = R .hr { className: " lumi field-divider" }
181185
182- toRow :: Tree -> JSX
183- toRow = case _ of
184- Child { key, child } ->
185- maybe identity keyed key $ child
186- Wrapper { key, wrap: f, children } ->
187- maybe identity keyed key
188- $ f
189- $ intercalate [fieldDivider]
190- $ map (pure <<< toRow)
191- $ children
192- Node { label, key, required, validationError, children } ->
193- maybe identity keyed key $
194- labeledField
195- { label: text body
196- { children = [ label ]
197- , className = toNullable (pure " field-label" )
198- }
199- , value: intercalate fieldDivider (map toRow children)
200- , validationError
201- , required
202- , forceTopLabel: forceTopLabels
203- , style: R .css {}
186+ defaultRenderForest
187+ :: { forceTopLabels :: Boolean
188+ }
189+ -> Forest
190+ -> Array JSX
191+ defaultRenderForest renderProps@{ forceTopLabels } = map case _ of
192+ Child { key, child } ->
193+ maybe identity keyed key $ child
194+ Wrapper { key, wrap: f, children } ->
195+ maybe identity keyed key
196+ $ f
197+ $ intercalate [fieldDivider]
198+ $ map pure
199+ $ defaultRenderForest renderProps
200+ $ children
201+ Node { label, key, required, validationError, children } ->
202+ maybe identity keyed key $
203+ labeledField
204+ { label: text body
205+ { children = [ label ]
206+ , className = toNullable (pure " field-label" )
204207 }
208+ , value: intercalate fieldDivider (defaultRenderForest renderProps children)
209+ , validationError
210+ , required
211+ , forceTopLabel: forceTopLabels
212+ , style: R .css {}
213+ }
214+ where
215+ fieldDivider = R .hr { className: " lumi field-divider" }
205216
206217-- | Render a form with state managed automatically.
207218useForm
0 commit comments