Home Reference Source

src/components/widgets/Table/TableContainer.jsx

import { connect } from 'react-redux';
import { lifecycle, compose, withHandlers } from 'recompose';
import { isEqual, find, isEmpty, debounce } from 'lodash';

import Table from './Table';
import widgetContainer from '../WidgetContainer';
import { setTableSelectedId } from '../../../actions/widgets';
import createActionHelper from '../../../actions/createActionHelper';
import { SET_TABLE_SELECTED_ID } from '../../../constants/widgets';
import { TABLE } from '../widgetTypes';

const isEqualCollectionItemsById = (data1 = [], data2 = [], selectedId) => {
  const predicate = ({ id }) => id == selectedId;
  return isEqual(find(data1, predicate), find(data2, predicate));
};

export const withWidgetContainer = widgetContainer(
  {
    mapProps: props => {
      return {
        widgetId: props.widgetId,
        pageId: props.pageId,
        headers: props.headers,
        cells: props.cells,
        isAnyTableFocused: props.isAnyTableFocused,
        isActive: props.isActive,
        hasFocus: props.hasFocus,
        hasSelect: props.hasSelect,
        autoFocus: props.autoFocus,
        datasource: props.datasource,
        selectedId: props.selectedId,
        sorting: props.sorting,
        rowColor: props.rowColor,
        onSort: props.onSort,
        onResolve: debounce(newModel => {
          props.onResolve(newModel);
          if (props.selectedId != newModel.id) {
            props.dispatch(setTableSelectedId(props.widgetId, newModel.id));
          }
        }, 100),
        onFocus: props.onFocus,
        size: props.size,
        actions: props.actions,
        redux: true,
        onActionImpl: props.onActionImpl,
        rowClick: props.rowClick,
      };
    },
  },
  TABLE
);

export const withContainerLiveCycle = lifecycle({
  componentWillReceiveProps(nextProps) {
    const {
      selectedId: prevSelectedId,
      datasource: prevDatasource,
      onResolve,
    } = this.props;
    const { hasSelect, datasource, selectedId } = nextProps;

    if (
      hasSelect &&
      !isEmpty(datasource) &&
      !isEqual(prevDatasource, datasource) &&
      (!selectedId ||
        !isEqual(prevSelectedId, selectedId) ||
        !isEqualCollectionItemsById(prevDatasource, datasource, selectedId))
    ) {
      const selectedModel = find(datasource, model => model.id == selectedId);
      const resolveModel = selectedModel || datasource[0];
      onResolve(resolveModel);
    }
  },
});

export const withWidgetHandlers = withHandlers({
  onRowClickAction: ({ rowClick, onActionImpl }) => () => {
    onActionImpl(rowClick);
  },
});

/**
 * Обертка в widgetContainer, мэппинг пропсов
 */
const TableContainer = Table;

export default compose(
  withWidgetContainer,
  withContainerLiveCycle,
  withWidgetHandlers
)(Table);