mirror of
				https://github.com/TheAnachronism/docspell.git
				synced 2025-11-03 18:00:11 +00:00 
			
		
		
		
	Throttle customfield update requests
This commit is contained in:
		@@ -175,7 +175,6 @@ type alias UpdateResult =
 | 
			
		||||
    { model : Model
 | 
			
		||||
    , cmd : Cmd Msg
 | 
			
		||||
    , result : FieldResult
 | 
			
		||||
    , subs : Sub Msg
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -219,7 +218,7 @@ update msg model =
 | 
			
		||||
                model_ =
 | 
			
		||||
                    { model | fieldModel = TextField (Just str) }
 | 
			
		||||
            in
 | 
			
		||||
            UpdateResult model_ Cmd.none (Value str) Sub.none
 | 
			
		||||
            UpdateResult model_ Cmd.none (Value str)
 | 
			
		||||
 | 
			
		||||
        ( NumberMsg str, NumberField _ ) ->
 | 
			
		||||
            let
 | 
			
		||||
@@ -229,7 +228,7 @@ update msg model =
 | 
			
		||||
                model_ =
 | 
			
		||||
                    { model | fieldModel = NumberField fm }
 | 
			
		||||
            in
 | 
			
		||||
            UpdateResult model_ Cmd.none res Sub.none
 | 
			
		||||
            UpdateResult model_ Cmd.none res
 | 
			
		||||
 | 
			
		||||
        ( MoneyMsg str, MoneyField _ ) ->
 | 
			
		||||
            let
 | 
			
		||||
@@ -242,7 +241,7 @@ update msg model =
 | 
			
		||||
                model_ =
 | 
			
		||||
                    { model | fieldModel = MoneyField fm }
 | 
			
		||||
            in
 | 
			
		||||
            UpdateResult model_ Cmd.none res Sub.none
 | 
			
		||||
            UpdateResult model_ Cmd.none res
 | 
			
		||||
 | 
			
		||||
        ( ToggleBool, BoolField b ) ->
 | 
			
		||||
            let
 | 
			
		||||
@@ -259,7 +258,7 @@ update msg model =
 | 
			
		||||
                    else
 | 
			
		||||
                        "false"
 | 
			
		||||
            in
 | 
			
		||||
            UpdateResult model_ Cmd.none (Value value) Sub.none
 | 
			
		||||
            UpdateResult model_ Cmd.none (Value value)
 | 
			
		||||
 | 
			
		||||
        ( DateMsg lm, DateField _ picker ) ->
 | 
			
		||||
            let
 | 
			
		||||
@@ -280,14 +279,14 @@ update msg model =
 | 
			
		||||
                model_ =
 | 
			
		||||
                    { model | fieldModel = DateField newDate picker_ }
 | 
			
		||||
            in
 | 
			
		||||
            UpdateResult model_ Cmd.none value Sub.none
 | 
			
		||||
            UpdateResult model_ Cmd.none value
 | 
			
		||||
 | 
			
		||||
        ( Remove, _ ) ->
 | 
			
		||||
            UpdateResult model Cmd.none RemoveField Sub.none
 | 
			
		||||
            UpdateResult model Cmd.none RemoveField
 | 
			
		||||
 | 
			
		||||
        -- no other possibilities, not well encoded here
 | 
			
		||||
        _ ->
 | 
			
		||||
            UpdateResult model Cmd.none NoResult Sub.none
 | 
			
		||||
            UpdateResult model Cmd.none NoResult
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
mkLabel : Model -> String
 | 
			
		||||
@@ -396,7 +395,8 @@ makeInput icon model =
 | 
			
		||||
 | 
			
		||||
        DateField v dp ->
 | 
			
		||||
            div [ class "ui action left icon input" ]
 | 
			
		||||
                [ Html.map DateMsg (Comp.DatePicker.view v Comp.DatePicker.defaultSettings dp)
 | 
			
		||||
                [ Html.map DateMsg
 | 
			
		||||
                    (Comp.DatePicker.view v Comp.DatePicker.defaultSettings dp)
 | 
			
		||||
                , removeButton ""
 | 
			
		||||
                , i [ class (iconOr <| Icons.customFieldType Data.CustomFieldType.Date) ] []
 | 
			
		||||
                ]
 | 
			
		||||
 
 | 
			
		||||
@@ -138,7 +138,6 @@ mkFieldSelect fields =
 | 
			
		||||
type alias UpdateResult =
 | 
			
		||||
    { model : Model
 | 
			
		||||
    , cmd : Cmd Msg
 | 
			
		||||
    , subs : Sub Msg
 | 
			
		||||
    , result : CustomFieldChange
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -152,7 +151,7 @@ update : Msg -> Model -> UpdateResult
 | 
			
		||||
update msg model =
 | 
			
		||||
    case msg of
 | 
			
		||||
        CreateNewField ->
 | 
			
		||||
            UpdateResult model Cmd.none Sub.none FieldCreateNew
 | 
			
		||||
            UpdateResult model Cmd.none FieldCreateNew
 | 
			
		||||
 | 
			
		||||
        CustomFieldResp (Ok list) ->
 | 
			
		||||
            let
 | 
			
		||||
@@ -162,10 +161,10 @@ update msg model =
 | 
			
		||||
                        , fieldSelect = mkFieldSelect (currentOptions list.items model.visibleFields)
 | 
			
		||||
                    }
 | 
			
		||||
            in
 | 
			
		||||
            UpdateResult model_ Cmd.none Sub.none NoFieldChange
 | 
			
		||||
            UpdateResult model_ Cmd.none NoFieldChange
 | 
			
		||||
 | 
			
		||||
        CustomFieldResp (Err _) ->
 | 
			
		||||
            UpdateResult model Cmd.none Sub.none NoFieldChange
 | 
			
		||||
            UpdateResult model Cmd.none NoFieldChange
 | 
			
		||||
 | 
			
		||||
        FieldSelectMsg lm ->
 | 
			
		||||
            let
 | 
			
		||||
@@ -188,7 +187,7 @@ update msg model =
 | 
			
		||||
                    update (ApplyField field) model
 | 
			
		||||
 | 
			
		||||
                Nothing ->
 | 
			
		||||
                    UpdateResult model_ Cmd.none Sub.none NoFieldChange
 | 
			
		||||
                    UpdateResult model_ Cmd.none NoFieldChange
 | 
			
		||||
 | 
			
		||||
        ApplyField f ->
 | 
			
		||||
            let
 | 
			
		||||
@@ -218,7 +217,7 @@ update msg model =
 | 
			
		||||
                cmd_ =
 | 
			
		||||
                    Cmd.map (CustomFieldInputMsg f) fc
 | 
			
		||||
            in
 | 
			
		||||
            UpdateResult model_ cmd_ Sub.none NoFieldChange
 | 
			
		||||
            UpdateResult model_ cmd_ NoFieldChange
 | 
			
		||||
 | 
			
		||||
        RemoveField f ->
 | 
			
		||||
            let
 | 
			
		||||
@@ -231,7 +230,7 @@ update msg model =
 | 
			
		||||
                        , fieldSelect = mkFieldSelect (currentOptions model.allFields visible)
 | 
			
		||||
                    }
 | 
			
		||||
            in
 | 
			
		||||
            UpdateResult model_ Cmd.none Sub.none (FieldValueRemove f)
 | 
			
		||||
            UpdateResult model_ Cmd.none (FieldValueRemove f)
 | 
			
		||||
 | 
			
		||||
        CustomFieldInputMsg f lm ->
 | 
			
		||||
            let
 | 
			
		||||
@@ -268,10 +267,10 @@ update msg model =
 | 
			
		||||
                        update (RemoveField field) model_
 | 
			
		||||
 | 
			
		||||
                    else
 | 
			
		||||
                        UpdateResult model_ cmd_ Sub.none result
 | 
			
		||||
                        UpdateResult model_ cmd_ result
 | 
			
		||||
 | 
			
		||||
                Nothing ->
 | 
			
		||||
                    UpdateResult model Cmd.none Sub.none NoFieldChange
 | 
			
		||||
                    UpdateResult model Cmd.none NoFieldChange
 | 
			
		||||
 | 
			
		||||
        SetValues values ->
 | 
			
		||||
            let
 | 
			
		||||
@@ -299,7 +298,7 @@ update msg model =
 | 
			
		||||
                        , visibleFields = modelDict
 | 
			
		||||
                    }
 | 
			
		||||
            in
 | 
			
		||||
            UpdateResult model_ (Cmd.batch cmdList) Sub.none NoFieldChange
 | 
			
		||||
            UpdateResult model_ (Cmd.batch cmdList) NoFieldChange
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -564,9 +564,6 @@ update flags msg model =
 | 
			
		||||
                cmd_ =
 | 
			
		||||
                    Cmd.map CustomFieldMsg res.cmd
 | 
			
		||||
 | 
			
		||||
                sub_ =
 | 
			
		||||
                    Sub.map CustomFieldMsg res.subs
 | 
			
		||||
 | 
			
		||||
                change =
 | 
			
		||||
                    case res.result of
 | 
			
		||||
                        NoFieldChange ->
 | 
			
		||||
