mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-06-22 02:18:26 +00:00
Link multiple items via selection
This commit is contained in:
@ -14,6 +14,7 @@ module Api exposing
|
|||||||
, addDashboard
|
, addDashboard
|
||||||
, addMember
|
, addMember
|
||||||
, addRelatedItems
|
, addRelatedItems
|
||||||
|
, addRelatedItemsTask
|
||||||
, addShare
|
, addShare
|
||||||
, addTag
|
, addTag
|
||||||
, addTagsMultiple
|
, addTagsMultiple
|
||||||
@ -3044,6 +3045,25 @@ addRelatedItems flags data receive =
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
addRelatedItemsTask : Flags -> List String -> Task.Task Http.Error BasicResult
|
||||||
|
addRelatedItemsTask flags ids =
|
||||||
|
let
|
||||||
|
itemData =
|
||||||
|
{ item = List.head ids |> Maybe.withDefault ""
|
||||||
|
, related = List.tail ids |> Maybe.withDefault []
|
||||||
|
}
|
||||||
|
in
|
||||||
|
Http2.authTask
|
||||||
|
{ url = flags.config.baseUrl ++ "/api/v1/sec/itemlink/addAll"
|
||||||
|
, account = getAccount flags
|
||||||
|
, body = Http.jsonBody (Api.Model.ItemLinkData.encode itemData)
|
||||||
|
, method = "POST"
|
||||||
|
, headers = []
|
||||||
|
, resolver = Http2.jsonResolver Api.Model.BasicResult.decoder
|
||||||
|
, timeout = Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
removeRelatedItems : Flags -> ItemLinkData -> (Result Http.Error BasicResult -> msg) -> Cmd msg
|
removeRelatedItems : Flags -> ItemLinkData -> (Result Http.Error BasicResult -> msg) -> Cmd msg
|
||||||
removeRelatedItems flags data receive =
|
removeRelatedItems flags data receive =
|
||||||
Http2.authPost
|
Http2.authPost
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
|
{-
|
||||||
|
Copyright 2020 Eike K. & Contributors
|
||||||
|
|
||||||
|
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
-}
|
||||||
|
|
||||||
|
|
||||||
module Comp.ItemLinkForm exposing (Model, Msg, emptyModel, init, update, view)
|
module Comp.ItemLinkForm exposing (Model, Msg, emptyModel, init, update, view)
|
||||||
|
|
||||||
import Api
|
import Api
|
||||||
|
@ -235,9 +235,11 @@ flatten list =
|
|||||||
|
|
||||||
|
|
||||||
type alias ViewConfig =
|
type alias ViewConfig =
|
||||||
{ infoMessage : String
|
{ title : String
|
||||||
|
, infoMessage : String
|
||||||
, warnMessage : String
|
, warnMessage : String
|
||||||
, actionButton : String
|
, actionButton : String
|
||||||
|
, actionIcon : String
|
||||||
, actionTitle : String
|
, actionTitle : String
|
||||||
, cancelTitle : String
|
, cancelTitle : String
|
||||||
, actionSuccessful : String
|
, actionSuccessful : String
|
||||||
@ -249,7 +251,7 @@ view : Texts -> ViewConfig -> UiSettings -> Model -> Html Msg
|
|||||||
view texts cfg settings model =
|
view texts cfg settings model =
|
||||||
div [ class "px-2 mb-4" ]
|
div [ class "px-2 mb-4" ]
|
||||||
[ h1 [ class S.header1 ]
|
[ h1 [ class S.header1 ]
|
||||||
[ text texts.title
|
[ text cfg.title
|
||||||
, a
|
, a
|
||||||
[ class "ml-2"
|
[ class "ml-2"
|
||||||
, class S.link
|
, class S.link
|
||||||
@ -278,7 +280,7 @@ view texts cfg settings model =
|
|||||||
[ MB.PrimaryButton
|
[ MB.PrimaryButton
|
||||||
{ tagger = SubmitAction
|
{ tagger = SubmitAction
|
||||||
, title = cfg.actionTitle
|
, title = cfg.actionTitle
|
||||||
, icon = Just "fa fa-less-than"
|
, icon = Just cfg.actionIcon
|
||||||
, label = cfg.actionButton
|
, label = cfg.actionButton
|
||||||
}
|
}
|
||||||
, MB.SecondaryButton
|
, MB.SecondaryButton
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
|
{-
|
||||||
|
Copyright 2020 Eike K. & Contributors
|
||||||
|
|
||||||
|
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
-}
|
||||||
|
|
||||||
|
|
||||||
module Comp.ItemSearchInput exposing (Config, Model, Msg, defaultConfig, hasFocus, init, isSearching, update, view)
|
module Comp.ItemSearchInput exposing (Config, Model, Msg, defaultConfig, hasFocus, init, isSearching, update, view)
|
||||||
|
|
||||||
import Api
|
import Api
|
||||||
|
@ -47,6 +47,7 @@ module Data.Icons exposing
|
|||||||
, folderIcon
|
, folderIcon
|
||||||
, gotifyIcon
|
, gotifyIcon
|
||||||
, itemDatesIcon
|
, itemDatesIcon
|
||||||
|
, linkItems
|
||||||
, matrixIcon
|
, matrixIcon
|
||||||
, metadata
|
, metadata
|
||||||
, metadataIcon
|
, metadataIcon
|
||||||
@ -150,6 +151,11 @@ share =
|
|||||||
"fa fa-share-alt"
|
"fa fa-share-alt"
|
||||||
|
|
||||||
|
|
||||||
|
linkItems : String
|
||||||
|
linkItems =
|
||||||
|
"fa fa-link"
|
||||||
|
|
||||||
|
|
||||||
shareIcon : String -> Html msg
|
shareIcon : String -> Html msg
|
||||||
shareIcon classes =
|
shareIcon classes =
|
||||||
i [ class (classes ++ " " ++ share) ] []
|
i [ class (classes ++ " " ++ share) ] []
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
|
{-
|
||||||
|
Copyright 2020 Eike K. & Contributors
|
||||||
|
|
||||||
|
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
-}
|
||||||
|
|
||||||
|
|
||||||
module Messages.Comp.ItemLinkForm exposing (Texts, de, fr, gb)
|
module Messages.Comp.ItemLinkForm exposing (Texts, de, fr, gb)
|
||||||
|
|
||||||
import Data.Direction exposing (Direction)
|
import Data.Direction exposing (Direction)
|
||||||
|
@ -23,7 +23,6 @@ import Messages.UiLanguage
|
|||||||
type alias Texts =
|
type alias Texts =
|
||||||
{ basics : Messages.Basics.Texts
|
{ basics : Messages.Basics.Texts
|
||||||
, httpError : Http.Error -> String
|
, httpError : Http.Error -> String
|
||||||
, title : String
|
|
||||||
, formatDateLong : Int -> String
|
, formatDateLong : Int -> String
|
||||||
, formatDateShort : Int -> String
|
, formatDateShort : Int -> String
|
||||||
, cancelView : String
|
, cancelView : String
|
||||||
@ -34,7 +33,6 @@ gb : TimeZone -> Texts
|
|||||||
gb tz =
|
gb tz =
|
||||||
{ basics = Messages.Basics.gb
|
{ basics = Messages.Basics.gb
|
||||||
, httpError = Messages.Comp.HttpError.gb
|
, httpError = Messages.Comp.HttpError.gb
|
||||||
, title = "Merge Items"
|
|
||||||
, formatDateLong = Messages.DateFormat.formatDateLong Messages.UiLanguage.English tz
|
, formatDateLong = Messages.DateFormat.formatDateLong Messages.UiLanguage.English tz
|
||||||
, formatDateShort = Messages.DateFormat.formatDateShort Messages.UiLanguage.English tz
|
, formatDateShort = Messages.DateFormat.formatDateShort Messages.UiLanguage.English tz
|
||||||
, cancelView = "Cancel"
|
, cancelView = "Cancel"
|
||||||
@ -45,7 +43,6 @@ de : TimeZone -> Texts
|
|||||||
de tz =
|
de tz =
|
||||||
{ basics = Messages.Basics.de
|
{ basics = Messages.Basics.de
|
||||||
, httpError = Messages.Comp.HttpError.de
|
, httpError = Messages.Comp.HttpError.de
|
||||||
, title = "Dokumente zusammenführen"
|
|
||||||
, formatDateLong = Messages.DateFormat.formatDateLong Messages.UiLanguage.German tz
|
, formatDateLong = Messages.DateFormat.formatDateLong Messages.UiLanguage.German tz
|
||||||
, formatDateShort = Messages.DateFormat.formatDateShort Messages.UiLanguage.German tz
|
, formatDateShort = Messages.DateFormat.formatDateShort Messages.UiLanguage.German tz
|
||||||
, cancelView = "Abbrechen"
|
, cancelView = "Abbrechen"
|
||||||
@ -56,7 +53,6 @@ fr : TimeZone -> Texts
|
|||||||
fr tz =
|
fr tz =
|
||||||
{ basics = Messages.Basics.fr
|
{ basics = Messages.Basics.fr
|
||||||
, httpError = Messages.Comp.HttpError.fr
|
, httpError = Messages.Comp.HttpError.fr
|
||||||
, title = "Fusionner des documents"
|
|
||||||
, formatDateLong = Messages.DateFormat.formatDateLong Messages.UiLanguage.French tz
|
, formatDateLong = Messages.DateFormat.formatDateLong Messages.UiLanguage.French tz
|
||||||
, formatDateShort = Messages.DateFormat.formatDateShort Messages.UiLanguage.French tz
|
, formatDateShort = Messages.DateFormat.formatDateShort Messages.UiLanguage.French tz
|
||||||
, cancelView = "Annuler"
|
, cancelView = "Annuler"
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
|
{-
|
||||||
|
Copyright 2020 Eike K. & Contributors
|
||||||
|
|
||||||
|
SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
-}
|
||||||
|
|
||||||
|
|
||||||
module Messages.Comp.ItemSearchInput exposing (Texts, de, fr, gb)
|
module Messages.Comp.ItemSearchInput exposing (Texts, de, fr, gb)
|
||||||
|
|
||||||
import Http
|
import Http
|
||||||
|
@ -67,6 +67,15 @@ type alias Texts =
|
|||||||
, cancelMergeTitle : String
|
, cancelMergeTitle : String
|
||||||
, mergeSuccessful : String
|
, mergeSuccessful : String
|
||||||
, mergeInProcess : String
|
, mergeInProcess : String
|
||||||
|
, mergeHeader : String
|
||||||
|
, linkItemsTitle : Int -> String
|
||||||
|
, linkItemsMessage : String
|
||||||
|
, submitLinkItems : String
|
||||||
|
, submitLinkItemsTitle : String
|
||||||
|
, cancelLinkItemsTitle : String
|
||||||
|
, linkItemsSuccessful : String
|
||||||
|
, linkItemsInProcess : String
|
||||||
|
, linkItemsHeader : String
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -116,6 +125,15 @@ gb tz =
|
|||||||
, cancelMergeTitle = "Back to select view"
|
, cancelMergeTitle = "Back to select view"
|
||||||
, mergeSuccessful = "Items merged successfully"
|
, mergeSuccessful = "Items merged successfully"
|
||||||
, mergeInProcess = "Items are merged …"
|
, mergeInProcess = "Items are merged …"
|
||||||
|
, linkItemsTitle = \n -> "Link " ++ String.fromInt n ++ " items"
|
||||||
|
, linkItemsMessage = "There must be at least 2 items in the list. The first is the target item and all remaining are added to its related items list."
|
||||||
|
, submitLinkItems = "Link"
|
||||||
|
, submitLinkItemsTitle = ""
|
||||||
|
, cancelLinkItemsTitle = ""
|
||||||
|
, linkItemsSuccessful = "Linking items successful"
|
||||||
|
, linkItemsInProcess = "Linking items ..."
|
||||||
|
, mergeHeader = "Merge Items"
|
||||||
|
, linkItemsHeader = "Link Items"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -165,6 +183,15 @@ de tz =
|
|||||||
, cancelMergeTitle = "Zurück zur Auswahl"
|
, cancelMergeTitle = "Zurück zur Auswahl"
|
||||||
, mergeSuccessful = "Die Dokumente wurden erfolgreich zusammengeführt."
|
, mergeSuccessful = "Die Dokumente wurden erfolgreich zusammengeführt."
|
||||||
, mergeInProcess = "Dokumente werden zusammengeführt…"
|
, mergeInProcess = "Dokumente werden zusammengeführt…"
|
||||||
|
, linkItemsTitle = \n -> String.fromInt n ++ " Dokumente verknüpfen"
|
||||||
|
, linkItemsMessage = "Die Liste muss mindestens 2 Dokumenta haben. Das erste Dokument erhält alle folgenden als verknüpfte Dokumente."
|
||||||
|
, submitLinkItems = "Verknüpfen"
|
||||||
|
, submitLinkItemsTitle = ""
|
||||||
|
, cancelLinkItemsTitle = ""
|
||||||
|
, linkItemsSuccessful = "Das Verknüpfen war erflogreich"
|
||||||
|
, linkItemsInProcess = "Dokumente werden verknüpft ..."
|
||||||
|
, mergeHeader = "Dokumente zusammenführen"
|
||||||
|
, linkItemsHeader = "Dokument verknüpfen"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -214,4 +241,13 @@ fr tz =
|
|||||||
, cancelMergeTitle = "Annuler la fusion"
|
, cancelMergeTitle = "Annuler la fusion"
|
||||||
, mergeSuccessful = "Documents fusionnés avec succès"
|
, mergeSuccessful = "Documents fusionnés avec succès"
|
||||||
, mergeInProcess = "Fusion en cours ..."
|
, mergeInProcess = "Fusion en cours ..."
|
||||||
|
, linkItemsTitle = \n -> String.fromInt n ++ " Lier des documents"
|
||||||
|
, linkItemsMessage = "La liste doit comporter au moins deux documents. Le premier document reçoit tous les documents suivants en tant que documents liés."
|
||||||
|
, submitLinkItems = "Relier"
|
||||||
|
, submitLinkItemsTitle = ""
|
||||||
|
, cancelLinkItemsTitle = ""
|
||||||
|
, linkItemsSuccessful = "L'association a été un succès"
|
||||||
|
, linkItemsInProcess = "Relier en cours ..."
|
||||||
|
, mergeHeader = "Fusionner des documents"
|
||||||
|
, linkItemsHeader = "Lier des documents"
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
module Page.Search.Data exposing
|
module Page.Search.Data exposing
|
||||||
( ConfirmModalValue(..)
|
( ConfirmModalValue(..)
|
||||||
|
, ItemMergeModel(..)
|
||||||
, Model
|
, Model
|
||||||
, Msg(..)
|
, Msg(..)
|
||||||
, SearchParam
|
, SearchParam
|
||||||
@ -88,19 +89,24 @@ type alias SelectViewModel =
|
|||||||
{ action : SelectActionMode
|
{ action : SelectActionMode
|
||||||
, confirmModal : Maybe ConfirmModalValue
|
, confirmModal : Maybe ConfirmModalValue
|
||||||
, editModel : Comp.ItemDetail.MultiEditMenu.Model
|
, editModel : Comp.ItemDetail.MultiEditMenu.Model
|
||||||
, mergeModel : Comp.ItemMerge.Model
|
, mergeModel : ItemMergeModel
|
||||||
, publishModel : Comp.PublishItems.Model
|
, publishModel : Comp.PublishItems.Model
|
||||||
, saveNameState : SaveNameState
|
, saveNameState : SaveNameState
|
||||||
, saveCustomFieldState : Set String
|
, saveCustomFieldState : Set String
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
type ItemMergeModel
|
||||||
|
= MergeItems Comp.ItemMerge.Model
|
||||||
|
| LinkItems Comp.ItemMerge.Model
|
||||||
|
|
||||||
|
|
||||||
initSelectViewModel : Flags -> SelectViewModel
|
initSelectViewModel : Flags -> SelectViewModel
|
||||||
initSelectViewModel flags =
|
initSelectViewModel flags =
|
||||||
{ action = NoneAction
|
{ action = NoneAction
|
||||||
, confirmModal = Nothing
|
, confirmModal = Nothing
|
||||||
, editModel = Comp.ItemDetail.MultiEditMenu.init
|
, editModel = Comp.ItemDetail.MultiEditMenu.init
|
||||||
, mergeModel = Comp.ItemMerge.init []
|
, mergeModel = MergeItems (Comp.ItemMerge.init [])
|
||||||
, publishModel = Tuple.first (Comp.PublishItems.init flags)
|
, publishModel = Tuple.first (Comp.PublishItems.init flags)
|
||||||
, saveNameState = SaveSuccess
|
, saveNameState = SaveSuccess
|
||||||
, saveCustomFieldState = Set.empty
|
, saveCustomFieldState = Set.empty
|
||||||
@ -221,7 +227,7 @@ type Msg
|
|||||||
| ReprocessSelectedConfirmed
|
| ReprocessSelectedConfirmed
|
||||||
| ClientSettingsSaveResp (Result Http.Error BasicResult)
|
| ClientSettingsSaveResp (Result Http.Error BasicResult)
|
||||||
| RemoveItem String
|
| RemoveItem String
|
||||||
| MergeSelectedItems
|
| MergeSelectedItems (Comp.ItemMerge.Model -> ItemMergeModel)
|
||||||
| MergeItemsMsg Comp.ItemMerge.Msg
|
| MergeItemsMsg Comp.ItemMerge.Msg
|
||||||
| PublishSelectedItems
|
| PublishSelectedItems
|
||||||
| PublishItemsMsg Comp.PublishItems.Msg
|
| PublishItemsMsg Comp.PublishItems.Msg
|
||||||
|
@ -555,7 +555,7 @@ update texts bookmarkId lastViewedItemId env msg model =
|
|||||||
_ ->
|
_ ->
|
||||||
resultModelCmd env.selectedItems ( model, Cmd.none )
|
resultModelCmd env.selectedItems ( model, Cmd.none )
|
||||||
|
|
||||||
MergeSelectedItems ->
|
MergeSelectedItems createModel ->
|
||||||
case model.viewMode of
|
case model.viewMode of
|
||||||
SelectView svm ->
|
SelectView svm ->
|
||||||
if svm.action == MergeSelected then
|
if svm.action == MergeSelected then
|
||||||
@ -565,7 +565,7 @@ update texts bookmarkId lastViewedItemId env msg model =
|
|||||||
SelectView
|
SelectView
|
||||||
{ svm
|
{ svm
|
||||||
| action = NoneAction
|
| action = NoneAction
|
||||||
, mergeModel = Comp.ItemMerge.init []
|
, mergeModel = createModel <| Comp.ItemMerge.init []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
, Cmd.none
|
, Cmd.none
|
||||||
@ -584,7 +584,7 @@ update texts bookmarkId lastViewedItemId env msg model =
|
|||||||
SelectView
|
SelectView
|
||||||
{ svm
|
{ svm
|
||||||
| action = MergeSelected
|
| action = MergeSelected
|
||||||
, mergeModel = mm
|
, mergeModel = createModel mm
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
, Cmd.map MergeItemsMsg mc
|
, Cmd.map MergeItemsMsg mc
|
||||||
@ -600,11 +600,16 @@ update texts bookmarkId lastViewedItemId env msg model =
|
|||||||
case model.viewMode of
|
case model.viewMode of
|
||||||
SelectView svm ->
|
SelectView svm ->
|
||||||
let
|
let
|
||||||
action =
|
( mergeModel, createModel, action ) =
|
||||||
Api.mergeItemsTask env.flags
|
case svm.mergeModel of
|
||||||
|
MergeItems a ->
|
||||||
|
( a, MergeItems, Api.mergeItemsTask env.flags )
|
||||||
|
|
||||||
|
LinkItems a ->
|
||||||
|
( a, LinkItems, Api.addRelatedItemsTask env.flags )
|
||||||
|
|
||||||
result =
|
result =
|
||||||
Comp.ItemMerge.update env.flags action lmsg svm.mergeModel
|
Comp.ItemMerge.update env.flags action lmsg mergeModel
|
||||||
|
|
||||||
nextView =
|
nextView =
|
||||||
case result.outcome of
|
case result.outcome of
|
||||||
@ -612,7 +617,7 @@ update texts bookmarkId lastViewedItemId env msg model =
|
|||||||
SelectView { svm | action = NoneAction }
|
SelectView { svm | action = NoneAction }
|
||||||
|
|
||||||
Comp.ItemMerge.OutcomeNotYet ->
|
Comp.ItemMerge.OutcomeNotYet ->
|
||||||
SelectView { svm | mergeModel = result.model }
|
SelectView { svm | mergeModel = createModel result.model }
|
||||||
|
|
||||||
Comp.ItemMerge.OutcomeActionDone ->
|
Comp.ItemMerge.OutcomeActionDone ->
|
||||||
SearchView
|
SearchView
|
||||||
|
@ -130,7 +130,7 @@ itemPublishView texts settings flags svm =
|
|||||||
itemMergeView : Texts -> UiSettings -> SelectViewModel -> List (Html Msg)
|
itemMergeView : Texts -> UiSettings -> SelectViewModel -> List (Html Msg)
|
||||||
itemMergeView texts settings svm =
|
itemMergeView texts settings svm =
|
||||||
let
|
let
|
||||||
cfg =
|
cfgMerge =
|
||||||
{ infoMessage = texts.mergeInfoText
|
{ infoMessage = texts.mergeInfoText
|
||||||
, warnMessage = texts.mergeDeleteWarn
|
, warnMessage = texts.mergeDeleteWarn
|
||||||
, actionButton = texts.submitMerge
|
, actionButton = texts.submitMerge
|
||||||
@ -138,10 +138,32 @@ itemMergeView texts settings svm =
|
|||||||
, cancelTitle = texts.cancelMergeTitle
|
, cancelTitle = texts.cancelMergeTitle
|
||||||
, actionSuccessful = texts.mergeSuccessful
|
, actionSuccessful = texts.mergeSuccessful
|
||||||
, actionInProcess = texts.mergeInProcess
|
, actionInProcess = texts.mergeInProcess
|
||||||
|
, title = texts.mergeHeader
|
||||||
|
, actionIcon = "fa fa-less-than"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cfgLink =
|
||||||
|
{ infoMessage = ""
|
||||||
|
, warnMessage = texts.linkItemsMessage
|
||||||
|
, actionButton = texts.submitLinkItems
|
||||||
|
, actionTitle = texts.submitLinkItemsTitle
|
||||||
|
, cancelTitle = texts.cancelLinkItemsTitle
|
||||||
|
, actionSuccessful = texts.linkItemsSuccessful
|
||||||
|
, actionInProcess = texts.linkItemsInProcess
|
||||||
|
, title = texts.linkItemsHeader
|
||||||
|
, actionIcon = "fa fa-link"
|
||||||
|
}
|
||||||
|
|
||||||
|
( mergeModel, cfg ) =
|
||||||
|
case svm.mergeModel of
|
||||||
|
MergeItems a ->
|
||||||
|
( a, cfgMerge )
|
||||||
|
|
||||||
|
LinkItems a ->
|
||||||
|
( a, cfgLink )
|
||||||
in
|
in
|
||||||
[ Html.map MergeItemsMsg
|
[ Html.map MergeItemsMsg
|
||||||
(Comp.ItemMerge.view texts.itemMerge cfg settings svm.mergeModel)
|
(Comp.ItemMerge.view texts.itemMerge cfg settings mergeModel)
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@ -496,7 +518,7 @@ editMenuBar texts model selectedItems svm =
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
, MB.CustomButton
|
, MB.CustomButton
|
||||||
{ tagger = MergeSelectedItems
|
{ tagger = MergeSelectedItems MergeItems
|
||||||
, label = ""
|
, label = ""
|
||||||
, icon = Just "fa fa-less-than"
|
, icon = Just "fa fa-less-than"
|
||||||
, title = texts.mergeItemsTitle selectCount
|
, title = texts.mergeItemsTitle selectCount
|
||||||
@ -517,6 +539,17 @@ editMenuBar texts model selectedItems svm =
|
|||||||
, ( "hidden", model.searchMenuModel.searchMode == Data.SearchMode.Trashed )
|
, ( "hidden", model.searchMenuModel.searchMode == Data.SearchMode.Trashed )
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
, MB.CustomButton
|
||||||
|
{ tagger = MergeSelectedItems LinkItems
|
||||||
|
, label = ""
|
||||||
|
, icon = Just Icons.linkItems
|
||||||
|
, title = texts.linkItemsTitle selectCount
|
||||||
|
, inputClass =
|
||||||
|
[ ( btnStyle, True )
|
||||||
|
, ( "bg-gray-200 dark:bg-slate-600", svm.action == PublishSelected )
|
||||||
|
, ( "hidden", model.searchMenuModel.searchMode == Data.SearchMode.Trashed )
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
, end =
|
, end =
|
||||||
[ MB.CustomButton
|
[ MB.CustomButton
|
||||||
|
Reference in New Issue
Block a user