Store and load client settings

This commit is contained in:
Eike Kettner 2021-05-26 01:14:30 +02:00
parent 9f76357879
commit 9ccc3ce438
10 changed files with 309 additions and 245 deletions

View File

@ -7,6 +7,7 @@ module App.Data exposing
) )
import Api.Model.AuthResult exposing (AuthResult) import Api.Model.AuthResult exposing (AuthResult)
import Api.Model.BasicResult exposing (BasicResult)
import Api.Model.VersionInfo exposing (VersionInfo) import Api.Model.VersionInfo exposing (VersionInfo)
import Browser exposing (UrlRequest) import Browser exposing (UrlRequest)
import Browser.Navigation exposing (Key) import Browser.Navigation exposing (Key)
@ -155,11 +156,12 @@ type Msg
| SessionCheckResp (Result Http.Error AuthResult) | SessionCheckResp (Result Http.Error AuthResult)
| ToggleNavMenu | ToggleNavMenu
| ToggleUserMenu | ToggleUserMenu
| GetUiSettings UiSettings | GetUiSettings (Result Http.Error UiSettings)
| ToggleSidebar | ToggleSidebar
| ToggleDarkMode | ToggleDarkMode
| ToggleLangMenu | ToggleLangMenu
| SetLanguage UiLanguage | SetLanguage UiLanguage
| ClientSettingsSaveResp UiSettings (Result Http.Error BasicResult)
defaultPage : Flags -> Page defaultPage : Flags -> Page

View File

@ -8,6 +8,7 @@ import App.Data exposing (..)
import Browser exposing (UrlRequest(..)) import Browser exposing (UrlRequest(..))
import Browser.Navigation as Nav import Browser.Navigation as Nav
import Data.Flags import Data.Flags
import Data.UiSettings exposing (UiSettings)
import Data.UiTheme import Data.UiTheme
import Page exposing (Page(..)) import Page exposing (Page(..))
import Page.CollectiveSettings.Data import Page.CollectiveSettings.Data
@ -65,11 +66,11 @@ updateWithSub msg model =
{ settings | uiTheme = next } { settings | uiTheme = next }
in in
-- when authenticated, store it in settings only -- when authenticated, store it in settings only
-- once new settings arrive via a subscription, -- once new settings are successfully saved (the
-- the ui is updated. so it is also updated on -- response is arrived), the ui is updated. so it
-- page refresh -- is also updated on page refresh
( { model | userMenuOpen = False } ( { model | userMenuOpen = False }
, Ports.storeUiSettings model.flags newSettings , Api.saveClientSettings model.flags newSettings (ClientSettingsSaveResp newSettings)
, Sub.none , Sub.none
) )
@ -84,6 +85,16 @@ updateWithSub msg model =
, Sub.none , Sub.none
) )
ClientSettingsSaveResp settings (Ok res) ->
if res.success then
applyClientSettings model settings
else
( model, Cmd.none, Sub.none )
ClientSettingsSaveResp _ (Err _) ->
( model, Cmd.none, Sub.none )
ToggleLangMenu -> ToggleLangMenu ->
( { model | langMenuOpen = not model.langMenuOpen } ( { model | langMenuOpen = not model.langMenuOpen }
, Cmd.none , Cmd.none
@ -258,22 +269,30 @@ updateWithSub msg model =
, Sub.none , Sub.none
) )
GetUiSettings settings -> GetUiSettings (Ok settings) ->
let applyClientSettings model settings
setTheme =
Ports.setUiTheme settings.uiTheme GetUiSettings (Err _) ->
in ( model, Cmd.none, Sub.none )
Util.Update.andThen2
[ \m ->
( { m | sidebarVisible = settings.sideMenuVisible } applyClientSettings : Model -> UiSettings -> ( Model, Cmd Msg, Sub Msg )
, setTheme applyClientSettings model settings =
, Sub.none let
) setTheme =
, updateUserSettings Page.UserSettings.Data.UpdateSettings Ports.setUiTheme settings.uiTheme
, updateHome Page.Home.Data.UiSettingsUpdated in
, updateItemDetail Page.ItemDetail.Data.UiSettingsUpdated Util.Update.andThen2
] [ \m ->
{ model | uiSettings = settings } ( { m | sidebarVisible = settings.sideMenuVisible }
, setTheme
, Sub.none
)
, updateUserSettings Page.UserSettings.Data.UpdateSettings
, updateHome Page.Home.Data.UiSettingsUpdated
, updateItemDetail Page.ItemDetail.Data.UiSettingsUpdated
]
{ model | uiSettings = settings }
updateItemDetail : Page.ItemDetail.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg ) updateItemDetail : Page.ItemDetail.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
@ -360,14 +379,26 @@ updateQueue lmsg model =
updateUserSettings : Page.UserSettings.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg ) updateUserSettings : Page.UserSettings.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
updateUserSettings lmsg model = updateUserSettings lmsg model =
let let
( lm, lc, ls ) = ( lm, lc, newClientSettings ) =
Page.UserSettings.Update.update model.flags model.uiSettings lmsg model.userSettingsModel Page.UserSettings.Update.update model.flags model.uiSettings lmsg model.userSettingsModel
model_ =
{ model | userSettingsModel = lm }
( lm2, lc2, s2 ) =
case newClientSettings of
Just sett ->
applyClientSettings model_ sett
Nothing ->
( model_, Cmd.none, Sub.none )
in in
( { model ( lm2
| userSettingsModel = lm , Cmd.batch
} [ Cmd.map UserSettingsMsg lc
, Cmd.map UserSettingsMsg lc , lc2
, Sub.map UserSettingsMsg ls ]
, s2
) )
@ -415,14 +446,29 @@ updateHome lmsg model =
_ -> _ ->
Nothing Nothing
( lm, lc, ls ) = result =
Page.Home.Update.update mid model.key model.flags model.uiSettings lmsg model.homeModel Page.Home.Update.update mid model.key model.flags model.uiSettings lmsg model.homeModel
model_ =
{ model | homeModel = result.model }
( lm, lc, ls ) =
case result.newSettings of
Just sett ->
applyClientSettings model_ sett
Nothing ->
( model_, Cmd.none, Sub.none )
in in
( { model ( lm
| homeModel = lm , Cmd.batch
} [ Cmd.map HomeMsg result.cmd
, Cmd.map HomeMsg lc , lc
, Sub.map HomeMsg ls ]
, Sub.batch
[ Sub.map HomeMsg result.sub
, ls
]
) )

