Feature/note map filter (#6104)

This commit is contained in:
Elian Doran 2025-07-04 09:12:20 +03:00 committed by GitHub
commit fe5d1cac9a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 25 additions and 4 deletions

View File

@ -324,7 +324,13 @@ export default class NoteMapWidget extends NoteContextAwareWidget {
}
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 magnifiedRatio = Math.pow(nodeLinkRatio, 1.5);
@ -473,8 +479,10 @@ export default class NoteMapWidget extends NoteContextAwareWidget {
ctx.restore();
}
async loadNotesAndRelations(mapRootNoteId: string): Promise<NotesAndRelationsData> {
const resp = await server.post<PostNotesMapResponse>(`note-map/${mapRootNoteId}/${this.mapType}`);
async loadNotesAndRelations(mapRootNoteId: string, excludeRelations: string[], includeRelations: string[]): Promise<NotesAndRelationsData> {
const resp = await server.post<PostNotesMapResponse>(`note-map/${mapRootNoteId}/${this.mapType}`, {
excludeRelations, includeRelations
});
this.calculateNodeSizes(resp);

View File

@ -110,6 +110,11 @@ function getLinkMap(req: Request) {
const ignoreExcludeFromNoteMap = mapRootNote.isLabelTruthy("excludeFromNoteMap");
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") {
// for search notes, we want to consider the direct search results only without the descendants
unfilteredNotes = mapRootNote.getSearchResultNotes();
@ -152,6 +157,10 @@ function getLinkMap(req: Request) {
}
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 {
return true;
}

View File

@ -45,6 +45,8 @@ export default [
{ type: "label", name: "pageSize" },
{ type: "label", name: "viewType" },
{ type: "label", name: "mapRootNoteId" },
{ type: "label", name: "mapExcludeRelation" },
{ type: "label", name: "mapIncludeRelation" },
{ type: "label", name: "bookmarkFolder" },
{ type: "label", name: "sorted" },
{ type: "label", name: "sortDirection" },

View File

@ -3,4 +3,6 @@
A Note map is a note type which displays a standalone version of the feature of the same name: [Note Map (Link map, Tree map)](../Advanced%20Usage/Note%20Map%20\(Link%20map%2C%20Tree%20map\).md).
Once created, the note map will display the relations between notes. Only the notes that are part of the parent of the note map will be displayed (including their children).
Once created, the note map will display the relations between notes. Only the notes that are part of the parent of the note map will be displayed (including their children).
The labels `mapIncludeRelation` and `mapExcludeRelation`, if set, filter the note map to include only the specified relations or to exclude the specified relations, respectively.