Group cards by type in deck editor

This commit is contained in:
Correl Roush 2023-01-10 23:12:33 -05:00
parent 0daf1eb943
commit 740f488460
3 changed files with 79 additions and 12 deletions

View file

@ -77,6 +77,7 @@ class JSONEncoder(json.JSONEncoder):
"collector_number": card.collector_number,
"rarity": str(card.rarity),
"color_identity": tutor.models.Color.to_string(card.color_identity),
"type_line": card.type_line,
"oracle_text": card.oracle_text,
"prices": {
"usd": price(card.price_usd),

View file

@ -16,6 +16,7 @@ type alias Prices =
type alias Oracle =
{ oracleId : String
, name : String
, typeLine : String
, oracleText : String
}
@ -25,6 +26,7 @@ type alias Card =
, name : String
, setCode : String
, rarity : String
, typeLine : String
, oracleText : String
, prices : Prices
}
@ -42,6 +44,7 @@ decodeOracle =
Json.Decode.succeed Oracle
|> JDP.required "oracle_id" Json.Decode.string
|> JDP.required "name" Json.Decode.string
|> JDP.required "type_line" Json.Decode.string
|> JDP.required "oracle_text"
(Json.Decode.nullable Json.Decode.string
|> Json.Decode.map (Maybe.withDefault "")
@ -55,6 +58,7 @@ decode =
|> JDP.required "name" Json.Decode.string
|> JDP.required "set_code" Json.Decode.string
|> JDP.required "rarity" Json.Decode.string
|> JDP.required "type_line" Json.Decode.string
|> JDP.required "oracle_text"
(Json.Decode.nullable Json.Decode.string
|> Json.Decode.map (Maybe.withDefault "")

View file

@ -39,6 +39,52 @@ type Deck
| Failed
type alias Grouped =
{ creatures : List Deck.Card
, instants : List Deck.Card
, sorceries : List Deck.Card
, enchantments : List Deck.Card
, lands : List Deck.Card
}
type alias Group =
{ label : String, cards : List Deck.Card }
groups : List Deck.Card -> List Group
groups cards =
let
last : List a -> Maybe a
last xs =
List.reverse xs |> List.head
typeOf : Deck.Card -> String
typeOf card =
String.split "" card.card.typeLine
|> List.head
|> Maybe.andThen (\types -> String.words types |> last)
|> Maybe.withDefault ""
isA : String -> Deck.Card -> Bool
isA cardType card =
typeOf card == cardType
isEmpty : Group -> Bool
isEmpty group =
List.isEmpty group.cards
in
List.filter (\l -> not <| isEmpty l)
[ Group "Creatures" <| List.filter (isA "Creature") cards
, Group "Planeswalkers" <| List.filter (isA "Planeswalker") cards
, Group "Instants" <| List.filter (isA "Instant") cards
, Group "Sorceries" <| List.filter (isA "Sorcery") cards
, Group "Enchantments" <| List.filter (isA "Enchantment") cards
, Group "Artifacts" <| List.filter (isA "Artifact") cards
, Group "Lands" <| List.filter (isA "Land") cards
]
init : Browser.Navigation.Key -> Url.Url -> E.Device -> Int -> ( Model, Cmd Msg )
init key url device deckId =
( { navigationKey = key
@ -73,19 +119,35 @@ update msg model =
viewDeck : Deck.Deck -> E.Element Msg
viewDeck deck =
E.column [ E.height E.fill, E.width E.fill, E.centerX, E.spacing 5 ] <|
let
viewGroup group =
E.column [ E.spacing 10 ]
[ E.paragraph [ Font.heavy ] [ UI.title group.label ]
, E.wrappedRow [ E.spacing 10 ] <|
List.map
(\dc ->
UI.cardRow
{ foil = False
, subtitle = "x" ++ String.fromInt dc.quantity
}
[ E.width <| E.px 400, E.clipX, Background.color UI.colors.background ]
dc.card
)
group.cards
]
in
E.column [ E.height E.fill, E.centerX, E.spacing 5 ] <|
[ E.paragraph [ Font.heavy, Font.size 24, Font.center ] [ UI.title deck.name ]
, E.wrappedRow [ E.width E.fill, E.height E.fill, E.scrollbarY ] <|
List.map
(\dc ->
UI.cardRow
{ foil = False
, subtitle = "x" ++ String.fromInt dc.quantity
}
[ E.width <| E.px 400, E.clipX ]
dc.card
)
deck.cards
, E.column
[ E.height E.fill
, E.spacing 10
, Background.color UI.colors.sidebar
, E.scrollbarY
, E.clipX
]
<|
List.map viewGroup <|
groups deck.cards
]