forked from CITKParus/P8-Panels
77 lines
2.8 KiB
JavaScript
77 lines
2.8 KiB
JavaScript
/*
|
||
Парус 8 - Панели мониторинга
|
||
Компонент: Диалог
|
||
*/
|
||
|
||
//---------------------
|
||
//Подключение библиотек
|
||
//---------------------
|
||
|
||
import React, { useEffect, useState } from "react"; //Классы React
|
||
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||
import { Dialog, DialogTitle, DialogContent, DialogActions, Button } from "@mui/material"; //Интерфейсные компоненты
|
||
import { BUTTONS } from "../../app.text"; //Общие текстовые ресурсы
|
||
import { P8P_INPUT, P8PInput } from "./p8p_input"; //Поле ввода
|
||
|
||
//-----------
|
||
//Тело модуля
|
||
//-----------
|
||
|
||
//Диалог
|
||
const P8PDialog = ({ title, inputs = [], children, onOk, onCancel, onClose }) => {
|
||
//Состояние диалога
|
||
const [state, setState] = useState({});
|
||
|
||
//При изменении элемента ввода
|
||
const handleInputChange = (name, value) => setState(pv => ({ ...pv, [name]: value }));
|
||
|
||
//При нажатии на "ОК" диалога
|
||
const handleOk = () => onOk && onOk(state);
|
||
|
||
//При нажатии на "Отмена" диалога
|
||
const handleCancel = () => onCancel && onCancel();
|
||
|
||
//При нажатии на "Закрыть" диалога
|
||
const handleClose = () => (onClose ? onClose() : onCancel ? onCancel() : null);
|
||
|
||
//При подключении к старнице
|
||
useEffect(() => {
|
||
setState(inputs.reduce((res, input) => ({ ...res, [input.name]: input.value == undefined ? null : input.value }), {}));
|
||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||
}, []);
|
||
|
||
//Формирование представления
|
||
return (
|
||
<Dialog onClose={handleClose} open>
|
||
<DialogTitle>{title}</DialogTitle>
|
||
<DialogContent>
|
||
{inputs.map((input, i) => (
|
||
<P8PInput key={i} {...input} value={state[input.name]} formValues={state} onChange={handleInputChange} />
|
||
))}
|
||
{children}
|
||
</DialogContent>
|
||
<DialogActions>
|
||
{onOk && <Button onClick={handleOk}>{BUTTONS.OK}</Button>}
|
||
{onCancel && <Button onClick={handleCancel}>{BUTTONS.CANCEL}</Button>}
|
||
{onClose && <Button onClick={handleClose}>{BUTTONS.CLOSE}</Button>}
|
||
</DialogActions>
|
||
</Dialog>
|
||
);
|
||
};
|
||
|
||
//Контроль свойств - Диалог
|
||
P8PDialog.propTypes = {
|
||
title: PropTypes.string.isRequired,
|
||
inputs: PropTypes.arrayOf(PropTypes.shape(P8P_INPUT)),
|
||
children: PropTypes.oneOfType([PropTypes.node, PropTypes.arrayOf(PropTypes.node)]),
|
||
onOk: PropTypes.func,
|
||
onCancel: PropTypes.func,
|
||
onClose: PropTypes.func
|
||
};
|
||
|
||
//----------------
|
||
//Интерфейс модуля
|
||
//----------------
|
||
|
||
export { P8PDialog };
|