@@ -581,7 +578,7 @@ update flags msg model =
 | 
			
		||||
                        FieldCreateNew ->
 | 
			
		||||
                            NoFormChange
 | 
			
		||||
            in
 | 
			
		||||
            UpdateResult model_ cmd_ sub_ change
 | 
			
		||||
            UpdateResult model_ cmd_ Sub.none change
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
nameThrottleSub : Model -> Sub Msg
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@ module Comp.ItemDetail.Model exposing
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
import Api.Model.BasicResult exposing (BasicResult)
 | 
			
		||||
import Api.Model.CustomField exposing (CustomField)
 | 
			
		||||
import Api.Model.EquipmentList exposing (EquipmentList)
 | 
			
		||||
import Api.Model.FolderItem exposing (FolderItem)
 | 
			
		||||
import Api.Model.FolderList exposing (FolderList)
 | 
			
		||||
@@ -96,6 +97,7 @@ type alias Model =
 | 
			
		||||
    , keyInputModel : Comp.KeyInput.Model
 | 
			
		||||
    , customFieldsModel : Comp.CustomFieldMultiInput.Model
 | 
			
		||||
    , customFieldSavingIcon : Dict String String
 | 
			
		||||
    , customFieldThrottle : Throttle Msg
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -199,6 +201,7 @@ emptyModel =
 | 
			
		||||
    , keyInputModel = Comp.KeyInput.init
 | 
			
		||||
    , customFieldsModel = Comp.CustomFieldMultiInput.initWith []
 | 
			
		||||
    , customFieldSavingIcon = Dict.empty
 | 
			
		||||
    , customFieldThrottle = Throttle.create 1
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -285,7 +288,8 @@ type Msg
 | 
			
		||||
    | UiSettingsUpdated
 | 
			
		||||
    | SetLinkTarget LinkTarget
 | 
			
		||||
    | CustomFieldMsg Comp.CustomFieldMultiInput.Msg
 | 
			
		||||
    | CustomFieldSaveResp String (Result Http.Error BasicResult)
 | 
			
		||||
    | CustomFieldSaveResp CustomField String (Result Http.Error BasicResult)
 | 
			
		||||
    | CustomFieldRemoveResp String (Result Http.Error BasicResult)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
