There is a bug in my code which is that Dict.get returns a Maybe, so you
will have to handle the possibility that the fieldName is not found using
maybe
case entry of
Just something -> ...
Nothing -> ...
On Mon, Sep 12, 2016 at 3:16 PM, Eduardo Cuducos <[email protected]> wrote:
> 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 a topic in the
> Google Groups "Elm Discuss" group.
> To unsubscribe from this topic, visit https://groups.google.com/d/
> topic/elm-discuss/vrCjxS58XeY/unsubscribe.
> To unsubscribe from this group and all its topics, 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.