Просмотр исходного кода

fix: broken node reference creates new page

fixes https://linear.app/logseq/issue/LOG-3213/broken-node-reference-creates-new-page
Tienson Qin 1 год назад
Родитель
Сommit
adc032e87f
2 измененных файлов с 40 добавлено и 24 удалено
  1. 36 24
      src/main/frontend/components/block.cljs
  2. 4 0
      src/main/frontend/handler/db_based/editor.cljs

+ 36 - 24
src/main/frontend/components/block.cljs

@@ -768,6 +768,13 @@
 (declare block-reference)
 (declare block-reference)
 (declare block-reference-preview)
 (declare block-reference-preview)
 
 
+(rum/defc invalid-node-ref
+  [id]
+  (let [db-based? (config/db-based-graph? (state/get-current-repo))
+        ->ref (if db-based? page-ref/->page-ref block-ref/->block-ref)]
+    [:span.warning.mr-1 {:title "Node ref invalid"}
+   (->ref id)]))
+
 (rum/defcs page-cp < db-mixins/query rum/reactive
 (rum/defcs page-cp < db-mixins/query rum/reactive
   {:init (fn [state]
   {:init (fn [state]
            (let [page (last (:rum/args state))]
            (let [page (last (:rum/args state))]
@@ -785,26 +792,34 @@
   "Component for a page. `page` argument contains :block/name which can be (un)sanitized page name.
   "Component for a page. `page` argument contains :block/name which can be (un)sanitized page name.
    Keys for `config`:
    Keys for `config`:
    - `:preview?`: Is this component under preview mode? (If true, `page-preview-trigger` won't be registered to this `page-cp`)"
    - `:preview?`: Is this component under preview mode? (If true, `page-preview-trigger` won't be registered to this `page-cp`)"
-  [state {:keys [label children preview? disable-preview?] :as config} _page]
+  [state {:keys [label children preview? disable-preview?] :as config} page]
   (let [entity (::entity state)]
   (let [entity (::entity state)]
-    (when-let [entity (when entity (db/sub-block (:db/id entity)))]
-      (if (or (ldb/page? entity) (:block/tags entity))
-        (let [page-name (some-> (:block/title entity) util/page-name-sanity-lc)
-              whiteboard-page? (model/whiteboard-page? entity)
-              inner (page-inner (assoc config :whiteboard-page? whiteboard-page?) entity children label)
-              modal? (shui-dialog/has-modal?)]
-          (if (and (not (util/mobile?))
-                   (not= page-name (:id config))
-                   (not (false? preview?))
-                   (not disable-preview?)
-                   (not modal?))
-            (if (ldb/page? entity)
-              (page-preview-trigger (assoc config :children inner) entity)
-              (block-reference-preview inner {:repo (state/get-current-repo)
-                                              :config config
-                                              :id (:block/uuid entity)}))
-            inner))
-        (block-reference config (:block/uuid entity) nil)))))
+    (let [entity (when entity (db/sub-block (:db/id entity)))]
+      (cond
+        entity
+        (if (or (ldb/page? entity) (:block/tags entity))
+          (let [page-name (some-> (:block/title entity) util/page-name-sanity-lc)
+                whiteboard-page? (model/whiteboard-page? entity)
+                inner (page-inner (assoc config :whiteboard-page? whiteboard-page?) entity children label)
+                modal? (shui-dialog/has-modal?)]
+            (if (and (not (util/mobile?))
+                     (not= page-name (:id config))
+                     (not (false? preview?))
+                     (not disable-preview?)
+                     (not modal?))
+              (if (ldb/page? entity)
+                (page-preview-trigger (assoc config :children inner) entity)
+                (block-reference-preview inner {:repo (state/get-current-repo)
+                                                :config config
+                                                :id (:block/uuid entity)}))
+              inner))
+          (block-reference config (:block/uuid entity) nil))
+
+        (util/uuid-string? (:block/name page))
+        (invalid-node-ref (:block/name page))
+
+        :else
+        nil))))
 
 
 (rum/defc asset-reference
 (rum/defc asset-reference
   [config title path]
   [config title path]
@@ -1083,11 +1098,8 @@
                  (block-reference-preview inner
                  (block-reference-preview inner
                                           {:repo repo :config config :id block-id})
                                           {:repo repo :config config :id block-id})
                  inner)])
                  inner)])
-            [:span.warning.mr-1 {:title "Block ref invalid"}
-             (block-ref/->block-ref id)])))
-
-      [:span.warning.mr-1 {:title "Block ref invalid"}
-       (block-ref/->block-ref id)])))
+            (invalid-node-ref id))))
+      (invalid-node-ref id))))
 
 
 (defn inline-text
 (defn inline-text
   ([format v]
   ([format v]

+ 4 - 0
src/main/frontend/handler/db_based/editor.cljs

@@ -26,6 +26,10 @@
                    (and (vector? x)
                    (and (vector? x)
                         (= :block/uuid (first x))
                         (= :block/uuid (first x))
                         (nil? (db/entity x)))
                         (nil? (db/entity x)))
+                   (and (map? x)
+                        (util/uuid-string? (:block/title x))
+                        (:block/uuid x)
+                        (nil? (db/entity [:block/uuid (:block/uuid x)])))
                    (nil? x))) refs))
                    (nil? x))) refs))
 
 
 (defn- use-cached-refs!
 (defn- use-cached-refs!