mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
dock/dock-store fixes & refactoring
Signed-off-by: Roman <ixrock@gmail.com>
This commit is contained in:
parent
87cdaa3661
commit
4c627b8649
@ -7,7 +7,7 @@ import { dockStore, IDockTab } from "./dock.store";
|
|||||||
import { Tab, TabProps } from "../tabs";
|
import { Tab, TabProps } from "../tabs";
|
||||||
import { Icon } from "../icon";
|
import { Icon } from "../icon";
|
||||||
import { Menu, MenuItem } from "../menu";
|
import { Menu, MenuItem } from "../menu";
|
||||||
import { observable, makeObservable } from "mobx";
|
import { makeObservable, observable } from "mobx";
|
||||||
|
|
||||||
export interface DockTabProps extends TabProps<IDockTab> {
|
export interface DockTabProps extends TabProps<IDockTab> {
|
||||||
moreActions?: React.ReactNode;
|
moreActions?: React.ReactNode;
|
||||||
@ -32,7 +32,7 @@ export class DockTab extends React.Component<DockTabProps> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
renderMenu() {
|
renderMenu() {
|
||||||
const { closeTab, closeAllTabs, closeOtherTabs, closeTabsToTheRight, tabs, getTabIndex } = dockStore;
|
const { closeAllTabs, closeOtherTabs, closeTabsToTheRight, tabs, getTabIndex } = dockStore;
|
||||||
const closeAllDisabled = tabs.length === 1;
|
const closeAllDisabled = tabs.length === 1;
|
||||||
const closeOtherDisabled = tabs.length === 1;
|
const closeOtherDisabled = tabs.length === 1;
|
||||||
const closeRightDisabled = getTabIndex(this.tabId) === tabs.length - 1;
|
const closeRightDisabled = getTabIndex(this.tabId) === tabs.length - 1;
|
||||||
@ -47,7 +47,7 @@ export class DockTab extends React.Component<DockTabProps> {
|
|||||||
close={() => this.menuVisible = false}
|
close={() => this.menuVisible = false}
|
||||||
toggleEvent="contextmenu"
|
toggleEvent="contextmenu"
|
||||||
>
|
>
|
||||||
<MenuItem onClick={() => closeTab(this.tabId)}>
|
<MenuItem onClick={() => dockStore.closeTab(this.tabId)}>
|
||||||
Close
|
Close
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
<MenuItem onClick={() => closeAllTabs()} disabled={closeAllDisabled}>
|
<MenuItem onClick={() => closeAllTabs()} disabled={closeAllDisabled}>
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import MD5 from "crypto-js/md5";
|
import MD5 from "crypto-js/md5";
|
||||||
import { action, computed, IReactionOptions, makeObservable, observable, reaction } from "mobx";
|
import { action, computed, IReactionOptions, makeObservable, observable, reaction } from "mobx";
|
||||||
import { autobind, createStorage, StorageHelper } from "../../utils";
|
import { createStorage, StorageHelper } from "../../utils";
|
||||||
import throttle from "lodash/throttle";
|
import throttle from "lodash/throttle";
|
||||||
|
|
||||||
export type TabId = string;
|
export type TabId = string;
|
||||||
@ -30,6 +30,8 @@ export interface DockStorageState {
|
|||||||
|
|
||||||
export class DockStore implements DockStorageState {
|
export class DockStore implements DockStorageState {
|
||||||
constructor() {
|
constructor() {
|
||||||
|
makeObservable(this);
|
||||||
|
|
||||||
this.storage = createStorage<DockStorageState>("dock", {
|
this.storage = createStorage<DockStorageState>("dock", {
|
||||||
height: 300,
|
height: 300,
|
||||||
tabs: [
|
tabs: [
|
||||||
@ -37,8 +39,7 @@ export class DockStore implements DockStorageState {
|
|||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
makeObservable(this);
|
this.bindEvents();
|
||||||
this.init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private storage: StorageHelper<DockStorageState>;
|
private storage: StorageHelper<DockStorageState>;
|
||||||
@ -85,7 +86,7 @@ export class DockStore implements DockStorageState {
|
|||||||
return this.tabs.find(tab => tab.id === this.selectedTabId);
|
return this.tabs.find(tab => tab.id === this.selectedTabId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private init() {
|
private bindEvents() {
|
||||||
// adjust terminal height if window size changes
|
// adjust terminal height if window size changes
|
||||||
window.addEventListener("resize", throttle(this.adjustHeight, 250));
|
window.addEventListener("resize", throttle(this.adjustHeight, 250));
|
||||||
}
|
}
|
||||||
@ -113,8 +114,7 @@ export class DockStore implements DockStorageState {
|
|||||||
return reaction(() => this.selectedTabId, callback, options);
|
return reaction(() => this.selectedTabId, callback, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
@autobind()
|
@computed get hasTabs(): boolean {
|
||||||
hasTabs() {
|
|
||||||
return this.tabs.length > 0;
|
return this.tabs.length > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,18 +127,16 @@ export class DockStore implements DockStorageState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@action.bound
|
|
||||||
close() {
|
close() {
|
||||||
this.isOpen = false;
|
this.isOpen = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@action.bound
|
|
||||||
toggle() {
|
toggle() {
|
||||||
if (this.isOpen) this.close();
|
if (this.isOpen) this.close();
|
||||||
else this.open();
|
else this.open();
|
||||||
}
|
}
|
||||||
|
|
||||||
@action.bound
|
@action
|
||||||
toggleFillSize() {
|
toggleFillSize() {
|
||||||
if (!this.isOpen) this.open();
|
if (!this.isOpen) this.open();
|
||||||
this.fullSize = !this.fullSize;
|
this.fullSize = !this.fullSize;
|
||||||
@ -148,7 +146,7 @@ export class DockStore implements DockStorageState {
|
|||||||
return this.tabs.find(tab => tab.id === tabId);
|
return this.tabs.find(tab => tab.id === tabId);
|
||||||
}
|
}
|
||||||
|
|
||||||
getTabIndex(tabId: TabId) {
|
getTabIndex(tabId: TabId): number {
|
||||||
return this.tabs.findIndex(tab => tab.id === tabId);
|
return this.tabs.findIndex(tab => tab.id === tabId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,7 +164,7 @@ export class DockStore implements DockStorageState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@action.bound
|
@action
|
||||||
createTab(anonTab: IDockTab, addNumber = true): IDockTab {
|
createTab(anonTab: IDockTab, addNumber = true): IDockTab {
|
||||||
const tabId = MD5(Math.random().toString() + Date.now()).toString();
|
const tabId = MD5(Math.random().toString() + Date.now()).toString();
|
||||||
const tab: IDockTab = { id: tabId, ...anonTab };
|
const tab: IDockTab = { id: tabId, ...anonTab };
|
||||||
@ -183,7 +181,7 @@ export class DockStore implements DockStorageState {
|
|||||||
return tab;
|
return tab;
|
||||||
}
|
}
|
||||||
|
|
||||||
@action.bound
|
@action
|
||||||
async closeTab(tabId: TabId) {
|
async closeTab(tabId: TabId) {
|
||||||
const tab = this.getTabById(tabId);
|
const tab = this.getTabById(tabId);
|
||||||
|
|
||||||
|
|||||||
@ -31,18 +31,18 @@ interface Props {
|
|||||||
@observer
|
@observer
|
||||||
export class Dock extends React.Component<Props> {
|
export class Dock extends React.Component<Props> {
|
||||||
onKeydown = (evt: React.KeyboardEvent<HTMLElement>) => {
|
onKeydown = (evt: React.KeyboardEvent<HTMLElement>) => {
|
||||||
const { close, closeTab, selectedTab } = dockStore;
|
const { selectedTab } = dockStore;
|
||||||
|
|
||||||
if (!selectedTab) return;
|
if (!selectedTab) return;
|
||||||
const { code, ctrlKey, shiftKey } = evt.nativeEvent;
|
const { code, ctrlKey, shiftKey } = evt.nativeEvent;
|
||||||
|
|
||||||
if (shiftKey && code === "Escape") {
|
if (shiftKey && code === "Escape") {
|
||||||
close();
|
dockStore.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctrlKey && code === "KeyW") {
|
if (ctrlKey && code === "KeyW") {
|
||||||
if (selectedTab.pinned) close();
|
if (selectedTab.pinned) dockStore.close();
|
||||||
else closeTab(selectedTab.id);
|
else dockStore.closeTab(selectedTab.id);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -60,19 +60,20 @@ export class Dock extends React.Component<Props> {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="tab-content" style={{ flexBasis: height }}>
|
<div className="tab-content" style={{ flexBasis: height }}>
|
||||||
{isCreateResourceTab(tab) && <CreateResource tab={tab} />}
|
{isCreateResourceTab(tab) && <CreateResource tab={tab}/>}
|
||||||
{isEditResourceTab(tab) && <EditResource tab={tab} />}
|
{isEditResourceTab(tab) && <EditResource tab={tab}/>}
|
||||||
{isInstallChartTab(tab) && <InstallChart tab={tab} />}
|
{isInstallChartTab(tab) && <InstallChart tab={tab}/>}
|
||||||
{isUpgradeChartTab(tab) && <UpgradeChart tab={tab} />}
|
{isUpgradeChartTab(tab) && <UpgradeChart tab={tab}/>}
|
||||||
{isTerminalTab(tab) && <TerminalWindow tab={tab} />}
|
{isTerminalTab(tab) && <TerminalWindow tab={tab}/>}
|
||||||
{isLogsTab(tab) && <Logs tab={tab} />}
|
{isLogsTab(tab) && <Logs tab={tab}/>}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { className } = this.props;
|
const { className } = this.props;
|
||||||
const { isOpen, toggle, tabs, toggleFillSize, selectedTab, hasTabs, fullSize } = dockStore;
|
const { isOpen, tabs, selectedTab, hasTabs, fullSize } = dockStore;
|
||||||
|
const toggleDock = () => dockStore.toggle();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
@ -81,17 +82,17 @@ export class Dock extends React.Component<Props> {
|
|||||||
tabIndex={-1}
|
tabIndex={-1}
|
||||||
>
|
>
|
||||||
<ResizingAnchor
|
<ResizingAnchor
|
||||||
disabled={!hasTabs()}
|
disabled={!hasTabs}
|
||||||
getCurrentExtent={() => dockStore.height}
|
getCurrentExtent={() => dockStore.height}
|
||||||
minExtent={dockStore.minHeight}
|
minExtent={dockStore.minHeight}
|
||||||
maxExtent={dockStore.maxHeight}
|
maxExtent={dockStore.maxHeight}
|
||||||
direction={ResizeDirection.VERTICAL}
|
direction={ResizeDirection.VERTICAL}
|
||||||
onStart={dockStore.open}
|
onStart={dockStore.open}
|
||||||
onMinExtentSubceed={dockStore.close}
|
onMinExtentSubceed={() => dockStore.close()}
|
||||||
onMinExtentExceed={dockStore.open}
|
onMinExtentExceed={() => dockStore.open()}
|
||||||
onDrag={extent => dockStore.height = extent}
|
onDrag={extent => dockStore.height = extent}
|
||||||
/>
|
/>
|
||||||
<div className="tabs-container flex align-center" onDoubleClick={prevDefault(toggle)}>
|
<div className="tabs-container flex align-center" onDoubleClick={prevDefault(toggleDock)}>
|
||||||
<DockTabs
|
<DockTabs
|
||||||
tabs={tabs}
|
tabs={tabs}
|
||||||
selectedTab={selectedTab}
|
selectedTab={selectedTab}
|
||||||
@ -111,17 +112,17 @@ export class Dock extends React.Component<Props> {
|
|||||||
</MenuItem>
|
</MenuItem>
|
||||||
</MenuActions>
|
</MenuActions>
|
||||||
</div>
|
</div>
|
||||||
{hasTabs() && (
|
{hasTabs && (
|
||||||
<>
|
<>
|
||||||
<Icon
|
<Icon
|
||||||
material={fullSize ? "fullscreen_exit" : "fullscreen"}
|
material={fullSize ? "fullscreen_exit" : "fullscreen"}
|
||||||
tooltip={fullSize ? "Exit full size mode" : "Fit to window"}
|
tooltip={fullSize ? "Exit full size mode" : "Fit to window"}
|
||||||
onClick={toggleFillSize}
|
onClick={() => dockStore.toggleFillSize()}
|
||||||
/>
|
/>
|
||||||
<Icon
|
<Icon
|
||||||
material={`keyboard_arrow_${isOpen ? "down" : "up"}`}
|
material={`keyboard_arrow_${isOpen ? "down" : "up"}`}
|
||||||
tooltip={isOpen ? "Minimize" : "Open"}
|
tooltip={isOpen ? "Minimize" : "Open"}
|
||||||
onClick={toggle}
|
onClick={toggleDock}
|
||||||
/>
|
/>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user