Home Reference Source

src/components/controls/InputSelectTreeOldDeprecated/TreeNode.jsx

import React from 'react';
import PropTypes from 'prop-types';
import { pure } from 'recompose';
import { uniqueId } from 'lodash';
import ListItem from '../InputSelect/ListItem';
import cx from 'classnames';

/**
 * Элемент дерева
 * @reactProps {boolean} expanded - флаг видимости попапа
 * @reactProps {string} labelFieldId - значение ключа label в данных
 * @reactProps {string} iconFieldId - поле для иконки
 * @reactProps {string} imageFieldId - поле для картинки
 * @reactProps {string} badgeFieldId - поле для баджа
 * @reactProps {string} badgeColorFieldId - поле для цвета баджа
 * @reactProps {boolean} hasCheckboxes - флаг наличия чекбоксов
 * @reactProps {string} format - формат
 * @reactProps {object} item - данные для элемента
 * @reactProps {boolean} selected - флаг того, что элемент выбран
 * @reactProps {boolean} disabled - флаг неактивности элемента
 * @reactProps {boolean} selectable - флаг возможности выбрать элемент
 * @reactProps {function} handleSelect - callback при выборе элемента
 * @reactProps {function} handleDelete - callback при удаление элемента
 * @reactProps {boolean} hasChildren - флаг наличия детей
 * @reactProps {function} onExpandClick - callback при раскрытии/закрытии поддерева
 * @reactProps {function} handleFocus - callback при наведении на элемент
 * @reactProps {boolean} active - наведён ли на элемент курсор
 */

function TreeNode({
  children,
  item,
  disabled,
  selected,
  hasChildren,
  expanded,
  onDelete,
  onSelect,
  onExpandClick,
  ...rest
}) {
  /**
   * Обработчик нажатия на элемент дерева
   * @private
   */

  const handleClick = e => {
    e.stopPropagation();
    selected ? onDelete(item) : onSelect(item);
  };

  /**
   * Обработчик нажатия на кнопку раскрытия
   * @param e - событие
   * @private
   */

  const handleChevronClick = e => {
    e.stopPropagation();
    onExpandClick(item);
  };

  const iconClass = expanded ? 'down' : 'right';

  return (
    <ui
      id={uniqueId('n2o-tree-select-item_')}
      className={cx('n2o-tree-select-item', { 'tree-childs': true })}
    >
      <li id={uniqueId('n2o-tree-select_')} className="n2o-tree-select">
        {hasChildren ? (
          <span onClick={handleChevronClick} className="tree-toggle">
            <i className={`fa fa-chevron-${iconClass}`} aria-hidden="true" />
          </span>
        ) : (
          <span className="tree-toggle nothing" />
        )}
        <ListItem
          onClick={handleClick}
          item={item}
          selected={selected}
          handleCheckboxSelect={handleClick}
          {...rest}
        />
      </li>
      <li
        style={{
          display: expanded ? 'block' : 'none',
        }}
      >
        {children}
      </li>
    </ui>
  );
}

TreeNode.propTypes = {
  expanded: PropTypes.bool,
  hasCheckboxes: PropTypes.bool,
  imageFieldId: PropTypes.string,
  iconFieldId: PropTypes.string,
  labelFieldId: PropTypes.string,
  item: PropTypes.object,
  selected: PropTypes.bool,
  format: PropTypes.string,
  disabled: PropTypes.bool,
  selectable: PropTypes.bool,
  handleSelect: PropTypes.func,
  handleDelete: PropTypes.func,
  hasChildren: PropTypes.bool,
  onExpandClick: PropTypes.func,
  handleFocus: PropTypes.func,
  active: PropTypes.bool,
  badgeFieldId: PropTypes.string,
  badgeColorFieldId: PropTypes.string,
};

TreeNode.defaultProps = {
  expanded: false,
  disabled: false,
  selectable: true,
  selected: false,
  indeterminate: false,
  active: false,
};

export default TreeNode;