mirror of
https://github.com/zadam/trilium.git
synced 2025-06-06 18:08:33 +02:00
wip
This commit is contained in:
parent
bfa69a3dc3
commit
69d529ada1
6
package-lock.json
generated
6
package-lock.json
generated
@ -2841,9 +2841,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"electron": {
|
"electron": {
|
||||||
"version": "10.0.0-beta.8",
|
"version": "10.0.0-beta.4",
|
||||||
"resolved": "https://registry.npmjs.org/electron/-/electron-10.0.0-beta.8.tgz",
|
"resolved": "https://registry.npmjs.org/electron/-/electron-10.0.0-beta.4.tgz",
|
||||||
"integrity": "sha512-LTGVPTwBZkKNMNO8RP6ibBdAOyfnc8MFOS8ULYIavsPWMVDR4FwJJoq08++MnbYxV79/6P5SvPy1BCnSpetmTQ==",
|
"integrity": "sha512-/Jp9i0yiuM/WUdiKFjf7+5gZQJITGhijl++Zp31m94MY+QNMLEnFhaKLSqzrmPA2FPrXn2KlUPNpQs+4Wjcvpg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@electron/get": "^1.0.1",
|
"@electron/get": "^1.0.1",
|
||||||
|
@ -76,7 +76,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"cross-env": "^7.0.2",
|
"cross-env": "^7.0.2",
|
||||||
"electron": "10.0.0-beta.8",
|
"electron": "10.0.0-beta.4",
|
||||||
"electron-builder": "22.7.0",
|
"electron-builder": "22.7.0",
|
||||||
"electron-packager": "15.0.0",
|
"electron-packager": "15.0.0",
|
||||||
"electron-rebuild": "1.11.0",
|
"electron-rebuild": "1.11.0",
|
||||||
|
@ -19,7 +19,6 @@ import PromotedAttributesWidget from "../widgets/promoted_attributes.js";
|
|||||||
import NoteDetailWidget from "../widgets/note_detail.js";
|
import NoteDetailWidget from "../widgets/note_detail.js";
|
||||||
import NoteInfoWidget from "../widgets/collapsible_widgets/note_info.js";
|
import NoteInfoWidget from "../widgets/collapsible_widgets/note_info.js";
|
||||||
import CalendarWidget from "../widgets/collapsible_widgets/calendar.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 LinkMapWidget from "../widgets/collapsible_widgets/link_map.js";
|
||||||
import NoteRevisionsWidget from "../widgets/collapsible_widgets/note_revisions.js";
|
import NoteRevisionsWidget from "../widgets/collapsible_widgets/note_revisions.js";
|
||||||
import SimilarNotesWidget from "../widgets/collapsible_widgets/similar_notes.js";
|
import SimilarNotesWidget from "../widgets/collapsible_widgets/similar_notes.js";
|
||||||
@ -147,7 +146,6 @@ export default class DesktopMainWindowLayout {
|
|||||||
.child(new NoteInfoWidget())
|
.child(new NoteInfoWidget())
|
||||||
.child(new TabCachingWidget(() => new CalendarWidget()))
|
.child(new TabCachingWidget(() => new CalendarWidget()))
|
||||||
.child(new TabCachingWidget(() => new EditedNotesWidget()))
|
.child(new TabCachingWidget(() => new EditedNotesWidget()))
|
||||||
.child(new TabCachingWidget(() => new AttributesWidget()))
|
|
||||||
.child(new TabCachingWidget(() => new LinkMapWidget()))
|
.child(new TabCachingWidget(() => new LinkMapWidget()))
|
||||||
.child(new TabCachingWidget(() => new NoteRevisionsWidget()))
|
.child(new TabCachingWidget(() => new NoteRevisionsWidget()))
|
||||||
.child(new TabCachingWidget(() => new SimilarNotesWidget()))
|
.child(new TabCachingWidget(() => new SimilarNotesWidget()))
|
||||||
|
@ -105,8 +105,6 @@ export default class AttributeDetailWidget extends BasicWidget {
|
|||||||
this.$closeAttrDetailButton.on('click', () => this.hide());
|
this.$closeAttrDetailButton.on('click', () => this.hide());
|
||||||
|
|
||||||
$(window).on('mouseup', e => {
|
$(window).on('mouseup', e => {
|
||||||
console.log("click", e.target);
|
|
||||||
|
|
||||||
if (!$(e.target).closest(this.$widget[0]).length) {
|
if (!$(e.target).closest(this.$widget[0]).length) {
|
||||||
this.hide();
|
this.hide();
|
||||||
}
|
}
|
||||||
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -7,6 +7,7 @@ import ws from "../services/ws.js";
|
|||||||
import SpacedUpdate from "../services/spaced_update.js";
|
import SpacedUpdate from "../services/spaced_update.js";
|
||||||
import attributesParser from "../services/attribute_parser.js";
|
import attributesParser from "../services/attribute_parser.js";
|
||||||
import AttributeDetailWidget from "./attribute_detail.js";
|
import AttributeDetailWidget from "./attribute_detail.js";
|
||||||
|
import contextMenuService from "../services/context_menu.js";
|
||||||
|
|
||||||
const mentionSetup = {
|
const mentionSetup = {
|
||||||
feeds: [
|
feeds: [
|
||||||
@ -144,6 +145,19 @@ const TPL = `
|
|||||||
.attr-expander.error hr {
|
.attr-expander.error hr {
|
||||||
border-color: red;
|
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>
|
</style>
|
||||||
|
|
||||||
<div class="attr-expander attr-owned-expander">
|
<div class="attr-expander attr-owned-expander">
|
||||||
@ -155,7 +169,11 @@ const TPL = `
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="attr-display">
|
<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;">
|
<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.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());
|
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);
|
const inheritedAttributes = note.getAttributes().filter(attr => attr.noteId !== this.noteId);
|
||||||
console.log("inheritedAttributes", inheritedAttributes);
|
|
||||||
if (inheritedAttributes.length === 0) {
|
if (inheritedAttributes.length === 0) {
|
||||||
this.$inheritedExpander.hide();
|
this.$inheritedExpander.hide();
|
||||||
this.$inheritedEmptyExpander.show();
|
this.$inheritedEmptyExpander.show();
|
||||||
@ -402,6 +438,8 @@ console.log("inheritedAttributes", inheritedAttributes);
|
|||||||
this.$inheritedExpanderText.text(inheritedAttributes.length + ' inherited ' + this.attrPlural(inheritedAttributes.length));
|
this.$inheritedExpanderText.text(inheritedAttributes.length + ' inherited ' + this.attrPlural(inheritedAttributes.length));
|
||||||
|
|
||||||
await this.renderAttributes(inheritedAttributes, this.$inheritedAttributes);
|
await this.renderAttributes(inheritedAttributes, this.$inheritedAttributes);
|
||||||
|
|
||||||
|
this.parseAttributes();
|
||||||
}
|
}
|
||||||
|
|
||||||
attrPlural(number) {
|
attrPlural(number) {
|
||||||
|
@ -5,18 +5,19 @@ const optionService = require('./options');
|
|||||||
const fs = require('fs-extra');
|
const fs = require('fs-extra');
|
||||||
const dataDir = require('./data_dir');
|
const dataDir = require('./data_dir');
|
||||||
const log = require('./log');
|
const log = require('./log');
|
||||||
const sqlInit = require('./sql_init');
|
|
||||||
const syncMutexService = require('./sync_mutex');
|
const syncMutexService = require('./sync_mutex');
|
||||||
const attributeService = require('./attributes');
|
const attributeService = require('./attributes');
|
||||||
const cls = require('./cls');
|
const cls = require('./cls');
|
||||||
const Database = require('better-sqlite3');
|
const Database = require('better-sqlite3');
|
||||||
|
|
||||||
function regularBackup() {
|
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) {
|
function periodBackup(optionName, fileName, periodInSeconds) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user