/*
Парус 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 };