Добавление колонок таблицы в стандартный элемент «Dynamic Grid»

В системе имеется возможность добавить колонки в динамически формируемую таблицу, сформировав разметку для нее на стороне сервера. Расширить можно любую DynamicGrid, если у неё задействован метод «ApplyExtensions», такой таблицей, например, является таблица с задачами.

Пример отображения данных в системной таблице с задачами

 

Рис. 1. Добавление колонки к гриду со списком задач в портлете «Задачи»

Рис. 2. Добавление колонки к гриду со списком задач

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

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

  1. bool MatchUniqueName(string uniqueName)– определяет таблицу, для которой предназначено данное расширение, в качестве параметра передается уникальное имя расширения.
  2. public void Apply<T>(EleWise.ELMA.Web.Mvc.Html.Grids.DynamicGridBuilder<T> builder) where T : class – определяет действия, которые необходимо произвести для построителя таблицы. В нашем примере добавляются 2 колонки, для каждой из которых формируется разметка.
  3. Дополнительный метод «public int MaxOrder()» предназначен для задания позиции колонки редактирования. Это необходимо для того, чтобы при добавлении новых колонок в грид в веб-части, колонки с редактированием и удалением записи всегда находились последними.

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

[Component]
public class DynamicGridExtensionAll : IDynamicGridExtension
{
 public bool MatchUniqueName(string uniqueName)
 {
  if (uniqueName == "AllTasks" || uniqueName == "MyTasksPortletGrid") //Будет применено к гридам задач и к гриду в портлете с задачами
   return true;
  else return false;
 }

 public void Apply<T>(DynamicGridBuilder<T> builder) where T : class
 {
  var moduleGridBuilder = GetUid(builder);
  var workflowActions = new TaskWorkflowActions();
   
  Func<int> order = MaxOrder;
  if (moduleGridBuilder != null) // Применение только к тем объектам, которые указаны в функции GetUid
  {
   Func<ITask, MvcHtmlString> column = task =>
   {
    if (task == null || !workflowActions.IsAvailableEdit(TaskBaseManager.Instance.LoadOrNull(task.Id), UserManager.Instance.GetCurrentUser())) //Проверка прав на редактирование задачи
     return MvcHtmlString.Empty;
    return MvcHtmlString.Create(
      String.Format(@"<a href=""{0}"">{1}</a>",
       builder.Html.Url().Action("Edit", "Task", new
       {
        area = "EleWise.ELMA.BPM.Web.Tasks",
        id = task.Id
       }),
       builder.Html.Image("#x16/edit.png", SR.T("Редактировать"))
       )
      );
   };
   var lastColumn = builder.Grid.Columns.Count;
   builder.Columns(
    c => c.Insert(
     lastColumn,
     m => column(m as ITask)
      , columnOrder: order).Width("1%").NotSortable().NotResizable());
  }
 }

 public int MaxOrder()
 {
  return int.MaxValue;
 }

 public Guid? GetUid<T>(EleWise.ELMA.Web.Mvc.Html.Grids.DynamicGridBuilder<T> builder) where T : class
 {
  if (builder is DynamicGridBuilder<ITaskBase>) return InterfaceActivator.UID<ITaskBase>();
  return null;
 }
}

Чтобы указать верный uniqueName, необходимо найти в исходных файлах веб-части представление с гридом (обычно имя файла называется Grid.cshtml) и найти метод «ApplyExtensions» (рисунок 4).

Рис. 3. Метод «ApplyExtensions» в представлении с гридом

В данном примере необходимо обратить внимание на функцию GetUid<T>(EleWise.ELMA.Web.Mvc.Html.Grids.DynamicGridBuilder<T> builder), которая возвращает UID типа ITaskBase, что означает следующее: данное расширение будет применено только к объектам типа ITaskBase.

В методе Apply происходит отрисовка таблицы следующим образом: колонка отрисовывается всегда, но иконка «карандаша» появится только в том случае, если тип задачи соответствует типу ITask (Пользовательская задача-поручение) и у пользователя есть права на редактирование этой задачи.

Важное примечание
изменения коснутся не только системной таблицы со списком задач, но и всех остальных таблиц, в которых задействован метод «ApplyExtensions» и в которых есть объекты типа ITaskBase.

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

IDynamicGridExtension