- @if (Model.DocumentPreferences != null && Model.DocumentPreferences.Parameters != null && Model.DocumentPreferences.Parameters.Any())
+ @{
+ var visibleParameters = Model.DocumentPreferences?.Parameters?
+ .Where(p => Model.IsParameterVisible(p))
+ .ToList() ?? new List
();
+ }
+ @if (visibleParameters.Count > 0)
{
@@ -488,10 +493,11 @@
@{
const int maxCellCount = 3;
- var count = Model.DocumentPreferences.Parameters.Count;
+ var count = visibleParameters.Count;
var rowCount = count / maxCellCount + (count % maxCellCount > 0 ? 1 : 0);
var cellSize = 12 / (count > maxCellCount ? maxCellCount : count);
- var latestCellSize = 12 / count - (rowCount - 1) * maxCellCount;
+ var lastRowCellCount = count - (rowCount - 1) * maxCellCount;
+ var latestCellSize = 12 / lastRowCellCount;
string BuildParameterDivClass(int index)
{
@@ -503,7 +509,7 @@
for (var i = 0; i < count; ++i)
{
- var parameter = Model.DocumentPreferences.Parameters[i];
+ var parameter = visibleParameters[i];
diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs
index 35e3c05f15..6eb3c02a8c 100644
--- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs
+++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs
@@ -90,6 +90,29 @@ namespace Volo.Docs.Pages.Documents.Project
public DocumentRenderParameters UserPreferences { get; set; } = new DocumentRenderParameters();
+ private HashSet? _renderedParameterNamesCache;
+ private HashSet RenderedParameterNames =>
+ _renderedParameterNamesCache ??= (DocumentPreferences?.Parameters?.Select(p => p.Name).ToHashSet() ?? new HashSet());
+
+ public virtual bool IsParameterVisible(DocumentParameterDto parameter)
+ {
+ return IsParameterVisibleGiven(parameter, UserPreferences);
+ }
+
+ protected virtual bool IsParameterVisibleGiven(DocumentParameterDto parameter, IReadOnlyDictionary selectedValues)
+ {
+ if (parameter.DependsOn == null || parameter.DependsOn.Count == 0)
+ {
+ return true;
+ }
+
+ return parameter.DependsOn.All(rule =>
+ rule.Value == null || !RenderedParameterNames.Contains(rule.Key)
+ || (rule.Value.Count > 0
+ && selectedValues.TryGetValue(rule.Key, out var current)
+ && rule.Value.Contains(current)));
+ }
+
public List AlternativeOptionLinkQueries { get; set; } = new List();
public bool FullSearchEnabled { get; set; }
@@ -827,7 +850,8 @@ namespace Volo.Docs.Pages.Documents.Project
{
Name = parameter.Name,
DisplayName = parameter.DisplayName,
- Values = new Dictionary()
+ Values = new Dictionary(),
+ DependsOn = parameter.DependsOn
};
foreach (var value in parameter.Values)
@@ -847,13 +871,13 @@ namespace Volo.Docs.Pages.Documents.Project
{
if (!DocumentPreferences?.Parameters?.Any() ?? true)
{
- return;
+ return;
}
- AlternativeOptionLinkQueries = CollectAlternativeOptionLinksRecursively();
+ AlternativeOptionLinkQueries = CollectAlternativeOptionLinksRecursively(0, new Dictionary());
}
- private List CollectAlternativeOptionLinksRecursively(int index = 0)
+ private List CollectAlternativeOptionLinksRecursively(int index, Dictionary selected)
{
if (index >= DocumentPreferences.Parameters.Count)
{
@@ -861,13 +885,20 @@ namespace Volo.Docs.Pages.Documents.Project
}
var option = DocumentPreferences.Parameters[index];
+
+ if (!IsParameterVisibleGiven(option, selected))
+ {
+ return CollectAlternativeOptionLinksRecursively(index + 1, selected);
+ }
+
var queries = new List();
foreach (var key in option.Values.Keys)
{
- var linkQuery = new StringBuilder($"{option.Name}={key}");
+ var linkQuery = $"{option.Name}={key}";
- var restOfQueries = CollectAlternativeOptionLinksRecursively(index + 1);
+ var nextSelected = new Dictionary(selected) { [option.Name] = key };
+ var restOfQueries = CollectAlternativeOptionLinksRecursively(index + 1, nextSelected);
if (restOfQueries.Any())
{
@@ -878,7 +909,7 @@ namespace Volo.Docs.Pages.Documents.Project
}
else
{
- queries.Add($"{linkQuery}");
+ queries.Add(linkQuery);
}
}