/** * Component for TabBar * * @author Ivan Marshalkin * @date 2019-05-30 */ import * as React from 'react'; import {renderIcon} from '../../utils/renderIcon'; import * as styles from './tabBar.m.css'; import {joinClassNames} from '../../utils/joinClassNames'; import {Divider, DIVIDER_TYPE} from '../divider/Divider'; import {IconIntent} from '@unidata/icon'; export type TabItem = { key: KEY_ENUM; tab: React.ReactNode; leftIcon?: React.ReactNode; rightIcon?: React.ReactNode; isDisabled?: boolean; 'data-qaid'?: string; order?: number; hasError?: boolean; } interface IProps { defaultSelectedTab: KEY_ENUM; shouldTabChange?: (key: KEY_ENUM) => boolean; onTabSelect: (key: KEY_ENUM) => void; tabs: Array> | Array>>; rightTabs?: Array>; } interface IState { selectedTab: KEY_ENUM; } export class TabBar extends React.Component, IState> { override state: IState = { selectedTab: this.props.defaultSelectedTab }; setTab = (key: KEY_ENUM) => () => { if (!this.props.shouldTabChange || this.props.shouldTabChange(key)) { this.setState({selectedTab: key}); this.props.onTabSelect(key); } }; override componentDidUpdate (prevProps: Readonly, prevState: Readonly, snapshot?: any): void { if (prevProps.defaultSelectedTab !== this.props.defaultSelectedTab) { this.setState({selectedTab: this.props.defaultSelectedTab}); } } renderTabItem = (tabMeta: TabItem) => { const tabItemClass = joinClassNames( styles.tabItem, [styles.tabSelected, tabMeta.key === this.state.selectedTab], [styles.isDisabled, Boolean(tabMeta.isDisabled)] ); return (
{tabMeta.leftIcon && renderIcon(tabMeta.leftIcon, { intent: tabMeta.key === this.state.selectedTab ? IconIntent.PRIMARY : IconIntent.DEFAULT }, { className: styles.leftIcon })} {tabMeta.tab} {tabMeta.rightIcon && renderIcon(tabMeta.rightIcon, { intent: tabMeta.key === this.state.selectedTab ? IconIntent.PRIMARY : IconIntent.DEFAULT }, { className: styles.rightIcon })} {this.state.selectedTab === tabMeta.key && (
)} {tabMeta.hasError === true && (
)}
); }; override render () { const tabs = this.props.tabs; let showDivider = true; if (Array.isArray(tabs[0]) && Array.isArray(tabs[1]) && (tabs[0].length === 0 || tabs[1].length === 0)) { showDivider = false; } return (
{tabs.map((tabMeta, index) => { if (Array.isArray(tabMeta)) { const groupKey = tabMeta.map((tabMetaItem) => tabMetaItem.key).join(); return ( {index > 0 && showDivider && ( )} {tabMeta.map((tabItem) => this.renderTabItem(tabItem))} ); } else { return this.renderTabItem(tabMeta); } })}
{this.props.rightTabs?.map((tabMeta) => { return this.renderTabItem(tabMeta); })}
); } }