From 33fee80af96d77f3faa6e67d2b8f7eeeb6397222 Mon Sep 17 00:00:00 2001 From: Roman Date: Thu, 16 Feb 2023 13:47:21 +0200 Subject: [PATCH] switched for scaling replicas with `Slider` component instead of `Buttons+Input` Signed-off-by: Roman --- .../endpoints/replication-controller.api.ts | 2 +- .../replicationcontroller-details.module.scss | 7 +- .../replicationcontroller-details.tsx | 112 ++++++------------ 3 files changed, 41 insertions(+), 80 deletions(-) diff --git a/packages/core/src/common/k8s-api/endpoints/replication-controller.api.ts b/packages/core/src/common/k8s-api/endpoints/replication-controller.api.ts index 8190220b07..b87b7a81a8 100644 --- a/packages/core/src/common/k8s-api/endpoints/replication-controller.api.ts +++ b/packages/core/src/common/k8s-api/endpoints/replication-controller.api.ts @@ -29,7 +29,7 @@ export class ReplicationControllerApi extends KubeApi { return this.request.get(this.getScaleApiUrl(params)); } - scale(params: { namespace: string; name: string }, replicas: number) { + scale(params: { namespace: string; name: string }, replicas: number): Promise { return this.request.patch(this.getScaleApiUrl(params), { data: { metadata: params, diff --git a/packages/core/src/renderer/components/+workloads-replicationcontrollers/replicationcontroller-details.module.scss b/packages/core/src/renderer/components/+workloads-replicationcontrollers/replicationcontroller-details.module.scss index 5ebd954dda..eb1d11143a 100644 --- a/packages/core/src/renderer/components/+workloads-replicationcontrollers/replicationcontroller-details.module.scss +++ b/packages/core/src/renderer/components/+workloads-replicationcontrollers/replicationcontroller-details.module.scss @@ -4,10 +4,13 @@ */ .ReplicationControllerDetails { - - .desiredReplicas { + .replicas { display: flex; gap: calc(var(--margin) * 2); align-items: center; + + > * { + flex-shrink: 0; + } } } diff --git a/packages/core/src/renderer/components/+workloads-replicationcontrollers/replicationcontroller-details.tsx b/packages/core/src/renderer/components/+workloads-replicationcontrollers/replicationcontroller-details.tsx index 094e3d5344..44032e53ff 100644 --- a/packages/core/src/renderer/components/+workloads-replicationcontrollers/replicationcontroller-details.tsx +++ b/packages/core/src/renderer/components/+workloads-replicationcontrollers/replicationcontroller-details.tsx @@ -5,112 +5,60 @@ import styles from "./replicationcontroller-details.module.scss"; import React from "react"; -import { makeObservable, observable } from "mobx"; +import { action, makeObservable, observable } from "mobx"; import { observer } from "mobx-react"; import { withInjectables } from "@ogre-tools/injectable-react"; import { DrawerItem, DrawerTitle } from "../drawer"; import { Badge } from "../badge"; import type { KubeObjectDetailsProps } from "../kube-object-details"; -import type { ReplicationControllerStore } from "./replicationcontroller-store"; -import replicationControllerStoreInjectable from "./replicationcontroller-store.injectable"; import type { ReplicationController, ReplicationControllerApi, } from "../../../common/k8s-api/endpoints"; import replicationControllerApiInjectable from "../../../common/k8s-api/endpoints/replication-controller.api.injectable"; -import { Button } from "../button"; -import { Input } from "../input"; import showErrorNotificationInjectable from "../notifications/show-error-notification.injectable"; import type { ShowNotification } from "../notifications"; -import hideDetailsInjectable from "../kube-detail-params/hide-details.injectable"; +import { Slider } from "../slider"; export interface ReplicationControllerDetailsProps extends KubeObjectDetailsProps { } interface Dependencies { - store: ReplicationControllerStore; api: ReplicationControllerApi; showNotificationError: ShowNotification; - - hideDetails(): void; } @observer class NonInjectedReplicationControllerDetails extends React.Component { - @observable showScaleDialog = false; + @observable sliderReplicasValue = this.props.object.getDesiredReplicas(); + @observable sliderReplicasDisabled = false; constructor(props: Props) { super(props); makeObservable(this); } - inputRef = React.createRef(); + @action + async scale(replicas: number) { + const { object: resource, api, showNotificationError } = this.props; - scale(replicas: number) { - const { object: resource, api } = this.props; - - return api.scale({ - name: resource.getName(), - namespace: resource.getNs(), - }, replicas); + try { + await api.scale({ + name: resource.getName(), + namespace: resource.getNs(), + }, replicas); + } catch (error) { + this.sliderReplicasValue = resource.getDesiredReplicas(); // rollback to last valid value + showNotificationError(error as Error); + } } - renderReplicasAndScaleDialog() { - const { object: resource, showNotificationError, hideDetails } = this.props; - - if (this.showScaleDialog) { - return ( -
- -
- ); - } - - return ( -
-
- {resource.getDesiredReplicas()} -
-
- ); + @action + async onScaleSliderChangeCommitted(evt: React.FormEvent, replicas: number) { + this.sliderReplicasDisabled = true; + await this.scale(replicas); + this.sliderReplicasDisabled = false; } render() { @@ -121,8 +69,20 @@ class NonInjectedReplicationControllerDetails Spec - - {this.renderReplicasAndScaleDialog()} + +
+
{resource.getDesiredReplicas()}
+
Scale
+ this.sliderReplicasValue = value} + onChangeCommitted={(event, value) => this.onScaleSliderChangeCommitted(event, value as number)} + /> +
{ @@ -156,9 +116,7 @@ class NonInjectedReplicationControllerDetails(NonInjectedReplicationControllerDetails, { getProps: (di, props) => ({ ...props, - store: di.inject(replicationControllerStoreInjectable), api: di.inject(replicationControllerApiInjectable), showNotificationError: di.inject(showErrorNotificationInjectable), - hideDetails: di.inject(hideDetailsInjectable), }), });