fix: don't delete property values while typing

property values were deleted while typing b/c
content ref re-calculation wasn't considering them.
Related to LOG-2819
experiment/tanstack-table
Gabriel Horner 2024-05-24 18:14:14 -04:00
parent 11ba3e8250
commit 77f14ca1f6
2 changed files with 44 additions and 40 deletions

View File

@ -58,37 +58,31 @@
(if (de/entity? block) block (d/entity db (:db/id block))))))))
(defn- remove-orphaned-page-refs!
[db {db-id :db/id} txs-state *old-refs new-refs {:keys [db-graph?]}]
(let [old-refs (if db-graph?
;; remove class and property related refs because this fn is only meant
;; to cleanup refs in content
(remove #(some #{"class" "property"} (:block/type %))
*old-refs)
*old-refs)]
(when (not= old-refs new-refs)
(let [new-refs (set (map (fn [ref]
(or (:block/name ref)
(and (:db/id ref)
(:block/name (d/entity db (:db/id ref)))))) new-refs))
old-pages (->> (keep :db/id old-refs)
(d/pull-many db '[*])
(remove (fn [e] (contains? new-refs (:block/name e))))
(map :block/name)
(remove nil?))
orphaned-pages (when (seq old-pages)
(ldb/get-orphaned-pages db {:pages old-pages
:built-in-pages-names
(if db-graph?
sqlite-create-graph/built-in-pages-names
gp-db/built-in-pages-names)
:empty-ref-f (fn [page]
(let [refs (:block/_refs page)]
(and (or (zero? (count refs))
(= #{db-id} (set (map :db/id refs))))
(not (some #{"class" "property"} (:block/type page))))))}))]
(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))))))))))
[db {db-id :db/id} txs-state old-refs new-refs {:keys [db-graph?]}]
(when (not= old-refs new-refs)
(let [new-refs (set (map (fn [ref]
(or (:block/name ref)
(and (:db/id ref)
(:block/name (d/entity db (:db/id ref)))))) new-refs))
old-pages (->> (keep :db/id old-refs)
(d/pull-many db '[*])
(remove (fn [e] (contains? new-refs (:block/name e))))
(map :block/name)
(remove nil?))
orphaned-pages (when (seq old-pages)
(ldb/get-orphaned-pages db {:pages old-pages
:built-in-pages-names
(if db-graph?
sqlite-create-graph/built-in-pages-names
gp-db/built-in-pages-names)
:empty-ref-f (fn [page]
(let [refs (:block/_refs page)]
(and (or (zero? (count refs))
(= #{db-id} (set (map :db/id refs))))
(not (some #{"class" "property"} (:block/type page))))))}))]
(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)))))))))
(defn- update-page-when-save-block
[txs-state block-entity m]
@ -116,10 +110,15 @@
(swap! txs-state into txs))))
(defn- remove-orphaned-refs-when-save
[db txs-state block-entity m opts]
[db txs-state block-entity m {:keys [db-graph?] :as opts}]
(let [remove-self-page #(remove (fn [b]
(= (:db/id b) (:db/id (:block/page block-entity)))) %)
old-refs (remove-self-page (:block/refs block-entity))
;; only provide content based refs for db graphs instead of removing
;; as calculating all non-content refs is more complex
old-refs (if db-graph?
(let [content-refs (set (outliner-pipeline/block-content-refs db block-entity))]
(filter #(contains? content-refs (:db/id %)) (:block/refs block-entity)))
(remove-self-page (:block/refs block-entity)))
new-refs (remove-self-page (:block/refs m))]
(remove-orphaned-page-refs! db block-entity txs-state old-refs new-refs opts)))

View File

@ -130,6 +130,17 @@
:else (throw (js/Error. (str "invalid ref " ref)))))
(defn block-content-refs
"Return ref block ids for given block"
[db block]
(let [content (or (:block/raw-content block)
(:block/content block))]
(when (string? content)
(->> (db-content/get-matched-special-ids content)
(map (fn [id]
(when-let [e (d/entity db [:block/uuid id])]
(:db/id e))))))))
(defn db-rebuild-block-refs
"Rebuild block refs for DB graphs"
[db block]
@ -154,13 +165,7 @@
:else
nil))))
property-refs (concat property-key-refs property-value-refs)
content-refs (let [content (or (:block/raw-content block)
(:block/content block))]
(when (string? content)
(->> (db-content/get-matched-special-ids content)
(map (fn [id]
(when-let [e (d/entity db [:block/uuid id])]
(:db/id e)))))))]
content-refs (block-content-refs db block)]
(->> (concat (map ref->eid (:block/tags block))
(when-let [id (:db/id (:block/link block))]
[id])