Поддержка вызова панелей из разделов ("строенное "действие P8PANELS_OPEN)

This commit is contained in:
Mikhail Chechnev 2024-03-31 12:43:41 +03:00
parent c673616c05
commit 823ddf95f3
6 changed files with 112 additions and 15 deletions

127
Module.cs
View File

@ -9,20 +9,51 @@ using ParusClient.Activities;
using System.Xml;
using System.IO;
using CommonActivities.Activities;
using Common.Extensions;
using CommonActivities.Activities.Common;
using FlowControl.Core;
using Parus.Database.Specialized;
using CommonWeb.Workflow.Extensioins;
using System.Web;
//"Панели" - расширение для "ПАРУС 8 Онлайн" (библиотека для сервера приложений)
namespace P8PanelsParusOnlineExt
{
//Вспомогательные методы
public static class P8PanelUtils
{
//Имена специальных параметров "встроенных" методов
public const string SPECIAL_PRM_CAPTION = "SCAPTION";
public const string SPECIAL_PRM_PANEL = "SPANEL";
public const string SPECIAL_PRM_IDENT = "NIDENT";
//Формирование адреса панели
public static string BuildPanelURL(P8PanelConfig config, P8Panel panel, IDictionary<string, object> parameters = null)
{
string panelUrl = config.panelsUrlBase;
if (!panelUrl.EndsWith("/") && !panel.url.StartsWith("/")) panelUrl += "/";
panelUrl += panel.url;
if (parameters != null)
{
var prms = "";
foreach (KeyValuePair<string, object> entry in parameters)
{
if ((entry.Key != SPECIAL_PRM_CAPTION) && (entry.Key != SPECIAL_PRM_PANEL))
prms += entry.Key + "=" + HttpUtility.UrlEncode(Convert.ToString(parameters.SafeValue(entry.Key))) + "&";
}
if (!string.IsNullOrEmpty(prms)) panelUrl += "?" + prms;
}
return panelUrl;
}
}
//Настройки расширения
[Serializable]
public class P8PanelConfig
{
private List<P8PanelMenuApp> _menuApps = new List<P8PanelMenuApp>();
private List<P8PanelMenuItem> _menuItems = new List<P8PanelMenuItem>();
private List<P8Panel> _panels = new List<P8Panel>();
private string _panelsUrlBase;
//Конструктор
@ -96,12 +127,14 @@ namespace P8PanelsParusOnlineExt
}
//Приложение панели
[Serializable]
public class P8PanelMenuApp
{
public string name { get; set; }
}
//Элемент меню панели
[Serializable]
public class P8PanelMenuItem
{
public string app { get; set; }
@ -114,6 +147,7 @@ namespace P8PanelsParusOnlineExt
}
//Параметры панели
[Serializable]
public class P8Panel
{
public string name { get; set; }
@ -124,20 +158,81 @@ namespace P8PanelsParusOnlineExt
public bool showInPanelsList { get; set; }
}
//Обработчик "встроенного" метода открытия панели
public class OpenPanelActivity : OpenExternalLinkActivity
{
private P8PanelConfig _pconf;
private readonly IContextualParusDatabaseFactoryProvider _contextualParusDatabaseFactoryProvider;
private string _contextCaption;
private string _contextLink;
//Конструктор
public OpenPanelActivity(string caption, P8PanelConfig pconf, IContextualParusDatabaseFactoryProvider contextualParusDatabaseFactoryProvider) : base(caption, "stub")
{
_pconf = pconf ?? throw new ArgumentNullException("pconf");
_contextualParusDatabaseFactoryProvider = contextualParusDatabaseFactoryProvider ?? throw new ArgumentNullException("contextualParusDatabaseFactoryProvider");
}
//Исполнение действия
protected override void InternalExecute(IContext context)
{
//Читаем параметры из контекста
if (context == null) throw new ArgumentNullException("context");
var parameters = context.SafeParameterValue("MethodParameterValues") as IDictionary<string, object>;
var nIdent = parameters.SafeValue(P8PanelUtils.SPECIAL_PRM_IDENT);
var sPanel = (string) parameters.SafeValue(P8PanelUtils.SPECIAL_PRM_PANEL);
_contextCaption = (string)parameters.SafeValue(P8PanelUtils.SPECIAL_PRM_CAPTION);
//Определяем панель, которую будем открывать
if (string.IsNullOrEmpty(sPanel)) throw new Exception("Не указан код панели. Проверьте, что задано значение параметра \"SPANEL\".");
P8Panel panel = _pconf.FindPanelByName(name: sPanel);
//Если панель определена
if (panel != null)
{
//Если был указан идентификатор отмеченных записей
if (nIdent != null)
{
//Скопируем системный буфер отмеченных в буфер для панелей (чтобы не потерять при завершении транзакции)
var parusDatabaseFactory = _contextualParusDatabaseFactoryProvider.GetDatabaseFactory();
using (var connection = parusDatabaseFactory.CreateConnection())
{
using (var command = parusDatabaseFactory.CreateProcedure(connection, "PKG_P8PANELS.SELECTLIST_INIT"))
{
command.Parameters.Add(P8PanelUtils.SPECIAL_PRM_IDENT, (long) nIdent);
command.ExecuteNonQuery();
}
}
}
//Если не передали заголовок панели в параметрах - используем её заголовок из конфигурации
if (string.IsNullOrEmpty(_contextCaption)) _contextCaption = panel.caption;
//Сформируем ссылку на панель
_contextLink = P8PanelUtils.BuildPanelURL(config: _pconf, panel: panel, parameters: parameters);
} else throw new Exception($"Панель \"{sPanel}\" не определена.");
//Выполним алгоритм родительского класса
base.InternalExecute(context);
}
//Переопределение параметров открываемой закладки
protected override IDictionary<string, object> CreateClientParameters(IContext context)
{
//Сформируем словарь параметров открываемой закладки
var clientParameters = base.CreateClientParameters(context);
//Если удалось сформировать заголовок - переопределим его
if (!string.IsNullOrEmpty(_contextCaption)) clientParameters.AddOrReplace(WellknownOpenMainTabActivityParameterNames.Caption, _contextCaption);
//Переопределим адрес панели тем, который сформировали
clientParameters.AddOrReplace(WellknownOpenMainTabActivityParameterNames.Url, _contextLink);
//Вернём измененный словарь параметров
return clientParameters;
}
}
//Точка входа в модуль расширения
public class Module : ExtensionModuleBase
{
private static string _configFile = Path.GetDirectoryName(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile) + "\\Config\\p8panels.config";
private static IList<IHook> _hooks = new List<IHook>();
public override string ModuleName => "P8Panels";
public override string AuthorInfo => "ЦИТК";
public override IList<IHook> Hooks => _hooks;
public override bool HasViews => false;
//Конструктор
@ -168,18 +263,20 @@ namespace P8PanelsParusOnlineExt
{
P8Panel panel = pconf.FindPanelByName(name: menuItem.panelName);
if (panel != null)
{
string panelUrl = pconf.panelsUrlBase;
if (!panelUrl.EndsWith("/") && !panel.url.StartsWith("/")) panelUrl += "/";
panelUrl += panel.url;
menuItemsActions.Add(menuItem.name, () => new Sequence().Add<OpenExternalLinkActivity>(new { caption = panel.caption, url = panelUrl }));
}
menuItemsActions.Add(menuItem.name, () => new Sequence().Add<OpenExternalLinkActivity>(new { caption = panel.caption, url = P8PanelUtils.BuildPanelURL(config: pconf, panel: panel) }));
else
menuItemsActions.Add(menuItem.name, () => new Sequence().Add<MessageActivity>(new { caption = "Панель не определена", text = $"Панель \"{menuItem.panelName}\" не определена." }));
}
});
_hooks.Add(MainMenuItemBuilderHook.Make(menuItemsActions));
//Хуки "встроенных" действий с панелями в разделах
_hooks.Add(MethodBuilderHook.Make(new Dictionary<string, Func<Sequence>>{
{
"P8PANELS_OPEN",
() => new Sequence().Add<OpenPanelActivity>(new { caption = "Панель", pconf = pconf })
}
}));
}
//Путь к файлу конфигурации расширения

Binary file not shown.

Binary file not shown.