/* Парус 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 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 STYLES = { GRID_CONTAINER: { display: "flex", justifyContent: "center", alignItems: "flex-start", minHeight: "100vh" }, GRID: { maxWidth: 1200, direction: "row", justifyContent: "left", alignItems: "stretch" }, GRID_PANEL_CARD: { maxWidth: 400, height: "100%", flexDirection: "column", display: "flex" }, GRID_PANEL_CARD_MEDIA: { height: 140 }, GRID_PANEL_CARD_CONTENT_TITLE: { alignItems: "flex-start" }, GRID_PANEL_CARD_CONTENT_TITLE_ICON: { paddingTop: "4px" }, GRID_PANEL_CARD_ACTIONS: { marginTop: "auto", display: "flex", justifyContent: "flex-end", alignItems: "flex-start" }, DESKTOP_GROUP_HEADER: { fontWeight: "bold", fontFamily: "tahoma, arial, verdana, sans-serif!important", fontSize: "13px!important" }, DESKTOP_ITEM_BUTTON: { fontSize: "12px", textTransform: "none", "&:hover": { backgroundColor: "#c3e1ff" }, width: "150px", height: "90px", flexDirection: "column", justifyContent: "flex-start" }, DESKTOP_ITEM_ICON: { width: "48px", height: "48px", fontSize: "48px" }, DESKTOP_ITEM_CATION: { display: "-webkit-box", overflow: "hidden", WebkitBoxOrient: "vertical", WebkitLineClamp: 2, fontSize: "12px", maxWidth: "140px", lineHeight: "1.2" } }; //-------------------------------- //Вспомогательные классы и функции //-------------------------------- //Формирование групп 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 };