From 02a0343e55aa2c7c94081beae3c9018de54bad4e Mon Sep 17 00:00:00 2001
From: Eike Kettner <eike.kettner@posteo.de>
Date: Tue, 22 Sep 2020 22:33:21 +0200
Subject: [PATCH] Allow to enable/disable keyboard navigation in user settings

---
 .../src/main/elm/Comp/ItemDetail/View.elm     | 44 ++++++++++++++-----
 .../src/main/elm/Comp/UiSettingsForm.elm      | 25 +++++++++++
 .../webapp/src/main/elm/Data/UiSettings.elm   |  5 +++
 3 files changed, 63 insertions(+), 11 deletions(-)

diff --git a/modules/webapp/src/main/elm/Comp/ItemDetail/View.elm b/modules/webapp/src/main/elm/Comp/ItemDetail/View.elm
index 4be58ea3..348f52a4 100644
--- a/modules/webapp/src/main/elm/Comp/ItemDetail/View.elm
+++ b/modules/webapp/src/main/elm/Comp/ItemDetail/View.elm
@@ -41,7 +41,7 @@ view inav settings model =
     div
         []
         [ renderItemInfo settings model
-        , renderDetailMenu inav model
+        , renderDetailMenu settings inav model
         , renderMailForm settings model
         , renderAddFilesForm model
         , div [ class "ui grid" ]
@@ -90,8 +90,16 @@ view inav settings model =
 --- Helper
 
 
-renderDetailMenu : ItemNav -> Model -> Html Msg
-renderDetailMenu inav model =
+renderDetailMenu : UiSettings -> ItemNav -> Model -> Html Msg
+renderDetailMenu settings inav model =
+    let
+        keyDescr name =
+            if settings.itemDetailShortcuts && model.menuOpen then
+                " Key '" ++ name ++ "'."
+
+            else
+                ""
+    in
     div
         [ classList
             [ ( "ui ablue-comp menu", True )
@@ -112,7 +120,7 @@ renderDetailMenu inav model =
             , Maybe.map ItemDetailPage inav.prev
                 |> Maybe.map Page.href
                 |> Maybe.withDefault (href "#")
-            , title "Previous item. Key 'Ctrl-,'"
+            , title ("Previous item." ++ keyDescr "Ctrl-,")
             ]
             [ i [ class "caret square left outline icon" ] []
             ]
@@ -124,7 +132,7 @@ renderDetailMenu inav model =
             , Maybe.map ItemDetailPage inav.next
                 |> Maybe.map Page.href
                 |> Maybe.withDefault (href "#")
-            , title "Next item. Key 'Ctrl-.'"
+            , title ("Next item." ++ keyDescr "Ctrl-.")
             ]
             [ i [ class "caret square right outline icon" ] []
             ]
@@ -708,22 +716,36 @@ renderTags settings model =
 renderEditMenu : UiSettings -> Model -> List (Html Msg)
 renderEditMenu settings model =
     [ Html.map ModalEditMsg (Comp.DetailEdit.viewModal settings model.modalEdit)
-    , div (Comp.KeyInput.eventsM KeyInputMsg)
-        [ renderEditButtons model
+    , div
+        (if settings.itemDetailShortcuts then
+            Comp.KeyInput.eventsM KeyInputMsg
+
+         else
+            []
+        )
+        [ renderEditButtons settings model
         , renderEditForm settings model
         ]
     ]
 
 
-renderEditButtons : Model -> Html Msg
-renderEditButtons model =
+renderEditButtons : UiSettings -> Model -> Html Msg
+renderEditButtons settings model =
+    let
+        keyDescr name =
+            if settings.itemDetailShortcuts then
+                " Key '" ++ name ++ "'."
+
+            else
+                ""
+    in
     div [ class "ui top attached icon ablue-comp menu" ]
         [ a
             [ classList
                 [ ( "borderless item", True )
                 , ( "invisible", model.item.state /= "created" )
                 ]
-            , title "Confirm metadata. Key 'Ctrl-c'."
+            , title ("Confirm metadata." ++ keyDescr "Ctrl-c")
             , href "#"
             , onClick ConfirmItem
             ]
@@ -735,7 +757,7 @@ renderEditButtons model =
                 , ( "invisible", model.item.state /= "confirmed" )
                 ]
             , href "#"
-            , title "Unconfirm metadata. Key 'Ctrl-c'."
+            , title ("Unconfirm metadata." ++ keyDescr "Ctrl-c")
             , onClick UnconfirmItem
             ]
             [ i [ class "eye slash outline icon" ] []
diff --git a/modules/webapp/src/main/elm/Comp/UiSettingsForm.elm b/modules/webapp/src/main/elm/Comp/UiSettingsForm.elm
index 129c2f1a..7a4a29dc 100644
--- a/modules/webapp/src/main/elm/Comp/UiSettingsForm.elm
+++ b/modules/webapp/src/main/elm/Comp/UiSettingsForm.elm
@@ -39,6 +39,7 @@ type alias Model =
     , searchMenuTagCatCount : Maybe Int
     , searchMenuTagCatCountModel : Comp.IntField.Model
     , formFields : List Field
+    , itemDetailShortcuts : Bool
     }
 
 
@@ -87,6 +88,7 @@ init flags settings =
                 False
                 "Number of categories in search menu"
       , formFields = settings.formFields
+      , itemDetailShortcuts = settings.itemDetailShortcuts
       }
     , Api.getTags flags "" GetTagsResp
     )
