216 lines
9.2 KiB
JavaScript
216 lines
9.2 KiB
JavaScript
/*
|
||
Парус 8 - Панели мониторинга - Редактор настройки регламентированного отчёта
|
||
Пользовательские хуки
|
||
*/
|
||
|
||
//---------------------
|
||
//Подключение библиотек
|
||
//---------------------
|
||
|
||
import { useState, useContext, useEffect } from "react"; //Классы React
|
||
import { xml2JSON } from "../../core/utils"; //Вспомогательные функции
|
||
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
|
||
|
||
//-----------
|
||
//Тело модуля
|
||
//-----------
|
||
|
||
//Получение данных о разделах настройки РО
|
||
const useConfSections = conf => {
|
||
//Собственное состояние - флаг инициализированности
|
||
const [isInit, setInit] = useState(false);
|
||
|
||
//Собственное состояние - флаг загрузки
|
||
const [isLoading, setLoading] = useState(false);
|
||
|
||
//Собственное состояние - флаг необходимости обновления
|
||
const [refresh, setRefresh] = useState(true);
|
||
|
||
//Собственное состояние - данные настройки
|
||
const [dataConf, setDataConf] = useState(null);
|
||
|
||
//Собственное состояние - данные разделов
|
||
const [dataSections, setDataSections] = useState([]);
|
||
|
||
//Подключение к контексту взаимодействия с сервером
|
||
const { executeStored } = useContext(BackEndСtx);
|
||
|
||
//Обновление данных
|
||
const doRefresh = () => setRefresh(true);
|
||
|
||
//При необходимости получить/обновить данные
|
||
useEffect(() => {
|
||
//Загрузка данных с сервера
|
||
const loadData = async () => {
|
||
try {
|
||
setLoading(true);
|
||
const data = await executeStored({
|
||
stored: "PKG_P8PANELS_RRPCONFED.RRPCONF_GET",
|
||
args: { NRRPCONF: conf },
|
||
respArg: "COUT",
|
||
isArray: name => name === "XSECTIONS",
|
||
attributeValueProcessor: (name, val) => (name.startsWith("S") ? undefined : val),
|
||
loader: false
|
||
});
|
||
setDataConf(data?.XCONF || null);
|
||
setDataSections(data?.XSECTIONS || []);
|
||
setInit(true);
|
||
} finally {
|
||
setRefresh(false);
|
||
setLoading(false);
|
||
}
|
||
};
|
||
//Если надо обновить
|
||
if (refresh)
|
||
if (conf)
|
||
//Если есть для чего получать данные
|
||
loadData();
|
||
//Нет идентификатора настройки - нет данных
|
||
else {
|
||
setDataConf(null);
|
||
setDataSections([]);
|
||
}
|
||
}, [refresh, conf, executeStored]);
|
||
|
||
//При изменении входных свойств - поднимаем флаг обновления
|
||
useEffect(() => setRefresh(true), [conf]);
|
||
|
||
//Возвращаем интерфейс хука
|
||
return [dataConf, dataSections, doRefresh, isLoading, isInit];
|
||
};
|
||
|
||
//Получение данных о показателях раздела настройки РО
|
||
const useConfSectionMarks = (section, rowOrder = 0, columnOrder = 0) => {
|
||
//Собственное состояние - флаг инициализированности
|
||
const [isInit, setInit] = useState(false);
|
||
|
||
//Собственное состояние - флаг загрузки
|
||
const [isLoading, setLoading] = useState(false);
|
||
|
||
//Собственное состояние - флаг необходимости обновления
|
||
const [refresh, setRefresh] = useState(true);
|
||
|
||
//Собственное состояние - данные
|
||
const [data, setData] = useState(null);
|
||
|
||
//Подключение к контексту взаимодействия с сервером
|
||
const { executeStored } = useContext(BackEndСtx);
|
||
|
||
//Обновление данных
|
||
const doRefresh = () => setRefresh(true);
|
||
|
||
//При необходимости получить/обновить данные
|
||
useEffect(() => {
|
||
//Загрузка данных с сервера
|
||
const loadData = async () => {
|
||
try {
|
||
setLoading(true);
|
||
const data = await executeStored({
|
||
stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTN_GET",
|
||
args: { NRRPCONFSCTN: section, NROW_ORDER: rowOrder, NCOL_ORDER: columnOrder },
|
||
respArg: "COUT"
|
||
});
|
||
if (data) {
|
||
for (let i = 0; i < data?.XDATA_GRID?.rows?.length; i++)
|
||
for (const key of Object.keys(data.XDATA_GRID.rows[i]))
|
||
if (key.startsWith("SCOL_"))
|
||
data.XDATA_GRID.rows[i][key] = (
|
||
await xml2JSON({
|
||
xmlDoc: data.XDATA_GRID.rows[i][key],
|
||
isArray: name => name === "CONSTITUTION",
|
||
attributeValueProcessor: (name, val) => (name.startsWith("S") ? undefined : val)
|
||
})
|
||
).XMARK;
|
||
setData(data?.XDATA_GRID || null);
|
||
} else setData(null);
|
||
setInit(true);
|
||
} finally {
|
||
setRefresh(false);
|
||
setLoading(false);
|
||
}
|
||
};
|
||
//Если надо обновить
|
||
if (refresh)
|
||
if (section)
|
||
//Если есть для чего получать данные
|
||
loadData();
|
||
//Нет идентификатора раздела настройки - нет данных
|
||
else setData(null);
|
||
}, [refresh, section, rowOrder, columnOrder, executeStored]);
|
||
|
||
//При изменении входных свойств - поднимаем флаг обновления
|
||
useEffect(() => setRefresh(true), [section, rowOrder, columnOrder]);
|
||
|
||
//При изменении раздела - сбрасываем флаг инициализированности (так карточки показателей грузятся красивее - таблица исчезает и появляется уже загруженная)
|
||
useEffect(() => setInit(false), [section]);
|
||
|
||
//Возвращаем интерфейс хука
|
||
return [data, doRefresh, isLoading, isInit];
|
||
};
|
||
|
||
//Работа со словарями
|
||
const useDictionary = () => {
|
||
//Подключение к контексту приложения
|
||
const { pOnlineShowDictionary } = useContext(ApplicationСtx);
|
||
|
||
//Выбор строки
|
||
const selectRRPRow = (code, version, callBack) => {
|
||
pOnlineShowDictionary({
|
||
unitCode: "RRPRow",
|
||
inputParameters: [
|
||
{ name: "in_CODE", value: code },
|
||
{ name: "in_RRPVERSION_CODE", value: version }
|
||
],
|
||
callBack: res =>
|
||
callBack(res.success === true ? { code: res.outParameters.out_CODE, version: res.outParameters.out_RRPVERSION_CODE } : null)
|
||
});
|
||
};
|
||
|
||
//Выбор графы
|
||
const selectRRPColumn = (code, version, callBack) => {
|
||
pOnlineShowDictionary({
|
||
unitCode: "RRPColumn",
|
||
inputParameters: [
|
||
{ name: "in_CODE", value: code },
|
||
{ name: "in_RRPVERSION_CODE", value: version }
|
||
],
|
||
callBack: res =>
|
||
callBack(res.success === true ? { code: res.outParameters.out_CODE, version: res.outParameters.out_RRPVERSION_CODE } : null)
|
||
});
|
||
};
|
||
|
||
//Отображение показателя раздела
|
||
const showMark = (mark, callBack) => showMarkCn(mark, null, callBack);
|
||
|
||
//Отображение состава показателя раздела
|
||
const showMarkCn = (mark, constitution, callBack) =>
|
||
pOnlineShowDictionary({
|
||
unitCode: "RRPConfigSectionMark",
|
||
showMethod: "link_cn",
|
||
inputParameters: [
|
||
{ name: "in_RN", value: mark },
|
||
{ name: "in_RRPCONFSCTNMRKCN", value: constitution }
|
||
],
|
||
callBack
|
||
});
|
||
|
||
//Отображение состава показателя раздела с добавлением
|
||
const showMarkCnAdd = (mark, callBack) =>
|
||
pOnlineShowDictionary({
|
||
unitCode: "RRPConfigSectionMarkConstitution",
|
||
showMethod: "link_add",
|
||
inputParameters: [{ name: "in_PRN", value: mark }],
|
||
callBack
|
||
});
|
||
|
||
//Возвращаем интерфейс хука
|
||
return { selectRRPRow, selectRRPColumn, showMark, showMarkCn, showMarkCnAdd };
|
||
};
|
||
|
||
//----------------
|
||
//Интерфейс модуля
|
||
//----------------
|
||
|
||
export { useConfSections, useConfSectionMarks, useDictionary };
|