diff --git a/src/public/app/layouts/desktop_layout.js b/src/public/app/layouts/desktop_layout.js index 984617e2e..a80907cce 100644 --- a/src/public/app/layouts/desktop_layout.js +++ b/src/public/app/layouts/desktop_layout.js @@ -1,12 +1,12 @@ import FlexContainer from "../widgets/containers/flex_container.js"; -import GlobalMenuWidget from "../widgets/global_menu.js"; +import GlobalMenuWidget from "../widgets/buttons/global_menu.js"; import TabRowWidget from "../widgets/tab_row.js"; import TitleBarButtonsWidget from "../widgets/title_bar_buttons.js"; import SidePaneContainer from "../widgets/containers/side_pane_container.js"; import NoteTreeWidget from "../widgets/note_tree.js"; import NoteTitleWidget from "../widgets/note_title.js"; import OwnedAttributeListWidget from "../widgets/type_property_widgets/owned_attribute_list.js"; -import NoteActionsWidget from "../widgets/note_actions.js"; +import NoteActionsWidget from "../widgets/buttons/note_actions.js"; import NoteDetailWidget from "../widgets/note_detail.js"; import CollapsibleSectionContainer from "../widgets/containers/collapsible_section_container.js"; import PromotedAttributesWidget from "../widgets/type_property_widgets/promoted_attributes.js"; @@ -26,10 +26,12 @@ import RootContainer from "../widgets/containers/root_container.js"; import NoteUpdateStatusWidget from "../widgets/note_update_status.js"; import SpacerWidget from "../widgets/spacer.js"; import QuickSearchWidget from "../widgets/quick_search.js"; -import ButtonWidget from "../widgets/button_widget.js"; -import ProtectedSessionStatusWidget from "../widgets/protected_session_status.js"; +import ButtonWidget from "../widgets/buttons/button_widget.js"; +import ProtectedSessionStatusWidget from "../widgets/buttons/protected_session_status.js"; import PaneContainer from "../widgets/containers/pane_container.js"; -import SidebarToggleWidget from "../widgets/sidebar_toggle.js"; +import SidebarToggleWidget from "../widgets/buttons/sidebar_toggle.js"; +import CreatePaneButton from "../widgets/buttons/create_pane_button.js"; +import ClosePaneButton from "../widgets/buttons/close_pane_button.js"; export default class DesktopLayout { constructor(customWidgets) { @@ -90,12 +92,9 @@ export default class DesktopLayout { .overflowing() .child(new NoteIconWidget()) .child(new NoteTitleWidget()) - .child(new ButtonWidget() - .icon("bx-window-open bx-rotate-90") - .title("Create new pane") - .titlePlacement("bottom") - .onClick(widget => widget.triggerCommand("openNewPane", { ntxId: widget.getNtxId() })) - ) + .child(new SpacerWidget(1)) + .child(new ClosePaneButton()) + .child(new CreatePaneButton()) ) .child( new CollapsibleSectionContainer() diff --git a/src/public/app/services/note_context.js b/src/public/app/services/note_context.js index 6e1ae1408..5e1354e9e 100644 --- a/src/public/app/services/note_context.js +++ b/src/public/app/services/note_context.js @@ -64,6 +64,11 @@ class NoteContext extends Component { return appContext.tabManager.noteContexts.filter(nc => nc.ntxId === this.ntxId || nc.mainNtxId === this.ntxId); } + isMainContext() { + // if null then this is a main context + return !this.mainNtxId; + } + getMainContext() { if (this.mainNtxId) { return appContext.tabManager.getNoteContextById(this.mainNtxId); diff --git a/src/public/app/services/tab_manager.js b/src/public/app/services/tab_manager.js index 0fc318925..c0bed71cc 100644 --- a/src/public/app/services/tab_manager.js +++ b/src/public/app/services/tab_manager.js @@ -277,7 +277,7 @@ export default class TabManager extends Component { await this.openContextWithNote(noteId, true); } - activateNoteContext(ntxId, triggerEvent = true) { + async activateNoteContext(ntxId, triggerEvent = true) { if (ntxId === this.activeNtxId) { return; } @@ -285,7 +285,7 @@ export default class TabManager extends Component { this.activeNtxId = ntxId; if (triggerEvent) { - this.triggerEvent('activeContextChanged', { + await this.triggerEvent('activeContextChanged', { noteContext: this.getNoteContextById(ntxId) }); } @@ -296,20 +296,23 @@ export default class TabManager extends Component { } async removeNoteContext(ntxId) { - const mainNoteContextToRemove = this.getNoteContextById(ntxId).getMainContext(); + const noteContextToRemove = this.getNoteContextById(ntxId); // close dangling autocompletes after closing the tab $(".aa-input").autocomplete("close"); - const ntxIdsToRemove = mainNoteContextToRemove.getSubContexts().map(nc => nc.ntxId); + const ntxIdsToRemove = noteContextToRemove.getSubContexts().map(nc => nc.ntxId); await this.triggerEvent('beforeTabRemove', { ntxIds: ntxIdsToRemove }); - if (this.mainNoteContexts.length <= 1) { + if (!noteContextToRemove.isMainContext()) { + await this.activateNoteContext(noteContextToRemove.getMainContext().ntxId); + } + else if (this.mainNoteContexts.length <= 1) { await this.openAndActivateEmptyTab(); } else if (ntxIdsToRemove.includes(this.activeNtxId)) { - const idx = this.mainNoteContexts.findIndex(nc => nc.ntxId === mainNoteContextToRemove.ntxId); + const idx = this.mainNoteContexts.findIndex(nc => nc.ntxId === noteContextToRemove.ntxId); if (idx === this.mainNoteContexts.length - 1) { this.activatePreviousTabCommand(); diff --git a/src/public/app/widgets/button_widget.js b/src/public/app/widgets/buttons/button_widget.js similarity index 89% rename from src/public/app/widgets/button_widget.js rename to src/public/app/widgets/buttons/button_widget.js index 52f06f894..bef965cb1 100644 --- a/src/public/app/widgets/button_widget.js +++ b/src/public/app/widgets/buttons/button_widget.js @@ -1,4 +1,4 @@ -import BasicWidget from "./basic_widget.js"; +import NoteContextAwareWidget from "../note_context_aware_widget.js"; const TPL = ` `; -export default class ButtonWidget extends BasicWidget { +export default class ButtonWidget extends NoteContextAwareWidget { + isEnabled() { + return true; + } + constructor() { super(); diff --git a/src/public/app/widgets/buttons/close_pane_button.js b/src/public/app/widgets/buttons/close_pane_button.js new file mode 100644 index 000000000..79c82762c --- /dev/null +++ b/src/public/app/widgets/buttons/close_pane_button.js @@ -0,0 +1,18 @@ +import ButtonWidget from "./button_widget.js"; + +export default class ClosePaneButton extends ButtonWidget { + isEnabled() { + return super.isEnabled() + // main note context should not be closeable + && this.noteContext && !!this.noteContext.mainNtxId; + } + + constructor() { + super(); + + this.icon("bx-x") + .title("Close this pane") + .titlePlacement("bottom") + .onClick(widget => widget.triggerCommand("closeThisPane", { ntxId: widget.getNtxId() })); + } +} diff --git a/src/public/app/widgets/buttons/create_pane_button.js b/src/public/app/widgets/buttons/create_pane_button.js new file mode 100644 index 000000000..bd6fa602b --- /dev/null +++ b/src/public/app/widgets/buttons/create_pane_button.js @@ -0,0 +1,12 @@ +import ButtonWidget from "./button_widget.js"; + +export default class CreatePaneButton extends ButtonWidget { + constructor() { + super(); + + this.icon("bx-window-open bx-rotate-90") + .title("Create new pane") + .titlePlacement("bottom") + .onClick(widget => widget.triggerCommand("openNewPane", { ntxId: widget.getNtxId() })); + } +} diff --git a/src/public/app/widgets/global_menu.js b/src/public/app/widgets/buttons/global_menu.js similarity index 95% rename from src/public/app/widgets/global_menu.js rename to src/public/app/widgets/buttons/global_menu.js index 4d1dd351b..ccc266807 100644 --- a/src/public/app/widgets/global_menu.js +++ b/src/public/app/widgets/buttons/global_menu.js @@ -1,5 +1,5 @@ -import BasicWidget from "./basic_widget.js"; -import utils from "../services/utils.js"; +import BasicWidget from "../basic_widget.js"; +import utils from "../../services/utils.js"; const TPL = `