mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-04-05 19:09:32 +00:00
181 lines
4.4 KiB
Elm
181 lines
4.4 KiB
Elm
{-
|
|
Copyright 2020 Eike K. & Contributors
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-or-later
|
|
-}
|
|
|
|
|
|
module Comp.BookmarkQueryManage exposing (..)
|
|
|
|
import Api
|
|
import Api.Model.BasicResult exposing (BasicResult)
|
|
import Api.Model.BookmarkedQuery exposing (BookmarkedQuery)
|
|
import Comp.Basic as B
|
|
import Comp.BookmarkQueryForm
|
|
import Data.Flags exposing (Flags)
|
|
import Html exposing (Html, div, text)
|
|
import Html.Attributes exposing (class, href)
|
|
import Html.Events exposing (onClick)
|
|
import Http
|
|
import Messages.Comp.BookmarkQueryManage exposing (Texts)
|
|
import Styles as S
|
|
|
|
|
|
type alias Model =
|
|
{ formModel : Comp.BookmarkQueryForm.Model
|
|
, loading : Bool
|
|
, formState : FormState
|
|
}
|
|
|
|
|
|
type FormState
|
|
= FormStateNone
|
|
| FormStateError Http.Error
|
|
| FormStateSaveError String
|
|
| FormStateInvalid
|
|
| FormStateSaved
|
|
|
|
|
|
init : String -> ( Model, Cmd Msg )
|
|
init query =
|
|
let
|
|
( fm, fc ) =
|
|
Comp.BookmarkQueryForm.initQuery query
|
|
in
|
|
( { formModel = fm
|
|
, loading = False
|
|
, formState = FormStateNone
|
|
}
|
|
, Cmd.map FormMsg fc
|
|
)
|
|
|
|
|
|
type Msg
|
|
= Submit
|
|
| Cancel
|
|
| FormMsg Comp.BookmarkQueryForm.Msg
|
|
| SaveResp (Result Http.Error BasicResult)
|
|
|
|
|
|
|
|
--- Update
|
|
|
|
|
|
type FormResult
|
|
= Submitted BookmarkedQuery
|
|
| Cancelled
|
|
| Done
|
|
| None
|
|
|
|
|
|
type alias UpdateResult =
|
|
{ model : Model
|
|
, cmd : Cmd Msg
|
|
, sub : Sub Msg
|
|
, outcome : FormResult
|
|
}
|
|
|
|
|
|
update : Flags -> Msg -> Model -> UpdateResult
|
|
update flags msg model =
|
|
let
|
|
empty =
|
|
{ model = model
|
|
, cmd = Cmd.none
|
|
, sub = Sub.none
|
|
, outcome = None
|
|
}
|
|
in
|
|
case msg of
|
|
FormMsg lm ->
|
|
let
|
|
( fm, fc, fs ) =
|
|
Comp.BookmarkQueryForm.update flags lm model.formModel
|
|
in
|
|
{ model = { model | formModel = fm }
|
|
, cmd = Cmd.map FormMsg fc
|
|
, sub = Sub.map FormMsg fs
|
|
, outcome = None
|
|
}
|
|
|
|
Submit ->
|
|
case Comp.BookmarkQueryForm.get model.formModel of
|
|
Just data ->
|
|
{ empty | cmd = save flags data, outcome = Submitted data, model = { model | loading = True } }
|
|
|
|
Nothing ->
|
|
{ empty | model = { model | formState = FormStateInvalid } }
|
|
|
|
Cancel ->
|
|
{ model = model
|
|
, cmd = Cmd.none
|
|
, sub = Sub.none
|
|
, outcome = Cancelled
|
|
}
|
|
|
|
SaveResp (Ok res) ->
|
|
if res.success then
|
|
{ empty | model = { model | loading = False, formState = FormStateSaved }, outcome = Done }
|
|
|
|
else
|
|
{ empty | model = { model | loading = False, formState = FormStateSaveError res.message } }
|
|
|
|
SaveResp (Err err) ->
|
|
{ empty | model = { model | loading = False, formState = FormStateError err } }
|
|
|
|
|
|
save : Flags -> BookmarkedQuery -> Cmd Msg
|
|
save flags model =
|
|
Api.addBookmark flags model SaveResp
|
|
|
|
|
|
|
|
--- View
|
|
|
|
|
|
view : Texts -> Model -> Html Msg
|
|
view texts model =
|
|
div [ class "relative" ]
|
|
[ B.loadingDimmer { label = "", active = model.loading }
|
|
, Html.map FormMsg (Comp.BookmarkQueryForm.view texts.form model.formModel)
|
|
, case model.formState of
|
|
FormStateNone ->
|
|
div [ class "hidden" ] []
|
|
|
|
FormStateError err ->
|
|
div [ class S.errorMessage ]
|
|
[ text <| texts.httpError err
|
|
]
|
|
|
|
FormStateInvalid ->
|
|
div [ class S.errorMessage ]
|
|
[ text texts.formInvalid
|
|
]
|
|
|
|
FormStateSaveError m ->
|
|
div [ class S.errorMessage ]
|
|
[ text m
|
|
]
|
|
|
|
FormStateSaved ->
|
|
div [ class S.successMessage ]
|
|
[ text texts.saved
|
|
]
|
|
, div [ class "flex flex-row space-x-2 py-2" ]
|
|
[ B.primaryButton
|
|
{ label = texts.basics.submit
|
|
, icon = "fa fa-save"
|
|
, disabled = False
|
|
, handler = onClick Submit
|
|
, attrs = [ href "#" ]
|
|
}
|
|
, B.secondaryButton
|
|
{ label = texts.basics.cancel
|
|
, icon = "fa fa-times"
|
|
, disabled = False
|
|
, handler = onClick Cancel
|
|
, attrs = [ href "#" ]
|
|
}
|
|
]
|
|
]
|