Merge remote-tracking branch 'origin/main' into feature/table_view

This commit is contained in:
Elian Doran 2025-07-01 11:55:45 +03:00
commit e155642ce4
No known key found for this signature in database
32 changed files with 175 additions and 98 deletions

View File

@ -120,7 +120,7 @@ jobs:
body_path: docs/Release Notes/Release Notes/${{ github.ref_name }}.md body_path: docs/Release Notes/Release Notes/${{ github.ref_name }}.md
fail_on_unmatched_files: true fail_on_unmatched_files: true
files: upload/*.* files: upload/*.*
discussion_category_name: Announcements discussion_category_name: Releases
make_latest: ${{ !contains(github.ref, 'rc') }} make_latest: ${{ !contains(github.ref, 'rc') }}
prerelease: ${{ contains(github.ref, 'rc') }} prerelease: ${{ contains(github.ref, 'rc') }}
token: ${{ secrets.RELEASE_PAT }} token: ${{ secrets.RELEASE_PAT }}

View File

@ -91,5 +91,5 @@ async function start() {
} }
// @TriliumNextTODO sqlInit.dbReady never seems to resolve so program hangs // @TriliumNextTODO sqlInit.dbReady never seems to resolve so program hangs
// see https://github.com/TriliumNext/Notes/issues/1020 // see https://github.com/TriliumNext/Trilium/issues/1020
sqlInit.dbReady.then(cls.wrap(start)).catch((err) => console.error(err)); sqlInit.dbReady.then(cls.wrap(start)).catch((err) => console.error(err));

View File

@ -8,5 +8,5 @@ test("Displays update badge when there is a version available", async ({ page })
await page.getByText(`Version ${expectedVersion} is available,`).click(); await page.getByText(`Version ${expectedVersion} is available,`).click();
const page1 = await page.waitForEvent("popup"); const page1 = await page.waitForEvent("popup");
expect(page1.url()).toBe(`https://github.com/TriliumNext/Notes/releases/tag/v${expectedVersion}`); expect(page1.url()).toBe(`https://github.com/TriliumNext/Trilium/releases/tag/v${expectedVersion}`);
}); });

View File

@ -1,6 +1,6 @@
{ {
"name": "@triliumnext/client", "name": "@triliumnext/client",
"version": "0.95.0", "version": "0.96.0",
"description": "JQuery-based client for TriliumNext, used for both web and desktop (via Electron)", "description": "JQuery-based client for TriliumNext, used for both web and desktop (via Electron)",
"private": true, "private": true,
"license": "AGPL-3.0-only", "license": "AGPL-3.0-only",

View File

@ -424,7 +424,7 @@ export default class GlobalMenuWidget extends BasicWidget {
} }
downloadLatestVersionCommand() { downloadLatestVersionCommand() {
window.open("https://github.com/TriliumNext/Notes/releases/latest"); window.open("https://github.com/TriliumNext/Trilium/releases/latest");
} }
activeContextChangedEvent() { activeContextChangedEvent() {

View File

@ -27,7 +27,7 @@ const TPL = /*html*/`
<table class="table table-borderless"> <table class="table table-borderless">
<tr> <tr>
<th>${t("about.homepage")}</th> <th>${t("about.homepage")}</th>
<td><a class="tn-link" href="https://github.com/TriliumNext/Notes" class="external">https://github.com/TriliumNext/Notes</a></td> <td><a class="tn-link" href="https://github.com/TriliumNext/Trilium" class="external">https://github.com/TriliumNext/Trilium</a></td>
</tr> </tr>
<tr> <tr>
<th>${t("about.app_version")}</th> <th>${t("about.app_version")}</th>
@ -92,7 +92,7 @@ export default class AboutDialog extends BasicWidget {
this.$syncVersion.text(appInfo.syncVersion.toString()); this.$syncVersion.text(appInfo.syncVersion.toString());
this.$buildDate.text(formatDateTime(appInfo.buildDate)); this.$buildDate.text(formatDateTime(appInfo.buildDate));
this.$buildRevision.text(appInfo.buildRevision); this.$buildRevision.text(appInfo.buildRevision);
this.$buildRevision.attr("href", `https://github.com/TriliumNext/Notes/commit/${appInfo.buildRevision}`); this.$buildRevision.attr("href", `https://github.com/TriliumNext/Trilium/commit/${appInfo.buildRevision}`);
if (utils.isElectron()) { if (utils.isElectron()) {
this.$dataDirectory.html( this.$dataDirectory.html(
$("<a></a>", { $("<a></a>", {

View File

@ -41,9 +41,9 @@ export default class IncorrectCpuArchDialog extends BasicWidget {
// Open the releases page where users can download the correct version // Open the releases page where users can download the correct version
if (utils.isElectron()) { if (utils.isElectron()) {
const { shell } = utils.dynamicRequire("electron"); const { shell } = utils.dynamicRequire("electron");
shell.openExternal("https://github.com/TriliumNext/Notes/releases/latest"); shell.openExternal("https://github.com/TriliumNext/Trilium/releases/latest");
} else { } else {
window.open("https://github.com/TriliumNext/Notes/releases/latest", "_blank"); window.open("https://github.com/TriliumNext/Trilium/releases/latest", "_blank");
} }
}); });

View File

@ -74,7 +74,7 @@ export const DEFAULT_ALLOWED_TAGS = [
"del", "del",
"ins", "ins",
"en-media", // for ENEX import "en-media", // for ENEX import
// Additional tags (https://github.com/TriliumNext/Notes/issues/567) // Additional tags (https://github.com/TriliumNext/Trilium/issues/567)
"acronym", "acronym",
"article", "article",
"big", "big",

View File

@ -1,6 +1,6 @@
{ {
"name": "@triliumnext/desktop", "name": "@triliumnext/desktop",
"version": "0.95.0", "version": "0.96.0",
"description": "Build your personal knowledge base with Trilium Notes", "description": "Build your personal knowledge base with Trilium Notes",
"private": true, "private": true,
"main": "main.cjs", "main": "main.cjs",

View File

@ -1,6 +1,6 @@
{ {
"name": "@triliumnext/server", "name": "@triliumnext/server",
"version": "0.95.0", "version": "0.96.0",
"description": "The server-side component of TriliumNext, which exposes the client via the web, allows for sync and provides a REST API for both internal and external use.", "description": "The server-side component of TriliumNext, which exposes the client via the web, allows for sync and provides a REST API for both internal and external use.",
"private": true, "private": true,
"dependencies": { "dependencies": {

View File

@ -42,5 +42,5 @@
This will export the notes in an unencrypted form, so if you reimport into This will export the notes in an unencrypted form, so if you reimport into
Trilium, make sure to re-protect these notes.</p> Trilium, make sure to re-protect these notes.</p>
<h2>Supported syntax</h2> <h2>Supported syntax</h2>
<p>See the dedicated page:&nbsp;<a class="reference-link" href="#root/pOsGYCXsbNQG/gh7bpGYxajRS/mHbBMPDPkVV5/Oau6X9rCuegd/_help_rJ9grSgoExl9">Supported syntax</a> <p>See the dedicated page:&nbsp;<a class="reference-link" href="#root/_help_rJ9grSgoExl9">Supported syntax</a>
</p> </p>

View File

@ -41,7 +41,7 @@
Trilium-compatible syntax, but it will not export Trilium Notes into Markdown Trilium-compatible syntax, but it will not export Trilium Notes into Markdown
files with this syntax.</p> files with this syntax.</p>
<aside class="admonition important"> <aside class="admonition important">
<p>The path to pages in wikilinks is resolved relatively to the <em>import root </em>and <p>The path to pages in wikilinks is resolved relatively to the <em>import root</em> and
not the current directory of the note. This is to be inline with other not the current directory of the note. This is to be inline with other
platforms that use wikilinks such as SilverBullet.</p> platforms that use wikilinks such as SilverBullet.</p>
<p>The root path of the import is determined as follows:</p> <p>The root path of the import is determined as follows:</p>

View File

@ -62,4 +62,4 @@ class="image image-style-align-center">
are currently no plans for adjusting it or allowing the user to customize are currently no plans for adjusting it or allowing the user to customize
them.</p> them.</p>
<h3>Markdown support</h3> <h3>Markdown support</h3>
<p>See&nbsp;<a class="reference-link" href="#root/pOsGYCXsbNQG/gh7bpGYxajRS/mHbBMPDPkVV5/Oau6X9rCuegd/_help_rJ9grSgoExl9">Supported syntax</a>.</p> <p>See&nbsp;<a class="reference-link" href="#root/_help_rJ9grSgoExl9">Supported syntax</a>.</p>

View File

@ -8,7 +8,7 @@ import appInfo from "../../services/app_info.js";
* operationId: app-info * operationId: app-info
* externalDocs: * externalDocs:
* description: Server implementation * description: Server implementation
* url: https://github.com/TriliumNext/Notes/blob/v0.91.6/src/services/app_info.ts * url: https://github.com/TriliumNext/Trilium/blob/v0.91.6/src/services/app_info.ts
* responses: * responses:
* '200': * '200':
* description: Installation info * description: Installation info

View File

@ -25,7 +25,7 @@ import type { Request } from "express";
* operationId: login-sync * operationId: login-sync
* externalDocs: * externalDocs:
* description: HMAC calculation * description: HMAC calculation
* url: https://github.com/TriliumNext/Notes/blob/v0.91.6/src/services/utils.ts#L62-L66 * url: https://github.com/TriliumNext/Trilium/blob/v0.91.6/src/services/utils.ts#L62-L66
* requestBody: * requestBody:
* content: * content:
* application/json: * application/json:

View File

@ -95,7 +95,7 @@ function forceFullSync() {
* operationId: sync-changed * operationId: sync-changed
* externalDocs: * externalDocs:
* description: Server implementation * description: Server implementation
* url: https://github.com/TriliumNext/Notes/blob/v0.91.6/src/routes/api/sync.ts * url: https://github.com/TriliumNext/Trilium/blob/v0.91.6/src/routes/api/sync.ts
* parameters: * parameters:
* - in: query * - in: query
* name: instanceId * name: instanceId
@ -214,7 +214,7 @@ const partialRequests: Record<
* operationId: sync-update * operationId: sync-update
* externalDocs: * externalDocs:
* description: Server implementation * description: Server implementation
* url: https://github.com/TriliumNext/Notes/blob/v0.91.6/src/routes/api/sync.ts * url: https://github.com/TriliumNext/Trilium/blob/v0.91.6/src/routes/api/sync.ts
* parameters: * parameters:
* - in: header * - in: header
* name: pageCount * name: pageCount

View File

@ -136,7 +136,7 @@ function getNotesAndBranchesAndAttributes(_noteIds: string[] | Set<string>) {
* operationId: tree * operationId: tree
* externalDocs: * externalDocs:
* description: Server implementation * description: Server implementation
* url: https://github.com/TriliumNext/Notes/blob/v0.91.6/src/routes/api/tree.ts * url: https://github.com/TriliumNext/Trilium/blob/v0.91.6/src/routes/api/tree.ts
* parameters: * parameters:
* - in: query * - in: query
* name: subTreeNoteId * name: subTreeNoteId

View File

@ -8,7 +8,7 @@ const doubleCsrfUtilities = doubleCsrf({
path: "/", path: "/",
secure: false, secure: false,
sameSite: "strict", sameSite: "strict",
httpOnly: !isElectron // set to false for Electron, see https://github.com/TriliumNext/Notes/pull/966 httpOnly: !isElectron // set to false for Electron, see https://github.com/TriliumNext/Trilium/pull/966
}, },
cookieName: "_csrf" cookieName: "_csrf"
}); });

View File

@ -77,7 +77,7 @@ function setPassword(req: Request, res: Response) {
* operationId: login-normal * operationId: login-normal
* externalDocs: * externalDocs:
* description: HMAC calculation * description: HMAC calculation
* url: https://github.com/TriliumNext/Notes/blob/v0.91.6/src/services/utils.ts#L62-L66 * url: https://github.com/TriliumNext/Trilium/blob/v0.91.6/src/services/utils.ts#L62-L66
* requestBody: * requestBody:
* content: * content:
* application/x-www-form-urlencoded: * application/x-www-form-urlencoded:

View File

@ -293,25 +293,25 @@ describe("Markdown export", () => {
const html = trimIndentation`\ const html = trimIndentation`\
<ul> <ul>
<li><a href="https://github.com/JYC333">@JYC333</a> made their first contribution <li><a href="https://github.com/JYC333">@JYC333</a> made their first contribution
in <a href="https://github.com/TriliumNext/Notes/pull/294">#294</a> in <a href="https://github.com/TriliumNext/Trilium/pull/294">#294</a>
</li> </li>
<li> <li>
<p><a href="https://github.com/TriliumNext/Notes/issues/375">Note Tooltip isn't removed when clicking on internal trilium link in read-only mode</a> <p><a href="https://github.com/TriliumNext/Trilium/issues/375">Note Tooltip isn't removed when clicking on internal trilium link in read-only mode</a>
</p> </p>
</li> </li>
<li> <li>
<p><a href="https://github.com/TriliumNext/Notes/issues/384">Calendar dropdown won't close if click/right-click other button that open notes from launcher bar</a> <p><a href="https://github.com/TriliumNext/Trilium/issues/384">Calendar dropdown won't close if click/right-click other button that open notes from launcher bar</a>
</p> </p>
</li> </li>
</ul> </ul>
`; `;
const expected = trimIndentation`\ const expected = trimIndentation`\
* [@JYC333](https://github.com/JYC333) made their first contribution in [#294](https://github.com/TriliumNext/Notes/pull/294) * [@JYC333](https://github.com/JYC333) made their first contribution in [#294](https://github.com/TriliumNext/Trilium/pull/294)
* [Note Tooltip isn't removed when clicking on internal trilium link in read-only mode](https://github.com/TriliumNext/Notes/issues/375) * [Note Tooltip isn't removed when clicking on internal trilium link in read-only mode](https://github.com/TriliumNext/Trilium/issues/375)
* [Calendar dropdown won't close if click/right-click other button that open notes from launcher bar](https://github.com/TriliumNext/Notes/issues/384)`; * [Calendar dropdown won't close if click/right-click other button that open notes from launcher bar](https://github.com/TriliumNext/Trilium/issues/384)`;
expect(markdownExportService.toMarkdown(html)).toBe(expected); expect(markdownExportService.toMarkdown(html)).toBe(expected);
}); });

View File

@ -84,7 +84,7 @@ export const DEFAULT_ALLOWED_TAGS = [
"del", "del",
"ins", "ins",
"en-media", // for ENEX import "en-media", // for ENEX import
// Additional tags (https://github.com/TriliumNext/Notes/issues/567) // Additional tags (https://github.com/TriliumNext/Trilium/issues/567)
"acronym", "acronym",
"article", "article",
"big", "big",

View File

@ -259,15 +259,15 @@ $$`;
const input = trimIndentation`\ const input = trimIndentation`\
### 🐞 Bugfixes ### 🐞 Bugfixes
* [v0.90.4 docker does not read USER\_UID and USER\_GID from environment](https://github.com/TriliumNext/Notes/issues/331) * [v0.90.4 docker does not read USER\_UID and USER\_GID from environment](https://github.com/TriliumNext/Trilium/issues/331)
* [Invalid CSRF token on Android phone](https://github.com/TriliumNext/Notes/issues/318) * [Invalid CSRF token on Android phone](https://github.com/TriliumNext/Trilium/issues/318)
* [Excess spacing in lists](https://github.com/TriliumNext/Notes/issues/341)`; * [Excess spacing in lists](https://github.com/TriliumNext/Trilium/issues/341)`;
const expected = [ const expected = [
/*html*/`<h3>🐞 Bugfixes</h3>`, /*html*/`<h3>🐞 Bugfixes</h3>`,
/*html*/`<ul>`, /*html*/`<ul>`,
/*html*/`<li><a href="https://github.com/TriliumNext/Notes/issues/331">v0.90.4 docker does not read USER_UID and USER_GID from environment</a></li>`, /*html*/`<li><a href="https://github.com/TriliumNext/Trilium/issues/331">v0.90.4 docker does not read USER_UID and USER_GID from environment</a></li>`,
/*html*/`<li><a href="https://github.com/TriliumNext/Notes/issues/318">Invalid CSRF token on Android phone</a></li>`, /*html*/`<li><a href="https://github.com/TriliumNext/Trilium/issues/318">Invalid CSRF token on Android phone</a></li>`,
/*html*/`<li><a href="https://github.com/TriliumNext/Notes/issues/341">Excess spacing in lists</a></li>`, /*html*/`<li><a href="https://github.com/TriliumNext/Trilium/issues/341">Excess spacing in lists</a></li>`,
/*html*/`</ul>` /*html*/`</ul>`
].join(""); ].join("");
expect(markdownService.renderToHtml(input, "Title")).toStrictEqual(expected); expect(markdownService.renderToHtml(input, "Title")).toStrictEqual(expected);

View File

@ -117,11 +117,11 @@ export const downloadMatrix: DownloadMatrix = {
}, },
tarX64: { tarX64: {
name: "x86 (.tar.xz)", name: "x86 (.tar.xz)",
url: `https://github.com/TriliumNext/Notes/releases/download/v${version}/TriliumNotes-Server-v${version}-linux-x64.tar.xz` url: `https://github.com/TriliumNext/Trilium/releases/download/v${version}/TriliumNotes-Server-v${version}-linux-x64.tar.xz`
}, },
tarArm64: { tarArm64: {
name: "ARM (.tar.xz)", name: "ARM (.tar.xz)",
url: `https://github.com/TriliumNext/Notes/releases/download/v${version}/TriliumNotes-Server-v${version}-linux-arm64.tar.xz` url: `https://github.com/TriliumNext/Trilium/releases/download/v${version}/TriliumNotes-Server-v${version}-linux-arm64.tar.xz`
}, },
nixos: { nixos: {
name: "NixOS module", name: "NixOS module",
@ -150,7 +150,7 @@ export const downloadMatrix: DownloadMatrix = {
export function buildDownloadUrl(app: App, platform: Platform, format: string, architecture: Architecture): string { export function buildDownloadUrl(app: App, platform: Platform, format: string, architecture: Architecture): string {
if (app === "desktop") { if (app === "desktop") {
return downloadMatrix.desktop[platform]?.downloads[format].url ?? return downloadMatrix.desktop[platform]?.downloads[format].url ??
`https://github.com/TriliumNext/Notes/releases/download/v${version}/TriliumNotes-v${version}-${platform}-${architecture}.${format}`; `https://github.com/TriliumNext/Trilium/releases/download/v${version}/TriliumNotes-v${version}-${platform}-${architecture}.${format}`;
} else if (app === "server") { } else if (app === "server") {
return downloadMatrix.server[platform]?.downloads[format].url ?? "#"; return downloadMatrix.server[platform]?.downloads[format].url ?? "#";
} else { } else {

View File

@ -61,6 +61,32 @@
"attachments": [], "attachments": [],
"dirFileName": "Release Notes", "dirFileName": "Release Notes",
"children": [ "children": [
{
"isClone": false,
"noteId": "mYXFde3LuNR7",
"notePath": [
"hD3V4hiu2VW4",
"mYXFde3LuNR7"
],
"title": "v0.96.0",
"notePosition": 10,
"prefix": null,
"isExpanded": false,
"type": "text",
"mime": "text/html",
"attributes": [
{
"type": "relation",
"name": "template",
"value": "wyurrlcDl416",
"isInheritable": false,
"position": 60
}
],
"format": "markdown",
"dataFileName": "v0.96.0.md",
"attachments": []
},
{ {
"isClone": false, "isClone": false,
"noteId": "jthwbL0FdaeU", "noteId": "jthwbL0FdaeU",
@ -69,7 +95,7 @@
"jthwbL0FdaeU" "jthwbL0FdaeU"
], ],
"title": "v0.95.0", "title": "v0.95.0",
"notePosition": 10, "notePosition": 20,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -95,7 +121,7 @@
"7HGYsJbLuhnv" "7HGYsJbLuhnv"
], ],
"title": "v0.94.1", "title": "v0.94.1",
"notePosition": 20, "notePosition": 30,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -121,7 +147,7 @@
"Neq53ujRGBqv" "Neq53ujRGBqv"
], ],
"title": "v0.94.0", "title": "v0.94.0",
"notePosition": 30, "notePosition": 40,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -147,7 +173,7 @@
"VN3xnce1vLkX" "VN3xnce1vLkX"
], ],
"title": "v0.93.0", "title": "v0.93.0",
"notePosition": 40, "notePosition": 50,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -165,7 +191,7 @@
"WRaBfQqPr6qo" "WRaBfQqPr6qo"
], ],
"title": "v0.92.7", "title": "v0.92.7",
"notePosition": 50, "notePosition": 60,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -191,7 +217,7 @@
"a2rwfKNmUFU1" "a2rwfKNmUFU1"
], ],
"title": "v0.92.6", "title": "v0.92.6",
"notePosition": 60, "notePosition": 70,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -209,7 +235,7 @@
"fEJ8qErr0BKL" "fEJ8qErr0BKL"
], ],
"title": "v0.92.5-beta", "title": "v0.92.5-beta",
"notePosition": 70, "notePosition": 80,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -227,7 +253,7 @@
"kkkZQQGSXjwy" "kkkZQQGSXjwy"
], ],
"title": "v0.92.4", "title": "v0.92.4",
"notePosition": 80, "notePosition": 90,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -245,7 +271,7 @@
"vAroNixiezaH" "vAroNixiezaH"
], ],
"title": "v0.92.3-beta", "title": "v0.92.3-beta",
"notePosition": 90, "notePosition": 100,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -263,7 +289,7 @@
"mHEq1wxAKNZd" "mHEq1wxAKNZd"
], ],
"title": "v0.92.2-beta", "title": "v0.92.2-beta",
"notePosition": 100, "notePosition": 110,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -281,7 +307,7 @@
"IykjoAmBpc61" "IykjoAmBpc61"
], ],
"title": "v0.92.1-beta", "title": "v0.92.1-beta",
"notePosition": 110, "notePosition": 120,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -299,7 +325,7 @@
"dq2AJ9vSBX4Y" "dq2AJ9vSBX4Y"
], ],
"title": "v0.92.0-beta", "title": "v0.92.0-beta",
"notePosition": 120, "notePosition": 130,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -317,7 +343,7 @@
"3a8aMe4jz4yM" "3a8aMe4jz4yM"
], ],
"title": "v0.91.6", "title": "v0.91.6",
"notePosition": 130, "notePosition": 140,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -335,7 +361,7 @@
"8djQjkiDGESe" "8djQjkiDGESe"
], ],
"title": "v0.91.5", "title": "v0.91.5",
"notePosition": 140, "notePosition": 150,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -353,7 +379,7 @@
"OylxVoVJqNmr" "OylxVoVJqNmr"
], ],
"title": "v0.91.4-beta", "title": "v0.91.4-beta",
"notePosition": 150, "notePosition": 160,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -371,7 +397,7 @@
"tANGQDvnyhrj" "tANGQDvnyhrj"
], ],
"title": "v0.91.3-beta", "title": "v0.91.3-beta",
"notePosition": 160, "notePosition": 170,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -389,7 +415,7 @@
"hMoBfwSoj1SC" "hMoBfwSoj1SC"
], ],
"title": "v0.91.2-beta", "title": "v0.91.2-beta",
"notePosition": 170, "notePosition": 180,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -407,7 +433,7 @@
"a2XMSKROCl9z" "a2XMSKROCl9z"
], ],
"title": "v0.91.1-beta", "title": "v0.91.1-beta",
"notePosition": 180, "notePosition": 190,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -425,7 +451,7 @@
"yqXFvWbLkuMD" "yqXFvWbLkuMD"
], ],
"title": "v0.90.12", "title": "v0.90.12",
"notePosition": 190, "notePosition": 200,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -443,7 +469,7 @@
"veS7pg311yJP" "veS7pg311yJP"
], ],
"title": "v0.90.11-beta", "title": "v0.90.11-beta",
"notePosition": 200, "notePosition": 210,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -461,7 +487,7 @@
"sq5W9TQxRqMq" "sq5W9TQxRqMq"
], ],
"title": "v0.90.10-beta", "title": "v0.90.10-beta",
"notePosition": 210, "notePosition": 220,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -479,7 +505,7 @@
"yFEGVCUM9tPx" "yFEGVCUM9tPx"
], ],
"title": "v0.90.9-beta", "title": "v0.90.9-beta",
"notePosition": 220, "notePosition": 230,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -497,7 +523,7 @@
"o4wAGqOQuJtV" "o4wAGqOQuJtV"
], ],
"title": "v0.90.8", "title": "v0.90.8",
"notePosition": 230, "notePosition": 240,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -530,7 +556,7 @@
"i4A5g9iOg9I0" "i4A5g9iOg9I0"
], ],
"title": "v0.90.7-beta", "title": "v0.90.7-beta",
"notePosition": 240, "notePosition": 250,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -548,7 +574,7 @@
"ThNf2GaKgXUs" "ThNf2GaKgXUs"
], ],
"title": "v0.90.6-beta", "title": "v0.90.6-beta",
"notePosition": 250, "notePosition": 260,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -566,7 +592,7 @@
"G4PAi554kQUr" "G4PAi554kQUr"
], ],
"title": "v0.90.5-beta", "title": "v0.90.5-beta",
"notePosition": 260, "notePosition": 270,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -593,7 +619,7 @@
"zATRobGRCmBn" "zATRobGRCmBn"
], ],
"title": "v0.90.4", "title": "v0.90.4",
"notePosition": 270, "notePosition": 280,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -611,7 +637,7 @@
"sCDLf8IKn3Iz" "sCDLf8IKn3Iz"
], ],
"title": "v0.90.3", "title": "v0.90.3",
"notePosition": 280, "notePosition": 290,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -629,7 +655,7 @@
"VqqyBu4AuTjC" "VqqyBu4AuTjC"
], ],
"title": "v0.90.2-beta", "title": "v0.90.2-beta",
"notePosition": 290, "notePosition": 300,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -647,7 +673,7 @@
"RX3Nl7wInLsA" "RX3Nl7wInLsA"
], ],
"title": "v0.90.1-beta", "title": "v0.90.1-beta",
"notePosition": 300, "notePosition": 310,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -665,7 +691,7 @@
"GyueACukPWjk" "GyueACukPWjk"
], ],
"title": "v0.90.0-beta", "title": "v0.90.0-beta",
"notePosition": 310, "notePosition": 320,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",
@ -683,7 +709,7 @@
"wyurrlcDl416" "wyurrlcDl416"
], ],
"title": "Release Template", "title": "Release Template",
"notePosition": 320, "notePosition": 330,
"prefix": null, "prefix": null,
"isExpanded": false, "isExpanded": false,
"type": "text", "type": "text",

