mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-30 19:19:03 +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; | ||||||
|                 // needed by Firefox: https://github.com/zadam/trilium/issues/1865
 |  | ||||||
|                 this.tree.$container.focus(); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             await node.setActive(true, {noEvents: true, noFocus: !nodeCtx.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); |  | ||||||
|                     } |  | ||||||
|                 }); |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         if (activeNodeFocused) { | ||||||
|  |             // needed by Firefox: https://github.com/zadam/trilium/issues/1865
 | ||||||
|  |             this.tree.$container.focus(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         await node.setActive(true, {noEvents: true, noFocus: !activeNodeFocused}); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     sortChildren(node) { |     sortChildren(node) { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 zadam
						zadam