1
0
Эх сурвалжийг харах

feat: support nlp date in node reference (#11531)

feat: support nlp date in node reference
Tienson Qin 1 жил өмнө
parent
commit
42f127b396

+ 10 - 1
src/main/frontend/common/search_fuzzy.cljs

@@ -42,7 +42,16 @@
         ;; boost score if we have an exact match including punctuation
         (empty? q) (+ score'
                       (str-len-distance query s)
-                      (if (<= 0 (.indexOf ostr oquery)) MAX-STRING-LENGTH 0))
+                      (cond
+                        (<= 0 (.indexOf ostr oquery))
+                        MAX-STRING-LENGTH
+
+                        (<= 0 (.indexOf (string/lower-case ostr) (string/lower-case oquery)))
+                        (- MAX-STRING-LENGTH 0.1)
+
+                        :else
+                        0)
+                      (if (empty? s) 1 0))
         (empty? s) 0
         :else (if (= (first q) (first s))
                 (recur (rest q)

+ 11 - 3
src/main/frontend/components/editor.cljs

@@ -33,7 +33,8 @@
             [promesa.core :as p]
             [react-draggable]
             [rum.core :as rum]
-            [frontend.config :as config]))
+            [frontend.config :as config]
+            [frontend.date :as date]))
 
 (defn filter-commands
   [page? commands]
@@ -144,7 +145,11 @@
                                           (editor-handler/<get-matched-blocks q))]
                            (set-matched-pages! result))))
                      [q])
