Browse Source

feat: Enter/Shift+Enter and Cmd+g/Cmd+Shift+g to jump to the next/prev

Tienson Qin 3 years ago
parent
commit
c919b61c07

+ 3 - 2
src/main/electron/listener.cljs

@@ -17,7 +17,8 @@
             [frontend.ui :as ui]
             [frontend.handler.notification :as notification]
             [frontend.handler.repo :as repo-handler]
-            [frontend.handler.user :as user]))
+            [frontend.handler.user :as user]
+            [dommy.core :as dom]))
 
 (defn persist-dbs!
   []
@@ -128,7 +129,7 @@
                      (fn [data]
                        (let [data' (bean/->clj data)]
                          (state/set-state! [:ui/find-in-page :matches] data')
-                         (state/set-state! [:ui/find-in-page :searching?] false)
+                         (dom/remove-style! (dom/by-id "search-in-page-input") :visibility)
                          (ui/focus-element "search-in-page-input")
                          true)))
 

+ 18 - 32
src/main/frontend/components/find_in_page.cljs

@@ -3,26 +3,24 @@
             [frontend.ui :as ui]
             [frontend.state :as state]
             [frontend.util :as util]
-            [frontend.handler.search :as search-handler]
+            [frontend.handler.search :as search-handler :refer [debounced-search]]
             [goog.dom :as gdom]
-            [goog.functions :refer [debounce]]
             [frontend.mixins :as mixins]))
 
-(defn find-in-page!
-  []
-  (search-handler/electron-find-in-page!))
-
-(defonce debounced-search (debounce find-in-page! 500))
-
-(defn enter-to-search
-  [e]
-  (when (and (= (.-code e) "Enter")
-             (not (state/editing?)))
-    (let [shift? (.-shiftKey e)]
-      (state/set-state! [:ui/find-in-page :backward?] shift?)
-      (debounced-search))))
+(rum/defc search-input
+  [q]
+  [:div.flex.w-48
+   [:input#search-in-page-input.form-input.block.sm:text-sm.sm:leading-5.my-2.border-none.mr-4.outline-none
+    {:auto-focus true
+     :placeholder "Find in page"
+     :aria-label "Find in page"
+     :value q
+     :on-change (fn [e]
+                  (let [value (util/evalue e)]
+                    (state/set-state! [:ui/find-in-page :q] value)
+                    (debounced-search)))}]])
 
-(rum/defc search-inner <
+(rum/defc search-inner < rum/static
   (mixins/event-mixin
    (fn [state]
      (mixins/hide-when-esc-or-outside
@@ -30,23 +28,11 @@
       :node (gdom/getElement "search-in-page")
       :on-hide (fn []
                  (search-handler/electron-exit-find-in-page!)))))
-  [{:keys [matches searching? match-case? q]}]
+  [{:keys [matches match-case? q]}]
   [:div#search-in-page.flex.flex-row.absolute.top-2.right-4.shadow-lg.px-2.py-1.faster-fade-in.items-center
-   [:div.flex.w-48
-    (when searching? (ui/loading nil))
-    [:input#search-in-page-input.form-input.block.sm:text-sm.sm:leading-5.my-2.border-none.mr-4.outline-none
-     {:auto-focus true
-      :style {:visibility (when searching? "hidden")}
-      :type (if searching? "password" "text")
-      :placeholder "Find in page"
-      :aria-label "Find in page"
-      :value q
-      :on-key-down enter-to-search
-      :on-change (fn [e]
-                   (let [value (util/evalue e)]
-                     (state/set-state! [:ui/find-in-page :q] value)
-                     
-                       (debounced-search)))}]]
+
+   (search-input q)
+
    [:div.px-4.text-sm.opacity-80
     (:activeMatchOrdinal matches 0)
     "/"

+ 16 - 4
src/main/frontend/handler/search.cljs

@@ -10,7 +10,9 @@
             [logseq.graph-parser.text :as text]
             [frontend.util.drawer :as drawer]
             [frontend.util.property :as property]
-            [electron.ipc :as ipc]))
+            [electron.ipc :as ipc]
+            [goog.functions :refer [debounce]]
+            [dommy.core :as dom]))
 
 (defn add-search-to-recent!
   [repo q]
@@ -67,13 +69,23 @@
 
                    backward?
                    (assoc :forward false)
-                   
+
                    match-case?
                    (assoc :matchCase true))]
       (open-find-in-page!)
       (when-not (string/blank? q)
-          (state/set-state! [:ui/find-in-page :searching?] true)
-          (ipc/ipc "find-in-page" q option)))))
+        (dom/set-style! (dom/by-id "search-in-page-input")
+                        :visibility "hidden")
+        (ipc/ipc "find-in-page" q option)))))
+
+(defonce debounced-search (debounce electron-find-in-page! 500))
+
+(defn loop-find-in-page!
+  [backward?]
+  (when (and (get-in @state/state [:ui/find-in-page :active?])
+             (not (state/editing?)))
+    (state/set-state! [:ui/find-in-page :backward?] backward?)
+    (debounced-search)))
 
 (defn electron-exit-find-in-page!
   [& {:keys [clear-state?]

+ 15 - 1
src/main/frontend/modules/shortcut/config.cljs

@@ -253,6 +253,16 @@
                                     :fn      #(when (util/electron?)
                                                 (search-handler/open-find-in-page!))}
 
+   :go/electron-jump-to-the-next {:binding ["enter" "mod+g"]
+                                    :fn      (fn [_state _e]
+                                               (when (util/electron?)
+                                                 (search-handler/loop-find-in-page! false)))}
+
+   :go/electron-jump-to-the-previous {:binding ["shift+enter" "mod+shift+g"]
+                                             :fn      (fn [_state _e]
+                                                        (when (util/electron?)
+                                                          (search-handler/loop-find-in-page! true)))}
+
    :go/journals                    {:binding "g j"
                                     :fn      route-handler/go-to-journals!}
 
@@ -284,7 +294,7 @@
    :graph/open                     {:fn      #(do
                                                 (editor-handler/escape-editing)
                                                 (state/set-state! :ui/open-select :graph-open))
-                                    :binding "mod+shift+g"}
+                                    :binding "alt+shift+g"}
 
    :graph/remove                   {:fn      #(do
                                                 (editor-handler/escape-editing)
@@ -506,6 +516,8 @@
                           :go/search-in-page
                           :go/search
                           :go/electron-find-in-page
+                          :go/electron-jump-to-the-next
+                          :go/electron-jump-to-the-previous
                           :go/backward
                           :go/forward
                           :search/re-index
@@ -559,6 +571,8 @@
     :go/search
     :go/search-in-page
     :go/electron-find-in-page
+    :go/electron-jump-to-the-next
+    :go/electron-jump-to-the-previous
     :editor/undo
     :editor/redo
     :editor/copy

+ 2 - 0
src/main/frontend/modules/shortcut/dicts.cljc

@@ -78,6 +78,8 @@
    :ui/toggle-brackets             "Toggle whether to display brackets"
    :go/search-in-page              "Search in the current page"
    :go/electron-find-in-page       "Find in page"
+   :go/electron-jump-to-the-next   "Jump to the next match to your Find bar search"
+   :go/electron-jump-to-the-previous "Jump to the previous match to your Find bar search"
    :go/search                      "Full text search"
    :go/journals                    "Go to journals"
    :go/backward                    "Backwards"