Home Reference Source

src/components/widgets/AdvancedTable/AdvancedTableWidget.jsx

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import AdvancedTableContainer from './AdvancedTableContainer';
import TablePagination from '../Table/TablePagination';
import StandardWidget from '../StandardWidget';
import Fieldsets from '../Form/fieldsets';

import dependency from '../../../core/dependency';
import { values } from 'lodash';

/**
 * Компонент AdvancedTableWidget
 * @param pageId - id страницы
 * @param widgetId - id виджета
 * @param actions - экшены
 * @param toolbar - тулбар таблицы
 * @param dataProvider
 * @param bordered - флаг таблицы с боредарми
 * @param rowClick - действие клика по строке
 * @param paging - объект пагинации
 * @param multiHeader - флаг использования многоуровненвого заголовка
 * @param scroll - объект скролла для таблицы
 * @param expandable - флаг использования контента в подстроке
 * @param useFixedHeader - флаг использования фиксированного заголовка
 * @param tableSize - размер таблицы
 * @param rowSelection - флаг использования чекбоксов для мульти селекта
 * @param rowClass - expression цвет строки
 */
class AdvancedTableWidget extends Component {
  getWidgetProps() {
    const {
      headers,
      cells,
      sorting,
      hasFocus,
      hasSelect,
      autoFocus,
      rowSelection,
      tableSize,

      useFixedHeader,
      expandable,
      scroll,
      onFetch,
      multiHeader,
      bordered,
      rowClick,
      expandedFieldId,
      rowClass,
    } = this.props.table;
    const { toolbar, actions, dataProvider, placeholder } = this.props;
    const { resolveProps } = this.context;
    return {
      headers: values(resolveProps(headers)),
      cells: values(resolveProps(cells)),
      sorting,
      toolbar,
      actions,
      hasFocus,
      hasSelect,
      autoFocus,
      dataProvider,
      placeholder,
      rowSelection,
      tableSize,
      useFixedHeader,
      expandable,
      scroll,
      onFetch,
      multiHeader,
      bordered,
      rowClick,
      expandedFieldId,
      rowClass,
    };
  }

  prepareFilters() {
    return this.context.resolveProps(
      this.props.filter,
      Fieldsets.StandardFieldset
    );
  }

  render() {
    const {
      id: widgetId,
      toolbar,
      disabled,
      actions,
      table: { fetchOnInit, size },
      pageId,
      paging,
    } = this.props;
    return (
      <StandardWidget
        disabled={disabled}
        widgetId={widgetId}
        toolbar={toolbar}
        actions={actions}
        filter={this.prepareFilters()}
        bottomLeft={paging && <TablePagination widgetId={widgetId} />}
      >
        <AdvancedTableContainer
          widgetId={widgetId}
          pageId={pageId}
          size={size}
          page={1}
          fetchOnInit={fetchOnInit}
          {...this.getWidgetProps()}
        />
      </StandardWidget>
    );
  }
}

AdvancedTableWidget.contextTypes = {
  resolveProps: PropTypes.func,
};

AdvancedTableWidget.defaultProps = {
  toolbar: {},
  filter: {},
  bordered: false,
  expandFieldId: 'expandedContent',
};

AdvancedTableWidget.propTypes = {
  pageId: PropTypes.string.isRequired,
  widgetId: PropTypes.string,
  actions: PropTypes.object,
  toolbar: PropTypes.object,
  dataProvider: PropTypes.object,
  table: PropTypes.shape({
    size: PropTypes.number,
    fetchOnInit: PropTypes.bool,
    hasSelect: PropTypes.bool,
    className: PropTypes.string,
    style: PropTypes.object,
    autoFocus: PropTypes.bool,
    sorting: PropTypes.object,
    headers: PropTypes.array,
    cells: PropTypes.array,
  }),
  bordered: PropTypes.bool,
  rowClick: PropTypes.object,
  paging: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),
  multiHeader: PropTypes.bool,
  scroll: PropTypes.object,
  expandable: PropTypes.bool,
  useFixedHeader: PropTypes.bool,
  tableSize: PropTypes.string,
  rowSelection: PropTypes.bool,
  rowClass: PropTypes.string,
  expandFieldId: PropTypes.string,
};

export default dependency(AdvancedTableWidget);