Store item selection globally

This commit is contained in:
eikek 2022-02-27 15:00:34 +01:00
parent 203788c746
commit 63e0258db7
13 changed files with 458 additions and 311 deletions

@ -1727,42 +1727,42 @@ mergeItems flags items receive =
reprocessMultiple :
Flags
-> Set String
-> List String
-> (Result Http.Error BasicResult -> msg)
-> Cmd msg
reprocessMultiple flags items receive =
Http2.authPost
{ url = flags.config.baseUrl ++ "/api/v1/sec/items/reprocess"
, account = getAccount flags
, body = Http.jsonBody (Api.Model.IdList.encode (Set.toList items |> IdList))
, body = Http.jsonBody (Api.Model.IdList.encode (IdList items))
, expect = Http.expectJson receive Api.Model.BasicResult.decoder
}
confirmMultiple :
Flags
-> Set String
-> List String
-> (Result Http.Error BasicResult -> msg)
-> Cmd msg
confirmMultiple flags ids receive =
Http2.authPut
{ url = flags.config.baseUrl ++ "/api/v1/sec/items/confirm"
, account = getAccount flags
, body = Http.jsonBody (Api.Model.IdList.encode (IdList (Set.toList ids)))
, body = Http.jsonBody (Api.Model.IdList.encode (IdList ids))
, expect = Http.expectJson receive Api.Model.BasicResult.decoder
}
unconfirmMultiple :
Flags
-> Set String
-> List String
-> (Result Http.Error BasicResult -> msg)
-> Cmd msg
unconfirmMultiple flags ids receive =
Http2.authPut
{ url = flags.config.baseUrl ++ "/api/v1/sec/items/unconfirm"
, account = getAccount flags
, body = Http.jsonBody (Api.Model.IdList.encode (IdList (Set.toList ids)))
, body = Http.jsonBody (Api.Model.IdList.encode (IdList ids))
, expect = Http.expectJson receive Api.Model.BasicResult.decoder
}
@ -1937,28 +1937,28 @@ setConcEquipmentMultiple flags data receive =
deleteAllItems :
Flags
-> Set String
-> List String
-> (Result Http.Error BasicResult -> msg)
-> Cmd msg
deleteAllItems flags ids receive =
Http2.authPost
{ url = flags.config.baseUrl ++ "/api/v1/sec/items/deleteAll"
, account = getAccount flags
, body = Http.jsonBody (Api.Model.IdList.encode (IdList (Set.toList ids)))
, body = Http.jsonBody (Api.Model.IdList.encode (IdList ids))
, expect = Http.expectJson receive Api.Model.BasicResult.decoder
}
restoreAllItems :
Flags
-> Set String
-> List String
-> (Result Http.Error BasicResult -> msg)
-> Cmd msg
restoreAllItems flags ids receive =
Http2.authPost
{ url = flags.config.baseUrl ++ "/api/v1/sec/items/restoreAll"
, account = getAccount flags
, body = Http.jsonBody (Api.Model.IdList.encode (IdList (Set.toList ids)))
, body = Http.jsonBody (Api.Model.IdList.encode (IdList ids))
, expect = Http.expectJson receive Api.Model.BasicResult.decoder
}

