Отображение карточки во вкладке и метод IUIHost.ShowCard
Отображение карточки во вкладке и метод IUIHost.ShowCard¶
В ситуации, когда объект карточки был получен необычным образом (т.е. не загружен с сервера, а, например, десериализован из поля другой карточки) может потребоваться отобразить карточку в отдельной вкладке с возможностью сохранить, обновить и пр.
Допустим, мы получаем некоторым образом новую карточку типа “Протокол” с некоторыми заполненными полями, а затем открываем её во вкладке так, как будто это новая карточка, с возможностью её сохранить или закрыть без изменений.
using System;
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 = cardRepository.New(new CardNewRequest { CardTypeID = cardTypeID });
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 = CardNewStrategy.Default.CreateSectionRows(
new CardNewContext(cardTypeID, CardNewMode.Default, cardMetadata));
// создаём editor и инициализируем его карточкой
var editor = createEditorFunc();
editor.OperationStatusText = "$UI_Common_StatusBar_Status_CardCreatedFromTemplate";
editor.CardModel = editor.CreateAndInitializeModel(card, sectionRows);
// здесь можно добавить файл
editor.CardModel.FileContainer
.BuildFile("file.txt")
.SetContentText("content of the file", isLocal: true)
.SetPermissions(FilePermissions.Empty)
.AddWithNotification();
// показываем editor, в заголовке вкладки пишем "Новая карточка"
// если не указать, то будет Digest карточки, например, её номер
uiHost.ShowCard(editor,
prepareEditorAction: e => e.WorkspaceName = "$UI_Common_DefaultDigest_NewCard");
У методов IUIHost.CreateCard
и IUIHost.OpenCard
есть параметры cardModifierAction, cardModelModifierAction, cardEditorModifierAction
, которые совместно с клиентскими расширениями позволяют имитировать создание или открытие карточки любым образом, в т.ч. без обращения к серверу. Используйте описанный выше подход только тогда, когда функциональности этих методов недостаточно.
Например, приведённый выше код аналогичен следующему:
await uiHost.CreateCardAsync(
DefaultCardTypes.ProtocolTypeID,
cardModifierAction: ctx =>
{
// здесь можно изменить поля карточки
Card card = ctx.Card;
card.DynamicEntries.DocumentCommonInfo.Subject = "тема протокола, заполненная автоматически";
},
cardModelModifierAction: ctx =>
{
// здесь можно добавить файлы
ctx.CardModel.FileContainer
.BuildFile("file.txt")
.SetContentText("content of the file", isLocal: true)
.SetPermissions(FilePermissions.Empty)
.AddWithNotification();
});