Browse Source

wip save/load whiteboard edn

Peng Xiao 3 years ago
parent
commit
03e79edaa1

+ 1 - 1
resources/package.json

@@ -1,5 +1,5 @@
 {
-  "name": "Logseq",
+  "name": "Logseq-123",
   "version": "0.7.6",
   "main": "electron.js",
   "author": "Logseq",

+ 4 - 5
src/main/frontend/components/whiteboard.cljs

@@ -12,12 +12,12 @@
            (p/let [_ (loader/load :tldraw)]
              (reset! tldraw-loaded? true))
            state)}
-  [option]
+  [name]
   (let [loaded? (rum/react tldraw-loaded?)
         draw-component (when loaded?
                          (resolve 'frontend.extensions.tldraw/tldraw-app))]
     (when draw-component
-      (draw-component option))))
+      (draw-component name))))
 
 (defn- get-whiteboard-name
   [state]
@@ -34,10 +34,9 @@
 
 (rum/defcs whiteboard < rum/reactive
   [state]
-  (let [name (get-whiteboard-name state)
-        tldr-name (str "draws/" name ".tldr")]
+  (let [name (get-whiteboard-name state)]
     [:div.absolute.w-full.h-full
      ;; makes sure the whiteboard will not cover the borders
      {:key name
       :style {:padding "0.5px" :z-index 0}}
-     (tldraw-app {:file tldr-name})]))
+     (tldraw-app name)]))

+ 45 - 0
src/main/frontend/db/model.cljs

@@ -1624,3 +1624,48 @@
                         (remove false?)
                         (remove nil?))]
     orphaned-pages))
+
+
+(defn- block->shape [block]
+  (let [properties (:block/properties block)]
+    (merge block
+           properties
+           ;; Use the block's id as the shape's id.
+           {:id (str (:block/uuid block))})))
+
+(defn- shape->block [shape]
+  (let [properties shape]
+    {:block/uuid (uuid (:id shape))
+     :block/properties properties}))
+
+(defn- tldr-page->blocks-tx [page-name tldr-data]
+  (let [shapes (mapv shape->block (:shapes tldr-data))
+        page-block {:block/name page-name
+                    :block/whiteboard? true
+                    :block/properties (dissoc tldr-data :shapes)}]
+    (cons page-block shapes)))
+
+(defn- get-whiteboard-clj [page-name]
+  (let [page-block (get-page page-name)
+        blocks (get-page-blocks-no-cache page-name)]
+    [page-block blocks]))
+
+(defn- whiteboard-clj->tldr [page-block blocks]
+  (let [shapes (map block->shape blocks)
+        page-name (:block/name page-block)
+        page-properties (:block/properties page-block)]
+    (clj->js {:currentPageId page-name
+              :pages [(merge page-properties
+                             {:id "page"
+                              :name "page"
+                              :shapes shapes})]})))
+
+(defn page-name->tldr [page-name]
+  (let [[page-block blocks] (get-whiteboard-clj page-name)]
+    (whiteboard-clj->tldr page-block blocks)))
+
+(defn transact-tldr! [page-name tldr]
+  (let [{:keys [pages]} (js->clj tldr :keywordize-keys true)
+        tx (tldr-page->blocks-tx page-name (first pages))]
+    (println tx)
+    (db-utils/transact! tx)))

+ 7 - 20
src/main/frontend/extensions/tldraw.cljs

