App.razor 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <div class="container">
  2. <a style="float:right" href="/classic-index">Back OLD Home Page</a>
  3. <h3>Blazor WASM UI</h3>
  4. @if (Progress?.IsLoading != false)
  5. {
  6. <span>Waiting server ready...</span>
  7. <span>@(Progress?.LoadedTags ?? 0)</span>
  8. <span>/</span>
  9. <span>@(Progress?.TotalTrackCount ?? 0)</span>
  10. }
  11. else if (Libraries == null)
  12. {
  13. <span>Loading file set...</span>
  14. }
  15. else if (MediaTags == null)
  16. {
  17. <span>Loading tags...</span>
  18. }
  19. else
  20. {
  21. <ul class="nav nav-tabs justify-content-center nav-fill" id="RootTab" role="tablist">
  22. <li class="nav-item" role="presentation">
  23. <button class="nav-link active" id="home-tab" data-bs-toggle="tab" data-bs-target="#home" type="button" role="tab" aria-controls="home" aria-selected="true">
  24. Browse
  25. </button>
  26. </li>
  27. <li class="nav-item" role="presentation">
  28. <button class="nav-link" id="profile-tab" data-bs-toggle="tab" data-bs-target="#profile" type="button" role="tab" aria-controls="profile" aria-selected="false">
  29. Search
  30. </button>
  31. </li>
  32. <li class="nav-item" role="presentation">
  33. <button class="nav-link" id="contact-tab" data-bs-toggle="tab" data-bs-target="#contact" type="button" role="tab" aria-controls="contact" aria-selected="false">
  34. Playlists
  35. </button>
  36. </li>
  37. </ul>
  38. <div class="tab-content" id="RootTabContent">
  39. <div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">
  40. <div class="row justify-content-evenly mt-2">
  41. <LibSelector Libraries="@Libraries" SelectedLibs="@SelectedLibs" OnValueChanged="SelectedLibraryChanged"></LibSelector>
  42. <div class="row mt-2">
  43. <div class="col-12">
  44. @if (CurrentLibrary != null)
  45. {
  46. <div class="row">
  47. @foreach (var d in CurrentLibrary.Discs.OrderByDescending(p => p.Key))
  48. {
  49. <div class="col-md-3">
  50. @*TODO: Card Component*@
  51. <div class="card mb-3 shadow-sm" @onclick="()=>SelectDisc(d.Key)">
  52. <img class="card-img-top" src="@ApiClient.ImageUrl(CurrentLibraryKey,d.Key)">
  53. <div class="card-body">
  54. <p class="card-text">@d.Value.Name</p>
  55. <div class="d-flex justify-content-between align-items-center">
  56. <div class="btn-group">
  57. <button type="button" class="btn btn-sm btn-outline-secondary">Track @d.Value.MainTracks.Count</button>
  58. <button type="button" class="btn btn-sm btn-outline-secondary">SubSet @d.Value.SubTracks.Count</button>
  59. </div>
  60. <small class="text-muted">@GetDiscDurationDisplay(CurrentLibraryKey,d.Key)</small>
  61. </div>
  62. </div>
  63. </div>
  64. </div>
  65. }
  66. </div>
  67. }
  68. </div>
  69. </div>
  70. </div>
  71. <div class="modal fade" id="exampleModalToggle" aria-hidden="true" aria-labelledby="exampleModalToggleLabel" tabindex="-1">
  72. <div class="modal-dialog modal-dialog-centered modal-xl">
  73. <div class="modal-content">
  74. <div class="modal-header">
  75. <h5 class="modal-title" id="exampleModalToggleLabel">@CurrentDisc?.Name</h5>
  76. <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  77. </div>
  78. <div class="modal-body">
  79. @*TODO: Disc Modal*@
  80. <div class="container-fluid">
  81. <div class="row">
  82. @if (CurrentDisc != null)
  83. {
  84. <div class="col-md-4"><img class="card-img-top" src="@ApiClient.ImageUrl(CurrentLibraryKey,CurrentDiscKey)"></div>
  85. <div class="col-md-8">
  86. <ul class="nav nav-tabs justify-content-center nav-fill" id="ModalDiscTab" role="tablist">
  87. <li class="nav-item" role="presentation">
  88. <button class="nav-link active" id="main-tab" data-bs-toggle="tab" data-bs-target="#tracks-main" type="button" role="tab" aria-controls="home" aria-selected="true">
  89. Main
  90. </button>
  91. </li>
  92. @foreach (var subSet in CurrentDisc.SubTracks.OrderBy(p => p.Key).WithIndex())
  93. {
  94. <li class="nav-item" role="presentation">
  95. <button class="nav-link" id="main-tab" data-bs-toggle="tab" data-bs-target="#tracks-@subSet.index" type="button" role="tab" aria-controls="home" aria-selected="true">
  96. @subSet.item.Value.Name
  97. </button>
  98. </li>
  99. }
  100. </ul>
  101. <div class="tab-content" id="ModalDiscTabContent">
  102. <div class="tab-pane fade show active" id="tracks-main" role="tabpanel" aria-labelledby="home-tab">
  103. <TrackSetTable
  104. LibraryKey="@CurrentLibraryKey"
  105. DiscKey="@CurrentDiscKey"
  106. TrackSetKey="null"
  107. Tracks="@CurrentDisc?.MainTracks"></TrackSetTable>
  108. </div>
  109. @foreach (var subSet in CurrentDisc.SubTracks.OrderBy(p => p.Key).WithIndex())
  110. {
  111. <div class="tab-pane fade show" id="tracks-@subSet.index" role="tabpanel" aria-labelledby="home-tab">
  112. <TrackSetTable LibraryKey="@CurrentLibraryKey"
  113. DiscKey="@CurrentDiscKey"
  114. TrackSetKey="@subSet.item.Key"
  115. Tracks="@subSet.item.Value.Tracks"></TrackSetTable>
  116. </div>
  117. }
  118. </div>
  119. </div>
  120. }
  121. </div>
  122. </div>
  123. </div>
  124. <div class="modal-footer">
  125. <button class="btn btn-primary" data-bs-dismiss="modal">Close</button>
  126. </div>
  127. </div>
  128. </div>
  129. </div>
  130. </div>
  131. <div class="tab-pane fade" id="profile" role="tabpanel" aria-labelledby="profile-tab">
  132. <div class="container">
  133. <h1>此处应有搜索界面</h1>
  134. </div>
  135. </div>
  136. <div class="tab-pane fade" id="contact" role="tabpanel" aria-labelledby="contact-tab">
  137. <div class="container">
  138. <h1>此处应有列表界面</h1>
  139. </div>
  140. </div>
  141. </div>
  142. }
  143. </div>