[ELMA3] Создание Popup окна для просмотра записи справочника
В статье приведен пример создания Popup окна с информацией о записи справочника Категория задач и вывод дополнительной информации в разметку Popup окна (в данном примере – первые 10 активных задач текущего пользователя).
Пример отображения данных

Рис. 1. Popup окно с информацией о записи справочника
Методы расширения (интерфейса)
Точка расширения (интерфейс) IObjectPopupLink имеет два основных метода:
- public bool CheckType(Type type) – определяет тип объекта, для которого предназначено данное расширение, в качестве параметра передается объект.
- public string Url(RequestContext context, object obj) – возвращает строку, содержащую адрес Popup окна объекта.
Пример класса точки расширения
using System;
using System.Linq;
using System.Web.Mvc;
using System.Web.Routing;
using EleWise.ELMA.ComponentModel;
using EleWise.ELMA.Extensions;
using EleWise.ELMA.Model.Entities;
using EleWise.ELMA.Model.Services;
using EleWise.ELMA.Web.Mvc.ExtensionPoints;
namespace ObjectIconModule.Web.ExtensionPoint
{
[Component(Order = 1)] //Order - это порядок сортировки компонента. При переборе компонентов в момент использования чем ниже Order тем раньше этот компонент будет обработан.
public class ObjectPopup : IObjectPopupLink
{
public bool CheckType(Type type)
{
return InterfaceActivator.UID(type) == InterfaceActivator.UID<ITaskCategory>();
}
public string Url(RequestContext context, object obj)
{
var urlHelper = new UrlHelper(context);
var uid = InterfaceActivator.UID(obj.GetType().GetTypeWithoutProxy());
return urlHelper.Action("ViewItemPopup", "Home", new { area = RouteProvider.AreaName, id = ((IEntity)obj).GetId(), obj, uid, inPopUp = true });
}
}
}
Если необходимо использовать данную точку расширения, например, для всех справочников, то в методе public bool CheckType(Type type) можно просто вернуть true или перечислить типы тех справочников, для которых нужно применить данную точку расширения.
В данном примере используется ссылка на действие ViewItemPopup в контроллере Home, код которого приведен ниже.
Код контроллера HomeController.cs:
public ActionResult ViewItemPopup(long id, object obj, Guid uid, bool inPopUp)
{
var model = new CatalogItemModel();
var type = IMetadataRuntimeService.GetTypeByUid(uid);
var metadata = (ClassMetadata)MetadataLoader.LoadMetadata(type, false);
model.CatalogName = metadata.DisplayName;
model.Id = id;
model.ViewType = EleWise.ELMA.Model.Views.ViewType.Display;
var manager = ModelHelper.GetEntityManager(type);
model.Entity = (IEntity)manager.Load(model.Id);
model.TypeUid = uid;
model.InPopUp = inPopUp;
return (ActionResult)PartialView("ViewItemPopup", model);
}
В приведенном примере контроллер возвращает представление ViewItemPopup.cshtml, в котором находится Ваша разметка. В данном примере разметкой являются все поля записи справочника, а также первые 10 активных задач текущего пользователя. В примере использовалась следующая разметка:
@model EleWise.ELMA.BPM.Web.Common.Models.CatalogItemModel
@using EleWise.ELMA.Web.Mvc.ExtensionPoints
@using EleWise.ELMA.Security.Managers
@using EleWise.ELMA.Tasks.Managers
@using EleWise.ELMA.Model.Services
@using EleWise.ELMA.Tasks.Models
@using EleWise.ELMA.Web.Mvc.ExtensionPoints
@using (Html.ElmaForm())
{
@Html.TableFormStart()
@Html.DisplayFor(m => m.Entity, "Object")
@Html.TableFormEnd()
}
@{
var category = TaskCategoryManager.Instance.LoadOrNull((long)Model.Id);
var filter = InterfaceActivator.Create<ITaskBaseFilter>();
filter.Category = category;
filter.Executor = UserManager.Instance.GetCurrentUser();
var tasks = TaskBaseManager.Instance.Find(filter, null).Where(a => a.IsActive()).ToList().Take(10);
}
<p style="padding-left: 10px;">Первые 10 задач этой категории:</p>
@foreach (var item in tasks)
{
<div style="padding-left: 10px; padding-top: 3px;">
<a href=@Url.Entity(@item.TypeUid,@item.Id.ToString())>@item.Subject</a>
</div>
}