Создание Popup окна для просмотра записи справочника

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

Пример отображения данных

Рис. 1. Popup окно с информацией о записи справочника

Методы расширения (интерфейса)

Точка расширения (интерфейс) IObjectPopupLink имеет два основных метода:

  1. public bool CheckType(Type type) – определяет тип объекта, для которого предназначено данное расширение, в качестве параметра передается объект.
  2. 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>
}

Ссылки на элементы API

IObjectPopupLink