Home Reference Source

src/selectors/widgets.js

import { createSelector } from 'reselect';
import { FORM, TABLE } from '../components/widgets/widgetTypes';

/*
  Базовые селекторы
*/

/**
 * Базовый селектор всех виджетов
 * @param state
 */
const widgetsSelector = state => {
  return state.widgets || {};
};

/*
  Селекторы генераторы
*/

/**
 * Селектор-генератор для получения виджета по ID
 * @param widgetId
 */
const makeWidgetByIdSelector = widgetId => {
  return createSelector(
    widgetsSelector,
    widgetsState => {
      return widgetsState[widgetId] || {};
    }
  );
};

/**
 * Селектор-генератор для получения свойства виджета - isInit
 * @param widgetId
 */
const makeWidgetIsInitSelector = widgetId =>
  createSelector(
    makeWidgetByIdSelector(widgetId),
    widgetState => {
      return widgetState.isInit;
    }
  );

/**
 * Селектор-генератор для получения свойства виджета - isVisible
 * @param widgetId
 */
const makeWidgetVisibleSelector = widgetId =>
  createSelector(
    makeWidgetByIdSelector(widgetId),
    widgetState => widgetState.isVisible
  );

/**
 * Селектор-генератор для получения свойства виджета - isEnabled
 * @param widgetId
 */
const makeWidgetEnabledSelector = widgetId =>
  createSelector(
    makeWidgetByIdSelector(widgetId),
    widgetState => widgetState.isEnabled
  );

/**
 * Селектор-генератор для получения свойства виджета - isLoading
 * @param widgetId
 */
const makeWidgetLoadingSelector = widgetId =>
  createSelector(
    makeWidgetByIdSelector(widgetId),
    widgetState => widgetState.isLoading
  );

/**
 * Селектор-генератор для получения свойства виджета - size
 * @param widgetId
 */
const makeWidgetSizeSelector = widgetId =>
  createSelector(
    makeWidgetByIdSelector(widgetId),
    widgetState => widgetState.size
  );

/**
 * Селектор-генератор для получения свойства виджета - count
 * @param widgetId
 */
const makeWidgetCountSelector = widgetId =>
  createSelector(
    makeWidgetByIdSelector(widgetId),
    widgetState => widgetState.count
  );

/**
 * Селектор-генератор для получения свойства виджета - page
 * @param widgetId
 */
const makeWidgetPageSelector = widgetId =>
  createSelector(
    makeWidgetByIdSelector(widgetId),
    widgetState => widgetState.page
  );

const makeWidgetPageIdSelector = widgetId =>
  createSelector(
    makeWidgetByIdSelector(widgetId),
    widgetState => widgetState.pageId
  );

/**
 * Селектор-генератор для получения свойства виджета - sorting
 * @param widgetId
 */
const makeWidgetSortingSelector = widgetId =>
  createSelector(
    makeWidgetByIdSelector(widgetId),
    widgetState => widgetState.sorting
  );

/**
 * Селектор-генератор для получения свойства виджета - isFilterVisible
 * @param widgetId
 */
const makeWidgetFilterVisibilitySelector = widgetId =>
  createSelector(
    makeWidgetByIdSelector(widgetId),
    widgetState => {
      return widgetState.isFilterVisible;
    }
  );

/**
 * Селектор-генератор для получения свойства виджета - sorting
 * @param widgetId
 */
const makeWidgetValidationSelector = widgetId =>
  createSelector(
    makeWidgetByIdSelector(widgetId),
    widgetState => widgetState.validation
  );

const makeSelectedIdSelector = widgetId =>
  createSelector(
    makeWidgetByIdSelector(widgetId),
    widgetState => widgetState.selectedId
  );

const makeIsActiveSelector = widgetId =>
  createSelector(
    makeWidgetByIdSelector(widgetId),
    widgetState => widgetState.isActive
  );

const makeTypeSelector = widgetId =>
  createSelector(
    makeWidgetByIdSelector(widgetId),
    widgetState => widgetState.type
  );

const makeWidgetDataProviderSelector = widgetId =>
  createSelector(
    makeWidgetByIdSelector(widgetId),
    widgetState => widgetState.dataProvider
  );

const isAnyTableFocusedSelector = createSelector(
  widgetsSelector,
  widgetsState => {
    return Object.values(widgetsState).some(
      widget =>
        (widget.type === TABLE || widget.type === FORM) && widget.isActive
    );
  }
);
/*
  Остальные селекторы
*/

export {
  widgetsSelector,
  makeWidgetByIdSelector,
  makeWidgetIsInitSelector,
  makeWidgetVisibleSelector,
  makeWidgetEnabledSelector,
  makeWidgetLoadingSelector,
  makeWidgetSizeSelector,
  makeWidgetCountSelector,
  makeWidgetSortingSelector,
  makeWidgetFilterVisibilitySelector,
  makeWidgetValidationSelector,
  makeSelectedIdSelector,
  makeIsActiveSelector,
  makeWidgetPageSelector,
  makeWidgetPageIdSelector,
  makeTypeSelector,
  makeWidgetDataProviderSelector,
  isAnyTableFocusedSelector,
};