mirror of
https://github.com/zadam/trilium.git
synced 2025-06-06 18:08:33 +02:00
Merge remote-tracking branch 'origin/stable'
This commit is contained in:
commit
13117d2e68
@ -24,7 +24,6 @@ import NoteRevisionsWidget from "../widgets/collapsible_widgets/note_revisions.j
|
|||||||
import SimilarNotesWidget from "../widgets/collapsible_widgets/similar_notes.js";
|
import SimilarNotesWidget from "../widgets/collapsible_widgets/similar_notes.js";
|
||||||
import WhatLinksHereWidget from "../widgets/collapsible_widgets/what_links_here.js";
|
import WhatLinksHereWidget from "../widgets/collapsible_widgets/what_links_here.js";
|
||||||
import SidePaneToggles from "../widgets/side_pane_toggles.js";
|
import SidePaneToggles from "../widgets/side_pane_toggles.js";
|
||||||
import appContext from "../services/app_context.js";
|
|
||||||
|
|
||||||
const RIGHT_PANE_CSS = `
|
const RIGHT_PANE_CSS = `
|
||||||
<style>
|
<style>
|
||||||
@ -117,6 +116,7 @@ export default class DesktopMainWindowLayout {
|
|||||||
.hideInZenMode())
|
.hideInZenMode())
|
||||||
.child(new FlexContainer('row')
|
.child(new FlexContainer('row')
|
||||||
.collapsible()
|
.collapsible()
|
||||||
|
.filling()
|
||||||
.child(new SidePaneContainer('left')
|
.child(new SidePaneContainer('left')
|
||||||
.hideInZenMode()
|
.hideInZenMode()
|
||||||
.child(new GlobalButtonsWidget())
|
.child(new GlobalButtonsWidget())
|
||||||
|
@ -37,6 +37,10 @@ function subscribeToMessages(messageHandler) {
|
|||||||
// used to serialize sync operations
|
// used to serialize sync operations
|
||||||
let consumeQueuePromise = null;
|
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) {
|
async function handleMessage(event) {
|
||||||
const message = JSON.parse(event.data);
|
const message = JSON.parse(event.data);
|
||||||
|
|
||||||
@ -52,14 +56,19 @@ async function handleMessage(event) {
|
|||||||
|
|
||||||
if (syncRows.length > 0) {
|
if (syncRows.length > 0) {
|
||||||
const filteredRows = syncRows.filter(row =>
|
const filteredRows = syncRows.filter(row =>
|
||||||
row.entityName !== 'recent_notes'
|
!receivedSyncIds.has(row.id)
|
||||||
|
&& row.entityName !== 'recent_notes'
|
||||||
&& (row.entityName !== 'options' || row.entityId !== 'openTabs'));
|
&& (row.entityName !== 'options' || row.entityId !== 'openTabs'));
|
||||||
|
|
||||||
if (filteredRows.length > 0) {
|
if (filteredRows.length > 0) {
|
||||||
console.debug(utils.now(), "Sync data: ", filteredRows);
|
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
|
// 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);
|
lastAcceptedSyncId = Math.max(lastAcceptedSyncId, syncRows[syncRows.length - 1].id);
|
||||||
|
@ -30,6 +30,11 @@ class BasicWidget extends Component {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
filling() {
|
||||||
|
this.css('flex-grow', '1');
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
hideInZenMode() {
|
hideInZenMode() {
|
||||||
this.class('hide-in-zen-mode');
|
this.class('hide-in-zen-mode');
|
||||||
return this;
|
return this;
|
||||||
|
@ -807,7 +807,9 @@ export default class NoteTreeWidget extends TabAwareWidget {
|
|||||||
|
|
||||||
async entitiesReloadedEvent({loadResults}) {
|
async entitiesReloadedEvent({loadResults}) {
|
||||||
const activeNode = this.getActiveNode();
|
const activeNode = this.getActiveNode();
|
||||||
|
const nextNode = activeNode ? (activeNode.getNextSibling() || activeNode.getPrevSibling() || activeNode.getParent()) : null;
|
||||||
const activeNotePath = activeNode ? treeService.getNotePath(activeNode) : null;
|
const activeNotePath = activeNode ? treeService.getNotePath(activeNode) : null;
|
||||||
|
const nextNotePath = nextNode ? treeService.getNotePath(nextNode) : null;
|
||||||
const activeNoteId = activeNode ? activeNode.data.noteId : null;
|
const activeNoteId = activeNode ? activeNode.data.noteId : null;
|
||||||
|
|
||||||
const noteIdsToUpdate = new Set();
|
const noteIdsToUpdate = new Set();
|
||||||
@ -929,6 +931,17 @@ export default class NoteTreeWidget extends TabAwareWidget {
|
|||||||
if (node) {
|
if (node) {
|
||||||
node.setActive(true, {noEvents: true});
|
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) {
|
updateTab($tab, note) {
|
||||||
if (!note || !$tab.length) {
|
if (!$tab.length) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.updateTitle($tab, note.title);
|
|
||||||
|
|
||||||
for (const clazz of Array.from($tab[0].classList)) { // create copy to safely iterate over while removing classes
|
for (const clazz of Array.from($tab[0].classList)) { // create copy to safely iterate over while removing classes
|
||||||
if (clazz !== 'note-tab') {
|
if (clazz !== 'note-tab') {
|
||||||
$tab.removeClass(clazz);
|
$tab.removeClass(clazz);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!note) {
|
||||||
|
this.updateTitle($tab, 'New tab');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.updateTitle($tab, note.title);
|
||||||
|
|
||||||
$tab.addClass(note.getCssClass());
|
$tab.addClass(note.getCssClass());
|
||||||
$tab.addClass(utils.getNoteTypeClass(note.type));
|
$tab.addClass(utils.getNoteTypeClass(note.type));
|
||||||
$tab.addClass(utils.getMimeTypeClass(note.mime));
|
$tab.addClass(utils.getMimeTypeClass(note.mime));
|
||||||
|
@ -22,6 +22,10 @@ const TPL = `
|
|||||||
.note-detail-readonly-text p:first-child, .note-detail-text::before {
|
.note-detail-readonly-text p:first-child, .note-detail-text::before {
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.note-detail-readonly-text img {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<div class="alert alert-warning no-print">
|
<div class="alert alert-warning no-print">
|
||||||
|
@ -221,6 +221,7 @@ async function transactional(func) {
|
|||||||
|
|
||||||
await commit();
|
await commit();
|
||||||
|
|
||||||
|
// note that sync rows sent from this action will be sent again by scheduled periodic ping
|
||||||
require('./ws.js').sendPingToAllClients();
|
require('./ws.js').sendPingToAllClients();
|
||||||
|
|
||||||
transactionActive = false;
|
transactionActive = false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user