11module Lumi.Components.Form.Table
22 ( TableFormBuilder
3- , column
4- , column_
53 , editableTable
64 , nonEmptyEditableTable
5+ , column
6+ , column_
7+ , withProps
78 ) where
89
910import Prelude
@@ -16,7 +17,7 @@ import Data.FunctorWithIndex (mapWithIndex)
1617import Data.Lens.Index (ix )
1718import Data.Maybe (Maybe , fromMaybe , isNothing , maybe )
1819import Data.Monoid (guard )
19- import Data.Newtype (class Newtype )
20+ import Data.Newtype (class Newtype , un )
2021import Data.Nullable as Nullable
2122import Data.Traversable (traverse )
2223import Data.Tuple (Tuple (..))
@@ -39,27 +40,32 @@ import Unsafe.Reference (unsafeRefEq)
3940-- | `editableTable` function.
4041newtype 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
4952derive instance newtypeTableFormBuilder :: Newtype (TableFormBuilder props row a ) _
5053derive instance functorTableFormBuilder :: Functor (TableFormBuilder props row )
5154instance 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+ }
5864instance 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 )
7985editableTable { 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 )
128134nonEmptyEditableTable { 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