From c2582d3c2473ad8b6e093c8e1ee514047eda0461 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Tue, 6 Jan 2026 08:52:57 +0800 Subject: [PATCH] fix: available choices still shows other tags' scoped choices --- deps/db/src/logseq/db/frontend/property.cljs | 29 +++++++++++++++++++ .../frontend/components/property/config.cljs | 15 ++++------ .../frontend/components/property/value.cljs | 26 +---------------- 3 files changed, 36 insertions(+), 34 deletions(-) diff --git a/deps/db/src/logseq/db/frontend/property.cljs b/deps/db/src/logseq/db/frontend/property.cljs index c81c8f32ee..9813deef83 100644 --- a/deps/db/src/logseq/db/frontend/property.cljs +++ b/deps/db/src/logseq/db/frontend/property.cljs @@ -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))) diff --git a/src/main/frontend/components/property/config.cljs b/src/main/frontend/components/property/config.cljs index b51c139520..bce242a0de 100644 --- a/src/main/frontend/components/property/config.cljs +++ b/src/main/frontend/components/property/config.cljs @@ -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 diff --git a/src/main/frontend/components/property/value.cljs b/src/main/frontend/components/property/value.cljs index 1f9b9225cf..e5fd019b60 100644 --- a/src/main/frontend/components/property/value.cljs +++ b/src/main/frontend/components/property/value.cljs @@ -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]