[ELMA3] Создание Popup окна для просмотра записи справочника
В статье приведен пример создания Popup окна с информацией о записи справочника Категория задач и вывод дополнительной информации в разметку Popup окна (в данном примере – первые 10 активных задач текущего пользователя).
Пример отображения данных
Рис. 1. Popup окно с информацией о записи справочника
Методы расширения (интерфейса)
Точка расширения (интерфейс) IObjectPopupLink имеет два основных метода:
- public bool CheckType(Type type) – определяет тип объекта, для которого предназначено данное расширение, в качестве параметра передается объект.
- public string Url(RequestContext context, object obj) – возвращает строку, содержащую адрес Popup окна объекта.
Пример класса точки расширения
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 активных задач текущего пользователя. В примере использовалась следующая разметка:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | @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> } |