Панель - контроль прав доступа, удаление файлов данных, возможность переформирования файлов данных

Исправлена ошибка с "лишним" запросом к серверу на получение списка выборок данных
This commit is contained in:
Mikhail Chechnev 2024-10-16 19:23:57 +03:00
parent 6e2a28e900
commit f35d39fefa
4 changed files with 294 additions and 148 deletions

View File

@ -12,6 +12,7 @@ import PropTypes from "prop-types"; //Контроль свойств компо
import { Box, Grid, Stack, Icon, Button, IconButton } from "@mui/material"; //Интерфейсные компоненты import { Box, Grid, Stack, Icon, Button, IconButton } from "@mui/material"; //Интерфейсные компоненты
import { ApplicationСtx } from "../../context/application"; //Контекст приложения import { ApplicationСtx } from "../../context/application"; //Контекст приложения
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с серверомs import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с серверомs
import { P8PAppInlineError } from "../../components/p8p_app_message"; //Встраиваемое сообщение об ошибке
import { DS_RN_DEFAULT, useEquipDataSelectionList } from "./eqs_tech_cond_forecast_hooks"; //Общие вспомогательные хуки import { DS_RN_DEFAULT, useEquipDataSelectionList } from "./eqs_tech_cond_forecast_hooks"; //Общие вспомогательные хуки
import { import {
EquipDataSelectionIU, EquipDataSelectionIU,
@ -75,7 +76,9 @@ const AdminTab = ({ dataSelection = DS_RN_DEFAULT, dataSelectionClassMachine = n
const [equipDataSelectionClassMachine, setDataSelectionClassMachine] = useState(dataSelectionClassMachine); const [equipDataSelectionClassMachine, setDataSelectionClassMachine] = useState(dataSelectionClassMachine);
//Загрузка списка выборок данных //Загрузка списка выборок данных
const { equipDataSelectionList } = useEquipDataSelectionList(refresh.dataSelection); const { equipDataSelectionList, equipDataSelectionListIsLoading, equipDataSelectionListAccess } = useEquipDataSelectionList(
refresh.dataSelection
);
//Загрузка классов оборудования выбранной выборки данных //Загрузка классов оборудования выбранной выборки данных
const { equipDataSelectionClassMachineList } = useEquipDataSelectionClassMachineList(equipDataSelection, refresh.dataSelectionClassMachine); const { equipDataSelectionClassMachineList } = useEquipDataSelectionClassMachineList(equipDataSelection, refresh.dataSelectionClassMachine);
@ -164,16 +167,43 @@ const AdminTab = ({ dataSelection = DS_RN_DEFAULT, dataSelectionClassMachine = n
setDataSelectionClassMachine(data.NRN); setDataSelectionClassMachine(data.NRN);
}; };
//Отработка результатов выполнения пользовательской процедуры формирования данных выборки
const processMakeEquipDataSelectionClassMachineFilesResults = async (equipDSCM, dataSetIdent, dataSetConfigIdent, clear) => {
await executeStored({
stored: "UDO_PKG_EQUIPDS.CMFL_MAKE",
args: {
NEQUIPDSCM: equipDSCM,
NDATASET_IDENT: dataSetIdent,
NDATASET_CONFIG_IDENT: dataSetConfigIdent,
NCLEAR: clear
}
});
setRefresh(pv => ({ ...pv, dataSelectionClassMachineFilesList: pv.dataSelectionClassMachineFilesList + 1 }));
};
//При нажатии "Сформировать" в списке файлов карточки класса оборудования //При нажатии "Сформировать" в списке файлов карточки класса оборудования
const handleMakeEquipDataSelectionClassMachineFiles = (equipDSCM, procedure) => { const handleMakeEquipDataSelectionClassMachineFiles = (equipDSCM, procedure, clear) => {
pOnlineUserProcedure({ pOnlineUserProcedure({
code: procedure, code: procedure,
inputParameters: [{ name: "NEQUIPDSCM", value: equipDSCM }], inputParameters: [{ name: "NEQUIPDSCM", value: equipDSCM }],
callBack: res => callBack: res => {
res.success ? setRefresh(pv => ({ ...pv, dataSelectionClassMachineFilesList: pv.dataSelectionClassMachineFilesList + 1 })) : null if (res.success)
processMakeEquipDataSelectionClassMachineFilesResults(
equipDSCM,
res.outParameters.NDATASET_IDENT,
res.outParameters.NDATASET_CONFIG_IDENT,
clear
);
}
}); });
}; };
//При нажатии "Удалить" в списке файлов карточки класса оборудования
const handleDeleteEquipDataSelectionClassMachineFiles = async equipDSCMFL => {
await executeStored({ stored: "UDO_PKG_EQUIPDS.CMFL_DEL", args: { NRN: equipDSCMFL } });
setRefresh(pv => ({ ...pv, dataSelectionClassMachineFilesList: pv.dataSelectionClassMachineFilesList + 1 }));
};
//При нажатии "Загрузить на сервер" в списке файлов карточки класса оборудования //При нажатии "Загрузить на сервер" в списке файлов карточки класса оборудования
const handleUploadEquipDataSelectionClassMachineFiles = async equipDSCM => { const handleUploadEquipDataSelectionClassMachineFiles = async equipDSCM => {
await executeStored({ stored: "UDO_PKG_EQUIPDS.CMFL_UPLOAD", args: { NEQUIPDSCM: equipDSCM } }); await executeStored({ stored: "UDO_PKG_EQUIPDS.CMFL_UPLOAD", args: { NEQUIPDSCM: equipDSCM } });
@ -249,54 +279,67 @@ const AdminTab = ({ dataSelection = DS_RN_DEFAULT, dataSelectionClassMachine = n
/> />
) : null} ) : null}
<Grid container> <Grid container>
<Grid item xs={12}> {equipDataSelectionListIsLoading ? null : !equipDataSelectionListAccess ? (
<Stack direction="row" spacing={2} p={2} sx={STYLES.DATA_SELECTION_STACK}> <Grid item xs={12}>
<EquipDataSelectionList list={equipDataSelectionList} value={equipDataSelection} onChange={handleDataSelectionChange} /> <P8PAppInlineError text="У вас нет прав доступа для обучения моделей. Обратитесь к администратору." />
<Stack direction="row" spacing={0}>
<IconButton onClick={handleAddEquipDataSelection}>
<Icon>add</Icon>
</IconButton>
{equipDataSelection != DS_RN_DEFAULT ? (
<IconButton onClick={handleDeleteEquipDataSelection}>
<Icon>delete</Icon>
</IconButton>
) : null}
</Stack>
</Stack>
</Grid>
<Grid item xs={12}>
<Grid container>
<Grid item xs={3} 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={9} hidden={equipDataSelectionClassMachine == null}>
<EquipDataSelectionClassMachineCard
card={equipDataSelectionClassMachineCard}
filesList={equipDataSelectionClassMachineFilesList}
modelsList={equipDataSelectionClassMachineModelsList}
onCardDelete={handleDeleteEquipDataSelectionClassMachine}
onClassMachineFilesMake={handleMakeEquipDataSelectionClassMachineFiles}
onClassMachineFilesUpload={handleUploadEquipDataSelectionClassMachineFiles}
onClassMachineFilesSendMd={handleSendMdEquipDataSelectionClassMachineFiles}
onClassMachineModelAdd={handleAddEquipDataSelectionClassMachineModel}
onClassMachineModelDelete={handleDeleteEquipDataSelectionClassMachineModel}
onClassMachineModelSendRq={handleSendRqEquipDataSelectionClassMachineModel}
/>
</Grid>
</Grid> </Grid>
</Grid> ) : (
<>
<Grid item xs={12}>
<Stack direction="row" spacing={2} p={2} sx={STYLES.DATA_SELECTION_STACK}>
<EquipDataSelectionList
list={equipDataSelectionList}
value={equipDataSelection}
onChange={handleDataSelectionChange}
/>
<Stack direction="row" spacing={0}>
<IconButton onClick={handleAddEquipDataSelection}>
<Icon>add</Icon>
</IconButton>
{equipDataSelection != DS_RN_DEFAULT ? (
<IconButton onClick={handleDeleteEquipDataSelection}>
<Icon>delete</Icon>
</IconButton>
) : null}
</Stack>
</Stack>
</Grid>
<Grid item xs={12}>
<Grid container>
<Grid item xs={3} 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={9} hidden={equipDataSelectionClassMachine == null}>
<EquipDataSelectionClassMachineCard
card={equipDataSelectionClassMachineCard}
filesList={equipDataSelectionClassMachineFilesList}
modelsList={equipDataSelectionClassMachineModelsList}
onCardDelete={handleDeleteEquipDataSelectionClassMachine}
onClassMachineFilesMake={handleMakeEquipDataSelectionClassMachineFiles}
onClassMachineFilesDelete={handleDeleteEquipDataSelectionClassMachineFiles}
onClassMachineFilesUpload={handleUploadEquipDataSelectionClassMachineFiles}
onClassMachineFilesSendMd={handleSendMdEquipDataSelectionClassMachineFiles}
onClassMachineModelAdd={handleAddEquipDataSelectionClassMachineModel}
onClassMachineModelDelete={handleDeleteEquipDataSelectionClassMachineModel}
onClassMachineModelSendRq={handleSendRqEquipDataSelectionClassMachineModel}
/>
</Grid>
</Grid>
</Grid>
</>
)}
</Grid> </Grid>
</Box> </Box>
); );

View File

@ -7,7 +7,7 @@
//Подключение библиотек //Подключение библиотек
//--------------------- //---------------------
import React, { useState, useContext } from "react"; //Классы React import React, { useState, useContext, useRef } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента import PropTypes from "prop-types"; //Контроль свойств компонента
import { import {
Box, Box,
@ -29,7 +29,12 @@ import {
DialogContent, DialogContent,
DialogActions, DialogActions,
IconButton, IconButton,
Icon Icon,
Popper,
ButtonGroup,
ClickAwayListener,
Paper,
MenuList
} from "@mui/material"; //Интерфейсные компоненты } 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"; //Контекст приложения
@ -138,13 +143,23 @@ const formatFileStateValue = (theme, value, err) => {
}; };
//Форматирование колонок таблицы файлов класса оборудования выборки данных //Форматирование колонок таблицы файлов класса оборудования выборки данных
const filesListDataCellRender = ({ row, columnDef, theme }) => { const filesListDataCellRender = ({ row, columnDef, theme, onDelete }) => {
switch (columnDef.name) { switch (columnDef.name) {
case "NSTATUS": case "NSTATUS":
return { return {
cellProps: { align: "left" }, cellProps: { align: "left" },
data: formatFileStateValue(theme, row.NSTATUS, row.SERR) data: formatFileStateValue(theme, row.NSTATUS, row.SERR)
}; };
case "SACTIONS":
return {
data: (
<Stack spacing={1} direction={"row"} alignItems={"center"}>
<IconButton onClick={() => (onDelete ? onDelete(row.NRN) : null)}>
<Icon>delete</Icon>
</IconButton>
</Stack>
)
};
} }
}; };
@ -183,6 +198,75 @@ const classMachineCardTableHeadCellRender = ({ columnDef }) => {
} }
}; };
//Кнопка с всплывающим меню опций
const PopUpButton = ({ onClick, options = [], zIndex = 10000 }) => {
//Собственное состояние - выбранная опция
const [selectedOption, setSelectedOption] = useState(0);
//Собственное состояние - флаг открытия списка опций
const [open, setOpen] = useState(false);
//Ссылка на группу кнопок для аттача всплывающего меню
const anchorRef = useRef(null);
//Отработка нажатия на кнопку
const handleClick = () => (onClick && options[selectedOption] ? onClick(options[selectedOption]) : null);
//Отработка открытия/закрытия меню опций
const handleToggle = () => {
setOpen(prevOpen => !prevOpen);
};
//Принудительное закрытие меню опций (с проверкой открытости)
const handleClose = event => {
if (anchorRef.current && anchorRef.current.contains(event.target)) return;
setOpen(false);
};
//Отработка нажатия на элемент меню опций
const handleMenuItemClick = index => {
setSelectedOption(index);
setOpen(false);
};
//Генерация содержимого
return Array.isArray(options) && options.length > 0 ? (
<>
<ButtonGroup ref={anchorRef} variant="text">
<Button onClick={handleClick}>{options[selectedOption]?.label || ""}</Button>
<Button size="small" onClick={handleToggle}>
<Icon>arrow_drop_down</Icon>
</Button>
</ButtonGroup>
<Popper open={open} anchorEl={anchorRef.current} sx={{ zIndex }}>
<ClickAwayListener onClickAway={handleClose}>
<Paper>
<MenuList autoFocusItem>
{options.map((o, index) => (
<MenuItem key={o.code} selected={index === selectedOption} onClick={() => handleMenuItemClick(index)}>
{o.label}
</MenuItem>
))}
</MenuList>
</Paper>
</ClickAwayListener>
</Popper>
</>
) : null;
};
//Контроль свойств - Кнопка с всплывающим меню опций
PopUpButton.propTypes = {
onClick: PropTypes.func,
options: PropTypes.arrayOf(
PropTypes.shape({
code: PropTypes.string.isRequired,
label: PropTypes.string.isRequired
})
),
zIndex: PropTypes.number
};
//----------- //-----------
//Тело модуля //Тело модуля
//----------- //-----------
@ -452,6 +536,7 @@ const EquipDataSelectionClassMachineCard = ({
modelsList, modelsList,
onCardDelete, onCardDelete,
onClassMachineFilesMake, onClassMachineFilesMake,
onClassMachineFilesDelete,
onClassMachineFilesUpload, onClassMachineFilesUpload,
onClassMachineFilesSendMd, onClassMachineFilesSendMd,
onClassMachineModelAdd, onClassMachineModelAdd,
@ -465,7 +550,8 @@ const EquipDataSelectionClassMachineCard = ({
const handleCardDeleteClick = () => (onCardDelete ? onCardDelete(card.NRN) : null); const handleCardDeleteClick = () => (onCardDelete ? onCardDelete(card.NRN) : null);
//При нажатии на "Сформировать" для файлов данных //При нажатии на "Сформировать" для файлов данных
const handleClassMachineFilesMakeClick = () => (onClassMachineFilesMake ? onClassMachineFilesMake(card.NRN, card.SUSERPROCS_DATA) : null); const handleClassMachineFilesMakeClick = option =>
onClassMachineFilesMake ? onClassMachineFilesMake(card.NRN, card.SUSERPROCS_DATA, option.code === "CLEAR_AND_MAKE" ? 1 : 0) : null;
//При нажатии на "Загрузить на сервер" для файлов данных //При нажатии на "Загрузить на сервер" для файлов данных
const handleClassMachineFilesUploadClick = () => (onClassMachineFilesUpload ? onClassMachineFilesUpload(card.NRN) : null); const handleClassMachineFilesUploadClick = () => (onClassMachineFilesUpload ? onClassMachineFilesUpload(card.NRN) : null);
@ -473,6 +559,9 @@ const EquipDataSelectionClassMachineCard = ({
//При нажатии на "Загрузить на сервер" для файлов данных //При нажатии на "Загрузить на сервер" для файлов данных
const handleClassMachineFilesSendMdClick = () => (onClassMachineFilesSendMd ? onClassMachineFilesSendMd(card.NRN) : null); const handleClassMachineFilesSendMdClick = () => (onClassMachineFilesSendMd ? onClassMachineFilesSendMd(card.NRN) : null);
//При нажатии на "Удалить" для файлов данных
const handleClassMachineFilesDeleteClick = equipDSCMFL => (onClassMachineFilesDelete ? onClassMachineFilesDelete(equipDSCMFL) : null);
//При нажатии на "Добавить" для моделей //При нажатии на "Добавить" для моделей
const handleClassMachineModelAddClick = () => (onClassMachineModelAdd ? onClassMachineModelAdd() : null); const handleClassMachineModelAddClick = () => (onClassMachineModelAdd ? onClassMachineModelAdd() : null);
@ -502,7 +591,13 @@ const EquipDataSelectionClassMachineCard = ({
Файлы данных Файлы данных
</Typography> </Typography>
<Stack spacing={0} direction={"row"}> <Stack spacing={0} direction={"row"}>
<Button onClick={handleClassMachineFilesMakeClick}>Сформировать</Button> <PopUpButton
onClick={handleClassMachineFilesMakeClick}
options={[
{ code: "MAKE", label: "Сформировать" },
{ code: "CLEAR_AND_MAKE", label: "Переформировать" }
]}
/>
<Button onClick={handleClassMachineFilesUploadClick}>Загрузить на сервер</Button> <Button onClick={handleClassMachineFilesUploadClick}>Загрузить на сервер</Button>
<Button onClick={handleClassMachineFilesSendMdClick}>Передать фреймворку</Button> <Button onClick={handleClassMachineFilesSendMdClick}>Передать фреймворку</Button>
</Stack> </Stack>
@ -517,7 +612,7 @@ const EquipDataSelectionClassMachineCard = ({
fixedHeader={true} fixedHeader={true}
reloading={false} reloading={false}
headCellRender={classMachineCardTableHeadCellRender} headCellRender={classMachineCardTableHeadCellRender}
dataCellRender={prms => filesListDataCellRender({ ...prms, theme })} dataCellRender={prms => filesListDataCellRender({ ...prms, theme, onDelete: handleClassMachineFilesDeleteClick })}
/> />
</CardContent> </CardContent>
</Card> </Card>
@ -565,6 +660,7 @@ EquipDataSelectionClassMachineCard.propTypes = {
modelsList: PropTypes.object.isRequired, modelsList: PropTypes.object.isRequired,
onCardDelete: PropTypes.func, onCardDelete: PropTypes.func,
onClassMachineFilesMake: PropTypes.func, onClassMachineFilesMake: PropTypes.func,
onClassMachineFilesDelete: PropTypes.func,
onClassMachineFilesUpload: PropTypes.func, onClassMachineFilesUpload: PropTypes.func,
onClassMachineFilesSendMd: PropTypes.func, onClassMachineFilesSendMd: PropTypes.func,
onClassMachineModelAdd: PropTypes.func, onClassMachineModelAdd: PropTypes.func,

View File

@ -44,7 +44,7 @@ const useEquipDataSelectionList = refresh => {
const [isLoading, setLoading] = useState(false); const [isLoading, setLoading] = useState(false);
//Собственное состояние - данные //Собственное состояние - данные
const [data, setData] = useState([DS_DEFAULT]); const [data, setData] = useState({ list: [DS_DEFAULT], access: false });
//Подключение к контексту взаимодействия с сервером //Подключение к контексту взаимодействия с сервером
const { executeStored } = useContext(BackEndСtx); const { executeStored } = useContext(BackEndСtx);
@ -61,16 +61,16 @@ const useEquipDataSelectionList = refresh => {
attributeValueProcessor: (name, val) => (["SNAME"].includes(name) ? undefined : val), attributeValueProcessor: (name, val) => (["SNAME"].includes(name) ? undefined : val),
loader: false loader: false
}); });
setData([DS_DEFAULT, ...(data?.XDS ? data.XDS : [])]); setData({ list: [DS_DEFAULT, ...(data?.XDS ? data.XDS : [])], access: data?.NACCESS == 1 ? true : false });
} finally { } finally {
setLoading(false); setLoading(false);
} }
}; };
loadData(); if (refresh > 0) loadData();
}, [refresh, executeStored]); }, [refresh, executeStored]);
//Вернём данные //Вернём данные
return { equipDataSelectionList: data, equipDataSelectionListIsLoading: isLoading }; return { equipDataSelectionList: data.list, equipDataSelectionListIsLoading: isLoading, equipDataSelectionListAccess: data.access };
}; };
//---------------- //----------------