View File

@ -1,6 +1,7 @@
module Comp.UiSettingsManage exposing module Comp.UiSettingsManage exposing
( Model ( Model
, Msg(..) , Msg(..)
, UpdateResult
, init , init
, update , update
, view2 , view2
@ -14,10 +15,8 @@ import Data.Flags exposing (Flags)
import Data.UiSettings exposing (UiSettings) import Data.UiSettings exposing (UiSettings)
import Html exposing (..) import Html exposing (..)
import Html.Attributes exposing (..) import Html.Attributes exposing (..)
import Html.Events exposing (onClick)
import Http import Http
import Messages.Comp.UiSettingsManage exposing (Texts) import Messages.Comp.UiSettingsManage exposing (Texts)
import Ports
import Styles as S import Styles as S
@ -31,9 +30,8 @@ type alias Model =
type Msg type Msg
= UiSettingsFormMsg Comp.UiSettingsForm.Msg = UiSettingsFormMsg Comp.UiSettingsForm.Msg
| Submit | Submit
| SettingsSaved
| UpdateSettings | UpdateSettings
| SaveSettingsResp (Result Http.Error BasicResult) | SaveSettingsResp UiSettings (Result Http.Error BasicResult)
init : Flags -> UiSettings -> ( Model, Cmd Msg ) init : Flags -> UiSettings -> ( Model, Cmd Msg )
@ -54,7 +52,14 @@ init flags settings =
--- update --- update
update : Flags -> UiSettings -> Msg -> Model -> ( Model, Cmd Msg, Sub Msg ) type alias UpdateResult =
{ model : Model
, cmd : Cmd Msg
, newSettings : Maybe UiSettings
}
update : Flags -> UiSettings -> Msg -> Model -> UpdateResult
update flags settings msg model = update flags settings msg model =
case msg of case msg of
UiSettingsFormMsg lm -> UiSettingsFormMsg lm ->
@ -65,60 +70,58 @@ update flags settings msg model =
( m_, sett ) = ( m_, sett ) =
Comp.UiSettingsForm.update inSettings lm model.formModel Comp.UiSettingsForm.update inSettings lm model.formModel
in in
( { model { model =
| formModel = m_ { model
, settings = | formModel = m_
if sett == Nothing then , settings =
model.settings if sett == Nothing then
model.settings
else else
sett sett
, message = , message =
if sett /= Nothing then if sett /= Nothing then
Nothing Nothing
else else
model.message model.message
} }
, Cmd.none , cmd = Cmd.none
, Sub.none , newSettings = Nothing
) }
Submit -> Submit ->
case model.settings of case model.settings of
Just s -> Just s ->
( { model | message = Nothing } { model = { model | message = Nothing }
, Api.saveClientSettings flags s SaveSettingsResp , cmd = Api.saveClientSettings flags s (SaveSettingsResp s)
, Ports.onUiSettingsSaved SettingsSaved , newSettings = Nothing
) }
Nothing -> Nothing ->
( { model | message = Just (BasicResult False "Settings unchanged or invalid.") } { model = { model | message = Just (BasicResult False "Settings unchanged or invalid.") }
, Cmd.none , cmd = Cmd.none
, Sub.none , newSettings = Nothing
) }
SettingsSaved -> SaveSettingsResp newSettings (Ok res) ->
( { model | message = Just (BasicResult True "Settings saved.") } { model = { model | message = Just res }
, Cmd.none , cmd = Cmd.none
, Sub.none , newSettings = Just newSettings
) }
SaveSettingsResp (Ok res) -> SaveSettingsResp _ (Err err) ->
( { model | message = Just res }, Cmd.none, Sub.none ) UpdateResult model Cmd.none Nothing
SaveSettingsResp (Err err) ->
( model, Cmd.none, Sub.none )
UpdateSettings -> UpdateSettings ->
let let
( fm, fc ) = ( fm, fc ) =
Comp.UiSettingsForm.init flags settings Comp.UiSettingsForm.init flags settings
in in
( { model | formModel = fm } { model = { model | formModel = fm }
, Cmd.map UiSettingsFormMsg fc , cmd = Cmd.map UiSettingsFormMsg fc
, Sub.none , newSettings = Nothing
) }

View File

@ -55,7 +55,7 @@ init flags url key =
else else
Cmd.none Cmd.none
, Ports.getUiSettings flags , Api.getClientSettings flags GetUiSettings
] ]
) )
@ -85,5 +85,4 @@ subscriptions : Model -> Sub Msg
subscriptions model = subscriptions model =
Sub.batch Sub.batch
[ model.subs [ model.subs
, Ports.loadUiSettings GetUiSettings
] ]

