From 9a13edd4905bb28a8ede2dcbeb6a5b91a7427025 Mon Sep 17 00:00:00 2001
From: zadam
Date: Sat, 18 Jan 2020 20:52:14 +0100
Subject: [PATCH 1/6] release 0.39.6
---
package.json | 2 +-
src/services/build.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
index 9d4c358ed..d3e51e709 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
"name": "trilium",
"productName": "Trilium Notes",
"description": "Trilium Notes",
- "version": "0.39.5",
+ "version": "0.39.6",
"license": "AGPL-3.0-only",
"main": "electron.js",
"bin": {
diff --git a/src/services/build.js b/src/services/build.js
index 1d246ab49..b7060d177 100644
--- a/src/services/build.js
+++ b/src/services/build.js
@@ -1 +1 @@
-module.exports = { buildDate:"2020-01-08T21:01:24+01:00", buildRevision: "2b69abf8ab2241f01cd38b31308e54b9faaa74d5" };
+module.exports = { buildDate:"2020-01-18T20:52:14+01:00", buildRevision: "0ec11d29ba2d524ff80b49ab8dc40f3f8cf3835b" };
From 402718d293fd2a354418a05d0c1d1d66a9339d51 Mon Sep 17 00:00:00 2001
From: zadam
Date: Sun, 9 Feb 2020 10:00:13 +0100
Subject: [PATCH 2/6] return focus to the previously focused element after
closing the dialog, fixes #861
---
package-lock.json | 2 +-
src/public/javascripts/dialogs/about.js | 6 +--
src/public/javascripts/dialogs/add_link.js | 6 +--
src/public/javascripts/dialogs/attributes.js | 6 +--
src/public/javascripts/dialogs/backend_log.js | 6 +--
.../javascripts/dialogs/branch_prefix.js | 6 +--
src/public/javascripts/dialogs/clone_to.js | 6 +--
src/public/javascripts/dialogs/export.js | 6 +--
src/public/javascripts/dialogs/help.js | 6 +--
src/public/javascripts/dialogs/import.js | 6 +--
.../javascripts/dialogs/include_note.js | 6 +--
src/public/javascripts/dialogs/info.js | 6 +--
.../javascripts/dialogs/jump_to_note.js | 6 +--
src/public/javascripts/dialogs/link_map.js | 6 +--
.../javascripts/dialogs/markdown_import.js | 4 +-
src/public/javascripts/dialogs/move_to.js | 8 +---
src/public/javascripts/dialogs/note_info.js | 6 +--
.../javascripts/dialogs/note_revisions.js | 6 +--
src/public/javascripts/dialogs/note_source.js | 6 +--
src/public/javascripts/dialogs/options.js | 6 +--
src/public/javascripts/dialogs/prompt.js | 6 +--
.../javascripts/dialogs/protected_session.js | 3 +-
.../javascripts/dialogs/recent_changes.js | 6 +--
src/public/javascripts/dialogs/sql_console.js | 6 +--
.../javascripts/services/search_notes.js | 5 +++
src/public/javascripts/services/utils.js | 44 +++++++++++++++++++
26 files changed, 74 insertions(+), 112 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 526e39421..c34def86c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "trilium",
- "version": "0.40.1",
+ "version": "0.40.2",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/src/public/javascripts/dialogs/about.js b/src/public/javascripts/dialogs/about.js
index 3a07d95c6..0b48712e4 100644
--- a/src/public/javascripts/dialogs/about.js
+++ b/src/public/javascripts/dialogs/about.js
@@ -10,8 +10,6 @@ const $buildRevision = $("#build-revision");
const $dataDirectory = $("#data-directory");
export async function showDialog() {
- utils.closeActiveDialog();
-
const appInfo = await server.get('app-info');
$appVersion.text(appInfo.appVersion);
@@ -22,7 +20,5 @@ export async function showDialog() {
$buildRevision.attr('href', 'https://github.com/zadam/trilium/commit/' + appInfo.buildRevision);
$dataDirectory.text(appInfo.dataDirectory);
- glob.activeDialog = $dialog;
-
- $dialog.modal();
+ utils.openDialog($dialog);
}
\ No newline at end of file
diff --git a/src/public/javascripts/dialogs/add_link.js b/src/public/javascripts/dialogs/add_link.js
index be8e8f244..a5b69f9e3 100644
--- a/src/public/javascripts/dialogs/add_link.js
+++ b/src/public/javascripts/dialogs/add_link.js
@@ -11,13 +11,9 @@ const $linkTitle = $("#link-title");
const $addLinkTitleFormGroup = $("#add-link-title-form-group");
export async function showDialog() {
- utils.closeActiveDialog();
-
$addLinkTitleFormGroup.toggle(!hasSelection());
- glob.activeDialog = $dialog;
-
- $dialog.modal();
+ utils.openDialog($dialog);
$autoComplete.val('').trigger('focus');
$linkTitle.val('');
diff --git a/src/public/javascripts/dialogs/attributes.js b/src/public/javascripts/dialogs/attributes.js
index 171c01a29..21303746c 100644
--- a/src/public/javascripts/dialogs/attributes.js
+++ b/src/public/javascripts/dialogs/attributes.js
@@ -287,8 +287,6 @@ function initKoPlugins() {
}
export async function showDialog() {
- utils.closeActiveDialog();
-
await libraryLoader.requireLibrary(libraryLoader.KNOCKOUT);
// lazily apply bindings on first use
@@ -300,11 +298,9 @@ export async function showDialog() {
ko.applyBindings(attributesModel, $dialog[0]);
}
- glob.activeDialog = $dialog;
-
await attributesModel.loadAttributes();
- $dialog.modal();
+ utils.openDialog($dialog);
}
$dialog.on('focus', '.attribute-name', function (e) {
diff --git a/src/public/javascripts/dialogs/backend_log.js b/src/public/javascripts/dialogs/backend_log.js
index f899b90e0..ac145f13d 100644
--- a/src/public/javascripts/dialogs/backend_log.js
+++ b/src/public/javascripts/dialogs/backend_log.js
@@ -6,11 +6,7 @@ const $backendLogTextArea = $("#backend-log-textarea");
const $refreshBackendLog = $("#refresh-backend-log-button");
export async function showDialog() {
- utils.closeActiveDialog();
-
- glob.activeDialog = $dialog;
-
- $dialog.modal();
+ utils.openDialog($dialog);
load();
}
diff --git a/src/public/javascripts/dialogs/branch_prefix.js b/src/public/javascripts/dialogs/branch_prefix.js
index e9aa1cd64..d8cb2502e 100644
--- a/src/public/javascripts/dialogs/branch_prefix.js
+++ b/src/public/javascripts/dialogs/branch_prefix.js
@@ -13,10 +13,6 @@ const $noteTitle = $('#branch-prefix-note-title');
let branchId;
export async function showDialog(node) {
- utils.closeActiveDialog();
-
- glob.activeDialog = $dialog;
-
branchId = node.data.branchId;
const branch = treeCache.getBranch(branchId);
@@ -30,7 +26,7 @@ export async function showDialog(node) {
return;
}
- $dialog.modal();
+ utils.openDialog($dialog);
$treePrefixInput.val(branch.prefix);
diff --git a/src/public/javascripts/dialogs/clone_to.js b/src/public/javascripts/dialogs/clone_to.js
index 147e5c8bd..a456483e0 100644
--- a/src/public/javascripts/dialogs/clone_to.js
+++ b/src/public/javascripts/dialogs/clone_to.js
@@ -22,11 +22,7 @@ export async function showDialog(noteIds) {
}
}
- utils.closeActiveDialog();
-
- glob.activeDialog = $dialog;
-
- $dialog.modal();
+ utils.openDialog($dialog);
$noteAutoComplete.val('').trigger('focus');
diff --git a/src/public/javascripts/dialogs/export.js b/src/public/javascripts/dialogs/export.js
index fc8b392be..40f19df3c 100644
--- a/src/public/javascripts/dialogs/export.js
+++ b/src/public/javascripts/dialogs/export.js
@@ -17,8 +17,6 @@ let taskId = '';
let branchId = null;
export async function showDialog(node, defaultType) {
- utils.closeActiveDialog();
-
// each opening of the dialog resets the taskId so we don't associate it with previous exports anymore
taskId = '';
$exportButton.removeAttr("disabled");
@@ -38,9 +36,7 @@ export async function showDialog(node, defaultType) {
$("#opml-v2").prop("checked", true); // setting default
- glob.activeDialog = $dialog;
-
- $dialog.modal();
+ utils.openDialog($dialog);
branchId = node.data.branchId;
diff --git a/src/public/javascripts/dialogs/help.js b/src/public/javascripts/dialogs/help.js
index ccf73dfbc..ed8d90a48 100644
--- a/src/public/javascripts/dialogs/help.js
+++ b/src/public/javascripts/dialogs/help.js
@@ -3,9 +3,5 @@ import utils from "../services/utils.js";
const $dialog = $("#help-dialog");
export async function showDialog() {
- utils.closeActiveDialog();
-
- glob.activeDialog = $dialog;
-
- $dialog.modal();
+ utils.openDialog($dialog);
}
\ No newline at end of file
diff --git a/src/public/javascripts/dialogs/import.js b/src/public/javascripts/dialogs/import.js
index d527bd6fe..04dd0dd1a 100644
--- a/src/public/javascripts/dialogs/import.js
+++ b/src/public/javascripts/dialogs/import.js
@@ -16,8 +16,6 @@ const $explodeArchivesCheckbox = $("#explode-archives-checkbox");
let parentNoteId = null;
export async function showDialog(node) {
- utils.closeActiveDialog();
-
$fileUploadInput.val('').trigger('change'); // to trigger Import button disabling listener below
$safeImportCheckbox.prop("checked", true);
@@ -26,13 +24,11 @@ export async function showDialog(node) {
$codeImportedAsCodeCheckbox.prop("checked", true);
$explodeArchivesCheckbox.prop("checked", true);
- glob.activeDialog = $dialog;
-
parentNoteId = node.data.noteId;
$noteTitle.text(await treeUtils.getNoteTitle(parentNoteId));
- $dialog.modal();
+ utils.openDialog($dialog);
}
$form.on('submit', () => {
diff --git a/src/public/javascripts/dialogs/include_note.js b/src/public/javascripts/dialogs/include_note.js
index bf89179b5..de4a35118 100644
--- a/src/public/javascripts/dialogs/include_note.js
+++ b/src/public/javascripts/dialogs/include_note.js
@@ -10,13 +10,9 @@ let callback = null;
export async function showDialog(cb) {
callback = cb;
- utils.closeActiveDialog();
-
- glob.activeDialog = $dialog;
-
$autoComplete.val('');
- $dialog.modal();
+ utils.openDialog($dialog);
noteAutocompleteService.initNoteAutocomplete($autoComplete, { hideGoToSelectedNoteButton: true });
noteAutocompleteService.showRecentNotes($autoComplete);
diff --git a/src/public/javascripts/dialogs/info.js b/src/public/javascripts/dialogs/info.js
index b3901344b..0db595f55 100644
--- a/src/public/javascripts/dialogs/info.js
+++ b/src/public/javascripts/dialogs/info.js
@@ -10,13 +10,9 @@ let $originallyFocused; // element focused before the dialog was opened so we ca
export function info(message) {
$originallyFocused = $(':focus');
- utils.closeActiveDialog();
-
- glob.activeDialog = $dialog;
-
$infoContent.text(message);
- $dialog.modal();
+ utils.openDialog($dialog);
return new Promise((res, rej) => { resolve = res; });
}
diff --git a/src/public/javascripts/dialogs/jump_to_note.js b/src/public/javascripts/dialogs/jump_to_note.js
index 751280635..729773a7c 100644
--- a/src/public/javascripts/dialogs/jump_to_note.js
+++ b/src/public/javascripts/dialogs/jump_to_note.js
@@ -8,13 +8,9 @@ const $autoComplete = $("#jump-to-note-autocomplete");
const $showInFullTextButton = $("#show-in-full-text-button");
export async function showDialog() {
- utils.closeActiveDialog();
-
- glob.activeDialog = $dialog;
-
$autoComplete.val('');
- $dialog.modal();
+ utils.openDialog($dialog);
noteAutocompleteService.initNoteAutocomplete($autoComplete, { hideGoToSelectedNoteButton: true })
.on('autocomplete:selected', function(event, suggestion, dataset) {
diff --git a/src/public/javascripts/dialogs/link_map.js b/src/public/javascripts/dialogs/link_map.js
index 4a3937a53..25d1f5ae4 100644
--- a/src/public/javascripts/dialogs/link_map.js
+++ b/src/public/javascripts/dialogs/link_map.js
@@ -16,10 +16,6 @@ function getOptions() {
}
export async function showDialog() {
- utils.closeActiveDialog();
-
- glob.activeDialog = $dialog;
-
// set default settings
$maxNotesInput.val(20);
@@ -27,7 +23,7 @@ export async function showDialog() {
$linkMapContainer.empty();
- $dialog.modal();
+ utils.openDialog($dialog);
}
$dialog.on('shown.bs.modal', () => {
diff --git a/src/public/javascripts/dialogs/markdown_import.js b/src/public/javascripts/dialogs/markdown_import.js
index 02465e34a..021bea45b 100644
--- a/src/public/javascripts/dialogs/markdown_import.js
+++ b/src/public/javascripts/dialogs/markdown_import.js
@@ -37,9 +37,7 @@ export async function importMarkdownInline() {
convertMarkdownToHtml(text);
}
else {
- glob.activeDialog = $dialog;
-
- $dialog.modal();
+ utils.openDialog($dialog);
}
}
diff --git a/src/public/javascripts/dialogs/move_to.js b/src/public/javascripts/dialogs/move_to.js
index 68d570880..4c6c6f782 100644
--- a/src/public/javascripts/dialogs/move_to.js
+++ b/src/public/javascripts/dialogs/move_to.js
@@ -1,7 +1,5 @@
import noteAutocompleteService from "../services/note_autocomplete.js";
import utils from "../services/utils.js";
-import cloningService from "../services/cloning.js";
-import treeUtils from "../services/tree_utils.js";
import toastService from "../services/toast.js";
import treeCache from "../services/tree_cache.js";
import treeChangesService from "../services/branches.js";
@@ -18,11 +16,7 @@ let movedNodes;
export async function showDialog(nodes) {
movedNodes = nodes;
- utils.closeActiveDialog();
-
- glob.activeDialog = $dialog;
-
- $dialog.modal();
+ utils.openDialog($dialog);
$noteAutoComplete.val('').trigger('focus');
diff --git a/src/public/javascripts/dialogs/note_info.js b/src/public/javascripts/dialogs/note_info.js
index 0b300a3eb..0eb57149e 100644
--- a/src/public/javascripts/dialogs/note_info.js
+++ b/src/public/javascripts/dialogs/note_info.js
@@ -10,11 +10,7 @@ const $mime = $("#note-info-mime");
const $okButton = $("#note-info-ok-button");
export function showDialog() {
- utils.closeActiveDialog();
-
- glob.activeDialog = $dialog;
-
- $dialog.modal();
+ utils.openDialog($dialog);
const activeNote = noteDetailService.getActiveTabNote();
diff --git a/src/public/javascripts/dialogs/note_revisions.js b/src/public/javascripts/dialogs/note_revisions.js
index 8656bfe9b..3fe0f6343 100644
--- a/src/public/javascripts/dialogs/note_revisions.js
+++ b/src/public/javascripts/dialogs/note_revisions.js
@@ -29,11 +29,7 @@ export async function showCurrentNoteRevisions() {
}
export async function showNoteRevisionsDialog(noteId, noteRevisionId) {
- utils.closeActiveDialog();
-
- glob.activeDialog = $dialog;
-
- $dialog.modal();
+ utils.openDialog($dialog);
await loadNoteRevisions(noteId, noteRevisionId);
}
diff --git a/src/public/javascripts/dialogs/note_source.js b/src/public/javascripts/dialogs/note_source.js
index 76ead802b..ef551d0bf 100644
--- a/src/public/javascripts/dialogs/note_source.js
+++ b/src/public/javascripts/dialogs/note_source.js
@@ -5,11 +5,7 @@ const $dialog = $("#note-source-dialog");
const $noteSource = $("#note-source");
export function showDialog() {
- utils.closeActiveDialog();
-
- glob.activeDialog = $dialog;
-
- $dialog.modal();
+ utils.openDialog($dialog);
const noteText = noteDetailService.getActiveTabNote().content;
diff --git a/src/public/javascripts/dialogs/options.js b/src/public/javascripts/dialogs/options.js
index a3f33959a..bcb71c043 100644
--- a/src/public/javascripts/dialogs/options.js
+++ b/src/public/javascripts/dialogs/options.js
@@ -6,13 +6,9 @@ import utils from "../services/utils.js";
const $dialog = $("#options-dialog");
export async function showDialog() {
- utils.closeActiveDialog();
-
- glob.activeDialog = $dialog;
-
const options = await server.get('options');
- $dialog.modal();
+ utils.openDialog($dialog);
(await Promise.all([
import('./options/advanced.js'),
diff --git a/src/public/javascripts/dialogs/prompt.js b/src/public/javascripts/dialogs/prompt.js
index ca0567f40..34acfdaa5 100644
--- a/src/public/javascripts/dialogs/prompt.js
+++ b/src/public/javascripts/dialogs/prompt.js
@@ -12,10 +12,6 @@ let resolve;
let shownCb;
export function ask({ message, defaultValue, shown }) {
- utils.closeActiveDialog();
-
- glob.activeDialog = $dialog;
-
shownCb = shown;
$question = $("
`;
function showSearch() {
+ utils.saveFocusedElement();
+
$searchBox.slideDown();
$searchBox.tooltip({
@@ -49,6 +52,8 @@ function hideSearch() {
$searchResults.hide();
$searchBox.slideUp();
+
+ utils.focusSavedElement();
}
function toggleSearch() {
diff --git a/src/public/javascripts/services/utils.js b/src/public/javascripts/services/utils.js
index b4b51a0f9..7fb8ce265 100644
--- a/src/public/javascripts/services/utils.js
+++ b/src/public/javascripts/services/utils.js
@@ -209,9 +209,50 @@ function getMimeTypeClass(mime) {
function closeActiveDialog() {
if (glob.activeDialog) {
glob.activeDialog.modal('hide');
+ glob.activeDialog = null;
}
}
+let $lastFocusedElement = null;
+
+function saveFocusedElement() {
+ $lastFocusedElement = $(":focus");
+}
+
+function focusSavedElement() {
+ if (!$lastFocusedElement) {
+ return;
+ }
+
+ if ($lastFocusedElement.hasClass("ck")) {
+ // must handle CKEditor separately because of this bug: https://github.com/ckeditor/ckeditor5/issues/607
+
+ import("./note_detail.js").then(noteDetail => {
+ noteDetail.default.getActiveEditor().editing.view.focus();
+ });
+ } else {
+ $lastFocusedElement.focus();
+ }
+
+ $lastFocusedElement = null;
+}
+
+function openDialog($dialog) {
+ closeActiveDialog();
+
+ glob.activeDialog = $dialog;
+
+ saveFocusedElement();
+
+ $dialog.modal();
+
+ $dialog.on('hidden.bs.modal', () => {
+ if (!glob.activeDialog || glob.activeDialog === $dialog) {
+ focusSavedElement();
+ }
+ });
+}
+
function isHtmlEmpty(html) {
html = html.toLowerCase();
@@ -281,6 +322,9 @@ export default {
getNoteTypeClass,
getMimeTypeClass,
closeActiveDialog,
+ openDialog,
+ saveFocusedElement,
+ focusSavedElement,
isHtmlEmpty,
clearBrowserCache,
getUrlForDownload,
From 7abaedbf3142555b2bca1e7f6f6d17462980ec0d Mon Sep 17 00:00:00 2001
From: zadam
Date: Sun, 9 Feb 2020 10:12:02 +0100
Subject: [PATCH 3/6] add possibility to change clipper parent to a fixed note
instead of day notes, fixes #854
---
src/routes/api/clipper.js | 21 ++++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)
diff --git a/src/routes/api/clipper.js b/src/routes/api/clipper.js
index 8659f6561..e02fbfaab 100644
--- a/src/routes/api/clipper.js
+++ b/src/routes/api/clipper.js
@@ -1,5 +1,6 @@
"use strict";
+const attributeService = require("../../services/attributes");
const noteService = require('../../services/notes');
const dateNoteService = require('../../services/date_notes');
const dateUtils = require('../../services/date_utils');
@@ -23,16 +24,26 @@ async function findClippingNote(todayNote, pageUrl) {
return null;
}
+async function getClipperInboxNote() {
+ let clipperInbox = await attributeService.getNoteWithLabel('clipperInbox');
+
+ if (!clipperInbox) {
+ clipperInbox = await dateNoteService.getDateNote(dateUtils.localNowDate());
+ }
+
+ return clipperInbox;
+}
+
async function addClipping(req) {
const {title, content, pageUrl, images} = req.body;
- const todayNote = await dateNoteService.getDateNote(dateUtils.localNowDate());
+ const clipperInbox = await getClipperInboxNote();
- let clippingNote = await findClippingNote(todayNote, pageUrl);
+ let clippingNote = await findClippingNote(clipperInbox, pageUrl);
if (!clippingNote) {
clippingNote = (await noteService.createNewNote({
- parentNoteId: todayNote.noteId,
+ parentNoteId: clipperInbox.noteId,
title: title,
content: '',
type: 'text'
@@ -54,10 +65,10 @@ async function addClipping(req) {
async function createNote(req) {
const {title, content, pageUrl, images, clipType} = req.body;
- const todayNote = await dateNoteService.getDateNote(dateUtils.localNowDate());
+ const clipperInbox = await getClipperInboxNote();
const {note} = await noteService.createNewNote({
- parentNoteId: todayNote.noteId,
+ parentNoteId: clipperInbox.noteId,
title,
content,
type: 'text'
From 9eab3026bbce467a9d8699cb6c448fe1bf1aa54e Mon Sep 17 00:00:00 2001
From: zadam
Date: Sun, 9 Feb 2020 10:15:35 +0100
Subject: [PATCH 4/6] display advanced item in the tree context menu in the
middle to avoid being hidden, closes #853
---
src/public/javascripts/services/tree_context_menu.js | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/public/javascripts/services/tree_context_menu.js b/src/public/javascripts/services/tree_context_menu.js
index dc9facebd..85e77c19e 100644
--- a/src/public/javascripts/services/tree_context_menu.js
+++ b/src/public/javascripts/services/tree_context_menu.js
@@ -62,6 +62,11 @@ class TreeContextMenu {
!isHoisted || !isNotRoot ? null : { title: 'Unhoist note ', cmd: "unhoist", uiIcon: "arrow-up" },
{ title: 'Edit branch prefix ', cmd: "editBranchPrefix", uiIcon: "empty",
enabled: isNotRoot && parentNotSearch && noSelectedNotes},
+ { title: "Advanced", uiIcon: "empty", enabled: true, items: [
+ { title: 'Collapse subtree ', cmd: "collapseSubtree", uiIcon: "align-justify", enabled: noSelectedNotes },
+ { title: "Force note sync", cmd: "forceNoteSync", uiIcon: "recycle", enabled: noSelectedNotes },
+ { title: 'Sort alphabetically ', cmd: "sortAlphabetically", uiIcon: "empty", enabled: noSelectedNotes && notSearch }
+ ] },
{ title: "----" },
{ title: "Protect subtree", cmd: "protectSubtree", uiIcon: "check-shield", enabled: noSelectedNotes },
{ title: "Unprotect subtree", cmd: "unprotectSubtree", uiIcon: "shield", enabled: noSelectedNotes },
@@ -84,12 +89,7 @@ class TreeContextMenu {
{ title: "Export", cmd: "export", uiIcon: "empty",
enabled: notSearch && noSelectedNotes },
{ title: "Import into note", cmd: "importIntoNote", uiIcon: "empty",
- enabled: notSearch && noSelectedNotes },
- { title: "Advanced", uiIcon: "empty", enabled: true, items: [
- { title: 'Collapse subtree ', cmd: "collapseSubtree", uiIcon: "align-justify", enabled: noSelectedNotes },
- { title: "Force note sync", cmd: "forceNoteSync", uiIcon: "recycle", enabled: noSelectedNotes },
- { title: 'Sort alphabetically ', cmd: "sortAlphabetically", uiIcon: "empty", enabled: noSelectedNotes && notSearch }
- ] },
+ enabled: notSearch && noSelectedNotes }
].filter(row => row !== null);
}
From 88bd65c6798609a39206722305fab4f8d91d618b Mon Sep 17 00:00:00 2001
From: zadam
Date: Sun, 9 Feb 2020 10:45:07 +0100
Subject: [PATCH 5/6] external links are also parsed and label is created for
them, closes #851
---
src/entities/note.js | 6 +++--
src/public/javascripts/widgets/attributes.js | 14 ++++++++++-
src/services/import/tar.js | 5 ++++
src/services/notes.js | 25 ++++++++++++++++----
4 files changed, 43 insertions(+), 7 deletions(-)
diff --git a/src/entities/note.js b/src/entities/note.js
index 8a7cf219b..3336f377a 100644
--- a/src/entities/note.js
+++ b/src/entities/note.js
@@ -811,8 +811,10 @@ class Note extends Entity {
FROM attributes
WHERE noteId = ? AND
isDeleted = 0 AND
- type = 'relation' AND
- name IN ('internalLink', 'imageLink', 'relationMapLink', 'includeNoteLink')`, [this.noteId]);
+ ((type = 'relation' AND
+ name IN ('internalLink', 'imageLink', 'relationMapLink', 'includeNoteLink'))
+ OR
+ (type = 'label' AND name = 'externalLink'))`, [this.noteId]);
}
/**
diff --git a/src/public/javascripts/widgets/attributes.js b/src/public/javascripts/widgets/attributes.js
index f8fe3c9b0..912e950a0 100644
--- a/src/public/javascripts/widgets/attributes.js
+++ b/src/public/javascripts/widgets/attributes.js
@@ -71,7 +71,19 @@ class AttributesWidget extends StandardWidget {
async renderAttributes(attributes, $container) {
for (const attribute of attributes) {
if (attribute.type === 'label') {
- $container.append(utils.formatLabel(attribute) + " ");
+ if (attribute.name === 'externalLink') {
+ $container.append('@' + attribute.name + "=");
+ $container.append(
+ $('')
+ .text(attribute.value)
+ .attr('href', attribute.value)
+ .addClass('external')
+ );
+ $container.append(" ");
+ }
+ else {
+ $container.append(utils.formatLabel(attribute) + " ");
+ }
} else if (attribute.type === 'relation') {
if (attribute.value) {
$container.append('@' + attribute.name + "=");
diff --git a/src/services/import/tar.js b/src/services/import/tar.js
index 8b0b58ce1..748856a55 100644
--- a/src/services/import/tar.js
+++ b/src/services/import/tar.js
@@ -152,6 +152,11 @@ async function importTar(taskContext, fileBuffer, importRootNote) {
continue;
}
+ if (attr.type === 'label' && attr.name === 'externalLink') {
+ // also created automatically
+ continue;
+ }
+
if (attr.type === 'relation') {
attr.value = getNewNoteId(attr.value);
}
diff --git a/src/services/notes.js b/src/services/notes.js
index a64012714..ffafb4bb6 100644
--- a/src/services/notes.js
+++ b/src/services/notes.js
@@ -242,6 +242,20 @@ function findInternalLinks(content, foundLinks) {
return content.replace(/href="[^"]*#root/g, 'href="#root');
}
+function findExternalLinks(content, foundLinks) {
+ const re = /href="([a-zA-Z]+:\/\/[^"]*)"/g;
+ let match;
+
+ while (match = re.exec(content)) {
+ foundLinks.push({
+ name: 'externalLink',
+ value: match[1]
+ });
+ }
+
+ return content;
+}
+
function findIncludeNoteLinks(content, foundLinks) {
const re = //g;
let match;
@@ -281,6 +295,7 @@ async function saveLinks(note, content) {
if (note.type === 'text') {
content = findImageLinks(content, foundLinks);
content = findInternalLinks(content, foundLinks);
+ content = findExternalLinks(content, foundLinks);
content = findIncludeNoteLinks(content, foundLinks);
}
else if (note.type === 'relation-map') {
@@ -293,9 +308,11 @@ async function saveLinks(note, content) {
const existingLinks = await note.getLinks();
for (const foundLink of foundLinks) {
- const targetNote = await repository.getNote(foundLink.value);
- if (!targetNote || targetNote.isDeleted) {
- continue;
+ if (foundLink.name !== 'externalLink') {
+ const targetNote = await repository.getNote(foundLink.value);
+ if (!targetNote || targetNote.isDeleted) {
+ continue;
+ }
}
const existingLink = existingLinks.find(existingLink =>
@@ -305,7 +322,7 @@ async function saveLinks(note, content) {
if (!existingLink) {
await new Attribute({
noteId: note.noteId,
- type: 'relation',
+ type: foundLink.name === 'externalLink' ? 'label' : 'relation',
name: foundLink.name,
value: foundLink.value,
}).save();
From 4ce4ac9584fafec4615206ecd69d02c385ad71ff Mon Sep 17 00:00:00 2001
From: zadam
Date: Sun, 9 Feb 2020 10:48:23 +0100
Subject: [PATCH 6/6] release 0.40.3
---
package.json | 2 +-
src/services/build.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/package.json b/package.json
index 3fe10d404..1fb61dcc8 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
"name": "trilium",
"productName": "Trilium Notes",
"description": "Trilium Notes",
- "version": "0.40.2",
+ "version": "0.40.3",
"license": "AGPL-3.0-only",
"main": "electron.js",
"bin": {
diff --git a/src/services/build.js b/src/services/build.js
index 9a12d75ae..887b8aecd 100644
--- a/src/services/build.js
+++ b/src/services/build.js
@@ -1 +1 @@
-module.exports = { buildDate:"2020-02-01T10:17:51+01:00", buildRevision: "0f25c8a95f381d99b66735b9c0af3e319edb72ed" };
+module.exports = { buildDate:"2020-02-09T10:48:23+01:00", buildRevision: "88bd65c6798609a39206722305fab4f8d91d618b" };