|
|
@@ -2,6 +2,7 @@
|
|
|
(:require [clojure.set :as set]
|
|
|
[clojure.zip :as zip]
|
|
|
[frontend.db :as db]
|
|
|
+ [frontend.db.model :as db-model]
|
|
|
[frontend.db-schema :as db-schema]
|
|
|
[frontend.db.conn :as conn]
|
|
|
[frontend.db.outliner :as db-outliner]
|
|
|
@@ -82,6 +83,23 @@
|
|
|
]
|
|
|
block))
|
|
|
|
|
|
+(defn- remove-orphaned-page-refs!
|
|
|
+ [db-id txs-state old-refs new-refs]
|
|
|
+ (when (not= old-refs new-refs)
|
|
|
+ (let [new-refs (set (map :block/name new-refs))
|
|
|
+ old-pages (->> (map :db/id old-refs)
|
|
|
+ (db-model/get-entities-by-ids)
|
|
|
+ (remove (fn [e] (contains? new-refs (:block/name e))))
|
|
|
+ (map :block/name))
|
|
|
+ orphaned-pages (db-model/get-orphaned-pages {:pages old-pages
|
|
|
+ :empty-ref-f (fn [page]
|
|
|
+ (let [refs (:block/_refs page)]
|
|
|
+ (or (zero? (count refs))
|
|
|
+ (= #{db-id} (set (map :db/id refs))))))})]
|
|
|
+ (when (seq orphaned-pages)
|
|
|
+ (let [tx (mapv (fn [page] [:db/retractEntity (:db/id page)]) orphaned-pages)]
|
|
|
+ (swap! txs-state (fn [state] (vec (concat state tx)))))))))
|
|
|
+
|
|
|
;; -get-id, -get-parent-id, -get-left-id return block-id
|
|
|
;; the :block/parent, :block/left should be datascript lookup ref
|
|
|
|
|
|
@@ -142,7 +160,10 @@
|
|
|
(util/remove-nils))
|
|
|
m (if (state/enable-block-timestamps?) (block-with-timestamps m) m)
|
|
|
other-tx (:db/other-tx m)
|
|
|
- id (:db/id (:data this))]
|
|
|
+ id (:db/id (:data this))
|
|
|
+ block-entity (db/entity id)
|
|
|
+ old-refs (:block/refs block-entity)
|
|
|
+ new-refs (:block/refs m)]
|
|
|
(when (seq other-tx)
|
|
|
(swap! txs-state (fn [txs]
|
|
|
(vec (concat txs other-tx)))))
|
|
|
@@ -155,13 +176,14 @@
|
|
|
[:db/retract id attribute])
|
|
|
db-schema/retract-attributes)))))
|
|
|
|
|
|
- (when-let [e (:block/page (db/entity id))]
|
|
|
+ (when-let [e (:block/page block-entity)]
|
|
|
(let [m {:db/id (:db/id e)
|
|
|
:block/updated-at (util/time-ms)}
|
|
|
m (if (:block/created-at e)
|
|
|
m
|
|
|
(assoc m :block/created-at (util/time-ms)))]
|
|
|
- (swap! txs-state conj m))))
|
|
|
+ (swap! txs-state conj m))
|
|
|
+ (remove-orphaned-page-refs! (:db/id block-entity) txs-state old-refs new-refs)))
|
|
|
|
|
|
(swap! txs-state conj (dissoc m :db/other-tx))
|
|
|
|