V8: Always show content and media search results first (#5309)

This commit is contained in:
Kenn Jacobsen
2019-05-31 20:29:00 +02:00
committed by Sebastiaan Janssen
parent 342f924e8f
commit 30067d92ae
6 changed files with 35 additions and 10 deletions

View File

@@ -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
};
}
}

View File

@@ -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; }
}
}

View File

@@ -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; }
}
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;