mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-04-05 10:59:33 +00:00
215 lines
5.9 KiB
Elm
215 lines
5.9 KiB
Elm
{-
|
|
Copyright 2020 Eike K. & Contributors
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-or-later
|
|
-}
|
|
|
|
|
|
module App.Data exposing
|
|
( Model
|
|
, Msg(..)
|
|
, defaultPage
|
|
, getUiLanguage
|
|
, init
|
|
)
|
|
|
|
import Api.Model.AuthResult exposing (AuthResult)
|
|
import Api.Model.BasicResult exposing (BasicResult)
|
|
import Api.Model.VersionInfo exposing (VersionInfo)
|
|
import Browser exposing (UrlRequest)
|
|
import Browser.Navigation exposing (Key)
|
|
import Data.Flags exposing (Flags)
|
|
import Data.ServerEvent exposing (ServerEvent)
|
|
import Data.UiSettings exposing (StoredUiSettings, UiSettings)
|
|
import Data.UiTheme exposing (UiTheme)
|
|
import Http
|
|
import Messages.UiLanguage exposing (UiLanguage)
|
|
import Page exposing (Page(..))
|
|
import Page.CollectiveSettings.Data
|
|
import Page.ItemDetail.Data
|
|
import Page.Login.Data
|
|
import Page.ManageData.Data
|
|
import Page.NewInvite.Data
|
|
import Page.Queue.Data
|
|
import Page.Register.Data
|
|
import Page.Search.Data
|
|
import Page.Share.Data
|
|
import Page.ShareDetail.Data
|
|
import Page.Upload.Data
|
|
import Page.UserSettings.Data
|
|
import Url exposing (Url)
|
|
|
|
|
|
type alias Model =
|
|
{ flags : Flags
|
|
, key : Key
|
|
, page : Page
|
|
, version : VersionInfo
|
|
, searchModel : Page.Search.Data.Model
|
|
, loginModel : Page.Login.Data.Model
|
|
, manageDataModel : Page.ManageData.Data.Model
|
|
, collSettingsModel : Page.CollectiveSettings.Data.Model
|
|
, userSettingsModel : Page.UserSettings.Data.Model
|
|
, queueModel : Page.Queue.Data.Model
|
|
, registerModel : Page.Register.Data.Model
|
|
, uploadModel : Page.Upload.Data.Model
|
|
, newInviteModel : Page.NewInvite.Data.Model
|
|
, itemDetailModel : Page.ItemDetail.Data.Model
|
|
, shareModel : Page.Share.Data.Model
|
|
, shareDetailModel : Page.ShareDetail.Data.Model
|
|
, navMenuOpen : Bool
|
|
, userMenuOpen : Bool
|
|
, subs : Sub Msg
|
|
, uiSettings : UiSettings
|
|
, sidebarVisible : Bool
|
|
, anonymousTheme : UiTheme
|
|
, anonymousUiLang : UiLanguage
|
|
, langMenuOpen : Bool
|
|
, showNewItemsArrived : Bool
|
|
, jobsWaiting : Int
|
|
}
|
|
|
|
|
|
init : Key -> Url -> Flags -> UiSettings -> ( Model, Cmd Msg )
|
|
init key url flags_ settings =
|
|
let
|
|
flags =
|
|
initBaseUrl url flags_
|
|
|
|
page =
|
|
Page.fromUrl url
|
|
|> Maybe.withDefault (defaultPage flags)
|
|
|
|
( um, uc ) =
|
|
Page.UserSettings.Data.init flags settings
|
|
|
|
( mdm, mdc ) =
|
|
Page.ManageData.Data.init flags
|
|
|
|
( csm, csc ) =
|
|
Page.CollectiveSettings.Data.init flags
|
|
|
|
( loginm, loginc ) =
|
|
Page.Login.Data.init flags (Page.loginPageReferrer page)
|
|
|
|
( shm, shc ) =
|
|
Page.Share.Data.init (Page.pageShareId page) flags
|
|
|
|
( sdm, sdc ) =
|
|
Page.ShareDetail.Data.init (Page.pageShareDetail page) flags
|
|
|
|
searchViewMode =
|
|
if settings.searchMenuVisible then
|
|
Page.Search.Data.SearchView
|
|
|
|
else
|
|
Page.Search.Data.SimpleView
|
|
in
|
|
( { flags = flags
|
|
, key = key
|
|
, page = page
|
|
, version = Api.Model.VersionInfo.empty
|
|
, searchModel = Page.Search.Data.init flags searchViewMode
|
|
, loginModel = loginm
|
|
, manageDataModel = mdm
|
|
, collSettingsModel = csm
|
|
, userSettingsModel = um
|
|
, queueModel = Page.Queue.Data.emptyModel
|
|
, registerModel = Page.Register.Data.emptyModel
|
|
, uploadModel = Page.Upload.Data.emptyModel
|
|
, newInviteModel = Page.NewInvite.Data.emptyModel
|
|
, itemDetailModel = Page.ItemDetail.Data.emptyModel
|
|
, shareModel = shm
|
|
, shareDetailModel = sdm
|
|
, navMenuOpen = False
|
|
, userMenuOpen = False
|
|
, subs = Sub.none
|
|
, uiSettings = settings
|
|
, sidebarVisible = flags.innerWidth > 768 && settings.sideMenuVisible
|
|
, anonymousTheme = Data.UiTheme.Light
|
|
, anonymousUiLang = Messages.UiLanguage.English
|
|
, langMenuOpen = False
|
|
, showNewItemsArrived = False
|
|
, jobsWaiting = 0
|
|
}
|
|
, Cmd.batch
|
|
[ Cmd.map UserSettingsMsg uc
|
|
, Cmd.map ManageDataMsg mdc
|
|
, Cmd.map CollSettingsMsg csc
|
|
, Cmd.map LoginMsg loginc
|
|
, Cmd.map ShareMsg shc
|
|
, Cmd.map ShareDetailMsg sdc
|
|
]
|
|
)
|
|
|
|
|
|
initBaseUrl : Url -> Flags -> Flags
|
|
initBaseUrl url flags_ =
|
|
let
|
|
cfg =
|
|
flags_.config
|
|
|
|
baseUrl =
|
|
if cfg.baseUrl == "" then
|
|
Url.toString
|
|
{ url
|
|
| path = ""
|
|
, query = Nothing
|
|
, fragment = Nothing
|
|
}
|
|
|
|
else
|
|
cfg.baseUrl
|
|
|
|
cfgNew =
|
|
{ cfg | baseUrl = baseUrl }
|
|
in
|
|
{ flags_ | config = cfgNew }
|
|
|
|
|
|
type Msg
|
|
= NavRequest UrlRequest
|
|
| NavChange Url
|
|
| VersionResp (Result Http.Error VersionInfo)
|
|
| SearchMsg Page.Search.Data.Msg
|
|
| LoginMsg Page.Login.Data.Msg
|
|
| ManageDataMsg Page.ManageData.Data.Msg
|
|
| CollSettingsMsg Page.CollectiveSettings.Data.Msg
|
|
| UserSettingsMsg Page.UserSettings.Data.Msg
|
|
| QueueMsg Page.Queue.Data.Msg
|
|
| RegisterMsg Page.Register.Data.Msg
|
|
| UploadMsg Page.Upload.Data.Msg
|
|
| NewInviteMsg Page.NewInvite.Data.Msg
|
|
| ItemDetailMsg Page.ItemDetail.Data.Msg
|
|
| ShareMsg Page.Share.Data.Msg
|
|
| ShareDetailMsg Page.ShareDetail.Data.Msg
|
|
| Logout
|
|
| LogoutResp (Result Http.Error ())
|
|
| SessionCheckResp (Result Http.Error AuthResult)
|
|
| ToggleNavMenu
|
|
| ToggleUserMenu
|
|
| GetUiSettings (Result Http.Error UiSettings)
|
|
| ToggleSidebar
|
|
| ToggleDarkMode
|
|
| ToggleLangMenu
|
|
| SetLanguage UiLanguage
|
|
| ClientSettingsSaveResp UiSettings (Result Http.Error BasicResult)
|
|
| ReceiveBrowserSettings StoredUiSettings
|
|
| ReceiveWsMessage (Result String ServerEvent)
|
|
| ToggleShowNewItemsArrived
|
|
|
|
|
|
defaultPage : Flags -> Page
|
|
defaultPage _ =
|
|
SearchPage
|
|
|
|
|
|
getUiLanguage : Model -> UiLanguage
|
|
getUiLanguage model =
|
|
case model.flags.account of
|
|
Just _ ->
|
|
model.uiSettings.uiLang
|
|
|
|
Nothing ->
|
|
model.anonymousUiLang
|