/** * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ import "./dock-tab.scss"; import React from "react"; import { observer } from "mobx-react"; import { boundMethod, cssNames, prevDefault, isMiddleClick } from "../../utils"; import type { DockStore, DockTab as DockTabModel } from "./dock-store/dock.store"; import { Tab, TabProps } from "../tabs"; import { Icon } from "../icon"; import { Menu, MenuItem } from "../menu"; import { observable, makeObservable } from "mobx"; import { isMac } from "../../../common/vars"; import { withInjectables } from "@ogre-tools/injectable-react"; import dockStoreInjectable from "./dock-store/dock-store.injectable"; export interface DockTabProps extends TabProps { moreActions?: React.ReactNode; } interface Dependencies { dockStore: DockStore } @observer class NonInjectedDockTab extends React.Component { @observable menuVisible = false; constructor(props: DockTabProps & Dependencies) { super(props); makeObservable(this); } get tabId() { return this.props.value.id; } @boundMethod close() { this.props.dockStore.closeTab(this.tabId); } renderMenu() { const { closeTab, closeAllTabs, closeOtherTabs, closeTabsToTheRight, tabs, getTabIndex } = this.props.dockStore; const closeAllDisabled = tabs.length === 1; const closeOtherDisabled = tabs.length === 1; const closeRightDisabled = getTabIndex(this.tabId) === tabs.length - 1; return ( this.menuVisible = true} close={() => this.menuVisible = false} toggleEvent="contextmenu" > closeTab(this.tabId)}> Close closeAllTabs()} disabled={closeAllDisabled}> Close all tabs closeOtherTabs(this.tabId)} disabled={closeOtherDisabled}> Close other tabs closeTabsToTheRight(this.tabId)} disabled={closeRightDisabled}> Close tabs to the right ); } render() { const { className, moreActions, dockStore, ...tabProps } = this.props; const { title, pinned } = tabProps.value; const label = (
{title} {moreActions} {!pinned && ( )}
); return ( <> this.menuVisible = true} label={label} /> {this.renderMenu()} ); } } export const DockTab = withInjectables( NonInjectedDockTab, { getProps: (di, props) => ({ dockStore: di.inject(dockStoreInjectable), ...props, }), }, );