DiscCard.razor 1.7 KB

1234567891011121314151617181920212223242526272829303132333435
  1. @code {
  2. [Parameter, Required] public FeDisc[] Discs { get; set; }
  3. [Parameter] public EventCallback<FeDisc> OnClick { get; set; } = EventCallback<FeDisc>.Empty;
  4. }
  5. @foreach (var disc in (Discs).KeepNoEmpty())
  6. {
  7. <div class="col-md-3 d-flex align-items-stretch">
  8. <div class="card mb-3 shadow-sm" @onclick="()=>{ if (disc!=null) OnClick.InvokeAsync(disc); }">
  9. <div class="card-img-top disc-card-cover" style="background-image:url('@disc.CoverPath.UrlEscape()')">
  10. </div>
  11. <div class="card-body d-flex align-content-between flex-wrap p-2">
  12. <p class="card-text position-relative">
  13. @disc?.Name
  14. @if (disc?.Bks != null)
  15. {
  16. <span class="position-absolute top-0 start-100 translate-middle badge rounded-pill bg-info">BK</span>
  17. }
  18. </p>
  19. <div class="w-100">
  20. <div class="w-100 text-center">
  21. <small class="font-monospace text-muted">Track @disc.TrackSets.First().Tracks.Length</small>
  22. </div>
  23. @foreach (var tSet in (disc?.TrackSets).KeepNoEmpty())
  24. {
  25. <div class="d-flex justify-content-between w-100">
  26. <span class="align-self-center">@(tSet?.Name.StartsWith("AAC_Q1.00") == true ? "Q1" + tSet?.Name.Substring(9) : tSet?.Name)</span>
  27. <small class="text-nowrap font-monospace text-muted align-self-center">@tSet?.TotalDuration.SecondToDur() @tSet?.TotalBytes.BytesToFileSize()</small>
  28. </div>
  29. }
  30. </div>
  31. </div>
  32. </div>
  33. </div>
  34. }