Отображение карточки во вкладке и метод IUIHost.ShowCardAsync
Отображение карточки во вкладке и метод IUIHost.ShowCardAsync¶
В ситуации, когда объект карточки был получен необычным образом (т.е. не загружен с сервера, а, например, десериализован из поля другой карточки) может потребоваться отобразить карточку в отдельной вкладке с возможностью сохранить, обновить и пр.
Допустим, мы получаем некоторым образом новую карточку типа “Протокол” с некоторыми заполненными полями, а затем открываем её во вкладке так, как будто это новая карточка, с возможностью её сохранить или закрыть без изменений.
using System;
using System.Threading.Tasks;
using Tessa.Cards;
using Tessa.Cards.ComponentModel;
using Tessa.Files;
using Tessa.Extensions.Default.Shared;
using Tessa.UI;
using Tessa.UI.Cards;
using Tessa.UI.Files;
...
// зависимости можно получить из Unity через конструктор
private readonly Func<ICardEditorModel> createEditorFunc;
private readonly IUIHost uiHost;
private readonly ICardMetadata cardMetadata;
private readonly ICardRepository cardRepository;
...
// как-то получаем карточку, например, создаём её через cardRepository (хотя, например, можно её десериализовать и т.п.)
Guid cardTypeID = DefaultCardTypes.ProtocolTypeID;
var response = await cardRepository.NewAsync(
new CardNewRequest { CardTypeID = cardTypeID },
cancellationToken);
if (!response.ValidationResult.IsSuccessful())
{
TessaDialog.ShowNotEmpty(response.ValidationResult.Build());
return;
}
Card card = response.Card;
card.ID = Guid.NewGuid();
// здесь карточку card можно как угодно изменить (кроме файлов)
card.DynamicEntries.DocumentCommonInfo.Subject = "тема протокола, заполненная автоматически";
// создаём объект SectionRows (без обращения к серверу) для того, чтобы таблицы и списки можно было редактировать;
// если карточка была создана через метод cardRepository.New(), то достаточно вернуть response.SectionRows
var sectionRows = await CardNewStrategy.Default.CreateSectionRowsAsync(
new CardNewContext(cardTypeID, CardNewMode.Default, cardMetadata),
cancellationToken);
// создаём editor и инициализируем его карточкой
var editor = createEditorFunc();
editor.OperationStatusText = "$UI_Common_StatusBar_Status_CardCreatedFromTemplate";
var cardModel = await editor.CreateAndInitializeModelAsync(card, sectionRows, cancellationToken: cancellationToken);
await editor.SetCardModelAsync(cardModel, cancellationToken);
// здесь можно добавить файл
await editor.CardModel.FileContainer
.BuildFile("file.txt")
.SetContentText("content of the file", isLocal: true)
.SetPermissions(FilePermissions.Empty)
.AddWithNotificationAsync(cancellationToken: cancellationToken);
// показываем editor, в заголовке вкладки пишем "Новая карточка"
// если не указать, то будет Digest карточки, например, её номер
await uiHost.ShowCardAsync(
editor.CardModel,
prepareEditorActionAsync: (e, _) => { e.WorkspaceName = "$UI_Common_DefaultDigest_NewCard"; return ValueTask.CompletedTask; },
cancellationToken: cancellationToken);
У методов IUIHost.CreateCardAsync
и IUIHost.OpenCardAsync
есть параметр options
, который совместно с клиентскими расширениями позволяет имитировать создание или открытие карточки любым образом, в т.ч. без обращения к серверу. Используйте описанный выше подход только тогда, когда функциональности этих методов недостаточно.
Например, приведённый выше код аналогичен следующему:
await uiHost.CreateCardAsync(
DefaultCardTypes.ProtocolTypeID,
options: new CreateCardOptions()
{
CardModifierActionAsync = ctx =>
{
// здесь можно изменить поля карточки
Card card = ctx.Card;
card.DynamicEntries.DocumentCommonInfo.Subject = "тема протокола, заполненная автоматически";
return ValueTask.CompletedTask;
},
CardModelModifierActionAsync = async ctx =>
{
// здесь можно добавить файлы
await ctx.CardModel.FileContainer
.BuildFile("file.txt")
.SetContentText("content of the file", isLocal: true)
.SetPermissions(FilePermissions.Empty)
.AddWithNotificationAsync(cancellationToken: ctx.CancellationToken);
}});