/* Парус 8 - Панели мониторинга - УДП - Доски задач Пользовательские хуки: Хуки диалога события */ //--------------------- //Подключение библиотек //--------------------- import { useState, useContext, useEffect } from "react"; //Классы React import { BackEndСtx } from "../../../context/backend"; //Контекст взаимодействия с сервером //----------- //Тело модуля //----------- //Хук для события const useClientEvent = (taskRn, taskType = "", taskStatus = "") => { //Собственное состояние const [task, setTask] = useState({ init: true, nRn: taskRn, sCrn: "", sPrefix: "", sNumber: "", sType: taskType, sStatus: taskStatus, sDescription: "", sClntClients: "", sClntClnperson: "", dStartDate: "", sInitClnperson: "", sInitUser: "", sInitReason: "", sToCompany: "", sToDepartment: "", sToClnpost: "", sToClnpsdep: "", sToClnperson: "", sToFcstaffgrp: "", sToUser: "", sToUsergrp: "", sCurrentUser: "", isUpdate: false, insertDisabled: true, updateDisabled: true, docProps: {} }); //Подключение к контексту взаимодействия с сервером const { executeStored } = useContext(BackEndСtx); //При инициализации события useEffect(() => { //Если это инициализация if (task.init) { //Если указан рег. номер события if (taskRn) { //Считывание параметров события const readEvent = async () => { //Считываем информацию о событии по рег. номеру const data = await executeStored({ stored: "PKG_P8PANELS_CLNTTSKBRD.CLNEVENTS_GET", args: { NCLNEVENTS: task.nRn }, respArg: "COUT" }); //Фильтруем доп. свойства let docProps = Object.keys(data.XEVENT) .filter(key => key.includes("DP_")) .reduce((prev, key) => ({ ...prev, [key]: data.XEVENT[key] }), {}); //Устанавливаем информацию о событии setTask(pv => ({ ...pv, sCrn: data.XEVENT.SCRN, sPrefix: data.XEVENT.SPREF, sNumber: data.XEVENT.SNUMB, sType: data.XEVENT.STYPE, sStatus: data.XEVENT.SSTATUS, sDescription: data.XEVENT.SDESCRIPTION, sClntClients: data.XEVENT.SCLIENT_CLIENT, sClntClnperson: data.XEVENT.SCLIENT_PERSON, dPlanDate: data.XEVENT.SPLAN_DATE, sInitClnperson: data.XEVENT.SINIT_PERSON, sInitUser: data.XEVENT.SINIT_AUTHID, sInitReason: data.XEVENT.SREASON, sToCompany: data.XEVENT.SSEND_CLIENT, sToDepartment: data.XEVENT.SSEND_DIVISION, sToClnpost: data.XEVENT.SSEND_POST, sToClnpsdep: data.XEVENT.SSEND_PERFORM, sToClnperson: data.XEVENT.SSEND_PERSON, sToFcstaffgrp: data.XEVENT.SSEND_STAFFGRP, sToUser: data.XEVENT.SSEND_USER_NAME, sToUsergrp: data.XEVENT.SSEND_USER_GROUP, sCurrentUser: data.XEVENT.SINIT_AUTHID, isUpdate: true, init: false, docProps: docProps })); }; //Инициализация параметров события readEvent(); } else { //Считывание изначальных параметров события const initEvent = async () => { //Инициализируем параметры события const data = await executeStored({ stored: "PKG_P8PANELS_CLNTTSKBRD.CLNEVENTS_INIT", args: { SEVENT_TYPE: task.sType } }); //Если есть данные if (data) { //Устанавливаем данные по событию setTask(pv => ({ ...pv, sPrefix: data.SPREF, sNumber: data.SNUMB, sCurrentUser: data.SINIT_AUTHNAME, sInitClnperson: data.SINIT_PERSON, sInitUser: !data.SINIT_PERSON ? data.SINIT_AUTHNAME : "", init: false })); } }; //Инициализация изначальных параметров события initEvent(); } } if (!task.init) { setTask(pv => ({ ...pv, sInitUser: !task.sInitClnperson ? task.sCurrentUser : "" })); } }, [executeStored, task.init, task.nRn, task.sType, task.sCurrentUser, task.sInitClnperson, taskRn]); //Проверка доступности действия useEffect(() => { setTask(pv => ({ ...pv, insertDisabled: !task.sCrn || !task.sPrefix || !task.sNumber || !task.sType || !task.sStatus || !task.sDescription || (!task.sInitClnperson && !task.sInitUser), updateDisabled: !task.sDescription })); }, [task.sCrn, task.sDescription, task.sInitClnperson, task.sInitUser, task.sNumber, task.sPrefix, task.sStatus, task.sType]); return [task, setTask]; }; //Хук для получения свойств раздела "События" const useDocsProps = taskType => { //Собственное состояние const [docProps, setDocsProps] = useState({ loaded: false, props: [] }); //Подключение к контексту взаимодействия с сервером const { executeStored } = useContext(BackEndСtx); useEffect(() => { //Загрузка доп. свойств let getDocsProps = async () => { //Считываема доп. свойства по типу события const data = await executeStored({ stored: "PKG_P8PANELS_CLNTTSKBRD.CLNEVENTS_PROPS_GET", args: { SEVNTYPE_CODE: taskType }, isArray: name => name === "XPROPS", respArg: "COUT" }); //Устанавливаем доп. свойства setDocsProps({ loaded: true, props: [...(data?.XPROPS || [])] }); }; //Если доп. свойства не загружены if (!docProps.loaded) { //Загружаем доп. свойства getDocsProps(); } }, [docProps.loaded, executeStored, taskType]); return [docProps]; }; //---------------- //Интерфейс модуля //---------------- export { useClientEvent, useDocsProps };