Browse Source

Merge branch 'master' into feat/capacitor-new

charlie 4 months ago
parent
commit
336f76b2fe

+ 1 - 1
deps/common/package.json

@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "private": true,
   "devDependencies": {
-    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v23"
+    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v24"
   },
   "scripts": {
     "test": "yarn nbb-logseq -cp test -m nextjournal.test-runner"

+ 3 - 3
deps/common/yarn.lock

@@ -2,9 +2,9 @@
 # yarn lockfile v1
 
 
-"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v23":
-  version "1.2.173-feat-db-v23"
-  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/810782c4ddba6346c4ab8ae6740b60438c07cd01"
+"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v24":
+  version "1.2.173-feat-db-v24"
+  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/3d5b78b0382c7253bf9874c1f38586dd338434f4"
   dependencies:
     import-meta-resolve "^4.1.0"
 

+ 1 - 1
deps/db/package.json

@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "private": true,
   "devDependencies": {
-    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v23"
+    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v24"
   },
   "dependencies": {
     "better-sqlite3": "11.10.0"

+ 13 - 4
deps/db/src/logseq/db/common/initial_data.cljs

@@ -200,10 +200,19 @@
    0))
 
 (defn ^:large-vars/cleanup-todo get-block-and-children
-  [db id {:keys [children? children-only? nested-children? properties children-props]}]
-  (let [block (d/entity db (if (uuid? id)
-                             [:block/uuid id]
-                             id))
+  [db id-or-page-name {:keys [children? children-only? nested-children? properties children-props]}]
+  (let [block (let [eid (cond (uuid? id-or-page-name)
+                              [:block/uuid id-or-page-name]
+                              (integer? id-or-page-name)
+                              id-or-page-name
+                              :else nil)]
+                (cond
+                  eid
+                  (d/entity db eid)
+                  (string? id-or-page-name)
+                  (d/entity db (get-first-page-by-name db (name id-or-page-name)))
+                  :else
+                  nil))
         block-refs-count? (some #{:block.temp/refs-count} properties)
         whiteboard? (common-entity-util/whiteboard? block)]
     (when block

+ 9 - 2
deps/db/src/logseq/db/common/view.cljs

@@ -317,7 +317,8 @@
         ref-blocks (cond->> full-ref-blocks
                      (seq page-filters)
                      (filter-blocks page-filters))
-        ref-pages-count (->> full-ref-blocks
+        ref-pages-count (->> (mapcat (fn [id] (:block/_path-refs (d/entity db id))) ids)
+                             (remove (fn [block] (common-initial-data/hidden-ref? db block id)))
                              (mapcat (fn [block]
                                        (->>
                                         (cons
@@ -497,6 +498,10 @@
        values)
      (common-util/distinct-by :label))))
 
+(defn- get-query-properties
+  [entities]
+  (distinct (mapcat keys entities)))
+
 (defn ^:api ^:large-vars/cleanup-todo get-view-data
   [db view-id {:keys [journals? _view-for-id view-feature-type group-by-property-ident input query-entity-ids filters sorting]
                :as opts}]
@@ -583,4 +588,6 @@
        {:count (count filtered-entities)
         :data (distinct data')}
         (= feat-type :linked-references)
-        (assoc :ref-pages-count (:ref-pages-count entities-result))))))
+        (assoc :ref-pages-count (:ref-pages-count entities-result))
+        query?
+        (assoc :properties (get-query-properties entities-result))))))

+ 3 - 3
deps/db/yarn.lock

@@ -2,9 +2,9 @@
 # yarn lockfile v1
 
 
-"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v23":
-  version "1.2.173-feat-db-v23"
-  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/810782c4ddba6346c4ab8ae6740b60438c07cd01"
+"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v24":
+  version "1.2.173-feat-db-v24"
+  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/3d5b78b0382c7253bf9874c1f38586dd338434f4"
   dependencies:
     import-meta-resolve "^4.1.0"
 

+ 1 - 1
deps/graph-parser/package.json

@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "private": true,
   "devDependencies": {
-    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v23",
+    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v24",
     "better-sqlite3": "11.10.0"
   },
   "dependencies": {

+ 3 - 3
deps/graph-parser/yarn.lock

@@ -2,9 +2,9 @@
 # yarn lockfile v1
 
 
-"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v23":
-  version "1.2.173-feat-db-v23"
-  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/810782c4ddba6346c4ab8ae6740b60438c07cd01"
+"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v24":
+  version "1.2.173-feat-db-v24"
+  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/3d5b78b0382c7253bf9874c1f38586dd338434f4"
   dependencies:
     import-meta-resolve "^4.1.0"
 

+ 1 - 1
deps/outliner/package.json

@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "private": true,
   "devDependencies": {
-    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v23"
+    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v24"
   },
   "dependencies": {
     "better-sqlite3": "11.10.0",

+ 3 - 3
deps/outliner/yarn.lock

@@ -2,9 +2,9 @@
 # yarn lockfile v1
 
 
-"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v23":
-  version "1.2.173-feat-db-v23"
-  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/810782c4ddba6346c4ab8ae6740b60438c07cd01"
+"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v24":
+  version "1.2.173-feat-db-v24"
+  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/3d5b78b0382c7253bf9874c1f38586dd338434f4"
   dependencies:
     import-meta-resolve "^4.1.0"
 

+ 1 - 1
deps/publishing/package.json

@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "private": true,
   "devDependencies": {
-    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v23",
+    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v24",
     "mldoc": "^1.5.9"
   },
   "dependencies": {

+ 7 - 6
deps/publishing/src/logseq/publishing/html.cljs

@@ -126,14 +126,15 @@ necessary db filtering"
             [:script {:src "static/js/ui.js"}]
             [:script {:src "static/js/shared.js"}]
             [:script {:src "static/js/main.js"}]
-            [:script {:src "static/js/interact.min.js"}]
-            [:script {:src "static/js/highlight.min.js"}]
-            [:script {:src "static/js/katex.min.js"}]
+            ;; Deferring scripts above results in errors
+            [:script {:defer true :src "static/js/interact.min.js"}]
+            [:script {:defer true :src "static/js/highlight.min.js"}]
+            [:script {:defer true :src "static/js/katex.min.js"}]
             [:script {:defer true :type "module" :src "static/js/pdfjs/pdf.mjs"}]
             [:script {:defer true :type "module" :src "static/js/pdf_viewer3.mjs"}]
-            [:script {:src "static/js/html2canvas.min.js"}]
-            [:script {:src "static/js/code-editor.js"}]
-            [:script {:src "static/js/custom.js"}]])))))
+            [:script {:defer true :src "static/js/html2canvas.min.js"}]
+            [:script {:defer true :src "static/js/code-editor.js"}]
+            [:script {:defer true :src "static/js/custom.js"}]])))))
 
 (defn build-html
   "Given the graph's db, filters the db using the given options and returns the

+ 3 - 3
deps/publishing/yarn.lock

@@ -2,9 +2,9 @@
 # yarn lockfile v1
 
 
-"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v23":
-  version "1.2.173-feat-db-v23"
-  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/810782c4ddba6346c4ab8ae6740b60438c07cd01"
+"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v24":
+  version "1.2.173-feat-db-v24"
+  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/3d5b78b0382c7253bf9874c1f38586dd338434f4"
   dependencies:
     import-meta-resolve "^4.1.0"
 

+ 15 - 11
gulpfile.js

@@ -200,17 +200,21 @@ const common = {
     cb()
   },
 
-  switchReactDevelopmentMode (cb) {
-    const reactFrom = path.join(outputPath, 'js', 'react.development.js')
-    const reactTo = path.join(outputPath, 'js', 'react.production.min.js')
-    cp.execSync(`mv ${reactFrom} ${reactTo}`, { stdio: 'inherit' })
-
-    const reactDomFrom = path.join(outputPath, 'js', 'react-dom.development.js')
-    const reactDomTo = path.join(outputPath, 'js',
-      'react-dom.production.min.js')
-    cp.execSync(`mv ${reactDomFrom} ${reactDomTo}`, { stdio: 'inherit' })
-
-    cb()
+  switchReactDevelopmentMode(cb) {
+    try {
+      const reactFrom = path.join(outputPath, 'js', 'react.development.js');
+      const reactTo = path.join(outputPath, 'js', 'react.production.min.js');
+      fs.renameSync(reactFrom, reactTo);
+
+      const reactDomFrom = path.join(outputPath, 'js', 'react-dom.development.js');
+      const reactDomTo = path.join(outputPath, 'js', 'react-dom.production.min.js');
+      fs.renameSync(reactDomFrom, reactDomTo);
+
+      cb();
+    } catch (err) {
+      console.error("Error during switchReactDevelopmentMode:", err);
+      cb(err);
+    }
   },
 }
 

+ 1 - 1
scripts/package.json

@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "private": true,
   "devDependencies": {
-    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v23"
+    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v24"
   },
   "dependencies": {
     "better-sqlite3": "11.10.0",

+ 3 - 3
scripts/yarn.lock

@@ -2,9 +2,9 @@
 # yarn lockfile v1
 
 
-"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v23":
-  version "1.2.173-feat-db-v23"
-  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/810782c4ddba6346c4ab8ae6740b60438c07cd01"
+"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v24":
+  version "1.2.173-feat-db-v24"
+  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/3d5b78b0382c7253bf9874c1f38586dd338434f4"
   dependencies:
     import-meta-resolve "^4.1.0"
 

+ 10 - 7
src/main/frontend/components/block.cljs

@@ -614,11 +614,14 @@
 
 (declare page-reference)
 
-(defn open-page-ref
+(defn <open-page-ref
   [config page-entity e page-name contents-page?]
   (when (not (util/right-click? e))
-    (let [ignore-alias? (:ignore-alias? config)
-          page (or (and (not ignore-alias?) (first (:block/_alias page-entity))) page-entity)]
+    (p/let [ignore-alias? (:ignore-alias? config)
+            source-page (and (not ignore-alias?)
+                             (or (first (:block/_alias page-entity))
+                                 (db-async/<get-block-source (state/get-current-repo) (:db/id page-entity))))
+            page (or source-page page-entity)]
       (cond
         (gobj/get e "shiftKey")
         (when page
@@ -712,12 +715,12 @@
                           (util/stop e)
                           (state/clear-edit!)
                           (when-not (:disable-click? config)
-                            (open-page-ref config page-entity e page-name contents-page?))
+                            (<open-page-ref config page-entity e page-name contents-page?))
                           (reset! *mouse-down? false)))
        :on-key-up (fn [e] (when (and e (= (.-key e) "Enter") (not other-position?))
                             (util/stop e)
                             (state/clear-edit!)
-                            (open-page-ref config page-entity e page-name contents-page?)))}
+                            (<open-page-ref config page-entity e page-name contents-page?)))}
        on-context-menu
        (assoc :on-context-menu on-context-menu))
      (when (and show-icon? (not tag?))
@@ -2412,10 +2415,10 @@
                          [:div.opacity-75 (if show-query?
                                             "Hide query"
                                             "Set query")]))]
