uui/components/buttons/TabButton.tsx (72 lines of code) (raw):
import React from 'react';
import { cx, Icon, IDropdownToggler, IHasCaption, IHasIcon, uuiElement, uuiMarkers, Overwrite } from '@epam/uui-core';
import { Clickable, ClickableComponentProps, IconContainer } from '@epam/uui-components';
import { getIconClass } from './helper';
import { CountIndicator, CountIndicatorProps } from '../widgets/CountIndicator';
import { systemIcons } from '../../icons/icons';
import { settings } from '../../settings';
import css from './TabButton.module.scss';
type TabButtonMods = {
/**
* Defines component size.
* @default '48'
*/
size?: '36' | '48' | '60';
/** Defines is the component showing Notify */
withNotify?: boolean;
};
export interface TabButtonModsOverride {}
/** Represents the properties of a TabButton component. */
export interface TabButtonProps extends Overwrite<TabButtonMods, TabButtonModsOverride>, ClickableComponentProps, IDropdownToggler, IHasIcon, IHasCaption {
/** Call to clear toggler value */
onClear?(e?: any): void;
/** Icon for clear value button (usually cross) */
clearIcon?: Icon;
/** Icon for drop-down toggler */
dropdownIcon?: Icon;
/** Count value to be placed in component */
count?: React.ReactNode;
}
export const TabButton = React.forwardRef<HTMLButtonElement | HTMLAnchorElement | HTMLSpanElement, TabButtonProps>((props, ref) => {
const styles = [
css.root,
'uui-tab-button',
`uui-size-${props.size || settings.sizes.defaults.tabButton}`,
...getIconClass(props),
props.cx,
];
const DropdownIcon = props.dropdownIcon ? props.dropdownIcon : systemIcons.foldingArrow;
const ClearIcon = props.clearIcon ? props.clearIcon : systemIcons.clear;
return (
<Clickable
{ ...props }
rawProps={ {
role: 'tab',
'aria-haspopup': props.isDropdown,
'aria-expanded': props.isOpen,
...props.rawProps,
} }
cx={ styles }
ref={ ref }
>
{ props.icon && props.iconPosition !== 'right' && (
<IconContainer
icon={ props.icon }
onClick={ !props.isDisabled ? props.onIconClick : undefined }
/>
) }
{ (props.caption || props.withNotify) && (
<div className={ cx(uuiElement.caption) }>
{ props.caption }
{ props.withNotify && <div className={ css.withNotify } /> }
</div>
) }
{ props.icon && props.iconPosition === 'right' && (
<IconContainer icon={ props.icon } onClick={ !props.isDisabled ? props.onIconClick : undefined } />
) }
{ props.count !== undefined && props.count !== null && (
<CountIndicator
color="neutral"
size={ settings.sizes.tabButton.countIndicator[props.size || settings.sizes.defaults.tabButton] as CountIndicatorProps['size'] }
caption={ props.count }
/>
) }
{ props.isDropdown && (
<IconContainer icon={ DropdownIcon } flipY={ props.isOpen } />
)}
{ props.onClear && !props.isDisabled && (
<IconContainer cx={ uuiMarkers.clickable } icon={ ClearIcon } onClick={ props.onClear } />
) }
</Clickable>
);
});