Remove cleanUrl and fragment hack (#216)

This commit is contained in:
Marek Fajkus 2020-10-29 00:38:46 +01:00 committed by GitHub
parent e412085ea8
commit 2de4ef3bda
Failed to generate hash of commit
3 changed files with 90 additions and 111 deletions

View file

@ -49,7 +49,7 @@ type alias Flags =
type alias Model =
{ navKey : Browser.Navigation.Key
, url : Url.Url
, route : Route.Route
, elasticsearch : Search.Options
, page : Page
}
@ -71,7 +71,6 @@ init flags url navKey =
let
model =
{ navKey = navKey
, url = url
, elasticsearch =
Search.Options
flags.elasticsearchMappingSchemaVersion
@ -79,6 +78,7 @@ init flags url navKey =
flags.elasticsearchUsername
flags.elasticsearchPassword
, page = NotFound
, route = Route.Home
}
in
changeRouteTo model url
@ -158,45 +158,55 @@ changeRouteTo :
Model
-> Url.Url
-> ( Model, Cmd Msg )
changeRouteTo model url =
changeRouteTo currentModel url =
let
cleanUrl =
if url.fragment == Just "disabled" then
{ url | fragment = Nothing }
attempteQuery (( newModel, cmd ) as pair) =
case ( currentModel.route, newModel.route ) of
( Route.Packages channel1 query1 _ from1 size1 sort1, Route.Packages channel2 query2 _ from2 size2 sort2 ) ->
if channel1 /= channel2 || query1 /= query2 || from1 /= from2 || size1 /= size2 || sort1 /= sort2 then
submitQuery newModel ( newModel, cmd )
else
url
pair
newModel =
{ model | url = cleanUrl }
( Route.Options channel1 query1 _ from1 size1 sort1, Route.Options channel2 query2 _ from2 size2 sort2 ) ->
if channel1 /= channel2 || query1 /= query2 || from1 /= from2 || size1 /= size2 || sort1 /= sort2 then
submitQuery newModel ( newModel, cmd )
maybeRoute =
Route.fromUrl url
else
pair
( a, b ) ->
if a /= b then
submitQuery newModel ( newModel, cmd )
else
pair
in
case maybeRoute of
case Route.fromUrl url of
Nothing ->
( { newModel
| page = NotFound
}
( { currentModel | page = NotFound }
, Cmd.none
)
Just Route.NotFound ->
( { newModel
| page = NotFound
}
, Cmd.none
)
Just route ->
let
model =
{ currentModel | route = route }
in
case route of
Route.NotFound ->
( { model | page = NotFound }, Cmd.none )
Just Route.Home ->
Route.Home ->
-- Always redirect to /packages until we have something to show
-- on the home page
( newModel, Browser.Navigation.pushUrl newModel.navKey "/packages" )
( model, Browser.Navigation.pushUrl model.navKey "/packages" )
Just (Route.Packages channel query show from size sort) ->
Route.Packages channel query show from size sort ->
let
modelPage =
case newModel.page of
case model.page of
Packages x ->
Just x
@ -204,19 +214,13 @@ changeRouteTo model url =
Nothing
in
Page.Packages.init channel query show from size sort modelPage
|> updateWith Packages PackagesMsg newModel
|> (\x ->
if url.fragment == Just "disabled" then
( Tuple.first x, Cmd.none )
|> updateWith Packages PackagesMsg model
|> attempteQuery
else
submitQuery newModel x
)
Just (Route.Options channel query show from size sort) ->
Route.Options channel query show from size sort ->
let
modelPage =
case newModel.page of
case model.page of
Options x ->
Just x
@ -224,14 +228,8 @@ changeRouteTo model url =
Nothing
in
Page.Options.init channel query show from size sort modelPage
|> updateWith Options OptionsMsg newModel
|> (\x ->
if url.fragment == Just "disabled" then
( Tuple.first x, Cmd.none )
else
submitQuery newModel x
)
|> updateWith Options OptionsMsg model
|> attempteQuery
update : Msg -> Model -> ( Model, Cmd Msg )
@ -241,11 +239,7 @@ update msg model =
case urlRequest of
Browser.Internal url ->
( model
, if url.fragment == Just "disabled" then
Cmd.none
else
Browser.Navigation.pushUrl model.navKey <| Url.toString url
, Browser.Navigation.pushUrl model.navKey <| Url.toString url
)
Browser.External href ->
@ -318,7 +312,7 @@ view model =
]
, div [ class "nav-collapse collapse" ]
[ ul [ class "nav pull-left" ]
(viewNavigation model.page model.url)
(viewNavigation model.route)
]
]
]
@ -349,52 +343,37 @@ view model =
}
viewNavigation : Page -> Url.Url -> List (Html Msg)
viewNavigation page url =
viewNavigation : Route.Route -> List (Html Msg)
viewNavigation route =
let
preserveSearchOptions =
case page of
Packages model ->
model.query
|> Maybe.map (\q -> [ Url.Builder.string "query" q ])
|> Maybe.withDefault []
|> List.append [ Url.Builder.string "channel" model.channel ]
toRoute f =
case route of
-- Preserve arguments
Route.Packages channel query show from size sort ->
f channel query show from size sort
Options model ->
model.query
|> Maybe.map (\q -> [ Url.Builder.string "query" q ])
|> Maybe.withDefault []
|> List.append [ Url.Builder.string "channel" model.channel ]
Route.Options channel query show from size sort ->
f channel query show from size sort
_ ->
[]
createUrl path =
[]
|> List.append preserveSearchOptions
|> Url.Builder.absolute [ path ]
f Nothing Nothing Nothing Nothing Nothing Nothing
in
List.map
(viewNavigationItem url)
[ ( "https://nixos.org", "Back to nixos.org" )
, ( createUrl "packages", "Packages" )
, ( createUrl "options", "Options" )
li [] [ a [ href "https://nixos.org" ] [ text "Back to nixos.org" ] ]
:: List.map
(viewNavigationItem route)
[ ( toRoute Route.Packages, "Packages" )
, ( toRoute Route.Options, "Options" )
]
viewNavigationItem :
Url.Url
-> ( String, String )
Route.Route
-> ( Route.Route, String )
-> Html Msg
viewNavigationItem url ( path, title ) =
viewNavigationItem currentRoute ( route, title ) =
li
[ classList
[ ( "active"
, String.startsWith url.path path
)
]
]
[ a [ href path ] [ text title ] ]
[ classList [ ( "active", currentRoute == route ) ] ]
[ a [ Route.href route ] [ text title ] ]
viewPage : Model -> Html Msg

View file

@ -17,6 +17,7 @@ import Url.Parser.Query
type Route
= NotFound
| Home
-- route | channel | (search) query | show | from | size | sort
| Packages (Maybe String) (Maybe String) (Maybe String) (Maybe Int) (Maybe Int) (Maybe String)
| Options (Maybe String) (Maybe String) (Maybe String) (Maybe Int) (Maybe Int) (Maybe String)

View file

@ -282,7 +282,6 @@ update toRoute navKey msg model =
model.from
model.size
model.sort
|> (\x -> x ++ "#disabled")
|> Browser.Navigation.pushUrl navKey
)
@ -635,11 +634,11 @@ viewPager _ model result toRoute =
]
]
[ a
[ if model.from == 0 then
href "#disabled"
[ href <|
if model.from == 0 then
""
else
href <|
createUrl
toRoute
model.channel
@ -659,7 +658,7 @@ viewPager _ model result toRoute =
[ a
[ href <|
if model.from - model.size < 0 then
"#disabled"
""
else
createUrl
@ -681,7 +680,7 @@ viewPager _ model result toRoute =
[ a
[ href <|
if model.from + model.size >= result.hits.total.value then
"#disabled"
""
else
createUrl
@ -703,7 +702,7 @@ viewPager _ model result toRoute =
[ a
[ href <|
if model.from + model.size >= result.hits.total.value then
"#disabled"
""
else
let