Compare commits

...

6 Commits

Author SHA1 Message Date
210667ced6 makes filter search case insensitive 2019-12-18 15:45:06 +01:00
90bad7e481 adds filter text input, add player for admin 2019-12-18 15:27:13 +01:00
1636248686 adds conflicts information on claims 2019-12-17 16:11:16 +01:00
0241175b03 Merge branch 'try_to_scale' of elm/lootalot-client into master
Refactors to improve scalability
2019-12-15 15:30:11 +01:00
18c39eac1d updates for production env 2019-12-15 14:30:28 +01:00
ef3dd1f2ac updates style 2019-12-14 14:05:47 +01:00
13 changed files with 362 additions and 168 deletions

View File

@@ -1,9 +1,11 @@
@charset "UTF-8";
.navbar.is-spaced a.navbar-item.is-active {
border-bottom: 1px solid #2e3440;
border-radius: 0;
/*
.navbar.is-spaced a.navbar-item.is-active {
border-bottom: 1px solid $dark;
border-radius: 0;
}
/*/
.hero.is-dark.is-bold {
background-image: linear-gradient(280deg, #191c22 0%, #2e3440 71%, #3b4252 100%) !important;
}

View File

@@ -30,11 +30,14 @@ $notification-padding: 0.8rem 2.5rem 0.8rem 1rem;
//$box-radius: 0 0 2rem 2rem;
.navbar.is-spaced a.navbar-item.is-active {
/*
.navbar.is-spaced a.navbar-item.is-active {
border-bottom: 1px solid $dark;
border-radius: 0;
}
/*/
.hero.is-dark.is-bold {
background-image: linear-gradient(280deg, darken($dark, 10) 0%, $dark 71%, $dark-bis 100%) !important;
}

View File

@@ -8,6 +8,7 @@ module Api exposing
, RequestData(..)
, ToChest(..)
, Update(..)
, adminAddPlayer
, checkList
, confirmAction
, fetchLoot
@@ -92,10 +93,6 @@ type alias Loot =
List Item
-- Location of a loot
lootDecoder : Decoder Loot
lootDecoder =
D.list itemDecoder
@@ -107,23 +104,23 @@ type ToChest
| OfShop
fetchLoot : (ToChest -> Result Http.Error Loot -> msg) -> ToChest -> Cmd msg
fetchLoot : (Result Http.Error Loot -> msg) -> ToChest -> Cmd msg
fetchLoot toMsg dest =
let
url =
case dest of
OfPlayer id ->
"http://localhost:8088/api/players/" ++ String.fromInt id ++ "/loot"
"api/players/" ++ String.fromInt id ++ "/loot"
OfShop ->
"http://localhost:8088/api/shop"
"api/shop"
OfGroup ->
"http://localhost:8088/api/players/0/loot"
"api/players/0/loot"
in
Http.get
{ url = url
, expect = Http.expectJson (toMsg dest) (valueDecoder lootDecoder)
, expect = Http.expectJson toMsg (valueDecoder lootDecoder)
}
@@ -139,14 +136,16 @@ type alias Claim =
{ id : Int
, player_id : Int
, loot_id : Int
, conflicts : Bool
}
claimDecoder =
D.map3 Claim
D.map4 Claim
(D.field "id" int)
(D.field "player_id" int)
(D.field "loot_id" int)
(D.succeed False)
@@ -187,7 +186,7 @@ checkList toMsg itemList =
toMsg [] <| Just (printError e)
in
Http.post
{ url = "http://localhost:8088/api/items"
{ url = "api/items"
, body =
E.list (\t -> E.string t) itemList
|> Http.jsonBody
@@ -244,6 +243,10 @@ apiResponseDecoder toValue =
(D.maybe (field "errors" string))
emptyResponse =
apiResponseDecoder (D.succeed ())
{- ACTIONS
@@ -330,27 +333,27 @@ confirmAction id data =
( endpoint, method ) =
case data of
AddPayload _ _ ->
( "http://localhost:8088/api/players/" ++ id ++ "/loot"
( "api/players/" ++ id ++ "/loot"
, "POST"
)
BuyPayload _ _ _ ->
( "http://localhost:8088/api/players/" ++ id ++ "/loot"
( "api/players/" ++ id ++ "/loot"
, "PUT"
)
SellPayload _ _ _ _ ->
( "http://localhost:8088/api/players/" ++ id ++ "/loot"
( "api/players/" ++ id ++ "/loot"
, "DELETE"
)
GrabPayload _ ->
( "http://localhost:8088/api/players/" ++ id ++ "/claims"
( "api/players/" ++ id ++ "/claims"
, "POST"
)
WealthPayload _ ->
( "http://localhost:8088/api/players/" ++ id ++ "/wealth"
( "api/players/" ++ id ++ "/wealth"
, "PUT"
)
in
@@ -367,7 +370,7 @@ confirmAction id data =
undoLastAction id =
Http.request
{ url = "http://localhost:8088/api/players/" ++ String.fromInt id ++ "/events/last"
{ url = "api/players/" ++ String.fromInt id ++ "/events/last"
, method = "DELETE"
, headers = []
, body = Http.emptyBody
@@ -398,11 +401,11 @@ replaceShopItems toMsg loot =
toMsg Nothing
in
Http.request
{ url = "http://localhost:8088/api/shop"
{ url = "api/shop"
, method = "POST"
, headers = []
, body = Http.jsonBody data
, expect = Http.expectJson gotResponse (apiResponseDecoder <| D.succeed ())
, expect = Http.expectJson gotResponse emptyResponse
, timeout = Nothing
, tracker = Nothing
}
@@ -412,7 +415,7 @@ send : { method : String, path : String, decoder : Decoder a } -> Task Http.Erro
send { method, path, decoder } =
Http.task
{ method = method
, url = "http://localhost:8088/" ++ path
, url = path
, headers = []
, body = Http.emptyBody
, resolver = Http.stringResolver <| handleJsonResponse decoder
@@ -432,20 +435,85 @@ getLoot id =
}
getClaims id =
let
path =
if id == 0 then
"api/claims"
else
"api/players/" ++ String.fromInt id ++ "/claims"
in
-- Updates the conflicts field on every claims
groupByLoot : List Claims -> Claims -> List Claims
groupByLoot acc claims =
case claims of
last :: [] ->
groupByLoot ([ last ] :: acc) []
first :: rest ->
let
( newGroup, left ) =
List.partition (\c -> c.loot_id == first.loot_id) rest
in
groupByLoot ((first :: newGroup) :: acc) left
[] ->
acc
updateConflicts : Claims -> Claims
updateConflicts claims =
groupByLoot [] claims
|> List.concatMap
(\group ->
let
_ =
Debug.log "updating group" group
in
case group of
[] ->
[]
[ c ] ->
[ { c | conflicts = False } ]
xs ->
List.map (\c -> { c | conflicts = True }) xs
)
parseClaims : Int -> Claims -> Task x Claims
parseClaims id claims =
-- Filter claims relevant to player
Task.succeed <|
List.filter (\claim -> id == 0 || claim.player_id == id) <|
updateConflicts claims
getClaims : Int -> Task Http.Error Claims
getClaims id =
send
{ method = "GET"
, path = path
, path = "api/claims"
, decoder = valueDecoder (D.list claimDecoder)
}
|> Task.andThen (parseClaims id)
-- ADMIN
--
adminAddPlayer : { d | name : String, wealth : Float } -> Cmd Msg
adminAddPlayer data =
let
json =
E.object
[ ( "name", E.string data.name )
, ( "wealth", E.float data.wealth )
]
in
Http.post
{ url = "api/players/"
, body = Http.jsonBody json
, expect = Http.expectJson GotActionResult emptyResponse
}

View File

@@ -49,7 +49,7 @@ blankPlayer =
get : (Result Http.Error Player -> msg) -> Int -> Cmd msg
get toMsg id =
Http.get
{ url = "http://localhost:8088/api/players/" ++ String.fromInt id ++ "/"
{ url = "api/players/" ++ String.fromInt id ++ "/"
, expect = Http.expectJson toMsg (valueDecoder playerDecoder)
}
@@ -64,11 +64,14 @@ list toMsg =
toMsg players
Err e ->
Debug.log ("Player's list fetch error : " ++ Debug.toString e) <|
toMsg []
let
_ =
Debug.log "Player's list fetch error" (Debug.toString e)
in
toMsg []
in
Http.get
{ url = "http://localhost:8088/api/players/"
{ url = "api/players/"
, expect = Http.expectJson parseResponse (valueDecoder <| D.list playerDecoder)
}

View File

@@ -88,9 +88,23 @@ levelItem =
-- INPUTS
--
inputField : String -> (String -> msg) -> Html msg
inputField val toMsg =
input [ class "input", value val, onInput toMsg ] []
-- COLORS
--
isInfo =
class "is-info"
isError =
class "is-error"

View File

@@ -29,10 +29,10 @@ type alias RowRenderer msg =
type Chest
= New NewFromInventory.Model
| View (Item -> Html Never)
| Buy Selection.Model
| Sell Selection.Model
| Claim Selection.Model
| View FilterText (Item -> Html Never)
| Buy FilterText Selection.Model
| Sell FilterText Selection.Model
| Claim FilterText Selection.Model
type IntoMode
@@ -44,6 +44,10 @@ type IntoMode
| IntoClaim Claims
type alias FilterText =
String
{-
@@ -66,7 +70,7 @@ type IntoMode
init =
View Table.name
View "" Table.name
intoMode : IntoMode -> Msg
@@ -100,31 +104,51 @@ claim initialClaims =
showWith : Table.ItemRenderer Item Never -> Chest
showWith renderItem =
View <| Table.renderRowLevel renderItem (\_ -> [])
View "" <| Table.renderRowLevel renderItem (\_ -> [])
view : Chest -> Loot -> Html Msg
view model loot =
let
filterLoot txt ls =
List.filter (\i -> String.contains (String.toLower txt) (String.toLower i.name)) ls
in
case model of
View renderItem ->
Table.view renderItem loot
|> Html.map GotViewMsg
View filterText renderItem ->
div []
[ viewFilterInput filterText
, Table.view renderItem (filterLoot filterText loot)
|> Html.map GotViewMsg
]
Buy subModel ->
Selection.view subModel loot
|> Html.map GotSelectionMsg
Buy filterText subModel ->
div []
[ viewFilterInput filterText
, Selection.view subModel (filterLoot filterText loot)
|> Html.map GotSelectionMsg
]
Sell subModel ->
Selection.view subModel loot
|> Html.map GotSelectionMsg
Sell filterText subModel ->
div []
[ viewFilterInput filterText
, Selection.view subModel (filterLoot filterText loot)
|> Html.map GotSelectionMsg
]
New subModel ->
NewFromInventory.view subModel
|> Html.map GotNewMsg
Claim subModel ->
Selection.view subModel loot
|> Html.map GotSelectionMsg
Claim filterText subModel ->
div []
[ viewFilterInput filterText
, Selection.view subModel (filterLoot filterText loot)
|> Html.map GotSelectionMsg
]
viewFilterInput filterText =
B.inputField filterText FilterTextChanged
type Msg
@@ -132,11 +156,15 @@ type Msg
| GotSelectionMsg Selection.Msg
| GotViewMsg Never
| IntoMode IntoMode
| FilterTextChanged String
update : Msg -> Chest -> ( Chest, Cmd Msg )
update msg model =
case ( msg, model ) of
( FilterTextChanged newText, m ) ->
( updateFilterText newText m, Cmd.none )
( GotNewMsg subMsg, New subModel ) ->
NewFromInventory.update subMsg subModel
|> updateChest GotNewMsg New
@@ -144,17 +172,17 @@ update msg model =
( GotNewMsg subMsg, _ ) ->
( model, Cmd.none )
( GotSelectionMsg subMsg, Buy subModel ) ->
( GotSelectionMsg subMsg, Buy f subModel ) ->
Selection.update subMsg subModel
|> updateChest GotSelectionMsg Buy
|> updateChest GotSelectionMsg (Buy f)
( GotSelectionMsg subMsg, Sell subModel ) ->
( GotSelectionMsg subMsg, Sell f subModel ) ->
Selection.update subMsg subModel
|> updateChest GotSelectionMsg Sell
|> updateChest GotSelectionMsg (Sell f)
( GotSelectionMsg subMsg, Claim subModel ) ->
( GotSelectionMsg subMsg, Claim f subModel ) ->
Selection.update subMsg subModel
|> updateChest GotSelectionMsg Claim
|> updateChest GotSelectionMsg (Claim f)
( GotSelectionMsg subMsg, _ ) ->
( model, Cmd.none )
@@ -162,43 +190,59 @@ update msg model =
( IntoMode newMode, _ ) ->
case newMode of
IntoView ->
( View Table.name, Cmd.none )
( View "" Table.name, Cmd.none )
IntoViewWithClaims claims ->
let
isClaimed item =
List.any (\claim_ -> claim_.loot_id == item.id) claims
case List.filter (\c -> c.loot_id == item.id) claims of
[ c ] ->
Just c
[] ->
Nothing
_ ->
Debug.log "Warning ! Duplicated claim found" Nothing
renderItem item =
[ p [ B.levelItem ] [ text item.name ]
, if isClaimed item then
B.tag [ B.levelItem, B.isInfo ]
[ B.icon
{ icon = "fas fa-praying-hands"
, size = Just "is-small"
, ratio = Just "fa-1x"
}
, text "time left..."
]
, case isClaimed item of
Just c ->
B.tag
[ B.levelItem
, if c.conflicts then
B.isError
else
text ""
else
B.isInfo
]
[ B.icon
{ icon = "fas fa-praying-hands"
, size = Just "is-small"
, ratio = Just "fa-1x"
}
, p [] [ text "en attente..." ]
]
Nothing ->
text ""
]
in
( View <| Table.renderRowLevel renderItem (\_ -> []), Cmd.none )
( View "" <| Table.renderRowLevel renderItem (\_ -> []), Cmd.none )
IntoBuy ->
( Buy <| Selection.init Nothing (Just .base_price), Cmd.none )
( Buy "" <| Selection.init Nothing (Just .base_price), Cmd.none )
IntoSell ->
( Sell <| Selection.init Nothing (Just (\i -> i.base_price // 2)), Cmd.none )
( Sell "" <| Selection.init Nothing (Just (\i -> i.base_price // 2)), Cmd.none )
IntoClaim claims ->
let
initialSelection =
List.map .loot_id claims
in
( Claim <| Selection.init (Just initialSelection) Nothing, Cmd.none )
( Claim "" <| Selection.init (Just initialSelection) Nothing, Cmd.none )
IntoAdd ->
( New NewFromInventory.init, Cmd.none )
@@ -213,6 +257,24 @@ updateChest toMsg toChest ( model, cmd ) =
)
updateFilterText txt model =
case model of
New _ ->
model
View _ a ->
View txt a
Buy _ a ->
Buy txt a
Sell _ a ->
Sell txt a
Claim _ a ->
Claim txt a
-- Helpers
--
@@ -223,7 +285,7 @@ updateChest toMsg toChest ( model, cmd ) =
confirmBuy : Int -> Chest -> Loot -> Cmd Api.Msg
confirmBuy playerId model loot =
case model of
Buy chest ->
Buy _ chest ->
let
items =
Selection.selected chest loot
@@ -245,7 +307,7 @@ confirmBuy playerId model loot =
confirmSell : Int -> Chest -> Loot -> List Int -> Cmd Api.Msg
confirmSell playerId model loot players =
case model of
Sell chest ->
Sell _ chest ->
let
items =
Selection.selected chest loot
@@ -286,7 +348,7 @@ confirmAdd playerId sourceName model =
confirmGrab : Int -> Loot -> Chest -> Cmd Api.Msg
confirmGrab playerId loot model =
case model of
Claim chest ->
Claim _ chest ->
let
items =
Selection.selected chest loot

View File

@@ -60,7 +60,11 @@ setPage page model =
init : () -> Url.Url -> Nav.Key -> ( Model, Cmd Msg )
init _ _ key =
init _ url key =
let
_ =
Debug.log "init with url" (Debug.toString url)
in
( { navbar = initNavbar key
, page = Page.Loading
}
@@ -165,6 +169,10 @@ update msg model =
( LinkClicked urlRequest, _ ) ->
case urlRequest of
Browser.Internal url ->
let
_ =
Debug.log "internal url request" (Debug.toString url)
in
( model, Nav.pushUrl model.navbar.navKey (Url.toString url) )
Browser.External href ->

View File

@@ -10,7 +10,7 @@ import Page.Dashboard as Home
import Page.GroupChest as GroupChest
import Page.Shop as Shop
import Process
import Route
import Route exposing (toHref)
import Session exposing (Session)
import Task
import Wealth
@@ -216,19 +216,19 @@ renderLevel left right =
navLink icon route page =
let
( link, url ) =
linkText =
case route of
Route.Merchant ->
( "Marchand", "/marchand" )
"Marchand"
Route.GroupChest ->
( "Coffre de groupe", "/groupe" )
"Coffre de groupe"
Route.Home ->
( "Accueil", "/" )
"Accueil"
Route.About ->
( "About", "/" )
"About"
isActive =
case ( route, page ) of
@@ -247,9 +247,9 @@ navLink icon route page =
_ ->
False
in
a [ class "navbar-item", classList [ ( "is-active", isActive ) ], href url ]
a [ class "navbar-item", classList [ ( "is-active", isActive ) ], href (toHref route) ]
[ B.icon { icon = icon, ratio = Just "fa-1x", size = Just "is-medium" }
, span [] [ text link ]
, span [] [ text linkText ]
]

View File

@@ -109,7 +109,7 @@ view model =
in
( Html.map PlayerViewer <|
case config.chest of
Chest.View _ ->
Chest.View _ _ ->
case data.player.id of
0 ->
B.buttons
@@ -135,7 +135,7 @@ view model =
, color = "is-primary"
}
Chest.Sell selection ->
Chest.Sell _ selection ->
let
sellText =
case Selection.totalSelectedPrice selection data.loot of
@@ -177,7 +177,7 @@ view model =
[]
]
( Chest.Sell _, True ) ->
( Chest.Sell _ _, True ) ->
selectPlayers config.extra.players
_ ->
@@ -303,28 +303,35 @@ type PlayerMsg
update msg model =
case ( msg, model ) of
( AdminViewer aMsg, Admin config ) ->
(case ( aMsg, config.playerForm ) of
( EditPlayer, Nothing ) ->
( Admin { config | playerForm = Just <| NewPlayerForm "" 0.0 }
, Cmd.none
)
( AdminViewer ConfirmNewPlayer, Admin config ) ->
( Admin { config | playerForm = Nothing }
, case config.playerForm of
Just form ->
Cmd.map Api <|
Api.adminAddPlayer form
( GotFormMsg subMsg, Just f ) ->
( Admin { config | playerForm = Just (updateForm subMsg f) }
, Cmd.none
)
( ConfirmNewPlayer, Just f ) ->
( model, Cmd.none )
( CloseEdit, _ ) ->
( Admin { config | playerForm = Nothing }, Cmd.none )
_ ->
( model, Cmd.none )
Nothing ->
Cmd.none
)
|> Tuple.mapSecond (Cmd.map AdminViewer)
( AdminViewer aMsg, Admin config ) ->
Tuple.mapSecond (Cmd.map AdminViewer) <|
case ( aMsg, config.playerForm ) of
( EditPlayer, Nothing ) ->
( Admin { config | playerForm = Just <| NewPlayerForm "" 0.0 }
, Cmd.none
)
( GotFormMsg subMsg, Just f ) ->
( Admin { config | playerForm = Just (updateForm subMsg f) }
, Cmd.none
)
( CloseEdit, _ ) ->
( Admin { config | playerForm = Nothing }, Cmd.none )
_ ->
( model, Cmd.none )
( PlayerViewer ConfirmSell, Player config ) ->
( model

View File

@@ -71,12 +71,12 @@ view model =
( True, data.player.id == 0 )
in
case ( model.chest, isPlayer && not isGroup ) of
( Chest.View _, True ) ->
( Chest.View _ _, True ) ->
B.btn
(GotChestMsg <| Chest.claim (getClaimsFromSession model.session))
{ text = "Demander", icon = "fas fa-praying-hands", color = "is-primary" }
( Chest.Claim _, True ) ->
( Chest.Claim _ _, True ) ->
B.confirmButtons ConfirmGrab (GotChestMsg Chest.show)
( _, _ ) ->
@@ -93,7 +93,7 @@ type Msg
type InnerMsg
= GotLoot Api.ToChest (HttpResult Loot)
= GotLoot (HttpResult Loot)
| GotChestMsg Chest.Msg
| ConfirmGrab
@@ -106,7 +106,7 @@ update msg model =
Internal ConfirmGrab ->
case ( Session.user model.session, model.loot, model.chest ) of
( Player data, Loaded loot, Chest.Claim _ ) ->
( Player data, Loaded loot, Chest.Claim _ _ ) ->
( model
, Chest.confirmGrab
data.player.id
@@ -121,11 +121,11 @@ update msg model =
Internal innerMsg ->
Tuple.mapSecond (Cmd.map Internal) <|
case innerMsg of
GotLoot _ (Ok loot) ->
GotLoot (Ok loot) ->
( { model | loot = Loaded loot }, Cmd.none )
GotLoot _ (Err _) ->
( { model | loot = LoadError "Le chargement a échoué" }, Cmd.none )
GotLoot (Err e) ->
( { model | loot = LoadError <| Debug.toString e }, Cmd.none )
GotChestMsg chestMsg ->
Chest.update chestMsg model.chest

View File

@@ -47,13 +47,13 @@ view model =
Loaded loot ->
( Html.map Internal <|
case ( model.chest, Session.user model.session ) of
( Chest.View _, Session.Admin _ ) ->
( Chest.View _ _, Session.Admin _ ) ->
B.btn (GotChestMsg Chest.new) { text = "Remplacer", icon = "fas fa-sync-alt", color = "is-primary" }
( Chest.View _, Session.Player _ ) ->
( Chest.View _ _, Session.Player _ ) ->
B.btn (GotChestMsg Chest.buy) { text = "Acheter", icon = "fas fa-coins", color = "is-primary" }
( Chest.Buy _, Session.Player _ ) ->
( Chest.Buy _ _, Session.Player _ ) ->
B.confirmButtons ConfirmBuy (GotChestMsg Chest.show)
( Chest.New _, Session.Admin _ ) ->
@@ -78,7 +78,7 @@ type Msg
type ShopMsg
= GotLoot Api.ToChest (HttpResult Loot)
= GotLoot (HttpResult Loot)
| ConfirmRefresh
| GotRefreshResult (Maybe ())
| ConfirmBuy
@@ -97,7 +97,7 @@ update msg model =
case msg of
Internal ConfirmBuy ->
case ( Session.user (getSession model), model.loot, model.chest ) of
( Session.Player data, Loaded loot, Chest.Buy _ ) ->
( Session.Player data, Loaded loot, Chest.Buy _ _ ) ->
( model
, Chest.confirmBuy
data.player.id
@@ -120,49 +120,46 @@ update msg model =
)
Internal shopMsg ->
let
( nModel, cmd ) =
case shopMsg of
GotLoot Api.OfShop response ->
case response of
Ok loot ->
( { model | loot = Loaded loot }, Cmd.none )
Tuple.mapSecond (Cmd.map Internal) <|
case shopMsg of
GotLoot response ->
case response of
Ok loot ->
( { model | loot = Loaded loot }, Cmd.none )
-- TODO: handle error
Err e ->
( { model | loot = LoadError <| Debug.toString e }, Cmd.none )
-- TODO: handle error
Err e ->
( { model | loot = LoadError <| Debug.toString e }, Cmd.none )
ConfirmRefresh ->
case Session.user (getSession model) of
Session.Admin _ ->
let
loot =
case model.chest of
Chest.New chest ->
NewChest.allLoot chest
ConfirmRefresh ->
case Session.user (getSession model) of
Session.Admin _ ->
let
loot =
case model.chest of
Chest.New chest ->
NewChest.allLoot chest
_ ->
[]
in
( model, Api.replaceShopItems GotRefreshResult loot )
_ ->
[]
in
( model, Api.replaceShopItems GotRefreshResult loot )
_ ->
let
_ =
Debug.log "Forbidden action ! (is not admin)" ()
in
( model, Cmd.none )
_ ->
let
_ =
Debug.log "Forbidden action ! (is not admin)" ()
in
( model, Cmd.none )
GotChestMsg subMsg ->
Chest.update subMsg model.chest
|> Tuple.mapBoth
(\c -> { model | chest = c })
(Cmd.map GotChestMsg)
GotChestMsg subMsg ->
Chest.update subMsg model.chest
|> Tuple.mapBoth
(\c -> { model | chest = c })
(Cmd.map GotChestMsg)
_ ->
( model, Cmd.none )
in
( nModel, Cmd.map Internal cmd )
_ ->
( model, Cmd.none )
_ ->
( model, Cmd.none )

View File

@@ -5,6 +5,18 @@ import Url.Parser as P exposing ((</>), Parser, oneOf, s)
-- Name of the application, prepended to it's actual root
scriptName =
"lootalot"
root =
P.s scriptName
-- ROUTES
@@ -18,13 +30,32 @@ type Route
parser : P.Parser (Route -> a) a
parser =
oneOf
[ P.map Home P.top
, P.map GroupChest (P.s "groupe")
, P.map Merchant (P.s "marchand")
, P.map About (P.s "about")
[ P.map Home root
, P.map GroupChest (root </> P.s "groupe")
, P.map Merchant (root </> P.s "marchand")
, P.map About (root </> P.s "about")
]
fromUrl : Url.Url -> Maybe Route
fromUrl url =
P.parse parser url
toHref : Route -> String
toHref route =
"/"
++ scriptName
++ (case route of
Home ->
"/"
About ->
"/"
Merchant ->
"/marchand"
GroupChest ->
"/groupe"
)

View File

@@ -16,8 +16,7 @@ type alias ItemRenderer a msg =
view : RowRenderer a msg -> List a -> Html msg
view rowRenderer content =
table [ class "table is-fullwidth" ]
[ thead [ class "table-header" ]
[ th [] [ text "Nom" ] ]
[ thead [] [ th [] [ text "Nom" ] ]
, tbody [] <|
List.map
rowRenderer