42917806e9
removed unnecessary components, combined where necessary added each component to a folder, added individual css style modules optimized some component rendering flows removed functional components in favor of pure components linted and formatted all of the files
126 lines
3.2 KiB
JavaScript
126 lines
3.2 KiB
JavaScript
import { Fragment } from 'react';
|
|
import classNames from 'classnames';
|
|
import { injectIntl, defineMessages } from 'react-intl';
|
|
import Icon from '../icon';
|
|
|
|
import './index.scss';
|
|
|
|
const messages = defineMessages({
|
|
show: { id: 'column_header.show_settings', defaultMessage: 'Show settings' },
|
|
hide: { id: 'column_header.hide_settings', defaultMessage: 'Hide settings' },
|
|
});
|
|
|
|
export default @injectIntl
|
|
class ColumnHeader extends PureComponent {
|
|
|
|
static contextTypes = {
|
|
router: PropTypes.object,
|
|
};
|
|
|
|
static propTypes = {
|
|
intl: PropTypes.object.isRequired,
|
|
title: PropTypes.node,
|
|
icon: PropTypes.string,
|
|
active: PropTypes.bool,
|
|
children: PropTypes.node,
|
|
};
|
|
|
|
state = {
|
|
collapsed: true,
|
|
};
|
|
|
|
historyBack = () => {
|
|
if (window.history && window.history.length === 1) {
|
|
this.context.router.history.push('/home'); // homehack
|
|
} else {
|
|
this.context.router.history.goBack();
|
|
}
|
|
}
|
|
|
|
handleToggleClick = (e) => {
|
|
e.stopPropagation();
|
|
this.setState({
|
|
collapsed: !this.state.collapsed,
|
|
});
|
|
}
|
|
|
|
handleBackClick = () => {
|
|
this.historyBack();
|
|
}
|
|
|
|
render () {
|
|
const { title, icon, active, children, intl: { formatMessage } } = this.props;
|
|
const { collapsed } = this.state;
|
|
|
|
const wrapperClassName = classNames('column-header__wrapper', {
|
|
'column-header__wrapper--active': active,
|
|
});
|
|
|
|
const buttonClassName = classNames('column-header', {
|
|
'column-header--active': active,
|
|
});
|
|
|
|
const btnTitle = formatMessage(collapsed ? messages.show : messages.hide);
|
|
const hasTitle = icon && title;
|
|
const hasChildren = !!children;
|
|
|
|
if (!hasChildren && !hasTitle) {
|
|
return null;
|
|
} else if (!hasChildren && hasTitle) {
|
|
return (
|
|
<div className={wrapperClassName}>
|
|
<h1 className={buttonClassName}>
|
|
<Icon id={icon} fixedWidth className='column-header__icon' />
|
|
{title}
|
|
</h1>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
const collapsibleClassName = classNames('column-header__collapsible', {
|
|
'column-header__collapsible--collapsed': collapsed,
|
|
});
|
|
|
|
const collapsibleButtonClassName = classNames('column-header__button', {
|
|
'column-header__button--active': !collapsed,
|
|
});
|
|
|
|
return (
|
|
<div className={wrapperClassName}>
|
|
<h1 className={buttonClassName}>
|
|
{
|
|
hasTitle && (
|
|
<Fragment>
|
|
<Icon id={icon} fixedWidth className='column-header__icon' />
|
|
{title}
|
|
</Fragment>
|
|
)
|
|
}
|
|
|
|
<button
|
|
className={collapsibleButtonClassName}
|
|
title={btnTitle}
|
|
aria-label={btnTitle}
|
|
aria-pressed={!collapsed}
|
|
onClick={this.handleToggleClick}
|
|
>
|
|
<Icon id='sliders' />
|
|
</button>
|
|
</h1>
|
|
|
|
<div className={collapsibleClassName} tabIndex={collapsed ? -1 : null}>
|
|
<div className='column-header__collapsible-inner'>
|
|
{
|
|
!collapsed &&
|
|
<div key='extra-content' className='column-header__collapsible__extra'>
|
|
{children}
|
|
</div>
|
|
}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
}
|