213 lines
9.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
Парус 8 - Панели мониторинга - Редакторы панелей
Вспомогательные ресурсы компонента "Редактор действия"
*/
//---------------------
//Подключение библиотек
//---------------------
import { genUID } from "../../../core/utils"; //Вспомогательные функции
import {
P8P_CA_DEF_TYPE_VALUE,
P8P_CA_TYPE,
P8P_CA_SOURCE_FIELDS,
P8P_CA_OBJECT_SOURCE_FIELDS,
P8P_CA_OPEN_UNIT_INITIAL,
P8P_CA_INPUT_PARAM_INITIAL,
P8P_CA_OPEN_PANEL_INITIAL,
P8P_CA_VARIABLE_LINK_INITIAL
} from "./common"; //Общие ресурсы действий
//---------
//Константы
//---------
//------------------------------------
//Вспомогательные функции и компоненты
//------------------------------------
//Доступность сохранения настроек действия
const isActionOkDisabled = action => {
//Если область или тип не указаны
if (!action.area || !action.type) return true;
//Исходим от типа
switch (action.type) {
//Открыть раздел
case P8P_CA_TYPE.openUnit.code:
return !action.params.unitCode || !action.params.showMethod;
//Открыть панель
case P8P_CA_TYPE.openPanel.code:
return !action.params.tabValue.type || !action.params.tabValue.value || !action.params.panelValue.type || !action.params.panelValue.value;
//Установить переменную
case P8P_CA_TYPE.setVariable.code:
return action.params.length === 0 || action.params.some(item => !item.variableSource);
//Для всех остальных
default:
return false;
}
};
//Считывание параметров типа действия
const getActionTypeParams = type => {
//Определяем от типа
switch (type) {
//Открыть раздел
case P8P_CA_TYPE.openUnit.code:
return { ...P8P_CA_OPEN_UNIT_INITIAL, inputParams: [{ ...P8P_CA_INPUT_PARAM_INITIAL }] };
//Открыть панель
case P8P_CA_TYPE.openPanel.code:
return { ...P8P_CA_OPEN_PANEL_INITIAL };
//Установить переменную
case P8P_CA_TYPE.setVariable.code:
return [{ ...P8P_CA_VARIABLE_LINK_INITIAL }];
//Для всех остальных
default:
return {};
}
};
//Определение значения действия по типу
const getActionValueByType = (type, value, values, prms = {}, getCustomTypeValue = null) => {
//Исходим от типа действия
switch (type) {
//Значение (стандартное)
case P8P_CA_DEF_TYPE_VALUE.TEXT_VALUE:
return value;
//Переменная (стандартное)
case P8P_CA_DEF_TYPE_VALUE.VARIABLE:
return values[value];
//Кастомный тип
default:
return getCustomTypeValue ? getCustomTypeValue({ type, value, values, prms }) : null;
}
};
//Определения функции действия
const getActionFunction = (item, onOpenUnit, configUrlBase, onOpenPanel, onProviderChange, getCustomTypeValue = null) => {
//Выполняем исходя из типа действия
switch (item.type) {
//Открыть раздел
case P8P_CA_TYPE.openUnit.code: {
return ({ event, values, prms }) => {
onOpenUnit({
unitCode: item.params.unitCode,
showMethod: item.params.showMethod,
inputParameters: item.params.inputParams.reduce(
(prev, cur) =>
cur.inputParameter
? [
...prev,
{
name: cur.inputParameter,
value: getActionValueByType(cur.resultValue.type, cur.resultValue.value, values, prms, getCustomTypeValue)
}
]
: [...prev],
[]
),
modal: item.params.modal
});
event?.stopPropagation && event.stopPropagation();
};
}
//Открыть панель
case P8P_CA_TYPE.openPanel.code: {
return ({ event, values, prms }) => {
onOpenPanel({
id: genUID(),
url: `${configUrlBase}panels_editor?SCODE=${getActionValueByType(
item.params.panelValue.type,
item.params.panelValue.value,
values,
prms,
getCustomTypeValue
)}`,
caption:
getActionValueByType(item.params.tabValue.type, item.params.tabValue.value, values, prms, getCustomTypeValue) ||
"Редактор панелей"
});
event?.stopPropagation && event.stopPropagation();
};
}
//Установить переменную
case P8P_CA_TYPE.setVariable.code: {
//Устанавливаем новые значения проводников
return ({ event, values, prms }) => {
//Собираем объект новых значений проводников
let changedValues = item.params.reduce(
(prev, cur) => ({
...prev,
...{
[cur.variableSource]: getActionValueByType(cur.resultValue.type, cur.resultValue.value, values, prms, getCustomTypeValue)
}
}),
{}
);
onProviderChange({ ...changedValues });
event?.stopPropagation && event.stopPropagation();
};
}
}
};
//Выполнение действий компонента
const getHandlersByActions = (actions, onOpenUnit, configUrlBase, onOpenPanel, onProviderChange, getCustomTypeValue = null) => {
//Инициализируем обработчики
const handlers = actions.reduce((prev, cur) => {
//Ключ обработчика
let key = `${cur.area}.${cur.element}`;
//Если уже был добавлен - не добавляем, иначе добавляем
return !prev[key] ? { ...prev, [key]: { area: cur.area, element: cur.element, fn: null } } : { ...prev };
}, {});
//Обходим уникальные обработчики
for (const handler in handlers) {
//Считываем действия области
let areaActions = actions.filter(item => item.area === handlers[handler].area && item.element === handlers[handler].element);
//Собираем массив обработчиков области
let areaFunctions = areaActions.reduce(
(fns, action) => [...fns, getActionFunction(action, onOpenUnit, configUrlBase, onOpenPanel, onProviderChange, getCustomTypeValue)],
[]
);
//Устанавливаем области последовательный вызов обработчиков
handlers[handler].fn = ({ event, values, prms }) => {
areaFunctions.map(fn => fn({ event, values, prms }));
};
}
//Возвращаем обработчики
return handlers;
};
//Считывание всех связанных переменных рекурсивно
const getActionsVariablesRecursive = (objValue, propName = null) => {
//Если это значение
if (!(typeof objValue === "object") && !Array.isArray(objValue)) {
//Если поле из списка хранящих ссылку - берем его
return P8P_CA_SOURCE_FIELDS.includes(propName) && objValue ? [objValue] : [];
}
//Если это объект хранящий тип и значение - может хранить ссылку на переменную
if (P8P_CA_OBJECT_SOURCE_FIELDS.includes(propName)) {
//Если тип "Переменная" - указываем значение
return objValue?.type === P8P_CA_DEF_TYPE_VALUE.VARIABLE && objValue?.value ? [objValue.value] : [];
}
//Если это массив
if (Array.isArray(objValue)) {
return objValue.reduce((prev, cur) => [...prev, ...getActionsVariablesRecursive(cur)], []);
} else {
//Если это объект
return Object.keys(objValue).reduce((prev, cur) => [...prev, ...getActionsVariablesRecursive(objValue[cur], cur)], []);
}
};
//Считывание всех связанных переменных действий
const getActionsVariables = actions => {
//Считываем связанные переменные действий рекурсивно
return getActionsVariablesRecursive(actions);
};
//----------------
//Интерфейс модуля
//----------------
export { isActionOkDisabled, getActionTypeParams, getActionsVariables, getHandlersByActions };