From 9bc20844998b9e46476ee20434ddc0a5523b0fcb Mon Sep 17 00:00:00 2001
From: Eike Kettner <eike.kettner@posteo.de>
Date: Fri, 8 Jan 2021 18:14:16 +0100
Subject: [PATCH] Allow to click on custom fields in detail view

Closes: #514
---
 .../src/main/elm/Comp/ItemDetail/View.elm     |  5 +++-
 .../webapp/src/main/elm/Comp/LinkTarget.elm   | 16 +++++++++++++
 .../webapp/src/main/elm/Comp/SearchMenu.elm   | 18 +++++++++++++++
 .../src/main/elm/Data/CustomFieldChange.elm   |  9 ++++++++
 .../webapp/src/main/elm/Page/Home/Update.elm  |  3 +++
 .../webapp/src/main/elm/Util/CustomField.elm  | 23 +++++++++++++++++--
 6 files changed, 71 insertions(+), 3 deletions(-)

diff --git a/modules/webapp/src/main/elm/Comp/ItemDetail/View.elm b/modules/webapp/src/main/elm/Comp/ItemDetail/View.elm
index b541f20b..8e5229e1 100644
--- a/modules/webapp/src/main/elm/Comp/ItemDetail/View.elm
+++ b/modules/webapp/src/main/elm/Comp/ItemDetail/View.elm
@@ -636,7 +636,10 @@ renderCustomValues : UiSettings -> Model -> List (Html Msg)
 renderCustomValues settings model =
     let
         fieldView cv =
-            Util.CustomField.renderValue "ui secondary basic label" cv
+            Comp.LinkTarget.makeCustomFieldLink
+                cv
+                [ ( "ui secondary basic label", True ) ]
+                SetLinkTarget
 
         labelThenName cv =
             Maybe.withDefault cv.name cv.label
diff --git a/modules/webapp/src/main/elm/Comp/LinkTarget.elm b/modules/webapp/src/main/elm/Comp/LinkTarget.elm
index c9908bb6..ea20da20 100644
--- a/modules/webapp/src/main/elm/Comp/LinkTarget.elm
+++ b/modules/webapp/src/main/elm/Comp/LinkTarget.elm
@@ -2,14 +2,17 @@ module Comp.LinkTarget exposing
     ( LinkTarget(..)
     , makeConcLink
     , makeCorrLink
+    , makeCustomFieldLink
     , makeFolderLink
     , makeTagLink
     )
 
 import Api.Model.IdName exposing (IdName)
+import Api.Model.ItemFieldValue exposing (ItemFieldValue)
 import Html exposing (..)
 import Html.Attributes exposing (..)
 import Html.Events exposing (onClick)
+import Util.CustomField
 
 
 type LinkTarget
@@ -19,6 +22,7 @@ type LinkTarget
     | LinkConcEquip IdName
     | LinkFolder IdName
     | LinkTag IdName
+    | LinkCustomField ItemFieldValue
     | LinkNone
 
 
@@ -74,6 +78,18 @@ makeTagLink tagId classes tagger =
     makeLink classes (LinkTag >> tagger) tagId
 
 
+makeCustomFieldLink :
+    ItemFieldValue
+    -> List ( String, Bool )
+    -> (LinkTarget -> msg)
+    -> Html msg
+makeCustomFieldLink cv classes tagger =
+    Util.CustomField.renderValue1
+        classes
+        (tagger (LinkCustomField cv) |> Just)
+        cv
+
+
 
 --- Helpers
 
diff --git a/modules/webapp/src/main/elm/Comp/SearchMenu.elm b/modules/webapp/src/main/elm/Comp/SearchMenu.elm
index e60bbf99..f4898a6a 100644
--- a/modules/webapp/src/main/elm/Comp/SearchMenu.elm
+++ b/modules/webapp/src/main/elm/Comp/SearchMenu.elm
@@ -19,6 +19,7 @@ import Api.Model.Equipment exposing (Equipment)
 import Api.Model.EquipmentList exposing (EquipmentList)
 import Api.Model.FolderStats exposing (FolderStats)
 import Api.Model.IdName exposing (IdName)
+import Api.Model.ItemFieldValue exposing (ItemFieldValue)
 import Api.Model.ItemSearch exposing (ItemSearch)
 import Api.Model.PersonList exposing (PersonList)
 import Api.Model.ReferenceList exposing (ReferenceList)
@@ -353,6 +354,7 @@ type Msg
     | SetConcEquip IdName
     | SetFolder IdName
     | SetTag String
+    | SetCustomField ItemFieldValue
     | CustomFieldMsg Comp.CustomFieldMultiInput.Msg
     | SetSource String
     | GetStatsResp (Result Http.Error SearchStats)
