Compare commits

..

1046 Commits

Author SHA1 Message Date
Elian Doran
57649d47ec fix(release): discussion category name 2025-07-01 10:13:35 +03:00
Elian Doran
089ae04542 chore(release): prepare for v0.96.0 2025-06-30 23:02:31 +03:00
Elian Doran
1016f98867 docs(release): v0.96.0 2025-06-30 21:29:48 +03:00
Elian Doran
1f022aea4e chore(rebrand): update GitHub repo in source files 2025-06-30 20:39:29 +03:00
Elian Doran
06b507fdc5 Merge pull request #6085 from TriliumNext/renovate/ckeditor-monorepo
fix(deps): update ckeditor monorepo
2025-06-27 16:00:17 +03:00
Elian Doran
256ffe39f2 fix(server): saving revision of note with empty title not supported (closes #6103) 2025-06-27 14:22:08 +03:00
Elian Doran
45a3fb15e6 Merge pull request #6101 from TriliumNext/renovate/electron-36.x
chore(deps): update dependency electron to v36.6.0
2025-06-27 09:45:39 +03:00
renovate[bot]
4139a401e6 chore(deps): update dependency electron to v36.6.0 2025-06-27 06:30:28 +00:00
Elian Doran
4d617ccdb3 Merge pull request #6099 from TriliumNext/renovate/pnpm-10.x
chore(deps): update pnpm to v10.12.4
2025-06-27 09:28:51 +03:00
Elian Doran
57039ae8f2 Merge pull request #6102 from TriliumNext/renovate/openai-5.x
chore(deps): update dependency openai to v5.8.1
2025-06-27 09:28:26 +03:00
Elian Doran
9a4dcda985 Merge pull request #6100 from TriliumNext/renovate/dotenv-16.x
chore(deps): update dependency dotenv to v16.6.0
2025-06-27 09:27:59 +03:00
renovate[bot]
c13ae40ea4 chore(deps): update dependency openai to v5.8.1 2025-06-27 01:57:11 +00:00
renovate[bot]
0b963db405 chore(deps): update dependency dotenv to v16.6.0 2025-06-27 01:53:59 +00:00
renovate[bot]
78b946b208 chore(deps): update pnpm to v10.12.4 2025-06-27 01:51:41 +00:00
JYC333
4e8ddef915 Merge branch 'main' into renovate/ckeditor-monorepo 2025-06-26 23:17:52 +02:00
Elian Doran
0aa08cd297 Merge pull request #6091 from TriliumNext/renovate/node-22.x
chore(deps): update node.js to v22.17.0
2025-06-26 22:10:39 +03:00
Elian Doran
a89ce5d931 chore(rebrand): adjust artifact names 2025-06-26 20:18:31 +03:00
Elian Doran
fe3350f39f feat(server/script): enable a few dayjs plugins (closes #6080) 2025-06-26 20:13:01 +03:00
Elian Doran
f32f9d4326 test(server/script): dayjs is available 2025-06-26 18:34:00 +03:00
renovate[bot]
2ed24e8f9c fix(deps): update ckeditor monorepo 2025-06-26 08:48:14 +00:00
Elian Doran
537c282156 chore(renovate): mark premium features of ckeditor as group 2025-06-26 11:45:31 +03:00
renovate[bot]
61f253787a chore(deps): update node.js to v22.17.0 2025-06-26 06:52:50 +00:00
Elian Doran
ddad800771 Merge pull request #6090 from TriliumNext/renovate/eslint-monorepo
chore(deps): update eslint monorepo to v9.29.0
2025-06-26 09:48:47 +03:00
Elian Doran
69c24ef806 Merge pull request #6089 from TriliumNext/renovate/vite-plugin-static-copy-3.x
chore(deps): update dependency vite-plugin-static-copy to v3.1.0
2025-06-26 09:48:32 +03:00
Elian Doran
df7fe2bf13 Merge pull request #6088 from TriliumNext/renovate/anthropic-ai-sdk-0.x
chore(deps): update dependency @anthropic-ai/sdk to v0.55.0
2025-06-26 09:47:45 +03:00
Elian Doran
c47d3514be Merge pull request #6086 from TriliumNext/renovate/better-sqlite3-12.x
fix(deps): update dependency better-sqlite3 to v12.1.1
2025-06-26 09:47:25 +03:00
Elian Doran
2b979f46ab Merge pull request #6084 from TriliumNext/renovate/vitest-monorepo
chore(deps): update vitest monorepo to v3.2.4
2025-06-26 09:45:36 +03:00
Elian Doran
edc47eba05 Merge pull request #6083 from TriliumNext/renovate/pnpm-10.x
chore(deps): update pnpm to v10.12.3
2025-06-26 09:44:49 +03:00
Elian Doran
f3b46d6bc7 Merge pull request #6082 from TriliumNext/renovate/leaflet-1.x
chore(deps): update dependency @types/leaflet to v1.9.19
2025-06-26 09:44:26 +03:00
renovate[bot]
69d6d6a4fd chore(deps): update eslint monorepo to v9.29.0 2025-06-26 01:24:05 +00:00
renovate[bot]
5916b7d2a3 chore(deps): update dependency vite-plugin-static-copy to v3.1.0 2025-06-26 01:23:00 +00:00
renovate[bot]
fbb2c67edb chore(deps): update dependency @anthropic-ai/sdk to v0.55.0 2025-06-26 01:21:27 +00:00
renovate[bot]
7e1712712e fix(deps): update dependency better-sqlite3 to v12.1.1 2025-06-26 01:20:15 +00:00
renovate[bot]
aa846e9703 chore(deps): update vitest monorepo to v3.2.4 2025-06-26 01:18:54 +00:00
renovate[bot]
6ed9ec0851 chore(deps): update pnpm to v10.12.3 2025-06-26 01:18:05 +00:00
renovate[bot]
3a0a79119d chore(deps): update dependency @types/leaflet to v1.9.19 2025-06-26 01:14:26 +00:00
Elian Doran
1ff7228ca5 feat(scripts): add script to port discussions 2025-06-24 23:18:34 +03:00
Elian Doran
f0f79b65e2 Merge pull request #5860 from TriliumNext/renovate/openai-5.x
chore(deps): update dependency openai to v5.7.0
2025-06-24 09:06:32 +03:00
Elian Doran
63610fd579 chore(deps): sync package lock 2025-06-24 08:54:09 +03:00
Elian Doran
eab84bd34e Merge branch 'main' into renovate/openai-5.x 2025-06-24 08:52:59 +03:00
Elian Doran
72f4c40a8a Merge pull request #5862 from TriliumNext/renovate/better-sqlite3-12.x
fix(deps): update dependency better-sqlite3 to v12.1.0
2025-06-24 08:52:00 +03:00
Elian Doran
482356206b chore(deps): remove override 2025-06-24 08:51:41 +03:00
Elian Doran
5aa09fd881 Merge pull request #5861 from TriliumNext/renovate/typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to v8.35.0
2025-06-24 08:50:14 +03:00
renovate[bot]
81f50c46ed fix(deps): update dependency better-sqlite3 to v12.1.0 2025-06-24 02:10:12 +00:00
renovate[bot]
938dfe7f38 chore(deps): update typescript-eslint monorepo to v8.35.0 2025-06-24 02:08:32 +00:00
renovate[bot]
ea71439f27 chore(deps): update dependency openai to v5.7.0 2025-06-24 02:04:04 +00:00
Elian Doran
9dc157b970 chore(options): use translations 2025-06-23 23:30:13 +03:00
Elian Doran
b7f5c0e07a feat(mention): disable auto-completion 2025-06-23 23:20:51 +03:00
Elian Doran
3988bb5321 feat(emoji): disable auto-completion only 2025-06-23 22:40:57 +03:00
Elian Doran
ba94616b87 feat(emoji): add an option to disable them (closes #5852) 2025-06-23 22:10:41 +03:00
Elian Doran
1ac086b88e fix(release): build on ubuntu-22.04 for compatibility 2025-06-23 15:33:37 +03:00
Elian Doran
3b4efef4f0 Merge pull request #5850 from TriliumNext/renovate/pnpm-10.x
chore(deps): update pnpm to v10.12.2
2025-06-23 14:08:43 +03:00
Elian Doran
9dc0807f78 Merge pull request #5851 from TriliumNext/renovate/major-eslint-stylistic-monorepo
chore(deps): update dependency @stylistic/eslint-plugin to v5
2025-06-23 14:08:04 +03:00
renovate[bot]
22783662c5 chore(deps): update dependency @stylistic/eslint-plugin to v5 2025-06-23 09:56:52 +00:00
renovate[bot]
64086592ef chore(deps): update pnpm to v10.12.2 2025-06-23 09:50:30 +00:00
Elian Doran
2bebed1b0f fix(desktop): share theme not loaded 2025-06-23 12:17:47 +03:00
Elian Doran
2262d300f7 e2e(desktop): sharing 2025-06-23 08:43:05 +03:00
Elian Doran
dba98d6fc1 test(desktop): test onboarding 2025-06-23 08:43:04 +03:00
Elian Doran
d8b85aad7c chore(rebrand): change product name 2025-06-23 08:43:04 +03:00
Elian Doran
5a3503c577 Merge pull request #5840 from TriliumNext/renovate/express-rate-limit-7.x
chore(deps): update dependency express-rate-limit to v7.5.1
2025-06-22 14:29:06 +03:00
Elian Doran
18c96cd2bc Merge branch 'main' into renovate/express-rate-limit-7.x 2025-06-22 14:12:21 +03:00
Elian Doran
b1bb1ed9af Merge pull request #5841 from TriliumNext/renovate/mermaid-js-layout-elk-0.x
fix(deps): update dependency @mermaid-js/layout-elk to v0.1.8
2025-06-22 14:11:44 +03:00
renovate[bot]
bc1ea98827 fix(deps): update dependency @mermaid-js/layout-elk to v0.1.8 2025-06-22 11:11:20 +00:00
Elian Doran
b984d612fd Merge pull request #5842 from TriliumNext/renovate/openai-5.x
chore(deps): update dependency openai to v5.6.0
2025-06-22 14:10:20 +03:00
Elian Doran
f53eecbf88 Merge pull request #5843 from TriliumNext/renovate/mermaid-11.x
fix(deps): update dependency mermaid to v11.7.0
2025-06-22 14:08:50 +03:00
Elian Doran
1a2c2dbfb8 Merge pull request #5844 from TriliumNext/renovate/better-sqlite3-12.x
fix(deps): update dependency better-sqlite3 to v12
2025-06-22 14:05:10 +03:00
renovate[bot]
78a0637283 fix(deps): update dependency better-sqlite3 to v12 2025-06-22 08:23:25 +00:00
renovate[bot]
e01858c86b fix(deps): update dependency mermaid to v11.7.0 2025-06-22 08:21:46 +00:00
renovate[bot]
ee080638be chore(deps): update dependency openai to v5.6.0 2025-06-22 08:20:13 +00:00
renovate[bot]
6db7ef415d chore(deps): update dependency express-rate-limit to v7.5.1 2025-06-22 08:15:35 +00:00
Elian Doran
cf171ff0b1 chore(ci): disable RelativeCI until project switch 2025-06-22 10:15:26 +03:00
Elian Doran
fdddc29092 fix(ci): don't run failing electron-based tests 2025-06-22 09:31:44 +03:00
Elian Doran
d6545e1280 Merge branch 'main' of https://github.com/TriliumNext/trilium 2025-06-22 09:17:57 +03:00
Elian Doran
759fe04e37 fix(docker): repository name 2025-06-22 09:17:50 +03:00
Elian Doran
e0c5f15480 Merge remote-tracking branch 'next/develop' 2025-06-21 23:21:48 +03:00
Elian Doran
f529cfd928 chore(i18n): update Spanish translation (#2371) 2025-06-21 23:18:28 +03:00
Elian Doran
2a1a099dc9 feat(scripts): add script used to migrate releases 2025-06-21 22:18:09 +03:00
hasecilu
26d0ba04ab chore(i18n): update Spanish translation 2025-06-21 11:19:57 -06:00
hasecilu
f85ef444f4 fix(script): paths on translation script 2025-06-21 11:19:55 -06:00
Elian Doran
87aa4422c0 chore(rebrand): change references from develop to main 2025-06-21 17:52:47 +03:00
Elian Doran
f497b71d37 chore(rebrand): change references from master to main 2025-06-21 17:51:34 +03:00
Elian Doran
24ba17b3f3 docs(readme): fix leftover merge marker 2025-06-21 17:24:06 +03:00
Elian Doran
e8cbce855e Merge remote-tracking branch 'old/develop' 2025-06-21 17:22:40 +03:00
Elian Doran
f97bd77117 Update README.md 2025-06-21 17:11:25 +03:00
Elian Doran
962066fd60 chore(scripts): add script used to port issues 2025-06-21 16:38:22 +03:00
Elian Doran
ff917e93c9 e2e(desktop): fix process leak 2025-06-21 14:28:57 +03:00
Elian Doran
a7091779b7 e2e(desktop): create empty project 2025-06-21 14:23:47 +03:00
Elian Doran
520b862551 Revert "feat(ci): experiment with building Windows on same runner"
This reverts commit ce305f0f45.
2025-06-21 14:18:41 +03:00
Elian Doran
5fbd34c7c1 Revert "chore(forge): add an arbitrary wait to see if it solves some CI errors"
This reverts commit 4f6729857b.
2025-06-21 14:18:36 +03:00
Elian Doran
c827b20e26 Revert "chore(forge): add a pre-make wait as well"
This reverts commit a150047432.
2025-06-21 14:18:31 +03:00
Elian Doran
a150047432 chore(forge): add a pre-make wait as well 2025-06-21 13:40:47 +03:00
Elian Doran
4f6729857b chore(forge): add an arbitrary wait to see if it solves some CI errors 2025-06-21 13:19:35 +03:00
Elian Doran
ce305f0f45 feat(ci): experiment with building Windows on same runner 2025-06-21 10:57:45 +03:00
Elian Doran
3a50ffede1 refactor(forge): add types to config 2025-06-21 10:46:12 +03:00
Elian Doran
41e88614d7 docs(guide): improve and update supported syntax for Markdown import 2025-06-21 09:49:26 +03:00
Elian Doran
002c567ae9 feat(ci): display trace if playwright fails in docker 2025-06-21 09:26:05 +03:00
Elian Doran
a9c07af402 fix(client): failing with duplicate modules 2025-06-21 09:00:07 +03:00
Elian Doran
3048c39877 Revert "chore(env): remove 4GB override"
This reverts commit 3280123414.
2025-06-21 01:20:41 +03:00
Elian Doran
a95dc14d24 test(import/zip): test silverbullet import 2025-06-21 01:09:03 +03:00
Elian Doran
24c82fa7b6 fix(import/zip): regression in normal import 2025-06-20 22:13:36 +03:00
Elian Doran
02a0624e8f feat(import/zip): support image with absolute path 2025-06-20 21:59:11 +03:00
Elian Doran
e6e276a0cf feat(import/markdown): support image via wikilink 2025-06-20 21:40:23 +03:00
Elian Doran
8d90231f76 fix(import/markdown): support wikilinks in other elements other than paragraphs 2025-06-20 21:00:39 +03:00
Elian Doran
4a40b22c9a feat(import/zip): support root-relative paths 2025-06-20 20:56:25 +03:00
Elian Doran
79b3b92ec9 chore(client): skip dynamic imports in cyclic check 2025-06-20 18:32:32 +03:00
Elian Doran
ae1a4fbbf6 fix(client): cyclic dependency server <-> ws 2025-06-20 18:32:20 +03:00
Elian Doran
3190aa6fe6 feat(import/markdown): start parsing wikilinks 2025-06-20 18:28:08 +03:00
Elian Doran
1c3cd9e7ca chore(deps): update vitest monorepo to v3.2.4 (#2364) 2025-06-20 15:52:42 +03:00
Elian Doran
c61713333d Merge remote-tracking branch 'origin/develop' into renovate/vitest-monorepo 2025-06-20 15:35:27 +03:00
Elian Doran
a861defbee feat(server): lint for trailing slashes in sync URL and extra slashes… (#2345) 2025-06-20 10:55:46 +03:00
Elian Doran
ea0b570910 chore(deps): update dependency @playwright/test to v1.53.1 (#2362) 2025-06-20 09:51:22 +03:00
renovate[bot]
8d46ab3806 chore(deps): update dependency @playwright/test to v1.53.1 2025-06-20 06:28:12 +00:00
Elian Doran
058b3f8241 chore(deps): update nx monorepo to v21.2.1 (#2363) 2025-06-20 08:27:22 +03:00
Elian Doran
57a688b6b6 fix(deps): update codemirror to v6.0.2 (#2365) 2025-06-20 08:26:16 +03:00
Elian Doran
ad18d853e2 chore(deps): update dependency electron to v36.5.0 (#2366) 2025-06-20 08:25:12 +03:00
renovate[bot]
8f5be936a7 chore(deps): update dependency electron to v36.5.0 2025-06-20 02:47:20 +00:00
renovate[bot]
f2c02f869e fix(deps): update codemirror to v6.0.2 2025-06-20 02:46:24 +00:00
renovate[bot]
cf28777119 chore(deps): update nx monorepo to v21.2.1 2025-06-20 02:43:32 +00:00
Elian Doran
cca8504796 refactor(client): circular dep in utils 2025-06-19 22:44:02 +03:00
Elian Doran
09391a92e5 refactor(client): circular dep: toast <-> ws 2025-06-19 22:29:44 +03:00
Elian Doran
50db8ef9c3 refactor(client): circular dependency in fnote 2025-06-19 22:23:17 +03:00
Elian Doran
8ab21f3bab chore(client): add tool to view circular deps 2025-06-19 22:03:01 +03:00
Elian Doran
efdf79feaa refactor(client): circular dependency causing test failure 2025-06-19 22:01:01 +03:00
Elian Doran
9418055b69 chore(test): fix imports 2025-06-19 21:30:42 +03:00
Elian Doran
5070633257 refactor(client): remove unnecessary files 2025-06-19 21:30:26 +03:00
Elian Doran
764917562e chore(test): fix set up 2025-06-19 21:30:10 +03:00
Elian Doran
54290a1373 chore(tsconfig): remove src for forge config 2025-06-19 21:01:23 +03:00
Elian Doran
0325bee425 feat(ckeditor): fallback to GPL if license key fails 2025-06-19 19:38:10 +03:00
Elian Doran
e280968271 feat(ckeditor): allow use of GPL license 2025-06-19 18:55:02 +03:00
Elian Doran
b809137c93 refactor(text): move license key management to config 2025-06-19 18:47:41 +03:00
Elian Doran
248f6d6a7d refactor(forge): switch to TypeScript 2025-06-19 15:45:39 +03:00
Elian Doran
0744a85421 feat(flake): handle StartupWMClass 2025-06-19 15:34:09 +03:00
Elian Doran
e5a6f53f98 Revert "feat(flake); set up overlay"
This reverts commit 751de1d43c.
2025-06-19 12:55:04 +03:00
Elian Doran
751de1d43c feat(flake); set up overlay 2025-06-19 12:49:26 +03:00
perf3ct
2704b1546b feat(server): fix lint type errors for normalizing server URLs 2025-06-18 21:07:12 +00:00
perf3ct
acd68817e9 feat(server): fix lint type errors for normalizing server URLs 2025-06-18 20:46:11 +00:00
Elian Doran
8b841c5aa7 feat(autocomplete): support specifying path when creating a new note (#2342) 2025-06-18 23:14:46 +03:00
Elian Doran
a37af29c6c fix(client): link to API documentation (#2356) 2025-06-18 23:10:00 +03:00
Elian Doran
ade0d4bb1a fix(website): update README.md instructions (#2357) 2025-06-18 23:08:56 +03:00
Arne Keller
d79c491777 fix(website): update README.md instructions 2025-06-18 19:08:24 +02:00
FliegendeWurst
f9cf542e66 fix(client): link to API documentation
Fixes https://github.com/TriliumNext/Notes/issues/1779
2025-06-18 17:58:29 +02:00
Elian Doran
609ed6274e fix(code): respect user font selection 2025-06-18 17:42:03 +03:00
Elian Doran
7faaefee20 feat(help): display contextual button text snippets 2025-06-18 15:35:56 +03:00
Elian Doran
578310a1c0 test(ckeditor5): add check for translation override 2025-06-18 14:44:56 +03:00
Elian Doran
93f544a221 feat(text-snippets): rewrite CKEditor translations 2025-06-18 13:13:59 +03:00
Elian Doran
9c80ab22af chore(client): use production ckeditor key for dev as well 2025-06-18 11:06:57 +03:00
Elian Doran
7decbc34c7 chore(deps): update dependency @types/node to v22.15.32 (#2347) 2025-06-18 11:02:07 +03:00
Elian Doran
e606276f19 chore(deps): update typescript-eslint monorepo to v8.34.1 (#2348) 2025-06-18 11:01:42 +03:00
SiriusXT
a78e4d7a58 chore(i18n): update path selection prompt 2025-06-18 14:28:43 +08:00
renovate[bot]
426c9a377a chore(deps): update typescript-eslint monorepo to v8.34.1 2025-06-18 06:16:35 +00:00
renovate[bot]
d2a3ae2a6f chore(deps): update dependency @types/node to v22.15.32 2025-06-18 06:15:35 +00:00
renovate[bot]
fbd6b7d22b chore(deps): update vitest monorepo to v3.2.4 2025-06-18 06:11:31 +00:00
Elian Doran
a42375931f chore(deps): update vitest monorepo to v3.2.4 (#2349) 2025-06-18 09:08:41 +03:00
Elian Doran
d894bff2a0 fix(deps): update dependency bootstrap to v5.3.7 (#2350) 2025-06-18 09:07:48 +03:00
Elian Doran
4515ed600c fix(deps): update dependency mind-elixir to v4.6.1 (#2351) 2025-06-18 09:07:10 +03:00
Elian Doran
4df3cdd975 chore(deps): update dependency openai to v5.5.1 (#2352) 2025-06-18 09:06:31 +03:00
SiriusXT
5fc0a0460d Merge branch 'develop' into note-create 2025-06-18 11:21:32 +08:00
renovate[bot]
74851a859b chore(deps): update dependency openai to v5.5.1 2025-06-18 02:56:07 +00:00
renovate[bot]
9bb94513ca fix(deps): update dependency mind-elixir to v4.6.1 2025-06-18 02:55:10 +00:00
renovate[bot]
bb74aa7976 fix(deps): update dependency bootstrap to v5.3.7 2025-06-18 02:54:19 +00:00
renovate[bot]
12318b38ee chore(deps): update vitest monorepo to v3.2.4 2025-06-18 02:53:25 +00:00
Jon Fuller
bb70c2a3fa Merge branch 'develop' into fix/lint-server-url 2025-06-17 16:00:36 -07:00
perf3ct
b47180a219 feat(server): create unit tests for normalizing server URL, and fix logic based on feedback 2025-06-17 21:32:27 +00:00
Elian Doran
4eb64357a1 chore(website): add macos screenshots 2025-06-17 23:39:25 +03:00
perf3ct
0fe89115d1 feat(server): lint for trailing slashes in sync URL and extra slashes in customRequestHandler 2025-06-17 19:37:40 +00:00
Elian Doran
330932adde fix(website): script errors due to double body 2025-06-17 22:08:34 +03:00
Elian Doran
b9daca5b9c website: favicon / dark mode / more content (#2343) 2025-06-17 21:38:24 +03:00
Elian Doran
c6c48d84ab flake: fix Electron version, fix Wayland support, fix source filter (#2329) 2025-06-17 21:33:45 +03:00
Elian Doran
2c87721953 docs(guide): premium features 2025-06-17 21:01:01 +03:00
Elian Doran
45a446d0f6 chore(text): set up production key 2025-06-17 20:55:38 +03:00
Elian Doran
40086434ec refactor(subtree): duplicate bx in icon name 2025-06-17 20:55:38 +03:00
Elian Doran
bde3f0a55c fix(nx): revert infinite watching causing severe issues with the daemon
See https://github.com/TriliumNext/Notes/pull/2285#issuecomment-2981118813
2025-06-17 20:55:37 +03:00
Elian Doran
9adae105e2 docs: regex search / Nix flake / restore dev docs (#2341) 2025-06-17 20:53:43 +03:00
Elian Doran
60dbf9dd67 Text snippets (#2344) 2025-06-17 19:29:53 +03:00
Elian Doran
374309a40c fix(templates): description displayed on separate lines 2025-06-17 19:21:21 +03:00
Elian Doran
dcccb5ad30 feat(builtin_templates): add icon for text snippets 2025-06-17 19:21:21 +03:00
Elian Doran
47eaee8b70 feat(builtin_templates): add description field for text snippets 2025-06-17 19:21:21 +03:00
Elian Doran
9687a9d8ff refactor(note_types): separate user templates into own method 2025-06-17 19:21:21 +03:00
Elian Doran
fa11295693 feat(templates): add support for built-in templates 2025-06-17 19:21:21 +03:00
Elian Doran
7e399cc10c feat(text-snippets): support description 2025-06-17 19:21:20 +03:00
Elian Doran
59e0857bb5 feat(text-snippets): add default icon for templates 2025-06-17 19:21:20 +03:00
Elian Doran
4f9bd970af feat(text-snippets): better reaction to removing templates 2025-06-17 19:21:20 +03:00
Elian Doran
3e40a35c19 feat(text-snippets): reload when a new template is added 2025-06-17 19:21:20 +03:00
Elian Doran
97799bfacc feat(text-snippets): handle renames by refreshing the editor 2025-06-17 19:21:20 +03:00
Elian Doran
fb1a74a96d feat(text-snippets): debounce updates to avoid duplication 2025-06-17 19:21:20 +03:00
Elian Doran
9f82e0a6d6 refactor(text-snippets): use a map instead of an object 2025-06-17 19:21:20 +03:00
Elian Doran
421e125882 feat(text-snippets): handle content changes 2025-06-17 19:21:20 +03:00
Elian Doran
17ede00fb2 feat(text-snippets): reload editors when templates change 2025-06-17 19:21:20 +03:00
Elian Doran
502638bae7 feat(text-snippets): add toolbar entry 2025-06-17 19:21:20 +03:00
Elian Doran
af8a905150 feat(text-snippets): basic integration 2025-06-17 19:21:20 +03:00
FliegendeWurst
6c2a228267 fix(website): feature block descriptions 2025-06-17 18:10:56 +02:00
FliegendeWurst
f9ecfd1ad0 feat(website): dark mode 2025-06-17 18:10:56 +02:00
FliegendeWurst
2c3cbcb1f9 website: refactor feature blocks, add more 2025-06-17 18:10:56 +02:00
FliegendeWurst
d1583ca091 fix(website): normal link styling 2025-06-17 18:10:56 +02:00
FliegendeWurst
3c21d97a8a fix(website): page titles 2025-06-17 18:10:56 +02:00
FliegendeWurst
8f7468cd60 website: link to distribution packages 2025-06-17 18:10:56 +02:00
FliegendeWurst
6668e639d5 fix(website): proper favicon 2025-06-17 18:10:56 +02:00
SiriusXT
bcc689cae3 Merge branch 'develop' into note-create 2025-06-17 21:18:06 +08:00
SiriusXT
20173d544b feat(autocomple): support specifying path when creating a new note 2025-06-17 20:41:23 +08:00
Arne Keller
e90d4cf86f docs: add section on Nix flake 2025-06-17 13:05:20 +02:00
Arne Keller
1de02b85b3 chore(docs): restore dev docs 2025-06-17 13:05:20 +02:00
FliegendeWurst
dab43d9372 docs: mention escaped backslashes in regex search 2025-06-17 13:05:20 +02:00
Elian Doran
3b579a3b7b Slash commands (#2336) 2025-06-17 12:49:26 +03:00
Elian Doran
a4a5e0bdf0 refactor(ckeditor5): class name 2025-06-16 23:52:16 +03:00
Elian Doran
9cb227c1ca fix(context menu): not auto-closing on mobile (#2331) 2025-06-16 23:49:41 +03:00
Elian Doran
c4c7321f60 fix(slash): layout on legacy theme 2025-06-16 23:06:34 +03:00
Elian Doran
cce27900b8 feat(slash): add a few aliases 2025-06-16 22:57:47 +03:00
Elian Doran
32f4d7be39 fix(slash): adding links not focusing box 2025-06-16 22:52:54 +03:00
Elian Doran
bbeb4e25f3 refactor(ckeditor): use vite environment variables for inspector 2025-06-16 22:01:05 +03:00
Elian Doran
88f78f3e32 feat(slash): better icons for admonitions 2025-06-16 21:42:31 +03:00
Adorian Doran
36581ba882 style(next)/dialogs/note type chooser: stop highlighting the default item 2025-06-16 21:30:34 +03:00
Elian Doran
1a64b3ce8e feat(slash): alignment 2025-06-16 21:21:42 +03:00
Elian Doran
32ee75ea43 feat(slash): markdown import 2025-06-16 21:14:46 +03:00
Elian Doran
06ebe0a9b3 feat(slash): include page break 2025-06-16 21:11:03 +03:00
Elian Doran
6069518749 feat(slash): include note 2025-06-16 20:58:42 +03:00
Elian Doran
c09a9aa7d3 feat(slash): insert math 2025-06-16 20:55:02 +03:00
Elian Doran
13afcb8a49 feat(slash): insert internal link 2025-06-16 20:48:01 +03:00
Elian Doran
9bfff03cff feat(slash): insert date/time 2025-06-16 20:42:55 +03:00
Adorian Doran
8780debc90 style(next)/dialogs/note type chooser: improve appearance 2025-06-16 20:31:57 +03:00
Elian Doran
6f386f50ff chore(slash): change title of admonitions 2025-06-16 20:22:37 +03:00
Elian Doran
43eff08004 feat(slash): insert footnote command 2025-06-16 20:21:54 +03:00
Elian Doran
3a0b616800 feat(slash): admonition types 2025-06-16 20:15:44 +03:00
Adorian Doran
cb65d02dc6 style(next)/quick search: avoid text shadow for the focused search result items 2025-06-16 20:11:38 +03:00
Adorian Doran
bef485c676 style: switch to the new link style 2025-06-16 20:01:41 +03:00
Adorian Doran
9e4d350848 style(next)/launcher calendar: fix the hover state for the month field 2025-06-16 19:46:20 +03:00
Adorian Doran
ccc7a8010e style(next)/combo box: properly handle the hover state when the dropdown arrow is not defined 2025-06-16 19:44:07 +03:00
Adorian Doran
7269c46de3 style(next): note attachments page: tweak header font size 2025-06-16 19:32:05 +03:00
Elian Doran
178df38377 chore(text): increase mention list max height 2025-06-16 19:25:06 +03:00
Elian Doran
1201f7138a style(next): slash commands layout 2025-06-16 19:24:42 +03:00
Elian Doran
9ff4be8871 feat(text): set up slash commands 2025-06-16 19:24:23 +03:00
Adorian Doran
0a17fb586c Merge branch 'develop' of https://github.com/TriliumNext/Notes into develop 2025-06-16 19:08:08 +03:00
Adorian Doran
1f8713f57e style(next): tweak the note icon selection button 2025-06-16 19:07:56 +03:00
Elian Doran
507fc17701 feat(text): set up license key for development 2025-06-16 18:38:06 +03:00
Elian Doran
26ad428b24 Merge branch 'jshprentz/develop' into develop 2025-06-16 17:51:22 +03:00
Elian Doran
26af3a9d68 Highlight Elixir in code notes (#2327) 2025-06-16 17:50:51 +03:00
Elian Doran
8ecf6ad78e feat(codemirror): add elixir support 2025-06-16 17:48:20 +03:00
SiriusXT
45977efd5f fix(context menu): not auto-closing on mobile 2025-06-16 17:21:44 +08:00
FliegendeWurst
c0b746e03f fix(desktop): proper icon path
The previous value points to a file that no longer exists in the
release builds. This file also only exists in the flake build.
2025-06-16 08:34:46 +02:00
FliegendeWurst
a13e4d5d79 fix(flake): set resourceDir explicitly 2025-06-16 08:28:44 +02:00
FliegendeWurst
e8f2f0f577 feat(flake): Wayland support 2025-06-16 08:08:04 +02:00
FliegendeWurst
f56ba7295a chore(flake): note differences to electron-forge build 2025-06-16 08:04:43 +02:00
FliegendeWurst
8cdb1859e3 fix(flake): use same Electron version as normal build
Also fix the source filtering logic to work properly.
2025-06-16 07:51:26 +02:00
Joel Shprentz
6bfc78e148 Merge branch 'develop' of https://github.com/jshprentz/TriliumNextNotes into develop 2025-06-16 02:28:50 +00:00
Joel Shprentz
cc97ec332d Codemirror does not support Elixir. Remove Elixir from the list. 2025-06-16 02:25:57 +00:00
Joel Shprentz
f2e4dad318 Merge branch 'TriliumNext:develop' into develop 2025-06-15 22:12:08 -04:00
Joel Shprentz
9c45e9fa1a Support highlighting Elixir code notes. 2025-06-16 01:54:31 +00:00
Elian Doran
e1e2afc3cd docs(release): sync description with GitHub 2025-06-16 00:14:52 +03:00
Elian Doran
b9ae226569 chore(release): bump version 2025-06-15 23:32:26 +03:00
Elian Doran
e23e5227a4 docs(user): improve documentation on sharing 2025-06-15 23:32:26 +03:00
Elian Doran
dd647dbb0b docs(release): v0.95.0 2025-06-15 23:32:26 +03:00
Elian Doran
04794c38d8 fix(forge): locales with dash on non-mac 2025-06-15 21:27:53 +03:00
Elian Doran
8d868b77d0 feat(forge): English locale on Linux 2025-06-15 21:16:02 +03:00
Elian Doran
3435f20baa feat(forge): remove unused locales on macOS 2025-06-15 21:06:01 +03:00
Elian Doran
7427507aca fix(forge): adapt removing lproj on macOS 2025-06-15 20:49:07 +03:00
Elian Doran
3d7784ca18 Revert "fix(desktop): use plugin to clean up languages"
This reverts commit cbcc219f1f.
2025-06-15 19:57:48 +03:00
Elian Doran
0414500c17 Revert "fix(forge): English locale still missing"
This reverts commit 385ebb486e.
2025-06-15 19:57:37 +03:00
Elian Doran
385ebb486e fix(forge): English locale still missing 2025-06-15 19:30:22 +03:00
Elian Doran
cbcc219f1f fix(desktop): use plugin to clean up languages 2025-06-15 19:06:06 +03:00
Elian Doran
58e2bc2b6c Merge pull request #2324 from TriliumNext/renovate/major-ckeditor5-config-packages
chore(deps): update ckeditor5 config packages to v11 (major)
2025-06-15 18:51:19 +03:00
Elian Doran
c1e53c09d6 Merge pull request #2305 from TriliumNext/renovate/mime-types-3.x-lockfile
chore(deps): update dependency @types/mime-types to v3.0.1
2025-06-15 18:50:20 +03:00
Elian Doran
f7a6a10c7a Merge branch 'develop' into renovate/mime-types-3.x-lockfile 2025-06-15 18:08:24 +03:00
Elian Doran
e739aee95f Merge pull request #2318 from TriliumNext/renovate/eslint-monorepo
chore(deps): update eslint monorepo to v9.29.0
2025-06-15 18:01:49 +03:00
Elian Doran
1b6c2cdad1 Merge pull request #2320 from TriliumNext/renovate/tsx-4.x-lockfile
fix(deps): update dependency tsx to v4.20.3
2025-06-15 18:01:16 +03:00
Elian Doran
e56d7e3aa0 Merge pull request #2306 from TriliumNext/renovate/typescript-eslint-monorepo
chore(deps): update dependency @typescript-eslint/parser to v8.34.0
2025-06-15 18:00:34 +03:00
Elian Doran
354c4ff8db Merge pull request #2317 from TriliumNext/renovate/axios-1.x
chore(deps): update dependency axios to v1.10.0
2025-06-15 17:59:39 +03:00
Elian Doran
681b61e166 Merge pull request #2316 from TriliumNext/renovate/vite-plugin-static-copy-3.x
chore(deps): update dependency vite-plugin-static-copy to v3.0.2
2025-06-15 17:59:11 +03:00
Elian Doran
74c6c5d8cf Merge pull request #2315 from TriliumNext/renovate/svelte-5.x-lockfile
chore(deps): update dependency svelte to v5.34.3
2025-06-15 17:57:53 +03:00
Elian Doran
8746df4907 Merge pull request #2314 from TriliumNext/renovate/lint-staged-16.x-lockfile
chore(deps): update dependency lint-staged to v16.1.2
2025-06-15 17:57:02 +03:00
Elian Doran
acbd4c5c3e Merge pull request #2288 from TriliumNext/renovate/vitest-monorepo
chore(deps): update vitest monorepo to v3.2.3
2025-06-15 17:56:34 +03:00
renovate[bot]
edd1571c4e chore(deps): update ckeditor5 config packages to v11 2025-06-15 14:43:06 +00:00
renovate[bot]
8289dff3e8 fix(deps): update dependency tsx to v4.20.3 2025-06-15 14:42:18 +00:00
renovate[bot]
d654bb5d16 chore(deps): update eslint monorepo to v9.29.0 2025-06-15 14:41:28 +00:00
renovate[bot]
b985796139 chore(deps): update dependency axios to v1.10.0 2025-06-15 14:40:40 +00:00
renovate[bot]
99fd7b275b chore(deps): update dependency @typescript-eslint/parser to v8.34.0 2025-06-15 14:39:53 +00:00
renovate[bot]
161671e112 chore(deps): update vitest monorepo to v3.2.3 2025-06-15 14:39:00 +00:00
renovate[bot]
02a0173c91 chore(deps): update dependency vite-plugin-static-copy to v3.0.2 2025-06-15 14:38:03 +00:00
renovate[bot]
4f7069a7c3 chore(deps): update dependency svelte to v5.34.3 2025-06-15 14:37:15 +00:00
renovate[bot]
fa4e17c273 chore(deps): update dependency lint-staged to v16.1.2 2025-06-15 14:36:22 +00:00
renovate[bot]
7edd20d179 chore(deps): update dependency @types/mime-types to v3.0.1 2025-06-15 14:35:27 +00:00
Elian Doran
f423d3a145 Merge pull request #2322 from TriliumNext/feature/fix_nx_ignore
Feature/fix nx ignore
2025-06-15 17:10:54 +03:00
Elian Doran
3aba961f5e Revert "test(server): skip failing test"
This reverts commit 82be37b4af.
2025-06-15 17:09:23 +03:00
Elian Doran
d2cfb5e94f chore(nx): have website:typecheck depend on build 2025-06-15 17:03:02 +03:00
Elian Doran
cb22c2cc7f chore(pnpm): align only built dependencies 2025-06-15 16:42:18 +03:00
Elian Doran
3280123414 chore(env): remove 4GB override 2025-06-15 16:11:39 +03:00
Elian Doran
82be37b4af test(server): skip failing test 2025-06-15 16:03:12 +03:00
Elian Doran
0e51a35842 feat(ci): run test-build in affected 2025-06-15 15:42:33 +03:00
Elian Doran
86dc3762b6 fix(nx): patch asset copying to ignore .gitignore 2025-06-15 15:41:10 +03:00
Elian Doran
edc341f024 test(server): ensure build artifacts exist 2025-06-15 15:40:54 +03:00
Elian Doran
f2bef879ce chore(nx): remove dist & node_modules from .nxignore 2025-06-15 14:52:27 +03:00
Elian Doran
a5c6a8e0a9 Revert "test(server): disable file parallelism to avoid CI failures"
This reverts commit 17f27e520c.
2025-06-15 14:41:51 +03:00
Elian Doran
641d2b0527 test(server): skip streaming tests 2025-06-15 14:41:29 +03:00
Elian Doran
e7d129f2f7 chore(renovate): disable bun 2025-06-15 14:41:29 +03:00
Elian Doran
bfc778f002 chore(test): use verbose reporter 2025-06-15 14:28:47 +03:00
Elian Doran
8d2d5504dd test(server): skip memory leak test to see if it breaks the CI 2025-06-15 14:17:18 +03:00
Elian Doran
17f27e520c test(server): disable file parallelism to avoid CI failures 2025-06-15 14:00:54 +03:00
Elian Doran
f8c1dabfd5 Revert "chore(test): skip test breaking the CI"
This reverts commit f3b6817aa7.
2025-06-15 13:59:56 +03:00
Elian Doran
f3b6817aa7 chore(test): skip test breaking the CI 2025-06-15 13:46:13 +03:00
Elian Doran
61d405da68 chore(ci): run server in sequential tests 2025-06-15 13:01:37 +03:00
Elian Doran
d4be6b1de0 chore(renovate): disable HTML manager
Hopefully to reduce the time it takes for renovate to process the repo.
2025-06-15 12:49:08 +03:00
Elian Doran
d199fc322e refactor(client): set up manual chunk for CKEditor 2025-06-15 12:41:03 +03:00
Elian Doran
42ccdd1646 test(server): try to use threads instead of forks to avoid ELIFECYCLE issues in the CI 2025-06-15 12:40:53 +03:00
Elian Doran
185652fb6e chore(deps): sync package lock 2025-06-15 12:06:43 +03:00
Elian Doran
4a579863d1 refactor(deps): remove unnecessary root dependencies 2025-06-15 12:00:59 +03:00
Elian Doran
882b2418d6 chore(renovate): group ckeditor5 config packages 2025-06-15 11:59:52 +03:00
Elian Doran
1dce202d21 test(server): try to reduce number to avoid CI crashing 2025-06-15 11:58:03 +03:00
Elian Doran
2d5754c005 refactor(client,server): remove redundant libraries directory 2025-06-15 11:56:50 +03:00
Elian Doran
9f694fad8b fix(forge): missing English locale on Windows 2025-06-15 11:38:14 +03:00
Elian Doran
9a2264c7f6 chore(forge): make the removed locales list more compact 2025-06-15 11:20:18 +03:00
Elian Doran
77497dbc28 chore(forge): fail build if locale is missing 2025-06-15 11:12:01 +03:00
Elian Doran
1848d5dc96 chore(types): type missing in the CI 2025-06-14 23:54:19 +03:00
Elian Doran
6f5c66f324 chore(types): fix errors in website 2025-06-14 23:40:41 +03:00
Elian Doran
296c95e800 chore(nx): configure for SvelteKit 2025-06-14 22:40:45 +03:00
Elian Doran
6416c6b947 Merge branch 'feature/landing_page' into develop 2025-06-14 21:41:19 +03:00
Elian Doran
30320f6d84 fix(website): download links for server 2025-06-14 21:39:22 +03:00
Elian Doran
b58d0f6663 style(website): slight adjustments to sizes 2025-06-14 18:02:10 +03:00
Elian Doran
56dc1b7e49 feat(website): bigger download button 2025-06-14 17:59:43 +03:00
Elian Doran
cef832fda4 fix(website/download): fix URLs for download 2025-06-14 17:55:38 +03:00
Elian Doran
7066fc3092 feat(website/download): section for paid hosting 2025-06-14 17:14:33 +03:00
Elian Doran
235f7c8aec feat(website/download): section for server downloads 2025-06-14 17:06:51 +03:00
Elian Doran
f0ce728982 refactor(website): improve types 2025-06-14 16:40:50 +03:00
Elian Doran
be7fe9610f feat(website/download): improved descriptions 2025-06-14 16:38:26 +03:00
Elian Doran
49cd0d44ac feat(website/download): improved platform titles 2025-06-14 16:34:51 +03:00
Elian Doran
45a053dfbf feat(website/download): reorganize desktop downloads 2025-06-14 16:29:40 +03:00
Elian Doran
cf47abe849 refactor(website/download): read version number from package.json 2025-06-14 14:34:31 +03:00
Elian Doran
6e97b08256 fix(website/download): use proper download links 2025-06-14 14:33:17 +03:00
Elian Doran
668706a6d9 feat(website/download): integrate architecture selector 2025-06-14 14:24:59 +03:00
Elian Doran
68dc81ac96 feat(website): integrate download matrix for server 2025-06-14 14:14:58 +03:00
Elian Doran
58a099dbc7 Merge pull request #2312 from TriliumNext/doc
docs: ✏️ Fix MFA Readme link
2025-06-14 14:14:10 +03:00
JYC333
740e65a791 Merge pull request #2307 from TriliumNext/renovate/tsx-4.x-lockfile
fix(deps): update dependency tsx to v4.20.3
2025-06-14 13:09:24 +02:00
JYC333
d3aabadb66 Merge branch 'develop' into renovate/tsx-4.x-lockfile 2025-06-14 12:58:08 +02:00
JYC333
571c93c610 Merge pull request #2266 from TriliumNext/renovate/eslint-monorepo
fix(deps): update eslint monorepo to v9.29.0
2025-06-14 12:57:37 +02:00
Jin
168f9b54ba docs: ✏️ Fix MFA Readme link 2025-06-14 12:54:58 +02:00
Elian Doran
65e207648b feat(website): basic platform detection 2025-06-14 13:45:44 +03:00
Elian Doran
cb6cb97326 feat(website): place download now button in header as well 2025-06-14 13:35:31 +03:00
Elian Doran
450fa5311c feat(website/download): add basic server section 2025-06-14 13:31:52 +03:00
Elian Doran
4edd701c29 feat(website/download): add a basic architecture selector 2025-06-14 13:25:19 +03:00
Elian Doran
630aade97a feat(website): start a download section 2025-06-14 13:18:34 +03:00
Elian Doran
c97098d60d chore(website): change hero section 2025-06-14 12:45:34 +03:00
Elian Doran
7d0a555999 fix(website): z-index of header 2025-06-14 12:38:31 +03:00
Elian Doran
2c4d0d800c feat(website): simplify features highlights section 2025-06-14 12:36:32 +03:00
Elian Doran
c7ed63a0e3 fix(website): alignment of footer 2025-06-14 12:31:41 +03:00
Elian Doran
3cc69849db feat(website): add a nice gradient 2025-06-14 12:24:23 +03:00
Elian Doran
32ef25a868 feat(website): add a basic final call-to-action 2025-06-14 12:17:37 +03:00
Elian Doran
437e8875d8 feat(website): move screenshot to the right 2025-06-14 12:15:08 +03:00
Elian Doran
652e91586e feat(website): add a basic intro into the features 2025-06-14 12:13:23 +03:00
Elian Doran
4946a50ebd chore(vscode): add tailwind extension to recommendations 2025-06-14 12:02:43 +03:00
Elian Doran
c69ecb768b feat(website): add a basic feature highlights section 2025-06-14 12:02:22 +03:00
Elian Doran
88abb895ff feat(website): add a basic copyright footer 2025-06-14 11:59:11 +03:00
Elian Doran
09dd8f9828 feat(website): slight improvements to header 2025-06-14 11:49:45 +03:00
Elian Doran
7dd6c1a6cc feat(website): basic screenshot 2025-06-14 11:42:02 +03:00
Elian Doran
9eda9b1399 feat(website): basic hero section 2025-06-14 11:30:13 +03:00
Elian Doran
e66e70f7f2 feat(website): very simple header 2025-06-14 11:13:40 +03:00
Elian Doran
77213a0dbe chore(website): add inlang to ignore 2025-06-14 11:13:30 +03:00
Elian Doran
73b1aa7c6c chore(vscode): add svelte to recommendations 2025-06-14 11:12:49 +03:00
Elian Doran
c43a7df781 chore(website): create empty SvelteKit project 2025-06-14 11:05:38 +03:00
renovate[bot]
97d6d1a5d2 fix(deps): update eslint monorepo to v9.29.0 2025-06-14 07:45:46 +00:00
Elian Doran
925a674de6 Merge pull request #2311 from TriliumNext/renovate/eslint-linter-browserify-9.x
fix(deps): update dependency eslint-linter-browserify to v9.29.0
2025-06-14 10:39:41 +03:00
Elian Doran
297aef788c Merge pull request #2298 from TriliumNext/renovate/codemirror
fix(deps): update codemirror
2025-06-14 10:36:34 +03:00
renovate[bot]
6ecc67c8cf fix(deps): update dependency eslint-linter-browserify to v9.29.0 2025-06-14 07:24:48 +00:00
renovate[bot]
0f4b26fa6f fix(deps): update codemirror 2025-06-14 07:23:54 +00:00
Elian Doran
8704b01f4c Merge pull request #2299 from TriliumNext/renovate/nx-monorepo
chore(deps): update nx monorepo to v21.2.0
2025-06-14 10:19:53 +03:00
Elian Doran
5c3a69984a Merge remote-tracking branch 'origin/develop' into renovate/tsx-4.x-lockfile 2025-06-14 10:15:47 +03:00
renovate[bot]
1dec510120 chore(deps): update nx monorepo to v21.2.0 2025-06-13 13:28:06 +00:00
Elian Doran
4da7fd2c87 Merge pull request #2297 from TriliumNext/renovate/tsx-4.x
chore(deps): update dependency tsx to v4.20.3
2025-06-13 16:23:51 +03:00
renovate[bot]
143209307f chore(deps): update dependency tsx to v4.20.3 2025-06-13 12:45:44 +00:00
renovate[bot]
e300f9087a fix(deps): update dependency tsx to v4.20.3 2025-06-13 12:42:01 +00:00
Elian Doran
26afab03ce Merge pull request #2303 from TriliumNext/sirius_patch
fix(image): ensure images opened in a new tab can be activated
2025-06-13 15:31:27 +03:00
Elian Doran
2f3275474f Merge pull request #2304 from TriliumNext/sirius_patch2
fix(ckeditor): restore focus after importing markdown
2025-06-13 15:28:04 +03:00
SiriusXT
41eff6de17 fix(ckeditor): restore focus after importing markdown 2025-06-13 19:40:49 +08:00
SiriusXT
07bb0644b2 fix(image): ensure images opened in a new tab can be activated 2025-06-13 18:08:15 +08:00
Elian Doran
5b6c003888 Merge pull request #2300 from TriliumNext/renovate/tsx-4.x-lockfile
fix(deps): update dependency tsx to v4.20.2
2025-06-13 09:21:05 +03:00
renovate[bot]
d93e66665c fix(deps): update dependency tsx to v4.20.2 2025-06-13 00:42:33 +00:00
Elian Doran
f0c696d6fd Merge pull request #2281 from TriliumNext/fix/show-warning-when-rosetta-2
fix(client): show warning/error when app is using Rosetta 2 translation (running wrong arch)
2025-06-12 23:05:54 +03:00
Elian Doran
9713864bb6 refactor(cpu_dialog): more mentions of rosetta 2025-06-12 22:53:15 +03:00
Elian Doran
c6c59c63bb feat(cpu_dialog): add actual Windows CPU detection 2025-06-12 22:49:31 +03:00
Elian Doran
0a81e26e7e feat(cpu_dialog): fix icon alignment & add message for windows 2025-06-12 22:43:30 +03:00
Elian Doran
2c032d54c1 chore(cpu_dialog): simplify the dialog 2025-06-12 22:30:33 +03:00
Elian Doran
a635131f47 style(cpu_dialog): use modal-footer 2025-06-12 22:23:37 +03:00
Elian Doran
8edbbe27f8 refactor(client,server): rebrand to CPU arch warnings 2025-06-12 22:16:57 +03:00
Elian Doran
db3c008c07 fix(server): headers sent twice 2025-06-12 22:07:50 +03:00
Elian Doran
a20a06c994 refactor(client): simplify DOM 2025-06-12 22:06:34 +03:00
Elian Doran
fe1f4a4294 refactor(client): remove contrasting title bar 2025-06-12 22:03:22 +03:00
Elian Doran
b4d2d21620 refactor(client): relocate architecture mismatch checks 2025-06-12 22:00:51 +03:00
Elian Doran
f6bba436f4 Revert "fix(client): also move the logic from the server to the client lol"
This reverts commit e401c8c930.
2025-06-12 21:46:27 +03:00
Elian Doran
79aae8fb43 Merge remote-tracking branch 'origin/develop' into fix/show-warning-when-rosetta-2 2025-06-12 21:32:50 +03:00
Elian Doran
c34c0c49db Merge pull request #2293 from TriliumNext/tree
fix(tree): Unexpected collapse after hoisting a note
2025-06-12 18:34:09 +03:00
Elian Doran
59296f3045 fix(server): crashes due to req.body being undefined 2025-06-12 15:01:35 +03:00
SiriusXT
df68ed33bc Merge branch 'develop' into tree 2025-06-12 19:46:11 +08:00
SiriusXT
369eb7844d fix(tree): Unexpected collapse after hoisting a note 2025-06-12 19:36:54 +08:00
Elian Doran
b3270ae7c8 chore(server): enable source map for serve 2025-06-12 12:08:45 +03:00
Elian Doran
995de2b740 feat(editor): hide balloon toolbar when in code block 2025-06-12 10:12:17 +03:00
Elian Doran
be718ce4e0 refactor(client): remove unnecessary widget 2025-06-12 09:23:30 +03:00
Elian Doran
63ce62a67d Merge pull request #2290 from TriliumNext/renovate/anthropic-ai-sdk-0.x
chore(deps): update dependency @anthropic-ai/sdk to v0.54.0
2025-06-12 09:20:42 +03:00
Elian Doran
fc84c06346 Merge pull request #2292 from TriliumNext/renovate/tsx-4.x-lockfile
fix(deps): update dependency tsx to v4.20.1
2025-06-12 09:20:30 +03:00
renovate[bot]
3ccd5b52fa fix(deps): update dependency tsx to v4.20.1 2025-06-12 05:54:46 +00:00
renovate[bot]
bd3f74c17b chore(deps): update dependency @anthropic-ai/sdk to v0.54.0 2025-06-12 05:53:56 +00:00
Elian Doran
10e063b39e Merge pull request #2285 from werererer/fix/nx-project-discovery
fix(build): fix Nx project discovery issue caused by parent .gitignore
2025-06-12 08:46:17 +03:00
Elian Doran
6876337f5f Merge pull request #2289 from TriliumNext/renovate/preact-10.x
fix(deps): update dependency preact to v10.26.9
2025-06-12 08:45:58 +03:00
Elian Doran
c43a654f8e Merge pull request #2291 from TriliumNext/renovate/tsx-4.x
chore(deps): update dependency tsx to v4.20.1
2025-06-12 08:44:54 +03:00
Elian Doran
40a7890b45 Merge pull request #2287 from TriliumNext/renovate/mime-types-3.x-lockfile
chore(deps): update dependency @types/mime-types to v3.0.1
2025-06-12 08:44:32 +03:00
renovate[bot]
b8115fed70 chore(deps): update dependency tsx to v4.20.1 2025-06-12 01:16:04 +00:00
renovate[bot]
b1f7a8e932 fix(deps): update dependency preact to v10.26.9 2025-06-12 01:14:34 +00:00
renovate[bot]
5514fbd113 chore(deps): update dependency @types/mime-types to v3.0.1 2025-06-12 01:12:47 +00:00
Elian Doran
2fe34b1b0d Merge branch 'develop' into fix/nx-project-discovery 2025-06-11 23:58:47 +03:00
Jakob Schlanstedt
efb0050e57 fix(build): ensure projects are discovered by ignoring parent .gitignore rules 2025-06-11 22:43:42 +02:00
Elian Doran
cfd68f41eb Merge pull request #2220 from TriliumNext/moveupdown
fix(move_block): move multiple lines up/down
2025-06-11 22:42:10 +03:00
Elian Doran
5090b38f9c Merge branch 'develop' of https://github.com/TriliumNext/Notes into develop 2025-06-11 22:33:18 +03:00
Elian Doran
57ad6065d8 Merge pull request #2282 from TriliumNext/feat/add-llm-model-unit-tests
feat(unit): add unit tests around LLM model names within outgoing req…
2025-06-11 22:10:36 +03:00
Elian Doran
65b7c2d82f Merge pull request #2249 from TriliumNext/odic
MFA docs improve
2025-06-11 22:08:21 +03:00
Elian Doran
7863a5e09c chore: disable source maps 2025-06-11 22:03:25 +03:00
Jin
94e3586555 refactor: 💡 add link in MFA option point to help page 2025-06-11 20:52:07 +02:00
Jin
ac14a22a43 chore: 🤖 align the same structure with option page 2025-06-11 20:52:07 +02:00
Jin
14179f3bd3 docs: ✏️ show MFA in-app help page 2025-06-11 20:52:07 +02:00
Jin
988a2b8d29 docs: ✏️ Add custom OAuth issuer docs 2025-06-11 20:52:07 +02:00
JYC333
9c38398ae3 Merge pull request #2278 from TriliumNext/renovate/major-typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to v8 (major)
2025-06-11 20:51:13 +02:00
renovate[bot]
c4226ea454 chore(deps): update typescript-eslint monorepo to v8 2025-06-11 18:11:06 +00:00
Elian Doran
19668d1931 Merge branch 'develop' of https://github.com/TriliumNext/Notes into develop 2025-06-11 21:08:37 +03:00
Elian Doran
23c45ee219 feat(forge): remove unused locales 2025-06-11 21:08:02 +03:00
Elian Doran
ed5505e093 Merge pull request #2271 from TriliumNext/renovate/softprops-action-gh-release-2.x
chore(deps): update softprops/action-gh-release action to v2.3.2
2025-06-11 20:09:52 +03:00
Elian Doran
fb9f5a7584 Merge branch 'develop' into renovate/softprops-action-gh-release-2.x 2025-06-11 20:09:30 +03:00
Elian Doran
825c2c1fe9 Merge pull request #2255 from TriliumNext/feature/client_size_optimisation
Client bundle size optimization
2025-06-11 20:06:31 +03:00
Elian Doran
7c2a29edce chore(deps): deduplicate roughjs 2025-06-11 19:45:36 +03:00
Elian Doran
26f44ea1f8 chore(deps): deduplicate preact 2025-06-11 19:42:44 +03:00
Jon Fuller
6dbdf336aa Merge branch 'develop' into feat/add-llm-model-unit-tests 2025-06-11 09:41:11 -07:00
Elian Doran
89d32db601 fix(canvas): loading of fonts under dev mode 2025-06-11 19:34:35 +03:00
Elian Doran
65f9b1c4ef Merge remote-tracking branch 'origin/develop' into feature/client_size_optimisation
; Conflicts:
;	pnpm-lock.yaml
2025-06-11 19:02:34 +03:00
Elian Doran
6596431154 chore(client): force mermaid to avoid double packaging 2025-06-11 18:59:46 +03:00
Elian Doran
9bab8f0bdb refactor(canvas): remove unnecessary env setup 2025-06-11 18:59:46 +03:00
Elian Doran
892c27c945 chore(canvas): set up cleanup 2025-06-11 18:59:45 +03:00
Elian Doran
bb762cfab6 refactor(canvas): remove use of any 2025-06-11 18:59:45 +03:00
Elian Doran
9d296dd692 refactor(canvas): use deferred promise instead of sleep 2025-06-11 18:59:45 +03:00
Elian Doran
0da05a7dbe refactor(canvas): don't expose API directly 2025-06-11 18:59:45 +03:00
Elian Doran
dab9b02990 refactor(canvas): remove unnecessary fragment 2025-06-11 18:59:45 +03:00
Elian Doran
5b4ceb27c5 refactor(canvas): remove unnecessary ref 2025-06-11 18:59:45 +03:00
Elian Doran
51d06ec40d chore(deps): fix lockfile 2025-06-11 18:59:45 +03:00
renovate[bot]
e7285573ac chore(deps): update dependency openai to v5.3.0 2025-06-11 18:59:45 +03:00
renovate[bot]
509e3284ed chore(deps): update vitest monorepo to v3.2.3 2025-06-11 18:59:45 +03:00
renovate[bot]
c8530bca75 chore(deps): update dependency serve-favicon to v2.5.1 2025-06-11 18:59:45 +03:00
renovate[bot]
b27d017174 chore(deps): update dependency @types/mime-types to v3.0.1 2025-06-11 18:59:45 +03:00
Elian Doran
963c7386b1 chore(ci): remove accidental workflow 2025-06-11 18:59:45 +03:00
Elian Doran
e032e6f217 refactor(deps): remove package lock from package 2025-06-11 18:59:45 +03:00
Elian Doran
00c5497d93 chore(cI): use pnpm exec instead of pnpx 2025-06-11 18:59:45 +03:00
JYC333
8ed62398fa Merge pull request #2276 from TriliumNext/renovate/major-happy-dom-monorepo
chore(deps): update dependency happy-dom to v18
2025-06-11 17:00:49 +02:00
renovate[bot]
fff87aec87 chore(deps): update dependency happy-dom to v18 2025-06-11 14:35:56 +00:00
JYC333
6ef71b9209 Merge pull request #2274 from TriliumNext/renovate/major-eslint-monorepo
chore(deps): update dependency eslint to v9
2025-06-11 16:32:50 +02:00
perf3ct
e401c8c930 fix(client): also move the logic from the server to the client lol 2025-06-11 14:30:33 +00:00
renovate[bot]
ba9f034694 chore(deps): update dependency eslint to v9 2025-06-11 16:17:30 +02:00
JYC333
adbc906f9e Merge pull request #2273 from TriliumNext/renovate/swagger-ui-5.x
chore(deps): update dependency @types/swagger-ui to v5
2025-06-11 16:17:04 +02:00
perf3ct
3041af7fe2 feat(client): also fix translations 2025-06-11 14:13:59 +00:00
perf3ct
23ce896681 feat(client): show warning when running through rosetta 2 2025-06-11 14:04:42 +00:00
renovate[bot]
5249624486 chore(deps): update dependency @types/swagger-ui to v5 2025-06-11 13:23:33 +00:00
JYC333
3f5024dc6d Merge pull request #2264 from TriliumNext/renovate/playwright-monorepo
chore(deps): update dependency @playwright/test to v1.53.0
2025-06-11 15:20:37 +02:00
renovate[bot]
1afb971877 chore(deps): update dependency @playwright/test to v1.53.0 2025-06-11 09:46:56 +00:00
JYC333
0d605cbc74 Merge pull request #2260 from TriliumNext/renovate/node-22.x
chore(deps): update dependency @types/node to v22.15.31
2025-06-11 11:35:06 +02:00
renovate[bot]
cc7c175b45 chore(deps): update dependency @types/node to v22.15.31 2025-06-11 09:10:55 +00:00
JYC333
c6f48d1dc0 Merge pull request #2269 from TriliumNext/renovate/openai-5.x
chore(deps): update dependency openai to v5.3.0
2025-06-11 11:08:55 +02:00
renovate[bot]
3ddde700fb chore(deps): update dependency openai to v5.3.0 2025-06-11 08:59:30 +00:00
JYC333
22450519a4 Merge pull request #2263 from TriliumNext/renovate/vitest-monorepo
chore(deps): update vitest monorepo to v3.2.3
2025-06-11 10:54:41 +02:00
renovate[bot]
9ece11ae9b chore(deps): update vitest monorepo to v3.2.3 2025-06-11 08:46:50 +00:00
JYC333
c3796dcdb0 Merge pull request #2262 from TriliumNext/renovate/serve-favicon-2.x
chore(deps): update dependency serve-favicon to v2.5.1
2025-06-11 10:43:18 +02:00
renovate[bot]
c0b9bb282c chore(deps): update dependency serve-favicon to v2.5.1 2025-06-11 08:34:14 +00:00
JYC333
97a904e4b4 Merge pull request #2259 from TriliumNext/renovate/mime-types-3.x-lockfile
chore(deps): update dependency @types/mime-types to v3.0.1
2025-06-11 10:22:37 +02:00
renovate[bot]
411875ac5f chore(deps): update dependency @types/mime-types to v3.0.1 2025-06-11 07:48:05 +00:00
Elian Doran
7b43cfc563 chore(ci): remove accidental workflow 2025-06-11 10:45:25 +03:00
Elian Doran
d6c250111a chore(ci): trigger nightly when workflow changes 2025-06-11 10:24:27 +03:00
renovate[bot]
fdd70e4403 chore(deps): update softprops/action-gh-release action to v2.3.2 2025-06-11 07:17:24 +00:00
Elian Doran
bcd7c29db4 refactor(deps): remove package lock from package 2025-06-11 10:07:39 +03:00
Elian Doran
d3c2315e2d chore(cI): use pnpm exec instead of pnpx 2025-06-11 09:24:07 +03:00
Elian Doran
a7c115cdf5 chore(canvas): solve type errors 2025-06-10 23:41:15 +03:00
Elian Doran
4bd5644258 refactor(canvas): access to wrapper 2025-06-10 23:40:14 +03:00
Elian Doran
5b98277f3c chore(canvas): bring back more options 2025-06-10 23:29:36 +03:00
Elian Doran
ddbd268a66 chore(canvas): bring back load/save 2025-06-10 23:25:43 +03:00
Elian Doran
dd58685455 chore(canvas): bring back scene API 2025-06-10 23:09:36 +03:00
Elian Doran
5ad3d7d077 chore(canvas): missing API endpoint 2025-06-10 22:50:39 +03:00
Elian Doran
3e0f420eec chore(canvas): reintroduce wrapper 2025-06-10 22:44:11 +03:00
Elian Doran
0f47a4988b refactor(canvas): proof of concept for preact-based canvas 2025-06-10 22:22:47 +03:00
Elian Doran
0f9fe0367a chore(client): fix excalidraw erroring out due to react 2025-06-10 21:23:46 +03:00
Elian Doran
b2b6654846 refactor(share): removing problematic build step 2025-06-10 21:09:24 +03:00
Elian Doran
83c136174e chore(client): build dependencies before serving 2025-06-10 21:09:10 +03:00
perf3ct
e1e1eb4f51 feat(unit): add unit tests around LLM model names within outgoing requests 2025-06-10 16:27:05 +00:00
Elian Doran
61958a35c2 fix(ci): release breaking due to upstream
See:
- https://github.com/softprops/action-gh-release/issues/627
- https://github.com/softprops/action-gh-release/issues/628
2025-06-10 14:16:42 +03:00
Elian Doran
5558d6e149 chore(ci): try to increase max heap size everywhere 2025-06-10 13:56:56 +03:00
SiriusXT
3a56a16a58 fix: moving tables/blockQuote 2025-06-10 18:50:32 +08:00
Elian Doran
e7ab96538c refactor(share): update package meta 2025-06-10 13:46:33 +03:00
Elian Doran
cbc57c3a77 Merge pull request #2243 from TriliumNext/open_in_new_window
fix(link): Unable to open notes in a new window
2025-06-10 13:35:00 +03:00
Elian Doran
2bcaf7d8a8 Merge pull request #2236 from TriliumNext/zen
fix(zen): Show fixed toolbar in Zen mode
2025-06-10 13:18:15 +03:00
Elian Doran
db80ebe6dd Merge pull request #2232 from TriliumNext/ckeditor5-alignment
feat(ckeditor): Add text alignment
2025-06-10 13:15:42 +03:00
Elian Doran
72217253be Merge pull request #2245 from TriliumNext/renovate/npm-esbuild-vulnerability
chore(deps): update dependency esbuild to ^0.25.0 [security]
2025-06-10 13:10:12 +03:00
Elian Doran
12ef314ab7 Merge pull request #2230 from TriliumNext/tab-row
Tab row scroll
2025-06-10 13:08:51 +03:00
renovate[bot]
ce38f47bee chore(deps): update dependency esbuild to ^0.25.0 [security] 2025-06-10 09:55:49 +00:00
Elian Doran
36f0de888e Merge pull request #2209 from TriliumNext/feat/llm-unit-tests
feat(llm): add unit tests
2025-06-10 12:52:29 +03:00
SiriusXT
e440f31cb5 Merge branch 'develop' into open_in_new_window 2025-06-10 17:51:54 +08:00
Elian Doran
94cd0fc5d1 Merge pull request #2222 from TriliumNext/feature/share_theme
Integrate Trilium Rocks share theme
2025-06-10 12:43:51 +03:00
SiriusXT
ee9267775e vitest(link): add Vitest test cases for parseNavigationStateFromUrl 2025-06-10 17:38:05 +08:00
SiriusXT
885cdc8c97 Fix: Unable to open in a new window 2025-06-10 17:25:10 +08:00
Elian Doran
9d347ecf74 Merge remote-tracking branch 'origin/develop' into feature/share_theme
; Conflicts:
;	pnpm-lock.yaml
2025-06-10 08:58:20 +03:00
Elian Doran
23238a6ca0 Merge pull request #2238 from TriliumNext/renovate/react-monorepo
chore(deps): update dependency @types/react to v19.1.7
2025-06-10 08:52:17 +03:00
Elian Doran
9dc067564e Merge pull request #2239 from TriliumNext/renovate/vitest-monorepo
chore(deps): update vitest monorepo to v3.2.3
2025-06-10 08:51:54 +03:00
Elian Doran
7936e2d124 Merge pull request #2240 from TriliumNext/renovate/openai-5.x
chore(deps): update dependency openai to v5.2.0
2025-06-10 08:51:33 +03:00
Elian Doran
3e73fc03e6 Merge pull request #2241 from TriliumNext/renovate/typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to ~8.34.0
2025-06-10 08:51:08 +03:00
renovate[bot]
ff19bab496 chore(deps): update typescript-eslint monorepo to ~8.34.0 2025-06-10 01:13:09 +00:00
renovate[bot]
12c4ca5f08 chore(deps): update dependency openai to v5.2.0 2025-06-10 01:11:51 +00:00
renovate[bot]
7b0ab4ee83 chore(deps): update vitest monorepo to v3.2.3 2025-06-10 01:11:10 +00:00
renovate[bot]
1feb4d42b7 chore(deps): update dependency @types/react to v19.1.7 2025-06-10 01:10:24 +00:00
SiriusXT
17ff0e8afc Merge branch 'develop' into ckeditor5-alignment 2025-06-10 09:07:21 +08:00
Elian Doran
7fcbb83dbe chore(forge): increase heap space for CI 2025-06-09 23:31:56 +03:00
Elian Doran
8ee6c7114c test(server-e2e): remove test that was no longer relevant 2025-06-09 23:10:19 +03:00
Elian Doran
ceb6134af2 fix(client): uninitialized field 2025-06-09 22:40:45 +03:00
Elian Doran
0ff8b7edd8 chore(share): fix typecheck issues 2025-06-09 22:31:14 +03:00
Elian Doran
8e73c5906d fix(server): missing boxicons in desktop/mobile 2025-06-09 22:18:44 +03:00
Elian Doran
4216a71a85 fix(server): render share theme on prod 2025-06-09 21:58:56 +03:00
Elian Doran
64e857362f refactor(share): remove Swagger-specific CSS 2025-06-09 21:54:46 +03:00
Elian Doran
8e4bf1538d feat(share): render math 2025-06-09 21:35:29 +03:00
Elian Doran
0ea60fa9d7 fix(client): bring back toast for read-only notes 2025-06-09 21:31:04 +03:00
Elian Doran
6667167b26 chore(server): set implicit dependency to share 2025-06-09 21:19:54 +03:00
Elian Doran
fd06046be5 refactor(share): remove swagger integration 2025-06-09 21:17:04 +03:00
Elian Doran
f20d4cbed2 refactor(share): translate messages 2025-06-09 21:16:03 +03:00
Elian Doran
18e6981e9a refactor(share): don't load boxicons if not needed 2025-06-09 21:00:58 +03:00
Elian Doran
d68d0b5dd8 feat(share): disable search if single note 2025-06-09 20:53:48 +03:00
Elian Doran
3b81d00de7 fix(share): crash if sharing single note without tree 2025-06-09 20:52:02 +03:00
Elian Doran
dd6660a6cd chore(share): use locale-friendly date 2025-06-09 20:49:06 +03:00
Elian Doran
8cb7dc7a7e feat(share): integrate last updated date 2025-06-09 20:47:36 +03:00
Elian Doran
dc5bb627ed feat(share): integrate prev/next navigation 2025-06-09 20:36:04 +03:00
Elian Doran
4d5a0e7832 refactor(share): don't load jQuery if not needed 2025-06-09 20:15:55 +03:00
Elian Doran
0e88818220 refactor(share): don't load highlighting if not needed 2025-06-09 20:03:32 +03:00
Elian Doran
ea015bc2cf refactor(share): remove no longer necessary highlight module 2025-06-09 19:55:21 +03:00
Elian Doran
02fe7c97ca feat(share): automatic light/dark mode 2025-06-09 19:38:44 +03:00
Elian Doran
0cba323091 feat(share): display icons in note tree 2025-06-09 18:47:02 +03:00
Elian Doran
89e931bca6 feat(share): improve style of copy button 2025-06-09 18:31:02 +03:00
SiriusXT
ace7e67c00 fix(zen): Show fixed toolbar in Zen mode 2025-06-09 17:27:31 +02:00
Elian Doran
1bcb811835 feat(share): enable syntax highlighting 2025-06-09 18:22:30 +03:00
JYC333
fba29249b0 Merge pull request #2231 from TriliumNext/toolbar
chore(editor): relocate link icon in floating toolbar
2025-06-09 17:18:02 +02:00
SiriusXT
496c36fde8 chore(editor): relocate link icon in floating toolbar 2025-06-09 16:56:51 +02:00
Elian Doran
54ffeeaed9 refactor(share): remove experiment to precompile EJS 2025-06-09 16:24:21 +03:00
Elian Doran
828da2aabf refactor(share): relocate 404 template 2025-06-09 16:22:22 +03:00
Elian Doran
a61d76deed refactor(share): remove old templates 2025-06-09 16:13:11 +03:00
Elian Doran
2238fed1b7 style(share): remove superfluous padding 2025-06-09 16:06:30 +03:00
Elian Doran
50777faa02 feat(share): add the Trilium logo by default 2025-06-09 15:10:50 +03:00
Elian Doran
157b4f9398 feat(share): expand subchildren when in folder 2025-06-09 15:02:50 +03:00
Elian Doran
091ffdeb59 feat(share): allow viewing directories 2025-06-09 14:54:04 +03:00
Elian Doran
0b3846fc35 fix(share): reintroduce theme-specific scripts 2025-06-09 14:39:56 +03:00
Elian Doran
c2e0640ea8 chore(share): fix error in dev mode 2025-06-09 14:29:19 +03:00
Elian Doran
3cd4b1b67e chore(share): remove redundant script import 2025-06-09 14:28:13 +03:00
Elian Doran
41edab3857 fix(share): regressions in child preview due to base theme 2025-06-09 14:21:47 +03:00
Elian Doran
12dbf36358 fix(share): regressions in menu due to base theme 2025-06-09 14:21:07 +03:00
Elian Doran
d630d407ca refactor(share): integrate with base CSS 2025-06-09 14:20:50 +03:00
Elian Doran
8bdf3626f0 refactor(share): integrate with client 2025-06-09 14:13:35 +03:00
Elian Doran
3def1a1e57 chore(share): introduce theme script 2025-06-09 13:37:38 +03:00
Elian Doran
4fcb186022 chore(share): bring back original share.js 2025-06-09 13:35:14 +03:00
Elian Doran
7451c2701e chore(share): bring back CSS 2025-06-09 13:33:25 +03:00
Elian Doran
098cd19b18 chore(share): fall back to original EJS rendering mechanism 2025-06-09 13:20:41 +03:00
Elian Doran
2827126be7 chore(share): embed imports 2025-06-09 12:39:48 +03:00
SiriusXT
e6c2f729f4 Merge branch 'develop' into moveupdown 2025-06-09 16:41:31 +08:00
Elian Doran
7e443e7b8d refactor(share): use custom build plugin 2025-06-09 11:18:47 +03:00
Elian Doran
d6bb790e26 chore(share): use rendered template (missing include) 2025-06-09 11:12:02 +03:00
Elian Doran
2d3265136d chore(share): prebuilt template 2025-06-09 11:00:58 +03:00
Elian Doran
11853962b7 refactor(share): remove note uploading mechanism 2025-06-09 10:51:18 +03:00
Elian Doran
c6ffa53f0b chore(share): set nx name 2025-06-09 10:48:31 +03:00
SiriusXT
2544c9b483 feat(ckeditor): Add text alignment 2025-06-09 15:00:08 +08:00
Elian Doran
8557159273 Merge pull request #2229 from TriliumNext/renovate/stylelint-config-ckeditor5-11.x-lockfile
chore(deps): update dependency stylelint-config-ckeditor5 to v11
2025-06-09 09:43:54 +03:00
Elian Doran
a4192cf061 Merge pull request #2228 from TriliumNext/renovate/eslint-config-ckeditor5-11.x-lockfile
chore(deps): update dependency eslint-config-ckeditor5 to v11
2025-06-09 09:43:32 +03:00
Elian Doran
d37491e95a Merge pull request #2227 from TriliumNext/renovate/pnpm-10.x
chore(deps): update pnpm to v10.12.1
2025-06-09 09:43:11 +03:00
renovate[bot]
e93e32d01c chore(deps): update pnpm to v10.12.1 2025-06-09 06:23:50 +00:00
SiriusXT
ff1030332c Merge branch 'develop' into tab-row 2025-06-09 14:20:08 +08:00
SiriusXT
f48d17cb22 fix(tab-row): Make the default distance include margin 2025-06-09 14:06:15 +08:00
Elian Doran
ca4b8fa5ec Merge pull request #2226 from TriliumNext/renovate/cheerio-1.x
chore(deps): update dependency cheerio to v1.1.0
2025-06-09 09:03:20 +03:00
Elian Doran
c155b8651f Merge branch 'develop' into renovate/cheerio-1.x 2025-06-09 09:03:17 +03:00
Elian Doran
199c047c28 Merge pull request #2225 from TriliumNext/renovate/vitest-monorepo
chore(deps): update vitest monorepo to v3.2.2
2025-06-09 09:02:37 +03:00
Elian Doran
ff603b2fab Merge pull request #2224 from TriliumNext/renovate/mime-types-3.x-lockfile
chore(deps): update dependency @types/mime-types to v3.0.1
2025-06-09 09:01:46 +03:00
SiriusXT
949ff17776 fix(tab-row): Simplify scrolling logic 2025-06-09 13:59:52 +08:00
SiriusXT
de4f0f7d6f fix(tab-row): Simplify scrolling logic 2025-06-09 11:33:16 +08:00
SiriusXT
a23b0c5ec9 fix(move_block): Make the object movable 2025-06-09 10:04:10 +08:00
renovate[bot]
96000a8a72 chore(deps): update dependency stylelint-config-ckeditor5 to v11 2025-06-09 01:03:54 +00:00
renovate[bot]
b2ccf126ed chore(deps): update dependency eslint-config-ckeditor5 to v11 2025-06-09 01:03:05 +00:00
renovate[bot]
b779577f9b chore(deps): update dependency cheerio to v1.1.0 2025-06-09 00:47:05 +00:00
renovate[bot]
21e2a7e2cd chore(deps): update vitest monorepo to v3.2.2 2025-06-09 00:46:25 +00:00
renovate[bot]
583356cf89 chore(deps): update dependency @types/mime-types to v3.0.1 2025-06-09 00:45:45 +00:00
perf3ct
e96fdbf72f fix(llm): fix logging type check 2025-06-09 00:23:02 +00:00
perf3ct
41906abaf9 feat(route): allow for routes to handle their own response 2025-06-09 00:08:06 +00:00
perf3ct
ca6277f6e9 feat(llm): handle error catching in streaming better 2025-06-09 00:07:00 +00:00
perf3ct
e98fabcc9d fix(unit): resolve auth error in llm unit test
keep working
2025-06-08 23:19:40 +00:00
perf3ct
f5ad5b875e fix(tests): resolve LLM streaming unit test failures
closer to fixing...

closer...

very close to passing...
2025-06-08 23:02:15 +00:00
perf3ct
daa32e4355 Revert "fix(unit): comment out this test for now to see if the rest pass"
This reverts commit 95a33ba3c0.
2025-06-08 22:02:56 +00:00
perf3ct
95a33ba3c0 fix(unit): comment out this test for now to see if the rest pass 2025-06-08 21:54:19 +00:00
perf3ct
b28387bada feat(llm): decrease the throttle on the chunking tests lol 2025-06-08 21:47:53 +00:00
perf3ct
93cf868dcf feat(llm): last test should be passing now 2025-06-08 21:38:57 +00:00
perf3ct
224cae6db2 fix(unit): resolve type errors 2025-06-08 21:03:07 +00:00
perf3ct
0c44dd0e63 fix(unit): alright I'm just going to get rid of this test to pick my battles 2025-06-08 20:55:27 +00:00
perf3ct
d60e795421 feat(llm): still working on fixing tests... 2025-06-08 20:39:35 +00:00
perf3ct
c6f2124e9d feat(llm): add tests for streaming 2025-06-08 20:30:33 +00:00
Elian Doran
04f4933e97 fix(share): fonts not loading 2025-06-08 23:23:21 +03:00
Elian Doran
fa5cd150d9 fix(share): loading of tree and table of contents 2025-06-08 23:22:59 +03:00
Elian Doran
9469433143 chore(share): basic integration of CSS 2025-06-08 23:12:09 +03:00
Elian Doran
881a015f68 chore(share): integrate root template 2025-06-08 22:57:24 +03:00
Elian Doran
8e27d877a1 chore(share): install packages 2025-06-08 22:16:21 +03:00
Elian Doran
eea3163f51 Add 'packages/share-theme/' from commit '2cdd2a0a543f0bced8284ca55bc94efadbc7c91f'
git-subtree-dir: packages/share-theme
git-subtree-mainline: d8f0709bce
git-subtree-split: 2cdd2a0a54
2025-06-08 22:06:45 +03:00
perf3ct
c1bcb73337 feat(llm): also improve the llm streaming service, to make it cooperate with unit tests better 2025-06-08 18:40:20 +00:00
Elian Doran
d8f0709bce fix(editor): white screen if CKEditor crashes a second time 2025-06-08 21:35:01 +03:00
perf3ct
40cad2e886 fix(unit): I believe it should pass now? 2025-06-08 18:20:30 +00:00
perf3ct
a8faf5d699 fix(unit): still working on getting the LLM unit tests to pass... 2025-06-08 18:13:27 +00:00
Elian Doran
d7f26fa27c fix(editor): data loss if updating while editor crashed 2025-06-08 20:39:31 +03:00
Elian Doran
b379f89a7a chore(client): fix logging errors with circular objects 2025-06-08 20:35:38 +03:00
Elian Doran
10abb50971 chore(text): remove duplicate error log 2025-06-08 20:31:09 +03:00
perf3ct
e011c56715 fix(unit): no more type errors hopefully 2025-06-08 16:33:26 +00:00
Jon Fuller
d7abd3a8ed Merge branch 'develop' into feat/llm-unit-tests 2025-06-08 08:49:08 -07:00
SiriusXT
be447b4139 fix(move_block): keep moved blocks in view 2025-06-08 16:49:02 +08:00
SiriusXT
48613da57f fix(move_block): move multiple lines up/down 2025-06-08 16:30:10 +08:00
Elian Doran
ef111c36c0 Merge pull request #2219 from hulmgulm/nginx
Doc: update Nginx reverse proxy documentation
2025-06-08 11:02:07 +03:00
hulmgulm
765601bb75 Merge branch 'TriliumNext:develop' into nginx 2025-06-08 09:52:18 +02:00
Elian Doran
e87789d92b Merge pull request #2208 from TriliumNext/fix/llm-chat-save-bug
fix(llm): save to the same note that the chat request was sent from
2025-06-08 10:45:58 +03:00
Elian Doran
a95acd5529 Merge pull request #2210 from TriliumNext/renovate/compression-1.x
chore(deps): update dependency @types/compression to v1.8.1
2025-06-08 10:45:39 +03:00
Elian Doran
34bc4c9c8c Merge pull request #2218 from hulmgulm/develop
Doc: Updated theme reference
2025-06-08 10:43:50 +03:00
renovate[bot]
e3d0a73459 chore(deps): update dependency @types/compression to v1.8.1 2025-06-08 07:43:23 +00:00
Elian Doran
93b5fc2236 Merge pull request #2206 from TriliumNext/fix/llm-embeddings-removal-increment-version
fix(server): increment SYNC_VERSION and APP_DB_VERSION for LLM embedd…
2025-06-08 10:42:59 +03:00
Elian Doran
8c25b59bed Merge pull request #2217 from TriliumNext/fix/llm-add-warning2
feat(llm): add warning to the top of LLM Chat Notes and LLM settings that the feature is experimental
2025-06-08 10:40:22 +03:00
Elian Doran
fb8f3d1d29 Merge pull request #2212 from TriliumNext/renovate/express-5.x-lockfile
chore(deps): update dependency @types/express to v5.0.3
2025-06-08 10:38:53 +03:00
renovate[bot]
3f1007e904 chore(deps): update dependency @types/express to v5.0.3 2025-06-08 07:36:36 +00:00
Elian Doran
916e855ed0 Merge pull request #2215 from TriliumNext/renovate/multer-1.x
chore(deps): update dependency @types/multer to v1.4.13
2025-06-08 10:33:11 +03:00
renovate[bot]
5b154d2544 chore(deps): update dependency @types/multer to v1.4.13 2025-06-08 07:31:57 +00:00
Elian Doran
6734dae956 chore(server): add serve-nodir 2025-06-08 10:29:20 +03:00
Elian Doran
6b844063b6 Merge pull request #2216 from TriliumNext/renovate/serve-static-1.x
chore(deps): update dependency @types/serve-static to v1.15.8
2025-06-08 10:28:11 +03:00
Elian Doran
5313ce7843 Merge pull request #2211 from TriliumNext/renovate/cookie-parser-1.x
chore(deps): update dependency @types/cookie-parser to v1.4.9
2025-06-08 10:27:33 +03:00
Elian Doran
34fa770748 Merge pull request #2213 from TriliumNext/renovate/express-session-1.x
chore(deps): update dependency @types/express-session to v1.18.2
2025-06-08 10:26:58 +03:00
Elian Doran
ee1e0da156 Merge pull request #2214 from TriliumNext/renovate/mime-types-3.x
chore(deps): update dependency @types/mime-types to v3.0.1
2025-06-08 10:26:27 +03:00
hulmgulm
48a310e0aa Update Nginx.md 2025-06-08 08:34:27 +02:00
hulmgulm
7ef610b702 Update Reference.md 2025-06-08 08:14:39 +02:00
perf3ct
29d9c9834a feat(llm): add warning to the top of LLM Chat Notes and LLM settings that the feature is experimental 2025-06-08 04:48:19 +00:00
perf3ct
055b34fb46 feat(llm): fix last unit tests 2025-06-08 04:33:33 +00:00
renovate[bot]
858801502d chore(deps): update dependency @types/serve-static to v1.15.8 2025-06-08 01:58:09 +00:00
renovate[bot]
f83d33754e chore(deps): update dependency @types/mime-types to v3.0.1 2025-06-08 01:56:48 +00:00
renovate[bot]
a3c655ffc5 chore(deps): update dependency @types/express-session to v1.18.2 2025-06-08 01:55:20 +00:00
renovate[bot]
cf9f59304c chore(deps): update dependency @types/cookie-parser to v1.4.9 2025-06-08 01:53:26 +00:00
perf3ct
cc089c245e fix(llm): save the chat to a specific note, not the currently active note 2025-06-08 00:02:40 +00:00
perf3ct
c6062f453a fix(llm): changing providers works now 2025-06-07 23:57:35 +00:00
perf3ct
414781936b fix(llm): always fetch the user's selected model 2025-06-07 23:36:53 +00:00
perf3ct
0ce5307c0b fix(llm): well this has been using the wrong value the whole time 2025-06-07 23:16:44 +00:00
perf3ct
313c624871 feat(e2e): more tests pass! 2025-06-07 23:15:30 +00:00
perf3ct
d8bbece02a feat(e2e): llm tests mostly pass 2025-06-07 23:07:54 +00:00
perf3ct
bb483558b0 feat(llm): add e2e tests for llm 2025-06-07 22:41:55 +00:00
perf3ct
b6b88dff86 fix(server): increment SYNC_VERSION and APP_DB_VERSION for LLM embeddings removal 2025-06-07 21:13:02 +00:00
perf3ct
7f9ad04b57 feat(llm): create unit tests for LLM services 2025-06-07 21:03:54 +00:00
perf3ct
c2eed44150 fix(llm): make sure that we're referencing the correct Note ID when saving 2025-06-07 20:15:11 +00:00
Elian Doran
ebb1654d0e Merge pull request #2205 from TriliumNext/feat/llm-remove-embeddings
Remove Embeddings from LLM feature
2025-06-07 22:54:05 +03:00
perf3ct
ff37050470 fix(llm): delete provider_manager for embeddings too 2025-06-07 19:33:19 +00:00
perf3ct
b0d804da08 fix(llm): remove the vectorSearch stage from the pipeline 2025-06-07 18:57:08 +00:00
perf3ct
4550c12c6e feat(llm): remove everything to do with embeddings, part 3 2025-06-07 18:30:46 +00:00
perf3ct
44a2e7df21 feat(llm): remove everything to do with embeddings, part 2 2025-06-07 18:20:06 +00:00
Elian Doran
bed3c61142 Merge branch 'develop' of https://github.com/TriliumNext/Notes into develop 2025-06-07 21:15:38 +03:00
perf3ct
44a45780b7 feat(llm): remove everything to do with embeddings 2025-06-07 18:11:12 +00:00
Elian Doran
cedf6cc631 Merge pull request #1888 from TriliumNext/renovate/express-5.x
fix(deps): update dependency express to v5
2025-06-07 20:17:10 +03:00
Elian Doran
7281233012 chore(build): enable source maps 2025-06-07 20:12:13 +03:00
Elian Doran
4def18e882 fix(desktop): query parameters not working 2025-06-07 18:46:29 +03:00
Elian Doran
03024ef7a9 chore(desktop): bypass query error 2025-06-07 15:59:17 +03:00
Elian Doran
9907f7f60f fix(desktop): CLS failing due to lack of listeners 2025-06-07 15:45:56 +03:00
Elian Doran
ebeabe2b54 fix(desktop): adapt request mocking to express 5 2025-06-07 14:58:07 +03:00
Panagiotis Papadopoulos
0bc91349f6 refactor(routes/custom): update path "/custom/*path" for express v5 2025-06-07 14:21:37 +03:00
Panagiotis Papadopoulos
23297c9860 fix(routes): remove unused wildcard in apiRoute "/api/options/:name/:value*"
the updateOption function that handles the req.param is just destructuring `const { name, value } = req.params;` and does nothing else with the path or any params.
The remaining parts of the wildcard (which can be accessed via req.param[0]) are just ignored here.

even with express v4, this would *always* just take and process the very first part of the path, in the exact wildcard's place, e.g.

`/api/options/locale/de` and
`/api/options/locale/de/test/whatever`
would *both* end up destructuring "value" from req.param as "de" (because it is in the exact place of the 'value' wildcard)

in express v5 the wildcard behaviour changes -> here req.param.value would return an array with the paths split into separate string.

but since the code previously regarded only the first part of the path -> we can just get rid of the wildcard and use a named route param

the only thing to keep in mind: if a request with more than one "value" is received, (e.g. `/api/options/locale/de/test/whatever`) -> since we don't have the wildcard anymore  -> this will turn to a 404.
IMHO that is actually desirable here though
2025-06-07 14:21:35 +03:00
renovate[bot]
086bd10f84 fix(deps): update dependency express to v5 2025-06-07 11:15:22 +00:00
Elian Doran
70cdc100d9 Merge pull request #2198 from TriliumNext/oidc
Support custom oidc server
2025-06-07 14:13:14 +03:00
Elian Doran
17c2ae1177 Merge pull request #2177 from TriliumNext/tab-row-scroll
fix(tab-row): ensure similar behavior between horizontal/vertical scrolling
2025-06-07 14:05:03 +03:00
Elian Doran
497a851ebe Merge branch 'develop' of https://github.com/TriliumNext/Notes into develop 2025-06-07 13:52:00 +03:00
Elian Doran
9a48547232 Merge pull request #2194 from TriliumNext/renovate/eslint-config-ckeditor5-11.x-lockfile
chore(deps): update dependency eslint-config-ckeditor5 to v11
2025-06-07 13:42:36 +03:00
Elian Doran
97dfd454b8 Merge pull request #2195 from TriliumNext/renovate/stylelint-config-ckeditor5-11.x-lockfile
chore(deps): update dependency stylelint-config-ckeditor5 to v11
2025-06-07 13:42:14 +03:00
Elian Doran
2d8317887d chore(release): fix setting as prerelease 2025-06-07 13:35:29 +03:00
Elian Doran
5dc4f0eae6 docs(readme): add badge to relative CI for client 2025-06-07 13:30:21 +03:00
JYC333
8849d482b0 Merge pull request #2193 from TriliumNext/renovate/vitest-monorepo
chore(deps): update vitest monorepo to v3.2.2
2025-06-07 12:15:23 +02:00
Jin
bffb47645c fix: 🐛 fix SSO icon loading 2025-06-07 12:10:41 +02:00
Jin
4cafd83c25 feat: 🎸 set SSO login page ui 2025-06-07 12:10:41 +02:00
Jin
db3bf4c12c feat: 🎸 set SSO login logic 2025-06-07 12:10:41 +02:00
Jin
fa44a5343b feat: 🎸 support custon oidc server 2025-06-07 12:10:41 +02:00
renovate[bot]
e5cc58b4e2 chore(deps): update dependency stylelint-config-ckeditor5 to v11 2025-06-07 10:06:51 +00:00
renovate[bot]
dbaee4d29b chore(deps): update dependency eslint-config-ckeditor5 to v11 2025-06-07 10:06:01 +00:00
renovate[bot]
a6d1fd3d9f chore(deps): update vitest monorepo to v3.2.2 2025-06-07 10:05:13 +00:00
Elian Doran
c8b3cdf01b feat(ci): introduce RelativeCI for the client 2025-06-07 13:02:37 +03:00
Elian Doran
5a53fbbb01 chore(ci): get rid of size reporters 2025-06-07 12:52:33 +03:00
Elian Doran
408dcf7713 chore(release): prepare for v0.94.1 2025-06-07 12:46:18 +03:00
Elian Doran
7cbff47078 docs(release): mention rebranding process 2025-06-07 12:45:07 +03:00
Elian Doran
d20386f8da chore(release): add changelog 2025-06-07 12:38:06 +03:00
Elian Doran
4fd99e1728 docs(user): describe session management 2025-06-07 12:38:06 +03:00
Elian Doran
af698550fd Merge pull request #2197 from TriliumNext/ck_patch
fix(ckeditor5): scroll to selection after undo/redo to keep cursor in view
2025-06-07 12:15:02 +03:00
Elian Doran
e50f5ce139 Merge branch 'develop' into ck_patch 2025-06-07 12:11:23 +03:00
Elian Doran
7a04c8a7fd Merge branch 'develop' of https://github.com/TriliumNext/Notes into develop 2025-06-07 12:04:16 +03:00
Elian Doran
68631150af chore(test): adjust timeout 2025-06-07 12:04:14 +03:00
SiriusXT
9dd7f75ec0 fix(ckeditor5): scroll to selection after undo/redo to keep cursor in view 2025-06-07 16:51:10 +08:00
SiriusXT
e70b0d47c9 chore: fix incorrect comment in date/time 2025-06-07 16:49:10 +08:00
Elian Doran
9ead5abc62 Merge pull request #2181 from TriliumNext/feat/llm-change-to-single-provider
LLM integration, part 4
2025-06-07 11:38:30 +03:00
Elian Doran
a7f4bcda8f fix(test): wrong assertion after changing expiration interval 2025-06-07 11:38:18 +03:00
Elian Doran
5c87bab5a7 Merge branch 'develop' of https://github.com/TriliumNext/Notes into develop 2025-06-07 11:28:32 +03:00
Elian Doran
68163f90d1 fix(server): keep session cookies up to to 24h (closes #2196) 2025-06-07 11:28:30 +03:00
Elian Doran
dc35ad9ace fix(server): type errors due to session management 2025-06-07 11:27:07 +03:00
Elian Doran
244a162e42 feat(server): renew session when "Remember me" is off 2025-06-07 11:12:36 +03:00
JYC333
27b54fd7a4 Merge pull request #2192 from TriliumNext/renovate/nx-monorepo
chore(deps): update nx monorepo to v21.1.3
2025-06-07 10:10:07 +02:00
Elian Doran
f8ded7b171 test(server): sessions are cleaned up 2025-06-07 10:47:02 +03:00
Elian Doran
3cf35f9e0c refactor(test): group login tests 2025-06-07 10:33:02 +03:00
Elian Doran
8516df8f9b test(server): ensure session expiry date is well set 2025-06-07 10:10:04 +03:00
Elian Doran
e003ec3b6f test(server): ensure session info exists 2025-06-07 10:03:53 +03:00
Elian Doran
2ceab66b98 refactor(server): augment session data instead of replacing it at request level 2025-06-07 09:55:19 +03:00
perf3ct
6fdd0d021c fix(llm): don't show embedding models in the chat section 2025-06-07 04:23:18 +00:00
perf3ct
4732d7784f fix(llm): add missing translations 2025-06-07 04:13:57 +00:00
renovate[bot]
3bb84ee676 chore(deps): update nx monorepo to v21.1.3 2025-06-07 02:05:12 +00:00
perf3ct
cb3844e627 fix(llm): fix duplicated text when streaming responses 2025-06-07 00:27:56 +00:00
perf3ct
6bc9b3c184 feat(llm): resolve sending double headers in responses, and not being able to send requests to ollama 2025-06-07 00:02:26 +00:00
Elian Doran
941d0d45f8 feat(client): render tooltips for bookmarks 2025-06-07 00:03:30 +03:00
Elian Doran
6e67832416 fix(client): clicking on note list not working due to anchor management 2025-06-06 23:59:43 +03:00
Elian Doran
73cf828bc9 feat(client): one-click navigation to bookmarks (closes #2187) 2025-06-06 23:50:42 +03:00
Elian Doran
7007feabd8 chore(client): text notes not rendering in dev mode 2025-06-06 23:47:35 +03:00
perf3ct
20ec294774 feat(llm): still work on decomplicating provider creation 2025-06-06 20:30:24 +00:00
Elian Doran
acaaf1f1f4 Merge branch 'develop' of https://github.com/TriliumNext/Notes into develop 2025-06-06 23:26:34 +03:00
Elian Doran
c18451a378 fix(server): no longer working subdir due to assets (fixes #2098) 2025-06-06 23:26:30 +03:00
perf3ct
8f33f37de3 feat(llm): for sure overcomplicate what should be a very simple thing 2025-06-06 20:11:33 +00:00
perf3ct
85cfc8fbd4 feat(llm): have OpenAI provider not require API keys (for endpoints like LM Studio) 2025-06-06 19:22:39 +00:00
Elian Doran
4489f6c437 Merge pull request #1918 from TriliumNext/feat/note-edit-readonly-fix2
Store initial "automatic read-only" decision, so that actively edited Note doesn't transition to read-only
2025-06-06 19:42:15 +03:00
Elian Doran
a2a509d45c refactor(client): rename readOnlyDecision 2025-06-06 19:29:06 +03:00
Elian Doran
091cd7a18a fix(server): totp asked even if no authentication is enabled 2025-06-06 16:17:21 +03:00
SiriusXT
17885f6091 fix(tab-row): Remove smooth scrolling 2025-06-06 19:09:25 +08:00
SiriusXT
537ad1c1e5 fix(tab-row): Fix extra +1 when extraWidthRemaining is a decimal 2025-06-06 15:55:00 +08:00
Elian Doran
63a6f00a47 chore(server): add logs to debug missing session 2025-06-06 09:27:51 +03:00
Elian Doran
1a54a17b0d Merge pull request #2182 from TriliumNext/renovate/node-22.x
chore(deps): update dependency @types/node to v22.15.30
2025-06-06 09:24:25 +03:00
renovate[bot]
4eaeeaaaa1 chore(deps): update dependency @types/node to v22.15.30 2025-06-06 06:14:50 +00:00
Elian Doran
255c69b867 style(client): fix dropdown selection color 2025-06-06 09:13:43 +03:00
Elian Doran
f99a59359d Merge pull request #2183 from TriliumNext/renovate/openai-5.x
chore(deps): update dependency openai to v5.1.1
2025-06-06 09:11:35 +03:00
Elian Doran
f25c6ec358 Merge pull request #2184 from TriliumNext/renovate/vitest-monorepo
chore(deps): update vitest monorepo to v3.2.2
2025-06-06 09:11:13 +03:00
renovate[bot]
0b15dd7ad2 chore(deps): update vitest monorepo to v3.2.2 2025-06-06 01:31:34 +00:00
renovate[bot]
bc09c6f217 chore(deps): update dependency openai to v5.1.1 2025-06-06 01:30:50 +00:00
SiriusXT
a38c091d73 Merge branch 'develop' into tab-row-scroll 2025-06-06 09:09:56 +08:00
SiriusXT
f723ca65d1 fix(tab-row): Reduce animation frames 2025-06-06 09:08:17 +08:00
SiriusXT
6d416cfe65 fix(tab-row): Reduce animation frames 2025-06-06 09:06:14 +08:00
perf3ct
c26b74495c feat(llm): remove LLM deprecated functions 2025-06-05 22:34:20 +00:00
perf3ct
3a4bb47cc1 feat(llm): embeddings work and are created when launching for the first ever time 2025-06-05 21:03:15 +00:00
JYC333
0af1c8b3be Merge pull request #2083 from TriliumNext/date/time
feat: Add configurable date/time format for Alt+T shortcut
2025-06-05 21:48:14 +02:00
JYC333
96431fc581 Merge branch 'develop' into date/time 2025-06-05 21:29:39 +02:00
perf3ct
bb8a374ab8 feat(llm): transition from initializing LLM providers, to creating them on demand 2025-06-05 19:27:45 +00:00
perf3ct
c1b10d70b8 feat(llm): also add functions to clear/unregister embedding providers 2025-06-05 18:59:32 +00:00
perf3ct
49e123f399 feat(llm): create endpoints for starting/stopping embeddings 2025-06-05 18:47:25 +00:00
perf3ct
a084805762 Merge branch 'develop' into feat/llm-change-to-single-provider 2025-06-05 18:26:40 +00:00
Elian Doran
e56e3595a8 fix(client): context menu dismissing on mobile (closes #2128) 2025-06-05 19:14:50 +03:00
Elian Doran
f527b13973 Merge pull request #2179 from TriliumNext/demo
docs: ✏️ Fix Journal demo relation name
2025-06-05 18:22:51 +03:00
SiriusXT
ea1bce4e7b fix(tab-row): ensure similar behavior between horizontal/vertical scrolling 2025-06-05 23:19:00 +08:00
Jin
4770bdeb90 docs: ✏️ Fix Journal demo relation name 2025-06-05 17:16:37 +02:00
Elian Doran
818b7afeff feat(docker): try building linux/arm/v8
This is conceptually the same as as linux/arm64 but it is needed on some providers.
2025-06-05 18:13:59 +03:00
SiriusXT
6508ef4fce fix(tab-row): Avoid this.newTabOuterWidth being a decimal in Electron 2025-06-05 20:27:58 +08:00
SiriusXT
7b1c6807ba fix(tab-row): Remove shift+wheel tab switching 2025-06-05 20:20:29 +08:00
SiriusXT
be8ee350cb fix(tab-row): ensure similar behavior between horizontal/vertical scrolling 2025-06-05 19:54:37 +08:00
Elian Doran
b39119119b fix(share): custom share templates no longer working 2025-06-05 14:32:49 +03:00
Elian Doran
79dae44dbc feat(share): improve error logging for missing templates 2025-06-05 14:32:49 +03:00
Elian Doran
b81be8f8d7 feat(share): pass t for translations 2025-06-05 14:32:49 +03:00
SiriusXT
5d017f4524 Merge branch 'develop' into date/time 2025-06-05 18:57:19 +08:00
SiriusXT
99d26b794d Merge branch 'develop' into tab-row-scroll 2025-06-05 18:27:05 +08:00
Elian Doran
ccff7baf95 Merge pull request #2145 from TriliumNext/renovate/electron-36.x
chore(deps): update dependency electron to v36.4.0
2025-06-05 12:57:56 +03:00
Elian Doran
1911323033 Merge pull request #2146 from TriliumNext/renovate/ckeditor-monorepo
fix(deps): update ckeditor monorepo to v45.2.0
2025-06-05 12:56:57 +03:00
SiriusXT
b721bb4cfc fix(tab-row): ensure similar behavior between horizontal/vertical scrolling 2025-06-05 17:54:34 +08:00
renovate[bot]
f3d03be9a5 fix(deps): update ckeditor monorepo to v45.2.0 2025-06-05 09:24:58 +00:00
renovate[bot]
c06ca0dbf8 chore(deps): update dependency electron to v36.4.0 2025-06-05 09:24:16 +00:00
Elian Doran
14269fdfa5 Merge pull request #2143 from TriliumNext/renovate/eslint-stylistic-monorepo
chore(deps): update dependency @stylistic/eslint-plugin to v4.4.1
2025-06-05 12:21:58 +03:00
renovate[bot]
3fba17d73f chore(deps): update dependency @stylistic/eslint-plugin to v4.4.1 2025-06-05 09:18:08 +00:00
Elian Doran
9d477fcc8d Merge pull request #2171 from TriliumNext/renovate/ckeditor-ckeditor5-package-tools-4.x
chore(deps): update dependency @ckeditor/ckeditor5-package-tools to v4
2025-06-05 12:15:08 +03:00
Elian Doran
ca19268bd1 Merge pull request #2144 from TriliumNext/renovate/react-monorepo
chore(deps): update dependency @types/react-dom to v19.1.6
2025-06-05 12:13:56 +03:00
Elian Doran
a36178be03 Merge pull request #2174 from TriliumNext/renovate/anthropic-ai-sdk-0.x
chore(deps): update dependency @anthropic-ai/sdk to v0.53.0
2025-06-05 12:13:29 +03:00
renovate[bot]
5dc48a776c chore(deps): update dependency @types/react-dom to v19.1.6 2025-06-05 09:13:08 +00:00
Elian Doran
c787c870f4 Merge pull request #2175 from TriliumNext/renovate/codemirror-themes
fix(deps): update codemirror themes to v6.2.0
2025-06-05 12:10:58 +03:00
renovate[bot]
1eb53f448a fix(deps): update codemirror themes to v6.2.0 2025-06-05 08:45:23 +00:00
renovate[bot]
839369e253 chore(deps): update dependency @ckeditor/ckeditor5-package-tools to v4 2025-06-05 08:38:18 +00:00
renovate[bot]
446a38e861 chore(deps): update dependency @anthropic-ai/sdk to v0.53.0 2025-06-05 08:36:11 +00:00
Elian Doran
9e8a388592 chore(renovate): group codemirror themes into single PR 2025-06-05 11:32:59 +03:00
Elian Doran
8349204982 chore(docs): mention upcoming changes to branding 2025-06-05 09:03:57 +03:00
Elian Doran
0c8ea23345 Revert "chore: 🤖 Update docs"
This reverts commit 6caba39621.
2025-06-05 08:52:38 +03:00
perf3ct
5db514e245 fix(llm): fix the buggy embedding selection dropdown 2025-06-04 23:02:10 +00:00
perf3ct
5bc2c3ac18 feat(llm): also have the embedding provider settings be changeable 2025-06-04 22:58:20 +00:00
perf3ct
63722a28a2 feat(llm): also add embeddings options for embedding creation 2025-06-04 22:30:16 +00:00
perf3ct
3dee462476 feat(llm): automatically fetch models when provider settings change 2025-06-04 21:32:42 +00:00
perf3ct
fe15a0378a fix(llm): have the model_selection_stage use the instance of the aiServiceManager 2025-06-04 20:23:06 +00:00
JYC333
c40e224727 Merge pull request #2136 from TriliumNext/dateNote
Calendar template docs update
2025-06-04 22:15:05 +02:00
perf3ct
a20e36f4ee feat(llm): change from using precedence list to using a sing specified provider for either chat and/or embeddings 2025-06-04 20:13:13 +00:00
Elian Doran
9bfadd7799 Merge branch 'develop' into dateNote 2025-06-04 22:54:10 +03:00
Elian Doran
4475568d19 fix(server): migration not working due to change in becca loader 2025-06-04 22:36:51 +03:00
Elian Doran
f9d8bf26c4 test(server): migrate integration database to latest 2025-06-04 21:51:46 +03:00
Elian Doran
86689896a1 test(server): don't do automatic backup if migrating database 2025-06-04 21:44:27 +03:00
Elian Doran
c538b54947 Merge branch 'develop' of github.com:TriliumNext/Notes into develop 2025-06-04 20:21:10 +03:00
Elian Doran
a334e82eb0 chore(ci): switch to 22.04 for compatibility reasons 2025-06-04 20:21:07 +03:00
Elian Doran
1818ae1f72 fix(desktop): blank screen when starting (closes #2103) 2025-06-04 19:55:04 +03:00
Jin
3339b36e61 docs: ✏️ Fix day note docs error 2025-06-04 17:01:00 +02:00
Elian Doran
5fc8100c5d fix(build): not all entity types taken into consideration 2025-06-04 15:48:38 +03:00
Jin
f3aa6adb65 docs: ✏️ Update day note and template docs 2025-06-04 11:14:42 +02:00
Jin
6caba39621 chore: 🤖 Update docs 2025-06-04 11:00:14 +02:00
SiriusXT
a88815cf6b fix(insert time): resolve merge conflicts 2025-06-04 16:53:36 +08:00
Jin
deacd7f340 docs: ✏️ Update day note docs 2025-06-04 10:52:19 +02:00
SiriusXT
8b8969f6e9 feat(insert time):fix: resolve merge conflicts 2025-06-04 16:50:36 +08:00
SiriusXT
3cdee1ac86 Merge branch 'develop' into date/time 2025-06-04 16:48:37 +08:00
Elian Doran
df7f0d4099 Merge pull request #2110 from TriliumNext/feat/llm-integration-part3
LLM Integration, part 3
2025-06-04 11:41:49 +03:00
Elian Doran
6563601667 Merge pull request #2123 from FliegendeWurst/shortcuts-i18n
feat(i18n): description for all keyboard shortcuts
2025-06-04 11:39:47 +03:00
Elian Doran
8445ece231 Merge pull request #2106 from TriliumNext/fix/llm-becca-sync
fix(llm): Fix Note Embeddings not being synced correctly and causing sync loops
2025-06-04 11:38:49 +03:00
Elian Doran
dfed0d5f5b Merge pull request #2092 from TriliumNext/feature/grafana-dashboard
feat(metrics): add documentation for using grafana dashboard
2025-06-04 11:35:55 +03:00
Elian Doran
2e1ced38e4 Merge pull request #2127 from TriliumNext/fix/llm-model-names
fix(llm): don't filter for specific words when pulling models for openai
2025-06-04 11:34:47 +03:00
Jin
48ad381a50 refactor: 💡 Add typing 2025-06-04 10:33:40 +02:00
Elian Doran
4cab710dfd Merge pull request #2101 from TriliumNext/patch-theme-2
fix(theme): theme is not enabled on the phone
2025-06-04 11:28:22 +03:00
Elian Doran
869ebc8844 Merge pull request #2129 from TriliumNext/renovate/happy-dom-monorepo
chore(deps): update dependency happy-dom to v17.6.3
2025-06-04 11:13:26 +03:00
Elian Doran
c5662cae46 Merge pull request #2100 from TriliumNext/patch-style
fix(theme): missing --selection-background-color in theme
2025-06-04 11:12:08 +03:00
Elian Doran
aa6ad0b619 Merge pull request #2117 from TriliumNext/external_links
fix(link): Allow external links containing # to open
2025-06-04 11:10:08 +03:00
Elian Doran
555c596a0f Merge branch 'develop' into shortcuts-i18n 2025-06-04 11:04:41 +03:00
Elian Doran
5b9b51d905 Merge branch 'develop' into renovate/happy-dom-monorepo 2025-06-04 11:00:36 +03:00
Elian Doran
d61fe70f4e Merge branch 'develop' of github.com:TriliumNext/Notes into develop 2025-06-04 10:53:09 +03:00
Elian Doran
6405b6e7e4 chore(server): remove configuration for reporters 2025-06-04 10:52:52 +03:00
Jin
f650cca652 refactor: 💡 replace substr with substring 2025-06-04 09:47:05 +02:00
renovate[bot]
62161f6a5d chore(deps): update dependency happy-dom to v17.6.3 2025-06-04 07:37:20 +00:00
Elian Doran
ce570bf080 Merge branch 'develop' into feature/grafana-dashboard 2025-06-04 10:36:56 +03:00
Elian Doran
f4358f3dc1 Merge branch 'develop' into patch-style 2025-06-04 10:36:49 +03:00
Elian Doran
3ccc16ca19 Merge pull request #2130 from TriliumNext/renovate/multer-2.x
chore(deps): update dependency multer to v2.0.1
2025-06-04 10:33:37 +03:00
Elian Doran
75135b390b Merge pull request #2131 from TriliumNext/renovate/vitest-monorepo
chore(deps): update vitest monorepo to v3.2.1
2025-06-04 10:33:08 +03:00
Elian Doran
853ad9fe25 Merge pull request #2132 from TriliumNext/renovate/openai-5.x
chore(deps): update dependency openai to v5.1.0
2025-06-04 10:32:38 +03:00
Elian Doran
f781ded95e Merge pull request #2107 from FliegendeWurst/flake-incremental
refactor(flake): use pnpm2nix, add server package
2025-06-04 10:06:29 +03:00
renovate[bot]
93ea1e7cdb chore(deps): update dependency openai to v5.1.0 2025-06-04 07:05:07 +00:00
renovate[bot]
fd4bc922c1 chore(deps): update vitest monorepo to v3.2.1 2025-06-04 07:04:24 +00:00
renovate[bot]
e24b467801 chore(deps): update dependency multer to v2.0.1 2025-06-04 07:03:31 +00:00
SiriusXT
6a80bda335 vitest(link): add Vitest test cases for parseNavigationStateFromUrl 2025-06-04 14:58:11 +08:00
SiriusXT
69d1c1519f fix(link): Allow external links containing # to open 2025-06-04 14:57:13 +08:00
Elian Doran
dbeb4e1c87 fix(share): missing CK editor stylesheet (closes #2124) 2025-06-04 09:22:07 +03:00
Elian Doran
380cb62d2b chore(editor): relocate bookmark icon in floating toolbar 2025-06-04 08:54:18 +03:00
SiriusXT
0b3ebae59c fix(insert time): Remove unnecessary async 2025-06-04 09:07:15 +08:00
perf3ct
3050424d53 fix(llm): don't filter for specific words when pulling models for openai 2025-06-03 20:47:16 +00:00
Elian Doran
307af229ae fix(test): one more flaky test 2025-06-03 21:25:00 +03:00
Elian Doran
4a4c34e966 fix(test): some etapi tests failing 2025-06-03 20:16:39 +03:00
FliegendeWurst
12d018fdfc feat(i18n): description for all keyboard shortcuts 2025-06-03 19:10:12 +02:00
Elian Doran
cecbe5862c fix(etapi): some endpoints failing due to async (closes #2105) 2025-06-03 19:46:38 +03:00
Elian Doran
ff1a8d2280 test(etapi): port get-date-notes 2025-06-03 19:32:17 +03:00
Elian Doran
931f9e572a test(etapi): deduplicate cloning in delete-entities 2025-06-03 19:24:23 +03:00
Elian Doran
cd310119bc test(etapi): delete-entities not running properly due to missing await 2025-06-03 19:23:11 +03:00
Elian Doran
594e264eea test(etapi): port delete-note-with-all-branches 2025-06-03 19:21:02 +03:00
Elian Doran
9d1717ca9f test(etapi): port delete-cloned-branch 2025-06-03 19:16:59 +03:00
Elian Doran
94fd53db05 test(etapi): port delete-attribute 2025-06-03 19:11:27 +03:00
Elian Doran
fe19e05715 test(etapi): port delete-attachment 2025-06-03 19:08:50 +03:00
Elian Doran
3ec29b2e21 test(etapi): port get-inherited-attribute-cloned 2025-06-03 18:38:15 +03:00
FliegendeWurst
7c47cf420c fix(flake): remove pnpm version override 2025-06-03 17:37:57 +02:00
Elian Doran
9d24ed902c test(etapi): port get-inherited-attribute 2025-06-03 18:26:13 +03:00
FliegendeWurst
267facbaa0 fix(flake): remove not needed build artifacts 2025-06-03 17:15:00 +02:00
FliegendeWurst
d86337a993 refactor(flake): use pnpm2nix, add server package 2025-06-03 17:15:00 +02:00
Elian Doran
8b2d951ad1 test(etapi): port patch-attribute 2025-06-03 18:14:49 +03:00
JYC333
cf24308cb0 Merge pull request #2114 from TriliumNext/renovate/happy-dom-monorepo
chore(deps): update dependency happy-dom to v17.6.1
2025-06-03 16:56:59 +02:00
JYC333
815f087bcb Merge pull request #2115 from TriliumNext/renovate/vitest-monorepo
chore(deps): update dependency @vitest/coverage-v8 to v3.2.0
2025-06-03 16:51:23 +02:00
renovate[bot]
28b2454761 chore(deps): update dependency happy-dom to v17.6.1 2025-06-03 14:51:09 +00:00
JYC333
2e16a91cb4 Merge pull request #2113 from TriliumNext/renovate/typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to v8.33.1
2025-06-03 16:48:51 +02:00
JYC333
9966413402 Merge pull request #2111 from TriliumNext/renovate/openai-5.x
chore(deps): update dependency openai to v5.0.2
2025-06-03 16:48:11 +02:00
Jin
ee478bf2d1 Remove packageManager in apps/desktop 2025-06-03 16:45:29 +02:00
Elian Doran
ee4f9b265e test(etapi): port patch branch 2025-06-03 12:07:44 +03:00
Elian Doran
cfe2bd135b test(etapi): port patch attachment 2025-06-03 12:07:44 +03:00
Elian Doran
2dd2adefae test(etapi): port import zip 2025-06-03 12:07:44 +03:00
Elian Doran
3dfe2ce066 test(etapi): port export note subtree 2025-06-03 12:07:44 +03:00
Elian Doran
94cb18589a test(etapi): port patch note 2025-06-03 12:07:44 +03:00
Elian Doran
842c8a5028 test(etapi): port post revision 2025-06-03 12:07:44 +03:00
Elian Doran
bef121239c test(etapi): port metrics 2025-06-03 12:07:44 +03:00
Elian Doran
dddbb9d4d1 test(etapi): port attachment content 2025-06-03 12:07:44 +03:00
Elian Doran
d75e86789d test(etapi): port note content 2025-06-03 12:07:44 +03:00
Jin
5b051db3eb update pnpm 2025-06-03 09:57:49 +02:00
SiriusXT
a5ba1b0489 fix(link): Allow external links containing # to navigate 2025-06-03 14:27:32 +08:00
perf3ct
b76166b0d5 fix(llm): always fetch the embedding model 2025-06-03 05:13:32 +00:00
perf3ct
336cd1fbda fix(llm): storing >1 message in a chat note works
fix(llm): storing >1 message in a chat note works
2025-06-03 03:15:17 +00:00
perf3ct
d4d55b20a8 fix(llm): get rid of a lot of log.info() statements that were spammy 2025-06-03 03:00:15 +00:00
Jon Fuller
36a1316612 Merge branch 'develop' into patch-style 2025-06-02 19:18:53 -07:00
renovate[bot]
7036616a51 chore(deps): update vitest monorepo to v3.2.0 2025-06-03 01:04:13 +00:00
renovate[bot]
6a69ce65d7 chore(deps): update typescript-eslint monorepo to v8.33.1 2025-06-03 01:02:38 +00:00
renovate[bot]
be3b72d6b0 chore(deps): update dependency openai to v5.0.2 2025-06-03 00:58:57 +00:00
perf3ct
d2ba270fdf fix(llm): sending messages no longer throws an error at first 2025-06-03 00:18:45 +00:00
perf3ct
ab3758c9b3 refactor(llm): resolve issue with headers being sent after request was sent 2025-06-02 23:54:38 +00:00
perf3ct
e7e04b7ccd refactor(llm): streamline chat response handling by simplifying content accumulation and removing unnecessary thinking content processing 2025-06-02 23:25:15 +00:00
perf3ct
aad92b57c7 fix(llm): prevent sent message duplication 2025-06-02 22:47:30 +00:00
perf3ct
0d305cd22c refactor(llm): optimize chat UI updates by checking for new content and preserving scroll position 2025-06-02 22:34:10 +00:00
perf3ct
7b498cf384 refactor(llm): update chat saving logic to prevent race conditions between client and server 2025-06-02 22:30:59 +00:00
perf3ct
ed64a5b4f7 refactor(llm): simplify chat handling by removing session store and directly integrating chat storage service 2025-06-02 22:09:59 +00:00
perf3ct
d8d5318ace refactor(llm): remove deprecated validateEmbeddingProviders method and update session handling in chat services 2025-06-02 21:55:52 +00:00
Jon Fuller
4aa936bd2b Merge branch 'develop' into fix/llm-becca-sync 2025-06-02 14:52:03 -07:00
perf3ct
3a55735cd5 refactor(llm): implement new configuration methods for provider order and validation, enhancing error handling and deprecating legacy functions 2025-06-02 21:49:35 +00:00
perf3ct
5a5a69ebb8 refactor(llm): streamline model selection by utilizing the new configuration system and enhance error handling 2025-06-02 21:44:43 +00:00
perf3ct
ce7c4a31a1 refactor(llm): enhance configuration handling to avoid default assumptions and improve error handling 2025-06-02 21:43:36 +00:00
perf3ct
45175b6af3 refactor(llm): integrate new configuration system for provider management and model selection 2025-06-02 21:36:19 +00:00
perf3ct
00ce765e96 Merge branch 'develop' into feat/llm-integration-part3 2025-06-02 20:24:18 +00:00
perf3ct
934efab533 refactor(llm): update handling of note embeddings and clean up LoadResults class 2025-06-02 19:10:47 +00:00
perf3ct
b0d60f8004 refactor(llm): update NoteEmbeddingRow structure and add handling in LoadResults class 2025-06-02 19:01:34 +00:00
Elian Doran
4ed30e0624 test(etapi): port basic-auth 2025-06-02 21:43:40 +03:00
Elian Doran
26fcc4fb24 feat(flake): support darwin 2025-06-02 21:25:25 +03:00
Elian Doran
95641a3b6d test(etapi): port search 2025-06-02 21:16:57 +03:00
Elian Doran
4e81be8c76 test(etapi): port other 2025-06-02 20:59:25 +03:00
Elian Doran
887a7f900c test(etapi): port create-entities 2025-06-02 20:36:53 +03:00
Elian Doran
6121fb0ad6 test(etapi): port create-backup 2025-06-02 19:30:06 +03:00
Elian Doran
9e6d78b625 test(etapi): port no-token 2025-06-02 19:26:36 +03:00
Elian Doran
f9f3f1983f test(etapi): port basic-auth 2025-06-02 19:16:48 +03:00
Elian Doran
b88af5e4b3 test(etapi): port api-metrics 2025-06-02 19:02:01 +03:00
Elian Doran
053ff0568d test(etapi): port app-info 2025-06-02 18:51:10 +03:00
perf3ct
cc0795f812 fix(llm): also add note_embeddings to froca and consistency tests 2025-06-02 15:49:45 +00:00
perf3ct
f3a21cda98 fix(llm): add the noteEmbedding object to all things becca to make it happy 2025-06-02 15:26:32 +00:00
perf3ct
dcab4caee3 feat(llm): redo chat storage, part 3 2025-06-02 15:12:08 +00:00
Elian Doran
d9249e3760 fix(server): webclipper not working due to import issue 2025-06-02 16:34:41 +03:00
Elian Doran
1af20bdb73 fix(vite): tests not runnable 2025-06-02 16:25:19 +03:00
Elian Doran
d7c6c8f5fd feat(geomap): the line of GPX traces now respects the #color attribute 2025-06-02 15:53:19 +03:00
SiriusXT
78626e67d2 fix(theme): When using next as the base for custom themes, the next theme is not enabled on the phone 2025-06-02 16:13:17 +08:00
Elian Doran
9ba49bdc5f Add 'apps/web-clipper/' from commit '786d249a6effe0262859d05e6cb1737e5fc8bdd8'
git-subtree-dir: apps/web-clipper
git-subtree-mainline: b0e5190718
git-subtree-split: 786d249a6e
2025-06-02 10:26:57 +03:00
SiriusXT
f4f593c2ba fix(theme): missing --selection-background-color in theme 2025-06-02 15:24:52 +08:00
Elian Doran
70fb610e8d Merge branch 'develop' into feature/grafana-dashboard 2025-06-02 09:11:38 +03:00
Elian Doran
b0e5190718 Merge pull request #2081 from TriliumNext/renovate/openai-5.x
chore(deps): update dependency openai to v5
2025-06-02 09:10:17 +03:00
Elian Doran
3819885370 Merge pull request #2078 from TriliumNext/renovate/eslint-linter-browserify-9.x
fix(deps): update dependency eslint-linter-browserify to v9.28.0
2025-06-02 09:09:26 +03:00
Elian Doran
1b72cff234 Merge pull request #2079 from TriliumNext/renovate/eslint-monorepo
fix(deps): update eslint monorepo to v9.28.0
2025-06-02 09:09:04 +03:00
Elian Doran
f4c74b5c7c Merge pull request #2080 from TriliumNext/renovate/mime-types-3.x
chore(deps): update dependency @types/mime-types to v3
2025-06-02 09:08:42 +03:00
Elian Doran
089bf75ee2 Merge pull request #2075 from TriliumNext/feature/nix_flake
Nix flake
2025-06-02 08:58:22 +03:00
perf3ct
f6af617f6b feat(llm): redo chat storage, part 2 2025-06-02 02:38:21 +00:00
perf3ct
03b8eff8f6 feat(metrics): also add metrics feature to readme 2025-06-01 19:18:04 -07:00
perf3ct
86d5e416b5 feat(metrics): add documentation for using grafana dashboard 2025-06-01 19:01:15 -07:00
Jon Fuller
c28edb674c Merge branch 'develop' into feat/note-edit-readonly-fix2 2025-06-01 18:51:28 -07:00
perf3ct
35f78aede9 feat(llm): redo chat storage, part 1 2025-06-02 00:56:19 +00:00
SiriusXT
3c23f5d43f fix(insert time): Improve translation 2025-06-01 21:23:11 +08:00
SiriusXT
7918f8f230 fix(insert time): Improve translation 2025-06-01 20:35:55 +08:00
SiriusXT
b973fc7748 feat(insert time): change file name 2025-06-01 20:16:56 +08:00
SiriusXT
8e56faf9f0 fix(insert time): restore editor focus after inserting time 2025-06-01 19:37:49 +08:00
SiriusXT
cef362c123 feat(insert time): Add inserting time via UI 2025-06-01 19:15:59 +08:00
SiriusXT
22586bfcc0 feat(insert time): Add configurable date/time format for Alt+T shortcut 2025-06-01 16:18:54 +08:00
SiriusXT
029d6df5ec Merge branch 'develop' into date/time 2025-06-01 15:41:46 +08:00
SiriusXT
a8c4b11c9f feat(insert time): Add configurable date/time format for Alt+T shortcut 2025-06-01 15:27:50 +08:00
renovate[bot]
7c2bb38182 chore(deps): update dependency openai to v5 2025-06-01 01:52:10 +00:00
renovate[bot]
2fb2fcf88b chore(deps): update dependency @types/mime-types to v3 2025-06-01 01:51:27 +00:00
renovate[bot]
3c6acc0681 fix(deps): update eslint monorepo to v9.28.0 2025-06-01 01:50:41 +00:00
renovate[bot]
f56804168d fix(deps): update dependency eslint-linter-browserify to v9.28.0 2025-06-01 01:49:10 +00:00
FliegendeWurst
381498433f fix(flake): copy app icon 2025-05-31 19:15:46 +02:00
FliegendeWurst
628c52eb04 fix(flake): don't double wrap output 2025-05-31 19:14:30 +02:00
FliegendeWurst
89e2d46088 fix(flake): handle sass updates better 2025-05-31 19:14:07 +02:00
Elian Doran
0e4ad86fbd Merge pull request #2076 from FliegendeWurst/flake-1
feat(flake): desktop item, wrapped binary
2025-05-31 20:00:52 +03:00
FliegendeWurst
d506283e48 feat(flake): desktop item, wrapped binary 2025-05-31 18:56:32 +02:00
Elian Doran
fc4ec9a045 refactor(flake): deduplicate environment variables 2025-05-31 19:24:43 +03:00
Elian Doran
7b577e31c4 chore(flake): build native dependencies 2025-05-31 19:16:23 +03:00
Elian Doran
93a9911727 chore(flake): actually copy the dist 2025-05-31 18:32:23 +03:00
Elian Doran
e2737d2d55 chore(flake): get build to succeed 2025-05-31 18:23:18 +03:00
Elian Doran
c365cdb6c6 chore(flake): patch dart 2025-05-31 18:21:08 +03:00
Elian Doran
e82567a33d chore(flake): get the build to run 2025-05-31 18:15:22 +03:00
Elian Doran
bbe3bd7107 chore(flake): ignore /result from repo 2025-05-31 18:09:45 +03:00
Elian Doran
5cd087f660 chore(flake): get dependencies to install 2025-05-31 18:08:06 +03:00
Elian Doran
27dd097394 chore(flake): start off with empty project 2025-05-31 17:41:56 +03:00
SngAbc
e2ac581b14 Merge pull request #2072 from vanndoublen/feature/custom-datetime-format
Feature/custom datetime format
2025-05-31 21:50:26 +08:00
vanndoublen
f640c9212e Merge branch 'develop' into feature/custom-datetime-format 2025-05-20 19:55:45 +08:00
iamvann
d1f8e651f4 fix: address the review feedback 2025-05-20 19:46:50 +08:00
iamvann
2e3a8dfacb fix/commet 2025-05-18 03:36:39 +08:00
iamvann
4fbfcefa94 feat: Implement configurable date/time format for Alt+T shortcut 2025-05-18 03:14:18 +08:00
perf3ct
caccbf49c0 feat(client): try a different approach to handling read-only threshold
feat(client): revert note_details.ts
2025-05-13 22:02:59 +00:00
perf3ct
f07ad03343 feat(client): support temporarily disabling read-only note when read-only threshold is triggered
feat(client): stop the cursor from going to the top of the note when note transitions to read-only but we're still editing

feat(client): stop the cursor from going to the top of the note when note transitions to read-only but we're still editing, take 2
2025-05-13 22:02:59 +00:00
Zerebos
2cdd2a0a54 Fix several accessibility issues 2024-06-10 02:17:50 -04:00
Zerebos
01a8d0f864 Make reloading in light theme less janky 2024-06-08 15:21:59 -04:00
Zerebos
81e986db30 Fix multiple cases of overflow 2024-06-08 14:42:39 -04:00
Zerebos
3dc3f1579b Fix theme switcher showing wrong value 2024-06-08 14:32:06 -04:00
Zerebos
a7ed566645 Improve page performance and rendering
- Moves expanding the tree navigation to the template so the rendering is already done before page load
- Adds a way to explicitly set the logo size to prevent the page moving after it loads in
2024-06-08 14:31:40 -04:00
Zerebos
2485f20d5c Minor fixes for new options 2024-06-06 19:10:56 -04:00
Zerebos
465468a5a3 Add more customization in template 2024-06-06 12:21:38 -04:00
Zerebos
930632e6fe Template bugfixes 2024-06-06 11:14:43 -04:00
zadam
786d249a6e Merge pull request #61 from contributor/master
Capture location.hash into pageUrl attribute
2024-05-18 06:12:10 +02:00
contributor
750d2fe3bb capture location.hash with save-selection (example.com/long-article#part10) 2024-05-10 14:10:41 +03:00
zadam
3140ed2302 Update README.md 2024-03-27 06:40:30 +01:00
Zack Rauen
0016b43c09 Update to Trilium 0.62.3 2023-12-05 20:50:29 -05:00
Zack Rauen
5391521c08 Enable sliding categories and extract TODOs 2023-09-30 00:13:37 -04:00
Zack Rauen
e7a3f6d17e Generate ToC in templates 2023-09-29 01:43:39 -04:00
Zack Rauen
074ac0b725 Make swagger load from trilium directly 2023-09-28 20:59:17 -04:00
Zack Rauen
bde6d83625 Fix css priority for mobile 2023-09-28 20:59:04 -04:00
Zack Rauen
bdfe86ba1a Remove dead code and reorganize slightly 2023-09-28 00:24:52 -04:00
Zack Rauen
a8bb2f110b Some important QoL changes 2023-09-28 00:14:44 -04:00
Zack Rauen
4147f2b8d8 Switch scripts to redesign 2023-09-27 23:18:03 -04:00
Zack Rauen
a7edc5e03e Slightly adjust page template 2023-09-27 22:54:13 -04:00
Zack Rauen
1a40658345 Rework css for new design 2023-09-27 22:53:59 -04:00
Zack Rauen
124fd480b7 Update build script for templates 2023-09-27 16:49:30 -04:00
Zack Rauen
667cd64f3b Rename main to scripts 2023-09-27 16:28:08 -04:00
Zack Rauen
2ae6d4c5a4 Add initial templates 2023-09-27 16:20:04 -04:00
Zack Rauen
d9e33270b0 Add README 2023-09-24 06:03:35 -04:00
Zack Rauen
ad59080307 Some more finishing touches 2023-09-23 22:39:38 -04:00
Zack Rauen
34fa9a1f01 Some final touches 2023-09-23 07:21:38 -04:00
Zack Rauen
cb19ed36bc Make mobile compatible 2023-09-23 02:56:59 -04:00
Zack Rauen
039a5ac2e3 Modularize more and add swagger-ui 2023-09-22 23:57:17 -04:00
Zack Rauen
568ea271a4 Modularize proof of concept 2023-09-21 03:18:11 -04:00
Zack Rauen
a584a5c296 Port from trilium notes 2023-09-20 03:38:55 -04:00
zadam
526eaa2749 Merge pull request #54 from manto89/feature/already-visited
Check if the current page is already saved in trilium
2023-07-09 23:02:09 +02:00
zadam
f57e97462f Merge pull request #52 from manto89/feature/keep-title
Keep the title when adding notes
2023-07-09 23:00:36 +02:00
manto89
1d6211c7fd Add already-section when pageurl matches existing note.
Trigger search note by url after connection to backend
2023-06-21 13:13:28 +02:00
manto89
82c1b21d64 add checkbox in popup and handle case in popup.js 2023-06-19 00:02:19 +02:00
zadam
b731a051f1 Merge pull request #49 from jrao1/add-published-date
Send published/modified date when saving whole page
2023-03-07 22:52:35 +01:00
J Rao
1434773572 Send published/modified date when saving whole page 2023-03-06 21:34:51 +08:00
zadam
71be9515b9 release 1.0.1 2022-10-29 15:25:37 +02:00
zadam
c9c10a90aa 1.0.1 2022-10-29 15:25:20 +02:00
zadam
9130980203 release 1.0.0 2022-10-29 14:59:05 +02:00
zadam
efb2436679 release 1.0.0 2022-10-29 14:56:00 +02:00
zadam
5007ec4703 remove username from options 2022-10-29 14:55:26 +02:00
zadam
711e4f8ebd Merge remote-tracking branch 'origin/master' 2022-10-29 14:41:00 +02:00
zadam
9ac8bc28ed rename saveCroppedScreenshot 2022-10-29 14:40:53 +02:00
zadam
ddbf933779 Create LICENSE 2022-08-05 19:19:15 +02:00
zadam
252263de38 add option to screenshot the whole page, kind of, #39 2022-02-19 19:38:01 +01:00
zadam
66c8891fbb make screenshot cancellable via escape key, closes #37 2022-02-19 19:37:23 +01:00
zadam
20a4e2eb08 upgrade readability 2022-02-19 19:35:39 +01:00
zadam
9cf88d9697 fixed release script 2021-11-21 10:29:00 +01:00
zadam
2ee147f625 release 0.3.1 2021-11-20 22:02:51 +01:00
zadam
b3d70aaf44 release 0.3.1 2021-11-20 22:00:36 +01:00
zadam
968f735adc update icons 2021-11-20 21:59:31 +01:00
zadam
611cdc3850 release 0.3.0 2021-04-10 11:22:26 +02:00
zadam
6cd9aadfca fix screenshot scaling issue on firefox, https://github.com/zadam/trilium/issues/1202 2021-04-10 11:18:01 +02:00
zadam
80e82b4fde Merge remote-tracking branch 'origin/master'
# Conflicts:
#	popup/popup.html
#	popup/popup.js
2021-03-31 22:25:16 +02:00
zadam
0811276fbb "save note" is now "save link with note" - i.e. we're saving a current URL together with the text note 2021-03-31 22:23:43 +02:00
zadam
e9825a4e50 Merge pull request #29 from alteist/close-tabs-after-saving-link
Add close tabs link in toast message after saving window's tabs
2021-02-22 21:43:17 +01:00
alteist
b42fd1a6c5 code cleanup 2021-02-22 15:30:12 +06:00
alteist
73d48d8dd5 Add close tabs link in toast message after saving window's tabs 2021-02-22 14:35:55 +06:00
alteist
6824eb21d4 removed close tabs function, added toast message after saving 2021-02-22 13:34:34 +06:00
alteist
9abee14beb reformat code 2021-02-22 13:24:46 +06:00
alteist
6952c467cd Add save, send and close current window's tabs feature 2021-02-22 01:40:07 +06:00
zadam
1c75ea89ad scan only one port instead of 10, https://github.com/zadam/trilium/issues/1503 2020-12-31 00:48:23 +01:00
zadam
2d814af7f1 fix FF release script 2020-10-20 23:22:41 +02:00
zadam
16b2ffe5d2 release 0.2.0 2020-10-20 23:13:28 +02:00
zadam
c67e1857e6 fix FF release script 2020-10-20 23:13:19 +02:00
zadam
1b880a8521 release 0.2.0 2020-10-20 23:09:57 +02:00
zadam
800aaa9f05 release 0.2.0 2020-10-20 23:09:40 +02:00
zadam
2a79ef0aa5 release 0.2.0 2020-10-20 23:09:01 +02:00
zadam
01525464a4 release 0.2.0 2020-10-20 22:57:37 +02:00
zadam
b46a16d153 release 0.2.0 2020-10-20 22:53:34 +02:00
zadam
89984a7d96 use correct active tab URL 2020-10-09 23:08:57 +02:00
zadam
097d319fca Merge pull request #6 from lgorence/better_errors
Improve error handling
2020-10-09 22:29:27 +02:00
zadam
28eb3f2aae clip screenshot crops correctly when HIDPI display is used 2020-10-09 22:07:26 +02:00
zadam
b61149382e Merge pull request #24 from siralmat/keyboard-shortcuts
Keyboard shortcuts
2020-10-09 08:52:20 +02:00
zadam
1d682b2389 Merge pull request #23 from siralmat/fixes
Library fix: browser-polyfill.js
2020-10-09 08:51:07 +02:00
Rebecca
111a12f881 Documentation updates 2020-10-09 11:00:16 +08:00
Rebecca
d9f6862978 Add support for keyboard shortcuts 2020-10-09 10:23:17 +08:00
Rebecca
dfaf6267d3 Replace browser-polyfill.js with compiled script 2020-10-08 15:18:26 +08:00
zadam
abc26a3867 Merge pull request #21 from meichthys/patch-1
Update Link to Joplin Web Clipper
2020-09-16 21:11:59 +02:00
MeIchthys
cc1ad73c68 Update Link to Joplin Web Clipper
The old link was broken as the project structure changed.
2020-09-16 15:10:07 -04:00
zadam
7a42d7e229 send along a local datetime so that the creation date is saved correctly including the timezone 2020-05-29 20:27:17 +02:00
zadam
d3539ec9d7 Readability.js update 2020-04-05 15:37:44 +02:00
zadam
338f01be01 fixes and library updates 2020-04-02 22:49:27 +02:00
Logan Gorence
b1bda646c4 Fix imageless posts when taking a screenshot on an internal page. 2019-10-06 20:59:46 -07:00
zadam
1a58026b23 Update README.md 2019-07-21 22:32:57 +02:00
zadam
372645f642 release 0.1.1 2019-07-20 15:53:10 +02:00
zadam
d5a0542703 Merge remote-tracking branch 'origin/master' 2019-07-20 15:52:41 +02:00
zadam
7e5f9f87a1 release 0.1.0 2019-07-20 15:48:26 +02:00
zadam
4a646ca5a7 release 0.0.5 2019-07-20 14:59:12 +02:00
zadam
6d57e49646 Update README.md 2019-07-20 14:42:48 +02:00
zadam
ab32a0f593 release 0.0.4 2019-07-20 14:40:56 +02:00
zadam
6b342d2fe7 fix repo name 2019-07-20 14:40:50 +02:00
zadam
56aef8b6ec release 0.0.3 2019-07-20 14:38:08 +02:00
zadam
ae5e632cbd release fixes 2019-07-20 14:38:06 +02:00
zadam
a952c1bf49 release 0.0.2 2019-07-20 12:19:53 +02:00
zadam
d839f86b49 fixes 2019-07-20 12:19:47 +02:00
zadam
8cf44780ce release scripts + check of version compatibility 2019-07-20 12:17:59 +02:00
zadam
94222e80cf fix dev detection 2019-07-19 23:34:54 +02:00
zadam
cf97c12516 sign firefox extension 2019-07-19 23:32:46 +02:00
zadam
4e21fc0c06 fix layout issue in chrome 2019-07-19 21:22:44 +02:00
zadam
c45bbd0fc9 add .gitignore for .idea 2019-07-19 21:12:38 +02:00
zadam
9359d9924c version can't contain beta suffix 2019-07-19 21:12:13 +02:00
zadam
4618520bf9 font family for popup, different clip types for notes and whole pages 2019-07-19 21:05:22 +02:00
zadam
d18045f905 gitignore 2019-07-19 20:40:31 +02:00
zadam
bc1dae516b gitignore 2019-07-19 20:39:25 +02:00
zadam
8d28c14133 initial import 2019-07-19 20:35:53 +02:00
775 changed files with 43629 additions and 20878 deletions

1
.env Normal file
View File

@@ -0,0 +1 @@
NODE_OPTIONS=--max_old_space_size=4096

View File

@@ -85,7 +85,7 @@ runs:
APPLE_ID: ${{ env.APPLE_ID }}
APPLE_ID_PASSWORD: ${{ env.APPLE_ID_PASSWORD }}
WINDOWS_SIGN_EXECUTABLE: ${{ env.WINDOWS_SIGN_EXECUTABLE }}
TRILIUM_ARTIFACT_NAME_HINT: TriliumNextNotes-${{ github.ref_name }}-${{ inputs.os }}-${{ inputs.arch }}
TRILIUM_ARTIFACT_NAME_HINT: TriliumNotes-${{ github.ref_name }}-${{ inputs.os }}-${{ inputs.arch }}
run: pnpm nx --project=desktop electron-forge:make -- --arch=${{ inputs.arch }} --platform=${{ inputs.forge_platform }}
# Add DMG signing step

View File

@@ -30,4 +30,4 @@ runs:
mkdir -p upload
file=$(find ./apps/server/out -name '*.tar.xz' -print -quit)
name=${{ github.ref_name }}
cp "$file" "upload/TriliumNextNotes-Server-${name//\//-}-${{ inputs.os }}-${{ inputs.arch }}.tar.xz"
cp "$file" "upload/TriliumNotes-Server-${name//\//-}-${{ inputs.os }}-${{ inputs.arch }}.tar.xz"

View File

@@ -13,9 +13,9 @@ name: "CodeQL Advanced"
on:
push:
branches: [ "develop" ]
branches: [ "main" ]
pull_request:
branches: [ "develop" ]
branches: [ "main" ]
schedule:
- cron: '20 7 * * 0'

View File

@@ -1,9 +1,9 @@
name: Dev
on:
push:
branches: [ develop ]
branches: [ main ]
pull_request:
branches: [ develop ]
branches: [ main ]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
@@ -12,8 +12,8 @@ concurrency:
env:
GHCR_REGISTRY: ghcr.io
DOCKERHUB_REGISTRY: docker.io
IMAGE_NAME: ${{ github.repository_owner }}/notes
TEST_TAG: ${{ github.repository_owner }}/notes:test
IMAGE_NAME: ${{ github.repository}}
TEST_TAG: ${{ github.repository}}:test
permissions:
pull-requests: write # for PR comments
@@ -39,76 +39,7 @@ jobs:
- uses: nrwl/nx-set-shas@v4
- name: Check affected
run: pnpm nx affected --verbose -t typecheck build rebuild-deps
report-electron-size:
name: Report Electron size
runs-on: ubuntu-latest
needs:
- check-affected
steps:
- name: Checkout the repository
uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- name: Set up node & dependencies
uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Run the build
uses: ./.github/actions/build-electron
with:
os: linux
arch: x64
shell: bash
forge_platform: linux
- name: Run the Electron size report
uses: ./.github/actions/report-size
with:
paths: 'upload/**/*'
onlyDiff: 'true'
branch: 'develop'
header: 'Electron size report'
unit: "MB"
ghToken: ${{ secrets.GITHUB_TOKEN }}
report-server-size:
name: Report server size
runs-on: ubuntu-latest
needs:
- check-affected
steps:
- name: Checkout the repository
uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
- name: Set up node & dependencies
uses: actions/setup-node@v4
with:
node-version: 22
cache: "pnpm"
- run: pnpm install --frozen-lockfile
- name: Run the build
uses: ./.github/actions/build-server
with:
os: linux
arch: x64
- name: Run the server size report
uses: ./.github/actions/report-size
with:
paths: 'upload/**/*'
onlyDiff: 'true'
branch: 'develop'
header: 'Server size report'
unit: "MB"
ghToken: ${{ secrets.GITHUB_TOKEN }}
run: pnpm nx affected --verbose -t typecheck build rebuild-deps test-build
test_dev:
name: Test development
@@ -143,7 +74,15 @@ jobs:
run: pnpm install --frozen-lockfile
- name: Update build info
run: pnpm run chore:update-build-info
- name: Trigger build
- name: Trigger client build
run: pnpm nx run client:build
- name: Send client bundle stats to RelativeCI
if: false
uses: relative-ci/agent-action@v3
with:
webpackStatsFile: ./apps/client/dist/webpack-stats.json
key: ${{ secrets.RELATIVE_CI_CLIENT_KEY }}
- name: Trigger server build
run: pnpm nx run server:build
- uses: docker/setup-buildx-action@v3
- uses: docker/build-push-action@v6

View File

@@ -1,7 +1,7 @@
on:
push:
branches:
- "develop"
- "main"
- "feature/update**"
- "feature/server_esm**"
paths-ignore:
@@ -14,8 +14,8 @@ on:
env:
GHCR_REGISTRY: ghcr.io
DOCKERHUB_REGISTRY: docker.io
IMAGE_NAME: ${{ github.repository_owner }}/notes
TEST_TAG: ${{ github.repository_owner }}/notes:test
IMAGE_NAME: ${{ github.repository}}
TEST_TAG: ${{ github.repository}}:test
permissions:
contents: read
@@ -53,7 +53,7 @@ jobs:
run: pnpm install --frozen-lockfile
- name: Install Playwright Browsers
run: pnpx playwright install --with-deps
run: pnpm exec playwright install --with-deps
- name: Run the TypeScript build
run: pnpm run server:build
@@ -82,7 +82,15 @@ jobs:
require-healthy: true
- name: Run Playwright tests
run: TRILIUM_DOCKER=1 TRILIUM_PORT=8082 pnpx nx run server-e2e:e2e
run: TRILIUM_DOCKER=1 TRILIUM_PORT=8082 pnpm exec nx run server-e2e:e2e
- name: Upload Playwright trace
if: failure()
uses: actions/upload-artifact@v4
with:
name: Playwright trace (${{ matrix.dockerfile }})
path: test-output/playwright/output
- uses: actions/upload-artifact@v4
if: ${{ !cancelled() }}
with:
@@ -111,6 +119,9 @@ jobs:
- dockerfile: Dockerfile
platform: linux/arm/v7
image: ubuntu-24.04-arm
- dockerfile: Dockerfile
platform: linux/arm/v8
image: ubuntu-24.04-arm
runs-on: ${{ matrix.image }}
needs:
- test_docker

View File

@@ -11,7 +11,8 @@ on:
pull_request:
paths:
- .github/actions/build-electron/*
- forge.config.cjs
- .github/workflows/nightly.yml
- forge.config.ts
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
@@ -37,7 +38,7 @@ jobs:
shell: bash
forge_platform: darwin
- name: linux
image: ubuntu-latest
image: ubuntu-22.04
shell: bash
forge_platform: linux
- name: windows
@@ -76,7 +77,7 @@ jobs:
WINDOWS_SIGN_EXECUTABLE: ${{ vars.WINDOWS_SIGN_EXECUTABLE }}
- name: Publish release
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@v2.3.2
if: ${{ github.event_name != 'pull_request' }}
with:
make_latest: false
@@ -91,7 +92,7 @@ jobs:
uses: actions/upload-artifact@v4
if: ${{ github.event_name == 'pull_request' }}
with:
name: TriliumNextNotes ${{ matrix.os.name }} ${{ matrix.arch }}
name: TriliumNotes ${{ matrix.os.name }} ${{ matrix.arch }}
path: apps/desktop/upload
nightly-server:
@@ -102,7 +103,7 @@ jobs:
arch: [x64, arm64]
include:
- arch: x64
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
- arch: arm64
runs-on: ubuntu-24.04-arm
runs-on: ${{ matrix.runs-on }}
@@ -116,7 +117,7 @@ jobs:
arch: ${{ matrix.arch }}
- name: Publish release
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@v2.3.2
if: ${{ github.event_name != 'pull_request' }}
with:
make_latest: false

View File

@@ -3,7 +3,7 @@ name: playwright
on:
push:
branches:
- master
- main
pull_request:
permissions:
@@ -33,11 +33,11 @@ jobs:
- name: Install dependencies
run: pnpm install --frozen-lockfile
- run: pnpx playwright install --with-deps
- run: pnpm exec playwright install --with-deps
- uses: nrwl/nx-set-shas@v4
# Prepend any command with "nx-cloud record --" to record its logs to Nx Cloud
# - run: npx nx-cloud record -- echo Hello World
# Nx Affected runs only tasks affected by the changes in this PR/commit. Learn more: https://nx.dev/ci/features/affected
# When you enable task distribution, run the e2e-ci task instead of e2e
- run: pnpx nx affected -t e2e
- run: pnpm exec nx affected -t e2e --exclude desktop-e2e

View File

@@ -23,7 +23,7 @@ jobs:
shell: bash
forge_platform: darwin
- name: linux
image: ubuntu-latest
image: ubuntu-22.04
shell: bash
forge_platform: linux
- name: windows
@@ -73,7 +73,7 @@ jobs:
arch: [x64, arm64]
include:
- arch: x64
runs-on: ubuntu-latest
runs-on: ubuntu-22.04
- arch: arm64
runs-on: ubuntu-24.04-arm
runs-on: ${{ matrix.runs-on }}
@@ -114,13 +114,13 @@ jobs:
path: upload
- name: Publish stable release
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@v2.3.2
with:
draft: false
body_path: docs/Release Notes/Release Notes/${{ github.ref_name }}.md
fail_on_unmatched_files: true
files: upload/*.*
discussion_category_name: Announcements
discussion_category_name: Releases
make_latest: ${{ !contains(github.ref, 'rc') }}
prerelease: ${{ !contains(github.ref, 'rc') }}
prerelease: ${{ contains(github.ref, 'rc') }}
token: ${{ secrets.RELEASE_PAT }}

5
.gitignore vendored
View File

@@ -43,4 +43,7 @@ apps/*/out
upload
.rollup.cache
*.tsbuildinfo
*.tsbuildinfo
/result
.svelte-kit

2
.nvmrc
View File

@@ -1 +1 @@
22.16.0
22.17.0

View File

@@ -1,7 +1,2 @@
_regroup
_regroup_monorepo
# Asset copying respects .gitignore / .nxignore for some reason.
# See https://github.com/nrwl/nx/issues/20309
!dist
!node_modules
_regroup_monorepo

View File

@@ -9,6 +9,8 @@
"redhat.vscode-yaml",
"tobermory.es6-string-html",
"vitest.explorer",
"yzhang.markdown-all-in-one"
"yzhang.markdown-all-in-one",
"svelte.svelte-vscode",
"bradlc.vscode-tailwindcss"
]
}

View File

@@ -1,10 +1,13 @@
# TriliumNext Notes
# Trilium Notes
![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) ![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/notes) ![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/triliumnext/notes/total)
![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran?style=flat-square)
![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/notes?style=flat-square)
![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/triliumnext/notes/total?style=flat-square)
[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop&style=flat-square)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp)
[English](./README.md) | [Chinese](./docs/README-ZH_CN.md) | [Russian](./docs/README.ru.md) | [Japanese](./docs/README.ja.md) | [Italian](./docs/README.it.md) | [Spanish](./docs/README.es.md)
TriliumNext Notes is a free and open-source, cross-platform hierarchical note taking application with focus on building large personal knowledge bases.
Trilium Notes is a free and open-source, cross-platform hierarchical note taking application with focus on building large personal knowledge bases.
See [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) for quick overview:
@@ -19,7 +22,7 @@ See [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) for q
* Seamless [note versioning](https://triliumnext.github.io/Docs/Wiki/note-revisions)
* Note [attributes](https://triliumnext.github.io/Docs/Wiki/attributes) can be used for note organization, querying and advanced [scripting](https://triliumnext.github.io/Docs/Wiki/scripts)
* UI available in English, German, Spanish, French, Romanian, and Chinese (simplified and traditional)
* Direct [OpenID and TOTP integration](.docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/Multi-Factor%20Authentication.md") for more secure login
* Direct [OpenID and TOTP integration](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/Multi-Factor%20Authentication.md) for more secure login
* [Synchronization](https://triliumnext.github.io/Docs/Wiki/synchronization) with self-hosted sync server
* there's a [3rd party service for hosting synchronisation server](https://trilium.cc/paid-hosting)
* [Sharing](https://triliumnext.github.io/Docs/Wiki/sharing) (publishing) notes to public internet
@@ -36,6 +39,7 @@ See [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) for q
* [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) and [Markdown import & export](https://triliumnext.github.io/Docs/Wiki/markdown)
* [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) for easy saving of web content
* Customizable UI (sidebar buttons, user-defined widgets, ...)
* [Metrics](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics.md), along with a [Grafana Dashboard](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics/grafana-dashboard.json)
✨ Check out the following third-party resources/communities for more TriliumNext related goodies:
@@ -149,7 +153,7 @@ Please view the [documentation guide](./docs/Developer%20Guide/Developer%20Guide
## 👏 Shoutouts
* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - best WYSIWYG editor on the market, very interactive and listening team
* [FancyTree](https://github.com/mar10/fancytree) - very feature rich tree library without real competition. TriliumNext Notes would not be the same without it.
* [FancyTree](https://github.com/mar10/fancytree) - very feature rich tree library without real competition. Trilium Notes would not be the same without it.
* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with support for huge amount of languages
* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library without competition. Used in [relation maps](https://triliumnext.github.io/Docs/Wiki/relation-map.html) and [link maps](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map)

View File

@@ -1,12 +0,0 @@
#!/usr/bin/env bash
set -e # Fail on any command error
VERSION=`jq -r ".version" package.json`
SERIES=${VERSION:0:4}-latest
sudo docker build -t triliumnext/notes:$VERSION --network host -t triliumnext/notes:$SERIES .
if [[ $VERSION != *"beta"* ]]; then
sudo docker tag triliumnext/notes:$VERSION triliumnext/notes:latest
fi

View File

@@ -91,5 +91,5 @@ async function start() {
}
// @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));

View File

@@ -24,7 +24,7 @@ if ! git diff-index --quiet HEAD --; then
exit 1
fi
BASE_BRANCH=master
BASE_BRANCH=main
if [[ "$VERSION" == *"beta"* ]]; then
BASE_BRANCH=beta

View File

@@ -47,11 +47,3 @@ echo "Tagging commit with $TAG"
git tag $TAG
git push origin $TAG
echo "Updating master"
git fetch
git checkout master
git reset --hard origin/master
git merge origin/develop
git push

View File

@@ -25,15 +25,16 @@ stats() {
# Print the number of existing strings on the JSON files for each locale
s=$(number_of_keys "${paths[0]}/en/server.json")
c=$(number_of_keys "${paths[1]}/en/translation.json")
echo "| locale |server strings |client strings |"
echo "|--------|---------------|---------------|"
echo "| en | ${s} | ${c} |"
echo "| locale | server strings | client strings |"
echo "|--------|----------------|----------------|"
echo "| en | ${s} | ${c} |"
echo "|--------|----------------|----------------|"
for locale in "${locales[@]}"; do
s=$(number_of_keys "${paths[0]}/${locale}/server.json")
c=$(number_of_keys "${paths[1]}/${locale}/translation.json")
n1=$(((8 - ${#locale}) / 2))
n2=$((n1 == 1 ? n1 + 1 : n1))
echo "|$(printf "%${n1}s")${locale}$(printf "%${n2}s")| ${s} | ${c} |"
echo "|$(printf "%${n1}s")${locale}$(printf "%${n2}s")| ${s} | ${c} |"
done
}
@@ -78,7 +79,10 @@ file_path="$(
cd -- "$(dirname "${0}")" >/dev/null 2>&1 || exit
pwd -P
)"
paths=("${file_path}/../translations/" "${file_path}/../src/public/translations/")
paths=(
"${file_path}/../../apps/server/src/assets/translations/"
"${file_path}/../../apps/client/src/translations/"
)
locales=(cn de es fr pt_br ro tw)
if [ $# -eq 1 ]; then

View File

@@ -44,7 +44,6 @@ export default tseslint.config(
"dist/*",
"docs/*",
"demo/*",
"libraries/*",
"src/public/app-dist/*",
"src/public/app/doc_notes/*"
]

View File

@@ -38,7 +38,6 @@ export default [
"dist/*",
"docs/*",
"demo/*",
"libraries/*",
// TriliumNextTODO: check if we want to format packages here as well - for now skipping it
"packages/*",
"src/public/app-dist/*",

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();
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

@@ -35,13 +35,13 @@
"chore:generate-openapi": "tsx bin/generate-openapi.js"
},
"devDependencies": {
"@playwright/test": "1.52.0",
"@stylistic/eslint-plugin": "4.4.0",
"@types/express": "5.0.1",
"@types/node": "22.15.29",
"@playwright/test": "1.53.1",
"@stylistic/eslint-plugin": "5.0.0",
"@types/express": "5.0.3",
"@types/node": "22.15.33",
"@types/yargs": "17.0.33",
"@vitest/coverage-v8": "3.1.4",
"eslint": "9.27.0",
"@vitest/coverage-v8": "3.2.4",
"eslint": "9.29.0",
"eslint-plugin-simple-import-sort": "12.1.1",
"esm": "3.2.25",
"jsdoc": "4.0.4",

View File

@@ -1,12 +0,0 @@
POST {{triliumHost}}/etapi/auth/login
Content-Type: application/json
{
"password": "1234"
}
> {%
client.assert(response.status === 201);
client.global.set("authToken", response.body.authToken);
%}

View File

@@ -1,43 +0,0 @@
### Test regular API metrics endpoint (requires session authentication)
### Get metrics from regular API (default Prometheus format)
GET {{triliumHost}}/api/metrics
> {%
client.test("API metrics endpoint returns Prometheus format by default", function() {
client.assert(response.status === 200, "Response status is not 200");
client.assert(response.headers["content-type"].includes("text/plain"), "Content-Type should be text/plain");
client.assert(response.body.includes("trilium_info"), "Should contain trilium_info metric");
client.assert(response.body.includes("trilium_notes_total"), "Should contain trilium_notes_total metric");
client.assert(response.body.includes("# HELP"), "Should contain HELP comments");
client.assert(response.body.includes("# TYPE"), "Should contain TYPE comments");
});
%}
### Get metrics in JSON format
GET {{triliumHost}}/api/metrics?format=json
> {%
client.test("API metrics endpoint returns JSON when requested", function() {
client.assert(response.status === 200, "Response status is not 200");
client.assert(response.headers["content-type"].includes("application/json"), "Content-Type should be application/json");
client.assert(response.body.version, "Version info not present");
client.assert(response.body.database, "Database info not present");
client.assert(response.body.timestamp, "Timestamp not present");
client.assert(typeof response.body.database.totalNotes === 'number', "Total notes should be a number");
client.assert(typeof response.body.database.activeNotes === 'number', "Active notes should be a number");
client.assert(response.body.noteTypes, "Note types breakdown not present");
client.assert(response.body.attachmentTypes, "Attachment types breakdown not present");
client.assert(response.body.statistics, "Statistics not present");
});
%}
### Test invalid format parameter
GET {{triliumHost}}/api/metrics?format=xml
> {%
client.test("Invalid format parameter returns error", function() {
client.assert(response.status === 500, "Response status should be 500");
client.assert(response.body.message.includes("prometheus"), "Error message should mention supported formats");
});
%}

View File

@@ -1,7 +0,0 @@
GET {{triliumHost}}/etapi/app-info
Authorization: {{authToken}}
> {%
client.assert(response.status === 200);
client.assert(response.body.clipperProtocolVersion === "1.0");
%}

View File

@@ -1,21 +0,0 @@
GET {{triliumHost}}/etapi/app-info
Authorization: Basic etapi {{authToken}}
> {%
client.assert(response.status === 200);
client.assert(response.body.clipperProtocolVersion === "1.0");
%}
###
GET {{triliumHost}}/etapi/app-info
Authorization: Basic etapi wrong
> {% client.assert(response.status === 401); %}
###
GET {{triliumHost}}/etapi/app-info
Authorization: Basic wrong {{authToken}}
> {% client.assert(response.status === 401); %}

View File

@@ -1,4 +0,0 @@
PUT {{triliumHost}}/etapi/backup/etapi_test
Authorization: {{authToken}}
> {% client.assert(response.status === 201); %}

View File

@@ -1,158 +0,0 @@
POST {{triliumHost}}/etapi/create-note
Authorization: {{authToken}}
Content-Type: application/json
{
"noteId": "forcedId{{$randomInt}}",
"parentNoteId": "root",
"title": "Hello",
"type": "text",
"content": "Hi there!",
"dateCreated": "2023-08-21 23:38:51.123+0200",
"utcDateCreated": "2023-08-21 23:38:51.123Z"
}
> {%
client.assert(response.status === 201);
client.assert(response.body.note.noteId.startsWith("forcedId"));
client.assert(response.body.note.title == "Hello");
client.assert(response.body.note.dateCreated == "2023-08-21 23:38:51.123+0200");
client.assert(response.body.note.utcDateCreated == "2023-08-21 23:38:51.123Z");
client.assert(response.body.branch.parentNoteId == "root");
client.log(`Created note ` + response.body.note.noteId + ` and branch ` + response.body.branch.branchId);
client.global.set("createdNoteId", response.body.note.noteId);
client.global.set("createdBranchId", response.body.branch.branchId);
%}
### Clone to another location
POST {{triliumHost}}/etapi/branches
Authorization: {{authToken}}
Content-Type: application/json
{
"noteId": "{{createdNoteId}}",
"parentNoteId": "_hidden"
}
> {%
client.assert(response.status === 201);
client.assert(response.body.parentNoteId == "_hidden");
client.global.set("clonedBranchId", response.body.branchId);
client.log(`Created cloned branch ` + response.body.branchId);
%}
###
GET {{triliumHost}}/etapi/notes/{{createdNoteId}}
Authorization: {{authToken}}
> {%
client.assert(response.status === 200);
client.assert(response.body.noteId == client.global.get("createdNoteId"));
client.assert(response.body.title == "Hello");
// order is not defined and may fail in the future
client.assert(response.body.parentBranchIds[0] == client.global.get("clonedBranchId"))
client.assert(response.body.parentBranchIds[1] == client.global.get("createdBranchId"));
%}
###
GET {{triliumHost}}/etapi/notes/{{createdNoteId}}/content
Authorization: {{authToken}}
> {%
client.assert(response.status === 200);
client.assert(response.body == "Hi there!");
%}
###
GET {{triliumHost}}/etapi/branches/{{createdBranchId}}
Authorization: {{authToken}}
> {%
client.assert(response.status === 200);
client.assert(response.body.branchId == client.global.get("createdBranchId"));
client.assert(response.body.parentNoteId == "root");
%}
###
GET {{triliumHost}}/etapi/branches/{{clonedBranchId}}
Authorization: {{authToken}}
> {%
client.assert(response.status === 200);
client.assert(response.body.branchId == client.global.get("clonedBranchId"));
client.assert(response.body.parentNoteId == "_hidden");
%}
###
POST {{triliumHost}}/etapi/attributes
Content-Type: application/json
Authorization: {{authToken}}
{
"attributeId": "forcedAttributeId{{$randomInt}}",
"noteId": "{{createdNoteId}}",
"type": "label",
"name": "mylabel",
"value": "val",
"isInheritable": true
}
> {%
client.assert(response.status === 201);
client.assert(response.body.attributeId.startsWith("forcedAttributeId"));
client.global.set("createdAttributeId", response.body.attributeId);
%}
###
GET {{triliumHost}}/etapi/attributes/{{createdAttributeId}}
Authorization: {{authToken}}
> {%
client.assert(response.status === 200);
client.assert(response.body.attributeId == client.global.get("createdAttributeId"));
%}
###
POST {{triliumHost}}/etapi/attachments
Content-Type: application/json
Authorization: {{authToken}}
{
"ownerId": "{{createdNoteId}}",
"role": "file",
"mime": "plain/text",
"title": "my attachment",
"content": "my text"
}
> {%
client.assert(response.status === 201);
client.global.set("createdAttachmentId", response.body.attachmentId);
%}
###
GET {{triliumHost}}/etapi/attachments/{{createdAttachmentId}}
Authorization: {{authToken}}
> {%
client.assert(response.status === 200);
client.assert(response.body.attachmentId == client.global.get("createdAttachmentId"));
client.assert(response.body.role == "file");
client.assert(response.body.mime == "plain/text");
client.assert(response.body.title == "my attachment");
%}

View File

@@ -1,52 +0,0 @@
POST {{triliumHost}}/etapi/create-note
Authorization: {{authToken}}
Content-Type: application/json
{
"parentNoteId": "root",
"title": "Hello",
"type": "text",
"content": "Hi there!"
}
> {% client.global.set("createdNoteId", response.body.note.noteId); %}
###
POST {{triliumHost}}/etapi/attachments
Authorization: {{authToken}}
Content-Type: application/json
{
"ownerId": "{{createdNoteId}}",
"role": "file",
"mime": "text/plain",
"title": "my attachment",
"content": "text"
}
> {% client.global.set("createdAttachmentId", response.body.attachmentId); %}
###
DELETE {{triliumHost}}/etapi/attachments/{{createdAttachmentId}}
Authorization: {{authToken}}
> {% client.assert(response.status === 204, "Response status is not 204"); %}
### repeat the DELETE request to test the idempotency
DELETE {{triliumHost}}/etapi/attachments/{{createdAttachmentId}}
Authorization: {{authToken}}
> {% client.assert(response.status === 204, "Response status is not 204"); %}
###
GET {{triliumHost}}/etapi/attachments/{{createdAttachmentId}}
Authorization: {{authToken}}
> {%
client.assert(response.status === 404, "Response status is not 404");
client.assert(response.body.code === "ATTACHMENT_NOT_FOUND");
%}

View File

@@ -1,52 +0,0 @@
POST {{triliumHost}}/etapi/create-note
Authorization: {{authToken}}
Content-Type: application/json
{
"parentNoteId": "root",
"title": "Hello",
"type": "text",
"content": "Hi there!"
}
> {% client.global.set("createdNoteId", response.body.note.noteId); %}
###
POST {{triliumHost}}/etapi/attributes
Authorization: {{authToken}}
Content-Type: application/json
{
"noteId": "{{createdNoteId}}",
"type": "label",
"name": "mylabel",
"value": "val",
"isInheritable": true
}
> {% client.global.set("createdAttributeId", response.body.attributeId); %}
###
DELETE {{triliumHost}}/etapi/attributes/{{createdAttributeId}}
Authorization: {{authToken}}
> {% client.assert(response.status === 204, "Response status is not 204"); %}
### repeat the DELETE request to test the idempotency
DELETE {{triliumHost}}/etapi/attributes/{{createdAttributeId}}
Authorization: {{authToken}}
> {% client.assert(response.status === 204, "Response status is not 204"); %}
###
GET {{triliumHost}}/etapi/attributes/{{createdAttributeId}}
Authorization: {{authToken}}
> {%
client.assert(response.status === 404, "Response status is not 404");
client.assert(response.body.code === "ATTRIBUTE_NOT_FOUND");
%}

View File

@@ -1,87 +0,0 @@
POST {{triliumHost}}/etapi/create-note
Authorization: {{authToken}}
Content-Type: application/json
{
"parentNoteId": "root",
"title": "Hello",
"type": "text",
"content": "Hi there!"
}
> {%
client.global.set("createdNoteId", response.body.note.noteId);
client.global.set("createdBranchId", response.body.branch.branchId);
%}
### Clone to another location
POST {{triliumHost}}/etapi/branches
Authorization: {{authToken}}
Content-Type: application/json
{
"noteId": "{{createdNoteId}}",
"parentNoteId": "_hidden"
}
> {% client.global.set("clonedBranchId", response.body.branchId); %}
###
GET {{triliumHost}}/etapi/notes/{{createdNoteId}}
Authorization: {{authToken}}
> {% client.assert(response.status === 200); %}
###
GET {{triliumHost}}/etapi/branches/{{createdBranchId}}
Authorization: {{authToken}}
> {% client.assert(response.status === 200); %}
###
GET {{triliumHost}}/etapi/branches/{{clonedBranchId}}
Authorization: {{authToken}}
> {% client.assert(response.status === 200); %}
###
DELETE {{triliumHost}}/etapi/branches/{{createdBranchId}}
Authorization: {{authToken}}
> {% client.assert(response.status === 204, "Response status is not 204"); %}
### repeat the DELETE request to test the idempotency
DELETE {{triliumHost}}/etapi/branches/{{createdBranchId}}
Authorization: {{authToken}}
> {% client.assert(response.status === 204, "Response status is not 204"); %}
###
GET {{triliumHost}}/etapi/branches/{{createdBranchId}}
Authorization: {{authToken}}
> {%
client.assert(response.status === 404, "Response status is not 404");
client.assert(response.body.code === "BRANCH_NOT_FOUND");
%}
###
GET {{triliumHost}}/etapi/branches/{{clonedBranchId}}
Authorization: {{authToken}}
> {% client.assert(response.status === 200); %}
###
GET {{triliumHost}}/etapi/notes/{{createdNoteId}}
Authorization: {{authToken}}
> {% client.assert(response.status === 200); %}

View File

@@ -1,126 +0,0 @@
POST {{triliumHost}}/etapi/create-note
Authorization: {{authToken}}
Content-Type: application/json
{
"parentNoteId": "root",
"title": "Hello",
"type": "text",
"content": "Hi there!"
}
> {%
client.global.set("createdNoteId", response.body.note.noteId);
client.global.set("createdBranchId", response.body.branch.branchId);
%}
###
POST {{triliumHost}}/etapi/attributes
Authorization: {{authToken}}
Content-Type: application/json
{
"noteId": "{{createdNoteId}}",
"type": "label",
"name": "mylabel",
"value": "val",
"isInheritable": true
}
> {% client.global.set("createdAttributeId", response.body.attributeId); %}
### Clone to another location
POST {{triliumHost}}/etapi/branches
Authorization: {{authToken}}
Content-Type: application/json
{
"noteId": "{{createdNoteId}}",
"parentNoteId": "_hidden"
}
> {% client.global.set("clonedBranchId", response.body.branchId); %}
###
GET {{triliumHost}}/etapi/notes/{{createdNoteId}}
Authorization: {{authToken}}
> {% client.assert(response.status === 200); %}
###
GET {{triliumHost}}/etapi/branches/{{createdBranchId}}
Authorization: {{authToken}}
> {% client.assert(response.status === 200); %}
###
GET {{triliumHost}}/etapi/branches/{{clonedBranchId}}
Authorization: {{authToken}}
> {% client.assert(response.status === 200); %}
###
GET {{triliumHost}}/etapi/attributes/{{createdAttributeId}}
Authorization: {{authToken}}
> {% client.assert(response.status === 200); %}
###
DELETE {{triliumHost}}/etapi/notes/{{createdNoteId}}
Authorization: {{authToken}}
> {% client.assert(response.status === 204, "Response status is not 204"); %}
### repeat the DELETE request to test the idempotency
DELETE {{triliumHost}}/etapi/notes/{{createdNoteId}}
Authorization: {{authToken}}
> {% client.assert(response.status === 204, "Response status is not 204"); %}
###
GET {{triliumHost}}/etapi/branches/{{createdBranchId}}
Authorization: {{authToken}}
> {%
client.assert(response.status === 404, "Response status is not 404");
client.assert(response.body.code === "BRANCH_NOT_FOUND");
%}
###
GET {{triliumHost}}/etapi/branches/{{clonedBranchId}}
Authorization: {{authToken}}
> {%
client.assert(response.status === 404, "Response status is not 404");
client.assert(response.body.code == "BRANCH_NOT_FOUND");
%}
###
GET {{triliumHost}}/etapi/notes/{{createdNoteId}}
Authorization: {{authToken}}
> {%
client.assert(response.status === 404, "Response status is not 404");
client.assert(response.body.code === "NOTE_NOT_FOUND");
%}
###
GET {{triliumHost}}/etapi/attributes/{{createdAttributeId}}
Authorization: {{authToken}}
> {%
client.assert(response.status === 404, "Response status is not 404");
client.assert(response.body.code === "ATTRIBUTE_NOT_FOUND");
%}

View File

@@ -1,37 +0,0 @@
GET {{triliumHost}}/etapi/notes/root/export
Authorization: {{authToken}}
> {%
client.assert(response.status === 200);
client.assert(response.headers.valueOf("Content-Type") == "application/zip");
%}
###
GET {{triliumHost}}/etapi/notes/root/export?format=html
Authorization: {{authToken}}
> {%
client.assert(response.status === 200);
client.assert(response.headers.valueOf("Content-Type") == "application/zip");
%}
###
GET {{triliumHost}}/etapi/notes/root/export?format=markdown
Authorization: {{authToken}}
> {%
client.assert(response.status === 200);
client.assert(response.headers.valueOf("Content-Type") == "application/zip");
%}
###
GET {{triliumHost}}/etapi/notes/root/export?format=wrong
Authorization: {{authToken}}
> {%
client.assert(response.status === 400);
client.assert(response.body.code === "UNRECOGNIZED_EXPORT_FORMAT");
%}

View File

@@ -1,72 +0,0 @@
GET {{triliumHost}}/etapi/inbox/2022-01-01
Authorization: {{authToken}}
> {% client.assert(response.status === 200); %}
###
GET {{triliumHost}}/etapi/calendar/days/2022-01-01
Authorization: {{authToken}}
> {% client.assert(response.status === 200); %}
###
GET {{triliumHost}}/etapi/calendar/days/2022-1
Authorization: {{authToken}}
> {%
client.assert(response.status === 400);
client.assert(response.body.code === "DATE_INVALID");
%}
###
GET {{triliumHost}}/etapi/calendar/weeks/2022-01-01
Authorization: {{authToken}}
> {% client.assert(response.status === 200); %}
###
GET {{triliumHost}}/etapi/calendar/weeks/2022-1
Authorization: {{authToken}}
> {%
client.assert(response.status === 400);
client.assert(response.body.code === "DATE_INVALID");
%}
###
GET {{triliumHost}}/etapi/calendar/months/2022-01
Authorization: {{authToken}}
> {% client.assert(response.status === 200); %}
###
GET {{triliumHost}}/etapi/calendar/months/2022-1
Authorization: {{authToken}}
> {%
client.assert(response.status === 400);
client.assert(response.body.code === "MONTH_INVALID");
%}
###
GET {{triliumHost}}/etapi/calendar/years/2022
Authorization: {{authToken}}
> {% client.assert(response.status === 200); %}
###
GET {{triliumHost}}/etapi/calendar/years/202
Authorization: {{authToken}}
> {%
client.assert(response.status === 400);
client.assert(response.body.code === "YEAR_INVALID");
%}

View File

@@ -1,116 +0,0 @@
POST {{triliumHost}}/etapi/create-note
Authorization: {{authToken}}
Content-Type: application/json
{
"parentNoteId": "root",
"title": "Hello parent",
"type": "text",
"content": "Hi there!"
}
> {%
client.assert(response.status === 201);
client.global.set("parentNoteId", response.body.note.noteId);
client.global.set("parentBranchId", response.body.branch.branchId);
%}
### Create inheritable parent attribute
POST {{triliumHost}}/etapi/attributes
Authorization: {{authToken}}
Content-Type: application/json
{
"noteId": "{{parentNoteId}}",
"type": "label",
"name": "mylabel",
"value": "",
"isInheritable": true,
"position": 10
}
> {%
client.assert(response.status === 201);
client.global.set("parentAttributeId", response.body.attributeId);
%}
### Create child note under root
POST {{triliumHost}}/etapi/create-note
Authorization: {{authToken}}
Content-Type: application/json
{
"parentNoteId": "root",
"title": "Hello child",
"type": "text",
"content": "Hi there!"
}
> {%
client.assert(response.status === 201);
client.global.set("childNoteId", response.body.note.noteId);
client.global.set("childBranchId", response.body.branch.branchId);
%}
### Create child attribute
POST {{triliumHost}}/etapi/attributes
Authorization: {{authToken}}
Content-Type: application/json
{
"noteId": "{{childNoteId}}",
"type": "label",
"name": "mylabel",
"value": "val",
"isInheritable": false,
"position": 10
}
> {%
client.assert(response.status === 201);
client.global.set("childAttributeId", response.body.attributeId);
%}
### Clone child to parent
POST {{triliumHost}}/etapi/branches
Authorization: {{authToken}}
Content-Type: application/json
{
"noteId": "{{childNoteId}}",
"parentNoteId": "{{parentNoteId}}"
}
> {%
client.assert(response.status === 201);
client.assert(response.body.parentNoteId == client.global.get("parentNoteId"));
%}
###
GET {{triliumHost}}/etapi/notes/{{childNoteId}}
Authorization: {{authToken}}
> {%
function hasAttribute(list, attributeId) {
for (let i = 0; i < list.length; i++) {
if (list[i]["attributeId"] === attributeId) {
return true;
}
}
return false;
}
client.log(JSON.stringify(response.body.attributes));
client.assert(response.status === 200);
client.assert(response.body.noteId == client.global.get("childNoteId"));
client.assert(response.body.attributes.length == 2);
client.assert(hasAttribute(response.body.attributes, client.global.get("parentAttributeId")));
client.assert(hasAttribute(response.body.attributes, client.global.get("childAttributeId")));
%}

View File

@@ -1,61 +0,0 @@
POST {{triliumHost}}/etapi/create-note
Authorization: {{authToken}}
Content-Type: application/json
{
"parentNoteId": "root",
"title": "GetInheritedAttributes Test Note",
"type": "text",
"content": "Hi there!"
}
> {%
client.assert(response.status === 201);
client.global.set("parentNoteId", response.body.note.noteId);
%}
###
POST {{triliumHost}}/etapi/attributes
Authorization: {{authToken}}
Content-Type: application/json
{
"noteId": "{{parentNoteId}}",
"type": "label",
"name": "mylabel",
"value": "val",
"isInheritable": true
}
> {% client.global.set("createdAttributeId", response.body.attributeId); %}
###
POST {{triliumHost}}/etapi/create-note
Authorization: {{authToken}}
Content-Type: application/json
{
"parentNoteId": "{{parentNoteId}}",
"title": "Hello",
"type": "text",
"content": "Hi there!"
}
> {%
client.global.set("createdNoteId", response.body.note.noteId);
client.global.set("createdBranchId", response.body.branch.branchId);
%}
###
GET {{triliumHost}}/etapi/notes/{{createdNoteId}}
Authorization: {{authToken}}
> {%
client.assert(response.status === 200);
client.assert(response.body.noteId == client.global.get("createdNoteId"));
client.assert(response.body.attributes.length == 1);
client.assert(response.body.attributes[0].attributeId == client.global.get("createdAttributeId"));
%}

View File

@@ -1,25 +0,0 @@
POST {{triliumHost}}/etapi/create-note
Authorization: {{authToken}}
Content-Type: application/json
{
"parentNoteId": "root",
"title": "Hello",
"type": "text",
"content": "Hi there!"
}
> {%
client.global.set("createdNoteId", response.body.note.noteId);
client.global.set("createdBranchId", response.body.branch.branchId);
%}
###
GET {{triliumHost}}/etapi/notes/{{createdNoteId}}/content
Authorization: {{authToken}}
> {%
client.assert(response.status === 200);
client.assert(response.body === "Hi there!");
%}

View File

@@ -1,5 +0,0 @@
{
"dev": {
"triliumHost": "http://localhost:37740"
}
}

View File

@@ -1,12 +0,0 @@
POST {{triliumHost}}/etapi/notes/root/import
Authorization: {{authToken}}
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
< ../db/demo.zip
> {%
client.assert(response.status === 201);
client.assert(response.body.note.title == "Trilium Demo");
client.assert(response.body.branch.parentNoteId == "root");
%}

View File

@@ -1,34 +0,0 @@
POST {{triliumHost}}/etapi/auth/login
Content-Type: application/json
{
"password": "1234"
}
> {%
client.assert(response.status === 201);
client.global.set("testAuthToken", response.body.authToken);
%}
###
GET {{triliumHost}}/etapi/notes/root
Authorization: {{testAuthToken}}
> {% client.assert(response.status === 200); %}
###
POST {{triliumHost}}/etapi/auth/logout
Authorization: {{testAuthToken}}
Content-Type: application/json
> {% client.assert(response.status === 204); %}
###
GET {{triliumHost}}/etapi/notes/root
Authorization: {{testAuthToken}}
> {% client.assert(response.status === 401); %}

View File

@@ -1,82 +0,0 @@
### Test ETAPI metrics endpoint
# First login to get a token
POST {{triliumHost}}/etapi/auth/login
Content-Type: application/json
{
"password": "{{password}}"
}
> {%
client.test("Login successful", function() {
client.assert(response.status === 201, "Response status is not 201");
client.assert(response.body.authToken, "Auth token not present");
client.global.set("authToken", response.body.authToken);
});
%}
### Get metrics with authentication (default Prometheus format)
GET {{triliumHost}}/etapi/metrics
Authorization: {{authToken}}
> {%
client.test("Metrics endpoint returns Prometheus format by default", function() {
client.assert(response.status === 200, "Response status is not 200");
client.assert(response.headers["content-type"].includes("text/plain"), "Content-Type should be text/plain");
client.assert(response.body.includes("trilium_info"), "Should contain trilium_info metric");
client.assert(response.body.includes("trilium_notes_total"), "Should contain trilium_notes_total metric");
client.assert(response.body.includes("# HELP"), "Should contain HELP comments");
client.assert(response.body.includes("# TYPE"), "Should contain TYPE comments");
});
%}
### Get metrics in JSON format
GET {{triliumHost}}/etapi/metrics?format=json
Authorization: {{authToken}}
> {%
client.test("Metrics endpoint returns JSON when requested", function() {
client.assert(response.status === 200, "Response status is not 200");
client.assert(response.headers["content-type"].includes("application/json"), "Content-Type should be application/json");
client.assert(response.body.version, "Version info not present");
client.assert(response.body.database, "Database info not present");
client.assert(response.body.timestamp, "Timestamp not present");
client.assert(typeof response.body.database.totalNotes === 'number', "Total notes should be a number");
client.assert(typeof response.body.database.activeNotes === 'number', "Active notes should be a number");
});
%}
### Get metrics in Prometheus format explicitly
GET {{triliumHost}}/etapi/metrics?format=prometheus
Authorization: {{authToken}}
> {%
client.test("Metrics endpoint returns Prometheus format when requested", function() {
client.assert(response.status === 200, "Response status is not 200");
client.assert(response.headers["content-type"].includes("text/plain"), "Content-Type should be text/plain");
client.assert(response.body.includes("trilium_info"), "Should contain trilium_info metric");
client.assert(response.body.includes("trilium_notes_total"), "Should contain trilium_notes_total metric");
});
%}
### Test invalid format parameter
GET {{triliumHost}}/etapi/metrics?format=xml
Authorization: {{authToken}}
> {%
client.test("Invalid format parameter returns error", function() {
client.assert(response.status === 400, "Response status should be 400");
client.assert(response.body.code === "INVALID_FORMAT", "Error code should be INVALID_FORMAT");
client.assert(response.body.message.includes("prometheus"), "Error message should mention supported formats");
});
%}
### Test without authentication (should fail)
GET {{triliumHost}}/etapi/metrics
> {%
client.test("Metrics endpoint requires authentication", function() {
client.assert(response.status === 401, "Response status should be 401");
});
%}

View File

@@ -1,109 +0,0 @@
GET {{triliumHost}}/etapi/notes?search=aaa
> {% client.assert(response.status === 401); %}
###
GET {{triliumHost}}/etapi/notes/root
> {% client.assert(response.status === 401); %}
###
PATCH {{triliumHost}}/etapi/notes/root
Authorization: fakeauth
> {% client.assert(response.status === 401); %}
###
DELETE {{triliumHost}}/etapi/notes/root
Authorization: fakeauth
> {% client.assert(response.status === 401); %}
###
GET {{triliumHost}}/etapi/branches/root
Authorization: fakeauth
> {% client.assert(response.status === 401); %}
###
PATCH {{triliumHost}}/etapi/branches/root
> {% client.assert(response.status === 401); %}
###
DELETE {{triliumHost}}/etapi/branches/root
> {% client.assert(response.status === 401); %}
###
GET {{triliumHost}}/etapi/attributes/000
> {% client.assert(response.status === 401); %}
###
PATCH {{triliumHost}}/etapi/attributes/000
> {% client.assert(response.status === 401); %}
###
DELETE {{triliumHost}}/etapi/attributes/000
> {% client.assert(response.status === 401); %}
###
GET {{triliumHost}}/etapi/inbox/2022-02-22
> {% client.assert(response.status === 401); %}
###
GET {{triliumHost}}/etapi/calendar/days/2022-02-22
Authorization: fakeauth
> {% client.assert(response.status === 401); %}
###
GET {{triliumHost}}/etapi/calendar/weeks/2022-02-22
> {% client.assert(response.status === 401); %}
###
GET {{triliumHost}}/etapi/calendar/months/2022-02
> {% client.assert(response.status === 401); %}
###
GET {{triliumHost}}/etapi/calendar/years/2022
> {% client.assert(response.status === 401); %}
###
POST {{triliumHost}}/etapi/create-note
> {% client.assert(response.status === 401); %}
###
GET {{triliumHost}}/etapi/app-info
> {% client.assert(response.status === 401); %}
### Fake URL will get a 404 even without token
GET {{triliumHost}}/etapi/zzzzzz
> {% client.assert(response.status === 404); %}

View File

@@ -1,4 +0,0 @@
POST {{triliumHost}}/etapi/refresh-note-ordering/root
Authorization: {{authToken}}
> {% client.assert(response.status === 200); %}

View File

@@ -1,79 +0,0 @@
POST {{triliumHost}}/etapi/create-note
Authorization: {{authToken}}
Content-Type: application/json
{
"parentNoteId": "root",
"title": "Hello",
"type": "text",
"content": "Hi there!"
}
> {% client.global.set("createdNoteId", response.body.note.noteId); %}
###
POST {{triliumHost}}/etapi/attachments
Authorization: {{authToken}}
Content-Type: application/json
{
"ownerId": "{{createdNoteId}}",
"role": "file",
"mime": "text/plain",
"title": "my attachment",
"content": "text"
}
> {% client.global.set("createdAttachmentId", response.body.attachmentId); %}
###
PATCH {{triliumHost}}/etapi/attachments/{{createdAttachmentId}}
Authorization: {{authToken}}
Content-Type: application/json
{
"title": "CHANGED",
"position": 999
}
###
GET {{triliumHost}}/etapi/attachments/{{createdAttachmentId}}
Authorization: {{authToken}}
> {%
client.assert(response.body.title === "CHANGED");
client.assert(response.body.position === 999);
%}
###
PATCH {{triliumHost}}/etapi/attachments/{{createdAttachmentId}}
Authorization: {{authToken}}
Content-Type: application/json
{
"ownerId": "root"
}
> {%
client.assert(response.status === 400);
client.assert(response.body.code == "PROPERTY_NOT_ALLOWED");
%}
###
PATCH {{triliumHost}}/etapi/attachments/{{createdAttachmentId}}
Authorization: {{authToken}}
Content-Type: application/json
{
"title": null
}
> {%
client.assert(response.status === 400);
client.assert(response.body.code == "PROPERTY_VALIDATION_ERROR");
%}

View File

@@ -1,80 +0,0 @@
POST {{triliumHost}}/etapi/create-note
Authorization: {{authToken}}
Content-Type: application/json
{
"parentNoteId": "root",
"title": "Hello",
"type": "text",
"content": "Hi there!"
}
> {%
client.global.set("createdNoteId", response.body.note.noteId);
client.global.set("createdBranchId", response.body.branch.branchId);
%}
###
POST {{triliumHost}}/etapi/attributes
Authorization: {{authToken}}
Content-Type: application/json
{
"noteId": "{{createdNoteId}}",
"type": "label",
"name": "mylabel",
"value": "val",
"isInheritable": true
}
> {% client.global.set("createdAttributeId", response.body.attributeId); %}
###
PATCH {{triliumHost}}/etapi/attributes/{{createdAttributeId}}
Authorization: {{authToken}}
Content-Type: application/json
{
"value": "CHANGED"
}
###
GET {{triliumHost}}/etapi/attributes/{{createdAttributeId}}
Authorization: {{authToken}}
> {%
client.assert(response.body.value === "CHANGED");
%}
###
PATCH {{triliumHost}}/etapi/attributes/{{createdAttributeId}}
Authorization: {{authToken}}
Content-Type: application/json
{
"noteId": "root"
}
> {%
client.assert(response.status === 400);
client.assert(response.body.code == "PROPERTY_NOT_ALLOWED");
%}
###
PATCH {{triliumHost}}/etapi/attributes/{{createdAttributeId}}
Authorization: {{authToken}}
Content-Type: application/json
{
"value": null
}
> {%
client.assert(response.status === 400);
client.assert(response.body.code == "PROPERTY_VALIDATION_ERROR");
%}

View File

@@ -1,66 +0,0 @@
POST {{triliumHost}}/etapi/create-note
Authorization: {{authToken}}
Content-Type: application/json
{
"parentNoteId": "root",
"type": "text",
"title": "Hello",
"content": ""
}
> {% client.global.set("createdBranchId", response.body.branch.branchId); %}
###
PATCH {{triliumHost}}/etapi/branches/{{createdBranchId}}
Authorization: {{authToken}}
Content-Type: application/json
{
"prefix": "pref",
"notePosition": 666,
"isExpanded": true
}
###
GET {{triliumHost}}/etapi/branches/{{createdBranchId}}
Authorization: {{authToken}}
> {%
client.assert(response.status === 200);
client.assert(response.body.prefix === 'pref');
client.assert(response.body.notePosition === 666);
client.assert(response.body.isExpanded === true);
%}
###
PATCH {{triliumHost}}/etapi/branches/{{createdBranchId}}
Authorization: {{authToken}}
Content-Type: application/json
{
"parentNoteId": "root"
}
> {%
client.assert(response.status === 400);
client.assert(response.body.code == "PROPERTY_NOT_ALLOWED");
%}
###
PATCH {{triliumHost}}/etapi/branches/{{createdBranchId}}
Authorization: {{authToken}}
Content-Type: application/json
{
"prefix": 123
}
> {%
client.assert(response.status === 400);
client.assert(response.body.code == "PROPERTY_VALIDATION_ERROR");
%}

View File

@@ -1,83 +0,0 @@
POST {{triliumHost}}/etapi/create-note
Authorization: {{authToken}}
Content-Type: application/json
{
"parentNoteId": "root",
"title": "Hello",
"type": "code",
"mime": "application/json",
"content": "{}"
}
> {% client.global.set("createdNoteId", response.body.note.noteId); %}
###
GET {{triliumHost}}/etapi/notes/{{createdNoteId}}
Authorization: {{authToken}}
> {%
client.assert(response.status === 200);
client.assert(response.body.title === 'Hello');
client.assert(response.body.type === 'code');
client.assert(response.body.mime === 'application/json');
%}
###
PATCH {{triliumHost}}/etapi/notes/{{createdNoteId}}
Authorization: {{authToken}}
Content-Type: application/json
{
"title": "Wassup",
"type": "html",
"mime": "text/html",
"dateCreated": "2023-08-21 23:38:51.123+0200",
"utcDateCreated": "2023-08-21 23:38:51.123Z"
}
###
GET {{triliumHost}}/etapi/notes/{{createdNoteId}}
Authorization: {{authToken}}
> {%
client.assert(response.status === 200);
client.assert(response.body.title === 'Wassup');
client.assert(response.body.type === 'html');
client.assert(response.body.mime === 'text/html');
client.assert(response.body.dateCreated == "2023-08-21 23:38:51.123+0200");
client.assert(response.body.utcDateCreated == "2023-08-21 23:38:51.123Z");
%}
###
PATCH {{triliumHost}}/etapi/notes/{{createdNoteId}}
Authorization: {{authToken}}
Content-Type: application/json
{
"isProtected": true
}
> {%
client.assert(response.status === 400);
client.assert(response.body.code == "PROPERTY_NOT_ALLOWED");
%}
###
PATCH {{triliumHost}}/etapi/notes/{{createdNoteId}}
Authorization: {{authToken}}
Content-Type: application/json
{
"title": true
}
> {%
client.assert(response.status === 400);
client.assert(response.body.code == "PROPERTY_VALIDATION_ERROR");
%}

View File

@@ -1,23 +0,0 @@
POST {{triliumHost}}/etapi/create-note
Authorization: {{authToken}}
Content-Type: application/json
{
"parentNoteId": "root",
"title": "Hello",
"type": "code",
"mime": "text/plain",
"content": "Hi there!"
}
> {% client.global.set("createdNoteId", response.body.note.noteId); %}
###
POST {{triliumHost}}/etapi/notes/{{createdNoteId}}/revision
Authorization: {{authToken}}
Content-Type: text/plain
Changed content
> {% client.assert(response.status === 204); %}

View File

@@ -1,39 +0,0 @@
POST {{triliumHost}}/etapi/create-note
Authorization: {{authToken}}
Content-Type: application/json
{
"parentNoteId": "root",
"title": "Hello",
"type": "text",
"content": "Hi there!"
}
> {% client.global.set("createdNoteId", response.body.note.noteId); %}
###
POST {{triliumHost}}/etapi/attachments
Authorization: {{authToken}}
Content-Type: application/json
{
"ownerId": "{{createdNoteId}}",
"role": "file",
"mime": "text/plain",
"title": "my attachment",
"content": "text"
}
> {% client.global.set("createdAttachmentId", response.body.attachmentId); %}
###
PUT {{triliumHost}}/etapi/attachments/{{createdAttachmentId}}/content
Authorization: {{authToken}}
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
< ../images/icon-color.png
> {% client.assert(response.status === 204); %}

View File

@@ -1,45 +0,0 @@
POST {{triliumHost}}/etapi/create-note
Authorization: {{authToken}}
Content-Type: application/json
{
"parentNoteId": "root",
"title": "Hello",
"type": "text",
"content": "Hi there!"
}
> {% client.global.set("createdNoteId", response.body.note.noteId); %}
###
POST {{triliumHost}}/etapi/attachments
Authorization: {{authToken}}
Content-Type: application/json
{
"ownerId": "{{createdNoteId}}",
"role": "file",
"mime": "text/plain",
"title": "my attachment",
"content": "text"
}
> {% client.global.set("createdAttachmentId", response.body.attachmentId); %}
###
PUT {{triliumHost}}/etapi/attachments/{{createdAttachmentId}}/content
Authorization: {{authToken}}
Content-Type: text/plain
Changed content
> {% client.assert(response.status === 204); %}
###
GET {{triliumHost}}/etapi/attachments/{{createdAttachmentId}}/content
Authorization: {{authToken}}
> {% client.assert(response.body === "Changed content"); %}

View File

@@ -1,25 +0,0 @@
POST {{triliumHost}}/etapi/create-note
Authorization: {{authToken}}
Content-Type: application/json
{
"parentNoteId": "root",
"title": "Hello",
"type": "image",
"mime": "image/png",
"content": ""
}
> {% client.global.set("createdNoteId", response.body.note.noteId); %}
###
PUT {{triliumHost}}/etapi/notes/{{createdNoteId}}/content
Authorization: {{authToken}}
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
< ../images/icon-color.png
> {% client.assert(response.status === 204); %}

View File

@@ -1,30 +0,0 @@
POST {{triliumHost}}/etapi/create-note
Authorization: {{authToken}}
Content-Type: application/json
{
"parentNoteId": "root",
"title": "Hello",
"type": "code",
"mime": "text/plain",
"content": "Hi there!"
}
> {% client.global.set("createdNoteId", response.body.note.noteId); %}
###
PUT {{triliumHost}}/etapi/notes/{{createdNoteId}}/content
Authorization: {{authToken}}
Content-Type: text/plain
Changed content
> {% client.assert(response.status === 204); %}
###
GET {{triliumHost}}/etapi/notes/{{createdNoteId}}/content
Authorization: {{authToken}}
> {% client.assert(response.body === "Changed content"); %}

View File

@@ -1,39 +0,0 @@
POST {{triliumHost}}/etapi/create-note
Authorization: {{authToken}}
Content-Type: application/json
{
"parentNoteId": "root",
"title": "title",
"type": "text",
"content": "{{$uuid}}"
}
> {% client.global.set("createdNoteId", response.body.note.noteId); %}
###
GET {{triliumHost}}/etapi/notes/{{createdNoteId}}/content
Authorization: {{authToken}}
> {% client.global.set("content", response.body); %}
###
GET {{triliumHost}}/etapi/notes?search={{content}}&debug=true
Authorization: {{authToken}}
> {%
client.assert(response.status === 200);
client.assert(response.body.results.length === 1);
%}
### Same but with fast search which doesn't look in the content so 0 notes should be found
GET {{triliumHost}}/etapi/notes?search={{content}}&fastSearch=true
Authorization: {{authToken}}
> {%
client.assert(response.status === 200);
client.assert(response.body.results.length === 0);
%}

4
apps/client/.env Normal file
View File

@@ -0,0 +1,4 @@
# The development license key for premium CKEditor features.
# Note: This key must only be used for the Trilium Notes project.
# Expires on: 2025-09-13
VITE_CKEDITOR_KEY=eyJhbGciOiJFUzI1NiJ9.eyJleHAiOjE3NTc3MjE1OTksImp0aSI6ImFiN2E0NjZmLWJlZGMtNDNiYy1iMzU4LTk0NGQ0YWJhY2I3ZiIsImRpc3RyaWJ1dGlvbkNoYW5uZWwiOlsic2giLCJkcnVwYWwiXSwid2hpdGVMYWJlbCI6dHJ1ZSwiZmVhdHVyZXMiOlsiRFJVUCIsIkNNVCIsIkRPIiwiRlAiLCJTQyIsIlRPQyIsIlRQTCIsIlBPRSIsIkNDIiwiTUYiLCJTRUUiLCJFQ0giLCJFSVMiXSwidmMiOiI1MzlkOWY5YyJ9.2rvKPql4hmukyXhEtWPZ8MLxKvzPIwzCdykO653g7IxRRZy2QJpeRszElZx9DakKYZKXekVRAwQKgHxwkgbE_w

View File

@@ -0,0 +1 @@
VITE_CKEDITOR_ENABLE_INSPECTOR=false

View File

@@ -1,16 +1,16 @@
{
"name": "@triliumnext/client",
"version": "0.94.0",
"version": "0.96.0",
"description": "JQuery-based client for TriliumNext, used for both web and desktop (via Electron)",
"private": true,
"license": "AGPL-3.0-only",
"author": {
"name": "TriliumNext Notes Team",
"name": "Trilium Notes Team",
"email": "contact@eliandoran.me",
"url": "https://github.com/TriliumNext/Notes"
},
"dependencies": {
"@eslint/js": "9.27.0",
"@eslint/js": "9.29.0",
"@excalidraw/excalidraw": "0.18.0",
"@fullcalendar/core": "6.1.17",
"@fullcalendar/daygrid": "6.1.17",
@@ -18,15 +18,16 @@
"@fullcalendar/list": "6.1.17",
"@fullcalendar/multimonth": "6.1.17",
"@fullcalendar/timegrid": "6.1.17",
"@mermaid-js/layout-elk": "0.1.7",
"@mermaid-js/layout-elk": "0.1.8",
"@mind-elixir/node-menu": "1.0.5",
"@popperjs/core": "2.11.8",
"@triliumnext/ckeditor5": "workspace:*",
"@triliumnext/codemirror": "workspace:*",
"@triliumnext/commons": "workspace:*",
"@triliumnext/highlightjs": "workspace:*",
"@triliumnext/share-theme": "workspace:*",
"autocomplete.js": "0.38.1",
"bootstrap": "5.3.6",
"bootstrap": "5.3.7",
"boxicons": "2.1.4",
"dayjs": "1.11.13",
"dayjs-plugin-utc": "0.1.2",
@@ -46,12 +47,11 @@
"leaflet-gpx": "2.2.0",
"mark.js": "8.11.1",
"marked": "15.0.12",
"mermaid": "11.6.0",
"mind-elixir": "4.6.0",
"mermaid": "11.7.0",
"mind-elixir": "4.6.1",
"normalize.css": "8.0.1",
"panzoom": "9.4.3",
"react": "19.1.0",
"react-dom": "19.1.0",
"preact": "10.26.9",
"split.js": "1.6.5",
"svg-pan-zoom": "3.6.2",
"vanilla-js-wheel-zoom": "9.0.4"
@@ -60,17 +60,25 @@
"@ckeditor/ckeditor5-inspector": "4.1.0",
"@types/bootstrap": "5.2.10",
"@types/jquery": "3.5.32",
"@types/leaflet": "1.9.18",
"@types/leaflet": "1.9.19",
"@types/leaflet-gpx": "1.3.7",
"@types/mark.js": "8.11.12",
"@types/react": "19.1.6",
"@types/react-dom": "19.1.5",
"copy-webpack-plugin": "13.0.0",
"happy-dom": "17.5.6",
"happy-dom": "18.0.1",
"script-loader": "0.7.2",
"vite-plugin-static-copy": "3.0.0"
"vite-plugin-static-copy": "3.1.0"
},
"nx": {
"name": "client"
"name": "client",
"targets": {
"serve": {
"dependsOn": [
"^build"
]
},
"circular-deps": {
"command": "pnpx dpdm -T {projectRoot}/src/**/*.ts --tree=false --warning=false --skip-dynamic-imports=circular"
}
}
}
}

View File

@@ -1,424 +0,0 @@
/*
* Remove template code below
*/
html {
-webkit-text-size-adjust: 100%;
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif,
'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',
'Noto Color Emoji';
line-height: 1.5;
tab-size: 4;
scroll-behavior: smooth;
}
body {
font-family: inherit;
line-height: inherit;
margin: 0;
}
h1,
h2,
p,
pre {
margin: 0;
}
*,
::before,
::after {
box-sizing: border-box;
border-width: 0;
border-style: solid;
border-color: currentColor;
}
h1,
h2 {
font-size: inherit;
font-weight: inherit;
}
a {
color: inherit;
text-decoration: inherit;
}
pre {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
'Liberation Mono', 'Courier New', monospace;
}
svg {
display: block;
vertical-align: middle;
}
svg {
shape-rendering: auto;
text-rendering: optimizeLegibility;
}
pre {
background-color: rgba(55, 65, 81, 1);
border-radius: 0.25rem;
color: rgba(229, 231, 235, 1);
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
'Liberation Mono', 'Courier New', monospace;
overflow: scroll;
padding: 0.5rem 0.75rem;
}
.shadow {
box-shadow: 0 0 #0000, 0 0 #0000, 0 10px 15px -3px rgba(0, 0, 0, 0.1),
0 4px 6px -2px rgba(0, 0, 0, 0.05);
}
.rounded {
border-radius: 1.5rem;
}
.wrapper {
width: 100%;
}
.container {
margin-left: auto;
margin-right: auto;
max-width: 768px;
padding-bottom: 3rem;
padding-left: 1rem;
padding-right: 1rem;
color: rgba(55, 65, 81, 1);
width: 100%;
}
#welcome {
margin-top: 2.5rem;
}
#welcome h1 {
font-size: 3rem;
font-weight: 500;
letter-spacing: -0.025em;
line-height: 1;
}
#welcome span {
display: block;
font-size: 1.875rem;
font-weight: 300;
line-height: 2.25rem;
margin-bottom: 0.5rem;
}
#hero {
align-items: center;
background-color: hsla(214, 62%, 21%, 1);
border: none;
box-sizing: border-box;
color: rgba(55, 65, 81, 1);
display: grid;
grid-template-columns: 1fr;
margin-top: 3.5rem;
}
#hero .text-container {
color: rgba(255, 255, 255, 1);
padding: 3rem 2rem;
}
#hero .text-container h2 {
font-size: 1.5rem;
line-height: 2rem;
position: relative;
}
#hero .text-container h2 svg {
color: hsla(162, 47%, 50%, 1);
height: 2rem;
left: -0.25rem;
position: absolute;
top: 0;
width: 2rem;
}
#hero .text-container h2 span {
margin-left: 2.5rem;
}
#hero .text-container a {
background-color: rgba(255, 255, 255, 1);
border-radius: 0.75rem;
color: rgba(55, 65, 81, 1);
display: inline-block;
margin-top: 1.5rem;
padding: 1rem 2rem;
text-decoration: inherit;
}
#hero .logo-container {
display: none;
justify-content: center;
padding-left: 2rem;
padding-right: 2rem;
}
#hero .logo-container svg {
color: rgba(255, 255, 255, 1);
width: 66.666667%;
}
#middle-content {
align-items: flex-start;
display: grid;
gap: 4rem;
grid-template-columns: 1fr;
margin-top: 3.5rem;
}
#learning-materials {
padding: 2.5rem 2rem;
}
#learning-materials h2 {
font-weight: 500;
font-size: 1.25rem;
letter-spacing: -0.025em;
line-height: 1.75rem;
padding-left: 1rem;
padding-right: 1rem;
}
.list-item-link {
align-items: center;
border-radius: 0.75rem;
display: flex;
margin-top: 1rem;
padding: 1rem;
transition-property: background-color, border-color, color, fill, stroke,
opacity, box-shadow, transform, filter, backdrop-filter,
-webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
width: 100%;
}
.list-item-link svg:first-child {
margin-right: 1rem;
height: 1.5rem;
transition-property: background-color, border-color, color, fill, stroke,
opacity, box-shadow, transform, filter, backdrop-filter,
-webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
width: 1.5rem;
}
.list-item-link > span {
flex-grow: 1;
font-weight: 400;
transition-property: background-color, border-color, color, fill, stroke,
opacity, box-shadow, transform, filter, backdrop-filter,
-webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
.list-item-link > span > span {
color: rgba(107, 114, 128, 1);
display: block;
flex-grow: 1;
font-size: 0.75rem;
font-weight: 300;
line-height: 1rem;
transition-property: background-color, border-color, color, fill, stroke,
opacity, box-shadow, transform, filter, backdrop-filter,
-webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
.list-item-link svg:last-child {
height: 1rem;
transition-property: all;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
width: 1rem;
}
.list-item-link:hover {
color: rgba(255, 255, 255, 1);
background-color: hsla(162, 47%, 50%, 1);
}
.list-item-link:hover > span {
}
.list-item-link:hover > span > span {
color: rgba(243, 244, 246, 1);
}
.list-item-link:hover svg:last-child {
transform: translateX(0.25rem);
}
#other-links {
}
.button-pill {
padding: 1.5rem 2rem;
transition-duration: 300ms;
transition-property: background-color, border-color, color, fill, stroke,
opacity, box-shadow, transform, filter, backdrop-filter,
-webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
align-items: center;
display: flex;
}
.button-pill svg {
transition-property: background-color, border-color, color, fill, stroke,
opacity, box-shadow, transform, filter, backdrop-filter,
-webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
flex-shrink: 0;
width: 3rem;
}
.button-pill > span {
letter-spacing: -0.025em;
font-weight: 400;
font-size: 1.125rem;
line-height: 1.75rem;
padding-left: 1rem;
padding-right: 1rem;
}
.button-pill span span {
display: block;
font-size: 0.875rem;
font-weight: 300;
line-height: 1.25rem;
}
.button-pill:hover svg,
.button-pill:hover {
color: rgba(255, 255, 255, 1) !important;
}
#nx-console:hover {
background-color: rgba(0, 122, 204, 1);
}
#nx-console svg {
color: rgba(0, 122, 204, 1);
}
#nx-console-jetbrains {
margin-top: 2rem;
}
#nx-console-jetbrains:hover {
background-color: rgba(255, 49, 140, 1);
}
#nx-console-jetbrains svg {
color: rgba(255, 49, 140, 1);
}
#nx-repo:hover {
background-color: rgba(24, 23, 23, 1);
}
#nx-repo svg {
color: rgba(24, 23, 23, 1);
}
#nx-cloud {
margin-bottom: 2rem;
margin-top: 2rem;
padding: 2.5rem 2rem;
}
#nx-cloud > div {
align-items: center;
display: flex;
}
#nx-cloud > div svg {
border-radius: 0.375rem;
flex-shrink: 0;
width: 3rem;
}
#nx-cloud > div h2 {
font-size: 1.125rem;
font-weight: 400;
letter-spacing: -0.025em;
line-height: 1.75rem;
padding-left: 1rem;
padding-right: 1rem;
}
#nx-cloud > div h2 span {
display: block;
font-size: 0.875rem;
font-weight: 300;
line-height: 1.25rem;
}
#nx-cloud p {
font-size: 1rem;
line-height: 1.5rem;
margin-top: 1rem;
}
#nx-cloud pre {
margin-top: 1rem;
}
#nx-cloud a {
color: rgba(107, 114, 128, 1);
display: block;
font-size: 0.875rem;
line-height: 1.25rem;
margin-top: 1.5rem;
text-align: right;
}
#nx-cloud a:hover {
text-decoration: underline;
}
#commands {
padding: 2.5rem 2rem;
margin-top: 3.5rem;
}
#commands h2 {
font-size: 1.25rem;
font-weight: 400;
letter-spacing: -0.025em;
line-height: 1.75rem;
padding-left: 1rem;
padding-right: 1rem;
}
#commands p {
font-size: 1rem;
font-weight: 300;
line-height: 1.5rem;
margin-top: 1rem;
padding-left: 1rem;
padding-right: 1rem;
}
details {
align-items: center;
display: flex;
margin-top: 1rem;
padding-left: 1rem;
padding-right: 1rem;
width: 100%;
}
details pre > span {
color: rgba(181, 181, 181, 1);
}
summary {
border-radius: 0.5rem;
display: flex;
font-weight: 400;
padding: 0.5rem;
cursor: pointer;
transition-property: background-color, border-color, color, fill, stroke,
opacity, box-shadow, transform, filter, backdrop-filter,
-webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
summary:hover {
background-color: rgba(243, 244, 246, 1);
}
summary svg {
height: 1.5rem;
margin-right: 1rem;
width: 1.5rem;
}
#love {
color: rgba(107, 114, 128, 1);
font-size: 0.875rem;
line-height: 1.25rem;
margin-top: 3.5rem;
opacity: 0.6;
text-align: center;
}
#love svg {
color: rgba(252, 165, 165, 1);
width: 1.25rem;
height: 1.25rem;
display: inline;
margin-top: -0.25rem;
}
@media screen and (min-width: 768px) {
#hero {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
#hero .logo-container {
display: flex;
}
#middle-content {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}

View File

@@ -1,21 +0,0 @@
import { AppElement } from './app.element';
describe('AppElement', () => {
let app: AppElement;
beforeEach(() => {
app = new AppElement();
});
it('should create successfully', () => {
expect(app).toBeTruthy();
});
it('should have a greeting', () => {
app.connectedCallback();
expect(app.querySelector('h1').innerHTML).toContain(
'Welcome @triliumnext/client'
);
});
});

View File

@@ -1,409 +0,0 @@
import './app.element.css';
export class AppElement extends HTMLElement {
public static observedAttributes = [
];
connectedCallback() {
const title = '@triliumnext/client';
this.innerHTML = `
<div class="wrapper">
<div class="container">
<!-- WELCOME -->
<div id="welcome">
<h1>
<span> Hello there, </span>
Welcome ${title} 👋
</h1>
</div>
<!-- HERO -->
<div id="hero" class="rounded">
<div class="text-container">
<h2>
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M9 12l2 2 4-4M7.835 4.697a3.42 3.42 0 001.946-.806 3.42 3.42 0 014.438 0 3.42 3.42 0 001.946.806 3.42 3.42 0 013.138 3.138 3.42 3.42 0 00.806 1.946 3.42 3.42 0 010 4.438 3.42 3.42 0 00-.806 1.946 3.42 3.42 0 01-3.138 3.138 3.42 3.42 0 00-1.946.806 3.42 3.42 0 01-4.438 0 3.42 3.42 0 00-1.946-.806 3.42 3.42 0 01-3.138-3.138 3.42 3.42 0 00-.806-1.946 3.42 3.42 0 010-4.438 3.42 3.42 0 00.806-1.946 3.42 3.42 0 013.138-3.138z"
/>
</svg>
<span>You&apos;re up and running</span>
</h2>
<a href="#commands"> What&apos;s next? </a>
</div>
<div class="logo-container">
<svg
fill="currentColor"
role="img"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M11.987 14.138l-3.132 4.923-5.193-8.427-.012 8.822H0V4.544h3.691l5.247 8.833.005-3.998 3.044 4.759zm.601-5.761c.024-.048 0-3.784.008-3.833h-3.65c.002.059-.005 3.776-.003 3.833h3.645zm5.634 4.134a2.061 2.061 0 0 0-1.969 1.336 1.963 1.963 0 0 1 2.343-.739c.396.161.917.422 1.33.283a2.1 2.1 0 0 0-1.704-.88zm3.39 1.061c-.375-.13-.8-.277-1.109-.681-.06-.08-.116-.17-.176-.265a2.143 2.143 0 0 0-.533-.642c-.294-.216-.68-.322-1.18-.322a2.482 2.482 0 0 0-2.294 1.536 2.325 2.325 0 0 1 4.002.388.75.75 0 0 0 .836.334c.493-.105.46.36 1.203.518v-.133c-.003-.446-.246-.55-.75-.733zm2.024 1.266a.723.723 0 0 0 .347-.638c-.01-2.957-2.41-5.487-5.37-5.487a5.364 5.364 0 0 0-4.487 2.418c-.01-.026-1.522-2.39-1.538-2.418H8.943l3.463 5.423-3.379 5.32h3.54l1.54-2.366 1.568 2.366h3.541l-3.21-5.052a.7.7 0 0 1-.084-.32 2.69 2.69 0 0 1 2.69-2.691h.001c1.488 0 1.736.89 2.057 1.308.634.826 1.9.464 1.9 1.541a.707.707 0 0 0 1.066.596zm.35.133c-.173.372-.56.338-.755.639-.176.271.114.412.114.412s.337.156.538-.311c.104-.231.14-.488.103-.74z"
/>
</svg>
</div>
</div>
<!-- MIDDLE CONTENT -->
<div id="middle-content">
<div id="learning-materials" class="rounded shadow">
<h2>Learning materials</h2>
<a href="https://nx.dev/getting-started/intro?utm_source=nx-project" target="_blank" rel="noreferrer" class="list-item-link">
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"
/>
</svg>
<span>
Documentation
<span> Everything is in there </span>
</span>
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M9 5l7 7-7 7"
/>
</svg>
</a>
<a href="https://nx.dev/blog/?utm_source=nx-project" target="_blank" rel="noreferrer" class="list-item-link">
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M19 20H5a2 2 0 01-2-2V6a2 2 0 012-2h10a2 2 0 012 2v1m2 13a2 2 0 01-2-2V7m2 13a2 2 0 002-2V9a2 2 0 00-2-2h-2m-4-3H9M7 16h6M7 8h6v4H7V8z"
/>
</svg>
<span>
Blog
<span> Changelog, features & events </span>
</span>
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M9 5l7 7-7 7"
/>
</svg>
</a>
<a href="https://www.youtube.com/@NxDevtools/videos?utm_source=nx-project&sub_confirmation=1" target="_blank" rel="noreferrer" class="list-item-link">
<svg
role="img"
viewBox="0 0 24 24"
fill="currentColor"
xmlns="http://www.w3.org/2000/svg"
>
<title>YouTube</title>
<path
d="M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z"
/>
</svg>
<span>
YouTube channel
<span> Nx Show, talks & tutorials </span>
</span>
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M9 5l7 7-7 7"
/>
</svg>
</a>
<a href="https://nx.dev/react-tutorial/1-code-generation?utm_source=nx-project" target="_blank" rel="noreferrer" class="list-item-link">
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M15 15l-2 5L9 9l11 4-5 2zm0 0l5 5M7.188 2.239l.777 2.897M5.136 7.965l-2.898-.777M13.95 4.05l-2.122 2.122m-5.657 5.656l-2.12 2.122"
/>
</svg>
<span>
Interactive tutorials
<span> Create an app, step-by-step </span>
</span>
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M9 5l7 7-7 7"
/>
</svg>
</a>
<a href="https://nxplaybook.com/?utm_source=nx-project" target="_blank" rel="noreferrer" class="list-item-link">
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path d="M12 14l9-5-9-5-9 5 9 5z" />
<path
d="M12 14l6.16-3.422a12.083 12.083 0 01.665 6.479A11.952 11.952 0 0012 20.055a11.952 11.952 0 00-6.824-2.998 12.078 12.078 0 01.665-6.479L12 14z"
/>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M12 14l9-5-9-5-9 5 9 5zm0 0l6.16-3.422a12.083 12.083 0 01.665 6.479A11.952 11.952 0 0012 20.055a11.952 11.952 0 00-6.824-2.998 12.078 12.078 0 01.665-6.479L12 14zm-4 6v-7.5l4-2.222"
/>
</svg>
<span>
Video courses
<span> Nx custom courses </span>
</span>
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M9 5l7 7-7 7"
/>
</svg>
</a>
</div>
<div id="other-links">
<a id="nx-console" class="button-pill rounded shadow" href="https://marketplace.visualstudio.com/items?itemName=nrwl.angular-console&utm_source=nx-project" target="_blank" rel="noreferrer">
<svg
fill="currentColor"
role="img"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<title>Visual Studio Code</title>
<path
d="M23.15 2.587L18.21.21a1.494 1.494 0 0 0-1.705.29l-9.46 8.63-4.12-3.128a.999.999 0 0 0-1.276.057L.327 7.261A1 1 0 0 0 .326 8.74L3.899 12 .326 15.26a1 1 0 0 0 .001 1.479L1.65 17.94a.999.999 0 0 0 1.276.057l4.12-3.128 9.46 8.63a1.492 1.492 0 0 0 1.704.29l4.942-2.377A1.5 1.5 0 0 0 24 20.06V3.939a1.5 1.5 0 0 0-.85-1.352zm-5.146 14.861L10.826 12l7.178-5.448v10.896z"
/>
</svg>
<span>
Install Nx Console for VSCode
<span>The official VSCode extension for Nx.</span>
</span>
</a>
<a
id="nx-console-jetbrains"
class="button-pill rounded shadow"
href="https://plugins.jetbrains.com/plugin/21060-nx-console"
target="_blank"
rel="noreferrer"
>
<svg
height="48"
width="48"
viewBox="20 20 60 60"
xmlns="http://www.w3.org/2000/svg"
>
<path d="m22.5 22.5h60v60h-60z" />
<g fill="#fff">
<path d="m29.03 71.25h22.5v3.75h-22.5z" />
<path d="m28.09 38 1.67-1.58a1.88 1.88 0 0 0 1.47.87c.64 0 1.06-.44 1.06-1.31v-5.98h2.58v6a3.48 3.48 0 0 1 -.87 2.6 3.56 3.56 0 0 1 -2.57.95 3.84 3.84 0 0 1 -3.34-1.55z" />
<path d="m36 30h7.53v2.19h-5v1.44h4.49v2h-4.42v1.49h5v2.21h-7.6z" />
<path d="m47.23 32.29h-2.8v-2.29h8.21v2.27h-2.81v7.1h-2.6z" />
<path d="m29.13 43.08h4.42a3.53 3.53 0 0 1 2.55.83 2.09 2.09 0 0 1 .6 1.53 2.16 2.16 0 0 1 -1.44 2.09 2.27 2.27 0 0 1 1.86 2.29c0 1.61-1.31 2.59-3.55 2.59h-4.44zm5 2.89c0-.52-.42-.8-1.18-.8h-1.29v1.64h1.24c.79 0 1.25-.26 1.25-.81zm-.9 2.66h-1.57v1.73h1.62c.8 0 1.24-.31 1.24-.86 0-.5-.4-.87-1.27-.87z" />
<path d="m38 43.08h4.1a4.19 4.19 0 0 1 3 1 2.93 2.93 0 0 1 .9 2.19 3 3 0 0 1 -1.93 2.89l2.24 3.27h-3l-1.88-2.84h-.87v2.84h-2.56zm4 4.5c.87 0 1.39-.43 1.39-1.11 0-.75-.54-1.12-1.4-1.12h-1.44v2.26z" />
<path d="m49.59 43h2.5l4 9.44h-2.79l-.67-1.69h-3.63l-.67 1.69h-2.71zm2.27 5.73-1-2.65-1.06 2.65z" />
<path d="m56.46 43.05h2.6v9.37h-2.6z" />
<path d="m60.06 43.05h2.42l3.37 5v-5h2.57v9.37h-2.26l-3.53-5.14v5.14h-2.57z" />
<path d="m68.86 51 1.45-1.73a4.84 4.84 0 0 0 3 1.13c.71 0 1.08-.24 1.08-.65 0-.4-.31-.6-1.59-.91-2-.46-3.53-1-3.53-2.93 0-1.74 1.37-3 3.62-3a5.89 5.89 0 0 1 3.86 1.25l-1.26 1.84a4.63 4.63 0 0 0 -2.62-.92c-.63 0-.94.25-.94.6 0 .42.32.61 1.63.91 2.14.46 3.44 1.16 3.44 2.91 0 1.91-1.51 3-3.79 3a6.58 6.58 0 0 1 -4.35-1.5z" />
</g>
</svg>
<span>
Install Nx Console for JetBrains
<span>
Available for WebStorm, Intellij IDEA Ultimate and more!
</span>
</span>
</a>
<div id="nx-cloud" class="rounded shadow">
<div>
<svg id="nx-cloud-logo" role="img" xmlns="http://www.w3.org/2000/svg" stroke="currentColor" fill="transparent" viewBox="0 0 24 24">
<path stroke-width="2" d="M23 3.75V6.5c-3.036 0-5.5 2.464-5.5 5.5s-2.464 5.5-5.5 5.5-5.5 2.464-5.5 5.5H3.75C2.232 23 1 21.768 1 20.25V3.75C1 2.232 2.232 1 3.75 1h16.5C21.768 1 23 2.232 23 3.75Z" />
<path stroke-width="2" d="M23 6v14.1667C23 21.7307 21.7307 23 20.1667 23H6c0-3.128 2.53867-5.6667 5.6667-5.6667 3.128 0 5.6666-2.5386 5.6666-5.6666C17.3333 8.53867 19.872 6 23 6Z" />
</svg>
<h2>
Nx Cloud
<span>
Enable faster CI & better DX
</span>
</h2>
</div>
<p>
You can activate distributed tasks executions and caching by
running:
</p>
<pre>nx connect</pre>
<a href="https://nx.app/?utm_source=nx-project" target="_blank" rel="noreferrer"> What is Nx Cloud? </a>
</div>
<a id="nx-repo" class="button-pill rounded shadow" href="https://github.com/nrwl/nx?utm_source=nx-project" target="_blank" rel="noreferrer">
<svg
fill="currentColor"
role="img"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"
/>
</svg>
<span>
Nx is open source
<span> Love Nx? Give us a star! </span>
</span>
</a>
</div>
</div>
<!-- COMMANDS -->
<div id="commands" class="rounded shadow">
<h2>Next steps</h2>
<p>Here are some things you can do with Nx:</p>
<details>
<summary>
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"
/>
</svg>
Add UI library
</summary>
<pre><span># Generate UI lib</span>
nx g @nx/angular:lib ui
<span># Add a component</span>
nx g @nx/angular:component ui/src/lib/button</pre>
</details>
<details>
<summary>
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"
/>
</svg>
View interactive project graph
</summary>
<pre>nx graph</pre>
</details>
<details>
<summary>
<svg
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"
/>
</svg>
Run affected commands
</summary>
<pre><span># see what&apos;s been affected by changes</span>
nx affected:graph
<span># run tests for current changes</span>
nx affected:test
<span># run e2e tests for current changes</span>
nx affected:e2e</pre>
</details>
</div>
<p id="love">
Carefully crafted with
<svg
fill="currentColor"
stroke="none"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z"
/>
</svg>
</p>
</div>
</div>
`;
}
}
customElements.define('triliumnext-root', AppElement);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -1,14 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Client</title>
<base href="/" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" type="image/x-icon" href="favicon.ico" />
</head>
<body>
<triliumnext-root></triliumnext-root>
</body>
</html>

View File

@@ -1 +0,0 @@
import './app/app.element';

View File

@@ -1 +0,0 @@
/* You can add global styles to this file, and also import other style files */

View File

@@ -1,5 +1,4 @@
import froca from "../services/froca.js";
import bundleService from "../services/bundle.js";
import RootCommandExecutor from "./root_command_executor.js";
import Entrypoints, { type SqlExecuteResults } from "./entrypoints.js";
import options from "../services/options.js";
@@ -28,6 +27,7 @@ import type { NativeImage, TouchBar } from "electron";
import TouchBarComponent from "./touch_bar.js";
import type { CKTextEditor } from "@triliumnext/ckeditor5";
import type CodeMirror from "@triliumnext/codemirror";
import { StartupChecks } from "./startup_checks.js";
interface Layout {
getRootWidget: (appContext: AppContext) => RootWidget;
@@ -128,6 +128,7 @@ export type CommandMappings = {
openAboutDialog: CommandData;
hideFloatingButtons: {};
hideLeftPane: CommandData;
showCpuArchWarning: CommandData;
showLeftPane: CommandData;
hoistNote: CommandData & { noteId: string };
leaveProtectedSession: CommandData;
@@ -279,6 +280,7 @@ export type CommandMappings = {
buildIcon(name: string): NativeImage;
};
refreshTouchBar: CommandData;
reloadTextEditor: CommandData;
};
type EventMappings = {
@@ -467,13 +469,21 @@ export class AppContext extends Component {
this.tabManager.loadTabs();
const bundleService = (await import("../services/bundle.js")).default;
setTimeout(() => bundleService.executeStartupBundles(), 2000);
}
initComponents() {
this.tabManager = new TabManager();
this.components = [this.tabManager, new RootCommandExecutor(), new Entrypoints(), new MainTreeExecutors(), new ShortcutComponent()];
this.components = [
this.tabManager,
new RootCommandExecutor(),
new Entrypoints(),
new MainTreeExecutors(),
new ShortcutComponent(),
new StartupChecks()
];
if (utils.isMobile()) {
this.components.push(new MobileScreenSwitcherExecutor());

View File

@@ -12,6 +12,7 @@ import type FNote from "../entities/fnote.js";
import type TypeWidget from "../widgets/type_widgets/type_widget.js";
import type { CKTextEditor } from "@triliumnext/ckeditor5";
import type CodeMirror from "@triliumnext/codemirror";
import { closeActiveDialog } from "../services/dialog.js";
export interface SetNoteOpts {
triggerSwitchEvent?: unknown;
@@ -83,7 +84,7 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded">
await this.triggerEvent("beforeNoteSwitch", { noteContext: this });
utils.closeActiveDialog();
closeActiveDialog();
this.notePath = resolvedNotePath;
this.viewScope = opts.viewScope;
@@ -269,14 +270,32 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded">
return true;
}
const blob = await this.note.getBlob();
if (!blob) {
return false;
// Store the initial decision about read-only status in the viewScope
// This will be "remembered" until the viewScope is refreshed
if (!this.viewScope) {
this.resetViewScope();
}
const sizeLimit = this.note.type === "text" ? options.getInt("autoReadonlySizeText") : options.getInt("autoReadonlySizeCode");
const viewScope = this.viewScope!;
return sizeLimit && blob.contentLength > sizeLimit && !this.note.isLabelTruthy("autoReadOnlyDisabled");
if (viewScope.isReadOnly === undefined) {
const blob = await this.note.getBlob();
if (!blob) {
viewScope.isReadOnly = false;
return false;
}
const sizeLimit = this.note.type === "text"
? options.getInt("autoReadonlySizeText")
: options.getInt("autoReadonlySizeCode");
viewScope.isReadOnly = Boolean(sizeLimit &&
blob.contentLength > sizeLimit &&
!this.note.isLabelTruthy("autoReadOnlyDisabled"));
}
// Return the cached decision, which won't change until viewScope is reset
return viewScope.isReadOnly || false;
}
async entitiesReloadedEvent({ loadResults }: EventData<"entitiesReloaded">) {

View File

@@ -0,0 +1,26 @@
import server from "../services/server";
import Component from "./component";
// TODO: Deduplicate.
interface CpuArchResponse {
isCpuArchMismatch: boolean;
}
export class StartupChecks extends Component {
constructor() {
super();
this.checkCpuArchMismatch();
}
async checkCpuArchMismatch() {
try {
const response = await server.get("system-checks") as CpuArchResponse;
if (response.isCpuArchMismatch) {
this.triggerCommand("showCpuArchWarning", {});
}
} catch (error) {
console.warn("Could not check CPU arch status:", error);
}
}
}

View File

@@ -688,7 +688,7 @@ export default class TabManager extends Component {
const titleFragments = [
// it helps to navigate in history if note title is included in the title
await activeNoteContext.getNavigationTitle(),
"TriliumNext Notes"
"Trilium Notes"
].filter(Boolean);
document.title = titleFragments.join(" - ");

View File

@@ -8,6 +8,7 @@ import electronContextMenu from "./menus/electron_context_menu.js";
import glob from "./services/glob.js";
import { t } from "./services/i18n.js";
import options from "./services/options.js";
import server from "./services/server.js";
import type ElectronRemote from "@electron/remote";
import type Electron from "electron";
import "./stylesheets/bootstrap.scss";

View File

@@ -1,7 +1,6 @@
import server from "../services/server.js";
import noteAttributeCache from "../services/note_attribute_cache.js";
import ws from "../services/ws.js";
import froca from "../services/froca.js";
import protectedSessionHolder from "../services/protected_session_holder.js";
import cssClassManager from "../services/css_class_manager.js";
import type { Froca } from "../services/froca-interface.js";
@@ -410,8 +409,8 @@ class FNote {
const notePaths: NotePathRecord[] = this.getAllNotePaths().map((path) => ({
notePath: path,
isInHoistedSubTree: isHoistedRoot || path.includes(hoistedNoteId),
isArchived: path.some((noteId) => froca.notes[noteId].isArchived),
isSearch: path.some((noteId) => froca.notes[noteId].type === "search"),
isArchived: path.some((noteId) => this.froca.notes[noteId].isArchived),
isSearch: path.some((noteId) => this.froca.notes[noteId].type === "search"),
isHidden: path.includes("_hidden")
}));
@@ -982,7 +981,7 @@ class FNote {
continue;
}
const parentNote = froca.notes[parentNoteId];
const parentNote = this.froca.notes[parentNoteId];
if (!parentNote || parentNote.type === "search") {
continue;

View File

@@ -21,6 +21,7 @@ import ConfirmDialog from "../widgets/dialogs/confirm.js";
import RevisionsDialog from "../widgets/dialogs/revisions.js";
import DeleteNotesDialog from "../widgets/dialogs/delete_notes.js";
import InfoDialog from "../widgets/dialogs/info.js";
import IncorrectCpuArchDialog from "../widgets/dialogs/incorrect_cpu_arch.js";
export function applyModals(rootContainer: RootContainer) {
rootContainer
@@ -45,4 +46,5 @@ export function applyModals(rootContainer: RootContainer) {
.child(new InfoDialog())
.child(new ConfirmDialog())
.child(new PromptDialog())
.child(new IncorrectCpuArchDialog())
}

View File

@@ -1,204 +0,0 @@
// Source: https://github.com/codemirror/codemirror5/pull/7080/files
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: https://codemirror.net/5/LICENSE
(function (mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod);
else // Plain browser env
mod(CodeMirror);
})(function (CodeMirror) {
"use strict";
CodeMirror.defineMode("hcl", function (config) {
var indentUnit = config.indentUnit;
var keywords = {
"resource": true,
"variable": true,
"output": true,
"module": true,
"provider": true,
"data": true,
"locals": true,
"terraform": true,
"if": true,
"else": true,
"for": true,
"foreach": true,
"in": true,
"true": true,
"false": true,
"null": true,
};
var atoms = {
"true": true,
"false": true,
"null": true,
};
var isOperatorChar = /[+\-*&^%:=<>!|\/]/;
var curPunc;
function tokenBase(stream, state) {
var ch = stream.next();
if (ch == '"' || ch == "'" || ch == "`") {
state.tokenize = tokenString(ch);
return state.tokenize(stream, state);
}
if (/[\d\.]/.test(ch)) {
if (ch == ".") {
stream.match(/^[0-9_]+([eE][\-+]?[0-9_]+)?/);
} else {
stream.match(/^[0-9_]*\.?[0-9_]*([eE][\-+]?[0-9_]+)?/);
}
return "number";
}
if (/[\[\]{}\(\),;\:\.]/.test(ch)) {
curPunc = ch;
return null;
}
if (ch == "/") {
if (stream.eat("*")) {
state.tokenize = tokenComment;
return tokenComment(stream, state);
}
if (stream.eat("/")) {
stream.skipToEnd();
return "comment";
}
}
if (isOperatorChar.test(ch)) {
stream.eatWhile(isOperatorChar);
return "operator";
}
stream.eatWhile(/[\w\$_\xa1-\uffff]/);
var cur = stream.current();
if (keywords.propertyIsEnumerable(cur)) {
return "keyword";
}
if (atoms.propertyIsEnumerable(cur)) return "atom";
return "variable";
}
function tokenString(quote) {
return function (stream, state) {
var escaped = false,
next,
end = false;
while ((next = stream.next()) != null) {
if (next == quote && !escaped) {
end = true;
break;
}
escaped = !escaped && quote != "`" && next == "\\";
}
if (end || !(escaped || quote == "`"))
state.tokenize = tokenBase;
return "string";
};
}
function tokenComment(stream, state) {
var maybeEnd = false,
ch;
while (ch = stream.next()) {
if (ch == "/" && maybeEnd) {
state.tokenize = tokenBase;
break;
}
maybeEnd = (ch == "*");
}
return "comment";
}
function Context(indented, column, type, align, prev) {
this.indented = indented;
this.column = column;
this.type = type;
this.align = align;
this.prev = prev;
}
function pushContext(state, col, type) {
return state.context = new Context(state.indented, col, type, null, state.context);
}
function popContext(state) {
if (!state.context.prev) return;
var t = state.context.type;
if (t == ")" || t == "]" || t == "}")
state.indented = state.context.indented;
return state.context = state.context.prev;
}
// Interface
return {
startState: function (basecolumn) {
return {
tokenize: null,
context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
indented: 0,
startOfLine: true
};
},
token: function (stream, state) {
var ctx = state.context;
if (stream.sol()) {
if (ctx.align == null) ctx.align = false;
state.indented = stream.indentation();
state.startOfLine = true;
}
if (stream.eatSpace()) return null;
curPunc = null;
var style = (state.tokenize || tokenBase)(stream, state);
if (style == "comment") return style;
if (ctx.align == null) ctx.align = true;
if (curPunc == "{") pushContext(state, stream.column(), "}");
else if (curPunc == "[") pushContext(state, stream.column(), "]");
else if (curPunc == "(") pushContext(state, stream.column(), ")");
else if (curPunc == "}" && ctx.type == "}") popContext(state);
else if (curPunc == ctx.type) popContext(state);
state.startOfLine = false;
return style;
},
indent: function (state, textAfter) {
if (state.tokenize != tokenBase && state.tokenize != null) return CodeMirror.Pass;
var ctx = state.context, firstChar = textAfter && textAfter.charAt(0);
if (firstChar == "#" || firstChar == ";") return 0;
if (stream.sol()) {
if (ctx.type == "case" && /^(?:case|default)\b/.test(textAfter)) {
state.context.type = "}";
return ctx.indented;
}
var closing = firstChar == ctx.type;
if (ctx.align) return ctx.column + (closing ? 0 : 1);
else return ctx.indented + (closing ? 0 : indentUnit);
}
},
electricChars: "{}):",
closeBrackets: "()[]{}''\"\"``",
fold: "brace",
blockCommentStart: "/*",
blockCommentEnd: "*/",
lineComment: "//"
};
});
CodeMirror.defineMIME("text/x-hcl", "hcl");
CodeMirror.modeInfo.push({
ext: [ "hcl " ],
mime: "text/x-hcl",
mode: "hcl",
name: "Terraform (HCL)"
});
});

View File

@@ -192,13 +192,17 @@ class ContextMenu {
// it's important to stop the propagation especially for sub-menus, otherwise the event
// might be handled again by top-level menu
return false;
})
.on("mouseup", (e) =>{
});
$item.on("mouseup", (e) => {
// Prevent submenu from failing to expand on mobile
if (!this.isMobile || !("items" in item && item.items)) {
e.stopPropagation();
// Hide the content menu on mouse up to prevent the mouse event from propagating to the elements below.
this.hide();
return false;
});
}
});
if ("enabled" in item && item.enabled !== undefined && !item.enabled) {
$item.addClass("disabled");

View File

@@ -8,7 +8,7 @@ interface Entity {
export interface EntityChange {
id?: number | null;
noteId?: string;
entityName: EntityRowNames;
entityName: EntityType;
entityId: string;
entity?: Entity;
positions?: Record<string, number>;
@@ -22,3 +22,5 @@ export interface EntityChange {
changeId?: string | null;
instanceId?: string | null;
}
export type EntityType = "notes" | "branches" | "attributes" | "note_reordering" | "revisions" | "options" | "attachments" | "blobs" | "etapi_tokens";

View File

@@ -1,6 +1,6 @@
import ScriptContext from "./script_context.js";
import server from "./server.js";
import toastService from "./toast.js";
import toastService, { showError } from "./toast.js";
import froca from "./froca.js";
import utils from "./utils.js";
import { t } from "./i18n.js";
@@ -37,7 +37,9 @@ async function executeBundle(bundle: Bundle, originEntity?: Entity | null, $cont
} catch (e: any) {
const note = await froca.getNote(bundle.noteId);
toastService.showAndLogError(`Execution of JS note "${note?.title}" with ID ${bundle.noteId} failed with error: ${e?.message}`);
const message = `Execution of JS note "${note?.title}" with ID ${bundle.noteId} failed with error: ${e?.message}`;
showError(message);
logError(message);
}
}

View File

@@ -4,7 +4,7 @@ import froca from "./froca.js";
import linkService from "./link.js";
import utils from "./utils.js";
import { t } from "./i18n.js";
import toast from "./toast.js";
import { throwError } from "./ws.js";
let clipboardBranchIds: string[] = [];
let clipboardMode: string | null = null;
@@ -37,7 +37,7 @@ async function pasteAfter(afterBranchId: string) {
// copy will keep clipboardBranchIds and clipboardMode, so it's possible to paste into multiple places
} else {
toastService.throwError(`Unrecognized clipboard mode=${clipboardMode}`);
throwError(`Unrecognized clipboard mode=${clipboardMode}`);
}
}
@@ -69,7 +69,7 @@ async function pasteInto(parentBranchId: string) {
// copy will keep clipboardBranchIds and clipboardMode, so it's possible to paste into multiple places
} else {
toastService.throwError(`Unrecognized clipboard mode=${clipboardMode}`);
throwError(`Unrecognized clipboard mode=${clipboardMode}`);
}
}
@@ -109,39 +109,6 @@ function isClipboardEmpty() {
return clipboardBranchIds.length === 0;
}
export function copyText(text: string) {
if (!text) {
return;
}
let succeeded = false;
try {
if (navigator.clipboard) {
navigator.clipboard.writeText(text);
succeeded = true;
} else {
// Fallback method: https://stackoverflow.com/a/72239825
const textArea = document.createElement("textarea");
textArea.value = text;
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
succeeded = document.execCommand('copy');
document.body.removeChild(textArea);
}
} catch (e) {
console.warn(e);
succeeded = false;
}
if (succeeded) {
toast.showMessage(t("clipboard.copy_success"));
} else {
toast.showError(t("clipboard.copy_failed"));
}
}
export default {
pasteAfter,
pasteInto,

View File

@@ -0,0 +1,37 @@
export function copyText(text: string) {
if (!text) {
return;
}
try {
if (navigator.clipboard) {
navigator.clipboard.writeText(text);
return true;
} else {
// Fallback method: https://stackoverflow.com/a/72239825
const textArea = document.createElement("textarea");
textArea.value = text;
try {
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
return document.execCommand('copy');
} finally {
document.body.removeChild(textArea);
}
}
} catch (e) {
console.warn(e);
return false;
}
}
export async function copyTextWithToast(text: string) {
const t = (await import("./i18n.js")).t;
const toast = (await import("./toast.js")).default;
if (copyText(text)) {
toast.showMessage(t("clipboard.copy_success"));
} else {
toast.showError(t("clipboard.copy_failed"));
}
}

View File

@@ -1,6 +1,41 @@
import { Modal } from "bootstrap";
import appContext from "../components/app_context.js";
import type { ConfirmDialogOptions, ConfirmDialogResult, ConfirmWithMessageOptions } from "../widgets/dialogs/confirm.js";
import type { PromptDialogOptions } from "../widgets/dialogs/prompt.js";
import { focusSavedElement, saveFocusedElement } from "./focus.js";
export async function openDialog($dialog: JQuery<HTMLElement>, closeActDialog = true) {
if (closeActDialog) {
closeActiveDialog();
glob.activeDialog = $dialog;
}
saveFocusedElement();
Modal.getOrCreateInstance($dialog[0]).show();
$dialog.on("hidden.bs.modal", () => {
const $autocompleteEl = $(".aa-input");
if ("autocomplete" in $autocompleteEl) {
$autocompleteEl.autocomplete("close");
}
if (!glob.activeDialog || glob.activeDialog === $dialog) {
focusSavedElement();
}
});
const keyboardActionsService = (await import("./keyboard_actions.js")).default;
keyboardActionsService.updateDisplayedShortcuts($dialog);
return $dialog;
}
export function closeActiveDialog() {
if (glob.activeDialog) {
Modal.getOrCreateInstance(glob.activeDialog[0]).hide();
glob.activeDialog = null;
}
}
async function info(message: string) {
return new Promise((res) => appContext.triggerCommand("showInfoDialog", { message, callback: res }));

View File

@@ -0,0 +1,29 @@
let $lastFocusedElement: JQuery<HTMLElement> | null;
// perhaps there should be saved focused element per tab?
export function saveFocusedElement() {
$lastFocusedElement = $(":focus");
}
export function focusSavedElement() {
if (!$lastFocusedElement) {
return;
}
if ($lastFocusedElement.hasClass("ck")) {
// must handle CKEditor separately because of this bug: https://github.com/ckeditor/ckeditor5/issues/607
// the bug manifests itself in resetting the cursor position to the first character - jumping above
const editor = $lastFocusedElement.closest(".ck-editor__editable").prop("ckeditorInstance");
if (editor) {
editor.editing.view.focus();
} else {
console.log("Could not find CKEditor instance to focus last element");
}
} else {
$lastFocusedElement.focus();
}
$lastFocusedElement = null;
}

View File

@@ -245,6 +245,10 @@ class FrocaImpl implements Froca {
}
async getNotes(noteIds: string[] | JQuery<string>, silentNotFoundError = false): Promise<FNote[]> {
if (noteIds.length === 0) {
return [];
}
noteIds = Array.from(new Set(noteIds)); // make unique
const missingNoteIds = noteIds.filter((noteId) => !this.notes[noteId]);

View File

@@ -36,7 +36,7 @@ async function processEntityChanges(entityChanges: EntityChange[]) {
} else if (ec.entityName === "attachments") {
processAttachment(loadResults, ec);
} else if (ec.entityName === "blobs" || ec.entityName === "etapi_tokens") {
// NOOP
// NOOP - these entities are handled at the backend level and don't require frontend processing
} else {
throw new Error(`Unknown entityName '${ec.entityName}'`);
}

View File

@@ -26,12 +26,18 @@ function setupGlobs() {
window.onerror = function (msg, url, lineNo, columnNo, error) {
const string = String(msg).toLowerCase();
let errorObjectString = "";
try {
errorObjectString = JSON.stringify(error);
} catch (e: any) {
errorObjectString = e.toString();
}
let message = "Uncaught error: ";
if (string.includes("script error")) {
message += "No details available";
} else {
message += [`Message: ${msg}`, `URL: ${url}`, `Line: ${lineNo}`, `Column: ${columnNo}`, `Error object: ${JSON.stringify(error)}`, `Stack: ${error && error.stack}`].join(", ");
message += [`Message: ${msg}`, `URL: ${url}`, `Line: ${lineNo}`, `Column: ${columnNo}`, `Error object: ${errorObjectString}`, `Stack: ${error && error.stack}`].join(", ");
}
ws.logError(message);

View File

@@ -1,6 +1,7 @@
import { LOCALES } from "@triliumnext/commons";
import { readFileSync } from "fs";
import { join } from "path";
import { describe, expect, it } from "vitest";
describe("i18n", () => {
it("translations are valid JSON", () => {

View File

@@ -1,5 +1,5 @@
import { t } from "./i18n.js";
import toastService from "./toast.js";
import toastService, { showError } from "./toast.js";
function copyImageReferenceToClipboard($imageWrapper: JQuery<HTMLElement>) {
try {
@@ -11,7 +11,9 @@ function copyImageReferenceToClipboard($imageWrapper: JQuery<HTMLElement>) {
if (success) {
toastService.showMessage(t("image.copied-to-clipboard"));
} else {
toastService.showAndLogError(t("image.cannot-copy"));
const message = t("image.cannot-copy");
showError(message);
logError(message);
}
} finally {
window.getSelection()?.removeAllRanges();

View File

@@ -115,6 +115,7 @@ function updateDisplayedShortcuts($container: JQuery<HTMLElement>) {
export default {
updateDisplayedShortcuts,
setupActionsForElement,
getAction,
getActions,
getActionsForScope
};

View File

@@ -16,4 +16,29 @@ describe("Link", () => {
const output = parseNavigationStateFromUrl(`#root/WWaBNf3SSA1b/mQ2tIzLVFKHL`);
expect(output).toMatchObject({ notePath: "root/WWaBNf3SSA1b/mQ2tIzLVFKHL", noteId: "mQ2tIzLVFKHL" });
});
it("parses notePath with spaces", () => {
const output = parseNavigationStateFromUrl(` #root/WWaBNf3SSA1b/mQ2tIzLVFKHL`);
expect(output).toMatchObject({ notePath: "root/WWaBNf3SSA1b/mQ2tIzLVFKHL", noteId: "mQ2tIzLVFKHL" });
});
it("parses notePath with extraWindow", () => {
const output = parseNavigationStateFromUrl(`127.0.0.1:8080/?extraWindow=1#root/QZGqKB7wVZF8?ntxId=0XPvXG`);
expect(output).toMatchObject({ notePath: "root/QZGqKB7wVZF8", noteId: "QZGqKB7wVZF8" });
});
it("ignores external URL with internal hash anchor", () => {
const output = parseNavigationStateFromUrl(`https://en.wikipedia.org/wiki/Bearded_Collie#Health`);
expect(output).toMatchObject({});
});
it("ignores malformed but hash-containing external URL", () => {
const output = parseNavigationStateFromUrl("https://abc.com/#drop?searchString=firefox");
expect(output).toStrictEqual({});
});
it("ignores non-hash internal path", () => {
const output = parseNavigationStateFromUrl("/root/abc123");
expect(output).toStrictEqual({});
});
});

View File

@@ -48,6 +48,13 @@ export interface ViewScope {
viewMode?: ViewMode;
attachmentId?: string;
readOnlyTemporarilyDisabled?: boolean;
/**
* If true, it indicates that the note in the view should be opened in read-only mode (for supported note types such as text or code).
*
* The reason why we store this information here is that a note can become read-only as the user types content in it, and we wouldn't want
* to immediately enter read-only mode.
*/
isReadOnly?: boolean;
highlightsListPreviousVisible?: boolean;
highlightsListTemporarilyHidden?: boolean;
tocTemporarilyHidden?: boolean;
@@ -204,11 +211,17 @@ export function parseNavigationStateFromUrl(url: string | undefined) {
return {};
}
url = url.trim();
const hashIdx = url.indexOf("#");
if (hashIdx === -1) {
return {};
}
// Exclude external links that contain #
if (hashIdx !== 0 && !url.includes("/#root") && !url.includes("/#?searchString") && !url.includes("/?extraWindow")) {
return {};
}
const hash = url.substr(hashIdx + 1); // strip also the initial '#'
let [notePath, paramString] = hash.split("?");
@@ -272,8 +285,10 @@ function goToLinkExt(evt: MouseEvent | JQuery.ClickEvent | JQuery.MouseDownEvent
evt.preventDefault();
evt.stopPropagation();
if (hrefLink?.startsWith("#fn") && $link) {
return handleFootnote(hrefLink, $link);
if (hrefLink && hrefLink.startsWith("#") && !hrefLink.startsWith("#root/") && $link) {
if (handleAnchor(hrefLink, $link)) {
return true;
}
}
const { notePath, viewScope } = parseNavigationStateFromUrl(hrefLink);
@@ -335,18 +350,19 @@ function goToLinkExt(evt: MouseEvent | JQuery.ClickEvent | JQuery.MouseDownEvent
}
/**
* Scrolls to either the footnote (if clicking on a reference such as `[1]`), or to the reference of a footnote (if clicking on the footnote `^` arrow).
* Scrolls to either the footnote (if clicking on a reference such as `[1]`), or to the reference of a footnote (if clicking on the footnote `^` arrow),
* or CKEditor bookmarks.
*
* @param hrefLink the URL of the link that was clicked (it should be in the form of `#fn` or `#fnref`).
* @param $link the element of the link that was clicked.
* @returns whether the event should be consumed or not.
* @returns `true` if the link was handled (i.e., the element was found and scrolled to), `false` otherwise.
*/
function handleFootnote(hrefLink: string, $link: JQuery<HTMLElement>) {
function handleAnchor(hrefLink: string, $link: JQuery<HTMLElement>) {
const el = $link.closest(".ck-content").find(hrefLink)[0];
if (el) {
el.scrollIntoView({ behavior: "smooth", block: "center" });
}
return true;
return !!el;
}
function linkContextMenu(e: PointerEvent) {

View File

@@ -44,10 +44,7 @@ interface OptionRow {}
interface NoteReorderingRow {}
interface ContentNoteIdToComponentIdRow {
noteId: string;
componentId: string;
}
type EntityRowMappings = {
notes: NoteRow;

View File

@@ -289,13 +289,11 @@ function initNoteAutocomplete($el: JQuery<HTMLElement>, options?: Options) {
}
if (suggestion.action === "create-note") {
const { success, noteType, templateNoteId } = await noteCreateService.chooseNoteType();
const { success, noteType, templateNoteId, notePath } = await noteCreateService.chooseNoteType();
if (!success) {
return;
}
const { note } = await noteCreateService.createNote(suggestion.parentNoteId, {
const { note } = await noteCreateService.createNote( notePath || suggestion.parentNoteId, {
title: suggestion.noteTitle,
activate: false,
type: noteType,

View File

@@ -116,7 +116,7 @@ async function chooseNoteType() {
}
async function createNoteWithTypePrompt(parentNotePath: string, options: CreateNoteOpts = {}) {
const { success, noteType, templateNoteId } = await chooseNoteType();
const { success, noteType, templateNoteId, notePath } = await chooseNoteType();
if (!success) {
return;
@@ -125,7 +125,7 @@ async function createNoteWithTypePrompt(parentNotePath: string, options: CreateN
options.type = noteType;
options.templateNoteId = templateNoteId;
return await createNote(parentNotePath, options);
return await createNote(notePath || parentNotePath, options);
}
/* If the first element is heading, parse it out and use it as a new heading. */

View File

@@ -73,8 +73,8 @@ async function mouseEnterHandler(this: HTMLElement) {
}
let renderPromise;
if (url?.startsWith("#fn")) {
renderPromise = renderFootnote($link, url);
if (url && url.startsWith("#") && !url.startsWith("#root/")) {
renderPromise = renderFootnoteOrAnchor($link, url);
} else {
renderPromise = renderTooltip(await froca.getNote(noteId));
}
@@ -178,33 +178,47 @@ async function renderTooltip(note: FNote | null) {
return content;
}
function renderFootnote($link: JQuery<HTMLElement>, url: string) {
function renderFootnoteOrAnchor($link: JQuery<HTMLElement>, url: string) {
// A footnote text reference
const footnoteRef = url.substring(3);
const $footnoteContent = $link
.closest(".ck-content") // find the parent CK content
.find("> .footnote-section") // find the footnote section
.find(`a[href="#fnref${footnoteRef}"]`) // find the footnote link
.closest(".footnote-item") // find the parent container of the footnote
.find(".footnote-content"); // find the actual text content of the footnote
let $targetContent: JQuery<HTMLElement>;
if (url.startsWith("#fn")) {
$targetContent = $link
.closest(".ck-content") // find the parent CK content
.find("> .footnote-section") // find the footnote section
.find(`a[href="#fnref${footnoteRef}"]`) // find the footnote link
.closest(".footnote-item") // find the parent container of the footnote
.find(".footnote-content"); // find the actual text content of the footnote
} else {
$targetContent = $link
.closest(".ck-content")
.find(url)
.closest("p");
}
if (!$targetContent.length) {
// If the target content is not found, return an empty string
return "";
}
const isEditable = $link.closest(".ck-content").hasClass("note-detail-editable-text-editor");
if (isEditable) {
/* Remove widget buttons for tables, formulas, and images in editable notes. */
$footnoteContent.find('.ck-widget__selection-handle').remove();
$footnoteContent.find('.ck-widget__type-around').remove();
$footnoteContent.find('.ck-widget__resizer').remove();
$targetContent.find('.ck-widget__selection-handle').remove();
$targetContent.find('.ck-widget__type-around').remove();
$targetContent.find('.ck-widget__resizer').remove();
/* Handling in-line math formulas */
$footnoteContent.find('.ck-math-tex.ck-math-tex-inline.ck-widget').each(function () {
$targetContent.find('.ck-math-tex.ck-math-tex-inline.ck-widget').each(function () {
const $katex = $(this).find('.katex').first();
if ($katex.length) {
$(this).replaceWith($('<span class="math-tex"></span>').append($('<span></span>').append($katex.clone())));
}
});
}
let footnoteContent = $footnoteContent.html();
let footnoteContent = $targetContent.html();
footnoteContent = `<div class="ck-content">${footnoteContent}</div>`
return footnoteContent || "";
}

View File

@@ -4,6 +4,8 @@ import { t } from "./i18n.js";
import type { MenuItem } from "../menus/context_menu.js";
import type { TreeCommandNames } from "../menus/tree_context_menu.js";
const SEPARATOR = { title: "----" };
async function getNoteTypeItems(command?: TreeCommandNames) {
const items: MenuItem<TreeCommandNames>[] = [
{ title: t("note_types.text"), command, type: "text", uiIcon: "bx bx-note" },
@@ -18,25 +20,59 @@ async function getNoteTypeItems(command?: TreeCommandNames) {
{ title: t("note_types.web-view"), command, type: "webView", uiIcon: "bx bx-globe-alt" },
{ title: t("note_types.mind-map"), command, type: "mindMap", uiIcon: "bx bx-sitemap" },
{ title: t("note_types.geo-map"), command, type: "geoMap", uiIcon: "bx bx-map-alt" },
...await getBuiltInTemplates(command),
...await getUserTemplates(command)
];
return items;
}
async function getUserTemplates(command?: TreeCommandNames) {
const templateNoteIds = await server.get<string[]>("search-templates");
const templateNotes = await froca.getNotes(templateNoteIds);
if (templateNotes.length > 0) {
items.push({ title: "----" });
for (const templateNote of templateNotes) {
items.push({
title: templateNote.title,
uiIcon: templateNote.getIcon(),
command: command,
type: templateNote.type,
templateNoteId: templateNote.noteId
});
}
if (templateNotes.length === 0) {
return [];
}
const items: MenuItem<TreeCommandNames>[] = [
SEPARATOR
];
for (const templateNote of templateNotes) {
items.push({
title: templateNote.title,
uiIcon: templateNote.getIcon(),
command: command,
type: templateNote.type,
templateNoteId: templateNote.noteId
});
}
return items;
}
async function getBuiltInTemplates(command?: TreeCommandNames) {
const templatesRoot = await froca.getNote("_templates");
if (!templatesRoot) {
console.warn("Unable to find template root.");
return [];
}
const childNotes = await templatesRoot.getChildNotes();
if (childNotes.length === 0) {
return [];
}
const items: MenuItem<TreeCommandNames>[] = [
SEPARATOR
];
for (const templateNote of childNotes) {
items.push({
title: templateNote.title,
uiIcon: templateNote.getIcon(),
command: command,
type: templateNote.type,
templateNoteId: templateNote.noteId
});
}
return items;
}

View File

@@ -1,4 +1,5 @@
import server from "./server.js";
import { isShare } from "./utils.js";
type OptionValue = number | string;
@@ -7,7 +8,11 @@ class Options {
private arr!: Record<string, OptionValue>;
constructor() {
this.initializedPromise = server.get<Record<string, OptionValue>>("options").then((data) => this.load(data));
if (!isShare) {
this.initializedPromise = server.get<Record<string, OptionValue>>("options").then((data) => this.load(data));
} else {
this.initializedPromise = Promise.resolve();
}
}
load(arr: Record<string, OptionValue>) {

View File

@@ -1,4 +1,4 @@
import FrontendScriptApi, { type Entity } from "./frontend_script_api.js";
import type { Entity } from "./frontend_script_api.js";
import utils from "./utils.js";
import froca from "./froca.js";
@@ -14,6 +14,8 @@ async function ScriptContext(startNoteId: string, allNoteIds: string[], originEn
throw new Error(`Could not find start note ${startNoteId}.`);
}
const FrontendScriptApi = (await import("./frontend_script_api.js")).default;
return {
modules: modules,
notes: utils.toObject(allNotes, (note) => [note.noteId, note]),

View File

@@ -1,4 +1,4 @@
import utils from "./utils.js";
import utils, { isShare } from "./utils.js";
import ValidationError from "./validation_error.js";
type Headers = Record<string, string | null | undefined>;
@@ -28,6 +28,10 @@ export interface StandardResponse {
}
async function getHeaders(headers?: Headers) {
if (isShare) {
return {};
}
const appContext = (await import("../components/app_context.js")).default;
const activeNoteContext = appContext.tabManager ? appContext.tabManager.getActiveContext() : null;
@@ -272,7 +276,8 @@ async function reportError(method: string, url: string, statusCode: number, resp
} else {
const title = `${statusCode} ${method} ${url}`;
toastService.showErrorTitleAndMessage(title, messageStr);
toastService.throwError(`${title} - ${message}`);
const { throwError } = await import("./ws.js");
throwError(`${title} - ${message}`);
}
}

View File

@@ -2,7 +2,9 @@ import { ensureMimeTypes, highlight, highlightAuto, loadTheme, Themes, type Auto
import mime_types from "./mime_types.js";
import options from "./options.js";
import { t } from "./i18n.js";
import { copyText } from "./clipboard.js";
import { copyText, copyTextWithToast } from "./clipboard_ext.js";
import { isShare } from "./utils.js";
import { MimeType } from "@triliumnext/commons";
let highlightingLoaded = false;
@@ -14,9 +16,6 @@ let highlightingLoaded = false;
*/
export async function formatCodeBlocks($container: JQuery<HTMLElement>) {
const syntaxHighlightingEnabled = isSyntaxHighlightEnabled();
if (syntaxHighlightingEnabled) {
await ensureMimeTypesForHighlighting();
}
const codeBlocks = $container.find("pre code");
for (const codeBlock of codeBlocks) {
@@ -37,7 +36,13 @@ export function applyCopyToClipboardButton($codeBlock: JQuery<HTMLElement>) {
const $copyButton = $("<button>")
.addClass("bx component icon-action tn-tool-button bx-copy copy-button")
.attr("title", t("code_block.copy_title"))
.on("click", () => copyText($codeBlock.text()));
.on("click", () => {
if (!isShare) {
copyTextWithToast($codeBlock.text());
} else {
copyText($codeBlock.text());
}
});
$codeBlock.parent().append($copyButton);
}
@@ -49,11 +54,11 @@ export async function applySingleBlockSyntaxHighlight($codeBlock: JQuery<HTMLEle
const text = $codeBlock.text();
let highlightedText: HighlightResult | AutoHighlightResult | null = null;
if (normalizedMimeType === mime_types.MIME_TYPE_AUTO) {
if (normalizedMimeType === mime_types.MIME_TYPE_AUTO && !isShare) {
await ensureMimeTypesForHighlighting();
highlightedText = highlightAuto(text);
} else if (normalizedMimeType) {
await ensureMimeTypesForHighlighting();
await ensureMimeTypesForHighlighting(normalizedMimeType);
highlightedText = highlight(text, { language: normalizedMimeType });
}
@@ -62,7 +67,7 @@ export async function applySingleBlockSyntaxHighlight($codeBlock: JQuery<HTMLEle
}
}
export async function ensureMimeTypesForHighlighting() {
export async function ensureMimeTypesForHighlighting(mimeTypeHint?: string) {
if (highlightingLoaded) {
return;
}
@@ -72,7 +77,20 @@ export async function ensureMimeTypesForHighlighting() {
loadHighlightingTheme(currentThemeName);
// Load mime types.
const mimeTypes = mime_types.getMimeTypes();
let mimeTypes: MimeType[];
if (mimeTypeHint) {
mimeTypes = [
{
title: mimeTypeHint,
enabled: true,
mime: mimeTypeHint.replace("-", "/")
}
]
} else {
mimeTypes = mime_types.getMimeTypes();
}
await ensureMimeTypes(mimeTypes);
highlightingLoaded = true;
@@ -96,8 +114,12 @@ export function loadHighlightingTheme(themeName: string) {
* @returns whether syntax highlighting should be enabled for code blocks.
*/
export function isSyntaxHighlightEnabled() {
const theme = options.get("codeBlockTheme");
return !!theme && theme !== "none";
if (!isShare) {
const theme = options.get("codeBlockTheme");
return !!theme && theme !== "none";
} else {
return true;
}
}
/**

View File

@@ -78,13 +78,7 @@ function showMessage(message: string, delay = 2000) {
});
}
function showAndLogError(message: string, delay = 10000) {
showError(message, delay);
ws.logError(message);
}
function showError(message: string, delay = 10000) {
export function showError(message: string, delay = 10000) {
console.log(utils.now(), "error: ", message);
toast({
@@ -108,18 +102,10 @@ function showErrorTitleAndMessage(title: string, message: string, delay = 10000)
});
}
function throwError(message: string) {
ws.logError(message);
throw new Error(message);
}
export default {
showMessage,
showError,
showErrorTitleAndMessage,
showAndLogError,
throwError,
showPersistent,
closePersistent
};

View File

@@ -1,9 +1,10 @@
import dayjs from "dayjs";
import { Modal } from "bootstrap";
import type { ViewScope } from "./link.js";
const SVG_MIME = "image/svg+xml";
export const isShare = !window.glob;
function reloadFrontendApp(reason?: string) {
if (reason) {
logInfo(`Frontend app reload: ${reason}`);
@@ -124,8 +125,12 @@ function formatDateISO(date: Date) {
return `${date.getFullYear()}-${padNum(date.getMonth() + 1)}-${padNum(date.getDate())}`;
}
function formatDateTime(date: Date) {
return `${formatDate(date)} ${formatTime(date)}`;
function formatDateTime(date: Date, userSuppliedFormat?: string): string {
if (userSuppliedFormat?.trim()) {
return dayjs(date).format(userSuppliedFormat);
} else {
return `${formatDate(date)} ${formatTime(date)}`;
}
}
function localNowDateTime() {
@@ -269,71 +274,6 @@ function getMimeTypeClass(mime: string) {
return `mime-${mime.toLowerCase().replace(/[\W_]+/g, "-")}`;
}
function closeActiveDialog() {
if (glob.activeDialog) {
Modal.getOrCreateInstance(glob.activeDialog[0]).hide();
glob.activeDialog = null;
}
}
let $lastFocusedElement: JQuery<HTMLElement> | null;
// perhaps there should be saved focused element per tab?
function saveFocusedElement() {
$lastFocusedElement = $(":focus");
}
function focusSavedElement() {
if (!$lastFocusedElement) {
return;
}
if ($lastFocusedElement.hasClass("ck")) {
// must handle CKEditor separately because of this bug: https://github.com/ckeditor/ckeditor5/issues/607
// the bug manifests itself in resetting the cursor position to the first character - jumping above
const editor = $lastFocusedElement.closest(".ck-editor__editable").prop("ckeditorInstance");
if (editor) {
editor.editing.view.focus();
} else {
console.log("Could not find CKEditor instance to focus last element");
}
} else {
$lastFocusedElement.focus();
}
$lastFocusedElement = null;
}
async function openDialog($dialog: JQuery<HTMLElement>, closeActDialog = true) {
if (closeActDialog) {
closeActiveDialog();
glob.activeDialog = $dialog;
}
saveFocusedElement();
Modal.getOrCreateInstance($dialog[0]).show();
$dialog.on("hidden.bs.modal", () => {
const $autocompleteEl = $(".aa-input");
if ("autocomplete" in $autocompleteEl) {
$autocompleteEl.autocomplete("close");
}
if (!glob.activeDialog || glob.activeDialog === $dialog) {
focusSavedElement();
}
});
// TODO: Fix once keyboard_actions is ported.
// @ts-ignore
const keyboardActionsService = (await import("./keyboard_actions.js")).default;
keyboardActionsService.updateDisplayedShortcuts($dialog);
return $dialog;
}
function isHtmlEmpty(html: string) {
if (!html) {
return true;
@@ -819,10 +759,6 @@ export default {
setCookie,
getNoteTypeClass,
getMimeTypeClass,
closeActiveDialog,
openDialog,
saveFocusedElement,
focusSavedElement,
isHtmlEmpty,
clearBrowserCache,
copySelectionToClipboard,

View File

@@ -17,7 +17,7 @@ let lastProcessedEntityChangeId = window.glob.maxEntityChangeIdAtLoad;
let lastPingTs: number;
let frontendUpdateDataQueue: EntityChange[] = [];
function logError(message: string) {
export function logError(message: string) {
console.error(utils.now(), message); // needs to be separate from .trace()
if (ws && ws.readyState === 1) {
@@ -301,6 +301,12 @@ setTimeout(() => {
setInterval(sendPing, 1000);
}, 0);
export function throwError(message: string) {
logError(message);
throw new Error(message);
}
export default {
logError,
subscribeToMessages,

Some files were not shown because too many files have changed in this diff Show More