1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

simplify extension's registrations apis

Signed-off-by: Roman <ixrock@gmail.com>
This commit is contained in:
Roman 2020-10-27 16:18:03 +02:00
parent d872e073e3
commit 85087e5cc1
11 changed files with 108 additions and 173 deletions

View File

@ -3,24 +3,14 @@ import { ExampleIcon, ExamplePage } from "./page"
import React from "react" import React from "react"
export default class ExampleExtension extends LensRendererExtension { export default class ExampleExtension extends LensRendererExtension {
onActivate() { clusterPages = [
console.log('EXAMPLE EXTENSION RENDERER: ACTIVATED', this.getMeta()); {
} path: "/extension-example",
title: "Example Extension",
registerClusterPage() { components: {
return [ Page: () => <ExamplePage extension={this}/>,
{ MenuIcon: ExampleIcon,
path: "/extension-example",
title: "Example Extension",
components: {
Page: () => <ExamplePage extension={this} />,
MenuIcon: ExampleIcon,
}
} }
] }
} ]
onDeactivate() {
console.log('EXAMPLE EXTENSION RENDERER: DEACTIVATED', this.getMeta());
}
} }

View File

@ -3,23 +3,21 @@ import { MetricsFeature } from "./src/metrics-feature"
import React from "react" import React from "react"
export default class ClusterMetricsFeatureExtension extends LensRendererExtension { export default class ClusterMetricsFeatureExtension extends LensRendererExtension {
registerClusterFeatures() { clusterFeatures = [
return [ {
{ title: "Metrics Stack",
title: "Metrics Stack", components: {
components: { Description: () => {
Description: () => { return (
return ( <span>
<span>
Enable timeseries data visualization (Prometheus stack) for your cluster. Enable timeseries data visualization (Prometheus stack) for your cluster.
Install this only if you don't have existing Prometheus stack installed. Install this only if you don't have existing Prometheus stack installed.
You can see preview of manifests <a href="https://github.com/lensapp/lens/tree/master/extensions/lens-metrics/resources" target="_blank">here</a>. You can see preview of manifests <a href="https://github.com/lensapp/lens/tree/master/extensions/lens-metrics/resources" target="_blank">here</a>.
</span> </span>
) )
} }
}, },
feature: new MetricsFeature() feature: new MetricsFeature()
} }
] ]
}
} }

View File

@ -3,19 +3,13 @@ import React from "react"
import { NodeMenu, NodeMenuProps } from "./src/node-menu" import { NodeMenu, NodeMenuProps } from "./src/node-menu"
export default class NodeMenuRendererExtension extends LensRendererExtension { export default class NodeMenuRendererExtension extends LensRendererExtension {
async onActivate() { kubeObjectMenuItems = [
console.log("node-menu extension activated") {
} kind: "Node",
apiVersions: ["v1"],
registerKubeObjectMenus() { components: {
return [ MenuItem: (props: NodeMenuProps) => <NodeMenu {...props} />
{
kind: "Node",
apiVersions: ["v1"],
components: {
MenuItem: (props: NodeMenuProps) => <NodeMenu {...props} />
}
} }
] }
} ]
} }

View File

@ -4,26 +4,20 @@ import { PodLogsMenu, PodLogsMenuProps } from "./src/logs-menu"
import React from "react" import React from "react"
export default class PodMenuRendererExtension extends LensRendererExtension { export default class PodMenuRendererExtension extends LensRendererExtension {
async onActivate() { kubeObjectMenuItems = [
console.log("pod-menu extension activated") {
} kind: "Pod",
apiVersions: ["v1"],
registerKubeObjectMenus() { components: {
return [ MenuItem: (props: PodShellMenuProps) => <PodShellMenu {...props} />
{
kind: "Pod",
apiVersions: ["v1"],
components: {
MenuItem: (props: PodShellMenuProps) => <PodShellMenu {...props} />
}
},
{
kind: "Pod",
apiVersions: ["v1"],
components: {
MenuItem: (props: PodLogsMenuProps) => <PodLogsMenu {...props} />
}
} }
] },
} {
kind: "Pod",
apiVersions: ["v1"],
components: {
MenuItem: (props: PodLogsMenuProps) => <PodLogsMenu {...props} />
}
}
]
} }

