浏览代码

Merge branch 'master' into feat/new-auth-ui

charlie 3 天之前
父节点
当前提交
e904c5c5d7

+ 7 - 15
deps/db/test/logseq/db/sqlite/export_test.cljs

@@ -34,8 +34,7 @@
                                                       :block-id [:block/uuid (:block/uuid export-block)]})
             (sqlite-export/build-import @import-conn {:current-block import-block}))
         ;; _ (cljs.pprint/pprint _txs)
-        _ (d/transact! import-conn init-tx)
-        _ (d/transact! import-conn block-props-tx)]
+        _ (d/transact! import-conn (concat init-tx block-props-tx))]
     (validate-db @import-conn)
     (sqlite-export/build-export @import-conn {:export-type :block
                                               :block-id (:db/id import-block)})))
@@ -50,8 +49,7 @@
             ;; ((fn [x] (cljs.pprint/pprint {:export x}) x))
             (sqlite-export/build-import @import-conn {}))
         ;; _ (cljs.pprint/pprint _txs)
-        _ (d/transact! import-conn init-tx)
-        _ (d/transact! import-conn block-props-tx)
+        _ (d/transact! import-conn (concat init-tx block-props-tx))
         _ (validate-db @import-conn)
         page2 (db-test/find-page-by-title @import-conn page-title)]
     (sqlite-export/build-export @import-conn {:export-type :page :page-id (:db/id page2)})))
@@ -85,9 +83,7 @@
         (-> (sqlite-export/build-export @export-conn {:export-type :graph :graph-options export-options})
             (sqlite-export/build-import @import-conn {}))
         ;; _ (cljs.pprint/pprint _txs)
-        _ (d/transact! import-conn init-tx)
-        _ (d/transact! import-conn block-props-tx)
-        _ (d/transact! import-conn misc-tx)
+        _ (d/transact! import-conn (concat init-tx block-props-tx misc-tx))
         _ (validate-db @import-conn)
         imported-graph (sqlite-export/build-export @import-conn {:export-type :graph :graph-options export-options})]
     imported-graph))
@@ -497,8 +493,7 @@
         (-> (sqlite-export/build-export @conn {:export-type :graph-ontology})
             (sqlite-export/build-import @conn2 {}))
         ;; _ (cljs.pprint/pprint _txs)
-        _ (d/transact! conn2 init-tx)
-        _ (d/transact! conn2 block-props-tx)
+        _ (d/transact! conn2 (concat init-tx block-props-tx))
         _ (validate-db @conn2)
         imported-ontology (sqlite-export/build-export @conn2 {:export-type :graph-ontology})]
 
@@ -530,8 +525,7 @@
         (-> (sqlite-export/build-export @conn {:export-type :view-nodes :rows (get-node-ids @conn)})
             (sqlite-export/build-import @conn2 {}))
         ;; _ (cljs.pprint/pprint _txs)
-        _ (d/transact! conn2 init-tx)
-        _ (d/transact! conn2 block-props-tx)
+        _ (d/transact! conn2 (concat init-tx block-props-tx))
         _ (validate-db @conn2)
         imported-nodes (sqlite-export/build-export @conn2 {:export-type :view-nodes
                                                            :rows (get-node-ids @conn2)})]
@@ -566,8 +560,7 @@
         (-> (sqlite-export/build-export @conn {:export-type :selected-nodes :node-ids (get-node-ids @conn)})
             (sqlite-export/build-import @conn2 {}))
         ;; _ (cljs.pprint/pprint _txs)
-        _ (d/transact! conn2 init-tx)
-        _ (d/transact! conn2 block-props-tx)
+        _ (d/transact! conn2 (concat init-tx block-props-tx))
         _ (validate-db @conn2)
         imported-nodes (sqlite-export/build-export @conn2 {:export-type :selected-nodes :node-ids (get-node-ids @conn2)})]
 
@@ -832,8 +825,7 @@
         {:keys [init-tx block-props-tx] :as _txs}
         (sqlite-export/build-import import-data @conn {})
         ;; _ (cljs.pprint/pprint _txs)
