Skip to content

Commit 3d3ad45

Browse files
committedSep 19, 2023
fix: collapsed items section not removed when empty
1 parent e78bfca commit 3d3ad45

File tree

2 files changed

+60
-14
lines changed

2 files changed

+60
-14
lines changed
 

‎src/lib/logic/documentState.test.ts

+37-12
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ describe('documentState', () => {
388388
const documentState: DocumentState = {
389389
...createDocumentState({ json, expand: () => true }),
390390
visibleSectionsMap: {
391-
'/members': [{ start: 0, end: 2 }]
391+
'/members': [{ start: 0, end: 3 }]
392392
}
393393
}
394394

@@ -463,7 +463,7 @@ describe('documentState', () => {
463463
'/members/3': true
464464
},
465465
visibleSectionsMap: {
466-
'/members': [{ start: 0, end: 3 }]
466+
'/members': [{ start: 0, end: 4 }]
467467
}
468468
})
469469
})
@@ -492,7 +492,7 @@ describe('documentState', () => {
492492
'': true
493493
},
494494
visibleSectionsMap: {
495-
'': [{ start: 0, end: 4 }]
495+
'': [{ start: 0, end: 5 }]
496496
}
497497
}
498498

@@ -501,7 +501,7 @@ describe('documentState', () => {
501501
assert.deepStrictEqual(res.documentState, {
502502
...documentState,
503503
visibleSectionsMap: {
504-
'': [{ start: 0, end: 5 }]
504+
'': [{ start: 0, end: 6 }]
505505
}
506506
})
507507
})
@@ -548,7 +548,7 @@ describe('documentState', () => {
548548
...documentState,
549549
expandedMap: deleteIn(documentState.expandedMap, ['/members/2']), // [2] is moved to [1]
550550
visibleSectionsMap: {
551-
'/members': [{ start: 0, end: 1 }]
551+
'/members': [{ start: 0, end: 2 }]
552552
}
553553
})
554554
})
@@ -565,7 +565,7 @@ describe('documentState', () => {
565565
...documentState,
566566
expandedMap: deleteIn(documentState.expandedMap, ['/members/2']), // [2] is moved to [1]
567567
visibleSectionsMap: {
568-
'/members': [{ start: 0, end: 1 }]
568+
'/members': [{ start: 0, end: 2 }]
569569
}
570570
})
571571
})
@@ -722,7 +722,7 @@ describe('documentState', () => {
722722
'/members/3': true
723723
},
724724
visibleSectionsMap: {
725-
'/members': [{ start: 0, end: 3 }]
725+
'/members': [{ start: 0, end: 4 }]
726726
}
727727
})
728728
})
@@ -871,7 +871,7 @@ describe('documentState', () => {
871871
'/members/3': true
872872
},
873873
visibleSectionsMap: {
874-
'/members': [{ start: 0, end: 3 }]
874+
'/members': [{ start: 0, end: 4 }]
875875
}
876876
})
877877
})
@@ -907,7 +907,7 @@ describe('documentState', () => {
907907
'/members/1': true
908908
},
909909
visibleSectionsMap: {
910-
'/members': [{ start: 0, end: 1 }]
910+
'/members': [{ start: 0, end: 2 }]
911911
}
912912
})
913913
})
@@ -940,7 +940,7 @@ describe('documentState', () => {
940940

941941
test('should insert at the end of a visible section', () => {
942942
assert.deepStrictEqual(shiftVisibleSections(visibleSections, 2, 1), [
943-
{ start: 0, end: 3 },
943+
{ start: 0, end: 2 },
944944
{ start: 5, end: 7 }
945945
])
946946
})
@@ -959,12 +959,37 @@ describe('documentState', () => {
959959
])
960960
})
961961

962-
test('should remove at the end of a visible section', () => {
962+
test('should remove inside an invisible section (start)', () => {
963963
assert.deepStrictEqual(shiftVisibleSections(visibleSections, 2, -1), [
964-
{ start: 0, end: 1 },
964+
{ start: 0, end: 2 },
965965
{ start: 3, end: 5 }
966966
])
967967
})
968+
969+
test('should remove inside an invisible section (middle)', () => {
970+
assert.deepStrictEqual(shiftVisibleSections(visibleSections, 3, -1), [
971+
{ start: 0, end: 2 },
972+
{ start: 3, end: 5 }
973+
])
974+
})
975+
976+
test('should remove inside an invisible section (end)', () => {
977+
assert.deepStrictEqual(shiftVisibleSections(visibleSections, 4, -1), [
978+
{ start: 0, end: 2 },
979+
{ start: 4, end: 5 }
980+
])
981+
})
982+
983+
test('should merge visible sections when adjacent', () => {
984+
const visibleSections2 = [
985+
{ start: 0, end: 100 },
986+
{ start: 200, end: 300 }
987+
]
988+
989+
assert.deepStrictEqual(shiftVisibleSections(visibleSections2, 100, -100), [
990+
{ start: 0, end: 200 }
991+
])
992+
})
968993
})
969994

970995
describe('expandPath', () => {

‎src/lib/logic/documentState.ts

+23-2
Original file line numberDiff line numberDiff line change
@@ -648,12 +648,33 @@ export function shiftVisibleSections(
648648
index: number,
649649
offset: number
650650
): VisibleSection[] {
651-
return visibleSections.map((section) => {
651+
const shiftedSections = visibleSections.map((section) => {
652652
return {
653653
start: section.start > index ? section.start + offset : section.start,
654-
end: section.end >= index ? section.end + offset : section.end
654+
end: section.end > index ? section.end + offset : section.end
655655
}
656656
})
657+
658+
return mergeAdjacentSections(shiftedSections)
659+
}
660+
661+
// merge adjacent sections like [{start:0, end:100}, {start:100, end:200}] into [{start:0, end:200}]
662+
function mergeAdjacentSections(visibleSections: VisibleSection[]): VisibleSection[] {
663+
const merged = visibleSections.slice(0)
664+
665+
let i = 1
666+
while (i < merged.length) {
667+
if (merged[i - 1].end === merged[i].start) {
668+
merged[i - 1] = {
669+
start: merged[i - 1].start,
670+
end: merged[i].end
671+
}
672+
merged.splice(i)
673+
}
674+
i++
675+
}
676+
677+
return merged
657678
}
658679

659680
export function getEnforceString(

0 commit comments

Comments
 (0)
Please sign in to comment.