View File

@ -2,22 +2,16 @@ import { LensMainExtension, windowManager } from "@k8slens/extensions";
import { supportPageURL } from "./src/support.route"; import { supportPageURL } from "./src/support.route";
export default class SupportPageMainExtension extends LensMainExtension { export default class SupportPageMainExtension extends LensMainExtension {
async onActivate() { appMenus = [
console.log("support page extension activated") {
} parentId: "help",
label: "Support",
registerAppMenus() { click() {
return [ windowManager.navigate({
{ channel: "menu:navigate", // fixme: use windowManager.ensureMainWindow from Tray's PR
parentId: "help", url: supportPageURL(),
label: "Support", });
click() {
windowManager.navigate({
channel: "menu:navigate", // fixme: use windowManager.ensureMainWindow from Tray's PR
url: supportPageURL(),
});
}
} }
] }
} ]
} }

View File

@ -4,36 +4,28 @@ import { supportPageRoute, supportPageURL } from "./src/support.route";
import { Support } from "./src/support"; import { Support } from "./src/support";
export default class SupportPageRendererExtension extends LensRendererExtension { export default class SupportPageRendererExtension extends LensRendererExtension {
async onActivate() { globalPages = [
console.log("support page extension activated") {
} ...supportPageRoute,
url: supportPageURL(),
registerGlobalPages() { hideInMenu: true,
return [ components: {
{ Page: Support,
...supportPageRoute,
url: supportPageURL(),
hideInMenu: true,
components: {
Page: Support,
}
} }
] }
} ]
registerStatusBarItems() { statusBarItems = [
return [ {
{ item: (
item: ( <div
<div className="flex align-center gaps hover-highlight"
className="flex align-center gaps hover-highlight" onClick={() => Navigation.navigate(supportPageURL())}
onClick={() => Navigation.navigate(supportPageURL())} >
> <Component.Icon material="help_outline" small/>
<Component.Icon material="help_outline" small /> <span>Support</span>
<span>Support</span> </div>
</div> )
) }
} ]
]
}
} }

View File

@ -5,25 +5,19 @@ import { tracker } from "./src/tracker"
import React from "react" import React from "react"
export default class TelemetryRendererExtension extends LensRendererExtension { export default class TelemetryRendererExtension extends LensRendererExtension {
appPreferences = [
{
title: "Telemetry & Usage Tracking",
components: {
Hint: () => <TelemetryPreferenceHint/>,
Input: () => <TelemetryPreferenceInput telemetry={telemetryPreferencesStore}/>
}
}
];
async onActivate() { async onActivate() {
console.log("telemetry extension activated") console.log("telemetry extension activated")
tracker.start() tracker.start()
await telemetryPreferencesStore.loadExtension(this) await telemetryPreferencesStore.loadExtension(this)
} }
registerAppPreferences() {
return [
{
title: "Telemetry & Usage Tracking",
components: {
Hint: () => <TelemetryPreferenceHint />,
Input: () => <TelemetryPreferenceInput telemetry={telemetryPreferencesStore} />
}
}
]
}
onDeactivate() {
console.log("telemetry extension deactivated")
}
} }

View File

