/* Парус 8 - Панели мониторинга Компонент: Диалог отображения параметров */ //--------------------- //Подключение библиотек //--------------------- import React, { useState, useContext, useMemo } from "react"; //Классы React import PropTypes from "prop-types"; //Контроль свойств компонента import { Stack, List, ListItem, ListItemButton, ListItemText, Typography, Box, Divider } from "@mui/material"; //Интерфейсные элементы import { P8PDialog, P8P_DIALOG_WIDTH } from "./p8p_dialog"; //Типовой диалог import { P8PSettingsList } from "./p8p_settings_list"; //Список параметров import { ApplicationCtx } from "../context/application"; //Контекст приложения import { deepCopyObject, hasValue } from "../core/utils"; //Вспомогательные функции import { P8P_BOX_SETTINGS_CONTAINER, P8P_BOX_SETTINGS_LIST, P8P_BOX_SETTINGS_PANELS } from "../theme/styles/box"; //Стили контейнеров import { P8P_LIST_ITEM_TEXT_VARIANT } from "../theme/variants/p8p_list_item_text_variants"; //Варианты значений списков import { P8P_TYPOGRAPHY_VARIANT } from "../theme/p8p_typography"; //Варианты шрифтов //----------- //Тело модуля //----------- //Диалог отображения параметров const P8PSettingsDialog = ({ settings, panel = null, onOk, onClose }) => { //Собственное состояние - параметры панелей const [panelSettings, setPanelSettings] = useState(settings); //Собственное состояние - мнемокод выбранной панели const [selectedPanel, setSelectedPanel] = useState(panel); //Собственное состояние - наличие отображаемых данных const isSettingsExists = useMemo(() => { return selectedPanel ? panelSettings && Object.keys(panelSettings).length > 0 && Object.keys(panelSettings[selectedPanel]).length > 0 : Object.keys(panelSettings).length > 0; }, [selectedPanel, panelSettings]); //Подключение к контексту приложения const { appState } = useContext(ApplicationCtx); //При нажатии на "ОК" const handleOk = () => onOk && onOk(panelSettings); //При нажатии на "Отменить" const handleCancel = () => onClose && onClose(); //При изменении параметра const handleSettingChange = (settingCode, newSettings) => { //Определяем панели const newPanelSettings = deepCopyObject(panelSettings); //Изменяем настройку у панели newPanelSettings[selectedPanel][settingCode] = deepCopyObject(newSettings); //Обновляем панели setPanelSettings(newPanelSettings); }; //При нажатии на панель const handlePanelSelect = panelName => setSelectedPanel(selectedPanel === panelName ? null : panelName); //Генерация области выбора панели const panelsListRender = () => { //Генерация содержимого return ( <> {Object.keys(panelSettings).map((panel, i) => { //Считываем информацию о панели const panelInfo = appState.panels.find(appPanel => appPanel.name == panel); //Элемент панели return ( handlePanelSelect(panel)} selected={panel === selectedPanel}> {`${panelInfo.desc ? panelInfo.desc : "Описание отсутствует"}`} } /> ); })} ); }; //Формирование представления return ( appPanel.name == panel).caption}"` : "панелей"}`} width={P8P_DIALOG_WIDTH.LG} onCancel={handleCancel} onOk={handleOk} scrollContent={false} okDisabled={Object.keys(panelSettings).length === 0} > {isSettingsExists ? ( {!hasValue(panel) ? panelsListRender() : null} {hasValue(selectedPanel) ? ( ) : ( <> Выберите панель для отображения параметров )} ) : ( Отсутствуют доступные параметры )} ); }; //Контроль свойств компонента - Диалог отображения параметров P8PSettingsDialog.propTypes = { settings: PropTypes.object.isRequired, panel: PropTypes.string, onOk: PropTypes.func, onClose: PropTypes.func }; //---------------- //Интерфейс модуля //---------------- export { P8PSettingsDialog };