Use navigation requests as default form submission strategy, with builder function to set withConcurrent.

This commit is contained in:
Dillon Kearns 2023-05-23 11:23:56 -07:00
parent d0a4feeb02
commit 284a40c306
39 changed files with 84 additions and 69 deletions

View File

@ -50,7 +50,7 @@
"dillonkearns/elm-bcp47-language-tag": "1.0.1 <= v < 2.0.0",
"dillonkearns/elm-cli-options-parser": "3.2.0 <= v < 4.0.0",
"dillonkearns/elm-date-or-date-time": "2.0.0 <= v < 3.0.0",
"dillonkearns/elm-form": "2.0.2 <= v < 3.0.0",
"dillonkearns/elm-form": "3.0.0 <= v < 4.0.0",
"elm/browser": "1.0.2 <= v < 2.0.0",
"elm/bytes": "1.0.8 <= v < 2.0.0",
"elm/core": "1.0.5 <= v < 2.0.0",

View File

@ -16,7 +16,7 @@
"danyx23/elm-mimetype": "4.0.1",
"dillonkearns/elm-bcp47-language-tag": "1.0.1",
"dillonkearns/elm-date-or-date-time": "2.0.0",
"dillonkearns/elm-form": "2.0.2",
"dillonkearns/elm-form": "3.0.0",
"dillonkearns/elm-markdown": "7.0.1",
"elm/browser": "1.0.2",
"elm/bytes": "1.0.8",

View File