View File

@ -193,6 +193,7 @@ type Msg
| KeyUpPowerSearchbarMsg (Maybe KeyCode) | KeyUpPowerSearchbarMsg (Maybe KeyCode)
| RequestReprocessSelected | RequestReprocessSelected
| ReprocessSelectedConfirmed | ReprocessSelectedConfirmed
| ClientSettingsSaveResp UiSettings (Result Http.Error BasicResult)
type SearchType type SearchType

View File

@ -1,4 +1,7 @@
module Page.Home.Update exposing (update) module Page.Home.Update exposing
( UpdateResult
, update
)
import Api import Api
import Api.Model.ItemLightList exposing (ItemLightList) import Api.Model.ItemLightList exposing (ItemLightList)
@ -16,7 +19,6 @@ import Data.Items
import Data.UiSettings exposing (UiSettings) import Data.UiSettings exposing (UiSettings)
import Page exposing (Page(..)) import Page exposing (Page(..))
import Page.Home.Data exposing (..) import Page.Home.Data exposing (..)
import Ports
import Process import Process
import Scroll import Scroll
import Set exposing (Set) import Set exposing (Set)
@ -28,7 +30,15 @@ import Util.ItemDragDrop as DD
import Util.Update import Util.Update
update : Maybe String -> Nav.Key -> Flags -> UiSettings -> Msg -> Model -> ( Model, Cmd Msg, Sub Msg ) type alias UpdateResult =
{ model : Model
, cmd : Cmd Msg
, sub : Sub Msg
, newSettings : Maybe UiSettings
}
update : Maybe String -> Nav.Key -> Flags -> UiSettings -> Msg -> Model -> UpdateResult
update mId key flags settings msg model = update mId key flags settings msg model =
case msg of case msg of
Init -> Init ->
@ -41,11 +51,12 @@ update mId key flags settings msg model =
, scroll = True , scroll = True
} }
in in
Util.Update.andThen2 makeResult <|
[ update mId key flags settings (SearchMenuMsg Comp.SearchMenu.Init) Util.Update.andThen3
, doSearch searchParam [ update mId key flags settings (SearchMenuMsg Comp.SearchMenu.Init)
] , doSearch searchParam
model ]
model
ResetSearch -> ResetSearch ->
let let
@ -79,21 +90,21 @@ update mId key flags settings msg model =
BasicSearch BasicSearch
} }
( m2, c2, s2 ) = result =
if nextState.stateChange && not model.searchInProgress then if nextState.stateChange && not model.searchInProgress then
doSearch (SearchParam flags BasicSearch settings.itemSearchPageSize 0 False) newModel doSearch (SearchParam flags BasicSearch settings.itemSearchPageSize 0 False) newModel
else else
withSub ( newModel, Cmd.none ) withSub ( newModel, Cmd.none )
in in
( m2 { result
, Cmd.batch | cmd =
[ c2 Cmd.batch
, Cmd.map SearchMenuMsg nextState.cmd [ result.cmd
, dropCmd , Cmd.map SearchMenuMsg nextState.cmd
] , dropCmd
, s2 ]
) }
SetLinkTarget lt -> SetLinkTarget lt ->
case linkTargetMsg lt of case linkTargetMsg lt of
@ -101,7 +112,7 @@ update mId key flags settings msg model =
update mId key flags settings m model update mId key flags settings m model
Nothing -> Nothing ->
( model, Cmd.none, Sub.none ) makeResult ( model, Cmd.none, Sub.none )
ItemCardListMsg m -> ItemCardListMsg m ->
let let
@ -144,15 +155,16 @@ update mId key flags settings msg model =
, moreAvailable = list.groups /= [] , moreAvailable = list.groups /= []
} }
in in
Util.Update.andThen2 makeResult <|
[ update mId key flags settings (ItemCardListMsg (Comp.ItemCardList.SetResults list)) Util.Update.andThen3
, if scroll then [ update mId key flags settings (ItemCardListMsg (Comp.ItemCardList.SetResults list))
scrollToCard mId , if scroll then
scrollToCard mId
else else
\next -> ( next, Cmd.none, Sub.none ) \next -> makeResult ( next, Cmd.none, Sub.none )
] ]
m m
ItemSearchAddResp (Ok list) -> ItemSearchAddResp (Ok list) ->
let let
@ -167,10 +179,7 @@ update mId key flags settings msg model =
, moreAvailable = list.groups /= [] , moreAvailable = list.groups /= []
} }
in in
Util.Update.andThen2 update mId key flags settings (ItemCardListMsg (Comp.ItemCardList.AddResults list)) m
[ update mId key flags settings (ItemCardListMsg (Comp.ItemCardList.AddResults list))
]
m
ItemSearchAddResp (Err _) -> ItemSearchAddResp (Err _) ->
withSub withSub
@ -514,10 +523,11 @@ update mId key flags settings msg model =
res.change res.change
(MultiUpdateResp res.change) (MultiUpdateResp res.change)
in in
( { model | viewMode = SelectView svm_ } makeResult
, Cmd.batch [ cmd_, upCmd ] ( { model | viewMode = SelectView svm_ }
, sub_ , Cmd.batch [ cmd_, upCmd ]
) , sub_
)
_ -> _ ->
noSub ( model, Cmd.none ) noSub ( model, Cmd.none )
@ -540,10 +550,11 @@ update mId key flags settings msg model =
noSub ( nm, Cmd.none ) noSub ( nm, Cmd.none )
MultiUpdateResp change (Err _) -> MultiUpdateResp change (Err _) ->
( updateSelectViewNameState False model change makeResult
, Cmd.none ( updateSelectViewNameState False model change
, Sub.none , Cmd.none
) , Sub.none
)
ReplaceChangedItemsResp (Ok items) -> ReplaceChangedItemsResp (Ok items) ->
noSub ( replaceItems model items, Cmd.none ) noSub ( replaceItems model items, Cmd.none )
@ -592,10 +603,24 @@ update mId key flags settings msg model =
{ settings | cardPreviewFullWidth = not settings.cardPreviewFullWidth } { settings | cardPreviewFullWidth = not settings.cardPreviewFullWidth }
cmd = cmd =
Ports.storeUiSettings flags newSettings Api.saveClientSettings flags newSettings (ClientSettingsSaveResp newSettings)
in in
noSub ( model, cmd ) noSub ( model, cmd )
ClientSettingsSaveResp newSettings (Ok res) ->
if res.success then
{ model = model
, cmd = Cmd.none
, sub = Sub.none
, newSettings = Just newSettings
}
else
noSub ( model, Cmd.none )
ClientSettingsSaveResp _ (Err _) ->
noSub ( model, Cmd.none )
PowerSearchMsg lm -> PowerSearchMsg lm ->
let let
result = result =
@ -609,7 +634,7 @@ update mId key flags settings msg model =
in in
case result.action of case result.action of
Comp.PowerSearchInput.NoAction -> Comp.PowerSearchInput.NoAction ->
( model_, cmd_, Sub.map PowerSearchMsg result.subs ) makeResult ( model_, cmd_, Sub.map PowerSearchMsg result.subs )
Comp.PowerSearchInput.SubmitSearch -> Comp.PowerSearchInput.SubmitSearch ->
update mId key flags settings (DoSearch model_.searchTypeDropdownValue) model_ update mId key flags settings (DoSearch model_.searchTypeDropdownValue) model_
@ -703,21 +728,22 @@ loadChangedItems flags ids =
Api.itemSearch flags search ReplaceChangedItemsResp Api.itemSearch flags search ReplaceChangedItemsResp
scrollToCard : Maybe String -> Model -> ( Model, Cmd Msg, Sub Msg ) scrollToCard : Maybe String -> Model -> UpdateResult
scrollToCard mId model = scrollToCard mId model =
let let
scroll id = scroll id =
Scroll.scrollElementY "item-card-list" id 0.5 0.5 Scroll.scrollElementY "item-card-list" id 0.5 0.5
in in
case mId of makeResult <|
Just id -> case mId of
( { model | scrollToCard = mId } Just id ->
, Task.attempt ScrollResult (scroll id) ( { model | scrollToCard = mId }
, Sub.none , Task.attempt ScrollResult (scroll id)
) , Sub.none
)
Nothing -> Nothing ->
( model, Cmd.none, Sub.none ) ( model, Cmd.none, Sub.none )
loadEditModel : Flags -> Cmd Msg loadEditModel : Flags -> Cmd Msg
@ -725,7 +751,7 @@ loadEditModel flags =
Cmd.map EditMenuMsg (Comp.ItemDetail.MultiEditMenu.loadModel flags) Cmd.map EditMenuMsg (Comp.ItemDetail.MultiEditMenu.loadModel flags)
doSearch : SearchParam -> Model -> ( Model, Cmd Msg, Sub Msg ) doSearch : SearchParam -> Model -> UpdateResult
doSearch param model = doSearch param model =
let let
param_ = param_ =
@ -798,16 +824,26 @@ doSearchMore flags settings model =
) )
withSub : ( Model, Cmd Msg ) -> ( Model, Cmd Msg, Sub Msg ) withSub : ( Model, Cmd Msg ) -> UpdateResult
withSub ( m, c ) = withSub ( m, c ) =
( m makeResult
, c ( m
, Throttle.ifNeeded , c
(Time.every 500 (\_ -> UpdateThrottle)) , Throttle.ifNeeded
m.throttle (Time.every 500 (\_ -> UpdateThrottle))
) m.throttle
)
noSub : ( Model, Cmd Msg ) -> ( Model, Cmd Msg, Sub Msg ) noSub : ( Model, Cmd Msg ) -> UpdateResult
noSub ( m, c ) = noSub ( m, c ) =
( m, c, Sub.none ) makeResult ( m, c, Sub.none )
makeResult : ( Model, Cmd Msg, Sub Msg ) -> UpdateResult
makeResult ( m, c, s ) =
{ model = m
, cmd = c
, sub = s
, newSettings = Nothing
}

