Tienson Qin 1 год назад
Родитель
Сommit
a78c20eeed

+ 2 - 1
src/main/frontend/components/page.cljs

@@ -159,7 +159,8 @@
   {:will-mount (fn [state]
                  (let [page-e (second (:rum/args state))
                        page-name (:block/name page-e)]
-                   (when (and (db/journal-page? page-name)
+                   (when (and page-name
+                              (db/journal-page? page-name)
                               (>= (date/journal-title->int page-name)
                                   (date/journal-title->int (date/today))))
                      (state/pub-event! [:journal/insert-template page-name])))

+ 15 - 10
src/main/frontend/extensions/tldraw.cljs

@@ -10,6 +10,7 @@
             [frontend.db :as db]
             [frontend.extensions.pdf.assets :as pdf-assets]
             [frontend.handler.editor :as editor-handler]
+            [frontend.handler.page :as page-handler]
             [frontend.handler.assets :as assets-handler]
             [frontend.handler.route :as route-handler]
             [frontend.handler.whiteboard :as whiteboard-handler]
@@ -139,17 +140,21 @@
                       (state/sidebar-add-block! (state/get-current-repo)
                                                 (:db/id (model/get-page uuid))
                                                 (keyword type)))
-   :redirectToPage (fn [block-uuid-str]
-                     (when (and block-uuid-str (common-util/uuid-string? block-uuid-str))
-                       (let [block-id (parse-uuid block-uuid-str)
-                             page (model/get-block-page (state/get-current-repo) block-id)
+   :redirectToPage (fn [page-name-or-uuid] ; FIXME whiteboard link refs should store UUIDs instead of page names
+                     (when page-name-or-uuid
+                       (let [block-id (parse-uuid page-name-or-uuid)
+                             page (if block-id
+                                    (model/get-block-page (state/get-current-repo) block-id)
+                                    (db/get-page page-name-or-uuid))
                              whiteboard? (model/whiteboard-page? page)]
-                         (when page
-                           (if whiteboard?
-                             (route-handler/redirect-to-page! (:block/uuid page)
-                                                              (when (not= block-id (:block/uuid page))
-                                                                {:block-id block-id}))
-                             (route-handler/redirect-to-page! (model/get-redirect-page-name (:block/name page))))))))})
+                         (p/let [new-page (when (nil? page)
+                                            (page-handler/<create! page-name-or-uuid {:redirect? false}))
+                                 page' (or new-page page)]
+                           (route-handler/redirect-to-page! (if whiteboard?
+                                                              (:block/uuid page')
+                                                              (model/get-redirect-page-name (:block/name page')))
+                                                            (when (and block-id (not= block-id (:block/uuid page')))
+                                                              {:block-id block-id}))))))})
 
 (defonce *transact-result (atom nil))
 

+ 23 - 20
src/main/frontend/handler/route.cljs

@@ -70,32 +70,35 @@
      :path-params {:name (str page-name)}}))
 
 (defn redirect-to-page!
-  "Must ensure `page-name` is dereferenced (not an alias), or it will create a
-  wrong new page with that name (#3511). page-name can be a block name or uuid"
+  "`page-name` can be a block uuid or name, prefer to use uuid than name when possible"
   ([page-name]
    (redirect-to-page! page-name {}))
   ([page-name {:keys [anchor push click-from-recent? block-id new-whiteboard?]
                :or {click-from-recent? false}}]
    (when (or (uuid? page-name)
              (and (string? page-name) (not (string/blank? page-name))))
-     ;; Always skip onboarding when loading an existing whiteboard
-     (when-not new-whiteboard? (state/set-onboarding-whiteboard! true))
-     (when-let [db-id (:db/id (db/get-page page-name))]
-       (recent-handler/add-page-to-recent! db-id click-from-recent?))
-     (if (and (= (str page-name) (state/get-current-page)) block-id)
-       (state/focus-whiteboard-shape block-id)
-       (let [m (cond->
-                (default-page-route (str page-name))
-
-                 block-id
-                 (assoc :query-params {:block-id anchor})
-
-                 anchor
-                 (assoc :query-params {:anchor anchor})
-
-                 (boolean? push)
-                 (assoc :push push))]
-         (redirect! m))))))
+     (let [page (db/get-page page-name)
+           whiteboard? (db/whiteboard-page? page)]
+       ;; Always skip onboarding when loading an existing whiteboard
+       (when-not new-whiteboard? (state/set-onboarding-whiteboard! true))
+       (when-let [db-id (:db/id page)]
+         (recent-handler/add-page-to-recent! db-id click-from-recent?))
+       (if (and whiteboard?  (= (str page-name) (state/get-current-page)) block-id)
+         (state/focus-whiteboard-shape block-id)
+         (let [m (cond->
+                  (default-page-route (str page-name))
+
+                   block-id
+                   (assoc :query-params (if whiteboard?
+                                          {:block-id block-id}
+                                          {:anchor (str "ls-block-" block-id)}))
+
+                   anchor
+                   (assoc :query-params {:anchor anchor})
+
+                   (boolean? push)
+                   (assoc :push push))]
+           (redirect! m)))))))
 
 (defn get-title
   [name path-params]