1module Views.FilterBar.Updates exposing (setMatchers, update) 2 3import Browser.Dom as Dom 4import Browser.Navigation as Navigation 5import Task 6import Utils.Filter exposing (Filter, generateQueryString, parseFilter, stringifyFilter) 7import Views.FilterBar.Types exposing (Model, Msg(..)) 8 9 10update : String -> Filter -> Msg -> Model -> ( Model, Cmd Msg ) 11update url filter msg model = 12 case msg of 13 AddFilterMatcher emptyMatcherText matcher -> 14 immediatelyFilter url 15 filter 16 { model 17 | matchers = 18 if List.member matcher model.matchers then 19 model.matchers 20 21 else 22 model.matchers ++ [ matcher ] 23 , matcherText = 24 if emptyMatcherText then 25 "" 26 27 else 28 model.matcherText 29 } 30 31 DeleteFilterMatcher setMatcherText matcher -> 32 immediatelyFilter url 33 filter 34 { model 35 | matchers = List.filter ((/=) matcher) model.matchers 36 , matcherText = 37 if setMatcherText then 38 Utils.Filter.stringifyMatcher matcher 39 40 else 41 model.matcherText 42 } 43 44 UpdateMatcherText value -> 45 ( { model | matcherText = value }, Cmd.none ) 46 47 PressingBackspace isPressed -> 48 ( { model | backspacePressed = isPressed }, Cmd.none ) 49 50 Noop -> 51 ( model, Cmd.none ) 52 53 54immediatelyFilter : String -> Filter -> Model -> ( Model, Cmd Msg ) 55immediatelyFilter url filter model = 56 let 57 newFilter = 58 { filter | text = Just (stringifyFilter model.matchers) } 59 in 60 ( { model | matchers = [] } 61 , Cmd.batch 62 [ Navigation.pushUrl model.key (url ++ generateQueryString newFilter) 63 , Dom.focus "filter-bar-matcher" |> Task.attempt (always Noop) 64 ] 65 ) 66 67 68setMatchers : Filter -> Model -> Model 69setMatchers filter model = 70 { model 71 | matchers = 72 filter.text 73 |> Maybe.andThen parseFilter 74 |> Maybe.withDefault [] 75 } 76