Many thanks, Ambrose! That was very helpful indeed ; ) Gonna make it work.

On Mon, Sep 12, 2016 at 4:15 PM Ambrose Laing <[email protected]> wrote:

> Something like this can be made to work, if you don't care about relaxing
> the type safety which is provided by your current approach:
>
>
> initialModel =
>     { form : Dict.fromList
>         [ ("applicant",
>
>             { label = "Applicant name"
>             , selected = True
>             , value = ""
>
>             })
>         , ("year",
>
>             { label = "Year"
>             , selected = True
>             , value = ""
>
>             })
>         , ("state",
>
>             { label = "State"
>             , selected = True
>             , value = ""
>
>             })
>         …
>         ]
>     …
>     }
>
>
> type Msg
>     = Update String String
>
>
>
> update msg model =
>     case
> msg of
>         Update fieldName query ->
>             let
>                 entry =
>                     Dict.get fieldName model.form
>
>                 newEntry =
>                     { entry | value = query }
>
>                 form = Dict.insert fieldName newEntry model.form
>             in
>
>                 ( { model | form = form }, Cmd.none )
>
>
> You should make it safer by including run-time checks that the first
> string argument (fieldName) is one of your 20 possibilities, before doing
> the above replacement, and if it isn't then you should specify what to do
> (maybe ignore it).
>
> On Monday, September 12, 2016 at 12:08:25 PM UTC-4, Eduardo Cuducos wrote:
>>
>> Hi all,
>>
>> I'm writing an application that has a “advanced search” form. In my
>> context it means a form with approx. 20 input fields.
>>
>> As a newbie the only way I could think of coding this is quite
>> repetitive. I bet that there is a more cleaver and a DRY way to do it, but
>> I couldn't figure out how. Any ideias?
>>
>> This is the terrible idea I have in mind:
>>
>> 1. My initial model would have 20 form fields definition like that:
>>
>> initialModel =
>>     { form :
>>         { applicant =
>>             { label = "Applicant name"
>>             , selected = True
>>             , value = ""
>>             , msg = UpdateApplicant
>>             }
>>         , year =
>>             { label = "Year"
>>             , selected = True
>>             , value = ""
>>             , msg = UpdateYear
>>             }
>>         , state =
>>             { label = "State"
>>             , selected = True
>>             , value = ""
>>             , msg = UpdateState
>>             }
>>         …
>>         }
>>     …
>>     }
>>
>>
>> 2. Consequently my type Msg would have another 20 very similar fields:
>>
>> type Msg
>>     = UpdateApplicant String
>>     | UpdateYear String
>>     | UpdateState
>>     | …
>>
>> 3. And my update would have 20 very similar cases:
>>
>> update msg model =
>>     case msg of
>>         UpdateApplicant query ->
>>             let
>>                 applicant =
>>                     model.form.applicant
>>
>>                 newApplicant =
>>                     { applicant | value = query }
>>
>>                 currentForm =
>>                     model.form
>>
>>                 form =
>>                     { currentForm | applicant = newApplicant }
>>             in
>>                 ( { model | form = form }, Cmd.none )
>>
>>         UpdateYear query ->
>>             let
>>                 year =
>>                     model.form.year
>>
>>                 newYear =
>>                     { year | value = query }
>>
>>                 currentForm =
>>                     model.form
>>
>>                 form =
>>                     { currentForm | year = newYear }
>>             in
>>                 ( { model | form = form }, Cmd.none )
>>
>>         UpdateState query ->
>>             let
>>                 state =
>>                     model.form.state
>>
>>                 newState =
>>                     { state | value = query }
>>
>>                 currentForm =
>>                     model.form
>>
>>                 form =
>>                     { currentForm | state = newState }
>>             in
>>                 ( { model | form = form }, Cmd.none )
>>
>> Many thanks,
>>
>> --
> You received this message because you are subscribed to the Google Groups
> "Elm Discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups "Elm 
Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to