import TabAwareWidget from "./tab_aware_widget.js"; import treeService from "../services/tree.js"; import utils from "../services/utils.js"; import protectedSessionService from "../services/protected_session.js"; import treeUtils from "../services/tree_utils.js"; import linkService from "../services/link.js"; import protectedSessionHolder from "../services/protected_session_holder.js"; import NoteTypeWidget from "./note_type.js"; const TPL = `
`; export default class NoteTitleWidget extends TabAwareWidget { constructor(appContext) { super(appContext); this.tree = null; } doRender() { this.$widget = $(TPL); this.$noteTitle = this.$widget.find(".note-title"); this.$noteTitleRow = this.$widget.find(".note-title-row"); this.$notePathList = this.$widget.find(".note-path-list"); this.$notePathCount = this.$widget.find(".note-path-count"); this.$protectButton = this.$widget.find(".protect-button"); this.$protectButton.on('click', protectedSessionService.protectNoteAndSendToServer); this.$unprotectButton = this.$widget.find(".unprotect-button"); this.$unprotectButton.on('click', protectedSessionService.unprotectNoteAndSendToServer); this.$savedIndicator = this.$widget.find(".saved-indicator"); this.noteType = new NoteTypeWidget(this); this.$noteTitle.on('input', () => { if (!this.note) { return; } // FIXME event not used this.trigger(`activeNoteChanged`); this.note.title = this.$noteTitle.val(); this.tabRow.updateTab(this.$tab[0], {title: this.note.title}); treeService.setNoteTitle(this.note.noteId, this.note.title); this.setTitleBar(); }); if (utils.isDesktop()) { // keyboard plugin is not loaded in mobile utils.bindElShortcut(this.$noteTitle, 'return', () => { this.getComponent().focus(); return false; // to not propagate the enter into the editor (causes issues with codemirror) }); } return this.$widget; } async activeTabChanged() { const note = this.tabContext.note; this.$noteTitle.val(note.title); this.$protectButton.toggleClass("active", note.isProtected); this.$protectButton.prop("disabled", note.isProtected); this.$unprotectButton.toggleClass("active", !note.isProtected); this.$unprotectButton.prop("disabled", !note.isProtected || !protectedSessionHolder.isProtectedSessionAvailable()); await this.showPaths(); } async showPaths() { const {note, notePath} = this.tabContext; if (note.noteId === 'root') { // root doesn't have any parent, but it's still technically 1 path this.$notePathCount.html("1 path"); this.$notePathList.empty(); await this.addPath('root', true); } else { const parents = await note.getParentNotes(); this.$notePathCount.html(parents.length + " path" + (parents.length > 1 ? "s" : "")); this.$notePathList.empty(); const pathSegments = notePath.split("/"); const activeNoteParentNoteId = pathSegments[pathSegments.length - 2]; // we know this is not root so there must be a parent for (const parentNote of parents) { const parentNotePath = await treeService.getSomeNotePath(parentNote); // this is to avoid having root notes leading '/' const notePath = parentNotePath ? (parentNotePath + '/' + note.noteId) : note.noteId; const isCurrent = activeNoteParentNoteId === parentNote.noteId; await this.addPath(notePath, isCurrent); } const cloneLink = $("
") .addClass("dropdown-item") .append( $('