/*
Парус 8 - Панели мониторинга
Компонент: Меню панелей
*/
//---------------------
//Подключение библиотек
//---------------------
import React from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import {
Button,
Typography,
Icon,
Box,
Card,
CardActions,
CardContent,
CardMedia,
Stack,
Grid,
Divider,
List,
ListItem,
ListItemButton,
ListItemIcon,
ListItemText
} from "@mui/material"; //Интерфейсные компоненты
//---------
//Константы
//---------
//Типы меню
const VARIANT = {
DRAWER: "DRAWER",
GRID: "GRID"
};
//Стили
const STYLES = {
CONTAINER: {
display: "flex",
justifyContent: "center",
alignItems: "flex-start",
minHeight: "100vh"
},
TITLE: {
textTransform: "uppercase",
textAlign: "center",
fontWeight: "bold"
},
GRID: {
maxWidth: 1200,
direction: "row",
justifyContent: "left",
alignItems: "stretch"
},
PANEL_CARD: {
maxWidth: 400,
height: "100%",
flexDirection: "column",
display: "flex"
},
PANEL_CARD_MEDIA: {
height: 140
},
PANEL_CARD_CONTENT_TITLE: {
alignItems: "center"
},
PANEL_CARD_ACTIONS: {
marginTop: "auto",
display: "flex",
justifyContent: "flex-end",
alignItems: "flex-start"
}
};
//Структура элемента описания панели
const PANEL_SHAPE = PropTypes.shape({
name: PropTypes.string.isRequired,
caption: PropTypes.string.isRequired,
desc: PropTypes.string.isRequired,
group: PropTypes.string,
icon: PropTypes.string.isRequired,
path: PropTypes.string.isRequired,
preview: PropTypes.string.isRequired,
showInPanelsList: PropTypes.bool.isRequired,
url: PropTypes.string.isRequired
});
//--------------------------------
//Вспомогательные классы и функции
//--------------------------------
//Формирование групп
const getGroups = panels => {
let res = [];
let addDefaultGroup = false;
for (const panel of panels)
if (panel.showInPanelsList == true) {
if (panel.group && !res.includes(panel.group)) res.push(panel.group);
if (!panel.group) addDefaultGroup = true;
}
if (addDefaultGroup || res.length == 0) res.push(null);
return res;
};
//Формирование ссылок на панели
const getPanelsLinks = ({ variant, panels, selectedPanel, defaultGroupTytle, navigateCaption, onItemNavigate }) => {
//Получим группы
let grps = getGroups(panels);
//Построим ссылки
const panelsLinks = [];
for (const grp of grps) {
if (!(grps.length == 1 && grps[0] == null))
panelsLinks.push(
variant === VARIANT.GRID ? (
{grp ? grp : defaultGroupTytle}
) : (
)
);
for (const panel of panels) {
if (panel.showInPanelsList == true && ((grp && panel.group === grp) || (!grp && !panel.group)))
panelsLinks.push(
variant === VARIANT.GRID ? (
{panel.preview ? (
) : null}
{panel.icon ? {panel.icon} : null}
{panel.caption}
{panel.desc}
) : (
(onItemNavigate ? onItemNavigate(panel) : null)}
>
{panel.icon}
)
);
}
}
//Вернём ссылки
return panelsLinks;
};
//-----------
//Тело модуля
//-----------
//Меню панелей - сдвигающееся боковое меню
const P8PPanelsMenuDrawer = ({ onItemNavigate, panels = [], selectedPanel } = {}) => {
//Формируем ссылки на панели
const panelsLinks = getPanelsLinks({ variant: VARIANT.DRAWER, panels, selectedPanel, onItemNavigate });
//Генерация содержимого
return {panelsLinks}
;
};
//Контроль свойств - Меню панелей - сдвигающееся боковое меню
P8PPanelsMenuDrawer.propTypes = {
onItemNavigate: PropTypes.func,
panels: PropTypes.arrayOf(PANEL_SHAPE).isRequired,
selectedPanel: PANEL_SHAPE
};
//Меню панелей - грид
const P8PPanelsMenuGrid = ({ title, onItemNavigate, navigateCaption, panels = [], defaultGroupTytle } = {}) => {
//Формируем ссылки на панели
const panelsLinks = getPanelsLinks({ variant: VARIANT.GRID, panels, defaultGroupTytle, navigateCaption, onItemNavigate });
//Генерация содержимого
return (
{title ? (
{title}
) : null}
{panelsLinks}
);
};
//Контроль свойств - Меню панелей - грид
P8PPanelsMenuGrid.propTypes = {
title: PropTypes.string,
onItemNavigate: PropTypes.func,
navigateCaption: PropTypes.string.isRequired,
panels: PropTypes.arrayOf(PANEL_SHAPE).isRequired,
defaultGroupTytle: PropTypes.string.isRequired
};
//----------------
//Интерфейс модуля
//----------------
export { PANEL_SHAPE, P8PPanelsMenuDrawer, P8PPanelsMenuGrid };