Compare commits

...

11 Commits

Author SHA1 Message Date
zadam
8c11d022fb release 0.48.7 2021-11-23 21:53:32 +01:00
Myzel394
24210ef80c fixed settings menu (#2374)
(cherry picked from commit 3f40a52f65)
2021-11-23 21:38:13 +01:00
zadam
2135aa058e increase sync version to 22 2021-11-21 16:16:28 +01:00
zadam
67542f448d fix total height / scrolling on mobile chrome/safari, closes #2367 2021-11-21 13:39:47 +01:00
zadam
08e9b59696 hide hidden subtree notes from search results, closes #2361 2021-11-20 21:01:37 +01:00
zadam
fe605c012a fix setting monospace font from theme 2021-11-20 13:20:06 +01:00
zadam
4c7c53d8c8 retry for OpenNoteButtonWidget 2021-11-20 12:49:12 +01:00
zadam
d345b7ed56 added entity changes check after sync check failure, fixed sync 2021-11-17 22:57:09 +01:00
zadam
298af217e9 fix bug overwriting entity changes 2021-11-17 21:47:41 +01:00
zadam
7d64f6a7dd increment lastProcessedEntityChangeId correctly 2021-11-16 22:12:53 +01:00
zadam
bc8b6284a6 fix exporting root note, closes #2346
(cherry picked from commit 20a187fab9)
2021-11-15 21:28:12 +01:00
18 changed files with 79 additions and 46 deletions

14
package-lock.json generated
View File

@@ -1,6 +1,6 @@
{ {
"name": "trilium", "name": "trilium",
"version": "0.48.4", "version": "0.48.6",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
@@ -2850,9 +2850,9 @@
} }
}, },
"electron": { "electron": {
"version": "13.6.1", "version": "13.6.2",
"resolved": "https://registry.npmjs.org/electron/-/electron-13.6.1.tgz", "resolved": "https://registry.npmjs.org/electron/-/electron-13.6.2.tgz",
"integrity": "sha512-rZ6Y7RberigruefQpWOiI4bA9ppyT88GQF8htY6N1MrAgal5RrBc+Mh92CcGU7zT9QO+XO3DarSgZafNTepffQ==", "integrity": "sha512-ZXx9t68yXftvNZVnQ7v2XHcnH+MPUF6LNStoz4MMXuWpkF9gq3qwjcYSqnbM4wiVkvWVHIyYvt1yemmStza9dQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@electron/get": "^1.0.1", "@electron/get": "^1.0.1",
@@ -2861,9 +2861,9 @@
}, },
"dependencies": { "dependencies": {
"@types/node": { "@types/node": {
"version": "14.17.32", "version": "14.17.33",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.32.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.33.tgz",
"integrity": "sha512-JcII3D5/OapPGx+eJ+Ik1SQGyt6WvuqdRfh9jUwL6/iHGjmyOriBDciBUu7lEIBTL2ijxwrR70WUnw5AEDmFvQ==", "integrity": "sha512-noEeJ06zbn3lOh4gqe2v7NMGS33jrulfNqYFDjjEbhpDEHR5VTxgYNQSBqBlJIsBJW3uEYDgD6kvMnrrhGzq8g==",
"dev": true "dev": true
} }
} }

View File

