diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index 8e756881c2..509c4a951e 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -3342,13 +3342,17 @@ (defn- block-item [config blocks idx item] - (let [item (or (:block/link item) item) + (let [original-block item + linked-block (:block/link item) + item (or linked-block item) item (cond-> (dissoc item :block/meta) (not (:block-children? config)) (assoc :block.temp/top? (zero? idx) :block.temp/bottom? (= (count blocks) (inc idx)))) - config (assoc config :block/uuid (:block/uuid item))] - (rum/with-key (block-container config item) + config' (cond-> (assoc config :block/uuid (:block/uuid item)) + linked-block + (assoc :original-block original-block))] + (rum/with-key (block-container config' item) (str (:blocks-container-id config) "-" (:block/uuid item))))) (defn- block-list diff --git a/src/main/frontend/handler/editor.cljs b/src/main/frontend/handler/editor.cljs index 78ee1b0459..f52991ed90 100644 --- a/src/main/frontend/handler/editor.cljs +++ b/src/main/frontend/handler/editor.cljs @@ -438,22 +438,30 @@ (let [{:keys [block value id config]} state value (if (string? block-value) block-value value) block-id (:block/uuid block) - block (or (db/pull [:block/uuid block-id]) block) block-self? (block-self-alone-when-insert? config block-id) input (gdom/getElement (state/get-edit-input-id)) selection-start (util/get-selection-start input) selection-end (util/get-selection-end input) [fst-block-text snd-block-text] (compute-fst-snd-block-text value selection-start selection-end) + insert-above? (and (string/blank? fst-block-text) (not (string/blank? snd-block-text))) + block' (or (db/pull [:block/uuid block-id]) block) + block'' (or + (when-let [b (:original-block config)] + (cond + insert-above? b + (:block/collapsed? block') b + :else block')) + block') insert-fn (cond block-self? insert-new-block-aux! - (and (string/blank? fst-block-text) (not (string/blank? snd-block-text))) + insert-above? insert-new-block-before-block-aux! :else insert-new-block-aux!)] - (insert-fn config block value + (insert-fn config block'' value {:ok-handler (fn insert-new-block!-ok-handler [last-block] (clear-when-saved!) @@ -687,7 +695,7 @@ [repo sibling-block format id value move?] (when (and repo sibling-block) (when-let [sibling-block-id (dom/attr sibling-block "blockid")] - (when-let [block (db/pull repo '[*] [:block/uuid (uuid sibling-block-id)])] + (when-let [block (db/entity [:block/uuid (uuid sibling-block-id)])] (let [original-content (util/trim-safe (:block/content block)) value' (-> (file-property/remove-built-in-properties-when-file-based repo format original-content) (drawer/remove-logbook)) @@ -725,43 +733,40 @@ (state/set-editor-op! :delete) (let [{:keys [id block-id block-parent-id value format config]} (get-state)] (when block-id - (let [page-id (:db/id (:block/page (db/entity [:block/uuid block-id]))) - page-blocks-count (and page-id (db/get-page-blocks-count repo page-id))] - (when (> page-blocks-count 1) - (let [block-e (db/entity [:block/uuid block-id]) - has-children? (seq (:block/_parent block-e)) - block (db/pull (:db/id block-e)) - left (tree/-get-left (outliner-core/block block)) - left-has-children? (and left - (when-let [block-id (:block/uuid (:data left))] - (let [block (db/entity [:block/uuid block-id])] - (seq (:block/_parent block)))))] - (when-not (and has-children? left-has-children?) - (when block-parent-id - (let [block-parent (gdom/getElement block-parent-id) - sibling-block (if (:embed? config) - (util/get-prev-block-non-collapsed - block-parent - {:container (util/rec-get-blocks-container block-parent)}) - (util/get-prev-block-non-collapsed-non-embed block-parent)) - {:keys [prev-block new-content move-fn]} (move-to-prev-block repo sibling-block format id value false) - concat-prev-block? (boolean (and prev-block new-content)) - transact-opts (cond-> - {:outliner-op :delete-blocks} - concat-prev-block? - (assoc :concat-data - {:last-edit-block (:block/uuid block)}))] - (outliner-tx/transact! transact-opts - (if concat-prev-block? - (let [prev-block' (if (seq (:block/_refs block-e)) - (assoc prev-block - :block/uuid (:block/uuid block) - :block.temp/additional-properties (:block/properties block)) - prev-block)] - (delete-block-aux! block delete-children?) - (save-block! repo prev-block' new-content {:editor/op :delete})) - (delete-block-aux! block delete-children?))) - (move-fn))))))))) + (let [block-e (db/entity [:block/uuid block-id]) + has-children? (seq (:block/_parent block-e)) + block (db/pull (:db/id block-e)) + left (tree/-get-left (outliner-core/block block)) + left-has-children? (and left + (when-let [block-id (:block/uuid (:data left))] + (let [block (db/entity [:block/uuid block-id])] + (seq (:block/_parent block)))))] + (when-not (and has-children? left-has-children?) + (when block-parent-id + (let [block-parent (gdom/getElement block-parent-id) + sibling-block (if (:embed? config) + (util/get-prev-block-non-collapsed + block-parent + {:container (util/rec-get-blocks-container block-parent)}) + (util/get-prev-block-non-collapsed-non-embed block-parent)) + {:keys [prev-block new-content move-fn]} (move-to-prev-block repo sibling-block format id value false) + concat-prev-block? (boolean (and prev-block new-content)) + transact-opts (cond-> + {:outliner-op :delete-blocks} + concat-prev-block? + (assoc :concat-data + {:last-edit-block (:block/uuid block)}))] + (outliner-tx/transact! transact-opts + (if concat-prev-block? + (let [prev-block' (if (seq (:block/_refs block-e)) + (assoc prev-block + :block/uuid (:block/uuid block) + :block.temp/additional-properties (:block/properties block)) + prev-block)] + (delete-block-aux! block delete-children?) + (save-block! repo prev-block' new-content {:editor/op :delete})) + (delete-block-aux! block delete-children?))) + (move-fn))))))) (state/set-editor-op! nil))) (defn delete-blocks! @@ -2663,7 +2668,7 @@ (let [editor-state (get-state) custom-query? (get-in editor-state [:config :custom-query?])] (util/stop e) - (when (and (if top-block? (string/blank? value) true) + (when (and (not (and top-block? (not (string/blank? value)))) (not root-block?) (not single-block?) (not custom-query?)) diff --git a/src/main/frontend/modules/outliner/core.cljs b/src/main/frontend/modules/outliner/core.cljs index 9fa2af2ce9..e49d0c9215 100644 --- a/src/main/frontend/modules/outliner/core.cljs +++ b/src/main/frontend/modules/outliner/core.cljs @@ -623,7 +623,7 @@ (db/entity [:block/uuid (:block/uuid target-block)])))] (let [linked (:block/link block)] (cond - (contains? #{:insert-blocks} outliner-op) + (contains? #{:insert-blocks :move-blocks-up-down} outliner-op) [block sibling?] linked