From a858fe9795affe0ca3056f00396c238b269aeccb Mon Sep 17 00:00:00 2001 From: Mega Yu Date: Wed, 13 May 2026 18:06:54 +0800 Subject: [PATCH] feat(breadcrumb): add functionality to resolve and hydrate breadcrumb reference titles --- src/main/frontend/components/block.cljs | 45 +++++-- .../components/block/breadcrumb_model.cljs | 111 ++++++++++-------- .../block/breadcrumb_model_test.cljs | 46 +++++++- 3 files changed, 141 insertions(+), 61 deletions(-) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index 41614b41c0..c8dc8235d9 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -3218,6 +3218,21 @@ (when (:db/id seg) (db/entity (:db/id seg)))) +(defn- missing-breadcrumb-ref-ids + [segments] + (->> segments + (mapcat :title-ref-ids) + distinct + (remove (fn [id] + (some-> (db/entity [:block/uuid id]) :block/title string?))) + vec)) + +(defn- from-property :db/id db/entity) from-property) + parents (remove nil? (concat (db/get-block-parents repo (:block/uuid target-entity) {:depth 1000}) + [from-property])) segments (breadcrumb-segments target-entity parents) view (breadcrumb-model/build-breadcrumb-view segments @@ -3349,13 +3370,19 @@ load-depth (:load-depth (breadcrumb-model/variant-options effective-variant))] (hooks/use-effect! (fn [] - (p/let [block (db-async/block-type (:logseq.property.node/display-type entity)) tag-type (when-not page? (entity-tags->block-type entity)) block-type (or db-display-type tag-type (detect-block-type raw-title page?)) + title-line (when-not page? + (breadcrumb-label-line raw-title block-type)) text (if page? (or (:block/title entity) (:block/name entity)) - (normalize-typed-breadcrumb-text raw-title block-type)) + (normalize-typed-breadcrumb-text entity raw-title block-type)) full-text (if page? (or (:block/title entity) (:block/name entity) "") (or text "")) @@ -224,6 +231,8 @@ :type block-type :text text :full-text full-text + :title-ref-ids (when (and (not page?) (string? title-line)) + (db-content/get-matched-ids title-line)) :icon icon :page? page?}))) diff --git a/src/test/frontend/components/block/breadcrumb_model_test.cljs b/src/test/frontend/components/block/breadcrumb_model_test.cljs index 25f3b367a8..6c99c2c8c3 100644 --- a/src/test/frontend/components/block/breadcrumb_model_test.cljs +++ b/src/test/frontend/components/block/breadcrumb_model_test.cljs @@ -147,7 +147,51 @@ :block/name "aaa" :block/title "aaa"}]})] (is (= "See [[aaa]]" (:text seg))) - (is (= "See [[aaa]]" (:full-text seg)))))) + (is (= "See [[aaa]]" (:full-text seg))))) + + (testing "block uuid tag refs are resolved to tag labels" + (let [ref-uuid #uuid "00000000-0000-0000-0000-000000000002" + seg (model/block->breadcrumb-segment + {:db/id 1 + :block/uuid #uuid "00000000-0000-0000-0000-000000000001" + :block/raw-title (str "Tagged #[[" ref-uuid "]]") + :block/refs [{:db/id 2 + :block/uuid ref-uuid + :block/name "aaa" + :block/title "aaa"}]})] + (is (= "Tagged #aaa" (:text seg))) + (is (= "Tagged #aaa" (:full-text seg))))) + + (testing "unloaded uuid refs stay unchanged in partial UI db" + (let [ref-uuid #uuid "00000000-0000-0000-0000-000000000002" + seg (model/block->breadcrumb-segment + {:db/id 1 + :block/uuid #uuid "00000000-0000-0000-0000-000000000001" + :block/raw-title (str "See [[" ref-uuid "]]") + :block/refs [{:db/id 2 + :block/uuid ref-uuid}]})] + (is (= (str "See [[" ref-uuid "]]") (:text seg))) + (is (= (str "See [[" ref-uuid "]]") (:full-text seg)))))) + +(deftest block->breadcrumb-segment-title-ref-ids-test + (testing "returns uuid refs from the breadcrumb label line" + (let [visible-uuid #uuid "00000000-0000-0000-0000-000000000002" + hidden-uuid #uuid "00000000-0000-0000-0000-000000000003" + seg (model/block->breadcrumb-segment + {:db/id 1 + :block/uuid #uuid "00000000-0000-0000-0000-000000000001" + :block/raw-title (str "See [[" visible-uuid "]]\nIgnore [[" hidden-uuid "]]")})] + (is (= [visible-uuid] + (vec (:title-ref-ids seg)))))) + + (testing "includes tag-style uuid refs" + (let [ref-uuid #uuid "00000000-0000-0000-0000-000000000002" + seg (model/block->breadcrumb-segment + {:db/id 1 + :block/uuid #uuid "00000000-0000-0000-0000-000000000001" + :block/raw-title (str "Tagged #[[" ref-uuid "]]")})] + (is (= [ref-uuid] + (vec (:title-ref-ids seg))))))) ;; --------------------------------------------------------------------------- ;; block->breadcrumb-segment — structural type detection