V8: Always show content and media search results first (#5309)
This commit is contained in:
committed by
Sebastiaan Janssen
parent
342f924e8f
commit
30067d92ae
@@ -153,22 +153,20 @@ namespace Umbraco.Web.Editors
|
||||
|
||||
var allowedSections = Security.CurrentUser.AllowedSections.ToArray();
|
||||
|
||||
foreach (var searchableTree in _searchableTreeCollection.SearchableApplicationTrees)
|
||||
foreach (var searchableTree in _searchableTreeCollection.SearchableApplicationTrees.OrderBy(t => t.Value.SortOrder))
|
||||
{
|
||||
if (allowedSections.Contains(searchableTree.Value.AppAlias))
|
||||
{
|
||||
var tree = _treeService.GetByAlias(searchableTree.Key);
|
||||
if (tree == null) continue; //shouldn't occur
|
||||
|
||||
var searchableTreeAttribute = searchableTree.Value.SearchableTree.GetType().GetCustomAttribute<SearchableTreeAttribute>(false);
|
||||
|
||||
result[Tree.GetRootNodeDisplayName(tree, Services.TextService)] = new TreeSearchResult
|
||||
{
|
||||
Results = searchableTree.Value.SearchableTree.Search(query, 200, 0, out var total),
|
||||
TreeAlias = searchableTree.Key,
|
||||
AppAlias = searchableTree.Value.AppAlias,
|
||||
JsFormatterService = searchableTreeAttribute == null ? "" : searchableTreeAttribute.ServiceName,
|
||||
JsFormatterMethod = searchableTreeAttribute == null ? "" : searchableTreeAttribute.MethodName
|
||||
JsFormatterService = searchableTree.Value.FormatterService,
|
||||
JsFormatterMethod = searchableTree.Value.FormatterMethod
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,15 +4,21 @@ namespace Umbraco.Web.Search
|
||||
{
|
||||
public class SearchableApplicationTree
|
||||
{
|
||||
public SearchableApplicationTree(string appAlias, string treeAlias, ISearchableTree searchableTree)
|
||||
public SearchableApplicationTree(string appAlias, string treeAlias, int sortOrder, string formatterService, string formatterMethod, ISearchableTree searchableTree)
|
||||
{
|
||||
AppAlias = appAlias;
|
||||
TreeAlias = treeAlias;
|
||||
SortOrder = sortOrder;
|
||||
FormatterService = formatterService;
|
||||
FormatterMethod = formatterMethod;
|
||||
SearchableTree = searchableTree;
|
||||
}
|
||||
|
||||
public string AppAlias { get; }
|
||||
public string TreeAlias { get; }
|
||||
public int SortOrder { get; }
|
||||
public string FormatterService { get; }
|
||||
public string FormatterMethod { get; }
|
||||
public ISearchableTree SearchableTree { get; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,16 +6,27 @@ namespace Umbraco.Web.Search
|
||||
[AttributeUsage(AttributeTargets.Class)]
|
||||
public sealed class SearchableTreeAttribute : Attribute
|
||||
{
|
||||
public const int DefaultSortOrder = 1000;
|
||||
|
||||
/// <summary>
|
||||
/// This constructor defines both the angular service and method name to use
|
||||
/// </summary>
|
||||
/// <param name="serviceName"></param>
|
||||
/// <param name="methodName"></param>
|
||||
public SearchableTreeAttribute(string serviceName, string methodName)
|
||||
public SearchableTreeAttribute(string serviceName, string methodName) : this(serviceName, methodName, DefaultSortOrder) { }
|
||||
|
||||
/// <summary>
|
||||
/// This constructor defines both the angular service and method name to use and explicitly defines a sort order for the results
|
||||
/// </summary>
|
||||
/// <param name="serviceName"></param>
|
||||
/// <param name="methodName"></param>
|
||||
/// <param name="sortOrder"></param>
|
||||
public SearchableTreeAttribute(string serviceName, string methodName, int sortOrder)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(serviceName)) throw new ArgumentNullOrEmptyException(nameof(serviceName));
|
||||
if (string.IsNullOrWhiteSpace(methodName)) throw new ArgumentNullOrEmptyException(nameof(methodName));
|
||||
MethodName = methodName;
|
||||
SortOrder = sortOrder;
|
||||
ServiceName = serviceName;
|
||||
}
|
||||
|
||||
@@ -28,9 +39,11 @@ namespace Umbraco.Web.Search
|
||||
if (string.IsNullOrWhiteSpace(serviceName)) throw new ArgumentNullOrEmptyException(nameof(serviceName));
|
||||
MethodName = "";
|
||||
ServiceName = serviceName;
|
||||
SortOrder = DefaultSortOrder;
|
||||
}
|
||||
|
||||
public string MethodName { get; }
|
||||
public string ServiceName { get; }
|
||||
public int SortOrder { get; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,15 @@ namespace Umbraco.Web.Search
|
||||
var found = searchableTrees.FirstOrDefault(x => x.TreeAlias.InvariantEquals(appTree.TreeAlias));
|
||||
if (found != null)
|
||||
{
|
||||
dictionary[found.TreeAlias] = new SearchableApplicationTree(appTree.SectionAlias, appTree.TreeAlias, found);
|
||||
var searchableTreeAttribute = found.GetType().GetCustomAttribute<SearchableTreeAttribute>(false);
|
||||
dictionary[found.TreeAlias] = new SearchableApplicationTree(
|
||||
appTree.SectionAlias,
|
||||
appTree.TreeAlias,
|
||||
searchableTreeAttribute?.SortOrder ?? SearchableTreeAttribute.DefaultSortOrder,
|
||||
searchableTreeAttribute?.ServiceName ?? string.Empty,
|
||||
searchableTreeAttribute?.MethodName ?? string.Empty,
|
||||
found
|
||||
);
|
||||
}
|
||||
}
|
||||
return dictionary;
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace Umbraco.Web.Trees
|
||||
[Tree(Constants.Applications.Content, Constants.Trees.Content)]
|
||||
[PluginController("UmbracoTrees")]
|
||||
[CoreTree]
|
||||
[SearchableTree("searchResultFormatter", "configureContentResult")]
|
||||
[SearchableTree("searchResultFormatter", "configureContentResult", 10)]
|
||||
public class ContentTreeController : ContentTreeControllerBase, ISearchableTree
|
||||
{
|
||||
private readonly UmbracoTreeSearcher _treeSearcher;
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace Umbraco.Web.Trees
|
||||
[Tree(Constants.Applications.Media, Constants.Trees.Media)]
|
||||
[PluginController("UmbracoTrees")]
|
||||
[CoreTree]
|
||||
[SearchableTree("searchResultFormatter", "configureMediaResult")]
|
||||
[SearchableTree("searchResultFormatter", "configureMediaResult", 20)]
|
||||
public class MediaTreeController : ContentTreeControllerBase, ISearchableTree
|
||||
{
|
||||
private readonly UmbracoTreeSearcher _treeSearcher;
|
||||
|
||||
Reference in New Issue
Block a user