[ELMA3] Добавление колонок таблицы в стандартный элемент "Dynamic Grid"
В системе имеется возможность добавить колонки в динамически формируемую таблицу, сформировав разметку для нее на стороне сервера. Расширить можно любую DynamicGrid, если у неё задействован метод ApplyExtensions, такой таблицей, например, является таблица с задачами.
Пример отображения данных в системной таблице с задачами
Рис. 1. Добавление колонки списку задач в системном портлете "Задачи"
Рис. 2. Добавление колонки к таблице со списком задач
Методы расширения (интерфейса)
Точка расширения (интерфейс) IDynamicGridExtension имеет два основных метода:
- bool MatchUniqueName(string uniqueName) – определяет таблицу, для которой предназначено данное расширение, в качестве параметра передается уникальное имя расширения.
- public void Apply<T>(EleWise.ELMA.Web.Mvc.Html.Grids.DynamicGridBuilder<T> builder) where T : class – определяет действия, которые необходимо произвести для построителя таблицы. В нашем примере добавляются две колонки, для каждой из которых формируется разметка.
- Дополнительный метод 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 (Пользовательская задача-поручение) и у пользователя есть права на редактирование этой задачи.