fix expand subtree's conflict with auto-lazy loading

This commit is contained in:
zadam 2020-04-30 23:09:25 +02:00
parent 7482ed063b
commit 0a05a40186

View File

@ -222,6 +222,9 @@ export default class NoteTreeWidget extends TabAwareWidget {
}, },
// this is done to automatically lazy load all expanded search notes after tree load // this is done to automatically lazy load all expanded search notes after tree load
loadChildren: (event, data) => { loadChildren: (event, data) => {
// semaphore since the conflict when two processes are trying to load the same data
// breaks the fancytree
if (!this.tree || !this.tree.autoLoadingDisabled) {
data.node.visit((subNode) => { data.node.visit((subNode) => {
// Load all lazy/unloaded child nodes // Load all lazy/unloaded child nodes
// (which will trigger `loadChildren` recursively) // (which will trigger `loadChildren` recursively)
@ -230,6 +233,7 @@ export default class NoteTreeWidget extends TabAwareWidget {
} }
}); });
} }
}
}); });
this.$widget.on('contextmenu', '.fancytree-node', e => { this.$widget.on('contextmenu', '.fancytree-node', e => {
@ -262,7 +266,7 @@ export default class NoteTreeWidget extends TabAwareWidget {
return notes; return notes;
} }
expandTree(node = null) { async expandTree(node = null) {
if (!node) { if (!node) {
const hoistedNoteId = hoistedNoteService.getHoistedNoteId(); const hoistedNoteId = hoistedNoteService.getHoistedNoteId();
@ -270,11 +274,18 @@ export default class NoteTreeWidget extends TabAwareWidget {
} }
this.batchUpdate(async () => { this.batchUpdate(async () => {
try {
this.tree.autoLoadingDisabled = true;
// trick - first force load of the whole subtree and then visit and expand. // trick - first force load of the whole subtree and then visit and expand.
// unfortunately the two steps can't be combined // unfortunately the two steps can't be combined
await node.visitAndLoad(node => {}, true); await node.visitAndLoad(_ => {}, true);
node.visit(node => node.setExpanded(true), true); node.visit(node => node.setExpanded(true), true);
}
finally {
this.tree.autoLoadingDisabled = false;
}
}); });
} }
@ -478,16 +489,14 @@ export default class NoteTreeWidget extends TabAwareWidget {
} }
async batchUpdate(cb) { async batchUpdate(cb) {
let prevUpdate;
try { try {
// disable rendering during update for increased performance // disable rendering during update for increased performance
prevUpdate = this.tree.enableUpdate(false); this.tree.enableUpdate(false);
await cb(); await cb();
} }
finally { finally {
this.tree.enableUpdate(prevUpdate); this.tree.enableUpdate(true);
} }
} }
@ -782,7 +791,7 @@ export default class NoteTreeWidget extends TabAwareWidget {
} }
} }
expandSubtreeCommand({node}) {console.log("HQY!", node); expandSubtreeCommand({node}) {
this.expandTree(node); this.expandTree(node);
} }