Преглед на файлове

fix: batch remove required property

results in invalid entities e.g. invalid class
when extends is removed.
Fixes
https://test.logseq.com/#/page/6864f732-c4ac-4fea-8ef2-c40561e1bde6
Gabriel Horner преди 3 месеца
родител
ревизия
39e2967044
променени са 2 файла, в които са добавени 23 реда и са изтрити 6 реда
  1. 11 1
      deps/outliner/src/logseq/outliner/property.cljs
  2. 12 5
      deps/outliner/test/logseq/outliner/property_test.cljs

+ 11 - 1
deps/outliner/src/logseq/outliner/property.cljs

@@ -66,11 +66,21 @@
                                :type :error}
                      :property-id :block/tags}))))
 
+(defn- throw-error-if-deleting-required-property
+  [property-ident]
+  (when (contains? db-malli-schema/required-properties property-ident)
+    (throw (ex-info "Can't remove required property"
+                    {:type :notification
+                     :payload {:message "Can't remove required property"
+                               :type :error}
+                     :property-id property-ident}))))
+
 (defn- validate-batch-deletion-of-property
   "Validates that the given property can be batch deleted from multiple nodes"
   [entities property-ident]
   (throw-error-if-deleting-protected-property (map :db/ident entities) property-ident)
-  (when (= :block/tags property-ident) (throw-error-if-removing-private-tag entities)))
+  (when (= :block/tags property-ident) (throw-error-if-removing-private-tag entities))
+  (throw-error-if-deleting-required-property property-ident))
 
 (defn- build-property-value-tx-data
   [conn block property-id value]

+ 12 - 5
deps/outliner/test/logseq/outliner/property_test.cljs

@@ -223,20 +223,27 @@
 
 (deftest batch-remove-property!
   (let [conn (db-test/create-conn-with-blocks
-              [{:page {:block/title "page1"}
-                :blocks [{:block/title "item 1" :build/properties {:logseq.property/order-list-type "number"}}
-                         {:block/title "item 2" :build/properties {:logseq.property/order-list-type "number"}}]}])
+              {:classes {:C1 {}}
+               :pages-and-blocks
+               [{:page {:block/title "page1"}
+                 :blocks [{:block/title "item 1" :build/properties {:logseq.property/order-list-type "number"}}
+                          {:block/title "item 2" :build/properties {:logseq.property/order-list-type "number"}}]}]})
         block-ids (map #(-> (db-test/find-block-by-content @conn %) :block/uuid) ["item 1" "item 2"])
         _ (outliner-property/batch-remove-property! conn block-ids :logseq.property/order-list-type)
         updated-blocks (map #(db-test/find-block-by-content @conn %) ["item 1" "item 2"])]
     (is (= [nil nil]
            (map :logseq.property/order-list-type updated-blocks))
         "Property values are batch removed")
-    
+
     (is (thrown-with-msg?
          js/Error
          #"Can't remove private"
-         (outliner-property/batch-remove-property! conn [(:db/id (db-test/find-page-by-title @conn "page1"))] :block/tags)))))
+         (outliner-property/batch-remove-property! conn [(:db/id (db-test/find-page-by-title @conn "page1"))] :block/tags)))
+
+    (is (thrown-with-msg?
+         js/Error
+         #"Can't remove required"
+         (outliner-property/batch-remove-property! conn [(:db/id (d/entity @conn :user.class/C1))] :logseq.property.class/extends)))))
 
 (deftest add-existing-values-to-closed-values!
   (let [conn (db-test/create-conn-with-blocks