diff --git a/src/Api.elm b/src/Api.elm index 29813c1..bbeffe9 100644 --- a/src/Api.elm +++ b/src/Api.elm @@ -16,6 +16,7 @@ module Api exposing , getLoot , printError , replaceShopItems + , send ) import Api.Player exposing (Player, Wealth) diff --git a/src/Page.elm b/src/Page.elm index 480978e..9a297c8 100644 --- a/src/Page.elm +++ b/src/Page.elm @@ -90,7 +90,7 @@ view page = Session.Player data -> data.player.name - Session.Admin -> + Session.Admin _ -> "Administration" Nothing -> @@ -109,7 +109,7 @@ view page = text "" ] - Session.Admin -> + Session.Admin _ -> [ navLink "fas fa-store-alt" Route.Merchant page ] Nothing -> @@ -173,7 +173,7 @@ viewSessionBar session controls = ) |> List.map (Html.map Wealth) - Just Session.Admin -> + Just (Session.Admin _) -> [ text "Admin" ] notifications = @@ -471,7 +471,7 @@ applyUpdate u user = Api.ClaimRemoved claim -> Session.Player { data | claims = List.filter (\c -> c.id /= claim.id) data.claims } - Session.Admin -> + Session.Admin _ -> user diff --git a/src/Page/Chest.elm b/src/Page/Chest.elm index cdfeca5..e4f4ff3 100644 --- a/src/Page/Chest.elm +++ b/src/Page/Chest.elm @@ -211,6 +211,8 @@ updateChest toMsg toChest ( model, cmd ) = +-- Helpers +-- -- Api actions -- diff --git a/src/Page/Dashboard.elm b/src/Page/Dashboard.elm index 69d24e5..12e0b55 100644 --- a/src/Page/Dashboard.elm +++ b/src/Page/Dashboard.elm @@ -43,15 +43,15 @@ type PlayerConfig type AdminConfig - = AdminConfig Session (List Player) NewPlayerForm + = AdminConfig Session (List Player) (Maybe NewPlayerForm) init : Session -> ( Model, Cmd Msg ) init session = case Session.user session of - Session.Admin -> - ( Admin <| AdminConfig session [] initForm - , Player.list (AdminViewer << GotPlayers) + Session.Admin data -> + ( Admin <| AdminConfig session data.players Nothing + , Cmd.none ) Session.Player data -> @@ -69,10 +69,6 @@ init session = ) -initForm = - NewPlayerForm "" 0.0 - - modeButton t msg = button [ class "button", onClick msg ] [ text t ] @@ -84,6 +80,7 @@ buttons bs = view : Model -> ( Html Msg, List (Html Msg) ) view model = case model of + -- PLAYER DASHBOARD Player (PlayerConfig session chest) -> case Session.user session of Session.Player data -> @@ -124,21 +121,27 @@ view model = in ( text "", [] ) - Admin (AdminConfig session players newPlayer) -> - ( text "" - , [ 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 newPlayer - :: List.map viewPlayer players - ] + -- ADMIN DASHBOARD + Admin (AdminConfig session players playerForm) -> + ( case playerForm of + Nothing -> + modeButton "Ajouter un joueur" (AdminViewer EditPlayer) + + Just _ -> + buttons [ modeButton "Ok" ConfirmNewPlayer, modeButton "Annuler" CloseEdit ] + |> Html.map AdminViewer + , [ div [ class "section" ] + [ case playerForm of + Nothing -> + text "" + + Just form -> + editNewPlayer form + , table [ class "table is-fullwidth is-striped" ] + [ thead [ class "table-header" ] + [ th [] [ text "Joueurs" ] ] + , tbody [] <| List.map viewPlayer players ] - , div [ class "section" ] - [ p [] [ text "Campagnes" ] ] ] ] ) @@ -151,28 +154,28 @@ viewPlayer player = 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 <| NameChanged - ] - [] + div [ class "box" ] + [ div [ class "field is-horizontal" ] + [ div [ class "field-body" ] + [ div [ class "field" ] + [ label [ class "label" ] [ text "Nom" ] + , input + [ class "input" + , type_ "text" + , value newPlayer.name + , onInput <| NameChanged ] - , div [ class "field" ] - [ input - [ class "input" - , type_ "text" - , value <| String.fromFloat newPlayer.wealth - , onInput <| WealthChanged - ] - [] + [] + ] + , div [ class "field" ] + [ label [ class "label" ] [ text "Argent de départ" ] + , input + [ class "input" + , type_ "text" + , value <| String.fromFloat newPlayer.wealth + , onInput <| WealthChanged ] + [] ] ] ] @@ -187,7 +190,9 @@ type Msg type AdminMsg - = GotPlayers (List Player) + = EditPlayer + | CloseEdit + | ConfirmNewPlayer | GotFormMsg FormMsg @@ -204,16 +209,25 @@ type PlayerMsg update msg model = case ( msg, model ) of ( AdminViewer aMsg, Admin (AdminConfig session players form) ) -> - (case aMsg of - GotPlayers newPlayers -> - ( Admin (AdminConfig session newPlayers form) + (case ( aMsg, form ) of + ( EditPlayer, Nothing ) -> + ( Admin (AdminConfig session players (Just <| NewPlayerForm "" 0.0)) , Cmd.none ) - GotFormMsg subMsg -> - ( Admin (AdminConfig session players (updateForm subMsg form)) + ( GotFormMsg subMsg, Just f ) -> + ( Admin (AdminConfig session players <| Just (updateForm subMsg f)) , Cmd.none ) + + ( ConfirmNewPlayer, Just f ) -> + ( model, Cmd.none ) + + ( CloseEdit, _ ) -> + ( Admin (AdminConfig session players Nothing), Cmd.none ) + + _ -> + ( model, Cmd.none ) ) |> Tuple.mapSecond (Cmd.map AdminViewer) diff --git a/src/Page/GroupChest.elm b/src/Page/GroupChest.elm index 37da645..2d067e7 100644 --- a/src/Page/GroupChest.elm +++ b/src/Page/GroupChest.elm @@ -34,7 +34,7 @@ getClaimsFromSession session = else [] - Session.Admin -> + Session.Admin _ -> [] @@ -66,7 +66,7 @@ view model = let ( isPlayer, isGroup ) = case Session.user model.session of - Session.Admin -> + Session.Admin _ -> ( False, False ) Session.Player data -> diff --git a/src/Page/Shop.elm b/src/Page/Shop.elm index be0f4c7..6c9ca4d 100644 --- a/src/Page/Shop.elm +++ b/src/Page/Shop.elm @@ -6,7 +6,7 @@ import Html exposing (..) import Html.Attributes exposing (..) import Html.Events exposing (..) import Page.Chest as Chest exposing (Chest) -import Page.Chest.Selection as Selection +import Page.Chest.NewFromInventory as NewChest import Session exposing (Session, getSession) import Set exposing (Set) import Table @@ -62,7 +62,7 @@ view model = controls = Html.map Internal <| case ( model.chest, Session.user model.session ) of - ( Chest.View _, Session.Admin ) -> + ( Chest.View _, Session.Admin _ ) -> btn "Remplacer" (GotChestMsg Chest.new) ( Chest.View _, Session.Player _ ) -> @@ -71,7 +71,7 @@ view model = ( Chest.Buy _, Session.Player _ ) -> buttons [ btn "Ok" ConfirmBuy, btn "Annuler" (GotChestMsg Chest.show) ] - ( Chest.New _, Session.Admin ) -> + ( Chest.New _, Session.Admin _ ) -> buttons [ btn "Ok" ConfirmRefresh, btn "Annuler" (GotChestMsg Chest.show) ] _ -> @@ -148,10 +148,15 @@ update msg model = ConfirmRefresh -> case Session.user (getSession model) of - Session.Admin -> + Session.Admin _ -> let loot = - [] + case model.chest of + Chest.New chest -> + NewChest.allLoot chest + + _ -> + [] in ( model, Api.replaceShopItems GotRefreshResult loot ) diff --git a/src/Session.elm b/src/Session.elm index ab48312..000c128 100644 --- a/src/Session.elm +++ b/src/Session.elm @@ -16,7 +16,7 @@ type User , loot : Loot , claims : Claims } - | Admin + | Admin { players : List Player } type alias Notifications = @@ -30,22 +30,16 @@ type Session init : (Result String Session -> msg) -> Nav.Key -> Cmd msg init toMsg navKey = let - toSession : Result String ( Player, Loot, Claims ) -> msg + toSession : Result String User -> msg toSession result = case result of - Ok ( player, loot, claims ) -> + Ok logged -> toMsg <| Ok (Session navKey ( Nothing, Nothing ) - (Player - { player = player - , wealth = Wealth.init - , loot = loot - , claims = claims - } - ) + logged ) Err e -> @@ -54,24 +48,41 @@ init toMsg navKey = Task.attempt toSession initFullSession -initFullSession : Task String ( Player, Loot, Claims ) +initFullSession : Task String User initFullSession = - Api.fetchSession + let + userDecoder = + D.oneOf + [ Player.playerDecoder |> D.andThen (\p -> D.succeed <| Player { player = p, wealth = Wealth.init, loot = [], claims = [] }) + , D.list Player.playerDecoder |> D.andThen (\ps -> D.succeed <| Admin { players = ps }) + ] + in + Api.send { method = "GET", path = "session", decoder = userDecoder } |> Task.andThen wrapLoot |> Task.andThen wrapClaims |> Task.mapError Api.printError -wrapLoot : Player -> Task Http.Error ( Player, Loot ) -wrapLoot player = - Api.getLoot player.id - |> Task.andThen (\loot -> Task.succeed ( player, loot )) +wrapLoot : User -> Task Http.Error User +wrapLoot logged = + case logged of + Player data -> + Api.getLoot data.player.id + |> Task.andThen (\loot -> Task.succeed (Player { data | loot = loot })) + + Admin _ -> + Task.succeed logged -wrapClaims : ( Player, Loot ) -> Task Http.Error ( Player, Loot, Claims ) -wrapClaims ( player, loot ) = - Api.getClaims player.id - |> Task.andThen (\claims -> Task.succeed ( player, loot, claims )) +wrapClaims : User -> Task Http.Error User +wrapClaims logged = + case logged of + Player data -> + Api.getClaims data.player.id + |> Task.andThen (\claims -> Task.succeed (Player { data | claims = claims })) + + Admin _ -> + Task.succeed logged getSession : { r | session : Session } -> Session @@ -112,7 +123,7 @@ wealth session = Player data -> Just data.wealth - Admin -> + Admin _ -> Nothing @@ -125,22 +136,22 @@ setWealth wealthModel session = Player data -> Session navKey notifications (Player { data | wealth = wealthModel }) - Admin -> - Session navKey notifications Admin + Admin _ -> + session updateWealth : Wealth.Model -> Session -> Session -updateWealth newWealthModel model = +updateWealth newWealthModel session = let (Session navKey notifications loggedUser) = - model + session in case loggedUser of Player data -> Session navKey notifications (Player { data | wealth = newWealthModel }) - Admin -> - Session navKey notifications Admin + Admin _ -> + session