diff --git a/packages/business-features/dock/package.json b/packages/business-features/dock/package.json
index cce4c43de3..b9c24b9b48 100644
--- a/packages/business-features/dock/package.json
+++ b/packages/business-features/dock/package.json
@@ -32,9 +32,13 @@
"peerDependencies": {
"@k8slens/feature-core": "^6.5.0-alpha.0",
"@k8slens/ui-components": "^1.0.0-alpha.0",
+ "@ogre-tools/fp": "^15.1.2",
"@ogre-tools/injectable": "^15.1.2",
"@ogre-tools/injectable-extension-for-auto-registration": "^15.1.2",
- "@ogre-tools/fp": "^15.1.2",
+ "@ogre-tools/injectable-extension-for-mobx": "^15.1.2",
+ "@ogre-tools/injectable-react": "^15.1.2",
+ "mobx": "^6.8.0",
+ "mobx-react": "^7.6.0",
"lodash": "^4.17.21",
"react": "^17"
},
diff --git a/packages/business-features/dock/src/__snapshots__/dock.test.tsx.snap b/packages/business-features/dock/src/__snapshots__/dock.test.tsx.snap
index 49ba3f6533..f129bf8814 100644
--- a/packages/business-features/dock/src/__snapshots__/dock.test.tsx.snap
+++ b/packages/business-features/dock/src/__snapshots__/dock.test.tsx.snap
@@ -1,6 +1,6 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
-exports[`dock when rendered renders 1`] = `
+exports[`DockHost, given rendered given implementations of dock tabs emerge renders 1`] = `
-
-
-
-
-
- Some other title
-
+ Some content
+
@@ -61,3 +44,30 @@ exports[`dock when rendered renders 1`] = `
`;
+
+exports[`DockHost, given rendered given no implementations of dock tabs, renders 1`] = `
+
+
+
+
+
+
+
+
+ Some content
+
+
+
+
+`;
diff --git a/packages/business-features/dock/src/dock-tab.ts b/packages/business-features/dock/src/dock-tab.ts
new file mode 100644
index 0000000000..f3dda87fff
--- /dev/null
+++ b/packages/business-features/dock/src/dock-tab.ts
@@ -0,0 +1,11 @@
+import type React from "react";
+import { getInjectionToken } from "@ogre-tools/injectable";
+
+export type DockTab = {
+ id: string;
+ Component: React.ComponentType;
+};
+
+export const dockTabInjectionToken = getInjectionToken({
+ id: "dock-tab-injection-token",
+});
diff --git a/packages/business-features/dock/src/dock.test.tsx b/packages/business-features/dock/src/dock.test.tsx
index 619acfdf14..0c724e6d4f 100644
--- a/packages/business-features/dock/src/dock.test.tsx
+++ b/packages/business-features/dock/src/dock.test.tsx
@@ -1,29 +1,63 @@
-import { createContainer, DiContainer } from "@ogre-tools/injectable";
+import { runInAction } from "mobx";
+import { createContainer, DiContainer, getInjectable } from "@ogre-tools/injectable";
+import { registerMobX } from "@ogre-tools/injectable-extension-for-mobx";
+import { registerInjectableReact } from "@ogre-tools/injectable-react";
import { renderFor } from "@k8slens/test-utils";
import { DockHost } from "./dock/dock-host";
import React from "react";
import type { RenderResult } from "@testing-library/react";
+import { dockTabInjectionToken } from "./dock-tab";
+import { Discover, discoverFor } from "@k8slens/react-testing-library-discovery";
+import { registerFeature } from "@k8slens/feature-core";
+import { dockFeature } from "./feature";
-describe("dock", () => {
+describe("DockHost, given rendered", () => {
let di: DiContainer;
+ let rendered: RenderResult;
+ let discover: Discover;
beforeEach(() => {
di = createContainer("some-container");
+ registerMobX(di);
+ registerInjectableReact(di);
+ runInAction(() => {
+ registerFeature(di, dockFeature);
+ });
- // registerFeature(di, dockFeature);
+ const render = renderFor(di);
+
+ rendered = render();
+ discover = discoverFor(() => rendered);
});
- describe("when rendered", () => {
- let rendered: RenderResult;
+ it("given no implementations of dock tabs, renders", () => {
+ expect(rendered.baseElement).toMatchSnapshot();
+ });
+ describe("given implementations of dock tabs emerge", () => {
beforeEach(() => {
- const render = renderFor(di);
+ const dockInjectable = getInjectable({
+ id: "some-dock-tab",
- rendered = render();
+ instantiate: () => ({
+ id: "some-dock-tab",
+ Component: () => Some content
,
+ }),
+
+ injectionToken: dockTabInjectionToken,
+ });
+
+ runInAction(() => {
+ di.register(dockInjectable);
+ });
});
it("renders", () => {
expect(rendered.baseElement).toMatchSnapshot();
});
+
+ it("renders the dock tab", () => {
+ discover.getSingleElement("some-dock-tab");
+ });
});
});
diff --git a/packages/business-features/dock/src/dock/dock-host.tsx b/packages/business-features/dock/src/dock/dock-host.tsx
index 477efd47f6..15dd240832 100644
--- a/packages/business-features/dock/src/dock/dock-host.tsx
+++ b/packages/business-features/dock/src/dock/dock-host.tsx
@@ -1,21 +1,24 @@
+import type { IComputedValue } from "mobx";
+import { observer } from "mobx-react";
+import { withInjectables } from "@ogre-tools/injectable-react";
import React from "react";
import { Tab } from "./tab";
-import { Div, Span } from "@k8slens/ui-components";
+import { Div, Map } from "@k8slens/ui-components";
+import dockTabsInjectable from "./dock-tabs.injectable";
+import type { DockTab } from "../dock-tab";
-export const DockHost = () => (
+const NonInjectedDockHost = observer(({ dockTabs }: Dependencies) => (
-
-
- Some title
-
-
-
-
-
- Some other title
-
-
+
(
Some content
+));
+
+interface Dependencies {
+ dockTabs: IComputedValue;
+}
+
+export const DockHost = withInjectables(
+ NonInjectedDockHost,
+
+ {
+ getProps: (di, props) => ({
+ dockTabs: di.inject(dockTabsInjectable),
+ ...props,
+ }),
+ },
);
diff --git a/packages/business-features/dock/src/dock/dock-tabs.injectable.ts b/packages/business-features/dock/src/dock/dock-tabs.injectable.ts
new file mode 100644
index 0000000000..c7cc7eb939
--- /dev/null
+++ b/packages/business-features/dock/src/dock/dock-tabs.injectable.ts
@@ -0,0 +1,15 @@
+import { getInjectable } from "@ogre-tools/injectable";
+import { computedInjectManyInjectable } from "@ogre-tools/injectable-extension-for-mobx";
+import { dockTabInjectionToken } from "../dock-tab";
+
+const dockTabsInjectable = getInjectable({
+ id: "dock-tabs",
+
+ instantiate: (di) => {
+ const computedInjectMany = di.inject(computedInjectManyInjectable);
+
+ return computedInjectMany(dockTabInjectionToken);
+ },
+});
+
+export default dockTabsInjectable;
diff --git a/packages/open-lens/src/renderer/index.ts b/packages/open-lens/src/renderer/index.ts
index 64c5810574..6a35217eb7 100644
--- a/packages/open-lens/src/renderer/index.ts
+++ b/packages/open-lens/src/renderer/index.ts
@@ -4,13 +4,13 @@ import {
rendererExtensionApi as Renderer,
commonExtensionApi as Common,
registerLensCore,
- metricsFeature
+ metricsFeature,
} from "@k8slens/core/renderer";
import { autoRegister } from "@ogre-tools/injectable-extension-for-auto-registration";
import { registerFeature } from "@k8slens/feature-core";
import {
applicationFeature,
- startApplicationInjectionToken
+ startApplicationInjectionToken,
} from "@k8slens/application";
import { createContainer } from "@ogre-tools/injectable";
import { registerMobX } from "@ogre-tools/injectable-extension-for-mobx";
@@ -18,6 +18,7 @@ import { registerInjectableReact } from "@ogre-tools/injectable-react";
import { messagingFeatureForRenderer } from "@k8slens/messaging-for-renderer";
import { keyboardShortcutsFeature } from "@k8slens/keyboard-shortcuts";
import { reactApplicationFeature } from "@k8slens/react-application";
+import { dockFeature } from "@k8slens/dock";
const environment = "renderer";
@@ -36,7 +37,8 @@ runInAction(() => {
messagingFeatureForRenderer,
keyboardShortcutsFeature,
reactApplicationFeature,
- metricsFeature
+ metricsFeature,
+ dockFeature,
);
autoRegister({