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

Расширение на контекстное меню файла в карточке

Расширение на контекстное меню файла в карточке

Допустим, требуется написать расширение, изменяющее категорию сразу нескольких выделенных файлов при условии, что система умеет изменять категорию только единственного файла (в текущей версии). Для этого надо написать расширение на меню файла IFileExtension, в котором добавить MenuAction для действия, и указать его видимость в параметре isCollapsed.

Note

Начиная со сборки 2.4 уже присутствует функционал по изменению категории для нескольких выбранных файлов. Приведённое расширение следует рассматривать как пример реализации такого функционала, в проектных расширения добавлять его не следует.

using System.Linq; using System.Threading; using System.Threading.Tasks; using Tessa.Files; using Tessa.Platform.Validation; using Tessa.UI; using Tessa.UI.Files; using Tessa.UI.Files.Controls; using Tessa.UI.Menu;

public sealed class ChangeCategoryMultipleFileExtension : FileExtension { public override Task OpeningMenu(IFileExtensionContext context) { context.Actions.Add( new MenuAction( "ChangeCategoryMultiple", "$UI_Controls_FilesControl_ChangeCategory", context.Icons.Get("Thin131"), new DelegateCommand(async o => await ChangeFileCategoryMultipleAsync(context.Control, context.Files)), isCollapsed: !context.Control.IsCategoriesEnabled || context.Files.Count < 2 || context.Files.Any(file => !file.Permissions.CanModifyCategory)));

return Task.CompletedTask; }

private static async Task ChangeFileCategoryMultipleAsync(IFileControl control, IFileCollection files, CancellationToken cancellationToken = default) { (IFileCategory category, bool categoryIsCanceled) = await FileControlHelper.SelectFileCategoryAsync(control, false, cancellationToken);

if (categoryIsCanceled) { return; }

var totalResult = new ValidationResultBuilder();

foreach (IFile file in files) { ValidationResult result = await file.ChangeCategoryAsync(category, cancellationToken); totalResult.Add(result); }

TessaDialog.ShowNotEmpty(totalResult.Build()); } }

Important

Метод расширения OpeningMenu будет вызван каждый раз при открытии контекстного меню, поэтому обращаться на сервер в этом методе крайне не рекомендуется. Но любой вызов сервера можно выполнить внутри команды DelegateCommand, при этом интерфейсы сервисов можно получить через конструктор.

Код регистрации:

using Tessa.Extensions; using Tessa.UI.Files;

[Registrator] public sealed class Registrator : RegistratorBase { public override void RegisterExtensions(IExtensionContainer extensionContainer) { extensionContainer .RegisterExtension<IFileExtension, ChangeCategoryMultipleFileExtension>(x => x .WithOrder(ExtensionStage.AfterPlatform, 1) .WithSingleton()) ; } }

Расширения на меню контрола файлов IFileControlExtension и на меню версии файла IFileVersionExtension пишутся аналогичным образом.

Back to top