Skip to content

Commit ec5c441

Browse files
feat(tabs): extract the remove event to outside the remove-icon-btn (#3686)
* refactor(tabs): extract the remove event to outside the remove-icon-btn * fix(tab-nav-item): remove redundant class from CloseIcon component * chore: update common * test(tabs): enhance @remove event handling with separate callbacks for Tabs and TabPanel * fix(tabs): improve `@remove` event handling by separating event data for Tabs and TabPanel * fix(tabs): import missing TdTabPanelProps for proper type handling * chore: update common --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
1 parent c35a53e commit ec5c441

File tree

3 files changed

+29
-19
lines changed

3 files changed

+29
-19
lines changed

src/tabs/__tests__/index.test.jsx

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -174,16 +174,18 @@ describe('Tabs', () => {
174174
tabs.vm.$el.getElementsByClassName('t-tabs__nav-item')[0].click();
175175
expect(tabs.emitted().change).toBeTruthy();
176176
});
177+
177178
it('@remove', async () => {
178-
const fn = vi.fn();
179+
const onTabRemoveFn = vi.fn();
180+
const onTabPanelRemoveFn = vi.fn();
179181
const wrapper = mount({
180182
render() {
181183
return (
182-
<Tabs theme={'card'} onRemove={fn} value={2}>
183-
<TabPanel value={1} label={'1'} removable={true}>
184+
<Tabs theme={'card'} onRemove={onTabRemoveFn} value={2}>
185+
<TabPanel value={1} label={'1'} removable={true} onRemove={onTabPanelRemoveFn}>
184186
1
185187
</TabPanel>
186-
<TabPanel value={2} label={'2'} removable={true}>
188+
<TabPanel value={2} label={'2'} removable={true} onRemove={onTabPanelRemoveFn}>
187189
2
188190
</TabPanel>
189191
</Tabs>
@@ -193,7 +195,12 @@ describe('Tabs', () => {
193195
await Vue.nextTick();
194196
const tabs = wrapper.findComponent(Tabs);
195197
tabs.vm.$el.getElementsByClassName('remove-btn')[0].dispatchEvent(new Event('click'));
196-
expect(tabs.emitted().remove).toBeTruthy();
198+
199+
expect(onTabRemoveFn).toHaveBeenCalledTimes(1);
200+
expect(onTabPanelRemoveFn).toHaveBeenCalledTimes(1);
201+
202+
expect(onTabRemoveFn).toHaveBeenCalledWith({ value: 1, e: expect.any(Event), index: 0 });
203+
expect(onTabPanelRemoveFn).toHaveBeenCalledWith({ value: 1, e: expect.any(Event) });
197204
});
198205
});
199206

src/tabs/tab-nav-item.tsx

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,21 +56,24 @@ export default mixins(keepAnimationMixins, classPrefixMixins, getGlobalIconMixin
5656
e.stopPropagation();
5757
emitEvent<Parameters<(e: MouseEvent) => void>>(this, 'click', e);
5858
},
59-
renderCardItem(): VNode {
59+
removeBtn(): VNode {
6060
const { CloseIcon } = this.useGlobalIcon({ CloseIcon: TdCloseIcon });
6161

62+
return this.removable && !this.disabled ? (
63+
<span onClick={(e: MouseEvent) => this.removeBtnClick(e)} class="remove-btn">
64+
<CloseIcon />
65+
</span>
66+
) : null;
67+
},
68+
renderCardItem(): VNode {
6269
return (
6370
<div class={this.navItemClass} onClick={this.onClickNav} v-ripple={this.keepAnimation.ripple}>
6471
<span class={`${this.classPrefix}-tabs__nav-item-text-wrapper`}>{this.label}</span>
65-
{this.removable && !this.disabled ? (
66-
<CloseIcon class="remove-btn" nativeOnClick={this.removeBtnClick} />
67-
) : null}
72+
{this.removeBtn()}
6873
</div>
6974
);
7075
},
7176
renderNormalItem(): VNode {
72-
const { CloseIcon } = this.useGlobalIcon({ CloseIcon: TdCloseIcon });
73-
7477
return (
7578
<div class={this.navItemClass} onClick={this.onClickNav}>
7679
<div
@@ -85,9 +88,7 @@ export default mixins(keepAnimationMixins, classPrefixMixins, getGlobalIconMixin
8588
>
8689
<span class={`${this.classPrefix}-tabs__nav-item-text-wrapper`}>{this.label}</span>
8790
</div>
88-
{this.removable && !this.disabled ? (
89-
<CloseIcon class="remove-btn" nativeOnClick={this.removeBtnClick} />
90-
) : null}
91+
{this.removeBtn()}
9192
</div>
9293
);
9394
},

src/tabs/tabs.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { getVNodeComponentName, getVueComponentName } from '../utils/helper';
33
import props from './props';
44
import TTabPanel from './tab-panel';
55
import TTabNav from './tab-nav';
6-
import { TabValue, TdTabsProps } from './type';
6+
import { TabValue, TdTabPanelProps, TdTabsProps } from './type';
77
import { emitEvent } from '../utils/event';
88
import { getClassPrefixMixins } from '../config-provider/config-receiver';
99
import mixins from '../utils/mixins';
@@ -85,14 +85,16 @@ export default mixins(Vue as VueConstructor<TabParentInjectVue>, classPrefixMixi
8585

8686
onRemoveTab({ e, value, index }: Parameters<TdTabsProps['onRemove']>[0]) {
8787
const panel = this.panels[index];
88-
const eventData = {
88+
emitEvent<Parameters<TdTabsProps['onRemove']>>(this, 'remove', {
8989
value,
9090
index,
9191
e,
92-
};
93-
emitEvent<Parameters<TdTabsProps['onRemove']>>(this, 'remove', eventData);
92+
});
9493
if (!panel) return;
95-
emitEvent<Parameters<TdTabsProps['onRemove']>>(panel, 'remove', eventData);
94+
emitEvent<Parameters<TdTabPanelProps['onRemove']>>(panel, 'remove', {
95+
value,
96+
e,
97+
});
9698
},
9799
renderHeader() {
98100
const onDragSort = (context: Parameters<TdTabsProps['onDragSort']>[0]) => {

0 commit comments

Comments
 (0)