mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 03:29:02 +01:00 
			
		
		
		
	mobile web fixes
This commit is contained in:
		
							parent
							
								
									48b1aece4d
								
							
						
					
					
						commit
						79956b5676
					
				
							
								
								
									
										4
									
								
								libraries/codemirror/addon/lint/eslint.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								libraries/codemirror/addon/lint/eslint.js
									
									
									
									
										vendored
									
									
								
							| @ -28,7 +28,9 @@ | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     async function validatorJavaScript(text, options) { |     async function validatorJavaScript(text, options) { | ||||||
|         if (glob.getActiveNote() == null || glob.getActiveNote().mime === 'application/json') { |         if (glob.isMobile() | ||||||
|  |             || glob.getActiveNote() == null | ||||||
|  |             || glob.getActiveNote().mime === 'application/json') { | ||||||
|             // eslint doesn't seem to validate pure JSON well
 |             // eslint doesn't seem to validate pure JSON well
 | ||||||
|             return []; |             return []; | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -42,6 +42,9 @@ import macInit from './services/mac_init.js'; | |||||||
| import cssLoader from './services/css_loader.js'; | import cssLoader from './services/css_loader.js'; | ||||||
| import dateNoteService from './services/date_notes.js'; | import dateNoteService from './services/date_notes.js'; | ||||||
| 
 | 
 | ||||||
|  | window.glob.isDesktop = utils.isDesktop; | ||||||
|  | window.glob.isMobile = utils.isMobile; | ||||||
|  | 
 | ||||||
| // required for CKEditor image upload plugin
 | // required for CKEditor image upload plugin
 | ||||||
| window.glob.getActiveNode = treeService.getActiveNode; | window.glob.getActiveNode = treeService.getActiveNode; | ||||||
| window.glob.getHeaders = server.getHeaders; | window.glob.getHeaders = server.getHeaders; | ||||||
|  | |||||||
| @ -8,6 +8,9 @@ import treeChangesService from "./services/branches.js"; | |||||||
| import utils from "./services/utils.js"; | import utils from "./services/utils.js"; | ||||||
| import treeUtils from "./services/tree_utils.js"; | import treeUtils from "./services/tree_utils.js"; | ||||||
| 
 | 
 | ||||||
|  | window.glob.isDesktop = utils.isDesktop; | ||||||
|  | window.glob.isMobile = utils.isMobile; | ||||||
|  | 
 | ||||||
| const $leftPane = $("#left-pane"); | const $leftPane = $("#left-pane"); | ||||||
| const $tree = $("#tree"); | const $tree = $("#tree"); | ||||||
| const $detail = $("#detail"); | const $detail = $("#detail"); | ||||||
| @ -42,6 +45,13 @@ async function showTree() { | |||||||
|         source: tree, |         source: tree, | ||||||
|         scrollParent: $tree, |         scrollParent: $tree, | ||||||
|         minExpandLevel: 2, // root can't be collapsed
 |         minExpandLevel: 2, // root can't be collapsed
 | ||||||
|  |         click: (event, data) => { | ||||||
|  |             if (data.targetType !== 'expander' && data.node.isActive()) { | ||||||
|  |                 $tree.fancytree('getTree').reactivate(true); | ||||||
|  | 
 | ||||||
|  |                 return false; | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|         activate: async (event, data) => { |         activate: async (event, data) => { | ||||||
|             const node = data.node; |             const node = data.node; | ||||||
| 
 | 
 | ||||||
| @ -97,10 +107,10 @@ $detail.on("click", ".note-menu-button", async e => { | |||||||
|                 treeService.createNote(node, node.data.noteId, 'into'); |                 treeService.createNote(node, node.data.noteId, 'into'); | ||||||
|             } |             } | ||||||
|             else if (cmd === "delete") { |             else if (cmd === "delete") { | ||||||
|                 treeChangesService.deleteNodes([node]); |                 if (await treeChangesService.deleteNodes([node])) { | ||||||
| 
 |                     // move to the tree
 | ||||||
|                 // move to the tree
 |                     togglePanes(); | ||||||
|                 togglePanes(); |                 } | ||||||
|             } |             } | ||||||
|             else { |             else { | ||||||
|                 throw new Error("Unrecognized command " + cmd); |                 throw new Error("Unrecognized command " + cmd); | ||||||
|  | |||||||
| @ -82,7 +82,7 @@ async function deleteNodes(nodes) { | |||||||
|     nodes = await filterRootNote(nodes); |     nodes = await filterRootNote(nodes); | ||||||
| 
 | 
 | ||||||
|     if (nodes.length === 0 || !confirm('Are you sure you want to delete select note(s) and all the sub-notes?')) { |     if (nodes.length === 0 || !confirm('Are you sure you want to delete select note(s) and all the sub-notes?')) { | ||||||
|         return; |         return false; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     for (const node of nodes) { |     for (const node of nodes) { | ||||||
| @ -123,6 +123,8 @@ async function deleteNodes(nodes) { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     infoService.showMessage("Note(s) has been deleted."); |     infoService.showMessage("Note(s) has been deleted."); | ||||||
|  | 
 | ||||||
|  |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| async function moveNodeUpInHierarchy(node) { | async function moveNodeUpInHierarchy(node) { | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| import server from "./server.js"; | import server from "./server.js"; | ||||||
| import noteDetailService from "./note_detail.js"; | import noteDetailService from "./note_detail.js"; | ||||||
| import treeService from './tree.js'; | import utils from './utils.js'; | ||||||
| 
 | 
 | ||||||
| // this key needs to have this value so it's hit by the tooltip
 | // this key needs to have this value so it's hit by the tooltip
 | ||||||
| const SELECTED_PATH_KEY = "data-note-path"; | const SELECTED_PATH_KEY = "data-note-path"; | ||||||
| @ -21,84 +21,94 @@ async function autocompleteSource(term, cb) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function clearText($el) { | function clearText($el) { | ||||||
|  |     if (utils.isMobile()) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     $el.setSelectedPath(""); |     $el.setSelectedPath(""); | ||||||
|     $el.autocomplete("val", "").change(); |     $el.autocomplete("val", "").change(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function showRecentNotes($el) { | function showRecentNotes($el) { | ||||||
|  |     if (utils.isMobile()) { | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     $el.setSelectedPath(""); |     $el.setSelectedPath(""); | ||||||
|     $el.autocomplete("val", ""); |     $el.autocomplete("val", ""); | ||||||
|     $el.focus(); |     $el.focus(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function initNoteAutocomplete($el, options) { | function initNoteAutocomplete($el, options) { | ||||||
|     if (!$el.hasClass("note-autocomplete-input")) { |     if ($el.hasClass("note-autocomplete-input") || utils.isMobile()) { | ||||||
|         options = options || {}; |         return $el; | ||||||
| 
 |  | ||||||
|         $el.addClass("note-autocomplete-input"); |  | ||||||
| 
 |  | ||||||
|         const $clearTextButton = $("<a>") |  | ||||||
|                 .addClass("input-group-text input-clearer-button jam jam-close") |  | ||||||
|                 .prop("title", "Clear text field"); |  | ||||||
| 
 |  | ||||||
|         const $showRecentNotesButton = $("<a>") |  | ||||||
|                 .addClass("input-group-text show-recent-notes-button jam jam-clock") |  | ||||||
|                 .prop("title", "Show recent notes"); |  | ||||||
| 
 |  | ||||||
|         const $goToSelectedNoteButton = $("<a>") |  | ||||||
|             .addClass("input-group-text go-to-selected-note-button jam jam-arrow-right") |  | ||||||
|             .attr("data-action", "note"); |  | ||||||
| 
 |  | ||||||
|         const $sideButtons = $("<div>") |  | ||||||
|             .addClass("input-group-append") |  | ||||||
|             .append($clearTextButton) |  | ||||||
|             .append($showRecentNotesButton); |  | ||||||
| 
 |  | ||||||
|         if (!options.hideGoToSelectedNoteButton) { |  | ||||||
|             $sideButtons.append($goToSelectedNoteButton); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         $el.after($sideButtons); |  | ||||||
| 
 |  | ||||||
|         $clearTextButton.click(() => clearText($el)); |  | ||||||
| 
 |  | ||||||
|         $showRecentNotesButton.click(e => { |  | ||||||
|             showRecentNotes($el); |  | ||||||
| 
 |  | ||||||
|             // this will cause the click not give focus to the "show recent notes" button
 |  | ||||||
|             // this is important because otherwise input will lose focus immediatelly and not show the results
 |  | ||||||
|             return false; |  | ||||||
|         }); |  | ||||||
| 
 |  | ||||||
|         $el.autocomplete({ |  | ||||||
|             appendTo: document.querySelector('body'), |  | ||||||
|             hint: false, |  | ||||||
|             autoselect: true, |  | ||||||
|             openOnFocus: true, |  | ||||||
|             minLength: 0, |  | ||||||
|             tabAutocomplete: false |  | ||||||
|         }, [ |  | ||||||
|             { |  | ||||||
|                 source: autocompleteSource, |  | ||||||
|                 displayKey: 'title', |  | ||||||
|                 templates: { |  | ||||||
|                     suggestion: function(suggestion) { |  | ||||||
|                         return suggestion.highlighted; |  | ||||||
|                     } |  | ||||||
|                 }, |  | ||||||
|                 // we can't cache identical searches because notes can be created / renamed, new recent notes can be added
 |  | ||||||
|                 cache: false |  | ||||||
|             } |  | ||||||
|         ]); |  | ||||||
| 
 |  | ||||||
|         $el.on('autocomplete:selected', (event, suggestion) => $el.setSelectedPath(suggestion.path)); |  | ||||||
|         $el.on('autocomplete:closed', () => { |  | ||||||
|             if (!$el.val().trim()) { |  | ||||||
|                 clearText($el); |  | ||||||
|             } |  | ||||||
|         }); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     options = options || {}; | ||||||
|  | 
 | ||||||
|  |     $el.addClass("note-autocomplete-input"); | ||||||
|  | 
 | ||||||
|  |     const $clearTextButton = $("<a>") | ||||||
|  |             .addClass("input-group-text input-clearer-button jam jam-close") | ||||||
|  |             .prop("title", "Clear text field"); | ||||||
|  | 
 | ||||||
|  |     const $showRecentNotesButton = $("<a>") | ||||||
|  |             .addClass("input-group-text show-recent-notes-button jam jam-clock") | ||||||
|  |             .prop("title", "Show recent notes"); | ||||||
|  | 
 | ||||||
|  |     const $goToSelectedNoteButton = $("<a>") | ||||||
|  |         .addClass("input-group-text go-to-selected-note-button jam jam-arrow-right") | ||||||
|  |         .attr("data-action", "note"); | ||||||
|  | 
 | ||||||
|  |     const $sideButtons = $("<div>") | ||||||
|  |         .addClass("input-group-append") | ||||||
|  |         .append($clearTextButton) | ||||||
|  |         .append($showRecentNotesButton); | ||||||
|  | 
 | ||||||
|  |     if (!options.hideGoToSelectedNoteButton) { | ||||||
|  |         $sideButtons.append($goToSelectedNoteButton); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     $el.after($sideButtons); | ||||||
|  | 
 | ||||||
|  |     $clearTextButton.click(() => clearText($el)); | ||||||
|  | 
 | ||||||
|  |     $showRecentNotesButton.click(e => { | ||||||
|  |         showRecentNotes($el); | ||||||
|  | 
 | ||||||
|  |         // this will cause the click not give focus to the "show recent notes" button
 | ||||||
|  |         // this is important because otherwise input will lose focus immediatelly and not show the results
 | ||||||
|  |         return false; | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     $el.autocomplete({ | ||||||
|  |         appendTo: document.querySelector('body'), | ||||||
|  |         hint: false, | ||||||
|  |         autoselect: true, | ||||||
|  |         openOnFocus: true, | ||||||
|  |         minLength: 0, | ||||||
|  |         tabAutocomplete: false | ||||||
|  |     }, [ | ||||||
|  |         { | ||||||
|  |             source: autocompleteSource, | ||||||
|  |             displayKey: 'title', | ||||||
|  |             templates: { | ||||||
|  |                 suggestion: function(suggestion) { | ||||||
|  |                     return suggestion.highlighted; | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             // we can't cache identical searches because notes can be created / renamed, new recent notes can be added
 | ||||||
|  |             cache: false | ||||||
|  |         } | ||||||
|  |     ]); | ||||||
|  | 
 | ||||||
|  |     $el.on('autocomplete:selected', (event, suggestion) => $el.setSelectedPath(suggestion.path)); | ||||||
|  |     $el.on('autocomplete:closed', () => { | ||||||
|  |         if (!$el.val().trim()) { | ||||||
|  |             clearText($el); | ||||||
|  |         } | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|     return $el; |     return $el; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -75,7 +75,10 @@ class TabContext { | |||||||
|             treeService.setNoteTitle(this.noteId, title); |             treeService.setNoteTitle(this.noteId, title); | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
|         this.$noteTitle.bind('keydown', 'return', () => this.getComponent().focus()); |         if (utils.isDesktop()) { | ||||||
|  |             // keyboard plugin is not loaded in mobile
 | ||||||
|  |             this.$noteTitle.bind('keydown', 'return', () => this.getComponent().focus()); | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|         this.$protectButton = this.$tabContent.find(".protect-button"); |         this.$protectButton = this.$tabContent.find(".protect-button"); | ||||||
|         this.$protectButton.click(protectedSessionService.protectNoteAndSendToServer); |         this.$protectButton.click(protectedSessionService.protectNoteAndSendToServer); | ||||||
|  | |||||||
| @ -649,9 +649,8 @@ async function createNote(node, parentNoteId, target, extraOptions = {}) { | |||||||
|         if (!node.getChildren() && node.isFolder()) { |         if (!node.getChildren() && node.isFolder()) { | ||||||
|             await node.setExpanded(); |             await node.setExpanded(); | ||||||
|         } |         } | ||||||
|         else { | 
 | ||||||
|             node.addChildren(newNode); |         node.addChildren(newNode); | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         await node.getLastChild().setActive(true); |         await node.getLastChild().setActive(true); | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 zadam
						zadam