Home Reference Source

src/components/snippets/Panel/Panel.jsx

import React from 'react';
import PropTypes from 'prop-types';
import { Card, Collapse } from 'reactstrap';
import cx from 'classnames';

import panelStyles from './panelStyles';
import PanelHeading from './PanelHeading';
import PanelTitle from './PanelTitle';
import PanelMenu from './PanelMenu';
import PanelNavItem from './PanelNavItem';
import PanelFooter from './PanelFooter';
import PanelBody from './PanelBody';
import PanelTabBody from './PanelTabBody';

/**
 * Компонент панели
 * @reactProps {string} className - имя класса для родительского элемента
 * @reactProps {object} style - стили для родительского элемента
 * @reactProps {string} color - стиль для панели
 * @reactProps {boolean} isFullScreen - флаг режима на весь экран
 * @reactProps {function} onToggle - callback для скрытия/раскрытия панели
 * @reactProps {boolean} - open
 * @reactProps {function} onKeyPress - callback при нажатии на кнопку
 * @reactProps {node} children - вставляемый в панель элемент
 */

function Panel({
  className,
  isFullScreen,
  style,
  onToggle,
  open,
  color,
  onKeyPress,
  children,
  innerRef,
}) {
  const panelClass = cx('n2o-panel-region', className, 'text-dark', {
    'panel-fullscreen': isFullScreen,
  });

  return (
    <Card
      className={panelClass}
      style={style}
      onToggle={onToggle}
      color={color}
      // expanded={open}
      outline
      onKeyDown={onKeyPress}
      tabIndex="-1"
      innerRef={innerRef}
    >
      {children}
      <div className="panel-fullscreen-help">
        <span>ESC - выход из полноэкранного режима</span>
      </div>
    </Card>
  );
}

Panel.propTypes = {
  className: PropTypes.string,
  style: PropTypes.object,
  color: PropTypes.string,
  isFullScreen: PropTypes.bool,
  open: PropTypes.bool,
  onToggle: PropTypes.func,
  onKeyPress: PropTypes.func,
  children: PropTypes.node,
  innerRef: PropTypes.func,
};

Panel.defaultProps = {
  isFullScreen: false,
  color: panelStyles.DEFAULT,
};

Object.assign(Panel, {
  Heading: PanelHeading,
  Title: PanelTitle,
  Menu: PanelMenu,
  NavItem: PanelNavItem,
  Footer: PanelFooter,
  Body: PanelBody,
  TabBody: PanelTabBody,
  Collapse: Collapse,
});

export default Panel;