import styles from "./dock-tab.module.scss"; import React from "react"; import { observer } from "mobx-react"; import { cssNames, prevDefault, isMiddleClick } from "@k8slens/utilities"; import type { DockStore, DockTab as DockTabModel } from "./store"; import type { TabProps } from "../tabs"; import { Tab } from "../tabs"; import { Icon } from "../icon"; import { Menu, MenuItem } from "../menu"; import { observable } from "mobx"; import { withInjectables } from "@ogre-tools/injectable-react"; import dockStoreInjectable from "./store.injectable"; import { Tooltip, TooltipPosition } from "../tooltip"; import isMacInjectable from "../../../common/vars/is-mac.injectable"; import autoBindReact from "auto-bind/react"; export interface DockTabProps extends TabProps { moreActions?: React.ReactNode; } interface Dependencies { dockStore: DockStore; isMac: boolean; } @observer class NonInjectedDockTab extends React.Component { private readonly menuVisible = observable.box(false); constructor(props: DockTabProps & Dependencies) { super(props); autoBindReact(this); } close(id: string) { this.props.dockStore.closeTab(id); } renderMenu(tabId: string) { const { closeTab, closeAllTabs, closeOtherTabs, closeTabsToTheRight, tabs, getTabIndex } = this.props.dockStore; const closeAllDisabled = tabs.length === 1; const closeOtherDisabled = tabs.length === 1; const closeRightDisabled = getTabIndex(tabId) === tabs.length - 1; return ( this.menuVisible.set(true)} close={() => this.menuVisible.set(false)} toggleEvent="contextmenu" > closeTab(tabId)}>Close closeAllTabs()} disabled={closeAllDisabled}> Close all tabs closeOtherTabs(tabId)} disabled={closeOtherDisabled}> Close other tabs closeTabsToTheRight(tabId)} disabled={closeRightDisabled}> Close tabs to the right ); } render() { const { className, moreActions, dockStore, active, isMac, ...tabProps } = this.props; if (!tabProps.value) { return; } const { title, pinned, id } = tabProps.value; const close = prevDefault(() => this.close(id)); return ( <> this.menuVisible.set(true)} label={
{title} {moreActions} {!pinned && (
)} {title}
} data-testid={`dock-tab-for-${id}`} /> {this.renderMenu(id)} ); } } export const DockTab = withInjectables(NonInjectedDockTab, { getProps: (di, props) => ({ dockStore: di.inject(dockStoreInjectable), isMac: di.inject(isMacInjectable), ...props, }), });