Создание собственного счетчика данных в меню

В статье приведен пример создания собственного счетчика данных в разделе Проекты. Данный счетчик отображает количество текущих проектов. Данную точку расширения можно применить только к простым пунктам меню (без дополнительной разметки, например, без фильтров под пунктом меню).

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

Рис. 1. Счетчик текущих проектов для пункта меню «Проекты»

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

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

/// <summary>
/// Имеет ли элемент меню текст для количества
/// </summary>
/// <param name="item">Элемент меню для построения дерева</param>
/// <returns></returns>
bool HasCountEvaluator(MenuItemNode item);

/// <summary>
/// Указывает, нужно ли периодически обновлять данные с клиента
/// </summary>
/// <param name="item">Элемент меню для построения дерева</param>
/// <returns></returns>
bool NeedUpdate(MenuItemNode item);

/// <summary>
/// Возращает текст для количества элемента меню
/// </summary>
/// <param name="item">Элемент меню для построения дерева</param>
/// <returns></returns>
MenuItemCount Evaluate(MenuItemNode item);

Пример класса точки расширения

[Component]
public class ProjectMenuItemEvaluator : IMenuItemCountEvaluator
{
    public bool HasCountEvaluator(MenuItemNode item)
    {
        return item.Code == "ProjectsModule";
    }

    public bool NeedUpdate(MenuItemNode item)
    {
        return false;
    }

    public MenuItemCount Evaluate(MenuItemNode item)
    {
    var filter = InterfaceActivator.Create<IProjectFilter>();
    filter.Status = ProjectStatus.Active;
    var count = ProjectManager.Instance.Find(filter, null).Count(a => !a.IsTemplate());
    return new MenuItemCount
    {
        Count = count.ToString(CultureInfo.InvariantCulture)
    };
}
 
Примечание
Для того, чтобы применить данную точку расширения к нужному пункту меню, необходимо указать в методе public bool HasCountEvaluator(MenuItemNode item) правильное значение, например, Code (код элемента) или Name (название пункта меню). Наиболее надежным способом является указание значения с помощью Code, так как не будет никаких проблем при разных локализациях или одинаковых названиях пунктов меню. Для того, чтобы найти нужный Code меню, необходимо "исследовать элемент в разметке" и найти его Code, пример представлен на рис. 2.

Рис. 2. Code элемента меню «Проекты»

Для счетчика можно применять стили отображения, например, сделать счетчик красным, в зависимости от условий. Сделать это можно следующим образом:

public MenuItemCount Evaluate(MenuItemNode item)
{
    var filter = InterfaceActivator.Create<IProjectFilter>();
    filter.Status = ProjectStatus.Active;
    var count = ProjectManager.Instance.Find(filter, null).Count(a => !a.IsTemplate());

    return new MenuItemCount
    {
        Count = count.ToString(CultureInfo.InvariantCulture),
        CssClass = (count > 5) ?  "important" : ""
    };
}

В данном примере счетчик будет красного цвета, если количество найденных текущих проектов больше пяти. Пример работы стиля представлен на рис. 3.

Рис. 3. Применение стиля отображения для счетчика меню

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

IMenuItemCountEvaluator.