/* Парус 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 };