Create shares from search and select view

This commit is contained in:
eikek
2021-10-02 23:46:58 +02:00
parent 189009325e
commit aa21e7a74c
14 changed files with 1046 additions and 131 deletions

View File

@@ -14,6 +14,7 @@ module Page.Home.Data exposing
, SelectActionMode(..)
, SelectViewModel
, ViewMode(..)
, createQuery
, doSearchCmd
, editActive
, init
@@ -36,6 +37,7 @@ import Comp.ItemDetail.MultiEditMenu exposing (SaveNameState(..))
import Comp.ItemMerge
import Comp.LinkTarget exposing (LinkTarget)
import Comp.PowerSearchInput
import Comp.PublishItems
import Comp.SearchMenu
import Data.Flags exposing (Flags)
import Data.ItemNav exposing (ItemNav)
@@ -79,6 +81,7 @@ type alias SelectViewModel =
, confirmModal : Maybe ConfirmModalValue
, editModel : Comp.ItemDetail.MultiEditMenu.Model
, mergeModel : Comp.ItemMerge.Model
, publishModel : Comp.PublishItems.Model
, saveNameState : SaveNameState
, saveCustomFieldState : Set String
}
@@ -91,6 +94,7 @@ initSelectViewModel =
, confirmModal = Nothing
, editModel = Comp.ItemDetail.MultiEditMenu.init
, mergeModel = Comp.ItemMerge.init []
, publishModel = Tuple.first Comp.PublishItems.init
, saveNameState = SaveSuccess
, saveCustomFieldState = Set.empty
}
@@ -100,6 +104,7 @@ type ViewMode
= SimpleView
| SearchView
| SelectView SelectViewModel
| PublishView Comp.PublishItems.Model
init : Flags -> ViewMode -> Model
@@ -143,6 +148,9 @@ menuCollapsed model =
SelectView _ ->
False
PublishView _ ->
False
selectActive : Model -> Bool
selectActive model =
@@ -153,6 +161,9 @@ selectActive model =
SearchView ->
False
PublishView _ ->
False
SelectView _ ->
True
@@ -166,6 +177,9 @@ editActive model =
SearchView ->
False
PublishView _ ->
False
SelectView svm ->
svm.action == EditSelected
@@ -211,6 +225,10 @@ type Msg
| RemoveItem String
| MergeSelectedItems
| MergeItemsMsg Comp.ItemMerge.Msg
| PublishSelectedItems
| PublishItemsMsg Comp.PublishItems.Msg
| TogglePublishCurrentQueryView
| PublishViewMsg Comp.PublishItems.Msg
type SearchType
@@ -225,6 +243,7 @@ type SelectActionMode
| ReprocessSelected
| RestoreSelected
| MergeSelected
| PublishSelected
type alias SearchParam =
@@ -251,10 +270,7 @@ doSearchDefaultCmd param model =
let
smask =
Q.request model.searchMenuModel.searchMode <|
Q.and
[ Comp.SearchMenu.getItemQuery model.searchMenuModel
, Maybe.map Q.Fragment model.powerSearchInput.input
]
createQuery model
mask =
{ smask
@@ -272,6 +288,14 @@ doSearchDefaultCmd param model =
Api.itemSearch param.flags mask ItemSearchAddResp
createQuery : Model -> Maybe Q.ItemQuery
createQuery model =
Q.and
[ Comp.SearchMenu.getItemQuery model.searchMenuModel
, Maybe.map Q.Fragment model.powerSearchInput.input
]
resultsBelowLimit : UiSettings -> Model -> Bool
resultsBelowLimit settings model =
let

View File

@@ -19,6 +19,7 @@ import Comp.ItemDetail.MultiEditMenu exposing (SaveNameState(..))
import Comp.ItemMerge
import Comp.LinkTarget exposing (LinkTarget)
import Comp.PowerSearchInput
import Comp.PublishItems
import Comp.SearchMenu
import Data.Flags exposing (Flags)
import Data.ItemQuery as Q
@@ -237,6 +238,9 @@ update mId key flags settings msg model =
SelectView _ ->
SimpleView
PublishView q ->
PublishView q
in
withSub
( { model | viewMode = nextView }
@@ -255,6 +259,9 @@ update mId key flags settings msg model =
SelectView _ ->
( SearchView, Cmd.none )
PublishView q ->
( PublishView q, Cmd.none )
in
withSub
( { model
@@ -620,6 +627,85 @@ update mId key flags settings msg model =
_ ->
noSub ( model, Cmd.none )
PublishSelectedItems ->
case model.viewMode of
SelectView svm ->
if svm.action == PublishSelected then
let
( mm, mc ) =
Comp.PublishItems.init
in
noSub
( { model
| viewMode =
SelectView
{ svm
| action = NoneAction
, publishModel = mm
}
}
, Cmd.map PublishItemsMsg mc
)
else if svm.ids == Set.empty then
noSub ( model, Cmd.none )
else
let
( mm, mc ) =
Comp.PublishItems.initQuery
(Q.ItemIdIn (Set.toList svm.ids))
in
noSub
( { model
| viewMode =
SelectView
{ svm
| action = PublishSelected
, publishModel = mm
}
}
, Cmd.map PublishItemsMsg mc
)
_ ->
noSub ( model, Cmd.none )
PublishItemsMsg lmsg ->
case model.viewMode of
SelectView svm ->
let
result =
Comp.PublishItems.update flags lmsg svm.publishModel
nextView =
case result.outcome of
Comp.PublishItems.OutcomeDone ->
SelectView { svm | action = NoneAction }
Comp.PublishItems.OutcomeInProgress ->
SelectView { svm | publishModel = result.model }
model_ =
{ model | viewMode = nextView }
in
if result.outcome == Comp.PublishItems.OutcomeDone then
update mId
key
flags
settings
(DoSearch model.searchTypeDropdownValue)
model_
else
noSub
( model_
, Cmd.map PublishItemsMsg result.cmd
)
_ ->
noSub ( model, Cmd.none )
EditMenuMsg lmsg ->
case model.viewMode of
SelectView svm ->
@@ -786,6 +872,38 @@ update mId key flags settings msg model =
RemoveItem id ->
update mId key flags settings (ItemCardListMsg (Comp.ItemCardList.RemoveItem id)) model
TogglePublishCurrentQueryView ->
case createQuery model of
Just q ->
let
( pm, pc ) =
Comp.PublishItems.initQuery q
in
noSub ( { model | viewMode = PublishView pm }, Cmd.map PublishViewMsg pc )
Nothing ->
noSub ( model, Cmd.none )
PublishViewMsg lmsg ->
case model.viewMode of
PublishView inPM ->
let
result =
Comp.PublishItems.update flags lmsg inPM
in
case result.outcome of
Comp.PublishItems.OutcomeInProgress ->
noSub
( { model | viewMode = PublishView result.model }
, Cmd.map PublishViewMsg result.cmd
)
Comp.PublishItems.OutcomeDone ->
noSub ( { model | viewMode = SearchView }, Cmd.none )
_ ->
noSub ( model, Cmd.none )
--- Helpers

View File

@@ -13,9 +13,12 @@ import Comp.ItemCardList
import Comp.ItemMerge
import Comp.MenuBar as MB
import Comp.PowerSearchInput
import Comp.PublishItems
import Comp.SearchMenu
import Comp.SearchStatsView
import Data.Flags exposing (Flags)
import Data.Icons as Icons
import Data.ItemQuery as Q
import Data.ItemSelection
import Data.SearchMode
import Data.UiSettings exposing (UiSettings)
@@ -63,29 +66,52 @@ viewContent texts flags settings model =
mainView : Texts -> Flags -> UiSettings -> Model -> List (Html Msg)
mainView texts flags settings model =
let
mergeView =
otherView =
case model.viewMode of
SelectView svm ->
case svm.action of
MergeSelected ->
Just svm
Just
[ div [ class "sm:relative mb-2" ]
(itemMergeView texts settings svm)
]
PublishSelected ->
Just
[ div [ class "sm:relative mb-2" ]
(itemPublishView texts flags svm)
]
_ ->
Nothing
_ ->
PublishView pm ->
Just
[ div [ class "sm:relative mb-2" ]
(publishResults texts flags model pm)
]
SimpleView ->
Nothing
SearchView ->
Nothing
in
case mergeView of
Just svm ->
[ div [ class "sm:relative mb-2" ]
(itemMergeView texts settings svm)
]
case otherView of
Just body ->
body
Nothing ->
itemCardList texts flags settings model
itemPublishView : Texts -> Flags -> SelectViewModel -> List (Html Msg)
itemPublishView texts flags svm =
[ Html.map PublishItemsMsg
(Comp.PublishItems.view texts.publishItems flags svm.publishModel)
]
itemMergeView : Texts -> UiSettings -> SelectViewModel -> List (Html Msg)
itemMergeView texts settings svm =
[ Html.map MergeItemsMsg
@@ -93,6 +119,13 @@ itemMergeView texts settings svm =
]
publishResults : Texts -> Flags -> Model -> Comp.PublishItems.Model -> List (Html Msg)
publishResults texts flags model pm =
[ Html.map PublishViewMsg
(Comp.PublishItems.view texts.publishItems flags pm)
]
confirmModal : Texts -> Model -> List (Html Msg)
confirmModal texts model =
let
@@ -148,6 +181,9 @@ itemsBar texts flags settings model =
SelectView svm ->
[ editMenuBar texts model svm ]
PublishView query ->
[ defaultMenuBar texts flags settings model ]
defaultMenuBar : Texts -> Flags -> UiSettings -> Model -> Html Msg
defaultMenuBar texts flags settings model =
@@ -215,6 +251,25 @@ defaultMenuBar texts flags settings model =
MB.view
{ end =
[ MB.CustomElement <|
B.secondaryBasicButton
{ label = ""
, icon = Icons.share
, disabled = createQuery model == Nothing
, handler = onClick TogglePublishCurrentQueryView
, attrs =
[ title <|
if createQuery model == Nothing then
texts.nothingSelectedToShare
else
texts.publishCurrentQueryTitle
, classList
[ ( btnStyle, True )
]
, href "#"
]
}
, MB.CustomElement <|
B.secondaryBasicButton
{ label = ""
, icon =
@@ -332,6 +387,17 @@ editMenuBar texts model svm =
, ( "hidden", model.searchMenuModel.searchMode == Data.SearchMode.Trashed )
]
}
, MB.CustomButton
{ tagger = PublishSelectedItems
, label = ""
, icon = Just Icons.share
, title = texts.publishItemsTitle selectCount
, inputClass =
[ ( btnStyle, True )
, ( "bg-gray-200 dark:bg-bluegray-600", svm.action == PublishSelected )
, ( "hidden", model.searchMenuModel.searchMode == Data.SearchMode.Trashed )
]
}
]
, end =
[ MB.CustomButton
@@ -413,12 +479,12 @@ itemCardList texts _ settings model =
settings
model.itemListModel
)
, loadMore settings model
, loadMore texts settings model
]
loadMore : UiSettings -> Model -> Html Msg
loadMore settings model =
loadMore : Texts -> UiSettings -> Model -> Html Msg
loadMore texts settings model =
let
inactive =
not model.moreAvailable || model.moreInProgress || model.searchInProgress
@@ -430,10 +496,10 @@ loadMore settings model =
[ B.secondaryBasicButton
{ label =
if model.moreAvailable then
"Load more"
texts.loadMore
else
"That's all"
texts.thatsAll
, icon =
if model.moreInProgress then
"fa fa-circle-notch animate-spin"