logo

[ELMA3] Последняя активность по различным типам объектов

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

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

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

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

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

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

Точка расширения (интерфейс) ILastObjectProvider имеет следующие методы:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/// <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

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
30
31
[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 (данное представление является страницей проекта) следующий код:

1
2
3
4
5
6
7
8
@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 имеет следующие методы:

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
30
31
32
33
34
35
36
37
38
/// <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

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
30
31
32
33
[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:

1
2
3
4
5
6
@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:

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
30
31
@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>

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

  • ILastObjectProvider (для версии 3.13, 3.15, 4.0);
  • ILastObjectRenderer (для версии 3.13, 3.15, 4.0).

Прикрепленные файлы