Home Reference Source

src/components/actions/Dropdowns/ToggleColumn.jsx

import React from 'react';
import PropTypes from 'prop-types';
import _ from 'lodash';
import { DropdownItem } from 'reactstrap';
import { connect } from 'react-redux';
import { toggleColumnVisiblity } from '../../../actions/columns';
import { getContainerColumns } from '../../../selectors/columns';
import ChangeSize from './ChangeSize';

/**
 * Дропдаун для скрытия/показа колонок в таблице
 * @reactProps {string} widgetId - id виджета, размер которого меняется
 * @reactProps {array} columns - кологки(приходит из редакса)
 * @example
 * <ToggleColumn widgetId='TestWidgetId'/>
 */
class ToggleColumn extends React.Component {
  constructor(props) {
    super(props);
    this.toggleVisibility = this.toggleVisibility.bind(this);
  }

  /**
   * меняет видимость колонки по id
   * @param id
   */
  toggleVisibility(id) {
    const { dispatch, widgetId } = this.props;
    dispatch(toggleColumnVisiblity(widgetId, id));
  }

  /**
   * рендер дропдауна
   * @param columns
   */
  renderColumnDropdown(columns) {
    const notActive = (
      _.filter(columns, item => !item.value.visible) || []
    ).map(col => col.key);
    return columns.map((column, i) => {
      const checked = !notActive.includes(column.key);
      return (
        <DropdownItem
          key={i}
          toggle={false}
          onClick={() => this.toggleVisibility(column.key)}
        >
          <span className="n2o-dropdown-check-container">
            {checked && <i className="fa fa-check" aria-hidden="true" />}
          </span>
          <span>{column.value.label || column.key}</span>
        </DropdownItem>
      );
    });
  }

  /**
   * Базовый рендер
   * @returns {*}
   */
  render() {
    const { columns } = this.props;
    const columnsArray = _.map(columns || {}, (value, key) => ({ key, value }));
    return (
      <React.Fragment>
        {_.isArray(columnsArray)
          ? this.renderColumnDropdown(columnsArray)
          : null}
      </React.Fragment>
    );
  }
}

ToggleColumn.propTypes = {
  columns: PropTypes.object,
  widgetId: PropTypes.string,
};

const mapStateToProps = (state, props) => {
  return {
    columns: getContainerColumns(props.widgetId)(state),
  };
};

ToggleColumn = connect(mapStateToProps)(ToggleColumn);
export default ToggleColumn;