231 lines
11 KiB
JavaScript
231 lines
11 KiB
JavaScript
/*
|
||
Парус 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,
|
||
useEquipDataSelectionClassMachineFilesList,
|
||
useEquipDataSelectionClassMachineModelsList
|
||
} from "./admin_tab_hooks"; //Вспомогательные хуки
|
||
|
||
//---------
|
||
//Константы
|
||
//---------
|
||
|
||
//Начальное состояние флагов обновления
|
||
const REFRESH_INITIAL = { action: null, dataSelection: null, dataSelectionClassMachine: null, 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 { 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 rn => {
|
||
await executeStored({ stored: "UDO_PKG_EQUIPDS.CM_DEL", args: { NRN: rn } });
|
||
setRefresh(pv => ({ ...pv, dataSelectionClassMachine: rn * 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 = (rn, procedure) => {
|
||
pOnlineUserProcedure({
|
||
code: procedure,
|
||
inputParameters: [{ name: "NEQUIPDSCM", value: rn }],
|
||
callBack: res =>
|
||
res.success ? setRefresh(pv => ({ ...pv, dataSelectionClassMachineFilesList: pv.dataSelectionClassMachineFilesList + 1 })) : null
|
||
});
|
||
};
|
||
|
||
//При изменении списка выборок данных
|
||
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={{ NRN: equipDataSelectionClassMachine, SUSERPROCS_DATA: "ФормДанВыгрОбучМод" }}
|
||
filesList={equipDataSelectionClassMachineFilesList}
|
||
modelsList={equipDataSelectionClassMachineModelsList}
|
||
onCardDelete={handleDeleteEquipDataSelectionClassMachine}
|
||
onClassMachineFilesMake={handleMakeEquipDataSelectionClassMachineFiles}
|
||
/>
|
||
</Grid>
|
||
</Grid>
|
||
</Grid>
|
||
</Grid>
|
||
</Box>
|
||
);
|
||
};
|
||
|
||
//----------------
|
||
//Интерфейс модуля
|
||
//----------------
|
||
|
||
export { AdminTab };
|