From be22cde13883cd501b8fee90cc33f67bf8e7be99 Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Thu, 25 Sep 2025 14:11:32 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A6=D0=98=D0=A2=D0=9A-979=20-=20=D0=9F=D0=BE?= =?UTF-8?q?=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=B0=20=D0=B2=D0=BE=D0=B7?= =?UTF-8?q?=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D1=83=D0=BA?= =?UTF-8?q?=D0=B0=D0=B7=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BE=D1=82=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BE=D1=87=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B7=D0=BD=D0=B0?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B0=D1=80=D0=B3=D1=83=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B0=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inspector_query_args/arg_iu_dialog.js | 28 +++++++++++++-- .../components/inspector_query_args/hooks.js | 8 ++--- .../inspector_query_args.js | 4 +-- app/panels/query_editor/hooks.js | 1 + db/PKG_P8PANELS_QE.pck | 18 ++++++---- db/PKG_P8PANELS_QE_BASE.pck | 34 ++++++++++++++----- 6 files changed, 70 insertions(+), 23 deletions(-) diff --git a/app/panels/query_editor/components/inspector_query_args/arg_iu_dialog.js b/app/panels/query_editor/components/inspector_query_args/arg_iu_dialog.js index de8e147..85fdf20 100644 --- a/app/panels/query_editor/components/inspector_query_args/arg_iu_dialog.js +++ b/app/panels/query_editor/components/inspector_query_args/arg_iu_dialog.js @@ -7,7 +7,7 @@ //Подключение библиотек //--------------------- -import React from "react"; //Классы React +import React, { useState } from "react"; //Классы React import PropTypes from "prop-types"; //Контроль свойств компонента import { P8PDialog } from "../../../../components/p8p_dialog"; //Типовой диалог import { TITLES } from "../../../../../app.text"; //Общие текстовые ресурсы приложения @@ -18,13 +18,27 @@ import { DATA_TYPE } from "../../common"; //Общие константы ред //----------- //Диалог добавления/исправления аргумента запроса -const ArgIUDialog = ({ name = "", title = "", dataType = DATA_TYPE.NUMB, mandatory = 0, insert = true, onOk, onCancel }) => { +const ArgIUDialog = ({ name = "", title = "", dataType = DATA_TYPE.NUMB, mandatory = 0, value = "", insert = true, onOk, onCancel }) => { + //Собственное состояние - текущее состояние аргумента + const [current, setCurrent] = useState({ value, dataType }); + //Нажатие на кнопку "Ok" const handleOk = values => onOk && onOk({ ...values }); //Нажатие на кнопку "Отмена" const handleCancel = () => onCancel && onCancel(); + //При изменении значений в поле ввода + const handleInputChange = (name, value) => { + //Если поменяли тип данных - надо пересмотреть поля для ввода + if (name === "dataType") { + //Сохраним в состоянии новый тип данных и сбросим "отладочное значение", ведь оно зависит от типа данных (от этого состояния зависит свойство inputs, передаваемое в P8PDialog ниже) + setCurrent({ dataType: value, value: "" }); + //Мы сами пересчитали форму, туда придут новые настройки элементов ввода через свойство inputs, не надо делать пересчет состояния внутри диалога + return true; + } + }; + //Генерация содержимого return ( ); }; @@ -64,6 +85,7 @@ ArgIUDialog.propTypes = { title: PropTypes.string, dataType: PropTypes.number, mandatory: PropTypes.number, + value: PropTypes.string, insert: PropTypes.bool, onOk: PropTypes.func, onCancel: PropTypes.func diff --git a/app/panels/query_editor/components/inspector_query_args/hooks.js b/app/panels/query_editor/components/inspector_query_args/hooks.js index 554d55e..10f3b4f 100644 --- a/app/panels/query_editor/components/inspector_query_args/hooks.js +++ b/app/panels/query_editor/components/inspector_query_args/hooks.js @@ -25,10 +25,10 @@ const useQueryArgs = query => { //Добавление аргумента запроса const addArg = useCallback( - async (name, title, dataType, mandatory) => { + async (name, title, dataType, mandatory, value) => { await executeStored({ stored: "PKG_P8PANELS_QE.QUERY_OPT_ARG_ADD", - args: { NRN: query, SNAME: name, STITLE: title, NDATA_TYPE: dataType, NMANDATORY: mandatory }, + args: { NRN: query, SNAME: name, STITLE: title, NDATA_TYPE: dataType, NMANDATORY: mandatory, SVALUE: value }, loader: false }); }, @@ -37,10 +37,10 @@ const useQueryArgs = query => { //Исправление аргумента запроса const editArg = useCallback( - async (name, title, dataType, mandatory) => { + async (name, title, dataType, mandatory, value) => { await executeStored({ stored: "PKG_P8PANELS_QE.QUERY_OPT_ARG_EDIT", - args: { NRN: query, SNAME: name, STITLE: title, NDATA_TYPE: dataType, NMANDATORY: mandatory }, + args: { NRN: query, SNAME: name, STITLE: title, NDATA_TYPE: dataType, NMANDATORY: mandatory, SVALUE: value }, loader: false }); }, diff --git a/app/panels/query_editor/components/inspector_query_args/inspector_query_args.js b/app/panels/query_editor/components/inspector_query_args/inspector_query_args.js index 4a75480..866bb72 100644 --- a/app/panels/query_editor/components/inspector_query_args/inspector_query_args.js +++ b/app/panels/query_editor/components/inspector_query_args/inspector_query_args.js @@ -35,14 +35,14 @@ const InspectorQueryArguments = ({ query, args = [], onOptionsChanged = null }) //При добавлении аргумента const handleArgAdd = async (arg, cb) => { - await addArg(arg.name, arg.title, arg.dataType, arg.mandatory); + await addArg(arg.name, arg.title, arg.dataType, arg.mandatory, arg.value); cb && cb(); notifyOptionsChanged(); }; //При изменении аргумента const handleArgEdit = async (arg, cb) => { - await editArg(arg.name, arg.title, arg.dataType, arg.mandatory); + await editArg(arg.name, arg.title, arg.dataType, arg.mandatory, arg.value); cb && cb(); notifyOptionsChanged(); }; diff --git a/app/panels/query_editor/hooks.js b/app/panels/query_editor/hooks.js index f6d3a06..b62396c 100644 --- a/app/panels/query_editor/hooks.js +++ b/app/panels/query_editor/hooks.js @@ -135,6 +135,7 @@ const useQuery = query => { args: { NRN: query }, respArg: "COUT", isArray: name => ["XENT", "XATTR", "XRL", "XARG"].includes(name), + attributeValueProcessor: (name, val) => (["value"].includes(name) ? undefined : val), loader: true }); setQueryDiagram(serverQueryData2QueryDiagram(data?.XENTS?.XENT || [], data?.XRLS?.XRL || [])); diff --git a/db/PKG_P8PANELS_QE.pck b/db/PKG_P8PANELS_QE.pck index da806b1..3d1529d 100644 --- a/db/PKG_P8PANELS_QE.pck +++ b/db/PKG_P8PANELS_QE.pck @@ -118,7 +118,8 @@ create or replace package PKG_P8PANELS_QE as SNAME in varchar2, -- Имя STITLE in varchar2, -- Заголовок NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*) - NMANDATORY in number -- Флаг обязательности (1 - да, 0 - нет) + NMANDATORY in number, -- Флаг обязательности (1 - да, 0 - нет) + SVALUE in varchar2 -- Значение для отладки (строковое представление для всех типов данных) ); /* Изменение аргумента запроса */ @@ -128,7 +129,8 @@ create or replace package PKG_P8PANELS_QE as SNAME in varchar2, -- Имя STITLE in varchar2, -- Заголовок NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*) - NMANDATORY in number -- Флаг обязательности (1 - да, 0 - нет) + NMANDATORY in number, -- Флаг обязательности (1 - да, 0 - нет) + SVALUE in varchar2 -- Значение для отладки (строковое представление для всех типов данных) ); /* Удаление аргумента запроса */ @@ -503,7 +505,8 @@ create or replace package body PKG_P8PANELS_QE as SNAME in varchar2, -- Имя STITLE in varchar2, -- Заголовок NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*) - NMANDATORY in number -- Флаг обязательности (1 - да, 0 - нет) + NMANDATORY in number, -- Флаг обязательности (1 - да, 0 - нет) + SVALUE in varchar2 -- Значение для отладки (строковое представление для всех типов данных) ) is RQ P8PNL_QE_QUERY%rowtype; -- Запись запроса @@ -520,7 +523,8 @@ create or replace package body PKG_P8PANELS_QE as SNAME => SNAME, STITLE => STITLE, NDATA_TYPE => NDATA_TYPE, - NMANDATORY => NMANDATORY); + NMANDATORY => NMANDATORY, + SVALUE => SVALUE); /* Сохраняем обновленную настройку */ PKG_P8PANELS_QE_BASE.QUERY_OPT_SET(NRN => RQ.RN, ROPT => ROPT); end QUERY_OPT_ARG_ADD; @@ -532,7 +536,8 @@ create or replace package body PKG_P8PANELS_QE as SNAME in varchar2, -- Имя STITLE in varchar2, -- Заголовок NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*) - NMANDATORY in number -- Флаг обязательности (1 - да, 0 - нет) + NMANDATORY in number, -- Флаг обязательности (1 - да, 0 - нет) + SVALUE in varchar2 -- Значение для отладки (строковое представление для всех типов данных) ) is RQ P8PNL_QE_QUERY%rowtype; -- Запись запроса @@ -559,7 +564,8 @@ create or replace package body PKG_P8PANELS_QE as SNAME => SNAME, STITLE => STITLE, NDATA_TYPE => NDATA_TYPE, - NMANDATORY => NMANDATORY); + NMANDATORY => NMANDATORY, + SVALUE => SVALUE); /* Сохраняем обновленную настройку */ PKG_P8PANELS_QE_BASE.QUERY_OPT_SET(NRN => RQ.RN, ROPT => ROPT); end QUERY_OPT_ARG_EDIT; diff --git a/db/PKG_P8PANELS_QE_BASE.pck b/db/PKG_P8PANELS_QE_BASE.pck index 68f4609..42d1a69 100644 --- a/db/PKG_P8PANELS_QE_BASE.pck +++ b/db/PKG_P8PANELS_QE_BASE.pck @@ -6,7 +6,8 @@ create or replace package PKG_P8PANELS_QE_BASE as SNAME PKG_STD.TSTRING, -- Имя STITLE PKG_STD.TSTRING, -- Заголовок NDATA_TYPE PKG_STD.TNUMBER, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*) - NMANDATORY PKG_STD.TNUMBER -- Флаг обязательности (1 - да, 0 - нет) + NMANDATORY PKG_STD.TNUMBER, -- Флаг обязательности (1 - да, 0 - нет) + SVALUE PKG_STD.TLSTRING -- Значение для отладки (строковое представление для всех типов данных) ); /* Типы данных - Коллекция аргументов */ @@ -90,7 +91,8 @@ create or replace package PKG_P8PANELS_QE_BASE as SNAME in varchar2, -- Имя STITLE in varchar2, -- Заголовок NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*) - NMANDATORY in number -- Флаг обязательности (1 - да, 0 - нет) + NMANDATORY in number, -- Флаг обязательности (1 - да, 0 - нет) + SVALUE in varchar2 -- Значение для отладки (строковое представление для всех типов данных) ); /* Изменение аргумента в коллекции */ @@ -101,7 +103,8 @@ create or replace package PKG_P8PANELS_QE_BASE as SNAME in varchar2, -- Имя STITLE in varchar2, -- Заголовок NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*) - NMANDATORY in number -- Флаг обязательности (1 - да, 0 - нет) + NMANDATORY in number, -- Флаг обязательности (1 - да, 0 - нет) + SVALUE in varchar2 -- Значение для отладки (строковое представление для всех типов данных) ); /* Удаление аргумента из коллекции */ @@ -366,6 +369,7 @@ create or replace package body PKG_P8PANELS_QE_BASE as SATTR_USE constant PKG_STD.TSTRING := 'use'; -- Применение в запросе SATTR_SHOW constant PKG_STD.TSTRING := 'show'; -- Отображение в запросе SATTR_PARENT_ENTITY constant PKG_STD.TSTRING := 'parentEntity'; -- Идентификатор родительской сущности + SATTR_VALUE constant PKG_STD.TSTRING := 'value'; -- Значение /* Константы - зарезервированные имена рагументов */ SARG_NAME_PAGE constant PKG_STD.TSTRING := 'NPAGE'; -- Номер страницы @@ -432,7 +436,8 @@ create or replace package body PKG_P8PANELS_QE_BASE as SNAME in varchar2, -- Имя STITLE in varchar2, -- Заголовок NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*) - NMANDATORY in number -- Флаг обязательности (1 - да, 0 - нет) + NMANDATORY in number, -- Флаг обязательности (1 - да, 0 - нет) + SVALUE in varchar2 -- Значение для отладки (строковое представление для всех типов данных) ) return TARG -- Описание аргумента is RARG TARG; -- Буфер для результата @@ -475,6 +480,7 @@ create or replace package body PKG_P8PANELS_QE_BASE as RARG.STITLE := STITLE; RARG.NDATA_TYPE := NDATA_TYPE; RARG.NMANDATORY := NMANDATORY; + RARG.SVALUE := SVALUE; /* Вернем полученное */ return RARG; end TARG_MAKE; @@ -493,6 +499,7 @@ create or replace package body PKG_P8PANELS_QE_BASE as PKG_XFAST.ATTR(SNAME => SATTR_TITLE, SVALUE => RARG.STITLE); PKG_XFAST.ATTR(SNAME => SATTR_DATA_TYPE, NVALUE => RARG.NDATA_TYPE); PKG_XFAST.ATTR(SNAME => SATTR_MANDATORY, NVALUE => RARG.NMANDATORY); + PKG_XFAST.ATTR(SNAME => SATTR_VALUE, SVALUE => RARG.SVALUE); /* Закрываем описание аргумента */ PKG_XFAST.UP(); end TARG_TO_XML; @@ -521,6 +528,7 @@ create or replace package body PKG_P8PANELS_QE_BASE as RRES.STITLE := PKG_XPATH.ATTRIBUTE(RNODE => XNODE, SNAME => SATTR_TITLE); RRES.NDATA_TYPE := PKG_XPATH.ATTRIBUTE_NUM(RNODE => XNODE, SNAME => SATTR_DATA_TYPE); RRES.NMANDATORY := PKG_XPATH.ATTRIBUTE_NUM(RNODE => XNODE, SNAME => SATTR_MANDATORY); + RRES.SVALUE := PKG_XPATH.ATTRIBUTE(RNODE => XNODE, SNAME => SATTR_VALUE); /* Освободим документ */ PKG_XPATH.FREE(RDOCUMENT => XDOC); exception @@ -570,7 +578,8 @@ create or replace package body PKG_P8PANELS_QE_BASE as SNAME in varchar2, -- Имя STITLE in varchar2, -- Заголовок NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*) - NMANDATORY in number -- Флаг обязательности (1 - да, 0 - нет) + NMANDATORY in number, -- Флаг обязательности (1 - да, 0 - нет) + SVALUE in varchar2 -- Значение для отладки (строковое представление для всех типов данных) ) is RARG TARG; -- Добавляемый аргумент @@ -584,7 +593,11 @@ create or replace package body PKG_P8PANELS_QE_BASE as P_EXCEPTION(0, 'Аргумент с именем "%s" уже существует.', SNAME); end if; /* Формируем аргумент */ - RARG := TARG_MAKE(SNAME => SNAME, STITLE => STITLE, NDATA_TYPE => NDATA_TYPE, NMANDATORY => NMANDATORY); + RARG := TARG_MAKE(SNAME => SNAME, + STITLE => STITLE, + NDATA_TYPE => NDATA_TYPE, + NMANDATORY => NMANDATORY, + SVALUE => SVALUE); /* Добавляем его в коллекцию */ RARGS.EXTEND(); RARGS(RARGS.LAST) := RARG; @@ -598,7 +611,8 @@ create or replace package body PKG_P8PANELS_QE_BASE as SNAME in varchar2, -- Имя STITLE in varchar2, -- Заголовок NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*) - NMANDATORY in number -- Флаг обязательности (1 - да, 0 - нет) + NMANDATORY in number, -- Флаг обязательности (1 - да, 0 - нет) + SVALUE in varchar2 -- Значение для отладки (строковое представление для всех типов данных) ) is RARG TARG; -- Добавляемый аргумент @@ -613,7 +627,11 @@ create or replace package body PKG_P8PANELS_QE_BASE as P_EXCEPTION(0, 'Не указан индекс изменяемого аргумента.'); end if; /* Формируем аргумент */ - RARG := TARG_MAKE(SNAME => SNAME, STITLE => STITLE, NDATA_TYPE => NDATA_TYPE, NMANDATORY => NMANDATORY); + RARG := TARG_MAKE(SNAME => SNAME, + STITLE => STITLE, + NDATA_TYPE => NDATA_TYPE, + NMANDATORY => NMANDATORY, + SVALUE => SVALUE); /* Обновляем аргумент в коллекции */ begin RARGS(NINDEX) := RARG;