mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Introduce competition for application 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
0dc45c7ce9
commit
bdd945a6d3
@ -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 { ApplicationPreferencePage } from "./application-preference-page";
|
||||||
|
|
||||||
|
const applicationPreferencePageInjectable = getInjectable({
|
||||||
|
id: "application-preference-page",
|
||||||
|
|
||||||
|
instantiate: () => ({
|
||||||
|
kind: "page" as const,
|
||||||
|
id: "application-page",
|
||||||
|
parentId: "application-tab",
|
||||||
|
orderNumber: 0,
|
||||||
|
Component: ApplicationPreferencePage,
|
||||||
|
}),
|
||||||
|
|
||||||
|
injectionToken: preferenceItemInjectionToken,
|
||||||
|
});
|
||||||
|
|
||||||
|
export default applicationPreferencePageInjectable;
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import React from "react";
|
||||||
|
|
||||||
|
export const ApplicationPreferencePage = () => (
|
||||||
|
<div>
|
||||||
|
<h2 data-testid="application-header">Application</h2>
|
||||||
|
</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 applicationPreferenceTabInjectable = getInjectable({
|
||||||
|
id: "application-preference-tab",
|
||||||
|
|
||||||
|
instantiate: () => ({
|
||||||
|
kind: "tab" as const,
|
||||||
|
id: "application-tab",
|
||||||
|
parentId: "preference-tabs" as const,
|
||||||
|
pathId: "app",
|
||||||
|
testId: "application-preferences-page",
|
||||||
|
label: "Application",
|
||||||
|
orderNumber: 10,
|
||||||
|
}),
|
||||||
|
|
||||||
|
injectionToken: preferenceItemInjectionToken,
|
||||||
|
});
|
||||||
|
|
||||||
|
export default applicationPreferenceTabInjectable;
|
||||||
@ -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 { ExtensionInstallRegistry } from "./extension-install-registry";
|
||||||
|
|
||||||
|
const extensionInstallRegistryPreferenceItemInjectable = getInjectable({
|
||||||
|
id: "extension-install-registry-preference-item",
|
||||||
|
|
||||||
|
instantiate: () => ({
|
||||||
|
kind: "item" as const,
|
||||||
|
id: "extension-install-registry",
|
||||||
|
parentId: "application-page",
|
||||||
|
orderNumber: 20,
|
||||||
|
Component: ExtensionInstallRegistry,
|
||||||
|
}),
|
||||||
|
|
||||||
|
injectionToken: preferenceItemInjectionToken,
|
||||||
|
});
|
||||||
|
|
||||||
|
export default extensionInstallRegistryPreferenceItemInjectable;
|
||||||
@ -0,0 +1,88 @@
|
|||||||
|
/**
|
||||||
|
* 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 { Select } from "../../../../../../renderer/components/select";
|
||||||
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||||
|
import { defaultExtensionRegistryUrl, defaultExtensionRegistryUrlLocation } from "../../../../../../common/user-store/preferences-helpers";
|
||||||
|
import { Input } from "../../../../../../renderer/components/input";
|
||||||
|
import { isUrl } from "../../../../../../renderer/components/input/input_validators";
|
||||||
|
import type { UserStore } from "../../../../../../common/user-store";
|
||||||
|
import { runInAction } from "mobx";
|
||||||
|
import userStoreInjectable from "../../../../../../common/user-store/user-store.injectable";
|
||||||
|
import { observer } from "mobx-react";
|
||||||
|
|
||||||
|
interface Dependencies {
|
||||||
|
userStore: UserStore;
|
||||||
|
}
|
||||||
|
|
||||||
|
const extensionInstallRegistryOptions = [
|
||||||
|
{
|
||||||
|
value: "default",
|
||||||
|
label: "Default Url",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: "npmrc",
|
||||||
|
label: "Global .npmrc file's Url",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: "custom",
|
||||||
|
label: "Custom Url",
|
||||||
|
},
|
||||||
|
] as const;
|
||||||
|
|
||||||
|
const NonInjectedExtensionInstallRegistry = observer(({ userStore }: Dependencies) => {
|
||||||
|
const [customUrl, setCustomUrl] = React.useState(userStore.extensionRegistryUrl.customUrl || "");
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section id="extensionRegistryUrl">
|
||||||
|
<SubTitle title="Extension Install Registry" />
|
||||||
|
<Select
|
||||||
|
id="extension-install-registry-input"
|
||||||
|
options={extensionInstallRegistryOptions}
|
||||||
|
value={userStore.extensionRegistryUrl.location}
|
||||||
|
onChange={(value) =>
|
||||||
|
runInAction(() => {
|
||||||
|
userStore.extensionRegistryUrl.location =
|
||||||
|
value?.value ?? defaultExtensionRegistryUrlLocation;
|
||||||
|
|
||||||
|
if (userStore.extensionRegistryUrl.location === "custom") {
|
||||||
|
userStore.extensionRegistryUrl.customUrl = "";
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
themeName="lens"
|
||||||
|
/>
|
||||||
|
<p className="mt-4 mb-5 leading-relaxed">
|
||||||
|
{
|
||||||
|
"This setting is to change the registry URL for installing extensions by name. "
|
||||||
|
}
|
||||||
|
{`If you are unable to access the default registry (${defaultExtensionRegistryUrl}) you can change it in your `}
|
||||||
|
<b>.npmrc</b>
|
||||||
|
{" file or in the input below."}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<Input
|
||||||
|
theme="round-black"
|
||||||
|
validators={isUrl}
|
||||||
|
value={customUrl}
|
||||||
|
onChange={setCustomUrl}
|
||||||
|
onBlur={() => (userStore.extensionRegistryUrl.customUrl = customUrl)}
|
||||||
|
placeholder="Custom Extension Registry URL..."
|
||||||
|
disabled={userStore.extensionRegistryUrl.location !== "custom"}
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
export const ExtensionInstallRegistry = withInjectables<Dependencies>(
|
||||||
|
NonInjectedExtensionInstallRegistry,
|
||||||
|
|
||||||
|
{
|
||||||
|
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 { StartUp } from "./start-up";
|
||||||
|
|
||||||
|
const startUpPreferenceItemInjectable = getInjectable({
|
||||||
|
id: "start-up-preference-item",
|
||||||
|
|
||||||
|
instantiate: () => ({
|
||||||
|
kind: "item" as const,
|
||||||
|
id: "start-up",
|
||||||
|
parentId: "application-page",
|
||||||
|
orderNumber: 30,
|
||||||
|
Component: StartUp,
|
||||||
|
}),
|
||||||
|
|
||||||
|
injectionToken: preferenceItemInjectionToken,
|
||||||
|
});
|
||||||
|
|
||||||
|
export default startUpPreferenceItemInjectable;
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
/**
|
||||||
|
* 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 { Switch } from "../../../../../../renderer/components/switch";
|
||||||
|
import { observer } from "mobx-react";
|
||||||
|
|
||||||
|
interface Dependencies {
|
||||||
|
userStore: UserStore;
|
||||||
|
}
|
||||||
|
|
||||||
|
const NonInjectedStartUp = observer(({ userStore }: Dependencies) => (
|
||||||
|
<section id="other">
|
||||||
|
<SubTitle title="Start-up" />
|
||||||
|
<Switch
|
||||||
|
checked={userStore.openAtLogin}
|
||||||
|
onChange={() => (userStore.openAtLogin = !userStore.openAtLogin)}
|
||||||
|
>
|
||||||
|
Automatically start Lens on login
|
||||||
|
</Switch>
|
||||||
|
</section>
|
||||||
|
));
|
||||||
|
|
||||||
|
export const StartUp = withInjectables<Dependencies>(
|
||||||
|
NonInjectedStartUp,
|
||||||
|
|
||||||
|
{
|
||||||
|
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 { Theme } from "./theme";
|
||||||
|
|
||||||
|
const themePreferenceItemInjectable = getInjectable({
|
||||||
|
id: "theme-preference-item",
|
||||||
|
|
||||||
|
instantiate: () => ({
|
||||||
|
kind: "item" as const,
|
||||||
|
id: "theme",
|
||||||
|
parentId: "application-page",
|
||||||
|
orderNumber: 10,
|
||||||
|
Component: Theme,
|
||||||
|
}),
|
||||||
|
|
||||||
|
injectionToken: preferenceItemInjectionToken,
|
||||||
|
});
|
||||||
|
|
||||||
|
export default themePreferenceItemInjectable;
|
||||||
@ -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 { Select } from "../../../../../../renderer/components/select";
|
||||||
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||||
|
import { observer } from "mobx-react";
|
||||||
|
import type { UserStore } from "../../../../../../common/user-store";
|
||||||
|
import type { ThemeStore } from "../../../../../../renderer/themes/store";
|
||||||
|
import { defaultThemeId } from "../../../../../../common/vars";
|
||||||
|
import userStoreInjectable from "../../../../../../common/user-store/user-store.injectable";
|
||||||
|
import themeStoreInjectable from "../../../../../../renderer/themes/store.injectable";
|
||||||
|
|
||||||
|
interface Dependencies {
|
||||||
|
userStore: UserStore;
|
||||||
|
themeStore: ThemeStore;
|
||||||
|
}
|
||||||
|
|
||||||
|
const NonInjectedTheme = observer(({ userStore, themeStore }: Dependencies) => {
|
||||||
|
const themeOptions = [
|
||||||
|
{
|
||||||
|
value: "system", // TODO: replace with a sentinal value that isn't string (and serialize it differently)
|
||||||
|
label: "Sync with computer",
|
||||||
|
},
|
||||||
|
...Array.from(themeStore.themes, ([themeId, { name }]) => ({
|
||||||
|
value: themeId,
|
||||||
|
label: name,
|
||||||
|
})),
|
||||||
|
];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section id="appearance">
|
||||||
|
<SubTitle title="Theme" />
|
||||||
|
<Select
|
||||||
|
id="theme-input"
|
||||||
|
options={themeOptions}
|
||||||
|
value={userStore.colorTheme}
|
||||||
|
onChange={(value) =>
|
||||||
|
(userStore.colorTheme = value?.value ?? defaultThemeId)
|
||||||
|
}
|
||||||
|
themeName="lens"
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
export const Theme = withInjectables<Dependencies>(
|
||||||
|
NonInjectedTheme,
|
||||||
|
|
||||||
|
{
|
||||||
|
getProps: (di) => ({
|
||||||
|
userStore: di.inject(userStoreInjectable),
|
||||||
|
themeStore: di.inject(themeStoreInjectable),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
);
|
||||||
@ -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 { Timezone } from "./timezone";
|
||||||
|
|
||||||
|
const timezonePreferenceItemInjectable = getInjectable({
|
||||||
|
id: "timezone-preference-item",
|
||||||
|
|
||||||
|
instantiate: () => ({
|
||||||
|
kind: "item" as const,
|
||||||
|
id: "timezone",
|
||||||
|
parentId: "application-page",
|
||||||
|
orderNumber: 60,
|
||||||
|
Component: Timezone,
|
||||||
|
}),
|
||||||
|
|
||||||
|
injectionToken: preferenceItemInjectionToken,
|
||||||
|
});
|
||||||
|
|
||||||
|
export default timezonePreferenceItemInjectable;
|
||||||
@ -0,0 +1,48 @@
|
|||||||
|
/**
|
||||||
|
* 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 { Select } from "../../../../../../renderer/components/select";
|
||||||
|
import { defaultLocaleTimezone } from "../../../../../../common/user-store/preferences-helpers";
|
||||||
|
import moment from "moment-timezone";
|
||||||
|
import { observer } from "mobx-react";
|
||||||
|
|
||||||
|
interface Dependencies {
|
||||||
|
userStore: UserStore;
|
||||||
|
}
|
||||||
|
|
||||||
|
const timezoneOptions = moment.tz.names()
|
||||||
|
.map(timezone => ({
|
||||||
|
value: timezone,
|
||||||
|
label: timezone.replace("_", " "),
|
||||||
|
}));
|
||||||
|
|
||||||
|
|
||||||
|
const NonInjectedTimezone = observer(({ userStore }: Dependencies) => (
|
||||||
|
<section id="locale">
|
||||||
|
<SubTitle title="Locale Timezone" />
|
||||||
|
<Select
|
||||||
|
id="timezone-input"
|
||||||
|
options={timezoneOptions}
|
||||||
|
value={userStore.localeTimezone}
|
||||||
|
onChange={value => userStore.localeTimezone = value?.value ?? defaultLocaleTimezone}
|
||||||
|
themeName="lens"
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
));
|
||||||
|
|
||||||
|
export const Timezone = withInjectables<Dependencies>(
|
||||||
|
NonInjectedTimezone,
|
||||||
|
|
||||||
|
{
|
||||||
|
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 { UpdateChannel } from "./update-channel";
|
||||||
|
|
||||||
|
const updateChannelPreferenceItemInjectable = getInjectable({
|
||||||
|
id: "update-channel-preference-item",
|
||||||
|
|
||||||
|
instantiate: () => ({
|
||||||
|
kind: "item" as const,
|
||||||
|
id: "update-channel",
|
||||||
|
parentId: "application-page",
|
||||||
|
orderNumber: 50,
|
||||||
|
Component: UpdateChannel,
|
||||||
|
}),
|
||||||
|
|
||||||
|
injectionToken: preferenceItemInjectionToken,
|
||||||
|
});
|
||||||
|
|
||||||
|
export default updateChannelPreferenceItemInjectable;
|
||||||
@ -0,0 +1,51 @@
|
|||||||
|
/**
|
||||||
|
* 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 { Select } from "../../../../../../renderer/components/select";
|
||||||
|
import { updateChannels } from "../../../../../application-update/common/update-channels";
|
||||||
|
import type { SelectedUpdateChannel } from "../../../../../application-update/common/selected-update-channel/selected-update-channel.injectable";
|
||||||
|
import selectedUpdateChannelInjectable from "../../../../../application-update/common/selected-update-channel/selected-update-channel.injectable";
|
||||||
|
import { pipeline } from "@ogre-tools/fp";
|
||||||
|
import { map, toPairs } from "lodash/fp";
|
||||||
|
import { observer } from "mobx-react";
|
||||||
|
|
||||||
|
interface Dependencies {
|
||||||
|
selectedUpdateChannel: SelectedUpdateChannel;
|
||||||
|
}
|
||||||
|
|
||||||
|
const updateChannelOptions = pipeline(
|
||||||
|
toPairs(updateChannels),
|
||||||
|
|
||||||
|
map(([, channel]) => ({
|
||||||
|
value: channel.id,
|
||||||
|
label: channel.label,
|
||||||
|
})),
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
const NonInjectedUpdateChannel = observer(({ selectedUpdateChannel }: Dependencies) => (
|
||||||
|
<section id="update-channel">
|
||||||
|
<SubTitle title="Update Channel" />
|
||||||
|
<Select
|
||||||
|
id="update-channel-input"
|
||||||
|
options={updateChannelOptions}
|
||||||
|
value={selectedUpdateChannel.value.get().id}
|
||||||
|
onChange={(selected) => selectedUpdateChannel.setValue(selected?.value)}
|
||||||
|
themeName="lens"
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
|
));
|
||||||
|
|
||||||
|
export const UpdateChannel = withInjectables<Dependencies>(
|
||||||
|
NonInjectedUpdateChannel,
|
||||||
|
|
||||||
|
{
|
||||||
|
getProps: (di) => ({
|
||||||
|
selectedUpdateChannel: di.inject(selectedUpdateChannelInjectable),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
);
|
||||||
Loading…
Reference in New Issue
Block a user