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 };
 |