Cadel Watson hai 1 ano
pai
achega
879085503d
Modificáronse 4 ficheiros con 93 adicións e 18 borrados
  1. 2 1
      src/Card.elm
  2. 1 0
      src/Database.elm
  3. 23 1
      src/Deck.elm
  4. 67 16
      src/Main.elm

+ 2 - 1
src/Card.elm

@@ -45,7 +45,8 @@ type alias CardData =
 
 
 
 
 type alias CardDetails =
 type alias CardDetails =
-    { cmc : Int
+    { name : String
+    , cmc : Int
     , cardType : CardType
     , cardType : CardType
     , typeLine : String
     , typeLine : String
     , oracleText : Maybe String
     , oracleText : Maybe String

+ 1 - 0
src/Database.elm

@@ -140,6 +140,7 @@ decodeCardDetails =
     Decode.map2 pair
     Decode.map2 pair
         (Decode.field "name" Decode.string)
         (Decode.field "name" Decode.string)
         (Decode.succeed CardDetails
         (Decode.succeed CardDetails
+            |> required "name" Decode.string
             |> required "cmc" Decode.int
             |> required "cmc" Decode.int
             |> required "type_line" decodeCardType
             |> required "type_line" decodeCardType
             |> required "type_line" Decode.string
             |> required "type_line" Decode.string

+ 23 - 1
src/Deck.elm

@@ -1,4 +1,4 @@
-module Deck exposing (Deck, cmcCurve, fromDraft)
+module Deck exposing (Deck, DeckSortMethod(..), cmcCurve, decklist, fromDraft)
 
 
 import Card exposing (CardData)
 import Card exposing (CardData)
 import Database exposing (Database)
 import Database exposing (Database)
@@ -41,3 +41,25 @@ cmcCurve deck =
         |> List.map (\cmc -> ( cmc, List.count (\x -> x == cmc) cmcs ))
         |> List.map (\cmc -> ( cmc, List.count (\x -> x == cmc) cmcs ))
     )
     )
         ++ [ ( maxBucket, List.count (\x -> x >= maxBucket) cmcs ) ]
         ++ [ ( maxBucket, List.count (\x -> x >= maxBucket) cmcs ) ]
+
+
+type DeckSortMethod
+    = SortByPickNumber
+    | SortByName
+    | SortByCMC
+
+
+decklist : DeckSortMethod -> Deck -> List CardData
+decklist sortBy deck =
+    case sortBy of
+        SortByPickNumber ->
+            -- Pick order is default sort order
+            deck.cards
+
+        SortByName ->
+            deck.cards
+                |> List.sortBy (.details >> .name)
+
+        SortByCMC ->
+            deck.cards
+                |> List.sortBy (.details >> .cmc)

+ 67 - 16
src/Main.elm

@@ -7,9 +7,9 @@ import Chart.Attributes as CA
 import Database
 import Database
 import Deck
 import Deck
 import Draft exposing (Draft)
 import Draft exposing (Draft)
-import Html exposing (Html, a, button, div, img, span, text)
+import Html exposing (Html, a, button, div, img, li, span, text, ul)
 import Html.Attributes exposing (alt, class, classList, disabled, src)
 import Html.Attributes exposing (alt, class, classList, disabled, src)
-import Html.Events as Events exposing (onClick)
+import Html.Events as Events exposing (onClick, onMouseEnter)
 import Html.Keyed as Keyed
 import Html.Keyed as Keyed
 import Icon exposing (chevronDown, chevronUp)
 import Icon exposing (chevronDown, chevronUp)
 import List.Extra as List
 import List.Extra as List
@@ -46,8 +46,8 @@ type FocusStat
     | FocusIWD
     | FocusIWD
 
 
 
 
-type alias ChartAccordion =
-    { cmc : Bool, signals : Bool, signalsDelta : Bool }
+type alias ToolboxAccordion =
+    { cmc : Bool, signals : Bool, signalsDelta : Bool, deckList : Bool }
 
 
 
 
 type alias ReadyModel =
 type alias ReadyModel =
@@ -57,7 +57,8 @@ type alias ReadyModel =
     , flipHighlighted : Bool
     , flipHighlighted : Bool
     , focusStat : FocusStat
     , focusStat : FocusStat
     , deckProgress : DeckProgress
     , deckProgress : DeckProgress
-    , chartAccordion : ChartAccordion
+    , toolboxAccordion : ToolboxAccordion
+    , deckSortOrder : Deck.DeckSortMethod
     }
     }
 
 
 
 
@@ -77,11 +78,13 @@ init flags =
                 , flipHighlighted = False
                 , flipHighlighted = False
                 , focusStat = FocusPickRate
                 , focusStat = FocusPickRate
                 , deckProgress = DeckUpToPick
                 , deckProgress = DeckUpToPick
-                , chartAccordion =
+                , toolboxAccordion =
                     { cmc = True
                     { cmc = True
                     , signals = False
                     , signals = False
                     , signalsDelta = False
                     , signalsDelta = False
+                    , deckList = False
                     }
                     }
+                , deckSortOrder = Deck.SortByPickNumber
                 }
                 }
             , Cmd.none
             , Cmd.none
             )
             )
@@ -106,6 +109,7 @@ type Msg
     | ToggleCMCChart
     | ToggleCMCChart
     | ToggleSignalsChart
     | ToggleSignalsChart
     | ToggleSignalsDeltaChart
     | ToggleSignalsDeltaChart
+    | ToggleDeckList
 
 
 
 
 update : Msg -> Model -> ( Model, Cmd Msg )
 update : Msg -> Model -> ( Model, Cmd Msg )
