mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-06-23 10:58:26 +00:00
It's more convenient to manage notification channels separately, as it is done with email settings. Notification hook and other forms are adopted to only select channels. Hooks can now use more than one channel.
189 lines
4.5 KiB
Elm
189 lines
4.5 KiB
Elm
{-
|
|
Copyright 2020 Eike K. & Contributors
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-or-later
|
|
-}
|
|
|
|
|
|
module Comp.EventSample exposing (Model, Msg, init, initWith, update, viewJson, viewMessage)
|
|
|
|
import Api
|
|
import Comp.FixedDropdown
|
|
import Data.DropdownStyle as DS
|
|
import Data.EventType exposing (EventType)
|
|
import Data.Flags exposing (Flags)
|
|
import Html exposing (..)
|
|
import Html.Attributes exposing (..)
|
|
import Http
|
|
import Json.Decode as D
|
|
import Json.Print
|
|
import Markdown
|
|
import Messages.Comp.EventSample exposing (Texts)
|
|
|
|
|
|
type alias Model =
|
|
{ eventTypeDropdown : Comp.FixedDropdown.Model EventType
|
|
, selectedEventType : Maybe EventType
|
|
, content : String
|
|
}
|
|
|
|
|
|
init : Model
|
|
init =
|
|
{ eventTypeDropdown = Comp.FixedDropdown.init Data.EventType.all
|
|
, selectedEventType = Nothing
|
|
, content = ""
|
|
}
|
|
|
|
|
|
initWith : Flags -> EventType -> ( Model, Cmd Msg )
|
|
initWith flags evt =
|
|
( { init | selectedEventType = Just evt }
|
|
, Api.sampleEvent flags evt SampleEvent
|
|
)
|
|
|
|
|
|
type Msg
|
|
= EventTypeMsg (Comp.FixedDropdown.Msg EventType)
|
|
| SampleEvent (Result Http.Error String)
|
|
|
|
|
|
|
|
--- Update
|
|
|
|
|
|
update : Flags -> Msg -> Model -> ( Model, Cmd Msg )
|
|
update flags msg model =
|
|
case msg of
|
|
EventTypeMsg lm ->
|
|
let
|
|
( evm, evt ) =
|
|
Comp.FixedDropdown.update lm model.eventTypeDropdown
|
|
|
|
sampleCmd =
|
|
case evt of
|
|
Just ev ->
|
|
Api.sampleEvent flags ev SampleEvent
|
|
|
|
Nothing ->
|
|
Cmd.none
|
|
in
|
|
( { model
|
|
| eventTypeDropdown = evm
|
|
, selectedEventType = evt
|
|
}
|
|
, sampleCmd
|
|
)
|
|
|
|
SampleEvent (Ok str) ->
|
|
( { model | content = str }, Cmd.none )
|
|
|
|
SampleEvent (Err err) ->
|
|
( model, Cmd.none )
|
|
|
|
|
|
|
|
--- View
|
|
|
|
|
|
styleBase : String
|
|
styleBase =
|
|
"bg-gray-100 dark:bg-slate-900 text-gray-900 dark:text-gray-100 text-sm leading-5"
|
|
|
|
|
|
stylePayload : String
|
|
stylePayload =
|
|
"px-2 font-mono overflow-auto max-h-96 h-full whitespace-pre"
|
|
|
|
|
|
styleMessage : String
|
|
styleMessage =
|
|
"-my-2 "
|
|
|
|
|
|
jsonPrettyCfg =
|
|
{ indent = 2
|
|
, columns = 80
|
|
}
|
|
|
|
|
|
dropdownCfg texts =
|
|
{ display = texts.eventType >> .name
|
|
, icon = \_ -> Nothing
|
|
, selectPlaceholder = texts.selectEvent
|
|
, style = DS.mainStyleWith "w-48"
|
|
}
|
|
|
|
|
|
viewJson : Texts -> Bool -> Model -> Html Msg
|
|
viewJson texts enableEventChooser model =
|
|
let
|
|
json =
|
|
Result.withDefault ""
|
|
(Json.Print.prettyString jsonPrettyCfg model.content)
|
|
in
|
|
div
|
|
[ class "flex flex-col w-full relative"
|
|
]
|
|
[ div
|
|
[ class "flex inline-flex items-center absolute top-2 right-4"
|
|
, classList [ ( "hidden", not enableEventChooser ) ]
|
|
]
|
|
[ Html.map EventTypeMsg
|
|
(Comp.FixedDropdown.viewStyled2 (dropdownCfg texts)
|
|
False
|
|
model.selectedEventType
|
|
model.eventTypeDropdown
|
|
)
|
|
]
|
|
, div
|
|
[ class "flex pt-5"
|
|
, class styleBase
|
|
, class stylePayload
|
|
, classList [ ( "hidden", json == "" ) ]
|
|
]
|
|
[ text json
|
|
]
|
|
]
|
|
|
|
|
|
viewMessage : Texts -> Bool -> Model -> Html Msg
|
|
viewMessage texts enableEventChooser model =
|
|
let
|
|
titleDecoder =
|
|
D.at [ "message", "title" ] D.string
|
|
|
|
bodyDecoder =
|
|
D.at [ "message", "body" ] D.string
|
|
|
|
title =
|
|
D.decodeString titleDecoder model.content
|
|
|
|
body =
|
|
D.decodeString bodyDecoder model.content
|
|
in
|
|
div
|
|
[ class "flex flex-col w-full relative"
|
|
]
|
|
[ div
|
|
[ class "flex inline-flex items-center absolute top-2 right-4"
|
|
, classList [ ( "hidden", not enableEventChooser ) ]
|
|
]
|
|
[ Html.map EventTypeMsg
|
|
(Comp.FixedDropdown.viewStyled2 (dropdownCfg texts)
|
|
False
|
|
model.selectedEventType
|
|
model.eventTypeDropdown
|
|
)
|
|
]
|
|
, div
|
|
[ class "flex flex-col py-5 px-2 markdown-preview"
|
|
, class styleBase
|
|
]
|
|
[ Markdown.toHtml [ class styleMessage ]
|
|
(Result.withDefault "" title)
|
|
, Markdown.toHtml [ class styleMessage ]
|
|
(Result.withDefault "" body)
|
|
]
|
|
]
|