P8-Panels/app/panels/clnt_task_board/hooks/task_dialog_hooks.js

192 lines
7.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
Парус 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 };