Поддержка вызова панелей из разделов ("строенное "действие P8PANELS_OPEN)
This commit is contained in:
parent
c673616c05
commit
823ddf95f3
127
Module.cs
127
Module.cs
@ -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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user