/*
Парус 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 { APP_STYLES } from "../../app.styles"; //Типовые стили
import { P8PSettingsList } from "./p8p_settings_list"; //Список параметров
import { ApplicationCtx } from "../context/application"; //Контекст приложения
import { deepCopyObject, hasValue } from "../core/utils"; //Вспомогательные функции
//---------
//Константы
//---------
//Стили
const STYLES = {
CONTAINER: { display: "flex", flexDirection: "row", alignItems: "flex-start" },
BOX_PANELS: { width: "300px", height: "500px", overflow: "auto", ...APP_STYLES.SCROLL },
BOX_SETTINGS: { width: "520px", height: "500px", overflow: "auto", ...APP_STYLES.SCROLL }
};
//-----------
//Тело модуля
//-----------
//Диалог отображения параметров
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 };