Home Reference Source

src/tools/global.link.js

/**
 * Created by emamoshin on 19.06.2017.
 */
import _ from 'lodash';

const defaultTypeList = ['single', 'multi', 'filter', 'context', 'control'];

/**
 * FORMAT { PREFIX -> WidgetLink : FieldId }
 * @deprecated Клиентский парсинг глобальных ссылок. Устарел.
 * @param state
 * @param links
 * @returns {*}
 */
export function resolveLink(state, links) {
  const { widgets } = state;
  let result;
  if (_.isObject(links)) {
    result = {};
    _.each(links, (val, key) => {
      if (val && isLinkedString(val)) {
        const parsedLink = parseLink(val);
        if (parsedLink) {
          const model = getFromState(
            widgets,
            parsedLink.prefix,
            parsedLink.widget
          );
          if (model) {
            if (parsedLink.field) {
              result[key] = model[parsedLink.field];
            } else {
              result[key] = model;
            }
          } else {
            result[key] = null;
          }
        }
      }
    });
  }
  return Object.assign({}, links, result);
}

function isLinkedString(str) {
  str = String(str);
  const res = str.match('^{([^}^{]*)}$');
  if (res && res[1]) {
    return res[1];
  }
  return false;
}

function parseLink(link) {
  const regExp = link.match('{(.*)->([^:]*):?(.*)}');
  if (regExp) {
    return {
      prefix: regExp[1],
      widget: regExp[2],
      field: regExp[3],
    };
  }
  console.warn('Global link not parsed! (?)'.format(link));
}

// todo: add other global link types
function getFromState(state, prefix, widgetId) {
  return state[widgetId] && state[widgetId].resolveModel;
}