From 416eae7d8897d354cb3b116f5cd7dde0e4ff82c9 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Wed, 11 Jun 2025 22:01:54 +0300 Subject: [PATCH] =?UTF-8?q?WEBAPP+=D0=91=D0=94:=20=D0=9D=D0=BE=D0=B2=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=20-=20P8PIndicator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/p8p_indicator.js | 186 ++++++++++++++++++ db/PKG_P8PANELS_VISUAL.pck | 327 +++++++++++++++++++++++--------- 2 files changed, 421 insertions(+), 92 deletions(-) create mode 100644 app/components/p8p_indicator.js 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; /