diff --git a/src/__snapshots__/storybook.test.js.snap b/src/__snapshots__/storybook.test.js.snap index 24a789b8f..03d470538 100644 --- a/src/__snapshots__/storybook.test.js.snap +++ b/src/__snapshots__/storybook.test.js.snap @@ -3524,7 +3524,7 @@ exports[`Storyshots ConfigProvider Theming 1`] = ` > {

- + {tabs.map((tab) => ( ))}

- + {iconTabs.map((tab) => ( ))}

- + {tabs.map((tab) => ( ))}

- + {tabs.map((tab) => ( ))} diff --git a/src/components/Tabs/Tab/Tab.tsx b/src/components/Tabs/Tab/Tab.tsx index 4a35b5034..3abe4b4c0 100644 --- a/src/components/Tabs/Tab/Tab.tsx +++ b/src/components/Tabs/Tab/Tab.tsx @@ -34,7 +34,7 @@ export const Tab: FC = ({ ]); const getIcon = (): JSX.Element => - iconExists && ; + iconExists && ; const getLabel = (): JSX.Element => labelExists && {label}; diff --git a/src/components/Tabs/Tabs.context.tsx b/src/components/Tabs/Tabs.context.tsx index 779c5a367..e08b163e7 100644 --- a/src/components/Tabs/Tabs.context.tsx +++ b/src/components/Tabs/Tabs.context.tsx @@ -1,4 +1,4 @@ -import React, { createContext, useState } from 'react'; +import React, { createContext, useEffect, useState } from 'react'; import { TabsContextProps, ITabsContext, @@ -8,12 +8,14 @@ import { const TabsContext = createContext>({}); -const TabsProvider = ({ children, onChange, activeTab }: TabsContextProps) => { - const [currentActiveTab, setCurrentActiveTab] = - useState(activeTab); +const TabsProvider = ({ children, onChange, value }: TabsContextProps) => { + const [currentActiveTab, setCurrentActiveTab] = useState(value); - const onTabClick = (value: TabValue, e: SelectTabEvent) => { + useEffect(() => { setCurrentActiveTab(value); + }, [value]); + + const onTabClick = (value: TabValue, e: SelectTabEvent) => { onChange(value, e); }; diff --git a/src/components/Tabs/Tabs.stories.tsx b/src/components/Tabs/Tabs.stories.tsx index 468c67204..4d1308aa9 100644 --- a/src/components/Tabs/Tabs.stories.tsx +++ b/src/components/Tabs/Tabs.stories.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useState } from 'react'; import { Tabs, Tab, TabVariant, TabValue } from './'; import { IconName } from '../Icon'; @@ -44,149 +44,218 @@ const scrollableTabs = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map((i) => ({ ...(i === 4 ? { disabled: true } : {}), })); -export const Default = () => ( - <> -

Default Tabs

- - {tabs.map((tab) => ( - - ))} - -

Tabs with badge

- - {badgeTabs.map((tab) => ( - - ))} - -

Icon Tabs

- - {iconTabs.map((tab) => ( - - ))} - -

Icon Label Tabs

- - {iconLabelTabs.map((tab) => ( - - ))} - -

Scrollable tabs

-
- - {scrollableTabs.map((tab) => ( +export const Default = () => { + const [activeTabs, setActiveTabs] = useState({ + defaultTab: 'tab1', + defaultTabBadge: 'tab1', + iconTab: 'tab1', + iconLabelTab: 'tab1', + scrollableTab: 'tab1', + }); + + return ( + <> +

Default Tabs

+ + setActiveTabs({ ...activeTabs, defaultTab: tab }) + } + value={activeTabs.defaultTab} + > + {tabs.map((tab) => ( + + ))} + +

Tabs with badge

+ + setActiveTabs({ ...activeTabs, defaultTabBadge: tab }) + } + value={activeTabs.defaultTabBadge} + > + {badgeTabs.map((tab) => ( ))} -
- -); +

Icon Tabs

+ + setActiveTabs({ ...activeTabs, iconTab: tab }) + } + value={activeTabs.iconTab} + > + {iconTabs.map((tab) => ( + + ))} + +

Icon Label Tabs

+ + setActiveTabs({ ...activeTabs, iconLabelTab: tab }) + } + value={activeTabs.iconLabelTab} + > + {iconLabelTabs.map((tab) => ( + + ))} + +

Scrollable tabs

+
+ + setActiveTabs({ ...activeTabs, scrollableTab: tab }) + } + value={activeTabs.scrollableTab} + scrollable + > + {scrollableTabs.map((tab) => ( + + ))} + +
+ + ); +}; + +export const Small = () => { + const [activeTabs, setActiveTabs] = useState({ + defaultTab: 'tab1', + defaultTabBadge: 'tab1', + iconTab: 'tab1', + iconLabelTab: 'tab1', + scrollableTab: 'tab1', + }); -export const Small = () => ( - <> -

Default Tabs

- - {tabs.map((tab) => ( - - ))} - -

Tabs with badge

- - {badgeTabs.map((tab) => ( - - ))} - -

Icon Tabs

- - {iconTabs.map((tab) => ( - - ))} - -

Icon Label Tabs

- - {iconLabelTabs.map((tab) => ( - - ))} - -

Scrollable tabs

-
+ return ( + <> +

Default Tabs

+ setActiveTabs({ ...activeTabs, defaultTab: tab }) + } + value={activeTabs.defaultTab} variant={TabVariant.small} - scrollable > - {scrollableTabs.map((tab) => ( + {tabs.map((tab) => ( ))} -
- -); - -export const Pill = () => ( - <> -

- Experimental (do not use in production) -

-

Default Tabs

- - {tabs.map((tab) => ( - - ))} - -

Tabs with badge

- - {badgeTabs.map((tab) => ( - - ))} - -

Icon Tabs

- - {iconTabs.map((tab) => ( - - ))} - -

Icon Label Tabs

- - {iconLabelTabs.map((tab) => ( - - ))} - - -); +

Tabs with badge

+ + setActiveTabs({ ...activeTabs, defaultTabBadge: tab }) + } + value={activeTabs.defaultTabBadge} + variant={TabVariant.small} + > + {badgeTabs.map((tab) => ( + + ))} + +

Icon Tabs

+ + setActiveTabs({ ...activeTabs, iconTab: tab }) + } + value={activeTabs.iconTab} + variant={TabVariant.small} + > + {iconTabs.map((tab) => ( + + ))} + +

Icon Label Tabs

+ + setActiveTabs({ ...activeTabs, iconLabelTab: tab }) + } + value={activeTabs.iconLabelTab} + variant={TabVariant.small} + > + {iconLabelTabs.map((tab) => ( + + ))} + +

Scrollable tabs

+
+ + setActiveTabs({ ...activeTabs, scrollableTab: tab }) + } + value={activeTabs.scrollableTab} + variant={TabVariant.small} + scrollable + > + {scrollableTabs.map((tab) => ( + + ))} + +
+ + ); +}; -function _tabClicked(tab: TabValue): void { - console.log(tab); -} +export const Pill = () => { + const [activeTabs, setActiveTabs] = useState({ + defaultTab: 'tab1', + defaultTabBadge: 'tab1', + iconTab: 'tab1', + iconLabelTab: 'tab1', + scrollableTab: 'tab1', + }); + return ( + <> +

+ Experimental (do not use in production) +

+

Default Tabs

+ + setActiveTabs({ ...activeTabs, defaultTab: tab }) + } + value={activeTabs.defaultTab} + variant={TabVariant.pill} + > + {tabs.map((tab) => ( + + ))} + +

Tabs with badge

+ + setActiveTabs({ ...activeTabs, defaultTabBadge: tab }) + } + value={activeTabs.defaultTabBadge} + variant={TabVariant.pill} + > + {badgeTabs.map((tab) => ( + + ))} + +

Icon Tabs

+ + setActiveTabs({ ...activeTabs, iconTab: tab }) + } + value={activeTabs.iconTab} + variant={TabVariant.pill} + > + {iconTabs.map((tab) => ( + + ))} + +

Icon Label Tabs

+ + setActiveTabs({ ...activeTabs, iconLabelTab: tab }) + } + value={activeTabs.iconLabelTab} + variant={TabVariant.pill} + > + {iconLabelTabs.map((tab) => ( + + ))} + + + ); +}; diff --git a/src/components/Tabs/Tabs.test.tsx b/src/components/Tabs/Tabs.test.tsx index abf8fc40a..f74279851 100644 --- a/src/components/Tabs/Tabs.test.tsx +++ b/src/components/Tabs/Tabs.test.tsx @@ -31,7 +31,7 @@ describe('Panel', () => { beforeEach(() => { wrapper = mount( - + {tabs.map((tab) => ( ))} @@ -42,7 +42,7 @@ describe('Panel', () => { test('tabs snapshot', () => { expect( create( - + {tabs.map((tab) => ( ))} @@ -59,6 +59,16 @@ describe('Panel', () => { wrapper.find('.tab').at(2).simulate('click'); expect(tabClick).toHaveBeenCalledTimes(1); expect(tabClick).toHaveBeenCalledWith('tab3', expect.any(Object)); + }); + + test('setting value changes tab', async () => { + wrapper = mount( + + {tabs.map((tab) => ( + + ))} + + ); expect(wrapper.find('.tab').at(2).hasClass('active')).toEqual(true); }); }); diff --git a/src/components/Tabs/Tabs.types.ts b/src/components/Tabs/Tabs.types.ts index 07ace4689..e959104c0 100644 --- a/src/components/Tabs/Tabs.types.ts +++ b/src/components/Tabs/Tabs.types.ts @@ -21,7 +21,7 @@ export enum TabVariant { export interface TabsContextProps { children: React.ReactNode; onChange: OnChangeHandler; - activeTab?: TabValue; + value?: TabValue; } export interface ITabsContext { @@ -31,7 +31,7 @@ export interface ITabsContext { export interface TabProps extends React.ButtonHTMLAttributes { /** - * The value of the tab. + * Active value of the tab. */ value: TabValue; /** @@ -64,7 +64,7 @@ export interface TabsProps { /** * The default tab to select */ - activeTab?: TabValue; + value?: TabValue; /** * Callback called on click of a tab * @param value {TabValue} diff --git a/src/components/Tabs/Tabs/index.tsx b/src/components/Tabs/Tabs/index.tsx index f3c93a87a..76705cecf 100644 --- a/src/components/Tabs/Tabs/index.tsx +++ b/src/components/Tabs/Tabs/index.tsx @@ -4,9 +4,9 @@ import { TabsProvider } from '../Tabs.context'; import { AnimatedTabs } from './AnimatedTabs'; export const Tabs: FC = (props) => { - const { activeTab, onChange, children } = props; + const { value, onChange, children } = props; return ( - + {children} ); diff --git a/src/components/Tabs/__snapshots__/Tabs.test.tsx.snap b/src/components/Tabs/__snapshots__/Tabs.test.tsx.snap index 1ae3aa0df..63f4b5de4 100644 --- a/src/components/Tabs/__snapshots__/Tabs.test.tsx.snap +++ b/src/components/Tabs/__snapshots__/Tabs.test.tsx.snap @@ -15,7 +15,7 @@ exports[`Panel tabs snapshot 1`] = ` >