2021-09-30 18:26:13 +08:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "utf-8" >
< title > JSDoc: Source: becca/entities/branch.js< / title >
< script src = "scripts/prettify/prettify.js" > < / script >
< script src = "scripts/prettify/lang-css.js" > < / script >
<!-- [if lt IE 9]>
< script src = "//html5shiv.googlecode.com/svn/trunk/html5.js" > < / script >
<![endif]-->
< link type = "text/css" rel = "stylesheet" href = "styles/prettify-tomorrow.css" >
< link type = "text/css" rel = "stylesheet" href = "styles/jsdoc-default.css" >
< / head >
< body >
< div id = "main" >
< h1 class = "page-title" > Source: becca/entities/branch.js< / h1 >
< section >
< article >
< pre class = "prettyprint source linenums" > < code > "use strict";
2022-01-11 02:54:38 +08:00
const Note = require('./note');
const AbstractEntity = require("./abstract_entity");
const sql = require("../../services/sql");
const dateUtils = require("../../services/date_utils");
2021-09-30 18:26:13 +08:00
2021-11-11 04:30:54 +08:00
/**
* Branch represents a relationship between a child note and its parent note. Trilium allows a note to have multiple
* parents.
*/
2021-09-30 18:26:13 +08:00
class Branch extends AbstractEntity {
static get entityName() { return "branches"; }
static get primaryKeyName() { return "branchId"; }
// notePosition is not part of hash because it would produce a lot of updates in case of reordering
static get hashedProperties() { return ["branchId", "noteId", "parentNoteId", "prefix"]; }
constructor(row) {
super();
if (!row) {
return;
}
this.updateFromRow(row);
this.init();
}
updateFromRow(row) {
this.update([
row.branchId,
row.noteId,
row.parentNoteId,
row.prefix,
row.notePosition,
row.isExpanded,
row.utcDateModified
]);
}
update([branchId, noteId, parentNoteId, prefix, notePosition, isExpanded, utcDateModified]) {
2021-11-11 04:30:54 +08:00
/** @type {string} */
2021-09-30 18:26:13 +08:00
this.branchId = branchId;
2021-11-11 04:30:54 +08:00
/** @type {string} */
2021-09-30 18:26:13 +08:00
this.noteId = noteId;
2021-11-11 04:30:54 +08:00
/** @type {string} */
2021-09-30 18:26:13 +08:00
this.parentNoteId = parentNoteId;
2021-11-11 04:30:54 +08:00
/** @type {string} */
2021-09-30 18:26:13 +08:00
this.prefix = prefix;
2021-11-11 04:30:54 +08:00
/** @type {int} */
2021-09-30 18:26:13 +08:00
this.notePosition = notePosition;
2021-11-11 04:30:54 +08:00
/** @type {boolean} */
2021-09-30 18:26:13 +08:00
this.isExpanded = !!isExpanded;
2021-11-11 04:30:54 +08:00
/** @type {string} */
2021-09-30 18:26:13 +08:00
this.utcDateModified = utcDateModified;
return this;
}
init() {
2022-01-06 03:31:21 +08:00
if (this.branchId) {
this.becca.branches[this.branchId] = this;
}
this.becca.childParentToBranch[`${this.noteId}-${this.parentNoteId}`] = this;
2021-09-30 18:26:13 +08:00
if (this.branchId === 'root') {
return;
}
const childNote = this.childNote;
const parentNote = this.parentNote;
2021-11-11 04:30:54 +08:00
if (!childNote.parents.includes(parentNote)) {
childNote.parents.push(parentNote);
}
if (!childNote.parentBranches.includes(this)) {
childNote.parentBranches.push(this);
}
2021-09-30 18:26:13 +08:00
2021-11-11 04:30:54 +08:00
if (!parentNote.children.includes(childNote)) {
parentNote.children.push(childNote);
}
2021-09-30 18:26:13 +08:00
}
2021-11-11 04:30:54 +08:00
/** @returns {Note} */
2021-09-30 18:26:13 +08:00
get childNote() {
if (!(this.noteId in this.becca.notes)) {
2022-01-06 03:31:21 +08:00
// entities can come out of order in sync/import, create skeleton which will be filled later
2021-11-11 04:30:54 +08:00
this.becca.addNote(this.noteId, new Note({noteId: this.noteId}));
2021-09-30 18:26:13 +08:00
}
return this.becca.notes[this.noteId];
}
getNote() {
return this.childNote;
}
2021-11-11 04:30:54 +08:00
/** @returns {Note} */
2021-09-30 18:26:13 +08:00
get parentNote() {
if (!(this.parentNoteId in this.becca.notes)) {
2022-01-06 03:31:21 +08:00
// entities can come out of order in sync/import, create skeleton which will be filled later
2021-11-11 04:30:54 +08:00
this.becca.addNote(this.parentNoteId, new Note({noteId: this.parentNoteId}));
2021-09-30 18:26:13 +08:00
}
return this.becca.notes[this.parentNoteId];
}
2021-11-11 04:30:54 +08:00
get isDeleted() {
return !(this.branchId in this.becca.branches);
}
2021-09-30 18:26:13 +08:00
beforeSaving() {
if (this.notePosition === undefined || this.notePosition === null) {
// TODO finding new position can be refactored into becca
const maxNotePos = sql.getValue('SELECT MAX(notePosition) FROM branches WHERE parentNoteId = ? AND isDeleted = 0', [this.parentNoteId]);
this.notePosition = maxNotePos === null ? 0 : maxNotePos + 10;
}
if (!this.isExpanded) {
this.isExpanded = false;
}
this.utcDateModified = dateUtils.utcNowDateTime();
super.beforeSaving();
this.becca.branches[this.branchId] = this;
}
getPojo() {
return {
branchId: this.branchId,
noteId: this.noteId,
parentNoteId: this.parentNoteId,
prefix: this.prefix,
notePosition: this.notePosition,
isExpanded: this.isExpanded,
isDeleted: false,
2022-01-06 03:31:21 +08:00
utcDateModified: this.utcDateModified
2021-09-30 18:26:13 +08:00
};
}
createClone(parentNoteId, notePosition) {
return new Branch({
noteId: this.noteId,
parentNoteId: parentNoteId,
notePosition: notePosition,
prefix: this.prefix,
isExpanded: this.isExpanded
});
}
}
module.exports = Branch;
< / code > < / pre >
< / article >
< / section >
< / div >
< nav >
2022-01-06 03:31:21 +08:00
< h2 > < a href = "index.html" > Home< / a > < / h2 > < h3 > Modules< / h3 > < ul > < li > < a href = "sql%250A%250ATODO_%2520some%2520methods%2520(like%2520getValue())%2520could%2520use%2520raw%2520rowsmodule_.html" > sql
2022-01-11 02:54:38 +08:00
TODO: some methods (like getValue()) could use raw rows< / a > < / li > < / ul > < h3 > Classes< / h3 > < ul > < li > < a href = "Attribute.html" > Attribute< / a > < / li > < li > < a href = "BackendScriptApi.html" > BackendScriptApi< / a > < / li > < li > < a href = "Branch.html" > Branch< / a > < / li > < li > < a href = "EtapiToken.html" > EtapiToken< / a > < / li > < li > < a href = "Note.html" > Note< / a > < / li > < li > < a href = "NoteRevision.html" > NoteRevision< / a > < / li > < li > < a href = "Option.html" > Option< / a > < / li > < li > < a href = "RecentNote.html" > RecentNote< / a > < / li > < / ul > < h3 > < a href = "global.html" > Global< / a > < / h3 >
2021-09-30 18:26:13 +08:00
< / nav >
< br class = "clear" >
< footer >
Documentation generated by < a href = "https://github.com/jsdoc/jsdoc" > JSDoc 3.6.7< / a >
< / footer >
< script > prettyPrint ( ) ; < / script >
< script src = "scripts/linenumber.js" > < / script >
< / body >
< / html >