/* Парус 8 - Панели мониторинга - ТОиР - Аналитика по ремонтам АТС Пользовательские хуки: Хуки основных компонентов */ //--------------------- //Подключение библиотек //--------------------- import { useState, useContext, useCallback, useEffect } from "react"; //Классы React import { BackEndСtx } from "../../../context/backend"; //Контекст взаимодействия с сервером import { object2Base64XML, formatDateRF } from "../../../core/utils"; //-------------------------- //Вспомогательные компоненты //-------------------------- //----------- //Тело модуля //----------- //Хук графика статусов const useChartStatuses = ({ storedArgs = {} }) => { //Собственное состояние - график const [chartStatuses, setChartStatuses] = useState({ loaded: false, reload: false }); //Подключение к контексту взаимодействия с сервером const { executeStored } = useContext(BackEndСtx); //При необходимости перезагрузки графика const handleReload = useCallback(() => setChartStatuses(pv => ({ ...pv, reload: true })), []); //При подключении к странице useEffect(() => { //Загрузка данных графика с сервера const loadChart = async () => { try { const chart = await executeStored({ stored: "UDO_PKG_P8PANELS_RPR_ANL.CHART_STATUSES", args: { DDATE_FROM: storedArgs.dDateBegin ? new Date(storedArgs.dDateBegin) : null, DDATE_TO: storedArgs.dDateEnd ? new Date(storedArgs.dDateEnd) : null, SINS_DEPARTMENT: storedArgs.sCustomerDept, SEQTYPEWRK: storedArgs.sWorkType, SEQWRKKIND: storedArgs.sWorkKind, NSTATE: storedArgs.nState, NTYPESPEND: storedArgs.nType }, respArg: "COUT" }); setChartStatuses(pv => ({ ...pv, loaded: true, reload: false, ...chart.XCHART })); } catch (e) { setChartStatuses(pv => ({ ...pv, loaded: false, reload: false })); } }; //При необходимости перезагрузить if (chartStatuses.reload) loadChart(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [chartStatuses.reload, executeStored]); //Возвращаем график return { chartStatuses, handleReload }; }; //Хук графика трудовых затрат const useChartSpendings = ({ storedArgs = {} }) => { //Собственное состояние - график const [chartSpendings, setChartSpendings] = useState({ loaded: false, reload: false }); //Подключение к контексту взаимодействия с сервером const { executeStored } = useContext(BackEndСtx); //При необходимости перезагрузки графика const handleReload = useCallback(() => setChartSpendings(pv => ({ ...pv, reload: true })), []); //При подключении к странице useEffect(() => { //Загрузка данных графика с сервера const loadChart = async () => { try { const chart = await executeStored({ stored: "UDO_PKG_P8PANELS_RPR_ANL.CHART_SPENDINGS", args: { DDATE_FROM: storedArgs.dDateBegin ? new Date(storedArgs.dDateBegin) : null, DDATE_TO: storedArgs.dDateEnd ? new Date(storedArgs.dDateEnd) : null, SINS_DEPARTMENT: storedArgs.sCustomerDept, SEQTYPEWRK: storedArgs.sWorkType, SEQWRKKIND: storedArgs.sWorkKind, NSTATE: storedArgs.nState, NTYPESPEND: storedArgs.nType }, respArg: "COUT" }); setChartSpendings(pv => ({ ...pv, loaded: true, reload: false, ...chart.XCHART })); } catch (e) { setChartSpendings(pv => ({ ...pv, loaded: false, reload: false })); } }; //При необходимости перезагрузить if (chartSpendings.reload) loadChart(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [chartSpendings.reload, executeStored]); //Возвращаем график return { chartSpendings, handleReload }; }; //Хук таблицы ремотных ведомостей const useTableRepairs = ({ storedArgs = [] }) => { //Собственное состояние - таблица const [dataGrid, setDataGrid] = useState({ dataLoaded: false, filters: [], orders: null, pageNumber: 1, morePages: true, reloading: false }); //Подключение к контексту взаимодействия с сервером const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx); //При изменении состояния фильтра const handleFilterChanged = ({ filters }) => setDataGrid(pv => ({ ...pv, filters: [...filters], pageNumber: 1, reloading: true })); //При изменении состояния сортировки const handleOrderChanged = ({ orders }) => setDataGrid(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reloading: true })); //При изменении количества отображаемых страниц const handlePagesCountChanged = () => setDataGrid(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reloading: true })); //При необходимости перезагрузки таблицы const handleReload = () => setDataGrid(pv => ({ ...pv, pageNumber: 1, reloading: true })); //При подключении к странице useEffect(() => { //Загрузка данных графика с сервера const loadDataGrid = async () => { try { const data = await executeStored({ stored: "UDO_PKG_P8PANELS_RPR_ANL.DATA_GRID", args: { CFILTERS: { VALUE: object2Base64XML([...dataGrid.filters, ...storedArgs], { arrayNodeName: "filters" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB }, CORDERS: { VALUE: object2Base64XML(dataGrid.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB }, NPAGE_NUMBER: dataGrid.pageNumber, NPAGE_SIZE: 10, NINCLUDE_DEF: dataGrid.dataLoaded ? 0 : 1 }, attributeValueProcessor: (name, val) => (["DDOCDATE", "DDATEFACT_BEG", "DDATEFACT_END"].includes(name) ? formatDateRF(val) : val), respArg: "COUT" }); setDataGrid(pv => ({ ...pv, ...data.XDATA_GRID, columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef || [], rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...(pv.rows || []), ...(data.XDATA_GRID.rows || [])], dataLoaded: true, reloading: false, morePages: (data.XDATA_GRID.rows || []).length >= 10 })); } catch (e) { setDataGrid(pv => ({ ...pv, loaded: false, reload: false })); } }; //При необходимости перезагрузить if (dataGrid.reloading) loadDataGrid(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [dataGrid.reloading, executeStored]); //Возвращаем график return { dataGrid, handleReload, handleFilterChanged, handleOrderChanged, handlePagesCountChanged }; }; //---------------- //Интерфейс модуля //---------------- export { useChartStatuses, useChartSpendings, useTableRepairs };