feat(map): add mapIncludeRelation and mapExcludeRelation to include only or exclude specific relation types

This commit is contained in:
Kieran 2025-06-27 20:15:59 +01:00
parent 06b507fdc5
commit 9d99da14e1
No known key found for this signature in database
2 changed files with 20 additions and 3 deletions

View File

@ -324,7 +324,13 @@ export default class NoteMapWidget extends NoteContextAwareWidget {
} }
const mapRootNoteId = this.getMapRootNoteId(); const mapRootNoteId = this.getMapRootNoteId();
const data = await this.loadNotesAndRelations(mapRootNoteId);
const labelValues = (name: string) => this.note?.getLabels(name).map(l => l.value) ?? [];
const excludeRelations = labelValues("mapExcludeRelation");
const includeRelations = labelValues("mapIncludeRelation");
const data = await this.loadNotesAndRelations(mapRootNoteId, excludeRelations, includeRelations);
const nodeLinkRatio = data.nodes.length / data.links.length; const nodeLinkRatio = data.nodes.length / data.links.length;
const magnifiedRatio = Math.pow(nodeLinkRatio, 1.5); const magnifiedRatio = Math.pow(nodeLinkRatio, 1.5);
@ -473,8 +479,10 @@ export default class NoteMapWidget extends NoteContextAwareWidget {
ctx.restore(); ctx.restore();
} }
async loadNotesAndRelations(mapRootNoteId: string): Promise<NotesAndRelationsData> { async loadNotesAndRelations(mapRootNoteId: string, excludeRelations: string[], includeRelations: string[]): Promise<NotesAndRelationsData> {
const resp = await server.post<PostNotesMapResponse>(`note-map/${mapRootNoteId}/${this.mapType}`); const resp = await server.post<PostNotesMapResponse>(`note-map/${mapRootNoteId}/${this.mapType}`, {
excludeRelations, includeRelations
});
this.calculateNodeSizes(resp); this.calculateNodeSizes(resp);

View File

@ -110,6 +110,11 @@ function getLinkMap(req: Request) {
const ignoreExcludeFromNoteMap = mapRootNote.isLabelTruthy("excludeFromNoteMap"); const ignoreExcludeFromNoteMap = mapRootNote.isLabelTruthy("excludeFromNoteMap");
let unfilteredNotes; let unfilteredNotes;
const toSet = (data: unknown) => new Set<string>(data instanceof Array ? data : []);
const excludeRelations = toSet(req.body.excludeRelations);
const includeRelations = toSet(req.body.includeRelations);
if (mapRootNote.type === "search") { if (mapRootNote.type === "search") {
// for search notes, we want to consider the direct search results only without the descendants // for search notes, we want to consider the direct search results only without the descendants
unfilteredNotes = mapRootNote.getSearchResultNotes(); unfilteredNotes = mapRootNote.getSearchResultNotes();
@ -152,6 +157,10 @@ function getLinkMap(req: Request) {
} }
return !parentNote.getChildNotes().find((childNote) => childNote.noteId === rel.value); return !parentNote.getChildNotes().find((childNote) => childNote.noteId === rel.value);
} else if (includeRelations.size != 0 && !includeRelations.has(rel.name)) {
return false;
} else if (excludeRelations.has(rel.name)) {
return false;
} else { } else {
return true; return true;
} }