Browse Source

fix: whiteboard issues

Tienson Qin 2 years ago
parent
commit
4236ade600

+ 1 - 1
src/main/frontend/components/cmdk.cljs

@@ -504,7 +504,7 @@
                                             {:redirect? false
                                              :create-first-block? false
                                              :class? true})
-       create-whiteboard? (whiteboard-handler/create-new-whiteboard-and-redirect! @!input)
+       create-whiteboard? (whiteboard-handler/<create-new-whiteboard-and-redirect! @!input)
        create-page? (page-handler/<create! @!input {:redirect? true}))
      (if create-class?
        (state/pub-event! [:class/configure (db/entity [:block/name (util/page-name-sanity-lc class)])])

+ 1 - 1
src/main/frontend/components/container.cljs

@@ -220,7 +220,7 @@
      {:title (t :left-side-bar/new-whiteboard)
       :class "new-whiteboard-link"
       :options {:on-click #(do (close-sidebar-on-mobile!)
-                               (whiteboard-handler/create-new-whiteboard-and-redirect!))
+                               (whiteboard-handler/<create-new-whiteboard-and-redirect!))
                 :shortcut (ui/keyboard-shortcut-from-config :editor/new-whiteboard)}
       :icon (ui/type-icon {:name "new-whiteboard"
                            :class "highlight"

+ 96 - 100
src/main/frontend/components/page.cljs

@@ -328,106 +328,102 @@
              (assoc state ::title-value *title-value)))}
   [state page-name {:keys [fmt-journal? preview?]}]
   (when page-name
-    (let [repo (state/get-current-repo)
-          page (db/entity [:block/name page-name])
-          page-unloaded? (or (state/sub-page-unloaded? repo page-name) (nil? page))]
-      (when-not page-unloaded?
-        (let [page (when page-name (db/entity [:block/name page-name]))
-              page (db/sub-block (:db/id page))
-              title (or (:block/original-name page) page-name)
-              icon (pu/lookup (:block/properties page) :icon)
-              *hover? (::hover? state)
-              *title-value (get state ::title-value)
-              *edit? (get state ::edit?)
-              *configuring? (::configuring? state)
-              *input-value (get state ::input-value)
-              repo (state/get-current-repo)
-              hls-page? (pdf-utils/hls-file? title)
-              whiteboard-page? (model/whiteboard-page? page-name)
-              untitled? (and whiteboard-page? (parse-uuid page-name)) ;; normal page cannot be untitled right?
-              title (if hls-page?
-                      [:a.asset-ref (pdf-utils/fix-local-asset-pagename title)]
-                      (if fmt-journal?
-                        (date/journal-title->custom-format title)
-                        title))
-              old-name (or title page-name)
-              db-based? (config/db-based-graph? repo)
-              tags-property (db/entity [:block/name "tags"])]
-          [:div.ls-page-title.flex.flex-1.flex-row.flex-wrap.w-full.relative.items-center.gap-2
-           {:on-mouse-over #(reset! *hover? true)
-            :on-mouse-out #(when-not @*configuring?
-                             (reset! *hover? false))}
-           (when icon
-             [:div.page-icon {:on-mouse-down util/stop-propagation}
-              (if (and (map? icon) db-based?)
-                (icon-component/icon-picker icon
-                                            {:on-chosen (fn [_e icon]
-                                                          (let [icon-property-id (db-pu/get-built-in-property-uuid :icon)]
-                                                            (db-property-handler/update-property!
-                                                             repo
-                                                             (:block/uuid page)
-                                                             {:properties {icon-property-id icon}})))})
-                icon)])
-           [:div.flex.flex-1.flex-row.flex-wrap.items-center.gap-4
-            [:h1.page-title.flex-1.cursor-pointer.gap-1
-             {:class (when-not whiteboard-page? "title")
-              :on-mouse-down (fn [e]
-                               (when (util/right-click? e)
-                                 (state/set-state! :page-title/context {:page page-name})))
-              :on-click (fn [e]
-                          (when-not (= (.-nodeName (.-target e)) "INPUT")
-                            (.preventDefault e)
-                            (if (gobj/get e "shiftKey")
-                              (when-let [page (db/pull repo '[*] [:block/name page-name])]
-                                (state/sidebar-add-block!
-                                 repo
-                                 (:db/id page)
-                                 :page))
-                              (when (and (not hls-page?)
-                                         (not fmt-journal?)
-                                         (not config/publishing?)
-                                         (not (and (contains? (:block/type page) "property")
-                                                   (contains? db-property/built-in-properties-keys-str page-name))))
-                                (reset! *input-value (if untitled? "" old-name))
-                                (reset! *edit? true)))))}
-
-             (if @*edit?
-               (page-title-editor page {:*title-value *title-value
-                                        :*edit? *edit?
-                                        :*input-value *input-value
-                                        :page-name page-name
-                                        :old-name old-name
-                                        :untitled? untitled?
-                                        :whiteboard-page? whiteboard-page?
-                                        :preview? preview?})
-               [:span.title.block
-                {:on-click (fn []
-                             (when (and (state/home?) (not preview?))
-                               (route-handler/redirect-to-page! page-name)))
-                 :data-value @*input-value
-                 :data-ref   page-name
-                 :style      {:opacity (when @*edit? 0)}}
-                (let [nested? (and (string/includes? title page-ref/left-brackets)
-                                   (string/includes? title page-ref/right-brackets))]
-                  (cond untitled? [:span.opacity-50 (t :untitled)]
-                        nested? (component-block/map-inline {} (gp-mldoc/inline->edn title (mldoc/get-default-config
-                                                                                            (:block/format page))))
-                        :else title))])]
-            (when (and db-based? (seq (:block/tags page)))
-              [:div.page-tags.ml-4
-               (pv/property-value page tags-property (map :block/uuid (:block/tags page))
-                                  {:page-cp (fn [config page]
-                                              (component-block/page-cp (assoc config :tag? true) page))})])]
-
-           (when (and db-based? (not whiteboard-page?))
-             [:div.absolute.bottom-2.left-0
-              [:div.page-add-tags.flex.flex-row.items-center.flex-wrap.gap-2.ml-2
-               (when (and (empty? (:block/tags page)) @*hover? (not config/publishing?))
-                 (db-page/page-tags page tags-property *hover? *configuring?))
-
-               (when (or (some #(contains? #{"class" "property"} %) (:block/type page))
-                         (not (db-property-handler/block-has-viewable-properties? page)))
-                 (db-page/page-configure page *hover? *configuring?))]])])))))
+    (let [page (when page-name (db/entity [:block/name page-name]))
+          page (db/sub-block (:db/id page))
+          title (or (:block/original-name page) page-name)
+          icon (pu/lookup (:block/properties page) :icon)
+          *hover? (::hover? state)
+          *title-value (get state ::title-value)
+          *edit? (get state ::edit?)
+          *configuring? (::configuring? state)
+          *input-value (get state ::input-value)
+          repo (state/get-current-repo)
+          hls-page? (pdf-utils/hls-file? title)
+          whiteboard-page? (model/whiteboard-page? page-name)
+          untitled? (and whiteboard-page? (parse-uuid page-name)) ;; normal page cannot be untitled right?
+          title (if hls-page?
+                  [:a.asset-ref (pdf-utils/fix-local-asset-pagename title)]
+                  (if fmt-journal?
+                    (date/journal-title->custom-format title)
+                    title))
+          old-name (or title page-name)
+          db-based? (config/db-based-graph? repo)
+          tags-property (db/entity [:block/name "tags"])]
+      [:div.ls-page-title.flex.flex-1.flex-row.flex-wrap.w-full.relative.items-center.gap-2
+       {:on-mouse-over #(reset! *hover? true)
+        :on-mouse-out #(when-not @*configuring?
+                         (reset! *hover? false))}
+       (when icon
+         [:div.page-icon {:on-mouse-down util/stop-propagation}
+          (if (and (map? icon) db-based?)
+            (icon-component/icon-picker icon
+                                        {:on-chosen (fn [_e icon]
+                                                      (let [icon-property-id (db-pu/get-built-in-property-uuid :icon)]
+                                                        (db-property-handler/update-property!
+                                                         repo
+                                                         (:block/uuid page)
+                                                         {:properties {icon-property-id icon}})))})
+            icon)])
+       [:div.flex.flex-1.flex-row.flex-wrap.items-center.gap-4
+        [:h1.page-title.flex-1.cursor-pointer.gap-1
+         {:class (when-not whiteboard-page? "title")
+          :on-mouse-down (fn [e]
+                           (when (util/right-click? e)
+                             (state/set-state! :page-title/context {:page page-name})))
+          :on-click (fn [e]
+                      (when-not (= (.-nodeName (.-target e)) "INPUT")
+                        (.preventDefault e)
+                        (if (gobj/get e "shiftKey")
+                          (when-let [page (db/pull repo '[*] [:block/name page-name])]
+                            (state/sidebar-add-block!
+                             repo
+                             (:db/id page)
+                             :page))
+                          (when (and (not hls-page?)
+                                     (not fmt-journal?)
+                                     (not config/publishing?)
+                                     (not (and (contains? (:block/type page) "property")
+                                               (contains? db-property/built-in-properties-keys-str page-name))))
+                            (reset! *input-value (if untitled? "" old-name))
+                            (reset! *edit? true)))))}
+
+         (if @*edit?
+           (page-title-editor page {:*title-value *title-value
+                                    :*edit? *edit?
+                                    :*input-value *input-value
+                                    :page-name page-name
+                                    :old-name old-name
+                                    :untitled? untitled?
+                                    :whiteboard-page? whiteboard-page?
+                                    :preview? preview?})
+           [:span.title.block
+            {:on-click (fn []
+                         (when (and (state/home?) (not preview?))
+                           (route-handler/redirect-to-page! page-name)))
+             :data-value @*input-value
+             :data-ref   page-name
+             :style      {:opacity (when @*edit? 0)}}
+            (let [nested? (and (string/includes? title page-ref/left-brackets)
+                               (string/includes? title page-ref/right-brackets))]
+              (cond untitled? [:span.opacity-50 (t :untitled)]
+                    nested? (component-block/map-inline {} (gp-mldoc/inline->edn title (mldoc/get-default-config
+                                                                                        (:block/format page))))
+                    :else title))])]
+        (when (and db-based? (seq (:block/tags page)))
+          [:div.page-tags.ml-4
+           (pv/property-value page tags-property (map :block/uuid (:block/tags page))
+                              {:page-cp (fn [config page]
+                                          (component-block/page-cp (assoc config :tag? true) page))})])]
+
+       (when (and db-based? (not whiteboard-page?))
+         [:div.absolute.bottom-2.left-0
+          [:div.page-add-tags.flex.flex-row.items-center.flex-wrap.gap-2.ml-2
+           (when (and (empty? (:block/tags page)) @*hover? (not config/publishing?))
+             (db-page/page-tags page tags-property *hover? *configuring?))
+
+           (when (or (some #(contains? #{"class" "property"} %) (:block/type page))
+                     (not (db-property-handler/block-has-viewable-properties? page)))
+             (db-page/page-configure page *hover? *configuring?))]])])))
 
 (defn- page-mouse-over
   [e *control-show? *all-collapsed?]

+ 19 - 17
src/main/frontend/components/property/closed_value.cljs

@@ -15,9 +15,10 @@
             [frontend.db :as db]
             [frontend.state :as state]
             [frontend.handler.property.util :as pu]
-            [frontend.db.model :as model]))
+            [frontend.db.model :as model]
+            [promesa.core :as p]))
 
