Открытие карточки в модальном диалоге
Открытие карточки в модальном диалоге¶
С помощью зависимости IAdvancedCardDialogManager
можно создавать новую или открывать уже существующую карточку. При этом будет возможность вносить изменения в карточку, работать с файлами в карточке, управлять заданиями в карточке. Поддерживаются следующие действия:
-
Создание новой карточки с помощью
ShowNewCardAsync
; -
Открытие существующей карточки с помощью
OpenCardAsync
; -
Открытие карточки по указанной модели или указанному CardEditor с помощью
ShowCard
.
В карточке, открытой в режиме диалога, отсутствуют левая и правая панели с плитками. Вместо них кнопки можно располагать на тулбаре карточки (панель с кнопками наверху), а также внизу.
Пример карточки, открытой в модальном диалоге с тулбаром и нижними кнопками:
Код для отображение диалога:
using (var splash = TessaSplash.Create("Открытие карточки"))
{
IAdvancedCardDialogManager advancedCardDialogManager = ...
IIconContainer iconContainer = ...
await advancedCardDialogManager.OpenCardAsync(
cardID,
typeID,
typeName,
// Необходимо передать объект сплеша, чтобы он закрылся перед открытием диалога
splash: splash,
// Признак того, что при открытии диалога необходимо выполнять UI расширения
executeUIExtensions: true,
cardEditorModifierAction: ctx =>
{
var uiContext = ctx.UIContext;
var editor = ctx.Editor;
// Установка статусбара (нижняя панель с информацией о времени загрузки карточки) видимым
editor.StatusBarIsVisible = true;
editor.Toolbar.Actions.AddRange(
new CardToolbarAction(
"name1",
"Согласовать",
editor.Toolbar.CreateIcon("Thin42", foreground: Colors.Navy),
new DelegateCommand(_ => TessaDialog.ShowMessage("Тестовое сообщение"), _ => false),
captionFontWeight: FontWeights.UltraBold,
captionForeground: Colors.DarkGreen),
new CardToolbarActionGroup(
"name2",
"Необходимо выполнить",
editor.Toolbar.CreateIcon("Thin184"),
isEnabledFunc: () => true,
innerItems: new[]
{
// Настройки внешнего вида для элементов выпадающего меню применены не будут
new CardToolbarAction(
"name3",
"Выполнить сейчас",
new IconViewModel("Thin184", iconContainer),
new DelegateCommand(_ => editor.SaveCardAsync(uiContext))),
new CardToolbarAction(
"name4",
"Выполнить позже",
new IconViewModel("Thin185", iconContainer),
new DelegateCommand(_ => editor.RefreshCardAsync(uiContext))),
}));
editor.BottomDialogButtons.AddRange(
new[]
{
new UIButton(
"Нижняя кнопка сохранить",
isDefault: true,
buttonActionAsync: async btn =>
{
await editor.SaveCardAsync(uiContext);
await btn.CloseAsync();
}),
new UIButton("$UI_Common_Cancel", isCancel: true),
});
});
}
В расширениях можно также модифицировать кнопки тулбара и кнопки внизу диалога:
using System.Threading.Tasks;
using Tessa.Platform.Collections;
using Tessa.UI;
using Tessa.UI.Cards;
public sealed class ModifyToolbarCardUIExtension : CardUIExtension
{
public override Task Initialized(ICardUIExtensionContext context)
{
var uiContext = UIContext.Current;
var editor = uiContext.CardEditor;
// Доступно как для диалогов, так и для карточек, открытых во вкладке
context.ToolbarActions?.Add(
new CardToolbarAction(
"New",
"Сохранить",
context.UIContext.CardEditor.Toolbar.CreateIcon("Thin285"),
new DelegateCommand(_ => TessaDialog.ShowMessage("added in UIExt")))
);
// Доступно только для диалогов
context.BottomDialogButtons?.AddRange(
new UIButton(
"$UI_Common_OK",
isDefault: true,
buttonActionAsync: async btn =>
{
await editor.SaveCardAsync(uiContext);
await btn.CloseAsync();
}),
new UIButton("$UI_Common_Cancel", isCancel: true)
);
return Task.CompletedTask;
}
}
Для фильтрации расширений на расширения для диалогов/вкладки необходимо при регистрации воспользоваться следующими методами расширений
-
WhenNoDialog()
- не выполнять расширений для диалогов, а только для вкладки; -
WhenAnyDialog()
- выполнять для любых диалогов, но не для вкладки; -
WhenDefaultDialog()
- выполнять только для диалогов со стандартным именемCardUIHelper.DefaultDialogName
; -
WhenDialog(params stirng[] dialogNames)
- выполнять для диалогов с указанныи именами.
Пример использования:
extensionContainer
.RegisterExtension<ICardUIExtension, DialogUIExtension>(x => x
.WithOrder(ExtensionStage.AfterPlatform, 3)
.WithUnity(this.UnityContainer)
.WhenDefaultDialog())
Дополнительные примеры использования содержаться в расширениях Tessa.Extensions.Default.Client.UI.CarUIExtension
(открытие карточки сотрудника по двойному клику в диалоге) и в Tessa.Extensions.Default.Client.UI.CreateAndSelectToolbarUIExtension
.
Использование диалогов может быть полезно в следующих ситуациях:
-
Работа со справочниками: создание и выбор нового элемента прямо из диалога выбора.
-
Файлы, приложенные к заданию: тут тоже можно попробовать открывать в диалоге.
-
Создание связанных объектов. Например, создать ДС к договору, не покидая карточку диалога.
-
Создание сложных инициализационных диалогов – мастеров. Например, по нажатию на процессный тайл показываем диалог с возомжностью задать кучу параметров, приложить файлы и стартовать процесс.
-
Просто создания диалогов, которые поддерживают работу с файлами. Например, какие-нибудь сложные сканирования, верификации и т.п.
-
Создать карточку отчета с файлами при завершении задания в диалоге.