mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-10-16 12:51:52 +00:00
248 lines
6.0 KiB
Elm
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
|
|
]
|