diff --git a/src/public/app/components/app_context.ts b/src/public/app/components/app_context.ts index 8bcec0593..e9084c4da 100644 --- a/src/public/app/components/app_context.ts +++ b/src/public/app/components/app_context.ts @@ -211,6 +211,9 @@ export type CommandMappings = { reEvaluateRightPaneVisibility: CommandData; runActiveNote: CommandData; + scrollContainerToCommand: CommandData & { + position: number; + }; // Geomap deleteFromMap: { noteId: string }, diff --git a/src/public/app/widgets/containers/right_pane_container.ts b/src/public/app/widgets/containers/right_pane_container.ts index 764fad85d..84875bec1 100644 --- a/src/public/app/widgets/containers/right_pane_container.ts +++ b/src/public/app/widgets/containers/right_pane_container.ts @@ -20,7 +20,7 @@ export default class RightPaneContainer extends FlexContainer return super.isEnabled() && !this.rightPaneHidden && this.children.length > 0 && !!this.children.find((ch) => ch.isEnabled() && ch.canBeShown()); } - handleEventInChildren(name: T, data: EventData): Promise | null { + async handleEventInChildren(name: T, data: EventData) { const promise = super.handleEventInChildren(name, data); if (["activeContextChanged", "noteSwitchedAndActivated", "noteSwitched"].includes(name)) { diff --git a/src/public/app/widgets/containers/scrolling_container.js b/src/public/app/widgets/containers/scrolling_container.js deleted file mode 100644 index 70162cb10..000000000 --- a/src/public/app/widgets/containers/scrolling_container.js +++ /dev/null @@ -1,50 +0,0 @@ -import Container from "./container.js"; - -export default class ScrollingContainer extends Container { - constructor() { - super(); - - this.class("scrolling-container"); - this.css("overflow", "auto"); - this.css("scroll-behavior", "smooth"); - this.css("position", "relative"); - } - - setNoteContextEvent({ noteContext }) { - /** @var {NoteContext} */ - this.noteContext = noteContext; - } - - async noteSwitchedEvent({ noteContext, notePath }) { - this.$widget.scrollTop(0); - } - - async noteSwitchedAndActivatedEvent({ noteContext, notePath }) { - this.noteContext = noteContext; - - this.$widget.scrollTop(0); - } - - async activeContextChangedEvent({ noteContext }) { - this.noteContext = noteContext; - } - - handleEventInChildren(name, data) { - if (name === "readOnlyTemporarilyDisabled" && this.noteContext && this.noteContext.ntxId === data.noteContext.ntxId) { - const scrollTop = this.$widget.scrollTop(); - - const promise = super.handleEventInChildren(name, data); - - // there seems to be some asynchronicity, and we need to wait a bit before scrolling - promise.then(() => setTimeout(() => this.$widget.scrollTop(scrollTop), 500)); - - return promise; - } else { - return super.handleEventInChildren(name, data); - } - } - - scrollContainerToCommand({ position }) { - this.$widget.scrollTop(position); - } -} diff --git a/src/public/app/widgets/containers/scrolling_container.ts b/src/public/app/widgets/containers/scrolling_container.ts new file mode 100644 index 000000000..62d4ec2c4 --- /dev/null +++ b/src/public/app/widgets/containers/scrolling_container.ts @@ -0,0 +1,57 @@ +import type { CommandListenerData, EventData, EventNames } from "../../components/app_context.js"; +import type NoteContext from "../../components/note_context.js"; +import type BasicWidget from "../basic_widget.js"; +import Container from "./container.js"; + +export default class ScrollingContainer extends Container { + + private noteContext?: NoteContext; + + constructor() { + super(); + + this.class("scrolling-container"); + this.css("overflow", "auto"); + this.css("scroll-behavior", "smooth"); + this.css("position", "relative"); + } + + setNoteContextEvent({ noteContext }: EventData<"setNoteContext">) { + this.noteContext = noteContext; + } + + async noteSwitchedEvent({ noteContext, notePath }: EventData<"noteSwitched">) { + this.$widget.scrollTop(0); + } + + async noteSwitchedAndActivatedEvent({ noteContext, notePath }: EventData<"noteSwitchedAndActivatedEvent">) { + this.noteContext = noteContext; + + this.$widget.scrollTop(0); + } + + async activeContextChangedEvent({ noteContext }: EventData<"activeContextChanged">) { + this.noteContext = noteContext; + } + + async handleEventInChildren(name: T, data: EventData) { + if (name === "readOnlyTemporarilyDisabled" && this.noteContext && "noteContext" in data && this.noteContext.ntxId === data.noteContext?.ntxId) { + const scrollTop = this.$widget.scrollTop() ?? 0; + + const promise = super.handleEventInChildren(name, data); + + // there seems to be some asynchronicity, and we need to wait a bit before scrolling + if (promise) { + promise.then(() => setTimeout(() => this.$widget.scrollTop(scrollTop), 500)); + } + + return promise; + } else { + return super.handleEventInChildren(name, data); + } + } + + scrollContainerToCommand({ position }: CommandListenerData<"scrollContainerToCommand">) { + this.$widget.scrollTop(position); + } +}