/* Парус 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"; //Интерфейсные компоненты import { P8P_BOX_PANELS_MENU_CONTAINER } from "../theme/styles/box"; //Стили контейнеров import { P8P_GRID_VARIANT } from "../theme/variants/p8p_grid_variants"; //Варианты сеток import { P8P_CARD_VARIANT } from "../theme/variants/p8p_card_variants"; //Варианты карточек import { P8P_COMPONENT_HEIGHT } from "../theme/styles/common"; //Стили - общие import { P8P_ICON_VARIANT } from "../theme/variants/p8p_icon_variants"; //Варианты иконок import { P8P_CARD_ACTIONS_VARIANT } from "../theme/variants/p8p_card_actions_variants"; //Варианты действий карточки import { P8P_TYPOGRAPHY_VARIANT } from "../theme/p8p_typography"; //Варианты шрифтов import { P8P_BUTTON_VARIANT } from "../theme/variants/p8p_button_variants"; //Варианты кнопок import { P8P_LIST_ITEM_TEXT_VARIANT } from "../theme/variants/p8p_list_item_text_variants"; //Варианты значений списков import { P8P_TYPOGRAPHY_PANEL_DESK } from "../theme/styles/typography"; //Стили текста //--------- //Константы //--------- //Типы меню const P8P_PANELS_MENU_VARIANT = { DRAWER: "DRAWER", GRID: "GRID", DESKTOP: "DESKTOP" }; //Структура элемента описания панели const P8P_PANELS_MENU_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, group) => { 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); if (group) res = res.filter(g => g == group); return res; }; //Формирование ссылок на панели const getPanelsLinks = ({ variant, panels, selectedPanel, group, defaultGroupTytle, navigateCaption, onItemNavigate }) => { //Получим группы let grps = getGroups(panels, group); //Построим ссылки const panelsLinks = []; for (const grp of grps) { if (!(grps.length == 1 && grps[0] == null)) panelsLinks.push( variant === P8P_PANELS_MENU_VARIANT.GRID ? ( {grp ? grp : defaultGroupTytle} ) : variant === P8P_PANELS_MENU_VARIANT.DRAWER ? ( ) : ( {grp ? grp : defaultGroupTytle} ) ); for (const panel of panels) { if (panel.showInPanelsList == true && ((grp && panel.group === grp) || (!grp && !panel.group))) panelsLinks.push( variant === P8P_PANELS_MENU_VARIANT.GRID ? ( {panel.preview ? ( ) : ( )} {panel.icon ? {panel.icon} : null} {panel.caption} {panel.desc} ) : variant === P8P_PANELS_MENU_VARIANT.DRAWER ? ( (onItemNavigate ? onItemNavigate(panel) : null)} > {panel.icon} ) : ( ) ); } } //Вернём ссылки return panelsLinks; }; //----------- //Тело модуля //----------- //Меню панелей - сдвигающееся боковое меню const P8PPanelsMenuDrawer = ({ onItemNavigate, panels = [], selectedPanel } = {}) => { //Формируем ссылки на панели const panelsLinks = getPanelsLinks({ variant: P8P_PANELS_MENU_VARIANT.DRAWER, panels, selectedPanel, onItemNavigate }); //Генерация содержимого return {panelsLinks}; }; //Контроль свойств - Меню панелей - сдвигающееся боковое меню P8PPanelsMenuDrawer.propTypes = { onItemNavigate: PropTypes.func, panels: PropTypes.arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired, selectedPanel: P8P_PANELS_MENU_PANEL_SHAPE }; //Меню панелей - грид const P8PPanelsMenuGrid = ({ onItemNavigate, navigateCaption, panels = [], defaultGroupTytle } = {}) => { //Формируем ссылки на панели const panelsLinks = getPanelsLinks({ variant: P8P_PANELS_MENU_VARIANT.GRID, panels, defaultGroupTytle, navigateCaption, onItemNavigate }); //Генерация содержимого return ( {panelsLinks} ); }; //Контроль свойств - Меню панелей - грид P8PPanelsMenuGrid.propTypes = { onItemNavigate: PropTypes.func, navigateCaption: PropTypes.string.isRequired, panels: PropTypes.arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired, defaultGroupTytle: PropTypes.string.isRequired }; //Меню панелей - рабочий стол const P8PPanelsMenuDesktop = ({ group, onItemNavigate, panels = [], defaultGroupTytle } = {}) => { //Формируем ссылки на панели const panelsLinks = getPanelsLinks({ variant: P8P_PANELS_MENU_VARIANT.DESKTOP, panels, group, defaultGroupTytle, onItemNavigate }); //Генерация содержимого return ( {panelsLinks[0]} {panelsLinks.map((l, i) => (i > 0 ? l : null))} ); }; //Контроль свойств - Меню панелей - рабочий стол P8PPanelsMenuDesktop.propTypes = { group: PropTypes.string, onItemNavigate: PropTypes.func, panels: PropTypes.arrayOf(P8P_PANELS_MENU_PANEL_SHAPE).isRequired, defaultGroupTytle: PropTypes.string.isRequired }; //---------------- //Интерфейс модуля //---------------- export { P8P_PANELS_MENU_PANEL_SHAPE, P8PPanelsMenuDrawer, P8PPanelsMenuGrid, P8PPanelsMenuDesktop };