mirror of https://github.com/logseq/logseq
Allow outliner transaction to be used for both UI and worker
parent
7f21ff7193
commit
31c3b7a3af
|
@ -7,7 +7,7 @@
|
|||
[frontend.db.model :as db-model]
|
||||
[frontend.mobile.haptics :as haptics]
|
||||
[frontend.modules.outliner.core :as outliner-core]
|
||||
[frontend.modules.outliner.transaction :as outliner-tx]
|
||||
[frontend.modules.outliner.ui :as ui-outliner-tx]
|
||||
[frontend.state :as state]
|
||||
[frontend.util :as util]
|
||||
[goog.dom :as gdom]
|
||||
|
@ -59,7 +59,7 @@
|
|||
|
||||
(defn indent-outdent-block!
|
||||
[block direction]
|
||||
(outliner-tx/transact!
|
||||
(ui-outliner-tx/transact!
|
||||
{:outliner-op :move-blocks}
|
||||
(outliner-core/indent-outdent-blocks! [block] (= direction :right))))
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
[frontend.handler.property.util :as pu]
|
||||
[frontend.handler.repo-config :as repo-config-handler]
|
||||
[frontend.modules.outliner.core :as outliner-core]
|
||||
[frontend.modules.outliner.transaction :as outliner-tx]
|
||||
[frontend.modules.outliner.ui :as ui-outliner-tx]
|
||||
[frontend.schema.handler.repo-config :as repo-config-schema]
|
||||
[promesa.core :as p]
|
||||
[logseq.db.frontend.content :as db-content]))
|
||||
|
@ -150,7 +150,7 @@
|
|||
|
||||
(defn batch-set-heading!
|
||||
[repo block-ids heading]
|
||||
(outliner-tx/transact!
|
||||
(ui-outliner-tx/transact!
|
||||
{:outliner-op :save-block}
|
||||
(doseq [block-tx (keep #(set-heading-aux! % heading) block-ids)]
|
||||
(outliner-core/save-block! block-tx))
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
[frontend.handler.property :as property-handler]
|
||||
[frontend.modules.outliner.core :as outliner-core]
|
||||
[logseq.outliner.tree :as otree]
|
||||
[frontend.modules.outliner.transaction :as outliner-tx]
|
||||
[frontend.modules.outliner.ui :as ui-outliner-tx]
|
||||
[logseq.graph-parser.util.block-ref :as block-ref]
|
||||
[frontend.state :as state]
|
||||
[frontend.db :as db]))
|
||||
|
@ -40,7 +40,7 @@
|
|||
|
||||
(every? map? (conj blocks' target-block))
|
||||
(let [target-node (outliner-core/block target-block)]
|
||||
(outliner-tx/transact!
|
||||
(ui-outliner-tx/transact!
|
||||
{:outliner-op :move-blocks}
|
||||
(editor-handler/save-current-block!)
|
||||
(if top?
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
[frontend.handler.file-based.editor :as file-editor-handler]
|
||||
[frontend.mobile.util :as mobile-util]
|
||||
[frontend.modules.outliner.core :as outliner-core]
|
||||
[frontend.modules.outliner.transaction :as outliner-tx]
|
||||
[frontend.modules.outliner.ui :as ui-outliner-tx]
|
||||
[frontend.modules.outliner.tree :as tree]
|
||||
[logseq.outliner.tree :as otree]
|
||||
[frontend.search :as search]
|
||||
|
@ -266,7 +266,7 @@
|
|||
(let [original-block (db/entity (:db/id block))
|
||||
original-props (:block/properties original-block)
|
||||
{:keys [tx-data]}
|
||||
(outliner-tx/transact!
|
||||
(ui-outliner-tx/transact!
|
||||
opts'
|
||||
(outliner-core/save-block! block')
|
||||
;; page properties changed
|
||||
|
@ -362,7 +362,7 @@
|
|||
|
||||
:else
|
||||
(not has-children?))]
|
||||
(outliner-tx/transact!
|
||||
(ui-outliner-tx/transact!
|
||||
{:outliner-op :insert-blocks}
|
||||
(save-current-block! {:current-block current-block
|
||||
:insert-block? true})
|
||||
|
@ -665,7 +665,7 @@
|
|||
(let [ids (->> (distinct (map #(when-let [id (dom/attr % "blockid")]
|
||||
(uuid id)) blocks))
|
||||
(remove nil?))]
|
||||
(outliner-tx/transact!
|
||||
(ui-outliner-tx/transact!
|
||||
{:outliner-op :cycle-todos}
|
||||
(doseq [id ids]
|
||||
(let [block (db/pull [:block/uuid id])]
|
||||
|
@ -702,7 +702,7 @@
|
|||
(let [repo (or repo (state/get-current-repo))
|
||||
block (db/pull repo '[*] [:block/uuid uuid])]
|
||||
(when block
|
||||
(outliner-tx/transact!
|
||||
(ui-outliner-tx/transact!
|
||||
{:outliner-op :delete-blocks}
|
||||
(outliner-core/delete-blocks! [block] (merge
|
||||
delete-opts
|
||||
|
@ -794,7 +794,7 @@
|
|||
(assoc :concat-data
|
||||
{:last-edit-block (:block/uuid block)}))
|
||||
db-based? (config/db-based-graph? repo)]
|
||||
(outliner-tx/transact!
|
||||
(ui-outliner-tx/transact!
|
||||
transact-opts
|
||||
(cond
|
||||
(and prev-block (:block/name prev-block)
|
||||
|
@ -863,7 +863,7 @@
|
|||
block (first blocks)
|
||||
block-parent (get uuid->dom-block (:block/uuid block))
|
||||
sibling-block (when block-parent (util/get-prev-block-non-collapsed-non-embed block-parent))]
|
||||
(outliner-tx/transact!
|
||||
(ui-outliner-tx/transact!
|
||||
{:outliner-op :delete-blocks}
|
||||
(outliner-core/delete-blocks! blocks {}))
|
||||
(when sibling-block
|
||||
|
@ -1269,7 +1269,7 @@
|
|||
(map #(block/page-name->map % true) tags)
|
||||
(map :db/id existing-tags))
|
||||
opts {:outliner-op :save-block}]
|
||||
(outliner-tx/transact!
|
||||
(ui-outliner-tx/transact!
|
||||
opts
|
||||
(outliner-core/save-block! {:db/id (:db/id block)
|
||||
:block/tags tag-pages})))))
|
||||
|
@ -1294,7 +1294,7 @@
|
|||
|
||||
(defn save-blocks!
|
||||
[blocks]
|
||||
(outliner-tx/transact!
|
||||
(ui-outliner-tx/transact!
|
||||
{:outliner-op :save-block}
|
||||
(doseq [[block value] blocks]
|
||||
(save-block-if-changed! block value))))
|
||||
|
@ -1749,7 +1749,7 @@
|
|||
(save-current-block!)
|
||||
(let [edit-block-id (:block/uuid (state/get-edit-block))
|
||||
move-nodes (fn [blocks]
|
||||
(outliner-tx/transact!
|
||||
(ui-outliner-tx/transact!
|
||||
{:outliner-op :move-blocks}
|
||||
(outliner-core/move-blocks-up-down! blocks up?))
|
||||
(when-let [block-node (util/get-first-block-by-id (:block/uuid (first blocks)))]
|
||||
|
@ -1786,7 +1786,7 @@
|
|||
[direction]
|
||||
(let [blocks (get-selected-ordered-blocks)]
|
||||
(when (seq blocks)
|
||||
(outliner-tx/transact!
|
||||
(ui-outliner-tx/transact!
|
||||
{:outliner-op :move-blocks
|
||||
:real-outliner-op :indent-outdent}
|
||||
(outliner-core/indent-outdent-blocks! blocks (= direction :right))))))
|
||||
|
@ -2076,11 +2076,11 @@
|
|||
true)]
|
||||
|
||||
(when has-unsaved-edits
|
||||
(outliner-tx/transact!
|
||||
(ui-outliner-tx/transact!
|
||||
{:outliner-op :save-block}
|
||||
(outliner-core/save-block! editing-block)))
|
||||
|
||||
(outliner-tx/transact!
|
||||
(ui-outliner-tx/transact!
|
||||
{:outliner-op :insert-blocks
|
||||
:additional-tx revert-cut-txs}
|
||||
(when target-block'
|
||||
|
@ -2194,7 +2194,7 @@
|
|||
:else
|
||||
true)]
|
||||
(try
|
||||
(outliner-tx/transact!
|
||||
(ui-outliner-tx/transact!
|
||||
{:outliner-op :insert-blocks
|
||||
:created-from-journal-template? journal?}
|
||||
(save-current-block!)
|
||||
|
@ -2262,7 +2262,7 @@
|
|||
block (:data node)]
|
||||
(save-current-block!)
|
||||
(when target
|
||||
(outliner-tx/transact!
|
||||
(ui-outliner-tx/transact!
|
||||
{:outliner-op :move-blocks
|
||||
:real-outliner-op :indent-outdent}
|
||||
(outliner-core/move-blocks! [block] target true))
|
||||
|
@ -2538,7 +2538,7 @@
|
|||
false))
|
||||
(profile
|
||||
"Insert block"
|
||||
(outliner-tx/transact!
|
||||
(ui-outliner-tx/transact!
|
||||
{:outliner-op :insert-blocks}
|
||||
(insert-new-block! state))))))))))
|
||||
|
||||
|
@ -2715,7 +2715,7 @@
|
|||
repo (state/get-current-repo)
|
||||
delete-block (if next-block-has-refs? edit-block next-block)
|
||||
keep-block (if next-block-has-refs? next-block edit-block)]
|
||||
(outliner-tx/transact!
|
||||
(ui-outliner-tx/transact!
|
||||
{:outliner-op :delete-blocks
|
||||
:concat-data {:last-edit-block (:block/uuid edit-block)
|
||||
:end? true}}
|
||||
|
@ -2860,7 +2860,7 @@
|
|||
{:keys [block]} (get-state)]
|
||||
(when block
|
||||
(state/set-editor-last-pos! pos)
|
||||
(outliner-tx/transact!
|
||||
(ui-outliner-tx/transact!
|
||||
{:outliner-op :move-blocks
|
||||
:real-outliner-op :indent-outdent}
|
||||
(outliner-core/indent-outdent-blocks! [block] indent?)))
|
||||
|
@ -3527,7 +3527,7 @@
|
|||
value (boolean value)]
|
||||
(when repo
|
||||
(save-current-block!) ;; Save the input contents before collapsing
|
||||
(outliner-tx/transact! ;; Save the new collapsed state as an undo transaction (if it changed)
|
||||
(ui-outliner-tx/transact! ;; Save the new collapsed state as an undo transaction (if it changed)
|
||||
{:outliner-op :collapse-expand-blocks}
|
||||
(doseq [block-id block-ids]
|
||||
(when-let [block (db/entity [:block/uuid block-id])]
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
(:require [clojure.string :as string]
|
||||
[frontend.db :as db]
|
||||
[frontend.modules.outliner.core :as outliner-core]
|
||||
[frontend.modules.outliner.transaction :as outliner-tx]
|
||||
[frontend.modules.outliner.ui :as ui-outliner-tx]
|
||||
[frontend.state :as state]
|
||||
[frontend.util :as util]))
|
||||
|
||||
|
@ -83,7 +83,7 @@
|
|||
:block/properties {key value}
|
||||
:block/pre-block? true}
|
||||
page-properties-tx [(assoc page-id :block/properties {key value})]]
|
||||
(outliner-tx/transact!
|
||||
(ui-outliner-tx/transact!
|
||||
{:outliner-op :insert-blocks
|
||||
:additional-tx page-properties-tx}
|
||||
(outliner-core/insert-blocks! block page {:sibling? false}))))))))
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
[frontend.handler.block :as block-handler]
|
||||
[frontend.handler.file-based.property.util :as property-util]
|
||||
[frontend.modules.outliner.core :as outliner-core]
|
||||
[frontend.modules.outliner.transaction :as outliner-tx]
|
||||
[frontend.modules.outliner.ui :as ui-outliner-tx]
|
||||
[frontend.state :as state]
|
||||
[logseq.graph-parser.util :as gp-util]))
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
|||
"col: a collection of [block-id property-key property-value]."
|
||||
[col]
|
||||
(let [col' (group-by first col)]
|
||||
(outliner-tx/transact!
|
||||
(ui-outliner-tx/transact!
|
||||
{:outliner-op :save-block}
|
||||
(doseq [[block-id items] col']
|
||||
(let [block-id (if (string? block-id) (uuid block-id) block-id)
|
||||
|
|
|
@ -1,15 +1,11 @@
|
|||
(ns frontend.modules.outliner.datascript
|
||||
(:require [logseq.graph-parser.util :as gp-util]
|
||||
[logseq.graph-parser.util.block-ref :as block-ref]
|
||||
[lambdaisland.glogi :as log]
|
||||
[clojure.string :as string]
|
||||
[frontend.worker.util :as worker-util]
|
||||
[logseq.db.sqlite.util :as sqlite-util]
|
||||
[frontend.worker.file.property-util :as wpu]
|
||||
[datascript.core :as d]
|
||||
[frontend.state :as state]
|
||||
[frontend.config :as config]
|
||||
[frontend.db :as db]))
|
||||
[clojure.string :as string]))
|
||||
|
||||
(defn new-outliner-txs-state [] (atom []))
|
||||
|
||||
|
@ -36,7 +32,7 @@
|
|||
|
||||
(defn update-refs-and-macros
|
||||
"When a block is deleted, refs are updated and macros associated with the block are deleted"
|
||||
[txs db repo opts]
|
||||
[txs db repo opts set-state-fn]
|
||||
(if (= :delete-blocks (:outliner-op opts))
|
||||
(let [retracted-block-ids (->> (keep (fn [tx]
|
||||
(when (and (vector? tx)
|
||||
|
@ -75,18 +71,16 @@
|
|||
(vector :db.fn/retractEntity (:db/id %)))
|
||||
(:block/macros b)))
|
||||
retracted-blocks)]
|
||||
(when (seq retracted-tx')
|
||||
(state/set-state! [:editor/last-replace-ref-content-tx repo]
|
||||
{:retracted-block-ids retracted-block-ids
|
||||
(when (and (seq retracted-tx') (fn? set-state-fn))
|
||||
(set-state-fn [:editor/last-replace-ref-content-tx repo]
|
||||
{:retracted-block-ids retracted-block-ids
|
||||
:revert-tx revert-tx}))
|
||||
(concat txs retracted-tx' macros-tx))
|
||||
txs))
|
||||
|
||||
(defn transact!
|
||||
[txs opts before-editor-cursor]
|
||||
(let [repo (state/get-current-repo)
|
||||
conn (db/get-db repo false)
|
||||
db-based? (sqlite-util/db-based-graph? repo)
|
||||
[txs tx-meta {:keys [repo conn unlinked-graph? after-transact-fn set-state-fn] :as opts}]
|
||||
(let [db-based? (sqlite-util/db-based-graph? repo)
|
||||
txs (map (fn [m]
|
||||
(if (map? m)
|
||||
(dissoc m :block/children :block/meta :block/top? :block/bottom? :block/anchor
|
||||
|
@ -95,27 +89,17 @@
|
|||
m)) txs)
|
||||
txs (remove-nil-from-transaction txs)
|
||||
txs (cond-> txs
|
||||
(= :delete-blocks (:outliner-op opts))
|
||||
(update-refs-and-macros @conn repo opts)
|
||||
(= :delete-blocks (:outliner-op tx-meta))
|
||||
(update-refs-and-macros @conn repo tx-meta set-state-fn)
|
||||
|
||||
true
|
||||
(distinct))]
|
||||
(when (and (seq txs)
|
||||
(or db-based?
|
||||
(not (contains? (:file/unlinked-dirs @state/state)
|
||||
(config/get-repo-dir repo)))))
|
||||
(or db-based? (not unlinked-graph?)))
|
||||
(try
|
||||
(let [rs (d/transact! conn txs (assoc opts :outliner/transact? true))
|
||||
tx-id (get-tx-id rs)]
|
||||
|
||||
(state/update-state! :history/tx->editor-cursor
|
||||
(fn [m] (assoc m tx-id before-editor-cursor)))
|
||||
|
||||
;; update the current edit block to include full information
|
||||
(when-let [block (state/get-edit-block)]
|
||||
(when (and (:block/uuid block) (not (:db/id block)))
|
||||
(state/set-state! :editor/block (d/pull @conn '[*] [:block/uuid (:block/uuid block)]))))
|
||||
rs)
|
||||
(let [tx-report (d/transact! conn txs (assoc tx-meta :outliner/transact? true))]
|
||||
(when (fn? after-transact-fn) (after-transact-fn tx-report opts))
|
||||
tx-report)
|
||||
(catch :default e
|
||||
(log/error :exception e)
|
||||
(js/console.error e)
|
||||
(throw e))))))
|
||||
|
|
|
@ -31,14 +31,13 @@
|
|||
_# (assert (or (map? opts*#) (symbol? opts*#)) (str "opts is not a map or symbol, type: " (type opts*#)))
|
||||
opts# (if transact-data#
|
||||
(assoc opts*# :nested-transaction? true)
|
||||
opts*#)
|
||||
before-editor-cursor# (frontend.state/get-current-edit-block-and-position)]
|
||||
opts*#)]
|
||||
(if transact-data#
|
||||
(do
|
||||
(when transaction-opts#
|
||||
(conj! transaction-opts# opts#))
|
||||
~@body)
|
||||
(let [repo# (frontend.state/get-current-repo)
|
||||
(let [repo# (get-in opts# [:transact-opts :repo])
|
||||
transaction-args# (cond-> {:repo repo#}
|
||||
(and (frontend.config/db-based-graph? repo#)
|
||||
(get opts*# :persist-op? true))
|
||||
|
@ -59,7 +58,7 @@
|
|||
|
||||
(when (seq all-tx#) ;; If it's empty, do nothing
|
||||
(when-not (:nested-transaction? opts#) ; transact only for the whole transaction
|
||||
(let [result# (frontend.modules.outliner.datascript/transact! all-tx# opts## before-editor-cursor#)]
|
||||
(let [result# (frontend.modules.outliner.datascript/transact! all-tx# (dissoc opts## :transact-opts) (:transact-opts opts##))]
|
||||
{:tx-report result#
|
||||
:tx-data all-tx#
|
||||
:tx-meta tx-meta#})))))))))
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
(ns frontend.modules.outliner.ui
|
||||
#?(:cljs (:require-macros [frontend.modules.outliner.transaction]))
|
||||
#?(:cljs (:require-macros [frontend.modules.outliner.ui]))
|
||||
#?(:cljs (:require [frontend.state :as state]
|
||||
[frontend.config :as config]
|
||||
[frontend.db :as db])))
|
||||
|
||||
#?(:cljs
|
||||
(do
|
||||
(defn unlinked-graph?
|
||||
[]
|
||||
(let [repo (state/get-current-repo)]
|
||||
(contains? (:file/unlinked-dirs @state/state)
|
||||
(config/get-repo-dir repo))))
|
||||
|
||||
(def set-state-fn state/set-state!)
|
||||
|
||||
(defn get-tx-id
|
||||
[tx-report]
|
||||
(get-in tx-report [:tempids :db/current-tx]))
|
||||
|
||||
(defn after-transact-fn
|
||||
[tx-report opts]
|
||||
(let [tx-id (get-tx-id tx-report)]
|
||||
(state/update-state! :history/tx->editor-cursor
|
||||
(fn [m] (assoc m tx-id (:before-editor-cursor opts)))))
|
||||
|
||||
;; update the current edit block to include full information
|
||||
(when-let [block (state/get-edit-block)]
|
||||
(when (and (:block/uuid block) (not (:db/id block)))
|
||||
(state/set-state! :editor/block (db/pull [:block/uuid (:block/uuid block)])))))))
|
||||
|
||||
(defmacro transact!
|
||||
[opts & body]
|
||||
`(let [transact-opts# {:repo (state/get-current-repo)
|
||||
:conn (db/get-db false)
|
||||
:before-editor-cursor (state/get-current-edit-block-and-position)
|
||||
:unlinked-graph? frontend.modules.outliner.ui/unlinked-graph?
|
||||
:set-state-fn frontend.modules.outliner.ui/set-state-fn
|
||||
:after-transact-fn frontend.modules.outliner.ui/after-transact-fn}]
|
||||
(frontend.modules.outliner.transaction/transact! (assoc ~opts :transact-opts transact-opts#)
|
||||
~@body)))
|
Loading…
Reference in New Issue