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

Отображение карточки во вкладке и метод 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); }});

Back to top