|
@@ -10,7 +10,7 @@ import Database
|
|
|
import Deck
|
|
import Deck
|
|
|
import Dict exposing (Dict)
|
|
import Dict exposing (Dict)
|
|
|
import Draft exposing (Draft)
|
|
import Draft exposing (Draft)
|
|
|
-import DraftMeta exposing (DraftMeta)
|
|
|
|
|
|
|
+import DraftMeta exposing (DraftMeta, parseDraftIDFromPublicURL)
|
|
|
import Html exposing (Html, a, button, div, h1, img, input, label, li, p, span, text, ul)
|
|
import Html exposing (Html, a, button, div, h1, img, input, label, li, p, span, text, ul)
|
|
|
import Html.Attributes exposing (alt, class, classList, disabled, href, src, type_, value)
|
|
import Html.Attributes exposing (alt, class, classList, disabled, href, src, type_, value)
|
|
|
import Html.Events as Events exposing (onClick, onInput, onMouseEnter)
|
|
import Html.Events as Events exposing (onClick, onInput, onMouseEnter)
|
|
@@ -73,18 +73,18 @@ type SetLoadStatus
|
|
|
| DeletingLocalData
|
|
| DeletingLocalData
|
|
|
|
|
|
|
|
|
|
|
|
|
-type AvailableDrafts
|
|
|
|
|
- = DraftsNotChecked
|
|
|
|
|
- | DraftsLoading
|
|
|
|
|
- | AvailableDrafts (List DraftMeta)
|
|
|
|
|
|
|
+type ImportDraft
|
|
|
|
|
+ = EditingImportUrl String
|
|
|
|
|
+ | LoadingDraft
|
|
|
|
|
+ | ImportDraftParseError String
|
|
|
|
|
+ | DraftImported DraftMeta
|
|
|
|
|
|
|
|
|
|
|
|
|
type alias ChooseSetModel =
|
|
type alias ChooseSetModel =
|
|
|
{ draftData : String
|
|
{ draftData : String
|
|
|
, sets : Dict String SetLoadStatus
|
|
, sets : Dict String SetLoadStatus
|
|
|
- , eventHistoryUrl : Maybe String -- Resolved event history URL
|
|
|
|
|
- , eventHistoryUrlField : String -- Working state of input
|
|
|
|
|
- , drafts : AvailableDrafts
|
|
|
|
|
|
|
+ , importDraft : ImportDraft
|
|
|
|
|
+ , importDraftParseError : Maybe String
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -115,7 +115,7 @@ type alias ErrorModel =
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
-init : { sets : List String, draftData : String, eventHistoryUrl : Maybe String } -> ( Model, Cmd Msg )
|
|
|
|
|
|
|
+init : { sets : List String, draftData : String } -> ( Model, Cmd Msg )
|
|
|
init flags =
|
|
init flags =
|
|
|
let
|
|
let
|
|
|
setStatus : Dict String SetLoadStatus
|
|
setStatus : Dict String SetLoadStatus
|
|
@@ -129,24 +129,14 @@ init flags =
|
|
|
List.map
|
|
List.map
|
|
|
(\s -> sendDoesSetHaveLocalData s)
|
|
(\s -> sendDoesSetHaveLocalData s)
|
|
|
flags.sets
|
|
flags.sets
|
|
|
-
|
|
|
|
|
- draftCmds : List (Cmd Msg)
|
|
|
|
|
- draftCmds =
|
|
|
|
|
- case flags.eventHistoryUrl of
|
|
|
|
|
- Nothing ->
|
|
|
|
|
- []
|
|
|
|
|
-
|
|
|
|
|
- Just url ->
|
|
|
|
|
- [ API.getDrafts url IOGotDrafts ]
|
|
|
|
|
in
|
|
in
|
|
|
( ChooseSet
|
|
( ChooseSet
|
|
|
{ draftData = flags.draftData
|
|
{ draftData = flags.draftData
|
|
|
, sets = setStatus
|
|
, sets = setStatus
|
|
|
- , eventHistoryUrl = flags.eventHistoryUrl
|
|
|
|
|
- , eventHistoryUrlField = ""
|
|
|
|
|
- , drafts = DraftsNotChecked
|
|
|
|
|
|
|
+ , importDraft = EditingImportUrl ""
|
|
|
|
|
+ , importDraftParseError = Nothing
|
|
|
}
|
|
}
|
|
|
- , Cmd.batch (API.getSets IOGotSets :: setCmds ++ draftCmds)
|
|
|
|
|
|
|
+ , Cmd.batch (API.getSets IOGotSets :: setCmds)
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@@ -154,8 +144,9 @@ type Msg
|
|
|
= Increment
|
|
= Increment
|
|
|
| Decrement
|
|
| Decrement
|
|
|
| Highlight String
|
|
| Highlight String
|
|
|
- | SetEventHistoryUrlField String
|
|
|
|
|
- | SubmitEventHistoryUrlField
|
|
|
|
|
|
|
+ | ChangeDraftImportUrlField String
|
|
|
|
|
+ | AcknowledgeParseError
|
|
|
|
|
+ | SubmitImportDraft
|
|
|
| FlipHighlightedCard
|
|
| FlipHighlightedCard
|
|
|
| SetFocusStat FocusStat
|
|
| SetFocusStat FocusStat
|
|
|
| SetSortOrder SortOrder
|
|
| SetSortOrder SortOrder
|
|
@@ -166,41 +157,35 @@ type Msg
|
|
|
| ToggleDeckList
|
|
| ToggleDeckList
|
|
|
| SetDeckSortMethod Deck.DeckSortMethod
|
|
| SetDeckSortMethod Deck.DeckSortMethod
|
|
|
| IOGotSets (Result String (List String))
|
|
| IOGotSets (Result String (List String))
|
|
|
- | IOGotDrafts (Result String (List DraftMeta))
|
|
|
|
|
|
|
+ | IOGotDraft (Result String DraftMeta)
|
|
|
| IOFetchSetData String
|
|
| IOFetchSetData String
|
|
|
| IOGotSetData (Result String ( String, Maybe Database.Database ))
|
|
| IOGotSetData (Result String ( String, Maybe Database.Database ))
|
|
|
| IODeleteSetData String -- Delete by set code
|
|
| IODeleteSetData String -- Delete by set code
|
|
|
| IOGotDeleteSetData String -- Successful deletion by set code
|
|
| IOGotDeleteSetData String -- Successful deletion by set code
|
|
|
| PortReceiveDoesSetHaveLocalData String
|
|
| PortReceiveDoesSetHaveLocalData String
|
|
|
- | StartDraft String Database.Database
|
|
|
|
|
| OpenCardExplorer String Database.Database
|
|
| OpenCardExplorer String Database.Database
|
|
|
|
|
|
|
|
|
|
|
|
|
-startDraft : ChooseSetModel -> Database.Database -> ( Model, Cmd Msg )
|
|
|
|
|
-startDraft initFlags database =
|
|
|
|
|
- case Draft.decode initFlags.draftData of
|
|
|
|
|
- Ok draftData ->
|
|
|
|
|
- ( Ready
|
|
|
|
|
- { draft = draftData
|
|
|
|
|
- , database = database
|
|
|
|
|
- , performanceDistributions = calculatePerformanceDistributions (Database.getAll database)
|
|
|
|
|
- , highlighted = Nothing
|
|
|
|
|
- , flipHighlighted = False
|
|
|
|
|
- , focusStat = FocusPickRate
|
|
|
|
|
- , deckProgress = DeckUpToPick
|
|
|
|
|
- , toolboxAccordion =
|
|
|
|
|
- { cmc = True
|
|
|
|
|
- , signals = False
|
|
|
|
|
- , signalsDelta = False
|
|
|
|
|
- , deckList = False
|
|
|
|
|
- }
|
|
|
|
|
- , deckSortOrder = Deck.SortByPickNumber
|
|
|
|
|
- }
|
|
|
|
|
- , Cmd.none
|
|
|
|
|
- )
|
|
|
|
|
-
|
|
|
|
|
- Err err ->
|
|
|
|
|
- ( Error { error = "Error decoding draft data: " ++ err }, Cmd.none )
|
|
|
|
|
|
|
+startDraft : DraftMeta -> Database.Database -> ( Model, Cmd Msg )
|
|
|
|
|
+startDraft draft database =
|
|
|
|
|
+ ( Ready
|
|
|
|
|
+ { draft = draft.draftData
|
|
|
|
|
+ , database = database
|
|
|
|
|
+ , performanceDistributions = calculatePerformanceDistributions (Database.getAll database)
|
|
|
|
|
+ , highlighted = Nothing
|
|
|
|
|
+ , flipHighlighted = False
|
|
|
|
|
+ , focusStat = FocusPickRate
|
|
|
|
|
+ , deckProgress = DeckUpToPick
|
|
|
|
|
+ , toolboxAccordion =
|
|
|
|
|
+ { cmc = True
|
|
|
|
|
+ , signals = False
|
|
|
|
|
+ , signalsDelta = False
|
|
|
|
|
+ , deckList = False
|
|
|
|
|
+ }
|
|
|
|
|
+ , deckSortOrder = Deck.SortByPickNumber
|
|
|
|
|
+ }
|
|
|
|
|
+ , Cmd.none
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
|
|
|
|
|
openCardExplorer : ChooseSetModel -> Database.Database -> ( Model, Cmd Msg )
|
|
openCardExplorer : ChooseSetModel -> Database.Database -> ( Model, Cmd Msg )
|
|
@@ -221,9 +206,6 @@ update msg model =
|
|
|
case model of
|
|
case model of
|
|
|
ChooseSet mdl ->
|
|
ChooseSet mdl ->
|
|
|
case msg of
|
|
case msg of
|
|
|
- StartDraft setCode database ->
|
|
|
|
|
- startDraft mdl database
|
|
|
|
|
-
|
|
|
|
|
OpenCardExplorer setCode database ->
|
|
OpenCardExplorer setCode database ->
|
|
|
openCardExplorer mdl database
|
|
openCardExplorer mdl database
|
|
|
|
|
|
|
@@ -306,23 +288,58 @@ update msg model =
|
|
|
IOGotSetData (Err e) ->
|
|
IOGotSetData (Err e) ->
|
|
|
( Error { error = "Error fetching remote set data (" ++ e ++ ")" }, Cmd.none )
|
|
( Error { error = "Error fetching remote set data (" ++ e ++ ")" }, Cmd.none )
|
|
|
|
|
|
|
|
- SetEventHistoryUrlField v ->
|
|
|
|
|
- ( ChooseSet { mdl | eventHistoryUrlField = v }, Cmd.none )
|
|
|
|
|
|
|
+ ChangeDraftImportUrlField v ->
|
|
|
|
|
+ let
|
|
|
|
|
+ newImportDraft =
|
|
|
|
|
+ case mdl.importDraft of
|
|
|
|
|
+ EditingImportUrl _ ->
|
|
|
|
|
+ EditingImportUrl v
|
|
|
|
|
|
|
|
- SubmitEventHistoryUrlField ->
|
|
|
|
|
- ( ChooseSet
|
|
|
|
|
- { mdl
|
|
|
|
|
- | eventHistoryUrl = Just mdl.eventHistoryUrlField
|
|
|
|
|
- , drafts = DraftsLoading
|
|
|
|
|
- }
|
|
|
|
|
- , API.getDrafts mdl.eventHistoryUrlField IOGotDrafts
|
|
|
|
|
- )
|
|
|
|
|
|
|
+ _ ->
|
|
|
|
|
+ mdl.importDraft
|
|
|
|
|
+ in
|
|
|
|
|
+ ( ChooseSet { mdl | importDraft = newImportDraft }, Cmd.none )
|
|
|
|
|
+
|
|
|
|
|
+ AcknowledgeParseError ->
|
|
|
|
|
+ ( ChooseSet { mdl | importDraft = EditingImportUrl "" }, Cmd.none )
|
|
|
|
|
+
|
|
|
|
|
+ SubmitImportDraft ->
|
|
|
|
|
+ case mdl.importDraft of
|
|
|
|
|
+ EditingImportUrl url ->
|
|
|
|
|
+ case parseDraftIDFromPublicURL url of
|
|
|
|
|
+ Ok draftID ->
|
|
|
|
|
+ ( ChooseSet
|
|
|
|
|
+ { mdl
|
|
|
|
|
+ | importDraft = LoadingDraft
|
|
|
|
|
+ }
|
|
|
|
|
+ , API.getDraft draftID IOGotDraft
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+ Err e ->
|
|
|
|
|
+ ( ChooseSet
|
|
|
|
|
+ { mdl
|
|
|
|
|
+ | importDraft = ImportDraftParseError e
|
|
|
|
|
+ }
|
|
|
|
|
+ , Cmd.none
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
- IOGotDrafts (Ok drafts) ->
|
|
|
|
|
- ( ChooseSet { mdl | drafts = AvailableDrafts drafts }, Cmd.none )
|
|
|
|
|
|
|
+ _ ->
|
|
|
|
|
+ ( ChooseSet mdl, Cmd.none )
|
|
|
|
|
|
|
|
- IOGotDrafts (Err e) ->
|
|
|
|
|
- ( Error { error = "Error fetching drafts (" ++ e ++ ")" }, Cmd.none )
|
|
|
|
|
|
|
+ IOGotDraft (Ok draft) ->
|
|
|
|
|
+ let
|
|
|
|
|
+ setData =
|
|
|
|
|
+ Dict.get draft.setCode mdl.sets
|
|
|
|
|
+ in
|
|
|
|
|
+ case setData of
|
|
|
|
|
+ Just (HasLocalData db) ->
|
|
|
|
|
+ startDraft draft db
|
|
|
|
|
+
|
|
|
|
|
+ _ ->
|
|
|
|
|
+ ( Error { error = "You must download the set data for the draft before you can open it. (" ++ draft.setCode ++ ")" }, Cmd.none )
|
|
|
|
|
+
|
|
|
|
|
+ IOGotDraft (Err e) ->
|
|
|
|
|
+ ( Error { error = "Error fetching draft (" ++ e ++ ")" }, Cmd.none )
|
|
|
|
|
|
|
|
_ ->
|
|
_ ->
|
|
|
( ChooseSet mdl, Cmd.none )
|
|
( ChooseSet mdl, Cmd.none )
|
|
@@ -402,22 +419,22 @@ update msg model =
|
|
|
IOGotDeleteSetData setCode ->
|
|
IOGotDeleteSetData setCode ->
|
|
|
( Ready mdl, Cmd.none )
|
|
( Ready mdl, Cmd.none )
|
|
|
|
|
|
|
|
- IOGotDrafts _ ->
|
|
|
|
|
|
|
+ IOGotDraft _ ->
|
|
|
( Ready mdl, Cmd.none )
|
|
( Ready mdl, Cmd.none )
|
|
|
|
|
|
|
|
PortReceiveDoesSetHaveLocalData _ ->
|
|
PortReceiveDoesSetHaveLocalData _ ->
|
|
|
( Ready mdl, Cmd.none )
|
|
( Ready mdl, Cmd.none )
|
|
|
|
|
|
|
|
- StartDraft _ _ ->
|
|
|
|
|
|
|
+ OpenCardExplorer _ _ ->
|
|
|
( Ready mdl, Cmd.none )
|
|
( Ready mdl, Cmd.none )
|
|
|
|
|
|
|
|
- OpenCardExplorer _ _ ->
|
|
|
|
|
|
|
+ ChangeDraftImportUrlField _ ->
|
|
|
( Ready mdl, Cmd.none )
|
|
( Ready mdl, Cmd.none )
|
|
|
|
|
|
|
|
- SetEventHistoryUrlField _ ->
|
|
|
|
|
|
|
+ SubmitImportDraft ->
|
|
|
( Ready mdl, Cmd.none )
|
|
( Ready mdl, Cmd.none )
|
|
|
|
|
|
|
|
- SubmitEventHistoryUrlField ->
|
|
|
|
|
|
|
+ AcknowledgeParseError ->
|
|
|
( Ready mdl, Cmd.none )
|
|
( Ready mdl, Cmd.none )
|
|
|
|
|
|
|
|
CardExplorer mdl ->
|
|
CardExplorer mdl ->
|
|
@@ -482,7 +499,6 @@ viewChooseSet model =
|
|
|
HasLocalData database ->
|
|
HasLocalData database ->
|
|
|
div [ class "flex gap-2" ]
|
|
div [ class "flex gap-2" ]
|
|
|
[ Button.make "Explore" (OpenCardExplorer setCode database) |> Button.view
|
|
[ Button.make "Explore" (OpenCardExplorer setCode database) |> Button.view
|
|
|
- , Button.make "View draft" (StartDraft setCode database) |> Button.view
|
|
|
|
|
, Button.make "Delete" (IODeleteSetData setCode) |> Button.view
|
|
, Button.make "Delete" (IODeleteSetData setCode) |> Button.view
|
|
|
]
|
|
]
|
|
|
in
|
|
in
|
|
@@ -490,7 +506,7 @@ viewChooseSet model =
|
|
|
[ div [ class "max-w-4xl max-h-2xl bg-slate-500 rounded-lg p-6 shadow-xl" ]
|
|
[ div [ class "max-w-4xl max-h-2xl bg-slate-500 rounded-lg p-6 shadow-xl" ]
|
|
|
[ h1 [ class "text-3xl text-white font-medium" ] [ text "Drafter" ]
|
|
[ h1 [ class "text-3xl text-white font-medium" ] [ text "Drafter" ]
|
|
|
, p [ class "text-white font-medium" ] [ text "Explore sets and analyse your draft events." ]
|
|
, p [ class "text-white font-medium" ] [ text "Explore sets and analyse your draft events." ]
|
|
|
- , viewEventHistoryURL model
|
|
|
|
|
|
|
+ , viewDraftURL model
|
|
|
]
|
|
]
|
|
|
, div [ class "max-w-4xl max-h-2xl bg-slate-500 rounded-lg p-6 shadow-xl" ]
|
|
, div [ class "max-w-4xl max-h-2xl bg-slate-500 rounded-lg p-6 shadow-xl" ]
|
|
|
[ ul [ class "divide-y divide-slate-600" ]
|
|
[ ul [ class "divide-y divide-slate-600" ]
|
|
@@ -512,27 +528,34 @@ viewChooseSet model =
|
|
|
]
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
|
-viewEventHistoryURL : ChooseSetModel -> Html Msg
|
|
|
|
|
-viewEventHistoryURL model =
|
|
|
|
|
- case model.eventHistoryUrl of
|
|
|
|
|
- Just url ->
|
|
|
|
|
- div []
|
|
|
|
|
- [ p [] [ text "17Lands public event history:" ]
|
|
|
|
|
- , a [ href url ] [ text url ]
|
|
|
|
|
- ]
|
|
|
|
|
-
|
|
|
|
|
- Nothing ->
|
|
|
|
|
|
|
+viewDraftURL : ChooseSetModel -> Html Msg
|
|
|
|
|
+viewDraftURL model =
|
|
|
|
|
+ case model.importDraft of
|
|
|
|
|
+ EditingImportUrl url ->
|
|
|
div [ class "mt-4" ]
|
|
div [ class "mt-4" ]
|
|
|
[ label [ class "block text-sm font-medium text-white" ] [ text "Enter your 17Lands public event history URL:" ]
|
|
[ label [ class "block text-sm font-medium text-white" ] [ text "Enter your 17Lands public event history URL:" ]
|
|
|
, input
|
|
, input
|
|
|
[ type_ "text"
|
|
[ type_ "text"
|
|
|
- , onInput SetEventHistoryUrlField
|
|
|
|
|
- , value model.eventHistoryUrlField
|
|
|
|
|
|
|
+ , onInput ChangeDraftImportUrlField
|
|
|
|
|
+ , value url
|
|
|
]
|
|
]
|
|
|
[]
|
|
[]
|
|
|
- , Button.make "Save" SubmitEventHistoryUrlField |> Button.view
|
|
|
|
|
|
|
+ , Button.make "Save" SubmitImportDraft |> Button.view
|
|
|
|
|
+ ]
|
|
|
|
|
+
|
|
|
|
|
+ ImportDraftParseError e ->
|
|
|
|
|
+ div [ class "mt-4 text-white" ]
|
|
|
|
|
+ [ p [] [ text ("Could not extract draft ID from URL: " ++ e) ]
|
|
|
|
|
+ , p [] [ text "Please make sure your URL looks like: https://www.17lands.com/draft/490bda1edc574d71a2768a7d7a415a25" ]
|
|
|
]
|
|
]
|
|
|
|
|
|
|
|
|
|
+ LoadingDraft ->
|
|
|
|
|
+ div [ class "mt-4" ]
|
|
|
|
|
+ [ text "Loading..." ]
|
|
|
|
|
+
|
|
|
|
|
+ _ ->
|
|
|
|
|
+ div [] []
|
|
|
|
|
+
|
|
|
|
|
|
|
|
viewReady : ReadyModel -> Html Msg
|
|
viewReady : ReadyModel -> Html Msg
|
|
|
viewReady model =
|
|
viewReady model =
|