Browse Source

enhance: paste block with text value should duplicate the value

Tienson Qin 1 year ago
parent
commit
85632cc631
2 changed files with 37 additions and 17 deletions
  1. 24 6
      deps/outliner/src/logseq/outliner/core.cljs
  2. 13 11
      src/main/frontend/handler/editor.cljs

+ 24 - 6
deps/outliner/src/logseq/outliner/core.cljs

@@ -509,6 +509,23 @@
           orders (db-order/gen-n-keys (count blocks) start-order end-order)]
       orders)))
 
+(defn- update-property-ref-when-paste
+  [block uuids]
+  (let [id-lookup (fn [v] (and (vector? v) (= :block/uuid (first v))))
+        resolve-id (fn [v] [:block/uuid (get uuids (last v) (last v))])]
+    (reduce-kv
+     (fn [r k v]
+       (let [v' (cond
+                  (id-lookup v)
+                  (resolve-id v)
+                  (and (coll? v) (every? id-lookup v))
+                  (map resolve-id v)
+                  :else
+                  v)]
+         (assoc r k v')))
+     {}
+     block)))
+
 (defn- insert-blocks-aux
   [blocks target-block {:keys [sibling? replace-empty-target? keep-uuid? keep-block-order? outliner-op]}]
   (let [block-uuids (map :block/uuid blocks)
@@ -550,12 +567,13 @@
                               :block/uuid uuid'
                               :block/page target-page
                               :block/parent parent
-                              :block/order order}]
-                       (->
-                        (if (de/entity? block)
-                          (assoc m :block/level (:block/level block))
-                          (merge block m))
-                        (dissoc :db/id)))))
+                              :block/order order}
+                           result (->
+                                   (if (de/entity? block)
+                                     (assoc m :block/level (:block/level block))
+                                     (merge block m))
+                                   (dissoc :db/id))]
+                       (update-property-ref-when-paste result uuids))))
                  blocks)))
 
 (defn- get-target-block

+ 13 - 11
src/main/frontend/handler/editor.cljs

@@ -949,17 +949,19 @@
               copied-blocks (cond->> (get-all-blocks-by-ids repo top-level-block-uuids)
                               db-based?
                               (map (fn [block]
-                                     (let [b (db/pull (:db/id block))]
-                                       (->> (map (fn [[k v]]
-                                                   (let [v' (cond
-                                                              (and (map? v) (:db/id v))
-                                                              [:block/uuid (:block/uuid (db/entity (:db/id v)))]
-                                                              (and (coll? v) (every? #(and (map? %) (:db/id %)) v))
-                                                              (set (map (fn [i] [:block/uuid (:block/uuid (db/entity (:db/id i)))]) v))
-                                                              :else
-                                                              v)]
-                                                     [k v'])) b)
-                                            (into {}))))))]
+                                     (let [b (db/entity (:db/id block))]
+                                       (->
+                                        (->> (map (fn [[k v]]
+                                                    (let [v' (cond
+                                                               (and (map? v) (:db/id v))
+                                                               [:block/uuid (:block/uuid (db/entity (:db/id v)))]
+                                                               (and (coll? v) (every? #(and (map? %) (:db/id %)) v))
+                                                               (set (map (fn [i] [:block/uuid (:block/uuid (db/entity (:db/id i)))]) v))
+                                                               :else
+                                                               v)]
+                                                      [k v'])) b)
+                                             (into {}))
+                                        (assoc :db/id (:db/id b)))))))]
           (common-handler/copy-to-clipboard-without-id-property! repo (:block/format block) content (when html? html) copied-blocks))
         (state/set-block-op-type! :copy)
         (notification/show! "Copied!" :success)))))