182 lines
4.9 KiB
Elm
182 lines
4.9 KiB
Elm
module Page.Admin exposing (Model)
|
|
|
|
import Api exposing (Loot)
|
|
import Api.Player as Player exposing (Player, Wealth)
|
|
import Browser.Navigation as Nav
|
|
import Html exposing (..)
|
|
import Html.Attributes exposing (..)
|
|
import Html.Events exposing (..)
|
|
import Page.Shop as Shop
|
|
import Route exposing (Route)
|
|
import Session exposing (Session)
|
|
|
|
|
|
type alias NewPlayerForm =
|
|
{ name : String
|
|
, wealth : Float
|
|
}
|
|
|
|
|
|
type alias Status =
|
|
{ session : Session
|
|
, players : List Player
|
|
, newPlayer : NewPlayerForm
|
|
}
|
|
|
|
|
|
type Model
|
|
= Dashboard Status
|
|
| MerchantLoot Shop.Model
|
|
|
|
|
|
init : Session -> ( Model, Cmd Msg )
|
|
init session =
|
|
( Dashboard (Status session [] (NewPlayerForm "" 0.0))
|
|
, Player.list GotPlayers
|
|
)
|
|
|
|
|
|
getSession model =
|
|
case model of
|
|
Dashboard status ->
|
|
Session.getSession status
|
|
|
|
MerchantLoot shop ->
|
|
Session.getSession shop
|
|
|
|
|
|
view : Model -> List (Html Msg)
|
|
view model =
|
|
case model of
|
|
Dashboard config ->
|
|
[ div [ class "container" ]
|
|
[ p [ class "title" ] [ text "Administration" ]
|
|
, div [ class "section" ]
|
|
[ table [ class "table is-fullwidth is-striped" ]
|
|
[ thead [ class "table-header" ]
|
|
[ th [] [ text "Joueurs" ] ]
|
|
, tbody [] <|
|
|
editNewPlayer config.newPlayer
|
|
:: List.map viewPlayer config.players
|
|
]
|
|
]
|
|
, div [ class "section" ]
|
|
[ p [] [ text "Campagnes" ] ]
|
|
]
|
|
]
|
|
|
|
MerchantLoot shop ->
|
|
let
|
|
toShopMsg =
|
|
Html.map ShopMsg
|
|
|
|
( controls, viewShop ) =
|
|
Shop.view shop
|
|
|> Tuple.mapBoth toShopMsg (List.map toShopMsg)
|
|
in
|
|
[ div [ class "container" ] <|
|
|
p [ class "title" ] [ text "Marchand" ]
|
|
:: controls
|
|
:: viewShop
|
|
]
|
|
|
|
|
|
viewPlayer : Player -> Html Msg
|
|
viewPlayer player =
|
|
tr [] [ td [] [ p [] [ text (player.name ++ " (" ++ String.fromInt player.id ++ ")") ] ] ]
|
|
|
|
|
|
editNewPlayer : NewPlayerForm -> Html Msg
|
|
editNewPlayer newPlayer =
|
|
tr []
|
|
[ td []
|
|
[ div [ class "field is-horizontal" ]
|
|
[ div [ class "field-body" ]
|
|
[ div [ class "field" ]
|
|
[ input
|
|
[ class "input"
|
|
, type_ "text"
|
|
, value newPlayer.name
|
|
, onInput <| GotFormMsg << NameChanged
|
|
]
|
|
[]
|
|
]
|
|
, div [ class "field" ]
|
|
[ input
|
|
[ class "input"
|
|
, type_ "text"
|
|
, value <| String.fromFloat newPlayer.wealth
|
|
, onInput <| GotFormMsg << WealthChanged
|
|
]
|
|
[]
|
|
]
|
|
]
|
|
]
|
|
]
|
|
]
|
|
|
|
|
|
type Msg
|
|
= GotPlayers (List Player)
|
|
| GotFormMsg FormMsg
|
|
| ShopMsg Shop.Msg
|
|
|
|
|
|
type FormMsg
|
|
= NameChanged String
|
|
| WealthChanged String
|
|
|
|
|
|
updateForm : FormMsg -> NewPlayerForm -> NewPlayerForm
|
|
updateForm msg form =
|
|
case msg of
|
|
NameChanged newName ->
|
|
{ form | name = newName }
|
|
|
|
WealthChanged newWealth ->
|
|
{ form | wealth = Maybe.withDefault 0.0 <| String.toFloat newWealth }
|
|
|
|
|
|
routeChanged : Route.Route -> Model -> ( Model, Cmd Msg )
|
|
routeChanged route model =
|
|
case model of
|
|
Dashboard config ->
|
|
case route of
|
|
Route.Home Route.MerchantLoot ->
|
|
Tuple.mapBoth
|
|
MerchantLoot
|
|
(Cmd.map ShopMsg)
|
|
(config.session |> Shop.init)
|
|
|
|
_ ->
|
|
( model, Cmd.none )
|
|
|
|
MerchantLoot shop ->
|
|
case route of
|
|
Route.Home Route.PlayerLoot ->
|
|
init shop.session
|
|
|
|
_ ->
|
|
( model, Cmd.none )
|
|
|
|
|
|
update msg model =
|
|
case ( msg, model ) of
|
|
( GotPlayers players, Dashboard config ) ->
|
|
( Dashboard { config | players = players }, Cmd.none )
|
|
|
|
( GotFormMsg formMsg, Dashboard config ) ->
|
|
( Dashboard { config | newPlayer = updateForm formMsg config.newPlayer }, Cmd.none )
|
|
|
|
( _, Dashboard _ ) ->
|
|
( model, Cmd.none )
|
|
|
|
( ShopMsg shopMsg, MerchantLoot shopModel ) ->
|
|
Shop.update shopMsg shopModel
|
|
|> Tuple.mapBoth
|
|
MerchantLoot
|
|
(Cmd.map ShopMsg)
|
|
|
|
( _, MerchantLoot _ ) ->
|
|
( model, Cmd.none )
|