fix: don't add Task tag when status is used by another class

Users should be able to use status property independent of Task
This commit is contained in:
Gabriel Horner
2025-01-24 12:41:07 -05:00
parent 423a4b088e
commit c8c0e24d93
2 changed files with 38 additions and 10 deletions

View File

@@ -37,16 +37,18 @@
retract-multiple-values? (and multiple-values? (sequential? value))
multiple-values-empty? (and (sequential? old-value)
(contains? (set (map :db/ident old-value)) :logseq.property/empty-placeholder))
block' (assoc (outliner-core/block-with-updated-at {:db/id (:db/id block)})
property-id value)
block-tx-data (cond-> block'
(and status? (not (ldb/class-instance? (d/entity @conn :logseq.class/Task) block)))
(assoc :block/tags :logseq.class/Task))]
[(when multiple-values-empty?
[:db/retract (:db/id block') property-id :logseq.property/empty-placeholder])
(when retract-multiple-values?
[:db/retract (:db/id block') property-id])
block-tx-data]))))
update-block-tx (cond-> (outliner-core/block-with-updated-at {:db/id (:db/id block)})
true
(assoc property-id value)
(and status? (or (empty? (:block/tags block)) (ldb/internal-page? block)))
(assoc :block/tags :logseq.class/Task))]
(cond-> []
multiple-values-empty?
(conj [:db/retract (:db/id update-block-tx) property-id :logseq.property/empty-placeholder])
retract-multiple-values?
(conj [:db/retract (:db/id update-block-tx) property-id])
true
(conj update-block-tx))))))
(defn- get-property-value-schema
"Gets a malli schema to validate the property value for the given property type and builds

View File

@@ -195,6 +195,32 @@
updated-blocks))
"Property values are batch set")))
(deftest status-property-setting-classes
(let [conn (db-test/create-conn-with-blocks
{:classes {:Project {:build/class-properties [:logseq.task/status]}}
:pages-and-blocks
[{:page {:block/title "page1"}
:blocks [{:block/title ""}
{:block/title "project task" :build/tags [:Project]}]}]})
page1 (:block/uuid (db-test/find-page-by-title @conn "page1"))
[empty-task project]
(map #(:block/uuid (db-test/find-block-by-content @conn %)) ["" "project task"])]
(outliner-property/batch-set-property! conn [empty-task] :logseq.task/status :logseq.task/status.doing)
(is (= [:logseq.class/Task]
(mapv :db/ident (:block/tags (d/entity @conn [:block/uuid empty-task]))))
"Adds Task to block when it is not tagged")
(outliner-property/batch-set-property! conn [page1] :logseq.task/status :logseq.task/status.doing)
(is (= #{:logseq.class/Task :logseq.class/Page}
(set (map :db/ident (:block/tags (d/entity @conn [:block/uuid page1])))))
"Adds Task to page without tag")
(outliner-property/batch-set-property! conn [project] :logseq.task/status :logseq.task/status.doing)
(is (= [:user.class/Project]
(mapv :db/ident (:block/tags (d/entity @conn [:block/uuid project]))))
"Doesn't add Task to block when it is already tagged")))
(deftest batch-remove-property!
(let [conn (db-test/create-conn-with-blocks
[{:page {:block/title "page1"}