Files
docspell/modules/webapp/src/main/elm/Comp/PeriodicQueryTaskManage.elm
eikek 4ffc8d1f14 Add support for more generic notification
This is a start to have different kinds of notifications. It is
possible to be notified via e-mail, matrix or gotify. It also extends
the current "periodic query" for due items by allowing notification
over different channels. A "generic periodic query" variant is added
as well.
2021-12-11 18:57:32 +01:00

325 lines
9.6 KiB
Elm

{-
Copyright 2020 Eike K. & Contributors
SPDX-License-Identifier: AGPL-3.0-or-later
-}
module Comp.PeriodicQueryTaskManage exposing
( Model
, Msg
, init
, update
, view
)
import Api
import Api.Model.BasicResult exposing (BasicResult)
import Comp.ChannelMenu
import Comp.MenuBar as MB
import Comp.PeriodicQueryTaskForm
import Comp.PeriodicQueryTaskList
import Data.ChannelType exposing (ChannelType)
import Data.Flags exposing (Flags)
import Data.PeriodicQuerySettings exposing (PeriodicQuerySettings)
import Data.UiSettings exposing (UiSettings)
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (onClick)
import Http
import Messages.Comp.PeriodicQueryTaskManage exposing (Texts)
import Styles as S
type alias Model =
{ listModel : Comp.PeriodicQueryTaskList.Model
, detailModel : Maybe Comp.PeriodicQueryTaskForm.Model
, items : List PeriodicQuerySettings
, formState : FormState
, channelMenuOpen : Bool
}
type SubmitType
= SubmitDelete
| SubmitUpdate
| SubmitCreate
| SubmitStartOnce
type FormState
= FormStateInitial
| FormHttpError Http.Error
| FormSubmitSuccessful SubmitType
| FormSubmitFailed String
type Msg
= ListMsg Comp.PeriodicQueryTaskList.Msg
| DetailMsg Comp.PeriodicQueryTaskForm.Msg
| GetDataResp (Result Http.Error (List PeriodicQuerySettings))
| NewTaskInit ChannelType
| SubmitResp SubmitType (Result Http.Error BasicResult)
| ToggleChannelMenu
initModel : Model
initModel =
{ listModel = Comp.PeriodicQueryTaskList.init
, detailModel = Nothing
, items = []
, formState = FormStateInitial
, channelMenuOpen = False
}
initCmd : Flags -> Cmd Msg
initCmd flags =
Api.getPeriodicQuery flags GetDataResp
init : Flags -> ( Model, Cmd Msg )
init flags =
( initModel, initCmd flags )
--- Update
update : Flags -> Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
update flags msg model =
case msg of
GetDataResp (Ok items) ->
( { model
| items = items
, formState = FormStateInitial
}
, Cmd.none
, Sub.none
)
GetDataResp (Err err) ->
( { model | formState = FormHttpError err }
, Cmd.none
, Sub.none
)
ListMsg lm ->
let
( mm, action ) =
Comp.PeriodicQueryTaskList.update lm model.listModel
( detail, cmd ) =
case action of
Comp.PeriodicQueryTaskList.NoAction ->
( Nothing, Cmd.none )
Comp.PeriodicQueryTaskList.EditAction settings ->
let
( dm, dc ) =
Comp.PeriodicQueryTaskForm.initWith flags settings
in
( Just dm, Cmd.map DetailMsg dc )
in
( { model
| listModel = mm
, detailModel = detail
}
, cmd
, Sub.none
)
DetailMsg lm ->
case model.detailModel of
Just dm ->
let
--( mm, action, mc ) =
result =
Comp.PeriodicQueryTaskForm.update flags lm dm
( model_, cmd_ ) =
case result.action of
Comp.PeriodicQueryTaskForm.NoAction ->
( { model
| detailModel = Just result.model
, formState = FormStateInitial
}
, Cmd.none
)
Comp.PeriodicQueryTaskForm.SubmitAction settings ->
( { model
| detailModel = Just result.model
, formState = FormStateInitial
}
, if settings.id == "" then
Api.createPeriodicQuery flags settings (SubmitResp SubmitCreate)
else
Api.updatePeriodicQuery flags settings (SubmitResp SubmitUpdate)
)
Comp.PeriodicQueryTaskForm.CancelAction ->
( { model
| detailModel = Nothing
, formState = FormStateInitial
}
, initCmd flags
)
Comp.PeriodicQueryTaskForm.StartOnceAction settings ->
( { model
| detailModel = Just result.model
, formState = FormStateInitial
}
, Api.startOncePeriodicQuery flags settings (SubmitResp SubmitStartOnce)
)
Comp.PeriodicQueryTaskForm.DeleteAction id ->
( { model
| detailModel = Just result.model
, formState = FormStateInitial
}
, Api.deletePeriodicQueryTask flags id (SubmitResp SubmitDelete)
)
in
( model_
, Cmd.batch
[ Cmd.map DetailMsg result.cmd
, cmd_
]
, Sub.map DetailMsg result.sub
)
Nothing ->
( model, Cmd.none, Sub.none )
NewTaskInit ct ->
let
( mm, mc ) =
Comp.PeriodicQueryTaskForm.init flags ct
in
( { model | detailModel = Just mm, channelMenuOpen = False }, Cmd.map DetailMsg mc, Sub.none )
SubmitResp submitType (Ok res) ->
( { model
| formState =
if res.success then
FormSubmitSuccessful submitType
else
FormSubmitFailed res.message
, detailModel =
if submitType == SubmitDelete then
Nothing
else
model.detailModel
}
, if submitType == SubmitDelete then
initCmd flags
else
Cmd.none
, Sub.none
)
SubmitResp _ (Err err) ->
( { model | formState = FormHttpError err }
, Cmd.none
, Sub.none
)
ToggleChannelMenu ->
( { model | channelMenuOpen = not model.channelMenuOpen }, Cmd.none, Sub.none )
--- View2
view : Texts -> UiSettings -> Model -> Html Msg
view texts settings model =
div [ class "flex flex-col" ]
(div
[ classList
[ ( S.errorMessage, model.formState /= FormStateInitial )
, ( S.successMessage, isSuccess model.formState )
, ( "hidden", model.formState == FormStateInitial )
]
, class "mb-2"
]
[ case model.formState of
FormStateInitial ->
text ""
FormSubmitSuccessful SubmitCreate ->
text texts.taskCreated
FormSubmitSuccessful SubmitUpdate ->
text texts.taskUpdated
FormSubmitSuccessful SubmitStartOnce ->
text texts.taskStarted
FormSubmitSuccessful SubmitDelete ->
text texts.taskDeleted
FormSubmitFailed m ->
text m
FormHttpError err ->
text (texts.httpError err)
]
:: (case model.detailModel of
Just msett ->
viewForm2 texts settings msett
Nothing ->
viewList2 texts model
)
)
isSuccess : FormState -> Bool
isSuccess state =
case state of
FormSubmitSuccessful _ ->
True
_ ->
False
viewForm2 : Texts -> UiSettings -> Comp.PeriodicQueryTaskForm.Model -> List (Html Msg)
viewForm2 texts settings model =
[ Html.map DetailMsg
(Comp.PeriodicQueryTaskForm.view texts.notificationForm "flex flex-col" settings model)
]
viewList2 : Texts -> Model -> List (Html Msg)
viewList2 texts model =
let
menuModel =
{ menuOpen = model.channelMenuOpen
, toggleMenu = ToggleChannelMenu
, menuLabel = texts.newTask
, onItem = NewTaskInit
}
in
[ MB.view
{ start = []
, end =
[ Comp.ChannelMenu.channelMenu texts.channelType menuModel
]
, rootClasses = "mb-4"
}
, Html.map ListMsg
(Comp.PeriodicQueryTaskList.view2 texts.notificationTable
model.listModel
model.items
)
]