forked from CITKParus/P8-Panels
148 lines
7.2 KiB
JavaScript
148 lines
7.2 KiB
JavaScript
/*
|
||
Парус 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 (
|
||
<>
|
||
<Box sx={P8P_BOX_SETTINGS_PANELS}>
|
||
<List>
|
||
{Object.keys(panelSettings).map((panel, i) => {
|
||
//Считываем информацию о панели
|
||
const panelInfo = appState.panels.find(appPanel => appPanel.name == panel);
|
||
//Элемент панели
|
||
return (
|
||
<ListItem key={i}>
|
||
<ListItemButton onClick={() => handlePanelSelect(panel)} selected={panel === selectedPanel}>
|
||
<ListItemText
|
||
variant={P8P_LIST_ITEM_TEXT_VARIANT.PRIMARY}
|
||
primary={panelInfo.name}
|
||
secondaryTypographyProps={{ component: "div" }}
|
||
secondary={
|
||
<Stack direction="row" justifyContent="space-between" gap={2}>
|
||
<Typography
|
||
variant={P8P_TYPOGRAPHY_VARIANT.CAPTION}
|
||
noWrap={true}
|
||
title={panelInfo.desc ? panelInfo.desc : "Описание отсутствует"}
|
||
>{`${panelInfo.desc ? panelInfo.desc : "Описание отсутствует"}`}</Typography>
|
||
</Stack>
|
||
}
|
||
/>
|
||
</ListItemButton>
|
||
</ListItem>
|
||
);
|
||
})}
|
||
</List>
|
||
</Box>
|
||
<Divider orientation="vertical" flexItem />
|
||
</>
|
||
);
|
||
};
|
||
|
||
//Формирование представления
|
||
return (
|
||
<P8PDialog
|
||
title={`Параметры ${panel ? `"${appState.panels.find(appPanel => appPanel.name == panel).caption}"` : "панелей"}`}
|
||
width={P8P_DIALOG_WIDTH.LG}
|
||
onCancel={handleCancel}
|
||
onOk={handleOk}
|
||
scrollContent={false}
|
||
okDisabled={Object.keys(panelSettings).length === 0}
|
||
>
|
||
{isSettingsExists ? (
|
||
<Box sx={P8P_BOX_SETTINGS_CONTAINER}>
|
||
{!hasValue(panel) ? panelsListRender() : null}
|
||
<Box sx={P8P_BOX_SETTINGS_LIST}>
|
||
{hasValue(selectedPanel) ? (
|
||
<P8PSettingsList settings={panelSettings[selectedPanel]} onSettingChange={handleSettingChange} />
|
||
) : (
|
||
<>
|
||
<Typography align="center" component="h6" variant={P8P_TYPOGRAPHY_VARIANT.SUBTITLE1}>
|
||
Выберите панель для отображения параметров
|
||
</Typography>
|
||
</>
|
||
)}
|
||
</Box>
|
||
</Box>
|
||
) : (
|
||
<Typography align="center" component="h6" variant={P8P_TYPOGRAPHY_VARIANT.SUBTITLE1}>
|
||
Отсутствуют доступные параметры
|
||
</Typography>
|
||
)}
|
||
</P8PDialog>
|
||
);
|
||
};
|
||
|
||
//Контроль свойств компонента - Диалог отображения параметров
|
||
P8PSettingsDialog.propTypes = {
|
||
settings: PropTypes.object.isRequired,
|
||
panel: PropTypes.string,
|
||
onOk: PropTypes.func,
|
||
onClose: PropTypes.func
|
||
};
|
||
|
||
//----------------
|
||
//Интерфейс модуля
|
||
//----------------
|
||
|
||
export { P8PSettingsDialog };
|