/* Парус 8 - Панели мониторинга - Редактор настройки регламентированного отчёта Пользовательские хуки */ //--------------------- //Подключение библиотек //--------------------- import { useState, useContext, useEffect, useCallback } from "react"; //Классы React import { ApplicationСtx } from "../../context/application"; //Контекст приложения import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений import dayjs from "dayjs"; //Работа с датами //--------------------------------------------- //Вспомогательные функции форматирования данных //--------------------------------------------- //----------- //Тело модуля //----------- //Хук для события const useClientEvent = taskRn => { //Собственное состояние const [task, setTask] = useState({ init: true, nrn: taskRn, scrn: "", sprefix: "", snumber: "", stype: "", sstatus: "", sdescription: "", sclnt_clnclients: "", sclnt_clnperson: "", dstart_date: "", sinit_clnperson: "", sinit_user: "", sinit_reason: "", sto_company: "", sto_department: "", sto_clnpost: "", sto_clnpsdep: "", sto_clnperson: "", sto_fcstaffgrp: "", sto_user: "", sto_usergrp: "", scurrent_user: "", isUpdate: false, insertDisabled: true, updateDisabled: true }); //Подключение к контексту взаимодействия с сервером const { executeStored } = useContext(BackEndСtx); //Подключение к контексту приложения const { pOnlineShowDictionary } = useContext(ApplicationСtx); //Отображение раздела "Типы событий" const handleTypeOpen = useCallback(async () => { pOnlineShowDictionary({ unitCode: "ClientEventTypes", showMethod: "main", inputParameters: [{ name: "in_EVNTYPE_NAME", value: task.stype }], callBack: async res => { if (res.success) { //Считываем параметры исходя из типа события const data = await executeStored({ stored: "UDO_P8PANELS_TEST.CLNEVNTYPES_INIT", args: { SEVENT_TYPE: res.outParameters.out_EVNTYPE_CODE, SCURRENT_PREF: task.sprefix }, tagValueProcessor: () => undefined }); if (data) { setTask(pv => ({ ...pv, stype: res.outParameters.out_EVNTYPE_CODE, sprefix: data.SPREF, snumber: data.SNUMB, sstatus: data.SDEFAULT_STATUS })); } } } }); }, [executeStored, pOnlineShowDictionary, task.sprefix, task.stype]); //Отображение раздела "Статусы типового события" const handleStatusOpen = useCallback(async () => { pOnlineShowDictionary({ unitCode: "ClientEventTypesStates", showMethod: "main", inputParameters: [ { name: "in_SEVNTYPE_CODE", value: task.stype }, { name: "in_EVENT_STATUS_EVNSTAT_CODE", value: task.sstatus } ], callBack: res => { res.success ? setTask(pv => ({ ...pv, sstatus: res.outParameters.out_EVENT_STATUS_EVNSTAT_CODE })) : null; } }); }, [pOnlineShowDictionary, task.sstatus, task.stype]); //Отображение раздела "Клиенты" const handleClientClientsOpen = useCallback(async () => { pOnlineShowDictionary({ unitCode: "ClientClients", showMethod: "main", inputParameters: [{ name: "in_CLIENT_CODE", value: task.sclnt_clnclients }], callBack: res => { res.success ? setTask(pv => ({ ...pv, sclnt_clnclients: res.outParameters.out_CLIENT_CODE, sclnt_clnperson: "" })) : null; } }); }, [pOnlineShowDictionary, task.sclnt_clnclients]); //Отображение раздела "Сотрудники" const handleClientPersonOpen = useCallback( //Тип открытия (0 - для клиента, 1 - для инициатора) async (nType = 0) => { pOnlineShowDictionary({ unitCode: "ClientPersons", showMethod: "main", inputParameters: [{ name: "in_CODE", value: nType === 0 ? task.sclnt_clnperson : task.sinit_clnperson }], callBack: res => { if (res.success) { if (nType === 0) { setTask(pv => ({ ...pv, sclnt_clnperson: res.outParameters.out_CODE, sclnt_clnclients: "" })); } else { setTask(pv => ({ ...pv, sinit_clnperson: res.outParameters.out_CODE })); } } } }); }, [pOnlineShowDictionary, task.sclnt_clnperson, task.sinit_clnperson] ); //Отображение раздела "Каталоги" для событий const handleCrnOpen = useCallback(async () => { pOnlineShowDictionary({ unitCode: "CatalogTree", showMethod: "main", inputParameters: [ { name: "in_DOCNAME", value: "ClientEvents" }, { name: "in_NAME", value: task.scrn } ], callBack: res => { res.success ? setTask(pv => ({ ...pv, scrn: res.outParameters.out_NAME })) : null; } }); }, [pOnlineShowDictionary, task.scrn]); //Считывание следующего номера события const getEventNextNumb = useCallback(async () => { const data = await executeStored({ stored: "UDO_P8PANELS_TEST.CLNEVENTS_NEXTNUMB_GET", args: { SPREFIX: task.sprefix } }); if (data) { setTask(pv => ({ ...pv, snumber: data.SEVENT_NUMB })); } }, [executeStored, task.sprefix]); //Добавление события const insertEvent = useCallback( async callBack => { await executeStored({ stored: "UDO_P8PANELS_TEST.CLNEVENTS_INSERT", args: { SCRN: task.scrn, SPREF: task.sprefix, SNUMB: task.snumber, STYPE: task.stype, SSTATUS: task.sstatus, SPLAN_DATE: task.dstart_date ? dayjs(task.dstart_date).format("DD.MM.YYYY HH:mm") : null, SINIT_PERSON: task.sinit_clnperson, SCLIENT_CLIENT: task.sclnt_clnclients, SCLIENT_PERSON: task.sclnt_clnperson, SDESCRIPTION: task.sdescription, SREASON: task.sinit_reason } }); callBack(); }, [ executeStored, task.dstart_date, task.sclnt_clnclients, task.sclnt_clnperson, task.scrn, task.sdescription, task.sinit_clnperson, task.sinit_reason, task.snumber, task.sprefix, task.sstatus, task.stype ] ); //Исправление события const updateEvent = useCallback( async callBack => { await executeStored({ stored: "UDO_P8PANELS_TEST.CLNEVENTS_UPDATE", args: { NCLNEVENTS: task.nrn, SCLIENT_CLIENT: task.sclnt_clnclients, SCLIENT_PERSON: task.sclnt_clnperson, SDESCRIPTION: task.sdescription } }); callBack(); }, [executeStored, task.nrn, task.sclnt_clnclients, task.sclnt_clnperson, task.sdescription] ); useEffect(() => { if (task.init) { if (taskRn) { //Считывание параметров события const readEvent = async () => { const data = await executeStored({ stored: "UDO_P8PANELS_TEST.CLNEVENTS_GET", args: { NCLNEVENTS: task.nrn }, respArg: "COUT" }); 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, sclnt_clnclients: data.XEVENT.SCLIENT_CLIENT, sclnt_clnperson: data.XEVENT.SCLIENT_PERSON, dstart_date: data.XEVENT.SPLAN_DATE ? dayjs(data.XEVENT.SPLAN_DATE).format("YYYY-MM-DD HH:mm") : "", sinit_clnperson: data.XEVENT.SINIT_PERSON, sinit_user: data.XEVENT.SINIT_AUTHID, sinit_reason: data.XEVENT.SREASON, sto_company: data.XEVENT.SSEND_CLIENT, sto_department: data.XEVENT.SSEND_DIVISION, sto_clnpost: data.XEVENT.SSEND_POST, sto_clnpsdep: data.XEVENT.SSEND_PERFORM, sto_clnperson: data.XEVENT.SSEND_PERSON, sto_fcstaffgrp: data.XEVENT.SSEND_STAFFGRP, sto_user: data.XEVENT.SSEND_USER_NAME, sto_usergrp: data.XEVENT.SSEND_USER_GROUP, scurrent_user: data.XEVENT.SINIT_AUTHID, isUpdate: true, init: false })); }; //Инициализация параметров события readEvent(); } else { //Считывание изначальных параметров события const initEvent = async () => { const data = await executeStored({ stored: "UDO_P8PANELS_TEST.CLNEVENTS_INIT", args: {} }); if (data) { setTask(pv => ({ ...pv, sprefix: data.SPREF, snumber: data.SNUMB, scurrent_user: data.SINIT_AUTHNAME, sinit_clnperson: data.SINIT_PERSON, sinit_user: !data.SINIT_PERSON ? data.SINIT_AUTHNAME : "", init: false })); } }; //Инициализация изначальных параметров события initEvent(); } } if (!task.init) { setTask(pv => ({ ...pv, sinit_user: !task.sinit_clnperson ? task.scurrent_user : "" })); } }, [executeStored, task.init, task.nrn, task.scurrent_user, task.sinit_clnperson, taskRn]); //Проверка доступности действия useEffect(() => { setTask(pv => ({ ...pv, insertDisabled: !task.scrn || !task.sprefix || !task.snumber || !task.stype || !task.sstatus || !task.sdescription || (!task.sinit_clnperson && !task.sinit_user), updateDisabled: !task.sdescription })); }, [task.scrn, task.sdescription, task.sinit_clnperson, task.sinit_user, task.snumber, task.sprefix, task.sstatus, task.stype]); return [ task, setTask, insertEvent, updateEvent, handleTypeOpen, handleStatusOpen, handleClientClientsOpen, handleClientPersonOpen, handleCrnOpen, getEventNextNumb ]; }; //Карточка события const useTaskCard = () => { //Собственное состояние const [taskCard, setTaskCard] = useState({ openEdit: false }); //Состояние действий const [cardActions, setCardActions] = useState({ anchorMenuMethods: null, openMethods: false }); //Подключение к контексту взаимодействия с сервером const { executeStored } = useContext(BackEndСtx); //Подключение к контексту сообщений const { showMsgWarn } = useContext(MessagingСtx); //Удаление контрагента const deleteEvent = useCallback( async rn => { await executeStored({ stored: "UDO_P8PANELS_TEST.CLNEVENTS_DELETE", args: { NCLNEVENTS: rn } }); }, [executeStored] ); //По нажатию на открытие меню действий const handleMethodsMenuButtonClick = event => { setCardActions(pv => ({ ...pv, anchorMenuMethods: event.currentTarget, openMethods: true })); }; //При закрытии меню const handleMethodsMenuClose = () => { setCardActions(pv => ({ ...pv, anchorMenuMethods: null, openMethods: false })); }; //По нажатия действия "Редактировать" const handleTaskEdit = id => { setTaskCard(pv => ({ ...pv, openEdit: true })); }; //По нажатию действия "Удалить" const handleTaskDelete = id => { showMsgWarn("Удалить событие?", () => deleteEvent(id)); }; //Формируем меню показателей const menuItems = [ { method: "EDIT", name: "Исправить", icon: "edit", func: handleTaskEdit }, { method: "DELETE", name: "Удалить", icon: "delete", func: handleTaskDelete } ]; return [taskCard, setTaskCard, cardActions, handleMethodsMenuButtonClick, handleMethodsMenuClose, menuItems]; }; export { useClientEvent, useTaskCard };