-        _ (d/transact! conn init-tx)
-        _ (d/transact! conn block-props-tx)
+        _ (d/transact! conn (concat init-tx block-props-tx))
         _ (validate-db @conn)
         expected-pages-and-blocks
         [{:block/uuid page-uuid

+ 23 - 0
deps/outliner/src/logseq/outliner/op.cljs

@@ -3,6 +3,7 @@
   (:require [clojure.string :as string]
             [datascript.core :as d]
             [logseq.db :as ldb]
+            [logseq.db.sqlite.export :as sqlite-export]
             [logseq.outliner.core :as outliner-core]
             [logseq.outliner.property :as outliner-property]
             [logseq.outliner.transaction :as outliner-tx]
@@ -94,6 +95,11 @@
      [:op :keyword]
      [:args [:tuple ::property-id ::values]]]]
 
+   [:batch-import-edn
+    [:catn
+     [:op :keyword]
+     [:args [:tuple ::import-edn ::option]]]]
+
    ;; transact
    [:transact
     [:catn
@@ -128,6 +134,7 @@
                        ::value :any
                        ::values [:sequential ::value]
                        ::option [:maybe map?]
+                       ::import-edn map?
                        ::blocks [:sequential ::block]
                        ::ids [:sequential ::id]
                        ::uuid uuid?
@@ -144,6 +151,19 @@
   [handlers]
   (reset! *op-handlers handlers))
 
+(defn- import-edn-data
+  [conn *result export-map {:keys [tx-meta] :as import-options}]
+  (let [{:keys [init-tx block-props-tx misc-tx error] :as _txs}
+        (try (sqlite-export/build-import export-map @conn (dissoc import-options :tx-meta))
+             (catch :default e
+               (js/console.error "Import EDN error: " e)
+               {:error "An unexpected error occurred building the import. See the javascript console for details."}))]
+    ;; (cljs.pprint/pprint _txs)
+    (if error
+      (reset! *result {:error error})
+      (ldb/transact! conn (vec (concat init-tx block-props-tx misc-tx))
+                     (merge {::sqlite-export/imported-data? true} tx-meta)))))
+
 (defn ^:large-vars/cleanup-todo apply-ops!
   [repo conn ops date-formatter opts]
   (assert (ops-validator ops) ops)
@@ -233,6 +253,9 @@
          :add-existing-values-to-closed-values
          (apply outliner-property/add-existing-values-to-closed-values! conn args)
 
+         :batch-import-edn
+         (apply import-edn-data conn *result args)
+
          :transact
          (apply ldb/transact! conn args)
 

+ 39 - 58
src/main/frontend/handler/db_based/import.cljs

@@ -1,7 +1,6 @@
 (ns frontend.handler.db-based.import
   "Handles DB graph imports"
-  (:require [cljs.pprint :as pprint]
-            [clojure.edn :as edn]
+  (:require [clojure.edn :as edn]
             [datascript.core :as d]
             [frontend.config :as config]
             [frontend.db :as db]
@@ -15,7 +14,9 @@
             [logseq.db.sqlite.export :as sqlite-export]
             [logseq.db.sqlite.util :as sqlite-util]
             [logseq.shui.ui :as shui]
-            [promesa.core :as p]))
+            [promesa.core :as p]
+            [frontend.modules.outliner.ui :as ui-outliner-tx]
+            [frontend.modules.outliner.op :as outliner-op]))
 
 (defn import-from-sqlite-db!
   [buffer bare-graph-name finished-ok-handler]
@@ -50,29 +51,6 @@
      (state/set-current-repo! graph)
      (finished-ok-handler))))
 
