Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
195 changes: 195 additions & 0 deletions packages-private/vapor-e2e-test/__tests__/transition-group.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -603,6 +603,81 @@ describe('vapor transition-group', () => {
E2E_TIMEOUT,
)

test('keyed component move after key change', async () => {
const btnSelector = '.keyed-component-move-after-key-change > button'
const containerSelector = '.keyed-component-move-after-key-change > div'

await expect
.element(css(containerSelector))
.toContainHTML(
`<div class="item-wrapper">` +
`<div class="item closed" id="item-1"><div class="item-inner">item 1</div></div>` +
`<div class="item closed" id="item-2"><div class="item-inner">item 2</div></div>` +
`<!--for--></div><!--transition-group-->`,
)

click(btnSelector)
await nextTick()
await nextFrame()

await expect
.element(css(containerSelector))
.toContainHTML(
`<div class="item-wrapper">` +
`<div class="item closed group-leave-from group-leave-active" id="item-1"><div class="item-inner">item 1</div></div>` +
`<div class="item opened group-enter-from group-enter-active" id="item-1"><div class="item-inner">item 1</div></div>` +
`<div class="item closed group-move" id="item-2" style=""><div class="item-inner">item 2</div></div>` +
`<!--for--></div><!--transition-group-->`,
)

await transitionFinish()
await expect
.element(css(containerSelector))
.toContainHTML(
`<div class="item-wrapper">` +
`<div class="item opened" id="item-1"><div class="item-inner">item 1</div></div>` +
`<div class="item closed" id="item-2" style=""><div class="item-inner">item 2</div></div>` +
`<!--for--></div><!--transition-group-->`,
)
})

test('same-key component move after prop change', async () => {
const btnSelector = '.same-key-component-move-after-prop-change > button'
const containerSelector = '.same-key-component-move-after-prop-change > div'

await expect
.element(css(containerSelector))
.toContainHTML(
`<div class="item-wrapper">` +
`<div class="item closed" id="item-1"><div class="item-inner">item 1</div></div>` +
`<div class="item closed" id="item-2"><div class="item-inner">item 2</div></div>` +
`<!--for--></div><!--transition-group-->`,
)

click(btnSelector)
await nextTick()
await nextFrame()

await expect
.element(css(containerSelector))
.toContainHTML(
`<div class="item-wrapper">` +
`<div class="item opened" id="item-1"><div class="item-inner">item 1</div></div>` +
`<div class="item closed group-move" id="item-2" style=""><div class="item-inner">item 2</div></div>` +
`<!--for--></div><!--transition-group-->`,
)

await transitionFinish(350)
await expect
.element(css(containerSelector))
.toContainHTML(
`<div class="item-wrapper">` +
`<div class="item opened" id="item-1"><div class="item-inner">item 1</div></div>` +
`<div class="item closed" id="item-2" style=""><div class="item-inner">item 2</div></div>` +
`<!--for--></div><!--transition-group-->`,
)
})

test('dynamic name', async () => {
const btnSelector = '.dynamic-name button.toggleBtn'
const btnChangeName = '.dynamic-name button.changeNameBtn'
Expand Down Expand Up @@ -946,6 +1021,88 @@ describe('vapor transition-group', () => {
E2E_TIMEOUT,
)

test(
'root slot component move',
async () => {
const btnSelector = '.root-slot-component-move > button'
const containerSelector = '.root-slot-component-move > div'

await expect
.element(css(containerSelector))
.toContainHTML(
`<div class="test">a</div>` +
`<div class="test">b</div>` +
`<div class="test">c</div>` +
`<!--for--><!--slot--><!--transition-group-->`,
)

click(btnSelector)
await nextTick()
await nextFrame()
expect(html(containerSelector)).toContain(
`<div class="test group-enter-from group-enter-active">d</div>` +
`<div class="test">b</div>` +
`<div class="test group-move" style="">a</div>` +
`<div class="test group-leave-from group-leave-active group-move" style="">c</div>` +
`<!--for--><!--slot--><!--transition-group-->`,
)

await transitionFinish()
await expect
.element(css(containerSelector))
.toContainHTML(
`<div class="test">d</div>` +
`<div class="test">b</div>` +
`<div class="test" style="">a</div>`,
)
},
E2E_TIMEOUT,
)

test(
'async root slot component move',
async () => {
const btnSelector = '.async-root-slot-component-move > button'
const containerSelector = '.async-root-slot-component-move > div'

await waitForInnerHTML(
containerSelector,
`<div class="test">a</div>` +
`<div class="test">b</div>` +
`<div class="test">c</div>`,
)
await expect
.element(css(containerSelector))
.toContainHTML(
`<div class="test">a</div>` +
`<div class="test">b</div>` +
`<div class="test">c</div>` +
`<!--for--><!--slot--><!--async component--><!--transition-group-->`,
)

click(btnSelector)
await nextTick()
await nextFrame()
expect(html(containerSelector)).toContain(
`<div class="test group-enter-from group-enter-active">d</div>` +
`<div class="test">b</div>` +
`<div class="test group-move" style="">a</div>` +
`<div class="test group-leave-from group-leave-active group-move" style="">c</div>` +
`<!--for--><!--slot--><!--async component--><!--transition-group-->`,
)

await transitionFinish()
await expect
.element(css(containerSelector))
.toContainHTML(
`<div class="test">d</div>` +
`<div class="test">b</div>` +
`<div class="test" style="">a</div>`,
)
},
E2E_TIMEOUT,
)

describe('interop', () => {
test(
'avoid set transition hooks for comment node',
Expand Down Expand Up @@ -1096,5 +1253,43 @@ describe('vapor transition-group', () => {
`<div class=""><div>d</div></div>`,
)
})

test('keyed vdom component move after key change', async () => {
const btnSelector = '.keyed-vdom-component-move-after-key-change > button'
const containerSelector =
'.keyed-vdom-component-move-after-key-change > div'

await expect
.element(css(containerSelector))
.toContainHTML(
`<div class="item-wrapper">` +
`<div class="item closed" id="item-1"><div class="item-inner">item 1</div></div>` +
`<div class="item closed" id="item-2"><div class="item-inner">item 2</div></div>` +
`<!--for--></div><!--transition-group-->`,
)

click(btnSelector)
await nextTick()
await nextFrame()

await expect
.element(css(containerSelector))
.toContainHTML(
`<div class="item-wrapper">` +
`<div class="item opened" id="item-1"><div class="item-inner">item 1</div></div>` +
`<div class="item closed group-move" id="item-2" style=""><div class="item-inner">item 2</div></div>` +
`<!--for--></div><!--transition-group-->`,
)
Comment thread
coderabbitai[bot] marked this conversation as resolved.

await transitionFinish(350)
await expect
.element(css(containerSelector))
.toContainHTML(
`<div class="item-wrapper">` +
`<div class="item opened" id="item-1"><div class="item-inner">item 1</div></div>` +
`<div class="item closed" id="item-2" style=""><div class="item-inner">item 2</div></div>` +
`<!--for--></div><!--transition-group-->`,
)
})
})
})
38 changes: 38 additions & 0 deletions packages-private/vapor-e2e-test/__tests__/vdomInterop.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,44 @@ describe('vdom transition', () => {
},
E2E_TIMEOUT,
)

test('keyed vapor component move after key change', async () => {
const btnSelector = '.trans-group-vapor-component-move > button'
const containerSelector = '.trans-group-vapor-component-move > div'

await expect
.element(css(containerSelector))
.toContainHTML(
`<div class="item-wrapper">` +
`<div class="item closed" id="item-1"><div class="item-inner">item 1</div></div>` +
`<div class="item closed" id="item-2"><div class="item-inner">item 2</div></div>` +
`</div>`,
)

click(btnSelector)
await nextTick()
await nextFrame()

await expect
.element(css(containerSelector))
.toContainHTML(
`<div class="item-wrapper">` +
`<div class="item closed group-leave-from group-leave-active" id="item-1"><div class="item-inner">item 1</div></div>` +
`<div class="item opened group-enter-from group-enter-active" id="item-1"><div class="item-inner">item 1</div></div>` +
`<div class="item closed group-move" id="item-2" style=""><div class="item-inner">item 2</div></div>` +
`</div>`,
)

await transitionFinish()
await expect
.element(css(containerSelector))
.toContainHTML(
`<div class="item-wrapper">` +
`<div class="item opened" id="item-1"><div class="item-inner">item 1</div></div>` +
`<div class="item closed" id="item-2" style=""><div class="item-inner">item 2</div></div>` +
`</div>`,
)
})
})

