mirror of
https://github.com/zadam/trilium.git
synced 2025-03-01 14:22:32 +01:00
activate parent note when deleting a note, #4601
This commit is contained in:
parent
6b58e59819
commit
9357caeb5a
@ -107,6 +107,13 @@ async function deleteNotes(branchIdsToDelete, forceDeleteAllClones = false) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
await activateParentNotePath();
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
|
||||||
const taskId = utils.randomString(10);
|
const taskId = utils.randomString(10);
|
||||||
|
|
||||||
let counter = 0;
|
let counter = 0;
|
||||||
@ -134,6 +141,16 @@ async function deleteNotes(branchIdsToDelete, forceDeleteAllClones = false) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function activateParentNotePath() {
|
||||||
|
// this is not perfect, maybe we should find the next/previous sibling, but that's more complex
|
||||||
|
const activeContext = appContext.tabManager.getActiveContext();
|
||||||
|
const parentNotePathArr = activeContext.notePathArray.slice(0, -1);
|
||||||
|
|
||||||
|
if (parentNotePathArr.length > 0) {
|
||||||
|
activeContext.setNote(parentNotePathArr.join("/"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function moveNodeUpInHierarchy(node) {
|
async function moveNodeUpInHierarchy(node) {
|
||||||
if (hoistedNoteService.isHoistedNode(node)
|
if (hoistedNoteService.isHoistedNode(node)
|
||||||
|| hoistedNoteService.isTopLevelNode(node)
|
|| hoistedNoteService.isTopLevelNode(node)
|
||||||
|
@ -1091,7 +1091,9 @@ export default class NoteTreeWidget extends NoteContextAwareWidget {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const nodeCtx = this.#getActiveNodeCtx();
|
const activeNode = this.getActiveNode();
|
||||||
|
const activeNodeFocused = activeNode?.hasFocus();
|
||||||
|
const activeNotePath = activeNode ? treeService.getNotePath(activeNode) : null;
|
||||||
|
|
||||||
const refreshCtx = {
|
const refreshCtx = {
|
||||||
noteIdsToUpdate: new Set(),
|
noteIdsToUpdate: new Set(),
|
||||||
@ -1108,7 +1110,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget {
|
|||||||
|
|
||||||
await this.#executeTreeUpdates(refreshCtx, loadResults);
|
await this.#executeTreeUpdates(refreshCtx, loadResults);
|
||||||
|
|
||||||
await this.#setActiveNode(nodeCtx, movedActiveNode, parentsOfAddedNodes);
|
await this.#setActiveNode(activeNotePath, activeNodeFocused, movedActiveNode, parentsOfAddedNodes);
|
||||||
|
|
||||||
if (refreshCtx.noteIdsToReload.size > 0 || refreshCtx.noteIdsToUpdate.size > 0) {
|
if (refreshCtx.noteIdsToReload.size > 0 || refreshCtx.noteIdsToUpdate.size > 0) {
|
||||||
// workaround for https://github.com/mar10/fancytree/issues/1054
|
// workaround for https://github.com/mar10/fancytree/issues/1054
|
||||||
@ -1257,73 +1259,42 @@ export default class NoteTreeWidget extends NoteContextAwareWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#getActiveNodeCtx() {
|
async #setActiveNode(activeNotePath, activeNodeFocused, movedActiveNode, parentsOfAddedNodes) {
|
||||||
const nodeCtx = {
|
|
||||||
activeNotePath: null,
|
|
||||||
activeNodeFocused: null,
|
|
||||||
nextNotePath: null
|
|
||||||
};
|
|
||||||
|
|
||||||
const activeNode = this.getActiveNode();
|
|
||||||
nodeCtx.activeNodeFocused = activeNode?.hasFocus();
|
|
||||||
nodeCtx.activeNotePath = activeNode ? treeService.getNotePath(activeNode) : null;
|
|
||||||
const nextNode = activeNode ? (activeNode.getNextSibling() || activeNode.getPrevSibling() || activeNode.getParent()) : null;
|
|
||||||
nodeCtx.nextNotePath = nextNode ? treeService.getNotePath(nextNode) : null;
|
|
||||||
return nodeCtx;
|
|
||||||
}
|
|
||||||
|
|
||||||
async #setActiveNode(nodeCtx, movedActiveNode, parentsOfAddedNodes) {
|
|
||||||
if (movedActiveNode) {
|
if (movedActiveNode) {
|
||||||
for (const parentNode of parentsOfAddedNodes) {
|
for (const parentNode of parentsOfAddedNodes) {
|
||||||
const foundNode = (parentNode.getChildren() || []).find(child => child.data.noteId === movedActiveNode.data.noteId);
|
const foundNode = (parentNode.getChildren() || []).find(child => child.data.noteId === movedActiveNode.data.noteId);
|
||||||
if (foundNode) {
|
if (foundNode) {
|
||||||
nodeCtx.activeNotePath = treeService.getNotePath(foundNode);
|
activeNotePath = treeService.getNotePath(foundNode);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!nodeCtx.activeNotePath) {
|
if (!activeNotePath) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let node = await this.expandToNote(nodeCtx.activeNotePath, false);
|
let node = await this.expandToNote(activeNotePath, false);
|
||||||
if (node && node.data.noteId !== treeService.getNoteIdFromUrl(nodeCtx.activeNotePath)) {
|
|
||||||
|
if (node && node.data.noteId !== treeService.getNoteIdFromUrl(activeNotePath)) {
|
||||||
// if the active note has been moved elsewhere then it won't be found by the path,
|
// if the active note has been moved elsewhere then it won't be found by the path,
|
||||||
// so we switch to the alternative of trying to find it by noteId
|
// so we switch to the alternative of trying to find it by noteId
|
||||||
const notesById = this.getNodesByNoteId(treeService.getNoteIdFromUrl(nodeCtx.activeNotePath));
|
const notesById = this.getNodesByNoteId(treeService.getNoteIdFromUrl(activeNotePath));
|
||||||
|
|
||||||
// if there are multiple clones, then we'd rather not activate anyone
|
// if there are multiple clones, then we'd rather not activate anyone
|
||||||
node = notesById.length === 1 ? notesById[0] : null;
|
node = notesById.length === 1 ? notesById[0] : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node) {
|
if (!node) {
|
||||||
if (nodeCtx.activeNodeFocused) {
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (activeNodeFocused) {
|
||||||
// needed by Firefox: https://github.com/zadam/trilium/issues/1865
|
// needed by Firefox: https://github.com/zadam/trilium/issues/1865
|
||||||
this.tree.$container.focus();
|
this.tree.$container.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
await node.setActive(true, {noEvents: true, noFocus: !nodeCtx.activeNodeFocused});
|
await node.setActive(true, {noEvents: true, noFocus: !activeNodeFocused});
|
||||||
} else {
|
|
||||||
// this is used when the original note has been deleted, and we want to move the focus to the note above/below
|
|
||||||
node = await this.expandToNote(nodeCtx.nextNotePath, false);
|
|
||||||
|
|
||||||
if (node) {
|
|
||||||
// FIXME: this is conceptually wrong
|
|
||||||
// here note tree is responsible for updating global state of the application
|
|
||||||
// this should be done by NoteContext / TabManager and note tree should only listen to
|
|
||||||
// changes in active note and just set the "active" state
|
|
||||||
// We don't await since that can bring up infinite cycles when e.g. custom widget does some backend requests which wait for max sync ID processed
|
|
||||||
appContext.tabManager.getActiveContext().setNote(nodeCtx.nextNotePath).then(() => {
|
|
||||||
const newActiveNode = this.getActiveNode();
|
|
||||||
|
|
||||||
// return focus if the previously active node was also focused
|
|
||||||
if (newActiveNode && nodeCtx.activeNodeFocused) {
|
|
||||||
newActiveNode.setFocus(true);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sortChildren(node) {
|
sortChildren(node) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user