-(defn- upsert-closed-value!
+(defn- <upsert-closed-value!
   "Create new closed value and returns its block UUID."
   [property item]
   (let [{:keys [block-id tx-data]} (db-property-handler/upsert-closed-value property item)]
@@ -56,12 +57,13 @@
         save-handler (fn [e]
                        (util/stop e)
                        (when-not (string/blank? @*value)
-                         (when on-save
-                           (let [value (if (string? @*value)
-                                         (string/trim @*value)
-                                         @*value)]
-                             (on-save value @*icon @*description)))
-                         (when toggle-fn (toggle-fn))))
+                         (p/do!
+                          (when on-save
+                            (let [value (if (string? @*value)
+                                          (string/trim @*value)
+                                          @*value)]
+                              (on-save value @*icon @*description)))
+                          (when toggle-fn (toggle-fn)))))
         property-type (get-in property [:block/schema :type])]
     [:div.flex.flex-col.gap-4.p-4.whitespace-nowrap.w-96
      {:on-key-down (fn [e]
@@ -77,10 +79,10 @@
                                    {:on-chosen (fn [_e icon]
                                                  (reset! *icon icon))})
        (when (rum/react *icon)
-        [:a.fade-link.flex {:on-click (fn [_e]
-                                        (reset! *icon nil))
-                            :title "Delete this icon"}
-        (ui/icon "X")])]]
+         [:a.fade-link.flex {:on-click (fn [_e]
+                                         (reset! *icon nil))
+                             :title "Delete this icon"}
+          (ui/icon "X")])]]
      ;; Disable description for types that can't edit them
      (when-not (#{:page :date} property-type)
        [:div.grid.grid-cols-5.gap-1.items-start.leading-8
@@ -141,7 +143,7 @@
           block
           (assoc opts :on-save
                  (fn [value icon description]
-                   (upsert-closed-value! property {:id uuid
+                   (<upsert-closed-value! property {:id uuid
                                                    :value value
                                                    :description description
                                                    :icon icon}))))))
@@ -196,7 +198,7 @@
                                        :dropdown? false
                                        :close-modal? false
                                        :on-chosen (fn [chosen]
-                                                    (let [closed-value (upsert-closed-value! property {:value chosen})]
+                                                    (p/let [closed-value (<upsert-closed-value! property {:value chosen})]
                                                       (swap! *property-schema update :values (fnil conj []) closed-value)))})
           (let [values (->> (model/get-block-property-values (:block/uuid property))
                             (map second)
@@ -211,8 +213,8 @@
                nil
                (assoc opts :on-save
                       (fn [value icon description]
-                        (let [closed-value (upsert-closed-value! property {:value value
-                                                                           :description description
-                                                                           :icon icon})]
+                        (p/let [closed-value (<upsert-closed-value! property {:value value
+                                                                              :description description
+                                                                              :icon icon})]
                           (swap! *property-schema update :values (fnil conj []) closed-value)))))))))
       dropdown-opts)]))