View File

@ -11,7 +11,7 @@ import Data.UiSettings exposing (UiSettings)
import Page.UserSettings.Data exposing (..) import Page.UserSettings.Data exposing (..)
update : Flags -> UiSettings -> Msg -> Model -> ( Model, Cmd Msg, Sub Msg ) update : Flags -> UiSettings -> Msg -> Model -> ( Model, Cmd Msg, Maybe UiSettings )
update flags settings msg model = update flags settings msg model =
case msg of case msg of
SetTab t -> SetTab t ->
@ -25,17 +25,23 @@ update flags settings msg model =
( em, c ) = ( em, c ) =
Comp.EmailSettingsManage.init flags Comp.EmailSettingsManage.init flags
in in
( { m | emailSettingsModel = em }, Cmd.map EmailSettingsMsg c, Sub.none ) ( { m | emailSettingsModel = em }
, Cmd.map EmailSettingsMsg c
, Nothing
)
ImapSettingsTab -> ImapSettingsTab ->
let let
( em, c ) = ( em, c ) =
Comp.ImapSettingsManage.init flags Comp.ImapSettingsManage.init flags
in in
( { m | imapSettingsModel = em }, Cmd.map ImapSettingsMsg c, Sub.none ) ( { m | imapSettingsModel = em }
, Cmd.map ImapSettingsMsg c
, Nothing
)
ChangePassTab -> ChangePassTab ->
( m, Cmd.none, Sub.none ) ( m, Cmd.none, Nothing )
NotificationTab -> NotificationTab ->
let let
@ -43,7 +49,7 @@ update flags settings msg model =
Cmd.map NotificationMsg Cmd.map NotificationMsg
(Tuple.second (Comp.NotificationManage.init flags)) (Tuple.second (Comp.NotificationManage.init flags))
in in
( m, initCmd, Sub.none ) ( m, initCmd, Nothing )
ScanMailboxTab -> ScanMailboxTab ->
let let
@ -51,31 +57,40 @@ update flags settings msg model =
Cmd.map ScanMailboxMsg Cmd.map ScanMailboxMsg
(Tuple.second (Comp.ScanMailboxManage.init flags)) (Tuple.second (Comp.ScanMailboxManage.init flags))
in in
( m, initCmd, Sub.none ) ( m, initCmd, Nothing )
UiSettingsTab -> UiSettingsTab ->
( m, Cmd.none, Sub.none ) ( m, Cmd.none, Nothing )
ChangePassMsg m -> ChangePassMsg m ->
let let
( m2, c2 ) = ( m2, c2 ) =
Comp.ChangePasswordForm.update flags m model.changePassModel Comp.ChangePasswordForm.update flags m model.changePassModel
in in
( { model | changePassModel = m2 }, Cmd.map ChangePassMsg c2, Sub.none ) ( { model | changePassModel = m2 }
, Cmd.map ChangePassMsg c2
, Nothing
)
EmailSettingsMsg m -> EmailSettingsMsg m ->
let let
( m2, c2 ) = ( m2, c2 ) =
Comp.EmailSettingsManage.update flags m model.emailSettingsModel Comp.EmailSettingsManage.update flags m model.emailSettingsModel
in in
( { model | emailSettingsModel = m2 }, Cmd.map EmailSettingsMsg c2, Sub.none ) ( { model | emailSettingsModel = m2 }
, Cmd.map EmailSettingsMsg c2
, Nothing
)
ImapSettingsMsg m -> ImapSettingsMsg m ->
let let
( m2, c2 ) = ( m2, c2 ) =
Comp.ImapSettingsManage.update flags m model.imapSettingsModel Comp.ImapSettingsManage.update flags m model.imapSettingsModel
in in
( { model | imapSettingsModel = m2 }, Cmd.map ImapSettingsMsg c2, Sub.none ) ( { model | imapSettingsModel = m2 }
, Cmd.map ImapSettingsMsg c2
, Nothing
)
NotificationMsg lm -> NotificationMsg lm ->
let let
@ -84,7 +99,7 @@ update flags settings msg model =
in in
( { model | notificationModel = m2 } ( { model | notificationModel = m2 }
, Cmd.map NotificationMsg c2 , Cmd.map NotificationMsg c2
, Sub.none , Nothing
) )
ScanMailboxMsg lm -> ScanMailboxMsg lm ->
@ -94,17 +109,17 @@ update flags settings msg model =
in in
( { model | scanMailboxModel = m2 } ( { model | scanMailboxModel = m2 }
, Cmd.map ScanMailboxMsg c2 , Cmd.map ScanMailboxMsg c2
, Sub.none , Nothing
) )
UiSettingsMsg lm -> UiSettingsMsg lm ->
let let
( m2, c2, s2 ) = res =
Comp.UiSettingsManage.update flags settings lm model.uiSettingsModel Comp.UiSettingsManage.update flags settings lm model.uiSettingsModel
in in
( { model | uiSettingsModel = m2 } ( { model | uiSettingsModel = res.model }
, Cmd.map UiSettingsMsg c2 , Cmd.map UiSettingsMsg res.cmd
, Sub.map UiSettingsMsg s2 , res.newSettings
) )
UpdateSettings -> UpdateSettings ->

