268 lines
13 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 React, { useState, useEffect, useContext } from "react"; //Классы React
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
} 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
};
//Стили
const STYLES = {
DATA_SELECTION_STACK: { alignItems: "center" },
CLASS_MACHINE_ADD_BUTTON: { margin: "5px" }
};
//-----------
//Тело модуля
//-----------
//Закладка администрирования
const AdminTab = () => {
//Подключение к контексту взаимодействия с сервером
const { executeStored } = useContext(BackEndСtx);
//Подключение к контексту приложения
const { pOnlineUserProcedure } = useContext(ApplicationСtx);
//Собственное состояние - отображаемые диалоги
const [dialogs, setDialogs] = useState({ dataSelectionIU: false, dataSelectionClassMachineIU: false });
//Собственное состояние - флаги обновления данных
const [refresh, setRefresh] = useState(REFRESH_INITIAL);
//Собственное состояние - выбранная выборка данных
const [equipDataSelection, setDataSelection] = useState(DS_RN_DEFAULT);
//Собственное состояние - выбранный класс оборудования
const [equipDataSelectionClassMachine, setDataSelectionClassMachine] = useState(null);
//Загрузка списка выборок данных
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);
//При смене выборки данных
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 }));
};
//При изменении списка выборок данных
useEffect(() => {
if (refresh.action == "INS" && refresh.dataSelection) {
setDataSelection(refresh.dataSelection);
setDataSelectionClassMachine(null);
}
}, [equipDataSelectionList]);
//При изменении списка классов оборудования выборки данных
useEffect(() => {
if (refresh.action == "INS" && refresh.dataSelectionClassMachine) setDataSelectionClassMachine(refresh.dataSelectionClassMachine);
}, [equipDataSelectionClassMachineList]);
//Генерация содержимого
return (
<Box>
{dialogs.dataSelectionIU ? (
<EquipDataSelectionIU onOk={handleEquipDataSelectionIUOk} onCancel={handleEquipDataSelectionIUCancel} />
) : null}
{dialogs.dataSelectionClassMachineIU ? (
<EquipDataSelectionClassMachineIU
onOk={handleEquipDataSelectionClassMachineIUOk}
onCancel={handleEquipDataSelectionClassMachineIUCancel}
/>
) : null}
<Grid container>
<Grid item xs={12}>
<Stack direction="row" spacing={2} p={2} sx={STYLES.DATA_SELECTION_STACK}>
<EquipDataSelectionList list={equipDataSelectionList} value={equipDataSelection} onChange={handleDataSelectionChange} />
<IconButton onClick={handleAddEquipDataSelection}>
<Icon>add</Icon>
</IconButton>
{equipDataSelection != DS_RN_DEFAULT ? (
<IconButton onClick={handleDeleteEquipDataSelection}>
<Icon>delete</Icon>
</IconButton>
) : null}
</Stack>
</Grid>
<Grid item xs={12}>
<Grid container>
<Grid item xs={2} hidden={equipDataSelection == DS_RN_DEFAULT}>
<Button
fullWidth
startIcon={<Icon>add</Icon>}
sx={STYLES.CLASS_MACHINE_ADD_BUTTON}
onClick={handleAddEquipDataSelectionClassMachine}
>
Класс
</Button>
<EquipDataSelectionClassMachineList
list={equipDataSelectionClassMachineList}
value={equipDataSelectionClassMachine}
onClick={handleDataSelectionClassMachineClick}
/>
</Grid>
<Grid item xs={10} hidden={equipDataSelectionClassMachine == null}>
<EquipDataSelectionClassMachineCard
card={equipDataSelectionClassMachineCard}
filesList={equipDataSelectionClassMachineFilesList}
modelsList={equipDataSelectionClassMachineModelsList}
onCardDelete={handleDeleteEquipDataSelectionClassMachine}
onClassMachineFilesMake={handleMakeEquipDataSelectionClassMachineFiles}
onClassMachineFilesUpload={handleUploadEquipDataSelectionClassMachineFiles}
onClassMachineFilesSendMd={handleSendMdEquipDataSelectionClassMachineFiles}
/>
</Grid>
</Grid>
</Grid>
</Grid>
</Box>
);
};
//----------------
//Интерфейс модуля
//----------------
export { AdminTab };