/* Парус 8 - Панели мониторинга Компонент: Поле ввода */ //--------------------- //Подключение библиотек //--------------------- import React, { useState, useEffect } from "react"; //Классы React import PropTypes from "prop-types"; //Контроль свойств компонента import { Box, Icon, Input, InputAdornment, FormControl, Select, InputLabel, MenuItem, IconButton, Autocomplete, TextField } from "@mui/material"; //Интерфейсные компоненты //--------- //Константы //--------- //Формат свойств поля ввода const P8P_INPUT = { name: PropTypes.string.isRequired, value: PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.instanceOf(Date)]), label: PropTypes.string.isRequired, onChange: PropTypes.func, dictionary: PropTypes.func, list: PropTypes.array, type: PropTypes.string, freeSolo: PropTypes.bool, disabled: PropTypes.bool, formValues: PropTypes.object }; //----------- //Тело модуля //----------- //Поле ввода const P8PInput = ({ name, value, label, onChange, dictionary, list, type, freeSolo = false, disabled = false, formValues, ...other }) => { //Значение и тип элемента const [current, setCurrent] = useState({ type: undefined, value: "" }); //При получении нового значения или типа из вне useEffect(() => setCurrent({ value, type }), [type, value]); //Выбор значения из словаря const handleDictionaryClick = () => dictionary && dictionary(formValues, res => (res ? res.map(i => handleChangeByName(i.name, i.value)) : null)); //Изменение значения элемента (по событию) const handleChange = e => { setCurrent(pv => ({ ...pv, value: e.target.value })); if (onChange) onChange(e.target.name, e.target.value); }; //Изменение значения элемента (по имени и значению) const handleChangeByName = (targetName, value) => { if (targetName === name) setCurrent(pv => ({ ...pv, value })); if (onChange) onChange(targetName, value); }; //Генерация содержимого return ( {list ? ( freeSolo ? ( handleChangeByName(name, newValue)} onInputChange={(event, newInputValue) => handleChangeByName(name, newInputValue)} options={list} renderInput={params => } /> ) : ( <> {label} ) ) : ( <> {label} list ) : null } {...(current.type ? { type: current.type } : {})} onChange={handleChange} disabled={disabled} /> )} ); }; //Контроль свойств - Поле ввода P8PInput.propTypes = P8P_INPUT; //---------------- //Интерфейс модуля //---------------- export { P8P_INPUT, P8PInput };