Pārlūkot izejas kodu

fix: available choices still shows other tags' scoped choices

Tienson Qin 2 mēneši atpakaļ
vecāks
revīzija
c2582d3c24

+ 29 - 0
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)))

+ 6 - 9
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

+ 1 - 25
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]