fix: available choices still shows other tags' scoped choices

This commit is contained in:
Tienson Qin
2026-01-06 08:52:57 +08:00
parent 2897410690
commit c2582d3c24
3 changed files with 36 additions and 34 deletions

View File

@@ -8,6 +8,7 @@
[logseq.common.uuid :as common-uuid]
[logseq.db.common.order :as db-order]
[logseq.db.frontend.db-ident :as db-ident]
[logseq.db.frontend.entity-util :as entity-util]
[logseq.db.frontend.property.type :as db-property-type]))
(def ^:private property-ignore-rtc
@@ -841,3 +842,31 @@
[db-ident]
(contains? db-property-type/value-ref-property-types
(get-in built-in-properties [db-ident :schema :type])))
(defn- normalize-choice-ids
[values]
(set (keep :db/id values)))
(defn scoped-closed-values
"Get scoped closed values for a given block"
[property block & {:keys [values]}]
(let [values (or values (:property/closed-values property))
classes (:block/tags block)
class-ids* (set (keep :db/id classes))
class-ids (if (entity-util/class? block)
(conj class-ids* (:db/id block))
class-ids*)
excluded-ids (normalize-choice-ids
(mapcat :logseq.property/choice-exclusions classes))]
(filter (fn [value]
(let [scope-ids (set (keep :db/id (:logseq.property/choice-classes value)))]
(cond
(empty? scope-ids)
(not (contains? excluded-ids (:db/id value)))
(seq class-ids)
(seq (set/intersection scope-ids class-ids))
:else
false)))
values)))

View File

@@ -417,21 +417,18 @@
values (:property/closed-values property)
choices (->> values
(keep (fn [value]
(db/sub-block (:db/id value))))
(filter (fn [block]
(let [classes (set (map :db/id (:logseq.property/choice-classes block)))]
(if (and (seq classes) (ldb/class? owner-block))
(contains? classes (:db/id owner-block))
true)))))
(db/sub-block (:db/id value)))))
scoped-choices (db-property/scoped-closed-values property owner-block {:values choices})
excluded-ids (set (keep :db/id (:logseq.property/choice-exclusions owner-block)))
hidden-choices (filter (fn [block]
(and (empty? (:logseq.property/choice-classes block))
(contains? excluded-ids (:db/id block))))
choices)
scoped-choices)
visible-choices (remove (fn [block]
(and (empty? (:logseq.property/choice-classes block))
(contains? excluded-ids (:db/id block))))
choices)
scoped-choices)
list-choices (if @*show-hidden?
(concat visible-choices hidden-choices)
visible-choices)
@@ -445,7 +442,7 @@
list-choices)]
[:div.ls-property-dropdown.ls-property-choices-sub-pane
(when (seq choices)
(when (seq scoped-choices)
[:<>
(when (and (seq hidden-choices) (ldb/class? owner-block))
(shui/button

View File

@@ -595,30 +595,6 @@
:else
id)))
(defn- normalize-choice-ids
[values]
(set (keep :db/id values)))
(defn- scoped-closed-values
[property block]
(let [values (:property/closed-values property)
classes (:block/tags block)
class-ids (set (keep :db/id classes))
excluded-ids (normalize-choice-ids
(mapcat :logseq.property/choice-exclusions classes))]
(filter (fn [value]
(let [scope-ids (set (keep :db/id (:logseq.property/choice-classes value)))]
(cond
(empty? scope-ids)
(not (contains? excluded-ids (:db/id value)))
(seq class-ids)
(seq (set/intersection scope-ids class-ids))
:else
false)))
values)))
(defn- sort-select-items
[property selected-choices items]
(if (:property/closed-values property)
@@ -959,7 +935,7 @@
(let [date? (and
(= (:db/ident property) :logseq.property.repeat/recur-unit)
(= :date (:logseq.property/type (:property opts))))
values (cond->> (scoped-closed-values property block)
values (cond->> (db-property/scoped-closed-values property block)
date?
(remove (fn [b] (contains? #{:logseq.property.repeat/recur-unit.minute :logseq.property.repeat/recur-unit.hour} (:db/ident b)))))]
(keep (fn [block]