type SaveNameState
 | 
			
		||||
 
 | 
			
		||||
@@ -2,10 +2,12 @@ module Comp.ItemDetail.Update exposing (update)
 | 
			
		||||
 | 
			
		||||
import Api
 | 
			
		||||
import Api.Model.BasicResult exposing (BasicResult)
 | 
			
		||||
import Api.Model.CustomField exposing (CustomField)
 | 
			
		||||
import Api.Model.CustomFieldValue exposing (CustomFieldValue)
 | 
			
		||||
import Api.Model.DirectionValue exposing (DirectionValue)
 | 
			
		||||
import Api.Model.IdName exposing (IdName)
 | 
			
		||||
import Api.Model.ItemDetail exposing (ItemDetail)
 | 
			
		||||
import Api.Model.ItemFieldValue exposing (ItemFieldValue)
 | 
			
		||||
import Api.Model.MoveAttachment exposing (MoveAttachment)
 | 
			
		||||
import Api.Model.OptionalDate exposing (OptionalDate)
 | 
			
		||||
import Api.Model.OptionalId exposing (OptionalId)
 | 
			
		||||
@@ -1232,10 +1234,16 @@ update key flags inav settings msg model =
 | 
			
		||||
 | 
			
		||||
        UpdateThrottle ->
 | 
			
		||||
            let
 | 
			
		||||
                ( newThrottle, cmd ) =
 | 
			
		||||
                ( newSaveName, cmd1 ) =
 | 
			
		||||
                    Throttle.update model.nameSaveThrottle
 | 
			
		||||
 | 
			
		||||
                ( newCustomField, cmd2 ) =
 | 
			
		||||
                    Throttle.update model.customFieldThrottle
 | 
			
		||||
            in
 | 
			
		||||
            withSub ( { model | nameSaveThrottle = newThrottle }, cmd )
 | 
			
		||||
            withSub
 | 
			
		||||
                ( { model | nameSaveThrottle = newSaveName, customFieldThrottle = newCustomField }
 | 
			
		||||
                , Cmd.batch [ cmd1, cmd2 ]
 | 
			
		||||
                )
 | 
			
		||||
 | 
			
		||||
        KeyInputMsg lm ->
 | 
			
		||||
            let
 | 
			
		||||
