Select linked items from search page

- Quickly select related items from the search view
- Include related items with item details to spare another request
This commit is contained in:
eikek
2022-03-19 18:31:45 +01:00
parent 71f88486c2
commit 37b5a4dfef
13 changed files with 119 additions and 22 deletions

View File

@ -34,7 +34,6 @@ import Html.Events exposing (onClick)
import Markdown
import Messages.Comp.ItemCard exposing (Texts)
import Page exposing (Page(..))
import Set exposing (Set)
import Styles as S
import Util.CustomField
import Util.ItemDragDrop as DD
@ -336,7 +335,7 @@ viewRow texts cfg settings flags model item =
, IT.render subtitleTemplate (templateCtx texts) item |> text
]
, div [ class "opacity-90" ]
[ mainTagsAndFields2 settings "flex truncate overflow-hidden flex-nowrap text-xs justify-start hidden md:flex" item
[ mainTagsAndFields2 texts settings "flex truncate overflow-hidden flex-nowrap text-xs justify-start hidden md:flex" item
]
]
]
@ -449,7 +448,7 @@ viewRow texts cfg settings flags model item =
(IT.render IT.source (templateCtx texts) item)
]
]
, mainTagsAndFields2 settings "justify-start text-sm" item
, mainTagsAndFields2 texts settings "justify-start text-sm" item
, notesContent2 settings item
]
]
@ -718,13 +717,13 @@ mainContent2 texts _ cardColor isCreated isDeleted settings _ item =
, IT.render subtitlePattern (templateCtx texts) item |> text
]
, div [ class "" ]
[ mainTagsAndFields2 settings "justify-end text-xs" item
[ mainTagsAndFields2 texts settings "justify-end text-xs" item
]
]
mainTagsAndFields2 : UiSettings -> String -> ItemLight -> Html Msg
mainTagsAndFields2 settings extraCss item =
mainTagsAndFields2 : Texts -> UiSettings -> String -> ItemLight -> Html Msg
mainTagsAndFields2 texts settings extraCss item =
let
fieldHidden f =
Data.UiSettings.fieldHidden settings f
@ -765,6 +764,22 @@ mainTagsAndFields2 settings extraCss item =
else
List.map showTag item.tags
renderRelated =
if List.isEmpty item.relatedItems then
[]
else
[ a
[ class "label ml-1 mt-1 font-semibold hover:opacity-75 py-1"
, class "border-gray-500 dark:border-slate-300"
, href "#"
, onClick (SetLinkTarget <| Comp.LinkTarget.LinkRelatedItems (item.id :: item.relatedItems))
, title texts.showRelatedItems
]
[ i [ class "fa fa-link" ] []
]
]
in
div
[ classList
@ -773,7 +788,7 @@ mainTagsAndFields2 settings extraCss item =
]
, class extraCss
]
(renderFields ++ renderTags)
(renderFields ++ renderTags ++ renderRelated)
previewImage2 : Texts -> ViewConfig -> UiSettings -> Model -> ItemLight -> Html Msg

View File

@ -97,12 +97,12 @@ update inav env msg model =
( cm, cc ) =
Comp.CustomFieldMultiInput.init env.flags
( ilm, ilc ) =
ilm =
if model.item.id == "" then
( model.itemLinkModel, Cmd.none )
model.itemLinkModel
else
Comp.ItemLinkForm.init env.flags model.item.id
Comp.ItemLinkForm.initWith model.item.id model.item.relatedItems
in
resultModelCmd
( { model
@ -120,7 +120,6 @@ update inav env msg model =
, Cmd.map DueDatePickerMsg dpc
, Cmd.map ItemMailMsg ic
, Cmd.map CustomFieldMsg cc
, Cmd.map ItemLinkFormMsg ilc
, Api.getSentMails env.flags model.item.id SentMailsResp
]
)

View File

@ -5,7 +5,7 @@
-}
module Comp.ItemLinkForm exposing (Model, Msg, emptyModel, init, update, view)
module Comp.ItemLinkForm exposing (Model, Msg, emptyModel, init, initWith, update, view)
import Api
import Api.Model.BasicResult exposing (BasicResult)
@ -67,6 +67,20 @@ type Msg
| ToggleEditMode
initWith : String -> List ItemLight -> Model
initWith target related =
let
cfg =
Comp.ItemSearchInput.defaultConfig
in
{ itemSearchModel = Comp.ItemSearchInput.init cfg
, relatedItems = related
, targetItemId = target
, editMode = AddRelated
, formState = FormOk
}
init : Flags -> String -> ( Model, Cmd Msg )
init flags itemId =
let