+ 1 - 1
src/main/frontend/components/whiteboard.cljs

@@ -185,7 +185,7 @@
    {:on-click
     (fn [e]
       (util/stop e)
-      (whiteboard-handler/create-new-whiteboard-and-redirect!))}
+      (whiteboard-handler/<create-new-whiteboard-and-redirect!))}
    (ui/icon "plus")
    [:span.dashboard-create-card-caption.select-none
     (t :whiteboard/dashboard-card-new-whiteboard)]])

+ 2 - 1
src/main/frontend/db/model.cljs

@@ -601,7 +601,8 @@ independent of format as format specific heading characters are stripped"
 
 (defn get-page
   [page-name]
-  (if-let [id (parse-uuid page-name)]
+  (if-let [id (if (uuid? page-name) page-name
+                  (parse-uuid page-name))]
     (db-utils/entity [:block/uuid id])
     (db-utils/entity [:block/name (util/page-name-sanity-lc page-name)])))
 

+ 5 - 4
src/main/frontend/extensions/tldraw.cljs

@@ -101,7 +101,7 @@
    :search search-handler
    :queryBlockByUUID (fn [block-uuid]
                        (clj->js
-                        (model/query-block-by-uuid (parse-uuid block-uuid))))
+                        (model/query-block-by-uuid block-uuid)))
    :getBlockPageName #(let [block-id-str %]
                         (if (util/uuid-string? block-id-str)
                           (:block/name (model/get-block-page (state/get-current-repo) (parse-uuid block-id-str)))
@@ -117,9 +117,10 @@
    :getRedirectPageName (fn [page-name-or-uuid] (model/get-redirect-page-name page-name-or-uuid))
    :insertFirstPageBlock (fn [page-name] (editor-handler/insert-first-page-block-if-not-exists! page-name {:redirect? false}))
    :addNewWhiteboard (fn [page-name]
-                       (whiteboard-handler/create-new-whiteboard-page! page-name))
+                       (whiteboard-handler/<create-new-whiteboard-page! page-name))
    :addNewBlock (fn [content]
-                  (str (whiteboard-handler/add-new-block! current-whiteboard-name content)))
+                  (p/let [new-block-id (whiteboard-handler/<add-new-block! current-whiteboard-name content)]
+                    (str new-block-id)))
    :sidebarAddBlock (fn [uuid type]
                       (state/sidebar-add-block! (state/get-current-repo)
                                                 (:db/id (model/get-page uuid))
@@ -171,7 +172,7 @@
                 :onPersist (fn [app info]
                              (state/set-state! [:whiteboard/last-persisted-at (state/get-current-repo)] (util/time-ms))
                              (util/profile "tldraw persist"
-                                           (whiteboard-handler/transact-tldr-delta! page-name app (.-replace info))))
+                                           (whiteboard-handler/<transact-tldr-delta! page-name app (.-replace info))))
                 :model data})])))
 
 (rum/defc tldraw-app

+ 35 - 36
src/main/frontend/handler/whiteboard.cljs

@@ -4,7 +4,6 @@
             [dommy.core :as dom]
             [frontend.db :as db]
             [frontend.db.model :as model]
-            [frontend.db.utils :as db-utils]
             [frontend.handler.editor :as editor-handler]
             [frontend.handler.route :as route-handler]
             [frontend.handler.property.util :as pu]
@@ -122,7 +121,8 @@
                        :prev-changed-blocks prev-changed-blocks}}}))
 
 (defonce *last-shapes-nonce (atom {}))
