[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> }