PlaylistTable.razor 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. @using Newtonsoft.Json
  2. @inherits FnzComponentBase
  3. @code {
  4. [Parameter, Required] public FePlaylist Playlist { get; set; }
  5. [Parameter, Required] public int ListItemIndex { get; set; }
  6. [Parameter, Required] public int ListItemCount { get; set; }
  7. [Parameter] public EventCallback<Guid> EditPlaylist { get; set; } = EventCallback<Guid>.Empty;
  8. [Parameter] public EventCallback<Guid> DeletePlaylist { get; set; } = EventCallback<Guid>.Empty;
  9. private bool isExpand;
  10. private PlaylistExportDialog dlgExport;
  11. protected override async Task OnAfterRenderAsync(bool firstRender)
  12. {
  13. await base.OnAfterRenderAsync(firstRender);
  14. await JSRuntime.InvokeVoidAsync(Prefix + ".initDropZone", ElementId, DotNetRef, FnzConst.DragDropTypePlaylistItem);
  15. await JSRuntime.InvokeVoidAsync(Prefix + ".initDropZone", ElementId, DotNetRef, FnzConst.DragDropTypePlaylist);
  16. await JSRuntime.InvokeVoidAsync(Prefix + ".initDragSource", ElementId, DotNetRef, FnzConst.DragDropTypePlaylist);
  17. await JSRuntime.InvokeVoidAsync(Prefix + ".resolveSelectTextClickConflict", ElementId, DotNetRef);
  18. }
  19. private async Task EnableDragDrop() => await JSRuntime.InvokeVoidAsync(Prefix + ".setDraggableOn", ElementId);
  20. private async Task DisableDragDrop() => await JSRuntime.InvokeVoidAsync(Prefix + ".setDraggableOff", ElementId);
  21. [JSInvokable("FnzDragStartProvideContent")]
  22. public string FnzDragStartProvideContent(string dataType)
  23. {
  24. if (dataType != FnzConst.DragDropTypePlaylist) return null;
  25. var str = JsonConvert.SerializeObject(Playlist.Id);
  26. return str;
  27. }
  28. [JSInvokable("FnzDragDropContent")]
  29. public void FnzDragDropContent(string dataType, string content)
  30. {
  31. if (dataType == FnzConst.DragDropTypePlaylistItem)
  32. {
  33. var ds = JsonConvert.DeserializeObject<PlaylistDragSource>(content);
  34. if (string.IsNullOrWhiteSpace(ds?.Path)) return;
  35. PlaylistHelper.TrackMove(ds.PlaylistId, ds.TrackIndex, ds.Path, Playlist.Id, 0);
  36. }
  37. if (dataType == FnzConst.DragDropTypePlaylist)
  38. {
  39. var playlistId = JsonConvert.DeserializeObject<Guid>(content);
  40. if (playlistId == default) return;
  41. PlaylistHelper.ListMove(playlistId, ListItemIndex);
  42. }
  43. }
  44. }
  45. <div class="table-responsive">
  46. <table class="table w-100">
  47. <tbody>
  48. @if (Playlist != null)
  49. {
  50. var arr = PlaylistHelper[Playlist.Id];
  51. <tr id="@ElementId" class="table-primary" @ondragend="DisableDragDrop">
  52. <td style="width:0" @onclick="()=>{isExpand=!isExpand;}">
  53. <button type="button" class="btn btn-primary p-2">
  54. @if (isExpand)
  55. {
  56. <i class="bi bi-dash-square"></i>
  57. }
  58. else
  59. {
  60. <i class="bi bi-plus-square"></i>
  61. }
  62. </button>
  63. </td>
  64. <td class="text-start w-100 align-middle" @onclick="()=>{isExpand=!isExpand;}" colspan="3">
  65. <div class="text-nowrap">@Playlist.Name</div>
  66. <div class="text-nowrap text-muted">
  67. (@arr.Count)
  68. @arr.Sum(p=>DataSet.AllTracks.Where(q=>q.Path==p).Select(q=>q.Tag?.Duration??0).FirstOrDefault()).SecondToDur()
  69. @arr.Sum(p=>DataSet.AllTracks.Where(q=>q.Path==p).Select(q=>q.Tag?.Length??0).FirstOrDefault()).BytesToFileSize()
  70. </div>
  71. </td>
  72. <td>
  73. @if (ListItemCount > 1)
  74. {
  75. var isFirst = ListItemIndex == 0;
  76. var isLast = ListItemIndex == ListItemCount - 1;
  77. <div class="dropstart">
  78. <button type="button" class="btn btn-primary p-2" data-bs-toggle="dropdown" @onmousedown="EnableDragDrop" @onmouseup="DisableDragDrop">
  79. <i class="bi bi-arrow-down-up"></i>
  80. </button>
  81. <div class="dropdown-menu text-end p-1 text-nowrap" style="width: initial;min-width: initial;">
  82. <button class="btn btn-primary p-2" disabled="@isFirst" @onclick="()=>PlaylistHelper.ListMoveUp(ListItemIndex)">
  83. <i class="bi bi-arrow-bar-up"></i>
  84. Up
  85. </button>
  86. <button class="btn btn-primary p-2" disabled="@isLast" @onclick="()=>PlaylistHelper.ListMoveDown(ListItemIndex)">
  87. <i class="bi bi-arrow-bar-down"></i>
  88. Down
  89. </button>
  90. </div>
  91. </div>
  92. }
  93. </td>
  94. <td>
  95. <button type="button" class="btn btn-primary p-2" @onclick="()=>DownloadPlaylist(Playlist.Id)">
  96. <i class="bi bi-download"></i>
  97. </button>
  98. </td>
  99. <td>
  100. <button type="button" class="btn btn-primary p-2" @onclick="()=>EditPlaylist.InvokeAsync(Playlist.Id)">
  101. <i class="bi bi-pencil-square"></i>
  102. </button>
  103. </td>
  104. <td>
  105. <button type="button" class="btn btn-danger p-2" @onclick="()=>DeletePlaylist.InvokeAsync(Playlist.Id)">
  106. <i class="bi bi-trash"></i>
  107. </button>
  108. </td>
  109. </tr>
  110. @if (isExpand)
  111. {
  112. @foreach (var item in arr.KeepNoEmpty().WithIndex())
  113. {
  114. if (item.item != null)
  115. {
  116. var track = DataSet.AllTracks.FirstOrDefault(p => p.Path == item.item);
  117. if (track != null)
  118. {
  119. <PlaylistTableItem PlaylistId="@Playlist.Id"
  120. TrackIndex="@item.index"
  121. TrackCount="@arr.Count"
  122. Track="@track">
  123. </PlaylistTableItem>
  124. }
  125. else
  126. {
  127. <PlaylistTableItemBrokenReference PlaylistId="@Playlist.Id"
  128. TrackIndex="@item.index"
  129. Path="@item.item">
  130. </PlaylistTableItemBrokenReference>
  131. }
  132. }
  133. else
  134. {
  135. <tr>
  136. <td></td>
  137. <td colspan="7" class="align-middle w-100">
  138. <div class="text-nowrap">- empty -</div>
  139. </td>
  140. </tr>
  141. }
  142. }
  143. }
  144. }
  145. </tbody>
  146. </table>
  147. </div>
  148. <PlaylistExportDialog @ref="dlgExport">
  149. </PlaylistExportDialog>
  150. @code {
  151. private void DownloadPlaylist(Guid playlistId)
  152. {
  153. dlgExport.Show(playlistId);
  154. }
  155. }