mirror of
https://github.com/logseq/logseq.git
synced 2026-04-26 07:05:10 +00:00
Core outliner operations refactoring (#4880)
* Add outliner nested transact! Copied the code mostly from https://github.com/logseq/logseq/pull/4671 by zhiyuan * refactor: insert-blocks * fix: insert-blocks * fix: move cursor to the last block when inserting * fix: replace the current block when inserting and its content is empty * keep only :insert-blocks * expose only :delete-blocks * Use existing implementations for move-nodes-up-down and indent/outdent. * fix editing state not updated immediately * fix editing status * fix: avoid recursive copy * fix: inserting blocks after an empty block * Implement move-blocks with insert-blocks * fix: block left * Implement move-blocks-up-down with move-blocks * fix: paste text * Implement indent-outdent-blocks with move-blocks * fix: indent/outdent * feat: multiple blocks drag && drop * fix: indent/outdent blocks * fix: drag drop * Port unit tests for outliner.core * enhance: open collapsed parent when indenting blocks * refactor: block selection * fix: indent/outdent blocks with different levels * Add instrument on invalid outliner structure * fix: can't write a block if the page has any outdated blocks * fix: editing status for empty page * fix: multiple drag & drop * fix: drag & drop disallows moving from parents to its child * fix: public property * fix: can't delete first empty block * Remove unused code * fix: e2e tests A workaround is to not select/highlight the block when pressing esc if it has fenced code. * remove unused code * Add batch transaction test * fix: update :block/page when dragging targets' children to another page * Add more tests * Simplify extract * Replace db/get-conn with db/get-db * Simplify extracting blocks from ast * Code cleanup * Code cleanup * Add outliner core fuzzy tests * Remove unused code * fix: cursor not jump to the upper block when pressing Enter in the beginning * fix: Enter in the beginning of a non-empty block * Fix lint warnings * Add editor random e2e tests * Fix typo * enhance: move some fns and add some comments * enhance(outliner): add page-block? util * fix: increase td width to prevent content overflow Signed-off-by: Yue Yang <g1enyy0ung@gmail.com> * First pass at file tests for file-sync Each action usually passes by 5th try * Fix two incorrect calls caught by tests * More test improvements - Easier auth setup - subdirectory is configurable - list graphs api also exercised * Address cleanup from #3839 - Remove unused translation key - Delete or TODO commented code - Capitalize notifications to users * fix quick capture template not working * enhance(sync): add logout * enhance: add logout i18n * fix(plugin): sometimes plugin settings of gui not work when entry from app settings * enable show-brackets? toggle for orgmode [[file:./pages/demo.org][demo]] * fix(sync): fix unfinishable sync loop * feature: logseq protocol; refactor persistGraph * fix: deeplink support * fix: broadcast persist graph on opening new graph with logseq protocol * feat: logseq protocol open action for page-name and uuid * fix: logseq protocol graph param validation * ux: copy logseq URL of block * enhance: remove the redundant 'open' from logseq protocol (v0.1) * ux: page dropdown button for copy page URL * chore: logseq protocol comments * don't create new contents file when changing format Logseq now creates a new contents file when users try to toggle the preferred format, which causes file duplications error. * fix pasting in src block not working on iOS close https://github.com/logseq/logseq/issues/4914 * fix playing video goes into editing mode on iOS * fix copy to clipboard failure on iOS * add Podfile item * fix mobile toolbar order not persisting after restart * test(e2e): add test for backspace and cursor pos (#4896) * test(e2e): add test for backspace and cursor pos * fix(test): refine, fix wrong helper * fix(ui): warn about illegal git commit interval * enhance(editor): allow global git cmd shortcut * style(settings): line-space of general/journals * enhance(editor): accept enter in dummy block Fix #4931 * fix editing state not updated immediately * fix: can't write a block if the page has any outdated blocks TODO: clean outdated blocks * fix: editing status for empty page * Random tree for outliner core tests * Add pre assertions and fn docs based on Zhiyuan's suggestions * Made some changes based on Gabriel's suggestions * fix: tests * fix: save current block before moving * Updated the timeout to 100ms based on llcc's suggestion https://github.com/logseq/logseq/pull/4880#discussion_r851966301 * api-insert-new-block! supports replace-empty-target? * fix: replace all :reuse-last-block? usage Co-authored-by: rcmerci <rcmerci@gmail.com> Co-authored-by: Yue Yang <g1enyy0ung@gmail.com> Co-authored-by: Gabriel Horner <gabriel@logseq.com> Co-authored-by: llcc <lzhes43@gmail.com> Co-authored-by: charlie <xyhp915@qq.com> Co-authored-by: Junyi Du <junyidu.cn@gmail.com> Co-authored-by: Andelf <andelf@gmail.com>
This commit is contained in:
@@ -126,7 +126,6 @@
|
||||
["codemirror/mode/yaml-frontmatter/yaml-frontmatter"]
|
||||
["codemirror/mode/yaml/yaml"]
|
||||
["codemirror/mode/z80/z80"]
|
||||
[dommy.core :as dom]
|
||||
[frontend.commands :as commands]
|
||||
[frontend.db :as db]
|
||||
[frontend.extensions.calc :as calc]
|
||||
@@ -258,10 +257,10 @@
|
||||
(state/set-block-component-editing-mode! true)))
|
||||
(.addEventListener element "mousedown"
|
||||
(fn [e]
|
||||
(util/stop e)
|
||||
(state/clear-selection!)
|
||||
(when-let [block (and (:block/uuid config) (into {} (db/get-block-by-uuid (:block/uuid config))))]
|
||||
(state/set-editing! id (.getValue editor) block nil false))
|
||||
(util/stop e)))
|
||||
(state/set-editing! id (.getValue editor) block nil false))))
|
||||
(.save editor)
|
||||
(.refresh editor)
|
||||
(when default-open?
|
||||
@@ -318,13 +317,13 @@
|
||||
;; you're trying to focus doesn't yet exist. Adding the requestAnimationFrame
|
||||
;; ensures that the React component re-renders before the :codemirror/focus
|
||||
;; command is run. It's not elegant... open to suggestions for how to fix it!
|
||||
(js/window.requestAnimationFrame
|
||||
(fn []
|
||||
(let [block (state/get-edit-block)
|
||||
block-uuid (:block/uuid block)
|
||||
block-node (util/get-first-block-by-id block-uuid)]
|
||||
(editor-handler/select-block! (:block/uuid block))
|
||||
(let [textarea-ref (.querySelector block-node "textarea")]
|
||||
(.focus (gobj/get textarea-ref codemirror-ref-name)))
|
||||
(util/select-unhighlight! (dom/by-class "selected"))
|
||||
(state/clear-selection!)))))
|
||||
(let [block (state/get-edit-block)
|
||||
block-uuid (:block/uuid block)]
|
||||
(state/clear-edit!)
|
||||
(js/setTimeout
|
||||
(fn []
|
||||
(let [block-node (util/get-first-block-by-id block-uuid)
|
||||
textarea-ref (.querySelector block-node "textarea")]
|
||||
(when-let [codemirror-ref (gobj/get textarea-ref codemirror-ref-name)]
|
||||
(.focus codemirror-ref))))
|
||||
100)))
|
||||
|
||||
Reference in New Issue
Block a user