Skip to content

Commit 4b1cfa5

Browse files
authored
Merge pull request #1906 from neotyk/fix/delete-merge-one-more-time
fix: support updating on block remove and merge.
2 parents a77b958 + b2f4e36 commit 4b1cfa5

File tree

3 files changed

+86
-45
lines changed

3 files changed

+86
-45
lines changed

src/cljc/athens/common_events/graph/ops.cljc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,19 @@
6868
(atomic/make-block-remove-op delete-uid)))
6969

7070

71+
(defn build-block-merge-with-updated-op
72+
"Creates `:block/remove` & `:block/save` ops."
73+
[db remove-uid merge-uid value update-value]
74+
(let [;; block/remove atomic op
75+
block-remove-op (build-block-remove-op db
76+
remove-uid)
77+
block-save-op (build-block-save-op db merge-uid (str update-value value))
78+
delete-and-merge-op (composite/make-consequence-op {:op/type :block/remove-merge-update}
79+
[block-remove-op
80+
block-save-op])]
81+
delete-and-merge-op))
82+
83+
7184
(defn build-block-remove-merge-op
7285
"Creates `:block/remove` & `:block/save` ops.
7386
Arguments:

src/cljs/athens/events.cljs

Lines changed: 66 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -734,53 +734,62 @@
734734
No-op if prev-sibling-block has children.
735735
Otherwise delete block and join with previous block
736736
If prev-block has children"
737-
[uid value]
738-
(let [root-embed? (= (some-> (str "#editable-uid-" uid)
739-
js/document.querySelector
740-
(.. (closest ".block-embed"))
741-
(. -firstChild)
742-
(.getAttribute "data-uid"))
743-
uid)
744-
db @db/dsdb
745-
[uid embed-id] (common-db/uid-and-embed-id uid)
746-
block (common-db/get-block db [:block/uid uid])
747-
{:block/keys [children order] :or {children []}} block
748-
parent (common-db/get-parent db [:block/uid uid])
749-
prev-block-uid (common-db/prev-block-uid db uid)
750-
prev-block (common-db/get-block db [:block/uid prev-block-uid])
751-
prev-sib-order (dec (:block/order block))
752-
prev-sib (some->> (common-db/prev-sib db uid prev-sib-order)
753-
(common-db/get-block db))
754-
event (cond
755-
(or (not parent)
756-
root-embed?
757-
(and (not-empty children) (not-empty (:block/children prev-sib)))
758-
(and (not-empty children) (= parent prev-block)))
759-
nil
760-
761-
(and (empty? children) (:node/title parent) (zero? order) (clojure.string/blank? value))
762-
[:backspace/delete-only-child uid]
763-
764-
:else
765-
[:backspace/delete-merge-block {:uid uid
766-
:value value
767-
:prev-block-uid prev-block-uid
768-
:embed-id embed-id
769-
:prev-block prev-block}])]
770-
(log/debug "[Backspace] args:" (pr-str {:uid uid
771-
:value value})
772-
", event:" (pr-str event))
773-
(when event
774-
{:fx [[:dispatch event]]})))
737+
([uid value]
738+
(backspace uid value nil))
739+
([uid value maybe-local-updates]
740+
(let [root-embed? (= (some-> (str "#editable-uid-" uid)
741+
js/document.querySelector
742+
(.. (closest ".block-embed"))
743+
(. -firstChild)
744+
(.getAttribute "data-uid"))
745+
uid)
746+
db @db/dsdb
747+
[uid embed-id] (common-db/uid-and-embed-id uid)
748+
block (common-db/get-block db [:block/uid uid])
749+
{:block/keys [children order] :or {children []}} block
750+
parent (common-db/get-parent db [:block/uid uid])
751+
prev-block-uid (common-db/prev-block-uid db uid)
752+
prev-block (common-db/get-block db [:block/uid prev-block-uid])
753+
prev-sib-order (dec (:block/order block))
754+
prev-sib (some->> (common-db/prev-sib db uid prev-sib-order)
755+
(common-db/get-block db))
756+
event (cond
757+
(or (not parent)
758+
root-embed?
759+
(and (not-empty children) (not-empty (:block/children prev-sib)))
760+
(and (not-empty children) (= parent prev-block)))
761+
nil
762+
763+
(and (empty? children) (:node/title parent) (zero? order) (clojure.string/blank? value))
764+
[:backspace/delete-only-child uid]
765+
766+
maybe-local-updates
767+
[:backspace/delete-merge-block-with-save {:uid uid
768+
:value value
769+
:prev-block-uid prev-block-uid
770+
:embed-id embed-id
771+
:prev-block prev-block
772+
:local-update maybe-local-updates}]
773+
:else
774+
[:backspace/delete-merge-block {:uid uid
775+
:value value
776+
:prev-block-uid prev-block-uid
777+
:embed-id embed-id
778+
:prev-block prev-block}])]
779+
(log/debug "[Backspace] args:" (pr-str {:uid uid
780+
:value value})
781+
", event:" (pr-str event))
782+
(when event
783+
{:fx [[:dispatch event]]}))))
775784

776785

777786
;; todo(abhinav) -- stateless backspace
778787
;; will pick db value of backspace/delete instead of current state
779788
;; which might not be same as blur is not yet called
780789
(reg-event-fx
781790
:backspace
782-
(fn [_ [_ uid value]]
783-
(backspace uid value)))
791+
(fn [_ [_ uid value maybe-local-updates]]
792+
(backspace uid value maybe-local-updates)))
784793

785794

786795
(reg-event-fx
@@ -886,6 +895,23 @@
886895
(count (:block/string prev-block))]]]]})))
887896

888897

898+
(reg-event-fx
899+
:backspace/delete-merge-block-with-save
900+
(fn [_ [_ {:keys [uid value prev-block-uid embed-id local-update] :as args}]]
901+
(log/debug ":backspace/delete-merge-block-with-save args:" (pr-str args))
902+
(let [op (graph-ops/build-block-merge-with-updated-op @db/dsdb
903+
uid
904+
prev-block-uid
905+
value
906+
local-update)
907+
event (common-events/build-atomic-event op)]
908+
{:fx [[:dispatch-n [[:resolve-transact-forward event]
909+
[:editing/uid
910+
(cond-> prev-block-uid
911+
embed-id (str "-embed-" embed-id))
912+
(count local-update)]]]]})))
913+
914+
889915
;; Atomic events end ==========
890916

891917

src/cljs/athens/views/blocks/textarea_keydown.cljs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -763,11 +763,13 @@
763763
next-block-uid (db/next-block-uid o-uid)]
764764
(when (and no-selection? end? next-block-uid)
765765
(let [next-block (db/get-block [:block/uid (-> next-block-uid db/uid-and-embed-id first)])]
766-
(dispatch [:backspace (cond-> next-block-uid
767-
embed-id (str "-embed-" embed-id))
768-
(str (or (:string/local @state)
769-
(:block/string @state))
770-
(:block/string next-block))])))))
766+
(dispatch [:backspace
767+
(cond-> next-block-uid
768+
embed-id (str "-embed-" embed-id))
769+
(:block/string next-block)
770+
(when-not (= (:string/local @state)
771+
(:block/string @state))
772+
(:string/local @state))])))))
771773

772774

773775
(defn textarea-key-down

0 commit comments

Comments
 (0)