213 lines
9.4 KiB
JavaScript
213 lines
9.4 KiB
JavaScript
/*
|
||
Парус 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 };
|