@@ -140,23 +144,30 @@ update msg model =
                 ToggleCMCChart ->
                 ToggleCMCChart ->
                     let
                     let
                         chartAccordion =
                         chartAccordion =
-                            mdl.chartAccordion
+                            mdl.toolboxAccordion
                     in
                     in
-                    ( Ready { mdl | chartAccordion = { chartAccordion | cmc = not mdl.chartAccordion.cmc } }, Cmd.none )
+                    ( Ready { mdl | toolboxAccordion = { chartAccordion | cmc = not mdl.toolboxAccordion.cmc } }, Cmd.none )
 
 
                 ToggleSignalsChart ->
                 ToggleSignalsChart ->
                     let
                     let
                         chartAccordion =
                         chartAccordion =
-                            mdl.chartAccordion
+                            mdl.toolboxAccordion
                     in
                     in
-                    ( Ready { mdl | chartAccordion = { chartAccordion | signals = not mdl.chartAccordion.signals } }, Cmd.none )
+                    ( Ready { mdl | toolboxAccordion = { chartAccordion | signals = not mdl.toolboxAccordion.signals } }, Cmd.none )
 
 
                 ToggleSignalsDeltaChart ->
                 ToggleSignalsDeltaChart ->
                     let
                     let
                         chartAccordion =
                         chartAccordion =
-                            mdl.chartAccordion
+                            mdl.toolboxAccordion
                     in
                     in
-                    ( Ready { mdl | chartAccordion = { chartAccordion | signalsDelta = not mdl.chartAccordion.signalsDelta } }, Cmd.none )
+                    ( Ready { mdl | toolboxAccordion = { chartAccordion | signalsDelta = not mdl.toolboxAccordion.signalsDelta } }, Cmd.none )
+
+                ToggleDeckList ->
+                    let
+                        deckListAccordion =
+                            mdl.toolboxAccordion
+                    in
+                    ( Ready { mdl | toolboxAccordion = { deckListAccordion | deckList = not mdl.toolboxAccordion.deckList } }, Cmd.none )
 
 
         Error mdl ->
         Error mdl ->
             ( Error mdl, Cmd.none )
             ( Error mdl, Cmd.none )
@@ -241,14 +252,54 @@ viewDeck model =
                 [ text "Entire deck" ]
                 [ text "Entire deck" ]
             ]
             ]
         , div [ class "overflow-y-auto" ]
         , div [ class "overflow-y-auto" ]
-            [ viewChart .cmc ToggleCMCChart "CMC curve" (viewCmcChart model) model
+            [ viewDeckList model
+            , viewChart .cmc ToggleCMCChart "CMC curve" (viewCmcChart model) model
             , viewChart .signals ToggleSignalsChart "Signals (card count)" (viewSignalsChart model) model
             , viewChart .signals ToggleSignalsChart "Signals (card count)" (viewSignalsChart model) model
             , viewChart .signalsDelta ToggleSignalsDeltaChart "Signals (delta)" (viewSignalsDeltaChart model) model
             , viewChart .signalsDelta ToggleSignalsDeltaChart "Signals (delta)" (viewSignalsDeltaChart model) model
             ]
             ]
         ]
         ]
 
 
 
 
-viewChart : (ChartAccordion -> Bool) -> Msg -> String -> Html Msg -> ReadyModel -> Html Msg
+viewDeckList : ReadyModel -> Html Msg
+viewDeckList model =
+    let
+        deck =
+            Deck.fromDraft (model.deckProgress == EntireDeck) model.database model.draft
+                |> Deck.decklist model.deckSortOrder
+
+        decklist =
+            ul [] (List.map viewCard deck)
+
+        viewCard : CardData -> Html Msg
+        viewCard card =
+            li [ class "" ]
+                [ text card.details.name ]
+    in
+    div [ class "mb-2 w-full" ]
+        [ button
+            [ class "w-full flex justify-between items-center bg-slate-900 text-white p-2 rounded shadow"
+            , onClick ToggleDeckList
+            ]
+            [ span [] [ text "Decklist" ]
+            , span [ class "h-4 w-4" ]
+                [ if model.toolboxAccordion.deckList then
+                    chevronUp
+
+                  else
+                    chevronDown
+                ]
+            ]
+        , if model.toolboxAccordion.deckList then
+            div [ class "py-2" ]
+                [ decklist
+                ]
+
+          else
+            div [] []
+        ]
+
+
+viewChart : (ToolboxAccordion -> Bool) -> Msg -> String -> Html Msg -> ReadyModel -> Html Msg
 viewChart isOpenF toggle title chart model =
 viewChart isOpenF toggle title chart model =
     div [ class "mb-2 w-full" ]
     div [ class "mb-2 w-full" ]
         [ button
         [ button
@@ -257,14 +308,14 @@ viewChart isOpenF toggle title chart model =
             ]
             ]
             [ span [] [ text title ]
             [ span [] [ text title ]
             , span [ class "h-4 w-4" ]
             , span [ class "h-4 w-4" ]
-                [ if isOpenF model.chartAccordion then
+                [ if isOpenF model.toolboxAccordion then
                     chevronUp
                     chevronUp
 
 
                   else
                   else
                     chevronDown
                     chevronDown
                 ]
                 ]
             ]
             ]
-        , if isOpenF model.chartAccordion then
+        , if isOpenF model.toolboxAccordion then
             div [ class "py-2" ]
             div [ class "py-2" ]
                 [ chart
                 [ chart
                 ]
                 ]