/* Парус 8 - Панели мониторинга - ПУП - Информация о проектах Общие дополнительная разметка и вёрстка клиентских элементов */ //--------------------- //Подключение библиотек //--------------------- import React, { useState, useEffect } from "react"; //Классы React import PropTypes from "prop-types"; //Контроль свойств компонента import { Box, Icon, Input, InputAdornment, FormControl, Select, InputLabel, MenuItem, IconButton, Typography, Switch, Stack } from "@mui/material"; //Интерфейсные компоненты //--------- //Константы //--------- //Стили const STYLES = { STATE: value => ({ color: value === 1 ? "green" : "black" }), COST_STATUS: color => ({ color, verticalAlign: "middle" }), COST_READY: value => ({ color: value <= 30 ? "red" : value >= 80 ? "green" : "#e2af00" }), TOGGLE_COLOR: checked => ({ color: checked ? "#006dd9" : "lightgrey" }) }; //----------- //Тело модуля //----------- //Поле ввода формы const FormField = ({ elementCode, elementValue, labelText, onChange, dictionary, list, type, ...other }) => { //Значение элемента const [value, setValue] = useState(elementValue); //При получении нового значения из вне useEffect(() => { setValue(elementValue); }, [elementValue]); //Выбор значения из словаря const handleDictionaryClick = () => dictionary ? dictionary(res => (res ? res.map(i => handleChange({ target: { name: i.name, value: i.value } })) : null)) : null; //Изменение значения элемента (по событию) const handleChange = e => { setValue(e.target.value); if (onChange) onChange(e.target.name, e.target.value); }; //Генерация содержимого return ( {list ? ( <> {labelText} ) : ( <> {labelText} list ) : null } {...(type ? { type } : {})} onChange={handleChange} /> )} ); }; //Контроль свойств - Поле ввода формы FormField.propTypes = { elementCode: PropTypes.string.isRequired, elementValue: PropTypes.oneOfType([PropTypes.number, PropTypes.string, PropTypes.instanceOf(Date)]), labelText: PropTypes.string.isRequired, onChange: PropTypes.func, dictionary: PropTypes.func, list: PropTypes.array, type: PropTypes.string }; //Переключатель const Toggle = ({ labels, checked, onChange }) => { //Обработка переключения const handleChange = event => (onChange ? onChange(event.target.checked) : null); //Генерация содержимого return ( {labels[0]} {labels[1]} ); }; //Контроль свойств компонента - Переключатель Toggle.propTypes = { labels: PropTypes.arrayOf(PropTypes.string).isRequired, checked: PropTypes.bool.isRequired, onChange: PropTypes.func }; //Формирование значения для колонки "Статус структуры цены" const formatCostStatusValue = ({ value, onClick, type = 1 }) => { const [text, color] = value == 0 ? ["Без отклонений", "lightgreen"] : value == 1 ? [type == 1 ? "Есть статьи с расходом более 90%" : "Расход более 90%", "#ffdf71"] : value == 2 ? [type == 1 ? "Есть статьи с перерасходом" : "Перерасход", "#eb6b6b"] : ["Не определено", "lightgray"]; return onClick ? ( circle ) : ( circle ); }; //Формирование значения для колонки "Готов (%, зтраты)" const formatCostReadyValue = value => { return {value}; }; //---------------- //Интерфейс модуля //---------------- export { STYLES as COMMON_STYLES, FormField, Toggle, formatCostStatusValue, formatCostReadyValue };