Skip to content

Commit 77566ea

Browse files
Add default renderer for form's Forest structure (#153)
* Add default renderer for form's Forest structure * Update purescript-numbers * Export Forest constructors from Lumi.Components.Form
1 parent 2f89336 commit 77566ea

File tree

2 files changed

+37
-26
lines changed

2 files changed

+37
-26
lines changed

bower.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"purescript-integers": "^4.0.0",
2626
"purescript-maybe": "^4.0.0",
2727
"purescript-nullable": "^4.0.0",
28-
"purescript-numbers": "^6.0.0",
28+
"purescript-numbers": "^7.0.0",
2929
"purescript-prelude": "^4.0.1",
3030
"purescript-profunctor-lenses": ">=4.0.0 <7.0.0",
3131
"purescript-random": "^4.0.0",

src/Lumi/Components/Form.purs

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
8081
import Lumi.Components.FetchCache as FetchCache
8182
import Lumi.Components.Form.Defaults (formDefaults) as Defaults
8283
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
8485
import Lumi.Components.Form.Validation (setModified)
8586
import Lumi.Components.Form.Validation (Validated(..), Validator, _Validated, fromValidated, mustBe, mustEqual, nonEmpty, nonEmptyArray, nonNull, validNumber, validInt, validDate, optional, setFresh, setModified, validated, warn) as Validation
8687
import 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.
207218
useForm

0 commit comments

Comments
 (0)