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