|
|
@@ -57,9 +57,8 @@
|
|
|
:shapes shapes})]})))
|
|
|
|
|
|
(defn build-page-block
|
|
|
- [page-name tldraw-page assets shapes-index]
|
|
|
- (let [page-entity (model/get-page page-name)
|
|
|
- get-k #(gobj/get tldraw-page %)]
|
|
|
+ [page-entity page-name tldraw-page assets shapes-index]
|
|
|
+ (let [get-k #(gobj/get tldraw-page %)]
|
|
|
{:block/original-name page-name
|
|
|
:block/name (util/page-name-sanity-lc page-name)
|
|
|
:block/type "whiteboard"
|
|
|
@@ -103,10 +102,6 @@
|
|
|
(mapv (fn [b] (pu/get-property b :logseq.tldraw.shape)))
|
|
|
(remove nil?)))
|
|
|
deleted-shapes-tx (mapv (fn [id] [:db/retractEntity [:block/uuid (uuid id)]]) deleted-ids)
|
|
|
- changed-shapes (set/difference upsert-shapes created-shapes)
|
|
|
- prev-changed-blocks (when (seq changed-shapes)
|
|
|
- (db/pull-many repo '[*] (mapv (fn [shape]
|
|
|
- [:block/uuid (uuid (:id shape))]) changed-shapes)))
|
|
|
upserted-blocks (->> (map #(shape->block % page-name) upsert-shapes)
|
|
|
(remove (fn [b]
|
|
|
(= (:nonce
|
|
|
@@ -116,19 +111,20 @@
|
|
|
(:nonce
|
|
|
(pu/get-property
|
|
|
b
|
|
|
- :logseq.tldraw.shape))))))]
|
|
|
+ :logseq.tldraw.shape))))))
|
|
|
+ page-entity (model/get-page page-name)
|
|
|
+ page-block (build-page-block page-entity page-name tl-page assets shapes-index)]
|
|
|
(when (or (seq upserted-blocks)
|
|
|
- (seq deleted-shapes-tx))
|
|
|
- {:page-block (build-page-block page-name tl-page assets shapes-index)
|
|
|
+ (seq deleted-shapes-tx)
|
|
|
+ (not= (:block/properties page-block)
|
|
|
+ (:block/properties page-entity)))
|
|
|
+ {:page-block page-block
|
|
|
:upserted-blocks (map sqlite-util/block-with-timestamps upserted-blocks)
|
|
|
:delete-blocks deleted-shapes-tx
|
|
|
+ :deleted-shapes deleted-shapes
|
|
|
+ :new-shapes created-shapes
|
|
|
:metadata {:whiteboard/transact? (not replace?)
|
|
|
- :replace? replace?
|
|
|
- :data {:page-name page-name
|
|
|
- :deleted-shapes deleted-shapes
|
|
|
- :new-shapes created-shapes
|
|
|
- :changed-shapes changed-shapes
|
|
|
- :prev-changed-blocks prev-changed-blocks}}})))
|
|
|
+ :replace? replace?}})))
|
|
|
|
|
|
(defonce *last-shapes-nonce (atom {}))
|
|
|
(defn <transact-tldr-delta!
|
|
|
@@ -150,12 +146,10 @@
|
|
|
(get-in @*last-shapes-nonce [repo page-name])
|
|
|
(set (->> (model/get-whiteboard-id-nonces repo page-name)
|
|
|
(map #(update % :id str)))))
|
|
|
- {:keys [page-block upserted-blocks delete-blocks metadata] :as result}
|
|
|
+ {:keys [page-block new-shapes deleted-shapes upserted-blocks delete-blocks metadata] :as result}
|
|
|
(compute-tx app tl-page new-id-nonces db-id-nonces page-name replace?)]
|
|
|
(when (seq result)
|
|
|
(let [tx-data (concat delete-blocks [page-block] upserted-blocks)
|
|
|
- new-shapes (get-in metadata [:data :new-shapes])
|
|
|
- deleted-shapes (get-in metadata [:data :deleted-shapes])
|
|
|
metadata' (cond
|
|
|
;; group
|
|
|
(some #(= "group" (:type %)) new-shapes)
|
|
|
@@ -171,10 +165,7 @@
|
|
|
|
|
|
(assoc metadata :whiteboard/op :new-arrow)
|
|
|
:else
|
|
|
- metadata)
|
|
|
- metadata' (if (seq (concat upserted-blocks delete-blocks))
|
|
|
- metadata'
|
|
|
- (assoc metadata :undo? true))]
|
|
|
+ metadata)]
|
|
|
(swap! *last-shapes-nonce assoc-in [repo page-name] new-id-nonces)
|
|
|
(if (contains? #{:new-arrow} (:whiteboard/op metadata'))
|
|
|
(state/set-state! :whiteboard/pending-tx-data
|
|
|
@@ -339,6 +330,23 @@
|
|
|
(= page-name (:block/name (first whiteboards)))))
|
|
|
(not (state/get-onboarding-whiteboard?)))))
|
|
|
|
|
|
+(defn update-shapes!
|
|
|
+ [shapes]
|
|
|
+ (when-let [app (state/active-tldraw-app)]
|
|
|
+ (let [^js api (.-api app)]
|
|
|
+ (apply (.-updateShapes api) (bean/->js shapes)))))
|
|
|
+
|
|
|
+(defn update-shapes-index!
|
|
|
+ [page-name]
|
|
|
+ (when-let [app (state/active-tldraw-app)]
|
|
|
+ (let [tl-page ^js (second (first (.-pages app)))]
|
|
|
+ (when tl-page
|
|
|
+ (when-let [page (db/entity [:block/name page-name])]
|
|
|
+ (let [page-metadata (pu/get-property page :logseq.tldraw.page)
|
|
|
+ shapes-index (:shapes-index page-metadata)]
|
|
|
+ (when (seq shapes-index)
|
|
|
+ (.updateShapesIndex tl-page (bean/->js shapes-index)))))))))
|
|
|
+
|
|
|
(defn populate-onboarding-whiteboard
|
|
|
[api]
|
|
|
(when (some? api)
|
|
|
@@ -348,109 +356,11 @@
|
|
|
(p/catch
|
|
|
(fn [e] (js/console.warn "Failed to populate onboarding whiteboard" e))))))
|
|
|
|
|
|
-(defn- delete-shapes!
|
|
|
- [^js api shapes]
|
|
|
- (apply (.-deleteShapes api) (map :id shapes)))
|
|
|
-
|
|
|
-(defn- create-shapes!
|
|
|
- [^js api shapes]
|
|
|
- (apply (.-createShapes api) (bean/->js shapes)))
|
|
|
-
|
|
|
-(defn- update-shapes!
|
|
|
- [^js api shapes]
|
|
|
- (apply (.-updateShapes api) (bean/->js shapes)))
|
|
|
-
|
|
|
-(defn- select-shapes
|
|
|
- [^js api ids]
|
|
|
- (apply (.-selectShapes api) ids))
|
|
|
-
|
|
|
(defn cleanup!
|
|
|
[^js tl-page]
|
|
|
(let [shapes (.-shapes tl-page)]
|
|
|
(.cleanup tl-page (map #(.-id %) shapes))))
|
|
|
|
|
|
-(defn update-bindings!
|
|
|
- [^js tl-page page-name]
|
|
|
- (when-let [page (db/entity [:block/name page-name])]
|
|
|
- (let [page-metadata (pu/get-property page :logseq.tldraw.page)
|
|
|
- bindings (:bindings page-metadata)]
|
|
|
- (when (seq bindings)
|
|
|
- (.updateBindings tl-page (bean/->js bindings))))))
|
|
|
-
|
|
|
-(defn update-shapes-index!
|
|
|
- [^js tl-page page-name]
|
|
|
- (when-let [page (db/entity [:block/name page-name])]
|
|
|
- (let [page-metadata (pu/get-property page :logseq.tldraw.page)
|
|
|
- shapes-index (:shapes-index page-metadata)]
|
|
|
- (when (seq shapes-index)
|
|
|
- (.updateShapesIndex tl-page (bean/->js shapes-index))))))
|
|
|
-
|
|
|
-(defn undo!
|
|
|
- [{:keys [tx-meta]}]
|
|
|
- (history/pause-listener!)
|
|
|
- (try
|
|
|
- (when-let [app (state/active-tldraw-app)]
|
|
|
- (let [{:keys [page-name deleted-shapes new-shapes changed-shapes prev-changed-blocks]} (:data tx-meta)
|
|
|
- whiteboard-op (:whiteboard/op tx-meta)
|
|
|
- ^js api (.-api app)
|
|
|
- tl-page ^js (second (first (.-pages app)))]
|
|
|
- (when api
|
|
|
- (update-bindings! tl-page page-name)
|
|
|
- (update-shapes-index! tl-page page-name)
|
|
|
- (case whiteboard-op
|
|
|
- :group
|
|
|
- (do
|
|
|
- (select-shapes api (map :id new-shapes))
|
|
|
- (.unGroup api))
|
|
|
- :un-group
|
|
|
- (do
|
|
|
- (select-shapes api (mapcat :children deleted-shapes))
|
|
|
- (.doGroup api))
|
|
|
- (do
|
|
|
- (when (seq deleted-shapes)
|
|
|
- (create-shapes! api deleted-shapes))
|
|
|
- (when (seq new-shapes)
|
|
|
- (delete-shapes! api new-shapes))
|
|
|
- (when (seq changed-shapes)
|
|
|
- (let [prev-shapes (map (fn [b] (pu/get-property b :logseq.tldraw.shape))
|
|
|
- prev-changed-blocks)]
|
|
|
- (update-shapes! api prev-shapes))))))))
|
|
|
- (catch :default e
|
|
|
- (js/console.error e)))
|
|
|
- (history/resume-listener!))
|
|
|
-
|
|
|
-(defn redo!
|
|
|
- [{:keys [tx-meta]}]
|
|
|
- (history/pause-listener!)
|
|
|
- (try
|
|
|
- (when-let [app (state/active-tldraw-app)]
|
|
|
- (let [{:keys [page-name deleted-shapes new-shapes changed-shapes]} (:data tx-meta)
|
|
|
- whiteboard-op (:whiteboard/op tx-meta)
|
|
|
- ^js api (.-api app)
|
|
|
- tl-page ^js (second (first (.-pages app)))]
|
|
|
- (when api
|
|
|
- (update-bindings! tl-page page-name)
|
|
|
- (update-shapes-index! tl-page page-name)
|
|
|
- (case whiteboard-op
|
|
|
- :group
|
|
|
- (do
|
|
|
- (select-shapes api (mapcat :children new-shapes))
|
|
|
- (.doGroup api))
|
|
|
- :un-group
|
|
|
- (do
|
|
|
- (select-shapes api (map :id deleted-shapes))
|
|
|
- (.unGroup api))
|
|
|
- (do
|
|
|
- (when (seq deleted-shapes)
|
|
|
- (delete-shapes! api deleted-shapes))
|
|
|
- (when (seq new-shapes)
|
|
|
- (create-shapes! api new-shapes))
|
|
|
- (when (seq changed-shapes)
|
|
|
- (update-shapes! api changed-shapes)))))))
|
|
|
- (catch :default e
|
|
|
- (js/console.error e)))
|
|
|
- (history/resume-listener!))
|
|
|
-
|
|
|
(defn onboarding-show
|
|
|
[]
|
|
|
(when (not (or (state/sub :whiteboard/onboarding-tour?)
|