mirror of
https://github.com/zadam/trilium.git
synced 2025-11-03 03:46:37 +01:00
Compare commits
31 Commits
v0.63.1-be
...
v0.63.2-be
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1f95e88cfd | ||
|
|
15677f7178 | ||
|
|
3a0bb91b77 | ||
|
|
157f894c9b | ||
|
|
e6dec701c0 | ||
|
|
450b52f6da | ||
|
|
4ef31eaf3d | ||
|
|
2d865576cf | ||
|
|
41e623b009 | ||
|
|
239786e7d1 | ||
|
|
89e1e47900 | ||
|
|
67cb926233 | ||
|
|
2f813dfc5d | ||
|
|
a939599223 | ||
|
|
fb10e0ad33 | ||
|
|
46bd5bc1ef | ||
|
|
5abfb5c08a | ||
|
|
9357caeb5a | ||
|
|
6b58e59819 | ||
|
|
c6df25ece8 | ||
|
|
ebd6276b5e | ||
|
|
92e8b155e4 | ||
|
|
e76093e75c | ||
|
|
4f8073daa7 | ||
|
|
47fb96faa8 | ||
|
|
6e33553146 | ||
|
|
807941e6a5 | ||
|
|
1e30c0702e | ||
|
|
69b686ba3b | ||
|
|
ace5660809 | ||
|
|
8bc99fd799 |
4
LICENSE
4
LICENSE
@@ -643,7 +643,7 @@ the "copyright" line and a pointer to where the full notice is found.
|
|||||||
GNU Affero General Public License for more details.
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Affero General Public License
|
You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.js.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
@@ -658,4 +658,4 @@ specific requirements.
|
|||||||
You should also get your employer (if you work as a programmer) or school,
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
For more information on this, and how to apply and follow the GNU AGPL, see
|
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||||
<http://www.js.gnu.org/licenses/>.
|
<http://www.gnu.org/licenses/>.
|
||||||
|
|||||||
@@ -1,8 +1,14 @@
|
|||||||
# Trilium Notes
|
# Trilium Notes
|
||||||
|
|
||||||
|
## Trilium is in maintenance mode - see details in https://github.com/zadam/trilium/issues/4620
|
||||||
|
|
||||||
|
Preliminary disccusions on the successor organization are taking place in [Trilium Next discussions](https://github.com/orgs/TriliumNext/discussions).
|
||||||
|
|
||||||
[](https://gitter.im/trilium-notes/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [English](https://github.com/zadam/trilium/blob/master/README.md) | [Chinese](https://github.com/zadam/trilium/blob/master/README-ZH_CN.md) | [Russian](https://github.com/zadam/trilium/blob/master/README.ru.md) | [Japanese](https://github.com/zadam/trilium/blob/master/README.ja.md)
|
[](https://gitter.im/trilium-notes/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [English](https://github.com/zadam/trilium/blob/master/README.md) | [Chinese](https://github.com/zadam/trilium/blob/master/README-ZH_CN.md) | [Russian](https://github.com/zadam/trilium/blob/master/README.ru.md) | [Japanese](https://github.com/zadam/trilium/blob/master/README.ja.md)
|
||||||
|
|
||||||
Trilium Notes is a hierarchical note taking application with focus on building large personal knowledge bases. See [screenshots](https://github.com/zadam/trilium/wiki/Screenshot-tour) for quick overview:
|
Trilium Notes is a hierarchical note taking application with focus on building large personal knowledge bases.
|
||||||
|
|
||||||
|
See [screenshots](https://github.com/zadam/trilium/wiki/Screenshot-tour) for quick overview:
|
||||||
|
|
||||||
<a href="https://github.com/zadam/trilium/wiki/Screenshot-tour"><img src="https://raw.githubusercontent.com/wiki/zadam/trilium/images/screenshot.png" alt="Trilium Screenshot" width="1000"></a>
|
<a href="https://github.com/zadam/trilium/wiki/Screenshot-tour"><img src="https://raw.githubusercontent.com/wiki/zadam/trilium/images/screenshot.png" alt="Trilium Screenshot" width="1000"></a>
|
||||||
|
|
||||||
|
|||||||
@@ -8,3 +8,6 @@ CREATE TABLE IF NOT EXISTS "blobs" (
|
|||||||
|
|
||||||
ALTER TABLE notes ADD blobId TEXT DEFAULT NULL;
|
ALTER TABLE notes ADD blobId TEXT DEFAULT NULL;
|
||||||
ALTER TABLE note_revisions ADD blobId TEXT DEFAULT NULL;
|
ALTER TABLE note_revisions ADD blobId TEXT DEFAULT NULL;
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS IDX_notes_blobId on notes (blobId);
|
||||||
|
CREATE INDEX IF NOT EXISTS IDX_note_revisions_blobId on note_revisions (blobId);
|
||||||
|
|||||||
@@ -21,5 +21,6 @@ CREATE INDEX `IDX_revisions_utcDateCreated` ON `revisions` (`utcDateCreated`);
|
|||||||
CREATE INDEX `IDX_revisions_utcDateLastEdited` ON `revisions` (`utcDateLastEdited`);
|
CREATE INDEX `IDX_revisions_utcDateLastEdited` ON `revisions` (`utcDateLastEdited`);
|
||||||
CREATE INDEX `IDX_revisions_dateCreated` ON `revisions` (`dateCreated`);
|
CREATE INDEX `IDX_revisions_dateCreated` ON `revisions` (`dateCreated`);
|
||||||
CREATE INDEX `IDX_revisions_dateLastEdited` ON `revisions` (`dateLastEdited`);
|
CREATE INDEX `IDX_revisions_dateLastEdited` ON `revisions` (`dateLastEdited`);
|
||||||
|
CREATE INDEX IF NOT EXISTS IDX_revisions_blobId on revisions (blobId);
|
||||||
|
|
||||||
UPDATE entity_changes SET entityName = 'revisions' WHERE entityName = 'note_revisions';
|
UPDATE entity_changes SET entityName = 'revisions' WHERE entityName = 'note_revisions';
|
||||||
|
|||||||
@@ -19,3 +19,5 @@ CREATE INDEX IDX_attachments_ownerId_role
|
|||||||
|
|
||||||
CREATE INDEX IDX_attachments_utcDateScheduledForErasureSince
|
CREATE INDEX IDX_attachments_utcDateScheduledForErasureSince
|
||||||
on attachments (utcDateScheduledForErasureSince);
|
on attachments (utcDateScheduledForErasureSince);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS IDX_attachments_blobId on attachments (blobId);
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* CKEditor 5 (v40.1.0) content styles.
|
* CKEditor 5 (v41.0.0) content styles.
|
||||||
* Generated on Mon, 20 Nov 2023 08:41:49 GMT.
|
* Generated on Fri, 26 Jan 2024 10:23:49 GMT.
|
||||||
* For more information, check out https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/content-styles.html
|
* For more information, check out https://ckeditor.com/docs/ckeditor5/latest/installation/advanced/content-styles.html
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -42,18 +42,6 @@
|
|||||||
overflow-wrap: break-word;
|
overflow-wrap: break-word;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
/* @ckeditor/ckeditor5-table/theme/tablecaption.css */
|
|
||||||
.ck-content .table > figcaption {
|
|
||||||
display: table-caption;
|
|
||||||
caption-side: top;
|
|
||||||
word-break: break-word;
|
|
||||||
text-align: center;
|
|
||||||
color: var(--ck-color-selector-caption-text);
|
|
||||||
background-color: var(--ck-color-selector-caption-background);
|
|
||||||
padding: .6em;
|
|
||||||
font-size: .75em;
|
|
||||||
outline-offset: -1px;
|
|
||||||
}
|
|
||||||
/* @ckeditor/ckeditor5-table/theme/table.css */
|
/* @ckeditor/ckeditor5-table/theme/table.css */
|
||||||
.ck-content .table {
|
.ck-content .table {
|
||||||
margin: 0.9em auto;
|
margin: 0.9em auto;
|
||||||
@@ -87,12 +75,17 @@
|
|||||||
.ck-content[dir="ltr"] .table th {
|
.ck-content[dir="ltr"] .table th {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
/* @ckeditor/ckeditor5-media-embed/theme/mediaembed.css */
|
/* @ckeditor/ckeditor5-table/theme/tablecaption.css */
|
||||||
.ck-content .media {
|
.ck-content .table > figcaption {
|
||||||
clear: both;
|
display: table-caption;
|
||||||
margin: 0.9em 0;
|
caption-side: top;
|
||||||
display: block;
|
word-break: break-word;
|
||||||
min-width: 15em;
|
text-align: center;
|
||||||
|
color: var(--ck-color-selector-caption-text);
|
||||||
|
background-color: var(--ck-color-selector-caption-background);
|
||||||
|
padding: .6em;
|
||||||
|
font-size: .75em;
|
||||||
|
outline-offset: -1px;
|
||||||
}
|
}
|
||||||
/* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */
|
/* @ckeditor/ckeditor5-page-break/theme/pagebreak.css */
|
||||||
.ck-content .page-break {
|
.ck-content .page-break {
|
||||||
@@ -130,6 +123,13 @@
|
|||||||
-ms-user-select: none;
|
-ms-user-select: none;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
}
|
}
|
||||||
|
/* @ckeditor/ckeditor5-media-embed/theme/mediaembed.css */
|
||||||
|
.ck-content .media {
|
||||||
|
clear: both;
|
||||||
|
margin: 0.9em 0;
|
||||||
|
display: block;
|
||||||
|
min-width: 15em;
|
||||||
|
}
|
||||||
/* @ckeditor/ckeditor5-list/theme/todolist.css */
|
/* @ckeditor/ckeditor5-list/theme/todolist.css */
|
||||||
.ck-content .todo-list {
|
.ck-content .todo-list {
|
||||||
list-style: none;
|
list-style: none;
|
||||||
@@ -280,6 +280,42 @@
|
|||||||
.ck-editor__editable.ck-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox] {
|
.ck-editor__editable.ck-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox] {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
}
|
}
|
||||||
|
/* @ckeditor/ckeditor5-list/theme/list.css */
|
||||||
|
.ck-content ol {
|
||||||
|
list-style-type: decimal;
|
||||||
|
}
|
||||||
|
/* @ckeditor/ckeditor5-list/theme/list.css */
|
||||||
|
.ck-content ol ol {
|
||||||
|
list-style-type: lower-latin;
|
||||||
|
}
|
||||||
|
/* @ckeditor/ckeditor5-list/theme/list.css */
|
||||||
|
.ck-content ol ol ol {
|
||||||
|
list-style-type: lower-roman;
|
||||||
|
}
|
||||||
|
/* @ckeditor/ckeditor5-list/theme/list.css */
|
||||||
|
.ck-content ol ol ol ol {
|
||||||
|
list-style-type: upper-latin;
|
||||||
|
}
|
||||||
|
/* @ckeditor/ckeditor5-list/theme/list.css */
|
||||||
|
.ck-content ol ol ol ol ol {
|
||||||
|
list-style-type: upper-roman;
|
||||||
|
}
|
||||||
|
/* @ckeditor/ckeditor5-list/theme/list.css */
|
||||||
|
.ck-content ul {
|
||||||
|
list-style-type: disc;
|
||||||
|
}
|
||||||
|
/* @ckeditor/ckeditor5-list/theme/list.css */
|
||||||
|
.ck-content ul ul {
|
||||||
|
list-style-type: circle;
|
||||||
|
}
|
||||||
|
/* @ckeditor/ckeditor5-list/theme/list.css */
|
||||||
|
.ck-content ul ul ul {
|
||||||
|
list-style-type: square;
|
||||||
|
}
|
||||||
|
/* @ckeditor/ckeditor5-list/theme/list.css */
|
||||||
|
.ck-content ul ul ul ul {
|
||||||
|
list-style-type: square;
|
||||||
|
}
|
||||||
/* @ckeditor/ckeditor5-image/theme/image.css */
|
/* @ckeditor/ckeditor5-image/theme/image.css */
|
||||||
.ck-content .image {
|
.ck-content .image {
|
||||||
display: table;
|
display: table;
|
||||||
@@ -318,17 +354,6 @@
|
|||||||
flex-shrink: 1;
|
flex-shrink: 1;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
/* @ckeditor/ckeditor5-image/theme/imagecaption.css */
|
|
||||||
.ck-content .image > figcaption {
|
|
||||||
display: table-caption;
|
|
||||||
caption-side: bottom;
|
|
||||||
word-break: break-word;
|
|
||||||
color: var(--ck-color-image-caption-text);
|
|
||||||
background-color: var(--ck-color-image-caption-background);
|
|
||||||
padding: .6em;
|
|
||||||
font-size: .75em;
|
|
||||||
outline-offset: -1px;
|
|
||||||
}
|
|
||||||
/* @ckeditor/ckeditor5-image/theme/imageresize.css */
|
/* @ckeditor/ckeditor5-image/theme/imageresize.css */
|
||||||
.ck-content img.image_resized {
|
.ck-content img.image_resized {
|
||||||
height: auto;
|
height: auto;
|
||||||
@@ -347,67 +372,16 @@
|
|||||||
.ck-content .image.image_resized > figcaption {
|
.ck-content .image.image_resized > figcaption {
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
|
/* @ckeditor/ckeditor5-image/theme/imagecaption.css */
|
||||||
.ck-content .marker-yellow {
|
.ck-content .image > figcaption {
|
||||||
background-color: var(--ck-highlight-marker-yellow);
|
display: table-caption;
|
||||||
}
|
caption-side: bottom;
|
||||||
/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
|
word-break: break-word;
|
||||||
.ck-content .marker-green {
|
color: var(--ck-color-image-caption-text);
|
||||||
background-color: var(--ck-highlight-marker-green);
|
background-color: var(--ck-color-image-caption-background);
|
||||||
}
|
padding: .6em;
|
||||||
/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
|
font-size: .75em;
|
||||||
.ck-content .marker-pink {
|
outline-offset: -1px;
|
||||||
background-color: var(--ck-highlight-marker-pink);
|
|
||||||
}
|
|
||||||
/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
|
|
||||||
.ck-content .marker-blue {
|
|
||||||
background-color: var(--ck-highlight-marker-blue);
|
|
||||||
}
|
|
||||||
/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
|
|
||||||
.ck-content .pen-red {
|
|
||||||
color: var(--ck-highlight-pen-red);
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
|
|
||||||
.ck-content .pen-green {
|
|
||||||
color: var(--ck-highlight-pen-green);
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
/* @ckeditor/ckeditor5-list/theme/list.css */
|
|
||||||
.ck-content ol {
|
|
||||||
list-style-type: decimal;
|
|
||||||
}
|
|
||||||
/* @ckeditor/ckeditor5-list/theme/list.css */
|
|
||||||
.ck-content ol ol {
|
|
||||||
list-style-type: lower-latin;
|
|
||||||
}
|
|
||||||
/* @ckeditor/ckeditor5-list/theme/list.css */
|
|
||||||
.ck-content ol ol ol {
|
|
||||||
list-style-type: lower-roman;
|
|
||||||
}
|
|
||||||
/* @ckeditor/ckeditor5-list/theme/list.css */
|
|
||||||
.ck-content ol ol ol ol {
|
|
||||||
list-style-type: upper-latin;
|
|
||||||
}
|
|
||||||
/* @ckeditor/ckeditor5-list/theme/list.css */
|
|
||||||
.ck-content ol ol ol ol ol {
|
|
||||||
list-style-type: upper-roman;
|
|
||||||
}
|
|
||||||
/* @ckeditor/ckeditor5-list/theme/list.css */
|
|
||||||
.ck-content ul {
|
|
||||||
list-style-type: disc;
|
|
||||||
}
|
|
||||||
/* @ckeditor/ckeditor5-list/theme/list.css */
|
|
||||||
.ck-content ul ul {
|
|
||||||
list-style-type: circle;
|
|
||||||
}
|
|
||||||
/* @ckeditor/ckeditor5-list/theme/list.css */
|
|
||||||
.ck-content ul ul ul {
|
|
||||||
list-style-type: square;
|
|
||||||
}
|
|
||||||
/* @ckeditor/ckeditor5-list/theme/list.css */
|
|
||||||
.ck-content ul ul ul ul {
|
|
||||||
list-style-type: square;
|
|
||||||
}
|
}
|
||||||
/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
|
/* @ckeditor/ckeditor5-image/theme/imagestyle.css */
|
||||||
.ck-content .image-style-block-align-left,
|
.ck-content .image-style-block-align-left,
|
||||||
@@ -470,6 +444,32 @@
|
|||||||
.ck-content .image-inline.image-style-align-right {
|
.ck-content .image-inline.image-style-align-right {
|
||||||
margin-left: var(--ck-inline-image-style-spacing);
|
margin-left: var(--ck-inline-image-style-spacing);
|
||||||
}
|
}
|
||||||
|
/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
|
||||||
|
.ck-content .marker-yellow {
|
||||||
|
background-color: var(--ck-highlight-marker-yellow);
|
||||||
|
}
|
||||||
|
/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
|
||||||
|
.ck-content .marker-green {
|
||||||
|
background-color: var(--ck-highlight-marker-green);
|
||||||
|
}
|
||||||
|
/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
|
||||||
|
.ck-content .marker-pink {
|
||||||
|
background-color: var(--ck-highlight-marker-pink);
|
||||||
|
}
|
||||||
|
/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
|
||||||
|
.ck-content .marker-blue {
|
||||||
|
background-color: var(--ck-highlight-marker-blue);
|
||||||
|
}
|
||||||
|
/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
|
||||||
|
.ck-content .pen-red {
|
||||||
|
color: var(--ck-highlight-pen-red);
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
/* @ckeditor/ckeditor5-highlight/theme/highlight.css */
|
||||||
|
.ck-content .pen-green {
|
||||||
|
color: var(--ck-highlight-pen-green);
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
/* @ckeditor/ckeditor5-block-quote/theme/blockquote.css */
|
/* @ckeditor/ckeditor5-block-quote/theme/blockquote.css */
|
||||||
.ck-content blockquote {
|
.ck-content blockquote {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|||||||
4
libraries/ckeditor/ckeditor.js
vendored
4
libraries/ckeditor/ckeditor.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1022
package-lock.json
generated
1022
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
30
package.json
30
package.json
@@ -2,7 +2,7 @@
|
|||||||
"name": "trilium",
|
"name": "trilium",
|
||||||
"productName": "Trilium Notes",
|
"productName": "Trilium Notes",
|
||||||
"description": "Trilium Notes",
|
"description": "Trilium Notes",
|
||||||
"version": "0.63.1-beta",
|
"version": "0.63.2-beta",
|
||||||
"license": "AGPL-3.0-only",
|
"license": "AGPL-3.0-only",
|
||||||
"main": "electron.js",
|
"main": "electron.js",
|
||||||
"bin": {
|
"bin": {
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
"@excalidraw/excalidraw": "0.16.1",
|
"@excalidraw/excalidraw": "0.16.1",
|
||||||
"archiver": "6.0.1",
|
"archiver": "6.0.1",
|
||||||
"async-mutex": "0.4.0",
|
"async-mutex": "0.4.0",
|
||||||
"axios": "1.6.5",
|
"axios": "1.6.2",
|
||||||
"better-sqlite3": "8.4.0",
|
"better-sqlite3": "8.4.0",
|
||||||
"boxicons": "2.1.4",
|
"boxicons": "2.1.4",
|
||||||
"chokidar": "3.5.3",
|
"chokidar": "3.5.3",
|
||||||
@@ -59,10 +59,10 @@
|
|||||||
"escape-html": "1.0.3",
|
"escape-html": "1.0.3",
|
||||||
"express": "4.18.2",
|
"express": "4.18.2",
|
||||||
"express-partial-content": "1.0.2",
|
"express-partial-content": "1.0.2",
|
||||||
"express-rate-limit": "7.1.5",
|
"express-rate-limit": "7.1.4",
|
||||||
"express-session": "1.17.3",
|
"express-session": "1.17.3",
|
||||||
"force-graph": "1.43.4",
|
"force-graph": "1.43.4",
|
||||||
"fs-extra": "11.2.0",
|
"fs-extra": "11.1.1",
|
||||||
"helmet": "7.1.0",
|
"helmet": "7.1.0",
|
||||||
"html": "1.0.0",
|
"html": "1.0.0",
|
||||||
"html2plaintext": "2.1.4",
|
"html2plaintext": "2.1.4",
|
||||||
@@ -76,13 +76,13 @@
|
|||||||
"joplin-turndown-plugin-gfm": "1.0.12",
|
"joplin-turndown-plugin-gfm": "1.0.12",
|
||||||
"jquery": "3.7.1",
|
"jquery": "3.7.1",
|
||||||
"jquery-hotkeys": "0.2.2",
|
"jquery-hotkeys": "0.2.2",
|
||||||
"jsdom": "23.2.0",
|
"jsdom": "22.1.0",
|
||||||
"katex": "0.16.9",
|
"katex": "0.16.9",
|
||||||
"marked": "9.1.6",
|
"marked": "9.1.6",
|
||||||
"mermaid": "10.6.1",
|
"mermaid": "10.6.1",
|
||||||
"mime-types": "2.1.35",
|
"mime-types": "2.1.35",
|
||||||
"multer": "1.4.5-lts.1",
|
"multer": "1.4.5-lts.1",
|
||||||
"node-abi": "3.52.0",
|
"node-abi": "3.51.0",
|
||||||
"normalize-strings": "1.1.1",
|
"normalize-strings": "1.1.1",
|
||||||
"open": "8.4.1",
|
"open": "8.4.1",
|
||||||
"panzoom": "9.4.3",
|
"panzoom": "9.4.3",
|
||||||
@@ -106,31 +106,31 @@
|
|||||||
"tree-kill": "1.2.2",
|
"tree-kill": "1.2.2",
|
||||||
"turndown": "7.1.2",
|
"turndown": "7.1.2",
|
||||||
"unescape": "1.0.1",
|
"unescape": "1.0.1",
|
||||||
"ws": "8.16.0",
|
"ws": "8.14.2",
|
||||||
"xml2js": "0.6.2",
|
"xml2js": "0.6.2",
|
||||||
"yauzl": "2.10.0"
|
"yauzl": "2.10.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"electron": "25.9.8",
|
"electron": "25.9.8",
|
||||||
"electron-builder": "24.9.1",
|
"electron-builder": "24.6.4",
|
||||||
"electron-packager": "17.1.2",
|
"electron-packager": "17.1.2",
|
||||||
"electron-rebuild": "3.2.9",
|
"electron-rebuild": "3.2.9",
|
||||||
"eslint": "8.56.0",
|
"eslint": "8.54.0",
|
||||||
"eslint-config-airbnb-base": "15.0.0",
|
"eslint-config-airbnb-base": "15.0.0",
|
||||||
"eslint-config-prettier": "9.1.0",
|
"eslint-config-prettier": "9.0.0",
|
||||||
"eslint-plugin-import": "2.29.1",
|
"eslint-plugin-import": "2.29.0",
|
||||||
"eslint-plugin-jsonc": "2.11.2",
|
"eslint-plugin-jsonc": "2.10.0",
|
||||||
"eslint-plugin-prettier": "5.0.1",
|
"eslint-plugin-prettier": "5.0.1",
|
||||||
"esm": "3.2.25",
|
"esm": "3.2.25",
|
||||||
"husky": "8.0.3",
|
"husky": "8.0.3",
|
||||||
"jasmine": "5.1.0",
|
"jasmine": "5.1.0",
|
||||||
"jsdoc": "4.0.2",
|
"jsdoc": "4.0.2",
|
||||||
"jsonc-eslint-parser": "2.4.0",
|
"jsonc-eslint-parser": "2.4.0",
|
||||||
"lint-staged": "15.2.0",
|
"lint-staged": "15.1.0",
|
||||||
"lorem-ipsum": "2.0.8",
|
"lorem-ipsum": "2.0.8",
|
||||||
"nodemon": "3.0.2",
|
"nodemon": "3.0.1",
|
||||||
"prettier": "3.1.1",
|
"prettier": "3.1.0",
|
||||||
"rcedit": "4.0.1",
|
"rcedit": "4.0.1",
|
||||||
"webpack": "5.89.0",
|
"webpack": "5.89.0",
|
||||||
"webpack-cli": "5.1.4"
|
"webpack-cli": "5.1.4"
|
||||||
|
|||||||
@@ -107,6 +107,13 @@ async function deleteNotes(branchIdsToDelete, forceDeleteAllClones = false) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
await activateParentNotePath();
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
|
||||||
const taskId = utils.randomString(10);
|
const taskId = utils.randomString(10);
|
||||||
|
|
||||||
let counter = 0;
|
let counter = 0;
|
||||||
@@ -134,6 +141,16 @@ async function deleteNotes(branchIdsToDelete, forceDeleteAllClones = false) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function activateParentNotePath() {
|
||||||
|
// this is not perfect, maybe we should find the next/previous sibling, but that's more complex
|
||||||
|
const activeContext = appContext.tabManager.getActiveContext();
|
||||||
|
const parentNotePathArr = activeContext.notePathArray.slice(0, -1);
|
||||||
|
|
||||||
|
if (parentNotePathArr.length > 0) {
|
||||||
|
activeContext.setNote(parentNotePathArr.join("/"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function moveNodeUpInHierarchy(node) {
|
async function moveNodeUpInHierarchy(node) {
|
||||||
if (hoistedNoteService.isHoistedNode(node)
|
if (hoistedNoteService.isHoistedNode(node)
|
||||||
|| hoistedNoteService.isTopLevelNode(node)
|
|| hoistedNoteService.isTopLevelNode(node)
|
||||||
|
|||||||
@@ -48,11 +48,11 @@ async function checkNoteAccess(notePath, noteContext) {
|
|||||||
|
|
||||||
const hoistedNoteId = noteContext.hoistedNoteId;
|
const hoistedNoteId = noteContext.hoistedNoteId;
|
||||||
|
|
||||||
if (!resolvedNotePath.includes(hoistedNoteId) && !resolvedNotePath.includes('_hidden')) {
|
if (!resolvedNotePath.includes(hoistedNoteId) && (!resolvedNotePath.includes('_hidden') || resolvedNotePath.includes('_lbBookmarks'))) {
|
||||||
const requestedNote = await froca.getNote(treeService.getNoteIdFromUrl(resolvedNotePath));
|
const requestedNote = await froca.getNote(treeService.getNoteIdFromUrl(resolvedNotePath));
|
||||||
const hoistedNote = await froca.getNote(hoistedNoteId);
|
const hoistedNote = await froca.getNote(hoistedNoteId);
|
||||||
|
|
||||||
if (!hoistedNote.hasAncestor('_hidden')
|
if ((!hoistedNote.hasAncestor('_hidden') || resolvedNotePath.includes('_lbBookmarks'))
|
||||||
&& !await dialogService.confirm(`Requested note '${requestedNote.title}' is outside of hoisted note '${hoistedNote.title}' subtree and you must unhoist to access the note. Do you want to proceed with unhoisting?`)) {
|
&& !await dialogService.confirm(`Requested note '${requestedNote.title}' is outside of hoisted note '${hoistedNote.title}' subtree and you must unhoist to access the note. Do you want to proceed with unhoisting?`)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -200,7 +200,7 @@ export default class AttributeEditorWidget extends NoteContextAwareWidget {
|
|||||||
this.attributeDetailWidget.hide();
|
this.attributeDetailWidget.hide();
|
||||||
});
|
});
|
||||||
|
|
||||||
this.$editor.on('blur', () => this.save());
|
this.$editor.on('blur', () => setTimeout(() => this.save(), 100)); // Timeout to fix https://github.com/zadam/trilium/issues/4160
|
||||||
|
|
||||||
this.$addNewAttributeButton = this.$widget.find('.add-new-attribute-button');
|
this.$addNewAttributeButton = this.$widget.find('.add-new-attribute-button');
|
||||||
this.$addNewAttributeButton.on('click', e => this.addNewAttribute(e));
|
this.$addNewAttributeButton.on('click', e => this.addNewAttribute(e));
|
||||||
|
|||||||
@@ -8,10 +8,13 @@ export default class RightPaneContainer extends FlexContainer {
|
|||||||
this.id('right-pane');
|
this.id('right-pane');
|
||||||
this.css('height', '100%');
|
this.css('height', '100%');
|
||||||
this.collapsible();
|
this.collapsible();
|
||||||
|
|
||||||
|
this.rightPaneHidden = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
isEnabled() {
|
isEnabled() {
|
||||||
return super.isEnabled()
|
return super.isEnabled()
|
||||||
|
&& !this.rightPaneHidden
|
||||||
&& this.children.length > 0
|
&& this.children.length > 0
|
||||||
&& !!this.children.find(ch => ch.isEnabled() && ch.canBeShown());
|
&& !!this.children.find(ch => ch.isEnabled() && ch.canBeShown());
|
||||||
}
|
}
|
||||||
@@ -44,4 +47,10 @@ export default class RightPaneContainer extends FlexContainer {
|
|||||||
splitService.setupRightPaneResizer();
|
splitService.setupRightPaneResizer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
toggleRightPaneEvent() {
|
||||||
|
this.rightPaneHidden = !this.rightPaneHidden;
|
||||||
|
|
||||||
|
this.reEvaluateRightPaneVisibilityCommand();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1091,7 +1091,9 @@ export default class NoteTreeWidget extends NoteContextAwareWidget {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const nodeCtx = this.#getActiveNodeCtx();
|
const activeNode = this.getActiveNode();
|
||||||
|
const activeNodeFocused = activeNode?.hasFocus();
|
||||||
|
const activeNotePath = activeNode ? treeService.getNotePath(activeNode) : null;
|
||||||
|
|
||||||
const refreshCtx = {
|
const refreshCtx = {
|
||||||
noteIdsToUpdate: new Set(),
|
noteIdsToUpdate: new Set(),
|
||||||
@@ -1108,7 +1110,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget {
|
|||||||
|
|
||||||
await this.#executeTreeUpdates(refreshCtx, loadResults);
|
await this.#executeTreeUpdates(refreshCtx, loadResults);
|
||||||
|
|
||||||
await this.#setActiveNode(nodeCtx, movedActiveNode, parentsOfAddedNodes);
|
await this.#setActiveNode(activeNotePath, activeNodeFocused, movedActiveNode, parentsOfAddedNodes);
|
||||||
|
|
||||||
if (refreshCtx.noteIdsToReload.size > 0 || refreshCtx.noteIdsToUpdate.size > 0) {
|
if (refreshCtx.noteIdsToReload.size > 0 || refreshCtx.noteIdsToUpdate.size > 0) {
|
||||||
// workaround for https://github.com/mar10/fancytree/issues/1054
|
// workaround for https://github.com/mar10/fancytree/issues/1054
|
||||||
@@ -1257,73 +1259,42 @@ export default class NoteTreeWidget extends NoteContextAwareWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#getActiveNodeCtx() {
|
async #setActiveNode(activeNotePath, activeNodeFocused, movedActiveNode, parentsOfAddedNodes) {
|
||||||
const nodeCtx = {
|
|
||||||
activeNotePath: null,
|
|
||||||
activeNodeFocused: null,
|
|
||||||
nextNotePath: null
|
|
||||||
};
|
|
||||||
|
|
||||||
const activeNode = this.getActiveNode();
|
|
||||||
nodeCtx.activeNodeFocused = activeNode?.hasFocus();
|
|
||||||
nodeCtx.activeNotePath = activeNode ? treeService.getNotePath(activeNode) : null;
|
|
||||||
const nextNode = activeNode ? (activeNode.getNextSibling() || activeNode.getPrevSibling() || activeNode.getParent()) : null;
|
|
||||||
nodeCtx.nextNotePath = nextNode ? treeService.getNotePath(nextNode) : null;
|
|
||||||
return nodeCtx;
|
|
||||||
}
|
|
||||||
|
|
||||||
async #setActiveNode(nodeCtx, movedActiveNode, parentsOfAddedNodes) {
|
|
||||||
if (movedActiveNode) {
|
if (movedActiveNode) {
|
||||||
for (const parentNode of parentsOfAddedNodes) {
|
for (const parentNode of parentsOfAddedNodes) {
|
||||||
const foundNode = (parentNode.getChildren() || []).find(child => child.data.noteId === movedActiveNode.data.noteId);
|
const foundNode = (parentNode.getChildren() || []).find(child => child.data.noteId === movedActiveNode.data.noteId);
|
||||||
if (foundNode) {
|
if (foundNode) {
|
||||||
nodeCtx.activeNotePath = treeService.getNotePath(foundNode);
|
activeNotePath = treeService.getNotePath(foundNode);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!nodeCtx.activeNotePath) {
|
if (!activeNotePath) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let node = await this.expandToNote(nodeCtx.activeNotePath, false);
|
let node = await this.expandToNote(activeNotePath, false);
|
||||||
if (node && node.data.noteId !== treeService.getNoteIdFromUrl(nodeCtx.activeNotePath)) {
|
|
||||||
|
if (node && node.data.noteId !== treeService.getNoteIdFromUrl(activeNotePath)) {
|
||||||
// if the active note has been moved elsewhere then it won't be found by the path,
|
// if the active note has been moved elsewhere then it won't be found by the path,
|
||||||
// so we switch to the alternative of trying to find it by noteId
|
// so we switch to the alternative of trying to find it by noteId
|
||||||
const notesById = this.getNodesByNoteId(treeService.getNoteIdFromUrl(nodeCtx.activeNotePath));
|
const notesById = this.getNodesByNoteId(treeService.getNoteIdFromUrl(activeNotePath));
|
||||||
|
|
||||||
// if there are multiple clones, then we'd rather not activate anyone
|
// if there are multiple clones, then we'd rather not activate anyone
|
||||||
node = notesById.length === 1 ? notesById[0] : null;
|
node = notesById.length === 1 ? notesById[0] : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node) {
|
if (!node) {
|
||||||
if (nodeCtx.activeNodeFocused) {
|
return;
|
||||||
// needed by Firefox: https://github.com/zadam/trilium/issues/1865
|
|
||||||
this.tree.$container.focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
await node.setActive(true, {noEvents: true, noFocus: !nodeCtx.activeNodeFocused});
|
|
||||||
} else {
|
|
||||||
// this is used when the original note has been deleted, and we want to move the focus to the note above/below
|
|
||||||
node = await this.expandToNote(nodeCtx.nextNotePath, false);
|
|
||||||
|
|
||||||
if (node) {
|
|
||||||
// FIXME: this is conceptually wrong
|
|
||||||
// here note tree is responsible for updating global state of the application
|
|
||||||
// this should be done by NoteContext / TabManager and note tree should only listen to
|
|
||||||
// changes in active note and just set the "active" state
|
|
||||||
// We don't await since that can bring up infinite cycles when e.g. custom widget does some backend requests which wait for max sync ID processed
|
|
||||||
appContext.tabManager.getActiveContext().setNote(nodeCtx.nextNotePath).then(() => {
|
|
||||||
const newActiveNode = this.getActiveNode();
|
|
||||||
|
|
||||||
// return focus if the previously active node was also focused
|
|
||||||
if (newActiveNode && nodeCtx.activeNodeFocused) {
|
|
||||||
newActiveNode.setFocus(true);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (activeNodeFocused) {
|
||||||
|
// needed by Firefox: https://github.com/zadam/trilium/issues/1865
|
||||||
|
this.tree.$container.focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
await node.setActive(true, {noEvents: true, noFocus: !activeNodeFocused});
|
||||||
}
|
}
|
||||||
|
|
||||||
sortChildren(node) {
|
sortChildren(node) {
|
||||||
|
|||||||
@@ -30,9 +30,14 @@ const TPL = `
|
|||||||
height: 40px;
|
height: 40px;
|
||||||
width: 40px;
|
width: 40px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.title-bar-buttons .top-btn.active{
|
.title-bar-buttons .top-btn.active{
|
||||||
background-color:var(--accented-background-color);
|
background-color:var(--accented-background-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.title-bar-buttons .btn.focus, .title-bar-buttons .btn:focus {
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<!-- divs act as a hitbox for the buttons, making them clickable on corners -->
|
<!-- divs act as a hitbox for the buttons, making them clickable on corners -->
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ const TPL = `
|
|||||||
<h5>Highlights List visibility</h5>
|
<h5>Highlights List visibility</h5>
|
||||||
|
|
||||||
<p>You can hide the highlights widget per-note by adding a <code>#hideHighlightWidget</code> label.</p>
|
<p>You can hide the highlights widget per-note by adding a <code>#hideHighlightWidget</code> label.</p>
|
||||||
|
|
||||||
|
<p>You can configure a keyboard shortcut for quickly toggling the right pane (including Highlights) in the Options -> Shortcuts (name "toggleRightPane").</p>
|
||||||
</div>`;
|
</div>`;
|
||||||
|
|
||||||
export default class HighlightsListOptions extends OptionsWidget {
|
export default class HighlightsListOptions extends OptionsWidget {
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ const TPL = `
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p>You can also use this option to effectively disable TOC by setting a very high number.</p>
|
<p>You can also use this option to effectively disable TOC by setting a very high number.</p>
|
||||||
|
|
||||||
|
<p>You can configure a keyboard shortcut for quickly toggling the right pane (including TOC) in the Options -> Shortcuts (name "toggleRightPane").</p>
|
||||||
</div>`;
|
</div>`;
|
||||||
|
|
||||||
export default class TableOfContentsOptions extends OptionsWidget {
|
export default class TableOfContentsOptions extends OptionsWidget {
|
||||||
|
|||||||
@@ -9,14 +9,9 @@
|
|||||||
"start_url": "/",
|
"start_url": "/",
|
||||||
"icons": [
|
"icons": [
|
||||||
{
|
{
|
||||||
"src": "/assets/vX/images/app-icons/ios/apple-touch-icon.png",
|
"src": "favicon.ico",
|
||||||
"sizes": "180x180",
|
"sizes": "180x180 512x512",
|
||||||
"type": "image/png"
|
"type": "image/x-icon"
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "/assets/vX/images/app-icons/png/512x512.png",
|
|
||||||
"sizes": "512x512",
|
|
||||||
"type": "image/png"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ body {
|
|||||||
|
|
||||||
--ck-color-base-text: var(--main-text-color);
|
--ck-color-base-text: var(--main-text-color);
|
||||||
--ck-color-base-foreground: var(--accented-background-color);
|
--ck-color-base-foreground: var(--accented-background-color);
|
||||||
|
--ck-color-base-background: var(--main-background-color);
|
||||||
--ck-color-focus-border: var(--main-border-color);
|
--ck-color-focus-border: var(--main-border-color);
|
||||||
--ck-color-text: var(--main-text-color);
|
--ck-color-text: var(--main-text-color);
|
||||||
--ck-color-shadow-drop: var(--main-background-color);
|
--ck-color-shadow-drop: var(--main-background-color);
|
||||||
|
|||||||
@@ -43,12 +43,16 @@ const optionsService = require('./options.js');
|
|||||||
*/
|
*/
|
||||||
function BackendScriptApi(currentNote, apiParams) {
|
function BackendScriptApi(currentNote, apiParams) {
|
||||||
/**
|
/**
|
||||||
* Note where the script started executing
|
* Note where the script started executing (entrypoint).
|
||||||
|
* As an analogy, in C this would be the file which contains the main() function of the current process.
|
||||||
* @type {BNote}
|
* @type {BNote}
|
||||||
*/
|
*/
|
||||||
this.startNote = apiParams.startNote;
|
this.startNote = apiParams.startNote;
|
||||||
/**
|
/**
|
||||||
* Note where the script is currently executing. Don't mix this up with the concept of active note
|
* Note where the script is currently executing. This comes into play when your script is spread in multiple code
|
||||||
|
* notes, the script starts in "startNote", but then through function calls may jump into another note (currentNote).
|
||||||
|
* A similar concept in C would be __FILE__
|
||||||
|
* Don't mix this up with the concept of active note.
|
||||||
* @type {BNote}
|
* @type {BNote}
|
||||||
*/
|
*/
|
||||||
this.currentNote = currentNote;
|
this.currentNote = currentNote;
|
||||||
@@ -288,7 +292,7 @@ function BackendScriptApi(currentNote, apiParams) {
|
|||||||
* @param {string} params.parentNoteId
|
* @param {string} params.parentNoteId
|
||||||
* @param {string} params.title
|
* @param {string} params.title
|
||||||
* @param {string|Buffer} params.content
|
* @param {string|Buffer} params.content
|
||||||
* @param {NoteType} params.type - text, code, file, image, search, book, relationMap, canvas
|
* @param {NoteType} params.type - text, code, file, image, search, book, relationMap, canvas, webView
|
||||||
* @param {string} [params.mime] - value is derived from default mimes for type
|
* @param {string} [params.mime] - value is derived from default mimes for type
|
||||||
* @param {boolean} [params.isProtected=false]
|
* @param {boolean} [params.isProtected=false]
|
||||||
* @param {boolean} [params.isExpanded=false]
|
* @param {boolean} [params.isExpanded=false]
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
module.exports = { buildDate:"2024-01-12T00:02:50+01:00", buildRevision: "17e063f01d3b6c7a601630feaa96191d26095650" };
|
module.exports = { buildDate:"2024-02-17T22:47:50+01:00", buildRevision: "15677f71785fd81298b94df70855233d1578629c" };
|
||||||
|
|||||||
@@ -48,6 +48,14 @@ function isEntityEventsDisabled() {
|
|||||||
return !!namespace.get('disableEntityEvents');
|
return !!namespace.get('disableEntityEvents');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setMigrationRunning(running) {
|
||||||
|
namespace.set('migrationRunning', !!running);
|
||||||
|
}
|
||||||
|
|
||||||
|
function isMigrationRunning() {
|
||||||
|
return !!namespace.get('migrationRunning');
|
||||||
|
}
|
||||||
|
|
||||||
function disableSlowQueryLogging(disable) {
|
function disableSlowQueryLogging(disable) {
|
||||||
namespace.set('disableSlowQueryLogging', disable);
|
namespace.set('disableSlowQueryLogging', disable);
|
||||||
}
|
}
|
||||||
@@ -102,5 +110,7 @@ module.exports = {
|
|||||||
putEntityChange,
|
putEntityChange,
|
||||||
ignoreEntityChangeIds,
|
ignoreEntityChangeIds,
|
||||||
disableSlowQueryLogging,
|
disableSlowQueryLogging,
|
||||||
isSlowQueryLoggingDisabled
|
isSlowQueryLoggingDisabled,
|
||||||
|
setMigrationRunning,
|
||||||
|
isMigrationRunning
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -494,9 +494,16 @@ const DEFAULT_KEYBOARD_ACTIONS = [
|
|||||||
separator: "Other"
|
separator: "Other"
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
actionName: "toggleRightPane",
|
||||||
|
defaultShortcuts: [],
|
||||||
|
description: "Toggle the display of the right pane, which includes Table of Contents and Highlights",
|
||||||
|
scope: "window"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
actionName: "printActiveNote",
|
actionName: "printActiveNote",
|
||||||
defaultShortcuts: [],
|
defaultShortcuts: [],
|
||||||
|
description: "Print active note",
|
||||||
scope: "window"
|
scope: "window"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -5,12 +5,13 @@ const log = require('./log.js');
|
|||||||
const utils = require('./utils.js');
|
const utils = require('./utils.js');
|
||||||
const resourceDir = require('./resource_dir.js');
|
const resourceDir = require('./resource_dir.js');
|
||||||
const appInfo = require('./app_info.js');
|
const appInfo = require('./app_info.js');
|
||||||
|
const cls = require('./cls.js');
|
||||||
|
|
||||||
async function migrate() {
|
async function migrate() {
|
||||||
const currentDbVersion = getDbVersion();
|
const currentDbVersion = getDbVersion();
|
||||||
|
|
||||||
if (currentDbVersion < 214) {
|
if (currentDbVersion < 214) {
|
||||||
log.error("Direct migration from your current version is not supported. Please upgrade to the latest v0.60.X first and only then to this version.");
|
log.error("Direct migration from your current version is not supported. Please upgrade to the latest v0.60.4 first and only then to this version.");
|
||||||
|
|
||||||
utils.crash();
|
utils.crash();
|
||||||
return;
|
return;
|
||||||
@@ -18,7 +19,7 @@ async function migrate() {
|
|||||||
|
|
||||||
// backup before attempting migration
|
// backup before attempting migration
|
||||||
await backupService.backupNow(
|
await backupService.backupNow(
|
||||||
// creating a special backup for versions 0.60.X, the changes in 0.61 are major.
|
// creating a special backup for version 0.60.4, the changes in 0.61 are major.
|
||||||
currentDbVersion === 214
|
currentDbVersion === 214
|
||||||
? `before-migration-v060`
|
? `before-migration-v060`
|
||||||
: 'before-migration'
|
: 'before-migration'
|
||||||
@@ -51,6 +52,9 @@ async function migrate() {
|
|||||||
// all migrations are executed in one transaction - upgrade either succeeds, or the user can stay at the old version
|
// all migrations are executed in one transaction - upgrade either succeeds, or the user can stay at the old version
|
||||||
// otherwise if half of the migrations succeed, user can't use any version - DB is too "new" for the old app,
|
// otherwise if half of the migrations succeed, user can't use any version - DB is too "new" for the old app,
|
||||||
// and too old for the new app version.
|
// and too old for the new app version.
|
||||||
|
|
||||||
|
cls.setMigrationRunning(true);
|
||||||
|
|
||||||
sql.transactional(() => {
|
sql.transactional(() => {
|
||||||
for (const mig of migrations) {
|
for (const mig of migrations) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -895,6 +895,11 @@ function scanForLinks(note, content) {
|
|||||||
* Things which have to be executed after updating content, but asynchronously (separate transaction)
|
* Things which have to be executed after updating content, but asynchronously (separate transaction)
|
||||||
*/
|
*/
|
||||||
async function asyncPostProcessContent(note, content) {
|
async function asyncPostProcessContent(note, content) {
|
||||||
|
if (cls.isMigrationRunning()) {
|
||||||
|
// this is rarely needed for migrations, but can cause trouble by e.g. triggering downloads
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (note.hasStringContent() && !utils.isString(content)) {
|
if (note.hasStringContent() && !utils.isString(content)) {
|
||||||
content = content.toString();
|
content = content.toString();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<link rel="shortcut icon" href="favicon.ico">
|
<link rel="shortcut icon" href="favicon.ico">
|
||||||
<link rel="manifest" href="manifest.webmanifest">
|
<link rel="manifest" crossorigin="use-credentials" href="manifest.webmanifest">
|
||||||
<title>Trilium Notes</title>
|
<title>Trilium Notes</title>
|
||||||
</head>
|
</head>
|
||||||
<body class="desktop heading-style-<%= headingStyle %>">
|
<body class="desktop heading-style-<%= headingStyle %>">
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||||
<meta name="theme-color" content="#fff">
|
<meta name="theme-color" content="#fff">
|
||||||
<title>Trilium Notes</title>
|
<title>Trilium Notes</title>
|
||||||
<link rel="manifest" href="manifest.webmanifest">
|
<link rel="manifest" crossorigin="use-credentials" href="manifest.webmanifest">
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.lds-roller {
|
.lds-roller {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
[[ ! -z "${USER_UID}" ]] && usermod -u ${USER_UID} node || echo "No USER_UID specified, leaving 1000"
|
[[ ! -z "${USER_UID}" ]] && usermod -u ${USER_UID} node || echo "No USER_UID specified, leaving 1000"
|
||||||
[[ ! -z "${USER_GID}" ]] && groupmod -g ${USER_GID} node || echo "No USER_GID specified, leaving 1000"
|
[[ ! -z "${USER_GID}" ]] && groupmod -og ${USER_GID} node || echo "No USER_GID specified, leaving 1000"
|
||||||
|
|
||||||
chown -R node:node /home/node
|
chown -R node:node /home/node
|
||||||
exec su-exec node node ./src/www
|
exec su-exec node node ./src/www
|
||||||
|
|||||||
Reference in New Issue
Block a user