Skip to content

Commit 787bda6

Browse files
committed
When collapsing a reference view - select a first block in the next one
1 parent 5a7ea48 commit 787bda6

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

src/ts/core/common/dom.ts

+24
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,27 @@ export const isElementVisible = (element: Element | null): boolean => {
6161
const {x, y} = element.getBoundingClientRect()
6262
return x >= 0 && y >= 0 && x <= window.innerWidth && y <= window.innerHeight
6363
}
64+
65+
export const findNextNode = (afterNode: Element, selector: string): Node | null => {
66+
// Create a TreeWalker to iterate through all elements in document order
67+
const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, {
68+
acceptNode: (node: Element) => {
69+
// Only accept reference items
70+
if (node.matches(selector)) {
71+
return NodeFilter.FILTER_ACCEPT
72+
}
73+
return NodeFilter.FILTER_SKIP
74+
},
75+
})
76+
77+
// Position walker at our current item
78+
let currentNode: Node | null = walker.currentNode
79+
while (currentNode) {
80+
if (currentNode === afterNode) {
81+
return walker.nextNode()
82+
}
83+
currentNode = walker.nextNode()
84+
}
85+
86+
return null
87+
}

src/ts/core/features/vim-mode/commands/navigation-commands.ts

+16-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,21 @@
11
import {nimap, nmap, nvmap, RoamVim} from 'src/core/features/vim-mode/vim'
22
import {VimRoamPanel} from 'src/core/features/vim-mode/roam/roam-vim-panel'
33
import {closePageReferenceView, expandLastBreadcrumb, openMentions, openParentPage} from 'src/core/roam/references'
4+
import {RoamBlock} from 'src/core/features/vim-mode/roam/roam-block'
5+
import {Selectors} from 'src/core/roam/selectors'
6+
import {findNextNode} from 'src/core/common/dom'
7+
8+
const collapseReferenceView = () => {
9+
const referenceItem = RoamBlock.selected().element?.closest(Selectors.referenceItem)
10+
const nextItem = referenceItem ? (findNextNode(referenceItem, Selectors.referenceItem) as Element) : undefined
11+
const nextBlockId = nextItem?.querySelector(`${Selectors.block}, ${Selectors.blockInput}`)?.id
12+
13+
closePageReferenceView()
14+
15+
if (nextBlockId) {
16+
VimRoamPanel.selected().selectBlock(nextBlockId)
17+
}
18+
}
419

520
export const NavigationCommands = [
621
nvmap('h', 'Select Block Up', () => RoamVim.jumpBlocksInFocusedPanel(-1)),
@@ -15,7 +30,7 @@ export const NavigationCommands = [
1530
// Avoid insert mode, to allow native ctrl-e to go to end of line
1631
nvmap('ctrl+e', 'Scroll Down', () => VimRoamPanel.selected().scrollAndReselectBlockToStayVisible(50)),
1732
nimap('alt+z', 'Expand Last Reference Breadcrumb', expandLastBreadcrumb),
18-
nmap('shift+z', 'Collapse the view for the page in references (or query) section', closePageReferenceView),
33+
nmap('shift+z', 'Collapse the view for the page in references (or query) section', collapseReferenceView),
1934
nmap('1', 'Open parent page', () => openParentPage()),
2035
nmap('shift+1', 'Open parent page in sidebar', () => openParentPage(true)),
2136
nmap('2', 'Open mentions', () => openMentions()),

0 commit comments

Comments
 (0)