@@ -1303,7 +1311,7 @@ update key flags inav settings msg model =
 | 
			
		||||
                loadingIcon =
 | 
			
		||||
                    "refresh loading icon"
 | 
			
		||||
 | 
			
		||||
                ( action, icons ) =
 | 
			
		||||
                ( action_, icons ) =
 | 
			
		||||
                    case result.result of
 | 
			
		||||
                        NoFieldChange ->
 | 
			
		||||
                            ( Cmd.none, model.customFieldSavingIcon )
 | 
			
		||||
@@ -1312,7 +1320,7 @@ update key flags inav settings msg model =
 | 
			
		||||
                            ( Api.deleteCustomValue flags
 | 
			
		||||
                                model.item.id
 | 
			
		||||
                                field.id
 | 
			
		||||
                                (CustomFieldSaveResp field.id)
 | 
			
		||||
                                (CustomFieldRemoveResp field.id)
 | 
			
		||||
                            , Dict.insert field.id loadingIcon model.customFieldSavingIcon
 | 
			
		||||
                            )
 | 
			
		||||
 | 
			
		||||
@@ -1320,16 +1328,13 @@ update key flags inav settings msg model =
 | 
			
		||||
                            ( Api.putCustomValue flags
 | 
			
		||||
                                model.item.id
 | 
			
		||||
                                (CustomFieldValue field.id value)
 | 
			
		||||
                                (CustomFieldSaveResp field.id)
 | 
			
		||||
                                (CustomFieldSaveResp field value)
 | 
			
		||||
                            , Dict.insert field.id loadingIcon model.customFieldSavingIcon
 | 
			
		||||
                            )
 | 
			
		||||
 | 
			
		||||
                        FieldCreateNew ->
 | 
			
		||||
                            ( Cmd.none, model.customFieldSavingIcon )
 | 
			
		||||
 | 
			
		||||
                sub_ =
 | 
			
		||||
                    Sub.map CustomFieldMsg result.subs
 | 
			
		||||
 | 
			
		||||
                modalEdit =
 | 
			
		||||
                    if result.result == FieldCreateNew then
 | 
			
		||||
                        Just (Comp.DetailEdit.initCustomField model.item.id)
 | 
			
		||||
@@ -1337,20 +1342,41 @@ update key flags inav settings msg model =
 | 
			
		||||
                    else
 | 
			
		||||
                        Nothing
 | 
			
		||||
 | 
			
		||||
                ( throttle, action ) =
 | 
			
		||||
                    if action_ == Cmd.none then
 | 
			
		||||
                        ( model.customFieldThrottle, action_ )
 | 
			
		||||
 | 
			
		||||
                    else
 | 
			
		||||
                        Throttle.try action_ model.customFieldThrottle
 | 
			
		||||
 | 
			
		||||
                model_ =
 | 
			
		||||
                    { model
 | 
			
		||||
                        | customFieldsModel = result.model
 | 
			
		||||
                        , customFieldThrottle = throttle
 | 
			
		||||
                        , modalEdit = modalEdit
 | 
			
		||||
                        , customFieldSavingIcon = icons
 | 
			
		||||
                    }
 | 
			
		||||
            in
 | 
			
		||||
            { model = model_
 | 
			
		||||
            , cmd = Cmd.batch [ cmd_, action ]
 | 
			
		||||
            , sub = sub_
 | 
			
		||||
            , linkTarget = Comp.LinkTarget.LinkNone
 | 
			
		||||
            }
 | 
			
		||||
            withSub ( model_, Cmd.batch [ cmd_, action ] )
 | 
			
		||||
 | 
			
		||||
        CustomFieldSaveResp fieldId (Ok res) ->
 | 
			
		||||
        CustomFieldSaveResp cf fv (Ok res) ->
 | 
			
		||||
            let
 | 
			
		||||
                model_ =
 | 
			
		||||
                    { model | customFieldSavingIcon = Dict.remove cf.id model.customFieldSavingIcon }
 | 
			
		||||
            in
 | 
			
		||||
            if res.success then
 | 
			
		||||
                resultModelCmd
 | 
			
		||||
                    ( { model_ | item = setCustomField model.item cf fv }
 | 
			
		||||
                    , Cmd.none
 | 
			
		||||
                    )
 | 
			
		||||
 | 
			
		||||
            else
 | 
			
		||||
                resultModel model_
 | 
			
		||||
 | 
			
		||||
        CustomFieldSaveResp cf _ (Err _) ->
 | 
			
		||||
            resultModel { model | customFieldSavingIcon = Dict.remove cf.id model.customFieldSavingIcon }
 | 
			
		||||
 | 
			
		||||
        CustomFieldRemoveResp fieldId (Ok res) ->
 | 
			
		||||
            let
 | 
			
		||||
                model_ =
 | 
			
		||||
                    { model | customFieldSavingIcon = Dict.remove fieldId model.customFieldSavingIcon }
 | 
			
		||||
