mirror of
https://github.com/zadam/trilium.git
synced 2025-10-27 08:16:40 +01:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
29fd78aee5 | ||
|
|
f90c2317fc | ||
|
|
bca5087426 | ||
|
|
583123ab0a | ||
|
|
12f70b28c8 | ||
|
|
31a4a201a8 | ||
|
|
5ec866aa50 | ||
|
|
cdede3240c |
16
README.md
16
README.md
@@ -1,14 +1,14 @@
|
|||||||
# Trilium
|
# Trilium
|
||||||
Hierarchical note taking application.
|
Hierarchical note taking application. Picture tells a thousand words:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
* Notes can be arranged into arbitrarily deep hierarchy
|
* Notes can be arranged into arbitrarily deep hierarchy
|
||||||
* Notes can have more than 1 parents - see [cloning](https://github.com/zadam/trilium/wiki/Cloning)
|
* Notes can have more than 1 parents - see [cloning](https://github.com/zadam/trilium/wiki/Cloning-notes)
|
||||||
* WYSIWYG (What You See Is What You Get) editing
|
* WYSIWYG (What You See Is What You Get) editing
|
||||||
* Fast and easy [navigation between notes](https://github.com/zadam/trilium/wiki/Note-navigation)
|
* Fast and easy [navigation between notes](https://github.com/zadam/trilium/wiki/Note-navigation) inspired by IDEs
|
||||||
* Seamless note versioning
|
* Seamless note versioning
|
||||||
* Can be deployed as web application and / or desktop application with offline access (electron based)
|
* Can be deployed as web application and / or desktop application with offline access (electron based)
|
||||||
* [Synchronization with](https://github.com/zadam/trilium/wiki/Synchronization) self-hosted sync server
|
* [Synchronization with](https://github.com/zadam/trilium/wiki/Synchronization) self-hosted sync server
|
||||||
@@ -16,16 +16,16 @@ Hierarchical note taking application.
|
|||||||
|
|
||||||
## Builds
|
## Builds
|
||||||
|
|
||||||
* If you want to install Trilium on server, follow [this page](https://github.com/zadam/trilium/wiki/Installation-on-server)
|
* If you want to install Trilium on server, follow [this page](https://github.com/zadam/trilium/wiki/Installation-as-webapp)
|
||||||
* If you want to use Trilium on the desktop, download binary release from [releases], unzip the package and run ```trilium``` executable.
|
* If you want to use Trilium on the desktop, download binary release for your platfor from [latest release](https://github.com/zadam/trilium/releases/latest), unzip the package and run ```trilium``` executable.
|
||||||
|
|
||||||
## Supported platforms
|
## Supported platforms
|
||||||
|
|
||||||
Desktop (electron) builds are available for Linux and Windows.
|
Desktop (electron) builds are available for Linux and Windows, both for 64 bits.
|
||||||
|
|
||||||
Requirements for web based installation are outlined in (https://github.com/zadam/trilium/wiki/Installation-on-server).
|
Requirements for web based installation are [outlined here](https://github.com/zadam/trilium/wiki/Installation-as-webapp).
|
||||||
|
|
||||||
Currently only recent Chrome and Firefox are supported (tested) browsers. Other modern browsers should work as well.
|
Currently only recent Chrome and Firefox are supported (tested) browsers. Other modern browsers (not IE) might work as well.
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
./set-build.sh
|
echo 'module.exports = { build_date:"'`date --iso-8601=seconds`'", build_revision: "'`git log -1 --format="%H"`'" };' > services/build.js
|
||||||
|
|
||||||
echo "Deleting dist"
|
echo "Deleting dist"
|
||||||
|
|
||||||
@@ -16,9 +16,3 @@ cp -r ../trilium-node-binaries/scrypt/* node_modules/scrypt/bin/
|
|||||||
|
|
||||||
# can't copy this before the packaging because the same file name is used for both linux and windows build
|
# can't copy this before the packaging because the same file name is used for both linux and windows build
|
||||||
cp ../trilium-node-binaries/scrypt.node ./dist/trilium-win32-x64/resources/app/node_modules/scrypt/build/Release/
|
cp ../trilium-node-binaries/scrypt.node ./dist/trilium-win32-x64/resources/app/node_modules/scrypt/build/Release/
|
||||||
|
|
||||||
echo "Packaging windows distribution..."
|
|
||||||
|
|
||||||
# possibly use zip: zip -r myfiles.zip mydir
|
|
||||||
|
|
||||||
tar cfJ dist/win.tar.xz dist/trilium-win32-x64
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
# Script generates certificate by default into the ~/trilium-data/cert where it is expected by Trilium
|
# Script generates certificate by default into the ~/trilium-data/cert where it is expected by Trilium
|
||||||
# If directory is given in argument, certificate will be created there.
|
# If directory is given in argument, certificate will be created there.
|
||||||
|
|
||||||
11
bin/package.sh
Executable file
11
bin/package.sh
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
VERSION=`jq -r ".version" package.json`
|
||||||
|
|
||||||
|
cd dist
|
||||||
|
|
||||||
|
echo "Packaging windows electron distribution..."
|
||||||
|
7z a trilium-windows-${VERSION}.7z trilium-win32-x64
|
||||||
|
|
||||||
|
echo "Packaging linux electron distribution..."
|
||||||
|
7z a trilium-linux-${VERSION}.7z trilium-linux-x64
|
||||||
52
bin/release.sh
Executable file
52
bin/release.sh
Executable file
@@ -0,0 +1,52 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
if [[ $# -eq 0 ]] ; then
|
||||||
|
echo "Missing argument of new version"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
VERSION=$1
|
||||||
|
|
||||||
|
if ! [[ ${VERSION} =~ ^[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}(-.+)?$ ]] ;
|
||||||
|
then
|
||||||
|
echo "Version ${VERSION} isn't in format X.Y.Z"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! git diff-index --quiet HEAD --; then
|
||||||
|
echo "There are uncommitted changes"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
jq '.version = "'$VERSION'"' package.json|sponge package.json
|
||||||
|
|
||||||
|
TAG=v$VERSION
|
||||||
|
|
||||||
|
git commit -m "$VERSION"
|
||||||
|
git push
|
||||||
|
|
||||||
|
git tag $TAG
|
||||||
|
git push origin $TAG
|
||||||
|
|
||||||
|
echo "Releasing Trilium $VERSION"
|
||||||
|
|
||||||
|
build
|
||||||
|
|
||||||
|
package
|
||||||
|
|
||||||
|
LINUX_BUILD=trilium-linux-$VERSION.7z
|
||||||
|
WINDOWS_BUILD=trilium-windows-$VERSION.7z
|
||||||
|
|
||||||
|
github-release release \
|
||||||
|
--tag $TAG \
|
||||||
|
--name "$TAG release"
|
||||||
|
|
||||||
|
github-release upload \
|
||||||
|
--tag $TAG \
|
||||||
|
--name "$LINUX_BUILD" \
|
||||||
|
--file "dist/$LINUX_BUILD"
|
||||||
|
|
||||||
|
github-release upload \
|
||||||
|
--tag $TAG \
|
||||||
|
--name "$WINDOWS_BUILD" \
|
||||||
|
--file "dist/$WINDOWS_BUILD"
|
||||||
@@ -6,6 +6,8 @@ const noteEditor = (function() {
|
|||||||
const protectButton = $("#protect-button");
|
const protectButton = $("#protect-button");
|
||||||
const unprotectButton = $("#unprotect-button");
|
const unprotectButton = $("#unprotect-button");
|
||||||
const noteDetailWrapperEl = $("#note-detail-wrapper");
|
const noteDetailWrapperEl = $("#note-detail-wrapper");
|
||||||
|
const noteIdDisplayEl = $("#note-id-display");
|
||||||
|
|
||||||
let editor = null;
|
let editor = null;
|
||||||
|
|
||||||
let currentNote = null;
|
let currentNote = null;
|
||||||
@@ -79,18 +81,11 @@ const noteEditor = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function setNoteBackgroundIfProtected(note) {
|
function setNoteBackgroundIfProtected(note) {
|
||||||
if (note.detail.is_protected) {
|
const isProtected = !!note.detail.is_protected;
|
||||||
$("#note-detail-wrapper").addClass("protected");
|
|
||||||
protectButton.hide();
|
|
||||||
unprotectButton.show();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$("#note-detail-wrapper").removeClass("protected");
|
|
||||||
protectButton.show();
|
|
||||||
unprotectButton.hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
noteTree.setCurrentNoteTreeBasedOnProtectedStatus();
|
noteDetailWrapperEl.toggleClass("protected", isProtected);
|
||||||
|
protectButton.toggle(!isProtected);
|
||||||
|
unprotectButton.toggle(isProtected);
|
||||||
}
|
}
|
||||||
|
|
||||||
let isNewNoteCreated = false;
|
let isNewNoteCreated = false;
|
||||||
@@ -108,6 +103,8 @@ const noteEditor = (function() {
|
|||||||
noteTitleEl.focus().select();
|
noteTitleEl.focus().select();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
noteIdDisplayEl.html(noteId);
|
||||||
|
|
||||||
await protected_session.ensureProtectedSession(currentNote.detail.is_protected, false);
|
await protected_session.ensureProtectedSession(currentNote.detail.is_protected, false);
|
||||||
|
|
||||||
if (currentNote.detail.is_protected) {
|
if (currentNote.detail.is_protected) {
|
||||||
@@ -129,6 +126,7 @@ const noteEditor = (function() {
|
|||||||
noteChangeDisabled = false;
|
noteChangeDisabled = false;
|
||||||
|
|
||||||
setNoteBackgroundIfProtected(currentNote);
|
setNoteBackgroundIfProtected(currentNote);
|
||||||
|
noteTree.setNoteTreeBackgroundBasedOnProtectedStatus(noteId);
|
||||||
|
|
||||||
showAppIfHidden();
|
showAppIfHidden();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -157,21 +157,17 @@ const noteTree = (function() {
|
|||||||
function getExtraClasses(note) {
|
function getExtraClasses(note) {
|
||||||
assertArguments(note);
|
assertArguments(note);
|
||||||
|
|
||||||
let extraClasses = '';
|
const extraClasses = [];
|
||||||
|
|
||||||
if (note.is_protected) {
|
if (note.is_protected) {
|
||||||
extraClasses += ",protected";
|
extraClasses.push("protected");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (childToParents[note.note_id].length > 1) {
|
if (childToParents[note.note_id].length > 1) {
|
||||||
extraClasses += ",multiple-parents";
|
extraClasses.push("multiple-parents");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (extraClasses.startsWith(",")) {
|
return extraClasses.join(" ");
|
||||||
extraClasses = extraClasses.substr(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return extraClasses;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function prepareNoteTreeInner(parentNoteId) {
|
function prepareNoteTreeInner(parentNoteId) {
|
||||||
@@ -617,8 +613,14 @@ const noteTree = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function setCurrentNoteTreeBasedOnProtectedStatus() {
|
function setNoteTreeBackgroundBasedOnProtectedStatus(noteId) {
|
||||||
getCurrentClones().map(node => node.toggleClass("protected", !!node.data.is_protected));
|
getNodesByNoteId(noteId).map(node => node.toggleClass("protected", !!node.data.is_protected));
|
||||||
|
}
|
||||||
|
|
||||||
|
function setProtected(noteId, isProtected) {
|
||||||
|
getNodesByNoteId(noteId).map(node => node.data.is_protected = isProtected);
|
||||||
|
|
||||||
|
setNoteTreeBackgroundBasedOnProtectedStatus(noteId);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getAutocompleteItems(parentNoteId, notePath, titlePath) {
|
function getAutocompleteItems(parentNoteId, notePath, titlePath) {
|
||||||
@@ -776,7 +778,8 @@ const noteTree = (function() {
|
|||||||
reload,
|
reload,
|
||||||
collapseTree,
|
collapseTree,
|
||||||
scrollToCurrentNote,
|
scrollToCurrentNote,
|
||||||
setCurrentNoteTreeBasedOnProtectedStatus,
|
setNoteTreeBackgroundBasedOnProtectedStatus,
|
||||||
|
setProtected,
|
||||||
getCurrentNode,
|
getCurrentNode,
|
||||||
activateNode,
|
activateNode,
|
||||||
getCurrentNotePath,
|
getCurrentNotePath,
|
||||||
|
|||||||
@@ -115,6 +115,8 @@ const protected_session = (function() {
|
|||||||
|
|
||||||
await noteEditor.saveNoteToServer(note);
|
await noteEditor.saveNoteToServer(note);
|
||||||
|
|
||||||
|
noteTree.setProtected(note.detail.note_id, note.detail.is_protected);
|
||||||
|
|
||||||
noteEditor.setNoteBackgroundIfProtected(note);
|
noteEditor.setNoteBackgroundIfProtected(note);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -129,6 +131,8 @@ const protected_session = (function() {
|
|||||||
|
|
||||||
await noteEditor.saveNoteToServer(note);
|
await noteEditor.saveNoteToServer(note);
|
||||||
|
|
||||||
|
noteTree.setProtected(note.detail.note_id, note.detail.is_protected);
|
||||||
|
|
||||||
noteEditor.setNoteBackgroundIfProtected(note);
|
noteEditor.setNoteBackgroundIfProtected(note);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -177,6 +177,10 @@ div.ui-tooltip {
|
|||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#note-id-display {
|
||||||
|
color: lightgrey;
|
||||||
|
}
|
||||||
|
|
||||||
#loader-wrapper{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1000;background-color:#fff;opacity:1;transition:opacity 2s ease}
|
#loader-wrapper{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1000;background-color:#fff;opacity:1;transition:opacity 2s ease}
|
||||||
#loader{display:block;position:relative;left:50%;top:50%;width:150px;height:150px;margin:-75px 0 0 -75px;border-radius:50%;border:3px solid transparent;border-top-color:#777;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}
|
#loader{display:block;position:relative;left:50%;top:50%;width:150px;height:150px;margin:-75px 0 0 -75px;border-radius:50%;border:3px solid transparent;border-top-color:#777;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}
|
||||||
#loader:before{content:"";position:absolute;top:5px;left:5px;right:5px;bottom:5px;border-radius:50%;border:3px solid transparent;border-top-color:#aaa;-webkit-animation:spin 3s linear infinite;animation:spin 3s linear infinite}
|
#loader:before{content:"";position:absolute;top:5px;left:5px;right:5px;bottom:5px;border-radius:50%;border:3px solid transparent;border-top-color:#aaa;-webkit-animation:spin 3s linear infinite;animation:spin 3s linear infinite}
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
module.exports = { build_date:"2017-12-23T14:02:07-05:00", build_revision: "51215cba1bd2da8a539e86dbd31004cf9adb3f93" };
|
module.exports = { build_date:"2017-12-25T10:07:19-05:00", build_revision: "583123ab0a5df7dca5b19f2c67ab8ef853e72673" };
|
||||||
|
|||||||
@@ -104,8 +104,6 @@ async function protectNote(note, dataKey, protect, sourceId) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (changed) {
|
if (changed) {
|
||||||
console.log("Updating...");
|
|
||||||
|
|
||||||
await sql.execute("UPDATE notes SET note_title = ?, note_text = ?, is_protected = ? WHERE note_id = ?",
|
await sql.execute("UPDATE notes SET note_title = ?, note_text = ?, is_protected = ? WHERE note_id = ?",
|
||||||
[note.note_title, note.note_text, note.is_protected, note.note_id]);
|
[note.note_title, note.note_text, note.is_protected, note.note_id]);
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
echo 'module.exports = { build_date:"'`date --iso-8601=seconds`'", build_revision: "'`git log -1 --format="%H"`'" };' > services/build.js
|
|
||||||
@@ -95,6 +95,8 @@
|
|||||||
|
|
||||||
<input autocomplete="off" value="" id="note-title" style="font-size: x-large; border: 0; flex-grow: 100;" tabindex="1">
|
<input autocomplete="off" value="" id="note-title" style="font-size: x-large; border: 0; flex-grow: 100;" tabindex="1">
|
||||||
|
|
||||||
|
<span id="note-id-display" title="Note ID"></span>
|
||||||
|
|
||||||
<button class="btn btn-xs" style="margin: 10px;" onclick="noteHistory.showCurrentNoteHistory();">Note history</button>
|
<button class="btn btn-xs" style="margin: 10px;" onclick="noteHistory.showCurrentNoteHistory();">Note history</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -171,9 +173,10 @@
|
|||||||
<form id="protected-session-password-form">
|
<form id="protected-session-password-form">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="protected-session-password">To proceed with requested action you need to enter protected session by entering password:</label>
|
<label for="protected-session-password">To proceed with requested action you need to enter protected session by entering password:</label>
|
||||||
<input id="protected-session-password" style="width: 250px;" type="password">
|
<input id="protected-session-password" class="form-control" type="password">
|
||||||
<button class="btn btn-sm">Show</button>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<button class="btn btn-sm">Enter protected session</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user