Files
docspell/modules/webapp/src/main/elm/Comp/BoxView.elm
2022-01-26 23:26:06 +01:00

248 lines
6.0 KiB
Elm

{-
Copyright 2020 Eike K. & Contributors
SPDX-License-Identifier: AGPL-3.0-or-later
-}
module Comp.BoxView exposing (..)
import Comp.BoxQueryView
import Comp.BoxStatsView
import Comp.BoxUploadView
import Data.Box exposing (Box)
import Data.BoxContent exposing (BoxContent(..), MessageData)
import Data.Flags exposing (Flags)
import Data.UiSettings exposing (UiSettings)
import Html exposing (Html, div, i, text)
import Html.Attributes exposing (class, classList)
import Markdown
import Messages.Comp.BoxView exposing (Texts)
import Styles as S
type alias Model =
{ box : Box
, content : ContentModel
, reloading : Bool
}
type ContentModel
= ContentMessage Data.BoxContent.MessageData
| ContentUpload Comp.BoxUploadView.Model
| ContentQuery Comp.BoxQueryView.Model
| ContentStats Comp.BoxStatsView.Model
type Msg
= QueryMsg Comp.BoxQueryView.Msg
| StatsMsg Comp.BoxStatsView.Msg
| UploadMsg Comp.BoxUploadView.Msg
| ReloadData
init : Flags -> Box -> ( Model, Cmd Msg )
init flags box =
let
( cm, cc ) =
contentInit flags box.content
in
( { box = box
, content = cm
, reloading = False
}
, cc
)
reloadData : Msg
reloadData =
ReloadData
contentInit : Flags -> BoxContent -> ( ContentModel, Cmd Msg )
contentInit flags content =
case content of
BoxMessage data ->
( ContentMessage data, Cmd.none )
BoxUpload data ->
let
qm =
Comp.BoxUploadView.init data
in
( ContentUpload qm, Cmd.none )
BoxQuery data ->
let
( qm, qc ) =
Comp.BoxQueryView.init flags data
in
( ContentQuery qm, Cmd.map QueryMsg qc )
BoxStats data ->
let
( sm, sc ) =
Comp.BoxStatsView.init flags data
in
( ContentStats sm, Cmd.map StatsMsg sc )
--- Update
update : Flags -> Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
update flags msg model =
case msg of
QueryMsg lm ->
case model.content of
ContentQuery qm ->
let
( cm, cc, reloading ) =
Comp.BoxQueryView.update flags lm qm
in
( { model | content = ContentQuery cm, reloading = reloading }
, Cmd.map QueryMsg cc
, Sub.none
)
_ ->
unit model
StatsMsg lm ->
case model.content of
ContentStats qm ->
let
( cm, cc, reloading ) =
Comp.BoxStatsView.update flags lm qm
in
( { model | content = ContentStats cm, reloading = reloading }
, Cmd.map StatsMsg cc
, Sub.none
)
_ ->
unit model
UploadMsg lm ->
case model.content of
ContentUpload qm ->
let
( cm, cc, cs ) =
Comp.BoxUploadView.update flags lm qm
in
( { model | content = ContentUpload cm }
, Cmd.map UploadMsg cc
, Sub.map UploadMsg cs
)
_ ->
unit model
ReloadData ->
case model.content of
ContentQuery _ ->
update flags (QueryMsg Comp.BoxQueryView.reloadData) model
ContentStats _ ->
update flags (StatsMsg Comp.BoxStatsView.reloadData) model
_ ->
unit model
unit : Model -> ( Model, Cmd Msg, Sub Msg )
unit model =
( model, Cmd.none, Sub.none )
--- View
view : Texts -> Flags -> UiSettings -> Model -> Html Msg
view texts flags settings model =
div
[ classList [ ( S.box ++ "rounded", model.box.decoration ) ]
, class (spanStyle model.box)
, class "relative h-full"
, classList [ ( "hidden", not model.box.visible ) ]
]
[ boxLoading model
, boxHeader model
, div [ class "px-2 py-1 h-5/6" ]
[ boxContent texts flags settings model
]
]
boxLoading : Model -> Html Msg
boxLoading model =
if not model.reloading then
div [ class "hidden" ] []
else
div [ class "absolute right-0 top-1 h-6 w-6" ]
[ i [ class "fa fa-spinner animate-spin" ] []
]
boxHeader : Model -> Html Msg
boxHeader model =
div
[ class "flex flex-row py-1 bg-blue-50 dark:bg-slate-700 rounded-t"
, classList [ ( "hidden", not model.box.decoration || model.box.name == "" ) ]
]
[ div [ class "flex text-lg tracking-medium italic px-2" ]
[ text model.box.name
]
]
boxContent : Texts -> Flags -> UiSettings -> Model -> Html Msg
boxContent texts flags settings model =
case model.content of
ContentMessage m ->
messageContent m
ContentUpload qm ->
Html.map UploadMsg
(Comp.BoxUploadView.view texts.uploadView flags settings qm)
ContentQuery qm ->
Html.map QueryMsg
(Comp.BoxQueryView.view texts.queryView settings qm)
ContentStats qm ->
Html.map StatsMsg
(Comp.BoxStatsView.view texts.statsView qm)
spanStyle : Box -> String
spanStyle box =
case box.colspan of
1 ->
""
2 ->
"col-span-1 md:col-span-2"
3 ->
"col-span-1 md:col-span-3"
4 ->
"col-span-1 md:col-span-4"
_ ->
"col-span-1 md:col-span-5"
messageContent : MessageData -> Html msg
messageContent data =
div [ class "markdown-preview" ]
[ Markdown.toHtml [] data.title
, Markdown.toHtml [] data.body
]