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

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

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

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

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

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

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

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

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

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

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

    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 }

  7. Метод 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); }

  8. В классе регистратора Registrator в методе RegisterUnity регистрируем расширение:

    this.UnityContainer .RegisterSingleton<ExampleTileExtension>();

  9. Там же в методе RegisterExtensions регистрируем расширение как глобальный тайл:

    extensionContainer .RegisterExtension<ITileGlobalExtension, ExampleTileExtension>(x => x .WithOrder(ExtensionStage.AfterPlatform) .WithUnity(this.UnityContainer));

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

Back to top