@@ -829,6 +831,22 @@ updateDrop ddm flags settings msg model =
             , dragDrop = DD.DragDropData ddm Nothing
             }
 
+        SetCustomField cv ->
+            let
+                lm =
+                    Comp.CustomFieldMultiInput.setValues [ cv ]
+
+                values =
+                    Data.CustomFieldChange.fromItemValues [ cv ]
+
+                next =
+                    updateDrop ddm flags settings (CustomFieldMsg lm) model
+
+                m =
+                    next.model
+            in
+            { next | model = { m | customValues = values } }
+
         SetSource str ->
             let
                 next =
diff --git a/modules/webapp/src/main/elm/Data/CustomFieldChange.elm b/modules/webapp/src/main/elm/Data/CustomFieldChange.elm
index 7a12dbc2..04f69b1c 100644
--- a/modules/webapp/src/main/elm/Data/CustomFieldChange.elm
+++ b/modules/webapp/src/main/elm/Data/CustomFieldChange.elm
@@ -3,12 +3,14 @@ module Data.CustomFieldChange exposing
     , CustomFieldValueCollect
     , collectValues
     , emptyCollect
+    , fromItemValues
     , isValueChange
     , toFieldValues
     )
 
 import Api.Model.CustomField exposing (CustomField)
 import Api.Model.CustomFieldValue exposing (CustomFieldValue)
+import Api.Model.ItemFieldValue exposing (ItemFieldValue)
 import Dict exposing (Dict)
 
 
@@ -75,3 +77,10 @@ isValueChange change =
 
         FieldCreateNew ->
             False
+
+
+fromItemValues : List { v | id : String, value : String } -> CustomFieldValueCollect
+fromItemValues values =
+    List.map (\e -> ( e.id, e.value )) values
+        |> Dict.fromList
+        |> CustomFieldValueCollect
diff --git a/modules/webapp/src/main/elm/Page/Home/Update.elm b/modules/webapp/src/main/elm/Page/Home/Update.elm
index ec8c7f68..e3cfd754 100644
--- a/modules/webapp/src/main/elm/Page/Home/Update.elm
+++ b/modules/webapp/src/main/elm/Page/Home/Update.elm
@@ -713,6 +713,9 @@ linkTargetMsg linkTarget =
         Comp.LinkTarget.LinkTag id ->
             Just <| SearchMenuMsg (Comp.SearchMenu.SetTag id.id)
 
+        Comp.LinkTarget.LinkCustomField id ->
+            Just <| SearchMenuMsg (Comp.SearchMenu.SetCustomField id)
+
 
 doSearchMore : Flags -> UiSettings -> Model -> ( Model, Cmd Msg )
 doSearchMore flags settings model =
diff --git a/modules/webapp/src/main/elm/Util/CustomField.elm b/modules/webapp/src/main/elm/Util/CustomField.elm
index 9e2aa802..b2e38cb1 100644
--- a/modules/webapp/src/main/elm/Util/CustomField.elm
+++ b/modules/webapp/src/main/elm/Util/CustomField.elm
@@ -1,10 +1,11 @@
-module Util.CustomField exposing (nameOrLabel, renderValue)
+module Util.CustomField exposing (nameOrLabel, renderValue, renderValue1)
 
 import Api.Model.ItemFieldValue exposing (ItemFieldValue)
 import Data.CustomFieldType
 import Data.Icons as Icons
 import Html exposing (..)
 import Html.Attributes exposing (..)
+import Html.Events exposing (onClick)
 
 
 nameOrLabel : { r | name : String, label : Maybe String } -> String
@@ -14,6 +15,11 @@ nameOrLabel fv =
 
 renderValue : String -> ItemFieldValue -> Html msg
 renderValue classes cv =
+    renderValue1 [ ( classes, True ) ] Nothing cv
+
+
+renderValue1 : List ( String, Bool ) -> Maybe msg -> ItemFieldValue -> Html msg
+renderValue1 classes tagger cv =
     let
         renderBool =
             if cv.value == "true" then
@@ -21,8 +27,21 @@ renderValue classes cv =
 
             else
                 i [ class "minus icon" ] []
+
+        el : List (Html msg) -> Html msg
+        el =
+            case tagger of
+                Just t ->
+                    a
+                        [ classList classes
+                        , onClick t
+                        , href "#"
+                        ]
+
+                Nothing ->
+                    div [ classList classes ]
     in
-    div [ class classes ]
+    el
         [ Icons.customFieldTypeIconString "" cv.ftype
         , nameOrLabel cv |> text
         , div [ class "detail" ]