mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-06-22 02:18:26 +00:00
Introduce ui settings and let user set page size for item search
This commit is contained in:
@ -6,7 +6,6 @@ module Page.Home.Data exposing
|
||||
, init
|
||||
, itemNav
|
||||
, resultsBelowLimit
|
||||
, searchLimit
|
||||
)
|
||||
|
||||
import Api
|
||||
@ -15,6 +14,7 @@ import Comp.ItemCardList
|
||||
import Comp.SearchMenu
|
||||
import Data.Flags exposing (Flags)
|
||||
import Data.Items
|
||||
import Data.UiSettings exposing (UiSettings)
|
||||
import Http
|
||||
|
||||
|
||||
@ -27,6 +27,7 @@ type alias Model =
|
||||
, searchOffset : Int
|
||||
, moreAvailable : Bool
|
||||
, moreInProgress : Bool
|
||||
, uiSettings : UiSettings
|
||||
}
|
||||
|
||||
|
||||
@ -40,6 +41,7 @@ init _ =
|
||||
, searchOffset = 0
|
||||
, moreAvailable = True
|
||||
, moreInProgress = False
|
||||
, uiSettings = Data.UiSettings.defaults
|
||||
}
|
||||
|
||||
|
||||
@ -49,9 +51,11 @@ type Msg
|
||||
| ResetSearch
|
||||
| ItemCardListMsg Comp.ItemCardList.Msg
|
||||
| ItemSearchResp (Result Http.Error ItemLightList)
|
||||
| ItemSearchAddResp (Result Http.Error ItemLightList)
|
||||
| DoSearch
|
||||
| ToggleSearchMenu
|
||||
| LoadMore
|
||||
| GetUiSettings UiSettings
|
||||
|
||||
|
||||
type ViewMode
|
||||
@ -73,24 +77,23 @@ itemNav id model =
|
||||
}
|
||||
|
||||
|
||||
searchLimit : Int
|
||||
searchLimit =
|
||||
90
|
||||
|
||||
|
||||
doSearchCmd : Flags -> Int -> Comp.SearchMenu.Model -> Cmd Msg
|
||||
doSearchCmd : Flags -> Int -> Model -> Cmd Msg
|
||||
doSearchCmd flags offset model =
|
||||
let
|
||||
smask =
|
||||
Comp.SearchMenu.getItemSearch model
|
||||
Comp.SearchMenu.getItemSearch model.searchMenuModel
|
||||
|
||||
mask =
|
||||
{ smask
|
||||
| limit = searchLimit
|
||||
| limit = model.uiSettings.itemSearchPageSize
|
||||
, offset = offset
|
||||
}
|
||||
in
|
||||
Api.itemSearch flags mask ItemSearchResp
|
||||
if offset == 0 then
|
||||
Api.itemSearch flags mask ItemSearchResp
|
||||
|
||||
else
|
||||
Api.itemSearch flags mask ItemSearchAddResp
|
||||
|
||||
|
||||
resultsBelowLimit : Model -> Bool
|
||||
@ -99,4 +102,4 @@ resultsBelowLimit model =
|
||||
len =
|
||||
Data.Items.length model.itemListModel.results
|
||||
in
|
||||
len < searchLimit
|
||||
len < model.uiSettings.itemSearchPageSize
|
||||
|
@ -15,7 +15,6 @@ update key flags msg model =
|
||||
Init ->
|
||||
Util.Update.andThen1
|
||||
[ update key flags (SearchMenuMsg Comp.SearchMenu.Init)
|
||||
, doSearch flags
|
||||
]
|
||||
model
|
||||
|
||||
@ -63,7 +62,22 @@ update key flags msg model =
|
||||
ItemSearchResp (Ok list) ->
|
||||
let
|
||||
noff =
|
||||
model.searchOffset + searchLimit
|
||||
model.uiSettings.itemSearchPageSize
|
||||
|
||||
m =
|
||||
{ model
|
||||
| searchInProgress = False
|
||||
, searchOffset = noff
|
||||
, viewMode = Listing
|
||||
, moreAvailable = list.groups /= []
|
||||
}
|
||||
in
|
||||
update key flags (ItemCardListMsg (Comp.ItemCardList.SetResults list)) m
|
||||
|
||||
ItemSearchAddResp (Ok list) ->
|
||||
let
|
||||
noff =
|
||||
model.searchOffset + model.uiSettings.itemSearchPageSize
|
||||
|
||||
m =
|
||||
{ model
|
||||
@ -74,11 +88,14 @@ update key flags msg model =
|
||||
, moreAvailable = list.groups /= []
|
||||
}
|
||||
in
|
||||
if model.searchOffset == 0 then
|
||||
update key flags (ItemCardListMsg (Comp.ItemCardList.SetResults list)) m
|
||||
update key flags (ItemCardListMsg (Comp.ItemCardList.AddResults list)) m
|
||||
|
||||
else
|
||||
update key flags (ItemCardListMsg (Comp.ItemCardList.AddResults list)) m
|
||||
ItemSearchAddResp (Err _) ->
|
||||
( { model
|
||||
| moreInProgress = False
|
||||
}
|
||||
, Cmd.none
|
||||
)
|
||||
|
||||
ItemSearchResp (Err _) ->
|
||||
( { model
|
||||
@ -106,12 +123,19 @@ update key flags msg model =
|
||||
else
|
||||
( model, Cmd.none )
|
||||
|
||||
GetUiSettings settings ->
|
||||
let
|
||||
m_ =
|
||||
{ model | uiSettings = settings }
|
||||
in
|
||||
doSearch flags m_
|
||||
|
||||
|
||||
doSearch : Flags -> Model -> ( Model, Cmd Msg )
|
||||
doSearch flags model =
|
||||
let
|
||||
cmd =
|
||||
doSearchCmd flags 0 model.searchMenuModel
|
||||
doSearchCmd flags 0 model
|
||||
in
|
||||
( { model
|
||||
| searchInProgress = True
|
||||
@ -126,7 +150,7 @@ doSearchMore : Flags -> Model -> ( Model, Cmd Msg )
|
||||
doSearchMore flags model =
|
||||
let
|
||||
cmd =
|
||||
doSearchCmd flags model.searchOffset model.searchMenuModel
|
||||
doSearchCmd flags model.searchOffset model
|
||||
in
|
||||
( { model | moreInProgress = True, viewMode = Listing }
|
||||
, cmd
|
||||
|
@ -10,7 +10,9 @@ import Comp.EmailSettingsManage
|
||||
import Comp.ImapSettingsManage
|
||||
import Comp.NotificationForm
|
||||
import Comp.ScanMailboxManage
|
||||
import Comp.UiSettingsManage
|
||||
import Data.Flags exposing (Flags)
|
||||
import Data.UiSettings exposing (UiSettings)
|
||||
|
||||
|
||||
type alias Model =
|
||||
@ -20,6 +22,7 @@ type alias Model =
|
||||
, imapSettingsModel : Comp.ImapSettingsManage.Model
|
||||
, notificationModel : Comp.NotificationForm.Model
|
||||
, scanMailboxModel : Comp.ScanMailboxManage.Model
|
||||
, uiSettingsModel : Comp.UiSettingsManage.Model
|
||||
}
|
||||
|
||||
|
||||
@ -31,6 +34,7 @@ emptyModel flags =
|
||||
, imapSettingsModel = Comp.ImapSettingsManage.emptyModel
|
||||
, notificationModel = Tuple.first (Comp.NotificationForm.init flags)
|
||||
, scanMailboxModel = Tuple.first (Comp.ScanMailboxManage.init flags)
|
||||
, uiSettingsModel = Comp.UiSettingsManage.init Data.UiSettings.defaults
|
||||
}
|
||||
|
||||
|
||||
@ -40,6 +44,7 @@ type Tab
|
||||
| ImapSettingsTab
|
||||
| NotificationTab
|
||||
| ScanMailboxTab
|
||||
| UiSettingsTab
|
||||
|
||||
|
||||
type Msg
|
||||
@ -49,3 +54,5 @@ type Msg
|
||||
| NotificationMsg Comp.NotificationForm.Msg
|
||||
| ImapSettingsMsg Comp.ImapSettingsManage.Msg
|
||||
| ScanMailboxMsg Comp.ScanMailboxManage.Msg
|
||||
| GetUiSettings UiSettings
|
||||
| UiSettingsMsg Comp.UiSettingsManage.Msg
|
||||
|
@ -5,75 +5,76 @@ import Comp.EmailSettingsManage
|
||||
import Comp.ImapSettingsManage
|
||||
import Comp.NotificationForm
|
||||
import Comp.ScanMailboxManage
|
||||
import Comp.UiSettingsManage
|
||||
import Data.Flags exposing (Flags)
|
||||
import Page.UserSettings.Data exposing (..)
|
||||
|
||||
|
||||
update : Flags -> Msg -> Model -> ( Model, Cmd Msg )
|
||||
update : Flags -> Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
|
||||
update flags msg model =
|
||||
case msg of
|
||||
SetTab t ->
|
||||
let
|
||||
m =
|
||||
{ model | currentTab = Just t }
|
||||
|
||||
( m2, cmd ) =
|
||||
case t of
|
||||
EmailSettingsTab ->
|
||||
let
|
||||
( em, c ) =
|
||||
Comp.EmailSettingsManage.init flags
|
||||
in
|
||||
( { m | emailSettingsModel = em }, Cmd.map EmailSettingsMsg c )
|
||||
|
||||
ImapSettingsTab ->
|
||||
let
|
||||
( em, c ) =
|
||||
Comp.ImapSettingsManage.init flags
|
||||
in
|
||||
( { m | imapSettingsModel = em }, Cmd.map ImapSettingsMsg c )
|
||||
|
||||
ChangePassTab ->
|
||||
( m, Cmd.none )
|
||||
|
||||
NotificationTab ->
|
||||
let
|
||||
initCmd =
|
||||
Cmd.map NotificationMsg
|
||||
(Tuple.second (Comp.NotificationForm.init flags))
|
||||
in
|
||||
( m, initCmd )
|
||||
|
||||
ScanMailboxTab ->
|
||||
let
|
||||
initCmd =
|
||||
Cmd.map ScanMailboxMsg
|
||||
(Tuple.second (Comp.ScanMailboxManage.init flags))
|
||||
in
|
||||
( m, initCmd )
|
||||
in
|
||||
( m2, cmd )
|
||||
case t of
|
||||
EmailSettingsTab ->
|
||||
let
|
||||
( em, c ) =
|
||||
Comp.EmailSettingsManage.init flags
|
||||
in
|
||||
( { m | emailSettingsModel = em }, Cmd.map EmailSettingsMsg c, Sub.none )
|
||||
|
||||
ImapSettingsTab ->
|
||||
let
|
||||
( em, c ) =
|
||||
Comp.ImapSettingsManage.init flags
|
||||
in
|
||||
( { m | imapSettingsModel = em }, Cmd.map ImapSettingsMsg c, Sub.none )
|
||||
|
||||
ChangePassTab ->
|
||||
( m, Cmd.none, Sub.none )
|
||||
|
||||
NotificationTab ->
|
||||
let
|
||||
initCmd =
|
||||
Cmd.map NotificationMsg
|
||||
(Tuple.second (Comp.NotificationForm.init flags))
|
||||
in
|
||||
( m, initCmd, Sub.none )
|
||||
|
||||
ScanMailboxTab ->
|
||||
let
|
||||
initCmd =
|
||||
Cmd.map ScanMailboxMsg
|
||||
(Tuple.second (Comp.ScanMailboxManage.init flags))
|
||||
in
|
||||
( m, initCmd, Sub.none )
|
||||
|
||||
UiSettingsTab ->
|
||||
( m, Cmd.none, Sub.none )
|
||||
|
||||
ChangePassMsg m ->
|
||||
let
|
||||
( m2, c2 ) =
|
||||
Comp.ChangePasswordForm.update flags m model.changePassModel
|
||||
in
|
||||
( { model | changePassModel = m2 }, Cmd.map ChangePassMsg c2 )
|
||||
( { model | changePassModel = m2 }, Cmd.map ChangePassMsg c2, Sub.none )
|
||||
|
||||
EmailSettingsMsg m ->
|
||||
let
|
||||
( m2, c2 ) =
|
||||
Comp.EmailSettingsManage.update flags m model.emailSettingsModel
|
||||
in
|
||||
( { model | emailSettingsModel = m2 }, Cmd.map EmailSettingsMsg c2 )
|
||||
( { model | emailSettingsModel = m2 }, Cmd.map EmailSettingsMsg c2, Sub.none )
|
||||
|
||||
ImapSettingsMsg m ->
|
||||
let
|
||||
( m2, c2 ) =
|
||||
Comp.ImapSettingsManage.update flags m model.imapSettingsModel
|
||||
in
|
||||
( { model | imapSettingsModel = m2 }, Cmd.map ImapSettingsMsg c2 )
|
||||
( { model | imapSettingsModel = m2 }, Cmd.map ImapSettingsMsg c2, Sub.none )
|
||||
|
||||
NotificationMsg lm ->
|
||||
let
|
||||
@ -82,6 +83,7 @@ update flags msg model =
|
||||
in
|
||||
( { model | notificationModel = m2 }
|
||||
, Cmd.map NotificationMsg c2
|
||||
, Sub.none
|
||||
)
|
||||
|
||||
ScanMailboxMsg lm ->
|
||||
@ -91,4 +93,21 @@ update flags msg model =
|
||||
in
|
||||
( { model | scanMailboxModel = m2 }
|
||||
, Cmd.map ScanMailboxMsg c2
|
||||
, Sub.none
|
||||
)
|
||||
|
||||
GetUiSettings settings ->
|
||||
( { model | uiSettingsModel = Comp.UiSettingsManage.init settings }
|
||||
, Cmd.none
|
||||
, Sub.none
|
||||
)
|
||||
|
||||
UiSettingsMsg lm ->
|
||||
let
|
||||
( m2, c2, s2 ) =
|
||||
Comp.UiSettingsManage.update flags lm model.uiSettingsModel
|
||||
in
|
||||
( { model | uiSettingsModel = m2 }
|
||||
, Cmd.map UiSettingsMsg c2
|
||||
, Sub.map UiSettingsMsg s2
|
||||
)
|
||||
|
@ -5,6 +5,7 @@ import Comp.EmailSettingsManage
|
||||
import Comp.ImapSettingsManage
|
||||
import Comp.NotificationForm
|
||||
import Comp.ScanMailboxManage
|
||||
import Comp.UiSettingsManage
|
||||
import Html exposing (..)
|
||||
import Html.Attributes exposing (..)
|
||||
import Html.Events exposing (onClick)
|
||||
@ -26,6 +27,7 @@ view model =
|
||||
, makeTab model ImapSettingsTab "E-Mail Settings (IMAP)" "mail icon"
|
||||
, makeTab model NotificationTab "Notification Task" "bullhorn icon"
|
||||
, makeTab model ScanMailboxTab "Scan Mailbox Task" "envelope open outline icon"
|
||||
, makeTab model UiSettingsTab "UI Settings" "cog icon"
|
||||
]
|
||||
]
|
||||
]
|
||||
@ -47,6 +49,9 @@ view model =
|
||||
Just ScanMailboxTab ->
|
||||
viewScanMailboxManage model
|
||||
|
||||
Just UiSettingsTab ->
|
||||
viewUiSettings model
|
||||
|
||||
Nothing ->
|
||||
[]
|
||||
)
|
||||
@ -66,6 +71,20 @@ makeTab model tab header icon =
|
||||
]
|
||||
|
||||
|
||||
viewUiSettings : Model -> List (Html Msg)
|
||||
viewUiSettings model =
|
||||
[ h2 [ class "ui header" ]
|
||||
[ i [ class "cog icon" ] []
|
||||
, text "UI Settings"
|
||||
]
|
||||
, p []
|
||||
[ text "These settings only affect the web ui. They are stored in the browser, "
|
||||
, text "so they are separated between browsers and devices."
|
||||
]
|
||||
, Html.map UiSettingsMsg (Comp.UiSettingsManage.view "ui segment" model.uiSettingsModel)
|
||||
]
|
||||
|
||||
|
||||
viewEmailSettings : Model -> List (Html Msg)
|
||||
viewEmailSettings model =
|
||||
[ h2 [ class "ui header" ]
|
||||
|
Reference in New Issue
Block a user