import NoteContextAwareWidget from "./note_context_aware_widget.js"; import linkService from "../services/link.js"; import server from "../services/server.js"; import froca from "../services/froca.js"; const TPL = ` `; export default class BacklinksWidget extends NoteContextAwareWidget { doRender() { this.$widget = $(TPL); this.$count = this.$widget.find('.backlinks-count'); this.$items = this.$widget.find('.backlinks-items'); this.$ticker = this.$widget.find('.backlinks-ticker'); this.$count.on("click", () => { this.$items.toggle(); this.$items.css("max-height", $(window).height() - this.$items.offset().top - 10); if (this.$items.is(":visible")) { this.renderBacklinks(); } }); this.$closeTickerButton = this.$widget.find('.backlinks-close-ticker'); this.$closeTickerButton.on("click", () => { this.$ticker.hide(); this.clearItems(); }); this.contentSized(); } async refreshWithNote(note) { this.clearItems(); const targetRelationCount = note.getTargetRelations().length; if (targetRelationCount === 0) { this.$ticker.hide(); } else { this.$ticker.show(); this.$count.text( `${targetRelationCount} backlink` + (targetRelationCount === 1 ? '' : 's') ); } } clearItems() { this.$items.empty().hide(); } async renderBacklinks() { if (!this.note) { return; } this.$items.empty(); const backlinks = await server.get(`note-map/${this.noteId}/backlinks`); if (!backlinks.length) { return; } await froca.getNotes(backlinks.map(bl => bl.noteId)); // prefetch all for (const backlink of backlinks) { this.$items.append(await linkService.createNoteLink(backlink.noteId, { showNoteIcon: true, showNotePath: true, showTooltip: false })); if (backlink.relationName) { this.$items.append($("

").text("relation: " + backlink.relationName)); } else { this.$items.append(...backlink.excerpts); } } } }