-(defn transact-tldr-delta! [page-name ^js app replace?]
+(defn <transact-tldr-delta!
+  [page-name ^js app replace?]
   (let [tl-page ^js (second (first (.-pages app)))
         shapes (.-shapes ^js tl-page)
         page-block (model/get-page page-name)
@@ -173,7 +173,7 @@
             tx-data' (concat (:tx-data pending-tx-data) tx-data)
             metadata'' (merge metadata' (:metadata pending-tx-data))]
         (state/set-state! :whiteboard/pending-tx-data {})
-        (db-utils/transact! repo tx-data' metadata'')))))
+        (db/transact! repo tx-data' metadata'')))))
 
 (defn get-default-new-whiteboard-tx
   [page-name id]
@@ -195,26 +195,27 @@
              :updated-at (util/time-ms),
              :created-at (util/time-ms)}]))
 
-;; FIXME:
-(defn create-new-whiteboard-page!
+(defn <create-new-whiteboard-page!
   ([]
-   (create-new-whiteboard-page! nil))
+   (<create-new-whiteboard-page! nil))
   ([name]
-   (let [uuid (or (and name (parse-uuid name)) (d/squuid))
-         name (or name (str uuid))
-         repo (state/get-current-repo)]
-     (db/transact! (get-default-new-whiteboard-tx name uuid))
+   (p/let [uuid (or (and name (parse-uuid name)) (d/squuid))
+           name (or name (str uuid))
+           repo (state/get-current-repo)
+           _ (db/transact! (get-default-new-whiteboard-tx name uuid))]
+     ;; TODO: check to remove this
      (state/update-state! [repo :unloaded-pages] (fn [pages] (conj (set pages)
                                                                    (util/page-name-sanity-lc name))))
      name)))
 
-(defn create-new-whiteboard-and-redirect!
+(defn <create-new-whiteboard-and-redirect!
   ([]
-   (create-new-whiteboard-and-redirect! (str (d/squuid))))
+   (<create-new-whiteboard-and-redirect! (str (d/squuid))))
   ([name]
    (when-not config/publishing?
-     (create-new-whiteboard-page! name)
-     (route-handler/redirect-to-whiteboard! name {:new-whiteboard? true}))))
+     (p/do!
+       (<create-new-whiteboard-page! name)
+       (route-handler/redirect-to-whiteboard! name {:new-whiteboard? true})))))
 
 (defn ->logseq-portal-shape
   [block-id point]
@@ -244,14 +245,11 @@
         (.createNewLineBinding api source-shape (:id shape))))))
 
 (defn page-name->tldr!
-  ([page-name]
-   (let [page (if (model/page-exists? page-name)
-                (model/get-page page-name)
-                (let [name (create-new-whiteboard-page! page-name)]
-                  (model/get-page name)))
-         react-page (db/sub-block (:db/id page))
-         blocks (:block/_page react-page)]
-     (whiteboard-clj->tldr react-page blocks))))
+  [page-name]
+  (let [page (model/get-page page-name)
+        react-page (db/sub-block (:db/id page))
+        blocks (:block/_page react-page)]
+    (whiteboard-clj->tldr react-page blocks)))
 
 (defn- get-whiteboard-blocks
   "Given a page, return all the logseq blocks (exclude all shapes)"
@@ -272,21 +270,22 @@
         blocks-with-no-next (remove #(root-block-left-ids (:db/id %)) root-blocks)]
     (when (seq blocks-with-no-next) (first blocks-with-no-next))))
 
