forked from CITKParus/P8-Panels
WEBAPP+БД: Новый компонент - P8PIndicator
This commit is contained in:
parent
fbbbd7c247
commit
416eae7d88
186
app/components/p8p_indicator.js
Normal file
186
app/components/p8p_indicator.js
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
/*
|
||||||
|
Парус 8 - Панели мониторинга
|
||||||
|
Компонент: Индикатор
|
||||||
|
*/
|
||||||
|
|
||||||
|
//---------------------
|
||||||
|
//Подключение библиотек
|
||||||
|
//---------------------
|
||||||
|
|
||||||
|
import React, { useState } from "react"; //Классы React
|
||||||
|
import PropTypes from "prop-types"; //Контроль свойств компонента
|
||||||
|
import { IconButton, Icon, Typography, Paper, Stack } from "@mui/material"; //Интерфейсные компоненты MUI
|
||||||
|
import { P8PHintDialog } from "./p8p_app_message"; //Диалог подсказки
|
||||||
|
import { TEXTS, STATE } from "../../app.text"; //Типовые текстовые ресурсы и константы
|
||||||
|
import { APP_COLORS } from "../../app.styles"; //Типовые стили
|
||||||
|
|
||||||
|
//---------
|
||||||
|
//Константы
|
||||||
|
//---------
|
||||||
|
|
||||||
|
//Варианты исполнения
|
||||||
|
|
||||||
|
const P8P_INDICATOR_VARIANT = {
|
||||||
|
ELEVATION: "elevation",
|
||||||
|
OUTLINED: "outlined"
|
||||||
|
};
|
||||||
|
|
||||||
|
//Состояния
|
||||||
|
const P8P_INDICATOR_STATE = {
|
||||||
|
UNDEFINED: STATE.UNDEFINED,
|
||||||
|
OK: STATE.OK,
|
||||||
|
WARN: STATE.WARN,
|
||||||
|
ERR: STATE.ERR
|
||||||
|
};
|
||||||
|
//Цвета заливки
|
||||||
|
const BG_COLOR = {
|
||||||
|
[STATE.OK]: APP_COLORS[STATE.OK].color,
|
||||||
|
[STATE.ERR]: APP_COLORS[STATE.ERR].color,
|
||||||
|
[STATE.WARN]: APP_COLORS[STATE.WARN].color
|
||||||
|
};
|
||||||
|
|
||||||
|
//Цвета текста и иконок
|
||||||
|
const COLOR = {
|
||||||
|
[STATE.OK]: APP_COLORS[STATE.OK].contrColor,
|
||||||
|
[STATE.ERR]: APP_COLORS[STATE.ERR].contrColor,
|
||||||
|
[STATE.WARN]: APP_COLORS[STATE.WARN].contrColor
|
||||||
|
};
|
||||||
|
|
||||||
|
//Стили
|
||||||
|
const STYLES = {
|
||||||
|
CONTAINER: (state, clickable, userColor, userBackgroundColor) => ({
|
||||||
|
padding: "10px",
|
||||||
|
width: "100%",
|
||||||
|
height: "100%",
|
||||||
|
overflow: "hidden",
|
||||||
|
...getBackgroundColor(state, userBackgroundColor),
|
||||||
|
...getColor(state, userColor),
|
||||||
|
display: "flex",
|
||||||
|
flexDirection: "column",
|
||||||
|
justifyContent: "center",
|
||||||
|
...(clickable
|
||||||
|
? {
|
||||||
|
cursor: "pointer",
|
||||||
|
"&:hover": { backgroundColor: APP_COLORS.HOVER.color },
|
||||||
|
"&:active": { backgroundColor: APP_COLORS.ACTIVE.color }
|
||||||
|
}
|
||||||
|
: {})
|
||||||
|
}),
|
||||||
|
ICON: (state, userColor) => ({ fontSize: "50px", ...getColor(state, userColor) }),
|
||||||
|
HINT_ICON: (state, userColor) => ({ fontSize: "1rem", ...getColor(state, userColor) }),
|
||||||
|
VALUE_CAPTION_STACK: { containerType: "inline-size", width: "100%", overflow: "hidden" },
|
||||||
|
CAPTION_TYPOGRAPHY: { width: "99cqw" }
|
||||||
|
};
|
||||||
|
|
||||||
|
//-----------------------
|
||||||
|
//Вспомогательные функции
|
||||||
|
//-----------------------
|
||||||
|
|
||||||
|
//Подбор цвета заливки
|
||||||
|
const getBackgroundColor = (state, userColor) =>
|
||||||
|
userColor ? { backgroundColor: userColor } : BG_COLOR[state] ? { backgroundColor: BG_COLOR[state] } : {};
|
||||||
|
|
||||||
|
//Подбор цвета текста
|
||||||
|
const getColor = (state, userColor) => (userColor ? { color: userColor } : COLOR[state] ? { color: COLOR[state] } : {});
|
||||||
|
|
||||||
|
//-----------
|
||||||
|
//Тело модуля
|
||||||
|
//-----------
|
||||||
|
|
||||||
|
//Индикатор
|
||||||
|
const P8PIndicator = ({
|
||||||
|
caption,
|
||||||
|
value,
|
||||||
|
icon = null,
|
||||||
|
state = STATE.UNDEFINED,
|
||||||
|
square = false,
|
||||||
|
elevation = 3,
|
||||||
|
variant = P8P_INDICATOR_VARIANT.ELEVATION,
|
||||||
|
hint = null,
|
||||||
|
onClick = null,
|
||||||
|
backgroundColor = null,
|
||||||
|
color = null
|
||||||
|
} = {}) => {
|
||||||
|
//Собственное состояние - отображение окна подсказки
|
||||||
|
const [showHint, setShowHint] = useState(false);
|
||||||
|
|
||||||
|
//При нажатии на индикатор
|
||||||
|
const handleClick = () => (onClick && !showHint ? onClick() : null);
|
||||||
|
|
||||||
|
//При нажатии на кнопку получения подсказки
|
||||||
|
const handleHintClick = e => {
|
||||||
|
setShowHint(true);
|
||||||
|
e.stopPropagation();
|
||||||
|
};
|
||||||
|
|
||||||
|
//При нажатии на кнопку закрытия подсказки
|
||||||
|
const handleHintClose = () => setShowHint(false);
|
||||||
|
|
||||||
|
//Представление текста значения индикатора
|
||||||
|
const valueTextView = <Typography variant={"h4"}>{[undefined, null, ""].includes(value) ? TEXTS.NO_DATA_FOUND_SHORT : value}</Typography>;
|
||||||
|
|
||||||
|
//Представление текста подписи индикатора
|
||||||
|
const captionView = (
|
||||||
|
<Typography align={"left"} noWrap={true} sx={STYLES.CAPTION_TYPOGRAPHY} title={caption}>
|
||||||
|
{caption}
|
||||||
|
</Typography>
|
||||||
|
);
|
||||||
|
|
||||||
|
//Представление подписи индикатора
|
||||||
|
const valueView = hint ? (
|
||||||
|
<>
|
||||||
|
{showHint && <P8PHintDialog title={caption} hint={hint} onOk={handleHintClose} />}
|
||||||
|
<Stack direction={"row"} alignItems={"start"}>
|
||||||
|
{valueTextView}
|
||||||
|
<IconButton onClick={handleHintClick}>
|
||||||
|
<Icon sx={STYLES.HINT_ICON(state, color)}>help_outline</Icon>
|
||||||
|
</IconButton>
|
||||||
|
</Stack>
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
valueTextView
|
||||||
|
);
|
||||||
|
|
||||||
|
//Флаг активности индикатора
|
||||||
|
const clickable = onClick ? true : false;
|
||||||
|
|
||||||
|
//Представление
|
||||||
|
return (
|
||||||
|
<Paper
|
||||||
|
elevation={variant === P8P_INDICATOR_VARIANT.ELEVATION ? elevation : 0}
|
||||||
|
sx={STYLES.CONTAINER(state, clickable, color, backgroundColor)}
|
||||||
|
square={square}
|
||||||
|
variant={variant}
|
||||||
|
onClick={handleClick}
|
||||||
|
>
|
||||||
|
<Stack direction={"row"} alignItems={"center"} justifyContent={"space-between"}>
|
||||||
|
<Stack direction={"column"} alignItems={"start"} pr={2} sx={STYLES.VALUE_CAPTION_STACK}>
|
||||||
|
{valueView}
|
||||||
|
{captionView}
|
||||||
|
</Stack>
|
||||||
|
{icon ? <Icon sx={STYLES.ICON(state, color)}>{icon}</Icon> : null}
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
//Контроль свойств - Индикатор
|
||||||
|
P8PIndicator.propTypes = {
|
||||||
|
caption: PropTypes.string.isRequired,
|
||||||
|
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
|
||||||
|
icon: PropTypes.string,
|
||||||
|
state: PropTypes.oneOf(Object.values(P8P_INDICATOR_STATE)),
|
||||||
|
square: PropTypes.bool,
|
||||||
|
elevation: PropTypes.number,
|
||||||
|
variant: PropTypes.oneOf(Object.values(P8P_INDICATOR_VARIANT)),
|
||||||
|
hint: PropTypes.string,
|
||||||
|
onClick: PropTypes.func,
|
||||||
|
backgroundColor: PropTypes.string,
|
||||||
|
color: PropTypes.string
|
||||||
|
};
|
||||||
|
|
||||||
|
//----------------
|
||||||
|
//Интерфейс модуля
|
||||||
|
//----------------
|
||||||
|
|
||||||
|
export { P8P_INDICATOR_VARIANT, P8P_INDICATOR_STATE, P8PIndicator };
|
@ -9,14 +9,26 @@ create or replace package PKG_P8PANELS_VISUAL as
|
|||||||
SORDER_DIRECTION_ASC constant PKG_STD.TSTRING := 'ASC'; -- По возрастанию
|
SORDER_DIRECTION_ASC constant PKG_STD.TSTRING := 'ASC'; -- По возрастанию
|
||||||
SORDER_DIRECTION_DESC constant PKG_STD.TSTRING := 'DESC'; -- По убыванию
|
SORDER_DIRECTION_DESC constant PKG_STD.TSTRING := 'DESC'; -- По убыванию
|
||||||
|
|
||||||
/* Константы - масштаб диаграммы Ганта */
|
/* Константы - диаграмма Ганта - масштаб */
|
||||||
NGANTT_ZOOM_QUARTER_DAY constant PKG_STD.TNUMBER := 0; -- Четверть дня
|
NGANTT_ZOOM_QUARTER_DAY constant PKG_STD.TNUMBER := 0; -- Четверть дня
|
||||||
NGANTT_ZOOM_HALF_DAY constant PKG_STD.TNUMBER := 1; -- Пол дня
|
NGANTT_ZOOM_HALF_DAY constant PKG_STD.TNUMBER := 1; -- Пол дня
|
||||||
NGANTT_ZOOM_DAY constant PKG_STD.TNUMBER := 2; -- День
|
NGANTT_ZOOM_DAY constant PKG_STD.TNUMBER := 2; -- День
|
||||||
NGANTT_ZOOM_WEEK constant PKG_STD.TNUMBER := 3; -- Неделя
|
NGANTT_ZOOM_WEEK constant PKG_STD.TNUMBER := 3; -- Неделя
|
||||||
NGANTT_ZOOM_MONTH constant PKG_STD.TNUMBER := 4; -- Месяц
|
NGANTT_ZOOM_MONTH constant PKG_STD.TNUMBER := 4; -- Месяц
|
||||||
|
|
||||||
/* Константы - масштаб циклограммы */
|
/* Константы - график - тип */
|
||||||
|
SCHART_TYPE_BAR constant PKG_STD.TSTRING := 'bar'; -- Столбчатая
|
||||||
|
SCHART_TYPE_LINE constant PKG_STD.TSTRING := 'line'; -- Линейная
|
||||||
|
SCHART_TYPE_PIE constant PKG_STD.TSTRING := 'pie'; -- Круговая
|
||||||
|
SCHART_TYPE_DOUGHNUT constant PKG_STD.TSTRING := 'doughnut'; -- Кольцевая
|
||||||
|
|
||||||
|
/* Константы - график - расположение легенды */
|
||||||
|
SCHART_LGND_POS_LEFT constant PKG_STD.TSTRING := 'left'; -- Слева
|
||||||
|
SCHART_LGND_POS_RIGHT constant PKG_STD.TSTRING := 'right'; -- Справа
|
||||||
|
SCHART_LGND_POS_TOP constant PKG_STD.TSTRING := 'top'; -- Наверху
|
||||||
|
SCHART_LGND_POS_BOTTOM constant PKG_STD.TSTRING := 'bottom'; -- Внизу
|
||||||
|
|
||||||
|
/* Константы - циклограмма - масштаб */
|
||||||
NCYCLOGRAM_ZOOM_MIN constant PKG_STD.TLNUMBER := 0.2; -- Минимальный (0.2 от исходного)
|
NCYCLOGRAM_ZOOM_MIN constant PKG_STD.TLNUMBER := 0.2; -- Минимальный (0.2 от исходного)
|
||||||
NCYCLOGRAM_ZOOM_TINY constant PKG_STD.TLNUMBER := 0.4; -- Мелкий (0.4 от исходного)
|
NCYCLOGRAM_ZOOM_TINY constant PKG_STD.TLNUMBER := 0.4; -- Мелкий (0.4 от исходного)
|
||||||
NCYCLOGRAM_ZOOM_SMALL constant PKG_STD.TLNUMBER := 0.7; -- Уменьшенный (0.7 от исходного)
|
NCYCLOGRAM_ZOOM_SMALL constant PKG_STD.TLNUMBER := 0.7; -- Уменьшенный (0.7 от исходного)
|
||||||
@ -25,23 +37,21 @@ create or replace package PKG_P8PANELS_VISUAL as
|
|||||||
NCYCLOGRAM_ZOOM_HUGE constant PKG_STD.TLNUMBER := 2; -- Большой (2 от исходного)
|
NCYCLOGRAM_ZOOM_HUGE constant PKG_STD.TLNUMBER := 2; -- Большой (2 от исходного)
|
||||||
NCYCLOGRAM_ZOOM_MAX constant PKG_STD.TLNUMBER := 2.5; -- Максимальный (2.5 от исходного)
|
NCYCLOGRAM_ZOOM_MAX constant PKG_STD.TLNUMBER := 2.5; -- Максимальный (2.5 от исходного)
|
||||||
|
|
||||||
/* Константы - тип графика */
|
/* Константы - циклограмма - оформление */
|
||||||
SCHART_TYPE_BAR constant PKG_STD.TSTRING := 'bar'; -- Столбчатая
|
|
||||||
SCHART_TYPE_LINE constant PKG_STD.TSTRING := 'line'; -- Линейная
|
|
||||||
SCHART_TYPE_PIE constant PKG_STD.TSTRING := 'pie'; -- Круговая
|
|
||||||
SCHART_TYPE_DOUGHNUT constant PKG_STD.TSTRING := 'doughnut'; -- Кольцевая
|
|
||||||
|
|
||||||
/* Константы - расположение легенды графика */
|
|
||||||
SCHART_LGND_POS_LEFT constant PKG_STD.TSTRING := 'left'; -- Слева
|
|
||||||
SCHART_LGND_POS_RIGHT constant PKG_STD.TSTRING := 'right'; -- Справа
|
|
||||||
SCHART_LGND_POS_TOP constant PKG_STD.TSTRING := 'top'; -- Наверху
|
|
||||||
SCHART_LGND_POS_BOTTOM constant PKG_STD.TSTRING := 'bottom'; -- Внизу
|
|
||||||
|
|
||||||
/* Константы - циклограмма */
|
|
||||||
NCYCLOGRAM_GROUP_DEF_WIDTH constant PKG_STD.TNUMBER := 100; -- Высота заголовка группы (по умолчанию)
|
NCYCLOGRAM_GROUP_DEF_WIDTH constant PKG_STD.TNUMBER := 100; -- Высота заголовка группы (по умолчанию)
|
||||||
NCYCLOGRAM_GROUP_DEF_HEIGHT constant PKG_STD.TNUMBER := 42; -- Ширина заголовка группы (по умолчанию)
|
NCYCLOGRAM_GROUP_DEF_HEIGHT constant PKG_STD.TNUMBER := 42; -- Ширина заголовка группы (по умолчанию)
|
||||||
NCYCLOGRAM_LINE_HEIGHT constant PKG_STD.TNUMBER := 20; -- Высота строк циклограммы
|
NCYCLOGRAM_LINE_HEIGHT constant PKG_STD.TNUMBER := 20; -- Высота строк циклограммы
|
||||||
|
|
||||||
|
/* Константы - индикатор - состояния */
|
||||||
|
SINDICATOR_STATE_UNDEFINED constant PKG_STD.TSTRING := 'UNDEFINED'; -- Неопределено
|
||||||
|
SINDICATOR_STATE_OK constant PKG_STD.TSTRING := 'OK'; -- Позитивное
|
||||||
|
SINDICATOR_STATE_ERR constant PKG_STD.TSTRING := 'ERR'; -- Негативное
|
||||||
|
SINDICATOR_STATE_WARN constant PKG_STD.TSTRING := 'WARN'; -- Пограничное
|
||||||
|
|
||||||
|
/* Константы - индикатор - варианты исполнения */
|
||||||
|
SINDICATOR_VARIANT_ELEVATION constant PKG_STD.TSTRING := 'elevation'; -- Парящий
|
||||||
|
SINDICATOR_VARIANT_OUTLINED constant PKG_STD.TSTRING := 'outlined'; -- Плоский с рамкой
|
||||||
|
|
||||||
/* Типы данных - значение колонки таблицы данных */
|
/* Типы данных - значение колонки таблицы данных */
|
||||||
type TDG_COL_VAL is record
|
type TDG_COL_VAL is record
|
||||||
(
|
(
|
||||||
@ -333,6 +343,21 @@ create or replace package PKG_P8PANELS_VISUAL as
|
|||||||
RTASK_ATTRS TCYCLOGRAM_TASK_ATTRS -- Описание атрибутов карточки задачи
|
RTASK_ATTRS TCYCLOGRAM_TASK_ATTRS -- Описание атрибутов карточки задачи
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/* Типы данных - индикатор */
|
||||||
|
type TINDICATOR is record
|
||||||
|
(
|
||||||
|
SCAPTION PKG_STD.TSTRING, -- Подпись
|
||||||
|
SVALUE PKG_STD.TSTRING, -- Значение
|
||||||
|
SICON PKG_STD.TSTRING := null, -- Иконка (код шрифта "Google Material Icons" - https://fonts.google.com/icons?icon.set=Material+Icons)
|
||||||
|
SSTATE PKG_STD.TSTRING := SINDICATOR_STATE_UNDEFINED, -- Состояние (см. константы SINDICATOR_STATE_*)
|
||||||
|
BSQUARE boolean := false, -- Скруглять углы
|
||||||
|
NELEVATION PKG_STD.TNUMBER := 3, -- Высота парения (от 0 до 24, игнорируется для SINDICATOR_VARIANT_OUTLINED)
|
||||||
|
SVARIANT PKG_STD.TSTRING := SINDICATOR_VARIANT_ELEVATION, -- Вариант исполнения (см. константы SINDICATOR_VARIANT_*)
|
||||||
|
SHINT PKG_STD.TSTRING := null, -- Подсказка
|
||||||
|
SBACKGROUND_COLOR PKG_STD.TSTRING := null, -- Цвет заливки (HTML-код, null - использовать цвет по умолчанию для состояния)
|
||||||
|
SCOLOR PKG_STD.TSTRING := null -- Цвет шрифта и иконки (HTML-код, null - использовать цвет по умолчанию для состояния)
|
||||||
|
);
|
||||||
|
|
||||||
/* Расчет диапаона выдаваемых записей */
|
/* Расчет диапаона выдаваемых записей */
|
||||||
procedure UTL_ROWS_LIMITS_CALC
|
procedure UTL_ROWS_LIMITS_CALC
|
||||||
(
|
(
|
||||||
@ -750,6 +775,27 @@ create or replace package PKG_P8PANELS_VISUAL as
|
|||||||
NINCLUDE_DEF in number := 1 -- Включить описание колонок (0 - нет, 1 - да)
|
NINCLUDE_DEF in number := 1 -- Включить описание колонок (0 - нет, 1 - да)
|
||||||
) return clob; -- XML-описание
|
) return clob; -- XML-описание
|
||||||
|
|
||||||
|
/* Формирование индикатора */
|
||||||
|
function TINDICATOR_MAKE
|
||||||
|
(
|
||||||
|
SCAPTION in varchar2, -- Подпись
|
||||||
|
SVALUE in varchar2, -- Значение
|
||||||
|
SICON in varchar2 := null, -- Иконка (код шрифта "Google Material Icons" - https://fonts.google.com/icons?icon.set=Material+Icons)
|
||||||
|
SSTATE in varchar2 := SINDICATOR_STATE_UNDEFINED, -- Состояние (см. константы SINDICATOR_STATE_*)
|
||||||
|
BSQUARE in boolean := false, -- Скруглять углы
|
||||||
|
NELEVATION in number := 3, -- Высота парения (от 0 до 24, игнорируется для SINDICATOR_VARIANT_OUTLINED)
|
||||||
|
SVARIANT in varchar2 := SINDICATOR_VARIANT_ELEVATION, -- Вариант исполнения (см. константы SINDICATOR_VARIANT_*)
|
||||||
|
SHINT in varchar2 := null, -- Подсказка
|
||||||
|
SBACKGROUND_COLOR in varchar2 := null, -- Цвет заливки (HTML-код, null - использовать цвет по умолчанию для состояния)
|
||||||
|
SCOLOR in varchar2 := null -- Цвет шрифта и иконки (HTML-код, null - использовать цвет по умолчанию для состояния)
|
||||||
|
) return TINDICATOR; -- Результат работы
|
||||||
|
|
||||||
|
/* Сериализация индикатора */
|
||||||
|
function TINDICATOR_TO_XML
|
||||||
|
(
|
||||||
|
RINDICATOR in TINDICATOR -- Описание индикатора
|
||||||
|
) return clob; -- XML-описание
|
||||||
|
|
||||||
end PKG_P8PANELS_VISUAL;
|
end PKG_P8PANELS_VISUAL;
|
||||||
/
|
/
|
||||||
create or replace package body PKG_P8PANELS_VISUAL as
|
create or replace package body PKG_P8PANELS_VISUAL as
|
||||||
@ -769,6 +815,7 @@ create or replace package body PKG_P8PANELS_VISUAL as
|
|||||||
SRESP_TAG_XDATA_GRID constant PKG_STD.TSTRING := 'XDATA_GRID'; -- Тэг для описания таблицы данных
|
SRESP_TAG_XDATA_GRID constant PKG_STD.TSTRING := 'XDATA_GRID'; -- Тэг для описания таблицы данных
|
||||||
SRESP_TAG_XCYCLOGRAM constant PKG_STD.TSTRING := 'XCYCLOGRAM'; -- Тэг для описания циклограммы
|
SRESP_TAG_XCYCLOGRAM constant PKG_STD.TSTRING := 'XCYCLOGRAM'; -- Тэг для описания циклограммы
|
||||||
SRESP_TAG_XGANTT constant PKG_STD.TSTRING := 'XGANTT'; -- Тэг для описания диаграммы Ганта
|
SRESP_TAG_XGANTT constant PKG_STD.TSTRING := 'XGANTT'; -- Тэг для описания диаграммы Ганта
|
||||||
|
SRESP_TAG_XINDICATOR constant PKG_STD.TSTRING := 'XINDICATOR'; -- Тэг для описания индикатора
|
||||||
|
|
||||||
/* Константы - атрибуты ответов (универсальные) */
|
/* Константы - атрибуты ответов (универсальные) */
|
||||||
SRESP_ATTR_NAME constant PKG_STD.TSTRING := 'name'; -- Атрибут для наименования
|
SRESP_ATTR_NAME constant PKG_STD.TSTRING := 'name'; -- Атрибут для наименования
|
||||||
@ -801,6 +848,14 @@ create or replace package body PKG_P8PANELS_VISUAL as
|
|||||||
SRESP_ATTR_ROWS constant PKG_STD.TSTRING := 'rows'; -- Атрибут для строк данных
|
SRESP_ATTR_ROWS constant PKG_STD.TSTRING := 'rows'; -- Атрибут для строк данных
|
||||||
SRESP_ATTR_COLUMNS_DEF constant PKG_STD.TSTRING := 'columnsDef'; -- Атрибут для описания колонок
|
SRESP_ATTR_COLUMNS_DEF constant PKG_STD.TSTRING := 'columnsDef'; -- Атрибут для описания колонок
|
||||||
SRESP_ATTR_GROUPS constant PKG_STD.TSTRING := 'groups'; -- Атрибут для описания групп
|
SRESP_ATTR_GROUPS constant PKG_STD.TSTRING := 'groups'; -- Атрибут для описания групп
|
||||||
|
SRESP_ATTR_VALUE constant PKG_STD.TSTRING := 'value'; -- Атрибут для значения
|
||||||
|
SRESP_ATTR_ICON constant PKG_STD.TSTRING := 'icon'; -- Атрибут для иконки
|
||||||
|
SRESP_ATTR_STATE constant PKG_STD.TSTRING := 'state'; -- Атрибут для состояния
|
||||||
|
SRESP_ATTR_SQUARE constant PKG_STD.TSTRING := 'square'; -- Атрибут для флага скругления
|
||||||
|
SRESP_ATTR_ELEVATION constant PKG_STD.TSTRING := 'elevation'; -- Атрибут для высоты парения
|
||||||
|
SRESP_ATTR_VARIANT constant PKG_STD.TSTRING := 'variant'; -- Атрибут для варианта исполнения
|
||||||
|
SRESP_ATTR_BG_COLOR constant PKG_STD.TSTRING := 'backgroundColor'; -- Атрибут для цвета заливки
|
||||||
|
SRESP_ATTR_COLOR constant PKG_STD.TSTRING := 'color'; -- Атрибут для цвета
|
||||||
|
|
||||||
/* Константы - атрибуты ответов (таблица данных) */
|
/* Константы - атрибуты ответов (таблица данных) */
|
||||||
SRESP_ATTR_DT_ORDER constant PKG_STD.TSTRING := 'order'; -- Атрибут для флага сортировки
|
SRESP_ATTR_DT_ORDER constant PKG_STD.TSTRING := 'order'; -- Атрибут для флага сортировки
|
||||||
@ -3069,5 +3124,93 @@ create or replace package body PKG_P8PANELS_VISUAL as
|
|||||||
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
|
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
|
||||||
end TCYCLOGRAM_TO_XML;
|
end TCYCLOGRAM_TO_XML;
|
||||||
|
|
||||||
|
/* Формирование индикатора */
|
||||||
|
function TINDICATOR_MAKE
|
||||||
|
(
|
||||||
|
SCAPTION in varchar2, -- Подпись
|
||||||
|
SVALUE in varchar2, -- Значение
|
||||||
|
SICON in varchar2 := null, -- Иконка (код шрифта "Google Material Icons" - https://fonts.google.com/icons?icon.set=Material+Icons)
|
||||||
|
SSTATE in varchar2 := SINDICATOR_STATE_UNDEFINED, -- Состояние (см. константы SINDICATOR_STATE_*)
|
||||||
|
BSQUARE in boolean := false, -- Скруглять углы
|
||||||
|
NELEVATION in number := 3, -- Высота парения (от 0 до 24, игнорируется для SINDICATOR_VARIANT_OUTLINED)
|
||||||
|
SVARIANT in varchar2 := SINDICATOR_VARIANT_ELEVATION, -- Вариант исполнения (см. константы SINDICATOR_VARIANT_*)
|
||||||
|
SHINT in varchar2 := null, -- Подсказка
|
||||||
|
SBACKGROUND_COLOR in varchar2 := null, -- Цвет заливки (HTML-код, null - использовать цвет по умолчанию для состояния)
|
||||||
|
SCOLOR in varchar2 := null -- Цвет шрифта и иконки (HTML-код, null - использовать цвет по умолчанию для состояния)
|
||||||
|
) return TINDICATOR -- Результат работы
|
||||||
|
is
|
||||||
|
RRES TINDICATOR; -- Буфер для результата
|
||||||
|
begin
|
||||||
|
/* Проверим параметры */
|
||||||
|
if ((SSTATE is not null) and
|
||||||
|
(SSTATE not in (SINDICATOR_STATE_UNDEFINED, SINDICATOR_STATE_OK, SINDICATOR_STATE_ERR, SINDICATOR_STATE_WARN))) then
|
||||||
|
P_EXCEPTION(0, 'Некорректно указано значение "Состояние".');
|
||||||
|
end if;
|
||||||
|
if ((NELEVATION is not null) and ((NELEVATION <> TRUNC(NELEVATION)) or (NELEVATION < 0) or (NELEVATION > 24))) then
|
||||||
|
P_EXCEPTION(0,
|
||||||
|
'Некорректно указано значение "Высота парения" (ожидается целое число от 0 до 24).');
|
||||||
|
end if;
|
||||||
|
if ((SVARIANT is not null) and (SVARIANT not in (SINDICATOR_VARIANT_ELEVATION, SINDICATOR_VARIANT_OUTLINED))) then
|
||||||
|
P_EXCEPTION(0, 'Некорректно указано значение "Вариант исполнения".');
|
||||||
|
end if;
|
||||||
|
/* Формируем объект */
|
||||||
|
RRES.SCAPTION := SCAPTION;
|
||||||
|
RRES.SVALUE := SVALUE;
|
||||||
|
RRES.SICON := SICON;
|
||||||
|
RRES.SSTATE := COALESCE(SSTATE, SINDICATOR_STATE_UNDEFINED);
|
||||||
|
RRES.BSQUARE := BSQUARE;
|
||||||
|
RRES.NELEVATION := COALESCE(NELEVATION, 3);
|
||||||
|
RRES.SVARIANT := COALESCE(SVARIANT, SINDICATOR_VARIANT_ELEVATION);
|
||||||
|
RRES.SHINT := SHINT;
|
||||||
|
RRES.SBACKGROUND_COLOR := SBACKGROUND_COLOR;
|
||||||
|
RRES.SCOLOR := SCOLOR;
|
||||||
|
/* Возвращаем результат */
|
||||||
|
return RRES;
|
||||||
|
end TINDICATOR_MAKE;
|
||||||
|
|
||||||
|
/* Сериализация индикатора */
|
||||||
|
function TINDICATOR_TO_XML
|
||||||
|
(
|
||||||
|
RINDICATOR in TINDICATOR -- Описание индикатора
|
||||||
|
) return clob -- XML-описание
|
||||||
|
is
|
||||||
|
CRES clob; -- Буфер для результата
|
||||||
|
begin
|
||||||
|
/* Начинаем формирование XML */
|
||||||
|
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
|
||||||
|
/* Открываем корень */
|
||||||
|
PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XDATA);
|
||||||
|
/* Открываем индикатор */
|
||||||
|
PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XINDICATOR);
|
||||||
|
/* Формируем атрибуты */
|
||||||
|
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_CAPTION, SVALUE => RINDICATOR.SCAPTION);
|
||||||
|
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_VALUE, SVALUE => RINDICATOR.SVALUE);
|
||||||
|
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_ICON, SVALUE => RINDICATOR.SICON);
|
||||||
|
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_STATE, SVALUE => RINDICATOR.SSTATE);
|
||||||
|
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_SQUARE, BVALUE => RINDICATOR.BSQUARE);
|
||||||
|
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_ELEVATION, NVALUE => RINDICATOR.NELEVATION);
|
||||||
|
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_VARIANT, SVALUE => RINDICATOR.SVARIANT);
|
||||||
|
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_HINT, SVALUE => RINDICATOR.SHINT);
|
||||||
|
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_BG_COLOR, SVALUE => RINDICATOR.SBACKGROUND_COLOR);
|
||||||
|
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_COLOR, SVALUE => RINDICATOR.SCOLOR);
|
||||||
|
/* Закрываем индикатор */
|
||||||
|
PKG_XFAST.UP();
|
||||||
|
/* Закрываем корень */
|
||||||
|
PKG_XFAST.UP();
|
||||||
|
/* Сериализуем */
|
||||||
|
CRES := PKG_XFAST.SERIALIZE_TO_CLOB();
|
||||||
|
/* Завершаем формирование XML */
|
||||||
|
PKG_XFAST.EPILOGUE();
|
||||||
|
/* Возвращаем полученное */
|
||||||
|
return CRES;
|
||||||
|
exception
|
||||||
|
when others then
|
||||||
|
/* Завершаем формирование XML */
|
||||||
|
PKG_XFAST.EPILOGUE();
|
||||||
|
/* Вернем ошибку */
|
||||||
|
PKG_STATE.DIAGNOSTICS_STACKED();
|
||||||
|
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
|
||||||
|
end TINDICATOR_TO_XML;
|
||||||
|
|
||||||
end PKG_P8PANELS_VISUAL;
|
end PKG_P8PANELS_VISUAL;
|
||||||
/
|
/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user