Skip to content

Commit c7a2ab7

Browse files
Allow for props to change TableFormBuilder's columns (#87)
* Allow for props to change TableFormBuilder's columns * Improve comments on withProps and withValue
1 parent 2c2dc10 commit c7a2ab7

File tree

2 files changed

+50
-34
lines changed

2 files changed

+50
-34
lines changed

src/Lumi/Components/Form.purs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -995,14 +995,16 @@ mapUI f form =
995995
, validate
996996
}
997997

998-
-- | Make the props available, for convenience.
998+
-- | Make the props available. This allows for changing the structure of a form
999+
-- | builder based on the current props.
9991000
withProps
10001001
:: forall ui props unvalidated result
10011002
. (props -> FormBuilder' ui props unvalidated result)
10021003
-> FormBuilder' ui props unvalidated result
10031004
withProps f = FormBuilder \props value -> un FormBuilder (f props) props value
10041005

1005-
-- | Make the value available, for convenience.
1006+
-- | Make the value available. This allows for changing the structure of a form
1007+
-- | builder based on the current value.
10061008
withValue
10071009
:: forall ui props unvalidated result
10081010
. (unvalidated -> FormBuilder' ui props unvalidated result)

src/Lumi/Components/Form/Table.purs

Lines changed: 46 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
module Lumi.Components.Form.Table
22
( TableFormBuilder
3-
, column
4-
, column_
53
, editableTable
64
, nonEmptyEditableTable
5+
, column
6+
, column_
7+
, withProps
78
) where
89

910
import Prelude
@@ -16,7 +17,7 @@ import Data.FunctorWithIndex (mapWithIndex)
1617
import Data.Lens.Index (ix)
1718
import Data.Maybe (Maybe, fromMaybe, isNothing, maybe)
1819
import Data.Monoid (guard)
19-
import Data.Newtype (class Newtype)
20+
import Data.Newtype (class Newtype, un)
2021
import Data.Nullable as Nullable
2122
import Data.Traversable (traverse)
2223
import Data.Tuple (Tuple(..))
@@ -39,27 +40,32 @@ import Unsafe.Reference (unsafeRefEq)
3940
-- | `editableTable` function.
4041
newtype TableFormBuilder props row result =
4142
TableFormBuilder
42-
{ columns :: Array
43-
{ label :: String
44-
, render :: props -> row -> ((row -> row) -> Effect Unit) -> JSX
45-
}
46-
, validate :: props -> row -> Maybe result
47-
}
43+
( props
44+
-> { columns :: Array
45+
{ label :: String
46+
, render :: row -> ((row -> row) -> Effect Unit) -> JSX
47+
}
48+
, validate :: row -> Maybe result
49+
}
50+
)
4851

4952
derive instance newtypeTableFormBuilder :: Newtype (TableFormBuilder props row a) _
5053
derive instance functorTableFormBuilder :: Functor (TableFormBuilder props row)
5154
instance applyTableFormBuilder :: Apply (TableFormBuilder props row) where
52-
apply (TableFormBuilder f) (TableFormBuilder a) =
53-
TableFormBuilder
54-
{ columns: f.columns <> a.columns
55-
, validate: \props row ->
56-
f.validate props row <*> a.validate props row
57-
}
55+
apply (TableFormBuilder ff) (TableFormBuilder fa) =
56+
TableFormBuilder \props ->
57+
let
58+
{ columns: columnsF, validate: validateF } = ff props
59+
{ columns: columnsA, validate: validateA } = fa props
60+
in
61+
{ columns: columnsF <> columnsA
62+
, validate: \row -> validateF row <*> validateA row
63+
}
5864
instance applicativeTableFormBuilder :: Applicative (TableFormBuilder props row) where
5965
pure a =
60-
TableFormBuilder
66+
TableFormBuilder \_ ->
6167
{ columns: []
62-
, validate: \_ _ -> pure a
68+
, validate: \_ -> pure a
6369
}
6470

6571
-- | A `TableFormBuilder` makes a `FormBuilder` for an array where each row has
@@ -77,10 +83,10 @@ editableTable
7783
(Array row)
7884
(Array result)
7985
editableTable { addLabel, defaultValue, formBuilder: builder, maxRows, summary } =
80-
let
81-
TableFormBuilder { columns, validate } = builder
82-
in
83-
formBuilder \props rows ->
86+
formBuilder \props rows ->
87+
let
88+
{ columns, validate } = (un TableFormBuilder builder) props
89+
in
8490
{ edit: \onChange ->
8591
EditableTable.editableTable
8692
{ addLabel
@@ -105,10 +111,10 @@ editableTable { addLabel, defaultValue, formBuilder: builder, maxRows, summary }
105111
columns <#> \{ label, render } ->
106112
{ label
107113
, renderCell: \(Tuple i r) ->
108-
render props r (onChange <<< ix i)
114+
render r (onChange <<< ix i)
109115
}
110116
}
111-
, validate: traverse (validate props) rows
117+
, validate: traverse validate rows
112118
}
113119

114120
-- | A `TableFormBuilder` makes a `FormBuilder` for a non-empty array where each
@@ -126,10 +132,10 @@ nonEmptyEditableTable
126132
(NEA.NonEmptyArray row)
127133
(NEA.NonEmptyArray result)
128134
nonEmptyEditableTable { addLabel, defaultValue, formBuilder: builder, maxRows, summary } =
129-
let
130-
TableFormBuilder { columns, validate } = builder
131-
in
132-
formBuilder \props rows ->
135+
formBuilder \props rows ->
136+
let
137+
{ columns, validate } = (un TableFormBuilder builder) props
138+
in
133139
{ edit: \onChange ->
134140
EditableTable.editableTable
135141
{ addLabel
@@ -154,10 +160,10 @@ nonEmptyEditableTable { addLabel, defaultValue, formBuilder: builder, maxRows, s
154160
columns <#> \{ label, render } ->
155161
{ label
156162
, renderCell: \(Tuple i r) ->
157-
render props r (onChange <<< ix i)
163+
render r (onChange <<< ix i)
158164
}
159165
}
160-
, validate: traverse (validate props) rows
166+
, validate: traverse validate rows
161167
}
162168

163169
-- | Convert a `FormBuilder` into a column of a table form with the specified
@@ -186,14 +192,14 @@ column label orientation (FormBuilder f) =
186192
Vertical ->
187193
verticalRenderer
188194
in
189-
TableFormBuilder
195+
TableFormBuilder \props ->
190196
{ columns:
191197
[ { label
192-
, render: \props row onChange ->
198+
, render: \row onChange ->
193199
renderer props.readonly ((f props row).edit onChange)
194200
}
195201
]
196-
, validate: \props row ->
202+
, validate: \row ->
197203
(f props row).validate
198204
}
199205
where
@@ -270,3 +276,11 @@ column label orientation (FormBuilder f) =
270276
{ className = Nullable.notNull "labeled-field--validation-warning"
271277
, children = [ R.text w ]
272278
}
279+
280+
-- | Make the props available. This allows for changing the structure of a table
281+
-- | form builder based on the current props.
282+
withProps
283+
:: forall props row result
284+
. (props -> TableFormBuilder props row result)
285+
-> TableFormBuilder props row result
286+
withProps f = TableFormBuilder \props -> un TableFormBuilder (f props) props

0 commit comments

Comments
 (0)