diff --git a/src/public/app/layouts/desktop_layout.js b/src/public/app/layouts/desktop_layout.js index de933fbb2..8bf118092 100644 --- a/src/public/app/layouts/desktop_layout.js +++ b/src/public/app/layouts/desktop_layout.js @@ -46,7 +46,7 @@ import OpenNoteButtonWidget from "../widgets/buttons/open_note_button_widget.js" import MermaidWidget from "../widgets/mermaid.js"; import BookmarkButtons from "../widgets/bookmark_buttons.js"; import NoteWrapperWidget from "../widgets/note_wrapper.js"; -import BacklinksWidget from "../widgets/backlinks.js"; +import BacklinksWidget from "../widgets/floating_buttons/backlinks.js"; import SharedInfoWidget from "../widgets/shared_info.js"; import FindWidget from "../widgets/find.js"; import TocWidget from "../widgets/toc.js"; @@ -75,6 +75,8 @@ import InfoDialog from "../widgets/dialogs/info.js"; import ConfirmDialog from "../widgets/dialogs/confirm.js"; import PromptDialog from "../widgets/dialogs/prompt.js"; import OptionsDialog from "../widgets/dialogs/options.js"; +import FloatingButtons from "../widgets/floating_buttons/floating_buttons.js"; +import RelationMapButtons from "../widgets/floating_buttons/relation_map_buttons.js"; export default class DesktopLayout { constructor(customWidgets) { @@ -177,7 +179,10 @@ export default class DesktopLayout { ) .child(new SharedInfoWidget()) .child(new NoteUpdateStatusWidget()) - .child(new BacklinksWidget()) + .child(new FloatingButtons() + .child(new BacklinksWidget()) + .child(new RelationMapButtons()) + ) .child(new MermaidWidget()) .child( new ScrollingContainer() @@ -189,7 +194,10 @@ export default class DesktopLayout { .child(new SqlResultWidget()) ) .child(new FindWidget()) - .child(...this.customWidgets.get('node-detail-pane')) + .child( + ...this.customWidgets.get('node-detail-pane'), // typo, let's keep it for a while as BC + ...this.customWidgets.get('note-detail-pane') + ) ) ) .child(...this.customWidgets.get('center-pane')) diff --git a/src/public/app/widgets/basic_widget.js b/src/public/app/widgets/basic_widget.js index 5c8cccdeb..f8a1c3ce8 100644 --- a/src/public/app/widgets/basic_widget.js +++ b/src/public/app/widgets/basic_widget.js @@ -133,7 +133,7 @@ class BasicWidget extends Component { } } - getNtxId() { + getClosestNtxId() { if (this.$widget) { return this.$widget.closest("[data-ntx-id]").attr("data-ntx-id"); } diff --git a/src/public/app/widgets/buttons/close_pane_button.js b/src/public/app/widgets/buttons/close_pane_button.js index 2fc5d52c8..6c2621afd 100644 --- a/src/public/app/widgets/buttons/close_pane_button.js +++ b/src/public/app/widgets/buttons/close_pane_button.js @@ -18,7 +18,7 @@ export default class ClosePaneButton extends ButtonWidget { // pane (which is being removed) e.stopPropagation(); - widget.triggerCommand("closeThisNoteSplit", { ntxId: widget.getNtxId() }); + widget.triggerCommand("closeThisNoteSplit", { ntxId: widget.getClosestNtxId() }); }); } } diff --git a/src/public/app/widgets/buttons/create_pane_button.js b/src/public/app/widgets/buttons/create_pane_button.js index d90236453..9b48e0c46 100644 --- a/src/public/app/widgets/buttons/create_pane_button.js +++ b/src/public/app/widgets/buttons/create_pane_button.js @@ -7,6 +7,6 @@ export default class CreatePaneButton extends ButtonWidget { this.icon("bx-dock-right") .title("Create new split") .titlePlacement("bottom") - .onClick(widget => widget.triggerCommand("openNewNoteSplit", { ntxId: widget.getNtxId() })); + .onClick(widget => widget.triggerCommand("openNewNoteSplit", { ntxId: widget.getClosestNtxId() })); } } diff --git a/src/public/app/widgets/component.js b/src/public/app/widgets/component.js index b9eddeaf0..cc461c637 100644 --- a/src/public/app/widgets/component.js +++ b/src/public/app/widgets/component.js @@ -16,7 +16,7 @@ export default class Component { this.componentId = `comp-` + this.sanitizedClassName + '-' + utils.randomString(8); /** @type Component[] */ this.children = []; - this.initialized = Promise.resolve(); + this.initialized = null; } get sanitizedClassName() { @@ -42,10 +42,16 @@ export default class Component { /** @returns {Promise} */ handleEvent(name, data) { - return Promise.all([ - this.initialized.then(() => this.callMethod(this[name + 'Event'], data)), - this.handleEventInChildren(name, data) - ]); + const callMethodPromise = this.initialized + ? this.initialized.then(() => this.callMethod(this[name + 'Event'], data)) + : this.callMethod(this[name + 'Event'], data); + + const childrenPromise = this.handleEventInChildren(name, data); + + // don't create promises if not needed (optimization) + return callMethodPromise && childrenPromise + ? Promise.all([callMethodPromise, childrenPromise]) + : null; } /** @returns {Promise} */ @@ -61,7 +67,8 @@ export default class Component { promises.push(child.handleEvent(name, data)); } - return Promise.all(promises); + // don't create promises if not needed (optimization) + return promises.find(p => p) ? Promise.all(promises) : null; } /** @returns {Promise} */ diff --git a/src/public/app/widgets/containers/ribbon_container.js b/src/public/app/widgets/containers/ribbon_container.js index c5b371538..6cd4db53e 100644 --- a/src/public/app/widgets/containers/ribbon_container.js +++ b/src/public/app/widgets/containers/ribbon_container.js @@ -186,9 +186,13 @@ export default class RibbonContainer extends NoteContextAwareWidget { const activeChild = this.getActiveRibbonWidget(); if (activeChild && (refreshActiveTab || !wasAlreadyActive)) { - activeChild.handleEvent('noteSwitched', {noteContext: this.noteContext, notePath: this.notePath}).then(() => { + const handleEventPromise = activeChild.handleEvent('noteSwitched', {noteContext: this.noteContext, notePath: this.notePath}); + + if (handleEventPromise) { + handleEventPromise.then(() => activeChild.focus?.()); + } else { activeChild.focus?.(); - }); + } } } else { this.lastActiveComponentId = null; diff --git a/src/public/app/widgets/containers/right_pane_container.js b/src/public/app/widgets/containers/right_pane_container.js index 204c48cb4..e991a7cff 100644 --- a/src/public/app/widgets/containers/right_pane_container.js +++ b/src/public/app/widgets/containers/right_pane_container.js @@ -23,7 +23,12 @@ export default class RightPaneContainer extends FlexContainer { // right pane is displayed only if some child widget is active // we'll reevaluate the visibility based on events which are probable to cause visibility change // but these events needs to be finished and only then we check - promise.then(() => this.reevaluateIsEnabledCommand()); + if (promise) { + promise.then(() => this.reevaluateIsEnabledCommand()); + } + else { + this.reevaluateIsEnabledCommand(); + } } return promise; diff --git a/src/public/app/widgets/backlinks.js b/src/public/app/widgets/floating_buttons/backlinks.js similarity index 80% rename from src/public/app/widgets/backlinks.js rename to src/public/app/widgets/floating_buttons/backlinks.js index 2e32d5a6f..2b622b81a 100644 --- a/src/public/app/widgets/backlinks.js +++ b/src/public/app/widgets/floating_buttons/backlinks.js @@ -1,7 +1,7 @@ -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"; +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 = `