Просмотр исходного кода

fix: export+import of blocks with built-in property closed values

e.g. Status. Also tweak class-parent to not needlessly emit Root
which is the default
Gabriel Horner 11 месяцев назад
Родитель
Сommit
38aff834f5

+ 9 - 4
deps/db/src/logseq/db/sqlite/export.cljs

@@ -36,7 +36,7 @@
   (->> ent-properties
        (map (fn [[k v]]
               [k
-               (if (:block/closed-value-property v)
+               (if (and (:block/closed-value-property v) (not (db-property/logseq-property? k)))
                  (if-let [closed-uuid (some #(when (= (:value %) (db-property/property-value-content v))
                                                (:uuid %))
                                             (get-in properties-config [k :build/closed-values]))]
@@ -93,7 +93,9 @@
     (:logseq.property.class/properties class-ent)
     (assoc :build/class-properties
            (mapv :db/ident (:logseq.property.class/properties class-ent)))
-    (and include-parents? (:logseq.property/parent class-ent))
+    (and include-parents?
+         (:logseq.property/parent class-ent)
+         (not= :logseq.class/Root (:db/ident (:logseq.property/parent class-ent))))
     (assoc :build/class-parent
            (:db/ident (:logseq.property/parent class-ent)))))
 
@@ -109,17 +111,20 @@
         new-class-ents (concat (remove #(db-class/logseq-class? (:db/ident %)) block-tags)
                                pvalue-class-ents)]
     (->> new-class-ents
+         ;; TODO: Export class parents when there's ability to control granularity of export
          (map #(vector (:db/ident %) (build-export-class % {:include-parents? false})))
          (into {}))))
 
 (defn- build-entity-export
-  "Given entity id and optional existing properties, build an EDN export map"
+  "Given entity and optional existing properties, build an EDN export map"
   [db entity {:keys [properties include-uuid?]}]
   (let [ent-properties (dissoc (db-property/properties entity) :block/tags)
-        new-user-property-ids (->> (remove db-property/logseq-property? (keys ent-properties))
+        new-user-property-ids (->> (keys ent-properties)
                                    (concat (->> (:block/tags entity)
                                                 (mapcat :logseq.property.class/properties)
                                                 (map :db/ident)))
+                                   ;; Built-in properties and any possible modifications are not exported
+                                   (remove db-property/logseq-property?)
                                    (remove #(get properties %)))
         new-properties (build-export-properties db new-user-property-ids {})
         build-block (cond-> (select-keys entity

+ 6 - 2
deps/db/test/logseq/db/sqlite/export_test.cljs

@@ -103,6 +103,8 @@
                (db-test/readable-properties import-block))
             "imported block properties equals exported one")))))
 
+;; Tests a variety of blocks including block children with new properties, blocks with new classes
+;; and blocks with built-in properties
 (deftest import-page-in-different-graph
   (let [original-data
         {:properties {:user.property/default {:logseq.property/type :default
@@ -127,7 +129,10 @@
                                         {:block/title "b1ab"}]}
                                       {:block/title "b1b"}]}
                     {:block/title "b2"
-                     :build/tags [:user.class/MyClass]}]}]}
+                     :build/tags [:user.class/MyClass]}
+                    {:block/title "some task"
+                     :build/properties {:logseq.task/status :logseq.task/status.doing}
+                     :build/tags [:logseq.class/Task]}]}]}
         conn (db-test/create-conn-with-blocks original-data)
         page (db-test/find-page-by-title @conn "page1")
         conn2 (db-test/create-conn)
@@ -233,7 +238,6 @@
                                :build/property-classes [:user.class/MyClass]}}
          :classes
          {:user.class/MyClass {:block/title "MyClass"
-                               :build/class-parent :logseq.class/Root
                                :build/properties {:user.property/url "https://example.com/MyClass"}}
           :user.class/MyClass2 {:block/title "MyClass2"
                                 :build/class-parent :user.class/MyClass

+ 5 - 9
src/main/frontend/handler/common/developer.cljs

@@ -67,14 +67,6 @@
      :success
      false)))
 
-(defn- export-entity-data
-  [eid]
-  (let [result (sqlite-export/build-block-export (db/get-db) eid)
-        pull-data (with-out-str (pprint/pprint result))]
-    (.writeText js/navigator.clipboard pull-data)
-    (println pull-data)
-    (notification/show! "Copied block's data!" :success)))
-
 (defn- import-submit [import-inputs _e]
   (let [export-map (try (edn/read-string (:import-data @import-inputs)) (catch :default _err ::invalid-import))
         import-block? (:build/block export-map)
@@ -137,7 +129,11 @@
 (defn ^:export export-block-data []
   ;; Use editor state to locate most recent block
   (if-let [block-uuid (:block-id (first (state/get-editor-args)))]
-    (export-entity-data [:block/uuid block-uuid])
+    (let [result (sqlite-export/build-block-export (db/get-db) [:block/uuid block-uuid])
+          pull-data (with-out-str (pprint/pprint result))]
+      (.writeText js/navigator.clipboard pull-data)
+      (println pull-data)
+      (notification/show! "Copied block's data!" :success))
     (notification/show! "No block found" :warning)))
 
 (defn ^:export export-page-data []