forked from CITKParus/P8-Panels
		
	
		
			
				
	
	
		
			83 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | ||
|     Парус 8 - Панели мониторинга - ПУП - Информация о проектах
 | ||
|     Список проектов: пользовательские хуки для взаимодействия с сервером
 | ||
| */
 | ||
| 
 | ||
| //---------------------
 | ||
| //Подключение библиотек
 | ||
| //---------------------
 | ||
| 
 | ||
| import { useState, useContext, useEffect } from "react"; //Классы React
 | ||
| import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
 | ||
| import { object2Base64XML, formatDateRF } from "../../core/utils"; //Вспомогательные функции
 | ||
| import config from "../../../app.config"; //Настройки приложения
 | ||
| 
 | ||
| //---------
 | ||
| //Константы
 | ||
| //---------
 | ||
| 
 | ||
| //Размер страницы данных
 | ||
| const DATA_GRID_PAGE_SIZE = config.SYSTEM.PAGE_SIZE;
 | ||
| 
 | ||
| //-----------
 | ||
| //Тело модуля
 | ||
| //-----------
 | ||
| 
 | ||
| //Получение данных проектов с сервера
 | ||
| const useProjectsDataGrid = ({ prjType, insDep, priceStructStatus, prjState, search, pageNumber, orders }) => {
 | ||
|     //Собственное состояние - флаг загрузки
 | ||
|     const [isLoading, setLoading] = useState(false);
 | ||
| 
 | ||
|     //Собственное состояние - таблица данных
 | ||
|     const [data, setData] = useState({ init: false, morePages: true });
 | ||
| 
 | ||
|     //Подключение к контексту взаимодействия с сервером
 | ||
|     const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
 | ||
| 
 | ||
|     //При необходимости обновить данные таблицы
 | ||
|     useEffect(() => {
 | ||
|         //Загрузка данных таблицы с сервера
 | ||
|         const loadData = async () => {
 | ||
|             try {
 | ||
|                 setLoading(true);
 | ||
|                 const data = await executeStored({
 | ||
|                     stored: "PKG_P8PANELS_PROJECTS.INFO_PROJECTS_DG",
 | ||
|                     args: {
 | ||
|                         SPRJ_TYPE: prjType,
 | ||
|                         SINS_DEPARTMENT: insDep,
 | ||
|                         NCOST_STATUS: priceStructStatus,
 | ||
|                         NSTATE: prjState,
 | ||
|                         SSEARCH: search,
 | ||
|                         CORDERS: { VALUE: object2Base64XML(orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
 | ||
|                         NPAGE_NUMBER: pageNumber,
 | ||
|                         NPAGE_SIZE: DATA_GRID_PAGE_SIZE,
 | ||
|                         NINCLUDE_DEF: pageNumber == 1 ? 1 : 0
 | ||
|                     },
 | ||
|                     respArg: "COUT",
 | ||
|                     loader: true,
 | ||
|                     attributeValueProcessor: (name, val) => (["DBEGPLAN", "DENDPLAN"].includes(name) ? formatDateRF(val) : val)
 | ||
|                 });
 | ||
|                 setData(pv => ({
 | ||
|                     ...pv,
 | ||
|                     columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef || [],
 | ||
|                     rows: pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...(pv.rows || []), ...(data.XDATA_GRID.rows || [])],
 | ||
|                     morePages: DATA_GRID_PAGE_SIZE == 0 ? false : (data.XDATA_GRID.rows || []).length >= DATA_GRID_PAGE_SIZE,
 | ||
|                     init: true
 | ||
|                 }));
 | ||
|             } finally {
 | ||
|                 setLoading(false);
 | ||
|             }
 | ||
|         };
 | ||
|         loadData();
 | ||
|     }, [prjType, insDep, priceStructStatus, prjState, search, pageNumber, orders, executeStored, SERV_DATA_TYPE_CLOB]);
 | ||
| 
 | ||
|     //Возвращаем интерфейс хука
 | ||
|     return [data, isLoading];
 | ||
| };
 | ||
| 
 | ||
| //----------------
 | ||
| //Интерфейс модуля
 | ||
| //----------------
 | ||
| 
 | ||
| export { useProjectsDataGrid };
 |