diff --git a/src/public/app/entities/attribute.js b/src/public/app/entities/attribute.js
index d7a42b4ec..61254592b 100644
--- a/src/public/app/entities/attribute.js
+++ b/src/public/app/entities/attribute.js
@@ -56,6 +56,10 @@ class Attribute {
* 3. attribute is owned by some note's ancestor and is inheritable
*/
isAffecting(affectedNote) {
+ if (!affectedNote) {
+ return false;
+ }
+
const attrNote = this.getNote();
const owningNotes = [affectedNote, ...affectedNote.getTemplateNotes()];
diff --git a/src/public/app/entities/note_short.js b/src/public/app/entities/note_short.js
index 6bbb54bc3..868714280 100644
--- a/src/public/app/entities/note_short.js
+++ b/src/public/app/entities/note_short.js
@@ -180,22 +180,9 @@ class NoteShort {
return [];
}
- if (!(this.noteId in noteAttributeCache)) {
- const ownedAttributes = this.getOwnedAttributes();
-
- const attrArrs = [
- ownedAttributes
- ];
-
+ if (!(this.noteId in noteAttributeCache.attributes)) {
const newPath = [...path, this.noteId];
-
- for (const templateAttr of ownedAttributes.filter(oa => oa.type === 'relation' && oa.name === 'template')) {
- const templateNote = this.treeCache.notes[templateAttr.value];
-
- if (templateNote && templateNote.noteId !== this.noteId) {
- attrArrs.push(templateNote.__getCachedAttributes(newPath));
- }
- }
+ const attrArrs = [ this.getOwnedAttributes() ];
if (this.noteId !== 'root') {
for (const parentNote of this.getParentNotes()) {
@@ -206,6 +193,14 @@ class NoteShort {
}
}
+ for (const templateAttr of attrArrs.flat().filter(attr => attr.type === 'relation' && attr.name === 'template')) {
+ const templateNote = this.treeCache.notes[templateAttr.value];
+
+ if (templateNote && templateNote.noteId !== this.noteId) {
+ attrArrs.push(templateNote.__getCachedAttributes(newPath));
+ }
+ }
+
noteAttributeCache.attributes[this.noteId] = attrArrs.flat();
}
diff --git a/src/public/app/widgets/note_attributes.js b/src/public/app/widgets/note_attributes.js
index af7beda7e..34cc83b92 100644
--- a/src/public/app/widgets/note_attributes.js
+++ b/src/public/app/widgets/note_attributes.js
@@ -157,7 +157,7 @@ const TPL = `
-
+
@@ -394,10 +394,9 @@ export default class NoteAttributesWidget extends TabAwareWidget {
this.textEditor.setData($attributesContainer.html());
});
- const inheritedAttributes = note.getAttributes().filter(attr => attr.isInheritable && attr.noteId !== this.noteId);
- const inheritedAttributeCount = inheritedAttributes.length;
-
- if (inheritedAttributeCount === 0) {
+ const inheritedAttributes = note.getAttributes().filter(attr => attr.noteId !== this.noteId);
+console.log("inheritedAttributes", inheritedAttributes);
+ if (inheritedAttributes.length === 0) {
this.$inheritedExpander.hide();
this.$inheritedEmptyExpander.show();
}
@@ -406,7 +405,7 @@ export default class NoteAttributesWidget extends TabAwareWidget {
this.$inheritedEmptyExpander.hide();
}
- this.$inheritedExpanderText.text(inheritedAttributeCount + ' inherited ' + this.attrPlural(inheritedAttributeCount));
+ this.$inheritedExpanderText.text(inheritedAttributes.length + ' inherited ' + this.attrPlural(inheritedAttributes.length));
await this.renderAttributes(inheritedAttributes, this.$inheritedAttributes);
}
diff --git a/src/routes/api/import.js b/src/routes/api/import.js
index 80c76b8a4..668725515 100644
--- a/src/routes/api/import.js
+++ b/src/routes/api/import.js
@@ -12,7 +12,7 @@ const noteCacheService = require('../../services/note_cache/note_cache.js');
const log = require('../../services/log');
const TaskContext = require('../../services/task_context.js');
-function importToBranch(req) {
+async function importToBranch(req) {
const {parentNoteId} = req.params;
const {taskId, last} = req.body;
@@ -49,19 +49,15 @@ function importToBranch(req) {
try {
if (extension === '.tar' && options.explodeArchives) {
- note = tarImportService.importTar(taskContext, file.buffer, parentNote);
+ note = await tarImportService.importTar(taskContext, file.buffer, parentNote);
} else if (extension === '.zip' && options.explodeArchives) {
- const start = Date.now();
-
- note = zipImportService.importZip(taskContext, file.buffer, parentNote);
-
- console.log("Import took", Date.now() - start, "ms");
+ note = await zipImportService.importZip(taskContext, file.buffer, parentNote);
} else if (extension === '.opml' && options.explodeArchives) {
- note = opmlImportService.importOpml(taskContext, file.buffer, parentNote);
+ note = await opmlImportService.importOpml(taskContext, file.buffer, parentNote);
} else if (extension === '.enex' && options.explodeArchives) {
- note = enexImportService.importEnex(taskContext, file, parentNote);
+ note = await enexImportService.importEnex(taskContext, file, parentNote);
} else {
- note = singleImportService.importSingleFile(taskContext, file, parentNote);
+ note = await singleImportService.importSingleFile(taskContext, file, parentNote);
}
}
catch (e) {
@@ -83,8 +79,8 @@ function importToBranch(req) {
// import has deactivated note events so note cache is not updated
// instead we force it to reload (can be async)
- // FIXME
- //noteCacheService.load();
+
+ noteCacheService.load();
return note;
}
diff --git a/src/services/attributes.js b/src/services/attributes.js
index bb227314c..9f10b7963 100644
--- a/src/services/attributes.js
+++ b/src/services/attributes.js
@@ -5,7 +5,7 @@ const sql = require('./sql');
const utils = require('./utils');
const Attribute = require('../entities/attribute');
-const ATTRIBUTE_TYPES = [ 'label', 'label-definition', 'relation', 'relation-definition' ];
+const ATTRIBUTE_TYPES = [ 'label', 'relation' ];
const BUILTIN_ATTRIBUTES = [
// label names
diff --git a/src/services/import/tar.js b/src/services/import/tar.js
index c668bcd7d..b37591809 100644
--- a/src/services/import/tar.js
+++ b/src/services/import/tar.js
@@ -23,7 +23,7 @@ const treeService = require("../tree");
* @param {Note} importRootNote
* @return {Promise<*>}
*/
-function importTar(taskContext, fileBuffer, importRootNote) {
+async function importTar(taskContext, fileBuffer, importRootNote) {
// maps from original noteId (in tar file) to newly generated noteId
const noteIdMap = {};
const attributes = [];
diff --git a/src/services/import/zip.js b/src/services/import/zip.js
index 18a0b77ca..fcd3541de 100644
--- a/src/services/import/zip.js
+++ b/src/services/import/zip.js
@@ -21,7 +21,7 @@ const yauzl = require("yauzl");
* @param {Note} importRootNote
* @return {Promise<*>}
*/
-function importZip(taskContext, fileBuffer, importRootNote) {
+async function importZip(taskContext, fileBuffer, importRootNote) {
// maps from original noteId (in tar file) to newly generated noteId
const noteIdMap = {};
const attributes = [];
@@ -133,6 +133,15 @@ function importZip(taskContext, fileBuffer, importRootNote) {
for (const attr of noteMeta.attributes) {
attr.noteId = note.noteId;
+ if (attr.type === 'label-definition') {
+ attr.type = 'label';
+ attr.name = 'label:' + attr.name;
+ }
+ else if (attr.type === 'relation-definition') {
+ attr.type = 'label';
+ attr.name = 'relation:' + attr.name;
+ }
+
if (!attributeService.isAttributeType(attr.type)) {
log.error("Unrecognized attribute type " + attr.type);
continue;
@@ -405,11 +414,11 @@ function importZip(taskContext, fileBuffer, importRootNote) {
// we're running two passes to make sure that the meta file is loaded before the rest of the files is processed.
- readZipFile(fileBuffer, (zipfile, entry) => {
+ await readZipFile(fileBuffer, async (zipfile, entry) => {
const filePath = normalizeFilePath(entry.fileName);
if (filePath === '!!!meta.json') {
- const content = readContent(zipfile, entry);
+ const content = await readContent(zipfile, entry);
metaFile = JSON.parse(content.toString("UTF-8"));
}
@@ -417,14 +426,14 @@ function importZip(taskContext, fileBuffer, importRootNote) {
zipfile.readEntry();
});
- readZipFile(fileBuffer, (zipfile, entry) => {
+ await readZipFile(fileBuffer, async (zipfile, entry) => {
const filePath = normalizeFilePath(entry.fileName);
if (/\/$/.test(entry.fileName)) {
saveDirectory(filePath);
}
else if (filePath !== '!!!meta.json') {
- const content = readContent(zipfile, entry);
+ const content = await readContent(zipfile, entry);
saveNote(filePath, content);
}
diff --git a/src/services/note_cache/entities/attribute.js b/src/services/note_cache/entities/attribute.js
index 73ae80e86..b9103df4c 100644
--- a/src/services/note_cache/entities/attribute.js
+++ b/src/services/note_cache/entities/attribute.js
@@ -13,7 +13,7 @@ class Attribute {
/** @param {string} */
this.name = row.name.toLowerCase();
/** @param {string} */
- this.value = row.type === 'label'? row.value.toLowerCase() : row.value;
+ this.value = row.type === 'label' ? row.value.toLowerCase() : row.value;
/** @param {boolean} */
this.isInheritable = !!row.isInheritable;