@ -17,7 +17,8 @@
}
},
"../..": {
"version": "3.0.0-beta.38",
"name": "elm-pages",
"version": "3.0.0-beta.40",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {

View File

@ -153,7 +153,6 @@ view app shared model =
[ Html.h2 [] [ Html.text "Form" ]
, form
|> Pages.Form.renderHtml []
Pages.Form.Serial
(Form.options "form"
|> Form.withInput app.data.post
|> Form.withServerResponse
@ -166,7 +165,6 @@ view app shared model =
else
deleteForm
|> Pages.Form.renderHtml []
Pages.Form.Serial
(Form.options "delete")
app
]

View File

@ -19,7 +19,7 @@
"dillonkearns/elm-bcp47-language-tag": "1.0.1",
"dillonkearns/elm-cli-options-parser": "3.2.0",
"dillonkearns/elm-date-or-date-time": "2.0.0",
"dillonkearns/elm-form": "2.0.2",
"dillonkearns/elm-form": "3.0.0",
"dillonkearns/elm-graphql": "5.0.11",
"dillonkearns/elm-markdown": "7.0.1",
"elm/browser": "1.0.2",

View File

@ -28,7 +28,7 @@
},
"../..": {
"name": "elm-pages",
"version": "3.0.0-beta.38",
"version": "3.0.0-beta.40",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {

View File

@ -15,7 +15,7 @@
"danyx23/elm-mimetype": "4.0.1",
"dillonkearns/elm-bcp47-language-tag": "1.0.1",
"dillonkearns/elm-date-or-date-time": "2.0.0",
"dillonkearns/elm-form": "2.0.2",
"dillonkearns/elm-form": "3.0.0",
"dillonkearns/elm-markdown": "7.0.1",
"dillonkearns/elm-oembed": "1.0.0",
"dillonkearns/elm-rss": "2.0.3",

View File

@ -22,7 +22,7 @@
},
"../..": {
"name": "elm-pages",
"version": "3.0.0-beta.38",
"version": "3.0.0-beta.40",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {

View File

@ -212,9 +212,9 @@ view app shared model =
]
[ form
|> Pages.Form.renderStyledHtml []
Pages.Form.Parallel
(Form.options "dark-mode"
|> Form.withInput app.data.isDarkMode
|> Pages.Form.withConcurrent
)
app
, Html.text <|

View File

@ -240,7 +240,6 @@ view app sharedModel model =
, form
|> Pages.Form.renderStyledHtml
[]
Pages.Form.Serial
(Form.options ("add-item-" ++ String.fromInt model.itemIndex)
|> Form.withOnSubmit (\_ -> AddItemSubmitted)
)
@ -249,8 +248,9 @@ view app sharedModel model =
[ deleteForm
|> Pages.Form.renderStyledHtml
[]
Pages.Form.Parallel
(Form.options "delete-all")
(Form.options "delete-all"
|> Pages.Form.withConcurrent
)
app
]
, optimisticItems

View File

@ -252,7 +252,6 @@ view app shared =
, Attr.style "flex-direction" "column"
, Attr.style "gap" "20px"
]
Pages.Form.Serial
(Form.options "user-form"
|> Form.withInput defaultUser
|> Form.withServerResponse (app.action |> Maybe.map .formResponse)

View File

@ -130,7 +130,6 @@ view app shared =
, Attr.style "flex-direction" "column"
, Attr.style "gap" "20px"
]
Pages.Form.Serial
(Form.options "user-form"
|> Form.withInput app.data.filters
|> Form.withGetMethod

View File

@ -222,7 +222,6 @@ view app shared =
, form
|> Pages.Form.renderStyledHtml
[]
Pages.Form.Serial
(Form.options "form"
|> Form.withServerResponse (app.action |> Maybe.map .errors)
)

View File

@ -18,7 +18,7 @@
"dillonkearns/elm-bcp47-language-tag": "1.0.1",
"dillonkearns/elm-cli-options-parser": "3.2.0",
"dillonkearns/elm-date-or-date-time": "2.0.0",
"dillonkearns/elm-form": "2.0.2",
"dillonkearns/elm-form": "3.0.0",
"elm/browser": "1.0.2",
"elm/bytes": "1.0.8",
"elm/core": "1.0.5",

View File

@ -16,7 +16,7 @@
},
"../..": {
"name": "elm-pages",
"version": "3.0.0-beta.39",
"version": "3.0.0-beta.40",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {

View File

@ -16,7 +16,7 @@
"danyx23/elm-mimetype": "4.0.1",
"dillonkearns/elm-bcp47-language-tag": "1.0.1",
"dillonkearns/elm-date-or-date-time": "2.0.0",
"dillonkearns/elm-form": "2.0.2",
"dillonkearns/elm-form": "3.0.0",
"dillonkearns/elm-markdown": "7.0.1",
"elm/browser": "1.0.2",
"elm/bytes": "1.0.8",

View File

@ -17,7 +17,8 @@
}
},
"../..": {
"version": "3.0.0-beta.38",
"name": "elm-pages",
"version": "3.0.0-beta.40",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {

View File

@ -7,7 +7,7 @@ import Html exposing (Html)
import Html.Styled
import Pages.Flags
import Pages.PageUrl exposing (PageUrl)
import Path exposing (Path)
import UrlPath exposing (UrlPath)
import Route exposing (Route)
import SharedTemplate exposing (SharedTemplate)
import View exposing (View)
@ -26,7 +26,7 @@ template =
type Msg
= OnPageChange
{ path : Path
{ path : UrlPath
, query : Maybe String
, fragment : Maybe String
}
@ -50,7 +50,7 @@ init :
->
Maybe
{ path :
{ path : Path
{ path : UrlPath
, query : Maybe String
, fragment : Maybe String
}
@ -71,7 +71,7 @@ update msg model =
( { model | showMobileMenu = False }, Effect.none )
subscriptions : Path -> Model -> Sub Msg
subscriptions : UrlPath -> Model -> Sub Msg
subscriptions _ _ =
Sub.none
@ -84,7 +84,7 @@ data =
view :
Data
->
{ path : Path
{ path : UrlPath
, route : Maybe Route
}
-> Model

View File

@ -23,7 +23,7 @@
},
"../..": {
"name": "elm-pages",
"version": "3.0.0-beta.38",
"version": "3.0.0-beta.40",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {

View File

@ -15,7 +15,7 @@
"danyx23/elm-mimetype": "4.0.1",
"dillonkearns/elm-bcp47-language-tag": "1.0.1",
"dillonkearns/elm-date-or-date-time": "2.0.0",
"dillonkearns/elm-form": "2.0.2",
"dillonkearns/elm-form": "3.0.0",
"dillonkearns/elm-markdown": "6.0.1",
"elm/browser": "1.0.2",
"elm/bytes": "1.0.8",

View File

@ -15,7 +15,7 @@
},
"../..": {
"name": "elm-pages",
"version": "3.0.0-beta.38",
"version": "3.0.0-beta.40",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {

View File

@ -267,7 +267,6 @@ view app shared =
, Attr.style "flex-direction" "column"
, Attr.style "gap" "20px"
]
Pages.Form.Serial
(Form.options "test1"
|> Form.withInput defaultUser
)

View File

@ -206,7 +206,6 @@ view static sharedModel model =
, form
|> Pages.Form.renderHtml
[]
Pages.Form.Serial
(Form.options "test1" |> Form.withGetMethod)
-- TODO pass in server data
static

View File

@ -265,7 +265,6 @@ view app shared model =
, form
|> Pages.Form.renderHtml
[]
Pages.Form.Serial
(Form.options "test1")
-- TODO pass in server data
app

View File

@ -703,7 +703,6 @@ view app model sharedModel =
, form
|> Pages.Form.renderStyledHtml
[]
Pages.Form.Serial
(Form.options "test"
|> Form.withServerResponse
(app.action |> Maybe.andThen .formResponse)

View File

@ -17,7 +17,7 @@
"danyx23/elm-mimetype": "4.0.1",
"dillonkearns/elm-bcp47-language-tag": "1.0.1",
"dillonkearns/elm-date-or-date-time": "2.0.0",
"dillonkearns/elm-form": "2.0.2",
"dillonkearns/elm-form": "3.0.0",
"dillonkearns/elm-graphql": "5.0.11",
"dillonkearns/elm-markdown": "7.0.1",
"dillonkearns/elm-sitemap": "1.0.2",

View File

@ -27,7 +27,7 @@
},
"../..": {
"name": "elm-pages",
"version": "3.0.0-beta.38",
"version": "3.0.0-beta.40",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {

View File

@ -17,7 +17,7 @@
},
"../..": {
"name": "elm-pages",
"version": "3.0.0-beta.38",
"version": "3.0.0-beta.40",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {

View File

@ -7,7 +7,7 @@ import Html exposing (Html)
import Html.Styled
import Pages.Flags
import Pages.PageUrl exposing (PageUrl)
import Path exposing (Path)
import UrlPath exposing (UrlPath)
import Route exposing (Route)
import SharedTemplate exposing (SharedTemplate)
import View exposing (View)
@ -26,7 +26,7 @@ template =
type Msg
= OnPageChange
{ path : Path
{ path : UrlPath
, query : Maybe String
, fragment : Maybe String
}
@ -50,7 +50,7 @@ init :
->
Maybe
{ path :
{ path : Path
{ path : UrlPath
, query : Maybe String
, fragment : Maybe String
}
@ -71,7 +71,7 @@ update msg model =
( { model | showMobileMenu = False }, Effect.none )
subscriptions : Path -> Model -> Sub Msg
subscriptions : UrlPath -> Model -> Sub Msg
subscriptions _ _ =
Sub.none
@ -86,7 +86,7 @@ data =
view :
Data
->
{ path : Path
{ path : UrlPath
, route : Maybe Route
}
-> Model

View File

@ -15,7 +15,7 @@
"danyx23/elm-mimetype": "4.0.1",
"dillonkearns/elm-bcp47-language-tag": "1.0.1",
"dillonkearns/elm-date-or-date-time": "2.0.0",
"dillonkearns/elm-form": "2.0.2",
"dillonkearns/elm-form": "3.0.0",
"elm/browser": "1.0.2",
"elm/bytes": "1.0.8",
"elm/core": "1.0.5",

View File

@ -18,7 +18,7 @@
},
"../..": {
"name": "elm-pages",
"version": "3.0.0-beta.38",
"version": "3.0.0-beta.40",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {

View File

@ -17,7 +17,7 @@
},
"../..": {
"name": "elm-pages",
"version": "3.0.0-beta.38",
"version": "3.0.0-beta.40",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {

View File

@ -26,7 +26,7 @@
},
"../..": {
"name": "elm-pages",
"version": "3.0.0-beta.38",
"version": "3.0.0-beta.40",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {

View File

@ -398,8 +398,9 @@ view app shared =
[ Html.text <| "Hello! You are already logged in as " ++ username
, logoutForm
|> Pages.Form.renderHtml []
Pages.Form.Parallel
(Form.options "logout")
(Form.options "logout"
|> Pages.Form.withConcurrent
)
app
]
@ -408,7 +409,6 @@ view app shared =
]
, form
|> Pages.Form.renderHtml []
Pages.Form.Serial
(Form.options "login"
|> Form.withServerResponse (app.action |> Maybe.andThen .maybeError)
)

View File

@ -497,13 +497,13 @@ view app shared model =
[ class "create-form"
, hidden (not (List.isEmpty failedAddItemActions))
]
Pages.Form.Parallel
(Form.options
("new-item-"
++ (model.nextId |> Time.posixToMillis |> String.fromInt)
)
|> Form.withInput Nothing
|> Form.withOnSubmit (\_ -> NewItemSubmitted)
|> Pages.Form.withConcurrent
)
app
, div []
@ -513,10 +513,10 @@ view app shared model =
addItemForm
|> Pages.Form.renderHtml
[ class "create-form", hidden (index /= 0) ]
Pages.Form.Parallel
(Form.options key
|> Form.withOnSubmit (\_ -> NewItemSubmitted)
|> Form.withInput (Just createFetcherErrors)
|> Pages.Form.withConcurrent
)
app
)
@ -737,9 +737,9 @@ viewEntries app visibility entries =
]
[ toggleAllForm
|> Pages.Form.renderHtml []
Pages.Form.Parallel
(Form.options "toggle-all"
|> Form.withInput { allCompleted = allCompleted }
|> Pages.Form.withConcurrent
)
app
, Keyed.ul [ class "todo-list" ] <|
@ -767,17 +767,17 @@ viewEntry app todo =
[ class "view" ]
[ checkItemForm
|> Pages.Form.renderHtml []
Pages.Form.Parallel
(("toggle-" ++ todo.id)
|> Form.options
|> Form.withInput todo
|> Pages.Form.withConcurrent
)
app
, editItemForm
|> Pages.Form.renderHtml []
Pages.Form.Parallel
(Form.options ("edit-" ++ todo.id)
|> Form.withInput todo
|> Pages.Form.withConcurrent
)
app
, if todo.isSaving then
@ -786,9 +786,9 @@ viewEntry app todo =
else
deleteItemForm
|> Pages.Form.renderHtml []
Pages.Form.Parallel
(Form.options ("delete-" ++ todo.id)
|> Form.withInput todo
|> Pages.Form.withConcurrent
)
app
]
@ -881,9 +881,9 @@ viewControlsClear : App Data ActionData RouteParams -> Int -> Html (PagesMsg Msg
viewControlsClear app entriesCompleted =
clearCompletedForm
|> Pages.Form.renderHtml []
Pages.Form.Parallel
(Form.options "clear-completed"
|> Form.withInput { entriesCompleted = entriesCompleted }
|> Pages.Form.withConcurrent
)
app

View File

@ -19,7 +19,7 @@
"dillonkearns/elm-bcp47-language-tag": "1.0.1",
"dillonkearns/elm-cli-options-parser": "3.2.0",
"dillonkearns/elm-date-or-date-time": "2.0.0",
"dillonkearns/elm-form": "2.0.2",
"dillonkearns/elm-form": "3.0.0",
"dillonkearns/elm-graphql": "5.0.11",
"dillonkearns/elm-markdown": "7.0.1",
"elm/browser": "1.0.2",

View File

@ -28,7 +28,7 @@
},
"../..": {
"name": "elm-pages",
"version": "3.0.0-beta.38",
"version": "3.0.0-beta.40",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {

View File

@ -23,7 +23,7 @@
},
"../..": {
"name": "elm-pages",
"version": "3.0.0-beta.38",
"version": "3.0.0-beta.40",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {

View File

@ -1,14 +1,17 @@
module Pages.Form exposing
( Strategy(..), renderHtml, renderStyledHtml
( renderHtml, renderStyledHtml
, FormWithServerValidations, Handler
, Options, withConcurrent
)
{-|
@docs Strategy, renderHtml, renderStyledHtml
@docs renderHtml, renderStyledHtml
@docs FormWithServerValidations, Handler
@docs Options, withConcurrent
-}
import BackendTask exposing (BackendTask)
@ -45,6 +48,15 @@ type alias Handler error combined =
Form.Handler.Handler error (BackendTask FatalError (Validation error combined Never Never))
type alias Options error parsed input msg =
Form.Options error parsed input msg { concurrent : Bool }
withConcurrent : Options error parsed input msg -> Options error parsed input msg
withConcurrent options_ =
{ options_ | extras = Just { concurrent = True } }
--init :
-- (parsed -> combined)
@ -78,8 +90,7 @@ type Strategy
{-| -}
renderHtml :
List (Html.Attribute (PagesMsg userMsg))
-> Strategy
-> Form.Options error parsed input userMsg
-> Options error parsed input userMsg
->
{ --path : Path
--, url : Maybe PageUrl
@ -91,7 +102,12 @@ renderHtml :
}
-> Form.Form error { combine : Validation error parsed named constraints, view : Form.Context error input -> List (Html.Html (PagesMsg userMsg)) } parsed input
-> Html.Html (PagesMsg userMsg)
renderHtml attrs strategy options_ app form_ =
renderHtml attrs options_ app form_ =
let
concurrent : Bool
concurrent =
options_.extras |> Maybe.map .concurrent |> Maybe.withDefault False
in
form_
|> Form.renderHtml
{ state = app.pageFormState
@ -137,7 +153,7 @@ renderHtml attrs strategy options_ app form_ =
case submission.parsed of
Form.Valid _ ->
Pages.Internal.Msg.Submit
{ useFetcher = strategy == Parallel
{ useFetcher = concurrent
, action = submission.action
, fields = submission.fields
, method = submission.method
@ -151,7 +167,7 @@ renderHtml attrs strategy options_ app form_ =
Form.Invalid _ _ ->
Pages.Internal.Msg.Submit
{ useFetcher = strategy == Parallel
{ useFetcher = concurrent
, action = submission.action
, method = submission.method
, fields = submission.fields
@ -160,6 +176,7 @@ renderHtml attrs strategy options_ app form_ =
, valid = False
}
)
, extras = Nothing
}
attrs
@ -167,8 +184,7 @@ renderHtml attrs strategy options_ app form_ =
{-| -}
renderStyledHtml :
List (Html.Styled.Attribute (PagesMsg userMsg))
-> Strategy
-> Form.Options error parsed input userMsg
-> Options error parsed input userMsg
->
{ --path : Path
--, url : Maybe PageUrl
@ -180,7 +196,12 @@ renderStyledHtml :
}
-> Form.Form error { combine : Validation error parsed named constraints, view : Form.Context error input -> List (Html.Styled.Html (PagesMsg userMsg)) } parsed input
-> Html.Styled.Html (PagesMsg userMsg)
renderStyledHtml attrs strategy options_ app form_ =
renderStyledHtml attrs options_ app form_ =
let
concurrent : Bool
concurrent =
options_.extras |> Maybe.map .concurrent |> Maybe.withDefault False
in
form_
|> Form.renderStyledHtml
{ state = app.pageFormState
@ -226,7 +247,7 @@ renderStyledHtml attrs strategy options_ app form_ =
case submission.parsed of
Form.Valid _ ->
Pages.Internal.Msg.Submit
{ useFetcher = strategy == Parallel
{ useFetcher = concurrent
, action = submission.action
, fields = submission.fields
, method = submission.method
@ -240,7 +261,7 @@ renderStyledHtml attrs strategy options_ app form_ =
Form.Invalid _ _ ->
Pages.Internal.Msg.Submit
{ useFetcher = strategy == Parallel
{ useFetcher = concurrent
, action = submission.action
, fields = submission.fields
, method = submission.method
@ -249,5 +270,6 @@ renderStyledHtml attrs strategy options_ app form_ =
, valid = False
}
)
, extras = Nothing
}
attrs