mirror of
https://github.com/zadam/trilium.git
synced 2025-10-27 08:16:40 +01:00
Compare commits
27 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
695f0e5879 | ||
|
|
ae337e4500 | ||
|
|
19ffa14f10 | ||
|
|
bf3f26fde8 | ||
|
|
dece400207 | ||
|
|
baab745462 | ||
|
|
0d3b3ec7c5 | ||
|
|
7aff20bb0d | ||
|
|
5acf84aece | ||
|
|
c58a0df76d | ||
|
|
20c14a1920 | ||
|
|
04063d8a9c | ||
|
|
dd69e0135b | ||
|
|
ab6e78f726 | ||
|
|
9029d18178 | ||
|
|
e9a1791e3d | ||
|
|
70e13c8a20 | ||
|
|
7e1cc729f9 | ||
|
|
87e7828440 | ||
|
|
29fd78aee5 | ||
|
|
f90c2317fc | ||
|
|
bca5087426 | ||
|
|
583123ab0a | ||
|
|
12f70b28c8 | ||
|
|
31a4a201a8 | ||
|
|
5ec866aa50 | ||
|
|
cdede3240c |
29
README.md
29
README.md
@@ -1,12 +1,12 @@
|
|||||||
# Trilium
|
# Trilium Notes
|
||||||
Hierarchical note taking application.
|
Trilium Notes is a 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)
|
||||||
* Seamless note versioning
|
* Seamless note versioning
|
||||||
@@ -16,17 +16,28 @@ 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-based) 64-bit builds are available for Linux and Windows.
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
See [wiki](https://github.com/zadam/trilium/wiki/Home) for complete list of available pages.
|
List of documentation pages:
|
||||||
|
|
||||||
|
* [Installation as webapp](https://github.com/zadam/trilium/wiki/Installation-as-webapp)
|
||||||
|
* [Note navigation](https://github.com/zadam/trilium/wiki/Note-navigation)
|
||||||
|
* [Tree manipulation](https://github.com/zadam/trilium/wiki/Tree-manipulation)
|
||||||
|
* [Links](https://github.com/zadam/trilium/wiki/Links)
|
||||||
|
* [Cloning notes](https://github.com/zadam/trilium/wiki/Cloning-notes)
|
||||||
|
* [Protected notes](https://github.com/zadam/trilium/wiki/Protected-notes)
|
||||||
|
* [Synchronization](https://github.com/zadam/trilium/wiki/Synchronization)
|
||||||
|
* [Document](https://github.com/zadam/trilium/wiki/Document)
|
||||||
|
* [Keyboard shortcuts](https://github.com/zadam/trilium/wiki/Keyboard-shortcuts)
|
||||||
|
* [Troubleshooting](https://github.com/zadam/trilium/wiki/Troubleshooting)
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
./set-build.sh
|
|
||||||
|
|
||||||
echo "Deleting dist"
|
echo "Deleting dist"
|
||||||
|
|
||||||
@@ -16,9 +14,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
|
||||||
70
bin/release.sh
Executable file
70
bin/release.sh
Executable file
@@ -0,0 +1,70 @@
|
|||||||
|
#!/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
|
||||||
|
|
||||||
|
echo "Releasing Trilium $VERSION"
|
||||||
|
|
||||||
|
jq '.version = "'$VERSION'"' package.json|sponge package.json
|
||||||
|
|
||||||
|
git add package.json
|
||||||
|
|
||||||
|
echo 'module.exports = { build_date:"'`date --iso-8601=seconds`'", build_revision: "'`git log -1 --format="%H"`'" };' > services/build.js
|
||||||
|
|
||||||
|
git add services/build.js
|
||||||
|
|
||||||
|
TAG=v$VERSION
|
||||||
|
|
||||||
|
echo "Committing package.json version change"
|
||||||
|
|
||||||
|
git commit -m "release $VERSION"
|
||||||
|
git push
|
||||||
|
|
||||||
|
echo "Tagging commit with $TAG"
|
||||||
|
|
||||||
|
git tag $TAG
|
||||||
|
git push origin $TAG
|
||||||
|
|
||||||
|
bin/build.sh
|
||||||
|
|
||||||
|
bin/package.sh
|
||||||
|
|
||||||
|
LINUX_BUILD=trilium-linux-$VERSION.7z
|
||||||
|
WINDOWS_BUILD=trilium-windows-$VERSION.7z
|
||||||
|
|
||||||
|
echo "Creating release in GitHub"
|
||||||
|
|
||||||
|
github-release release \
|
||||||
|
--tag $TAG \
|
||||||
|
--name "$TAG release"
|
||||||
|
|
||||||
|
echo "Uploading linux build"
|
||||||
|
|
||||||
|
github-release upload \
|
||||||
|
--tag $TAG \
|
||||||
|
--name "$LINUX_BUILD" \
|
||||||
|
--file "dist/$LINUX_BUILD"
|
||||||
|
|
||||||
|
echo "Uploading windows build"
|
||||||
|
|
||||||
|
github-release upload \
|
||||||
|
--tag $TAG \
|
||||||
|
--name "$WINDOWS_BUILD" \
|
||||||
|
--file "dist/$WINDOWS_BUILD"
|
||||||
|
|
||||||
|
echo "Release finished!"
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
INSERT INTO notes (note_id, note_title, note_text, is_protected, is_deleted, date_created, date_modified) VALUES ('root', 'root', 'root', 0, 0, '2017-12-22T11:41:07.000Z', '2017-12-22T11:41:07.000Z');
|
INSERT INTO notes (note_id, note_title, note_text, is_protected, is_deleted, date_created, date_modified) VALUES ('root', 'root', 'root', 0, 0, '2017-12-22T11:41:07.000Z', '2017-12-22T11:41:07.000Z');
|
||||||
INSERT INTO notes (note_id, note_title, note_text, is_protected, is_deleted, date_created, date_modified) VALUES ('1Heh2acXfPNt', 'Trilium Demo', '<p>Welcome to Trilium!</p><p> </p><p>This is initial document provided by default Trilium to showcase some of its features and also give you some ideas how you might structure your notes. You can play with it, modify note content and tree structure as you wish.</p><p> </p><p>If you need any help, visit Trilium wesite: <a href="https://github.com/zadam/trilium">https://github.com/zadam/trilium</a></p><p> </p><p>Once you''re finished with experimenting and want to cleanup these pages, you can simply delete them all.</p>', 0, 0, '2017-12-23T00:46:39.304Z', '2017-12-23T04:08:45.445Z');
|
INSERT INTO notes (note_id, note_title, note_text, is_protected, is_deleted, date_created, date_modified) VALUES ('1Heh2acXfPNt', 'Trilium Demo', '<p>Welcome to Trilium Notes!</p><p> </p><p>This is initial document provided by default Trilium to showcase some of its features and also give you some ideas how you might structure your notes. You can play with it, modify note content and tree structure as you wish.</p><p> </p><p>If you need any help, visit Trilium wesite: <a href="https://github.com/zadam/trilium">https://github.com/zadam/trilium</a></p><p> </p><p>Once you''re finished with experimenting and want to cleanup these pages, you can simply delete them all.</p>', 0, 0, '2017-12-23T00:46:39.304Z', '2017-12-23T04:08:45.445Z');
|
||||||
INSERT INTO notes (note_id, note_title, note_text, is_protected, is_deleted, date_created, date_modified) VALUES ('3RkyK9LI18dO', 'Journal', '<p>Expand note on the left pane to see content.</p>', 0, 0, '2017-12-23T01:20:04.181Z', '2017-12-23T18:07:55.377Z');
|
INSERT INTO notes (note_id, note_title, note_text, is_protected, is_deleted, date_created, date_modified) VALUES ('3RkyK9LI18dO', 'Journal', '<p>Expand note on the left pane to see content.</p>', 0, 0, '2017-12-23T01:20:04.181Z', '2017-12-23T18:07:55.377Z');
|
||||||
INSERT INTO notes (note_id, note_title, note_text, is_protected, is_deleted, date_created, date_modified) VALUES ('L1Ox40M1aEyy', '2016', '<p>No content.</p><p> </p><p> </p><p> </p><p> </p>', 0, 0, '2017-12-23T01:20:45.365Z', '2017-12-23T16:40:43.129Z');
|
INSERT INTO notes (note_id, note_title, note_text, is_protected, is_deleted, date_created, date_modified) VALUES ('L1Ox40M1aEyy', '2016', '<p>No content.</p><p> </p><p> </p><p> </p><p> </p>', 0, 0, '2017-12-23T01:20:45.365Z', '2017-12-23T16:40:43.129Z');
|
||||||
INSERT INTO notes (note_id, note_title, note_text, is_protected, is_deleted, date_created, date_modified) VALUES ('HJusZTbBU494', '2017', '<p>No content.</p>', 0, 0, '2017-12-23T01:20:50.709Z', '2017-12-23T16:41:03.119Z');
|
INSERT INTO notes (note_id, note_title, note_text, is_protected, is_deleted, date_created, date_modified) VALUES ('HJusZTbBU494', '2017', '<p>No content.</p>', 0, 0, '2017-12-23T01:20:50.709Z', '2017-12-23T16:41:03.119Z');
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "trilium",
|
"name": "trilium",
|
||||||
"description": "Trilium",
|
"description": "Trilium Notes",
|
||||||
"version": "0.0.9",
|
"version": "0.1.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node ./bin/www",
|
"start": "node ./bin/www",
|
||||||
"test-electron": "xo",
|
"test-electron": "xo",
|
||||||
|
|||||||
@@ -69,7 +69,9 @@ const contextMenu = (function() {
|
|||||||
{title: "Copy / clone <kbd>Ctrl+C</kbd>", cmd: "copy", uiIcon: "ui-icon-copy"},
|
{title: "Copy / clone <kbd>Ctrl+C</kbd>", cmd: "copy", uiIcon: "ui-icon-copy"},
|
||||||
{title: "Cut <kbd>Ctrl+X</kbd>", cmd: "cut", uiIcon: "ui-icon-scissors"},
|
{title: "Cut <kbd>Ctrl+X</kbd>", cmd: "cut", uiIcon: "ui-icon-scissors"},
|
||||||
{title: "Paste into <kbd>Ctrl+V</kbd>", cmd: "pasteInto", uiIcon: "ui-icon-clipboard"},
|
{title: "Paste into <kbd>Ctrl+V</kbd>", cmd: "pasteInto", uiIcon: "ui-icon-clipboard"},
|
||||||
{title: "Paste after", cmd: "pasteAfter", uiIcon: "ui-icon-clipboard"}
|
{title: "Paste after", cmd: "pasteAfter", uiIcon: "ui-icon-clipboard"},
|
||||||
|
{title: "----"},
|
||||||
|
{title: "Collapse sub-tree <kbd>Alt+-</kbd>", cmd: "collapse-sub-tree", uiIcon: "ui-icon-minus"}
|
||||||
],
|
],
|
||||||
beforeOpen: (event, ui) => {
|
beforeOpen: (event, ui) => {
|
||||||
const node = $.ui.fancytree.getNode(ui.target);
|
const node = $.ui.fancytree.getNode(ui.target);
|
||||||
@@ -120,6 +122,9 @@ const contextMenu = (function() {
|
|||||||
else if (ui.cmd === "delete") {
|
else if (ui.cmd === "delete") {
|
||||||
treeChanges.deleteNode(node);
|
treeChanges.deleteNode(node);
|
||||||
}
|
}
|
||||||
|
else if (ui.cmd === "collapse-sub-tree") {
|
||||||
|
noteTree.collapseTree(node);
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
messaging.logError("Unknown command: " + ui.cmd);
|
messaging.logError("Unknown command: " + ui.cmd);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ const editTreePrefix = (function() {
|
|||||||
|
|
||||||
await dialogEl.dialog({
|
await dialogEl.dialog({
|
||||||
modal: true,
|
modal: true,
|
||||||
width: 800
|
width: 500
|
||||||
});
|
});
|
||||||
|
|
||||||
const currentNode = noteTree.getCurrentNode();
|
const currentNode = noteTree.getCurrentNode();
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ const noteHistory = (function() {
|
|||||||
for (const item of historyItems) {
|
for (const item of historyItems) {
|
||||||
const dateModified = parseDate(item.date_modified_from);
|
const dateModified = parseDate(item.date_modified_from);
|
||||||
|
|
||||||
$("#note-history-list").append($('<option>', {
|
listEl.append($('<option>', {
|
||||||
value: item.note_history_id,
|
value: item.note_history_id,
|
||||||
text: formatDateTime(dateModified)
|
text: formatDateTime(dateModified)
|
||||||
}));
|
}));
|
||||||
@@ -42,6 +42,9 @@ const noteHistory = (function() {
|
|||||||
|
|
||||||
listEl.val(noteHistoryId).trigger('change');
|
listEl.val(noteHistoryId).trigger('change');
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
titleEl.text("No history for this note yet...");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$(document).bind('keydown', 'alt+h', e => {
|
$(document).bind('keydown', 'alt+h', e => {
|
||||||
|
|||||||
57
public/javascripts/dialogs/note_source.js
Normal file
57
public/javascripts/dialogs/note_source.js
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
const noteSource = (function() {
|
||||||
|
const dialogEl = $("#note-source-dialog");
|
||||||
|
const noteSourceEl = $("#note-source");
|
||||||
|
|
||||||
|
function showDialog() {
|
||||||
|
glob.activeDialog = dialogEl;
|
||||||
|
|
||||||
|
dialogEl.dialog({
|
||||||
|
modal: true,
|
||||||
|
width: 800,
|
||||||
|
height: 500
|
||||||
|
});
|
||||||
|
|
||||||
|
const noteText = noteEditor.getCurrentNote().detail.note_text;
|
||||||
|
|
||||||
|
noteSourceEl.text(formatHtml(noteText));
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatHtml(str) {
|
||||||
|
const div = document.createElement('div');
|
||||||
|
div.innerHTML = str.trim();
|
||||||
|
|
||||||
|
return formatNode(div, 0).innerHTML.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
function formatNode(node, level) {
|
||||||
|
const indentBefore = new Array(level++ + 1).join(' ');
|
||||||
|
const indentAfter = new Array(level - 1).join(' ');
|
||||||
|
let textNode;
|
||||||
|
|
||||||
|
for (let i = 0; i < node.children.length; i++) {
|
||||||
|
textNode = document.createTextNode('\n' + indentBefore);
|
||||||
|
node.insertBefore(textNode, node.children[i]);
|
||||||
|
|
||||||
|
formatNode(node.children[i], level);
|
||||||
|
|
||||||
|
if (node.lastElementChild === node.children[i]) {
|
||||||
|
textNode = document.createTextNode('\n' + indentAfter);
|
||||||
|
node.appendChild(textNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
$(document).bind('keydown', 'ctrl+u', e => {
|
||||||
|
showDialog();
|
||||||
|
|
||||||
|
e.preventDefault();
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
showDialog
|
||||||
|
};
|
||||||
|
})();
|
||||||
@@ -28,6 +28,9 @@ const sqlConsole = (function() {
|
|||||||
showError(result.error);
|
showError(result.error);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
showMessage("Query was executed successfully.");
|
||||||
|
}
|
||||||
|
|
||||||
const rows = result.rows;
|
const rows = result.rows;
|
||||||
|
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ $(document).bind('keydown', 'ctrl+f', () => {
|
|||||||
const searchInPage = require('electron-in-page-search').default;
|
const searchInPage = require('electron-in-page-search').default;
|
||||||
const remote = require('electron').remote;
|
const remote = require('electron').remote;
|
||||||
|
|
||||||
const inPageSearch = searchInPage(remote.getCurrentWebContents(), { openDevToolsOfSearchWindow: true });
|
const inPageSearch = searchInPage(remote.getCurrentWebContents());
|
||||||
|
|
||||||
inPageSearch.openSearchWindow();
|
inPageSearch.openSearchWindow();
|
||||||
|
|
||||||
@@ -164,4 +164,6 @@ window.onerror = function (msg, url, lineNo, columnNo, error) {
|
|||||||
messaging.logError(message);
|
messaging.logError(message);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
$("#logout-button").toggle(!isElectron());
|
||||||
@@ -42,18 +42,20 @@ const link = (function() {
|
|||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
const linkEl = $(e.target);
|
const linkEl = $(e.target);
|
||||||
const notePath = linkEl.attr("note-path") ? linkEl.attr("note-path") : getNotePathFromLink(linkEl.attr('href'));
|
const address = linkEl.attr("note-path") ? linkEl.attr("note-path") : linkEl.attr('href');
|
||||||
|
|
||||||
if (!notePath) {
|
if (!address) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (notePath.startsWith('http')) {
|
if (address.startsWith('http')) {
|
||||||
window.open(notePath, '_blank');
|
window.open(address, '_blank');
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const notePath = getNotePathFromLink(address);
|
||||||
|
|
||||||
noteTree.activateNode(notePath);
|
noteTree.activateNode(notePath);
|
||||||
|
|
||||||
// this is quite ugly hack, but it seems like we can't close the tooltip otherwise
|
// this is quite ugly hack, but it seems like we can't close the tooltip otherwise
|
||||||
@@ -84,8 +86,8 @@ const link = (function() {
|
|||||||
// when click on link popup, in case of internal link, just go the the referenced note instead of default behavior
|
// when click on link popup, in case of internal link, just go the the referenced note instead of default behavior
|
||||||
// of opening the link in new window/tab
|
// of opening the link in new window/tab
|
||||||
$(document).on('click', "a[action='note']", goToLink);
|
$(document).on('click', "a[action='note']", goToLink);
|
||||||
$(document).on('click', 'div.popover-content a, div.ui-tooltip-content', goToLink);
|
$(document).on('click', 'div.popover-content a, div.ui-tooltip-content a', goToLink);
|
||||||
$(document).on('dblclick', '#note-detail a, div.ui-tooltip-content', goToLink);
|
$(document).on('dblclick', '#note-detail a', goToLink);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
getNodePathFromLabel,
|
getNodePathFromLabel,
|
||||||
|
|||||||
@@ -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) {
|
||||||
@@ -433,20 +429,31 @@ const noteTree = (function() {
|
|||||||
"f2": node => {
|
"f2": node => {
|
||||||
editTreePrefix.showDialog(node);
|
editTreePrefix.showDialog(node);
|
||||||
},
|
},
|
||||||
|
"alt+-": node => {
|
||||||
|
collapseTree(node);
|
||||||
|
},
|
||||||
// code below shouldn't be necessary normally, however there's some problem with interaction with context menu plugin
|
// code below shouldn't be necessary normally, however there's some problem with interaction with context menu plugin
|
||||||
// after opening context menu, standard shortcuts don't work, but they are detected here
|
// after opening context menu, standard shortcuts don't work, but they are detected here
|
||||||
// so we essentially takeover the standard handling with our implementation.
|
// so we essentially takeover the standard handling with our implementation.
|
||||||
"left": node => {
|
"left": node => {
|
||||||
node.navigate($.ui.keyCode.LEFT, true);
|
node.navigate($.ui.keyCode.LEFT, true);
|
||||||
|
|
||||||
|
return false;
|
||||||
},
|
},
|
||||||
"right": node => {
|
"right": node => {
|
||||||
node.navigate($.ui.keyCode.RIGHT, true);
|
node.navigate($.ui.keyCode.RIGHT, true);
|
||||||
|
|
||||||
|
return false;
|
||||||
},
|
},
|
||||||
"up": node => {
|
"up": node => {
|
||||||
node.navigate($.ui.keyCode.UP, true);
|
node.navigate($.ui.keyCode.UP, true);
|
||||||
|
|
||||||
|
return false;
|
||||||
},
|
},
|
||||||
"down": node => {
|
"down": node => {
|
||||||
node.navigate($.ui.keyCode.DOWN, true);
|
node.navigate($.ui.keyCode.DOWN, true);
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -527,9 +534,9 @@ const noteTree = (function() {
|
|||||||
});
|
});
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Handle Ctrl-C, -X and -V
|
// Handle Ctrl+C, +X and +V
|
||||||
case 67:
|
case 67:
|
||||||
if (event.ctrlKey) { // Ctrl-C
|
if (event.ctrlKey) { // Ctrl+C
|
||||||
contextMenu.copy(node);
|
contextMenu.copy(node);
|
||||||
|
|
||||||
showMessage("Note copied into clipboard.");
|
showMessage("Note copied into clipboard.");
|
||||||
@@ -538,7 +545,7 @@ const noteTree = (function() {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 88:
|
case 88:
|
||||||
if (event.ctrlKey) { // Ctrl-X
|
if (event.ctrlKey) { // Ctrl+X
|
||||||
contextMenu.cut(node);
|
contextMenu.cut(node);
|
||||||
|
|
||||||
showMessage("Note cut into clipboard.");
|
showMessage("Note cut into clipboard.");
|
||||||
@@ -547,7 +554,7 @@ const noteTree = (function() {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 86:
|
case 86:
|
||||||
if (event.ctrlKey) { // Ctrl-V
|
if (event.ctrlKey) { // Ctrl+V
|
||||||
contextMenu.pasteInto(node);
|
contextMenu.pasteInto(node);
|
||||||
|
|
||||||
showMessage("Note pasted from clipboard into current note.");
|
showMessage("Note pasted from clipboard into current note.");
|
||||||
@@ -599,13 +606,17 @@ const noteTree = (function() {
|
|||||||
|
|
||||||
$(() => loadTree().then(noteTree => initFancyTree(noteTree)));
|
$(() => loadTree().then(noteTree => initFancyTree(noteTree)));
|
||||||
|
|
||||||
function collapseTree() {
|
function collapseTree(node = null) {
|
||||||
treeEl.fancytree("getRootNode").visit(node => {
|
if (!node) {
|
||||||
node.setExpanded(false);
|
node = treeEl.fancytree("getRootNode");
|
||||||
});
|
}
|
||||||
|
|
||||||
|
node.setExpanded(false);
|
||||||
|
|
||||||
|
node.visit(node => node.setExpanded(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
$(document).bind('keydown', 'alt+c', collapseTree);
|
$(document).bind('keydown', 'alt+c', () => collapseTree()); // don't use shortened form since collapseTree() accepts argument
|
||||||
|
|
||||||
function scrollToCurrentNote() {
|
function scrollToCurrentNote() {
|
||||||
const node = getCurrentNode();
|
const node = getCurrentNode();
|
||||||
@@ -617,8 +628,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 +793,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,14 +8,10 @@ const searchTree = (function() {
|
|||||||
|
|
||||||
resetSearchButton.click(resetSearch);
|
resetSearchButton.click(resetSearch);
|
||||||
|
|
||||||
function showSearch() {
|
|
||||||
searchBoxEl.show();
|
|
||||||
searchInputEl.focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
function toggleSearch() {
|
function toggleSearch() {
|
||||||
if (searchBoxEl.is(":hidden")) {
|
if (searchBoxEl.is(":hidden")) {
|
||||||
showSearch();
|
searchBoxEl.show();
|
||||||
|
searchInputEl.focus();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
resetSearch();
|
resetSearch();
|
||||||
@@ -52,7 +48,11 @@ const searchTree = (function() {
|
|||||||
}
|
}
|
||||||
}).focus();
|
}).focus();
|
||||||
|
|
||||||
$(document).bind('keydown', 'alt+s', showSearch);
|
$(document).bind('keydown', 'alt+s', e => {
|
||||||
|
toggleSearch();
|
||||||
|
|
||||||
|
e.preventDefault();
|
||||||
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
toggleSearch
|
toggleSearch
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ const treeChanges = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function deleteNode(node) {
|
async function deleteNode(node) {
|
||||||
if (!confirm('Are you sure you want to delete note "' + node.title + '"?')) {
|
if (!confirm('Are you sure you want to delete note "' + node.title + '" and all its sub-notes?')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,6 +83,8 @@ const treeChanges = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
noteTree.reload();
|
noteTree.reload();
|
||||||
|
|
||||||
|
showMessage("Note has been deleted.");
|
||||||
}
|
}
|
||||||
|
|
||||||
async function moveNodeUpInHierarchy(node) {
|
async function moveNodeUpInHierarchy(node) {
|
||||||
|
|||||||
@@ -168,8 +168,7 @@ div.ui-tooltip {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Allow to use <kbd> elements inside the title to define shortcut hints. */
|
/* Allow to use <kbd> elements inside the title to define shortcut hints. */
|
||||||
.ui-menu kbd {
|
.ui-menu kbd, button kbd {
|
||||||
margin-left: 30px;
|
|
||||||
float: right;
|
float: right;
|
||||||
color: black;
|
color: black;
|
||||||
border: none;
|
border: none;
|
||||||
@@ -177,6 +176,21 @@ div.ui-tooltip {
|
|||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ui-menu kbd {
|
||||||
|
margin-left: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#note-id-display {
|
||||||
|
color: lightgrey;
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#note-source {
|
||||||
|
height: 98%;
|
||||||
|
width: 100%;
|
||||||
|
overflow: scroll;
|
||||||
|
}
|
||||||
|
|
||||||
#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}
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ router.delete('/:noteTreeId', auth.checkApiAuth, async (req, res, next) => {
|
|||||||
router.get('/', auth.checkApiAuth, async (req, res, next) => {
|
router.get('/', auth.checkApiAuth, async (req, res, next) => {
|
||||||
const search = '%' + req.query.search + '%';
|
const search = '%' + req.query.search + '%';
|
||||||
|
|
||||||
const result = await sql.getAll("SELECT note_id FROM notes WHERE note_title liKE ? OR note_text LIKE ?", [search, search]);
|
const result = await sql.getAll("SELECT note_id FROM notes WHERE note_title LIKE ? OR note_text LIKE ?", [search, search]);
|
||||||
|
|
||||||
const noteIdList = [];
|
const noteIdList = [];
|
||||||
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
module.exports = { build_date:"2017-12-23T14:02:07-05:00", build_revision: "51215cba1bd2da8a539e86dbd31004cf9adb3f93" };
|
module.exports = { build_date:"2017-12-26T22:59:46-05:00", build_revision: "ae337e45009c3938dddcbb3452b271f97eb80bce" };
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>Trilium</title>
|
<title>Trilium Notes</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="loader-wrapper"><div id="loader"></div></div>
|
<div id="loader-wrapper"><div id="loader"></div></div>
|
||||||
@@ -12,12 +12,12 @@
|
|||||||
<div id="header-title">
|
<div id="header-title">
|
||||||
<img src="images/app-icons/png/24x24.png">
|
<img src="images/app-icons/png/24x24.png">
|
||||||
|
|
||||||
Trilium
|
Trilium Notes
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style="flex-grow: 100;">
|
<div style="flex-grow: 100;">
|
||||||
<button class="btn btn-xs" onclick="jumpToNote.showDialog();">Jump to note</button>
|
<button class="btn btn-xs" onclick="jumpToNote.showDialog();" title="CTRL+J">Jump to note</button>
|
||||||
<button class="btn btn-xs" onclick="recentNotes.showDialog();">Recent notes</button>
|
<button class="btn btn-xs" onclick="recentNotes.showDialog();" title="CTRL+E">Recent notes</button>
|
||||||
<button class="btn btn-xs" onclick="recentChanges.showDialog();">Recent changes</button>
|
<button class="btn btn-xs" onclick="recentChanges.showDialog();">Recent changes</button>
|
||||||
<button class="btn btn-xs" onclick="eventLog.showDialog();">Event log</button>
|
<button class="btn btn-xs" onclick="eventLog.showDialog();">Event log</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
<button class="btn btn-xs" onclick="settings.showDialog();">Settings</button>
|
<button class="btn btn-xs" onclick="settings.showDialog();">Settings</button>
|
||||||
|
|
||||||
<form action="logout" method="POST" style="display: inline;">
|
<form action="logout" id="logout-button" method="POST" style="display: inline;">
|
||||||
<input type="submit" class="btn btn-xs" value="Logout">
|
<input type="submit" class="btn btn-xs" value="Logout">
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
<img src="images/icons/list.png" alt="Collapse note tree"/>
|
<img src="images/icons/list.png" alt="Collapse note tree"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a onclick="noteTree.scrollToCurrentNote()" title="Scroll to current note" class="icon-action">
|
<a onclick="noteTree.scrollToCurrentNote()" title="Scroll to current note. Shortcut CTRL+." class="icon-action">
|
||||||
<img src="images/icons/crosshair.png" alt="Scroll to current note"/>
|
<img src="images/icons/crosshair.png" alt="Scroll to current note"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
@@ -95,7 +95,9 @@
|
|||||||
|
|
||||||
<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">
|
||||||
|
|
||||||
<button class="btn btn-xs" style="margin: 10px;" onclick="noteHistory.showCurrentNoteHistory();">Note history</button>
|
<span id="note-id-display" title="Note ID"></span>
|
||||||
|
|
||||||
|
<button class="btn btn-xs" title="ALT+H" style="margin: 10px;" onclick="noteHistory.showCurrentNoteHistory();">Note history</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -111,13 +113,13 @@
|
|||||||
<br/><br/>
|
<br/><br/>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<button class="btn btn-sm" id="recent-notes-jump-to">Jump to (enter)</button>
|
<button class="btn btn-sm" id="recent-notes-jump-to">Jump to <kbd>enter</kbd></button>
|
||||||
|
|
||||||
<button class="btn btn-sm" id="recent-notes-add-link">Add link (l)</button>
|
<button class="btn btn-sm" id="recent-notes-add-link">Add link <kbd>l</kbd></button>
|
||||||
|
|
||||||
<button class="btn btn-sm" id="recent-notes-add-current-as-child">Add current as child (c)</button>
|
<button class="btn btn-sm" id="recent-notes-add-current-as-child">Add current as child <kbd>c</kbd></button>
|
||||||
|
|
||||||
<button class="btn btn-sm" id="recent-notes-add-recent-as-child">Add recent as child (r)</button>
|
<button class="btn btn-sm" id="recent-notes-add-recent-as-child">Add recent as child <kbd>r</kbd></button>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -163,17 +165,18 @@
|
|||||||
<input id="jump-to-note-autocomplete" style="width: 100%;">
|
<input id="jump-to-note-autocomplete" style="width: 100%;">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button name="action" value="jump" class="btn btn-sm">Jump</button>
|
<button name="action" value="jump" class="btn btn-sm">Jump <kbd>enter</kbd></button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="protected-session-password-dialog" title="Protected session" style="display: none;">
|
<div id="protected-session-password-dialog" title="Protected session" style="display: none;">
|
||||||
<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 start 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">Start protected session <kbd>enter</kbd></button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -315,7 +318,7 @@
|
|||||||
|
|
||||||
<div id="sql-console-dialog" title="SQL console" style="display: none; padding: 20px;">
|
<div id="sql-console-dialog" title="SQL console" style="display: none; padding: 20px;">
|
||||||
<textarea style="width: 100%; height: 100px" id="sql-console-query"></textarea>
|
<textarea style="width: 100%; height: 100px" id="sql-console-query"></textarea>
|
||||||
<button class="btn btn-danger" id="sql-console-execute">Execute</button>
|
<button class="btn btn-danger" id="sql-console-execute">Execute <kbd>CTRL+ENTER</kbd></button>
|
||||||
|
|
||||||
<table id="sql-console-results" class="table table-striped" style="overflow: scroll; width: 100%;">
|
<table id="sql-console-results" class="table table-striped" style="overflow: scroll; width: 100%;">
|
||||||
<thead></thead>
|
<thead></thead>
|
||||||
@@ -323,6 +326,10 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div id="note-source-dialog" title="Note source" style="display: none; padding: 20px;">
|
||||||
|
<textarea id="note-source" readonly="readonly"></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div id="tooltip" style="display: none;"></div>
|
<div id="tooltip" style="display: none;"></div>
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
@@ -387,6 +394,7 @@
|
|||||||
<script src="javascripts/dialogs/event_log.js"></script>
|
<script src="javascripts/dialogs/event_log.js"></script>
|
||||||
<script src="javascripts/dialogs/edit_tree_prefix.js"></script>
|
<script src="javascripts/dialogs/edit_tree_prefix.js"></script>
|
||||||
<script src="javascripts/dialogs/sql_console.js"></script>
|
<script src="javascripts/dialogs/sql_console.js"></script>
|
||||||
|
<script src="javascripts/dialogs/note_source.js"></script>
|
||||||
|
|
||||||
<script src="javascripts/link.js"></script>
|
<script src="javascripts/link.js"></script>
|
||||||
<script src="javascripts/sync.js"></script>
|
<script src="javascripts/sync.js"></script>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div style="width: 500px; margin: auto;">
|
<div style="width: 500px; margin: auto;">
|
||||||
<h1>Trilium setup</h1>
|
<h1>Trilium Notes setup</h1>
|
||||||
|
|
||||||
<div class="alert alert-warning" id="alert" style="display: none;">
|
<div class="alert alert-warning" id="alert" style="display: none;">
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user