@@ -1364,7 +1390,7 @@ update key flags inav settings msg model =
 | 
			
		||||
            else
 | 
			
		||||
                resultModel model_
 | 
			
		||||
 | 
			
		||||
        CustomFieldSaveResp fieldId (Err _) ->
 | 
			
		||||
        CustomFieldRemoveResp fieldId (Err _) ->
 | 
			
		||||
            resultModel { model | customFieldSavingIcon = Dict.remove fieldId model.customFieldSavingIcon }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -1506,9 +1532,14 @@ withSub ( m, c ) =
 | 
			
		||||
    { model = m
 | 
			
		||||
    , cmd = c
 | 
			
		||||
    , sub =
 | 
			
		||||
        Throttle.ifNeeded
 | 
			
		||||
            (Time.every 400 (\_ -> UpdateThrottle))
 | 
			
		||||
            m.nameSaveThrottle
 | 
			
		||||
        Sub.batch
 | 
			
		||||
            [ Throttle.ifNeeded
 | 
			
		||||
                (Time.every 200 (\_ -> UpdateThrottle))
 | 
			
		||||
                m.nameSaveThrottle
 | 
			
		||||
            , Throttle.ifNeeded
 | 
			
		||||
                (Time.every 200 (\_ -> UpdateThrottle))
 | 
			
		||||
                m.customFieldThrottle
 | 
			
		||||
            ]
 | 
			
		||||
    , linkTarget = Comp.LinkTarget.LinkNone
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1564,3 +1595,33 @@ resetHiddenFields settings flags item tagger =
 | 
			
		||||
setItemName : ItemDetail -> String -> ItemDetail
 | 
			
		||||
setItemName item name =
 | 
			
		||||
    { item | name = name }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{-| Sets the field value of the given id into the item detail.
 | 
			
		||||
-}
 | 
			
		||||
setCustomField : ItemDetail -> CustomField -> String -> ItemDetail
 | 
			
		||||
setCustomField item cf fv =
 | 
			
		||||
    let
 | 
			
		||||
        change ifv =
 | 
			
		||||
            if ifv.id == cf.id then
 | 
			
		||||
                ( { ifv | value = fv }, True )
 | 
			
		||||
 | 
			
		||||
            else
 | 
			
		||||
                ( ifv, False )
 | 
			
		||||
 | 
			
		||||
        ( fields, isChanged ) =
 | 
			
		||||
            List.map change item.customfields
 | 
			
		||||
                |> List.foldl
 | 
			
		||||
                    (\( e, isChange ) ->
 | 
			
		||||
                        \( list, flag ) -> ( e :: list, isChange || flag )
 | 
			
		||||
                    )
 | 
			
		||||
                    ( [], False )
 | 
			
		||||
    in
 | 
			
		||||
    if isChanged then
 | 
			
		||||
        { item | customfields = fields }
 | 
			
		||||
 | 
			
		||||
    else
 | 
			
		||||
        { item
 | 
			
		||||
            | customfields =
 | 
			
		||||
                ItemFieldValue cf.id cf.name cf.label cf.ftype fv :: item.customfields
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -183,11 +183,7 @@ renderDetailMenu settings inav model =
 | 
			
		||||
 | 
			
		||||
actionInputDatePicker : DatePicker.Settings
 | 
			
		||||
actionInputDatePicker =
 | 
			
		||||
    let
 | 
			
		||||
        ds =
 | 
			
		||||
            Comp.DatePicker.defaultSettings
 | 
			
		||||
    in
 | 
			
		||||
    { ds | containerClassList = [ ( "ui action input", True ) ] }
 | 
			
		||||
    Comp.DatePicker.defaultSettings
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
renderIdInfo : Model -> List (Html msg)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user