mirror of
https://github.com/zadam/trilium.git
synced 2025-03-01 14:22:32 +01:00
fixes
This commit is contained in:
parent
42017fde5f
commit
d1bb62c40e
@ -1,8 +1,6 @@
|
||||
import server from "../../services/server.js";
|
||||
import utils from "../../services/utils.js";
|
||||
import cssLoader from "../../services/css_loader.js";
|
||||
import zoomService from "../../services/zoom.js";
|
||||
import optionsService from "../../services/options.js";
|
||||
import appContext from "../../services/app_context.js";
|
||||
|
||||
const TPL = `
|
||||
|
@ -34,7 +34,7 @@ import utils from "./utils.js";
|
||||
import treeService from "./tree.js";
|
||||
import SidePaneContainer from "../widgets/side_pane_container.js";
|
||||
import ZoomService from "./zoom.js";
|
||||
import SidebarToggle from "../widgets/sidebar_toggle.js";
|
||||
import SidepaneToggles from "../widgets/sidebar_toggle.js";
|
||||
|
||||
class AppContext {
|
||||
constructor() {
|
||||
@ -188,7 +188,7 @@ class AppContext {
|
||||
|
||||
$centerPane.after(rightPaneContainer.render());
|
||||
|
||||
const sidebarToggleWidget = new SidebarToggle(this);
|
||||
const sidebarToggleWidget = new SidepaneToggles(this);
|
||||
|
||||
$centerPane.after(sidebarToggleWidget.render());
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
import utils from "./utils.js";
|
||||
import zoomService from "./zoom.js";
|
||||
import treeService from "./tree.js";
|
||||
import dateNoteService from "./date_notes.js";
|
||||
import hoistedNoteService from "./hoisted_note.js";
|
||||
|
@ -1,4 +1,4 @@
|
||||
export class LoadResults {
|
||||
export default class LoadResults {
|
||||
constructor(treeCache) {
|
||||
this.treeCache = treeCache;
|
||||
|
||||
|
@ -2,10 +2,7 @@ import Branch from "../entities/branch.js";
|
||||
import NoteShort from "../entities/note_short.js";
|
||||
import Attribute from "../entities/attribute.js";
|
||||
import server from "./server.js";
|
||||
import {LoadResults} from "./load_results.js";
|
||||
import NoteComplement from "../entities/note_complement.js";
|
||||
import appContext from "./app_context.js";
|
||||
import options from "./options.js";
|
||||
|
||||
/**
|
||||
* TreeCache keeps a read only cache of note tree structure in frontend's memory.
|
||||
@ -229,137 +226,6 @@ class TreeCache {
|
||||
|
||||
return await this.noteComplementPromises[noteId];
|
||||
}
|
||||
|
||||
// FIXME does not actually belong here
|
||||
async processSyncRows(syncRows) {
|
||||
const loadResults = new LoadResults(this);
|
||||
|
||||
syncRows.filter(sync => sync.entityName === 'notes').forEach(sync => {
|
||||
const note = this.notes[sync.entityId];
|
||||
|
||||
if (note) {
|
||||
note.update(sync.entity);
|
||||
loadResults.addNote(sync.entityId, sync.sourceId);
|
||||
}
|
||||
});
|
||||
|
||||
syncRows.filter(sync => sync.entityName === 'branches').forEach(sync => {
|
||||
let branch = this.branches[sync.entityId];
|
||||
const childNote = this.notes[sync.entity.noteId];
|
||||
const parentNote = this.notes[sync.entity.parentNoteId];
|
||||
|
||||
if (branch) {
|
||||
if (sync.entity.isDeleted) {
|
||||
if (childNote) {
|
||||
childNote.parents = childNote.parents.filter(parentNoteId => parentNoteId !== sync.entity.parentNoteId);
|
||||
delete childNote.parentToBranch[sync.entity.parentNoteId];
|
||||
}
|
||||
|
||||
if (parentNote) {
|
||||
parentNote.children = parentNote.children.filter(childNoteId => childNoteId !== sync.entity.noteId);
|
||||
delete parentNote.childToBranch[sync.entity.noteId];
|
||||
}
|
||||
}
|
||||
else {
|
||||
branch.update(sync.entity);
|
||||
loadResults.addBranch(sync.entityId, sync.sourceId);
|
||||
|
||||
if (childNote) {
|
||||
childNote.addParent(branch.parentNoteId, branch.branchId);
|
||||
}
|
||||
|
||||
if (parentNote) {
|
||||
parentNote.addChild(branch.noteId, branch.branchId);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (!sync.entity.isDeleted) {
|
||||
if (childNote || parentNote) {
|
||||
branch = new Branch(this, sync.entity);
|
||||
this.branches[branch.branchId] = branch;
|
||||
|
||||
loadResults.addBranch(sync.entityId, sync.sourceId);
|
||||
|
||||
if (childNote) {
|
||||
childNote.addParent(branch.parentNoteId, branch.branchId);
|
||||
}
|
||||
|
||||
if (parentNote) {
|
||||
parentNote.addChild(branch.noteId, branch.branchId);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
syncRows.filter(sync => sync.entityName === 'note_reordering').forEach(sync => {
|
||||
for (const branchId in sync.positions) {
|
||||
const branch = this.branches[branchId];
|
||||
|
||||
if (branch) {
|
||||
branch.notePosition = sync.positions[branchId];
|
||||
}
|
||||
}
|
||||
|
||||
loadResults.addNoteReordering(sync.entityId, sync.sourceId);
|
||||
});
|
||||
|
||||
// missing reloading the relation target note
|
||||
syncRows.filter(sync => sync.entityName === 'attributes').forEach(sync => {
|
||||
let attribute = this.attributes[sync.entityId];
|
||||
const sourceNote = this.notes[sync.entity.noteId];
|
||||
const targetNote = sync.entity.type === 'relation' && this.notes[sync.entity.value];
|
||||
|
||||
if (attribute) {
|
||||
attribute.update(sync.entity);
|
||||
loadResults.addAttribute(sync.entityId, sync.sourceId);
|
||||
|
||||
if (sync.entity.isDeleted) {
|
||||
if (sourceNote) {
|
||||
sourceNote.attributes = sourceNote.attributes.filter(attributeId => attributeId !== attribute.attributeId);
|
||||
}
|
||||
|
||||
if (targetNote) {
|
||||
targetNote.targetRelations = targetNote.targetRelations.filter(attributeId => attributeId !== attribute.value);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (!sync.entity.isDeleted) {
|
||||
if (sourceNote || targetNote) {
|
||||
attribute = new Attribute(this, sync.entity);
|
||||
|
||||
this.attributes[attribute.attributeId] = attribute;
|
||||
|
||||
loadResults.addAttribute(sync.entityId, sync.sourceId);
|
||||
|
||||
if (sourceNote && !sourceNote.attributes.includes(attribute.attributeId)) {
|
||||
sourceNote.attributes.push(attribute.attributeId);
|
||||
}
|
||||
|
||||
if (targetNote && !targetNote.attributes.includes(attribute.attributeId)) {
|
||||
targetNote.attributes.push(attribute.attributeId);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
syncRows.filter(sync => sync.entityName === 'note_contents').forEach(sync => {
|
||||
delete this.noteComplementPromises[sync.entityId];
|
||||
|
||||
loadResults.addNoteContent(sync.entityId, sync.sourceId);
|
||||
});
|
||||
|
||||
syncRows.filter(sync => sync.entityName === 'note_revisions').forEach(sync => {
|
||||
loadResults.addNoteRevision(sync.entityId, sync.noteId, sync.sourceId);
|
||||
});
|
||||
|
||||
syncRows.filter(sync => sync.entityName === 'options').forEach(sync => {
|
||||
options.set(sync.entity.name, sync.entity.value);
|
||||
|
||||
loadResults.addOption(sync.entity.name);
|
||||
});
|
||||
|
||||
appContext.trigger('entitiesReloaded', {loadResults});
|
||||
}
|
||||
}
|
||||
|
||||
const treeCache = new TreeCache();
|
||||
|
@ -1,6 +1,10 @@
|
||||
import utils from './utils.js';
|
||||
import toastService from "./toast.js";
|
||||
import server from "./server.js";
|
||||
import LoadResults from "./load_results.js";
|
||||
import Branch from "../entities/branch.js";
|
||||
import Attribute from "../entities/attribute.js";
|
||||
import options from "./options.js";
|
||||
|
||||
const $outstandingSyncsCount = $("#outstanding-syncs-count");
|
||||
|
||||
@ -125,9 +129,7 @@ async function consumeSyncData() {
|
||||
syncDataQueue = [];
|
||||
|
||||
try {
|
||||
const treeCache = (await import("./tree_cache.js")).default;
|
||||
|
||||
await treeCache.processSyncRows(allSyncData);
|
||||
await processSyncRows(allSyncData);
|
||||
}
|
||||
catch (e) {
|
||||
logError(`Encountered error ${e.message}: ${e.stack}, reloading frontend.`);
|
||||
@ -197,6 +199,137 @@ subscribeToMessages(message => {
|
||||
}
|
||||
});
|
||||
|
||||
async function processSyncRows(syncRows) {
|
||||
const loadResults = new LoadResults(this);
|
||||
|
||||
syncRows.filter(sync => sync.entityName === 'notes').forEach(sync => {
|
||||
const note = this.notes[sync.entityId];
|
||||
|
||||
if (note) {
|
||||
note.update(sync.entity);
|
||||
loadResults.addNote(sync.entityId, sync.sourceId);
|
||||
}
|
||||
});
|
||||
|
||||
syncRows.filter(sync => sync.entityName === 'branches').forEach(sync => {
|
||||
let branch = this.branches[sync.entityId];
|
||||
const childNote = this.notes[sync.entity.noteId];
|
||||
const parentNote = this.notes[sync.entity.parentNoteId];
|
||||
|
||||
if (branch) {
|
||||
if (sync.entity.isDeleted) {
|
||||
if (childNote) {
|
||||
childNote.parents = childNote.parents.filter(parentNoteId => parentNoteId !== sync.entity.parentNoteId);
|
||||
delete childNote.parentToBranch[sync.entity.parentNoteId];
|
||||
}
|
||||
|
||||
if (parentNote) {
|
||||
parentNote.children = parentNote.children.filter(childNoteId => childNoteId !== sync.entity.noteId);
|
||||
delete parentNote.childToBranch[sync.entity.noteId];
|
||||
}
|
||||
}
|
||||
else {
|
||||
branch.update(sync.entity);
|
||||
loadResults.addBranch(sync.entityId, sync.sourceId);
|
||||
|
||||
if (childNote) {
|
||||
childNote.addParent(branch.parentNoteId, branch.branchId);
|
||||
}
|
||||
|
||||
if (parentNote) {
|
||||
parentNote.addChild(branch.noteId, branch.branchId);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (!sync.entity.isDeleted) {
|
||||
if (childNote || parentNote) {
|
||||
branch = new Branch(this, sync.entity);
|
||||
this.branches[branch.branchId] = branch;
|
||||
|
||||
loadResults.addBranch(sync.entityId, sync.sourceId);
|
||||
|
||||
if (childNote) {
|
||||
childNote.addParent(branch.parentNoteId, branch.branchId);
|
||||
}
|
||||
|
||||
if (parentNote) {
|
||||
parentNote.addChild(branch.noteId, branch.branchId);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
syncRows.filter(sync => sync.entityName === 'note_reordering').forEach(sync => {
|
||||
for (const branchId in sync.positions) {
|
||||
const branch = this.branches[branchId];
|
||||
|
||||
if (branch) {
|
||||
branch.notePosition = sync.positions[branchId];
|
||||
}
|
||||
}
|
||||
|
||||
loadResults.addNoteReordering(sync.entityId, sync.sourceId);
|
||||
});
|
||||
|
||||
// missing reloading the relation target note
|
||||
syncRows.filter(sync => sync.entityName === 'attributes').forEach(sync => {
|
||||
let attribute = this.attributes[sync.entityId];
|
||||
const sourceNote = this.notes[sync.entity.noteId];
|
||||
const targetNote = sync.entity.type === 'relation' && this.notes[sync.entity.value];
|
||||
|
||||
if (attribute) {
|
||||
attribute.update(sync.entity);
|
||||
loadResults.addAttribute(sync.entityId, sync.sourceId);
|
||||
|
||||
if (sync.entity.isDeleted) {
|
||||
if (sourceNote) {
|
||||
sourceNote.attributes = sourceNote.attributes.filter(attributeId => attributeId !== attribute.attributeId);
|
||||
}
|
||||
|
||||
if (targetNote) {
|
||||
targetNote.targetRelations = targetNote.targetRelations.filter(attributeId => attributeId !== attribute.value);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (!sync.entity.isDeleted) {
|
||||
if (sourceNote || targetNote) {
|
||||
attribute = new Attribute(this, sync.entity);
|
||||
|
||||
this.attributes[attribute.attributeId] = attribute;
|
||||
|
||||
loadResults.addAttribute(sync.entityId, sync.sourceId);
|
||||
|
||||
if (sourceNote && !sourceNote.attributes.includes(attribute.attributeId)) {
|
||||
sourceNote.attributes.push(attribute.attributeId);
|
||||
}
|
||||
|
||||
if (targetNote && !targetNote.attributes.includes(attribute.attributeId)) {
|
||||
targetNote.attributes.push(attribute.attributeId);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
syncRows.filter(sync => sync.entityName === 'note_contents').forEach(sync => {
|
||||
delete this.noteComplementPromises[sync.entityId];
|
||||
|
||||
loadResults.addNoteContent(sync.entityId, sync.sourceId);
|
||||
});
|
||||
|
||||
syncRows.filter(sync => sync.entityName === 'note_revisions').forEach(sync => {
|
||||
loadResults.addNoteRevision(sync.entityId, sync.noteId, sync.sourceId);
|
||||
});
|
||||
|
||||
syncRows.filter(sync => sync.entityName === 'options').forEach(sync => {
|
||||
options.set(sync.entity.name, sync.entity.value);
|
||||
|
||||
loadResults.addOption(sync.entity.name);
|
||||
});
|
||||
|
||||
const appContext = (await import("./app_context.js")).default;
|
||||
appContext.trigger('entitiesReloaded', {loadResults});
|
||||
}
|
||||
|
||||
export default {
|
||||
logError,
|
||||
subscribeToMessages,
|
||||
|
@ -18,11 +18,12 @@ const TPL = `
|
||||
|
||||
export default class HistoryNavigationWidget extends BasicWidget {
|
||||
doRender() {
|
||||
if (!utils.isElectron()) {
|
||||
return;
|
||||
if (utils.isElectron()) {
|
||||
this.$widget = $(TPL);
|
||||
}
|
||||
else {
|
||||
this.$widget = $("<div>");
|
||||
}
|
||||
|
||||
this.$widget = $(TPL);
|
||||
|
||||
return this.$widget;
|
||||
}
|
||||
|
@ -3,16 +3,16 @@ import splitService from "../services/split.js";
|
||||
import BasicWidget from "./basic_widget.js";
|
||||
|
||||
const TPL = `
|
||||
<div>
|
||||
<div class="hide-in-zen-mode">
|
||||
<style>
|
||||
#hide-right-pane-button, #show-right-pane-button {
|
||||
.hide-right-pane-button, .show-right-pane-button {
|
||||
position: fixed;
|
||||
bottom: 10px;
|
||||
right: 10px;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
#hide-left-pane-button, #show-left-pane-button {
|
||||
.hide-left-pane-button, .show-left-pane-button {
|
||||
position: fixed;
|
||||
bottom: 10px;
|
||||
left: 10px;
|
||||
@ -20,15 +20,15 @@ const TPL = `
|
||||
}
|
||||
</style>
|
||||
|
||||
<button id="hide-left-pane-button" class="btn btn-sm icon-button bx bx-chevrons-left hide-in-zen-mode" title="Show sidebar"></button>
|
||||
<button id="show-left-pane-button" class="btn btn-sm icon-button bx bx-chevrons-right hide-in-zen-mode" title="Hide sidebar"></button>
|
||||
<button class="hide-left-pane-button btn btn-sm icon-button bx bx-chevrons-left" title="Show sidebar"></button>
|
||||
<button class="show-left-pane-button btn btn-sm icon-button bx bx-chevrons-right" title="Hide sidebar"></button>
|
||||
|
||||
<button id="hide-right-pane-button" class="btn btn-sm icon-button bx bx-chevrons-right hide-in-zen-mode" title="Hide sidebar"></button>
|
||||
<button id="show-right-pane-button" class="btn btn-sm icon-button bx bx-chevrons-left hide-in-zen-mode" title="Show sidebar"></button>
|
||||
<button class="hide-right-pane-button btn btn-sm icon-button bx bx-chevrons-right" title="Hide sidebar"></button>
|
||||
<button class="show-right-pane-button btn btn-sm icon-button bx bx-chevrons-left" title="Show sidebar"></button>
|
||||
</div>
|
||||
`;
|
||||
|
||||
export default class SidebarToggle extends BasicWidget {
|
||||
export default class SidepaneToggles extends BasicWidget {
|
||||
constructor(appContext) {
|
||||
super(appContext);
|
||||
|
||||
@ -41,11 +41,11 @@ export default class SidebarToggle extends BasicWidget {
|
||||
this.toggleSidebar('left', options.is('leftPaneVisible'));
|
||||
this.toggleSidebar('right', options.is('rightPaneVisible'));
|
||||
|
||||
$("#show-right-pane-button").on('click', () => toggleAndSave('right', true));
|
||||
$("#hide-right-pane-button").on('click', () => toggleAndSave('right', false));
|
||||
this.$widget.find(".show-right-pane-button").on('click', () => this.toggleAndSave('right', true));
|
||||
this.$widget.find(".hide-right-pane-button").on('click', () => this.toggleAndSave('right', false));
|
||||
|
||||
$("#show-left-pane-button").on('click', () => toggleAndSave('left', true));
|
||||
$("#hide-left-pane-button").on('click', () => toggleAndSave('left', false));
|
||||
this.$widget.find(".show-left-pane-button").on('click', () => this.toggleAndSave('left', true));
|
||||
this.$widget.find(".hide-left-pane-button").on('click', () => this.toggleAndSave('left', false));
|
||||
|
||||
splitService.setupSplit(this.paneVisible.left, this.paneVisible.right);
|
||||
|
||||
@ -54,8 +54,8 @@ export default class SidebarToggle extends BasicWidget {
|
||||
|
||||
toggleSidebar(side, show) {
|
||||
$(`#${side}-pane`).toggle(show);
|
||||
$(`#show-${side}-pane-button`).toggle(!show);
|
||||
$(`#hide-${side}-pane-button`).toggle(show);
|
||||
this.$widget.find(`.show-${side}-pane-button`).toggle(!show);
|
||||
this.$widget.find(`.hide-${side}-pane-button`).toggle(show);
|
||||
|
||||
this.paneVisible[side] = show;
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
import BasicWidget from "./basic_widget.js";
|
||||
import HistoryNavigationWidget from "./history_navigation.js";
|
||||
import keyboardActionService from "../services/keyboard_actions.js";
|
||||
import protectedSessionService from "../services/protected_session.js";
|
||||
|
||||
const TPL = `
|
||||
|
@ -19,10 +19,6 @@ const TPL = `
|
||||
|
||||
export default class TitleBarButtonsWidget extends BasicWidget {
|
||||
doRender() {
|
||||
if (!utils.isElectron()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!options.is('nativeTitleBarVisible')) {
|
||||
this.$widget = $(TPL);
|
||||
this.$widget.show();
|
||||
|
Loading…
x
Reference in New Issue
Block a user