mirror of
https://github.com/zadam/trilium.git
synced 2025-06-06 18:08:33 +02:00
Merge branch 'master' into next53
This commit is contained in:
commit
4211d0feda
2
libraries/ckeditor/ckeditor.js
vendored
2
libraries/ckeditor/ckeditor.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -2,7 +2,7 @@
|
|||||||
"name": "trilium",
|
"name": "trilium",
|
||||||
"productName": "Trilium Notes",
|
"productName": "Trilium Notes",
|
||||||
"description": "Trilium Notes",
|
"description": "Trilium Notes",
|
||||||
"version": "0.52.0-beta",
|
"version": "0.52.1-beta",
|
||||||
"license": "AGPL-3.0-only",
|
"license": "AGPL-3.0-only",
|
||||||
"main": "electron.js",
|
"main": "electron.js",
|
||||||
"bin": {
|
"bin": {
|
||||||
|
@ -5,9 +5,9 @@ const AbstractEntity = require("./abstract_entity");
|
|||||||
const sql = require("../../services/sql");
|
const sql = require("../../services/sql");
|
||||||
const dateUtils = require("../../services/date_utils");
|
const dateUtils = require("../../services/date_utils");
|
||||||
const utils = require("../../services/utils.js");
|
const utils = require("../../services/utils.js");
|
||||||
const TaskContext = require("../../services/task_context.js");
|
const TaskContext = require("../../services/task_context");
|
||||||
const cls = require("../../services/cls.js");
|
const cls = require("../../services/cls");
|
||||||
const log = require("../../services/log.js");
|
const log = require("../../services/log");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Branch represents a relationship between a child note and its parent note. Trilium allows a note to have multiple
|
* Branch represents a relationship between a child note and its parent note. Trilium allows a note to have multiple
|
||||||
@ -137,6 +137,18 @@ class Branch extends AbstractEntity {
|
|||||||
|
|
||||||
taskContext.increaseProgressCount();
|
taskContext.increaseProgressCount();
|
||||||
|
|
||||||
|
const note = this.getNote();
|
||||||
|
|
||||||
|
if (!taskContext.noteDeletionHandlerTriggered) {
|
||||||
|
const parentBranches = note.getParentBranches();
|
||||||
|
|
||||||
|
if (parentBranches.length === 1 && parentBranches[0] === this) {
|
||||||
|
// needs to be run before branches and attributes are deleted and thus attached relations disappear
|
||||||
|
const handlers = require("../../services/handlers");
|
||||||
|
handlers.runAttachedRelations(note, 'runOnNoteDeletion', note);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (this.branchId === 'root'
|
if (this.branchId === 'root'
|
||||||
|| this.noteId === 'root'
|
|| this.noteId === 'root'
|
||||||
|| this.noteId === cls.getHoistedNoteId()) {
|
|| this.noteId === cls.getHoistedNoteId()) {
|
||||||
@ -146,7 +158,6 @@ class Branch extends AbstractEntity {
|
|||||||
|
|
||||||
this.markAsDeleted(deleteId);
|
this.markAsDeleted(deleteId);
|
||||||
|
|
||||||
const note = this.getNote();
|
|
||||||
const notDeletedBranches = note.getParentBranches();
|
const notDeletedBranches = note.getParentBranches();
|
||||||
|
|
||||||
if (notDeletedBranches.length === 0) {
|
if (notDeletedBranches.length === 0) {
|
||||||
|
@ -8,9 +8,8 @@ const dateUtils = require('../../services/date_utils');
|
|||||||
const entityChangesService = require('../../services/entity_changes');
|
const entityChangesService = require('../../services/entity_changes');
|
||||||
const AbstractEntity = require("./abstract_entity");
|
const AbstractEntity = require("./abstract_entity");
|
||||||
const NoteRevision = require("./note_revision");
|
const NoteRevision = require("./note_revision");
|
||||||
const TaskContext = require("../../services/task_context.js");
|
const TaskContext = require("../../services/task_context");
|
||||||
const optionService = require("../../services/options.js");
|
const handlers = require("../../services/handlers");
|
||||||
const noteRevisionService = require("../../services/note_revisions.js");
|
|
||||||
|
|
||||||
const LABEL = 'label';
|
const LABEL = 'label';
|
||||||
const RELATION = 'relation';
|
const RELATION = 'relation';
|
||||||
@ -1143,6 +1142,10 @@ class Note extends AbstractEntity {
|
|||||||
taskContext = new TaskContext('no-progress-reporting');
|
taskContext = new TaskContext('no-progress-reporting');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// needs to be run before branches and attributes are deleted and thus attached relations disappear
|
||||||
|
handlers.runAttachedRelations(this, 'runOnNoteDeletion', this);
|
||||||
|
taskContext.noteDeletionHandlerTriggered = true;
|
||||||
|
|
||||||
for (const branch of this.getParentBranches()) {
|
for (const branch of this.getParentBranches()) {
|
||||||
branch.deleteBranch(deleteId, taskContext);
|
branch.deleteBranch(deleteId, taskContext);
|
||||||
}
|
}
|
||||||
|
@ -248,6 +248,13 @@ class NoteContext extends Component {
|
|||||||
ntxId: this.ntxId
|
ntxId: this.ntxId
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getTypeWidget() {
|
||||||
|
return new Promise(resolve => appContext.triggerCommand('executeWithTypeWidget', {
|
||||||
|
resolve,
|
||||||
|
ntxId: this.ntxId
|
||||||
|
}));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default NoteContext;
|
export default NoteContext;
|
||||||
|
@ -24,8 +24,8 @@ async function createNote(parentNotePath, options = {}) {
|
|||||||
options.saveSelection = false;
|
options.saveSelection = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.saveSelection && utils.isCKEditorInitialized()) {
|
if (options.saveSelection) {
|
||||||
[options.title, options.content] = parseSelectedHtml(window.cutToNote.getSelectedHtml());
|
[options.title, options.content] = parseSelectedHtml(options.textEditor.getSelectedHtml());
|
||||||
}
|
}
|
||||||
|
|
||||||
const parentNoteId = treeService.getNoteIdFromNotePath(parentNotePath);
|
const parentNoteId = treeService.getNoteIdFromNotePath(parentNotePath);
|
||||||
@ -47,9 +47,9 @@ async function createNote(parentNotePath, options = {}) {
|
|||||||
templateNoteId: options.templateNoteId
|
templateNoteId: options.templateNoteId
|
||||||
});
|
});
|
||||||
|
|
||||||
if (options.saveSelection && utils.isCKEditorInitialized()) {
|
if (options.saveSelection) {
|
||||||
// we remove the selection only after it was saved to server to make sure we don't lose anything
|
// we remove the selection only after it was saved to server to make sure we don't lose anything
|
||||||
window.cutToNote.removeSelection();
|
options.textEditor.removeSelection();
|
||||||
}
|
}
|
||||||
|
|
||||||
await ws.waitForMaxKnownEntityChangeId();
|
await ws.waitForMaxKnownEntityChangeId();
|
||||||
|
@ -292,10 +292,6 @@ function copySelectionToClipboard() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function isCKEditorInitialized() {
|
|
||||||
return !!(window && window.cutToNote);
|
|
||||||
}
|
|
||||||
|
|
||||||
function dynamicRequire(moduleName) {
|
function dynamicRequire(moduleName) {
|
||||||
if (typeof __non_webpack_require__ !== 'undefined') {
|
if (typeof __non_webpack_require__ !== 'undefined') {
|
||||||
return __non_webpack_require__(moduleName);
|
return __non_webpack_require__(moduleName);
|
||||||
@ -405,7 +401,6 @@ export default {
|
|||||||
clearBrowserCache,
|
clearBrowserCache,
|
||||||
normalizeShortcut,
|
normalizeShortcut,
|
||||||
copySelectionToClipboard,
|
copySelectionToClipboard,
|
||||||
isCKEditorInitialized,
|
|
||||||
dynamicRequire,
|
dynamicRequire,
|
||||||
timeLimit,
|
timeLimit,
|
||||||
initHelpDropdown,
|
initHelpDropdown,
|
||||||
|
@ -233,6 +233,9 @@ const ATTR_HELP = {
|
|||||||
"runOnNoteCreation": "executes when note is created on backend",
|
"runOnNoteCreation": "executes when note is created on backend",
|
||||||
"runOnNoteTitleChange": "executes when note title is changed (includes note creation as well)",
|
"runOnNoteTitleChange": "executes when note title is changed (includes note creation as well)",
|
||||||
"runOnNoteChange": "executes when note is changed (includes note creation as well)",
|
"runOnNoteChange": "executes when note is changed (includes note creation as well)",
|
||||||
|
"runOnNoteDeletion": "executes when note is being deleted",
|
||||||
|
"runOnBranchCreation": "executes when a branch is created. Branch is a link between parent note and child note and is created e.g. when cloning or moving note.",
|
||||||
|
"runOnBranchDeletion": "executes when a branch is deleted. Branch is a link between parent note and child note and is deleted e.g. when moving note (old branch/link is deleted).",
|
||||||
"runOnChildNoteCreation": "executes when new note is created under this note",
|
"runOnChildNoteCreation": "executes when new note is created under this note",
|
||||||
"runOnAttributeCreation": "executes when new attribute is created under this note",
|
"runOnAttributeCreation": "executes when new attribute is created under this note",
|
||||||
"runOnAttributeChange": "executes when attribute is changed under this note",
|
"runOnAttributeChange": "executes when attribute is changed under this note",
|
||||||
|
@ -330,7 +330,8 @@ export default class NoteDetailWidget extends NoteContextAwareWidget {
|
|||||||
// without await as this otherwise causes deadlock through component mutex
|
// without await as this otherwise causes deadlock through component mutex
|
||||||
noteCreateService.createNote(appContext.tabManager.getActiveContextNotePath(), {
|
noteCreateService.createNote(appContext.tabManager.getActiveContextNotePath(), {
|
||||||
isProtected: note.isProtected,
|
isProtected: note.isProtected,
|
||||||
saveSelection: true
|
saveSelection: true,
|
||||||
|
textEditor: await this.noteContext.getTextEditor()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -344,4 +345,16 @@ export default class NoteDetailWidget extends NoteContextAwareWidget {
|
|||||||
this.refresh();
|
this.refresh();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async executeWithTypeWidgetEvent({resolve, ntxId}) {
|
||||||
|
if (!this.isNoteContext(ntxId)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.initialized;
|
||||||
|
|
||||||
|
await this.getWidgetType();
|
||||||
|
|
||||||
|
resolve(this.getTypeWidget());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -363,7 +363,9 @@ pre:not(.CodeMirror-line) {
|
|||||||
|
|
||||||
.go-to-selected-note-button.disabled, .go-to-selected-note-button.disabled:hover {
|
.go-to-selected-note-button.disabled, .go-to-selected-note-button.disabled:hover {
|
||||||
cursor: inherit;
|
cursor: inherit;
|
||||||
color: var(--button-disabled-background-color) !important;
|
color: var(--button-disabled-text-color) !important;
|
||||||
|
background-color: var(--button-disabled-background-color) !important;
|
||||||
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.note-autocomplete-input {
|
.note-autocomplete-input {
|
||||||
|
@ -21,10 +21,11 @@
|
|||||||
--more-accented-background-color: #777;
|
--more-accented-background-color: #777;
|
||||||
|
|
||||||
--button-background-color: transparent;
|
--button-background-color: transparent;
|
||||||
--button-disabled-background-color: #222;
|
|
||||||
--button-border-color: #ccc;
|
--button-border-color: #ccc;
|
||||||
--button-text-color: currentColor;
|
--button-text-color: currentColor;
|
||||||
--button-border-radius: 5px;
|
--button-border-radius: 5px;
|
||||||
|
--button-disabled-background-color: transparent;
|
||||||
|
--button-disabled-text-color: #999;
|
||||||
|
|
||||||
--primary-button-background-color: #888;
|
--primary-button-background-color: #888;
|
||||||
--primary-button-text-color: white;
|
--primary-button-text-color: white;
|
||||||
|
@ -25,10 +25,11 @@ html {
|
|||||||
--more-accented-background-color: #ddd;
|
--more-accented-background-color: #ddd;
|
||||||
|
|
||||||
--button-background-color: transparent;
|
--button-background-color: transparent;
|
||||||
--button-disabled-background-color: #ddd;
|
|
||||||
--button-border-color: #ddd;
|
--button-border-color: #ddd;
|
||||||
--button-text-color: black;
|
--button-text-color: black;
|
||||||
--button-border-radius: 5px;
|
--button-border-radius: 5px;
|
||||||
|
--button-disabled-background-color: #ddd;
|
||||||
|
--button-disabled-text-color: black;
|
||||||
|
|
||||||
--primary-button-background-color: #6c757d;
|
--primary-button-background-color: #6c757d;
|
||||||
--primary-button-text-color: white;
|
--primary-button-text-color: white;
|
||||||
|
@ -1 +1 @@
|
|||||||
module.exports = { buildDate:"2022-05-27T22:13:24+02:00", buildRevision: "388dcadef3e23c25ee256c63cd627d18691a687a" };
|
module.exports = { buildDate:"2022-06-05T15:00:25+02:00", buildRevision: "f587e0dfd9177462faef8ad7c39a855c25d03c91" };
|
||||||
|
@ -61,6 +61,9 @@ module.exports = [
|
|||||||
{ type: 'relation', name: 'runOnNoteCreation', isDangerous: true },
|
{ type: 'relation', name: 'runOnNoteCreation', isDangerous: true },
|
||||||
{ type: 'relation', name: 'runOnNoteTitleChange', isDangerous: true },
|
{ type: 'relation', name: 'runOnNoteTitleChange', isDangerous: true },
|
||||||
{ type: 'relation', name: 'runOnNoteChange', isDangerous: true },
|
{ type: 'relation', name: 'runOnNoteChange', isDangerous: true },
|
||||||
|
{ type: 'relation', name: 'runOnNoteDeletion', isDangerous: true },
|
||||||
|
{ type: 'relation', name: 'runOnBranchCreation', isDangerous: true },
|
||||||
|
{ type: 'relation', name: 'runOnBranchDeletion', isDangerous: true },
|
||||||
{ type: 'relation', name: 'runOnChildNoteCreation', isDangerous: true },
|
{ type: 'relation', name: 'runOnChildNoteCreation', isDangerous: true },
|
||||||
{ type: 'relation', name: 'runOnAttributeCreation', isDangerous: true },
|
{ type: 'relation', name: 'runOnAttributeCreation', isDangerous: true },
|
||||||
{ type: 'relation', name: 'runOnAttributeChange', isDangerous: true },
|
{ type: 'relation', name: 'runOnAttributeChange', isDangerous: true },
|
||||||
|
@ -49,6 +49,7 @@ eventService.subscribe([ eventService.ENTITY_CHANGED, eventService.ENTITY_DELETE
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (entityName === 'notes') {
|
else if (entityName === 'notes') {
|
||||||
|
// ENTITY_DELETED won't trigger anything since all branches/attributes are already deleted at this point
|
||||||
runAttachedRelations(entity, 'runOnNoteChange', entity);
|
runAttachedRelations(entity, 'runOnNoteChange', entity);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -94,6 +95,9 @@ eventService.subscribe(eventService.ENTITY_CREATED, ({ entityName, entity }) =>
|
|||||||
handleSortedAttribute(entity);
|
handleSortedAttribute(entity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (entityName === 'branches') {
|
||||||
|
runAttachedRelations(entity.getNote(), 'runOnBranchCreation', entity);
|
||||||
|
}
|
||||||
else if (entityName === 'notes') {
|
else if (entityName === 'notes') {
|
||||||
runAttachedRelations(entity, 'runOnNoteCreation', entity);
|
runAttachedRelations(entity, 'runOnNoteCreation', entity);
|
||||||
}
|
}
|
||||||
@ -167,4 +171,12 @@ eventService.subscribe(eventService.ENTITY_DELETED, ({ entityName, entity }) =>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (entityName === 'branches') {
|
||||||
|
runAttachedRelations(entity.getNote(), 'runOnBranchDeletion', entity);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
runAttachedRelations
|
||||||
|
};
|
||||||
|
@ -10,6 +10,7 @@ class TaskContext {
|
|||||||
this.taskId = taskId;
|
this.taskId = taskId;
|
||||||
this.taskType = taskType;
|
this.taskType = taskType;
|
||||||
this.data = data;
|
this.data = data;
|
||||||
|
this.noteDeletionHandlerTriggered = false;
|
||||||
|
|
||||||
// progressCount is meant to represent just some progress - to indicate the task is not stuck
|
// progressCount is meant to represent just some progress - to indicate the task is not stuck
|
||||||
this.progressCount = -1; // we're incrementing immediatelly
|
this.progressCount = -1; // we're incrementing immediatelly
|
||||||
|
Loading…
x
Reference in New Issue
Block a user