View File

@ -1,20 +1,14 @@
port module Ports exposing port module Ports exposing
( checkSearchQueryString ( checkSearchQueryString
, getUiSettings
, initClipboard , initClipboard
, loadUiSettings
, onUiSettingsSaved
, receiveCheckQueryResult , receiveCheckQueryResult
, removeAccount , removeAccount
, setAccount , setAccount
, setUiTheme , setUiTheme
, storeUiSettings
) )
import Api.Model.AuthResult exposing (AuthResult) import Api.Model.AuthResult exposing (AuthResult)
import Data.Flags exposing (Flags)
import Data.QueryParseResult exposing (QueryParseResult) import Data.QueryParseResult exposing (QueryParseResult)
import Data.UiSettings exposing (StoredUiSettings, UiSettings)
import Data.UiTheme exposing (UiTheme) import Data.UiTheme exposing (UiTheme)
@ -26,18 +20,6 @@ port setAccount : AuthResult -> Cmd msg
port removeAccount : () -> Cmd msg port removeAccount : () -> Cmd msg
port saveUiSettings : ( AuthResult, StoredUiSettings ) -> Cmd msg
port receiveUiSettings : (StoredUiSettings -> msg) -> Sub msg
port requestUiSettings : ( AuthResult, StoredUiSettings ) -> Cmd msg
port uiSettingsSaved : (() -> msg) -> Sub msg
port internalSetUiTheme : String -> Cmd msg port internalSetUiTheme : String -> Cmd msg
@ -47,45 +29,9 @@ port checkSearchQueryString : String -> Cmd msg
port receiveCheckQueryResult : (QueryParseResult -> msg) -> Sub msg port receiveCheckQueryResult : (QueryParseResult -> msg) -> Sub msg
port initClipboard : ( String, String ) -> Cmd msg
setUiTheme : UiTheme -> Cmd msg setUiTheme : UiTheme -> Cmd msg
setUiTheme theme = setUiTheme theme =
internalSetUiTheme (Data.UiTheme.toString theme) internalSetUiTheme (Data.UiTheme.toString theme)
onUiSettingsSaved : msg -> Sub msg
onUiSettingsSaved m =
uiSettingsSaved (\_ -> m)
storeUiSettings : Flags -> UiSettings -> Cmd msg
storeUiSettings flags settings =
case flags.account of
Just ar ->
saveUiSettings
( ar
, Data.UiSettings.toStoredUiSettings settings
)
Nothing ->
Cmd.none
loadUiSettings : (UiSettings -> msg) -> Sub msg
loadUiSettings tagger =
receiveUiSettings (Data.UiSettings.mergeDefaults >> tagger)
getUiSettings : Flags -> Cmd msg
getUiSettings flags =
case flags.account of
Just ar ->
requestUiSettings
( ar
, Data.UiSettings.toStoredUiSettings Data.UiSettings.defaults
)
Nothing ->
Cmd.none
port initClipboard : ( String, String ) -> Cmd msg