-(defn add-new-block!
+(defn <add-new-block!
   [page-name content]
-  (let [uuid (d/squuid)
-        page-entity (model/get-page page-name)
-        last-root-block (or (get-last-root-block page-name) page-entity)
-        tx (sqlite-util/block-with-timestamps
-            {:block/left (select-keys last-root-block [:db/id])
-             :block/uuid uuid
-             :block/content (or content "")
-             :block/format :markdown
-             :block/page {:block/name (util/page-name-sanity-lc page-name)
-                          :block/original-name page-name}
-             :block/parent {:block/name page-name}})]
-    (db-utils/transact! [tx])
-    uuid))
+  (p/let [repo (state/get-current-repo)
+          new-block-id (db/new-block-id)
+          page-entity (model/get-page page-name)
+          last-root-block (or (get-last-root-block page-name) page-entity)
+          tx (sqlite-util/block-with-timestamps
+              {:block/left (select-keys last-root-block [:db/id])
+               :block/uuid new-block-id
+               :block/content (or content "")
+               :block/format :markdown
+               :block/page {:block/name (util/page-name-sanity-lc page-name)
+                            :block/original-name page-name}
+               :block/parent {:block/name page-name}})
+          _ (db/transact! repo [tx] {:whiteboard/transact? true})]
+    new-block-id))
 
 (defn inside-portal?
   [target]

+ 1 - 1
src/main/frontend/modules/shortcut/config.cljs

@@ -216,7 +216,7 @@
                                              :fn      editor-handler/keydown-new-line-handler}
 
    :editor/new-whiteboard                   {:binding "n w"
-                                             :fn      #(whiteboard-handler/create-new-whiteboard-and-redirect!)}
+                                             :fn      #(whiteboard-handler/<create-new-whiteboard-and-redirect!)}
 
    :editor/follow-link                      {:binding "mod+o"
                                              :fn      editor-handler/follow-link-under-cursor!}

+ 4 - 4
tldraw/apps/tldraw-logseq/src/components/QuickSearch/QuickSearch.tsx

@@ -113,8 +113,8 @@ export const LogseqQuickSearch = observer(
     }, [])
 
     const handleAddBlock = React.useCallback(
-      (content: string) => {
-        const uuid = handlers?.addNewBlock(content)
+      async (content: string) => {
+        const uuid = await handlers?.addNewBlock(content)
         if (uuid) {
           finishSearching(uuid)
           onAddBlock?.(uuid)
@@ -203,8 +203,8 @@ export const LogseqQuickSearch = observer(
           },
           {
             actionIcon: 'circle-plus',
-            onChosen: () => {
-              handlers?.addNewWhiteboard(q)
+            onChosen: async () => {
+              await handlers?.addNewWhiteboard(q)
               finishSearching(q)
               return true
             },

+ 1 - 1
tldraw/apps/tldraw-logseq/src/hooks/usePaste.ts

@@ -398,7 +398,7 @@ const handleCreatingShapes = async (
     if (rawText) {
       const text = rawText.trim()
       // Create a new block that belongs to the current whiteboard
-      const uuid = handlers?.addNewBlock(text)
+      const uuid = await handlers?.addNewBlock(text)
       if (uuid) {
         // create text shape
         return [