@@ -103,6 +105,7 @@ type Msg
     | SearchMenuTagMsg Comp.IntField.Msg
     | SearchMenuTagCatMsg Comp.IntField.Msg
     | FieldListMsg Comp.FieldListSelect.Msg
+    | ToggleItemDetailShortcuts
 
 
 
@@ -261,6 +264,15 @@ update sett msg model =
                 Nothing
             )
 
+        ToggleItemDetailShortcuts ->
+            let
+                flag =
+                    not model.itemDetailShortcuts
+            in
+            ( { model | itemDetailShortcuts = flag }
+            , Just { sett | itemDetailShortcuts = flag }
+            )
+
 
 
 --- View
@@ -342,6 +354,19 @@ view flags _ model =
                     ]
                 ]
             ]
+        , div [ class "field" ]
+            [ div [ class "ui checkbox" ]
+                [ input
+                    [ type_ "checkbox"
+                    , onCheck (\_ -> ToggleItemDetailShortcuts)
+                    , checked model.itemDetailShortcuts
+                    ]
+                    []
+                , label []
+                    [ text "Use keyboard shortcuts for navigation and confirm/unconfirm with open edit menu."
+                    ]
+                ]
+            ]
         , div [ class "grouped fields" ]
             [ label [] [ text "Position of item notes" ]
             , div [ class "field" ]
diff --git a/modules/webapp/src/main/elm/Data/UiSettings.elm b/modules/webapp/src/main/elm/Data/UiSettings.elm
index 2369b04a..16c978b1 100644
--- a/modules/webapp/src/main/elm/Data/UiSettings.elm
+++ b/modules/webapp/src/main/elm/Data/UiSettings.elm
@@ -40,6 +40,7 @@ type alias StoredUiSettings =
     , searchMenuTagCount : Maybe Int
     , searchMenuTagCatCount : Maybe Int
     , formFields : Maybe (List String)
+    , itemDetailShortcuts : Bool
     }
 
 
@@ -60,6 +61,7 @@ type alias UiSettings =
     , searchMenuTagCount : Int
     , searchMenuTagCatCount : Int
     , formFields : List Field
+    , itemDetailShortcuts : Bool
     }
 
 
@@ -102,6 +104,7 @@ defaults =
     , searchMenuTagCount = 6
     , searchMenuTagCatCount = 3
     , formFields = Data.Fields.all
+    , itemDetailShortcuts = False
     }
 
 
@@ -134,6 +137,7 @@ merge given fallback =
         choose
             (Maybe.map Data.Fields.fromList given.formFields)
             fallback.formFields
+    , itemDetailShortcuts = given.itemDetailShortcuts
     }
 
 
@@ -157,6 +161,7 @@ toStoredUiSettings settings =
     , formFields =
         List.map Data.Fields.toString settings.formFields
             |> Just
+    , itemDetailShortcuts = settings.itemDetailShortcuts
     }