From 6b9d8f0d677763f29d29abd0816b1a5d40e858c8 Mon Sep 17 00:00:00 2001
From: Panagiotis Papadopoulos
Date: Tue, 11 Mar 2025 22:12:37 +0100
Subject: [PATCH 01/30] build(electron-forge): execute electron-forge commands
in our "build" output context
since we build TS and webpack ourselves and are not using any electron-forge plugins (at least at the moment) -> we should use the "build" folder as build context for electron-forge:
in comparison to running electron-forge in the root folder of the project, this avoids electron-forge from packing the source code multiple times (e.g. once as uncompiled TS, then as compiled JS, and then (partially) a third time as webpack bundled JS files), same as some of the assets.
to achieve this, we run our usual TS/Webpack build process, but then install the npm dependencies *inside* the build folder (as otherwise electron-forge would choke on the missing node_modules it and abort building).
In theory we could avoid cd-ing into the build folder, by providing the "dir" as argument to electron-forge's CLI -- BUT that wouldn't play well with our CI, where we are passing --arch and --platform options to it, which need to come *before* the dir argument.
since we now cd into the "build" folder, we also need to adjust the path in package.json "main" again
---
bin/copy-dist.ts | 1 +
package.json | 9 +++++----
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/bin/copy-dist.ts b/bin/copy-dist.ts
index 03b0c751b..a2bfa7f25 100644
--- a/bin/copy-dist.ts
+++ b/bin/copy-dist.ts
@@ -30,6 +30,7 @@ try {
"./package.json",
"./LICENSE",
"./README.md",
+ "./forge.config.cjs",
"./src/views/",
"./src/etapi/etapi.openapi.yaml",
"./src/routes/api/openapi.json",
diff --git a/package.json b/package.json
index c824c074b..85bbe0212 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,7 @@
"description": "Build your personal knowledge base with TriliumNext Notes",
"version": "0.92.3-beta",
"license": "AGPL-3.0-only",
- "main": "./build/electron-main.js",
+ "main": "./electron-main.js",
"author": {
"name": "TriliumNext Notes Team",
"email": "contact@eliandoran.me",
@@ -38,9 +38,10 @@
"electron:switch": "electron-rebuild",
"docs:edit": "cross-env NODE_OPTIONS=\"--import tsx\" TRILIUM_DATA_DIR=./data-docs TRILIUM_ENV=dev TRILIUM_PORT=37741 electron ./electron-docs-main.ts .",
"docs:edit-nix": "electron-rebuild --version 33.3.1 && cross-env NODE_OPTIONS=\"--import tsx\" TRILIUM_DATA_DIR=./data-docs TRILIUM_SYNC_SERVER_HOST=http://tsyncserver:4000 TRILIUM_PORT=37741 TRILIUM_ENV=dev nix-shell -p electron_33 --run \"electron ./electron-docs-main.ts .\"",
- "electron-forge:start": "npm run build:prepare-dist && electron-forge start",
- "electron-forge:make": "npm run build:prepare-dist && electron-forge make",
- "electron-forge:package": "npm run build:prepare-dist && electron-forge package",
+ "electron-forge:prepare": "npm run build:prepare-dist && npm ci --omit=dev --prefix ./build",
+ "electron-forge:start": "npm run electron-forge:prepare && cd ./build && electron-forge start",
+ "electron-forge:make": "npm run electron-forge:prepare && cd ./build && electron-forge make",
+ "electron-forge:package": "npm run electron-forge:prepare && cd ./build && electron-forge package",
"docs:build-backend": "rimraf ./docs/backend_api && typedoc ./docs/backend_api src/becca/entities/*.ts src/services/backend_script_api.ts src/services/sql.ts",
"docs:build-frontend": "rimraf ./docs/frontend_api && jsdoc -c jsdoc-conf.json -d ./docs/frontend_api src/public/app/entities/*.js src/public/app/services/frontend_script_api.js src/public/app/widgets/basic_widget.js src/public/app/widgets/note_context_aware_widget.js src/public/app/widgets/right_panel_widget.js",
"docs:build": "npm run docs:build-backend && npm run docs:build-frontend",
From 11772860b63707bba2f05b1bd3f6fdc83ddd458b Mon Sep 17 00:00:00 2001
From: Panagiotis Papadopoulos
Date: Tue, 11 Mar 2025 22:23:59 +0100
Subject: [PATCH 02/30] build(electron-forge): stop copying unused
.anonymize-database.sql as ressource
---
forge.config.cjs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/forge.config.cjs b/forge.config.cjs
index b2b72c4d0..11d8c1fbd 100644
--- a/forge.config.cjs
+++ b/forge.config.cjs
@@ -130,7 +130,7 @@ module.exports = {
};
function getExtraResourcesForPlatform() {
- const resources = ["./bin/tpl/anonymize-database.sql"];
+ const resources = [];
const getScriptRessources = () => {
const scripts = ["trilium-portable", "trilium-safe-mode", "trilium-no-cert-check"];
From 4ce2c10d72ceacf499f514a8f3fc764a3157a51e Mon Sep 17 00:00:00 2001
From: Panagiotis Papadopoulos
Date: Wed, 12 Mar 2025 09:24:10 +0100
Subject: [PATCH 03/30] build(copy-dist): copy over the start scripts for now
---
bin/copy-dist.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/bin/copy-dist.ts b/bin/copy-dist.ts
index a2bfa7f25..51364b2b9 100644
--- a/bin/copy-dist.ts
+++ b/bin/copy-dist.ts
@@ -31,6 +31,7 @@ try {
"./LICENSE",
"./README.md",
"./forge.config.cjs",
+ "./bin/tpl/",
"./src/views/",
"./src/etapi/etapi.openapi.yaml",
"./src/routes/api/openapi.json",
From 1877d262964af6c4ad6782fdaa4b7419ee9f413b Mon Sep 17 00:00:00 2001
From: Panagiotis Papadopoulos
Date: Wed, 12 Mar 2025 09:26:18 +0100
Subject: [PATCH 04/30] chore(scripts): electron-forge:prepare -> copy
node_modules folder as is
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
electron-forge does not like, if we get rid of devDeps ourselves already it seems.
It *wants* to do it itself, otherwise build fails…
It does seem to correctly strip all the devDeps though, at least there's that.
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 85bbe0212..5c1ffc4bb 100644
--- a/package.json
+++ b/package.json
@@ -38,7 +38,7 @@
"electron:switch": "electron-rebuild",
"docs:edit": "cross-env NODE_OPTIONS=\"--import tsx\" TRILIUM_DATA_DIR=./data-docs TRILIUM_ENV=dev TRILIUM_PORT=37741 electron ./electron-docs-main.ts .",
"docs:edit-nix": "electron-rebuild --version 33.3.1 && cross-env NODE_OPTIONS=\"--import tsx\" TRILIUM_DATA_DIR=./data-docs TRILIUM_SYNC_SERVER_HOST=http://tsyncserver:4000 TRILIUM_PORT=37741 TRILIUM_ENV=dev nix-shell -p electron_33 --run \"electron ./electron-docs-main.ts .\"",
- "electron-forge:prepare": "npm run build:prepare-dist && npm ci --omit=dev --prefix ./build",
+ "electron-forge:prepare": "npm run build:prepare-dist && cp -r node_modules ./build",
"electron-forge:start": "npm run electron-forge:prepare && cd ./build && electron-forge start",
"electron-forge:make": "npm run electron-forge:prepare && cd ./build && electron-forge make",
"electron-forge:package": "npm run electron-forge:prepare && cd ./build && electron-forge package",
From b48fbbe583f6143e9ee1964ee2cbce4415879a1f Mon Sep 17 00:00:00 2001
From: Panagiotis Papadopoulos
Date: Wed, 12 Mar 2025 09:36:06 +0100
Subject: [PATCH 05/30] build(copy-dist): copy over desktop.ejs for
electron-forge as well
it is required for Flatpak/Deb/RPM Linux packages
---
bin/copy-dist.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/bin/copy-dist.ts b/bin/copy-dist.ts
index 51364b2b9..b3f79ad56 100644
--- a/bin/copy-dist.ts
+++ b/bin/copy-dist.ts
@@ -32,6 +32,7 @@ try {
"./README.md",
"./forge.config.cjs",
"./bin/tpl/",
+ "./bin/electron-forge/desktop.ejs",
"./src/views/",
"./src/etapi/etapi.openapi.yaml",
"./src/routes/api/openapi.json",
From cc0931b4028fb72ceb98b87f16c5a5b568ff0668 Mon Sep 17 00:00:00 2001
From: Panagiotis Papadopoulos
Date: Thu, 13 Mar 2025 08:09:53 +0100
Subject: [PATCH 06/30] build(electron-forge): set outDir to ./dist, to have
the same behaviour as the Server builds
since we run electron-forge inside the ./build folder, we need to go up a directory (using ../dist), to have it output to ./dist
---
forge.config.cjs | 3 +++
1 file changed, 3 insertions(+)
diff --git a/forge.config.cjs b/forge.config.cjs
index 11d8c1fbd..dabcd7ca4 100644
--- a/forge.config.cjs
+++ b/forge.config.cjs
@@ -11,6 +11,9 @@ const baseLinuxMakerConfigOptions = {
};
module.exports = {
+ // we run electron-forge inside the ./build folder,
+ // to have it output to ./dist, we need to go up a directory first
+ outDir: "../dist",
packagerConfig: {
executableName: "trilium",
name: APP_NAME,
From 67c752c11b38078cf7e158fc8951d0908163357e Mon Sep 17 00:00:00 2001
From: Panagiotis Papadopoulos
Date: Thu, 13 Mar 2025 08:21:12 +0100
Subject: [PATCH 07/30] ci: adjust build-electron action to use the newly
introduced outDir "./dist" for electron-forge
---
.github/actions/build-electron/action.yml | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/.github/actions/build-electron/action.yml b/.github/actions/build-electron/action.yml
index b5a140efc..51b022bed 100644
--- a/.github/actions/build-electron/action.yml
+++ b/.github/actions/build-electron/action.yml
@@ -97,7 +97,7 @@ runs:
shell: bash
run: |
echo "Signing DMG file..."
- dmg_file=$(find out -name "*.dmg" -print -quit)
+ dmg_file=$(find ./dist -name "*.dmg" -print -quit)
if [ -n "$dmg_file" ]; then
echo "Found DMG: $dmg_file"
# Get the first valid signing identity from the keychain
@@ -125,7 +125,7 @@ runs:
# First check the .app bundle
echo "Looking for .app bundle..."
- app_bundle=$(find out -name "*.app" -print -quit)
+ app_bundle=$(find ./dist -name "*.app" -print -quit)
if [ -n "$app_bundle" ]; then
echo "Found app bundle: $app_bundle"
echo "Verifying app bundle signing..."
@@ -144,7 +144,7 @@ runs:
# Then check DMG if it exists
echo "Looking for DMG..."
- dmg_file=$(find out -name "*.dmg" -print -quit)
+ dmg_file=$(find ./dist -name "*.dmg" -print -quit)
if [ -n "$dmg_file" ]; then
echo "Found DMG: $dmg_file"
echo "Verifying DMG signing..."
@@ -160,7 +160,7 @@ runs:
# Finally check ZIP if it exists
echo "Looking for ZIP..."
- zip_file=$(find out -name "*.zip" -print -quit)
+ zip_file=$(find ./dist -name "*.zip" -print -quit)
if [ -n "$zip_file" ]; then
echo "Found ZIP: $zip_file"
echo "Note: ZIP files are not code signed, but their contents should be"
@@ -177,7 +177,7 @@ runs:
# Look for DMG files recursively
echo "Looking for DMG files..."
- dmg_file=$(find out -name "*.dmg" -print -quit)
+ dmg_file=$(find ./dist -name "*.dmg" -print -quit)
if [ -n "$dmg_file" ]; then
echo "Found DMG: $dmg_file"
cp "$dmg_file" "upload/TriliumNextNotes-${{ github.ref_name }}-macos-${{ inputs.arch }}.dmg"
@@ -187,7 +187,7 @@ runs:
# Look for ZIP files recursively
echo "Looking for ZIP files..."
- zip_file=$(find out -name "*.zip" -print -quit)
+ zip_file=$(find ./dist -name "*.zip" -print -quit)
if [ -n "$zip_file" ]; then
echo "Found ZIP: $zip_file"
cp "$zip_file" "upload/TriliumNextNotes-${{ github.ref_name }}-macos-${{ inputs.arch }}.zip"
@@ -199,7 +199,7 @@ runs:
echo "Collecting artifacts for ${{ inputs.os }}..."
for ext in ${{ inputs.extension }}; do
echo "Looking for .$ext files..."
- file=$(find out -name "*.$ext" -print -quit)
+ file=$(find ./dist -name "*.$ext" -print -quit)
if [ -n "$file" ]; then
echo "Found $file for extension $ext"
cp "$file" "upload/TriliumNextNotes-${{ github.ref_name }}-${{ inputs.os }}-${{ inputs.arch }}.$ext"
From 6a9342abce5213073c09e896169d8031bfac50e0 Mon Sep 17 00:00:00 2001
From: Panagiotis Papadopoulos
Date: Thu, 13 Mar 2025 08:31:07 +0100
Subject: [PATCH 08/30] build(Docker): add a temporary exception for files that
copy-dist tries to copy for electron-forge, as otherwise copy-dist will fail
inside Docker build
this will be fixed in an upcoming PR where I overhaul copy-dist to allow for build target specific copying of files
---
.dockerignore | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/.dockerignore b/.dockerignore
index 786c22ff9..a4e242a99 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -5,7 +5,6 @@
.prettier*
electron*
entitlements.plist
-forge.config.cjs
nodemon.json
renovate.json
trilium.iml
@@ -34,4 +33,10 @@ npm-debug.log
# exceptions
-!/bin/copy-dist.ts
\ No newline at end of file
+!/bin/copy-dist.ts
+
+# temporary exception to make copy-dist inside Docker build not fail
+# TriliumNextTODO: make copy-dist *not* requiring to copy this file for builds other than electron-forge
+!forge.config.cjs
+!/bin/tpl
+!/bin/electron-forge/desktop.ejs
\ No newline at end of file
From 1bf16bfa226e6bb8b8a618fb7129534828998bc9 Mon Sep 17 00:00:00 2001
From: Elian Doran
Date: Sat, 15 Mar 2025 21:20:44 +0200
Subject: [PATCH 09/30] feat(import/markdown): remove spaces in lists
---
src/services/import/markdown.spec.ts | 8 +++++++-
src/services/import/markdown.ts | 24 ++++++++++++++++++------
2 files changed, 25 insertions(+), 7 deletions(-)
diff --git a/src/services/import/markdown.spec.ts b/src/services/import/markdown.spec.ts
index 5d5ccd33c..b6cddcc2b 100644
--- a/src/services/import/markdown.spec.ts
+++ b/src/services/import/markdown.spec.ts
@@ -62,10 +62,16 @@ Title
code block 1
second line 2
\`\`\`
+
+* Hello
+* world
+
+1. Hello
+2. World
`;
const expected = `\
Heading 1 Title
code block 1
-second line 2 `;
+second line 2Hello World `;
expect(markdownService.renderToHtml(input, "Troubleshooting")).toBe(expected);
});
diff --git a/src/services/import/markdown.ts b/src/services/import/markdown.ts
index bff72e592..42462dfa2 100644
--- a/src/services/import/markdown.ts
+++ b/src/services/import/markdown.ts
@@ -2,6 +2,9 @@
import { parse, Renderer, type Tokens } from "marked";
+/**
+ * Keep renderer code up to date with https://github.com/markedjs/marked/blob/master/src/Renderer.ts.
+ */
class CustomMarkdownRenderer extends Renderer {
heading(data: Tokens.Heading): string {
@@ -12,13 +15,23 @@ class CustomMarkdownRenderer extends Renderer {
return super.paragraph(data).trimEnd();
}
- code({ text, lang, escaped }: Tokens.Code): string {
+ code({ text, lang }: Tokens.Code): string {
if (!text) {
- return "";
- }
+ return "";
+ }
- const ckEditorLanguage = getNormalizedMimeFromMarkdownLanguage(lang);
- return `${text} `;
+ const ckEditorLanguage = getNormalizedMimeFromMarkdownLanguage(lang);
+ return `${text} `;
+ }
+
+ list(token: Tokens.List): string {
+ return super.list(token)
+ .replace("\n", "") // we replace the first one only.
+ .trimEnd();
+ }
+
+ listitem(item: Tokens.ListItem): string {
+ return super.listitem(item).trimEnd();
}
blockquote({ tokens }: Tokens.Blockquote): string {
@@ -42,7 +55,6 @@ class CustomMarkdownRenderer extends Renderer {
}
-// Keep renderer code up to date with https://github.com/markedjs/marked/blob/master/src/Renderer.ts.
const renderer = new CustomMarkdownRenderer({ async: false });
import htmlSanitizer from "../html_sanitizer.js";
From 182bccad39ccd397826837b2ddc13d7f85de7c2e Mon Sep 17 00:00:00 2001
From: Elian Doran
Date: Sat, 15 Mar 2025 22:14:21 +0200
Subject: [PATCH 10/30] chore(client/ts): port some dialogs
---
src/public/app/services/import.ts | 14 ++++-----
...sword.js => protected_session_password.ts} | 9 ++++--
.../{recent_changes.js => recent_changes.ts} | 31 +++++++++++++------
...ort_child_notes.js => sort_child_notes.ts} | 7 ++++-
...d_attachments.js => upload_attachments.ts} | 28 ++++++++++++-----
5 files changed, 62 insertions(+), 27 deletions(-)
rename src/public/app/widgets/dialogs/{protected_session_password.js => protected_session_password.ts} (89%)
rename src/public/app/widgets/dialogs/{recent_changes.js => recent_changes.ts} (86%)
rename src/public/app/widgets/dialogs/{sort_child_notes.js => sort_child_notes.ts} (96%)
rename src/public/app/widgets/dialogs/{upload_attachments.js => upload_attachments.ts} (80%)
diff --git a/src/public/app/services/import.ts b/src/public/app/services/import.ts
index 0c6c25f11..453449e3c 100644
--- a/src/public/app/services/import.ts
+++ b/src/public/app/services/import.ts
@@ -6,15 +6,15 @@ import appContext from "../components/app_context.js";
import { t } from "./i18n.js";
interface UploadFilesOptions {
- safeImport: boolean;
- shrinkImages: boolean;
- textImportedAsText: boolean;
- codeImportedAsCode: boolean;
- explodeArchives: boolean;
- replaceUnderscoresWithSpaces: boolean;
+ safeImport?: boolean;
+ shrinkImages: "true" | "false";
+ textImportedAsText?: boolean;
+ codeImportedAsCode?: boolean;
+ explodeArchives?: boolean;
+ replaceUnderscoresWithSpaces?: boolean;
}
-export async function uploadFiles(entityType: string, parentNoteId: string, files: string[], options: UploadFilesOptions) {
+export async function uploadFiles(entityType: string, parentNoteId: string, files: string[] | File[], options: UploadFilesOptions) {
if (!["notes", "attachments"].includes(entityType)) {
throw new Error(`Unrecognized import entity type '${entityType}'.`);
}
diff --git a/src/public/app/widgets/dialogs/protected_session_password.js b/src/public/app/widgets/dialogs/protected_session_password.ts
similarity index 89%
rename from src/public/app/widgets/dialogs/protected_session_password.js
rename to src/public/app/widgets/dialogs/protected_session_password.ts
index 600a0f165..abc383624 100644
--- a/src/public/app/widgets/dialogs/protected_session_password.js
+++ b/src/public/app/widgets/dialogs/protected_session_password.ts
@@ -27,14 +27,19 @@ const TPL = `
`;
export default class ProtectedSessionPasswordDialog extends BasicWidget {
+
+ private modal!: bootstrap.Modal;
+ private $passwordForm!: JQuery;
+ private $passwordInput!: JQuery;
+
doRender() {
this.$widget = $(TPL);
- this.modal = Modal.getOrCreateInstance(this.$widget);
+ this.modal = Modal.getOrCreateInstance(this.$widget[0]);
this.$passwordForm = this.$widget.find(".protected-session-password-form");
this.$passwordInput = this.$widget.find(".protected-session-password");
this.$passwordForm.on("submit", () => {
- const password = this.$passwordInput.val();
+ const password = String(this.$passwordInput.val());
this.$passwordInput.val("");
protectedSessionService.setupProtectedSession(password);
diff --git a/src/public/app/widgets/dialogs/recent_changes.js b/src/public/app/widgets/dialogs/recent_changes.ts
similarity index 86%
rename from src/public/app/widgets/dialogs/recent_changes.js
rename to src/public/app/widgets/dialogs/recent_changes.ts
index 0d3cd9803..9961817b1 100644
--- a/src/public/app/widgets/dialogs/recent_changes.js
+++ b/src/public/app/widgets/dialogs/recent_changes.ts
@@ -1,6 +1,6 @@
import { formatDateTime } from "../../utils/formatters.js";
import { t } from "../../services/i18n.js";
-import appContext from "../../components/app_context.js";
+import appContext, { type EventData } from "../../components/app_context.js";
import BasicWidget from "../basic_widget.js";
import dialogService from "../../services/dialog.js";
import froca from "../../services/froca.js";
@@ -28,10 +28,23 @@ const TPL = `
`;
+// TODO: Deduplicate with server.
+interface RecentChangesRow {
+ noteId: string;
+ date: string;
+}
+
export default class RecentChangesDialog extends BasicWidget {
+
+ private ancestorNoteId?: string;
+
+ private modal!: bootstrap.Modal;
+ private $content!: JQuery;
+ private $eraseDeletedNotesNow!: JQuery;
+
doRender() {
this.$widget = $(TPL);
- this.modal = Modal.getOrCreateInstance(this.$widget);
+ this.modal = Modal.getOrCreateInstance(this.$widget[0]);
this.$content = this.$widget.find(".recent-changes-content");
this.$eraseDeletedNotesNow = this.$widget.find(".erase-deleted-notes-now-button");
@@ -44,7 +57,7 @@ export default class RecentChangesDialog extends BasicWidget {
});
}
- async showRecentChangesEvent({ ancestorNoteId }) {
+ async showRecentChangesEvent({ ancestorNoteId }: EventData<"showRecentChanges">) {
this.ancestorNoteId = ancestorNoteId;
await this.refresh();
@@ -57,7 +70,7 @@ export default class RecentChangesDialog extends BasicWidget {
this.ancestorNoteId = hoistedNoteService.getHoistedNoteId();
}
- const recentChangesRows = await server.get(`recent-changes/${this.ancestorNoteId}`);
+ const recentChangesRows = await server.get(`recent-changes/${this.ancestorNoteId}`);
// preload all notes into cache
await froca.getNotes(
@@ -110,7 +123,7 @@ export default class RecentChangesDialog extends BasicWidget {
}
} else {
const note = await froca.getNote(change.noteId);
- const notePath = note.getBestNotePathString();
+ const notePath = note?.getBestNotePathString();
if (notePath) {
$noteLink = await linkService.createLink(notePath, {
@@ -118,7 +131,7 @@ export default class RecentChangesDialog extends BasicWidget {
showNotePath: true
});
} else {
- $noteLink = $("").text(note.title);
+ $noteLink = $("").text(note?.title ?? "");
}
}
@@ -131,9 +144,7 @@ export default class RecentChangesDialog extends BasicWidget {
appContext.tabManager.getActiveContext().setNote(change.noteId);
}
})
- .addClass(() => {
- if (change.current_isDeleted) return "deleted-note";
- })
+ .toggleClass("deleted-note", !!change.current_isDeleted)
.append($("").text(formattedTime).attr("title", change.date))
.append($noteLink.addClass("note-title"))
);
@@ -143,7 +154,7 @@ export default class RecentChangesDialog extends BasicWidget {
}
}
- groupByDate(rows) {
+ groupByDate(rows: RecentChangesRow[]) {
const groupedByDate = new Map();
for (const row of rows) {
diff --git a/src/public/app/widgets/dialogs/sort_child_notes.js b/src/public/app/widgets/dialogs/sort_child_notes.ts
similarity index 96%
rename from src/public/app/widgets/dialogs/sort_child_notes.js
rename to src/public/app/widgets/dialogs/sort_child_notes.ts
index 3253b29c9..5549fadb8 100644
--- a/src/public/app/widgets/dialogs/sort_child_notes.js
+++ b/src/public/app/widgets/dialogs/sort_child_notes.ts
@@ -1,3 +1,4 @@
+import type { EventData } from "../../components/app_context.js";
import { t } from "../../services/i18n.js";
import server from "../../services/server.js";
import utils from "../../services/utils.js";
@@ -79,6 +80,10 @@ const TPL = ``;
export default class SortChildNotesDialog extends BasicWidget {
+
+ private parentNoteId?: string;
+ private $form!: JQuery
;
+
doRender() {
this.$widget = $(TPL);
this.$form = this.$widget.find(".sort-child-notes-form");
@@ -96,7 +101,7 @@ export default class SortChildNotesDialog extends BasicWidget {
});
}
- async sortChildNotesEvent({ node }) {
+ async sortChildNotesEvent({ node }: EventData<"sortChildNotes">) {
this.parentNoteId = node.data.noteId;
utils.openDialog(this.$widget);
diff --git a/src/public/app/widgets/dialogs/upload_attachments.js b/src/public/app/widgets/dialogs/upload_attachments.ts
similarity index 80%
rename from src/public/app/widgets/dialogs/upload_attachments.js
rename to src/public/app/widgets/dialogs/upload_attachments.ts
index 608bc1b45..a2ce8436e 100644
--- a/src/public/app/widgets/dialogs/upload_attachments.js
+++ b/src/public/app/widgets/dialogs/upload_attachments.ts
@@ -5,6 +5,7 @@ import importService from "../../services/import.js";
import options from "../../services/options.js";
import BasicWidget from "../basic_widget.js";
import { Modal, Tooltip } from "bootstrap";
+import type { EventData } from "../../components/app_context.js";
const TPL = `
@@ -42,6 +43,15 @@ const TPL = `
`;
export default class UploadAttachmentsDialog extends BasicWidget {
+
+ private parentNoteId: string | null;
+ private modal!: bootstrap.Modal;
+ private $form!: JQuery;
+ private $noteTitle!: JQuery;
+ private $fileUploadInput!: JQuery;
+ private $uploadButton!: JQuery;
+ private $shrinkImagesCheckbox!: JQuery;
+
constructor() {
super();
@@ -50,7 +60,7 @@ export default class UploadAttachmentsDialog extends BasicWidget {
doRender() {
this.$widget = $(TPL);
- this.modal = Modal.getOrCreateInstance(this.$widget);
+ this.modal = Modal.getOrCreateInstance(this.$widget[0]);
this.$form = this.$widget.find(".upload-attachment-form");
this.$noteTitle = this.$widget.find(".upload-attachment-note-title");
@@ -61,7 +71,9 @@ export default class UploadAttachmentsDialog extends BasicWidget {
this.$form.on("submit", () => {
// disabling so that import is not triggered again.
this.$uploadButton.attr("disabled", "disabled");
- this.uploadAttachments(this.parentNoteId);
+ if (this.parentNoteId) {
+ this.uploadAttachments(this.parentNoteId);
+ }
return false;
});
@@ -73,12 +85,12 @@ export default class UploadAttachmentsDialog extends BasicWidget {
}
});
- Tooltip.getOrCreateInstance(this.$widget.find('[data-bs-toggle="tooltip"]'), {
+ Tooltip.getOrCreateInstance(this.$widget.find('[data-bs-toggle="tooltip"]')[0], {
html: true
});
}
- async showUploadAttachmentsDialogEvent({ noteId }) {
+ async showUploadAttachmentsDialogEvent({ noteId }: EventData<"showUploadAttachmentsDialog">) {
this.parentNoteId = noteId;
this.$fileUploadInput.val("").trigger("change"); // to trigger upload button disabling listener below
@@ -89,10 +101,12 @@ export default class UploadAttachmentsDialog extends BasicWidget {
utils.openDialog(this.$widget);
}
- async uploadAttachments(parentNoteId) {
- const files = Array.from(this.$fileUploadInput[0].files); // shallow copy since we're resetting the upload button below
+ async uploadAttachments(parentNoteId: string) {
+ const files = Array.from(this.$fileUploadInput[0].files ?? []); // shallow copy since we're resetting the upload button below
- const boolToString = ($el) => ($el.is(":checked") ? "true" : "false");
+ function boolToString($el: JQuery): "true" | "false" {
+ return ($el.is(":checked") ? "true" : "false");
+ }
const options = {
shrinkImages: boolToString(this.$shrinkImagesCheckbox)
From 40d233dccceca288e3dd07fa3bdaa90474101a14 Mon Sep 17 00:00:00 2001
From: Elian Doran
Date: Sat, 15 Mar 2025 22:20:43 +0200
Subject: [PATCH 11/30] chore(deps): remove no longer necessary html-minifier
---
package-lock.json | 138 ----------------------------------------------
package.json | 2 -
2 files changed, 140 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 5203b393b..1d68efd74 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -20,7 +20,6 @@
"@mermaid-js/layout-elk": "0.1.7",
"@mind-elixir/node-menu": "1.0.4",
"@triliumnext/express-partial-content": "1.0.1",
- "@types/html-minifier": "4.0.5",
"archiver": "7.0.1",
"async-mutex": "0.5.0",
"autocomplete.js": "0.38.1",
@@ -53,7 +52,6 @@
"fs-extra": "11.3.0",
"helmet": "8.0.0",
"html": "1.0.0",
- "html-minifier": "4.0.0",
"html2plaintext": "2.1.4",
"http-proxy-agent": "7.0.2",
"https-proxy-agent": "7.0.6",
@@ -5247,16 +5245,6 @@
"@types/node": "*"
}
},
- "node_modules/@types/clean-css": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/@types/clean-css/-/clean-css-4.2.11.tgz",
- "integrity": "sha512-Y8n81lQVTAfP2TOdtJJEsCoYl1AnOkqDqMvXb9/7pfgZZ7r8YrEyurrAvAoAjHOGXKRybay+5CsExqIH6liccw==",
- "license": "MIT",
- "dependencies": {
- "@types/node": "*",
- "source-map": "^0.6.0"
- }
- },
"node_modules/@types/cls-hooked": {
"version": "4.3.9",
"resolved": "https://registry.npmjs.org/@types/cls-hooked/-/cls-hooked-4.3.9.tgz",
@@ -5705,17 +5693,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/@types/html-minifier": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/@types/html-minifier/-/html-minifier-4.0.5.tgz",
- "integrity": "sha512-LfE7f7MFd+YUfZnlBz8W43P4NgSObWiqyKapANsWCj63Aqeqli8/9gVsGP4CwC8jPpTTYlTopKCk9rJSuht/ew==",
- "license": "MIT",
- "dependencies": {
- "@types/clean-css": "*",
- "@types/relateurl": "*",
- "@types/uglify-js": "*"
- }
- },
"node_modules/@types/http-cache-semantics": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz",
@@ -5957,12 +5934,6 @@
"@types/node": "*"
}
},
- "node_modules/@types/relateurl": {
- "version": "0.2.33",
- "resolved": "https://registry.npmjs.org/@types/relateurl/-/relateurl-0.2.33.tgz",
- "integrity": "sha512-bTQCKsVbIdzLqZhLkF5fcJQreE4y1ro4DIyVrlDNSCJRRwHhB8Z+4zXXa8jN6eDvc2HbRsEYgbvrnGvi54EpSw==",
- "license": "MIT"
- },
"node_modules/@types/responselike": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz",
@@ -6133,15 +6104,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/@types/uglify-js": {
- "version": "3.17.5",
- "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.5.tgz",
- "integrity": "sha512-TU+fZFBTBcXj/GpDpDaBmgWk/gn96kMZ+uocaFUlV2f8a6WdMzzI44QBCmGcCiYR0Y6ZlNRiyUyKKt5nl/lbzQ==",
- "license": "MIT",
- "dependencies": {
- "source-map": "^0.6.1"
- }
- },
"node_modules/@types/unist": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
@@ -8080,16 +8042,6 @@
"node": ">=6"
}
},
- "node_modules/camel-case": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
- "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==",
- "license": "MIT",
- "dependencies": {
- "no-case": "^2.2.0",
- "upper-case": "^1.1.1"
- }
- },
"node_modules/caniuse-lite": {
"version": "1.0.30001703",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001703.tgz",
@@ -8331,18 +8283,6 @@
"license": "MIT",
"optional": true
},
- "node_modules/clean-css": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz",
- "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==",
- "license": "MIT",
- "dependencies": {
- "source-map": "~0.6.0"
- },
- "engines": {
- "node": ">= 4.0"
- }
- },
"node_modules/clean-stack": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
@@ -13034,33 +12974,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/html-minifier": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz",
- "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==",
- "license": "MIT",
- "dependencies": {
- "camel-case": "^3.0.0",
- "clean-css": "^4.2.1",
- "commander": "^2.19.0",
- "he": "^1.2.0",
- "param-case": "^2.1.1",
- "relateurl": "^0.2.7",
- "uglify-js": "^3.5.1"
- },
- "bin": {
- "html-minifier": "cli.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/html-minifier/node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "license": "MIT"
- },
"node_modules/html2plaintext": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/html2plaintext/-/html2plaintext-2.1.4.tgz",
@@ -14803,12 +14716,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/lower-case": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
- "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==",
- "license": "MIT"
- },
"node_modules/lowercase-keys": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
@@ -16032,15 +15939,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/no-case": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
- "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
- "license": "MIT",
- "dependencies": {
- "lower-case": "^1.1.1"
- }
- },
"node_modules/node-abi": {
"version": "3.71.0",
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz",
@@ -16671,15 +16569,6 @@
"wheel": "^1.0.0"
}
},
- "node_modules/param-case": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
- "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==",
- "license": "MIT",
- "dependencies": {
- "no-case": "^2.2.0"
- }
- },
"node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -18227,15 +18116,6 @@
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
"license": "MIT"
},
- "node_modules/relateurl": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
- "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.10"
- }
- },
"node_modules/repeat-string": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
@@ -20778,18 +20658,6 @@
"integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==",
"license": "MIT"
},
- "node_modules/uglify-js": {
- "version": "3.19.3",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
- "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==",
- "license": "BSD-2-Clause",
- "bin": {
- "uglifyjs": "bin/uglifyjs"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
"node_modules/uid-safe": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
@@ -20994,12 +20862,6 @@
"browserslist": ">= 4.21.0"
}
},
- "node_modules/upper-case": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
- "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==",
- "license": "MIT"
- },
"node_modules/uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
diff --git a/package.json b/package.json
index 9bfb61eff..5bd779ee4 100644
--- a/package.json
+++ b/package.json
@@ -79,7 +79,6 @@
"@mermaid-js/layout-elk": "0.1.7",
"@mind-elixir/node-menu": "1.0.4",
"@triliumnext/express-partial-content": "1.0.1",
- "@types/html-minifier": "4.0.5",
"archiver": "7.0.1",
"async-mutex": "0.5.0",
"autocomplete.js": "0.38.1",
@@ -112,7 +111,6 @@
"fs-extra": "11.3.0",
"helmet": "8.0.0",
"html": "1.0.0",
- "html-minifier": "4.0.0",
"html2plaintext": "2.1.4",
"http-proxy-agent": "7.0.2",
"https-proxy-agent": "7.0.6",
From 3c93fdc20275bda94ab9182fb8335451fb2570c2 Mon Sep 17 00:00:00 2001
From: Elian Doran
Date: Sat, 15 Mar 2025 22:39:33 +0200
Subject: [PATCH 12/30] feat(markdown/import): remove space in admonition
---
src/services/import/markdown.spec.ts | 2 +-
src/services/import/markdown.ts | 6 +++---
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/services/import/markdown.spec.ts b/src/services/import/markdown.spec.ts
index b6cddcc2b..18b11037b 100644
--- a/src/services/import/markdown.spec.ts
+++ b/src/services/import/markdown.spec.ts
@@ -99,7 +99,7 @@ second line 2Hello BeforeTitle goes here This is a warning.
After
`;
- expect(markdownService.renderToHtml(input, "Title")).toBe(expected);
+ expect(markdownService.renderToHtml(input, "Title")).toStrictEqual(expected);
});
});
diff --git a/src/services/import/markdown.ts b/src/services/import/markdown.ts
index 42462dfa2..c0677b5f1 100644
--- a/src/services/import/markdown.ts
+++ b/src/services/import/markdown.ts
@@ -43,14 +43,14 @@ class CustomMarkdownRenderer extends Renderer {
if (ADMONITION_TYPE_MAPPINGS[type]) {
const bodyWithoutHeader = body
- .replace(/^\[\!([A-Z]+)\]/, "
")
+ .replace(/^
\[\!([A-Z]+)\]\s*/, "
")
.replace(/^
<\/p>/, ""); // Having a heading will generate an empty paragraph that we need to remove.
- return `\n`;
+ return `${bodyWithoutHeader.trim()} `;
}
}
- return `
\n${body} \n`;
+ return `${body} `;
}
}
From 7b1299a75874f4e2a95ee6b683d19329895235f8 Mon Sep 17 00:00:00 2001
From: Elian Doran
Date: Sat, 15 Mar 2025 22:45:13 +0200
Subject: [PATCH 13/30] fix(client): error due to typings
---
src/public/app/services/import.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/public/app/services/import.ts b/src/public/app/services/import.ts
index 453449e3c..d33ad09fb 100644
--- a/src/public/app/services/import.ts
+++ b/src/public/app/services/import.ts
@@ -7,7 +7,7 @@ import { t } from "./i18n.js";
interface UploadFilesOptions {
safeImport?: boolean;
- shrinkImages: "true" | "false";
+ shrinkImages: boolean | "true" | "false";
textImportedAsText?: boolean;
codeImportedAsCode?: boolean;
explodeArchives?: boolean;
From bb14667bdfef3d8f8db027e39b29a787555dbaf8 Mon Sep 17 00:00:00 2001
From: Elian Doran
Date: Sat, 15 Mar 2025 23:12:07 +0200
Subject: [PATCH 14/30] fix(text): PHP, Sass, TypeScript/JSX not rendered in
code blocks
---
src/public/app/services/mime_type_definitions.ts | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/public/app/services/mime_type_definitions.ts b/src/public/app/services/mime_type_definitions.ts
index 1d44efbe6..26e7011b0 100644
--- a/src/public/app/services/mime_type_definitions.ts
+++ b/src/public/app/services/mime_type_definitions.ts
@@ -117,7 +117,7 @@ export const MIME_TYPES_DICT: readonly MimeTypeDefinition[] = Object.freeze([
{ title: "PEG.js", mime: "null" },
{ title: "Perl", mime: "text/x-perl", default: true },
{ title: "PGP", mime: "application/pgp" },
- { title: "PHP", mime: "text/x-php", default: true },
+ { title: "PHP", mime: "text/x-php", default: true, highlightJs: "php" },
{ title: "Pig", mime: "text/x-pig" },
{ title: "PLSQL", mime: "text/x-plsql", highlightJs: "sql" },
{ title: "PostgreSQL", mime: "text/x-pgsql", highlightJs: "pgsql" },
@@ -135,7 +135,7 @@ export const MIME_TYPES_DICT: readonly MimeTypeDefinition[] = Object.freeze([
{ title: "Ruby", mime: "text/x-ruby", highlightJs: "ruby", default: true },
{ title: "Rust", mime: "text/x-rustsrc", highlightJs: "rust" },
{ title: "SAS", mime: "text/x-sas", highlightJs: "sas" },
- { title: "Sass", mime: "text/x-sass" },
+ { title: "Sass", mime: "text/x-sass", highlightJs: "scss" },
{ title: "Scala", mime: "text/x-scala" },
{ title: "Scheme", mime: "text/x-scheme" },
{ title: "SCSS", mime: "text/x-scss", highlightJs: "scss" },
@@ -169,7 +169,7 @@ export const MIME_TYPES_DICT: readonly MimeTypeDefinition[] = Object.freeze([
{ title: "TTCN", mime: "text/x-ttcn" },
{ title: "Turtle", mime: "text/turtle" },
{ title: "Twig", mime: "text/x-twig", highlightJs: "twig" },
- { title: "TypeScript-JSX", mime: "text/typescript-jsx" },
+ { title: "TypeScript-JSX", mime: "text/typescript-jsx", highlightJs: "typescript" },
{ title: "TypeScript", mime: "application/typescript", highlightJs: "typescript" },
{ title: "VB.NET", mime: "text/x-vb", highlightJs: "vbnet" },
{ title: "VBScript", mime: "text/vbscript", highlightJs: "vbscript" },
From 2828b39f4872762c6d85115a43bd21534f9465bc Mon Sep 17 00:00:00 2001
From: Elian Doran
Date: Sun, 16 Mar 2025 00:45:46 +0200
Subject: [PATCH 15/30] chore(client/ts): port some more files
---
src/public/app/components/entrypoints.ts | 2 +-
src/public/app/services/branches.ts | 2 +-
.../{search_result.js => search_result.ts} | 27 ++++++++------
.../{shared_info.js => shared_info.ts} | 16 ++++++---
.../{shared_switch.js => shared_switch.ts} | 19 +++++++---
.../widgets/{sql_result.js => sql_result.ts} | 7 +++-
..._table_schemas.js => sql_table_schemas.ts} | 18 ++++++++--
src/public/app/widgets/switch.ts | 2 +-
...le_bar_buttons.js => title_bar_buttons.ts} | 0
.../type_widgets/{empty.js => empty.ts} | 14 +++++---
.../type_widgets/{image.js => image.ts} | 20 +++++++----
.../type_widgets/{render.js => render.ts} | 12 +++++--
...tatus.js => watched_file_update_status.ts} | 36 ++++++++++++++-----
13 files changed, 125 insertions(+), 50 deletions(-)
rename src/public/app/widgets/{search_result.js => search_result.ts} (75%)
rename src/public/app/widgets/{shared_info.js => shared_info.ts} (82%)
rename src/public/app/widgets/{shared_switch.js => shared_switch.ts} (76%)
rename src/public/app/widgets/{sql_result.js => sql_result.ts} (89%)
rename src/public/app/widgets/{sql_table_schemas.js => sql_table_schemas.ts} (84%)
rename src/public/app/widgets/{title_bar_buttons.js => title_bar_buttons.ts} (100%)
rename src/public/app/widgets/type_widgets/{empty.js => empty.ts} (92%)
rename src/public/app/widgets/type_widgets/{image.js => image.ts} (82%)
rename src/public/app/widgets/type_widgets/{render.js => render.ts} (78%)
rename src/public/app/widgets/{watched_file_update_status.js => watched_file_update_status.ts} (71%)
diff --git a/src/public/app/components/entrypoints.ts b/src/public/app/components/entrypoints.ts
index 69651de17..d4c8b600e 100644
--- a/src/public/app/components/entrypoints.ts
+++ b/src/public/app/components/entrypoints.ts
@@ -13,7 +13,7 @@ import { t } from "../services/i18n.js";
import type FNote from "../entities/fnote.js";
// TODO: Move somewhere else nicer.
-export type SqlExecuteResults = unknown[];
+export type SqlExecuteResults = string[][][];
// TODO: Deduplicate with server.
interface SqlExecuteResponse {
diff --git a/src/public/app/services/branches.ts b/src/public/app/services/branches.ts
index 18bae3529..b6f562f7c 100644
--- a/src/public/app/services/branches.ts
+++ b/src/public/app/services/branches.ts
@@ -252,7 +252,7 @@ async function cloneNoteToBranch(childNoteId: string, parentBranchId: string, pr
}
}
-async function cloneNoteToParentNote(childNoteId: string, parentNoteId: string, prefix: string) {
+async function cloneNoteToParentNote(childNoteId: string, parentNoteId: string, prefix?: string) {
const resp = await server.put(`notes/${childNoteId}/clone-to-note/${parentNoteId}`, {
prefix: prefix
});
diff --git a/src/public/app/widgets/search_result.js b/src/public/app/widgets/search_result.ts
similarity index 75%
rename from src/public/app/widgets/search_result.js
rename to src/public/app/widgets/search_result.ts
index d18efff18..d1f72f08b 100644
--- a/src/public/app/widgets/search_result.js
+++ b/src/public/app/widgets/search_result.ts
@@ -1,6 +1,8 @@
import { t } from "../services/i18n.js";
import NoteContextAwareWidget from "./note_context_aware_widget.js";
import NoteListRenderer from "../services/note_list_renderer.js";
+import type FNote from "../entities/fnote.js";
+import type { EventData } from "../components/app_context.js";
const TPL = `
`;
export default class SearchResultWidget extends NoteContextAwareWidget {
+
+ private $content!: JQuery;
+ private $noResults!: JQuery;
+ private $notExecutedYet!: JQuery;
+
isEnabled() {
- return super.isEnabled() && this.note.type === "search";
+ return super.isEnabled() && this.note?.type === "search";
}
doRender() {
@@ -47,7 +54,7 @@ export default class SearchResultWidget extends NoteContextAwareWidget {
this.$notExecutedYet = this.$widget.find(".search-not-executed-yet");
}
- async refreshWithNote(note) {
+ async refreshWithNote(note: FNote) {
this.$content.empty();
this.$noResults.toggle(note.getChildNoteIds().length === 0 && !!note.searchResultsLoaded);
this.$notExecutedYet.toggle(!note.searchResultsLoaded);
@@ -56,7 +63,7 @@ export default class SearchResultWidget extends NoteContextAwareWidget {
await noteListRenderer.renderList();
}
- searchRefreshedEvent({ ntxId }) {
+ searchRefreshedEvent({ ntxId }: EventData<"searchRefreshed">) {
if (!this.isNoteContext(ntxId)) {
return;
}
@@ -64,8 +71,8 @@ export default class SearchResultWidget extends NoteContextAwareWidget {
this.refresh();
}
- notesReloadedEvent({ noteIds }) {
- if (noteIds.includes(this.noteId)) {
+ notesReloadedEvent({ noteIds }: EventData<"notesReloaded">) {
+ if (this.noteId && noteIds.includes(this.noteId)) {
this.refresh();
}
}
diff --git a/src/public/app/widgets/shared_info.js b/src/public/app/widgets/shared_info.ts
similarity index 82%
rename from src/public/app/widgets/shared_info.js
rename to src/public/app/widgets/shared_info.ts
index e80a5d760..64b5c568f 100644
--- a/src/public/app/widgets/shared_info.js
+++ b/src/public/app/widgets/shared_info.ts
@@ -2,6 +2,8 @@ import NoteContextAwareWidget from "./note_context_aware_widget.js";
import options from "../services/options.js";
import attributeService from "../services/attributes.js";
import { t } from "../services/i18n.js";
+import type FNote from "../entities/fnote.js";
+import type { EventData } from "../components/app_context.js";
const TPL = `
@@ -18,8 +20,12 @@ const TPL = `
`;
export default class SharedInfoWidget extends NoteContextAwareWidget {
+
+ private $sharedLink!: JQuery;
+ private $sharedText!: JQuery;
+
isEnabled() {
- return super.isEnabled() && this.noteId !== "_share" && this.note.hasAncestor("_share");
+ return super.isEnabled() && this.noteId !== "_share" && this.note?.hasAncestor("_share");
}
doRender() {
@@ -29,7 +35,7 @@ export default class SharedInfoWidget extends NoteContextAwareWidget {
this.contentSized();
}
- async refreshWithNote(note) {
+ async refreshWithNote(note: FNote) {
const syncServerHost = options.get("syncServerHost");
let link;
@@ -53,7 +59,7 @@ export default class SharedInfoWidget extends NoteContextAwareWidget {
this.$sharedLink.attr("href", link).text(link);
}
- getShareId(note) {
+ getShareId(note: FNote) {
if (note.hasOwnedLabel("shareRoot")) {
return "";
}
@@ -61,8 +67,8 @@ export default class SharedInfoWidget extends NoteContextAwareWidget {
return note.getOwnedLabelValue("shareAlias") || note.noteId;
}
- entitiesReloadedEvent({ loadResults }) {
- if (loadResults.getAttributeRows().find((attr) => attr.name.startsWith("_share") && attributeService.isAffecting(attr, this.note))) {
+ entitiesReloadedEvent({ loadResults }: EventData<"entitiesReloaded">) {
+ if (loadResults.getAttributeRows().find((attr) => attr.name?.startsWith("_share") && attributeService.isAffecting(attr, this.note))) {
this.refresh();
} else if (loadResults.getBranchRows().find((branch) => branch.noteId === this.noteId)) {
this.refresh();
diff --git a/src/public/app/widgets/shared_switch.js b/src/public/app/widgets/shared_switch.ts
similarity index 76%
rename from src/public/app/widgets/shared_switch.js
rename to src/public/app/widgets/shared_switch.ts
index 90d2e7e9e..20e954efa 100644
--- a/src/public/app/widgets/shared_switch.js
+++ b/src/public/app/widgets/shared_switch.ts
@@ -5,10 +5,15 @@ import utils from "../services/utils.js";
import syncService from "../services/sync.js";
import dialogService from "../services/dialog.js";
import { t } from "../services/i18n.js";
+import type FNote from "../entities/fnote.js";
+import type { EventData } from "../components/app_context.js";
export default class SharedSwitchWidget extends SwitchWidget {
+
isEnabled() {
- return super.isEnabled() && !["root", "_share", "_hidden"].includes(this.noteId) && !this.noteId.startsWith("_options");
+ return super.isEnabled()
+ && !["root", "_share", "_hidden"].includes(this.noteId ?? "")
+ && !this.noteId?.startsWith("_options");
}
doRender() {
@@ -25,19 +30,23 @@ export default class SharedSwitchWidget extends SwitchWidget {
}
async switchOn() {
+ if (!this.noteId) {
+ return;
+ }
+
await branchService.cloneNoteToParentNote(this.noteId, "_share");
syncService.syncNow(true);
}
async switchOff() {
- const shareBranch = this.note.getParentBranches().find((b) => b.parentNoteId === "_share");
+ const shareBranch = this.note?.getParentBranches().find((b) => b.parentNoteId === "_share");
if (!shareBranch) {
return;
}
- if (this.note.getParentBranches().length === 1) {
+ if (this.note?.getParentBranches().length === 1) {
if (!(await dialogService.confirm(t("shared_switch.shared-branch")))) {
return;
}
@@ -48,7 +57,7 @@ export default class SharedSwitchWidget extends SwitchWidget {
syncService.syncNow(true);
}
- async refreshWithNote(note) {
+ async refreshWithNote(note: FNote) {
const isShared = note.hasAncestor("_share");
const canBeUnshared = isShared && note.getParentBranches().find((b) => b.parentNoteId === "_share");
const switchDisabled = isShared && !canBeUnshared;
@@ -64,7 +73,7 @@ export default class SharedSwitchWidget extends SwitchWidget {
}
}
- entitiesReloadedEvent({ loadResults }) {
+ entitiesReloadedEvent({ loadResults }: EventData<"entitiesReloaded">) {
if (loadResults.getBranchRows().find((b) => b.noteId === this.noteId)) {
this.refresh();
}
diff --git a/src/public/app/widgets/sql_result.js b/src/public/app/widgets/sql_result.ts
similarity index 89%
rename from src/public/app/widgets/sql_result.js
rename to src/public/app/widgets/sql_result.ts
index 7fcbff440..a75dcb9c4 100644
--- a/src/public/app/widgets/sql_result.js
+++ b/src/public/app/widgets/sql_result.ts
@@ -1,3 +1,4 @@
+import type { EventData } from "../components/app_context.js";
import { t } from "../services/i18n.js";
import NoteContextAwareWidget from "./note_context_aware_widget.js";
@@ -21,6 +22,10 @@ const TPL = `
`;
export default class SqlResultWidget extends NoteContextAwareWidget {
+
+ private $resultContainer!: JQuery;
+ private $noRowsAlert!: JQuery;
+
isEnabled() {
return this.note && this.note.mime === "text/x-sqlite;schema=trilium" && super.isEnabled();
}
@@ -32,7 +37,7 @@ export default class SqlResultWidget extends NoteContextAwareWidget {
this.$noRowsAlert = this.$widget.find(".sql-query-no-rows");
}
- async sqlQueryResultsEvent({ ntxId, results }) {
+ async sqlQueryResultsEvent({ ntxId, results }: EventData<"sqlQueryResults">) {
if (!this.isNoteContext(ntxId)) {
return;
}
diff --git a/src/public/app/widgets/sql_table_schemas.js b/src/public/app/widgets/sql_table_schemas.ts
similarity index 84%
rename from src/public/app/widgets/sql_table_schemas.js
rename to src/public/app/widgets/sql_table_schemas.ts
index e5fafb01f..e21fc8abc 100644
--- a/src/public/app/widgets/sql_table_schemas.js
+++ b/src/public/app/widgets/sql_table_schemas.ts
@@ -1,6 +1,7 @@
import { t } from "../services/i18n.js";
import NoteContextAwareWidget from "./note_context_aware_widget.js";
import server from "../services/server.js";
+import type FNote from "../entities/fnote.js";
const TPL = `
@@ -38,7 +39,19 @@ const TPL = `
`;
+interface SchemaResponse {
+ name: string;
+ columns: {
+ name: string;
+ type: string;
+ }[];
+}
+
export default class SqlTableSchemasWidget extends NoteContextAwareWidget {
+
+ private tableSchemasShown?: boolean;
+ private $sqlConsoleTableSchemas!: JQuery;
+
isEnabled() {
return this.note && this.note.mime === "text/x-sqlite;schema=trilium" && super.isEnabled();
}
@@ -50,14 +63,14 @@ export default class SqlTableSchemasWidget extends NoteContextAwareWidget {
this.$sqlConsoleTableSchemas = this.$widget.find(".sql-table-schemas");
}
- async refreshWithNote(note) {
+ async refreshWithNote(note: FNote) {
if (this.tableSchemasShown) {
return;
}
this.tableSchemasShown = true;
- const tableSchema = await server.get("sql/schema");
+ const tableSchema = await server.get("sql/schema");
for (const table of tableSchema) {
const $tableLink = $('').text(table.name);
@@ -73,7 +86,6 @@ export default class SqlTableSchemasWidget extends NoteContextAwareWidget {
$tableLink.tooltip({
html: true,
placement: "bottom",
- boundary: "window",
title: $table[0].outerHTML,
sanitize: false
});
diff --git a/src/public/app/widgets/switch.ts b/src/public/app/widgets/switch.ts
index 63fd23fce..9e7d61bf1 100644
--- a/src/public/app/widgets/switch.ts
+++ b/src/public/app/widgets/switch.ts
@@ -131,7 +131,7 @@ export default class SwitchWidget extends NoteContextAwareWidget {
protected switchOffName = "";
protected switchOffTooltip = "";
- private disabledTooltip = "";
+ protected disabledTooltip = "";
private currentState = false;
diff --git a/src/public/app/widgets/title_bar_buttons.js b/src/public/app/widgets/title_bar_buttons.ts
similarity index 100%
rename from src/public/app/widgets/title_bar_buttons.js
rename to src/public/app/widgets/title_bar_buttons.ts
diff --git a/src/public/app/widgets/type_widgets/empty.js b/src/public/app/widgets/type_widgets/empty.ts
similarity index 92%
rename from src/public/app/widgets/type_widgets/empty.js
rename to src/public/app/widgets/type_widgets/empty.ts
index fa73ea5ff..8338f53ae 100644
--- a/src/public/app/widgets/type_widgets/empty.js
+++ b/src/public/app/widgets/type_widgets/empty.ts
@@ -3,6 +3,7 @@ import TypeWidget from "./type_widget.js";
import appContext from "../../components/app_context.js";
import searchService from "../../services/search.js";
import { t } from "../../services/i18n.js";
+import type FNote from "../../entities/fnote.js";
const TPL = `
@@ -13,7 +14,7 @@ const TPL = `
flex-wrap: wrap;
justify-content: space-evenly;
}
-
+
.workspace-notes .workspace-note {
width: 130px;
text-align: center;
@@ -40,7 +41,7 @@ const TPL = `
.empty-tab-search .input-clearer-button {
border-bottom-right-radius: 0;
}
-
+
.workspace-icon {
text-align: center;
font-size: 500%;
@@ -58,6 +59,11 @@ const TPL = `
`;
export default class EmptyTypeWidget extends TypeWidget {
+
+ private $autoComplete!: JQuery;
+ private $results!: JQuery;
+ private $workspaceNotes!: JQuery;
+
static getType() {
return "empty";
}
@@ -74,7 +80,7 @@ export default class EmptyTypeWidget extends TypeWidget {
hideGoToSelectedNoteButton: true,
allowCreatingNotes: true,
allowJumpToSearchNotes: true,
- container: this.$results
+ container: this.$results[0]
})
.on("autocomplete:noteselected", function (event, suggestion, dataset) {
if (!suggestion.notePath) {
@@ -90,7 +96,7 @@ export default class EmptyTypeWidget extends TypeWidget {
super.doRender();
}
- async doRefresh(note) {
+ async doRefresh(note: FNote) {
const workspaceNotes = await searchService.searchForNotes("#workspace #!template");
this.$workspaceNotes.empty();
diff --git a/src/public/app/widgets/type_widgets/image.js b/src/public/app/widgets/type_widgets/image.ts
similarity index 82%
rename from src/public/app/widgets/type_widgets/image.js
rename to src/public/app/widgets/type_widgets/image.ts
index 208c1c1ad..e235abaef 100644
--- a/src/public/app/widgets/type_widgets/image.js
+++ b/src/public/app/widgets/type_widgets/image.ts
@@ -3,6 +3,8 @@ import TypeWidget from "./type_widget.js";
import libraryLoader from "../../services/library_loader.js";
import imageContextMenuService from "../../menus/image_context_menu.js";
import imageService from "../../services/image.js";
+import type FNote from "../../entities/fnote.js";
+import type { EventData } from "../../components/app_context.js";
const TPL = `
@@ -10,11 +12,11 @@ const TPL = `
.type-image .note-detail {
height: 100%;
}
-
+
.note-detail-image {
- height: 100%;
+ height: 100%;
}
-
+
.note-detail-image-wrapper {
position: relative;
display: flex;
@@ -23,7 +25,7 @@ const TPL = `
justify-content: center;
height: 100%;
}
-
+
.note-detail-image-view {
display: block;
width: auto;
@@ -39,6 +41,10 @@ const TPL = `
`;
class ImageTypeWidget extends TypeWidget {
+
+ private $imageWrapper!: JQuery;
+ private $imageView!: JQuery;
+
static getType() {
return "image";
}
@@ -61,11 +67,11 @@ class ImageTypeWidget extends TypeWidget {
super.doRender();
}
- async doRefresh(note) {
+ async doRefresh(note: FNote) {
this.$imageView.prop("src", utils.createImageSrcUrl(note));
}
- copyImageReferenceToClipboardEvent({ ntxId }) {
+ copyImageReferenceToClipboardEvent({ ntxId }: EventData<"copyImageReferenceToClipboard">) {
if (!this.isNoteContext(ntxId)) {
return;
}
@@ -73,7 +79,7 @@ class ImageTypeWidget extends TypeWidget {
imageService.copyImageReferenceToClipboard(this.$imageWrapper);
}
- async entitiesReloadedEvent({ loadResults }) {
+ async entitiesReloadedEvent({ loadResults }: EventData<"entitiesReloaded">) {
if (loadResults.isNoteReloaded(this.noteId)) {
this.refresh();
}
diff --git a/src/public/app/widgets/type_widgets/render.js b/src/public/app/widgets/type_widgets/render.ts
similarity index 78%
rename from src/public/app/widgets/type_widgets/render.js
rename to src/public/app/widgets/type_widgets/render.ts
index 27772c74c..2c0bcfdf8 100644
--- a/src/public/app/widgets/type_widgets/render.js
+++ b/src/public/app/widgets/type_widgets/render.ts
@@ -1,6 +1,8 @@
import renderService from "../../services/render.js";
import TypeWidget from "./type_widget.js";
import { t } from "../../services/i18n.js";
+import type FNote from "../../entities/fnote.js";
+import type { EventData } from "../../components/app_context.js";
const TPL = `
@@ -20,6 +22,10 @@ const TPL = `
`;
export default class RenderTypeWidget extends TypeWidget {
+
+ private $noteDetailRenderHelp!: JQuery;
+ private $noteDetailRenderContent!: JQuery;
+
static getType() {
return "render";
}
@@ -32,7 +38,7 @@ export default class RenderTypeWidget extends TypeWidget {
super.doRender();
}
- async doRefresh(note) {
+ async doRefresh(note: FNote) {
this.$widget.show();
this.$noteDetailRenderHelp.hide();
@@ -48,12 +54,12 @@ export default class RenderTypeWidget extends TypeWidget {
}
renderActiveNoteEvent() {
- if (this.noteContext.isActive()) {
+ if (this.noteContext?.isActive()) {
this.refresh();
}
}
- async executeWithContentElementEvent({ resolve, ntxId }) {
+ async executeWithContentElementEvent({ resolve, ntxId }: EventData<"executeWithContentElement">) {
if (!this.isNoteContext(ntxId)) {
return;
}
diff --git a/src/public/app/widgets/watched_file_update_status.js b/src/public/app/widgets/watched_file_update_status.ts
similarity index 71%
rename from src/public/app/widgets/watched_file_update_status.js
rename to src/public/app/widgets/watched_file_update_status.ts
index d73746b86..e65edc376 100644
--- a/src/public/app/widgets/watched_file_update_status.js
+++ b/src/public/app/widgets/watched_file_update_status.ts
@@ -3,6 +3,8 @@ import NoteContextAwareWidget from "./note_context_aware_widget.js";
import server from "../services/server.js";
import fileWatcher from "../services/file_watcher.js";
import dayjs from "dayjs";
+import type { EventData } from "../components/app_context.js";
+import type FNote from "../entities/fnote.js";
const TPL = `
`;
export default class WatchedFileUpdateStatusWidget extends NoteContextAwareWidget {
+
+ private $filePath!: JQuery;
+ private $fileLastModified!: JQuery;
+ private $fileUploadButton!: JQuery;
+ private $ignoreThisChangeButton!: JQuery;
+
isEnabled() {
const { entityType, entityId } = this.getEntity();
- return super.isEnabled() && !!fileWatcher.getFileModificationStatus(entityType, entityId);
+ return super.isEnabled()
+ && !!entityType
+ && !!entityId
+ && !!fileWatcher.getFileModificationStatus(entityType, entityId);
}
doRender() {
@@ -43,7 +54,9 @@ export default class WatchedFileUpdateStatusWidget extends NoteContextAwareWidge
filePath: this.$filePath.text()
});
- fileWatcher.fileModificationUploaded(entityType, entityId);
+ if (entityType && entityId) {
+ fileWatcher.fileModificationUploaded(entityType, entityId);
+ }
this.refresh();
});
@@ -51,13 +64,18 @@ export default class WatchedFileUpdateStatusWidget extends NoteContextAwareWidge
this.$ignoreThisChangeButton.on("click", () => {
const { entityType, entityId } = this.getEntity();
- fileWatcher.ignoreModification(entityType, entityId);
+ if (entityType && entityId) {
+ fileWatcher.ignoreModification(entityType, entityId);
+ }
this.refresh();
});
}
- async refreshWithNote(note) {
+ async refreshWithNote(note: FNote) {
const { entityType, entityId } = this.getEntity();
+ if (!entityType || !entityId) {
+ return;
+ }
const status = fileWatcher.getFileModificationStatus(entityType, entityId);
this.$filePath.text(status.filePath);
@@ -71,7 +89,7 @@ export default class WatchedFileUpdateStatusWidget extends NoteContextAwareWidge
const { viewScope } = this.noteContext;
- if (viewScope.viewMode === "attachments" && viewScope.attachmentId) {
+ if (viewScope?.viewMode === "attachments" && viewScope.attachmentId) {
return {
entityType: "attachments",
entityId: viewScope.attachmentId
@@ -84,7 +102,7 @@ export default class WatchedFileUpdateStatusWidget extends NoteContextAwareWidge
}
}
- openedFileUpdatedEvent(data) {
+ openedFileUpdatedEvent(data: EventData<"openedFileUpdated">) {
console.log(data);
const { entityType, entityId } = this.getEntity();
From 511c69bdb07f2456894aae9fb1c387d004e7c156 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sun, 16 Mar 2025 02:48:00 +0000
Subject: [PATCH 16/30] fix(deps): update dependency mind-elixir to v4.4.2
---
package-lock.json | 8 ++++----
package.json | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 1d68efd74..7d6aa88c5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -75,7 +75,7 @@
"marked": "15.0.7",
"mermaid": "11.5.0",
"mime-types": "2.1.35",
- "mind-elixir": "4.4.1",
+ "mind-elixir": "4.4.2",
"multer": "1.4.5-lts.1",
"normalize-strings": "1.1.1",
"normalize.css": "8.0.1",
@@ -15635,9 +15635,9 @@
}
},
"node_modules/mind-elixir": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/mind-elixir/-/mind-elixir-4.4.1.tgz",
- "integrity": "sha512-q2rzRXgd6iqF3UdenM88HB4Ohb0/62/3W3PXKMBRBLjcCXt/pxlLuTMb4QrqP7sX9HoWNFVBeNt+1S521h3TRw==",
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/mind-elixir/-/mind-elixir-4.4.2.tgz",
+ "integrity": "sha512-yHsUdKYvhB/SnBY9Fb/2cPTsysKDT+nu5vQVYPFEWWniZaGszpM9gPlCB28IEcOEGpaSDGOWOTt89Qc/wFYZSw==",
"license": "MIT"
},
"node_modules/mini-css-extract-plugin": {
diff --git a/package.json b/package.json
index ee1fd5356..426e7ce3b 100644
--- a/package.json
+++ b/package.json
@@ -135,7 +135,7 @@
"marked": "15.0.7",
"mermaid": "11.5.0",
"mime-types": "2.1.35",
- "mind-elixir": "4.4.1",
+ "mind-elixir": "4.4.2",
"multer": "1.4.5-lts.1",
"normalize-strings": "1.1.1",
"normalize.css": "8.0.1",
From 09a1227b63175e76ecc3468eeee01f6bcd843040 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sun, 16 Mar 2025 02:48:13 +0000
Subject: [PATCH 17/30] chore(deps): update dependency typedoc to v0.28.0
---
package-lock.json | 57 ++++++++++++++++++++++++-----------------------
package.json | 2 +-
2 files changed, 30 insertions(+), 29 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 1d68efd74..4a55b99bd 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -186,7 +186,7 @@
"ts-loader": "9.5.2",
"tslib": "2.8.1",
"tsx": "4.19.3",
- "typedoc": "0.27.9",
+ "typedoc": "0.28.0",
"typescript": "5.8.2",
"typescript-eslint": "8.26.1",
"vitest": "3.0.8",
@@ -2910,15 +2910,15 @@
"license": "MIT"
},
"node_modules/@gerrit0/mini-shiki": {
- "version": "1.24.4",
- "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-1.24.4.tgz",
- "integrity": "sha512-YEHW1QeAg6UmxEmswiQbOVEg1CW22b1XUD/lNTliOsu0LD0wqoyleFMnmbTp697QE0pcadQiR5cVtbbAPncvpw==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.2.1.tgz",
+ "integrity": "sha512-HbzRC6MKB6U8kQhczz0APKPIzFHTrcqhaC7es2EXInq1SpjPVnpVSIsBe6hNoLWqqCx1n5VKiPXq6PfXnHZKOQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@shikijs/engine-oniguruma": "^1.24.2",
- "@shikijs/types": "^1.24.2",
- "@shikijs/vscode-textmate": "^9.3.1"
+ "@shikijs/engine-oniguruma": "^3.2.1",
+ "@shikijs/types": "^3.2.1",
+ "@shikijs/vscode-textmate": "^10.0.2"
}
},
"node_modules/@highlightjs/cdn-assets": {
@@ -5088,31 +5088,31 @@
"hasInstallScript": true
},
"node_modules/@shikijs/engine-oniguruma": {
- "version": "1.24.2",
- "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.24.2.tgz",
- "integrity": "sha512-ZN6k//aDNWRJs1uKB12pturKHh7GejKugowOFGAuG7TxDRLod1Bd5JhpOikOiFqPmKjKEPtEA6mRCf7q3ulDyQ==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.2.1.tgz",
+ "integrity": "sha512-wZZAkayEn6qu2+YjenEoFqj0OyQI64EWsNR6/71d1EkG4sxEOFooowKivsWPpaWNBu3sxAG+zPz5kzBL/SsreQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@shikijs/types": "1.24.2",
- "@shikijs/vscode-textmate": "^9.3.0"
+ "@shikijs/types": "3.2.1",
+ "@shikijs/vscode-textmate": "^10.0.2"
}
},
"node_modules/@shikijs/types": {
- "version": "1.24.2",
- "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.24.2.tgz",
- "integrity": "sha512-bdeWZiDtajGLG9BudI0AHet0b6e7FbR0EsE4jpGaI0YwHm/XJunI9+3uZnzFtX65gsyJ6ngCIWUfA4NWRPnBkQ==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.2.1.tgz",
+ "integrity": "sha512-/NTWAk4KE2M8uac0RhOsIhYQf4pdU0OywQuYDGIGAJ6Mjunxl2cGiuLkvu4HLCMn+OTTLRWkjZITp+aYJv60yA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@shikijs/vscode-textmate": "^9.3.0",
+ "@shikijs/vscode-textmate": "^10.0.2",
"@types/hast": "^3.0.4"
}
},
"node_modules/@shikijs/vscode-textmate": {
- "version": "9.3.1",
- "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.1.tgz",
- "integrity": "sha512-79QfK1393x9Ho60QFyLti+QfdJzRQCVLFb97kOIV7Eo9vQU/roINgk7m24uv0a7AUvN//RDH36FLjjK48v0s9g==",
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz",
+ "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==",
"dev": true,
"license": "MIT"
},
@@ -20560,23 +20560,24 @@
}
},
"node_modules/typedoc": {
- "version": "0.27.9",
- "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.27.9.tgz",
- "integrity": "sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw==",
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.0.tgz",
+ "integrity": "sha512-UU+xxZXrpnUhEulBYRwY2afoYFC24J2fTFovOs3llj2foGShCoKVQL6cQCfQ+sBAOdiFn2dETpZ9xhah+CL3RQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@gerrit0/mini-shiki": "^1.24.0",
+ "@gerrit0/mini-shiki": "^3.2.1",
"lunr": "^2.3.9",
"markdown-it": "^14.1.0",
"minimatch": "^9.0.5",
- "yaml": "^2.6.1"
+ "yaml": "^2.7.0 "
},
"bin": {
"typedoc": "bin/typedoc"
},
"engines": {
- "node": ">= 18"
+ "node": ">= 18",
+ "pnpm": ">= 10"
},
"peerDependencies": {
"typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x"
@@ -21817,9 +21818,9 @@
"license": "ISC"
},
"node_modules/yaml": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz",
- "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==",
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz",
+ "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==",
"dev": true,
"license": "ISC",
"bin": {
diff --git a/package.json b/package.json
index ee1fd5356..ce3b49619 100644
--- a/package.json
+++ b/package.json
@@ -243,7 +243,7 @@
"ts-loader": "9.5.2",
"tslib": "2.8.1",
"tsx": "4.19.3",
- "typedoc": "0.27.9",
+ "typedoc": "0.28.0",
"typescript": "5.8.2",
"typescript-eslint": "8.26.1",
"vitest": "3.0.8",
From b13cab411b24166a2418933da4b64cc70859f0a7 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Sun, 16 Mar 2025 02:48:25 +0000
Subject: [PATCH 18/30] fix(deps): update dependency better-sqlite3 to v11.9.0
---
dump-db/package-lock.json | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/dump-db/package-lock.json b/dump-db/package-lock.json
index 657af257e..d46d004bb 100644
--- a/dump-db/package-lock.json
+++ b/dump-db/package-lock.json
@@ -493,9 +493,9 @@
"license": "MIT"
},
"node_modules/better-sqlite3": {
- "version": "11.8.1",
- "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.8.1.tgz",
- "integrity": "sha512-9BxNaBkblMjhJW8sMRZxnxVTRgbRmssZW0Oxc1MPBTfiR+WW21e2Mk4qu8CzrcZb1LwPCnFsfDEzq+SNcBU8eg==",
+ "version": "11.9.0",
+ "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.9.0.tgz",
+ "integrity": "sha512-4b9xYnoaskj8eIkke9ZCB42p5bOPabptSku8Rl4Yww70Jf+aHeLvrIjXDJrKQxUEjdppsFb+fdJSjoH4TklROA==",
"hasInstallScript": true,
"dependencies": {
"bindings": "^1.5.0",
@@ -1416,9 +1416,9 @@
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
},
"better-sqlite3": {
- "version": "11.8.1",
- "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.8.1.tgz",
- "integrity": "sha512-9BxNaBkblMjhJW8sMRZxnxVTRgbRmssZW0Oxc1MPBTfiR+WW21e2Mk4qu8CzrcZb1LwPCnFsfDEzq+SNcBU8eg==",
+ "version": "11.9.0",
+ "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.9.0.tgz",
+ "integrity": "sha512-4b9xYnoaskj8eIkke9ZCB42p5bOPabptSku8Rl4Yww70Jf+aHeLvrIjXDJrKQxUEjdppsFb+fdJSjoH4TklROA==",
"requires": {
"bindings": "^1.5.0",
"prebuild-install": "^7.1.1"
From 6f799692e02a5588da023921887de85097a37ac5 Mon Sep 17 00:00:00 2001
From: Elian Doran
Date: Sun, 16 Mar 2025 13:24:34 +0200
Subject: [PATCH 19/30] feat(in-app-help): render note list
---
src/public/app/services/content_renderer.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/public/app/services/content_renderer.ts b/src/public/app/services/content_renderer.ts
index 92b206001..720f4da25 100644
--- a/src/public/app/services/content_renderer.ts
+++ b/src/public/app/services/content_renderer.ts
@@ -40,7 +40,7 @@ async function getRenderedContent(this: {} | { ctx: string }, entity: FNote | FA
const $renderedContent = $('');
- if (type === "text") {
+ if (type === "text" || type === "book") {
await renderText(entity, $renderedContent);
} else if (type === "code") {
await renderCode(entity, $renderedContent);
From 8aaf2367e9d64e5887477a74ac4e7d1f2b7470c2 Mon Sep 17 00:00:00 2001
From: Elian Doran
Date: Sun, 16 Mar 2025 13:33:07 +0200
Subject: [PATCH 20/30] feat(in-app-help): hide notes that are hidden from
share
---
src/services/in_app_help.spec.ts | 32 +++++++++++++++++++++++++++++++-
src/services/in_app_help.ts | 14 +++++++++++---
2 files changed, 42 insertions(+), 4 deletions(-)
diff --git a/src/services/in_app_help.spec.ts b/src/services/in_app_help.spec.ts
index a716be4ed..2871fc16b 100644
--- a/src/services/in_app_help.spec.ts
+++ b/src/services/in_app_help.spec.ts
@@ -30,7 +30,37 @@ describe("In-app help", () => {
};
const item = parseNoteMeta(meta, "/");
- const icon = item.attributes?.find((a) => a.name === "iconClass");
+ const icon = item?.attributes?.find((a) => a.name === "iconClass");
expect(icon?.value).toBe("bx bx-star");
});
+
+ it("hides note that is hidden from share tree", () => {
+ const meta: NoteMeta = {
+ isClone: false,
+ noteId: "yoAe4jV2yzbd",
+ notePath: ["OkOZllzB3fqN", "yoAe4jV2yzbd"],
+ title: "Features",
+ notePosition: 40,
+ prefix: null,
+ isExpanded: false,
+ type: "text",
+ mime: "text/html",
+ attributes: [
+ {
+ type: "label",
+ name: "shareHiddenFromTree",
+ value: "",
+ isInheritable: false,
+ position: 10
+ }
+ ],
+ format: "html",
+ attachments: [],
+ dirFileName: "Features",
+ children: []
+ };
+
+ const item = parseNoteMeta(meta, "/");
+ expect(item).toBeFalsy();
+ });
});
diff --git a/src/services/in_app_help.ts b/src/services/in_app_help.ts
index 7841ee71b..a2322ab75 100644
--- a/src/services/in_app_help.ts
+++ b/src/services/in_app_help.ts
@@ -25,15 +25,16 @@ export function getHelpHiddenSubtreeData() {
function parseNoteMetaFile(noteMetaFile: NoteMetaFile): HiddenSubtreeItem[] {
if (!noteMetaFile.files) {
+ console.log("No meta files");
return [];
}
const metaRoot = noteMetaFile.files[0];
const parsedMetaRoot = parseNoteMeta(metaRoot, "/" + (metaRoot.dirFileName ?? ""));
- return parsedMetaRoot.children ?? [];
+ return parsedMetaRoot?.children ?? [];
}
-export function parseNoteMeta(noteMeta: NoteMeta, docNameRoot: string): HiddenSubtreeItem {
+export function parseNoteMeta(noteMeta: NoteMeta, docNameRoot: string): HiddenSubtreeItem | null {
let iconClass: string = "bx bx-file";
const item: HiddenSubtreeItem = {
id: `_help_${noteMeta.noteId}`,
@@ -62,6 +63,10 @@ export function parseNoteMeta(noteMeta: NoteMeta, docNameRoot: string): HiddenSu
value: attribute.value
});
}
+
+ if (attribute.name === "shareHiddenFromTree") {
+ return null;
+ }
}
// Handle text notes
@@ -84,7 +89,10 @@ export function parseNoteMeta(noteMeta: NoteMeta, docNameRoot: string): HiddenSu
const children: HiddenSubtreeItem[] = [];
for (const childMeta of noteMeta.children) {
let newDocNameRoot = noteMeta.dirFileName ? `${docNameRoot}/${noteMeta.dirFileName}` : docNameRoot;
- children.push(parseNoteMeta(childMeta, newDocNameRoot));
+ const item = parseNoteMeta(childMeta, newDocNameRoot);
+ if (item) {
+ children.push(item);
+ }
}
item.children = children;
From 3eaa68da23aa28a0456c631db575733878874829 Mon Sep 17 00:00:00 2001
From: Elian Doran
Date: Sun, 16 Mar 2025 13:58:31 +0200
Subject: [PATCH 21/30] feat(import/markdown): maintain consistency with
CKEditor for images
---
src/services/import/markdown.spec.ts | 6 ++++++
src/services/import/markdown.ts | 8 ++++++++
2 files changed, 14 insertions(+)
diff --git a/src/services/import/markdown.spec.ts b/src/services/import/markdown.spec.ts
index 18b11037b..297b68e2f 100644
--- a/src/services/import/markdown.spec.ts
+++ b/src/services/import/markdown.spec.ts
@@ -102,4 +102,10 @@ second line 2Hello {
+ const input = "";
+ const expected = `
`;
+ expect(markdownService.renderToHtml(input, "Title")).toStrictEqual(expected);
+ });
+
});
diff --git a/src/services/import/markdown.ts b/src/services/import/markdown.ts
index c0677b5f1..8f4973082 100644
--- a/src/services/import/markdown.ts
+++ b/src/services/import/markdown.ts
@@ -34,6 +34,11 @@ class CustomMarkdownRenderer extends Renderer {
return super.listitem(item).trimEnd();
}
+ image(token: Tokens.Image): string {
+ return super.image(token)
+ .replace(` alt=""`, "");
+ }
+
blockquote({ tokens }: Tokens.Blockquote): string {
const body = renderer.parser.parse(tokens);
@@ -72,6 +77,9 @@ function renderToHtml(content: string, title: string) {
html = importUtils.handleH1(html, title);
html = htmlSanitizer.sanitize(html);
+ // Remove slash for self-closing tags to match CKEditor's approach.
+ html = html.replace(/<(\w+)([^>]*)\s+\/>/g, "<$1$2>");
+
return html;
}
From 132a8f7c654fc53c2b29b6a486cc48379b9a0e1c Mon Sep 17 00:00:00 2001
From: Elian Doran
Date: Sun, 16 Mar 2025 14:05:38 +0200
Subject: [PATCH 22/30] chore(docs): update to match new img handling
---
docs/User Guide/!!!meta.json | 1917 ++++++++--------
.../Note Types/Book/Calendar View.md | 2 +-
.../Text/Content language & Right-to-le.md | 2 +-
.../app/doc_notes/en/User Guide/!!!meta.json | 1921 +++++++++--------
.../Advanced Showcases/Day Notes.html | 4 +-
.../Advanced Showcases/Task Manager.html | 2 +-
.../Advanced Showcases/Weight Tracker.html | 2 +-
.../User Guide/Advanced Usage/Attributes.html | 2 +-
.../Attributes/Promoted Attributes.html | 4 +-
.../Manually altering the database.html | 2 +-
.../SQL Console.html | 9 +-
.../User Guide/Advanced Usage/Note Map.html | 4 +-
.../Advanced Usage/Relation Map.html | 8 +-
.../Serving directly the content o.html | 9 +-
.../Import & Export/Markdown.html | 8 +-
.../Basic Concepts/Navigation/Bookmarks.html | 4 +-
.../Navigation/Note Hoisting.html | 2 +-
.../Navigation/Note Navigation.html | 6 +-
.../Basic Concepts/Navigation/Workspace.html | 4 +-
.../Basic Concepts/Note/Archived Notes.html | 2 +-
.../Basic Concepts/Note/Cloning Notes.html | 2 +-
.../Basic Concepts/Note/Export as PDF.html | 6 +-
.../Basic Concepts/Note/Note Revisions.html | 2 +-
.../User Guide/Basic Concepts/Themes.html | 2 +-
.../UI Elements/Global menu.html | 2 +-
.../UI Elements/Launch Bar.html | 2 +-
.../Basic Concepts/UI Elements/Note Tree.html | 4 +-
.../Basic Concepts/UI Elements/Ribbon.html | 2 +-
.../Vertical and horizontal layout.html | 12 +-
.../User Guide/Basic Concepts/Zen mode.html | 8 +-
.../Using promoted attributes to c.html | 2 +-
.../Installation & Setup/Data directory.html | 2 +-
.../Installation & Setup/Mobile Frontend.html | 4 +-
.../Manual server installation.html | 2 +-
.../Installation & Setup/Synchronization.html | 2 +-
.../Installation & Setup/Web Clipper.html | 2 +-
.../User Guide/Note Types/Book.html | 4 +-
.../Note Types/Book/Calendar View.html | 519 +++--
.../User Guide/Note Types/Code.html | 4 +-
.../Note Types/Code/Custom Widgets.html | 2 +-
.../User Guide/Note Types/Code/Scripts.html | 2 +-
.../User Guide/Note Types/Geo map.html | 51 +-
.../Note Types/Mermaid Diagrams.html | 4 +-
.../User Guide/Note Types/Text.html | 4 +-
.../Note Types/Text/Code blocks.html | 6 +-
.../Text/Content language & Right-to-le.html | 3 +-
.../Note Types/Text/Formatting toolbar.html | 8 +-
.../Note Types/Text/Formatting.html | 6 +-
.../User Guide/Note Types/Text/Images.html | 25 +-
.../User Guide/Note Types/Text/Links.html | 4 +-
.../User Guide/Note Types/Text/Lists.html | 12 +-
.../Creating a custom theme.html | 5 +-
.../Custom app-wide CSS.html | 9 +-
.../Customize the Next theme.html | 2 +-
.../Troubleshooting/Anonymized Database.html | 2 +-
.../Troubleshooting/Error logs.html | 6 +-
.../doc_notes/en/User Guide/navigation.html | 132 +-
.../app/doc_notes/en/User Guide/style.css | 1 +
58 files changed, 2397 insertions(+), 2384 deletions(-)
diff --git a/docs/User Guide/!!!meta.json b/docs/User Guide/!!!meta.json
index b16a700b6..af37c6804 100644
--- a/docs/User Guide/!!!meta.json
+++ b/docs/User Guide/!!!meta.json
@@ -9,7 +9,7 @@
"pOsGYCXsbNQG"
],
"title": "User Guide",
- "notePosition": 10,
+ "notePosition": 110,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -1486,28 +1486,28 @@
"name": "internalLink",
"value": "poXkQfguuA0U",
"isInheritable": false,
- "position": 20
+ "position": 10
},
{
"type": "relation",
"name": "internalLink",
"value": "WOcw2SLH6tbX",
"isInheritable": false,
- "position": 30
+ "position": 20
},
{
"type": "relation",
"name": "internalLink",
"value": "RDslemsQ6gCp",
"isInheritable": false,
- "position": 40
+ "position": 30
},
{
"type": "relation",
"name": "internalLink",
"value": "cbkrhQjrkKrh",
"isInheritable": false,
- "position": 50
+ "position": 40
},
{
"type": "label",
@@ -1528,6 +1528,939 @@
"dataFileName": "Quick Start.md",
"attachments": []
},
+ {
+ "isClone": false,
+ "noteId": "Otzi9La2YAUX",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX"
+ ],
+ "title": "Installation & Setup",
+ "notePosition": 60,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/html",
+ "attributes": [
+ {
+ "type": "label",
+ "name": "iconClass",
+ "value": "bx bx-cog",
+ "isInheritable": false,
+ "position": 10
+ }
+ ],
+ "format": "markdown",
+ "attachments": [],
+ "dirFileName": "Installation & Setup",
+ "children": [
+ {
+ "isClone": false,
+ "noteId": "poXkQfguuA0U",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "poXkQfguuA0U"
+ ],
+ "title": "Desktop Installation",
+ "notePosition": 10,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "tAassRL4RSQL",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "l2VkvOwUNfZj",
+ "isInheritable": false,
+ "position": 20
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "cbkrhQjrkKrh",
+ "isInheritable": false,
+ "position": 30
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "desktop-installation",
+ "isInheritable": false,
+ "position": 30
+ }
+ ],
+ "format": "markdown",
+ "dataFileName": "Desktop Installation.md",
+ "attachments": []
+ },
+ {
+ "isClone": false,
+ "noteId": "WOcw2SLH6tbX",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX"
+ ],
+ "title": "Server Installation",
+ "notePosition": 20,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "cbkrhQjrkKrh",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "rWX5eY045zbE",
+ "isInheritable": false,
+ "position": 20
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "3tW6mORuTHnB",
+ "isInheritable": false,
+ "position": 30
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "J1Bb6lVlwU5T",
+ "isInheritable": false,
+ "position": 40
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "DCmT6e7clMoP",
+ "isInheritable": false,
+ "position": 50
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "moVgBcoxE3EK",
+ "isInheritable": false,
+ "position": 60
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "RDslemsQ6gCp",
+ "isInheritable": false,
+ "position": 70
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "l2VkvOwUNfZj",
+ "isInheritable": false,
+ "position": 80
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "tAassRL4RSQL",
+ "isInheritable": false,
+ "position": 90
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "Gzjqa934BdH4",
+ "isInheritable": false,
+ "position": 100
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "wX4HbRucYSDD",
+ "isInheritable": false,
+ "position": 110
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "fDLvzOx29Pfg",
+ "isInheritable": false,
+ "position": 120
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "server-installation",
+ "isInheritable": false,
+ "position": 30
+ }
+ ],
+ "format": "markdown",
+ "dataFileName": "Server Installation.md",
+ "attachments": [],
+ "dirFileName": "Server Installation",
+ "children": [
+ {
+ "isClone": false,
+ "noteId": "Dgg7bR3b6K9j",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "Dgg7bR3b6K9j"
+ ],
+ "title": "1. Installing the server",
+ "notePosition": 10,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/html",
+ "attributes": [],
+ "format": "markdown",
+ "attachments": [],
+ "dirFileName": "1. Installing the server",
+ "children": [
+ {
+ "isClone": false,
+ "noteId": "3tW6mORuTHnB",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "Dgg7bR3b6K9j",
+ "3tW6mORuTHnB"
+ ],
+ "title": "Packaged server installation",
+ "notePosition": 10,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "WOcw2SLH6tbX",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "l2VkvOwUNfZj",
+ "isInheritable": false,
+ "position": 20
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "packaged-server-installation",
+ "isInheritable": false,
+ "position": 20
+ }
+ ],
+ "format": "markdown",
+ "dataFileName": "Packaged server installation.md",
+ "attachments": []
+ },
+ {
+ "isClone": false,
+ "noteId": "rWX5eY045zbE",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "Dgg7bR3b6K9j",
+ "rWX5eY045zbE"
+ ],
+ "title": "Docker Server Installation",
+ "notePosition": 20,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "ud6MShXL4WpO",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "fDLvzOx29Pfg",
+ "isInheritable": false,
+ "position": 20
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "docker-server-installation",
+ "isInheritable": false,
+ "position": 30
+ }
+ ],
+ "format": "markdown",
+ "dataFileName": "Docker Server Installation.md",
+ "attachments": []
+ },
+ {
+ "isClone": false,
+ "noteId": "moVgBcoxE3EK",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "Dgg7bR3b6K9j",
+ "moVgBcoxE3EK"
+ ],
+ "title": "NixOS server installation",
+ "notePosition": 30,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "nixos-server-installation",
+ "isInheritable": false,
+ "position": 10
+ }
+ ],
+ "format": "markdown",
+ "dataFileName": "NixOS server installation.md",
+ "attachments": []
+ },
+ {
+ "isClone": false,
+ "noteId": "J1Bb6lVlwU5T",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "Dgg7bR3b6K9j",
+ "J1Bb6lVlwU5T"
+ ],
+ "title": "Manual server installation",
+ "notePosition": 40,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "l2VkvOwUNfZj",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "manual-server-installation",
+ "isInheritable": false,
+ "position": 20
+ }
+ ],
+ "format": "markdown",
+ "dataFileName": "Manual server installation.md",
+ "attachments": []
+ },
+ {
+ "isClone": false,
+ "noteId": "DCmT6e7clMoP",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "Dgg7bR3b6K9j",
+ "DCmT6e7clMoP"
+ ],
+ "title": "Kubernetes server installation",
+ "notePosition": 50,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "kubernetes-server-installation",
+ "isInheritable": false,
+ "position": 10
+ }
+ ],
+ "format": "markdown",
+ "dataFileName": "Kubernetes server installation.md",
+ "attachments": []
+ }
+ ]
+ },
+ {
+ "isClone": false,
+ "noteId": "vcjrb3VVYPZI",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "vcjrb3VVYPZI"
+ ],
+ "title": "2. Reverse proxy",
+ "notePosition": 20,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/html",
+ "attributes": [],
+ "format": "markdown",
+ "attachments": [],
+ "dirFileName": "2. Reverse proxy",
+ "children": [
+ {
+ "isClone": false,
+ "noteId": "ud6MShXL4WpO",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "vcjrb3VVYPZI",
+ "ud6MShXL4WpO"
+ ],
+ "title": "Nginx",
+ "notePosition": 10,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "nginx-proxy-setup",
+ "isInheritable": false,
+ "position": 10
+ }
+ ],
+ "format": "markdown",
+ "dataFileName": "Nginx.md",
+ "attachments": []
+ },
+ {
+ "isClone": false,
+ "noteId": "fDLvzOx29Pfg",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "vcjrb3VVYPZI",
+ "fDLvzOx29Pfg"
+ ],
+ "title": "Apache",
+ "notePosition": 20,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "apache-proxy-setup",
+ "isInheritable": false,
+ "position": 10
+ }
+ ],
+ "format": "markdown",
+ "dataFileName": "Apache.md",
+ "attachments": []
+ }
+ ]
+ },
+ {
+ "isClone": false,
+ "noteId": "l2VkvOwUNfZj",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "l2VkvOwUNfZj"
+ ],
+ "title": "TLS Configuration",
+ "notePosition": 100,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "WOcw2SLH6tbX",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "tAassRL4RSQL",
+ "isInheritable": false,
+ "position": 20
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "Gzjqa934BdH4",
+ "isInheritable": false,
+ "position": 30
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "tls-configuration",
+ "isInheritable": false,
+ "position": 20
+ }
+ ],
+ "format": "markdown",
+ "dataFileName": "TLS Configuration.md",
+ "attachments": []
+ },
+ {
+ "isClone": false,
+ "noteId": "7DAiwaf8Z7Rz",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "7DAiwaf8Z7Rz"
+ ],
+ "title": "Multi-Factor Authentication",
+ "notePosition": 110,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "multi-factor-authentication",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "label",
+ "name": "shareHiddenFromTree",
+ "value": "",
+ "isInheritable": false,
+ "position": 20
+ }
+ ],
+ "format": "markdown",
+ "dataFileName": "Multi-Factor Authentication.md",
+ "attachments": []
+ },
+ {
+ "isClone": false,
+ "noteId": "KaM3TfD7mP78",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "KaM3TfD7mP78"
+ ],
+ "title": "Reverse proxy setup",
+ "notePosition": 120,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/html",
+ "attributes": [],
+ "format": "markdown",
+ "dataFileName": "Reverse proxy setup.md",
+ "attachments": []
+ }
+ ]
+ },
+ {
+ "isClone": false,
+ "noteId": "cbkrhQjrkKrh",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "cbkrhQjrkKrh"
+ ],
+ "title": "Synchronization",
+ "notePosition": 30,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "imageLink",
+ "value": "676Ekdv73T7I",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "relation",
+ "name": "imageLink",
+ "value": "SDHWNDsB68aJ",
+ "isInheritable": false,
+ "position": 20
+ },
+ {
+ "type": "relation",
+ "name": "imageLink",
+ "value": "qGTyyKX4TceE",
+ "isInheritable": false,
+ "position": 30
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "l2VkvOwUNfZj",
+ "isInheritable": false,
+ "position": 40
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "poXkQfguuA0U",
+ "isInheritable": false,
+ "position": 50
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "vZWERwf8U3nx",
+ "isInheritable": false,
+ "position": 60
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "synchronization",
+ "isInheritable": false,
+ "position": 30
+ }
+ ],
+ "format": "markdown",
+ "dataFileName": "Synchronization.md",
+ "attachments": [
+ {
+ "attachmentId": "s3fKDqHslToK",
+ "title": "image.png",
+ "role": "image",
+ "mime": "image/jpg",
+ "position": 10,
+ "dataFileName": "Synchronization_image.png"
+ }
+ ]
+ },
+ {
+ "isClone": false,
+ "noteId": "RDslemsQ6gCp",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "RDslemsQ6gCp"
+ ],
+ "title": "Mobile Frontend",
+ "notePosition": 40,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "imageLink",
+ "value": "TFAiJIXJFfqv",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "relation",
+ "name": "imageLink",
+ "value": "fi37V32TNyzm",
+ "isInheritable": false,
+ "position": 20
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "bwg0e8ewQMak",
+ "isInheritable": false,
+ "position": 30
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "WOcw2SLH6tbX",
+ "isInheritable": false,
+ "position": 40
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "CdNpE2pqjmI6",
+ "isInheritable": false,
+ "position": 50
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "mobile-frontend",
+ "isInheritable": false,
+ "position": 30
+ }
+ ],
+ "format": "markdown",
+ "dataFileName": "Mobile Frontend.md",
+ "attachments": []
+ },
+ {
+ "isClone": false,
+ "noteId": "MtPxeAWVAzMg",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "MtPxeAWVAzMg"
+ ],
+ "title": "Web Clipper",
+ "notePosition": 50,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "l0tKav7yLHGF",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "zEY4DaJG4YT5",
+ "isInheritable": false,
+ "position": 20
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "WOcw2SLH6tbX",
+ "isInheritable": false,
+ "position": 30
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "web-clipper",
+ "isInheritable": false,
+ "position": 20
+ }
+ ],
+ "format": "markdown",
+ "dataFileName": "Web Clipper.md",
+ "attachments": [
+ {
+ "attachmentId": "fhKf5Otv0M5Y",
+ "title": "image.png",
+ "role": "image",
+ "mime": "image/png",
+ "position": 10,
+ "dataFileName": "Web Clipper_image.png"
+ }
+ ]
+ },
+ {
+ "isClone": false,
+ "noteId": "n1lujUxCwipy",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "n1lujUxCwipy"
+ ],
+ "title": "Upgrading TriliumNext",
+ "notePosition": 60,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "rWX5eY045zbE",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "wX4HbRucYSDD",
+ "isInheritable": false,
+ "position": 20
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "ODY7qQn5m2FT",
+ "isInheritable": false,
+ "position": 30
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "cbkrhQjrkKrh",
+ "isInheritable": false,
+ "position": 40
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "upgrading-trilium",
+ "isInheritable": false,
+ "position": 20
+ }
+ ],
+ "format": "markdown",
+ "dataFileName": "Upgrading TriliumNext.md",
+ "attachments": []
+ },
+ {
+ "isClone": false,
+ "noteId": "ODY7qQn5m2FT",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "ODY7qQn5m2FT"
+ ],
+ "title": "Backup",
+ "notePosition": 70,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "Gzjqa934BdH4",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "tAassRL4RSQL",
+ "isInheritable": false,
+ "position": 20
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "cbkrhQjrkKrh",
+ "isInheritable": false,
+ "position": 30
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "backup",
+ "isInheritable": false,
+ "position": 20
+ }
+ ],
+ "format": "markdown",
+ "dataFileName": "Backup.md",
+ "attachments": []
+ },
+ {
+ "isClone": false,
+ "noteId": "tAassRL4RSQL",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "tAassRL4RSQL"
+ ],
+ "title": "Data directory",
+ "notePosition": 80,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "wX4HbRucYSDD",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "ODY7qQn5m2FT",
+ "isInheritable": false,
+ "position": 20
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "data-directory",
+ "isInheritable": false,
+ "position": 30
+ },
+ {
+ "type": "label",
+ "name": "iconClass",
+ "value": "bx bx-folder-open",
+ "isInheritable": false,
+ "position": 40
+ }
+ ],
+ "format": "markdown",
+ "dataFileName": "Data directory.md",
+ "attachments": [
+ {
+ "attachmentId": "NONZTci1YkNe",
+ "title": "image.png",
+ "role": "image",
+ "mime": "image/jpg",
+ "position": 10,
+ "dataFileName": "Data directory_image.png"
+ }
+ ]
+ }
+ ]
+ },
{
"isClone": false,
"noteId": "gh7bpGYxajRS",
@@ -1536,7 +2469,7 @@
"gh7bpGYxajRS"
],
"title": "Basic Concepts",
- "notePosition": 60,
+ "notePosition": 70,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -1634,6 +2567,13 @@
"isInheritable": false,
"position": 40
},
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "_lbSettings",
+ "isInheritable": false,
+ "position": 50
+ },
{
"type": "label",
"name": "iconClass",
@@ -3276,7 +4216,7 @@
"KSZ04uQ2D1St"
],
"title": "Note Types",
- "notePosition": 70,
+ "notePosition": 80,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -5013,7 +5953,7 @@
"pKK96zzmvBGf"
],
"title": "Theme development",
- "notePosition": 100,
+ "notePosition": 110,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -5216,7 +6156,7 @@
"k2Gc17NbaAwb"
],
"title": "Developer Guides",
- "notePosition": 120,
+ "notePosition": 130,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -5523,939 +6463,6 @@
}
]
},
- {
- "isClone": false,
- "noteId": "Otzi9La2YAUX",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX"
- ],
- "title": "Installation & Setup",
- "notePosition": 160,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/html",
- "attributes": [
- {
- "type": "label",
- "name": "iconClass",
- "value": "bx bx-cog",
- "isInheritable": false,
- "position": 10
- }
- ],
- "format": "markdown",
- "attachments": [],
- "dirFileName": "Installation & Setup",
- "children": [
- {
- "isClone": false,
- "noteId": "poXkQfguuA0U",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "poXkQfguuA0U"
- ],
- "title": "Desktop Installation",
- "notePosition": 10,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "internalLink",
- "value": "tAassRL4RSQL",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "l2VkvOwUNfZj",
- "isInheritable": false,
- "position": 20
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "cbkrhQjrkKrh",
- "isInheritable": false,
- "position": 30
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "desktop-installation",
- "isInheritable": false,
- "position": 30
- }
- ],
- "format": "markdown",
- "dataFileName": "Desktop Installation.md",
- "attachments": []
- },
- {
- "isClone": false,
- "noteId": "WOcw2SLH6tbX",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX"
- ],
- "title": "Server Installation",
- "notePosition": 20,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "internalLink",
- "value": "cbkrhQjrkKrh",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "rWX5eY045zbE",
- "isInheritable": false,
- "position": 20
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "3tW6mORuTHnB",
- "isInheritable": false,
- "position": 30
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "J1Bb6lVlwU5T",
- "isInheritable": false,
- "position": 40
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "DCmT6e7clMoP",
- "isInheritable": false,
- "position": 50
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "moVgBcoxE3EK",
- "isInheritable": false,
- "position": 60
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "RDslemsQ6gCp",
- "isInheritable": false,
- "position": 70
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "l2VkvOwUNfZj",
- "isInheritable": false,
- "position": 80
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "tAassRL4RSQL",
- "isInheritable": false,
- "position": 90
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "Gzjqa934BdH4",
- "isInheritable": false,
- "position": 100
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "wX4HbRucYSDD",
- "isInheritable": false,
- "position": 110
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "fDLvzOx29Pfg",
- "isInheritable": false,
- "position": 120
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "server-installation",
- "isInheritable": false,
- "position": 30
- }
- ],
- "format": "markdown",
- "dataFileName": "Server Installation.md",
- "attachments": [],
- "dirFileName": "Server Installation",
- "children": [
- {
- "isClone": false,
- "noteId": "Dgg7bR3b6K9j",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "Dgg7bR3b6K9j"
- ],
- "title": "1. Installing the server",
- "notePosition": 10,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/html",
- "attributes": [],
- "format": "markdown",
- "attachments": [],
- "dirFileName": "1. Installing the server",
- "children": [
- {
- "isClone": false,
- "noteId": "3tW6mORuTHnB",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "Dgg7bR3b6K9j",
- "3tW6mORuTHnB"
- ],
- "title": "Packaged server installation",
- "notePosition": 10,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "internalLink",
- "value": "WOcw2SLH6tbX",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "l2VkvOwUNfZj",
- "isInheritable": false,
- "position": 20
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "packaged-server-installation",
- "isInheritable": false,
- "position": 20
- }
- ],
- "format": "markdown",
- "dataFileName": "Packaged server installation.md",
- "attachments": []
- },
- {
- "isClone": false,
- "noteId": "rWX5eY045zbE",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "Dgg7bR3b6K9j",
- "rWX5eY045zbE"
- ],
- "title": "Docker Server Installation",
- "notePosition": 20,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "internalLink",
- "value": "ud6MShXL4WpO",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "fDLvzOx29Pfg",
- "isInheritable": false,
- "position": 20
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "docker-server-installation",
- "isInheritable": false,
- "position": 30
- }
- ],
- "format": "markdown",
- "dataFileName": "Docker Server Installation.md",
- "attachments": []
- },
- {
- "isClone": false,
- "noteId": "moVgBcoxE3EK",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "Dgg7bR3b6K9j",
- "moVgBcoxE3EK"
- ],
- "title": "NixOS server installation",
- "notePosition": 30,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "label",
- "name": "shareAlias",
- "value": "nixos-server-installation",
- "isInheritable": false,
- "position": 10
- }
- ],
- "format": "markdown",
- "dataFileName": "NixOS server installation.md",
- "attachments": []
- },
- {
- "isClone": false,
- "noteId": "J1Bb6lVlwU5T",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "Dgg7bR3b6K9j",
- "J1Bb6lVlwU5T"
- ],
- "title": "Manual server installation",
- "notePosition": 40,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "internalLink",
- "value": "l2VkvOwUNfZj",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "manual-server-installation",
- "isInheritable": false,
- "position": 20
- }
- ],
- "format": "markdown",
- "dataFileName": "Manual server installation.md",
- "attachments": []
- },
- {
- "isClone": false,
- "noteId": "DCmT6e7clMoP",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "Dgg7bR3b6K9j",
- "DCmT6e7clMoP"
- ],
- "title": "Kubernetes server installation",
- "notePosition": 50,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "label",
- "name": "shareAlias",
- "value": "kubernetes-server-installation",
- "isInheritable": false,
- "position": 10
- }
- ],
- "format": "markdown",
- "dataFileName": "Kubernetes server installation.md",
- "attachments": []
- }
- ]
- },
- {
- "isClone": false,
- "noteId": "vcjrb3VVYPZI",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "vcjrb3VVYPZI"
- ],
- "title": "2. Reverse proxy",
- "notePosition": 20,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/html",
- "attributes": [],
- "format": "markdown",
- "attachments": [],
- "dirFileName": "2. Reverse proxy",
- "children": [
- {
- "isClone": false,
- "noteId": "ud6MShXL4WpO",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "vcjrb3VVYPZI",
- "ud6MShXL4WpO"
- ],
- "title": "Nginx",
- "notePosition": 10,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "label",
- "name": "shareAlias",
- "value": "nginx-proxy-setup",
- "isInheritable": false,
- "position": 10
- }
- ],
- "format": "markdown",
- "dataFileName": "Nginx.md",
- "attachments": []
- },
- {
- "isClone": false,
- "noteId": "fDLvzOx29Pfg",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "vcjrb3VVYPZI",
- "fDLvzOx29Pfg"
- ],
- "title": "Apache",
- "notePosition": 20,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "label",
- "name": "shareAlias",
- "value": "apache-proxy-setup",
- "isInheritable": false,
- "position": 10
- }
- ],
- "format": "markdown",
- "dataFileName": "Apache.md",
- "attachments": []
- }
- ]
- },
- {
- "isClone": false,
- "noteId": "l2VkvOwUNfZj",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "l2VkvOwUNfZj"
- ],
- "title": "TLS Configuration",
- "notePosition": 100,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "internalLink",
- "value": "WOcw2SLH6tbX",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "tAassRL4RSQL",
- "isInheritable": false,
- "position": 20
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "Gzjqa934BdH4",
- "isInheritable": false,
- "position": 30
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "tls-configuration",
- "isInheritable": false,
- "position": 20
- }
- ],
- "format": "markdown",
- "dataFileName": "TLS Configuration.md",
- "attachments": []
- },
- {
- "isClone": false,
- "noteId": "7DAiwaf8Z7Rz",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "7DAiwaf8Z7Rz"
- ],
- "title": "Multi-Factor Authentication",
- "notePosition": 110,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "label",
- "name": "shareAlias",
- "value": "multi-factor-authentication",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "label",
- "name": "shareHiddenFromTree",
- "value": "",
- "isInheritable": false,
- "position": 20
- }
- ],
- "format": "markdown",
- "dataFileName": "Multi-Factor Authentication.md",
- "attachments": []
- },
- {
- "isClone": false,
- "noteId": "KaM3TfD7mP78",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "KaM3TfD7mP78"
- ],
- "title": "Reverse proxy setup",
- "notePosition": 120,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/html",
- "attributes": [],
- "format": "markdown",
- "dataFileName": "Reverse proxy setup.md",
- "attachments": []
- }
- ]
- },
- {
- "isClone": false,
- "noteId": "cbkrhQjrkKrh",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "cbkrhQjrkKrh"
- ],
- "title": "Synchronization",
- "notePosition": 30,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "imageLink",
- "value": "676Ekdv73T7I",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "relation",
- "name": "imageLink",
- "value": "SDHWNDsB68aJ",
- "isInheritable": false,
- "position": 20
- },
- {
- "type": "relation",
- "name": "imageLink",
- "value": "qGTyyKX4TceE",
- "isInheritable": false,
- "position": 30
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "l2VkvOwUNfZj",
- "isInheritable": false,
- "position": 40
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "poXkQfguuA0U",
- "isInheritable": false,
- "position": 50
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "vZWERwf8U3nx",
- "isInheritable": false,
- "position": 60
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "synchronization",
- "isInheritable": false,
- "position": 30
- }
- ],
- "format": "markdown",
- "dataFileName": "Synchronization.md",
- "attachments": [
- {
- "attachmentId": "s3fKDqHslToK",
- "title": "image.png",
- "role": "image",
- "mime": "image/jpg",
- "position": 10,
- "dataFileName": "Synchronization_image.png"
- }
- ]
- },
- {
- "isClone": false,
- "noteId": "RDslemsQ6gCp",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "RDslemsQ6gCp"
- ],
- "title": "Mobile Frontend",
- "notePosition": 40,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "imageLink",
- "value": "TFAiJIXJFfqv",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "relation",
- "name": "imageLink",
- "value": "fi37V32TNyzm",
- "isInheritable": false,
- "position": 20
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "bwg0e8ewQMak",
- "isInheritable": false,
- "position": 30
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "WOcw2SLH6tbX",
- "isInheritable": false,
- "position": 40
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "CdNpE2pqjmI6",
- "isInheritable": false,
- "position": 50
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "mobile-frontend",
- "isInheritable": false,
- "position": 30
- }
- ],
- "format": "markdown",
- "dataFileName": "Mobile Frontend.md",
- "attachments": []
- },
- {
- "isClone": false,
- "noteId": "MtPxeAWVAzMg",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "MtPxeAWVAzMg"
- ],
- "title": "Web Clipper",
- "notePosition": 50,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "internalLink",
- "value": "l0tKav7yLHGF",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "zEY4DaJG4YT5",
- "isInheritable": false,
- "position": 20
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "WOcw2SLH6tbX",
- "isInheritable": false,
- "position": 30
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "web-clipper",
- "isInheritable": false,
- "position": 20
- }
- ],
- "format": "markdown",
- "dataFileName": "Web Clipper.md",
- "attachments": [
- {
- "attachmentId": "fhKf5Otv0M5Y",
- "title": "image.png",
- "role": "image",
- "mime": "image/png",
- "position": 10,
- "dataFileName": "Web Clipper_image.png"
- }
- ]
- },
- {
- "isClone": false,
- "noteId": "n1lujUxCwipy",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "n1lujUxCwipy"
- ],
- "title": "Upgrading TriliumNext",
- "notePosition": 60,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "internalLink",
- "value": "rWX5eY045zbE",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "wX4HbRucYSDD",
- "isInheritable": false,
- "position": 20
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "ODY7qQn5m2FT",
- "isInheritable": false,
- "position": 30
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "cbkrhQjrkKrh",
- "isInheritable": false,
- "position": 40
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "upgrading-trilium",
- "isInheritable": false,
- "position": 20
- }
- ],
- "format": "markdown",
- "dataFileName": "Upgrading TriliumNext.md",
- "attachments": []
- },
- {
- "isClone": false,
- "noteId": "ODY7qQn5m2FT",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "ODY7qQn5m2FT"
- ],
- "title": "Backup",
- "notePosition": 70,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "internalLink",
- "value": "Gzjqa934BdH4",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "tAassRL4RSQL",
- "isInheritable": false,
- "position": 20
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "cbkrhQjrkKrh",
- "isInheritable": false,
- "position": 30
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "backup",
- "isInheritable": false,
- "position": 20
- }
- ],
- "format": "markdown",
- "dataFileName": "Backup.md",
- "attachments": []
- },
- {
- "isClone": false,
- "noteId": "tAassRL4RSQL",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "tAassRL4RSQL"
- ],
- "title": "Data directory",
- "notePosition": 80,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "internalLink",
- "value": "wX4HbRucYSDD",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "ODY7qQn5m2FT",
- "isInheritable": false,
- "position": 20
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "data-directory",
- "isInheritable": false,
- "position": 30
- },
- {
- "type": "label",
- "name": "iconClass",
- "value": "bx bx-folder-open",
- "isInheritable": false,
- "position": 40
- }
- ],
- "format": "markdown",
- "dataFileName": "Data directory.md",
- "attachments": [
- {
- "attachmentId": "NONZTci1YkNe",
- "title": "image.png",
- "role": "image",
- "mime": "image/jpg",
- "position": 10,
- "dataFileName": "Data directory_image.png"
- }
- ]
- }
- ]
- },
{
"isClone": false,
"noteId": "i6dbnitykE5D",
@@ -6464,7 +6471,7 @@
"i6dbnitykE5D"
],
"title": "FAQ",
- "notePosition": 170,
+ "notePosition": 180,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -6501,24 +6508,31 @@
{
"type": "relation",
"name": "internalLink",
- "value": "CdNpE2pqjmI6",
+ "value": "wy8So3yZZlH9",
"isInheritable": false,
"position": 50
},
{
"type": "relation",
"name": "internalLink",
- "value": "tAassRL4RSQL",
+ "value": "CdNpE2pqjmI6",
"isInheritable": false,
"position": 60
},
{
"type": "relation",
"name": "internalLink",
- "value": "cbkrhQjrkKrh",
+ "value": "tAassRL4RSQL",
"isInheritable": false,
"position": 70
},
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "cbkrhQjrkKrh",
+ "isInheritable": false,
+ "position": 80
+ },
{
"type": "label",
"name": "shareAlias",
@@ -6532,13 +6546,6 @@
"value": "bx bx-question-mark",
"isInheritable": false,
"position": 40
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "wy8So3yZZlH9",
- "isInheritable": false,
- "position": 80
}
],
"format": "markdown",
@@ -6553,7 +6560,7 @@
"BgmBlOIl72jZ"
],
"title": "Troubleshooting",
- "notePosition": 180,
+ "notePosition": 190,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -6810,7 +6817,7 @@
"Wxt3vVlxlYLi"
],
"title": "Attachments",
- "notePosition": 190,
+ "notePosition": 210,
"prefix": null,
"isExpanded": false,
"type": "text",
diff --git a/docs/User Guide/User Guide/Note Types/Book/Calendar View.md b/docs/User Guide/User Guide/Note Types/Book/Calendar View.md
index 3aa113406..047208b76 100644
--- a/docs/User Guide/User Guide/Note Types/Book/Calendar View.md
+++ b/docs/User Guide/User Guide/Note Types/Book/Calendar View.md
@@ -52,7 +52,7 @@ For each note of the calendar, the following attributes can be used:
| `#calendar:color` | Similar to `#color`, but applies the color only for the event in the calendar and not for other places such as the note tree. |
| `#iconClass` | If present, the icon of the note will be displayed to the left of the event title. |
| `#calendar:title` | Changes the title of an event to point to an attribute of the note other than the title, either a label (e.g. `#assignee`) or a relation (e.g. `~for`). See _Advanced use-cases_ for more information. |
-| `#calendar:displayedAttributes` | Allows displaying the value of one or more attributes in the calendar like this:Â  ``` #weight="70" #Mood="Good" #calendar:displayedAttributes="weight,Mood" ``` It can also be used with relations, case in which it will display the title of the target note: ``` ~assignee=@My assignee #calendar:displayedAttributes="assignee" ``` |
+| `#calendar:displayedAttributes` | Allows displaying the value of one or more attributes in the calendar like this:Â  ` #weight="70" #Mood="Good" #calendar:displayedAttributes="weight,Mood" ` It can also be used with relations, case in which it will display the title of the target note: ` ~assignee=@My assignee #calendar:displayedAttributes="assignee" ` |
| `#calendar:startDate` | Allows using a different label to represent the start date, other than `startDate` (e.g. `expiryDate`). The label name **must not be** prefixed with `#`. If the label is not defined for a note, the default will be used instead. |
| `#calendar:endDate` | Allows using a different label to represent the start date, other than `endDate`. The label name **must not be** prefixed with `#`. If the label is not defined for a note, the default will be used instead. |
diff --git a/docs/User Guide/User Guide/Note Types/Text/Content language & Right-to-le.md b/docs/User Guide/User Guide/Note Types/Text/Content language & Right-to-le.md
index 81eb9bd15..21d84462c 100644
--- a/docs/User Guide/User Guide/Note Types/Text/Content language & Right-to-le.md
+++ b/docs/User Guide/User Guide/Note Types/Text/Content language & Right-to-le.md
@@ -1,5 +1,5 @@
# Content language & Right-to-left support
-
+
A language hint can be provided for text notes. This option informs the browser or the desktop application about the language the note is written in (for example this might help with spellchecking), and it also determines whether the text is displayed from right-to-left for languages such as Arabic, Hebrew, etc.
diff --git a/src/public/app/doc_notes/en/User Guide/!!!meta.json b/src/public/app/doc_notes/en/User Guide/!!!meta.json
index 54c523b7a..465fff9fa 100644
--- a/src/public/app/doc_notes/en/User Guide/!!!meta.json
+++ b/src/public/app/doc_notes/en/User Guide/!!!meta.json
@@ -9,7 +9,7 @@
"pOsGYCXsbNQG"
],
"title": "User Guide",
- "notePosition": 10,
+ "notePosition": 110,
"prefix": null,
"isExpanded": true,
"type": "text",
@@ -1486,28 +1486,28 @@
"name": "internalLink",
"value": "poXkQfguuA0U",
"isInheritable": false,
- "position": 20
+ "position": 10
},
{
"type": "relation",
"name": "internalLink",
"value": "WOcw2SLH6tbX",
"isInheritable": false,
- "position": 30
+ "position": 20
},
{
"type": "relation",
"name": "internalLink",
"value": "RDslemsQ6gCp",
"isInheritable": false,
- "position": 40
+ "position": 30
},
{
"type": "relation",
"name": "internalLink",
"value": "cbkrhQjrkKrh",
"isInheritable": false,
- "position": 50
+ "position": 40
},
{
"type": "label",
@@ -1528,6 +1528,939 @@
"dataFileName": "Quick Start.html",
"attachments": []
},
+ {
+ "isClone": false,
+ "noteId": "Otzi9La2YAUX",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX"
+ ],
+ "title": "Installation & Setup",
+ "notePosition": 60,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/html",
+ "attributes": [
+ {
+ "type": "label",
+ "name": "iconClass",
+ "value": "bx bx-cog",
+ "isInheritable": false,
+ "position": 10
+ }
+ ],
+ "format": "html",
+ "attachments": [],
+ "dirFileName": "Installation & Setup",
+ "children": [
+ {
+ "isClone": false,
+ "noteId": "poXkQfguuA0U",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "poXkQfguuA0U"
+ ],
+ "title": "Desktop Installation",
+ "notePosition": 10,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "tAassRL4RSQL",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "l2VkvOwUNfZj",
+ "isInheritable": false,
+ "position": 20
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "cbkrhQjrkKrh",
+ "isInheritable": false,
+ "position": 30
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "desktop-installation",
+ "isInheritable": false,
+ "position": 30
+ }
+ ],
+ "format": "html",
+ "dataFileName": "Desktop Installation.html",
+ "attachments": []
+ },
+ {
+ "isClone": false,
+ "noteId": "WOcw2SLH6tbX",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX"
+ ],
+ "title": "Server Installation",
+ "notePosition": 20,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "cbkrhQjrkKrh",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "rWX5eY045zbE",
+ "isInheritable": false,
+ "position": 20
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "3tW6mORuTHnB",
+ "isInheritable": false,
+ "position": 30
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "J1Bb6lVlwU5T",
+ "isInheritable": false,
+ "position": 40
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "DCmT6e7clMoP",
+ "isInheritable": false,
+ "position": 50
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "moVgBcoxE3EK",
+ "isInheritable": false,
+ "position": 60
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "RDslemsQ6gCp",
+ "isInheritable": false,
+ "position": 70
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "l2VkvOwUNfZj",
+ "isInheritable": false,
+ "position": 80
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "tAassRL4RSQL",
+ "isInheritable": false,
+ "position": 90
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "Gzjqa934BdH4",
+ "isInheritable": false,
+ "position": 100
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "wX4HbRucYSDD",
+ "isInheritable": false,
+ "position": 110
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "fDLvzOx29Pfg",
+ "isInheritable": false,
+ "position": 120
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "server-installation",
+ "isInheritable": false,
+ "position": 30
+ }
+ ],
+ "format": "html",
+ "dataFileName": "Server Installation.html",
+ "attachments": [],
+ "dirFileName": "Server Installation",
+ "children": [
+ {
+ "isClone": false,
+ "noteId": "Dgg7bR3b6K9j",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "Dgg7bR3b6K9j"
+ ],
+ "title": "1. Installing the server",
+ "notePosition": 10,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/html",
+ "attributes": [],
+ "format": "html",
+ "attachments": [],
+ "dirFileName": "1. Installing the server",
+ "children": [
+ {
+ "isClone": false,
+ "noteId": "3tW6mORuTHnB",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "Dgg7bR3b6K9j",
+ "3tW6mORuTHnB"
+ ],
+ "title": "Packaged server installation",
+ "notePosition": 10,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "WOcw2SLH6tbX",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "l2VkvOwUNfZj",
+ "isInheritable": false,
+ "position": 20
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "packaged-server-installation",
+ "isInheritable": false,
+ "position": 20
+ }
+ ],
+ "format": "html",
+ "dataFileName": "Packaged server installation.html",
+ "attachments": []
+ },
+ {
+ "isClone": false,
+ "noteId": "rWX5eY045zbE",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "Dgg7bR3b6K9j",
+ "rWX5eY045zbE"
+ ],
+ "title": "Docker Server Installation",
+ "notePosition": 20,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "ud6MShXL4WpO",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "fDLvzOx29Pfg",
+ "isInheritable": false,
+ "position": 20
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "docker-server-installation",
+ "isInheritable": false,
+ "position": 30
+ }
+ ],
+ "format": "html",
+ "dataFileName": "Docker Server Installation.html",
+ "attachments": []
+ },
+ {
+ "isClone": false,
+ "noteId": "moVgBcoxE3EK",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "Dgg7bR3b6K9j",
+ "moVgBcoxE3EK"
+ ],
+ "title": "NixOS server installation",
+ "notePosition": 30,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "nixos-server-installation",
+ "isInheritable": false,
+ "position": 10
+ }
+ ],
+ "format": "html",
+ "dataFileName": "NixOS server installation.html",
+ "attachments": []
+ },
+ {
+ "isClone": false,
+ "noteId": "J1Bb6lVlwU5T",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "Dgg7bR3b6K9j",
+ "J1Bb6lVlwU5T"
+ ],
+ "title": "Manual server installation",
+ "notePosition": 40,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "l2VkvOwUNfZj",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "manual-server-installation",
+ "isInheritable": false,
+ "position": 20
+ }
+ ],
+ "format": "html",
+ "dataFileName": "Manual server installation.html",
+ "attachments": []
+ },
+ {
+ "isClone": false,
+ "noteId": "DCmT6e7clMoP",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "Dgg7bR3b6K9j",
+ "DCmT6e7clMoP"
+ ],
+ "title": "Kubernetes server installation",
+ "notePosition": 50,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "kubernetes-server-installation",
+ "isInheritable": false,
+ "position": 10
+ }
+ ],
+ "format": "html",
+ "dataFileName": "Kubernetes server installation.html",
+ "attachments": []
+ }
+ ]
+ },
+ {
+ "isClone": false,
+ "noteId": "vcjrb3VVYPZI",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "vcjrb3VVYPZI"
+ ],
+ "title": "2. Reverse proxy",
+ "notePosition": 20,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/html",
+ "attributes": [],
+ "format": "html",
+ "attachments": [],
+ "dirFileName": "2. Reverse proxy",
+ "children": [
+ {
+ "isClone": false,
+ "noteId": "ud6MShXL4WpO",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "vcjrb3VVYPZI",
+ "ud6MShXL4WpO"
+ ],
+ "title": "Nginx",
+ "notePosition": 10,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "nginx-proxy-setup",
+ "isInheritable": false,
+ "position": 10
+ }
+ ],
+ "format": "html",
+ "dataFileName": "Nginx.html",
+ "attachments": []
+ },
+ {
+ "isClone": false,
+ "noteId": "fDLvzOx29Pfg",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "vcjrb3VVYPZI",
+ "fDLvzOx29Pfg"
+ ],
+ "title": "Apache",
+ "notePosition": 20,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "apache-proxy-setup",
+ "isInheritable": false,
+ "position": 10
+ }
+ ],
+ "format": "html",
+ "dataFileName": "Apache.html",
+ "attachments": []
+ }
+ ]
+ },
+ {
+ "isClone": false,
+ "noteId": "l2VkvOwUNfZj",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "l2VkvOwUNfZj"
+ ],
+ "title": "TLS Configuration",
+ "notePosition": 100,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "WOcw2SLH6tbX",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "tAassRL4RSQL",
+ "isInheritable": false,
+ "position": 20
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "Gzjqa934BdH4",
+ "isInheritable": false,
+ "position": 30
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "tls-configuration",
+ "isInheritable": false,
+ "position": 20
+ }
+ ],
+ "format": "html",
+ "dataFileName": "TLS Configuration.html",
+ "attachments": []
+ },
+ {
+ "isClone": false,
+ "noteId": "7DAiwaf8Z7Rz",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "7DAiwaf8Z7Rz"
+ ],
+ "title": "Multi-Factor Authentication",
+ "notePosition": 110,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "multi-factor-authentication",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "label",
+ "name": "shareHiddenFromTree",
+ "value": "",
+ "isInheritable": false,
+ "position": 20
+ }
+ ],
+ "format": "html",
+ "dataFileName": "Multi-Factor Authentication.html",
+ "attachments": []
+ },
+ {
+ "isClone": false,
+ "noteId": "KaM3TfD7mP78",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "WOcw2SLH6tbX",
+ "KaM3TfD7mP78"
+ ],
+ "title": "Reverse proxy setup",
+ "notePosition": 120,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/html",
+ "attributes": [],
+ "format": "html",
+ "dataFileName": "Reverse proxy setup.html",
+ "attachments": []
+ }
+ ]
+ },
+ {
+ "isClone": false,
+ "noteId": "cbkrhQjrkKrh",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "cbkrhQjrkKrh"
+ ],
+ "title": "Synchronization",
+ "notePosition": 30,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "imageLink",
+ "value": "676Ekdv73T7I",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "relation",
+ "name": "imageLink",
+ "value": "SDHWNDsB68aJ",
+ "isInheritable": false,
+ "position": 20
+ },
+ {
+ "type": "relation",
+ "name": "imageLink",
+ "value": "qGTyyKX4TceE",
+ "isInheritable": false,
+ "position": 30
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "l2VkvOwUNfZj",
+ "isInheritable": false,
+ "position": 40
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "poXkQfguuA0U",
+ "isInheritable": false,
+ "position": 50
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "vZWERwf8U3nx",
+ "isInheritable": false,
+ "position": 60
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "synchronization",
+ "isInheritable": false,
+ "position": 30
+ }
+ ],
+ "format": "html",
+ "dataFileName": "Synchronization.html",
+ "attachments": [
+ {
+ "attachmentId": "s3fKDqHslToK",
+ "title": "image.png",
+ "role": "image",
+ "mime": "image/jpg",
+ "position": 10,
+ "dataFileName": "Synchronization_image.png"
+ }
+ ]
+ },
+ {
+ "isClone": false,
+ "noteId": "RDslemsQ6gCp",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "RDslemsQ6gCp"
+ ],
+ "title": "Mobile Frontend",
+ "notePosition": 40,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "imageLink",
+ "value": "TFAiJIXJFfqv",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "relation",
+ "name": "imageLink",
+ "value": "fi37V32TNyzm",
+ "isInheritable": false,
+ "position": 20
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "bwg0e8ewQMak",
+ "isInheritable": false,
+ "position": 30
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "WOcw2SLH6tbX",
+ "isInheritable": false,
+ "position": 40
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "CdNpE2pqjmI6",
+ "isInheritable": false,
+ "position": 50
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "mobile-frontend",
+ "isInheritable": false,
+ "position": 30
+ }
+ ],
+ "format": "html",
+ "dataFileName": "Mobile Frontend.html",
+ "attachments": []
+ },
+ {
+ "isClone": false,
+ "noteId": "MtPxeAWVAzMg",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "MtPxeAWVAzMg"
+ ],
+ "title": "Web Clipper",
+ "notePosition": 50,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "l0tKav7yLHGF",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "zEY4DaJG4YT5",
+ "isInheritable": false,
+ "position": 20
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "WOcw2SLH6tbX",
+ "isInheritable": false,
+ "position": 30
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "web-clipper",
+ "isInheritable": false,
+ "position": 20
+ }
+ ],
+ "format": "html",
+ "dataFileName": "Web Clipper.html",
+ "attachments": [
+ {
+ "attachmentId": "fhKf5Otv0M5Y",
+ "title": "image.png",
+ "role": "image",
+ "mime": "image/png",
+ "position": 10,
+ "dataFileName": "Web Clipper_image.png"
+ }
+ ]
+ },
+ {
+ "isClone": false,
+ "noteId": "n1lujUxCwipy",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "n1lujUxCwipy"
+ ],
+ "title": "Upgrading TriliumNext",
+ "notePosition": 60,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "rWX5eY045zbE",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "wX4HbRucYSDD",
+ "isInheritable": false,
+ "position": 20
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "ODY7qQn5m2FT",
+ "isInheritable": false,
+ "position": 30
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "cbkrhQjrkKrh",
+ "isInheritable": false,
+ "position": 40
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "upgrading-trilium",
+ "isInheritable": false,
+ "position": 20
+ }
+ ],
+ "format": "html",
+ "dataFileName": "Upgrading TriliumNext.html",
+ "attachments": []
+ },
+ {
+ "isClone": false,
+ "noteId": "ODY7qQn5m2FT",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "ODY7qQn5m2FT"
+ ],
+ "title": "Backup",
+ "notePosition": 70,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "Gzjqa934BdH4",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "tAassRL4RSQL",
+ "isInheritable": false,
+ "position": 20
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "cbkrhQjrkKrh",
+ "isInheritable": false,
+ "position": 30
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "backup",
+ "isInheritable": false,
+ "position": 20
+ }
+ ],
+ "format": "html",
+ "dataFileName": "Backup.html",
+ "attachments": []
+ },
+ {
+ "isClone": false,
+ "noteId": "tAassRL4RSQL",
+ "notePath": [
+ "pOsGYCXsbNQG",
+ "Otzi9La2YAUX",
+ "tAassRL4RSQL"
+ ],
+ "title": "Data directory",
+ "notePosition": 80,
+ "prefix": null,
+ "isExpanded": false,
+ "type": "text",
+ "mime": "text/markdown",
+ "attributes": [
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "wX4HbRucYSDD",
+ "isInheritable": false,
+ "position": 10
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "ODY7qQn5m2FT",
+ "isInheritable": false,
+ "position": 20
+ },
+ {
+ "type": "label",
+ "name": "shareAlias",
+ "value": "data-directory",
+ "isInheritable": false,
+ "position": 30
+ },
+ {
+ "type": "label",
+ "name": "iconClass",
+ "value": "bx bx-folder-open",
+ "isInheritable": false,
+ "position": 40
+ }
+ ],
+ "format": "html",
+ "dataFileName": "Data directory.html",
+ "attachments": [
+ {
+ "attachmentId": "NONZTci1YkNe",
+ "title": "image.png",
+ "role": "image",
+ "mime": "image/jpg",
+ "position": 10,
+ "dataFileName": "Data directory_image.png"
+ }
+ ]
+ }
+ ]
+ },
{
"isClone": false,
"noteId": "gh7bpGYxajRS",
@@ -1536,9 +2469,9 @@
"gh7bpGYxajRS"
],
"title": "Basic Concepts",
- "notePosition": 60,
+ "notePosition": 70,
"prefix": null,
- "isExpanded": true,
+ "isExpanded": false,
"type": "text",
"mime": "text/html",
"attributes": [
@@ -1634,6 +2567,13 @@
"isInheritable": false,
"position": 40
},
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "_lbSettings",
+ "isInheritable": false,
+ "position": 50
+ },
{
"type": "label",
"name": "iconClass",
@@ -3052,7 +3992,7 @@
"title": "Import & Export",
"notePosition": 90,
"prefix": null,
- "isExpanded": true,
+ "isExpanded": false,
"type": "text",
"mime": "text/html",
"attributes": [],
@@ -3276,7 +4216,7 @@
"KSZ04uQ2D1St"
],
"title": "Note Types",
- "notePosition": 70,
+ "notePosition": 80,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -5013,7 +5953,7 @@
"pKK96zzmvBGf"
],
"title": "Theme development",
- "notePosition": 100,
+ "notePosition": 110,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -5216,7 +6156,7 @@
"k2Gc17NbaAwb"
],
"title": "Developer Guides",
- "notePosition": 120,
+ "notePosition": 130,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -5523,939 +6463,6 @@
}
]
},
- {
- "isClone": false,
- "noteId": "Otzi9La2YAUX",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX"
- ],
- "title": "Installation & Setup",
- "notePosition": 160,
- "prefix": null,
- "isExpanded": true,
- "type": "text",
- "mime": "text/html",
- "attributes": [
- {
- "type": "label",
- "name": "iconClass",
- "value": "bx bx-cog",
- "isInheritable": false,
- "position": 10
- }
- ],
- "format": "html",
- "attachments": [],
- "dirFileName": "Installation & Setup",
- "children": [
- {
- "isClone": false,
- "noteId": "poXkQfguuA0U",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "poXkQfguuA0U"
- ],
- "title": "Desktop Installation",
- "notePosition": 10,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "internalLink",
- "value": "tAassRL4RSQL",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "l2VkvOwUNfZj",
- "isInheritable": false,
- "position": 20
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "cbkrhQjrkKrh",
- "isInheritable": false,
- "position": 30
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "desktop-installation",
- "isInheritable": false,
- "position": 30
- }
- ],
- "format": "html",
- "dataFileName": "Desktop Installation.html",
- "attachments": []
- },
- {
- "isClone": false,
- "noteId": "WOcw2SLH6tbX",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX"
- ],
- "title": "Server Installation",
- "notePosition": 20,
- "prefix": null,
- "isExpanded": true,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "internalLink",
- "value": "cbkrhQjrkKrh",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "rWX5eY045zbE",
- "isInheritable": false,
- "position": 20
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "3tW6mORuTHnB",
- "isInheritable": false,
- "position": 30
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "J1Bb6lVlwU5T",
- "isInheritable": false,
- "position": 40
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "DCmT6e7clMoP",
- "isInheritable": false,
- "position": 50
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "moVgBcoxE3EK",
- "isInheritable": false,
- "position": 60
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "RDslemsQ6gCp",
- "isInheritable": false,
- "position": 70
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "l2VkvOwUNfZj",
- "isInheritable": false,
- "position": 80
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "tAassRL4RSQL",
- "isInheritable": false,
- "position": 90
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "Gzjqa934BdH4",
- "isInheritable": false,
- "position": 100
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "wX4HbRucYSDD",
- "isInheritable": false,
- "position": 110
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "fDLvzOx29Pfg",
- "isInheritable": false,
- "position": 120
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "server-installation",
- "isInheritable": false,
- "position": 30
- }
- ],
- "format": "html",
- "dataFileName": "Server Installation.html",
- "attachments": [],
- "dirFileName": "Server Installation",
- "children": [
- {
- "isClone": false,
- "noteId": "Dgg7bR3b6K9j",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "Dgg7bR3b6K9j"
- ],
- "title": "1. Installing the server",
- "notePosition": 10,
- "prefix": null,
- "isExpanded": true,
- "type": "text",
- "mime": "text/html",
- "attributes": [],
- "format": "html",
- "attachments": [],
- "dirFileName": "1. Installing the server",
- "children": [
- {
- "isClone": false,
- "noteId": "3tW6mORuTHnB",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "Dgg7bR3b6K9j",
- "3tW6mORuTHnB"
- ],
- "title": "Packaged server installation",
- "notePosition": 10,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "internalLink",
- "value": "WOcw2SLH6tbX",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "l2VkvOwUNfZj",
- "isInheritable": false,
- "position": 20
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "packaged-server-installation",
- "isInheritable": false,
- "position": 20
- }
- ],
- "format": "html",
- "dataFileName": "Packaged server installation.html",
- "attachments": []
- },
- {
- "isClone": false,
- "noteId": "rWX5eY045zbE",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "Dgg7bR3b6K9j",
- "rWX5eY045zbE"
- ],
- "title": "Docker Server Installation",
- "notePosition": 20,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "internalLink",
- "value": "ud6MShXL4WpO",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "fDLvzOx29Pfg",
- "isInheritable": false,
- "position": 20
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "docker-server-installation",
- "isInheritable": false,
- "position": 30
- }
- ],
- "format": "html",
- "dataFileName": "Docker Server Installation.html",
- "attachments": []
- },
- {
- "isClone": false,
- "noteId": "moVgBcoxE3EK",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "Dgg7bR3b6K9j",
- "moVgBcoxE3EK"
- ],
- "title": "NixOS server installation",
- "notePosition": 30,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "label",
- "name": "shareAlias",
- "value": "nixos-server-installation",
- "isInheritable": false,
- "position": 10
- }
- ],
- "format": "html",
- "dataFileName": "NixOS server installation.html",
- "attachments": []
- },
- {
- "isClone": false,
- "noteId": "J1Bb6lVlwU5T",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "Dgg7bR3b6K9j",
- "J1Bb6lVlwU5T"
- ],
- "title": "Manual server installation",
- "notePosition": 40,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "internalLink",
- "value": "l2VkvOwUNfZj",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "manual-server-installation",
- "isInheritable": false,
- "position": 20
- }
- ],
- "format": "html",
- "dataFileName": "Manual server installation.html",
- "attachments": []
- },
- {
- "isClone": false,
- "noteId": "DCmT6e7clMoP",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "Dgg7bR3b6K9j",
- "DCmT6e7clMoP"
- ],
- "title": "Kubernetes server installation",
- "notePosition": 50,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "label",
- "name": "shareAlias",
- "value": "kubernetes-server-installation",
- "isInheritable": false,
- "position": 10
- }
- ],
- "format": "html",
- "dataFileName": "Kubernetes server installation.html",
- "attachments": []
- }
- ]
- },
- {
- "isClone": false,
- "noteId": "vcjrb3VVYPZI",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "vcjrb3VVYPZI"
- ],
- "title": "2. Reverse proxy",
- "notePosition": 20,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/html",
- "attributes": [],
- "format": "html",
- "attachments": [],
- "dirFileName": "2. Reverse proxy",
- "children": [
- {
- "isClone": false,
- "noteId": "ud6MShXL4WpO",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "vcjrb3VVYPZI",
- "ud6MShXL4WpO"
- ],
- "title": "Nginx",
- "notePosition": 10,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "label",
- "name": "shareAlias",
- "value": "nginx-proxy-setup",
- "isInheritable": false,
- "position": 10
- }
- ],
- "format": "html",
- "dataFileName": "Nginx.html",
- "attachments": []
- },
- {
- "isClone": false,
- "noteId": "fDLvzOx29Pfg",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "vcjrb3VVYPZI",
- "fDLvzOx29Pfg"
- ],
- "title": "Apache",
- "notePosition": 20,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "label",
- "name": "shareAlias",
- "value": "apache-proxy-setup",
- "isInheritable": false,
- "position": 10
- }
- ],
- "format": "html",
- "dataFileName": "Apache.html",
- "attachments": []
- }
- ]
- },
- {
- "isClone": false,
- "noteId": "l2VkvOwUNfZj",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "l2VkvOwUNfZj"
- ],
- "title": "TLS Configuration",
- "notePosition": 100,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "internalLink",
- "value": "WOcw2SLH6tbX",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "tAassRL4RSQL",
- "isInheritable": false,
- "position": 20
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "Gzjqa934BdH4",
- "isInheritable": false,
- "position": 30
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "tls-configuration",
- "isInheritable": false,
- "position": 20
- }
- ],
- "format": "html",
- "dataFileName": "TLS Configuration.html",
- "attachments": []
- },
- {
- "isClone": false,
- "noteId": "7DAiwaf8Z7Rz",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "7DAiwaf8Z7Rz"
- ],
- "title": "Multi-Factor Authentication",
- "notePosition": 110,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "label",
- "name": "shareAlias",
- "value": "multi-factor-authentication",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "label",
- "name": "shareHiddenFromTree",
- "value": "",
- "isInheritable": false,
- "position": 20
- }
- ],
- "format": "html",
- "dataFileName": "Multi-Factor Authentication.html",
- "attachments": []
- },
- {
- "isClone": false,
- "noteId": "KaM3TfD7mP78",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "WOcw2SLH6tbX",
- "KaM3TfD7mP78"
- ],
- "title": "Reverse proxy setup",
- "notePosition": 120,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/html",
- "attributes": [],
- "format": "html",
- "dataFileName": "Reverse proxy setup.html",
- "attachments": []
- }
- ]
- },
- {
- "isClone": false,
- "noteId": "cbkrhQjrkKrh",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "cbkrhQjrkKrh"
- ],
- "title": "Synchronization",
- "notePosition": 30,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "imageLink",
- "value": "676Ekdv73T7I",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "relation",
- "name": "imageLink",
- "value": "SDHWNDsB68aJ",
- "isInheritable": false,
- "position": 20
- },
- {
- "type": "relation",
- "name": "imageLink",
- "value": "qGTyyKX4TceE",
- "isInheritable": false,
- "position": 30
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "l2VkvOwUNfZj",
- "isInheritable": false,
- "position": 40
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "poXkQfguuA0U",
- "isInheritable": false,
- "position": 50
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "vZWERwf8U3nx",
- "isInheritable": false,
- "position": 60
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "synchronization",
- "isInheritable": false,
- "position": 30
- }
- ],
- "format": "html",
- "dataFileName": "Synchronization.html",
- "attachments": [
- {
- "attachmentId": "s3fKDqHslToK",
- "title": "image.png",
- "role": "image",
- "mime": "image/jpg",
- "position": 10,
- "dataFileName": "Synchronization_image.png"
- }
- ]
- },
- {
- "isClone": false,
- "noteId": "RDslemsQ6gCp",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "RDslemsQ6gCp"
- ],
- "title": "Mobile Frontend",
- "notePosition": 40,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "imageLink",
- "value": "TFAiJIXJFfqv",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "relation",
- "name": "imageLink",
- "value": "fi37V32TNyzm",
- "isInheritable": false,
- "position": 20
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "bwg0e8ewQMak",
- "isInheritable": false,
- "position": 30
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "WOcw2SLH6tbX",
- "isInheritable": false,
- "position": 40
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "CdNpE2pqjmI6",
- "isInheritable": false,
- "position": 50
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "mobile-frontend",
- "isInheritable": false,
- "position": 30
- }
- ],
- "format": "html",
- "dataFileName": "Mobile Frontend.html",
- "attachments": []
- },
- {
- "isClone": false,
- "noteId": "MtPxeAWVAzMg",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "MtPxeAWVAzMg"
- ],
- "title": "Web Clipper",
- "notePosition": 50,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "internalLink",
- "value": "l0tKav7yLHGF",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "zEY4DaJG4YT5",
- "isInheritable": false,
- "position": 20
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "WOcw2SLH6tbX",
- "isInheritable": false,
- "position": 30
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "web-clipper",
- "isInheritable": false,
- "position": 20
- }
- ],
- "format": "html",
- "dataFileName": "Web Clipper.html",
- "attachments": [
- {
- "attachmentId": "fhKf5Otv0M5Y",
- "title": "image.png",
- "role": "image",
- "mime": "image/png",
- "position": 10,
- "dataFileName": "Web Clipper_image.png"
- }
- ]
- },
- {
- "isClone": false,
- "noteId": "n1lujUxCwipy",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "n1lujUxCwipy"
- ],
- "title": "Upgrading TriliumNext",
- "notePosition": 60,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "internalLink",
- "value": "rWX5eY045zbE",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "wX4HbRucYSDD",
- "isInheritable": false,
- "position": 20
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "ODY7qQn5m2FT",
- "isInheritable": false,
- "position": 30
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "cbkrhQjrkKrh",
- "isInheritable": false,
- "position": 40
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "upgrading-trilium",
- "isInheritable": false,
- "position": 20
- }
- ],
- "format": "html",
- "dataFileName": "Upgrading TriliumNext.html",
- "attachments": []
- },
- {
- "isClone": false,
- "noteId": "ODY7qQn5m2FT",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "ODY7qQn5m2FT"
- ],
- "title": "Backup",
- "notePosition": 70,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "internalLink",
- "value": "Gzjqa934BdH4",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "tAassRL4RSQL",
- "isInheritable": false,
- "position": 20
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "cbkrhQjrkKrh",
- "isInheritable": false,
- "position": 30
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "backup",
- "isInheritable": false,
- "position": 20
- }
- ],
- "format": "html",
- "dataFileName": "Backup.html",
- "attachments": []
- },
- {
- "isClone": false,
- "noteId": "tAassRL4RSQL",
- "notePath": [
- "pOsGYCXsbNQG",
- "Otzi9La2YAUX",
- "tAassRL4RSQL"
- ],
- "title": "Data directory",
- "notePosition": 80,
- "prefix": null,
- "isExpanded": false,
- "type": "text",
- "mime": "text/markdown",
- "attributes": [
- {
- "type": "relation",
- "name": "internalLink",
- "value": "wX4HbRucYSDD",
- "isInheritable": false,
- "position": 10
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "ODY7qQn5m2FT",
- "isInheritable": false,
- "position": 20
- },
- {
- "type": "label",
- "name": "shareAlias",
- "value": "data-directory",
- "isInheritable": false,
- "position": 30
- },
- {
- "type": "label",
- "name": "iconClass",
- "value": "bx bx-folder-open",
- "isInheritable": false,
- "position": 40
- }
- ],
- "format": "html",
- "dataFileName": "Data directory.html",
- "attachments": [
- {
- "attachmentId": "NONZTci1YkNe",
- "title": "image.png",
- "role": "image",
- "mime": "image/jpg",
- "position": 10,
- "dataFileName": "Data directory_image.png"
- }
- ]
- }
- ]
- },
{
"isClone": false,
"noteId": "i6dbnitykE5D",
@@ -6464,7 +6471,7 @@
"i6dbnitykE5D"
],
"title": "FAQ",
- "notePosition": 170,
+ "notePosition": 180,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -6501,24 +6508,31 @@
{
"type": "relation",
"name": "internalLink",
- "value": "CdNpE2pqjmI6",
+ "value": "wy8So3yZZlH9",
"isInheritable": false,
"position": 50
},
{
"type": "relation",
"name": "internalLink",
- "value": "tAassRL4RSQL",
+ "value": "CdNpE2pqjmI6",
"isInheritable": false,
"position": 60
},
{
"type": "relation",
"name": "internalLink",
- "value": "cbkrhQjrkKrh",
+ "value": "tAassRL4RSQL",
"isInheritable": false,
"position": 70
},
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "cbkrhQjrkKrh",
+ "isInheritable": false,
+ "position": 80
+ },
{
"type": "label",
"name": "shareAlias",
@@ -6532,13 +6546,6 @@
"value": "bx bx-question-mark",
"isInheritable": false,
"position": 40
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "wy8So3yZZlH9",
- "isInheritable": false,
- "position": 80
}
],
"format": "html",
@@ -6553,7 +6560,7 @@
"BgmBlOIl72jZ"
],
"title": "Troubleshooting",
- "notePosition": 180,
+ "notePosition": 190,
"prefix": null,
"isExpanded": false,
"type": "text",
@@ -6810,7 +6817,7 @@
"Wxt3vVlxlYLi"
],
"title": "Attachments",
- "notePosition": 190,
+ "notePosition": 210,
"prefix": null,
"isExpanded": false,
"type": "text",
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Advanced Showcases/Day Notes.html b/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Advanced Showcases/Day Notes.html
index 46e2442f4..266223fd5 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Advanced Showcases/Day Notes.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Advanced Showcases/Day Notes.html
@@ -25,14 +25,14 @@
Select an existing day note, and the menubar contains a calendar widget.
Select any day to create a note for that day.Â
-
+
This pattern works well also because of Cloning Notes functionality
- note can appear in multiple places in the note tree, so besides appearing
under day note, it can also be categorized into other notes.
Demo
-
+
You can see the structure of day notes appearing under "Journal" note
- there's a note for the whole year 2017, under it, you have "12 - December"
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager.html b/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager.html
index 1a7e9bf4e..3c0b1fb84 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager.html
@@ -18,7 +18,7 @@
href="../../Note%20Types/Code/Scripts.html">scriptsshowcase present in the demo notes .
Demo
-
+
Task Manager manages outstanding (TODO) tasks and finished tasks (non-empty
doneDate attribute). Outstanding tasks are further categorized by location
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Advanced Showcases/Weight Tracker.html b/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Advanced Showcases/Weight Tracker.html
index 1629f2af4..e20f4d792 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Advanced Showcases/Weight Tracker.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Advanced Showcases/Weight Tracker.html
@@ -14,7 +14,7 @@
-
+
The Weight Tracker is a Script API showcase
present in the demo notes .
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes.html b/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes.html
index 8dddf4433..a4f3c09b5 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes.html
@@ -22,7 +22,7 @@
These attributes play a crucial role in organizing, categorising, and
enhancing the functionality of notes.
-
+
Labels
Labels in Trilium can be used for a variety of purposes:
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Promoted Attributes.html b/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Promoted Attributes.html
index 325639164..a15f9f447 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Promoted Attributes.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Promoted Attributes.html
@@ -17,7 +17,7 @@
are considered important and thus are "promoted" onto the main note UI.
See example below:
-
+
You can see the note having kind of form with several fields. Each of
these is just regular attribute, the only difference is that they appear
@@ -32,7 +32,7 @@
- is it just string, or is it a date? Should we allow multiple values or
note? And importantly, should we promote the attribute or not?
-
+
You can notice tag attribute definition. These "definition" attributes
define how the "value" attributes should behave.
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Database/Manually altering the database.html b/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Database/Manually altering the database.html
index eaa2dad70..a8f61c0fd 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Database/Manually altering the database.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Database/Manually altering the database.html
@@ -41,7 +41,7 @@
Close the application or close the database.
-
+
Using the SQLite CLI
First, start the SQLite 3 CLI by specifying the path to the database:
sqlite3 ~/.local/share/trilium-data/document.db
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Database/Manually altering the database/SQL Console.html b/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Database/Manually altering the database/SQL Console.html
index 255d0efcf..f982f4336 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Database/Manually altering the database/SQL Console.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Database/Manually altering the database/SQL Console.html
@@ -17,7 +17,7 @@
It can be accessed by going to the global menu →
Advanced → Open SQL Console.
-
+
Interaction
@@ -30,20 +30,19 @@
To run the statement, press the
- icon.
+ icon.
For queries that return a result, the data will displayed in a table.
-
+
Saved SQL console
SQL queries or commands can be saved into a dedicated note.
To do so, simply write the query and press the
- button. Once saved, the note will appear in Day Notes .
+
button. Once saved, the note will appear inÂ
Day Notes .
The SQL expression will not be displayed by default, but it can still
be viewed by going to the note context menu and selecting Note source .
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Note Map.html b/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Note Map.html
index c944c0673..36615a27a 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Note Map.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Note Map.html
@@ -19,12 +19,12 @@
Link Map
Shows relations between notes:
-
+
Tree Map
Shows hierarchical map of notes:
-
+
See also
Relation map is a similar concept, with
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Relation Map.html b/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Relation Map.html
index 7751d1f3d..f1ce9dadb 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Relation Map.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Advanced Usage/Relation Map.html
@@ -20,11 +20,11 @@
This is a basic example how you can create simple diagram using relation
maps:
-
+
And this is how you can create it:
-
+
We start completely from scratch by first creating new note called "Development
process" and changing its type to "Relation map". After that we create
@@ -39,11 +39,11 @@
This is more complicated demo using some advanced concepts. Resulting
diagram is here:
-
+
This is how you get to it:
-
+
There are several steps here:
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Import & Export/Markdown.html b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Import & Export/Markdown.html
index aa9a810d5..7df5640d3 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Import & Export/Markdown.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Import & Export/Markdown.html
@@ -21,7 +21,7 @@
If you want to import just a chunk of markdown from clipboard, you can
do it from editor block menu:
-
+
File import
You can also import Markdown files from files:
@@ -38,20 +38,20 @@
[[gifs/markdown-file-import.gif]]
-
+
Export
Subtree export
You can export whole subtree to ZIP archive which will have directory
structured modelled after subtree structure:
-
+
Single note export
If you want to export just single note without its subtree, you can do
it from Note actions menu:
-
+
Exporting protected notes
If you want to export protected notes, enter a protected session first!
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Navigation/Bookmarks.html b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Navigation/Bookmarks.html
index 10f58c90b..946c7ed71 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Navigation/Bookmarks.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Navigation/Bookmarks.html
@@ -15,13 +15,13 @@
To easily access selected notes, you can bookmark them. See demo:
-
+
Bookmark folder
Space in the left panel is limited, and you might want to bookmark many
items. One possible solution is to bookmark a folder, so it shows its children:
-
+
To do this, you need to add a #bookmarkFolder label to the
note.
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Navigation/Note Hoisting.html b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Navigation/Note Hoisting.html
index 7586b532d..a9ded5a7b 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Navigation/Note Hoisting.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Navigation/Note Hoisting.html
@@ -17,7 +17,7 @@
"zoom into") a specific note and its subtree by hiding all parent and sibling
notes. Demo:
-
+
In addition to showing only this subtree, this also narrows both full
text search and “jump to note” to just
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Navigation/Note Navigation.html b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Navigation/Note Navigation.html
index 8e49f7fc8..feb1719a2 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Navigation/Note Navigation.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Navigation/Note Navigation.html
@@ -21,14 +21,14 @@
This works identically to browser backwards / forwards, it's actually
using built-in browser support for this.
-
+
Jump to note
This is useful to quickly find and view arbitrary note - click on Jump to button
on the top or press Ctrl + J . Then type part of the
note name and autocomplete will help you pick the desired note.
-
+
Recent notes
Jump to note also has the ability to show the list of recently viewed
@@ -38,7 +38,7 @@
will show the list of recent notes.
Alternatively you can click on the "time" icon on the right.
-
+
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Navigation/Workspace.html b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Navigation/Workspace.html
index ac06296a7..03ba412c5 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Navigation/Workspace.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Navigation/Workspace.html
@@ -27,13 +27,13 @@
easy entering of workspace:Â
-
+
visual identification of workspace in tabs:
-
+
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Note/Archived Notes.html b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Note/Archived Notes.html
index f7700bb24..9b95f4901 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Note/Archived Notes.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Note/Archived Notes.html
@@ -22,7 +22,7 @@
You can control whether archived notes are displayed in the note tree
with a setting:
-
+
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Note/Cloning Notes.html b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Note/Cloning Notes.html
index 4870aa748..f1f7c77cc 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Note/Cloning Notes.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Note/Cloning Notes.html
@@ -93,7 +93,7 @@
and notes.
Demo
-
+
In the demo, you can see how a clone can be created using the context
menu. It's possible to do this also using the Add Link dialog or with Ctrl +C and Ctrl +V
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Note/Export as PDF.html b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Note/Export as PDF.html
index 9adfe50b8..6db70ece0 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Note/Export as PDF.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Note/Export as PDF.html
@@ -14,7 +14,7 @@
-
+
Screenshot of the note contextual menu indicating the “Export as PDF”
option.
@@ -22,7 +22,7 @@
as PDF. On the server or PWA (mobile), the option is not available due
to technical constraints and it will be hidden.
To print a note, select the
- button to the right of the note and select Export as PDF .
+
button to the right of the note and select
Export as PDF .
Afterwards you will be prompted to select where to save the PDF file.
Upon confirmation, the resulting PDF will be opened automatically using
the default/system application configured for PDFs.
@@ -31,7 +31,7 @@
report the issue . In this case, it's best to offer a sample note (click
on the
-
button, select Export note → This note and all of its descendants → HTML
+
button, select Export note → This note and all of its descendants → HTML
in ZIP archive). Make sure not to accidentally leak any personal information.
Landscape mode
When exporting to PDF, there are no customizable settings such as page
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Note/Note Revisions.html b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Note/Note Revisions.html
index e7db23875..68f207d7a 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Note/Note Revisions.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Note/Note Revisions.html
@@ -35,7 +35,7 @@
Note revisions can be accessed through the button on the right of ribbon
toolbar.
-
+
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Themes.html b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Themes.html
index e73feed21..c98bd34e8 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Themes.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Themes.html
@@ -126,7 +126,7 @@ body .CodeMirror {
After making changes, press Ctrl + R to reload the frontend
and apply your new styles.
-
+
Styling Specific Notes in the Tree
To apply specific styles to certain notes in the tree:
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/UI Elements/Global menu.html b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/UI Elements/Global menu.html
index 5de10b75a..dabecef2e 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/UI Elements/Global menu.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/UI Elements/Global menu.html
@@ -16,7 +16,7 @@
The global menu configures the current window (zoom, keeping the window
on top) and offers access to some more advanced options.
-
+
Accessing the global menu
See Vertical and horizontal layout  since
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/UI Elements/Launch Bar.html b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/UI Elements/Launch Bar.html
index c49a3718b..76af9978b 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/UI Elements/Launch Bar.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/UI Elements/Launch Bar.html
@@ -38,7 +38,7 @@
This will open a new tab with the Note Tree  listing
the launchers.
-
+
Expanding Available Launchers section will show the list of launchers
that are not displayed on the launch bar. The Visible Launchers will
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/UI Elements/Note Tree.html b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/UI Elements/Note Tree.html
index 2b901005e..687a689fc 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/UI Elements/Note Tree.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/UI Elements/Note Tree.html
@@ -16,7 +16,7 @@
This page explains how to manipulate the note tree in TriliumNext, focusing
on moving notes.
-
+
Drag and Drop
@@ -51,7 +51,7 @@
Shift and click on the note to end the selection with. All the notes between
the start and the end note will be selected as well.
-
+
In the right-click menu, operations such as Cut, Copy, Move to, Clone
to or Delete will apply to all the selected notes. It is also possible
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/UI Elements/Ribbon.html b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/UI Elements/Ribbon.html
index b83fd3f17..62814c49c 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/UI Elements/Ribbon.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/UI Elements/Ribbon.html
@@ -14,7 +14,7 @@
-
+
The ribbon allows changing options, attributes and viewing information
about the current note.
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/UI Elements/Vertical and horizontal layout.html b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/UI Elements/Vertical and horizontal layout.html
index 263ab1b4e..832cda585 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/UI Elements/Vertical and horizontal layout.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/UI Elements/Vertical and horizontal layout.html
@@ -26,13 +26,13 @@
href="Note%20Tree.html">Note Tree.
The Note Tree  can be collapsed by pressing
the
- button at the bottom of the Launcher Bar .
+
button at the bottom of theÂ
Launcher Bar .
The Global menu  can be accessed via the
icon at the top of the Launcher Bar .
+ src="5_Vertical and horizontal la.png">icon at the top of theÂ
Launcher Bar .
-
+
Horizontal layout
The horizontal layout is a more traditional layout, since it bears similarity
@@ -48,13 +48,13 @@
removed if needed.
The Note Tree  can be collapsed by pressing
the small
- button to the left of the first tab.
+
button to the left of the first tab.
The Global menu  can be accessed via the
button at the end of the Launcher Bar .
+ src="1_Vertical and horizontal la.png">button at the end of theÂ
Launcher Bar .
-
+
Changing the layout
Go to Settings  and
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Zen mode.html b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Zen mode.html
index 7f1b9210b..f334cd72f 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Zen mode.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Basic Concepts/Zen mode.html
@@ -14,7 +14,7 @@
-
+
Screenshot of Zen Mode activated on a Windows 11 system with native title
bar off and background effects on.
@@ -22,7 +22,7 @@
of Trilium is hidden away in order to be able to focus on the content,
whether it's for reading or writing.
-
+
Screenshot of the Zen Mode option in the global menu.
Activating & deactivating
@@ -34,7 +34,7 @@
Once Zen Mode is activated, all the UI elements of the application will
be hidden away, including the global menu. In that case, the Zen Mode can
be deactivated either by pressing the
- icon in the top-right corner of the window or by pressing the keyboard
+ icon in the top-right corner of the window or by pressing the keyboard
combination again.
Do note that, by design, activating or deactivating the Zen Mode applies
only to the current window. Restarting the application will also disable
@@ -45,7 +45,7 @@
can still be moved by dragging the mouse across the top part of the window
where the note titles are.
-
+
Screenshot of two notes side-by-side while Zen Mode is active, on Windows
11 with background effects off.
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Developer Guides/Examples/Using promoted attributes to c.html b/src/public/app/doc_notes/en/User Guide/User Guide/Developer Guides/Examples/Using promoted attributes to c.html
index 3039dbd7d..228a43606 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Developer Guides/Examples/Using promoted attributes to c.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Developer Guides/Examples/Using promoted attributes to c.html
@@ -18,7 +18,7 @@
it's processing data, or a checkbox to define a particular change in behavior
for the script.
-
+
Using check boxes to toggle flags
Instead of asking the user to modify a boolean value in the script, it's
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Installation & Setup/Data directory.html b/src/public/app/doc_notes/en/User Guide/User Guide/Installation & Setup/Data directory.html
index ead3e2f91..bfc22b2b7 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Installation & Setup/Data directory.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Installation & Setup/Data directory.html
@@ -27,7 +27,7 @@
Easy way how to find out which data directory Trilium uses is to look
at the "About Trilium Notes" dialog (from "Menu" in upper left corner):
-
+
Here's how the location is decided:
Data directory is normally named trilium-data and it is stored
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Installation & Setup/Mobile Frontend.html b/src/public/app/doc_notes/en/User Guide/User Guide/Installation & Setup/Mobile Frontend.html
index 825d9acf7..410840f42 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Installation & Setup/Mobile Frontend.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Installation & Setup/Mobile Frontend.html
@@ -24,11 +24,11 @@
Screenshots
Mobile phone
-
+
Tablet
-
+
Limitations
Mobile frontend provides only some of the features of the full desktop
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Manual server installation.html b/src/public/app/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Manual server installation.html
index d125ca2c8..fe7d113ee 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Manual server installation.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Manual server installation.html
@@ -30,7 +30,7 @@
Installation
Download
You can either download source code zip/tar from https://github.com/TriliumNext/Notes/releases/latest .
-
For the latest version including betas, clone Git repository from master branch with:
git clone -b master https://github.com/triliumnext/notes.git
+
For the latest version including betas, clone Git repository from **master** branch with:
git clone -b master https://github.com/triliumnext/notes.git
Installation cd trilium
# download all node dependencies
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Installation & Setup/Synchronization.html b/src/public/app/doc_notes/en/User Guide/User Guide/Installation & Setup/Synchronization.html
index 6ed46a039..330e99a9c 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Installation & Setup/Synchronization.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Installation & Setup/Synchronization.html
@@ -18,7 +18,7 @@
up synchronization with a server instance, allowing multiple desktop clients
to sync with a central server. This creates a star-shaped topology:
-
+
In this setup, a central server (referred to as the sync server )
and multiple client (or desktop ) instances synchronize with
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Installation & Setup/Web Clipper.html b/src/public/app/doc_notes/en/User Guide/User Guide/Installation & Setup/Web Clipper.html
index 899ef8874..fbc3a2b39 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Installation & Setup/Web Clipper.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Installation & Setup/Web Clipper.html
@@ -14,7 +14,7 @@
-
+
Trilium Web Clipper is a web browser extension which allows user to clip
text, screenshots, whole pages and short notes and save them directly to
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Note Types/Book.html b/src/public/app/doc_notes/en/User Guide/User Guide/Note Types/Book.html
index 3a6458f86..171d2f9c5 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Note Types/Book.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Note Types/Book.html
@@ -18,7 +18,7 @@
book-like reading experience. This format is particularly useful for viewing
multiple smaller notes in a cohesive, continuous manner.
-
+
In the example above, the "node.js" note on the left panel contains several
child notes. The right panel displays the content of these child notes
@@ -33,7 +33,7 @@
This view presents the child notes in a grid format, allowing for a more
visual navigation experience.
-
+
Switching between these views can be easily managed through the Book Note's
settings (or viewType attribute), allowing users to choose the
diff --git a/src/public/app/doc_notes/en/User Guide/User Guide/Note Types/Book/Calendar View.html b/src/public/app/doc_notes/en/User Guide/User Guide/Note Types/Book/Calendar View.html
index d834e0be5..0bd85ce36 100644
--- a/src/public/app/doc_notes/en/User Guide/User Guide/Note Types/Book/Calendar View.html
+++ b/src/public/app/doc_notes/en/User Guide/User Guide/Note Types/Book/Calendar View.html
@@ -14,44 +14,43 @@
-
+
The Calendar view of Book notes will display each child note in a calendar
that has a start date and optionally an end date, as an event.
Unlike other Book view types, the Calendar view also allows some kind
of interaction, such as moving events around as well as creating new ones.
Creating a calendar
-
-
-
-
-
-
-
-
-
-
-
- 1
-
-
-
- The Calendar View works only for Book note types. To create a new note,
- right click on the note tree on the left and select Insert note after,
- or Insert child note and then select Book .
-
-
- 2
-
-
-
- Once created, the “View type” of the Book needs changed to “Calendar”,
- by selecting the “Book Properties” tab in the ribbon.
-
-
-
-
-
Creating a new event/note
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+ The Calendar View works only for Book note types. To create a new note,
+ right click on the note tree on the left and select Insert note after,
+ or Insert child note and then select Book .
+
+
+ 2
+
+
+
+ Once created, the “View type” of the Book needs changed to “Calendar”,
+ by selecting the “Book Properties” tab in the ribbon.
+
+
+
+
+
Creating a new event/note
Clicking on a day will create a new child note and assign it to that particular
day.
@@ -63,7 +62,7 @@
It's possible to drag across multiple days to set both the start and end
date of a particular note.
-
+
Creating new notes from the calendar will respect the ~child:template relation
if set on the book note.
@@ -72,7 +71,7 @@
Hovering the mouse over an event will display information about the note.
-
+
Left clicking the event will go to that note. Middle clicking will open
the note in a new tab and right click will offer more options including
@@ -83,242 +82,234 @@
Configuring the calendar
The following attributes can be added to the book type:
-
-
-
-
- Name
- Description
-
-
-
-
- #calendar:hideWeekends
-
- When present (regardless of value), it will hide Saturday and Sundays
- from the calendar.
-
-
- #calendar:weekNumbers
-
- When present (regardless of value), it will show the number of the week
- on the calendar.
-
-
- ~child:template
-
- Defines the template for newly created notes in the calendar (via dragging
- or clicking).
-
-
-
-
+
+
+
+ Name
+ Description
+
+
+
+
+ #calendar:hideWeekends
+
+ When present (regardless of value), it will hide Saturday and Sundays
+ from the calendar.
+
+
+ #calendar:weekNumbers
+
+ When present (regardless of value), it will show the number of the week
+ on the calendar.
+
+
+ ~child:template
+
+ Defines the template for newly created notes in the calendar (via dragging
+ or clicking).
+
+
+
In addition, the first day of the week can be either Sunday or Monday
and can be adjusted from the application settings.
Configuring the calendar events
For each note of the calendar, the following attributes can be used:
-
-
-
-
- Name
- Description
-
-
-
-
- #startDate
-
- The date the event starts, which will display it in the calendar. The
- format is YYYY-MM-DD (year, month and day separated by a minus
- sign).
-
-
- #endDate
-
- Similar to startDate, mentions the end date if the event spans
- across multiple days. The date is inclusive, so the end day is also considered.
- The attribute can be missing for single-day events.
-
-
- #color
-
- Displays the event with a specified color (named such as red, gray or
- hex such as #FF0000). This will also change the color of the
- note in other places such as the note tree.
-
-
- #calendar:color
-
- Similar to #color, but applies the color only for the event
- in the calendar and not for other places such as the note tree.
-
-
- #iconClass
-
- If present, the icon of the note will be displayed to the left of the
- event title.
-
-
- #calendar:title
-
- Changes the title of an event to point to an attribute of the note other
- than the title, either a label (e.g. #assignee) or a relation
- (e.g. ~for). See Advanced use-cases for more information.
-
-
- #calendar:displayedAttributes
-
-
- Allows displaying the value of one or more attributes in the calendar
- like this:
-
-
-
#weight="70"
-#Mood="Good"
-#calendar:displayedAttributes="weight,Mood"
- It can also be used with relations, case in which it will display the
- title of the target note:
~assignee=@My assignee
-#calendar:displayedAttributes="assignee"
-
-
-
- #calendar:startDate
-
- Allows using a different label to represent the start date, other than startDate (e.g. expiryDate).
- The label name must not be prefixed with #.
- If the label is not defined for a note, the default will be used instead.
-
-
- #calendar:endDate
-
- Allows using a different label to represent the start date, other than endDate.
- The label name must not be prefixed with #.
- If the label is not defined for a note, the default will be used instead.
-
-
-
-
- How the calendar works
-
-
-
- The calendar displays all the child notes of the book that have a #startDate.
- An #endDate can optionally be added.
- If editing the start date and end date from the note itself is desirable,
- the following attributes can be added to the book note:
#viewType=calendar #label:startDate(inheritable)="promoted,alias=Start Date,single,date"
+
+
+
+ Name
+ Description
+
+
+
+
+ #startDate
+
+ The date the event starts, which will display it in the calendar. The
+ format is YYYY-MM-DD (year, month and day separated by a minus
+ sign).
+
+
+ #endDate
+
+ Similar to startDate, mentions the end date if the event spans
+ across multiple days. The date is inclusive, so the end day is also considered.
+ The attribute can be missing for single-day events.
+
+
+ #color
+
+ Displays the event with a specified color (named such as red, gray or
+ hex such as #FF0000). This will also change the color of the
+ note in other places such as the note tree.
+
+
+ #calendar:color
+
+ Similar to #color, but applies the color only for the event
+ in the calendar and not for other places such as the note tree.
+
+
+ #iconClass
+
+ If present, the icon of the note will be displayed to the left of the
+ event title.
+
+
+ #calendar:title
+
+ Changes the title of an event to point to an attribute of the note other
+ than the title, either a label (e.g. #assignee) or a relation
+ (e.g. ~for). See Advanced use-cases for more information.
+
+
+ #calendar:displayedAttributes
+
+ Allows displaying the value of one or more attributes in the calendar
+ like this:Â
+
+
+
+
+ <br>#weight="70"<br>#Mood="Good"<br>#calendar:displayedAttributes="weight,Mood"<br>
+
+ It can also be used with relations, case in which it will display the
+ title of the target note:
+
+ <br>~assignee=@My assignee<br>#calendar:displayedAttributes="assignee"<br>
+
+
+
+ #calendar:startDate
+
+ Allows using a different label to represent the start date, other than startDate (e.g. expiryDate).
+ The label name must not be prefixed with #.
+ If the label is not defined for a note, the default will be used instead.
+
+
+ #calendar:endDate
+
+ Allows using a different label to represent the start date, other than endDate.
+ The label name must not be prefixed with #.
+ If the label is not defined for a note, the default will be used instead.
+
+
+
+
+How the calendar works
+
+
+
+ The calendar displays all the child notes of the book that have a #startDate.
+ An #endDate can optionally be added.
+ If editing the start date and end date from the note itself is desirable,
+ the following attributes can be added to the book note:
#viewType=calendar #label:startDate(inheritable)="promoted,alias=Start Date,single,date"
#label:endDate(inheritable)="promoted,alias=End Date,single,date"
#hidePromotedAttributes
- This will result in:
-
-
-
- When not used in a Journal, the calendar is recursive. That is, it will
- look for events not just in its child notes but also in the children of
- these child notes.
- Use-cases
- Using with the Journal / calendar
- It is possible to integrate the calendar view into the Journal with day
- notes. In order to do so change the note type of the Journal note (calendar
- root) to Book and then select the Calendar View.
- Based on the #calendarRoot (or #workspaceCalendarRoot)
- attribute, the calendar will know that it's in a calendar and apply the
- following:
-
- The calendar events are now rendered based on their dateNote attribute
- rather than startDate.
- Interactive editing such as dragging over an empty era or resizing an
- event is no longer possible.
- Clicking on the empty space on a date will automatically open that day's
- note or create it if it does not exist.
- Direct children of a day note will be displayed on the calendar despite
- not having a dateNote attribute. Children of the child notes
- will not be displayed.
-
-
-
-
- Using a different attribute as event title
- By default, events are displayed on the calendar by their note title.
- However, it is possible to configure a different attribute to be displayed
- instead.
- To do so, assign #calendar:title to the child note (not the
- calendar/book note), with the value being #name where name can
- be any label. The attribute can also come through inheritance such as a
- template attribute. If the note does not have the requested label, the
- title of the note will be used instead.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Using a relation attribute as event title
- Similarly to using an attribute, use #calendar:title and set
- it to ~name where name is the name of the relation
- to use.
- Moreover, if there are more relations of the same name, they will be displayed
- as multiple events coming from the same note.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Note that it's even possible to have a #calendar:title on the
- target note (e.g. “John Smith”) which will try to render an attribute of
- it. Note that it's not possible to use a relation here as well for safety
- reasons (an accidental recursion of attributes could cause the application
- to loop infinitely).
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ This will result in:
+
+
+
+ When not used in a Journal, the calendar is recursive. That is, it will
+ look for events not just in its child notes but also in the children of
+ these child notes.
+ Use-cases
+ Using with the Journal / calendar
+ It is possible to integrate the calendar view into the Journal with day
+ notes. In order to do so change the note type of the Journal note (calendar
+ root) to Book and then select the Calendar View.
+ Based on the #calendarRoot (or #workspaceCalendarRoot)
+ attribute, the calendar will know that it's in a calendar and apply the
+ following:
+
+ The calendar events are now rendered based on their dateNote attribute
+ rather than startDate.
+ Interactive editing such as dragging over an empty era or resizing an
+ event is no longer possible.
+ Clicking on the empty space on a date will automatically open that day's
+ note or create it if it does not exist.
+ Direct children of a day note will be displayed on the calendar despite
+ not having a dateNote attribute. Children of the child notes
+ will not be displayed.
+
+
+
+
+ Using a different attribute as event title
+ By default, events are displayed on the calendar by their note title.
+ However, it is possible to configure a different attribute to be displayed
+ instead.
+ To do so, assign #calendar:title to the child note (not the
+ calendar/book note), with the value being #name where name can
+ be any label. The attribute can also come through inheritance such as a
+ template attribute. If the note does not have the requested label, the
+ title of the note will be used instead.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Using a relation attribute as event title
+ Similarly to using an attribute, use #calendar:title and set
+ it to ~name where name is the name of the relation
+ to use.
+ Moreover, if there are more relations of the same name, they will be displayed
+ as multiple events coming from the same note.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Note that it's even possible to have a #calendar:title on the
+ target note (e.g. “John Smith”) which will try to render an attribute of
+ it. Note that it's not possible to use a relation here as well for safety
+ reasons (an accidental recursion  of attributes could cause the application
+ to loop infinitely).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+