From afb72e475b4f4381f495d2b451212fb96176cba9 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Sat, 3 Feb 2024 01:22:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=91=D0=94:=20P8PGantt=20-=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=B0=20=D0=B7=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B2=D0=BA=D0=B8=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B5?= =?UTF-8?q?=D1=81=D1=81=D0=B0,=20P8PDataGrif=20-=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=B0=20=D1=81=D0=BB=D0=BE=D0=B6?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D0=B7=D0=B0=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=BE=D0=B2=20=D1=81=20=D0=B3=D1=80=D1=83=D0=BF=D0=BF?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8,=20=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20=D1=81=D1=82=D1=80=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/PKG_P8PANELS_VISUAL.pck | 334 ++++++++++++++++++++++++++++--------- 1 file changed, 254 insertions(+), 80 deletions(-) diff --git a/db/PKG_P8PANELS_VISUAL.pck b/db/PKG_P8PANELS_VISUAL.pck index 46f42c6..67c1f1b 100644 --- a/db/PKG_P8PANELS_VISUAL.pck +++ b/db/PKG_P8PANELS_VISUAL.pck @@ -51,7 +51,10 @@ create or replace package PKG_P8PANELS_VISUAL as BORDER boolean, -- Разрешить сортировку BFILTER boolean, -- Разрешить отбор RCOL_VALS TCOL_VALS, -- Предопределённые значения - SHINT PKG_STD.TSTRING -- Текст всплывающей подсказки + SHINT PKG_STD.TSTRING, -- Текст всплывающей подсказки + SPARENT PKG_STD.TSTRING, -- Наименование родительской колонки + BEXPANDABLE boolean, -- Разрешить сокрытие/отображение дочерних колонок + BEXPANDED boolean -- Отобразить/скрыть дочерние колонки ); /* Типы данных - коллекция описателей колонок таблицы данных */ @@ -70,16 +73,30 @@ create or replace package PKG_P8PANELS_VISUAL as /* Типы данных - строка */ type TROW is record ( - RCOLS TCOLS -- Колонки + SGROUP PKG_STD.TSTRING, -- Наименование группы + RCOLS TCOLS -- Колонки ); /* Типы данных - коллекция строк */ type TROWS is table of TROW; + + /* Типы данных - группа */ + type TGROUP is record + ( + SNAME PKG_STD.TSTRING, -- Наименование + SCAPTION PKG_STD.TSTRING, -- Заголовок + BEXPANDABLE boolean, -- Разрешить сокрытие/отображение дочерних + BEXPANDED boolean -- Отобразить/скрыть дочерние + ); + + /* Типы данных - коллекция групп */ + type TGROUPS is table of TGROUP; /* Типы данных - таблица данных */ type TDATA_GRID is record ( RCOL_DEFS TCOL_DEFS, -- Описание колонок + RGROUPS TGROUPS, -- Описание групп RROWS TROWS -- Данные строк ); @@ -139,6 +156,7 @@ create or replace package PKG_P8PANELS_VISUAL as NPROGRESS PKG_STD.TNUMBER := null, -- Прогресс (% готовности) задачи (null - не определен) SBG_COLOR PKG_STD.TSTRING := null, -- Цвет заливки задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA) STEXT_COLOR PKG_STD.TSTRING := null, -- Цвет текста заголовка задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA) + SBG_PROGRESS_COLOR PKG_STD.TSTRING := null, -- Цвет заливки прогресса (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA) BREAD_ONLY boolean := null, -- Сроки и прогресс задачи только для чтения (null - как указано в описании диаграммы) BREAD_ONLY_DATES boolean := null, -- Сроки задачи только для чтения (null - как указано в описании диаграммы) BREAD_ONLY_PROGRESS boolean := null, -- Прогресс задачи только для чтения (null - как указано в описании диаграммы) @@ -154,6 +172,7 @@ create or replace package PKG_P8PANELS_VISUAL as ( SBG_COLOR PKG_STD.TSTRING := null, -- Цвет заливки задачи (формат - HTML-цвет, #RRGGBBAA) STEXT_COLOR PKG_STD.TSTRING := null, -- Цвет текста заголовка задачи (формат - HTML-цвет, #RRGGBBAA) + SBG_PROGRESS_COLOR PKG_STD.TSTRING := null, -- Цвет заливки прогресса (формат - HTML-цвет, #RRGGBBAA) SDESC PKG_STD.TSTRING -- Описание ); @@ -252,7 +271,9 @@ create or replace package PKG_P8PANELS_VISUAL as /* Формирование строки */ function TROW_MAKE - return TROW; -- Результат работы + ( + SGROUP in varchar2 := null -- Наименование группы + ) return TROW; -- Результат работы /* Добавление колонки к строке */ procedure TROW_ADD_COL @@ -319,10 +340,24 @@ create or replace package PKG_P8PANELS_VISUAL as BORDER in boolean := false, -- Разрешить сортировку по колонке BFILTER in boolean := false, -- Разрешить отбор по колонке RCOL_VALS in TCOL_VALS := null, -- Предопределённые значения колонки - SHINT in varchar2 := null, -- Текст всплывающей подсказки + SHINT in varchar2 := null, -- Текст всплывающей подсказки + SPARENT in varchar2 := null, -- Наименование родительской колонки + BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних колонок + BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние колонки BCLEAR in boolean := false -- Флаг очистки коллекции описаний колонок таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением) ); + /* Добавление описания группы к таблице данных */ + procedure TDATA_GRID_ADD_GROUP + ( + RDATA_GRID in out nocopy TDATA_GRID, -- Описание таблицы данных + SNAME in varchar2, -- Наименование группы + SCAPTION in varchar2, -- Заголовок группы + BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних + BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние + BCLEAR in boolean := false -- Флаг очистки коллекции описаний групп таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением) + ); + /* Добавление описания колонки к таблице данных */ procedure TDATA_GRID_ADD_ROW ( @@ -407,6 +442,7 @@ create or replace package PKG_P8PANELS_VISUAL as NPROGRESS in number := null, -- Прогресс (% готовности) задачи (null - не определен) SBG_COLOR in varchar2 := null, -- Цвет заливки задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA) STEXT_COLOR in varchar2 := null, -- Цвет текста заголовка задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA) + SBG_PROGRESS_COLOR in varchar2 := null, -- Цвет заливки прогресса (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA) BREAD_ONLY in boolean := null, -- Сроки и прогресс задачи только для чтения (null - как указано в описании диаграммы) BREAD_ONLY_DATES in boolean := null, -- Сроки задачи только для чтения (null - как указано в описании диаграммы) BREAD_ONLY_PROGRESS in boolean := null -- Прогресс задачи только для чтения (null - как указано в описании диаграммы) @@ -456,6 +492,7 @@ create or replace package PKG_P8PANELS_VISUAL as RGANTT in out nocopy TGANTT, -- Описание диаграммы Ганта SBG_COLOR in varchar2 := null, -- Цвет заливки задачи (формат - HTML-цвет, #RRGGBBAA) STEXT_COLOR in varchar2 := null, -- Цвет текста заголовка задачи (формат - HTML-цвет, #RRGGBBAA) + SBG_PROGRESS_COLOR in varchar2 := null, -- Цвет заливки прогресса (формат - HTML-цвет, #RRGGBBAA) SDESC in varchar2, -- Описание BCLEAR in boolean := false -- Флаг очистки коллекции цветов (false - не очищать, true - очистить коллекцию перед добавлением) ); @@ -549,29 +586,34 @@ text="Формат data_grid и gant как в chart" SRQ_TAG_STO constant PKG_STD.TSTRING := 'to'; -- Тэг для значения "по" /* Константы - тэги ответов */ - SRESP_TAG_XDATA constant PKG_STD.TSTRING := 'XDATA'; -- Тэг для корня описания данных - SRESP_TAG_XROWS constant PKG_STD.TSTRING := 'XROWS'; -- Тэг для строк данных - SRESP_TAG_XCOLUMNS_DEF constant PKG_STD.TSTRING := 'XCOLUMNS_DEF'; -- Тэг для описания колонок - SRESP_TAG_XGANTT_DEF constant PKG_STD.TSTRING := 'XGANTT_DEF'; -- Тэг для описания заголовка диаграммы Ганта - SRESP_TAG_XGANTT_TASKS constant PKG_STD.TSTRING := 'XGANTT_TASKS'; -- Тэг для описания коллекции задач диаграммы Ганта - SRESP_TAG_XCHART constant PKG_STD.TSTRING := 'XCHART'; -- Тэг для описания графика + SRESP_TAG_XDATA constant PKG_STD.TSTRING := 'XDATA'; -- Тэг для корня описания данных + SRESP_TAG_XROWS constant PKG_STD.TSTRING := 'XROWS'; -- Тэг для строк данных + SRESP_TAG_XCOLUMNS_DEF constant PKG_STD.TSTRING := 'XCOLUMNS_DEF'; -- Тэг для описания колонок + SRESP_TAG_XGROUPS constant PKG_STD.TSTRING := 'XGROUPS'; -- Тэг для описания групп + SRESP_TAG_XGANTT_DEF constant PKG_STD.TSTRING := 'XGANTT_DEF'; -- Тэг для описания заголовка диаграммы Ганта + SRESP_TAG_XGANTT_TASKS constant PKG_STD.TSTRING := 'XGANTT_TASKS'; -- Тэг для описания коллекции задач диаграммы Ганта + SRESP_TAG_XCHART constant PKG_STD.TSTRING := 'XCHART'; -- Тэг для описания графика /* Константы - атрибуты ответов (универсальные) */ - 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_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_DT_ORDER constant PKG_STD.TSTRING := 'order'; -- Атрибут для флага сортировки @@ -579,16 +621,17 @@ text="Формат data_grid и gant как в chart" SRESP_ATTR_DT_COLUMN_VALUES constant PKG_STD.TSTRING := 'values'; -- Атрибут для предопределённых значений /* Константы - атрибуты ответов (диаграмма Ганта) */ - SRESP_ATTR_GANTT_ZOOM_BAR constant PKG_STD.TSTRING := 'zoomBar'; -- Атрибут для флага отображения панели масштаба диаграммы Ганта - SRESP_ATTR_TASK_PROGRESS constant PKG_STD.TSTRING := 'progress'; -- Атрибут для прогресса задачи - SRESP_ATTR_TASK_DEPS constant PKG_STD.TSTRING := 'dependencies'; -- Атрибут для зависимостей задачи - SRESP_ATTR_TASK_RO constant PKG_STD.TSTRING := 'readOnly'; -- Атрибут для флага задачи "только для чтения" - SRESP_ATTR_TASK_RO_PRGRS constant PKG_STD.TSTRING := 'readOnlyProgress'; -- Атрибут для флага задачи "прогресс только для чтения" - SRESP_ATTR_TASK_RO_DATES constant PKG_STD.TSTRING := 'readOnlyDates'; -- Атрибут для флага задачи "даты только для чтения" - SRESP_ATTR_TASK_BG_COLOR constant PKG_STD.TSTRING := 'bgColor'; -- Атрибут для цвета заголовка задачи - SRESP_ATTR_TASK_TEXT_COLOR constant PKG_STD.TSTRING := 'textColor'; -- Атрибут для цвета текста задачи - SRESP_ATTR_TASK_ATTRIBUTES constant PKG_STD.TSTRING := 'taskAttributes'; -- Атрибут для коллекции атрибутов задачи - SRESP_ATTR_TASK_COLORS constant PKG_STD.TSTRING := 'taskColors'; -- Атрибут для коллекции цветов задачи + SRESP_ATTR_GANTT_ZOOM_BAR constant PKG_STD.TSTRING := 'zoomBar'; -- Атрибут для флага отображения панели масштаба диаграммы Ганта + SRESP_ATTR_TASK_PROGRESS constant PKG_STD.TSTRING := 'progress'; -- Атрибут для прогресса задачи + SRESP_ATTR_TASK_DEPS constant PKG_STD.TSTRING := 'dependencies'; -- Атрибут для зависимостей задачи + SRESP_ATTR_TASK_RO constant PKG_STD.TSTRING := 'readOnly'; -- Атрибут для флага задачи "только для чтения" + SRESP_ATTR_TASK_RO_PRGRS constant PKG_STD.TSTRING := 'readOnlyProgress'; -- Атрибут для флага задачи "прогресс только для чтения" + SRESP_ATTR_TASK_RO_DATES constant PKG_STD.TSTRING := 'readOnlyDates'; -- Атрибут для флага задачи "даты только для чтения" + SRESP_ATTR_TASK_BG_COLOR constant PKG_STD.TSTRING := 'bgColor'; -- Атрибут для цвета заголовка задачи + SRESP_ATTR_TASK_TEXT_COLOR constant PKG_STD.TSTRING := 'textColor'; -- Атрибут для цвета текста задачи + SRESP_ATTR_TASK_BG_PRG_COLOR constant PKG_STD.TSTRING := 'bgProgressColor'; -- Атрибут для цвета прогресса задачи + SRESP_ATTR_TASK_ATTRIBUTES constant PKG_STD.TSTRING := 'taskAttributes'; -- Атрибут для коллекции атрибутов задачи + SRESP_ATTR_TASK_COLORS constant PKG_STD.TSTRING := 'taskColors'; -- Атрибут для коллекции цветов задачи /* Константы - атрибуты ответов (графики) */ SRESP_ATTR_CHART_LGND_POS constant PKG_STD.TSTRING := 'legendPosition'; -- Атрибут для места размешения легенды графика @@ -695,22 +738,28 @@ text="Формат data_grid и gant как в chart" BORDER in boolean := false, -- Разрешить сортировку BFILTER in boolean := false, -- Разрешить отбор RCOL_VALS in TCOL_VALS := null, -- Предопределённые значения - SHINT in varchar2 := null -- Текст всплывающей подсказки + SHINT in varchar2 := null, -- Текст всплывающей подсказки + SPARENT in varchar2 := null, -- Наименование родительской колонки + BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних колонок + BEXPANDED in boolean := true -- Отобразить/скрыть дочерние колонки ) return TCOL_DEF -- Результат работы is RRES TCOL_DEF; -- Буфер для результата begin /* Формируем объект */ - RRES.SNAME := SNAME; - RRES.SCAPTION := SCAPTION; - RRES.SDATA_TYPE := COALESCE(SDATA_TYPE, SDATA_TYPE_STR); - RRES.SCOND_FROM := COALESCE(SCOND_FROM, UTL_COND_NAME_MAKE_FROM(SNAME => SNAME)); - RRES.SCOND_TO := COALESCE(SCOND_TO, UTL_COND_NAME_MAKE_TO(SNAME => SNAME)); - RRES.BVISIBLE := COALESCE(BVISIBLE, true); - RRES.BORDER := COALESCE(BORDER, false); - RRES.BFILTER := COALESCE(BFILTER, false); - RRES.RCOL_VALS := COALESCE(RCOL_VALS, TCOL_VALS()); - RRES.SHINT := SHINT; + RRES.SNAME := SNAME; + RRES.SCAPTION := SCAPTION; + RRES.SDATA_TYPE := COALESCE(SDATA_TYPE, SDATA_TYPE_STR); + RRES.SCOND_FROM := COALESCE(SCOND_FROM, UTL_COND_NAME_MAKE_FROM(SNAME => SNAME)); + RRES.SCOND_TO := COALESCE(SCOND_TO, UTL_COND_NAME_MAKE_TO(SNAME => SNAME)); + RRES.BVISIBLE := COALESCE(BVISIBLE, true); + RRES.BORDER := COALESCE(BORDER, false); + RRES.BFILTER := COALESCE(BFILTER, false); + RRES.RCOL_VALS := COALESCE(RCOL_VALS, TCOL_VALS()); + RRES.SHINT := SHINT; + RRES.SPARENT := SPARENT; + RRES.BEXPANDABLE := COALESCE(BEXPANDABLE, false); + RRES.BEXPANDED := COALESCE(BEXPANDED, true); /* Возвращаем результат */ return RRES; end TCOL_DEF_MAKE; @@ -729,6 +778,9 @@ text="Формат data_grid и gant как в chart" BFILTER in boolean := false, -- Разрешить отбор RCOL_VALS in TCOL_VALS := null, -- Предопределённые значения SHINT in varchar2 := null, -- Текст всплывающей подсказки + SPARENT in varchar2 := null, -- Наименование родительской колонки + BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних колонок + BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние колонки BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) ) is @@ -739,16 +791,19 @@ text="Формат data_grid и gant как в chart" end if; /* Добавляем элемент */ RCOL_DEFS.EXTEND(); - RCOL_DEFS(RCOL_DEFS.LAST) := TCOL_DEF_MAKE(SNAME => SNAME, - SCAPTION => SCAPTION, - SDATA_TYPE => SDATA_TYPE, - SCOND_FROM => SCOND_FROM, - SCOND_TO => SCOND_TO, - BVISIBLE => BVISIBLE, - BORDER => BORDER, - BFILTER => BFILTER, - SHINT => SHINT, - RCOL_VALS => RCOL_VALS); + RCOL_DEFS(RCOL_DEFS.LAST) := TCOL_DEF_MAKE(SNAME => SNAME, + SCAPTION => SCAPTION, + SDATA_TYPE => SDATA_TYPE, + SCOND_FROM => SCOND_FROM, + SCOND_TO => SCOND_TO, + BVISIBLE => BVISIBLE, + BORDER => BORDER, + BFILTER => BFILTER, + RCOL_VALS => RCOL_VALS, + SHINT => SHINT, + SPARENT => SPARENT, + BEXPANDABLE => BEXPANDABLE, + BEXPANDED => BEXPANDED); end TCOL_DEFS_ADD; /* Поиск описания колонки по наименованию */ @@ -772,7 +827,7 @@ text="Формат data_grid и gant как в chart" return null; end TCOL_DEFS_FIND; - /* Сериализация описания колонки таблицы данных */ + /* Сериализация описания колонок таблицы данных */ procedure TCOL_DEFS_TO_XML ( RCOL_DEFS in TCOL_DEFS -- Описание колонок таблицы данных @@ -793,6 +848,9 @@ text="Формат data_grid и gant как в chart" PKG_XFAST.ATTR(SNAME => SRESP_ATTR_DT_ORDER, BVALUE => RCOL_DEFS(I).BORDER); PKG_XFAST.ATTR(SNAME => SRESP_ATTR_DT_FILTER, BVALUE => RCOL_DEFS(I).BFILTER); PKG_XFAST.ATTR(SNAME => SRESP_ATTR_HINT, SVALUE => RCOL_DEFS(I).SHINT); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_PARENT, SVALUE => RCOL_DEFS(I).SPARENT); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_EXPANDABLE, BVALUE => RCOL_DEFS(I).BEXPANDABLE); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_EXPANDED, BVALUE => RCOL_DEFS(I).BEXPANDED); /* Предопределённые значения */ if (RCOL_DEFS(I).RCOL_VALS is not null) and (RCOL_DEFS(I).RCOL_VALS.COUNT > 0) then for V in RCOL_DEFS(I).RCOL_VALS.FIRST .. RCOL_DEFS(I).RCOL_VALS.LAST @@ -814,7 +872,7 @@ text="Формат data_grid и gant как в chart" COALESCE(RCOL_DEFS(I).SDATA_TYPE, '<НЕ ОПРЕДЕЛЁН>')); end case; /* Закрываем описание предопределённого значения */ - PKG_XFAST.UP(); + PKG_XFAST.UP(); end loop; end if; /* Закрываем описание колонки */ @@ -862,14 +920,86 @@ text="Формат data_grid и gant как в chart" RCOLS(RCOLS.LAST) := TCOL_MAKE(SNAME => SNAME, SVALUE => SVALUE, NVALUE => NVALUE, DVALUE => DVALUE); end TCOLS_ADD; - /* Формирование строки */ - function TROW_MAKE - return TROW -- Результат работы + /* Формирование описания группы */ + function TGROUP_MAKE + ( + SNAME in varchar2, -- Наименование + SCAPTION in varchar2, -- Заголовок + BEXPANDABLE in boolean := true, -- Разрешить сокрытие/отображение дочерних + BEXPANDED in boolean := true -- Отобразить/скрыть дочерние + ) return TGROUP -- Результат работы is - RRES TROW; -- Буфер для результата + RRES TGROUP; -- Буфер для результата begin /* Формируем объект */ - RRES.RCOLS := TCOLS(); + RRES.SNAME := SNAME; + RRES.SCAPTION := SCAPTION; + RRES.BEXPANDABLE := COALESCE(BEXPANDABLE, true); + RRES.BEXPANDED := COALESCE(BEXPANDED, true); + /* Возвращаем результат */ + return RRES; + end TGROUP_MAKE; + + /* Добавление описания группы в коллекцию */ + procedure TGROUPS_ADD + ( + RGROUPS in out nocopy TGROUPS, -- Коллекция описаний колонок + SNAME in varchar2, -- Наименование + SCAPTION in varchar2, -- Заголовок + BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних + BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние + BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением) + ) + is + begin + /* Инициализируем коллекцию если необходимо */ + if ((RGROUPS is null) or (BCLEAR)) then + RGROUPS := TGROUPS(); + end if; + /* Добавляем элемент */ + RGROUPS.EXTEND(); + RGROUPS(RGROUPS.LAST) := TGROUP_MAKE(SNAME => SNAME, + SCAPTION => SCAPTION, + BEXPANDABLE => BEXPANDABLE, + BEXPANDED => BEXPANDED); + end TGROUPS_ADD; + + /* Сериализация описания групп таблицы данных */ + procedure TGROUPS_TO_XML + ( + RGROUPS in TGROUPS -- Описание групп таблицы данных + ) + is + begin + /* Обходим группы из коллекции */ + if ((RGROUPS is not null) and (RGROUPS.COUNT > 0)) then + for I in RGROUPS.FIRST .. RGROUPS.LAST + loop + /* Открываем описание группы */ + PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XGROUPS); + /* Атрибуты группы */ + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_NAME, SVALUE => RGROUPS(I).SNAME); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_CAPTION, SVALUE => RGROUPS(I).SCAPTION); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_EXPANDABLE, BVALUE => RGROUPS(I).BEXPANDABLE); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_EXPANDED, BVALUE => RGROUPS(I).BEXPANDED); + /* Закрываем описание группы */ + PKG_XFAST.UP(); + end loop; + end if; + end TGROUPS_TO_XML; + + /* Формирование строки */ + function TROW_MAKE + ( + SGROUP in varchar2 := null -- Наименование группы + ) + return TROW -- Результат работы + is + RRES TROW; -- Буфер для результата + begin + /* Формируем объект */ + RRES.SGROUP := SGROUP; + RRES.RCOLS := TCOLS(); /* Возвращаем результат */ return RRES; end TROW_MAKE; @@ -959,6 +1089,10 @@ text="Формат data_grid и gant как в chart" loop /* Открываем строку */ PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XROWS); + /* Если указана группа - добавим её */ + if (RROWS(I).SGROUP is not null) then + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_GROUP_NAME, SVALUE => RROWS(I).SGROUP); + end if; /* Обходим колонки строки */ if ((RROWS(I).RCOLS is not null) and (RROWS(I).RCOLS.COUNT > 0)) then for J in RROWS(I).RCOLS.FIRST .. RROWS(I).RCOLS.LAST @@ -1000,6 +1134,7 @@ text="Формат data_grid и gant как в chart" begin /* Формируем объект */ RRES.RCOL_DEFS := TCOL_DEFS(); + RRES.RGROUPS := TGROUPS(); RRES.RROWS := TROWS(); /* Возвращаем результат */ return RRES; @@ -1030,25 +1165,52 @@ text="Формат data_grid и gant как в chart" BFILTER in boolean := false, -- Разрешить отбор по колонке RCOL_VALS in TCOL_VALS := null, -- Предопределённые значения колонки SHINT in varchar2 := null, -- Текст всплывающей подсказки + SPARENT in varchar2 := null, -- Наименование родительской колонки + BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних колонок + BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние колонки BCLEAR in boolean := false -- Флаг очистки коллекции описаний колонок таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением) ) is begin /* Формируем описание и добавляем в коллекцию таблицы данных */ - TCOL_DEFS_ADD(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, - SNAME => SNAME, - SCAPTION => SCAPTION, - SDATA_TYPE => SDATA_TYPE, - SCOND_FROM => SCOND_FROM, - SCOND_TO => SCOND_TO, - BVISIBLE => BVISIBLE, - BORDER => BORDER, - BFILTER => BFILTER, - RCOL_VALS => RCOL_VALS, - SHINT => SHINT, - BCLEAR => BCLEAR); + TCOL_DEFS_ADD(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, + SNAME => SNAME, + SCAPTION => SCAPTION, + SDATA_TYPE => SDATA_TYPE, + SCOND_FROM => SCOND_FROM, + SCOND_TO => SCOND_TO, + BVISIBLE => BVISIBLE, + BORDER => BORDER, + BFILTER => BFILTER, + RCOL_VALS => RCOL_VALS, + SHINT => SHINT, + SPARENT => SPARENT, + BEXPANDABLE => BEXPANDABLE, + BEXPANDED => BEXPANDED, + BCLEAR => BCLEAR); end TDATA_GRID_ADD_COL_DEF; + /* Добавление описания группы к таблице данных */ + procedure TDATA_GRID_ADD_GROUP + ( + RDATA_GRID in out nocopy TDATA_GRID, -- Описание таблицы данных + SNAME in varchar2, -- Наименование группы + SCAPTION in varchar2, -- Заголовок группы + BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних + BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние + BCLEAR in boolean := false -- Флаг очистки коллекции описаний групп таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением) + ) + is + begin + /* Формируем описание и добавляем в коллекцию таблицы данных */ + TGROUPS_ADD(RGROUPS => RDATA_GRID.RGROUPS, + SNAME => SNAME, + SCAPTION => SCAPTION, + BEXPANDABLE => BEXPANDABLE, + BEXPANDED => BEXPANDED, + BCLEAR => BCLEAR); + end TDATA_GRID_ADD_GROUP; + /* Добавление описания колонки к таблице данных */ procedure TDATA_GRID_ADD_ROW ( @@ -1084,6 +1246,8 @@ text="Формат data_grid и gant как в chart" if (NINCLUDE_DEF = 1) then TCOL_DEFS_TO_XML(RCOL_DEFS => RDATA_GRID.RCOL_DEFS); end if; + /* Формируем описание групп */ + TGROUPS_TO_XML(RGROUPS => RDATA_GRID.RGROUPS); /* Формируем описание строк */ TROWS_TO_XML(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, RROWS => RDATA_GRID.RROWS); /* Закрываем корень */ @@ -1502,7 +1666,8 @@ text="Формат data_grid и gant как в chart" ( RTASK_COLORS in TGANTT_TASK_COLORS, -- Описание цветов задачи диаграммы Ганта SBG_COLOR in varchar2 := null, -- Цвет заливки задачи (формат - HTML-цвет, #RRGGBBAA) - STEXT_COLOR in varchar2 := null -- Цвет текста заголовка задачи (формат - HTML-цвет, #RRGGBBAA) + STEXT_COLOR in varchar2 := null, -- Цвет текста заголовка задачи (формат - HTML-цвет, #RRGGBBAA) + SBG_PROGRESS_COLOR in varchar2 := null -- Цвет заливки прогресса (формат - HTML-цвет, #RRGGBBAA) ) return TGANTT_TASK_COLOR -- Найденное описание цвета (null - если не нашли) is begin @@ -1511,7 +1676,9 @@ text="Формат data_grid и gant как в chart" for I in RTASK_COLORS.FIRST .. RTASK_COLORS.LAST loop if ((CMP_VC2(V1 => RTASK_COLORS(I).SBG_COLOR, V2 => SBG_COLOR) = 1) and - (CMP_VC2(V1 => RTASK_COLORS(I).STEXT_COLOR, V2 => STEXT_COLOR) = 1)) then + (CMP_VC2(V1 => RTASK_COLORS(I).STEXT_COLOR, V2 => STEXT_COLOR) = 1) and + (CMP_VC2(V1 => RTASK_COLORS(I).SBG_PROGRESS_COLOR, V2 => SBG_PROGRESS_COLOR) = 1)) + then return RTASK_COLORS(I); end if; end loop; @@ -1532,6 +1699,7 @@ text="Формат data_grid и gant как в chart" NPROGRESS in number := null, -- Прогресс (% готовности) задачи (null - не определен) SBG_COLOR in varchar2 := null, -- Цвет заливки задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA) STEXT_COLOR in varchar2 := null, -- Цвет текста заголовка задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA) + SBG_PROGRESS_COLOR in varchar2 := null, -- Цвет заливки прогресса (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA) BREAD_ONLY in boolean := null, -- Сроки и прогресс задачи только для чтения (null - как указано в описании диаграммы) BREAD_ONLY_DATES in boolean := null, -- Сроки задачи только для чтения (null - как указано в описании диаграммы) BREAD_ONLY_PROGRESS in boolean := null -- Прогресс задачи только для чтения (null - как указано в описании диаграммы) @@ -1557,6 +1725,7 @@ text="Формат data_grid и gant как в chart" RRES.NPROGRESS := NPROGRESS; RRES.SBG_COLOR := SBG_COLOR; RRES.STEXT_COLOR := STEXT_COLOR; + RRES.SBG_PROGRESS_COLOR := SBG_PROGRESS_COLOR; RRES.BREAD_ONLY := BREAD_ONLY; RRES.BREAD_ONLY_DATES := BREAD_ONLY_DATES; RRES.BREAD_ONLY_PROGRESS := BREAD_ONLY_PROGRESS; @@ -1644,6 +1813,9 @@ text="Формат data_grid и gant как в chart" if (RTASKS(I).STEXT_COLOR is not null) then PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_TEXT_COLOR, SVALUE => RTASKS(I).STEXT_COLOR); end if; + if (RTASKS(I).SBG_PROGRESS_COLOR is not null) then + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_BG_PRG_COLOR, SVALUE => RTASKS(I).SBG_PROGRESS_COLOR); + end if; if (RTASKS(I).BREAD_ONLY is not null) then PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_RO, BVALUE => RTASKS(I).BREAD_ONLY); end if; @@ -1735,21 +1907,22 @@ text="Формат data_grid и gant как в chart" RGANTT in out nocopy TGANTT, -- Описание диаграммы Ганта SBG_COLOR in varchar2 := null, -- Цвет заливки задачи (формат - HTML-цвет, #RRGGBBAA) STEXT_COLOR in varchar2 := null, -- Цвет текста заголовка задачи (формат - HTML-цвет, #RRGGBBAA) + SBG_PROGRESS_COLOR in varchar2 := null, -- Цвет заливки прогресса (формат - HTML-цвет, #RRGGBBAA) SDESC in varchar2, -- Описание BCLEAR in boolean := false -- Флаг очистки коллекции цветов (false - не очищать, true - очистить коллекцию перед добавлением) ) is begin /* Проверим параметры */ - if ((SBG_COLOR is null) and (STEXT_COLOR is null)) then + if ((SBG_COLOR is null) and (STEXT_COLOR is null) and (SBG_PROGRESS_COLOR is null)) then P_EXCEPTION(0, - 'Должен быть указан цвет заливки или цвет текста задачи.'); + 'Должен быть указан цвет заливки или цвет текста задачи, или цвет заливки прогресса.'); end if; if (SDESC is null) then P_EXCEPTION(0, 'Описание цвета должно быть задано.'); end if; /* Проверим, что такого ещё нет */ - if (TGANTT_TASK_COLOR_FIND(RTASK_COLORS => RGANTT.RTASK_COLORS, SBG_COLOR => SBG_COLOR, STEXT_COLOR => STEXT_COLOR) + if (TGANTT_TASK_COLOR_FIND(RTASK_COLORS => RGANTT.RTASK_COLORS, SBG_COLOR => SBG_COLOR, STEXT_COLOR => STEXT_COLOR, SBG_PROGRESS_COLOR => SBG_PROGRESS_COLOR) .SDESC is not null) then P_EXCEPTION(0, 'Такое описание цвета для задачи диаграммы Ганта уже зарегистрировано.'); @@ -1762,6 +1935,7 @@ text="Формат data_grid и gant как в chart" RGANTT.RTASK_COLORS.EXTEND(); RGANTT.RTASK_COLORS(RGANTT.RTASK_COLORS.LAST).SBG_COLOR := SBG_COLOR; RGANTT.RTASK_COLORS(RGANTT.RTASK_COLORS.LAST).STEXT_COLOR := STEXT_COLOR; + RGANTT.RTASK_COLORS(RGANTT.RTASK_COLORS.LAST).SBG_PROGRESS_COLOR := SBG_PROGRESS_COLOR; RGANTT.RTASK_COLORS(RGANTT.RTASK_COLORS.LAST).SDESC := SDESC; end TGANTT_ADD_TASK_COLOR;