Browse Source

fix: don't allow deletion of built-in class objects or property

relationships from table view. This would break major internals if delete actions were done
on logseq.class/Root or most built-in properties
Gabriel Horner 9 months ago
parent
commit
2c8aaedecf
1 changed files with 35 additions and 33 deletions
  1. 35 33
      src/main/frontend/components/objects.cljs

+ 35 - 33
src/main/frontend/components/objects.cljs

@@ -178,21 +178,23 @@
                    :add-property! (fn []
                                     (state/pub-event! [:editor/new-property {:block class
                                                                              :class-schema? true}]))
-                   :on-delete-rows (fn [table selected-rows]
-                                     (let [pages (filter ldb/page? selected-rows)
-                                           blocks (remove ldb/page? selected-rows)]
-                                       (p/do!
-                                        (set-data! (get-class-objects class))
-                                        (when-let [f (get-in table [:data-fns :set-row-selection!])]
-                                          (f {}))
-                                        (ui-outliner-tx/transact!
-                                         {:outliner-op :delete-blocks}
-                                         (when (seq blocks)
-                                           (outliner-op/delete-blocks! blocks nil))
-                                         (let [page-ids (map :db/id pages)
-                                               tx-data (map (fn [pid] [:db/retract pid :block/tags (:db/id class)]) page-ids)]
-                                           (when (seq tx-data)
-                                             (outliner-op/transact! tx-data {:outliner-op :save-block})))))))}))))
+                   ;; Objects of built-in classes must not be deleted e.g. Tag, Property and Root
+                   :on-delete-rows (when-not (:logseq.property/built-in? class)
+                                     (fn [table selected-rows]
+                                       (let [pages (->> selected-rows (filter ldb/page?) (remove :logseq.property/built-in?))
+                                             blocks (->> selected-rows (remove ldb/page?) (remove :logseq.property/built-in?))]
+                                         (p/do!
+                                          (set-data! (get-class-objects class))
+                                          (when-let [f (get-in table [:data-fns :set-row-selection!])]
+                                            (f {}))
+                                          (ui-outliner-tx/transact!
+                                           {:outliner-op :delete-blocks}
+                                           (when (seq blocks)
+                                             (outliner-op/delete-blocks! blocks nil))
+                                           (let [page-ids (map :db/id pages)
+                                                 tx-data (map (fn [pid] [:db/retract pid :block/tags (:db/id class)]) page-ids)]
+                                             (when (seq tx-data)
+                                               (outliner-op/transact! tx-data {:outliner-op :save-block}))))))))}))))
 
 (rum/defcs class-objects < rum/reactive db-mixins/query mixins/container-id
   [state class {:keys [current-page? sidebar?]}]
@@ -250,25 +252,25 @@
                    :title-key :views.table/property-nodes
                    :columns columns
                    :add-new-object! #(add-new-property-object! property set-data!)
-                               ;; TODO: Add support for adding column
+                   ;; TODO: Add support for adding column
                    :show-add-property? false
-                   :on-delete-rows (when-not (contains? #{:logseq.property/built-in? :logseq.property/parent}
-                                                        (:db/ident property))
-                                     (fn [table selected-rows]
-                                       (let [pages (filter ldb/page? selected-rows)
-                                             blocks (remove ldb/page? selected-rows)]
-                                         (p/do!
-                                          (set-data! (get-property-related-objects (state/get-current-repo) property))
-                                          (when-let [f (get-in table [:data-fns :set-row-selection!])]
-                                            (f {}))
-                                          (ui-outliner-tx/transact!
-                                           {:outliner-op :delete-blocks}
-                                           (when (seq blocks)
-                                             (outliner-op/delete-blocks! blocks nil))
-                                           (let [page-ids (map :db/id pages)
-                                                 tx-data (map (fn [pid] [:db/retract pid (:db/ident property)]) page-ids)]
-                                             (when (seq tx-data)
-                                               (outliner-op/transact! tx-data {:outliner-op :save-block}))))))))}))))
+                   ;; Relationships with built-in properties must not be deleted e.g. built-in? or parent
+                   :on-delete-rows (when-not (:logseq.property/built-in? property)
+                                             (fn [table selected-rows]
+                                               (let [pages (->> selected-rows (filter ldb/page?) (remove :logseq.property/built-in?))
+                                                     blocks (->> selected-rows (remove ldb/page?) (remove :logseq.property/built-in?))]
+                                                 (p/do!
+                                                  (set-data! (get-property-related-objects (state/get-current-repo) property))
+                                                  (when-let [f (get-in table [:data-fns :set-row-selection!])]
+                                                    (f {}))
+                                                  (ui-outliner-tx/transact!
+                                                   {:outliner-op :delete-blocks}
+                                                   (when (seq blocks)
+                                                     (outliner-op/delete-blocks! blocks nil))
+                                                   (let [page-ids (map :db/id pages)
+                                                         tx-data (map (fn [pid] [:db/retract pid (:db/ident property)]) page-ids)]
+                                                     (when (seq tx-data)
+                                                       (outliner-op/transact! tx-data {:outliner-op :save-block}))))))))}))))
 
 ;; Show all nodes containing the given property
 (rum/defcs property-related-objects < rum/reactive db-mixins/query mixins/container-id