mirror of
https://github.com/outline/outline.git
synced 2026-03-11 15:19:21 -05:00
fix: Handle nested collapsed headings in findCollapsedNodes (#8223)
This commit is contained in:
@@ -5,27 +5,26 @@ export function findCollapsedNodes(doc: Node): NodeWithPos[] {
|
||||
const blocks = findBlockNodes(doc);
|
||||
const nodes: NodeWithPos[] = [];
|
||||
|
||||
let withinCollapsedHeading;
|
||||
|
||||
const collapsedStack: number[] = [];
|
||||
for (const block of blocks) {
|
||||
if (block.node.type.name === "heading") {
|
||||
if (
|
||||
!withinCollapsedHeading ||
|
||||
block.node.attrs.level <= withinCollapsedHeading
|
||||
) {
|
||||
if (block.node.attrs.collapsed) {
|
||||
if (!withinCollapsedHeading) {
|
||||
withinCollapsedHeading = block.node.attrs.level;
|
||||
}
|
||||
} else {
|
||||
withinCollapsedHeading = undefined;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (collapsedStack.length) {
|
||||
const top = collapsedStack[collapsedStack.length - 1];
|
||||
// if the block encountered same or higher level heading, pop the stack
|
||||
if (block.node.type.name === "heading" && block.node.attrs.level <= top) {
|
||||
collapsedStack.pop();
|
||||
|
||||
if (withinCollapsedHeading) {
|
||||
nodes.push(block);
|
||||
// if the block is a heading and it is collapsed, push it to the stack
|
||||
if (block.node.attrs.collapsed) {
|
||||
collapsedStack.push(block.node.attrs.level);
|
||||
}
|
||||
} else {
|
||||
// the deepest level or non-heading block should be added to the nodes
|
||||
nodes.push(block);
|
||||
}
|
||||
} else {
|
||||
if (block.node.type.name === "heading" && block.node.attrs.collapsed) {
|
||||
collapsedStack.push(block.node.attrs.level);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user