Select2Enum.razor.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using Microsoft.AspNetCore.Components;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel.DataAnnotations;
  5. using System.Linq;
  6. using System.Reflection;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. namespace KeudellCoding.Blazor.AdvancedBlazorSelect2 {
  10. public partial class Select2Enum<TEnum> : ComponentBase where TEnum : Enum {
  11. [Parameter, Required] public List<TEnum> Value { get; set; }
  12. [Parameter] public EventCallback OnValueChanged { get; set; } = EventCallback.Empty;
  13. [Parameter] public Func<IEnumerable<TEnum>, string, CancellationToken, Task<List<TEnum>>> FilterFunction { get; set; } = filterEnums;
  14. [Parameter] public bool Multiselect { get => Select2Options.Multiple; set => Select2Options.Multiple = value; }
  15. [Parameter] public InputSelect2Options Select2Options { get; set; } = new InputSelect2Options();
  16. [Parameter] public ushort MaxItemsPerPage { get; set; } = 50;
  17. [Parameter(CaptureUnmatchedValues = true)] public IDictionary<string, object> AdditionalAttributes { get; set; }
  18. //===========================================================================================================================================
  19. private static Task<List<TEnum>> filterEnums(IEnumerable<TEnum> allItems, string filter, CancellationToken token) {
  20. var result = allItems?.ToDictionary(e => e, e => {
  21. var counter = 0;
  22. if (getName(e).StartsWith(filter, StringComparison.CurrentCultureIgnoreCase))
  23. counter += 2;
  24. if (getName(e).ToUpper().Contains(filter.ToUpper()))
  25. counter++;
  26. if (getDisplayValue(e).StartsWith(filter, StringComparison.CurrentCultureIgnoreCase))
  27. counter += 2;
  28. if (getDisplayValue(e).ToUpper().Contains(filter.ToUpper()))
  29. counter++;
  30. return counter;
  31. }) ?? new Dictionary<TEnum, int> { };
  32. return Task.FromResult(result.Where(kvp => string.IsNullOrEmpty(filter) || kvp.Value > 0)
  33. .OrderByDescending(kvp => kvp.Value)
  34. .Select(kvp => kvp.Key)
  35. .ToList());
  36. }
  37. //===========================================================================================================================================
  38. private static string getDisplayValue(TEnum value) {
  39. var fieldInfo = value.GetType().GetField(value.ToString());
  40. var attr = fieldInfo.GetCustomAttribute<DisplayAttribute>(false);
  41. return attr?.Name ?? value.ToString();
  42. }
  43. private static string getName(TEnum value) {
  44. var fieldInfo = value.GetType().GetField(value.ToString());
  45. return fieldInfo?.Name ?? value.ToString();
  46. }
  47. }
  48. }