Browse Source

ux: cmd+k to create page/block shapes

Tienson Qin 3 years ago
parent
commit
45ea8de1d1

+ 34 - 25
src/main/frontend/components/search.cljs

@@ -9,6 +9,7 @@
             [frontend.handler.page :as page-handler]
             [frontend.handler.block :as block-handler]
             [frontend.handler.notification :as notification]
+            [frontend.handler.whiteboard :as whiteboard-handler]
             [frontend.db :as db]
             [frontend.db.model :as model]
             [frontend.handler.search :as search-handler]
@@ -115,35 +116,43 @@
   [repo search-q {:keys [type data alias]}]
   (search-handler/add-search-to-recent! repo search-q)
   (search-handler/clear-search!)
-  (case type
-    :graph-add-filter
-    (state/add-graph-search-filter! search-q)
+  (let [whiteboard? (whiteboard-handler/whiteboard-mode?)]
+    (case type
+     :graph-add-filter
+     (state/add-graph-search-filter! search-q)
 
-    :new-page
-    (page-handler/create! search-q)
+     :new-page
+     (do
+       (page-handler/create! search-q {:redirect? (not whiteboard?)})
+       (when whiteboard?
+         (whiteboard-handler/create-page! search-q)))
 
-    :page
-    (let [data (or alias data)]
-      (route/redirect-to-page! data))
+     :page
+     (let [data (or alias data)]
+       (if whiteboard?
+         (whiteboard-handler/create-page! data)
+         (route/redirect-to-page! data)))
 
-    :file
-    (route/redirect! {:to :file
-                      :path-params {:path data}})
+     :file
+     (route/redirect! {:to :file
+                       :path-params {:path data}})
 
-    :block
-    (let [block-uuid (uuid (:block/uuid data))
-          collapsed? (db/parents-collapsed? repo block-uuid)
-          page (:block/page (db/entity [:block/uuid block-uuid]))
-          long-page? (block-handler/long-page? repo (:db/id page))]
-      (if page
-        (if (or collapsed? long-page?)
-          (route/redirect-to-page! block-uuid)
-          (route/redirect-to-page! (:block/name page) (str "ls-block-" (:block/uuid data))))
-        ;; search indice outdated
-        (println "[Error] Block page missing: "
-                 {:block-id block-uuid
-                  :block (db/pull [:block/uuid block-uuid])})))
-    nil)
+     :block
+     (let [block-uuid (uuid (:block/uuid data))
+           collapsed? (db/parents-collapsed? repo block-uuid)
+           page (:block/page (db/entity [:block/uuid block-uuid]))
+           long-page? (block-handler/long-page? repo (:db/id page))]
+       (if whiteboard?
+         (whiteboard-handler/create-page! (str block-uuid))
+         (if page
+           (if (or collapsed? long-page?)
+             (route/redirect-to-page! block-uuid)
+             (route/redirect-to-page! (:block/name page) (str "ls-block-" (:block/uuid data))))
+           ;; search indice outdated
+           (println "[Error] Block page missing: "
+                    {:block-id block-uuid
+                     :block (db/pull [:block/uuid block-uuid])}))))
+     nil))
   (state/close-modal!))
 
 (defn- search-on-shift-chosen

+ 12 - 3
src/main/frontend/extensions/tldraw.cljs

@@ -1,5 +1,5 @@
 (ns frontend.extensions.tldraw
-  (:require ["tldraw-logseq$App" :as tldraw-app]
+  (:require ["tldraw-logseq" :as TldrawLogseq]
             [frontend.components.page :refer [page]]
             [frontend.extensions.draw :as draw-common]
             [frontend.handler.draw :as draw-handler]
@@ -10,10 +10,17 @@
             [goog.object :as gobj]
             [rum.core :as rum]))
 
-(def tldraw (r/adapt-class tldraw-app))
+(def tldraw (r/adapt-class (gobj/get TldrawLogseq "App")))
 
 (rum/defcs draw-inner < 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
@@ -30,7 +37,9 @@
                               (let [document (gobj/get app "serialized")
                                     s (js/JSON.stringify document)]
                                 (draw-handler/save-draw! file s)))
-                 :model data})]])))
+                 :model data
+                 :onApp (fn [app]
+                          (state/set-state! [:ui/whiteboards (::id state)] app))})]])))
 
 (rum/defc tldraw-app
   [option]

+ 15 - 0
src/main/frontend/handler/whiteboard.cljs

@@ -0,0 +1,15 @@
+(ns frontend.handler.whiteboard
+  (:require [frontend.state :as state]))
+
+;; FIXME: embed /draw should be supported too
+(defn whiteboard-mode?
+  []
+  (= (state/get-current-route) :whiteboard))
+
+(defn create-page!
+  [page-title]
+  (when-let [app ^js (state/get-current-whiteboard)]
+    (.createShapes app (clj->js
+                        [{:id (str "logseq-portal-" "clojure")
+                          :type "logseq-portal"
+                          :pageId page-title}]))))

+ 12 - 0
src/main/frontend/state.cljs

@@ -219,6 +219,8 @@
      :file-sync/sync-downloading-files      nil
 
      :encryption/graph-parsing?             false
+
+     :ui/whiteboards                        {}
      })))
 
 ;; block uuid -> {content(String) -> ast}
@@ -1685,3 +1687,13 @@
   [repo]
   (:feature/enable-encryption?
    (get (sub-config) repo)))
+
+;; FIXME:
+(defn get-current-whiteboard
+  []
+  (second (first (:ui/whiteboards @state))))
+
+(defn get-tldraw-api
+  []
+  (some-> (get-current-whiteboard)
+          (gobj/get "api")))