mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Introduce competition for terminal preference tab
Co-authored-by: Mikko Aspiala <mikko.aspiala@gmail.com> Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
This commit is contained in:
parent
aa90e8e7d2
commit
943bc6db77
@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
|
import { preferenceItemInjectionToken } from "../../preference-item-injection-token";
|
||||||
|
import { CopyPasteFromTerminal } from "./copy-paste-from-terminal";
|
||||||
|
|
||||||
|
const copyPasteFromTerminalPreferenceItemInjectable = getInjectable({
|
||||||
|
id: "copy-paste-from-terminal-preference-item",
|
||||||
|
|
||||||
|
instantiate: () => ({
|
||||||
|
kind: "item" as const,
|
||||||
|
id: "copy-paste-from-terminal-preference-item",
|
||||||
|
parentId: "terminal-page",
|
||||||
|
orderNumber: 20,
|
||||||
|
Component: CopyPasteFromTerminal,
|
||||||
|
}),
|
||||||
|
|
||||||
|
injectionToken: preferenceItemInjectionToken,
|
||||||
|
});
|
||||||
|
|
||||||
|
export default copyPasteFromTerminalPreferenceItemInjectable;
|
||||||
@ -0,0 +1,42 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import React from "react";
|
||||||
|
import { SubTitle } from "../../../../../../renderer/components/layout/sub-title";
|
||||||
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||||
|
import type { UserStore } from "../../../../../../common/user-store";
|
||||||
|
import userStoreInjectable from "../../../../../../common/user-store/user-store.injectable";
|
||||||
|
import { observer } from "mobx-react";
|
||||||
|
import { Switch } from "../../../../../../renderer/components/switch";
|
||||||
|
|
||||||
|
interface Dependencies {
|
||||||
|
userStore: UserStore;
|
||||||
|
}
|
||||||
|
|
||||||
|
const NonInjectedCopyPasteFromTerminal = observer(
|
||||||
|
({ userStore }: Dependencies) => {
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<SubTitle title="Terminal copy & paste" />
|
||||||
|
<Switch
|
||||||
|
checked={userStore.terminalCopyOnSelect}
|
||||||
|
onChange={() => userStore.terminalCopyOnSelect = !userStore.terminalCopyOnSelect}
|
||||||
|
>
|
||||||
|
Copy on select and paste on right-click
|
||||||
|
</Switch>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
export const CopyPasteFromTerminal = withInjectables<Dependencies>(
|
||||||
|
NonInjectedCopyPasteFromTerminal,
|
||||||
|
|
||||||
|
{
|
||||||
|
getProps: (di) => ({
|
||||||
|
userStore: di.inject(userStoreInjectable),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
);
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
|
import { preferenceItemInjectionToken } from "../../preference-item-injection-token";
|
||||||
|
import { TerminalFontFamily } from "./terminal-font-family";
|
||||||
|
|
||||||
|
const terminalFontFamilyPreferenceItemInjectable = getInjectable({
|
||||||
|
id: "terminal-font-family-preference-item",
|
||||||
|
|
||||||
|
instantiate: () => ({
|
||||||
|
kind: "item" as const,
|
||||||
|
id: "terminal-font-family-preference-item",
|
||||||
|
parentId: "terminal-page",
|
||||||
|
orderNumber: 40,
|
||||||
|
Component: TerminalFontFamily,
|
||||||
|
}),
|
||||||
|
|
||||||
|
injectionToken: preferenceItemInjectionToken,
|
||||||
|
});
|
||||||
|
|
||||||
|
export default terminalFontFamilyPreferenceItemInjectable;
|
||||||
@ -0,0 +1,70 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import React from "react";
|
||||||
|
import { SubTitle } from "../../../../../../renderer/components/layout/sub-title";
|
||||||
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||||
|
import type { UserStore } from "../../../../../../common/user-store";
|
||||||
|
import userStoreInjectable from "../../../../../../common/user-store/user-store.injectable";
|
||||||
|
import { observer } from "mobx-react";
|
||||||
|
import type { SelectOption } from "../../../../../../renderer/components/select";
|
||||||
|
import { Select } from "../../../../../../renderer/components/select";
|
||||||
|
import type { Logger } from "../../../../../../common/logger";
|
||||||
|
import { action } from "mobx";
|
||||||
|
import loggerInjectable from "../../../../../../common/logger.injectable";
|
||||||
|
|
||||||
|
interface Dependencies {
|
||||||
|
userStore: UserStore;
|
||||||
|
logger: Logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
const NonInjectedTerminalFontFamily = observer(
|
||||||
|
({ userStore, logger }: Dependencies) => {
|
||||||
|
|
||||||
|
// fonts must be declared in `fonts.scss` and at `template.html` (if early-preloading required)
|
||||||
|
const supportedCustomFonts: SelectOption<string>[] = [
|
||||||
|
"RobotoMono", "Anonymous Pro", "IBM Plex Mono", "JetBrains Mono", "Red Hat Mono",
|
||||||
|
"Source Code Pro", "Space Mono", "Ubuntu Mono",
|
||||||
|
].map(customFont => {
|
||||||
|
const { fontFamily, fontSize } = userStore.terminalConfig;
|
||||||
|
|
||||||
|
return {
|
||||||
|
label: <span style={{ fontFamily: customFont, fontSize }}>{customFont}</span>,
|
||||||
|
value: customFont,
|
||||||
|
isSelected: fontFamily === customFont,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
const onFontFamilyChange = action(({ value: fontFamily }: SelectOption<string>) => {
|
||||||
|
logger.info(`setting terminal font to ${fontFamily}`);
|
||||||
|
|
||||||
|
userStore.terminalConfig.fontFamily = fontFamily; // save to external storage
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section>
|
||||||
|
<SubTitle title="Font family" />
|
||||||
|
<Select
|
||||||
|
themeName="lens"
|
||||||
|
controlShouldRenderValue
|
||||||
|
value={userStore.terminalConfig.fontFamily}
|
||||||
|
options={supportedCustomFonts}
|
||||||
|
onChange={onFontFamilyChange as any}
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
export const TerminalFontFamily = withInjectables<Dependencies>(
|
||||||
|
NonInjectedTerminalFontFamily,
|
||||||
|
|
||||||
|
{
|
||||||
|
getProps: (di) => ({
|
||||||
|
userStore: di.inject(userStoreInjectable),
|
||||||
|
logger: di.inject(loggerInjectable),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
);
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
|
import { preferenceItemInjectionToken } from "../../preference-item-injection-token";
|
||||||
|
import { TerminalFontSize } from "./terminal-font-size";
|
||||||
|
|
||||||
|
const terminalFontSizePreferenceItemInjectable = getInjectable({
|
||||||
|
id: "terminal-font-size-preference-item",
|
||||||
|
|
||||||
|
instantiate: () => ({
|
||||||
|
kind: "item" as const,
|
||||||
|
id: "terminal-font-size-preference-item",
|
||||||
|
parentId: "terminal-page",
|
||||||
|
orderNumber: 30,
|
||||||
|
Component: TerminalFontSize,
|
||||||
|
}),
|
||||||
|
|
||||||
|
injectionToken: preferenceItemInjectionToken,
|
||||||
|
});
|
||||||
|
|
||||||
|
export default terminalFontSizePreferenceItemInjectable;
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import React from "react";
|
||||||
|
import { SubTitle } from "../../../../../../renderer/components/layout/sub-title";
|
||||||
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||||
|
import type { UserStore } from "../../../../../../common/user-store";
|
||||||
|
import userStoreInjectable from "../../../../../../common/user-store/user-store.injectable";
|
||||||
|
import { observer } from "mobx-react";
|
||||||
|
import { Input } from "../../../../../../renderer/components/input";
|
||||||
|
|
||||||
|
interface Dependencies {
|
||||||
|
userStore: UserStore;
|
||||||
|
}
|
||||||
|
|
||||||
|
const NonInjectedTerminalFontSize = observer(
|
||||||
|
({ userStore }: Dependencies) => {
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<SubTitle title="Font size" />
|
||||||
|
<Input
|
||||||
|
theme="round-black"
|
||||||
|
type="number"
|
||||||
|
min={10}
|
||||||
|
max={50}
|
||||||
|
defaultValue={userStore.terminalConfig.fontSize.toString()}
|
||||||
|
onChange={(value) => userStore.terminalConfig.fontSize = Number(value)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
export const TerminalFontSize = withInjectables<Dependencies>(
|
||||||
|
NonInjectedTerminalFontSize,
|
||||||
|
|
||||||
|
{
|
||||||
|
getProps: (di) => ({
|
||||||
|
userStore: di.inject(userStoreInjectable),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
);
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
|
import { preferenceItemInjectionToken } from "../preference-item-injection-token";
|
||||||
|
import { TerminalPage } from "./terminal-page";
|
||||||
|
import { HorizontalLine } from "../../../../../renderer/components/+preferences/horizontal-line/horizontal-line";
|
||||||
|
|
||||||
|
const terminalPagePreferenceItemInjectable = getInjectable({
|
||||||
|
id: "terminal-preference-page",
|
||||||
|
|
||||||
|
instantiate: () => ({
|
||||||
|
kind: "page" as const,
|
||||||
|
id: "terminal-page",
|
||||||
|
parentId: "terminal-tab",
|
||||||
|
orderNumber: 0,
|
||||||
|
Component: TerminalPage,
|
||||||
|
childrenSeparator: HorizontalLine,
|
||||||
|
}),
|
||||||
|
|
||||||
|
injectionToken: preferenceItemInjectionToken,
|
||||||
|
});
|
||||||
|
|
||||||
|
export default terminalPagePreferenceItemInjectable;
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import React from "react";
|
||||||
|
import type { PreferenceItemComponent } from "../preference-item-injection-token";
|
||||||
|
|
||||||
|
export const TerminalPage: PreferenceItemComponent = ({ children }) => (
|
||||||
|
<div>
|
||||||
|
<h2 data-testid="terminal-header">Terminal</h2>
|
||||||
|
|
||||||
|
{children}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
|
import { preferenceItemInjectionToken } from "../preference-item-injection-token";
|
||||||
|
|
||||||
|
const terminalPreferenceTabInjectable = getInjectable({
|
||||||
|
id: "terminal-preference-tab",
|
||||||
|
|
||||||
|
instantiate: () => ({
|
||||||
|
kind: "tab" as const,
|
||||||
|
id: "terminal-tab",
|
||||||
|
pathId: "terminal",
|
||||||
|
parentId: "preference-tabs" as const,
|
||||||
|
testId: "terminal-preferences-page",
|
||||||
|
label: "Terminal",
|
||||||
|
orderNumber: 20,
|
||||||
|
}),
|
||||||
|
|
||||||
|
injectionToken: preferenceItemInjectionToken,
|
||||||
|
});
|
||||||
|
|
||||||
|
export default terminalPreferenceTabInjectable;
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
|
import { preferenceItemInjectionToken } from "../../preference-item-injection-token";
|
||||||
|
import { TerminalShellPath } from "./terminal-shell-path";
|
||||||
|
|
||||||
|
const terminalShellPathPreferenceItemInjectable = getInjectable({
|
||||||
|
id: "terminal-shell-path-preference-item",
|
||||||
|
|
||||||
|
instantiate: () => ({
|
||||||
|
kind: "item" as const,
|
||||||
|
id: "terminal-shell-path",
|
||||||
|
parentId: "terminal-page",
|
||||||
|
orderNumber: 10,
|
||||||
|
Component: TerminalShellPath,
|
||||||
|
}),
|
||||||
|
|
||||||
|
injectionToken: preferenceItemInjectionToken,
|
||||||
|
});
|
||||||
|
|
||||||
|
export default terminalShellPathPreferenceItemInjectable;
|
||||||
@ -0,0 +1,46 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import React from "react";
|
||||||
|
import { SubTitle } from "../../../../../../renderer/components/layout/sub-title";
|
||||||
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||||
|
import type { UserStore } from "../../../../../../common/user-store";
|
||||||
|
import userStoreInjectable from "../../../../../../common/user-store/user-store.injectable";
|
||||||
|
import { observer } from "mobx-react";
|
||||||
|
import { Input } from "../../../../../../renderer/components/input";
|
||||||
|
import defaultShellInjectable from "../../../../../../renderer/components/+preferences/default-shell.injectable";
|
||||||
|
|
||||||
|
interface Dependencies {
|
||||||
|
userStore: UserStore;
|
||||||
|
defaultShell: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const NonInjectedTerminalShellPath = observer(
|
||||||
|
({ userStore, defaultShell }: Dependencies) => {
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<SubTitle title="Terminal Shell Path" />
|
||||||
|
<Input
|
||||||
|
theme="round-black"
|
||||||
|
placeholder={defaultShell}
|
||||||
|
value={userStore.shell ?? ""}
|
||||||
|
onChange={(value) => userStore.shell = value}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
export const TerminalShellPath = withInjectables<Dependencies>(
|
||||||
|
NonInjectedTerminalShellPath,
|
||||||
|
|
||||||
|
{
|
||||||
|
getProps: (di) => ({
|
||||||
|
userStore: di.inject(userStoreInjectable),
|
||||||
|
defaultShell: di.inject(defaultShellInjectable),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
);
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
|
import { preferenceItemInjectionToken } from "../../preference-item-injection-token";
|
||||||
|
import { TerminalTheme } from "./terminal-theme";
|
||||||
|
|
||||||
|
const terminalThemePreferenceItemInjectable = getInjectable({
|
||||||
|
id: "terminal-theme",
|
||||||
|
|
||||||
|
instantiate: () => ({
|
||||||
|
kind: "item" as const,
|
||||||
|
id: "terminal-theme",
|
||||||
|
parentId: "terminal-page",
|
||||||
|
orderNumber: 30,
|
||||||
|
Component: TerminalTheme,
|
||||||
|
}),
|
||||||
|
|
||||||
|
injectionToken: preferenceItemInjectionToken,
|
||||||
|
});
|
||||||
|
|
||||||
|
export default terminalThemePreferenceItemInjectable;
|
||||||
@ -0,0 +1,58 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import React from "react";
|
||||||
|
import { SubTitle } from "../../../../../../renderer/components/layout/sub-title";
|
||||||
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||||
|
import type { UserStore } from "../../../../../../common/user-store";
|
||||||
|
import userStoreInjectable from "../../../../../../common/user-store/user-store.injectable";
|
||||||
|
import { observer } from "mobx-react";
|
||||||
|
import { Select } from "../../../../../../renderer/components/select";
|
||||||
|
import themeStoreInjectable from "../../../../../../renderer/themes/store.injectable";
|
||||||
|
import type { ThemeStore } from "../../../../../../renderer/themes/store";
|
||||||
|
|
||||||
|
interface Dependencies {
|
||||||
|
userStore: UserStore;
|
||||||
|
themeStore: ThemeStore;
|
||||||
|
}
|
||||||
|
|
||||||
|
const NonInjectedTerminalTheme = observer(
|
||||||
|
({ userStore, themeStore }: Dependencies) => {
|
||||||
|
|
||||||
|
const themeOptions = [
|
||||||
|
{
|
||||||
|
value: "", // TODO: replace with a sentinal value that isn't string (and serialize it differently)
|
||||||
|
label: "Match Lens Theme",
|
||||||
|
},
|
||||||
|
...Array.from(themeStore.themes, ([themeId, { name }]) => ({
|
||||||
|
value: themeId,
|
||||||
|
label: name,
|
||||||
|
})),
|
||||||
|
];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<SubTitle title="Terminal theme" />
|
||||||
|
<Select
|
||||||
|
id="terminal-theme-input"
|
||||||
|
themeName="lens"
|
||||||
|
options={themeOptions}
|
||||||
|
value={userStore.terminalTheme}
|
||||||
|
onChange={option => userStore.terminalTheme = option?.value ?? ""}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
export const TerminalTheme = withInjectables<Dependencies>(
|
||||||
|
NonInjectedTerminalTheme,
|
||||||
|
|
||||||
|
{
|
||||||
|
getProps: (di) => ({
|
||||||
|
userStore: di.inject(userStoreInjectable),
|
||||||
|
themeStore: di.inject(themeStoreInjectable),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
);
|
||||||
Loading…
Reference in New Issue
Block a user