@@ -1,9 +1,8 @@
 (ns frontend.extensions.tldraw
   (:require ["/tldraw-logseq" :as TldrawLogseq]
             [frontend.components.page :refer [page]]
-            [frontend.extensions.draw :as draw-common]
-            [frontend.handler.draw :as draw-handler]
             [frontend.search :as search]
+            [frontend.db.model :as model]
             [frontend.rum :as r]
             [frontend.state :as state]
             [frontend.util :as util]
@@ -12,18 +11,11 @@
 
 (def tldraw (r/adapt-class (gobj/get TldrawLogseq "App")))
 
-(rum/defcs draw-inner < rum/reactive
+(rum/defcs tldraw-app < rum/reactive
   (rum/local false ::view-mode?)
-  {:init (fn [state]
-           (assoc state ::id (random-uuid)))
-   :will-unmount (fn [state]
-                   (state/update-state! :ui/whiteboards
-                                        (fn [m]
-                                          (dissoc m (::id state))))
-                   state)}
-  [state data option]
-  (let [{:keys [file]} option]
-    (when file
+  [state name]
+  (let [data (model/page-name->tldr name)]
+    (when name
       [:div.draw.tldraw.relative.w-full.h-full
        {:style {:overscroll-behavior "none"}
         :on-blur #(state/set-block-component-editing-mode! false)
@@ -33,16 +25,11 @@
        (tldraw {:PageComponent page
                 :searchHandler (comp clj->js vec search/page-search)
                 :onPersist (fn [app]
-                             (let [document (gobj/get app "serialized")
-                                   s (js/JSON.stringify document)]
-                               (draw-handler/save-draw! file s)))
+                             (let [document (gobj/get app "serialized")]
+                               (model/transact-tldr! name document)))
                 :model data
                 :onMount (fn [app]
                            (state/set-state! [:ui/whiteboards (::id state)] app)
                            (gobj/set app "pubEvent"
                                      (fn [type & args]
                                        (state/pub-event! (cons (keyword type) args)))))})])))
-
-(rum/defc tldraw-app
-  [option]
-  (draw-common/draw-wrapper option draw-inner))

+ 2 - 3
src/main/frontend/modules/file/core.cljs

@@ -113,7 +113,6 @@
 
 (defn- transact-file-tx-if-not-exists!
   [page ok-handler]
-  (println page)
   (when-let [repo (state/get-current-repo)]
     (when (:block/name page)
       (let [format (name (get page :block/format
@@ -148,8 +147,8 @@
   [page-block tree]
   (let [page-block (db/pull '[* {:block/file [:file/path]}] (:db/id page-block))
         file-path (get-in page-block [:block/file :file/path])
-        edn? (string/ends-with? file-path ".edn")
-        new-content (if edn?
+        whiteboard? (:block/whiteboard? page-block)
+        new-content (if whiteboard?
                       (util/pp-str {:blocks (map remove-transit-ids tree)
                                     :pages (list (remove-transit-ids page-block))})
                       (tree->file-content tree {:init-level init-level}))

+ 4 - 5
src/main/frontend/modules/outliner/file.cljs

@@ -30,16 +30,15 @@
 
 (defn do-write-file!
   [repo page-db-id]
-  (let [page-block (db/pull repo '[* {:block/file [:file/path]}] page-db-id)
-        file-path (get-in page-block [:block/file :file/path])
-        edn? (and file-path (string/ends-with? file-path ".edn"))
+  (let [page-block (db/pull repo '[*] page-db-id)
+        whiteboard? (:block/whiteboard? page-block)
         blocks (model/get-page-blocks-no-cache repo (:block/name page-block)
-                                               {:pull-keys (if edn? blocks-pull-keys-with-persisted-ids '[*])})]
+                                               {:pull-keys (if whiteboard? blocks-pull-keys-with-persisted-ids '[*])})]
     (when-not (and (= 1 (count blocks))
                    (string/blank? (:block/content (first blocks)))
                    (nil? (:block/file page-block)))
       (if page-block
-        (file/save-tree! page-block (if edn?
+        (file/save-tree! page-block (if whiteboard?
                                       blocks
                                       (tree/blocks->vec-tree repo blocks (:block/name page-block))))
         (js/console.error (str "can't find page id: " page-db-id))))))

+ 0 - 53
src/main/frontend/modules/whiteboard/core.cljs

@@ -1,53 +0,0 @@
-(ns frontend.modules.whiteboard.core
-  (:require [frontend.db :as db]
-            [frontend.db.model :as model]
-            [clojure.pprint :as pprint]
-            [goog.object :as gobj]))
-
-(defn- get-page-block [page-name]
-  (db/pull '[*] (:db/id (model/get-page page-name))))
-
-(defn- block->shape [block]
-  (let [properties (:block/properties block)]
-    (merge block
-           properties
-           ;; Use the block's id as the shape's id.
-           {:id (str (:block/uuid block))})))
-
-(defn- shape->block [blocks-by-uuid shape]
-  (let [properties shape
-        block (get blocks-by-uuid (:id shape))]
-    (merge block
-           {:properties properties})))
-
-(defn get-whiteboard-cjs [page-name]
-  (let [page-block (get-page-block page-name)
-        blocks (model/get-page-blocks-no-cache page-name)]
-    [page-block blocks]))
-
-(defn whiteboard-cjs->tldr [page-block blocks]
-  (let [shapes (map block->shape blocks)
-        page-name (:block/name page-block)
-        page-properties (:block/properties page-block)]
-    (clj->js {:currentPageId page-name
-              :pages [(merge page-properties
-                             {:id "page"
-                              :name "page"
-                              :shapes shapes})]})))
-
-(defn page-name->tldr [page-name]
-  (let [[page-block blocks] (get-whiteboard-cjs page-name)]
-    (whiteboard-cjs->tldr page-block blocks)))
-
-(defn transact-tldr! [page-name tldr]
-  (let [[page-block blocks] (get-whiteboard-cjs page-name)
-        {:keys [pages]} (js->clj tldr)
-        page (first pages) ;; should only contain one page
-        shapes (:shapes page)
-        blocks-by-uuid (reduce (fn [acc shape]
-                                 (assoc (:id shape) shape acc))
-                               blocks {})
-        blocks (map #(shape->block blocks-by-uuid %) shapes)]
-    [page-block blocks]))
-
-(js/console.log (page-name->tldr "edn-test"))

+ 0 - 14
src/test/frontend/modules/whiteboard/core_test.cljs

@@ -1,14 +0,0 @@
-(ns frontend.modules.whiteboard.core-test
-  (:require [cljs.test :refer [use-fixtures]]
-            [frontend.test.fixtures :as fixtures]
-            [frontend.test.helper :as helper]))
-
-
-(def test-db helper/test-db)
-
-(use-fixtures :each
-  fixtures/load-test-env
-  fixtures/react-components
-  fixtures/reset-db)
-
-

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

@@ -64,7 +64,7 @@ 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),
+      shapes: this.shapes.map(shape => shape.serialized).filter(s => !!s).map(toJS),
       bindings: deepCopy(this.bindings),
       nonce: this.nonce,
     }