diff --git a/src/Umbraco.Core/Trees/ISearchableTreeWithCulture.cs b/src/Umbraco.Core/Trees/ISearchableTreeWithCulture.cs new file mode 100644 index 0000000000..6ac4ea3be1 --- /dev/null +++ b/src/Umbraco.Core/Trees/ISearchableTreeWithCulture.cs @@ -0,0 +1,21 @@ +using Umbraco.Cms.Core.Models.ContentEditing; + +namespace Umbraco.Cms.Core.Trees +{ + [Obsolete("This interface will be merged into ISearchableTree in Umbraco 12")] + public interface ISearchableTreeWithCulture : ISearchableTree + { + /// + /// Searches for results based on the entity type + /// + /// + /// + /// + /// + /// A starting point for the search, generally a node id, but for members this is a member type alias + /// + /// + /// + Task SearchAsync(string query, int pageSize, long pageIndex, string? searchFrom = null, string? culture = null); + } +} diff --git a/src/Umbraco.Web.BackOffice/Controllers/EntityController.cs b/src/Umbraco.Web.BackOffice/Controllers/EntityController.cs index a3716f53aa..08286108c7 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/EntityController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/EntityController.cs @@ -204,6 +204,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers return result; } + var culture = ClientCulture(); var allowedSections = _backofficeSecurityAccessor.BackOfficeSecurity?.CurrentUser?.AllowedSections.ToArray(); var searchTasks = new List(); @@ -221,7 +222,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers var rootNodeDisplayName = Tree.GetRootNodeDisplayName(tree, _localizedTextService); if (rootNodeDisplayName is not null) { - searchTasks.Add(ExecuteSearchAsync(query, searchableTree, rootNodeDisplayName,result)); + searchTasks.Add(ExecuteSearchAsync(query, culture, searchableTree, rootNodeDisplayName,result)); } } } @@ -232,13 +233,22 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers private static async Task ExecuteSearchAsync( string query, + string? culture, KeyValuePair searchableTree, string rootNodeDisplayName, ConcurrentDictionary result) { + ISearchableTree searcher = searchableTree.Value.SearchableTree; + const int pageSize = 200; + IEnumerable results = ( + searcher is ISearchableTreeWithCulture searcherWithCulture + ? await searcherWithCulture.SearchAsync(query, pageSize, 0, culture: culture) + : await searcher.SearchAsync(query, pageSize, 0)) + .WhereNotNull(); + var searchResult = new TreeSearchResult { - Results = (await searchableTree.Value.SearchableTree.SearchAsync(query, 200, 0)).WhereNotNull(), + Results = results, TreeAlias = searchableTree.Key, AppAlias = searchableTree.Value.AppAlias, JsFormatterService = searchableTree.Value.FormatterService, diff --git a/src/Umbraco.Web.BackOffice/Trees/ContentTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/ContentTreeController.cs index 4b61ef2e17..4fccfb6e24 100644 --- a/src/Umbraco.Web.BackOffice/Trees/ContentTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/ContentTreeController.cs @@ -32,7 +32,7 @@ namespace Umbraco.Cms.Web.BackOffice.Trees [PluginController(Constants.Web.Mvc.BackOfficeTreeArea)] [CoreTree] [SearchableTree("searchResultFormatter", "configureContentResult", 10)] - public class ContentTreeController : ContentTreeControllerBase, ISearchableTree + public class ContentTreeController : ContentTreeControllerBase, ISearchableTreeWithCulture { private readonly UmbracoTreeSearcher _treeSearcher; private readonly ActionCollection _actions; @@ -369,8 +369,11 @@ namespace Umbraco.Cms.Web.BackOffice.Trees } public async Task SearchAsync(string query, int pageSize, long pageIndex, string? searchFrom = null) + => await SearchAsync(query, pageSize, pageIndex, searchFrom, null); + + public async Task SearchAsync(string query, int pageSize, long pageIndex, string? searchFrom = null, string? culture = null) { - var results = _treeSearcher.ExamineSearch(query, UmbracoEntityTypes.Document, pageSize, pageIndex, out long totalFound, searchFrom); + var results = _treeSearcher.ExamineSearch(query, UmbracoEntityTypes.Document, pageSize, pageIndex, out long totalFound, culture: culture, searchFrom: searchFrom); return new EntitySearchResults(results, totalFound); } }