@ -19,6 +19,7 @@ import Api.Model.VersionInfo exposing (VersionInfo)
import Browser exposing (UrlRequest)
import Browser.Navigation exposing (Key)
import Data.Flags exposing (Flags)
import Data.ItemIds exposing (ItemIds)
import Data.ServerEvent exposing (ServerEvent)
import Data.UiSettings exposing (UiSettings)
import Data.UiTheme exposing (UiTheme)
@ -69,6 +70,7 @@ type alias Model =
, langMenuOpen : Bool
, showNewItemsArrived : Bool
, jobsWaiting : Int
, selectedItems : ItemIds
}
@ -133,6 +135,7 @@ init key url flags_ settings =
, langMenuOpen = False
, showNewItemsArrived = False
, jobsWaiting = 0
, selectedItems = Data.ItemIds.empty
}
, Cmd.batch
[ Cmd.map DashboardMsg dbc

@ -584,11 +584,20 @@ updateSearch texts lmsg model =
_ ->
( Nothing, Nothing )
env =
{ bookmarkId = bmId
, lastViewedItemId = mid
, key = model.key
, selectedItems = model.selectedItems
, flags = model.flags
, settings = model.uiSettings
}
result =
Page.Search.Update.update bmId mid model.key model.flags texts.search model.uiSettings lmsg model.searchModel
Page.Search.Update.update texts.search env lmsg model.searchModel
model_ =
{ model | searchModel = result.model }
{ model | searchModel = result.model, selectedItems = result.selectedItems }
lc =
case result.appEvent of

@ -549,17 +549,22 @@ viewShareDetail texts shareId itemId model =
viewSearch : Messages -> Maybe String -> Model -> List (Html Msg)
viewSearch texts bmId model =
let
env =
{ sidebarVisible = model.sidebarVisible
, flags = model.flags
, settings = model.uiSettings
, selectedItems = model.selectedItems
}
in
[ Html.map SearchMsg
(Search.viewSidebar texts.search
model.sidebarVisible
model.flags
model.uiSettings
env
model.searchModel
)
, Html.map SearchMsg
(Search.viewContent texts.search
model.flags
model.uiSettings
env
model.searchModel
)
]

@ -24,6 +24,7 @@ import Data.Fields
import Data.Flags exposing (Flags)
import Data.Icons as Icons
import Data.ItemArrange exposing (ItemArrange)
import Data.ItemIds exposing (ItemIdChange, ItemIds)
import Data.ItemSelection exposing (ItemSelection)
import Data.ItemTemplate as IT
import Data.UiSettings exposing (UiSettings)
@ -49,7 +50,7 @@ type alias Model =
type Msg
= CyclePreview ItemLight
| ToggleSelectItem (Set String) String
| ToggleSelectItem ItemIds String
| ItemDDMsg DD.Msg
| SetLinkTarget LinkTarget
| ToggleRowOpen String
@ -70,7 +71,7 @@ type alias ViewConfig =
type alias UpdateResult =
{ model : Model
, dragModel : DD.Model
, selection : ItemSelection
, selection : ItemIdChange
, linkTarget : LinkTarget
, toggleRow : Maybe String
}
@ -117,25 +118,21 @@ update : DD.Model -> Msg -> Model -> UpdateResult
update ddm msg model =
case msg of
ToggleRowOpen id ->
UpdateResult model ddm Data.ItemSelection.Inactive LinkNone (Just id)
UpdateResult model ddm Data.ItemIds.noChange LinkNone (Just id)
ItemDDMsg lm ->
let
ddd =
DD.update lm ddm
in
UpdateResult model ddd.model Data.ItemSelection.Inactive LinkNone Nothing
UpdateResult model ddd.model Data.ItemIds.noChange LinkNone Nothing
ToggleSelectItem ids id ->
let
newSet =
if Set.member id ids then
Set.remove id ids
else
Set.insert id ids
Data.ItemIds.toggle ids id
in
UpdateResult model ddm (Data.ItemSelection.Active newSet) LinkNone Nothing
UpdateResult model ddm newSet LinkNone Nothing
CyclePreview item ->
let
@ -147,12 +144,12 @@ update ddm msg model =
in
UpdateResult { model | previewAttach = next }
ddm
Data.ItemSelection.Inactive
Data.ItemIds.noChange
LinkNone
Nothing
SetLinkTarget target ->
UpdateResult model ddm Data.ItemSelection.Inactive target Nothing
UpdateResult model ddm Data.ItemIds.noChange target Nothing
@ -532,7 +529,7 @@ viewCard texts cfg settings flags model item =
mkCardAction : Texts -> ViewConfig -> UiSettings -> ItemLight -> List (Attribute Msg)
mkCardAction texts cfg settings item =
mkCardAction texts cfg _ item =
case cfg.selection of
Data.ItemSelection.Inactive ->
case cfg.arrange of
@ -977,7 +974,7 @@ isSelected : ViewConfig -> String -> Bool
isSelected cfg id =
case cfg.selection of
Data.ItemSelection.Active ids ->
Set.member id ids
Data.ItemIds.isMember ids id
Data.ItemSelection.Inactive ->
False

@ -25,6 +25,7 @@ import Comp.ItemCard
import Comp.LinkTarget exposing (LinkTarget)
import Data.Flags exposing (Flags)
import Data.ItemArrange exposing (ItemArrange)
import Data.ItemIds exposing (ItemIdChange)
import Data.ItemSelection exposing (ItemSelection)
import Data.Items
import Data.UiSettings exposing (UiSettings)
@ -83,7 +84,7 @@ type alias UpdateResult =
{ model : Model
, cmd : Cmd Msg
, dragModel : DD.Model
, selection : ItemSelection
, selection : ItemIdChange
, linkTarget : LinkTarget
, toggleOpenRow : Maybe String
}
@ -105,7 +106,7 @@ updateDrag dm _ msg model =
UpdateResult newModel
Cmd.none
dm
Data.ItemSelection.Inactive
Data.ItemIds.noChange
Comp.LinkTarget.LinkNone
Nothing
@ -114,7 +115,7 @@ updateDrag dm _ msg model =
UpdateResult model
Cmd.none
dm
Data.ItemSelection.Inactive
Data.ItemIds.noChange
Comp.LinkTarget.LinkNone
Nothing
@ -126,7 +127,7 @@ updateDrag dm _ msg model =
UpdateResult newModel
Cmd.none
dm
Data.ItemSelection.Inactive
Data.ItemIds.noChange
Comp.LinkTarget.LinkNone
Nothing
@ -153,7 +154,7 @@ updateDrag dm _ msg model =
UpdateResult { model | results = removeItemById id model.results }
Cmd.none
dm
Data.ItemSelection.Inactive
Data.ItemIds.noChange
Comp.LinkTarget.LinkNone
Nothing

@ -24,8 +24,8 @@ import Api.Model.ItemsAndRefs exposing (ItemsAndRefs)
import Api.Model.ReferenceList exposing (ReferenceList)
import Data.Direction exposing (Direction)
import Data.Flags exposing (Flags)
import Data.ItemIds exposing (ItemIds)
import Http
import Set exposing (Set)
type FormChange
@ -49,14 +49,14 @@ type FormChange
multiUpdate :
Flags
-> Set String
-> ItemIds
-> FormChange
-> (Result Http.Error BasicResult -> msg)
-> Cmd msg
multiUpdate flags ids change receive =
let
items =
Set.toList ids
Data.ItemIds.toList ids
in
case change of
CustomValueChange field value ->
@ -159,10 +159,10 @@ multiUpdate flags ids change receive =
ConfirmChange flag ->
if flag then
Api.confirmMultiple flags ids receive
Api.confirmMultiple flags items receive
else
Api.unconfirmMultiple flags ids receive
Api.unconfirmMultiple flags items receive
NoFormChange ->
Cmd.none

@ -0,0 +1,31 @@
{-
Copyright 2020 Eike K. & Contributors
SPDX-License-Identifier: AGPL-3.0-or-later
-}
module Data.Environment exposing (..)
import Browser.Navigation as Nav
import Data.Flags exposing (Flags)
import Data.ItemIds exposing (ItemIds)
import Data.UiSettings exposing (UiSettings)
type alias Update =
{ bookmarkId : Maybe String
, lastViewedItemId : Maybe String
, key : Nav.Key
, selectedItems : ItemIds
, flags : Flags
, settings : UiSettings
}
type alias View =
{ flags : Flags
, sidebarVisible : Bool
, settings : UiSettings
, selectedItems : ItemIds
}

@ -0,0 +1,132 @@
{-
Copyright 2020 Eike K. & Contributors
SPDX-License-Identifier: AGPL-3.0-or-later
-}
module Data.ItemIds exposing
( ItemIdChange
, ItemIds
, apply
, combine
, combineAll
, deselect
, empty
, fromSet
, isEmpty
, isMember
, noChange
, select
, selectAll
, size
, toList
, toQuery
, toggle
, union
)
import Data.ItemQuery exposing (ItemQuery)
import Set exposing (Set)
type ItemIds
= ItemIds (Set String)
empty : ItemIds
empty =
ItemIds Set.empty
isEmpty : ItemIds -> Bool
isEmpty (ItemIds ids) =
Set.isEmpty ids
isMember : ItemIds -> String -> Bool
isMember (ItemIds ids) id =
Set.member id ids
size : ItemIds -> Int
size (ItemIds ids) =
Set.size ids
fromSet : Set String -> ItemIds
fromSet ids =
ItemIds ids
union : ItemIds -> ItemIds -> ItemIds
union (ItemIds ids1) (ItemIds ids2) =
ItemIds (Set.union ids1 ids2)
toList : ItemIds -> List String
toList (ItemIds ids) =
Set.toList ids
toQuery : ItemIds -> ItemQuery
toQuery (ItemIds ids) =
Data.ItemQuery.ItemIdIn (Set.toList ids)
--- Change item ids
type ItemIdChange
= ItemIdChange
{ remove : Set String
, add : Set String
}
apply : ItemIds -> ItemIdChange -> ItemIds
apply (ItemIds ids) (ItemIdChange { remove, add }) =
ItemIds (Set.diff ids remove |> Set.union add)
noChange : ItemIdChange
noChange =
ItemIdChange { remove = Set.empty, add = Set.empty }
combine : ItemIdChange -> ItemIdChange -> ItemIdChange
combine (ItemIdChange c1) (ItemIdChange c2) =
ItemIdChange
{ remove = Set.union c1.remove c2.remove
, add = Set.union c1.add c2.add
}
combineAll : List ItemIdChange -> ItemIdChange
combineAll all =
List.foldl combine noChange all
select : String -> ItemIdChange
select id =
ItemIdChange { add = Set.singleton id, remove = Set.empty }
selectAll : Set String -> ItemIdChange
selectAll ids =
ItemIdChange { add = ids, remove = Set.empty }
deselect : String -> ItemIdChange
deselect id =
ItemIdChange { add = Set.empty, remove = Set.singleton id }
toggle : ItemIds -> String -> ItemIdChange
toggle ids id =
if isMember ids id then
deselect id
else
select id

@ -11,12 +11,12 @@ module Data.ItemSelection exposing
, isSelected
)
import Set exposing (Set)
import Data.ItemIds exposing (ItemIds)
type ItemSelection
= Inactive
| Active (Set String)
| Active ItemIds
isSelected : String -> ItemSelection -> Bool
@ -26,7 +26,7 @@ isSelected id set =
False
Active ids ->
Set.member id ids
Data.ItemIds.isMember ids id
isActive : ItemSelection -> Bool

