Skip to content

Commit 2d82bf5

Browse files
Remove old Form.build functions (#30)
Replace Form.build with Form.buildConcurrently Remove Form.buildWithDefaults
1 parent f794a5b commit 2d82bf5

File tree

4 files changed

+35
-63
lines changed

4 files changed

+35
-63
lines changed

docs/Examples/Form.example.purs

+28-9
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ data Action formData formResult
4747
| SetForceTopLabels Boolean
4848
| SetReadonly Boolean
4949
| SetSimulatePauses Boolean
50-
| SetUser (Maybe formResult) formData
50+
| SetUser (formData -> formData)
5151
| Submit
5252
| Reset
5353

@@ -79,11 +79,18 @@ docs = unit # make component { initialState, render }
7979
SetSimulatePauses simulatePauses ->
8080
self.setState _ { simulatePauses = simulatePauses }
8181

82-
SetUser result user ->
83-
self.setState _
84-
{ result = result
85-
, user = user
86-
}
82+
SetUser update ->
83+
let
84+
formProps =
85+
{ loadColor: loadColor self.state.simulatePauses
86+
, loadColors: loadColors self.state.simulatePauses
87+
, readonly: self.state.readonly
88+
}
89+
in
90+
self.setState \s -> s
91+
{ result = F.revalidate userForm formProps (update s.user)
92+
, user = update s.user
93+
}
8794

8895
Submit ->
8996
self.setState \state -> state { user = F.setModified state.user, modalOpen = isJust state.result }
@@ -155,7 +162,7 @@ docs = unit # make component { initialState, render }
155162
, children:
156163
[ userComponent
157164
{ value: user
158-
, onChange: \r -> send self <<< SetUser r
165+
, onChange: send self <<< SetUser
159166
, loadColor: loadColor simulatePauses
160167
, loadColors: loadColors simulatePauses
161168
, inlineTable
@@ -264,15 +271,27 @@ type ValidatedUser =
264271
-- | remounting this component on each render.
265272
userComponent
266273
:: { value :: User
267-
, onChange :: Maybe ValidatedUser -> User -> Effect Unit
274+
, onChange :: (User -> User) -> Effect Unit
268275
, loadColor :: String -> Aff { label :: String, value :: String }
269276
, loadColors :: String -> Aff (Array { label :: String, value :: String })
270277
, inlineTable :: Boolean
271278
, forceTopLabels :: Boolean
272279
, readonly :: Boolean
273280
}
274281
-> JSX
275-
userComponent = F.build ado
282+
userComponent = F.build userForm
283+
284+
userForm
285+
:: forall props
286+
. FormBuilder
287+
{ loadColor :: String -> Aff { label :: String, value :: String }
288+
, loadColors :: String -> Aff (Array { label :: String, value :: String })
289+
, readonly :: Boolean
290+
| props
291+
}
292+
User
293+
ValidatedUser
294+
userForm = ado
276295
firstName <-
277296
F.indent "First Name" Required
278297
$ F.focus (prop (SProxy :: SProxy "firstName"))

src/Lumi/Components/Form.purs

+5-52
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
module Lumi.Components.Form
2-
( module Internal
2+
( module Defaults
3+
, module Internal
34
, module Validation
45
, build
5-
, buildConcurrently
6-
, buildWithDefaults
76
, static
87
, section
98
, inputBox
@@ -66,7 +65,8 @@ import JSS (JSS, jss)
6665
import Lumi.Components.Color (colors)
6766
import Lumi.Components.Column (column)
6867
import Lumi.Components.FetchCache as FetchCache
69-
import Lumi.Components.Form.Internal (FormBuilder(..), SeqFormBuilder, Tree(..), formBuilder, formBuilder_, invalidate, revalidate, sequential, pruneTree)
68+
import Lumi.Components.Form.Defaults (formDefaults) as Defaults
69+
import Lumi.Components.Form.Internal (FormBuilder(..), SeqFormBuilder, Tree(..), formBuilder, formBuilder_, invalidate, pruneTree, sequential)
7070
import Lumi.Components.Form.Internal (FormBuilder, SeqFormBuilder, formBuilder, formBuilder_, invalidate, listen, parallel, revalidate, sequential) as Internal
7171
import Lumi.Components.Form.Validation (Validated(..), Validator, _Validated, fromValidated, mustBe, mustEqual, nonEmpty, nonEmptyArray, nonNull, validNumber, validInt, optional, setFresh, setModified, validated, warn) as Validation
7272
import Lumi.Components.Input (alignToInput)
@@ -98,30 +98,6 @@ import Unsafe.Coerce (unsafeCoerce)
9898
-- | _Note_: this function should be fully applied, to avoid remounting
9999
-- | the component on each render.
100100
build
101-
:: forall props unvalidated result
102-
. FormBuilder { readonly :: Boolean | props } unvalidated result
103-
-> { value :: unvalidated
104-
, onChange :: Maybe result -> unvalidated -> Effect Unit
105-
, inlineTable :: Boolean
106-
, forceTopLabels :: Boolean
107-
, readonly :: Boolean
108-
| props
109-
}
110-
-> JSX
111-
build editor = \props ->
112-
form props
113-
{ onChange = \f ->
114-
let v = f props.value
115-
in props.onChange (revalidate editor (unsafeCoerce props) v) v
116-
}
117-
where
118-
form = buildConcurrently editor
119-
120-
-- | Create a React component for a form from a `FormBuilder`.
121-
-- |
122-
-- | _Note_: this function should be fully applied, to avoid remounting
123-
-- | the component on each render.
124-
buildConcurrently
125101
:: forall props unvalidated result
126102
. FormBuilder { readonly :: Boolean | props } unvalidated result
127103
-> { value :: unvalidated
@@ -132,7 +108,7 @@ buildConcurrently
132108
| props
133109
}
134110
-> JSX
135-
buildConcurrently editor = makeStateless (createComponent "Form") render where
111+
build editor = makeStateless (createComponent "Form") render where
136112
render props@{ value, onChange, inlineTable, forceTopLabels, readonly } =
137113

138114
let forest = Array.mapMaybe pruneTree $ edit onChange
@@ -182,29 +158,6 @@ buildConcurrently editor = makeStateless (createComponent "Form") render where
182158
, children: surround fieldDivider (map toRow forest)
183159
}
184160

185-
-- | Utility function.
186-
-- | Create a React component for a form from a `FormBuilder` and a default
187-
-- | form state. This default value is used in the form whenever the `value`
188-
-- | prop is `Nothing`.
189-
-- |
190-
-- | _Note_: this function should be fully applied, to avoid remounting
191-
-- | the component on each render.
192-
buildWithDefaults
193-
:: forall props unvalidated result
194-
. unvalidated
195-
-> FormBuilder { readonly :: Boolean | props } unvalidated result
196-
-> { value :: Maybe unvalidated
197-
, onChange :: Maybe result -> unvalidated -> Effect Unit
198-
, inlineTable :: Boolean
199-
, forceTopLabels :: Boolean
200-
, readonly :: Boolean
201-
| props
202-
}
203-
-> JSX
204-
buildWithDefaults defaults editor = \props -> form props { value = fromMaybe defaults props.value }
205-
where
206-
form = build editor
207-
208161
-- | Create an always-valid `FormBuilder` that renders the supplied `JSX`.
209162
static :: forall props value. JSX -> FormBuilder props value Unit
210163
static edit = formBuilder \_ _ -> { edit: const edit, validate: pure unit }

src/Lumi/Components/Form/Defaults.purs

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import Prelude
1010
import Data.Either (Either(..))
1111
import Data.Maybe (Maybe(..))
1212
import Data.Symbol (class IsSymbol, SProxy(..))
13-
import Lumi.Components.Form (Validated(..))
13+
import Lumi.Components.Form.Validation (Validated(..))
1414
import Prim.Row (class Cons, class Lacks)
1515
import Prim.RowList (class RowToList, Cons, Nil)
1616
import Record.Builder (Builder)

src/Lumi/Components/Wizard.purs

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ step
6363
~> Wizard step { readonly :: Boolean | props } value
6464
step s f =
6565
let
66-
form = F.buildConcurrently f
66+
form = F.build f
6767
in
6868
Wizard $ liftF $ Form
6969
{ step: s

0 commit comments

Comments
 (0)