Răsfoiți Sursa

enhance: finish making import data form undo/redoable

Add current block support and error handling.
Also update most uses of build-import to call d/transact!  once
afterwards. Previously I think we needed separate transacts because of
new properties but that is no longer the case
Gabriel Horner 4 zile în urmă
părinte
comite
487cbb2bc9

+ 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

+ 13 - 16
deps/outliner/src/logseq/outliner/op.cljs

@@ -1,14 +1,14 @@
 (ns logseq.outliner.op
   "Transact outliner ops"
-  (:require [clojure.string :as string]
+  (:require [cljs.pprint :as pprint]
+            [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]
-            [malli.core :as m]
-            [logseq.db.sqlite.export :as sqlite-export]
-            [promesa.core :as p]))
+            [malli.core :as m]))
 
 (def ^:private ^:large-vars/data-var op-schema
   [:multi {:dispatch first}
@@ -153,19 +153,16 @@
   (reset! *op-handlers handlers))
 
 (defn- import-edn-data
-  [conn export-map import-options]
-  (let [{:keys [init-tx block-props-tx misc-tx] :as _txs} (sqlite-export/build-import export-map @conn import-options)]
-    (cljs.pprint/pprint _txs)
+  [conn *result export-map import-options]
+  (let [{:keys [init-tx block-props-tx misc-tx] :as txs}
+        (try (sqlite-export/build-import export-map @conn import-options)
+             (catch :default e
+               (js/console.error "Import EDN error: " e)
+               (reset! *result {:error "An unexpected error occurred building the import. See the javascript console for details."})))]
+    (pprint/pprint txs)
     (let [tx-meta {::sqlite-export/imported-data? true
                    :import-db? true}]
-      (ldb/transact! conn init-tx tx-meta)
-      ;; TODO: Add other ldb/transact!
-      #_(p/do
-          (ldb/transact! conn init-tx tx-meta)
-          (when (seq block-props-tx)
-            (ldb/transact! conn block-props-tx tx-meta))
-          (when (seq misc-tx)
-            (ldb/transact! conn misc-tx tx-meta))))))
+      (ldb/transact! conn (vec (concat init-tx block-props-tx misc-tx)) tx-meta))))
 
 (defn ^:large-vars/cleanup-todo apply-ops!
   [repo conn ops date-formatter opts]
@@ -257,7 +254,7 @@
          (apply outliner-property/add-existing-values-to-closed-values! conn args)
 
          :batch-import-edn
-         (apply import-edn-data conn args)
+         (apply import-edn-data conn *result args)
 
          :transact
          (apply ldb/transact! conn args)

+ 23 - 33
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]
@@ -111,38 +110,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)
-      (p/do!
-       ;; TODO: Error handling?
-       (ui-outliner-tx/transact!
-        {:outliner-op :batch-import-edn}
-        (outliner-op/batch-import-edn! export-map (when block {:current-block block})))
-       (shui/dialog-close-all!))
-      #_(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"

+ 0 - 7
src/main/frontend/undo_redo.cljs

@@ -255,7 +255,6 @@
   [repo undo?]
   (if-let [op (not-empty ((if undo? pop-undo-op pop-redo-op) repo))]
     (let [conn (db/get-db repo false)]
-      (prn :debug :undo-op op)
       (cond
         (= ::ui-state (ffirst op))
         (do
@@ -287,7 +286,6 @@
                               {:undo? undo?
                                :editor-cursors editor-cursors
                                :block-content block-content}))]
-              (prn :debug :reversed-tx-data reversed-tx-data)
               (when (seq reversed-tx-data)
                 (if util/node-test?
                   (do
@@ -333,10 +331,6 @@
 (defn gen-undo-ops!
   [repo {:keys [tx-data tx-meta db-after db-before]}]
   (let [{:keys [outliner-op]} tx-meta]
-    #_(prn :gen-undo
-           (= (:client-id tx-meta) (:client-id @state/state))
-           outliner-op
-           tx-meta)
     (when (and
            (= (:client-id tx-meta) (:client-id @state/state))
            outliner-op
@@ -362,7 +356,6 @@
                        :retracted-ids retracted-ids}]]
                     (remove nil?)
                     vec)]
-        ;; (prn :gen-undo op)
         (push-undo-op repo op)))))
 
 (defn listen-db-changes!