mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
* Turn on strict mode in tsconfig.json - Add route, clusterRoute, and payloadValidatedClusterRoute helper functions to improve types with backend routes - Turn on the following new lints: - react/jsx-first-prop-new-line - react/jsx-wrap-multilines - react/jsx-one-expression-per-line - react/jsx-max-props-per-line - react/jsx-indent - react/jsx-indent-props Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix build Signed-off-by: Sebastian Malton <sebastian@malton.name> * Replace KubeObject scope strings with enum Signed-off-by: Sebastian Malton <sebastian@malton.name> * Revert package.json version changes Signed-off-by: Sebastian Malton <sebastian@malton.name> * revert move hostedCluster(Id) Signed-off-by: Sebastian Malton <sebastian@malton.name> * change some type param names to be not single letters Signed-off-by: Sebastian Malton <sebastian@malton.name> * remove copy-extension-themes Signed-off-by: Sebastian Malton <sebastian@malton.name> * add new make clean action Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix build to not use webpack for generating types Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix kube-object-menu.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix select.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix catalog.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * revert move fileNameMigration to index Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix ref logic error Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix log-resource-selector.test.tsx tests Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix dock-store.test.ts test by overriding createStorage to not touch file system Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix cluster.test.ts tests Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix kube=api.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fixed hotbar-store.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix kubeconfig-manager.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix cluster-role-bindings/__tests__/dialog.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix role-bindings/__tests__/dialog.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix pods.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix delete-cluster-dialog.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix daemonset.store.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix replicaset.store.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix statefulsets/dialog/dialog.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix replicasets/scale-dialog/dialog.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix deployments.store.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix deployments/scale/dialog.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix cronjob.store.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix stateful-set.api.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix deployment.api.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix api-manager.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix statefulset.store.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix job.store.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix pods.store.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix scroll-spy.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix hotbar-remove-command.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix catalog-entity-registry.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix welcome.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix verify-that-all-routes-have-route-component.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix pod-tolerations.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * better fix for previous 3 fixes, plus also select.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix kube-object-menu.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix app-paths.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix dock-tabs.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix isReactNode typing Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix sub-title.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix drawer.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix list-layout.tsx and header.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix error-boundary.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix upgrade-chart/store.ts and dock-tab.store.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix install-chart/store.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix edit-resource/store.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix create-resource/store.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix namespace-select.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix namespace-select-filter.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix crd-list.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix wrong types for extensions Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix circular dependency Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix circular dependency on catalogCategoryRegistry Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix api-kube Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix type errors, most <Select /> errors Signed-off-by: Sebastian Malton <sebastian@malton.name> * fixing more type errors Signed-off-by: Sebastian Malton <sebastian@malton.name> * some more fixing type errors Signed-off-by: Sebastian Malton <sebastian@malton.name> * convert all KubeApis to injectable with legacy global backups Signed-off-by: Sebastian Malton <sebastian@malton.name> * factor out into a common file all the exports Signed-off-by: Sebastian Malton <sebastian@malton.name> * convert all KubeObjectStores to injectable with legacy global backups Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix lint Signed-off-by: Sebastian Malton <sebastian@malton.name> * remove unused legacy KubeApi globals Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix bad previous commit Signed-off-by: Sebastian Malton <sebastian@malton.name> * more crash fixing Signed-off-by: Sebastian Malton <sebastian@malton.name> * try and fix behavioural tests Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix sidebar-and-tab-navigation-for-core.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix sidebar-and-tab-navigation-for-extensions.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix navigation-using-application-menu.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix catalog.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * Make ThemeStore non-singleton and fix navigation-to-terminal-preferences.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * extensions.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix catalog-entity-registry.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix navigation-using-application-menu.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix log-resource-selector.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix dock-tabs.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix delete-cluster-dialog.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix navigation-to-kubernetes-preferences.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix navigation-to-editor-preferences.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix navigation-to-proxy-preferences.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix navigation-using-application-menu.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix navigation-to-application-preferences.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix dock-store.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix select.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix role-bindings/__tests__/dialog.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix hotbar-remove-command.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix cluster-role-bindings/__tests__/dialog.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix navigation-to-extension-specific-preferences.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix navigation-to-telemetry-preferences.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix closing-preferences.test.tsx Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix navigation-to-editor-preferences.test.ts Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix navigation-to-proxy-preferences.test.ts - Fix other type errors too Signed-off-by: Sebastian Malton <sebastian@malton.name> * final tweaks Signed-off-by: Sebastian Malton <sebastian@malton.name> * Add more tsconfig files, fix bug in <Catalog> - Make all of history, navigation injectable Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix type errors Signed-off-by: Sebastian Malton <sebastian@malton.name> * Convert all of kube-details-params/ and navigate/ to injectable - This fixes a runtime error that was encountered during testing Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix runtime errors on renderer - remove all static uses of `createPageParam` (and then removed the legacy global) - Made LensRendererExtension and LensMainExtension just used dependencies and not the getLegacyDi - Fixed circular dep in extension-loader Signed-off-by: Sebastian Malton <sebastian@malton.name> * Move registerStore calls to after injectMany Signed-off-by: Sebastian Malton <sebastian@malton.name> * replace all the rest of the legacy uses of apiManager Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix stack overflow and cycles in DI Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix NamespaceSelectFilter not opening Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix WizardStep and AddNamespaceDialog Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix KubeApi's not being registered Signed-off-by: Sebastian Malton <sebastian@malton.name> * cleanup WindowManager Signed-off-by: Sebastian Malton <sebastian@malton.name> * Proper fix for Wizard, fix NamespaceStore.subscribe Signed-off-by: Sebastian Malton <sebastian@malton.name> * Rewrite withTooltip to be more type correct - Fixes mobx related "too many recursive actions" error - Change all the uses of withTooltips to be functional components Signed-off-by: Sebastian Malton <sebastian@malton.name> * Add e2e test to cover kube api registration Signed-off-by: Sebastian Malton <sebastian@malton.name> * cleanup internal-commands Signed-off-by: Sebastian Malton <sebastian@malton.name> * remove cast in <Animate> Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix command-palette e2e test Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix type error after rebase Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix test name Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix lint Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix code to help CodeQL scanner Signed-off-by: Sebastian Malton <sebastian@malton.name> * update intree extension lock files Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix build-extensions picking wrong @types/react Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix tests from rebase Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix type error Signed-off-by: Sebastian Malton <sebastian@malton.name> * Make KubeconfigSyncManager more injectable Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix crash in test mode for Dialog Signed-off-by: Sebastian Malton <sebastian@malton.name> * make Select snapshots deterministic Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix new type error Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix kube-object.store.test.ts typing Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix merge build issues Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix snapshots after merge Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix lint after merge Signed-off-by: Sebastian Malton <sebastian@malton.name> * reexport BaseKubeJsonApiObjectMetadata Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix typo in terminalSpawningPool Signed-off-by: Sebastian Malton <sebastian@malton.name> * remove duplicate license header Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix typo to waitUntilDefined Signed-off-by: Sebastian Malton <sebastian@malton.name> * remove iter use from getLegacyGlobalDiForExtensionApi Signed-off-by: Sebastian Malton <sebastian@malton.name> * remove complex createStorage override Signed-off-by: Sebastian Malton <sebastian@malton.name> * override logger with mocks only when needed for tests Signed-off-by: Sebastian Malton <sebastian@malton.name> * remove specialized overrideStore flags for getDiForUnitTesting Signed-off-by: Sebastian Malton <sebastian@malton.name> * remove unnecessary | undefined types from the exactOptionalFieldTypes experiment Signed-off-by: Sebastian Malton <sebastian@malton.name> * use more descriptive name for local test mocks Signed-off-by: Sebastian Malton <sebastian@malton.name> * remove unnecessary addition to 'make clean' target Signed-off-by: Sebastian Malton <sebastian@malton.name> * remove oddity of KubeObjectStore.getById(undefined) being allowed Signed-off-by: Sebastian Malton <sebastian@malton.name> * rename KubeObject.getDescriptor in favour of name without fundemental JS meaning Signed-off-by: Sebastian Malton <sebastian@malton.name> * Simplify legacyRegisterApi when working in behaviour unit tests - Don't emit within main environment as there should be no auto registering there Signed-off-by: Sebastian Malton <sebastian@malton.name> * change confusing variable name in ReactiveDuration Signed-off-by: Sebastian Malton <sebastian@malton.name> * make visitor pattern more explicit for Entity contextMenuOpen Signed-off-by: Sebastian Malton <sebastian@malton.name> * toggleDetails -> toggleKubeDetailsPane is more specific Signed-off-by: Sebastian Malton <sebastian@malton.name> * remove outdated comment Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix bug where LensExtension dependencies are not set Signed-off-by: Sebastian Malton <sebastian@malton.name> * Fix tests from the revert of react 18 Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix more tests from merge Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix typings with new is-compatible-extension tests Signed-off-by: Sebastian Malton <sebastian@malton.name> * more type fixing Signed-off-by: Sebastian Malton <sebastian@malton.name> * Revert in-tree extension versions Signed-off-by: Sebastian Malton <sebastian@malton.name> * Improve name of guarding injectable for stores and apis - New name better implies that it is just a guard state and does not do anything Signed-off-by: Sebastian Malton <sebastian@malton.name> * Add helper for <Select>.isMulti for storing in a Set<Value> Signed-off-by: Sebastian Malton <sebastian@malton.name> * fix is-compatible-extension.test.ts types Signed-off-by: Sebastian Malton <sebastian@malton.name>
261 lines
7.3 KiB
TypeScript
Executable File
261 lines
7.3 KiB
TypeScript
Executable File
/**
|
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
|
*/
|
|
|
|
import "./wizard.scss";
|
|
import React from "react";
|
|
import { cssNames, prevDefault } from "../../utils";
|
|
import { Button } from "../button";
|
|
import { Stepper } from "../stepper";
|
|
import { SubTitle } from "../layout/sub-title";
|
|
import { Spinner } from "../spinner";
|
|
import { debounce } from "lodash";
|
|
|
|
export interface WizardCommonProps<D> {
|
|
data?: Partial<D>;
|
|
save?: (data: Partial<D>, callback?: () => void) => void;
|
|
reset?: () => void;
|
|
done?: () => void;
|
|
hideSteps?: boolean;
|
|
}
|
|
|
|
export interface WizardProps<D> extends WizardCommonProps<D> {
|
|
className?: string;
|
|
step?: number;
|
|
title?: string;
|
|
header?: React.ReactNode;
|
|
onChange?: (step: number) => void;
|
|
children?: React.ReactElement<WizardStepProps<D>>[] | React.ReactElement<WizardStepProps<D>>;
|
|
}
|
|
|
|
interface State {
|
|
step: number;
|
|
}
|
|
|
|
export class Wizard<D> extends React.Component<WizardProps<D>, State> {
|
|
public state: State = {
|
|
step: this.getValidStep(this.props.step ?? 0),
|
|
};
|
|
|
|
get steps(): React.ReactElement<WizardStepProps<D>>[] {
|
|
const { className, title, step, header, onChange, children, ...commonProps } = this.props;
|
|
const steps = React.Children.toArray(children) as React.ReactElement<WizardStepProps<D>>[];
|
|
|
|
return steps
|
|
.filter(step => !step.props.skip)
|
|
.map((stepElem, i) => (
|
|
React.cloneElement(stepElem, {
|
|
step: i + 1,
|
|
wizard: this,
|
|
next: this.nextStep,
|
|
prev: this.prevStep,
|
|
first: this.firstStep,
|
|
last: this.lastStep,
|
|
isFirst: this.isFirstStep,
|
|
isLast: this.isLastStep,
|
|
...commonProps,
|
|
...stepElem.props,
|
|
})
|
|
));
|
|
}
|
|
|
|
get step() {
|
|
return this.state.step;
|
|
}
|
|
|
|
set step(step: number) {
|
|
step = this.getValidStep(step);
|
|
if (step === this.step) return;
|
|
|
|
this.setState({ step }, () => {
|
|
this.props.onChange?.(step);
|
|
});
|
|
}
|
|
|
|
protected getValidStep(step: number) {
|
|
return Math.min(Math.max(1, step), this.steps.length) || 1;
|
|
}
|
|
|
|
isFirstStep = () => this.step === 1;
|
|
isLastStep = () => this.step === this.steps.length;
|
|
firstStep = (): any => this.step = 1;
|
|
nextStep = (): any => this.step++;
|
|
prevStep = (): any => this.step--;
|
|
lastStep = (): any => this.step = this.steps.length;
|
|
|
|
render() {
|
|
const { className, title, header, hideSteps } = this.props;
|
|
const steps = this.steps.map(stepElem => ({ title: stepElem.props.title }));
|
|
const step = React.cloneElement(this.steps[this.step - 1]);
|
|
|
|
return (
|
|
<div className={cssNames("Wizard", className)}>
|
|
<div className="header">
|
|
{header}
|
|
{title ? <SubTitle title={title} /> : null}
|
|
{!hideSteps && steps.length > 1 ? <Stepper steps={steps} step={this.step} /> : null}
|
|
</div>
|
|
{step}
|
|
</div>
|
|
);
|
|
}
|
|
}
|
|
|
|
export interface WizardStepProps<D> extends WizardCommonProps<D> {
|
|
wizard?: Wizard<D>;
|
|
title?: string;
|
|
className?: string | object;
|
|
contentClass?: string | object;
|
|
customButtons?: React.ReactNode; // render custom buttons block in footer
|
|
moreButtons?: React.ReactNode; // add more buttons to section in the footer
|
|
loading?: boolean; // indicator of loading content for the step
|
|
waiting?: boolean; // indicator of waiting response before going to next step
|
|
disabledNext?: boolean; // disable next button flag, e.g when filling step is not finished
|
|
hideNextBtn?: boolean;
|
|
hideBackBtn?: boolean;
|
|
step?: number;
|
|
prevLabel?: React.ReactNode; // custom label for prev button
|
|
nextLabel?: React.ReactNode; // custom label for next button
|
|
next?: () => void | boolean | Promise<any>; // custom action for next button
|
|
prev?: () => void; // custom action for prev button
|
|
first?: () => void;
|
|
last?: () => void;
|
|
isFirst?: () => boolean;
|
|
isLast?: () => boolean;
|
|
beforeContent?: React.ReactNode;
|
|
afterContent?: React.ReactNode;
|
|
noValidate?: boolean; // no validate form attribute
|
|
skip?: boolean; // don't render the step
|
|
scrollable?: boolean;
|
|
children?: React.ReactNode | React.ReactNode[];
|
|
}
|
|
|
|
interface WizardStepState {
|
|
waiting?: boolean;
|
|
}
|
|
|
|
export class WizardStep<D> extends React.Component<WizardStepProps<D>, WizardStepState> {
|
|
private form: HTMLFormElement | null = null;
|
|
public state: WizardStepState = {};
|
|
private unmounting = false;
|
|
|
|
static defaultProps: WizardStepProps<any> = {
|
|
scrollable: true,
|
|
};
|
|
|
|
componentWillUnmount() {
|
|
this.unmounting = true;
|
|
}
|
|
|
|
prev = () => {
|
|
const { isFirst, prev, done } = this.props;
|
|
|
|
if (isFirst?.() && done) done();
|
|
else prev?.();
|
|
};
|
|
|
|
next = () => {
|
|
const next = this.props.next;
|
|
const nextStep = this.props.wizard?.nextStep;
|
|
|
|
if (nextStep !== next) {
|
|
const result = next?.();
|
|
|
|
if (result instanceof Promise) {
|
|
this.setState({ waiting: true });
|
|
result.then(nextStep).finally(() => {
|
|
if (this.unmounting) return;
|
|
this.setState({ waiting: false });
|
|
});
|
|
}
|
|
else if (typeof result === "boolean" && result) {
|
|
nextStep?.();
|
|
}
|
|
}
|
|
else {
|
|
nextStep?.();
|
|
}
|
|
};
|
|
|
|
//because submit MIGHT be called through pressing enter, it might be fired twice.
|
|
//we'll debounce it to ensure it isn't
|
|
submit = debounce(() => {
|
|
if (!this.form) {
|
|
return;
|
|
}
|
|
|
|
if (this.form.noValidate || this.form.checkValidity()) {
|
|
this.next();
|
|
}
|
|
}, 100);
|
|
|
|
renderLoading() {
|
|
return (
|
|
<div className="step-loading flex center">
|
|
<Spinner />
|
|
</div>
|
|
);
|
|
}
|
|
|
|
//make sure we call submit if the "enter" keypress doesn't trigger the events
|
|
keyDown(evt: React.KeyboardEvent<HTMLElement>) {
|
|
if (evt.shiftKey || evt.metaKey || evt.altKey || evt.ctrlKey || evt.repeat) {
|
|
return;
|
|
}
|
|
|
|
if(evt.key === "Enter"){
|
|
this.submit();
|
|
}
|
|
}
|
|
|
|
render() {
|
|
const {
|
|
step, isFirst, isLast, children,
|
|
loading, customButtons, disabledNext, scrollable,
|
|
hideNextBtn, hideBackBtn, beforeContent, afterContent, noValidate, skip, moreButtons,
|
|
waiting, className, contentClass, prevLabel, nextLabel,
|
|
} = this.props;
|
|
|
|
if (skip) {
|
|
return null;
|
|
}
|
|
|
|
return (
|
|
<form
|
|
className={cssNames(`WizardStep step${step}`, className)}
|
|
onSubmit={prevDefault(this.submit)}
|
|
noValidate={noValidate}
|
|
onKeyDown={(evt) => this.keyDown(evt)}
|
|
ref={e => this.form = e}
|
|
>
|
|
{beforeContent}
|
|
<div className={cssNames("step-content", { scrollable }, contentClass)}>
|
|
{loading ? this.renderLoading() : children}
|
|
</div>
|
|
{customButtons ?? (
|
|
<div className="buttons flex gaps align-center">
|
|
{moreButtons}
|
|
<Button
|
|
className="back-btn"
|
|
plain
|
|
label={prevLabel || (isFirst?.() ? "Cancel" : "Back")}
|
|
hidden={hideBackBtn}
|
|
onClick={this.prev}
|
|
/>
|
|
<Button
|
|
primary
|
|
type="submit"
|
|
label={nextLabel || (isLast?.() ? "Submit" : "Next")}
|
|
hidden={hideNextBtn}
|
|
waiting={waiting ?? this.state.waiting}
|
|
disabled={disabledNext}
|
|
/>
|
|
</div>
|
|
)}
|
|
{afterContent}
|
|
</form>
|
|
);
|
|
}
|
|
}
|