Skip to content

Commit d8b1feb

Browse files
committed
fix: some built-in tags such as #Journal shouldn't be extended
related to logseq/db-test#555
1 parent c91661f commit d8b1feb

File tree

7 files changed

+87
-33
lines changed

7 files changed

+87
-33
lines changed

deps/db/src/logseq/db.cljs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@
185185
(def get-entity-types entity-util/get-entity-types)
186186
(def internal-tags db-class/internal-tags)
187187
(def private-tags db-class/private-tags)
188+
(def extends-hidden-tags db-class/extends-hidden-tags)
188189
(def hidden-tags db-class/hidden-tags)
189190

190191
(defn sort-by-order

deps/db/src/logseq/db/frontend/class.cljs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,14 @@
116116
(set/union (disj internal-tags :logseq.class/Root)
117117
#{:logseq.class/Journal :logseq.class/Whiteboard}))
118118

119+
(def extends-hidden-tags
120+
"Built-in classes that are hidden when choosing extends"
121+
(set/union
122+
private-tags
123+
#{:logseq.class/Cards :logseq.class/Code-block
124+
:logseq.class/Math-block :logseq.class/Pdf-annotation
125+
:logseq.class/Query :logseq.class/Quote-block
126+
:logseq.class/Template}))
119127
(def hidden-tags
120128
"Built-in classes that are hidden in a few contexts like property values"
121129
#{:logseq.class/Page :logseq.class/Root :logseq.class/Asset})

deps/outliner/src/logseq/outliner/validate.cljs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,9 +155,9 @@
155155
(defn- disallow-built-in-class-extends-change
156156
[_parent-ent child-ents]
157157
(when (some #(get db-class/built-in-classes (:db/ident %)) child-ents)
158-
(throw (ex-info "Can't change the parent of a built-in tag"
158+
(throw (ex-info "Can't change the extends of a built-in tag"
159159
{:type :notification
160-
:payload {:message "Can't change the parent of a built-in tag"
160+
:payload {:message "Can't change the extends of a built-in tag"
161161
:type :error}}))))
162162

163163
(defn- disallow-extends-cycle
@@ -177,8 +177,8 @@
177177
(let [parent-ent (if (integer? parent-ent*)
178178
(d/entity db parent-ent*)
179179
parent-ent*)]
180-
(disallow-extends-cycle db parent-ent child-ents)
181180
(when built-in? (disallow-built-in-class-extends-change parent-ent child-ents))
181+
(disallow-extends-cycle db parent-ent child-ents)
182182
(validate-extends-property-have-correct-type parent-ent child-ents)))
183183

184184
(defn- disallow-node-cant-tag-with-built-in-non-tags

src/main/frontend/components/property/value.cljs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -669,7 +669,8 @@
669669
[property
670670
{:keys [block multiple-choices? dropdown? input-opts on-input add-new-choice! target] :as opts}
671671
result]
672-
(let [repo (state/get-current-repo)
672+
(let [[*input set-input!] (hooks/use-state nil)
673+
repo (state/get-current-repo)
673674
classes (:logseq.property/classes property)
674675
tags? (= :block/tags (:db/ident property))
675676
alias? (= :block/alias (:db/ident property))
@@ -693,7 +694,7 @@
693694
;; hide parent extends for existing values
694695
(set/union (set (map :block/uuid extends))))
695696
options (if (ldb/class? block)
696-
(model/get-all-classes repo)
697+
(model/get-all-classes repo {:except-extends-hidden-tags? true})
697698
result)
698699
699700
excluded-options (->> options
@@ -785,6 +786,7 @@
785786
(merge
786787
opts
787788
{:multiple-choices? multiple-choices?
789+
:tap-*input-val set-input!
788790
:items options
789791
:selected-choices selected-choices
790792
:dropdown? dropdown?
@@ -796,7 +798,12 @@
796798
:else
797799
(str "Set " (:block/title property)))
798800
:show-new-when-not-exact-match? (not
799-
(or (and extends-property? (contains? (set children-pages) (:db/id block)))
801+
(or (and extends-property?
802+
(or (contains? (set children-pages) (:db/id block))
803+
(when-let [input (when *input @*input)]
804+
(when-not (string/blank? input)
805+
(some (fn [ident]
806+
(= input (:block/title (db/entity ident)))) ldb/extends-hidden-tags)))))
800807
;; Don't allow creating private tags
801808
(and (= :block/tags (:db/ident property))
802809
(seq (set/intersection (set (map :db/ident classes'))

src/main/frontend/db/model.cljs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -464,16 +464,21 @@ independent of format as format specific heading characters are stripped"
464464
:nonce (:nonce shape)}))))))
465465

466466
(defn get-all-classes
467-
[repo & {:keys [except-root-class? except-private-tags?]
467+
[repo & {:keys [except-root-class? except-private-tags?
468+
except-extends-hidden-tags?]
468469
:or {except-root-class? false
469-
except-private-tags? true}}]
470+
except-private-tags? true
471+
except-extends-hidden-tags? false}}]
470472
(let [db (conn/get-db repo)
471473
classes (->> (d/datoms db :avet :block/tags :logseq.class/Tag)
472474
(map (fn [d]
473475
(db-utils/entity db (:e d))))
474476
(remove (fn [d]
475477
(and except-private-tags?
476-
(contains? ldb/private-tags (:db/ident d))))))]
478+
(contains? ldb/private-tags (:db/ident d)))))
479+
(remove (fn [d]
480+
(and except-extends-hidden-tags?
481+
(contains? ldb/extends-hidden-tags (:db/ident d))))))]
477482
(if except-root-class?
478483
(keep (fn [e] (when-not (= :logseq.class/Root (:db/ident e)) e)) classes)
479484
classes)))

src/main/frontend/worker/pipeline.cljs

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -334,31 +334,50 @@
334334
(:block/title block))
335335
(ldb/built-in? block))))
336336
tx-data' (mapcat
337-
(fn [[e a v _t added]]
338-
(when added
339-
(cond
337+
(fn [datom]
338+
(let [[e a v _t added] datom]
339+
(when added
340+
(cond
340341
;; using built-in pages as tags
341-
(and (= a :block/tags) (built-in-page? v))
342-
[[:db/retract v :db/ident]
343-
[:db/retract v :logseq.property.class/extends]
344-
[:db/retract v :block/tags :logseq.class/Tag]
345-
[:db/add v :block/tags :logseq.class/Page]
346-
[:db/retract e a v]]
342+
(and (= a :block/tags) (built-in-page? v))
343+
[[:db/retract v :db/ident]
344+
[:db/retract v :logseq.property.class/extends]
345+
[:db/retract v :block/tags :logseq.class/Tag]
346+
[:db/add v :block/tags :logseq.class/Page]
347+
[:db/retract e a v]]
347348

348-
;; built-in block protected attributes/properties updated
349-
(and (contains? #{:db/ident :block/title :block/name :block/uuid
350-
:logseq.property/type :db/cardinality
351-
:logseq.property/built-in? :logseq.property.class/extends} a)
352-
(some? (d/entity db-before e))
353-
(let [block (d/entity db-after e)]
354-
(and (ldb/built-in? block)
355-
(not= (get block a) (get (d/entity db-before e) a)))))
356-
(if-some [prev-v (get (d/entity db-before e) a)]
357-
[[:db/add e a prev-v]]
358-
[[:db/retract e a v]])
349+
;; built-in block protected properties updated
350+
(and (contains? #{:db/ident :block/title :block/name :block/uuid
351+
:logseq.property/type :db/cardinality
352+
:logseq.property/built-in? :logseq.property.class/extends} a)
353+
(some? (d/entity db-before e))
354+
(let [block (d/entity db-after e)]
355+
(and (ldb/built-in? block)
356+
(not= (get block a) (get (d/entity db-before e) a)))))
357+
(if-some [prev-v (get (d/entity db-before e) a)]
358+
(if (= a :logseq.property.class/extends)
359+
[[:db/retract e a]
360+
{:db/id e
361+
a (map :db/id prev-v)}]
362+
[[:db/add e a prev-v]])
363+
[[:db/retract e a v]])
359364

360-
:else
361-
nil)))
365+
;; user class extends unexpected built-in classes
366+
(and (= a :logseq.property.class/extends)
367+
(let [block (d/entity db-after v)]
368+
(and (ldb/built-in? block)
369+
(not (contains? #{:logseq.class/Root :logseq.class/Page :logseq.class/Property
370+
:logseq.class/Task :logseq.class/Card}
371+
(:db/ident block))))))
372+
(let [prev-v (get (d/entity db-before e) a)]
373+
[[:db/retract e a v]
374+
(if (seq prev-v)
375+
{:db/id e
376+
a (map :db/id prev-v)}
377+
[:db/add e a :logseq.class/Root])])
378+
379+
:else
380+
nil))))
362381
tx-data)]
363382
(when (seq tx-data')
364383
(prn :debug ::revert-built-in-block-updates :tx-data (distinct tx-data')))

src/test/frontend/worker/pipeline_test.cljs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@
4545
(let [graph test-helper/test-db-name-db-version
4646
conn (db-test/create-conn-with-blocks
4747
[{:page {:block/title "page1"}
48-
:blocks [{:block/title "b1"}]}])
48+
:blocks [{:block/title "b1"}
49+
{:block/title "b2" :build/tags [:tag1]}]}])
4950
library (ldb/get-built-in-page @conn "Library")]
5051

5152
(ldb/register-transact-pipeline-fn!
@@ -76,6 +77,19 @@
7677
:block/title "task"}])
7778
(let [task (d/entity @conn (:db/id task))]
7879
(is (= :logseq.class/Task (:db/ident task)))
79-
(is (= "Task" (:block/title task))))))
80+
(is (= "Task" (:block/title task))))
81+
82+
(ldb/transact! conn [{:db/id (:db/id task)
83+
:logseq.property.class/extends :logseq.class/Journal}])
84+
(let [task (d/entity @conn (:db/id task))]
85+
(is (= [:logseq.class/Root] (map :db/ident (:logseq.property.class/extends task)))))))
86+
87+
(testing "User class extends unexpected built-in classes"
88+
(let [t1 (ldb/get-page @conn "tag1")]
89+
(ldb/transact! conn [{:db/id (:db/id t1)
90+
:logseq.property.class/extends :logseq.class/Journal}])
91+
(let [t1 (d/entity @conn (:db/id t1))]
92+
(is (= [:logseq.class/Root] (map :db/ident (:logseq.property.class/extends t1)))))))
93+
8094
;; return global fn back to previous behavior
8195
(ldb/register-transact-pipeline-fn! identity)))

0 commit comments

Comments
 (0)