@ -37,25 +37,25 @@ export class ExtensionLoader {
loadOnMain() { loadOnMain() {
logger.info('[EXTENSIONS-LOADER]: load on main') logger.info('[EXTENSIONS-LOADER]: load on main')
this.autoloadExtensions((extension: LensMainExtension) => { this.autoloadExtensions((extension: LensMainExtension) => {
extension.register(menuRegistry, extension.registerAppMenus()) extension.registerTo(menuRegistry, extension.appMenus)
}) })
} }
loadOnClusterManagerRenderer() { loadOnClusterManagerRenderer() {
logger.info('[EXTENSIONS-LOADER]: load on main renderer (cluster manager)') logger.info('[EXTENSIONS-LOADER]: load on main renderer (cluster manager)')
this.autoloadExtensions((extension: LensRendererExtension) => { this.autoloadExtensions((extension: LensRendererExtension) => {
extension.register(globalPageRegistry, extension.registerGlobalPages()) extension.registerTo(globalPageRegistry, extension.globalPages)
extension.register(appPreferenceRegistry, extension.registerAppPreferences()) extension.registerTo(appPreferenceRegistry, extension.appPreferences)
extension.register(clusterFeatureRegistry, extension.registerClusterFeatures()) extension.registerTo(clusterFeatureRegistry, extension.clusterFeatures)
extension.register(statusBarRegistry, extension.registerStatusBarItems()) extension.registerTo(statusBarRegistry, extension.statusBarItems)
}) })
} }
loadOnClusterRenderer() { loadOnClusterRenderer() {
logger.info('[EXTENSIONS-LOADER]: load on cluster renderer (dashboard)') logger.info('[EXTENSIONS-LOADER]: load on cluster renderer (dashboard)')
this.autoloadExtensions((extension: LensRendererExtension) => { this.autoloadExtensions((extension: LensRendererExtension) => {
extension.register(clusterPageRegistry, extension.registerClusterPages()) extension.registerTo(clusterPageRegistry, extension.clusterPages)
extension.register(kubeObjectMenuRegistry, extension.registerKubeObjectMenus()) extension.registerTo(kubeObjectMenuRegistry, extension.kubeObjectMenuItems)
}) })
} }

View File

@ -78,8 +78,8 @@ export class LensExtension implements ExtensionModel {
// mock // mock
} }
register<T = any>(registry: BaseRegistry<T>, registryItems: T[]) { registerTo<T = any>(registry: BaseRegistry<T>, items: T[] = []) {
const disposers = registryItems.map(item => registry.add(item)); const disposers = items.map(item => registry.add(item));
this.disposers.push(...disposers); this.disposers.push(...disposers);
return () => { return () => {
this.disposers = this.disposers.filter(disposer => !disposers.includes(disposer)) this.disposers = this.disposers.filter(disposer => !disposers.includes(disposer))

View File

@ -1,12 +1,7 @@
import { LensExtension } from "./lens-extension"
import type { MenuRegistration } from "./registries/menu-registry"; import type { MenuRegistration } from "./registries/menu-registry";
import { observable } from "mobx";
import { LensExtension } from "./lens-extension"
export class LensMainExtension extends LensExtension { export class LensMainExtension extends LensExtension {
registerAppMenus(): MenuRegistration[] { @observable.shallow appMenus: MenuRegistration[] = []
return []
}
registerPrometheusProviders(): any[] {
return []
}
} }

View File

@ -1,28 +1,12 @@
import { LensExtension } from "./lens-extension"
import type { AppPreferenceRegistration, ClusterFeatureRegistration, KubeObjectMenuRegistration, PageRegistration, StatusBarRegistration } from "./registries" import type { AppPreferenceRegistration, ClusterFeatureRegistration, KubeObjectMenuRegistration, PageRegistration, StatusBarRegistration } from "./registries"
import { observable } from "mobx";
import { LensExtension } from "./lens-extension"
export class LensRendererExtension extends LensExtension { export class LensRendererExtension extends LensExtension {
registerGlobalPages(): PageRegistration[] { @observable.shallow globalPages: PageRegistration[] = []
return [] @observable.shallow clusterPages: PageRegistration[] = []
} @observable.shallow appPreferences: AppPreferenceRegistration[] = []
@observable.shallow clusterFeatures: ClusterFeatureRegistration[] = []
registerClusterPages(): PageRegistration[] { @observable.shallow statusBarItems: StatusBarRegistration[] = []
return [] @observable.shallow kubeObjectMenuItems: KubeObjectMenuRegistration[] = []
}
registerAppPreferences(): AppPreferenceRegistration[] {
return []
}
registerClusterFeatures(): ClusterFeatureRegistration[] {
return []
}
registerStatusBarItems(): StatusBarRegistration[] {
return []
}
registerKubeObjectMenus(): KubeObjectMenuRegistration[] {
return []
}
} }