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

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

Back to top