mirror of
https://github.com/zadam/trilium.git
synced 2025-03-01 14:22:32 +01:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
ad8b7f67b1
@ -41,6 +41,10 @@ Trilium is provided as either desktop application (Linux and Windows) or web app
|
|||||||
* If you want to install Trilium on server, follow [this page](https://github.com/zadam/trilium/wiki/Server-installation).
|
* If you want to install Trilium on server, follow [this page](https://github.com/zadam/trilium/wiki/Server-installation).
|
||||||
* Currently only recent Chrome and Firefox are supported (tested) browsers.
|
* Currently only recent Chrome and Firefox are supported (tested) browsers.
|
||||||
|
|
||||||
|
Trilium is also provided as a Flatpak:
|
||||||
|
|
||||||
|
[<img width="240" src="https://flathub.org/assets/badges/flathub-badge-en.png">](https://flathub.org/apps/details/com.github.zadam.trilium)
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
[See wiki for complete list of documentation pages.](https://github.com/zadam/trilium/wiki/)
|
[See wiki for complete list of documentation pages.](https://github.com/zadam/trilium/wiki/)
|
||||||
|
@ -5,8 +5,8 @@ UPDATE note_contents SET content = 'text' WHERE content IS NOT NULL;
|
|||||||
UPDATE note_revisions SET title = 'title';
|
UPDATE note_revisions SET title = 'title';
|
||||||
UPDATE note_revision_contents SET content = 'text' WHERE content IS NOT NULL;
|
UPDATE note_revision_contents SET content = 'text' WHERE content IS NOT NULL;
|
||||||
|
|
||||||
UPDATE attributes SET name = 'name', value = 'value' WHERE type = 'label' AND name NOT IN('inbox', 'disableVersioning', 'calendarRoot', 'archived', 'excludeFromExport', 'disableInclusion', 'appCss', 'appTheme', 'hidePromotedAttributes', 'readOnly', 'autoReadOnlyDisabled', 'hoistedCssClass', 'cssClass', 'iconClass', 'keyboardShortcut', 'run', 'runOnInstance', 'runAtHour', 'customRequestHandler', 'customResourceProvider', 'widget', 'noteInfoWidgetDisabled', 'linkMapWidgetDisabled', 'noteRevisionsWidgetDisabled', 'whatLinksHereWidgetDisabled', 'similarNotesWidgetDisabled', 'workspace', 'workspaceIconClass', 'workspaceTabBackgroundColor', 'searchHome', 'hoistedInbox', 'hoistedSearchHome', 'sqlConsoleHome', 'datePattern', 'pageSize', 'viewType', 'mapRootNoteId', 'bookmarked', 'bookmarkFolder', 'sorted', 'top', 'fullContentWidth', 'shareHiddenFromTree', 'shareAlias', 'shareOmitDefaultCss', 'shareRoot', 'internalLink', 'imageLink', 'relationMapLink', 'includeMapLink', 'runOnNoteCreation', 'runOnNoteTitleChange', 'runOnNoteChange', 'runOnChildNoteCreation', 'runOnAttributeCreation', 'runOnAttributeChange', 'template', 'widget', 'renderNote', 'shareCss', 'shareJs', 'shareFavicon');
|
UPDATE attributes SET name = 'name', value = 'value' WHERE type = 'label' AND name NOT IN('inbox', 'disableVersioning', 'calendarRoot', 'archived', 'excludeFromExport', 'disableInclusion', 'appCss', 'appTheme', 'hidePromotedAttributes', 'readOnly', 'autoReadOnlyDisabled', 'hoistedCssClass', 'cssClass', 'iconClass', 'keyboardShortcut', 'run', 'runOnInstance', 'runAtHour', 'customRequestHandler', 'customResourceProvider', 'widget', 'noteInfoWidgetDisabled', 'linkMapWidgetDisabled', 'noteRevisionsWidgetDisabled', 'whatLinksHereWidgetDisabled', 'similarNotesWidgetDisabled', 'workspace', 'workspaceIconClass', 'workspaceTabBackgroundColor', 'searchHome', 'hoistedInbox', 'hoistedSearchHome', 'sqlConsoleHome', 'datePattern', 'pageSize', 'viewType', 'mapRootNoteId', 'bookmarked', 'bookmarkFolder', 'sorted', 'top', 'fullContentWidth', 'shareHiddenFromTree', 'shareAlias', 'shareOmitDefaultCss', 'shareRoot', 'shareDescription', 'internalLink', 'imageLink', 'relationMapLink', 'includeMapLink', 'runOnNoteCreation', 'runOnNoteTitleChange', 'runOnNoteChange', 'runOnChildNoteCreation', 'runOnAttributeCreation', 'runOnAttributeChange', 'template', 'widget', 'renderNote', 'shareCss', 'shareJs', 'shareFavicon');
|
||||||
UPDATE attributes SET name = 'name' WHERE type = 'relation' AND name NOT IN ('inbox', 'disableVersioning', 'calendarRoot', 'archived', 'excludeFromExport', 'disableInclusion', 'appCss', 'appTheme', 'hidePromotedAttributes', 'readOnly', 'autoReadOnlyDisabled', 'hoistedCssClass', 'cssClass', 'iconClass', 'keyboardShortcut', 'run', 'runOnInstance', 'runAtHour', 'customRequestHandler', 'customResourceProvider', 'widget', 'noteInfoWidgetDisabled', 'linkMapWidgetDisabled', 'noteRevisionsWidgetDisabled', 'whatLinksHereWidgetDisabled', 'similarNotesWidgetDisabled', 'workspace', 'workspaceIconClass', 'workspaceTabBackgroundColor', 'searchHome', 'hoistedInbox', 'hoistedSearchHome', 'sqlConsoleHome', 'datePattern', 'pageSize', 'viewType', 'mapRootNoteId', 'bookmarked', 'bookmarkFolder', 'sorted', 'top', 'fullContentWidth', 'shareHiddenFromTree', 'shareAlias', 'shareOmitDefaultCss', 'shareRoot', 'internalLink', 'imageLink', 'relationMapLink', 'includeMapLink', 'runOnNoteCreation', 'runOnNoteTitleChange', 'runOnNoteChange', 'runOnChildNoteCreation', 'runOnAttributeCreation', 'runOnAttributeChange', 'template', 'widget', 'renderNote', 'shareCss', 'shareJs', 'shareFavicon');
|
UPDATE attributes SET name = 'name' WHERE type = 'relation' AND name NOT IN ('inbox', 'disableVersioning', 'calendarRoot', 'archived', 'excludeFromExport', 'disableInclusion', 'appCss', 'appTheme', 'hidePromotedAttributes', 'readOnly', 'autoReadOnlyDisabled', 'hoistedCssClass', 'cssClass', 'iconClass', 'keyboardShortcut', 'run', 'runOnInstance', 'runAtHour', 'customRequestHandler', 'customResourceProvider', 'widget', 'noteInfoWidgetDisabled', 'linkMapWidgetDisabled', 'noteRevisionsWidgetDisabled', 'whatLinksHereWidgetDisabled', 'similarNotesWidgetDisabled', 'workspace', 'workspaceIconClass', 'workspaceTabBackgroundColor', 'searchHome', 'hoistedInbox', 'hoistedSearchHome', 'sqlConsoleHome', 'datePattern', 'pageSize', 'viewType', 'mapRootNoteId', 'bookmarked', 'bookmarkFolder', 'sorted', 'top', 'fullContentWidth', 'shareHiddenFromTree', 'shareAlias', 'shareOmitDefaultCss', 'shareRoot', 'shareDescription', 'internalLink', 'imageLink', 'relationMapLink', 'includeMapLink', 'runOnNoteCreation', 'runOnNoteTitleChange', 'runOnNoteChange', 'runOnChildNoteCreation', 'runOnAttributeCreation', 'runOnAttributeChange', 'template', 'widget', 'renderNote', 'shareCss', 'shareJs', 'shareFavicon');
|
||||||
UPDATE branches SET prefix = 'prefix' WHERE prefix IS NOT NULL AND prefix != 'recovered';
|
UPDATE branches SET prefix = 'prefix' WHERE prefix IS NOT NULL AND prefix != 'recovered';
|
||||||
UPDATE options SET value = 'anonymized' WHERE name IN
|
UPDATE options SET value = 'anonymized' WHERE name IN
|
||||||
('documentId', 'documentSecret', 'encryptedDataKey',
|
('documentId', 'documentSecret', 'encryptedDataKey',
|
||||||
|
@ -5,6 +5,7 @@ const favicon = require('serve-favicon');
|
|||||||
const cookieParser = require('cookie-parser');
|
const cookieParser = require('cookie-parser');
|
||||||
const helmet = require('helmet');
|
const helmet = require('helmet');
|
||||||
const session = require('express-session');
|
const session = require('express-session');
|
||||||
|
const compression = require('compression')
|
||||||
const FileStore = require('session-file-store')(session);
|
const FileStore = require('session-file-store')(session);
|
||||||
const sessionSecret = require('./services/session_secret');
|
const sessionSecret = require('./services/session_secret');
|
||||||
const dataDir = require('./services/data_dir');
|
const dataDir = require('./services/data_dir');
|
||||||
@ -18,6 +19,9 @@ const app = express();
|
|||||||
app.set('views', path.join(__dirname, 'views'));
|
app.set('views', path.join(__dirname, 'views'));
|
||||||
app.set('view engine', 'ejs');
|
app.set('view engine', 'ejs');
|
||||||
|
|
||||||
|
// add compression
|
||||||
|
app.use(compression())
|
||||||
|
|
||||||
app.use(helmet({
|
app.use(helmet({
|
||||||
hidePoweredBy: false, // errors out in electron
|
hidePoweredBy: false, // errors out in electron
|
||||||
contentSecurityPolicy: false,
|
contentSecurityPolicy: false,
|
||||||
|
@ -216,6 +216,7 @@ const ATTR_HELP = {
|
|||||||
"shareAlias": "define an alias using which the note will be available under https://your_trilium_host/share/[your_alias]",
|
"shareAlias": "define an alias using which the note will be available under https://your_trilium_host/share/[your_alias]",
|
||||||
"shareOmitDefaultCss": "default share page CSS will be omitted. Use when you make extensive styling changes.",
|
"shareOmitDefaultCss": "default share page CSS will be omitted. Use when you make extensive styling changes.",
|
||||||
"shareRoot": "marks note which is served on /share root.",
|
"shareRoot": "marks note which is served on /share root.",
|
||||||
|
"shareDescription": "define text to be added to the HTML meta tag for description",
|
||||||
"shareRaw": "note will be served in its raw format, without HTML wrapper",
|
"shareRaw": "note will be served in its raw format, without HTML wrapper",
|
||||||
"shareDisallowRobotIndexing": `will forbid robot indexing of this note via <code>X-Robots-Tag: noindex</code> header`,
|
"shareDisallowRobotIndexing": `will forbid robot indexing of this note via <code>X-Robots-Tag: noindex</code> header`,
|
||||||
"shareCredentials": "require credentials to access this shared note. Value is expected to be in format 'username:password'. Don't forget to make this inheritable to apply to child-notes/images.",
|
"shareCredentials": "require credentials to access this shared note. Value is expected to be in format 'username:password'. Don't forget to make this inheritable to apply to child-notes/images.",
|
||||||
|
@ -10,12 +10,6 @@ export default class NoteWrapperWidget extends FlexContainer {
|
|||||||
.collapsible();
|
.collapsible();
|
||||||
}
|
}
|
||||||
|
|
||||||
doRender() {
|
|
||||||
super.doRender();
|
|
||||||
|
|
||||||
this.$widget.addClass("note-split");
|
|
||||||
}
|
|
||||||
|
|
||||||
setNoteContextEvent({noteContext}) {
|
setNoteContextEvent({noteContext}) {
|
||||||
this.noteContext = noteContext;
|
this.noteContext = noteContext;
|
||||||
|
|
||||||
@ -42,6 +36,7 @@ export default class NoteWrapperWidget extends FlexContainer {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.$widget.addClass("note-split");
|
||||||
this.$widget.toggleClass("full-content-width",
|
this.$widget.toggleClass("full-content-width",
|
||||||
['image', 'mermaid', 'book', 'render', 'canvas', 'web-view'].includes(note.type)
|
['image', 'mermaid', 'book', 'render', 'canvas', 'web-view'].includes(note.type)
|
||||||
|| !!note?.hasLabel('fullContentWidth')
|
|| !!note?.hasLabel('fullContentWidth')
|
||||||
|
@ -13,7 +13,7 @@ const TPL = `
|
|||||||
<div style="margin-left: 10px; margin-right: 10px">depth:</div>
|
<div style="margin-left: 10px; margin-right: 10px">depth:</div>
|
||||||
|
|
||||||
<select name="depth" class="form-control d-inline ancestor-depth" style="flex-shrink: 3">
|
<select name="depth" class="form-control d-inline ancestor-depth" style="flex-shrink: 3">
|
||||||
<option value="">doesn't mattter</option>
|
<option value="">doesn't matter</option>
|
||||||
<option value="eq1">is exactly 1 (direct children)</option>
|
<option value="eq1">is exactly 1 (direct children)</option>
|
||||||
<option value="eq2">is exactly 2</option>
|
<option value="eq2">is exactly 2</option>
|
||||||
<option value="eq3">is exactly 3</option>
|
<option value="eq3">is exactly 3</option>
|
||||||
|
@ -299,7 +299,7 @@ function getBacklinks(req) {
|
|||||||
|
|
||||||
let backlinksWithExcerptCount = 0;
|
let backlinksWithExcerptCount = 0;
|
||||||
|
|
||||||
return backlinks.map(backlink => {
|
return backlinks.filter(note => !note.getNote().hasLabel('excludeFromNoteMap')).map(backlink => {
|
||||||
const sourceNote = backlink.note;
|
const sourceNote = backlink.note;
|
||||||
|
|
||||||
if (sourceNote.type !== 'text' || backlinksWithExcerptCount > 50) {
|
if (sourceNote.type !== 'text' || backlinksWithExcerptCount > 50) {
|
||||||
|
@ -181,6 +181,7 @@ function getRelationMap(req) {
|
|||||||
|
|
||||||
if (def.inverseRelation) {
|
if (def.inverseRelation) {
|
||||||
resp.inverseRelations[relationDefinition.getDefinedName()] = def.inverseRelation;
|
resp.inverseRelations[relationDefinition.getDefinedName()] = def.inverseRelation;
|
||||||
|
resp.inverseRelations[def.inverseRelation] = relationDefinition.getDefinedName();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -314,7 +315,7 @@ function getBacklinkCount(req) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return {
|
return {
|
||||||
count: note.getTargetRelations().length
|
count: note.getTargetRelations().filter(note => !note.getNote().hasLabel('excludeFromNoteMap')).length
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,14 @@ const setupRoute = require('./setup');
|
|||||||
const loginRoute = require('./login');
|
const loginRoute = require('./login');
|
||||||
const indexRoute = require('./index');
|
const indexRoute = require('./index');
|
||||||
const utils = require('../services/utils');
|
const utils = require('../services/utils');
|
||||||
const multer = require('multer')();
|
const multer = require('multer')({
|
||||||
|
fileFilter: (req, file, cb) => {
|
||||||
|
// UTF-8 file names are not well decoded by multer/busboy, so we handle the conversion on our side.
|
||||||
|
// See https://github.com/expressjs/multer/pull/1102.
|
||||||
|
file.originalname = Buffer.from(file.originalname, "latin1").toString("utf-8");
|
||||||
|
cb(null, true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// API routes
|
// API routes
|
||||||
const treeApiRoute = require('./api/tree');
|
const treeApiRoute = require('./api/tree');
|
||||||
|
@ -47,6 +47,7 @@ module.exports = [
|
|||||||
{ type: 'label', name: 'shareAlias' },
|
{ type: 'label', name: 'shareAlias' },
|
||||||
{ type: 'label', name: 'shareOmitDefaultCss' },
|
{ type: 'label', name: 'shareOmitDefaultCss' },
|
||||||
{ type: 'label', name: 'shareRoot' },
|
{ type: 'label', name: 'shareRoot' },
|
||||||
|
{ type: 'label', name: 'shareDescription' },
|
||||||
{ type: 'label', name: 'shareRaw' },
|
{ type: 'label', name: 'shareRaw' },
|
||||||
{ type: 'label', name: 'shareDisallowRobotIndexing' },
|
{ type: 'label', name: 'shareDisallowRobotIndexing' },
|
||||||
{ type: 'label', name: 'shareCredentials' },
|
{ type: 'label', name: 'shareCredentials' },
|
||||||
|
@ -2,6 +2,10 @@
|
|||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
|
<% if (note.hasLabel("shareDescription")) { %>
|
||||||
|
<meta name="description" content="<%= note.getLabelValue("shareDescription") %>">
|
||||||
|
<% } %>
|
||||||
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<% if (note.hasRelation("shareFavicon")) { %>
|
<% if (note.hasRelation("shareFavicon")) { %>
|
||||||
<link rel="shortcut icon" href="api/notes/<%= note.getRelation("shareFavicon").value %>/download">
|
<link rel="shortcut icon" href="api/notes/<%= note.getRelation("shareFavicon").value %>/download">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user