mirror of
				https://github.com/TriliumNext/Notes.git
				synced 2025-10-31 13:01:31 +08:00 
			
		
		
		
	refactored tree context menu to reduce duplication
This commit is contained in:
		
							parent
							
								
									4330dc47a0
								
							
						
					
					
						commit
						32d60a7eb9
					
				
							
								
								
									
										2
									
								
								libraries/ckeditor/ckeditor.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								libraries/ckeditor/ckeditor.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @ -65,7 +65,7 @@ async function moveToParentNote(branchIdsToMove, newParentNoteId) { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| async function deleteNotes(treeWidget, branchIdsToDelete) { | ||||
| async function deleteNotes(branchIdsToDelete) { | ||||
|     branchIdsToDelete = filterRootNote(branchIdsToDelete); | ||||
| 
 | ||||
|     if (branchIdsToDelete.length === 0) { | ||||
| @ -119,8 +119,6 @@ async function deleteNotes(treeWidget, branchIdsToDelete) { | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     treeWidget.clearSelectedNodes(); | ||||
| 
 | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -1,9 +1,5 @@ | ||||
| import treeService from './tree.js'; | ||||
| import ws from './ws.js'; | ||||
| import protectedSessionService from './protected_session.js'; | ||||
| import treeChangesService from './branches.js'; | ||||
| import treeCache from "./tree_cache.js"; | ||||
| import syncService from "./sync.js"; | ||||
| import hoistedNoteService from './hoisted_note.js'; | ||||
| import clipboard from './clipboard.js'; | ||||
| import protectedSessionHolder from "./protected_session_holder.js"; | ||||
| @ -57,40 +53,40 @@ class TreeContextMenu { | ||||
|             { title: 'Insert child note <kbd data-kb-command="createNoteInto"></kbd>', cmd: "insertChildNote", uiIcon: "plus", | ||||
|                 items: notSearch ? this.getNoteTypeItems("insertChildNote") : null, | ||||
|                 enabled: notSearch && noSelectedNotes }, | ||||
|             { title: 'Delete <kbd data-kb-command="deleteNotes"></kbd>', cmd: "delete", uiIcon: "trash", | ||||
|             { title: 'Delete <kbd data-kb-command="deleteNotes"></kbd>', cmd: "deleteNotes", uiIcon: "trash", | ||||
|                 enabled: isNotRoot && !isHoisted && parentNotSearch }, | ||||
|             { title: "----" }, | ||||
|             { title: 'Search in subtree <kbd data-kb-command="searchInSubtree"></kbd>', cmd: "searchInSubtree", uiIcon: "search", | ||||
|                 enabled: notSearch && noSelectedNotes }, | ||||
|             isHoisted ? null : { title: 'Hoist note <kbd data-kb-command="toggleNoteHoisting"></kbd>', cmd: "hoist", uiIcon: "empty", enabled: noSelectedNotes && notSearch }, | ||||
|             !isHoisted || !isNotRoot ? null : { title: 'Unhoist note <kbd data-kb-command="ToggleNoteHoisting"></kbd>', cmd: "unhoist", uiIcon: "arrow-up" }, | ||||
|             isHoisted ? null : { title: 'Hoist note <kbd data-kb-command="toggleNoteHoisting"></kbd>', cmd: "toggleNoteHoisting", uiIcon: "empty", enabled: noSelectedNotes && notSearch }, | ||||
|             !isHoisted || !isNotRoot ? null : { title: 'Unhoist note <kbd data-kb-command="ToggleNoteHoisting"></kbd>', cmd: "toggleNoteHoisting", uiIcon: "arrow-up" }, | ||||
|             { title: 'Edit branch prefix <kbd data-kb-command="editBranchPrefix"></kbd>', cmd: "editBranchPrefix", uiIcon: "empty", | ||||
|                 enabled: isNotRoot && parentNotSearch && noSelectedNotes}, | ||||
|             { title: "Advanced", uiIcon: "empty", enabled: true, items: [ | ||||
|                     { title: 'Collapse subtree <kbd data-kb-command="collapseSubtree"></kbd>', cmd: "collapseSubtree", uiIcon: "align-justify", enabled: noSelectedNotes }, | ||||
|                     { title: "Force note sync", cmd: "forceNoteSync", uiIcon: "refresh", enabled: noSelectedNotes }, | ||||
|                     { title: 'Sort alphabetically <kbd data-kb-command="sortChildNotes"></kbd>', cmd: "sortAlphabetically", uiIcon: "empty", enabled: noSelectedNotes && notSearch } | ||||
|                     { title: 'Sort alphabetically <kbd data-kb-command="sortChildNotes"></kbd>', cmd: "sortChildNotes", uiIcon: "empty", enabled: noSelectedNotes && notSearch } | ||||
|                 ] }, | ||||
|             { title: "----" }, | ||||
|             { title: "Protect subtree", cmd: "protectSubtree", uiIcon: "check-shield", enabled: noSelectedNotes }, | ||||
|             { title: "Unprotect subtree", cmd: "unprotectSubtree", uiIcon: "shield", enabled: noSelectedNotes }, | ||||
|             { title: "----" }, | ||||
|             { title: 'Copy / clone <kbd data-kb-command="copyNotesToClipboard"></kbd>', cmd: "copy", uiIcon: "copy", | ||||
|             { title: 'Copy / clone <kbd data-kb-command="copyNotesToClipboard"></kbd>', cmd: "copyNotesToClipboard", uiIcon: "copy", | ||||
|                 enabled: isNotRoot && !isHoisted }, | ||||
|             { title: 'Clone to ... <kbd data-kb-command="cloneNotesTo"></kbd>', cmd: "cloneTo", uiIcon: "empty", | ||||
|             { title: 'Clone to ... <kbd data-kb-command="cloneNotesTo"></kbd>', cmd: "cloneNotesTo", uiIcon: "empty", | ||||
|                 enabled: isNotRoot && !isHoisted }, | ||||
|             { title: 'Cut <kbd data-kb-command="cutNotesToClipboard"></kbd>', cmd: "cut", uiIcon: "cut", | ||||
|             { title: 'Cut <kbd data-kb-command="cutNotesToClipboard"></kbd>', cmd: "cutNotesToClipboard", uiIcon: "cut", | ||||
|                 enabled: isNotRoot && !isHoisted && parentNotSearch }, | ||||
|             { title: 'Move to ... <kbd data-kb-command="moveNotesTo"></kbd>', cmd: "moveTo", uiIcon: "empty", | ||||
|             { title: 'Move to ... <kbd data-kb-command="moveNotesTo"></kbd>', cmd: "moveNotesTo", uiIcon: "empty", | ||||
|                 enabled: isNotRoot && !isHoisted && parentNotSearch }, | ||||
|             { title: 'Paste into <kbd data-kb-command="pasteNotesFromClipboard"></kbd>', cmd: "pasteInto", uiIcon: "paste", | ||||
|             { title: 'Paste into <kbd data-kb-command="pasteNotesFromClipboard"></kbd>', cmd: "pasteNotesFromClipboard", uiIcon: "paste", | ||||
|                 enabled: !clipboard.isClipboardEmpty() && notSearch && noSelectedNotes }, | ||||
|             { title: 'Paste after', cmd: "pasteAfter", uiIcon: "paste", | ||||
|             { title: 'Paste after', cmd: "pasteNotesAfterFromClipboard", uiIcon: "paste", | ||||
|                 enabled: !clipboard.isClipboardEmpty() && isNotRoot && !isHoisted && parentNotSearch && noSelectedNotes }, | ||||
|             { title: "Duplicate note here", cmd: "duplicateNote", uiIcon: "empty", | ||||
|                 enabled: noSelectedNotes && parentNotSearch && isNotRoot && !isHoisted && (!note.isProtected || protectedSessionHolder.isProtectedSessionAvailable()) }, | ||||
|             { title: "----" }, | ||||
|             { title: "Export", cmd: "export", uiIcon: "empty", | ||||
|             { title: "Export", cmd: "exportNote", uiIcon: "empty", | ||||
|                 enabled: notSearch && noSelectedNotes }, | ||||
|             { title: "Import into note", cmd: "importIntoNote", uiIcon: "empty", | ||||
|                 enabled: notSearch && noSelectedNotes } | ||||
| @ -126,81 +122,10 @@ class TreeContextMenu { | ||||
|                 isProtected: this.node.data.isProtected | ||||
|             }); | ||||
|         } | ||||
|         else if (cmd === "editBranchPrefix") { | ||||
|             const branchPrefixDialog = await import('../dialogs/branch_prefix.js'); | ||||
|             branchPrefixDialog.showDialog(this.node); | ||||
|         } | ||||
|         else if (cmd === "protectSubtree") { | ||||
|             protectedSessionService.protectSubtree(noteId, true); | ||||
|         } | ||||
|         else if (cmd === "unprotectSubtree") { | ||||
|             protectedSessionService.protectSubtree(noteId, false); | ||||
|         } | ||||
|         else if (cmd === "copy") { | ||||
|             clipboard.copy(this.getSelectedOrActiveBranchIds()); | ||||
|         } | ||||
|         else if (cmd === "cloneTo") { | ||||
|             const nodes = this.treeWidget.getSelectedOrActiveNodes(this.node); | ||||
|             const noteIds = nodes.map(node => node.data.noteId); | ||||
| 
 | ||||
|             import("../dialogs/clone_to.js").then(d => d.showDialog(noteIds)); | ||||
|         } | ||||
|         else if (cmd === "cut") { | ||||
|             clipboard.cut(this.getSelectedOrActiveBranchIds()); | ||||
|         } | ||||
|         else if (cmd === "moveTo") { | ||||
|             this.treeWidget.triggerCommand('moveNotesTo'); | ||||
|         } | ||||
|         else if (cmd === "pasteAfter") { | ||||
|             clipboard.pasteAfter(this.node.data.branchId); | ||||
|         } | ||||
|         else if (cmd === "pasteInto") { | ||||
|             clipboard.pasteInto(noteId); | ||||
|         } | ||||
|         else if (cmd === "delete") { | ||||
|             treeChangesService.deleteNotes(this.treeWidget, this.getSelectedOrActiveBranchIds()); | ||||
|         } | ||||
|         else if (cmd === "export") { | ||||
|             const exportDialog = await import('../dialogs/export.js'); | ||||
|             exportDialog.showDialog(notePath,"subtree"); | ||||
|         } | ||||
|         else if (cmd === "importIntoNote") { | ||||
|             const importDialog = await import('../dialogs/import.js'); | ||||
|             importDialog.showDialog(noteId); | ||||
|         } | ||||
|         else if (cmd === "collapseSubtree") { | ||||
|             this.treeWidget.collapseTree(this.node); | ||||
|         } | ||||
|         else if (cmd === "forceNoteSync") { | ||||
|             syncService.forceNoteSync(noteId); | ||||
|         } | ||||
|         else if (cmd === "sortAlphabetically") { | ||||
|             treeService.sortAlphabetically(noteId); | ||||
|         } | ||||
|         else if (cmd === "hoist") { | ||||
|             hoistedNoteService.setHoistedNoteId(noteId); | ||||
|         } | ||||
|         else if (cmd === "unhoist") { | ||||
|             hoistedNoteService.unhoist(); | ||||
|         } | ||||
|         else if (cmd === "duplicateNote") { | ||||
|             const branch = treeCache.getBranch(this.node.data.branchId); | ||||
| 
 | ||||
|             noteCreateService.duplicateNote(noteId, branch.parentNoteId); | ||||
|         } | ||||
|         else if (cmd === "searchInSubtree") { | ||||
|             appContext.triggerEvent("searchInSubtree", {noteId}); | ||||
|         } | ||||
|         else { | ||||
|             ws.logError("Unknown command: " + cmd); | ||||
|             this.treeWidget.triggerCommand(cmd, {node: this.node}); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     getSelectedOrActiveBranchIds() { | ||||
|         const nodes = this.treeWidget.getSelectedOrActiveNodes(this.node); | ||||
| 
 | ||||
|         return nodes.map(node => node.data.branchId); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| export default TreeContextMenu; | ||||
| @ -16,6 +16,7 @@ import ProtectedSessionTypeWidget from "./type_widgets/protected_session.js"; | ||||
| import BookTypeWidget from "./type_widgets/book.js"; | ||||
| import appContext from "../services/app_context.js"; | ||||
| import keyboardActionsService from "../services/keyboard_actions.js"; | ||||
| import noteCreateService from "../services/note_create.js"; | ||||
| 
 | ||||
| const TPL = ` | ||||
| <div class="note-detail"> | ||||
| @ -238,4 +239,17 @@ export default class NoteDetailWidget extends TabAwareWidget { | ||||
|             await super.handleEventInChildren(name, data); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     async cutIntoNoteCommand() { | ||||
|         const note = appContext.tabManager.getActiveTabNote(); | ||||
| 
 | ||||
|         if (!note) { | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         await noteCreateService.createNote(note.noteId, { | ||||
|             isProtected: note.isProtected, | ||||
|             saveSelection: true | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| @ -14,6 +14,8 @@ import toastService from "../services/toast.js"; | ||||
| import appContext from "../services/app_context.js"; | ||||
| import keyboardActionsService from "../services/keyboard_actions.js"; | ||||
| import clipboard from "../services/clipboard.js"; | ||||
| import protectedSessionService from "../services/protected_session.js"; | ||||
| import syncService from "../services/sync.js"; | ||||
| 
 | ||||
| const TPL = ` | ||||
| <div class="tree"> | ||||
| @ -30,15 +32,7 @@ const TPL = ` | ||||
| </div> | ||||
| `;
 | ||||
| 
 | ||||
| export default class Notethis extends TabAwareWidget { | ||||
|     constructor(appContext, parent) { | ||||
|         super(appContext, parent); | ||||
| 
 | ||||
|         window.glob.cutIntoNote = () => this.cutIntoNoteEvent(); | ||||
| 
 | ||||
|         this.tree = null; | ||||
|     } | ||||
| 
 | ||||
| export default class NoteTreeWidget extends TabAwareWidget { | ||||
|     doRender() { | ||||
|         this.$widget = $(TPL); | ||||
| 
 | ||||
| @ -576,17 +570,6 @@ export default class Notethis extends TabAwareWidget { | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     async cutIntoNoteEvent() { | ||||
|         const node = this.getActiveNode(); | ||||
| 
 | ||||
|         if (node) { | ||||
|             await noteCreateService.createNote(node.data.noteId, { | ||||
|                 isProtected: node.data.isProtected, | ||||
|                 saveSelection: true | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     async setExpandedToServer(branchId, isExpanded) { | ||||
|         utils.assertArguments(branchId); | ||||
| 
 | ||||
| @ -675,10 +658,12 @@ export default class Notethis extends TabAwareWidget { | ||||
|         return nodes.map(node => node.data.branchId); | ||||
|     } | ||||
| 
 | ||||
|     deleteNotesCommand({node}) { | ||||
|     async deleteNotesCommand({node}) { | ||||
|         const branchIds = this.getSelectedOrActiveBranchIds(node); | ||||
|      | ||||
|         treeChangesService.deleteNotes(this, branchIds); | ||||
|         await treeChangesService.deleteNotes(branchIds); | ||||
| 
 | ||||
|         this.clearSelectedNodes(); | ||||
|     } | ||||
|      | ||||
|     moveNoteUpCommand({node}) { | ||||
| @ -782,6 +767,26 @@ export default class Notethis extends TabAwareWidget { | ||||
|         clipboard.pasteInto(node.data.noteId); | ||||
|     } | ||||
| 
 | ||||
|     pasteNotesAfterFromClipboard({node}) { | ||||
|         clipboard.pasteAfter(node.data.branchId); | ||||
|     } | ||||
| 
 | ||||
|     async exportNoteCommand({node}) { | ||||
|         const exportDialog = await import('../dialogs/export.js'); | ||||
|         const notePath = treeService.getNotePath(node); | ||||
| 
 | ||||
|         exportDialog.showDialog(notePath,"subtree"); | ||||
|     } | ||||
| 
 | ||||
|     async importIntoNoteCommand({node}) { | ||||
|         const importDialog = await import('../dialogs/import.js'); | ||||
|         importDialog.showDialog(node.data.noteId); | ||||
|     } | ||||
| 
 | ||||
|     forceNoteSyncCommand({node}) { | ||||
|         syncService.forceNoteSync(noteId); | ||||
|     } | ||||
| 
 | ||||
|     editNoteTitleCommand({node}) { | ||||
|         appContext.triggerEvent('focusOnTitle'); | ||||
|     } | ||||
| @ -791,4 +796,18 @@ export default class Notethis extends TabAwareWidget { | ||||
|             node.getParent().setActive().then(this.clearSelectedNodes); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     protectSubtreeCommand({node}) { | ||||
|         protectedSessionService.protectSubtree(node.data.noteId, true); | ||||
|     } | ||||
| 
 | ||||
|     unprotectSubtreeCommand({node}) { | ||||
|         protectedSessionService.protectSubtree(node.data.noteId, false); | ||||
|     } | ||||
| 
 | ||||
|     duplicateNoteCommand({node}) { | ||||
|         const branch = treeCache.getBranch(node.data.branchId); | ||||
| 
 | ||||
|         noteCreateService.duplicateNote(noteId, branch.parentNoteId); | ||||
|     } | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 zadam
						zadam