mirror of
https://github.com/zadam/trilium.git
synced 2025-06-06 09:58:32 +02:00
sizing of the link map
This commit is contained in:
parent
e3fc0968ba
commit
fabf24a065
@ -171,7 +171,7 @@ export default class NoteMapWidget extends NoteContextAwareWidget {
|
|||||||
const {x, y} = node;
|
const {x, y} = node;
|
||||||
const size = this.noteIdToSizeMap[node.id];
|
const size = this.noteIdToSizeMap[node.id];
|
||||||
|
|
||||||
ctx.fillStyle = node.id === this.noteId ? 'red' : color;
|
ctx.fillStyle = (this.widgetMode === 'ribbon' && node.id === this.noteId) ? 'red' : color;
|
||||||
ctx.beginPath();
|
ctx.beginPath();
|
||||||
ctx.arc(x, y, size, 0, 2 * Math.PI, false);
|
ctx.arc(x, y, size, 0, 2 * Math.PI, false);
|
||||||
ctx.fill();
|
ctx.fill();
|
||||||
@ -235,7 +235,7 @@ export default class NoteMapWidget extends NoteContextAwareWidget {
|
|||||||
async loadNotesAndRelations(mapRootNoteId) {
|
async loadNotesAndRelations(mapRootNoteId) {
|
||||||
const resp = await server.post(`note-map/${mapRootNoteId}/${this.mapType}`);
|
const resp = await server.post(`note-map/${mapRootNoteId}/${this.mapType}`);
|
||||||
|
|
||||||
this.calculateSizes(resp);
|
this.calculateNodeSizes(resp);
|
||||||
|
|
||||||
const links = this.getGroupedLinks(resp.links);
|
const links = this.getGroupedLinks(resp.links);
|
||||||
|
|
||||||
@ -279,18 +279,35 @@ export default class NoteMapWidget extends NoteContextAwareWidget {
|
|||||||
return Object.values(linksGroupedBySourceTarget);
|
return Object.values(linksGroupedBySourceTarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
calculateSizes(resp) {
|
calculateNodeSizes(resp) {
|
||||||
const {noteIdToDescendantCountMap} = resp;
|
|
||||||
|
|
||||||
this.noteIdToSizeMap = {};
|
this.noteIdToSizeMap = {};
|
||||||
|
|
||||||
for (const noteId in noteIdToDescendantCountMap) {
|
if (this.mapType === 'tree') {
|
||||||
this.noteIdToSizeMap[noteId] = 4;
|
const {noteIdToDescendantCountMap} = resp;
|
||||||
|
|
||||||
const count = noteIdToDescendantCountMap[noteId];
|
for (const noteId in noteIdToDescendantCountMap) {
|
||||||
|
this.noteIdToSizeMap[noteId] = 4;
|
||||||
|
|
||||||
if (count > 0) {
|
const count = noteIdToDescendantCountMap[noteId];
|
||||||
this.noteIdToSizeMap[noteId] += 1 + Math.round(Math.log(count) / Math.log(1.5));
|
|
||||||
|
if (count > 0) {
|
||||||
|
this.noteIdToSizeMap[noteId] += 1 + Math.round(Math.log(count) / Math.log(1.5));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (this.mapType === 'link') {
|
||||||
|
const noteIdToLinkCount = {};
|
||||||
|
|
||||||
|
for (const link of resp.links) {
|
||||||
|
noteIdToLinkCount[link.targetNoteId] = 1 + (noteIdToLinkCount[link.targetNoteId] || 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const [noteId] of resp.notes) {
|
||||||
|
this.noteIdToSizeMap[noteId] = 4;
|
||||||
|
|
||||||
|
if (noteId in noteIdToLinkCount) {
|
||||||
|
this.noteIdToSizeMap[noteId] += Math.min(Math.pow(noteIdToLinkCount[noteId], 0.5), 15);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,83 +2,6 @@
|
|||||||
|
|
||||||
const becca = require("../../becca/becca");
|
const becca = require("../../becca/becca");
|
||||||
|
|
||||||
function getRelations(noteId) {
|
|
||||||
const note = becca.getNote(noteId);
|
|
||||||
|
|
||||||
if (!note) {
|
|
||||||
throw new Error(noteId);
|
|
||||||
}
|
|
||||||
|
|
||||||
const allRelations = note.getOwnedRelations().concat(note.getTargetRelations());
|
|
||||||
|
|
||||||
return allRelations.filter(rel => {
|
|
||||||
if (rel.name === 'relationMapLink' || rel.name === 'template') {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else if (rel.name === 'imageLink') {
|
|
||||||
const parentNote = becca.getNote(rel.noteId);
|
|
||||||
|
|
||||||
return !parentNote.getChildNotes().find(childNote => childNote.noteId === rel.value);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function collectRelations(noteId, relations, depth) {
|
|
||||||
if (depth === 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const relation of getRelations(noteId)) {
|
|
||||||
if (!relations.has(relation)) {
|
|
||||||
if (!relation.value) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
relations.add(relation);
|
|
||||||
|
|
||||||
if (relation.noteId !== noteId) {
|
|
||||||
collectRelations(relation.noteId, relations, depth - 1);
|
|
||||||
} else if (relation.value !== noteId) {
|
|
||||||
collectRelations(relation.value, relations, depth - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getLinkMap(req) {
|
|
||||||
const {noteId} = req.params;
|
|
||||||
const {maxDepth} = req.body;
|
|
||||||
|
|
||||||
let relations = new Set();
|
|
||||||
|
|
||||||
collectRelations(noteId, relations, maxDepth);
|
|
||||||
|
|
||||||
relations = Array.from(relations);
|
|
||||||
|
|
||||||
const noteIds = new Set(relations.map(rel => rel.noteId)
|
|
||||||
.concat(relations.map(rel => rel.targetNoteId))
|
|
||||||
.concat([noteId]));
|
|
||||||
|
|
||||||
const noteIdToLinkCountMap = {};
|
|
||||||
|
|
||||||
for (const noteId of noteIds) {
|
|
||||||
noteIdToLinkCountMap[noteId] = getRelations(noteId).length;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
noteIdToLinkCountMap,
|
|
||||||
links: Array.from(relations).map(rel => ({
|
|
||||||
id: rel.noteId + "-" + rel.name + "-" + rel.value,
|
|
||||||
sourceNoteId: rel.noteId,
|
|
||||||
targetNoteId: rel.value,
|
|
||||||
name: rel.name
|
|
||||||
}))
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildDescendantCountMap() {
|
function buildDescendantCountMap() {
|
||||||
const noteIdToCountMap = {};
|
const noteIdToCountMap = {};
|
||||||
|
|
||||||
@ -101,7 +24,7 @@ function buildDescendantCountMap() {
|
|||||||
return noteIdToCountMap;
|
return noteIdToCountMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getGlobalLinkMap(req) {
|
function getLinkMap(req) {
|
||||||
const mapRootNote = becca.getNote(req.params.noteId);
|
const mapRootNote = becca.getNote(req.params.noteId);
|
||||||
|
|
||||||
const noteIds = new Set();
|
const noteIds = new Set();
|
||||||
@ -145,7 +68,7 @@ function getGlobalLinkMap(req) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function getGlobalTreeMap(req) {
|
function getTreeMap(req) {
|
||||||
const mapRootNote = becca.getNote(req.params.noteId);
|
const mapRootNote = becca.getNote(req.params.noteId);
|
||||||
const noteIds = new Set();
|
const noteIds = new Set();
|
||||||
|
|
||||||
@ -195,6 +118,5 @@ function getGlobalTreeMap(req) {
|
|||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
getLinkMap,
|
getLinkMap,
|
||||||
getGlobalLinkMap,
|
getTreeMap
|
||||||
getGlobalTreeMap
|
|
||||||
};
|
};
|
@ -32,7 +32,7 @@ const senderRoute = require('./api/sender');
|
|||||||
const filesRoute = require('./api/files');
|
const filesRoute = require('./api/files');
|
||||||
const searchRoute = require('./api/search');
|
const searchRoute = require('./api/search');
|
||||||
const specialNotesRoute = require('./api/special_notes.js');
|
const specialNotesRoute = require('./api/special_notes.js');
|
||||||
const linkMapRoute = require('./api/link_map');
|
const noteMapRoute = require('./api/note_map.js');
|
||||||
const clipperRoute = require('./api/clipper');
|
const clipperRoute = require('./api/clipper');
|
||||||
const similarNotesRoute = require('./api/similar_notes');
|
const similarNotesRoute = require('./api/similar_notes');
|
||||||
const keysRoute = require('./api/keys');
|
const keysRoute = require('./api/keys');
|
||||||
@ -220,9 +220,8 @@ function register(app) {
|
|||||||
apiRoute(GET, '/api/attributes/names', attributesRoute.getAttributeNames);
|
apiRoute(GET, '/api/attributes/names', attributesRoute.getAttributeNames);
|
||||||
apiRoute(GET, '/api/attributes/values/:attributeName', attributesRoute.getValuesForAttribute);
|
apiRoute(GET, '/api/attributes/values/:attributeName', attributesRoute.getValuesForAttribute);
|
||||||
|
|
||||||
apiRoute(POST, '/api/notes/:noteId/link-map', linkMapRoute.getLinkMap);
|
apiRoute(POST, '/api/note-map/:noteId/tree', noteMapRoute.getTreeMap);
|
||||||
apiRoute(POST, '/api/note-map/:noteId/tree', linkMapRoute.getGlobalTreeMap);
|
apiRoute(POST, '/api/note-map/:noteId/link', noteMapRoute.getLinkMap);
|
||||||
apiRoute(POST, '/api/note-map/:noteId/link', linkMapRoute.getGlobalLinkMap);
|
|
||||||
|
|
||||||
apiRoute(GET, '/api/special-notes/inbox/:date', specialNotesRoute.getInboxNote);
|
apiRoute(GET, '/api/special-notes/inbox/:date', specialNotesRoute.getInboxNote);
|
||||||
apiRoute(GET, '/api/special-notes/date/:date', specialNotesRoute.getDateNote);
|
apiRoute(GET, '/api/special-notes/date/:date', specialNotesRoute.getDateNote);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user