Skip to content

Commit 7249ef2

Browse files
authored
Merge branch 'main' into jl/bump-multichain-api-client-0.2.0
2 parents 1e20447 + 9ad3001 commit 7249ef2

File tree

5 files changed

+115
-41
lines changed

5 files changed

+115
-41
lines changed

ui/components/ui/tabs/tab/index.scss

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,21 @@
1010
color: unset;
1111
font-weight: 500;
1212
transition: color 50ms ease, border-color 50ms ease;
13+
14+
&:not([disabled]) {
15+
&:hover {
16+
color: var(--color-text-default);
17+
}
18+
}
1319
}
1420

15-
&--single {
16-
color: var(--color-text-default);
17-
border-bottom: none;
21+
&--disabled {
22+
color: var(--color-text-muted);
1823
}
1924

20-
&:hover {
25+
&--single {
2126
color: var(--color-text-default);
27+
border-bottom: none;
2228
}
2329

2430
&--active {

ui/components/ui/tabs/tab/tab.component.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,16 @@ const Tab = (props) => {
3737
data-testid={dataTestId}
3838
onClick={(event) => {
3939
event.preventDefault();
40-
onClick(tabIndex);
40+
if (!disabled) {
41+
onClick(tabIndex);
42+
}
4143
}}
4244
key={tabKey}
4345
{...rest}
4446
className={classnames('tab', className, {
4547
'tab--single': isSingleTab,
4648
'tab--active': isActive,
49+
'tab--disabled': disabled,
4750
[activeClassName]: activeClassName && isActive,
4851
...rest?.className,
4952
})}

ui/components/ui/tabs/tab/tab.component.test.tsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,23 @@ describe('Tab', () => {
9797
const { getByTestId } = renderTab({ name: complexName });
9898
expect(getByTestId('complex-name')).toBeInTheDocument();
9999
});
100+
101+
it('applies disabled class when disabled is true', () => {
102+
const { container } = renderTab({ disabled: true });
103+
expect(container.firstChild).toHaveClass('tab--disabled');
104+
});
105+
106+
it('does not call onClick when disabled and clicked', () => {
107+
const onClick = jest.fn();
108+
const { getByRole } = renderTab({ disabled: true, onClick });
109+
110+
fireEvent.click(getByRole('button'));
111+
112+
expect(onClick).not.toHaveBeenCalled();
113+
});
114+
115+
it('applies disabled attribute to button when disabled', () => {
116+
const { getByRole } = renderTab({ disabled: true });
117+
expect(getByRole('button')).toHaveAttribute('disabled');
118+
});
100119
});

ui/components/ui/tabs/tabs.stories.js

Lines changed: 27 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,46 +4,37 @@ import Tabs from './tabs.component';
44

55
export default {
66
title: 'Components/UI/Tabs',
7+
component: Tabs,
8+
};
79

8-
argTypes: {
9-
tabs: {
10-
control: 'object',
11-
name: 'Tabs',
12-
},
13-
defaultActiveTabKey: {
14-
control: {
15-
type: 'text',
16-
},
17-
},
18-
onTabClick: { action: 'onTabClick' },
19-
onChange: { action: 'onChange' },
20-
},
10+
export const Default = {
2111
args: {
22-
tabs: [
23-
{ name: 'Tab A', content: 'Tab A Content' },
24-
{ name: 'Tab B', content: 'Tab B Content' },
25-
{ name: 'Tab C', content: 'Tab C Content' },
12+
children: [
13+
<Tab key="tab1" name="Tab 1" tabKey="tab1">
14+
Content 1
15+
</Tab>,
16+
<Tab key="tab2" name="Tab 2" tabKey="tab2">
17+
Content 2
18+
</Tab>,
19+
<Tab key="tab3" name="Tab 3" tabKey="tab3">
20+
Content 3
21+
</Tab>,
2622
],
2723
},
2824
};
2925

30-
function renderTab({ name, content }, index) {
31-
return (
32-
<Tab tabKey={name} key={name + index} name={name}>
33-
{content}
34-
</Tab>
35-
);
36-
}
37-
38-
export const DefaultStory = (args) => {
39-
return (
40-
<Tabs
41-
defaultActiveTabKey={args.defaultActiveTabKey}
42-
onTabClick={args.onTabClick}
43-
>
44-
{args.tabs.map((tabProps, i) => renderTab(tabProps, i, args.t))}
45-
</Tabs>
46-
);
26+
export const Disabled = {
27+
args: {
28+
children: [
29+
<Tab key="tab1" name="Tab 1" tabKey="tab1">
30+
Content 1
31+
</Tab>,
32+
<Tab key="tab2" name="Tab 2" tabKey="tab2" disabled>
33+
Content 2 (Disabled)
34+
</Tab>,
35+
<Tab key="tab3" name="Tab 3" tabKey="tab3">
36+
Content 3
37+
</Tab>,
38+
],
39+
},
4740
};
48-
49-
DefaultStory.storyName = 'Default';

ui/components/ui/tabs/tabs.test.tsx

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,4 +121,59 @@ describe('Tabs', () => {
121121
expect(getByText('Tab 1')).toBeInTheDocument();
122122
expect(getByText('Tab 1 Content')).toBeInTheDocument();
123123
});
124+
125+
it('renders disabled tab with proper styling', () => {
126+
const { getByText } = render(
127+
<Tabs defaultActiveTabKey="" onTabClick={() => null}>
128+
<Tab tabKey="tab1" name="Tab 1">
129+
Tab 1 Content
130+
</Tab>
131+
<Tab tabKey="tab2" name="Tab 2" disabled>
132+
Tab 2 Content
133+
</Tab>
134+
</Tabs>,
135+
);
136+
137+
const disabledTab = getByText('Tab 2').closest('li');
138+
expect(disabledTab).toHaveClass('tab--disabled');
139+
140+
const disabledButton = getByText('Tab 2').closest('button');
141+
expect(disabledButton).toHaveAttribute('disabled');
142+
});
143+
144+
it('does not switch to disabled tab when clicked', () => {
145+
const { getByText, queryByText } = render(
146+
<Tabs defaultActiveTabKey="tab1" onTabClick={() => null}>
147+
<Tab tabKey="tab1" name="Tab 1">
148+
Tab 1 Content
149+
</Tab>
150+
<Tab tabKey="tab2" name="Tab 2" disabled>
151+
Tab 2 Content
152+
</Tab>
153+
</Tabs>,
154+
);
155+
156+
fireEvent.click(getByText('Tab 2'));
157+
158+
expect(getByText('Tab 1 Content')).toBeInTheDocument();
159+
expect(queryByText('Tab 2 Content')).not.toBeInTheDocument();
160+
});
161+
162+
it('does not call onTabClick when disabled tab is clicked', () => {
163+
const onTabClick = jest.fn();
164+
const { getByText } = render(
165+
<Tabs defaultActiveTabKey="tab1" onTabClick={onTabClick}>
166+
<Tab tabKey="tab1" name="Tab 1">
167+
Tab 1 Content
168+
</Tab>
169+
<Tab tabKey="tab2" name="Tab 2" disabled>
170+
Tab 2 Content
171+
</Tab>
172+
</Tabs>,
173+
);
174+
175+
fireEvent.click(getByText('Tab 2'));
176+
177+
expect(onTabClick).not.toHaveBeenCalled();
178+
});
124179
});

0 commit comments

Comments
 (0)