mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 10:26:08 +01:00 
			
		
		
		
	Merge remote-tracking branch 'origin/stable'
This commit is contained in:
		| @@ -24,7 +24,6 @@ import NoteRevisionsWidget from "../widgets/collapsible_widgets/note_revisions.j | ||||
| import SimilarNotesWidget from "../widgets/collapsible_widgets/similar_notes.js"; | ||||
| import WhatLinksHereWidget from "../widgets/collapsible_widgets/what_links_here.js"; | ||||
| import SidePaneToggles from "../widgets/side_pane_toggles.js"; | ||||
| import appContext from "../services/app_context.js"; | ||||
|  | ||||
| const RIGHT_PANE_CSS = ` | ||||
| <style> | ||||
| @@ -117,6 +116,7 @@ export default class DesktopMainWindowLayout { | ||||
|                 .hideInZenMode()) | ||||
|             .child(new FlexContainer('row') | ||||
|                 .collapsible() | ||||
|                 .filling() | ||||
|                 .child(new SidePaneContainer('left') | ||||
|                     .hideInZenMode() | ||||
|                     .child(new GlobalButtonsWidget()) | ||||
|   | ||||
| @@ -37,6 +37,10 @@ function subscribeToMessages(messageHandler) { | ||||
| // used to serialize sync operations | ||||
| let consumeQueuePromise = null; | ||||
|  | ||||
| // most sync events are sent twice - once immediatelly after finishing the transaction and once during the scheduled ping | ||||
| // but we want to process only once | ||||
| const receivedSyncIds = new Set(); | ||||
|  | ||||
| async function handleMessage(event) { | ||||
|     const message = JSON.parse(event.data); | ||||
|  | ||||
| @@ -52,14 +56,19 @@ async function handleMessage(event) { | ||||
|  | ||||
|         if (syncRows.length > 0) { | ||||
|             const filteredRows = syncRows.filter(row => | ||||
|                 row.entityName !== 'recent_notes' | ||||
|                 !receivedSyncIds.has(row.id) | ||||
|                 && row.entityName !== 'recent_notes' | ||||
|                 && (row.entityName !== 'options' || row.entityId !== 'openTabs')); | ||||
|  | ||||
|             if (filteredRows.length > 0) { | ||||
|                 console.debug(utils.now(), "Sync data: ", filteredRows); | ||||
|             } | ||||
|  | ||||
|             syncDataQueue.push(...syncRows); | ||||
|             for (const row of filteredRows) { | ||||
|                 receivedSyncIds.add(row.id); | ||||
|             } | ||||
|  | ||||
|             syncDataQueue.push(...filteredRows); | ||||
|  | ||||
|             // we set lastAcceptedSyncId even before sync processing and send ping so that backend can start sending more updates | ||||
|             lastAcceptedSyncId = Math.max(lastAcceptedSyncId, syncRows[syncRows.length - 1].id); | ||||
|   | ||||
| @@ -30,6 +30,11 @@ class BasicWidget extends Component { | ||||
|         return this; | ||||
|     } | ||||
|  | ||||
|     filling() { | ||||
|         this.css('flex-grow', '1'); | ||||
|         return this; | ||||
|     } | ||||
|  | ||||
|     hideInZenMode() { | ||||
|         this.class('hide-in-zen-mode'); | ||||
|         return this; | ||||
|   | ||||
| @@ -807,7 +807,9 @@ export default class NoteTreeWidget extends TabAwareWidget { | ||||
|  | ||||
|     async entitiesReloadedEvent({loadResults}) { | ||||
|         const activeNode = this.getActiveNode(); | ||||
|         const nextNode = activeNode ? (activeNode.getNextSibling() || activeNode.getPrevSibling() || activeNode.getParent()) : null; | ||||
|         const activeNotePath = activeNode ? treeService.getNotePath(activeNode) : null; | ||||
|         const nextNotePath = nextNode ? treeService.getNotePath(nextNode) : null; | ||||
|         const activeNoteId = activeNode ? activeNode.data.noteId : null; | ||||
|  | ||||
|         const noteIdsToUpdate = new Set(); | ||||
| @@ -929,6 +931,17 @@ export default class NoteTreeWidget extends TabAwareWidget { | ||||
|             if (node) { | ||||
|                 node.setActive(true, {noEvents: true}); | ||||
|             } | ||||
|             else { | ||||
|                 // this is used when original note has been deleted and we want to move the focus to the note above/below | ||||
|                 node = await this.expandToNote(nextNotePath); | ||||
|  | ||||
|                 if (node) { | ||||
|                     this.tree.setFocus(); | ||||
|                     node.setFocus(true); | ||||
|  | ||||
|                     await appContext.tabManager.getActiveTabContext().setNote(nextNotePath); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -602,18 +602,23 @@ export default class TabRowWidget extends BasicWidget { | ||||
|     } | ||||
|  | ||||
|     updateTab($tab, note) { | ||||
|         if (!note || !$tab.length) { | ||||
|         if (!$tab.length) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         this.updateTitle($tab, note.title); | ||||
|  | ||||
|         for (const clazz of Array.from($tab[0].classList)) { // create copy to safely iterate over while removing classes | ||||
|             if (clazz !== 'note-tab') { | ||||
|                 $tab.removeClass(clazz); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (!note) { | ||||
|             this.updateTitle($tab, 'New tab'); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         this.updateTitle($tab, note.title); | ||||
|  | ||||
|         $tab.addClass(note.getCssClass()); | ||||
|         $tab.addClass(utils.getNoteTypeClass(note.type)); | ||||
|         $tab.addClass(utils.getMimeTypeClass(note.mime)); | ||||
|   | ||||
| @@ -22,6 +22,10 @@ const TPL = ` | ||||
|     .note-detail-readonly-text p:first-child, .note-detail-text::before { | ||||
|         margin-top: 0; | ||||
|     } | ||||
|      | ||||
|     .note-detail-readonly-text img { | ||||
|         max-width: 100%; | ||||
|     } | ||||
|     </style> | ||||
|  | ||||
|     <div class="alert alert-warning no-print"> | ||||
|   | ||||
| @@ -221,6 +221,7 @@ async function transactional(func) { | ||||
|  | ||||
|             await commit(); | ||||
|  | ||||
|             // note that sync rows sent from this action will be sent again by scheduled periodic ping | ||||
|             require('./ws.js').sendPingToAllClients(); | ||||
|  | ||||
|             transactionActive = false; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user