diff options
author | Yorhel <git@yorhel.nl> | 2021-01-02 09:55:37 +0100 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2021-01-02 09:55:39 +0100 |
commit | 61cb7cd185fbf9203041ca366a2eb915e746d6f4 (patch) | |
tree | a3edc941c5cee87fa6edf8aec4bc19b604198bb1 /elm | |
parent | b32c9d40ee8b9a29aa1acf2fef3376aee28d16d5 (diff) |
AdvSearch: Add anime filter
Pretty much a copy-paste from the staff id filter.
Diffstat (limited to 'elm')
-rw-r--r-- | elm/AdvSearch/Anime.elm | 93 | ||||
-rw-r--r-- | elm/AdvSearch/Fields.elm | 8 | ||||
-rw-r--r-- | elm/AdvSearch/Lib.elm | 1 | ||||
-rw-r--r-- | elm/AdvSearch/Main.elm | 2 |
4 files changed, 104 insertions, 0 deletions
diff --git a/elm/AdvSearch/Anime.elm b/elm/AdvSearch/Anime.elm new file mode 100644 index 00000000..efd021f9 --- /dev/null +++ b/elm/AdvSearch/Anime.elm @@ -0,0 +1,93 @@ +module AdvSearch.Anime exposing (..) + +import Html exposing (..) +import Html.Attributes exposing (..) +import Set +import Dict +import Lib.Autocomplete as A +import Lib.Html exposing (..) +import Lib.Util exposing (..) +import Gen.Api as GApi +import AdvSearch.Lib exposing (..) +import AdvSearch.Set as S + + + +type alias Model = + { sel : S.Model Int + , conf : A.Config Msg GApi.ApiAnimeResult + , search : A.Model GApi.ApiAnimeResult + } + +type Msg + = Sel (S.Msg Int) + | Search (A.Msg GApi.ApiAnimeResult) + + +init : Data -> (Data, Model) +init dat = + let (ndat, sel) = S.init dat + in ( { ndat | objid = ndat.objid + 1 } + , { sel = { sel | single = False } + , conf = { wrap = Search, id = "advsearch_anime" ++ String.fromInt ndat.objid, source = A.animeSource } + , search = A.init "" + } + ) + + +update : Data -> Msg -> Model -> (Data, Model, Cmd Msg) +update dat msg model = + case msg of + Sel m -> (dat, { model | sel = S.update m model.sel }, Cmd.none) + Search m -> + let (nm, c, res) = A.update model.conf m model.search + in case res of + Nothing -> (dat, { model | search = nm }, c) + Just s -> + if Set.member s.id model.sel.sel then (dat, { model | search = nm }, c) + else ( { dat | anime = Dict.insert s.id s dat.anime } + , { model | search = A.clear nm "", sel = S.update (S.Sel s.id True) model.sel } + , c ) + + +toQuery m = S.toQuery (QInt 13) m.sel + +fromQuery dat qf = S.fromQuery (\q -> + case q of + QInt 13 op v -> Just (op, v) + _ -> Nothing) dat qf + |> Maybe.map (\(ndat,sel) -> + ( { ndat | objid = ndat.objid+1 } + , { sel = { sel | single = False } + , conf = { wrap = Search, id = "advsearch_anime" ++ String.fromInt ndat.objid, source = A.animeSource } + , search = A.init "" + } + )) + + + +view : Data -> Model -> (Html Msg, () -> List (Html Msg)) +view dat model = + ( case Set.toList model.sel.sel of + [] -> b [ class "grayedout" ] [ text "Anime" ] + [s] -> span [ class "nowrap" ] + [ S.lblPrefix model.sel + , b [ class "grayedout" ] [ text <| "a" ++ String.fromInt s ++ ":" ] + , Dict.get s dat.anime |> Maybe.map (\e -> e.title) |> Maybe.withDefault "" |> text + ] + l -> span [] [ S.lblPrefix model.sel, text <| "Anime (" ++ String.fromInt (List.length l) ++ ")" ] + , \() -> + [ div [ class "advheader" ] + [ h3 [] [ text "Anime" ] + , Html.map Sel (S.opts model.sel True True) + ] + , ul [] <| List.map (\s -> + li [ style "overflow" "hidden", style "text-overflow" "ellipsis" ] + [ inputButton "X" (Sel (S.Sel s False)) [] + , b [ class "grayedout" ] [ text <| " a" ++ String.fromInt s ++ ": " ] + , Dict.get s dat.anime |> Maybe.map (\e -> e.title) |> Maybe.withDefault "" |> text + ] + ) (Set.toList model.sel.sel) + , A.view model.conf model.search [ placeholder "Search..." ] + ] + ) diff --git a/elm/AdvSearch/Fields.elm b/elm/AdvSearch/Fields.elm index 54e27cf4..a73b0c6f 100644 --- a/elm/AdvSearch/Fields.elm +++ b/elm/AdvSearch/Fields.elm @@ -8,6 +8,7 @@ import Lib.Html exposing (..) import Lib.DropDown as DD import Lib.Api as Api import Lib.Autocomplete as A +import AdvSearch.Anime as AA import AdvSearch.Set as AS import AdvSearch.Producers as AP import AdvSearch.Staff as AT @@ -277,6 +278,7 @@ type FieldModel | FMDeveloper AP.Model | FMProducer AP.Model | FMStaff AT.Model + | FMAnime AA.Model | FMRDate AD.Model | FMResolution AE.Model | FMEngine AEng.Model @@ -317,6 +319,7 @@ type FieldMsg | FSDeveloper AP.Msg | FSProducer AP.Msg | FSStaff AT.Msg + | FSAnime AA.Msg | FSRDate AD.Msg | FSResolution AE.Msg | FSEngine AEng.Msg @@ -378,6 +381,7 @@ fields = , f V "Popularity" 0 FMPopularity AR.popularityInit AR.popularityFromQuery , f V "Rating" 0 FMRating AR.ratingInit AR.ratingFromQuery , f V "Number of votes" 0 FMVotecount AR.votecountInit AR.votecountFromQuery + , f V "Anime" 0 FMAnime AA.init AA.fromQuery , l V "Has description" 0 [(QInt 61 Eq 1, "Has description"), (QInt 61 Ne 1, "No description")] , l V "Has anime" 0 [(QInt 62 Eq 1, "Has anime relation"), (QInt 62 Ne 1, "No anime relation")] , l V "Has screenshot" 0 [(QInt 63 Eq 1, "Has screenshot(s)"), (QInt 63 Ne 1, "No screenshot(s)")] @@ -443,6 +447,7 @@ fieldUpdate dat msg_ (num, dd, model) = FMDeveloper m -> Cmd.map FSDeveloper (A.refocus m.conf) FMProducer m -> Cmd.map FSProducer (A.refocus m.conf) FMStaff m -> Cmd.map FSStaff (A.refocus m.conf) + FMAnime m -> Cmd.map FSAnime (A.refocus m.conf) FMResolution m -> Cmd.map FSResolution (A.refocus m.conf) FMEngine m -> Cmd.map FSEngine (A.refocus m.conf) _ -> Cmd.none @@ -497,6 +502,7 @@ fieldUpdate dat msg_ (num, dd, model) = (FSDeveloper msg,FMDeveloper m)-> mapf FMDeveloper FSDeveloper (AP.update dat msg m) (FSProducer msg, FMProducer m) -> mapf FMProducer FSProducer (AP.update dat msg m) (FSStaff msg, FMStaff m) -> mapf FMStaff FSStaff (AT.update dat msg m) + (FSAnime msg, FMAnime m) -> mapf FMAnime FSAnime (AA.update dat msg m) (FSRDate msg, FMRDate m) -> maps FMRDate (AD.update msg m) (FSResolution msg,FMResolution m)->mapf FMResolution FSResolution (AE.update dat msg m) (FSEngine msg, FMEngine m) -> mapf FMEngine FSEngine (AEng.update dat msg m) @@ -562,6 +568,7 @@ fieldView dat (_, dd, model) = FMDeveloper m -> f FSDeveloper (AP.view False dat m) FMProducer m -> f FSProducer (AP.view True dat m) FMStaff m -> f FSStaff (AT.view dat m) + FMAnime m -> f FSAnime (AA.view dat m) FMRDate m -> f FSRDate (AD.view m) FMResolution m -> f FSResolution (AE.view m) FMEngine m -> f FSEngine (AEng.view m) @@ -606,6 +613,7 @@ fieldToQuery dat (_, _, model) = FMDeveloper m-> AP.toQuery False m FMProducer m -> AP.toQuery True m FMStaff m -> AT.toQuery m + FMAnime m -> AA.toQuery m FMRDate m -> AD.toQuery m FMResolution m-> AE.toQuery m FMEngine m -> AEng.toQuery m diff --git a/elm/AdvSearch/Lib.elm b/elm/AdvSearch/Lib.elm index c1d252d8..0820eeb6 100644 --- a/elm/AdvSearch/Lib.elm +++ b/elm/AdvSearch/Lib.elm @@ -170,4 +170,5 @@ type alias Data = , staff : Dict.Dict Int GApi.ApiStaffResult , tags : Dict.Dict Int GApi.ApiTagResult , traits : Dict.Dict Int GApi.ApiTraitResult + , anime : Dict.Dict Int GApi.ApiAnimeResult } diff --git a/elm/AdvSearch/Main.elm b/elm/AdvSearch/Main.elm index e707a2a8..3565be81 100644 --- a/elm/AdvSearch/Main.elm +++ b/elm/AdvSearch/Main.elm @@ -32,6 +32,7 @@ type alias Recv = , staff : List GApi.ApiStaffResult , tags : List GApi.ApiTagResult , traits : List GApi.ApiTraitResult + , anime : List GApi.ApiAnimeResult } type alias Model = @@ -84,6 +85,7 @@ init arg = , staff = Dict.fromList <| List.map (\s -> (s.id,s)) <| arg.staff , tags = Dict.fromList <| List.map (\t -> (t.id,t)) <| arg.tags , traits = Dict.fromList <| List.map (\t -> (t.id,t)) <| arg.traits + , anime = Dict.fromList <| List.map (\a -> (a.id,a)) <| arg.anime } qtype = if arg.qtype == "v" then V else R |