mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 18:36:30 +01:00 
			
		
		
		
	converted clone to dialog to new pattern
This commit is contained in:
		| @@ -1,73 +0,0 @@ | |||||||
| import noteAutocompleteService from "../services/note_autocomplete.js"; |  | ||||||
| import utils from "../services/utils.js"; |  | ||||||
| import treeService from "../services/tree.js"; |  | ||||||
| import toastService from "../services/toast.js"; |  | ||||||
| import froca from "../services/froca.js"; |  | ||||||
| import branchService from "../services/branches.js"; |  | ||||||
| import appContext from "../services/app_context.js"; |  | ||||||
|  |  | ||||||
| const $dialog = $("#clone-to-dialog"); |  | ||||||
| const $form = $("#clone-to-form"); |  | ||||||
| const $noteAutoComplete = $("#clone-to-note-autocomplete"); |  | ||||||
| const $clonePrefix = $("#clone-prefix"); |  | ||||||
| const $noteList = $("#clone-to-note-list"); |  | ||||||
|  |  | ||||||
| let clonedNoteIds; |  | ||||||
|  |  | ||||||
| export async function showDialog(noteIds) { |  | ||||||
|     if (!noteIds || noteIds.length === 0) { |  | ||||||
|         noteIds = [ appContext.tabManager.getActiveContextNoteId() ]; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     clonedNoteIds = []; |  | ||||||
|  |  | ||||||
|     for (const noteId of noteIds) { |  | ||||||
|         if (!clonedNoteIds.includes(noteId)) { |  | ||||||
|             clonedNoteIds.push(noteId); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     utils.openDialog($dialog); |  | ||||||
|  |  | ||||||
|     $noteAutoComplete.val('').trigger('focus'); |  | ||||||
|  |  | ||||||
|     $noteList.empty(); |  | ||||||
|  |  | ||||||
|     for (const noteId of clonedNoteIds) { |  | ||||||
|         const note = await froca.getNote(noteId); |  | ||||||
|  |  | ||||||
|         $noteList.append($("<li>").text(note.title)); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     noteAutocompleteService.initNoteAutocomplete($noteAutoComplete); |  | ||||||
|     noteAutocompleteService.showRecentNotes($noteAutoComplete); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| async function cloneNotesTo(notePath) { |  | ||||||
|     const {noteId, parentNoteId} = treeService.getNoteIdAndParentIdFromNotePath(notePath); |  | ||||||
|     const targetBranchId = await froca.getBranchId(parentNoteId, noteId); |  | ||||||
|  |  | ||||||
|     for (const cloneNoteId of clonedNoteIds) { |  | ||||||
|         await branchService.cloneNoteToBranch(cloneNoteId, targetBranchId, $clonePrefix.val()); |  | ||||||
|  |  | ||||||
|         const clonedNote = await froca.getNote(cloneNoteId); |  | ||||||
|         const targetNote = await froca.getBranch(targetBranchId).getNote(); |  | ||||||
|  |  | ||||||
|         toastService.showMessage(`Note "${clonedNote.title}" has been cloned into ${targetNote.title}`); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| $form.on('submit', () => { |  | ||||||
|     const notePath = $noteAutoComplete.getSelectedNotePath(); |  | ||||||
|  |  | ||||||
|     if (notePath) { |  | ||||||
|         $dialog.modal('hide'); |  | ||||||
|  |  | ||||||
|         cloneNotesTo(notePath); |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|         logError("No path to clone to."); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     return false; |  | ||||||
| }); |  | ||||||
| @@ -63,6 +63,7 @@ import IncludeNoteDialog from "../widgets/dialogs/include_note.js"; | |||||||
| import NoteTypeChooserDialog from "../widgets/dialogs/note_type_chooser.js"; | import NoteTypeChooserDialog from "../widgets/dialogs/note_type_chooser.js"; | ||||||
| import JumpToNoteDialog from "../widgets/dialogs/jump_to_note.js"; | import JumpToNoteDialog from "../widgets/dialogs/jump_to_note.js"; | ||||||
| import AddLinkDialog from "../widgets/dialogs/add_link.js"; | import AddLinkDialog from "../widgets/dialogs/add_link.js"; | ||||||
|  | import CloneToDialog from "../widgets/dialogs/clone_to.js"; | ||||||
|  |  | ||||||
| export default class DesktopLayout { | export default class DesktopLayout { | ||||||
|     constructor(customWidgets) { |     constructor(customWidgets) { | ||||||
| @@ -200,6 +201,7 @@ export default class DesktopLayout { | |||||||
|             .child(new IncludeNoteDialog()) |             .child(new IncludeNoteDialog()) | ||||||
|             .child(new NoteTypeChooserDialog()) |             .child(new NoteTypeChooserDialog()) | ||||||
|             .child(new JumpToNoteDialog()) |             .child(new JumpToNoteDialog()) | ||||||
|             .child(new AddLinkDialog()); |             .child(new AddLinkDialog()) | ||||||
|  |             .child(new CloneToDialog()); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -23,11 +23,6 @@ export default class RootCommandExecutor extends Component { | |||||||
|         appContext.triggerEvent("readOnlyTemporarilyDisabled", { noteContext }); |         appContext.triggerEvent("readOnlyTemporarilyDisabled", { noteContext }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     async cloneNoteIdsToCommand({noteIds}) { |  | ||||||
|         const d = await import("../dialogs/clone_to.js"); |  | ||||||
|         d.showDialog(noteIds); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     async moveBranchIdsToCommand({branchIds}) { |     async moveBranchIdsToCommand({branchIds}) { | ||||||
|         const d = await import("../dialogs/move_to.js"); |         const d = await import("../dialogs/move_to.js"); | ||||||
|         d.showDialog(branchIds); |         d.showDialog(branchIds); | ||||||
|   | |||||||
							
								
								
									
										125
									
								
								src/public/app/widgets/dialogs/clone_to.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								src/public/app/widgets/dialogs/clone_to.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,125 @@ | |||||||
|  | import noteAutocompleteService from "../../services/note_autocomplete.js"; | ||||||
|  | import utils from "../../services/utils.js"; | ||||||
|  | import treeService from "../../services/tree.js"; | ||||||
|  | import toastService from "../../services/toast.js"; | ||||||
|  | import froca from "../../services/froca.js"; | ||||||
|  | import branchService from "../../services/branches.js"; | ||||||
|  | import appContext from "../../services/app_context.js"; | ||||||
|  | import BasicWidget from "../basic_widget.js"; | ||||||
|  |  | ||||||
|  | const TPL = ` | ||||||
|  | <div class="clone-to-dialog modal mx-auto" tabindex="-1" role="dialog"> | ||||||
|  |     <div class="modal-dialog modal-lg" style="max-width: 1000px" role="document"> | ||||||
|  |         <div class="modal-content"> | ||||||
|  |             <div class="modal-header"> | ||||||
|  |                 <h5 class="modal-title mr-auto">Clone notes to ...</h5> | ||||||
|  |  | ||||||
|  |                 <button type="button" class="help-button" title="Help on links" data-help-page="Cloning-notes">?</button> | ||||||
|  |  | ||||||
|  |                 <button type="button" class="close" data-dismiss="modal" aria-label="Close" style="margin-left: 0 !important;"> | ||||||
|  |                     <span aria-hidden="true">×</span> | ||||||
|  |                 </button> | ||||||
|  |             </div> | ||||||
|  |             <form class="clone-to-form"> | ||||||
|  |                 <div class="modal-body"> | ||||||
|  |                     <h5>Notes to clone</h5> | ||||||
|  |  | ||||||
|  |                     <ul class="clone-to-note-list" style="max-height: 200px; overflow: auto;"></ul> | ||||||
|  |  | ||||||
|  |                     <div class="form-group"> | ||||||
|  |                         <label style="width: 100%"> | ||||||
|  |                             Target parent note | ||||||
|  |                             <div class="input-group"> | ||||||
|  |                                 <input class="clone-to-note-autocomplete form-control" placeholder="search for note by its name"> | ||||||
|  |                             </div> | ||||||
|  |                         </label> | ||||||
|  |                     </div> | ||||||
|  |  | ||||||
|  |                     <div class="form-group" title="Cloned note will be shown in note tree with given prefix"> | ||||||
|  |                         <label style="width: 100%"> | ||||||
|  |                             Prefix (optional) | ||||||
|  |                             <input class="clone-prefix form-control" style="width: 100%;"> | ||||||
|  |                         </label> | ||||||
|  |                     </div> | ||||||
|  |                 </div> | ||||||
|  |                 <div class="modal-footer"> | ||||||
|  |                     <button type="submit" class="btn btn-primary">Clone to selected note <kbd>enter</kbd></button> | ||||||
|  |                 </div> | ||||||
|  |             </form> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  | </div>`; | ||||||
|  |  | ||||||
|  | export default class CloneToDialog extends BasicWidget { | ||||||
|  |     constructor() { | ||||||
|  |         super(); | ||||||
|  |  | ||||||
|  |         this.clonedNoteIds = null; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     doRender() { | ||||||
|  |         this.$widget = $(TPL); | ||||||
|  |         this.$form = this.$widget.find(".clone-to-form"); | ||||||
|  |         this.$noteAutoComplete = this.$widget.find(".clone-to-note-autocomplete"); | ||||||
|  |         this.$clonePrefix = this.$widget.find(".clone-prefix"); | ||||||
|  |         this.$noteList = this.$widget.find(".clone-to-note-list"); | ||||||
|  |  | ||||||
|  |         this.$form.on('submit', () => { | ||||||
|  |             const notePath = this.$noteAutoComplete.getSelectedNotePath(); | ||||||
|  |  | ||||||
|  |             if (notePath) { | ||||||
|  |                 this.$widget.modal('hide'); | ||||||
|  |  | ||||||
|  |                 this.cloneNotesTo(notePath); | ||||||
|  |             } | ||||||
|  |             else { | ||||||
|  |                 logError("No path to clone to."); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return false; | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     async cloneNoteIdsToEvent({noteIds}) { | ||||||
|  |         if (!noteIds || noteIds.length === 0) { | ||||||
|  |             noteIds = [ appContext.tabManager.getActiveContextNoteId() ]; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         this.clonedNoteIds = []; | ||||||
|  |  | ||||||
|  |         for (const noteId of noteIds) { | ||||||
|  |             if (!this.clonedNoteIds.includes(noteId)) { | ||||||
|  |                 this.clonedNoteIds.push(noteId); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         utils.openDialog(this.$widget); | ||||||
|  |  | ||||||
|  |         this.$noteAutoComplete.val('').trigger('focus'); | ||||||
|  |  | ||||||
|  |         this.$noteList.empty(); | ||||||
|  |  | ||||||
|  |         for (const noteId of this.clonedNoteIds) { | ||||||
|  |             const note = await froca.getNote(noteId); | ||||||
|  |  | ||||||
|  |             this.$noteList.append($("<li>").text(note.title)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         noteAutocompleteService.initNoteAutocomplete(this.$noteAutoComplete); | ||||||
|  |         noteAutocompleteService.showRecentNotes(this.$noteAutoComplete); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     async cloneNotesTo(notePath) { | ||||||
|  |         const {noteId, parentNoteId} = treeService.getNoteIdAndParentIdFromNotePath(notePath); | ||||||
|  |         const targetBranchId = await froca.getBranchId(parentNoteId, noteId); | ||||||
|  |  | ||||||
|  |         for (const cloneNoteId of this.clonedNoteIds) { | ||||||
|  |             await branchService.cloneNoteToBranch(cloneNoteId, targetBranchId, this.$clonePrefix.val()); | ||||||
|  |  | ||||||
|  |             const clonedNote = await froca.getNote(cloneNoteId); | ||||||
|  |             const targetNote = await froca.getBranch(targetBranchId).getNote(); | ||||||
|  |  | ||||||
|  |             toastService.showMessage(`Note "${clonedNote.title}" has been cloned into ${targetNote.title}`); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -26,7 +26,6 @@ | |||||||
| <%- include('dialogs/info.ejs') %> | <%- include('dialogs/info.ejs') %> | ||||||
| <%- include('dialogs/prompt.ejs') %> | <%- include('dialogs/prompt.ejs') %> | ||||||
| <%- include('dialogs/confirm.ejs') %> | <%- include('dialogs/confirm.ejs') %> | ||||||
| <%- include('dialogs/clone_to.ejs') %> |  | ||||||
| <%- include('dialogs/move_to.ejs') %> | <%- include('dialogs/move_to.ejs') %> | ||||||
| <%- include('dialogs/delete_notes.ejs') %> | <%- include('dialogs/delete_notes.ejs') %> | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,38 +0,0 @@ | |||||||
| <div id="clone-to-dialog" class="modal mx-auto" tabindex="-1" role="dialog"> |  | ||||||
|     <div class="modal-dialog modal-lg" style="max-width: 1000px" role="document"> |  | ||||||
|         <div class="modal-content"> |  | ||||||
|             <div class="modal-header"> |  | ||||||
|                 <h5 class="modal-title mr-auto">Clone notes to ...</h5> |  | ||||||
|  |  | ||||||
|                 <button type="button" class="help-button" title="Help on links" data-help-page="Cloning-notes">?</button> |  | ||||||
|  |  | ||||||
|                 <button type="button" class="close" data-dismiss="modal" aria-label="Close" style="margin-left: 0 !important;"> |  | ||||||
|                     <span aria-hidden="true">×</span> |  | ||||||
|                 </button> |  | ||||||
|             </div> |  | ||||||
|             <form id="clone-to-form"> |  | ||||||
|                 <div class="modal-body"> |  | ||||||
|                     <h5>Notes to clone</h5> |  | ||||||
|  |  | ||||||
|                     <ul id="clone-to-note-list" style="max-height: 200px; overflow: auto;"></ul> |  | ||||||
|  |  | ||||||
|                     <div class="form-group"> |  | ||||||
|                         <label for="clone-to-note-autocomplete">Target parent note</label> |  | ||||||
|  |  | ||||||
|                         <div class="input-group"> |  | ||||||
|                             <input id="clone-to-note-autocomplete" class="form-control" placeholder="search for note by its name"> |  | ||||||
|                         </div> |  | ||||||
|                     </div> |  | ||||||
|  |  | ||||||
|                     <div class="form-group" title="Cloned note will be shown in note tree with given prefix"> |  | ||||||
|                         <label for="clone-prefix">Prefix (optional)</label> |  | ||||||
|                         <input id="clone-prefix" class="form-control" style="width: 100%;"> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
|                 <div class="modal-footer"> |  | ||||||
|                     <button type="submit" class="btn btn-primary">Clone to selected note <kbd>enter</kbd></button> |  | ||||||
|                 </div> |  | ||||||
|             </form> |  | ||||||
|         </div> |  | ||||||
|     </div> |  | ||||||
| </div> |  | ||||||
		Reference in New Issue
	
	Block a user