Каскадное удаление класса из выборки, отображение карточки технического объекта в виде диалога, косметика на закладке "Обучение"
This commit is contained in:
parent
b31fea736a
commit
6e3fd86e89
@ -351,6 +351,16 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
|
|||||||
)
|
)
|
||||||
is
|
is
|
||||||
begin
|
begin
|
||||||
|
/* Удалим файлы */
|
||||||
|
for C in (select T.RN from UDO_T_EQUIPDSCMFL T where T.PRN = NRN)
|
||||||
|
loop
|
||||||
|
CMFL_DEL(NRN => C.RN);
|
||||||
|
end loop;
|
||||||
|
/* Удалим модели */
|
||||||
|
for C in (select T.RN from UDO_T_EQUIPDSCMML T where T.PRN = NRN)
|
||||||
|
loop
|
||||||
|
CMML_DEL(NRN => C.RN);
|
||||||
|
end loop;
|
||||||
/* Удалим запись */
|
/* Удалим запись */
|
||||||
delete from UDO_T_EQUIPDSCM T where T.RN = NRN;
|
delete from UDO_T_EQUIPDSCM T where T.RN = NRN;
|
||||||
end CM_DEL;
|
end CM_DEL;
|
||||||
@ -457,9 +467,14 @@ create or replace package body UDO_PKG_EQUIPDS_BASE as
|
|||||||
)
|
)
|
||||||
is
|
is
|
||||||
begin
|
begin
|
||||||
|
/* Удалим историю */
|
||||||
|
for C in (select T.RN from UDO_T_EQUIPDSCMMLH T where T.PRN = NRN)
|
||||||
|
loop
|
||||||
|
CMMLH_DEL(NRN => C.RN);
|
||||||
|
end loop;
|
||||||
/* Удалим запись */
|
/* Удалим запись */
|
||||||
delete from UDO_T_EQUIPDSCMML T where T.RN = NRN;
|
delete from UDO_T_EQUIPDSCMML T where T.RN = NRN;
|
||||||
end CMML_DEL;
|
end CMML_DEL;
|
||||||
|
|
||||||
/* Базовая установка фактической точности "Выборки данных оборудования (классы оборудования, модели)" */
|
/* Базовая установка фактической точности "Выборки данных оборудования (классы оборудования, модели)" */
|
||||||
procedure CMML_SET_PRECISION_F
|
procedure CMML_SET_PRECISION_F
|
||||||
|
@ -81,8 +81,7 @@ text="Проверка прав доступа при формировании
|
|||||||
else
|
else
|
||||||
0
|
0
|
||||||
end NHASCHILDREN,
|
end NHASCHILDREN,
|
||||||
M.OBJ_KIND NOBJ_KIND,
|
M.OBJ_KIND NOBJ_KIND
|
||||||
0 NSHOW_CARD
|
|
||||||
from EQCONFIG M,
|
from EQCONFIG M,
|
||||||
EQOBJLEVEL OL
|
EQOBJLEVEL OL
|
||||||
where M.PR_OBJ_LEVEL = OL.RN(+)
|
where M.PR_OBJ_LEVEL = OL.RN(+)
|
||||||
@ -105,29 +104,20 @@ text="Проверка прав доступа при формировании
|
|||||||
RATTRIBUTE01 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR,
|
RATTRIBUTE01 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR,
|
||||||
SNAME => 'label',
|
SNAME => 'label',
|
||||||
SVALUE => 'Минуточку...')));
|
SVALUE => 'Минуточку...')));
|
||||||
else
|
/* Соберём лист */
|
||||||
XCHILD := null;
|
XLEAF := PKG_XMAKE.ELEMENT(ICURSOR => NCUR,
|
||||||
|
SNAME => 'children',
|
||||||
|
RATTRIBUTES => PKG_XMAKE.ATTRIBUTES(ICURSOR => NCUR,
|
||||||
|
RATTRIBUTE00 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR,
|
||||||
|
SNAME => 'id',
|
||||||
|
SVALUE => C.NRN),
|
||||||
|
RATTRIBUTE01 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR,
|
||||||
|
SNAME => 'label',
|
||||||
|
SVALUE => C.SNAME)),
|
||||||
|
RNODE00 => XCHILD);
|
||||||
|
/* Соберём листы в ветку */
|
||||||
|
XRES := PKG_XMAKE.CONCAT(ICURSOR => NCUR, RNODE00 => XRES, RNODE01 => XLEAF);
|
||||||
end if;
|
end if;
|
||||||
/* Для технического объекта, не имеющего дочерних - соберём признак отображения карточки */
|
|
||||||
if ((C.NHASCHILDREN = 0) and (C.NOBJ_KIND is not null)) then
|
|
||||||
C.NSHOW_CARD := 1;
|
|
||||||
end if;
|
|
||||||
/* Соберём лист */
|
|
||||||
XLEAF := PKG_XMAKE.ELEMENT(ICURSOR => NCUR,
|
|
||||||
SNAME => 'children',
|
|
||||||
RATTRIBUTES => PKG_XMAKE.ATTRIBUTES(ICURSOR => NCUR,
|
|
||||||
RATTRIBUTE00 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR,
|
|
||||||
SNAME => 'id',
|
|
||||||
SVALUE => C.NRN),
|
|
||||||
RATTRIBUTE01 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR,
|
|
||||||
SNAME => 'label',
|
|
||||||
SVALUE => C.SNAME),
|
|
||||||
RATTRIBUTE02 => PKG_XMAKE.ATTRIBUTE(ICURSOR => NCUR,
|
|
||||||
SNAME => 'showCard',
|
|
||||||
NVALUE => C.NSHOW_CARD)),
|
|
||||||
RNODE00 => XCHILD);
|
|
||||||
/* Соберём листы в ветку */
|
|
||||||
XRES := PKG_XMAKE.CONCAT(ICURSOR => NCUR, RNODE00 => XRES, RNODE01 => XLEAF);
|
|
||||||
end loop;
|
end loop;
|
||||||
/* Вернём собранное */
|
/* Вернём собранное */
|
||||||
return XRES;
|
return XRES;
|
||||||
|
@ -264,14 +264,16 @@ const AdminTab = ({ dataSelection = DS_RN_DEFAULT, dataSelectionClassMachine = n
|
|||||||
<Grid item xs={12}>
|
<Grid item xs={12}>
|
||||||
<Stack direction="row" spacing={2} p={2} sx={STYLES.DATA_SELECTION_STACK}>
|
<Stack direction="row" spacing={2} p={2} sx={STYLES.DATA_SELECTION_STACK}>
|
||||||
<EquipDataSelectionList list={equipDataSelectionList} value={equipDataSelection} onChange={handleDataSelectionChange} />
|
<EquipDataSelectionList list={equipDataSelectionList} value={equipDataSelection} onChange={handleDataSelectionChange} />
|
||||||
<IconButton onClick={handleAddEquipDataSelection}>
|
<Stack direction="row" spacing={0}>
|
||||||
<Icon>add</Icon>
|
<IconButton onClick={handleAddEquipDataSelection}>
|
||||||
</IconButton>
|
<Icon>add</Icon>
|
||||||
{equipDataSelection != DS_RN_DEFAULT ? (
|
|
||||||
<IconButton onClick={handleDeleteEquipDataSelection}>
|
|
||||||
<Icon>delete</Icon>
|
|
||||||
</IconButton>
|
</IconButton>
|
||||||
) : null}
|
{equipDataSelection != DS_RN_DEFAULT ? (
|
||||||
|
<IconButton onClick={handleDeleteEquipDataSelection}>
|
||||||
|
<Icon>delete</Icon>
|
||||||
|
</IconButton>
|
||||||
|
) : null}
|
||||||
|
</Stack>
|
||||||
</Stack>
|
</Stack>
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid item xs={12}>
|
<Grid item xs={12}>
|
||||||
|
@ -102,34 +102,6 @@ const STYLES = {
|
|||||||
//Вспомогательные функции и компоненты
|
//Вспомогательные функции и компоненты
|
||||||
//------------------------------------
|
//------------------------------------
|
||||||
|
|
||||||
//Кнопка с дополнительной подписью
|
|
||||||
const ExtraCaptionButton = ({ caption, title, subtitle, maxWidth, onClick, theme }) => {
|
|
||||||
//При нажатии на кнопку
|
|
||||||
const handleClick = () => (onClick ? onClick() : null);
|
|
||||||
|
|
||||||
//Генерация содержимого
|
|
||||||
return (
|
|
||||||
<Stack sx={STYLES.EXTRA_CAPTION_BUTTON_CONTAINER(theme, maxWidth)}>
|
|
||||||
<Button onClick={handleClick} size={"small"}>
|
|
||||||
{caption}
|
|
||||||
</Button>
|
|
||||||
<Typography variant="caption" color="text.secondary" sx={STYLES.EXTRA_CAPTION_BUTTON_TITLE} title={subtitle}>
|
|
||||||
<b>{title}</b> {subtitle}
|
|
||||||
</Typography>
|
|
||||||
</Stack>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
//Контроль свойств - Кнопка с дополнительной подписью
|
|
||||||
ExtraCaptionButton.propTypes = {
|
|
||||||
caption: PropTypes.string.isRequired,
|
|
||||||
title: PropTypes.string.isRequired,
|
|
||||||
subtitle: PropTypes.string.isRequired,
|
|
||||||
maxWidth: PropTypes.string,
|
|
||||||
onClick: PropTypes.func,
|
|
||||||
theme: PropTypes.object.isRequired
|
|
||||||
};
|
|
||||||
|
|
||||||
//Формирование значения для колонки "Состояние" файла класса оборудования выборки данных
|
//Формирование значения для колонки "Состояние" файла класса оборудования выборки данных
|
||||||
const formatFileStateValue = (theme, value, err) => {
|
const formatFileStateValue = (theme, value, err) => {
|
||||||
const [text, icon, color] =
|
const [text, icon, color] =
|
||||||
@ -166,7 +138,7 @@ const filesListDataCellRender = ({ row, columnDef, theme }) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
//Форматирование колонок таблицы моделей класса оборудования выборки данных
|
//Форматирование колонок таблицы моделей класса оборудования выборки данных
|
||||||
const modelsListDataCellRender = ({ row, columnDef, theme, card, onDelete, onSendRq }) => {
|
const modelsListDataCellRender = ({ row, columnDef, theme, onDelete, onSendRq }) => {
|
||||||
switch (columnDef.name) {
|
switch (columnDef.name) {
|
||||||
case "NSTATUS":
|
case "NSTATUS":
|
||||||
return {
|
return {
|
||||||
@ -180,16 +152,7 @@ const modelsListDataCellRender = ({ row, columnDef, theme, card, onDelete, onSen
|
|||||||
<IconButton onClick={() => (onDelete ? onDelete(row.NRN) : null)}>
|
<IconButton onClick={() => (onDelete ? onDelete(row.NRN) : null)}>
|
||||||
<Icon>delete</Icon>
|
<Icon>delete</Icon>
|
||||||
</IconButton>
|
</IconButton>
|
||||||
{row.NSTATUS == 0 ? (
|
{row.NSTATUS == 0 ? <Button onClick={() => (onSendRq ? onSendRq(row.NRN) : null)}>Обучить</Button> : null}
|
||||||
<ExtraCaptionButton
|
|
||||||
caption="Запрос на обучение"
|
|
||||||
title="СО:"
|
|
||||||
subtitle={card.SEXSSERVICE_SEND_RQ}
|
|
||||||
maxWidth="200px"
|
|
||||||
onClick={() => (onSendRq ? onSendRq(row.NRN) : null)}
|
|
||||||
theme={theme}
|
|
||||||
/>
|
|
||||||
) : null}
|
|
||||||
</Stack>
|
</Stack>
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
@ -541,30 +504,11 @@ const EquipDataSelectionClassMachineCard = ({
|
|||||||
<Typography variant="h6" component="div">
|
<Typography variant="h6" component="div">
|
||||||
Файлы данных
|
Файлы данных
|
||||||
</Typography>
|
</Typography>
|
||||||
<ExtraCaptionButton
|
<Stack spacing={0} direction={"row"}>
|
||||||
caption="Сформировать"
|
<Button onClick={handleClassMachineFilesMakeClick}>Сформировать</Button>
|
||||||
title="ПП:"
|
<Button onClick={handleClassMachineFilesUploadClick}>Загрузить на сервер</Button>
|
||||||
subtitle={card.SUSERPROCS_DATA}
|
<Button onClick={handleClassMachineFilesSendMdClick}>Передать фреймворку</Button>
|
||||||
maxWidth="150px"
|
</Stack>
|
||||||
onClick={handleClassMachineFilesMakeClick}
|
|
||||||
theme={theme}
|
|
||||||
/>
|
|
||||||
<ExtraCaptionButton
|
|
||||||
caption="Загрузить на сервер"
|
|
||||||
title="СО:"
|
|
||||||
subtitle={card.SEXSSERVICE_UPLOAD}
|
|
||||||
maxWidth="210px"
|
|
||||||
onClick={handleClassMachineFilesUploadClick}
|
|
||||||
theme={theme}
|
|
||||||
/>
|
|
||||||
<ExtraCaptionButton
|
|
||||||
caption="Передать внешней системе"
|
|
||||||
title="СО:"
|
|
||||||
subtitle={card.SEXSSERVICE_SEND_MD}
|
|
||||||
maxWidth="260px"
|
|
||||||
onClick={handleClassMachineFilesSendMdClick}
|
|
||||||
theme={theme}
|
|
||||||
/>
|
|
||||||
</Stack>
|
</Stack>
|
||||||
<P8PDataGrid
|
<P8PDataGrid
|
||||||
{...{ ...P8P_DATA_GRID_CONFIG_PROPS }}
|
{...{ ...P8P_DATA_GRID_CONFIG_PROPS }}
|
||||||
@ -604,7 +548,6 @@ const EquipDataSelectionClassMachineCard = ({
|
|||||||
modelsListDataCellRender({
|
modelsListDataCellRender({
|
||||||
...prms,
|
...prms,
|
||||||
theme,
|
theme,
|
||||||
card,
|
|
||||||
onDelete: handleClassMachineModelDeleteClick,
|
onDelete: handleClassMachineModelDeleteClick,
|
||||||
onSendRq: handleClassMachineModelSendRqClick
|
onSendRq: handleClassMachineModelSendRqClick
|
||||||
})
|
})
|
||||||
|
@ -11,7 +11,6 @@ import React, { useState, useContext } from "react"; //Классы React
|
|||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import { Box, Grid } from "@mui/material"; //Интерфейсные компоненты
|
import { Box, Grid } from "@mui/material"; //Интерфейсные компоненты
|
||||||
import { RichTreeView } from "@mui/x-tree-view/RichTreeView"; //Дерево
|
import { RichTreeView } from "@mui/x-tree-view/RichTreeView"; //Дерево
|
||||||
import { useTreeViewApiRef } from "@mui/x-tree-view/hooks/useTreeViewApiRef"; //API дерева
|
|
||||||
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
|
||||||
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с серверомs
|
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с серверомs
|
||||||
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
@ -25,7 +24,6 @@ import {
|
|||||||
useEqConfigTechObjCard,
|
useEqConfigTechObjCard,
|
||||||
useTechObjModelsList,
|
useTechObjModelsList,
|
||||||
useTechObjForecastHistList,
|
useTechObjForecastHistList,
|
||||||
findTreeItem,
|
|
||||||
needLoadLevel
|
needLoadLevel
|
||||||
} from "./forecast_tab_hooks"; //Вспомогательные хуки
|
} from "./forecast_tab_hooks"; //Вспомогательные хуки
|
||||||
|
|
||||||
@ -79,9 +77,6 @@ const ForecastTab = ({ onGoToAdmin }) => {
|
|||||||
//Подключение к контексту приложения
|
//Подключение к контексту приложения
|
||||||
const { pOnlineShowUnit } = useContext(ApplicationСtx);
|
const { pOnlineShowUnit } = useContext(ApplicationСtx);
|
||||||
|
|
||||||
//Подключение к API дерева
|
|
||||||
const apiRef = useTreeViewApiRef();
|
|
||||||
|
|
||||||
//Собственное состояние - текущая загружаемая ветка
|
//Собственное состояние - текущая загружаемая ветка
|
||||||
const [loadingTreeItem, setLoadingTreeItem] = useState(0);
|
const [loadingTreeItem, setLoadingTreeItem] = useState(0);
|
||||||
|
|
||||||
@ -122,14 +117,7 @@ const ForecastTab = ({ onGoToAdmin }) => {
|
|||||||
isExpanded && needLoadLevel(eQconfigTree, itemId) ? setLoadingTreeItem(parseInt(itemId)) : null;
|
isExpanded && needLoadLevel(eQconfigTree, itemId) ? setLoadingTreeItem(parseInt(itemId)) : null;
|
||||||
|
|
||||||
//Обработка фокусировки на элементе дерева
|
//Обработка фокусировки на элементе дерева
|
||||||
const handleTreeItemFocus = (event, itemId) => {
|
const handleTreeItemFocus = (event, itemId) => setTechObjSpec({ ...TECH_OBJ_SPEC_INIT, parent: parseInt(itemId) });
|
||||||
const item = findTreeItem(eQconfigTree, itemId);
|
|
||||||
if (item && item?.showCard) setTechObjCardId(parseInt(itemId));
|
|
||||||
else {
|
|
||||||
setTechObjCardId(null);
|
|
||||||
setTechObjSpec({ ...TECH_OBJ_SPEC_INIT, parent: parseInt(itemId) });
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
//При изменении состояния фильтров спецификации технических объектов
|
//При изменении состояния фильтров спецификации технических объектов
|
||||||
const handleTechObjSpecFilterChanged = ({ filters }) => setTechObjSpec(pv => ({ ...pv, filters: [...filters], pageNumber: 1 }));
|
const handleTechObjSpecFilterChanged = ({ filters }) => setTechObjSpec(pv => ({ ...pv, filters: [...filters], pageNumber: 1 }));
|
||||||
@ -144,15 +132,14 @@ const ForecastTab = ({ onGoToAdmin }) => {
|
|||||||
const handleCMMLStatusClick = (event, row) => {
|
const handleCMMLStatusClick = (event, row) => {
|
||||||
if (row.NCMML_STATUS == 0) {
|
if (row.NCMML_STATUS == 0) {
|
||||||
if (onGoToAdmin) onGoToAdmin();
|
if (onGoToAdmin) onGoToAdmin();
|
||||||
} else {
|
} else setTechObjCardId(parseInt(row.NRN));
|
||||||
const item = findTreeItem(eQconfigTree, row.NRN);
|
|
||||||
if (item && item?.showCard) apiRef.current?.focusItem(event, item.id);
|
|
||||||
else setTechObjCardId(parseInt(row.NRN));
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//При переходе к закладке администрирования из карточки технического объекта
|
//При переходе к закладке администрирования из карточки технического объекта
|
||||||
const handleTechObjeCardGoToModel = model => (onGoToAdmin ? onGoToAdmin(model.NEQUIPDS, model.NEQUIPDSCM) : null);
|
const handleTechObjeCardGoToModel = model => {
|
||||||
|
handleTechObjeCardClose();
|
||||||
|
if (onGoToAdmin) onGoToAdmin(model.NEQUIPDS, model.NEQUIPDSCM);
|
||||||
|
};
|
||||||
|
|
||||||
//При запросе прогноза по модели из карточки технического объекта
|
//При запросе прогноза по модели из карточки технического объекта
|
||||||
const handleTechObjeCardGetPrediction = async model => {
|
const handleTechObjeCardGetPrediction = async model => {
|
||||||
@ -199,28 +186,22 @@ const ForecastTab = ({ onGoToAdmin }) => {
|
|||||||
<Grid container>
|
<Grid container>
|
||||||
<Grid item xs={3} sx={STYLES.LEFT_SIDE_GRID}>
|
<Grid item xs={3} sx={STYLES.LEFT_SIDE_GRID}>
|
||||||
<Box sx={STYLES.TREE_BOX}>
|
<Box sx={STYLES.TREE_BOX}>
|
||||||
<RichTreeView
|
<RichTreeView items={eQconfigTree} onItemExpansionToggle={handleTreeItemExpansionToggle} onItemFocus={handleTreeItemFocus} />
|
||||||
apiRef={apiRef}
|
|
||||||
items={eQconfigTree}
|
|
||||||
onItemExpansionToggle={handleTreeItemExpansionToggle}
|
|
||||||
onItemFocus={handleTreeItemFocus}
|
|
||||||
/>
|
|
||||||
</Box>
|
</Box>
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid item xs={9} sx={STYLES.RIGHT_SIDE_GRID}>
|
<Grid item xs={9} sx={STYLES.RIGHT_SIDE_GRID}>
|
||||||
{techObjCardId ? (
|
{techObjCardId && !techObjCardIsLoading && techObjCard?.SCODE ? (
|
||||||
!techObjCardIsLoading ? (
|
<TechObjCard
|
||||||
<TechObjCard
|
cardData={techObjCard}
|
||||||
cardData={techObjCard}
|
modelsList={techObjModelsList}
|
||||||
modelsList={techObjModelsList}
|
forecastHistList={techObjForecastHistList}
|
||||||
forecastHistList={techObjForecastHistList}
|
onClose={handleTechObjeCardClose}
|
||||||
onClose={handleTechObjeCardClose}
|
onGoToModel={handleTechObjeCardGoToModel}
|
||||||
onGoToModel={handleTechObjeCardGoToModel}
|
onGetPrediction={handleTechObjeCardGetPrediction}
|
||||||
onGetPrediction={handleTechObjeCardGetPrediction}
|
onMakeEqRpSheet={handleTechObjeCardMakeEqRpSheet}
|
||||||
onMakeEqRpSheet={handleTechObjeCardMakeEqRpSheet}
|
/>
|
||||||
/>
|
) : null}
|
||||||
) : null
|
{techObjsDataGrid.init ? (
|
||||||
) : techObjsDataGrid.init ? (
|
|
||||||
<P8PDataGrid
|
<P8PDataGrid
|
||||||
{...{ ...P8P_DATA_GRID_CONFIG_PROPS, noDataFoundText }}
|
{...{ ...P8P_DATA_GRID_CONFIG_PROPS, noDataFoundText }}
|
||||||
containerComponentProps={{
|
containerComponentProps={{
|
||||||
|
@ -164,11 +164,9 @@ const useEqConfigTechObjCard = id => {
|
|||||||
setLoading(true);
|
setLoading(true);
|
||||||
const data = await executeStored({
|
const data = await executeStored({
|
||||||
stored: "UDO_PKG_EQUIPTCF.EQCONFIG_THOBJ_CARD",
|
stored: "UDO_PKG_EQUIPTCF.EQCONFIG_THOBJ_CARD",
|
||||||
args: {
|
args: { NEQCONFIG: id },
|
||||||
NEQCONFIG: id
|
|
||||||
},
|
|
||||||
respArg: "COUT",
|
respArg: "COUT",
|
||||||
loader: false
|
loader: true
|
||||||
});
|
});
|
||||||
setCard(data.techObj ? data.techObj : {});
|
setCard(data.techObj ? data.techObj : {});
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -9,23 +9,7 @@
|
|||||||
|
|
||||||
import React, { useState, useEffect, useContext } from "react"; //Классы React
|
import React, { useState, useEffect, useContext } from "react"; //Классы React
|
||||||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
import {
|
import { Stack, Card, CardContent, Typography, Button, Link, Dialog, DialogTitle, DialogContent, DialogActions } from "@mui/material"; //Интерфейсные компоненты
|
||||||
Stack,
|
|
||||||
Icon,
|
|
||||||
Box,
|
|
||||||
Card,
|
|
||||||
CardContent,
|
|
||||||
Typography,
|
|
||||||
CardActions,
|
|
||||||
Button,
|
|
||||||
IconButton,
|
|
||||||
Divider,
|
|
||||||
Link,
|
|
||||||
Dialog,
|
|
||||||
DialogTitle,
|
|
||||||
DialogContent,
|
|
||||||
DialogActions
|
|
||||||
} from "@mui/material"; //Интерфейсные компоненты
|
|
||||||
import { useTheme } from "@mui/material/styles"; //Темы оформления
|
import { useTheme } from "@mui/material/styles"; //Темы оформления
|
||||||
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
|
||||||
import { BUTTONS } from "../../../app.text"; //Текстовые ресурсы и константы
|
import { BUTTONS } from "../../../app.text"; //Текстовые ресурсы и константы
|
||||||
@ -41,18 +25,17 @@ import { P8PChart } from "../../components/p8p_chart"; //График
|
|||||||
|
|
||||||
//Стили
|
//Стили
|
||||||
const STYLES = {
|
const STYLES = {
|
||||||
TECH_OBJ_CARD_TITLE: { fontSize: 14 },
|
TECH_OBJ_CARD_DIALOG: { maxWidth: "800px" },
|
||||||
TECH_OBJ_CARD_SUB_TITLE: { mb: 1.5 },
|
TECH_OBJ_CARD_ML_TABLE: {
|
||||||
EQ_ML_TABLE: {
|
maxHeight: "300px",
|
||||||
maxHeight: "200px",
|
|
||||||
...SCROLL_STYLES
|
...SCROLL_STYLES
|
||||||
},
|
},
|
||||||
EQ_FORECAST_TABLE: {
|
TECH_OBJ_CARD_FORECAST_TABLE: {
|
||||||
maxHeight: "200px",
|
maxHeight: "300px",
|
||||||
...SCROLL_STYLES
|
...SCROLL_STYLES
|
||||||
},
|
},
|
||||||
EQ_FORECAST_DETAIL_DIALOG: { maxWidth: "600px" },
|
TECH_OBJ_FORECAST_DETAIL_DIALOG: { maxWidth: "600px" },
|
||||||
EQ_FORECAST_DETAIL_CHART: { width: "550px", display: "flex", justifyContent: "center" }
|
TECH_OBJ_FORECAST_DETAIL_CHART: { width: "550px", display: "flex", justifyContent: "center" }
|
||||||
};
|
};
|
||||||
|
|
||||||
//------------------------------------
|
//------------------------------------
|
||||||
@ -139,9 +122,9 @@ const ForecastDetail = ({ date, forecast, onClose }) => {
|
|||||||
|
|
||||||
//Генерация содержимого
|
//Генерация содержимого
|
||||||
return (
|
return (
|
||||||
<Dialog open={true} onClose={() => (onClose ? onClose() : null)} {...STYLES.EQ_FORECAST_DETAIL_DIALOG}>
|
<Dialog open={true} onClose={() => (onClose ? onClose() : null)} {...STYLES.TECH_OBJ_FORECAST_DETAIL_DIALOG}>
|
||||||
<DialogTitle>{`Детали прогноза от ${date}`}</DialogTitle>
|
<DialogTitle>{`Детали прогноза от ${date}`}</DialogTitle>
|
||||||
<DialogContent>{chart.loaded ? <P8PChart {...chart} style={STYLES.EQ_FORECAST_DETAIL_CHART} /> : null}</DialogContent>
|
<DialogContent>{chart.loaded ? <P8PChart {...chart} style={STYLES.TECH_OBJ_FORECAST_DETAIL_CHART} /> : null}</DialogContent>
|
||||||
<DialogActions>
|
<DialogActions>
|
||||||
<Button onClick={() => (onClose ? onClose() : null)}>{BUTTONS.CLOSE}</Button>
|
<Button onClick={() => (onClose ? onClose() : null)}>{BUTTONS.CLOSE}</Button>
|
||||||
</DialogActions>
|
</DialogActions>
|
||||||
@ -190,88 +173,82 @@ const TechObjCard = ({ cardData, modelsList, forecastHistList, onClose, onGoToMo
|
|||||||
|
|
||||||
//Генерация содержимого
|
//Генерация содержимого
|
||||||
return (
|
return (
|
||||||
<Box p={2}>
|
<>
|
||||||
{state.forecastDetail ? (
|
{state.forecastDetail ? (
|
||||||
<ForecastDetail date={state.forecastDate} forecast={state.forecastDetail} onClose={handleCloseForecastDetailClick} />
|
<ForecastDetail date={state.forecastDate} forecast={state.forecastDetail} onClose={handleCloseForecastDetailClick} />
|
||||||
) : null}
|
) : null}
|
||||||
<Card>
|
<Dialog open={true} onClose={handleClose} {...STYLES.TECH_OBJ_CARD_DIALOG}>
|
||||||
<CardContent>
|
<DialogTitle>{cardData.SCODE}</DialogTitle>
|
||||||
<Stack spacing={2} direction={"row"} alignItems={"center"}>
|
<DialogContent>
|
||||||
<IconButton onClick={handleClose}>
|
|
||||||
<Icon>close</Icon>
|
|
||||||
</IconButton>
|
|
||||||
<Typography sx={STYLES.TECH_OBJ_CARD_TITLE} color="text.secondary" variant="caption" gutterBottom>
|
|
||||||
Технический объект
|
|
||||||
</Typography>
|
|
||||||
</Stack>
|
|
||||||
<Typography variant="h5" component="div">
|
|
||||||
{cardData.SCODE}
|
|
||||||
</Typography>
|
|
||||||
<Typography sx={STYLES.TECH_OBJ_CARD_SUB_TITLE} color="text.secondary" variant="caption" gutterBottom>
|
|
||||||
{`Введён в эксплуатацию: ${formatDateRF(cardData.DOPER_DATE)}`}
|
|
||||||
<br />
|
|
||||||
{`Класс: ${cardData.SEQOBJKIND}`}
|
|
||||||
</Typography>
|
|
||||||
<Typography variant="h6">{cardData.SNAME}</Typography>
|
<Typography variant="h6">{cardData.SNAME}</Typography>
|
||||||
<br />
|
<Stack spacing={2}>
|
||||||
{modelsList.init ? (
|
<Typography color="text.secondary" variant="caption" gutterBottom>
|
||||||
<>
|
{`${formatDateRF(cardData.DOPER_DATE)}, ${cardData.SEQOBJKIND}`}
|
||||||
<Divider />
|
</Typography>
|
||||||
<Typography variant="h6" component="div">
|
{modelsList.init ? (
|
||||||
Модели
|
<Card elevation={6}>
|
||||||
</Typography>
|
<CardContent>
|
||||||
<P8PDataGrid
|
<Typography variant="h6" component="div">
|
||||||
{...{ ...P8P_DATA_GRID_CONFIG_PROPS }}
|
Модели
|
||||||
containerComponentProps={{ sx: STYLES.EQ_ML_TABLE, elevation: 0 }}
|
</Typography>
|
||||||
columnsDef={modelsList.columnsDef}
|
<P8PDataGrid
|
||||||
rows={modelsList.rows}
|
{...{ ...P8P_DATA_GRID_CONFIG_PROPS }}
|
||||||
size={P8P_DATA_GRID_SIZE.SMALL}
|
containerComponentProps={{ sx: STYLES.TECH_OBJ_CARD_ML_TABLE, elevation: 0 }}
|
||||||
morePages={false}
|
columnsDef={modelsList.columnsDef}
|
||||||
fixedHeader={true}
|
rows={modelsList.rows}
|
||||||
reloading={false}
|
size={P8P_DATA_GRID_SIZE.SMALL}
|
||||||
headCellRender={techObjCardModelsTableHeadCellRender}
|
morePages={false}
|
||||||
dataCellRender={prms =>
|
fixedHeader={true}
|
||||||
techObjCardModelsTableDataCellRender({
|
reloading={false}
|
||||||
...prms,
|
headCellRender={techObjCardModelsTableHeadCellRender}
|
||||||
theme,
|
dataCellRender={prms =>
|
||||||
onGoToModel: handleGoToModelClick,
|
techObjCardModelsTableDataCellRender({
|
||||||
onGetPrediction: handleGetPredictionClick
|
...prms,
|
||||||
})
|
theme,
|
||||||
}
|
onGoToModel: handleGoToModelClick,
|
||||||
/>
|
onGetPrediction: handleGetPredictionClick
|
||||||
</>
|
})
|
||||||
) : null}
|
}
|
||||||
{forecastHistList.init ? (
|
/>
|
||||||
<>
|
</CardContent>
|
||||||
<Divider />
|
</Card>
|
||||||
<Typography variant="h6" component="div">
|
) : null}
|
||||||
Прогнозы
|
{forecastHistList.init ? (
|
||||||
</Typography>
|
<Card elevation={6}>
|
||||||
<P8PDataGrid
|
<CardContent>
|
||||||
{...{ ...P8P_DATA_GRID_CONFIG_PROPS }}
|
<Typography variant="h6" component="div">
|
||||||
containerComponentProps={{ sx: STYLES.EQ_FORECAST_TABLE, elevation: 0 }}
|
Прогнозы
|
||||||
columnsDef={forecastHistList.columnsDef}
|
</Typography>
|
||||||
rows={forecastHistList.rows}
|
<P8PDataGrid
|
||||||
size={P8P_DATA_GRID_SIZE.SMALL}
|
{...{ ...P8P_DATA_GRID_CONFIG_PROPS }}
|
||||||
morePages={false}
|
containerComponentProps={{ sx: STYLES.TECH_OBJ_CARD_FORECAST_TABLE, elevation: 0 }}
|
||||||
fixedHeader={true}
|
columnsDef={forecastHistList.columnsDef}
|
||||||
reloading={false}
|
rows={forecastHistList.rows}
|
||||||
dataCellRender={prms =>
|
size={P8P_DATA_GRID_SIZE.SMALL}
|
||||||
techObjCardForecastListTableDataCellRender({
|
morePages={false}
|
||||||
...prms,
|
fixedHeader={true}
|
||||||
theme,
|
reloading={false}
|
||||||
onShowForecastDetail: handleShowForecastDetailClick
|
dataCellRender={prms =>
|
||||||
})
|
techObjCardForecastListTableDataCellRender({
|
||||||
}
|
...prms,
|
||||||
/>
|
theme,
|
||||||
</>
|
onShowForecastDetail: handleShowForecastDetailClick
|
||||||
) : null}
|
})
|
||||||
</CardContent>
|
}
|
||||||
<CardActions>
|
/>
|
||||||
<Button onClick={handleMakeEqRpSheetClick}>Ремонтировать</Button>
|
</CardContent>
|
||||||
</CardActions>
|
</Card>
|
||||||
</Card>
|
) : null}
|
||||||
</Box>
|
</Stack>
|
||||||
|
</DialogContent>
|
||||||
|
<DialogActions>
|
||||||
|
<Button onClick={handleMakeEqRpSheetClick} color={"error"}>
|
||||||
|
Ремонтировать
|
||||||
|
</Button>
|
||||||
|
<Button onClick={handleClose}>{BUTTONS.CLOSE}</Button>
|
||||||
|
</DialogActions>
|
||||||
|
</Dialog>
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user