Skip to content

Commit

Permalink
Merge pull request #140 from DennisvHest/101-in-dynamic-playlist-conf…
Browse files Browse the repository at this point in the history
…iguration-use-dropdowns-with-pre-defined-options-whenever-possible

101 in dynamic playlist configuration use dropdowns with pre defined options whenever possible
  • Loading branch information
DennisvHest committed Feb 11, 2024
2 parents 1b7468e + e5d9f22 commit 81a017a
Show file tree
Hide file tree
Showing 10 changed files with 61 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ public class DynamicPlaylistFieldOption
public string Value { get; set; }
public string Name { get; set; }
public Type Type { get; set; }
public bool HasPredefinedOptions { get; set; }
}
}
3 changes: 2 additions & 1 deletion MapMaven.Core/Models/DynamicPlaylists/FilterOperator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ public enum FilterOperator
GreaterThan,
LessThanOrEqual,
GreaterThanOrEqual,
Contains
Contains,
NotContains,
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using MapMaven.Models;
using MapMaven.Core.Utilities.DynamicPlaylists;
using MapMaven.Models;
using MapMaven.Utilities.DynamicPlaylists;
using System.ComponentModel;

Expand Down Expand Up @@ -28,9 +29,11 @@ public class DynamicPlaylistMap
public double Stars { get; set; }

[ApplicableForMapPool(MapPool.Improvement)]
[HasPredefinedOptions]
public string Difficulty { get; set; }

[ApplicableForMapPool(MapPool.Improvement)]
[HasPredefinedOptions]
public IEnumerable<string> Tags { get; set; } = [];

public DynamicPlaylistScore? Score { get; set; }
Expand Down
10 changes: 6 additions & 4 deletions MapMaven.Core/Services/DynamicPlaylistArrangementService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,11 @@ public class DynamicPlaylistArrangementService

public static readonly Dictionary<Type, IEnumerable<FilterOperator>> FilterOperatorsForType = new()
{
{ typeof(string), new[] { FilterOperator.Equals, FilterOperator.NotEquals, FilterOperator.Contains } },
{ typeof(string), new[] { FilterOperator.Equals, FilterOperator.NotEquals, FilterOperator.Contains, FilterOperator.NotContains } },
{ typeof(bool), new[] { FilterOperator.Equals, FilterOperator.NotEquals } },
{ typeof(double), new[] { FilterOperator.Equals, FilterOperator.NotEquals, FilterOperator.GreaterThan, FilterOperator.LessThan, FilterOperator.GreaterThanOrEqual, FilterOperator.LessThanOrEqual } },
{ typeof(DateTime), new[] { FilterOperator.Equals, FilterOperator.NotEquals, FilterOperator.GreaterThan, FilterOperator.LessThan, FilterOperator.GreaterThanOrEqual, FilterOperator.LessThanOrEqual } },
{ typeof(IEnumerable<string>), new[] { FilterOperator.Contains } },
{ typeof(IEnumerable<string>), new[] { FilterOperator.Contains, FilterOperator.NotContains } },
};

public DynamicPlaylistArrangementService(
Expand Down Expand Up @@ -136,10 +136,10 @@ public async Task ArrangeDynamicPlaylists()
playlistMaps = FilterMaps(playlistMaps, configuration);
playlistMaps = SortMaps(playlistMaps, configuration);

playlistMaps = playlistMaps.Take(configuration.MapCount);

var resultPlaylistMaps = playlistMaps
.Select(m => m.Map)
.DistinctBy(m => m.Hash)
.Take(configuration.MapCount)
.ToList();

await _playlistService.DownloadPlaylistMapsIfNotExist(resultPlaylistMaps, loadMapInfo: false);
Expand Down Expand Up @@ -191,6 +191,7 @@ private bool FilterOperationMatches(DynamicPlaylistMapPair mapPair, FilterOperat
FilterOperator.Equals => stringValue.Equals(filterOperation.Value, StringComparison.OrdinalIgnoreCase),
FilterOperator.NotEquals => !stringValue.Equals(filterOperation.Value, StringComparison.OrdinalIgnoreCase),
FilterOperator.Contains => stringValue.Contains(filterOperation.Value, StringComparison.OrdinalIgnoreCase),
FilterOperator.NotContains => !stringValue.Contains(filterOperation.Value, StringComparison.OrdinalIgnoreCase),
_ => false
};
}
Expand Down Expand Up @@ -244,6 +245,7 @@ private bool FilterOperationMatches(DynamicPlaylistMapPair mapPair, FilterOperat
return filterOperation.Operator switch
{
FilterOperator.Contains => stringEnumerableValue.Contains(filterOperation.Value, StringComparer.OrdinalIgnoreCase),
FilterOperator.NotContains => !stringEnumerableValue.Contains(filterOperation.Value, StringComparer.OrdinalIgnoreCase),
_ => false
};
}
Expand Down
8 changes: 8 additions & 0 deletions MapMaven.Core/Utilities/DifficultyUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,13 @@ public static int GetOrder(string? difficulty)
_ => 0
};
}

