mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-04-11 12:19:33 +00:00
To have access to the translated content, the messages must be given to the update function. There is no way to set the values in the view.
349 lines
8.7 KiB
Elm
349 lines
8.7 KiB
Elm
{-
|
|
Copyright 2020 Eike K. & Contributors
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-or-later
|
|
-}
|
|
|
|
|
|
module Comp.PublishItems exposing
|
|
( Model
|
|
, Msg
|
|
, Outcome(..)
|
|
, init
|
|
, initQuery
|
|
, update
|
|
, view
|
|
)
|
|
|
|
import Api
|
|
import Api.Model.IdResult exposing (IdResult)
|
|
import Api.Model.ShareDetail exposing (ShareDetail)
|
|
import Comp.Basic as B
|
|
import Comp.MenuBar as MB
|
|
import Comp.ShareForm
|
|
import Comp.ShareMail
|
|
import Comp.ShareView
|
|
import Data.Flags exposing (Flags)
|
|
import Data.Icons as Icons
|
|
import Data.ItemQuery exposing (ItemQuery)
|
|
import Data.UiSettings exposing (UiSettings)
|
|
import Html exposing (..)
|
|
import Html.Attributes exposing (..)
|
|
import Http
|
|
import Messages.Comp.PublishItems exposing (Texts)
|
|
import Ports
|
|
import Styles as S
|
|
|
|
|
|
|
|
--- Model
|
|
|
|
|
|
type ViewMode
|
|
= ViewModeEdit
|
|
| ViewModeInfo ShareDetail
|
|
|
|
|
|
type FormError
|
|
= FormErrorNone
|
|
| FormErrorHttp Http.Error
|
|
| FormErrorInvalid
|
|
| FormErrorSubmit String
|
|
|
|
|
|
type alias Model =
|
|
{ formModel : Comp.ShareForm.Model
|
|
, mailModel : Comp.ShareMail.Model
|
|
, viewMode : ViewMode
|
|
, formError : FormError
|
|
, loading : Bool
|
|
}
|
|
|
|
|
|
init : Flags -> ( Model, Cmd Msg )
|
|
init flags =
|
|
let
|
|
( fm, fc ) =
|
|
Comp.ShareForm.init
|
|
|
|
( mm, mc ) =
|
|
Comp.ShareMail.init flags
|
|
in
|
|
( { formModel = fm
|
|
, mailModel = mm
|
|
, viewMode = ViewModeEdit
|
|
, formError = FormErrorNone
|
|
, loading = False
|
|
}
|
|
, Cmd.batch
|
|
[ Cmd.map FormMsg fc
|
|
, Cmd.map MailMsg mc
|
|
]
|
|
)
|
|
|
|
|
|
initQuery : Flags -> ItemQuery -> ( Model, Cmd Msg )
|
|
initQuery flags query =
|
|
let
|
|
( fm, fc ) =
|
|
Comp.ShareForm.initQuery (Data.ItemQuery.render query)
|
|
|
|
( mm, mc ) =
|
|
Comp.ShareMail.init flags
|
|
in
|
|
( { formModel = fm
|
|
, mailModel = mm
|
|
, viewMode = ViewModeEdit
|
|
, formError = FormErrorNone
|
|
, loading = False
|
|
}
|
|
, Cmd.batch
|
|
[ Cmd.map FormMsg fc
|
|
, Cmd.map MailMsg mc
|
|
]
|
|
)
|
|
|
|
|
|
|
|
--- Update
|
|
|
|
|
|
type Msg
|
|
= FormMsg Comp.ShareForm.Msg
|
|
| MailMsg Comp.ShareMail.Msg
|
|
| CancelPublish
|
|
| SubmitPublish
|
|
| PublishResp (Result Http.Error IdResult)
|
|
| GetShareResp (Result Http.Error ShareDetail)
|
|
|
|
|
|
type Outcome
|
|
= OutcomeDone
|
|
| OutcomeInProgress
|
|
|
|
|
|
type alias UpdateResult =
|
|
{ model : Model
|
|
, cmd : Cmd Msg
|
|
, sub : Sub Msg
|
|
, outcome : Outcome
|
|
}
|
|
|
|
|
|
update : Texts -> Flags -> Msg -> Model -> UpdateResult
|
|
update texts flags msg model =
|
|
case msg of
|
|
CancelPublish ->
|
|
{ model = model
|
|
, cmd = Cmd.none
|
|
, sub = Sub.none
|
|
, outcome = OutcomeDone
|
|
}
|
|
|
|
FormMsg lm ->
|
|
let
|
|
( fm, fc, fs ) =
|
|
Comp.ShareForm.update flags lm model.formModel
|
|
in
|
|
{ model = { model | formModel = fm }
|
|
, cmd = Cmd.map FormMsg fc
|
|
, sub = Sub.map FormMsg fs
|
|
, outcome = OutcomeInProgress
|
|
}
|
|
|
|
MailMsg lm ->
|
|
let
|
|
( mm, mc ) =
|
|
Comp.ShareMail.update texts.shareMail flags lm model.mailModel
|
|
in
|
|
{ model = { model | mailModel = mm }
|
|
, cmd = Cmd.map MailMsg mc
|
|
, sub = Sub.none
|
|
, outcome = OutcomeInProgress
|
|
}
|
|
|
|
SubmitPublish ->
|
|
case Comp.ShareForm.getShare model.formModel of
|
|
Just ( _, data ) ->
|
|
{ model = { model | loading = True }
|
|
, cmd = Api.addShare flags data PublishResp
|
|
, sub = Sub.none
|
|
, outcome = OutcomeInProgress
|
|
}
|
|
|
|
Nothing ->
|
|
{ model = { model | formError = FormErrorInvalid }
|
|
, cmd = Cmd.none
|
|
, sub = Sub.none
|
|
, outcome = OutcomeInProgress
|
|
}
|
|
|
|
PublishResp (Ok res) ->
|
|
if res.success then
|
|
{ model = model
|
|
, cmd = Api.getShare flags res.id GetShareResp
|
|
, sub = Sub.none
|
|
, outcome = OutcomeInProgress
|
|
}
|
|
|
|
else
|
|
{ model = { model | formError = FormErrorSubmit res.message, loading = False }
|
|
, cmd = Cmd.none
|
|
, sub = Sub.none
|
|
, outcome = OutcomeInProgress
|
|
}
|
|
|
|
PublishResp (Err err) ->
|
|
{ model = { model | formError = FormErrorHttp err, loading = False }
|
|
, cmd = Cmd.none
|
|
, sub = Sub.none
|
|
, outcome = OutcomeInProgress
|
|
}
|
|
|
|
GetShareResp (Ok share) ->
|
|
let
|
|
( mm, mc ) =
|
|
Comp.ShareMail.update texts.shareMail flags (Comp.ShareMail.setMailInfo share) model.mailModel
|
|
in
|
|
{ model =
|
|
{ model
|
|
| formError = FormErrorNone
|
|
, loading = False
|
|
, viewMode = ViewModeInfo share
|
|
, mailModel = mm
|
|
}
|
|
, cmd =
|
|
Cmd.batch
|
|
[ Ports.initClipboard (Comp.ShareView.clipboardData share)
|
|
, Cmd.map MailMsg mc
|
|
]
|
|
, sub = Sub.none
|
|
, outcome = OutcomeInProgress
|
|
}
|
|
|
|
GetShareResp (Err err) ->
|
|
{ model = { model | formError = FormErrorHttp err, loading = False }
|
|
, cmd = Cmd.none
|
|
, sub = Sub.none
|
|
, outcome = OutcomeInProgress
|
|
}
|
|
|
|
|
|
|
|
--- View
|
|
|
|
|
|
view : Texts -> UiSettings -> Flags -> Model -> Html Msg
|
|
view texts settings flags model =
|
|
div []
|
|
[ B.loadingDimmer
|
|
{ active = model.loading
|
|
, label = ""
|
|
}
|
|
, case model.viewMode of
|
|
ViewModeEdit ->
|
|
viewForm texts model
|
|
|
|
ViewModeInfo share ->
|
|
viewInfo texts settings flags model share
|
|
]
|
|
|
|
|
|
viewInfo : Texts -> UiSettings -> Flags -> Model -> ShareDetail -> Html Msg
|
|
viewInfo texts settings flags model share =
|
|
let
|
|
cfg =
|
|
{ mainClasses = ""
|
|
, showAccessData = False
|
|
}
|
|
in
|
|
div [ class "px-2 mb-4" ]
|
|
[ h1 [ class S.header1 ]
|
|
[ text texts.title
|
|
]
|
|
, div
|
|
[ class S.infoMessage
|
|
]
|
|
[ text texts.infoText
|
|
]
|
|
, MB.view <|
|
|
{ start =
|
|
[ MB.SecondaryButton
|
|
{ tagger = CancelPublish
|
|
, title = texts.cancelPublishTitle
|
|
, icon = Just "fa fa-arrow-left"
|
|
, label = texts.doneLabel
|
|
}
|
|
]
|
|
, end = []
|
|
, rootClasses = "my-4"
|
|
}
|
|
, div []
|
|
[ Comp.ShareView.view cfg texts.shareView flags share
|
|
]
|
|
, div [ class "flex flex-col mt-6" ]
|
|
[ div
|
|
[ class S.header2
|
|
]
|
|
[ text texts.sendViaMail
|
|
]
|
|
, Html.map MailMsg
|
|
(Comp.ShareMail.view texts.shareMail flags settings model.mailModel)
|
|
]
|
|
]
|
|
|
|
|
|
viewForm : Texts -> Model -> Html Msg
|
|
viewForm texts model =
|
|
div [ class "px-2 mb-4" ]
|
|
[ h1 [ class S.header1 ]
|
|
[ text texts.title
|
|
]
|
|
, div
|
|
[ class S.infoMessage
|
|
]
|
|
[ text texts.infoText
|
|
]
|
|
, MB.view <|
|
|
{ start =
|
|
[ MB.PrimaryButton
|
|
{ tagger = SubmitPublish
|
|
, title = texts.submitPublishTitle
|
|
, icon = Just Icons.share
|
|
, label = texts.submitPublish
|
|
}
|
|
, MB.SecondaryButton
|
|
{ tagger = CancelPublish
|
|
, title = texts.cancelPublishTitle
|
|
, icon = Just "fa fa-times"
|
|
, label = texts.cancelPublish
|
|
}
|
|
]
|
|
, end = []
|
|
, rootClasses = "my-4"
|
|
}
|
|
, div []
|
|
[ Html.map FormMsg (Comp.ShareForm.view texts.shareForm model.formModel)
|
|
]
|
|
, div
|
|
[ classList
|
|
[ ( "hidden", model.formError == FormErrorNone )
|
|
]
|
|
, class "my-2"
|
|
, class S.errorMessage
|
|
]
|
|
[ case model.formError of
|
|
FormErrorNone ->
|
|
text ""
|
|
|
|
FormErrorHttp err ->
|
|
text (texts.httpError err)
|
|
|
|
FormErrorInvalid ->
|
|
text texts.correctFormErrors
|
|
|
|
FormErrorSubmit m ->
|
|
text m
|
|
]
|
|
]
|