describe('vdom transition-group', () => {
Expand Down
2 changes: 2 additions & 0 deletions packages-private/vapor-e2e-test/interop/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import VaporComp from './components/VaporComp.vue'
import VaporCompA from '../transition/components/VaporCompA.vue'
import VdomComp from '../transition/components/VdomComp.vue'
import VaporSlot from '../transition/components/VaporSlot.vue'
import VdomTransitionGroup from './components/VdomTransitionGroup.vue'

const msg = ref('hello')
const passSlot = ref(true)
Expand Down Expand Up @@ -67,5 +68,6 @@ const enterClick = () => items.value.push('d', 'e')
</transition-group>
</div>
</div>
<VdomTransitionGroup />
</div>
</template>
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<script setup lang="ts">
import { ref } from 'vue'
import VaporExpandingItem from '../../transition-group/components/VaporExpandingItem.vue'

const items = ref(
[...Array(2)].map((_, i) => ({
id: i + 1,
isOpened: false,
})),
)

function toggleExpansion() {
items.value[0].isOpened = !items.value[0].isOpened
}
</script>

<template>
<div class="trans-group-vapor-component-move">
<button @click="toggleExpansion">toggle expansion of first element</button>
<div>
<transition-group name="group" tag="div" class="item-wrapper">
<VaporExpandingItem
v-for="i in items"
:key="`${i.id}-${i.isOpened ? 'true' : 'false'}`"
:id="i.id"
:is-opened="i.isOpened"
/>
</transition-group>
</div>
</div>
</template>

<style>
.item-wrapper {
display: flex;
flex-wrap: wrap;
gap: 5px;
width: 430px;
}

.group-move,
.group-enter-active,
.group-leave-active {
transition: all 50ms cubic-bezier(0.55, 0, 0.1, 1);
}

.group-leave-active {
position: absolute;
}
</style>
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<script setup vapor>
import { ref } from 'vue'
import VdomExpandingItem from '../../components/VdomExpandingItem.vue'

const items = ref(
[...Array(2)].map((_, i) => ({
id: i + 1,
isOpened: false,
})),
)

function toggleExpansion() {
items.value[0].isOpened = !items.value[0].isOpened
}
</script>

<template>
<div class="keyed-vdom-component-move-after-key-change">
<button @click="toggleExpansion">toggle expansion of first element</button>
<div>
<transition-group name="group" tag="div" class="item-wrapper">
<VdomExpandingItem
v-for="i in items"
:key="`${i.id}-${i.isOpened ? 'true' : 'false'}`"
:id="i.id"
:is-opened="i.isOpened"
/>
</transition-group>
</div>
</div>
</template>

<style>
.item-wrapper {
display: flex;
flex-wrap: wrap;
gap: 5px;
width: 430px;
}

.keyed-vdom-component-move-after-key-change .group-move {
transition: transform 300ms ease;
}
</style>
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<script setup vapor>
import { defineVaporAsyncComponent, ref } from 'vue'
import RootSlot from '../../components/RootSlot.vue'

const AsyncRootSlot = defineVaporAsyncComponent(() => Promise.resolve(RootSlot))
const items = ref(['a', 'b', 'c'])
const moveClick = () => (items.value = ['d', 'b', 'a'])
</script>

<template>
<div class="async-root-slot-component-move">
<button @click="moveClick">async root slot button</button>
<div>
<transition-group name="group">
<AsyncRootSlot key="async-root-slot">
<div v-for="item in items" :key="item" class="test">{{ item }}</div>
</AsyncRootSlot>
</transition-group>
</div>
</div>
</template>
Loading
Loading