Skip to content

Commit adadcb3

Browse files
Dobromir Hristovhqhhuang
andauthored
Change the tab-nav rendering to be v-show based (#613) rdar://108379797
* refactor: change the tab-nav rendering rdar://108379797 * chore: add tests and cleanup --------- Co-authored-by: Hanqing Huang <[email protected]>
1 parent 2deee43 commit adadcb3

File tree

2 files changed

+30
-24
lines changed

2 files changed

+30
-24
lines changed

src/components/ContentNode/TabNavigator.vue

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,18 @@
2020
</Tabnav>
2121
<div class="tabs-content">
2222
<div class="tabs-content-container">
23-
<transition name="fade">
24-
<div :key="currentTitle">
25-
<slot :name="currentTitle" />
26-
</div>
27-
</transition>
23+
<transition-group name="fade">
24+
<template v-for="title in titles">
25+
<div
26+
v-show="title === currentTitle"
27+
:key="title"
28+
:class="{ active: title === currentTitle }"
29+
class="tab-container"
30+
>
31+
<slot :name="title" />
32+
</div>
33+
</template>
34+
</transition-group>
2835
</div>
2936
</div>
3037
</div>
@@ -33,7 +40,6 @@
3340
<script>
3441
import Tabnav from 'docc-render/components/Tabnav.vue';
3542
import TabnavItem from 'docc-render/components/TabnavItem.vue';
36-
import ImageLoadingStrategy from 'docc-render/constants/ImageLoadingStrategy';
3743
3844
/**
3945
* Tab navigation component, that renders `ContentNode`,
@@ -47,9 +53,6 @@ export default {
4753
TabnavItem,
4854
Tabnav,
4955
},
50-
provide: {
51-
imageLoadingStrategy: ImageLoadingStrategy.eager,
52-
},
5356
props: {
5457
vertical: {
5558
type: Boolean,

tests/unit/components/ContentNode/TabNavigator.spec.js

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import TabNavigator from '@/components/ContentNode/TabNavigator.vue';
1212
import { mount } from '@vue/test-utils';
1313
import Tabnav from '@/components/Tabnav.vue';
1414
import TabnavItem from '@/components/TabnavItem.vue';
15-
import ImageLoadingStrategy from '@/constants/ImageLoadingStrategy';
1615
import { flushPromises } from '../../../../test-utils';
1716

1817
const titles = ['Long tab title', 'A Longer tab title', 'The Longest tab title'];
@@ -54,9 +53,13 @@ describe('TabNavigator.spec', () => {
5453
value: titles[0],
5554
});
5655
expect(wrapper.findAll(TabnavItem)).toHaveLength(3);
57-
expect(wrapper.find('.tabs-content').text()).toEqual('First');
58-
// eslint-disable-next-line no-underscore-dangle
59-
expect(wrapper.vm._provided).toHaveProperty('imageLoadingStrategy', ImageLoadingStrategy.eager);
56+
const tabs = wrapper.findAll('.tab-container');
57+
expect(tabs).toHaveLength(3);
58+
expect(tabs.at(0).classes()).toContain('active');
59+
expect(tabs.at(0).isVisible()).toBe(true);
60+
expect(tabs.at(1).classes()).not.toContain('active');
61+
expect(tabs.at(1).isVisible()).toBe(false);
62+
expect(tabs.at(0).text()).toEqual('First');
6063
});
6164

6265
it('sets the TabNavigator in `vertical` mode', async () => {
@@ -75,40 +78,40 @@ describe('TabNavigator.spec', () => {
7578
await flushPromises();
7679
const tabnav = wrapper.find(Tabnav);
7780
tabnav.vm.$emit('input', titles[1]);
78-
expect(wrapper.find('.tabs-content').text()).toBe('Second');
81+
expect(wrapper.find('.tab-container.active').text()).toBe('Second');
7982
expect(tabnav.props('value')).toEqual(titles[1]);
8083
});
8184

8285
it('selects the added tab when adding a tab', () => {
8386
const wrapper = createWrapper();
84-
expect(wrapper.find('.tabs-content').text()).toBe('First');
87+
expect(wrapper.find('.tab-container.active').text()).toBe('First');
8588

8689
wrapper.setProps({ titles: longerTitles });
87-
expect(wrapper.find('.tabs-content').text()).toBe('Fourth');
90+
expect(wrapper.find('.tab-container.active').text()).toBe('Fourth');
8891
const tabnav = wrapper.find(Tabnav);
8992
expect(tabnav.props('value')).toEqual(longerTitles[3]);
9093
});
9194

9295
it('selects first tab when deleting current tab', () => {
9396
const wrapper = createWrapper();
9497
wrapper.setProps({ titles: longerTitles });
95-
expect(wrapper.find('.tabs-content').text()).toBe('Fourth');
98+
expect(wrapper.find('.tab-container.active').text()).toBe('Fourth');
9699

97100
wrapper.setProps({ titles });
98-
expect(wrapper.find('.tabs-content').text()).toBe('First');
101+
expect(wrapper.find('.tab-container.active').text()).toBe('First');
99102
const tabnav = wrapper.find(Tabnav);
100103
expect(tabnav.props('value')).toEqual(titles[0]);
101104
});
102105

103106
it('keep currently selected tab when deleting a tab', () => {
104107
const wrapper = createWrapper();
105108
wrapper.setProps({ titles: longerTitles });
106-
expect(wrapper.find('.tabs-content').text()).toBe('Fourth'); // Current tab
109+
expect(wrapper.find('.tab-container.active').text()).toBe('Fourth'); // Current tab
107110

108111
const removedTitles = ['Long tab title',
109112
'A Longer tab title', 'added title'];
110113
wrapper.setProps({ titles: removedTitles });
111-
expect(wrapper.find('.tabs-content').text()).toBe('Fourth'); // Keeps current tab
114+
expect(wrapper.find('.tab-container.active').text()).toBe('Fourth'); // Keeps current tab
112115
const tabnav = wrapper.find(Tabnav);
113116
expect(tabnav.props('value')).toEqual(longerTitles[3]);
114117
});
@@ -117,23 +120,23 @@ describe('TabNavigator.spec', () => {
117120
const changedLastTab = ['Long tab title',
118121
'A Longer tab title', 'changed last tab'];
119122
const wrapper = createWrapper();
120-
expect(wrapper.find('.tabs-content').text()).toBe('First');
123+
expect(wrapper.find('.tab-container.active').text()).toBe('First');
121124
wrapper.setProps({ titles: changedLastTab });
122-
expect(wrapper.find('.tabs-content').text()).toBe('Last');
125+
expect(wrapper.find('.tab-container.active').text()).toBe('Last');
123126
let tabnav = wrapper.find(Tabnav);
124127
expect(tabnav.props('value')).toEqual(changedLastTab[2]);
125128

126129
const changedFirstTab = ['changed first tab',
127130
'A Longer tab title', 'changed last tab'];
128131
wrapper.setProps({ titles: changedFirstTab });
129-
expect(wrapper.find('.tabs-content').text()).toBe('First');
132+
expect(wrapper.find('.tab-container.active').text()).toBe('First');
130133
tabnav = wrapper.find(Tabnav);
131134
expect(tabnav.props('value')).toEqual(changedFirstTab[0]);
132135

133136
const changedMidTab = ['changed first tab',
134137
'changed middle tab', 'changed last tab'];
135138
wrapper.setProps({ titles: changedMidTab });
136-
expect(wrapper.find('.tabs-content').text()).toBe('Middle');
139+
expect(wrapper.find('.tab-container.active').text()).toBe('Middle');
137140
tabnav = wrapper.find(Tabnav);
138141
expect(tabnav.props('value')).toEqual(changedMidTab[1]);
139142
});

0 commit comments

Comments
 (0)