View File

@ -1,6 +1,7 @@
module Util.Update exposing module Util.Update exposing
( andThen1 ( andThen1
, andThen2 , andThen2
, andThen3
, cmdUnit , cmdUnit
) )
@ -44,6 +45,21 @@ andThen2 fs m =
|> combine |> combine
andThen3 :
List (model -> { x | model : model, cmd : Cmd msg, sub : Sub msg })
-> model
-> ( model, Cmd msg, Sub msg )
andThen3 list m =
let
mkTuple r =
( r.model, r.cmd, r.sub )
list2 =
List.map (\e -> e >> mkTuple) list
in
andThen2 list2 m
cmdUnit : a -> Cmd a cmdUnit : a -> Cmd a
cmdUnit a = cmdUnit a =
Task.perform (\_ -> a) (Task.succeed ()) Task.perform (\_ -> a) (Task.succeed ())

View File

@ -51,42 +51,42 @@ elmApp.ports.removeAccount.subscribe(function() {
}); });
elmApp.ports.saveUiSettings.subscribe(function(args) { // elmApp.ports.saveUiSettings.subscribe(function(args) {
if (Array.isArray(args) && args.length == 2) { // if (Array.isArray(args) && args.length == 2) {
var authResult = args[0]; // var authResult = args[0];
var settings = args[1]; // var settings = args[1];
if (authResult && settings) { // if (authResult && settings) {
var key = authResult.collective + "/" + authResult.user + "/uiSettings"; // var key = authResult.collective + "/" + authResult.user + "/uiSettings";
console.log("Save ui settings to local storage"); // console.log("Save ui settings to local storage");
localStorage.setItem(key, JSON.stringify(settings)); // localStorage.setItem(key, JSON.stringify(settings));
elmApp.ports.receiveUiSettings.send(settings); // elmApp.ports.receiveUiSettings.send(settings);
elmApp.ports.uiSettingsSaved.send(null); // elmApp.ports.uiSettingsSaved.send(null);
} // }
} // }
}); // });
elmApp.ports.requestUiSettings.subscribe(function(args) { // elmApp.ports.requestUiSettings.subscribe(function(args) {
console.log("Requesting ui settings"); // console.log("Requesting ui settings");
if (Array.isArray(args) && args.length == 2) { // if (Array.isArray(args) && args.length == 2) {
var account = args[0]; // var account = args[0];
var defaults = args[1]; // var defaults = args[1];
var collective = account ? account.collective : null; // var collective = account ? account.collective : null;
var user = account ? account.user : null; // var user = account ? account.user : null;
if (collective && user) { // if (collective && user) {
var key = collective + "/" + user + "/uiSettings"; // var key = collective + "/" + user + "/uiSettings";
var settings = localStorage.getItem(key); // var settings = localStorage.getItem(key);
var data = settings ? JSON.parse(settings) : null; // var data = settings ? JSON.parse(settings) : null;
if (data && defaults) { // if (data && defaults) {
var defaults = extend(defaults, data); // var defaults = extend(defaults, data);
elmApp.ports.receiveUiSettings.send(defaults); // elmApp.ports.receiveUiSettings.send(defaults);
} else if (defaults) { // } else if (defaults) {
elmApp.ports.receiveUiSettings.send(defaults); // elmApp.ports.receiveUiSettings.send(defaults);
} // }
} else if (defaults) { // } else if (defaults) {
elmApp.ports.receiveUiSettings.send(defaults); // elmApp.ports.receiveUiSettings.send(defaults);
} // }
} // }
}); // });
var docspell_clipboards = {}; var docspell_clipboards = {};