View File

@ -1,6 +1,6 @@
# v0.94.1 # v0.94.1
> [!NOTE] > [!NOTE]
> _Trilium Notes_ will rebrand itself back to Trilium Notes since @zadam was kind enough to give us the original name. See [#2190](https://github.com/orgs/TriliumNext/discussions/2190) for more info. This will probably be the "last" version branded as Trilium Notes_. > _Trilium Notes_ will rebrand itself back to Trilium Notes since @zadam was kind enough to give us the original name. See [#2190](https://github.com/orgs/TriliumNext/discussions/2190) for more info. This will probably be the "last" version branded as Trilium Notes\_.
> [!IMPORTANT] > [!IMPORTANT]
> If you enjoyed this release, consider showing a token of appreciation by: > If you enjoyed this release, consider showing a token of appreciation by:

View File

@ -0,0 +1,51 @@
# v0.96.0
> [!NOTE]
> The Docker image has been relocated to `triliumnext/trilium`. Please update your configuration accordingly.
> [!IMPORTANT]
> If you enjoyed this release, consider showing a token of appreciation by:
>
> * Pressing the “Star” button on [GitHub](https://github.com/TriliumNext/Notes) (top-right).
> * Considering a one-time or recurrent donation to the [lead developer](https://github.com/eliandoran) via [GitHub Sponsors](https://github.com/sponsors/eliandoran) or [PayPal](https://paypal.me/eliandoran).
## 💡 Key highlights
* Thanks to a partnership with CKEditor, we now have a set of features that would otherwise be available on a commercial license only.
* Slash commands for easy commands via the keyboard.
* Text snippets to insert reusable pieces of text (similar to templates, but for blocks of text content).
* For more information, see the user guide → Note Types → Text → Premium features.
## 🐞 Bugfixes
* [“Insert note after” long-press dialog doesnt create Note](https://github.com/TriliumNext/Notes/issues/2246)
* Code notes: user's font selection not respected.
* [Windows V0.95.0 Client Failed to sync with server (use of double-slashes)](https://github.com/TriliumNext/Notes/issues/2339) by @perfectra1n
* Desktop client not working on older Linux distros
* [NOT NULL constraint failed: revisions.title when saving an empty note](https://github.com/TriliumNext/Trilium/issues/6103)
## ✨ Improvements
* [Elixir language syntax highlighting for text notes](https://github.com/TriliumNext/Notes/pull/2327) (by @jshprentz) and code notes.
* [Autocomplete: support specifying path when creating a new note](https://github.com/TriliumNext/Notes/pull/2342) by @SiriusXT
* Markdown import: basic support for importing wikilinks
* Text notes:
* Allow disabling emoji auto-completion from settings.
* Allow disabling note auto-completion from settings.
* [Backend scripts: re-enable dayjs plugins by default](https://github.com/TriliumNext/Trilium/issues/6080)
## 📖 Documentation
* [regex search / Nix flake / restore dev docs](https://github.com/TriliumNext/Notes/pull/2341) by @FliegendeWurst
* New premium features in text note type.
## 🌍 Internationalization
* Spanish improvements by @hasecilu
## 🛠️ Technical updates
* flake: fix Electron version, fix Wayland support, fix source filter by @FliegendeWurst
* Improvements to the landing page (under development) by @FliegendeWurst
* Updated Node.js to v22.17.0
* Updated CKEditor to v45.2.1

View File

@ -4350,6 +4350,13 @@
"type": "text", "type": "text",
"mime": "text/markdown", "mime": "text/markdown",
"attributes": [ "attributes": [
{
"type": "relation",
"name": "internalLink",
"value": "rJ9grSgoExl9",
"isInheritable": false,
"position": 10
},
{ {
"type": "label", "type": "label",
"name": "shareAlias", "name": "shareAlias",
@ -4363,13 +4370,6 @@
"value": "bx bxl-markdown", "value": "bx bxl-markdown",
"isInheritable": false, "isInheritable": false,
"position": 50 "position": 50
},
{
"type": "relation",
"name": "internalLink",
"value": "rJ9grSgoExl9",
"isInheritable": false,
"position": 60
} }
], ],
"format": "markdown", "format": "markdown",
@ -5113,23 +5113,23 @@
{ {
"type": "relation", "type": "relation",
"name": "internalLink", "name": "internalLink",
"value": "nRhnJkTT8cPs", "value": "rJ9grSgoExl9",
"isInheritable": false, "isInheritable": false,
"position": 10 "position": 10
}, },
{
"type": "relation",
"name": "internalLink",
"value": "nRhnJkTT8cPs",
"isInheritable": false,
"position": 20
},
{ {
"type": "label", "type": "label",
"name": "iconClass", "name": "iconClass",
"value": "bx bx-info-circle", "value": "bx bx-info-circle",
"isInheritable": false, "isInheritable": false,
"position": 10 "position": 10
},
{
"type": "relation",
"name": "internalLink",
"value": "rJ9grSgoExl9",
"isInheritable": false,
"position": 20
} }
], ],
"format": "markdown", "format": "markdown",

View File

@ -1,6 +1,6 @@
{ {
"name": "@triliumnext/source", "name": "@triliumnext/source",
"version": "0.95.0", "version": "0.96.0",
"description": "Build your personal knowledge base with Trilium Notes", "description": "Build your personal knowledge base with Trilium Notes",
"directories": { "directories": {
"doc": "docs" "doc": "docs"

View File

@ -1,5 +1,5 @@
/** /**
* https://github.com/TriliumNext/Notes/issues/1002 * https://github.com/TriliumNext/Trilium/issues/1002
*/ */
import { Command, DocumentSelection, Element, Node, Plugin, Range } from 'ckeditor5'; import { Command, DocumentSelection, Element, Node, Plugin, Range } from 'ckeditor5';
@ -11,11 +11,11 @@ export default class MoveBlockUpDownPlugin extends Plugin {
editor.commands.add('moveBlockUp', new MoveBlockUpCommand(editor)); editor.commands.add('moveBlockUp', new MoveBlockUpCommand(editor));
editor.commands.add('moveBlockDown', new MoveBlockDownCommand(editor)); editor.commands.add('moveBlockDown', new MoveBlockDownCommand(editor));
// Use native DOM capturing to intercept Ctrl/Alt + ↑/↓, // Use native DOM capturing to intercept Ctrl/Alt + ↑/↓,
// as plugin-level keystroke handling may fail when the selection is near an object. // as plugin-level keystroke handling may fail when the selection is near an object.
this.bindMoveBlockShortcuts(editor); this.bindMoveBlockShortcuts(editor);
} }
bindMoveBlockShortcuts(editor: any) { bindMoveBlockShortcuts(editor: any) {
editor.editing.view.once('render', () => { editor.editing.view.once('render', () => {
const domRoot = editor.editing.view.getDomRoot(); const domRoot = editor.editing.view.getDomRoot();
@ -59,7 +59,7 @@ abstract class MoveBlockUpDownCommand extends Command {
if (!isEnabled) { if (!isEnabled) {
return; return;
} }
const movingBlocks = this.offset === 'before' const movingBlocks = this.offset === 'before'
? selectedBlocks ? selectedBlocks
: [...selectedBlocks].reverse(); : [...selectedBlocks].reverse();
@ -104,7 +104,7 @@ abstract class MoveBlockUpDownCommand extends Command {
this.scrollToSelection(); this.scrollToSelection();
}); });
} }
getSelectedBlocks(selection: DocumentSelection) { getSelectedBlocks(selection: DocumentSelection) {
const blocks = [...selection.getSelectedBlocks()]; const blocks = [...selection.getSelectedBlocks()];
const resolved: Element[] = []; const resolved: Element[] = [];
@ -129,7 +129,7 @@ abstract class MoveBlockUpDownCommand extends Command {
// Deduplicate adjacent duplicates (e.g., nested selections resolving to same block) // Deduplicate adjacent duplicates (e.g., nested selections resolving to same block)
return resolved.filter((blk, idx) => idx === 0 || blk !== resolved[idx - 1]); return resolved.filter((blk, idx) => idx === 0 || blk !== resolved[idx - 1]);
} }
scrollToSelection() { scrollToSelection() {
// Ensure scroll happens in sync with DOM updates // Ensure scroll happens in sync with DOM updates
requestAnimationFrame(() => { requestAnimationFrame(() => {

View File

@ -1,6 +1,6 @@
{ {
"name": "@triliumnext/commons", "name": "@triliumnext/commons",
"version": "0.95.0", "version": "0.96.0",
"description": "Shared library between the clients (e.g. browser, Electron) and the server, mostly for type definitions and utility methods.", "description": "Shared library between the clients (e.g. browser, Electron) and the server, mostly for type definitions and utility methods.",
"private": true, "private": true,
"type": "module", "type": "module",

View File

@ -23,10 +23,10 @@ const options = {
title: "Trilium Notes - Sync server API", title: "Trilium Notes - Sync server API",
version: packageJson["version"], version: packageJson["version"],
description: description:
"This is the internal sync server API used by Trilium Notes.\n\n_If you're looking for the officially supported External Trilium API, see [here](https://triliumnext.github.io/Docs/Wiki/etapi.html)._\n\nThis page does not yet list all routes. For a full list, see the [route controller](https://github.com/TriliumNext/Notes/blob/v0.91.6/src/routes/routes.ts).", "This is the internal sync server API used by Trilium Notes.\n\n_If you're looking for the officially supported External Trilium API, see [here](https://triliumnext.github.io/Docs/Wiki/etapi.html)._\n\nThis page does not yet list all routes. For a full list, see the [route controller](https://github.com/TriliumNext/Trilium/blob/v0.91.6/src/routes/routes.ts).",
contact: { contact: {
name: "TriliumNext issue tracker", name: "TriliumNext issue tracker",
url: "https://github.com/TriliumNext/Notes/issues" url: "https://github.com/TriliumNext/Trilium/issues"
}, },
license: { license: {
name: "GNU Free Documentation License 1.3 (or later)", name: "GNU Free Documentation License 1.3 (or later)",
@ -159,7 +159,7 @@ console.log("Saved to", outputPath);
* type: string * type: string
* example: "text" * example: "text"
* enum: ["text", "code", "render", "file", "image", "search", "relationMap", "book", "noteMap", "mermaid", "canvas", "webView", "launcher", "doc", "contentWidget", "mindMap", "geoMap"] * enum: ["text", "code", "render", "file", "image", "search", "relationMap", "book", "noteMap", "mermaid", "canvas", "webView", "launcher", "doc", "contentWidget", "mindMap", "geoMap"]
* description: "[Reference list](https://github.com/TriliumNext/Notes/blob/v0.91.6/src/services/note_types.ts)" * description: "[Reference list](https://github.com/TriliumNext/Trilium/blob/v0.91.6/src/services/note_types.ts)"
* mime: * mime:
* type: string * type: string
* example: "text/html" * example: "text/html"

View File

@ -10,7 +10,7 @@
import { type BrowserContext, chromium } from 'playwright'; import { type BrowserContext, chromium } from 'playwright';
import { createWriteStream, existsSync, readFileSync, writeFileSync } from 'fs'; import { createWriteStream, existsSync, readFileSync, writeFileSync } from 'fs';
const SOURCE_URL = "https://github.com/TriliumNext/Notes"; const SOURCE_URL = "https://github.com/TriliumNext/Trilium";
const TARGET_REPOSITORY_ID = 92111509; const TARGET_REPOSITORY_ID = 92111509;
const fsLog = createWriteStream('port-discussions.log', { flags: 'a' }); const fsLog = createWriteStream('port-discussions.log', { flags: 'a' });