Поддержка вызова панелей из разделов ("строенное "действие 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.Xml;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using CommonActivities.Activities;
|
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 Онлайн" (библиотека для сервера приложений)
|
//"Панели" - расширение для "ПАРУС 8 Онлайн" (библиотека для сервера приложений)
|
||||||
namespace P8PanelsParusOnlineExt
|
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
|
public class P8PanelConfig
|
||||||
{
|
{
|
||||||
private List<P8PanelMenuApp> _menuApps = new List<P8PanelMenuApp>();
|
private List<P8PanelMenuApp> _menuApps = new List<P8PanelMenuApp>();
|
||||||
|
|
||||||
private List<P8PanelMenuItem> _menuItems = new List<P8PanelMenuItem>();
|
private List<P8PanelMenuItem> _menuItems = new List<P8PanelMenuItem>();
|
||||||
|
|
||||||
private List<P8Panel> _panels = new List<P8Panel>();
|
private List<P8Panel> _panels = new List<P8Panel>();
|
||||||
|
|
||||||
private string _panelsUrlBase;
|
private string _panelsUrlBase;
|
||||||
|
|
||||||
//Конструктор
|
//Конструктор
|
||||||
@ -96,12 +127,14 @@ namespace P8PanelsParusOnlineExt
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Приложение панели
|
//Приложение панели
|
||||||
|
[Serializable]
|
||||||
public class P8PanelMenuApp
|
public class P8PanelMenuApp
|
||||||
{
|
{
|
||||||
public string name { get; set; }
|
public string name { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
//Элемент меню панели
|
//Элемент меню панели
|
||||||
|
[Serializable]
|
||||||
public class P8PanelMenuItem
|
public class P8PanelMenuItem
|
||||||
{
|
{
|
||||||
public string app { get; set; }
|
public string app { get; set; }
|
||||||
@ -114,6 +147,7 @@ namespace P8PanelsParusOnlineExt
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Параметры панели
|
//Параметры панели
|
||||||
|
[Serializable]
|
||||||
public class P8Panel
|
public class P8Panel
|
||||||
{
|
{
|
||||||
public string name { get; set; }
|
public string name { get; set; }
|
||||||
@ -124,20 +158,81 @@ namespace P8PanelsParusOnlineExt
|
|||||||
public bool showInPanelsList { get; set; }
|
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
|
public class Module : ExtensionModuleBase
|
||||||
{
|
{
|
||||||
|
|
||||||
private static string _configFile = Path.GetDirectoryName(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile) + "\\Config\\p8panels.config";
|
private static string _configFile = Path.GetDirectoryName(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile) + "\\Config\\p8panels.config";
|
||||||
|
|
||||||
private static IList<IHook> _hooks = new List<IHook>();
|
private static IList<IHook> _hooks = new List<IHook>();
|
||||||
|
|
||||||
public override string ModuleName => "P8Panels";
|
public override string ModuleName => "P8Panels";
|
||||||
|
|
||||||
public override string AuthorInfo => "ЦИТК";
|
public override string AuthorInfo => "ЦИТК";
|
||||||
|
|
||||||
public override IList<IHook> Hooks => _hooks;
|
public override IList<IHook> Hooks => _hooks;
|
||||||
|
|
||||||
public override bool HasViews => false;
|
public override bool HasViews => false;
|
||||||
|
|
||||||
//Конструктор
|
//Конструктор
|
||||||
@ -168,18 +263,20 @@ namespace P8PanelsParusOnlineExt
|
|||||||
{
|
{
|
||||||
P8Panel panel = pconf.FindPanelByName(name: menuItem.panelName);
|
P8Panel panel = pconf.FindPanelByName(name: menuItem.panelName);
|
||||||
if (panel != null)
|
if (panel != null)
|
||||||
{
|
menuItemsActions.Add(menuItem.name, () => new Sequence().Add<OpenExternalLinkActivity>(new { caption = panel.caption, url = P8PanelUtils.BuildPanelURL(config: pconf, panel: panel) }));
|
||||||
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 }));
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
menuItemsActions.Add(menuItem.name, () => new Sequence().Add<MessageActivity>(new { caption = "Панель не определена", text = $"Панель \"{menuItem.panelName}\" не определена." }));
|
menuItemsActions.Add(menuItem.name, () => new Sequence().Add<MessageActivity>(new { caption = "Панель не определена", text = $"Панель \"{menuItem.panelName}\" не определена." }));
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
_hooks.Add(MainMenuItemBuilderHook.Make(menuItemsActions));
|
_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