Skip to content

Commit 2155ccf

Browse files
committed
Enable to provide default for Controlled Tab
1 parent ef12332 commit 2155ccf

File tree

2 files changed

+18
-14
lines changed

2 files changed

+18
-14
lines changed

src/Tabs.tsx

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export namespace TabsProps {
3232
label: ReactNode;
3333
iconId?: FrIconClassName | RiIconClassName;
3434
content: ReactNode;
35+
isDefault?: boolean;
3536
}[];
3637
selectedTabId?: undefined;
3738
onTabChange?: (params: { tabIndex: number; tab: Uncontrolled["tabs"][number] }) => void;
@@ -69,14 +70,12 @@ export const Tabs = memo(
6970

7071
const id = useId();
7172

72-
const getSelectedTabIndex = () => {
73-
assert(selectedTabId !== undefined);
74-
return tabs.findIndex(({ tabId }) => tabId === selectedTabId);
75-
};
73+
const getSelectedTabIndex = () =>
74+
tabs.findIndex(tab =>
75+
"content" in tab ? tab.isDefault ?? false : tab.tabId === selectedTabId
76+
);
7677

77-
const [selectedTabIndex, setSelectedTabIndex] = useState<number>(
78-
selectedTabId !== undefined ? getSelectedTabIndex : 0
79-
);
78+
const [selectedTabIndex, setSelectedTabIndex] = useState<number>(getSelectedTabIndex);
8079

8180
useEffect(() => {
8281
if (selectedTabId === undefined) {

stories/Tabs.stories.tsx

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ In this mode the \`Tab\` component is in charge for swapping the panel content.
1616
\`\`\`tsx
1717
<Tabs
1818
tabs={[
19-
{ "label": "Tab 1", "iconId": "fr-icon-add-line", "content": <p>Content of tab1</p> },
20-
{ "label": "Tab 2", "iconId": "fr-icon-ball-pen-fill", "content": <p>Content of tab2</p> },
21-
{ "label": "Tab 3", "content": <p>Content of tab3</p> }
19+
{ label: "Tab 1", iconId: "fr-icon-add-line", content: <p>Content of tab1</p> },
20+
{ label: "Tab 2", iconId: "fr-icon-ball-pen-fill", isDefault: true, content: <p>Content of tab2</p> },
21+
{ label: "Tab 3", content: <p>Content of tab3</p> }
2222
]}
2323
/>
2424
\`\`\`
@@ -37,9 +37,9 @@ function ControlledTabs() {
3737
<Tabs
3838
selectedTabId={selectedTabId}
3939
tabs={[
40-
{ "tabId": "tab1", "label": "Tab 1", "iconId": "fr-icon-add-line" },
41-
{ "tabId": "tab2", "label": "Tab 2", "iconId": "fr-icon-ball-pen-fill" },
42-
{ "tabId": "tab3", "label": "Tab 3" },
40+
{ tabId: "tab1", label: "Tab 1", iconId: "fr-icon-add-line" },
41+
{ tabId: "tab2", label: "Tab 2", iconId: "fr-icon-ball-pen-fill" },
42+
{ tabId: "tab3", label: "Tab 3" },
4343
]}
4444
onTabChange={setSelectedTabId}
4545
>
@@ -59,7 +59,12 @@ export default meta;
5959
export const Default = getStory({
6060
"tabs": [
6161
{ "label": "Tab 1", "iconId": "fr-icon-add-line", "content": <p>Content of tab1</p> },
62-
{ "label": "Tab 2", "iconId": "fr-icon-ball-pen-fill", "content": <p>Content of tab2</p> },
62+
{
63+
"label": "Tab 2",
64+
"iconId": "fr-icon-ball-pen-fill",
65+
"isDefault": true,
66+
"content": <p>Content of tab2</p>
67+
},
6368
{ "label": "Tab 3", "content": <p>Content of tab3</p> }
6469
],
6570
"label": "Name of the tabs system",

0 commit comments

Comments
 (0)