diff --git a/app/components/p8p_indicator.js b/app/components/p8p_indicator.js
new file mode 100644
index 0000000..0f19f9f
--- /dev/null
+++ b/app/components/p8p_indicator.js
@@ -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 = {[undefined, null, ""].includes(value) ? TEXTS.NO_DATA_FOUND_SHORT : value};
+
+ //Представление текста подписи индикатора
+ const captionView = (
+
+ {caption}
+
+ );
+
+ //Представление подписи индикатора
+ const valueView = hint ? (
+ <>
+ {showHint && }
+
+ {valueTextView}
+
+ help_outline
+
+
+ >
+ ) : (
+ valueTextView
+ );
+
+ //Флаг активности индикатора
+ const clickable = onClick ? true : false;
+
+ //Представление
+ return (
+
+
+
+ {valueView}
+ {captionView}
+
+ {icon ? {icon} : null}
+
+
+ );
+};
+
+//Контроль свойств - Индикатор
+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 };
diff --git a/db/PKG_P8PANELS_VISUAL.pck b/db/PKG_P8PANELS_VISUAL.pck
index 0c86f8c..3b660e4 100644
--- a/db/PKG_P8PANELS_VISUAL.pck
+++ b/db/PKG_P8PANELS_VISUAL.pck
@@ -1,46 +1,56 @@
create or replace package PKG_P8PANELS_VISUAL as
/* Константы - типы данных */
- SDATA_TYPE_STR constant PKG_STD.TSTRING := 'STR'; -- Тип данных "строка"
- SDATA_TYPE_NUMB constant PKG_STD.TSTRING := 'NUMB'; -- Тип данных "число"
- SDATA_TYPE_DATE constant PKG_STD.TSTRING := 'DATE'; -- Тип данных "дата"
+ SDATA_TYPE_STR constant PKG_STD.TSTRING := 'STR'; -- Тип данных "строка"
+ SDATA_TYPE_NUMB constant PKG_STD.TSTRING := 'NUMB'; -- Тип данных "число"
+ SDATA_TYPE_DATE constant PKG_STD.TSTRING := 'DATE'; -- Тип данных "дата"
/* Константы - направление сортировки */
- SORDER_DIRECTION_ASC constant PKG_STD.TSTRING := 'ASC'; -- По возрастанию
- SORDER_DIRECTION_DESC constant PKG_STD.TSTRING := 'DESC'; -- По убыванию
+ SORDER_DIRECTION_ASC constant PKG_STD.TSTRING := 'ASC'; -- По возрастанию
+ SORDER_DIRECTION_DESC constant PKG_STD.TSTRING := 'DESC'; -- По убыванию
- /* Константы - масштаб диаграммы Ганта */
- NGANTT_ZOOM_QUARTER_DAY constant PKG_STD.TNUMBER := 0; -- Четверть дня
- NGANTT_ZOOM_HALF_DAY constant PKG_STD.TNUMBER := 1; -- Пол дня
- NGANTT_ZOOM_DAY constant PKG_STD.TNUMBER := 2; -- День
- NGANTT_ZOOM_WEEK constant PKG_STD.TNUMBER := 3; -- Неделя
- NGANTT_ZOOM_MONTH constant PKG_STD.TNUMBER := 4; -- Месяц
+ /* Константы - диаграмма Ганта - масштаб */
+ NGANTT_ZOOM_QUARTER_DAY constant PKG_STD.TNUMBER := 0; -- Четверть дня
+ NGANTT_ZOOM_HALF_DAY constant PKG_STD.TNUMBER := 1; -- Пол дня
+ NGANTT_ZOOM_DAY constant PKG_STD.TNUMBER := 2; -- День
+ NGANTT_ZOOM_WEEK constant PKG_STD.TNUMBER := 3; -- Неделя
+ NGANTT_ZOOM_MONTH constant PKG_STD.TNUMBER := 4; -- Месяц
- /* Константы - масштаб циклограммы */
- NCYCLOGRAM_ZOOM_MIN constant PKG_STD.TLNUMBER := 0.2; -- Минимальный (0.2 от исходного)
- NCYCLOGRAM_ZOOM_TINY constant PKG_STD.TLNUMBER := 0.4; -- Мелкий (0.4 от исходного)
- NCYCLOGRAM_ZOOM_SMALL constant PKG_STD.TLNUMBER := 0.7; -- Уменьшенный (0.7 от исходного)
- NCYCLOGRAM_ZOOM_DEFAULT constant PKG_STD.TLNUMBER := 1; -- Исходный
- NCYCLOGRAM_ZOOM_LARGE constant PKG_STD.TLNUMBER := 1.5; -- Увеличенный (1.5 от исходного)
- NCYCLOGRAM_ZOOM_HUGE constant PKG_STD.TLNUMBER := 2; -- Большой (2 от исходного)
- 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_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'; -- Внизу
+ /* Константы - график - расположение легенды */
+ 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_TINY constant PKG_STD.TLNUMBER := 0.4; -- Мелкий (0.4 от исходного)
+ NCYCLOGRAM_ZOOM_SMALL constant PKG_STD.TLNUMBER := 0.7; -- Уменьшенный (0.7 от исходного)
+ NCYCLOGRAM_ZOOM_DEFAULT constant PKG_STD.TLNUMBER := 1; -- Исходный
+ NCYCLOGRAM_ZOOM_LARGE constant PKG_STD.TLNUMBER := 1.5; -- Увеличенный (1.5 от исходного)
+ NCYCLOGRAM_ZOOM_HUGE constant PKG_STD.TLNUMBER := 2; -- Большой (2 от исходного)
+ NCYCLOGRAM_ZOOM_MAX constant PKG_STD.TLNUMBER := 2.5; -- Максимальный (2.5 от исходного)
- /* Константы - циклограмма */
- NCYCLOGRAM_GROUP_DEF_WIDTH constant PKG_STD.TNUMBER := 100; -- Высота заголовка группы (по умолчанию)
- NCYCLOGRAM_GROUP_DEF_HEIGHT constant PKG_STD.TNUMBER := 42; -- Ширина заголовка группы (по умолчанию)
- NCYCLOGRAM_LINE_HEIGHT constant PKG_STD.TNUMBER := 20; -- Высота строк циклограммы
+ /* Константы - циклограмма - оформление */
+ NCYCLOGRAM_GROUP_DEF_WIDTH constant PKG_STD.TNUMBER := 100; -- Высота заголовка группы (по умолчанию)
+ NCYCLOGRAM_GROUP_DEF_HEIGHT constant PKG_STD.TNUMBER := 42; -- Ширина заголовка группы (по умолчанию)
+ 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
@@ -333,6 +343,21 @@ create or replace package PKG_P8PANELS_VISUAL as
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
(
@@ -750,62 +775,92 @@ create or replace package PKG_P8PANELS_VISUAL as
NINCLUDE_DEF in number := 1 -- Включить описание колонок (0 - нет, 1 - да)
) 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;
/
create or replace package body PKG_P8PANELS_VISUAL as
/* Константы - тэги запросов */
- SRQ_TAG_XROOT constant PKG_STD.TSTRING := 'XROOT'; -- Тэг для корня данных запроса
- SRQ_TAG_XFILTERS constant PKG_STD.TSTRING := 'filters'; -- Тэг для строк данных
- SRQ_TAG_XORDERS constant PKG_STD.TSTRING := 'orders'; -- Тэг для описания колонок
- SRQ_TAG_SNAME constant PKG_STD.TSTRING := 'name'; -- Тэг для наименования
- SRQ_TAG_SDIRECTION constant PKG_STD.TSTRING := 'direction'; -- Тэг для направления
- SRQ_TAG_SFROM constant PKG_STD.TSTRING := 'from'; -- Тэг для значения "с"
- SRQ_TAG_STO constant PKG_STD.TSTRING := 'to'; -- Тэг для значения "по"
+ SRQ_TAG_XROOT constant PKG_STD.TSTRING := 'XROOT'; -- Тэг для корня данных запроса
+ SRQ_TAG_XFILTERS constant PKG_STD.TSTRING := 'filters'; -- Тэг для строк данных
+ SRQ_TAG_XORDERS constant PKG_STD.TSTRING := 'orders'; -- Тэг для описания колонок
+ SRQ_TAG_SNAME constant PKG_STD.TSTRING := 'name'; -- Тэг для наименования
+ SRQ_TAG_SDIRECTION constant PKG_STD.TSTRING := 'direction'; -- Тэг для направления
+ SRQ_TAG_SFROM constant PKG_STD.TSTRING := 'from'; -- Тэг для значения "с"
+ SRQ_TAG_STO constant PKG_STD.TSTRING := 'to'; -- Тэг для значения "по"
/* Константы - тэги ответов */
- SRESP_TAG_XDATA constant PKG_STD.TSTRING := 'XDATA'; -- Тэг для корня описания данных
- SRESP_TAG_XCHART constant PKG_STD.TSTRING := 'XCHART'; -- Тэг для описания графика
- SRESP_TAG_XDATA_GRID constant PKG_STD.TSTRING := 'XDATA_GRID'; -- Тэг для описания таблицы данных
- SRESP_TAG_XCYCLOGRAM constant PKG_STD.TSTRING := 'XCYCLOGRAM'; -- Тэг для описания циклограммы
- SRESP_TAG_XGANTT constant PKG_STD.TSTRING := 'XGANTT'; -- Тэг для описания диаграммы Ганта
+ SRESP_TAG_XDATA constant PKG_STD.TSTRING := 'XDATA'; -- Тэг для корня описания данных
+ SRESP_TAG_XCHART constant PKG_STD.TSTRING := 'XCHART'; -- Тэг для описания графика
+ SRESP_TAG_XDATA_GRID constant PKG_STD.TSTRING := 'XDATA_GRID'; -- Тэг для описания таблицы данных
+ SRESP_TAG_XCYCLOGRAM constant PKG_STD.TSTRING := 'XCYCLOGRAM'; -- Тэг для описания циклограммы
+ 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_CAPTION constant PKG_STD.TSTRING := 'caption'; -- Атрибут для подписи
- SRESP_ATTR_DATA_TYPE constant PKG_STD.TSTRING := 'dataType'; -- Атрибут для типа данных
- SRESP_ATTR_VISIBLE constant PKG_STD.TSTRING := 'visible'; -- Атрибут для флага видимости
- SRESP_ATTR_TITLE constant PKG_STD.TSTRING := 'title'; -- Атрибут для заголовка
- SRESP_ATTR_ZOOM constant PKG_STD.TSTRING := 'zoom'; -- Атрибут для масштаба
- SRESP_ATTR_ID constant PKG_STD.TSTRING := 'id'; -- Атрибут для идентификатора
- SRESP_ATTR_START constant PKG_STD.TSTRING := 'start'; -- Атрибут для даты начала
- SRESP_ATTR_END constant PKG_STD.TSTRING := 'end'; -- Атрибут для даты окончания
- SRESP_ATTR_RN constant PKG_STD.TSTRING := 'rn'; -- Атрибут для рег. номера
- SRESP_ATTR_NUMB constant PKG_STD.TSTRING := 'numb'; -- Атрибут для номера
- SRESP_ATTR_FULL_NAME constant PKG_STD.TSTRING := 'fullName'; -- Атрибут для полного наименования
- SRESP_ATTR_DESC constant PKG_STD.TSTRING := 'desc'; -- Атрибут для описания
- SRESP_ATTR_TYPE constant PKG_STD.TSTRING := 'type'; -- Атрибут для типа
- SRESP_ATTR_HINT constant PKG_STD.TSTRING := 'hint'; -- Атрибут для подсказки
- SRESP_ATTR_GROUP_NAME constant PKG_STD.TSTRING := 'groupName'; -- Атрибут для наименования группы
- SRESP_ATTR_PARENT constant PKG_STD.TSTRING := 'parent'; -- Атрибут для ссылки на родителя
- SRESP_ATTR_EXPANDABLE constant PKG_STD.TSTRING := 'expandable'; -- Атрибут для доступности действия сокрытия/отображения
- SRESP_ATTR_EXPANDED constant PKG_STD.TSTRING := 'expanded'; -- Атрибут для флага сокрытия/отображения
- SRESP_ATTR_FIXED_HEADER constant PKG_STD.TSTRING := 'fixedHeader'; -- Атрибут для флага фиксации заголовка
- SRESP_ATTR_FIXED_COLUMNS constant PKG_STD.TSTRING := 'fixedColumns'; -- Атрибут для количества фиксированных колонок
- SRESP_ATTR_WIDTH constant PKG_STD.TSTRING := 'width'; -- Атрибут для ширины
- SRESP_ATTR_HEIGHT constant PKG_STD.TSTRING := 'height'; -- Атрибут для высоты
- SRESP_ATTR_COLUMNS constant PKG_STD.TSTRING := 'columns'; -- Атрибут для колонок
- SRESP_ATTR_TASKS constant PKG_STD.TSTRING := 'tasks'; -- Атрибут для задач
- SRESP_ATTR_HL_COLOR constant PKG_STD.TSTRING := 'highlightColor'; -- Атрибут для цвета подсветки
- SRESP_ATTR_ZOOM_BAR constant PKG_STD.TSTRING := 'zoomBar'; -- Атрибут для флага отображения панели масштаба
- SRESP_ATTR_ROWS constant PKG_STD.TSTRING := 'rows'; -- Атрибут для строк данных
- SRESP_ATTR_COLUMNS_DEF constant PKG_STD.TSTRING := 'columnsDef'; -- Атрибут для описания колонок
- SRESP_ATTR_GROUPS constant PKG_STD.TSTRING := 'groups'; -- Атрибут для описания групп
+ SRESP_ATTR_NAME constant PKG_STD.TSTRING := 'name'; -- Атрибут для наименования
+ SRESP_ATTR_CAPTION constant PKG_STD.TSTRING := 'caption'; -- Атрибут для подписи
+ SRESP_ATTR_DATA_TYPE constant PKG_STD.TSTRING := 'dataType'; -- Атрибут для типа данных
+ SRESP_ATTR_VISIBLE constant PKG_STD.TSTRING := 'visible'; -- Атрибут для флага видимости
+ SRESP_ATTR_TITLE constant PKG_STD.TSTRING := 'title'; -- Атрибут для заголовка
+ SRESP_ATTR_ZOOM constant PKG_STD.TSTRING := 'zoom'; -- Атрибут для масштаба
+ SRESP_ATTR_ID constant PKG_STD.TSTRING := 'id'; -- Атрибут для идентификатора
+ SRESP_ATTR_START constant PKG_STD.TSTRING := 'start'; -- Атрибут для даты начала
+ SRESP_ATTR_END constant PKG_STD.TSTRING := 'end'; -- Атрибут для даты окончания
+ SRESP_ATTR_RN constant PKG_STD.TSTRING := 'rn'; -- Атрибут для рег. номера
+ SRESP_ATTR_NUMB constant PKG_STD.TSTRING := 'numb'; -- Атрибут для номера
+ SRESP_ATTR_FULL_NAME constant PKG_STD.TSTRING := 'fullName'; -- Атрибут для полного наименования
+ SRESP_ATTR_DESC constant PKG_STD.TSTRING := 'desc'; -- Атрибут для описания
+ SRESP_ATTR_TYPE constant PKG_STD.TSTRING := 'type'; -- Атрибут для типа
+ SRESP_ATTR_HINT constant PKG_STD.TSTRING := 'hint'; -- Атрибут для подсказки
+ SRESP_ATTR_GROUP_NAME constant PKG_STD.TSTRING := 'groupName'; -- Атрибут для наименования группы
+ SRESP_ATTR_PARENT constant PKG_STD.TSTRING := 'parent'; -- Атрибут для ссылки на родителя
+ SRESP_ATTR_EXPANDABLE constant PKG_STD.TSTRING := 'expandable'; -- Атрибут для доступности действия сокрытия/отображения
+ SRESP_ATTR_EXPANDED constant PKG_STD.TSTRING := 'expanded'; -- Атрибут для флага сокрытия/отображения
+ SRESP_ATTR_FIXED_HEADER constant PKG_STD.TSTRING := 'fixedHeader'; -- Атрибут для флага фиксации заголовка
+ SRESP_ATTR_FIXED_COLUMNS constant PKG_STD.TSTRING := 'fixedColumns'; -- Атрибут для количества фиксированных колонок
+ SRESP_ATTR_WIDTH constant PKG_STD.TSTRING := 'width'; -- Атрибут для ширины
+ SRESP_ATTR_HEIGHT constant PKG_STD.TSTRING := 'height'; -- Атрибут для высоты
+ SRESP_ATTR_COLUMNS constant PKG_STD.TSTRING := 'columns'; -- Атрибут для колонок
+ SRESP_ATTR_TASKS constant PKG_STD.TSTRING := 'tasks'; -- Атрибут для задач
+ SRESP_ATTR_HL_COLOR constant PKG_STD.TSTRING := 'highlightColor'; -- Атрибут для цвета подсветки
+ SRESP_ATTR_ZOOM_BAR constant PKG_STD.TSTRING := 'zoomBar'; -- Атрибут для флага отображения панели масштаба
+ SRESP_ATTR_ROWS constant PKG_STD.TSTRING := 'rows'; -- Атрибут для строк данных
+ SRESP_ATTR_COLUMNS_DEF constant PKG_STD.TSTRING := 'columnsDef'; -- Атрибут для описания колонок
+ 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_FILTER constant PKG_STD.TSTRING := 'filter'; -- Атрибут для флага отбора
- SRESP_ATTR_DT_COLUMN_VALUES constant PKG_STD.TSTRING := 'values'; -- Атрибут для предопределённых значений
+ SRESP_ATTR_DT_ORDER constant PKG_STD.TSTRING := 'order'; -- Атрибут для флага сортировки
+ SRESP_ATTR_DT_FILTER constant PKG_STD.TSTRING := 'filter'; -- Атрибут для флага отбора
+ SRESP_ATTR_DT_COLUMN_VALUES constant PKG_STD.TSTRING := 'values'; -- Атрибут для предопределённых значений
/* Константы - атрибуты ответов (диаграмма Ганта) */
SRESP_ATTR_TASK_PROGRESS constant PKG_STD.TSTRING := 'progress'; -- Атрибут для прогресса задачи
@@ -820,23 +875,23 @@ create or replace package body PKG_P8PANELS_VISUAL as
SRESP_ATTR_TASK_COLORS constant PKG_STD.TSTRING := 'taskColors'; -- Атрибут для коллекции цветов задачи
/* Константы - атрибуты ответов (графики) */
- SRESP_ATTR_CHART_LGND_POS constant PKG_STD.TSTRING := 'legendPosition'; -- Атрибут для места размешения легенды графика
- SRESP_ATTR_CHART_LABELS constant PKG_STD.TSTRING := 'labels'; -- Атрибут для меток графика
- SRESP_ATTR_CHART_DATASETS constant PKG_STD.TSTRING := 'datasets'; -- Атрибут для наборов данных графика
- SRESP_ATTR_CHART_DS_LABEL constant PKG_STD.TSTRING := 'label'; -- Атрибут для метки набора данных графика
- SRESP_ATTR_CHART_DS_BR_CLR constant PKG_STD.TSTRING := 'borderColor'; -- Атрибут для цвета границы элемента набора данных графика
- SRESP_ATTR_CHART_DS_BG_CLR constant PKG_STD.TSTRING := 'backgroundColor'; -- Атрибут для цвета заливки элемента набора данных графика
- SRESP_ATTR_CHART_DS_DATA constant PKG_STD.TSTRING := 'data'; -- Атрибут для коллекции значений элементов набора данных
- SRESP_ATTR_CHART_DS_ITEMS constant PKG_STD.TSTRING := 'items'; -- Атрибут для коллекции элементов набора данных
- SRESP_ATTR_CHART_DS_I_VAL constant PKG_STD.TSTRING := 'value'; -- Атрибут для значения элемента набора данных
+ SRESP_ATTR_CHART_LGND_POS constant PKG_STD.TSTRING := 'legendPosition'; -- Атрибут для места размешения легенды графика
+ SRESP_ATTR_CHART_LABELS constant PKG_STD.TSTRING := 'labels'; -- Атрибут для меток графика
+ SRESP_ATTR_CHART_DATASETS constant PKG_STD.TSTRING := 'datasets'; -- Атрибут для наборов данных графика
+ SRESP_ATTR_CHART_DS_LABEL constant PKG_STD.TSTRING := 'label'; -- Атрибут для метки набора данных графика
+ SRESP_ATTR_CHART_DS_BR_CLR constant PKG_STD.TSTRING := 'borderColor'; -- Атрибут для цвета границы элемента набора данных графика
+ SRESP_ATTR_CHART_DS_BG_CLR constant PKG_STD.TSTRING := 'backgroundColor'; -- Атрибут для цвета заливки элемента набора данных графика
+ SRESP_ATTR_CHART_DS_DATA constant PKG_STD.TSTRING := 'data'; -- Атрибут для коллекции значений элементов набора данных
+ SRESP_ATTR_CHART_DS_ITEMS constant PKG_STD.TSTRING := 'items'; -- Атрибут для коллекции элементов набора данных
+ SRESP_ATTR_CHART_DS_I_VAL constant PKG_STD.TSTRING := 'value'; -- Атрибут для значения элемента набора данных
/* Константы - атрибуты ответов (циклограмма) */
- SRESP_ATTR_CG_TASK_LINE constant PKG_STD.TSTRING := 'lineNumb'; -- Атрибут для номера строки (по оси Y)
- SRESP_ATTR_CG_LINE_HEIGHT constant PKG_STD.TSTRING := 'lineHeight'; -- Атрибут для высоты строк
+ SRESP_ATTR_CG_TASK_LINE constant PKG_STD.TSTRING := 'lineNumb'; -- Атрибут для номера строки (по оси Y)
+ SRESP_ATTR_CG_LINE_HEIGHT constant PKG_STD.TSTRING := 'lineHeight'; -- Атрибут для высоты строк
/* Константы - параметры условий отбора */
- SCOND_FROM_POSTFIX constant PKG_STD.TSTRING := 'From'; -- Постфикс наименования нижней границы условия отбора
- SCOND_TO_POSTFIX constant PKG_STD.TSTRING := 'To'; -- Постфикс наименования верхней границы условия отбора
+ SCOND_FROM_POSTFIX constant PKG_STD.TSTRING := 'From'; -- Постфикс наименования нижней границы условия отбора
+ SCOND_TO_POSTFIX constant PKG_STD.TSTRING := 'To'; -- Постфикс наименования верхней границы условия отбора
/* Расчет диапаона выдаваемых записей */
procedure UTL_ROWS_LIMITS_CALC
@@ -3069,5 +3124,93 @@ create or replace package body PKG_P8PANELS_VISUAL as
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
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;
/