This commit is contained in:
zadam 2020-07-04 00:20:23 +02:00
parent bfa69a3dc3
commit 69d529ada1
7 changed files with 49 additions and 108 deletions

6
package-lock.json generated
View File

@ -2841,9 +2841,9 @@
}
},
"electron": {
"version": "10.0.0-beta.8",
"resolved": "https://registry.npmjs.org/electron/-/electron-10.0.0-beta.8.tgz",
"integrity": "sha512-LTGVPTwBZkKNMNO8RP6ibBdAOyfnc8MFOS8ULYIavsPWMVDR4FwJJoq08++MnbYxV79/6P5SvPy1BCnSpetmTQ==",
"version": "10.0.0-beta.4",
"resolved": "https://registry.npmjs.org/electron/-/electron-10.0.0-beta.4.tgz",
"integrity": "sha512-/Jp9i0yiuM/WUdiKFjf7+5gZQJITGhijl++Zp31m94MY+QNMLEnFhaKLSqzrmPA2FPrXn2KlUPNpQs+4Wjcvpg==",
"dev": true,
"requires": {
"@electron/get": "^1.0.1",

View File

@ -76,7 +76,7 @@
},
"devDependencies": {
"cross-env": "^7.0.2",
"electron": "10.0.0-beta.8",
"electron": "10.0.0-beta.4",
"electron-builder": "22.7.0",
"electron-packager": "15.0.0",
"electron-rebuild": "1.11.0",

View File

@ -19,7 +19,6 @@ import PromotedAttributesWidget from "../widgets/promoted_attributes.js";
import NoteDetailWidget from "../widgets/note_detail.js";
import NoteInfoWidget from "../widgets/collapsible_widgets/note_info.js";
import CalendarWidget from "../widgets/collapsible_widgets/calendar.js";
import AttributesWidget from "../widgets/collapsible_widgets/attributes.js";
import LinkMapWidget from "../widgets/collapsible_widgets/link_map.js";
import NoteRevisionsWidget from "../widgets/collapsible_widgets/note_revisions.js";
import SimilarNotesWidget from "../widgets/collapsible_widgets/similar_notes.js";
@ -147,7 +146,6 @@ export default class DesktopMainWindowLayout {
.child(new NoteInfoWidget())
.child(new TabCachingWidget(() => new CalendarWidget()))
.child(new TabCachingWidget(() => new EditedNotesWidget()))
.child(new TabCachingWidget(() => new AttributesWidget()))
.child(new TabCachingWidget(() => new LinkMapWidget()))
.child(new TabCachingWidget(() => new NoteRevisionsWidget()))
.child(new TabCachingWidget(() => new SimilarNotesWidget()))

View File

@ -105,8 +105,6 @@ export default class AttributeDetailWidget extends BasicWidget {
this.$closeAttrDetailButton.on('click', () => this.hide());
$(window).on('mouseup', e => {
console.log("click", e.target);
if (!$(e.target).closest(this.$widget[0]).length) {
this.hide();
}

View File

@ -1,94 +0,0 @@
import utils from "../../services/utils.js";
import linkService from "../../services/link.js";
import ws from "../../services/ws.js";
import CollapsibleWidget from "../collapsible_widget.js";
export default class AttributesWidget extends CollapsibleWidget {
get widgetTitle() { return "Attributes"; }
get help() {
return {
title: "Attributes are key-value records owned by assigned to this note.",
url: "https://github.com/zadam/trilium/wiki/Attributes"
};
}
get headerActions() {
const $showFullButton = $("<a>").append("show dialog").addClass('widget-header-action');
$showFullButton.on('click', async () => {
const attributesDialog = await import("../../dialogs/attributes.js");
attributesDialog.showDialog();
});
return [$showFullButton];
}
async refreshWithNote(note) {
const ownedAttributes = note.getOwnedAttributes();
const $attributesContainer = $("<div>");
await this.renderAttributes(ownedAttributes, $attributesContainer);
const $inheritedAttrs = $("<span>").append($("<strong>").text("Inherited: "));
const $showInheritedAttributes = $("<a>")
.attr("href", "javascript:")
.text("+show inherited")
.on('click', async () => {
const attributes = note.getAttributes();
const inheritedAttributes = attributes.filter(attr => attr.noteId !== this.noteId);
if (inheritedAttributes.length === 0) {
$inheritedAttrs.text("No inherited attributes yet...");
}
else {
await this.renderAttributes(inheritedAttributes, $inheritedAttrs);
}
$inheritedAttrs.show();
$showInheritedAttributes.hide();
$hideInheritedAttributes.show();
});
const $hideInheritedAttributes = $("<a>")
.attr("href", "javascript:")
.text("-hide inherited")
.on('click', () => {
$showInheritedAttributes.show();
$hideInheritedAttributes.hide();
$inheritedAttrs.empty().hide();
});
$attributesContainer.append($showInheritedAttributes, $inheritedAttrs, $hideInheritedAttributes);
$inheritedAttrs.hide();
$hideInheritedAttributes.hide();
this.$body.empty().append($attributesContainer);
}
async renderAttributes(attributes, $container) {
for (const attribute of attributes) {
if (attribute.type === 'label') {
$container.append(utils.formatLabel(attribute) + " ");
} else if (attribute.type === 'relation') {
if (attribute.value) {
$container.append('@' + attribute.name + "=");
$container.append(await linkService.createNoteLink(attribute.value));
$container.append(" ");
} else {
ws.logError(`Relation ${attribute.attributeId} has empty target`);
}
} else if (attribute.type === 'label-definition' || attribute.type === 'relation-definition') {
$container.append(attribute.name + " definition ");
} else {
ws.logError("Unknown attr type: " + attribute.type);
}
}
}
entitiesReloadedEvent({loadResults}) {
if (loadResults.getAttributes().find(attr => attr.noteId === this.noteId)) {
this.refresh();
}
}
}

View File

@ -7,6 +7,7 @@ import ws from "../services/ws.js";
import SpacedUpdate from "../services/spaced_update.js";
import attributesParser from "../services/attribute_parser.js";
import AttributeDetailWidget from "./attribute_detail.js";
import contextMenuService from "../services/context_menu.js";
const mentionSetup = {
feeds: [
@ -144,6 +145,19 @@ const TPL = `
.attr-expander.error hr {
border-color: red;
}
.add-new-attribute-button {
position: absolute;
bottom: 5px;
right: 5px;
cursor: pointer;
border: 1px solid transparent;
}
.add-new-attribute-button:hover {
border: 1px solid var(--main-border-color);
border-radius: 2px;
}
</style>
<div class="attr-expander attr-owned-expander">
@ -155,7 +169,11 @@ const TPL = `
</div>
<div class="attr-display">
<div class="note-attributes-editor" tabindex="200"></div>
<div style="position: relative">
<div class="note-attributes-editor" tabindex="200"></div>
<div class="bx bx-plus add-new-attribute-button"></div>
</div>
<hr class="w-100 attr-inherited-empty-expander" style="margin-bottom: 10px;">
@ -234,6 +252,24 @@ export default class NoteAttributesWidget extends TabAwareWidget {
this.attributeDetailWidget.hide();
});
this.$addNewAttributeButton = this.$widget.find('.add-new-attribute-button');
this.$addNewAttributeButton.on('click', e => {
contextMenuService.show({
x: e.pageX,
y: e.pageY,
items: [
{title: "Add new label", command: "addNewLabel", uiIcon: "hash"},
{title: "Add new relation", command: "addNewRelation", uiIcon: "transfer"},
{title: "----"},
{title: "Add new label definition", command: "addNewRelation", uiIcon: "empty"},
{title: "Add new relation definition", command: "addNewRelation", uiIcon: "empty"},
],
selectMenuItemHandler: ({command}) => {
console.log(command);
}
});
});
this.$widget.append(this.attributeDetailWidget.render());
}
@ -389,7 +425,7 @@ export default class NoteAttributesWidget extends TabAwareWidget {
});
const inheritedAttributes = note.getAttributes().filter(attr => attr.noteId !== this.noteId);
console.log("inheritedAttributes", inheritedAttributes);
if (inheritedAttributes.length === 0) {
this.$inheritedExpander.hide();
this.$inheritedEmptyExpander.show();
@ -402,6 +438,8 @@ console.log("inheritedAttributes", inheritedAttributes);
this.$inheritedExpanderText.text(inheritedAttributes.length + ' inherited ' + this.attrPlural(inheritedAttributes.length));
await this.renderAttributes(inheritedAttributes, this.$inheritedAttributes);
this.parseAttributes();
}
attrPlural(number) {

View File

@ -5,18 +5,19 @@ const optionService = require('./options');
const fs = require('fs-extra');
const dataDir = require('./data_dir');
const log = require('./log');
const sqlInit = require('./sql_init');
const syncMutexService = require('./sync_mutex');
const attributeService = require('./attributes');
const cls = require('./cls');
const Database = require('better-sqlite3');
function regularBackup() {
periodBackup('lastDailyBackupDate', 'daily', 24 * 3600);
cls.init(() => {
periodBackup('lastDailyBackupDate', 'daily', 24 * 3600);
periodBackup('lastWeeklyBackupDate', 'weekly', 7 * 24 * 3600);
periodBackup('lastWeeklyBackupDate', 'weekly', 7 * 24 * 3600);
periodBackup('lastMonthlyBackupDate', 'monthly', 30 * 24 * 3600);
periodBackup('lastMonthlyBackupDate', 'monthly', 30 * 24 * 3600);
});
}
function periodBackup(optionName, fileName, periodInSeconds) {