瀏覽代碼

fix: async query for scheduled and deadlines

Tienson Qin 1 年之前
父節點
當前提交
ff77698083

+ 12 - 6
src/main/frontend/components/scheduled_deadlines.cljs

@@ -7,8 +7,8 @@
             [clojure.string :as string]
             [frontend.components.editor :as editor]
             [rum.core :as rum]
-            [frontend.db :as db]
-            [frontend.db-mixins :as db-mixins]))
+            [frontend.db.async :as db-async]
+            [promesa.core :as p]))
 
 (defn- scheduled-or-deadlines?
   [page-name]
@@ -16,10 +16,16 @@
        (not (true? (state/scheduled-deadlines-disabled?)))
        (= (string/lower-case page-name) (string/lower-case (date/journal-name)))))
 
-(rum/defc scheduled-and-deadlines-inner < rum/reactive db-mixins/query
-  [page-name]
-  (let [scheduled-or-deadlines (when (scheduled-or-deadlines? page-name)
-                                 (db/get-date-scheduled-or-deadlines (string/capitalize page-name)))]
+(rum/defcs scheduled-and-deadlines-inner < rum/reactive
+  {:init (fn [state]
+           (let [*result (atom nil)
+                 page-name (first (:rum/args state))]
+             (p/let [result (when (scheduled-or-deadlines? page-name)
+                              (db-async/<get-date-scheduled-or-deadlines (string/capitalize page-name)))]
+               (reset! *result result))
+             (assoc state ::result *result)))}
+  [state page-name]
+  (let [scheduled-or-deadlines (rum/react (::result state))]
     (when (seq scheduled-or-deadlines)
       [:div.scheduled-or-deadlines.mt-8
        (ui/foldable

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

@@ -34,7 +34,7 @@
   get-block-and-children get-block-by-uuid get-block-children sort-by-left
   get-block-parent get-block-parents parents-collapsed? get-block-referenced-blocks
   get-block-immediate-children get-block-page
-  get-custom-css get-date-scheduled-or-deadlines
+  get-custom-css
   get-file-last-modified-at get-file get-file-page get-file-page-id file-exists?
   get-files-blocks get-files-full get-journals-length get-pages-with-file
   get-latest-journals get-page get-page-alias get-page-alias-names

+ 39 - 1
src/main/frontend/db/async.cljs

@@ -10,10 +10,14 @@
             [frontend.db.async.util :as db-async-util]
             [frontend.db.file-based.async :as file-async]
             [frontend.db :as db]
+            [frontend.db.model :as db-model]
             [frontend.persist-db.browser :as db-browser]
             [clojure.edn :as edn]
             [datascript.core :as d]
-            [frontend.db.react :as react]))
+            [frontend.db.react :as react]
+            [frontend.date :as date]
+            [cljs-time.core :as t]
+            [cljs-time.format :as tf]))
 
 (def <q db-async-util/<q)
 (def <pull db-async-util/<pull)
@@ -174,3 +178,37 @@
   (when (and graph path)
     (p/let [result (<pull graph [:file/path path])]
       (:file/content result))))
+
+(defn <get-date-scheduled-or-deadlines
+  [journal-title]
+  (when-let [date (date/journal-title->int journal-title)]
+    (let [future-days (state/get-scheduled-future-days)
+          date-format (tf/formatter "yyyyMMdd")
+          current-day (tf/parse date-format (str date))
+          future-day (some->> (t/plus current-day (t/days future-days))
+                              (tf/unparse date-format)
+                              (parse-long))]
+      (when future-day
+        (when-let [repo (state/get-current-repo)]
+          (p/let [result (<q repo
+                             '[:find [(pull ?block ?block-attrs) ...]
+                               :in $ ?day ?future ?block-attrs
+                               :where
+                               (or
+                                [?block :block/scheduled ?d]
+                                [?block :block/deadline ?d])
+                               [(get-else $ ?block :block/repeated? false) ?repeated]
+                               [(get-else $ ?block :block/marker "NIL") ?marker]
+                               [(not= ?marker "DONE")]
+                               [(not= ?marker "CANCELED")]
+                               [(not= ?marker "CANCELLED")]
+                               [(<= ?d ?future)]
+                               (or-join [?repeated ?d ?day]
+                                        [(true? ?repeated)]
+                                        [(>= ?d ?day)])]
+                             date
+                             future-day
+                             db-model/block-attrs)]
+            (->> result
+                 db-model/sort-by-left-recursive
+                 db-utils/group-by-page)))))))

+ 0 - 37
src/main/frontend/db/model.cljs

@@ -17,8 +17,6 @@
             [logseq.graph-parser.text :as text]
             [logseq.graph-parser.util.db :as db-util]
             [logseq.common.util :as common-util]
-            [cljs-time.core :as t]
-            [cljs-time.format :as tf]
             [frontend.config :as config]
             [logseq.db :as ldb]))
 
@@ -807,41 +805,6 @@ independent of format as format specific heading characters are stripped"
           :entities
           (remove (fn [block] (= page-id (:db/id (:block/page block)))))))))))
 
-(defn get-date-scheduled-or-deadlines
-  [journal-title]
-  (when-let [date (date/journal-title->int journal-title)]
-    (let [future-days (state/get-scheduled-future-days)
-          date-format (tf/formatter "yyyyMMdd")
-          current-day (tf/parse date-format (str date))
-          future-day (some->> (t/plus current-day (t/days future-days))
-                              (tf/unparse date-format)
-                              (parse-long))]
-      (when future-day
-        (when-let [repo (state/get-current-repo)]
-          (->> (react/q repo [:custom :scheduled-deadline journal-title]
-                 {:use-cache? false}
-                 '[:find [(pull ?block ?block-attrs) ...]
-                   :in $ ?day ?future ?block-attrs
-                   :where
-                   (or
-                    [?block :block/scheduled ?d]
-                    [?block :block/deadline ?d])
-                   [(get-else $ ?block :block/repeated? false) ?repeated]
-                   [(get-else $ ?block :block/marker "NIL") ?marker]
-                   [(not= ?marker "DONE")]
-                   [(not= ?marker "CANCELED")]
-                   [(not= ?marker "CANCELLED")]
-                   [(<= ?d ?future)]
-                   (or-join [?repeated ?d ?day]
-                            [(true? ?repeated)]
-                            [(>= ?d ?day)])]
-                 date
-                 future-day
-                 block-attrs)
-               react
-               (sort-by-left-recursive)
-               db-utils/group-by-page))))))
-
 (defn get-block-referenced-blocks
   ([block-uuid]
    (get-block-referenced-blocks block-uuid {}))

+ 1 - 1
src/main/logseq/api.cljs

@@ -922,7 +922,7 @@
 
                                       :else %)
                                    inputs)
-              result          (db-async/<q repo (cons query resolved-inputs))]
+              result          (apply db-async/<q repo (cons query resolved-inputs))]
         (bean/->js (sdk-utils/normalize-keyword-for-json result false))))))
 
 (defn ^:export custom_query