/* Парус 8 - Панели мониторинга - ТОиР - Прогнозирование технического состояния Закладка администрирования */ //--------------------- //Подключение библиотек //--------------------- import React, { useState, useEffect, useContext } from "react"; //Классы React import PropTypes from "prop-types"; //Контроль свойств компонента import { Box, Grid, Stack, Icon, Button, IconButton } from "@mui/material"; //Интерфейсные компоненты import { ApplicationСtx } from "../../context/application"; //Контекст приложения import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с серверомs import { EquipDataSelectionIU, EquipDataSelectionList, EquipDataSelectionClassMachineIU, EquipDataSelectionClassMachineList, EquipDataSelectionClassMachineCard, EquipDataSelectionClassMachineModelIU } from "./admin_tab_layout"; //Вспомогательные компоненты и вёрстка import { DS_RN_DEFAULT, useEquipDataSelectionList, useEquipDataSelectionClassMachineList, useEquipDataSelectionClassMachineCard, useEquipDataSelectionClassMachineFilesList, useEquipDataSelectionClassMachineModelsList } from "./admin_tab_hooks"; //Вспомогательные хуки //--------- //Константы //--------- //Начальное состояние флагов обновления const REFRESH_INITIAL = { action: null, dataSelection: null, dataSelectionClassMachine: null, dataSelectionClassMachineCard: 0, dataSelectionClassMachineFilesList: 0, dataSelectionClassMachineModelsList: 0 }; //Стили const STYLES = { DATA_SELECTION_STACK: { alignItems: "center" }, CLASS_MACHINE_ADD_BUTTON: { margin: "5px" } }; //----------- //Тело модуля //----------- //Закладка администрирования const AdminTab = ({ dataSelection = DS_RN_DEFAULT, dataSelectionClassMachine = null }) => { //Подключение к контексту взаимодействия с сервером const { executeStored } = useContext(BackEndСtx); //Подключение к контексту приложения const { pOnlineUserProcedure } = useContext(ApplicationСtx); //Собственное состояние - отображаемые диалоги const [dialogs, setDialogs] = useState({ dataSelectionIU: false, dataSelectionClassMachineIU: false, dataSelectionClassMachineModelIU: false }); //Собственное состояние - флаги обновления данных const [refresh, setRefresh] = useState(REFRESH_INITIAL); //Собственное состояние - выбранная выборка данных const [equipDataSelection, setDataSelection] = useState(dataSelection); //Собственное состояние - выбранный класс оборудования const [equipDataSelectionClassMachine, setDataSelectionClassMachine] = useState(dataSelectionClassMachine); //Загрузка списка выборок данных const { equipDataSelectionList } = useEquipDataSelectionList(refresh.dataSelection); //Загрузка классов оборудования выбранной выборки данных const { equipDataSelectionClassMachineList } = useEquipDataSelectionClassMachineList(equipDataSelection, refresh.dataSelectionClassMachine); //Загрузка карточки класса оборудования const { equipDataSelectionClassMachineCard } = useEquipDataSelectionClassMachineCard( equipDataSelectionClassMachine, refresh.dataSelectionClassMachineCard ); //Загрузка файлов класса оборудования const { equipDataSelectionClassMachineFilesList } = useEquipDataSelectionClassMachineFilesList( equipDataSelectionClassMachine, refresh.dataSelectionClassMachineFilesList ); //Загрузка моделей класса оборудования const { equipDataSelectionClassMachineModelsList } = useEquipDataSelectionClassMachineModelsList( equipDataSelectionClassMachine, refresh.dataSelectionClassMachineModelsList ); //При смене выборки данных const handleDataSelectionChange = value => { setDataSelection(value); setDataSelectionClassMachine(null); setRefresh(REFRESH_INITIAL); }; //При нажатии на "Добавить выборку" const handleAddEquipDataSelection = () => setDialogs(pv => ({ ...pv, dataSelectionIU: true })); //При нажатии на "Удалить выборку" const handleDeleteEquipDataSelection = async () => { await executeStored({ stored: "UDO_PKG_EQUIPDS.DEL", args: { NRN: equipDataSelection } }); setRefresh(pv => ({ ...pv, dataSelection: equipDataSelection * 2, action: "DEL" })); setDataSelection(DS_RN_DEFAULT); }; //При отмене диалога IU выборки const handleEquipDataSelectionIUCancel = () => setDialogs(pv => ({ ...pv, dataSelectionIU: false })); //При сохранении диалога IU выборки const handleEquipDataSelectionIUOk = async values => { const data = await executeStored({ stored: "UDO_PKG_EQUIPDS.INS", args: { SCODE: values.code, SNAME: values.name } }); setDialogs(pv => ({ ...pv, dataSelectionIU: false })); setRefresh(pv => ({ ...pv, dataSelection: data.NRN, action: "INS" })); }; //При нажатии на класс оборудования const handleDataSelectionClassMachineClick = value => setDataSelectionClassMachine(value); //При нажатии на "Добавить класс оборудования" const handleAddEquipDataSelectionClassMachine = () => setDialogs(pv => ({ ...pv, dataSelectionClassMachineIU: true })); //При нажатии на "Удалить класс оборудования" const handleDeleteEquipDataSelectionClassMachine = async equipDSCM => { await executeStored({ stored: "UDO_PKG_EQUIPDS.CM_DEL", args: { NRN: equipDSCM } }); setRefresh(pv => ({ ...pv, dataSelectionClassMachine: equipDSCM * 2, action: "DEL" })); setDataSelectionClassMachine(null); }; //При отмене диалога IU класса оборудования const handleEquipDataSelectionClassMachineIUCancel = () => setDialogs(pv => ({ ...pv, dataSelectionClassMachineIU: false })); //При сохранении диалога IU класса оборудования const handleEquipDataSelectionClassMachineIUOk = async values => { const data = await executeStored({ stored: "UDO_PKG_EQUIPDS.CM_INS", args: { NPRN: equipDataSelection, SEQOBJKIND: values.eqobjKind, SUSERPROCS_DATA: values.userprocsData, SEXSSERVICE_UPLOAD: values.exsServiceUpload, SEXSSERVICEFN_UPLOAD: values.exsServiceFnUpload, SEXSSERVICE_SEND_MD: values.exsServiceSendMd, SEXSSERVICEFN_SEND_MD: values.exsServiceFnSendMd, SEXSSERVICE_SEND_RQ: values.exsServiceSendRq, SEXSSERVICEFN_SEND_RQ: values.exsServiceFnSendRq } }); setDialogs(pv => ({ ...pv, dataSelectionClassMachineIU: false })); setRefresh(pv => ({ ...pv, dataSelectionClassMachine: data.NRN, action: "INS" })); }; //При нажатии "Сформировать" в списке файлов карточки класса оборудования const handleMakeEquipDataSelectionClassMachineFiles = (equipDSCM, procedure) => { pOnlineUserProcedure({ code: procedure, inputParameters: [{ name: "NEQUIPDSCM", value: equipDSCM }], callBack: res => res.success ? setRefresh(pv => ({ ...pv, dataSelectionClassMachineFilesList: pv.dataSelectionClassMachineFilesList + 1 })) : null }); }; //При нажатии "Загрузить на сервер" в списке файлов карточки класса оборудования const handleUploadEquipDataSelectionClassMachineFiles = async equipDSCM => { await executeStored({ stored: "UDO_PKG_EQUIPDS.CMFL_UPLOAD", args: { NEQUIPDSCM: equipDSCM } }); setRefresh(pv => ({ ...pv, dataSelectionClassMachineFilesList: pv.dataSelectionClassMachineFilesList + 1 })); }; //При нажатии "Передать внешней системе" в списке файлов карточки класса оборудования const handleSendMdEquipDataSelectionClassMachineFiles = async equipDSCM => { await executeStored({ stored: "UDO_PKG_EQUIPDS.CMFL_SEND_MD", args: { NEQUIPDSCM: equipDSCM } }); setRefresh(pv => ({ ...pv, dataSelectionClassMachineFilesList: pv.dataSelectionClassMachineFilesList + 1 })); }; //При нажатии на "Добавить модель класса оборудования" const handleAddEquipDataSelectionClassMachineModel = () => setDialogs(pv => ({ ...pv, dataSelectionClassMachineModelIU: true })); //При нажатии на "Удалить модель класса оборудования" const handleDeleteEquipDataSelectionClassMachineModel = async equipDSCMML => { await executeStored({ stored: "UDO_PKG_EQUIPDS.CMML_DEL", args: { NRN: equipDSCMML } }); setRefresh(pv => ({ ...pv, dataSelectionClassMachineModelsList: pv.dataSelectionClassMachineModelsList + 1 })); }; //При отмене диалога IU модели класса оборудования const handleEquipDataSelectionClassMachineModelIUCancel = () => setDialogs(pv => ({ ...pv, dataSelectionClassMachineModelIU: false })); //При сохранении диалога IU модели класса оборудования const handleEquipDataSelectionClassMachineModelIUOk = async values => { await executeStored({ stored: "UDO_PKG_EQUIPDS.CMML_INS", args: { NPRN: equipDataSelectionClassMachine, STASK: values.task, NPRECISION_P: parseInt(values.precisionP) } }); setDialogs(pv => ({ ...pv, dataSelectionClassMachineModelIU: false })); setRefresh(pv => ({ ...pv, dataSelectionClassMachineModelsList: pv.dataSelectionClassMachineModelsList + 1 })); }; //При нажатии "Обучить" в списке моделей карточки класса оборудования const handleSendRqEquipDataSelectionClassMachineModel = async equipDSCMML => { await executeStored({ stored: "UDO_PKG_EQUIPDS.CMML_SEND_RQ", args: { NEQUIPDSCMML: equipDSCMML } }); setRefresh(pv => ({ ...pv, dataSelectionClassMachineModelsList: pv.dataSelectionClassMachineModelsList + 1 })); }; //При измении выборки данных через свойства useEffect(() => { setDataSelection(dataSelection); }, [dataSelection]); //При изменеии класса оборудования через свойства useEffect(() => { setDataSelectionClassMachine(dataSelectionClassMachine); }, [dataSelectionClassMachine]); //При изменении списка выборок данных useEffect(() => { if (refresh.action == "INS" && refresh.dataSelection) { setDataSelection(refresh.dataSelection); setDataSelectionClassMachine(null); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [equipDataSelectionList]); //При изменении списка классов оборудования выборки данных useEffect(() => { if (refresh.action == "INS" && refresh.dataSelectionClassMachine) setDataSelectionClassMachine(refresh.dataSelectionClassMachine); // eslint-disable-next-line react-hooks/exhaustive-deps }, [equipDataSelectionClassMachineList]); //Генерация содержимого return ( {dialogs.dataSelectionIU ? ( ) : null} {dialogs.dataSelectionClassMachineIU ? ( ) : null} {dialogs.dataSelectionClassMachineModelIU ? ( ) : null} add {equipDataSelection != DS_RN_DEFAULT ? ( delete ) : null} ); }; //Контроль свойств - Закладка администрирования AdminTab.propTypes = { dataSelection: PropTypes.number, dataSelectionClassMachine: PropTypes.number }; //---------------- //Интерфейс модуля //---------------- export { AdminTab };