Расширения визуализатора
Расширения визуализатора¶
Визуализатор типового процесса исполнения (задач) позволяет задействовать расширения IWfResolutionVisualizationExtension, изменяющие внешний вид узлов визуализатора, связанный с каждой из отображаемых задач. Такие изменения могут включать как простые изменения (цвет фона и шрифта), так и возможность отобразить произвольный контент в левой и/или правой области узла.
В примере ниже для каждой задачи, автором которой является текущий сотрудник, меняется цвет фона, в левой области выводится иконка “избранное” с датой постановки задачи, а в правой области выводится текст “я автор”.
Напишем класс расширения, получающий сессию сотрудника ISession
из Unity, а затем в методе OnNodeGenerated
изменим узел context.Node
, сгенерированный визуализатором для записи в истории context.HistoryItem
.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Tessa.Extensions.Default.Client.Workflow.Wf;
using Tessa.Platform.Runtime;
using Tessa.UI.WorkflowViewer;
public sealed class VisualizationExtension : WfResolutionVisualizationExtension
{
public VisualizationExtension(ISession session)
{
this.session = session;
}
private readonly ISession session;
public override void OnNodeGenerated(IWfResolutionVisualizationContext context)
{
// если текущий пользователь не является автором визуализируемой задачи, то ничего не меняем
if (context.HistoryItem.AuthorID != this.session.User.ID)
{
return;
}
// устанавливаем цвет фона узла
context.Node.Background = Brushes.Aquamarine;
// задаём функцию, создающую левую область как картинку с текстом
Func<object> createLeftAreaFunc = () =>
{
var imageSource = new BitmapImage();
imageSource.BeginInit();
imageSource.UriSource = new Uri("pack://application:,,,/Tessa.UI;component/Images/favorite.ico");
imageSource.EndInit();
var image = new Image { Width = 16.0, Source = imageSource };
var text = new TextBlock
{
Text = FormattingHelper.FormatDate(context.HistoryItem.Created),
Foreground = Brushes.Gray,
HorizontalAlignment = HorizontalAlignment.Center,
Margin = new Thickness(0.0, 5.0, 0.0, 0.0),
};
var panel = new StackPanel { Orientation = Orientation.Vertical };
panel.Children.Add(image);
panel.Children.Add(text);
return panel;
};
// устанавливаем левую и правую области, правая область будет просто текстом
context.Node.ExtendContent(createLeftAreaFunc, createRightAreaFunc: () => "Я автор");
// если в области нужен только текст или другой объект, не связанный с UI (т.е. ViewModel),
// то можно использовать перегрузку метода, просто передав в него текст или объект:
//context.Node.ExtendContent("Left\narea");
}
}
Класс регистрируется обычным для расширений образом, при этом указываются тип расширения IWfResolutionVisualizationExtension
и способ регистрации расширения в Unity.
extensionContainer
.RegisterExtension<IWfResolutionVisualizationExtension, VisualizationExtension>(x => x
.WithOrder(ExtensionStage.AfterPlatform, 1)
.WithUnity(unityContainer
.RegisterType<VisualizationExtension>(new ContainerControlledLifetimeManager())))
;
Аналогичным образом можно написать расширение, которое задаёт произвольный контент в зависимости от любой информации в задании или в карточке, а также на основании произвольной информации, полученной с сервера при загрузке карточки и сохранённой в Info
карточки или записи в истории заданий.
Если задаваемый контент представлен в виде объектов WPF, таких как Image и TextBlock, то рекомендуется передавать в метод INode.ExtendContent()
функцию, создающую и возвращающую объекты UI. Это позволяет корректно разместить в визуальном дереве такие объекты одновременно для нормального и развёрнутого состояния узла. Для отображения строки текста или модели представления ViewModel, которая связывается с объектами UI через DataTemplate (паттерн MVVM), достаточно передать такие объекты в метод INode.ExtendContent()
без использования функций.
Если размер дополнительного контента в левой или правой области достаточно большой, то может потребоваться увеличить размер узла для корректного отображения узлов по умолчанию.
context.Node.Width = 144.0;
При необходимости получить какую-либо информацию из базы данных в процессе визуализации, эту информацию можно сначала загрузить в расширении CardRequestExtension
с типом DefaultRequestTypes.GetResolutionVisualizationData
, а затем переместить информацию в текущий контекст карточки, чтобы расширения на визуализатор смогли её получить.
Note
Пример расширения, загружающего информацию из базы данных для визуализации задач, есть в расширении Tessa.Extensions.Default.Server.Workflow.Wf.WfGetResolutionVisualizationDataRequestExtension.