216 lines
9.2 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 { 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 };