View File

@ -36,6 +36,7 @@ type LinkTarget
| LinkCustomField ItemFieldValue
| LinkSource String
| LinkBookmark String
| LinkRelatedItems (List String)
| LinkNone

View File

@ -104,6 +104,7 @@ type alias Model =
, sourceModel : Maybe String
, allBookmarks : Comp.BookmarkChooser.Model
, selectedBookmarks : Comp.BookmarkChooser.Selection
, selectedItems : List String
, includeSelection : Bool
, openTabs : Set String
, searchMode : SearchMode
@ -152,6 +153,7 @@ init flags =
, sourceModel = Nothing
, allBookmarks = Comp.BookmarkChooser.init Data.Bookmarks.empty
, selectedBookmarks = Comp.BookmarkChooser.emptySelection
, selectedItems = []
, includeSelection = False
, openTabs = Set.fromList [ "Tags", "Inbox" ]
, searchMode = Data.SearchMode.Normal
@ -311,6 +313,7 @@ getItemQuery selectedItems model =
, textSearch.fullText
|> Maybe.map Q.Contents
, whenNotEmpty bookmarks Q.And
, whenNotEmpty model.selectedItems Q.ItemIdIn
]
@ -356,6 +359,7 @@ resetModel model =
, customValues = Data.CustomFieldChange.emptyCollect
, sourceModel = Nothing
, selectedBookmarks = Comp.BookmarkChooser.emptySelection
, selectedItems = []
, includeSelection = False
, searchMode = Data.SearchMode.Normal
}
@ -397,6 +401,7 @@ type Msg
| SetFolder IdName
| SetTag String
| SetBookmark String
| SetSelectedItems (List String)
| SetCustomField ItemFieldValue
| CustomFieldMsg Comp.CustomFieldMultiInput.Msg
| SetSource String
@ -459,6 +464,9 @@ linkTargetMsg linkTarget =
Comp.LinkTarget.LinkBookmark id ->
Just <| SetBookmark id
Comp.LinkTarget.LinkRelatedItems ids ->
Just <| SetSelectedItems ids
type alias NextState =
{ model : Model
@ -611,6 +619,19 @@ updateDrop ddm flags settings msg model =
, selectionChange = Data.ItemIds.noChange
}
SetSelectedItems ids ->
let
nextModel =
resetModel model
in
{ model = { nextModel | selectedItems = ids }
, cmd = Cmd.none
, sub = Sub.none
, stateChange = ids /= model.selectedItems
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
GetAllTagsResp (Ok stats) ->
let
tagSel =

View File

@ -30,6 +30,7 @@ type alias Texts =
, formatDateLong : Int -> String
, formatDateShort : Int -> String
, directionLabel : Direction -> String
, showRelatedItems : String
}
@ -44,6 +45,7 @@ gb tz =
, formatDateLong = Messages.DateFormat.formatDateLong Messages.UiLanguage.English tz
, formatDateShort = Messages.DateFormat.formatDateShort Messages.UiLanguage.English tz
, directionLabel = Messages.Data.Direction.gb
, showRelatedItems = "Show linked items"
}
@ -58,6 +60,7 @@ de tz =
, formatDateLong = Messages.DateFormat.formatDateLong Messages.UiLanguage.German tz
, formatDateShort = Messages.DateFormat.formatDateShort Messages.UiLanguage.German tz
, directionLabel = Messages.Data.Direction.de
, showRelatedItems = "Verknüpfte Dokumente anzeigen"
}
@ -72,4 +75,5 @@ fr tz =
, formatDateLong = Messages.DateFormat.formatDateLong Messages.UiLanguage.French tz
, formatDateShort = Messages.DateFormat.formatDateShort Messages.UiLanguage.French tz
, directionLabel = Messages.Data.Direction.fr
, showRelatedItems = "Afficher les documents liés"
}

View File

@ -38,6 +38,7 @@ toItemLight detail =
, tags = detail.tags
, customfields = detail.customfields
, notes = detail.notes
, relatedItems = List.map .id detail.relatedItems
, highlighting = []
}