[ELMA3] Последняя активность по различным типам объектов
В статье приведен пример добавления объекта Проект в портлет Последняя активность. Приведен пример реализации собственной разметки отображения записей объекта, а также пример реализации контекстного меню.
Пример отображения данных

Рис. 1. Объект «Проект» в настройках портлета «Последняя активность»

Рис. 2. Данные по проектам в портлете «Последняя активность»

Рис. 3. Данные по проектам в портлете «Последняя активность» с пользовательской разметкой и контекстным меню
Методы расширения (интерфейса) ILastObjectProvider
Точка расширения (интерфейс) ILastObjectProvider имеет следующие методы:
/// <summary>
/// Идентификатор типа объекта
/// </summary>
Guid TypeUid { get; }
/// <summary>
/// Отображаемое имя
/// </summary>
string DisplayName { get; }
/// <summary>
/// Добавить информацию
/// </summary>
/// <param name="entity">Сущность</param>
void AddInfo(IEntity<long> entity);
/// <summary>
/// Удалить информацию
/// </summary>
/// <param name="entity">Сущность</param>
void RemoveInfo(IEntity<long> entity);
Пример класса точки расширения ILastObjectProvider
[Component]
public class LastObjectProvider : ILastObjectProvider
{
public Guid TypeUid
{
get { return InterfaceActivator.UID<IProject>(); }
}
public string DisplayName
{
get { return SR.T("Проекты"); }
}
public void AddInfo(IEntity<long> entity)
{
LastObjectInfoManager.Instance.AddInfo(new ReferenceOnEntity
{
ObjectTypeUId = TypeUid,
ObjectId = entity.Id
});
}
public void RemoveInfo(IEntity<long> entity)
{
LastObjectInfoManager.Instance.RemoveInfo(new ReferenceOnEntity
{
ObjectTypeUId = TypeUid,
ObjectId = entity.Id
});
}
}
Для того чтобы в портлете «Последняя активность» начали отображаться данные, необходимо добавить в представление \Web\Modules\EleWise.ELMA.Projects.Web\Views\Project\AllInfo.cshtml (данное представление является страницей проекта) следующий код:
@using EleWise.ELMA.BPM.Web.Common.Models
@using EleWise.ELMA.Model.Services
@Html.LastObjectHandler(new LastObjectInfoModel
{
ObjectId = Model.Project.Id,
ObjectType = InterfaceActivator.UID<IProject>()
})
Теперь при переходе на данное представление (на страницу проекта) запись добавится в портлет «Последняя активность», например, после создания нового проекта или при переходе в уже существующий проект.
В базовой реализации точки расширения ILastObjectProvider записи будут представлены просто в виде ссылки на объект (представлено на рисунке 2). Чтобы сформировать собственное отображение записи объекта, необходимо реализовать точку расширения ILastObjectRenderer. В примере реализации собственной разметки добавлено контекстное меню, а также добавлена иконка объекта.
Методы расширения (интерфейса) ILastObjectRenderer
Точка расширения (интерфейс) ILastObjectRenderer имеет следующие методы:
/// <summary>
/// Идентификатор типа объекта
/// </summary>
Guid TypeUid { get; }
/// <summary>
/// Рендер объекта
/// </summary>
/// <param name="helper">Хелпер</param>
/// <param name="entity">Ссылка на сущность</param>
MvcHtmlString Render(HtmlHelper helper, ReferenceOnEntity entity);
/// <summary>
/// Надо ли контекстное меню
/// </summary>
/// <param name="entity">Ссылка на сущность</param>
/// <returns><c>true</c> если контекстное меню нужно</returns>
bool HasContextMenu(ReferenceOnEntity entity);
/// <summary>
/// Имя контекстного меню
/// </summary>
string ContextMenuName { get; }
/// <summary>
/// Подсчет видимости меню
/// </summary>
/// <param name="helper">Хелпер</param>
/// <param name="entity">Ссылка на сущность</param>
/// <returns>Список элементов меню, которые будут невидимыми</returns>
List<string> NotVisibleItems(HtmlHelper helper, ReferenceOnEntity entity);
/// <summary>
/// Рендер контекстного меню (если надо)
/// </summary>
/// <param name="helper">Хелпер</param>
/// <param name="entity">Ссылка на сущность</param>
void RenderContextMenu(HtmlHelper helper, ReferenceOnEntity entity);
Пример класса точки расширения ILastObjectRenderer
[Component]
public class ProjectLastObjectRenderer : ILastObjectRenderer
{
public Guid TypeUid
{
get { return InterfaceActivator.UID<IProject>(); }
}
public MvcHtmlString Render(HtmlHelper helper, ReferenceOnEntity entity)
{
return helper.Partial("LastObjectProject", entity.Object);
}
public bool HasContextMenu(ReferenceOnEntity entity)
{
return true;
}
public void RenderContextMenu(HtmlHelper helper, ReferenceOnEntity entity)
{
helper.RegisterContent("ProjectOperations", (d) => helper.Partial("ProjectOperations", entity.Object));
}
public string ContextMenuName
{
get { return "ProjectContextMenu"; }
}
public List<string> NotVisibleItems(HtmlHelper helper, ReferenceOnEntity entity)
{
return null;
}
}
В методе public MvcHtmlString Render(HtmlHelper helper, ReferenceOnEntity entity) происходит ссылка на представление LastObjectProject, в котором находится разметка для отображения записей объекта. Данное представление необходимо создать в папке Shared Вашего модуля.
Пример кода представления LastObjectProject:
@model IProject @using EleWise.ELMA.Projects.Models @using EleWise.ELMA.Web.Mvc.ExtensionPoints @Html.Image(Url.ObjectIcon(ObjectIconFormat.x16, Model), "") <a href="@Url.Entity(Model)">@Model.Name</a>
В методе public void RenderContextMenu(HtmlHelper helper, ReferenceOnEntity entity) происходит регистрация содержимого в представлении ProjectOperations. Это необходимо для реализации контекстного меню.
Пример кода представления ProjectOperations:
@model IProject
@using EleWise.ELMA.Projects.Models
@using EleWise.ELMA.Web.Mvc.ExtensionPoints
@using EleWise.ELMA.Web.Mvc.Models.ActionItems.Menu
@{
var projectMenu = new ActionMenu("projectmenu")
{
Items =
{
new ActionMenuItem("editProject")
{
Text = SR.T("Редактировать"),
Url = Url.Action("Edit", "Project", new { area = "EleWise.ELMA.Projects.Web", id = Model.Id }),
IconUrl = "#x16/edit.png"
}
}
};
}
@Html.ActionMenu(projectMenu)
<script type="text/javascript">
$(function() {
$(".ProjectContextMenu").live("mouseup", function(e) {
elma.ElmaMenuMgr.show(’projectmenu’, { id: $(this).attr("objectId") }, this , ’’, {notvisible: null}, false);
});}
);
</script>