Открываем сложный отчет с примененным фильтром по кнопке из карточки
Открываем сложный отчет с примененным фильтром по кнопке из карточки¶
Допустим, у вас есть мастер-дитейл отчет (или более сложный), который вы хотите открывать из карточки в новой вкладке по нажатию на тайл левой панели - таким образом, чтобы отфильтровать данные отчета по этой карточке.
Нам необходимо сделать следующее:
-
Создать необходимые вам представления
-
Создать новое Рабочее место, в которое мы добавляем и настраиваем единственный узел - наш отчет в том виде, в каком мы хотим его отображать
-
Указать имя Рабочего места, которое будет отображаться как название вкладки (его можно переопределить, если в имя входит, например, какой-нибудь параметр карточки)
-
Выгружаем созданное Рабочее место в файл. Если оно не используется как постоянное рабочее место, то его можно удалить из списка рабочих мест
-
Открываем файл выгруженного Рабочего места в блокноте, копируем содержимое файла
.jworkplaceи записываем его в поле в расширениях (полеmetadataJsonв примере) или используем выгруженное рабочее место как ресурс сборки -
Делаем расширение на тайл, который будет открывать новую вкладку с отчетом
public sealed class ExampleTileExtension( IDocumentTabManager documentTabManager, IWorkplaceInterpreter workplaceInterpreter) : TileExtension { #region Fields
//метаданные выгруженного рабочего места в формате JSON, строкой или грузим из ресурсов private readonly string metadataJson = "...";
private readonly IDocumentTabManager documentTabManager = NotNullOrThrow(documentTabManager);
private readonly IWorkplaceInterpreter workplaceInterpreter = NotNullOrThrow(workplaceInterpreter);
#endregion
#region Base Overrides
public override void InitializingGlobal(ITileGlobalExtensionContext context) { var contextSource = context.Workspace.LeftPanel;
context.Workspace.LeftPanel.Tiles.Add( new Tile( "ExampleTile", "Имя тайла", context.Icons.Get("Thin123"), context.Workspace.LeftPanel, new DelegateCommand(this.ExampleTileAction)));
}
#endregion }
-
Метод
ExampleTileAction, выполняющий действие при нажатии на тайл, выглядит следующим образом:private async void ExampleTileAction(object obj) { var card = UIContext.Current.CardEditor.CardModel.Card;
// Получение объекта рабочего места по его Метаданным var result = this.workplaceInterpreter.InterpretAsync(this.metadataJson); var workplace = result.ResultWorkplace;
// Изменение отображаемого имени вкладки workplace.Alias = "Новое имя РМ";
// Этот параметр будет передан в метод OpenWorkplace. Система автоматически будет применять его к любым представлениям, у которых есть параметр с таким именем. var param = new RequestParameter("DocID") { ReadOnly = true }.Add(EqualsToCriteriaOperator.Instance, docID);
// Добавление РМ в список отображаемых вкладок // Укажите параметр `treeIsVisible: true`, если необходимо, чтобы дерево представлений в рабочем месте было видно пользователю await documentTabManager.OpenWorkplaceAsync(workplace, [param], treeIsVisible: false); }
-
В классе регистратора
Registratorв методеRegisterUnityрегистрируем расширение:this.UnityContainer .RegisterSingleton<ExampleTileExtension>();
-
Там же в методе
RegisterExtensionsрегистрируем расширение как глобальный тайл:extensionContainer .RegisterExtension<ITileGlobalExtension, ExampleTileExtension>(x => x .WithOrder(ExtensionStage.AfterPlatform) .WithUnity(this.UnityContainer));
-
При нажатии на тайл получаем следующий результат (пример двух связанных представлений)
