Home Reference Source

src/components/controls/InputSelectTreeOldDeprecated/TreeItems.jsx

import React from 'react';
import PropTypes from 'prop-types';
import { DropdownItem } from 'reactstrap';
import NODE_SELECTED from './nodeSelected';
import TreeNode from './TreeNode';
import NothingFound from '../InputSelect/NothingFound';
import groupData from '../../../utils/groupData';
import { some, find } from 'lodash';

/**
 * Компонент TreeItems
 * @reactProps {boolean} hasChildrenFiledId
 * @reactProps {string} labelFieldId
 * @reactProps {string} valueFieldId
 * @reactProps {string} iconFieldId
 * @reactProps {array} disabledValues
 * @reactProps {string} imageFieldId
 * @reactProps {boolean} hasCheckboxes
 * @reactProps {string} format
 * @reactProps {boolean} ajax
 * @reactProps {string} badgeFieldId
 * @reactProps {string} badgeColorFieldId
 * @reactProps {object} options
 * @reactProps {object} treeState
 * @reactProps {object} active
 * @reactProps {function} handleSelect
 * @reactProps {function} handleDelete
 * @reactProps {function} onExpandClick
 * @reactProps {string} parentFieldId
 * @reactProps {function} handleFocus
 * @reactProps {any} value
 * @reactProps {string} groupFieldId
 */
class TreeItems extends React.Component {
  render() {
    const {
      hasChildrenFieldId,
      labelFieldId,
      valueFieldId,
      iconFieldId,
      disabledValues,
      imageFieldId,
      hasCheckboxes,
      format,
      ajax,
      badgeFieldId,
      badgeColorFieldId,
      options,
      treeStates,
      active,
      handleSelect,
      handleDelete,
      onExpandClick,
      parentFieldId,
      handleFocus,
      value,
      groupFieldId,
    } = this.props;

    const defaultItems = options => options.map(renderTreeNode);

    const groupedItems = (key, value) => (
      <React.Fragment>
        <DropdownItem key header>
          {key}
        </DropdownItem>
        {defaultItems(value)}
        <DropdownItem key={key + '2222'} divider />
      </React.Fragment>
    );

    const renderTreeItems = options => {
      if (groupFieldId) {
        const groupedData = groupData(options, groupFieldId);

        return Object.keys(groupedData).map(key =>
          groupedItems(key, groupedData[key])
        );
      }
      return defaultItems(options);
    };

    const renderTreeNode = item => {
      const childs = options.filter(
        node => node[parentFieldId] === item[valueFieldId]
      );
      const itemState = treeStates[item[valueFieldId]];

      return (
        <TreeNode
          key={item[valueFieldId]}
          hasCheckboxes={hasCheckboxes}
          imageFieldId={imageFieldId}
          iconFieldId={iconFieldId}
          labelFieldId={labelFieldId}
          item={item}
          selected={find(value, [valueFieldId, item[valueFieldId]])}
          indeterminate={itemState.selected === NODE_SELECTED.PARTIALLY}
          format={format}
          onSelect={handleSelect}
          onDelete={handleDelete}
          ajax={ajax}
          expanded={itemState.expanded}
          hasChildren={itemState[hasChildrenFieldId]}
          onExpandClick={onExpandClick}
          ref={itemState.ref}
          handleFocus={handleFocus}
          disabled={disabledValues.find(
            node => node[valueFieldId] === item[valueFieldId]
          )}
          active={active && active.id === item[valueFieldId]}
          badgeFieldId={badgeFieldId}
          badgeColorFieldId={badgeColorFieldId}
        >
          {!!childs.length && childs.map(renderTreeNode)}
        </TreeNode>
      );
    };

    const rootNodes = options.filter(node => !node[parentFieldId]);

    return (
      <React.Fragment>
        {rootNodes && renderTreeItems(rootNodes)}
        {!rootNodes.length && <NothingFound />}
      </React.Fragment>
    );
  }
}

TreeItems.propTypes = {
  hasChildrenFieldId: PropTypes.bool,
  options: PropTypes.array.isRequired,
  treeStates: PropTypes.object.isRequired,
  disabledValues: PropTypes.array,
  hasCheckboxes: PropTypes.bool,
  imageFieldId: PropTypes.string,
  iconFieldId: PropTypes.string,
  labelFieldId: PropTypes.string.isRequired,
  valueFieldId: PropTypes.string,
  badgeFieldId: PropTypes.string,
  badgeColorFieldId: PropTypes.string,
  format: PropTypes.string,
  handleSelect: PropTypes.func.isRequired,
  handleDelete: PropTypes.func.isRequired,
  ajax: PropTypes.bool,
  onExpandClick: PropTypes.func.isRequired,
  parentFieldId: PropTypes.string,
  handleFocus: PropTypes.func,
  value: PropTypes.any,
  active: PropTypes.object,
  groupFieldId: PropTypes.string,
};

export default TreeItems;