@@ -5,6 +5,7 @@ module Lumi.Components.Form
5
5
, build
6
6
, build'
7
7
, defaultRenderForm
8
+ , defaultRenderForest
8
9
, useForm
9
10
, useForm'
10
11
, formState
@@ -80,7 +81,7 @@ import Lumi.Components.Column (column)
80
81
import Lumi.Components.FetchCache as FetchCache
81
82
import Lumi.Components.Form.Defaults (formDefaults ) as Defaults
82
83
import 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
84
85
import Lumi.Components.Form.Validation (setModified )
85
86
import Lumi.Components.Form.Validation (Validated (..), Validator , _Validated , fromValidated , mustBe , mustEqual , nonEmpty , nonEmptyArray , nonNull , validNumber , validInt , validDate , optional , setFresh , setModified , validated , warn ) as Validation
86
87
import Lumi.Components.Input (alignToInput )
@@ -166,42 +167,52 @@ defaultRenderForm
166
167
}
167
168
-> Forest
168
169
-> JSX
169
- defaultRenderForm { inlineTable, forceTopLabels } { readonly } forest =
170
+ defaultRenderForm renderProps@ { inlineTable, forceTopLabels } { readonly } forest =
170
171
element (R .unsafeCreateDOMComponent " lumi-form" )
171
172
{ class:
172
173
String .joinWith " " $ fold
173
174
[ guard inlineTable [" inline-table" ]
174
175
, guard readonly [" readonly" ]
175
176
]
176
177
, children:
177
- surround fieldDivider (map toRow (Array .mapMaybe pruneTree forest))
178
+ surround fieldDivider
179
+ $ defaultRenderForest { forceTopLabels }
180
+ $ Array .mapMaybe pruneTree
181
+ $ forest
178
182
}
179
183
where
180
184
fieldDivider = R .hr { className: " lumi field-divider" }
181
185
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" )
204
207
}
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" }
205
216
206
217
-- | Render a form with state managed automatically.
207
218
useForm
0 commit comments