mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
feat: Make tabs closable
Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
This commit is contained in:
parent
a241b582fb
commit
4faf1b2438
@ -13,6 +13,74 @@ exports[`DockHost, given rendered given implementations of dock tab types emerge
|
||||
</body>
|
||||
`;
|
||||
|
||||
exports[`DockHost, given rendered given implementations of dock tab types emerge when dock tab of one of the types is created given another dock tab is created when dock tab being active is closed renders 1`] = `
|
||||
<body>
|
||||
<div>
|
||||
<div>
|
||||
<div
|
||||
class="flex align-center"
|
||||
>
|
||||
<div
|
||||
data-dock-tab-test="some-random-id-1"
|
||||
>
|
||||
<div
|
||||
data-dock-tab-title-test="some-title-1"
|
||||
>
|
||||
Some title 1
|
||||
</div>
|
||||
<div
|
||||
data-close-tab-test="some-random-id-1"
|
||||
>
|
||||
Close
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div
|
||||
data-dock-tab-content-test="some-content-1"
|
||||
>
|
||||
Some content 1
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
`;
|
||||
|
||||
exports[`DockHost, given rendered given implementations of dock tab types emerge when dock tab of one of the types is created given another dock tab is created when dock tab not being active is closed renders 1`] = `
|
||||
<body>
|
||||
<div>
|
||||
<div>
|
||||
<div
|
||||
class="flex align-center"
|
||||
>
|
||||
<div
|
||||
data-dock-tab-test="some-random-id-2"
|
||||
>
|
||||
<div
|
||||
data-dock-tab-title-test="some-title-2"
|
||||
>
|
||||
Some title 2
|
||||
</div>
|
||||
<div
|
||||
data-close-tab-test="some-random-id-2"
|
||||
>
|
||||
Close
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div
|
||||
data-dock-tab-content-test="some-content-2"
|
||||
>
|
||||
Some content 2
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
`;
|
||||
|
||||
exports[`DockHost, given rendered given implementations of dock tab types emerge when dock tab of one of the types is created given another dock tab is created when the second dock tab is clicked renders 1`] = `
|
||||
<body>
|
||||
<div>
|
||||
@ -21,22 +89,32 @@ exports[`DockHost, given rendered given implementations of dock tab types emerge
|
||||
class="flex align-center"
|
||||
>
|
||||
<div
|
||||
data-dock-tab-test="some-random-id-0"
|
||||
data-dock-tab-test="some-random-id-1"
|
||||
>
|
||||
<div
|
||||
data-dock-tab-title-test="some-title-1"
|
||||
>
|
||||
Some title 1
|
||||
</div>
|
||||
<div
|
||||
data-close-tab-test="some-random-id-1"
|
||||
>
|
||||
Close
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
data-dock-tab-test="some-random-id-1"
|
||||
data-dock-tab-test="some-random-id-2"
|
||||
>
|
||||
<div
|
||||
data-dock-tab-title-test="some-title-2"
|
||||
>
|
||||
Some title 2
|
||||
</div>
|
||||
<div
|
||||
data-close-tab-test="some-random-id-2"
|
||||
>
|
||||
Close
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
@ -59,13 +137,18 @@ exports[`DockHost, given rendered given implementations of dock tab types emerge
|
||||
class="flex align-center"
|
||||
>
|
||||
<div
|
||||
data-dock-tab-test="some-random-id-0"
|
||||
data-dock-tab-test="some-random-id-1"
|
||||
>
|
||||
<div
|
||||
data-dock-tab-title-test="some-title-1"
|
||||
>
|
||||
Some title 1
|
||||
</div>
|
||||
<div
|
||||
data-close-tab-test="some-random-id-1"
|
||||
>
|
||||
Close
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
@ -80,6 +163,19 @@ exports[`DockHost, given rendered given implementations of dock tab types emerge
|
||||
</body>
|
||||
`;
|
||||
|
||||
exports[`DockHost, given rendered given implementations of dock tab types emerge when dock tab of one of the types is created when all dock tabs are closed renders 1`] = `
|
||||
<body>
|
||||
<div>
|
||||
<div>
|
||||
<div
|
||||
class="flex align-center"
|
||||
/>
|
||||
<div />
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
`;
|
||||
|
||||
exports[`DockHost, given rendered given no implementations of dock tab types, renders 1`] = `
|
||||
<body>
|
||||
<div>
|
||||
|
||||
@ -49,7 +49,7 @@ describe("DockHost, given rendered", () => {
|
||||
registerFeature(di, dockFeature);
|
||||
|
||||
di.override(getRandomIdInjectionToken, () => {
|
||||
let index = 0;
|
||||
let index = 1;
|
||||
|
||||
return () => `some-random-id-${index++}`;
|
||||
});
|
||||
@ -112,6 +112,33 @@ describe("DockHost, given rendered", () => {
|
||||
]);
|
||||
});
|
||||
|
||||
describe("when all dock tabs are closed WIP(PASSES BUT IS CLEARLY WRONG)", () => {
|
||||
beforeEach(() => {
|
||||
act(() => {
|
||||
discover
|
||||
.getSingleElement("dock-tab", "some-random-id-1")
|
||||
.getSingleElement("close-tab")
|
||||
.click();
|
||||
});
|
||||
});
|
||||
|
||||
fit("renders", () => {
|
||||
expect(rendered.baseElement).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it("renders no tabs", () => {
|
||||
const { discovered } = discover.querySingleElement("dock-tab");
|
||||
|
||||
expect(discovered).toBeNull();
|
||||
});
|
||||
|
||||
it("renders no content", () => {
|
||||
const { discovered } = discover.querySingleElement("dock-tab-content");
|
||||
|
||||
expect(discovered).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
describe("given another dock tab is created", () => {
|
||||
beforeEach(() => {
|
||||
const dockTabType2 = di.inject(dockTabTypeInjectable2);
|
||||
@ -134,10 +161,64 @@ describe("DockHost, given rendered", () => {
|
||||
]);
|
||||
});
|
||||
|
||||
describe("when dock tab being active is closed", () => {
|
||||
beforeEach(() => {
|
||||
act(() => {
|
||||
discover
|
||||
.getSingleElement("dock-tab", "some-random-id-2")
|
||||
.getSingleElement("close-tab")
|
||||
.click();
|
||||
});
|
||||
});
|
||||
|
||||
it("renders", () => {
|
||||
expect(rendered.baseElement).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it("renders the title for the dock tab", () => {
|
||||
expect(discover.queryAllElements("dock-tab-title").attributeValues).toEqual([
|
||||
"some-title-1",
|
||||
]);
|
||||
});
|
||||
|
||||
it("renders the content of the previous dock tab", () => {
|
||||
expect(discover.queryAllElements("dock-tab-content").attributeValues).toEqual([
|
||||
"some-content-1",
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
describe("when dock tab not being active is closed", () => {
|
||||
beforeEach(() => {
|
||||
act(() => {
|
||||
discover
|
||||
.getSingleElement("dock-tab", "some-random-id-1")
|
||||
.getSingleElement("close-tab")
|
||||
.click();
|
||||
});
|
||||
});
|
||||
|
||||
it("renders", () => {
|
||||
expect(rendered.baseElement).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it("renders the title for the dock tab", () => {
|
||||
expect(discover.queryAllElements("dock-tab-title").attributeValues).toEqual([
|
||||
"some-title-2",
|
||||
]);
|
||||
});
|
||||
|
||||
it("still renders the content of the active dock tab", () => {
|
||||
expect(discover.queryAllElements("dock-tab-content").attributeValues).toEqual([
|
||||
"some-content-2",
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
describe("when the second dock tab is clicked", () => {
|
||||
beforeEach(() => {
|
||||
act(() => {
|
||||
discover.getSingleElement("dock-tab", "some-random-id-1").click();
|
||||
discover.getSingleElement("dock-tab", "some-random-id-2").click();
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@ -8,7 +8,9 @@ const activateDockTabInjectable = getInjectable({
|
||||
instantiate: (di) => {
|
||||
const activeDockTabId = di.inject(activeDockTabIdStateInjectable);
|
||||
|
||||
return action((tabId: string) => activeDockTabId.set(tabId));
|
||||
return action((tabId: string) => {
|
||||
return activeDockTabId.set(tabId);
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@ import { getInjectable } from "@ogre-tools/injectable";
|
||||
import { computed } from "mobx";
|
||||
import activeDockTabIdStateInjectable from "./active-dock-tab-id-state.injectable";
|
||||
import { pipeline } from "@ogre-tools/fp";
|
||||
import { defaults, find, first } from "lodash/fp";
|
||||
import { defaults, find } from "lodash/fp";
|
||||
import dockTabsInjectable, { DockTabViewModel } from "./dock-tabs.injectable";
|
||||
|
||||
const nullTab: DockTabViewModel = {
|
||||
@ -15,6 +15,7 @@ const nullTab: DockTabViewModel = {
|
||||
},
|
||||
|
||||
activate: () => {},
|
||||
close: () => {},
|
||||
};
|
||||
|
||||
const activeDockTabInjectable = getInjectable({
|
||||
@ -30,7 +31,6 @@ const activeDockTabInjectable = getInjectable({
|
||||
return pipeline(
|
||||
tabs,
|
||||
find((tab) => tab.id === activeDockTabId.get()),
|
||||
defaults(first(tabs)),
|
||||
defaults(nullTab),
|
||||
);
|
||||
});
|
||||
|
||||
@ -0,0 +1,32 @@
|
||||
import { getInjectable } from "@ogre-tools/injectable";
|
||||
import { DockTabInState, dockTabStateInjectable } from "./dock-tab-state.injectable";
|
||||
import activateDockTabInjectable from "./activate-dock-tab.injectable";
|
||||
import { action } from "mobx";
|
||||
|
||||
const closeDockTabInjectable = getInjectable({
|
||||
id: "close-dock-tab",
|
||||
|
||||
instantiate: (di) => {
|
||||
const dockTabState = di.inject(dockTabStateInjectable);
|
||||
const activateDockTab = di.inject(activateDockTabInjectable);
|
||||
|
||||
return action((tabToBeClosed: DockTabInState) => {
|
||||
const currentTabs = [...dockTabState.values()];
|
||||
const currentIndex = currentTabs.indexOf(tabToBeClosed);
|
||||
|
||||
const previousIndex = currentIndex - 1;
|
||||
|
||||
const tabToBeActivated = currentTabs.at(previousIndex);
|
||||
|
||||
dockTabState.delete(tabToBeClosed);
|
||||
|
||||
console.log(previousIndex, currentTabs); // TODO: Fix
|
||||
|
||||
if (tabToBeActivated) {
|
||||
activateDockTab(tabToBeActivated.id);
|
||||
}
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
export default closeDockTabInjectable;
|
||||
@ -16,9 +16,20 @@ const NonInjectedDockHost = observer(({ dockTabs, activeDockTab }: Dependencies)
|
||||
<Div>
|
||||
<Tabs>
|
||||
<Map items={dockTabs.get()}>
|
||||
{({ id, type: { TitleComponent }, activate }) => (
|
||||
{({ id, type: { TitleComponent }, activate, close }) => (
|
||||
<Tabs.Tab data-dock-tab-test={id} onClick={activate}>
|
||||
<TitleComponent />
|
||||
|
||||
<Div
|
||||
data-close-tab-test={id}
|
||||
onClick={(e: any) => {
|
||||
e.stopPropagation();
|
||||
|
||||
close();
|
||||
}}
|
||||
>
|
||||
Close
|
||||
</Div>
|
||||
</Tabs.Tab>
|
||||
)}
|
||||
</Map>
|
||||
|
||||
@ -6,11 +6,13 @@ import type { DockTabType } from "../dock-tab-type";
|
||||
import { dockTabStateInjectable } from "./dock-tab-state.injectable";
|
||||
import activateDockTabInjectable from "./activate-dock-tab.injectable";
|
||||
import dockTabTypesInjectable from "./dock-tabs-types.injectable";
|
||||
import closeDockTabInjectable from "./close-dock-tab.injectable";
|
||||
|
||||
export interface DockTabViewModel {
|
||||
id: string;
|
||||
type: DockTabType;
|
||||
activate: () => void;
|
||||
close: () => void;
|
||||
}
|
||||
|
||||
const dockTabsInjectable = getInjectable({
|
||||
@ -20,6 +22,7 @@ const dockTabsInjectable = getInjectable({
|
||||
const dockTabTypes = di.inject(dockTabTypesInjectable);
|
||||
const dockTabState = di.inject(dockTabStateInjectable);
|
||||
const activateDockTab = di.inject(activateDockTabInjectable);
|
||||
const closeDockTab = di.inject(closeDockTabInjectable);
|
||||
|
||||
return computed((): DockTabViewModel[] => {
|
||||
const dereferencedDockTabTypes = dockTabTypes.get();
|
||||
@ -38,6 +41,7 @@ const dockTabsInjectable = getInjectable({
|
||||
id: tab.id,
|
||||
type: type as DockTabType,
|
||||
activate: () => activateDockTab(tab.id),
|
||||
close: () => closeDockTab(tab),
|
||||
})),
|
||||
);
|
||||
});
|
||||
|
||||
Loading…
Reference in New Issue
Block a user