React Stepper - Cancel a Step Change
You can cancel a step change in the Stepper onSelectionChanging event handler. To do this, assign a Boolean value or Promise that returns a Boolean to SelectionChangingEvent.cancel. The code snippet below implements a DevExtreme confirm dialog that asks users for confirmation before moving the component's selected step back.
jQuery
index.js
$("#stepper").dxStepper({ // ... onSelectionChanging: function (e) { const { component, addedItems, removedItems } = e; const { items = [] } = component.option(); const removedIndex = items.findIndex((item) => item === removedItems[0]); const addedIndex = items.findIndex((item) => item === addedItems[0]); const isMoveBack = addedIndex < removedIndex; if (isMoveBack) { e.cancel = DevExpress.ui.dialog .confirm(`<div>Are you sure you want to go back?</div>`. "") .then((isChangeConfirmed) => { return !isChangeConfirmed; }); } } })
Angular
app.component.html
app.component.ts
<dx-stepper (onSelectionChanging)="handleSelectionChanging($event)" > <dxi-stepper-item *ngFor="let step of steps" [label]="step.label" [icon]="step.icon" [optional]="step.optional" ></dxi-stepper-item> </dx-stepper>
import { DxStepperModule } from 'devextreme-angular'; import { DxStepperTypes } from "devextreme-angular/ui/stepper"; import { confirm } from 'devextreme/ui/dialog'; // ... export class AppComponent { handleSelectionChanging(e: DxStepperTypes.SelectionChangingEvent) { const { component, addedItems, removedItems } = e; const { items = [] } = component.option(); const removedIndex = items.findIndex((item) => item === removedItems[0]); const addedIndex = items.findIndex((item) => item === addedItems[0]); const isMoveBack = addedIndex < removedIndex; if (isMoveBack) { e.cancel = confirm(`<div>Are you sure you want to go back?</div>`, '') .then((isConfirmed) => { return !isConfirmed; }); } } }
Vue
App.vue
<script setup> import { DxStepper, DxItem, DxStepperTypes } from "devextreme-vue/stepper" import { confirm } from 'devextreme/ui/dialog'; function handleSelectionChanging(e: DxStepperTypes.SelectionChangingEvent) { const { component, addedItems, removedItems } = e; const { items = [] } = component.option(); const removedIndex = items.findIndex((item) => item === removedItems[0]); const addedIndex = items.findIndex((item) => item === addedItems[0]); const isMoveBack = addedIndex < removedIndex; if (isMoveBack) { e.cancel = confirm(`<div>Are you sure you want to go back?</div>`, '') .then((isConfirmed) => { return !isConfirmed; }); } } </script> <template> <DxStepper @selection-changing="handleSelectionChanging"> <DxItem v-for="step in steps"/> </DxStepper> </template>
React
App.tsx
import { useCallback } from 'react'; import { Stepper, Item, type StepperTypes } from 'devextreme-react/stepper'; import { confirm } from 'devextreme/ui/dialog'; function App() { const handleSelectionChanging = useCallback((e: StepperTypes.SelectionChangingEvent) => { const { component, addedItems, removedItems } = e; const { items = [] } = component.option(); const removedIndex = items.findIndex((item) => item === removedItems[0]); const addedIndex = items.findIndex((item) => item === addedItems[0]); const isMoveBack = addedIndex < removedIndex; if (isMoveBack) { e.cancel = confirm(`<div>Are you sure you want to go back?</div>`, "") .then((isConfirmed) => { return !isConfirmed; }); } }) return ( <> <Stepper onSelectionChanging={handleSelectionChanging}> {steps.map((step, index) => ( <Item key={index} label={step.label} icon={step.icon} optional={step.optional} /> ))} </Stepper> </> ) }
Feel free to share topic-related thoughts here.
If you have technical questions, please create a support ticket in the DevExpress Support Center.
Thank you for the feedback!
If you have technical questions, please create a support ticket in the DevExpress Support Center.