mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
add common app routes to the protocol renderer router
Signed-off-by: Sebastian Malton <sebastian@malton.name> - add the protocol handler links to the docs Signed-off-by: Sebastian Malton <sebastian@malton.name> - add svg loaded to webpack Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
parent
7d14ba5e48
commit
f06ba27d97
@ -2,7 +2,7 @@
|
||||
|
||||
Add clusters by clicking the **Add Cluster** button in the left-side menu.
|
||||
|
||||
1. Click the **Add Cluster** button (indicated with a '+' icon).
|
||||
1. Click the **Add Cluster** button (indicated with a '+' icon). Or [click here](lens://app/cluster).
|
||||
2. Enter the path to your kubeconfig file. You'll need to have a kubeconfig file for the cluster you want to add. You can either browse for the path from the file system or or enter it directly.
|
||||
|
||||
Selected [cluster contexts](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/#context) are added as a separate item in the left-side cluster menu to allow you to operate easily on multiple clusters and/or contexts.
|
||||
|
||||
@ -1,6 +1,9 @@
|
||||
# Lens Extension API
|
||||
|
||||
Customize and enhance the Lens experience with the Lens Extension API. Use the extension API to create menus or page content. The same extension API was used to create many of Lens's core features.
|
||||
Customize and enhance the Lens experience with the Lens Extension API.
|
||||
Use the extension API to create menus or page content.
|
||||
The same extension API was used to create many of Lens's core features.
|
||||
To install your first extension you should goto the [extension page](lens://app/extensions) in lens.
|
||||
|
||||
This documentation describes:
|
||||
|
||||
|
||||
@ -72,5 +72,6 @@ To stay current with the Lens features, you can review the [release notes](https
|
||||
|
||||
## Next Steps
|
||||
|
||||
- [Launch Lens](lens://app/landing)
|
||||
- [Add clusters](../clusters/adding-clusters.md)
|
||||
- [Watch introductory videos](./introductory-videos.md)
|
||||
|
||||
@ -1,12 +1,11 @@
|
||||
# Preferences
|
||||
|
||||
|
||||
## Color Themes
|
||||
|
||||
The Color Themes option in Lens preferences lets you set the colors in the Lens user interface to suit your liking.
|
||||
|
||||
1. Go to **File** > **Preferences** (**Lens** > **Preferences** on Mac).
|
||||
2. Select your preferred theme from the **Color Theme** dropdown.
|
||||
1. Go to **File** > **Preferences** (**Lens** > **Preferences** on Mac). Or follow [this link](lens://app/preferences?highlight=appearance).
|
||||
2. Select your preferred theme from the **Color Theme** dropdown.
|
||||

|
||||
|
||||
|
||||
@ -19,10 +18,9 @@ Lens collects telemetry data, which is used to help us understand how to improve
|
||||
|
||||
If you don't wish to send usage data to Mirantis, you can disable the "Telemetry & Usage Tracking" in the Lens preferences.
|
||||
|
||||
1. Go to **File** > **Preferences** (**Lens** > **Preferences** on Mac).
|
||||
1. Go to **File** > **Preferences** (**Lens** > **Preferences** on Mac). Or follow [this link](lens://app/preferences?highlight=telemetry-tracking).
|
||||
2. Scroll down to **Telemetry & Usage Tracking**
|
||||
3. Uncheck **Allow Telemetry & Usage Tracking**.
|
||||
3. Uncheck **Allow Telemetry & Usage Tracking**.
|
||||
|
||||
This will silence all telemetry events from Lens going forward. Telemetry information may have been collected and sent up until the point when you disable this setting.
|
||||

|
||||
|
||||
|
||||
@ -8,6 +8,7 @@ export default class TelemetryRendererExtension extends LensRendererExtension {
|
||||
appPreferences = [
|
||||
{
|
||||
title: "Telemetry & Usage Tracking",
|
||||
id: "telemetry-tracking",
|
||||
components: {
|
||||
Hint: () => <TelemetryPreferenceHint/>,
|
||||
Input: () => <TelemetryPreferenceInput telemetry={telemetryPreferencesStore}/>
|
||||
|
||||
@ -184,10 +184,12 @@ export abstract class LensProtocolRouter extends Singleton {
|
||||
* @param pathSchema the URI path schema to match against for this handler
|
||||
* @param handler a function that will be called if a protocol path matches
|
||||
*/
|
||||
public addInternalHandler(urlSchema: string, handler: RouteHandler): void {
|
||||
public addInternalHandler(urlSchema: string, handler: RouteHandler): this {
|
||||
pathToRegexp(urlSchema); // verify now that the schema is valid
|
||||
logger.info(`${LensProtocolRouter.LoggingPrefix}: internal registering ${urlSchema}`);
|
||||
this.internalRoutes.set(urlSchema, handler);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -3,14 +3,20 @@ import { compile } from "path-to-regexp";
|
||||
export interface IURLParams<P extends object = {}, Q extends object = {}> {
|
||||
params?: P;
|
||||
query?: Q;
|
||||
fragment?: string;
|
||||
}
|
||||
|
||||
export function buildURL<P extends object = {}, Q extends object = {}>(path: string | any) {
|
||||
const pathBuilder = compile(String(path));
|
||||
|
||||
return function ({ params, query }: IURLParams<P, Q> = {}) {
|
||||
return function ({ params, query, fragment }: IURLParams<P, Q> = {}): string {
|
||||
const queryParams = query ? new URLSearchParams(Object.entries(query)).toString() : "";
|
||||
const parts = [
|
||||
pathBuilder(params),
|
||||
queryParams && `?${queryParams}`,
|
||||
fragment && `#${fragment}`,
|
||||
];
|
||||
|
||||
return pathBuilder(params) + (queryParams ? `?${queryParams}` : "");
|
||||
return parts.filter(Boolean).join("");
|
||||
};
|
||||
}
|
||||
|
||||
@ -8,10 +8,21 @@ export interface AppPreferenceComponents {
|
||||
|
||||
export interface AppPreferenceRegistration {
|
||||
title: string;
|
||||
id?: string;
|
||||
components: AppPreferenceComponents;
|
||||
}
|
||||
|
||||
export class AppPreferenceRegistry extends BaseRegistry<AppPreferenceRegistration> {
|
||||
export interface RegisteredAppPreference extends AppPreferenceRegistration {
|
||||
id: string;
|
||||
}
|
||||
|
||||
export class AppPreferenceRegistry extends BaseRegistry<AppPreferenceRegistration, RegisteredAppPreference> {
|
||||
getRegisteredItem(item: AppPreferenceRegistration): RegisteredAppPreference {
|
||||
return {
|
||||
id: item.id || item.title.toLowerCase().replaceAll(/[^0-9a-zA-Z]+/, "-"),
|
||||
...item,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
export const appPreferenceRegistry = new AppPreferenceRegistry();
|
||||
|
||||
@ -133,10 +133,10 @@ export class Preferences extends React.Component {
|
||||
<section>
|
||||
<h1>Extensions</h1>
|
||||
</section>
|
||||
{appPreferenceRegistry.getItems().map(({ title, components: { Hint, Input } }, index) => {
|
||||
{appPreferenceRegistry.getItems().map(({ title, id, components: { Hint, Input } }, index) => {
|
||||
return (
|
||||
<section key={index} id={title}>
|
||||
<h2>{title}</h2>
|
||||
<h2 id={id}>{title}</h2>
|
||||
<Input/>
|
||||
<small className="hint">
|
||||
<Hint/>
|
||||
|
||||
@ -12,7 +12,7 @@ import { ConfirmDialog } from "./components/confirm-dialog";
|
||||
import { extensionLoader } from "../extensions/extension-loader";
|
||||
import { broadcastMessage } from "../common/ipc";
|
||||
import { CommandContainer } from "./components/command-palette/command-container";
|
||||
import { LensProtocolRouterRenderer } from "./protocol-handler/router";
|
||||
import { LensProtocolRouterRenderer, bindProtocolAddRouteHandlers } from "./protocol-handler";
|
||||
import { registerIpcHandlers } from "./ipc";
|
||||
import { ipcRenderer } from "electron";
|
||||
|
||||
@ -21,6 +21,7 @@ export class LensApp extends React.Component {
|
||||
static async init() {
|
||||
extensionLoader.loadOnClusterManagerRenderer();
|
||||
LensProtocolRouterRenderer.getInstance<LensProtocolRouterRenderer>().init();
|
||||
bindProtocolAddRouteHandlers();
|
||||
window.addEventListener("offline", () => {
|
||||
broadcastMessage("network:offline");
|
||||
});
|
||||
|
||||
@ -1,10 +1,8 @@
|
||||
// Navigation (renderer)
|
||||
|
||||
import { bindEvents } from "./events";
|
||||
import { bindProtocolHandlers } from "./protocol-handlers";
|
||||
|
||||
export * from "./history";
|
||||
export * from "./helpers";
|
||||
|
||||
bindEvents();
|
||||
bindProtocolHandlers();
|
||||
|
||||
@ -1,10 +0,0 @@
|
||||
import { LensProtocolRouterRenderer } from "../protocol-handler/router";
|
||||
import { navigate } from "./helpers";
|
||||
|
||||
export function bindProtocolHandlers() {
|
||||
const lprr = LensProtocolRouterRenderer.getInstance<LensProtocolRouterRenderer>();
|
||||
|
||||
lprr.addInternalHandler("/preferences", () => {
|
||||
navigate("/preferences");
|
||||
});
|
||||
}
|
||||
34
src/renderer/protocol-handler/app-handlers.ts
Normal file
34
src/renderer/protocol-handler/app-handlers.ts
Normal file
@ -0,0 +1,34 @@
|
||||
import { addClusterURL } from "../components/+add-cluster";
|
||||
import { clusterSettingsURL } from "../components/+cluster-settings";
|
||||
import { extensionsURL } from "../components/+extensions";
|
||||
import { landingURL } from "../components/+landing-page";
|
||||
import { preferencesURL } from "../components/+preferences";
|
||||
import { clusterViewURL } from "../components/cluster-manager/cluster-view.route";
|
||||
import { LensProtocolRouterRenderer } from "./router";
|
||||
import { navigate } from "../navigation/helpers";
|
||||
|
||||
export function bindProtocolAddRouteHandlers() {
|
||||
LensProtocolRouterRenderer
|
||||
.getInstance<LensProtocolRouterRenderer>()
|
||||
.addInternalHandler("/preferences", ({ search: { highlight }}) => {
|
||||
navigate(preferencesURL({ fragment: highlight }));
|
||||
})
|
||||
.addInternalHandler("/landing", () => {
|
||||
navigate(landingURL());
|
||||
})
|
||||
.addInternalHandler("/", () => {
|
||||
navigate(landingURL());
|
||||
})
|
||||
.addInternalHandler("/cluster", () => {
|
||||
navigate(addClusterURL());
|
||||
})
|
||||
.addInternalHandler("/cluster/:clusterId", ({ pathname: { clusterId } }) => {
|
||||
navigate(clusterViewURL({ params: { clusterId } }));
|
||||
})
|
||||
.addInternalHandler("/cluster/:clusterId/settings", ({ pathname: { clusterId } }) => {
|
||||
navigate(clusterSettingsURL({ params: { clusterId } }));
|
||||
})
|
||||
.addInternalHandler("/extensions", () => {
|
||||
navigate(extensionsURL());
|
||||
});
|
||||
}
|
||||
@ -1 +1,2 @@
|
||||
export * from "./router.ts";
|
||||
export * from "./router";
|
||||
export * from "./app-handlers";
|
||||
|
||||
@ -53,6 +53,16 @@ export default function generateExtensionTypes(): webpack.Configuration {
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
test: /\.(jpg|png|svg|map|ico)$/,
|
||||
use: {
|
||||
loader: "file-loader",
|
||||
options: {
|
||||
name: "images/[name]-[hash:6].[ext]",
|
||||
esModule: false, // handle media imports in <template>, e.g <img src="../assets/logo.svg"> (react)
|
||||
}
|
||||
}
|
||||
},
|
||||
// for import scss files
|
||||
{
|
||||
test: /\.s?css$/,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user