diff --git a/extensions/metrics-cluster-feature/src/metrics-settings.tsx b/extensions/metrics-cluster-feature/src/metrics-settings.tsx index 5399cd638a..f05854b0f2 100644 --- a/extensions/metrics-cluster-feature/src/metrics-settings.tsx +++ b/extensions/metrics-cluster-feature/src/metrics-settings.tsx @@ -281,7 +281,9 @@ export class MetricsSettings extends React.Component { waiting={this.inProgress} onClick={() => this.save()} primary - disabled={!this.changed} /> + disabled={!this.changed} + className="w-60 h-14" + /> {this.canUpgrade && ( An update is available for enabled metrics components. diff --git a/src/renderer/components/+entity-settings/entity-settings.tsx b/src/renderer/components/+entity-settings/entity-settings.tsx index de38e6df2a..ad0713e342 100644 --- a/src/renderer/components/+entity-settings/entity-settings.tsx +++ b/src/renderer/components/+entity-settings/entity-settings.tsx @@ -33,6 +33,7 @@ import { EntitySettingRegistry } from "../../../extensions/registries"; import type { EntitySettingsRouteParams } from "../../../common/routes"; import { groupBy } from "lodash"; import { SettingLayout } from "../layout/setting-layout"; +import { HotbarIcon } from "../hotbar/hotbar-icon"; interface Props extends RouteComponentProps { } @@ -83,10 +84,19 @@ export class EntitySettings extends React.Component { return ( <> -

{this.entity.metadata.name}

+
+ +

{this.entity.metadata.name}

+
{ groups.map((group, groupIndex) => ( +
{group[0]}
{ group[1].map((setting, index) => ( {

Extensions

- + +

+ Add new features via Lens Extensions.{" "} + Check out docs{" "} + and list of available extensions. +

+
{} + +export function Notice(props: Props) { return (
-

- Add new features via Lens Extensions.{" "} - Check out docs{" "} - and list of available extensions. -

+ {props.children}
); } diff --git a/src/renderer/components/cluster-settings/cluster-settings.tsx b/src/renderer/components/cluster-settings/cluster-settings.tsx index ed01ce4fb7..2f11883fa0 100644 --- a/src/renderer/components/cluster-settings/cluster-settings.tsx +++ b/src/renderer/components/cluster-settings/cluster-settings.tsx @@ -40,12 +40,16 @@ export function GeneralSettings({ entity }: EntitySettingViewProps) { return (
- +
+
+ +
+
+ +
+
-
- -
-
+
@@ -106,10 +110,9 @@ export function MetricsSettings({ entity }: EntitySettingViewProps) {
+
-
-
diff --git a/src/renderer/components/cluster-settings/components/cluster-accessible-namespaces.tsx b/src/renderer/components/cluster-settings/components/cluster-accessible-namespaces.tsx index ab2a03f73c..6794646bea 100644 --- a/src/renderer/components/cluster-settings/components/cluster-accessible-namespaces.tsx +++ b/src/renderer/components/cluster-settings/components/cluster-accessible-namespaces.tsx @@ -54,6 +54,7 @@ export class ClusterAccessibleNamespaces extends React.Component { this.namespaces.delete(oldNamesapce); this.props.cluster.accessibleNamespaces = Array.from(this.namespaces); }} + inputTheme="round-black" /> This setting is useful for manually specifying which namespaces you have access to. This is useful when you do not have permissions to list namespaces. diff --git a/src/renderer/components/cluster-settings/components/cluster-icon-settings.tsx b/src/renderer/components/cluster-settings/components/cluster-icon-settings.tsx index 148395872b..d0ee10f0ee 100644 --- a/src/renderer/components/cluster-settings/components/cluster-icon-settings.tsx +++ b/src/renderer/components/cluster-settings/components/cluster-icon-settings.tsx @@ -21,15 +21,13 @@ import React from "react"; import type { Cluster } from "../../../../main/cluster"; -//import { FilePicker, OverSizeLimitStyle } from "../../file-picker"; import { boundMethod } from "../../../utils"; -import { Button } from "../../button"; import { observable } from "mobx"; import { observer } from "mobx-react"; -import { SubTitle } from "../../layout/sub-title"; import { HotbarIcon } from "../../hotbar/hotbar-icon"; import type { KubernetesCluster } from "../../../../common/catalog-entities"; import { FilePicker, OverSizeLimitStyle } from "../../file-picker"; +import { MenuActions, MenuItem } from "../../menu"; enum GeneralInputStatus { CLEAN = "clean", @@ -46,6 +44,8 @@ export class ClusterIconSetting extends React.Component { @observable status = GeneralInputStatus.CLEAN; @observable errorText?: string; + private element = React.createRef(); + @boundMethod async onIconPick([file]: File[]) { const { cluster } = this.props; @@ -66,16 +66,11 @@ export class ClusterIconSetting extends React.Component { } } - getClearButton() { - if (this.props.cluster.preferences.icon) { - return
{this.canEditPrometheusPath && ( -
-

Prometheus service address.

- this.path = value} - onBlur={this.onSavePath} - placeholder="/:" - /> - - An address to an existing Prometheus installation{" "} - ({"/:"}). {productName} tries to auto-detect address if left empty. - -
+ <> +
+
+ + this.path = value} + onBlur={this.onSavePath} + placeholder="/:" + /> + + An address to an existing Prometheus installation{" "} + ({"/:"}). {productName} tries to auto-detect address if left empty. + +
+ )} ); diff --git a/src/renderer/components/cluster-settings/components/cluster-show-metrics.tsx b/src/renderer/components/cluster-settings/components/cluster-show-metrics.tsx index 9a6d1e084f..6544f2325b 100644 --- a/src/renderer/components/cluster-settings/components/cluster-show-metrics.tsx +++ b/src/renderer/components/cluster-settings/components/cluster-show-metrics.tsx @@ -25,6 +25,7 @@ import type { Cluster } from "../../../../main/cluster"; import { observable, reaction, makeObservable } from "mobx"; import { Badge } from "../../badge/badge"; import { Icon } from "../../icon/icon"; +import { Notice } from "../../+extensions/notice"; interface Props { cluster: Cluster; @@ -55,14 +56,20 @@ export class ShowMetricsSetting extends React.Component { } renderMetrics() { + const metrics = Array.from(this.hiddenMetrics); + + if (!metrics.length) { + return ( +
All metrics are visible on the UI
+ ); + } return ( - - Array.from(this.hiddenMetrics).map(name => { + metrics.map(name => { const tooltipId = `${name}`; return ( - + {name} { render() { return ( -
- {this.renderMetrics()} -
+ +
+ {this.renderMetrics()} +
+
); } } diff --git a/src/renderer/components/editable-list/editable-list.scss b/src/renderer/components/editable-list/editable-list.scss index b30fdf7f57..0f88d009d9 100644 --- a/src/renderer/components/editable-list/editable-list.scss +++ b/src/renderer/components/editable-list/editable-list.scss @@ -23,7 +23,10 @@ .el-contents { display: flex; flex-direction: column; - margin: $padding 0px; + + &:not(:empty) { + margin: $padding 0px; + } .el-value-remove { .Icon { diff --git a/src/renderer/components/editable-list/editable-list.tsx b/src/renderer/components/editable-list/editable-list.tsx index ec31a2586e..0b427b6f2a 100644 --- a/src/renderer/components/editable-list/editable-list.tsx +++ b/src/renderer/components/editable-list/editable-list.tsx @@ -25,7 +25,7 @@ import { observer } from "mobx-react"; import React from "react"; import { Icon } from "../icon"; -import { Input } from "../input"; +import { Input, InputProps } from "../input"; import { boundMethod } from "../../utils"; export interface Props { @@ -37,11 +37,13 @@ export interface Props { // An optional prop used to convert T to a displayable string // defaults to `String` renderItem?: (item: T, index: number) => React.ReactNode, + inputTheme?: InputProps["theme"]; } const defaultProps: Partial> = { placeholder: "Add new item...", - renderItem: (item: any, index: number) => {item} + renderItem: (item: any, index: number) => {item}, + inputTheme: "round" }; @observer @@ -59,13 +61,13 @@ export class EditableList extends React.Component> { } render() { - const { items, remove, renderItem, placeholder } = this.props; + const { items, remove, renderItem, placeholder, inputTheme } = this.props; return (
diff --git a/src/renderer/components/file-picker/file-picker.tsx b/src/renderer/components/file-picker/file-picker.tsx index 565168efac..0479f91ce3 100644 --- a/src/renderer/components/file-picker/file-picker.tsx +++ b/src/renderer/components/file-picker/file-picker.tsx @@ -227,12 +227,12 @@ export class FilePicker extends React.Component { getIconRight(): React.ReactNode { switch (this.status) { - case FileInputStatus.CLEAR: - return ; case FileInputStatus.PROCESSING: return ; case FileInputStatus.ERROR: return ; + default: + return null; } } } diff --git a/src/renderer/components/input/input.scss b/src/renderer/components/input/input.scss index 97ad5c058a..b683f46d3a 100644 --- a/src/renderer/components/input/input.scss +++ b/src/renderer/components/input/input.scss @@ -136,10 +136,15 @@ border-color: var(--inputControlBorder); color: var(--textColorTertiary); padding: $padding; + transition: border-color 0.1s; &:hover { border-color: var(--inputControlHoverBorder); } + + &:focus-within { + border-color: $colorInfo; + } } } } diff --git a/src/renderer/components/layout/setting-layout.scss b/src/renderer/components/layout/setting-layout.scss index 198e7c9cb6..3e6bfd8726 100644 --- a/src/renderer/components/layout/setting-layout.scss +++ b/src/renderer/components/layout/setting-layout.scss @@ -20,17 +20,19 @@ */ .SettingLayout { - --width: 75%; - --nav-width: 180px; --nav-column-width: 30vw; width: 100%; height: 100%; - display: grid !important; + display: grid; color: var(--settingsColor); - - @include media("<1000px") { - --width: 85%; - } + position: fixed; + z-index: 13!important; + left: 0; + top: 0; + right: 0; + bottom: 0; + height: unset; + background-color: var(--settingsBackground); &.showNavigation { grid-template-columns: var(--nav-column-width) 1fr; @@ -40,18 +42,6 @@ } } - // covers whole app view area - &.showOnTop { - position: fixed !important; // allow to cover ClustersMenu - z-index: 13; - left: 0; - top: 0; - right: 0; - bottom: 0; - height: unset; - background-color: var(--settingsBackground); - } - > .sidebarRegion { display: flex; justify-content: flex-end; @@ -63,12 +53,25 @@ padding: 60px 0 60px 20px; h2 { - margin-bottom: 10px; - font-size: 18px; - padding: 6px 10px; + font-size: 15px; overflow-wrap: anywhere; color: var(--textColorAccent); font-weight: 600; + padding-right: 20px; + word-break: break-word; + } + + hr { + margin-top: 10px; + margin-bottom: 10px; + margin-left: 10px; + margin-right: 20px; + height: 1px; + border-top: thin solid var(--hrColor); + + &:first-child { + display: none; + } } .Tabs { @@ -78,6 +81,7 @@ font-weight: 800; line-height: 16px; text-transform: uppercase; + color: var(--textColorPrimary); &:first-child { padding-top: 0; @@ -112,9 +116,14 @@ > .label { width: 100%; + font-weight: 500; } } } + + .HotbarIcon { + margin: 0 11px; + } } } @@ -124,7 +133,9 @@ justify-content: center; > .content { - width: var(--width); + width: 100%; + max-width: 740px; + min-width: 460px; padding: 60px 40px 80px; > section { @@ -157,7 +168,7 @@ } .Icon { - color: var(--textColorSecondary); + color: var(--textColorTertiary); } } @@ -200,7 +211,7 @@ font-size: 18px; line-height: 20px; font-weight: 600; - margin-bottom: 20px; + margin-bottom: 30px; } a { @@ -210,6 +221,7 @@ .hint { margin-top: 8px; font-size: 14px; + line-height: 20px; } .SubTitle { diff --git a/src/renderer/components/layout/setting-layout.tsx b/src/renderer/components/layout/setting-layout.tsx index 45912f262c..53e54e07ac 100644 --- a/src/renderer/components/layout/setting-layout.tsx +++ b/src/renderer/components/layout/setting-layout.tsx @@ -81,7 +81,7 @@ export class SettingLayout extends React.Component { contentClass, provideBackButtonNavigation, contentGaps, navigation, children, ...elemProps } = this.props; - const className = cssNames("SettingLayout", "showOnTop", { showNavigation: navigation }, this.props.className); + const className = cssNames("SettingLayout", { showNavigation: navigation }, this.props.className); return (
diff --git a/src/renderer/components/select/select.scss b/src/renderer/components/select/select.scss index 55fddec850..84f348f4c0 100644 --- a/src/renderer/components/select/select.scss +++ b/src/renderer/components/select/select.scss @@ -213,6 +213,7 @@ html { :hover { &.Select__control { box-shadow: 0 0 0 1px var(--inputControlHoverBorder); + transition: box-shadow 0.1s; } }