View File

@ -15,6 +15,7 @@ import { ApplicationСtx } from "../../context/application"; //Контекст
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с серверомs import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с серверомs
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
import { BUTTONS, TEXTS } from "../../../app.text"; //Текстовые ресурсы и константы import { BUTTONS, TEXTS } from "../../../app.text"; //Текстовые ресурсы и константы
import { P8PAppInlineError } from "../../components/p8p_app_message"; //Встраиваемое сообщение об ошибке
import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
import { formatDateRF, xml2JSON } from "../../core/utils"; //Вспомогательные функции import { formatDateRF, xml2JSON } from "../../core/utils"; //Вспомогательные функции
@ -641,7 +642,7 @@ const TechObjMakeDataSet = ({ eqobjKind, measureUnit, onOk, onCancel }) => {
const { pOnlineShowDictionary } = useContext(ApplicationСtx); const { pOnlineShowDictionary } = useContext(ApplicationСtx);
//Загрузка списка выборок данных //Загрузка списка выборок данных
const { equipDataSelectionList } = useEquipDataSelectionList(true); const { equipDataSelectionList, equipDataSelectionListIsLoading, equipDataSelectionListAccess } = useEquipDataSelectionList(true);
//Собственное состояние - значения формы //Собственное состояние - значения формы
const [values, setValues] = useState({ const [values, setValues] = useState({
@ -667,94 +668,100 @@ const TechObjMakeDataSet = ({ eqobjKind, measureUnit, onOk, onCancel }) => {
<Dialog open={true} onClose={() => (onOk ? onCancel() : null)}> <Dialog open={true} onClose={() => (onOk ? onCancel() : null)}>
<DialogTitle>Регистрация выборки данных класса технического объекта</DialogTitle> <DialogTitle>Регистрация выборки данных класса технического объекта</DialogTitle>
<DialogContent sx={STYLES.TECH_OBJ_MAKE_DATASET_DIALOG_CONTENT}> <DialogContent sx={STYLES.TECH_OBJ_MAKE_DATASET_DIALOG_CONTENT}>
<IUDFormTextField {equipDataSelectionListIsLoading ? null : equipDataSelectionListAccess ? (
elementCode={"dataSet"} <>
elementValue={values.dataSet} <IUDFormTextField
labelText={"Выборка данных"} elementCode={"dataSet"}
onChange={handleValueChanged} elementValue={values.dataSet}
list={equipDataSelectionList.filter(item => item.NRN != DS_RN_DEFAULT).map(item => item.SCODE)} labelText={"Выборка данных"}
freeSolo={true} onChange={handleValueChanged}
/> list={equipDataSelectionList.filter(item => item.NRN != DS_RN_DEFAULT).map(item => item.SCODE)}
<IUDFormTextField freeSolo={true}
elementCode={"eqobjKind"} />
elementValue={values.eqobjKind} <IUDFormTextField
labelText={"Класс оборудования"} elementCode={"eqobjKind"}
onChange={handleValueChanged} elementValue={values.eqobjKind}
disabled labelText={"Класс оборудования"}
/> onChange={handleValueChanged}
<IUDFormTextField disabled
elementCode={"measureUnit"} />
elementValue={values.measureUnit} <IUDFormTextField
labelText={"Едница измерения выборки"} elementCode={"measureUnit"}
onChange={handleValueChanged} elementValue={values.measureUnit}
dictionary={callBack => selectMeasureUnit(pOnlineShowDictionary, "measureUnit", callBack)} labelText={"Едница измерения выборки"}
/> onChange={handleValueChanged}
<IUDFormTextField dictionary={callBack => selectMeasureUnit(pOnlineShowDictionary, "measureUnit", callBack)}
elementCode={"userprocsData"} />
elementValue={values.userprocsData} <IUDFormTextField
labelText={"Процедура формирования"} elementCode={"userprocsData"}
onChange={handleValueChanged} elementValue={values.userprocsData}
dictionary={callBack => selectUserProcsData(pOnlineShowDictionary, "userprocsData", callBack)} labelText={"Процедура формирования"}
/> onChange={handleValueChanged}
<IUDFormTextField dictionary={callBack => selectUserProcsData(pOnlineShowDictionary, "userprocsData", callBack)}
elementCode={"exsServiceUpload"} />
elementValue={values.exsServiceUpload} <IUDFormTextField
labelText={"Сервис обмена для выгрузки данных"} elementCode={"exsServiceUpload"}
onChange={handleValueChanged} elementValue={values.exsServiceUpload}
disabled labelText={"Сервис обмена для выгрузки данных"}
/> onChange={handleValueChanged}
<IUDFormTextField disabled
elementCode={"exsServiceFnUpload"} />
elementValue={values.exsServiceFnUpload} <IUDFormTextField
labelText={"Функция обмена для выгрузки данных"} elementCode={"exsServiceFnUpload"}
onChange={handleValueChanged} elementValue={values.exsServiceFnUpload}
dictionary={callBack => selectServiceFn(pOnlineShowDictionary, "exsServiceFnUpload", callBack)} labelText={"Функция обмена для выгрузки данных"}
/> onChange={handleValueChanged}
<IUDFormTextField dictionary={callBack => selectServiceFn(pOnlineShowDictionary, "exsServiceFnUpload", callBack)}
elementCode={"exsServiceSendMd"} />
elementValue={values.exsServiceSendMd} <IUDFormTextField
labelText={"Сервис обмена для передачи внешней системе"} elementCode={"exsServiceSendMd"}
onChange={handleValueChanged} elementValue={values.exsServiceSendMd}
disabled labelText={"Сервис обмена для передачи внешней системе"}
/> onChange={handleValueChanged}
<IUDFormTextField disabled
elementCode={"exsServiceFnSendMd"} />
elementValue={values.exsServiceFnSendMd} <IUDFormTextField
labelText={"Функция обмена для передачи внешней системе"} elementCode={"exsServiceFnSendMd"}
onChange={handleValueChanged} elementValue={values.exsServiceFnSendMd}
dictionary={callBack => selectServiceFn(pOnlineShowDictionary, "exsServiceFnSendMd", callBack)} labelText={"Функция обмена для передачи внешней системе"}
/> onChange={handleValueChanged}
<IUDFormTextField dictionary={callBack => selectServiceFn(pOnlineShowDictionary, "exsServiceFnSendMd", callBack)}
elementCode={"exsServiceSendRq"} />
elementValue={values.exsServiceSendRq} <IUDFormTextField
labelText={"Сервис обмена для обработки внешней системой"} elementCode={"exsServiceSendRq"}
onChange={handleValueChanged} elementValue={values.exsServiceSendRq}
disabled labelText={"Сервис обмена для обработки внешней системой"}
/> onChange={handleValueChanged}
<IUDFormTextField disabled
elementCode={"exsServiceFnSendRq"} />
elementValue={values.exsServiceFnSendRq} <IUDFormTextField
labelText={"Функция обмена для обработки внешней системой"} elementCode={"exsServiceFnSendRq"}
onChange={handleValueChanged} elementValue={values.exsServiceFnSendRq}
dictionary={callBack => selectServiceFn(pOnlineShowDictionary, "exsServiceFnSendRq", callBack)} labelText={"Функция обмена для обработки внешней системой"}
/> onChange={handleValueChanged}
<IUDFormTextField dictionary={callBack => selectServiceFn(pOnlineShowDictionary, "exsServiceFnSendRq", callBack)}
elementCode={"task"} />
elementValue={values.task} <IUDFormTextField
labelText={"Задача"} elementCode={"task"}
onChange={handleValueChanged} elementValue={values.task}
list={TASK_LIST} labelText={"Задача"}
/> onChange={handleValueChanged}
<IUDFormTextField list={TASK_LIST}
elementCode={"precisionP"} />
elementValue={values.precisionP} <IUDFormTextField
labelText={"Точность"} elementCode={"precisionP"}
onChange={handleValueChanged} elementValue={values.precisionP}
type={"number"} labelText={"Точность"}
/> onChange={handleValueChanged}
type={"number"}
/>
</>
) : (
<P8PAppInlineError text="У вас нет прав доступа для обучения моделей. Обратитесь к администратору." />
)}
</DialogContent> </DialogContent>
<DialogActions> <DialogActions>
<Button onClick={() => (onOk ? onOk(values) : null)}>{BUTTONS.OK}</Button> {equipDataSelectionListAccess ? <Button onClick={() => (onOk ? onOk(values) : null)}>{BUTTONS.OK}</Button> : null}
<Button onClick={() => (onOk ? onCancel() : null)}>{BUTTONS.CANCEL}</Button> <Button onClick={() => (onOk ? onCancel() : null)}>{BUTTONS.CANCEL}</Button>
</DialogActions> </DialogActions>
</Dialog> </Dialog>