elm-frontti/src/Logviewer.elm

DOWNLOAD
module Logviewer exposing (..)

import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)
import Regex
import List.Extra
import Logs exposing (..)

import Message exposing (..)

dropMaybe: (List (Maybe a)) -> List a
dropMaybe lst =
    List.foldr (\val -> (\acc ->
                            case val of
                                Just a -> a :: acc
                                Nothing -> acc)) [] lst

log_to_list log
    = li [] [ text log.row ]

listify group 
    = let is_ungrouped = group.name == "Ungrouped"
      in 
      details []
      [ summary [ class "loggroup-summary" ] [
             span [ class "loggroup-summary-container" ]
                 [ text <| group.name ++ " (" ++ (String.fromInt (List.length group.members)) ++ ")" ++ (if group.sound_alarm then " ALERT!  " else "")
                 , if not is_ungrouped then
                       button [ onClick <| DeleteLogGroup group.name ] [ text "Delete log group" ]
                   else div [] []
                 , if not is_ungrouped then
                       label [] [ input [ type_ "checkbox"
                                        , checked group.alarmy
                                        , onClick (SetLogAlarmy group (not group.alarmy))] []
                                , text "Alarm"]
                   else
                       div [] []]]
      , ul []
          (List.map log_to_list group.members)]

parseRegex: Group -> Maybe ParsedGroup
parseRegex r =
    case Regex.fromString r.name of
        Just rr -> Just (ParsedGroup r.name rr r.alarmy r.sound_alarm r.members)
        Nothing -> Nothing

tab: List Log -> List Group -> String -> Html Msg
tab logs groups edited_group =
    let regexes = groups
                  |> List.map parseRegex
                  |> dropMaybe 
        grouped = regexes
                  |> List.map (\regex ->
                                   let members = List.filter (\l -> Regex.contains regex.regex l.row) logs
                                   in 
                                       { regex | members = members})
                  |> List.map listify
        last_group = logs
                   |> List.filter (\l -> regexes
                                      |> List.filter (\r -> Regex.contains r.regex l.row)
                                      |> (==) [])
                   |> ParsedGroup "Ungrouped" Regex.never False False 
                   |> listify 
    in 
    div []
        [ h3 [] [ text "Add a new group" ]
        , label [] [ text "Grouping regexp "
                   , input [ type_ "text"
                           , value edited_group
                           , onInput EditGroupRegexp] []]
        , button [ type_ "button"
                 , onClick <| SaveLogGroup edited_group] [ text "Add group"]
        , h3 [] [ text "Logs: "]
        , div [] grouped
        , last_group]