192 lines
7.8 KiB
JavaScript
192 lines
7.8 KiB
JavaScript
/*
|
||
Парус 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 };
|