Home Reference Source

src/components/controls/InputSelect/SelectedItems.jsx

import React from 'react';
import PropTypes from 'prop-types';

/**
 * Компонент выбранных элементов для {@Link InputSelectGroup}
 * @reactProps {string} labelFieldId - значение ключа label в данных
 * @reactProps {array} selected - список выбранных элементов
 * @reactProps {function} onRemoveItem - callback при нажатии на удаление элемента из выбранных при мульти выборе
 * @reactProps {function} onDeleteAll - callback удаление всех выбранных элементов при мульти выборе
 * @reactProps {boolean} collapseSelected - флаг сжатия выбранных элементов
 * @reactProps {number} lengthToGroup - от скольки элементов сжимать выбранные элементы
 */

function InputElements({
  onRemoveItem,
  selected,
  labelFieldId,
  disabled,
  collapseSelected,
  lengthToGroup,
  onDeleteAll,
  setRef,
}) {
  const selectedItem = (id, title, callback) => (
    <span key={id} className="selected-item n2o-multiselect" title={title}>
      <span className="n2o-eclipse-content">{title}</span>
      <button
        type="button"
        className="close"
        onClick={() => callback()}
        disabled={disabled}
      >
        <i className="fa fa-times fa-1" />
      </button>
    </span>
  );

  const selectedList = () => {
    if (collapseSelected && selected.length > lengthToGroup) {
      const id = selected.length;
      const title = `Выбрано ${selected.length}`;

      return selectedItem(id, title, onDeleteAll);
    }

    return (
      selected &&
      selected.map(item =>
        selectedItem(item.id, item[labelFieldId], onRemoveItem.bind(null, item))
      )
    );
  };

  return (
    <div className="n2o-input-select-selected-list" ref={setRef}>
      {selectedList()}
    </div>
  );
}

InputElements.propTypes = {
  selected: PropTypes.array,
  labelFieldId: PropTypes.string,
  onRemoveItem: PropTypes.func,
  onDeleteAll: PropTypes.func,
  collapseSelected: PropTypes.bool,
  lengthToGroup: PropTypes.number,
  disabled: PropTypes.bool,
};

export default InputElements;