public static IEnumerable<string> Difficulties => [
"Easy",
"Normal",
"Hard",
"Expert",
"ExpertPlus"
];
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace MapMaven.Core.Utilities.DynamicPlaylists
{
[AttributeUsage(AttributeTargets.Property)]
public class HasPredefinedOptions : Attribute
{
}
}
18 changes: 17 additions & 1 deletion MapMaven/Components/Playlists/FilterOperationInput.razor
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,23 @@
@switch (SelectedFieldOption?.Type)
{
case Type type when type == typeof(string):
<MudTextField @bind-Value="FilterOperation.Value" Label="Value" Variant="Variant.Outlined" Margin="Margin.Dense" Class="pl-2 d-block" Style="max-width: 168px;" />
@if (SelectedFieldOption.HasPredefinedOptions)
{
<MudSelectExtended T="string"
ItemCollection="GetFieldOptions()"
Margin="Margin.Dense"
Dense="true"
SearchBox="true"
SearchBoxAutoFocus="true"
SearchBoxClearable="true"
Variant="Variant.Outlined"
Class="pl-2 d-block"
@bind-Value="FilterOperation.Value" />
}
else
{
<MudTextField @bind-Value="FilterOperation.Value" Label="Value" Variant="Variant.Outlined" Margin="Margin.Dense" Class="pl-2 d-block" Style="max-width: 168px;" />
}
break;
case Type type when Numeric.Is(type):
<MudNumericField Value="FilterOperation.Value" TextChanged="DoubleValueChanged" Label="Value" Variant="Variant.Outlined" Margin="Margin.Dense" Class="pl-2 d-block" Style="max-width: 168px;" />
Expand Down
14 changes: 10 additions & 4 deletions MapMaven/Components/Playlists/FilterOperationInput.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
using MapMaven.Core.Models.DynamicPlaylists.MapInfo;
using MapMaven.Core.Services.Interfaces;
using MapMaven.Core.Services;
using System.Reflection;
using MapMaven.Core.Utilities.DynamicPlaylists;
using MapMaven.Core.Utilities;

namespace MapMaven.Components.Playlists
{
Expand Down Expand Up @@ -67,17 +70,20 @@ ICollection<string> GetFieldOptions()
{
var options = FilterOperation.Field switch
{
nameof(DynamicPlaylistMap.Difficulty) => DifficultyUtils.Difficulties,
nameof(DynamicPlaylistMap.Tags) => MapService.MapTags,
_ => []
};

if (FilterOperation.Value is not null)
options = options.Concat([FilterOperation.Value]);

return options
.Distinct()
.OrderBy(x => x)
.ToList();
options = options.Distinct();

if (FilterOperation.Field != nameof(DynamicPlaylistMap.Difficulty))
options = options.OrderBy(x => x);

return options.ToList();
}
}
}
1 change: 1 addition & 0 deletions MapMaven/Extensions/EnumExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ public static string DisplayName(this FilterOperator filterOperator)
FilterOperator.LessThan => "<",
FilterOperator.LessThanOrEqual => "<=",
FilterOperator.Contains => "contains",
FilterOperator.NotContains => "doesn't contain",
_ => string.Empty
};
}
Expand Down
6 changes: 5 additions & 1 deletion MapMaven/Utility/DynamicPlaylistFields.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System.Reflection;
using System.ComponentModel;
using MapMaven.Utilities.DynamicPlaylists;
using MapMaven.Core.Utilities.DynamicPlaylists;

namespace MapMaven.Utility
{
Expand All @@ -28,13 +29,16 @@ private static IEnumerable<DynamicPlaylistFieldOption> GetFieldOptionsForType(Ty
var name = displayNameAttribute?.DisplayName ?? property.Name;
var hasPredefinedOptionsAttribute = property.GetCustomAttribute<HasPredefinedOptions>();
return new[]
{
new DynamicPlaylistFieldOption
{
Value = value,
Name = name,
Type = property.PropertyType
Type = property.PropertyType,
HasPredefinedOptions = hasPredefinedOptionsAttribute is not null
}
};
});
Expand Down

0 comments on commit 81a017a

Please sign in to comment.