Skip to content

Commit 2e98905

Browse files
authored
Fix transition options inconsistency/bug (#261)
* Fix issue with transitionOptions using toggle and toggleClass Between leave() and enter() transitionOptions was inconsistent on how it handled the toggleClass/toggle option. Now excepting both options. * Speed up tests. Don't need to timeout that long
1 parent 9f93932 commit 2e98905

File tree

2 files changed

+69
-10
lines changed

2 files changed

+69
-10
lines changed

src/transition.js

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,7 @@ export async function transition(element, state, transitionOptions = {}) {
2121
// data-transition-leave-from="bg-opacity-80"
2222
// data-transition-leave-to="bg-opacity-0"
2323
export async function enter(element, transitionOptions = {}) {
24-
const transitionClasses = element.dataset.transitionEnter || transitionOptions.enter || 'enter'
25-
const fromClasses = element.dataset.transitionEnterFrom || transitionOptions.enterFrom || 'enter-from'
26-
const toClasses = element.dataset.transitionEnterTo || transitionOptions.enterTo || 'enter-to'
27-
const toggleClass = element.dataset.toggleClass || transitionOptions.toggleClass || 'hidden'
24+
const { transitionClasses, fromClasses, toClasses, toggleClass } = getTransitionOptions("Enter", element, transitionOptions)
2825

2926
return performTransitions(element, {
3027
firstFrame() {
@@ -44,10 +41,7 @@ export async function enter(element, transitionOptions = {}) {
4441
}
4542

4643
export async function leave(element, transitionOptions = {}) {
47-
const transitionClasses = element.dataset.transitionLeave || transitionOptions.leave || 'leave'
48-
const fromClasses = element.dataset.transitionLeaveFrom || transitionOptions.leaveFrom || 'leave-from'
49-
const toClasses = element.dataset.transitionLeaveTo || transitionOptions.leaveTo || 'leave-to'
50-
const toggleClass = element.dataset.toggleClass || transitionOptions.toggle || 'hidden'
44+
const { transitionClasses, fromClasses, toClasses, toggleClass } = getTransitionOptions("Leave", element, transitionOptions)
5145

5246
return performTransitions(element, {
5347
firstFrame() {
@@ -66,6 +60,15 @@ export async function leave(element, transitionOptions = {}) {
6660
})
6761
}
6862

63+
function getTransitionOptions(type, element, transitionOptions) {
64+
return {
65+
transitionClasses: element.dataset[`transition${type}`] || transitionOptions[type.toLowerCase()] || type.toLowerCase(),
66+
fromClasses: element.dataset[`transition${type}From`] || transitionOptions[`${type.toLowerCase()}From`] || `${type.toLowerCase()}-from`,
67+
toClasses: element.dataset[`transition${type}To`] || transitionOptions[`${type.toLowerCase()}To`] || `${type.toLowerCase()}-to`,
68+
toggleClass: element.dataset.toggleClass || transitionOptions.toggleClass || transitionOptions.toggle || 'hidden'
69+
}
70+
}
71+
6972
function setupTransition(element) {
7073
element._stimulus_transition = {
7174
timeout: null,

test/transition_test.js

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,37 @@ describe('Transition', () => {
112112
await nextFrame()
113113
expect(target.className.split(' ')).to.have.members(['foo', 'transition-opacity', 'ease-in-out', 'duration-100', 'opacity-0'])
114114

115-
await aTimeout(100)
115+
await aTimeout(0)
116116
expect(target.className.split(' ')).to.have.members(['foo', 'opacity-0', 'hidden'])
117117
})
118+
119+
it('parses transitionOptions properly', async () => {
120+
await fixture(html`
121+
<div id="my-div" class="opacity-100">
122+
This popover shows on hover
123+
</div>
124+
`)
125+
126+
const target = document.getElementById('my-div')
127+
128+
leave(target, {
129+
leave: 'transition-opacity ease-in-out duration-100',
130+
leaveFrom: 'opacity-100',
131+
leaveTo: 'opacity-0',
132+
toggleClass: 'my-hidden'
133+
})
134+
135+
expect(target.className.split(' ')).to.have.members(['opacity-100'])
136+
137+
await nextFrame()
138+
expect(target.className.split(' ')).to.have.members(['transition-opacity', 'ease-in-out', 'duration-100', 'opacity-100'])
139+
140+
await nextFrame()
141+
expect(target.className.split(' ')).to.have.members(['opacity-0', 'transition-opacity', 'ease-in-out', 'duration-100'])
142+
143+
await aTimeout(0)
144+
expect(target.className.split(' ')).to.have.members(['my-hidden', 'opacity-0'])
145+
})
118146
})
119147

120148
describe('enter()', () => {
@@ -131,9 +159,37 @@ describe('Transition', () => {
131159
await nextFrame()
132160
expect(target.className.split(' ')).to.have.members(['foo', 'transition-opacity', 'ease-in-out', 'duration-100', 'opacity-100'])
133161

134-
await aTimeout(100)
162+
await aTimeout(0)
135163
expect(target.className.split(' ')).to.have.members(['foo', 'opacity-100'])
136164
})
165+
166+
it('parses transitionOptions properly', async () => {
167+
await fixture(html`
168+
<div id="my-div" class="my-hidden">
169+
This popover shows on hover
170+
</div>
171+
`)
172+
173+
const target = document.getElementById('my-div')
174+
175+
enter(target, {
176+
enter: 'transition-opacity ease-in-out duration-100',
177+
enterFrom: 'opacity-0',
178+
enterTo: 'opacity-100',
179+
toggle: 'my-hidden'
180+
})
181+
182+
expect(target.className.split(' ')).to.have.members(['my-hidden'])
183+
184+
await nextFrame()
185+
expect(target.className.split(' ')).to.have.members(['opacity-0', 'transition-opacity', 'ease-in-out', 'duration-100'])
186+
187+
await nextFrame()
188+
expect(target.className.split(' ')).to.have.members(['transition-opacity', 'ease-in-out', 'duration-100', 'opacity-100'])
189+
190+
await aTimeout(0)
191+
expect(target.className.split(' ')).to.have.members(['opacity-100'])
192+
})
137193
})
138194

139195
describe('cancelTransition()', () => {

0 commit comments

Comments
 (0)