Explorar o código

fix: cleanup property tuple validation

Had an unnecessary entity refetch. Also move ui assumptions about :many
validation to ui as this needlessly limits what :many could store
Gabriel Horner hai 1 ano
pai
achega
123cb8fc42

+ 8 - 10
deps/db/src/logseq/db/frontend/malli_schema.cljs

@@ -61,15 +61,14 @@
 ;; Helper fns
 ;; ==========
 (defn validate-property-value
-  "Validates the property value in a property tuple. The property value can be
-  one or many of a value to validated. validate-fn is a fn that is called
-  directly on each value to return a truthy value. validate-fn varies by
-  property type"
+  "Validates the property value in a property tuple. The property value is
+  expected to be a coll if the property has a :many cardinality. validate-fn is
+  a fn that is called directly on each value to return a truthy value.
+  validate-fn varies by property type"
   [db validate-fn [{:block/keys [schema] :as property} property-val] & {:keys [new-closed-value?]}]
   ;; For debugging
   ;; (when (not= "logseq.property" (namespace (:db/ident property))) (prn :validate-val (dissoc property :property/closed-values) property-val))
-  (let [property (d/entity db (:db/ident property))
-        validate-fn' (if (db-property-type/property-types-with-db (:type schema)) (partial validate-fn db) validate-fn)
+  (let [validate-fn' (if (db-property-type/property-types-with-db (:type schema)) (partial validate-fn db) validate-fn)
         validate-fn'' (if (and (db-property-type/closed-value-property-types (:type schema))
                                ;; new closed values aren't associated with the property yet
                                (not new-closed-value?)
@@ -79,10 +78,9 @@
                                (contains? (set (map :db/id (:property/closed-values property))) val)))
                         validate-fn')]
     (if (db-property/many? property)
-      (if (coll? property-val)
-        (every? validate-fn'' property-val)
-        (validate-fn'' property-val))
+      (every? validate-fn'' property-val)
       (or (validate-fn'' property-val)
+          ;; also valid if value is empty-placeholder
           (if (= :db.type/ref (:db/valueType property))
             (and (integer? property-val)
                  (= :logseq.property/empty-placeholder (:db/ident (d/entity db property-val))))
@@ -105,7 +103,7 @@
                (if-let [property (and (db-property/property? k)
                                       (d/entity db k))]
                  (update m :block/properties (fnil conj [])
-                         [(assoc (select-keys property [:db/ident :db/valueType])
+                         [(assoc (select-keys property [:db/ident :db/valueType :db/cardinality])
                                  :block/schema
                                  (select-keys (:block/schema property) [:type])
                                  :property/closed-values

+ 5 - 1
src/main/frontend/handler/db_based/property.cljs

@@ -230,7 +230,11 @@
                                  (notification/show! (str e) :error false)
                                  nil)))]
             (when-not (= existing-value new-value*)
-              (if-let [msg (when-not (= new-value* :logseq.property/empty-placeholder) (validate-property-value schema new-value*))]
+              (if-let [msg (validate-property-value schema
+                                                    ;; normalize :many values for components that only provide single value
+                                                    (if (and (db-property/many? property) (not (coll? new-value*)))
+                                                      #{new-value*}
+                                                      new-value*))]
                 (let [msg' (str "\"" k-name "\"" " " (if (coll? msg) (first msg) msg))]
                   (notification/show! msg' :warning))
                 (let [_ (upsert-property! repo property-id (assoc property-schema :type property-type') {:property-name property-name})