@ -84,8 +84,7 @@ type ConfirmModalValue
type alias SelectViewModel =
{ ids : Set String
, action : SelectActionMode
{ action : SelectActionMode
, confirmModal : Maybe ConfirmModalValue
, editModel : Comp.ItemDetail.MultiEditMenu.Model
, mergeModel : Comp.ItemMerge.Model
@ -97,8 +96,7 @@ type alias SelectViewModel =
initSelectViewModel : Flags -> SelectViewModel
initSelectViewModel flags =
{ ids = Set.empty
, action = NoneAction
{ action = NoneAction
, confirmModal = Nothing
, editModel = Comp.ItemDetail.MultiEditMenu.init
, mergeModel = Comp.ItemMerge.init []

File diff suppressed because it is too large Load Diff

@ -18,9 +18,11 @@ import Comp.PowerSearchInput
import Comp.PublishItems
import Comp.SearchMenu
import Comp.SearchStatsView
import Data.Environment as Env
import Data.Flags exposing (Flags)
import Data.Icons as Icons
import Data.ItemArrange
import Data.ItemIds exposing (ItemIds)
import Data.ItemSelection
import Data.SearchMode
import Data.UiSettings exposing (UiSettings)
@ -36,27 +38,27 @@ import Styles as S
import Util.Html
viewSidebar : Texts -> Bool -> Flags -> UiSettings -> Model -> Html Msg
viewSidebar texts visible flags settings model =
viewSidebar : Texts -> Env.View -> Model -> Html Msg
viewSidebar texts env model =
div
[ id "sidebar"
, class S.sidebar
, class S.sidebarBg
, classList [ ( "hidden", not visible ) ]
, classList [ ( "hidden", not env.sidebarVisible ) ]
]
[ Page.Search.SideMenu.view texts.sideMenu flags settings model
[ Page.Search.SideMenu.view texts.sideMenu env.flags env.settings model
]
viewContent : Texts -> Flags -> UiSettings -> Model -> Html Msg
viewContent texts flags settings model =
viewContent : Texts -> Env.View -> Model -> Html Msg
viewContent texts env model =
div
[ id "item-card-list" -- this id is used in scroll-to-card
, class S.content
]
(searchStats texts flags settings model
++ itemsBar texts flags settings model
++ mainView texts flags settings model
(searchStats texts env.flags env.settings model
++ itemsBar texts env model
++ mainView texts env model
++ confirmModal texts model
)
@ -65,8 +67,8 @@ viewContent texts flags settings model =
--- Helpers
mainView : Texts -> Flags -> UiSettings -> Model -> List (Html Msg)
mainView texts flags settings model =
mainView : Texts -> Env.View -> Model -> List (Html Msg)
mainView texts env model =
let
otherView =
case model.viewMode of
@ -75,13 +77,13 @@ mainView texts flags settings model =
MergeSelected ->
Just
[ div [ class "sm:relative mb-2" ]
(itemMergeView texts settings svm)
(itemMergeView texts env.settings svm)
]
PublishSelected ->
Just
[ div [ class "sm:relative mb-2" ]
(itemPublishView texts settings flags svm)
(itemPublishView texts env.settings env.flags svm)
]
_ ->
@ -90,7 +92,7 @@ mainView texts flags settings model =
PublishView pm ->
Just
[ div [ class "sm:relative mb-2" ]
(publishResults texts settings flags model pm)
(publishResults texts env.settings env.flags model pm)
]
SearchView ->
@ -101,8 +103,8 @@ mainView texts flags settings model =
body
Nothing ->
bookmarkQueryWidget texts settings flags model
++ itemCardList texts flags settings model
bookmarkQueryWidget texts env.settings env.flags model
++ itemCardList texts env model
bookmarkQueryWidget : Texts -> UiSettings -> Flags -> Model -> List (Html Msg)
@ -182,17 +184,17 @@ confirmModal texts model =
[]
itemsBar : Texts -> Flags -> UiSettings -> Model -> List (Html Msg)
itemsBar texts flags settings model =
itemsBar : Texts -> Env.View -> Model -> List (Html Msg)
itemsBar texts env model =
case model.viewMode of
SearchView ->
[ defaultMenuBar texts flags settings model ]
[ defaultMenuBar texts env.flags env.settings model ]
SelectView svm ->
[ editMenuBar texts model svm ]
[ editMenuBar texts model env.selectedItems svm ]
PublishView _ ->
[ defaultMenuBar texts flags settings model ]
[ defaultMenuBar texts env.flags env.settings model ]
defaultMenuBar : Texts -> Flags -> UiSettings -> Model -> Html Msg
@ -427,11 +429,11 @@ defaultMenuBar texts flags settings model =
}
editMenuBar : Texts -> Model -> SelectViewModel -> Html Msg
editMenuBar texts model svm =
editMenuBar : Texts -> Model -> ItemIds -> SelectViewModel -> Html Msg
editMenuBar texts model selectedItems svm =
let
selectCount =
Set.size svm.ids
Data.ItemIds.size selectedItems
btnStyle =
S.secondaryBasicButton ++ " text-sm"
@ -565,8 +567,8 @@ searchStats texts _ settings model =
[]
itemCardList : Texts -> Flags -> UiSettings -> Model -> List (Html Msg)
itemCardList texts flags settings model =
itemCardList : Texts -> Env.View -> Model -> List (Html Msg)
itemCardList texts env model =
let
previewUrl attach =
Api.attachmentPreviewURL attach.id
@ -581,15 +583,15 @@ itemCardList texts flags settings model =
, previewUrlFallback = previewUrlFallback
, attachUrl = .id >> Api.fileURL
, detailPage = .id >> ItemDetailPage
, arrange = settings.itemSearchArrange
, showGroups = settings.itemSearchShowGroups
, arrange = env.settings.itemSearchArrange
, showGroups = env.settings.itemSearchShowGroups
, rowOpen = \id -> Set.member "all" model.itemRowsOpen || Set.member id model.itemRowsOpen
}
itemViewCfg =
case model.viewMode of
SelectView svm ->
viewCfg (Data.ItemSelection.Active svm.ids)
SelectView _ ->
viewCfg (Data.ItemSelection.Active env.selectedItems)
_ ->
viewCfg Data.ItemSelection.Inactive
@ -597,11 +599,11 @@ itemCardList texts flags settings model =
[ Html.map ItemCardListMsg
(Comp.ItemCardList.view texts.itemCardList
itemViewCfg
settings
flags
env.settings
env.flags
model.itemListModel
)
, loadMore texts settings model
, loadMore texts env.settings model
]