@patternfly/react-core
Version:
This library provides a set of common React components for use with the PatternFly reference implementation.
468 lines (438 loc) • 18.3 kB
Markdown
---
id: Tabs
section: components
---
import { Fragment, useCallback, useRef, useState } from 'react';
import CheckCircleIcon from '@patternfly/react-icons/dist/js/icons/check-circle-icon';
import InfoCircleIcon from '@patternfly/react-icons/dist/js/icons/info-circle-icon';
import CodeIcon from '@patternfly/react-icons/dist/esm/icons/code-icon';
import CodeBranchIcon from '@patternfly/react-icons/dist/esm/icons/code-branch-icon';
import CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon';
import FilterIcon from '@patternfly/react-icons/dist/esm/icons/filter-icon';
import SortAmountDownIcon from '@patternfly/react-icons/dist/esm/icons/sort-amount-down-icon';
import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon';
import display from '@patternfly/react-styles/css/utilities/Display/display';
import sizing from '@patternfly/react-styles/css/utilities/Sizing/sizing';
import spacing from '@patternfly/react-styles/css/utilities/Spacing/spacing';
import { DashboardWrapper } from '@patternfly/react-core/dist/js/demos/DashboardWrapper';
## Demos
### Open tabs
```js isFullscreen
import { useState } from 'react';
import {
PageSection,
PageBreadcrumb,
Breadcrumb,
BreadcrumbItem,
Tabs,
Tab,
TabContent,
TabContentBody,
TabTitleText,
Title,
DescriptionList,
DescriptionListGroup,
DescriptionListTerm,
DescriptionListDescription,
Label,
LabelGroup,
Flex,
FlexItem
} from '@patternfly/react-core';
import CheckCircleIcon from '@patternfly/react-icons/dist/js/icons/check-circle-icon';
import InfoCircleIcon from '@patternfly/react-icons/dist/js/icons/info-circle-icon';
import spacing from '@patternfly/react-styles/css/utilities/Spacing/spacing';
import { DashboardWrapper } from '@patternfly/react-core/dist/js/demos/DashboardWrapper';
TabsOpenDemo = () => {
const [activeTabKey, setActiveTabKey] = useState(0);
// Toggle currently active tab
const handleTabClick = (event, tabIndex) => {
setActiveTabKey(tabIndex);
};
const tabsBreadcrumb = (
<PageBreadcrumb isWidthLimited>
<Breadcrumb>
<BreadcrumbItem to="#">Overview</BreadcrumbItem>
<BreadcrumbItem to="#">Pods</BreadcrumbItem>
<BreadcrumbItem to="#" isActive>
Pod details{' '}
</BreadcrumbItem>
</Breadcrumb>
</PageBreadcrumb>
);
const tabContent = (
<Flex direction={{ default: 'column' }}>
<FlexItem spacer={{ default: 'spacerLg' }}>
<Title headingLevel="h2" size="lg" className={spacing.mtSm} id="open-tabs-example-tabs-list-details-title">
Pod details
</Title>
</FlexItem>
<FlexItem>
<DescriptionList columnModifier={{ lg: '2Col' }} aria-labelledby="open-tabs-example-tabs-list-details-title">
<DescriptionListGroup>
<DescriptionListTerm>Name</DescriptionListTerm>
<DescriptionListDescription>3scale-control-fccb6ddb9-phyqv9</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>Status</DescriptionListTerm>
<DescriptionListDescription>
<Flex spacer={{ default: 'spacerLg' }}>
<FlexItem>
<CheckCircleIcon />
</FlexItem>
<FlexItem>Running</FlexItem>
</Flex>
</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>Namespace</DescriptionListTerm>
<DescriptionListDescription>
<Flex spaceItems={{ default: 'spaceItemsSm' }}>
<FlexItem>
<Label color="teal">NS</Label>
</FlexItem>
<FlexItem>
<a href="#">knative-serving-ingress</a>
</FlexItem>
</Flex>
</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>Restart policy</DescriptionListTerm>
<DescriptionListDescription>Always restart</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>Labels</DescriptionListTerm>
<DescriptionListDescription>
<LabelGroup>
<Label>app=3scale-gateway</Label>
<Label>pod-template-has=6747686899</Label>
</LabelGroup>
</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>Active deadline seconds</DescriptionListTerm>
<DescriptionListDescription>Not configured</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>Tolerations</DescriptionListTerm>
<DescriptionListDescription>stuff</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>Pod IP</DescriptionListTerm>
<DescriptionListDescription>10..345.2.197</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>Annotations</DescriptionListTerm>
<DescriptionListDescription>stuff</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>Node</DescriptionListTerm>
<DescriptionListDescription>
<Flex spaceItems={{ default: 'spaceItemsSm' }}>
<FlexItem>
<Label color="purple">N</Label>
</FlexItem>
<FlexItem>ip-10-0-233-118.us-east-2.computer.external</FlexItem>
</Flex>
</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>Created at</DescriptionListTerm>
<DescriptionListDescription>
<time>Oct 15, 1:51 pm</time>
</DescriptionListDescription>
</DescriptionListGroup>
</DescriptionList>
</FlexItem>
</Flex>
);
return (
<DashboardWrapper hasNoBreadcrumb>
{tabsBreadcrumb}
<PageSection isWidthLimited>
<Flex
spaceItems={{ default: 'spaceItemsMd' }}
alignItems={{ default: 'alignItemsFlexStart' }}
flexWrap={{ default: 'noWrap' }}
>
<FlexItem>
<Label color="blue">N</Label>
</FlexItem>
<FlexItem>
<Title headingLevel="h1" size="2xl">
3scale-control-fccb6ddb9-phyqv9
</Title>
</FlexItem>
<FlexItem flex={{ default: 'flexNone' }}>
<Label icon={<InfoCircleIcon />}>Running</Label>
</FlexItem>
</Flex>
</PageSection>
<PageSection type="tabs" isWidthLimited>
<Tabs activeKey={activeTabKey} onSelect={handleTabClick} usePageInsets id="open-tabs-example-tabs-list">
<Tab eventKey={0} title={<TabTitleText>Details</TabTitleText>} tabContentId={`tabContent${0}`} />
<Tab eventKey={1} title={<TabTitleText>YAML</TabTitleText>} tabContentId={`tabContent${1}`} />
<Tab eventKey={2} title={<TabTitleText>Environment</TabTitleText>} tabContentId={`tabContent${2}`} />
<Tab eventKey={3} title={<TabTitleText>Events</TabTitleText>} tabContentId={`tabContent${3}`} />
<Tab eventKey={4} title={<TabTitleText>Terminal</TabTitleText>} tabContentId={`tabContent${4}`} />
</Tabs>
</PageSection>
<PageSection isWidthLimited>
<TabContent key={0} eventKey={0} id={`tabContent${0}`} activeKey={activeTabKey} hidden={0 !== activeTabKey}>
<TabContentBody>{tabContent}</TabContentBody>
</TabContent>
<TabContent key={1} eventKey={1} id={`tabContent${1}`} activeKey={activeTabKey} hidden={1 !== activeTabKey}>
<TabContentBody>YAML panel</TabContentBody>
</TabContent>
<TabContent key={2} eventKey={2} id={`tabContent${2}`} activeKey={activeTabKey} hidden={2 !== activeTabKey}>
<TabContentBody>Environment panel</TabContentBody>
</TabContent>
<TabContent key={3} eventKey={3} id={`tabContent${3}`} activeKey={activeTabKey} hidden={3 !== activeTabKey}>
<TabContentBody>Events panel</TabContentBody>
</TabContent>
<TabContent key={4} eventKey={4} id={`tabContent${4}`} activeKey={activeTabKey} hidden={4 !== activeTabKey}>
<TabContentBody>Terminal panel</TabContentBody>
</TabContent>
</PageSection>
</DashboardWrapper>
);
};
```
### Open tabs with secondary tabs
```js isFullscreen
import { useState } from 'react';
import {
PageSection,
PageBreadcrumb,
Breadcrumb,
BreadcrumbItem,
Tabs,
Tab,
TabContent,
TabContentBody,
TabTitleText,
Title,
DescriptionList,
DescriptionListGroup,
DescriptionListTerm,
DescriptionListDescription,
Label,
LabelGroup,
Flex,
FlexItem
} from '@patternfly/react-core';
import CheckCircleIcon from '@patternfly/react-icons/dist/js/icons/check-circle-icon';
import InfoCircleIcon from '@patternfly/react-icons/dist/js/icons/info-circle-icon';
import spacing from '@patternfly/react-styles/css/utilities/Spacing/spacing';
import { DashboardWrapper } from '@patternfly/react-core/dist/js/demos/DashboardWrapper';
TabsOpenWithSecondaryTabsDemo = () => {
const [activeTabKey, setActiveTabKey] = useState(0);
const [activeTabKeySecondary, setActiveTabKeySecondary] = useState(10);
// Toggle currently active tab
const handleTabClick = (event, tabIndex) => {
setActiveTabKey(tabIndex);
};
// Toggle currently active secondary tab
const handleTabClickSecondary = (event, tabIndex) => {
setActiveTabKeySecondary(tabIndex);
};
const tabsBreadcrumb = (
<PageBreadcrumb isWidthLimited>
<Breadcrumb>
<BreadcrumbItem to="#">Overview</BreadcrumbItem>
<BreadcrumbItem to="#">Pods</BreadcrumbItem>
<BreadcrumbItem to="#" isActive>
Pod details{' '}
</BreadcrumbItem>
</Breadcrumb>
</PageBreadcrumb>
);
const tabContent = (
<Flex direction={{ default: 'column' }}>
<FlexItem spacer={{ default: 'spacerLg' }}>
<Title headingLevel="h2" size="lg" className={spacing.mtSm} id="open-tabs-example-tabs-list-details-title">
Pod details
</Title>
</FlexItem>
<FlexItem>
<DescriptionList columnModifier={{ lg: '2Col' }} aria-labelledby="open-tabs-example-tabs-list-details-title">
<DescriptionListGroup>
<DescriptionListTerm>Name</DescriptionListTerm>
<DescriptionListDescription>3scale-control-fccb6ddb9-phyqv9</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>Status</DescriptionListTerm>
<DescriptionListDescription>
<Flex spacer={{ default: 'spacerLg' }}>
<FlexItem>
<CheckCircleIcon />
</FlexItem>
<FlexItem>Running</FlexItem>
</Flex>
</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>Namespace</DescriptionListTerm>
<DescriptionListDescription>
<Flex spaceItems={{ default: 'spaceItemsSm' }}>
<FlexItem>
<Label color="teal">NS</Label>
</FlexItem>
<FlexItem>
<a href="#">knative-serving-ingress</a>
</FlexItem>
</Flex>
</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>Restart policy</DescriptionListTerm>
<DescriptionListDescription>Always restart</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>Labels</DescriptionListTerm>
<DescriptionListDescription>
<LabelGroup>
<Label>app=3scale-gateway</Label>
<Label>pod-template-has=6747686899</Label>
</LabelGroup>
</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>Active deadline seconds</DescriptionListTerm>
<DescriptionListDescription>Not configured</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>Tolerations</DescriptionListTerm>
<DescriptionListDescription>stuff</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>Pod IP</DescriptionListTerm>
<DescriptionListDescription>10..345.2.197</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>Annotations</DescriptionListTerm>
<DescriptionListDescription>stuff</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>Node</DescriptionListTerm>
<DescriptionListDescription>
<Flex spaceItems={{ default: 'spaceItemsSm' }}>
<FlexItem>
<Label color="purple">N</Label>
</FlexItem>
<FlexItem>ip-10-0-233-118.us-east-2.computer.external</FlexItem>
</Flex>
</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>Created at</DescriptionListTerm>
<DescriptionListDescription>
<time>Oct 15, 1:51 pm</time>
</DescriptionListDescription>
</DescriptionListGroup>
</DescriptionList>
</FlexItem>
</Flex>
);
return (
<DashboardWrapper hasNoBreadcrumb>
{tabsBreadcrumb}
<PageSection isWidthLimited>
<Flex
spaceItems={{ default: 'spaceItemsMd' }}
alignItems={{ default: 'alignItemsFlexStart' }}
flexWrap={{ default: 'noWrap' }}
>
<FlexItem>
<Label color="blue">N</Label>
</FlexItem>
<FlexItem>
<Title headingLevel="h1" size="2xl">
3scale-control-fccb6ddb9-phyqv9
</Title>
</FlexItem>
<FlexItem flex={{ default: 'flexNone' }}>
<Label icon={<InfoCircleIcon />}>Running</Label>
</FlexItem>
</Flex>
</PageSection>
<PageSection type="tabs" isWidthLimited>
<Tabs activeKey={activeTabKey} onSelect={handleTabClick} usePageInsets id="open-tabs-example-tabs-list">
<Tab eventKey={0} title={<TabTitleText>Details</TabTitleText>} tabContentId={`tabContent${0}`} />
<Tab eventKey={1} title={<TabTitleText>YAML</TabTitleText>} tabContentId={`tabContent${1}`} />
<Tab eventKey={2} title={<TabTitleText>Environment</TabTitleText>} tabContentId={`tabContent${2}`} />
<Tab eventKey={3} title={<TabTitleText>Events</TabTitleText>} tabContentId={`tabContent${3}`} />
<Tab eventKey={4} title={<TabTitleText>Terminal</TabTitleText>} tabContentId={`tabContent${4}`} />
</Tabs>
</PageSection>
<PageSection isWidthLimited padding={{ default: 'noPadding' }}>
<TabContent key={0} eventKey={0} id={`tabContent${0}`} activeKey={activeTabKey} hidden={0 !== activeTabKey}>
<TabContentBody>
<Tabs
isSecondary
activeKey={activeTabKeySecondary}
onSelect={handleTabClickSecondary}
usePageInsets
id="open-with-secondary-tabs-example-tabs-list-secondary"
>
<Tab
eventKey={10}
title={<TabTitleText>Pod information</TabTitleText>}
tabContentId={`tabContent${10}`}
/>
<Tab
eventKey={11}
title={<TabTitleText>Editable aspects</TabTitleText>}
tabContentId={`tabContent${11}`}
/>
</Tabs>
<TabContent
key={10}
eventKey={10}
id={`tabContent${10}`}
activeKey={activeTabKeySecondary}
hidden={10 !== activeTabKeySecondary}
>
<TabContentBody hasPadding>{tabContent}</TabContentBody>
</TabContent>
<TabContent
key={11}
eventKey={11}
id={`tabContent${11}`}
activeKey={activeTabKeySecondary}
hidden={11 !== activeTabKeySecondary}
>
<TabContentBody>Editable aspects</TabContentBody>
</TabContent>
</TabContentBody>
</TabContent>
<TabContent key={1} eventKey={1} id={`tabContent${1}`} activeKey={activeTabKey} hidden={1 !== activeTabKey}>
<TabContentBody>YAML panel</TabContentBody>
</TabContent>
<TabContent key={2} eventKey={2} id={`tabContent${2}`} activeKey={activeTabKey} hidden={2 !== activeTabKey}>
<TabContentBody>Environment panel</TabContentBody>
</TabContent>
<TabContent key={3} eventKey={3} id={`tabContent${3}`} activeKey={activeTabKey} hidden={3 !== activeTabKey}>
<TabContentBody>Events panel</TabContentBody>
</TabContent>
<TabContent key={4} eventKey={4} id={`tabContent${4}`} activeKey={activeTabKey} hidden={4 !== activeTabKey}>
<TabContentBody>Terminal panel</TabContentBody>
</TabContent>
</PageSection>
</DashboardWrapper>
);
};
```
### Nested tabs
```js isFullscreen file="./examples/Tabs/NestedTabs.tsx"
```
### Nested, unindented tabs
```js isFullscreen file="./examples/Tabs/NestedUnindentedTabs.tsx"
```
### Tables and tabs
```js isFullscreen file="./examples/Tabs/TabsAndTable.tsx"
```
### Modal tabs
```js isFullscreen file="./examples/Tabs/ModalTabs.tsx"
```