-    (let [matched-pages (when-not (string/blank? q)
+    (let [matched-pages (if (string/blank? q)
+                          (->> (map (fn [title] {:block/title title
+                                                 :nlp-date? true})
+                                    date/nlp-pages)
+                               (take 10))
                           ;; reorder, shortest and starts-with first.
                           (let [matched-pages-with-new-page
                                 (fn [partial-matched-pages]
@@ -180,6 +185,9 @@
                             (when-not db-tag?
                               [:div.flex.items-center
                                (cond
+                                 (:nlp-date? block)
+                                 (ui/icon "calendar" {:size 14})
+
                                  (ldb/class? block)
                                  (ui/icon "hash" {:size 14})
 
@@ -193,7 +201,7 @@
                                  (ui/icon "page" {:extension? true})
 
                                  (or (string/starts-with? (str (:block/title block)) (t :new-tag))
-                                   (string/starts-with? (str (:block/title block)) (t :new-page)))
+                                     (string/starts-with? (str (:block/title block)) (t :new-page)))
                                  (ui/icon "plus" {:size 14})
 
                                  :else

+ 27 - 0
src/main/frontend/date.cljs

@@ -179,6 +179,33 @@
     (goog.date.Date. (.getFullYear d) (.getMonth d) (.getDate d))
     :else d))
 
+(def nlp-pages
+  ["Today"
+   "Tomorrow"
+   "Yesterday"
+   "Next week"
+   "Last week"
+   "Next month"
+   "Last month"
+   "Next year"
+   "Last year"
+   "Last Monday"
+   "Last Tuesday"
+   "Last Wednesday"
+   "Last Thursday"
+   "Last Friday"
+   "Last Saturday"
+   "Last Sunday"
+   "Next Monday"
+   "Next Tuesday"
+   "Next Wednesday"
+   "Next Thursday"
+   "Next Friday"
+   "Next Saturday"
+   "Next Sunday"])
+
+
+
 (comment
   (def default-formatter (tf/formatter "MMM do, yyyy"))
   (def zh-formatter (tf/formatter "YYYY年MM月dd日"))

+ 0 - 1
src/main/frontend/db/react.cljs

@@ -197,7 +197,6 @@
   "Re-compute corresponding queries (from tx) and refresh the related react components."
   [repo-url affected-keys]
   (when (and repo-url (seq affected-keys))
-    (prn :debug :affected-keys affected-keys)
     (refresh-affected-queries! repo-url affected-keys)))
 
 (defn run-custom-queries-when-idle!

+ 11 - 7
src/main/frontend/handler/editor.cljs

@@ -1654,13 +1654,17 @@
   "Return matched blocks that are not built-in"
   [q]
   (p/let [block (state/get-edit-block)
-          pages (search/block-search (state/get-current-repo) q {:built-in? false
-                                                                 :enable-snippet? false})]
-    (keep (fn [b]
-            (when-let [id (:block/uuid b)]
-              (when-not (= id (:block/uuid block)) ; avoid block self-reference
-                (db/entity [:block/uuid id]))))
-          pages)))
+          nodes (search/block-search (state/get-current-repo) q {:built-in? false
+                                                                 :enable-snippet? false})
+          matched (keep (fn [b]
+                          (when-let [id (:block/uuid b)]
+                            (when-not (= id (:block/uuid block)) ; avoid block self-reference
+                              (db/entity [:block/uuid id]))))
+                        nodes)
+          matched-dates (map (fn [title] {:block/title title
+                                          :nlp-date? true}) date/nlp-pages)]
+    (-> (concat matched-dates matched)
+        (search/fuzzy-search q {:extract-fn :block/title :limit 50}))))
 
 (defn <get-matched-templates
   [q]

+ 39 - 32
src/main/frontend/handler/page.cljs

@@ -346,37 +346,44 @@
 (defn- page-on-chosen-handler
   [id format q db-based?]
   (fn [chosen-result e]
-        (util/stop e)
-        (state/clear-editor-action!)
-        (p/let [chosen-result (if (:block/uuid chosen-result)
-                                (db/entity [:block/uuid (:block/uuid chosen-result)])
-                                chosen-result)
-                chosen (:block/title chosen-result)
-                chosen' (string/replace-first chosen (str (t :new-page) " ") "")
-                ref-text (if (and (de/entity? chosen-result) (not (ldb/page? chosen-result)))
-                           (cond
-                             db-based?
-                             (page-ref/->page-ref (:block/uuid chosen-result))
-                             :else
-                             (block-ref/->block-ref (:block/uuid chosen-result)))
-                           (get-page-ref-text chosen'))
-                result (when db-based?
-                         (when-not (de/entity? chosen-result)
-                           (<create! chosen'
-                                     {:redirect? false
-                                      :create-first-block? false})))
-                ref-text' (if result (page-ref/->page-ref (:block/title result)) ref-text)]
-          (p/do!
-           (editor-handler/insert-command! id
-                                           ref-text'
-                                           format
-                                           {:last-pattern (str page-ref/left-brackets (if (editor-handler/get-selected-text) "" q))
-                                            :end-pattern page-ref/right-brackets
-                                            :postfix-fn   (fn [s] (util/replace-first page-ref/right-brackets s ""))
-                                            :command :page-ref})
-           (p/let [chosen-result (or result chosen-result)]
-             (when (de/entity? chosen-result)
-               (state/conj-block-ref! chosen-result)))))))
+    (util/stop e)
+    (state/clear-editor-action!)
+    (p/let [chosen-result (if (:block/uuid chosen-result)
+                            (db/entity [:block/uuid (:block/uuid chosen-result)])
+                            chosen-result)
+            chosen (:block/title chosen-result)
+            chosen' (string/replace-first chosen (str (t :new-page) " ") "")
+            [chosen' chosen-result] (or (when-not (de/entity? chosen-result)
+                                          (when-let [result (date/nld-parse chosen')]
+                                            (let [d (doto (goog.date.DateTime.) (.setTime (.getTime result)))
+                                                  gd (goog.date.Date. (.getFullYear d) (.getMonth d) (.getDate d))
+                                                  page (date/js-date->journal-title gd)]
+                                              [page (db/get-page page)])))
+                                        [chosen' chosen-result])
+            ref-text (if (and (de/entity? chosen-result) (not (ldb/page? chosen-result)))
+                       (cond
+                         db-based?
+                         (page-ref/->page-ref (:block/uuid chosen-result))
+                         :else
+                         (block-ref/->block-ref (:block/uuid chosen-result)))
+                       (get-page-ref-text chosen'))
+            result (when db-based?
+                     (when-not (de/entity? chosen-result)
+                       (<create! chosen'
+                                 {:redirect? false
+                                  :create-first-block? false})))
+            ref-text' (if result (page-ref/->page-ref (:block/title result)) ref-text)]
+      (p/do!
+       (editor-handler/insert-command! id
+                                       ref-text'
+                                       format
+                                       {:last-pattern (str page-ref/left-brackets (if (editor-handler/get-selected-text) "" q))
+                                        :end-pattern page-ref/right-brackets
+                                        :postfix-fn   (fn [s] (util/replace-first page-ref/right-brackets s ""))
+                                        :command :page-ref})
+       (p/let [chosen-result (or result chosen-result)]
+         (when (de/entity? chosen-result)
+           (state/conj-block-ref! chosen-result)))))))
 
 (defn on-chosen-handler
   [input id pos format]
@@ -479,4 +486,4 @@
    (if page-uuid
      (util/copy-to-clipboard!
       (url-util/get-logseq-graph-page-url nil (state/get-current-repo) (str page-uuid)))
-     (notification/show! "No page found to copy" :warning))))
+     (notification/show! "No page found to copy" :warning))))

+ 25 - 26
src/main/frontend/ui.cljs

@@ -521,35 +521,34 @@
        [:div#ui__ac-inner.hide-scrollbar
         (when header header)
         (for [[idx item] (medley/indexed matched)]
-          [:<>
-           {:key idx}
-           (let [item-cp
-                 [:div.menu-link-wrap
-                  {:key            idx
+          (let [react-key (str idx)
+                item-cp
+                [:div.menu-link-wrap
+                 {:key react-key
                    ;; mouse-move event to indicate that cursor moved by user
-                   :on-mouse-move  #(reset! *current-idx idx)}
-                  (let [chosen? (= @*current-idx idx)]
-                    (menu-link
-                     {:id (str "ac-" idx)
-                      :tab-index "0"
-                      :class (when chosen? "chosen")
+                  :on-mouse-move  #(reset! *current-idx idx)}
+                 (let [chosen? (= @*current-idx idx)]
+                   (menu-link
+                    {:id (str "ac-" react-key)
+                     :tab-index "0"
+                     :class (when chosen? "chosen")
                        ;; TODO: should have more tests on touch devices
                        ;:on-pointer-down #(util/stop %)
-                      :on-click (fn [e]
-                                  (util/stop e)
-                                  (if (and (gobj/get e "shiftKey") on-shift-chosen)
-                                    (on-shift-chosen item)
-                                    (on-chosen item e)))}
-                     (if item-render (item-render item chosen?) item)))]]
-
-             (let [group-name (and (fn? get-group-name) (get-group-name item))]
-               (if (and group-name (not (contains? @*groups group-name)))
-                 (do
-                   (swap! *groups conj group-name)
-                   [:div
-                    [:div.ui__ac-group-name group-name]
-                    item-cp])
-                 item-cp)))])]
+                     :on-click (fn [e]
+                                 (util/stop e)
+                                 (if (and (gobj/get e "shiftKey") on-shift-chosen)
+                                   (on-shift-chosen item)
+                                   (on-chosen item e)))}
+                    (if item-render (item-render item chosen?) item)))]]
+
+            (let [group-name (and (fn? get-group-name) (get-group-name item))]
+              (if (and group-name (not (contains? @*groups group-name)))
+                (do
+                  (swap! *groups conj group-name)
+                  [:div
+                   [:div.ui__ac-group-name group-name]
+                   item-cp])
+                item-cp))))]
        (when empty-placeholder
          empty-placeholder))]))
 

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
src/rtc_e2e_test/example.cljs


+ 1 - 1
src/test/frontend/db/db_based_model_test.cljs

@@ -24,7 +24,7 @@
   (let [opts {:redirect? false :create-first-block? false :class? true}
         _ (test-helper/create-page! "class1" opts)
         _ (test-helper/create-page! "class2" opts)]
-    (is (= ["Card" "Journal" "Query" "Root tag" "Task" "class1" "class2"] (sort (map :block/title (model/get-all-classes repo)))))))
+    (is (= ["Card" "Journal" "Query" "Root Tag" "Task" "class1" "class2"] (sort (map :block/title (model/get-all-classes repo)))))))
 
 (deftest ^:fix-me get-class-objects-test
   (let [opts {:redirect? false :create-first-block? false :class? true}

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно