Перейти к содержанию

Открываем сложный отчет с примененным фильтром по кнопке из карточки

Открываем сложный отчет с примененным фильтром по кнопке из карточки

Допустим, у вас есть мастер-дитейл отчет (или более сложный), который вы хотите открывать из карточки в новой вкладке по нажатию на тайл левой панели - таким образом, чтобы отфильтровать данные отчета по этой карточке.

Нам необходимо сделать следующее:

  1. Создать необходимые вам представления

  2. Создать новое Рабочее место, в которое мы добавляем и настраиваем единственный узел - наш отчет в том виде, в каком мы хотим его отображать

  3. Указать имя Рабочего места, которое будет отображаться как название вкладки (его можно переопределить, если в имя входит, например, какой-нибудь параметр карточки)

  4. Выгружаем созданное Рабочее место в файл. Если оно не используется как постоянное рабочее место, то его можно удалить из списка рабочих мест

  5. Открываем файл выгруженного Рабочего места в блокноте, копируем содержимое файла и записываем его в поле в расширениях (поле metadata в примере) или используем выгруженное рабочее место как ресурс сборки

  6. Делаем расширение на тайл, который будет открывать новую вкладку с отчетом

    public sealed class ExampleTile : TileExtension { #region Constants

    private const string ExampleTitle = "ExampleTile"; string metadata = "..."; //метаданные выгруженного рабочего места, строкой или грузим из ресурсов

    #endregion

    #region Constructors

    private readonly IDocumentTabManager documentTabManager; private readonly IWorkplaceInterpreter workplaceInterpreter;

    public ExampleTile ( IDocumentTabManager documentTabManager, IWorkplaceInterpreter workplaceInterpreter ) { this.documentTabManager = documentTabManager; this.workplaceInterpreter = workplaceInterpreter; }

    #endregion

    #region Base Overrides

    public override void InitializingGlobal(ITileGlobalExtensionContext context) { ITileContextSource contextSource = context.Workspace.LeftPanel;

    context.Workspace.LeftPanel.Tiles.Add( new Tile( ExampleTitle, "Имя тайла", context.Icons.Get("Thin##"), contextSource, new DelegateCommand(ExampleTileAction) ));

    }

    #endregion }

  7. Метод ExamleTileAction, выполняющий действие при нажатии на тайл выглядит следующим образом

    private void ExampleTileAction(object obj) { var card = UIContext.Current.CardEditor.CardModel.Card;

    // Получение объекта рабочего места по его Метаданным var result = this.workplaceInterpreter.InterpretWorkplace(metadata); var workplace = result.ResultWorkplace;

    // Изменение отображаемого имени вкладки workplace.Alias = "Новое имя РМ";

    var crit = new RequestCriteria(); crit.CriteriaName = "Equality"; crit.Values.Add(new CriteriaValue() { Value = docID, Text = docID.ToString()});

    // Этот параметр будет передан в метод OpenWorkplace. Система автоматически будет применять его к любым представлениям, у которых есть параметр с таким именем. var param = new RequestParameterBuilder(true) .WithMetadata(new ViewParameterMetadata() { Alias = "DocID" }) .AddCriteria(crit) .AsRequestParameter();

    // Добавление РМ в список отображаемых вкладок // Последний параметр можно поменять на Visibility.Visible, если необходимо, чтобы Дерево представлений РМ было видно

    documentTabManager.OpenWorkplace(workplace, new RequestParameter[] { param }, true, true, Visibility.Collapsed); }

  8. Регистрируем данное расширение на тайл следующим образом

    .RegisterExtension<ITileGlobalExtension, ExampleTile>(x => x .WithOrder(ExtensionStage.AfterPlatform) .WithUnity(unityContainer .RegisterType< ExampleTile>(new ContainerControlledLifetimeManager(), new InjectionConstructor( typeof(IDocumentTabManager), typeof(IWorkplaceInterpreter) ))))

  9. При нажатии на тайл получаем следующий результат (пример двух связанных представлений)

Back to top