/*
Парус 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 };