docspell/modules/webapp/src/main/elm/Comp/CustomFieldManage.elm
2020-11-22 21:41:09 +01:00

195 lines
5.0 KiB
Elm

module Comp.CustomFieldManage exposing
( Model
, Msg
, empty
, init
, update
, view
)
import Api
import Api.Model.CustomField exposing (CustomField)
import Api.Model.CustomFieldList exposing (CustomFieldList)
import Comp.CustomFieldForm
import Comp.CustomFieldTable
import Data.Flags exposing (Flags)
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (onClick, onInput)
import Http
type alias Model =
{ tableModel : Comp.CustomFieldTable.Model
, detailModel : Maybe Comp.CustomFieldForm.Model
, fields : List CustomField
, query : String
, loading : Bool
}
type Msg
= TableMsg Comp.CustomFieldTable.Msg
| DetailMsg Comp.CustomFieldForm.Msg
| CustomFieldListResp (Result Http.Error CustomFieldList)
| SetQuery String
| InitNewCustomField
empty : Model
empty =
{ tableModel = Comp.CustomFieldTable.init
, detailModel = Nothing
, fields = []
, query = ""
, loading = False
}
init : Flags -> ( Model, Cmd Msg )
init flags =
( empty
, Api.getCustomFields flags empty.query CustomFieldListResp
)
--- Update
update : Flags -> Msg -> Model -> ( Model, Cmd Msg )
update flags msg model =
case msg of
TableMsg lm ->
let
( tm, action ) =
Comp.CustomFieldTable.update lm model.tableModel
detail =
case action of
Comp.CustomFieldTable.EditAction item ->
Comp.CustomFieldForm.init item |> Just
Comp.CustomFieldTable.NoAction ->
model.detailModel
in
( { model | tableModel = tm, detailModel = detail }, Cmd.none )
DetailMsg lm ->
case model.detailModel of
Just detail ->
let
( dm, dc, back ) =
Comp.CustomFieldForm.update flags lm detail
cmd =
if back then
Api.getCustomFields flags model.query CustomFieldListResp
else
Cmd.none
in
( { model
| detailModel =
if back then
Nothing
else
Just dm
}
, Cmd.batch
[ Cmd.map DetailMsg dc
, cmd
]
)
Nothing ->
( model, Cmd.none )
SetQuery str ->
( { model | query = str }
, Api.getCustomFields flags str CustomFieldListResp
)
CustomFieldListResp (Ok sl) ->
( { model | fields = sl.items }, Cmd.none )
CustomFieldListResp (Err _) ->
( model, Cmd.none )
InitNewCustomField ->
let
sd =
Comp.CustomFieldForm.initEmpty
in
( { model | detailModel = Just sd }
, Cmd.none
)
--- View
view : Flags -> Model -> Html Msg
view flags model =
case model.detailModel of
Just dm ->
viewDetail flags dm
Nothing ->
viewTable model
viewDetail : Flags -> Comp.CustomFieldForm.Model -> Html Msg
viewDetail flags detailModel =
let
viewSettings =
Comp.CustomFieldForm.fullViewSettings
in
div []
[ Html.map DetailMsg (Comp.CustomFieldForm.view viewSettings detailModel)
]
viewTable : Model -> Html Msg
viewTable model =
div []
[ div [ class "ui secondary menu" ]
[ div [ class "horizontally fitted item" ]
[ div [ class "ui icon input" ]
[ input
[ type_ "text"
, onInput SetQuery
, value model.query
, placeholder "Search"
]
[]
, i [ class "ui search icon" ]
[]
]
]
, div [ class "right menu" ]
[ div [ class "item" ]
[ a
[ class "ui primary button"
, href "#"
, onClick InitNewCustomField
]
[ i [ class "plus icon" ] []
, text "New CustomField"
]
]
]
]
, Html.map TableMsg (Comp.CustomFieldTable.view model.tableModel model.fields)
, div
[ classList
[ ( "ui dimmer", True )
, ( "active", model.loading )
]
]
[ div [ class "ui loader" ] []
]
]