From 8c724fa59f56730b89f5f57095bb6e3a2cdf167e Mon Sep 17 00:00:00 2001 From: Thomas Allmer Date: Thu, 24 Oct 2019 10:58:42 +0200 Subject: [PATCH] fix(steps): always fire @enter only once --- packages/steps/src/LionStep.js | 4 +++- packages/steps/test/lion-steps.test.js | 21 +++++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/steps/src/LionStep.js b/packages/steps/src/LionStep.js index af7c407f1..5b866367b 100644 --- a/packages/steps/src/LionStep.js +++ b/packages/steps/src/LionStep.js @@ -119,8 +119,10 @@ export class LionStep extends LionLitElement { this.status = 'entered'; if (updateController === true) { this.controller.current = this.getControllerIndex(); + // controller will trigger enter() again which will dispatch the enter event + } else { + this.dispatchEvent(new CustomEvent('enter', { bubbles: true, composed: true })); } - this.dispatchEvent(new CustomEvent('enter', { bubbles: true, composed: true })); } leave() { diff --git a/packages/steps/test/lion-steps.test.js b/packages/steps/test/lion-steps.test.js index 65f2428fb..ce2ef4296 100644 --- a/packages/steps/test/lion-steps.test.js +++ b/packages/steps/test/lion-steps.test.js @@ -159,7 +159,7 @@ describe('lion-steps', () => { }); describe('events', () => { - it('will trigger lion-step @leave event before changing .current', async () => { + it('will fire lion-step @leave event before changing .current', async () => { let currentInLeaveEvent; const onLeave = ev => { currentInLeaveEvent = ev.target.controller.current; @@ -175,7 +175,7 @@ describe('lion-steps', () => { expect(currentInLeaveEvent).to.equal(0); }); - it('will trigger lion-step @enter event after changing .current', async () => { + it('will fire lion-step @enter event after changing .current', async () => { let currentInEnterEvent; const onEnter = ev => { currentInEnterEvent = ev.target.controller.current; @@ -190,6 +190,23 @@ describe('lion-steps', () => { el.next(); expect(currentInEnterEvent).to.equal(1); }); + + it('will fire initial @enter event only once if [initial-step] is not on first step', async () => { + const firstEnterSpy = sinon.spy(); + const secondEnterSpy = sinon.spy(); + await fixture(html` + + +
test1
+
+ +
test2
+
+
+ `); + expect(firstEnterSpy).to.not.have.been.called; + expect(secondEnterSpy).to.have.been.calledOnce; + }); }); describe('workflow with data and conditions', () => {