From 9be4926d346fd38355f5c5e7c264f0a9d2b2c07a Mon Sep 17 00:00:00 2001 From: Dillon Kearns Date: Mon, 10 Jan 2022 10:34:20 -0800 Subject: [PATCH] Use record for Form model in preparation for adding more state. --- examples/pokedex/src/Page/Form.elm | 7 +- examples/pokedex/src/Page/TailwindForm.elm | 16 +++-- src/Form.elm | 76 ++++++++++++---------- 3 files changed, 58 insertions(+), 41 deletions(-) diff --git a/examples/pokedex/src/Page/Form.elm b/examples/pokedex/src/Page/Form.elm index dc2c5d59..6ea21729 100644 --- a/examples/pokedex/src/Page/Form.elm +++ b/examples/pokedex/src/Page/Form.elm @@ -278,7 +278,12 @@ view maybeUrl sharedModel static = [] [ Html.text <| "Edit profile " ++ user.first ++ " " ++ user.last ] , form user - |> Form.toHtml { pageReloadSubmit = True } Html.form (static.data.errors |> Maybe.withDefault (Form.init (form defaultUser))) + |> Form.toHtml { pageReloadSubmit = True } + Html.form + { fields = + static.data.errors + |> Maybe.withDefault (Form.init (form defaultUser) |> .fields) + } |> Html.map (\_ -> ()) ] } diff --git a/examples/pokedex/src/Page/TailwindForm.elm b/examples/pokedex/src/Page/TailwindForm.elm index ca879c0c..acf9085a 100644 --- a/examples/pokedex/src/Page/TailwindForm.elm +++ b/examples/pokedex/src/Page/TailwindForm.elm @@ -34,7 +34,7 @@ type alias Model = type Msg = FormMsg Form.Msg - | GotFormResponse (Result Http.Error Form.Model) + | GotFormResponse (Result Http.Error Form.FieldState) type alias RouteParams = @@ -445,13 +445,17 @@ update _ _ _ _ msg model = GotFormResponse result -> case result of Ok updatedFormModel -> + let + newFormModel = + { fields = updatedFormModel } + in ( { model - | form = updatedFormModel + | form = newFormModel } , Cmd.none ) |> withFlash - (if Form.hasErrors2 updatedFormModel then + (if Form.hasErrors2 newFormModel then Err "Failed to submit or had errors" else @@ -488,7 +492,7 @@ init _ _ static = type alias Data = { user : Maybe (Result String User) - , errors : Maybe (Dict String { raw : Maybe String, errors : List String }) + , errors : Maybe Form.Model } @@ -505,12 +509,12 @@ data routeParams = (case result of Ok ( user, errors ) -> { user = Just user - , errors = Just errors + , errors = Just { fields = errors } } Err errors -> { user = Nothing - , errors = Just errors + , errors = Just { fields = errors } } ) |> PageServerResponse.RenderPage diff --git a/src/Form.elm b/src/Form.elm index 5de34fd3..4da53fc2 100644 --- a/src/Form.elm +++ b/src/Form.elm @@ -18,7 +18,7 @@ import Server.Response import Url -http : String -> Form value view -> Model -> Cmd (Result Http.Error Model) +http : String -> Form value view -> Model -> Cmd (Result Http.Error FieldState) http url_ (Form fields decoder serverValidations modelToValue) model = Http.request { method = "POST" @@ -26,7 +26,7 @@ http url_ (Form fields decoder serverValidations modelToValue) model = [ Http.header "accept" "application/json" ] , body = - model + model.fields |> Dict.toList |> List.map (\( name, { raw } ) -> @@ -147,12 +147,17 @@ type Msg type alias Model = + { fields : FieldState + } + + +type alias FieldState = Dict String { raw : Maybe String, errors : List String } rawValues : Model -> Dict String String rawValues model = - model + model.fields |> Dict.map (\key value -> value.raw |> Maybe.withDefault "" @@ -196,18 +201,21 @@ update form msg model = case msg of OnFieldInput { name, value } -> -- TODO run client-side validations - model - |> Dict.update name - (\entry -> - case entry of - Just { raw, errors } -> - -- TODO calculate errors here? - Just { raw = Just value, errors = runValidation form { name = name, value = value } } + { model + | fields = + model.fields + |> Dict.update name + (\entry -> + case entry of + Just { raw, errors } -> + -- TODO calculate errors here? + Just { raw = Just value, errors = runValidation form { name = name, value = value } } - Nothing -> - -- TODO calculate errors here? - Just { raw = Just value, errors = [] } - ) + Nothing -> + -- TODO calculate errors here? + Just { raw = Just value, errors = [] } + ) + } OnFieldFocus record -> model @@ -221,19 +229,21 @@ update form msg model = init : Form value view -> Model init (Form fields decoder serverValidations modelToValue) = - fields - |> List.concatMap Tuple.first - |> List.filterMap - (\field -> - field.initialValue - |> Maybe.map - (\initial -> - ( field.name - , { raw = Just initial, errors = [] } + { fields = + fields + |> List.concatMap Tuple.first + |> List.filterMap + (\field -> + field.initialValue + |> Maybe.map + (\initial -> + ( field.name + , { raw = Just initial, errors = [] } + ) ) - ) - ) - |> Dict.fromList + ) + |> Dict.fromList + } toInputRecord : @@ -840,7 +850,7 @@ with (Field field) (Form fields decoder serverValidations modelToValue) = let maybeValue : Maybe String maybeValue = - model + model.fields |> Dict.get field.name |> Maybe.andThen .raw in @@ -962,16 +972,14 @@ simplify3 field = toHtml : { pageReloadSubmit : Bool } -> (List (Html.Attribute Msg) -> List view -> view) - -> Dict String { raw : Maybe String, errors : List String } + -> Model -> Form value view -> view toHtml { pageReloadSubmit } toForm serverValidationErrors (Form fields decoder serverValidations modelToValue) = let hasErrors_ : Bool hasErrors_ = - Dict.Extra.any - (\key value -> not (List.isEmpty value.errors)) - serverValidationErrors + hasErrors2 serverValidationErrors in toForm ([ [ Attr.method "POST" ] @@ -994,7 +1002,7 @@ toHtml { pageReloadSubmit } toForm serverValidationErrors (Form fields decoder s field.toHtml hasErrors_ (simplify3 field) - (serverValidationErrors + (serverValidationErrors.fields |> Dict.get field.name ) ) @@ -1067,7 +1075,7 @@ toRequest2 : -> Request (DataSource - (Result Model ( Result String value, Model )) + (Result FieldState ( Result String value, FieldState )) ) toRequest2 (Form fields decoder serverValidations modelToValue) = Request.map2 @@ -1119,4 +1127,4 @@ hasErrors2 model = (\_ entry -> entry.errors |> List.isEmpty |> not ) - model + model.fields