-    [:div.w-full
+    [:div
      {:class (if query?
                "inline-flex"
-               "inline")
+               "w-full inline")
       :on-mouse-over #(set-hover? true)
       :on-mouse-out #(set-hover? false)}
      (cond

+ 9 - 5
src/main/frontend/components/cmdk/core.cljs

@@ -281,14 +281,16 @@
 (defn page-item
   [repo page]
   (let [entity (db/entity [:block/uuid (:block/uuid page)])
-        source-page (model/get-alias-source-page repo (:db/id entity))
+        source-page (or (model/get-alias-source-page repo (:db/id entity))
+                        (:alias page))
         icon (get-page-icon entity)
         title (block-handler/block-unique-title page)
         title' (if source-page (str title " -> alias: " (:block/title source-page)) title)]
     (hash-map :icon icon
               :icon-theme :gray
               :text title'
-              :source-page (or source-page page))))
+              :source-page (or source-page page)
+              :alias (:alias page))))
 
 (defn block-item
   [repo block current-page input]
@@ -433,9 +435,11 @@
 
 (defn- get-highlighted-page-uuid-or-name
   [state]
-  (let [highlighted-item (some-> state state->highlighted-item)]
-    (or (:block/uuid (:source-block highlighted-item))
-        (:block/uuid (:source-page highlighted-item)))))
+  (let [highlighted-item (some-> state state->highlighted-item)
+        block (or (:alias highlighted-item)
+                  (:source-block highlighted-item)
+                  (:source-page highlighted-item))]
+    (:block/uuid block)))
 
 (defmethod handle-action :open-page [_ state _event]
   (when-let [page-name (get-highlighted-page-uuid-or-name state)]

+ 18 - 14
src/main/frontend/components/editor.cljs

@@ -9,6 +9,7 @@
             [frontend.context.i18n :refer [t]]
             [frontend.date :as date]
             [frontend.db :as db]
+            [frontend.db.async :as db-async]
             [frontend.db.model :as db-model]
             [frontend.extensions.zotero :as zotero]
             [frontend.handler.block :as block-handler]
@@ -153,12 +154,13 @@
         [matched-pages set-matched-pages!] (rum/use-state nil)
         search-f (fn []
                    (when-not (string/blank? q)
-                     (p/let [result (if db-tag?
-                                      (editor-handler/get-matched-classes q)
-                                      (p/let [result (editor-handler/<get-matched-blocks q {:nlp-pages? true
-                                                                                            :page-only? (not db-based?)})]
-                                        (reverse (sort-by (fn [result] (:page? result)) result))))]
-                       (set-matched-pages! result))))]
+                     (p/do!
+                      (db-async/<get-block (state/get-current-repo) q {:children? false})
+                      (p/let [result (if db-tag?
+                                       (editor-handler/get-matched-classes q)
+                                       (editor-handler/<get-matched-blocks q {:nlp-pages? true
+                                                                              :page-only? (not db-based?)}))]
+                        (set-matched-pages! result)))))]
     (hooks/use-effect! search-f [(hooks/use-debounced-value q 150)])
 
     (let [matched-pages' (if (string/blank? q)
@@ -184,7 +186,9 @@
          :item-render (fn [block _chosen?]
                         (let [block' (if-let [id (:block/uuid block)]
                                        (if-let [e (db/entity [:block/uuid id])]
-                                         (assoc e :block/title (:block/title block))
+                                         (assoc e
+                                                :block/title (:block/title block)
+                                                :alias (:alias block))
                                          block)
                                        block)]
                           [:div.flex.flex-col
@@ -219,13 +223,13 @@
                                  :else
                                  (ui/icon "letter-n" {:size 14}))])
 
-                            (let [title (if db-tag?
-                                          (let [target (first (:block/_alias block'))
-                                                title (:block/title block)]
-                                            (if (ldb/class? target)
-                                              (str title " -> alias: " (:block/title target))
-                                              title))
-                                          (block-handler/block-unique-title block'))]
+                            (let [title (let [alias (get-in block' [:alias :block/title])
+                                              title (if (and db-based? (not (ldb/built-in? block')))
+                                                      (block-handler/block-unique-title block')
+                                                      (:block/title block'))]
+                                          (if alias
+                                            (str title " -> alias: " alias)
+                                            title))]
                               (if (or (string/starts-with? title (t :new-tag))
                                       (string/starts-with? title (t :new-page)))
                                 title

+ 6 - 2
src/main/frontend/components/objects.cljs

@@ -126,7 +126,9 @@
 
 (rum/defc property-related-objects-inner < rum/static
   [config property properties]
-  (let [columns (views/build-columns config properties)]
+  (let [tags? (= :block/tags (:db/ident property))
+        columns (views/build-columns config properties
+                                     (when tags? {:add-tags-column? false}))]
     (views/view {:config config
                  :view-parent property
                  :view-feature-type :property-objects
@@ -149,6 +151,8 @@
           config {:container-id (:container-id state)
                   :current-page? current-page?}
           ;; Show tags to help differentiate property rows
-          properties [property' (db/entity :block/tags)]]
+          properties (if (= (:db/ident property) :block/tags)
+                       [property']
+                       [property' (db/entity :block/tags)])]
       [:div.ml-1
        (property-related-objects-inner config property' properties)])))

+ 1 - 1
src/main/frontend/components/page.cljs

@@ -108,7 +108,7 @@
     (when page?
       [:div.ls-block.block-add-button.flex-1.flex-col.rounded-sm.cursor-text.transition-opacity.ease-in.duration-100.!py-0
        {:class opacity-class
-        :data-blockId (:db/id block)
+        :data-block-id (:db/id block)
         :ref *ref
         :on-click (fn [e]
                     (util/stop e)

+ 21 - 13
src/main/frontend/components/property/value.cljs

@@ -963,10 +963,17 @@
                                 {:label label
                                  :value (:db/id value)}))
                          (distinct)))
-            items (->> (if (= :date type)
+            items (->> (cond
+                         (= :checkbox type)
+                         [{:label "True"
+                           :value true}
+                          {:label "False"
+                           :value false}]
+                         (= :date type)
                          (map (fn [m] (let [label (:block/title (db/entity (:value m)))]
                                         (when label
                                           (assoc m :label label)))) items)
+                         :else
                          items)
                        (remove nil?))
             on-chosen (fn [chosen selected?]
@@ -976,9 +983,10 @@
                                                          :exit-edit? exit-edit?
                                                          :refresh-result-f refresh-result-f})))
             selected-choices' (get block (:db/ident property))
-            selected-choices (if (every? #(and (map? %) (:db/id %)) selected-choices')
-                               (map :db/id selected-choices')
-                               [selected-choices'])]
+            selected-choices (when-not (= type :checkbox)
+                               (if (every? #(and (map? %) (:db/id %)) selected-choices')
+                                 (map :db/id selected-choices')
+                                 [selected-choices']))]
         (select-aux block property
                     {:multiple-choices? multiple-choices?
                      :items items
@@ -1161,7 +1169,7 @@
         popup-content (fn content-fn [target]
                         [:div.property-select
                          (case type
-                           (:entity :number :default :url)
+                           (:entity :number :default :url :checkbox)
                            (select block property select-opts' opts)
 
                            (:node :class :property :page :date)
@@ -1303,7 +1311,7 @@
         batch? (batch-operation?)
         closed-values? (seq (:property/closed-values property))
         select-type?' (or (select-type? block property)
-                          (and editing? batch? (contains? #{:default :url} type) (not closed-values?)))
+                          (and editing? batch? (contains? #{:default :url :checkbox} type) (not closed-values?)))
         select-opts {:on-chosen on-chosen}
         value (if (and (entity-map? value*) (= (:db/ident value*) :logseq.property/empty-placeholder))
                 nil
@@ -1346,20 +1354,20 @@
           (property-value-date-picker block property value (merge opts {:editing? editing?}))
 
           :checkbox
-          (let [add-property! (fn []
-                                (let [value' (boolean (not value))]
-                                  (<add-property! block (:db/ident property) value' opts)
-                                  (when-let [on-checked-change (:on-checked-change opts)]
-                                    (on-checked-change value'))))]
+          (let [add-property! (fn [value]
+                                (<add-property! block (:db/ident property) value opts)
+                                (when-let [on-checked-change (:on-checked-change opts)]
+                                  (on-checked-change value)))]
             [:label.flex.w-full.as-scalar-value-wrap.cursor-pointer
              (shui/checkbox {:class "jtrigger flex flex-row items-center"
                              :disabled config/publishing?
                              :auto-focus editing?
                              :checked value
-                             :on-checked-change add-property!
+                             :on-checked-change (fn []
+                                                  (add-property! (boolean (not value))))
                              :on-key-down (fn [e]
                                             (when (= (util/ekey e) "Enter")
-                                              (add-property!))
+                                              (add-property! (boolean (not value))))
                                             (when (contains? #{"Backspace" "Delete"} (util/ekey e))
                                               (delete-block-property! block property)))})])
           ;; :others

+ 2 - 13
src/main/frontend/components/query/view.cljs

@@ -3,18 +3,9 @@
   (:require [frontend.components.views :as views]
             [frontend.db :as db]
             [frontend.state]
-            [logseq.db :as ldb]
             [logseq.shui.hooks :as hooks]
             [rum.core :as rum]))
 
-(defn- columns
-  [config result]
-  (->> (mapcat :block.temp/property-keys result)
-       distinct
-       (map db/entity)
-       (ldb/sort-by-order)
-       ((fn [cs] (views/build-columns config cs {:add-tags-column? false})))))
-
 (defn- result->entities
   [result]
   (map (fn [b] (or (db/entity (:db/id b)) b)) result))
@@ -33,8 +24,7 @@
 (rum/defc query-result
   [config view-entity result*]
   (let [[data set-data!] (rum/use-state (init-result result* view-entity))
-        ids (mapv :db/id data)
-        columns' (columns config data)]
+        ids (mapv :db/id data)]
     (hooks/use-effect!
      (fn []
        (set-data! (init-result result* view-entity)))
@@ -47,5 +37,4 @@
        :view-feature-type :query-result
        :data ids
        :set-data! set-data!
-       :query-entity-ids ids
-       :columns columns'})]))
+       :query-entity-ids ids})]))

+ 54 - 34
src/main/frontend/components/views.cljs

@@ -329,10 +329,8 @@
                         :or {with-object-name? true
                              with-id? true
                              add-tags-column? true}}]
-  (let [;; FIXME: Shouldn't file graphs have :block/tags?
-        add-tags-column?' (and (config/db-based-graph? (state/get-current-repo)) add-tags-column?)
-        properties' (->>
-                     (if (or (some #(= (:db/ident %) :block/tags) properties) (not add-tags-column?'))
+  (let [properties' (->>
+                     (if (or (some #(= (:db/ident %) :block/tags) properties) (not add-tags-column?))
                        properties
                        (conj properties (db/entity :block/tags)))
                      (remove nil?))]
@@ -2017,9 +2015,52 @@
   [view opts]
   (state/<invoke-db-worker :thread-api/get-view-data (state/get-current-repo) (:db/id view) opts))
 
+(defn- get-query-columns
+  [config properties]
+  (->> properties
+       (map db/entity)
+       (ldb/sort-by-order)
+       ((fn [cs] (build-columns config cs {:add-tags-column? false})))))
+
+(defn- load-view-data-aux
+  [view-entity view-parent {:keys [query? query-entity-ids sorting filters input
+                                   view-feature-type group-by-property-ident
+                                   set-data! set-ref-pages-count! set-properties! set-loading!]}]
+  (c.m/run-task*
+   (m/sp
+     (let [need-query? (and query? (seq query-entity-ids) (or sorting filters (not (string/blank? input))))]
+       (cond
+         (and query? (empty? query-entity-ids))
+         (set-data! nil)
+         (and query? (not (or sorting filters)) (string/blank? input))
+         (set-data! query-entity-ids)
+         :else
+         (when (or (not query?) need-query?)
+           (try
+             (let [{:keys [data ref-pages-count properties]}
+                   (c.m/<?
+                    (<load-view-data view-entity
+                                     (cond->
+                                      {:view-for-id (or (:db/id (:logseq.property/view-for view-entity))
+                                                        (:db/id view-parent))
+                                       :view-feature-type view-feature-type
+                                       :group-by-property-ident group-by-property-ident
+                                       :input input
+                                       :filters filters
+                                       :sorting sorting}
+                                       query?
+                                       (assoc :query-entity-ids query-entity-ids))))]
+               (set-data! data)
+               (when ref-pages-count
+                 (set-ref-pages-count! ref-pages-count))
+               (set-properties! properties))
+             (finally
+               (set-loading! false)))))))))
+
 (rum/defc view-aux
-  [view-entity {:keys [view-parent view-feature-type data query-entity-ids set-view-entity!] :as option}]
+  [view-entity {:keys [config view-parent view-feature-type data query-entity-ids set-view-entity!] :as option}]
   (let [[input set-input!] (hooks/use-state "")
+        [properties set-properties!] (hooks/use-state nil)
         db-based? (config/db-based-graph?)
         group-by-property (:logseq.property.view/group-by-property view-entity)
         display-type (if (config/db-based-graph?)
@@ -2044,39 +2085,18 @@
         view-filters (:logseq.property.table/filters view-entity)
         [filters set-filters!] (rum/use-state (or view-filters {}))
         query? (= view-feature-type :query-result)
+        option (if query? (assoc option :columns (get-query-columns config properties)) option)
         [loading? set-loading!] (hooks/use-state (not query?))
         [data set-data!] (hooks/use-state data)
         [ref-pages-count set-ref-pages-count!] (hooks/use-state nil)
         load-view-data (fn load-view-data []
-                         (c.m/run-task*
-                          (m/sp
-                            (let [need-query? (and query? (seq query-entity-ids) (or sorting filters (not (string/blank? input))))]
-                              (cond
-                                (and query? (empty? query-entity-ids))
-                                (set-data! nil)
-                                (and query? (not (or sorting filters)) (string/blank? input))
-                                (set-data! query-entity-ids)
-                                :else
-                                (when (or (not query?) need-query?)
-                                  (try
-                                    (let [{:keys [data ref-pages-count]}
-                                          (c.m/<?
-                                           (<load-view-data view-entity
-                                                            (cond->
-                                                             {:view-for-id (or (:db/id (:logseq.property/view-for view-entity))
-                                                                               (:db/id view-parent))
-                                                              :view-feature-type view-feature-type
-                                                              :group-by-property-ident group-by-property-ident
-                                                              :input input
-                                                              :filters filters
-                                                              :sorting sorting}
-                                                              query?
-                                                              (assoc :query-entity-ids query-entity-ids))))]
-                                      (set-data! data)
-                                      (when ref-pages-count
-                                        (set-ref-pages-count! ref-pages-count)))
-                                    (finally
-                                      (set-loading! false)))))))))]
+                         (load-view-data-aux view-entity view-parent
+                                             {:query? query?
+                                              :query-entity-ids query-entity-ids
+                                              :sorting sorting :filters filters :input input
+                                              :view-feature-type view-feature-type :group-by-property-ident group-by-property-ident
+                                              :set-data! set-data! :set-ref-pages-count! set-ref-pages-count!
+                                              :set-properties! set-properties! :set-loading! set-loading!}))]
     (let [sorting-filters {:sorting sorting
                            :filters filters}]
       (hooks/use-effect!

+ 7 - 0
src/main/frontend/db/async.cljs

@@ -151,6 +151,13 @@
             _ (d/transact! conn result)]
       result)))
 
+(defn <get-block-source
+  [graph id]
+  (assert (integer? id))
+  (p/let [source-id (state/<invoke-db-worker :thread-api/get-block-source graph id)]
+    (when source-id
+      (<get-block graph source-id {:children? false}))))
+
 (defn <get-block-refs
   [graph eid]
   (assert (integer? eid))

+ 39 - 34
src/main/frontend/extensions/fsrs.cljs

@@ -188,39 +188,43 @@
 
 (rum/defcs ^:private card-view < rum/reactive db-mixins/query
   {:will-mount (fn [state]
-                 (when-let [[repo block-id _] (:rum/args state)]
-                   (db-async/<get-block repo block-id {:children? false}))
-                 state)}
-  [state repo block-id *card-index *phase]
-  (when-let [block-entity (db/sub-block block-id)]
-    (let [phase (rum/react *phase)
-          next-phase (phase->next-phase block-entity phase)]
-      [:div.ls-card.content.flex.flex-col.overflow-y-auto.overflow-x-hidden
-       [:div (component-block/breadcrumb {} repo (:block/uuid block-entity) {})]
-       (let [option (case phase
-                      :init
-                      {:hide-children? true}
-                      :show-cloze
-                      {:show-cloze? true
-                       :hide-children? true}
-                      {:show-cloze? true})]
-         (component-block/blocks-container option [block-entity]))
-       [:div.mt-8.pb-2
-        (if (contains? #{:show-cloze :show-answer} next-phase)
-          (btn-with-shortcut {:btn-text (t
-                                         (case next-phase
-                                           :show-answer
-                                           :flashcards/modal-btn-show-answers
-                                           :show-cloze
-                                           :flashcards/modal-btn-show-clozes
-                                           :init
-                                           :flashcards/modal-btn-hide-answers))
-                              :shortcut "s"
-                              :id (str "card-answers")
-                              :on-click #(swap! *phase
-                                                (fn [phase]
-                                                  (phase->next-phase block-entity phase)))})
-          [:div.flex.justify-center (rating-btns repo block-entity *card-index *phase)])]])))
+                 (let [[repo block-id _] (:rum/args state)
+                       *block (atom nil)]
+                   (p/let [result (db-async/<get-block repo block-id {:children? true})]
+                     (reset! *block result))
+                   (assoc state ::block *block)))}
+  [state repo _block-id *card-index *phase]
+  (when-let [block (rum/react (::block state))]
+    (when-let [block-entity (db/sub-block (:db/id block))]
+      (let [phase (rum/react *phase)
+            _card-index (rum/react *card-index)
+            next-phase (phase->next-phase block-entity phase)]
+        [:div.ls-card.content.flex.flex-col.overflow-y-auto.overflow-x-hidden
+         [:div (component-block/breadcrumb {} repo (:block/uuid block-entity) {})]
+         (let [option (case phase
+                        :init
+                        {:hide-children? true}
+                        :show-cloze
+                        {:show-cloze? true
+                         :hide-children? true}
+                        {:show-cloze? true})]
+           (component-block/blocks-container option [block-entity]))
+         [:div.mt-8.pb-2
+          (if (contains? #{:show-cloze :show-answer} next-phase)
+            (btn-with-shortcut {:btn-text (t
+                                           (case next-phase
+                                             :show-answer
+                                             :flashcards/modal-btn-show-answers
+                                             :show-cloze
+                                             :flashcards/modal-btn-show-clozes
+                                             :init
+                                             :flashcards/modal-btn-hide-answers))
+                                :shortcut "s"
+                                :id (str "card-answers")
+                                :on-click #(swap! *phase
+                                                  (fn [phase]
+                                                    (phase->next-phase block-entity phase)))})
+            [:div.flex.justify-center (rating-btns repo block-entity *card-index *phase)])]]))))
 
 (declare update-due-cards-count)
 (rum/defcs cards-view < rum/reactive
@@ -253,6 +257,7 @@
         block-ids (rum/react *block-ids)
         loading? (rum/react (::loading? state))
         *card-index (::card-index state)
+        card-index (rum/react *card-index)
         *phase (atom :init)]
     (when (false? loading?)
       [:div#cards-modal.flex.flex-col.gap-8.h-full.flex-1
@@ -275,7 +280,7 @@
                                 (:block/title card-entity)))))))
 
         [:span.text-sm.opacity-50 (str (min (inc @*card-index) (count @*block-ids)) "/" (count @*block-ids))]]
-       (let [block-id (nth block-ids @*card-index nil)]
+       (let [block-id (nth block-ids card-index nil)]
          (cond
            block-id
            [:div.flex.flex-col

+ 1 - 1
src/main/frontend/handler/common/page.cljs

@@ -83,7 +83,7 @@
                  (js/setTimeout
                   (fn []
                     (when-let [block-add-button (->> (dom/sel ".block-add-button")
-                                                     (filter #(= (str (:db/id page)) (dom/attr % "data-blockId")))
+                                                     (filter #(= (str (:db/id page)) (dom/attr % "data-block-id")))
                                                      first)]
                       (.click block-add-button)))
                   200)))

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

@@ -1606,12 +1606,13 @@
           result (search/block-search (state/get-current-repo) q {:built-in? false
                                                                   :enable-snippet? false
                                                                   :page-only? page-only?})
-          matched (remove (fn [b] (= (:block/uuid b) (:block/uuid block))) result)]
-    (-> (concat matched
-                (when nlp-pages?
-                  (map (fn [title] {:block/title title :nlp-date? true})
-                       date/nlp-pages)))
-        (search/fuzzy-search q {:extract-fn :block/title :limit 50}))))
+          matched (remove (fn [b] (= (:block/uuid b) (:block/uuid block))) result)
+          result' (-> (concat matched
+                              (when nlp-pages?
+                                (map (fn [title] {:block/title title :nlp-date? true :page? true})
+                                     date/nlp-pages)))
+                      (search/fuzzy-search q {:extract-fn :block/title :limit 50}))]
+    (sort-by (complement :page?) result')))
 
 (defn <get-matched-templates
   [q]

+ 6 - 1
src/main/frontend/handler/page.cljs

@@ -257,9 +257,14 @@
   (fn [chosen-result e]
     (util/stop e)
     (state/clear-editor-action!)
-    (p/let [chosen-result (if (:block/uuid chosen-result)
+    (p/let [_ (when-let [id (:block/uuid chosen-result)]
+                (db-async/<get-block (state/get-current-repo) id {:children? false}))
+            chosen-result (if (:block/uuid chosen-result)
                             (db/entity [:block/uuid (:block/uuid chosen-result)])
                             chosen-result)
+            _ (when-not chosen-result
+                (throw (ex-info "No chosen item"
+                                {:chosen chosen-result})))
             chosen (:block/title chosen-result)
             chosen' (string/replace-first chosen (str (t :new-page) " ") "")
             [chosen' chosen-result] (or (when (and (:nlp-date? chosen-result) (not (de/entity? chosen-result)))

+ 5 - 0
src/main/frontend/worker/db_worker.cljs

@@ -469,6 +469,11 @@
   (when-let [conn (worker-state/get-datascript-conn repo)]
     (ldb/get-block-refs-count @conn id)))
 
+(def-thread-api :thread-api/get-block-source
+  [repo id]
+  (when-let [conn (worker-state/get-datascript-conn repo)]
+    (:db/id (first (:block/_alias (d/entity @conn id))))))
+
 (def-thread-api :thread-api/block-refs-check
   [repo id {:keys [unlinked?]}]
   (when-let [conn (worker-state/get-datascript-conn repo)]

+ 3 - 1
src/main/frontend/worker/search.cljs

@@ -325,7 +325,9 @@ DROP TRIGGER IF EXISTS blocks_au;
                                                    (uuid page)
                                                    nil)
                                      :block/tags (seq (map :db/id (:block/tags block)))
-                                     :page? (ldb/page? block)}))))))
+                                     :page? (ldb/page? block)
+                                     :alias (some-> (first (:block/_alias block))
+                                                    (select-keys [:block/uuid :block/title]))}))))))
           page-or-object-result (filter (fn [b] (or (:page? b) (:block/tags result))) result)]
       (->>
        (concat page-or-object-result