From 2c8aaedecfbb6ca1b62f2ac4a5604fa156a3ebc2 Mon Sep 17 00:00:00 2001 From: Gabriel Horner Date: Fri, 3 Jan 2025 12:55:30 -0500 Subject: [PATCH] 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 --- src/main/frontend/components/objects.cljs | 68 ++++++++++++----------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/src/main/frontend/components/objects.cljs b/src/main/frontend/components/objects.cljs index 66168c4922..8f2ddd246f 100644 --- a/src/main/frontend/components/objects.cljs +++ b/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