Home Reference Source

src/utils/factoryResolver.js

import _ from 'lodash';

import headers from '../components/widgets/Table/headers';
import cells from '../components/widgets/Table/cells';
import fieldsets from '../components/widgets/Form/fields';
import fields from '../components/widgets/Form/fieldsets';
import actions from '../impl/actions';
import exportModal from '../components/widgets/Table/ExportModal';
import storyModal from '../components/widgets/Table/StoryModal';
import ToggleColumn from '../components/actions/Dropdowns/ToggleColumn';
import ChangeSize from '../components/actions/Dropdowns/ChangeSize';
import controls from '../components/controls';
import NotFoundFactory from '../core/factory/NotFoundFactory';

const index = {
  ...headers,
  ...cells,
  ...fieldsets,
  ...fields,
  ...actions,
  ...controls,
  exportModal,
  storyModal,
  ToggleColumn,
  ChangeSize,
  NotFoundFactory,
};

const functionType = 'function';
const componentType = 'component';

/**
 * Функция преобразует ссылку в метаданных на компонент, на React компонент.
 * Производит поиск свойства src и заменяет его на свойство component, где значение компонент из компонентных карт.
 * @param {Object} props - объект свойств которые требуется преобразовать
 * @param {String} defaultComponent - src-string по-умолчанию
 * @param {String} type - тип преобразуемого объекта
 * @return {Object}
 * @example
 * const props = {
 *  widgetId: "Test.test",
 *  src: "TableWidget"
 * }
 *
 * console.log(factoryResolver(props, 'widgets'))
 *
 * //- {widgetId: "Test.test", component: TableWidget}
 */
export default function factoryResolver(
  props,
  defaultComponent = 'NotFoundFactory',
  type = componentType
) {
  let obj = {};
  if (_.isObject(props)) {
    Object.keys(props).map(key => {
      if (_.isObject(props[key])) {
        obj[key] = factoryResolver(props[key]);
      } else if (key === 'src') {
        obj[type] = index[props[key]] || index[defaultComponent];
      } else {
        obj[key] = props[key];
      }
    });
    return _.isArray(props) ? _.values(obj) : obj;
  } else if (_.isString(props)) {
    return index[props] || index[defaultComponent];
  }
  return props;
}