1module Views.SilenceList.Views exposing (filterSilencesByState, groupSilencesByState, silencesView, states, tabView, tabsView, view) 2 3import Data.GettableSilence exposing (GettableSilence) 4import Data.SilenceStatus exposing (State(..)) 5import Html exposing (..) 6import Html.Attributes exposing (..) 7import Html.Keyed 8import Html.Lazy exposing (lazy, lazy2, lazy3) 9import Silences.Types exposing (stateToString) 10import Types exposing (Msg(..)) 11import Utils.String as StringUtils 12import Utils.Types exposing (ApiData(..), Matcher) 13import Utils.Views exposing (buttonLink, checkbox, error, formField, formInput, iconButtonMsg, loading, textField) 14import Views.FilterBar.Views as FilterBar 15import Views.SilenceList.SilenceView 16import Views.SilenceList.Types exposing (Model, SilenceListMsg(..), SilenceTab) 17 18 19view : Model -> Html Msg 20view { filterBar, tab, silences, showConfirmationDialog } = 21 div [] 22 [ div [ class "mb-4" ] 23 [ label [ class "mb-2", for "filter-bar-matcher" ] [ text "Filter" ] 24 , Html.map (MsgForFilterBar >> MsgForSilenceList) (FilterBar.view filterBar) 25 ] 26 , lazy2 tabsView tab silences 27 , lazy3 silencesView showConfirmationDialog tab silences 28 ] 29 30 31tabsView : State -> ApiData (List SilenceTab) -> Html Msg 32tabsView currentTab tabs = 33 case tabs of 34 Success silencesTabs -> 35 List.map (\{ tab, count } -> tabView currentTab count tab) silencesTabs 36 |> ul [ class "nav nav-tabs mb-4" ] 37 38 _ -> 39 List.map (tabView currentTab 0) states 40 |> ul [ class "nav nav-tabs mb-4" ] 41 42 43tabView : State -> Int -> State -> Html Msg 44tabView currentTab count tab = 45 Utils.Views.tab tab currentTab (SetTab >> MsgForSilenceList) <| 46 case count of 47 0 -> 48 [ text (StringUtils.capitalizeFirst (stateToString tab)) ] 49 50 n -> 51 [ text (StringUtils.capitalizeFirst (stateToString tab)) 52 , span 53 [ class "badge badge-pillow badge-default align-text-top ml-2" ] 54 [ text (String.fromInt n) ] 55 ] 56 57 58silencesView : Maybe String -> State -> ApiData (List SilenceTab) -> Html Msg 59silencesView showConfirmationDialog tab silencesTab = 60 case silencesTab of 61 Success tabs -> 62 tabs 63 |> List.filter (.tab >> (==) tab) 64 |> List.head 65 |> Maybe.map .silences 66 |> Maybe.withDefault [] 67 |> (\silences -> 68 if List.isEmpty silences then 69 Utils.Views.error "No silences found" 70 71 else 72 Html.Keyed.ul [ class "list-group" ] 73 (List.map 74 (\silence -> 75 ( silence.id 76 , Views.SilenceList.SilenceView.view 77 (showConfirmationDialog == Just silence.id) 78 silence 79 ) 80 ) 81 silences 82 ) 83 ) 84 85 Failure msg -> 86 error msg 87 88 _ -> 89 loading 90 91 92groupSilencesByState : List GettableSilence -> List ( State, List GettableSilence ) 93groupSilencesByState silences = 94 List.map (\state -> ( state, filterSilencesByState state silences )) states 95 96 97states : List State 98states = 99 [ Active, Pending, Expired ] 100 101 102filterSilencesByState : State -> List GettableSilence -> List GettableSilence 103filterSilencesByState state = 104 List.filter (filterSilenceByState state) 105 106 107filterSilenceByState : State -> GettableSilence -> Bool 108filterSilenceByState state silence = 109 silence.status.state == state 110