From 595bb715a98c436371eaee2ed736d140c2f3fdba Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Tue, 12 Apr 2022 16:55:38 -0400 Subject: [PATCH] fix type errors, most { } -interface ISecretTemplateField { +interface SecretTemplateField { key: string; value?: string; required?: boolean; } -interface ISecretTemplate { - [field: string]: ISecretTemplateField[] | undefined; - annotations?: ISecretTemplateField[]; - labels?: ISecretTemplateField[]; - data?: ISecretTemplateField[]; +interface SecretTemplate { + [field: string]: SecretTemplateField[] | undefined; + annotations?: SecretTemplateField[]; + labels?: SecretTemplateField[]; + data?: SecretTemplateField[]; } -type ISecretField = keyof ISecretTemplate; +type ISecretField = keyof SecretTemplate; const dialogState = observable.object({ isOpen: false, @@ -61,7 +61,7 @@ export class AddSecretDialog extends React.Component { dialogState.isOpen = false; } - private secretTemplate: Partial> = { + private secretTemplate: Partial> = { [SecretType.Opaque]: {}, [SecretType.ServiceAccountToken]: { annotations: [ @@ -71,8 +71,8 @@ export class AddSecretDialog extends React.Component { }, }; - get types() { - return Object.keys(this.secretTemplate) as SecretType[]; + private get secretTypeOptions() { + return object.keys(this.secretTemplate).map(type => ({ type })); } @observable secret = this.secretTemplate; @@ -89,7 +89,7 @@ export class AddSecretDialog extends React.Component { AddSecretDialog.close(); }; - private getDataFromFields = (fields: ISecretTemplateField[] = [], processValue: (val: string) => string = (val => val)) => { + private getDataFromFields = (fields: SecretTemplateField[] = [], processValue: (val: string) => string = (val => val)) => { return iter.pipeline(fields) .filterMap(({ key, value }) => ( value @@ -160,7 +160,7 @@ export class AddSecretDialog extends React.Component { tabIndex={item.required ? -1 : 0} readOnly={item.required} value={item.key} - onChange={v => item.key = v} + onChange={v => item.key = v} /> { className="value" placeholder="Value" value={item.value} - onChange={v => item.value = v} + onChange={v => item.value = v} /> { tooltip={item.required ? "Required field" : "Remove field"} className="remove-icon" material="remove_circle_outline" - onClick={() => this.removeField(field, index)} + onClick={() => this.removeField(field, index)} /> ))} @@ -224,7 +224,7 @@ export class AddSecretDialog extends React.Component { id="secret-namespace-input" themeName="light" value={namespace} - onChange={value => this.namespace = value ?? "default"} + onChange={value => this.namespace = value?.namespace ?? "default"} />
@@ -232,9 +232,9 @@ export class AddSecretDialog extends React.Component { themeStore.themes.get(option)?.name ?? "Sync with computer"} - value={userStore.colorTheme} - onChange={value => userStore.colorTheme = value ?? defaultTheme} + options={themeOptions} + getOptionLabel={option => themeStore.themes.get(option.theme)?.name ?? "Sync with computer"} + value={({ theme: userStore.colorTheme })} + onChange={value => userStore.colorTheme = value?.theme ?? defaultTheme} themeName="lens" /> @@ -58,14 +67,10 @@ const NonInjectedApplication: React.FC = ({ appPreferenceItems, us
userStore.updateChannel = value ?? defaultUpdateChannel} + options={updateChannelOptions} + value={({ channel: userStore.updateChannel })} + onChange={value => userStore.updateChannel = value?.channel ?? defaultUpdateChannel} themeName="lens" />
@@ -135,10 +140,10 @@ const NonInjectedApplication: React.FC = ({ appPreferenceItems, us
editorConfiguration.minimap.side = value ?? undefined} + options={minimapPositionOptions} + value={editorConfiguration.minimap.side ? ({ side: editorConfiguration.minimap.side }) : null} + onChange={value => editorConfiguration.minimap.side = value?.side} />
@@ -54,15 +62,10 @@ const NonInjectedEditor = observer(({ userStore }: Dependencies) => {
userStore.downloadMirror = value ?? defaultPackageMirror} - getOptionLabel={mirrorKey => packageMirrors.get(mirrorKey)?.label ?? ""} + options={downloadMirrorOptions} + value={downloadMirrorOptions.find(opt => opt.name === userStore.downloadMirror)} + onChange={option => userStore.downloadMirror = option?.name ?? defaultPackageMirror} + getOptionLabel={option => option.mirror.label} isDisabled={!userStore.downloadKubectlBinaries} - isOptionDisabled={mirrorKey => !packageMirrors.get(mirrorKey)?.platforms.has(process.platform)} + isOptionDisabled={option => option.mirror.platforms.has(process.platform)} themeName="lens" />
diff --git a/src/renderer/components/+preferences/terminal.tsx b/src/renderer/components/+preferences/terminal.tsx index 27f4229c9f..cfbaeceb02 100644 --- a/src/renderer/components/+preferences/terminal.tsx +++ b/src/renderer/components/+preferences/terminal.tsx @@ -24,6 +24,11 @@ interface Dependencies { } const NonInjectedTerminal = observer(({ userStore, themeStore, defaultShell }: Dependencies) => { + const themeOptions = [ + "", + ...themeStore.themes.keys(), + ].map(name => ({ name })); + return (
@@ -53,12 +58,9 @@ const NonInjectedTerminal = observer(({ userStore, themeStore, defaultShell }: D { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const { title } = activeCommands.get(commandId)!; - - return typeof title === "string" + options={activeCommands} + getOptionLabel={({ title }) => ( + typeof title === "string" ? title - : title(context); - }} + : title(context) + )} autoFocus={true} escapeClearsValue={false} data-test-id="command-palette-search" diff --git a/src/renderer/components/duration/reactive-duration.tsx b/src/renderer/components/duration/reactive-duration.tsx index 9210f48de9..53b1672f17 100644 --- a/src/renderer/components/duration/reactive-duration.tsx +++ b/src/renderer/components/duration/reactive-duration.tsx @@ -9,7 +9,7 @@ import React from "react"; import { formatDuration } from "../../utils"; export interface ReactiveDurationProps { - timestamp: string; + timestamp: string | undefined; /** * Whether the display string should prefer length over precision @@ -34,6 +34,10 @@ function computeUpdateInterval(creationTimestampEpoch: number): number { } export const ReactiveDuration = observer(({ timestamp, compact = true }: ReactiveDurationProps) => { + if (!timestamp) { + return <>{""}; + } + const creationTimestamp = new Date(timestamp).getTime(); return ( diff --git a/src/renderer/components/kube-object/age.tsx b/src/renderer/components/kube-object/age.tsx index ab1491a024..2d7eed38ec 100644 --- a/src/renderer/components/kube-object/age.tsx +++ b/src/renderer/components/kube-object/age.tsx @@ -21,12 +21,8 @@ export interface KubeObjectAgeProps { } export const KubeObjectAge = ({ object, compact = true }: KubeObjectAgeProps) => ( - object.metadata.creationTimestamp - ? ( - - ) - : <>{""} + ); diff --git a/src/renderer/components/layout/sub-header.tsx b/src/renderer/components/layout/sub-header.tsx index cb8893a5f2..0530fef944 100644 --- a/src/renderer/components/layout/sub-header.tsx +++ b/src/renderer/components/layout/sub-header.tsx @@ -5,12 +5,14 @@ import "./sub-header.scss"; import React from "react"; +import type { SingleOrMany } from "../../utils"; import { cssNames } from "../../utils"; export interface SubHeaderProps { className?: string; withLine?: boolean; // add bottom line compact?: boolean; // no extra padding around content + children: SingleOrMany; } export class SubHeader extends React.Component {