fix: handle cardinality many to one change

fixes LOG-2922
pull/10544/head
Gabriel Horner 2023-11-20 10:57:52 -05:00
parent 5704fc2eea
commit fde68d9d02
1 changed files with 25 additions and 16 deletions

View File

@ -269,7 +269,19 @@
:block/properties (assoc properties property-uuid #{v})})) ev)]
(when (seq tx-data)
(db/transact! repo tx-data
{:outliner-op :save-block}))))
{:outliner-op :save-block}))))
(defn- handle-cardinality-changes [repo property-uuid property property-schema]
;; cardinality changed from :many to :one
(if (and (= :one (:cardinality property-schema))
(not= :one (:cardinality (:block/schema property))))
(when (seq (model/get-block-property-values property-uuid))
(notification/show! "Can't change a property's multiple values back to single if a property is used anywhere" :error)
::skip-transact)
;; cardinality changed from :one to :many
(when (and (= :many (:cardinality property-schema))
(not= :many (:cardinality (:block/schema property))))
(fix-cardinality-many-values! repo property-uuid))))
(defn update-property!
[repo property-uuid {:keys [property-name property-schema
@ -281,21 +293,18 @@
(when (or (not type-changed?)
;; only change type if property hasn't been used yet
(empty? (model/get-block-property-values property-uuid)))
(when (and (= :many (:cardinality property-schema))
(not= :many (:cardinality (:block/schema property))))
;; cardinality changed from :one to :many
(fix-cardinality-many-values! repo property-uuid))
(let [tx-data (cond-> {:block/uuid property-uuid}
property-name (merge
{:block/original-name property-name
:block/name (gp-util/page-name-sanity-lc property-name)})
property-schema (assoc :block/schema property-schema)
properties (assoc :block/properties
(merge (:block/properties property)
properties))
true outliner-core/block-with-updated-at)]
(db/transact! repo [tx-data]
{:outliner-op :save-block}))))))
(when (not= ::skip-transact (handle-cardinality-changes repo property-uuid property property-schema))
(let [tx-data (cond-> {:block/uuid property-uuid}
property-name (merge
{:block/original-name property-name
:block/name (gp-util/page-name-sanity-lc property-name)})
property-schema (assoc :block/schema property-schema)
properties (assoc :block/properties
(merge (:block/properties property)
properties))
true outliner-core/block-with-updated-at)]
(db/transact! repo [tx-data]
{:outliner-op :save-block})))))))
(defn class-add-property!
[repo class-uuid k-name]