/* Парус 8 - Панели мониторинга - Редактор запросов Компоненты: Сущность запроса */ //--------------------- //Подключение библиотек //--------------------- import React from "react"; //Классы React import PropTypes from "prop-types"; //Контроль свойств компонента import { Box, Stack, ListItem, Icon, ListItemButton, Typography } from "@mui/material"; //Компоненты UI import { ENTITY_TYPE, ENTITY_TYPE_ICON } from "../../common"; //Общие ресурсы и константы редактора запросов import { ATTRIBUTE_SHAPE } from "../attribute/attribute"; //Описание атрибута сущности //--------- //Константы //--------- //Варианты представления сущности const ENTITY_VARIANT = { LIST_ITEM: "LIST_ITEM", DIAGRAM: "DIAGRAM" }; //Иконки const ICONS = { ...ENTITY_TYPE_ICON, DEFAULT: "border_clear" }; //Структура данных о сущности запроса const ENTITY_SHAPE = PropTypes.shape({ id: PropTypes.string.isRequired, name: PropTypes.string.isRequired, title: PropTypes.string.isRequired, type: PropTypes.oneOf(Object.values(ENTITY_TYPE)).isRequired, x: PropTypes.number.isRequired, y: PropTypes.number.isRequired, attrs: PropTypes.arrayOf(ATTRIBUTE_SHAPE).isRequired }); //Структура данных о сущности запроса (краткая) const ENTITY_BRIEF_SHAPE = PropTypes.shape({ name: PropTypes.string.isRequired, title: PropTypes.string.isRequired, type: PropTypes.oneOf(Object.values(ENTITY_TYPE)).isRequired }); //Стили const STYLES = { CONTAINER: selected => ({ width: "100%", height: "100%", border: "1px solid var(--border-color-dark)", borderRadius: "6px", boxShadow: "var(--shadow-entity)", overflow: "hidden", backgroundColor: "white", cursor: "move", ...(selected ? { outline: "1px solid var(--outline-color)", borderColor: "var(--outline-color)" } : {}) }), CONTENT_STACK: variant => ({ width: "100%", backgroundColor: "var(--entity-title-bg)", ...(variant === ENTITY_VARIANT.DIAGRAM ? { height: "50px" } : {}) }), CAPTIONS_TYPOGRAPHY: variant => ({ ...(variant === ENTITY_VARIANT.DIAGRAM ? { maxWidth: "100px", overflow: "hidden" } : {}) }) }; //----------- //Тело модуля //----------- //Сущность запроса const Entity = ({ data, variant = ENTITY_VARIANT.DIAGRAM, selected = false, onClick = null }) => { //Иконка const icon = ICONS[data.type] || ICONS.DEFAULT; //Всплывающая подсказка const iconTitle = data.type === ENTITY_TYPE.VIEW ? "Представление" : "Таблица"; //Содержимое самой сущности const entContent = ( {icon} {data.title} {data.name} ); //Формирование представления return variant == ENTITY_VARIANT.LIST_ITEM ? ( onClick && onClick(data)} dense> {entContent} ) : variant == ENTITY_VARIANT.DIAGRAM ? ( {entContent} ) : null; }; //Контроль свойств компонента - Сущность запроса Entity.propTypes = { data: PropTypes.oneOfType([ENTITY_SHAPE, ENTITY_BRIEF_SHAPE]).isRequired, variant: PropTypes.string, selected: PropTypes.bool, onClick: PropTypes.func }; //---------------- //Интерфейс модуля //---------------- export { Entity, ENTITY_VARIANT, ENTITY_SHAPE, ENTITY_BRIEF_SHAPE };