Kaynağa Gözat

fix: shape uuid should be persisted

Peng Xiao 3 yıl önce
ebeveyn
işleme
8eefd44540

+ 2 - 2
deps/graph-parser/src/logseq/graph_parser/extract.cljc

@@ -189,10 +189,10 @@
         page-block (first pages)
         page-name (filepath->page-name file)
         page-entity (build-page-entity {} file page-name page-name nil options)
-        page-block (merge page-block page-entity {:block/uuid (d/squuid)})
+        page-block (merge page-block page-entity (when-not (:block/uuid page-block) {:block/uuid (d/squuid)}))
         blocks (->> blocks
                     (map #(merge % {:block/level 1
-                                    :block/uuid (gp-block/get-custom-id-or-new-id (:block/properties %))}))
+                                    :block/uuid (or (:block/uuid %) (gp-block/get-custom-id-or-new-id (:block/properties %)))}))
                     (gp-block/with-parent-and-left {:block/name page-name}))
         _ (when verbose (println "Parsing finished: " file))]
     {:pages [page-block]

+ 2 - 1
src/main/frontend/extensions/tldraw.cljs

@@ -1,5 +1,6 @@
 (ns frontend.extensions.tldraw
   (:require ["/tldraw-logseq" :as TldrawLogseq]
+            [clojure.string :as string]
             [frontend.components.page :refer [page]]
             [frontend.handler.whiteboard :refer [page-name->tldr
                                                  transact-tldr!]]
@@ -18,7 +19,7 @@
   (rum/local false ::view-mode?)
   [state name]
   (let [data (page-name->tldr name)]
-    (when name
+    (when (and name (not-empty (gobj/get data "currentPageId")))
       [:div.draw.tldraw.relative.w-full.h-full
        {:style {:overscroll-behavior "none"}
         :on-blur #(state/set-block-component-editing-mode! false)

+ 12 - 10
src/main/frontend/handler/whiteboard.cljs

@@ -6,6 +6,17 @@
             [frontend.modules.outliner.file :as outliner-file]
             [frontend.state :as state]))
 
+;; (defn set-linked-page-or-block!
+;;   [page-or-block-id]
+;;   (when-let [app ^js (state/get-current-whiteboard)]
+;;     (let [shapes (:whiteboard/linked-shapes @state/state)]
+;;       (when (and (seq shapes) page-or-block-id)
+;;         (let [fs (first shapes)]
+;;           (.updateShapes app (clj->js
+;;                               [{:id (.-id fs)
+;;                                 :logseqLink page-or-block-id}])))))))
+
+
 ;; FIXME: embed /draw should be supported too
 (defn whiteboard-mode?
   []
@@ -71,7 +82,7 @@
         assets (:assets page-properties)
         page-properties (dissoc page-properties :assets)]
     (clj->js {:currentPageId id
-              :assets assets
+              :assets (or assets #js [])
               :pages [(merge page-properties
                              {:id id
                               :name "page"
@@ -89,15 +100,6 @@
         tx (tldr-page->blocks-tx page-name (assoc (first pages) :assets assets))]
     (db-utils/transact! tx)))
 
-(defn set-linked-page-or-block!
-  [page-or-block-id]
-  (when-let [app ^js (state/get-current-whiteboard)]
-    (let [shapes (:whiteboard/linked-shapes @state/state)]
-      (when (and (seq shapes) page-or-block-id)
-        (let [fs (first shapes)]
-          (.updateShapes app (clj->js
-                              [{:id (.-id fs)
-                                :logseqLink page-or-block-id}])))))))
 
 (defn get-default-tldr
   [page-id]

+ 15 - 1
tldraw/packages/core/src/lib/TLPage/TLPage.ts

@@ -64,7 +64,10 @@ export class TLPage<S extends TLShape = TLShape, E extends TLEventMap = TLEventM
       id: this.id,
       name: this.name,
       // @ts-expect-error maybe later
-      shapes: this.shapes.map(shape => shape.serialized).filter(s => !!s).map(s => toJS(s)),
+      shapes: this.shapes
+        .map(shape => shape.serialized)
+        .filter(s => !!s)
+        .map(s => toJS(s)),
       bindings: deepCopy(this.bindings),
       nonce: this.nonce,
     }
@@ -261,6 +264,17 @@ export class TLPage<S extends TLShape = TLShape, E extends TLEventMap = TLEventM
       }
     })
 
+    // Cleanup outdated bindings
+    Object.keys(updated.bindings).forEach(id => {
+      if (
+        !updated.shapes.find(
+          shape => shape.id === updated.bindings[id].toId || updated.bindings[id].fromId
+        )
+      ) {
+        delete updated.bindings[id]
+      }
+    })
+
     if (!deepEqual(updated, curr)) {
       this.update({
         bindings: updated.bindings,