-(defn- safe-build-edn-import [export-map import-options]
-  (try
-    (sqlite-export/build-import export-map (db/get-db) import-options)
-    (catch :default e
-      (js/console.error "Import EDN error: " e)
-      {:error "An unexpected error occurred building the import. See the javascript console for details."})))
-
-(defn- import-edn-data-from-file
-  [export-map]
-  (let [{:keys [init-tx block-props-tx misc-tx error] :as _txs} (safe-build-edn-import export-map {})]
-    ;; (cljs.pprint/pprint _txs)
-    (if error
-      (notification/show! error :error)
-      (let [tx-meta {::sqlite-export/imported-data? true
-                     :import-db? true}
-            repo (state/get-current-repo)]
-        (p/do
-          (db/transact! repo init-tx tx-meta)
-          (when (seq block-props-tx)
-            (db/transact! repo block-props-tx tx-meta))
-          (when (seq misc-tx)
-            (db/transact! repo misc-tx tx-meta)))))))
-
 (defn import-from-edn-file!
   "Creates a new DB graph and imports sqlite.build EDN file"
   [bare-graph-name file-body finished-ok-handler]
@@ -90,13 +68,19 @@
                      (finished-error-handler)
                      nil))]
     (when (some? edn-data)
-      (-> (p/do!
-           (persist-db/<new graph {:import-type :edn})
-           (state/add-repo! {:url graph})
-           (repo-handler/restore-and-setup-repo! graph {:import-type :edn})
-           (state/set-current-repo! graph)
-           (import-edn-data-from-file edn-data)
-           (finished-ok-handler))
+      (-> (p/let
+           [_ (persist-db/<new graph {:import-type :edn})
+            _ (state/add-repo! {:url graph})
+            _ (repo-handler/restore-and-setup-repo! graph {:import-type :edn})
+            _ (state/set-current-repo! graph)
+            {:keys [error]} (ui-outliner-tx/transact!
+                             {:outliner-op :batch-import-edn}
+                             (outliner-op/batch-import-edn! edn-data {:tx-meta {:import-db? true}}))]
+            (if error
+              (do
+                (notification/show! error :error)
+                (finished-error-handler))
+              (finished-ok-handler)))
           (p/catch
            (fn [e]
              (js/console.error e)
@@ -109,32 +93,29 @@
         import-block? (::sqlite-export/block export-map)
         block (when import-block?
                 (if-let [eid (:block-id (first (state/get-editor-args)))]
-                  (db/entity [:block/uuid eid])
+                  (let [ent (db/entity [:block/uuid eid])]
+                    (if-not (:block/page ent)
+                      {:error "Can't import block into a non-block entity. Please import block elsewhere."}
+                      (merge (select-keys ent [:block/uuid])
+                             {:block/page (select-keys (:block/page ent) [:block/uuid])})))
                   (notification/show! "No block found" :warning)))]
-    (if (= ::invalid-import export-map)
-      (notification/show! "The submitted EDN data is invalid! Please fix and try again." :warning)
-      (let [{:keys [init-tx block-props-tx misc-tx error] :as txs}
-            (safe-build-edn-import export-map (when block {:current-block block}))]
-        (pprint/pprint txs)
-        (if error
-          (notification/show! error :error)
-          ;; TODO: When not import-block, use metadata that supports undo
-          (let [tx-meta (if import-block? {:outliner-op :save-block} {::sqlite-export/imported-data? true})
-                repo (state/get-current-repo)]
-            (-> (p/do
-                  (db/transact! repo init-tx tx-meta)
-                  (when (seq block-props-tx)
-                    (db/transact! repo block-props-tx tx-meta))
-                  (when (seq misc-tx)
-                    (db/transact! repo misc-tx tx-meta))
-                  (when-not import-block?
-                    (ui-handler/re-render-root!)
-                    (notification/show! "Import successful!" :success)))
-                (p/catch (fn [e]
-                           (js/console.error "Import EDN error: " e)
-                           (notification/show! "An unexpected error occurred during import. See the javascript console for details." :error))))))
-        ;; Also close cmd-k
-        (shui/dialog-close-all!)))))
+    (cond (or (= ::invalid-import export-map) (not (map? export-map)))
+          (notification/show! "The submitted EDN data is invalid! Please fix and try again." :warning)
+          (:error block)
+          (do
+            (notification/show! (:error block) :error)
+            (shui/dialog-close-all!))
+          :else
+          (p/let [{:keys [error]}
+                  (ui-outliner-tx/transact!
+                   {:outliner-op :batch-import-edn}
+                   (outliner-op/batch-import-edn! export-map (when block {:current-block block})))]
+            ;; Also close cmd-k
+            (shui/dialog-close-all!)
+            (ui-handler/re-render-root!)
+            (if error
+              (notification/show! error :error)
+              (notification/show! "Import successful!" :success))))))
 
 (defn ^:export import-edn-data-dialog
   "Displays dialog which allows users to paste and import sqlite.build EDN Data"

+ 5 - 0
src/main/frontend/modules/outliner/op.cljs

@@ -118,6 +118,11 @@
   (op-transact!
    [:add-existing-values-to-closed-values [property-id values]]))
 
+(defn batch-import-edn!
+  [import-edn options]
+  (op-transact!
+   [:batch-import-edn [import-edn options]]))
+
 (defn transact!
   [tx-data tx-meta]
   (op-transact!

+ 2 - 1
src/main/frontend/worker/pipeline.cljs

@@ -501,7 +501,8 @@
         (or from-disk? new-graph?)
         {:tx-report tx-report}
 
-        (or (::gp-exporter/new-graph? tx-meta) (::sqlite-export/imported-data? tx-meta))
+        (or (::gp-exporter/new-graph? tx-meta)
+            (and (::sqlite-export/imported-data? tx-meta) (:import-db? tx-meta)))
         (invoke-hooks-for-imported-graph conn tx-report)
 
         :else