diff --git a/package-lock.json b/package-lock.json index 274ab3f29..d6b9d0a3d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7268,9 +7268,9 @@ "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" }, "open": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.1.tgz", - "integrity": "sha512-/fVm742AZt6bZ3NpbmBzGpZksDiGbo+xz8RylegKSAnTCgT5u5tvJe0cre3QxICphqHhJHc0OFtFyvU7rNx8+Q==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.0.2.tgz", + "integrity": "sha512-70E/pFTPr7nZ9nLDPNTcj3IVqnNvKuP4VsBmoKV9YGTnChe0mlS3C4qM7qKarhZ8rGaHKLfo+vBTHXDp6ZSyLQ==", "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" diff --git a/package.json b/package.json index fceb08aae..371af27e2 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "mime-types": "2.1.26", "multer": "1.4.2", "node-abi": "2.13.0", - "open": "7.0.1", + "open": "7.0.2", "pngjs": "3.4.0", "portscanner": "2.2.0", "rand-token": "0.4.0", diff --git a/src/public/javascripts/dialogs/note_info.js b/src/public/javascripts/dialogs/note_info.js index 886415440..4eceb3dae 100644 --- a/src/public/javascripts/dialogs/note_info.js +++ b/src/public/javascripts/dialogs/note_info.js @@ -16,11 +16,11 @@ export function showDialog() { $dialog.modal(); - const {note, noteFull} = appContext.getActiveTabContext(); + const {note, noteComplement} = appContext.getActiveTabContext(); $noteId.text(note.noteId); - $dateCreated.text(noteFull.dateCreated); - $dateModified.text(noteFull.dateModified); + $dateCreated.text(noteComplement.dateCreated); + $dateModified.text(noteComplement.dateModified); $type.text(note.type); $mime.text(note.mime); } diff --git a/src/public/javascripts/entities/note_full.js b/src/public/javascripts/entities/note_complement.js similarity index 68% rename from src/public/javascripts/entities/note_full.js rename to src/public/javascripts/entities/note_complement.js index d1b667f51..4c75021bd 100644 --- a/src/public/javascripts/entities/note_full.js +++ b/src/public/javascripts/entities/note_complement.js @@ -1,10 +1,11 @@ -import NoteShort from './note_short.js'; - /** - * Represents full note, specifically including note's content. + * Complements the NoteShort with the main note content and other extra attributes */ -class NoteFull { +class NoteComplement { constructor(row) { + /** @param {string} */ + this.noteId = row.noteId; + /** @param {string} */ this.content = row.content; @@ -22,4 +23,4 @@ class NoteFull { } } -export default NoteFull; \ No newline at end of file +export default NoteComplement; \ No newline at end of file diff --git a/src/public/javascripts/services/app_context.js b/src/public/javascripts/services/app_context.js index 2412d4b9a..bd5c6e0cb 100644 --- a/src/public/javascripts/services/app_context.js +++ b/src/public/javascripts/services/app_context.js @@ -171,7 +171,7 @@ class AppContext { return activeContext ? activeContext.notePath : null; } - /** @return {NoteFull} */ + /** @return {NoteShort} */ getActiveTabNote() { const activeContext = this.getActiveTabContext(); return activeContext ? activeContext.note : null; diff --git a/src/public/javascripts/services/frontend_script_api.js b/src/public/javascripts/services/frontend_script_api.js index cc3d300cd..357084159 100644 --- a/src/public/javascripts/services/frontend_script_api.js +++ b/src/public/javascripts/services/frontend_script_api.js @@ -289,7 +289,7 @@ function FrontendScriptApi(startNote, currentNote, originEntity = null, tabConte /** * @method - * @returns {NoteFull} active note (loaded into right pane) + * @returns {NoteShort} active note (loaded into right pane) */ this.getActiveTabNote = appContext.getActiveTabNote; diff --git a/src/public/javascripts/services/note_detail.js b/src/public/javascripts/services/note_detail.js index f16744157..7548a12dc 100644 --- a/src/public/javascripts/services/note_detail.js +++ b/src/public/javascripts/services/note_detail.js @@ -1,7 +1,7 @@ import server from './server.js'; import ws from "./ws.js"; import treeCache from "./tree_cache.js"; -import NoteFull from "../entities/note_full.js"; +import NoteComplement from "../entities/note_full.js"; import appContext from "./app_context.js"; function getActiveEditor() { @@ -15,10 +15,10 @@ function getActiveEditor() { } } -async function loadNoteFull(noteId) { +async function loadNoteComplement(noteId) { const row = await server.get('notes/' + noteId); - return new NoteFull(row); + return new NoteComplement(row); } function focusOnTitle() { @@ -45,7 +45,7 @@ $(window).on('beforeunload', () => { }); export default { - loadNoteFull, + loadNoteComplement, focusOnTitle, focusAndSelectTitle, getActiveEditor, diff --git a/src/public/javascripts/services/note_tooltip.js b/src/public/javascripts/services/note_tooltip.js index 37b6e34e8..48b698e1a 100644 --- a/src/public/javascripts/services/note_tooltip.js +++ b/src/public/javascripts/services/note_tooltip.js @@ -44,9 +44,9 @@ async function mouseEnterHandler() { const noteId = treeService.getNoteIdFromNotePath(notePath); const note = await treeCache.getNote(noteId); - const noteFull = await noteDetailService.loadNoteFull(noteId); + const noteComplement = await noteDetailService.loadNoteComplement(noteId); - const html = await renderTooltip(note, noteFull); + const html = await renderTooltip(note, noteComplement); // we need to check if we're still hovering over the element // since the operation to get tooltip content was async, it is possible that @@ -71,7 +71,7 @@ function mouseLeaveHandler() { $(this).tooltip('dispose'); } -async function renderTooltip(note, noteFull) { +async function renderTooltip(note, noteComplement) { const attributes = await note.getAttributes(); let content = ''; @@ -117,11 +117,11 @@ async function renderTooltip(note, noteFull) { if (note.type === 'text') { // surround with
")
- .text(noteFull.content)
+ .text(noteComplement.content)
.prop('outerHTML');
}
else if (note.type === 'image') {
diff --git a/src/public/javascripts/services/tab_context.js b/src/public/javascripts/services/tab_context.js
index 0f7a98594..6ae5a06ac 100644
--- a/src/public/javascripts/services/tab_context.js
+++ b/src/public/javascripts/services/tab_context.js
@@ -51,8 +51,8 @@ class TabContext extends Component {
/** @property {NoteShort} */
this.note = await treeCache.getNote(noteId);
- /** @property {NoteFull} */
- this.noteFull = await noteDetailService.loadNoteFull(noteId);
+ /** @property {NoteComplement} */
+ this.noteComplement = await noteDetailService.loadNoteComplement(noteId);
//this.cleanup(); // esp. on windows autocomplete is not getting closed automatically
diff --git a/src/public/javascripts/widgets/component.js b/src/public/javascripts/widgets/component.js
index ce813c0a4..d19354767 100644
--- a/src/public/javascripts/widgets/component.js
+++ b/src/public/javascripts/widgets/component.js
@@ -1,7 +1,9 @@
+import utils from '../services/utils.js';
+
export default class Component {
/** @param {AppContext} appContext */
constructor(appContext) {
- this.componentId = `component-${this.constructor.name}`;
+ this.componentId = `comp-${this.constructor.name}-` + utils.randomString(10);
this.appContext = appContext;
/** @type Component[] */
this.children = [];
diff --git a/src/public/javascripts/widgets/note_detail.js b/src/public/javascripts/widgets/note_detail.js
index dadb9d09f..b0e3de14c 100644
--- a/src/public/javascripts/widgets/note_detail.js
+++ b/src/public/javascripts/widgets/note_detail.js
@@ -37,18 +37,17 @@ export default class NoteDetailWidget extends TabAwareWidget {
this.typeWidgetPromises = {};
this.spacedUpdate = new SpacedUpdate(async () => {
- const {noteFull, note} = this.tabContext;
+ const {noteComplement, note} = this.tabContext;
const {noteId} = note;
// FIXME hack
const dto = note.dto;
- dto.content = noteFull.content = this.getTypeWidget().getContent();
+ dto.content = noteComplement.content = this.getTypeWidget().getContent();
const resp = await server.put('notes/' + noteId, dto, this.componentId);
- // FIXME: minor - does not propagate to other tab contexts with this note though
- noteFull.dateModified = resp.dateModified;
- noteFull.utcDateModified = resp.utcDateModified;
+ noteComplement.dateModified = resp.dateModified;
+ noteComplement.utcDateModified = resp.utcDateModified;
this.trigger('noteChangesSaved', {noteId})
});
@@ -161,7 +160,7 @@ export default class NoteDetailWidget extends TabAwareWidget {
let type = note.type;
if (type === 'text' && !disableAutoBook
- && utils.isHtmlEmpty(this.tabContext.noteFull.content)
+ && utils.isHtmlEmpty(this.tabContext.noteComplement.content)
&& note.hasChildren()) {
type = 'book';
@@ -223,9 +222,7 @@ export default class NoteDetailWidget extends TabAwareWidget {
async entitiesReloadedListener({loadResults}) {
if (loadResults.isNoteContentReloaded(this.noteId, this.componentId)) {
- this.tabContext.noteFull = await noteDetailService.loadNoteFull(this.noteId);
-
- console.log("Reloaded", this.tabContext.noteFull);
+ this.tabContext.noteComplement = await noteDetailService.loadNoteComplement(this.noteId);
this.refreshWithNote(this.note, this.notePath);
}
diff --git a/src/public/javascripts/widgets/note_info.js b/src/public/javascripts/widgets/note_info.js
index 4d87caac4..1825076cc 100644
--- a/src/public/javascripts/widgets/note_info.js
+++ b/src/public/javascripts/widgets/note_info.js
@@ -49,16 +49,16 @@ class NoteInfoWidget extends StandardWidget {
const $type = this.$body.find(".note-info-type");
const $mime = this.$body.find(".note-info-mime");
- const {noteFull} = this.tabContext;
+ const {noteComplement} = this.tabContext;
$noteId.text(note.noteId);
$dateCreated
- .text(noteFull.dateCreated)
- .attr("title", noteFull.dateCreated);
+ .text(noteComplement.dateCreated)
+ .attr("title", noteComplement.dateCreated);
$dateModified
- .text(noteFull.dateModified)
- .attr("title", noteFull.dateCreated);
+ .text(noteComplement.dateModified)
+ .attr("title", noteComplement.dateCreated);
$type.text(note.type);
diff --git a/src/public/javascripts/widgets/type_widgets/code.js b/src/public/javascripts/widgets/type_widgets/code.js
index ce791579d..157821b99 100644
--- a/src/public/javascripts/widgets/type_widgets/code.js
+++ b/src/public/javascripts/widgets/type_widgets/code.js
@@ -75,7 +75,7 @@ export default class CodeTypeWidget extends TypeWidget {
this.spacedUpdate.allowUpdateWithoutChange(() => {
// CodeMirror breaks pretty badly on null so even though it shouldn't happen (guarded by consistency check)
// we provide fallback
- this.codeEditor.setValue(this.tabContext.noteFull.content || "");
+ this.codeEditor.setValue(this.tabContext.noteComplement.content || "");
const info = CodeMirror.findModeByMIME(note.mime);
diff --git a/src/public/javascripts/widgets/type_widgets/file.js b/src/public/javascripts/widgets/type_widgets/file.js
index c539e5032..953fb21ac 100644
--- a/src/public/javascripts/widgets/type_widgets/file.js
+++ b/src/public/javascripts/widgets/type_widgets/file.js
@@ -128,9 +128,9 @@ export default class FileTypeWidget extends TypeWidget {
this.$fileSize.text(note.contentLength + " bytes");
this.$fileType.text(note.mime);
- if (this.tabContext.noteFull.content) {
+ if (this.tabContext.noteComplement.content) {
this.$previewContent.show();
- this.$previewContent.text(this.tabContext.noteFull.content);
+ this.$previewContent.text(this.tabContext.noteComplement.content);
}
else {
this.$previewContent.empty().hide();
diff --git a/src/public/javascripts/widgets/type_widgets/image.js b/src/public/javascripts/widgets/type_widgets/image.js
index bfe59aa53..12a01c241 100644
--- a/src/public/javascripts/widgets/type_widgets/image.js
+++ b/src/public/javascripts/widgets/type_widgets/image.js
@@ -132,7 +132,7 @@ class NoteDetailImage extends TypeWidget {
this.$fileSize.text(note.contentLength + " bytes");
this.$fileType.text(note.mime);
- const imageHash = this.tabContext.noteFull.utcDateModified.replace(" ", "_");
+ const imageHash = this.tabContext.noteComplement.utcDateModified.replace(" ", "_");
this.$imageView.prop("src", `api/images/${note.noteId}/${note.title}?${imageHash}`);
}
diff --git a/src/public/javascripts/widgets/type_widgets/relation_map.js b/src/public/javascripts/widgets/type_widgets/relation_map.js
index f876b1947..007922104 100644
--- a/src/public/javascripts/widgets/type_widgets/relation_map.js
+++ b/src/public/javascripts/widgets/type_widgets/relation_map.js
@@ -254,9 +254,9 @@ export default class RelationMapTypeWidget extends TypeWidget {
}
};
- if (this.tabContext.noteFull.content) {
+ if (this.tabContext.noteComplement.content) {
try {
- this.mapData = JSON.parse(this.tabContext.noteFull.content);
+ this.mapData = JSON.parse(this.tabContext.noteComplement.content);
} catch (e) {
console.log("Could not parse content: ", e);
}
diff --git a/src/public/javascripts/widgets/type_widgets/search.js b/src/public/javascripts/widgets/type_widgets/search.js
index 1abb1eaa7..7f8be075d 100644
--- a/src/public/javascripts/widgets/type_widgets/search.js
+++ b/src/public/javascripts/widgets/type_widgets/search.js
@@ -45,7 +45,7 @@ export default class SearchTypeWidget extends TypeWidget {
this.$component.show();
try {
- const json = JSON.parse(this.tabContext.noteFull.content);
+ const json = JSON.parse(this.tabContext.noteComplement.content);
this.$searchString.val(json.searchString);
}
diff --git a/src/public/javascripts/widgets/type_widgets/text.js b/src/public/javascripts/widgets/type_widgets/text.js
index 71198656a..11e4edfab 100644
--- a/src/public/javascripts/widgets/type_widgets/text.js
+++ b/src/public/javascripts/widgets/type_widgets/text.js
@@ -140,7 +140,7 @@ export default class TextTypeWidget extends TypeWidget {
this.textEditor.isReadOnly = await note.hasLabel('readOnly');
this.spacedUpdate.allowUpdateWithoutChange(() => {
- this.textEditor.setData(this.tabContext.noteFull.content);
+ this.textEditor.setData(this.tabContext.noteComplement.content);
});
}
diff --git a/src/routes/routes.js b/src/routes/routes.js
index bf9596685..1e6c0ce74 100644
--- a/src/routes/routes.js
+++ b/src/routes/routes.js
@@ -1,5 +1,3 @@
-import * as syncService from "../services/sync.js";
-
const setupRoute = require('./setup');
const loginRoute = require('./login');
const indexRoute = require('./index');
@@ -46,7 +44,7 @@ const auth = require('../services/auth');
const cls = require('../services/cls');
const sql = require('../services/sql');
const protectedSessionService = require('../services/protected_session');
-const syncTableService = require('../services/sync_table');
+const syncService = require('../services/sync');
const csurf = require('csurf');
const csrfMiddleware = csurf({