@@ -2,7 +2,7 @@
"name": "trilium", "name": "trilium",
"productName": "Trilium Notes", "productName": "Trilium Notes",
"description": "Trilium Notes", "description": "Trilium Notes",
"version": "0.48.6", "version": "0.48.7",
"license": "AGPL-3.0-only", "license": "AGPL-3.0-only",
"main": "electron.js", "main": "electron.js",
"bin": { "bin": {
@@ -81,7 +81,7 @@
}, },
"devDependencies": { "devDependencies": {
"cross-env": "7.0.3", "cross-env": "7.0.3",
"electron": "13.6.1", "electron": "13.6.2",
"electron-builder": "22.13.1", "electron-builder": "22.13.1",
"electron-packager": "15.4.0", "electron-packager": "15.4.0",
"electron-rebuild": "3.2.3", "electron-rebuild": "3.2.3",

View File

@@ -58,6 +58,9 @@ class Branch extends AbstractEntity {
} }
init() { init() {
this.becca.branches[this.branchId] = this;
this.becca.childParentToBranch[`${this.noteId}-${this.parentNoteId}`] = this;
if (this.branchId === 'root') { if (this.branchId === 'root') {
return; return;
} }
@@ -76,9 +79,6 @@ class Branch extends AbstractEntity {
if (!parentNote.children.includes(childNote)) { if (!parentNote.children.includes(childNote)) {
parentNote.children.push(childNote); parentNote.children.push(childNote);
} }
this.becca.branches[this.branchId] = this;
this.becca.childParentToBranch[`${this.noteId}-${this.parentNoteId}`] = this;
} }
/** @returns {Note} */ /** @returns {Note} */

View File

@@ -88,7 +88,7 @@ export default class MobileLayout {
return new FlexContainer('row').cssBlock(MOBILE_CSS) return new FlexContainer('row').cssBlock(MOBILE_CSS)
.setParent(appContext) .setParent(appContext)
.id('root-widget') .id('root-widget')
.css('height', '100vh') .css('height', '100%')
.child(new ScreenContainer("tree", 'column') .child(new ScreenContainer("tree", 'column')
.class("d-sm-flex d-md-flex d-lg-flex d-xl-flex col-12 col-sm-5 col-md-4 col-lg-4 col-xl-4") .class("d-sm-flex d-md-flex d-lg-flex d-xl-flex col-12 col-sm-5 col-md-4 col-lg-4 col-xl-4")
.css("max-height", "100%") .css("max-height", "100%")

View File

@@ -181,9 +181,9 @@ async function consumeFrontendUpdateData() {
for (const entityChange of nonProcessedEntityChanges) { for (const entityChange of nonProcessedEntityChanges) {
processedEntityChangeIds.add(entityChange.id); processedEntityChangeIds.add(entityChange.id);
}
lastProcessedEntityChangeId = Math.max(lastProcessedEntityChangeId, allEntityChanges[allEntityChanges.length - 1].id); lastProcessedEntityChangeId = Math.max(lastProcessedEntityChangeId, entityChange.id);
}
} }
checkEntityChangeIdListeners(); checkEntityChangeIdListeners();

View File

@@ -5,6 +5,18 @@ import froca from "../../services/froca.js";
export default class OpenNoteButtonWidget extends ButtonWidget { export default class OpenNoteButtonWidget extends ButtonWidget {
targetNote(noteId) { targetNote(noteId) {
froca.getNote(noteId).then(note => { froca.getNote(noteId).then(note => {
if (!note) {
console.log(`Note ${noteId} has not been found. This might happen on the first run before the target note is created.`);
if (!this.retried) {
this.retried = true;
setTimeout(() => this.targetNote(noteId), 15000); // should be higher than timeout for createMissingSpecialNotes
}
return;
}
this.icon(note.getIcon()); this.icon(note.getIcon());
this.title(note.title); this.title(note.title);

View File

@@ -7,7 +7,7 @@ export default class RootContainer extends FlexContainer {
super('row'); super('row');
this.id('root-widget'); this.id('root-widget');
this.css('height', '100vh'); this.css('height', '100%');
} }
refresh() { refresh() {

View File

@@ -150,6 +150,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget {
doRender() { doRender() {
this.$widget = $(TPL); this.$widget = $(TPL);
this.$tree = this.$widget.find('.tree'); this.$tree = this.$widget.find('.tree');
this.$treeActions = this.$widget.find(".tree-actions");
this.$tree.on("mousedown", ".unhoist-button", () => hoistedNoteService.unhoist()); this.$tree.on("mousedown", ".unhoist-button", () => hoistedNoteService.unhoist());
this.$tree.on("mousedown", ".refresh-search-button", e => this.refreshSearch(e)); this.$tree.on("mousedown", ".refresh-search-button", e => this.refreshSearch(e));
@@ -200,20 +201,16 @@ export default class NoteTreeWidget extends NoteContextAwareWidget {
this.$hideIncludedImages.prop("checked", this.hideIncludedImages); this.$hideIncludedImages.prop("checked", this.hideIncludedImages);
this.$autoCollapseNoteTree.prop("checked", this.autoCollapseNoteTree); this.$autoCollapseNoteTree.prop("checked", this.autoCollapseNoteTree);
let top = this.$treeSettingsButton[0].offsetTop; const top = this.$treeActions[0].offsetTop - (this.$treeSettingsPopup.outerHeight());
let left = this.$treeSettingsButton[0].offsetLeft; const left = Math.max(
top -= this.$treeSettingsPopup.outerHeight() + 10; 0,
left += this.$treeSettingsButton.outerWidth() - this.$treeSettingsPopup.outerWidth(); this.$treeActions[0].offsetLeft - this.$treeSettingsPopup.outerWidth() + this.$treeActions.outerWidth()
);
if (left < 0) {
left = 0;
}
this.$treeSettingsPopup.css({ this.$treeSettingsPopup.css({
display: "block", top,
top: top, left
left: left }).show();
}).addClass("show");
return false; return false;
}); });

View File

@@ -18,9 +18,11 @@ body {
on the last line of the editor. */ on the last line of the editor. */
position: fixed; position: fixed;
width: 100%; width: 100%;
height: 100%;
background-color: var(--main-background-color); background-color: var(--main-background-color);
color: var(--main-text-color); color: var(--main-text-color);
font-family: var(--main-font-family); font-family: var(--main-font-family);
font-size: var(--main-font-size);
} }
a, a:visited, a:hover { a, a:visited, a:hover {
@@ -58,7 +60,7 @@ table td, table th {
} }
code, kbd, pre, samp { code, kbd, pre, samp {
font-family: var(--monospace-font-family); font-family: var(--monospace-font-family) !important;
} }
.input-group-text { .input-group-text {
@@ -714,10 +716,6 @@ a.external:not(.no-arrow):after, a[href^="http://"]:not(.no-arrow):after, a[href
border-color: var(--main-border-color) !important; border-color: var(--main-border-color) !important;
} }
body {
font-size: var(--main-font-size);
}
.gutter { .gutter {
background: linear-gradient(to bottom, transparent, var(--accented-background-color), transparent); background: linear-gradient(to bottom, transparent, var(--accented-background-color), transparent);
} }

View File

@@ -204,6 +204,11 @@ function queueSector(req) {
entityChangesService.addEntityChangesForSector(entityName, sector); entityChangesService.addEntityChangesForSector(entityName, sector);
} }
function checkEntityChanges() {
const consistencyChecks = require("../../services/consistency_checks");
consistencyChecks.runEntityChangesChecks();
}
module.exports = { module.exports = {
testSync, testSync,
checkSync, checkSync,
@@ -215,5 +220,6 @@ module.exports = {
update, update,
getStats, getStats,
syncFinished, syncFinished,
queueSector queueSector,
checkEntityChanges
}; };

View File

@@ -294,6 +294,7 @@ function register(app) {
route(GET, '/api/sync/changed', [auth.checkApiAuth], syncApiRoute.getChanged, apiResultHandler); route(GET, '/api/sync/changed', [auth.checkApiAuth], syncApiRoute.getChanged, apiResultHandler);
route(PUT, '/api/sync/update', [auth.checkApiAuth], syncApiRoute.update, apiResultHandler); route(PUT, '/api/sync/update', [auth.checkApiAuth], syncApiRoute.update, apiResultHandler);
route(POST, '/api/sync/finished', [auth.checkApiAuth], syncApiRoute.syncFinished, apiResultHandler); route(POST, '/api/sync/finished', [auth.checkApiAuth], syncApiRoute.syncFinished, apiResultHandler);
route(POST, '/api/sync/check-entity-changes', [auth.checkApiAuth], syncApiRoute.checkEntityChanges, apiResultHandler);
route(POST, '/api/sync/queue-sector/:entityName/:sector', [auth.checkApiAuth], syncApiRoute.queueSector, apiResultHandler); route(POST, '/api/sync/queue-sector/:entityName/:sector', [auth.checkApiAuth], syncApiRoute.queueSector, apiResultHandler);
route(GET, '/api/sync/stats', [], syncApiRoute.getStats, apiResultHandler); route(GET, '/api/sync/stats', [], syncApiRoute.getStats, apiResultHandler);

View File

@@ -5,7 +5,7 @@ const packageJson = require('../../package');
const {TRILIUM_DATA_DIR} = require('./data_dir'); const {TRILIUM_DATA_DIR} = require('./data_dir');
const APP_DB_VERSION = 185; const APP_DB_VERSION = 185;
const SYNC_VERSION = 21; const SYNC_VERSION = 22;
const CLIPPER_PROTOCOL_VERSION = "1.0"; const CLIPPER_PROTOCOL_VERSION = "1.0";
module.exports = { module.exports = {

View File

@@ -1 +1 @@
module.exports = { buildDate:"2021-11-13T22:49:58+01:00", buildRevision: "c94603010630cfafe64575ab378c482bb39fb083" }; module.exports = { buildDate:"2021-11-23T21:53:32+01:00", buildRevision: "24210ef80c8585b64a00cd5316ae1c1563e0c9f7" };

View File

@@ -701,6 +701,11 @@ function runOnDemandChecks(autoFix) {
consistencyChecks.runChecks(); consistencyChecks.runChecks();
} }
function runEntityChangesChecks() {
const consistencyChecks = new ConsistencyChecks(true);
consistencyChecks.findEntityChangeIssues();
}
sqlInit.dbReady.then(() => { sqlInit.dbReady.then(() => {
setInterval(cls.wrap(runPeriodicChecks), 60 * 60 * 1000); setInterval(cls.wrap(runPeriodicChecks), 60 * 60 * 1000);
@@ -709,5 +714,6 @@ sqlInit.dbReady.then(() => {
}); });
module.exports = { module.exports = {
runOnDemandChecks runOnDemandChecks,
runEntityChangesChecks
}; };

View File

@@ -7,12 +7,10 @@ const becca = require("../becca/becca");
let maxEntityChangeId = 0; let maxEntityChangeId = 0;
function addEntityChange(origEntityChange, keepOriginalId = false) { function addEntityChange(origEntityChange) {
const ec = {...origEntityChange}; const ec = {...origEntityChange};
if (!keepOriginalId) { delete ec.id;
delete ec.id;
}
ec.sourceId = ec.sourceId || cls.getSourceId() || sourceIdService.getCurrentSourceId(); ec.sourceId = ec.sourceId || cls.getSourceId() || sourceIdService.getCurrentSourceId();
ec.isSynced = ec.isSynced ? 1 : 0; ec.isSynced = ec.isSynced ? 1 : 0;

View File

@@ -83,8 +83,12 @@ function findResultsWithExpression(expression, searchContext) {
throw new Error(`Can't find note path for note ${JSON.stringify(note.getPojo())}`); throw new Error(`Can't find note path for note ${JSON.stringify(note.getPojo())}`);
} }
if (notePathArray.includes("hidden")) {
return null;
}
return new SearchResult(notePathArray); return new SearchResult(notePathArray);
}); }).filter(Boolean);
for (const res of searchResults) { for (const res of searchResults) {
res.computeScore(searchContext.highlightedTokens); res.computeScore(searchContext.highlightedTokens);

View File

@@ -149,7 +149,10 @@ async function pullChanges(syncContext) {
sql.transactional(() => { sql.transactional(() => {
for (const {entityChange, entity} of entityChanges) { for (const {entityChange, entity} of entityChanges) {
if (!sourceIdService.isLocalSourceId(entityChange.sourceId)) { // FIXME: temporary fix
const existsAlready = !!sql.getValue("SELECT id FROM entity_changes WHERE entityName = ? AND entityId = ? AND utcDateChanged = ? AND hash = ?", [entityChange.entityName, entityChange.entityId, entityChange.utcDateChanged, entityChange.hash]);
if (!existsAlready && !sourceIdService.isLocalSourceId(entityChange.sourceId)) {
if (!atLeastOnePullApplied) { // send only for first if (!atLeastOnePullApplied) { // send only for first
ws.syncPullInProgress(); ws.syncPullInProgress();
@@ -249,6 +252,14 @@ async function checkContentHash(syncContext) {
const failedChecks = contentHashService.checkContentHashes(resp.entityHashes); const failedChecks = contentHashService.checkContentHashes(resp.entityHashes);
if (failedChecks.length > 0) {
// before requeuing sectors make sure the entity changes are correct
const consistencyChecks = require("./consistency_checks");
consistencyChecks.runEntityChangesChecks();
await syncRequest(syncContext, 'POST', `/api/sync/check-entity-changes`);
}
for (const {entityName, sector} of failedChecks) { for (const {entityName, sector} of failedChecks) {
entityChangesService.addEntityChangesForSector(entityName, sector); entityChangesService.addEntityChangesForSector(entityName, sector);

View File

@@ -54,7 +54,7 @@ function updateNormalEntity(remoteEntityChange, entity) {
sql.execute(`DELETE FROM ${remoteEntityChange.entityName} WHERE ${primaryKey} = ?`, remoteEntityChange.entityId); sql.execute(`DELETE FROM ${remoteEntityChange.entityName} WHERE ${primaryKey} = ?`, remoteEntityChange.entityId);
entityChangesService.addEntityChange(remoteEntityChange, true); entityChangesService.addEntityChange(remoteEntityChange);
}); });
return true; return true;
@@ -71,7 +71,7 @@ function updateNormalEntity(remoteEntityChange, entity) {
sql.transactional(() => { sql.transactional(() => {
sql.replace(remoteEntityChange.entityName, entity); sql.replace(remoteEntityChange.entityName, entity);
entityChangesService.addEntityChange(remoteEntityChange, true); entityChangesService.addEntityChange(remoteEntityChange);
}); });
return true; return true;
@@ -86,7 +86,7 @@ function updateNoteReordering(entityChange, entity) {
sql.execute("UPDATE branches SET notePosition = ? WHERE branchId = ?", [entity[key], key]); sql.execute("UPDATE branches SET notePosition = ? WHERE branchId = ?", [entity[key], key]);
} }
entityChangesService.addEntityChange(entityChange, true); entityChangesService.addEntityChange(entityChange);
}); });
return true; return true;